<?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>KStyle</name>
	<version>1.0</version>
    <mincmsversion>2.2</mincmsversion>
	<help><![CDATA[PGgyPldoYXQgaXMgdGhpcyBtb2R1bGUgdXNlZCBmb3I/PC9oMj4NCg0KPHA+DQogICAgVGhpcyBtb2R1bGUgd2lsbCByZXBsYWNlIHRoZSBzdHlsZXNoZWV0IGZ1bmN0aW9ubmFsaXR5IG9mIHRoZSBkZXNpZ24gbWFuYWdlciB0bw0KICAgIHVzZSBhIGNvbXBpbGF0aW9uIG9mIENTUyBhbmQvb3IgU0NTUyBmaWxlcyBsb2NhdGVkIGluIGEgZm9sZGVyIG9mIHlvdXIgY2hvaWNlLg0KPC9wPg0KPHA+DQogICAgSXQgaXMgdmVyeSB1c2VmdWwgd2hlbiBjb21iaW5lZCB3aXRoIGFuIElERSAoSW50ZWdyYXRlZCBEZXZlbG9wbWVudCBFbnZpcm9ubWVudCwgc3VjaCBhcyBWU0NvZGUpIHRoYXQgY2FuIGludGVyYWN0IHdpdGggZmlsZXMgb24geW91ciBzZXJ2ZXIuDQo8L3A+DQoNCjxoMj5QdWJsaWMgQ29uZmlndXJhdGlvbjwvaDI+DQoNCjxwPg0KICAgIFNpbXBseSBhZGQgdGhlIDxjb2RlPntLU3R5bGV9PC9jb2RlPiB0YWcgYmV0d2VlbiB0aGUgPGNvZGU+Jmx0O2hlYWQmZ3Q7Jmx0Oy9oZWFkJmd0OzwvY29kZT4gdGFncy4NCjwvcD4NCjxwPg0KICAgIFRoaXMgPGNvZGU+e0tTdHlsZX08L2NvZGU+IHRhZyB3aWxsIGdlbmVyYXRlIHRoZQ0KICAgIDxjb2RlPiZsdDtsaW5rIGhyZWY9Imh0dHBzOi8vZG9tYWluLnRsZC90bXAvY2FjaGUva3N0eWxlX3h4eC5jc3MiIHJlbD0ic3R5bGVzaGVldCImZ3Q7PC9jb2RlPg0KICAgIHRhZywgd2hlcmUgPGVtPmtzdHlsZV94eHguY3NzPC9lbT4gd2lsbCBiZSB0aGUgY29tcGlsZWQgZmlsZSBvZiBhbGwgeW91ciBDU1MgYW5kIFNDU1MgZmlsZXMuDQo8L3A+DQoNCjxoMj5BZG1pbmlzdHJhdGlvbiBBcmVhIENvbmZpZ3VyYXRpb248L2gyPg0KDQo8aDQ+QWN0aXZlIG9yIEluYWN0aXZlPC9oND4NCg0KPHA+DQogICAgSW4gQWN0aXZlIG1vZGUsIHRoZSBtb2R1bGUgd2lsbCBjb21waWxlIGFsbCBmaWxlcyB3aXRoIHRoZSBleHRlbnNpb25zIG9mDQogICAgeW91ciBjaG9pY2UgKGRlZmF1bHQ6IC5jc3MgYW5kIC5zY3NzKSBsb2NhdGVkIGluIHRoZSBmb2xkZXIgb2YgeW91cg0KICAgIGNob2ljZSAoZGVmYXVsdDogL2Fzc2V0cy9zY3NzLykuDQo8L3A+DQoNCjxoND5Db21waWxhdGlvbiBGb3JtYXQ8L2g0Pg0KDQo8cD4NCiAgICBZb3UgY2FuIGNob29zZSB0aGUgY29tcGlsYXRpb24gZm9ybWF0Og0KPC9wPg0KPHVsPg0KICAgIDxsaT5FeHBhbmRlZDogS2VlcHMgYWxsIGNvbW1lbnRzIGFuZCBkb2VzIG5vdCBhcHBseSBhbnkgb3B0aW1pemF0aW9uLjwvbGk+DQogICAgPGxpPkNvbXByZXNzZWQ6IFJlbW92ZXMgY29tbWVudHMgYW5kIGFwcGxpZXMgc2Nzc3BocCBvcHRpbWl6YXRpb25zLjwvbGk+DQogICAgPGxpPk1pbmlmaWVkOiBTYW1lIGFzIENvbXByZXNzZWQgYnV0IHdpdGggYWRkaXRpb25hbCBvcHRpbWl6YXRpb25zIChlLmcuLCByZW1vdmluZyB1bm5lY2Vzc2FyeSBzcGFjZXMgYW5kIGNvbnZlcnRpbmcgaGV4YWRlY2ltYWwgY29sb3JzIHRvIHNob3J0IGZvcm0gd2hlbiBwb3NzaWJsZSwgI2ZmZmZmZiBiZWNvbWVzICNmZmYpLg0KICAgIDwvbGk+DQo8L3VsPg0KDQo8aDQ+T3RoZXIgb3B0aW1pemF0aW9uczwvaDQ+DQoNCjxwPg0KICAgIFlvdSBjYW4gY2hvb3NlIHRvIHJlbW92ZSB0aGUgaHR0cCBvciBodHRwcyBwcmVmaXhlcyBmcm9tIGFsbCBVUkxzIGluIHRoZQ0KICAgIGNvbXBpbGVkIENTUyBmaWxlLg0KICAgIFRodXMsIDxlbT5odHRwczovL2RvbWFpbmUudGxkL2Fzc2V0cy9pbWFnZXMvYmFja2dyb3VuZC5wbmc8L2VtPiBiZWNvbWVzDQogICAgPGVtPi8vZG9tYWluZS50bGQvYXNzZXRzL2ltYWdlcy9iYWNrZ3JvdW5kLnBuZzwvZW0+LiBUaGlzIHNhdmVzIGEgZmV3DQogICAgY2hhcmFjdGVycywgYW5kIHRoZSBicm93c2VyIHdpbGwgY2hvb3NlIHRoZSBwcm90b2NvbCBiYXNlZCBvbiB0aGUNCiAgICBjdXJyZW50IHNpdGUuDQo8L3A+DQoNCjxoND5BY3RpdmF0aW9uIGR1cmF0aW9uPC9oND4NCg0KPHA+DQogICAgVGhlIGFjdGl2YXRpb24gZHVyYXRpb24gaXMgdGhlIHRpbWUgdGhlIG1vZHVsZSByZW1haW5zIGFjdGl2ZSBhbmQgbW9uaXRvcnMNCiAgICBjaGFuZ2VzIGluIHRoZSBDU1Mgb3IgU0NTUyBmaWxlcy4gQWZ0ZXIgdGhpcyBwZXJpb2Qgd2l0aG91dCBtb2RpZmljYXRpb25zLA0KICAgIHRoZSBtb2R1bGUgYmVjb21lcyBpbmFjdGl2ZSB0byBhdm9pZCB1bm5lY2Vzc2FyeSBvcGVyYXRpb25zIGFuZCBvcHRpbWl6ZQ0KICAgIGxvYWRpbmcgdGltZXMuIEhvd2V2ZXIsIGlmIHRlbXBvcmFyeSBmaWxlcyAoYW5kIHRodXMgdGhlIGNvbXBpbGVkIGZpbGUpDQogICAgYXJlIGFjY2lkZW50YWxseSBvciBkZWxpYmVyYXRlbHkgZGVsZXRlZCwgdGhlIG1vZHVsZSB3aWxsIGRldGVjdCBpdCBhbmQNCiAgICByZWdlbmVyYXRlIHRoZSBjYWNoZSBmaWxlIGV2ZW4gaWYgdGhlIG1vZHVsZSBpcyBpbmFjdGl2ZS4NCjwvcD4NCjxwPg0KICAgIEVhY2ggdGltZSBhIGZpbGUgdG8gYmUgY29tcGlsZWQgaXMgbW9kaWZpZWQsIHRoZSBhY3RpdmF0aW9uIHRpbWUgaXMgcmVzZXQuDQo8L3A+DQoNCjxoMj5TdXBwb3J0PC9oMj4NCg0KPHA+DQogICAgWW91IGNhbiA8YSBocmVmPSJodHRwczovL3d3dy5rb2FsaW5rLmZyL2NvbnRhY3QiIHRhcmdldD0iX2JsYW5rIj5jb250YWN0IHVzIHZpYSBlbWFpbDwvYT4gZm9yIHN1cHBvcnQgaW4gRW5nbGlzaCBvciBGcmVuY2guDQo8L3A+DQo8cD4NCiAgICBZb3UgY2FuIGFsc28gdmlzaXQNCiAgICA8YSBocmVmPSJodHRwOi8vZGV2LmNtc21hZGVzaW1wbGUub3JnL3Byb2plY3RzL2tzdHlsZSIgdGFyZ2V0PSJfYmxhbmsiPnRoZSBDTVNNUyBmb3JnZSBvbiB0aGUgS1N0eWxlIHByb2plY3Q8L2E+DQogICAgdG8gcmVwb3J0IGEgYnVnIG9yIHJlcXVlc3QgYSBmZWF0dXJlLg0KPC9wPg==]]></help>
	<about><![CDATA[PGJyIC8+QXV0aG9yOiBLb2EnbGluayAmbHQ7aW5mb0Brb2FsaW5rLmZyJmd0OzxiciAvPjxiciAvPlZlcnNpb246IDEuMDxiciAvPjxiciAvPkNoYW5nZSBIaXN0b3J5OjxiciAvPjx1bD4NCiAgICA8bGk+DQogICAgICAgIDxzdHJvbmc+VmVyc2lvbiAxLjA8L3N0cm9uZz4gKDIwMjQtMDktMjIpIDoNCiAgICAgICAgPHVsPg0KICAgICAgICAgICAgPGxpPg0KICAgICAgICAgICAgICAgIEluaXRpYWwgcmVsZWFzZQ0KICAgICAgICAgICAgPC9saT4NCiAgICAgICAgPC91bD4NCiAgICA8L2xpPg0KPC91bD48YnIgLz4=]]></about>
	<description><![CDATA[SCSS to CSS Compiler]]></description>
	<file>
	  <filename>/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/action.defaultadmin.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCmlmKCAhaXNzZXQoJGdDbXMpICkgZXhpdDsNCg0KLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKlwNCiAgIFbDqXJpZmljYXRpb24gZGVzIHBlcm1pc3Npb25zDQpcKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLw0KDQppZiAoICEkdGhpcy0+Q2hlY2tQZXJtaXNzaW9uKCdrc3R5bGVfZGFzaGJvYXJkJykgJiYNCiAgICAgISR0aGlzLT5DaGVja1Blcm1pc3Npb24oJ2tzdHlsZV9zZXR0aW5ncycpICkgew0KICAgZWNobyAkdGhpcy0+U2hvd0Vycm9ycygkdGhpcy0+TGFuZygnYWNjZXNzZGVuaWVkJykpOw0KICAgcmV0dXJuOw0KfQ0KDQovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqXA0KICAgUHLDqXBhcmF0aW9uIGR1IHRlbXBsYXRlDQpcKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLw0KDQokdHBsID0gJHNtYXJ0eS0+Q3JlYXRlVGVtcGxhdGUoJHRoaXMtPkdldFRlbXBsYXRlUmVzb3VyY2UoJ2RlZmF1bHRhZG1pbi50cGwnKSxudWxsLG51bGwsJHNtYXJ0eSk7DQoNCi8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICpcDQogICBGb3JtdWxhaXJlIDogVGFibGVhdSBkZSBib3JkDQpcKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLw0KDQppZiAoaXNzZXQoJHBhcmFtc1snc3VibWl0X2Rhc2hib2FyZCddKSkgew0KDQogICAkc3RhdHVzID0gJHRoaXMtPnN3aXRjaFN0YXR1cygpOw0KDQogICBpZiAoJHN0YXR1cykgew0KICAgICAkdGhpcy0+U2V0TWVzc2FnZSgkdGhpcy0+TGFuZygnbW9kdWxlX2VuYWJsZWQnKSk7DQogICB9IGVsc2Ugew0KICAgICAkdGhpcy0+U2V0TWVzc2FnZSgkdGhpcy0+TGFuZygnbW9kdWxlX2Rpc2FibGVkJykpOw0KICAgfQ0KIA0KICAgJHRoaXMtPlJlZGlyZWN0VG9BZG1pblRhYignZGFzaGJvYXJkJyk7DQoNCn0NCg0KLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKlwNCiAgIEZvcm11bGFpcmUgOiBQYXJhbcOodHJlcw0KXCogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8NCg0KaWYgKGlzc2V0KCRwYXJhbXNbJ3N1Ym1pdF9zZXR0aW5ncyddKSkgew0KDQogICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgnc291cmNlX3BhdGgnLCAkcGFyYW1zWydzb3VyY2VfcGF0aCddKTsNCiAgICR0aGlzLT5TZXRQcmVmZXJlbmNlKCdleHRlbnNpb25zJywgJHBhcmFtc1snZXh0ZW5zaW9ucyddKTsNCiAgICR0aGlzLT5TZXRQcmVmZXJlbmNlKCdmb3JtYXQnLCAkcGFyYW1zWydmb3JtYXQnXSk7DQogICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgnc291cmNlX21hcCcsICRwYXJhbXNbJ3NvdXJjZV9tYXAnXSA/PyBmYWxzZSk7DQogICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgncmVtb3ZlX2h0dHBzX3ByZWZpeCcsICRwYXJhbXNbJ3JlbW92ZV9odHRwc19wcmVmaXgnXSA/PyBmYWxzZSk7DQogICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgndGltZW91dCcsICRwYXJhbXNbJ3RpbWVvdXQnXSk7DQoNCiAgIC8vIFLDqWluaXRpYWxpc2F0aW9uIGRlIGxhIGRlcm5pw6hyZSBtaXNlIMOgIGpvdXIgcG91ciBmb3JjZXIgbGEgY29tcGlsYXRpb24gYXByw6hzIGxlIGNoYW5nZW1lbnQgZGUgcGFyYW3DqHRyZXMNCiAgICR0aGlzLT5TZXRQcmVmZXJlbmNlKCdsYXN0X3VwZGF0ZScsIDApOw0KDQogICAkdGhpcy0+U2V0TWVzc2FnZSgkdGhpcy0+TGFuZygnc2V0dGluZ3NfY2hhbmdlZCcpKTsNCiANCiAgICR0aGlzLT5SZWRpcmVjdFRvQWRtaW5UYWIoJ3NldHRpbmdzJyk7DQoNCn0NCg0KLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKlwNCiAgIFZhcmlhYmxlcw0KXCogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8NCg0KJHBlcm1pc3Npb25zID0gW107DQokcmVzdWx0ID0gS1N0eWxlOjokcGVybWlzc2lvbnM7DQpmb3JlYWNoICgkcmVzdWx0IGFzICRrZXkgPT4gJHZhbHVlKSB7DQogICAkcGVybWlzc2lvbnNbJGtleV0gPSAkdGhpcy0+Q2hlY2tQZXJtaXNzaW9uKCRrZXkpOw0KfQ0KJHRwbC0+YXNzaWduKCdwZXJtaXNzaW9ucycsJHBlcm1pc3Npb25zKTsNCg0KJGNvbmZpZyA9IGNtc21zKCktPkdldENvbmZpZygpOw0KJHNldHRpbmdzID0gKG9iamVjdCkgW107DQokc2V0dGluZ3MtPnN0YXR1cyA9ICR0aGlzLT5HZXRQcmVmZXJlbmNlKCdzdGF0dXMnKTsNCiRzZXR0aW5ncy0+dGltZW91dCA9ICR0aGlzLT5HZXRQcmVmZXJlbmNlKCd0aW1lb3V0Jyk7DQokc2V0dGluZ3MtPnNvdXJjZV9wYXRoID0gJHRoaXMtPkdldFByZWZlcmVuY2UoJ3NvdXJjZV9wYXRoJyk7DQokc2V0dGluZ3MtPmV4dGVuc2lvbnMgPSAkdGhpcy0+R2V0UHJlZmVyZW5jZSgnZXh0ZW5zaW9ucycpOw0KJHNldHRpbmdzLT5mb3JtYXQgPSAkdGhpcy0+R2V0UHJlZmVyZW5jZSgnZm9ybWF0Jyk7DQokc2V0dGluZ3MtPnNvdXJjZV9tYXAgPSAkdGhpcy0+R2V0UHJlZmVyZW5jZSgnc291cmNlX21hcCcpOw0KJHNldHRpbmdzLT5yZW1vdmVfaHR0cHNfcHJlZml4ID0gJHRoaXMtPkdldFByZWZlcmVuY2UoJ3JlbW92ZV9odHRwc19wcmVmaXgnKTsNCiRzZXR0aW5ncy0+bGFzdF91cGRhdGUgPSAkdGhpcy0+R2V0UHJlZmVyZW5jZSgnbGFzdF91cGRhdGUnKTsNCiRzZXR0aW5ncy0+dGltZV9sZWZ0ID0gJHRoaXMtPmdldFRpbWVMZWZ0KCk7DQokc2V0dGluZ3MtPnJvb3RfcGF0aCA9ICRjb25maWdbJ3Jvb3RfcGF0aCddOw0KJHRwbC0+YXNzaWduKCdzZXR0aW5ncycsJHNldHRpbmdzKTsNCg0KLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKlwNCiAgIEFmZmljaGFnZSBkdSB0ZW1wbGF0ZQ0KXCogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8NCg0KJHRwbC0+ZGlzcGxheSgpOw0KDQo/Pg==]]></data>
	</file>
	<file>
	  <filename>/doc/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/doc/changelog.en_US.inc</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PHVsPg0KICAgIDxsaT4NCiAgICAgICAgPHN0cm9uZz5WZXJzaW9uIDEuMDwvc3Ryb25nPiAoMjAyNC0wOS0yMikgOg0KICAgICAgICA8dWw+DQogICAgICAgICAgICA8bGk+DQogICAgICAgICAgICAgICAgSW5pdGlhbCByZWxlYXNlDQogICAgICAgICAgICA8L2xpPg0KICAgICAgICA8L3VsPg0KICAgIDwvbGk+DQo8L3VsPg==]]></data>
	</file>
	<file>
	  <filename>/doc/changelog.fr_FR.inc</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PHVsPg0KICAgIDxsaT4NCiAgICAgICAgPHN0cm9uZz5WZXJzaW9uIDEuMDwvc3Ryb25nPiAoMjAyNC0wOS0yMikgOg0KICAgICAgICA8dWw+DQogICAgICAgICAgICA8bGk+DQogICAgICAgICAgICAgICAgUHJlbWnDqHJlIGRpc3RyaWJ1dGlvbiBwdWJsaXF1ZQ0KICAgICAgICAgICAgPC9saT4NCiAgICAgICAgPC91bD4NCiAgICA8L2xpPg0KPC91bD4=]]></data>
	</file>
	<file>
	  <filename>/doc/help.en_US.inc</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGgyPldoYXQgaXMgdGhpcyBtb2R1bGUgdXNlZCBmb3I/PC9oMj4NCg0KPHA+DQogICAgVGhpcyBtb2R1bGUgd2lsbCByZXBsYWNlIHRoZSBzdHlsZXNoZWV0IGZ1bmN0aW9ubmFsaXR5IG9mIHRoZSBkZXNpZ24gbWFuYWdlciB0bw0KICAgIHVzZSBhIGNvbXBpbGF0aW9uIG9mIENTUyBhbmQvb3IgU0NTUyBmaWxlcyBsb2NhdGVkIGluIGEgZm9sZGVyIG9mIHlvdXIgY2hvaWNlLg0KPC9wPg0KPHA+DQogICAgSXQgaXMgdmVyeSB1c2VmdWwgd2hlbiBjb21iaW5lZCB3aXRoIGFuIElERSAoSW50ZWdyYXRlZCBEZXZlbG9wbWVudCBFbnZpcm9ubWVudCwgc3VjaCBhcyBWU0NvZGUpIHRoYXQgY2FuIGludGVyYWN0IHdpdGggZmlsZXMgb24geW91ciBzZXJ2ZXIuDQo8L3A+DQoNCjxoMj5QdWJsaWMgQ29uZmlndXJhdGlvbjwvaDI+DQoNCjxwPg0KICAgIFNpbXBseSBhZGQgdGhlIDxjb2RlPntLU3R5bGV9PC9jb2RlPiB0YWcgYmV0d2VlbiB0aGUgPGNvZGU+Jmx0O2hlYWQmZ3Q7Jmx0Oy9oZWFkJmd0OzwvY29kZT4gdGFncy4NCjwvcD4NCjxwPg0KICAgIFRoaXMgPGNvZGU+e0tTdHlsZX08L2NvZGU+IHRhZyB3aWxsIGdlbmVyYXRlIHRoZQ0KICAgIDxjb2RlPiZsdDtsaW5rIGhyZWY9Imh0dHBzOi8vZG9tYWluLnRsZC90bXAvY2FjaGUva3N0eWxlX3h4eC5jc3MiIHJlbD0ic3R5bGVzaGVldCImZ3Q7PC9jb2RlPg0KICAgIHRhZywgd2hlcmUgPGVtPmtzdHlsZV94eHguY3NzPC9lbT4gd2lsbCBiZSB0aGUgY29tcGlsZWQgZmlsZSBvZiBhbGwgeW91ciBDU1MgYW5kIFNDU1MgZmlsZXMuDQo8L3A+DQoNCjxoMj5BZG1pbmlzdHJhdGlvbiBBcmVhIENvbmZpZ3VyYXRpb248L2gyPg0KDQo8aDQ+QWN0aXZlIG9yIEluYWN0aXZlPC9oND4NCg0KPHA+DQogICAgSW4gQWN0aXZlIG1vZGUsIHRoZSBtb2R1bGUgd2lsbCBjb21waWxlIGFsbCBmaWxlcyB3aXRoIHRoZSBleHRlbnNpb25zIG9mDQogICAgeW91ciBjaG9pY2UgKGRlZmF1bHQ6IC5jc3MgYW5kIC5zY3NzKSBsb2NhdGVkIGluIHRoZSBmb2xkZXIgb2YgeW91cg0KICAgIGNob2ljZSAoZGVmYXVsdDogL2Fzc2V0cy9zY3NzLykuDQo8L3A+DQoNCjxoND5Db21waWxhdGlvbiBGb3JtYXQ8L2g0Pg0KDQo8cD4NCiAgICBZb3UgY2FuIGNob29zZSB0aGUgY29tcGlsYXRpb24gZm9ybWF0Og0KPC9wPg0KPHVsPg0KICAgIDxsaT5FeHBhbmRlZDogS2VlcHMgYWxsIGNvbW1lbnRzIGFuZCBkb2VzIG5vdCBhcHBseSBhbnkgb3B0aW1pemF0aW9uLjwvbGk+DQogICAgPGxpPkNvbXByZXNzZWQ6IFJlbW92ZXMgY29tbWVudHMgYW5kIGFwcGxpZXMgc2Nzc3BocCBvcHRpbWl6YXRpb25zLjwvbGk+DQogICAgPGxpPk1pbmlmaWVkOiBTYW1lIGFzIENvbXByZXNzZWQgYnV0IHdpdGggYWRkaXRpb25hbCBvcHRpbWl6YXRpb25zIChlLmcuLCByZW1vdmluZyB1bm5lY2Vzc2FyeSBzcGFjZXMgYW5kIGNvbnZlcnRpbmcgaGV4YWRlY2ltYWwgY29sb3JzIHRvIHNob3J0IGZvcm0gd2hlbiBwb3NzaWJsZSwgI2ZmZmZmZiBiZWNvbWVzICNmZmYpLg0KICAgIDwvbGk+DQo8L3VsPg0KDQo8aDQ+T3RoZXIgb3B0aW1pemF0aW9uczwvaDQ+DQoNCjxwPg0KICAgIFlvdSBjYW4gY2hvb3NlIHRvIHJlbW92ZSB0aGUgaHR0cCBvciBodHRwcyBwcmVmaXhlcyBmcm9tIGFsbCBVUkxzIGluIHRoZQ0KICAgIGNvbXBpbGVkIENTUyBmaWxlLg0KICAgIFRodXMsIDxlbT5odHRwczovL2RvbWFpbmUudGxkL2Fzc2V0cy9pbWFnZXMvYmFja2dyb3VuZC5wbmc8L2VtPiBiZWNvbWVzDQogICAgPGVtPi8vZG9tYWluZS50bGQvYXNzZXRzL2ltYWdlcy9iYWNrZ3JvdW5kLnBuZzwvZW0+LiBUaGlzIHNhdmVzIGEgZmV3DQogICAgY2hhcmFjdGVycywgYW5kIHRoZSBicm93c2VyIHdpbGwgY2hvb3NlIHRoZSBwcm90b2NvbCBiYXNlZCBvbiB0aGUNCiAgICBjdXJyZW50IHNpdGUuDQo8L3A+DQoNCjxoND5BY3RpdmF0aW9uIGR1cmF0aW9uPC9oND4NCg0KPHA+DQogICAgVGhlIGFjdGl2YXRpb24gZHVyYXRpb24gaXMgdGhlIHRpbWUgdGhlIG1vZHVsZSByZW1haW5zIGFjdGl2ZSBhbmQgbW9uaXRvcnMNCiAgICBjaGFuZ2VzIGluIHRoZSBDU1Mgb3IgU0NTUyBmaWxlcy4gQWZ0ZXIgdGhpcyBwZXJpb2Qgd2l0aG91dCBtb2RpZmljYXRpb25zLA0KICAgIHRoZSBtb2R1bGUgYmVjb21lcyBpbmFjdGl2ZSB0byBhdm9pZCB1bm5lY2Vzc2FyeSBvcGVyYXRpb25zIGFuZCBvcHRpbWl6ZQ0KICAgIGxvYWRpbmcgdGltZXMuIEhvd2V2ZXIsIGlmIHRlbXBvcmFyeSBmaWxlcyAoYW5kIHRodXMgdGhlIGNvbXBpbGVkIGZpbGUpDQogICAgYXJlIGFjY2lkZW50YWxseSBvciBkZWxpYmVyYXRlbHkgZGVsZXRlZCwgdGhlIG1vZHVsZSB3aWxsIGRldGVjdCBpdCBhbmQNCiAgICByZWdlbmVyYXRlIHRoZSBjYWNoZSBmaWxlIGV2ZW4gaWYgdGhlIG1vZHVsZSBpcyBpbmFjdGl2ZS4NCjwvcD4NCjxwPg0KICAgIEVhY2ggdGltZSBhIGZpbGUgdG8gYmUgY29tcGlsZWQgaXMgbW9kaWZpZWQsIHRoZSBhY3RpdmF0aW9uIHRpbWUgaXMgcmVzZXQuDQo8L3A+DQoNCjxoMj5TdXBwb3J0PC9oMj4NCg0KPHA+DQogICAgWW91IGNhbiA8YSBocmVmPSJodHRwczovL3d3dy5rb2FsaW5rLmZyL2NvbnRhY3QiIHRhcmdldD0iX2JsYW5rIj5jb250YWN0IHVzIHZpYSBlbWFpbDwvYT4gZm9yIHN1cHBvcnQgaW4gRW5nbGlzaCBvciBGcmVuY2guDQo8L3A+DQo8cD4NCiAgICBZb3UgY2FuIGFsc28gdmlzaXQNCiAgICA8YSBocmVmPSJodHRwOi8vZGV2LmNtc21hZGVzaW1wbGUub3JnL3Byb2plY3RzL2tzdHlsZSIgdGFyZ2V0PSJfYmxhbmsiPnRoZSBDTVNNUyBmb3JnZSBvbiB0aGUgS1N0eWxlIHByb2plY3Q8L2E+DQogICAgdG8gcmVwb3J0IGEgYnVnIG9yIHJlcXVlc3QgYSBmZWF0dXJlLg0KPC9wPg==]]></data>
	</file>
	<file>
	  <filename>/doc/help.fr_FR.inc</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGgyPsOAIHF1b2kgc2VydCBjZSBtb2R1bGUgPzwvaDI+DQoNCjxwPg0KICAgIENlIG1vZHVsZSB2YSByZW1wbGFjZXIgbGEgcGFydGllIGRlcyBmZXVpbGxlcyBkZSBzdHlsZSBkdSBnZXN0aW9ubmFpcmUgZGUNCiAgICBkZXNpZ24gcG91ciB1dGlsaXNlciB1bmUgY29tcGlsYXRpb24gZGUgZmljaGllcnMgQ1NTIGV0L291IFNDU1MgcXVpDQogICAgc29udCBzaXR1w6lzIGRhbnMgdW4gZG9zc2llciBkZSB2b3RyZSBjaG9peC4NCjwvcD4NCjxwPg0KICAgIElsIGVzdCB0csOocyB1dGlsZSBhc3NvY2nDqSBhdmVjIHVuIElERSAoSW50ZWdyYXRlZCBEZXZlbG9wbWVudCBFbnZpcm9ubWVudA0KICAgIC8gRW52aXJvbm5lbWVudCBkZSBkw6l2ZWxvcHBlbWVudCBpbnTDqWdyw6ksIGNvbW1lIFZTQ29kZSkgcXVpIHBldXQgaW50ZXJ2ZW5pcg0KICAgIHN1ciBsZXMgZmljaGllcnMgZGUgdm90cmUgc2VydmV1ci4NCjwvcD4NCg0KPGgyPkNvbmZpZ3VyYXRpb24gc3VyIGxhIHBhcnRpZSBwdWJsaXF1ZTwvaDI+DQoNCjxwPg0KICAgIElsIHN1ZmZpdCBkZSByYWpvdXRlciBsYSBiYWxpc2UgPGNvZGU+e0tTdHlsZX08L2NvZGU+IGVudHJlIGxlcyBiYWxpc2VzIDxjb2RlPiZsdDtoZWFkJmd0OyZsdDsvaGVhZCZndDs8L2NvZGU+Lg0KPC9wPg0KPHA+DQogICAgQ2V0dGUgYmFsaXNlIDxjb2RlPntLU3R5bGV9PC9jb2RlPiB2YSBnw6luw6lyZXIgbGEgYmFsaXNlDQogICAgPGNvZGU+Jmx0O2xpbmsgaHJlZj0iaHR0cHM6Ly9kb21haW4udGxkL3RtcC9jYWNoZS9rc3R5bGVfeHh4LmNzcyIgcmVsPSJzdHlsZXNoZWV0IiZndDs8L2NvZGU+DQogICAgb8O5IDxlbT5rc3R5bGVfeHh4LmNzczwvZW0+IHNlcmEgbGUgZmljaGllciBjb21waWzDqSBkZSB0b3VzIHZvcyBmaWNoaWVycyBDU1MgZXQgU0NTUy4NCjwvcD4NCg0KPGgyPkNvbmZpZ3VyYXRpb24gZGFucyBsJ2VzcGFjZSBkJ2FkbWluaXN0cmF0aW9uPC9oMj4NCg0KPGg0PkFjdGlmIG91IGluYWN0aWY8L2g0Pg0KDQo8cD4NCiAgICBFbiBtb2RlIDxlbT5BY3RpZjwvZW0+LCBsZSBtb2R1bGUgdmEgY29tcGlsZXIgdG91cyBsZXMgZmljaGllcnMgZGVzIGV4dGVuc2lvbnMgZGUgdm90cmUgY2hvaXgNCiAgICAocGFyIGTDqWZhdXQgOiA8ZW0+LmNzczwvZW0+IGV0IDxlbT4uc2NzczwvZW0+KSBxdWkgc29udCBzaXR1w6lzIGRhbnMgbGUgZG9zc2llciBkZSB2b3RyZSBjaG9peA0KICAgIChwYXIgZMOpZmF1dCA6IDxlbT4vYXNzZXRzL3Njc3MvPC9lbT4pLg0KPC9wPg0KDQo8aDQ+Rm9ybWF0IGRlIGNvbXBpbGF0aW9uPC9oND4NCg0KPHA+DQogICAgVm91cyBhbGxleiBwb3V2b2lyIGNob2lzaXIgbGUgZm9ybWF0IGRlIGNvbXBpbGF0aW9uIDoNCjwvcD4NCjx1bD4NCiAgICA8bGk+w4l0ZW5kdSA6IEdhcmRlIHRvdXMgbGVzIGNvbW1lbnRhaXJlcyBldCBuJ2FwcGxpcXVlIGF1Y3VuZSBvcHRpbWlzYXRpb248L2xpPg0KICAgIDxsaT5Db21wcmVzc8OpIDogU3VwcHJpbWVyIGxlcyBjb21tZW50YWlyZXMgZXQgYXBwbGlxdWUgbGVzIG9wdGltaXNhdGlvbnMgZGUgc2Nzc3BocDwvbGk+DQogICAgPGxpPk1pbmlmacOpIDogUGFyZWlsIHF1ZSA8ZW0+Q29tcHJlc3PDqTwvZW0+IG1haXMgYXZlYyBkZXMgb3B0aW1pc2F0aW9ucw0KICAgIGNvbXBsw6ltZW50YWlyZXMgKG5vdGFtbWVudCBsYSBzdXBwcmVzc2lvbiBkZXMgZXNwYWNlcyBpbnV0aWxlcyBvdSBlbmNvcmUNCiAgICBsYSBjb252ZXJzaW9uIGRlcyBjb3VsZXVycyBoZXhhZMOpY2ltYWxlcyBlbiBmb3JtZSBjb3VydGUgc2kgcG9zc2libGUgPGVtPiNmZmZmZmY8L2VtPiBkZXZpZW50IDxlbT4jZmZmPC9lbT4pDQogICAgPC9saT4NCjwvdWw+DQoNCjxoND5BdXRyZXMgb3B0aW1pc2F0aW9uczwvaDQ+DQoNCjxwPg0KICAgIFZvdXMgYWxsZXogcG91dm9pciBjaG9pc2lyIGQnZW5sZXZlciBsZXMgcHLDqWZpeGVzIGh0dHAgb3UgaHR0cHMgZGUgdG91dGVzDQogICAgbGVzIFVSTHMgcHLDqXNlbnRlbnQgZGFucyBsZSBmaWNoaWVyIENTUyBjb21waWzDqS48YnI+DQogICAgQWluc2kgPGVtPmh0dHBzOi8vZG9tYWluZS50bGQvYXNzZXRzL2ltYWdlcy9iYWNrZ3JvdW5kLnBuZzwvZW0+IGRldmllbnQNCiAgICA8ZW0+Ly9kb21haW5lLnRsZC9hc3NldHMvaW1hZ2VzL2JhY2tncm91bmQucG5nPC9lbT4uIE9uIMOpY29ub21pc2UgYWxvcnMNCiAgICBxdWVscXVlcyBjYXJhY3TDqHJlcyBldCBsZSBuYXZpZ2F0ZXVyIHNlIGNoYXJnZSBkZSBjaG9pc2lyIGxlIHByb3RvY29sZQ0KICAgIGVuIGZvbmN0aW9uIGRlIGNlbHVpIHV0aWxpc8OpIHBhciBsZSBzaXRlIGFjdHVlbC4NCjwvcD4NCg0KPGg0PkR1csOpZSBkJ2FjdGl2YXRpb248L2g0Pg0KDQo8cD4NCiAgICBQb3VyIGxhIGR1csOpZSBkJ2FjdGl2YXRpb24sIGlsIHMnYWdpdCBkZSBsYSBkdXLDqWUgcGVuZGFudCBsYXF1ZWxsZSBsZQ0KICAgIG1vZHVsZSByZXN0ZSBhdHRlbnRpZiDDoCB0b3VzIGNoYW5nZW1lbnRzIGRhbnMgbGVzIGZpY2hpZXJzIENTUyBvdSBTQ1NTLjxicj4NCiAgICBQYXNzw6kgY2UgZMOpbGFpIHNhbnMgbW9kaWZpY2F0aW9uLCBsZSBtb2R1bGUgZGV2aWVudCBpbmF0aWYgcG91ciDDqXZpdGVyDQogICAgZGVzIG9ww6lyYXRpb25zIGludXRpbGVzIGV0IG9wdGltaXNlciBsZXMgdGVtcHMgZGUgY2hhcmdlbWVudC48YnI+DQogICAgVG91dGVmb2lzLCBzaSBsZXMgZmljaGllcnMgdGVtcG9yYWlyZXMgKGV0IGRvbmMgbGUgZmljaGllciBjb21waWzDqSkgc29udA0KICAgIHN1cHByaW3DqSBwYXIgbcOpZ2FyZGUgb3UgYWN0aW9uIHZvbG9udGFpcmUsIGxlIG1vZHVsZSB2YSBsZSBkw6l0ZWN0ZXIgZXQNCiAgICByw6lnw6luw6lyZXIgbGUgZmljaGllciBjYWNoZSBtw6ptZSBzaSBsZSBtb2R1bGUgZXN0IGluYWN0aWYuDQo8L3A+DQo8cD4NCiAgICDDgCBjaGFxdWUgbW9kaWZpY2F0aW9uIGQndW4gZmljaGllciDDoCBjb21waWxlciwgbGUgdGVtcHMgZCdhY3RpdmF0aW9uIGVzdA0KICAgIHLDqWluaXRpYWxpc8OpLg0KPC9wPg0KDQo8aDI+U3VwcG9ydDwvaDI+DQoNCjxwPg0KICAgIFZvdXMgcG91dmV6IDxhIGhyZWY9Imh0dHBzOi8vd3d3LmtvYWxpbmsuZnIvY29udGFjdCIgdGFyZ2V0PSJfYmxhbmsiPm5vdXMgw6ljcmlyZSBwYXIgZS1tYWlsPC9hPiBwb3VyIHVuIHN1cHBvcnQgZW4gYW5nbGFpcyBvdSBlbg0KICAgIGZyYW7Dp2Fpcy4NCjwvcD4NCjxwPg0KICAgIFZvdXMgcG91dmV6IMOpZ2FsZW1lbnQgYWxsZXIgc3VyDQogICAgPGEgaHJlZj0iaHR0cDovL2Rldi5jbXNtYWRlc2ltcGxlLm9yZy9wcm9qZWN0cy9rc3R5bGUiIHRhcmdldD0iX2JsYW5rIj5sYQ0KICAgIGZvcmdlIGRlIENNU01TIHN1ciBsZSBwcm9qZXQgS1N0eWxlPC9hPg0KICAgIHBvdXIgcmVtb250ZXIgdW4gYnVnIG91IHVuZSBkZW1hbmRlIGRlIGZvbmN0aW9ubmFsaXTDqXMuDQo8L3A+]]></data>
	</file>
	<file>
	  <filename>/extra/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/extra/scssphp/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/extra/scssphp/bin/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/extra/scssphp/bin/pscss</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[IyEvdXNyL2Jpbi9lbnYgcGhwCjw/cGhwCgovKioKICogU0NTU1BIUAogKgogKiBAY29weXJpZ2h0IDIwMTItMjAyMCBMZWFmIENvcmNvcmFuCiAqCiAqIEBsaWNlbnNlIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQgTUlUCiAqCiAqIEBsaW5rIGh0dHA6Ly9zY3NzcGhwLmdpdGh1Yi5pby9zY3NzcGhwCiAqLwoKZXJyb3JfcmVwb3J0aW5nKEVfQUxMKTsKCmlmICh2ZXJzaW9uX2NvbXBhcmUoUEhQX1ZFUlNJT04sICc1LjYnKSA8IDApIHsKICAgIGRpZSgnUmVxdWlyZXMgUEhQIDUuNiBvciBhYm92ZScpOwp9CgppbmNsdWRlIF9fRElSX18gLiAnLy4uL3Njc3MuaW5jLnBocCc7Cgp1c2UgU2Nzc1BocFxTY3NzUGhwXENvbXBpbGVyOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEV4Y2VwdGlvblxTYXNzRXhjZXB0aW9uOwp1c2UgU2Nzc1BocFxTY3NzUGhwXE91dHB1dFN0eWxlOwp1c2UgU2Nzc1BocFxTY3NzUGhwXFBhcnNlcjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxWZXJzaW9uOwoKJHN0eWxlID0gbnVsbDsKJGxvYWRQYXRocyA9IFtdOwokZHVtcFRyZWUgPSBmYWxzZTsKJGlucHV0RmlsZSA9IG51bGw7CiRjaGFuZ2VEaXIgPSBmYWxzZTsKJGVuY29kaW5nID0gZmFsc2U7CiRzb3VyY2VNYXAgPSBmYWxzZTsKJGVtYmVkU291cmNlcyA9IGZhbHNlOwokZW1iZWRTb3VyY2VNYXAgPSBmYWxzZTsKCi8qKgogKiBQYXJzZSBhcmd1bWVudAogKgogKiBAcGFyYW0gaW50ICAgICAgJGkKICogQHBhcmFtIHN0cmluZ1tdICRvcHRpb25zCiAqCiAqIEByZXR1cm4gc3RyaW5nfG51bGwKICovCmZ1bmN0aW9uIHBhcnNlQXJndW1lbnQoJiRpLCAkb3B0aW9ucykgewogICAgZ2xvYmFsICRhcmdjOwogICAgZ2xvYmFsICRhcmd2OwoKICAgIGlmICghIHByZWdfbWF0Y2goJy9eKD86JyAuIGltcGxvZGUoJ3wnLCAoYXJyYXkpICRvcHRpb25zKSAuICcpPT8oLiopLycsICRhcmd2WyRpXSwgJG1hdGNoZXMpKSB7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGlmIChzdHJsZW4oJG1hdGNoZXNbMV0pKSB7CiAgICAgICAgcmV0dXJuICRtYXRjaGVzWzFdOwogICAgfQoKICAgIGlmICgkaSArIDEgPCAkYXJnYykgewogICAgICAgICRpKys7CgogICAgICAgIHJldHVybiAkYXJndlskaV07CiAgICB9Cn0KCiRhcmd1bWVudHMgPSBbXTsKCmZvciAoJGkgPSAxOyAkaSA8ICRhcmdjOyAkaSsrKSB7CiAgICBpZiAoJGFyZ3ZbJGldID09PSAnLT8nIHx8ICRhcmd2WyRpXSA9PT0gJy1oJyB8fCAkYXJndlskaV0gPT09ICctLWhlbHAnKSB7CiAgICAgICAgJGV4ZSA9ICRhcmd2WzBdOwoKICAgICAgICAkSEVMUCA9IDw8PEVPVApVc2FnZTogJGV4ZSBbb3B0aW9uc10gW2lucHV0LWZpbGVdIFtvdXRwdXQtZmlsZV0KCk9wdGlvbnMgaW5jbHVkZToKCiAgICAtLWhlbHAgICAgICAgICAgICAgIFNob3cgdGhpcyBtZXNzYWdlIFstaCwgLT9dCiAgICAtLWNvbnRpbnVlLW9uLWVycm9yIFtkZXByZWNhdGVkXSBJZ25vcmVkCiAgICAtLWRlYnVnLWluZm8gICAgICAgIFtkZXByZWNhdGVkXSBJZ25vcmVkIFstZ10KICAgIC0tZHVtcC10cmVlICAgICAgICAgW2RlcHJlY2F0ZWRdIER1bXAgZm9ybWF0dGVkIHBhcnNlIHRyZWUgWy1UXQogICAgLS1pc284ODU5LTEgICAgICAgICBVc2UgaXNvODg1OS0xIGVuY29kaW5nIGluc3RlYWQgb2YgZGVmYXVsdCB1dGYtOAogICAgLS1saW5lLW51bWJlcnMgICAgICBbZGVwcmVjYXRlZF0gSWdub3JlZCBbLS1saW5lLWNvbW1lbnRzXQogICAgLS1sb2FkLXBhdGg9UEFUSCAgICBTZXQgaW1wb3J0IHBhdGggWy1JXQogICAgLS1wcmVjaXNpb249TiAgICAgICBbZGVwcmVjYXRlZF0gSWdub3JlZC4gKGRlZmF1bHQgMTApIFstcF0KICAgIC0tc291cmNlbWFwICAgICAgICAgQ3JlYXRlIHNvdXJjZSBtYXAgZmlsZQogICAgLS1lbWJlZC1zb3VyY2VzICAgICBFbWJlZCBzb3VyY2UgZmlsZSBjb250ZW50cyBpbiBzb3VyY2UgbWFwcwogICAgLS1lbWJlZC1zb3VyY2UtbWFwICBFbWJlZCB0aGUgc291cmNlIG1hcCBjb250ZW50cyBpbiBDU1MgKGRlZmF1bHQgaWYgd3JpdGluZyB0byBzdGRvdXQpCiAgICAtLXN0eWxlPUZPUk1BVCAgICAgIFNldCB0aGUgb3V0cHV0IHN0eWxlIChjb21wcmVzc2VkIG9yIGV4cGFuZGVkKSBbLXMsIC10XQogICAgLS12ZXJzaW9uICAgICAgICAgICBQcmludCB0aGUgdmVyc2lvbiBbLXZdCgpFT1Q7CiAgICAgICAgZXhpdCgkSEVMUCk7CiAgICB9CgogICAgaWYgKCRhcmd2WyRpXSA9PT0gJy12JyB8fCAkYXJndlskaV0gPT09ICctLXZlcnNpb24nKSB7CiAgICAgICAgZXhpdChWZXJzaW9uOjpWRVJTSU9OIC4gIlxuIik7CiAgICB9CgogICAgLy8gS2VlcCBwYXJzaW5nIC0tY29udGludWUtb24tZXJyb3IgdG8gYXZvaWQgQkMgYnJlYWtzIGZvciBzY3JpcHRzIHVzaW5nIGl0CiAgICBpZiAoJGFyZ3ZbJGldID09PSAnLS1jb250aW51ZS1vbi1lcnJvcicpIHsKICAgICAgICAvLyBUT0RPIHJlcG9ydCBpdCBhcyBhIHdhcm5pbmcgPwogICAgICAgIGNvbnRpbnVlOwogICAgfQoKICAgIC8vIEtlZXAgcGFyc2luZyBpdCB0byBhdm9pZCBCQyBicmVha3MgZm9yIHNjcmlwdHMgdXNpbmcgaXQKICAgIGlmICgkYXJndlskaV0gPT09ICctZycgfHwgJGFyZ3ZbJGldID09PSAnLS1kZWJ1Zy1pbmZvJykgewogICAgICAgIC8vIFRPRE8gcmVwb3J0IGl0IGFzIGEgd2FybmluZyA/CiAgICAgICAgY29udGludWU7CiAgICB9CgogICAgaWYgKCRhcmd2WyRpXSA9PT0gJy0taXNvODg1OS0xJykgewogICAgICAgICRlbmNvZGluZyA9ICdpc284ODU5LTEnOwogICAgICAgIGNvbnRpbnVlOwogICAgfQoKICAgIC8vIEtlZXAgcGFyc2luZyBpdCB0byBhdm9pZCBCQyBicmVha3MgZm9yIHNjcmlwdHMgdXNpbmcgaXQKICAgIGlmICgkYXJndlskaV0gPT09ICctLWxpbmUtbnVtYmVycycgfHwgJGFyZ3ZbJGldID09PSAnLS1saW5lLWNvbW1lbnRzJykgewogICAgICAgIC8vIFRPRE8gcmVwb3J0IGl0IGFzIGEgd2FybmluZyA/CiAgICAgICAgY29udGludWU7CiAgICB9CgogICAgaWYgKCRhcmd2WyRpXSA9PT0gJy0tc291cmNlbWFwJykgewogICAgICAgICRzb3VyY2VNYXAgPSB0cnVlOwogICAgICAgIGNvbnRpbnVlOwogICAgfQoKICAgIGlmICgkYXJndlskaV0gPT09ICctLWVtYmVkLXNvdXJjZXMnKSB7CiAgICAgICAgJGVtYmVkU291cmNlcyA9IHRydWU7CiAgICAgICAgY29udGludWU7CiAgICB9CgogICAgaWYgKCRhcmd2WyRpXSA9PT0gJy0tZW1iZWQtc291cmNlLW1hcCcpIHsKICAgICAgICAkZW1iZWRTb3VyY2VNYXAgPSB0cnVlOwogICAgICAgIGNvbnRpbnVlOwogICAgfQoKICAgIGlmICgkYXJndlskaV0gPT09ICctVCcgfHwgJGFyZ3ZbJGldID09PSAnLS1kdW1wLXRyZWUnKSB7CiAgICAgICAgJGR1bXBUcmVlID0gdHJ1ZTsKICAgICAgICBjb250aW51ZTsKICAgIH0KCiAgICAkdmFsdWUgPSBwYXJzZUFyZ3VtZW50KCRpLCBhcnJheSgnLXQnLCAnLXMnLCAnLS1zdHlsZScpKTsKCiAgICBpZiAoaXNzZXQoJHZhbHVlKSkgewogICAgICAgICRzdHlsZSA9ICR2YWx1ZTsKICAgICAgICBjb250aW51ZTsKICAgIH0KCiAgICAkdmFsdWUgPSBwYXJzZUFyZ3VtZW50KCRpLCBhcnJheSgnLUknLCAnLS1sb2FkLXBhdGgnKSk7CgogICAgaWYgKGlzc2V0KCR2YWx1ZSkpIHsKICAgICAgICAkbG9hZFBhdGhzW10gPSAkdmFsdWU7CiAgICAgICAgY29udGludWU7CiAgICB9CgogICAgLy8gS2VlcCBwYXJzaW5nIC0tcHJlY2lzaW9uIHRvIGF2b2lkIEJDIGJyZWFrcyBmb3Igc2NyaXB0cyB1c2luZyBpdAogICAgJHZhbHVlID0gcGFyc2VBcmd1bWVudCgkaSwgYXJyYXkoJy1wJywgJy0tcHJlY2lzaW9uJykpOwoKICAgIGlmIChpc3NldCgkdmFsdWUpKSB7CiAgICAgICAgLy8gVE9ETyByZXBvcnQgaXQgYXMgYSB3YXJuaW5nID8KICAgICAgICBjb250aW51ZTsKICAgIH0KCiAgICAkYXJndW1lbnRzW10gPSAkYXJndlskaV07Cn0KCgppZiAoaXNzZXQoJGFyZ3VtZW50c1swXSkgJiYgZmlsZV9leGlzdHMoJGFyZ3VtZW50c1swXSkpIHsKICAgICRpbnB1dEZpbGUgPSAkYXJndW1lbnRzWzBdOwogICAgJGRhdGEgPSBmaWxlX2dldF9jb250ZW50cygkaW5wdXRGaWxlKTsKfSBlbHNlIHsKICAgICRkYXRhID0gJyc7CgogICAgd2hpbGUgKCEgZmVvZihTVERJTikpIHsKICAgICAgICAkZGF0YSAuPSBmcmVhZChTVERJTiwgODE5Mik7CiAgICB9Cn0KCmlmICgkZHVtcFRyZWUpIHsKICAgICRwYXJzZXIgPSBuZXcgUGFyc2VyKCRpbnB1dEZpbGUpOwoKICAgIHByaW50X3IoanNvbl9kZWNvZGUoanNvbl9lbmNvZGUoJHBhcnNlci0+cGFyc2UoJGRhdGEpKSwgdHJ1ZSkpOwoKICAgIGZ3cml0ZShTVERFUlIsICdXYXJuaW5nOiB0aGUgLS1kdW1wLXRyZWUgb3B0aW9uIGlzIGRlcHJlY2F0ZWQuIFVzZSBwcm9wZXIgZGVidWdnaW5nIHRvb2xzIGluc3RlYWQuJyk7CgogICAgZXhpdCgpOwp9Cgokc2NzcyA9IG5ldyBDb21waWxlcigpOwoKaWYgKCRsb2FkUGF0aHMpIHsKICAgICRzY3NzLT5zZXRJbXBvcnRQYXRocygkbG9hZFBhdGhzKTsKfQoKaWYgKCRzdHlsZSkgewogICAgaWYgKCRzdHlsZSA9PT0gT3V0cHV0U3R5bGU6OkNPTVBSRVNTRUQgfHwgJHN0eWxlID09PSBPdXRwdXRTdHlsZTo6RVhQQU5ERUQpIHsKICAgICAgICAkc2Nzcy0+c2V0T3V0cHV0U3R5bGUoJHN0eWxlKTsKICAgIH0gZWxzZSB7CiAgICAgICAgZndyaXRlKFNUREVSUiwgIldBUk5JTkc6IHRoZSAkc3R5bGUgc3R5bGUgaXMgZGVwcmVjYXRlZC5cbiIpOwogICAgICAgICRzY3NzLT5zZXRGb3JtYXR0ZXIoJ1Njc3NQaHBcXFNjc3NQaHBcXEZvcm1hdHRlclxcJyAuIHVjZmlyc3QoJHN0eWxlKSk7CiAgICB9Cn0KCiRvdXRwdXRGaWxlID0gaXNzZXQoJGFyZ3VtZW50c1sxXSkgPyAkYXJndW1lbnRzWzFdIDogbnVsbDsKJHNvdXJjZU1hcEZpbGUgPSBudWxsOwoKaWYgKCRzb3VyY2VNYXApIHsKICAgICRzb3VyY2VNYXBPcHRpb25zID0gYXJyYXkoCiAgICAgICAgJ291dHB1dFNvdXJjZUZpbGVzJyA9PiAkZW1iZWRTb3VyY2VzLAogICAgKTsKICAgIGlmICgkZW1iZWRTb3VyY2VNYXAgfHwgJG91dHB1dEZpbGUgPT09IG51bGwpIHsKICAgICAgICAkc2Nzcy0+c2V0U291cmNlTWFwKENvbXBpbGVyOjpTT1VSQ0VfTUFQX0lOTElORSk7CiAgICB9IGVsc2UgewogICAgICAgICRzb3VyY2VNYXBGaWxlID0gJG91dHB1dEZpbGUgLiAnLm1hcCc7CiAgICAgICAgJHNvdXJjZU1hcE9wdGlvbnNbJ3NvdXJjZU1hcFdyaXRlVG8nXSA9ICRzb3VyY2VNYXBGaWxlOwogICAgICAgICRzb3VyY2VNYXBPcHRpb25zWydzb3VyY2VNYXBVUkwnXSA9IGJhc2VuYW1lKCRzb3VyY2VNYXBGaWxlKTsKICAgICAgICAkc291cmNlTWFwT3B0aW9uc1snc291cmNlTWFwQmFzZXBhdGgnXSA9IGdldGN3ZCgpOwogICAgICAgICRzb3VyY2VNYXBPcHRpb25zWydzb3VyY2VNYXBGaWxlbmFtZSddID0gYmFzZW5hbWUoJG91dHB1dEZpbGUpOwoKICAgICAgICAkc2Nzcy0+c2V0U291cmNlTWFwKENvbXBpbGVyOjpTT1VSQ0VfTUFQX0ZJTEUpOwogICAgfQoKICAgICRzY3NzLT5zZXRTb3VyY2VNYXBPcHRpb25zKCRzb3VyY2VNYXBPcHRpb25zKTsKfQoKaWYgKCRlbmNvZGluZykgewogICAgJHNjc3MtPnNldEVuY29kaW5nKCRlbmNvZGluZyk7Cn0KCnRyeSB7CiAgICAkcmVzdWx0ID0gJHNjc3MtPmNvbXBpbGVTdHJpbmcoJGRhdGEsICRpbnB1dEZpbGUpOwp9IGNhdGNoIChTYXNzRXhjZXB0aW9uICRlKSB7CiAgICBmd3JpdGUoU1RERVJSLCAnRXJyb3I6ICcuJGUtPmdldE1lc3NhZ2UoKS4iXG4iKTsKICAgIGV4aXQoMSk7Cn0KCmlmICgkb3V0cHV0RmlsZSkgewogICAgZmlsZV9wdXRfY29udGVudHMoJG91dHB1dEZpbGUsICRyZXN1bHQtPmdldENzcygpKTsKCiAgICBpZiAoJHNvdXJjZU1hcEZpbGUgIT09IG51bGwgJiYgJHJlc3VsdC0+Z2V0U291cmNlTWFwKCkgIT09IG51bGwpIHsKICAgICAgICBmaWxlX3B1dF9jb250ZW50cygkc291cmNlTWFwRmlsZSwgJHJlc3VsdC0+Z2V0U291cmNlTWFwKCkpOwogICAgfQp9IGVsc2UgewogICAgZWNobyAkcmVzdWx0LT5nZXRDc3MoKTsKfQo=]]></data>
	</file>
	<file>
	  <filename>/extra/scssphp/composer.json</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ewogICAgIm5hbWUiOiAic2Nzc3BocC9zY3NzcGhwIiwKICAgICJ0eXBlIjogImxpYnJhcnkiLAogICAgImRlc2NyaXB0aW9uIjogInNjc3NwaHAgaXMgYSBjb21waWxlciBmb3IgU0NTUyB3cml0dGVuIGluIFBIUC4iLAogICAgImtleXdvcmRzIjogWyJjc3MiLCAic3R5bGVzaGVldCIsICJzY3NzIiwgInNhc3MiLCAibGVzcyJdLAogICAgImhvbWVwYWdlIjogImh0dHA6Ly9zY3NzcGhwLmdpdGh1Yi5pby9zY3NzcGhwLyIsCiAgICAibGljZW5zZSI6IFsKICAgICAgICAiTUlUIgogICAgXSwKICAgICJhdXRob3JzIjogWwogICAgICAgIHsKICAgICAgICAgICAgIm5hbWUiOiAiQW50aG9uIFBhbmciLAogICAgICAgICAgICAiZW1haWwiOiAiYXBhbmdAc29mdHdhcmVkZXZlbG9wbWVudC5jYSIsCiAgICAgICAgICAgICJob21lcGFnZSI6ICJodHRwczovL2dpdGh1Yi5jb20vcm9ib2NvZGVyIgogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICAibmFtZSI6ICJDw6lkcmljIE1vcmluIiwKICAgICAgICAgICAgImVtYWlsIjogImNlZHJpY0B5dGVyaXVtLmNvbSIsCiAgICAgICAgICAgICJob21lcGFnZSI6ICJodHRwczovL2dpdGh1Yi5jb20vQ2VyZGljIgogICAgICAgIH0KICAgIF0sCiAgICAiYXV0b2xvYWQiOiB7CiAgICAgICAgInBzci00IjogeyAiU2Nzc1BocFxcU2Nzc1BocFxcIjogInNyYy8iIH0KICAgIH0sCiAgICAiYXV0b2xvYWQtZGV2IjogewogICAgICAgICJwc3ItNCI6IHsgIlNjc3NQaHBcXFNjc3NQaHBcXFRlc3RzXFwiOiAidGVzdHMvIiB9CiAgICB9LAogICAgInJlcXVpcmUiOiB7CiAgICAgICAgInBocCI6ICI+PTUuNi4wIiwKICAgICAgICAiZXh0LWpzb24iOiAiKiIsCiAgICAgICAgImV4dC1jdHlwZSI6ICIqIgogICAgfSwKICAgICJzdWdnZXN0IjogewogICAgICAgICJleHQtbWJzdHJpbmciOiAiRm9yIGJlc3QgcGVyZm9ybWFuY2UsIG1ic3RyaW5nIHNob3VsZCBiZSBpbnN0YWxsZWQgYXMgaXQgaXMgZmFzdGVyIHRoYW4gZXh0LWljb252IiwKICAgICAgICAiZXh0LWljb252IjogIkNhbiBiZSB1c2VkIGFzIGZhbGxiYWNrIHdoZW4gZXh0LW1ic3RyaW5nIGlzIG5vdCBhdmFpbGFibGUiCiAgICB9LAogICAgInJlcXVpcmUtZGV2IjogewogICAgICAgICJiYW1hcm5pL2NvbXBvc2VyLWJpbi1wbHVnaW4iOiAiXjEuNCIsCiAgICAgICAgInBocHVuaXQvcGhwdW5pdCI6ICJeNS43IHx8IF42LjUgfHwgXjcuNSB8fCBeOC4zIHx8IF45LjQiLAogICAgICAgICJzYXNzL3Nhc3Mtc3BlYyI6ICIqIiwKICAgICAgICAic3F1aXpsYWJzL3BocF9jb2Rlc25pZmZlciI6ICJ+My41IiwKICAgICAgICAic3ltZm9ueS9waHB1bml0LWJyaWRnZSI6ICJeNS4xIiwKICAgICAgICAidGhvdWdodGJvdC9ib3VyYm9uIjogIl43LjAiLAogICAgICAgICJ0d2JzL2Jvb3RzdHJhcCI6ICJ+NS4wIiwKICAgICAgICAidHdicy9ib290c3RyYXA0IjogIjQuNi4xIiwKICAgICAgICAienVyYi9mb3VuZGF0aW9uIjogIn42LjcuMCIKICAgIH0sCiAgICAicmVwb3NpdG9yaWVzIjogWwogICAgICAgIHsKICAgICAgICAgICAgInR5cGUiOiAicGFja2FnZSIsCiAgICAgICAgICAgICJwYWNrYWdlIjogewogICAgICAgICAgICAgICAgIm5hbWUiOiAic2Fzcy9zYXNzLXNwZWMiLAogICAgICAgICAgICAgICAgInZlcnNpb24iOiAiMjAyMi4wOC4xOSIsCiAgICAgICAgICAgICAgICAic291cmNlIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImdpdCIsCiAgICAgICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL2dpdGh1Yi5jb20vc2Fzcy9zYXNzLXNwZWMuZ2l0IiwKICAgICAgICAgICAgICAgICAgICAicmVmZXJlbmNlIjogIjJiZGMxOTk3MjNhMzQ0NWQ1YmFkYWMzYWM3NzQxMDU2OThmMDg4NjEiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImRpc3QiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiemlwIiwKICAgICAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3Mvc2Fzcy9zYXNzLXNwZWMvemlwYmFsbC8yYmRjMTk5NzIzYTM0NDVkNWJhZGFjM2FjNzc0MTA1Njk4ZjA4ODYxIiwKICAgICAgICAgICAgICAgICAgICAicmVmZXJlbmNlIjogIjJiZGMxOTk3MjNhMzQ0NWQ1YmFkYWMzYWM3NzQxMDU2OThmMDg4NjEiLAogICAgICAgICAgICAgICAgICAgICJzaGFzdW0iOiAiIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgICJ0eXBlIjogInBhY2thZ2UiLAogICAgICAgICAgICAicGFja2FnZSI6IHsKICAgICAgICAgICAgICAgICJuYW1lIjogInRob3VnaHRib3QvYm91cmJvbiIsCiAgICAgICAgICAgICAgICAidmVyc2lvbiI6ICJ2Ny4wLjAiLAogICAgICAgICAgICAgICAgInNvdXJjZSI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJnaXQiLAogICAgICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9naXRodWIuY29tL3Rob3VnaHRib3QvYm91cmJvbi5naXQiLAogICAgICAgICAgICAgICAgICAgICJyZWZlcmVuY2UiOiAiZmJlMzM4ZWU2ODA3ZTdmN2FhOTk2ZDgyYzhhMTZmMjQ4YmIxNDliMyIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiZGlzdCI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ6aXAiLAogICAgICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy90aG91Z2h0Ym90L2JvdXJib24vemlwYmFsbC9mYmUzMzhlZTY4MDdlN2Y3YWE5OTZkODJjOGExNmYyNDhiYjE0OWIzIiwKICAgICAgICAgICAgICAgICAgICAicmVmZXJlbmNlIjogImZiZTMzOGVlNjgwN2U3ZjdhYTk5NmQ4MmM4YTE2ZjI0OGJiMTQ5YjMiLAogICAgICAgICAgICAgICAgICAgICJzaGFzdW0iOiAiIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgICJ0eXBlIjogInBhY2thZ2UiLAogICAgICAgICAgICAicGFja2FnZSI6IHsKICAgICAgICAgICAgICAgICJuYW1lIjogInR3YnMvYm9vdHN0cmFwNCIsCiAgICAgICAgICAgICAgICAidmVyc2lvbiI6ICJ2NC42LjEiLAogICAgICAgICAgICAgICAgInNvdXJjZSI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJnaXQiLAogICAgICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwLmdpdCIsCiAgICAgICAgICAgICAgICAgICAgInJlZmVyZW5jZSI6ICIwNDNhMDNjOTVhMmFkNjczOGY4NWI2NWU1M2I5ZGJkZmIwM2I4ZDEwIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJkaXN0IjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInppcCIsCiAgICAgICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL3R3YnMvYm9vdHN0cmFwL3ppcGJhbGwvMDQzYTAzYzk1YTJhZDY3MzhmODViNjVlNTNiOWRiZGZiMDNiOGQxMCIsCiAgICAgICAgICAgICAgICAgICAgInJlZmVyZW5jZSI6ICIwNDNhMDNjOTVhMmFkNjczOGY4NWI2NWU1M2I5ZGJkZmIwM2I4ZDEwIiwKICAgICAgICAgICAgICAgICAgICAic2hhc3VtIjogIiIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIF0sCiAgICAiYmluIjogWyJiaW4vcHNjc3MiXSwKICAgICJjb25maWciOiB7CiAgICAgICAgInNvcnQtcGFja2FnZXMiOiB0cnVlLAogICAgICAgICJhbGxvdy1wbHVnaW5zIjogewogICAgICAgICAgICAiYmFtYXJuaS9jb21wb3Nlci1iaW4tcGx1Z2luIjogdHJ1ZQogICAgICAgIH0KICAgIH0sCiAgICAiZXh0cmEiOiB7CiAgICAgICAgImJhbWFybmktYmluIjogewogICAgICAgICAgICAiZm9yd2FyZC1jb21tYW5kIjogZmFsc2UsCiAgICAgICAgICAgICJiaW4tbGlua3MiOiBmYWxzZQogICAgICAgIH0KICAgIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/extra/scssphp/LICENSE.md</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Q29weXJpZ2h0IChjKSAyMDE1IExlYWYgQ29yY29yYW4sIGh0dHA6Ly9zY3NzcGhwLmdpdGh1Yi5pby9zY3NzcGhwCiAKUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCmEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQoiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCndpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCnBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bwp0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAKVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCiAKVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCkVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgpNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORApOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFCkxJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04KT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OCldJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgo=]]></data>
	</file>
	<file>
	  <filename>/extra/scssphp/README.md</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[IyBzY3NzcGhwCiMjIyA8aHR0cHM6Ly9zY3NzcGhwLmdpdGh1Yi5pby9zY3NzcGhwPgoKIVtCdWlsZF0oaHR0cHM6Ly9naXRodWIuY29tL3Njc3NwaHAvc2Nzc3BocC93b3JrZmxvd3MvQ0kvYmFkZ2Uuc3ZnKQpbIVtMaWNlbnNlXShodHRwczovL3Bvc2VyLnB1Z3gub3JnL3Njc3NwaHAvc2Nzc3BocC9saWNlbnNlKV0oaHR0cHM6Ly9wYWNrYWdpc3Qub3JnL3BhY2thZ2VzL3Njc3NwaHAvc2Nzc3BocCkKCmBzY3NzcGhwYCBpcyBhIGNvbXBpbGVyIGZvciBTQ1NTIHdyaXR0ZW4gaW4gUEhQLgoKQ2hlY2tvdXQgdGhlIGhvbWVwYWdlLCA8aHR0cHM6Ly9zY3NzcGhwLmdpdGh1Yi5pby9zY3NzcGhwPiwgZm9yIGRpcmVjdGlvbnMgb24gaG93IHRvIHVzZS4KCiMjIFJ1bm5pbmcgVGVzdHMKCmBzY3NzcGhwYCB1c2VzIFtQSFBVbml0XShodHRwczovL2dpdGh1Yi5jb20vc2ViYXN0aWFuYmVyZ21hbm4vcGhwdW5pdCkgZm9yIHRlc3RpbmcuCgpSdW4gdGhlIGZvbGxvd2luZyBjb21tYW5kIGZyb20gdGhlIHJvb3QgZGlyZWN0b3J5IHRvIHJ1biBldmVyeSB0ZXN0OgoKICAgIHZlbmRvci9iaW4vcGhwdW5pdCB0ZXN0cwoKVGhlcmUgYXJlIHNldmVyYWwgdGVzdHMgaW4gdGhlIGB0ZXN0cy9gIGRpcmVjdG9yeToKCiogYEFwaVRlc3QucGhwYCBjb250YWlucyB2YXJpb3VzIHVuaXQgdGVzdHMgdGhhdCB0ZXN0IHRoZSBQSFAgaW50ZXJmYWNlLgoqIGBFeGNlcHRpb25UZXN0LnBocGAgY29udGFpbnMgdW5pdCB0ZXN0cyB0aGF0IHRlc3QgZm9yIGV4Y2VwdGlvbnMgdGhyb3duIGJ5IHRoZSBwYXJzZXIgYW5kIGNvbXBpbGVyLgoqIGBGYWlsaW5nVGVzdC5waHBgIGNvbnRhaW5zIHRlc3RzIHJlcG9ydGVkIGluIEdpdGh1YiBpc3N1ZXMgdGhhdCBkZW1vbnN0cmF0ZSBjb21wYXRpYmlsaXR5IGJ1Z3MuCiogYElucHV0VGVzdC5waHBgIGNvbXBpbGVzIGV2ZXJ5IGAuc2Nzc2AgZmlsZSBpbiB0aGUgYHRlc3RzL2lucHV0c2AgZGlyZWN0b3J5CiAgdGhlbiBjb21wYXJlcyB0byB0aGUgcmVzcGVjdGl2ZSBgLmNzc2AgZmlsZSBpbiB0aGUgYHRlc3RzL291dHB1dHNgIGRpcmVjdG9yeS4KKiBgU2Fzc1NwZWNUZXN0LnBocGAgZXh0cmFjdHMgdGVzdHMgZnJvbSB0aGUgYHNhc3Mvc2Fzcy1zcGVjYCByZXBvc2l0b3J5LgoKV2hlbiBjaGFuZ2luZyBhbnkgb2YgdGhlIHRlc3RzIGluIGB0ZXN0cy9pbnB1dHNgLCB0aGUgdGVzdHMgd2lsbCBtb3N0IGxpa2VseQpmYWlsIGJlY2F1c2UgdGhlIG91dHB1dCBoYXMgY2hhbmdlZC4gT25jZSB5b3UgdmVyaWZ5IHRoYXQgdGhlIG91dHB1dCBpcyBjb3JyZWN0CnlvdSBjYW4gcnVuIHRoZSBmb2xsb3dpbmcgY29tbWFuZCB0byByZWJ1aWxkIGFsbCB0aGUgdGVzdHM6CgogICAgQlVJTEQ9MSB2ZW5kb3IvYmluL3BocHVuaXQgdGVzdHMKClRoaXMgd2lsbCBjb21waWxlIGFsbCB0aGUgdGVzdHMsIGFuZCBzYXZlIHJlc3VsdHMgaW50byBgdGVzdHMvb3V0cHV0c2AuIEl0IGFsc28KdXBkYXRlcyB0aGUgbGlzdCBvZiBleGNsdWRlZCBzcGVjcyBmcm9tIHNhc3Mtc3BlYy4KClRvIGVuYWJsZSB0aGUgZnVsbCBgc2Fzcy1zcGVjYCBjb21wYXRpYmlsaXR5IHRlc3RzOgoKICAgIFRFU1RfU0FTU19TUEVDPTEgdmVuZG9yL2Jpbi9waHB1bml0IHRlc3RzCgojIyBDb2RpbmcgU3RhbmRhcmQKCmBzY3NzcGhwYCBzb3VyY2UgY29uZm9ybXMgdG8gW1BTUjEyXShodHRwczovL3d3dy5waHAtZmlnLm9yZy9wc3IvcHNyLTEyLykuCgpSdW4gdGhlIGZvbGxvd2luZyBjb21tYW5kIGZyb20gdGhlIHJvb3QgZGlyZWN0b3J5IHRvIGNoZWNrIHRoZSBjb2RlIGZvciAic25pZmZzIi4KCiAgICB2ZW5kb3IvYmluL3BocGNzIC0tc3RhbmRhcmQ9UFNSMTIgLS1leHRlbnNpb25zPXBocCBiaW4gc3JjIHRlc3RzICoucGhwCgojIyBTdGF0aWMgQW5hbHlzaXMKCmBzY3NzcGhwYCB1c2VzIFtwaHBzdGFuXShodHRwczovL3BocHN0YW4ub3JnLykgZm9yIHN0YXRpYyBhbmFseXNpcy4KClJ1biB0aGUgZm9sbG93aW5nIGNvbW1hbmQgZnJvbSB0aGUgcm9vdCBkaXJlY3RvcnkgdG8gYW5hbHlzZSB0aGUgY29kZWJhc2U6CgogICAgbWFrZSBwaHBzdGFuCgpBcyBtb3N0IG9mIHRoZSBjb2RlYmFzZSBpcyBjb21wb3NlZCBvZiBsZWdhY3kgY29kZSB3aGljaCBjYW5ub3QgYmUgdHlwZS1jaGVja2VkCmZ1bGx5LCB0aGUgc2V0dXAgY29udGFpbnMgYSBiYXNlbGluZSBmaWxlIHdpdGggYWxsIGVycm9ycyB3ZSB3YW50IHRvIGlnbm9yZS4gSW4KcGFydGljdWxhciwgd2UgaWdub3JlIGFsbCBlcnJvcnMgcmVsYXRlZCB0byBub3Qgc3BlY2lmeWluZyB0aGUgdHlwZXMgaW5zaWRlIGFycmF5cwp3aGVuIHRoZXNlIGFycmF5cyBjb3JyZXNwb25kIHRvIHRoZSByZXByZXNlbnRhdGlvbiBvZiBTYXNzIHZhbHVlcyBhbmQgU2FzcyBBU1Qgbm9kZXMKaW4gdGhlIHBhcnNlciBhbmQgY29tcGlsZXIuCldoZW4gY29udHJpYnV0aW5nLCB0aGUgcHJvcGVyIHByb2Nlc3MgdG8gZGVhbCB3aXRoIHN0YXRpYyBhbmFseXNpcyBpcyB0aGUgZm9sbG93aW5nOgoKMS4gTWFrZSB5b3VyIGNoYW5nZSBpbiB0aGUgY29kZWJhc2UKMi4gUnVuIGBtYWtlIHBocHN0YW5gCjMuIEZpeCBlcnJvcnMgcmVwb3J0ZWQgYnkgcGhwc3RhbiB3aGVuIHBvc3NpYmxlCjQuIFJlcGVhdCBzdGVwIDIgYW5kIDMgdW50aWwgbm90aGluZyBnZXRzIGZpeGVkIGFueW1vcmUgYXQgc3RlcCAzCjUuIFJ1biBgbWFrZSBwaHBzdGFuLWJhc2VsaW5lYCB0byByZWdlbmVyYXRlIHRoZSBwaHBzdGFuIGJhc2VsaW5lCgpBZGRpdGlvbnMgdG8gdGhlIGJhc2VsaW5lIHdpbGwgYmUgcmV2aWV3ZWQgdG8gYXZvaWQgaWdub3JpbmcgZXJyb3JzIHRoYXQgc2hvdWxkIGhhdmUKYmVlbiBmaXhlZC4K]]></data>
	</file>
	<file>
	  <filename>/extra/scssphp/scss.inc.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCmlmICh2ZXJzaW9uX2NvbXBhcmUoUEhQX1ZFUlNJT04sICc1LjYnKSA8IDApIHsKICAgIHRocm93IG5ldyBcRXhjZXB0aW9uKCdzY3NzcGhwIHJlcXVpcmVzIFBIUCA1LjYgb3IgYWJvdmUnKTsKfQoKaWYgKCEgY2xhc3NfZXhpc3RzKCdTY3NzUGhwXFNjc3NQaHBcVmVyc2lvbicpKSB7CiAgICBzcGxfYXV0b2xvYWRfcmVnaXN0ZXIoZnVuY3Rpb24gKCRjbGFzcykgewogICAgICAgIGlmICgwICE9PSBzdHJwb3MoJGNsYXNzLCAnU2Nzc1BocFxTY3NzUGhwXFwnKSkgewogICAgICAgICAgICAvLyBOb3QgYSBTY3NzUGhwIGNsYXNzCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICRzdWJDbGFzcyA9IHN1YnN0cigkY2xhc3MsIHN0cmxlbignU2Nzc1BocFxTY3NzUGhwXFwnKSk7CiAgICAgICAgJHBhdGggPSBfX0RJUl9fIC4gJy9zcmMvJyAuIHN0cl9yZXBsYWNlKCdcXCcsICcvJywgJHN1YkNsYXNzKSAuICcucGhwJzsKCiAgICAgICAgaWYgKGZpbGVfZXhpc3RzKCRwYXRoKSkgewogICAgICAgICAgICByZXF1aXJlICRwYXRoOwogICAgICAgIH0KICAgIH0pOwp9Cg==]]></data>
	</file>
	<file>
	  <filename>/extra/scssphp/src/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/extra/scssphp/src/Base/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/extra/scssphp/src/Base/Range.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxNS0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEJhc2U7CgovKioKICogUmFuZ2UKICoKICogQGF1dGhvciBBbnRob24gUGFuZyA8YW50aG9uLnBhbmdAZ21haWwuY29tPgogKgogKiBAaW50ZXJuYWwKICovCmNsYXNzIFJhbmdlCnsKICAgIC8qKgogICAgICogQHZhciBmbG9hdHxpbnQKICAgICAqLwogICAgcHVibGljICRmaXJzdDsKCiAgICAvKioKICAgICAqIEB2YXIgZmxvYXR8aW50CiAgICAgKi8KICAgIHB1YmxpYyAkbGFzdDsKCiAgICAvKioKICAgICAqIEluaXRpYWxpemUgcmFuZ2UKICAgICAqCiAgICAgKiBAcGFyYW0gaW50fGZsb2F0ICRmaXJzdAogICAgICogQHBhcmFtIGludHxmbG9hdCAkbGFzdAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGZpcnN0LCAkbGFzdCkKICAgIHsKICAgICAgICAkdGhpcy0+Zmlyc3QgPSAkZmlyc3Q7CiAgICAgICAgJHRoaXMtPmxhc3QgPSAkbGFzdDsKICAgIH0KCiAgICAvKioKICAgICAqIFRlc3QgZm9yIGluY2x1c2lvbiBpbiByYW5nZQogICAgICoKICAgICAqIEBwYXJhbSBpbnR8ZmxvYXQgJHZhbHVlCiAgICAgKgogICAgICogQHJldHVybiBib29sCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBpbmNsdWRlcygkdmFsdWUpCiAgICB7CiAgICAgICAgcmV0dXJuICR2YWx1ZSA+PSAkdGhpcy0+Zmlyc3QgJiYgJHZhbHVlIDw9ICR0aGlzLT5sYXN0OwogICAgfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/extra/scssphp/src/Block.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwOwoKLyoqCiAqIEJsb2NrCiAqCiAqIEBhdXRob3IgQW50aG9uIFBhbmcgPGFudGhvbi5wYW5nQGdtYWlsLmNvbT4KICoKICogQGludGVybmFsCiAqLwpjbGFzcyBCbG9jawp7CiAgICAvKioKICAgICAqIEB2YXIgc3RyaW5nfG51bGwKICAgICAqLwogICAgcHVibGljICR0eXBlOwoKICAgIC8qKgogICAgICogQHZhciBCbG9ja3xudWxsCiAgICAgKi8KICAgIHB1YmxpYyAkcGFyZW50OwoKICAgIC8qKgogICAgICogQHZhciBzdHJpbmcKICAgICAqLwogICAgcHVibGljICRzb3VyY2VOYW1lOwoKICAgIC8qKgogICAgICogQHZhciBpbnQKICAgICAqLwogICAgcHVibGljICRzb3VyY2VJbmRleDsKCiAgICAvKioKICAgICAqIEB2YXIgaW50CiAgICAgKi8KICAgIHB1YmxpYyAkc291cmNlTGluZTsKCiAgICAvKioKICAgICAqIEB2YXIgaW50CiAgICAgKi8KICAgIHB1YmxpYyAkc291cmNlQ29sdW1uOwoKICAgIC8qKgogICAgICogQHZhciBhcnJheXxudWxsCiAgICAgKi8KICAgIHB1YmxpYyAkc2VsZWN0b3JzOwoKICAgIC8qKgogICAgICogQHZhciBhcnJheQogICAgICovCiAgICBwdWJsaWMgJGNvbW1lbnRzOwoKICAgIC8qKgogICAgICogQHZhciBhcnJheQogICAgICovCiAgICBwdWJsaWMgJGNoaWxkcmVuOwoKICAgIC8qKgogICAgICogQHZhciBCbG9ja3xudWxsCiAgICAgKi8KICAgIHB1YmxpYyAkc2VsZlBhcmVudDsKfQo=]]></data>
	</file>
	<file>
	  <filename>/extra/scssphp/src/Block/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/extra/scssphp/src/Block/AtRootBlock.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEJsb2NrOwoKdXNlIFNjc3NQaHBcU2Nzc1BocFxCbG9jazsKdXNlIFNjc3NQaHBcU2Nzc1BocFxUeXBlOwoKLyoqCiAqIEBpbnRlcm5hbAogKi8KY2xhc3MgQXRSb290QmxvY2sgZXh0ZW5kcyBCbG9jawp7CiAgICAvKioKICAgICAqIEB2YXIgYXJyYXl8bnVsbAogICAgICovCiAgICBwdWJsaWMgJHNlbGVjdG9yOwoKICAgIC8qKgogICAgICogQHZhciBhcnJheXxudWxsCiAgICAgKi8KICAgIHB1YmxpYyAkd2l0aDsKCiAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoKQogICAgewogICAgICAgICR0aGlzLT50eXBlID0gVHlwZTo6VF9BVF9ST09UOwogICAgfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/extra/scssphp/src/Block/CallableBlock.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEJsb2NrOwoKdXNlIFNjc3NQaHBcU2Nzc1BocFxCbG9jazsKdXNlIFNjc3NQaHBcU2Nzc1BocFxDb21waWxlclxFbnZpcm9ubWVudDsKdXNlIFNjc3NQaHBcU2Nzc1BocFxOb2RlXE51bWJlcjsKCi8qKgogKiBAaW50ZXJuYWwKICovCmNsYXNzIENhbGxhYmxlQmxvY2sgZXh0ZW5kcyBCbG9jawp7CiAgICAvKioKICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkbmFtZTsKCiAgICAvKioKICAgICAqIEB2YXIgbGlzdDxhcnJheXtzdHJpbmcsIGFycmF5fE51bWJlcnxudWxsLCBib29sfT58bnVsbAogICAgICovCiAgICBwdWJsaWMgJGFyZ3M7CgogICAgLyoqCiAgICAgKiBAdmFyIEVudmlyb25tZW50fG51bGwKICAgICAqLwogICAgcHVibGljICRwYXJlbnRFbnY7CgogICAgLyoqCiAgICAgKiBAcGFyYW0gc3RyaW5nICR0eXBlCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkdHlwZSkKICAgIHsKICAgICAgICAkdGhpcy0+dHlwZSA9ICR0eXBlOwogICAgfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/extra/scssphp/src/Block/ContentBlock.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEJsb2NrOwoKdXNlIFNjc3NQaHBcU2Nzc1BocFxCbG9jazsKdXNlIFNjc3NQaHBcU2Nzc1BocFxDb21waWxlclxFbnZpcm9ubWVudDsKdXNlIFNjc3NQaHBcU2Nzc1BocFxUeXBlOwoKLyoqCiAqIEBpbnRlcm5hbAogKi8KY2xhc3MgQ29udGVudEJsb2NrIGV4dGVuZHMgQmxvY2sKewogICAgLyoqCiAgICAgKiBAdmFyIGFycmF5fG51bGwKICAgICAqLwogICAgcHVibGljICRjaGlsZDsKCiAgICAvKioKICAgICAqIEB2YXIgRW52aXJvbm1lbnR8bnVsbAogICAgICovCiAgICBwdWJsaWMgJHNjb3BlOwoKICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgpCiAgICB7CiAgICAgICAgJHRoaXMtPnR5cGUgPSBUeXBlOjpUX0lOQ0xVREU7CiAgICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/extra/scssphp/src/Block/DirectiveBlock.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEJsb2NrOwoKdXNlIFNjc3NQaHBcU2Nzc1BocFxCbG9jazsKdXNlIFNjc3NQaHBcU2Nzc1BocFxOb2RlXE51bWJlcjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxUeXBlOwoKLyoqCiAqIEBpbnRlcm5hbAogKi8KY2xhc3MgRGlyZWN0aXZlQmxvY2sgZXh0ZW5kcyBCbG9jawp7CiAgICAvKioKICAgICAqIEB2YXIgc3RyaW5nfGFycmF5CiAgICAgKi8KICAgIHB1YmxpYyAkbmFtZTsKCiAgICAvKioKICAgICAqIEB2YXIgYXJyYXl8TnVtYmVyfG51bGwKICAgICAqLwogICAgcHVibGljICR2YWx1ZTsKCiAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoKQogICAgewogICAgICAgICR0aGlzLT50eXBlID0gVHlwZTo6VF9ESVJFQ1RJVkU7CiAgICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/extra/scssphp/src/Block/EachBlock.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEJsb2NrOwoKdXNlIFNjc3NQaHBcU2Nzc1BocFxCbG9jazsKdXNlIFNjc3NQaHBcU2Nzc1BocFxOb2RlXE51bWJlcjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxUeXBlOwoKLyoqCiAqIEBpbnRlcm5hbAogKi8KY2xhc3MgRWFjaEJsb2NrIGV4dGVuZHMgQmxvY2sKewogICAgLyoqCiAgICAgKiBAdmFyIHN0cmluZ1tdCiAgICAgKi8KICAgIHB1YmxpYyAkdmFycyA9IFtdOwoKICAgIC8qKgogICAgICogQHZhciBhcnJheXxOdW1iZXIKICAgICAqLwogICAgcHVibGljICRsaXN0OwoKICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgpCiAgICB7CiAgICAgICAgJHRoaXMtPnR5cGUgPSBUeXBlOjpUX0VBQ0g7CiAgICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/extra/scssphp/src/Block/ElseBlock.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEJsb2NrOwoKdXNlIFNjc3NQaHBcU2Nzc1BocFxCbG9jazsKdXNlIFNjc3NQaHBcU2Nzc1BocFxUeXBlOwoKLyoqCiAqIEBpbnRlcm5hbAogKi8KY2xhc3MgRWxzZUJsb2NrIGV4dGVuZHMgQmxvY2sKewogICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCkKICAgIHsKICAgICAgICAkdGhpcy0+dHlwZSA9IFR5cGU6OlRfRUxTRTsKICAgIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/extra/scssphp/src/Block/ElseifBlock.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEJsb2NrOwoKdXNlIFNjc3NQaHBcU2Nzc1BocFxCbG9jazsKdXNlIFNjc3NQaHBcU2Nzc1BocFxOb2RlXE51bWJlcjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxUeXBlOwoKLyoqCiAqIEBpbnRlcm5hbAogKi8KY2xhc3MgRWxzZWlmQmxvY2sgZXh0ZW5kcyBCbG9jawp7CiAgICAvKioKICAgICAqIEB2YXIgYXJyYXl8TnVtYmVyCiAgICAgKi8KICAgIHB1YmxpYyAkY29uZDsKCiAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoKQogICAgewogICAgICAgICR0aGlzLT50eXBlID0gVHlwZTo6VF9FTFNFSUY7CiAgICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/extra/scssphp/src/Block/ForBlock.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEJsb2NrOwoKdXNlIFNjc3NQaHBcU2Nzc1BocFxCbG9jazsKdXNlIFNjc3NQaHBcU2Nzc1BocFxOb2RlXE51bWJlcjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxUeXBlOwoKLyoqCiAqIEBpbnRlcm5hbAogKi8KY2xhc3MgRm9yQmxvY2sgZXh0ZW5kcyBCbG9jawp7CiAgICAvKioKICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkdmFyOwoKICAgIC8qKgogICAgICogQHZhciBhcnJheXxOdW1iZXIKICAgICAqLwogICAgcHVibGljICRzdGFydDsKCiAgICAvKioKICAgICAqIEB2YXIgYXJyYXl8TnVtYmVyCiAgICAgKi8KICAgIHB1YmxpYyAkZW5kOwoKICAgIC8qKgogICAgICogQHZhciBib29sCiAgICAgKi8KICAgIHB1YmxpYyAkdW50aWw7CgogICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCkKICAgIHsKICAgICAgICAkdGhpcy0+dHlwZSA9IFR5cGU6OlRfRk9SOwogICAgfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/extra/scssphp/src/Block/IfBlock.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEJsb2NrOwoKdXNlIFNjc3NQaHBcU2Nzc1BocFxCbG9jazsKdXNlIFNjc3NQaHBcU2Nzc1BocFxOb2RlXE51bWJlcjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxUeXBlOwoKLyoqCiAqIEBpbnRlcm5hbAogKi8KY2xhc3MgSWZCbG9jayBleHRlbmRzIEJsb2NrCnsKICAgIC8qKgogICAgICogQHZhciBhcnJheXxOdW1iZXIKICAgICAqLwogICAgcHVibGljICRjb25kOwoKICAgIC8qKgogICAgICogQHZhciBhcnJheTxFbHNlaWZCbG9ja3xFbHNlQmxvY2s+CiAgICAgKi8KICAgIHB1YmxpYyAkY2FzZXMgPSBbXTsKCiAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoKQogICAgewogICAgICAgICR0aGlzLT50eXBlID0gVHlwZTo6VF9JRjsKICAgIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/extra/scssphp/src/Block/MediaBlock.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEJsb2NrOwoKdXNlIFNjc3NQaHBcU2Nzc1BocFxCbG9jazsKdXNlIFNjc3NQaHBcU2Nzc1BocFxOb2RlXE51bWJlcjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxUeXBlOwoKLyoqCiAqIEBpbnRlcm5hbAogKi8KY2xhc3MgTWVkaWFCbG9jayBleHRlbmRzIEJsb2NrCnsKICAgIC8qKgogICAgICogQHZhciBzdHJpbmd8YXJyYXl8TnVtYmVyfG51bGwKICAgICAqLwogICAgcHVibGljICR2YWx1ZTsKCiAgICAvKioKICAgICAqIEB2YXIgYXJyYXl8bnVsbAogICAgICovCiAgICBwdWJsaWMgJHF1ZXJ5TGlzdDsKCiAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoKQogICAgewogICAgICAgICR0aGlzLT50eXBlID0gVHlwZTo6VF9NRURJQTsKICAgIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/extra/scssphp/src/Block/NestedPropertyBlock.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEJsb2NrOwoKdXNlIFNjc3NQaHBcU2Nzc1BocFxCbG9jazsKdXNlIFNjc3NQaHBcU2Nzc1BocFxUeXBlOwoKLyoqCiAqIEBpbnRlcm5hbAogKi8KY2xhc3MgTmVzdGVkUHJvcGVydHlCbG9jayBleHRlbmRzIEJsb2NrCnsKICAgIC8qKgogICAgICogQHZhciBib29sCiAgICAgKi8KICAgIHB1YmxpYyAkaGFzVmFsdWU7CgogICAgLyoqCiAgICAgKiBAdmFyIGFycmF5CiAgICAgKi8KICAgIHB1YmxpYyAkcHJlZml4OwoKICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgpCiAgICB7CiAgICAgICAgJHRoaXMtPnR5cGUgPSBUeXBlOjpUX05FU1RFRF9QUk9QRVJUWTsKICAgIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/extra/scssphp/src/Block/WhileBlock.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEJsb2NrOwoKdXNlIFNjc3NQaHBcU2Nzc1BocFxCbG9jazsKdXNlIFNjc3NQaHBcU2Nzc1BocFxUeXBlOwoKLyoqCiAqIEBpbnRlcm5hbAogKi8KY2xhc3MgV2hpbGVCbG9jayBleHRlbmRzIEJsb2NrCnsKICAgIC8qKgogICAgICogQHZhciBhcnJheQogICAgICovCiAgICBwdWJsaWMgJGNvbmQ7CgogICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCkKICAgIHsKICAgICAgICAkdGhpcy0+dHlwZSA9IFR5cGU6OlRfV0hJTEU7CiAgICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/extra/scssphp/src/Cache.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwOwoKdXNlIEV4Y2VwdGlvbjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxWZXJzaW9uOwoKLyoqCiAqIFRoZSBzY3NzIGNhY2hlIG1hbmFnZXIuCiAqCiAqIEluIHNob3J0OgogKgogKiBhbGxvdyB0byBwdXQgaW4gY2FjaGUvZ2V0IGZyb20gY2FjaGUgYSBnZW5lcmljIHJlc3VsdCBmcm9tIGEga25vd24gb3BlcmF0aW9uIG9uIGEgZ2VuZXJpYyBkYXRhc2V0LAogKiB0YWtpbmcgaW4gYWNjb3VudCBvcHRpb25zIHRoYXQgYWZmZWN0cyB0aGUgcmVzdWx0CiAqCiAqIFRoZSBjYWNoZSBtYW5hZ2VyIGlzIGFnbm9zdGljIGFib3V0IGRhdGEgZm9ybWF0IGFuZCBvbmx5IHRoZSBvcGVyYXRpb24gaXMgZXhwZWN0ZWQgdG8gYmUgZGVzY3JpYmVkIGJ5IHN0cmluZwogKi8KCi8qKgogKiBTQ1NTIGNhY2hlCiAqCiAqIEBhdXRob3IgQ2VkcmljIE1vcmluIDxjZWRyaWNAeXRlcml1bS5jb20+CiAqCiAqIEBpbnRlcm5hbAogKi8KY2xhc3MgQ2FjaGUKewogICAgY29uc3QgQ0FDSEVfVkVSU0lPTiA9IDE7CgogICAgLyoqCiAgICAgKiBkaXJlY3RvcnkgdXNlZCBmb3Igc3RvcmluZyBkYXRhCiAgICAgKgogICAgICogQHZhciBzdHJpbmd8ZmFsc2UKICAgICAqLwogICAgcHVibGljIHN0YXRpYyAkY2FjaGVEaXIgPSBmYWxzZTsKCiAgICAvKioKICAgICAqIHByZWZpeCBmb3IgdGhlIHN0b3JpbmcgZGF0YQogICAgICoKICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgJHByZWZpeCA9ICdzY3NzcGhwXyc7CgogICAgLyoqCiAgICAgKiBmb3JjZSBhIHJlZnJlc2ggOiAnb25jZScgZm9yIHJlZnJlc2hpbmcgdGhlIGZpcnN0IGhpdCBvbiBhIGNhY2hlIG9ubHksIHRydWUgdG8gbmV2ZXIgdXNlIHRoZSBjYWNoZSBpbiB0aGlzIGhpdAogICAgICoKICAgICAqIEB2YXIgYm9vbHxzdHJpbmcKICAgICAqLwogICAgcHVibGljIHN0YXRpYyAkZm9yY2VSZWZyZXNoID0gZmFsc2U7CgogICAgLyoqCiAgICAgKiBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiBzZWNvbmRzIGFmdGVyIHdoaWNoIGRhdGEgY2FjaGVkIHdpbGwgYmUgc2VlbiBhcyAnZ2FyYmFnZScgYW5kIHBvdGVudGlhbGx5IGNsZWFuZWQgdXAKICAgICAqCiAgICAgKiBAdmFyIGludAogICAgICovCiAgICBwdWJsaWMgc3RhdGljICRnY0xpZmV0aW1lID0gNjA0ODAwOwoKICAgIC8qKgogICAgICogYXJyYXkgb2YgYWxyZWFkeSByZWZyZXNoZWQgY2FjaGUgaWYgJGZvcmNlUmVmcmVzaD09PSdvbmNlJwogICAgICoKICAgICAqIEB2YXIgYXJyYXk8c3RyaW5nLCBib29sPgogICAgICovCiAgICBwcm90ZWN0ZWQgc3RhdGljICRyZWZyZXNoZWQgPSBbXTsKCiAgICAvKioKICAgICAqIENvbnN0cnVjdG9yCiAgICAgKgogICAgICogQHBhcmFtIGFycmF5ICRvcHRpb25zCiAgICAgKgogICAgICogQHBocHN0YW4tcGFyYW0gYXJyYXl7Y2FjaGVEaXI/OiBzdHJpbmcsIHByZWZpeD86IHN0cmluZywgZm9yY2VSZWZyZXNoPzogc3RyaW5nfSAkb3B0aW9ucwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJG9wdGlvbnMpCiAgICB7CiAgICAgICAgLy8gY2hlY2sgJGNhY2hlRGlyCiAgICAgICAgaWYgKGlzc2V0KCRvcHRpb25zWydjYWNoZURpciddKSkgewogICAgICAgICAgICBzZWxmOjokY2FjaGVEaXIgPSAkb3B0aW9uc1snY2FjaGVEaXInXTsKICAgICAgICB9CgogICAgICAgIGlmIChlbXB0eShzZWxmOjokY2FjaGVEaXIpKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oJ2NhY2hlRGlyIG5vdCBzZXQnKTsKICAgICAgICB9CgogICAgICAgIGlmIChpc3NldCgkb3B0aW9uc1sncHJlZml4J10pKSB7CiAgICAgICAgICAgIHNlbGY6OiRwcmVmaXggPSAkb3B0aW9uc1sncHJlZml4J107CiAgICAgICAgfQoKICAgICAgICBpZiAoZW1wdHkoc2VsZjo6JHByZWZpeCkpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigncHJlZml4IG5vdCBzZXQnKTsKICAgICAgICB9CgogICAgICAgIGlmIChpc3NldCgkb3B0aW9uc1snZm9yY2VSZWZyZXNoJ10pKSB7CiAgICAgICAgICAgIHNlbGY6OiRmb3JjZVJlZnJlc2ggPSAkb3B0aW9uc1snZm9yY2VSZWZyZXNoJ107CiAgICAgICAgfQoKICAgICAgICBzZWxmOjpjaGVja0NhY2hlRGlyKCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBHZXQgdGhlIGNhY2hlZCByZXN1bHQgb2YgJG9wZXJhdGlvbiBvbiAkd2hhdCwKICAgICAqIHdoaWNoIGlzIGtub3duIGFzIGRlcGVuZGFudCBmcm9tIHRoZSBjb250ZW50IG9mICRvcHRpb25zCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAgICRvcGVyYXRpb24gICAgcGFyc2UsIGNvbXBpbGUuLi4KICAgICAqIEBwYXJhbSBtaXhlZCAgICAkd2hhdCAgICAgICAgIGNvbnRlbnQga2V5IChlLmcuLCBmaWxlbmFtZSB0byBiZSB0cmVhdGVkKQogICAgICogQHBhcmFtIGFycmF5ICAgICRvcHRpb25zICAgICAgYW55IG9wdGlvbiB0aGF0IGFmZmVjdCB0aGUgb3BlcmF0aW9uIHJlc3VsdCBvbiB0aGUgY29udGVudAogICAgICogQHBhcmFtIGludHxudWxsICRsYXN0TW9kaWZpZWQgbGFzdCBtb2RpZmllZCB0aW1lc3RhbXAKICAgICAqCiAgICAgKiBAcmV0dXJuIG1peGVkCiAgICAgKgogICAgICogQHRocm93cyBcRXhjZXB0aW9uCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRDYWNoZSgkb3BlcmF0aW9uLCAkd2hhdCwgJG9wdGlvbnMgPSBbXSwgJGxhc3RNb2RpZmllZCA9IG51bGwpCiAgICB7CiAgICAgICAgJGZpbGVDYWNoZSA9IHNlbGY6OiRjYWNoZURpciAuIHNlbGY6OmNhY2hlTmFtZSgkb3BlcmF0aW9uLCAkd2hhdCwgJG9wdGlvbnMpOwoKICAgICAgICBpZiAoCiAgICAgICAgICAgICgoc2VsZjo6JGZvcmNlUmVmcmVzaCA9PT0gZmFsc2UpIHx8IChzZWxmOjokZm9yY2VSZWZyZXNoID09PSAnb25jZScgJiYKICAgICAgICAgICAgaXNzZXQoc2VsZjo6JHJlZnJlc2hlZFskZmlsZUNhY2hlXSkpKSAmJiBmaWxlX2V4aXN0cygkZmlsZUNhY2hlKQogICAgICAgICkgewogICAgICAgICAgICAkY2FjaGVUaW1lID0gZmlsZW10aW1lKCRmaWxlQ2FjaGUpOwoKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgKFxpc19udWxsKCRsYXN0TW9kaWZpZWQpIHx8ICRjYWNoZVRpbWUgPiAkbGFzdE1vZGlmaWVkKSAmJgogICAgICAgICAgICAgICAgJGNhY2hlVGltZSArIHNlbGY6OiRnY0xpZmV0aW1lID4gdGltZSgpCiAgICAgICAgICAgICkgewogICAgICAgICAgICAgICAgJGMgPSBmaWxlX2dldF9jb250ZW50cygkZmlsZUNhY2hlKTsKICAgICAgICAgICAgICAgICRjID0gdW5zZXJpYWxpemUoJGMpOwoKICAgICAgICAgICAgICAgIGlmIChcaXNfYXJyYXkoJGMpICYmIGlzc2V0KCRjWyd2YWx1ZSddKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkY1sndmFsdWUnXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9CgogICAgLyoqCiAgICAgKiBQdXQgaW4gY2FjaGUgdGhlIHJlc3VsdCBvZiAkb3BlcmF0aW9uIG9uICR3aGF0LAogICAgICogd2hpY2ggaXMga25vd24gYXMgZGVwZW5kYW50IGZyb20gdGhlIGNvbnRlbnQgb2YgJG9wdGlvbnMKICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICRvcGVyYXRpb24KICAgICAqIEBwYXJhbSBtaXhlZCAgJHdoYXQKICAgICAqIEBwYXJhbSBtaXhlZCAgJHZhbHVlCiAgICAgKiBAcGFyYW0gYXJyYXkgICRvcHRpb25zCiAgICAgKgogICAgICogQHJldHVybiB2b2lkCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRDYWNoZSgkb3BlcmF0aW9uLCAkd2hhdCwgJHZhbHVlLCAkb3B0aW9ucyA9IFtdKQogICAgewogICAgICAgICRmaWxlQ2FjaGUgPSBzZWxmOjokY2FjaGVEaXIgLiBzZWxmOjpjYWNoZU5hbWUoJG9wZXJhdGlvbiwgJHdoYXQsICRvcHRpb25zKTsKCiAgICAgICAgJGMgPSBbJ3ZhbHVlJyA9PiAkdmFsdWVdOwogICAgICAgICRjID0gc2VyaWFsaXplKCRjKTsKCiAgICAgICAgZmlsZV9wdXRfY29udGVudHMoJGZpbGVDYWNoZSwgJGMpOwoKICAgICAgICBpZiAoc2VsZjo6JGZvcmNlUmVmcmVzaCA9PT0gJ29uY2UnKSB7CiAgICAgICAgICAgIHNlbGY6OiRyZWZyZXNoZWRbJGZpbGVDYWNoZV0gPSB0cnVlOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEdldCB0aGUgY2FjaGUgbmFtZSBmb3IgdGhlIGNhY2hpbmcgb2YgJG9wZXJhdGlvbiBvbiAkd2hhdCwKICAgICAqIHdoaWNoIGlzIGtub3duIGFzIGRlcGVuZGFudCBmcm9tIHRoZSBjb250ZW50IG9mICRvcHRpb25zCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkb3BlcmF0aW9uCiAgICAgKiBAcGFyYW0gbWl4ZWQgICR3aGF0CiAgICAgKiBAcGFyYW0gYXJyYXkgICRvcHRpb25zCiAgICAgKgogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gY2FjaGVOYW1lKCRvcGVyYXRpb24sICR3aGF0LCAkb3B0aW9ucyA9IFtdKQogICAgewogICAgICAgICR0ID0gWwogICAgICAgICAgJ3ZlcnNpb24nID0+IHNlbGY6OkNBQ0hFX1ZFUlNJT04sCiAgICAgICAgICAnc2Nzc3BocFZlcnNpb24nID0+IFZlcnNpb246OlZFUlNJT04sCiAgICAgICAgICAnb3BlcmF0aW9uJyA9PiAkb3BlcmF0aW9uLAogICAgICAgICAgJ3doYXQnID0+ICR3aGF0LAogICAgICAgICAgJ29wdGlvbnMnID0+ICRvcHRpb25zCiAgICAgICAgXTsKCiAgICAgICAgJHQgPSBzZWxmOjokcHJlZml4CiAgICAgICAgICAuIHNoYTEoanNvbl9lbmNvZGUoJHQpKQogICAgICAgICAgLiAiLiRvcGVyYXRpb24iCiAgICAgICAgICAuICIuc2Nzc2NhY2hlIjsKCiAgICAgICAgcmV0dXJuICR0OwogICAgfQoKICAgIC8qKgogICAgICogQ2hlY2sgdGhhdCB0aGUgY2FjaGUgZGlyIGV4aXN0cyBhbmQgaXMgd3JpdGVhYmxlCiAgICAgKgogICAgICogQHJldHVybiB2b2lkCiAgICAgKgogICAgICogQHRocm93cyBcRXhjZXB0aW9uCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY2hlY2tDYWNoZURpcigpCiAgICB7CiAgICAgICAgc2VsZjo6JGNhY2hlRGlyID0gc3RyX3JlcGxhY2UoJ1xcJywgJy8nLCBzZWxmOjokY2FjaGVEaXIpOwogICAgICAgIHNlbGY6OiRjYWNoZURpciA9IHJ0cmltKHNlbGY6OiRjYWNoZURpciwgJy8nKSAuICcvJzsKCiAgICAgICAgaWYgKCEgaXNfZGlyKHNlbGY6OiRjYWNoZURpcikpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbignQ2FjaGUgZGlyZWN0b3J5IGRvZXNuXCd0IGV4aXN0OiAnIC4gc2VsZjo6JGNhY2hlRGlyKTsKICAgICAgICB9CgogICAgICAgIGlmICghIGlzX3dyaXRhYmxlKHNlbGY6OiRjYWNoZURpcikpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbignQ2FjaGUgZGlyZWN0b3J5IGlzblwndCB3cml0YWJsZTogJyAuIHNlbGY6OiRjYWNoZURpcik7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogRGVsZXRlIHVudXNlZCBjYWNoZWQgZmlsZXMKICAgICAqCiAgICAgKiBAcmV0dXJuIHZvaWQKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjbGVhbkNhY2hlKCkKICAgIHsKICAgICAgICBzdGF0aWMgJGNsZWFuID0gZmFsc2U7CgogICAgICAgIGlmICgkY2xlYW4gfHwgZW1wdHkoc2VsZjo6JGNhY2hlRGlyKSkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAkY2xlYW4gPSB0cnVlOwoKICAgICAgICAvLyBvbmx5IHJlbW92ZSBmaWxlcyB3aXRoIGV4dGVuc2lvbnMgY3JlYXRlZCBieSBTQ1NTUEhQIENhY2hlCiAgICAgICAgLy8gY3NzIGZpbGVzIHJlbW92ZWQgYmFzZWQgb24gdGhlIGxpc3QgZmlsZXMKICAgICAgICAkcmVtb3ZlVHlwZXMgPSBbJ3Njc3NjYWNoZScgPT4gMV07CgogICAgICAgICRmaWxlcyA9IHNjYW5kaXIoc2VsZjo6JGNhY2hlRGlyKTsKCiAgICAgICAgaWYgKCEgJGZpbGVzKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICRjaGVja1RpbWUgPSB0aW1lKCkgLSBzZWxmOjokZ2NMaWZldGltZTsKCiAgICAgICAgZm9yZWFjaCAoJGZpbGVzIGFzICRmaWxlKSB7CiAgICAgICAgICAgIC8vIGRvbid0IGRlbGV0ZSBpZiB0aGUgZmlsZSB3YXNuJ3QgY3JlYXRlZCB3aXRoIFNDU1NQSFAgQ2FjaGUKICAgICAgICAgICAgaWYgKHN0cnBvcygkZmlsZSwgc2VsZjo6JHByZWZpeCkgIT09IDApIHsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkcGFydHMgPSBleHBsb2RlKCcuJywgJGZpbGUpOwogICAgICAgICAgICAkdHlwZSA9IGFycmF5X3BvcCgkcGFydHMpOwoKICAgICAgICAgICAgaWYgKCEgaXNzZXQoJHJlbW92ZVR5cGVzWyR0eXBlXSkpIHsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkZnVsbFBhdGggPSBzZWxmOjokY2FjaGVEaXIgLiAkZmlsZTsKICAgICAgICAgICAgJG10aW1lID0gZmlsZW10aW1lKCRmdWxsUGF0aCk7CgogICAgICAgICAgICAvLyBkb24ndCBkZWxldGUgaWYgaXQncyBhIHJlbGF0aXZlbHkgbmV3IGZpbGUKICAgICAgICAgICAgaWYgKCRtdGltZSA+ICRjaGVja1RpbWUpIHsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICB1bmxpbmsoJGZ1bGxQYXRoKTsKICAgICAgICB9CiAgICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/extra/scssphp/src/Colors.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwOwoKLyoqCiAqIENTUyBDb2xvcnMKICoKICogQGF1dGhvciBMZWFmIENvcmNvcmFuIDxsZWFmb3RAZ21haWwuY29tPgogKgogKiBAaW50ZXJuYWwKICovCmNsYXNzIENvbG9ycwp7CiAgICAvKioKICAgICAqIENTUyBDb2xvcnMKICAgICAqCiAgICAgKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL2NzczMtY29sb3IKICAgICAqCiAgICAgKiBAdmFyIGFycmF5PHN0cmluZywgc3RyaW5nPgogICAgICovCiAgICBwcm90ZWN0ZWQgc3RhdGljICRjc3NDb2xvcnMgPSBbCiAgICAgICAgJ2FsaWNlYmx1ZScgPT4gJzI0MCwyNDgsMjU1JywKICAgICAgICAnYW50aXF1ZXdoaXRlJyA9PiAnMjUwLDIzNSwyMTUnLAogICAgICAgICdhcXVhJyA9PiAnMCwyNTUsMjU1JywKICAgICAgICAnY3lhbicgPT4gJzAsMjU1LDI1NScsCiAgICAgICAgJ2FxdWFtYXJpbmUnID0+ICcxMjcsMjU1LDIxMicsCiAgICAgICAgJ2F6dXJlJyA9PiAnMjQwLDI1NSwyNTUnLAogICAgICAgICdiZWlnZScgPT4gJzI0NSwyNDUsMjIwJywKICAgICAgICAnYmlzcXVlJyA9PiAnMjU1LDIyOCwxOTYnLAogICAgICAgICdibGFjaycgPT4gJzAsMCwwJywKICAgICAgICAnYmxhbmNoZWRhbG1vbmQnID0+ICcyNTUsMjM1LDIwNScsCiAgICAgICAgJ2JsdWUnID0+ICcwLDAsMjU1JywKICAgICAgICAnYmx1ZXZpb2xldCcgPT4gJzEzOCw0MywyMjYnLAogICAgICAgICdicm93bicgPT4gJzE2NSw0Miw0MicsCiAgICAgICAgJ2J1cmx5d29vZCcgPT4gJzIyMiwxODQsMTM1JywKICAgICAgICAnY2FkZXRibHVlJyA9PiAnOTUsMTU4LDE2MCcsCiAgICAgICAgJ2NoYXJ0cmV1c2UnID0+ICcxMjcsMjU1LDAnLAogICAgICAgICdjaG9jb2xhdGUnID0+ICcyMTAsMTA1LDMwJywKICAgICAgICAnY29yYWwnID0+ICcyNTUsMTI3LDgwJywKICAgICAgICAnY29ybmZsb3dlcmJsdWUnID0+ICcxMDAsMTQ5LDIzNycsCiAgICAgICAgJ2Nvcm5zaWxrJyA9PiAnMjU1LDI0OCwyMjAnLAogICAgICAgICdjcmltc29uJyA9PiAnMjIwLDIwLDYwJywKICAgICAgICAnZGFya2JsdWUnID0+ICcwLDAsMTM5JywKICAgICAgICAnZGFya2N5YW4nID0+ICcwLDEzOSwxMzknLAogICAgICAgICdkYXJrZ29sZGVucm9kJyA9PiAnMTg0LDEzNCwxMScsCiAgICAgICAgJ2RhcmtncmF5JyA9PiAnMTY5LDE2OSwxNjknLAogICAgICAgICdkYXJrZ3JleScgPT4gJzE2OSwxNjksMTY5JywKICAgICAgICAnZGFya2dyZWVuJyA9PiAnMCwxMDAsMCcsCiAgICAgICAgJ2RhcmtraGFraScgPT4gJzE4OSwxODMsMTA3JywKICAgICAgICAnZGFya21hZ2VudGEnID0+ICcxMzksMCwxMzknLAogICAgICAgICdkYXJrb2xpdmVncmVlbicgPT4gJzg1LDEwNyw0NycsCiAgICAgICAgJ2RhcmtvcmFuZ2UnID0+ICcyNTUsMTQwLDAnLAogICAgICAgICdkYXJrb3JjaGlkJyA9PiAnMTUzLDUwLDIwNCcsCiAgICAgICAgJ2RhcmtyZWQnID0+ICcxMzksMCwwJywKICAgICAgICAnZGFya3NhbG1vbicgPT4gJzIzMywxNTAsMTIyJywKICAgICAgICAnZGFya3NlYWdyZWVuJyA9PiAnMTQzLDE4OCwxNDMnLAogICAgICAgICdkYXJrc2xhdGVibHVlJyA9PiAnNzIsNjEsMTM5JywKICAgICAgICAnZGFya3NsYXRlZ3JheScgPT4gJzQ3LDc5LDc5JywKICAgICAgICAnZGFya3NsYXRlZ3JleScgPT4gJzQ3LDc5LDc5JywKICAgICAgICAnZGFya3R1cnF1b2lzZScgPT4gJzAsMjA2LDIwOScsCiAgICAgICAgJ2Rhcmt2aW9sZXQnID0+ICcxNDgsMCwyMTEnLAogICAgICAgICdkZWVwcGluaycgPT4gJzI1NSwyMCwxNDcnLAogICAgICAgICdkZWVwc2t5Ymx1ZScgPT4gJzAsMTkxLDI1NScsCiAgICAgICAgJ2RpbWdyYXknID0+ICcxMDUsMTA1LDEwNScsCiAgICAgICAgJ2RpbWdyZXknID0+ICcxMDUsMTA1LDEwNScsCiAgICAgICAgJ2RvZGdlcmJsdWUnID0+ICczMCwxNDQsMjU1JywKICAgICAgICAnZmlyZWJyaWNrJyA9PiAnMTc4LDM0LDM0JywKICAgICAgICAnZmxvcmFsd2hpdGUnID0+ICcyNTUsMjUwLDI0MCcsCiAgICAgICAgJ2ZvcmVzdGdyZWVuJyA9PiAnMzQsMTM5LDM0JywKICAgICAgICAnZnVjaHNpYScgPT4gJzI1NSwwLDI1NScsCiAgICAgICAgJ21hZ2VudGEnID0+ICcyNTUsMCwyNTUnLAogICAgICAgICdnYWluc2Jvcm8nID0+ICcyMjAsMjIwLDIyMCcsCiAgICAgICAgJ2dob3N0d2hpdGUnID0+ICcyNDgsMjQ4LDI1NScsCiAgICAgICAgJ2dvbGQnID0+ICcyNTUsMjE1LDAnLAogICAgICAgICdnb2xkZW5yb2QnID0+ICcyMTgsMTY1LDMyJywKICAgICAgICAnZ3JheScgPT4gJzEyOCwxMjgsMTI4JywKICAgICAgICAnZ3JleScgPT4gJzEyOCwxMjgsMTI4JywKICAgICAgICAnZ3JlZW4nID0+ICcwLDEyOCwwJywKICAgICAgICAnZ3JlZW55ZWxsb3cnID0+ICcxNzMsMjU1LDQ3JywKICAgICAgICAnaG9uZXlkZXcnID0+ICcyNDAsMjU1LDI0MCcsCiAgICAgICAgJ2hvdHBpbmsnID0+ICcyNTUsMTA1LDE4MCcsCiAgICAgICAgJ2luZGlhbnJlZCcgPT4gJzIwNSw5Miw5MicsCiAgICAgICAgJ2luZGlnbycgPT4gJzc1LDAsMTMwJywKICAgICAgICAnaXZvcnknID0+ICcyNTUsMjU1LDI0MCcsCiAgICAgICAgJ2toYWtpJyA9PiAnMjQwLDIzMCwxNDAnLAogICAgICAgICdsYXZlbmRlcicgPT4gJzIzMCwyMzAsMjUwJywKICAgICAgICAnbGF2ZW5kZXJibHVzaCcgPT4gJzI1NSwyNDAsMjQ1JywKICAgICAgICAnbGF3bmdyZWVuJyA9PiAnMTI0LDI1MiwwJywKICAgICAgICAnbGVtb25jaGlmZm9uJyA9PiAnMjU1LDI1MCwyMDUnLAogICAgICAgICdsaWdodGJsdWUnID0+ICcxNzMsMjE2LDIzMCcsCiAgICAgICAgJ2xpZ2h0Y29yYWwnID0+ICcyNDAsMTI4LDEyOCcsCiAgICAgICAgJ2xpZ2h0Y3lhbicgPT4gJzIyNCwyNTUsMjU1JywKICAgICAgICAnbGlnaHRnb2xkZW5yb2R5ZWxsb3cnID0+ICcyNTAsMjUwLDIxMCcsCiAgICAgICAgJ2xpZ2h0Z3JheScgPT4gJzIxMSwyMTEsMjExJywKICAgICAgICAnbGlnaHRncmV5JyA9PiAnMjExLDIxMSwyMTEnLAogICAgICAgICdsaWdodGdyZWVuJyA9PiAnMTQ0LDIzOCwxNDQnLAogICAgICAgICdsaWdodHBpbmsnID0+ICcyNTUsMTgyLDE5MycsCiAgICAgICAgJ2xpZ2h0c2FsbW9uJyA9PiAnMjU1LDE2MCwxMjInLAogICAgICAgICdsaWdodHNlYWdyZWVuJyA9PiAnMzIsMTc4LDE3MCcsCiAgICAgICAgJ2xpZ2h0c2t5Ymx1ZScgPT4gJzEzNSwyMDYsMjUwJywKICAgICAgICAnbGlnaHRzbGF0ZWdyYXknID0+ICcxMTksMTM2LDE1MycsCiAgICAgICAgJ2xpZ2h0c2xhdGVncmV5JyA9PiAnMTE5LDEzNiwxNTMnLAogICAgICAgICdsaWdodHN0ZWVsYmx1ZScgPT4gJzE3NiwxOTYsMjIyJywKICAgICAgICAnbGlnaHR5ZWxsb3cnID0+ICcyNTUsMjU1LDIyNCcsCiAgICAgICAgJ2xpbWUnID0+ICcwLDI1NSwwJywKICAgICAgICAnbGltZWdyZWVuJyA9PiAnNTAsMjA1LDUwJywKICAgICAgICAnbGluZW4nID0+ICcyNTAsMjQwLDIzMCcsCiAgICAgICAgJ21hcm9vbicgPT4gJzEyOCwwLDAnLAogICAgICAgICdtZWRpdW1hcXVhbWFyaW5lJyA9PiAnMTAyLDIwNSwxNzAnLAogICAgICAgICdtZWRpdW1ibHVlJyA9PiAnMCwwLDIwNScsCiAgICAgICAgJ21lZGl1bW9yY2hpZCcgPT4gJzE4Niw4NSwyMTEnLAogICAgICAgICdtZWRpdW1wdXJwbGUnID0+ICcxNDcsMTEyLDIxOScsCiAgICAgICAgJ21lZGl1bXNlYWdyZWVuJyA9PiAnNjAsMTc5LDExMycsCiAgICAgICAgJ21lZGl1bXNsYXRlYmx1ZScgPT4gJzEyMywxMDQsMjM4JywKICAgICAgICAnbWVkaXVtc3ByaW5nZ3JlZW4nID0+ICcwLDI1MCwxNTQnLAogICAgICAgICdtZWRpdW10dXJxdW9pc2UnID0+ICc3MiwyMDksMjA0JywKICAgICAgICAnbWVkaXVtdmlvbGV0cmVkJyA9PiAnMTk5LDIxLDEzMycsCiAgICAgICAgJ21pZG5pZ2h0Ymx1ZScgPT4gJzI1LDI1LDExMicsCiAgICAgICAgJ21pbnRjcmVhbScgPT4gJzI0NSwyNTUsMjUwJywKICAgICAgICAnbWlzdHlyb3NlJyA9PiAnMjU1LDIyOCwyMjUnLAogICAgICAgICdtb2NjYXNpbicgPT4gJzI1NSwyMjgsMTgxJywKICAgICAgICAnbmF2YWpvd2hpdGUnID0+ICcyNTUsMjIyLDE3MycsCiAgICAgICAgJ25hdnknID0+ICcwLDAsMTI4JywKICAgICAgICAnb2xkbGFjZScgPT4gJzI1MywyNDUsMjMwJywKICAgICAgICAnb2xpdmUnID0+ICcxMjgsMTI4LDAnLAogICAgICAgICdvbGl2ZWRyYWInID0+ICcxMDcsMTQyLDM1JywKICAgICAgICAnb3JhbmdlJyA9PiAnMjU1LDE2NSwwJywKICAgICAgICAnb3JhbmdlcmVkJyA9PiAnMjU1LDY5LDAnLAogICAgICAgICdvcmNoaWQnID0+ICcyMTgsMTEyLDIxNCcsCiAgICAgICAgJ3BhbGVnb2xkZW5yb2QnID0+ICcyMzgsMjMyLDE3MCcsCiAgICAgICAgJ3BhbGVncmVlbicgPT4gJzE1MiwyNTEsMTUyJywKICAgICAgICAncGFsZXR1cnF1b2lzZScgPT4gJzE3NSwyMzgsMjM4JywKICAgICAgICAncGFsZXZpb2xldHJlZCcgPT4gJzIxOSwxMTIsMTQ3JywKICAgICAgICAncGFwYXlhd2hpcCcgPT4gJzI1NSwyMzksMjEzJywKICAgICAgICAncGVhY2hwdWZmJyA9PiAnMjU1LDIxOCwxODUnLAogICAgICAgICdwZXJ1JyA9PiAnMjA1LDEzMyw2MycsCiAgICAgICAgJ3BpbmsnID0+ICcyNTUsMTkyLDIwMycsCiAgICAgICAgJ3BsdW0nID0+ICcyMjEsMTYwLDIyMScsCiAgICAgICAgJ3Bvd2RlcmJsdWUnID0+ICcxNzYsMjI0LDIzMCcsCiAgICAgICAgJ3B1cnBsZScgPT4gJzEyOCwwLDEyOCcsCiAgICAgICAgJ3JlZCcgPT4gJzI1NSwwLDAnLAogICAgICAgICdyb3N5YnJvd24nID0+ICcxODgsMTQzLDE0MycsCiAgICAgICAgJ3JveWFsYmx1ZScgPT4gJzY1LDEwNSwyMjUnLAogICAgICAgICdzYWRkbGVicm93bicgPT4gJzEzOSw2OSwxOScsCiAgICAgICAgJ3NhbG1vbicgPT4gJzI1MCwxMjgsMTE0JywKICAgICAgICAnc2FuZHlicm93bicgPT4gJzI0NCwxNjQsOTYnLAogICAgICAgICdzZWFncmVlbicgPT4gJzQ2LDEzOSw4NycsCiAgICAgICAgJ3NlYXNoZWxsJyA9PiAnMjU1LDI0NSwyMzgnLAogICAgICAgICdzaWVubmEnID0+ICcxNjAsODIsNDUnLAogICAgICAgICdzaWx2ZXInID0+ICcxOTIsMTkyLDE5MicsCiAgICAgICAgJ3NreWJsdWUnID0+ICcxMzUsMjA2LDIzNScsCiAgICAgICAgJ3NsYXRlYmx1ZScgPT4gJzEwNiw5MCwyMDUnLAogICAgICAgICdzbGF0ZWdyYXknID0+ICcxMTIsMTI4LDE0NCcsCiAgICAgICAgJ3NsYXRlZ3JleScgPT4gJzExMiwxMjgsMTQ0JywKICAgICAgICAnc25vdycgPT4gJzI1NSwyNTAsMjUwJywKICAgICAgICAnc3ByaW5nZ3JlZW4nID0+ICcwLDI1NSwxMjcnLAogICAgICAgICdzdGVlbGJsdWUnID0+ICc3MCwxMzAsMTgwJywKICAgICAgICAndGFuJyA9PiAnMjEwLDE4MCwxNDAnLAogICAgICAgICd0ZWFsJyA9PiAnMCwxMjgsMTI4JywKICAgICAgICAndGhpc3RsZScgPT4gJzIxNiwxOTEsMjE2JywKICAgICAgICAndG9tYXRvJyA9PiAnMjU1LDk5LDcxJywKICAgICAgICAndHVycXVvaXNlJyA9PiAnNjQsMjI0LDIwOCcsCiAgICAgICAgJ3Zpb2xldCcgPT4gJzIzOCwxMzAsMjM4JywKICAgICAgICAnd2hlYXQnID0+ICcyNDUsMjIyLDE3OScsCiAgICAgICAgJ3doaXRlJyA9PiAnMjU1LDI1NSwyNTUnLAogICAgICAgICd3aGl0ZXNtb2tlJyA9PiAnMjQ1LDI0NSwyNDUnLAogICAgICAgICd5ZWxsb3cnID0+ICcyNTUsMjU1LDAnLAogICAgICAgICd5ZWxsb3dncmVlbicgPT4gJzE1NCwyMDUsNTAnLAogICAgICAgICdyZWJlY2NhcHVycGxlJyA9PiAnMTAyLDUxLDE1MycsCiAgICAgICAgJ3RyYW5zcGFyZW50JyA9PiAnMCwwLDAsMCcsCiAgICBdOwoKICAgIC8qKgogICAgICogQ29udmVydCBuYW1lZCBjb2xvciBpbiBhIFtyLGcsYlssYV1dIGFycmF5CiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkY29sb3JOYW1lCiAgICAgKgogICAgICogQHJldHVybiBpbnRbXXxudWxsCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY29sb3JOYW1lVG9SR0JhKCRjb2xvck5hbWUpCiAgICB7CiAgICAgICAgaWYgKFxpc19zdHJpbmcoJGNvbG9yTmFtZSkgJiYgaXNzZXQoc3RhdGljOjokY3NzQ29sb3JzWyRjb2xvck5hbWVdKSkgewogICAgICAgICAgICAkcmdiYSA9IGV4cGxvZGUoJywnLCBzdGF0aWM6OiRjc3NDb2xvcnNbJGNvbG9yTmFtZV0pOwoKICAgICAgICAgICAgLy8gb25seSBjYXNlIHdpdGggb3BhY2l0eSBpcyB0cmFuc3BhcmVudCwgd2l0aCBvcGFjaXR5PTAsIHNvIHdlIGNhbiBpbnR2YWwgb24gb3BhY2l0eSBhbHNvCiAgICAgICAgICAgICRyZ2JhID0gYXJyYXlfbWFwKCdpbnR2YWwnLCAkcmdiYSk7CgogICAgICAgICAgICByZXR1cm4gJHJnYmE7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KCiAgICAvKioKICAgICAqIFJldmVyc2UgY29udmVyc2lvbiA6IGZyb20gUkdCQSB0byBhIGNvbG9yIG5hbWUgaWYgcG9zc2libGUKICAgICAqCiAgICAgKiBAcGFyYW0gaW50ICAgICAgICRyCiAgICAgKiBAcGFyYW0gaW50ICAgICAgICRnCiAgICAgKiBAcGFyYW0gaW50ICAgICAgICRiCiAgICAgKiBAcGFyYW0gaW50fGZsb2F0ICRhCiAgICAgKgogICAgICogQHJldHVybiBzdHJpbmd8bnVsbAogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIFJHQmFUb0NvbG9yTmFtZSgkciwgJGcsICRiLCAkYSA9IDEpCiAgICB7CiAgICAgICAgc3RhdGljICRyZXZlcnNlQ29sb3JUYWJsZSA9IG51bGw7CgogICAgICAgIGlmICghIGlzX251bWVyaWMoJHIpIHx8ICEgaXNfbnVtZXJpYygkZykgfHwgISBpc19udW1lcmljKCRiKSB8fCAhIGlzX251bWVyaWMoJGEpKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KCiAgICAgICAgaWYgKCRhIDwgMSkgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CgogICAgICAgIGlmIChcaXNfbnVsbCgkcmV2ZXJzZUNvbG9yVGFibGUpKSB7CiAgICAgICAgICAgICRyZXZlcnNlQ29sb3JUYWJsZSA9IFtdOwoKICAgICAgICAgICAgZm9yZWFjaCAoc3RhdGljOjokY3NzQ29sb3JzIGFzICRuYW1lID0+ICRyZ2Jfc3RyKSB7CiAgICAgICAgICAgICAgICAkcmdiX3N0ciA9IGV4cGxvZGUoJywnLCAkcmdiX3N0cik7CgogICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgIFxjb3VudCgkcmdiX3N0cikgPT0gMyAmJgogICAgICAgICAgICAgICAgICAgICEgaXNzZXQoJHJldmVyc2VDb2xvclRhYmxlW1xpbnR2YWwoJHJnYl9zdHJbMF0pXVtcaW50dmFsKCRyZ2Jfc3RyWzFdKV1bXGludHZhbCgkcmdiX3N0clsyXSldKQogICAgICAgICAgICAgICAgKSB7CiAgICAgICAgICAgICAgICAgICAgJHJldmVyc2VDb2xvclRhYmxlW1xpbnR2YWwoJHJnYl9zdHJbMF0pXVtcaW50dmFsKCRyZ2Jfc3RyWzFdKV1bXGludHZhbCgkcmdiX3N0clsyXSldID0gJG5hbWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmIChpc3NldCgkcmV2ZXJzZUNvbG9yVGFibGVbXGludHZhbCgkcildW1xpbnR2YWwoJGcpXVtcaW50dmFsKCRiKV0pKSB7CiAgICAgICAgICAgIHJldHVybiAkcmV2ZXJzZUNvbG9yVGFibGVbXGludHZhbCgkcildW1xpbnR2YWwoJGcpXVtcaW50dmFsKCRiKV07CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/extra/scssphp/src/CompilationResult.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwOwoKY2xhc3MgQ29tcGlsYXRpb25SZXN1bHQKewogICAgLyoqCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwcml2YXRlICRjc3M7CgogICAgLyoqCiAgICAgKiBAdmFyIHN0cmluZ3xudWxsCiAgICAgKi8KICAgIHByaXZhdGUgJHNvdXJjZU1hcDsKCiAgICAvKioKICAgICAqIEB2YXIgc3RyaW5nW10KICAgICAqLwogICAgcHJpdmF0ZSAkaW5jbHVkZWRGaWxlczsKCiAgICAvKioKICAgICAqIEBwYXJhbSBzdHJpbmcgJGNzcwogICAgICogQHBhcmFtIHN0cmluZ3xudWxsICRzb3VyY2VNYXAKICAgICAqIEBwYXJhbSBzdHJpbmdbXSAkaW5jbHVkZWRGaWxlcwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGNzcywgJHNvdXJjZU1hcCwgYXJyYXkgJGluY2x1ZGVkRmlsZXMpCiAgICB7CiAgICAgICAgJHRoaXMtPmNzcyA9ICRjc3M7CiAgICAgICAgJHRoaXMtPnNvdXJjZU1hcCA9ICRzb3VyY2VNYXA7CiAgICAgICAgJHRoaXMtPmluY2x1ZGVkRmlsZXMgPSAkaW5jbHVkZWRGaWxlczsKICAgIH0KCiAgICAvKioKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRDc3MoKQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+Y3NzOwogICAgfQoKICAgIC8qKgogICAgICogQHJldHVybiBzdHJpbmdbXQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0SW5jbHVkZWRGaWxlcygpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5pbmNsdWRlZEZpbGVzOwogICAgfQoKICAgIC8qKgogICAgICogVGhlIHNvdXJjZU1hcCBjb250ZW50LCBpZiBpdCB3YXMgZ2VuZXJhdGVkCiAgICAgKgogICAgICogQHJldHVybiBudWxsfHN0cmluZwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0U291cmNlTWFwKCkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnNvdXJjZU1hcDsKICAgIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/extra/scssphp/src/Compiler.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwOwoKdXNlIFNjc3NQaHBcU2Nzc1BocFxCYXNlXFJhbmdlOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEJsb2NrXEF0Um9vdEJsb2NrOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEJsb2NrXENhbGxhYmxlQmxvY2s7CnVzZSBTY3NzUGhwXFNjc3NQaHBcQmxvY2tcRGlyZWN0aXZlQmxvY2s7CnVzZSBTY3NzUGhwXFNjc3NQaHBcQmxvY2tcRWFjaEJsb2NrOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEJsb2NrXEVsc2VCbG9jazsKdXNlIFNjc3NQaHBcU2Nzc1BocFxCbG9ja1xFbHNlaWZCbG9jazsKdXNlIFNjc3NQaHBcU2Nzc1BocFxCbG9ja1xGb3JCbG9jazsKdXNlIFNjc3NQaHBcU2Nzc1BocFxCbG9ja1xJZkJsb2NrOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEJsb2NrXE1lZGlhQmxvY2s7CnVzZSBTY3NzUGhwXFNjc3NQaHBcQmxvY2tcTmVzdGVkUHJvcGVydHlCbG9jazsKdXNlIFNjc3NQaHBcU2Nzc1BocFxCbG9ja1xXaGlsZUJsb2NrOwp1c2UgU2Nzc1BocFxTY3NzUGhwXENvbXBpbGVyXENhY2hlZFJlc3VsdDsKdXNlIFNjc3NQaHBcU2Nzc1BocFxDb21waWxlclxFbnZpcm9ubWVudDsKdXNlIFNjc3NQaHBcU2Nzc1BocFxFeGNlcHRpb25cQ29tcGlsZXJFeGNlcHRpb247CnVzZSBTY3NzUGhwXFNjc3NQaHBcRXhjZXB0aW9uXFBhcnNlckV4Y2VwdGlvbjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxFeGNlcHRpb25cU2Fzc0V4Y2VwdGlvbjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxFeGNlcHRpb25cU2Fzc1NjcmlwdEV4Y2VwdGlvbjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxGb3JtYXR0ZXJcQ29tcHJlc3NlZDsKdXNlIFNjc3NQaHBcU2Nzc1BocFxGb3JtYXR0ZXJcRXhwYW5kZWQ7CnVzZSBTY3NzUGhwXFNjc3NQaHBcRm9ybWF0dGVyXE91dHB1dEJsb2NrOwp1c2UgU2Nzc1BocFxTY3NzUGhwXExvZ2dlclxMb2dnZXJJbnRlcmZhY2U7CnVzZSBTY3NzUGhwXFNjc3NQaHBcTG9nZ2VyXFN0cmVhbUxvZ2dlcjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxOb2RlXE51bWJlcjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxTb3VyY2VNYXBcU291cmNlTWFwR2VuZXJhdG9yOwp1c2UgU2Nzc1BocFxTY3NzUGhwXFV0aWxcUGF0aDsKCi8qKgogKiBUaGUgc2NzcyBjb21waWxlciBhbmQgcGFyc2VyLgogKgogKiBDb252ZXJ0aW5nIFNDU1MgdG8gQ1NTIGlzIGEgdGhyZWUgc3RhZ2UgcHJvY2Vzcy4gVGhlIGluY29taW5nIGZpbGUgaXMgcGFyc2VkCiAqIGJ5IGBQYXJzZXJgIGludG8gYSBzeW50YXggdHJlZSwgdGhlbiBpdCBpcyBjb21waWxlZCBpbnRvIGFub3RoZXIgdHJlZQogKiByZXByZXNlbnRpbmcgdGhlIENTUyBzdHJ1Y3R1cmUgYnkgYENvbXBpbGVyYC4gVGhlIENTUyB0cmVlIGlzIGZlZCBpbnRvIGEKICogZm9ybWF0dGVyLCBsaWtlIGBGb3JtYXR0ZXJgIHdoaWNoIHRoZW4gb3V0cHV0cyBDU1MgYXMgYSBzdHJpbmcuCiAqCiAqIER1cmluZyB0aGUgZmlyc3QgY29tcGlsZSwgYWxsIHZhbHVlcyBhcmUgKnJlZHVjZWQqLCB3aGljaCBtZWFucyB0aGF0IHRoZWlyCiAqIHR5cGVzIGFyZSBicm91Z2h0IHRvIHRoZSBsb3dlc3QgZm9ybSBiZWZvcmUgYmVpbmcgZHVtcCBhcyBzdHJpbmdzLiBUaGlzCiAqIGhhbmRsZXMgbWF0aCBlcXVhdGlvbnMsIHZhcmlhYmxlIGRlcmVmZXJlbmNlcywgYW5kIHRoZSBsaWtlLgogKgogKiBUaGUgYGNvbXBpbGVgIGZ1bmN0aW9uIG9mIGBDb21waWxlcmAgaXMgdGhlIGVudHJ5IHBvaW50LgogKgogKiBJbiBzdW1tYXJ5OgogKgogKiBUaGUgYENvbXBpbGVyYCBjbGFzcyBjcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBwYXJzZXIsIGZlZWRzIGl0IFNDU1MgY29kZSwKICogdGhlbiB0cmFuc2Zvcm1zIHRoZSByZXN1bHRpbmcgdHJlZSB0byBhIENTUyB0cmVlLiBUaGlzIGNsYXNzIGFsc28gaG9sZHMgdGhlCiAqIGV2YWx1YXRpb24gY29udGV4dCwgc3VjaCBhcyBhbGwgYXZhaWxhYmxlIG1peGlucyBhbmQgdmFyaWFibGVzIGF0IGFueSBnaXZlbgogKiB0aW1lLgogKgogKiBUaGUgYFBhcnNlcmAgY2xhc3MgaXMgb25seSBjb25jZXJuZWQgd2l0aCBwYXJzaW5nIGl0cyBpbnB1dC4KICoKICogVGhlIGBGb3JtYXR0ZXJgIHRha2VzIGEgQ1NTIHRyZWUsIGFuZCBkdW1wcyBpdCB0byBhIGZvcm1hdHRlZCBzdHJpbmcsCiAqIGhhbmRsaW5nIHRoaW5ncyBsaWtlIGluZGVudGF0aW9uLgogKi8KCi8qKgogKiBTQ1NTIGNvbXBpbGVyCiAqCiAqIEBhdXRob3IgTGVhZiBDb3Jjb3JhbiA8bGVhZm90QGdtYWlsLmNvbT4KICoKICogQGZpbmFsIEV4dGVuZGluZyB0aGUgQ29tcGlsZXIgaXMgZGVwcmVjYXRlZAogKi8KY2xhc3MgQ29tcGlsZXIKewogICAgLyoqCiAgICAgKiBAZGVwcmVjYXRlZAogICAgICovCiAgICBjb25zdCBMSU5FX0NPTU1FTlRTID0gMTsKICAgIC8qKgogICAgICogQGRlcHJlY2F0ZWQKICAgICAqLwogICAgY29uc3QgREVCVUdfSU5GTyAgICA9IDI7CgogICAgLyoqCiAgICAgKiBAZGVwcmVjYXRlZAogICAgICovCiAgICBjb25zdCBXSVRIX1JVTEUgICAgID0gMTsKICAgIC8qKgogICAgICogQGRlcHJlY2F0ZWQKICAgICAqLwogICAgY29uc3QgV0lUSF9NRURJQSAgICA9IDI7CiAgICAvKioKICAgICAqIEBkZXByZWNhdGVkCiAgICAgKi8KICAgIGNvbnN0IFdJVEhfU1VQUE9SVFMgPSA0OwogICAgLyoqCiAgICAgKiBAZGVwcmVjYXRlZAogICAgICovCiAgICBjb25zdCBXSVRIX0FMTCAgICAgID0gNzsKCiAgICBjb25zdCBTT1VSQ0VfTUFQX05PTkUgICA9IDA7CiAgICBjb25zdCBTT1VSQ0VfTUFQX0lOTElORSA9IDE7CiAgICBjb25zdCBTT1VSQ0VfTUFQX0ZJTEUgICA9IDI7CgogICAgLyoqCiAgICAgKiBAdmFyIGFycmF5PHN0cmluZywgc3RyaW5nPgogICAgICovCiAgICBwcm90ZWN0ZWQgc3RhdGljICRvcGVyYXRvck5hbWVzID0gWwogICAgICAgICcrJyAgID0+ICdhZGQnLAogICAgICAgICctJyAgID0+ICdzdWInLAogICAgICAgICcqJyAgID0+ICdtdWwnLAogICAgICAgICcvJyAgID0+ICdkaXYnLAogICAgICAgICclJyAgID0+ICdtb2QnLAoKICAgICAgICAnPT0nICA9PiAnZXEnLAogICAgICAgICchPScgID0+ICduZXEnLAogICAgICAgICc8JyAgID0+ICdsdCcsCiAgICAgICAgJz4nICAgPT4gJ2d0JywKCiAgICAgICAgJzw9JyAgPT4gJ2x0ZScsCiAgICAgICAgJz49JyAgPT4gJ2d0ZScsCiAgICBdOwoKICAgIC8qKgogICAgICogQHZhciBhcnJheTxzdHJpbmcsIHN0cmluZz4KICAgICAqLwogICAgcHJvdGVjdGVkIHN0YXRpYyAkbmFtZXNwYWNlcyA9IFsKICAgICAgICAnc3BlY2lhbCcgID0+ICclJywKICAgICAgICAnbWl4aW4nICAgID0+ICdAJywKICAgICAgICAnZnVuY3Rpb24nID0+ICdeJywKICAgIF07CgogICAgcHVibGljIHN0YXRpYyAkdHJ1ZSAgICAgICAgID0gW1R5cGU6OlRfS0VZV09SRCwgJ3RydWUnXTsKICAgIHB1YmxpYyBzdGF0aWMgJGZhbHNlICAgICAgICA9IFtUeXBlOjpUX0tFWVdPUkQsICdmYWxzZSddOwogICAgLyoqIEBkZXByZWNhdGVkICovCiAgICBwdWJsaWMgc3RhdGljICROYU4gICAgICAgICAgPSBbVHlwZTo6VF9LRVlXT1JELCAnTmFOJ107CiAgICAvKiogQGRlcHJlY2F0ZWQgKi8KICAgIHB1YmxpYyBzdGF0aWMgJEluZmluaXR5ICAgICA9IFtUeXBlOjpUX0tFWVdPUkQsICdJbmZpbml0eSddOwogICAgcHVibGljIHN0YXRpYyAkbnVsbCAgICAgICAgID0gW1R5cGU6OlRfTlVMTF07CiAgICAvKioKICAgICAqIEBpbnRlcm5hbAogICAgICovCiAgICBwdWJsaWMgc3RhdGljICRudWxsU3RyaW5nICAgPSBbVHlwZTo6VF9TVFJJTkcsICcnLCBbXV07CiAgICAvKioKICAgICAqIEBpbnRlcm5hbAogICAgICovCiAgICBwdWJsaWMgc3RhdGljICRkZWZhdWx0VmFsdWUgPSBbVHlwZTo6VF9LRVlXT1JELCAnJ107CiAgICAvKioKICAgICAqIEBpbnRlcm5hbAogICAgICovCiAgICBwdWJsaWMgc3RhdGljICRzZWxmU2VsZWN0b3IgPSBbVHlwZTo6VF9TRUxGXTsKICAgIHB1YmxpYyBzdGF0aWMgJGVtcHR5TGlzdCAgICA9IFtUeXBlOjpUX0xJU1QsICcnLCBbXV07CiAgICBwdWJsaWMgc3RhdGljICRlbXB0eU1hcCAgICAgPSBbVHlwZTo6VF9NQVAsIFtdLCBbXV07CiAgICBwdWJsaWMgc3RhdGljICRlbXB0eVN0cmluZyAgPSBbVHlwZTo6VF9TVFJJTkcsICciJywgW11dOwogICAgLyoqCiAgICAgKiBAaW50ZXJuYWwKICAgICAqLwogICAgcHVibGljIHN0YXRpYyAkd2l0aCAgICAgICAgID0gW1R5cGU6OlRfS0VZV09SRCwgJ3dpdGgnXTsKICAgIC8qKgogICAgICogQGludGVybmFsCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgJHdpdGhvdXQgICAgICA9IFtUeXBlOjpUX0tFWVdPUkQsICd3aXRob3V0J107CiAgICBwcml2YXRlIHN0YXRpYyAkZW1wdHlBcmd1bWVudExpc3QgPSBbVHlwZTo6VF9MSVNULCAnJywgW10sIFtdXTsKCiAgICAvKioKICAgICAqIEB2YXIgYXJyYXk8aW50LCBzdHJpbmd8Y2FsbGFibGU+CiAgICAgKi8KICAgIHByb3RlY3RlZCAkaW1wb3J0UGF0aHMgPSBbXTsKICAgIC8qKgogICAgICogQHZhciBhcnJheTxzdHJpbmcsIEJsb2NrPgogICAgICovCiAgICBwcm90ZWN0ZWQgJGltcG9ydENhY2hlID0gW107CgogICAgLyoqCiAgICAgKiBAdmFyIHN0cmluZ1tdCiAgICAgKi8KICAgIHByb3RlY3RlZCAkaW1wb3J0ZWRGaWxlcyA9IFtdOwoKICAgIC8qKgogICAgICogQHZhciBhcnJheQogICAgICogQHBocHN0YW4tdmFyIGFycmF5PHN0cmluZywgYXJyYXl7MDogY2FsbGFibGUsIDE6IHN0cmluZ1tdfG51bGx9PgogICAgICovCiAgICBwcm90ZWN0ZWQgJHVzZXJGdW5jdGlvbnMgPSBbXTsKICAgIC8qKgogICAgICogQHZhciBhcnJheTxzdHJpbmcsIG1peGVkPgogICAgICovCiAgICBwcm90ZWN0ZWQgJHJlZ2lzdGVyZWRWYXJzID0gW107CiAgICAvKioKICAgICAqIEB2YXIgYXJyYXk8c3RyaW5nLCBib29sPgogICAgICovCiAgICBwcm90ZWN0ZWQgJHJlZ2lzdGVyZWRGZWF0dXJlcyA9IFsKICAgICAgICAnZXh0ZW5kLXNlbGVjdG9yLXBzZXVkb2NsYXNzJyA9PiBmYWxzZSwKICAgICAgICAnYXQtZXJyb3InICAgICAgICAgICAgICAgICAgICA9PiB0cnVlLAogICAgICAgICd1bml0cy1sZXZlbC0zJyAgICAgICAgICAgICAgID0+IHRydWUsCiAgICAgICAgJ2dsb2JhbC12YXJpYWJsZS1zaGFkb3dpbmcnICAgPT4gZmFsc2UsCiAgICBdOwoKICAgIC8qKgogICAgICogQHZhciBzdHJpbmd8bnVsbAogICAgICovCiAgICBwcm90ZWN0ZWQgJGVuY29kaW5nID0gbnVsbDsKICAgIC8qKgogICAgICogQHZhciBudWxsCiAgICAgKiBAZGVwcmVjYXRlZAogICAgICovCiAgICBwcm90ZWN0ZWQgJGxpbmVOdW1iZXJTdHlsZSA9IG51bGw7CgogICAgLyoqCiAgICAgKiBAdmFyIGludHxTb3VyY2VNYXBHZW5lcmF0b3IKICAgICAqIEBwaHBzdGFuLXZhciBzZWxmOjpTT1VSQ0VfTUFQXyp8U291cmNlTWFwR2VuZXJhdG9yCiAgICAgKi8KICAgIHByb3RlY3RlZCAkc291cmNlTWFwID0gc2VsZjo6U09VUkNFX01BUF9OT05FOwoKICAgIC8qKgogICAgICogQHZhciBhcnJheQogICAgICogQHBocHN0YW4tdmFyIGFycmF5e3NvdXJjZVJvb3Q/OiBzdHJpbmcsIHNvdXJjZU1hcEZpbGVuYW1lPzogc3RyaW5nfG51bGwsIHNvdXJjZU1hcFVSTD86IHN0cmluZ3xudWxsLCBzb3VyY2VNYXBXcml0ZVRvPzogc3RyaW5nfG51bGwsIG91dHB1dFNvdXJjZUZpbGVzPzogYm9vbCwgc291cmNlTWFwUm9vdHBhdGg/OiBzdHJpbmcsIHNvdXJjZU1hcEJhc2VwYXRoPzogc3RyaW5nfQogICAgICovCiAgICBwcm90ZWN0ZWQgJHNvdXJjZU1hcE9wdGlvbnMgPSBbXTsKCiAgICAvKioKICAgICAqIEB2YXIgYm9vbAogICAgICovCiAgICBwcml2YXRlICRjaGFyc2V0ID0gdHJ1ZTsKCiAgICAvKioKICAgICAqIEB2YXIgRm9ybWF0dGVyCiAgICAgKi8KICAgIHByb3RlY3RlZCAkZm9ybWF0dGVyOwoKICAgIC8qKgogICAgICogQHZhciBzdHJpbmcKICAgICAqIEBwaHBzdGFuLXZhciBjbGFzcy1zdHJpbmc8Rm9ybWF0dGVyPgogICAgICovCiAgICBwcml2YXRlICRjb25maWd1cmVkRm9ybWF0dGVyID0gRXhwYW5kZWQ6OmNsYXNzOwoKICAgIC8qKgogICAgICogQHZhciBFbnZpcm9ubWVudAogICAgICovCiAgICBwcm90ZWN0ZWQgJHJvb3RFbnY7CiAgICAvKioKICAgICAqIEB2YXIgT3V0cHV0QmxvY2t8bnVsbAogICAgICovCiAgICBwcm90ZWN0ZWQgJHJvb3RCbG9jazsKCiAgICAvKioKICAgICAqIEB2YXIgXFNjc3NQaHBcU2Nzc1BocFxDb21waWxlclxFbnZpcm9ubWVudAogICAgICovCiAgICBwcm90ZWN0ZWQgJGVudjsKICAgIC8qKgogICAgICogQHZhciBPdXRwdXRCbG9ja3xudWxsCiAgICAgKi8KICAgIHByb3RlY3RlZCAkc2NvcGU7CiAgICAvKioKICAgICAqIEB2YXIgRW52aXJvbm1lbnR8bnVsbAogICAgICovCiAgICBwcm90ZWN0ZWQgJHN0b3JlRW52OwogICAgLyoqCiAgICAgKiBAdmFyIGJvb2x8bnVsbAogICAgICoKICAgICAqIEBkZXByZWNhdGVkCiAgICAgKi8KICAgIHByb3RlY3RlZCAkY2hhcnNldFNlZW47CiAgICAvKioKICAgICAqIEB2YXIgYXJyYXk8aW50LCBzdHJpbmd8bnVsbD4KICAgICAqLwogICAgcHJvdGVjdGVkICRzb3VyY2VOYW1lczsKCiAgICAvKioKICAgICAqIEB2YXIgQ2FjaGV8bnVsbAogICAgICovCiAgICBwcm90ZWN0ZWQgJGNhY2hlOwoKICAgIC8qKgogICAgICogQHZhciBib29sCiAgICAgKi8KICAgIHByb3RlY3RlZCAkY2FjaGVDaGVja0ltcG9ydFJlc29sdXRpb25zID0gZmFsc2U7CgogICAgLyoqCiAgICAgKiBAdmFyIGludAogICAgICovCiAgICBwcm90ZWN0ZWQgJGluZGVudExldmVsOwogICAgLyoqCiAgICAgKiBAdmFyIGFycmF5W10KICAgICAqLwogICAgcHJvdGVjdGVkICRleHRlbmRzOwogICAgLyoqCiAgICAgKiBAdmFyIGFycmF5PHN0cmluZywgaW50W10+CiAgICAgKi8KICAgIHByb3RlY3RlZCAkZXh0ZW5kc01hcDsKCiAgICAvKioKICAgICAqIEB2YXIgYXJyYXk8c3RyaW5nLCBpbnQ+CiAgICAgKi8KICAgIHByb3RlY3RlZCAkcGFyc2VkRmlsZXMgPSBbXTsKCiAgICAvKioKICAgICAqIEB2YXIgUGFyc2VyfG51bGwKICAgICAqLwogICAgcHJvdGVjdGVkICRwYXJzZXI7CiAgICAvKioKICAgICAqIEB2YXIgaW50fG51bGwKICAgICAqLwogICAgcHJvdGVjdGVkICRzb3VyY2VJbmRleDsKICAgIC8qKgogICAgICogQHZhciBpbnR8bnVsbAogICAgICovCiAgICBwcm90ZWN0ZWQgJHNvdXJjZUxpbmU7CiAgICAvKioKICAgICAqIEB2YXIgaW50fG51bGwKICAgICAqLwogICAgcHJvdGVjdGVkICRzb3VyY2VDb2x1bW47CiAgICAvKioKICAgICAqIEB2YXIgYm9vbHxudWxsCiAgICAgKi8KICAgIHByb3RlY3RlZCAkc2hvdWxkRXZhbHVhdGU7CiAgICAvKioKICAgICAqIEB2YXIgbnVsbAogICAgICogQGRlcHJlY2F0ZWQKICAgICAqLwogICAgcHJvdGVjdGVkICRpZ25vcmVFcnJvcnM7CiAgICAvKioKICAgICAqIEB2YXIgYm9vbAogICAgICovCiAgICBwcm90ZWN0ZWQgJGlnbm9yZUNhbGxTdGFja01lc3NhZ2UgPSBmYWxzZTsKCiAgICAvKioKICAgICAqIEB2YXIgYXJyYXlbXQogICAgICovCiAgICBwcm90ZWN0ZWQgJGNhbGxTdGFjayA9IFtdOwoKICAgIC8qKgogICAgICogQHZhciBhcnJheQogICAgICogQHBocHN0YW4tdmFyIGxpc3Q8YXJyYXl7Y3VycmVudERpcjogc3RyaW5nfG51bGwsIHBhdGg6IHN0cmluZywgZmlsZVBhdGg6IHN0cmluZ30+CiAgICAgKi8KICAgIHByaXZhdGUgJHJlc29sdmVkSW1wb3J0cyA9IFtdOwoKICAgIC8qKgogICAgICogVGhlIGRpcmVjdG9yeSBvZiB0aGUgY3VycmVudGx5IHByb2Nlc3NlZCBmaWxlCiAgICAgKgogICAgICogQHZhciBzdHJpbmd8bnVsbAogICAgICovCiAgICBwcml2YXRlICRjdXJyZW50RGlyZWN0b3J5OwoKICAgIC8qKgogICAgICogVGhlIGRpcmVjdG9yeSBvZiB0aGUgaW5wdXQgZmlsZQogICAgICoKICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHByaXZhdGUgJHJvb3REaXJlY3Rvcnk7CgogICAgLyoqCiAgICAgKiBAdmFyIGJvb2wKICAgICAqLwogICAgcHJpdmF0ZSAkbGVnYWN5Q3dkSW1wb3J0UGF0aCA9IHRydWU7CgogICAgLyoqCiAgICAgKiBAdmFyIExvZ2dlckludGVyZmFjZQogICAgICovCiAgICBwcml2YXRlICRsb2dnZXI7CgogICAgLyoqCiAgICAgKiBAdmFyIGFycmF5PHN0cmluZywgYm9vbD4KICAgICAqLwogICAgcHJpdmF0ZSAkd2FybmVkQ2hpbGRGdW5jdGlvbnMgPSBbXTsKCiAgICAvKioKICAgICAqIENvbnN0cnVjdG9yCiAgICAgKgogICAgICogQHBhcmFtIGFycmF5fG51bGwgJGNhY2hlT3B0aW9ucwogICAgICogQHBocHN0YW4tcGFyYW0gYXJyYXl7Y2FjaGVEaXI/OiBzdHJpbmcsIHByZWZpeD86IHN0cmluZywgZm9yY2VSZWZyZXNoPzogc3RyaW5nLCBjaGVja0ltcG9ydFJlc29sdXRpb25zPzogYm9vbH18bnVsbCAkY2FjaGVPcHRpb25zCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkY2FjaGVPcHRpb25zID0gbnVsbCkKICAgIHsKICAgICAgICAkdGhpcy0+c291cmNlTmFtZXMgPSBbXTsKCiAgICAgICAgaWYgKCRjYWNoZU9wdGlvbnMpIHsKICAgICAgICAgICAgJHRoaXMtPmNhY2hlID0gbmV3IENhY2hlKCRjYWNoZU9wdGlvbnMpOwogICAgICAgICAgICBpZiAoIWVtcHR5KCRjYWNoZU9wdGlvbnNbJ2NoZWNrSW1wb3J0UmVzb2x1dGlvbnMnXSkpIHsKICAgICAgICAgICAgICAgICR0aGlzLT5jYWNoZUNoZWNrSW1wb3J0UmVzb2x1dGlvbnMgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkdGhpcy0+bG9nZ2VyID0gbmV3IFN0cmVhbUxvZ2dlcihmb3BlbigncGhwOi8vc3RkZXJyJywgJ3cnKSwgdHJ1ZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBHZXQgY29tcGlsZXIgb3B0aW9ucwogICAgICoKICAgICAqIEByZXR1cm4gYXJyYXk8c3RyaW5nLCBtaXhlZD4KICAgICAqCiAgICAgKiBAaW50ZXJuYWwKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldENvbXBpbGVPcHRpb25zKCkKICAgIHsKICAgICAgICAkb3B0aW9ucyA9IFsKICAgICAgICAgICAgJ2ltcG9ydFBhdGhzJyAgICAgICAgPT4gJHRoaXMtPmltcG9ydFBhdGhzLAogICAgICAgICAgICAncmVnaXN0ZXJlZFZhcnMnICAgICA9PiAkdGhpcy0+cmVnaXN0ZXJlZFZhcnMsCiAgICAgICAgICAgICdyZWdpc3RlcmVkRmVhdHVyZXMnID0+ICR0aGlzLT5yZWdpc3RlcmVkRmVhdHVyZXMsCiAgICAgICAgICAgICdlbmNvZGluZycgICAgICAgICAgID0+ICR0aGlzLT5lbmNvZGluZywKICAgICAgICAgICAgJ3NvdXJjZU1hcCcgICAgICAgICAgPT4gc2VyaWFsaXplKCR0aGlzLT5zb3VyY2VNYXApLAogICAgICAgICAgICAnc291cmNlTWFwT3B0aW9ucycgICA9PiAkdGhpcy0+c291cmNlTWFwT3B0aW9ucywKICAgICAgICAgICAgJ2Zvcm1hdHRlcicgICAgICAgICAgPT4gJHRoaXMtPmNvbmZpZ3VyZWRGb3JtYXR0ZXIsCiAgICAgICAgICAgICdsZWdhY3lJbXBvcnRQYXRoJyAgID0+ICR0aGlzLT5sZWdhY3lDd2RJbXBvcnRQYXRoLAogICAgICAgIF07CgogICAgICAgIHJldHVybiAkb3B0aW9uczsKICAgIH0KCiAgICAvKioKICAgICAqIFNldHMgYW4gYWx0ZXJuYXRpdmUgbG9nZ2VyLgogICAgICoKICAgICAqIENoYW5naW5nIHRoZSBsb2dnZXIgaW4gdGhlIG1pZGRsZSBvZiB0aGUgY29tcGlsYXRpb24gaXMgbm90CiAgICAgKiBzdXBwb3J0ZWQgYW5kIHdpbGwgcmVzdWx0IGluIGFuIHVuZGVmaW5lZCBiZWhhdmlvci4KICAgICAqCiAgICAgKiBAcGFyYW0gTG9nZ2VySW50ZXJmYWNlICRsb2dnZXIKICAgICAqCiAgICAgKiBAcmV0dXJuIHZvaWQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHNldExvZ2dlcihMb2dnZXJJbnRlcmZhY2UgJGxvZ2dlcikKICAgIHsKICAgICAgICAkdGhpcy0+bG9nZ2VyID0gJGxvZ2dlcjsKICAgIH0KCiAgICAvKioKICAgICAqIFNldCBhbiBhbHRlcm5hdGl2ZSBlcnJvciBvdXRwdXQgc3RyZWFtLCBmb3IgdGVzdGluZyBwdXJwb3NlIG9ubHkKICAgICAqCiAgICAgKiBAcGFyYW0gcmVzb3VyY2UgJGhhbmRsZQogICAgICoKICAgICAqIEByZXR1cm4gdm9pZAogICAgICoKICAgICAqIEBkZXByZWNhdGVkIFVzZSB7QHNlZSBzZXRMb2dnZXJ9IGluc3RlYWQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHNldEVycm9yT3VwdXQoJGhhbmRsZSkKICAgIHsKICAgICAgICBAdHJpZ2dlcl9lcnJvcignVGhlIG1ldGhvZCAic2V0RXJyb3JPdXB1dCIgaXMgZGVwcmVjYXRlZC4gVXNlICJzZXRMb2dnZXIiIGluc3RlYWQuJywgRV9VU0VSX0RFUFJFQ0FURUQpOwoKICAgICAgICAkdGhpcy0+bG9nZ2VyID0gbmV3IFN0cmVhbUxvZ2dlcigkaGFuZGxlKTsKICAgIH0KCiAgICAvKioKICAgICAqIENvbXBpbGUgc2NzcwogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgICAgICAkY29kZQogICAgICogQHBhcmFtIHN0cmluZ3xudWxsICRwYXRoCiAgICAgKgogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqCiAgICAgKiBAdGhyb3dzIFNhc3NFeGNlcHRpb24gd2hlbiB0aGUgc291cmNlIGZhaWxzIHRvIGNvbXBpbGUKICAgICAqCiAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BzZWUgY29tcGlsZVN0cmluZ30gaW5zdGVhZC4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGNvbXBpbGUoJGNvZGUsICRwYXRoID0gbnVsbCkKICAgIHsKICAgICAgICBAdHJpZ2dlcl9lcnJvcihzcHJpbnRmKCdUaGUgIiVzIiBtZXRob2QgaXMgZGVwcmVjYXRlZC4gVXNlICJjb21waWxlU3RyaW5nIiBpbnN0ZWFkLicsIF9fTUVUSE9EX18pLCBFX1VTRVJfREVQUkVDQVRFRCk7CgogICAgICAgICRyZXN1bHQgPSAkdGhpcy0+Y29tcGlsZVN0cmluZygkY29kZSwgJHBhdGgpOwoKICAgICAgICAkc291cmNlTWFwID0gJHJlc3VsdC0+Z2V0U291cmNlTWFwKCk7CgogICAgICAgIGlmICgkc291cmNlTWFwICE9PSBudWxsKSB7CiAgICAgICAgICAgIGlmICgkdGhpcy0+c291cmNlTWFwIGluc3RhbmNlb2YgU291cmNlTWFwR2VuZXJhdG9yKSB7CiAgICAgICAgICAgICAgICAkdGhpcy0+c291cmNlTWFwLT5zYXZlTWFwKCRzb3VyY2VNYXApOwogICAgICAgICAgICB9IGVsc2VpZiAoJHRoaXMtPnNvdXJjZU1hcCA9PT0gc2VsZjo6U09VUkNFX01BUF9GSUxFKSB7CiAgICAgICAgICAgICAgICAkc291cmNlTWFwR2VuZXJhdG9yID0gbmV3IFNvdXJjZU1hcEdlbmVyYXRvcigkdGhpcy0+c291cmNlTWFwT3B0aW9ucyk7CiAgICAgICAgICAgICAgICAkc291cmNlTWFwR2VuZXJhdG9yLT5zYXZlTWFwKCRzb3VyY2VNYXApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJHJlc3VsdC0+Z2V0Q3NzKCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDb21waWxlcyB0aGUgcHJvdmlkZWQgc2NzcyBmaWxlIGludG8gQ1NTLgogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgJHBhdGgKICAgICAqCiAgICAgKiBAcmV0dXJuIENvbXBpbGF0aW9uUmVzdWx0CiAgICAgKgogICAgICogQHRocm93cyBTYXNzRXhjZXB0aW9uIHdoZW4gdGhlIHNvdXJjZSBmYWlscyB0byBjb21waWxlCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBjb21waWxlRmlsZSgkcGF0aCkKICAgIHsKICAgICAgICAkc291cmNlID0gZmlsZV9nZXRfY29udGVudHMoJHBhdGgpOwoKICAgICAgICBpZiAoJHNvdXJjZSA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdDb3VsZCBub3QgcmVhZCB0aGUgZmlsZSBjb250ZW50Jyk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJHRoaXMtPmNvbXBpbGVTdHJpbmcoJHNvdXJjZSwgJHBhdGgpOwogICAgfQoKICAgIC8qKgogICAgICogQ29tcGlsZXMgdGhlIHByb3ZpZGVkIHNjc3Mgc291cmNlIGNvZGUgaW50byBDU1MuCiAgICAgKgogICAgICogSWYgcHJvdmlkZWQsIHRoZSBwYXRoIGlzIGNvbnNpZGVyZWQgdG8gYmUgdGhlIHBhdGggZnJvbSB3aGljaCB0aGUgc291cmNlIGNvZGUgY29tZXMKICAgICAqIGZyb20sIHdoaWNoIHdpbGwgYmUgdXNlZCB0byByZXNvbHZlIHJlbGF0aXZlIGltcG9ydHMuCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAgICAgICRzb3VyY2UKICAgICAqIEBwYXJhbSBzdHJpbmd8bnVsbCAkcGF0aCAgIFRoZSBwYXRoIGZvciB0aGUgc291cmNlLCB1c2VkIHRvIHJlc29sdmUgcmVsYXRpdmUgaW1wb3J0cwogICAgICoKICAgICAqIEByZXR1cm4gQ29tcGlsYXRpb25SZXN1bHQKICAgICAqCiAgICAgKiBAdGhyb3dzIFNhc3NFeGNlcHRpb24gd2hlbiB0aGUgc291cmNlIGZhaWxzIHRvIGNvbXBpbGUKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGNvbXBpbGVTdHJpbmcoJHNvdXJjZSwgJHBhdGggPSBudWxsKQogICAgewogICAgICAgIGlmICgkdGhpcy0+Y2FjaGUpIHsKICAgICAgICAgICAgJGNhY2hlS2V5ICAgICAgID0gKCRwYXRoID8gJHBhdGggOiAnKHN0ZGluKScpIC4gJzonIC4gbWQ1KCRzb3VyY2UpOwogICAgICAgICAgICAkY29tcGlsZU9wdGlvbnMgPSAkdGhpcy0+Z2V0Q29tcGlsZU9wdGlvbnMoKTsKICAgICAgICAgICAgJGNhY2hlZFJlc3VsdCA9ICR0aGlzLT5jYWNoZS0+Z2V0Q2FjaGUoJ2NvbXBpbGUnLCAkY2FjaGVLZXksICRjb21waWxlT3B0aW9ucyk7CgogICAgICAgICAgICBpZiAoJGNhY2hlZFJlc3VsdCBpbnN0YW5jZW9mIENhY2hlZFJlc3VsdCAmJiAkdGhpcy0+aXNGcmVzaENhY2hlZFJlc3VsdCgkY2FjaGVkUmVzdWx0KSkgewogICAgICAgICAgICAgICAgcmV0dXJuICRjYWNoZWRSZXN1bHQtPmdldFJlc3VsdCgpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkdGhpcy0+aW5kZW50TGV2ZWwgICAgPSAtMTsKICAgICAgICAkdGhpcy0+ZXh0ZW5kcyAgICAgICAgPSBbXTsKICAgICAgICAkdGhpcy0+ZXh0ZW5kc01hcCAgICAgPSBbXTsKICAgICAgICAkdGhpcy0+c291cmNlSW5kZXggICAgPSBudWxsOwogICAgICAgICR0aGlzLT5zb3VyY2VMaW5lICAgICA9IG51bGw7CiAgICAgICAgJHRoaXMtPnNvdXJjZUNvbHVtbiAgID0gbnVsbDsKICAgICAgICAkdGhpcy0+ZW52ICAgICAgICAgICAgPSBudWxsOwogICAgICAgICR0aGlzLT5zY29wZSAgICAgICAgICA9IG51bGw7CiAgICAgICAgJHRoaXMtPnN0b3JlRW52ICAgICAgID0gbnVsbDsKICAgICAgICAkdGhpcy0+c2hvdWxkRXZhbHVhdGUgPSBudWxsOwogICAgICAgICR0aGlzLT5pZ25vcmVDYWxsU3RhY2tNZXNzYWdlID0gZmFsc2U7CiAgICAgICAgJHRoaXMtPnBhcnNlZEZpbGVzID0gW107CiAgICAgICAgJHRoaXMtPmltcG9ydGVkRmlsZXMgPSBbXTsKICAgICAgICAkdGhpcy0+cmVzb2x2ZWRJbXBvcnRzID0gW107CgogICAgICAgIGlmICghXGlzX251bGwoJHBhdGgpICYmIGlzX2ZpbGUoJHBhdGgpKSB7CiAgICAgICAgICAgICRwYXRoID0gcmVhbHBhdGgoJHBhdGgpID86ICRwYXRoOwogICAgICAgICAgICAkdGhpcy0+Y3VycmVudERpcmVjdG9yeSA9IGRpcm5hbWUoJHBhdGgpOwogICAgICAgICAgICAkdGhpcy0+cm9vdERpcmVjdG9yeSA9ICR0aGlzLT5jdXJyZW50RGlyZWN0b3J5OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICR0aGlzLT5jdXJyZW50RGlyZWN0b3J5ID0gbnVsbDsKICAgICAgICAgICAgJHRoaXMtPnJvb3REaXJlY3RvcnkgPSBnZXRjd2QoKTsKICAgICAgICB9CgogICAgICAgIHRyeSB7CiAgICAgICAgICAgICR0aGlzLT5wYXJzZXIgPSAkdGhpcy0+cGFyc2VyRmFjdG9yeSgkcGF0aCk7CiAgICAgICAgICAgICR0cmVlICAgICAgICAgPSAkdGhpcy0+cGFyc2VyLT5wYXJzZSgkc291cmNlKTsKICAgICAgICAgICAgJHRoaXMtPnBhcnNlciA9IG51bGw7CgogICAgICAgICAgICAkdGhpcy0+Zm9ybWF0dGVyID0gbmV3ICR0aGlzLT5jb25maWd1cmVkRm9ybWF0dGVyKCk7CiAgICAgICAgICAgICR0aGlzLT5yb290QmxvY2sgPSBudWxsOwogICAgICAgICAgICAkdGhpcy0+cm9vdEVudiAgID0gJHRoaXMtPnB1c2hFbnYoJHRyZWUpOwoKICAgICAgICAgICAgJHdhcm5DYWxsYmFjayA9IGZ1bmN0aW9uICgkbWVzc2FnZSwgJGRlcHJlY2F0aW9uKSB7CiAgICAgICAgICAgICAgICAkdGhpcy0+bG9nZ2VyLT53YXJuKCRtZXNzYWdlLCAkZGVwcmVjYXRpb24pOwogICAgICAgICAgICB9OwogICAgICAgICAgICAkcHJldmlvdXNXYXJuQ2FsbGJhY2sgPSBXYXJuOjpzZXRDYWxsYmFjaygkd2FybkNhbGxiYWNrKTsKCiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAkdGhpcy0+aW5qZWN0VmFyaWFibGVzKCR0aGlzLT5yZWdpc3RlcmVkVmFycyk7CiAgICAgICAgICAgICAgICAkdGhpcy0+Y29tcGlsZVJvb3QoJHRyZWUpOwogICAgICAgICAgICAgICAgJHRoaXMtPnBvcEVudigpOwogICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgICAgV2Fybjo6c2V0Q2FsbGJhY2soJHByZXZpb3VzV2FybkNhbGxiYWNrKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHNvdXJjZU1hcEdlbmVyYXRvciA9IG51bGw7CgogICAgICAgICAgICBpZiAoJHRoaXMtPnNvdXJjZU1hcCkgewogICAgICAgICAgICAgICAgaWYgKFxpc19vYmplY3QoJHRoaXMtPnNvdXJjZU1hcCkgJiYgJHRoaXMtPnNvdXJjZU1hcCBpbnN0YW5jZW9mIFNvdXJjZU1hcEdlbmVyYXRvcikgewogICAgICAgICAgICAgICAgICAgICRzb3VyY2VNYXBHZW5lcmF0b3IgPSAkdGhpcy0+c291cmNlTWFwOwogICAgICAgICAgICAgICAgICAgICR0aGlzLT5zb3VyY2VNYXAgPSBzZWxmOjpTT1VSQ0VfTUFQX0ZJTEU7CiAgICAgICAgICAgICAgICB9IGVsc2VpZiAoJHRoaXMtPnNvdXJjZU1hcCAhPT0gc2VsZjo6U09VUkNFX01BUF9OT05FKSB7CiAgICAgICAgICAgICAgICAgICAgJHNvdXJjZU1hcEdlbmVyYXRvciA9IG5ldyBTb3VyY2VNYXBHZW5lcmF0b3IoJHRoaXMtPnNvdXJjZU1hcE9wdGlvbnMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGFzc2VydCgkdGhpcy0+c2NvcGUgIT09IG51bGwpOwoKICAgICAgICAgICAgJG91dCA9ICR0aGlzLT5mb3JtYXR0ZXItPmZvcm1hdCgkdGhpcy0+c2NvcGUsICRzb3VyY2VNYXBHZW5lcmF0b3IpOwoKICAgICAgICAgICAgJHByZWZpeCA9ICcnOwoKICAgICAgICAgICAgaWYgKCR0aGlzLT5jaGFyc2V0ICYmIHN0cmxlbigkb3V0KSAhPT0gVXRpbDo6bWJTdHJsZW4oJG91dCkpIHsKICAgICAgICAgICAgICAgICRwcmVmaXggPSAnQGNoYXJzZXQgIlVURi04IjsnIC4gIlxuIjsKICAgICAgICAgICAgICAgICRvdXQgPSAkcHJlZml4IC4gJG91dDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHNvdXJjZU1hcCA9IG51bGw7CgogICAgICAgICAgICBpZiAoISBlbXB0eSgkb3V0KSAmJiAkdGhpcy0+c291cmNlTWFwICE9PSBzZWxmOjpTT1VSQ0VfTUFQX05PTkUgJiYgJHRoaXMtPnNvdXJjZU1hcCkgewogICAgICAgICAgICAgICAgYXNzZXJ0KCRzb3VyY2VNYXBHZW5lcmF0b3IgIT09IG51bGwpOwogICAgICAgICAgICAgICAgJHNvdXJjZU1hcCA9ICRzb3VyY2VNYXBHZW5lcmF0b3ItPmdlbmVyYXRlSnNvbigkcHJlZml4KTsKICAgICAgICAgICAgICAgICRzb3VyY2VNYXBVcmwgPSBudWxsOwoKICAgICAgICAgICAgICAgIHN3aXRjaCAoJHRoaXMtPnNvdXJjZU1hcCkgewogICAgICAgICAgICAgICAgICAgIGNhc2Ugc2VsZjo6U09VUkNFX01BUF9JTkxJTkU6CiAgICAgICAgICAgICAgICAgICAgICAgICRzb3VyY2VNYXBVcmwgPSBzcHJpbnRmKCdkYXRhOmFwcGxpY2F0aW9uL2pzb24sJXMnLCBVdGlsOjplbmNvZGVVUklDb21wb25lbnQoJHNvdXJjZU1hcCkpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICAgICAgY2FzZSBzZWxmOjpTT1VSQ0VfTUFQX0ZJTEU6CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc3NldCgkdGhpcy0+c291cmNlTWFwT3B0aW9uc1snc291cmNlTWFwVVJMJ10pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc291cmNlTWFwVXJsID0gJHRoaXMtPnNvdXJjZU1hcE9wdGlvbnNbJ3NvdXJjZU1hcFVSTCddOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICgkc291cmNlTWFwVXJsICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgJG91dCAuPSBzcHJpbnRmKCcvKiMgc291cmNlTWFwcGluZ1VSTD0lcyAqLycsICRzb3VyY2VNYXBVcmwpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSBjYXRjaCAoU2Fzc1NjcmlwdEV4Y2VwdGlvbiAkZSkgewogICAgICAgICAgICB0aHJvdyBuZXcgQ29tcGlsZXJFeGNlcHRpb24oJHRoaXMtPmFkZExvY2F0aW9uVG9NZXNzYWdlKCRlLT5nZXRNZXNzYWdlKCkpLCAwLCAkZSk7CiAgICAgICAgfQoKICAgICAgICAkaW5jbHVkZWRGaWxlcyA9IFtdOwoKICAgICAgICBmb3JlYWNoICgkdGhpcy0+cmVzb2x2ZWRJbXBvcnRzIGFzICRyZXNvbHZlZEltcG9ydCkgewogICAgICAgICAgICAkaW5jbHVkZWRGaWxlc1skcmVzb2x2ZWRJbXBvcnRbJ2ZpbGVQYXRoJ11dID0gJHJlc29sdmVkSW1wb3J0WydmaWxlUGF0aCddOwogICAgICAgIH0KCiAgICAgICAgJHJlc3VsdCA9IG5ldyBDb21waWxhdGlvblJlc3VsdCgkb3V0LCAkc291cmNlTWFwLCBhcnJheV92YWx1ZXMoJGluY2x1ZGVkRmlsZXMpKTsKCiAgICAgICAgaWYgKCR0aGlzLT5jYWNoZSAmJiBpc3NldCgkY2FjaGVLZXkpICYmIGlzc2V0KCRjb21waWxlT3B0aW9ucykpIHsKICAgICAgICAgICAgJHRoaXMtPmNhY2hlLT5zZXRDYWNoZSgnY29tcGlsZScsICRjYWNoZUtleSwgbmV3IENhY2hlZFJlc3VsdCgkcmVzdWx0LCAkdGhpcy0+cGFyc2VkRmlsZXMsICR0aGlzLT5yZXNvbHZlZEltcG9ydHMpLCAkY29tcGlsZU9wdGlvbnMpOwogICAgICAgIH0KCiAgICAgICAgLy8gUmVzZXQgc3RhdGUgdG8gZnJlZSBtZW1vcnkKICAgICAgICAvLyBUT0RPIGluIDIuMCwgcmVzZXQgcGFyc2VkRmlsZXMgYXMgd2VsbCB3aGVuIHRoZSBnZXR0ZXIgaXMgcmVtb3ZlZC4KICAgICAgICAkdGhpcy0+cmVzb2x2ZWRJbXBvcnRzID0gW107CiAgICAgICAgJHRoaXMtPmltcG9ydGVkRmlsZXMgPSBbXTsKCiAgICAgICAgcmV0dXJuICRyZXN1bHQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0gQ2FjaGVkUmVzdWx0ICRyZXN1bHQKICAgICAqCiAgICAgKiBAcmV0dXJuIGJvb2wKICAgICAqLwogICAgcHJpdmF0ZSBmdW5jdGlvbiBpc0ZyZXNoQ2FjaGVkUmVzdWx0KENhY2hlZFJlc3VsdCAkcmVzdWx0KQogICAgewogICAgICAgIC8vIGNoZWNrIGlmIGFueSBkZXBlbmRlbmN5IGZpbGUgY2hhbmdlZCBzaW5jZSB0aGUgcmVzdWx0IHdhcyBjb21waWxlZAogICAgICAgIGZvcmVhY2ggKCRyZXN1bHQtPmdldFBhcnNlZEZpbGVzKCkgYXMgJGZpbGUgPT4gJG10aW1lKSB7CiAgICAgICAgICAgIGlmICghIGlzX2ZpbGUoJGZpbGUpIHx8IGZpbGVtdGltZSgkZmlsZSkgIT09ICRtdGltZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoJHRoaXMtPmNhY2hlQ2hlY2tJbXBvcnRSZXNvbHV0aW9ucykgewogICAgICAgICAgICAkcmVzb2x2ZWRJbXBvcnRzID0gW107CgogICAgICAgICAgICBmb3JlYWNoICgkcmVzdWx0LT5nZXRSZXNvbHZlZEltcG9ydHMoKSBhcyAkaW1wb3J0KSB7CiAgICAgICAgICAgICAgICAkY3VycmVudERpciA9ICRpbXBvcnRbJ2N1cnJlbnREaXInXTsKICAgICAgICAgICAgICAgICRwYXRoID0gJGltcG9ydFsncGF0aCddOwogICAgICAgICAgICAgICAgLy8gc3RvcmUgdGhlIGNoZWNrIGFjcm9zcyBhbGwgdGhlIHJlc3VsdHMgaW4gbWVtb3J5IHRvIGF2b2lkIG11bHRpcGxlIGZpbmRJbXBvcnQoKSBvbiB0aGUgc2FtZSBwYXRoCiAgICAgICAgICAgICAgICAvLyB3aXRoIHNhbWUgY29udGV4dC4KICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgaGFwcGVuaW5nIGluIGEgc2FtZSBoaXQgd2l0aCBtdWx0aXBsZSBjb21waWxhdGlvbnMgKGVzcGVjaWFsbHkgd2l0aCBiaWcgZnJhbWV3b3JrcykKICAgICAgICAgICAgICAgIGlmIChlbXB0eSgkcmVzb2x2ZWRJbXBvcnRzWyRjdXJyZW50RGlyXVskcGF0aF0pKSB7CiAgICAgICAgICAgICAgICAgICAgJHJlc29sdmVkSW1wb3J0c1skY3VycmVudERpcl1bJHBhdGhdID0gJHRoaXMtPmZpbmRJbXBvcnQoJHBhdGgsICRjdXJyZW50RGlyKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoJHJlc29sdmVkSW1wb3J0c1skY3VycmVudERpcl1bJHBhdGhdICE9PSAkaW1wb3J0WydmaWxlUGF0aCddKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICAvKioKICAgICAqIEluc3RhbnRpYXRlIHBhcnNlcgogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmd8bnVsbCAkcGF0aAogICAgICoKICAgICAqIEByZXR1cm4gXFNjc3NQaHBcU2Nzc1BocFxQYXJzZXIKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIHBhcnNlckZhY3RvcnkoJHBhdGgpCiAgICB7CiAgICAgICAgLy8gaHR0cHM6Ly9zYXNzLWxhbmcuY29tL2RvY3VtZW50YXRpb24vYXQtcnVsZXMvaW1wb3J0CiAgICAgICAgLy8gQ1NTIGZpbGVzIGltcG9ydGVkIGJ5IFNhc3MgZG9u4oCZdCBhbGxvdyBhbnkgc3BlY2lhbCBTYXNzIGZlYXR1cmVzLgogICAgICAgIC8vIEluIG9yZGVyIHRvIG1ha2Ugc3VyZSBhdXRob3JzIGRvbuKAmXQgYWNjaWRlbnRhbGx5IHdyaXRlIFNhc3MgaW4gdGhlaXIgQ1NTLAogICAgICAgIC8vIGFsbCBTYXNzIGZlYXR1cmVzIHRoYXQgYXJlbuKAmXQgYWxzbyB2YWxpZCBDU1Mgd2lsbCBwcm9kdWNlIGVycm9ycy4KICAgICAgICAvLyBPdGhlcndpc2UsIHRoZSBDU1Mgd2lsbCBiZSByZW5kZXJlZCBhcy1pcy4gSXQgY2FuIGV2ZW4gYmUgZXh0ZW5kZWQhCiAgICAgICAgJGNzc09ubHkgPSBmYWxzZTsKCiAgICAgICAgaWYgKCRwYXRoICE9PSBudWxsICYmIHN1YnN0cigkcGF0aCwgLTQpID09PSAnLmNzcycpIHsKICAgICAgICAgICAgJGNzc09ubHkgPSB0cnVlOwogICAgICAgIH0KCiAgICAgICAgJHBhcnNlciA9IG5ldyBQYXJzZXIoJHBhdGgsIFxjb3VudCgkdGhpcy0+c291cmNlTmFtZXMpLCAkdGhpcy0+ZW5jb2RpbmcsICR0aGlzLT5jYWNoZSwgJGNzc09ubHksICR0aGlzLT5sb2dnZXIpOwoKICAgICAgICAkdGhpcy0+c291cmNlTmFtZXNbXSA9ICRwYXRoOwogICAgICAgICR0aGlzLT5hZGRQYXJzZWRGaWxlKCRwYXRoKTsKCiAgICAgICAgcmV0dXJuICRwYXJzZXI7CiAgICB9CgogICAgLyoqCiAgICAgKiBJcyBzZWxmIGV4dGVuZD8KICAgICAqCiAgICAgKiBAcGFyYW0gYXJyYXkgJHRhcmdldAogICAgICogQHBhcmFtIGFycmF5ICRvcmlnaW4KICAgICAqCiAgICAgKiBAcmV0dXJuIGJvb2wKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGlzU2VsZkV4dGVuZCgkdGFyZ2V0LCAkb3JpZ2luKQogICAgewogICAgICAgIGZvcmVhY2ggKCRvcmlnaW4gYXMgJHNlbCkgewogICAgICAgICAgICBpZiAoXGluX2FycmF5KCR0YXJnZXQsICRzZWwpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIC8qKgogICAgICogUHVzaCBleHRlbmRzCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZ1tdICAgJHRhcmdldAogICAgICogQHBhcmFtIGFycmF5ICAgICAgJG9yaWdpbgogICAgICogQHBhcmFtIGFycmF5fG51bGwgJGJsb2NrCiAgICAgKgogICAgICogQHJldHVybiB2b2lkCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBwdXNoRXh0ZW5kcygkdGFyZ2V0LCAkb3JpZ2luLCAkYmxvY2spCiAgICB7CiAgICAgICAgJGkgPSBcY291bnQoJHRoaXMtPmV4dGVuZHMpOwogICAgICAgICR0aGlzLT5leHRlbmRzW10gPSBbJHRhcmdldCwgJG9yaWdpbiwgJGJsb2NrXTsKCiAgICAgICAgZm9yZWFjaCAoJHRhcmdldCBhcyAkcGFydCkgewogICAgICAgICAgICBpZiAoaXNzZXQoJHRoaXMtPmV4dGVuZHNNYXBbJHBhcnRdKSkgewogICAgICAgICAgICAgICAgJHRoaXMtPmV4dGVuZHNNYXBbJHBhcnRdW10gPSAkaTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICR0aGlzLT5leHRlbmRzTWFwWyRwYXJ0XSA9IFskaV07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBNYWtlIG91dHB1dCBibG9jawogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmd8bnVsbCAgICR0eXBlCiAgICAgKiBAcGFyYW0gc3RyaW5nW118bnVsbCAkc2VsZWN0b3JzCiAgICAgKgogICAgICogQHJldHVybiBcU2Nzc1BocFxTY3NzUGhwXEZvcm1hdHRlclxPdXRwdXRCbG9jawogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gbWFrZU91dHB1dEJsb2NrKCR0eXBlLCAkc2VsZWN0b3JzID0gbnVsbCkKICAgIHsKICAgICAgICAkb3V0ID0gbmV3IE91dHB1dEJsb2NrKCk7CiAgICAgICAgJG91dC0+dHlwZSAgICAgID0gJHR5cGU7CiAgICAgICAgJG91dC0+bGluZXMgICAgID0gW107CiAgICAgICAgJG91dC0+Y2hpbGRyZW4gID0gW107CiAgICAgICAgJG91dC0+cGFyZW50ICAgID0gJHRoaXMtPnNjb3BlOwogICAgICAgICRvdXQtPnNlbGVjdG9ycyA9ICRzZWxlY3RvcnM7CiAgICAgICAgJG91dC0+ZGVwdGggICAgID0gJHRoaXMtPmVudi0+ZGVwdGg7CgogICAgICAgIGlmICgkdGhpcy0+ZW52LT5ibG9jayBpbnN0YW5jZW9mIEJsb2NrKSB7CiAgICAgICAgICAgICRvdXQtPnNvdXJjZU5hbWUgICA9ICR0aGlzLT5lbnYtPmJsb2NrLT5zb3VyY2VOYW1lOwogICAgICAgICAgICAkb3V0LT5zb3VyY2VMaW5lICAgPSAkdGhpcy0+ZW52LT5ibG9jay0+c291cmNlTGluZTsKICAgICAgICAgICAgJG91dC0+c291cmNlQ29sdW1uID0gJHRoaXMtPmVudi0+YmxvY2stPnNvdXJjZUNvbHVtbjsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkb3V0LT5zb3VyY2VOYW1lID0gaXNzZXQoJHRoaXMtPnNvdXJjZU5hbWVzWyR0aGlzLT5zb3VyY2VJbmRleF0pID8gJHRoaXMtPnNvdXJjZU5hbWVzWyR0aGlzLT5zb3VyY2VJbmRleF0gOiAnKHN0ZGluKSc7CiAgICAgICAgICAgICRvdXQtPnNvdXJjZUxpbmUgPSAkdGhpcy0+c291cmNlTGluZTsKICAgICAgICAgICAgJG91dC0+c291cmNlQ29sdW1uID0gJHRoaXMtPnNvdXJjZUNvbHVtbjsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkb3V0OwogICAgfQoKICAgIC8qKgogICAgICogQ29tcGlsZSByb290CiAgICAgKgogICAgICogQHBhcmFtIFxTY3NzUGhwXFNjc3NQaHBcQmxvY2sgJHJvb3RCbG9jawogICAgICoKICAgICAqIEByZXR1cm4gdm9pZAogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gY29tcGlsZVJvb3QoQmxvY2sgJHJvb3RCbG9jaykKICAgIHsKICAgICAgICAkdGhpcy0+cm9vdEJsb2NrID0gJHRoaXMtPnNjb3BlID0gJHRoaXMtPm1ha2VPdXRwdXRCbG9jayhUeXBlOjpUX1JPT1QpOwoKICAgICAgICAkdGhpcy0+Y29tcGlsZUNoaWxkcmVuTm9SZXR1cm4oJHJvb3RCbG9jay0+Y2hpbGRyZW4sICR0aGlzLT5zY29wZSk7CiAgICAgICAgYXNzZXJ0KCR0aGlzLT5zY29wZSAhPT0gbnVsbCk7CiAgICAgICAgJHRoaXMtPmZsYXR0ZW5TZWxlY3RvcnMoJHRoaXMtPnNjb3BlKTsKICAgICAgICAkdGhpcy0+bWlzc2luZ1NlbGVjdG9ycygpOwogICAgfQoKICAgIC8qKgogICAgICogUmVwb3J0IG1pc3Npbmcgc2VsZWN0b3JzCiAgICAgKgogICAgICogQHJldHVybiB2b2lkCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBtaXNzaW5nU2VsZWN0b3JzKCkKICAgIHsKICAgICAgICBmb3JlYWNoICgkdGhpcy0+ZXh0ZW5kcyBhcyAkZXh0ZW5kKSB7CiAgICAgICAgICAgIGlmIChpc3NldCgkZXh0ZW5kWzNdKSkgewogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxpc3QoJHRhcmdldCwgJG9yaWdpbiwgJGJsb2NrKSA9ICRleHRlbmQ7CgogICAgICAgICAgICAvLyBpZ25vcmUgaWYgIW9wdGlvbmFsCiAgICAgICAgICAgIGlmICgkYmxvY2tbMl0pIHsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkdGFyZ2V0ID0gaW1wbG9kZSgnICcsICR0YXJnZXQpOwogICAgICAgICAgICAkb3JpZ2luID0gJHRoaXMtPmNvbGxhcHNlU2VsZWN0b3JzKCRvcmlnaW4pOwoKICAgICAgICAgICAgJHRoaXMtPnNvdXJjZUxpbmUgPSAkYmxvY2tbUGFyc2VyOjpTT1VSQ0VfTElORV07CiAgICAgICAgICAgIHRocm93ICR0aGlzLT5lcnJvcigiXCIkb3JpZ2luXCIgZmFpbGVkIHRvIEBleHRlbmQgXCIkdGFyZ2V0XCIuIFRoZSBzZWxlY3RvciBcIiR0YXJnZXRcIiB3YXMgbm90IGZvdW5kLiIpOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEZsYXR0ZW4gc2VsZWN0b3JzCiAgICAgKgogICAgICogQHBhcmFtIFxTY3NzUGhwXFNjc3NQaHBcRm9ybWF0dGVyXE91dHB1dEJsb2NrICRibG9jawogICAgICogQHBhcmFtIHN0cmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRwYXJlbnRLZXkKICAgICAqCiAgICAgKiBAcmV0dXJuIHZvaWQKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGZsYXR0ZW5TZWxlY3RvcnMoT3V0cHV0QmxvY2sgJGJsb2NrLCAkcGFyZW50S2V5ID0gbnVsbCkKICAgIHsKICAgICAgICBpZiAoJGJsb2NrLT5zZWxlY3RvcnMpIHsKICAgICAgICAgICAgJHNlbGVjdG9ycyA9IFtdOwoKICAgICAgICAgICAgZm9yZWFjaCAoJGJsb2NrLT5zZWxlY3RvcnMgYXMgJHMpIHsKICAgICAgICAgICAgICAgICRzZWxlY3RvcnNbXSA9ICRzOwoKICAgICAgICAgICAgICAgIGlmICghIFxpc19hcnJheSgkcykpIHsKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBjaGVjayBleHRlbmRzCiAgICAgICAgICAgICAgICBpZiAoISBlbXB0eSgkdGhpcy0+ZXh0ZW5kc01hcCkpIHsKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+bWF0Y2hFeHRlbmRzKCRzLCAkc2VsZWN0b3JzKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIGR1cGxpY2F0ZXMKICAgICAgICAgICAgICAgICAgICBhcnJheV93YWxrKCRzZWxlY3RvcnMsIGZ1bmN0aW9uICgmJHZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICR2YWx1ZSA9IHNlcmlhbGl6ZSgkdmFsdWUpOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAkc2VsZWN0b3JzID0gYXJyYXlfdW5pcXVlKCRzZWxlY3RvcnMpOwoKICAgICAgICAgICAgICAgICAgICBhcnJheV93YWxrKCRzZWxlY3RvcnMsIGZ1bmN0aW9uICgmJHZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICR2YWx1ZSA9IHVuc2VyaWFsaXplKCR2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRibG9jay0+c2VsZWN0b3JzID0gW107CiAgICAgICAgICAgICRwbGFjZWhvbGRlclNlbGVjdG9yID0gZmFsc2U7CgogICAgICAgICAgICBmb3JlYWNoICgkc2VsZWN0b3JzIGFzICRzZWxlY3RvcikgewogICAgICAgICAgICAgICAgaWYgKCR0aGlzLT5oYXNTZWxlY3RvclBsYWNlaG9sZGVyKCRzZWxlY3RvcikpIHsKICAgICAgICAgICAgICAgICAgICAkcGxhY2Vob2xkZXJTZWxlY3RvciA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJGJsb2NrLT5zZWxlY3RvcnNbXSA9ICR0aGlzLT5jb21waWxlU2VsZWN0b3IoJHNlbGVjdG9yKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCRwbGFjZWhvbGRlclNlbGVjdG9yICYmIDAgPT09IFxjb3VudCgkYmxvY2stPnNlbGVjdG9ycykgJiYgbnVsbCAhPT0gJHBhcmVudEtleSkgewogICAgICAgICAgICAgICAgYXNzZXJ0KCRibG9jay0+cGFyZW50ICE9PSBudWxsKTsKICAgICAgICAgICAgICAgIHVuc2V0KCRibG9jay0+cGFyZW50LT5jaGlsZHJlblskcGFyZW50S2V5XSk7CgogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBmb3JlYWNoICgkYmxvY2stPmNoaWxkcmVuIGFzICRrZXkgPT4gJGNoaWxkKSB7CiAgICAgICAgICAgICR0aGlzLT5mbGF0dGVuU2VsZWN0b3JzKCRjaGlsZCwgJGtleSk7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogR2x1ZSBwYXJ0cyBvZiA6bm90KCBvciA6bnRoLWNoaWxkKCAuLi4gdGhhdCBhcmUgaW4gZ2VuZXJhbCBzcGxpdCBpbiBzZWxlY3RvcnMgcGFydHMKICAgICAqCiAgICAgKiBAcGFyYW0gYXJyYXkgJHBhcnRzCiAgICAgKgogICAgICogQHJldHVybiBhcnJheQogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gZ2x1ZUZ1bmN0aW9uU2VsZWN0b3JzKCRwYXJ0cykKICAgIHsKICAgICAgICAkbmV3ID0gW107CgogICAgICAgIGZvcmVhY2ggKCRwYXJ0cyBhcyAkcGFydCkgewogICAgICAgICAgICBpZiAoXGlzX2FycmF5KCRwYXJ0KSkgewogICAgICAgICAgICAgICAgJHBhcnQgPSAkdGhpcy0+Z2x1ZUZ1bmN0aW9uU2VsZWN0b3JzKCRwYXJ0KTsKICAgICAgICAgICAgICAgICRuZXdbXSA9ICRwYXJ0OwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgLy8gYSBzZWxlY3RvciBwYXJ0IGZpbmlzaGluZyB3aXRoIGEgKSBpcyB0aGUgbGFzdCBwYXJ0IG9mIGEgOm5vdCggb3IgOm50aC1jaGlsZCgKICAgICAgICAgICAgICAgIC8vIGFuZCBuZWVkIHRvIGJlIGpvaW5lZCB0byB0aGlzCiAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgXGNvdW50KCRuZXcpICYmIFxpc19zdHJpbmcoJG5ld1tcY291bnQoJG5ldykgLSAxXSkgJiYKICAgICAgICAgICAgICAgICAgICBcc3RybGVuKCRwYXJ0KSAmJiBzdWJzdHIoJHBhcnQsIC0xKSA9PT0gJyknICYmIHN0cnBvcygkcGFydCwgJygnKSA9PT0gZmFsc2UKICAgICAgICAgICAgICAgICkgewogICAgICAgICAgICAgICAgICAgIHdoaWxlIChcY291bnQoJG5ldykgPiAxICYmIHN1YnN0cigkbmV3W1xjb3VudCgkbmV3KSAtIDFdLCAtMSkgIT09ICcoJykgewogICAgICAgICAgICAgICAgICAgICAgICAkcGFydCA9IGFycmF5X3BvcCgkbmV3KSAuICRwYXJ0OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkbmV3W1xjb3VudCgkbmV3KSAtIDFdIC49ICRwYXJ0OwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkbmV3W10gPSAkcGFydDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRuZXc7CiAgICB9CgogICAgLyoqCiAgICAgKiBNYXRjaCBleHRlbmRzCiAgICAgKgogICAgICogQHBhcmFtIGFycmF5ICRzZWxlY3RvcgogICAgICogQHBhcmFtIGFycmF5ICRvdXQKICAgICAqIEBwYXJhbSBpbnQgICAkZnJvbQogICAgICogQHBhcmFtIGJvb2wgICRpbml0aWFsCiAgICAgKgogICAgICogQHJldHVybiB2b2lkCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBtYXRjaEV4dGVuZHMoJHNlbGVjdG9yLCAmJG91dCwgJGZyb20gPSAwLCAkaW5pdGlhbCA9IHRydWUpCiAgICB7CiAgICAgICAgc3RhdGljICRwYXJ0c1BpbGUgPSBbXTsKICAgICAgICAkc2VsZWN0b3IgPSAkdGhpcy0+Z2x1ZUZ1bmN0aW9uU2VsZWN0b3JzKCRzZWxlY3Rvcik7CgogICAgICAgIGlmIChcY291bnQoJHNlbGVjdG9yKSA9PSAxICYmIFxpbl9hcnJheShyZXNldCgkc2VsZWN0b3IpLCAkcGFydHNQaWxlKSkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAkb3V0UmVjdXJzID0gW107CgogICAgICAgIGZvcmVhY2ggKCRzZWxlY3RvciBhcyAkaSA9PiAkcGFydCkgewogICAgICAgICAgICBpZiAoJGkgPCAkZnJvbSkgewogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGNoZWNrIHRoYXQgd2UgYXJlIG5vdCBidWlsZGluZyBhbiBpbmZpbml0ZSBsb29wIG9mIGV4dGVuc2lvbnMKICAgICAgICAgICAgLy8gaWYgdGhlIG5ldyBwYXJ0IGlzIGp1c3QgaW5jbHVkaW5nIGEgcHJldmlvdXMgcGFydCBkb24ndCB0cnkgdG8gZXh0ZW5kIGFueW1vcmUKICAgICAgICAgICAgaWYgKFxjb3VudCgkcGFydCkgPiAxKSB7CiAgICAgICAgICAgICAgICBmb3JlYWNoICgkcGFydHNQaWxlIGFzICRwcmV2aW91c1BhcnQpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoISBcY291bnQoYXJyYXlfZGlmZigkcHJldmlvdXNQYXJ0LCAkcGFydCkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlIDI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAkcGFydHNQaWxlW10gPSAkcGFydDsKCiAgICAgICAgICAgIGlmICgkdGhpcy0+bWF0Y2hFeHRlbmRzU2luZ2xlKCRwYXJ0LCAkb3JpZ2luLCAkaW5pdGlhbCkpIHsKICAgICAgICAgICAgICAgICRhZnRlciAgICAgICA9IFxhcnJheV9zbGljZSgkc2VsZWN0b3IsICRpICsgMSk7CiAgICAgICAgICAgICAgICAkYmVmb3JlICAgICAgPSBcYXJyYXlfc2xpY2UoJHNlbGVjdG9yLCAwLCAkaSk7CiAgICAgICAgICAgICAgICBsaXN0KCRiZWZvcmUsICRub25CcmVha2FibGVCZWZvcmUpID0gJHRoaXMtPmV4dHJhY3RSZWxhdGlvbnNoaXBGcm9tRnJhZ21lbnQoJGJlZm9yZSk7CgogICAgICAgICAgICAgICAgZm9yZWFjaCAoJG9yaWdpbiBhcyAkbmV3KSB7CiAgICAgICAgICAgICAgICAgICAgJGsgPSAwOwoKICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmUgc2hhcmVkIHBhcnRzCiAgICAgICAgICAgICAgICAgICAgaWYgKFxjb3VudCgkbmV3KSA+IDEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCRrIDwgJGkgJiYgaXNzZXQoJG5ld1ska10pICYmICRzZWxlY3Rvclska10gPT09ICRuZXdbJGtdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaysrOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBpZiAoXGNvdW50KCRub25CcmVha2FibGVCZWZvcmUpICYmICRrID09PSBcY291bnQoJG5ldykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJGstLTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICRyZXBsYWNlbWVudCA9IFtdOwogICAgICAgICAgICAgICAgICAgICR0ZW1wUmVwbGFjZW1lbnQgPSAkayA+IDAgPyBcYXJyYXlfc2xpY2UoJG5ldywgJGspIDogJG5ldzsKCiAgICAgICAgICAgICAgICAgICAgZm9yICgkbCA9IFxjb3VudCgkdGVtcFJlcGxhY2VtZW50KSAtIDE7ICRsID49IDA7ICRsLS0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgJHNsaWNlID0gW107CgogICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICgkdGVtcFJlcGxhY2VtZW50WyRsXSBhcyAkY2h1bmspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIFxpbl9hcnJheSgkY2h1bmssICRzbGljZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2xpY2VbXSA9ICRjaHVuazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXlfdW5zaGlmdCgkcmVwbGFjZW1lbnQsICRzbGljZSk7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoISAkdGhpcy0+aXNJbW1lZGlhdGVSZWxhdGlvbnNoaXBDb21iaW5hdG9yKGVuZCgkc2xpY2UpKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICRhZnRlckJlZm9yZSA9ICRsICE9IDAgPyBcYXJyYXlfc2xpY2UoJHRlbXBSZXBsYWNlbWVudCwgMCwgJGwpIDogW107CgogICAgICAgICAgICAgICAgICAgIC8vIE1lcmdlIHNoYXJlZCBkaXJlY3QgcmVsYXRpb25zaGlwcy4KICAgICAgICAgICAgICAgICAgICAkbWVyZ2VkQmVmb3JlID0gJHRoaXMtPm1lcmdlRGlyZWN0UmVsYXRpb25zaGlwcygkYWZ0ZXJCZWZvcmUsICRub25CcmVha2FibGVCZWZvcmUpOwoKICAgICAgICAgICAgICAgICAgICAkcmVzdWx0ID0gYXJyYXlfbWVyZ2UoCiAgICAgICAgICAgICAgICAgICAgICAgICRiZWZvcmUsCiAgICAgICAgICAgICAgICAgICAgICAgICRtZXJnZWRCZWZvcmUsCiAgICAgICAgICAgICAgICAgICAgICAgICRyZXBsYWNlbWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgJGFmdGVyCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCRyZXN1bHQgPT09ICRzZWxlY3RvcikgewogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICR0aGlzLT5wdXNoT3JNZXJnZUV4dGVudGVkU2VsZWN0b3IoJG91dCwgJHJlc3VsdCk7CgogICAgICAgICAgICAgICAgICAgIC8vIHJlY3Vyc2l2ZWx5IGNoZWNrIGZvciBtb3JlIG1hdGNoZXMKICAgICAgICAgICAgICAgICAgICAkc3RhcnRSZWN1cnNlRnJvbSA9IFxjb3VudCgkYmVmb3JlKSArIG1pbihcY291bnQoJG5vbkJyZWFrYWJsZUJlZm9yZSksIFxjb3VudCgkbWVyZ2VkQmVmb3JlKSk7CgogICAgICAgICAgICAgICAgICAgIGlmIChcY291bnQoJG9yaWdpbikgPiAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5tYXRjaEV4dGVuZHMoJHJlc3VsdCwgJG91dCwgJHN0YXJ0UmVjdXJzZUZyb20sIGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+bWF0Y2hFeHRlbmRzKCRyZXN1bHQsICRvdXRSZWN1cnMsICRzdGFydFJlY3Vyc2VGcm9tLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyBzZWxlY3RvciBzZXF1ZW5jZSBtZXJnaW5nCiAgICAgICAgICAgICAgICAgICAgaWYgKCEgZW1wdHkoJGJlZm9yZSkgJiYgXGNvdW50KCRuZXcpID4gMSkgewogICAgICAgICAgICAgICAgICAgICAgICAkcHJlU2hhcmVkUGFydHMgPSAkayA+IDAgPyBcYXJyYXlfc2xpY2UoJGJlZm9yZSwgMCwgJGspIDogW107CiAgICAgICAgICAgICAgICAgICAgICAgICRwb3N0U2hhcmVkUGFydHMgPSAkayA+IDAgPyBcYXJyYXlfc2xpY2UoJGJlZm9yZSwgJGspIDogJGJlZm9yZTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QoJGJldHdlZW5TaGFyZWRQYXJ0cywgJG5vbkJyZWFrYWJsMikgPSAkdGhpcy0+ZXh0cmFjdFJlbGF0aW9uc2hpcEZyb21GcmFnbWVudCgkYWZ0ZXJCZWZvcmUpOwoKICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3VsdDIgPSBhcnJheV9tZXJnZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRwcmVTaGFyZWRQYXJ0cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRiZXR3ZWVuU2hhcmVkUGFydHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcG9zdFNoYXJlZFBhcnRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJG5vbkJyZWFrYWJsMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRub25CcmVha2FibGVCZWZvcmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcmVwbGFjZW1lbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYWZ0ZXIKICAgICAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5wdXNoT3JNZXJnZUV4dGVudGVkU2VsZWN0b3IoJG91dCwgJHJlc3VsdDIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBhcnJheV9wb3AoJHBhcnRzUGlsZSk7CiAgICAgICAgfQoKICAgICAgICB3aGlsZSAoXGNvdW50KCRvdXRSZWN1cnMpKSB7CiAgICAgICAgICAgICRyZXN1bHQgPSBhcnJheV9zaGlmdCgkb3V0UmVjdXJzKTsKICAgICAgICAgICAgJHRoaXMtPnB1c2hPck1lcmdlRXh0ZW50ZWRTZWxlY3Rvcigkb3V0LCAkcmVzdWx0KTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBUZXN0IGEgcGFydCBmb3IgYmVpbmcgYSBwc2V1ZG8gc2VsZWN0b3IKICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICRwYXJ0CiAgICAgKiBAcGFyYW0gYXJyYXkgICRtYXRjaGVzCiAgICAgKgogICAgICogQHJldHVybiBib29sCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBpc1BzZXVkb1NlbGVjdG9yKCRwYXJ0LCAmJG1hdGNoZXMpCiAgICB7CiAgICAgICAgaWYgKAogICAgICAgICAgICBzdHJwb3MoJHBhcnQsICc6JykgPT09IDAgJiYKICAgICAgICAgICAgcHJlZ19tYXRjaCgiLF46Oj8oW1x3LV0rKVwoKC4rKVwpJCwiLCAkcGFydCwgJG1hdGNoZXMpCiAgICAgICAgKSB7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIC8qKgogICAgICogUHVzaCBleHRlbmRlZCBzZWxlY3RvciBleGNlcHQgaWYKICAgICAqICAtIHRoaXMgaXMgYSBwc2V1ZG8gc2VsZWN0b3IKICAgICAqICAtIHNhbWUgYXMgcHJldmlvdXMKICAgICAqICAtIGluIGEgd2hpdGUgbGlzdAogICAgICogaW4gdGhpcyBjYXNlIHdlIG1lcmdlIHRoZSBwc2V1ZG8gc2VsZWN0b3IgY29udGVudAogICAgICoKICAgICAqIEBwYXJhbSBhcnJheSAkb3V0CiAgICAgKiBAcGFyYW0gYXJyYXkgJGV4dGVuZGVkCiAgICAgKgogICAgICogQHJldHVybiB2b2lkCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBwdXNoT3JNZXJnZUV4dGVudGVkU2VsZWN0b3IoJiRvdXQsICRleHRlbmRlZCkKICAgIHsKICAgICAgICBpZiAoXGNvdW50KCRvdXQpICYmIFxjb3VudCgkZXh0ZW5kZWQpID09PSAxICYmIFxjb3VudChyZXNldCgkZXh0ZW5kZWQpKSA9PT0gMSkgewogICAgICAgICAgICAkc2luZ2xlID0gcmVzZXQoJGV4dGVuZGVkKTsKICAgICAgICAgICAgJHBhcnQgPSByZXNldCgkc2luZ2xlKTsKCiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICR0aGlzLT5pc1BzZXVkb1NlbGVjdG9yKCRwYXJ0LCAkbWF0Y2hlc0V4dGVuZGVkKSAmJgogICAgICAgICAgICAgICAgXGluX2FycmF5KCRtYXRjaGVzRXh0ZW5kZWRbMV0sIFsgJ3Nsb3R0ZWQnIF0pCiAgICAgICAgICAgICkgewogICAgICAgICAgICAgICAgJHByZXYgPSBlbmQoJG91dCk7CiAgICAgICAgICAgICAgICAkcHJldiA9ICR0aGlzLT5nbHVlRnVuY3Rpb25TZWxlY3RvcnMoJHByZXYpOwoKICAgICAgICAgICAgICAgIGlmIChcY291bnQoJHByZXYpID09PSAxICYmIFxjb3VudChyZXNldCgkcHJldikpID09PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgJHNpbmdsZSA9IHJlc2V0KCRwcmV2KTsKICAgICAgICAgICAgICAgICAgICAkcGFydCA9IHJlc2V0KCRzaW5nbGUpOwoKICAgICAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5pc1BzZXVkb1NlbGVjdG9yKCRwYXJ0LCAkbWF0Y2hlc1ByZXYpICYmCiAgICAgICAgICAgICAgICAgICAgICAgICRtYXRjaGVzUHJldlsxXSA9PT0gJG1hdGNoZXNFeHRlbmRlZFsxXQogICAgICAgICAgICAgICAgICAgICkgewogICAgICAgICAgICAgICAgICAgICAgICAkZXh0ZW5kZWQgPSBleHBsb2RlKCRtYXRjaGVzRXh0ZW5kZWRbMV0gLiAnKCcsICRtYXRjaGVzRXh0ZW5kZWRbMF0sIDIpOwogICAgICAgICAgICAgICAgICAgICAgICAkZXh0ZW5kZWRbMV0gPSAkbWF0Y2hlc1ByZXZbMl0gLiAnLCAnIC4gJGV4dGVuZGVkWzFdOwogICAgICAgICAgICAgICAgICAgICAgICAkZXh0ZW5kZWQgPSBpbXBsb2RlKCRtYXRjaGVzRXh0ZW5kZWRbMV0gLiAnKCcsICRleHRlbmRlZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICRleHRlbmRlZCA9IFsgWyAkZXh0ZW5kZWQgXV07CiAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5X3BvcCgkb3V0KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgJG91dFtdID0gJGV4dGVuZGVkOwogICAgfQoKICAgIC8qKgogICAgICogTWF0Y2ggZXh0ZW5kcyBzaW5nbGUKICAgICAqCiAgICAgKiBAcGFyYW0gYXJyYXkgJHJhd1NpbmdsZQogICAgICogQHBhcmFtIGFycmF5ICRvdXRPcmlnaW4KICAgICAqIEBwYXJhbSBib29sICAkaW5pdGlhbAogICAgICoKICAgICAqIEByZXR1cm4gYm9vbAogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gbWF0Y2hFeHRlbmRzU2luZ2xlKCRyYXdTaW5nbGUsICYkb3V0T3JpZ2luLCAkaW5pdGlhbCA9IHRydWUpCiAgICB7CiAgICAgICAgJGNvdW50cyA9IFtdOwogICAgICAgICRzaW5nbGUgPSBbXTsKCiAgICAgICAgLy8gc2ltcGxlIHVzdWFsIGNhc2VzLCBubyBuZWVkIHRvIGRvIHRoZSB3aG9sZSB0cmljawogICAgICAgIGlmIChcaW5fYXJyYXkoJHJhd1NpbmdsZSwgW1snPiddLFsnKyddLFsnfiddXSkpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgZm9yZWFjaCAoJHJhd1NpbmdsZSBhcyAkcGFydCkgewogICAgICAgICAgICAvLyBtYXRjaGVzIE51bWJlcgogICAgICAgICAgICBpZiAoISBcaXNfc3RyaW5nKCRwYXJ0KSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoISBwcmVnX21hdGNoKCcvXltcWy46IyVdLycsICRwYXJ0KSAmJiBcY291bnQoJHNpbmdsZSkpIHsKICAgICAgICAgICAgICAgICRzaW5nbGVbXGNvdW50KCRzaW5nbGUpIC0gMV0gLj0gJHBhcnQ7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkc2luZ2xlW10gPSAkcGFydDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJGV4dGVuZGluZ0RlY29yYXRlZFRhZyA9IGZhbHNlOwoKICAgICAgICBpZiAoXGNvdW50KCRzaW5nbGUpID4gMSkgewogICAgICAgICAgICAkbWF0Y2hlcyA9IG51bGw7CiAgICAgICAgICAgICRleHRlbmRpbmdEZWNvcmF0ZWRUYWcgPSBwcmVnX21hdGNoKCcvXlthLXowLTldKyQvaScsICRzaW5nbGVbMF0sICRtYXRjaGVzKSA/ICRtYXRjaGVzWzBdIDogZmFsc2U7CiAgICAgICAgfQoKICAgICAgICAkb3V0T3JpZ2luID0gW107CiAgICAgICAgJGZvdW5kID0gZmFsc2U7CgogICAgICAgIGZvcmVhY2ggKCRzaW5nbGUgYXMgJGsgPT4gJHBhcnQpIHsKICAgICAgICAgICAgaWYgKGlzc2V0KCR0aGlzLT5leHRlbmRzTWFwWyRwYXJ0XSkpIHsKICAgICAgICAgICAgICAgIGZvcmVhY2ggKCR0aGlzLT5leHRlbmRzTWFwWyRwYXJ0XSBhcyAkaWR4KSB7CiAgICAgICAgICAgICAgICAgICAgJGNvdW50c1skaWR4XSA9IGlzc2V0KCRjb3VudHNbJGlkeF0pID8gJGNvdW50c1skaWR4XSArIDEgOiAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAkaW5pdGlhbCAmJgogICAgICAgICAgICAgICAgJHRoaXMtPmlzUHNldWRvU2VsZWN0b3IoJHBhcnQsICRtYXRjaGVzKSAmJgogICAgICAgICAgICAgICAgISBcaW5fYXJyYXkoJG1hdGNoZXNbMV0sIFsgJ25vdCcgXSkKICAgICAgICAgICAgKSB7CiAgICAgICAgICAgICAgICAkYnVmZmVyICAgID0gJG1hdGNoZXNbMl07CiAgICAgICAgICAgICAgICAkcGFyc2VyICAgID0gJHRoaXMtPnBhcnNlckZhY3RvcnkoX19NRVRIT0RfXyk7CgogICAgICAgICAgICAgICAgaWYgKCRwYXJzZXItPnBhcnNlU2VsZWN0b3IoJGJ1ZmZlciwgJHN1YlNlbGVjdG9ycywgZmFsc2UpKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAoJHN1YlNlbGVjdG9ycyBhcyAka3N1YiA9PiAkc3ViU2VsZWN0b3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJHN1YkV4dGVuZGVkID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5tYXRjaEV4dGVuZHMoJHN1YlNlbGVjdG9yLCAkc3ViRXh0ZW5kZWQsIDAsIGZhbHNlKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkc3ViRXh0ZW5kZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzdWJTZWxlY3RvcnNFeHRlbmRlZCA9ICRzdWJTZWxlY3RvcnM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc3ViU2VsZWN0b3JzRXh0ZW5kZWRbJGtzdWJdID0gJHN1YkV4dGVuZGVkOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRzdWJTZWxlY3RvcnNFeHRlbmRlZCBhcyAka3NzZSA9PiAkc3NlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHN1YlNlbGVjdG9yc0V4dGVuZGVkWyRrc3NlXSA9ICR0aGlzLT5jb2xsYXBzZVNlbGVjdG9ycygkc3NlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc3ViU2VsZWN0b3JzRXh0ZW5kZWQgPSBpbXBsb2RlKCcsICcsICRzdWJTZWxlY3RvcnNFeHRlbmRlZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2luZ2xlRXh0ZW5kZWQgPSAkc2luZ2xlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNpbmdsZUV4dGVuZGVkWyRrXSA9IHN0cl9yZXBsYWNlKCcoJyAuICRidWZmZXIgLiAnKScsICIoJHN1YlNlbGVjdG9yc0V4dGVuZGVkKSIsICRwYXJ0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRvdXRPcmlnaW5bXSA9IFsgJHNpbmdsZUV4dGVuZGVkIF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZm91bmQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBmb3JlYWNoICgkY291bnRzIGFzICRpZHggPT4gJGNvdW50KSB7CiAgICAgICAgICAgIGxpc3QoJHRhcmdldCwgJG9yaWdpbiwgLyogJGJsb2NrICovKSA9ICR0aGlzLT5leHRlbmRzWyRpZHhdOwoKICAgICAgICAgICAgJG9yaWdpbiA9ICR0aGlzLT5nbHVlRnVuY3Rpb25TZWxlY3RvcnMoJG9yaWdpbik7CgogICAgICAgICAgICAvLyBjaGVjayBjb3VudAogICAgICAgICAgICBpZiAoJGNvdW50ICE9PSBcY291bnQoJHRhcmdldCkpIHsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkdGhpcy0+ZXh0ZW5kc1skaWR4XVszXSA9IHRydWU7CgogICAgICAgICAgICAkcmVtID0gYXJyYXlfZGlmZigkc2luZ2xlLCAkdGFyZ2V0KTsKCiAgICAgICAgICAgIGZvcmVhY2ggKCRvcmlnaW4gYXMgJGogPT4gJG5ldykgewogICAgICAgICAgICAgICAgLy8gcHJldmVudCBpbmZpbml0ZSBsb29wIHdoZW4gdGFyZ2V0IGV4dGVuZHMgaXRzZWxmCiAgICAgICAgICAgICAgICBpZiAoJHRoaXMtPmlzU2VsZkV4dGVuZCgkc2luZ2xlLCAkb3JpZ2luKSAmJiAhICRpbml0aWFsKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRyZXBsYWNlbWVudCA9IGVuZCgkbmV3KTsKCiAgICAgICAgICAgICAgICAvLyBFeHRlbmRpbmcgYSBkZWNvcmF0ZWQgdGFnIHdpdGggYW5vdGhlciB0YWcgaXMgbm90IHBvc3NpYmxlLgogICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICRleHRlbmRpbmdEZWNvcmF0ZWRUYWcgJiYgJHJlcGxhY2VtZW50WzBdICE9ICRleHRlbmRpbmdEZWNvcmF0ZWRUYWcgJiYKICAgICAgICAgICAgICAgICAgICBwcmVnX21hdGNoKCcvXlthLXowLTldKyQvaScsICRyZXBsYWNlbWVudFswXSkKICAgICAgICAgICAgICAgICkgewogICAgICAgICAgICAgICAgICAgIHVuc2V0KCRvcmlnaW5bJGpdKTsKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkY29tYmluZWQgPSAkdGhpcy0+Y29tYmluZVNlbGVjdG9yU2luZ2xlKCRyZXBsYWNlbWVudCwgJHJlbSk7CgogICAgICAgICAgICAgICAgaWYgKFxjb3VudChhcnJheV9kaWZmKCRjb21iaW5lZCwgJG9yaWdpblskal1bXGNvdW50KCRvcmlnaW5bJGpdKSAtIDFdKSkpIHsKICAgICAgICAgICAgICAgICAgICAkb3JpZ2luWyRqXVtcY291bnQoJG9yaWdpblskal0pIC0gMV0gPSAkY29tYmluZWQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRvdXRPcmlnaW4gPSBhcnJheV9tZXJnZSgkb3V0T3JpZ2luLCAkb3JpZ2luKTsKCiAgICAgICAgICAgICRmb3VuZCA9IHRydWU7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJGZvdW5kOwogICAgfQoKICAgIC8qKgogICAgICogRXh0cmFjdCBhIHJlbGF0aW9uc2hpcCBmcm9tIHRoZSBmcmFnbWVudC4KICAgICAqCiAgICAgKiBXaGVuIGV4dHJhY3RpbmcgdGhlIGxhc3QgcG9ydGlvbiBvZiBhIHNlbGVjdG9yIHdlIHdpbGwgYmUgbGVmdCB3aXRoIGEKICAgICAqIGZyYWdtZW50IHdoaWNoIG1heSBlbmQgd2l0aCBhIGRpcmVjdGlvbiByZWxhdGlvbnNoaXAgY29tYmluYXRvci4gVGhpcwogICAgICogbWV0aG9kIHdpbGwgZXh0cmFjdCB0aGUgcmVsYXRpb25zaGlwIGZyYWdtZW50IGFuZCByZXR1cm4gaXQgYWxvbmcgc2lkZQogICAgICogdGhlIHJlc3QuCiAgICAgKgogICAgICogQHBhcmFtIGFycmF5ICRmcmFnbWVudCBUaGUgc2VsZWN0b3IgZnJhZ21lbnQgbWF5YmUgZW5kaW5nIHdpdGggYSBkaXJlY3Rpb24gcmVsYXRpb25zaGlwIGNvbWJpbmF0b3IuCiAgICAgKgogICAgICogQHJldHVybiBhcnJheSBUaGUgc2VsZWN0b3Igd2l0aG91dCB0aGUgcmVsYXRpb25zaGlwIGZyYWdtZW50IGlmIGFueSwgdGhlIHJlbGF0aW9uc2hpcCBmcmFnbWVudC4KICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGV4dHJhY3RSZWxhdGlvbnNoaXBGcm9tRnJhZ21lbnQoYXJyYXkgJGZyYWdtZW50KQogICAgewogICAgICAgICRwYXJlbnRzID0gW107CiAgICAgICAgJGNoaWxkcmVuID0gW107CgogICAgICAgICRqID0gJGkgPSBcY291bnQoJGZyYWdtZW50KTsKCiAgICAgICAgZm9yICg7OykgewogICAgICAgICAgICAkY2hpbGRyZW4gPSAkaiAhPSAkaSA/IFxhcnJheV9zbGljZSgkZnJhZ21lbnQsICRqLCAkaSAtICRqKSA6IFtdOwogICAgICAgICAgICAkcGFyZW50cyAgPSBcYXJyYXlfc2xpY2UoJGZyYWdtZW50LCAwLCAkaik7CiAgICAgICAgICAgICRzbGljZSAgICA9IGVuZCgkcGFyZW50cyk7CgogICAgICAgICAgICBpZiAoZW1wdHkoJHNsaWNlKSB8fCAhICR0aGlzLT5pc0ltbWVkaWF0ZVJlbGF0aW9uc2hpcENvbWJpbmF0b3IoJHNsaWNlWzBdKSkgewogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRqIC09IDI7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gWyRwYXJlbnRzLCAkY2hpbGRyZW5dOwogICAgfQoKICAgIC8qKgogICAgICogQ29tYmluZSBzZWxlY3RvciBzaW5nbGUKICAgICAqCiAgICAgKiBAcGFyYW0gYXJyYXkgJGJhc2UKICAgICAqIEBwYXJhbSBhcnJheSAkb3RoZXIKICAgICAqCiAgICAgKiBAcmV0dXJuIGFycmF5CiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBjb21iaW5lU2VsZWN0b3JTaW5nbGUoJGJhc2UsICRvdGhlcikKICAgIHsKICAgICAgICAkdGFnICAgID0gW107CiAgICAgICAgJG91dCAgICA9IFtdOwogICAgICAgICR3YXNUYWcgPSBmYWxzZTsKICAgICAgICAkcHNldWRvID0gW107CgogICAgICAgIHdoaWxlIChcY291bnQoJG90aGVyKSAmJiBzdHJwb3MoZW5kKCRvdGhlciksICc6JykgPT09IDApIHsKICAgICAgICAgICAgYXJyYXlfdW5zaGlmdCgkcHNldWRvLCBhcnJheV9wb3AoJG90aGVyKSk7CiAgICAgICAgfQoKICAgICAgICBmb3JlYWNoIChbYXJyYXlfcmV2ZXJzZSgkYmFzZSksIGFycmF5X3JldmVyc2UoJG90aGVyKV0gYXMgJHNpbmdsZSkgewogICAgICAgICAgICAkcmFuZyA9IGNvdW50KCRzaW5nbGUpOwoKICAgICAgICAgICAgZm9yZWFjaCAoJHNpbmdsZSBhcyAkcGFydCkgewogICAgICAgICAgICAgICAgaWYgKHByZWdfbWF0Y2goJy9eW1xbOl0vJywgJHBhcnQpKSB7CiAgICAgICAgICAgICAgICAgICAgJG91dFtdID0gJHBhcnQ7CiAgICAgICAgICAgICAgICAgICAgJHdhc1RhZyA9IGZhbHNlOwogICAgICAgICAgICAgICAgfSBlbHNlaWYgKHByZWdfbWF0Y2goJy9eW1wuI10vJywgJHBhcnQpKSB7CiAgICAgICAgICAgICAgICAgICAgYXJyYXlfdW5zaGlmdCgkb3V0LCAkcGFydCk7CiAgICAgICAgICAgICAgICAgICAgJHdhc1RhZyA9IGZhbHNlOwogICAgICAgICAgICAgICAgfSBlbHNlaWYgKHByZWdfbWF0Y2goJy9eW15fLV0vJywgJHBhcnQpICYmICRyYW5nID09PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgJHRhZ1tdID0gJHBhcnQ7CiAgICAgICAgICAgICAgICAgICAgJHdhc1RhZyA9IHRydWU7CiAgICAgICAgICAgICAgICB9IGVsc2VpZiAoJHdhc1RhZykgewogICAgICAgICAgICAgICAgICAgICR0YWdbXGNvdW50KCR0YWcpIC0gMV0gLj0gJHBhcnQ7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGFycmF5X3Vuc2hpZnQoJG91dCwgJHBhcnQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJHJhbmctLTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKFxjb3VudCgkdGFnKSkgewogICAgICAgICAgICBhcnJheV91bnNoaWZ0KCRvdXQsICR0YWdbMF0pOwogICAgICAgIH0KCiAgICAgICAgd2hpbGUgKFxjb3VudCgkcHNldWRvKSkgewogICAgICAgICAgICAkb3V0W10gPSBhcnJheV9zaGlmdCgkcHNldWRvKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkb3V0OwogICAgfQoKICAgIC8qKgogICAgICogQ29tcGlsZSBtZWRpYQogICAgICoKICAgICAqIEBwYXJhbSBcU2Nzc1BocFxTY3NzUGhwXEJsb2NrICRtZWRpYQogICAgICoKICAgICAqIEByZXR1cm4gdm9pZAogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gY29tcGlsZU1lZGlhKEJsb2NrICRtZWRpYSkKICAgIHsKICAgICAgICBhc3NlcnQoJG1lZGlhIGluc3RhbmNlb2YgTWVkaWFCbG9jayk7CiAgICAgICAgJHRoaXMtPnB1c2hFbnYoJG1lZGlhKTsKCiAgICAgICAgJG1lZGlhUXVlcmllcyA9ICR0aGlzLT5jb21waWxlTWVkaWFRdWVyeSgkdGhpcy0+bXVsdGlwbHlNZWRpYSgkdGhpcy0+ZW52KSk7CgogICAgICAgIGlmICghIGVtcHR5KCRtZWRpYVF1ZXJpZXMpKSB7CiAgICAgICAgICAgIGFzc2VydCgkdGhpcy0+c2NvcGUgIT09IG51bGwpOwogICAgICAgICAgICAkcHJldmlvdXNTY29wZSA9ICR0aGlzLT5zY29wZTsKICAgICAgICAgICAgJHBhcmVudFNjb3BlID0gJHRoaXMtPm1lZGlhUGFyZW50KCR0aGlzLT5zY29wZSk7CgogICAgICAgICAgICBmb3JlYWNoICgkbWVkaWFRdWVyaWVzIGFzICRtZWRpYVF1ZXJ5KSB7CiAgICAgICAgICAgICAgICAkdGhpcy0+c2NvcGUgPSAkdGhpcy0+bWFrZU91dHB1dEJsb2NrKFR5cGU6OlRfTUVESUEsIFskbWVkaWFRdWVyeV0pOwoKICAgICAgICAgICAgICAgICRwYXJlbnRTY29wZS0+Y2hpbGRyZW5bXSA9ICR0aGlzLT5zY29wZTsKICAgICAgICAgICAgICAgICRwYXJlbnRTY29wZSA9ICR0aGlzLT5zY29wZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gdG9wIGxldmVsIHByb3BlcnRpZXMgaW4gYSBtZWRpYSBjYXVzZSBpdCB0byBiZSB3cmFwcGVkCiAgICAgICAgICAgICRuZWVkc1dyYXAgPSBmYWxzZTsKCiAgICAgICAgICAgIGZvcmVhY2ggKCRtZWRpYS0+Y2hpbGRyZW4gYXMgJGNoaWxkKSB7CiAgICAgICAgICAgICAgICAkdHlwZSA9ICRjaGlsZFswXTsKCiAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgJHR5cGUgIT09IFR5cGU6OlRfQkxPQ0sgJiYKICAgICAgICAgICAgICAgICAgICAkdHlwZSAhPT0gVHlwZTo6VF9NRURJQSAmJgogICAgICAgICAgICAgICAgICAgICR0eXBlICE9PSBUeXBlOjpUX0RJUkVDVElWRSAmJgogICAgICAgICAgICAgICAgICAgICR0eXBlICE9PSBUeXBlOjpUX0lNUE9SVAogICAgICAgICAgICAgICAgKSB7CiAgICAgICAgICAgICAgICAgICAgJG5lZWRzV3JhcCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICgkbmVlZHNXcmFwKSB7CiAgICAgICAgICAgICAgICAkd3JhcHBlZCA9IG5ldyBCbG9jaygpOwogICAgICAgICAgICAgICAgJHdyYXBwZWQtPnNvdXJjZU5hbWUgICA9ICRtZWRpYS0+c291cmNlTmFtZTsKICAgICAgICAgICAgICAgICR3cmFwcGVkLT5zb3VyY2VJbmRleCAgPSAkbWVkaWEtPnNvdXJjZUluZGV4OwogICAgICAgICAgICAgICAgJHdyYXBwZWQtPnNvdXJjZUxpbmUgICA9ICRtZWRpYS0+c291cmNlTGluZTsKICAgICAgICAgICAgICAgICR3cmFwcGVkLT5zb3VyY2VDb2x1bW4gPSAkbWVkaWEtPnNvdXJjZUNvbHVtbjsKICAgICAgICAgICAgICAgICR3cmFwcGVkLT5zZWxlY3RvcnMgICAgPSBbXTsKICAgICAgICAgICAgICAgICR3cmFwcGVkLT5jb21tZW50cyAgICAgPSBbXTsKICAgICAgICAgICAgICAgICR3cmFwcGVkLT5wYXJlbnQgICAgICAgPSAkbWVkaWE7CiAgICAgICAgICAgICAgICAkd3JhcHBlZC0+Y2hpbGRyZW4gICAgID0gJG1lZGlhLT5jaGlsZHJlbjsKCiAgICAgICAgICAgICAgICAkbWVkaWEtPmNoaWxkcmVuID0gW1tUeXBlOjpUX0JMT0NLLCAkd3JhcHBlZF1dOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkdGhpcy0+Y29tcGlsZUNoaWxkcmVuTm9SZXR1cm4oJG1lZGlhLT5jaGlsZHJlbiwgJHRoaXMtPnNjb3BlKTsKCiAgICAgICAgICAgICR0aGlzLT5zY29wZSA9ICRwcmV2aW91c1Njb3BlOwogICAgICAgIH0KCiAgICAgICAgJHRoaXMtPnBvcEVudigpOwogICAgfQoKICAgIC8qKgogICAgICogTWVkaWEgcGFyZW50CiAgICAgKgogICAgICogQHBhcmFtIFxTY3NzUGhwXFNjc3NQaHBcRm9ybWF0dGVyXE91dHB1dEJsb2NrICRzY29wZQogICAgICoKICAgICAqIEByZXR1cm4gXFNjc3NQaHBcU2Nzc1BocFxGb3JtYXR0ZXJcT3V0cHV0QmxvY2sKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIG1lZGlhUGFyZW50KE91dHB1dEJsb2NrICRzY29wZSkKICAgIHsKICAgICAgICB3aGlsZSAoISBlbXB0eSgkc2NvcGUtPnBhcmVudCkpIHsKICAgICAgICAgICAgaWYgKCEgZW1wdHkoJHNjb3BlLT50eXBlKSAmJiAkc2NvcGUtPnR5cGUgIT09IFR5cGU6OlRfTUVESUEpIHsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkc2NvcGUgPSAkc2NvcGUtPnBhcmVudDsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkc2NvcGU7CiAgICB9CgogICAgLyoqCiAgICAgKiBDb21waWxlIGRpcmVjdGl2ZQogICAgICoKICAgICAqIEBwYXJhbSBEaXJlY3RpdmVCbG9ja3xhcnJheSAgICAgICAgICAgICAgICAgICAkZGlyZWN0aXZlCiAgICAgKiBAcGFyYW0gXFNjc3NQaHBcU2Nzc1BocFxGb3JtYXR0ZXJcT3V0cHV0QmxvY2sgJG91dAogICAgICoKICAgICAqIEByZXR1cm4gdm9pZAogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gY29tcGlsZURpcmVjdGl2ZSgkZGlyZWN0aXZlLCBPdXRwdXRCbG9jayAkb3V0KQogICAgewogICAgICAgIGlmIChcaXNfYXJyYXkoJGRpcmVjdGl2ZSkpIHsKICAgICAgICAgICAgJGRpcmVjdGl2ZU5hbWUgPSAkdGhpcy0+Y29tcGlsZURpcmVjdGl2ZU5hbWUoJGRpcmVjdGl2ZVswXSk7CiAgICAgICAgICAgICRzID0gJ0AnIC4gJGRpcmVjdGl2ZU5hbWU7CgogICAgICAgICAgICBpZiAoISBlbXB0eSgkZGlyZWN0aXZlWzFdKSkgewogICAgICAgICAgICAgICAgJHMgLj0gJyAnIC4gJHRoaXMtPmNvbXBpbGVWYWx1ZSgkZGlyZWN0aXZlWzFdKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBzYXNzLXNwZWMgY29tcGxpYW5jZSBvbiBuZXdsaW5lIGFmdGVyIGRpcmVjdGl2ZXMsIGEgYml0IHRyaWNreSA6LwogICAgICAgICAgICAkYXBwZW5kTmV3TGluZSA9ICghIGVtcHR5KCRkaXJlY3RpdmVbMl0pIHx8IHN0cnBvcygkcywgIlxuIikpID8gIlxuIiA6ICIiOwogICAgICAgICAgICBpZiAoXGlzX2FycmF5KCRkaXJlY3RpdmVbMF0pICYmIGVtcHR5KCRkaXJlY3RpdmVbMV0pKSB7CiAgICAgICAgICAgICAgICAkYXBwZW5kTmV3TGluZSA9ICJcbiI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChlbXB0eSgkZGlyZWN0aXZlWzNdKSkgewogICAgICAgICAgICAgICAgJHRoaXMtPmFwcGVuZFJvb3REaXJlY3RpdmUoJHMgLiAnOycgLiAkYXBwZW5kTmV3TGluZSwgJG91dCwgW1R5cGU6OlRfQ09NTUVOVCwgVHlwZTo6VF9ESVJFQ1RJVkVdKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICR0aGlzLT5hcHBlbmRPdXRwdXRMaW5lKCRvdXQsIFR5cGU6OlRfRElSRUNUSVZFLCAkcyAuICc7Jyk7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkZGlyZWN0aXZlLT5uYW1lID0gJHRoaXMtPmNvbXBpbGVEaXJlY3RpdmVOYW1lKCRkaXJlY3RpdmUtPm5hbWUpOwogICAgICAgICAgICAkcyA9ICdAJyAuICRkaXJlY3RpdmUtPm5hbWU7CgogICAgICAgICAgICBpZiAoISBlbXB0eSgkZGlyZWN0aXZlLT52YWx1ZSkpIHsKICAgICAgICAgICAgICAgICRzIC49ICcgJyAuICR0aGlzLT5jb21waWxlVmFsdWUoJGRpcmVjdGl2ZS0+dmFsdWUpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoJGRpcmVjdGl2ZS0+bmFtZSA9PT0gJ2tleWZyYW1lcycgfHwgc3Vic3RyKCRkaXJlY3RpdmUtPm5hbWUsIC0xMCkgPT09ICcta2V5ZnJhbWVzJykgewogICAgICAgICAgICAgICAgJHRoaXMtPmNvbXBpbGVLZXlmcmFtZUJsb2NrKCRkaXJlY3RpdmUsIFskc10pOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJHRoaXMtPmNvbXBpbGVOZXN0ZWRCbG9jaygkZGlyZWN0aXZlLCBbJHNdKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIGRpcmVjdGl2ZSBuYW1lcyBjYW4gaW5jbHVkZSBzb21lIGludGVycG9sYXRpb24KICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nfGFycmF5ICRkaXJlY3RpdmVOYW1lCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICogQHRocm93cyBDb21waWxlckV4Y2VwdGlvbgogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gY29tcGlsZURpcmVjdGl2ZU5hbWUoJGRpcmVjdGl2ZU5hbWUpCiAgICB7CiAgICAgICAgaWYgKGlzX3N0cmluZygkZGlyZWN0aXZlTmFtZSkpIHsKICAgICAgICAgICAgcmV0dXJuICRkaXJlY3RpdmVOYW1lOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICR0aGlzLT5jb21waWxlVmFsdWUoJGRpcmVjdGl2ZU5hbWUpOwogICAgfQoKICAgIC8qKgogICAgICogQ29tcGlsZSBhdC1yb290CiAgICAgKgogICAgICogQHBhcmFtIFxTY3NzUGhwXFNjc3NQaHBcQmxvY2sgJGJsb2NrCiAgICAgKgogICAgICogQHJldHVybiB2b2lkCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBjb21waWxlQXRSb290KEJsb2NrICRibG9jaykKICAgIHsKICAgICAgICBhc3NlcnQoJGJsb2NrIGluc3RhbmNlb2YgQXRSb290QmxvY2spOwogICAgICAgICRlbnYgICAgID0gJHRoaXMtPnB1c2hFbnYoJGJsb2NrKTsKICAgICAgICAkZW52cyAgICA9ICR0aGlzLT5jb21wYWN0RW52KCRlbnYpOwogICAgICAgIGxpc3QoJHdpdGgsICR3aXRob3V0KSA9ICR0aGlzLT5jb21waWxlV2l0aChpc3NldCgkYmxvY2stPndpdGgpID8gJGJsb2NrLT53aXRoIDogbnVsbCk7CgogICAgICAgIC8vIHdyYXAgaW5saW5lIHNlbGVjdG9yCiAgICAgICAgaWYgKCRibG9jay0+c2VsZWN0b3IpIHsKICAgICAgICAgICAgJHdyYXBwZWQgPSBuZXcgQmxvY2soKTsKICAgICAgICAgICAgJHdyYXBwZWQtPnNvdXJjZU5hbWUgICA9ICRibG9jay0+c291cmNlTmFtZTsKICAgICAgICAgICAgJHdyYXBwZWQtPnNvdXJjZUluZGV4ICA9ICRibG9jay0+c291cmNlSW5kZXg7CiAgICAgICAgICAgICR3cmFwcGVkLT5zb3VyY2VMaW5lICAgPSAkYmxvY2stPnNvdXJjZUxpbmU7CiAgICAgICAgICAgICR3cmFwcGVkLT5zb3VyY2VDb2x1bW4gPSAkYmxvY2stPnNvdXJjZUNvbHVtbjsKICAgICAgICAgICAgJHdyYXBwZWQtPnNlbGVjdG9ycyAgICA9ICRibG9jay0+c2VsZWN0b3I7CiAgICAgICAgICAgICR3cmFwcGVkLT5jb21tZW50cyAgICAgPSBbXTsKICAgICAgICAgICAgJHdyYXBwZWQtPnBhcmVudCAgICAgICA9ICRibG9jazsKICAgICAgICAgICAgJHdyYXBwZWQtPmNoaWxkcmVuICAgICA9ICRibG9jay0+Y2hpbGRyZW47CiAgICAgICAgICAgICR3cmFwcGVkLT5zZWxmUGFyZW50ICAgPSAkYmxvY2stPnNlbGZQYXJlbnQ7CgogICAgICAgICAgICAkYmxvY2stPmNoaWxkcmVuID0gW1tUeXBlOjpUX0JMT0NLLCAkd3JhcHBlZF1dOwogICAgICAgICAgICAkYmxvY2stPnNlbGVjdG9yID0gbnVsbDsKICAgICAgICB9CgogICAgICAgICRzZWxmUGFyZW50ID0gJGJsb2NrLT5zZWxmUGFyZW50OwogICAgICAgIGFzc2VydCgkc2VsZlBhcmVudCAhPT0gbnVsbCwgJ2F0LXJvb3QgYmxvY2tzIG11c3QgaGF2ZSBhIHNlbGZQYXJlbnQgc2V0LicpOwoKICAgICAgICBpZiAoCiAgICAgICAgICAgICEgJHNlbGZQYXJlbnQtPnNlbGVjdG9ycyAmJgogICAgICAgICAgICBpc3NldCgkYmxvY2stPnBhcmVudCkgJiYKICAgICAgICAgICAgaXNzZXQoJGJsb2NrLT5wYXJlbnQtPnNlbGVjdG9ycykgJiYgJGJsb2NrLT5wYXJlbnQtPnNlbGVjdG9ycwogICAgICAgICkgewogICAgICAgICAgICAkc2VsZlBhcmVudCA9ICRibG9jay0+cGFyZW50OwogICAgICAgIH0KCiAgICAgICAgJHRoaXMtPmVudiA9ICR0aGlzLT5maWx0ZXJXaXRoV2l0aG91dCgkZW52cywgJHdpdGgsICR3aXRob3V0KTsKCiAgICAgICAgYXNzZXJ0KCR0aGlzLT5zY29wZSAhPT0gbnVsbCk7CiAgICAgICAgJHNhdmVTY29wZSAgID0gJHRoaXMtPnNjb3BlOwogICAgICAgICR0aGlzLT5zY29wZSA9ICR0aGlzLT5maWx0ZXJTY29wZVdpdGhXaXRob3V0KCRzYXZlU2NvcGUsICR3aXRoLCAkd2l0aG91dCk7CgogICAgICAgIC8vIHByb3BhZ2F0ZSBzZWxmUGFyZW50IHRvIHRoZSBjaGlsZHJlbiB3aGVyZSB0aGV5IHN0aWxsIGNhbiBiZSB1c2VmdWwKICAgICAgICAkdGhpcy0+Y29tcGlsZUNoaWxkcmVuTm9SZXR1cm4oJGJsb2NrLT5jaGlsZHJlbiwgJHRoaXMtPnNjb3BlLCAkc2VsZlBhcmVudCk7CgogICAgICAgIGFzc2VydCgkdGhpcy0+c2NvcGUgIT09IG51bGwpOwogICAgICAgICR0aGlzLT5jb21wbGV0ZVNjb3BlKCR0aGlzLT5zY29wZSwgJHNhdmVTY29wZSk7CiAgICAgICAgJHRoaXMtPnNjb3BlID0gJHNhdmVTY29wZTsKICAgICAgICAkdGhpcy0+ZW52ICAgPSAkdGhpcy0+ZXh0cmFjdEVudigkZW52cyk7CgogICAgICAgICR0aGlzLT5wb3BFbnYoKTsKICAgIH0KCiAgICAvKioKICAgICAqIEZpbHRlciBhdC1yb290IHNjb3BlIGRlcGVuZGluZyBvbiB3aXRoL3dpdGhvdXQgb3B0aW9uCiAgICAgKgogICAgICogQHBhcmFtIFxTY3NzUGhwXFNjc3NQaHBcRm9ybWF0dGVyXE91dHB1dEJsb2NrICRzY29wZQogICAgICogQHBhcmFtIGFycmF5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR3aXRoCiAgICAgKiBAcGFyYW0gYXJyYXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHdpdGhvdXQKICAgICAqCiAgICAgKiBAcmV0dXJuIE91dHB1dEJsb2NrCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBmaWx0ZXJTY29wZVdpdGhXaXRob3V0KCRzY29wZSwgJHdpdGgsICR3aXRob3V0KQogICAgewogICAgICAgICRmaWx0ZXJlZFNjb3BlcyA9IFtdOwogICAgICAgICRjaGlsZFN0YXNoID0gW107CgogICAgICAgIGlmICgkc2NvcGUtPnR5cGUgPT09IFR5cGU6OlRfUk9PVCkgewogICAgICAgICAgICByZXR1cm4gJHNjb3BlOwogICAgICAgIH0KICAgICAgICBhc3NlcnQoJHRoaXMtPnJvb3RCbG9jayAhPT0gbnVsbCk7CgogICAgICAgIC8vIHN0YXJ0IGZyb20gdGhlIHJvb3QKICAgICAgICB3aGlsZSAoJHNjb3BlLT5wYXJlbnQgJiYgJHNjb3BlLT5wYXJlbnQtPnR5cGUgIT09IFR5cGU6OlRfUk9PVCkgewogICAgICAgICAgICBhcnJheV91bnNoaWZ0KCRjaGlsZFN0YXNoLCAkc2NvcGUpOwogICAgICAgICAgICBcYXNzZXJ0KCRzY29wZS0+cGFyZW50ICE9PSBudWxsKTsKICAgICAgICAgICAgJHNjb3BlID0gJHNjb3BlLT5wYXJlbnQ7CiAgICAgICAgfQoKICAgICAgICBmb3IgKDs7KSB7CiAgICAgICAgICAgIGlmICghICRzY29wZSkgewogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICgkdGhpcy0+aXNXaXRoKCRzY29wZSwgJHdpdGgsICR3aXRob3V0KSkgewogICAgICAgICAgICAgICAgJHMgPSBjbG9uZSAkc2NvcGU7CiAgICAgICAgICAgICAgICAkcy0+Y2hpbGRyZW4gPSBbXTsKICAgICAgICAgICAgICAgICRzLT5saW5lcyAgICA9IFtdOwogICAgICAgICAgICAgICAgJHMtPnBhcmVudCAgID0gbnVsbDsKCiAgICAgICAgICAgICAgICBpZiAoJHMtPnR5cGUgIT09IFR5cGU6OlRfTUVESUEgJiYgJHMtPnR5cGUgIT09IFR5cGU6OlRfRElSRUNUSVZFKSB7CiAgICAgICAgICAgICAgICAgICAgJHMtPnNlbGVjdG9ycyA9IFtdOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRmaWx0ZXJlZFNjb3Blc1tdID0gJHM7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChcY291bnQoJGNoaWxkU3Rhc2gpKSB7CiAgICAgICAgICAgICAgICAkc2NvcGUgPSBhcnJheV9zaGlmdCgkY2hpbGRTdGFzaCk7CiAgICAgICAgICAgIH0gZWxzZWlmICgkc2NvcGUtPmNoaWxkcmVuKSB7CiAgICAgICAgICAgICAgICAkc2NvcGUgPSBlbmQoJHNjb3BlLT5jaGlsZHJlbik7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkc2NvcGUgPSBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoISBcY291bnQoJGZpbHRlcmVkU2NvcGVzKSkgewogICAgICAgICAgICByZXR1cm4gJHRoaXMtPnJvb3RCbG9jazsKICAgICAgICB9CgogICAgICAgICRuZXdTY29wZSA9IGFycmF5X3NoaWZ0KCRmaWx0ZXJlZFNjb3Blcyk7CiAgICAgICAgJG5ld1Njb3BlLT5wYXJlbnQgPSAkdGhpcy0+cm9vdEJsb2NrOwoKICAgICAgICAkdGhpcy0+cm9vdEJsb2NrLT5jaGlsZHJlbltdID0gJG5ld1Njb3BlOwoKICAgICAgICAkcCA9ICYkbmV3U2NvcGU7CgogICAgICAgIHdoaWxlIChcY291bnQoJGZpbHRlcmVkU2NvcGVzKSkgewogICAgICAgICAgICAkcyA9IGFycmF5X3NoaWZ0KCRmaWx0ZXJlZFNjb3Blcyk7CiAgICAgICAgICAgICRzLT5wYXJlbnQgPSAkcDsKICAgICAgICAgICAgJHAtPmNoaWxkcmVuW10gPSAkczsKICAgICAgICAgICAgJG5ld1Njb3BlID0gJiRwLT5jaGlsZHJlblswXTsKICAgICAgICAgICAgJHAgPSAmJHAtPmNoaWxkcmVuWzBdOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRuZXdTY29wZTsKICAgIH0KCiAgICAvKioKICAgICAqIGZvdW5kIG1pc3Npbmcgc2VsZWN0b3IgZnJvbSBhIGF0LXJvb3QgY29tcGlsYXRpb24gaW4gdGhlIHByZXZpb3VzIHNjb3BlCiAgICAgKiAoaWYgYXQtcm9vdCBpcyBqdXN0IGVuY2xvc2luZyBhIHByb3BlcnR5LCB0aGUgc2VsZWN0b3IgaXMgaW4gdGhlIHBhcmVudCB0cmVlKQogICAgICoKICAgICAqIEBwYXJhbSBcU2Nzc1BocFxTY3NzUGhwXEZvcm1hdHRlclxPdXRwdXRCbG9jayAkc2NvcGUKICAgICAqIEBwYXJhbSBcU2Nzc1BocFxTY3NzUGhwXEZvcm1hdHRlclxPdXRwdXRCbG9jayAkcHJldmlvdXNTY29wZQogICAgICoKICAgICAqIEByZXR1cm4gT3V0cHV0QmxvY2sKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGNvbXBsZXRlU2NvcGUoJHNjb3BlLCAkcHJldmlvdXNTY29wZSkKICAgIHsKICAgICAgICBpZiAoISAkc2NvcGUtPnR5cGUgJiYgISAkc2NvcGUtPnNlbGVjdG9ycyAmJiBcY291bnQoJHNjb3BlLT5saW5lcykpIHsKICAgICAgICAgICAgJHNjb3BlLT5zZWxlY3RvcnMgPSAkdGhpcy0+ZmluZFNjb3BlU2VsZWN0b3JzKCRwcmV2aW91c1Njb3BlLCAkc2NvcGUtPmRlcHRoKTsKICAgICAgICB9CgogICAgICAgIGlmICgkc2NvcGUtPmNoaWxkcmVuKSB7CiAgICAgICAgICAgIGZvcmVhY2ggKCRzY29wZS0+Y2hpbGRyZW4gYXMgJGsgPT4gJGMpIHsKICAgICAgICAgICAgICAgICRzY29wZS0+Y2hpbGRyZW5bJGtdID0gJHRoaXMtPmNvbXBsZXRlU2NvcGUoJGMsICRwcmV2aW91c1Njb3BlKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRzY29wZTsKICAgIH0KCiAgICAvKioKICAgICAqIEZpbmQgYSBzZWxlY3RvciBieSB0aGUgZGVwdGggbm9kZSBpbiB0aGUgc2NvcGUKICAgICAqCiAgICAgKiBAcGFyYW0gXFNjc3NQaHBcU2Nzc1BocFxGb3JtYXR0ZXJcT3V0cHV0QmxvY2sgJHNjb3BlCiAgICAgKiBAcGFyYW0gaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGRlcHRoCiAgICAgKgogICAgICogQHJldHVybiBhcnJheQogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gZmluZFNjb3BlU2VsZWN0b3JzKCRzY29wZSwgJGRlcHRoKQogICAgewogICAgICAgIGlmICgkc2NvcGUtPmRlcHRoID09PSAkZGVwdGggJiYgJHNjb3BlLT5zZWxlY3RvcnMpIHsKICAgICAgICAgICAgcmV0dXJuICRzY29wZS0+c2VsZWN0b3JzOwogICAgICAgIH0KCiAgICAgICAgaWYgKCRzY29wZS0+Y2hpbGRyZW4pIHsKICAgICAgICAgICAgZm9yZWFjaCAoYXJyYXlfcmV2ZXJzZSgkc2NvcGUtPmNoaWxkcmVuKSBhcyAkYykgewogICAgICAgICAgICAgICAgaWYgKCRzID0gJHRoaXMtPmZpbmRTY29wZVNlbGVjdG9ycygkYywgJGRlcHRoKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIFtdOwogICAgfQoKICAgIC8qKgogICAgICogQ29tcGlsZSBAYXQtcm9vdCdzIHdpdGg6IGluY2x1c2lvbiAvIHdpdGhvdXQ6IGV4Y2x1c2lvbiBpbnRvIDIgbGlzdHMgdXNlcyB0byBmaWx0ZXIgc2NvcGUvZW52IGxhdGVyCiAgICAgKgogICAgICogQHBhcmFtIGFycmF5fG51bGwgJHdpdGhDb25kaXRpb24KICAgICAqCiAgICAgKiBAcmV0dXJuIGFycmF5CiAgICAgKgogICAgICogQHBocHN0YW4tcmV0dXJuIGFycmF5e2FycmF5PHN0cmluZywgYm9vbD4sIGFycmF5PHN0cmluZywgYm9vbD59CiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBjb21waWxlV2l0aCgkd2l0aENvbmRpdGlvbikKICAgIHsKICAgICAgICAvLyBqdXN0IGNvbXBpbGUgd2hhdCB3ZSBoYXZlIGluIDIgbGlzdHMKICAgICAgICAkd2l0aCA9IFtdOwogICAgICAgICR3aXRob3V0ID0gWydydWxlJyA9PiB0cnVlXTsKCiAgICAgICAgaWYgKCR3aXRoQ29uZGl0aW9uKSB7CiAgICAgICAgICAgIGlmICgkd2l0aENvbmRpdGlvblswXSA9PT0gVHlwZTo6VF9JTlRFUlBPTEFURSkgewogICAgICAgICAgICAgICAgJHcgPSAkdGhpcy0+Y29tcGlsZVZhbHVlKCR3aXRoQ29uZGl0aW9uKTsKCiAgICAgICAgICAgICAgICAkYnVmZmVyID0gIigkdykiOwogICAgICAgICAgICAgICAgJHBhcnNlciA9ICR0aGlzLT5wYXJzZXJGYWN0b3J5KF9fTUVUSE9EX18pOwoKICAgICAgICAgICAgICAgIGlmICgkcGFyc2VyLT5wYXJzZVZhbHVlKCRidWZmZXIsICRyZVBhcnNlZFdpdGgpKSB7CiAgICAgICAgICAgICAgICAgICAgXGFzc2VydChcaXNfYXJyYXkoJHJlUGFyc2VkV2l0aCkpOwogICAgICAgICAgICAgICAgICAgICR3aXRoQ29uZGl0aW9uID0gJHJlUGFyc2VkV2l0aDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHdpdGhDb25maWcgPSAkdGhpcy0+bWFwR2V0KCR3aXRoQ29uZGl0aW9uLCBzdGF0aWM6OiR3aXRoKTsKICAgICAgICAgICAgaWYgKCR3aXRoQ29uZmlnICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAkd2l0aG91dCA9IFtdOyAvLyBjYW5jZWwgdGhlIGRlZmF1bHQKICAgICAgICAgICAgICAgICRsaXN0ID0gJHRoaXMtPmNvZXJjZUxpc3QoJHdpdGhDb25maWcpOwoKICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRsaXN0WzJdIGFzICRpdGVtKSB7CiAgICAgICAgICAgICAgICAgICAgJGtleXdvcmQgPSAkdGhpcy0+Y29tcGlsZVN0cmluZ0NvbnRlbnQoJHRoaXMtPmNvZXJjZVN0cmluZygkaXRlbSkpOwoKICAgICAgICAgICAgICAgICAgICAkd2l0aFska2V5d29yZF0gPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAkd2l0aG91dENvbmZpZyA9ICR0aGlzLT5tYXBHZXQoJHdpdGhDb25kaXRpb24sIHN0YXRpYzo6JHdpdGhvdXQpOwogICAgICAgICAgICBpZiAoJHdpdGhvdXRDb25maWcgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgICR3aXRob3V0ID0gW107IC8vIGNhbmNlbCB0aGUgZGVmYXVsdAogICAgICAgICAgICAgICAgJGxpc3QgPSAkdGhpcy0+Y29lcmNlTGlzdCgkd2l0aG91dENvbmZpZyk7CgogICAgICAgICAgICAgICAgZm9yZWFjaCAoJGxpc3RbMl0gYXMgJGl0ZW0pIHsKICAgICAgICAgICAgICAgICAgICAka2V5d29yZCA9ICR0aGlzLT5jb21waWxlU3RyaW5nQ29udGVudCgkdGhpcy0+Y29lcmNlU3RyaW5nKCRpdGVtKSk7CgogICAgICAgICAgICAgICAgICAgICR3aXRob3V0WyRrZXl3b3JkXSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiBbJHdpdGgsICR3aXRob3V0XTsKICAgIH0KCiAgICAvKioKICAgICAqIEZpbHRlciBlbnYgc3RhY2sKICAgICAqCiAgICAgKiBAcGFyYW0gRW52aXJvbm1lbnRbXSAkZW52cwogICAgICogQHBhcmFtIGFycmF5ICR3aXRoCiAgICAgKiBAcGFyYW0gYXJyYXkgJHdpdGhvdXQKICAgICAqCiAgICAgKiBAcmV0dXJuIEVudmlyb25tZW50CiAgICAgKgogICAgICogQHBocHN0YW4tcGFyYW0gIG5vbi1lbXB0eS1hcnJheTxFbnZpcm9ubWVudD4gJGVudnMKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGZpbHRlcldpdGhXaXRob3V0KCRlbnZzLCAkd2l0aCwgJHdpdGhvdXQpCiAgICB7CiAgICAgICAgJGZpbHRlcmVkID0gW107CgogICAgICAgIGZvcmVhY2ggKCRlbnZzIGFzICRlKSB7CiAgICAgICAgICAgIGlmICgkZS0+YmxvY2sgJiYgISAkdGhpcy0+aXNXaXRoKCRlLT5ibG9jaywgJHdpdGgsICR3aXRob3V0KSkgewogICAgICAgICAgICAgICAgJGVjID0gY2xvbmUgJGU7CiAgICAgICAgICAgICAgICAkZWMtPmJsb2NrICAgICA9IG51bGw7CiAgICAgICAgICAgICAgICAkZWMtPnNlbGVjdG9ycyA9IFtdOwoKICAgICAgICAgICAgICAgICRmaWx0ZXJlZFtdID0gJGVjOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJGZpbHRlcmVkW10gPSAkZTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICR0aGlzLT5leHRyYWN0RW52KCRmaWx0ZXJlZCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBGaWx0ZXIgV0lUSCBydWxlcwogICAgICoKICAgICAqIEBwYXJhbSBcU2Nzc1BocFxTY3NzUGhwXEJsb2NrfFxTY3NzUGhwXFNjc3NQaHBcRm9ybWF0dGVyXE91dHB1dEJsb2NrICRibG9jawogICAgICogQHBhcmFtIGFycmF5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHdpdGgKICAgICAqIEBwYXJhbSBhcnJheSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR3aXRob3V0CiAgICAgKgogICAgICogQHJldHVybiBib29sCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBpc1dpdGgoJGJsb2NrLCAkd2l0aCwgJHdpdGhvdXQpCiAgICB7CiAgICAgICAgaWYgKGlzc2V0KCRibG9jay0+dHlwZSkpIHsKICAgICAgICAgICAgaWYgKCRibG9jay0+dHlwZSA9PT0gVHlwZTo6VF9NRURJQSkgewogICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT50ZXN0V2l0aFdpdGhvdXQoJ21lZGlhJywgJHdpdGgsICR3aXRob3V0KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCRibG9jay0+dHlwZSA9PT0gVHlwZTo6VF9ESVJFQ1RJVkUpIHsKICAgICAgICAgICAgICAgIGFzc2VydCgkYmxvY2sgaW5zdGFuY2VvZiBEaXJlY3RpdmVCbG9jayB8fCAkYmxvY2sgaW5zdGFuY2VvZiBPdXRwdXRCbG9jayk7CiAgICAgICAgICAgICAgICBpZiAoaXNzZXQoJGJsb2NrLT5uYW1lKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+dGVzdFdpdGhXaXRob3V0KCR0aGlzLT5jb21waWxlRGlyZWN0aXZlTmFtZSgkYmxvY2stPm5hbWUpLCAkd2l0aCwgJHdpdGhvdXQpOwogICAgICAgICAgICAgICAgfSBlbHNlaWYgKGlzc2V0KCRibG9jay0+c2VsZWN0b3JzKSAmJiBwcmVnX21hdGNoKCcsQChcdyspLGltcycsIGpzb25fZW5jb2RlKCRibG9jay0+c2VsZWN0b3JzKSwgJG0pKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT50ZXN0V2l0aFdpdGhvdXQoJG1bMV0sICR3aXRoLCAkd2l0aG91dCk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+dGVzdFdpdGhXaXRob3V0KCc/Pz8nLCAkd2l0aCwgJHdpdGhvdXQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlaWYgKGlzc2V0KCRibG9jay0+c2VsZWN0b3JzKSkgewogICAgICAgICAgICAvLyBhIHNlbGVjdG9yIHN0YXJ0aW5nIHdpdGggbnVtYmVyIGlzIGEga2V5ZnJhbWUgcnVsZQogICAgICAgICAgICBpZiAoXGNvdW50KCRibG9jay0+c2VsZWN0b3JzKSkgewogICAgICAgICAgICAgICAgJHMgPSByZXNldCgkYmxvY2stPnNlbGVjdG9ycyk7CgogICAgICAgICAgICAgICAgd2hpbGUgKFxpc19hcnJheSgkcykpIHsKICAgICAgICAgICAgICAgICAgICAkcyA9IHJlc2V0KCRzKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoXGlzX29iamVjdCgkcykgJiYgJHMgaW5zdGFuY2VvZiBOdW1iZXIpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPnRlc3RXaXRoV2l0aG91dCgna2V5ZnJhbWVzJywgJHdpdGgsICR3aXRob3V0KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuICR0aGlzLT50ZXN0V2l0aFdpdGhvdXQoJ3J1bGUnLCAkd2l0aCwgJHdpdGhvdXQpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgLyoqCiAgICAgKiBUZXN0IGEgc2luZ2xlIHR5cGUgb2YgYmxvY2sgYWdhaW5zdCB3aXRoL3dpdGhvdXQgbGlzdHMKICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICR3aGF0CiAgICAgKiBAcGFyYW0gYXJyYXkgICR3aXRoCiAgICAgKiBAcGFyYW0gYXJyYXkgICR3aXRob3V0CiAgICAgKgogICAgICogQHJldHVybiBib29sCiAgICAgKiAgIHRydWUgaWYgdGhlIGJsb2NrIHNob3VsZCBiZSBrZXB0LCBmYWxzZSB0byByZWplY3QKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIHRlc3RXaXRoV2l0aG91dCgkd2hhdCwgJHdpdGgsICR3aXRob3V0KQogICAgewogICAgICAgIC8vIGlmIHdpdGhvdXQsIHJlamVjdCBvbmx5IGlmIGluIHRoZSBsaXN0IChvciAnYWxsJyBpcyBpbiB0aGUgbGlzdCkKICAgICAgICBpZiAoXGNvdW50KCR3aXRob3V0KSkgewogICAgICAgICAgICByZXR1cm4gKGlzc2V0KCR3aXRob3V0WyR3aGF0XSkgfHwgaXNzZXQoJHdpdGhvdXRbJ2FsbCddKSkgPyBmYWxzZSA6IHRydWU7CiAgICAgICAgfQoKICAgICAgICAvLyBvdGhlcndpc2UgcmVqZWN0IGFsbCB3aGF0IGlzIG5vdCBpbiB0aGUgd2l0aCBsaXN0CiAgICAgICAgcmV0dXJuIChpc3NldCgkd2l0aFskd2hhdF0pIHx8IGlzc2V0KCR3aXRoWydhbGwnXSkpID8gdHJ1ZSA6IGZhbHNlOwogICAgfQoKCiAgICAvKioKICAgICAqIENvbXBpbGUga2V5ZnJhbWUgYmxvY2sKICAgICAqCiAgICAgKiBAcGFyYW0gXFNjc3NQaHBcU2Nzc1BocFxCbG9jayAkYmxvY2sKICAgICAqIEBwYXJhbSBzdHJpbmdbXSAgICAgICAgICAgICAgICRzZWxlY3RvcnMKICAgICAqCiAgICAgKiBAcmV0dXJuIHZvaWQKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGNvbXBpbGVLZXlmcmFtZUJsb2NrKEJsb2NrICRibG9jaywgJHNlbGVjdG9ycykKICAgIHsKICAgICAgICAkZW52ID0gJHRoaXMtPnB1c2hFbnYoJGJsb2NrKTsKCiAgICAgICAgJGVudnMgPSAkdGhpcy0+Y29tcGFjdEVudigkZW52KTsKCiAgICAgICAgJHRoaXMtPmVudiA9ICR0aGlzLT5leHRyYWN0RW52KGFycmF5X2ZpbHRlcigkZW52cywgZnVuY3Rpb24gKEVudmlyb25tZW50ICRlKSB7CiAgICAgICAgICAgIHJldHVybiAhIGlzc2V0KCRlLT5ibG9jay0+c2VsZWN0b3JzKTsKICAgICAgICB9KSk7CgogICAgICAgICR0aGlzLT5zY29wZSA9ICR0aGlzLT5tYWtlT3V0cHV0QmxvY2soJGJsb2NrLT50eXBlLCAkc2VsZWN0b3JzKTsKICAgICAgICAkdGhpcy0+c2NvcGUtPmRlcHRoID0gMTsKICAgICAgICBhc3NlcnQoJHRoaXMtPnNjb3BlLT5wYXJlbnQgIT09IG51bGwpOwogICAgICAgICR0aGlzLT5zY29wZS0+cGFyZW50LT5jaGlsZHJlbltdID0gJHRoaXMtPnNjb3BlOwoKICAgICAgICAkdGhpcy0+Y29tcGlsZUNoaWxkcmVuTm9SZXR1cm4oJGJsb2NrLT5jaGlsZHJlbiwgJHRoaXMtPnNjb3BlKTsKCiAgICAgICAgYXNzZXJ0KCR0aGlzLT5zY29wZSAhPT0gbnVsbCk7CiAgICAgICAgJHRoaXMtPnNjb3BlID0gJHRoaXMtPnNjb3BlLT5wYXJlbnQ7CiAgICAgICAgJHRoaXMtPmVudiAgID0gJHRoaXMtPmV4dHJhY3RFbnYoJGVudnMpOwoKICAgICAgICAkdGhpcy0+cG9wRW52KCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDb21waWxlIG5lc3RlZCBwcm9wZXJ0aWVzIGxpbmVzCiAgICAgKgogICAgICogQHBhcmFtIFxTY3NzUGhwXFNjc3NQaHBcQmxvY2sgICAgICAgICAgICAgICAgICRibG9jawogICAgICogQHBhcmFtIFxTY3NzUGhwXFNjc3NQaHBcRm9ybWF0dGVyXE91dHB1dEJsb2NrICRvdXQKICAgICAqCiAgICAgKiBAcmV0dXJuIHZvaWQKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGNvbXBpbGVOZXN0ZWRQcm9wZXJ0aWVzQmxvY2soQmxvY2sgJGJsb2NrLCBPdXRwdXRCbG9jayAkb3V0KQogICAgewogICAgICAgIGFzc2VydCgkYmxvY2sgaW5zdGFuY2VvZiBOZXN0ZWRQcm9wZXJ0eUJsb2NrKTsKICAgICAgICAkcHJlZml4ID0gJHRoaXMtPmNvbXBpbGVWYWx1ZSgkYmxvY2stPnByZWZpeCkgLiAnLSc7CgogICAgICAgICRuZXN0ZWQgPSAkdGhpcy0+bWFrZU91dHB1dEJsb2NrKCRibG9jay0+dHlwZSk7CiAgICAgICAgJG5lc3RlZC0+cGFyZW50ID0gJG91dDsKCiAgICAgICAgaWYgKCRibG9jay0+aGFzVmFsdWUpIHsKICAgICAgICAgICAgJG5lc3RlZC0+ZGVwdGggPSAkb3V0LT5kZXB0aCArIDE7CiAgICAgICAgfQoKICAgICAgICAkb3V0LT5jaGlsZHJlbltdID0gJG5lc3RlZDsKCiAgICAgICAgZm9yZWFjaCAoJGJsb2NrLT5jaGlsZHJlbiBhcyAkY2hpbGQpIHsKICAgICAgICAgICAgc3dpdGNoICgkY2hpbGRbMF0pIHsKICAgICAgICAgICAgICAgIGNhc2UgVHlwZTo6VF9BU1NJR046CiAgICAgICAgICAgICAgICAgICAgYXJyYXlfdW5zaGlmdCgkY2hpbGRbMV1bMl0sICRwcmVmaXgpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgIGNhc2UgVHlwZTo6VF9ORVNURURfUFJPUEVSVFk6CiAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KCRjaGlsZFsxXSBpbnN0YW5jZW9mIE5lc3RlZFByb3BlcnR5QmxvY2spOwogICAgICAgICAgICAgICAgICAgIGFycmF5X3Vuc2hpZnQoJGNoaWxkWzFdLT5wcmVmaXhbMl0sICRwcmVmaXgpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkdGhpcy0+Y29tcGlsZUNoaWxkKCRjaGlsZCwgJG5lc3RlZCk7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQ29tcGlsZSBuZXN0ZWQgYmxvY2sKICAgICAqCiAgICAgKiBAcGFyYW0gXFNjc3NQaHBcU2Nzc1BocFxCbG9jayAkYmxvY2sKICAgICAqIEBwYXJhbSBzdHJpbmdbXSAgICAgICAgICAgICAgICRzZWxlY3RvcnMKICAgICAqCiAgICAgKiBAcmV0dXJuIHZvaWQKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGNvbXBpbGVOZXN0ZWRCbG9jayhCbG9jayAkYmxvY2ssICRzZWxlY3RvcnMpCiAgICB7CiAgICAgICAgJHRoaXMtPnB1c2hFbnYoJGJsb2NrKTsKCiAgICAgICAgJHRoaXMtPnNjb3BlID0gJHRoaXMtPm1ha2VPdXRwdXRCbG9jaygkYmxvY2stPnR5cGUsICRzZWxlY3RvcnMpOwogICAgICAgIGFzc2VydCgkdGhpcy0+c2NvcGUtPnBhcmVudCAhPT0gbnVsbCk7CiAgICAgICAgJHRoaXMtPnNjb3BlLT5wYXJlbnQtPmNoaWxkcmVuW10gPSAkdGhpcy0+c2NvcGU7CgogICAgICAgIC8vIHdyYXAgYXNzaWduIGNoaWxkcmVuIGluIGEgYmxvY2sKICAgICAgICAvLyBleGNlcHQgZm9yIEBmb250LWZhY2UKICAgICAgICBpZiAoISRibG9jayBpbnN0YW5jZW9mIERpcmVjdGl2ZUJsb2NrIHx8ICR0aGlzLT5jb21waWxlRGlyZWN0aXZlTmFtZSgkYmxvY2stPm5hbWUpICE9PSAnZm9udC1mYWNlJykgewogICAgICAgICAgICAvLyBuZWVkIHdyYXBwaW5nPwogICAgICAgICAgICAkbmVlZFdyYXBwaW5nID0gZmFsc2U7CgogICAgICAgICAgICBmb3JlYWNoICgkYmxvY2stPmNoaWxkcmVuIGFzICRjaGlsZCkgewogICAgICAgICAgICAgICAgaWYgKCRjaGlsZFswXSA9PT0gVHlwZTo6VF9BU1NJR04pIHsKICAgICAgICAgICAgICAgICAgICAkbmVlZFdyYXBwaW5nID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCRuZWVkV3JhcHBpbmcpIHsKICAgICAgICAgICAgICAgICR3cmFwcGVkID0gbmV3IEJsb2NrKCk7CiAgICAgICAgICAgICAgICAkd3JhcHBlZC0+c291cmNlTmFtZSAgID0gJGJsb2NrLT5zb3VyY2VOYW1lOwogICAgICAgICAgICAgICAgJHdyYXBwZWQtPnNvdXJjZUluZGV4ICA9ICRibG9jay0+c291cmNlSW5kZXg7CiAgICAgICAgICAgICAgICAkd3JhcHBlZC0+c291cmNlTGluZSAgID0gJGJsb2NrLT5zb3VyY2VMaW5lOwogICAgICAgICAgICAgICAgJHdyYXBwZWQtPnNvdXJjZUNvbHVtbiA9ICRibG9jay0+c291cmNlQ29sdW1uOwogICAgICAgICAgICAgICAgJHdyYXBwZWQtPnNlbGVjdG9ycyAgICA9IFtdOwogICAgICAgICAgICAgICAgJHdyYXBwZWQtPmNvbW1lbnRzICAgICA9IFtdOwogICAgICAgICAgICAgICAgJHdyYXBwZWQtPnBhcmVudCAgICAgICA9ICRibG9jazsKICAgICAgICAgICAgICAgICR3cmFwcGVkLT5jaGlsZHJlbiAgICAgPSAkYmxvY2stPmNoaWxkcmVuOwogICAgICAgICAgICAgICAgJHdyYXBwZWQtPnNlbGZQYXJlbnQgICA9ICRibG9jay0+c2VsZlBhcmVudDsKCiAgICAgICAgICAgICAgICAkYmxvY2stPmNoaWxkcmVuID0gW1tUeXBlOjpUX0JMT0NLLCAkd3JhcHBlZF1dOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkdGhpcy0+Y29tcGlsZUNoaWxkcmVuTm9SZXR1cm4oJGJsb2NrLT5jaGlsZHJlbiwgJHRoaXMtPnNjb3BlKTsKCiAgICAgICAgYXNzZXJ0KCR0aGlzLT5zY29wZSAhPT0gbnVsbCk7CiAgICAgICAgJHRoaXMtPnNjb3BlID0gJHRoaXMtPnNjb3BlLT5wYXJlbnQ7CgogICAgICAgICR0aGlzLT5wb3BFbnYoKTsKICAgIH0KCiAgICAvKioKICAgICAqIFJlY3Vyc2l2ZWx5IGNvbXBpbGVzIGEgYmxvY2suCiAgICAgKgogICAgICogQSBibG9jayBpcyBhbmFsb2dvdXMgdG8gYSBDU1MgYmxvY2sgaW4gbW9zdCBjYXNlcy4gQSBzaW5nbGUgU0NTUyBkb2N1bWVudAogICAgICogaXMgZW5jYXBzdWxhdGVkIGluIGEgYmxvY2sgd2hlbiBwYXJzZWQsIGJ1dCBpdCBkb2VzIG5vdCBoYXZlIHBhcmVudCB0YWdzCiAgICAgKiBzbyBhbGwgb2YgaXRzIGNoaWxkcmVuIGFwcGVhciBvbiB0aGUgcm9vdCBsZXZlbCB3aGVuIGNvbXBpbGVkLgogICAgICoKICAgICAqIEJsb2NrcyBhcmUgbWFkZSB1cCBvZiBzZWxlY3RvcnMgYW5kIGNoaWxkcmVuLgogICAgICoKICAgICAqIFRoZSBjaGlsZHJlbiBvZiBhIGJsb2NrIGFyZSBqdXN0IGFsbCB0aGUgYmxvY2tzIHRoYXQgYXJlIGRlZmluZWQgd2l0aGluLgogICAgICoKICAgICAqIENvbXBpbGluZyB0aGUgYmxvY2sgaW52b2x2ZXMgcHVzaGluZyBhIGZyZXNoIGVudmlyb25tZW50IG9uIHRoZSBzdGFjaywKICAgICAqIGFuZCBpdGVyYXRpbmcgdGhyb3VnaCB0aGUgcHJvcHMsIGNvbXBpbGluZyBlYWNoIG9uZS4KICAgICAqCiAgICAgKiBAc2VlIENvbXBpbGVyOjpjb21waWxlQ2hpbGQoKQogICAgICoKICAgICAqIEBwYXJhbSBcU2Nzc1BocFxTY3NzUGhwXEJsb2NrICRibG9jawogICAgICoKICAgICAqIEByZXR1cm4gdm9pZAogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gY29tcGlsZUJsb2NrKEJsb2NrICRibG9jaykKICAgIHsKICAgICAgICAkZW52ID0gJHRoaXMtPnB1c2hFbnYoJGJsb2NrKTsKICAgICAgICBhc3NlcnQoJGJsb2NrLT5zZWxlY3RvcnMgIT09IG51bGwpOwogICAgICAgICRlbnYtPnNlbGVjdG9ycyA9ICR0aGlzLT5ldmFsU2VsZWN0b3JzKCRibG9jay0+c2VsZWN0b3JzKTsKCiAgICAgICAgJG91dCA9ICR0aGlzLT5tYWtlT3V0cHV0QmxvY2sobnVsbCk7CgogICAgICAgIGFzc2VydCgkdGhpcy0+c2NvcGUgIT09IG51bGwpOwogICAgICAgICR0aGlzLT5zY29wZS0+Y2hpbGRyZW5bXSA9ICRvdXQ7CgogICAgICAgIGlmIChcY291bnQoJGJsb2NrLT5jaGlsZHJlbikpIHsKICAgICAgICAgICAgJG91dC0+c2VsZWN0b3JzID0gJHRoaXMtPm11bHRpcGx5U2VsZWN0b3JzKCRlbnYsICRibG9jay0+c2VsZlBhcmVudCk7CgogICAgICAgICAgICAvLyBwcm9wYWdhdGUgc2VsZlBhcmVudCB0byB0aGUgY2hpbGRyZW4gd2hlcmUgdGhleSBzdGlsbCBjYW4gYmUgdXNlZnVsCiAgICAgICAgICAgICRzZWxmUGFyZW50U2VsZWN0b3JzID0gbnVsbDsKCiAgICAgICAgICAgIGlmIChpc3NldCgkYmxvY2stPnNlbGZQYXJlbnQtPnNlbGVjdG9ycykpIHsKICAgICAgICAgICAgICAgICRzZWxmUGFyZW50U2VsZWN0b3JzID0gJGJsb2NrLT5zZWxmUGFyZW50LT5zZWxlY3RvcnM7CiAgICAgICAgICAgICAgICAkYmxvY2stPnNlbGZQYXJlbnQtPnNlbGVjdG9ycyA9ICRvdXQtPnNlbGVjdG9yczsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHRoaXMtPmNvbXBpbGVDaGlsZHJlbk5vUmV0dXJuKCRibG9jay0+Y2hpbGRyZW4sICRvdXQsICRibG9jay0+c2VsZlBhcmVudCk7CgogICAgICAgICAgICAvLyBhbmQgcmV2ZXJ0IGZvciB0aGUgZm9sbG93aW5nIGNoaWxkcmVuIG9mIHRoZSBzYW1lIGJsb2NrCiAgICAgICAgICAgIGlmICgkc2VsZlBhcmVudFNlbGVjdG9ycykgewogICAgICAgICAgICAgICAgYXNzZXJ0KCRibG9jay0+c2VsZlBhcmVudCAhPT0gbnVsbCk7CiAgICAgICAgICAgICAgICAkYmxvY2stPnNlbGZQYXJlbnQtPnNlbGVjdG9ycyA9ICRzZWxmUGFyZW50U2VsZWN0b3JzOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkdGhpcy0+cG9wRW52KCk7CiAgICB9CgoKICAgIC8qKgogICAgICogQ29tcGlsZSB0aGUgdmFsdWUgb2YgYSBjb21tZW50IHRoYXQgY2FuIGhhdmUgaW50ZXJwb2xhdGlvbgogICAgICoKICAgICAqIEBwYXJhbSBhcnJheSAkdmFsdWUKICAgICAqIEBwYXJhbSBib29sICAkcHVzaEVudgogICAgICoKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBjb21waWxlQ29tbWVudFZhbHVlKCR2YWx1ZSwgJHB1c2hFbnYgPSBmYWxzZSkKICAgIHsKICAgICAgICAkYyA9ICR2YWx1ZVsxXTsKCiAgICAgICAgaWYgKGlzc2V0KCR2YWx1ZVsyXSkpIHsKICAgICAgICAgICAgaWYgKCRwdXNoRW52KSB7CiAgICAgICAgICAgICAgICAkdGhpcy0+cHVzaEVudigpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgJGMgPSAkdGhpcy0+Y29tcGlsZVZhbHVlKCR2YWx1ZVsyXSk7CiAgICAgICAgICAgIH0gY2F0Y2ggKFNhc3NTY3JpcHRFeGNlcHRpb24gJGUpIHsKICAgICAgICAgICAgICAgICR0aGlzLT5sb2dnZXItPndhcm4oJ0lnbm9yaW5nIGludGVycG9sYXRpb24gZXJyb3JzIGluIG11bHRpbGluZSBjb21tZW50cyBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gU2Nzc1BocCAyLjAuICcgLiAkdGhpcy0+YWRkTG9jYXRpb25Ub01lc3NhZ2UoJGUtPmdldE1lc3NhZ2UoKSksIHRydWUpOwogICAgICAgICAgICAgICAgLy8gaWdub3JlIGVycm9yIGluIGNvbW1lbnQgY29tcGlsYXRpb24gd2hpY2ggYXJlIG9ubHkgaW50ZXJwb2xhdGlvbgogICAgICAgICAgICB9IGNhdGNoIChTYXNzRXhjZXB0aW9uICRlKSB7CiAgICAgICAgICAgICAgICAkdGhpcy0+bG9nZ2VyLT53YXJuKCdJZ25vcmluZyBpbnRlcnBvbGF0aW9uIGVycm9ycyBpbiBtdWx0aWxpbmUgY29tbWVudHMgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIFNjc3NQaHAgMi4wLiAnIC4gJGUtPmdldE1lc3NhZ2UoKSwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAvLyBpZ25vcmUgZXJyb3IgaW4gY29tbWVudCBjb21waWxhdGlvbiB3aGljaCBhcmUgb25seSBpbnRlcnBvbGF0aW9uCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICgkcHVzaEVudikgewogICAgICAgICAgICAgICAgJHRoaXMtPnBvcEVudigpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJGM7CiAgICB9CgogICAgLyoqCiAgICAgKiBDb21waWxlIHJvb3QgbGV2ZWwgY29tbWVudAogICAgICoKICAgICAqIEBwYXJhbSBhcnJheSAkYmxvY2sKICAgICAqCiAgICAgKiBAcmV0dXJuIHZvaWQKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGNvbXBpbGVDb21tZW50KCRibG9jaykKICAgIHsKICAgICAgICAkb3V0ID0gJHRoaXMtPm1ha2VPdXRwdXRCbG9jayhUeXBlOjpUX0NPTU1FTlQpOwogICAgICAgICRvdXQtPmxpbmVzW10gPSAkdGhpcy0+Y29tcGlsZUNvbW1lbnRWYWx1ZSgkYmxvY2ssIHRydWUpOwoKICAgICAgICBhc3NlcnQoJHRoaXMtPnNjb3BlICE9PSBudWxsKTsKICAgICAgICAkdGhpcy0+c2NvcGUtPmNoaWxkcmVuW10gPSAkb3V0OwogICAgfQoKICAgIC8qKgogICAgICogRXZhbHVhdGUgc2VsZWN0b3JzCiAgICAgKgogICAgICogQHBhcmFtIGFycmF5ICRzZWxlY3RvcnMKICAgICAqCiAgICAgKiBAcmV0dXJuIGFycmF5CiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBldmFsU2VsZWN0b3JzKCRzZWxlY3RvcnMpCiAgICB7CiAgICAgICAgJHRoaXMtPnNob3VsZEV2YWx1YXRlID0gZmFsc2U7CgogICAgICAgICRldmFsdWF0ZWRTZWxlY3RvcnMgPSBbXTsKICAgICAgICBmb3JlYWNoICgkc2VsZWN0b3JzIGFzICRzZWxlY3RvcikgewogICAgICAgICAgICAkZXZhbHVhdGVkU2VsZWN0b3JzW10gPSAkdGhpcy0+ZXZhbFNlbGVjdG9yKCRzZWxlY3Rvcik7CiAgICAgICAgfQogICAgICAgICRzZWxlY3RvcnMgPSAkZXZhbHVhdGVkU2VsZWN0b3JzOwoKICAgICAgICAvLyBhZnRlciBldmFsdWF0aW5nIGludGVycG9sYXRlcywgd2UgbWlnaHQgbmVlZCBhIHNlY29uZCBwYXNzCiAgICAgICAgaWYgKCR0aGlzLT5zaG91bGRFdmFsdWF0ZSkgewogICAgICAgICAgICAkc2VsZWN0b3JzID0gJHRoaXMtPnJlcGxhY2VTZWxmU2VsZWN0b3IoJHNlbGVjdG9ycywgJyYnKTsKICAgICAgICAgICAgJGJ1ZmZlciAgICA9ICR0aGlzLT5jb2xsYXBzZVNlbGVjdG9ycygkc2VsZWN0b3JzKTsKICAgICAgICAgICAgJHBhcnNlciAgICA9ICR0aGlzLT5wYXJzZXJGYWN0b3J5KF9fTUVUSE9EX18pOwoKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICRpc1ZhbGlkID0gJHBhcnNlci0+cGFyc2VTZWxlY3RvcigkYnVmZmVyLCAkbmV3U2VsZWN0b3JzLCB0cnVlKTsKICAgICAgICAgICAgfSBjYXRjaCAoUGFyc2VyRXhjZXB0aW9uICRlKSB7CiAgICAgICAgICAgICAgICB0aHJvdyAkdGhpcy0+ZXJyb3IoJGUtPmdldE1lc3NhZ2UoKSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICgkaXNWYWxpZCkgewogICAgICAgICAgICAgICAgJHNlbGVjdG9ycyA9IGFycmF5X21hcChbJHRoaXMsICdldmFsU2VsZWN0b3InXSwgJG5ld1NlbGVjdG9ycyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiAkc2VsZWN0b3JzOwogICAgfQoKICAgIC8qKgogICAgICogRXZhbHVhdGUgc2VsZWN0b3IKICAgICAqCiAgICAgKiBAcGFyYW0gYXJyYXkgJHNlbGVjdG9yCiAgICAgKgogICAgICogQHJldHVybiBhcnJheQogICAgICoKICAgICAqIEBwaHBzdGFuLWltcHVyZQogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gZXZhbFNlbGVjdG9yKCRzZWxlY3RvcikKICAgIHsKICAgICAgICByZXR1cm4gYXJyYXlfbWFwKFskdGhpcywgJ2V2YWxTZWxlY3RvclBhcnQnXSwgJHNlbGVjdG9yKTsKICAgIH0KCiAgICAvKioKICAgICAqIEV2YWx1YXRlIHNlbGVjdG9yIHBhcnQ7IHJlcGxhY2VzIGFsbCB0aGUgaW50ZXJwb2xhdGVzLCBzdHJpcHBpbmcgcXVvdGVzCiAgICAgKgogICAgICogQHBhcmFtIGFycmF5ICRwYXJ0CiAgICAgKgogICAgICogQHJldHVybiBhcnJheQogICAgICoKICAgICAqIEBwaHBzdGFuLWltcHVyZQogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gZXZhbFNlbGVjdG9yUGFydCgkcGFydCkKICAgIHsKICAgICAgICBmb3JlYWNoICgkcGFydCBhcyAmJHApIHsKICAgICAgICAgICAgaWYgKFxpc19hcnJheSgkcCkgJiYgKCRwWzBdID09PSBUeXBlOjpUX0lOVEVSUE9MQVRFIHx8ICRwWzBdID09PSBUeXBlOjpUX1NUUklORykpIHsKICAgICAgICAgICAgICAgICRwID0gJHRoaXMtPmNvbXBpbGVWYWx1ZSgkcCk7CgogICAgICAgICAgICAgICAgLy8gZm9yY2UgcmUtZXZhbHVhdGlvbiBpZiBzZWxmIGNoYXIgb3Igbm9uIHN0YW5kYXJkIGNoYXIKICAgICAgICAgICAgICAgIGlmIChwcmVnX21hdGNoKCcsW15cdy1dLCcsICRwKSkgewogICAgICAgICAgICAgICAgICAgICR0aGlzLT5zaG91bGRFdmFsdWF0ZSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZWlmICgKICAgICAgICAgICAgICAgIFxpc19zdHJpbmcoJHApICYmIFxzdHJsZW4oJHApID49IDIgJiYKICAgICAgICAgICAgICAgICgkcFswXSA9PT0gJyInIHx8ICRwWzBdID09PSAiJyIpICYmCiAgICAgICAgICAgICAgICBzdWJzdHIoJHAsIC0xKSA9PT0gJHBbMF0KICAgICAgICAgICAgKSB7CiAgICAgICAgICAgICAgICAkcCA9IHN1YnN0cigkcCwgMSwgLTEpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJHRoaXMtPmZsYXR0ZW5TZWxlY3RvclNpbmdsZSgkcGFydCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDb2xsYXBzZSBzZWxlY3RvcnMKICAgICAqCiAgICAgKiBAcGFyYW0gYXJyYXkgJHNlbGVjdG9ycwogICAgICoKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBjb2xsYXBzZVNlbGVjdG9ycygkc2VsZWN0b3JzKQogICAgewogICAgICAgICRwYXJ0cyA9IFtdOwoKICAgICAgICBmb3JlYWNoICgkc2VsZWN0b3JzIGFzICRzZWxlY3RvcikgewogICAgICAgICAgICAkb3V0cHV0ID0gW107CgogICAgICAgICAgICBmb3JlYWNoICgkc2VsZWN0b3IgYXMgJG5vZGUpIHsKICAgICAgICAgICAgICAgICRjb21wb3VuZCA9ICcnOwoKICAgICAgICAgICAgICAgIGlmICghaXNfYXJyYXkoJG5vZGUpKSB7CiAgICAgICAgICAgICAgICAgICAgJG91dHB1dFtdID0gJG5vZGU7CiAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgYXJyYXlfd2Fsa19yZWN1cnNpdmUoCiAgICAgICAgICAgICAgICAgICAgJG5vZGUsCiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKCR2YWx1ZSwgJGtleSkgdXNlICgmJGNvbXBvdW5kKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRjb21wb3VuZCAuPSAkdmFsdWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAkb3V0cHV0W10gPSAkY29tcG91bmQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRwYXJ0c1tdID0gaW1wbG9kZSgnICcsICRvdXRwdXQpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGltcGxvZGUoJywgJywgJHBhcnRzKTsKICAgIH0KCiAgICAvKioKICAgICAqIENvbGxhcHNlIHNlbGVjdG9ycwogICAgICoKICAgICAqIEBwYXJhbSBhcnJheSAkc2VsZWN0b3JzCiAgICAgKgogICAgICogQHJldHVybiBhcnJheQogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIGNvbGxhcHNlU2VsZWN0b3JzQXNMaXN0KCRzZWxlY3RvcnMpCiAgICB7CiAgICAgICAgJHBhcnRzID0gW107CgogICAgICAgIGZvcmVhY2ggKCRzZWxlY3RvcnMgYXMgJHNlbGVjdG9yKSB7CiAgICAgICAgICAgICRvdXRwdXQgPSBbXTsKICAgICAgICAgICAgJGdsdWVOZXh0ID0gZmFsc2U7CgogICAgICAgICAgICBmb3JlYWNoICgkc2VsZWN0b3IgYXMgJG5vZGUpIHsKICAgICAgICAgICAgICAgICRjb21wb3VuZCA9ICcnOwoKICAgICAgICAgICAgICAgIGlmICghaXNfYXJyYXkoJG5vZGUpKSB7CiAgICAgICAgICAgICAgICAgICAgJGNvbXBvdW5kIC49ICRub2RlOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBhcnJheV93YWxrX3JlY3Vyc2l2ZSgKICAgICAgICAgICAgICAgICAgICAgICAgJG5vZGUsCiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICgkdmFsdWUsICRrZXkpIHVzZSAoJiRjb21wb3VuZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGNvbXBvdW5kIC49ICR2YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCR0aGlzLT5pc0ltbWVkaWF0ZVJlbGF0aW9uc2hpcENvbWJpbmF0b3IoJGNvbXBvdW5kKSkgewogICAgICAgICAgICAgICAgICAgIGlmIChcY291bnQoJG91dHB1dCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJG91dHB1dFtcY291bnQoJG91dHB1dCkgLSAxXSAuPSAnICcgLiAkY29tcG91bmQ7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgJG91dHB1dFtdID0gJGNvbXBvdW5kOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgJGdsdWVOZXh0ID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0gZWxzZWlmICgkZ2x1ZU5leHQpIHsKICAgICAgICAgICAgICAgICAgICAkb3V0cHV0W1xjb3VudCgkb3V0cHV0KSAtIDFdIC49ICcgJyAuICRjb21wb3VuZDsKICAgICAgICAgICAgICAgICAgICAkZ2x1ZU5leHQgPSBmYWxzZTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJG91dHB1dFtdID0gJGNvbXBvdW5kOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBmb3JlYWNoICgkb3V0cHV0IGFzICYkbykgewogICAgICAgICAgICAgICAgJG8gPSBbVHlwZTo6VF9TVFJJTkcsICcnLCBbJG9dXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHBhcnRzW10gPSBbVHlwZTo6VF9MSVNULCAnICcsICRvdXRwdXRdOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIFtUeXBlOjpUX0xJU1QsICcsJywgJHBhcnRzXTsKICAgIH0KCiAgICAvKioKICAgICAqIFBhcnNlIGRvd24gdGhlIHNlbGVjdG9yIGFuZCByZXZlcnQgW3NlbGZdIHRvICImIiBiZWZvcmUgYSByZXBhcnNpbmcKICAgICAqCiAgICAgKiBAcGFyYW0gYXJyYXkgICAgICAgJHNlbGVjdG9ycwogICAgICogQHBhcmFtIHN0cmluZ3xudWxsICRyZXBsYWNlCiAgICAgKgogICAgICogQHJldHVybiBhcnJheQogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gcmVwbGFjZVNlbGZTZWxlY3Rvcigkc2VsZWN0b3JzLCAkcmVwbGFjZSA9IG51bGwpCiAgICB7CiAgICAgICAgZm9yZWFjaCAoJHNlbGVjdG9ycyBhcyAmJHBhcnQpIHsKICAgICAgICAgICAgaWYgKFxpc19hcnJheSgkcGFydCkpIHsKICAgICAgICAgICAgICAgIGlmICgkcGFydCA9PT0gW1R5cGU6OlRfU0VMRl0pIHsKICAgICAgICAgICAgICAgICAgICBpZiAoXGlzX251bGwoJHJlcGxhY2UpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRyZXBsYWNlID0gJHRoaXMtPnJlZHVjZShbVHlwZTo6VF9TRUxGXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICRyZXBsYWNlID0gJHRoaXMtPmNvbXBpbGVWYWx1ZSgkcmVwbGFjZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICRwYXJ0ID0gJHJlcGxhY2U7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICRwYXJ0ID0gJHRoaXMtPnJlcGxhY2VTZWxmU2VsZWN0b3IoJHBhcnQsICRyZXBsYWNlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRzZWxlY3RvcnM7CiAgICB9CgogICAgLyoqCiAgICAgKiBGbGF0dGVuIHNlbGVjdG9yIHNpbmdsZTsgam9pbnMgdG9nZXRoZXIgLmNsYXNzZXMgYW5kICNpZHMKICAgICAqCiAgICAgKiBAcGFyYW0gYXJyYXkgJHNpbmdsZQogICAgICoKICAgICAqIEByZXR1cm4gYXJyYXkKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGZsYXR0ZW5TZWxlY3RvclNpbmdsZSgkc2luZ2xlKQogICAgewogICAgICAgICRqb2luZWQgPSBbXTsKCiAgICAgICAgZm9yZWFjaCAoJHNpbmdsZSBhcyAkcGFydCkgewogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICBlbXB0eSgkam9pbmVkKSB8fAogICAgICAgICAgICAgICAgISBcaXNfc3RyaW5nKCRwYXJ0KSB8fAogICAgICAgICAgICAgICAgcHJlZ19tYXRjaCgnL1tcWy46IyVdLycsICRwYXJ0KQogICAgICAgICAgICApIHsKICAgICAgICAgICAgICAgICRqb2luZWRbXSA9ICRwYXJ0OwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChcaXNfYXJyYXkoZW5kKCRqb2luZWQpKSkgewogICAgICAgICAgICAgICAgJGpvaW5lZFtdID0gJHBhcnQ7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkam9pbmVkW1xjb3VudCgkam9pbmVkKSAtIDFdIC49ICRwYXJ0OwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJGpvaW5lZDsKICAgIH0KCiAgICAvKioKICAgICAqIENvbXBpbGUgc2VsZWN0b3IgdG8gc3RyaW5nOyBzZWxmKCYpIHNob3VsZCBoYXZlIGJlZW4gcmVwbGFjZWQgYnkgbm93CiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZ3xhcnJheSAkc2VsZWN0b3IKICAgICAqCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gY29tcGlsZVNlbGVjdG9yKCRzZWxlY3RvcikKICAgIHsKICAgICAgICBpZiAoISBcaXNfYXJyYXkoJHNlbGVjdG9yKSkgewogICAgICAgICAgICByZXR1cm4gJHNlbGVjdG9yOyAvLyBtZWRpYSBhbmQgdGhlIGxpa2UKICAgICAgICB9CgogICAgICAgIHJldHVybiBpbXBsb2RlKAogICAgICAgICAgICAnICcsCiAgICAgICAgICAgIGFycmF5X21hcCgKICAgICAgICAgICAgICAgIFskdGhpcywgJ2NvbXBpbGVTZWxlY3RvclBhcnQnXSwKICAgICAgICAgICAgICAgICRzZWxlY3RvcgogICAgICAgICAgICApCiAgICAgICAgKTsKICAgIH0KCiAgICAvKioKICAgICAqIENvbXBpbGUgc2VsZWN0b3IgcGFydAogICAgICoKICAgICAqIEBwYXJhbSBhcnJheSAkcGllY2UKICAgICAqCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gY29tcGlsZVNlbGVjdG9yUGFydCgkcGllY2UpCiAgICB7CiAgICAgICAgZm9yZWFjaCAoJHBpZWNlIGFzICYkcCkgewogICAgICAgICAgICBpZiAoISBcaXNfYXJyYXkoJHApKSB7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgc3dpdGNoICgkcFswXSkgewogICAgICAgICAgICAgICAgY2FzZSBUeXBlOjpUX1NFTEY6CiAgICAgICAgICAgICAgICAgICAgJHAgPSAnJic7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAkcCA9ICR0aGlzLT5jb21waWxlVmFsdWUoJHApOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gaW1wbG9kZSgkcGllY2UpOwogICAgfQoKICAgIC8qKgogICAgICogSGFzIHNlbGVjdG9yIHBsYWNlaG9sZGVyPwogICAgICoKICAgICAqIEBwYXJhbSBhcnJheSAkc2VsZWN0b3IKICAgICAqCiAgICAgKiBAcmV0dXJuIGJvb2wKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGhhc1NlbGVjdG9yUGxhY2Vob2xkZXIoJHNlbGVjdG9yKQogICAgewogICAgICAgIGlmICghIFxpc19hcnJheSgkc2VsZWN0b3IpKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CgogICAgICAgIGZvcmVhY2ggKCRzZWxlY3RvciBhcyAkcGFydHMpIHsKICAgICAgICAgICAgZm9yZWFjaCAoJHBhcnRzIGFzICRwYXJ0KSB7CiAgICAgICAgICAgICAgICBpZiAoXHN0cmxlbigkcGFydCkgJiYgJyUnID09PSAkcGFydFswXSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lCiAgICAgKgogICAgICogQHJldHVybiB2b2lkCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBwdXNoQ2FsbFN0YWNrKCRuYW1lID0gJycpCiAgICB7CiAgICAgICAgJHRoaXMtPmNhbGxTdGFja1tdID0gWwogICAgICAgICAgJ24nID0+ICRuYW1lLAogICAgICAgICAgUGFyc2VyOjpTT1VSQ0VfSU5ERVggPT4gJHRoaXMtPnNvdXJjZUluZGV4LAogICAgICAgICAgUGFyc2VyOjpTT1VSQ0VfTElORSA9PiAkdGhpcy0+c291cmNlTGluZSwKICAgICAgICAgIFBhcnNlcjo6U09VUkNFX0NPTFVNTiA9PiAkdGhpcy0+c291cmNlQ29sdW1uCiAgICAgICAgXTsKCiAgICAgICAgLy8gaW5maW5pdGUgY2FsbGluZyBsb29wCiAgICAgICAgaWYgKFxjb3VudCgkdGhpcy0+Y2FsbFN0YWNrKSA+IDI1MDAwKSB7CiAgICAgICAgICAgIC8vIG5vdCBkaXNwbGF5ZWQgYnV0IHlvdSBjYW4gdmFyX2R1bXAgaXQgdG8gZGVlcCBkZWJ1ZwogICAgICAgICAgICAkbXNnID0gJHRoaXMtPmNhbGxTdGFja01lc3NhZ2UodHJ1ZSwgMTAwKTsKICAgICAgICAgICAgJG1zZyA9ICdJbmZpbml0ZSBjYWxsaW5nIGxvb3AnOwoKICAgICAgICAgICAgdGhyb3cgJHRoaXMtPmVycm9yKCRtc2cpOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEByZXR1cm4gdm9pZAogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gcG9wQ2FsbFN0YWNrKCkKICAgIHsKICAgICAgICBhcnJheV9wb3AoJHRoaXMtPmNhbGxTdGFjayk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDb21waWxlIGNoaWxkcmVuIGFuZCByZXR1cm4gcmVzdWx0CiAgICAgKgogICAgICogQHBhcmFtIGFycmF5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzdG1zCiAgICAgKiBAcGFyYW0gXFNjc3NQaHBcU2Nzc1BocFxGb3JtYXR0ZXJcT3V0cHV0QmxvY2sgJG91dAogICAgICogQHBhcmFtIHN0cmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0cmFjZU5hbWUKICAgICAqCiAgICAgKiBAcmV0dXJuIGFycmF5fE51bWJlcnxudWxsCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBjb21waWxlQ2hpbGRyZW4oJHN0bXMsIE91dHB1dEJsb2NrICRvdXQsICR0cmFjZU5hbWUgPSAnJykKICAgIHsKICAgICAgICAkdGhpcy0+cHVzaENhbGxTdGFjaygkdHJhY2VOYW1lKTsKCiAgICAgICAgZm9yZWFjaCAoJHN0bXMgYXMgJHN0bSkgewogICAgICAgICAgICAkcmV0ID0gJHRoaXMtPmNvbXBpbGVDaGlsZCgkc3RtLCAkb3V0KTsKCiAgICAgICAgICAgIGlmIChpc3NldCgkcmV0KSkgewogICAgICAgICAgICAgICAgJHRoaXMtPnBvcENhbGxTdGFjaygpOwoKICAgICAgICAgICAgICAgIHJldHVybiAkcmV0OwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkdGhpcy0+cG9wQ2FsbFN0YWNrKCk7CgogICAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgIC8qKgogICAgICogQ29tcGlsZSBjaGlsZHJlbiBhbmQgdGhyb3cgZXhjZXB0aW9uIGlmIHVuZXhwZWN0ZWQgYXQtcmV0dXJuCiAgICAgKgogICAgICogQHBhcmFtIGFycmF5W10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzdG1zCiAgICAgKiBAcGFyYW0gXFNjc3NQaHBcU2Nzc1BocFxGb3JtYXR0ZXJcT3V0cHV0QmxvY2sgJG91dAogICAgICogQHBhcmFtIFxTY3NzUGhwXFNjc3NQaHBcQmxvY2sgICAgICAgICAgICAgICAgICRzZWxmUGFyZW50CiAgICAgKiBAcGFyYW0gc3RyaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRyYWNlTmFtZQogICAgICoKICAgICAqIEByZXR1cm4gdm9pZAogICAgICoKICAgICAqIEB0aHJvd3MgXEV4Y2VwdGlvbgogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gY29tcGlsZUNoaWxkcmVuTm9SZXR1cm4oJHN0bXMsIE91dHB1dEJsb2NrICRvdXQsICRzZWxmUGFyZW50ID0gbnVsbCwgJHRyYWNlTmFtZSA9ICcnKQogICAgewogICAgICAgICR0aGlzLT5wdXNoQ2FsbFN0YWNrKCR0cmFjZU5hbWUpOwoKICAgICAgICBmb3JlYWNoICgkc3RtcyBhcyAkc3RtKSB7CiAgICAgICAgICAgIGlmICgkc2VsZlBhcmVudCAmJiBpc3NldCgkc3RtWzFdKSAmJiBcaXNfb2JqZWN0KCRzdG1bMV0pICYmICRzdG1bMV0gaW5zdGFuY2VvZiBCbG9jaykgewogICAgICAgICAgICAgICAgJG9sZFNlbGZQYXJlbnQgPSAkc3RtWzFdLT5zZWxmUGFyZW50OwogICAgICAgICAgICAgICAgJHN0bVsxXS0+c2VsZlBhcmVudCA9ICRzZWxmUGFyZW50OwogICAgICAgICAgICAgICAgJHJldCA9ICR0aGlzLT5jb21waWxlQ2hpbGQoJHN0bSwgJG91dCk7CiAgICAgICAgICAgICAgICAkc3RtWzFdLT5zZWxmUGFyZW50ID0gJG9sZFNlbGZQYXJlbnQ7CiAgICAgICAgICAgIH0gZWxzZWlmICgkc2VsZlBhcmVudCAmJiBcaW5fYXJyYXkoJHN0bVswXSwgW1R5cGU6OlRfSU5DTFVERSwgVHlwZTo6VF9FWFRFTkRdKSkgewogICAgICAgICAgICAgICAgJHN0bVsnc2VsZlBhcmVudCddID0gJHNlbGZQYXJlbnQ7CiAgICAgICAgICAgICAgICAkcmV0ID0gJHRoaXMtPmNvbXBpbGVDaGlsZCgkc3RtLCAkb3V0KTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICRyZXQgPSAkdGhpcy0+Y29tcGlsZUNoaWxkKCRzdG0sICRvdXQpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoaXNzZXQoJHJldCkpIHsKICAgICAgICAgICAgICAgIHRocm93ICR0aGlzLT5lcnJvcignQHJldHVybiBtYXkgb25seSBiZSB1c2VkIHdpdGhpbiBhIGZ1bmN0aW9uJyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICR0aGlzLT5wb3BDYWxsU3RhY2soKTsKICAgIH0KCgogICAgLyoqCiAgICAgKiBldmFsdWF0ZSBtZWRpYSBxdWVyeSA6IGNvbXBpbGUgaW50ZXJuYWwgdmFsdWUga2VlcGluZyB0aGUgc3RydWN0dXJlIHVuY2hhbmdlZAogICAgICoKICAgICAqIEBwYXJhbSBhcnJheSAkcXVlcnlMaXN0CiAgICAgKgogICAgICogQHJldHVybiBhcnJheQogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gZXZhbHVhdGVNZWRpYVF1ZXJ5KCRxdWVyeUxpc3QpCiAgICB7CiAgICAgICAgc3RhdGljICRwYXJzZXIgPSBudWxsOwoKICAgICAgICAkb3V0UXVlcnlMaXN0ID0gW107CgogICAgICAgIGZvcmVhY2ggKCRxdWVyeUxpc3QgYXMgJGtxbCA9PiAkcXVlcnkpIHsKICAgICAgICAgICAgJHNob3VsZFJlcGFyc2UgPSBmYWxzZTsKCiAgICAgICAgICAgIGZvcmVhY2ggKCRxdWVyeSBhcyAka3EgPT4gJHEpIHsKICAgICAgICAgICAgICAgIGZvciAoJGkgPSAxOyAkaSA8IFxjb3VudCgkcSk7ICRpKyspIHsKICAgICAgICAgICAgICAgICAgICAkdmFsdWUgPSAkdGhpcy0+Y29tcGlsZVZhbHVlKCRxWyRpXSk7CgogICAgICAgICAgICAgICAgICAgIC8vIHRoZSBwYXJzZXIgaGFkIG5vIG1lYW4gdG8ga25vdyBpZiBtZWRpYSB0eXBlIG9yIGV4cHJlc3Npb24gaWYgaXQgd2FzIGFuIGludGVycG9sYXRpb24KICAgICAgICAgICAgICAgICAgICAvLyBzbyB5b3UgbmVlZCB0byByZXBhcnNlIGlmIHRoZSBUX01FRElBX1RZUEUgbG9va3MgbGlrZSBhbnl0aGluZyBlbHNlIGEgbWVkaWEgdHlwZQogICAgICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAgICAgJHFbMF0gPT0gVHlwZTo6VF9NRURJQV9UWVBFICYmCiAgICAgICAgICAgICAgICAgICAgICAgIChzdHJwb3MoJHZhbHVlLCAnKCcpICE9PSBmYWxzZSB8fAogICAgICAgICAgICAgICAgICAgICAgICBzdHJwb3MoJHZhbHVlLCAnKScpICE9PSBmYWxzZSB8fAogICAgICAgICAgICAgICAgICAgICAgICBzdHJwb3MoJHZhbHVlLCAnOicpICE9PSBmYWxzZSB8fAogICAgICAgICAgICAgICAgICAgICAgICBzdHJwb3MoJHZhbHVlLCAnLCcpICE9PSBmYWxzZSkKICAgICAgICAgICAgICAgICAgICApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJHNob3VsZFJlcGFyc2UgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgJHF1ZXJ5TGlzdFska3FsXVska3FdWyRpXSA9IFtUeXBlOjpUX0tFWVdPUkQsICR2YWx1ZV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICgkc2hvdWxkUmVwYXJzZSkgewogICAgICAgICAgICAgICAgaWYgKFxpc19udWxsKCRwYXJzZXIpKSB7CiAgICAgICAgICAgICAgICAgICAgJHBhcnNlciA9ICR0aGlzLT5wYXJzZXJGYWN0b3J5KF9fTUVUSE9EX18pOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRxdWVyeVN0cmluZyA9ICR0aGlzLT5jb21waWxlTWVkaWFRdWVyeShbJHF1ZXJ5TGlzdFska3FsXV0pOwogICAgICAgICAgICAgICAgJHF1ZXJ5U3RyaW5nID0gcmVzZXQoJHF1ZXJ5U3RyaW5nKTsKCiAgICAgICAgICAgICAgICBpZiAoJHF1ZXJ5U3RyaW5nICE9PSBmYWxzZSAmJiBzdHJwb3MoJHF1ZXJ5U3RyaW5nLCAnQG1lZGlhICcpID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgJHF1ZXJ5U3RyaW5nID0gc3Vic3RyKCRxdWVyeVN0cmluZywgNyk7CiAgICAgICAgICAgICAgICAgICAgJHF1ZXJpZXMgPSBbXTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCRwYXJzZXItPnBhcnNlTWVkaWFRdWVyeUxpc3QoJHF1ZXJ5U3RyaW5nLCAkcXVlcmllcykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJHF1ZXJpZXMgPSAkdGhpcy0+ZXZhbHVhdGVNZWRpYVF1ZXJ5KCRxdWVyaWVzWzJdKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChcY291bnQoJHF1ZXJpZXMpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkb3V0UXVlcnlMaXN0W10gPSBhcnJheV9zaGlmdCgkcXVlcmllcyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgJG91dFF1ZXJ5TGlzdFtdID0gJHF1ZXJ5TGlzdFska3FsXTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkb3V0UXVlcnlMaXN0OwogICAgfQoKICAgIC8qKgogICAgICogQ29tcGlsZSBtZWRpYSBxdWVyeQogICAgICoKICAgICAqIEBwYXJhbSBhcnJheSAkcXVlcnlMaXN0CiAgICAgKgogICAgICogQHJldHVybiBzdHJpbmdbXQogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gY29tcGlsZU1lZGlhUXVlcnkoJHF1ZXJ5TGlzdCkKICAgIHsKICAgICAgICAkc3RhcnQgICA9ICdAbWVkaWEgJzsKICAgICAgICAkZGVmYXVsdCA9IHRyaW0oJHN0YXJ0KTsKICAgICAgICAkb3V0ICAgICA9IFtdOwogICAgICAgICRjdXJyZW50ID0gJyc7CgogICAgICAgIGZvcmVhY2ggKCRxdWVyeUxpc3QgYXMgJHF1ZXJ5KSB7CiAgICAgICAgICAgICR0eXBlID0gbnVsbDsKICAgICAgICAgICAgJHBhcnRzID0gW107CgogICAgICAgICAgICAkbWVkaWFUeXBlT25seSA9IHRydWU7CgogICAgICAgICAgICBmb3JlYWNoICgkcXVlcnkgYXMgJHEpIHsKICAgICAgICAgICAgICAgIGlmICgkcVswXSAhPT0gVHlwZTo6VF9NRURJQV9UWVBFKSB7CiAgICAgICAgICAgICAgICAgICAgJG1lZGlhVHlwZU9ubHkgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgZm9yZWFjaCAoJHF1ZXJ5IGFzICRxKSB7CiAgICAgICAgICAgICAgICBzd2l0Y2ggKCRxWzBdKSB7CiAgICAgICAgICAgICAgICAgICAgY2FzZSBUeXBlOjpUX01FRElBX1RZUEU6CiAgICAgICAgICAgICAgICAgICAgICAgICRuZXdUeXBlID0gYXJyYXlfbWFwKFskdGhpcywgJ2NvbXBpbGVWYWx1ZSddLCBcYXJyYXlfc2xpY2UoJHEsIDEpKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbWJpbmluZyBub3QgYW5kIGFueXRoaW5nIGVsc2UgdGhhbiBtZWRpYSB0eXBlIGlzIHRvbyByaXNreSBhbmQgc2hvdWxkIGJlIGF2b2lkZWQKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEgJG1lZGlhVHlwZU9ubHkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcaW5fYXJyYXkoVHlwZTo6VF9OT1QsICRuZXdUeXBlKSB8fCAoJHR5cGUgJiYgXGluX2FycmF5KFR5cGU6OlRfTk9ULCAkdHlwZSkgKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkdHlwZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheV91bnNoaWZ0KCRwYXJ0cywgaW1wbG9kZSgnICcsIGFycmF5X2ZpbHRlcigkdHlwZSkpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIGVtcHR5KCRwYXJ0cykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxzdHJsZW4oJGN1cnJlbnQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkY3VycmVudCAuPSAkdGhpcy0+Zm9ybWF0dGVyLT50YWdTZXBhcmF0b3I7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRjdXJyZW50IC49IGltcGxvZGUoJyBhbmQgJywgJHBhcnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkY3VycmVudCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkb3V0W10gPSAkc3RhcnQgLiAkY3VycmVudDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRjdXJyZW50ID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHR5cGUgICAgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRwYXJ0cyAgID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkbmV3VHlwZSA9PT0gWydhbGwnXSAmJiAkZGVmYXVsdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGRlZmF1bHQgPSAkc3RhcnQgLiAnYWxsJzsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsIGNhbiBiZSBzYWZlbHkgaWdub3JlZCBhbmQgbWl4ZWQgd2l0aCB3aGF0ZXZlciBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkbmV3VHlwZSAhPT0gWydhbGwnXSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCR0eXBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHR5cGUgPSAkdGhpcy0+bWVyZ2VNZWRpYVR5cGVzKCR0eXBlLCAkbmV3VHlwZSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbXB0eSgkdHlwZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWVyZ2UgZmFpbGVkIDogaWdub3JlIHRoaXMgcXVlcnkgdGhhdCBpcyBub3QgdmFsaWQsIHNraXAgdG8gdGhlIG5leHQgb25lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRwYXJ0cyA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZGVmYXVsdCA9ICcnOyAvLyBpZiBldmVyeXRoaW5nIGZhaWwsIG5vIEBtZWRpYSBhdCBhbGwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUgMzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0eXBlID0gJG5ld1R5cGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgICAgIGNhc2UgVHlwZTo6VF9NRURJQV9FWFBSRVNTSU9OOgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNzZXQoJHFbMl0pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcGFydHNbXSA9ICcoJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJHRoaXMtPmNvbXBpbGVWYWx1ZSgkcVsxXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICR0aGlzLT5mb3JtYXR0ZXItPmFzc2lnblNlcGFyYXRvcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJHRoaXMtPmNvbXBpbGVWYWx1ZSgkcVsyXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICcpJzsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRwYXJ0c1tdID0gJygnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAkdGhpcy0+Y29tcGlsZVZhbHVlKCRxWzFdKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJyknOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgICAgICBjYXNlIFR5cGU6OlRfTUVESUFfVkFMVUU6CiAgICAgICAgICAgICAgICAgICAgICAgICRwYXJ0c1tdID0gJHRoaXMtPmNvbXBpbGVWYWx1ZSgkcVsxXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoJHR5cGUpIHsKICAgICAgICAgICAgICAgIGFycmF5X3Vuc2hpZnQoJHBhcnRzLCBpbXBsb2RlKCcgJywgYXJyYXlfZmlsdGVyKCR0eXBlKSkpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoISBlbXB0eSgkcGFydHMpKSB7CiAgICAgICAgICAgICAgICBpZiAoXHN0cmxlbigkY3VycmVudCkpIHsKICAgICAgICAgICAgICAgICAgICAkY3VycmVudCAuPSAkdGhpcy0+Zm9ybWF0dGVyLT50YWdTZXBhcmF0b3I7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJGN1cnJlbnQgLj0gaW1wbG9kZSgnIGFuZCAnLCAkcGFydHMpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoJGN1cnJlbnQpIHsKICAgICAgICAgICAgJG91dFtdID0gJHN0YXJ0IC4gJGN1cnJlbnQ7CiAgICAgICAgfQoKICAgICAgICAvLyBubyBAbWVkaWEgdHlwZSBleGNlcHQgYWxsLCBhbmQgbm8gY29uZmxpY3Q/CiAgICAgICAgaWYgKCEgJG91dCAmJiAkZGVmYXVsdCkgewogICAgICAgICAgICAkb3V0W10gPSAkZGVmYXVsdDsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkb3V0OwogICAgfQoKICAgIC8qKgogICAgICogTWVyZ2UgZGlyZWN0IHJlbGF0aW9uc2hpcHMgYmV0d2VlbiBzZWxlY3RvcnMKICAgICAqCiAgICAgKiBAcGFyYW0gYXJyYXkgJHNlbGVjdG9yczEKICAgICAqIEBwYXJhbSBhcnJheSAkc2VsZWN0b3JzMgogICAgICoKICAgICAqIEByZXR1cm4gYXJyYXkKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIG1lcmdlRGlyZWN0UmVsYXRpb25zaGlwcygkc2VsZWN0b3JzMSwgJHNlbGVjdG9yczIpCiAgICB7CiAgICAgICAgaWYgKGVtcHR5KCRzZWxlY3RvcnMxKSB8fCBlbXB0eSgkc2VsZWN0b3JzMikpIHsKICAgICAgICAgICAgcmV0dXJuIGFycmF5X21lcmdlKCRzZWxlY3RvcnMxLCAkc2VsZWN0b3JzMik7CiAgICAgICAgfQoKICAgICAgICAkcGFydDEgPSBlbmQoJHNlbGVjdG9yczEpOwogICAgICAgICRwYXJ0MiA9IGVuZCgkc2VsZWN0b3JzMik7CgogICAgICAgIGlmICghICR0aGlzLT5pc0ltbWVkaWF0ZVJlbGF0aW9uc2hpcENvbWJpbmF0b3IoJHBhcnQxWzBdKSAmJiAkcGFydDEgIT09ICRwYXJ0MikgewogICAgICAgICAgICByZXR1cm4gYXJyYXlfbWVyZ2UoJHNlbGVjdG9yczEsICRzZWxlY3RvcnMyKTsKICAgICAgICB9CgogICAgICAgICRtZXJnZWQgPSBbXTsKCiAgICAgICAgZG8gewogICAgICAgICAgICAkcGFydDEgPSBhcnJheV9wb3AoJHNlbGVjdG9yczEpOwogICAgICAgICAgICAkcGFydDIgPSBhcnJheV9wb3AoJHNlbGVjdG9yczIpOwoKICAgICAgICAgICAgaWYgKCEgJHRoaXMtPmlzSW1tZWRpYXRlUmVsYXRpb25zaGlwQ29tYmluYXRvcigkcGFydDFbMF0pICYmICRwYXJ0MSAhPT0gJHBhcnQyKSB7CiAgICAgICAgICAgICAgICBpZiAoJHRoaXMtPmlzSW1tZWRpYXRlUmVsYXRpb25zaGlwQ29tYmluYXRvcihyZXNldCgkbWVyZ2VkKVswXSkpIHsKICAgICAgICAgICAgICAgICAgICBhcnJheV91bnNoaWZ0KCRtZXJnZWQsIFskcGFydDFbMF0gLiAkcGFydDJbMF1dKTsKICAgICAgICAgICAgICAgICAgICAkbWVyZ2VkID0gYXJyYXlfbWVyZ2UoJHNlbGVjdG9yczEsICRzZWxlY3RvcnMyLCAkbWVyZ2VkKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJG1lcmdlZCA9IGFycmF5X21lcmdlKCRzZWxlY3RvcnMxLCBbJHBhcnQxXSwgJHNlbGVjdG9yczIsIFskcGFydDJdLCAkbWVyZ2VkKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgYXJyYXlfdW5zaGlmdCgkbWVyZ2VkLCAkcGFydDEpOwogICAgICAgIH0gd2hpbGUgKCEgZW1wdHkoJHNlbGVjdG9yczEpICYmICEgZW1wdHkoJHNlbGVjdG9yczIpKTsKCiAgICAgICAgcmV0dXJuICRtZXJnZWQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBNZXJnZSBtZWRpYSB0eXBlcwogICAgICoKICAgICAqIEBwYXJhbSBhcnJheSAkdHlwZTEKICAgICAqIEBwYXJhbSBhcnJheSAkdHlwZTIKICAgICAqCiAgICAgKiBAcmV0dXJuIGFycmF5fG51bGwKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIG1lcmdlTWVkaWFUeXBlcygkdHlwZTEsICR0eXBlMikKICAgIHsKICAgICAgICBpZiAoZW1wdHkoJHR5cGUxKSkgewogICAgICAgICAgICByZXR1cm4gJHR5cGUyOwogICAgICAgIH0KCiAgICAgICAgaWYgKGVtcHR5KCR0eXBlMikpIHsKICAgICAgICAgICAgcmV0dXJuICR0eXBlMTsKICAgICAgICB9CgogICAgICAgIGlmIChcY291bnQoJHR5cGUxKSA+IDEpIHsKICAgICAgICAgICAgJG0xID0gc3RydG9sb3dlcigkdHlwZTFbMF0pOwogICAgICAgICAgICAkdDEgPSBzdHJ0b2xvd2VyKCR0eXBlMVsxXSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJG0xID0gJyc7CiAgICAgICAgICAgICR0MSA9IHN0cnRvbG93ZXIoJHR5cGUxWzBdKTsKICAgICAgICB9CgogICAgICAgIGlmIChcY291bnQoJHR5cGUyKSA+IDEpIHsKICAgICAgICAgICAgJG0yID0gc3RydG9sb3dlcigkdHlwZTJbMF0pOwogICAgICAgICAgICAkdDIgPSBzdHJ0b2xvd2VyKCR0eXBlMlsxXSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJG0yID0gJyc7CiAgICAgICAgICAgICR0MiA9IHN0cnRvbG93ZXIoJHR5cGUyWzBdKTsKICAgICAgICB9CgogICAgICAgIGlmICgoJG0xID09PSBUeXBlOjpUX05PVCkgXiAoJG0yID09PSBUeXBlOjpUX05PVCkpIHsKICAgICAgICAgICAgaWYgKCR0MSA9PT0gJHQyKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIFsKICAgICAgICAgICAgICAgICRtMSA9PT0gVHlwZTo6VF9OT1QgPyAkbTIgOiAkbTEsCiAgICAgICAgICAgICAgICAkbTEgPT09IFR5cGU6OlRfTk9UID8gJHQyIDogJHQxLAogICAgICAgICAgICBdOwogICAgICAgIH0KCiAgICAgICAgaWYgKCRtMSA9PT0gVHlwZTo6VF9OT1QgJiYgJG0yID09PSBUeXBlOjpUX05PVCkgewogICAgICAgICAgICAvLyBDU1MgaGFzIG5vIHdheSBvZiByZXByZXNlbnRpbmcgIm5laXRoZXIgc2NyZWVuIG5vciBwcmludCIKICAgICAgICAgICAgaWYgKCR0MSAhPT0gJHQyKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIFtUeXBlOjpUX05PVCwgJHQxXTsKICAgICAgICB9CgogICAgICAgIGlmICgkdDEgIT09ICR0MikgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CgogICAgICAgIC8vIHQxID09IHQyLCBuZWl0aGVyIG0xIG5vciBtMiBhcmUgIm5vdCIKICAgICAgICByZXR1cm4gW2VtcHR5KCRtMSkgPyAkbTIgOiAkbTEsICR0MV07CiAgICB9CgogICAgLyoqCiAgICAgKiBDb21waWxlIGltcG9ydDsgcmV0dXJucyB0cnVlIGlmIHRoZSB2YWx1ZSB3YXMgc29tZXRoaW5nIHRoYXQgY291bGQgYmUgaW1wb3J0ZWQKICAgICAqCiAgICAgKiBAcGFyYW0gYXJyYXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHJhd1BhdGgKICAgICAqIEBwYXJhbSBcU2Nzc1BocFxTY3NzUGhwXEZvcm1hdHRlclxPdXRwdXRCbG9jayAkb3V0CiAgICAgKiBAcGFyYW0gYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJG9uY2UKICAgICAqCiAgICAgKiBAcmV0dXJuIGJvb2wKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGNvbXBpbGVJbXBvcnQoJHJhd1BhdGgsIE91dHB1dEJsb2NrICRvdXQsICRvbmNlID0gZmFsc2UpCiAgICB7CiAgICAgICAgaWYgKCRyYXdQYXRoWzBdID09PSBUeXBlOjpUX1NUUklORykgewogICAgICAgICAgICAkcGF0aCA9ICR0aGlzLT5jb21waWxlU3RyaW5nQ29udGVudCgkcmF3UGF0aCk7CgogICAgICAgICAgICBpZiAoc3RycG9zKCRwYXRoLCAndXJsKCcpICE9PSAwICYmICRmaWxlUGF0aCA9ICR0aGlzLT5maW5kSW1wb3J0KCRwYXRoLCAkdGhpcy0+Y3VycmVudERpcmVjdG9yeSkpIHsKICAgICAgICAgICAgICAgICR0aGlzLT5yZWdpc3RlckltcG9ydCgkdGhpcy0+Y3VycmVudERpcmVjdG9yeSwgJHBhdGgsICRmaWxlUGF0aCk7CgogICAgICAgICAgICAgICAgaWYgKCEgJG9uY2UgfHwgISBcaW5fYXJyYXkoJGZpbGVQYXRoLCAkdGhpcy0+aW1wb3J0ZWRGaWxlcykpIHsKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+aW1wb3J0RmlsZSgkZmlsZVBhdGgsICRvdXQpOwogICAgICAgICAgICAgICAgICAgICR0aGlzLT5pbXBvcnRlZEZpbGVzW10gPSAkZmlsZVBhdGg7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICR0aGlzLT5hcHBlbmRSb290RGlyZWN0aXZlKCdAaW1wb3J0ICcgLiAkdGhpcy0+Y29tcGlsZUltcG9ydFBhdGgoJHJhd1BhdGgpIC4gJzsnLCAkb3V0KTsKCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CgogICAgICAgIGlmICgkcmF3UGF0aFswXSA9PT0gVHlwZTo6VF9MSVNUKSB7CiAgICAgICAgICAgIC8vIGhhbmRsZSBhIGxpc3Qgb2Ygc3RyaW5ncwogICAgICAgICAgICBpZiAoXGNvdW50KCRyYXdQYXRoWzJdKSA9PT0gMCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBmb3JlYWNoICgkcmF3UGF0aFsyXSBhcyAkcGF0aCkgewogICAgICAgICAgICAgICAgaWYgKCRwYXRoWzBdICE9PSBUeXBlOjpUX1NUUklORykgewogICAgICAgICAgICAgICAgICAgICR0aGlzLT5hcHBlbmRSb290RGlyZWN0aXZlKCdAaW1wb3J0ICcgLiAkdGhpcy0+Y29tcGlsZUltcG9ydFBhdGgoJHJhd1BhdGgpIC4gJzsnLCAkb3V0KTsKCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBmb3JlYWNoICgkcmF3UGF0aFsyXSBhcyAkcGF0aCkgewogICAgICAgICAgICAgICAgJHRoaXMtPmNvbXBpbGVJbXBvcnQoJHBhdGgsICRvdXQsICRvbmNlKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQoKICAgICAgICAkdGhpcy0+YXBwZW5kUm9vdERpcmVjdGl2ZSgnQGltcG9ydCAnIC4gJHRoaXMtPmNvbXBpbGVJbXBvcnRQYXRoKCRyYXdQYXRoKSAuICc7JywgJG91dCk7CgogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSBhcnJheSAkcmF3UGF0aAogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqIEB0aHJvd3MgQ29tcGlsZXJFeGNlcHRpb24KICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGNvbXBpbGVJbXBvcnRQYXRoKCRyYXdQYXRoKQogICAgewogICAgICAgICRwYXRoID0gJHRoaXMtPmNvbXBpbGVWYWx1ZSgkcmF3UGF0aCk7CgogICAgICAgIC8vIGNhc2UgdXJsKCkgd2l0aG91dCBxdW90ZXMgOiBzdXBwcmVzcyBcciBcbiByZW1haW5pbmcgaW4gdGhlIHBhdGgKICAgICAgICAvLyBpZiB0aGlzIGlzIGEgcmVhbCBzdHJpbmcgdGhlcmUgY2FuIG5vdCBiZSBDUiBvciBMRiBjaGFyCiAgICAgICAgaWYgKHN0cnBvcygkcGF0aCwgJ3VybCgnKSA9PT0gMCkgewogICAgICAgICAgICAkcGF0aCA9IHN0cl9yZXBsYWNlKGFycmF5KCJcciIsICJcbiIpLCBhcnJheSgnJywgJyAnKSwgJHBhdGgpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vIGlmIHRoaXMgaXMgYSBmaWxlIG5hbWUgaW4gYSBzdHJpbmcsIHNwYWNlcyBzaG91bGQgYmUgZXNjYXBlZAogICAgICAgICAgICAkcGF0aCA9ICR0aGlzLT5yZWR1Y2UoJHJhd1BhdGgpOwogICAgICAgICAgICAkcGF0aCA9ICR0aGlzLT5lc2NhcGVJbXBvcnRQYXRoU3RyaW5nKCRwYXRoKTsKICAgICAgICAgICAgJHBhdGggPSAkdGhpcy0+Y29tcGlsZVZhbHVlKCRwYXRoKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkcGF0aDsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSBhcnJheSAkcGF0aAogICAgICogQHJldHVybiBhcnJheQogICAgICogQHRocm93cyBDb21waWxlckV4Y2VwdGlvbgogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gZXNjYXBlSW1wb3J0UGF0aFN0cmluZygkcGF0aCkKICAgIHsKICAgICAgICBzd2l0Y2ggKCRwYXRoWzBdKSB7CiAgICAgICAgICAgIGNhc2UgVHlwZTo6VF9MSVNUOgogICAgICAgICAgICAgICAgZm9yZWFjaCAoJHBhdGhbMl0gYXMgJGsgPT4gJHYpIHsKICAgICAgICAgICAgICAgICAgICAkcGF0aFsyXVska10gPSAkdGhpcy0+ZXNjYXBlSW1wb3J0UGF0aFN0cmluZygkdik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSBUeXBlOjpUX1NUUklORzoKICAgICAgICAgICAgICAgIGlmICgkcGF0aFsxXSkgewogICAgICAgICAgICAgICAgICAgICRwYXRoID0gJHRoaXMtPmNvbXBpbGVWYWx1ZSgkcGF0aCk7CiAgICAgICAgICAgICAgICAgICAgJHBhdGggPSBzdHJfcmVwbGFjZSgnICcsICdcXCAnLCAkcGF0aCk7CiAgICAgICAgICAgICAgICAgICAgJHBhdGggPSBbVHlwZTo6VF9LRVlXT1JELCAkcGF0aF07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkcGF0aDsKICAgIH0KCiAgICAvKioKICAgICAqIEFwcGVuZCBhIHJvb3QgZGlyZWN0aXZlIGxpa2UgQGltcG9ydCBvciBAY2hhcnNldCBhcyBuZWFyIGFzIHRoZSBwb3NzaWJsZSBmcm9tIHRoZSBzb3VyY2UgY29kZQogICAgICogKGtlZXBpbmcgYmVmb3JlIGNvbW1lbnRzLCBAaW1wb3J0IGFuZCBAY2hhcnNldCBjb21pbmcgYmVmb3JlIGluIHRoZSBzb3VyY2UgY29kZSkKICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGxpbmUKICAgICAqIEBwYXJhbSBcU2Nzc1BocFxTY3NzUGhwXEZvcm1hdHRlclxPdXRwdXRCbG9jayAkb3V0CiAgICAgKiBAcGFyYW0gYXJyYXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGFsbG93ZWQKICAgICAqCiAgICAgKiBAcmV0dXJuIHZvaWQKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGFwcGVuZFJvb3REaXJlY3RpdmUoJGxpbmUsICRvdXQsICRhbGxvd2VkID0gW1R5cGU6OlRfQ09NTUVOVF0pCiAgICB7CiAgICAgICAgJHJvb3QgPSAkb3V0OwoKICAgICAgICB3aGlsZSAoJHJvb3QtPnBhcmVudCkgewogICAgICAgICAgICAkcm9vdCA9ICRyb290LT5wYXJlbnQ7CiAgICAgICAgfQoKICAgICAgICAkaSA9IDA7CgogICAgICAgIHdoaWxlICgkaSA8IFxjb3VudCgkcm9vdC0+Y2hpbGRyZW4pKSB7CiAgICAgICAgICAgIGlmICghIGlzc2V0KCRyb290LT5jaGlsZHJlblskaV0tPnR5cGUpIHx8ICEgXGluX2FycmF5KCRyb290LT5jaGlsZHJlblskaV0tPnR5cGUsICRhbGxvd2VkKSkgewogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRpKys7CiAgICAgICAgfQoKICAgICAgICAvLyByZW1vdmUgaW5jb21wYXRpYmxlIGNoaWxkcmVuIGZyb20gdGhlIGJvdHRvbSBvZiB0aGUgbGlzdAogICAgICAgICRzYXZlQ2hpbGRyZW4gPSBbXTsKCiAgICAgICAgd2hpbGUgKCRpIDwgXGNvdW50KCRyb290LT5jaGlsZHJlbikpIHsKICAgICAgICAgICAgJHNhdmVDaGlsZHJlbltdID0gYXJyYXlfcG9wKCRyb290LT5jaGlsZHJlbik7CiAgICAgICAgfQoKICAgICAgICAvLyBpbnNlcnQgdGhlIGRpcmVjdGl2ZSBhcyBhIGNvbW1lbnQKICAgICAgICAkY2hpbGQgPSAkdGhpcy0+bWFrZU91dHB1dEJsb2NrKFR5cGU6OlRfQ09NTUVOVCk7CiAgICAgICAgJGNoaWxkLT5saW5lc1tdICAgICAgPSAkbGluZTsKICAgICAgICAkY2hpbGQtPnNvdXJjZU5hbWUgICA9ICR0aGlzLT5zb3VyY2VOYW1lc1skdGhpcy0+c291cmNlSW5kZXhdID86ICcoc3RkaW4pJzsKICAgICAgICAkY2hpbGQtPnNvdXJjZUxpbmUgICA9ICR0aGlzLT5zb3VyY2VMaW5lOwogICAgICAgICRjaGlsZC0+c291cmNlQ29sdW1uID0gJHRoaXMtPnNvdXJjZUNvbHVtbjsKCiAgICAgICAgJHJvb3QtPmNoaWxkcmVuW10gPSAkY2hpbGQ7CgogICAgICAgIC8vIHJlcHVzaCBjaGlsZHJlbgogICAgICAgIHdoaWxlIChcY291bnQoJHNhdmVDaGlsZHJlbikpIHsKICAgICAgICAgICAgJHJvb3QtPmNoaWxkcmVuW10gPSBhcnJheV9wb3AoJHNhdmVDaGlsZHJlbik7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQXBwZW5kIGxpbmVzIHRvIHRoZSBjdXJyZW50IG91dHB1dCBibG9jazoKICAgICAqIGRpcmVjdGx5IHRvIHRoZSBibG9jayBvciB0aHJvdWdoIGEgY2hpbGQgaWYgbmVjZXNzYXJ5CiAgICAgKgogICAgICogQHBhcmFtIFxTY3NzUGhwXFNjc3NQaHBcRm9ybWF0dGVyXE91dHB1dEJsb2NrICRvdXQKICAgICAqIEBwYXJhbSBzdHJpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdHlwZQogICAgICogQHBhcmFtIHN0cmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRsaW5lCiAgICAgKgogICAgICogQHJldHVybiB2b2lkCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBhcHBlbmRPdXRwdXRMaW5lKE91dHB1dEJsb2NrICRvdXQsICR0eXBlLCAkbGluZSkKICAgIHsKICAgICAgICAkb3V0V3JpdGUgPSAmJG91dDsKCiAgICAgICAgLy8gY2hlY2sgaWYgaXQncyBhIGZsYXQgb3V0cHV0IG9yIG5vdAogICAgICAgIGlmIChcY291bnQoJG91dC0+Y2hpbGRyZW4pKSB7CiAgICAgICAgICAgICRsYXN0Q2hpbGQgPSAmJG91dC0+Y2hpbGRyZW5bXGNvdW50KCRvdXQtPmNoaWxkcmVuKSAtIDFdOwoKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJGxhc3RDaGlsZC0+ZGVwdGggPT09ICRvdXQtPmRlcHRoICYmCiAgICAgICAgICAgICAgICBcaXNfbnVsbCgkbGFzdENoaWxkLT5zZWxlY3RvcnMpICYmCiAgICAgICAgICAgICAgICAhIFxjb3VudCgkbGFzdENoaWxkLT5jaGlsZHJlbikKICAgICAgICAgICAgKSB7CiAgICAgICAgICAgICAgICAkb3V0V3JpdGUgPSAkbGFzdENoaWxkOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJG5leHRMaW5lcyA9ICR0aGlzLT5tYWtlT3V0cHV0QmxvY2soJHR5cGUpOwogICAgICAgICAgICAgICAgJG5leHRMaW5lcy0+cGFyZW50ID0gJG91dDsKICAgICAgICAgICAgICAgICRuZXh0TGluZXMtPmRlcHRoICA9ICRvdXQtPmRlcHRoOwoKICAgICAgICAgICAgICAgICRvdXQtPmNoaWxkcmVuW10gPSAkbmV4dExpbmVzOwogICAgICAgICAgICAgICAgJG91dFdyaXRlID0gJiRuZXh0TGluZXM7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICRvdXRXcml0ZS0+bGluZXNbXSA9ICRsaW5lOwogICAgfQoKICAgIC8qKgogICAgICogQ29tcGlsZSBjaGlsZDsgcmV0dXJucyBhIHZhbHVlIHRvIGhhbHQgZXhlY3V0aW9uCiAgICAgKgogICAgICogQHBhcmFtIGFycmF5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRjaGlsZAogICAgICogQHBhcmFtIFxTY3NzUGhwXFNjc3NQaHBcRm9ybWF0dGVyXE91dHB1dEJsb2NrICRvdXQKICAgICAqCiAgICAgKiBAcmV0dXJuIGFycmF5fE51bWJlcnxudWxsCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBjb21waWxlQ2hpbGQoJGNoaWxkLCBPdXRwdXRCbG9jayAkb3V0KQogICAgewogICAgICAgIGlmIChpc3NldCgkY2hpbGRbUGFyc2VyOjpTT1VSQ0VfTElORV0pKSB7CiAgICAgICAgICAgICR0aGlzLT5zb3VyY2VJbmRleCAgPSBpc3NldCgkY2hpbGRbUGFyc2VyOjpTT1VSQ0VfSU5ERVhdKSA/ICRjaGlsZFtQYXJzZXI6OlNPVVJDRV9JTkRFWF0gOiBudWxsOwogICAgICAgICAgICAkdGhpcy0+c291cmNlTGluZSAgID0gJGNoaWxkW1BhcnNlcjo6U09VUkNFX0xJTkVdOwogICAgICAgICAgICAkdGhpcy0+c291cmNlQ29sdW1uID0gaXNzZXQoJGNoaWxkW1BhcnNlcjo6U09VUkNFX0NPTFVNTl0pID8gJGNoaWxkW1BhcnNlcjo6U09VUkNFX0NPTFVNTl0gOiAtMTsKICAgICAgICB9IGVsc2VpZiAoXGlzX2FycmF5KCRjaGlsZCkgJiYgaXNzZXQoJGNoaWxkWzFdLT5zb3VyY2VMaW5lKSAmJiAkY2hpbGRbMV0gaW5zdGFuY2VvZiBCbG9jaykgewogICAgICAgICAgICAkdGhpcy0+c291cmNlSW5kZXggID0gJGNoaWxkWzFdLT5zb3VyY2VJbmRleDsKICAgICAgICAgICAgJHRoaXMtPnNvdXJjZUxpbmUgICA9ICRjaGlsZFsxXS0+c291cmNlTGluZTsKICAgICAgICAgICAgJHRoaXMtPnNvdXJjZUNvbHVtbiA9ICRjaGlsZFsxXS0+c291cmNlQ29sdW1uOwogICAgICAgIH0gZWxzZWlmICghIGVtcHR5KCRvdXQtPnNvdXJjZUxpbmUpICYmICEgZW1wdHkoJG91dC0+c291cmNlTmFtZSkpIHsKICAgICAgICAgICAgJHRoaXMtPnNvdXJjZUxpbmUgICA9ICRvdXQtPnNvdXJjZUxpbmU7CiAgICAgICAgICAgICRzb3VyY2VJbmRleCAgPSBhcnJheV9zZWFyY2goJG91dC0+c291cmNlTmFtZSwgJHRoaXMtPnNvdXJjZU5hbWVzKTsKICAgICAgICAgICAgJHRoaXMtPnNvdXJjZUNvbHVtbiA9ICRvdXQtPnNvdXJjZUNvbHVtbjsKCiAgICAgICAgICAgIGlmICgkc291cmNlSW5kZXggPT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAkc291cmNlSW5kZXggPSBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgICAgICR0aGlzLT5zb3VyY2VJbmRleCA9ICRzb3VyY2VJbmRleDsKICAgICAgICB9CgogICAgICAgIHN3aXRjaCAoJGNoaWxkWzBdKSB7CiAgICAgICAgICAgIGNhc2UgVHlwZTo6VF9TQ1NTUEhQX0lNUE9SVF9PTkNFOgogICAgICAgICAgICAgICAgJHJhd1BhdGggPSAkdGhpcy0+cmVkdWNlKCRjaGlsZFsxXSk7CgogICAgICAgICAgICAgICAgJHRoaXMtPmNvbXBpbGVJbXBvcnQoJHJhd1BhdGgsICRvdXQsIHRydWUpOwogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIFR5cGU6OlRfSU1QT1JUOgogICAgICAgICAgICAgICAgJHJhd1BhdGggPSAkdGhpcy0+cmVkdWNlKCRjaGlsZFsxXSk7CgogICAgICAgICAgICAgICAgJHRoaXMtPmNvbXBpbGVJbXBvcnQoJHJhd1BhdGgsICRvdXQpOwogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIFR5cGU6OlRfRElSRUNUSVZFOgogICAgICAgICAgICAgICAgJHRoaXMtPmNvbXBpbGVEaXJlY3RpdmUoJGNoaWxkWzFdLCAkb3V0KTsKICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSBUeXBlOjpUX0FUX1JPT1Q6CiAgICAgICAgICAgICAgICAkdGhpcy0+Y29tcGlsZUF0Um9vdCgkY2hpbGRbMV0pOwogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIFR5cGU6OlRfTUVESUE6CiAgICAgICAgICAgICAgICAkdGhpcy0+Y29tcGlsZU1lZGlhKCRjaGlsZFsxXSk7CiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgVHlwZTo6VF9CTE9DSzoKICAgICAgICAgICAgICAgICR0aGlzLT5jb21waWxlQmxvY2soJGNoaWxkWzFdKTsKICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSBUeXBlOjpUX0NIQVJTRVQ6CiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgVHlwZTo6VF9DVVNUT01fUFJPUEVSVFk6CiAgICAgICAgICAgICAgICBsaXN0KCwgJG5hbWUsICR2YWx1ZSkgPSAkY2hpbGQ7CiAgICAgICAgICAgICAgICAkY29tcGlsZWROYW1lID0gJHRoaXMtPmNvbXBpbGVWYWx1ZSgkbmFtZSk7CgogICAgICAgICAgICAgICAgLy8gaWYgdGhlIHZhbHVlIHJlZHVjZXMgdG8gbnVsbCBmcm9tIHNvbWV0aGluZyBlbHNlIHRoZW4KICAgICAgICAgICAgICAgIC8vIHRoZSBwcm9wZXJ0eSBzaG91bGQgYmUgZGlzY2FyZGVkCiAgICAgICAgICAgICAgICBpZiAoJHZhbHVlWzBdICE9PSBUeXBlOjpUX05VTEwpIHsKICAgICAgICAgICAgICAgICAgICAkdmFsdWUgPSAkdGhpcy0+cmVkdWNlKCR2YWx1ZSk7CgogICAgICAgICAgICAgICAgICAgIGlmICgkdmFsdWVbMF0gPT09IFR5cGU6OlRfTlVMTCB8fCAkdmFsdWUgPT09IHN0YXRpYzo6JG51bGxTdHJpbmcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRjb21waWxlZFZhbHVlID0gJHRoaXMtPmNvbXBpbGVWYWx1ZSgkdmFsdWUpOwoKICAgICAgICAgICAgICAgICRsaW5lID0gJHRoaXMtPmZvcm1hdHRlci0+Y3VzdG9tUHJvcGVydHkoCiAgICAgICAgICAgICAgICAgICAgJGNvbXBpbGVkTmFtZSwKICAgICAgICAgICAgICAgICAgICAkY29tcGlsZWRWYWx1ZQogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAkdGhpcy0+YXBwZW5kT3V0cHV0TGluZSgkb3V0LCBUeXBlOjpUX0FTU0lHTiwgJGxpbmUpOwogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIFR5cGU6OlRfQVNTSUdOOgogICAgICAgICAgICAgICAgbGlzdCgsICRuYW1lLCAkdmFsdWUpID0gJGNoaWxkOwoKICAgICAgICAgICAgICAgIGlmICgkbmFtZVswXSA9PT0gVHlwZTo6VF9WQVJJQUJMRSkgewogICAgICAgICAgICAgICAgICAgICRmbGFncyAgICAgPSBpc3NldCgkY2hpbGRbM10pID8gJGNoaWxkWzNdIDogW107CiAgICAgICAgICAgICAgICAgICAgJGlzRGVmYXVsdCA9IFxpbl9hcnJheSgnIWRlZmF1bHQnLCAkZmxhZ3MpOwogICAgICAgICAgICAgICAgICAgICRpc0dsb2JhbCAgPSBcaW5fYXJyYXkoJyFnbG9iYWwnLCAkZmxhZ3MpOwoKICAgICAgICAgICAgICAgICAgICBpZiAoJGlzR2xvYmFsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5zZXQoJG5hbWVbMV0sICR0aGlzLT5yZWR1Y2UoJHZhbHVlKSwgZmFsc2UsICR0aGlzLT5yb290RW52LCAkdmFsdWUpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICRzaG91bGRTZXQgPSAkaXNEZWZhdWx0ICYmCiAgICAgICAgICAgICAgICAgICAgICAgIChcaXNfbnVsbCgkcmVzdWx0ID0gJHRoaXMtPmdldCgkbmFtZVsxXSwgZmFsc2UpKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAkcmVzdWx0ID09PSBzdGF0aWM6OiRudWxsKTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCEgJGlzRGVmYXVsdCB8fCAkc2hvdWxkU2V0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5zZXQoJG5hbWVbMV0sICR0aGlzLT5yZWR1Y2UoJHZhbHVlKSwgdHJ1ZSwgbnVsbCwgJHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJGNvbXBpbGVkTmFtZSA9ICR0aGlzLT5jb21waWxlVmFsdWUoJG5hbWUpOwoKICAgICAgICAgICAgICAgIC8vIGhhbmRsZSBzaG9ydGhhbmQgc3ludGF4ZXMgOiBzaXplIC8gbGluZS1oZWlnaHQuLi4KICAgICAgICAgICAgICAgIGlmIChcaW5fYXJyYXkoJGNvbXBpbGVkTmFtZSwgWydmb250JywgJ2dyaWQtcm93JywgJ2dyaWQtY29sdW1uJywgJ2JvcmRlci1yYWRpdXMnXSkpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJHZhbHVlWzBdID09PSBUeXBlOjpUX1ZBUklBQkxFKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBmb250IHZhbHVlIGNvbWVzIGZyb20gdmFyaWFibGUsIHRoZSBjb250ZW50IGlzIGFscmVhZHkgcmVkdWNlZAogICAgICAgICAgICAgICAgICAgICAgICAvLyAoaS5lLiwgZm9ybXVsYXMgd2VyZSBhbHJlYWR5IGNhbGN1bGF0ZWQpLCBzbyB3ZSBuZWVkIHRoZSBvcmlnaW5hbCB1bnJlZHVjZWQgdmFsdWUKICAgICAgICAgICAgICAgICAgICAgICAgJHZhbHVlID0gJHRoaXMtPmdldCgkdmFsdWVbMV0sIHRydWUsIG51bGwsIHRydWUpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgJHNob3J0aGFuZFZhbHVlPSYkdmFsdWU7CgogICAgICAgICAgICAgICAgICAgICRzaG9ydGhhbmREaXZpZGVyTmVlZHNVbml0ID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgJG1heExpc3RFbGVtZW50cyAgICAgICAgICAgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICRtYXhTaG9ydGhhbmREaXZpZGVycyAgICAgID0gMTsKCiAgICAgICAgICAgICAgICAgICAgc3dpdGNoICgkY29tcGlsZWROYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2JvcmRlci1yYWRpdXMnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJG1heExpc3RFbGVtZW50cyA9IDQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2hvcnRoYW5kRGl2aWRlck5lZWRzVW5pdCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGlmICgkY29tcGlsZWROYW1lID09PSAnZm9udCcgJiYgJHZhbHVlWzBdID09PSBUeXBlOjpUX0xJU1QgJiYgJHZhbHVlWzFdID09PSAnLCcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBpcyB0aGUgY2FzZSBpZiBtb3JlIHRoYW4gb25lIGZvbnQgaXMgZ2l2ZW46IGV4YW1wbGU6ICJmb250OiA0MDAgMWVtLzEuMyBhcmlhbCxoZWx2ZXRpY2EiCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIG5lZWQgdG8gaGFuZGxlIHRoZSBmaXJzdCBsaXN0IGVsZW1lbnQKICAgICAgICAgICAgICAgICAgICAgICAgJHNob3J0aGFuZFZhbHVlPSYkdmFsdWVbMl1bMF07CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBpZiAoJHNob3J0aGFuZFZhbHVlWzBdID09PSBUeXBlOjpUX0VYUFJFU1NJT04gJiYgJHNob3J0aGFuZFZhbHVlWzFdID09PSAnLycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJHJldmVydCA9IHRydWU7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJHNob3J0aGFuZERpdmlkZXJOZWVkc1VuaXQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRkaXZpZGVyID0gJHNob3J0aGFuZFZhbHVlWzNdOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcaXNfYXJyYXkoJGRpdmlkZXIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGRpdmlkZXIgPSAkdGhpcy0+cmVkdWNlKCRkaXZpZGVyLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJGRpdmlkZXIgaW5zdGFuY2VvZiBOdW1iZXIgJiYgXGludHZhbCgkZGl2aWRlci0+Z2V0RGltZW5zaW9uKCkpICYmICRkaXZpZGVyLT51bml0bGVzcygpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHJldmVydCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJHJldmVydCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNob3J0aGFuZFZhbHVlID0gJHRoaXMtPmV4cFRvU3RyaW5nKCRzaG9ydGhhbmRWYWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9IGVsc2VpZiAoJHNob3J0aGFuZFZhbHVlWzBdID09PSBUeXBlOjpUX0xJU1QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAoJHNob3J0aGFuZFZhbHVlWzJdIGFzICYkaXRlbSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRpdGVtWzBdID09PSBUeXBlOjpUX0VYUFJFU1NJT04gJiYgJGl0ZW1bMV0gPT09ICcvJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkbWF4U2hvcnRoYW5kRGl2aWRlcnMgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRyZXZlcnQgPSB0cnVlOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIGxpc3Qgb2YgdmFsdWVzIGlzIHRvbyBsb25nLCB0aGlzIGhhcyB0byBiZSBhIHNob3J0aGFuZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3RoZXJ3aXNlIGl0IGNvdWxkIGJlIGEgcmVhbCBkaXZpc2lvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXGlzX251bGwoJG1heExpc3RFbGVtZW50cykgfHwgXGNvdW50KCRzaG9ydGhhbmRWYWx1ZVsyXSkgPD0gJG1heExpc3RFbGVtZW50cykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRzaG9ydGhhbmREaXZpZGVyTmVlZHNVbml0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGRpdmlkZXIgPSAkaXRlbVszXTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxpc19hcnJheSgkZGl2aWRlcikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGRpdmlkZXIgPSAkdGhpcy0+cmVkdWNlKCRkaXZpZGVyLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkZGl2aWRlciBpbnN0YW5jZW9mIE51bWJlciAmJiBcaW50dmFsKCRkaXZpZGVyLT5nZXREaW1lbnNpb24oKSkgJiYgJGRpdmlkZXItPnVuaXRsZXNzKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHJldmVydCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRyZXZlcnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRpdGVtID0gJHRoaXMtPmV4cFRvU3RyaW5nKCRpdGVtKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRtYXhTaG9ydGhhbmREaXZpZGVycy0tOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGlmIHRoZSB2YWx1ZSByZWR1Y2VzIHRvIG51bGwgZnJvbSBzb21ldGhpbmcgZWxzZSB0aGVuCiAgICAgICAgICAgICAgICAvLyB0aGUgcHJvcGVydHkgc2hvdWxkIGJlIGRpc2NhcmRlZAogICAgICAgICAgICAgICAgaWYgKCR2YWx1ZVswXSAhPT0gVHlwZTo6VF9OVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgJHZhbHVlID0gJHRoaXMtPnJlZHVjZSgkdmFsdWUpOwoKICAgICAgICAgICAgICAgICAgICBpZiAoJHZhbHVlWzBdID09PSBUeXBlOjpUX05VTEwgfHwgJHZhbHVlID09PSBzdGF0aWM6OiRudWxsU3RyaW5nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkY29tcGlsZWRWYWx1ZSA9ICR0aGlzLT5jb21waWxlVmFsdWUoJHZhbHVlKTsKCiAgICAgICAgICAgICAgICAvLyBpZ25vcmUgZW1wdHkgdmFsdWUKICAgICAgICAgICAgICAgIGlmIChcc3RybGVuKCRjb21waWxlZFZhbHVlKSkgewogICAgICAgICAgICAgICAgICAgICRsaW5lID0gJHRoaXMtPmZvcm1hdHRlci0+cHJvcGVydHkoCiAgICAgICAgICAgICAgICAgICAgICAgICRjb21waWxlZE5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICRjb21waWxlZFZhbHVlCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+YXBwZW5kT3V0cHV0TGluZSgkb3V0LCBUeXBlOjpUX0FTU0lHTiwgJGxpbmUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIFR5cGU6OlRfQ09NTUVOVDoKICAgICAgICAgICAgICAgIGlmICgkb3V0LT50eXBlID09PSBUeXBlOjpUX1JPT1QpIHsKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+Y29tcGlsZUNvbW1lbnQoJGNoaWxkKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkbGluZSA9ICR0aGlzLT5jb21waWxlQ29tbWVudFZhbHVlKCRjaGlsZCwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAkdGhpcy0+YXBwZW5kT3V0cHV0TGluZSgkb3V0LCBUeXBlOjpUX0NPTU1FTlQsICRsaW5lKTsKICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSBUeXBlOjpUX01JWElOOgogICAgICAgICAgICBjYXNlIFR5cGU6OlRfRlVOQ1RJT046CiAgICAgICAgICAgICAgICBsaXN0KCwgJGJsb2NrKSA9ICRjaGlsZDsKICAgICAgICAgICAgICAgIGFzc2VydCgkYmxvY2sgaW5zdGFuY2VvZiBDYWxsYWJsZUJsb2NrKTsKICAgICAgICAgICAgICAgIC8vIHRoZSBibG9jayBuZWVkIHRvIGJlIGFibGUgdG8gZ28gdXAgdG8gaXQncyBwYXJlbnQgZW52IHRvIHJlc29sdmUgdmFycwogICAgICAgICAgICAgICAgJGJsb2NrLT5wYXJlbnRFbnYgPSAkdGhpcy0+Z2V0U3RvcmVFbnYoKTsKICAgICAgICAgICAgICAgICR0aGlzLT5zZXQoc3RhdGljOjokbmFtZXNwYWNlc1skYmxvY2stPnR5cGVdIC4gJGJsb2NrLT5uYW1lLCAkYmxvY2ssIHRydWUpOwogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIFR5cGU6OlRfRVhURU5EOgogICAgICAgICAgICAgICAgZm9yZWFjaCAoJGNoaWxkWzFdIGFzICRzZWwpIHsKICAgICAgICAgICAgICAgICAgICAkcmVwbGFjZWRTZWwgPSAkdGhpcy0+cmVwbGFjZVNlbGZTZWxlY3Rvcigkc2VsKTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCRyZXBsYWNlZFNlbCAhPT0gJHNlbCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyAkdGhpcy0+ZXJyb3IoJ1BhcmVudCBzZWxlY3RvcnMgYXJlblwndCBhbGxvd2VkIGhlcmUuJyk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAkcmVzdWx0cyA9ICR0aGlzLT5ldmFsU2VsZWN0b3JzKFskc2VsXSk7CgogICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRyZXN1bHRzIGFzICRyZXN1bHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxjb3VudCgkcmVzdWx0KSAhPT0gMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgJHRoaXMtPmVycm9yKCdjb21wbGV4IHNlbGVjdG9ycyBtYXkgbm90IGJlIGV4dGVuZGVkLicpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBvbmx5IHVzZSB0aGUgZmlyc3Qgb25lCiAgICAgICAgICAgICAgICAgICAgICAgICRyZXN1bHQgPSAkcmVzdWx0WzBdOwogICAgICAgICAgICAgICAgICAgICAgICAkc2VsZWN0b3JzID0gJG91dC0+c2VsZWN0b3JzOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEgJHNlbGVjdG9ycyAmJiBpc3NldCgkY2hpbGRbJ3NlbGZQYXJlbnQnXSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzZWxlY3RvcnMgPSAkdGhpcy0+bXVsdGlwbHlTZWxlY3RvcnMoJHRoaXMtPmVudiwgJGNoaWxkWydzZWxmUGFyZW50J10pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydCgkc2VsZWN0b3JzICE9PSBudWxsKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcY291bnQoJHJlc3VsdCkgPiAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcmVwbGFjZW1lbnQgPSBpbXBsb2RlKCcsICcsICRyZXN1bHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGZuYW1lID0gJHRoaXMtPmdldFByZXR0eVBhdGgoJHRoaXMtPnNvdXJjZU5hbWVzWyR0aGlzLT5zb3VyY2VJbmRleF0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGxpbmUgPSAkdGhpcy0+c291cmNlTGluZTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbWVzc2FnZSA9IDw8PEVPTApvbiBsaW5lICRsaW5lIG9mICRmbmFtZToKQ29tcG91bmQgc2VsZWN0b3JzIG1heSBubyBsb25nZXIgYmUgZXh0ZW5kZWQuCkNvbnNpZGVyIGBAZXh0ZW5kICRyZXBsYWNlbWVudGAgaW5zdGVhZC4KU2VlIGh0dHA6Ly9iaXQubHkvRXh0ZW5kQ29tcG91bmQgZm9yIGRldGFpbHMuCkVPTDsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+bG9nZ2VyLT53YXJuKCRtZXNzYWdlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnB1c2hFeHRlbmRzKCRyZXN1bHQsICRzZWxlY3RvcnMsICRjaGlsZCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIFR5cGU6OlRfSUY6CiAgICAgICAgICAgICAgICBsaXN0KCwgJGlmKSA9ICRjaGlsZDsKICAgICAgICAgICAgICAgIGFzc2VydCgkaWYgaW5zdGFuY2VvZiBJZkJsb2NrKTsKCiAgICAgICAgICAgICAgICBpZiAoJHRoaXMtPmlzVHJ1dGh5KCR0aGlzLT5yZWR1Y2UoJGlmLT5jb25kLCB0cnVlKSkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPmNvbXBpbGVDaGlsZHJlbigkaWYtPmNoaWxkcmVuLCAkb3V0KTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBmb3JlYWNoICgkaWYtPmNhc2VzIGFzICRjYXNlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICAgICAkY2FzZSBpbnN0YW5jZW9mIEVsc2VCbG9jayB8fAogICAgICAgICAgICAgICAgICAgICAgICAkY2FzZSBpbnN0YW5jZW9mIEVsc2VpZkJsb2NrICYmICR0aGlzLT5pc1RydXRoeSgkdGhpcy0+cmVkdWNlKCRjYXNlLT5jb25kKSkKICAgICAgICAgICAgICAgICAgICApIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5jb21waWxlQ2hpbGRyZW4oJGNhc2UtPmNoaWxkcmVuLCAkb3V0KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgVHlwZTo6VF9FQUNIOgogICAgICAgICAgICAgICAgbGlzdCgsICRlYWNoKSA9ICRjaGlsZDsKICAgICAgICAgICAgICAgIGFzc2VydCgkZWFjaCBpbnN0YW5jZW9mIEVhY2hCbG9jayk7CgogICAgICAgICAgICAgICAgJGxpc3QgPSAkdGhpcy0+Y29lcmNlTGlzdCgkdGhpcy0+cmVkdWNlKCRlYWNoLT5saXN0KSwgJywnLCB0cnVlKTsKCiAgICAgICAgICAgICAgICAkdGhpcy0+cHVzaEVudigpOwoKICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRsaXN0WzJdIGFzICRpdGVtKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKFxjb3VudCgkZWFjaC0+dmFycykgPT09IDEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnNldCgkZWFjaC0+dmFyc1swXSwgJGl0ZW0sIHRydWUpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QoLCwgJHZhbHVlcykgPSAkdGhpcy0+Y29lcmNlTGlzdCgkaXRlbSk7CgogICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICgkZWFjaC0+dmFycyBhcyAkaSA9PiAkdmFyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+c2V0KCR2YXIsIGlzc2V0KCR2YWx1ZXNbJGldKSA/ICR2YWx1ZXNbJGldIDogc3RhdGljOjokbnVsbCwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICRyZXQgPSAkdGhpcy0+Y29tcGlsZUNoaWxkcmVuKCRlYWNoLT5jaGlsZHJlbiwgJG91dCk7CgogICAgICAgICAgICAgICAgICAgIGlmICgkcmV0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRzdG9yZSA9ICR0aGlzLT5lbnYtPnN0b3JlOwogICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+cG9wRW52KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5iYWNrUHJvcGFnYXRlRW52KCRzdG9yZSwgJGVhY2gtPnZhcnMpOwoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRyZXQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJHN0b3JlID0gJHRoaXMtPmVudi0+c3RvcmU7CiAgICAgICAgICAgICAgICAkdGhpcy0+cG9wRW52KCk7CiAgICAgICAgICAgICAgICAkdGhpcy0+YmFja1Byb3BhZ2F0ZUVudigkc3RvcmUsICRlYWNoLT52YXJzKTsKCiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgVHlwZTo6VF9XSElMRToKICAgICAgICAgICAgICAgIGxpc3QoLCAkd2hpbGUpID0gJGNoaWxkOwogICAgICAgICAgICAgICAgYXNzZXJ0KCR3aGlsZSBpbnN0YW5jZW9mIFdoaWxlQmxvY2spOwoKICAgICAgICAgICAgICAgIHdoaWxlICgkdGhpcy0+aXNUcnV0aHkoJHRoaXMtPnJlZHVjZSgkd2hpbGUtPmNvbmQsIHRydWUpKSkgewogICAgICAgICAgICAgICAgICAgICRyZXQgPSAkdGhpcy0+Y29tcGlsZUNoaWxkcmVuKCR3aGlsZS0+Y2hpbGRyZW4sICRvdXQpOwoKICAgICAgICAgICAgICAgICAgICBpZiAoJHJldCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHJldDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgVHlwZTo6VF9GT1I6CiAgICAgICAgICAgICAgICBsaXN0KCwgJGZvcikgPSAkY2hpbGQ7CiAgICAgICAgICAgICAgICBhc3NlcnQoJGZvciBpbnN0YW5jZW9mIEZvckJsb2NrKTsKCiAgICAgICAgICAgICAgICAkc3RhcnROdW1iZXIgPSAkdGhpcy0+YXNzZXJ0TnVtYmVyKCR0aGlzLT5yZWR1Y2UoJGZvci0+c3RhcnQsIHRydWUpKTsKICAgICAgICAgICAgICAgICRlbmROdW1iZXIgPSAkdGhpcy0+YXNzZXJ0TnVtYmVyKCR0aGlzLT5yZWR1Y2UoJGZvci0+ZW5kLCB0cnVlKSk7CgogICAgICAgICAgICAgICAgJHN0YXJ0ID0gJHRoaXMtPmFzc2VydEludGVnZXIoJHN0YXJ0TnVtYmVyKTsKCiAgICAgICAgICAgICAgICAkbnVtZXJhdG9yVW5pdHMgPSAkc3RhcnROdW1iZXItPmdldE51bWVyYXRvclVuaXRzKCk7CiAgICAgICAgICAgICAgICAkZGVub21pbmF0b3JVbml0cyA9ICRzdGFydE51bWJlci0+Z2V0RGVub21pbmF0b3JVbml0cygpOwoKICAgICAgICAgICAgICAgICRlbmQgPSAkdGhpcy0+YXNzZXJ0SW50ZWdlcigkZW5kTnVtYmVyLT5jb2VyY2UoJG51bWVyYXRvclVuaXRzLCAkZGVub21pbmF0b3JVbml0cykpOwoKICAgICAgICAgICAgICAgICRkID0gJHN0YXJ0IDwgJGVuZCA/IDEgOiAtMTsKCiAgICAgICAgICAgICAgICAkdGhpcy0+cHVzaEVudigpOwoKICAgICAgICAgICAgICAgIGZvciAoOzspIHsKICAgICAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgICAgICghICRmb3ItPnVudGlsICYmICRzdGFydCAtICRkID09ICRlbmQpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICgkZm9yLT51bnRpbCAmJiAkc3RhcnQgPT0gJGVuZCkKICAgICAgICAgICAgICAgICAgICApIHsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+c2V0KCRmb3ItPnZhciwgbmV3IE51bWJlcigkc3RhcnQsICRudW1lcmF0b3JVbml0cywgJGRlbm9taW5hdG9yVW5pdHMpKTsKICAgICAgICAgICAgICAgICAgICAkc3RhcnQgKz0gJGQ7CgogICAgICAgICAgICAgICAgICAgICRyZXQgPSAkdGhpcy0+Y29tcGlsZUNoaWxkcmVuKCRmb3ItPmNoaWxkcmVuLCAkb3V0KTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCRyZXQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJHN0b3JlID0gJHRoaXMtPmVudi0+c3RvcmU7CiAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5wb3BFbnYoKTsKICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmJhY2tQcm9wYWdhdGVFbnYoJHN0b3JlLCBbJGZvci0+dmFyXSk7CgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHJldDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJHN0b3JlID0gJHRoaXMtPmVudi0+c3RvcmU7CiAgICAgICAgICAgICAgICAkdGhpcy0+cG9wRW52KCk7CiAgICAgICAgICAgICAgICAkdGhpcy0+YmFja1Byb3BhZ2F0ZUVudigkc3RvcmUsIFskZm9yLT52YXJdKTsKCiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgVHlwZTo6VF9SRVRVUk46CiAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPnJlZHVjZSgkY2hpbGRbMV0sIHRydWUpOwoKICAgICAgICAgICAgY2FzZSBUeXBlOjpUX05FU1RFRF9QUk9QRVJUWToKICAgICAgICAgICAgICAgICR0aGlzLT5jb21waWxlTmVzdGVkUHJvcGVydGllc0Jsb2NrKCRjaGlsZFsxXSwgJG91dCk7CiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgVHlwZTo6VF9JTkNMVURFOgogICAgICAgICAgICAgICAgLy8gaW5jbHVkaW5nIGEgbWl4aW4KICAgICAgICAgICAgICAgIGxpc3QoLCAkbmFtZSwgJGFyZ1ZhbHVlcywgJGNvbnRlbnQsICRhcmdVc2luZykgPSAkY2hpbGQ7CgogICAgICAgICAgICAgICAgJG1peGluID0gJHRoaXMtPmdldChzdGF0aWM6OiRuYW1lc3BhY2VzWydtaXhpbiddIC4gJG5hbWUsIGZhbHNlKTsKCiAgICAgICAgICAgICAgICBpZiAoISAkbWl4aW4pIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyAkdGhpcy0+ZXJyb3IoIlVuZGVmaW5lZCBtaXhpbiAkbmFtZSIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGFzc2VydCgkbWl4aW4gaW5zdGFuY2VvZiBDYWxsYWJsZUJsb2NrKTsKCiAgICAgICAgICAgICAgICAkY2FsbGluZ1Njb3BlID0gJHRoaXMtPmdldFN0b3JlRW52KCk7CgogICAgICAgICAgICAgICAgLy8gcHVzaCBzY29wZSwgYXBwbHkgYXJncwogICAgICAgICAgICAgICAgJHRoaXMtPnB1c2hFbnYoKTsKICAgICAgICAgICAgICAgICR0aGlzLT5lbnYtPmRlcHRoLS07CgogICAgICAgICAgICAgICAgLy8gRmluZCB0aGUgcGFyZW50IHNlbGVjdG9ycyBpbiB0aGUgZW52IHRvIGJlIGFibGUgdG8ga25vdyB3aGF0ICcmJyByZWZlcnMgdG8gaW4gdGhlIG1peGluCiAgICAgICAgICAgICAgICAvLyBhbmQgYXNzaWduIHRoaXMgZmFrZSBwYXJlbnQgdG8gY2hpbGRzCiAgICAgICAgICAgICAgICAkc2VsZlBhcmVudCA9IG51bGw7CgogICAgICAgICAgICAgICAgaWYgKGlzc2V0KCRjaGlsZFsnc2VsZlBhcmVudCddKSAmJiAkY2hpbGRbJ3NlbGZQYXJlbnQnXSBpbnN0YW5jZW9mIEJsb2NrICYmIGlzc2V0KCRjaGlsZFsnc2VsZlBhcmVudCddLT5zZWxlY3RvcnMpKSB7CiAgICAgICAgICAgICAgICAgICAgJHNlbGZQYXJlbnQgPSAkY2hpbGRbJ3NlbGZQYXJlbnQnXTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJHBhcmVudFNlbGVjdG9ycyA9ICR0aGlzLT5tdWx0aXBseVNlbGVjdG9ycygkdGhpcy0+ZW52KTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCRwYXJlbnRTZWxlY3RvcnMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJHBhcmVudCA9IG5ldyBCbG9jaygpOwogICAgICAgICAgICAgICAgICAgICAgICAkcGFyZW50LT5zZWxlY3RvcnMgPSAkcGFyZW50U2VsZWN0b3JzOwoKICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAoJG1peGluLT5jaGlsZHJlbiBhcyAkayA9PiAkY2hpbGQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc3NldCgkY2hpbGRbMV0pICYmICRjaGlsZFsxXSBpbnN0YW5jZW9mIEJsb2NrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJG1peGluLT5jaGlsZHJlblska11bMV0tPnBhcmVudCA9ICRwYXJlbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gY2xvbmUgdGhlIHN0b3JlZCBjb250ZW50IHRvIG5vdCBoYXZlIGl0cyBzY29wZSBzcG9pbGVkIGJ5IGEgZnVydGhlciBjYWxsIHRvIHRoZSBzYW1lIG1peGluCiAgICAgICAgICAgICAgICAvLyBpLmUuLCByZWN1cnNpdmUgQGluY2x1ZGUgb2YgdGhlIHNhbWUgbWl4aW4KICAgICAgICAgICAgICAgIGlmIChpc3NldCgkY29udGVudCkpIHsKICAgICAgICAgICAgICAgICAgICAkY29weUNvbnRlbnQgPSBjbG9uZSAkY29udGVudDsKICAgICAgICAgICAgICAgICAgICAkY29weUNvbnRlbnQtPnNjb3BlID0gY2xvbmUgJGNhbGxpbmdTY29wZTsKCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnNldFJhdyhzdGF0aWM6OiRuYW1lc3BhY2VzWydzcGVjaWFsJ10gLiAnY29udGVudCcsICRjb3B5Q29udGVudCwgJHRoaXMtPmVudik7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICR0aGlzLT5zZXRSYXcoc3RhdGljOjokbmFtZXNwYWNlc1snc3BlY2lhbCddIC4gJ2NvbnRlbnQnLCBudWxsLCAkdGhpcy0+ZW52KTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBzYXZlIHRoZSAidXNpbmciIGFyZ3VtZW50IGxpc3QgZm9yIGFwcGx5aW5nIGl0IHRvIHdoZW4gIkBjb250ZW50IiBpcyBpbnZva2VkCiAgICAgICAgICAgICAgICBpZiAoaXNzZXQoJGFyZ1VzaW5nKSkgewogICAgICAgICAgICAgICAgICAgICR0aGlzLT5zZXRSYXcoc3RhdGljOjokbmFtZXNwYWNlc1snc3BlY2lhbCddIC4gJ3VzaW5nJywgJGFyZ1VzaW5nLCAkdGhpcy0+ZW52KTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnNldFJhdyhzdGF0aWM6OiRuYW1lc3BhY2VzWydzcGVjaWFsJ10gLiAndXNpbmcnLCBudWxsLCAkdGhpcy0+ZW52KTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoaXNzZXQoJG1peGluLT5hcmdzKSkgewogICAgICAgICAgICAgICAgICAgICR0aGlzLT5hcHBseUFyZ3VtZW50cygkbWl4aW4tPmFyZ3MsICRhcmdWYWx1ZXMpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICR0aGlzLT5lbnYtPm1hcmtlciA9ICdtaXhpbic7CgogICAgICAgICAgICAgICAgaWYgKCEgZW1wdHkoJG1peGluLT5wYXJlbnRFbnYpKSB7CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmVudi0+ZGVjbGFyYXRpb25TY29wZVBhcmVudCA9ICRtaXhpbi0+cGFyZW50RW52OwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyAkdGhpcy0+ZXJyb3IoIkBtaXhpbiAkbmFtZSgpIHdpdGhvdXQgcGFyZW50RW52Iik7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJHRoaXMtPmNvbXBpbGVDaGlsZHJlbk5vUmV0dXJuKCRtaXhpbi0+Y2hpbGRyZW4sICRvdXQsICRzZWxmUGFyZW50LCAkdGhpcy0+ZW52LT5tYXJrZXIgLiAnICcgLiAkbmFtZSk7CgogICAgICAgICAgICAgICAgJHRoaXMtPnBvcEVudigpOwogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIFR5cGU6OlRfTUlYSU5fQ09OVEVOVDoKICAgICAgICAgICAgICAgICRlbnYgICAgICAgID0gaXNzZXQoJHRoaXMtPnN0b3JlRW52KSA/ICR0aGlzLT5zdG9yZUVudiA6ICR0aGlzLT5lbnY7CiAgICAgICAgICAgICAgICAkY29udGVudCAgICA9ICR0aGlzLT5nZXQoc3RhdGljOjokbmFtZXNwYWNlc1snc3BlY2lhbCddIC4gJ2NvbnRlbnQnLCBmYWxzZSwgJGVudik7CiAgICAgICAgICAgICAgICAkYXJnVXNpbmcgICA9ICR0aGlzLT5nZXQoc3RhdGljOjokbmFtZXNwYWNlc1snc3BlY2lhbCddIC4gJ3VzaW5nJywgZmFsc2UsICRlbnYpOwogICAgICAgICAgICAgICAgJGFyZ0NvbnRlbnQgPSAkY2hpbGRbMV07CgogICAgICAgICAgICAgICAgaWYgKCEgJGNvbnRlbnQpIHsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkc3RvcmVFbnYgPSAkdGhpcy0+c3RvcmVFbnY7CiAgICAgICAgICAgICAgICAkdmFyc1VzaW5nID0gW107CgogICAgICAgICAgICAgICAgaWYgKGlzc2V0KCRhcmdVc2luZykgJiYgaXNzZXQoJGFyZ0NvbnRlbnQpKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBhcmd1bWVudHMgcHJvdmlkZWQgZm9yIHRoZSBjb250ZW50IHdpdGggdGhlIG5hbWVzIHByb3ZpZGVkIGluIHRoZSAidXNpbmciIGFyZ3VtZW50IGxpc3QKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+c3RvcmVFbnYgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICR2YXJzVXNpbmcgPSAkdGhpcy0+YXBwbHlBcmd1bWVudHMoJGFyZ1VzaW5nLCAkYXJnQ29udGVudCwgZmFsc2UpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIHJlc3RvcmUgdGhlIHNjb3BlIGZyb20gdGhlIEBjb250ZW50CiAgICAgICAgICAgICAgICAkdGhpcy0+c3RvcmVFbnYgPSAkY29udGVudC0+c2NvcGU7CgogICAgICAgICAgICAgICAgLy8gYXBwZW5kIHRoZSB2YXJzIGZyb20gdXNpbmcgaWYgYW55CiAgICAgICAgICAgICAgICBmb3JlYWNoICgkdmFyc1VzaW5nIGFzICRuYW1lID0+ICR2YWwpIHsKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+c2V0KCRuYW1lLCAkdmFsLCB0cnVlLCAkdGhpcy0+c3RvcmVFbnYpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICR0aGlzLT5jb21waWxlQ2hpbGRyZW5Ob1JldHVybigkY29udGVudC0+Y2hpbGRyZW4sICRvdXQpOwoKICAgICAgICAgICAgICAgICR0aGlzLT5zdG9yZUVudiA9ICRzdG9yZUVudjsKICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSBUeXBlOjpUX0RFQlVHOgogICAgICAgICAgICAgICAgbGlzdCgsICR2YWx1ZSkgPSAkY2hpbGQ7CgogICAgICAgICAgICAgICAgJGZuYW1lID0gJHRoaXMtPmdldFByZXR0eVBhdGgoJHRoaXMtPnNvdXJjZU5hbWVzWyR0aGlzLT5zb3VyY2VJbmRleF0pOwogICAgICAgICAgICAgICAgJGxpbmUgID0gJHRoaXMtPnNvdXJjZUxpbmU7CiAgICAgICAgICAgICAgICAkdmFsdWUgPSAkdGhpcy0+Y29tcGlsZURlYnVnVmFsdWUoJHZhbHVlKTsKCiAgICAgICAgICAgICAgICAkdGhpcy0+bG9nZ2VyLT5kZWJ1ZygiJGZuYW1lOiRsaW5lIERFQlVHOiAkdmFsdWUiKTsKICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSBUeXBlOjpUX1dBUk46CiAgICAgICAgICAgICAgICBsaXN0KCwgJHZhbHVlKSA9ICRjaGlsZDsKCiAgICAgICAgICAgICAgICAkZm5hbWUgPSAkdGhpcy0+Z2V0UHJldHR5UGF0aCgkdGhpcy0+c291cmNlTmFtZXNbJHRoaXMtPnNvdXJjZUluZGV4XSk7CiAgICAgICAgICAgICAgICAkbGluZSAgPSAkdGhpcy0+c291cmNlTGluZTsKICAgICAgICAgICAgICAgICR2YWx1ZSA9ICR0aGlzLT5jb21waWxlRGVidWdWYWx1ZSgkdmFsdWUpOwoKICAgICAgICAgICAgICAgICR0aGlzLT5sb2dnZXItPndhcm4oIiR2YWx1ZVxuICAgICAgICAgb24gbGluZSAkbGluZSBvZiAkZm5hbWUiKTsKICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSBUeXBlOjpUX0VSUk9SOgogICAgICAgICAgICAgICAgbGlzdCgsICR2YWx1ZSkgPSAkY2hpbGQ7CgogICAgICAgICAgICAgICAgJGZuYW1lID0gJHRoaXMtPmdldFByZXR0eVBhdGgoJHRoaXMtPnNvdXJjZU5hbWVzWyR0aGlzLT5zb3VyY2VJbmRleF0pOwogICAgICAgICAgICAgICAgJGxpbmUgID0gJHRoaXMtPnNvdXJjZUxpbmU7CiAgICAgICAgICAgICAgICAkdmFsdWUgPSAkdGhpcy0+Y29tcGlsZVZhbHVlKCR0aGlzLT5yZWR1Y2UoJHZhbHVlLCB0cnVlKSk7CgogICAgICAgICAgICAgICAgdGhyb3cgJHRoaXMtPmVycm9yKCJGaWxlICRmbmFtZSBvbiBsaW5lICRsaW5lIEVSUk9SOiAkdmFsdWVcbiIpOwoKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIHRocm93ICR0aGlzLT5lcnJvcigidW5rbm93biBjaGlsZCB0eXBlOiAkY2hpbGRbMF0iKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgIC8qKgogICAgICogUmVkdWNlIGV4cHJlc3Npb24gdG8gc3RyaW5nCiAgICAgKgogICAgICogQHBhcmFtIGFycmF5ICRleHAKICAgICAqIEBwYXJhbSBib29sICRrZWVwUGFyZW5zCiAgICAgKgogICAgICogQHJldHVybiBhcnJheQogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gZXhwVG9TdHJpbmcoJGV4cCwgJGtlZXBQYXJlbnMgPSBmYWxzZSkKICAgIHsKICAgICAgICBsaXN0KCwgJG9wLCAkbGVmdCwgJHJpZ2h0LCAkaW5QYXJlbnMsICR3aGl0ZUxlZnQsICR3aGl0ZVJpZ2h0KSA9ICRleHA7CgogICAgICAgICRjb250ZW50ID0gW107CgogICAgICAgIGlmICgka2VlcFBhcmVucyAmJiAkaW5QYXJlbnMpIHsKICAgICAgICAgICAgJGNvbnRlbnRbXSA9ICcoJzsKICAgICAgICB9CgogICAgICAgICRjb250ZW50W10gPSAkdGhpcy0+cmVkdWNlKCRsZWZ0KTsKCiAgICAgICAgaWYgKCR3aGl0ZUxlZnQpIHsKICAgICAgICAgICAgJGNvbnRlbnRbXSA9ICcgJzsKICAgICAgICB9CgogICAgICAgICRjb250ZW50W10gPSAkb3A7CgogICAgICAgIGlmICgkd2hpdGVSaWdodCkgewogICAgICAgICAgICAkY29udGVudFtdID0gJyAnOwogICAgICAgIH0KCiAgICAgICAgJGNvbnRlbnRbXSA9ICR0aGlzLT5yZWR1Y2UoJHJpZ2h0KTsKCiAgICAgICAgaWYgKCRrZWVwUGFyZW5zICYmICRpblBhcmVucykgewogICAgICAgICAgICAkY29udGVudFtdID0gJyknOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIFtUeXBlOjpUX1NUUklORywgJycsICRjb250ZW50XTsKICAgIH0KCiAgICAvKioKICAgICAqIElzIHRydXRoeT8KICAgICAqCiAgICAgKiBAcGFyYW0gYXJyYXl8TnVtYmVyICR2YWx1ZQogICAgICoKICAgICAqIEByZXR1cm4gYm9vbAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gaXNUcnV0aHkoJHZhbHVlKQogICAgewogICAgICAgIHJldHVybiAkdmFsdWUgIT09IHN0YXRpYzo6JGZhbHNlICYmICR2YWx1ZSAhPT0gc3RhdGljOjokbnVsbDsKICAgIH0KCiAgICAvKioKICAgICAqIElzIHRoZSB2YWx1ZSBhIGRpcmVjdCByZWxhdGlvbnNoaXAgY29tYmluYXRvcj8KICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICR2YWx1ZQogICAgICoKICAgICAqIEByZXR1cm4gYm9vbAogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gaXNJbW1lZGlhdGVSZWxhdGlvbnNoaXBDb21iaW5hdG9yKCR2YWx1ZSkKICAgIHsKICAgICAgICByZXR1cm4gJHZhbHVlID09PSAnPicgfHwgJHZhbHVlID09PSAnKycgfHwgJHZhbHVlID09PSAnfic7CiAgICB9CgogICAgLyoqCiAgICAgKiBTaG91bGQgJHZhbHVlIGNhdXNlIGl0cyBvcGVyYW5kIHRvIGV2YWwKICAgICAqCiAgICAgKiBAcGFyYW0gYXJyYXkgJHZhbHVlCiAgICAgKgogICAgICogQHJldHVybiBib29sCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBzaG91bGRFdmFsKCR2YWx1ZSkKICAgIHsKICAgICAgICBzd2l0Y2ggKCR2YWx1ZVswXSkgewogICAgICAgICAgICBjYXNlIFR5cGU6OlRfRVhQUkVTU0lPTjoKICAgICAgICAgICAgICAgIGlmICgkdmFsdWVbMV0gPT09ICcvJykgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+c2hvdWxkRXZhbCgkdmFsdWVbMl0pIHx8ICR0aGlzLT5zaG91bGRFdmFsKCR2YWx1ZVszXSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gZmFsbC10aHJ1CiAgICAgICAgICAgIGNhc2UgVHlwZTo6VF9WQVJJQUJMRToKICAgICAgICAgICAgY2FzZSBUeXBlOjpUX0ZVTkNUSU9OX0NBTEw6CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICAvKioKICAgICAqIFJlZHVjZSB2YWx1ZQogICAgICoKICAgICAqIEBwYXJhbSBhcnJheXxOdW1iZXIgJHZhbHVlCiAgICAgKiBAcGFyYW0gYm9vbCAgICAgICAgICRpbkV4cAogICAgICoKICAgICAqIEByZXR1cm4gYXJyYXl8TnVtYmVyCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiByZWR1Y2UoJHZhbHVlLCAkaW5FeHAgPSBmYWxzZSkKICAgIHsKICAgICAgICBpZiAoJHZhbHVlIGluc3RhbmNlb2YgTnVtYmVyKSB7CiAgICAgICAgICAgIHJldHVybiAkdmFsdWU7CiAgICAgICAgfQoKICAgICAgICBzd2l0Y2ggKCR2YWx1ZVswXSkgewogICAgICAgICAgICBjYXNlIFR5cGU6OlRfRVhQUkVTU0lPTjoKICAgICAgICAgICAgICAgIGxpc3QoLCAkb3AsICRsZWZ0LCAkcmlnaHQsICRpblBhcmVucykgPSAkdmFsdWU7CgogICAgICAgICAgICAgICAgJG9wTmFtZSA9IGlzc2V0KHN0YXRpYzo6JG9wZXJhdG9yTmFtZXNbJG9wXSkgPyBzdGF0aWM6OiRvcGVyYXRvck5hbWVzWyRvcF0gOiAkb3A7CiAgICAgICAgICAgICAgICAkaW5FeHAgPSAkaW5FeHAgfHwgJHRoaXMtPnNob3VsZEV2YWwoJGxlZnQpIHx8ICR0aGlzLT5zaG91bGRFdmFsKCRyaWdodCk7CgogICAgICAgICAgICAgICAgJGxlZnQgPSAkdGhpcy0+cmVkdWNlKCRsZWZ0LCB0cnVlKTsKCiAgICAgICAgICAgICAgICBpZiAoJG9wICE9PSAnYW5kJyAmJiAkb3AgIT09ICdvcicpIHsKICAgICAgICAgICAgICAgICAgICAkcmlnaHQgPSAkdGhpcy0+cmVkdWNlKCRyaWdodCwgdHJ1ZSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gc3BlY2lhbCBjYXNlOiBsb29rcyBsaWtlIGNzcyBzaG9ydGhhbmQKICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAkb3BOYW1lID09ICdkaXYnICYmICEgJGluUGFyZW5zICYmICEgJGluRXhwICYmCiAgICAgICAgICAgICAgICAgICAgKCgkcmlnaHRbMF0gIT09IFR5cGU6OlRfTlVNQkVSICYmIGlzc2V0KCRyaWdodFsyXSkgJiYgJHJpZ2h0WzJdICE9ICcnKSB8fAogICAgICAgICAgICAgICAgICAgICgkcmlnaHRbMF0gPT09IFR5cGU6OlRfTlVNQkVSICYmICEgJHJpZ2h0LT51bml0bGVzcygpKSkKICAgICAgICAgICAgICAgICkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+ZXhwVG9TdHJpbmcoJHZhbHVlKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkbGVmdCAgPSAkdGhpcy0+Y29lcmNlRm9yRXhwcmVzc2lvbigkbGVmdCk7CiAgICAgICAgICAgICAgICAkcmlnaHQgPSAkdGhpcy0+Y29lcmNlRm9yRXhwcmVzc2lvbigkcmlnaHQpOwogICAgICAgICAgICAgICAgJGx0eXBlID0gJGxlZnRbMF07CiAgICAgICAgICAgICAgICAkcnR5cGUgPSAkcmlnaHRbMF07CgogICAgICAgICAgICAgICAgJHVjT3BOYW1lID0gdWNmaXJzdCgkb3BOYW1lKTsKICAgICAgICAgICAgICAgICR1Y0xUeXBlICA9IHVjZmlyc3QoJGx0eXBlKTsKICAgICAgICAgICAgICAgICR1Y1JUeXBlICA9IHVjZmlyc3QoJHJ0eXBlKTsKCiAgICAgICAgICAgICAgICAkc2hvdWxkRXZhbCA9ICRpblBhcmVucyB8fCAkaW5FeHA7CgogICAgICAgICAgICAgICAgLy8gdGhpcyB0cmllczoKICAgICAgICAgICAgICAgIC8vIDEuIG9wW29wIG5hbWVdW2xlZnQgdHlwZV1bcmlnaHQgdHlwZV0KICAgICAgICAgICAgICAgIC8vIDIuIG9wW2xlZnQgdHlwZV1bcmlnaHQgdHlwZV0gKHBhc3NpbmcgdGhlIG9wIGFzIGZpcnN0IGFyZykKICAgICAgICAgICAgICAgIC8vIDMuIG9wW29wIG5hbWVdCiAgICAgICAgICAgICAgICBpZiAoXGlzX2NhbGxhYmxlKFskdGhpcywgJGZuID0gIm9weyR1Y09wTmFtZX17JHVjTFR5cGV9eyR1Y1JUeXBlfSJdKSkgewogICAgICAgICAgICAgICAgICAgICRvdXQgPSAkdGhpcy0+JGZuKCRsZWZ0LCAkcmlnaHQsICRzaG91bGRFdmFsKTsKICAgICAgICAgICAgICAgIH0gZWxzZWlmIChcaXNfY2FsbGFibGUoWyR0aGlzLCAkZm4gPSAib3B7JHVjTFR5cGV9eyR1Y1JUeXBlfSJdKSkgewogICAgICAgICAgICAgICAgICAgICRvdXQgPSAkdGhpcy0+JGZuKCRvcCwgJGxlZnQsICRyaWdodCwgJHNob3VsZEV2YWwpOwogICAgICAgICAgICAgICAgfSBlbHNlaWYgKFxpc19jYWxsYWJsZShbJHRoaXMsICRmbiA9ICJvcHskdWNPcE5hbWV9Il0pKSB7CiAgICAgICAgICAgICAgICAgICAgJG91dCA9ICR0aGlzLT4kZm4oJGxlZnQsICRyaWdodCwgJHNob3VsZEV2YWwpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkb3V0ID0gbnVsbDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoaXNzZXQoJG91dCkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJG91dDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPmV4cFRvU3RyaW5nKCR2YWx1ZSk7CgogICAgICAgICAgICBjYXNlIFR5cGU6OlRfVU5BUlk6CiAgICAgICAgICAgICAgICBsaXN0KCwgJG9wLCAkZXhwLCAkaW5QYXJlbnMpID0gJHZhbHVlOwoKICAgICAgICAgICAgICAgICRpbkV4cCA9ICRpbkV4cCB8fCAkdGhpcy0+c2hvdWxkRXZhbCgkZXhwKTsKICAgICAgICAgICAgICAgICRleHAgPSAkdGhpcy0+cmVkdWNlKCRleHApOwoKICAgICAgICAgICAgICAgIGlmICgkZXhwIGluc3RhbmNlb2YgTnVtYmVyKSB7CiAgICAgICAgICAgICAgICAgICAgc3dpdGNoICgkb3ApIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnKyc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJGV4cDsKCiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJy0nOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRleHAtPnVuYXJ5TWludXMoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCRvcCA9PT0gJ25vdCcpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJGluRXhwIHx8ICRpblBhcmVucykgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJGV4cCA9PT0gc3RhdGljOjokZmFsc2UgfHwgJGV4cCA9PT0gc3RhdGljOjokbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXRpYzo6JHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGF0aWM6OiRmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICRvcCA9ICRvcCAuICcgJzsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gW1R5cGU6OlRfU1RSSU5HLCAnJywgWyRvcCwgJGV4cF1dOwoKICAgICAgICAgICAgY2FzZSBUeXBlOjpUX1ZBUklBQkxFOgogICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5yZWR1Y2UoJHRoaXMtPmdldCgkdmFsdWVbMV0pKTsKCiAgICAgICAgICAgIGNhc2UgVHlwZTo6VF9MSVNUOgogICAgICAgICAgICAgICAgZm9yZWFjaCAoJHZhbHVlWzJdIGFzICYkaXRlbSkgewogICAgICAgICAgICAgICAgICAgICRpdGVtID0gJHRoaXMtPnJlZHVjZSgkaXRlbSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB1bnNldCgkaXRlbSk7CgogICAgICAgICAgICAgICAgaWYgKGlzc2V0KCR2YWx1ZVszXSkgJiYgXGlzX2FycmF5KCR2YWx1ZVszXSkpIHsKICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICgkdmFsdWVbM10gYXMgJiRpdGVtKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRpdGVtID0gJHRoaXMtPnJlZHVjZSgkaXRlbSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHVuc2V0KCRpdGVtKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gJHZhbHVlOwoKICAgICAgICAgICAgY2FzZSBUeXBlOjpUX01BUDoKICAgICAgICAgICAgICAgIGZvcmVhY2ggKCR2YWx1ZVsxXSBhcyAmJGl0ZW0pIHsKICAgICAgICAgICAgICAgICAgICAkaXRlbSA9ICR0aGlzLT5yZWR1Y2UoJGl0ZW0pOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGZvcmVhY2ggKCR2YWx1ZVsyXSBhcyAmJGl0ZW0pIHsKICAgICAgICAgICAgICAgICAgICAkaXRlbSA9ICR0aGlzLT5yZWR1Y2UoJGl0ZW0pOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiAkdmFsdWU7CgogICAgICAgICAgICBjYXNlIFR5cGU6OlRfU1RSSU5HOgogICAgICAgICAgICAgICAgZm9yZWFjaCAoJHZhbHVlWzJdIGFzICYkaXRlbSkgewogICAgICAgICAgICAgICAgICAgIGlmIChcaXNfYXJyYXkoJGl0ZW0pIHx8ICRpdGVtIGluc3RhbmNlb2YgTnVtYmVyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRpdGVtID0gJHRoaXMtPnJlZHVjZSgkaXRlbSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiAkdmFsdWU7CgogICAgICAgICAgICBjYXNlIFR5cGU6OlRfSU5URVJQT0xBVEU6CiAgICAgICAgICAgICAgICAkdmFsdWVbMV0gPSAkdGhpcy0+cmVkdWNlKCR2YWx1ZVsxXSk7CgogICAgICAgICAgICAgICAgaWYgKCRpbkV4cCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBbVHlwZTo6VF9LRVlXT1JELCAkdGhpcy0+Y29tcGlsZVZhbHVlKCR2YWx1ZSwgZmFsc2UpXTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gJHZhbHVlOwoKICAgICAgICAgICAgY2FzZSBUeXBlOjpUX0ZVTkNUSU9OX0NBTEw6CiAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPmZuY2FsbCgkdmFsdWVbMV0sICR2YWx1ZVsyXSk7CgogICAgICAgICAgICBjYXNlIFR5cGU6OlRfU0VMRjoKICAgICAgICAgICAgICAgICRzZWxmUGFyZW50ID0gISBlbXB0eSgkdGhpcy0+ZW52LT5ibG9jay0+c2VsZlBhcmVudCkgPyAkdGhpcy0+ZW52LT5ibG9jay0+c2VsZlBhcmVudCA6IG51bGw7CiAgICAgICAgICAgICAgICAkc2VsZlNlbGVjdG9yID0gJHRoaXMtPm11bHRpcGx5U2VsZWN0b3JzKCR0aGlzLT5lbnYsICRzZWxmUGFyZW50KTsKICAgICAgICAgICAgICAgICRzZWxmU2VsZWN0b3IgPSAkdGhpcy0+Y29sbGFwc2VTZWxlY3RvcnNBc0xpc3QoJHNlbGZTZWxlY3Rvcik7CgogICAgICAgICAgICAgICAgcmV0dXJuICRzZWxmU2VsZWN0b3I7CgogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgcmV0dXJuICR2YWx1ZTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBGdW5jdGlvbiBjYWxsZXIKICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nfGFycmF5ICRmdW5jdGlvblJlZmVyZW5jZQogICAgICogQHBhcmFtIGFycmF5ICAgICAgICAkYXJnVmFsdWVzCiAgICAgKgogICAgICogQHJldHVybiBhcnJheXxOdW1iZXIKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGZuY2FsbCgkZnVuY3Rpb25SZWZlcmVuY2UsICRhcmdWYWx1ZXMpCiAgICB7CiAgICAgICAgLy8gYSBzdHJpbmcgbWVhbnMgdGhpcyBpcyBhIHN0YXRpYyBoYXJkIHJlZmVyZW5jZSBjb21pbmcgZnJvbSB0aGUgcGFyc2luZwogICAgICAgIGlmIChpc19zdHJpbmcoJGZ1bmN0aW9uUmVmZXJlbmNlKSkgewogICAgICAgICAgICAkbmFtZSA9ICRmdW5jdGlvblJlZmVyZW5jZTsKCiAgICAgICAgICAgICRmdW5jdGlvblJlZmVyZW5jZSA9ICR0aGlzLT5nZXRGdW5jdGlvblJlZmVyZW5jZSgkbmFtZSk7CiAgICAgICAgICAgIGlmICgkZnVuY3Rpb25SZWZlcmVuY2UgPT09IHN0YXRpYzo6JG51bGwgfHwgJGZ1bmN0aW9uUmVmZXJlbmNlWzBdICE9PSBUeXBlOjpUX0ZVTkNUSU9OX1JFRkVSRU5DRSkgewogICAgICAgICAgICAgICAgJGZ1bmN0aW9uUmVmZXJlbmNlID0gW1R5cGU6OlRfRlVOQ1RJT04sICRuYW1lLCBbVHlwZTo6VF9MSVNULCAnLCcsIFtdXV07CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIGEgZnVuY3Rpb24gdHlwZSBtZWFucyB3ZSBqdXN0IHdhbnQgYSBwbGFpbiBjc3MgZnVuY3Rpb24gY2FsbAogICAgICAgIGlmICgkZnVuY3Rpb25SZWZlcmVuY2VbMF0gPT09IFR5cGU6OlRfRlVOQ1RJT04pIHsKICAgICAgICAgICAgLy8gZm9yIENTUyBmdW5jdGlvbnMsIHNpbXBseSBmbGF0dGVuIHRoZSBhcmd1bWVudHMgaW50byBhIGxpc3QKICAgICAgICAgICAgJGxpc3RBcmdzID0gW107CgogICAgICAgICAgICBmb3JlYWNoICgoYXJyYXkpICRhcmdWYWx1ZXMgYXMgJGFyZykgewogICAgICAgICAgICAgICAgaWYgKGVtcHR5KCRhcmdbMF0pIHx8IGNvdW50KCRhcmdWYWx1ZXMpID09PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgJGxpc3RBcmdzW10gPSAkdGhpcy0+cmVkdWNlKCR0aGlzLT5zdHJpbmdpZnlGbmNhbGxBcmdzKCRhcmdbMV0pKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIFtUeXBlOjpUX0ZVTkNUSU9OLCAkZnVuY3Rpb25SZWZlcmVuY2VbMV0sIFtUeXBlOjpUX0xJU1QsICcsJywgJGxpc3RBcmdzXV07CiAgICAgICAgfQoKICAgICAgICBpZiAoJGZ1bmN0aW9uUmVmZXJlbmNlID09PSBzdGF0aWM6OiRudWxsIHx8ICRmdW5jdGlvblJlZmVyZW5jZVswXSAhPT0gVHlwZTo6VF9GVU5DVElPTl9SRUZFUkVOQ0UpIHsKICAgICAgICAgICAgcmV0dXJuIHN0YXRpYzo6JGRlZmF1bHRWYWx1ZTsKICAgICAgICB9CgoKICAgICAgICBzd2l0Y2ggKCRmdW5jdGlvblJlZmVyZW5jZVsxXSkgewogICAgICAgICAgICAvLyBTQ1NTIEBmdW5jdGlvbgogICAgICAgICAgICBjYXNlICdzY3NzJzoKICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+Y2FsbFNjc3NGdW5jdGlvbigkZnVuY3Rpb25SZWZlcmVuY2VbM10sICRhcmdWYWx1ZXMpOwoKICAgICAgICAgICAgLy8gbmF0aXZlIFBIUCBmdW5jdGlvbnMKICAgICAgICAgICAgY2FzZSAndXNlcic6CiAgICAgICAgICAgIGNhc2UgJ25hdGl2ZSc6CiAgICAgICAgICAgICAgICBsaXN0KCwsJG5hbWUsICRmbiwgJHByb3RvdHlwZSkgPSAkZnVuY3Rpb25SZWZlcmVuY2U7CgogICAgICAgICAgICAgICAgLy8gc3BlY2lhbCBjYXNlcyBvZiBjc3MgdmFsaWQgZnVuY3Rpb25zIG1pbi9tYXgKICAgICAgICAgICAgICAgICRuYW1lID0gc3RydG9sb3dlcigkbmFtZSk7CiAgICAgICAgICAgICAgICBpZiAoXGluX2FycmF5KCRuYW1lLCBbJ21pbicsICdtYXgnXSkgJiYgY291bnQoJGFyZ1ZhbHVlcykgPj0gMSkgewogICAgICAgICAgICAgICAgICAgICRjc3NGdW5jdGlvbiA9ICR0aGlzLT5jc3NWYWxpZEFyZygKICAgICAgICAgICAgICAgICAgICAgICAgW1R5cGU6OlRfRlVOQ1RJT05fQ0FMTCwgJG5hbWUsICRhcmdWYWx1ZXNdLAogICAgICAgICAgICAgICAgICAgICAgICBbJ21pbicsICdtYXgnLCAnY2FsYycsICdlbnYnLCAndmFyJ10KICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIGlmICgkY3NzRnVuY3Rpb24gIT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkY3NzRnVuY3Rpb247CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJHJldHVyblZhbHVlID0gJHRoaXMtPmNhbGxOYXRpdmVGdW5jdGlvbigkbmFtZSwgJGZuLCAkcHJvdG90eXBlLCAkYXJnVmFsdWVzKTsKCiAgICAgICAgICAgICAgICBpZiAoISBpc3NldCgkcmV0dXJuVmFsdWUpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5mbmNhbGwoW1R5cGU6OlRfRlVOQ1RJT04sICRuYW1lLCBbVHlwZTo6VF9MSVNULCAnLCcsIFtdXV0sICRhcmdWYWx1ZXMpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiAkcmV0dXJuVmFsdWU7CgogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgcmV0dXJuIHN0YXRpYzo6JGRlZmF1bHRWYWx1ZTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0gYXJyYXl8TnVtYmVyICRhcmcKICAgICAqIEBwYXJhbSBzdHJpbmdbXSAgICAgJGFsbG93ZWRfZnVuY3Rpb24KICAgICAqIEBwYXJhbSBib29sICAgICAgICAgJGluRnVuY3Rpb24KICAgICAqCiAgICAgKiBAcmV0dXJuIGFycmF5fE51bWJlcnxmYWxzZQogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gY3NzVmFsaWRBcmcoJGFyZywgJGFsbG93ZWRfZnVuY3Rpb24gPSBbXSwgJGluRnVuY3Rpb24gPSBmYWxzZSkKICAgIHsKICAgICAgICBpZiAoJGFyZyBpbnN0YW5jZW9mIE51bWJlcikgewogICAgICAgICAgICByZXR1cm4gJHRoaXMtPnN0cmluZ2lmeUZuY2FsbEFyZ3MoJGFyZyk7CiAgICAgICAgfQoKICAgICAgICBzd2l0Y2ggKCRhcmdbMF0pIHsKICAgICAgICAgICAgY2FzZSBUeXBlOjpUX0lOVEVSUE9MQVRFOgogICAgICAgICAgICAgICAgcmV0dXJuIFtUeXBlOjpUX0tFWVdPUkQsICR0aGlzLT5Db21waWxlVmFsdWUoJGFyZyldOwoKICAgICAgICAgICAgY2FzZSBUeXBlOjpUX0ZVTkNUSU9OOgogICAgICAgICAgICAgICAgaWYgKCEgXGluX2FycmF5KCRhcmdbMV0sICRhbGxvd2VkX2Z1bmN0aW9uKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICgkYXJnWzJdWzBdID09PSBUeXBlOjpUX0xJU1QpIHsKICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICgkYXJnWzJdWzJdIGFzICRrID0+ICRzdWJhcmcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJGFyZ1syXVsyXVska10gPSAkdGhpcy0+Y3NzVmFsaWRBcmcoJHN1YmFyZywgJGFsbG93ZWRfZnVuY3Rpb24sICRhcmdbMV0pOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJGFyZ1syXVsyXVska10gPT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gJGFyZzsKCiAgICAgICAgICAgIGNhc2UgVHlwZTo6VF9GVU5DVElPTl9DQUxMOgogICAgICAgICAgICAgICAgaWYgKCEgXGluX2FycmF5KCRhcmdbMV0sICRhbGxvd2VkX2Z1bmN0aW9uKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRjc3NBcmdzID0gW107CiAgICAgICAgICAgICAgICBmb3JlYWNoICgkYXJnWzJdIGFzICRhcmdWYWx1ZSkgewogICAgICAgICAgICAgICAgICAgIGlmICgkYXJnVmFsdWUgPT09IHN0YXRpYzo6JG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkY3NzQXJnID0gJHRoaXMtPmNzc1ZhbGlkQXJnKCRhcmdWYWx1ZVsxXSwgJGFsbG93ZWRfZnVuY3Rpb24sICRhcmdbMV0pOwogICAgICAgICAgICAgICAgICAgIGlmIChlbXB0eSgkYXJnVmFsdWVbMF0pICYmICRjc3NBcmcgIT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRjc3NBcmdzW10gPSBbJGFyZ1ZhbHVlWzBdLCAkY3NzQXJnXTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+Zm5jYWxsKFtUeXBlOjpUX0ZVTkNUSU9OLCAkYXJnWzFdLCBbVHlwZTo6VF9MSVNULCAnLCcsIFtdXV0sICRjc3NBcmdzKTsKCiAgICAgICAgICAgIGNhc2UgVHlwZTo6VF9TVFJJTkc6CiAgICAgICAgICAgIGNhc2UgVHlwZTo6VF9LRVlXT1JEOgogICAgICAgICAgICAgICAgaWYgKCEkaW5GdW5jdGlvbiBvciAhXGluX2FycmF5KCRpbkZ1bmN0aW9uLCBbJ2NhbGMnLCAnZW52JywgJ3ZhciddKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+c3RyaW5naWZ5Rm5jYWxsQXJncygkYXJnKTsKCiAgICAgICAgICAgIGNhc2UgVHlwZTo6VF9MSVNUOgogICAgICAgICAgICAgICAgaWYgKCEkaW5GdW5jdGlvbikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChlbXB0eSgkYXJnWydlbmNsb3NpbmcnXSkgYW5kICRhcmdbMV0gPT09ICcnKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAoJGFyZ1syXSBhcyAkayA9PiAkc3ViYXJnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRhcmdbMl1bJGtdID0gJHRoaXMtPmNzc1ZhbGlkQXJnKCRzdWJhcmcsICRhbGxvd2VkX2Z1bmN0aW9uLCAkaW5GdW5jdGlvbik7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkYXJnWzJdWyRrXSA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkYXJnWzBdID0gVHlwZTo6VF9TVFJJTkc7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRhcmc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CgogICAgICAgICAgICBjYXNlIFR5cGU6OlRfRVhQUkVTU0lPTjoKICAgICAgICAgICAgICAgIGlmICghIFxpbl9hcnJheSgkYXJnWzFdLCBbJysnLCAnLScsICcvJywgJyonXSkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkYXJnWzJdID0gJHRoaXMtPmNzc1ZhbGlkQXJnKCRhcmdbMl0sICRhbGxvd2VkX2Z1bmN0aW9uLCAkaW5GdW5jdGlvbik7CiAgICAgICAgICAgICAgICAkYXJnWzNdID0gJHRoaXMtPmNzc1ZhbGlkQXJnKCRhcmdbM10sICRhbGxvd2VkX2Z1bmN0aW9uLCAkaW5GdW5jdGlvbik7CiAgICAgICAgICAgICAgICBpZiAoJGFyZ1syXSA9PT0gZmFsc2UgfHwgJGFyZ1szXSA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPmV4cFRvU3RyaW5nKCRhcmcsIHRydWUpOwoKICAgICAgICAgICAgY2FzZSBUeXBlOjpUX1ZBUklBQkxFOgogICAgICAgICAgICBjYXNlIFR5cGU6OlRfU0VMRjoKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICB9CgoKICAgIC8qKgogICAgICogUmVmb3JtYXQgZm5jYWxsIGFyZ3VtZW50cyB0byBwcm9wZXIgY3NzIGZ1bmN0aW9uIG91dHB1dAogICAgICoKICAgICAqIEBwYXJhbSBhcnJheXxOdW1iZXIgJGFyZwogICAgICoKICAgICAqIEByZXR1cm4gYXJyYXl8TnVtYmVyCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBzdHJpbmdpZnlGbmNhbGxBcmdzKCRhcmcpCiAgICB7CiAgICAgICAgaWYgKCRhcmcgaW5zdGFuY2VvZiBOdW1iZXIpIHsKICAgICAgICAgICAgcmV0dXJuICRhcmc7CiAgICAgICAgfQoKICAgICAgICBzd2l0Y2ggKCRhcmdbMF0pIHsKICAgICAgICAgICAgY2FzZSBUeXBlOjpUX0xJU1Q6CiAgICAgICAgICAgICAgICBmb3JlYWNoICgkYXJnWzJdIGFzICRrID0+ICR2KSB7CiAgICAgICAgICAgICAgICAgICAgJGFyZ1syXVska10gPSAkdGhpcy0+c3RyaW5naWZ5Rm5jYWxsQXJncygkdik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgVHlwZTo6VF9FWFBSRVNTSU9OOgogICAgICAgICAgICAgICAgaWYgKCRhcmdbMV0gPT09ICcvJykgewogICAgICAgICAgICAgICAgICAgICRhcmdbMl0gPSAkdGhpcy0+c3RyaW5naWZ5Rm5jYWxsQXJncygkYXJnWzJdKTsKICAgICAgICAgICAgICAgICAgICAkYXJnWzNdID0gJHRoaXMtPnN0cmluZ2lmeUZuY2FsbEFyZ3MoJGFyZ1szXSk7CiAgICAgICAgICAgICAgICAgICAgJGFyZ1s1XSA9ICRhcmdbNl0gPSBmYWxzZTsgLy8gbm8gc3BhY2UgYXJvdW5kIC8KICAgICAgICAgICAgICAgICAgICAkYXJnID0gJHRoaXMtPmV4cFRvU3RyaW5nKCRhcmcpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIFR5cGU6OlRfRlVOQ1RJT05fQ0FMTDoKICAgICAgICAgICAgICAgICRuYW1lID0gc3RydG9sb3dlcigkYXJnWzFdKTsKCiAgICAgICAgICAgICAgICBpZiAoaW5fYXJyYXkoJG5hbWUsIFsnbWF4JywgJ21pbicsICdjYWxjJ10pKSB7CiAgICAgICAgICAgICAgICAgICAgJGFyZ3MgPSAkYXJnWzJdOwogICAgICAgICAgICAgICAgICAgICRhcmcgPSAkdGhpcy0+Zm5jYWxsKFtUeXBlOjpUX0ZVTkNUSU9OLCAkbmFtZSwgW1R5cGU6OlRfTElTVCwgJywnLCBbXV1dLCAkYXJncyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkYXJnOwogICAgfQoKICAgIC8qKgogICAgICogRmluZCBhIGZ1bmN0aW9uIHJlZmVyZW5jZQogICAgICogQHBhcmFtIHN0cmluZyAkbmFtZQogICAgICogQHBhcmFtIGJvb2wgJHNhZmVDb3B5CiAgICAgKiBAcmV0dXJuIGFycmF5CiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBnZXRGdW5jdGlvblJlZmVyZW5jZSgkbmFtZSwgJHNhZmVDb3B5ID0gZmFsc2UpCiAgICB7CiAgICAgICAgLy8gU0NTUyBAZnVuY3Rpb24KICAgICAgICBpZiAoJGZ1bmMgPSAkdGhpcy0+Z2V0KHN0YXRpYzo6JG5hbWVzcGFjZXNbJ2Z1bmN0aW9uJ10gLiAkbmFtZSwgZmFsc2UpKSB7CiAgICAgICAgICAgIGlmICgkc2FmZUNvcHkpIHsKICAgICAgICAgICAgICAgICRmdW5jID0gY2xvbmUgJGZ1bmM7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBbVHlwZTo6VF9GVU5DVElPTl9SRUZFUkVOQ0UsICdzY3NzJywgJG5hbWUsICRmdW5jXTsKICAgICAgICB9CgogICAgICAgIC8vIG5hdGl2ZSBQSFAgZnVuY3Rpb25zCgogICAgICAgIC8vIHRyeSB0byBmaW5kIGEgbmF0aXZlIGxpYiBmdW5jdGlvbgogICAgICAgICRub3JtYWxpemVkTmFtZSA9ICR0aGlzLT5ub3JtYWxpemVOYW1lKCRuYW1lKTsKCiAgICAgICAgaWYgKGlzc2V0KCR0aGlzLT51c2VyRnVuY3Rpb25zWyRub3JtYWxpemVkTmFtZV0pKSB7CiAgICAgICAgICAgIC8vIHNlZSBpZiB3ZSBjYW4gZmluZCBhIHVzZXIgZnVuY3Rpb24KICAgICAgICAgICAgbGlzdCgkZiwgJHByb3RvdHlwZSkgPSAkdGhpcy0+dXNlckZ1bmN0aW9uc1skbm9ybWFsaXplZE5hbWVdOwoKICAgICAgICAgICAgcmV0dXJuIFtUeXBlOjpUX0ZVTkNUSU9OX1JFRkVSRU5DRSwgJ3VzZXInLCAkbmFtZSwgJGYsICRwcm90b3R5cGVdOwogICAgICAgIH0KCiAgICAgICAgJGxvd2VyY2FzZWROYW1lID0gc3RydG9sb3dlcigkbm9ybWFsaXplZE5hbWUpOwoKICAgICAgICAvLyBTcGVjaWFsIGZ1bmN0aW9ucyBvdmVycmlkaW5nIGEgQ1NTIGZ1bmN0aW9uIGFyZSBjYXNlLWluc2Vuc2l0aXZlLiBXZSBub3JtYWxpemUgdGhlbSBhcyBsb3dlcmNhc2UKICAgICAgICAvLyB0byBhdm9pZCB0aGUgZGVwcmVjYXRpb24gd2FybmluZyBhYm91dCB0aGUgd3JvbmcgY2FzZSBiZWluZyB1c2VkLgogICAgICAgIGlmICgkbG93ZXJjYXNlZE5hbWUgPT09ICdtaW4nIHx8ICRsb3dlcmNhc2VkTmFtZSA9PT0gJ21heCcgfHwgJGxvd2VyY2FzZWROYW1lID09PSAncmdiJyB8fCAkbG93ZXJjYXNlZE5hbWUgPT09ICdyZ2JhJyB8fCAkbG93ZXJjYXNlZE5hbWUgPT09ICdoc2wnIHx8ICRsb3dlcmNhc2VkTmFtZSA9PT0gJ2hzbGEnKSB7CiAgICAgICAgICAgICRub3JtYWxpemVkTmFtZSA9ICRsb3dlcmNhc2VkTmFtZTsKICAgICAgICB9CgogICAgICAgIGlmICgoJGYgPSAkdGhpcy0+Z2V0QnVpbHRpbkZ1bmN0aW9uKCRub3JtYWxpemVkTmFtZSkpICYmIFxpc19jYWxsYWJsZSgkZikpIHsKICAgICAgICAgICAgLyoqIEB2YXIgc3RyaW5nICRsaWJOYW1lICovCiAgICAgICAgICAgICRsaWJOYW1lICAgPSAkZlsxXTsKICAgICAgICAgICAgJHByb3RvdHlwZSA9IGlzc2V0KHN0YXRpYzo6JCRsaWJOYW1lKSA/IHN0YXRpYzo6JCRsaWJOYW1lIDogbnVsbDsKCiAgICAgICAgICAgIC8vIEFsbCBjb3JlIGZ1bmN0aW9ucyBoYXZlIGEgcHJvdG90eXBlIGRlZmluZWQuIE5vdCBmaW5kaW5nIHRoZQogICAgICAgICAgICAvLyBwcm90b3R5cGUgY2FuIG1lYW4gMiB0aGluZ3M6CiAgICAgICAgICAgIC8vIC0gdGhlIGZ1bmN0aW9uIGNvbWVzIGZyb20gYSBjaGlsZCBjbGFzcyAoZGVwcmVjYXRlZCBqdXN0IGFmdGVyKQogICAgICAgICAgICAvLyAtIHRoZSBmdW5jdGlvbiB3YXMgZm91bmQgd2l0aCBhIGRpZmZlcmVudCBjYXNlLCB3aGljaCByZWxhdGVzIHRvIGNhbGxpbmcgdGhlCiAgICAgICAgICAgIC8vICAgd3JvbmcgU2FzcyBmdW5jdGlvbiBkdWUgdG8gb3VyIGNhbWVsQ2FzZSB1c2FnZSAoYGZhZGUtaW4oKWAgdnMgYGZhZGVpbigpYCksCiAgICAgICAgICAgIC8vICAgYmVjYXVzZSBQSFAgbWV0aG9kIG5hbWVzIGFyZSBjYXNlLWluc2Vuc2l0aXZlIHdoaWxlIHByb3BlcnR5IG5hbWVzIGFyZQogICAgICAgICAgICAvLyAgIGNhc2Utc2Vuc2l0aXZlLgogICAgICAgICAgICBpZiAoJHByb3RvdHlwZSA9PT0gbnVsbCB8fCBzdHJ0b2xvd2VyKCRub3JtYWxpemVkTmFtZSkgIT09ICRub3JtYWxpemVkTmFtZSkgewogICAgICAgICAgICAgICAgJHIgPSBuZXcgXFJlZmxlY3Rpb25NZXRob2QoJHRoaXMsICRsaWJOYW1lKTsKICAgICAgICAgICAgICAgICRhY3R1YWxMaWJOYW1lID0gJHItPm5hbWU7CgogICAgICAgICAgICAgICAgaWYgKCRhY3R1YWxMaWJOYW1lICE9PSAkbGliTmFtZSB8fCBzdHJ0b2xvd2VyKCRub3JtYWxpemVkTmFtZSkgIT09ICRub3JtYWxpemVkTmFtZSkgewogICAgICAgICAgICAgICAgICAgICRrZWJhYkNhc2VOYW1lID0gcHJlZ19yZXBsYWNlKCd+KD88PVxcdykoW0EtWl0pficsICctJDEnLCBzdWJzdHIoJGFjdHVhbExpYk5hbWUsIDMpKTsKICAgICAgICAgICAgICAgICAgICBhc3NlcnQoJGtlYmFiQ2FzZU5hbWUgIT09IG51bGwpOwogICAgICAgICAgICAgICAgICAgICRvcmlnaW5hbE5hbWUgPSBzdHJ0b2xvd2VyKCRrZWJhYkNhc2VOYW1lKTsKICAgICAgICAgICAgICAgICAgICAkd2FybmluZyA9ICJDYWxsaW5nIGJ1aWx0LWluIGZ1bmN0aW9ucyB3aXRoIGEgbm9uLXN0YW5kYXJkIG5hbWUgaXMgZGVwcmVjYXRlZCBzaW5jZSBTY3NzcGhwIDEuOC4wIGFuZCB3aWxsIG5vdCB3b3JrIGFueW1vcmUgaW4gMi4wICh0aGV5IHdpbGwgYmUgdHJlYXRlZCBhcyBDU1MgZnVuY3Rpb24gY2FsbHMgaW5zdGVhZCkuXG5Vc2UgXCIkb3JpZ2luYWxOYW1lXCIgaW5zdGVhZCBvZiBcIiRuYW1lXCIuIjsKICAgICAgICAgICAgICAgICAgICBAdHJpZ2dlcl9lcnJvcigkd2FybmluZywgRV9VU0VSX0RFUFJFQ0FURUQpOwogICAgICAgICAgICAgICAgICAgICRmbmFtZSA9ICR0aGlzLT5nZXRQcmV0dHlQYXRoKCR0aGlzLT5zb3VyY2VOYW1lc1skdGhpcy0+c291cmNlSW5kZXhdKTsKICAgICAgICAgICAgICAgICAgICAkbGluZSAgPSAkdGhpcy0+c291cmNlTGluZTsKICAgICAgICAgICAgICAgICAgICBXYXJuOjpkZXByZWNhdGlvbigiJHdhcm5pbmdcbiAgICAgICAgIG9uIGxpbmUgJGxpbmUgb2YgJGZuYW1lIik7CgogICAgICAgICAgICAgICAgICAgIC8vIFVzZSB0aGUgYWN0dWFsIGZ1bmN0aW9uIGRlZmluaXRpb24KICAgICAgICAgICAgICAgICAgICAkcHJvdG90eXBlID0gaXNzZXQoc3RhdGljOjokJGFjdHVhbExpYk5hbWUpID8gc3RhdGljOjokJGFjdHVhbExpYk5hbWUgOiBudWxsOwogICAgICAgICAgICAgICAgICAgICRmWzFdID0gJGxpYk5hbWUgPSAkYWN0dWFsTGliTmFtZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKFxnZXRfY2xhc3MoJHRoaXMpICE9PSBfX0NMQVNTX18gJiYgIWlzc2V0KCR0aGlzLT53YXJuZWRDaGlsZEZ1bmN0aW9uc1skbGliTmFtZV0pKSB7CiAgICAgICAgICAgICAgICAkciA9IG5ldyBcUmVmbGVjdGlvbk1ldGhvZCgkdGhpcywgJGxpYk5hbWUpOwogICAgICAgICAgICAgICAgJGRlY2xhcmluZ0NsYXNzID0gJHItPmdldERlY2xhcmluZ0NsYXNzKCktPm5hbWU7CgogICAgICAgICAgICAgICAgJG5lZWRzV2FybmluZyA9ICR0aGlzLT53YXJuZWRDaGlsZEZ1bmN0aW9uc1skbGliTmFtZV0gPSAkZGVjbGFyaW5nQ2xhc3MgIT09IF9fQ0xBU1NfXzsKCiAgICAgICAgICAgICAgICBpZiAoJG5lZWRzV2FybmluZykgewogICAgICAgICAgICAgICAgICAgIGlmIChtZXRob2RfZXhpc3RzKF9fQ0xBU1NfXywgJGxpYk5hbWUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIEB0cmlnZ2VyX2Vycm9yKHNwcmludGYoJ092ZXJyaWRpbmcgdGhlICIlcyIgY29yZSBmdW5jdGlvbiBieSBleHRlbmRpbmcgdGhlIENvbXBpbGVyIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgdW5zdXBwb3J0ZWQgaW4gMi4wLiBSZW1vdmUgdGhlICIlczo6JXMiIG1ldGhvZC4nLCAkbm9ybWFsaXplZE5hbWUsICRkZWNsYXJpbmdDbGFzcywgJGxpYk5hbWUpLCBFX1VTRVJfREVQUkVDQVRFRCk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgQHRyaWdnZXJfZXJyb3Ioc3ByaW50ZignUmVnaXN0ZXJpbmcgY3VzdG9tIGZ1bmN0aW9ucyBieSBleHRlbmRpbmcgdGhlIENvbXBpbGVyIGFuZCB1c2luZyB0aGUgbGliKiBkaXNjb3ZlcnkgbWVjaGFuaXNtIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiAyLjAuIFJlcGxhY2UgdGhlICIlczo6JXMiIG1ldGhvZCB3aXRoIHJlZ2lzdGVyaW5nIHRoZSAiJXMiIGZ1bmN0aW9uIHRocm91Z2ggIkNvbXBpbGVyOjpyZWdpc3RlckZ1bmN0aW9uIi4nLCAkZGVjbGFyaW5nQ2xhc3MsICRsaWJOYW1lLCAkbm9ybWFsaXplZE5hbWUpLCBFX1VTRVJfREVQUkVDQVRFRCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gW1R5cGU6OlRfRlVOQ1RJT05fUkVGRVJFTkNFLCAnbmF0aXZlJywgJG5hbWUsICRmLCAkcHJvdG90eXBlXTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBzdGF0aWM6OiRudWxsOwogICAgfQoKCiAgICAvKioKICAgICAqIE5vcm1hbGl6ZSBuYW1lCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkbmFtZQogICAgICoKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBub3JtYWxpemVOYW1lKCRuYW1lKQogICAgewogICAgICAgIHJldHVybiBzdHJfcmVwbGFjZSgnLScsICdfJywgJG5hbWUpOwogICAgfQoKICAgIC8qKgogICAgICogTm9ybWFsaXplIHZhbHVlCiAgICAgKgogICAgICogQGludGVybmFsCiAgICAgKgogICAgICogQHBhcmFtIGFycmF5fE51bWJlciAkdmFsdWUKICAgICAqCiAgICAgKiBAcmV0dXJuIGFycmF5fE51bWJlcgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gbm9ybWFsaXplVmFsdWUoJHZhbHVlKQogICAgewogICAgICAgICR2YWx1ZSA9ICR0aGlzLT5jb2VyY2VGb3JFeHByZXNzaW9uKCR0aGlzLT5yZWR1Y2UoJHZhbHVlKSk7CgogICAgICAgIGlmICgkdmFsdWUgaW5zdGFuY2VvZiBOdW1iZXIpIHsKICAgICAgICAgICAgcmV0dXJuICR2YWx1ZTsKICAgICAgICB9CgogICAgICAgIHN3aXRjaCAoJHZhbHVlWzBdKSB7CiAgICAgICAgICAgIGNhc2UgVHlwZTo6VF9MSVNUOgogICAgICAgICAgICAgICAgJHZhbHVlID0gJHRoaXMtPmV4dHJhY3RJbnRlcnBvbGF0aW9uKCR2YWx1ZSk7CgogICAgICAgICAgICAgICAgaWYgKCR2YWx1ZVswXSAhPT0gVHlwZTo6VF9MSVNUKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtUeXBlOjpUX0tFWVdPUkQsICR0aGlzLT5jb21waWxlVmFsdWUoJHZhbHVlKV07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgZm9yZWFjaCAoJHZhbHVlWzJdIGFzICRrZXkgPT4gJGl0ZW0pIHsKICAgICAgICAgICAgICAgICAgICAkdmFsdWVbMl1bJGtleV0gPSAkdGhpcy0+bm9ybWFsaXplVmFsdWUoJGl0ZW0pOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICghIGVtcHR5KCR2YWx1ZVsnZW5jbG9zaW5nJ10pKSB7CiAgICAgICAgICAgICAgICAgICAgdW5zZXQoJHZhbHVlWydlbmNsb3NpbmcnXSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCR2YWx1ZVsxXSA9PT0gJycgJiYgY291bnQoJHZhbHVlWzJdKSA+IDEpIHsKICAgICAgICAgICAgICAgICAgICAkdmFsdWVbMV0gPSAnICc7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmV0dXJuICR2YWx1ZTsKCiAgICAgICAgICAgIGNhc2UgVHlwZTo6VF9TVFJJTkc6CiAgICAgICAgICAgICAgICByZXR1cm4gWyR2YWx1ZVswXSwgJyInLCBbJHRoaXMtPmNvbXBpbGVTdHJpbmdDb250ZW50KCR2YWx1ZSldXTsKCiAgICAgICAgICAgIGNhc2UgVHlwZTo6VF9JTlRFUlBPTEFURToKICAgICAgICAgICAgICAgIHJldHVybiBbVHlwZTo6VF9LRVlXT1JELCAkdGhpcy0+Y29tcGlsZVZhbHVlKCR2YWx1ZSldOwoKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIHJldHVybiAkdmFsdWU7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQWRkIG51bWJlcnMKICAgICAqCiAgICAgKiBAcGFyYW0gTnVtYmVyICRsZWZ0CiAgICAgKiBAcGFyYW0gTnVtYmVyICRyaWdodAogICAgICoKICAgICAqIEByZXR1cm4gTnVtYmVyCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBvcEFkZE51bWJlck51bWJlcihOdW1iZXIgJGxlZnQsIE51bWJlciAkcmlnaHQpCiAgICB7CiAgICAgICAgcmV0dXJuICRsZWZ0LT5wbHVzKCRyaWdodCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBNdWx0aXBseSBudW1iZXJzCiAgICAgKgogICAgICogQHBhcmFtIE51bWJlciAkbGVmdAogICAgICogQHBhcmFtIE51bWJlciAkcmlnaHQKICAgICAqCiAgICAgKiBAcmV0dXJuIE51bWJlcgogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gb3BNdWxOdW1iZXJOdW1iZXIoTnVtYmVyICRsZWZ0LCBOdW1iZXIgJHJpZ2h0KQogICAgewogICAgICAgIHJldHVybiAkbGVmdC0+dGltZXMoJHJpZ2h0KTsKICAgIH0KCiAgICAvKioKICAgICAqIFN1YnRyYWN0IG51bWJlcnMKICAgICAqCiAgICAgKiBAcGFyYW0gTnVtYmVyICRsZWZ0CiAgICAgKiBAcGFyYW0gTnVtYmVyICRyaWdodAogICAgICoKICAgICAqIEByZXR1cm4gTnVtYmVyCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBvcFN1Yk51bWJlck51bWJlcihOdW1iZXIgJGxlZnQsIE51bWJlciAkcmlnaHQpCiAgICB7CiAgICAgICAgcmV0dXJuICRsZWZ0LT5taW51cygkcmlnaHQpOwogICAgfQoKICAgIC8qKgogICAgICogRGl2aWRlIG51bWJlcnMKICAgICAqCiAgICAgKiBAcGFyYW0gTnVtYmVyICRsZWZ0CiAgICAgKiBAcGFyYW0gTnVtYmVyICRyaWdodAogICAgICoKICAgICAqIEByZXR1cm4gTnVtYmVyCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBvcERpdk51bWJlck51bWJlcihOdW1iZXIgJGxlZnQsIE51bWJlciAkcmlnaHQpCiAgICB7CiAgICAgICAgcmV0dXJuICRsZWZ0LT5kaXZpZGVkQnkoJHJpZ2h0KTsKICAgIH0KCiAgICAvKioKICAgICAqIE1vZCBudW1iZXJzCiAgICAgKgogICAgICogQHBhcmFtIE51bWJlciAkbGVmdAogICAgICogQHBhcmFtIE51bWJlciAkcmlnaHQKICAgICAqCiAgICAgKiBAcmV0dXJuIE51bWJlcgogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gb3BNb2ROdW1iZXJOdW1iZXIoTnVtYmVyICRsZWZ0LCBOdW1iZXIgJHJpZ2h0KQogICAgewogICAgICAgIHJldHVybiAkbGVmdC0+bW9kdWxvKCRyaWdodCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBBZGQgc3RyaW5ncwogICAgICoKICAgICAqIEBwYXJhbSBhcnJheSAkbGVmdAogICAgICogQHBhcmFtIGFycmF5ICRyaWdodAogICAgICoKICAgICAqIEByZXR1cm4gYXJyYXl8bnVsbAogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gb3BBZGQoJGxlZnQsICRyaWdodCkKICAgIHsKICAgICAgICBpZiAoJHN0ckxlZnQgPSAkdGhpcy0+Y29lcmNlU3RyaW5nKCRsZWZ0KSkgewogICAgICAgICAgICBpZiAoJHJpZ2h0WzBdID09PSBUeXBlOjpUX1NUUklORykgewogICAgICAgICAgICAgICAgJHJpZ2h0WzFdID0gJyc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRzdHJMZWZ0WzJdW10gPSAkcmlnaHQ7CgogICAgICAgICAgICByZXR1cm4gJHN0ckxlZnQ7CiAgICAgICAgfQoKICAgICAgICBpZiAoJHN0clJpZ2h0ID0gJHRoaXMtPmNvZXJjZVN0cmluZygkcmlnaHQpKSB7CiAgICAgICAgICAgIGlmICgkbGVmdFswXSA9PT0gVHlwZTo6VF9TVFJJTkcpIHsKICAgICAgICAgICAgICAgICRsZWZ0WzFdID0gJyc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGFycmF5X3Vuc2hpZnQoJHN0clJpZ2h0WzJdLCAkbGVmdCk7CgogICAgICAgICAgICByZXR1cm4gJHN0clJpZ2h0OwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9CgogICAgLyoqCiAgICAgKiBCb29sZWFuIGFuZAogICAgICoKICAgICAqIEBwYXJhbSBhcnJheXxOdW1iZXIgJGxlZnQKICAgICAqIEBwYXJhbSBhcnJheXxOdW1iZXIgJHJpZ2h0CiAgICAgKiBAcGFyYW0gYm9vbCAgICAgICAgICRzaG91bGRFdmFsCiAgICAgKgogICAgICogQHJldHVybiBhcnJheXxOdW1iZXJ8bnVsbAogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gb3BBbmQoJGxlZnQsICRyaWdodCwgJHNob3VsZEV2YWwpCiAgICB7CiAgICAgICAgJHRydXRoeSA9ICgkbGVmdCA9PT0gc3RhdGljOjokbnVsbCB8fCAkcmlnaHQgPT09IHN0YXRpYzo6JG51bGwpIHx8CiAgICAgICAgICAgICAgICAgICgkbGVmdCA9PT0gc3RhdGljOjokZmFsc2UgfHwgJGxlZnQgPT09IHN0YXRpYzo6JHRydWUpICYmCiAgICAgICAgICAgICAgICAgICgkcmlnaHQgPT09IHN0YXRpYzo6JGZhbHNlIHx8ICRyaWdodCA9PT0gc3RhdGljOjokdHJ1ZSk7CgogICAgICAgIGlmICghICRzaG91bGRFdmFsKSB7CiAgICAgICAgICAgIGlmICghICR0cnV0aHkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoJGxlZnQgIT09IHN0YXRpYzo6JGZhbHNlICYmICRsZWZ0ICE9PSBzdGF0aWM6OiRudWxsKSB7CiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+cmVkdWNlKCRyaWdodCwgdHJ1ZSk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJGxlZnQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBCb29sZWFuIG9yCiAgICAgKgogICAgICogQHBhcmFtIGFycmF5fE51bWJlciAkbGVmdAogICAgICogQHBhcmFtIGFycmF5fE51bWJlciAkcmlnaHQKICAgICAqIEBwYXJhbSBib29sICAgICAgICAgJHNob3VsZEV2YWwKICAgICAqCiAgICAgKiBAcmV0dXJuIGFycmF5fE51bWJlcnxudWxsCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBvcE9yKCRsZWZ0LCAkcmlnaHQsICRzaG91bGRFdmFsKQogICAgewogICAgICAgICR0cnV0aHkgPSAoJGxlZnQgPT09IHN0YXRpYzo6JG51bGwgfHwgJHJpZ2h0ID09PSBzdGF0aWM6OiRudWxsKSB8fAogICAgICAgICAgICAgICAgICAoJGxlZnQgPT09IHN0YXRpYzo6JGZhbHNlIHx8ICRsZWZ0ID09PSBzdGF0aWM6OiR0cnVlKSAmJgogICAgICAgICAgICAgICAgICAoJHJpZ2h0ID09PSBzdGF0aWM6OiRmYWxzZSB8fCAkcmlnaHQgPT09IHN0YXRpYzo6JHRydWUpOwoKICAgICAgICBpZiAoISAkc2hvdWxkRXZhbCkgewogICAgICAgICAgICBpZiAoISAkdHJ1dGh5KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCRsZWZ0ICE9PSBzdGF0aWM6OiRmYWxzZSAmJiAkbGVmdCAhPT0gc3RhdGljOjokbnVsbCkgewogICAgICAgICAgICByZXR1cm4gJGxlZnQ7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJHRoaXMtPnJlZHVjZSgkcmlnaHQsIHRydWUpOwogICAgfQoKICAgIC8qKgogICAgICogQ29tcGFyZSBjb2xvcnMKICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICRvcAogICAgICogQHBhcmFtIGFycmF5ICAkbGVmdAogICAgICogQHBhcmFtIGFycmF5ICAkcmlnaHQKICAgICAqCiAgICAgKiBAcmV0dXJuIGFycmF5CiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBvcENvbG9yQ29sb3IoJG9wLCAkbGVmdCwgJHJpZ2h0KQogICAgewogICAgICAgIGlmICgkb3AgIT09ICc9PScgJiYgJG9wICE9PSAnIT0nKSB7CiAgICAgICAgICAgICR3YXJuaW5nID0gIkNvbG9yIGFyaXRobWV0aWMgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSBhbiBlcnJvciBpbiBmdXR1cmUgdmVyc2lvbnMuXG4iCiAgICAgICAgICAgICAgICAuICJDb25zaWRlciB1c2luZyBTYXNzJ3MgY29sb3IgZnVuY3Rpb25zIGluc3RlYWQuIjsKICAgICAgICAgICAgJGZuYW1lID0gJHRoaXMtPmdldFByZXR0eVBhdGgoJHRoaXMtPnNvdXJjZU5hbWVzWyR0aGlzLT5zb3VyY2VJbmRleF0pOwogICAgICAgICAgICAkbGluZSAgPSAkdGhpcy0+c291cmNlTGluZTsKCiAgICAgICAgICAgIFdhcm46OmRlcHJlY2F0aW9uKCIkd2FybmluZ1xuICAgICAgICAgb24gbGluZSAkbGluZSBvZiAkZm5hbWUiKTsKICAgICAgICB9CgogICAgICAgICRvdXQgPSBbVHlwZTo6VF9DT0xPUl07CgogICAgICAgIGZvcmVhY2ggKFsxLCAyLCAzXSBhcyAkaSkgewogICAgICAgICAgICAkbHZhbCA9IGlzc2V0KCRsZWZ0WyRpXSkgPyAkbGVmdFskaV0gOiAwOwogICAgICAgICAgICAkcnZhbCA9IGlzc2V0KCRyaWdodFskaV0pID8gJHJpZ2h0WyRpXSA6IDA7CgogICAgICAgICAgICBzd2l0Y2ggKCRvcCkgewogICAgICAgICAgICAgICAgY2FzZSAnKyc6CiAgICAgICAgICAgICAgICAgICAgJG91dFtdID0gJGx2YWwgKyAkcnZhbDsKICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICBjYXNlICctJzoKICAgICAgICAgICAgICAgICAgICAkb3V0W10gPSAkbHZhbCAtICRydmFsOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgIGNhc2UgJyonOgogICAgICAgICAgICAgICAgICAgICRvdXRbXSA9ICRsdmFsICogJHJ2YWw7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgY2FzZSAnJSc6CiAgICAgICAgICAgICAgICAgICAgaWYgKCRydmFsID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgJHRoaXMtPmVycm9yKCJjb2xvcjogQ2FuJ3QgdGFrZSBtb2R1bG8gYnkgemVybyIpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgJG91dFtdID0gJGx2YWwgJSAkcnZhbDsKICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICBjYXNlICcvJzoKICAgICAgICAgICAgICAgICAgICBpZiAoJHJ2YWwgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyAkdGhpcy0+ZXJyb3IoImNvbG9yOiBDYW4ndCBkaXZpZGUgYnkgemVybyIpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgJG91dFtdID0gKGludCkgKCRsdmFsIC8gJHJ2YWwpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgIGNhc2UgJz09JzoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPm9wRXEoJGxlZnQsICRyaWdodCk7CgogICAgICAgICAgICAgICAgY2FzZSAnIT0nOgogICAgICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+b3BOZXEoJGxlZnQsICRyaWdodCk7CgogICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICB0aHJvdyAkdGhpcy0+ZXJyb3IoImNvbG9yOiB1bmtub3duIG9wICRvcCIpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoaXNzZXQoJGxlZnRbNF0pKSB7CiAgICAgICAgICAgICRvdXRbNF0gPSAkbGVmdFs0XTsKICAgICAgICB9IGVsc2VpZiAoaXNzZXQoJHJpZ2h0WzRdKSkgewogICAgICAgICAgICAkb3V0WzRdID0gJHJpZ2h0WzRdOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICR0aGlzLT5maXhDb2xvcigkb3V0KTsKICAgIH0KCiAgICAvKioKICAgICAqIENvbXBhcmUgY29sb3IgYW5kIG51bWJlcgogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgJG9wCiAgICAgKiBAcGFyYW0gYXJyYXkgICRsZWZ0CiAgICAgKiBAcGFyYW0gTnVtYmVyICAkcmlnaHQKICAgICAqCiAgICAgKiBAcmV0dXJuIGFycmF5CiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBvcENvbG9yTnVtYmVyKCRvcCwgJGxlZnQsIE51bWJlciAkcmlnaHQpCiAgICB7CiAgICAgICAgaWYgKCRvcCA9PT0gJz09JykgewogICAgICAgICAgICByZXR1cm4gc3RhdGljOjokZmFsc2U7CiAgICAgICAgfQoKICAgICAgICBpZiAoJG9wID09PSAnIT0nKSB7CiAgICAgICAgICAgIHJldHVybiBzdGF0aWM6OiR0cnVlOwogICAgICAgIH0KCiAgICAgICAgJHZhbHVlID0gJHJpZ2h0LT5nZXREaW1lbnNpb24oKTsKCiAgICAgICAgcmV0dXJuICR0aGlzLT5vcENvbG9yQ29sb3IoCiAgICAgICAgICAgICRvcCwKICAgICAgICAgICAgJGxlZnQsCiAgICAgICAgICAgIFtUeXBlOjpUX0NPTE9SLCAkdmFsdWUsICR2YWx1ZSwgJHZhbHVlXQogICAgICAgICk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDb21wYXJlIG51bWJlciBhbmQgY29sb3IKICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICRvcAogICAgICogQHBhcmFtIE51bWJlciAgJGxlZnQKICAgICAqIEBwYXJhbSBhcnJheSAgJHJpZ2h0CiAgICAgKgogICAgICogQHJldHVybiBhcnJheQogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gb3BOdW1iZXJDb2xvcigkb3AsIE51bWJlciAkbGVmdCwgJHJpZ2h0KQogICAgewogICAgICAgIGlmICgkb3AgPT09ICc9PScpIHsKICAgICAgICAgICAgcmV0dXJuIHN0YXRpYzo6JGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgaWYgKCRvcCA9PT0gJyE9JykgewogICAgICAgICAgICByZXR1cm4gc3RhdGljOjokdHJ1ZTsKICAgICAgICB9CgogICAgICAgICR2YWx1ZSA9ICRsZWZ0LT5nZXREaW1lbnNpb24oKTsKCiAgICAgICAgcmV0dXJuICR0aGlzLT5vcENvbG9yQ29sb3IoCiAgICAgICAgICAgICRvcCwKICAgICAgICAgICAgW1R5cGU6OlRfQ09MT1IsICR2YWx1ZSwgJHZhbHVlLCAkdmFsdWVdLAogICAgICAgICAgICAkcmlnaHQKICAgICAgICApOwogICAgfQoKICAgIC8qKgogICAgICogQ29tcGFyZSBudW1iZXIxID09IG51bWJlcjIKICAgICAqCiAgICAgKiBAcGFyYW0gYXJyYXl8TnVtYmVyICRsZWZ0CiAgICAgKiBAcGFyYW0gYXJyYXl8TnVtYmVyICRyaWdodAogICAgICoKICAgICAqIEByZXR1cm4gYXJyYXkKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIG9wRXEoJGxlZnQsICRyaWdodCkKICAgIHsKICAgICAgICBpZiAoKCRsU3RyID0gJHRoaXMtPmNvZXJjZVN0cmluZygkbGVmdCkpICYmICgkclN0ciA9ICR0aGlzLT5jb2VyY2VTdHJpbmcoJHJpZ2h0KSkpIHsKICAgICAgICAgICAgJGxTdHJbMV0gPSAnJzsKICAgICAgICAgICAgJHJTdHJbMV0gPSAnJzsKCiAgICAgICAgICAgICRsZWZ0ID0gJHRoaXMtPmNvbXBpbGVWYWx1ZSgkbFN0cik7CiAgICAgICAgICAgICRyaWdodCA9ICR0aGlzLT5jb21waWxlVmFsdWUoJHJTdHIpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICR0aGlzLT50b0Jvb2woJGxlZnQgPT09ICRyaWdodCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDb21wYXJlIG51bWJlcjEgIT0gbnVtYmVyMgogICAgICoKICAgICAqIEBwYXJhbSBhcnJheXxOdW1iZXIgJGxlZnQKICAgICAqIEBwYXJhbSBhcnJheXxOdW1iZXIgJHJpZ2h0CiAgICAgKgogICAgICogQHJldHVybiBhcnJheQogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gb3BOZXEoJGxlZnQsICRyaWdodCkKICAgIHsKICAgICAgICBpZiAoKCRsU3RyID0gJHRoaXMtPmNvZXJjZVN0cmluZygkbGVmdCkpICYmICgkclN0ciA9ICR0aGlzLT5jb2VyY2VTdHJpbmcoJHJpZ2h0KSkpIHsKICAgICAgICAgICAgJGxTdHJbMV0gPSAnJzsKICAgICAgICAgICAgJHJTdHJbMV0gPSAnJzsKCiAgICAgICAgICAgICRsZWZ0ID0gJHRoaXMtPmNvbXBpbGVWYWx1ZSgkbFN0cik7CiAgICAgICAgICAgICRyaWdodCA9ICR0aGlzLT5jb21waWxlVmFsdWUoJHJTdHIpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICR0aGlzLT50b0Jvb2woJGxlZnQgIT09ICRyaWdodCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDb21wYXJlIG51bWJlcjEgPT0gbnVtYmVyMgogICAgICoKICAgICAqIEBwYXJhbSBOdW1iZXIgJGxlZnQKICAgICAqIEBwYXJhbSBOdW1iZXIgJHJpZ2h0CiAgICAgKgogICAgICogQHJldHVybiBhcnJheQogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gb3BFcU51bWJlck51bWJlcihOdW1iZXIgJGxlZnQsIE51bWJlciAkcmlnaHQpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT50b0Jvb2woJGxlZnQtPmVxdWFscygkcmlnaHQpKTsKICAgIH0KCiAgICAvKioKICAgICAqIENvbXBhcmUgbnVtYmVyMSAhPSBudW1iZXIyCiAgICAgKgogICAgICogQHBhcmFtIE51bWJlciAkbGVmdAogICAgICogQHBhcmFtIE51bWJlciAkcmlnaHQKICAgICAqCiAgICAgKiBAcmV0dXJuIGFycmF5CiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBvcE5lcU51bWJlck51bWJlcihOdW1iZXIgJGxlZnQsIE51bWJlciAkcmlnaHQpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT50b0Jvb2woISRsZWZ0LT5lcXVhbHMoJHJpZ2h0KSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDb21wYXJlIG51bWJlcjEgPj0gbnVtYmVyMgogICAgICoKICAgICAqIEBwYXJhbSBOdW1iZXIgJGxlZnQKICAgICAqIEBwYXJhbSBOdW1iZXIgJHJpZ2h0CiAgICAgKgogICAgICogQHJldHVybiBhcnJheQogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gb3BHdGVOdW1iZXJOdW1iZXIoTnVtYmVyICRsZWZ0LCBOdW1iZXIgJHJpZ2h0KQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+dG9Cb29sKCRsZWZ0LT5ncmVhdGVyVGhhbk9yRXF1YWwoJHJpZ2h0KSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDb21wYXJlIG51bWJlcjEgPiBudW1iZXIyCiAgICAgKgogICAgICogQHBhcmFtIE51bWJlciAkbGVmdAogICAgICogQHBhcmFtIE51bWJlciAkcmlnaHQKICAgICAqCiAgICAgKiBAcmV0dXJuIGFycmF5CiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBvcEd0TnVtYmVyTnVtYmVyKE51bWJlciAkbGVmdCwgTnVtYmVyICRyaWdodCkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnRvQm9vbCgkbGVmdC0+Z3JlYXRlclRoYW4oJHJpZ2h0KSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDb21wYXJlIG51bWJlcjEgPD0gbnVtYmVyMgogICAgICoKICAgICAqIEBwYXJhbSBOdW1iZXIgJGxlZnQKICAgICAqIEBwYXJhbSBOdW1iZXIgJHJpZ2h0CiAgICAgKgogICAgICogQHJldHVybiBhcnJheQogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gb3BMdGVOdW1iZXJOdW1iZXIoTnVtYmVyICRsZWZ0LCBOdW1iZXIgJHJpZ2h0KQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+dG9Cb29sKCRsZWZ0LT5sZXNzVGhhbk9yRXF1YWwoJHJpZ2h0KSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDb21wYXJlIG51bWJlcjEgPCBudW1iZXIyCiAgICAgKgogICAgICogQHBhcmFtIE51bWJlciAkbGVmdAogICAgICogQHBhcmFtIE51bWJlciAkcmlnaHQKICAgICAqCiAgICAgKiBAcmV0dXJuIGFycmF5CiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBvcEx0TnVtYmVyTnVtYmVyKE51bWJlciAkbGVmdCwgTnVtYmVyICRyaWdodCkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnRvQm9vbCgkbGVmdC0+bGVzc1RoYW4oJHJpZ2h0KSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDYXN0IHRvIGJvb2xlYW4KICAgICAqCiAgICAgKiBAYXBpCiAgICAgKgogICAgICogQHBhcmFtIGJvb2wgJHRoaW5nCiAgICAgKgogICAgICogQHJldHVybiBhcnJheQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gdG9Cb29sKCR0aGluZykKICAgIHsKICAgICAgICByZXR1cm4gJHRoaW5nID8gc3RhdGljOjokdHJ1ZSA6IHN0YXRpYzo6JGZhbHNlOwogICAgfQoKICAgIC8qKgogICAgICogRXNjYXBlIG5vbiBwcmludGFibGUgY2hhcnMgaW4gc3RyaW5ncyBvdXRwdXQgYXMgaW4gZGFydC1zYXNzCiAgICAgKgogICAgICogQGludGVybmFsCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkc3RyaW5nCiAgICAgKiBAcGFyYW0gYm9vbCAgICRpbktleXdvcmQKICAgICAqCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZXNjYXBlTm9uUHJpbnRhYmxlQ2hhcnMoJHN0cmluZywgJGluS2V5d29yZCA9IGZhbHNlKQogICAgewogICAgICAgIHN0YXRpYyAkcmVwbGFjZW1lbnQgPSBbXTsKICAgICAgICBpZiAoZW1wdHkoJHJlcGxhY2VtZW50WyRpbktleXdvcmRdKSkgewogICAgICAgICAgICBmb3IgKCRpID0gMDsgJGkgPCAzMjsgJGkrKykgewogICAgICAgICAgICAgICAgaWYgKCRpICE9PSA5IHx8ICRpbktleXdvcmQpIHsKICAgICAgICAgICAgICAgICAgICAkcmVwbGFjZW1lbnRbJGluS2V5d29yZF1bY2hyKCRpKV0gPSAnXFwnIC4gZGVjaGV4KCRpKSAuICgkaW5LZXl3b3JkID8gJyAnIDogY2hyKDApKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAkc3RyaW5nID0gc3RyX3JlcGxhY2UoYXJyYXlfa2V5cygkcmVwbGFjZW1lbnRbJGluS2V5d29yZF0pLCBhcnJheV92YWx1ZXMoJHJlcGxhY2VtZW50WyRpbktleXdvcmRdKSwgJHN0cmluZyk7CiAgICAgICAgLy8gY2hyKDApIGlzIG5vdCBhIHBvc3NpYmxlIGNoYXIgZnJvbSB0aGUgaW5wdXQsIHNvIGFueSBjaHIoMCkgY29tZXMgZnJvbSBvdXIgZXNjYXBpbmcgcmVwbGFjZW1lbnQKICAgICAgICBpZiAoc3RycG9zKCRzdHJpbmcsIGNocigwKSkgIT09IGZhbHNlKSB7CiAgICAgICAgICAgIGlmIChzdWJzdHIoJHN0cmluZywgLTEpID09PSBjaHIoMCkpIHsKICAgICAgICAgICAgICAgICRzdHJpbmcgPSBzdWJzdHIoJHN0cmluZywgMCwgLTEpOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRzdHJpbmcgPSBzdHJfcmVwbGFjZSgKICAgICAgICAgICAgICAgIFtjaHIoMCkgLiAnXFwnLGNocigwKSAuICcgJ10sCiAgICAgICAgICAgICAgICBbICdcXCcsICcgJ10sCiAgICAgICAgICAgICAgICAkc3RyaW5nCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmIChzdHJwb3MoJHN0cmluZywgY2hyKDApKSAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgICRwYXJ0cyA9IGV4cGxvZGUoY2hyKDApLCAkc3RyaW5nKTsKICAgICAgICAgICAgICAgICRzdHJpbmcgPSBhcnJheV9zaGlmdCgkcGFydHMpOwogICAgICAgICAgICAgICAgd2hpbGUgKGNvdW50KCRwYXJ0cykpIHsKICAgICAgICAgICAgICAgICAgICAkbmV4dCA9IGFycmF5X3NoaWZ0KCRwYXJ0cyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHN0cnBvcygiMDEyMzQ1Njc4OWFiY2RlZkFCQ0RFRiIgLiBjaHIoOSksICRuZXh0WzBdKSAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJHN0cmluZyAuPSAiICI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICRzdHJpbmcgLj0gJG5leHQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiAkc3RyaW5nOwogICAgfQoKICAgIC8qKgogICAgICogQ29tcGlsZXMgYSBwcmltaXRpdmUgdmFsdWUgaW50byBhIENTUyBwcm9wZXJ0eSB2YWx1ZS4KICAgICAqCiAgICAgKiBWYWx1ZXMgaW4gc2Nzc3BocCBhcmUgdHlwZWQgYnkgYmVpbmcgd3JhcHBlZCBpbiBhcnJheXMsIHRoZWlyIGZvcm1hdCBpcwogICAgICogdHlwaWNhbGx5OgogICAgICoKICAgICAqICAgICBhcnJheSh0eXBlLCBjb250ZW50cyBbLCBhZGRpdGlvbmFsX2NvbnRlbnRzXSopCiAgICAgKgogICAgICogVGhlIGlucHV0IGlzIGV4cGVjdGVkIHRvIGJlIHJlZHVjZWQuIFRoaXMgZnVuY3Rpb24gd2lsbCBub3Qgd29yayBvbgogICAgICogdGhpbmdzIGxpa2UgZXhwcmVzc2lvbnMgYW5kIHZhcmlhYmxlcy4KICAgICAqCiAgICAgKiBAYXBpCiAgICAgKgogICAgICogQHBhcmFtIGFycmF5fE51bWJlciAkdmFsdWUKICAgICAqIEBwYXJhbSBib29sICAgICAgICAgJHF1b3RlCiAgICAgKgogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGNvbXBpbGVWYWx1ZSgkdmFsdWUsICRxdW90ZSA9IHRydWUpCiAgICB7CiAgICAgICAgJHZhbHVlID0gJHRoaXMtPnJlZHVjZSgkdmFsdWUpOwoKICAgICAgICBpZiAoJHZhbHVlIGluc3RhbmNlb2YgTnVtYmVyKSB7CiAgICAgICAgICAgIHJldHVybiAkdmFsdWUtPm91dHB1dCgkdGhpcyk7CiAgICAgICAgfQoKICAgICAgICBzd2l0Y2ggKCR2YWx1ZVswXSkgewogICAgICAgICAgICBjYXNlIFR5cGU6OlRfS0VZV09SRDoKICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+ZXNjYXBlTm9uUHJpbnRhYmxlQ2hhcnMoJHZhbHVlWzFdLCB0cnVlKTsKCiAgICAgICAgICAgIGNhc2UgVHlwZTo6VF9DT0xPUjoKICAgICAgICAgICAgICAgIC8vIFsxXSAtIHJlZCBjb21wb25lbnQgKGVpdGhlciBudW1iZXIgZm9yIGEgJSkKICAgICAgICAgICAgICAgIC8vIFsyXSAtIGdyZWVuIGNvbXBvbmVudAogICAgICAgICAgICAgICAgLy8gWzNdIC0gYmx1ZSBjb21wb25lbnQKICAgICAgICAgICAgICAgIC8vIFs0XSAtIG9wdGlvbmFsIGFscGhhIGNvbXBvbmVudAogICAgICAgICAgICAgICAgbGlzdCgsICRyLCAkZywgJGIpID0gJHZhbHVlOwoKICAgICAgICAgICAgICAgICRyID0gJHRoaXMtPmNvbXBpbGVSR0JBVmFsdWUoJHIpOwogICAgICAgICAgICAgICAgJGcgPSAkdGhpcy0+Y29tcGlsZVJHQkFWYWx1ZSgkZyk7CiAgICAgICAgICAgICAgICAkYiA9ICR0aGlzLT5jb21waWxlUkdCQVZhbHVlKCRiKTsKCiAgICAgICAgICAgICAgICBpZiAoXGNvdW50KCR2YWx1ZSkgPT09IDUpIHsKICAgICAgICAgICAgICAgICAgICAkYWxwaGEgPSAkdGhpcy0+Y29tcGlsZVJHQkFWYWx1ZSgkdmFsdWVbNF0sIHRydWUpOwoKICAgICAgICAgICAgICAgICAgICBpZiAoISBpc19udW1lcmljKCRhbHBoYSkgfHwgJGFscGhhIDwgMSkgewogICAgICAgICAgICAgICAgICAgICAgICAkY29sb3JOYW1lID0gQ29sb3JzOjpSR0JhVG9Db2xvck5hbWUoJHIsICRnLCAkYiwgJGFscGhhKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIFxpc19udWxsKCRjb2xvck5hbWUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJGNvbG9yTmFtZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxpc19pbnQoJGFscGhhKSB8fCBcaXNfZmxvYXQoJGFscGhhKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGEgPSBuZXcgTnVtYmVyKCRhbHBoYSwgJycpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2VpZiAoaXNfbnVtZXJpYygkYWxwaGEpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYSA9IG5ldyBOdW1iZXIoKGZsb2F0KSAkYWxwaGEsICcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRhID0gJGFscGhhOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ3JnYmEoJyAuICRyIC4gJywgJyAuICRnIC4gJywgJyAuICRiIC4gJywgJyAuICRhIC4gJyknOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoISBpc19udW1lcmljKCRyKSB8fCAhIGlzX251bWVyaWMoJGcpIHx8ICEgaXNfbnVtZXJpYygkYikpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ3JnYignIC4gJHIgLiAnLCAnIC4gJGcgLiAnLCAnIC4gJGIgLiAnKSc7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJGNvbG9yTmFtZSA9IENvbG9yczo6UkdCYVRvQ29sb3JOYW1lKCRyLCAkZywgJGIpOwoKICAgICAgICAgICAgICAgIGlmICghIFxpc19udWxsKCRjb2xvck5hbWUpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRjb2xvck5hbWU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJGggPSBzcHJpbnRmKCcjJTAyeCUwMnglMDJ4JywgJHIsICRnLCAkYik7CgogICAgICAgICAgICAgICAgLy8gQ29udmVydGluZyBoZXggY29sb3IgdG8gc2hvcnQgbm90YXRpb24gKGUuZy4gIzAwMzM5OSB0byAjMDM5KQogICAgICAgICAgICAgICAgaWYgKCRoWzFdID09PSAkaFsyXSAmJiAkaFszXSA9PT0gJGhbNF0gJiYgJGhbNV0gPT09ICRoWzZdKSB7CiAgICAgICAgICAgICAgICAgICAgJGggPSAnIycgLiAkaFsxXSAuICRoWzNdIC4gJGhbNV07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmV0dXJuICRoOwoKICAgICAgICAgICAgY2FzZSBUeXBlOjpUX1NUUklORzoKICAgICAgICAgICAgICAgICRjb250ZW50ID0gJHRoaXMtPmNvbXBpbGVTdHJpbmdDb250ZW50KCR2YWx1ZSwgJHF1b3RlKTsKCiAgICAgICAgICAgICAgICBpZiAoJHZhbHVlWzFdICYmICRxdW90ZSkgewogICAgICAgICAgICAgICAgICAgICRjb250ZW50ID0gc3RyX3JlcGxhY2UoJ1xcJywgJ1xcXFwnLCAkY29udGVudCk7CgogICAgICAgICAgICAgICAgICAgICRjb250ZW50ID0gJHRoaXMtPmVzY2FwZU5vblByaW50YWJsZUNoYXJzKCRjb250ZW50KTsKCiAgICAgICAgICAgICAgICAgICAgLy8gZm9yY2UgZG91YmxlIHF1b3RlIGFzIHN0cmluZyBxdW90ZSBmb3IgdGhlIG91dHB1dCBpbiBjZXJ0YWluIGNhc2VzCiAgICAgICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICAgICAkdmFsdWVbMV0gPT09ICInIiAmJgogICAgICAgICAgICAgICAgICAgICAgICAoc3RycG9zKCRjb250ZW50LCAnIicpID09PSBmYWxzZSBvciBzdHJwb3MoJGNvbnRlbnQsICInIikgIT09IGZhbHNlKQogICAgICAgICAgICAgICAgICAgICkgewogICAgICAgICAgICAgICAgICAgICAgICAkdmFsdWVbMV0gPSAnIic7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlaWYgKAogICAgICAgICAgICAgICAgICAgICAgICAkdmFsdWVbMV0gPT09ICciJyAmJgogICAgICAgICAgICAgICAgICAgICAgICAoc3RycG9zKCRjb250ZW50LCAnIicpICE9PSBmYWxzZSBhbmQgc3RycG9zKCRjb250ZW50LCAiJyIpID09PSBmYWxzZSkKICAgICAgICAgICAgICAgICAgICApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJHZhbHVlWzFdID0gIiciOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgJGNvbnRlbnQgPSBzdHJfcmVwbGFjZSgkdmFsdWVbMV0sICdcXCcgLiAkdmFsdWVbMV0sICRjb250ZW50KTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gJHZhbHVlWzFdIC4gJGNvbnRlbnQgLiAkdmFsdWVbMV07CgogICAgICAgICAgICBjYXNlIFR5cGU6OlRfRlVOQ1RJT046CiAgICAgICAgICAgICAgICAkYXJncyA9ICEgZW1wdHkoJHZhbHVlWzJdKSA/ICR0aGlzLT5jb21waWxlVmFsdWUoJHZhbHVlWzJdLCAkcXVvdGUpIDogJyc7CgogICAgICAgICAgICAgICAgcmV0dXJuICIkdmFsdWVbMV0oJGFyZ3MpIjsKCiAgICAgICAgICAgIGNhc2UgVHlwZTo6VF9GVU5DVElPTl9SRUZFUkVOQ0U6CiAgICAgICAgICAgICAgICAkbmFtZSA9ICEgZW1wdHkoJHZhbHVlWzJdKSA/ICR2YWx1ZVsyXSA6ICcnOwoKICAgICAgICAgICAgICAgIHJldHVybiAiZ2V0LWZ1bmN0aW9uKFwiJG5hbWVcIikiOwoKICAgICAgICAgICAgY2FzZSBUeXBlOjpUX0xJU1Q6CiAgICAgICAgICAgICAgICAkdmFsdWUgPSAkdGhpcy0+ZXh0cmFjdEludGVycG9sYXRpb24oJHZhbHVlKTsKCiAgICAgICAgICAgICAgICBpZiAoJHZhbHVlWzBdICE9PSBUeXBlOjpUX0xJU1QpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPmNvbXBpbGVWYWx1ZSgkdmFsdWUsICRxdW90ZSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgbGlzdCgsICRkZWxpbSwgJGl0ZW1zKSA9ICR2YWx1ZTsKICAgICAgICAgICAgICAgICRwcmUgPSAkcG9zdCA9ICcnOwoKICAgICAgICAgICAgICAgIGlmICghIGVtcHR5KCR2YWx1ZVsnZW5jbG9zaW5nJ10pKSB7CiAgICAgICAgICAgICAgICAgICAgc3dpdGNoICgkdmFsdWVbJ2VuY2xvc2luZyddKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3BhcmVudCc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyRwcmUgPSAnKCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyRwb3N0ID0gJyknOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2ZvcmNlZF9wYXJlbnQnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHByZSA9ICcoJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRwb3N0ID0gJyknOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2JyYWNrZXQnOgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdmb3JjZWRfYnJhY2tldCc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcHJlID0gJ1snOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHBvc3QgPSAnXSc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJHNlcGFyYXRvciA9ICRkZWxpbSA9PT0gJy8nID8gJyAvJyA6ICRkZWxpbTsKCiAgICAgICAgICAgICAgICAkcHJlZml4X3ZhbHVlID0gJyc7CgogICAgICAgICAgICAgICAgaWYgKCRkZWxpbSAhPT0gJyAnKSB7CiAgICAgICAgICAgICAgICAgICAgJHByZWZpeF92YWx1ZSA9ICcgJzsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkZmlsdGVyZWQgPSBbXTsKCiAgICAgICAgICAgICAgICAkc2FtZV9zdHJpbmdfcXVvdGUgPSBudWxsOwogICAgICAgICAgICAgICAgZm9yZWFjaCAoJGl0ZW1zIGFzICRpdGVtKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKFxpc19udWxsKCRzYW1lX3N0cmluZ19xdW90ZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJHNhbWVfc3RyaW5nX3F1b3RlID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkaXRlbVswXSA9PT0gVHlwZTo6VF9TVFJJTkcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzYW1lX3N0cmluZ19xdW90ZSA9ICRpdGVtWzFdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAoJGl0ZW1zIGFzICRpaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkaWlbMF0gIT09IFR5cGU6OlRfU1RSSU5HKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzYW1lX3N0cmluZ19xdW90ZSA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCRpdGVtWzBdID09PSBUeXBlOjpUX05VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICgkc2FtZV9zdHJpbmdfcXVvdGUgPT09ICciJyAmJiAkaXRlbVswXSA9PT0gVHlwZTo6VF9TVFJJTkcgJiYgJGl0ZW1bMV0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgJGl0ZW1bMV0gPSAkc2FtZV9zdHJpbmdfcXVvdGU7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAkY29tcGlsZWQgPSAkdGhpcy0+Y29tcGlsZVZhbHVlKCRpdGVtLCAkcXVvdGUpOwoKICAgICAgICAgICAgICAgICAgICBpZiAoJHByZWZpeF92YWx1ZSAmJiBcc3RybGVuKCRjb21waWxlZCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJGNvbXBpbGVkID0gJHByZWZpeF92YWx1ZSAuICRjb21waWxlZDsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICRmaWx0ZXJlZFtdID0gJGNvbXBpbGVkOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiAkcHJlIC4gc3Vic3RyKGltcGxvZGUoJHNlcGFyYXRvciwgJGZpbHRlcmVkKSwgXHN0cmxlbigkcHJlZml4X3ZhbHVlKSkgLiAkcG9zdDsKCiAgICAgICAgICAgIGNhc2UgVHlwZTo6VF9NQVA6CiAgICAgICAgICAgICAgICAka2V5cyAgICAgPSAkdmFsdWVbMV07CiAgICAgICAgICAgICAgICAkdmFsdWVzICAgPSAkdmFsdWVbMl07CiAgICAgICAgICAgICAgICAkZmlsdGVyZWQgPSBbXTsKCiAgICAgICAgICAgICAgICBmb3IgKCRpID0gMCwgJHMgPSBcY291bnQoJGtleXMpOyAkaSA8ICRzOyAkaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgJGZpbHRlcmVkWyR0aGlzLT5jb21waWxlVmFsdWUoJGtleXNbJGldLCAkcXVvdGUpXSA9ICR0aGlzLT5jb21waWxlVmFsdWUoJHZhbHVlc1skaV0sICRxdW90ZSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgYXJyYXlfd2FsaygkZmlsdGVyZWQsIGZ1bmN0aW9uICgmJHZhbHVlLCAka2V5KSB7CiAgICAgICAgICAgICAgICAgICAgJHZhbHVlID0gJGtleSAuICc6ICcgLiAkdmFsdWU7CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICByZXR1cm4gJygnIC4gaW1wbG9kZSgnLCAnLCAkZmlsdGVyZWQpIC4gJyknOwoKICAgICAgICAgICAgY2FzZSBUeXBlOjpUX0lOVEVSUE9MQVRFRDoKICAgICAgICAgICAgICAgIC8vIG5vZGUgY3JlYXRlZCBieSBleHRyYWN0SW50ZXJwb2xhdGlvbgogICAgICAgICAgICAgICAgbGlzdCgsICRpbnRlcnBvbGF0ZSwgJGxlZnQsICRyaWdodCkgPSAkdmFsdWU7CiAgICAgICAgICAgICAgICBsaXN0KCwsICR3aGl0ZUxlZnQsICR3aGl0ZVJpZ2h0KSA9ICRpbnRlcnBvbGF0ZTsKCiAgICAgICAgICAgICAgICAkZGVsaW0gPSAkbGVmdFsxXTsKCiAgICAgICAgICAgICAgICBpZiAoJGRlbGltICYmICRkZWxpbSAhPT0gJyAnICYmICEgJHdoaXRlTGVmdCkgewogICAgICAgICAgICAgICAgICAgICRkZWxpbSAuPSAnICc7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJGxlZnQgPSBcY291bnQoJGxlZnRbMl0pID4gMAogICAgICAgICAgICAgICAgICAgID8gICR0aGlzLT5jb21waWxlVmFsdWUoJGxlZnQsICRxdW90ZSkgLiAkZGVsaW0gLiAkd2hpdGVMZWZ0CiAgICAgICAgICAgICAgICAgICAgOiAnJzsKCiAgICAgICAgICAgICAgICAkZGVsaW0gPSAkcmlnaHRbMV07CgogICAgICAgICAgICAgICAgaWYgKCRkZWxpbSAmJiAkZGVsaW0gIT09ICcgJykgewogICAgICAgICAgICAgICAgICAgICRkZWxpbSAuPSAnICc7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJHJpZ2h0ID0gXGNvdW50KCRyaWdodFsyXSkgPiAwID8KICAgICAgICAgICAgICAgICAgICAkd2hpdGVSaWdodCAuICRkZWxpbSAuICR0aGlzLT5jb21waWxlVmFsdWUoJHJpZ2h0LCAkcXVvdGUpIDogJyc7CgogICAgICAgICAgICAgICAgcmV0dXJuICRsZWZ0IC4gJHRoaXMtPmNvbXBpbGVWYWx1ZSgkaW50ZXJwb2xhdGUsICRxdW90ZSkgLiAkcmlnaHQ7CgogICAgICAgICAgICBjYXNlIFR5cGU6OlRfSU5URVJQT0xBVEU6CiAgICAgICAgICAgICAgICAvLyBzdHJpcCBxdW90ZXMgaWYgaXQncyBhIHN0cmluZwogICAgICAgICAgICAgICAgJHJlZHVjZWQgPSAkdGhpcy0+cmVkdWNlKCR2YWx1ZVsxXSk7CgogICAgICAgICAgICAgICAgaWYgKCRyZWR1Y2VkIGluc3RhbmNlb2YgTnVtYmVyKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5jb21waWxlVmFsdWUoJHJlZHVjZWQsICRxdW90ZSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgc3dpdGNoICgkcmVkdWNlZFswXSkgewogICAgICAgICAgICAgICAgICAgIGNhc2UgVHlwZTo6VF9MSVNUOgogICAgICAgICAgICAgICAgICAgICAgICAkcmVkdWNlZCA9ICR0aGlzLT5leHRyYWN0SW50ZXJwb2xhdGlvbigkcmVkdWNlZCk7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJHJlZHVjZWRbMF0gIT09IFR5cGU6OlRfTElTVCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QoLCAkZGVsaW0sICRpdGVtcykgPSAkcmVkdWNlZDsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkZGVsaW0gIT09ICcgJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGRlbGltIC49ICcgJzsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgJGZpbHRlcmVkID0gW107CgogICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICgkaXRlbXMgYXMgJGl0ZW0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkaXRlbVswXSA9PT0gVHlwZTo6VF9OVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRpdGVtWzBdID09PSBUeXBlOjpUX1NUUklORykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRmaWx0ZXJlZFtdID0gJHRoaXMtPmNvbXBpbGVTdHJpbmdDb250ZW50KCRpdGVtLCAkcXVvdGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlaWYgKCRpdGVtWzBdID09PSBUeXBlOjpUX0tFWVdPUkQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZmlsdGVyZWRbXSA9ICRpdGVtWzFdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZmlsdGVyZWRbXSA9ICR0aGlzLT5jb21waWxlVmFsdWUoJGl0ZW0sICRxdW90ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICRyZWR1Y2VkID0gW1R5cGU6OlRfS0VZV09SRCwgaW1wbG9kZSgiJGRlbGltIiwgJGZpbHRlcmVkKV07CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgICAgICBjYXNlIFR5cGU6OlRfU1RSSU5HOgogICAgICAgICAgICAgICAgICAgICAgICAkcmVkdWNlZCA9IFtUeXBlOjpUX1NUUklORywgJycsIFskdGhpcy0+Y29tcGlsZVN0cmluZ0NvbnRlbnQoJHJlZHVjZWQpXV07CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgICAgICBjYXNlIFR5cGU6OlRfTlVMTDoKICAgICAgICAgICAgICAgICAgICAgICAgJHJlZHVjZWQgPSBbVHlwZTo6VF9LRVlXT1JELCAnJ107CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5jb21waWxlVmFsdWUoJHJlZHVjZWQsICRxdW90ZSk7CgogICAgICAgICAgICBjYXNlIFR5cGU6OlRfTlVMTDoKICAgICAgICAgICAgICAgIHJldHVybiAnbnVsbCc7CgogICAgICAgICAgICBjYXNlIFR5cGU6OlRfQ09NTUVOVDoKICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+Y29tcGlsZUNvbW1lbnRWYWx1ZSgkdmFsdWUpOwoKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIHRocm93ICR0aGlzLT5lcnJvcigndW5rbm93biB2YWx1ZSB0eXBlOiAnIC4ganNvbl9lbmNvZGUoJHZhbHVlKSk7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIGFycmF5fE51bWJlciAkdmFsdWUKICAgICAqCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gY29tcGlsZURlYnVnVmFsdWUoJHZhbHVlKQogICAgewogICAgICAgICR2YWx1ZSA9ICR0aGlzLT5yZWR1Y2UoJHZhbHVlLCB0cnVlKTsKCiAgICAgICAgaWYgKCR2YWx1ZSBpbnN0YW5jZW9mIE51bWJlcikgewogICAgICAgICAgICByZXR1cm4gJHRoaXMtPmNvbXBpbGVWYWx1ZSgkdmFsdWUpOwogICAgICAgIH0KCiAgICAgICAgc3dpdGNoICgkdmFsdWVbMF0pIHsKICAgICAgICAgICAgY2FzZSBUeXBlOjpUX1NUUklORzoKICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+Y29tcGlsZVN0cmluZ0NvbnRlbnQoJHZhbHVlKTsKCiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPmNvbXBpbGVWYWx1ZSgkdmFsdWUpOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEZsYXR0ZW4gbGlzdAogICAgICoKICAgICAqIEBwYXJhbSBhcnJheSAkbGlzdAogICAgICoKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKgogICAgICogQGRlcHJlY2F0ZWQKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGZsYXR0ZW5MaXN0KCRsaXN0KQogICAgewogICAgICAgIEB0cmlnZ2VyX2Vycm9yKHNwcmludGYoJ1RoZSAiJXMiIG1ldGhvZCBpcyBkZXByZWNhdGVkLicsIF9fTUVUSE9EX18pLCBFX1VTRVJfREVQUkVDQVRFRCk7CgogICAgICAgIHJldHVybiAkdGhpcy0+Y29tcGlsZVZhbHVlKCRsaXN0KTsKICAgIH0KCiAgICAvKioKICAgICAqIEdldHMgdGhlIHRleHQgb2YgYSBTYXNzIHN0cmluZwogICAgICoKICAgICAqIENhbGxpbmcgdGhpcyBtZXRob2Qgb24gYW55dGhpbmcgZWxzZSB0aGFuIGEgU2Fzc1N0cmluZyBpcyB1bnN1cHBvcnRlZC4gVXNlIHtAc2VlIGFzc2VydFN0cmluZ30gZmlyc3QKICAgICAqIHRvIGVuc3VyZSB0aGF0IHRoZSB2YWx1ZSBpcyBpbmRlZWQgYSBzdHJpbmcuCiAgICAgKgogICAgICogQHBhcmFtIGFycmF5ICR2YWx1ZQogICAgICoKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRTdHJpbmdUZXh0KGFycmF5ICR2YWx1ZSkKICAgIHsKICAgICAgICBpZiAoJHZhbHVlWzBdICE9PSBUeXBlOjpUX1NUUklORykgewogICAgICAgICAgICB0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignVGhlIGFyZ3VtZW50IGlzIG5vdCBhIHNhc3Mgc3RyaW5nLiBEaWQgeW91IGZvcmdvdCB0byB1c2UgImFzc2VydFN0cmluZyI/Jyk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJHRoaXMtPmNvbXBpbGVTdHJpbmdDb250ZW50KCR2YWx1ZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDb21waWxlIHN0cmluZyBjb250ZW50CiAgICAgKgogICAgICogQHBhcmFtIGFycmF5ICRzdHJpbmcKICAgICAqIEBwYXJhbSBib29sICAkcXVvdGUKICAgICAqCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gY29tcGlsZVN0cmluZ0NvbnRlbnQoJHN0cmluZywgJHF1b3RlID0gdHJ1ZSkKICAgIHsKICAgICAgICAkcGFydHMgPSBbXTsKCiAgICAgICAgZm9yZWFjaCAoJHN0cmluZ1syXSBhcyAkcGFydCkgewogICAgICAgICAgICBpZiAoXGlzX2FycmF5KCRwYXJ0KSB8fCAkcGFydCBpbnN0YW5jZW9mIE51bWJlcikgewogICAgICAgICAgICAgICAgJHBhcnRzW10gPSAkdGhpcy0+Y29tcGlsZVZhbHVlKCRwYXJ0LCAkcXVvdGUpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJHBhcnRzW10gPSAkcGFydDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGltcGxvZGUoJHBhcnRzKTsKICAgIH0KCiAgICAvKioKICAgICAqIEV4dHJhY3QgaW50ZXJwb2xhdGlvbjsgaXQgZG9lc24ndCBuZWVkIHRvIGJlIHJlY3Vyc2l2ZSwgY29tcGlsZVZhbHVlIHdpbGwgaGFuZGxlIHRoYXQKICAgICAqCiAgICAgKiBAcGFyYW0gYXJyYXkgJGxpc3QKICAgICAqCiAgICAgKiBAcmV0dXJuIGFycmF5CiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBleHRyYWN0SW50ZXJwb2xhdGlvbigkbGlzdCkKICAgIHsKICAgICAgICAkaXRlbXMgPSAkbGlzdFsyXTsKCiAgICAgICAgZm9yZWFjaCAoJGl0ZW1zIGFzICRpID0+ICRpdGVtKSB7CiAgICAgICAgICAgIGlmICgkaXRlbVswXSA9PT0gVHlwZTo6VF9JTlRFUlBPTEFURSkgewogICAgICAgICAgICAgICAgJGJlZm9yZSA9IFtUeXBlOjpUX0xJU1QsICRsaXN0WzFdLCBcYXJyYXlfc2xpY2UoJGl0ZW1zLCAwLCAkaSldOwogICAgICAgICAgICAgICAgJGFmdGVyICA9IFtUeXBlOjpUX0xJU1QsICRsaXN0WzFdLCBcYXJyYXlfc2xpY2UoJGl0ZW1zLCAkaSArIDEpXTsKCiAgICAgICAgICAgICAgICByZXR1cm4gW1R5cGU6OlRfSU5URVJQT0xBVEVELCAkaXRlbSwgJGJlZm9yZSwgJGFmdGVyXTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRsaXN0OwogICAgfQoKICAgIC8qKgogICAgICogRmluZCB0aGUgZmluYWwgc2V0IG9mIHNlbGVjdG9ycwogICAgICoKICAgICAqIEBwYXJhbSBcU2Nzc1BocFxTY3NzUGhwXENvbXBpbGVyXEVudmlyb25tZW50ICRlbnYKICAgICAqIEBwYXJhbSBcU2Nzc1BocFxTY3NzUGhwXEJsb2NrICAgICAgICAgICAgICAgICRzZWxmUGFyZW50CiAgICAgKgogICAgICogQHJldHVybiBhcnJheQogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gbXVsdGlwbHlTZWxlY3RvcnMoRW52aXJvbm1lbnQgJGVudiwgJHNlbGZQYXJlbnQgPSBudWxsKQogICAgewogICAgICAgICRlbnZzICAgICAgICAgICAgPSAkdGhpcy0+Y29tcGFjdEVudigkZW52KTsKICAgICAgICAkc2VsZWN0b3JzICAgICAgID0gW107CiAgICAgICAgJHBhcmVudFNlbGVjdG9ycyA9IFtbXV07CgogICAgICAgICRzZWxmUGFyZW50U2VsZWN0b3JzID0gbnVsbDsKCiAgICAgICAgaWYgKCEgXGlzX251bGwoJHNlbGZQYXJlbnQpICYmICRzZWxmUGFyZW50LT5zZWxlY3RvcnMpIHsKICAgICAgICAgICAgJHNlbGZQYXJlbnRTZWxlY3RvcnMgPSAkdGhpcy0+ZXZhbFNlbGVjdG9ycygkc2VsZlBhcmVudC0+c2VsZWN0b3JzKTsKICAgICAgICB9CgogICAgICAgIHdoaWxlICgkZW52ID0gYXJyYXlfcG9wKCRlbnZzKSkgewogICAgICAgICAgICBpZiAoZW1wdHkoJGVudi0+c2VsZWN0b3JzKSkgewogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRzZWxlY3RvcnMgPSAkZW52LT5zZWxlY3RvcnM7CgogICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICAkc3RpbGxIYXNTZWxmICA9IGZhbHNlOwogICAgICAgICAgICAgICAgJHByZXZTZWxlY3RvcnMgPSAkc2VsZWN0b3JzOwogICAgICAgICAgICAgICAgJHNlbGVjdG9ycyAgICAgPSBbXTsKCiAgICAgICAgICAgICAgICBmb3JlYWNoICgkcGFyZW50U2VsZWN0b3JzIGFzICRwYXJlbnQpIHsKICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICgkcHJldlNlbGVjdG9ycyBhcyAkc2VsZWN0b3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRzZWxmUGFyZW50U2VsZWN0b3JzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICgkc2VsZlBhcmVudFNlbGVjdG9ycyBhcyAkc2VsZlBhcmVudCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIG5vICcmJyBpbiB0aGUgc2VsZWN0b3IsIGVhY2ggY2FsbCB3aWxsIGdpdmUgc2FtZSByZXN1bHQsIG9ubHkgYWRkIG9uY2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcyA9ICR0aGlzLT5qb2luU2VsZWN0b3JzKCRwYXJlbnQsICRzZWxlY3RvciwgJHN0aWxsSGFzU2VsZiwgJHNlbGZQYXJlbnQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzZWxlY3RvcnNbc2VyaWFsaXplKCRzKV0gPSAkczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzID0gJHRoaXMtPmpvaW5TZWxlY3RvcnMoJHBhcmVudCwgJHNlbGVjdG9yLCAkc3RpbGxIYXNTZWxmKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzZWxlY3RvcnNbc2VyaWFsaXplKCRzKV0gPSAkczsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSB3aGlsZSAoJHN0aWxsSGFzU2VsZik7CgogICAgICAgICAgICAkcGFyZW50U2VsZWN0b3JzID0gJHNlbGVjdG9yczsKICAgICAgICB9CgogICAgICAgICRzZWxlY3RvcnMgPSBhcnJheV92YWx1ZXMoJHNlbGVjdG9ycyk7CgogICAgICAgIC8vIGNhc2Ugd2UgYXJlIGp1c3Qgc3RhcnRpbmcgYSBhdC1yb290IDogbm90aGluZyB0byBtdWx0aXBseSBidXQgcGFyZW50U2VsZWN0b3JzCiAgICAgICAgaWYgKCEgJHNlbGVjdG9ycyAmJiAkc2VsZlBhcmVudFNlbGVjdG9ycykgewogICAgICAgICAgICAkc2VsZWN0b3JzID0gJHNlbGZQYXJlbnRTZWxlY3RvcnM7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJHNlbGVjdG9yczsKICAgIH0KCiAgICAvKioKICAgICAqIEpvaW4gc2VsZWN0b3JzOyBsb29rcyBmb3IgJiB0byByZXBsYWNlLCBvciBhcHBlbmQgcGFyZW50IGJlZm9yZSBjaGlsZAogICAgICoKICAgICAqIEBwYXJhbSBhcnJheSAkcGFyZW50CiAgICAgKiBAcGFyYW0gYXJyYXkgJGNoaWxkCiAgICAgKiBAcGFyYW0gYm9vbCAgJHN0aWxsSGFzU2VsZgogICAgICogQHBhcmFtIGFycmF5ICRzZWxmUGFyZW50U2VsZWN0b3JzCgogICAgICogQHJldHVybiBhcnJheQogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gam9pblNlbGVjdG9ycygkcGFyZW50LCAkY2hpbGQsICYkc3RpbGxIYXNTZWxmLCAkc2VsZlBhcmVudFNlbGVjdG9ycyA9IG51bGwpCiAgICB7CiAgICAgICAgJHNldFNlbGYgPSBmYWxzZTsKICAgICAgICAkb3V0ID0gW107CgogICAgICAgIGZvcmVhY2ggKCRjaGlsZCBhcyAkcGFydCkgewogICAgICAgICAgICAkbmV3UGFydCA9IFtdOwoKICAgICAgICAgICAgZm9yZWFjaCAoJHBhcnQgYXMgJHApIHsKICAgICAgICAgICAgICAgIC8vIG9ubHkgcmVwbGFjZSAmIG9uY2UgYW5kIHNob3VsZCBiZSByZWNhbGxlZCB0byBiZSBhYmxlIHRvIG1ha2UgY29tYmluYXRpb25zCiAgICAgICAgICAgICAgICBpZiAoJHAgPT09IHN0YXRpYzo6JHNlbGZTZWxlY3RvciAmJiAkc2V0U2VsZikgewogICAgICAgICAgICAgICAgICAgICRzdGlsbEhhc1NlbGYgPSB0cnVlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICgkcCA9PT0gc3RhdGljOjokc2VsZlNlbGVjdG9yICYmICEgJHNldFNlbGYpIHsKICAgICAgICAgICAgICAgICAgICAkc2V0U2VsZiA9IHRydWU7CgogICAgICAgICAgICAgICAgICAgIGlmIChcaXNfbnVsbCgkc2VsZlBhcmVudFNlbGVjdG9ycykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJHNlbGZQYXJlbnRTZWxlY3RvcnMgPSAkcGFyZW50OwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAoJHNlbGZQYXJlbnRTZWxlY3RvcnMgYXMgJGkgPT4gJHBhcmVudFBhcnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRpID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJG91dFtdID0gJG5ld1BhcnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbmV3UGFydCA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICgkcGFyZW50UGFydCBhcyAkcHApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcaXNfYXJyYXkoJHBwKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRmbGF0dGVuID0gW107CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5X3dhbGtfcmVjdXJzaXZlKCRwcCwgZnVuY3Rpb24gKCRhKSB1c2UgKCYkZmxhdHRlbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZmxhdHRlbltdID0gJGE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRwcCA9IGltcGxvZGUoJGZsYXR0ZW4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRuZXdQYXJ0W10gPSAkcHA7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICRuZXdQYXJ0W10gPSAkcDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgJG91dFtdID0gJG5ld1BhcnQ7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJHNldFNlbGYgPyAkb3V0IDogYXJyYXlfbWVyZ2UoJHBhcmVudCwgJGNoaWxkKTsKICAgIH0KCiAgICAvKioKICAgICAqIE11bHRpcGx5IG1lZGlhCiAgICAgKgogICAgICogQHBhcmFtIFxTY3NzUGhwXFNjc3NQaHBcQ29tcGlsZXJcRW52aXJvbm1lbnQgJGVudgogICAgICogQHBhcmFtIGFycmF5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGNoaWxkUXVlcmllcwogICAgICoKICAgICAqIEByZXR1cm4gYXJyYXkKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIG11bHRpcGx5TWVkaWEoRW52aXJvbm1lbnQgJGVudiA9IG51bGwsICRjaGlsZFF1ZXJpZXMgPSBudWxsKQogICAgewogICAgICAgIGlmICgKICAgICAgICAgICAgISBpc3NldCgkZW52KSB8fAogICAgICAgICAgICAhIGVtcHR5KCRlbnYtPmJsb2NrLT50eXBlKSAmJiAkZW52LT5ibG9jay0+dHlwZSAhPT0gVHlwZTo6VF9NRURJQQogICAgICAgICkgewogICAgICAgICAgICByZXR1cm4gJGNoaWxkUXVlcmllczsKICAgICAgICB9CgogICAgICAgIC8vIHBsYWluIG9sZCBibG9jaywgc2tpcAogICAgICAgIGlmIChlbXB0eSgkZW52LT5ibG9jay0+dHlwZSkpIHsKICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5tdWx0aXBseU1lZGlhKCRlbnYtPnBhcmVudCwgJGNoaWxkUXVlcmllcyk7CiAgICAgICAgfQoKICAgICAgICBhc3NlcnQoJGVudi0+YmxvY2sgaW5zdGFuY2VvZiBNZWRpYUJsb2NrKTsKCiAgICAgICAgJHBhcmVudFF1ZXJpZXMgPSBpc3NldCgkZW52LT5ibG9jay0+cXVlcnlMaXN0KQogICAgICAgICAgICA/ICRlbnYtPmJsb2NrLT5xdWVyeUxpc3QKICAgICAgICAgICAgOiBbW1tUeXBlOjpUX01FRElBX1ZBTFVFLCAkZW52LT5ibG9jay0+dmFsdWVdXV07CgogICAgICAgICRzdG9yZSA9IFskdGhpcy0+ZW52LCAkdGhpcy0+c3RvcmVFbnZdOwoKICAgICAgICAkdGhpcy0+ZW52ICAgICAgPSAkZW52OwogICAgICAgICR0aGlzLT5zdG9yZUVudiA9IG51bGw7CiAgICAgICAgJHBhcmVudFF1ZXJpZXMgID0gJHRoaXMtPmV2YWx1YXRlTWVkaWFRdWVyeSgkcGFyZW50UXVlcmllcyk7CgogICAgICAgIGxpc3QoJHRoaXMtPmVudiwgJHRoaXMtPnN0b3JlRW52KSA9ICRzdG9yZTsKCiAgICAgICAgaWYgKFxpc19udWxsKCRjaGlsZFF1ZXJpZXMpKSB7CiAgICAgICAgICAgICRjaGlsZFF1ZXJpZXMgPSAkcGFyZW50UXVlcmllczsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkb3JpZ2luYWxRdWVyaWVzID0gJGNoaWxkUXVlcmllczsKICAgICAgICAgICAgJGNoaWxkUXVlcmllcyA9IFtdOwoKICAgICAgICAgICAgZm9yZWFjaCAoJHBhcmVudFF1ZXJpZXMgYXMgJHBhcmVudFF1ZXJ5KSB7CiAgICAgICAgICAgICAgICBmb3JlYWNoICgkb3JpZ2luYWxRdWVyaWVzIGFzICRjaGlsZFF1ZXJ5KSB7CiAgICAgICAgICAgICAgICAgICAgJGNoaWxkUXVlcmllc1tdID0gYXJyYXlfbWVyZ2UoCiAgICAgICAgICAgICAgICAgICAgICAgICRwYXJlbnRRdWVyeSwKICAgICAgICAgICAgICAgICAgICAgICAgW1tUeXBlOjpUX01FRElBX1RZUEUsIFtUeXBlOjpUX0tFWVdPUkQsICdhbGwnXV1dLAogICAgICAgICAgICAgICAgICAgICAgICAkY2hpbGRRdWVyeQogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiAkdGhpcy0+bXVsdGlwbHlNZWRpYSgkZW52LT5wYXJlbnQsICRjaGlsZFF1ZXJpZXMpOwogICAgfQoKICAgIC8qKgogICAgICogQ29udmVydCBlbnYgbGlua2VkIGxpc3QgdG8gc3RhY2sKICAgICAqCiAgICAgKiBAcGFyYW0gRW52aXJvbm1lbnQgJGVudgogICAgICoKICAgICAqIEByZXR1cm4gRW52aXJvbm1lbnRbXQogICAgICoKICAgICAqIEBwaHBzdGFuLXJldHVybiBub24tZW1wdHktYXJyYXk8RW52aXJvbm1lbnQ+CiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBjb21wYWN0RW52KEVudmlyb25tZW50ICRlbnYpCiAgICB7CiAgICAgICAgZm9yICgkZW52cyA9IFtdOyAkZW52OyAkZW52ID0gJGVudi0+cGFyZW50KSB7CiAgICAgICAgICAgICRlbnZzW10gPSAkZW52OwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRlbnZzOwogICAgfQoKICAgIC8qKgogICAgICogQ29udmVydCBlbnYgc3RhY2sgdG8gc2luZ2x5IGxpbmtlZCBsaXN0CiAgICAgKgogICAgICogQHBhcmFtIEVudmlyb25tZW50W10gJGVudnMKICAgICAqCiAgICAgKiBAcmV0dXJuIEVudmlyb25tZW50CiAgICAgKgogICAgICogQHBocHN0YW4tcGFyYW0gIG5vbi1lbXB0eS1hcnJheTxFbnZpcm9ubWVudD4gJGVudnMKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGV4dHJhY3RFbnYoJGVudnMpCiAgICB7CiAgICAgICAgZm9yICgkZW52ID0gbnVsbDsgJGUgPSBhcnJheV9wb3AoJGVudnMpOykgewogICAgICAgICAgICAkZS0+cGFyZW50ID0gJGVudjsKICAgICAgICAgICAgJGVudiA9ICRlOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRlbnY7CiAgICB9CgogICAgLyoqCiAgICAgKiBQdXNoIGVudmlyb25tZW50CiAgICAgKgogICAgICogQHBhcmFtIFxTY3NzUGhwXFNjc3NQaHBcQmxvY2sgJGJsb2NrCiAgICAgKgogICAgICogQHJldHVybiBcU2Nzc1BocFxTY3NzUGhwXENvbXBpbGVyXEVudmlyb25tZW50CiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBwdXNoRW52KEJsb2NrICRibG9jayA9IG51bGwpCiAgICB7CiAgICAgICAgJGVudiA9IG5ldyBFbnZpcm9ubWVudCgpOwogICAgICAgICRlbnYtPnBhcmVudCA9ICR0aGlzLT5lbnY7CiAgICAgICAgJGVudi0+cGFyZW50U3RvcmUgPSAkdGhpcy0+c3RvcmVFbnY7CiAgICAgICAgJGVudi0+c3RvcmUgID0gW107CiAgICAgICAgJGVudi0+YmxvY2sgID0gJGJsb2NrOwogICAgICAgICRlbnYtPmRlcHRoICA9IGlzc2V0KCR0aGlzLT5lbnYtPmRlcHRoKSA/ICR0aGlzLT5lbnYtPmRlcHRoICsgMSA6IDA7CgogICAgICAgICR0aGlzLT5lbnYgPSAkZW52OwogICAgICAgICR0aGlzLT5zdG9yZUVudiA9IG51bGw7CgogICAgICAgIHJldHVybiAkZW52OwogICAgfQoKICAgIC8qKgogICAgICogUG9wIGVudmlyb25tZW50CiAgICAgKgogICAgICogQHJldHVybiB2b2lkCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBwb3BFbnYoKQogICAgewogICAgICAgICR0aGlzLT5zdG9yZUVudiA9ICR0aGlzLT5lbnYtPnBhcmVudFN0b3JlOwogICAgICAgICR0aGlzLT5lbnYgPSAkdGhpcy0+ZW52LT5wYXJlbnQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBQcm9wYWdhdGUgdmFycyBmcm9tIGEganVzdCBwb3BlZCBFbnYgKHVzZWQgaW4gQGVhY2ggYW5kIEBmb3IpCiAgICAgKgogICAgICogQHBhcmFtIGFycmF5ICAgICAgICAgJHN0b3JlCiAgICAgKiBAcGFyYW0gbnVsbHxzdHJpbmdbXSAkZXhjbHVkZWRWYXJzCiAgICAgKgogICAgICogQHJldHVybiB2b2lkCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBiYWNrUHJvcGFnYXRlRW52KCRzdG9yZSwgJGV4Y2x1ZGVkVmFycyA9IG51bGwpCiAgICB7CiAgICAgICAgZm9yZWFjaCAoJHN0b3JlIGFzICRrZXkgPT4gJHZhbHVlKSB7CiAgICAgICAgICAgIGlmIChlbXB0eSgkZXhjbHVkZWRWYXJzKSB8fCAhIFxpbl9hcnJheSgka2V5LCAkZXhjbHVkZWRWYXJzKSkgewogICAgICAgICAgICAgICAgJHRoaXMtPnNldCgka2V5LCAkdmFsdWUsIHRydWUpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogR2V0IHN0b3JlIGVudmlyb25tZW50CiAgICAgKgogICAgICogQHJldHVybiBcU2Nzc1BocFxTY3NzUGhwXENvbXBpbGVyXEVudmlyb25tZW50CiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBnZXRTdG9yZUVudigpCiAgICB7CiAgICAgICAgcmV0dXJuIGlzc2V0KCR0aGlzLT5zdG9yZUVudikgPyAkdGhpcy0+c3RvcmVFbnYgOiAkdGhpcy0+ZW52OwogICAgfQoKICAgIC8qKgogICAgICogU2V0IHZhcmlhYmxlCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJG5hbWUKICAgICAqIEBwYXJhbSBtaXhlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR2YWx1ZQogICAgICogQHBhcmFtIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNoYWRvdwogICAgICogQHBhcmFtIFxTY3NzUGhwXFNjc3NQaHBcQ29tcGlsZXJcRW52aXJvbm1lbnQgJGVudgogICAgICogQHBhcmFtIG1peGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHZhbHVlVW5yZWR1Y2VkCiAgICAgKgogICAgICogQHJldHVybiB2b2lkCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBzZXQoJG5hbWUsICR2YWx1ZSwgJHNoYWRvdyA9IGZhbHNlLCBFbnZpcm9ubWVudCAkZW52ID0gbnVsbCwgJHZhbHVlVW5yZWR1Y2VkID0gbnVsbCkKICAgIHsKICAgICAgICAkbmFtZSA9ICR0aGlzLT5ub3JtYWxpemVOYW1lKCRuYW1lKTsKCiAgICAgICAgaWYgKCEgaXNzZXQoJGVudikpIHsKICAgICAgICAgICAgJGVudiA9ICR0aGlzLT5nZXRTdG9yZUVudigpOwogICAgICAgIH0KCiAgICAgICAgaWYgKCRzaGFkb3cpIHsKICAgICAgICAgICAgJHRoaXMtPnNldFJhdygkbmFtZSwgJHZhbHVlLCAkZW52LCAkdmFsdWVVbnJlZHVjZWQpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICR0aGlzLT5zZXRFeGlzdGluZygkbmFtZSwgJHZhbHVlLCAkZW52LCAkdmFsdWVVbnJlZHVjZWQpOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIFNldCBleGlzdGluZyB2YXJpYWJsZQogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRuYW1lCiAgICAgKiBAcGFyYW0gbWl4ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdmFsdWUKICAgICAqIEBwYXJhbSBcU2Nzc1BocFxTY3NzUGhwXENvbXBpbGVyXEVudmlyb25tZW50ICRlbnYKICAgICAqIEBwYXJhbSBtaXhlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR2YWx1ZVVucmVkdWNlZAogICAgICoKICAgICAqIEByZXR1cm4gdm9pZAogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gc2V0RXhpc3RpbmcoJG5hbWUsICR2YWx1ZSwgRW52aXJvbm1lbnQgJGVudiwgJHZhbHVlVW5yZWR1Y2VkID0gbnVsbCkKICAgIHsKICAgICAgICAkc3RvcmVFbnYgPSAkZW52OwogICAgICAgICRzcGVjaWFsQ29udGVudEtleSA9IHN0YXRpYzo6JG5hbWVzcGFjZXNbJ3NwZWNpYWwnXSAuICdjb250ZW50JzsKCiAgICAgICAgJGhhc05hbWVzcGFjZSA9ICRuYW1lWzBdID09PSAnXicgfHwgJG5hbWVbMF0gPT09ICdAJyB8fCAkbmFtZVswXSA9PT0gJyUnOwoKICAgICAgICAkbWF4RGVwdGggPSAxMDAwMDsKCiAgICAgICAgZm9yICg7OykgewogICAgICAgICAgICBpZiAoJG1heERlcHRoLS0gPD0gMCkgewogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChcYXJyYXlfa2V5X2V4aXN0cygkbmFtZSwgJGVudi0+c3RvcmUpKSB7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCEgJGhhc05hbWVzcGFjZSAmJiBpc3NldCgkZW52LT5tYXJrZXIpKSB7CiAgICAgICAgICAgICAgICBpZiAoISBlbXB0eSgkZW52LT5zdG9yZVskc3BlY2lhbENvbnRlbnRLZXldKSkgewogICAgICAgICAgICAgICAgICAgICRlbnYgPSAkZW52LT5zdG9yZVskc3BlY2lhbENvbnRlbnRLZXldLT5zY29wZTsKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoISBlbXB0eSgkZW52LT5kZWNsYXJhdGlvblNjb3BlUGFyZW50KSkgewogICAgICAgICAgICAgICAgICAgICRlbnYgPSAkZW52LT5kZWNsYXJhdGlvblNjb3BlUGFyZW50OwogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkZW52ID0gJHN0b3JlRW52OwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoaXNzZXQoJGVudi0+cGFyZW50U3RvcmUpKSB7CiAgICAgICAgICAgICAgICAkZW52ID0gJGVudi0+cGFyZW50U3RvcmU7CiAgICAgICAgICAgIH0gZWxzZWlmIChpc3NldCgkZW52LT5wYXJlbnQpKSB7CiAgICAgICAgICAgICAgICAkZW52ID0gJGVudi0+cGFyZW50OwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJGVudiA9ICRzdG9yZUVudjsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkZW52LT5zdG9yZVskbmFtZV0gPSAkdmFsdWU7CgogICAgICAgIGlmICgkdmFsdWVVbnJlZHVjZWQpIHsKICAgICAgICAgICAgJGVudi0+c3RvcmVVbnJlZHVjZWRbJG5hbWVdID0gJHZhbHVlVW5yZWR1Y2VkOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIFNldCByYXcgdmFyaWFibGUKICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbmFtZQogICAgICogQHBhcmFtIG1peGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHZhbHVlCiAgICAgKiBAcGFyYW0gXFNjc3NQaHBcU2Nzc1BocFxDb21waWxlclxFbnZpcm9ubWVudCAkZW52CiAgICAgKiBAcGFyYW0gbWl4ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdmFsdWVVbnJlZHVjZWQKICAgICAqCiAgICAgKiBAcmV0dXJuIHZvaWQKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIHNldFJhdygkbmFtZSwgJHZhbHVlLCBFbnZpcm9ubWVudCAkZW52LCAkdmFsdWVVbnJlZHVjZWQgPSBudWxsKQogICAgewogICAgICAgICRlbnYtPnN0b3JlWyRuYW1lXSA9ICR2YWx1ZTsKCiAgICAgICAgaWYgKCR2YWx1ZVVucmVkdWNlZCkgewogICAgICAgICAgICAkZW52LT5zdG9yZVVucmVkdWNlZFskbmFtZV0gPSAkdmFsdWVVbnJlZHVjZWQ7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogR2V0IHZhcmlhYmxlCiAgICAgKgogICAgICogQGludGVybmFsCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJG5hbWUKICAgICAqIEBwYXJhbSBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzaG91bGRUaHJvdwogICAgICogQHBhcmFtIFxTY3NzUGhwXFNjc3NQaHBcQ29tcGlsZXJcRW52aXJvbm1lbnQgJGVudgogICAgICogQHBhcmFtIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHVucmVkdWNlZAogICAgICoKICAgICAqIEByZXR1cm4gbWl4ZWR8bnVsbAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0KCRuYW1lLCAkc2hvdWxkVGhyb3cgPSB0cnVlLCBFbnZpcm9ubWVudCAkZW52ID0gbnVsbCwgJHVucmVkdWNlZCA9IGZhbHNlKQogICAgewogICAgICAgICRub3JtYWxpemVkTmFtZSA9ICR0aGlzLT5ub3JtYWxpemVOYW1lKCRuYW1lKTsKICAgICAgICAkc3BlY2lhbENvbnRlbnRLZXkgPSBzdGF0aWM6OiRuYW1lc3BhY2VzWydzcGVjaWFsJ10gLiAnY29udGVudCc7CgogICAgICAgIGlmICghIGlzc2V0KCRlbnYpKSB7CiAgICAgICAgICAgICRlbnYgPSAkdGhpcy0+Z2V0U3RvcmVFbnYoKTsKICAgICAgICB9CgogICAgICAgICRoYXNOYW1lc3BhY2UgPSAkbm9ybWFsaXplZE5hbWVbMF0gPT09ICdeJyB8fCAkbm9ybWFsaXplZE5hbWVbMF0gPT09ICdAJyB8fCAkbm9ybWFsaXplZE5hbWVbMF0gPT09ICclJzsKCiAgICAgICAgJG1heERlcHRoID0gMTAwMDA7CgogICAgICAgIGZvciAoOzspIHsKICAgICAgICAgICAgaWYgKCRtYXhEZXB0aC0tIDw9IDApIHsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoXGFycmF5X2tleV9leGlzdHMoJG5vcm1hbGl6ZWROYW1lLCAkZW52LT5zdG9yZSkpIHsKICAgICAgICAgICAgICAgIGlmICgkdW5yZWR1Y2VkICYmIGlzc2V0KCRlbnYtPnN0b3JlVW5yZWR1Y2VkWyRub3JtYWxpemVkTmFtZV0pKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRlbnYtPnN0b3JlVW5yZWR1Y2VkWyRub3JtYWxpemVkTmFtZV07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmV0dXJuICRlbnYtPnN0b3JlWyRub3JtYWxpemVkTmFtZV07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghICRoYXNOYW1lc3BhY2UgJiYgaXNzZXQoJGVudi0+bWFya2VyKSkgewogICAgICAgICAgICAgICAgaWYgKCEgZW1wdHkoJGVudi0+c3RvcmVbJHNwZWNpYWxDb250ZW50S2V5XSkpIHsKICAgICAgICAgICAgICAgICAgICAkZW52ID0gJGVudi0+c3RvcmVbJHNwZWNpYWxDb250ZW50S2V5XS0+c2NvcGU7CiAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCEgZW1wdHkoJGVudi0+ZGVjbGFyYXRpb25TY29wZVBhcmVudCkpIHsKICAgICAgICAgICAgICAgICAgICAkZW52ID0gJGVudi0+ZGVjbGFyYXRpb25TY29wZVBhcmVudDsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJGVudiA9ICR0aGlzLT5yb290RW52OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChpc3NldCgkZW52LT5wYXJlbnRTdG9yZSkpIHsKICAgICAgICAgICAgICAgICRlbnYgPSAkZW52LT5wYXJlbnRTdG9yZTsKICAgICAgICAgICAgfSBlbHNlaWYgKGlzc2V0KCRlbnYtPnBhcmVudCkpIHsKICAgICAgICAgICAgICAgICRlbnYgPSAkZW52LT5wYXJlbnQ7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCRzaG91bGRUaHJvdykgewogICAgICAgICAgICB0aHJvdyAkdGhpcy0+ZXJyb3IoIlVuZGVmaW5lZCB2YXJpYWJsZSBcJCRuYW1lIiAuICgkbWF4RGVwdGggPD0gMCA/ICcgKGluZmluaXRlIHJlY3Vyc2lvbiknIDogJycpKTsKICAgICAgICB9CgogICAgICAgIC8vIGZvdW5kIG5vdGhpbmcKICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KCiAgICAvKioKICAgICAqIEhhcyB2YXJpYWJsZT8KICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbmFtZQogICAgICogQHBhcmFtIFxTY3NzUGhwXFNjc3NQaHBcQ29tcGlsZXJcRW52aXJvbm1lbnQgJGVudgogICAgICoKICAgICAqIEByZXR1cm4gYm9vbAogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gaGFzKCRuYW1lLCBFbnZpcm9ubWVudCAkZW52ID0gbnVsbCkKICAgIHsKICAgICAgICByZXR1cm4gISBcaXNfbnVsbCgkdGhpcy0+Z2V0KCRuYW1lLCBmYWxzZSwgJGVudikpOwogICAgfQoKICAgIC8qKgogICAgICogSW5qZWN0IHZhcmlhYmxlcwogICAgICoKICAgICAqIEBwYXJhbSBhcnJheSAkYXJncwogICAgICoKICAgICAqIEByZXR1cm4gdm9pZAogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gaW5qZWN0VmFyaWFibGVzKGFycmF5ICRhcmdzKQogICAgewogICAgICAgIGlmIChlbXB0eSgkYXJncykpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgJHBhcnNlciA9ICR0aGlzLT5wYXJzZXJGYWN0b3J5KF9fTUVUSE9EX18pOwoKICAgICAgICBmb3JlYWNoICgkYXJncyBhcyAkbmFtZSA9PiAkc3RyVmFsdWUpIHsKICAgICAgICAgICAgaWYgKCRuYW1lWzBdID09PSAnJCcpIHsKICAgICAgICAgICAgICAgICRuYW1lID0gc3Vic3RyKCRuYW1lLCAxKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFcaXNfc3RyaW5nKCRzdHJWYWx1ZSkgfHwgISAkcGFyc2VyLT5wYXJzZVZhbHVlKCRzdHJWYWx1ZSwgJHZhbHVlKSkgewogICAgICAgICAgICAgICAgJHZhbHVlID0gJHRoaXMtPmNvZXJjZVZhbHVlKCRzdHJWYWx1ZSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICR0aGlzLT5zZXQoJG5hbWUsICR2YWx1ZSk7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogUmVwbGFjZXMgdmFyaWFibGVzLgogICAgICoKICAgICAqIEBwYXJhbSBhcnJheTxzdHJpbmcsIG1peGVkPiAkdmFyaWFibGVzCiAgICAgKgogICAgICogQHJldHVybiB2b2lkCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiByZXBsYWNlVmFyaWFibGVzKGFycmF5ICR2YXJpYWJsZXMpCiAgICB7CiAgICAgICAgJHRoaXMtPnJlZ2lzdGVyZWRWYXJzID0gW107CiAgICAgICAgJHRoaXMtPmFkZFZhcmlhYmxlcygkdmFyaWFibGVzKTsKICAgIH0KCiAgICAvKioKICAgICAqIFJlcGxhY2VzIHZhcmlhYmxlcy4KICAgICAqCiAgICAgKiBAcGFyYW0gYXJyYXk8c3RyaW5nLCBtaXhlZD4gJHZhcmlhYmxlcwogICAgICoKICAgICAqIEByZXR1cm4gdm9pZAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gYWRkVmFyaWFibGVzKGFycmF5ICR2YXJpYWJsZXMpCiAgICB7CiAgICAgICAgJHRyaWdnZXJXYXJuaW5nID0gZmFsc2U7CgogICAgICAgIGZvcmVhY2ggKCR2YXJpYWJsZXMgYXMgJG5hbWUgPT4gJHZhbHVlKSB7CiAgICAgICAgICAgIGlmICghJHZhbHVlIGluc3RhbmNlb2YgTnVtYmVyICYmICFcaXNfYXJyYXkoJHZhbHVlKSkgewogICAgICAgICAgICAgICAgJHRyaWdnZXJXYXJuaW5nID0gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHRoaXMtPnJlZ2lzdGVyZWRWYXJzWyRuYW1lXSA9ICR2YWx1ZTsKICAgICAgICB9CgogICAgICAgIGlmICgkdHJpZ2dlcldhcm5pbmcpIHsKICAgICAgICAgICAgQHRyaWdnZXJfZXJyb3IoJ1Bhc3NpbmcgcmF3IHZhbHVlcyB0byBhcyBjdXN0b20gdmFyaWFibGVzIHRvIHRoZSBDb21waWxlciBpcyBkZXByZWNhdGVkLiBVc2UgIlxTY3NzUGhwXFNjc3NQaHBcVmFsdWVDb252ZXJ0ZXI6OnBhcnNlVmFsdWUiIG9yICJcU2Nzc1BocFxTY3NzUGhwXFZhbHVlQ29udmVydGVyOjpmcm9tUGhwIiB0byBjb252ZXJ0IHRoZW0gaW5zdGVhZC4nLCBFX1VTRVJfREVQUkVDQVRFRCk7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogU2V0IHZhcmlhYmxlcwogICAgICoKICAgICAqIEBhcGkKICAgICAqCiAgICAgKiBAcGFyYW0gYXJyYXkgJHZhcmlhYmxlcwogICAgICoKICAgICAqIEByZXR1cm4gdm9pZAogICAgICoKICAgICAqIEBkZXByZWNhdGVkIFVzZSAiYWRkVmFyaWFibGVzIiBvciAicmVwbGFjZVZhcmlhYmxlcyIgaW5zdGVhZC4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHNldFZhcmlhYmxlcyhhcnJheSAkdmFyaWFibGVzKQogICAgewogICAgICAgIEB0cmlnZ2VyX2Vycm9yKCdUaGUgbWV0aG9kICJzZXRWYXJpYWJsZXMiIG9mIHRoZSBDb21waWxlciBpcyBkZXByZWNhdGVkLiBVc2UgdGhlICJhZGRWYXJpYWJsZXMiIG1ldGhvZCBmb3IgdGhlIGVxdWl2YWxlbnQgYmVoYXZpb3Igb3IgInJlcGxhY2VWYXJpYWJsZXMiIGlmIG1lcmdpbmcgd2l0aCBwcmV2aW91cyB2YXJpYWJsZXMgd2FzIG5vdCBkZXNpcmVkLicpOwoKICAgICAgICAkdGhpcy0+YWRkVmFyaWFibGVzKCR2YXJpYWJsZXMpOwogICAgfQoKICAgIC8qKgogICAgICogVW5zZXQgdmFyaWFibGUKICAgICAqCiAgICAgKiBAYXBpCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkbmFtZQogICAgICoKICAgICAqIEByZXR1cm4gdm9pZAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gdW5zZXRWYXJpYWJsZSgkbmFtZSkKICAgIHsKICAgICAgICB1bnNldCgkdGhpcy0+cmVnaXN0ZXJlZFZhcnNbJG5hbWVdKTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgbGlzdCBvZiB2YXJpYWJsZXMKICAgICAqCiAgICAgKiBAYXBpCiAgICAgKgogICAgICogQHJldHVybiBhcnJheQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0VmFyaWFibGVzKCkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnJlZ2lzdGVyZWRWYXJzOwogICAgfQoKICAgIC8qKgogICAgICogQWRkcyB0byBsaXN0IG9mIHBhcnNlZCBmaWxlcwogICAgICoKICAgICAqIEBpbnRlcm5hbAogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmd8bnVsbCAkcGF0aAogICAgICoKICAgICAqIEByZXR1cm4gdm9pZAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gYWRkUGFyc2VkRmlsZSgkcGF0aCkKICAgIHsKICAgICAgICBpZiAoISBcaXNfbnVsbCgkcGF0aCkgJiYgaXNfZmlsZSgkcGF0aCkpIHsKICAgICAgICAgICAgJHRoaXMtPnBhcnNlZEZpbGVzW3JlYWxwYXRoKCRwYXRoKV0gPSBmaWxlbXRpbWUoJHBhdGgpOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgbGlzdCBvZiBwYXJzZWQgZmlsZXMKICAgICAqCiAgICAgKiBAZGVwcmVjYXRlZAogICAgICogQHJldHVybiBhcnJheTxzdHJpbmcsIGludD4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldFBhcnNlZEZpbGVzKCkKICAgIHsKICAgICAgICBAdHJpZ2dlcl9lcnJvcignVGhlIG1ldGhvZCAiZ2V0UGFyc2VkRmlsZXMiIG9mIHRoZSBDb21waWxlciBpcyBkZXByZWNhdGVkLiBVc2UgdGhlICJnZXRJbmNsdWRlZEZpbGVzIiBtZXRob2Qgb24gdGhlIENvbXBpbGF0aW9uUmVzdWx0IGluc3RhbmNlIHJldHVybmVkIGJ5IGNvbXBpbGVTdHJpbmcoKSBpbnN0ZWFkLiBCZSBjYXJlZnVsIHRoYXQgdGhlIHNpZ25hdHVyZSBvZiB0aGUgbWV0aG9kIGlzIGRpZmZlcmVudC4nLCBFX1VTRVJfREVQUkVDQVRFRCk7CiAgICAgICAgcmV0dXJuICR0aGlzLT5wYXJzZWRGaWxlczsKICAgIH0KCiAgICAvKioKICAgICAqIEFkZCBpbXBvcnQgcGF0aAogICAgICoKICAgICAqIEBhcGkKICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nfGNhbGxhYmxlICRwYXRoCiAgICAgKgogICAgICogQHJldHVybiB2b2lkCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBhZGRJbXBvcnRQYXRoKCRwYXRoKQogICAgewogICAgICAgIGlmICghIFxpbl9hcnJheSgkcGF0aCwgJHRoaXMtPmltcG9ydFBhdGhzKSkgewogICAgICAgICAgICAkdGhpcy0+aW1wb3J0UGF0aHNbXSA9ICRwYXRoOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIFNldCBpbXBvcnQgcGF0aHMKICAgICAqCiAgICAgKiBAYXBpCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZ3xhcnJheTxzdHJpbmd8Y2FsbGFibGU+ICRwYXRoCiAgICAgKgogICAgICogQHJldHVybiB2b2lkCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRJbXBvcnRQYXRocygkcGF0aCkKICAgIHsKICAgICAgICAkcGF0aHMgPSAoYXJyYXkpICRwYXRoOwogICAgICAgICRhY3R1YWxJbXBvcnRQYXRocyA9IGFycmF5X2ZpbHRlcigkcGF0aHMsIGZ1bmN0aW9uICgkcGF0aCkgewogICAgICAgICAgICByZXR1cm4gJHBhdGggIT09ICcnOwogICAgICAgIH0pOwoKICAgICAgICAkdGhpcy0+bGVnYWN5Q3dkSW1wb3J0UGF0aCA9IFxjb3VudCgkYWN0dWFsSW1wb3J0UGF0aHMpICE9PSBcY291bnQoJHBhdGhzKTsKCiAgICAgICAgaWYgKCR0aGlzLT5sZWdhY3lDd2RJbXBvcnRQYXRoKSB7CiAgICAgICAgICAgIEB0cmlnZ2VyX2Vycm9yKCdQYXNzaW5nIGFuIGVtcHR5IHN0cmluZyBpbiB0aGUgaW1wb3J0IHBhdGhzIHRvIHJlZmVyIHRvIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IGlzIGRlcHJlY2F0ZWQuIElmIHRoYXRcJ3MgdGhlIGludGVuZGVkIGJlaGF2aW9yLCB0aGUgdmFsdWUgb2YgImdldGN3ZCgpIiBzaG91bGQgYmUgdXNlZCBkaXJlY3RseSBpbnN0ZWFkLiBJZiB0aGlzIHdhcyB1c2VkIGZvciByZXNvbHZpbmcgcmVsYXRpdmUgaW1wb3J0cyBvZiB0aGUgaW5wdXQgYWxvbmdzaWRlICJjaGRpciIgd2l0aCB0aGUgc291cmNlIGRpcmVjdG9yeSwgdGhlIHBhdGggb2YgdGhlIGlucHV0IGZpbGUgc2hvdWxkIGJlIHBhc3NlZCB0byAiY29tcGlsZVN0cmluZygpIiBpbnN0ZWFkLicsIEVfVVNFUl9ERVBSRUNBVEVEKTsKICAgICAgICB9CgogICAgICAgICR0aGlzLT5pbXBvcnRQYXRocyA9ICRhY3R1YWxJbXBvcnRQYXRoczsKICAgIH0KCiAgICAvKioKICAgICAqIFNldCBudW1iZXIgcHJlY2lzaW9uCiAgICAgKgogICAgICogQGFwaQogICAgICoKICAgICAqIEBwYXJhbSBpbnQgJG51bWJlclByZWNpc2lvbgogICAgICoKICAgICAqIEByZXR1cm4gdm9pZAogICAgICoKICAgICAqIEBkZXByZWNhdGVkIFRoZSBudW1iZXIgcHJlY2lzaW9uIGlzIG5vdCBjb25maWd1cmFibGUgYW55bW9yZS4gVGhlIGRlZmF1bHQgaXMgZW5vdWdoIGZvciBhbGwgYnJvd3NlcnMuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzZXROdW1iZXJQcmVjaXNpb24oJG51bWJlclByZWNpc2lvbikKICAgIHsKICAgICAgICBAdHJpZ2dlcl9lcnJvcignVGhlIG51bWJlciBwcmVjaXNpb24gaXMgbm90IGNvbmZpZ3VyYWJsZSBhbnltb3JlLiAnCiAgICAgICAgICAgIC4gJ1RoZSBkZWZhdWx0IGlzIGVub3VnaCBmb3IgYWxsIGJyb3dzZXJzLicsIEVfVVNFUl9ERVBSRUNBVEVEKTsKICAgIH0KCiAgICAvKioKICAgICAqIFNldHMgdGhlIG91dHB1dCBzdHlsZS4KICAgICAqCiAgICAgKiBAYXBpCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkc3R5bGUgT25lIG9mIHRoZSBPdXRwdXRTdHlsZSBjb25zdGFudHMKICAgICAqCiAgICAgKiBAcmV0dXJuIHZvaWQKICAgICAqCiAgICAgKiBAcGhwc3Rhbi1wYXJhbSBPdXRwdXRTdHlsZTo6KiAkc3R5bGUKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHNldE91dHB1dFN0eWxlKCRzdHlsZSkKICAgIHsKICAgICAgICBzd2l0Y2ggKCRzdHlsZSkgewogICAgICAgICAgICBjYXNlIE91dHB1dFN0eWxlOjpFWFBBTkRFRDoKICAgICAgICAgICAgICAgICR0aGlzLT5jb25maWd1cmVkRm9ybWF0dGVyID0gRXhwYW5kZWQ6OmNsYXNzOwogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIE91dHB1dFN0eWxlOjpDT01QUkVTU0VEOgogICAgICAgICAgICAgICAgJHRoaXMtPmNvbmZpZ3VyZWRGb3JtYXR0ZXIgPSBDb21wcmVzc2VkOjpjbGFzczsKICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIHRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKHNwcmludGYoJ0ludmFsaWQgb3V0cHV0IHN0eWxlICIlcyIuJywgJHN0eWxlKSk7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogU2V0IGZvcm1hdHRlcgogICAgICoKICAgICAqIEBhcGkKICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICRmb3JtYXR0ZXJOYW1lCiAgICAgKgogICAgICogQHJldHVybiB2b2lkCiAgICAgKgogICAgICogQGRlcHJlY2F0ZWQgVXNlIHtAc2VlIHNldE91dHB1dFN0eWxlfSBpbnN0ZWFkLgogICAgICoKICAgICAqIEBwaHBzdGFuLXBhcmFtIGNsYXNzLXN0cmluZzxGb3JtYXR0ZXI+ICRmb3JtYXR0ZXJOYW1lCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRGb3JtYXR0ZXIoJGZvcm1hdHRlck5hbWUpCiAgICB7CiAgICAgICAgaWYgKCFcaW5fYXJyYXkoJGZvcm1hdHRlck5hbWUsIFtFeHBhbmRlZDo6Y2xhc3MsIENvbXByZXNzZWQ6OmNsYXNzXSwgdHJ1ZSkpIHsKICAgICAgICAgICAgQHRyaWdnZXJfZXJyb3IoJ0Zvcm1hdHRlcnMgb3RoZXIgdGhhbiBFeHBhbmRlZCBhbmQgQ29tcHJlc3NlZCBhcmUgZGVwcmVjYXRlZC4nLCBFX1VTRVJfREVQUkVDQVRFRCk7CiAgICAgICAgfQogICAgICAgIEB0cmlnZ2VyX2Vycm9yKCdUaGUgbWV0aG9kICJzZXRGb3JtYXR0ZXIiIGlzIGRlcHJlY2F0ZWQuIFVzZSAic2V0T3V0cHV0U3R5bGUiIGluc3RlYWQuJywgRV9VU0VSX0RFUFJFQ0FURUQpOwoKICAgICAgICAkdGhpcy0+Y29uZmlndXJlZEZvcm1hdHRlciA9ICRmb3JtYXR0ZXJOYW1lOwogICAgfQoKICAgIC8qKgogICAgICogU2V0IGxpbmUgbnVtYmVyIHN0eWxlCiAgICAgKgogICAgICogQGFwaQogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgJGxpbmVOdW1iZXJTdHlsZQogICAgICoKICAgICAqIEByZXR1cm4gdm9pZAogICAgICoKICAgICAqIEBkZXByZWNhdGVkIFRoZSBsaW5lIG51bWJlciBvdXRwdXQgaXMgbm90IHN1cHBvcnRlZCBhbnltb3JlLiBVc2Ugc291cmNlIG1hcHMgaW5zdGVhZC4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHNldExpbmVOdW1iZXJTdHlsZSgkbGluZU51bWJlclN0eWxlKQogICAgewogICAgICAgIEB0cmlnZ2VyX2Vycm9yKCdUaGUgbGluZSBudW1iZXIgb3V0cHV0IGlzIG5vdCBzdXBwb3J0ZWQgYW55bW9yZS4gJwogICAgICAgICAgICAgICAgICAgICAgIC4gJ1VzZSBzb3VyY2UgbWFwcyBpbnN0ZWFkLicsIEVfVVNFUl9ERVBSRUNBVEVEKTsKICAgIH0KCiAgICAvKioKICAgICAqIENvbmZpZ3VyZXMgdGhlIGhhbmRsaW5nIG9mIG5vbi1BU0NJSSBvdXRwdXRzLgogICAgICoKICAgICAqIElmICRjaGFyc2V0IGlzIGB0cnVlYCwgdGhpcyB3aWxsIGluY2x1ZGUgYSBgQGNoYXJzZXRgIGRlY2xhcmF0aW9uIG9yIGEKICAgICAqIFVURi04IFtieXRlLW9yZGVyIG1hcmtdW10gaWYgdGhlIHN0eWxlc2hlZXQgY29udGFpbnMgYW55IG5vbi1BU0NJSQogICAgICogY2hhcmFjdGVycy4gT3RoZXJ3aXNlLCBpdCB3aWxsIG5ldmVyIGluY2x1ZGUgYSBgQGNoYXJzZXRgIGRlY2xhcmF0aW9uIG9yIGEKICAgICAqIGJ5dGUtb3JkZXIgbWFyay4KICAgICAqCiAgICAgKiBbYnl0ZS1vcmRlciBtYXJrXTogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQnl0ZV9vcmRlcl9tYXJrI1VURi04CiAgICAgKgogICAgICogQHBhcmFtIGJvb2wgJGNoYXJzZXQKICAgICAqCiAgICAgKiBAcmV0dXJuIHZvaWQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHNldENoYXJzZXQoJGNoYXJzZXQpCiAgICB7CiAgICAgICAgJHRoaXMtPmNoYXJzZXQgPSAkY2hhcnNldDsKICAgIH0KCiAgICAvKioKICAgICAqIEVuYWJsZS9kaXNhYmxlIHNvdXJjZSBtYXBzCiAgICAgKgogICAgICogQGFwaQogICAgICoKICAgICAqIEBwYXJhbSBpbnQgJHNvdXJjZU1hcAogICAgICoKICAgICAqIEByZXR1cm4gdm9pZAogICAgICoKICAgICAqIEBwaHBzdGFuLXBhcmFtIHNlbGY6OlNPVVJDRV9NQVBfKiAkc291cmNlTWFwCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRTb3VyY2VNYXAoJHNvdXJjZU1hcCkKICAgIHsKICAgICAgICAkdGhpcy0+c291cmNlTWFwID0gJHNvdXJjZU1hcDsKICAgIH0KCiAgICAvKioKICAgICAqIFNldCBzb3VyY2UgbWFwIG9wdGlvbnMKICAgICAqCiAgICAgKiBAYXBpCiAgICAgKgogICAgICogQHBhcmFtIGFycmF5ICRzb3VyY2VNYXBPcHRpb25zCiAgICAgKgogICAgICogQHBocHN0YW4tcGFyYW0gIGFycmF5e3NvdXJjZVJvb3Q/OiBzdHJpbmcsIHNvdXJjZU1hcEZpbGVuYW1lPzogc3RyaW5nfG51bGwsIHNvdXJjZU1hcFVSTD86IHN0cmluZ3xudWxsLCBzb3VyY2VNYXBXcml0ZVRvPzogc3RyaW5nfG51bGwsIG91dHB1dFNvdXJjZUZpbGVzPzogYm9vbCwgc291cmNlTWFwUm9vdHBhdGg/OiBzdHJpbmcsIHNvdXJjZU1hcEJhc2VwYXRoPzogc3RyaW5nfSAkc291cmNlTWFwT3B0aW9ucwogICAgICoKICAgICAqIEByZXR1cm4gdm9pZAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc2V0U291cmNlTWFwT3B0aW9ucygkc291cmNlTWFwT3B0aW9ucykKICAgIHsKICAgICAgICAkdGhpcy0+c291cmNlTWFwT3B0aW9ucyA9ICRzb3VyY2VNYXBPcHRpb25zOwogICAgfQoKICAgIC8qKgogICAgICogUmVnaXN0ZXIgZnVuY3Rpb24KICAgICAqCiAgICAgKiBAYXBpCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAgICAgICAgJG5hbWUKICAgICAqIEBwYXJhbSBjYWxsYWJsZSAgICAgICRjYWxsYmFjawogICAgICogQHBhcmFtIHN0cmluZ1tdfG51bGwgJGFyZ3VtZW50RGVjbGFyYXRpb24KICAgICAqCiAgICAgKiBAcmV0dXJuIHZvaWQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHJlZ2lzdGVyRnVuY3Rpb24oJG5hbWUsICRjYWxsYmFjaywgJGFyZ3VtZW50RGVjbGFyYXRpb24gPSBudWxsKQogICAgewogICAgICAgIGlmIChzZWxmOjppc05hdGl2ZUZ1bmN0aW9uKCRuYW1lKSkgewogICAgICAgICAgICBAdHJpZ2dlcl9lcnJvcihzcHJpbnRmKCdUaGUgIiVzIiBmdW5jdGlvbiBpcyBhIGNvcmUgc2FzcyBmdW5jdGlvbi4gT3ZlcnJpZGluZyBpdCB3aXRoIGEgY3VzdG9tIGltcGxlbWVudGF0aW9uIHRocm91Z2ggIiVzIiBpcyBkZXByZWNhdGVkIGFuZCB3b25cJ3QgYmUgc3VwcG9ydGVkIGluIFNjc3NQaHAgMi4wIGFueW1vcmUuJywgJG5hbWUsIF9fTUVUSE9EX18pLCBFX1VTRVJfREVQUkVDQVRFRCk7CiAgICAgICAgfQoKICAgICAgICBpZiAoJGFyZ3VtZW50RGVjbGFyYXRpb24gPT09IG51bGwpIHsKICAgICAgICAgICAgQHRyaWdnZXJfZXJyb3IoJ09taXR0aW5nIHRoZSBhcmd1bWVudCBkZWNsYXJhdGlvbiB3aGVuIHJlZ2lzdGVyaW5nIGN1c3RvbSBmdW5jdGlvbiBpcyBkZXByZWNhdGVkIGFuZCB3b25cJ3QgYmUgc3VwcG9ydGVkIGluIFNjc3NQaHAgMi4wIGFueW1vcmUuJywgRV9VU0VSX0RFUFJFQ0FURUQpOwogICAgICAgIH0KCiAgICAgICAgaWYgKCR0aGlzLT5yZWZsZWN0Q2FsbGFibGUoJGNhbGxiYWNrKS0+Z2V0TnVtYmVyT2ZSZXF1aXJlZFBhcmFtZXRlcnMoKSA+IDEpIHsKICAgICAgICAgICAgQHRyaWdnZXJfZXJyb3IoJ1RoZSBzZWNvbmQgYXJndW1lbnQgcGFzc2VkIHRvIHRoZSBjYWxsYmFjayBvZiBjdXN0b20gZnVuY3Rpb25zIGlzIGRlcHJlY2F0ZWQgYW5kIHdvblwndCBiZSBzdXBwb3J0ZWQgaW4gU2Nzc1BocCAyLjAgYW55bW9yZS4gUmVnaXN0ZXIgYSBjYWxsYmFjayBhY2NlcHRpbmcgb25seSAxIHBhcmFtZXRlciBpbnN0ZWFkLicsIEVfVVNFUl9ERVBSRUNBVEVEKTsKICAgICAgICB9CgogICAgICAgICR0aGlzLT51c2VyRnVuY3Rpb25zWyR0aGlzLT5ub3JtYWxpemVOYW1lKCRuYW1lKV0gPSBbJGNhbGxiYWNrLCAkYXJndW1lbnREZWNsYXJhdGlvbl07CiAgICB9CgogICAgLyoqCiAgICAgKiBAcmV0dXJuIFxSZWZsZWN0aW9uRnVuY3Rpb25BYnN0cmFjdAogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIHJlZmxlY3RDYWxsYWJsZShjYWxsYWJsZSAkYykKICAgIHsKICAgICAgICBpZiAoXGlzX29iamVjdCgkYykgJiYgISRjIGluc3RhbmNlb2YgXENsb3N1cmUpIHsKICAgICAgICAgICAgJGMgPSBbJGMsICdfX2ludm9rZSddOwogICAgICAgIH0KCiAgICAgICAgaWYgKFxpc19zdHJpbmcoJGMpICYmIGZhbHNlICE9PSBzdHJwb3MoJGMsICc6OicpKSB7CiAgICAgICAgICAgICRjID0gZXhwbG9kZSgnOjonLCAkYywgMik7CiAgICAgICAgfQoKICAgICAgICBpZiAoXGlzX2FycmF5KCRjKSkgewogICAgICAgICAgICByZXR1cm4gbmV3IFxSZWZsZWN0aW9uTWV0aG9kKCRjWzBdLCAkY1sxXSk7CiAgICAgICAgfQoKICAgICAgICBcYXNzZXJ0KFxpc19zdHJpbmcoJGMpIHx8ICRjIGluc3RhbmNlb2YgXENsb3N1cmUpOwoKICAgICAgICByZXR1cm4gbmV3IFxSZWZsZWN0aW9uRnVuY3Rpb24oJGMpOwogICAgfQoKICAgIC8qKgogICAgICogVW5yZWdpc3RlciBmdW5jdGlvbgogICAgICoKICAgICAqIEBhcGkKICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lCiAgICAgKgogICAgICogQHJldHVybiB2b2lkCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiB1bnJlZ2lzdGVyRnVuY3Rpb24oJG5hbWUpCiAgICB7CiAgICAgICAgdW5zZXQoJHRoaXMtPnVzZXJGdW5jdGlvbnNbJHRoaXMtPm5vcm1hbGl6ZU5hbWUoJG5hbWUpXSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBBZGQgZmVhdHVyZQogICAgICoKICAgICAqIEBhcGkKICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lCiAgICAgKgogICAgICogQHJldHVybiB2b2lkCiAgICAgKgogICAgICogQGRlcHJlY2F0ZWQgUmVnaXN0ZXJpbmcgYWRkaXRpb25hbCBmZWF0dXJlcyBpcyBkZXByZWNhdGVkLgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gYWRkRmVhdHVyZSgkbmFtZSkKICAgIHsKICAgICAgICBAdHJpZ2dlcl9lcnJvcignUmVnaXN0ZXJpbmcgYWRkaXRpb25hbCBmZWF0dXJlcyBpcyBkZXByZWNhdGVkLicsIEVfVVNFUl9ERVBSRUNBVEVEKTsKCiAgICAgICAgJHRoaXMtPnJlZ2lzdGVyZWRGZWF0dXJlc1skbmFtZV0gPSB0cnVlOwogICAgfQoKICAgIC8qKgogICAgICogSW1wb3J0IGZpbGUKICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHBhdGgKICAgICAqIEBwYXJhbSBcU2Nzc1BocFxTY3NzUGhwXEZvcm1hdHRlclxPdXRwdXRCbG9jayAkb3V0CiAgICAgKgogICAgICogQHJldHVybiB2b2lkCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBpbXBvcnRGaWxlKCRwYXRoLCBPdXRwdXRCbG9jayAkb3V0KQogICAgewogICAgICAgICR0aGlzLT5wdXNoQ2FsbFN0YWNrKCdpbXBvcnQgJyAuICR0aGlzLT5nZXRQcmV0dHlQYXRoKCRwYXRoKSk7CiAgICAgICAgLy8gc2VlIGlmIHRyZWUgaXMgY2FjaGVkCiAgICAgICAgJHJlYWxQYXRoID0gcmVhbHBhdGgoJHBhdGgpOwoKICAgICAgICBpZiAoJHJlYWxQYXRoID09PSBmYWxzZSkgewogICAgICAgICAgICAkcmVhbFBhdGggPSAkcGF0aDsKICAgICAgICB9CgogICAgICAgIGlmIChzdWJzdHIoJHBhdGgsIC01KSA9PT0gJy5zYXNzJykgewogICAgICAgICAgICAkdGhpcy0+c291cmNlSW5kZXggPSBcY291bnQoJHRoaXMtPnNvdXJjZU5hbWVzKTsKICAgICAgICAgICAgJHRoaXMtPnNvdXJjZU5hbWVzW10gPSAkcGF0aDsKICAgICAgICAgICAgJHRoaXMtPnNvdXJjZUxpbmUgPSAxOwogICAgICAgICAgICAkdGhpcy0+c291cmNlQ29sdW1uID0gMTsKCiAgICAgICAgICAgIHRocm93ICR0aGlzLT5lcnJvcignVGhlIFNhc3MgaW5kZW50ZWQgc3ludGF4IGlzIG5vdCBpbXBsZW1lbnRlZC4nKTsKICAgICAgICB9CgogICAgICAgIGlmIChpc3NldCgkdGhpcy0+aW1wb3J0Q2FjaGVbJHJlYWxQYXRoXSkpIHsKICAgICAgICAgICAgJHRoaXMtPmhhbmRsZUltcG9ydExvb3AoJHJlYWxQYXRoKTsKCiAgICAgICAgICAgICR0cmVlID0gJHRoaXMtPmltcG9ydENhY2hlWyRyZWFsUGF0aF07CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJGNvZGUgICA9IGZpbGVfZ2V0X2NvbnRlbnRzKCRwYXRoKTsKICAgICAgICAgICAgJHBhcnNlciA9ICR0aGlzLT5wYXJzZXJGYWN0b3J5KCRwYXRoKTsKICAgICAgICAgICAgJHRyZWUgICA9ICRwYXJzZXItPnBhcnNlKCRjb2RlKTsKCiAgICAgICAgICAgICR0aGlzLT5pbXBvcnRDYWNoZVskcmVhbFBhdGhdID0gJHRyZWU7CiAgICAgICAgfQoKICAgICAgICAkY3VycmVudERpcmVjdG9yeSA9ICR0aGlzLT5jdXJyZW50RGlyZWN0b3J5OwogICAgICAgICR0aGlzLT5jdXJyZW50RGlyZWN0b3J5ID0gZGlybmFtZSgkcGF0aCk7CgogICAgICAgICR0aGlzLT5jb21waWxlQ2hpbGRyZW5Ob1JldHVybigkdHJlZS0+Y2hpbGRyZW4sICRvdXQpOwogICAgICAgICR0aGlzLT5jdXJyZW50RGlyZWN0b3J5ID0gJGN1cnJlbnREaXJlY3Rvcnk7CiAgICAgICAgJHRoaXMtPnBvcENhbGxTdGFjaygpOwogICAgfQoKICAgIC8qKgogICAgICogU2F2ZSB0aGUgaW1wb3J0ZWQgZmlsZXMgd2l0aCB0aGVpciByZXNvbHZpbmcgcGF0aCBjb250ZXh0CiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZ3xudWxsICRjdXJyZW50RGlyZWN0b3J5CiAgICAgKiBAcGFyYW0gc3RyaW5nICAgICAgJHBhdGgKICAgICAqIEBwYXJhbSBzdHJpbmcgICAgICAkZmlsZVBhdGgKICAgICAqCiAgICAgKiBAcmV0dXJuIHZvaWQKICAgICAqLwogICAgcHJpdmF0ZSBmdW5jdGlvbiByZWdpc3RlckltcG9ydCgkY3VycmVudERpcmVjdG9yeSwgJHBhdGgsICRmaWxlUGF0aCkKICAgIHsKICAgICAgICAkdGhpcy0+cmVzb2x2ZWRJbXBvcnRzW10gPSBbJ2N1cnJlbnREaXInID0+ICRjdXJyZW50RGlyZWN0b3J5LCAncGF0aCcgPT4gJHBhdGgsICdmaWxlUGF0aCcgPT4gJGZpbGVQYXRoXTsKICAgIH0KCiAgICAvKioKICAgICAqIERldGVjdHMgd2hldGhlciB0aGUgaW1wb3J0IGlzIGEgQ1NTIGltcG9ydC4KICAgICAqCiAgICAgKiBGb3IgbGVnYWN5IHJlYXNvbnMsIGN1c3RvbSBpbXBvcnRlcnMgYXJlIGNhbGxlZCBmb3IgdGhvc2UsIGFsbG93aW5nIHRoZW0KICAgICAqIHRvIHJlcGxhY2UgdGhlbSB3aXRoIGFuIGFjdHVhbCBTYXNzIGltcG9ydC4gSG93ZXZlciB0aGlzIGJlaGF2aW9yIGlzCiAgICAgKiBkZXByZWNhdGVkLiBDdXN0b20gaW1wb3J0ZXJzIGFyZSBleHBlY3RlZCB0byByZXR1cm4gbnVsbCB3aGVuIHRoZXkgcmVjZWl2ZQogICAgICogYSBDU1MgaW1wb3J0LgogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgJHVybAogICAgICoKICAgICAqIEByZXR1cm4gYm9vbAogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGlzQ3NzSW1wb3J0KCR1cmwpCiAgICB7CiAgICAgICAgcmV0dXJuIDEgPT09IHByZWdfbWF0Y2goJ35cLmNzcyR8Xmh0dHBzPzovL3xeLy9+JywgJHVybCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm4gdGhlIGZpbGUgcGF0aCBmb3IgYW4gaW1wb3J0IHVybCBpZiBpdCBleGlzdHMKICAgICAqCiAgICAgKiBAaW50ZXJuYWwKICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICAgICAgJHVybAogICAgICogQHBhcmFtIHN0cmluZ3xudWxsICRjdXJyZW50RGlyCiAgICAgKgogICAgICogQHJldHVybiBzdHJpbmd8bnVsbAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZmluZEltcG9ydCgkdXJsLCAkY3VycmVudERpciA9IG51bGwpCiAgICB7CiAgICAgICAgLy8gVmFuaWxsYSBjc3MgYW5kIGV4dGVybmFsIHJlcXVlc3RzLiBUaGVzZSBhcmUgbm90IG1lYW50IHRvIGJlIFNhc3MgaW1wb3J0cy4KICAgICAgICAvLyBDYWxsYmFjayBpbXBvcnRlcnMgYXJlIHN0aWxsIGNhbGxlZCBmb3IgQkMuCiAgICAgICAgaWYgKHNlbGY6OmlzQ3NzSW1wb3J0KCR1cmwpKSB7CiAgICAgICAgICAgIGZvcmVhY2ggKCR0aGlzLT5pbXBvcnRQYXRocyBhcyAkZGlyKSB7CiAgICAgICAgICAgICAgICBpZiAoXGlzX3N0cmluZygkZGlyKSkgewogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmIChcaXNfY2FsbGFibGUoJGRpcikpIHsKICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBjdXN0b20gY2FsbGJhY2sgZm9yIGltcG9ydCBwYXRoCiAgICAgICAgICAgICAgICAgICAgJGZpbGUgPSBcY2FsbF91c2VyX2Z1bmMoJGRpciwgJHVybCk7CgogICAgICAgICAgICAgICAgICAgIGlmICghIFxpc19udWxsKCRmaWxlKSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoXGlzX2FycmF5KCRkaXIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkY2FsbGFibGVEZXNjcmlwdGlvbiA9IChcaXNfb2JqZWN0KCRkaXJbMF0pID8gXGdldF9jbGFzcygkZGlyWzBdKSA6ICRkaXJbMF0pIC4gJzo6JyAuICRkaXJbMV07CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZWlmICgkZGlyIGluc3RhbmNlb2YgXENsb3N1cmUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRyID0gbmV3IFxSZWZsZWN0aW9uRnVuY3Rpb24oJGRpcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmFsc2UgIT09IHN0cnBvcygkci0+bmFtZSwgJ3tjbG9zdXJlfScpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGNhbGxhYmxlRGVzY3JpcHRpb24gPSBzcHJpbnRmKCdjbG9zdXJleyVzOiVzfScsICRyLT5nZXRGaWxlTmFtZSgpLCAkci0+Z2V0U3RhcnRMaW5lKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlaWYgKCRjbGFzcyA9ICRyLT5nZXRDbG9zdXJlU2NvcGVDbGFzcygpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGNhbGxhYmxlRGVzY3JpcHRpb24gPSAkY2xhc3MtPm5hbWUgLiAnOjonIC4gJHItPm5hbWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRjYWxsYWJsZURlc2NyaXB0aW9uID0gJHItPm5hbWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZWlmIChcaXNfb2JqZWN0KCRkaXIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkY2FsbGFibGVEZXNjcmlwdGlvbiA9IFxnZXRfY2xhc3MoJGRpcikgLiAnOjpfX2ludm9rZSc7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkY2FsbGFibGVEZXNjcmlwdGlvbiA9ICdjYWxsYWJsZSc7IC8vIEZhbGxiYWNrIGlmIHdlIGRvbid0IGhhdmUgYSBkZWRpY2F0ZWQgZGVzY3JpcHRpb24KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBAdHJpZ2dlcl9lcnJvcihzcHJpbnRmKCdSZXR1cm5pbmcgYSBmaWxlIHRvIGltcG9ydCBmb3IgQ1NTIG9yIGV4dGVybmFsIHJlZmVyZW5jZXMgaW4gY3VzdG9tIGltcG9ydGVyIGNhbGxhYmxlcyBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIG5vdCBiZSBzdXBwb3J0ZWQgYW55bW9yZSBpbiBTY3NzUGhwIDIuMC4gVGhpcyBiZWhhdmlvciBpcyBub3QgY29tcGxpYW50IHdpdGggdGhlIFNhc3Mgc3BlY2lmaWNhdGlvbi4gVXBkYXRlIHlvdXIgIiVzIiBpbXBvcnRlci4nLCAkY2FsbGFibGVEZXNjcmlwdGlvbiksIEVfVVNFUl9ERVBSRUNBVEVEKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkZmlsZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQoKICAgICAgICBpZiAoIVxpc19udWxsKCRjdXJyZW50RGlyKSkgewogICAgICAgICAgICAkcmVsYXRpdmVQYXRoID0gJHRoaXMtPnJlc29sdmVJbXBvcnRQYXRoKCR1cmwsICRjdXJyZW50RGlyKTsKCiAgICAgICAgICAgIGlmICghXGlzX251bGwoJHJlbGF0aXZlUGF0aCkpIHsKICAgICAgICAgICAgICAgIHJldHVybiAkcmVsYXRpdmVQYXRoOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBmb3JlYWNoICgkdGhpcy0+aW1wb3J0UGF0aHMgYXMgJGRpcikgewogICAgICAgICAgICBpZiAoXGlzX3N0cmluZygkZGlyKSkgewogICAgICAgICAgICAgICAgJHBhdGggPSAkdGhpcy0+cmVzb2x2ZUltcG9ydFBhdGgoJHVybCwgJGRpcik7CgogICAgICAgICAgICAgICAgaWYgKCFcaXNfbnVsbCgkcGF0aCkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHBhdGg7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZWlmIChcaXNfY2FsbGFibGUoJGRpcikpIHsKICAgICAgICAgICAgICAgIC8vIGNoZWNrIGN1c3RvbSBjYWxsYmFjayBmb3IgaW1wb3J0IHBhdGgKICAgICAgICAgICAgICAgICRmaWxlID0gXGNhbGxfdXNlcl9mdW5jKCRkaXIsICR1cmwpOwoKICAgICAgICAgICAgICAgIGlmICghIFxpc19udWxsKCRmaWxlKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkZmlsZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCR0aGlzLT5sZWdhY3lDd2RJbXBvcnRQYXRoKSB7CiAgICAgICAgICAgICRwYXRoID0gJHRoaXMtPnJlc29sdmVJbXBvcnRQYXRoKCR1cmwsIGdldGN3ZCgpKTsKCiAgICAgICAgICAgIGlmICghXGlzX251bGwoJHBhdGgpKSB7CiAgICAgICAgICAgICAgICBAdHJpZ2dlcl9lcnJvcignUmVzb2x2aW5nIGltcG9ydHMgcmVsYXRpdmVseSB0byB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSBpcyBkZXByZWNhdGVkLiBJZiB0aGF0XCdzIHRoZSBpbnRlbmRlZCBiZWhhdmlvciwgdGhlIHZhbHVlIG9mICJnZXRjd2QoKSIgc2hvdWxkIGJlIGFkZGVkIGFzIGFuIGltcG9ydCBwYXRoIGV4cGxpY2l0bHkgaW5zdGVhZC4gSWYgdGhpcyB3YXMgdXNlZCBmb3IgcmVzb2x2aW5nIHJlbGF0aXZlIGltcG9ydHMgb2YgdGhlIGlucHV0IGFsb25nc2lkZSAiY2hkaXIiIHdpdGggdGhlIHNvdXJjZSBkaXJlY3RvcnksIHRoZSBwYXRoIG9mIHRoZSBpbnB1dCBmaWxlIHNob3VsZCBiZSBwYXNzZWQgdG8gImNvbXBpbGVTdHJpbmcoKSIgaW5zdGVhZC4nLCBFX1VTRVJfREVQUkVDQVRFRCk7CgogICAgICAgICAgICAgICAgcmV0dXJuICRwYXRoOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICB0aHJvdyAkdGhpcy0+ZXJyb3IoImAkdXJsYCBmaWxlIG5vdCBmb3VuZCBmb3IgQGltcG9ydCIpOwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIHN0cmluZyAkdXJsCiAgICAgKiBAcGFyYW0gc3RyaW5nICRiYXNlRGlyCiAgICAgKgogICAgICogQHJldHVybiBzdHJpbmd8bnVsbAogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIHJlc29sdmVJbXBvcnRQYXRoKCR1cmwsICRiYXNlRGlyKQogICAgewogICAgICAgICRwYXRoID0gUGF0aDo6am9pbigkYmFzZURpciwgJHVybCk7CgogICAgICAgICRoYXNFeHRlbnNpb24gPSBwcmVnX21hdGNoKCcvLnNbYWNdc3MkLycsICR1cmwpOwoKICAgICAgICBpZiAoJGhhc0V4dGVuc2lvbikgewogICAgICAgICAgICByZXR1cm4gJHRoaXMtPmNoZWNrSW1wb3J0UGF0aENvbmZsaWN0cygkdGhpcy0+dHJ5SW1wb3J0UGF0aCgkcGF0aCkpOwogICAgICAgIH0KCiAgICAgICAgJHJlc3VsdCA9ICR0aGlzLT5jaGVja0ltcG9ydFBhdGhDb25mbGljdHMoJHRoaXMtPnRyeUltcG9ydFBhdGhXaXRoRXh0ZW5zaW9ucygkcGF0aCkpOwoKICAgICAgICBpZiAoIVxpc19udWxsKCRyZXN1bHQpKSB7CiAgICAgICAgICAgIHJldHVybiAkcmVzdWx0OwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICR0aGlzLT50cnlJbXBvcnRQYXRoQXNEaXJlY3RvcnkoJHBhdGgpOwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIHN0cmluZ1tdICRwYXRocwogICAgICoKICAgICAqIEByZXR1cm4gc3RyaW5nfG51bGwKICAgICAqLwogICAgcHJpdmF0ZSBmdW5jdGlvbiBjaGVja0ltcG9ydFBhdGhDb25mbGljdHMoYXJyYXkgJHBhdGhzKQogICAgewogICAgICAgIGlmIChcY291bnQoJHBhdGhzKSA9PT0gMCkgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CgogICAgICAgIGlmIChcY291bnQoJHBhdGhzKSA9PT0gMSkgewogICAgICAgICAgICByZXR1cm4gJHBhdGhzWzBdOwogICAgICAgIH0KCiAgICAgICAgJGZvcm1hdHRlZFByZXR0eVBhdGhzID0gW107CgogICAgICAgIGZvcmVhY2ggKCRwYXRocyBhcyAkcGF0aCkgewogICAgICAgICAgICAkZm9ybWF0dGVkUHJldHR5UGF0aHNbXSA9ICcgICcgLiAkdGhpcy0+Z2V0UHJldHR5UGF0aCgkcGF0aCk7CiAgICAgICAgfQoKICAgICAgICB0aHJvdyAkdGhpcy0+ZXJyb3IoIkl0J3Mgbm90IGNsZWFyIHdoaWNoIGZpbGUgdG8gaW1wb3J0LiBGb3VuZDpcbiIgLiBpbXBsb2RlKCJcbiIsICRmb3JtYXR0ZWRQcmV0dHlQYXRocykpOwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIHN0cmluZyAkcGF0aAogICAgICoKICAgICAqIEByZXR1cm4gc3RyaW5nW10KICAgICAqLwogICAgcHJpdmF0ZSBmdW5jdGlvbiB0cnlJbXBvcnRQYXRoV2l0aEV4dGVuc2lvbnMoJHBhdGgpCiAgICB7CiAgICAgICAgJHJlc3VsdCA9IGFycmF5X21lcmdlKAogICAgICAgICAgICAkdGhpcy0+dHJ5SW1wb3J0UGF0aCgkcGF0aCAuICcuc2FzcycpLAogICAgICAgICAgICAkdGhpcy0+dHJ5SW1wb3J0UGF0aCgkcGF0aCAuICcuc2NzcycpCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCRyZXN1bHQpIHsKICAgICAgICAgICAgcmV0dXJuICRyZXN1bHQ7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJHRoaXMtPnRyeUltcG9ydFBhdGgoJHBhdGggLiAnLmNzcycpOwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIHN0cmluZyAkcGF0aAogICAgICoKICAgICAqIEByZXR1cm4gc3RyaW5nW10KICAgICAqLwogICAgcHJpdmF0ZSBmdW5jdGlvbiB0cnlJbXBvcnRQYXRoKCRwYXRoKQogICAgewogICAgICAgICRwYXJ0aWFsID0gZGlybmFtZSgkcGF0aCkgLiAnL18nIC4gYmFzZW5hbWUoJHBhdGgpOwoKICAgICAgICAkY2FuZGlkYXRlcyA9IFtdOwoKICAgICAgICBpZiAoaXNfZmlsZSgkcGFydGlhbCkpIHsKICAgICAgICAgICAgJGNhbmRpZGF0ZXNbXSA9ICRwYXJ0aWFsOwogICAgICAgIH0KCiAgICAgICAgaWYgKGlzX2ZpbGUoJHBhdGgpKSB7CiAgICAgICAgICAgICRjYW5kaWRhdGVzW10gPSAkcGF0aDsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkY2FuZGlkYXRlczsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSBzdHJpbmcgJHBhdGgKICAgICAqCiAgICAgKiBAcmV0dXJuIHN0cmluZ3xudWxsCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gdHJ5SW1wb3J0UGF0aEFzRGlyZWN0b3J5KCRwYXRoKQogICAgewogICAgICAgIGlmICghaXNfZGlyKCRwYXRoKSkgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkdGhpcy0+Y2hlY2tJbXBvcnRQYXRoQ29uZmxpY3RzKCR0aGlzLT50cnlJbXBvcnRQYXRoV2l0aEV4dGVuc2lvbnMoJHBhdGggLiAnL2luZGV4JykpOwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIHN0cmluZ3xudWxsICRwYXRoCiAgICAgKgogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHJpdmF0ZSBmdW5jdGlvbiBnZXRQcmV0dHlQYXRoKCRwYXRoKQogICAgewogICAgICAgIGlmICgkcGF0aCA9PT0gbnVsbCkgewogICAgICAgICAgICByZXR1cm4gJyh1bmtub3duIGZpbGUpJzsKICAgICAgICB9CgogICAgICAgICRub3JtYWxpemVkUGF0aCA9ICRwYXRoOwogICAgICAgICRub3JtYWxpemVkUm9vdERpcmVjdG9yeSA9ICR0aGlzLT5yb290RGlyZWN0b3J5IC4gJy8nOwoKICAgICAgICBpZiAoXERJUkVDVE9SWV9TRVBBUkFUT1IgPT09ICdcXCcpIHsKICAgICAgICAgICAgJG5vcm1hbGl6ZWRSb290RGlyZWN0b3J5ID0gc3RyX3JlcGxhY2UoJ1xcJywgJy8nLCAkbm9ybWFsaXplZFJvb3REaXJlY3RvcnkpOwogICAgICAgICAgICAkbm9ybWFsaXplZFBhdGggPSBzdHJfcmVwbGFjZSgnXFwnLCAnLycsICRwYXRoKTsKICAgICAgICB9CgogICAgICAgIGlmICgwID09PSBzdHJwb3MoJG5vcm1hbGl6ZWRQYXRoLCAkbm9ybWFsaXplZFJvb3REaXJlY3RvcnkpKSB7CiAgICAgICAgICAgIHJldHVybiBzdWJzdHIoJHBhdGgsIFxzdHJsZW4oJG5vcm1hbGl6ZWRSb290RGlyZWN0b3J5KSk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJHBhdGg7CiAgICB9CgogICAgLyoqCiAgICAgKiBTZXQgZW5jb2RpbmcKICAgICAqCiAgICAgKiBAYXBpCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZ3xudWxsICRlbmNvZGluZwogICAgICoKICAgICAqIEByZXR1cm4gdm9pZAogICAgICoKICAgICAqIEBkZXByZWNhdGVkIE5vbi1jb21wbGlhbnQgc3VwcG9ydCBmb3Igb3RoZXIgZW5jb2RpbmdzIHRoYW4gVVRGLTggaXMgZGVwcmVjYXRlZC4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHNldEVuY29kaW5nKCRlbmNvZGluZykKICAgIHsKICAgICAgICBpZiAoISRlbmNvZGluZyB8fCBzdHJ0b2xvd2VyKCRlbmNvZGluZykgPT09ICd1dGYtOCcpIHsKICAgICAgICAgICAgQHRyaWdnZXJfZXJyb3Ioc3ByaW50ZignVGhlICIlcyIgbWV0aG9kIGlzIGRlcHJlY2F0ZWQuJywgX19NRVRIT0RfXyksIEVfVVNFUl9ERVBSRUNBVEVEKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBAdHJpZ2dlcl9lcnJvcihzcHJpbnRmKCdUaGUgIiVzIiBtZXRob2QgaXMgZGVwcmVjYXRlZC4gUGFyc2luZyB3aWxsIG9ubHkgc3VwcG9ydCBVVEYtOCBpbiBTY3NzUGhwIDIuMC4gVGhlIG5vbi1VVEYtOCBwYXJzaW5nIG9mIFNjc3NQaHAgMS54IGlzIG5vdCBzcGVjIGNvbXBsaWFudC4nLCBfX01FVEhPRF9fKSwgRV9VU0VSX0RFUFJFQ0FURUQpOwogICAgICAgIH0KCiAgICAgICAgJHRoaXMtPmVuY29kaW5nID0gJGVuY29kaW5nOwogICAgfQoKICAgIC8qKgogICAgICogSWdub3JlIGVycm9ycz8KICAgICAqCiAgICAgKiBAYXBpCiAgICAgKgogICAgICogQHBhcmFtIGJvb2wgJGlnbm9yZUVycm9ycwogICAgICoKICAgICAqIEByZXR1cm4gXFNjc3NQaHBcU2Nzc1BocFxDb21waWxlcgogICAgICoKICAgICAqIEBkZXByZWNhdGVkIElnbm9yaW5nIFNhc3MgZXJyb3JzIGlzIG5vdCBsb25nZXIgc3VwcG9ydGVkLgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc2V0SWdub3JlRXJyb3JzKCRpZ25vcmVFcnJvcnMpCiAgICB7CiAgICAgICAgQHRyaWdnZXJfZXJyb3IoJ0lnbm9yaW5nIFNhc3MgZXJyb3JzIGlzIG5vdCBsb25nZXIgc3VwcG9ydGVkLicsIEVfVVNFUl9ERVBSRUNBVEVEKTsKCiAgICAgICAgcmV0dXJuICR0aGlzOwogICAgfQoKICAgIC8qKgogICAgICogR2V0IHNvdXJjZSBwb3NpdGlvbgogICAgICoKICAgICAqIEBhcGkKICAgICAqCiAgICAgKiBAcmV0dXJuIGFycmF5CiAgICAgKgogICAgICogQGRlcHJlY2F0ZWQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldFNvdXJjZVBvc2l0aW9uKCkKICAgIHsKICAgICAgICBAdHJpZ2dlcl9lcnJvcihzcHJpbnRmKCdUaGUgIiVzIiBtZXRob2QgaXMgZGVwcmVjYXRlZC4nLCBfX01FVEhPRF9fKSwgRV9VU0VSX0RFUFJFQ0FURUQpOwoKICAgICAgICAkc291cmNlRmlsZSA9IGlzc2V0KCR0aGlzLT5zb3VyY2VOYW1lc1skdGhpcy0+c291cmNlSW5kZXhdKSA/ICR0aGlzLT5zb3VyY2VOYW1lc1skdGhpcy0+c291cmNlSW5kZXhdIDogJyc7CgogICAgICAgIHJldHVybiBbJHNvdXJjZUZpbGUsICR0aGlzLT5zb3VyY2VMaW5lLCAkdGhpcy0+c291cmNlQ29sdW1uXTsKICAgIH0KCiAgICAvKioKICAgICAqIFRocm93IGVycm9yIChleGNlcHRpb24pCiAgICAgKgogICAgICogQGFwaQogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgJG1zZyBNZXNzYWdlIHdpdGggb3B0aW9uYWwgc3ByaW50ZigpLXN0eWxlIHZhcmFyZyBwYXJhbWV0ZXJzCiAgICAgKgogICAgICogQHJldHVybiBuZXZlcgogICAgICoKICAgICAqIEB0aHJvd3MgXFNjc3NQaHBcU2Nzc1BocFxFeGNlcHRpb25cQ29tcGlsZXJFeGNlcHRpb24KICAgICAqCiAgICAgKiBAZGVwcmVjYXRlZCB1c2UgImVycm9yIiBhbmQgdGhyb3cgdGhlIGV4Y2VwdGlvbiBpbiB0aGUgY2FsbGVyIGluc3RlYWQuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiB0aHJvd0Vycm9yKCRtc2cpCiAgICB7CiAgICAgICAgQHRyaWdnZXJfZXJyb3IoCiAgICAgICAgICAgICdUaGUgbWV0aG9kICJ0aHJvd0Vycm9yIiBpcyBkZXByZWNhdGVkLiBVc2UgImVycm9yIiBhbmQgdGhyb3cgdGhlIGV4Y2VwdGlvbiBpbiB0aGUgY2FsbGVyIGluc3RlYWQnLAogICAgICAgICAgICBFX1VTRVJfREVQUkVDQVRFRAogICAgICAgICk7CgogICAgICAgIHRocm93ICR0aGlzLT5lcnJvciguLi5mdW5jX2dldF9hcmdzKCkpOwogICAgfQoKICAgIC8qKgogICAgICogQnVpbGQgYW4gZXJyb3IgKGV4Y2VwdGlvbikKICAgICAqCiAgICAgKiBAaW50ZXJuYWwKICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICAgICAgICAgICAgICAgICAgICAgJG1zZyBNZXNzYWdlIHdpdGggb3B0aW9uYWwgc3ByaW50ZigpLXN0eWxlIHZhcmFyZyBwYXJhbWV0ZXJzCiAgICAgKiBAcGFyYW0gYm9vbHxmbG9hdHxpbnR8c3RyaW5nfG51bGwgLi4uJGFyZ3MKICAgICAqCiAgICAgKiBAcmV0dXJuIENvbXBpbGVyRXhjZXB0aW9uCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBlcnJvcigkbXNnLCAuLi4kYXJncykKICAgIHsKICAgICAgICBpZiAoJGFyZ3MpIHsKICAgICAgICAgICAgJG1zZyA9IHNwcmludGYoJG1zZywgLi4uJGFyZ3MpOwogICAgICAgIH0KCiAgICAgICAgaWYgKCEgJHRoaXMtPmlnbm9yZUNhbGxTdGFja01lc3NhZ2UpIHsKICAgICAgICAgICAgJG1zZyA9ICR0aGlzLT5hZGRMb2NhdGlvblRvTWVzc2FnZSgkbXNnKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBuZXcgQ29tcGlsZXJFeGNlcHRpb24oJG1zZyk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0gc3RyaW5nICRtc2cKICAgICAqCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIGFkZExvY2F0aW9uVG9NZXNzYWdlKCRtc2cpCiAgICB7CiAgICAgICAgJGxpbmUgICA9ICR0aGlzLT5zb3VyY2VMaW5lOwogICAgICAgICRjb2x1bW4gPSAkdGhpcy0+c291cmNlQ29sdW1uOwoKICAgICAgICAkbG9jID0gaXNzZXQoJHRoaXMtPnNvdXJjZU5hbWVzWyR0aGlzLT5zb3VyY2VJbmRleF0pCiAgICAgICAgICAgID8gJHRoaXMtPmdldFByZXR0eVBhdGgoJHRoaXMtPnNvdXJjZU5hbWVzWyR0aGlzLT5zb3VyY2VJbmRleF0pIC4gIiBvbiBsaW5lICRsaW5lLCBhdCBjb2x1bW4gJGNvbHVtbiIKICAgICAgICAgICAgOiAibGluZTogJGxpbmUsIGNvbHVtbjogJGNvbHVtbiI7CgogICAgICAgICRtc2cgPSAiJG1zZzogJGxvYyI7CgogICAgICAgICRjYWxsU3RhY2tNc2cgPSAkdGhpcy0+Y2FsbFN0YWNrTWVzc2FnZSgpOwoKICAgICAgICBpZiAoJGNhbGxTdGFja01zZykgewogICAgICAgICAgICAkbXNnIC49ICJcbkNhbGwgU3RhY2s6XG4iIC4gJGNhbGxTdGFja01zZzsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkbXNnOwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIHN0cmluZyAkZnVuY3Rpb25OYW1lCiAgICAgKiBAcGFyYW0gYXJyYXkgJEV4cGVjdGVkQXJncwogICAgICogQHBhcmFtIGludCAkbmJBY3R1YWwKICAgICAqIEByZXR1cm4gQ29tcGlsZXJFeGNlcHRpb24KICAgICAqCiAgICAgKiBAZGVwcmVjYXRlZAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZXJyb3JBcmdzTnVtYmVyKCRmdW5jdGlvbk5hbWUsICRFeHBlY3RlZEFyZ3MsICRuYkFjdHVhbCkKICAgIHsKICAgICAgICBAdHJpZ2dlcl9lcnJvcihzcHJpbnRmKCdUaGUgIiVzIiBtZXRob2QgaXMgZGVwcmVjYXRlZC4nLCBfX01FVEhPRF9fKSwgRV9VU0VSX0RFUFJFQ0FURUQpOwoKICAgICAgICAkbmJFeHBlY3RlZCA9IFxjb3VudCgkRXhwZWN0ZWRBcmdzKTsKCiAgICAgICAgaWYgKCRuYkFjdHVhbCA+ICRuYkV4cGVjdGVkKSB7CiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+ZXJyb3IoCiAgICAgICAgICAgICAgICAnRXJyb3I6IE9ubHkgJWQgYXJndW1lbnRzIGFsbG93ZWQgaW4gJXMoKSwgYnV0ICVkIHdlcmUgcGFzc2VkLicsCiAgICAgICAgICAgICAgICAkbmJFeHBlY3RlZCwKICAgICAgICAgICAgICAgICRmdW5jdGlvbk5hbWUsCiAgICAgICAgICAgICAgICAkbmJBY3R1YWwKICAgICAgICAgICAgKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkbWlzc2luZyA9IFtdOwoKICAgICAgICAgICAgd2hpbGUgKGNvdW50KCRFeHBlY3RlZEFyZ3MpICYmIGNvdW50KCRFeHBlY3RlZEFyZ3MpID4gJG5iQWN0dWFsKSB7CiAgICAgICAgICAgICAgICBhcnJheV91bnNoaWZ0KCRtaXNzaW5nLCBhcnJheV9wb3AoJEV4cGVjdGVkQXJncykpOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gJHRoaXMtPmVycm9yKAogICAgICAgICAgICAgICAgJ0Vycm9yOiAlcygpIGFyZ3VtZW50JXMgJXMgbWlzc2luZy4nLAogICAgICAgICAgICAgICAgJGZ1bmN0aW9uTmFtZSwKICAgICAgICAgICAgICAgIGNvdW50KCRtaXNzaW5nKSA+IDEgPyAncycgOiAnJywKICAgICAgICAgICAgICAgIGltcGxvZGUoJywgJywgJG1pc3NpbmcpCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQmVhdXRpZnkgY2FsbCBzdGFjayBmb3Igb3V0cHV0CiAgICAgKgogICAgICogQHBhcmFtIGJvb2wgICAgICRhbGwKICAgICAqIEBwYXJhbSBpbnR8bnVsbCAkbGltaXQKICAgICAqCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gY2FsbFN0YWNrTWVzc2FnZSgkYWxsID0gZmFsc2UsICRsaW1pdCA9IG51bGwpCiAgICB7CiAgICAgICAgJGNhbGxTdGFja01zZyA9IFtdOwogICAgICAgICRuY2FsbCA9IDA7CgogICAgICAgIGlmICgkdGhpcy0+Y2FsbFN0YWNrKSB7CiAgICAgICAgICAgIGZvcmVhY2ggKGFycmF5X3JldmVyc2UoJHRoaXMtPmNhbGxTdGFjaykgYXMgJGNhbGwpIHsKICAgICAgICAgICAgICAgIGlmICgkYWxsIHx8IChpc3NldCgkY2FsbFsnbiddKSAmJiAkY2FsbFsnbiddKSkgewogICAgICAgICAgICAgICAgICAgICRtc2cgPSAnIycgLiAkbmNhbGwrKyAuICcgJyAuICRjYWxsWyduJ10gLiAnICc7CiAgICAgICAgICAgICAgICAgICAgJG1zZyAuPSAoaXNzZXQoJHRoaXMtPnNvdXJjZU5hbWVzWyRjYWxsW1BhcnNlcjo6U09VUkNFX0lOREVYXV0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgPyAkdGhpcy0+Z2V0UHJldHR5UGF0aCgkdGhpcy0+c291cmNlTmFtZXNbJGNhbGxbUGFyc2VyOjpTT1VSQ0VfSU5ERVhdXSkKICAgICAgICAgICAgICAgICAgICAgICAgICA6ICcodW5rbm93biBmaWxlKScpOwogICAgICAgICAgICAgICAgICAgICRtc2cgLj0gJyBvbiBsaW5lICcgLiAkY2FsbFtQYXJzZXI6OlNPVVJDRV9MSU5FXTsKCiAgICAgICAgICAgICAgICAgICAgJGNhbGxTdGFja01zZ1tdID0gJG1zZzsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCEgXGlzX251bGwoJGxpbWl0KSAmJiAkbmNhbGwgPiAkbGltaXQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gaW1wbG9kZSgiXG4iLCAkY2FsbFN0YWNrTXNnKTsKICAgIH0KCiAgICAvKioKICAgICAqIEhhbmRsZSBpbXBvcnQgbG9vcAogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgJG5hbWUKICAgICAqCiAgICAgKiBAcmV0dXJuIHZvaWQKICAgICAqCiAgICAgKiBAdGhyb3dzIFxFeGNlcHRpb24KICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGhhbmRsZUltcG9ydExvb3AoJG5hbWUpCiAgICB7CiAgICAgICAgZm9yICgkZW52ID0gJHRoaXMtPmVudjsgJGVudjsgJGVudiA9ICRlbnYtPnBhcmVudCkgewogICAgICAgICAgICBpZiAoISAkZW52LT5ibG9jaykgewogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRmaWxlID0gJHRoaXMtPnNvdXJjZU5hbWVzWyRlbnYtPmJsb2NrLT5zb3VyY2VJbmRleF07CgogICAgICAgICAgICBpZiAoJGZpbGUgPT09IG51bGwpIHsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAocmVhbHBhdGgoJGZpbGUpID09PSAkbmFtZSkgewogICAgICAgICAgICAgICAgdGhyb3cgJHRoaXMtPmVycm9yKCdBbiBAaW1wb3J0IGxvb3AgaGFzIGJlZW4gZm91bmQ6ICVzIGltcG9ydHMgJXMnLCAkZmlsZSwgYmFzZW5hbWUoJGZpbGUpKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIENhbGwgU0NTUyBAZnVuY3Rpb24KICAgICAqCiAgICAgKiBAcGFyYW0gQ2FsbGFibGVCbG9ja3xudWxsICRmdW5jCiAgICAgKiBAcGFyYW0gYXJyYXkgICAgICAgICAgICAgICRhcmdWYWx1ZXMKICAgICAqCiAgICAgKiBAcmV0dXJuIGFycmF5fE51bWJlcgogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gY2FsbFNjc3NGdW5jdGlvbigkZnVuYywgJGFyZ1ZhbHVlcykKICAgIHsKICAgICAgICBpZiAoISAkZnVuYykgewogICAgICAgICAgICByZXR1cm4gc3RhdGljOjokZGVmYXVsdFZhbHVlOwogICAgICAgIH0KICAgICAgICAkbmFtZSA9ICRmdW5jLT5uYW1lOwoKICAgICAgICAkdGhpcy0+cHVzaEVudigpOwoKICAgICAgICAvLyBzZXQgdGhlIGFyZ3MKICAgICAgICBpZiAoaXNzZXQoJGZ1bmMtPmFyZ3MpKSB7CiAgICAgICAgICAgICR0aGlzLT5hcHBseUFyZ3VtZW50cygkZnVuYy0+YXJncywgJGFyZ1ZhbHVlcyk7CiAgICAgICAgfQoKICAgICAgICAvLyB0aHJvdyBhd2F5IGxpbmVzIGFuZCBjaGlsZHJlbgogICAgICAgICR0bXAgPSBuZXcgT3V0cHV0QmxvY2soKTsKICAgICAgICAkdG1wLT5saW5lcyAgICA9IFtdOwogICAgICAgICR0bXAtPmNoaWxkcmVuID0gW107CgogICAgICAgICR0aGlzLT5lbnYtPm1hcmtlciA9ICdmdW5jdGlvbic7CgogICAgICAgIGlmICghIGVtcHR5KCRmdW5jLT5wYXJlbnRFbnYpKSB7CiAgICAgICAgICAgICR0aGlzLT5lbnYtPmRlY2xhcmF0aW9uU2NvcGVQYXJlbnQgPSAkZnVuYy0+cGFyZW50RW52OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRocm93ICR0aGlzLT5lcnJvcigiQGZ1bmN0aW9uICRuYW1lKCkgd2l0aG91dCBwYXJlbnRFbnYiKTsKICAgICAgICB9CgogICAgICAgICRyZXQgPSAkdGhpcy0+Y29tcGlsZUNoaWxkcmVuKCRmdW5jLT5jaGlsZHJlbiwgJHRtcCwgJHRoaXMtPmVudi0+bWFya2VyIC4gJyAnIC4gJG5hbWUpOwoKICAgICAgICAkdGhpcy0+cG9wRW52KCk7CgogICAgICAgIHJldHVybiAhIGlzc2V0KCRyZXQpID8gc3RhdGljOjokZGVmYXVsdFZhbHVlIDogJHJldDsKICAgIH0KCiAgICAvKioKICAgICAqIENhbGwgYnVpbHQtaW4gYW5kIHJlZ2lzdGVyZWQgKFBIUCkgZnVuY3Rpb25zCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkbmFtZQogICAgICogQHBhcmFtIGNhbGxhYmxlICRmdW5jdGlvbgogICAgICogQHBhcmFtIGFycmF5ICAkcHJvdG90eXBlCiAgICAgKiBAcGFyYW0gYXJyYXkgICRhcmdzCiAgICAgKgogICAgICogQHJldHVybiBhcnJheXxOdW1iZXJ8bnVsbAogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gY2FsbE5hdGl2ZUZ1bmN0aW9uKCRuYW1lLCAkZnVuY3Rpb24sICRwcm90b3R5cGUsICRhcmdzKQogICAgewogICAgICAgICRsaWJOYW1lID0gKGlzX2FycmF5KCRmdW5jdGlvbikgPyBlbmQoJGZ1bmN0aW9uKSA6IG51bGwpOwogICAgICAgICRzb3J0ZWRfa3dhcmdzID0gJHRoaXMtPnNvcnROYXRpdmVGdW5jdGlvbkFyZ3MoJGxpYk5hbWUsICRwcm90b3R5cGUsICRhcmdzKTsKCiAgICAgICAgaWYgKFxpc19udWxsKCRzb3J0ZWRfa3dhcmdzKSkgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgQGxpc3QoJHNvcnRlZCwgJGt3YXJncykgPSAkc29ydGVkX2t3YXJnczsKCiAgICAgICAgaWYgKCRuYW1lICE9PSAnaWYnKSB7CiAgICAgICAgICAgIGZvcmVhY2ggKCRzb3J0ZWQgYXMgJiR2YWwpIHsKICAgICAgICAgICAgICAgIGlmICgkdmFsICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgJHZhbCA9ICR0aGlzLT5yZWR1Y2UoJHZhbCwgdHJ1ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICRyZXR1cm5WYWx1ZSA9IFxjYWxsX3VzZXJfZnVuYygkZnVuY3Rpb24sICRzb3J0ZWQsICRrd2FyZ3MpOwoKICAgICAgICBpZiAoISBpc3NldCgkcmV0dXJuVmFsdWUpKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KCiAgICAgICAgaWYgKFxpc19hcnJheSgkcmV0dXJuVmFsdWUpIHx8ICRyZXR1cm5WYWx1ZSBpbnN0YW5jZW9mIE51bWJlcikgewogICAgICAgICAgICByZXR1cm4gJHJldHVyblZhbHVlOwogICAgICAgIH0KCiAgICAgICAgQHRyaWdnZXJfZXJyb3Ioc3ByaW50ZignUmV0dXJuaW5nIGEgUEhQIHZhbHVlIGZyb20gdGhlICIlcyIgY3VzdG9tIGZ1bmN0aW9uIGlzIGRlcHJlY2F0ZWQuIEEgc2FzcyB2YWx1ZSBtdXN0IGJlIHJldHVybmVkIGluc3RlYWQuJywgJG5hbWUpLCBFX1VTRVJfREVQUkVDQVRFRCk7CgogICAgICAgIHJldHVybiAkdGhpcy0+Y29lcmNlVmFsdWUoJHJldHVyblZhbHVlKTsKICAgIH0KCiAgICAvKioKICAgICAqIEdldCBidWlsdC1pbiBmdW5jdGlvbgogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgJG5hbWUgTm9ybWFsaXplZCBuYW1lCiAgICAgKgogICAgICogQHJldHVybiBhcnJheQogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0QnVpbHRpbkZ1bmN0aW9uKCRuYW1lKQogICAgewogICAgICAgICRsaWJOYW1lID0gc2VsZjo6bm9ybWFsaXplTmF0aXZlRnVuY3Rpb25OYW1lKCRuYW1lKTsKICAgICAgICByZXR1cm4gWyR0aGlzLCAkbGliTmFtZV07CiAgICB9CgogICAgLyoqCiAgICAgKiBOb3JtYWxpemUgbmF0aXZlIGZ1bmN0aW9uIG5hbWUKICAgICAqCiAgICAgKiBAaW50ZXJuYWwKICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lCiAgICAgKgogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBub3JtYWxpemVOYXRpdmVGdW5jdGlvbk5hbWUoJG5hbWUpCiAgICB7CiAgICAgICAgJG5hbWUgPSBzdHJfcmVwbGFjZSgiLSIsICJfIiwgJG5hbWUpOwogICAgICAgICRsaWJOYW1lID0gJ2xpYicgLiBwcmVnX3JlcGxhY2VfY2FsbGJhY2soCiAgICAgICAgICAgICcvXyguKS8nLAogICAgICAgICAgICBmdW5jdGlvbiAoJG0pIHsKICAgICAgICAgICAgICAgIHJldHVybiB1Y2ZpcnN0KCRtWzFdKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgdWNmaXJzdCgkbmFtZSkKICAgICAgICApOwogICAgICAgIHJldHVybiAkbGliTmFtZTsKICAgIH0KCiAgICAvKioKICAgICAqIENoZWNrIGlmIGEgZnVuY3Rpb24gaXMgYSBuYXRpdmUgYnVpbHQtaW4gc2NzcyBmdW5jdGlvbiwgZm9yIGNzcyBwYXJzaW5nCiAgICAgKgogICAgICogQGludGVybmFsCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkbmFtZQogICAgICoKICAgICAqIEByZXR1cm4gYm9vbAogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGlzTmF0aXZlRnVuY3Rpb24oJG5hbWUpCiAgICB7CiAgICAgICAgcmV0dXJuIG1ldGhvZF9leGlzdHMoQ29tcGlsZXI6OmNsYXNzLCBzZWxmOjpub3JtYWxpemVOYXRpdmVGdW5jdGlvbk5hbWUoJG5hbWUpKTsKICAgIH0KCiAgICAvKioKICAgICAqIFNvcnRzIGtleXdvcmQgYXJndW1lbnRzCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkZnVuY3Rpb25OYW1lCiAgICAgKiBAcGFyYW0gYXJyYXl8bnVsbCAgJHByb3RvdHlwZXMKICAgICAqIEBwYXJhbSBhcnJheSAgJGFyZ3MKICAgICAqCiAgICAgKiBAcmV0dXJuIGFycmF5fG51bGwKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIHNvcnROYXRpdmVGdW5jdGlvbkFyZ3MoJGZ1bmN0aW9uTmFtZSwgJHByb3RvdHlwZXMsICRhcmdzKQogICAgewogICAgICAgIGlmICghIGlzc2V0KCRwcm90b3R5cGVzKSkgewogICAgICAgICAgICAka2V5QXJncyA9IFtdOwogICAgICAgICAgICAkcG9zQXJncyA9IFtdOwoKICAgICAgICAgICAgaWYgKFxpc19hcnJheSgkYXJncykgJiYgXGNvdW50KCRhcmdzKSAmJiBcZW5kKCRhcmdzKSA9PT0gc3RhdGljOjokbnVsbCkgewogICAgICAgICAgICAgICAgYXJyYXlfcG9wKCRhcmdzKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gc2VwYXJhdGUgcG9zaXRpb25hbCBhbmQga2V5d29yZCBhcmd1bWVudHMKICAgICAgICAgICAgZm9yZWFjaCAoJGFyZ3MgYXMgJGFyZykgewogICAgICAgICAgICAgICAgbGlzdCgka2V5LCAkdmFsdWUpID0gJGFyZzsKCiAgICAgICAgICAgICAgICBpZiAoZW1wdHkoJGtleSkgb3IgZW1wdHkoJGtleVsxXSkpIHsKICAgICAgICAgICAgICAgICAgICAkcG9zQXJnc1tdID0gZW1wdHkoJGFyZ1syXSkgPyAkdmFsdWUgOiAkYXJnOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAka2V5QXJnc1ska2V5WzFdXSA9ICR2YWx1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIFskcG9zQXJncywgJGtleUFyZ3NdOwogICAgICAgIH0KCiAgICAgICAgLy8gc3BlY2lmaWMgY2FzZXMgPwogICAgICAgIGlmIChcaW5fYXJyYXkoJGZ1bmN0aW9uTmFtZSwgWydsaWJSZ2InLCAnbGliUmdiYScsICdsaWJIc2wnLCAnbGliSHNsYSddKSkgewogICAgICAgICAgICAvLyBub3RhdGlvbiAxMDAgMTI3IDI1NSAvIDAgaXMgaW4gZmFjdCBhIHNpbXBsZSBsaXN0IG9mIDQgdmFsdWVzCiAgICAgICAgICAgIGZvcmVhY2ggKCRhcmdzIGFzICRrID0+ICRhcmcpIHsKICAgICAgICAgICAgICAgIGlmICghaXNzZXQoJGFyZ1sxXSkpIHsKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8gVGhpcyBoYXBwZW5zIHdoZW4gdXNpbmcgYSB0cmFpbGluZyBjb21tYQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCRhcmdbMV1bMF0gPT09IFR5cGU6OlRfTElTVCAmJiBcY291bnQoJGFyZ1sxXVsyXSkgPT09IDMpIHsKICAgICAgICAgICAgICAgICAgICAkYXJnc1ska11bMV1bMl0gPSAkdGhpcy0+ZXh0cmFjdFNsYXNoQWxwaGFJbkNvbG9yRnVuY3Rpb24oJGFyZ1sxXVsyXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGxpc3QoJHBvc2l0aW9uYWxBcmdzLCAkbmFtZWRBcmdzLCAkbmFtZXMsICRzZXBhcmF0b3IsICRoYXNTcGxhdCkgPSAkdGhpcy0+ZXZhbHVhdGVBcmd1bWVudHMoJGFyZ3MsIGZhbHNlKTsKCiAgICAgICAgaWYgKCEgXGlzX2FycmF5KHJlc2V0KCRwcm90b3R5cGVzKSkpIHsKICAgICAgICAgICAgJHByb3RvdHlwZXMgPSBbJHByb3RvdHlwZXNdOwogICAgICAgIH0KCiAgICAgICAgJHBhcnNlZFByb3RvdHlwZXMgPSBhcnJheV9tYXAoWyR0aGlzLCAncGFyc2VGdW5jdGlvblByb3RvdHlwZSddLCAkcHJvdG90eXBlcyk7CiAgICAgICAgYXNzZXJ0KCFlbXB0eSgkcGFyc2VkUHJvdG90eXBlcykpOwogICAgICAgICRtYXRjaGVkUHJvdG90eXBlID0gJHRoaXMtPnNlbGVjdEZ1bmN0aW9uUHJvdG90eXBlKCRwYXJzZWRQcm90b3R5cGVzLCBcY291bnQoJHBvc2l0aW9uYWxBcmdzKSwgJG5hbWVzKTsKCiAgICAgICAgJHRoaXMtPnZlcmlmeVByb3RvdHlwZSgkbWF0Y2hlZFByb3RvdHlwZSwgXGNvdW50KCRwb3NpdGlvbmFsQXJncyksICRuYW1lcywgJGhhc1NwbGF0KTsKCiAgICAgICAgJHZhcnMgPSAkdGhpcy0+YXBwbHlBcmd1bWVudHNUb0RlY2xhcmF0aW9uKCRtYXRjaGVkUHJvdG90eXBlLCAkcG9zaXRpb25hbEFyZ3MsICRuYW1lZEFyZ3MsICRzZXBhcmF0b3IpOwoKICAgICAgICAkZmluYWxBcmdzID0gW107CiAgICAgICAgJGtleUFyZ3MgPSBbXTsKCiAgICAgICAgZm9yZWFjaCAoJG1hdGNoZWRQcm90b3R5cGVbJ2FyZ3VtZW50cyddIGFzICRhcmd1bWVudCkgewogICAgICAgICAgICBsaXN0KCRub3JtYWxpemVkTmFtZSwgJG9yaWdpbmFsTmFtZSwgJGRlZmF1bHQpID0gJGFyZ3VtZW50OwoKICAgICAgICAgICAgaWYgKGlzc2V0KCR2YXJzWyRub3JtYWxpemVkTmFtZV0pKSB7CiAgICAgICAgICAgICAgICAkdmFsdWUgPSAkdmFyc1skbm9ybWFsaXplZE5hbWVdOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJHZhbHVlID0gJGRlZmF1bHQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHNwZWNpYWwgbnVsbCB2YWx1ZSBhcyBkZWZhdWx0OiB0cmFuc2xhdGUgdG8gcmVhbCBudWxsIGhlcmUKICAgICAgICAgICAgaWYgKCR2YWx1ZSA9PT0gW1R5cGU6OlRfS0VZV09SRCwgJ251bGwnXSkgewogICAgICAgICAgICAgICAgJHZhbHVlID0gbnVsbDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJGZpbmFsQXJnc1tdID0gJHZhbHVlOwogICAgICAgICAgICAka2V5QXJnc1skb3JpZ2luYWxOYW1lXSA9ICR2YWx1ZTsKICAgICAgICB9CgogICAgICAgIGlmICgkbWF0Y2hlZFByb3RvdHlwZVsncmVzdF9hcmd1bWVudCddICE9PSBudWxsKSB7CiAgICAgICAgICAgICR2YWx1ZSA9ICR2YXJzWyRtYXRjaGVkUHJvdG90eXBlWydyZXN0X2FyZ3VtZW50J11dOwoKICAgICAgICAgICAgJGZpbmFsQXJnc1tdID0gJHZhbHVlOwogICAgICAgICAgICAka2V5QXJnc1skbWF0Y2hlZFByb3RvdHlwZVsncmVzdF9hcmd1bWVudCddXSA9ICR2YWx1ZTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBbJGZpbmFsQXJncywgJGtleUFyZ3NdOwogICAgfQoKICAgIC8qKgogICAgICogUGFyc2VzIGEgZnVuY3Rpb24gcHJvdG90eXBlIHRvIHRoZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiBvZiBhcmd1bWVudHMuCiAgICAgKgogICAgICogVGhlIGlucHV0IGlzIGFuIGFycmF5IG9mIHN0cmluZ3MgZGVzY3JpYmluZyBlYWNoIGFyZ3VtZW50LCBhcyBzdXBwb3J0ZWQKICAgICAqIGluIHtAc2VlIHJlZ2lzdGVyRnVuY3Rpb259LiBBcmd1bWVudCBuYW1lcyBkb24ndCBpbmNsdWRlIHRoZSBgJGAuCiAgICAgKiBUaGUgb3V0cHV0IGNvbnRhaW5zIHRoZSBsaXN0IG9mIHBvc2l0aW9uYWwgYXJndW1lbnQsIHdpdGggdGhlaXIgbm9ybWFsaXplZAogICAgICogbmFtZSAodW5kZXJzY29yZXMgYXJlIHJlcGxhY2VkIGJ5IGRhc2hlcyksIHRoZWlyIG9yaWdpbmFsIG5hbWUgKHRvIGJlIHVzZWQKICAgICAqIGluIGNhc2Ugb2YgZXJyb3IgcmVwb3J0aW5nKSBhbmQgdGhlaXIgZGVmYXVsdCB2YWx1ZS4gVGhlIG91dHB1dCBhbHNvIGNvbnRhaW5zCiAgICAgKiB0aGUgbm9ybWFsaXplZCBuYW1lIG9mIHRoZSByZXN0IGFyZ3VtZW50LCBvciBudWxsIGlmIHRoZSBmdW5jdGlvbiBwcm90b3R5cGUKICAgICAqIGlzIG5vdCB2YXJpYWRpYy4KICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nW10gJHByb3RvdHlwZQogICAgICoKICAgICAqIEByZXR1cm4gYXJyYXkKICAgICAqIEBwaHBzdGFuLXJldHVybiBhcnJheXthcmd1bWVudHM6IGxpc3Q8YXJyYXl7MDogc3RyaW5nLCAxOiBzdHJpbmcsIDI6IGFycmF5fE51bWJlcnxudWxsfT4sIHJlc3RfYXJndW1lbnQ6IHN0cmluZ3xudWxsfQogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIHBhcnNlRnVuY3Rpb25Qcm90b3R5cGUoYXJyYXkgJHByb3RvdHlwZSkKICAgIHsKICAgICAgICBzdGF0aWMgJHBhcnNlciA9IG51bGw7CgogICAgICAgICRhcmd1bWVudHMgPSBbXTsKICAgICAgICAkcmVzdEFyZ3VtZW50ID0gbnVsbDsKCiAgICAgICAgZm9yZWFjaCAoJHByb3RvdHlwZSBhcyAkcCkgewogICAgICAgICAgICBpZiAobnVsbCAhPT0gJHJlc3RBcmd1bWVudCkgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ1RoZSBhcmd1bWVudCBkZWNsYXJhdGlvbiBpcyBpbnZhbGlkLiBUaGUgcmVzdCBhcmd1bWVudCBtdXN0IGJlIHRoZSBsYXN0IG9uZS4nKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJGRlZmF1bHQgPSBudWxsOwogICAgICAgICAgICAkcCA9IGV4cGxvZGUoJzonLCAkcCwgMik7CiAgICAgICAgICAgICRuYW1lID0gc3RyX3JlcGxhY2UoJ18nLCAnLScsICRwWzBdKTsKCiAgICAgICAgICAgIGlmIChpc3NldCgkcFsxXSkpIHsKICAgICAgICAgICAgICAgICRkZWZhdWx0U291cmNlID0gdHJpbSgkcFsxXSk7CgogICAgICAgICAgICAgICAgaWYgKCRkZWZhdWx0U291cmNlID09PSAnbnVsbCcpIHsKICAgICAgICAgICAgICAgICAgICAvLyBkaWZmZXJlbnRpYXRlIHRoaXMgbnVsbCBmcm9tIHRoZSBzdGF0aWM6OiRudWxsCiAgICAgICAgICAgICAgICAgICAgJGRlZmF1bHQgPSBbVHlwZTo6VF9LRVlXT1JELCAnbnVsbCddOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBpZiAoXGlzX251bGwoJHBhcnNlcikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJHBhcnNlciA9ICR0aGlzLT5wYXJzZXJGYWN0b3J5KF9fTUVUSE9EX18pOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgJHBhcnNlci0+cGFyc2VWYWx1ZSgkZGVmYXVsdFNvdXJjZSwgJGRlZmF1bHQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoc3Vic3RyKCRuYW1lLCAtMykgPT09ICcuLi4nKSB7CiAgICAgICAgICAgICAgICAkcmVzdEFyZ3VtZW50ID0gc3Vic3RyKCRuYW1lLCAwLCAtMyk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkYXJndW1lbnRzW10gPSBbJG5hbWUsICRwWzBdLCAkZGVmYXVsdF07CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiBbCiAgICAgICAgICAgICdhcmd1bWVudHMnID0+ICRhcmd1bWVudHMsCiAgICAgICAgICAgICdyZXN0X2FyZ3VtZW50JyA9PiAkcmVzdEFyZ3VtZW50LAogICAgICAgIF07CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBmdW5jdGlvbiBwcm90b3R5cGUgZm9yIHRoZSBnaXZlbiBwb3NpdGlvbmFsIGFuZCBuYW1lZCBhcmd1bWVudHMuCiAgICAgKgogICAgICogSWYgbm8gZXhhY3QgbWF0Y2ggaXMgZm91bmQsIGZpbmRzIHRoZSBjbG9zZXN0IGFwcHJveGltYXRpb24uIE5vdGUgdGhhdCB0aGlzCiAgICAgKiBkb2Vzbid0IGd1YXJhbnRlZSB0aGF0ICRwb3NpdGlvbmFsIGFuZCAkbmFtZXMgYXJlIHZhbGlkIGZvciB0aGUgcmV0dXJuZWQKICAgICAqIHByb3RvdHlwZS4KICAgICAqCiAgICAgKiBAcGFyYW0gYXJyYXlbXSAgICAgICAgICAgICAgICRwcm90b3R5cGVzCiAgICAgKiBAcGFyYW0gaW50ICAgICAgICAgICAgICAgICAgICRwb3NpdGlvbmFsCiAgICAgKiBAcGFyYW0gYXJyYXk8c3RyaW5nLCBzdHJpbmc+ICRuYW1lcyBBIHNldCBvZiBuYW1lcywgYXMgYm90aCBrZXlzIGFuZCB2YWx1ZXMKICAgICAqCiAgICAgKiBAcmV0dXJuIGFycmF5CiAgICAgKgogICAgICogQHBocHN0YW4tcGFyYW0gbm9uLWVtcHR5LWFycmF5PGFycmF5e2FyZ3VtZW50czogbGlzdDxhcnJheXswOiBzdHJpbmcsIDE6IHN0cmluZywgMjogYXJyYXl8TnVtYmVyfG51bGx9PiwgcmVzdF9hcmd1bWVudDogc3RyaW5nfG51bGx9PiAkcHJvdG90eXBlcwogICAgICogQHBocHN0YW4tcmV0dXJuIGFycmF5e2FyZ3VtZW50czogbGlzdDxhcnJheXswOiBzdHJpbmcsIDE6IHN0cmluZywgMjogYXJyYXl8TnVtYmVyfG51bGx9PiwgcmVzdF9hcmd1bWVudDogc3RyaW5nfG51bGx9CiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gc2VsZWN0RnVuY3Rpb25Qcm90b3R5cGUoYXJyYXkgJHByb3RvdHlwZXMsICRwb3NpdGlvbmFsLCBhcnJheSAkbmFtZXMpCiAgICB7CiAgICAgICAgJGZ1enp5TWF0Y2ggPSBudWxsOwogICAgICAgICRtaW5NaXNtYXRjaERpc3RhbmNlID0gbnVsbDsKCiAgICAgICAgZm9yZWFjaCAoJHByb3RvdHlwZXMgYXMgJHByb3RvdHlwZSkgewogICAgICAgICAgICAvLyBJZGVhbGx5LCBmaW5kIGFuIGV4YWN0IG1hdGNoLgogICAgICAgICAgICBpZiAoJHRoaXMtPmNoZWNrUHJvdG90eXBlTWF0Y2hlcygkcHJvdG90eXBlLCAkcG9zaXRpb25hbCwgJG5hbWVzKSkgewogICAgICAgICAgICAgICAgcmV0dXJuICRwcm90b3R5cGU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRtaXNtYXRjaERpc3RhbmNlID0gXGNvdW50KCRwcm90b3R5cGVbJ2FyZ3VtZW50cyddKSAtICRwb3NpdGlvbmFsOwoKICAgICAgICAgICAgaWYgKCRtaW5NaXNtYXRjaERpc3RhbmNlICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICBpZiAoYWJzKCRtaXNtYXRjaERpc3RhbmNlKSA+IGFicygkbWluTWlzbWF0Y2hEaXN0YW5jZSkpIHsKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBJZiB0d28gb3ZlcmxvYWRzIGhhdmUgdGhlIHNhbWUgbWlzbWF0Y2ggZGlzdGFuY2UsIGZhdm9yIHRoZSBvdmVybG9hZAogICAgICAgICAgICAgICAgLy8gdGhhdCBoYXMgbW9yZSBhcmd1bWVudHMuCiAgICAgICAgICAgICAgICBpZiAoYWJzKCRtaXNtYXRjaERpc3RhbmNlKSA9PT0gYWJzKCRtaW5NaXNtYXRjaERpc3RhbmNlKSAmJiAkbWlzbWF0Y2hEaXN0YW5jZSA8IDApIHsKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgJG1pbk1pc21hdGNoRGlzdGFuY2UgPSAkbWlzbWF0Y2hEaXN0YW5jZTsKICAgICAgICAgICAgJGZ1enp5TWF0Y2ggPSAkcHJvdG90eXBlOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRmdXp6eU1hdGNoOwogICAgfQoKICAgIC8qKgogICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGFyZ3VtZW50IGludm9jYXRpb24gbWF0Y2hlcyB0aGUgY2FsbGFibGUgcHJvdG90eXBlLgogICAgICoKICAgICAqIFRoZSBydWxlcyBhcmUgc2ltaWxhciB0byB7QHNlZSB2ZXJpZnlQcm90b3R5cGV9LiBUaGUgYm9vbGVhbiByZXR1cm4gdmFsdWUKICAgICAqIGF2b2lkcyB0aGUgb3ZlcmhlYWQgb2YgYnVpbGRpbmcgYW5kIGNhdGNoaW5nIGV4Y2VwdGlvbnMgd2hlbiB0aGUgcmVhc29uIG9mCiAgICAgKiBub3QgbWF0Y2hpbmcgdGhlIHByb3RvdHlwZSBkb2VzIG5vdCBuZWVkIHRvIGJlIGtub3duLgogICAgICoKICAgICAqIEBwYXJhbSBhcnJheSAgICAgICAgICAgICAgICAgJHByb3RvdHlwZQogICAgICogQHBhcmFtIGludCAgICAgICAgICAgICAgICAgICAkcG9zaXRpb25hbAogICAgICogQHBhcmFtIGFycmF5PHN0cmluZywgc3RyaW5nPiAkbmFtZXMKICAgICAqCiAgICAgKiBAcmV0dXJuIGJvb2wKICAgICAqCiAgICAgKiBAcGhwc3Rhbi1wYXJhbSBhcnJheXthcmd1bWVudHM6IGxpc3Q8YXJyYXl7MDogc3RyaW5nLCAxOiBzdHJpbmcsIDI6IGFycmF5fE51bWJlcnxudWxsfT4sIHJlc3RfYXJndW1lbnQ6IHN0cmluZ3xudWxsfSAkcHJvdG90eXBlCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gY2hlY2tQcm90b3R5cGVNYXRjaGVzKGFycmF5ICRwcm90b3R5cGUsICRwb3NpdGlvbmFsLCBhcnJheSAkbmFtZXMpCiAgICB7CiAgICAgICAgJG5hbWVVc2VkID0gMDsKCiAgICAgICAgZm9yZWFjaCAoJHByb3RvdHlwZVsnYXJndW1lbnRzJ10gYXMgJGkgPT4gJGFyZ3VtZW50KSB7CiAgICAgICAgICAgIGxpc3QgKCRuYW1lLCAkb3JpZ2luYWxOYW1lLCAkZGVmYXVsdCkgPSAkYXJndW1lbnQ7CgogICAgICAgICAgICBpZiAoJGkgPCAkcG9zaXRpb25hbCkgewogICAgICAgICAgICAgICAgaWYgKGlzc2V0KCRuYW1lc1skbmFtZV0pKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2VpZiAoaXNzZXQoJG5hbWVzWyRuYW1lXSkpIHsKICAgICAgICAgICAgICAgICRuYW1lVXNlZCsrOwogICAgICAgICAgICB9IGVsc2VpZiAoJGRlZmF1bHQgPT09IG51bGwpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCRwcm90b3R5cGVbJ3Jlc3RfYXJndW1lbnQnXSAhPT0gbnVsbCkgewogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CgogICAgICAgIGlmICgkcG9zaXRpb25hbCA+IFxjb3VudCgkcHJvdG90eXBlWydhcmd1bWVudHMnXSkpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgaWYgKCRuYW1lVXNlZCA8IFxjb3VudCgkbmFtZXMpKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CgogICAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIC8qKgogICAgICogVmVyaWZpZXMgdGhhdCB0aGUgYXJndW1lbnQgaW52b2NhdGlvbiBpcyB2YWxpZCBmb3IgdGhlIGNhbGxhYmxlIHByb3RvdHlwZS4KICAgICAqCiAgICAgKiBAcGFyYW0gYXJyYXkgICAgICAgICAgICAgICAgICRwcm90b3R5cGUKICAgICAqIEBwYXJhbSBpbnQgICAgICAgICAgICAgICAgICAgJHBvc2l0aW9uYWwKICAgICAqIEBwYXJhbSBhcnJheTxzdHJpbmcsIHN0cmluZz4gJG5hbWVzCiAgICAgKiBAcGFyYW0gYm9vbCAgICAgICAgICAgICAgICAgICRoYXNTcGxhdAogICAgICoKICAgICAqIEByZXR1cm4gdm9pZAogICAgICoKICAgICAqIEB0aHJvd3MgU2Fzc1NjcmlwdEV4Y2VwdGlvbgogICAgICoKICAgICAqIEBwaHBzdGFuLXBhcmFtIGFycmF5e2FyZ3VtZW50czogbGlzdDxhcnJheXswOiBzdHJpbmcsIDE6IHN0cmluZywgMjogYXJyYXl8TnVtYmVyfG51bGx9PiwgcmVzdF9hcmd1bWVudDogc3RyaW5nfG51bGx9ICRwcm90b3R5cGUKICAgICAqLwogICAgcHJpdmF0ZSBmdW5jdGlvbiB2ZXJpZnlQcm90b3R5cGUoYXJyYXkgJHByb3RvdHlwZSwgJHBvc2l0aW9uYWwsIGFycmF5ICRuYW1lcywgJGhhc1NwbGF0KQogICAgewogICAgICAgICRuYW1lVXNlZCA9IDA7CgogICAgICAgIGZvcmVhY2ggKCRwcm90b3R5cGVbJ2FyZ3VtZW50cyddIGFzICRpID0+ICRhcmd1bWVudCkgewogICAgICAgICAgICBsaXN0ICgkbmFtZSwgJG9yaWdpbmFsTmFtZSwgJGRlZmF1bHQpID0gJGFyZ3VtZW50OwoKICAgICAgICAgICAgaWYgKCRpIDwgJHBvc2l0aW9uYWwpIHsKICAgICAgICAgICAgICAgIGlmIChpc3NldCgkbmFtZXNbJG5hbWVdKSkgewogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTYXNzU2NyaXB0RXhjZXB0aW9uKHNwcmludGYoJ0FyZ3VtZW50ICQlcyB3YXMgcGFzc2VkIGJvdGggYnkgcG9zaXRpb24gYW5kIGJ5IG5hbWUuJywgJG9yaWdpbmFsTmFtZSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2VpZiAoaXNzZXQoJG5hbWVzWyRuYW1lXSkpIHsKICAgICAgICAgICAgICAgICRuYW1lVXNlZCsrOwogICAgICAgICAgICB9IGVsc2VpZiAoJGRlZmF1bHQgPT09IG51bGwpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBTYXNzU2NyaXB0RXhjZXB0aW9uKHNwcmludGYoJ01pc3NpbmcgYXJndW1lbnQgJCVzJywgJG9yaWdpbmFsTmFtZSkpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoJHByb3RvdHlwZVsncmVzdF9hcmd1bWVudCddICE9PSBudWxsKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIGlmICgkcG9zaXRpb25hbCA+IFxjb3VudCgkcHJvdG90eXBlWydhcmd1bWVudHMnXSkpIHsKICAgICAgICAgICAgJG1lc3NhZ2UgPSBzcHJpbnRmKAogICAgICAgICAgICAgICAgJ09ubHkgJWQgJXNhcmd1bWVudCVzIGFsbG93ZWQsIGJ1dCAlZCAlcyBwYXNzZWQuJywKICAgICAgICAgICAgICAgIFxjb3VudCgkcHJvdG90eXBlWydhcmd1bWVudHMnXSksCiAgICAgICAgICAgICAgICBlbXB0eSgkbmFtZXMpID8gJycgOiAncG9zaXRpb25hbCAnLAogICAgICAgICAgICAgICAgXGNvdW50KCRwcm90b3R5cGVbJ2FyZ3VtZW50cyddKSA9PT0gMSA/ICcnIDogJ3MnLAogICAgICAgICAgICAgICAgJHBvc2l0aW9uYWwsCiAgICAgICAgICAgICAgICAkcG9zaXRpb25hbCA9PT0gMSA/ICd3YXMnIDogJ3dlcmUnCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICghJGhhc1NwbGF0KSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2Fzc1NjcmlwdEV4Y2VwdGlvbigkbWVzc2FnZSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRtZXNzYWdlID0gJHRoaXMtPmFkZExvY2F0aW9uVG9NZXNzYWdlKCRtZXNzYWdlKTsKICAgICAgICAgICAgJG1lc3NhZ2UgLj0gIlxuVGhpcyB3aWxsIGJlIGFuIGVycm9yIGluIGZ1dHVyZSB2ZXJzaW9ucyBvZiBTYXNzLiI7CiAgICAgICAgICAgICR0aGlzLT5sb2dnZXItPndhcm4oJG1lc3NhZ2UsIHRydWUpOwogICAgICAgIH0KCiAgICAgICAgaWYgKCRuYW1lVXNlZCA8IFxjb3VudCgkbmFtZXMpKSB7CiAgICAgICAgICAgICR1bmtub3duTmFtZXMgPSBhcnJheV92YWx1ZXMoYXJyYXlfZGlmZigkbmFtZXMsIGFycmF5X2NvbHVtbigkcHJvdG90eXBlWydhcmd1bWVudHMnXSwgMCkpKTsKICAgICAgICAgICAgJGxhc3ROYW1lID0gYXJyYXlfcG9wKCR1bmtub3duTmFtZXMpOwogICAgICAgICAgICAkbWVzc2FnZSA9IHNwcmludGYoCiAgICAgICAgICAgICAgICAnTm8gYXJndW1lbnQlcyBuYW1lZCAkJXMlcy4nLAogICAgICAgICAgICAgICAgJHVua25vd25OYW1lcyA/ICdzJyA6ICcnLAogICAgICAgICAgICAgICAgJHVua25vd25OYW1lcyA/IGltcGxvZGUoJywgJCcsICR1bmtub3duTmFtZXMpIC4gJyBvciAkJyA6ICcnLAogICAgICAgICAgICAgICAgJGxhc3ROYW1lCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHRocm93IG5ldyBTYXNzU2NyaXB0RXhjZXB0aW9uKCRtZXNzYWdlKTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBFdmFsdWF0ZXMgdGhlIGFyZ3VtZW50IGZyb20gdGhlIGludm9jYXRpb24uCiAgICAgKgogICAgICogVGhpcyByZXR1cm5zIHNldmVyYWwgdGhpbmdzIGFib3V0IHRoaXMgaW52b2NhdGlvbjoKICAgICAqIC0gdGhlIGxpc3Qgb2YgcG9zaXRpb25hbCBhcmd1bWVudHMKICAgICAqIC0gdGhlIG1hcCBvZiBuYW1lZCBhcmd1bWVudHMsIGluZGV4ZWQgYnkgbm9ybWFsaXplZCBuYW1lcwogICAgICogLSB0aGUgc2V0IG9mIG5hbWVzIHVzZWQgaW4gdGhlIGFyZ3VtZW50cyAodGhhdCdzIGFuIGFycmF5IHVzaW5nIHRoZSBub3JtYWxpemVkIG5hbWVzIGFzIGtleXMgZm9yIE8oMSkgYWNjZXNzKQogICAgICogLSB0aGUgc2VwYXJhdG9yIHVzZWQgYnkgdGhlIGxpc3QgdXNpbmcgdGhlIHNwbGF0IG9wZXJhdG9yLCBpZiBhbnkKICAgICAqIC0gYSBib29sZWFuIGluZGljYXRvciB3aGV0aGVyIGFueSBzcGxhdCBhcmd1bWVudCAobGlzdCBvciBtYXApIHdhcyB1c2VkLCB0byBzdXBwb3J0IHRoZSBpbmNvbXBsZXRlIGVycm9yIHJlcG9ydGluZy4KICAgICAqCiAgICAgKiBAcGFyYW0gYXJyYXlbXSAkYXJncwogICAgICogQHBhcmFtIGJvb2wgICAgJHJlZHVjZSBXaGV0aGVyIGFyZ3VtZW50cyBzaG91bGQgYmUgcmVkdWNlZCB0byB0aGVpciB2YWx1ZQogICAgICoKICAgICAqIEByZXR1cm4gYXJyYXkKICAgICAqCiAgICAgKiBAdGhyb3dzIFNhc3NTY3JpcHRFeGNlcHRpb24KICAgICAqCiAgICAgKiBAcGhwc3Rhbi1yZXR1cm4gYXJyYXl7MDogbGlzdDxhcnJheXxOdW1iZXI+LCAxOiBhcnJheTxzdHJpbmcsIGFycmF5fE51bWJlcj4sIDI6IGFycmF5PHN0cmluZywgc3RyaW5nPiwgMzogc3RyaW5nfG51bGwsIDQ6IGJvb2x9CiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gZXZhbHVhdGVBcmd1bWVudHMoYXJyYXkgJGFyZ3MsICRyZWR1Y2UgPSB0cnVlKQogICAgewogICAgICAgIC8vIHRoaXMgcmVwcmVzZW50cyB0cmFpbGluZyBjb21tYXMKICAgICAgICBpZiAoXGNvdW50KCRhcmdzKSAmJiBlbmQoJGFyZ3MpID09PSBzdGF0aWM6OiRudWxsKSB7CiAgICAgICAgICAgIGFycmF5X3BvcCgkYXJncyk7CiAgICAgICAgfQoKICAgICAgICAkc3BsYXRTZXBhcmF0b3IgPSBudWxsOwogICAgICAgICRrZXl3b3JkQXJncyA9IFtdOwogICAgICAgICRuYW1lcyA9IFtdOwogICAgICAgICRwb3NpdGlvbmFsQXJncyA9IFtdOwogICAgICAgICRoYXNLZXl3b3JkQXJndW1lbnQgPSBmYWxzZTsKICAgICAgICAkaGFzU3BsYXQgPSBmYWxzZTsKCiAgICAgICAgZm9yZWFjaCAoJGFyZ3MgYXMgJGFyZykgewogICAgICAgICAgICBpZiAoIWVtcHR5KCRhcmdbMF0pKSB7CiAgICAgICAgICAgICAgICAkaGFzS2V5d29yZEFyZ3VtZW50ID0gdHJ1ZTsKCiAgICAgICAgICAgICAgICBhc3NlcnQoXGlzX3N0cmluZygkYXJnWzBdWzFdKSk7CiAgICAgICAgICAgICAgICAkbmFtZSA9IHN0cl9yZXBsYWNlKCdfJywgJy0nLCAkYXJnWzBdWzFdKTsKCiAgICAgICAgICAgICAgICBpZiAoaXNzZXQoJGtleXdvcmRBcmdzWyRuYW1lXSkpIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2Fzc1NjcmlwdEV4Y2VwdGlvbihzcHJpbnRmKCdEdXBsaWNhdGUgbmFtZWQgYXJndW1lbnQgJCVzLicsICRhcmdbMF1bMV0pKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAka2V5d29yZEFyZ3NbJG5hbWVdID0gJHRoaXMtPm1heWJlUmVkdWNlKCRyZWR1Y2UsICRhcmdbMV0pOwogICAgICAgICAgICAgICAgJG5hbWVzWyRuYW1lXSA9ICRuYW1lOwogICAgICAgICAgICB9IGVsc2VpZiAoISBlbXB0eSgkYXJnWzJdKSkgewogICAgICAgICAgICAgICAgLy8gJGFyZ1syXSBtZWFucyBhIHZhciBmb2xsb3dlZCBieSAuLi4gaW4gdGhlIGFyZyAoJGxpc3QuLi4gKQogICAgICAgICAgICAgICAgJHZhbCA9ICR0aGlzLT5yZWR1Y2UoJGFyZ1sxXSwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAkaGFzU3BsYXQgPSB0cnVlOwoKICAgICAgICAgICAgICAgIGlmICgkdmFsWzBdID09PSBUeXBlOjpUX0xJU1QpIHsKICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICgkdmFsWzJdIGFzICRpdGVtKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcaXNfbnVsbCgkc3BsYXRTZXBhcmF0b3IpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc3BsYXRTZXBhcmF0b3IgPSAkdmFsWzFdOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAkcG9zaXRpb25hbEFyZ3NbXSA9ICR0aGlzLT5tYXliZVJlZHVjZSgkcmVkdWNlLCAkaXRlbSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBpZiAoaXNzZXQoJHZhbFszXSkgJiYgXGlzX2FycmF5KCR2YWxbM10pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKCR2YWxbM10gYXMgJG5hbWUgPT4gJGl0ZW0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydChcaXNfc3RyaW5nKCRuYW1lKSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJG5vcm1hbGl6ZWROYW1lID0gc3RyX3JlcGxhY2UoJ18nLCAnLScsICRuYW1lKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNzZXQoJGtleXdvcmRBcmdzWyRub3JtYWxpemVkTmFtZV0pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNhc3NTY3JpcHRFeGNlcHRpb24oc3ByaW50ZignRHVwbGljYXRlIG5hbWVkIGFyZ3VtZW50ICQlcy4nLCAkbmFtZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRrZXl3b3JkQXJnc1skbm9ybWFsaXplZE5hbWVdID0gJHRoaXMtPm1heWJlUmVkdWNlKCRyZWR1Y2UsICRpdGVtKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRuYW1lc1skbm9ybWFsaXplZE5hbWVdID0gJG5vcm1hbGl6ZWROYW1lOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGhhc0tleXdvcmRBcmd1bWVudCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2VpZiAoJHZhbFswXSA9PT0gVHlwZTo6VF9NQVApIHsKICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICgkdmFsWzFdIGFzICRpID0+ICRuYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRuYW1lID0gJHRoaXMtPmNvbXBpbGVTdHJpbmdDb250ZW50KCR0aGlzLT5jb2VyY2VTdHJpbmcoJG5hbWUpKTsKICAgICAgICAgICAgICAgICAgICAgICAgJGl0ZW0gPSAkdmFsWzJdWyRpXTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIGlzX251bWVyaWMoJG5hbWUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbm9ybWFsaXplZE5hbWUgPSBzdHJfcmVwbGFjZSgnXycsICctJywgJG5hbWUpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc3NldCgka2V5d29yZEFyZ3NbJG5vcm1hbGl6ZWROYW1lXSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2Fzc1NjcmlwdEV4Y2VwdGlvbihzcHJpbnRmKCdEdXBsaWNhdGUgbmFtZWQgYXJndW1lbnQgJCVzLicsICRuYW1lKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGtleXdvcmRBcmdzWyRub3JtYWxpemVkTmFtZV0gPSAkdGhpcy0+bWF5YmVSZWR1Y2UoJHJlZHVjZSwgJGl0ZW0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJG5hbWVzWyRub3JtYWxpemVkTmFtZV0gPSAkbm9ybWFsaXplZE5hbWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaGFzS2V5d29yZEFyZ3VtZW50ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcaXNfbnVsbCgkc3BsYXRTZXBhcmF0b3IpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNwbGF0U2VwYXJhdG9yID0gJHZhbFsxXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcG9zaXRpb25hbEFyZ3NbXSA9ICR0aGlzLT5tYXliZVJlZHVjZSgkcmVkdWNlLCAkaXRlbSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2VpZiAoJHZhbFswXSAhPT0gVHlwZTo6VF9OVUxMKSB7IC8vIHZhbHVlcyBvdGhlciB0aGFuIG51bGwgYXJlIHRyZWF0ZWQgYSBzaW5nbGUtZWxlbWVudCBsaXN0cywgd2hpbGUgbnVsbCBpcyB0aGUgZW1wdHkgbGlzdAogICAgICAgICAgICAgICAgICAgICRwb3NpdGlvbmFsQXJnc1tdID0gJHRoaXMtPm1heWJlUmVkdWNlKCRyZWR1Y2UsICR2YWwpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2VpZiAoJGhhc0tleXdvcmRBcmd1bWVudCkgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNhc3NTY3JpcHRFeGNlcHRpb24oJ1Bvc2l0aW9uYWwgYXJndW1lbnRzIG11c3QgY29tZSBiZWZvcmUga2V5d29yZCBhcmd1bWVudHMuJyk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkcG9zaXRpb25hbEFyZ3NbXSA9ICR0aGlzLT5tYXliZVJlZHVjZSgkcmVkdWNlLCAkYXJnWzFdKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIFskcG9zaXRpb25hbEFyZ3MsICRrZXl3b3JkQXJncywgJG5hbWVzLCAkc3BsYXRTZXBhcmF0b3IsICRoYXNTcGxhdF07CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0gYm9vbCAgICAgICAgICRyZWR1Y2UKICAgICAqIEBwYXJhbSBhcnJheXxOdW1iZXIgJHZhbHVlCiAgICAgKgogICAgICogQHJldHVybiBhcnJheXxOdW1iZXIKICAgICAqLwogICAgcHJpdmF0ZSBmdW5jdGlvbiBtYXliZVJlZHVjZSgkcmVkdWNlLCAkdmFsdWUpCiAgICB7CiAgICAgICAgaWYgKCRyZWR1Y2UpIHsKICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5yZWR1Y2UoJHZhbHVlLCB0cnVlKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkdmFsdWU7CiAgICB9CgogICAgLyoqCiAgICAgKiBBcHBseSBhcmd1bWVudCB2YWx1ZXMgcGVyIGRlZmluaXRpb24KICAgICAqCiAgICAgKiBAcGFyYW0gYXJyYXlbXSAgICAkYXJnRGVmCiAgICAgKiBAcGFyYW0gYXJyYXl8bnVsbCAkYXJnVmFsdWVzCiAgICAgKiBAcGFyYW0gYm9vbCAgICAgICAkc3RvcmVJbkVudgogICAgICogQHBhcmFtIGJvb2wgICAgICAgJHJlZHVjZSAgICAgb25seSB1c2VkIGlmICRzdG9yZUluRW52ID0gZmFsc2UKICAgICAqCiAgICAgKiBAcmV0dXJuIGFycmF5PHN0cmluZywgYXJyYXl8TnVtYmVyPgogICAgICoKICAgICAqIEBwaHBzdGFuLXBhcmFtIGxpc3Q8YXJyYXl7MDogc3RyaW5nLCAxOiBhcnJheXxOdW1iZXJ8bnVsbCwgMjogYm9vbH0+ICRhcmdEZWYKICAgICAqCiAgICAgKiBAdGhyb3dzIFxFeGNlcHRpb24KICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGFwcGx5QXJndW1lbnRzKCRhcmdEZWYsICRhcmdWYWx1ZXMsICRzdG9yZUluRW52ID0gdHJ1ZSwgJHJlZHVjZSA9IHRydWUpCiAgICB7CiAgICAgICAgJG91dHB1dCA9IFtdOwoKICAgICAgICBpZiAoXGlzX251bGwoJGFyZ1ZhbHVlcykpIHsKICAgICAgICAgICAgJGFyZ1ZhbHVlcyA9IFtdOwogICAgICAgIH0KCiAgICAgICAgaWYgKCRzdG9yZUluRW52KSB7CiAgICAgICAgICAgICRzdG9yZUVudiA9ICR0aGlzLT5nZXRTdG9yZUVudigpOwoKICAgICAgICAgICAgJGVudiA9IG5ldyBFbnZpcm9ubWVudCgpOwogICAgICAgICAgICAkZW52LT5zdG9yZSA9ICRzdG9yZUVudi0+c3RvcmU7CiAgICAgICAgfQoKICAgICAgICAkcHJvdG90eXBlID0gWydhcmd1bWVudHMnID0+IFtdLCAncmVzdF9hcmd1bWVudCcgPT4gbnVsbF07CiAgICAgICAgJG9yaWdpbmFsUmVzdEFyZ3VtZW50TmFtZSA9IG51bGw7CgogICAgICAgIGZvcmVhY2ggKCRhcmdEZWYgYXMgJGFyZykgewogICAgICAgICAgICBsaXN0KCRuYW1lLCAkZGVmYXVsdCwgJGlzVmFyaWFibGUpID0gJGFyZzsKICAgICAgICAgICAgJG5vcm1hbGl6ZWROYW1lID0gc3RyX3JlcGxhY2UoJ18nLCAnLScsICRuYW1lKTsKCiAgICAgICAgICAgIGlmICgkaXNWYXJpYWJsZSkgewogICAgICAgICAgICAgICAgJG9yaWdpbmFsUmVzdEFyZ3VtZW50TmFtZSA9ICRuYW1lOwogICAgICAgICAgICAgICAgJHByb3RvdHlwZVsncmVzdF9hcmd1bWVudCddID0gJG5vcm1hbGl6ZWROYW1lOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJHByb3RvdHlwZVsnYXJndW1lbnRzJ11bXSA9IFskbm9ybWFsaXplZE5hbWUsICRuYW1lLCAhZW1wdHkoJGRlZmF1bHQpID8gJGRlZmF1bHQgOiBudWxsXTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgbGlzdCgkcG9zaXRpb25hbEFyZ3MsICRuYW1lZEFyZ3MsICRuYW1lcywgJHNwbGF0U2VwYXJhdG9yLCAkaGFzU3BsYXQpID0gJHRoaXMtPmV2YWx1YXRlQXJndW1lbnRzKCRhcmdWYWx1ZXMsICRyZWR1Y2UpOwoKICAgICAgICAkdGhpcy0+dmVyaWZ5UHJvdG90eXBlKCRwcm90b3R5cGUsIFxjb3VudCgkcG9zaXRpb25hbEFyZ3MpLCAkbmFtZXMsICRoYXNTcGxhdCk7CgogICAgICAgICR2YXJzID0gJHRoaXMtPmFwcGx5QXJndW1lbnRzVG9EZWNsYXJhdGlvbigkcHJvdG90eXBlLCAkcG9zaXRpb25hbEFyZ3MsICRuYW1lZEFyZ3MsICRzcGxhdFNlcGFyYXRvcik7CgogICAgICAgIGZvcmVhY2ggKCRwcm90b3R5cGVbJ2FyZ3VtZW50cyddIGFzICRhcmd1bWVudCkgewogICAgICAgICAgICBsaXN0KCRub3JtYWxpemVkTmFtZSwgJG5hbWUpID0gJGFyZ3VtZW50OwoKICAgICAgICAgICAgaWYgKCFpc3NldCgkdmFyc1skbm9ybWFsaXplZE5hbWVdKSkgewogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICR2YWwgPSAkdmFyc1skbm9ybWFsaXplZE5hbWVdOwoKICAgICAgICAgICAgaWYgKCRzdG9yZUluRW52KSB7CiAgICAgICAgICAgICAgICAkdGhpcy0+c2V0KCRuYW1lLCAkdGhpcy0+cmVkdWNlKCR2YWwsIHRydWUpLCB0cnVlLCAkZW52KTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICRvdXRwdXRbJG5hbWVdID0gKCRyZWR1Y2UgPyAkdGhpcy0+cmVkdWNlKCR2YWwsIHRydWUpIDogJHZhbCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICgkcHJvdG90eXBlWydyZXN0X2FyZ3VtZW50J10gIT09IG51bGwpIHsKICAgICAgICAgICAgYXNzZXJ0KCRvcmlnaW5hbFJlc3RBcmd1bWVudE5hbWUgIT09IG51bGwpOwogICAgICAgICAgICAkbmFtZSA9ICRvcmlnaW5hbFJlc3RBcmd1bWVudE5hbWU7CiAgICAgICAgICAgICR2YWwgPSAkdmFyc1skcHJvdG90eXBlWydyZXN0X2FyZ3VtZW50J11dOwoKICAgICAgICAgICAgaWYgKCRzdG9yZUluRW52KSB7CiAgICAgICAgICAgICAgICAkdGhpcy0+c2V0KCRuYW1lLCAkdGhpcy0+cmVkdWNlKCR2YWwsIHRydWUpLCB0cnVlLCAkZW52KTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICRvdXRwdXRbJG5hbWVdID0gKCRyZWR1Y2UgPyAkdGhpcy0+cmVkdWNlKCR2YWwsIHRydWUpIDogJHZhbCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICgkc3RvcmVJbkVudikgewogICAgICAgICAgICAkc3RvcmVFbnYtPnN0b3JlID0gJGVudi0+c3RvcmU7CiAgICAgICAgfQoKICAgICAgICBmb3JlYWNoICgkcHJvdG90eXBlWydhcmd1bWVudHMnXSBhcyAkYXJndW1lbnQpIHsKICAgICAgICAgICAgbGlzdCgkbm9ybWFsaXplZE5hbWUsICRuYW1lLCAkZGVmYXVsdCkgPSAkYXJndW1lbnQ7CgogICAgICAgICAgICBpZiAoaXNzZXQoJHZhcnNbJG5vcm1hbGl6ZWROYW1lXSkpIHsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGFzc2VydCgkZGVmYXVsdCAhPT0gbnVsbCk7CgogICAgICAgICAgICBpZiAoJHN0b3JlSW5FbnYpIHsKICAgICAgICAgICAgICAgICR0aGlzLT5zZXQoJG5hbWUsICR0aGlzLT5yZWR1Y2UoJGRlZmF1bHQsIHRydWUpLCB0cnVlKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICRvdXRwdXRbJG5hbWVdID0gKCRyZWR1Y2UgPyAkdGhpcy0+cmVkdWNlKCRkZWZhdWx0LCB0cnVlKSA6ICRkZWZhdWx0KTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRvdXRwdXQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBBcHBseSBhcmd1bWVudCB2YWx1ZXMgcGVyIGRlZmluaXRpb24uCiAgICAgKgogICAgICogVGhpcyBtZXRob2QgYXNzdW1lcyB0aGF0IHRoZSBhcmd1bWVudHMgYXJlIHZhbGlkIGZvciB0aGUgcHJvdmlkZWQgcHJvdG90eXBlLgogICAgICogVGhlIHZhbGlkYXRpb24gd2l0aCB7QHNlZSB2ZXJpZnlQcm90b3R5cGV9IG11c3QgaGF2ZSBiZWVuIHJ1biBiZWZvcmUgY2FsbGluZwogICAgICogaXQuCiAgICAgKiBBcmd1bWVudHMgYXJlIHJldHVybmVkIGFzIGEgbWFwIGZyb20gdGhlIG5vcm1hbGl6ZWQgYXJndW1lbnQgbmFtZXMgdG8gdGhlCiAgICAgKiB2YWx1ZS4gQWRkaXRpb25hbCBhcmd1bWVudHMgYXJlIGNvbGxlY3RlZCBpbiBhIHNhc3MgYXJndW1lbnQgbGlzdCBhdmFpbGFibGUKICAgICAqIHVuZGVyIHRoZSBuYW1lIG9mIHRoZSByZXN0IGFyZ3VtZW50IGluIHRoZSByZXN1bHQuCiAgICAgKgogICAgICogRGVmYXVsdHMgYXJlIG5vdCBhcHBsaWVkIGFzIHRoZXkgYXJlIHJlc29sdmVkIGluIGEgZGlmZmVyZW50IGVudmlyb25tZW50LgogICAgICoKICAgICAqIEBwYXJhbSBhcnJheSAgICAgICAgICAgICAgICAgICAgICAgJHByb3RvdHlwZQogICAgICogQHBhcmFtIGFycmF5PGFycmF5fE51bWJlcj4gICAgICAgICAkcG9zaXRpb25hbEFyZ3MKICAgICAqIEBwYXJhbSBhcnJheTxzdHJpbmcsIGFycmF5fE51bWJlcj4gJG5hbWVkQXJncwogICAgICogQHBhcmFtIHN0cmluZ3xudWxsICAgICAgICAgICAgICAgICAkc3BsYXRTZXBhcmF0b3IKICAgICAqCiAgICAgKiBAcmV0dXJuIGFycmF5PHN0cmluZywgYXJyYXl8TnVtYmVyPgogICAgICoKICAgICAqIEBwaHBzdGFuLXBhcmFtIGFycmF5e2FyZ3VtZW50czogbGlzdDxhcnJheXswOiBzdHJpbmcsIDE6IHN0cmluZywgMjogYXJyYXl8TnVtYmVyfG51bGx9PiwgcmVzdF9hcmd1bWVudDogc3RyaW5nfG51bGx9ICRwcm90b3R5cGUKICAgICAqLwogICAgcHJpdmF0ZSBmdW5jdGlvbiBhcHBseUFyZ3VtZW50c1RvRGVjbGFyYXRpb24oYXJyYXkgJHByb3RvdHlwZSwgYXJyYXkgJHBvc2l0aW9uYWxBcmdzLCBhcnJheSAkbmFtZWRBcmdzLCAkc3BsYXRTZXBhcmF0b3IpCiAgICB7CiAgICAgICAgJG91dHB1dCA9IFtdOwogICAgICAgICRtaW5MZW5ndGggPSBtaW4oXGNvdW50KCRwb3NpdGlvbmFsQXJncyksIFxjb3VudCgkcHJvdG90eXBlWydhcmd1bWVudHMnXSkpOwoKICAgICAgICBmb3IgKCRpID0gMDsgJGkgPCAkbWluTGVuZ3RoOyAkaSsrKSB7CiAgICAgICAgICAgIGxpc3QoJG5hbWUpID0gJHByb3RvdHlwZVsnYXJndW1lbnRzJ11bJGldOwogICAgICAgICAgICAkdmFsID0gJHBvc2l0aW9uYWxBcmdzWyRpXTsKCiAgICAgICAgICAgICRvdXRwdXRbJG5hbWVdID0gJHZhbDsKICAgICAgICB9CgogICAgICAgICRyZXN0TmFtZWQgPSAkbmFtZWRBcmdzOwoKICAgICAgICBmb3IgKCRpID0gXGNvdW50KCRwb3NpdGlvbmFsQXJncyk7ICRpIDwgXGNvdW50KCRwcm90b3R5cGVbJ2FyZ3VtZW50cyddKTsgJGkrKykgewogICAgICAgICAgICAkYXJndW1lbnQgPSAkcHJvdG90eXBlWydhcmd1bWVudHMnXVskaV07CiAgICAgICAgICAgIGxpc3QoJG5hbWUpID0gJGFyZ3VtZW50OwoKICAgICAgICAgICAgaWYgKGlzc2V0KCRuYW1lZEFyZ3NbJG5hbWVdKSkgewogICAgICAgICAgICAgICAgJHZhbCA9ICRuYW1lZEFyZ3NbJG5hbWVdOwogICAgICAgICAgICAgICAgdW5zZXQoJHJlc3ROYW1lZFskbmFtZV0pOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRvdXRwdXRbJG5hbWVdID0gJHZhbDsKICAgICAgICB9CgogICAgICAgIGlmICgkcHJvdG90eXBlWydyZXN0X2FyZ3VtZW50J10gIT09IG51bGwpIHsKICAgICAgICAgICAgJG5hbWUgPSAkcHJvdG90eXBlWydyZXN0X2FyZ3VtZW50J107CiAgICAgICAgICAgICRyZXN0ID0gYXJyYXlfdmFsdWVzKGFycmF5X3NsaWNlKCRwb3NpdGlvbmFsQXJncywgXGNvdW50KCRwcm90b3R5cGVbJ2FyZ3VtZW50cyddKSkpOwoKICAgICAgICAgICAgJHZhbCA9IFtUeXBlOjpUX0xJU1QsIFxpc19udWxsKCRzcGxhdFNlcGFyYXRvcikgPyAnLCcgOiAkc3BsYXRTZXBhcmF0b3IgLCAkcmVzdCwgJHJlc3ROYW1lZF07CgogICAgICAgICAgICAkb3V0cHV0WyRuYW1lXSA9ICR2YWw7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJG91dHB1dDsKICAgIH0KCiAgICAvKioKICAgICAqIENvZXJjZSBhIHBocCB2YWx1ZSBpbnRvIGEgc2NzcyBvbmUKICAgICAqCiAgICAgKiBAcGFyYW0gbWl4ZWQgJHZhbHVlCiAgICAgKgogICAgICogQHJldHVybiBhcnJheXxOdW1iZXIKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGNvZXJjZVZhbHVlKCR2YWx1ZSkKICAgIHsKICAgICAgICBpZiAoXGlzX2FycmF5KCR2YWx1ZSkgfHwgJHZhbHVlIGluc3RhbmNlb2YgTnVtYmVyKSB7CiAgICAgICAgICAgIHJldHVybiAkdmFsdWU7CiAgICAgICAgfQoKICAgICAgICBpZiAoXGlzX2Jvb2woJHZhbHVlKSkgewogICAgICAgICAgICByZXR1cm4gJHRoaXMtPnRvQm9vbCgkdmFsdWUpOwogICAgICAgIH0KCiAgICAgICAgaWYgKFxpc19udWxsKCR2YWx1ZSkpIHsKICAgICAgICAgICAgcmV0dXJuIHN0YXRpYzo6JG51bGw7CiAgICAgICAgfQoKICAgICAgICBpZiAoXGlzX2ludCgkdmFsdWUpIHx8IFxpc19mbG9hdCgkdmFsdWUpKSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgTnVtYmVyKCR2YWx1ZSwgJycpOwogICAgICAgIH0KCiAgICAgICAgaWYgKGlzX251bWVyaWMoJHZhbHVlKSkgewogICAgICAgICAgICByZXR1cm4gbmV3IE51bWJlcigoZmxvYXQpICR2YWx1ZSwgJycpOwogICAgICAgIH0KCiAgICAgICAgaWYgKCR2YWx1ZSA9PT0gJycpIHsKICAgICAgICAgICAgcmV0dXJuIHN0YXRpYzo6JGVtcHR5U3RyaW5nOwogICAgICAgIH0KCiAgICAgICAgJHZhbHVlID0gW1R5cGU6OlRfS0VZV09SRCwgJHZhbHVlXTsKICAgICAgICAkY29sb3IgPSAkdGhpcy0+Y29lcmNlQ29sb3IoJHZhbHVlKTsKCiAgICAgICAgaWYgKCRjb2xvcikgewogICAgICAgICAgICByZXR1cm4gJGNvbG9yOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICR2YWx1ZTsKICAgIH0KCiAgICAvKioKICAgICAqIFRyaWVzIHRvIGNvbnZlcnQgYW4gaXRlbSB0byBhIFNhc3MgbWFwCiAgICAgKgogICAgICogQHBhcmFtIE51bWJlcnxhcnJheSAkaXRlbQogICAgICoKICAgICAqIEByZXR1cm4gYXJyYXl8bnVsbAogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIHRyeU1hcCgkaXRlbSkKICAgIHsKICAgICAgICBpZiAoJGl0ZW0gaW5zdGFuY2VvZiBOdW1iZXIpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQoKICAgICAgICBpZiAoJGl0ZW1bMF0gPT09IFR5cGU6OlRfTUFQKSB7CiAgICAgICAgICAgIHJldHVybiAkaXRlbTsKICAgICAgICB9CgogICAgICAgIGlmICgKICAgICAgICAgICAgJGl0ZW1bMF0gPT09IFR5cGU6OlRfTElTVCAmJgogICAgICAgICAgICAkaXRlbVsyXSA9PT0gW10KICAgICAgICApIHsKICAgICAgICAgICAgcmV0dXJuIHN0YXRpYzo6JGVtcHR5TWFwOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9CgogICAgLyoqCiAgICAgKiBDb2VyY2Ugc29tZXRoaW5nIHRvIG1hcAogICAgICoKICAgICAqIEBwYXJhbSBhcnJheXxOdW1iZXIgJGl0ZW0KICAgICAqCiAgICAgKiBAcmV0dXJuIGFycmF5fE51bWJlcgogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gY29lcmNlTWFwKCRpdGVtKQogICAgewogICAgICAgICRtYXAgPSAkdGhpcy0+dHJ5TWFwKCRpdGVtKTsKCiAgICAgICAgaWYgKCRtYXAgIT09IG51bGwpIHsKICAgICAgICAgICAgcmV0dXJuICRtYXA7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJGl0ZW07CiAgICB9CgogICAgLyoqCiAgICAgKiBDb2VyY2Ugc29tZXRoaW5nIHRvIGxpc3QKICAgICAqCiAgICAgKiBAcGFyYW0gYXJyYXl8TnVtYmVyICRpdGVtCiAgICAgKiBAcGFyYW0gc3RyaW5nICAgICAgICRkZWxpbQogICAgICogQHBhcmFtIGJvb2wgICAgICAgICAkcmVtb3ZlVHJhaWxpbmdOdWxsCiAgICAgKgogICAgICogQHJldHVybiBhcnJheQogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gY29lcmNlTGlzdCgkaXRlbSwgJGRlbGltID0gJywnLCAkcmVtb3ZlVHJhaWxpbmdOdWxsID0gZmFsc2UpCiAgICB7CiAgICAgICAgaWYgKCRpdGVtIGluc3RhbmNlb2YgTnVtYmVyKSB7CiAgICAgICAgICAgIHJldHVybiBbVHlwZTo6VF9MSVNULCAnJywgWyRpdGVtXV07CiAgICAgICAgfQoKICAgICAgICBpZiAoJGl0ZW1bMF0gPT09IFR5cGU6OlRfTElTVCkgewogICAgICAgICAgICAvLyByZW1vdmUgdHJhaWxpbmcgbnVsbCBmcm9tIHRoZSBsaXN0CiAgICAgICAgICAgIGlmICgkcmVtb3ZlVHJhaWxpbmdOdWxsICYmIGVuZCgkaXRlbVsyXSkgPT09IHN0YXRpYzo6JG51bGwpIHsKICAgICAgICAgICAgICAgIGFycmF5X3BvcCgkaXRlbVsyXSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiAkaXRlbTsKICAgICAgICB9CgogICAgICAgIGlmICgkaXRlbVswXSA9PT0gVHlwZTo6VF9NQVApIHsKICAgICAgICAgICAgJGtleXMgPSAkaXRlbVsxXTsKICAgICAgICAgICAgJHZhbHVlcyA9ICRpdGVtWzJdOwogICAgICAgICAgICAkbGlzdCA9IFtdOwoKICAgICAgICAgICAgZm9yICgkaSA9IDAsICRzID0gXGNvdW50KCRrZXlzKTsgJGkgPCAkczsgJGkrKykgewogICAgICAgICAgICAgICAgJGtleSA9ICRrZXlzWyRpXTsKICAgICAgICAgICAgICAgICR2YWx1ZSA9ICR2YWx1ZXNbJGldOwoKICAgICAgICAgICAgICAgICRsaXN0W10gPSBbCiAgICAgICAgICAgICAgICAgICAgVHlwZTo6VF9MSVNULAogICAgICAgICAgICAgICAgICAgICcgJywKICAgICAgICAgICAgICAgICAgICBbJGtleSwgJHZhbHVlXQogICAgICAgICAgICAgICAgXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIFtUeXBlOjpUX0xJU1QsICRsaXN0ID8gJywnIDogJycsICRsaXN0XTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBbVHlwZTo6VF9MSVNULCAnJywgWyRpdGVtXV07CiAgICB9CgogICAgLyoqCiAgICAgKiBDb2VyY2UgY29sb3IgZm9yIGV4cHJlc3Npb24KICAgICAqCiAgICAgKiBAcGFyYW0gYXJyYXl8TnVtYmVyICR2YWx1ZQogICAgICoKICAgICAqIEByZXR1cm4gYXJyYXl8TnVtYmVyCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBjb2VyY2VGb3JFeHByZXNzaW9uKCR2YWx1ZSkKICAgIHsKICAgICAgICBpZiAoJGNvbG9yID0gJHRoaXMtPmNvZXJjZUNvbG9yKCR2YWx1ZSkpIHsKICAgICAgICAgICAgcmV0dXJuICRjb2xvcjsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkdmFsdWU7CiAgICB9CgogICAgLyoqCiAgICAgKiBDb2VyY2UgdmFsdWUgdG8gY29sb3IKICAgICAqCiAgICAgKiBAcGFyYW0gYXJyYXl8TnVtYmVyICR2YWx1ZQogICAgICogQHBhcmFtIGJvb2wgICAgICAgICAkaW5SR0JGdW5jdGlvbgogICAgICoKICAgICAqIEByZXR1cm4gYXJyYXl8bnVsbAogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gY29lcmNlQ29sb3IoJHZhbHVlLCAkaW5SR0JGdW5jdGlvbiA9IGZhbHNlKQogICAgewogICAgICAgIGlmICgkdmFsdWUgaW5zdGFuY2VvZiBOdW1iZXIpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQoKICAgICAgICBzd2l0Y2ggKCR2YWx1ZVswXSkgewogICAgICAgICAgICBjYXNlIFR5cGU6OlRfQ09MT1I6CiAgICAgICAgICAgICAgICBmb3IgKCRpID0gMTsgJGkgPD0gMzsgJGkrKykgewogICAgICAgICAgICAgICAgICAgIGlmICghIGlzX251bWVyaWMoJHZhbHVlWyRpXSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJGN2ID0gJHRoaXMtPmNvbXBpbGVSR0JBVmFsdWUoJHZhbHVlWyRpXSk7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoISBpc19udW1lcmljKCRjdikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAkdmFsdWVbJGldID0gJGN2OwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKGlzc2V0KCR2YWx1ZVs0XSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEgaXNfbnVtZXJpYygkdmFsdWVbNF0pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkY3YgPSAkdGhpcy0+Y29tcGlsZVJHQkFWYWx1ZSgkdmFsdWVbNF0sIHRydWUpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIGlzX251bWVyaWMoJGN2KSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICR2YWx1ZVs0XSA9ICRjdjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gJHZhbHVlOwoKICAgICAgICAgICAgY2FzZSBUeXBlOjpUX0xJU1Q6CiAgICAgICAgICAgICAgICBpZiAoJGluUkdCRnVuY3Rpb24pIHsKICAgICAgICAgICAgICAgICAgICBpZiAoXGNvdW50KCR2YWx1ZVsyXSkgPT0gMyB8fCBcY291bnQoJHZhbHVlWzJdKSA9PSA0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRjb2xvciA9ICR2YWx1ZVsyXTsKICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXlfdW5zaGlmdCgkY29sb3IsIFR5cGU6OlRfQ09MT1IpOwoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5jb2VyY2VDb2xvcigkY29sb3IpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKCiAgICAgICAgICAgIGNhc2UgVHlwZTo6VF9LRVlXT1JEOgogICAgICAgICAgICAgICAgaWYgKCEgXGlzX3N0cmluZygkdmFsdWVbMV0pKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJG5hbWUgPSBzdHJ0b2xvd2VyKCR2YWx1ZVsxXSk7CgogICAgICAgICAgICAgICAgLy8gaGV4YSBjb2xvcj8KICAgICAgICAgICAgICAgIGlmIChwcmVnX21hdGNoKCcvXiMoWzAtOWEtZl0rKSQvaScsICRuYW1lLCAkbSkpIHsKICAgICAgICAgICAgICAgICAgICAkbm9mVmFsdWVzID0gXHN0cmxlbigkbVsxXSk7CgogICAgICAgICAgICAgICAgICAgIGlmIChcaW5fYXJyYXkoJG5vZlZhbHVlcywgWzMsIDQsIDYsIDhdKSkgewogICAgICAgICAgICAgICAgICAgICAgICAkbmJDaGFubmVscyA9IDM7CiAgICAgICAgICAgICAgICAgICAgICAgICRjb2xvciAgICAgID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICRudW0gICAgICAgID0gaGV4ZGVjKCRtWzFdKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoJG5vZlZhbHVlcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRuYkNoYW5uZWxzID0gNDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGVuIGNvbnRpbnVpbmcgd2l0aCB0aGUgY2FzZSAzOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoJGkgPSAwOyAkaSA8ICRuYkNoYW5uZWxzOyAkaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0ID0gJG51bSAmIDB4ZjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXlfdW5zaGlmdCgkY29sb3IsICR0IDw8IDQgfCAkdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRudW0gPj49IDQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDg6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJG5iQ2hhbm5lbHMgPSA0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZW4gY29udGludWluZyB3aXRoIHRoZSBjYXNlIDY6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDY6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICgkaSA9IDA7ICRpIDwgJG5iQ2hhbm5lbHM7ICRpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXlfdW5zaGlmdCgkY29sb3IsICRudW0gJiAweGZmKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJG51bSA+Pj0gODsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJG5iQ2hhbm5lbHMgPT09IDQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkY29sb3JbM10gPT09IDI1NSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRjb2xvclszXSA9IDE7IC8vIGZ1bGx5IG9wYXF1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkY29sb3JbM10gPSByb3VuZCgkY29sb3JbM10gLyAyNTUsIE51bWJlcjo6UFJFQ0lTSU9OKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXlfdW5zaGlmdCgkY29sb3IsIFR5cGU6OlRfQ09MT1IpOwoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRjb2xvcjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCRyZ2JhID0gQ29sb3JzOjpjb2xvck5hbWVUb1JHQmEoJG5hbWUpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlzc2V0KCRyZ2JhWzNdKQogICAgICAgICAgICAgICAgICAgICAgICA/IFtUeXBlOjpUX0NPTE9SLCAkcmdiYVswXSwgJHJnYmFbMV0sICRyZ2JhWzJdLCAkcmdiYVszXV0KICAgICAgICAgICAgICAgICAgICAgICAgOiBbVHlwZTo6VF9DT0xPUiwgJHJnYmFbMF0sICRyZ2JhWzFdLCAkcmdiYVsyXV07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSBpbnR8TnVtYmVyICR2YWx1ZQogICAgICogQHBhcmFtIGJvb2wgICAgICAgJGlzQWxwaGEKICAgICAqCiAgICAgKiBAcmV0dXJuIGludHxtaXhlZAogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gY29tcGlsZVJHQkFWYWx1ZSgkdmFsdWUsICRpc0FscGhhID0gZmFsc2UpCiAgICB7CiAgICAgICAgaWYgKCRpc0FscGhhKSB7CiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+Y29tcGlsZUNvbG9yUGFydFZhbHVlKCR2YWx1ZSwgMCwgMSwgZmFsc2UpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICR0aGlzLT5jb21waWxlQ29sb3JQYXJ0VmFsdWUoJHZhbHVlLCAwLCAyNTUsIHRydWUpOwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIG1peGVkICAgICAkdmFsdWUKICAgICAqIEBwYXJhbSBpbnR8ZmxvYXQgJG1pbgogICAgICogQHBhcmFtIGludHxmbG9hdCAkbWF4CiAgICAgKiBAcGFyYW0gYm9vbCAgICAgICRpc0ludAogICAgICoKICAgICAqIEByZXR1cm4gaW50fG1peGVkCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBjb21waWxlQ29sb3JQYXJ0VmFsdWUoJHZhbHVlLCAkbWluLCAkbWF4LCAkaXNJbnQgPSB0cnVlKQogICAgewogICAgICAgIGlmICghIGlzX251bWVyaWMoJHZhbHVlKSkgewogICAgICAgICAgICBpZiAoXGlzX2FycmF5KCR2YWx1ZSkpIHsKICAgICAgICAgICAgICAgICRyZWR1Y2VkID0gJHRoaXMtPnJlZHVjZSgkdmFsdWUpOwoKICAgICAgICAgICAgICAgIGlmICgkcmVkdWNlZCBpbnN0YW5jZW9mIE51bWJlcikgewogICAgICAgICAgICAgICAgICAgICR2YWx1ZSA9ICRyZWR1Y2VkOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoJHZhbHVlIGluc3RhbmNlb2YgTnVtYmVyKSB7CiAgICAgICAgICAgICAgICBpZiAoJHZhbHVlLT51bml0bGVzcygpKSB7CiAgICAgICAgICAgICAgICAgICAgJG51bSA9ICR2YWx1ZS0+Z2V0RGltZW5zaW9uKCk7CiAgICAgICAgICAgICAgICB9IGVsc2VpZiAoJHZhbHVlLT5oYXNVbml0KCclJykpIHsKICAgICAgICAgICAgICAgICAgICAkbnVtID0gJG1heCAqICR2YWx1ZS0+Z2V0RGltZW5zaW9uKCkgLyAxMDA7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHRocm93ICR0aGlzLT5lcnJvcignRXhwZWN0ZWQgJXMgdG8gaGF2ZSBubyB1bml0cyBvciAiJSUiLicsICR2YWx1ZSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJHZhbHVlID0gJG51bTsKICAgICAgICAgICAgfSBlbHNlaWYgKFxpc19hcnJheSgkdmFsdWUpKSB7CiAgICAgICAgICAgICAgICAkdmFsdWUgPSAkdGhpcy0+Y29tcGlsZVZhbHVlKCR2YWx1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmIChpc19udW1lcmljKCR2YWx1ZSkpIHsKICAgICAgICAgICAgaWYgKCRpc0ludCkgewogICAgICAgICAgICAgICAgJHZhbHVlID0gcm91bmQoJHZhbHVlKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHZhbHVlID0gbWluKCRtYXgsIG1heCgkbWluLCAkdmFsdWUpKTsKCiAgICAgICAgICAgIHJldHVybiAkdmFsdWU7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJHZhbHVlOwogICAgfQoKICAgIC8qKgogICAgICogQ29lcmNlIHZhbHVlIHRvIHN0cmluZwogICAgICoKICAgICAqIEBwYXJhbSBhcnJheXxOdW1iZXIgJHZhbHVlCiAgICAgKgogICAgICogQHJldHVybiBhcnJheQogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gY29lcmNlU3RyaW5nKCR2YWx1ZSkKICAgIHsKICAgICAgICBpZiAoJHZhbHVlWzBdID09PSBUeXBlOjpUX1NUUklORykgewogICAgICAgICAgICBhc3NlcnQoXGlzX2FycmF5KCR2YWx1ZSkpOwoKICAgICAgICAgICAgcmV0dXJuICR2YWx1ZTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBbVHlwZTo6VF9TVFJJTkcsICcnLCBbJHRoaXMtPmNvbXBpbGVWYWx1ZSgkdmFsdWUpXV07CiAgICB9CgogICAgLyoqCiAgICAgKiBBc3NlcnQgdmFsdWUgaXMgYSBzdHJpbmcKICAgICAqCiAgICAgKiBUaGlzIG1ldGhvZCBkZWFscyB3aXRoIGludGVybmFsIGltcGxlbWVudGF0aW9uIGRldGFpbHMgb2YgdGhlIHZhbHVlCiAgICAgKiByZXByZXNlbnRhdGlvbiB3aGVyZSB1bnF1b3RlZCBzdHJpbmdzIGNhbiBzb21ldGltZXMgYmUgc3RvcmVkIHVuZGVyCiAgICAgKiBvdGhlciB0eXBlcy4KICAgICAqIFRoZSByZXR1cm5lZCB2YWx1ZSBpcyBhbHdheXMgdXNpbmcgdGhlIFRfU1RSSU5HIHR5cGUuCiAgICAgKgogICAgICogQGFwaQogICAgICoKICAgICAqIEBwYXJhbSBhcnJheXxOdW1iZXIgJHZhbHVlCiAgICAgKiBAcGFyYW0gc3RyaW5nfG51bGwgICR2YXJOYW1lCiAgICAgKgogICAgICogQHJldHVybiBhcnJheQogICAgICoKICAgICAqIEB0aHJvd3MgU2Fzc1NjcmlwdEV4Y2VwdGlvbgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gYXNzZXJ0U3RyaW5nKCR2YWx1ZSwgJHZhck5hbWUgPSBudWxsKQogICAgewogICAgICAgIC8vIGNhc2Ugb2YgdXJsKC4uLikgcGFyc2VkIGEgYSBmdW5jdGlvbgogICAgICAgIGlmICgkdmFsdWVbMF0gPT09IFR5cGU6OlRfRlVOQ1RJT04pIHsKICAgICAgICAgICAgJHZhbHVlID0gJHRoaXMtPmNvZXJjZVN0cmluZygkdmFsdWUpOwogICAgICAgIH0KCiAgICAgICAgaWYgKCEgXGluX2FycmF5KCR2YWx1ZVswXSwgW1R5cGU6OlRfU1RSSU5HLCBUeXBlOjpUX0tFWVdPUkRdKSkgewogICAgICAgICAgICAkdmFsdWUgPSAkdGhpcy0+Y29tcGlsZVZhbHVlKCR2YWx1ZSk7CiAgICAgICAgICAgIHRocm93IFNhc3NTY3JpcHRFeGNlcHRpb246OmZvckFyZ3VtZW50KCIkdmFsdWUgaXMgbm90IGEgc3RyaW5nLiIsICR2YXJOYW1lKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkdGhpcy0+Y29lcmNlU3RyaW5nKCR2YWx1ZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDb2VyY2UgdmFsdWUgdG8gYSBwZXJjZW50YWdlCiAgICAgKgogICAgICogQHBhcmFtIGFycmF5fE51bWJlciAkdmFsdWUKICAgICAqCiAgICAgKiBAcmV0dXJuIGludHxmbG9hdAogICAgICoKICAgICAqIEBkZXByZWNhdGVkCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBjb2VyY2VQZXJjZW50KCR2YWx1ZSkKICAgIHsKICAgICAgICBAdHJpZ2dlcl9lcnJvcihzcHJpbnRmKCciJXMiIGlzIGRlcHJlY2F0ZWQgc2luY2UgMS43LjAuJywgX19NRVRIT0RfXyksIEVfVVNFUl9ERVBSRUNBVEVEKTsKCiAgICAgICAgaWYgKCR2YWx1ZSBpbnN0YW5jZW9mIE51bWJlcikgewogICAgICAgICAgICBpZiAoJHZhbHVlLT5oYXNVbml0KCclJykpIHsKICAgICAgICAgICAgICAgIHJldHVybiAkdmFsdWUtPmdldERpbWVuc2lvbigpIC8gMTAwOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gJHZhbHVlLT5nZXREaW1lbnNpb24oKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAwOwogICAgfQoKICAgIC8qKgogICAgICogQXNzZXJ0IHZhbHVlIGlzIGEgbWFwCiAgICAgKgogICAgICogQGFwaQogICAgICoKICAgICAqIEBwYXJhbSBhcnJheXxOdW1iZXIgJHZhbHVlCiAgICAgKiBAcGFyYW0gc3RyaW5nfG51bGwgICR2YXJOYW1lCiAgICAgKgogICAgICogQHJldHVybiBhcnJheQogICAgICoKICAgICAqIEB0aHJvd3MgU2Fzc1NjcmlwdEV4Y2VwdGlvbgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gYXNzZXJ0TWFwKCR2YWx1ZSwgJHZhck5hbWUgPSBudWxsKQogICAgewogICAgICAgICRtYXAgPSAkdGhpcy0+dHJ5TWFwKCR2YWx1ZSk7CgogICAgICAgIGlmICgkbWFwID09PSBudWxsKSB7CiAgICAgICAgICAgICR2YWx1ZSA9ICR0aGlzLT5jb21waWxlVmFsdWUoJHZhbHVlKTsKCiAgICAgICAgICAgIHRocm93IFNhc3NTY3JpcHRFeGNlcHRpb246OmZvckFyZ3VtZW50KCIkdmFsdWUgaXMgbm90IGEgbWFwLiIsICR2YXJOYW1lKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkbWFwOwogICAgfQoKICAgIC8qKgogICAgICogQXNzZXJ0IHZhbHVlIGlzIGEgbGlzdAogICAgICoKICAgICAqIEBhcGkKICAgICAqCiAgICAgKiBAcGFyYW0gYXJyYXl8TnVtYmVyICR2YWx1ZQogICAgICoKICAgICAqIEByZXR1cm4gYXJyYXkKICAgICAqCiAgICAgKiBAdGhyb3dzIFxFeGNlcHRpb24KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGFzc2VydExpc3QoJHZhbHVlKQogICAgewogICAgICAgIGlmICgkdmFsdWVbMF0gIT09IFR5cGU6OlRfTElTVCkgewogICAgICAgICAgICB0aHJvdyAkdGhpcy0+ZXJyb3IoJ2V4cGVjdGluZyBsaXN0LCAlcyByZWNlaXZlZCcsICR2YWx1ZVswXSk7CiAgICAgICAgfQogICAgICAgIGFzc2VydChcaXNfYXJyYXkoJHZhbHVlKSk7CgogICAgICAgIHJldHVybiAkdmFsdWU7CiAgICB9CgogICAgLyoqCiAgICAgKiBHZXRzIHRoZSBrZXl3b3JkcyBvZiBhbiBhcmd1bWVudCBsaXN0LgogICAgICoKICAgICAqIEtleXMgaW4gdGhlIHJldHVybmVkIGFycmF5IGFyZSBub3JtYWxpemVkIG5hbWVzICh1bmRlcnNjb3JlcyBhcmUgcmVwbGFjZWQgd2l0aCBkYXNoZXMpCiAgICAgKiB3aXRob3V0IHRoZSBsZWFkaW5nIGAkYC4KICAgICAqIENhbGxpbmcgdGhpcyBoZWxwZXIgd2l0aCBhbnl0aGluZyB0aGF0IGFuIGFyZ3VtZW50IGxpc3QgcmVjZWl2ZWQgZm9yIGEgcmVzdCBhcmd1bWVudAogICAgICogb2YgdGhlIGZ1bmN0aW9uIGFyZ3VtZW50IGRlY2xhcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQuCiAgICAgKgogICAgICogQHBhcmFtIGFycmF5fE51bWJlciAkdmFsdWUKICAgICAqCiAgICAgKiBAcmV0dXJuIGFycmF5PHN0cmluZywgYXJyYXl8TnVtYmVyPgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0QXJndW1lbnRMaXN0S2V5d29yZHMoJHZhbHVlKQogICAgewogICAgICAgIGlmICgkdmFsdWVbMF0gIT09IFR5cGU6OlRfTElTVCB8fCAhaXNzZXQoJHZhbHVlWzNdKSB8fCAhXGlzX2FycmF5KCR2YWx1ZVszXSkpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ1RoZSBhcmd1bWVudCBpcyBub3QgYSBzYXNzIGFyZ3VtZW50IGxpc3QuJyk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJHZhbHVlWzNdOwogICAgfQoKICAgIC8qKgogICAgICogQXNzZXJ0IHZhbHVlIGlzIGEgY29sb3IKICAgICAqCiAgICAgKiBAYXBpCiAgICAgKgogICAgICogQHBhcmFtIGFycmF5fE51bWJlciAkdmFsdWUKICAgICAqIEBwYXJhbSBzdHJpbmd8bnVsbCAgJHZhck5hbWUKICAgICAqCiAgICAgKiBAcmV0dXJuIGFycmF5CiAgICAgKgogICAgICogQHRocm93cyBTYXNzU2NyaXB0RXhjZXB0aW9uCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBhc3NlcnRDb2xvcigkdmFsdWUsICR2YXJOYW1lID0gbnVsbCkKICAgIHsKICAgICAgICBpZiAoJGNvbG9yID0gJHRoaXMtPmNvZXJjZUNvbG9yKCR2YWx1ZSkpIHsKICAgICAgICAgICAgcmV0dXJuICRjb2xvcjsKICAgICAgICB9CgogICAgICAgICR2YWx1ZSA9ICR0aGlzLT5jb21waWxlVmFsdWUoJHZhbHVlKTsKCiAgICAgICAgdGhyb3cgU2Fzc1NjcmlwdEV4Y2VwdGlvbjo6Zm9yQXJndW1lbnQoIiR2YWx1ZSBpcyBub3QgYSBjb2xvci4iLCAkdmFyTmFtZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBBc3NlcnQgdmFsdWUgaXMgYSBudW1iZXIKICAgICAqCiAgICAgKiBAYXBpCiAgICAgKgogICAgICogQHBhcmFtIGFycmF5fE51bWJlciAkdmFsdWUKICAgICAqIEBwYXJhbSBzdHJpbmd8bnVsbCAgJHZhck5hbWUKICAgICAqCiAgICAgKiBAcmV0dXJuIE51bWJlcgogICAgICoKICAgICAqIEB0aHJvd3MgU2Fzc1NjcmlwdEV4Y2VwdGlvbgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gYXNzZXJ0TnVtYmVyKCR2YWx1ZSwgJHZhck5hbWUgPSBudWxsKQogICAgewogICAgICAgIGlmICghJHZhbHVlIGluc3RhbmNlb2YgTnVtYmVyKSB7CiAgICAgICAgICAgICR2YWx1ZSA9ICR0aGlzLT5jb21waWxlVmFsdWUoJHZhbHVlKTsKICAgICAgICAgICAgdGhyb3cgU2Fzc1NjcmlwdEV4Y2VwdGlvbjo6Zm9yQXJndW1lbnQoIiR2YWx1ZSBpcyBub3QgYSBudW1iZXIuIiwgJHZhck5hbWUpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICR2YWx1ZTsKICAgIH0KCiAgICAvKioKICAgICAqIEFzc2VydCB2YWx1ZSBpcyBhIGludGVnZXIKICAgICAqCiAgICAgKiBAYXBpCiAgICAgKgogICAgICogQHBhcmFtIGFycmF5fE51bWJlciAkdmFsdWUKICAgICAqIEBwYXJhbSBzdHJpbmd8bnVsbCAgJHZhck5hbWUKICAgICAqCiAgICAgKiBAcmV0dXJuIGludAogICAgICoKICAgICAqIEB0aHJvd3MgU2Fzc1NjcmlwdEV4Y2VwdGlvbgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gYXNzZXJ0SW50ZWdlcigkdmFsdWUsICR2YXJOYW1lID0gbnVsbCkKICAgIHsKICAgICAgICAkdmFsdWUgPSAkdGhpcy0+YXNzZXJ0TnVtYmVyKCR2YWx1ZSwgJHZhck5hbWUpLT5nZXREaW1lbnNpb24oKTsKICAgICAgICBpZiAocm91bmQoJHZhbHVlIC0gXGludHZhbCgkdmFsdWUpLCBOdW1iZXI6OlBSRUNJU0lPTikgPiAwKSB7CiAgICAgICAgICAgIHRocm93IFNhc3NTY3JpcHRFeGNlcHRpb246OmZvckFyZ3VtZW50KCIkdmFsdWUgaXMgbm90IGFuIGludGVnZXIuIiwgJHZhck5hbWUpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGludHZhbCgkdmFsdWUpOwogICAgfQoKICAgIC8qKgogICAgICogRXh0cmFjdCB0aGUgIC4uLiAvIGFscGhhIG9uIHRoZSBsYXN0IGFyZ3VtZW50IG9mIGNoYW5uZWwgYXJnCiAgICAgKiBpbiBjb2xvciBmdW5jdGlvbnMKICAgICAqCiAgICAgKiBAcGFyYW0gYXJyYXkgJGFyZ3MKICAgICAqIEByZXR1cm4gYXJyYXkKICAgICAqLwogICAgcHJpdmF0ZSBmdW5jdGlvbiBleHRyYWN0U2xhc2hBbHBoYUluQ29sb3JGdW5jdGlvbigkYXJncykKICAgIHsKICAgICAgICAkbGFzdCA9IGVuZCgkYXJncyk7CiAgICAgICAgaWYgKFxjb3VudCgkYXJncykgPT09IDMgJiYgJGxhc3RbMF0gPT09IFR5cGU6OlRfRVhQUkVTU0lPTiAmJiAkbGFzdFsxXSA9PT0gJy8nKSB7CiAgICAgICAgICAgIGFycmF5X3BvcCgkYXJncyk7CiAgICAgICAgICAgICRhcmdzW10gPSAkbGFzdFsyXTsKICAgICAgICAgICAgJGFyZ3NbXSA9ICRsYXN0WzNdOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJGFyZ3M7CiAgICB9CgoKICAgIC8qKgogICAgICogTWFrZSBzdXJlIGEgY29sb3IncyBjb21wb25lbnRzIGRvbid0IGdvIG91dCBvZiBib3VuZHMKICAgICAqCiAgICAgKiBAcGFyYW0gYXJyYXkgJGMKICAgICAqCiAgICAgKiBAcmV0dXJuIGFycmF5CiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBmaXhDb2xvcigkYykKICAgIHsKICAgICAgICBmb3JlYWNoIChbMSwgMiwgM10gYXMgJGkpIHsKICAgICAgICAgICAgaWYgKCRjWyRpXSA8IDApIHsKICAgICAgICAgICAgICAgICRjWyRpXSA9IDA7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICgkY1skaV0gPiAyNTUpIHsKICAgICAgICAgICAgICAgICRjWyRpXSA9IDI1NTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFcaXNfaW50KCRjWyRpXSkpIHsKICAgICAgICAgICAgICAgICRjWyRpXSA9IHJvdW5kKCRjWyRpXSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiAkYzsKICAgIH0KCiAgICAvKioKICAgICAqIENvbnZlcnQgUkdCIHRvIEhTTAogICAgICoKICAgICAqIEBpbnRlcm5hbAogICAgICoKICAgICAqIEBwYXJhbSBpbnQgJHJlZAogICAgICogQHBhcmFtIGludCAkZ3JlZW4KICAgICAqIEBwYXJhbSBpbnQgJGJsdWUKICAgICAqCiAgICAgKiBAcmV0dXJuIGFycmF5CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiB0b0hTTCgkcmVkLCAkZ3JlZW4sICRibHVlKQogICAgewogICAgICAgICRtaW4gPSBtaW4oJHJlZCwgJGdyZWVuLCAkYmx1ZSk7CiAgICAgICAgJG1heCA9IG1heCgkcmVkLCAkZ3JlZW4sICRibHVlKTsKCiAgICAgICAgJGwgPSAkbWluICsgJG1heDsKICAgICAgICAkZCA9ICRtYXggLSAkbWluOwoKICAgICAgICBpZiAoKGludCkgJGQgPT09IDApIHsKICAgICAgICAgICAgJGggPSAkcyA9IDA7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKCRsIDwgMjU1KSB7CiAgICAgICAgICAgICAgICAkcyA9ICRkIC8gJGw7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkcyA9ICRkIC8gKDUxMCAtICRsKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCRyZWQgPT0gJG1heCkgewogICAgICAgICAgICAgICAgJGggPSA2MCAqICgkZ3JlZW4gLSAkYmx1ZSkgLyAkZDsKICAgICAgICAgICAgfSBlbHNlaWYgKCRncmVlbiA9PSAkbWF4KSB7CiAgICAgICAgICAgICAgICAkaCA9IDYwICogKCRibHVlIC0gJHJlZCkgLyAkZCArIDEyMDsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICRoID0gNjAgKiAoJHJlZCAtICRncmVlbikgLyAkZCArIDI0MDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIFtUeXBlOjpUX0hTTCwgZm1vZCgkaCArIDM2MCwgMzYwKSwgJHMgKiAxMDAsICRsIC8gNS4xXTsKICAgIH0KCiAgICAvKioKICAgICAqIEh1ZSB0byBSR0IgaGVscGVyCiAgICAgKgogICAgICogQHBhcmFtIGZsb2F0ICRtMQogICAgICogQHBhcmFtIGZsb2F0ICRtMgogICAgICogQHBhcmFtIGZsb2F0ICRoCiAgICAgKgogICAgICogQHJldHVybiBmbG9hdAogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gaHVlVG9SR0IoJG0xLCAkbTIsICRoKQogICAgewogICAgICAgIGlmICgkaCA8IDApIHsKICAgICAgICAgICAgJGggKz0gMTsKICAgICAgICB9IGVsc2VpZiAoJGggPiAxKSB7CiAgICAgICAgICAgICRoIC09IDE7CiAgICAgICAgfQoKICAgICAgICBpZiAoJGggKiA2IDwgMSkgewogICAgICAgICAgICByZXR1cm4gJG0xICsgKCRtMiAtICRtMSkgKiAkaCAqIDY7CiAgICAgICAgfQoKICAgICAgICBpZiAoJGggKiAyIDwgMSkgewogICAgICAgICAgICByZXR1cm4gJG0yOwogICAgICAgIH0KCiAgICAgICAgaWYgKCRoICogMyA8IDIpIHsKICAgICAgICAgICAgcmV0dXJuICRtMSArICgkbTIgLSAkbTEpICogKDIgLyAzIC0gJGgpICogNjsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkbTE7CiAgICB9CgogICAgLyoqCiAgICAgKiBDb252ZXJ0IEhTTCB0byBSR0IKICAgICAqCiAgICAgKiBAaW50ZXJuYWwKICAgICAqCiAgICAgKiBAcGFyYW0gaW50fGZsb2F0ICRodWUgICAgICAgIEggZnJvbSAwIHRvIDM2MAogICAgICogQHBhcmFtIGludHxmbG9hdCAkc2F0dXJhdGlvbiBTIGZyb20gMCB0byAxMDAKICAgICAqIEBwYXJhbSBpbnR8ZmxvYXQgJGxpZ2h0bmVzcyAgTCBmcm9tIDAgdG8gMTAwCiAgICAgKgogICAgICogQHJldHVybiBhcnJheQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gdG9SR0IoJGh1ZSwgJHNhdHVyYXRpb24sICRsaWdodG5lc3MpCiAgICB7CiAgICAgICAgaWYgKCRodWUgPCAwKSB7CiAgICAgICAgICAgICRodWUgKz0gMzYwOwogICAgICAgIH0KCiAgICAgICAgJGggPSAkaHVlIC8gMzYwOwogICAgICAgICRzID0gbWluKDEwMCwgbWF4KDAsICRzYXR1cmF0aW9uKSkgLyAxMDA7CiAgICAgICAgJGwgPSBtaW4oMTAwLCBtYXgoMCwgJGxpZ2h0bmVzcykpIC8gMTAwOwoKICAgICAgICAkbTIgPSAkbCA8PSAwLjUgPyAkbCAqICgkcyArIDEpIDogJGwgKyAkcyAtICRsICogJHM7CiAgICAgICAgJG0xID0gJGwgKiAyIC0gJG0yOwoKICAgICAgICAkciA9ICR0aGlzLT5odWVUb1JHQigkbTEsICRtMiwgJGggKyAxIC8gMykgKiAyNTU7CiAgICAgICAgJGcgPSAkdGhpcy0+aHVlVG9SR0IoJG0xLCAkbTIsICRoKSAqIDI1NTsKICAgICAgICAkYiA9ICR0aGlzLT5odWVUb1JHQigkbTEsICRtMiwgJGggLSAxIC8gMykgKiAyNTU7CgogICAgICAgICRvdXQgPSBbVHlwZTo6VF9DT0xPUiwgJHIsICRnLCAkYl07CgogICAgICAgIHJldHVybiAkb3V0OwogICAgfQoKICAgIC8qKgogICAgICogQ29udmVydCBIV0IgdG8gUkdCCiAgICAgKiBodHRwczovL3d3dy53My5vcmcvVFIvY3NzLWNvbG9yLTQvI2h3Yi10by1yZ2IKICAgICAqCiAgICAgKiBAYXBpCiAgICAgKgogICAgICogQHBhcmFtIGludHxmbG9hdCAkaHVlICAgICAgICBIIGZyb20gMCB0byAzNjAKICAgICAqIEBwYXJhbSBpbnR8ZmxvYXQgJHdoaXRlbmVzcyAgVyBmcm9tIDAgdG8gMTAwCiAgICAgKiBAcGFyYW0gaW50fGZsb2F0ICRibGFja25lc3MgIEIgZnJvbSAwIHRvIDEwMAogICAgICoKICAgICAqIEByZXR1cm4gYXJyYXkKICAgICAqLwogICAgcHJpdmF0ZSBmdW5jdGlvbiBIV0J0b1JHQigkaHVlLCAkd2hpdGVuZXNzLCAkYmxhY2tuZXNzKQogICAgewogICAgICAgICR3ID0gbWluKDEwMCwgbWF4KDAsICR3aGl0ZW5lc3MpKSAvIDEwMDsKICAgICAgICAkYiA9IG1pbigxMDAsIG1heCgwLCAkYmxhY2tuZXNzKSkgLyAxMDA7CgogICAgICAgICRzdW0gPSAkdyArICRiOwogICAgICAgIGlmICgkc3VtID4gMS4wKSB7CiAgICAgICAgICAgICR3ID0gJHcgLyAkc3VtOwogICAgICAgICAgICAkYiA9ICRiIC8gJHN1bTsKICAgICAgICB9CiAgICAgICAgJGIgPSBtaW4oMS4wIC0gJHcsICRiKTsKCiAgICAgICAgJHJnYiA9ICR0aGlzLT50b1JHQigkaHVlLCAxMDAsIDUwKTsKICAgICAgICBmb3IgKCRpID0gMTsgJGkgPCA0OyAkaSsrKSB7CiAgICAgICAgICAgICRyZ2JbJGldICo9ICgxLjAgLSAkdyAtICRiKTsKICAgICAgICAgICAgJHJnYlskaV0gPSByb3VuZCgkcmdiWyRpXSArIDI1NSAqICR3ICsgMC4wMDAxKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkcmdiOwogICAgfQoKICAgIC8qKgogICAgICogQ29udmVydCBSR0IgdG8gSFdCCiAgICAgKgogICAgICogQGFwaQogICAgICoKICAgICAqIEBwYXJhbSBpbnQgJHJlZAogICAgICogQHBhcmFtIGludCAkZ3JlZW4KICAgICAqIEBwYXJhbSBpbnQgJGJsdWUKICAgICAqCiAgICAgKiBAcmV0dXJuIGFycmF5CiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gUkdCdG9IV0IoJHJlZCwgJGdyZWVuLCAkYmx1ZSkKICAgIHsKICAgICAgICAkbWluID0gbWluKCRyZWQsICRncmVlbiwgJGJsdWUpOwogICAgICAgICRtYXggPSBtYXgoJHJlZCwgJGdyZWVuLCAkYmx1ZSk7CgogICAgICAgICRkID0gJG1heCAtICRtaW47CgogICAgICAgIGlmICgoaW50KSAkZCA9PT0gMCkgewogICAgICAgICAgICAkaCA9IDA7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKCRyZWQgPT0gJG1heCkgewogICAgICAgICAgICAgICAgJGggPSA2MCAqICgkZ3JlZW4gLSAkYmx1ZSkgLyAkZDsKICAgICAgICAgICAgfSBlbHNlaWYgKCRncmVlbiA9PSAkbWF4KSB7CiAgICAgICAgICAgICAgICAkaCA9IDYwICogKCRibHVlIC0gJHJlZCkgLyAkZCArIDEyMDsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICRoID0gNjAgKiAoJHJlZCAtICRncmVlbikgLyAkZCArIDI0MDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIFtUeXBlOjpUX0hXQiwgZm1vZCgkaCwgMzYwKSwgJG1pbiAvIDI1NSAqIDEwMCwgMTAwIC0gJG1heCAvIDI1NSAqIDEwMF07CiAgICB9CgoKICAgIC8vIEJ1aWx0IGluIGZ1bmN0aW9ucwoKICAgIHByb3RlY3RlZCBzdGF0aWMgJGxpYkNhbGwgPSBbJ2Z1bmN0aW9uJywgJ2FyZ3MuLi4nXTsKICAgIHByb3RlY3RlZCBmdW5jdGlvbiBsaWJDYWxsKCRhcmdzKQogICAgewogICAgICAgICRmdW5jdGlvblJlZmVyZW5jZSA9ICRhcmdzWzBdOwoKICAgICAgICBpZiAoaW5fYXJyYXkoJGZ1bmN0aW9uUmVmZXJlbmNlWzBdLCBbVHlwZTo6VF9TVFJJTkcsIFR5cGU6OlRfS0VZV09SRF0pKSB7CiAgICAgICAgICAgICRuYW1lID0gJHRoaXMtPmNvbXBpbGVTdHJpbmdDb250ZW50KCR0aGlzLT5jb2VyY2VTdHJpbmcoJGZ1bmN0aW9uUmVmZXJlbmNlKSk7CiAgICAgICAgICAgICR3YXJuaW5nID0gIlBhc3NpbmcgYSBzdHJpbmcgdG8gY2FsbCgpIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgaWxsZWdhbFxuIgogICAgICAgICAgICAgICAgLiAiaW4gU2FzcyA0LjAuIFVzZSBjYWxsKGZ1bmN0aW9uLXJlZmVyZW5jZSgkbmFtZSkpIGluc3RlYWQuIjsKICAgICAgICAgICAgV2Fybjo6ZGVwcmVjYXRpb24oJHdhcm5pbmcpOwogICAgICAgICAgICAkZnVuY3Rpb25SZWZlcmVuY2UgPSAkdGhpcy0+bGliR2V0RnVuY3Rpb24oWyR0aGlzLT5hc3NlcnRTdHJpbmcoJGZ1bmN0aW9uUmVmZXJlbmNlLCAnZnVuY3Rpb24nKV0pOwogICAgICAgIH0KCiAgICAgICAgaWYgKCRmdW5jdGlvblJlZmVyZW5jZSA9PT0gc3RhdGljOjokbnVsbCkgewogICAgICAgICAgICByZXR1cm4gc3RhdGljOjokbnVsbDsKICAgICAgICB9CgogICAgICAgIGlmICghIGluX2FycmF5KCRmdW5jdGlvblJlZmVyZW5jZVswXSwgW1R5cGU6OlRfRlVOQ1RJT05fUkVGRVJFTkNFLCBUeXBlOjpUX0ZVTkNUSU9OXSkpIHsKICAgICAgICAgICAgdGhyb3cgJHRoaXMtPmVycm9yKCdGdW5jdGlvbiByZWZlcmVuY2UgZXhwZWN0ZWQsIGdvdCAnIC4gJGZ1bmN0aW9uUmVmZXJlbmNlWzBdKTsKICAgICAgICB9CgogICAgICAgICRjYWxsQXJncyA9IFsKICAgICAgICAgICAgW251bGwsICRhcmdzWzFdLCB0cnVlXQogICAgICAgIF07CgogICAgICAgIHJldHVybiAkdGhpcy0+cmVkdWNlKFtUeXBlOjpUX0ZVTkNUSU9OX0NBTEwsICRmdW5jdGlvblJlZmVyZW5jZSwgJGNhbGxBcmdzXSk7CiAgICB9CgoKICAgIHByb3RlY3RlZCBzdGF0aWMgJGxpYkdldEZ1bmN0aW9uID0gWwogICAgICAgIFsnbmFtZSddLAogICAgICAgIFsnbmFtZScsICdjc3MnXQogICAgXTsKICAgIHByb3RlY3RlZCBmdW5jdGlvbiBsaWJHZXRGdW5jdGlvbigkYXJncykKICAgIHsKICAgICAgICAkbmFtZSA9ICR0aGlzLT5jb21waWxlU3RyaW5nQ29udGVudCgkdGhpcy0+YXNzZXJ0U3RyaW5nKGFycmF5X3NoaWZ0KCRhcmdzKSwgJ25hbWUnKSk7CiAgICAgICAgJGlzQ3NzID0gZmFsc2U7CgogICAgICAgIGlmIChjb3VudCgkYXJncykpIHsKICAgICAgICAgICAgJGlzQ3NzID0gYXJyYXlfc2hpZnQoJGFyZ3MpOwogICAgICAgICAgICAkaXNDc3MgPSAoKCRpc0NzcyA9PT0gc3RhdGljOjokdHJ1ZSkgPyB0cnVlIDogZmFsc2UpOwogICAgICAgIH0KCiAgICAgICAgaWYgKCRpc0NzcykgewogICAgICAgICAgICByZXR1cm4gW1R5cGU6OlRfRlVOQ1RJT04sICRuYW1lLCBbVHlwZTo6VF9MSVNULCAnLCcsIFtdXV07CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJHRoaXMtPmdldEZ1bmN0aW9uUmVmZXJlbmNlKCRuYW1lLCB0cnVlKTsKICAgIH0KCiAgICBwcm90ZWN0ZWQgc3RhdGljICRsaWJJZiA9IFsnY29uZGl0aW9uJywgJ2lmLXRydWUnLCAnaWYtZmFsc2U6J107CiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gbGliSWYoJGFyZ3MpCiAgICB7CiAgICAgICAgbGlzdCgkY29uZCwgJHQsICRmKSA9ICRhcmdzOwoKICAgICAgICBpZiAoISAkdGhpcy0+aXNUcnV0aHkoJHRoaXMtPnJlZHVjZSgkY29uZCwgdHJ1ZSkpKSB7CiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+cmVkdWNlKCRmLCB0cnVlKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkdGhpcy0+cmVkdWNlKCR0LCB0cnVlKTsKICAgIH0KCiAgICBwcm90ZWN0ZWQgc3RhdGljICRsaWJJbmRleCA9IFsnbGlzdCcsICd2YWx1ZSddOwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGxpYkluZGV4KCRhcmdzKQogICAgewogICAgICAgIGxpc3QoJGxpc3QsICR2YWx1ZSkgPSAkYXJnczsKCiAgICAgICAgaWYgKAogICAgICAgICAgICAkbGlzdFswXSA9PT0gVHlwZTo6VF9NQVAgfHwKICAgICAgICAgICAgJGxpc3RbMF0gPT09IFR5cGU6OlRfU1RSSU5HIHx8CiAgICAgICAgICAgICRsaXN0WzBdID09PSBUeXBlOjpUX0tFWVdPUkQgfHwKICAgICAgICAgICAgJGxpc3RbMF0gPT09IFR5cGU6OlRfSU5URVJQT0xBVEUKICAgICAgICApIHsKICAgICAgICAgICAgJGxpc3QgPSAkdGhpcy0+Y29lcmNlTGlzdCgkbGlzdCwgJyAnKTsKICAgICAgICB9CgogICAgICAgIGlmICgkbGlzdFswXSAhPT0gVHlwZTo6VF9MSVNUKSB7CiAgICAgICAgICAgIHJldHVybiBzdGF0aWM6OiRudWxsOwogICAgICAgIH0KCiAgICAgICAgLy8gTnVtYmVycyBhcmUgcmVwcmVzZW50ZWQgd2l0aCB2YWx1ZSBvYmplY3RzLCBmb3Igd2hpY2ggdGhlIFBIUCBlcXVhbGl0eSBvcGVyYXRvciBkb2VzIG5vdAogICAgICAgIC8vIG1hdGNoIHRoZSBTYXNzIHJ1bGVzIChhbmQgd2UgY2Fubm90IG92ZXJsb2FkIGl0KS4gQXMgdGhleSBhcmUgdGhlIG9ubHkgdHlwZSBvZiB2YWx1ZXMKICAgICAgICAvLyByZXByZXNlbnRlZCB3aXRoIGEgdmFsdWUgb2JqZWN0IGZvciBub3csIHRoZXkgcmVxdWlyZSBhIHNwZWNpYWwgY2FzZS4KICAgICAgICBpZiAoJHZhbHVlIGluc3RhbmNlb2YgTnVtYmVyKSB7CiAgICAgICAgICAgICRrZXkgPSAwOwogICAgICAgICAgICBmb3JlYWNoICgkbGlzdFsyXSBhcyAkaXRlbSkgewogICAgICAgICAgICAgICAgJGtleSsrOwogICAgICAgICAgICAgICAgJGl0ZW1WYWx1ZSA9ICR0aGlzLT5ub3JtYWxpemVWYWx1ZSgkaXRlbSk7CgogICAgICAgICAgICAgICAgaWYgKCRpdGVtVmFsdWUgaW5zdGFuY2VvZiBOdW1iZXIgJiYgJHZhbHVlLT5lcXVhbHMoJGl0ZW1WYWx1ZSkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE51bWJlcigka2V5LCAnJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHN0YXRpYzo6JG51bGw7CiAgICAgICAgfQoKICAgICAgICAkdmFsdWVzID0gW107CgogICAgICAgIGZvcmVhY2ggKCRsaXN0WzJdIGFzICRpdGVtKSB7CiAgICAgICAgICAgICR2YWx1ZXNbXSA9ICR0aGlzLT5ub3JtYWxpemVWYWx1ZSgkaXRlbSk7CiAgICAgICAgfQoKICAgICAgICAka2V5ID0gYXJyYXlfc2VhcmNoKCR0aGlzLT5ub3JtYWxpemVWYWx1ZSgkdmFsdWUpLCAkdmFsdWVzKTsKCiAgICAgICAgcmV0dXJuIGZhbHNlID09PSAka2V5ID8gc3RhdGljOjokbnVsbCA6IG5ldyBOdW1iZXIoJGtleSArIDEsICcnKTsKICAgIH0KCiAgICBwcm90ZWN0ZWQgc3RhdGljICRsaWJSZ2IgPSBbCiAgICAgICAgWydjb2xvciddLAogICAgICAgIFsnY29sb3InLCAnYWxwaGEnXSwKICAgICAgICBbJ2NoYW5uZWxzJ10sCiAgICAgICAgWydyZWQnLCAnZ3JlZW4nLCAnYmx1ZSddLAogICAgICAgIFsncmVkJywgJ2dyZWVuJywgJ2JsdWUnLCAnYWxwaGEnXSBdOwoKICAgIC8qKgogICAgICogQHBhcmFtIGFycmF5ICRhcmdzCiAgICAgKiBAcGFyYW0gYXJyYXkgJGt3YXJncwogICAgICogQHBhcmFtIHN0cmluZyAkZnVuY05hbWUKICAgICAqCiAgICAgKiBAcmV0dXJuIGFycmF5CiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBsaWJSZ2IoJGFyZ3MsICRrd2FyZ3MsICRmdW5jTmFtZSA9ICdyZ2InKQogICAgewogICAgICAgIHN3aXRjaCAoXGNvdW50KCRhcmdzKSkgewogICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgICBpZiAoISAkY29sb3IgPSAkdGhpcy0+Y29lcmNlQ29sb3IoJGFyZ3NbMF0sIHRydWUpKSB7CiAgICAgICAgICAgICAgICAgICAgJGNvbG9yID0gW1R5cGU6OlRfU1RSSU5HLCAnJywgWyRmdW5jTmFtZSAuICcoJywgJGFyZ3NbMF0sICcpJ11dOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgICAgICAkY29sb3IgPSBbVHlwZTo6VF9DT0xPUiwgJGFyZ3NbMF0sICRhcmdzWzFdLCAkYXJnc1syXV07CgogICAgICAgICAgICAgICAgaWYgKCEgJGNvbG9yID0gJHRoaXMtPmNvZXJjZUNvbG9yKCRjb2xvcikpIHsKICAgICAgICAgICAgICAgICAgICAkY29sb3IgPSBbVHlwZTo6VF9TVFJJTkcsICcnLCBbJGZ1bmNOYW1lIC4gJygnLCAkYXJnc1swXSwgJywgJywgJGFyZ3NbMV0sICcsICcsICRhcmdzWzJdLCAnKSddXTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gJGNvbG9yOwoKICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgICAgaWYgKCRjb2xvciA9ICR0aGlzLT5jb2VyY2VDb2xvcigkYXJnc1swXSwgdHJ1ZSkpIHsKICAgICAgICAgICAgICAgICAgICAkYWxwaGEgPSAkdGhpcy0+Y29tcGlsZVJHQkFWYWx1ZSgkYXJnc1sxXSwgdHJ1ZSk7CgogICAgICAgICAgICAgICAgICAgIGlmIChpc19udW1lcmljKCRhbHBoYSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJGNvbG9yWzRdID0gJGFscGhhOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRjb2xvciA9IFtUeXBlOjpUX1NUUklORywgJycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJGZ1bmNOYW1lIC4gJygnLCAkY29sb3JbMV0sICcsICcsICRjb2xvclsyXSwgJywgJywgJGNvbG9yWzNdLCAnLCAnLCAkYWxwaGEsICcpJ11dOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJGNvbG9yID0gW1R5cGU6OlRfU1RSSU5HLCAnJywgWyRmdW5jTmFtZSAuICcoJywgJGFyZ3NbMF0sICcsICcsICRhcmdzWzFdLCAnKSddXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSA0OgogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgJGNvbG9yID0gW1R5cGU6OlRfQ09MT1IsICRhcmdzWzBdLCAkYXJnc1sxXSwgJGFyZ3NbMl0sICRhcmdzWzNdXTsKCiAgICAgICAgICAgICAgICBpZiAoISAkY29sb3IgPSAkdGhpcy0+Y29lcmNlQ29sb3IoJGNvbG9yKSkgewogICAgICAgICAgICAgICAgICAgICRjb2xvciA9IFtUeXBlOjpUX1NUUklORywgJycsCiAgICAgICAgICAgICAgICAgICAgICAgIFskZnVuY05hbWUgLiAnKCcsICRhcmdzWzBdLCAnLCAnLCAkYXJnc1sxXSwgJywgJywgJGFyZ3NbMl0sICcsICcsICRhcmdzWzNdLCAnKSddXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRjb2xvcjsKICAgIH0KCiAgICBwcm90ZWN0ZWQgc3RhdGljICRsaWJSZ2JhID0gWwogICAgICAgIFsnY29sb3InXSwKICAgICAgICBbJ2NvbG9yJywgJ2FscGhhJ10sCiAgICAgICAgWydjaGFubmVscyddLAogICAgICAgIFsncmVkJywgJ2dyZWVuJywgJ2JsdWUnXSwKICAgICAgICBbJ3JlZCcsICdncmVlbicsICdibHVlJywgJ2FscGhhJ10gXTsKICAgIHByb3RlY3RlZCBmdW5jdGlvbiBsaWJSZ2JhKCRhcmdzLCAka3dhcmdzKQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+bGliUmdiKCRhcmdzLCAka3dhcmdzLCAncmdiYScpOwogICAgfQoKICAgIC8qKgogICAgICogSGVscGVyIGZ1bmN0aW9uIGZvciBhZGp1c3RfY29sb3IsIGNoYW5nZV9jb2xvciwgYW5kIHNjYWxlX2NvbG9yCiAgICAgKgogICAgICogQHBhcmFtIGFycmF5PGFycmF5fE51bWJlcj4gJGFyZ3MKICAgICAqIEBwYXJhbSBzdHJpbmcgJG9wZXJhdGlvbgogICAgICogQHBhcmFtIGNhbGxhYmxlICRmbgogICAgICoKICAgICAqIEByZXR1cm4gYXJyYXkKICAgICAqCiAgICAgKiBAcGhwc3Rhbi1wYXJhbSBjYWxsYWJsZShmbG9hdHxpbnQsIGZsb2F0fGludHxudWxsLCBmbG9hdHxpbnQpOiAoZmxvYXR8aW50KSAkZm4KICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGFsdGVyQ29sb3IoYXJyYXkgJGFyZ3MsICRvcGVyYXRpb24sICRmbikKICAgIHsKICAgICAgICAkY29sb3IgPSAkdGhpcy0+YXNzZXJ0Q29sb3IoJGFyZ3NbMF0sICdjb2xvcicpOwoKICAgICAgICBpZiAoJGFyZ3NbMV1bMl0pIHsKICAgICAgICAgICAgdGhyb3cgbmV3IFNhc3NTY3JpcHRFeGNlcHRpb24oJ09ubHkgb25lIHBvc2l0aW9uYWwgYXJndW1lbnQgaXMgYWxsb3dlZC4gQWxsIG90aGVyIGFyZ3VtZW50cyBtdXN0IGJlIHBhc3NlZCBieSBuYW1lLicpOwogICAgICAgIH0KCiAgICAgICAgJGt3YXJncyA9ICR0aGlzLT5nZXRBcmd1bWVudExpc3RLZXl3b3JkcygkYXJnc1sxXSk7CgogICAgICAgICRzY2FsZSA9ICRvcGVyYXRpb24gPT09ICdzY2FsZSc7CiAgICAgICAgJGNoYW5nZSA9ICRvcGVyYXRpb24gPT09ICdjaGFuZ2UnOwoKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lCiAgICAgICAgICogQHBhcmFtIGZsb2F0fGludCAkbWF4CiAgICAgICAgICogQHBhcmFtIGJvb2wgJGNoZWNrUGVyY2VudAogICAgICAgICAqIEBwYXJhbSBib29sICRhc3NlcnRQZXJjZW50CiAgICAgICAgICogQHJldHVybiBmbG9hdHxpbnR8bnVsbAogICAgICAgICAqLwogICAgICAgICRnZXRQYXJhbSA9IGZ1bmN0aW9uICgkbmFtZSwgJG1heCwgJGNoZWNrUGVyY2VudCA9IGZhbHNlLCAkYXNzZXJ0UGVyY2VudCA9IGZhbHNlKSB1c2UgKCYka3dhcmdzLCAkc2NhbGUsICRjaGFuZ2UpIHsKICAgICAgICAgICAgaWYgKCFpc3NldCgka3dhcmdzWyRuYW1lXSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkbnVtYmVyID0gJHRoaXMtPmFzc2VydE51bWJlcigka3dhcmdzWyRuYW1lXSwgJG5hbWUpOwogICAgICAgICAgICB1bnNldCgka3dhcmdzWyRuYW1lXSk7CgogICAgICAgICAgICBpZiAoISRzY2FsZSAmJiAkY2hlY2tQZXJjZW50KSB7CiAgICAgICAgICAgICAgICBpZiAoISRudW1iZXItPmhhc1VuaXQoJyUnKSkgewogICAgICAgICAgICAgICAgICAgICR3YXJuaW5nID0gJHRoaXMtPmVycm9yKCJ7JG5hbWV9IFBhc3NpbmcgYSBudW1iZXIgYCRudW1iZXJgIHdpdGhvdXQgdW5pdCAlIGlzIGRlcHJlY2F0ZWQuIik7CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmxvZ2dlci0+d2Fybigkd2FybmluZy0+Z2V0TWVzc2FnZSgpLCB0cnVlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCRzY2FsZSB8fCAkYXNzZXJ0UGVyY2VudCkgewogICAgICAgICAgICAgICAgJG51bWJlci0+YXNzZXJ0VW5pdCgnJScsICRuYW1lKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCRzY2FsZSkgewogICAgICAgICAgICAgICAgJG1heCA9IDEwMDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCRzY2FsZSB8fCAkYXNzZXJ0UGVyY2VudCkgewogICAgICAgICAgICAgICAgcmV0dXJuICRudW1iZXItPnZhbHVlSW5SYW5nZSgkY2hhbmdlID8gMCA6IC0kbWF4LCAkbWF4LCAkbmFtZSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiAkbnVtYmVyLT52YWx1ZUluUmFuZ2VXaXRoVW5pdCgkY2hhbmdlID8gMCA6IC0kbWF4LCAkbWF4LCAkbmFtZSwgJGNoZWNrUGVyY2VudCA/ICclJyA6ICcnKTsKICAgICAgICB9OwoKICAgICAgICAkYWxwaGEgPSAkZ2V0UGFyYW0oJ2FscGhhJywgMSk7CiAgICAgICAgJHJlZCA9ICRnZXRQYXJhbSgncmVkJywgMjU1KTsKICAgICAgICAkZ3JlZW4gPSAkZ2V0UGFyYW0oJ2dyZWVuJywgMjU1KTsKICAgICAgICAkYmx1ZSA9ICRnZXRQYXJhbSgnYmx1ZScsIDI1NSk7CgogICAgICAgIGlmICgkc2NhbGUgfHwgIWlzc2V0KCRrd2FyZ3NbJ2h1ZSddKSkgewogICAgICAgICAgICAkaHVlID0gbnVsbDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkaHVlTnVtYmVyID0gJHRoaXMtPmFzc2VydE51bWJlcigka3dhcmdzWydodWUnXSwgJ2h1ZScpOwogICAgICAgICAgICB1bnNldCgka3dhcmdzWydodWUnXSk7CiAgICAgICAgICAgICRodWUgPSAkaHVlTnVtYmVyLT5nZXREaW1lbnNpb24oKTsKICAgICAgICB9CiAgICAgICAgJHNhdHVyYXRpb24gPSAkZ2V0UGFyYW0oJ3NhdHVyYXRpb24nLCAxMDAsIHRydWUpOwogICAgICAgICRsaWdodG5lc3MgPSAkZ2V0UGFyYW0oJ2xpZ2h0bmVzcycsIDEwMCwgdHJ1ZSk7CiAgICAgICAgJHdoaXRlbmVzcyA9ICRnZXRQYXJhbSgnd2hpdGVuZXNzJywgMTAwLCBmYWxzZSwgdHJ1ZSk7CiAgICAgICAgJGJsYWNrbmVzcyA9ICRnZXRQYXJhbSgnYmxhY2tuZXNzJywgMTAwLCBmYWxzZSwgdHJ1ZSk7CgogICAgICAgIGlmICghZW1wdHkoJGt3YXJncykpIHsKICAgICAgICAgICAgJHVua25vd25OYW1lcyA9IGFycmF5X2tleXMoJGt3YXJncyk7CiAgICAgICAgICAgICRsYXN0TmFtZSA9IGFycmF5X3BvcCgkdW5rbm93bk5hbWVzKTsKICAgICAgICAgICAgJG1lc3NhZ2UgPSBzcHJpbnRmKAogICAgICAgICAgICAgICAgJ05vIGFyZ3VtZW50JXMgbmFtZWQgJCVzJXMuJywKICAgICAgICAgICAgICAgICR1bmtub3duTmFtZXMgPyAncycgOiAnJywKICAgICAgICAgICAgICAgICR1bmtub3duTmFtZXMgPyBpbXBsb2RlKCcsICQnLCAkdW5rbm93bk5hbWVzKSAuICcgb3IgJCcgOiAnJywKICAgICAgICAgICAgICAgICRsYXN0TmFtZQogICAgICAgICAgICApOwogICAgICAgICAgICB0aHJvdyBuZXcgU2Fzc1NjcmlwdEV4Y2VwdGlvbigkbWVzc2FnZSk7CiAgICAgICAgfQoKICAgICAgICAkaGFzUmdiID0gJHJlZCAhPT0gbnVsbCB8fCAkZ3JlZW4gIT09IG51bGwgfHwgJGJsdWUgIT09IG51bGw7CiAgICAgICAgJGhhc1NMID0gJHNhdHVyYXRpb24gIT09IG51bGwgfHwgJGxpZ2h0bmVzcyAhPT0gbnVsbDsKICAgICAgICAkaGFzV0IgPSAkd2hpdGVuZXNzICE9PSBudWxsIHx8ICRibGFja25lc3MgIT09IG51bGw7CgogICAgICAgIGlmICgkaGFzUmdiICYmICgkaGFzU0wgfHwgJGhhc1dCIHx8ICRodWUgIT09IG51bGwpKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBTYXNzU2NyaXB0RXhjZXB0aW9uKHNwcmludGYoJ1JHQiBwYXJhbWV0ZXJzIG1heSBub3QgYmUgcGFzc2VkIGFsb25nIHdpdGggJXMgcGFyYW1ldGVycy4nLCAkaGFzV0IgPyAnSFdCJyA6ICdIU0wnKSk7CiAgICAgICAgfQoKICAgICAgICBpZiAoJGhhc1dCICYmICRoYXNTTCkgewogICAgICAgICAgICB0aHJvdyBuZXcgU2Fzc1NjcmlwdEV4Y2VwdGlvbignSFNMIHBhcmFtZXRlcnMgbWF5IG5vdCBiZSBwYXNzZWQgYWxvbmcgd2l0aCBIV0IgcGFyYW1ldGVycy4nKTsKICAgICAgICB9CgogICAgICAgIGlmICgkaGFzUmdiKSB7CiAgICAgICAgICAgICRjb2xvclsxXSA9IHJvdW5kKCRmbigkY29sb3JbMV0sICRyZWQsIDI1NSkpOwogICAgICAgICAgICAkY29sb3JbMl0gPSByb3VuZCgkZm4oJGNvbG9yWzJdLCAkZ3JlZW4sIDI1NSkpOwogICAgICAgICAgICAkY29sb3JbM10gPSByb3VuZCgkZm4oJGNvbG9yWzNdLCAkYmx1ZSwgMjU1KSk7CiAgICAgICAgfSBlbHNlaWYgKCRoYXNXQikgewogICAgICAgICAgICAkaHdiID0gJHRoaXMtPlJHQnRvSFdCKCRjb2xvclsxXSwgJGNvbG9yWzJdLCAkY29sb3JbM10pOwogICAgICAgICAgICBpZiAoJGh1ZSAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgJGh3YlsxXSA9ICRjaGFuZ2UgPyAkaHVlIDogJGh3YlsxXSArICRodWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJGh3YlsyXSA9ICRmbigkaHdiWzJdLCAkd2hpdGVuZXNzLCAxMDApOwogICAgICAgICAgICAkaHdiWzNdID0gJGZuKCRod2JbM10sICRibGFja25lc3MsIDEwMCk7CgogICAgICAgICAgICAkcmdiID0gJHRoaXMtPkhXQnRvUkdCKCRod2JbMV0sICRod2JbMl0sICRod2JbM10pOwoKICAgICAgICAgICAgaWYgKGlzc2V0KCRjb2xvcls0XSkpIHsKICAgICAgICAgICAgICAgICRyZ2JbNF0gPSAkY29sb3JbNF07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRjb2xvciA9ICRyZ2I7CiAgICAgICAgfSBlbHNlaWYgKCRodWUgIT09IG51bGwgfHwgJGhhc1NMKSB7CiAgICAgICAgICAgICRoc2wgPSAkdGhpcy0+dG9IU0woJGNvbG9yWzFdLCAkY29sb3JbMl0sICRjb2xvclszXSk7CgogICAgICAgICAgICBpZiAoJGh1ZSAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgJGhzbFsxXSA9ICRjaGFuZ2UgPyAkaHVlIDogJGhzbFsxXSArICRodWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJGhzbFsyXSA9ICRmbigkaHNsWzJdLCAkc2F0dXJhdGlvbiwgMTAwKTsKICAgICAgICAgICAgJGhzbFszXSA9ICRmbigkaHNsWzNdLCAkbGlnaHRuZXNzLCAxMDApOwoKICAgICAgICAgICAgJHJnYiA9ICR0aGlzLT50b1JHQigkaHNsWzFdLCAkaHNsWzJdLCAkaHNsWzNdKTsKCiAgICAgICAgICAgIGlmIChpc3NldCgkY29sb3JbNF0pKSB7CiAgICAgICAgICAgICAgICAkcmdiWzRdID0gJGNvbG9yWzRdOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkY29sb3IgPSAkcmdiOwogICAgICAgIH0KCiAgICAgICAgaWYgKCRhbHBoYSAhPT0gbnVsbCkgewogICAgICAgICAgICAkZXhpc3RpbmdBbHBoYSA9IGlzc2V0KCRjb2xvcls0XSkgPyAkY29sb3JbNF0gOiAxOwogICAgICAgICAgICAkY29sb3JbNF0gPSAkZm4oJGV4aXN0aW5nQWxwaGEsICRhbHBoYSwgMSk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJGNvbG9yOwogICAgfQoKICAgIHByb3RlY3RlZCBzdGF0aWMgJGxpYkFkanVzdENvbG9yID0gWydjb2xvcicsICdrd2FyZ3MuLi4nXTsKICAgIHByb3RlY3RlZCBmdW5jdGlvbiBsaWJBZGp1c3RDb2xvcigkYXJncykKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmFsdGVyQ29sb3IoJGFyZ3MsICdhZGp1c3QnLCBmdW5jdGlvbiAoJGJhc2UsICRhbHRlciwgJG1heCkgewogICAgICAgICAgICBpZiAoJGFsdGVyID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJGJhc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRuZXcgPSAkYmFzZSArICRhbHRlcjsKCiAgICAgICAgICAgIGlmICgkbmV3IDwgMCkgewogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICgkbmV3ID4gJG1heCkgewogICAgICAgICAgICAgICAgcmV0dXJuICRtYXg7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiAkbmV3OwogICAgICAgIH0pOwogICAgfQoKICAgIHByb3RlY3RlZCBzdGF0aWMgJGxpYkNoYW5nZUNvbG9yID0gWydjb2xvcicsICdrd2FyZ3MuLi4nXTsKICAgIHByb3RlY3RlZCBmdW5jdGlvbiBsaWJDaGFuZ2VDb2xvcigkYXJncykKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmFsdGVyQ29sb3IoJGFyZ3MsICdjaGFuZ2UnLCBmdW5jdGlvbiAoJGJhc2UsICRhbHRlciwgJG1heCkgewogICAgICAgICAgICBpZiAoJGFsdGVyID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJGJhc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiAkYWx0ZXI7CiAgICAgICAgfSk7CiAgICB9CgogICAgcHJvdGVjdGVkIHN0YXRpYyAkbGliU2NhbGVDb2xvciA9IFsnY29sb3InLCAna3dhcmdzLi4uJ107CiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gbGliU2NhbGVDb2xvcigkYXJncykKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmFsdGVyQ29sb3IoJGFyZ3MsICdzY2FsZScsIGZ1bmN0aW9uICgkYmFzZSwgJHNjYWxlLCAkbWF4KSB7CiAgICAgICAgICAgIGlmICgkc2NhbGUgPT09IG51bGwpIHsKICAgICAgICAgICAgICAgIHJldHVybiAkYmFzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHNjYWxlID0gJHNjYWxlIC8gMTAwOwoKICAgICAgICAgICAgaWYgKCRzY2FsZSA8IDApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkYmFzZSAqICRzY2FsZSArICRiYXNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gKCRtYXggLSAkYmFzZSkgKiAkc2NhbGUgKyAkYmFzZTsKICAgICAgICB9KTsKICAgIH0KCiAgICBwcm90ZWN0ZWQgc3RhdGljICRsaWJJZUhleFN0ciA9IFsnY29sb3InXTsKICAgIHByb3RlY3RlZCBmdW5jdGlvbiBsaWJJZUhleFN0cigkYXJncykKICAgIHsKICAgICAgICAkY29sb3IgPSAkdGhpcy0+Y29lcmNlQ29sb3IoJGFyZ3NbMF0pOwoKICAgICAgICBpZiAoXGlzX251bGwoJGNvbG9yKSkgewogICAgICAgICAgICB0aHJvdyAkdGhpcy0+ZXJyb3IoJ0Vycm9yOiBhcmd1bWVudCBgJGNvbG9yYCBvZiBgaWUtaGV4LXN0cigkY29sb3IpYCBtdXN0IGJlIGEgY29sb3InKTsKICAgICAgICB9CgogICAgICAgICRjb2xvcls0XSA9IGlzc2V0KCRjb2xvcls0XSkgPyByb3VuZCgyNTUgKiAkY29sb3JbNF0pIDogMjU1OwoKICAgICAgICByZXR1cm4gW1R5cGU6OlRfU1RSSU5HLCAnJywgW3NwcmludGYoJyMlMDJYJTAyWCUwMlglMDJYJywgJGNvbG9yWzRdLCAkY29sb3JbMV0sICRjb2xvclsyXSwgJGNvbG9yWzNdKV1dOwogICAgfQoKICAgIHByb3RlY3RlZCBzdGF0aWMgJGxpYlJlZCA9IFsnY29sb3InXTsKICAgIHByb3RlY3RlZCBmdW5jdGlvbiBsaWJSZWQoJGFyZ3MpCiAgICB7CiAgICAgICAgJGNvbG9yID0gJHRoaXMtPmNvZXJjZUNvbG9yKCRhcmdzWzBdKTsKCiAgICAgICAgaWYgKFxpc19udWxsKCRjb2xvcikpIHsKICAgICAgICAgICAgdGhyb3cgJHRoaXMtPmVycm9yKCdFcnJvcjogYXJndW1lbnQgYCRjb2xvcmAgb2YgYHJlZCgkY29sb3IpYCBtdXN0IGJlIGEgY29sb3InKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBuZXcgTnVtYmVyKChpbnQpICRjb2xvclsxXSwgJycpOwogICAgfQoKICAgIHByb3RlY3RlZCBzdGF0aWMgJGxpYkdyZWVuID0gWydjb2xvciddOwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGxpYkdyZWVuKCRhcmdzKQogICAgewogICAgICAgICRjb2xvciA9ICR0aGlzLT5jb2VyY2VDb2xvcigkYXJnc1swXSk7CgogICAgICAgIGlmIChcaXNfbnVsbCgkY29sb3IpKSB7CiAgICAgICAgICAgIHRocm93ICR0aGlzLT5lcnJvcignRXJyb3I6IGFyZ3VtZW50IGAkY29sb3JgIG9mIGBncmVlbigkY29sb3IpYCBtdXN0IGJlIGEgY29sb3InKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBuZXcgTnVtYmVyKChpbnQpICRjb2xvclsyXSwgJycpOwogICAgfQoKICAgIHByb3RlY3RlZCBzdGF0aWMgJGxpYkJsdWUgPSBbJ2NvbG9yJ107CiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gbGliQmx1ZSgkYXJncykKICAgIHsKICAgICAgICAkY29sb3IgPSAkdGhpcy0+Y29lcmNlQ29sb3IoJGFyZ3NbMF0pOwoKICAgICAgICBpZiAoXGlzX251bGwoJGNvbG9yKSkgewogICAgICAgICAgICB0aHJvdyAkdGhpcy0+ZXJyb3IoJ0Vycm9yOiBhcmd1bWVudCBgJGNvbG9yYCBvZiBgYmx1ZSgkY29sb3IpYCBtdXN0IGJlIGEgY29sb3InKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBuZXcgTnVtYmVyKChpbnQpICRjb2xvclszXSwgJycpOwogICAgfQoKICAgIHByb3RlY3RlZCBzdGF0aWMgJGxpYkFscGhhID0gWydjb2xvciddOwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGxpYkFscGhhKCRhcmdzKQogICAgewogICAgICAgIGlmICgkY29sb3IgPSAkdGhpcy0+Y29lcmNlQ29sb3IoJGFyZ3NbMF0pKSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgTnVtYmVyKGlzc2V0KCRjb2xvcls0XSkgPyAkY29sb3JbNF0gOiAxLCAnJyk7CiAgICAgICAgfQoKICAgICAgICAvLyB0aGlzIG1pZ2h0IGJlIHRoZSBJRSBmdW5jdGlvbiwgc28gcmV0dXJuIHZhbHVlIHVuY2hhbmdlZAogICAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgIHByb3RlY3RlZCBzdGF0aWMgJGxpYk9wYWNpdHkgPSBbJ2NvbG9yJ107CiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gbGliT3BhY2l0eSgkYXJncykKICAgIHsKICAgICAgICAkdmFsdWUgPSAkYXJnc1swXTsKCiAgICAgICAgaWYgKCR2YWx1ZSBpbnN0YW5jZW9mIE51bWJlcikgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkdGhpcy0+bGliQWxwaGEoJGFyZ3MpOwogICAgfQoKICAgIC8vIG1peCB0d28gY29sb3JzCiAgICBwcm90ZWN0ZWQgc3RhdGljICRsaWJNaXggPSBbCiAgICAgICAgWydjb2xvcjEnLCAnY29sb3IyJywgJ3dlaWdodDo1MCUnXSwKICAgICAgICBbJ2NvbG9yLTEnLCAnY29sb3ItMicsICd3ZWlnaHQ6NTAlJ10KICAgICAgICBdOwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGxpYk1peCgkYXJncykKICAgIHsKICAgICAgICBsaXN0KCRmaXJzdCwgJHNlY29uZCwgJHdlaWdodCkgPSAkYXJnczsKCiAgICAgICAgJGZpcnN0ID0gJHRoaXMtPmFzc2VydENvbG9yKCRmaXJzdCwgJ2NvbG9yMScpOwogICAgICAgICRzZWNvbmQgPSAkdGhpcy0+YXNzZXJ0Q29sb3IoJHNlY29uZCwgJ2NvbG9yMicpOwogICAgICAgICR3ZWlnaHRTY2FsZSA9ICR0aGlzLT5hc3NlcnROdW1iZXIoJHdlaWdodCwgJ3dlaWdodCcpLT52YWx1ZUluUmFuZ2UoMCwgMTAwLCAnd2VpZ2h0JykgLyAxMDA7CgogICAgICAgICRmaXJzdEFscGhhID0gaXNzZXQoJGZpcnN0WzRdKSA/ICRmaXJzdFs0XSA6IDE7CiAgICAgICAgJHNlY29uZEFscGhhID0gaXNzZXQoJHNlY29uZFs0XSkgPyAkc2Vjb25kWzRdIDogMTsKCiAgICAgICAgJG5vcm1hbGl6ZWRXZWlnaHQgPSAkd2VpZ2h0U2NhbGUgKiAyIC0gMTsKICAgICAgICAkYWxwaGFEaXN0YW5jZSA9ICRmaXJzdEFscGhhIC0gJHNlY29uZEFscGhhOwoKICAgICAgICAkY29tYmluZWRXZWlnaHQgPSAkbm9ybWFsaXplZFdlaWdodCAqICRhbHBoYURpc3RhbmNlID09IC0xID8gJG5vcm1hbGl6ZWRXZWlnaHQgOiAoJG5vcm1hbGl6ZWRXZWlnaHQgKyAkYWxwaGFEaXN0YW5jZSkgLyAoMSArICRub3JtYWxpemVkV2VpZ2h0ICogJGFscGhhRGlzdGFuY2UpOwogICAgICAgICR3ZWlnaHQxID0gKCRjb21iaW5lZFdlaWdodCArIDEpIC8gMi4wOwogICAgICAgICR3ZWlnaHQyID0gMS4wIC0gJHdlaWdodDE7CgogICAgICAgICRuZXcgPSBbVHlwZTo6VF9DT0xPUiwKICAgICAgICAgICAgJHdlaWdodDEgKiAkZmlyc3RbMV0gKyAkd2VpZ2h0MiAqICRzZWNvbmRbMV0sCiAgICAgICAgICAgICR3ZWlnaHQxICogJGZpcnN0WzJdICsgJHdlaWdodDIgKiAkc2Vjb25kWzJdLAogICAgICAgICAgICAkd2VpZ2h0MSAqICRmaXJzdFszXSArICR3ZWlnaHQyICogJHNlY29uZFszXSwKICAgICAgICBdOwoKICAgICAgICBpZiAoJGZpcnN0QWxwaGEgIT0gMS4wIHx8ICRzZWNvbmRBbHBoYSAhPSAxLjApIHsKICAgICAgICAgICAgJG5ld1tdID0gJGZpcnN0QWxwaGEgKiAkd2VpZ2h0U2NhbGUgKyAkc2Vjb25kQWxwaGEgKiAoMSAtICR3ZWlnaHRTY2FsZSk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJHRoaXMtPmZpeENvbG9yKCRuZXcpOwogICAgfQoKICAgIHByb3RlY3RlZCBzdGF0aWMgJGxpYkhzbCA9IFsKICAgICAgICBbJ2NoYW5uZWxzJ10sCiAgICAgICAgWydodWUnLCAnc2F0dXJhdGlvbiddLAogICAgICAgIFsnaHVlJywgJ3NhdHVyYXRpb24nLCAnbGlnaHRuZXNzJ10sCiAgICAgICAgWydodWUnLCAnc2F0dXJhdGlvbicsICdsaWdodG5lc3MnLCAnYWxwaGEnXSBdOwoKICAgIC8qKgogICAgICogQHBhcmFtIGFycmF5ICRhcmdzCiAgICAgKiBAcGFyYW0gYXJyYXkgJGt3YXJncwogICAgICogQHBhcmFtIHN0cmluZyAkZnVuY05hbWUKICAgICAqCiAgICAgKiBAcmV0dXJuIGFycmF5fG51bGwKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGxpYkhzbCgkYXJncywgJGt3YXJncywgJGZ1bmNOYW1lID0gJ2hzbCcpCiAgICB7CiAgICAgICAgJGFyZ3NfdG9fY2hlY2sgPSAkYXJnczsKCiAgICAgICAgaWYgKFxjb3VudCgkYXJncykgPT0gMSkgewogICAgICAgICAgICBpZiAoJGFyZ3NbMF1bMF0gIT09IFR5cGU6OlRfTElTVCB8fCBcY291bnQoJGFyZ3NbMF1bMl0pIDwgMyB8fCBcY291bnQoJGFyZ3NbMF1bMl0pID4gNCkgewogICAgICAgICAgICAgICAgcmV0dXJuIFtUeXBlOjpUX1NUUklORywgJycsIFskZnVuY05hbWUgLiAnKCcsICRhcmdzWzBdLCAnKSddXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJGFyZ3MgPSAkYXJnc1swXVsyXTsKICAgICAgICAgICAgJGFyZ3NfdG9fY2hlY2sgPSAka3dhcmdzWydjaGFubmVscyddWzJdOwogICAgICAgIH0KCiAgICAgICAgaWYgKFxjb3VudCgkYXJncykgPT09IDIpIHsKICAgICAgICAgICAgLy8gaWYgdmFyKCkgaXMgdXNlZCBhcyBhbiBhcmd1bWVudCwgcmV0dXJuIGFzIGEgY3NzIGZ1bmN0aW9uCiAgICAgICAgICAgIGZvcmVhY2ggKCRhcmdzIGFzICRhcmcpIHsKICAgICAgICAgICAgICAgIGlmICgkYXJnWzBdID09PSBUeXBlOjpUX0ZVTkNUSU9OICYmIGluX2FycmF5KCRhcmdbMV0sIFsndmFyJ10pKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRocm93IG5ldyBTYXNzU2NyaXB0RXhjZXB0aW9uKCdNaXNzaW5nIGFyZ3VtZW50ICRsaWdodG5lc3MuJyk7CiAgICAgICAgfQoKICAgICAgICBmb3JlYWNoICgka3dhcmdzIGFzICRhcmcpIHsKICAgICAgICAgICAgaWYgKGluX2FycmF5KCRhcmdbMF0sIFtUeXBlOjpUX0ZVTkNUSU9OX0NBTEwsIFR5cGU6OlRfRlVOQ1RJT05dKSAmJiBpbl9hcnJheSgkYXJnWzFdLCBbJ21pbicsICdtYXgnXSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBmb3JlYWNoICgkYXJnc190b19jaGVjayBhcyAkayA9PiAkYXJnKSB7CiAgICAgICAgICAgIGlmIChpbl9hcnJheSgkYXJnWzBdLCBbVHlwZTo6VF9GVU5DVElPTl9DQUxMLCBUeXBlOjpUX0ZVTkNUSU9OXSkgJiYgaW5fYXJyYXkoJGFyZ1sxXSwgWydtaW4nLCAnbWF4J10pKSB7CiAgICAgICAgICAgICAgICBpZiAoY291bnQoJGt3YXJncykgPiAxIHx8ICgkayA+PSAyICYmIGNvdW50KCRhcmdzKSA9PT0gNCkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkYXJnc1ska10gPSAkdGhpcy0+c3RyaW5naWZ5Rm5jYWxsQXJncygkYXJnKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJGsgPj0gMiAmJiBjb3VudCgkYXJncykgPT09IDQgJiYKICAgICAgICAgICAgICAgIGluX2FycmF5KCRhcmdbMF0sIFtUeXBlOjpUX0ZVTkNUSU9OX0NBTEwsIFR5cGU6OlRfRlVOQ1RJT05dKSAmJgogICAgICAgICAgICAgICAgaW5fYXJyYXkoJGFyZ1sxXSwgWydjYWxjJywnZW52J10pCiAgICAgICAgICAgICkgewogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICRodWUgPSAkdGhpcy0+cmVkdWNlKCRhcmdzWzBdKTsKICAgICAgICAkc2F0dXJhdGlvbiA9ICR0aGlzLT5yZWR1Y2UoJGFyZ3NbMV0pOwogICAgICAgICRsaWdodG5lc3MgPSAkdGhpcy0+cmVkdWNlKCRhcmdzWzJdKTsKICAgICAgICAkYWxwaGEgPSBudWxsOwoKICAgICAgICBpZiAoXGNvdW50KCRhcmdzKSA9PT0gNCkgewogICAgICAgICAgICAkYWxwaGEgPSAkdGhpcy0+Y29tcGlsZUNvbG9yUGFydFZhbHVlKCRhcmdzWzNdLCAwLCAxMDAsIGZhbHNlKTsKCiAgICAgICAgICAgIGlmICghJGh1ZSBpbnN0YW5jZW9mIE51bWJlciB8fCAhJHNhdHVyYXRpb24gaW5zdGFuY2VvZiBOdW1iZXIgfHwgISAkbGlnaHRuZXNzIGluc3RhbmNlb2YgTnVtYmVyIHx8ICEgaXNfbnVtZXJpYygkYWxwaGEpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gW1R5cGU6OlRfU1RSSU5HLCAnJywKICAgICAgICAgICAgICAgICAgICBbJGZ1bmNOYW1lIC4gJygnLCAkYXJnc1swXSwgJywgJywgJGFyZ3NbMV0sICcsICcsICRhcmdzWzJdLCAnLCAnLCAkYXJnc1szXSwgJyknXV07CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiAoISRodWUgaW5zdGFuY2VvZiBOdW1iZXIgfHwgISRzYXR1cmF0aW9uIGluc3RhbmNlb2YgTnVtYmVyIHx8ICEgJGxpZ2h0bmVzcyBpbnN0YW5jZW9mIE51bWJlcikgewogICAgICAgICAgICAgICAgcmV0dXJuIFtUeXBlOjpUX1NUUklORywgJycsIFskZnVuY05hbWUgLiAnKCcsICRhcmdzWzBdLCAnLCAnLCAkYXJnc1sxXSwgJywgJywgJGFyZ3NbMl0sICcpJ11dOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkaHVlVmFsdWUgPSBmbW9kKCRodWUtPmdldERpbWVuc2lvbigpLCAzNjApOwoKICAgICAgICB3aGlsZSAoJGh1ZVZhbHVlIDwgMCkgewogICAgICAgICAgICAkaHVlVmFsdWUgKz0gMzYwOwogICAgICAgIH0KCiAgICAgICAgJGNvbG9yID0gJHRoaXMtPnRvUkdCKCRodWVWYWx1ZSwgbWF4KDAsIG1pbigkc2F0dXJhdGlvbi0+Z2V0RGltZW5zaW9uKCksIDEwMCkpLCBtYXgoMCwgbWluKCRsaWdodG5lc3MtPmdldERpbWVuc2lvbigpLCAxMDApKSk7CgogICAgICAgIGlmICghIFxpc19udWxsKCRhbHBoYSkpIHsKICAgICAgICAgICAgJGNvbG9yWzRdID0gJGFscGhhOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRjb2xvcjsKICAgIH0KCiAgICBwcm90ZWN0ZWQgc3RhdGljICRsaWJIc2xhID0gWwogICAgICAgICAgICBbJ2NoYW5uZWxzJ10sCiAgICAgICAgICAgIFsnaHVlJywgJ3NhdHVyYXRpb24nXSwKICAgICAgICAgICAgWydodWUnLCAnc2F0dXJhdGlvbicsICdsaWdodG5lc3MnXSwKICAgICAgICAgICAgWydodWUnLCAnc2F0dXJhdGlvbicsICdsaWdodG5lc3MnLCAnYWxwaGEnXV07CiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gbGliSHNsYSgkYXJncywgJGt3YXJncykKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmxpYkhzbCgkYXJncywgJGt3YXJncywgJ2hzbGEnKTsKICAgIH0KCiAgICBwcm90ZWN0ZWQgc3RhdGljICRsaWJIdWUgPSBbJ2NvbG9yJ107CiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gbGliSHVlKCRhcmdzKQogICAgewogICAgICAgICRjb2xvciA9ICR0aGlzLT5hc3NlcnRDb2xvcigkYXJnc1swXSwgJ2NvbG9yJyk7CiAgICAgICAgJGhzbCA9ICR0aGlzLT50b0hTTCgkY29sb3JbMV0sICRjb2xvclsyXSwgJGNvbG9yWzNdKTsKCiAgICAgICAgcmV0dXJuIG5ldyBOdW1iZXIoJGhzbFsxXSwgJ2RlZycpOwogICAgfQoKICAgIHByb3RlY3RlZCBzdGF0aWMgJGxpYlNhdHVyYXRpb24gPSBbJ2NvbG9yJ107CiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gbGliU2F0dXJhdGlvbigkYXJncykKICAgIHsKICAgICAgICAkY29sb3IgPSAkdGhpcy0+YXNzZXJ0Q29sb3IoJGFyZ3NbMF0sICdjb2xvcicpOwogICAgICAgICRoc2wgPSAkdGhpcy0+dG9IU0woJGNvbG9yWzFdLCAkY29sb3JbMl0sICRjb2xvclszXSk7CgogICAgICAgIHJldHVybiBuZXcgTnVtYmVyKCRoc2xbMl0sICclJyk7CiAgICB9CgogICAgcHJvdGVjdGVkIHN0YXRpYyAkbGliTGlnaHRuZXNzID0gWydjb2xvciddOwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGxpYkxpZ2h0bmVzcygkYXJncykKICAgIHsKICAgICAgICAkY29sb3IgPSAkdGhpcy0+YXNzZXJ0Q29sb3IoJGFyZ3NbMF0sICdjb2xvcicpOwogICAgICAgICRoc2wgPSAkdGhpcy0+dG9IU0woJGNvbG9yWzFdLCAkY29sb3JbMl0sICRjb2xvclszXSk7CgogICAgICAgIHJldHVybiBuZXcgTnVtYmVyKCRoc2xbM10sICclJyk7CiAgICB9CgogICAgLyoKICAgICAqIFRvZG8gOiBhIGludGVncmVyIGRhbnMgbGUgZnV0dXIgbW9kdWxlIGNvbG9yCiAgICBwcm90ZWN0ZWQgc3RhdGljICRsaWJId2IgPSBbCiAgICAgICAgWydjaGFubmVscyddLAogICAgICAgIFsnaHVlJywgJ3doaXRlbmVzcycsICdibGFja25lc3MnXSwKICAgICAgICBbJ2h1ZScsICd3aGl0ZW5lc3MnLCAnYmxhY2tuZXNzJywgJ2FscGhhJ10gXTsKICAgIHByb3RlY3RlZCBmdW5jdGlvbiBsaWJId2IoJGFyZ3MsICRrd2FyZ3MsICRmdW5jTmFtZSA9ICdod2InKQogICAgewogICAgICAgICRhcmdzX3RvX2NoZWNrID0gJGFyZ3M7CgogICAgICAgIGlmIChcY291bnQoJGFyZ3MpID09IDEpIHsKICAgICAgICAgICAgaWYgKCRhcmdzWzBdWzBdICE9PSBUeXBlOjpUX0xJU1QpIHsKICAgICAgICAgICAgICAgIHRocm93ICR0aGlzLT5lcnJvcigiTWlzc2luZyBlbGVtZW50cyBcJHdoaXRlbmVzcyBhbmQgXCRibGFja25lc3MiKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKFx0cmltKCRhcmdzWzBdWzFdKSkgewogICAgICAgICAgICAgICAgdGhyb3cgJHRoaXMtPmVycm9yKCJcJGNoYW5uZWxzIG11c3QgYmUgYSBzcGFjZS1zZXBhcmF0ZWQgbGlzdC4iKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCEgZW1wdHkoJGFyZ3NbMF1bJ2VuY2xvc2luZyddKSkgewogICAgICAgICAgICAgICAgdGhyb3cgJHRoaXMtPmVycm9yKCJcJGNoYW5uZWxzIG11c3QgYmUgYW4gdW5icmFja2V0ZWQgbGlzdC4iKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJGFyZ3MgPSAkYXJnc1swXVsyXTsKICAgICAgICAgICAgaWYgKFxjb3VudCgkYXJncykgPiAzKSB7CiAgICAgICAgICAgICAgICB0aHJvdyAkdGhpcy0+ZXJyb3IoImh3YigpIDogT25seSAzIGVsZW1lbnRzIGFyZSBhbGxvd2VkIGJ1dCAiLiBcY291bnQoJGFyZ3MpIC4gIndlcmUgcGFzc2VkIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRhcmdzX3RvX2NoZWNrID0gJHRoaXMtPmV4dHJhY3RTbGFzaEFscGhhSW5Db2xvckZ1bmN0aW9uKCRrd2FyZ3NbJ2NoYW5uZWxzJ11bMl0pOwogICAgICAgICAgICBpZiAoXGNvdW50KCRhcmdzX3RvX2NoZWNrKSAhPT0gXGNvdW50KCRrd2FyZ3NbJ2NoYW5uZWxzJ11bMl0pKSB7CiAgICAgICAgICAgICAgICAkYXJncyA9ICRhcmdzX3RvX2NoZWNrOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoXGNvdW50KCRhcmdzX3RvX2NoZWNrKSA8IDIpIHsKICAgICAgICAgICAgdGhyb3cgJHRoaXMtPmVycm9yKCJNaXNzaW5nIGVsZW1lbnRzIFwkd2hpdGVuZXNzIGFuZCBcJGJsYWNrbmVzcyIpOwogICAgICAgIH0KICAgICAgICBpZiAoXGNvdW50KCRhcmdzX3RvX2NoZWNrKSA8IDMpIHsKICAgICAgICAgICAgdGhyb3cgJHRoaXMtPmVycm9yKCJNaXNzaW5nIGVsZW1lbnQgXCRibGFja25lc3MiKTsKICAgICAgICB9CiAgICAgICAgaWYgKFxjb3VudCgkYXJnc190b19jaGVjaykgPiA0KSB7CiAgICAgICAgICAgIHRocm93ICR0aGlzLT5lcnJvcigiaHdiKCkgOiBPbmx5IDQgZWxlbWVudHMgYXJlIGFsbG93ZWQgYnV0ICIuIFxjb3VudCgkYXJncykgLiAid2VyZSBwYXNzZWQiKTsKICAgICAgICB9CgogICAgICAgIGZvcmVhY2ggKCRrd2FyZ3MgYXMgJGsgPT4gJGFyZykgewogICAgICAgICAgICBpZiAoaW5fYXJyYXkoJGFyZ1swXSwgW1R5cGU6OlRfRlVOQ1RJT05fQ0FMTF0pICYmIGluX2FycmF5KCRhcmdbMV0sIFsnbWluJywgJ21heCddKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGZvcmVhY2ggKCRhcmdzX3RvX2NoZWNrIGFzICRrID0+ICRhcmcpIHsKICAgICAgICAgICAgaWYgKGluX2FycmF5KCRhcmdbMF0sIFtUeXBlOjpUX0ZVTkNUSU9OX0NBTExdKSAmJiBpbl9hcnJheSgkYXJnWzFdLCBbJ21pbicsICdtYXgnXSkpIHsKICAgICAgICAgICAgICAgIGlmIChjb3VudCgka3dhcmdzKSA+IDEgfHwgKCRrID49IDIgJiYgY291bnQoJGFyZ3MpID09PSA0KSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRhcmdzWyRrXSA9ICR0aGlzLT5zdHJpbmdpZnlGbmNhbGxBcmdzKCRhcmcpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAkayA+PSAyICYmIGNvdW50KCRhcmdzKSA9PT0gNCAmJgogICAgICAgICAgICAgICAgaW5fYXJyYXkoJGFyZ1swXSwgW1R5cGU6OlRfRlVOQ1RJT05fQ0FMTCwgVHlwZTo6VF9GVU5DVElPTl0pICYmCiAgICAgICAgICAgICAgICBpbl9hcnJheSgkYXJnWzFdLCBbJ2NhbGMnLCdlbnYnXSkKICAgICAgICAgICAgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJGh1ZSA9ICR0aGlzLT5yZWR1Y2UoJGFyZ3NbMF0pOwogICAgICAgICR3aGl0ZW5lc3MgPSAkdGhpcy0+cmVkdWNlKCRhcmdzWzFdKTsKICAgICAgICAkYmxhY2tuZXNzID0gJHRoaXMtPnJlZHVjZSgkYXJnc1syXSk7CiAgICAgICAgJGFscGhhID0gbnVsbDsKCiAgICAgICAgaWYgKFxjb3VudCgkYXJncykgPT09IDQpIHsKICAgICAgICAgICAgJGFscGhhID0gJHRoaXMtPmNvbXBpbGVDb2xvclBhcnRWYWx1ZSgkYXJnc1szXSwgMCwgMSwgZmFsc2UpOwoKICAgICAgICAgICAgaWYgKCEgXGlzX251bWVyaWMoJGFscGhhKSkgewogICAgICAgICAgICAgICAgJHZhbCA9ICR0aGlzLT5jb21waWxlVmFsdWUoJGFyZ3NbM10pOwogICAgICAgICAgICAgICAgdGhyb3cgJHRoaXMtPmVycm9yKCJcJGFscGhhOiAkdmFsIGlzIG5vdCBhIG51bWJlciIpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkdGhpcy0+YXNzZXJ0TnVtYmVyKCRodWUsICdodWUnKTsKICAgICAgICAkdGhpcy0+YXNzZXJ0VW5pdCgkd2hpdGVuZXNzLCBbJyUnXSwgJ3doaXRlbmVzcycpOwogICAgICAgICR0aGlzLT5hc3NlcnRVbml0KCRibGFja25lc3MsIFsnJSddLCAnYmxhY2tuZXNzJyk7CgogICAgICAgICR0aGlzLT5hc3NlcnRSYW5nZSgkd2hpdGVuZXNzLCAwLCAxMDAsICIwJSBhbmQgMTAwJSIsICJ3aGl0ZW5lc3MiKTsKICAgICAgICAkdGhpcy0+YXNzZXJ0UmFuZ2UoJGJsYWNrbmVzcywgMCwgMTAwLCAiMCUgYW5kIDEwMCUiLCAiYmxhY2tuZXNzIik7CgogICAgICAgICR3ID0gJHdoaXRlbmVzcy0+Z2V0RGltZW5zaW9uKCk7CiAgICAgICAgJGIgPSAkYmxhY2tuZXNzLT5nZXREaW1lbnNpb24oKTsKCiAgICAgICAgJGh1ZVZhbHVlID0gJGh1ZS0+Z2V0RGltZW5zaW9uKCkgJSAzNjA7CgogICAgICAgIHdoaWxlICgkaHVlVmFsdWUgPCAwKSB7CiAgICAgICAgICAgICRodWVWYWx1ZSArPSAzNjA7CiAgICAgICAgfQoKICAgICAgICAkY29sb3IgPSAkdGhpcy0+SFdCdG9SR0IoJGh1ZVZhbHVlLCAkdywgJGIpOwoKICAgICAgICBpZiAoISBcaXNfbnVsbCgkYWxwaGEpKSB7CiAgICAgICAgICAgICRjb2xvcls0XSA9ICRhbHBoYTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkY29sb3I7CiAgICB9CgogICAgcHJvdGVjdGVkIHN0YXRpYyAkbGliV2hpdGVuZXNzID0gWydjb2xvciddOwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGxpYldoaXRlbmVzcygkYXJncywgJGt3YXJncywgJGZ1bmNOYW1lID0gJ3doaXRlbmVzcycpIHsKCiAgICAgICAgJGNvbG9yID0gJHRoaXMtPmFzc2VydENvbG9yKCRhcmdzWzBdKTsKICAgICAgICAkaHdiID0gJHRoaXMtPlJHQnRvSFdCKCRjb2xvclsxXSwgJGNvbG9yWzJdLCAkY29sb3JbM10pOwoKICAgICAgICByZXR1cm4gbmV3IE51bWJlcigkaHdiWzJdLCAnJScpOwogICAgfQoKICAgIHByb3RlY3RlZCBzdGF0aWMgJGxpYkJsYWNrbmVzcyA9IFsnY29sb3InXTsKICAgIHByb3RlY3RlZCBmdW5jdGlvbiBsaWJCbGFja25lc3MoJGFyZ3MsICRrd2FyZ3MsICRmdW5jTmFtZSA9ICdibGFja25lc3MnKSB7CgogICAgICAgICRjb2xvciA9ICR0aGlzLT5hc3NlcnRDb2xvcigkYXJnc1swXSk7CiAgICAgICAgJGh3YiA9ICR0aGlzLT5SR0J0b0hXQigkY29sb3JbMV0sICRjb2xvclsyXSwgJGNvbG9yWzNdKTsKCiAgICAgICAgcmV0dXJuIG5ldyBOdW1iZXIoJGh3YlszXSwgJyUnKTsKICAgIH0KICAgICovCgogICAgLyoqCiAgICAgKiBAcGFyYW0gYXJyYXkgICAgICRjb2xvcgogICAgICogQHBhcmFtIGludCAgICAgICAkaWR4CiAgICAgKiBAcGFyYW0gaW50fGZsb2F0ICRhbW91bnQKICAgICAqCiAgICAgKiBAcmV0dXJuIGFycmF5CiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBhZGp1c3RIc2woJGNvbG9yLCAkaWR4LCAkYW1vdW50KQogICAgewogICAgICAgICRoc2wgPSAkdGhpcy0+dG9IU0woJGNvbG9yWzFdLCAkY29sb3JbMl0sICRjb2xvclszXSk7CiAgICAgICAgJGhzbFskaWR4XSArPSAkYW1vdW50OwoKICAgICAgICBpZiAoJGlkeCAhPT0gMSkgewogICAgICAgICAgICAvLyBDbGFtcCB0aGUgc2F0dXJhdGlvbiBhbmQgbGlnaHRuZXNzCiAgICAgICAgICAgICRoc2xbJGlkeF0gPSBtaW4obWF4KDAsICRoc2xbJGlkeF0pLCAxMDApOwogICAgICAgIH0KCiAgICAgICAgJG91dCA9ICR0aGlzLT50b1JHQigkaHNsWzFdLCAkaHNsWzJdLCAkaHNsWzNdKTsKCiAgICAgICAgaWYgKGlzc2V0KCRjb2xvcls0XSkpIHsKICAgICAgICAgICAgJG91dFs0XSA9ICRjb2xvcls0XTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkb3V0OwogICAgfQoKICAgIHByb3RlY3RlZCBzdGF0aWMgJGxpYkFkanVzdEh1ZSA9IFsnY29sb3InLCAnZGVncmVlcyddOwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGxpYkFkanVzdEh1ZSgkYXJncykKICAgIHsKICAgICAgICAkY29sb3IgPSAkdGhpcy0+YXNzZXJ0Q29sb3IoJGFyZ3NbMF0sICdjb2xvcicpOwogICAgICAgICRkZWdyZWVzID0gJHRoaXMtPmFzc2VydE51bWJlcigkYXJnc1sxXSwgJ2RlZ3JlZXMnKS0+Z2V0RGltZW5zaW9uKCk7CgogICAgICAgIHJldHVybiAkdGhpcy0+YWRqdXN0SHNsKCRjb2xvciwgMSwgJGRlZ3JlZXMpOwogICAgfQoKICAgIHByb3RlY3RlZCBzdGF0aWMgJGxpYkxpZ2h0ZW4gPSBbJ2NvbG9yJywgJ2Ftb3VudCddOwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGxpYkxpZ2h0ZW4oJGFyZ3MpCiAgICB7CiAgICAgICAgJGNvbG9yID0gJHRoaXMtPmFzc2VydENvbG9yKCRhcmdzWzBdLCAnY29sb3InKTsKICAgICAgICAkYW1vdW50ID0gVXRpbDo6Y2hlY2tSYW5nZSgnYW1vdW50JywgbmV3IFJhbmdlKDAsIDEwMCksICRhcmdzWzFdLCAnJScpOwoKICAgICAgICByZXR1cm4gJHRoaXMtPmFkanVzdEhzbCgkY29sb3IsIDMsICRhbW91bnQpOwogICAgfQoKICAgIHByb3RlY3RlZCBzdGF0aWMgJGxpYkRhcmtlbiA9IFsnY29sb3InLCAnYW1vdW50J107CiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gbGliRGFya2VuKCRhcmdzKQogICAgewogICAgICAgICRjb2xvciA9ICR0aGlzLT5hc3NlcnRDb2xvcigkYXJnc1swXSwgJ2NvbG9yJyk7CiAgICAgICAgJGFtb3VudCA9IFV0aWw6OmNoZWNrUmFuZ2UoJ2Ftb3VudCcsIG5ldyBSYW5nZSgwLCAxMDApLCAkYXJnc1sxXSwgJyUnKTsKCiAgICAgICAgcmV0dXJuICR0aGlzLT5hZGp1c3RIc2woJGNvbG9yLCAzLCAtJGFtb3VudCk7CiAgICB9CgogICAgcHJvdGVjdGVkIHN0YXRpYyAkbGliU2F0dXJhdGUgPSBbWydjb2xvcicsICdhbW91bnQnXSwgWydhbW91bnQnXV07CiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gbGliU2F0dXJhdGUoJGFyZ3MpCiAgICB7CiAgICAgICAgJHZhbHVlID0gJGFyZ3NbMF07CgogICAgICAgIGlmIChjb3VudCgkYXJncykgPT09IDEpIHsKICAgICAgICAgICAgJHRoaXMtPmFzc2VydE51bWJlcigkYXJnc1swXSwgJ2Ftb3VudCcpOwoKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQoKICAgICAgICAkY29sb3IgPSAkdGhpcy0+YXNzZXJ0Q29sb3IoJGFyZ3NbMF0sICdjb2xvcicpOwogICAgICAgICRhbW91bnQgPSAkdGhpcy0+YXNzZXJ0TnVtYmVyKCRhcmdzWzFdLCAnYW1vdW50Jyk7CgogICAgICAgIHJldHVybiAkdGhpcy0+YWRqdXN0SHNsKCRjb2xvciwgMiwgJGFtb3VudC0+dmFsdWVJblJhbmdlKDAsIDEwMCwgJ2Ftb3VudCcpKTsKICAgIH0KCiAgICBwcm90ZWN0ZWQgc3RhdGljICRsaWJEZXNhdHVyYXRlID0gWydjb2xvcicsICdhbW91bnQnXTsKICAgIHByb3RlY3RlZCBmdW5jdGlvbiBsaWJEZXNhdHVyYXRlKCRhcmdzKQogICAgewogICAgICAgICRjb2xvciA9ICR0aGlzLT5hc3NlcnRDb2xvcigkYXJnc1swXSwgJ2NvbG9yJyk7CiAgICAgICAgJGFtb3VudCA9ICR0aGlzLT5hc3NlcnROdW1iZXIoJGFyZ3NbMV0sICdhbW91bnQnKTsKCiAgICAgICAgcmV0dXJuICR0aGlzLT5hZGp1c3RIc2woJGNvbG9yLCAyLCAtJGFtb3VudC0+dmFsdWVJblJhbmdlKDAsIDEwMCwgJ2Ftb3VudCcpKTsKICAgIH0KCiAgICBwcm90ZWN0ZWQgc3RhdGljICRsaWJHcmF5c2NhbGUgPSBbJ2NvbG9yJ107CiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gbGliR3JheXNjYWxlKCRhcmdzKQogICAgewogICAgICAgICR2YWx1ZSA9ICRhcmdzWzBdOwoKICAgICAgICBpZiAoJHZhbHVlIGluc3RhbmNlb2YgTnVtYmVyKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICR0aGlzLT5hZGp1c3RIc2woJHRoaXMtPmFzc2VydENvbG9yKCR2YWx1ZSwgJ2NvbG9yJyksIDIsIC0xMDApOwogICAgfQoKICAgIHByb3RlY3RlZCBzdGF0aWMgJGxpYkNvbXBsZW1lbnQgPSBbJ2NvbG9yJ107CiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gbGliQ29tcGxlbWVudCgkYXJncykKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmFkanVzdEhzbCgkdGhpcy0+YXNzZXJ0Q29sb3IoJGFyZ3NbMF0sICdjb2xvcicpLCAxLCAxODApOwogICAgfQoKICAgIHByb3RlY3RlZCBzdGF0aWMgJGxpYkludmVydCA9IFsnY29sb3InLCAnd2VpZ2h0OjEwMCUnXTsKICAgIHByb3RlY3RlZCBmdW5jdGlvbiBsaWJJbnZlcnQoJGFyZ3MpCiAgICB7CiAgICAgICAgJHZhbHVlID0gJGFyZ3NbMF07CgogICAgICAgICR3ZWlnaHQgPSAkdGhpcy0+YXNzZXJ0TnVtYmVyKCRhcmdzWzFdLCAnd2VpZ2h0Jyk7CgogICAgICAgIGlmICgkdmFsdWUgaW5zdGFuY2VvZiBOdW1iZXIpIHsKICAgICAgICAgICAgaWYgKCR3ZWlnaHQtPmdldERpbWVuc2lvbigpICE9IDEwMCB8fCAhJHdlaWdodC0+aGFzVW5pdCgnJScpKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2Fzc1NjcmlwdEV4Y2VwdGlvbignT25seSBvbmUgYXJndW1lbnQgbWF5IGJlIHBhc3NlZCB0byB0aGUgcGxhaW4tQ1NTIGludmVydCgpIGZ1bmN0aW9uLicpOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CgogICAgICAgICRjb2xvciA9ICR0aGlzLT5hc3NlcnRDb2xvcigkdmFsdWUsICdjb2xvcicpOwogICAgICAgICRpbnZlcnRlZCA9ICRjb2xvcjsKICAgICAgICAkaW52ZXJ0ZWRbMV0gPSAyNTUgLSAkaW52ZXJ0ZWRbMV07CiAgICAgICAgJGludmVydGVkWzJdID0gMjU1IC0gJGludmVydGVkWzJdOwogICAgICAgICRpbnZlcnRlZFszXSA9IDI1NSAtICRpbnZlcnRlZFszXTsKCiAgICAgICAgcmV0dXJuICR0aGlzLT5saWJNaXgoWyRpbnZlcnRlZCwgJGNvbG9yLCAkd2VpZ2h0XSk7CiAgICB9CgogICAgLy8gaW5jcmVhc2VzIG9wYWNpdHkgYnkgYW1vdW50CiAgICBwcm90ZWN0ZWQgc3RhdGljICRsaWJPcGFjaWZ5ID0gWydjb2xvcicsICdhbW91bnQnXTsKICAgIHByb3RlY3RlZCBmdW5jdGlvbiBsaWJPcGFjaWZ5KCRhcmdzKQogICAgewogICAgICAgICRjb2xvciA9ICR0aGlzLT5hc3NlcnRDb2xvcigkYXJnc1swXSwgJ2NvbG9yJyk7CiAgICAgICAgJGFtb3VudCA9ICR0aGlzLT5hc3NlcnROdW1iZXIoJGFyZ3NbMV0sICdhbW91bnQnKTsKCiAgICAgICAgJGNvbG9yWzRdID0gKGlzc2V0KCRjb2xvcls0XSkgPyAkY29sb3JbNF0gOiAxKSArICRhbW91bnQtPnZhbHVlSW5SYW5nZVdpdGhVbml0KDAsIDEsICdhbW91bnQnLCAnJyk7CiAgICAgICAgJGNvbG9yWzRdID0gbWluKDEsIG1heCgwLCAkY29sb3JbNF0pKTsKCiAgICAgICAgcmV0dXJuICRjb2xvcjsKICAgIH0KCiAgICBwcm90ZWN0ZWQgc3RhdGljICRsaWJGYWRlSW4gPSBbJ2NvbG9yJywgJ2Ftb3VudCddOwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGxpYkZhZGVJbigkYXJncykKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmxpYk9wYWNpZnkoJGFyZ3MpOwogICAgfQoKICAgIC8vIGRlY3JlYXNlcyBvcGFjaXR5IGJ5IGFtb3VudAogICAgcHJvdGVjdGVkIHN0YXRpYyAkbGliVHJhbnNwYXJlbnRpemUgPSBbJ2NvbG9yJywgJ2Ftb3VudCddOwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGxpYlRyYW5zcGFyZW50aXplKCRhcmdzKQogICAgewogICAgICAgICRjb2xvciA9ICR0aGlzLT5hc3NlcnRDb2xvcigkYXJnc1swXSwgJ2NvbG9yJyk7CiAgICAgICAgJGFtb3VudCA9ICR0aGlzLT5hc3NlcnROdW1iZXIoJGFyZ3NbMV0sICdhbW91bnQnKTsKCiAgICAgICAgJGNvbG9yWzRdID0gKGlzc2V0KCRjb2xvcls0XSkgPyAkY29sb3JbNF0gOiAxKSAtICRhbW91bnQtPnZhbHVlSW5SYW5nZVdpdGhVbml0KDAsIDEsICdhbW91bnQnLCAnJyk7CiAgICAgICAgJGNvbG9yWzRdID0gbWluKDEsIG1heCgwLCAkY29sb3JbNF0pKTsKCiAgICAgICAgcmV0dXJuICRjb2xvcjsKICAgIH0KCiAgICBwcm90ZWN0ZWQgc3RhdGljICRsaWJGYWRlT3V0ID0gWydjb2xvcicsICdhbW91bnQnXTsKICAgIHByb3RlY3RlZCBmdW5jdGlvbiBsaWJGYWRlT3V0KCRhcmdzKQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+bGliVHJhbnNwYXJlbnRpemUoJGFyZ3MpOwogICAgfQoKICAgIHByb3RlY3RlZCBzdGF0aWMgJGxpYlVucXVvdGUgPSBbJ3N0cmluZyddOwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGxpYlVucXVvdGUoJGFyZ3MpCiAgICB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgJHN0ciA9ICR0aGlzLT5hc3NlcnRTdHJpbmcoJGFyZ3NbMF0sICdzdHJpbmcnKTsKICAgICAgICB9IGNhdGNoIChTYXNzU2NyaXB0RXhjZXB0aW9uICRlKSB7CiAgICAgICAgICAgICR2YWx1ZSA9ICR0aGlzLT5jb21waWxlVmFsdWUoJGFyZ3NbMF0pOwogICAgICAgICAgICAkZm5hbWUgPSAkdGhpcy0+Z2V0UHJldHR5UGF0aCgkdGhpcy0+c291cmNlTmFtZXNbJHRoaXMtPnNvdXJjZUluZGV4XSk7CiAgICAgICAgICAgICRsaW5lICA9ICR0aGlzLT5zb3VyY2VMaW5lOwoKICAgICAgICAgICAgJG1lc3NhZ2UgPSAiUGFzc2luZyAkdmFsdWUsIGEgbm9uLXN0cmluZyB2YWx1ZSwgdG8gdW5xdW90ZSgpCndpbGwgYmUgYW4gZXJyb3IgaW4gZnV0dXJlIHZlcnNpb25zIG9mIFNhc3MuXG4gICAgICAgICBvbiBsaW5lICRsaW5lIG9mICRmbmFtZSI7CgogICAgICAgICAgICAkdGhpcy0+bG9nZ2VyLT53YXJuKCRtZXNzYWdlLCB0cnVlKTsKCiAgICAgICAgICAgIHJldHVybiAkYXJnc1swXTsKICAgICAgICB9CgogICAgICAgICRzdHJbMV0gPSAnJzsKCiAgICAgICAgcmV0dXJuICRzdHI7CiAgICB9CgogICAgcHJvdGVjdGVkIHN0YXRpYyAkbGliUXVvdGUgPSBbJ3N0cmluZyddOwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGxpYlF1b3RlKCRhcmdzKQogICAgewogICAgICAgICR2YWx1ZSA9ICR0aGlzLT5hc3NlcnRTdHJpbmcoJGFyZ3NbMF0sICdzdHJpbmcnKTsKCiAgICAgICAgJHZhbHVlWzFdID0gJyInOwoKICAgICAgICByZXR1cm4gJHZhbHVlOwogICAgfQoKICAgIHByb3RlY3RlZCBzdGF0aWMgJGxpYlBlcmNlbnRhZ2UgPSBbJ251bWJlciddOwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGxpYlBlcmNlbnRhZ2UoJGFyZ3MpCiAgICB7CiAgICAgICAgJG51bSA9ICR0aGlzLT5hc3NlcnROdW1iZXIoJGFyZ3NbMF0sICdudW1iZXInKTsKICAgICAgICAkbnVtLT5hc3NlcnROb1VuaXRzKCdudW1iZXInKTsKCiAgICAgICAgcmV0dXJuIG5ldyBOdW1iZXIoJG51bS0+Z2V0RGltZW5zaW9uKCkgKiAxMDAsICclJyk7CiAgICB9CgogICAgcHJvdGVjdGVkIHN0YXRpYyAkbGliUm91bmQgPSBbJ251bWJlciddOwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGxpYlJvdW5kKCRhcmdzKQogICAgewogICAgICAgICRudW0gPSAkdGhpcy0+YXNzZXJ0TnVtYmVyKCRhcmdzWzBdLCAnbnVtYmVyJyk7CgogICAgICAgIHJldHVybiBuZXcgTnVtYmVyKHJvdW5kKCRudW0tPmdldERpbWVuc2lvbigpKSwgJG51bS0+Z2V0TnVtZXJhdG9yVW5pdHMoKSwgJG51bS0+Z2V0RGVub21pbmF0b3JVbml0cygpKTsKICAgIH0KCiAgICBwcm90ZWN0ZWQgc3RhdGljICRsaWJGbG9vciA9IFsnbnVtYmVyJ107CiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gbGliRmxvb3IoJGFyZ3MpCiAgICB7CiAgICAgICAgJG51bSA9ICR0aGlzLT5hc3NlcnROdW1iZXIoJGFyZ3NbMF0sICdudW1iZXInKTsKCiAgICAgICAgcmV0dXJuIG5ldyBOdW1iZXIoZmxvb3IoJG51bS0+Z2V0RGltZW5zaW9uKCkpLCAkbnVtLT5nZXROdW1lcmF0b3JVbml0cygpLCAkbnVtLT5nZXREZW5vbWluYXRvclVuaXRzKCkpOwogICAgfQoKICAgIHByb3RlY3RlZCBzdGF0aWMgJGxpYkNlaWwgPSBbJ251bWJlciddOwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGxpYkNlaWwoJGFyZ3MpCiAgICB7CiAgICAgICAgJG51bSA9ICR0aGlzLT5hc3NlcnROdW1iZXIoJGFyZ3NbMF0sICdudW1iZXInKTsKCiAgICAgICAgcmV0dXJuIG5ldyBOdW1iZXIoY2VpbCgkbnVtLT5nZXREaW1lbnNpb24oKSksICRudW0tPmdldE51bWVyYXRvclVuaXRzKCksICRudW0tPmdldERlbm9taW5hdG9yVW5pdHMoKSk7CiAgICB9CgogICAgcHJvdGVjdGVkIHN0YXRpYyAkbGliQWJzID0gWydudW1iZXInXTsKICAgIHByb3RlY3RlZCBmdW5jdGlvbiBsaWJBYnMoJGFyZ3MpCiAgICB7CiAgICAgICAgJG51bSA9ICR0aGlzLT5hc3NlcnROdW1iZXIoJGFyZ3NbMF0sICdudW1iZXInKTsKCiAgICAgICAgcmV0dXJuIG5ldyBOdW1iZXIoYWJzKCRudW0tPmdldERpbWVuc2lvbigpKSwgJG51bS0+Z2V0TnVtZXJhdG9yVW5pdHMoKSwgJG51bS0+Z2V0RGVub21pbmF0b3JVbml0cygpKTsKICAgIH0KCiAgICBwcm90ZWN0ZWQgc3RhdGljICRsaWJNaW4gPSBbJ251bWJlcnMuLi4nXTsKICAgIHByb3RlY3RlZCBmdW5jdGlvbiBsaWJNaW4oJGFyZ3MpCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHZhciBOdW1iZXJ8bnVsbAogICAgICAgICAqLwogICAgICAgICRtaW4gPSBudWxsOwoKICAgICAgICBmb3JlYWNoICgkYXJnc1swXVsyXSBhcyAkYXJnKSB7CiAgICAgICAgICAgICRudW1iZXIgPSAkdGhpcy0+YXNzZXJ0TnVtYmVyKCRhcmcpOwoKICAgICAgICAgICAgaWYgKFxpc19udWxsKCRtaW4pIHx8ICRtaW4tPmdyZWF0ZXJUaGFuKCRudW1iZXIpKSB7CiAgICAgICAgICAgICAgICAkbWluID0gJG51bWJlcjsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCFcaXNfbnVsbCgkbWluKSkgewogICAgICAgICAgICByZXR1cm4gJG1pbjsKICAgICAgICB9CgogICAgICAgIHRocm93ICR0aGlzLT5lcnJvcignQXQgbGVhc3Qgb25lIGFyZ3VtZW50IG11c3QgYmUgcGFzc2VkLicpOwogICAgfQoKICAgIHByb3RlY3RlZCBzdGF0aWMgJGxpYk1heCA9IFsnbnVtYmVycy4uLiddOwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGxpYk1heCgkYXJncykKICAgIHsKICAgICAgICAvKioKICAgICAgICAgKiBAdmFyIE51bWJlcnxudWxsCiAgICAgICAgICovCiAgICAgICAgJG1heCA9IG51bGw7CgogICAgICAgIGZvcmVhY2ggKCRhcmdzWzBdWzJdIGFzICRhcmcpIHsKICAgICAgICAgICAgJG51bWJlciA9ICR0aGlzLT5hc3NlcnROdW1iZXIoJGFyZyk7CgogICAgICAgICAgICBpZiAoXGlzX251bGwoJG1heCkgfHwgJG1heC0+bGVzc1RoYW4oJG51bWJlcikpIHsKICAgICAgICAgICAgICAgICRtYXggPSAkbnVtYmVyOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoIVxpc19udWxsKCRtYXgpKSB7CiAgICAgICAgICAgIHJldHVybiAkbWF4OwogICAgICAgIH0KCiAgICAgICAgdGhyb3cgJHRoaXMtPmVycm9yKCdBdCBsZWFzdCBvbmUgYXJndW1lbnQgbXVzdCBiZSBwYXNzZWQuJyk7CiAgICB9CgogICAgcHJvdGVjdGVkIHN0YXRpYyAkbGliTGVuZ3RoID0gWydsaXN0J107CiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gbGliTGVuZ3RoKCRhcmdzKQogICAgewogICAgICAgICRsaXN0ID0gJHRoaXMtPmNvZXJjZUxpc3QoJGFyZ3NbMF0sICcsJywgdHJ1ZSk7CgogICAgICAgIHJldHVybiBuZXcgTnVtYmVyKFxjb3VudCgkbGlzdFsyXSksICcnKTsKICAgIH0KCiAgICBwcm90ZWN0ZWQgc3RhdGljICRsaWJMaXN0U2VwYXJhdG9yID0gWydsaXN0J107CiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gbGliTGlzdFNlcGFyYXRvcigkYXJncykKICAgIHsKICAgICAgICBpZiAoISBcaW5fYXJyYXkoJGFyZ3NbMF1bMF0sIFtUeXBlOjpUX0xJU1QsIFR5cGU6OlRfTUFQXSkpIHsKICAgICAgICAgICAgcmV0dXJuIFtUeXBlOjpUX0tFWVdPUkQsICdzcGFjZSddOwogICAgICAgIH0KCiAgICAgICAgJGxpc3QgPSAkdGhpcy0+Y29lcmNlTGlzdCgkYXJnc1swXSk7CgogICAgICAgIGlmICgkbGlzdFsxXSA9PT0gJycgJiYgXGNvdW50KCRsaXN0WzJdKSA8PSAxICYmIGVtcHR5KCRsaXN0WydlbmNsb3NpbmcnXSkpIHsKICAgICAgICAgICAgcmV0dXJuIFtUeXBlOjpUX0tFWVdPUkQsICdzcGFjZSddOwogICAgICAgIH0KCiAgICAgICAgaWYgKCRsaXN0WzFdID09PSAnLCcpIHsKICAgICAgICAgICAgcmV0dXJuIFtUeXBlOjpUX0tFWVdPUkQsICdjb21tYSddOwogICAgICAgIH0KCiAgICAgICAgaWYgKCRsaXN0WzFdID09PSAnLycpIHsKICAgICAgICAgICAgcmV0dXJuIFtUeXBlOjpUX0tFWVdPUkQsICdzbGFzaCddOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIFtUeXBlOjpUX0tFWVdPUkQsICdzcGFjZSddOwogICAgfQoKICAgIHByb3RlY3RlZCBzdGF0aWMgJGxpYk50aCA9IFsnbGlzdCcsICduJ107CiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gbGliTnRoKCRhcmdzKQogICAgewogICAgICAgICRsaXN0ID0gJHRoaXMtPmNvZXJjZUxpc3QoJGFyZ3NbMF0sICcsJywgZmFsc2UpOwogICAgICAgICRuID0gJHRoaXMtPmFzc2VydEludGVnZXIoJGFyZ3NbMV0pOwoKICAgICAgICBpZiAoJG4gPiAwKSB7CiAgICAgICAgICAgICRuLS07CiAgICAgICAgfSBlbHNlaWYgKCRuIDwgMCkgewogICAgICAgICAgICAkbiArPSBcY291bnQoJGxpc3RbMl0pOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGlzc2V0KCRsaXN0WzJdWyRuXSkgPyAkbGlzdFsyXVskbl0gOiBzdGF0aWM6OiRkZWZhdWx0VmFsdWU7CiAgICB9CgogICAgcHJvdGVjdGVkIHN0YXRpYyAkbGliU2V0TnRoID0gWydsaXN0JywgJ24nLCAndmFsdWUnXTsKICAgIHByb3RlY3RlZCBmdW5jdGlvbiBsaWJTZXROdGgoJGFyZ3MpCiAgICB7CiAgICAgICAgJGxpc3QgPSAkdGhpcy0+Y29lcmNlTGlzdCgkYXJnc1swXSk7CiAgICAgICAgJG4gPSAkdGhpcy0+YXNzZXJ0SW50ZWdlcigkYXJnc1sxXSk7CgogICAgICAgIGlmICgkbiA+IDApIHsKICAgICAgICAgICAgJG4tLTsKICAgICAgICB9IGVsc2VpZiAoJG4gPCAwKSB7CiAgICAgICAgICAgICRuICs9IFxjb3VudCgkbGlzdFsyXSk7CiAgICAgICAgfQoKICAgICAgICBpZiAoISBpc3NldCgkbGlzdFsyXVskbl0pKSB7CiAgICAgICAgICAgIHRocm93ICR0aGlzLT5lcnJvcignSW52YWxpZCBhcmd1bWVudCBmb3IgIm4iJyk7CiAgICAgICAgfQoKICAgICAgICAkbGlzdFsyXVskbl0gPSAkYXJnc1syXTsKCiAgICAgICAgcmV0dXJuICRsaXN0OwogICAgfQoKICAgIHByb3RlY3RlZCBzdGF0aWMgJGxpYk1hcEdldCA9IFsnbWFwJywgJ2tleScsICdrZXlzLi4uJ107CiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gbGliTWFwR2V0KCRhcmdzKQogICAgewogICAgICAgICRtYXAgPSAkdGhpcy0+YXNzZXJ0TWFwKCRhcmdzWzBdLCAnbWFwJyk7CiAgICAgICAgaWYgKCFpc3NldCgkYXJnc1syXSkpIHsKICAgICAgICAgICAgLy8gQkMgbGF5ZXIgZm9yIHVzYWdlcyBvZiB0aGUgZnVuY3Rpb24gZnJvbSBQSFAgY29kZSByYXRoZXIgdGhhbiBmcm9tIHRoZSBTYXNzIGZ1bmN0aW9uCiAgICAgICAgICAgICRhcmdzWzJdID0gc2VsZjo6JGVtcHR5QXJndW1lbnRMaXN0OwogICAgICAgIH0KICAgICAgICAka2V5cyA9IGFycmF5X21lcmdlKFskYXJnc1sxXV0sICRhcmdzWzJdWzJdKTsKICAgICAgICAkdmFsdWUgPSBzdGF0aWM6OiRudWxsOwoKICAgICAgICBmb3JlYWNoICgka2V5cyBhcyAka2V5KSB7CiAgICAgICAgICAgIGlmICghXGlzX2FycmF5KCRtYXApIHx8ICRtYXBbMF0gIT09IFR5cGU6OlRfTUFQKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gc3RhdGljOjokbnVsbDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJG1hcCA9ICR0aGlzLT5tYXBHZXQoJG1hcCwgJGtleSk7CgogICAgICAgICAgICBpZiAoJG1hcCA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHN0YXRpYzo6JG51bGw7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICR2YWx1ZSA9ICRtYXA7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJHZhbHVlOwogICAgfQoKICAgIC8qKgogICAgICogR2V0cyB0aGUgdmFsdWUgY29ycmVzcG9uZGluZyB0byB0aGF0IGtleSBpbiB0aGUgbWFwCiAgICAgKgogICAgICogQHBhcmFtIGFycmF5ICAgICAgICAkbWFwCiAgICAgKiBAcGFyYW0gTnVtYmVyfGFycmF5ICRrZXkKICAgICAqCiAgICAgKiBAcmV0dXJuIE51bWJlcnxhcnJheXxudWxsCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gbWFwR2V0KGFycmF5ICRtYXAsICRrZXkpCiAgICB7CiAgICAgICAgJGluZGV4ID0gJHRoaXMtPm1hcEdldEVudHJ5SW5kZXgoJG1hcCwgJGtleSk7CgogICAgICAgIGlmICgkaW5kZXggIT09IG51bGwpIHsKICAgICAgICAgICAgcmV0dXJuICRtYXBbMl1bJGluZGV4XTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgIC8qKgogICAgICogR2V0cyB0aGUgaW5kZXggY29ycmVzcG9uZGluZyB0byB0aGF0IGtleSBpbiB0aGUgbWFwIGVudHJpZXMKICAgICAqCiAgICAgKiBAcGFyYW0gYXJyYXkgICAgICAgICRtYXAKICAgICAqIEBwYXJhbSBOdW1iZXJ8YXJyYXkgJGtleQogICAgICoKICAgICAqIEByZXR1cm4gaW50fG51bGwKICAgICAqLwogICAgcHJpdmF0ZSBmdW5jdGlvbiBtYXBHZXRFbnRyeUluZGV4KGFycmF5ICRtYXAsICRrZXkpCiAgICB7CiAgICAgICAgJGtleSA9ICR0aGlzLT5jb21waWxlU3RyaW5nQ29udGVudCgkdGhpcy0+Y29lcmNlU3RyaW5nKCRrZXkpKTsKCiAgICAgICAgZm9yICgkaSA9IFxjb3VudCgkbWFwWzFdKSAtIDE7ICRpID49IDA7ICRpLS0pIHsKICAgICAgICAgICAgaWYgKCRrZXkgPT09ICR0aGlzLT5jb21waWxlU3RyaW5nQ29udGVudCgkdGhpcy0+Y29lcmNlU3RyaW5nKCRtYXBbMV1bJGldKSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiAkaTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9CgogICAgcHJvdGVjdGVkIHN0YXRpYyAkbGliTWFwS2V5cyA9IFsnbWFwJ107CiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gbGliTWFwS2V5cygkYXJncykKICAgIHsKICAgICAgICAkbWFwID0gJHRoaXMtPmFzc2VydE1hcCgkYXJnc1swXSwgJ21hcCcpOwogICAgICAgICRrZXlzID0gJG1hcFsxXTsKCiAgICAgICAgcmV0dXJuIFtUeXBlOjpUX0xJU1QsICcsJywgJGtleXNdOwogICAgfQoKICAgIHByb3RlY3RlZCBzdGF0aWMgJGxpYk1hcFZhbHVlcyA9IFsnbWFwJ107CiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gbGliTWFwVmFsdWVzKCRhcmdzKQogICAgewogICAgICAgICRtYXAgPSAkdGhpcy0+YXNzZXJ0TWFwKCRhcmdzWzBdLCAnbWFwJyk7CiAgICAgICAgJHZhbHVlcyA9ICRtYXBbMl07CgogICAgICAgIHJldHVybiBbVHlwZTo6VF9MSVNULCAnLCcsICR2YWx1ZXNdOwogICAgfQoKICAgIHByb3RlY3RlZCBzdGF0aWMgJGxpYk1hcFJlbW92ZSA9IFsKICAgICAgICBbJ21hcCddLAogICAgICAgIFsnbWFwJywgJ2tleScsICdrZXlzLi4uJ10sCiAgICBdOwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGxpYk1hcFJlbW92ZSgkYXJncykKICAgIHsKICAgICAgICAkbWFwID0gJHRoaXMtPmFzc2VydE1hcCgkYXJnc1swXSwgJ21hcCcpOwoKICAgICAgICBpZiAoXGNvdW50KCRhcmdzKSA9PT0gMSkgewogICAgICAgICAgICByZXR1cm4gJG1hcDsKICAgICAgICB9CgogICAgICAgICRrZXlzID0gW107CiAgICAgICAgJGtleXNbXSA9ICR0aGlzLT5jb21waWxlU3RyaW5nQ29udGVudCgkdGhpcy0+Y29lcmNlU3RyaW5nKCRhcmdzWzFdKSk7CgogICAgICAgIGZvcmVhY2ggKCRhcmdzWzJdWzJdIGFzICRrZXkpIHsKICAgICAgICAgICAgJGtleXNbXSA9ICR0aGlzLT5jb21waWxlU3RyaW5nQ29udGVudCgkdGhpcy0+Y29lcmNlU3RyaW5nKCRrZXkpKTsKICAgICAgICB9CgogICAgICAgIGZvciAoJGkgPSBcY291bnQoJG1hcFsxXSkgLSAxOyAkaSA+PSAwOyAkaS0tKSB7CiAgICAgICAgICAgIGlmIChpbl9hcnJheSgkdGhpcy0+Y29tcGlsZVN0cmluZ0NvbnRlbnQoJHRoaXMtPmNvZXJjZVN0cmluZygkbWFwWzFdWyRpXSkpLCAka2V5cykpIHsKICAgICAgICAgICAgICAgIGFycmF5X3NwbGljZSgkbWFwWzFdLCAkaSwgMSk7CiAgICAgICAgICAgICAgICBhcnJheV9zcGxpY2UoJG1hcFsyXSwgJGksIDEpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJG1hcDsKICAgIH0KCiAgICBwcm90ZWN0ZWQgc3RhdGljICRsaWJNYXBIYXNLZXkgPSBbJ21hcCcsICdrZXknLCAna2V5cy4uLiddOwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGxpYk1hcEhhc0tleSgkYXJncykKICAgIHsKICAgICAgICAkbWFwID0gJHRoaXMtPmFzc2VydE1hcCgkYXJnc1swXSwgJ21hcCcpOwogICAgICAgIGlmICghaXNzZXQoJGFyZ3NbMl0pKSB7CiAgICAgICAgICAgIC8vIEJDIGxheWVyIGZvciB1c2FnZXMgb2YgdGhlIGZ1bmN0aW9uIGZyb20gUEhQIGNvZGUgcmF0aGVyIHRoYW4gZnJvbSB0aGUgU2FzcyBmdW5jdGlvbgogICAgICAgICAgICAkYXJnc1syXSA9IHNlbGY6OiRlbXB0eUFyZ3VtZW50TGlzdDsKICAgICAgICB9CiAgICAgICAgJGtleXMgPSBhcnJheV9tZXJnZShbJGFyZ3NbMV1dLCAkYXJnc1syXVsyXSk7CiAgICAgICAgJGxhc3RLZXkgPSBhcnJheV9wb3AoJGtleXMpOwoKICAgICAgICBmb3JlYWNoICgka2V5cyBhcyAka2V5KSB7CiAgICAgICAgICAgICR2YWx1ZSA9ICR0aGlzLT5tYXBHZXQoJG1hcCwgJGtleSk7CgogICAgICAgICAgICBpZiAoJHZhbHVlID09PSBudWxsIHx8ICR2YWx1ZSBpbnN0YW5jZW9mIE51bWJlciB8fCAkdmFsdWVbMF0gIT09IFR5cGU6OlRfTUFQKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZjo6JGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkbWFwID0gJHZhbHVlOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICR0aGlzLT50b0Jvb2woJHRoaXMtPm1hcEhhc0tleSgkbWFwLCAkbGFzdEtleSkpOwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIGFycmF5fE51bWJlciAka2V5VmFsdWUKICAgICAqCiAgICAgKiBAcmV0dXJuIGJvb2wKICAgICAqLwogICAgcHJpdmF0ZSBmdW5jdGlvbiBtYXBIYXNLZXkoYXJyYXkgJG1hcCwgJGtleVZhbHVlKQogICAgewogICAgICAgICRrZXkgPSAkdGhpcy0+Y29tcGlsZVN0cmluZ0NvbnRlbnQoJHRoaXMtPmNvZXJjZVN0cmluZygka2V5VmFsdWUpKTsKCiAgICAgICAgZm9yICgkaSA9IFxjb3VudCgkbWFwWzFdKSAtIDE7ICRpID49IDA7ICRpLS0pIHsKICAgICAgICAgICAgaWYgKCRrZXkgPT09ICR0aGlzLT5jb21waWxlU3RyaW5nQ29udGVudCgkdGhpcy0+Y29lcmNlU3RyaW5nKCRtYXBbMV1bJGldKSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgcHJvdGVjdGVkIHN0YXRpYyAkbGliTWFwTWVyZ2UgPSBbCiAgICAgICAgWydtYXAxJywgJ21hcDInXSwKICAgICAgICBbJ21hcC0xJywgJ21hcC0yJ10sCiAgICAgICAgWydtYXAxJywgJ2FyZ3MuLi4nXQogICAgXTsKICAgIHByb3RlY3RlZCBmdW5jdGlvbiBsaWJNYXBNZXJnZSgkYXJncykKICAgIHsKICAgICAgICAkbWFwMSA9ICR0aGlzLT5hc3NlcnRNYXAoJGFyZ3NbMF0sICdtYXAxJyk7CiAgICAgICAgJG1hcDIgPSAkYXJnc1sxXTsKICAgICAgICAka2V5cyA9IFtdOwogICAgICAgIGlmICgkbWFwMlswXSA9PT0gVHlwZTo6VF9MSVNUICYmIGlzc2V0KCRtYXAyWzNdKSAmJiBcaXNfYXJyYXkoJG1hcDJbM10pKSB7CiAgICAgICAgICAgIC8vIFRoaXMgaXMgYW4gYXJndW1lbnQgbGlzdCBmb3IgdGhlIHZhcmlhZGljIHNpZ25hdHVyZQogICAgICAgICAgICBpZiAoXGNvdW50KCRtYXAyWzJdKSA9PT0gMCkgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNhc3NTY3JpcHRFeGNlcHRpb24oJ0V4cGVjdGVkICRhcmdzIHRvIGNvbnRhaW4gYSBrZXkuJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKFxjb3VudCgkbWFwMlsyXSkgPT09IDEpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBTYXNzU2NyaXB0RXhjZXB0aW9uKCdFeHBlY3RlZCAkYXJncyB0byBjb250YWluIGEgdmFsdWUuJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJGtleXMgPSAkbWFwMlsyXTsKICAgICAgICAgICAgJG1hcDIgPSBhcnJheV9wb3AoJGtleXMpOwogICAgICAgIH0KICAgICAgICAkbWFwMiA9ICR0aGlzLT5hc3NlcnRNYXAoJG1hcDIsICdtYXAyJyk7CgogICAgICAgIHJldHVybiAkdGhpcy0+bW9kaWZ5TWFwKCRtYXAxLCAka2V5cywgZnVuY3Rpb24gKCRvbGRWYWx1ZSkgdXNlICgkbWFwMikgewogICAgICAgICAgICAkbmVzdGVkTWFwID0gJHRoaXMtPnRyeU1hcCgkb2xkVmFsdWUpOwoKICAgICAgICAgICAgaWYgKCRuZXN0ZWRNYXAgPT09IG51bGwpIHsKICAgICAgICAgICAgICAgIHJldHVybiAkbWFwMjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5tZXJnZU1hcHMoJG5lc3RlZE1hcCwgJG1hcDIpOwogICAgICAgIH0pOwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIGFycmF5ICAgICRtYXAKICAgICAqIEBwYXJhbSBhcnJheSAgICAka2V5cwogICAgICogQHBhcmFtIGNhbGxhYmxlICRtb2RpZnkKICAgICAqIEBwYXJhbSBib29sICAgICAkYWRkTmVzdGluZwogICAgICoKICAgICAqIEByZXR1cm4gTnVtYmVyfGFycmF5CiAgICAgKgogICAgICogQHBocHN0YW4tcGFyYW0gYXJyYXk8TnVtYmVyfGFycmF5PiAka2V5cwogICAgICogQHBocHN0YW4tcGFyYW0gY2FsbGFibGUoTnVtYmVyfGFycmF5KTogKE51bWJlcnxhcnJheSkgJG1vZGlmeQogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIG1vZGlmeU1hcChhcnJheSAkbWFwLCBhcnJheSAka2V5cywgY2FsbGFibGUgJG1vZGlmeSwgJGFkZE5lc3RpbmcgPSB0cnVlKQogICAgewogICAgICAgIGlmICgka2V5cyA9PT0gW10pIHsKICAgICAgICAgICAgcmV0dXJuICRtb2RpZnkoJG1hcCk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJHRoaXMtPm1vZGlmeU5lc3RlZE1hcCgkbWFwLCAka2V5cywgJG1vZGlmeSwgJGFkZE5lc3RpbmcpOwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIGFycmF5ICAgICRtYXAKICAgICAqIEBwYXJhbSBhcnJheSAgICAka2V5cwogICAgICogQHBhcmFtIGNhbGxhYmxlICRtb2RpZnkKICAgICAqIEBwYXJhbSBib29sICAgICAkYWRkTmVzdGluZwogICAgICoKICAgICAqIEByZXR1cm4gYXJyYXkKICAgICAqCiAgICAgKiBAcGhwc3Rhbi1wYXJhbSBub24tZW1wdHktYXJyYXk8TnVtYmVyfGFycmF5PiAka2V5cwogICAgICogQHBocHN0YW4tcGFyYW0gY2FsbGFibGUoTnVtYmVyfGFycmF5KTogKE51bWJlcnxhcnJheSkgJG1vZGlmeQogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIG1vZGlmeU5lc3RlZE1hcChhcnJheSAkbWFwLCBhcnJheSAka2V5cywgY2FsbGFibGUgJG1vZGlmeSwgJGFkZE5lc3RpbmcpCiAgICB7CiAgICAgICAgJGtleSA9IGFycmF5X3NoaWZ0KCRrZXlzKTsKCiAgICAgICAgJG5lc3RlZFZhbHVlSW5kZXggPSAkdGhpcy0+bWFwR2V0RW50cnlJbmRleCgkbWFwLCAka2V5KTsKCiAgICAgICAgaWYgKCRrZXlzID09PSBbXSkgewogICAgICAgICAgICBpZiAoJG5lc3RlZFZhbHVlSW5kZXggIT09IG51bGwpIHsKICAgICAgICAgICAgICAgICRtYXBbMl1bJG5lc3RlZFZhbHVlSW5kZXhdID0gJG1vZGlmeSgkbWFwWzJdWyRuZXN0ZWRWYWx1ZUluZGV4XSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkbWFwWzFdW10gPSAka2V5OwogICAgICAgICAgICAgICAgJG1hcFsyXVtdID0gJG1vZGlmeShzZWxmOjokbnVsbCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiAkbWFwOwogICAgICAgIH0KCiAgICAgICAgJG5lc3RlZE1hcCA9ICRuZXN0ZWRWYWx1ZUluZGV4ICE9PSBudWxsID8gJHRoaXMtPnRyeU1hcCgkbWFwWzJdWyRuZXN0ZWRWYWx1ZUluZGV4XSkgOiBudWxsOwoKICAgICAgICBpZiAoJG5lc3RlZE1hcCA9PT0gbnVsbCAmJiAhJGFkZE5lc3RpbmcpIHsKICAgICAgICAgICAgcmV0dXJuICRtYXA7CiAgICAgICAgfQoKICAgICAgICBpZiAoJG5lc3RlZE1hcCA9PT0gbnVsbCkgewogICAgICAgICAgICAkbmVzdGVkTWFwID0gc2VsZjo6JGVtcHR5TWFwOwogICAgICAgIH0KCiAgICAgICAgJG5ld05lc3RlZE1hcCA9ICR0aGlzLT5tb2RpZnlOZXN0ZWRNYXAoJG5lc3RlZE1hcCwgJGtleXMsICRtb2RpZnksICRhZGROZXN0aW5nKTsKCiAgICAgICAgaWYgKCRuZXN0ZWRWYWx1ZUluZGV4ICE9PSBudWxsKSB7CiAgICAgICAgICAgICRtYXBbMl1bJG5lc3RlZFZhbHVlSW5kZXhdID0gJG5ld05lc3RlZE1hcDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkbWFwWzFdW10gPSAka2V5OwogICAgICAgICAgICAkbWFwWzJdW10gPSAkbmV3TmVzdGVkTWFwOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRtYXA7CiAgICB9CgogICAgLyoqCiAgICAgKiBNZXJnZXMgMiBTYXNzIG1hcHMgdG9nZXRoZXIKICAgICAqCiAgICAgKiBAcGFyYW0gYXJyYXkgJG1hcDEKICAgICAqIEBwYXJhbSBhcnJheSAkbWFwMgogICAgICoKICAgICAqIEByZXR1cm4gYXJyYXkKICAgICAqLwogICAgcHJpdmF0ZSBmdW5jdGlvbiBtZXJnZU1hcHMoYXJyYXkgJG1hcDEsIGFycmF5ICRtYXAyKQogICAgewogICAgICAgIGZvcmVhY2ggKCRtYXAyWzFdIGFzICRpMiA9PiAka2V5MikgewogICAgICAgICAgICAkbWFwMUVudHJ5SW5kZXggPSAkdGhpcy0+bWFwR2V0RW50cnlJbmRleCgkbWFwMSwgJGtleTIpOwoKICAgICAgICAgICAgaWYgKCRtYXAxRW50cnlJbmRleCAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgJG1hcDFbMl1bJG1hcDFFbnRyeUluZGV4XSA9ICRtYXAyWzJdWyRpMl07CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJG1hcDFbMV1bXSA9ICRrZXkyOwogICAgICAgICAgICAkbWFwMVsyXVtdID0gJG1hcDJbMl1bJGkyXTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkbWFwMTsKICAgIH0KCiAgICBwcm90ZWN0ZWQgc3RhdGljICRsaWJLZXl3b3JkcyA9IFsnYXJncyddOwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGxpYktleXdvcmRzKCRhcmdzKQogICAgewogICAgICAgICR2YWx1ZSA9ICRhcmdzWzBdOwoKICAgICAgICBpZiAoJHZhbHVlWzBdICE9PSBUeXBlOjpUX0xJU1QgfHwgIWlzc2V0KCR2YWx1ZVszXSkgfHwgIVxpc19hcnJheSgkdmFsdWVbM10pKSB7CiAgICAgICAgICAgICRjb21waWxlZFZhbHVlID0gJHRoaXMtPmNvbXBpbGVWYWx1ZSgkdmFsdWUpOwoKICAgICAgICAgICAgdGhyb3cgU2Fzc1NjcmlwdEV4Y2VwdGlvbjo6Zm9yQXJndW1lbnQoJGNvbXBpbGVkVmFsdWUgLiAnIGlzIG5vdCBhbiBhcmd1bWVudCBsaXN0LicsICdhcmdzJyk7CiAgICAgICAgfQoKICAgICAgICAka2V5cyA9IFtdOwogICAgICAgICR2YWx1ZXMgPSBbXTsKCiAgICAgICAgZm9yZWFjaCAoJHRoaXMtPmdldEFyZ3VtZW50TGlzdEtleXdvcmRzKCR2YWx1ZSkgYXMgJG5hbWUgPT4gJGFyZykgewogICAgICAgICAgICAka2V5c1tdID0gW1R5cGU6OlRfS0VZV09SRCwgJG5hbWVdOwogICAgICAgICAgICAkdmFsdWVzW10gPSAkYXJnOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIFtUeXBlOjpUX01BUCwgJGtleXMsICR2YWx1ZXNdOwogICAgfQoKICAgIHByb3RlY3RlZCBzdGF0aWMgJGxpYklzQnJhY2tldGVkID0gWydsaXN0J107CiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gbGliSXNCcmFja2V0ZWQoJGFyZ3MpCiAgICB7CiAgICAgICAgJGxpc3QgPSAkYXJnc1swXTsKICAgICAgICAkdGhpcy0+Y29lcmNlTGlzdCgkbGlzdCwgJyAnKTsKCiAgICAgICAgaWYgKCEgZW1wdHkoJGxpc3RbJ2VuY2xvc2luZyddKSAmJiAkbGlzdFsnZW5jbG9zaW5nJ10gPT09ICdicmFja2V0JykgewogICAgICAgICAgICByZXR1cm4gc2VsZjo6JHRydWU7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gc2VsZjo6JGZhbHNlOwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIGFycmF5ICRsaXN0MQogICAgICogQHBhcmFtIGFycmF5fE51bWJlcnxudWxsICRzZXAKICAgICAqCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICogQHRocm93cyBDb21waWxlckV4Y2VwdGlvbgogICAgICoKICAgICAqIEBkZXByZWNhdGVkCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBsaXN0U2VwYXJhdG9yRm9ySm9pbigkbGlzdDEsICRzZXApCiAgICB7CiAgICAgICAgQHRyaWdnZXJfZXJyb3Ioc3ByaW50ZignVGhlICIlcyIgbWV0aG9kIGlzIGRlcHJlY2F0ZWQuJywgX19NRVRIT0RfXyksIEVfVVNFUl9ERVBSRUNBVEVEKTsKCiAgICAgICAgaWYgKCEgaXNzZXQoJHNlcCkpIHsKICAgICAgICAgICAgcmV0dXJuICRsaXN0MVsxXTsKICAgICAgICB9CgogICAgICAgIHN3aXRjaCAoJHRoaXMtPmNvbXBpbGVWYWx1ZSgkc2VwKSkgewogICAgICAgICAgICBjYXNlICdjb21tYSc6CiAgICAgICAgICAgICAgICByZXR1cm4gJywnOwoKICAgICAgICAgICAgY2FzZSAnc3BhY2UnOgogICAgICAgICAgICAgICAgcmV0dXJuICcgJzsKCiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICByZXR1cm4gJGxpc3QxWzFdOwogICAgICAgIH0KICAgIH0KCiAgICBwcm90ZWN0ZWQgc3RhdGljICRsaWJKb2luID0gWydsaXN0MScsICdsaXN0MicsICdzZXBhcmF0b3I6YXV0bycsICdicmFja2V0ZWQ6YXV0byddOwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGxpYkpvaW4oJGFyZ3MpCiAgICB7CiAgICAgICAgbGlzdCgkbGlzdDEsICRsaXN0MiwgJHNlcCwgJGJyYWNrZXRlZCkgPSAkYXJnczsKCiAgICAgICAgJGxpc3QxID0gJHRoaXMtPmNvZXJjZUxpc3QoJGxpc3QxLCAnICcsIHRydWUpOwogICAgICAgICRsaXN0MiA9ICR0aGlzLT5jb2VyY2VMaXN0KCRsaXN0MiwgJyAnLCB0cnVlKTsKCiAgICAgICAgc3dpdGNoICgkdGhpcy0+Y29tcGlsZVN0cmluZ0NvbnRlbnQoJHRoaXMtPmFzc2VydFN0cmluZygkc2VwLCAnc2VwYXJhdG9yJykpKSB7CiAgICAgICAgICAgIGNhc2UgJ2NvbW1hJzoKICAgICAgICAgICAgICAgICRzZXBhcmF0b3IgPSAnLCc7CiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgJ3NwYWNlJzoKICAgICAgICAgICAgICAgICRzZXBhcmF0b3IgPSAnICc7CiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgJ3NsYXNoJzoKICAgICAgICAgICAgICAgICRzZXBhcmF0b3IgPSAnLyc7CiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgJ2F1dG8nOgogICAgICAgICAgICAgICAgaWYgKCRsaXN0MVsxXSAhPT0gJycgfHwgY291bnQoJGxpc3QxWzJdKSA+IDEgfHwgIWVtcHR5KCRsaXN0MVsnZW5jbG9zaW5nJ10pICYmICRsaXN0MVsnZW5jbG9zaW5nJ10gIT09ICdwYXJlbnQnKSB7CiAgICAgICAgICAgICAgICAgICAgJHNlcGFyYXRvciA9ICRsaXN0MVsxXSA/OiAnICc7CiAgICAgICAgICAgICAgICB9IGVsc2VpZiAoJGxpc3QyWzFdICE9PSAnJyB8fCBjb3VudCgkbGlzdDJbMl0pID4gMSB8fCAhZW1wdHkoJGxpc3QyWydlbmNsb3NpbmcnXSkgJiYgJGxpc3QyWydlbmNsb3NpbmcnXSAhPT0gJ3BhcmVudCcpIHsKICAgICAgICAgICAgICAgICAgICAkc2VwYXJhdG9yID0gJGxpc3QyWzFdID86ICcgJzsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJHNlcGFyYXRvciA9ICcgJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIHRocm93IFNhc3NTY3JpcHRFeGNlcHRpb246OmZvckFyZ3VtZW50KCdNdXN0IGJlICJzcGFjZSIsICJjb21tYSIsICJzbGFzaCIsIG9yICJhdXRvIi4nLCAnc2VwYXJhdG9yJyk7CiAgICAgICAgfQoKICAgICAgICBpZiAoJGJyYWNrZXRlZCA9PT0gc3RhdGljOjokdHJ1ZSkgewogICAgICAgICAgICAkYnJhY2tldGVkID0gdHJ1ZTsKICAgICAgICB9IGVsc2VpZiAoJGJyYWNrZXRlZCA9PT0gc3RhdGljOjokZmFsc2UpIHsKICAgICAgICAgICAgJGJyYWNrZXRlZCA9IGZhbHNlOwogICAgICAgIH0gZWxzZWlmICgkYnJhY2tldGVkID09PSBbVHlwZTo6VF9LRVlXT1JELCAnYXV0byddKSB7CiAgICAgICAgICAgICRicmFja2V0ZWQgPSAnYXV0byc7CiAgICAgICAgfSBlbHNlaWYgKCRicmFja2V0ZWQgPT09IHN0YXRpYzo6JG51bGwpIHsKICAgICAgICAgICAgJGJyYWNrZXRlZCA9IGZhbHNlOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRicmFja2V0ZWQgPSAkdGhpcy0+Y29tcGlsZVZhbHVlKCRicmFja2V0ZWQpOwogICAgICAgICAgICAkYnJhY2tldGVkID0gISAhICRicmFja2V0ZWQ7CgogICAgICAgICAgICBpZiAoJGJyYWNrZXRlZCA9PT0gdHJ1ZSkgewogICAgICAgICAgICAgICAgJGJyYWNrZXRlZCA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICgkYnJhY2tldGVkID09PSAnYXV0bycpIHsKICAgICAgICAgICAgJGJyYWNrZXRlZCA9IGZhbHNlOwoKICAgICAgICAgICAgaWYgKCEgZW1wdHkoJGxpc3QxWydlbmNsb3NpbmcnXSkgJiYgJGxpc3QxWydlbmNsb3NpbmcnXSA9PT0gJ2JyYWNrZXQnKSB7CiAgICAgICAgICAgICAgICAkYnJhY2tldGVkID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJHJlcyA9IFtUeXBlOjpUX0xJU1QsICRzZXBhcmF0b3IsIGFycmF5X21lcmdlKCRsaXN0MVsyXSwgJGxpc3QyWzJdKV07CgogICAgICAgIGlmICgkYnJhY2tldGVkKSB7CiAgICAgICAgICAgICRyZXNbJ2VuY2xvc2luZyddID0gJ2JyYWNrZXQnOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRyZXM7CiAgICB9CgogICAgcHJvdGVjdGVkIHN0YXRpYyAkbGliQXBwZW5kID0gWydsaXN0JywgJ3ZhbCcsICdzZXBhcmF0b3I6YXV0byddOwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGxpYkFwcGVuZCgkYXJncykKICAgIHsKICAgICAgICBsaXN0KCRsaXN0MSwgJHZhbHVlLCAkc2VwKSA9ICRhcmdzOwoKICAgICAgICAkbGlzdDEgPSAkdGhpcy0+Y29lcmNlTGlzdCgkbGlzdDEsICcgJywgdHJ1ZSk7CgogICAgICAgIHN3aXRjaCAoJHRoaXMtPmNvbXBpbGVTdHJpbmdDb250ZW50KCR0aGlzLT5hc3NlcnRTdHJpbmcoJHNlcCwgJ3NlcGFyYXRvcicpKSkgewogICAgICAgICAgICBjYXNlICdjb21tYSc6CiAgICAgICAgICAgICAgICAkc2VwYXJhdG9yID0gJywnOwogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlICdzcGFjZSc6CiAgICAgICAgICAgICAgICAkc2VwYXJhdG9yID0gJyAnOwogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlICdzbGFzaCc6CiAgICAgICAgICAgICAgICAkc2VwYXJhdG9yID0gJy8nOwogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlICdhdXRvJzoKICAgICAgICAgICAgICAgICRzZXBhcmF0b3IgPSAkbGlzdDFbMV0gPT09ICcnICYmIFxjb3VudCgkbGlzdDFbMl0pIDw9IDEgJiYgKGVtcHR5KCRsaXN0MVsnZW5jbG9zaW5nJ10pIHx8ICRsaXN0MVsnZW5jbG9zaW5nJ10gPT09ICdwYXJlbnQnKSA/ICcgJyA6ICRsaXN0MVsxXTsKICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIHRocm93IFNhc3NTY3JpcHRFeGNlcHRpb246OmZvckFyZ3VtZW50KCdNdXN0IGJlICJzcGFjZSIsICJjb21tYSIsICJzbGFzaCIsIG9yICJhdXRvIi4nLCAnc2VwYXJhdG9yJyk7CiAgICAgICAgfQoKICAgICAgICAkcmVzID0gW1R5cGU6OlRfTElTVCwgJHNlcGFyYXRvciwgYXJyYXlfbWVyZ2UoJGxpc3QxWzJdLCBbJHZhbHVlXSldOwoKICAgICAgICBpZiAoaXNzZXQoJGxpc3QxWydlbmNsb3NpbmcnXSkpIHsKICAgICAgICAgICAgJHJlc1snZW5jbG9zaW5nJ10gPSAkbGlzdDFbJ2VuY2xvc2luZyddOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRyZXM7CiAgICB9CgogICAgcHJvdGVjdGVkIHN0YXRpYyAkbGliWmlwID0gWydsaXN0cy4uLiddOwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGxpYlppcCgkYXJncykKICAgIHsKICAgICAgICAkYXJnTGlzdHMgPSBbXTsKICAgICAgICBmb3JlYWNoICgkYXJnc1swXVsyXSBhcyAkYXJnKSB7CiAgICAgICAgICAgICRhcmdMaXN0c1tdID0gJHRoaXMtPmNvZXJjZUxpc3QoJGFyZyk7CiAgICAgICAgfQoKICAgICAgICAkbGlzdHMgPSBbXTsKICAgICAgICAkZmlyc3RMaXN0ID0gYXJyYXlfc2hpZnQoJGFyZ0xpc3RzKTsKCiAgICAgICAgJHJlc3VsdCA9IFtUeXBlOjpUX0xJU1QsICcsJywgJGxpc3RzXTsKICAgICAgICBpZiAoISBcaXNfbnVsbCgkZmlyc3RMaXN0KSkgewogICAgICAgICAgICBmb3JlYWNoICgkZmlyc3RMaXN0WzJdIGFzICRrZXkgPT4gJGl0ZW0pIHsKICAgICAgICAgICAgICAgICRsaXN0ID0gW1R5cGU6OlRfTElTVCwgJyAnLCBbJGl0ZW1dXTsKCiAgICAgICAgICAgICAgICBmb3JlYWNoICgkYXJnTGlzdHMgYXMgJGFyZykgewogICAgICAgICAgICAgICAgICAgIGlmIChpc3NldCgkYXJnWzJdWyRrZXldKSkgewogICAgICAgICAgICAgICAgICAgICAgICAkbGlzdFsyXVtdID0gJGFyZ1syXVska2V5XTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBicmVhayAyOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkbGlzdHNbXSA9ICRsaXN0OwogICAgICAgICAgICB9CgogICAgICAgICAgICAkcmVzdWx0WzJdID0gJGxpc3RzOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRyZXN1bHRbJ2VuY2xvc2luZyddID0gJ3BhcmVudCc7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJHJlc3VsdDsKICAgIH0KCiAgICBwcm90ZWN0ZWQgc3RhdGljICRsaWJUeXBlT2YgPSBbJ3ZhbHVlJ107CiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gbGliVHlwZU9mKCRhcmdzKQogICAgewogICAgICAgICR2YWx1ZSA9ICRhcmdzWzBdOwoKICAgICAgICByZXR1cm4gW1R5cGU6OlRfS0VZV09SRCwgJHRoaXMtPmdldFR5cGVPZigkdmFsdWUpXTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSBhcnJheXxOdW1iZXIgJHZhbHVlCiAgICAgKgogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHJpdmF0ZSBmdW5jdGlvbiBnZXRUeXBlT2YoJHZhbHVlKQogICAgewogICAgICAgIHN3aXRjaCAoJHZhbHVlWzBdKSB7CiAgICAgICAgICAgIGNhc2UgVHlwZTo6VF9LRVlXT1JEOgogICAgICAgICAgICAgICAgaWYgKCR2YWx1ZSA9PT0gc3RhdGljOjokdHJ1ZSB8fCAkdmFsdWUgPT09IHN0YXRpYzo6JGZhbHNlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdib29sJzsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoJHRoaXMtPmNvZXJjZUNvbG9yKCR2YWx1ZSkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ2NvbG9yJzsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBmYWxsLXRocnUKICAgICAgICAgICAgY2FzZSBUeXBlOjpUX0ZVTkNUSU9OOgogICAgICAgICAgICAgICAgcmV0dXJuICdzdHJpbmcnOwoKICAgICAgICAgICAgY2FzZSBUeXBlOjpUX0ZVTkNUSU9OX1JFRkVSRU5DRToKICAgICAgICAgICAgICAgIHJldHVybiAnZnVuY3Rpb24nOwoKICAgICAgICAgICAgY2FzZSBUeXBlOjpUX0xJU1Q6CiAgICAgICAgICAgICAgICBpZiAoaXNzZXQoJHZhbHVlWzNdKSAmJiBcaXNfYXJyYXkoJHZhbHVlWzNdKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAnYXJnbGlzdCc7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gZmFsbC10aHJ1CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICByZXR1cm4gJHZhbHVlWzBdOwogICAgICAgIH0KICAgIH0KCiAgICBwcm90ZWN0ZWQgc3RhdGljICRsaWJVbml0ID0gWydudW1iZXInXTsKICAgIHByb3RlY3RlZCBmdW5jdGlvbiBsaWJVbml0KCRhcmdzKQogICAgewogICAgICAgICRudW0gPSAkdGhpcy0+YXNzZXJ0TnVtYmVyKCRhcmdzWzBdLCAnbnVtYmVyJyk7CgogICAgICAgIHJldHVybiBbVHlwZTo6VF9TVFJJTkcsICciJywgWyRudW0tPnVuaXRTdHIoKV1dOwogICAgfQoKICAgIHByb3RlY3RlZCBzdGF0aWMgJGxpYlVuaXRsZXNzID0gWydudW1iZXInXTsKICAgIHByb3RlY3RlZCBmdW5jdGlvbiBsaWJVbml0bGVzcygkYXJncykKICAgIHsKICAgICAgICAkdmFsdWUgPSAkdGhpcy0+YXNzZXJ0TnVtYmVyKCRhcmdzWzBdLCAnbnVtYmVyJyk7CgogICAgICAgIHJldHVybiAkdGhpcy0+dG9Cb29sKCR2YWx1ZS0+dW5pdGxlc3MoKSk7CiAgICB9CgogICAgcHJvdGVjdGVkIHN0YXRpYyAkbGliQ29tcGFyYWJsZSA9IFsKICAgICAgICBbJ251bWJlcjEnLCAnbnVtYmVyMiddLAogICAgICAgIFsnbnVtYmVyLTEnLCAnbnVtYmVyLTInXQogICAgXTsKICAgIHByb3RlY3RlZCBmdW5jdGlvbiBsaWJDb21wYXJhYmxlKCRhcmdzKQogICAgewogICAgICAgIGxpc3QoJG51bWJlcjEsICRudW1iZXIyKSA9ICRhcmdzOwoKICAgICAgICBpZiAoCiAgICAgICAgICAgICEgJG51bWJlcjEgaW5zdGFuY2VvZiBOdW1iZXIgfHwKICAgICAgICAgICAgISAkbnVtYmVyMiBpbnN0YW5jZW9mIE51bWJlcgogICAgICAgICkgewogICAgICAgICAgICB0aHJvdyAkdGhpcy0+ZXJyb3IoJ0ludmFsaWQgYXJndW1lbnQocykgZm9yICJjb21wYXJhYmxlIicpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICR0aGlzLT50b0Jvb2woJG51bWJlcjEtPmlzQ29tcGFyYWJsZVRvKCRudW1iZXIyKSk7CiAgICB9CgogICAgcHJvdGVjdGVkIHN0YXRpYyAkbGliU3RySW5kZXggPSBbJ3N0cmluZycsICdzdWJzdHJpbmcnXTsKICAgIHByb3RlY3RlZCBmdW5jdGlvbiBsaWJTdHJJbmRleCgkYXJncykKICAgIHsKICAgICAgICAkc3RyaW5nID0gJHRoaXMtPmFzc2VydFN0cmluZygkYXJnc1swXSwgJ3N0cmluZycpOwogICAgICAgICRzdHJpbmdDb250ZW50ID0gJHRoaXMtPmNvbXBpbGVTdHJpbmdDb250ZW50KCRzdHJpbmcpOwoKICAgICAgICAkc3Vic3RyaW5nID0gJHRoaXMtPmFzc2VydFN0cmluZygkYXJnc1sxXSwgJ3N1YnN0cmluZycpOwogICAgICAgICRzdWJzdHJpbmdDb250ZW50ID0gJHRoaXMtPmNvbXBpbGVTdHJpbmdDb250ZW50KCRzdWJzdHJpbmcpOwoKICAgICAgICBpZiAoISBcc3RybGVuKCRzdWJzdHJpbmdDb250ZW50KSkgewogICAgICAgICAgICAkcmVzdWx0ID0gMDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkcmVzdWx0ID0gVXRpbDo6bWJTdHJwb3MoJHN0cmluZ0NvbnRlbnQsICRzdWJzdHJpbmdDb250ZW50KTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkcmVzdWx0ID09PSBmYWxzZSA/IHN0YXRpYzo6JG51bGwgOiBuZXcgTnVtYmVyKCRyZXN1bHQgKyAxLCAnJyk7CiAgICB9CgogICAgcHJvdGVjdGVkIHN0YXRpYyAkbGliU3RySW5zZXJ0ID0gWydzdHJpbmcnLCAnaW5zZXJ0JywgJ2luZGV4J107CiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gbGliU3RySW5zZXJ0KCRhcmdzKQogICAgewogICAgICAgICRzdHJpbmcgPSAkdGhpcy0+YXNzZXJ0U3RyaW5nKCRhcmdzWzBdLCAnc3RyaW5nJyk7CiAgICAgICAgJHN0cmluZ0NvbnRlbnQgPSAkdGhpcy0+Y29tcGlsZVN0cmluZ0NvbnRlbnQoJHN0cmluZyk7CgogICAgICAgICRpbnNlcnQgPSAkdGhpcy0+YXNzZXJ0U3RyaW5nKCRhcmdzWzFdLCAnaW5zZXJ0Jyk7CiAgICAgICAgJGluc2VydENvbnRlbnQgPSAkdGhpcy0+Y29tcGlsZVN0cmluZ0NvbnRlbnQoJGluc2VydCk7CgogICAgICAgICRpbmRleCA9ICR0aGlzLT5hc3NlcnRJbnRlZ2VyKCRhcmdzWzJdLCAnaW5kZXgnKTsKICAgICAgICBpZiAoJGluZGV4ID4gMCkgewogICAgICAgICAgICAkaW5kZXggPSAkaW5kZXggLSAxOwogICAgICAgIH0KICAgICAgICBpZiAoJGluZGV4IDwgMCkgewogICAgICAgICAgICAkaW5kZXggPSBtYXgoVXRpbDo6bWJTdHJsZW4oJHN0cmluZ0NvbnRlbnQpICsgMSArICRpbmRleCwgMCk7CiAgICAgICAgfQoKICAgICAgICAkc3RyaW5nWzJdID0gWwogICAgICAgICAgICBVdGlsOjptYlN1YnN0cigkc3RyaW5nQ29udGVudCwgMCwgJGluZGV4KSwKICAgICAgICAgICAgJGluc2VydENvbnRlbnQsCiAgICAgICAgICAgIFV0aWw6Om1iU3Vic3RyKCRzdHJpbmdDb250ZW50LCAkaW5kZXgpCiAgICAgICAgXTsKCiAgICAgICAgcmV0dXJuICRzdHJpbmc7CiAgICB9CgogICAgcHJvdGVjdGVkIHN0YXRpYyAkbGliU3RyTGVuZ3RoID0gWydzdHJpbmcnXTsKICAgIHByb3RlY3RlZCBmdW5jdGlvbiBsaWJTdHJMZW5ndGgoJGFyZ3MpCiAgICB7CiAgICAgICAgJHN0cmluZyA9ICR0aGlzLT5hc3NlcnRTdHJpbmcoJGFyZ3NbMF0sICdzdHJpbmcnKTsKICAgICAgICAkc3RyaW5nQ29udGVudCA9ICR0aGlzLT5jb21waWxlU3RyaW5nQ29udGVudCgkc3RyaW5nKTsKCiAgICAgICAgcmV0dXJuIG5ldyBOdW1iZXIoVXRpbDo6bWJTdHJsZW4oJHN0cmluZ0NvbnRlbnQpLCAnJyk7CiAgICB9CgogICAgcHJvdGVjdGVkIHN0YXRpYyAkbGliU3RyU2xpY2UgPSBbJ3N0cmluZycsICdzdGFydC1hdCcsICdlbmQtYXQ6LTEnXTsKICAgIHByb3RlY3RlZCBmdW5jdGlvbiBsaWJTdHJTbGljZSgkYXJncykKICAgIHsKICAgICAgICAkc3RyaW5nID0gJHRoaXMtPmFzc2VydFN0cmluZygkYXJnc1swXSwgJ3N0cmluZycpOwogICAgICAgICRzdHJpbmdDb250ZW50ID0gJHRoaXMtPmNvbXBpbGVTdHJpbmdDb250ZW50KCRzdHJpbmcpOwoKICAgICAgICAkc3RhcnQgPSAkdGhpcy0+YXNzZXJ0TnVtYmVyKCRhcmdzWzFdLCAnc3RhcnQtYXQnKTsKICAgICAgICAkc3RhcnQtPmFzc2VydE5vVW5pdHMoJ3N0YXJ0LWF0Jyk7CiAgICAgICAgJHN0YXJ0SW50ID0gJHRoaXMtPmFzc2VydEludGVnZXIoJHN0YXJ0LCAnc3RhcnQtYXQnKTsKICAgICAgICAkZW5kID0gJHRoaXMtPmFzc2VydE51bWJlcigkYXJnc1syXSwgJ2VuZC1hdCcpOwogICAgICAgICRlbmQtPmFzc2VydE5vVW5pdHMoJ2VuZC1hdCcpOwogICAgICAgICRlbmRJbnQgPSAkdGhpcy0+YXNzZXJ0SW50ZWdlcigkZW5kLCAnZW5kLWF0Jyk7CgogICAgICAgIGlmICgkZW5kSW50ID09PSAwKSB7CiAgICAgICAgICAgIHJldHVybiBbVHlwZTo6VF9TVFJJTkcsICRzdHJpbmdbMV0sIFtdXTsKICAgICAgICB9CgogICAgICAgIGlmICgkc3RhcnRJbnQgPiAwKSB7CiAgICAgICAgICAgICRzdGFydEludC0tOwogICAgICAgIH0KCiAgICAgICAgaWYgKCRlbmRJbnQgPCAwKSB7CiAgICAgICAgICAgICRlbmRJbnQgPSBVdGlsOjptYlN0cmxlbigkc3RyaW5nQ29udGVudCkgKyAkZW5kSW50OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRlbmRJbnQtLTsKICAgICAgICB9CgogICAgICAgIGlmICgkZW5kSW50IDwgJHN0YXJ0SW50KSB7CiAgICAgICAgICAgIHJldHVybiBbVHlwZTo6VF9TVFJJTkcsICRzdHJpbmdbMV0sIFtdXTsKICAgICAgICB9CgogICAgICAgICRsZW5ndGggPSAkZW5kSW50IC0gJHN0YXJ0SW50ICsgMTsgLy8gVGhlIGVuZCBvZiB0aGUgc2xpY2UgaXMgaW5jbHVzaXZlCgogICAgICAgICRzdHJpbmdbMl0gPSBbVXRpbDo6bWJTdWJzdHIoJHN0cmluZ0NvbnRlbnQsICRzdGFydEludCwgJGxlbmd0aCldOwoKICAgICAgICByZXR1cm4gJHN0cmluZzsKICAgIH0KCiAgICBwcm90ZWN0ZWQgc3RhdGljICRsaWJUb0xvd2VyQ2FzZSA9IFsnc3RyaW5nJ107CiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gbGliVG9Mb3dlckNhc2UoJGFyZ3MpCiAgICB7CiAgICAgICAgJHN0cmluZyA9ICR0aGlzLT5hc3NlcnRTdHJpbmcoJGFyZ3NbMF0sICdzdHJpbmcnKTsKICAgICAgICAkc3RyaW5nQ29udGVudCA9ICR0aGlzLT5jb21waWxlU3RyaW5nQ29udGVudCgkc3RyaW5nKTsKCiAgICAgICAgJHN0cmluZ1syXSA9IFskdGhpcy0+c3RyaW5nVHJhbnNmb3JtQXNjaWlPbmx5KCRzdHJpbmdDb250ZW50LCAnc3RydG9sb3dlcicpXTsKCiAgICAgICAgcmV0dXJuICRzdHJpbmc7CiAgICB9CgogICAgcHJvdGVjdGVkIHN0YXRpYyAkbGliVG9VcHBlckNhc2UgPSBbJ3N0cmluZyddOwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGxpYlRvVXBwZXJDYXNlKCRhcmdzKQogICAgewogICAgICAgICRzdHJpbmcgPSAkdGhpcy0+YXNzZXJ0U3RyaW5nKCRhcmdzWzBdLCAnc3RyaW5nJyk7CiAgICAgICAgJHN0cmluZ0NvbnRlbnQgPSAkdGhpcy0+Y29tcGlsZVN0cmluZ0NvbnRlbnQoJHN0cmluZyk7CgogICAgICAgICRzdHJpbmdbMl0gPSBbJHRoaXMtPnN0cmluZ1RyYW5zZm9ybUFzY2lpT25seSgkc3RyaW5nQ29udGVudCwgJ3N0cnRvdXBwZXInKV07CgogICAgICAgIHJldHVybiAkc3RyaW5nOwogICAgfQoKICAgIC8qKgogICAgICogQXBwbHkgYSBmaWx0ZXIgb24gYSBzdHJpbmcgY29udGVudCwgb25seSBvbiBhc2NpaSBjaGFycwogICAgICogbGV0IGV4dGVuZGVkIGNoYXJzIHVudG91Y2hlZAogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgJHN0cmluZ0NvbnRlbnQKICAgICAqIEBwYXJhbSBjYWxsYWJsZSAkZmlsdGVyCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gc3RyaW5nVHJhbnNmb3JtQXNjaWlPbmx5KCRzdHJpbmdDb250ZW50LCAkZmlsdGVyKQogICAgewogICAgICAgICRtYmxlbmd0aCA9IFV0aWw6Om1iU3RybGVuKCRzdHJpbmdDb250ZW50KTsKICAgICAgICBpZiAoJG1ibGVuZ3RoID09PSBzdHJsZW4oJHN0cmluZ0NvbnRlbnQpKSB7CiAgICAgICAgICAgIHJldHVybiAkZmlsdGVyKCRzdHJpbmdDb250ZW50KTsKICAgICAgICB9CiAgICAgICAgJGZpbHRlcmVkU3RyaW5nID0gIiI7CiAgICAgICAgZm9yICgkaSA9IDA7ICRpIDwgJG1ibGVuZ3RoOyAkaSsrKSB7CiAgICAgICAgICAgICRjaGFyID0gVXRpbDo6bWJTdWJzdHIoJHN0cmluZ0NvbnRlbnQsICRpLCAxKTsKICAgICAgICAgICAgaWYgKHN0cmxlbigkY2hhcikgPiAxKSB7CiAgICAgICAgICAgICAgICAkZmlsdGVyZWRTdHJpbmcgLj0gJGNoYXI7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkZmlsdGVyZWRTdHJpbmcgLj0gJGZpbHRlcigkY2hhcik7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiAkZmlsdGVyZWRTdHJpbmc7CiAgICB9CgogICAgcHJvdGVjdGVkIHN0YXRpYyAkbGliRmVhdHVyZUV4aXN0cyA9IFsnZmVhdHVyZSddOwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGxpYkZlYXR1cmVFeGlzdHMoJGFyZ3MpCiAgICB7CiAgICAgICAgJHN0cmluZyA9ICR0aGlzLT5hc3NlcnRTdHJpbmcoJGFyZ3NbMF0sICdmZWF0dXJlJyk7CiAgICAgICAgJG5hbWUgPSAkdGhpcy0+Y29tcGlsZVN0cmluZ0NvbnRlbnQoJHN0cmluZyk7CgogICAgICAgIHJldHVybiAkdGhpcy0+dG9Cb29sKAogICAgICAgICAgICBcYXJyYXlfa2V5X2V4aXN0cygkbmFtZSwgJHRoaXMtPnJlZ2lzdGVyZWRGZWF0dXJlcykgPyAkdGhpcy0+cmVnaXN0ZXJlZEZlYXR1cmVzWyRuYW1lXSA6IGZhbHNlCiAgICAgICAgKTsKICAgIH0KCiAgICBwcm90ZWN0ZWQgc3RhdGljICRsaWJGdW5jdGlvbkV4aXN0cyA9IFsnbmFtZSddOwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGxpYkZ1bmN0aW9uRXhpc3RzKCRhcmdzKQogICAgewogICAgICAgICRzdHJpbmcgPSAkdGhpcy0+YXNzZXJ0U3RyaW5nKCRhcmdzWzBdLCAnbmFtZScpOwogICAgICAgICRuYW1lID0gJHRoaXMtPmNvbXBpbGVTdHJpbmdDb250ZW50KCRzdHJpbmcpOwoKICAgICAgICAvLyB1c2VyIGRlZmluZWQgZnVuY3Rpb25zCiAgICAgICAgaWYgKCR0aGlzLT5oYXMoc3RhdGljOjokbmFtZXNwYWNlc1snZnVuY3Rpb24nXSAuICRuYW1lKSkgewogICAgICAgICAgICByZXR1cm4gc2VsZjo6JHRydWU7CiAgICAgICAgfQoKICAgICAgICAkbmFtZSA9ICR0aGlzLT5ub3JtYWxpemVOYW1lKCRuYW1lKTsKCiAgICAgICAgaWYgKGlzc2V0KCR0aGlzLT51c2VyRnVuY3Rpb25zWyRuYW1lXSkpIHsKICAgICAgICAgICAgcmV0dXJuIHNlbGY6OiR0cnVlOwogICAgICAgIH0KCiAgICAgICAgLy8gYnVpbHQtaW4gZnVuY3Rpb25zCiAgICAgICAgJGYgPSAkdGhpcy0+Z2V0QnVpbHRpbkZ1bmN0aW9uKCRuYW1lKTsKCiAgICAgICAgcmV0dXJuICR0aGlzLT50b0Jvb2woXGlzX2NhbGxhYmxlKCRmKSk7CiAgICB9CgogICAgcHJvdGVjdGVkIHN0YXRpYyAkbGliR2xvYmFsVmFyaWFibGVFeGlzdHMgPSBbJ25hbWUnXTsKICAgIHByb3RlY3RlZCBmdW5jdGlvbiBsaWJHbG9iYWxWYXJpYWJsZUV4aXN0cygkYXJncykKICAgIHsKICAgICAgICAkc3RyaW5nID0gJHRoaXMtPmFzc2VydFN0cmluZygkYXJnc1swXSwgJ25hbWUnKTsKICAgICAgICAkbmFtZSA9ICR0aGlzLT5jb21waWxlU3RyaW5nQ29udGVudCgkc3RyaW5nKTsKCiAgICAgICAgcmV0dXJuICR0aGlzLT50b0Jvb2woJHRoaXMtPmhhcygkbmFtZSwgJHRoaXMtPnJvb3RFbnYpKTsKICAgIH0KCiAgICBwcm90ZWN0ZWQgc3RhdGljICRsaWJNaXhpbkV4aXN0cyA9IFsnbmFtZSddOwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGxpYk1peGluRXhpc3RzKCRhcmdzKQogICAgewogICAgICAgICRzdHJpbmcgPSAkdGhpcy0+YXNzZXJ0U3RyaW5nKCRhcmdzWzBdLCAnbmFtZScpOwogICAgICAgICRuYW1lID0gJHRoaXMtPmNvbXBpbGVTdHJpbmdDb250ZW50KCRzdHJpbmcpOwoKICAgICAgICByZXR1cm4gJHRoaXMtPnRvQm9vbCgkdGhpcy0+aGFzKHN0YXRpYzo6JG5hbWVzcGFjZXNbJ21peGluJ10gLiAkbmFtZSkpOwogICAgfQoKICAgIHByb3RlY3RlZCBzdGF0aWMgJGxpYlZhcmlhYmxlRXhpc3RzID0gWyduYW1lJ107CiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gbGliVmFyaWFibGVFeGlzdHMoJGFyZ3MpCiAgICB7CiAgICAgICAgJHN0cmluZyA9ICR0aGlzLT5hc3NlcnRTdHJpbmcoJGFyZ3NbMF0sICduYW1lJyk7CiAgICAgICAgJG5hbWUgPSAkdGhpcy0+Y29tcGlsZVN0cmluZ0NvbnRlbnQoJHN0cmluZyk7CgogICAgICAgIHJldHVybiAkdGhpcy0+dG9Cb29sKCR0aGlzLT5oYXMoJG5hbWUpKTsKICAgIH0KCiAgICBwcm90ZWN0ZWQgc3RhdGljICRsaWJDb3VudGVyID0gWydhcmdzLi4uJ107CiAgICAvKioKICAgICAqIFdvcmthcm91bmQgSUU3J3MgY29udGVudCBjb3VudGVyIGJ1Zy4KICAgICAqCiAgICAgKiBAcGFyYW0gYXJyYXkgJGFyZ3MKICAgICAqCiAgICAgKiBAcmV0dXJuIGFycmF5CiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBsaWJDb3VudGVyKCRhcmdzKQogICAgewogICAgICAgICRsaXN0ID0gYXJyYXlfbWFwKFskdGhpcywgJ2NvbXBpbGVWYWx1ZSddLCAkYXJnc1swXVsyXSk7CgogICAgICAgIHJldHVybiBbVHlwZTo6VF9TVFJJTkcsICcnLCBbJ2NvdW50ZXIoJyAuIGltcGxvZGUoJywnLCAkbGlzdCkgLiAnKSddXTsKICAgIH0KCiAgICBwcm90ZWN0ZWQgc3RhdGljICRsaWJSYW5kb20gPSBbJ2xpbWl0Om51bGwnXTsKICAgIHByb3RlY3RlZCBmdW5jdGlvbiBsaWJSYW5kb20oJGFyZ3MpCiAgICB7CiAgICAgICAgaWYgKGlzc2V0KCRhcmdzWzBdKSAmJiAkYXJnc1swXSAhPT0gc3RhdGljOjokbnVsbCkgewogICAgICAgICAgICAkbGltaXQgPSAkdGhpcy0+YXNzZXJ0TnVtYmVyKCRhcmdzWzBdLCAnbGltaXQnKTsKCiAgICAgICAgICAgIGlmICgkbGltaXQtPmhhc1VuaXRzKCkpIHsKICAgICAgICAgICAgICAgICR1bml0U3RyaW5nID0gJGxpbWl0LT51bml0U3RyKCk7CiAgICAgICAgICAgICAgICAkbWVzc2FnZSA9IDw8PFRYVApyYW5kb20oKSB3aWxsIG5vIGxvbmdlciBpZ25vcmUgXCRsaW1pdCB1bml0cyAoJGxpbWl0KSBpbiBhIGZ1dHVyZSByZWxlYXNlLgoKUmVjb21tZW5kYXRpb246IHJhbmRvbShcJGxpbWl0IC8gMSR1bml0U3RyaW5nKSAqIDEkdW5pdFN0cmluZwoKVG8gcHJlc2VydmUgY3VycmVudCBiZWhhdmlvcjogcmFuZG9tKFwkbGltaXQgLyAxJHVuaXRTdHJpbmcpCgpNb3JlIGluZm86IGh0dHBzOi8vc2Fzcy1sYW5nLmNvbS9kL3JhbmRvbS13aXRoLXVuaXRzCgpUWFQ7CgogICAgICAgICAgICAgICAgV2Fybjo6ZGVwcmVjYXRpb24oJHRoaXMtPmFkZExvY2F0aW9uVG9NZXNzYWdlKCRtZXNzYWdlKSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRuID0gJHRoaXMtPmFzc2VydEludGVnZXIoJGxpbWl0LCAnbGltaXQnKTsKCiAgICAgICAgICAgIGlmICgkbiA8IDEpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBTYXNzU2NyaXB0RXhjZXB0aW9uKCJcJGxpbWl0OiBNdXN0IGJlIGdyZWF0ZXIgdGhhbiAwLCB3YXMgJG4uIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBuZXcgTnVtYmVyKG10X3JhbmQoMSwgJG4pLCAnJyk7CiAgICAgICAgfQoKICAgICAgICAkbWF4ID0gbXRfZ2V0cmFuZG1heCgpOwogICAgICAgIHJldHVybiBuZXcgTnVtYmVyKG10X3JhbmQoMCwgJG1heCAtIDEpIC8gJG1heCwgJycpOwogICAgfQoKICAgIHByb3RlY3RlZCBzdGF0aWMgJGxpYlVuaXF1ZUlkID0gW107CiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gbGliVW5pcXVlSWQoKQogICAgewogICAgICAgIHN0YXRpYyAkaWQ7CgogICAgICAgIGlmICghIGlzc2V0KCRpZCkpIHsKICAgICAgICAgICAgJGlkID0gUEhQX0lOVF9TSVpFID09PSA0CiAgICAgICAgICAgICAgICA/IG10X3JhbmQoMCwgcG93KDM2LCA1KSkgLiBzdHJfcGFkKG10X3JhbmQoMCwgcG93KDM2LCA1KSkgJSAxMDAwMDAwMCwgNywgJzAnLCBTVFJfUEFEX0xFRlQpCiAgICAgICAgICAgICAgICA6IG10X3JhbmQoMCwgcG93KDM2LCA4KSk7CiAgICAgICAgfQoKICAgICAgICAkaWQgKz0gbXRfcmFuZCgwLCAxMCkgKyAxOwoKICAgICAgICByZXR1cm4gW1R5cGU6OlRfU1RSSU5HLCAnJywgWyd1JyAuIHN0cl9wYWQoYmFzZV9jb252ZXJ0KCRpZCwgMTAsIDM2KSwgOCwgJzAnLCBTVFJfUEFEX0xFRlQpXV07CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0gYXJyYXl8TnVtYmVyICR2YWx1ZQogICAgICogQHBhcmFtIGJvb2wgICAgICAgICAkZm9yY2VfZW5jbG9zaW5nX2Rpc3BsYXkKICAgICAqCiAgICAgKiBAcmV0dXJuIGFycmF5CiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBpbnNwZWN0Rm9ybWF0VmFsdWUoJHZhbHVlLCAkZm9yY2VfZW5jbG9zaW5nX2Rpc3BsYXkgPSBmYWxzZSkKICAgIHsKICAgICAgICBpZiAoJHZhbHVlID09PSBzdGF0aWM6OiRudWxsKSB7CiAgICAgICAgICAgICR2YWx1ZSA9IFtUeXBlOjpUX0tFWVdPUkQsICdudWxsJ107CiAgICAgICAgfQoKICAgICAgICAkc3RyaW5nVmFsdWUgPSBbJHZhbHVlXTsKCiAgICAgICAgaWYgKCR2YWx1ZSBpbnN0YW5jZW9mIE51bWJlcikgewogICAgICAgICAgICByZXR1cm4gW1R5cGU6OlRfU1RSSU5HLCAnJywgJHN0cmluZ1ZhbHVlXTsKICAgICAgICB9CgogICAgICAgIGlmICgkdmFsdWVbMF0gPT09IFR5cGU6OlRfTElTVCkgewogICAgICAgICAgICBpZiAoZW5kKCR2YWx1ZVsyXSkgPT09IHN0YXRpYzo6JG51bGwpIHsKICAgICAgICAgICAgICAgIGFycmF5X3BvcCgkdmFsdWVbMl0pOwogICAgICAgICAgICAgICAgJHZhbHVlWzJdW10gPSBbVHlwZTo6VF9TVFJJTkcsICcnLCBbJyddXTsKICAgICAgICAgICAgICAgICRmb3JjZV9lbmNsb3NpbmdfZGlzcGxheSA9IHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICEgZW1wdHkoJHZhbHVlWydlbmNsb3NpbmcnXSkgJiYKICAgICAgICAgICAgICAgICgkZm9yY2VfZW5jbG9zaW5nX2Rpc3BsYXkgfHwKICAgICAgICAgICAgICAgICAgICAoJHZhbHVlWydlbmNsb3NpbmcnXSA9PT0gJ2JyYWNrZXQnKSB8fAogICAgICAgICAgICAgICAgICAgICEgXGNvdW50KCR2YWx1ZVsyXSkpCiAgICAgICAgICAgICkgewogICAgICAgICAgICAgICAgJHZhbHVlWydlbmNsb3NpbmcnXSA9ICdmb3JjZWRfJyAuICR2YWx1ZVsnZW5jbG9zaW5nJ107CiAgICAgICAgICAgICAgICAkZm9yY2VfZW5jbG9zaW5nX2Rpc3BsYXkgPSB0cnVlOwogICAgICAgICAgICB9IGVsc2VpZiAoISBcY291bnQoJHZhbHVlWzJdKSkgewogICAgICAgICAgICAgICAgJHZhbHVlWydlbmNsb3NpbmcnXSA9ICdmb3JjZWRfcGFyZW50JzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZm9yZWFjaCAoJHZhbHVlWzJdIGFzICRrID0+ICRsaXN0ZWxlbWVudCkgewogICAgICAgICAgICAgICAgJHZhbHVlWzJdWyRrXSA9ICR0aGlzLT5pbnNwZWN0Rm9ybWF0VmFsdWUoJGxpc3RlbGVtZW50LCAkZm9yY2VfZW5jbG9zaW5nX2Rpc3BsYXkpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkc3RyaW5nVmFsdWUgPSBbJHZhbHVlXTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBbVHlwZTo6VF9TVFJJTkcsICcnLCAkc3RyaW5nVmFsdWVdOwogICAgfQoKICAgIHByb3RlY3RlZCBzdGF0aWMgJGxpYkluc3BlY3QgPSBbJ3ZhbHVlJ107CiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gbGliSW5zcGVjdCgkYXJncykKICAgIHsKICAgICAgICAkdmFsdWUgPSAkYXJnc1swXTsKCiAgICAgICAgcmV0dXJuICR0aGlzLT5pbnNwZWN0Rm9ybWF0VmFsdWUoJHZhbHVlKTsKICAgIH0KCiAgICAvKioKICAgICAqIFByZXByb2Nlc3Mgc2VsZWN0b3IgYXJncwogICAgICoKICAgICAqIEBwYXJhbSBhcnJheSAgICAgICAkYXJnCiAgICAgKiBAcGFyYW0gc3RyaW5nfG51bGwgJHZhcm5hbWUKICAgICAqIEBwYXJhbSBib29sICAgICAgICAkYWxsb3dQYXJlbnQKICAgICAqCiAgICAgKiBAcmV0dXJuIGFycmF5CiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBnZXRTZWxlY3RvckFyZygkYXJnLCAkdmFybmFtZSA9IG51bGwsICRhbGxvd1BhcmVudCA9IGZhbHNlKQogICAgewogICAgICAgIHN0YXRpYyAkcGFyc2VyID0gbnVsbDsKCiAgICAgICAgaWYgKFxpc19udWxsKCRwYXJzZXIpKSB7CiAgICAgICAgICAgICRwYXJzZXIgPSAkdGhpcy0+cGFyc2VyRmFjdG9yeShfX01FVEhPRF9fKTsKICAgICAgICB9CgogICAgICAgIGlmICghICR0aGlzLT5jaGVja1NlbGVjdG9yQXJnVHlwZSgkYXJnKSkgewogICAgICAgICAgICAkdmFyX3ZhbHVlID0gJHRoaXMtPmNvbXBpbGVWYWx1ZSgkYXJnKTsKICAgICAgICAgICAgdGhyb3cgU2Fzc1NjcmlwdEV4Y2VwdGlvbjo6Zm9yQXJndW1lbnQoIiR2YXJfdmFsdWUgaXMgbm90IGEgdmFsaWQgc2VsZWN0b3I6IGl0IG11c3QgYmUgYSBzdHJpbmcsIGEgbGlzdCBvZiBzdHJpbmdzLCBvciBhIGxpc3Qgb2YgbGlzdHMgb2Ygc3RyaW5ncyIsICR2YXJuYW1lKTsKICAgICAgICB9CgoKICAgICAgICBpZiAoJGFyZ1swXSA9PT0gVHlwZTo6VF9TVFJJTkcpIHsKICAgICAgICAgICAgJGFyZ1sxXSA9ICcnOwogICAgICAgIH0KICAgICAgICAkYXJnID0gJHRoaXMtPmNvbXBpbGVWYWx1ZSgkYXJnKTsKCiAgICAgICAgJHBhcnNlZFNlbGVjdG9yID0gW107CgogICAgICAgIGlmICgkcGFyc2VyLT5wYXJzZVNlbGVjdG9yKCRhcmcsICRwYXJzZWRTZWxlY3RvciwgdHJ1ZSkpIHsKICAgICAgICAgICAgJHNlbGVjdG9yID0gJHRoaXMtPmV2YWxTZWxlY3RvcnMoJHBhcnNlZFNlbGVjdG9yKTsKICAgICAgICAgICAgJGdsdWVkU2VsZWN0b3IgPSAkdGhpcy0+Z2x1ZUZ1bmN0aW9uU2VsZWN0b3JzKCRzZWxlY3Rvcik7CgogICAgICAgICAgICBpZiAoISAkYWxsb3dQYXJlbnQpIHsKICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRnbHVlZFNlbGVjdG9yIGFzICRzZWxlY3RvcikgewogICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRzZWxlY3RvciBhcyAkcykgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5fYXJyYXkoc3RhdGljOjokc2VsZlNlbGVjdG9yLCAkcykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IFNhc3NTY3JpcHRFeGNlcHRpb246OmZvckFyZ3VtZW50KCJQYXJlbnQgc2VsZWN0b3JzIGFyZW4ndCBhbGxvd2VkIGhlcmUuIiwgJHZhcm5hbWUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gJGdsdWVkU2VsZWN0b3I7CiAgICAgICAgfQoKICAgICAgICB0aHJvdyBTYXNzU2NyaXB0RXhjZXB0aW9uOjpmb3JBcmd1bWVudCgiZXhwZWN0ZWQgbW9yZSBpbnB1dCwgaW52YWxpZCBzZWxlY3Rvci4iLCAkdmFybmFtZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDaGVjayB2YXJpYWJsZSB0eXBlIGZvciBnZXRTZWxlY3RvckFyZygpIGZ1bmN0aW9uCiAgICAgKiBAcGFyYW0gYXJyYXkgJGFyZwogICAgICogQHBhcmFtIGludCAkbWF4RGVwdGgKICAgICAqIEByZXR1cm4gYm9vbAogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gY2hlY2tTZWxlY3RvckFyZ1R5cGUoJGFyZywgJG1heERlcHRoID0gMikKICAgIHsKICAgICAgICBpZiAoJGFyZ1swXSA9PT0gVHlwZTo6VF9MSVNUICYmICRtYXhEZXB0aCA+IDApIHsKICAgICAgICAgICAgZm9yZWFjaCAoJGFyZ1syXSBhcyAkZWx0KSB7CiAgICAgICAgICAgICAgICBpZiAoISAkdGhpcy0+Y2hlY2tTZWxlY3RvckFyZ1R5cGUoJGVsdCwgJG1heERlcHRoIC0gMSkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICAgIGlmICghaW5fYXJyYXkoJGFyZ1swXSwgW1R5cGU6OlRfU1RSSU5HLCBUeXBlOjpUX0tFWVdPUkRdKSkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIC8qKgogICAgICogUG9zdHByb2Nlc3Mgc2VsZWN0b3IgdG8gb3V0cHV0IGluIHJpZ2h0IGZvcm1hdAogICAgICoKICAgICAqIEBwYXJhbSBhcnJheSAkc2VsZWN0b3JzCiAgICAgKgogICAgICogQHJldHVybiBhcnJheQogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gZm9ybWF0T3V0cHV0U2VsZWN0b3IoJHNlbGVjdG9ycykKICAgIHsKICAgICAgICAkc2VsZWN0b3JzID0gJHRoaXMtPmNvbGxhcHNlU2VsZWN0b3JzQXNMaXN0KCRzZWxlY3RvcnMpOwoKICAgICAgICByZXR1cm4gJHNlbGVjdG9yczsKICAgIH0KCiAgICBwcm90ZWN0ZWQgc3RhdGljICRsaWJJc1N1cGVyc2VsZWN0b3IgPSBbJ3N1cGVyJywgJ3N1YiddOwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGxpYklzU3VwZXJzZWxlY3RvcigkYXJncykKICAgIHsKICAgICAgICBsaXN0KCRzdXBlciwgJHN1YikgPSAkYXJnczsKCiAgICAgICAgJHN1cGVyID0gJHRoaXMtPmdldFNlbGVjdG9yQXJnKCRzdXBlciwgJ3N1cGVyJyk7CiAgICAgICAgJHN1YiA9ICR0aGlzLT5nZXRTZWxlY3RvckFyZygkc3ViLCAnc3ViJyk7CgogICAgICAgIHJldHVybiAkdGhpcy0+dG9Cb29sKCR0aGlzLT5pc1N1cGVyU2VsZWN0b3IoJHN1cGVyLCAkc3ViKSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBUZXN0IGEgJHN1cGVyIHNlbGVjdG9yIGFnYWluICRzdWIKICAgICAqCiAgICAgKiBAcGFyYW0gYXJyYXkgJHN1cGVyCiAgICAgKiBAcGFyYW0gYXJyYXkgJHN1YgogICAgICoKICAgICAqIEByZXR1cm4gYm9vbAogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gaXNTdXBlclNlbGVjdG9yKCRzdXBlciwgJHN1YikKICAgIHsKICAgICAgICAvLyBvbmUgYW5kIG9ubHkgb25lIHNlbGVjdG9yIGZvciBlYWNoIGFyZwogICAgICAgIGlmICghICRzdXBlcikgewogICAgICAgICAgICB0aHJvdyAkdGhpcy0+ZXJyb3IoJ0ludmFsaWQgc3VwZXIgc2VsZWN0b3IgZm9yIGlzU3VwZXJTZWxlY3RvcigpJyk7CiAgICAgICAgfQoKICAgICAgICBpZiAoISAkc3ViKSB7CiAgICAgICAgICAgIHRocm93ICR0aGlzLT5lcnJvcignSW52YWxpZCBzdWIgc2VsZWN0b3IgZm9yIGlzU3VwZXJTZWxlY3RvcigpJyk7CiAgICAgICAgfQoKICAgICAgICBpZiAoY291bnQoJHN1YikgPiAxKSB7CiAgICAgICAgICAgIGZvcmVhY2ggKCRzdWIgYXMgJHMpIHsKICAgICAgICAgICAgICAgIGlmICghICR0aGlzLT5pc1N1cGVyU2VsZWN0b3IoJHN1cGVyLCBbJHNdKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CgogICAgICAgIGlmIChjb3VudCgkc3VwZXIpID4gMSkgewogICAgICAgICAgICBmb3JlYWNoICgkc3VwZXIgYXMgJHMpIHsKICAgICAgICAgICAgICAgIGlmICgkdGhpcy0+aXNTdXBlclNlbGVjdG9yKFskc10sICRzdWIpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgJHN1cGVyID0gcmVzZXQoJHN1cGVyKTsKICAgICAgICAkc3ViID0gcmVzZXQoJHN1Yik7CgogICAgICAgICRpID0gMDsKICAgICAgICAkbmV4dE11c3RNYXRjaCA9IGZhbHNlOwoKICAgICAgICBmb3JlYWNoICgkc3VwZXIgYXMgJG5vZGUpIHsKICAgICAgICAgICAgJGNvbXBvdW5kID0gJyc7CgogICAgICAgICAgICBhcnJheV93YWxrX3JlY3Vyc2l2ZSgKICAgICAgICAgICAgICAgICRub2RlLAogICAgICAgICAgICAgICAgZnVuY3Rpb24gKCR2YWx1ZSwgJGtleSkgdXNlICgmJGNvbXBvdW5kKSB7CiAgICAgICAgICAgICAgICAgICAgJGNvbXBvdW5kIC49ICR2YWx1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICgkdGhpcy0+aXNJbW1lZGlhdGVSZWxhdGlvbnNoaXBDb21iaW5hdG9yKCRjb21wb3VuZCkpIHsKICAgICAgICAgICAgICAgIGlmICgkbm9kZSAhPT0gJHN1YlskaV0pIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJG5leHRNdXN0TWF0Y2ggPSB0cnVlOwogICAgICAgICAgICAgICAgJGkrKzsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHdoaWxlICgkaSA8IFxjb3VudCgkc3ViKSAmJiAhICR0aGlzLT5pc1N1cGVyUGFydCgkbm9kZSwgJHN1YlskaV0pKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCRuZXh0TXVzdE1hdGNoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICRpKys7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCRpID49IFxjb3VudCgkc3ViKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkbmV4dE11c3RNYXRjaCA9IGZhbHNlOwogICAgICAgICAgICAgICAgJGkrKzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgLyoqCiAgICAgKiBUZXN0IGEgcGFydCBvZiBzdXBlciBzZWxlY3RvciBhZ2FpbiBhIHBhcnQgb2Ygc3ViIHNlbGVjdG9yCiAgICAgKgogICAgICogQHBhcmFtIGFycmF5ICRzdXBlclBhcnRzCiAgICAgKiBAcGFyYW0gYXJyYXkgJHN1YlBhcnRzCiAgICAgKgogICAgICogQHJldHVybiBib29sCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBpc1N1cGVyUGFydCgkc3VwZXJQYXJ0cywgJHN1YlBhcnRzKQogICAgewogICAgICAgICRpID0gMDsKCiAgICAgICAgZm9yZWFjaCAoJHN1cGVyUGFydHMgYXMgJHN1cGVyUGFydCkgewogICAgICAgICAgICB3aGlsZSAoJGkgPCBcY291bnQoJHN1YlBhcnRzKSAmJiAkc3ViUGFydHNbJGldICE9PSAkc3VwZXJQYXJ0KSB7CiAgICAgICAgICAgICAgICAkaSsrOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoJGkgPj0gXGNvdW50KCRzdWJQYXJ0cykpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJGkrKzsKICAgICAgICB9CgogICAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIHByb3RlY3RlZCBzdGF0aWMgJGxpYlNlbGVjdG9yQXBwZW5kID0gWydzZWxlY3Rvci4uLiddOwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGxpYlNlbGVjdG9yQXBwZW5kKCRhcmdzKQogICAgewogICAgICAgIC8vIGdldCB0aGUgc2VsZWN0b3IuLi4gbGlzdAogICAgICAgICRhcmdzID0gcmVzZXQoJGFyZ3MpOwogICAgICAgICRhcmdzID0gJGFyZ3NbMl07CgogICAgICAgIGlmIChcY291bnQoJGFyZ3MpIDwgMSkgewogICAgICAgICAgICB0aHJvdyAkdGhpcy0+ZXJyb3IoJ3NlbGVjdG9yLWFwcGVuZCgpIG5lZWRzIGF0IGxlYXN0IDEgYXJndW1lbnQnKTsKICAgICAgICB9CgogICAgICAgICRzZWxlY3RvcnMgPSBbXTsKICAgICAgICBmb3JlYWNoICgkYXJncyBhcyAkYXJnKSB7CiAgICAgICAgICAgICRzZWxlY3RvcnNbXSA9ICR0aGlzLT5nZXRTZWxlY3RvckFyZygkYXJnLCAnc2VsZWN0b3InKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkdGhpcy0+Zm9ybWF0T3V0cHV0U2VsZWN0b3IoJHRoaXMtPnNlbGVjdG9yQXBwZW5kKCRzZWxlY3RvcnMpKTsKICAgIH0KCiAgICAvKioKICAgICAqIEFwcGVuZCBwYXJ0cyBvZiB0aGUgbGFzdCBzZWxlY3RvciBpbiB0aGUgbGlzdCB0byB0aGUgcHJldmlvdXMsIHJlY3Vyc2l2ZWx5CiAgICAgKgogICAgICogQHBhcmFtIGFycmF5ICRzZWxlY3RvcnMKICAgICAqCiAgICAgKiBAcmV0dXJuIGFycmF5CiAgICAgKgogICAgICogQHRocm93cyBcU2Nzc1BocFxTY3NzUGhwXEV4Y2VwdGlvblxDb21waWxlckV4Y2VwdGlvbgogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gc2VsZWN0b3JBcHBlbmQoJHNlbGVjdG9ycykKICAgIHsKICAgICAgICAkbGFzdFNlbGVjdG9ycyA9IGFycmF5X3BvcCgkc2VsZWN0b3JzKTsKCiAgICAgICAgaWYgKCEgJGxhc3RTZWxlY3RvcnMpIHsKICAgICAgICAgICAgdGhyb3cgJHRoaXMtPmVycm9yKCdJbnZhbGlkIHNlbGVjdG9yIGxpc3QgaW4gc2VsZWN0b3ItYXBwZW5kKCknKTsKICAgICAgICB9CgogICAgICAgIHdoaWxlIChcY291bnQoJHNlbGVjdG9ycykpIHsKICAgICAgICAgICAgJHByZXZpb3VzU2VsZWN0b3JzID0gYXJyYXlfcG9wKCRzZWxlY3RvcnMpOwoKICAgICAgICAgICAgaWYgKCEgJHByZXZpb3VzU2VsZWN0b3JzKSB7CiAgICAgICAgICAgICAgICB0aHJvdyAkdGhpcy0+ZXJyb3IoJ0ludmFsaWQgc2VsZWN0b3IgbGlzdCBpbiBzZWxlY3Rvci1hcHBlbmQoKScpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBkbyB0aGUgdHJpY2ssIGhhcHBlbmluZyAkbGFzdFNlbGVjdG9yIHRvICRwcmV2aW91c1NlbGVjdG9yCiAgICAgICAgICAgICRhcHBlbmRlZCA9IFtdOwoKICAgICAgICAgICAgZm9yZWFjaCAoJHByZXZpb3VzU2VsZWN0b3JzIGFzICRwcmV2aW91c1NlbGVjdG9yKSB7CiAgICAgICAgICAgICAgICBmb3JlYWNoICgkbGFzdFNlbGVjdG9ycyBhcyAkbGFzdFNlbGVjdG9yKSB7CiAgICAgICAgICAgICAgICAgICAgJHByZXZpb3VzID0gJHByZXZpb3VzU2VsZWN0b3I7CiAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAoJHByZXZpb3VzU2VsZWN0b3IgYXMgJGogPT4gJHByZXZpb3VzU2VsZWN0b3JQYXJ0cykgewogICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICgkbGFzdFNlbGVjdG9yIGFzICRsYXN0U2VsZWN0b3JQYXJ0cykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAoJGxhc3RTZWxlY3RvclBhcnRzIGFzICRsYXN0U2VsZWN0b3JQYXJ0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHByZXZpb3VzWyRqXVtdID0gJGxhc3RTZWxlY3RvclBhcnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICRhcHBlbmRlZFtdID0gJHByZXZpb3VzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAkbGFzdFNlbGVjdG9ycyA9ICRhcHBlbmRlZDsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkbGFzdFNlbGVjdG9yczsKICAgIH0KCiAgICBwcm90ZWN0ZWQgc3RhdGljICRsaWJTZWxlY3RvckV4dGVuZCA9IFsKICAgICAgICBbJ3NlbGVjdG9yJywgJ2V4dGVuZGVlJywgJ2V4dGVuZGVyJ10sCiAgICAgICAgWydzZWxlY3RvcnMnLCAnZXh0ZW5kZWUnLCAnZXh0ZW5kZXInXQogICAgXTsKICAgIHByb3RlY3RlZCBmdW5jdGlvbiBsaWJTZWxlY3RvckV4dGVuZCgkYXJncykKICAgIHsKICAgICAgICBsaXN0KCRzZWxlY3RvcnMsICRleHRlbmRlZSwgJGV4dGVuZGVyKSA9ICRhcmdzOwoKICAgICAgICAkc2VsZWN0b3JzID0gJHRoaXMtPmdldFNlbGVjdG9yQXJnKCRzZWxlY3RvcnMsICdzZWxlY3RvcicpOwogICAgICAgICRleHRlbmRlZSAgPSAkdGhpcy0+Z2V0U2VsZWN0b3JBcmcoJGV4dGVuZGVlLCAnZXh0ZW5kZWUnKTsKICAgICAgICAkZXh0ZW5kZXIgID0gJHRoaXMtPmdldFNlbGVjdG9yQXJnKCRleHRlbmRlciwgJ2V4dGVuZGVyJyk7CgogICAgICAgIGlmICghICRzZWxlY3RvcnMgfHwgISAkZXh0ZW5kZWUgfHwgISAkZXh0ZW5kZXIpIHsKICAgICAgICAgICAgdGhyb3cgJHRoaXMtPmVycm9yKCdzZWxlY3Rvci1leHRlbmQoKSBpbnZhbGlkIGFyZ3VtZW50cycpOwogICAgICAgIH0KCiAgICAgICAgJGV4dGVuZGVkID0gJHRoaXMtPmV4dGVuZE9yUmVwbGFjZVNlbGVjdG9ycygkc2VsZWN0b3JzLCAkZXh0ZW5kZWUsICRleHRlbmRlcik7CgogICAgICAgIHJldHVybiAkdGhpcy0+Zm9ybWF0T3V0cHV0U2VsZWN0b3IoJGV4dGVuZGVkKTsKICAgIH0KCiAgICBwcm90ZWN0ZWQgc3RhdGljICRsaWJTZWxlY3RvclJlcGxhY2UgPSBbCiAgICAgICAgWydzZWxlY3RvcicsICdvcmlnaW5hbCcsICdyZXBsYWNlbWVudCddLAogICAgICAgIFsnc2VsZWN0b3JzJywgJ29yaWdpbmFsJywgJ3JlcGxhY2VtZW50J10KICAgIF07CiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gbGliU2VsZWN0b3JSZXBsYWNlKCRhcmdzKQogICAgewogICAgICAgIGxpc3QoJHNlbGVjdG9ycywgJG9yaWdpbmFsLCAkcmVwbGFjZW1lbnQpID0gJGFyZ3M7CgogICAgICAgICRzZWxlY3RvcnMgICA9ICR0aGlzLT5nZXRTZWxlY3RvckFyZygkc2VsZWN0b3JzLCAnc2VsZWN0b3InKTsKICAgICAgICAkb3JpZ2luYWwgICAgPSAkdGhpcy0+Z2V0U2VsZWN0b3JBcmcoJG9yaWdpbmFsLCAnb3JpZ2luYWwnKTsKICAgICAgICAkcmVwbGFjZW1lbnQgPSAkdGhpcy0+Z2V0U2VsZWN0b3JBcmcoJHJlcGxhY2VtZW50LCAncmVwbGFjZW1lbnQnKTsKCiAgICAgICAgaWYgKCEgJHNlbGVjdG9ycyB8fCAhICRvcmlnaW5hbCB8fCAhICRyZXBsYWNlbWVudCkgewogICAgICAgICAgICB0aHJvdyAkdGhpcy0+ZXJyb3IoJ3NlbGVjdG9yLXJlcGxhY2UoKSBpbnZhbGlkIGFyZ3VtZW50cycpOwogICAgICAgIH0KCiAgICAgICAgJHJlcGxhY2VkID0gJHRoaXMtPmV4dGVuZE9yUmVwbGFjZVNlbGVjdG9ycygkc2VsZWN0b3JzLCAkb3JpZ2luYWwsICRyZXBsYWNlbWVudCwgdHJ1ZSk7CgogICAgICAgIHJldHVybiAkdGhpcy0+Zm9ybWF0T3V0cHV0U2VsZWN0b3IoJHJlcGxhY2VkKTsKICAgIH0KCiAgICAvKioKICAgICAqIEV4dGVuZC9yZXBsYWNlIGluIHNlbGVjdG9ycwogICAgICogdXNlZCBieSBzZWxlY3Rvci1leHRlbmQgYW5kIHNlbGVjdG9yLXJlcGxhY2UgdGhhdCB1c2UgdGhlIHNhbWUgbG9naWMKICAgICAqCiAgICAgKiBAcGFyYW0gYXJyYXkgJHNlbGVjdG9ycwogICAgICogQHBhcmFtIGFycmF5ICRleHRlbmRlZQogICAgICogQHBhcmFtIGFycmF5ICRleHRlbmRlcgogICAgICogQHBhcmFtIGJvb2wgICRyZXBsYWNlCiAgICAgKgogICAgICogQHJldHVybiBhcnJheQogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gZXh0ZW5kT3JSZXBsYWNlU2VsZWN0b3JzKCRzZWxlY3RvcnMsICRleHRlbmRlZSwgJGV4dGVuZGVyLCAkcmVwbGFjZSA9IGZhbHNlKQogICAgewogICAgICAgICRzYXZlRXh0ZW5kcyA9ICR0aGlzLT5leHRlbmRzOwogICAgICAgICRzYXZlRXh0ZW5kc01hcCA9ICR0aGlzLT5leHRlbmRzTWFwOwoKICAgICAgICAkdGhpcy0+ZXh0ZW5kcyA9IFtdOwogICAgICAgICR0aGlzLT5leHRlbmRzTWFwID0gW107CgogICAgICAgIGZvcmVhY2ggKCRleHRlbmRlZSBhcyAkZXMpIHsKICAgICAgICAgICAgaWYgKFxjb3VudCgkZXMpICE9PSAxKSB7CiAgICAgICAgICAgICAgICB0aHJvdyAkdGhpcy0+ZXJyb3IoJ0NhblwndCBleHRlbmQgY29tcGxleCBzZWxlY3Rvci4nKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gb25seSB1c2UgdGhlIGZpcnN0IG9uZQogICAgICAgICAgICAkdGhpcy0+cHVzaEV4dGVuZHMocmVzZXQoJGVzKSwgJGV4dGVuZGVyLCBudWxsKTsKICAgICAgICB9CgogICAgICAgICRleHRlbmRlZCA9IFtdOwoKICAgICAgICBmb3JlYWNoICgkc2VsZWN0b3JzIGFzICRzZWxlY3RvcikgewogICAgICAgICAgICBpZiAoISAkcmVwbGFjZSkgewogICAgICAgICAgICAgICAgJGV4dGVuZGVkW10gPSAkc2VsZWN0b3I7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRuID0gXGNvdW50KCRleHRlbmRlZCk7CgogICAgICAgICAgICAkdGhpcy0+bWF0Y2hFeHRlbmRzKCRzZWxlY3RvciwgJGV4dGVuZGVkKTsKCiAgICAgICAgICAgIC8vIGlmIGRpZG50IG1hdGNoLCBrZWVwIHRoZSBvcmlnaW5hbCBzZWxlY3RvciBpZiB3ZSBhcmUgaW4gYSByZXBsYWNlIG9wZXJhdGlvbgogICAgICAgICAgICBpZiAoJHJlcGxhY2UgJiYgXGNvdW50KCRleHRlbmRlZCkgPT09ICRuKSB7CiAgICAgICAgICAgICAgICAkZXh0ZW5kZWRbXSA9ICRzZWxlY3RvcjsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJHRoaXMtPmV4dGVuZHMgPSAkc2F2ZUV4dGVuZHM7CiAgICAgICAgJHRoaXMtPmV4dGVuZHNNYXAgPSAkc2F2ZUV4dGVuZHNNYXA7CgogICAgICAgIHJldHVybiAkZXh0ZW5kZWQ7CiAgICB9CgogICAgcHJvdGVjdGVkIHN0YXRpYyAkbGliU2VsZWN0b3JOZXN0ID0gWydzZWxlY3Rvci4uLiddOwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGxpYlNlbGVjdG9yTmVzdCgkYXJncykKICAgIHsKICAgICAgICAvLyBnZXQgdGhlIHNlbGVjdG9yLi4uIGxpc3QKICAgICAgICAkYXJncyA9IHJlc2V0KCRhcmdzKTsKICAgICAgICAkYXJncyA9ICRhcmdzWzJdOwoKICAgICAgICBpZiAoXGNvdW50KCRhcmdzKSA8IDEpIHsKICAgICAgICAgICAgdGhyb3cgJHRoaXMtPmVycm9yKCdzZWxlY3Rvci1uZXN0KCkgbmVlZHMgYXQgbGVhc3QgMSBhcmd1bWVudCcpOwogICAgICAgIH0KCiAgICAgICAgJHNlbGVjdG9yc01hcCA9IFtdOwogICAgICAgIGZvcmVhY2ggKCRhcmdzIGFzICRhcmcpIHsKICAgICAgICAgICAgJHNlbGVjdG9yc01hcFtdID0gJHRoaXMtPmdldFNlbGVjdG9yQXJnKCRhcmcsICdzZWxlY3RvcicsIHRydWUpOwogICAgICAgIH0KCiAgICAgICAgYXNzZXJ0KCFlbXB0eSgkc2VsZWN0b3JzTWFwKSk7CgogICAgICAgICRlbnZzID0gW107CgogICAgICAgIGZvcmVhY2ggKCRzZWxlY3RvcnNNYXAgYXMgJHNlbGVjdG9ycykgewogICAgICAgICAgICAkZW52ID0gbmV3IEVudmlyb25tZW50KCk7CiAgICAgICAgICAgICRlbnYtPnNlbGVjdG9ycyA9ICRzZWxlY3RvcnM7CgogICAgICAgICAgICAkZW52c1tdID0gJGVudjsKICAgICAgICB9CgogICAgICAgICRlbnZzICAgICAgICAgICAgPSBhcnJheV9yZXZlcnNlKCRlbnZzKTsKICAgICAgICAkZW52ICAgICAgICAgICAgID0gJHRoaXMtPmV4dHJhY3RFbnYoJGVudnMpOwogICAgICAgICRvdXRwdXRTZWxlY3RvcnMgPSAkdGhpcy0+bXVsdGlwbHlTZWxlY3RvcnMoJGVudik7CgogICAgICAgIHJldHVybiAkdGhpcy0+Zm9ybWF0T3V0cHV0U2VsZWN0b3IoJG91dHB1dFNlbGVjdG9ycyk7CiAgICB9CgogICAgcHJvdGVjdGVkIHN0YXRpYyAkbGliU2VsZWN0b3JQYXJzZSA9IFsKICAgICAgICBbJ3NlbGVjdG9yJ10sCiAgICAgICAgWydzZWxlY3RvcnMnXQogICAgXTsKICAgIHByb3RlY3RlZCBmdW5jdGlvbiBsaWJTZWxlY3RvclBhcnNlKCRhcmdzKQogICAgewogICAgICAgICRzZWxlY3RvcnMgPSByZXNldCgkYXJncyk7CiAgICAgICAgJHNlbGVjdG9ycyA9ICR0aGlzLT5nZXRTZWxlY3RvckFyZygkc2VsZWN0b3JzLCAnc2VsZWN0b3InKTsKCiAgICAgICAgcmV0dXJuICR0aGlzLT5mb3JtYXRPdXRwdXRTZWxlY3Rvcigkc2VsZWN0b3JzKTsKICAgIH0KCiAgICBwcm90ZWN0ZWQgc3RhdGljICRsaWJTZWxlY3RvclVuaWZ5ID0gWydzZWxlY3RvcnMxJywgJ3NlbGVjdG9yczInXTsKICAgIHByb3RlY3RlZCBmdW5jdGlvbiBsaWJTZWxlY3RvclVuaWZ5KCRhcmdzKQogICAgewogICAgICAgIGxpc3QoJHNlbGVjdG9yczEsICRzZWxlY3RvcnMyKSA9ICRhcmdzOwoKICAgICAgICAkc2VsZWN0b3JzMSA9ICR0aGlzLT5nZXRTZWxlY3RvckFyZygkc2VsZWN0b3JzMSwgJ3NlbGVjdG9yczEnKTsKICAgICAgICAkc2VsZWN0b3JzMiA9ICR0aGlzLT5nZXRTZWxlY3RvckFyZygkc2VsZWN0b3JzMiwgJ3NlbGVjdG9yczInKTsKCiAgICAgICAgaWYgKCEgJHNlbGVjdG9yczEgfHwgISAkc2VsZWN0b3JzMikgewogICAgICAgICAgICB0aHJvdyAkdGhpcy0+ZXJyb3IoJ3NlbGVjdG9yLXVuaWZ5KCkgaW52YWxpZCBhcmd1bWVudHMnKTsKICAgICAgICB9CgogICAgICAgIC8vIG9ubHkgY29uc2lkZXIgdGhlIGZpcnN0IGNvbXBvdW5kIG9mIGVhY2gKICAgICAgICAkY29tcG91bmQxID0gcmVzZXQoJHNlbGVjdG9yczEpOwogICAgICAgICRjb21wb3VuZDIgPSByZXNldCgkc2VsZWN0b3JzMik7CgogICAgICAgIC8vIHVuaWZ5IHRoZW0gYW5kIHRoYXQncyBpdAogICAgICAgICR1bmlmaWVkID0gJHRoaXMtPnVuaWZ5Q29tcG91bmRTZWxlY3RvcnMoJGNvbXBvdW5kMSwgJGNvbXBvdW5kMik7CgogICAgICAgIHJldHVybiAkdGhpcy0+Zm9ybWF0T3V0cHV0U2VsZWN0b3IoJHVuaWZpZWQpOwogICAgfQoKICAgIC8qKgogICAgICogVGhlIHNlbGVjdG9yLXVuaWZ5IG1hZ2ljIGFzIGl0cyBiZXN0CiAgICAgKiAoYXQgbGVhc3Qgd29ya3MgYXMgZXhwZWN0ZWQgb24gdGVzdCBjYXNlcykKICAgICAqCiAgICAgKiBAcGFyYW0gYXJyYXkgJGNvbXBvdW5kMQogICAgICogQHBhcmFtIGFycmF5ICRjb21wb3VuZDIKICAgICAqCiAgICAgKiBAcmV0dXJuIGFycmF5CiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiB1bmlmeUNvbXBvdW5kU2VsZWN0b3JzKCRjb21wb3VuZDEsICRjb21wb3VuZDIpCiAgICB7CiAgICAgICAgaWYgKCEgXGNvdW50KCRjb21wb3VuZDEpKSB7CiAgICAgICAgICAgIHJldHVybiAkY29tcG91bmQyOwogICAgICAgIH0KCiAgICAgICAgaWYgKCEgXGNvdW50KCRjb21wb3VuZDIpKSB7CiAgICAgICAgICAgIHJldHVybiAkY29tcG91bmQxOwogICAgICAgIH0KCiAgICAgICAgLy8gY2hlY2sgdGhhdCBsYXN0IHBhcnQgYXJlIGNvbXBhdGlibGUKICAgICAgICAkbGFzdFBhcnQxID0gYXJyYXlfcG9wKCRjb21wb3VuZDEpOwogICAgICAgICRsYXN0UGFydDIgPSBhcnJheV9wb3AoJGNvbXBvdW5kMik7CiAgICAgICAgJGxhc3QgICAgICA9ICR0aGlzLT5tZXJnZVBhcnRzKCRsYXN0UGFydDEsICRsYXN0UGFydDIpOwoKICAgICAgICBpZiAoISAkbGFzdCkgewogICAgICAgICAgICByZXR1cm4gW1tdXTsKICAgICAgICB9CgogICAgICAgICR1bmlmaWVkQ29tcG91bmQgPSBbJGxhc3RdOwogICAgICAgICR1bmlmaWVkU2VsZWN0b3JzID0gWyR1bmlmaWVkQ29tcG91bmRdOwoKICAgICAgICAvLyBkbyB0aGUgcmVzdAogICAgICAgIHdoaWxlIChcY291bnQoJGNvbXBvdW5kMSkgfHwgXGNvdW50KCRjb21wb3VuZDIpKSB7CiAgICAgICAgICAgICRwYXJ0MSA9IGVuZCgkY29tcG91bmQxKTsKICAgICAgICAgICAgJHBhcnQyID0gZW5kKCRjb21wb3VuZDIpOwoKICAgICAgICAgICAgaWYgKCRwYXJ0MSAmJiAoJG1hdGNoMiA9ICR0aGlzLT5tYXRjaFBhcnRJbkNvbXBvdW5kKCRwYXJ0MSwgJGNvbXBvdW5kMikpKSB7CiAgICAgICAgICAgICAgICBsaXN0KCRjb21wb3VuZDIsICRwYXJ0MiwgJGFmdGVyMikgPSAkbWF0Y2gyOwoKICAgICAgICAgICAgICAgIGlmICgkYWZ0ZXIyKSB7CiAgICAgICAgICAgICAgICAgICAgJHVuaWZpZWRTZWxlY3RvcnMgPSAkdGhpcy0+cHJlcGVuZFNlbGVjdG9ycygkdW5pZmllZFNlbGVjdG9ycywgJGFmdGVyMik7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJGMgPSAkdGhpcy0+bWVyZ2VQYXJ0cygkcGFydDEsICRwYXJ0Mik7CiAgICAgICAgICAgICAgICAkdW5pZmllZFNlbGVjdG9ycyA9ICR0aGlzLT5wcmVwZW5kU2VsZWN0b3JzKCR1bmlmaWVkU2VsZWN0b3JzLCBbJGNdKTsKCiAgICAgICAgICAgICAgICAkcGFydDEgPSAkcGFydDIgPSBudWxsOwoKICAgICAgICAgICAgICAgIGFycmF5X3BvcCgkY29tcG91bmQxKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCRwYXJ0MiAmJiAoJG1hdGNoMSA9ICR0aGlzLT5tYXRjaFBhcnRJbkNvbXBvdW5kKCRwYXJ0MiwgJGNvbXBvdW5kMSkpKSB7CiAgICAgICAgICAgICAgICBsaXN0KCRjb21wb3VuZDEsICRwYXJ0MSwgJGFmdGVyMSkgPSAkbWF0Y2gxOwoKICAgICAgICAgICAgICAgIGlmICgkYWZ0ZXIxKSB7CiAgICAgICAgICAgICAgICAgICAgJHVuaWZpZWRTZWxlY3RvcnMgPSAkdGhpcy0+cHJlcGVuZFNlbGVjdG9ycygkdW5pZmllZFNlbGVjdG9ycywgJGFmdGVyMSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJGMgPSAkdGhpcy0+bWVyZ2VQYXJ0cygkcGFydDIsICRwYXJ0MSk7CiAgICAgICAgICAgICAgICAkdW5pZmllZFNlbGVjdG9ycyA9ICR0aGlzLT5wcmVwZW5kU2VsZWN0b3JzKCR1bmlmaWVkU2VsZWN0b3JzLCBbJGNdKTsKCiAgICAgICAgICAgICAgICAkcGFydDEgPSAkcGFydDIgPSBudWxsOwoKICAgICAgICAgICAgICAgIGFycmF5X3BvcCgkY29tcG91bmQyKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJG5ldyA9IFtdOwoKICAgICAgICAgICAgaWYgKCRwYXJ0MSAmJiAkcGFydDIpIHsKICAgICAgICAgICAgICAgIGFycmF5X3BvcCgkY29tcG91bmQxKTsKICAgICAgICAgICAgICAgIGFycmF5X3BvcCgkY29tcG91bmQyKTsKCiAgICAgICAgICAgICAgICAkcyAgID0gJHRoaXMtPnByZXBlbmRTZWxlY3RvcnMoJHVuaWZpZWRTZWxlY3RvcnMsIFskcGFydDJdKTsKICAgICAgICAgICAgICAgICRuZXcgPSBhcnJheV9tZXJnZSgkbmV3LCAkdGhpcy0+cHJlcGVuZFNlbGVjdG9ycygkcywgWyRwYXJ0MV0pKTsKICAgICAgICAgICAgICAgICRzICAgPSAkdGhpcy0+cHJlcGVuZFNlbGVjdG9ycygkdW5pZmllZFNlbGVjdG9ycywgWyRwYXJ0MV0pOwogICAgICAgICAgICAgICAgJG5ldyA9IGFycmF5X21lcmdlKCRuZXcsICR0aGlzLT5wcmVwZW5kU2VsZWN0b3JzKCRzLCBbJHBhcnQyXSkpOwogICAgICAgICAgICB9IGVsc2VpZiAoJHBhcnQxKSB7CiAgICAgICAgICAgICAgICBhcnJheV9wb3AoJGNvbXBvdW5kMSk7CgogICAgICAgICAgICAgICAgJG5ldyA9IGFycmF5X21lcmdlKCRuZXcsICR0aGlzLT5wcmVwZW5kU2VsZWN0b3JzKCR1bmlmaWVkU2VsZWN0b3JzLCBbJHBhcnQxXSkpOwogICAgICAgICAgICB9IGVsc2VpZiAoJHBhcnQyKSB7CiAgICAgICAgICAgICAgICBhcnJheV9wb3AoJGNvbXBvdW5kMik7CgogICAgICAgICAgICAgICAgJG5ldyA9IGFycmF5X21lcmdlKCRuZXcsICR0aGlzLT5wcmVwZW5kU2VsZWN0b3JzKCR1bmlmaWVkU2VsZWN0b3JzLCBbJHBhcnQyXSkpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoJG5ldykgewogICAgICAgICAgICAgICAgJHVuaWZpZWRTZWxlY3RvcnMgPSAkbmV3OwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJHVuaWZpZWRTZWxlY3RvcnM7CiAgICB9CgogICAgLyoqCiAgICAgKiBQcmVwZW5kIGVhY2ggc2VsZWN0b3IgZnJvbSAkc2VsZWN0b3JzIHdpdGggJHBhcnRzCiAgICAgKgogICAgICogQHBhcmFtIGFycmF5ICRzZWxlY3RvcnMKICAgICAqIEBwYXJhbSBhcnJheSAkcGFydHMKICAgICAqCiAgICAgKiBAcmV0dXJuIGFycmF5CiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBwcmVwZW5kU2VsZWN0b3JzKCRzZWxlY3RvcnMsICRwYXJ0cykKICAgIHsKICAgICAgICAkbmV3ID0gW107CgogICAgICAgIGZvcmVhY2ggKCRzZWxlY3RvcnMgYXMgJGNvbXBvdW5kU2VsZWN0b3IpIHsKICAgICAgICAgICAgYXJyYXlfdW5zaGlmdCgkY29tcG91bmRTZWxlY3RvciwgJHBhcnRzKTsKCiAgICAgICAgICAgICRuZXdbXSA9ICRjb21wb3VuZFNlbGVjdG9yOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRuZXc7CiAgICB9CgogICAgLyoqCiAgICAgKiBUcnkgdG8gZmluZCBhIG1hdGNoaW5nIHBhcnQgaW4gYSBjb21wb3VuZDoKICAgICAqIC0gd2l0aCBzYW1lIGh0bWwgdGFnIG5hbWUKICAgICAqIC0gd2l0aCBzb21lIGNsYXNzIG9yIGlkIG9yIHNvbWV0aGluZyBpbiBjb21tb24KICAgICAqCiAgICAgKiBAcGFyYW0gYXJyYXkgJHBhcnQKICAgICAqIEBwYXJhbSBhcnJheSAkY29tcG91bmQKICAgICAqCiAgICAgKiBAcmV0dXJuIGFycmF5fGZhbHNlCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBtYXRjaFBhcnRJbkNvbXBvdW5kKCRwYXJ0LCAkY29tcG91bmQpCiAgICB7CiAgICAgICAgJHBhcnRUYWcgPSAkdGhpcy0+ZmluZFRhZ05hbWUoJHBhcnQpOwogICAgICAgICRiZWZvcmUgID0gJGNvbXBvdW5kOwogICAgICAgICRhZnRlciAgID0gW107CgogICAgICAgIC8vIHRyeSB0byBmaW5kIGEgbWF0Y2ggYnkgdGFnIG5hbWUgZmlyc3QKICAgICAgICB3aGlsZSAoXGNvdW50KCRiZWZvcmUpKSB7CiAgICAgICAgICAgICRwID0gYXJyYXlfcG9wKCRiZWZvcmUpOwoKICAgICAgICAgICAgaWYgKCRwYXJ0VGFnICYmICRwYXJ0VGFnICE9PSAnKicgJiYgJHBhcnRUYWcgPT0gJHRoaXMtPmZpbmRUYWdOYW1lKCRwKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIFskYmVmb3JlLCAkcCwgJGFmdGVyXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJGFmdGVyW10gPSAkcDsKICAgICAgICB9CgogICAgICAgIC8vIHRyeSBhZ2FpbiBtYXRjaGluZyBhIG5vbiBlbXB0eSBpbnRlcnNlY3Rpb24gYW5kIGEgY29tcGF0aWJsZSB0YWduYW1lCiAgICAgICAgJGJlZm9yZSA9ICRjb21wb3VuZDsKICAgICAgICAkYWZ0ZXIgPSBbXTsKCiAgICAgICAgd2hpbGUgKFxjb3VudCgkYmVmb3JlKSkgewogICAgICAgICAgICAkcCA9IGFycmF5X3BvcCgkYmVmb3JlKTsKCiAgICAgICAgICAgIGlmICgkdGhpcy0+Y2hlY2tDb21wYXRpYmxlVGFncygkcGFydFRhZywgJHRoaXMtPmZpbmRUYWdOYW1lKCRwKSkpIHsKICAgICAgICAgICAgICAgIGlmIChcY291bnQoYXJyYXlfaW50ZXJzZWN0KCRwYXJ0LCAkcCkpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFskYmVmb3JlLCAkcCwgJGFmdGVyXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgJGFmdGVyW10gPSAkcDsKICAgICAgICB9CgogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICAvKioKICAgICAqIE1lcmdlIHR3byBwYXJ0IGxpc3QgdGFraW5nIGNhcmUgdGhhdAogICAgICogLSB0aGUgaHRtbCB0YWcgaXMgY29taW5nIGZpcnN0IC0gaWYgYW55CiAgICAgKiAtIHRoZSA6c29tZXRoaW5nIGFyZSBjb21pbmcgbGFzdAogICAgICoKICAgICAqIEBwYXJhbSBhcnJheSAkcGFydHMxCiAgICAgKiBAcGFyYW0gYXJyYXkgJHBhcnRzMgogICAgICoKICAgICAqIEByZXR1cm4gYXJyYXkKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIG1lcmdlUGFydHMoJHBhcnRzMSwgJHBhcnRzMikKICAgIHsKICAgICAgICAkdGFnMSA9ICR0aGlzLT5maW5kVGFnTmFtZSgkcGFydHMxKTsKICAgICAgICAkdGFnMiA9ICR0aGlzLT5maW5kVGFnTmFtZSgkcGFydHMyKTsKICAgICAgICAkdGFnICA9ICR0aGlzLT5jaGVja0NvbXBhdGlibGVUYWdzKCR0YWcxLCAkdGFnMik7CgogICAgICAgIC8vIG5vdCBjb21wYXRpYmxlIHRhZ3MKICAgICAgICBpZiAoJHRhZyA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgcmV0dXJuIFtdOwogICAgICAgIH0KCiAgICAgICAgaWYgKCR0YWcpIHsKICAgICAgICAgICAgaWYgKCR0YWcxKSB7CiAgICAgICAgICAgICAgICAkcGFydHMxID0gYXJyYXlfZGlmZigkcGFydHMxLCBbJHRhZzFdKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCR0YWcyKSB7CiAgICAgICAgICAgICAgICAkcGFydHMyID0gYXJyYXlfZGlmZigkcGFydHMyLCBbJHRhZzJdKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJG1lcmdlZFBhcnRzID0gYXJyYXlfbWVyZ2UoJHBhcnRzMSwgJHBhcnRzMik7CiAgICAgICAgJG1lcmdlZE9yZGVyZWRQYXJ0cyA9IFtdOwoKICAgICAgICBmb3JlYWNoICgkbWVyZ2VkUGFydHMgYXMgJHBhcnQpIHsKICAgICAgICAgICAgaWYgKHN0cnBvcygkcGFydCwgJzonKSA9PT0gMCkgewogICAgICAgICAgICAgICAgJG1lcmdlZE9yZGVyZWRQYXJ0c1tdID0gJHBhcnQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICRtZXJnZWRQYXJ0cyA9IGFycmF5X2RpZmYoJG1lcmdlZFBhcnRzLCAkbWVyZ2VkT3JkZXJlZFBhcnRzKTsKICAgICAgICAkbWVyZ2VkUGFydHMgPSBhcnJheV9tZXJnZSgkbWVyZ2VkUGFydHMsICRtZXJnZWRPcmRlcmVkUGFydHMpOwoKICAgICAgICBpZiAoJHRhZykgewogICAgICAgICAgICBhcnJheV91bnNoaWZ0KCRtZXJnZWRQYXJ0cywgJHRhZyk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJG1lcmdlZFBhcnRzOwogICAgfQoKICAgIC8qKgogICAgICogQ2hlY2sgdGhlIGNvbXBhdGliaWxpdHkgYmV0d2VlbiB0d28gdGFnIG5hbWVzOgogICAgICogaWYgYm90aCBhcmUgZGVmaW5lZCB0aGV5IHNob3VsZCBiZSBpZGVudGljYWwgb3Igb25lIGhhcyB0byBiZSAnKicKICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICR0YWcxCiAgICAgKiBAcGFyYW0gc3RyaW5nICR0YWcyCiAgICAgKgogICAgICogQHJldHVybiBhcnJheXxmYWxzZQogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gY2hlY2tDb21wYXRpYmxlVGFncygkdGFnMSwgJHRhZzIpCiAgICB7CiAgICAgICAgJHRhZ3MgPSBbJHRhZzEsICR0YWcyXTsKICAgICAgICAkdGFncyA9IGFycmF5X3VuaXF1ZSgkdGFncyk7CiAgICAgICAgJHRhZ3MgPSBhcnJheV9maWx0ZXIoJHRhZ3MpOwoKICAgICAgICBpZiAoXGNvdW50KCR0YWdzKSA+IDEpIHsKICAgICAgICAgICAgJHRhZ3MgPSBhcnJheV9kaWZmKCR0YWdzLCBbJyonXSk7CiAgICAgICAgfQoKICAgICAgICAvLyBub3QgY29tcGF0aWJsZSBub2RlcwogICAgICAgIGlmIChcY291bnQoJHRhZ3MpID4gMSkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJHRhZ3M7CiAgICB9CgogICAgLyoqCiAgICAgKiBGaW5kIHRoZSBodG1sIHRhZyBuYW1lIGluIGEgc2VsZWN0b3IgcGFydHMgbGlzdAogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmdbXSAkcGFydHMKICAgICAqCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gZmluZFRhZ05hbWUoJHBhcnRzKQogICAgewogICAgICAgIGZvcmVhY2ggKCRwYXJ0cyBhcyAkcGFydCkgewogICAgICAgICAgICBpZiAoISBwcmVnX21hdGNoKCcvXltcWy46IyVfLV0vJywgJHBhcnQpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJHBhcnQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiAnJzsKICAgIH0KCiAgICBwcm90ZWN0ZWQgc3RhdGljICRsaWJTaW1wbGVTZWxlY3RvcnMgPSBbJ3NlbGVjdG9yJ107CiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gbGliU2ltcGxlU2VsZWN0b3JzKCRhcmdzKQogICAgewogICAgICAgICRzZWxlY3RvciA9IHJlc2V0KCRhcmdzKTsKICAgICAgICAkc2VsZWN0b3IgPSAkdGhpcy0+Z2V0U2VsZWN0b3JBcmcoJHNlbGVjdG9yLCAnc2VsZWN0b3InKTsKCiAgICAgICAgLy8gcmVtb3ZlIHNlbGVjdG9ycyBsaXN0IGxheWVyLCBrZWVwaW5nIHRoZSBmaXJzdCBvbmUKICAgICAgICAkc2VsZWN0b3IgPSByZXNldCgkc2VsZWN0b3IpOwoKICAgICAgICAvLyByZW1vdmUgcGFydHMgbGlzdCBsYXllciwga2VlcGluZyB0aGUgZmlyc3QgcGFydAogICAgICAgICRwYXJ0ID0gcmVzZXQoJHNlbGVjdG9yKTsKCiAgICAgICAgJGxpc3RQYXJ0cyA9IFtdOwoKICAgICAgICBmb3JlYWNoICgkcGFydCBhcyAkcCkgewogICAgICAgICAgICAkbGlzdFBhcnRzW10gPSBbVHlwZTo6VF9TVFJJTkcsICcnLCBbJHBdXTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBbVHlwZTo6VF9MSVNULCAnLCcsICRsaXN0UGFydHNdOwogICAgfQoKICAgIHByb3RlY3RlZCBzdGF0aWMgJGxpYlNjc3NwaHBHbG9iID0gWydwYXR0ZXJuJ107CiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gbGliU2Nzc3BocEdsb2IoJGFyZ3MpCiAgICB7CiAgICAgICAgQHRyaWdnZXJfZXJyb3Ioc3ByaW50ZignVGhlICJzY3NzcGhwLWdsb2IiIGZ1bmN0aW9uIGlzIGRlcHJlY2F0ZWQgYW4gd2lsbCBiZSByZW1vdmVkIGluIFNjc3NQaHAgMi4wLiBSZWdpc3RlciB5b3VyIG93biBhbHRlcm5hdGl2ZSB0aHJvdWdoICIlczo6cmVnaXN0ZXJGdW5jdGlvbicsIF9fQ0xBU1NfXyksIEVfVVNFUl9ERVBSRUNBVEVEKTsKCiAgICAgICAgJHRoaXMtPmxvZ2dlci0+d2FybignVGhlICJzY3NzcGhwLWdsb2IiIGZ1bmN0aW9uIGlzIGRlcHJlY2F0ZWQgYW4gd2lsbCBiZSByZW1vdmVkIGluIFNjc3NQaHAgMi4wLicsIHRydWUpOwoKICAgICAgICAkc3RyaW5nID0gJHRoaXMtPmFzc2VydFN0cmluZygkYXJnc1swXSwgJ3BhdHRlcm4nKTsKICAgICAgICAkcGF0dGVybiA9ICR0aGlzLT5jb21waWxlU3RyaW5nQ29udGVudCgkc3RyaW5nKTsKICAgICAgICAkbWF0Y2hlcyA9IGdsb2IoJHBhdHRlcm4pOwogICAgICAgICRsaXN0UGFydHMgPSBbXTsKCiAgICAgICAgZm9yZWFjaCAoJG1hdGNoZXMgYXMgJG1hdGNoKSB7CiAgICAgICAgICAgIGlmICghIGlzX2ZpbGUoJG1hdGNoKSkgewogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRsaXN0UGFydHNbXSA9IFtUeXBlOjpUX1NUUklORywgJyInLCBbJG1hdGNoXV07CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gW1R5cGU6OlRfTElTVCwgJywnLCAkbGlzdFBhcnRzXTsKICAgIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/extra/scssphp/src/Compiler/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/extra/scssphp/src/Compiler/CachedResult.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXENvbXBpbGVyOwoKdXNlIFNjc3NQaHBcU2Nzc1BocFxDb21waWxhdGlvblJlc3VsdDsKCi8qKgogKiBAaW50ZXJuYWwKICovCmNsYXNzIENhY2hlZFJlc3VsdAp7CiAgICAvKioKICAgICAqIEB2YXIgQ29tcGlsYXRpb25SZXN1bHQKICAgICAqLwogICAgcHJpdmF0ZSAkcmVzdWx0OwoKICAgIC8qKgogICAgICogQHZhciBhcnJheTxzdHJpbmcsIGludD4KICAgICAqLwogICAgcHJpdmF0ZSAkcGFyc2VkRmlsZXM7CgogICAgLyoqCiAgICAgKiBAdmFyIGFycmF5CiAgICAgKiBAcGhwc3Rhbi12YXIgbGlzdDxhcnJheXtjdXJyZW50RGlyOiBzdHJpbmd8bnVsbCwgcGF0aDogc3RyaW5nLCBmaWxlUGF0aDogc3RyaW5nfT4KICAgICAqLwogICAgcHJpdmF0ZSAkcmVzb2x2ZWRJbXBvcnRzOwoKICAgIC8qKgogICAgICogQHBhcmFtIENvbXBpbGF0aW9uUmVzdWx0ICAkcmVzdWx0CiAgICAgKiBAcGFyYW0gYXJyYXk8c3RyaW5nLCBpbnQ+ICRwYXJzZWRGaWxlcwogICAgICogQHBhcmFtIGFycmF5ICAgICAgICAgICAgICAkcmVzb2x2ZWRJbXBvcnRzCiAgICAgKgogICAgICogQHBocHN0YW4tcGFyYW0gbGlzdDxhcnJheXtjdXJyZW50RGlyOiBzdHJpbmd8bnVsbCwgcGF0aDogc3RyaW5nLCBmaWxlUGF0aDogc3RyaW5nfT4gJHJlc29sdmVkSW1wb3J0cwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoQ29tcGlsYXRpb25SZXN1bHQgJHJlc3VsdCwgYXJyYXkgJHBhcnNlZEZpbGVzLCBhcnJheSAkcmVzb2x2ZWRJbXBvcnRzKQogICAgewogICAgICAgICR0aGlzLT5yZXN1bHQgPSAkcmVzdWx0OwogICAgICAgICR0aGlzLT5wYXJzZWRGaWxlcyA9ICRwYXJzZWRGaWxlczsKICAgICAgICAkdGhpcy0+cmVzb2x2ZWRJbXBvcnRzID0gJHJlc29sdmVkSW1wb3J0czsKICAgIH0KCiAgICAvKioKICAgICAqIEByZXR1cm4gQ29tcGlsYXRpb25SZXN1bHQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldFJlc3VsdCgpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5yZXN1bHQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcmV0dXJuIGFycmF5PHN0cmluZywgaW50PgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0UGFyc2VkRmlsZXMoKQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+cGFyc2VkRmlsZXM7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcmV0dXJuIGFycmF5CiAgICAgKgogICAgICogQHBocHN0YW4tcmV0dXJuIGxpc3Q8YXJyYXl7Y3VycmVudERpcjogc3RyaW5nfG51bGwsIHBhdGg6IHN0cmluZywgZmlsZVBhdGg6IHN0cmluZ30+CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRSZXNvbHZlZEltcG9ydHMoKQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+cmVzb2x2ZWRJbXBvcnRzOwogICAgfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/extra/scssphp/src/Compiler/Environment.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXENvbXBpbGVyOwoKLyoqCiAqIENvbXBpbGVyIGVudmlyb25tZW50CiAqCiAqIEBhdXRob3IgQW50aG9uIFBhbmcgPGFudGhvbi5wYW5nQGdtYWlsLmNvbT4KICoKICogQGludGVybmFsCiAqLwpjbGFzcyBFbnZpcm9ubWVudAp7CiAgICAvKioKICAgICAqIEB2YXIgXFNjc3NQaHBcU2Nzc1BocFxCbG9ja3xudWxsCiAgICAgKi8KICAgIHB1YmxpYyAkYmxvY2s7CgogICAgLyoqCiAgICAgKiBAdmFyIFxTY3NzUGhwXFNjc3NQaHBcQ29tcGlsZXJcRW52aXJvbm1lbnR8bnVsbAogICAgICovCiAgICBwdWJsaWMgJHBhcmVudDsKCiAgICAvKioKICAgICAqIEB2YXIgRW52aXJvbm1lbnR8bnVsbAogICAgICovCiAgICBwdWJsaWMgJGRlY2xhcmF0aW9uU2NvcGVQYXJlbnQ7CgogICAgLyoqCiAgICAgKiBAdmFyIEVudmlyb25tZW50fG51bGwKICAgICAqLwogICAgcHVibGljICRwYXJlbnRTdG9yZTsKCiAgICAvKioKICAgICAqIEB2YXIgYXJyYXl8bnVsbAogICAgICovCiAgICBwdWJsaWMgJHNlbGVjdG9yczsKCiAgICAvKioKICAgICAqIEB2YXIgc3RyaW5nfG51bGwKICAgICAqLwogICAgcHVibGljICRtYXJrZXI7CgogICAgLyoqCiAgICAgKiBAdmFyIGFycmF5CiAgICAgKi8KICAgIHB1YmxpYyAkc3RvcmU7CgogICAgLyoqCiAgICAgKiBAdmFyIGFycmF5CiAgICAgKi8KICAgIHB1YmxpYyAkc3RvcmVVbnJlZHVjZWQ7CgogICAgLyoqCiAgICAgKiBAdmFyIGludAogICAgICovCiAgICBwdWJsaWMgJGRlcHRoOwp9Cg==]]></data>
	</file>
	<file>
	  <filename>/extra/scssphp/src/Exception/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/extra/scssphp/src/Exception/CompilerException.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEV4Y2VwdGlvbjsKCi8qKgogKiBDb21waWxlciBleGNlcHRpb24KICoKICogQGF1dGhvciBPbGVrc2FuZHIgU2F2Y2hlbmtvIDx0cmF2ZWx0aW5vQGdtYWlsLmNvbT4KICoKICogQGludGVybmFsCiAqLwpjbGFzcyBDb21waWxlckV4Y2VwdGlvbiBleHRlbmRzIFxFeGNlcHRpb24gaW1wbGVtZW50cyBTYXNzRXhjZXB0aW9uCnsKfQo=]]></data>
	</file>
	<file>
	  <filename>/extra/scssphp/src/Exception/ParserException.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEV4Y2VwdGlvbjsKCi8qKgogKiBQYXJzZXIgRXhjZXB0aW9uCiAqCiAqIEBhdXRob3IgT2xla3NhbmRyIFNhdmNoZW5rbyA8dHJhdmVsdGlub0BnbWFpbC5jb20+CiAqCiAqIEBpbnRlcm5hbAogKi8KY2xhc3MgUGFyc2VyRXhjZXB0aW9uIGV4dGVuZHMgXEV4Y2VwdGlvbiBpbXBsZW1lbnRzIFNhc3NFeGNlcHRpb24KewogICAgLyoqCiAgICAgKiBAdmFyIGFycmF5fG51bGwKICAgICAqIEBwaHBzdGFuLXZhciBhcnJheXtzdHJpbmcsIGludCwgaW50fXxudWxsCiAgICAgKi8KICAgIHByaXZhdGUgJHNvdXJjZVBvc2l0aW9uOwoKICAgIC8qKgogICAgICogR2V0IHNvdXJjZSBwb3NpdGlvbgogICAgICoKICAgICAqIEBhcGkKICAgICAqCiAgICAgKiBAcmV0dXJuIGFycmF5fG51bGwKICAgICAqIEBwaHBzdGFuLXJldHVybiBhcnJheXtzdHJpbmcsIGludCwgaW50fXxudWxsCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRTb3VyY2VQb3NpdGlvbigpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5zb3VyY2VQb3NpdGlvbjsKICAgIH0KCiAgICAvKioKICAgICAqIFNldCBzb3VyY2UgcG9zaXRpb24KICAgICAqCiAgICAgKiBAYXBpCiAgICAgKgogICAgICogQHBhcmFtIGFycmF5ICRzb3VyY2VQb3NpdGlvbgogICAgICoKICAgICAqIEByZXR1cm4gdm9pZAogICAgICoKICAgICAqIEBwaHBzdGFuLXBhcmFtIGFycmF5e3N0cmluZywgaW50LCBpbnR9ICRzb3VyY2VQb3NpdGlvbgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc2V0U291cmNlUG9zaXRpb24oJHNvdXJjZVBvc2l0aW9uKQogICAgewogICAgICAgICR0aGlzLT5zb3VyY2VQb3NpdGlvbiA9ICRzb3VyY2VQb3NpdGlvbjsKICAgIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/extra/scssphp/src/Exception/RangeException.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEV4Y2VwdGlvbjsKCi8qKgogKiBSYW5nZSBleGNlcHRpb24KICoKICogQGF1dGhvciBBbnRob24gUGFuZyA8YW50aG9uLnBhbmdAZ21haWwuY29tPgogKgogKiBAaW50ZXJuYWwKICovCmNsYXNzIFJhbmdlRXhjZXB0aW9uIGV4dGVuZHMgXEV4Y2VwdGlvbiBpbXBsZW1lbnRzIFNhc3NFeGNlcHRpb24Kewp9Cg==]]></data>
	</file>
	<file>
	  <filename>/extra/scssphp/src/Exception/SassException.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCm5hbWVzcGFjZSBTY3NzUGhwXFNjc3NQaHBcRXhjZXB0aW9uOwoKaW50ZXJmYWNlIFNhc3NFeGNlcHRpb24Kewp9Cg==]]></data>
	</file>
	<file>
	  <filename>/extra/scssphp/src/Exception/SassScriptException.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCm5hbWVzcGFjZSBTY3NzUGhwXFNjc3NQaHBcRXhjZXB0aW9uOwoKLyoqCiAqIEFuIGV4Y2VwdGlvbiB0aHJvd24gYnkgU2Fzc1NjcmlwdC4KICoKICogVGhpcyBjbGFzcyBkb2VzIG5vdCBpbXBsZW1lbnQgU2Fzc0V4Y2VwdGlvbiBvbiBwdXJwb3NlLCBhcyBpdCBzaG91bGQKICogbmV2ZXIgYmUgcmV0dXJuZWQgdG8gdGhlIG91dHNpZGUgY29kZS4gVGhlIGNvbXBpbGF0aW9uIHdpbGwgY2F0Y2ggaXQKICogYW5kIHJlcGxhY2UgaXQgd2l0aCBhIFNhc3NFeGNlcHRpb24gcmVwb3J0aW5nIHRoZSBsb2NhdGlvbiBvZiB0aGUKICogZXJyb3IuCiAqLwpjbGFzcyBTYXNzU2NyaXB0RXhjZXB0aW9uIGV4dGVuZHMgXEV4Y2VwdGlvbgp7CiAgICAvKioKICAgICAqIENyZWF0ZXMgYSBTYXNzU2NyaXB0RXhjZXB0aW9uIHdpdGggc3VwcG9ydCBmb3IgYW4gYXJndW1lbnQgbmFtZS4KICAgICAqCiAgICAgKiBUaGlzIGhlbHBlciBlbnN1cmVzIGEgY29uc2lzdGVudCBoYW5kbGluZyBvZiBhcmd1bWVudCBuYW1lcyBpbiB0aGUKICAgICAqIGVycm9yIG1lc3NhZ2UsIHdpdGhvdXQgZHVwbGljYXRpbmcgaXQuCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAgICAgICRtZXNzYWdlCiAgICAgKiBAcGFyYW0gc3RyaW5nfG51bGwgJG5hbWUgICAgVGhlIGFyZ3VtZW50IG5hbWUsIHdpdGhvdXQgJAogICAgICoKICAgICAqIEByZXR1cm4gU2Fzc1NjcmlwdEV4Y2VwdGlvbgogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGZvckFyZ3VtZW50KCRtZXNzYWdlLCAkbmFtZSA9IG51bGwpCiAgICB7CiAgICAgICAgJHZhckRpc3BsYXkgPSAhXGlzX251bGwoJG5hbWUpID8gIlwkeyRuYW1lfTogIiA6ICcnOwoKICAgICAgICByZXR1cm4gbmV3IHNlbGYoJHZhckRpc3BsYXkgLiAkbWVzc2FnZSk7CiAgICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/extra/scssphp/src/Exception/ServerException.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEV4Y2VwdGlvbjsKCkB0cmlnZ2VyX2Vycm9yKHNwcmludGYoJ1RoZSAiJXMiIGNsYXNzIGlzIGRlcHJlY2F0ZWQuJywgU2VydmVyRXhjZXB0aW9uOjpjbGFzcyksIEVfVVNFUl9ERVBSRUNBVEVEKTsKCi8qKgogKiBTZXJ2ZXIgRXhjZXB0aW9uCiAqCiAqIEBhdXRob3IgQW50aG9uIFBhbmcgPGFudGhvbi5wYW5nQGdtYWlsLmNvbT4KICoKICogQGRlcHJlY2F0ZWQgVGhlIFNjc3NwaHAgc2VydmVyIHNob3VsZCBkZWZpbmUgaXRzIG93biBleGNlcHRpb24gaW5zdGVhZC4KICovCmNsYXNzIFNlcnZlckV4Y2VwdGlvbiBleHRlbmRzIFxFeGNlcHRpb24gaW1wbGVtZW50cyBTYXNzRXhjZXB0aW9uCnsKfQo=]]></data>
	</file>
	<file>
	  <filename>/extra/scssphp/src/Formatter.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwOwoKdXNlIFNjc3NQaHBcU2Nzc1BocFxGb3JtYXR0ZXJcT3V0cHV0QmxvY2s7CnVzZSBTY3NzUGhwXFNjc3NQaHBcU291cmNlTWFwXFNvdXJjZU1hcEdlbmVyYXRvcjsKCi8qKgogKiBCYXNlIGZvcm1hdHRlcgogKgogKiBAYXV0aG9yIExlYWYgQ29yY29yYW4gPGxlYWZvdEBnbWFpbC5jb20+CiAqCiAqIEBpbnRlcm5hbAogKi8KYWJzdHJhY3QgY2xhc3MgRm9ybWF0dGVyCnsKICAgIC8qKgogICAgICogQHZhciBpbnQKICAgICAqLwogICAgcHVibGljICRpbmRlbnRMZXZlbDsKCiAgICAvKioKICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkaW5kZW50Q2hhcjsKCiAgICAvKioKICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkYnJlYWs7CgogICAgLyoqCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgJG9wZW47CgogICAgLyoqCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgJGNsb3NlOwoKICAgIC8qKgogICAgICogQHZhciBzdHJpbmcKICAgICAqLwogICAgcHVibGljICR0YWdTZXBhcmF0b3I7CgogICAgLyoqCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgJGFzc2lnblNlcGFyYXRvcjsKCiAgICAvKioKICAgICAqIEB2YXIgYm9vbAogICAgICovCiAgICBwdWJsaWMgJGtlZXBTZW1pY29sb25zOwoKICAgIC8qKgogICAgICogQHZhciBcU2Nzc1BocFxTY3NzUGhwXEZvcm1hdHRlclxPdXRwdXRCbG9jawogICAgICovCiAgICBwcm90ZWN0ZWQgJGN1cnJlbnRCbG9jazsKCiAgICAvKioKICAgICAqIEB2YXIgaW50CiAgICAgKi8KICAgIHByb3RlY3RlZCAkY3VycmVudExpbmU7CgogICAgLyoqCiAgICAgKiBAdmFyIGludAogICAgICovCiAgICBwcm90ZWN0ZWQgJGN1cnJlbnRDb2x1bW47CgogICAgLyoqCiAgICAgKiBAdmFyIFxTY3NzUGhwXFNjc3NQaHBcU291cmNlTWFwXFNvdXJjZU1hcEdlbmVyYXRvcnxudWxsCiAgICAgKi8KICAgIHByb3RlY3RlZCAkc291cmNlTWFwR2VuZXJhdG9yOwoKICAgIC8qKgogICAgICogQHZhciBzdHJpbmcKICAgICAqLwogICAgcHJvdGVjdGVkICRzdHJpcHBlZFNlbWljb2xvbjsKCiAgICAvKioKICAgICAqIEluaXRpYWxpemUgZm9ybWF0dGVyCiAgICAgKgogICAgICogQGFwaQogICAgICovCiAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoKTsKCiAgICAvKioKICAgICAqIFJldHVybiBpbmRlbnRhdGlvbiAod2hpdGVzcGFjZSkKICAgICAqCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gaW5kZW50U3RyKCkKICAgIHsKICAgICAgICByZXR1cm4gJyc7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm4gcHJvcGVydHkgYXNzaWdubWVudAogICAgICoKICAgICAqIEBhcGkKICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lCiAgICAgKiBAcGFyYW0gbWl4ZWQgICR2YWx1ZQogICAgICoKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBwcm9wZXJ0eSgkbmFtZSwgJHZhbHVlKQogICAgewogICAgICAgIHJldHVybiBydHJpbSgkbmFtZSkgLiAkdGhpcy0+YXNzaWduU2VwYXJhdG9yIC4gJHZhbHVlIC4gJzsnOwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJuIGN1c3RvbSBwcm9wZXJ0eSBhc3NpZ25tZW50CiAgICAgKiBkaWZmZXJzIGluIHRoYXQgeW91IGhhdmUgdG8ga2VlcCBzcGFjZXMgaW4gdGhlIHZhbHVlIGFzIGlzCiAgICAgKgogICAgICogQGFwaQogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgJG5hbWUKICAgICAqIEBwYXJhbSBtaXhlZCAgJHZhbHVlCiAgICAgKgogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGN1c3RvbVByb3BlcnR5KCRuYW1lLCAkdmFsdWUpCiAgICB7CiAgICAgICAgcmV0dXJuIHJ0cmltKCRuYW1lKSAuIHRyaW0oJHRoaXMtPmFzc2lnblNlcGFyYXRvcikgLiAkdmFsdWUgLiAnOyc7CiAgICB9CgogICAgLyoqCiAgICAgKiBPdXRwdXQgbGluZXMgaW5zaWRlIGEgYmxvY2sKICAgICAqCiAgICAgKiBAcGFyYW0gXFNjc3NQaHBcU2Nzc1BocFxGb3JtYXR0ZXJcT3V0cHV0QmxvY2sgJGJsb2NrCiAgICAgKgogICAgICogQHJldHVybiB2b2lkCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBibG9ja0xpbmVzKE91dHB1dEJsb2NrICRibG9jaykKICAgIHsKICAgICAgICAkaW5uZXIgPSAkdGhpcy0+aW5kZW50U3RyKCk7CiAgICAgICAgJGdsdWUgID0gJHRoaXMtPmJyZWFrIC4gJGlubmVyOwoKICAgICAgICAkdGhpcy0+d3JpdGUoJGlubmVyIC4gaW1wbG9kZSgkZ2x1ZSwgJGJsb2NrLT5saW5lcykpOwoKICAgICAgICBpZiAoISBlbXB0eSgkYmxvY2stPmNoaWxkcmVuKSkgewogICAgICAgICAgICAkdGhpcy0+d3JpdGUoJHRoaXMtPmJyZWFrKTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBPdXRwdXQgYmxvY2sgc2VsZWN0b3JzCiAgICAgKgogICAgICogQHBhcmFtIFxTY3NzUGhwXFNjc3NQaHBcRm9ybWF0dGVyXE91dHB1dEJsb2NrICRibG9jawogICAgICoKICAgICAqIEByZXR1cm4gdm9pZAogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gYmxvY2tTZWxlY3RvcnMoT3V0cHV0QmxvY2sgJGJsb2NrKQogICAgewogICAgICAgIGFzc2VydCghIGVtcHR5KCRibG9jay0+c2VsZWN0b3JzKSk7CgogICAgICAgICRpbm5lciA9ICR0aGlzLT5pbmRlbnRTdHIoKTsKCiAgICAgICAgJHRoaXMtPndyaXRlKCRpbm5lcgogICAgICAgICAgICAuIGltcGxvZGUoJHRoaXMtPnRhZ1NlcGFyYXRvciwgJGJsb2NrLT5zZWxlY3RvcnMpCiAgICAgICAgICAgIC4gJHRoaXMtPm9wZW4gLiAkdGhpcy0+YnJlYWspOwogICAgfQoKICAgIC8qKgogICAgICogT3V0cHV0IGJsb2NrIGNoaWxkcmVuCiAgICAgKgogICAgICogQHBhcmFtIFxTY3NzUGhwXFNjc3NQaHBcRm9ybWF0dGVyXE91dHB1dEJsb2NrICRibG9jawogICAgICoKICAgICAqIEByZXR1cm4gdm9pZAogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gYmxvY2tDaGlsZHJlbihPdXRwdXRCbG9jayAkYmxvY2spCiAgICB7CiAgICAgICAgZm9yZWFjaCAoJGJsb2NrLT5jaGlsZHJlbiBhcyAkY2hpbGQpIHsKICAgICAgICAgICAgJHRoaXMtPmJsb2NrKCRjaGlsZCk7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogT3V0cHV0IG5vbi1lbXB0eSBibG9jawogICAgICoKICAgICAqIEBwYXJhbSBcU2Nzc1BocFxTY3NzUGhwXEZvcm1hdHRlclxPdXRwdXRCbG9jayAkYmxvY2sKICAgICAqCiAgICAgKiBAcmV0dXJuIHZvaWQKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGJsb2NrKE91dHB1dEJsb2NrICRibG9jaykKICAgIHsKICAgICAgICBpZiAoZW1wdHkoJGJsb2NrLT5saW5lcykgJiYgZW1wdHkoJGJsb2NrLT5jaGlsZHJlbikpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgJHRoaXMtPmN1cnJlbnRCbG9jayA9ICRibG9jazsKCiAgICAgICAgJHByZSA9ICR0aGlzLT5pbmRlbnRTdHIoKTsKCiAgICAgICAgaWYgKCEgZW1wdHkoJGJsb2NrLT5zZWxlY3RvcnMpKSB7CiAgICAgICAgICAgICR0aGlzLT5ibG9ja1NlbGVjdG9ycygkYmxvY2spOwoKICAgICAgICAgICAgJHRoaXMtPmluZGVudExldmVsKys7CiAgICAgICAgfQoKICAgICAgICBpZiAoISBlbXB0eSgkYmxvY2stPmxpbmVzKSkgewogICAgICAgICAgICAkdGhpcy0+YmxvY2tMaW5lcygkYmxvY2spOwogICAgICAgIH0KCiAgICAgICAgaWYgKCEgZW1wdHkoJGJsb2NrLT5jaGlsZHJlbikpIHsKICAgICAgICAgICAgJHRoaXMtPmJsb2NrQ2hpbGRyZW4oJGJsb2NrKTsKICAgICAgICB9CgogICAgICAgIGlmICghIGVtcHR5KCRibG9jay0+c2VsZWN0b3JzKSkgewogICAgICAgICAgICAkdGhpcy0+aW5kZW50TGV2ZWwtLTsKCiAgICAgICAgICAgIGlmICghICR0aGlzLT5rZWVwU2VtaWNvbG9ucykgewogICAgICAgICAgICAgICAgJHRoaXMtPnN0cmlwcGVkU2VtaWNvbG9uID0gJyc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChlbXB0eSgkYmxvY2stPmNoaWxkcmVuKSkgewogICAgICAgICAgICAgICAgJHRoaXMtPndyaXRlKCR0aGlzLT5icmVhayk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICR0aGlzLT53cml0ZSgkcHJlIC4gJHRoaXMtPmNsb3NlIC4gJHRoaXMtPmJyZWFrKTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBUZXN0IGFuZCBjbGVhbiBzYWZlbHkgZW1wdHkgY2hpbGRyZW4KICAgICAqCiAgICAgKiBAcGFyYW0gXFNjc3NQaHBcU2Nzc1BocFxGb3JtYXR0ZXJcT3V0cHV0QmxvY2sgJGJsb2NrCiAgICAgKgogICAgICogQHJldHVybiBib29sCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiB0ZXN0RW1wdHlDaGlsZHJlbigkYmxvY2spCiAgICB7CiAgICAgICAgJGlzRW1wdHkgPSBlbXB0eSgkYmxvY2stPmxpbmVzKTsKCiAgICAgICAgaWYgKCRibG9jay0+Y2hpbGRyZW4pIHsKICAgICAgICAgICAgZm9yZWFjaCAoJGJsb2NrLT5jaGlsZHJlbiBhcyAkayA9PiAmJGNoaWxkKSB7CiAgICAgICAgICAgICAgICBpZiAoISAkdGhpcy0+dGVzdEVtcHR5Q2hpbGRyZW4oJGNoaWxkKSkgewogICAgICAgICAgICAgICAgICAgICRpc0VtcHR5ID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCRjaGlsZC0+dHlwZSA9PT0gVHlwZTo6VF9NRURJQSB8fCAkY2hpbGQtPnR5cGUgPT09IFR5cGU6OlRfRElSRUNUSVZFKSB7CiAgICAgICAgICAgICAgICAgICAgJGNoaWxkLT5jaGlsZHJlbiA9IFtdOwogICAgICAgICAgICAgICAgICAgICRjaGlsZC0+c2VsZWN0b3JzID0gbnVsbDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRpc0VtcHR5OwogICAgfQoKICAgIC8qKgogICAgICogRW50cnkgcG9pbnQgdG8gZm9ybWF0dGluZyBhIGJsb2NrCiAgICAgKgogICAgICogQGFwaQogICAgICoKICAgICAqIEBwYXJhbSBcU2Nzc1BocFxTY3NzUGhwXEZvcm1hdHRlclxPdXRwdXRCbG9jayAgICAgICAgICAgICAkYmxvY2sgICAgICAgICAgICAgIEFuIGFic3RyYWN0IHN5bnRheCB0cmVlCiAgICAgKiBAcGFyYW0gXFNjc3NQaHBcU2Nzc1BocFxTb3VyY2VNYXBcU291cmNlTWFwR2VuZXJhdG9yfG51bGwgJHNvdXJjZU1hcEdlbmVyYXRvciBPcHRpb25hbCBzb3VyY2UgbWFwIGdlbmVyYXRvcgogICAgICoKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBmb3JtYXQoT3V0cHV0QmxvY2sgJGJsb2NrLCBTb3VyY2VNYXBHZW5lcmF0b3IgJHNvdXJjZU1hcEdlbmVyYXRvciA9IG51bGwpCiAgICB7CiAgICAgICAgJHRoaXMtPnNvdXJjZU1hcEdlbmVyYXRvciA9IG51bGw7CgogICAgICAgIGlmICgkc291cmNlTWFwR2VuZXJhdG9yKSB7CiAgICAgICAgICAgICR0aGlzLT5jdXJyZW50TGluZSAgICAgICAgPSAxOwogICAgICAgICAgICAkdGhpcy0+Y3VycmVudENvbHVtbiAgICAgID0gMDsKICAgICAgICAgICAgJHRoaXMtPnNvdXJjZU1hcEdlbmVyYXRvciA9ICRzb3VyY2VNYXBHZW5lcmF0b3I7CiAgICAgICAgfQoKICAgICAgICAkdGhpcy0+dGVzdEVtcHR5Q2hpbGRyZW4oJGJsb2NrKTsKCiAgICAgICAgb2Jfc3RhcnQoKTsKCiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgJHRoaXMtPmJsb2NrKCRibG9jayk7CiAgICAgICAgfSBjYXRjaCAoXEV4Y2VwdGlvbiAkZSkgewogICAgICAgICAgICBvYl9lbmRfY2xlYW4oKTsKICAgICAgICAgICAgdGhyb3cgJGU7CiAgICAgICAgfSBjYXRjaCAoXFRocm93YWJsZSAkZSkgewogICAgICAgICAgICBvYl9lbmRfY2xlYW4oKTsKICAgICAgICAgICAgdGhyb3cgJGU7CiAgICAgICAgfQoKICAgICAgICAkb3V0ID0gb2JfZ2V0X2NsZWFuKCk7CiAgICAgICAgYXNzZXJ0KCRvdXQgIT09IGZhbHNlKTsKCiAgICAgICAgcmV0dXJuICRvdXQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBPdXRwdXQgY29udGVudAogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgJHN0cgogICAgICoKICAgICAqIEByZXR1cm4gdm9pZAogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gd3JpdGUoJHN0cikKICAgIHsKICAgICAgICBpZiAoISBlbXB0eSgkdGhpcy0+c3RyaXBwZWRTZW1pY29sb24pKSB7CiAgICAgICAgICAgIGVjaG8gJHRoaXMtPnN0cmlwcGVkU2VtaWNvbG9uOwoKICAgICAgICAgICAgJHRoaXMtPnN0cmlwcGVkU2VtaWNvbG9uID0gJyc7CiAgICAgICAgfQoKICAgICAgICAvKgogICAgICAgICAqIE1heWJlIFN0cmlwIHNlbWktY29sb24gYXBwZW5kZWQgYnkgcHJvcGVydHkoKTsgaXQncyBhIHNlcGFyYXRvciwgbm90IGEgdGVybWluYXRvcgogICAgICAgICAqIHdpbGwgYmUgc3RyaXBlZCBmb3IgcmVhbCBiZWZvcmUgYSBjbG9zaW5nLCBvdGhlcndpc2UgZGlzcGxheWVkIHVuY2hhbmdlZCBzdGFydGluZyB0aGUgbmV4dCB3cml0ZQogICAgICAgICAqLwogICAgICAgIGlmICgKICAgICAgICAgICAgISAkdGhpcy0+a2VlcFNlbWljb2xvbnMgJiYKICAgICAgICAgICAgJHN0ciAmJgogICAgICAgICAgICAoc3RycG9zKCRzdHIsICc7JykgIT09IGZhbHNlKSAmJgogICAgICAgICAgICAoc3Vic3RyKCRzdHIsIC0xKSA9PT0gJzsnKQogICAgICAgICkgewogICAgICAgICAgICAkc3RyID0gc3Vic3RyKCRzdHIsIDAsIC0xKTsKCiAgICAgICAgICAgICR0aGlzLT5zdHJpcHBlZFNlbWljb2xvbiA9ICc7JzsKICAgICAgICB9CgogICAgICAgIGlmICgkdGhpcy0+c291cmNlTWFwR2VuZXJhdG9yKSB7CiAgICAgICAgICAgICRsaW5lcyA9IGV4cGxvZGUoIlxuIiwgJHN0cik7CiAgICAgICAgICAgICRsYXN0TGluZSA9IGFycmF5X3BvcCgkbGluZXMpOwoKICAgICAgICAgICAgZm9yZWFjaCAoJGxpbmVzIGFzICRsaW5lKSB7CiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgd3JpdHRlbiBsaW5lIHN0YXJ0cyBpcyBlbXB0eSwgYWRkaW5nIGEgbWFwcGluZyB3b3VsZCBhZGQgaXQgZm9yCiAgICAgICAgICAgICAgICAvLyBhIG5vbi1leGlzdGVudCBjb2x1bW4gYXMgd2UgYXJlIGF0IHRoZSBlbmQgb2YgdGhlIGxpbmUKICAgICAgICAgICAgICAgIGlmICgkbGluZSAhPT0gJycpIHsKICAgICAgICAgICAgICAgICAgICBhc3NlcnQoJHRoaXMtPmN1cnJlbnRCbG9jay0+c291cmNlTGluZSAhPT0gbnVsbCk7CiAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KCR0aGlzLT5jdXJyZW50QmxvY2stPnNvdXJjZU5hbWUgIT09IG51bGwpOwogICAgICAgICAgICAgICAgICAgICR0aGlzLT5zb3VyY2VNYXBHZW5lcmF0b3ItPmFkZE1hcHBpbmcoCiAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5jdXJyZW50TGluZSwKICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmN1cnJlbnRDb2x1bW4sCiAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5jdXJyZW50QmxvY2stPnNvdXJjZUxpbmUsCiAgICAgICAgICAgICAgICAgICAgICAgIC8vY29sdW1ucyBmcm9tIHBhcnNlciBhcmUgb2ZmIGJ5IG9uZQogICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+Y3VycmVudEJsb2NrLT5zb3VyY2VDb2x1bW4gPiAwID8gJHRoaXMtPmN1cnJlbnRCbG9jay0+c291cmNlQ29sdW1uIC0gMSA6IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5jdXJyZW50QmxvY2stPnNvdXJjZU5hbWUKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICR0aGlzLT5jdXJyZW50TGluZSsrOwogICAgICAgICAgICAgICAgJHRoaXMtPmN1cnJlbnRDb2x1bW4gPSAwOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoJGxhc3RMaW5lICE9PSAnJykgewogICAgICAgICAgICAgICAgYXNzZXJ0KCR0aGlzLT5jdXJyZW50QmxvY2stPnNvdXJjZUxpbmUgIT09IG51bGwpOwogICAgICAgICAgICAgICAgYXNzZXJ0KCR0aGlzLT5jdXJyZW50QmxvY2stPnNvdXJjZU5hbWUgIT09IG51bGwpOwogICAgICAgICAgICAgICAgJHRoaXMtPnNvdXJjZU1hcEdlbmVyYXRvci0+YWRkTWFwcGluZygKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+Y3VycmVudExpbmUsCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmN1cnJlbnRDb2x1bW4sCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmN1cnJlbnRCbG9jay0+c291cmNlTGluZSwKICAgICAgICAgICAgICAgICAgICAvL2NvbHVtbnMgZnJvbSBwYXJzZXIgYXJlIG9mZiBieSBvbmUKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+Y3VycmVudEJsb2NrLT5zb3VyY2VDb2x1bW4gPiAwID8gJHRoaXMtPmN1cnJlbnRCbG9jay0+c291cmNlQ29sdW1uIC0gMSA6IDAsCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmN1cnJlbnRCbG9jay0+c291cmNlTmFtZQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHRoaXMtPmN1cnJlbnRDb2x1bW4gKz0gXHN0cmxlbigkbGFzdExpbmUpOwogICAgICAgIH0KCiAgICAgICAgZWNobyAkc3RyOwogICAgfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/extra/scssphp/src/Formatter/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/extra/scssphp/src/Formatter/Compact.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEZvcm1hdHRlcjsKCnVzZSBTY3NzUGhwXFNjc3NQaHBcRm9ybWF0dGVyOwoKLyoqCiAqIENvbXBhY3QgZm9ybWF0dGVyCiAqCiAqIEBhdXRob3IgTGVhZiBDb3Jjb3JhbiA8bGVhZm90QGdtYWlsLmNvbT4KICoKICogQGRlcHJlY2F0ZWQgc2luY2UgMS40LjAuIFVzZSB0aGUgQ29tcHJlc3NlZCBmb3JtYXR0ZXIgaW5zdGVhZC4KICoKICogQGludGVybmFsCiAqLwpjbGFzcyBDb21wYWN0IGV4dGVuZHMgRm9ybWF0dGVyCnsKICAgIC8qKgogICAgICoge0Bpbmhlcml0ZG9jfQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoKQogICAgewogICAgICAgIEB0cmlnZ2VyX2Vycm9yKCdUaGUgQ29tcGFjdCBmb3JtYXR0ZXIgaXMgZGVwcmVjYXRlZCBzaW5jZSAxLjQuMC4gVXNlIHRoZSBDb21wcmVzc2VkIGZvcm1hdHRlciBpbnN0ZWFkLicsIEVfVVNFUl9ERVBSRUNBVEVEKTsKCiAgICAgICAgJHRoaXMtPmluZGVudExldmVsID0gMDsKICAgICAgICAkdGhpcy0+aW5kZW50Q2hhciA9ICcnOwogICAgICAgICR0aGlzLT5icmVhayA9ICcnOwogICAgICAgICR0aGlzLT5vcGVuID0gJyB7JzsKICAgICAgICAkdGhpcy0+Y2xvc2UgPSAifVxuXG4iOwogICAgICAgICR0aGlzLT50YWdTZXBhcmF0b3IgPSAnLCc7CiAgICAgICAgJHRoaXMtPmFzc2lnblNlcGFyYXRvciA9ICc6JzsKICAgICAgICAkdGhpcy0+a2VlcFNlbWljb2xvbnMgPSB0cnVlOwogICAgfQoKICAgIC8qKgogICAgICoge0Bpbmhlcml0ZG9jfQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gaW5kZW50U3RyKCkKICAgIHsKICAgICAgICByZXR1cm4gJyAnOwogICAgfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/extra/scssphp/src/Formatter/Compressed.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEZvcm1hdHRlcjsKCnVzZSBTY3NzUGhwXFNjc3NQaHBcRm9ybWF0dGVyOwoKLyoqCiAqIENvbXByZXNzZWQgZm9ybWF0dGVyCiAqCiAqIEBhdXRob3IgTGVhZiBDb3Jjb3JhbiA8bGVhZm90QGdtYWlsLmNvbT4KICoKICogQGludGVybmFsCiAqLwpjbGFzcyBDb21wcmVzc2VkIGV4dGVuZHMgRm9ybWF0dGVyCnsKICAgIC8qKgogICAgICoge0Bpbmhlcml0ZG9jfQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoKQogICAgewogICAgICAgICR0aGlzLT5pbmRlbnRMZXZlbCA9IDA7CiAgICAgICAgJHRoaXMtPmluZGVudENoYXIgPSAnICAnOwogICAgICAgICR0aGlzLT5icmVhayA9ICcnOwogICAgICAgICR0aGlzLT5vcGVuID0gJ3snOwogICAgICAgICR0aGlzLT5jbG9zZSA9ICd9JzsKICAgICAgICAkdGhpcy0+dGFnU2VwYXJhdG9yID0gJywnOwogICAgICAgICR0aGlzLT5hc3NpZ25TZXBhcmF0b3IgPSAnOic7CiAgICAgICAgJHRoaXMtPmtlZXBTZW1pY29sb25zID0gZmFsc2U7CiAgICB9CgogICAgLyoqCiAgICAgKiB7QGluaGVyaXRkb2N9CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBibG9ja0xpbmVzKE91dHB1dEJsb2NrICRibG9jaykKICAgIHsKICAgICAgICAkaW5uZXIgPSAkdGhpcy0+aW5kZW50U3RyKCk7CgogICAgICAgICRnbHVlID0gJHRoaXMtPmJyZWFrIC4gJGlubmVyOwoKICAgICAgICBmb3JlYWNoICgkYmxvY2stPmxpbmVzIGFzICRpbmRleCA9PiAkbGluZSkgewogICAgICAgICAgICBpZiAoc3Vic3RyKCRsaW5lLCAwLCAyKSA9PT0gJy8qJyAmJiBzdWJzdHIoJGxpbmUsIDIsIDEpICE9PSAnIScpIHsKICAgICAgICAgICAgICAgIHVuc2V0KCRibG9jay0+bGluZXNbJGluZGV4XSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICR0aGlzLT53cml0ZSgkaW5uZXIgLiBpbXBsb2RlKCRnbHVlLCAkYmxvY2stPmxpbmVzKSk7CgogICAgICAgIGlmICghIGVtcHR5KCRibG9jay0+Y2hpbGRyZW4pKSB7CiAgICAgICAgICAgICR0aGlzLT53cml0ZSgkdGhpcy0+YnJlYWspOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIE91dHB1dCBibG9jayBzZWxlY3RvcnMKICAgICAqCiAgICAgKiBAcGFyYW0gXFNjc3NQaHBcU2Nzc1BocFxGb3JtYXR0ZXJcT3V0cHV0QmxvY2sgJGJsb2NrCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBibG9ja1NlbGVjdG9ycyhPdXRwdXRCbG9jayAkYmxvY2spCiAgICB7CiAgICAgICAgYXNzZXJ0KCEgZW1wdHkoJGJsb2NrLT5zZWxlY3RvcnMpKTsKCiAgICAgICAgJGlubmVyID0gJHRoaXMtPmluZGVudFN0cigpOwoKICAgICAgICAkdGhpcy0+d3JpdGUoCiAgICAgICAgICAgICRpbm5lcgogICAgICAgICAgICAuIGltcGxvZGUoCiAgICAgICAgICAgICAgICAkdGhpcy0+dGFnU2VwYXJhdG9yLAogICAgICAgICAgICAgICAgc3RyX3JlcGxhY2UoWycgPiAnLCAnICsgJywgJyB+ICddLCBbJz4nLCAnKycsICd+J10sICRibG9jay0+c2VsZWN0b3JzKQogICAgICAgICAgICApCiAgICAgICAgICAgIC4gJHRoaXMtPm9wZW4gLiAkdGhpcy0+YnJlYWsKICAgICAgICApOwogICAgfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/extra/scssphp/src/Formatter/Crunched.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEZvcm1hdHRlcjsKCnVzZSBTY3NzUGhwXFNjc3NQaHBcRm9ybWF0dGVyOwoKLyoqCiAqIENydW5jaGVkIGZvcm1hdHRlcgogKgogKiBAYXV0aG9yIEFudGhvbiBQYW5nIDxhbnRob24ucGFuZ0BnbWFpbC5jb20+CiAqCiAqIEBkZXByZWNhdGVkIHNpbmNlIDEuNC4wLiBVc2UgdGhlIENvbXByZXNzZWQgZm9ybWF0dGVyIGluc3RlYWQuCiAqCiAqIEBpbnRlcm5hbAogKi8KY2xhc3MgQ3J1bmNoZWQgZXh0ZW5kcyBGb3JtYXR0ZXIKewogICAgLyoqCiAgICAgKiB7QGluaGVyaXRkb2N9CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgpCiAgICB7CiAgICAgICAgQHRyaWdnZXJfZXJyb3IoJ1RoZSBDcnVuY2hlZCBmb3JtYXR0ZXIgaXMgZGVwcmVjYXRlZCBzaW5jZSAxLjQuMC4gVXNlIHRoZSBDb21wcmVzc2VkIGZvcm1hdHRlciBpbnN0ZWFkLicsIEVfVVNFUl9ERVBSRUNBVEVEKTsKCiAgICAgICAgJHRoaXMtPmluZGVudExldmVsID0gMDsKICAgICAgICAkdGhpcy0+aW5kZW50Q2hhciA9ICcgICc7CiAgICAgICAgJHRoaXMtPmJyZWFrID0gJyc7CiAgICAgICAgJHRoaXMtPm9wZW4gPSAneyc7CiAgICAgICAgJHRoaXMtPmNsb3NlID0gJ30nOwogICAgICAgICR0aGlzLT50YWdTZXBhcmF0b3IgPSAnLCc7CiAgICAgICAgJHRoaXMtPmFzc2lnblNlcGFyYXRvciA9ICc6JzsKICAgICAgICAkdGhpcy0+a2VlcFNlbWljb2xvbnMgPSBmYWxzZTsKICAgIH0KCiAgICAvKioKICAgICAqIHtAaW5oZXJpdGRvY30KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGJsb2NrTGluZXMoT3V0cHV0QmxvY2sgJGJsb2NrKQogICAgewogICAgICAgICRpbm5lciA9ICR0aGlzLT5pbmRlbnRTdHIoKTsKCiAgICAgICAgJGdsdWUgPSAkdGhpcy0+YnJlYWsgLiAkaW5uZXI7CgogICAgICAgIGZvcmVhY2ggKCRibG9jay0+bGluZXMgYXMgJGluZGV4ID0+ICRsaW5lKSB7CiAgICAgICAgICAgIGlmIChzdWJzdHIoJGxpbmUsIDAsIDIpID09PSAnLyonKSB7CiAgICAgICAgICAgICAgICB1bnNldCgkYmxvY2stPmxpbmVzWyRpbmRleF0pOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkdGhpcy0+d3JpdGUoJGlubmVyIC4gaW1wbG9kZSgkZ2x1ZSwgJGJsb2NrLT5saW5lcykpOwoKICAgICAgICBpZiAoISBlbXB0eSgkYmxvY2stPmNoaWxkcmVuKSkgewogICAgICAgICAgICAkdGhpcy0+d3JpdGUoJHRoaXMtPmJyZWFrKTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBPdXRwdXQgYmxvY2sgc2VsZWN0b3JzCiAgICAgKgogICAgICogQHBhcmFtIFxTY3NzUGhwXFNjc3NQaHBcRm9ybWF0dGVyXE91dHB1dEJsb2NrICRibG9jawogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gYmxvY2tTZWxlY3RvcnMoT3V0cHV0QmxvY2sgJGJsb2NrKQogICAgewogICAgICAgIGFzc2VydCghIGVtcHR5KCRibG9jay0+c2VsZWN0b3JzKSk7CgogICAgICAgICRpbm5lciA9ICR0aGlzLT5pbmRlbnRTdHIoKTsKCiAgICAgICAgJHRoaXMtPndyaXRlKAogICAgICAgICAgICAkaW5uZXIKICAgICAgICAgICAgLiBpbXBsb2RlKAogICAgICAgICAgICAgICAgJHRoaXMtPnRhZ1NlcGFyYXRvciwKICAgICAgICAgICAgICAgIHN0cl9yZXBsYWNlKFsnID4gJywgJyArICcsICcgfiAnXSwgWyc+JywgJysnLCAnfiddLCAkYmxvY2stPnNlbGVjdG9ycykKICAgICAgICAgICAgKQogICAgICAgICAgICAuICR0aGlzLT5vcGVuIC4gJHRoaXMtPmJyZWFrCiAgICAgICAgKTsKICAgIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/extra/scssphp/src/Formatter/Debug.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEZvcm1hdHRlcjsKCnVzZSBTY3NzUGhwXFNjc3NQaHBcRm9ybWF0dGVyOwoKLyoqCiAqIERlYnVnIGZvcm1hdHRlcgogKgogKiBAYXV0aG9yIEFudGhvbiBQYW5nIDxhbnRob24ucGFuZ0BnbWFpbC5jb20+CiAqCiAqIEBkZXByZWNhdGVkIHNpbmNlIDEuNC4wLgogKgogKiBAaW50ZXJuYWwKICovCmNsYXNzIERlYnVnIGV4dGVuZHMgRm9ybWF0dGVyCnsKICAgIC8qKgogICAgICoge0Bpbmhlcml0ZG9jfQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoKQogICAgewogICAgICAgIEB0cmlnZ2VyX2Vycm9yKCdUaGUgRGVidWcgZm9ybWF0dGVyIGlzIGRlcHJlY2F0ZWQgc2luY2UgMS40LjAuJywgRV9VU0VSX0RFUFJFQ0FURUQpOwoKICAgICAgICAkdGhpcy0+aW5kZW50TGV2ZWwgPSAwOwogICAgICAgICR0aGlzLT5pbmRlbnRDaGFyID0gJyc7CiAgICAgICAgJHRoaXMtPmJyZWFrID0gIlxuIjsKICAgICAgICAkdGhpcy0+b3BlbiA9ICcgeyc7CiAgICAgICAgJHRoaXMtPmNsb3NlID0gJyB9JzsKICAgICAgICAkdGhpcy0+dGFnU2VwYXJhdG9yID0gJywgJzsKICAgICAgICAkdGhpcy0+YXNzaWduU2VwYXJhdG9yID0gJzogJzsKICAgICAgICAkdGhpcy0+a2VlcFNlbWljb2xvbnMgPSB0cnVlOwogICAgfQoKICAgIC8qKgogICAgICoge0Bpbmhlcml0ZG9jfQogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gaW5kZW50U3RyKCkKICAgIHsKICAgICAgICByZXR1cm4gc3RyX3JlcGVhdCgnICAnLCAkdGhpcy0+aW5kZW50TGV2ZWwpOwogICAgfQoKICAgIC8qKgogICAgICoge0Bpbmhlcml0ZG9jfQogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gYmxvY2tMaW5lcyhPdXRwdXRCbG9jayAkYmxvY2spCiAgICB7CiAgICAgICAgJGluZGVudCA9ICR0aGlzLT5pbmRlbnRTdHIoKTsKCiAgICAgICAgaWYgKGVtcHR5KCRibG9jay0+bGluZXMpKSB7CiAgICAgICAgICAgICR0aGlzLT53cml0ZSgieyRpbmRlbnR9YmxvY2stPmxpbmVzOiBbXVxuIik7CgogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBmb3JlYWNoICgkYmxvY2stPmxpbmVzIGFzICRpbmRleCA9PiAkbGluZSkgewogICAgICAgICAgICAkdGhpcy0+d3JpdGUoInskaW5kZW50fWJsb2NrLT5saW5lc1t7JGluZGV4fV06ICRsaW5lXG4iKTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiB7QGluaGVyaXRkb2N9CiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBibG9ja1NlbGVjdG9ycyhPdXRwdXRCbG9jayAkYmxvY2spCiAgICB7CiAgICAgICAgJGluZGVudCA9ICR0aGlzLT5pbmRlbnRTdHIoKTsKCiAgICAgICAgaWYgKGVtcHR5KCRibG9jay0+c2VsZWN0b3JzKSkgewogICAgICAgICAgICAkdGhpcy0+d3JpdGUoInskaW5kZW50fWJsb2NrLT5zZWxlY3RvcnM6IFtdXG4iKTsKCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIGZvcmVhY2ggKCRibG9jay0+c2VsZWN0b3JzIGFzICRpbmRleCA9PiAkc2VsZWN0b3IpIHsKICAgICAgICAgICAgJHRoaXMtPndyaXRlKCJ7JGluZGVudH1ibG9jay0+c2VsZWN0b3JzW3skaW5kZXh9XTogJHNlbGVjdG9yXG4iKTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiB7QGluaGVyaXRkb2N9CiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBibG9ja0NoaWxkcmVuKE91dHB1dEJsb2NrICRibG9jaykKICAgIHsKICAgICAgICAkaW5kZW50ID0gJHRoaXMtPmluZGVudFN0cigpOwoKICAgICAgICBpZiAoZW1wdHkoJGJsb2NrLT5jaGlsZHJlbikpIHsKICAgICAgICAgICAgJHRoaXMtPndyaXRlKCJ7JGluZGVudH1ibG9jay0+Y2hpbGRyZW46IFtdXG4iKTsKCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICR0aGlzLT5pbmRlbnRMZXZlbCsrOwoKICAgICAgICBmb3JlYWNoICgkYmxvY2stPmNoaWxkcmVuIGFzICRpID0+ICRjaGlsZCkgewogICAgICAgICAgICAkdGhpcy0+YmxvY2soJGNoaWxkKTsKICAgICAgICB9CgogICAgICAgICR0aGlzLT5pbmRlbnRMZXZlbC0tOwogICAgfQoKICAgIC8qKgogICAgICoge0Bpbmhlcml0ZG9jfQogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gYmxvY2soT3V0cHV0QmxvY2sgJGJsb2NrKQogICAgewogICAgICAgICRpbmRlbnQgPSAkdGhpcy0+aW5kZW50U3RyKCk7CgogICAgICAgICR0aGlzLT53cml0ZSgieyRpbmRlbnR9YmxvY2stPnR5cGU6IHskYmxvY2stPnR5cGV9XG4iIC4KICAgICAgICAgICAgICJ7JGluZGVudH1ibG9jay0+ZGVwdGg6IHskYmxvY2stPmRlcHRofVxuIik7CgogICAgICAgICR0aGlzLT5jdXJyZW50QmxvY2sgPSAkYmxvY2s7CgogICAgICAgICR0aGlzLT5ibG9ja1NlbGVjdG9ycygkYmxvY2spOwogICAgICAgICR0aGlzLT5ibG9ja0xpbmVzKCRibG9jayk7CiAgICAgICAgJHRoaXMtPmJsb2NrQ2hpbGRyZW4oJGJsb2NrKTsKICAgIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/extra/scssphp/src/Formatter/Expanded.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEZvcm1hdHRlcjsKCnVzZSBTY3NzUGhwXFNjc3NQaHBcRm9ybWF0dGVyOwoKLyoqCiAqIEV4cGFuZGVkIGZvcm1hdHRlcgogKgogKiBAYXV0aG9yIExlYWYgQ29yY29yYW4gPGxlYWZvdEBnbWFpbC5jb20+CiAqCiAqIEBpbnRlcm5hbAogKi8KY2xhc3MgRXhwYW5kZWQgZXh0ZW5kcyBGb3JtYXR0ZXIKewogICAgLyoqCiAgICAgKiB7QGluaGVyaXRkb2N9CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgpCiAgICB7CiAgICAgICAgJHRoaXMtPmluZGVudExldmVsID0gMDsKICAgICAgICAkdGhpcy0+aW5kZW50Q2hhciA9ICcgICc7CiAgICAgICAgJHRoaXMtPmJyZWFrID0gIlxuIjsKICAgICAgICAkdGhpcy0+b3BlbiA9ICcgeyc7CiAgICAgICAgJHRoaXMtPmNsb3NlID0gJ30nOwogICAgICAgICR0aGlzLT50YWdTZXBhcmF0b3IgPSAnLCAnOwogICAgICAgICR0aGlzLT5hc3NpZ25TZXBhcmF0b3IgPSAnOiAnOwogICAgICAgICR0aGlzLT5rZWVwU2VtaWNvbG9ucyA9IHRydWU7CiAgICB9CgogICAgLyoqCiAgICAgKiB7QGluaGVyaXRkb2N9CiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBpbmRlbnRTdHIoKQogICAgewogICAgICAgIHJldHVybiBzdHJfcmVwZWF0KCR0aGlzLT5pbmRlbnRDaGFyLCAkdGhpcy0+aW5kZW50TGV2ZWwpOwogICAgfQoKICAgIC8qKgogICAgICoge0Bpbmhlcml0ZG9jfQogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gYmxvY2tMaW5lcyhPdXRwdXRCbG9jayAkYmxvY2spCiAgICB7CiAgICAgICAgJGlubmVyID0gJHRoaXMtPmluZGVudFN0cigpOwoKICAgICAgICAkZ2x1ZSA9ICR0aGlzLT5icmVhayAuICRpbm5lcjsKCiAgICAgICAgZm9yZWFjaCAoJGJsb2NrLT5saW5lcyBhcyAkaW5kZXggPT4gJGxpbmUpIHsKICAgICAgICAgICAgaWYgKHN1YnN0cigkbGluZSwgMCwgMikgPT09ICcvKicpIHsKICAgICAgICAgICAgICAgICRyZXBsYWNlZExpbmUgPSBwcmVnX3JlcGxhY2UoJy9cclxuP3xcbnxcZi8nLCAkdGhpcy0+YnJlYWssICRsaW5lKTsKICAgICAgICAgICAgICAgIGFzc2VydCgkcmVwbGFjZWRMaW5lICE9PSBudWxsKTsKICAgICAgICAgICAgICAgICRibG9jay0+bGluZXNbJGluZGV4XSA9ICRyZXBsYWNlZExpbmU7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICR0aGlzLT53cml0ZSgkaW5uZXIgLiBpbXBsb2RlKCRnbHVlLCAkYmxvY2stPmxpbmVzKSk7CgogICAgICAgIGlmIChlbXB0eSgkYmxvY2stPnNlbGVjdG9ycykgfHwgISBlbXB0eSgkYmxvY2stPmNoaWxkcmVuKSkgewogICAgICAgICAgICAkdGhpcy0+d3JpdGUoJHRoaXMtPmJyZWFrKTsKICAgICAgICB9CiAgICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/extra/scssphp/src/Formatter/Nested.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEZvcm1hdHRlcjsKCnVzZSBTY3NzUGhwXFNjc3NQaHBcRm9ybWF0dGVyOwp1c2UgU2Nzc1BocFxTY3NzUGhwXFR5cGU7CgovKioKICogTmVzdGVkIGZvcm1hdHRlcgogKgogKiBAYXV0aG9yIExlYWYgQ29yY29yYW4gPGxlYWZvdEBnbWFpbC5jb20+CiAqCiAqIEBkZXByZWNhdGVkIHNpbmNlIDEuNC4wLiBVc2UgdGhlIEV4cGFuZGVkIGZvcm1hdHRlciBpbnN0ZWFkLgogKgogKiBAaW50ZXJuYWwKICovCmNsYXNzIE5lc3RlZCBleHRlbmRzIEZvcm1hdHRlcgp7CiAgICAvKioKICAgICAqIEB2YXIgaW50CiAgICAgKi8KICAgIHByaXZhdGUgJGRlcHRoOwoKICAgIC8qKgogICAgICoge0Bpbmhlcml0ZG9jfQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoKQogICAgewogICAgICAgIEB0cmlnZ2VyX2Vycm9yKCdUaGUgTmVzdGVkIGZvcm1hdHRlciBpcyBkZXByZWNhdGVkIHNpbmNlIDEuNC4wLiBVc2UgdGhlIEV4cGFuZGVkIGZvcm1hdHRlciBpbnN0ZWFkLicsIEVfVVNFUl9ERVBSRUNBVEVEKTsKCiAgICAgICAgJHRoaXMtPmluZGVudExldmVsID0gMDsKICAgICAgICAkdGhpcy0+aW5kZW50Q2hhciA9ICcgICc7CiAgICAgICAgJHRoaXMtPmJyZWFrID0gIlxuIjsKICAgICAgICAkdGhpcy0+b3BlbiA9ICcgeyc7CiAgICAgICAgJHRoaXMtPmNsb3NlID0gJyB9JzsKICAgICAgICAkdGhpcy0+dGFnU2VwYXJhdG9yID0gJywgJzsKICAgICAgICAkdGhpcy0+YXNzaWduU2VwYXJhdG9yID0gJzogJzsKICAgICAgICAkdGhpcy0+a2VlcFNlbWljb2xvbnMgPSB0cnVlOwogICAgfQoKICAgIC8qKgogICAgICoge0Bpbmhlcml0ZG9jfQogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gaW5kZW50U3RyKCkKICAgIHsKICAgICAgICAkbiA9ICR0aGlzLT5kZXB0aCAtIDE7CgogICAgICAgIHJldHVybiBzdHJfcmVwZWF0KCR0aGlzLT5pbmRlbnRDaGFyLCBtYXgoJHRoaXMtPmluZGVudExldmVsICsgJG4sIDApKTsKICAgIH0KCiAgICAvKioKICAgICAqIHtAaW5oZXJpdGRvY30KICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGJsb2NrTGluZXMoT3V0cHV0QmxvY2sgJGJsb2NrKQogICAgewogICAgICAgICRpbm5lciA9ICR0aGlzLT5pbmRlbnRTdHIoKTsKICAgICAgICAkZ2x1ZSAgPSAkdGhpcy0+YnJlYWsgLiAkaW5uZXI7CgogICAgICAgIGZvcmVhY2ggKCRibG9jay0+bGluZXMgYXMgJGluZGV4ID0+ICRsaW5lKSB7CiAgICAgICAgICAgIGlmIChzdWJzdHIoJGxpbmUsIDAsIDIpID09PSAnLyonKSB7CiAgICAgICAgICAgICAgICAkcmVwbGFjZWRMaW5lID0gcHJlZ19yZXBsYWNlKCcvXHJcbj98XG58XGYvJywgJHRoaXMtPmJyZWFrLCAkbGluZSk7CiAgICAgICAgICAgICAgICBhc3NlcnQoJHJlcGxhY2VkTGluZSAhPT0gbnVsbCk7CiAgICAgICAgICAgICAgICAkYmxvY2stPmxpbmVzWyRpbmRleF0gPSAkcmVwbGFjZWRMaW5lOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkdGhpcy0+d3JpdGUoJGlubmVyIC4gaW1wbG9kZSgkZ2x1ZSwgJGJsb2NrLT5saW5lcykpOwogICAgfQoKICAgIC8qKgogICAgICoge0Bpbmhlcml0ZG9jfQogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gYmxvY2soT3V0cHV0QmxvY2sgJGJsb2NrKQogICAgewogICAgICAgIHN0YXRpYyAkZGVwdGhzOwogICAgICAgIHN0YXRpYyAkZG93bkxldmVsOwogICAgICAgIHN0YXRpYyAkY2xvc2VCbG9jazsKICAgICAgICBzdGF0aWMgJHByZXZpb3VzRW1wdHk7CiAgICAgICAgc3RhdGljICRwcmV2aW91c0hhc1NlbGVjdG9yOwoKICAgICAgICBpZiAoJGJsb2NrLT50eXBlID09PSAncm9vdCcpIHsKICAgICAgICAgICAgJGRlcHRocyA9IFsgMCBdOwogICAgICAgICAgICAkZG93bkxldmVsID0gJyc7CiAgICAgICAgICAgICRjbG9zZUJsb2NrID0gJyc7CiAgICAgICAgICAgICR0aGlzLT5kZXB0aCA9IDA7CiAgICAgICAgICAgICRwcmV2aW91c0VtcHR5ID0gZmFsc2U7CiAgICAgICAgICAgICRwcmV2aW91c0hhc1NlbGVjdG9yID0gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICAkaXNNZWRpYU9yRGlyZWN0aXZlID0gXGluX2FycmF5KCRibG9jay0+dHlwZSwgW1R5cGU6OlRfRElSRUNUSVZFLCBUeXBlOjpUX01FRElBXSk7CiAgICAgICAgJGlzU3VwcG9ydCA9ICgkYmxvY2stPnR5cGUgPT09IFR5cGU6OlRfRElSRUNUSVZFCiAgICAgICAgICAgICYmICRibG9jay0+c2VsZWN0b3JzICYmIHN0cnBvcyhpbXBsb2RlKCcnLCAkYmxvY2stPnNlbGVjdG9ycyksICdAc3VwcG9ydHMnKSAhPT0gZmFsc2UpOwoKICAgICAgICB3aGlsZSAoJGJsb2NrLT5kZXB0aCA8IGVuZCgkZGVwdGhzKSB8fCAoJGJsb2NrLT5kZXB0aCA9PSAxICYmIGVuZCgkZGVwdGhzKSA9PSAxKSkgewogICAgICAgICAgICBhcnJheV9wb3AoJGRlcHRocyk7CiAgICAgICAgICAgICR0aGlzLT5kZXB0aC0tOwoKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgISAkdGhpcy0+ZGVwdGggJiYgKCRibG9jay0+ZGVwdGggPD0gMSB8fCAoISAkdGhpcy0+aW5kZW50TGV2ZWwgJiYgJGJsb2NrLT50eXBlID09PSBUeXBlOjpUX0NPTU1FTlQpKSAmJgogICAgICAgICAgICAgICAgKCgkYmxvY2stPnNlbGVjdG9ycyAmJiAhICRpc01lZGlhT3JEaXJlY3RpdmUpIHx8ICRwcmV2aW91c0hhc1NlbGVjdG9yKQogICAgICAgICAgICApIHsKICAgICAgICAgICAgICAgICRkb3duTGV2ZWwgPSAkdGhpcy0+YnJlYWs7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChlbXB0eSgkYmxvY2stPmxpbmVzKSAmJiBlbXB0eSgkYmxvY2stPmNoaWxkcmVuKSkgewogICAgICAgICAgICAgICAgJHByZXZpb3VzRW1wdHkgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoZW1wdHkoJGJsb2NrLT5saW5lcykgJiYgZW1wdHkoJGJsb2NrLT5jaGlsZHJlbikpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgJHRoaXMtPmN1cnJlbnRCbG9jayA9ICRibG9jazsKCiAgICAgICAgaWYgKCEgZW1wdHkoJGJsb2NrLT5saW5lcykgfHwgKCEgZW1wdHkoJGJsb2NrLT5jaGlsZHJlbikgJiYgKCR0aGlzLT5kZXB0aCA8IDEgfHwgJGlzU3VwcG9ydCkpKSB7CiAgICAgICAgICAgIGlmICgkYmxvY2stPmRlcHRoID4gZW5kKCRkZXB0aHMpKSB7CiAgICAgICAgICAgICAgICBpZiAoISAkcHJldmlvdXNFbXB0eSB8fCAkdGhpcy0+ZGVwdGggPCAxKSB7CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmRlcHRoKys7CgogICAgICAgICAgICAgICAgICAgICRkZXB0aHNbXSA9ICRibG9jay0+ZGVwdGg7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIC8vIGtlZXAgdGhlIGN1cnJlbnQgZGVwdGggdW5jaGFuZ2VkIGJ1dCB0YWtlIHRoZSBibG9jayBkZXB0aCBhcyBhIG5ldyByZWZlcmVuY2UgZm9yIGZvbGxvd2luZyBibG9ja3MKICAgICAgICAgICAgICAgICAgICBhcnJheV9wb3AoJGRlcHRocyk7CgogICAgICAgICAgICAgICAgICAgICRkZXB0aHNbXSA9ICRibG9jay0+ZGVwdGg7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICRwcmV2aW91c0VtcHR5ID0gKCRibG9jay0+dHlwZSA9PT0gVHlwZTo6VF9DT01NRU5UKTsKICAgICAgICAkcHJldmlvdXNIYXNTZWxlY3RvciA9IGZhbHNlOwoKICAgICAgICBpZiAoISBlbXB0eSgkYmxvY2stPnNlbGVjdG9ycykpIHsKICAgICAgICAgICAgaWYgKCRjbG9zZUJsb2NrKSB7CiAgICAgICAgICAgICAgICAkdGhpcy0+d3JpdGUoJGNsb3NlQmxvY2spOwogICAgICAgICAgICAgICAgJGNsb3NlQmxvY2sgPSAnJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCRkb3duTGV2ZWwpIHsKICAgICAgICAgICAgICAgICR0aGlzLT53cml0ZSgkZG93bkxldmVsKTsKICAgICAgICAgICAgICAgICRkb3duTGV2ZWwgPSAnJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHRoaXMtPmJsb2NrU2VsZWN0b3JzKCRibG9jayk7CgogICAgICAgICAgICAkdGhpcy0+aW5kZW50TGV2ZWwrKzsKICAgICAgICB9CgogICAgICAgIGlmICghIGVtcHR5KCRibG9jay0+bGluZXMpKSB7CiAgICAgICAgICAgIGlmICgkY2xvc2VCbG9jaykgewogICAgICAgICAgICAgICAgJHRoaXMtPndyaXRlKCRjbG9zZUJsb2NrKTsKICAgICAgICAgICAgICAgICRjbG9zZUJsb2NrID0gJyc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICgkZG93bkxldmVsKSB7CiAgICAgICAgICAgICAgICAkdGhpcy0+d3JpdGUoJGRvd25MZXZlbCk7CiAgICAgICAgICAgICAgICAkZG93bkxldmVsID0gJyc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICR0aGlzLT5ibG9ja0xpbmVzKCRibG9jayk7CgogICAgICAgICAgICAkY2xvc2VCbG9jayA9ICR0aGlzLT5icmVhazsKICAgICAgICB9CgogICAgICAgIGlmICghIGVtcHR5KCRibG9jay0+Y2hpbGRyZW4pKSB7CiAgICAgICAgICAgIGlmICgkdGhpcy0+ZGVwdGggPiAwICYmICgkaXNNZWRpYU9yRGlyZWN0aXZlIHx8ICEgJHRoaXMtPmhhc0ZsYXRDaGlsZCgkYmxvY2spKSkgewogICAgICAgICAgICAgICAgYXJyYXlfcG9wKCRkZXB0aHMpOwoKICAgICAgICAgICAgICAgICR0aGlzLT5kZXB0aC0tOwogICAgICAgICAgICAgICAgJHRoaXMtPmJsb2NrQ2hpbGRyZW4oJGJsb2NrKTsKICAgICAgICAgICAgICAgICR0aGlzLT5kZXB0aCsrOwoKICAgICAgICAgICAgICAgICRkZXB0aHNbXSA9ICRibG9jay0+ZGVwdGg7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkdGhpcy0+YmxvY2tDaGlsZHJlbigkYmxvY2spOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyByZWNsZWFyIHRvIG5vdCBiZSBzcG9pbGVkIGJ5IGNoaWxkcmVuIGlmIFRfRElSRUNUSVZFCiAgICAgICAgaWYgKCRibG9jay0+dHlwZSA9PT0gVHlwZTo6VF9ESVJFQ1RJVkUpIHsKICAgICAgICAgICAgJHByZXZpb3VzSGFzU2VsZWN0b3IgPSBmYWxzZTsKICAgICAgICB9CgogICAgICAgIGlmICghIGVtcHR5KCRibG9jay0+c2VsZWN0b3JzKSkgewogICAgICAgICAgICAkdGhpcy0+aW5kZW50TGV2ZWwtLTsKCiAgICAgICAgICAgIGlmICghICR0aGlzLT5rZWVwU2VtaWNvbG9ucykgewogICAgICAgICAgICAgICAgJHRoaXMtPnN0cmlwcGVkU2VtaWNvbG9uID0gJyc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICR0aGlzLT53cml0ZSgkdGhpcy0+Y2xvc2UpOwoKICAgICAgICAgICAgJGNsb3NlQmxvY2sgPSAkdGhpcy0+YnJlYWs7CgogICAgICAgICAgICBpZiAoJHRoaXMtPmRlcHRoID4gMSAmJiAhIGVtcHR5KCRibG9jay0+Y2hpbGRyZW4pKSB7CiAgICAgICAgICAgICAgICBhcnJheV9wb3AoJGRlcHRocyk7CiAgICAgICAgICAgICAgICAkdGhpcy0+ZGVwdGgtLTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCEgJGlzTWVkaWFPckRpcmVjdGl2ZSkgewogICAgICAgICAgICAgICAgJHByZXZpb3VzSGFzU2VsZWN0b3IgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoJGJsb2NrLT50eXBlID09PSAncm9vdCcpIHsKICAgICAgICAgICAgJHRoaXMtPndyaXRlKCR0aGlzLT5icmVhayk7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQmxvY2sgaGFzIGZsYXQgY2hpbGQKICAgICAqCiAgICAgKiBAcGFyYW0gXFNjc3NQaHBcU2Nzc1BocFxGb3JtYXR0ZXJcT3V0cHV0QmxvY2sgJGJsb2NrCiAgICAgKgogICAgICogQHJldHVybiBib29sCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gaGFzRmxhdENoaWxkKCRibG9jaykKICAgIHsKICAgICAgICBmb3JlYWNoICgkYmxvY2stPmNoaWxkcmVuIGFzICRjaGlsZCkgewogICAgICAgICAgICBpZiAoZW1wdHkoJGNoaWxkLT5zZWxlY3RvcnMpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/extra/scssphp/src/Formatter/OutputBlock.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEZvcm1hdHRlcjsKCi8qKgogKiBPdXRwdXQgYmxvY2sKICoKICogQGF1dGhvciBBbnRob24gUGFuZyA8YW50aG9uLnBhbmdAZ21haWwuY29tPgogKgogKiBAaW50ZXJuYWwKICovCmNsYXNzIE91dHB1dEJsb2NrCnsKICAgIC8qKgogICAgICogQHZhciBzdHJpbmd8bnVsbAogICAgICovCiAgICBwdWJsaWMgJHR5cGU7CgogICAgLyoqCiAgICAgKiBAdmFyIGludAogICAgICovCiAgICBwdWJsaWMgJGRlcHRoOwoKICAgIC8qKgogICAgICogQHZhciBhcnJheXxudWxsCiAgICAgKi8KICAgIHB1YmxpYyAkc2VsZWN0b3JzOwoKICAgIC8qKgogICAgICogQHZhciBzdHJpbmdbXQogICAgICovCiAgICBwdWJsaWMgJGxpbmVzOwoKICAgIC8qKgogICAgICogQHZhciBPdXRwdXRCbG9ja1tdCiAgICAgKi8KICAgIHB1YmxpYyAkY2hpbGRyZW47CgogICAgLyoqCiAgICAgKiBAdmFyIE91dHB1dEJsb2NrfG51bGwKICAgICAqLwogICAgcHVibGljICRwYXJlbnQ7CgogICAgLyoqCiAgICAgKiBAdmFyIHN0cmluZ3xudWxsCiAgICAgKi8KICAgIHB1YmxpYyAkc291cmNlTmFtZTsKCiAgICAvKioKICAgICAqIEB2YXIgaW50fG51bGwKICAgICAqLwogICAgcHVibGljICRzb3VyY2VMaW5lOwoKICAgIC8qKgogICAgICogQHZhciBpbnR8bnVsbAogICAgICovCiAgICBwdWJsaWMgJHNvdXJjZUNvbHVtbjsKfQo=]]></data>
	</file>
	<file>
	  <filename>/extra/scssphp/src/Logger/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/extra/scssphp/src/Logger/LoggerInterface.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXExvZ2dlcjsKCi8qKgogKiBJbnRlcmZhY2UgaW1wbGVtZW50ZWQgYnkgbG9nZ2VycyBmb3Igd2FybmluZ3MgYW5kIGRlYnVnIG1lc3NhZ2VzLgogKgogKiBUaGUgb2ZmaWNpYWwgU2FzcyBpbXBsZW1lbnRhdGlvbiByZWNvbW1lbmRzIHRoYXQgbG9nZ2VycyByZXBvcnQgdGhlCiAqIG1lc3NhZ2VzIGltbWVkaWF0ZWx5IHJhdGhlciB0aGFuIHdhaXRpbmcgZm9yIHRoZSBlbmQgb2YgdGhlCiAqIGNvbXBpbGF0aW9uLCB0byBwcm92aWRlIGEgYmV0dGVyIGRlYnVnZ2luZyBleHBlcmllbmNlIHdoZW4gdGhlCiAqIGNvbXBpbGF0aW9uIGRvZXMgbm90IGVuZCAoZXJyb3Igb3IgaW5maW5pdGUgbG9vcCBhZnRlciB0aGUgd2FybmluZwogKiBmb3IgaW5zdGFuY2UpLgogKi8KaW50ZXJmYWNlIExvZ2dlckludGVyZmFjZQp7CiAgICAvKioKICAgICAqIEVtaXRzIGEgd2FybmluZyB3aXRoIHRoZSBnaXZlbiBtZXNzYWdlLgogICAgICoKICAgICAqIElmICRkZXByZWNhdGlvbiBpcyB0cnVlLCBpdCBpbmRpY2F0ZXMgdGhhdCB0aGlzIGlzIGEgZGVwcmVjYXRpb24KICAgICAqIHdhcm5pbmcuIEltcGxlbWVudGF0aW9ucyBzaG91bGQgc3VyZmFjZSBhbGwgdGhpcyBpbmZvcm1hdGlvbiB0bwogICAgICogdGhlIGVuZCB1c2VyLgogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgJG1lc3NhZ2UKICAgICAqIEBwYXJhbSBib29sICAkZGVwcmVjYXRpb24KICAgICAqCiAgICAgKiBAcmV0dXJuIHZvaWQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHdhcm4oJG1lc3NhZ2UsICRkZXByZWNhdGlvbiA9IGZhbHNlKTsKCiAgICAvKioKICAgICAqIEVtaXRzIGEgZGVidWdnaW5nIG1lc3NhZ2UuCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkbWVzc2FnZQogICAgICoKICAgICAqIEByZXR1cm4gdm9pZAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZGVidWcoJG1lc3NhZ2UpOwp9Cg==]]></data>
	</file>
	<file>
	  <filename>/extra/scssphp/src/Logger/QuietLogger.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXExvZ2dlcjsKCi8qKgogKiBBIGxvZ2dlciB0aGF0IHNpbGVudGx5IGlnbm9yZXMgYWxsIG1lc3NhZ2VzLgogKgogKiBAZmluYWwKICovCmNsYXNzIFF1aWV0TG9nZ2VyIGltcGxlbWVudHMgTG9nZ2VySW50ZXJmYWNlCnsKICAgIHB1YmxpYyBmdW5jdGlvbiB3YXJuKCRtZXNzYWdlLCAkZGVwcmVjYXRpb24gPSBmYWxzZSkKICAgIHsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZGVidWcoJG1lc3NhZ2UpCiAgICB7CiAgICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/extra/scssphp/src/Logger/StreamLogger.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXExvZ2dlcjsKCi8qKgogKiBBIGxvZ2dlciB0aGF0IHByaW50cyB0byBhIFBIUCBzdHJlYW0gKGZvciBpbnN0YW5jZSBzdGRlcnIpCiAqCiAqIEBmaW5hbAogKi8KY2xhc3MgU3RyZWFtTG9nZ2VyIGltcGxlbWVudHMgTG9nZ2VySW50ZXJmYWNlCnsKICAgIHByaXZhdGUgJHN0cmVhbTsKICAgIHByaXZhdGUgJGNsb3NlT25EZXN0cnVjdDsKCiAgICAvKioKICAgICAqIEBwYXJhbSByZXNvdXJjZSAkc3RyZWFtICAgICAgICAgIEEgc3RyZWFtIHJlc291cmNlCiAgICAgKiBAcGFyYW0gYm9vbCAgICAgJGNsb3NlT25EZXN0cnVjdCBJZiB0cnVlLCB0YWtlcyBvd25lcnNoaXAgb2YgdGhlIHN0cmVhbSBhbmQgY2xvc2UgaXQgb24gZGVzdHJ1Y3QgdG8gYXZvaWQgbGVha3MuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkc3RyZWFtLCAkY2xvc2VPbkRlc3RydWN0ID0gZmFsc2UpCiAgICB7CiAgICAgICAgJHRoaXMtPnN0cmVhbSA9ICRzdHJlYW07CiAgICAgICAgJHRoaXMtPmNsb3NlT25EZXN0cnVjdCA9ICRjbG9zZU9uRGVzdHJ1Y3Q7CiAgICB9CgogICAgLyoqCiAgICAgKiBAaW50ZXJuYWwKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIF9fZGVzdHJ1Y3QoKQogICAgewogICAgICAgIGlmICgkdGhpcy0+Y2xvc2VPbkRlc3RydWN0KSB7CiAgICAgICAgICAgIGZjbG9zZSgkdGhpcy0+c3RyZWFtKTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBAaW5oZXJpdERvYwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gd2FybigkbWVzc2FnZSwgJGRlcHJlY2F0aW9uID0gZmFsc2UpCiAgICB7CiAgICAgICAgJHByZWZpeCA9ICgkZGVwcmVjYXRpb24gPyAnREVQUkVDQVRJT04gJyA6ICcnKSAuICdXQVJOSU5HOiAnOwoKICAgICAgICBmd3JpdGUoJHRoaXMtPnN0cmVhbSwgJHByZWZpeCAuICRtZXNzYWdlIC4gIlxuXG4iKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBpbmhlcml0RG9jCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBkZWJ1ZygkbWVzc2FnZSkKICAgIHsKICAgICAgICBmd3JpdGUoJHRoaXMtPnN0cmVhbSwgJG1lc3NhZ2UgLiAiXG4iKTsKICAgIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/extra/scssphp/src/Node.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwOwoKLyoqCiAqIEJhc2Ugbm9kZQogKgogKiBAYXV0aG9yIEFudGhvbiBQYW5nIDxhbnRob24ucGFuZ0BnbWFpbC5jb20+CiAqCiAqIEBpbnRlcm5hbAogKi8KYWJzdHJhY3QgY2xhc3MgTm9kZQp7CiAgICAvKioKICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkdHlwZTsKCiAgICAvKioKICAgICAqIEB2YXIgaW50CiAgICAgKi8KICAgIHB1YmxpYyAkc291cmNlSW5kZXg7CgogICAgLyoqCiAgICAgKiBAdmFyIGludHxudWxsCiAgICAgKi8KICAgIHB1YmxpYyAkc291cmNlTGluZTsKCiAgICAvKioKICAgICAqIEB2YXIgaW50fG51bGwKICAgICAqLwogICAgcHVibGljICRzb3VyY2VDb2x1bW47Cn0K]]></data>
	</file>
	<file>
	  <filename>/extra/scssphp/src/Node/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/extra/scssphp/src/Node/Number.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXE5vZGU7Cgp1c2UgU2Nzc1BocFxTY3NzUGhwXEJhc2VcUmFuZ2U7CnVzZSBTY3NzUGhwXFNjc3NQaHBcQ29tcGlsZXI7CnVzZSBTY3NzUGhwXFNjc3NQaHBcRXhjZXB0aW9uXFJhbmdlRXhjZXB0aW9uOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEV4Y2VwdGlvblxTYXNzU2NyaXB0RXhjZXB0aW9uOwp1c2UgU2Nzc1BocFxTY3NzUGhwXE5vZGU7CnVzZSBTY3NzUGhwXFNjc3NQaHBcVHlwZTsKdXNlIFNjc3NQaHBcU2Nzc1BocFxVdGlsOwoKLyoqCiAqIERpbWVuc2lvbiArIG9wdGlvbmFsIHVuaXRzCiAqCiAqIHtAaW50ZXJuYWwKICogICAgIFRoaXMgaXMgYSB3b3JrLWluLXByb2dyZXNzLgogKgogKiAgICAgVGhlIFxBcnJheUFjY2VzcyBpbnRlcmZhY2UgaXMgdGVtcG9yYXJ5IHVudGlsIHRoZSBtaWdyYXRpb24gaXMgY29tcGxldGUuCiAqIH19CiAqCiAqIEBhdXRob3IgQW50aG9uIFBhbmcgPGFudGhvbi5wYW5nQGdtYWlsLmNvbT4KICoKICogQHRlbXBsYXRlLWltcGxlbWVudHMgXEFycmF5QWNjZXNzPGludCwgbWl4ZWQ+CiAqLwpjbGFzcyBOdW1iZXIgZXh0ZW5kcyBOb2RlIGltcGxlbWVudHMgXEFycmF5QWNjZXNzLCBcSnNvblNlcmlhbGl6YWJsZQp7CiAgICBjb25zdCBQUkVDSVNJT04gPSAxMDsKCiAgICAvKioKICAgICAqIEB2YXIgaW50CiAgICAgKiBAZGVwcmVjYXRlZCB1c2Uge051bWJlcjo6UFJFQ0lTSU9OfSBpbnN0ZWFkIHRvIHJlYWQgdGhlIHByZWNpc2lvbi4gQ29uZmlndXJpbmcgaXQgaXMgbm90IHN1cHBvcnRlZCBhbnltb3JlLgogICAgICovCiAgICBwdWJsaWMgc3RhdGljICRwcmVjaXNpb24gPSBzZWxmOjpQUkVDSVNJT047CgogICAgLyoqCiAgICAgKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMTIvV0QtY3NzMy12YWx1ZXMtMjAxMjAzMDgvCiAgICAgKgogICAgICogQHZhciBhcnJheQogICAgICogQHBocHN0YW4tdmFyIGFycmF5PHN0cmluZywgYXJyYXk8c3RyaW5nLCBmbG9hdHxpbnQ+PgogICAgICovCiAgICBwcm90ZWN0ZWQgc3RhdGljICR1bml0VGFibGUgPSBbCiAgICAgICAgJ2luJyA9PiBbCiAgICAgICAgICAgICdpbicgPT4gMSwKICAgICAgICAgICAgJ3BjJyA9PiA2LAogICAgICAgICAgICAncHQnID0+IDcyLAogICAgICAgICAgICAncHgnID0+IDk2LAogICAgICAgICAgICAnY20nID0+IDIuNTQsCiAgICAgICAgICAgICdtbScgPT4gMjUuNCwKICAgICAgICAgICAgJ3EnICA9PiAxMDEuNiwKICAgICAgICBdLAogICAgICAgICd0dXJuJyA9PiBbCiAgICAgICAgICAgICdkZWcnICA9PiAzNjAsCiAgICAgICAgICAgICdncmFkJyA9PiA0MDAsCiAgICAgICAgICAgICdyYWQnICA9PiA2LjI4MzE4NTMwNzE3OTU4NjQ3NjkyNTI4Njc2LCAvLyAyICogTV9QSQogICAgICAgICAgICAndHVybicgPT4gMSwKICAgICAgICBdLAogICAgICAgICdzJyA9PiBbCiAgICAgICAgICAgICdzJyAgPT4gMSwKICAgICAgICAgICAgJ21zJyA9PiAxMDAwLAogICAgICAgIF0sCiAgICAgICAgJ0h6JyA9PiBbCiAgICAgICAgICAgICdIeicgID0+IDEsCiAgICAgICAgICAgICdrSHonID0+IDAuMDAxLAogICAgICAgIF0sCiAgICAgICAgJ2RwaScgPT4gWwogICAgICAgICAgICAnZHBpJyAgPT4gMSwKICAgICAgICAgICAgJ2RwY20nID0+IDEgLyAyLjU0LAogICAgICAgICAgICAnZHBweCcgPT4gMSAvIDk2LAogICAgICAgIF0sCiAgICBdOwoKICAgIC8qKgogICAgICogQHZhciBpbnR8ZmxvYXQKICAgICAqLwogICAgcHJpdmF0ZSAkZGltZW5zaW9uOwoKICAgIC8qKgogICAgICogQHZhciBzdHJpbmdbXQogICAgICogQHBocHN0YW4tdmFyIGxpc3Q8c3RyaW5nPgogICAgICovCiAgICBwcml2YXRlICRudW1lcmF0b3JVbml0czsKCiAgICAvKioKICAgICAqIEB2YXIgc3RyaW5nW10KICAgICAqIEBwaHBzdGFuLXZhciBsaXN0PHN0cmluZz4KICAgICAqLwogICAgcHJpdmF0ZSAkZGVub21pbmF0b3JVbml0czsKCiAgICAvKioKICAgICAqIEluaXRpYWxpemUgbnVtYmVyCiAgICAgKgogICAgICogQHBhcmFtIGludHxmbG9hdCAgICAgICAkZGltZW5zaW9uCiAgICAgKiBAcGFyYW0gc3RyaW5nW118c3RyaW5nICRudW1lcmF0b3JVbml0cwogICAgICogQHBhcmFtIHN0cmluZ1tdICAgICAgICAkZGVub21pbmF0b3JVbml0cwogICAgICoKICAgICAqIEBwaHBzdGFuLXBhcmFtIGxpc3Q8c3RyaW5nPnxzdHJpbmcgJG51bWVyYXRvclVuaXRzCiAgICAgKiBAcGhwc3Rhbi1wYXJhbSBsaXN0PHN0cmluZz4gICAgICAgICRkZW5vbWluYXRvclVuaXRzCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkZGltZW5zaW9uLCAkbnVtZXJhdG9yVW5pdHMsIGFycmF5ICRkZW5vbWluYXRvclVuaXRzID0gW10pCiAgICB7CiAgICAgICAgaWYgKGlzX3N0cmluZygkbnVtZXJhdG9yVW5pdHMpKSB7CiAgICAgICAgICAgICRudW1lcmF0b3JVbml0cyA9ICRudW1lcmF0b3JVbml0cyA/IFskbnVtZXJhdG9yVW5pdHNdIDogW107CiAgICAgICAgfSBlbHNlaWYgKGlzc2V0KCRudW1lcmF0b3JVbml0c1snbnVtZXJhdG9yX3VuaXRzJ10sICRudW1lcmF0b3JVbml0c1snZGVub21pbmF0b3JfdW5pdHMnXSkpIHsKICAgICAgICAgICAgLy8gVE9ETyBnZXQgcmlkIG9mIHRoaXMgb25jZSBgJG51bWJlclsyXWAgaXMgbm90IHVzZWQgYW55bW9yZQogICAgICAgICAgICAkZGVub21pbmF0b3JVbml0cyA9ICRudW1lcmF0b3JVbml0c1snZGVub21pbmF0b3JfdW5pdHMnXTsKICAgICAgICAgICAgJG51bWVyYXRvclVuaXRzID0gJG51bWVyYXRvclVuaXRzWydudW1lcmF0b3JfdW5pdHMnXTsKICAgICAgICB9CgogICAgICAgICR0aGlzLT5kaW1lbnNpb24gPSAkZGltZW5zaW9uOwogICAgICAgICR0aGlzLT5udW1lcmF0b3JVbml0cyA9ICRudW1lcmF0b3JVbml0czsKICAgICAgICAkdGhpcy0+ZGVub21pbmF0b3JVbml0cyA9ICRkZW5vbWluYXRvclVuaXRzOwogICAgfQoKICAgIC8qKgogICAgICogQHJldHVybiBmbG9hdHxpbnQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldERpbWVuc2lvbigpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5kaW1lbnNpb247CiAgICB9CgogICAgLyoqCiAgICAgKiBAcmV0dXJuIGxpc3Q8c3RyaW5nPgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0TnVtZXJhdG9yVW5pdHMoKQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+bnVtZXJhdG9yVW5pdHM7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcmV0dXJuIGxpc3Q8c3RyaW5nPgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0RGVub21pbmF0b3JVbml0cygpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5kZW5vbWluYXRvclVuaXRzOwogICAgfQoKICAgIC8qKgogICAgICogQHJldHVybiBtaXhlZAogICAgICovCiAgICAjW1xSZXR1cm5UeXBlV2lsbENoYW5nZV0KICAgIHB1YmxpYyBmdW5jdGlvbiBqc29uU2VyaWFsaXplKCkKICAgIHsKICAgICAgICAvLyBQYXNzaW5nIGEgY29tcGlsZXIgaW5zdGFuY2UgbWFrZXMgdGhlIG1ldGhvZCBvdXRwdXQgYSBTYXNzIHJlcHJlc2VudGF0aW9uIGluc3RlYWQgb2YgYSBDU1Mgb25lLCBzdXBwb3J0aW5nIGZ1bGwgdW5pdHMuCiAgICAgICAgcmV0dXJuICR0aGlzLT5vdXRwdXQobmV3IENvbXBpbGVyKCkpOwogICAgfQoKICAgIC8qKgogICAgICogQHJldHVybiBib29sCiAgICAgKi8KICAgICNbXFJldHVyblR5cGVXaWxsQ2hhbmdlXQogICAgcHVibGljIGZ1bmN0aW9uIG9mZnNldEV4aXN0cygkb2Zmc2V0KQogICAgewogICAgICAgIGlmICgkb2Zmc2V0ID09PSAtMykgewogICAgICAgICAgICByZXR1cm4gISBcaXNfbnVsbCgkdGhpcy0+c291cmNlQ29sdW1uKTsKICAgICAgICB9CgogICAgICAgIGlmICgkb2Zmc2V0ID09PSAtMikgewogICAgICAgICAgICByZXR1cm4gISBcaXNfbnVsbCgkdGhpcy0+c291cmNlTGluZSk7CiAgICAgICAgfQoKICAgICAgICBpZiAoCiAgICAgICAgICAgICRvZmZzZXQgPT09IC0xIHx8CiAgICAgICAgICAgICRvZmZzZXQgPT09IDAgfHwKICAgICAgICAgICAgJG9mZnNldCA9PT0gMSB8fAogICAgICAgICAgICAkb2Zmc2V0ID09PSAyCiAgICAgICAgKSB7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIC8qKgogICAgICogQHJldHVybiBtaXhlZAogICAgICovCiAgICAjW1xSZXR1cm5UeXBlV2lsbENoYW5nZV0KICAgIHB1YmxpYyBmdW5jdGlvbiBvZmZzZXRHZXQoJG9mZnNldCkKICAgIHsKICAgICAgICBzd2l0Y2ggKCRvZmZzZXQpIHsKICAgICAgICAgICAgY2FzZSAtMzoKICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+c291cmNlQ29sdW1uOwoKICAgICAgICAgICAgY2FzZSAtMjoKICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+c291cmNlTGluZTsKCiAgICAgICAgICAgIGNhc2UgLTE6CiAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPnNvdXJjZUluZGV4OwoKICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgcmV0dXJuIFR5cGU6OlRfTlVNQkVSOwoKICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5kaW1lbnNpb247CgogICAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXkoJ251bWVyYXRvcl91bml0cycgPT4gJHRoaXMtPm51bWVyYXRvclVuaXRzLCAnZGVub21pbmF0b3JfdW5pdHMnID0+ICR0aGlzLT5kZW5vbWluYXRvclVuaXRzKTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBAcmV0dXJuIHZvaWQKICAgICAqLwogICAgI1tcUmV0dXJuVHlwZVdpbGxDaGFuZ2VdCiAgICBwdWJsaWMgZnVuY3Rpb24gb2Zmc2V0U2V0KCRvZmZzZXQsICR2YWx1ZSkKICAgIHsKICAgICAgICB0aHJvdyBuZXcgXEJhZE1ldGhvZENhbGxFeGNlcHRpb24oJ051bWJlciBpcyBpbW11dGFibGUnKTsKICAgIH0KCiAgICAvKioKICAgICAqIEByZXR1cm4gdm9pZAogICAgICovCiAgICAjW1xSZXR1cm5UeXBlV2lsbENoYW5nZV0KICAgIHB1YmxpYyBmdW5jdGlvbiBvZmZzZXRVbnNldCgkb2Zmc2V0KQogICAgewogICAgICAgIHRocm93IG5ldyBcQmFkTWV0aG9kQ2FsbEV4Y2VwdGlvbignTnVtYmVyIGlzIGltbXV0YWJsZScpOwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBudW1iZXIgaXMgdW5pdGxlc3MKICAgICAqCiAgICAgKiBAcmV0dXJuIGJvb2wKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHVuaXRsZXNzKCkKICAgIHsKICAgICAgICByZXR1cm4gXGNvdW50KCR0aGlzLT5udW1lcmF0b3JVbml0cykgPT09IDAgJiYgXGNvdW50KCR0aGlzLT5kZW5vbWluYXRvclVuaXRzKSA9PT0gMDsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgbnVtYmVyIGhhcyBhbnkgdW5pdHMKICAgICAqCiAgICAgKiBAcmV0dXJuIGJvb2wKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGhhc1VuaXRzKCkKICAgIHsKICAgICAgICByZXR1cm4gISR0aGlzLT51bml0bGVzcygpOwogICAgfQoKICAgIC8qKgogICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIG51bWJlciBoYXMgZXhhY3RseSB0aGlzIHVuaXQKICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICR1bml0CiAgICAgKgogICAgICogQHJldHVybiBib29sCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBoYXNVbml0KCR1bml0KQogICAgewogICAgICAgIHJldHVybiBcY291bnQoJHRoaXMtPm51bWVyYXRvclVuaXRzKSA9PT0gMSAmJiBcY291bnQoJHRoaXMtPmRlbm9taW5hdG9yVW5pdHMpID09PSAwICYmICR0aGlzLT5udW1lcmF0b3JVbml0c1swXSA9PT0gJHVuaXQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHVuaXQocykgYXMgdGhlIHByb2R1Y3Qgb2YgbnVtZXJhdG9yIHVuaXRzIGRpdmlkZWQgYnkgdGhlIHByb2R1Y3Qgb2YgZGVub21pbmF0b3IgdW5pdHMKICAgICAqCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gdW5pdFN0cigpCiAgICB7CiAgICAgICAgaWYgKCR0aGlzLT51bml0bGVzcygpKSB7CiAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICB9CgogICAgICAgIHJldHVybiBzZWxmOjpnZXRVbml0U3RyaW5nKCR0aGlzLT5udW1lcmF0b3JVbml0cywgJHRoaXMtPmRlbm9taW5hdG9yVW5pdHMpOwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIGZsb2F0fGludCAkbWluCiAgICAgKiBAcGFyYW0gZmxvYXR8aW50ICRtYXgKICAgICAqIEBwYXJhbSBzdHJpbmd8bnVsbCAkbmFtZQogICAgICoKICAgICAqIEByZXR1cm4gZmxvYXR8aW50CiAgICAgKiBAdGhyb3dzIFNhc3NTY3JpcHRFeGNlcHRpb24KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHZhbHVlSW5SYW5nZSgkbWluLCAkbWF4LCAkbmFtZSA9IG51bGwpCiAgICB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgcmV0dXJuIFV0aWw6OmNoZWNrUmFuZ2UoJycsIG5ldyBSYW5nZSgkbWluLCAkbWF4KSwgJHRoaXMpOwogICAgICAgIH0gY2F0Y2ggKFJhbmdlRXhjZXB0aW9uICRlKSB7CiAgICAgICAgICAgIHRocm93IFNhc3NTY3JpcHRFeGNlcHRpb246OmZvckFyZ3VtZW50KHNwcmludGYoJ0V4cGVjdGVkICVzIHRvIGJlIHdpdGhpbiAlcyVzIGFuZCAlcyUzJHMuJywgJHRoaXMsICRtaW4sICR0aGlzLT51bml0U3RyKCksICRtYXgpLCAkbmFtZSk7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIGZsb2F0fGludCAkbWluCiAgICAgKiBAcGFyYW0gZmxvYXR8aW50ICRtYXgKICAgICAqIEBwYXJhbSBzdHJpbmcgICAgJG5hbWUKICAgICAqIEBwYXJhbSBzdHJpbmcgICAgJHVuaXQKICAgICAqCiAgICAgKiBAcmV0dXJuIGZsb2F0fGludAogICAgICogQHRocm93cyBTYXNzU2NyaXB0RXhjZXB0aW9uCiAgICAgKgogICAgICogQGludGVybmFsCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiB2YWx1ZUluUmFuZ2VXaXRoVW5pdCgkbWluLCAkbWF4LCAkbmFtZSwgJHVuaXQpCiAgICB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgcmV0dXJuIFV0aWw6OmNoZWNrUmFuZ2UoJycsIG5ldyBSYW5nZSgkbWluLCAkbWF4KSwgJHRoaXMpOwogICAgICAgIH0gY2F0Y2ggKFJhbmdlRXhjZXB0aW9uICRlKSB7CiAgICAgICAgICAgIHRocm93IFNhc3NTY3JpcHRFeGNlcHRpb246OmZvckFyZ3VtZW50KHNwcmludGYoJ0V4cGVjdGVkICVzIHRvIGJlIHdpdGhpbiAlcyVzIGFuZCAlcyUzJHMuJywgJHRoaXMsICRtaW4sICR1bml0LCAkbWF4KSwgJG5hbWUpOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSBzdHJpbmd8bnVsbCAkdmFyTmFtZQogICAgICoKICAgICAqIEByZXR1cm4gdm9pZAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gYXNzZXJ0Tm9Vbml0cygkdmFyTmFtZSA9IG51bGwpCiAgICB7CiAgICAgICAgaWYgKCR0aGlzLT51bml0bGVzcygpKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIHRocm93IFNhc3NTY3JpcHRFeGNlcHRpb246OmZvckFyZ3VtZW50KHNwcmludGYoJ0V4cGVjdGVkICVzIHRvIGhhdmUgbm8gdW5pdHMuJywgJHRoaXMpLCAkdmFyTmFtZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0gc3RyaW5nICAgICAgJHVuaXQKICAgICAqIEBwYXJhbSBzdHJpbmd8bnVsbCAkdmFyTmFtZQogICAgICoKICAgICAqIEByZXR1cm4gdm9pZAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gYXNzZXJ0VW5pdCgkdW5pdCwgJHZhck5hbWUgPSBudWxsKQogICAgewogICAgICAgIGlmICgkdGhpcy0+aGFzVW5pdCgkdW5pdCkpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgdGhyb3cgU2Fzc1NjcmlwdEV4Y2VwdGlvbjo6Zm9yQXJndW1lbnQoc3ByaW50ZignRXhwZWN0ZWQgJXMgdG8gaGF2ZSB1bml0ICIlcyIuJywgJHRoaXMsICR1bml0KSwgJHZhck5hbWUpOwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIE51bWJlciAkb3RoZXIKICAgICAqCiAgICAgKiBAcmV0dXJuIHZvaWQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGFzc2VydFNhbWVVbml0T3JVbml0bGVzcyhOdW1iZXIgJG90aGVyKQogICAgewogICAgICAgIGlmICgkb3RoZXItPnVuaXRsZXNzKCkpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgaWYgKCR0aGlzLT5udW1lcmF0b3JVbml0cyA9PT0gJG90aGVyLT5udW1lcmF0b3JVbml0cyAmJiAkdGhpcy0+ZGVub21pbmF0b3JVbml0cyA9PT0gJG90aGVyLT5kZW5vbWluYXRvclVuaXRzKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIHRocm93IG5ldyBTYXNzU2NyaXB0RXhjZXB0aW9uKHNwcmludGYoCiAgICAgICAgICAgICdJbmNvbXBhdGlibGUgdW5pdHMgJXMgYW5kICVzLicsCiAgICAgICAgICAgIHNlbGY6OmdldFVuaXRTdHJpbmcoJHRoaXMtPm51bWVyYXRvclVuaXRzLCAkdGhpcy0+ZGVub21pbmF0b3JVbml0cyksCiAgICAgICAgICAgIHNlbGY6OmdldFVuaXRTdHJpbmcoJG90aGVyLT5udW1lcmF0b3JVbml0cywgJG90aGVyLT5kZW5vbWluYXRvclVuaXRzKQogICAgICAgICkpOwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyBhIGNvcHkgb2YgdGhpcyBudW1iZXIsIGNvbnZlcnRlZCB0byB0aGUgdW5pdHMgcmVwcmVzZW50ZWQgYnkgJG5ld051bWVyYXRvclVuaXRzIGFuZCAkbmV3RGVub21pbmF0b3JVbml0cy4KICAgICAqCiAgICAgKiBUaGlzIGRvZXMgbm90IHRocm93IGFuIGVycm9yIGlmIHRoaXMgbnVtYmVyIGlzIHVuaXRsZXNzIGFuZAogICAgICogJG5ld051bWVyYXRvclVuaXRzLyRuZXdEZW5vbWluYXRvclVuaXRzIGFyZSBub3QgZW1wdHksIG9yIHZpY2UgdmVyc2EuIEluc3RlYWQsCiAgICAgKiBpdCB0cmVhdHMgYWxsIHVuaXRsZXNzIG51bWJlcnMgYXMgY29udmVydGlibGUgdG8gYW5kIGZyb20gYWxsIHVuaXRzIHdpdGhvdXQKICAgICAqIGNoYW5naW5nIHRoZSB2YWx1ZS4KICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nW10gJG5ld051bWVyYXRvclVuaXRzCiAgICAgKiBAcGFyYW0gc3RyaW5nW10gJG5ld0Rlbm9taW5hdG9yVW5pdHMKICAgICAqCiAgICAgKiBAcmV0dXJuIE51bWJlcgogICAgICoKICAgICAqIEBwaHBzdGFuLXBhcmFtIGxpc3Q8c3RyaW5nPiAkbmV3TnVtZXJhdG9yVW5pdHMKICAgICAqIEBwaHBzdGFuLXBhcmFtIGxpc3Q8c3RyaW5nPiAkbmV3RGVub21pbmF0b3JVbml0cwogICAgICoKICAgICAqIEB0aHJvd3MgU2Fzc1NjcmlwdEV4Y2VwdGlvbiBpZiB0aGlzIG51bWJlcidzIHVuaXRzIGFyZSBub3QgY29tcGF0aWJsZSB3aXRoICRuZXdOdW1lcmF0b3JVbml0cyBhbmQgJG5ld0Rlbm9taW5hdG9yVW5pdHMKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGNvZXJjZShhcnJheSAkbmV3TnVtZXJhdG9yVW5pdHMsIGFycmF5ICRuZXdEZW5vbWluYXRvclVuaXRzKQogICAgewogICAgICAgIHJldHVybiBuZXcgTnVtYmVyKCR0aGlzLT52YWx1ZUluVW5pdHMoJG5ld051bWVyYXRvclVuaXRzLCAkbmV3RGVub21pbmF0b3JVbml0cyksICRuZXdOdW1lcmF0b3JVbml0cywgJG5ld0Rlbm9taW5hdG9yVW5pdHMpOwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIE51bWJlciAkb3RoZXIKICAgICAqCiAgICAgKiBAcmV0dXJuIGJvb2wKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGlzQ29tcGFyYWJsZVRvKE51bWJlciAkb3RoZXIpCiAgICB7CiAgICAgICAgaWYgKCR0aGlzLT51bml0bGVzcygpIHx8ICRvdGhlci0+dW5pdGxlc3MoKSkgewogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CgogICAgICAgIHRyeSB7CiAgICAgICAgICAgICR0aGlzLT5ncmVhdGVyVGhhbigkb3RoZXIpOwogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9IGNhdGNoIChTYXNzU2NyaXB0RXhjZXB0aW9uICRlKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0gTnVtYmVyICRvdGhlcgogICAgICoKICAgICAqIEByZXR1cm4gYm9vbAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gbGVzc1RoYW4oTnVtYmVyICRvdGhlcikKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmNvZXJjZVVuaXRzKCRvdGhlciwgZnVuY3Rpb24gKCRudW0xLCAkbnVtMikgewogICAgICAgICAgICByZXR1cm4gJG51bTEgPCAkbnVtMjsKICAgICAgICB9KTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSBOdW1iZXIgJG90aGVyCiAgICAgKgogICAgICogQHJldHVybiBib29sCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBsZXNzVGhhbk9yRXF1YWwoTnVtYmVyICRvdGhlcikKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmNvZXJjZVVuaXRzKCRvdGhlciwgZnVuY3Rpb24gKCRudW0xLCAkbnVtMikgewogICAgICAgICAgICByZXR1cm4gJG51bTEgPD0gJG51bTI7CiAgICAgICAgfSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0gTnVtYmVyICRvdGhlcgogICAgICoKICAgICAqIEByZXR1cm4gYm9vbAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ3JlYXRlclRoYW4oTnVtYmVyICRvdGhlcikKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmNvZXJjZVVuaXRzKCRvdGhlciwgZnVuY3Rpb24gKCRudW0xLCAkbnVtMikgewogICAgICAgICAgICByZXR1cm4gJG51bTEgPiAkbnVtMjsKICAgICAgICB9KTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSBOdW1iZXIgJG90aGVyCiAgICAgKgogICAgICogQHJldHVybiBib29sCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBncmVhdGVyVGhhbk9yRXF1YWwoTnVtYmVyICRvdGhlcikKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmNvZXJjZVVuaXRzKCRvdGhlciwgZnVuY3Rpb24gKCRudW0xLCAkbnVtMikgewogICAgICAgICAgICByZXR1cm4gJG51bTEgPj0gJG51bTI7CiAgICAgICAgfSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0gTnVtYmVyICRvdGhlcgogICAgICoKICAgICAqIEByZXR1cm4gTnVtYmVyCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBwbHVzKE51bWJlciAkb3RoZXIpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5jb2VyY2VOdW1iZXIoJG90aGVyLCBmdW5jdGlvbiAoJG51bTEsICRudW0yKSB7CiAgICAgICAgICAgIHJldHVybiAkbnVtMSArICRudW0yOwogICAgICAgIH0pOwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIE51bWJlciAkb3RoZXIKICAgICAqCiAgICAgKiBAcmV0dXJuIE51bWJlcgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gbWludXMoTnVtYmVyICRvdGhlcikKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmNvZXJjZU51bWJlcigkb3RoZXIsIGZ1bmN0aW9uICgkbnVtMSwgJG51bTIpIHsKICAgICAgICAgICAgcmV0dXJuICRudW0xIC0gJG51bTI7CiAgICAgICAgfSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcmV0dXJuIE51bWJlcgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gdW5hcnlNaW51cygpCiAgICB7CiAgICAgICAgcmV0dXJuIG5ldyBOdW1iZXIoLSR0aGlzLT5kaW1lbnNpb24sICR0aGlzLT5udW1lcmF0b3JVbml0cywgJHRoaXMtPmRlbm9taW5hdG9yVW5pdHMpOwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIE51bWJlciAkb3RoZXIKICAgICAqCiAgICAgKiBAcmV0dXJuIE51bWJlcgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gbW9kdWxvKE51bWJlciAkb3RoZXIpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5jb2VyY2VOdW1iZXIoJG90aGVyLCBmdW5jdGlvbiAoJG51bTEsICRudW0yKSB7CiAgICAgICAgICAgIGlmICgkbnVtMiA9PSAwKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gTkFOOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkcmVzdWx0ID0gZm1vZCgkbnVtMSwgJG51bTIpOwoKICAgICAgICAgICAgaWYgKCRyZXN1bHQgPT0gMCkgewogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICgkbnVtMiA8IDAgeG9yICRudW0xIDwgMCkgewogICAgICAgICAgICAgICAgJHJlc3VsdCArPSAkbnVtMjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuICRyZXN1bHQ7CiAgICAgICAgfSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0gTnVtYmVyICRvdGhlcgogICAgICoKICAgICAqIEByZXR1cm4gTnVtYmVyCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiB0aW1lcyhOdW1iZXIgJG90aGVyKQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+bXVsdGlwbHlVbml0cygkdGhpcy0+ZGltZW5zaW9uICogJG90aGVyLT5kaW1lbnNpb24sICR0aGlzLT5udW1lcmF0b3JVbml0cywgJHRoaXMtPmRlbm9taW5hdG9yVW5pdHMsICRvdGhlci0+bnVtZXJhdG9yVW5pdHMsICRvdGhlci0+ZGVub21pbmF0b3JVbml0cyk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0gTnVtYmVyICRvdGhlcgogICAgICoKICAgICAqIEByZXR1cm4gTnVtYmVyCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBkaXZpZGVkQnkoTnVtYmVyICRvdGhlcikKICAgIHsKICAgICAgICBpZiAoJG90aGVyLT5kaW1lbnNpb24gPT0gMCkgewogICAgICAgICAgICBpZiAoJHRoaXMtPmRpbWVuc2lvbiA9PSAwKSB7CiAgICAgICAgICAgICAgICAkdmFsdWUgPSBOQU47CiAgICAgICAgICAgIH0gZWxzZWlmICgkdGhpcy0+ZGltZW5zaW9uID4gMCkgewogICAgICAgICAgICAgICAgJHZhbHVlID0gSU5GOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJHZhbHVlID0gLUlORjsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICR2YWx1ZSA9ICR0aGlzLT5kaW1lbnNpb24gLyAkb3RoZXItPmRpbWVuc2lvbjsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkdGhpcy0+bXVsdGlwbHlVbml0cygkdmFsdWUsICR0aGlzLT5udW1lcmF0b3JVbml0cywgJHRoaXMtPmRlbm9taW5hdG9yVW5pdHMsICRvdGhlci0+ZGVub21pbmF0b3JVbml0cywgJG90aGVyLT5udW1lcmF0b3JVbml0cyk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0gTnVtYmVyICRvdGhlcgogICAgICoKICAgICAqIEByZXR1cm4gYm9vbAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZXF1YWxzKE51bWJlciAkb3RoZXIpCiAgICB7CiAgICAgICAgLy8gVW5pdGxlc3MgbnVtYmVycyBhcmUgY29udmVydGFibGUgdG8gdW5pdCBudW1iZXJzLCBidXQgbm90IGVxdWFsLCBzbyB3ZSBzcGVjaWFsLWNhc2UgdW5pdGxlc3MgaGVyZS4KICAgICAgICBpZiAoJHRoaXMtPnVuaXRsZXNzKCkgIT09ICRvdGhlci0+dW5pdGxlc3MoKSkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICAvLyBJbiBTYXNzLCBuZWl0aGVyIE5hTiBub3IgSW5maW5pdHkgYXJlIGVxdWFsIHRvIHRoZW1zZWx2ZXMsIHdoaWxlIFBIUCBkZWZpbmVzIElORj09SU5GCiAgICAgICAgaWYgKGlzX25hbigkdGhpcy0+ZGltZW5zaW9uKSB8fCBpc19uYW4oJG90aGVyLT5kaW1lbnNpb24pIHx8ICFpc19maW5pdGUoJHRoaXMtPmRpbWVuc2lvbikgfHwgIWlzX2Zpbml0ZSgkb3RoZXItPmRpbWVuc2lvbikpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgaWYgKCR0aGlzLT51bml0bGVzcygpKSB7CiAgICAgICAgICAgIHJldHVybiByb3VuZCgkdGhpcy0+ZGltZW5zaW9uLCBzZWxmOjpQUkVDSVNJT04pID09IHJvdW5kKCRvdGhlci0+ZGltZW5zaW9uLCBzZWxmOjpQUkVDSVNJT04pOwogICAgICAgIH0KCiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5jb2VyY2VVbml0cygkb3RoZXIsIGZ1bmN0aW9uICgkbnVtMSwgJG51bTIpIHsKICAgICAgICAgICAgICAgIHJldHVybiByb3VuZCgkbnVtMSwgc2VsZjo6UFJFQ0lTSU9OKSA9PSByb3VuZCgkbnVtMiwgc2VsZjo6UFJFQ0lTSU9OKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSBjYXRjaCAoU2Fzc1NjcmlwdEV4Y2VwdGlvbiAkZSkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogT3V0cHV0IG51bWJlcgogICAgICoKICAgICAqIEBwYXJhbSBcU2Nzc1BocFxTY3NzUGhwXENvbXBpbGVyICRjb21waWxlcgogICAgICoKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBvdXRwdXQoQ29tcGlsZXIgJGNvbXBpbGVyID0gbnVsbCkKICAgIHsKICAgICAgICAkZGltZW5zaW9uID0gcm91bmQoJHRoaXMtPmRpbWVuc2lvbiwgc2VsZjo6UFJFQ0lTSU9OKTsKCiAgICAgICAgaWYgKGlzX25hbigkZGltZW5zaW9uKSkgewogICAgICAgICAgICByZXR1cm4gJ05hTic7CiAgICAgICAgfQoKICAgICAgICBpZiAoJGRpbWVuc2lvbiA9PT0gSU5GKSB7CiAgICAgICAgICAgIHJldHVybiAnSW5maW5pdHknOwogICAgICAgIH0KCiAgICAgICAgaWYgKCRkaW1lbnNpb24gPT09IC1JTkYpIHsKICAgICAgICAgICAgcmV0dXJuICctSW5maW5pdHknOwogICAgICAgIH0KCiAgICAgICAgaWYgKCRjb21waWxlcikgewogICAgICAgICAgICAkdW5pdCA9ICR0aGlzLT51bml0U3RyKCk7CiAgICAgICAgfSBlbHNlaWYgKGlzc2V0KCR0aGlzLT5udW1lcmF0b3JVbml0c1swXSkpIHsKICAgICAgICAgICAgJHVuaXQgPSAkdGhpcy0+bnVtZXJhdG9yVW5pdHNbMF07CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJHVuaXQgPSAnJzsKICAgICAgICB9CgogICAgICAgICRkaW1lbnNpb24gPSBudW1iZXJfZm9ybWF0KCRkaW1lbnNpb24sIHNlbGY6OlBSRUNJU0lPTiwgJy4nLCAnJyk7CgogICAgICAgIHJldHVybiBydHJpbShydHJpbSgkZGltZW5zaW9uLCAnMCcpLCAnLicpIC4gJHVuaXQ7CiAgICB9CgogICAgLyoqCiAgICAgKiB7QGluaGVyaXRkb2N9CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBfX3RvU3RyaW5nKCkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPm91dHB1dCgpOwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIE51bWJlciAgICRvdGhlcgogICAgICogQHBhcmFtIGNhbGxhYmxlICRvcGVyYXRpb24KICAgICAqCiAgICAgKiBAcmV0dXJuIE51bWJlcgogICAgICoKICAgICAqIEBwaHBzdGFuLXBhcmFtIGNhbGxhYmxlKGludHxmbG9hdCwgaW50fGZsb2F0KTogKGludHxmbG9hdCkgJG9wZXJhdGlvbgogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIGNvZXJjZU51bWJlcihOdW1iZXIgJG90aGVyLCAkb3BlcmF0aW9uKQogICAgewogICAgICAgICRyZXN1bHQgPSAkdGhpcy0+Y29lcmNlVW5pdHMoJG90aGVyLCAkb3BlcmF0aW9uKTsKCiAgICAgICAgaWYgKCEkdGhpcy0+dW5pdGxlc3MoKSkgewogICAgICAgICAgICByZXR1cm4gbmV3IE51bWJlcigkcmVzdWx0LCAkdGhpcy0+bnVtZXJhdG9yVW5pdHMsICR0aGlzLT5kZW5vbWluYXRvclVuaXRzKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBuZXcgTnVtYmVyKCRyZXN1bHQsICRvdGhlci0+bnVtZXJhdG9yVW5pdHMsICRvdGhlci0+ZGVub21pbmF0b3JVbml0cyk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0gTnVtYmVyICRvdGhlcgogICAgICogQHBhcmFtIGNhbGxhYmxlICRvcGVyYXRpb24KICAgICAqCiAgICAgKiBAcmV0dXJuIG1peGVkCiAgICAgKgogICAgICogQHBocHN0YW4tdGVtcGxhdGUgVAogICAgICogQHBocHN0YW4tcGFyYW0gY2FsbGFibGUoaW50fGZsb2F0LCBpbnR8ZmxvYXQpOiBUICRvcGVyYXRpb24KICAgICAqIEBwaHBzdGFuLXJldHVybiBUCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gY29lcmNlVW5pdHMoTnVtYmVyICRvdGhlciwgJG9wZXJhdGlvbikKICAgIHsKICAgICAgICBpZiAoISR0aGlzLT51bml0bGVzcygpKSB7CiAgICAgICAgICAgICRudW0xID0gJHRoaXMtPmRpbWVuc2lvbjsKICAgICAgICAgICAgJG51bTIgPSAkb3RoZXItPnZhbHVlSW5Vbml0cygkdGhpcy0+bnVtZXJhdG9yVW5pdHMsICR0aGlzLT5kZW5vbWluYXRvclVuaXRzKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkbnVtMSA9ICR0aGlzLT52YWx1ZUluVW5pdHMoJG90aGVyLT5udW1lcmF0b3JVbml0cywgJG90aGVyLT5kZW5vbWluYXRvclVuaXRzKTsKICAgICAgICAgICAgJG51bTIgPSAkb3RoZXItPmRpbWVuc2lvbjsKICAgICAgICB9CgogICAgICAgIHJldHVybiBcY2FsbF91c2VyX2Z1bmMoJG9wZXJhdGlvbiwgJG51bTEsICRudW0yKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSBzdHJpbmdbXSAkbnVtZXJhdG9yVW5pdHMKICAgICAqIEBwYXJhbSBzdHJpbmdbXSAkZGVub21pbmF0b3JVbml0cwogICAgICoKICAgICAqIEByZXR1cm4gaW50fGZsb2F0CiAgICAgKgogICAgICogQHBocHN0YW4tcGFyYW0gbGlzdDxzdHJpbmc+ICRudW1lcmF0b3JVbml0cwogICAgICogQHBocHN0YW4tcGFyYW0gbGlzdDxzdHJpbmc+ICRkZW5vbWluYXRvclVuaXRzCiAgICAgKgogICAgICogQHRocm93cyBTYXNzU2NyaXB0RXhjZXB0aW9uIGlmIHRoaXMgbnVtYmVyJ3MgdW5pdHMgYXJlIG5vdCBjb21wYXRpYmxlIHdpdGggJG51bWVyYXRvclVuaXRzIGFuZCAkZGVub21pbmF0b3JVbml0cwogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIHZhbHVlSW5Vbml0cyhhcnJheSAkbnVtZXJhdG9yVW5pdHMsIGFycmF5ICRkZW5vbWluYXRvclVuaXRzKQogICAgewogICAgICAgIGlmICgKICAgICAgICAgICAgJHRoaXMtPnVuaXRsZXNzKCkKICAgICAgICAgICAgfHwgKFxjb3VudCgkbnVtZXJhdG9yVW5pdHMpID09PSAwICYmIFxjb3VudCgkZGVub21pbmF0b3JVbml0cykgPT09IDApCiAgICAgICAgICAgIHx8ICgkdGhpcy0+bnVtZXJhdG9yVW5pdHMgPT09ICRudW1lcmF0b3JVbml0cyAmJiAkdGhpcy0+ZGVub21pbmF0b3JVbml0cyA9PT0gJGRlbm9taW5hdG9yVW5pdHMpCiAgICAgICAgKSB7CiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+ZGltZW5zaW9uOwogICAgICAgIH0KCiAgICAgICAgJHZhbHVlID0gJHRoaXMtPmRpbWVuc2lvbjsKICAgICAgICAkb2xkTnVtZXJhdG9ycyA9ICR0aGlzLT5udW1lcmF0b3JVbml0czsKCiAgICAgICAgZm9yZWFjaCAoJG51bWVyYXRvclVuaXRzIGFzICRuZXdOdW1lcmF0b3IpIHsKICAgICAgICAgICAgZm9yZWFjaCAoJG9sZE51bWVyYXRvcnMgYXMgJGtleSA9PiAkb2xkTnVtZXJhdG9yKSB7CiAgICAgICAgICAgICAgICAkY29udmVyc2lvbkZhY3RvciA9IHNlbGY6OmdldENvbnZlcnNpb25GYWN0b3IoJG5ld051bWVyYXRvciwgJG9sZE51bWVyYXRvcik7CgogICAgICAgICAgICAgICAgaWYgKFxpc19udWxsKCRjb252ZXJzaW9uRmFjdG9yKSkgewogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICR2YWx1ZSAqPSAkY29udmVyc2lvbkZhY3RvcjsKICAgICAgICAgICAgICAgIHVuc2V0KCRvbGROdW1lcmF0b3JzWyRrZXldKTsKICAgICAgICAgICAgICAgIGNvbnRpbnVlIDI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRocm93IG5ldyBTYXNzU2NyaXB0RXhjZXB0aW9uKHNwcmludGYoCiAgICAgICAgICAgICAgICAnSW5jb21wYXRpYmxlIHVuaXRzICVzIGFuZCAlcy4nLAogICAgICAgICAgICAgICAgc2VsZjo6Z2V0VW5pdFN0cmluZygkdGhpcy0+bnVtZXJhdG9yVW5pdHMsICR0aGlzLT5kZW5vbWluYXRvclVuaXRzKSwKICAgICAgICAgICAgICAgIHNlbGY6OmdldFVuaXRTdHJpbmcoJG51bWVyYXRvclVuaXRzLCAkZGVub21pbmF0b3JVbml0cykKICAgICAgICAgICAgKSk7CiAgICAgICAgfQoKICAgICAgICAkb2xkRGVub21pbmF0b3JzID0gJHRoaXMtPmRlbm9taW5hdG9yVW5pdHM7CgogICAgICAgIGZvcmVhY2ggKCRkZW5vbWluYXRvclVuaXRzIGFzICRuZXdEZW5vbWluYXRvcikgewogICAgICAgICAgICBmb3JlYWNoICgkb2xkRGVub21pbmF0b3JzIGFzICRrZXkgPT4gJG9sZERlbm9taW5hdG9yKSB7CiAgICAgICAgICAgICAgICAkY29udmVyc2lvbkZhY3RvciA9IHNlbGY6OmdldENvbnZlcnNpb25GYWN0b3IoJG5ld0Rlbm9taW5hdG9yLCAkb2xkRGVub21pbmF0b3IpOwoKICAgICAgICAgICAgICAgIGlmIChcaXNfbnVsbCgkY29udmVyc2lvbkZhY3RvcikpIHsKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkdmFsdWUgLz0gJGNvbnZlcnNpb25GYWN0b3I7CiAgICAgICAgICAgICAgICB1bnNldCgkb2xkRGVub21pbmF0b3JzWyRrZXldKTsKICAgICAgICAgICAgICAgIGNvbnRpbnVlIDI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRocm93IG5ldyBTYXNzU2NyaXB0RXhjZXB0aW9uKHNwcmludGYoCiAgICAgICAgICAgICAgICAnSW5jb21wYXRpYmxlIHVuaXRzICVzIGFuZCAlcy4nLAogICAgICAgICAgICAgICAgc2VsZjo6Z2V0VW5pdFN0cmluZygkdGhpcy0+bnVtZXJhdG9yVW5pdHMsICR0aGlzLT5kZW5vbWluYXRvclVuaXRzKSwKICAgICAgICAgICAgICAgIHNlbGY6OmdldFVuaXRTdHJpbmcoJG51bWVyYXRvclVuaXRzLCAkZGVub21pbmF0b3JVbml0cykKICAgICAgICAgICAgKSk7CiAgICAgICAgfQoKICAgICAgICBpZiAoXGNvdW50KCRvbGROdW1lcmF0b3JzKSB8fCBcY291bnQoJG9sZERlbm9taW5hdG9ycykpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IFNhc3NTY3JpcHRFeGNlcHRpb24oc3ByaW50ZigKICAgICAgICAgICAgICAgICdJbmNvbXBhdGlibGUgdW5pdHMgJXMgYW5kICVzLicsCiAgICAgICAgICAgICAgICBzZWxmOjpnZXRVbml0U3RyaW5nKCR0aGlzLT5udW1lcmF0b3JVbml0cywgJHRoaXMtPmRlbm9taW5hdG9yVW5pdHMpLAogICAgICAgICAgICAgICAgc2VsZjo6Z2V0VW5pdFN0cmluZygkbnVtZXJhdG9yVW5pdHMsICRkZW5vbWluYXRvclVuaXRzKQogICAgICAgICAgICApKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkdmFsdWU7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0gaW50fGZsb2F0ICR2YWx1ZQogICAgICogQHBhcmFtIHN0cmluZ1tdICRudW1lcmF0b3JzMQogICAgICogQHBhcmFtIHN0cmluZ1tdICRkZW5vbWluYXRvcnMxCiAgICAgKiBAcGFyYW0gc3RyaW5nW10gJG51bWVyYXRvcnMyCiAgICAgKiBAcGFyYW0gc3RyaW5nW10gJGRlbm9taW5hdG9yczIKICAgICAqCiAgICAgKiBAcmV0dXJuIE51bWJlcgogICAgICoKICAgICAqIEBwaHBzdGFuLXBhcmFtIGxpc3Q8c3RyaW5nPiAkbnVtZXJhdG9yczEKICAgICAqIEBwaHBzdGFuLXBhcmFtIGxpc3Q8c3RyaW5nPiAkZGVub21pbmF0b3JzMQogICAgICogQHBocHN0YW4tcGFyYW0gbGlzdDxzdHJpbmc+ICRudW1lcmF0b3JzMgogICAgICogQHBocHN0YW4tcGFyYW0gbGlzdDxzdHJpbmc+ICRkZW5vbWluYXRvcnMyCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gbXVsdGlwbHlVbml0cygkdmFsdWUsIGFycmF5ICRudW1lcmF0b3JzMSwgYXJyYXkgJGRlbm9taW5hdG9yczEsIGFycmF5ICRudW1lcmF0b3JzMiwgYXJyYXkgJGRlbm9taW5hdG9yczIpCiAgICB7CiAgICAgICAgJG5ld051bWVyYXRvcnMgPSBhcnJheSgpOwoKICAgICAgICBmb3JlYWNoICgkbnVtZXJhdG9yczEgYXMgJG51bWVyYXRvcikgewogICAgICAgICAgICBmb3JlYWNoICgkZGVub21pbmF0b3JzMiBhcyAka2V5ID0+ICRkZW5vbWluYXRvcikgewogICAgICAgICAgICAgICAgJGNvbnZlcnNpb25GYWN0b3IgPSBzZWxmOjpnZXRDb252ZXJzaW9uRmFjdG9yKCRudW1lcmF0b3IsICRkZW5vbWluYXRvcik7CgogICAgICAgICAgICAgICAgaWYgKFxpc19udWxsKCRjb252ZXJzaW9uRmFjdG9yKSkgewogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICR2YWx1ZSAvPSAkY29udmVyc2lvbkZhY3RvcjsKICAgICAgICAgICAgICAgIHVuc2V0KCRkZW5vbWluYXRvcnMyWyRrZXldKTsKICAgICAgICAgICAgICAgIGNvbnRpbnVlIDI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRuZXdOdW1lcmF0b3JzW10gPSAkbnVtZXJhdG9yOwogICAgICAgIH0KCiAgICAgICAgZm9yZWFjaCAoJG51bWVyYXRvcnMyIGFzICRudW1lcmF0b3IpIHsKICAgICAgICAgICAgZm9yZWFjaCAoJGRlbm9taW5hdG9yczEgYXMgJGtleSA9PiAkZGVub21pbmF0b3IpIHsKICAgICAgICAgICAgICAgICRjb252ZXJzaW9uRmFjdG9yID0gc2VsZjo6Z2V0Q29udmVyc2lvbkZhY3RvcigkbnVtZXJhdG9yLCAkZGVub21pbmF0b3IpOwoKICAgICAgICAgICAgICAgIGlmIChcaXNfbnVsbCgkY29udmVyc2lvbkZhY3RvcikpIHsKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkdmFsdWUgLz0gJGNvbnZlcnNpb25GYWN0b3I7CiAgICAgICAgICAgICAgICB1bnNldCgkZGVub21pbmF0b3JzMVska2V5XSk7CiAgICAgICAgICAgICAgICBjb250aW51ZSAyOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkbmV3TnVtZXJhdG9yc1tdID0gJG51bWVyYXRvcjsKICAgICAgICB9CgogICAgICAgICRuZXdEZW5vbWluYXRvcnMgPSBhcnJheV92YWx1ZXMoYXJyYXlfbWVyZ2UoJGRlbm9taW5hdG9yczEsICRkZW5vbWluYXRvcnMyKSk7CgogICAgICAgIHJldHVybiBuZXcgTnVtYmVyKCR2YWx1ZSwgJG5ld051bWVyYXRvcnMsICRuZXdEZW5vbWluYXRvcnMpOwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIFt1bml0MV1zIHBlciBbdW5pdDJdLgogICAgICoKICAgICAqIEVxdWl2YWxlbnRseSwgYDF1bml0MSAqIGNvbnZlcnNpb25GYWN0b3IodW5pdDEsIHVuaXQyKSA9IDF1bml0MmAuCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkdW5pdDEKICAgICAqIEBwYXJhbSBzdHJpbmcgJHVuaXQyCiAgICAgKgogICAgICogQHJldHVybiBmbG9hdHxpbnR8bnVsbAogICAgICovCiAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBnZXRDb252ZXJzaW9uRmFjdG9yKCR1bml0MSwgJHVuaXQyKQogICAgewogICAgICAgIGlmICgkdW5pdDEgPT09ICR1bml0MikgewogICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICB9CgogICAgICAgIGZvcmVhY2ggKHN0YXRpYzo6JHVuaXRUYWJsZSBhcyAkdW5pdFZhcmlhbnRzKSB7CiAgICAgICAgICAgIGlmIChpc3NldCgkdW5pdFZhcmlhbnRzWyR1bml0MV0pICYmIGlzc2V0KCR1bml0VmFyaWFudHNbJHVuaXQyXSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiAkdW5pdFZhcmlhbnRzWyR1bml0MV0gLyAkdW5pdFZhcmlhbnRzWyR1bml0Ml07CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyB1bml0KHMpIGFzIHRoZSBwcm9kdWN0IG9mIG51bWVyYXRvciB1bml0cyBkaXZpZGVkIGJ5IHRoZSBwcm9kdWN0IG9mIGRlbm9taW5hdG9yIHVuaXRzCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZ1tdICRudW1lcmF0b3JzCiAgICAgKiBAcGFyYW0gc3RyaW5nW10gJGRlbm9taW5hdG9ycwogICAgICoKICAgICAqIEBwaHBzdGFuLXBhcmFtIGxpc3Q8c3RyaW5nPiAkbnVtZXJhdG9ycwogICAgICogQHBocHN0YW4tcGFyYW0gbGlzdDxzdHJpbmc+ICRkZW5vbWluYXRvcnMKICAgICAqCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBnZXRVbml0U3RyaW5nKGFycmF5ICRudW1lcmF0b3JzLCBhcnJheSAkZGVub21pbmF0b3JzKQogICAgewogICAgICAgIGlmICghXGNvdW50KCRudW1lcmF0b3JzKSkgewogICAgICAgICAgICBpZiAoXGNvdW50KCRkZW5vbWluYXRvcnMpID09PSAwKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJ25vIHVuaXRzJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKFxjb3VudCgkZGVub21pbmF0b3JzKSA9PT0gMSkgewogICAgICAgICAgICAgICAgcmV0dXJuICRkZW5vbWluYXRvcnNbMF0gLiAnXi0xJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuICcoJyAuIGltcGxvZGUoJyonLCAkZGVub21pbmF0b3JzKSAuICcpXi0xJzsKICAgICAgICB9CgogICAgICAgIHJldHVybiBpbXBsb2RlKCcqJywgJG51bWVyYXRvcnMpIC4gKFxjb3VudCgkZGVub21pbmF0b3JzKSA/ICcvJyAuIGltcGxvZGUoJyonLCAkZGVub21pbmF0b3JzKSA6ICcnKTsKICAgIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/extra/scssphp/src/OutputStyle.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwOwoKZmluYWwgY2xhc3MgT3V0cHV0U3R5bGUKewogICAgY29uc3QgRVhQQU5ERUQgPSAnZXhwYW5kZWQnOwogICAgY29uc3QgQ09NUFJFU1NFRCA9ICdjb21wcmVzc2VkJzsKCiAgICAvKioKICAgICAqIENvbnZlcnRzIGEgc3RyaW5nIHRvIGFuIG91dHB1dCBzdHlsZS4KICAgICAqCiAgICAgKiBVc2luZyB0aGlzIG1ldGhvZCBhbGxvd3MgdG8gd3JpdGUgY29kZSB3aGljaCB3aWxsIHN1cHBvcnQgYm90aAogICAgICogdmVyc2lvbnMgMS4xMisgYW5kIDIuMCBvZiBTY3NzcGhwLiBJbiAyLjAsIE91dHB1dFN0eWxlIHdpbGwgYmUKICAgICAqIGFuIGVudW0gaW5zdGVhZCBvZiB1c2luZyBzdHJpbmcgY29uc3RhbnRzLgogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgJHN0cmluZwogICAgICoKICAgICAqIEByZXR1cm4gc2VsZjo6KgogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGZyb21TdHJpbmcoJHN0cmluZykKICAgIHsKICAgICAgICBzd2l0Y2ggKCRzdHJpbmcpIHsKICAgICAgICAgICAgY2FzZSAnZXhwYW5kZWQnOgogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGY6OkVYUEFOREVEOwoKICAgICAgICAgICAgY2FzZSAnY29tcHJlc3NlZCc6CiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZjo6Q09NUFJFU1NFRDsKCiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignSW52YWxpZCBvdXRwdXQgc3R5bGUnKTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBDb252ZXJ0cyBhbiBvdXRwdXQgc3R5bGUgdG8gYSBzdHJpbmcgc3VwcG9ydGVkIGJ5IHtAc2VlIE91dHB1dFN0eWxlOjpmcm9tU3RyaW5nKCl9LgogICAgICoKICAgICAqIFVzaW5nIHRoaXMgbWV0aG9kIGFsbG93cyB0byB3cml0ZSBjb2RlIHdoaWNoIHdpbGwgc3VwcG9ydCBib3RoCiAgICAgKiB2ZXJzaW9ucyAxLjEyKyBhbmQgMi4wIG9mIFNjc3NwaHAuIEluIDIuMCwgT3V0cHV0U3R5bGUgd2lsbCBiZQogICAgICogYW4gZW51bSBpbnN0ZWFkIG9mIHVzaW5nIHN0cmluZyBjb25zdGFudHMuCiAgICAgKiBUaGUgcmV0dXJuZWQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIGlzIGd1YXJhbnRlZWQgdG8gYmUgY29tcGF0aWJsZQogICAgICogYmV0d2VlbiAxLjEyIGFuZCAyLjAuCiAgICAgKgogICAgICogQHBhcmFtIHNlbGY6OiogJG91dHB1dFN0eWxlCiAgICAgKgogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiB0b1N0cmluZygkb3V0cHV0U3R5bGUpCiAgICB7CiAgICAgICAgcmV0dXJuICRvdXRwdXRTdHlsZTsKICAgIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/extra/scssphp/src/Parser.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwOwoKdXNlIFNjc3NQaHBcU2Nzc1BocFxCbG9ja1xBdFJvb3RCbG9jazsKdXNlIFNjc3NQaHBcU2Nzc1BocFxCbG9ja1xDYWxsYWJsZUJsb2NrOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEJsb2NrXENvbnRlbnRCbG9jazsKdXNlIFNjc3NQaHBcU2Nzc1BocFxCbG9ja1xEaXJlY3RpdmVCbG9jazsKdXNlIFNjc3NQaHBcU2Nzc1BocFxCbG9ja1xFYWNoQmxvY2s7CnVzZSBTY3NzUGhwXFNjc3NQaHBcQmxvY2tcRWxzZUJsb2NrOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEJsb2NrXEVsc2VpZkJsb2NrOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEJsb2NrXEZvckJsb2NrOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEJsb2NrXElmQmxvY2s7CnVzZSBTY3NzUGhwXFNjc3NQaHBcQmxvY2tcTWVkaWFCbG9jazsKdXNlIFNjc3NQaHBcU2Nzc1BocFxCbG9ja1xOZXN0ZWRQcm9wZXJ0eUJsb2NrOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEJsb2NrXFdoaWxlQmxvY2s7CnVzZSBTY3NzUGhwXFNjc3NQaHBcRXhjZXB0aW9uXFBhcnNlckV4Y2VwdGlvbjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxMb2dnZXJcTG9nZ2VySW50ZXJmYWNlOwp1c2UgU2Nzc1BocFxTY3NzUGhwXExvZ2dlclxRdWlldExvZ2dlcjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxOb2RlXE51bWJlcjsKCi8qKgogKiBQYXJzZXIKICoKICogQGF1dGhvciBMZWFmIENvcmNvcmFuIDxsZWFmb3RAZ21haWwuY29tPgogKgogKiBAaW50ZXJuYWwKICovCmNsYXNzIFBhcnNlcgp7CiAgICBjb25zdCBTT1VSQ0VfSU5ERVggID0gLTE7CiAgICBjb25zdCBTT1VSQ0VfTElORSAgID0gLTI7CiAgICBjb25zdCBTT1VSQ0VfQ09MVU1OID0gLTM7CgogICAgLyoqCiAgICAgKiBAdmFyIGFycmF5PHN0cmluZywgaW50PgogICAgICovCiAgICBwcm90ZWN0ZWQgc3RhdGljICRwcmVjZWRlbmNlID0gWwogICAgICAgICc9JyAgID0+IDAsCiAgICAgICAgJ29yJyAgPT4gMSwKICAgICAgICAnYW5kJyA9PiAyLAogICAgICAgICc9PScgID0+IDMsCiAgICAgICAgJyE9JyAgPT4gMywKICAgICAgICAnPD0nICA9PiA0LAogICAgICAgICc+PScgID0+IDQsCiAgICAgICAgJzwnICAgPT4gNCwKICAgICAgICAnPicgICA9PiA0LAogICAgICAgICcrJyAgID0+IDUsCiAgICAgICAgJy0nICAgPT4gNSwKICAgICAgICAnKicgICA9PiA2LAogICAgICAgICcvJyAgID0+IDYsCiAgICAgICAgJyUnICAgPT4gNiwKICAgIF07CgogICAgLyoqCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwcm90ZWN0ZWQgc3RhdGljICRjb21tZW50UGF0dGVybjsKICAgIC8qKgogICAgICogQHZhciBzdHJpbmcKICAgICAqLwogICAgcHJvdGVjdGVkIHN0YXRpYyAkb3BlcmF0b3JQYXR0ZXJuOwogICAgLyoqCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwcm90ZWN0ZWQgc3RhdGljICR3aGl0ZVBhdHRlcm47CgogICAgLyoqCiAgICAgKiBAdmFyIENhY2hlfG51bGwKICAgICAqLwogICAgcHJvdGVjdGVkICRjYWNoZTsKCiAgICBwcml2YXRlICRzb3VyY2VOYW1lOwogICAgcHJpdmF0ZSAkc291cmNlSW5kZXg7CiAgICAvKioKICAgICAqIEB2YXIgYXJyYXk8aW50LCBpbnQ+CiAgICAgKi8KICAgIHByaXZhdGUgJHNvdXJjZVBvc2l0aW9uczsKICAgIC8qKgogICAgICogVGhlIGN1cnJlbnQgb2Zmc2V0IGluIHRoZSBidWZmZXIKICAgICAqCiAgICAgKiBAdmFyIGludAogICAgICovCiAgICBwcml2YXRlICRjb3VudDsKICAgIC8qKgogICAgICogQHZhciBCbG9ja3xudWxsCiAgICAgKi8KICAgIHByaXZhdGUgJGVudjsKICAgIC8qKgogICAgICogQHZhciBib29sCiAgICAgKi8KICAgIHByaXZhdGUgJGluUGFyZW5zOwogICAgLyoqCiAgICAgKiBAdmFyIGJvb2wKICAgICAqLwogICAgcHJpdmF0ZSAkZWF0V2hpdGVEZWZhdWx0OwogICAgLyoqCiAgICAgKiBAdmFyIGJvb2wKICAgICAqLwogICAgcHJpdmF0ZSAkZGlzY2FyZENvbW1lbnRzOwogICAgcHJpdmF0ZSAkYWxsb3dWYXJzOwogICAgLyoqCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwcml2YXRlICRidWZmZXI7CiAgICBwcml2YXRlICR1dGY4OwogICAgLyoqCiAgICAgKiBAdmFyIHN0cmluZ3xudWxsCiAgICAgKi8KICAgIHByaXZhdGUgJGVuY29kaW5nOwogICAgcHJpdmF0ZSAkcGF0dGVybk1vZGlmaWVyczsKICAgIHByaXZhdGUgJGNvbW1lbnRzU2VlbjsKCiAgICBwcml2YXRlICRjc3NPbmx5OwoKICAgIC8qKgogICAgICogQHZhciBMb2dnZXJJbnRlcmZhY2UKICAgICAqLwogICAgcHJpdmF0ZSAkbG9nZ2VyOwoKICAgIC8qKgogICAgICogQ29uc3RydWN0b3IKICAgICAqCiAgICAgKiBAYXBpCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZ3xudWxsICAgICAgICAgICRzb3VyY2VOYW1lCiAgICAgKiBAcGFyYW0gaW50ICAgICAgICAgICAgICAgICAgJHNvdXJjZUluZGV4CiAgICAgKiBAcGFyYW0gc3RyaW5nfG51bGwgICAgICAgICAgJGVuY29kaW5nCiAgICAgKiBAcGFyYW0gQ2FjaGV8bnVsbCAgICAgICAgICAgJGNhY2hlCiAgICAgKiBAcGFyYW0gYm9vbCAgICAgICAgICAgICAgICAgJGNzc09ubHkKICAgICAqIEBwYXJhbSBMb2dnZXJJbnRlcmZhY2V8bnVsbCAkbG9nZ2VyCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkc291cmNlTmFtZSwgJHNvdXJjZUluZGV4ID0gMCwgJGVuY29kaW5nID0gJ3V0Zi04JywgQ2FjaGUgJGNhY2hlID0gbnVsbCwgJGNzc09ubHkgPSBmYWxzZSwgTG9nZ2VySW50ZXJmYWNlICRsb2dnZXIgPSBudWxsKQogICAgewogICAgICAgICR0aGlzLT5zb3VyY2VOYW1lICAgICAgID0gJHNvdXJjZU5hbWUgPzogJyhzdGRpbiknOwogICAgICAgICR0aGlzLT5zb3VyY2VJbmRleCAgICAgID0gJHNvdXJjZUluZGV4OwogICAgICAgICR0aGlzLT51dGY4ICAgICAgICAgICAgID0gISAkZW5jb2RpbmcgfHwgc3RydG9sb3dlcigkZW5jb2RpbmcpID09PSAndXRmLTgnOwogICAgICAgICR0aGlzLT5wYXR0ZXJuTW9kaWZpZXJzID0gJHRoaXMtPnV0ZjggPyAnQWlzdScgOiAnQWlzJzsKICAgICAgICAkdGhpcy0+Y29tbWVudHNTZWVuICAgICA9IFtdOwogICAgICAgICR0aGlzLT5hbGxvd1ZhcnMgICAgICAgID0gdHJ1ZTsKICAgICAgICAkdGhpcy0+Y3NzT25seSAgICAgICAgICA9ICRjc3NPbmx5OwogICAgICAgICR0aGlzLT5sb2dnZXIgPSAkbG9nZ2VyID86IG5ldyBRdWlldExvZ2dlcigpOwoKICAgICAgICBpZiAoZW1wdHkoc3RhdGljOjokb3BlcmF0b3JQYXR0ZXJuKSkgewogICAgICAgICAgICBzdGF0aWM6OiRvcGVyYXRvclBhdHRlcm4gPSAnKFsqXC8lKy1dfFshPV1cPXxcPlw9P3xcPFw9P3xhbmR8b3IpJzsKCiAgICAgICAgICAgICRjb21tZW50U2luZ2xlICAgICAgPSAnXC9cLyc7CiAgICAgICAgICAgICRjb21tZW50TXVsdGlMZWZ0ICAgPSAnXC9cKic7CiAgICAgICAgICAgICRjb21tZW50TXVsdGlSaWdodCAgPSAnXCpcLyc7CgogICAgICAgICAgICBzdGF0aWM6OiRjb21tZW50UGF0dGVybiA9ICRjb21tZW50TXVsdGlMZWZ0IC4gJy4qPycgLiAkY29tbWVudE11bHRpUmlnaHQ7CiAgICAgICAgICAgIHN0YXRpYzo6JHdoaXRlUGF0dGVybiA9ICR0aGlzLT51dGY4CiAgICAgICAgICAgICAgICA/ICcvJyAuICRjb21tZW50U2luZ2xlIC4gJ1teXG5dKlxzKnwoJyAuIHN0YXRpYzo6JGNvbW1lbnRQYXR0ZXJuIC4gJylccyp8XHMrL0Fpc3VTJwogICAgICAgICAgICAgICAgOiAnLycgLiAkY29tbWVudFNpbmdsZSAuICdbXlxuXSpccyp8KCcgLiBzdGF0aWM6OiRjb21tZW50UGF0dGVybiAuICcpXHMqfFxzKy9BaXNTJzsKICAgICAgICB9CgogICAgICAgICR0aGlzLT5jYWNoZSA9ICRjYWNoZTsKICAgIH0KCiAgICAvKioKICAgICAqIEdldCBzb3VyY2UgZmlsZSBuYW1lCiAgICAgKgogICAgICogQGFwaQogICAgICoKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRTb3VyY2VOYW1lKCkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnNvdXJjZU5hbWU7CiAgICB9CgogICAgLyoqCiAgICAgKiBUaHJvdyBwYXJzZXIgZXJyb3IKICAgICAqCiAgICAgKiBAYXBpCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkbXNnCiAgICAgKgogICAgICogQHBocHN0YW4tcmV0dXJuIG5ldmVyLXJldHVybgogICAgICoKICAgICAqIEB0aHJvd3MgUGFyc2VyRXhjZXB0aW9uCiAgICAgKgogICAgICogQGRlcHJlY2F0ZWQgdXNlICJwYXJzZUVycm9yIiBhbmQgdGhyb3cgdGhlIGV4Y2VwdGlvbiBpbiB0aGUgY2FsbGVyIGluc3RlYWQuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiB0aHJvd1BhcnNlRXJyb3IoJG1zZyA9ICdwYXJzZSBlcnJvcicpCiAgICB7CiAgICAgICAgQHRyaWdnZXJfZXJyb3IoCiAgICAgICAgICAgICdUaGUgbWV0aG9kICJ0aHJvd1BhcnNlRXJyb3IiIGlzIGRlcHJlY2F0ZWQuIFVzZSAicGFyc2VFcnJvciIgYW5kIHRocm93IHRoZSBleGNlcHRpb24gaW4gdGhlIGNhbGxlciBpbnN0ZWFkJywKICAgICAgICAgICAgRV9VU0VSX0RFUFJFQ0FURUQKICAgICAgICApOwoKICAgICAgICB0aHJvdyAkdGhpcy0+cGFyc2VFcnJvcigkbXNnKTsKICAgIH0KCiAgICAvKioKICAgICAqIENyZWF0ZXMgYSBwYXJzZXIgZXJyb3IKICAgICAqCiAgICAgKiBAYXBpCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkbXNnCiAgICAgKgogICAgICogQHJldHVybiBQYXJzZXJFeGNlcHRpb24KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHBhcnNlRXJyb3IoJG1zZyA9ICdwYXJzZSBlcnJvcicpCiAgICB7CiAgICAgICAgbGlzdCgkbGluZSwgJGNvbHVtbikgPSAkdGhpcy0+Z2V0U291cmNlUG9zaXRpb24oJHRoaXMtPmNvdW50KTsKCiAgICAgICAgJGxvYyA9IGVtcHR5KCR0aGlzLT5zb3VyY2VOYW1lKQogICAgICAgICAgICAgPyAibGluZTogJGxpbmUsIGNvbHVtbjogJGNvbHVtbiIKICAgICAgICAgICAgIDogIiR0aGlzLT5zb3VyY2VOYW1lIG9uIGxpbmUgJGxpbmUsIGF0IGNvbHVtbiAkY29sdW1uIjsKCiAgICAgICAgaWYgKCR0aGlzLT5wZWVrKCcoLio/KShcbnwkKScsICRtLCAkdGhpcy0+Y291bnQpKSB7CiAgICAgICAgICAgICR0aGlzLT5yZXN0b3JlRW5jb2RpbmcoKTsKCiAgICAgICAgICAgICRlID0gbmV3IFBhcnNlckV4Y2VwdGlvbigiJG1zZzogZmFpbGVkIGF0IGAkbVsxXWAgJGxvYyIpOwogICAgICAgICAgICAkZS0+c2V0U291cmNlUG9zaXRpb24oWyR0aGlzLT5zb3VyY2VOYW1lLCAkbGluZSwgJGNvbHVtbl0pOwoKICAgICAgICAgICAgcmV0dXJuICRlOwogICAgICAgIH0KCiAgICAgICAgJHRoaXMtPnJlc3RvcmVFbmNvZGluZygpOwoKICAgICAgICAkZSA9IG5ldyBQYXJzZXJFeGNlcHRpb24oIiRtc2c6ICRsb2MiKTsKICAgICAgICAkZS0+c2V0U291cmNlUG9zaXRpb24oWyR0aGlzLT5zb3VyY2VOYW1lLCAkbGluZSwgJGNvbHVtbl0pOwoKICAgICAgICByZXR1cm4gJGU7CiAgICB9CgogICAgLyoqCiAgICAgKiBQYXJzZXIgYnVmZmVyCiAgICAgKgogICAgICogQGFwaQogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgJGJ1ZmZlcgogICAgICoKICAgICAqIEByZXR1cm4gQmxvY2sKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHBhcnNlKCRidWZmZXIpCiAgICB7CiAgICAgICAgaWYgKCR0aGlzLT5jYWNoZSkgewogICAgICAgICAgICAkY2FjaGVLZXkgPSAkdGhpcy0+c291cmNlTmFtZSAuICc6JyAuIG1kNSgkYnVmZmVyKTsKICAgICAgICAgICAgJHBhcnNlT3B0aW9ucyA9IFsKICAgICAgICAgICAgICAgICd1dGY4JyA9PiAkdGhpcy0+dXRmOCwKICAgICAgICAgICAgXTsKICAgICAgICAgICAgJHYgPSAkdGhpcy0+Y2FjaGUtPmdldENhY2hlKCdwYXJzZScsICRjYWNoZUtleSwgJHBhcnNlT3B0aW9ucyk7CgogICAgICAgICAgICBpZiAoISBcaXNfbnVsbCgkdikpIHsKICAgICAgICAgICAgICAgIHJldHVybiAkdjsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gc3RyaXAgQk9NIChieXRlIG9yZGVyIG1hcmtlcikKICAgICAgICBpZiAoc3Vic3RyKCRidWZmZXIsIDAsIDMpID09PSAiXHhlZlx4YmJceGJmIikgewogICAgICAgICAgICAkYnVmZmVyID0gc3Vic3RyKCRidWZmZXIsIDMpOwogICAgICAgIH0KCiAgICAgICAgJHRoaXMtPmJ1ZmZlciAgICAgICAgICA9IHJ0cmltKCRidWZmZXIsICJceDAwLi5ceDFmIik7CiAgICAgICAgJHRoaXMtPmNvdW50ICAgICAgICAgICA9IDA7CiAgICAgICAgJHRoaXMtPmVudiAgICAgICAgICAgICA9IG51bGw7CiAgICAgICAgJHRoaXMtPmluUGFyZW5zICAgICAgICA9IGZhbHNlOwogICAgICAgICR0aGlzLT5lYXRXaGl0ZURlZmF1bHQgPSB0cnVlOwoKICAgICAgICAkdGhpcy0+c2F2ZUVuY29kaW5nKCk7CiAgICAgICAgJHRoaXMtPmV4dHJhY3RMaW5lTnVtYmVycygkYnVmZmVyKTsKCiAgICAgICAgaWYgKCR0aGlzLT51dGY4ICYmICFwcmVnX21hdGNoKCcvL3UnLCAkYnVmZmVyKSkgewogICAgICAgICAgICAkbWVzc2FnZSA9ICR0aGlzLT5zb3VyY2VOYW1lID8gJ0ludmFsaWQgVVRGLTggZmlsZTogJyAuICR0aGlzLT5zb3VyY2VOYW1lIDogJ0ludmFsaWQgVVRGLTggZmlsZSc7CiAgICAgICAgICAgIHRocm93IG5ldyBQYXJzZXJFeGNlcHRpb24oJG1lc3NhZ2UpOwogICAgICAgIH0KCiAgICAgICAgJHRoaXMtPnB1c2hCbG9jayhudWxsKTsgLy8gcm9vdCBibG9jawogICAgICAgICR0aGlzLT53aGl0ZXNwYWNlKCk7CiAgICAgICAgJHRoaXMtPnB1c2hCbG9jayhudWxsKTsKICAgICAgICAkdGhpcy0+cG9wQmxvY2soKTsKCiAgICAgICAgd2hpbGUgKCR0aGlzLT5wYXJzZUNodW5rKCkpIHsKICAgICAgICAgICAgOwogICAgICAgIH0KCiAgICAgICAgaWYgKCR0aGlzLT5jb3VudCAhPT0gXHN0cmxlbigkdGhpcy0+YnVmZmVyKSkgewogICAgICAgICAgICB0aHJvdyAkdGhpcy0+cGFyc2VFcnJvcigpOwogICAgICAgIH0KCiAgICAgICAgaWYgKCEgZW1wdHkoJHRoaXMtPmVudi0+cGFyZW50KSkgewogICAgICAgICAgICB0aHJvdyAkdGhpcy0+cGFyc2VFcnJvcigndW5jbG9zZWQgYmxvY2snKTsKICAgICAgICB9CgogICAgICAgICR0aGlzLT5yZXN0b3JlRW5jb2RpbmcoKTsKICAgICAgICBhc3NlcnQoJHRoaXMtPmVudiAhPT0gbnVsbCk7CgogICAgICAgIGlmICgkdGhpcy0+Y2FjaGUpIHsKICAgICAgICAgICAgJHRoaXMtPmNhY2hlLT5zZXRDYWNoZSgncGFyc2UnLCAkY2FjaGVLZXksICR0aGlzLT5lbnYsICRwYXJzZU9wdGlvbnMpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICR0aGlzLT5lbnY7CiAgICB9CgogICAgLyoqCiAgICAgKiBQYXJzZSBhIHZhbHVlIG9yIHZhbHVlIGxpc3QKICAgICAqCiAgICAgKiBAYXBpCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkYnVmZmVyCiAgICAgKiBAcGFyYW0gbWl4ZWQgICRvdXQKICAgICAqIEBwYXJhbS1vdXQgYXJyYXl8TnVtYmVyICRvdXQKICAgICAqCiAgICAgKiBAcmV0dXJuIGJvb2wKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHBhcnNlVmFsdWUoJGJ1ZmZlciwgJiRvdXQpCiAgICB7CiAgICAgICAgJHRoaXMtPmNvdW50ICAgICAgICAgICA9IDA7CiAgICAgICAgJHRoaXMtPmVudiAgICAgICAgICAgICA9IG51bGw7CiAgICAgICAgJHRoaXMtPmluUGFyZW5zICAgICAgICA9IGZhbHNlOwogICAgICAgICR0aGlzLT5lYXRXaGl0ZURlZmF1bHQgPSB0cnVlOwogICAgICAgICR0aGlzLT5idWZmZXIgICAgICAgICAgPSAoc3RyaW5nKSAkYnVmZmVyOwoKICAgICAgICAkdGhpcy0+c2F2ZUVuY29kaW5nKCk7CiAgICAgICAgJHRoaXMtPmV4dHJhY3RMaW5lTnVtYmVycygkdGhpcy0+YnVmZmVyKTsKCiAgICAgICAgJGxpc3QgPSAkdGhpcy0+dmFsdWVMaXN0KCRvdXQpOwoKICAgICAgICBpZiAoJHRoaXMtPmNvdW50ICE9PSBcc3RybGVuKCR0aGlzLT5idWZmZXIpKSB7CiAgICAgICAgICAgICRlcnJvciA9ICR0aGlzLT5wYXJzZUVycm9yKCdFeHBlY3RlZCBlbmQgb2YgdmFsdWUnKTsKICAgICAgICAgICAgJG1lc3NhZ2UgPSAnUGFzc2luZyB0cmFpbGluZyBjb250ZW50IGFmdGVyIHRoZSBleHByZXNzaW9uIHdoZW4gcGFyc2luZyBhIHZhbHVlIGlzIGRlcHJlY2F0ZWQgc2luY2UgU2Nzc3BocCAxLjEyLjAgYW5kIHdpbGwgYmUgYW4gZXJyb3IgaW4gMi4wLiAnIC4gJGVycm9yLT5nZXRNZXNzYWdlKCk7CgogICAgICAgICAgICBAdHJpZ2dlcl9lcnJvcigkbWVzc2FnZSwgRV9VU0VSX0RFUFJFQ0FURUQpOwogICAgICAgIH0KCiAgICAgICAgJHRoaXMtPnJlc3RvcmVFbmNvZGluZygpOwoKICAgICAgICByZXR1cm4gJGxpc3Q7CiAgICB9CgogICAgLyoqCiAgICAgKiBQYXJzZSBhIHNlbGVjdG9yIG9yIHNlbGVjdG9yIGxpc3QKICAgICAqCiAgICAgKiBAYXBpCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkYnVmZmVyCiAgICAgKiBAcGFyYW0gYXJyYXkgICRvdXQKICAgICAqIEBwYXJhbSBib29sICAgJHNob3VsZFZhbGlkYXRlCiAgICAgKgogICAgICogQHJldHVybiBib29sCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBwYXJzZVNlbGVjdG9yKCRidWZmZXIsICYkb3V0LCAkc2hvdWxkVmFsaWRhdGUgPSB0cnVlKQogICAgewogICAgICAgICR0aGlzLT5jb3VudCAgICAgICAgICAgPSAwOwogICAgICAgICR0aGlzLT5lbnYgICAgICAgICAgICAgPSBudWxsOwogICAgICAgICR0aGlzLT5pblBhcmVucyAgICAgICAgPSBmYWxzZTsKICAgICAgICAkdGhpcy0+ZWF0V2hpdGVEZWZhdWx0ID0gdHJ1ZTsKICAgICAgICAkdGhpcy0+YnVmZmVyICAgICAgICAgID0gKHN0cmluZykgJGJ1ZmZlcjsKCiAgICAgICAgJHRoaXMtPnNhdmVFbmNvZGluZygpOwogICAgICAgICR0aGlzLT5leHRyYWN0TGluZU51bWJlcnMoJHRoaXMtPmJ1ZmZlcik7CgogICAgICAgIC8vIGRpc2NhcmQgc3BhY2UvY29tbWVudHMgYXQgdGhlIHN0YXJ0CiAgICAgICAgJHRoaXMtPmRpc2NhcmRDb21tZW50cyA9IHRydWU7CiAgICAgICAgJHRoaXMtPndoaXRlc3BhY2UoKTsKICAgICAgICAkdGhpcy0+ZGlzY2FyZENvbW1lbnRzID0gZmFsc2U7CgogICAgICAgICRzZWxlY3RvciA9ICR0aGlzLT5zZWxlY3RvcnMoJG91dCk7CgogICAgICAgICR0aGlzLT5yZXN0b3JlRW5jb2RpbmcoKTsKCiAgICAgICAgaWYgKCRzaG91bGRWYWxpZGF0ZSAmJiAkdGhpcy0+Y291bnQgIT09IHN0cmxlbigkYnVmZmVyKSkgewogICAgICAgICAgICB0aHJvdyAkdGhpcy0+cGFyc2VFcnJvcigiYCIgLiBzdWJzdHIoJGJ1ZmZlciwgJHRoaXMtPmNvdW50KSAuICJgIGlzIG5vdCBhIHZhbGlkIFNlbGVjdG9yIGluIGAkYnVmZmVyYCIpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRzZWxlY3RvcjsKICAgIH0KCiAgICAvKioKICAgICAqIFBhcnNlIGEgbWVkaWEgUXVlcnkKICAgICAqCiAgICAgKiBAYXBpCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkYnVmZmVyCiAgICAgKiBAcGFyYW0gYXJyYXkgICRvdXQKICAgICAqCiAgICAgKiBAcmV0dXJuIGJvb2wKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHBhcnNlTWVkaWFRdWVyeUxpc3QoJGJ1ZmZlciwgJiRvdXQpCiAgICB7CiAgICAgICAgJHRoaXMtPmNvdW50ICAgICAgICAgICA9IDA7CiAgICAgICAgJHRoaXMtPmVudiAgICAgICAgICAgICA9IG51bGw7CiAgICAgICAgJHRoaXMtPmluUGFyZW5zICAgICAgICA9IGZhbHNlOwogICAgICAgICR0aGlzLT5lYXRXaGl0ZURlZmF1bHQgPSB0cnVlOwogICAgICAgICR0aGlzLT5idWZmZXIgICAgICAgICAgPSAoc3RyaW5nKSAkYnVmZmVyOwogICAgICAgICR0aGlzLT5kaXNjYXJkQ29tbWVudHMgPSB0cnVlOwoKICAgICAgICAkdGhpcy0+c2F2ZUVuY29kaW5nKCk7CiAgICAgICAgJHRoaXMtPmV4dHJhY3RMaW5lTnVtYmVycygkdGhpcy0+YnVmZmVyKTsKCiAgICAgICAgJHRoaXMtPndoaXRlc3BhY2UoKTsKCiAgICAgICAgJGlzTWVkaWFRdWVyeSA9ICR0aGlzLT5tZWRpYVF1ZXJ5TGlzdCgkb3V0KTsKCiAgICAgICAgJHRoaXMtPnJlc3RvcmVFbmNvZGluZygpOwoKICAgICAgICByZXR1cm4gJGlzTWVkaWFRdWVyeTsKICAgIH0KCiAgICAvKioKICAgICAqIFBhcnNlIGEgc2luZ2xlIGNodW5rIG9mZiB0aGUgaGVhZCBvZiB0aGUgYnVmZmVyIGFuZCBhcHBlbmQgaXQgdG8gdGhlCiAgICAgKiBjdXJyZW50IHBhcnNlIGVudmlyb25tZW50LgogICAgICoKICAgICAqIFJldHVybnMgZmFsc2Ugd2hlbiB0aGUgYnVmZmVyIGlzIGVtcHR5LCBvciB3aGVuIHRoZXJlIGlzIGFuIGVycm9yLgogICAgICoKICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHJlcGVhdGVkbHkgdW50aWwgdGhlIGVudGlyZSBkb2N1bWVudCBpcwogICAgICogcGFyc2VkLgogICAgICoKICAgICAqIFRoaXMgcGFyc2VyIGlzIG1vc3Qgc2ltaWxhciB0byBhIHJlY3Vyc2l2ZSBkZXNjZW50IHBhcnNlci4gU2luZ2xlCiAgICAgKiBmdW5jdGlvbnMgcmVwcmVzZW50IGRpc2NyZXRlIGdyYW1tYXRpY2FsIHJ1bGVzIGZvciB0aGUgbGFuZ3VhZ2UsIGFuZAogICAgICogdGhleSBhcmUgYWJsZSB0byBjYXB0dXJlIHRoZSB0ZXh0IHRoYXQgcmVwcmVzZW50cyB0aG9zZSBydWxlcy4KICAgICAqCiAgICAgKiBDb25zaWRlciB0aGUgZnVuY3Rpb24gQ29tcGlsZXI6OmtleXdvcmQoKS4gKEFsbCBwYXJzZSBmdW5jdGlvbnMgYXJlCiAgICAgKiBzdHJ1Y3R1cmVkIHRoZSBzYW1lLikKICAgICAqCiAgICAgKiBUaGUgZnVuY3Rpb24gdGFrZXMgYSBzaW5nbGUgcmVmZXJlbmNlIGFyZ3VtZW50LiBXaGVuIGNhbGxpbmcgdGhlCiAgICAgKiBmdW5jdGlvbiBpdCB3aWxsIGF0dGVtcHQgdG8gbWF0Y2ggYSBrZXl3b3JkIG9uIHRoZSBoZWFkIG9mIHRoZSBidWZmZXIuCiAgICAgKiBJZiBpdCBpcyBzdWNjZXNzZnVsLCBpdCB3aWxsIHBsYWNlIHRoZSBrZXl3b3JkIGluIHRoZSByZWZlcmVuY2VkCiAgICAgKiBhcmd1bWVudCwgYWR2YW5jZSB0aGUgcG9zaXRpb24gaW4gdGhlIGJ1ZmZlciwgYW5kIHJldHVybiB0cnVlLiBJZiBpdAogICAgICogZmFpbHMgdGhlbiBpdCB3b24ndCBhZHZhbmNlIHRoZSBidWZmZXIgYW5kIGl0IHdpbGwgcmV0dXJuIGZhbHNlLgogICAgICoKICAgICAqIEFsbCBvZiB0aGVzZSBwYXJzZSBmdW5jdGlvbnMgYXJlIHBvd2VyZWQgYnkgQ29tcGlsZXI6Om1hdGNoKCksIHdoaWNoIGJlaGF2ZXMKICAgICAqIHRoZSBzYW1lIHdheSwgYnV0IHRha2VzIGEgbGl0ZXJhbCByZWd1bGFyIGV4cHJlc3Npb24uIFNvbWV0aW1lcyBpdCBpcwogICAgICogbW9yZSBjb252ZW5pZW50IHRvIHVzZSBtYXRjaCBpbnN0ZWFkIG9mIGNyZWF0aW5nIGEgbmV3IGZ1bmN0aW9uLgogICAgICoKICAgICAqIEJlY2F1c2Ugb2YgdGhlIGZvcm1hdCBvZiB0aGUgZnVuY3Rpb25zLCB0byBwYXJzZSBhbiBlbnRpcmUgc3RyaW5nIG9mCiAgICAgKiBncmFtbWF0aWNhbCBydWxlcywgeW91IGNhbiBjaGFpbiB0aGVtIHRvZ2V0aGVyIHVzaW5nICYmLgogICAgICoKICAgICAqIEJ1dCwgaWYgc29tZSBvZiB0aGUgcnVsZXMgaW4gdGhlIGNoYWluIHN1Y2NlZWQgYmVmb3JlIG9uZSBmYWlscywgdGhlbgogICAgICogdGhlIGJ1ZmZlciBwb3NpdGlvbiB3aWxsIGJlIGxlZnQgYXQgYW4gaW52YWxpZCBzdGF0ZS4gSW4gb3JkZXIgdG8KICAgICAqIGF2b2lkIHRoaXMsIENvbXBpbGVyOjpzZWVrKCkgaXMgdXNlZCB0byByZW1lbWJlciBhbmQgc2V0IGJ1ZmZlciBwb3NpdGlvbnMuCiAgICAgKgogICAgICogQmVmb3JlIHBhcnNpbmcgYSBjaGFpbiwgdXNlICRzID0gJHRoaXMtPmNvdW50IHRvIHJlbWVtYmVyIHRoZSBjdXJyZW50CiAgICAgKiBwb3NpdGlvbiBpbnRvICRzLiBUaGVuIGlmIGEgY2hhaW4gZmFpbHMsIHVzZSAkdGhpcy0+c2VlaygkcykgdG8KICAgICAqIGdvIGJhY2sgd2hlcmUgd2Ugc3RhcnRlZC4KICAgICAqCiAgICAgKiBAcmV0dXJuIGJvb2wKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIHBhcnNlQ2h1bmsoKQogICAgewogICAgICAgICRzID0gJHRoaXMtPmNvdW50OwoKICAgICAgICAvLyB0aGUgZGlyZWN0aXZlcwogICAgICAgIGlmIChpc3NldCgkdGhpcy0+YnVmZmVyWyR0aGlzLT5jb3VudF0pICYmICR0aGlzLT5idWZmZXJbJHRoaXMtPmNvdW50XSA9PT0gJ0AnKSB7CiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICR0aGlzLT5saXRlcmFsKCdAYXQtcm9vdCcsIDgpICYmCiAgICAgICAgICAgICAgICAoJHRoaXMtPnNlbGVjdG9ycygkc2VsZWN0b3IpIHx8IHRydWUpICYmCiAgICAgICAgICAgICAgICAoJHRoaXMtPm1hcCgkd2l0aCkgfHwgdHJ1ZSkgJiYKICAgICAgICAgICAgICAgICgoJHRoaXMtPm1hdGNoQ2hhcignKCcpICYmCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmludGVycG9sYXRpb24oJHdpdGgpICYmCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPm1hdGNoQ2hhcignKScpKSB8fCB0cnVlKSAmJgogICAgICAgICAgICAgICAgJHRoaXMtPm1hdGNoQ2hhcigneycsIGZhbHNlKQogICAgICAgICAgICApIHsKICAgICAgICAgICAgICAgICEgJHRoaXMtPmNzc09ubHkgfHwgJHRoaXMtPmFzc2VydFBsYWluQ3NzVmFsaWQoZmFsc2UsICRzKTsKCiAgICAgICAgICAgICAgICAkYXRSb290ID0gbmV3IEF0Um9vdEJsb2NrKCk7CiAgICAgICAgICAgICAgICAkdGhpcy0+cmVnaXN0ZXJQdXNoZWRCbG9jaygkYXRSb290LCAkcyk7CiAgICAgICAgICAgICAgICAkYXRSb290LT5zZWxlY3RvciA9ICRzZWxlY3RvcjsKICAgICAgICAgICAgICAgICRhdFJvb3QtPndpdGggICAgID0gJHdpdGg7CgogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICR0aGlzLT5zZWVrKCRzKTsKCiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICR0aGlzLT5saXRlcmFsKCdAbWVkaWEnLCA2KSAmJgogICAgICAgICAgICAgICAgJHRoaXMtPm1lZGlhUXVlcnlMaXN0KCRtZWRpYVF1ZXJ5TGlzdCkgJiYKICAgICAgICAgICAgICAgICR0aGlzLT5tYXRjaENoYXIoJ3snLCBmYWxzZSkKICAgICAgICAgICAgKSB7CiAgICAgICAgICAgICAgICAkbWVkaWEgPSBuZXcgTWVkaWFCbG9jaygpOwogICAgICAgICAgICAgICAgJHRoaXMtPnJlZ2lzdGVyUHVzaGVkQmxvY2soJG1lZGlhLCAkcyk7CiAgICAgICAgICAgICAgICAkbWVkaWEtPnF1ZXJ5TGlzdCA9ICRtZWRpYVF1ZXJ5TGlzdFsyXTsKCiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHRoaXMtPnNlZWsoJHMpOwoKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJHRoaXMtPmxpdGVyYWwoJ0BtaXhpbicsIDYpICYmCiAgICAgICAgICAgICAgICAkdGhpcy0+a2V5d29yZCgkbWl4aW5OYW1lKSAmJgogICAgICAgICAgICAgICAgKCR0aGlzLT5hcmd1bWVudERlZigkYXJncykgfHwgdHJ1ZSkgJiYKICAgICAgICAgICAgICAgICR0aGlzLT5tYXRjaENoYXIoJ3snLCBmYWxzZSkKICAgICAgICAgICAgKSB7CiAgICAgICAgICAgICAgICAhICR0aGlzLT5jc3NPbmx5IHx8ICR0aGlzLT5hc3NlcnRQbGFpbkNzc1ZhbGlkKGZhbHNlLCAkcyk7CgogICAgICAgICAgICAgICAgJG1peGluID0gbmV3IENhbGxhYmxlQmxvY2soVHlwZTo6VF9NSVhJTik7CiAgICAgICAgICAgICAgICAkdGhpcy0+cmVnaXN0ZXJQdXNoZWRCbG9jaygkbWl4aW4sICRzKTsKICAgICAgICAgICAgICAgICRtaXhpbi0+bmFtZSA9ICRtaXhpbk5hbWU7CiAgICAgICAgICAgICAgICAkbWl4aW4tPmFyZ3MgPSAkYXJnczsKCiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHRoaXMtPnNlZWsoJHMpOwoKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgKCR0aGlzLT5saXRlcmFsKCdAaW5jbHVkZScsIDgpICYmCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmtleXdvcmQoJG1peGluTmFtZSkgJiYKICAgICAgICAgICAgICAgICAgICAoJHRoaXMtPm1hdGNoQ2hhcignKCcpICYmCiAgICAgICAgICAgICAgICAgICAgKCR0aGlzLT5hcmdWYWx1ZXMoJGFyZ1ZhbHVlcykgfHwgdHJ1ZSkgJiYKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+bWF0Y2hDaGFyKCcpJykgfHwgdHJ1ZSkgJiYKICAgICAgICAgICAgICAgICAgICAoJHRoaXMtPmVuZCgpKSB8fAogICAgICAgICAgICAgICAgKCR0aGlzLT5saXRlcmFsKCd1c2luZycsIDUpICYmCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmFyZ3VtZW50RGVmKCRhcmdVc2luZykgJiYKICAgICAgICAgICAgICAgICAgICAoJHRoaXMtPmVuZCgpIHx8ICR0aGlzLT5tYXRjaENoYXIoJ3snKSAmJiAkaGFzQmxvY2sgPSB0cnVlKSkgfHwKICAgICAgICAgICAgICAgICR0aGlzLT5tYXRjaENoYXIoJ3snKSAmJiAkaGFzQmxvY2sgPSB0cnVlKQogICAgICAgICAgICApIHsKICAgICAgICAgICAgICAgICEgJHRoaXMtPmNzc09ubHkgfHwgJHRoaXMtPmFzc2VydFBsYWluQ3NzVmFsaWQoZmFsc2UsICRzKTsKCiAgICAgICAgICAgICAgICAkY2hpbGQgPSBbCiAgICAgICAgICAgICAgICAgICAgVHlwZTo6VF9JTkNMVURFLAogICAgICAgICAgICAgICAgICAgICRtaXhpbk5hbWUsCiAgICAgICAgICAgICAgICAgICAgaXNzZXQoJGFyZ1ZhbHVlcykgPyAkYXJnVmFsdWVzIDogbnVsbCwKICAgICAgICAgICAgICAgICAgICBudWxsLAogICAgICAgICAgICAgICAgICAgIGlzc2V0KCRhcmdVc2luZykgPyAkYXJnVXNpbmcgOiBudWxsCiAgICAgICAgICAgICAgICBdOwoKICAgICAgICAgICAgICAgIGlmICghIGVtcHR5KCRoYXNCbG9jaykpIHsKICAgICAgICAgICAgICAgICAgICAkaW5jbHVkZSA9IG5ldyBDb250ZW50QmxvY2soKTsKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+cmVnaXN0ZXJQdXNoZWRCbG9jaygkaW5jbHVkZSwgJHMpOwogICAgICAgICAgICAgICAgICAgICRpbmNsdWRlLT5jaGlsZCA9ICRjaGlsZDsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmFwcGVuZCgkY2hpbGQsICRzKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHRoaXMtPnNlZWsoJHMpOwoKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJHRoaXMtPmxpdGVyYWwoJ0BzY3NzcGhwLWltcG9ydC1vbmNlJywgMjApICYmCiAgICAgICAgICAgICAgICAkdGhpcy0+dmFsdWVMaXN0KCRpbXBvcnRQYXRoKSAmJgogICAgICAgICAgICAgICAgJHRoaXMtPmVuZCgpCiAgICAgICAgICAgICkgewogICAgICAgICAgICAgICAgISAkdGhpcy0+Y3NzT25seSB8fCAkdGhpcy0+YXNzZXJ0UGxhaW5Dc3NWYWxpZChmYWxzZSwgJHMpOwoKICAgICAgICAgICAgICAgIGxpc3QoJGxpbmUsICRjb2x1bW4pID0gJHRoaXMtPmdldFNvdXJjZVBvc2l0aW9uKCRzKTsKICAgICAgICAgICAgICAgICRmaWxlID0gJHRoaXMtPnNvdXJjZU5hbWU7CiAgICAgICAgICAgICAgICAkdGhpcy0+bG9nZ2VyLT53YXJuKCJUaGUgXCJAc2Nzc3BocC1pbXBvcnQtb25jZVwiIGRpcmVjdGl2ZSBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gU2Nzc1BocCAyLjAsIGluIFwiJGZpbGVcIiwgbGluZSAkbGluZSwgY29sdW1uICRjb2x1bW4uIiwgdHJ1ZSk7CgogICAgICAgICAgICAgICAgJHRoaXMtPmFwcGVuZChbVHlwZTo6VF9TQ1NTUEhQX0lNUE9SVF9PTkNFLCAkaW1wb3J0UGF0aF0sICRzKTsKCiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHRoaXMtPnNlZWsoJHMpOwoKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJHRoaXMtPmxpdGVyYWwoJ0BpbXBvcnQnLCA3KSAmJgogICAgICAgICAgICAgICAgJHRoaXMtPnZhbHVlTGlzdCgkaW1wb3J0UGF0aCkgJiYKICAgICAgICAgICAgICAgICRpbXBvcnRQYXRoWzBdICE9PSBUeXBlOjpUX0ZVTkNUSU9OX0NBTEwgJiYKICAgICAgICAgICAgICAgICR0aGlzLT5lbmQoKQogICAgICAgICAgICApIHsKICAgICAgICAgICAgICAgIGlmICgkdGhpcy0+Y3NzT25seSkgewogICAgICAgICAgICAgICAgICAgICR0aGlzLT5hc3NlcnRQbGFpbkNzc1ZhbGlkKFtUeXBlOjpUX0lNUE9SVCwgJGltcG9ydFBhdGhdLCAkcyk7CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmFwcGVuZChbVHlwZTo6VF9DT01NRU5ULCBydHJpbShzdWJzdHIoJHRoaXMtPmJ1ZmZlciwgJHMsICR0aGlzLT5jb3VudCAtICRzKSldKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkdGhpcy0+YXBwZW5kKFtUeXBlOjpUX0lNUE9SVCwgJGltcG9ydFBhdGhdLCAkcyk7CgogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICR0aGlzLT5zZWVrKCRzKTsKCiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICR0aGlzLT5saXRlcmFsKCdAaW1wb3J0JywgNykgJiYKICAgICAgICAgICAgICAgICR0aGlzLT51cmwoJGltcG9ydFBhdGgpICYmCiAgICAgICAgICAgICAgICAkdGhpcy0+ZW5kKCkKICAgICAgICAgICAgKSB7CiAgICAgICAgICAgICAgICBpZiAoJHRoaXMtPmNzc09ubHkpIHsKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+YXNzZXJ0UGxhaW5Dc3NWYWxpZChbVHlwZTo6VF9JTVBPUlQsICRpbXBvcnRQYXRoXSwgJHMpOwogICAgICAgICAgICAgICAgICAgICR0aGlzLT5hcHBlbmQoW1R5cGU6OlRfQ09NTUVOVCwgcnRyaW0oc3Vic3RyKCR0aGlzLT5idWZmZXIsICRzLCAkdGhpcy0+Y291bnQgLSAkcykpXSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJHRoaXMtPmFwcGVuZChbVHlwZTo6VF9JTVBPUlQsICRpbXBvcnRQYXRoXSwgJHMpOwoKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkdGhpcy0+c2Vlaygkcyk7CgogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAkdGhpcy0+bGl0ZXJhbCgnQGV4dGVuZCcsIDcpICYmCiAgICAgICAgICAgICAgICAkdGhpcy0+c2VsZWN0b3JzKCRzZWxlY3RvcnMpICYmCiAgICAgICAgICAgICAgICAkdGhpcy0+ZW5kKCkKICAgICAgICAgICAgKSB7CiAgICAgICAgICAgICAgICAhICR0aGlzLT5jc3NPbmx5IHx8ICR0aGlzLT5hc3NlcnRQbGFpbkNzc1ZhbGlkKGZhbHNlLCAkcyk7CgogICAgICAgICAgICAgICAgLy8gY2hlY2sgZm9yICchZmxhZycKICAgICAgICAgICAgICAgICRvcHRpb25hbCA9ICR0aGlzLT5zdHJpcE9wdGlvbmFsRmxhZygkc2VsZWN0b3JzKTsKICAgICAgICAgICAgICAgICR0aGlzLT5hcHBlbmQoW1R5cGU6OlRfRVhURU5ELCAkc2VsZWN0b3JzLCAkb3B0aW9uYWxdLCAkcyk7CgogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICR0aGlzLT5zZWVrKCRzKTsKCiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICR0aGlzLT5saXRlcmFsKCdAZnVuY3Rpb24nLCA5KSAmJgogICAgICAgICAgICAgICAgJHRoaXMtPmtleXdvcmQoJGZuTmFtZSkgJiYKICAgICAgICAgICAgICAgICR0aGlzLT5hcmd1bWVudERlZigkYXJncykgJiYKICAgICAgICAgICAgICAgICR0aGlzLT5tYXRjaENoYXIoJ3snLCBmYWxzZSkKICAgICAgICAgICAgKSB7CiAgICAgICAgICAgICAgICAhICR0aGlzLT5jc3NPbmx5IHx8ICR0aGlzLT5hc3NlcnRQbGFpbkNzc1ZhbGlkKGZhbHNlLCAkcyk7CgogICAgICAgICAgICAgICAgJGZ1bmMgPSBuZXcgQ2FsbGFibGVCbG9jayhUeXBlOjpUX0ZVTkNUSU9OKTsKICAgICAgICAgICAgICAgICR0aGlzLT5yZWdpc3RlclB1c2hlZEJsb2NrKCRmdW5jLCAkcyk7CiAgICAgICAgICAgICAgICAkZnVuYy0+bmFtZSA9ICRmbk5hbWU7CiAgICAgICAgICAgICAgICAkZnVuYy0+YXJncyA9ICRhcmdzOwoKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkdGhpcy0+c2Vlaygkcyk7CgogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAkdGhpcy0+bGl0ZXJhbCgnQHJldHVybicsIDcpICYmCiAgICAgICAgICAgICAgICAoJHRoaXMtPnZhbHVlTGlzdCgkcmV0VmFsKSB8fCB0cnVlKSAmJgogICAgICAgICAgICAgICAgJHRoaXMtPmVuZCgpCiAgICAgICAgICAgICkgewogICAgICAgICAgICAgICAgISAkdGhpcy0+Y3NzT25seSB8fCAkdGhpcy0+YXNzZXJ0UGxhaW5Dc3NWYWxpZChmYWxzZSwgJHMpOwoKICAgICAgICAgICAgICAgICR0aGlzLT5hcHBlbmQoW1R5cGU6OlRfUkVUVVJOLCBpc3NldCgkcmV0VmFsKSA/ICRyZXRWYWwgOiBbVHlwZTo6VF9OVUxMXV0sICRzKTsKCiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHRoaXMtPnNlZWsoJHMpOwoKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJHRoaXMtPmxpdGVyYWwoJ0BlYWNoJywgNSkgJiYKICAgICAgICAgICAgICAgICR0aGlzLT5nZW5lcmljTGlzdCgkdmFyTmFtZXMsICd2YXJpYWJsZScsICcsJywgZmFsc2UpICYmCiAgICAgICAgICAgICAgICAkdGhpcy0+bGl0ZXJhbCgnaW4nLCAyKSAmJgogICAgICAgICAgICAgICAgJHRoaXMtPnZhbHVlTGlzdCgkbGlzdCkgJiYKICAgICAgICAgICAgICAgICR0aGlzLT5tYXRjaENoYXIoJ3snLCBmYWxzZSkKICAgICAgICAgICAgKSB7CiAgICAgICAgICAgICAgICAhICR0aGlzLT5jc3NPbmx5IHx8ICR0aGlzLT5hc3NlcnRQbGFpbkNzc1ZhbGlkKGZhbHNlLCAkcyk7CgogICAgICAgICAgICAgICAgJGVhY2ggPSBuZXcgRWFjaEJsb2NrKCk7CiAgICAgICAgICAgICAgICAkdGhpcy0+cmVnaXN0ZXJQdXNoZWRCbG9jaygkZWFjaCwgJHMpOwoKICAgICAgICAgICAgICAgIGZvcmVhY2ggKCR2YXJOYW1lc1syXSBhcyAkdmFyTmFtZSkgewogICAgICAgICAgICAgICAgICAgICRlYWNoLT52YXJzW10gPSAkdmFyTmFtZVsxXTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkZWFjaC0+bGlzdCA9ICRsaXN0OwoKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkdGhpcy0+c2Vlaygkcyk7CgogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAkdGhpcy0+bGl0ZXJhbCgnQHdoaWxlJywgNikgJiYKICAgICAgICAgICAgICAgICR0aGlzLT5leHByZXNzaW9uKCRjb25kKSAmJgogICAgICAgICAgICAgICAgJHRoaXMtPm1hdGNoQ2hhcigneycsIGZhbHNlKQogICAgICAgICAgICApIHsKICAgICAgICAgICAgICAgICEgJHRoaXMtPmNzc09ubHkgfHwgJHRoaXMtPmFzc2VydFBsYWluQ3NzVmFsaWQoZmFsc2UsICRzKTsKCiAgICAgICAgICAgICAgICB3aGlsZSAoCiAgICAgICAgICAgICAgICAgICAgJGNvbmRbMF0gPT09IFR5cGU6OlRfTElTVCAmJgogICAgICAgICAgICAgICAgICAgICEgZW1wdHkoJGNvbmRbJ2VuY2xvc2luZyddKSAmJgogICAgICAgICAgICAgICAgICAgICRjb25kWydlbmNsb3NpbmcnXSA9PT0gJ3BhcmVudCcgJiYKICAgICAgICAgICAgICAgICAgICBcY291bnQoJGNvbmRbMl0pID09IDEKICAgICAgICAgICAgICAgICkgewogICAgICAgICAgICAgICAgICAgICRjb25kID0gcmVzZXQoJGNvbmRbMl0pOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICR3aGlsZSA9IG5ldyBXaGlsZUJsb2NrKCk7CiAgICAgICAgICAgICAgICAkdGhpcy0+cmVnaXN0ZXJQdXNoZWRCbG9jaygkd2hpbGUsICRzKTsKICAgICAgICAgICAgICAgICR3aGlsZS0+Y29uZCA9ICRjb25kOwoKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkdGhpcy0+c2Vlaygkcyk7CgogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAkdGhpcy0+bGl0ZXJhbCgnQGZvcicsIDQpICYmCiAgICAgICAgICAgICAgICAkdGhpcy0+dmFyaWFibGUoJHZhck5hbWUpICYmCiAgICAgICAgICAgICAgICAkdGhpcy0+bGl0ZXJhbCgnZnJvbScsIDQpICYmCiAgICAgICAgICAgICAgICAkdGhpcy0+ZXhwcmVzc2lvbigkc3RhcnQpICYmCiAgICAgICAgICAgICAgICAoJHRoaXMtPmxpdGVyYWwoJ3Rocm91Z2gnLCA3KSB8fAogICAgICAgICAgICAgICAgICAgICgkZm9yVW50aWwgPSB0cnVlICYmICR0aGlzLT5saXRlcmFsKCd0bycsIDIpKSkgJiYKICAgICAgICAgICAgICAgICR0aGlzLT5leHByZXNzaW9uKCRlbmQpICYmCiAgICAgICAgICAgICAgICAkdGhpcy0+bWF0Y2hDaGFyKCd7JywgZmFsc2UpCiAgICAgICAgICAgICkgewogICAgICAgICAgICAgICAgISAkdGhpcy0+Y3NzT25seSB8fCAkdGhpcy0+YXNzZXJ0UGxhaW5Dc3NWYWxpZChmYWxzZSwgJHMpOwoKICAgICAgICAgICAgICAgICRmb3IgPSBuZXcgRm9yQmxvY2soKTsKICAgICAgICAgICAgICAgICR0aGlzLT5yZWdpc3RlclB1c2hlZEJsb2NrKCRmb3IsICRzKTsKICAgICAgICAgICAgICAgICRmb3ItPnZhciAgID0gJHZhck5hbWVbMV07CiAgICAgICAgICAgICAgICAkZm9yLT5zdGFydCA9ICRzdGFydDsKICAgICAgICAgICAgICAgICRmb3ItPmVuZCAgID0gJGVuZDsKICAgICAgICAgICAgICAgICRmb3ItPnVudGlsID0gaXNzZXQoJGZvclVudGlsKTsKCiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHRoaXMtPnNlZWsoJHMpOwoKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJHRoaXMtPmxpdGVyYWwoJ0BpZicsIDMpICYmCiAgICAgICAgICAgICAgICAkdGhpcy0+ZnVuY3Rpb25DYWxsQXJndW1lbnRzTGlzdCgkY29uZCwgZmFsc2UsICd7JywgZmFsc2UpCiAgICAgICAgICAgICkgewogICAgICAgICAgICAgICAgISAkdGhpcy0+Y3NzT25seSB8fCAkdGhpcy0+YXNzZXJ0UGxhaW5Dc3NWYWxpZChmYWxzZSwgJHMpOwoKICAgICAgICAgICAgICAgICRpZiA9IG5ldyBJZkJsb2NrKCk7CiAgICAgICAgICAgICAgICAkdGhpcy0+cmVnaXN0ZXJQdXNoZWRCbG9jaygkaWYsICRzKTsKCiAgICAgICAgICAgICAgICB3aGlsZSAoCiAgICAgICAgICAgICAgICAgICAgJGNvbmRbMF0gPT09IFR5cGU6OlRfTElTVCAmJgogICAgICAgICAgICAgICAgICAgICEgZW1wdHkoJGNvbmRbJ2VuY2xvc2luZyddKSAmJgogICAgICAgICAgICAgICAgICAgICRjb25kWydlbmNsb3NpbmcnXSA9PT0gJ3BhcmVudCcgJiYKICAgICAgICAgICAgICAgICAgICBcY291bnQoJGNvbmRbMl0pID09IDEKICAgICAgICAgICAgICAgICkgewogICAgICAgICAgICAgICAgICAgICRjb25kID0gcmVzZXQoJGNvbmRbMl0pOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRpZi0+Y29uZCAgPSAkY29uZDsKICAgICAgICAgICAgICAgICRpZi0+Y2FzZXMgPSBbXTsKCiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHRoaXMtPnNlZWsoJHMpOwoKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJHRoaXMtPmxpdGVyYWwoJ0BkZWJ1ZycsIDYpICYmCiAgICAgICAgICAgICAgICAkdGhpcy0+ZnVuY3Rpb25DYWxsQXJndW1lbnRzTGlzdCgkdmFsdWUsIGZhbHNlKQogICAgICAgICAgICApIHsKICAgICAgICAgICAgICAgICEgJHRoaXMtPmNzc09ubHkgfHwgJHRoaXMtPmFzc2VydFBsYWluQ3NzVmFsaWQoZmFsc2UsICRzKTsKCiAgICAgICAgICAgICAgICAkdGhpcy0+YXBwZW5kKFtUeXBlOjpUX0RFQlVHLCAkdmFsdWVdLCAkcyk7CgogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICR0aGlzLT5zZWVrKCRzKTsKCiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICR0aGlzLT5saXRlcmFsKCdAd2FybicsIDUpICYmCiAgICAgICAgICAgICAgICAkdGhpcy0+ZnVuY3Rpb25DYWxsQXJndW1lbnRzTGlzdCgkdmFsdWUsIGZhbHNlKQogICAgICAgICAgICApIHsKICAgICAgICAgICAgICAgICEgJHRoaXMtPmNzc09ubHkgfHwgJHRoaXMtPmFzc2VydFBsYWluQ3NzVmFsaWQoZmFsc2UsICRzKTsKCiAgICAgICAgICAgICAgICAkdGhpcy0+YXBwZW5kKFtUeXBlOjpUX1dBUk4sICR2YWx1ZV0sICRzKTsKCiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHRoaXMtPnNlZWsoJHMpOwoKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJHRoaXMtPmxpdGVyYWwoJ0BlcnJvcicsIDYpICYmCiAgICAgICAgICAgICAgICAkdGhpcy0+ZnVuY3Rpb25DYWxsQXJndW1lbnRzTGlzdCgkdmFsdWUsIGZhbHNlKQogICAgICAgICAgICApIHsKICAgICAgICAgICAgICAgICEgJHRoaXMtPmNzc09ubHkgfHwgJHRoaXMtPmFzc2VydFBsYWluQ3NzVmFsaWQoZmFsc2UsICRzKTsKCiAgICAgICAgICAgICAgICAkdGhpcy0+YXBwZW5kKFtUeXBlOjpUX0VSUk9SLCAkdmFsdWVdLCAkcyk7CgogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICR0aGlzLT5zZWVrKCRzKTsKCiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICR0aGlzLT5saXRlcmFsKCdAY29udGVudCcsIDgpICYmCiAgICAgICAgICAgICAgICAoJHRoaXMtPmVuZCgpIHx8CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPm1hdGNoQ2hhcignKCcpICYmCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmFyZ1ZhbHVlcygkYXJnQ29udGVudCkgJiYKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+bWF0Y2hDaGFyKCcpJykgJiYKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+ZW5kKCkpCiAgICAgICAgICAgICkgewogICAgICAgICAgICAgICAgISAkdGhpcy0+Y3NzT25seSB8fCAkdGhpcy0+YXNzZXJ0UGxhaW5Dc3NWYWxpZChmYWxzZSwgJHMpOwoKICAgICAgICAgICAgICAgICR0aGlzLT5hcHBlbmQoW1R5cGU6OlRfTUlYSU5fQ09OVEVOVCwgaXNzZXQoJGFyZ0NvbnRlbnQpID8gJGFyZ0NvbnRlbnQgOiBudWxsXSwgJHMpOwoKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkdGhpcy0+c2Vlaygkcyk7CgogICAgICAgICAgICAkbGFzdCA9ICR0aGlzLT5sYXN0KCk7CgogICAgICAgICAgICBpZiAoaXNzZXQoJGxhc3QpICYmICRsYXN0WzBdID09PSBUeXBlOjpUX0lGKSB7CiAgICAgICAgICAgICAgICBsaXN0KCwgJGlmKSA9ICRsYXN0OwogICAgICAgICAgICAgICAgYXNzZXJ0KCRpZiBpbnN0YW5jZW9mIElmQmxvY2spOwoKICAgICAgICAgICAgICAgIGlmICgkdGhpcy0+bGl0ZXJhbCgnQGVsc2UnLCA1KSkgewogICAgICAgICAgICAgICAgICAgIGlmICgkdGhpcy0+bWF0Y2hDaGFyKCd7JywgZmFsc2UpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRlbHNlID0gbmV3IEVsc2VCbG9jaygpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZWlmICgKICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmxpdGVyYWwoJ2lmJywgMikgJiYKICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmZ1bmN0aW9uQ2FsbEFyZ3VtZW50c0xpc3QoJGNvbmQsIGZhbHNlLCAneycsIGZhbHNlKQogICAgICAgICAgICAgICAgICAgICkgewogICAgICAgICAgICAgICAgICAgICAgICAkZWxzZSA9IG5ldyBFbHNlaWZCbG9jaygpOwogICAgICAgICAgICAgICAgICAgICAgICAkZWxzZS0+Y29uZCA9ICRjb25kOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKGlzc2V0KCRlbHNlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+cmVnaXN0ZXJQdXNoZWRCbG9jaygkZWxzZSwgJHMpOwogICAgICAgICAgICAgICAgICAgICAgICAkaWYtPmNhc2VzW10gPSAkZWxzZTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkdGhpcy0+c2Vlaygkcyk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIG9ubHkgcmV0YWluIHRoZSBmaXJzdCBAY2hhcnNldCBkaXJlY3RpdmUgZW5jb3VudGVyZWQKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJHRoaXMtPmxpdGVyYWwoJ0BjaGFyc2V0JywgOCkgJiYKICAgICAgICAgICAgICAgICR0aGlzLT52YWx1ZUxpc3QoJGNoYXJzZXQpICYmCiAgICAgICAgICAgICAgICAkdGhpcy0+ZW5kKCkKICAgICAgICAgICAgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHRoaXMtPnNlZWsoJHMpOwoKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJHRoaXMtPmxpdGVyYWwoJ0BzdXBwb3J0cycsIDkpICYmCiAgICAgICAgICAgICAgICAoJHQxID0gJHRoaXMtPnN1cHBvcnRzUXVlcnkoJHN1cHBvcnRRdWVyeSkpICYmCiAgICAgICAgICAgICAgICAoJHQyID0gJHRoaXMtPm1hdGNoQ2hhcigneycsIGZhbHNlKSkKICAgICAgICAgICAgKSB7CiAgICAgICAgICAgICAgICAkZGlyZWN0aXZlID0gbmV3IERpcmVjdGl2ZUJsb2NrKCk7CiAgICAgICAgICAgICAgICAkdGhpcy0+cmVnaXN0ZXJQdXNoZWRCbG9jaygkZGlyZWN0aXZlLCAkcyk7CiAgICAgICAgICAgICAgICAkZGlyZWN0aXZlLT5uYW1lICA9ICdzdXBwb3J0cyc7CiAgICAgICAgICAgICAgICAkZGlyZWN0aXZlLT52YWx1ZSA9ICRzdXBwb3J0UXVlcnk7CgogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICR0aGlzLT5zZWVrKCRzKTsKCiAgICAgICAgICAgIC8vIGRvZXNuJ3QgbWF0Y2ggYnVpbHQgaW4gZGlyZWN0aXZlLCBkbyBnZW5lcmljIG9uZQogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAkdGhpcy0+bWF0Y2hDaGFyKCdAJywgZmFsc2UpICYmCiAgICAgICAgICAgICAgICAkdGhpcy0+bWl4ZWRLZXl3b3JkKCRkaXJOYW1lKSAmJgogICAgICAgICAgICAgICAgJHRoaXMtPmRpcmVjdGl2ZVZhbHVlKCRkaXJWYWx1ZSwgJ3snKQogICAgICAgICAgICApIHsKICAgICAgICAgICAgICAgIGlmIChjb3VudCgkZGlyTmFtZSkgPT09IDEgJiYgaXNfc3RyaW5nKHJlc2V0KCRkaXJOYW1lKSkpIHsKICAgICAgICAgICAgICAgICAgICAkZGlyTmFtZSA9IHJlc2V0KCRkaXJOYW1lKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJGRpck5hbWUgPSBbVHlwZTo6VF9TVFJJTkcsICcnLCAkZGlyTmFtZV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoJGRpck5hbWUgPT09ICdtZWRpYScpIHsKICAgICAgICAgICAgICAgICAgICAkZGlyZWN0aXZlID0gbmV3IE1lZGlhQmxvY2soKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJGRpcmVjdGl2ZSA9IG5ldyBEaXJlY3RpdmVCbG9jaygpOwogICAgICAgICAgICAgICAgICAgICRkaXJlY3RpdmUtPm5hbWUgPSAkZGlyTmFtZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICR0aGlzLT5yZWdpc3RlclB1c2hlZEJsb2NrKCRkaXJlY3RpdmUsICRzKTsKCiAgICAgICAgICAgICAgICBpZiAoaXNzZXQoJGRpclZhbHVlKSkgewogICAgICAgICAgICAgICAgICAgICEgJHRoaXMtPmNzc09ubHkgfHwgKCRkaXJWYWx1ZSA9ICR0aGlzLT5hc3NlcnRQbGFpbkNzc1ZhbGlkKCRkaXJWYWx1ZSkpOwogICAgICAgICAgICAgICAgICAgICRkaXJlY3RpdmUtPnZhbHVlID0gJGRpclZhbHVlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkdGhpcy0+c2Vlaygkcyk7CgogICAgICAgICAgICAvLyBtYXliZSBpdCdzIGEgZ2VuZXJpYyBibG9ja2xlc3MgZGlyZWN0aXZlCiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICR0aGlzLT5tYXRjaENoYXIoJ0AnLCBmYWxzZSkgJiYKICAgICAgICAgICAgICAgICR0aGlzLT5taXhlZEtleXdvcmQoJGRpck5hbWUpICYmCiAgICAgICAgICAgICAgICAhICR0aGlzLT5pc0tub3duR2VuZXJpY0RpcmVjdGl2ZSgkZGlyTmFtZSkgJiYKICAgICAgICAgICAgICAgICgkdGhpcy0+ZW5kKGZhbHNlKSB8fCAoJHRoaXMtPmRpcmVjdGl2ZVZhbHVlKCRkaXJWYWx1ZSwgJycpICYmICR0aGlzLT5lbmQoZmFsc2UpKSkKICAgICAgICAgICAgKSB7CiAgICAgICAgICAgICAgICBpZiAoXGNvdW50KCRkaXJOYW1lKSA9PT0gMSAmJiBcaXNfc3RyaW5nKFxyZXNldCgkZGlyTmFtZSkpKSB7CiAgICAgICAgICAgICAgICAgICAgJGRpck5hbWUgPSBccmVzZXQoJGRpck5hbWUpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkZGlyTmFtZSA9IFtUeXBlOjpUX1NUUklORywgJycsICRkaXJOYW1lXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAhIGVtcHR5KCR0aGlzLT5lbnYtPnBhcmVudCkgJiYKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+ZW52LT50eXBlICYmCiAgICAgICAgICAgICAgICAgICAgISBcaW5fYXJyYXkoJHRoaXMtPmVudi0+dHlwZSwgW1R5cGU6OlRfRElSRUNUSVZFLCBUeXBlOjpUX01FRElBXSkKICAgICAgICAgICAgICAgICkgewogICAgICAgICAgICAgICAgICAgICRwbGFpbiA9IFx0cmltKFxzdWJzdHIoJHRoaXMtPmJ1ZmZlciwgJHMsICR0aGlzLT5jb3VudCAtICRzKSk7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgJHRoaXMtPnBhcnNlRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgICAgICJVbmtub3duIGRpcmVjdGl2ZSBgeyRwbGFpbn1gIG5vdCBhbGxvd2VkIGluIGAiIC4gJHRoaXMtPmVudi0+dHlwZSAuICJgIGJsb2NrIgogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvLyBibG9ja2xlc3MgZGlyZWN0aXZlcyB3aXRoIGEgYmxhbmsgbGluZSBhZnRlciBrZWVwcyB0aGVpciBibGFuayBsaW5lcyBhZnRlcgogICAgICAgICAgICAgICAgLy8gc2Fzcy1zcGVjIGNvbXBsaWFuY2UgcHVycG9zZQogICAgICAgICAgICAgICAgJHMgPSAkdGhpcy0+Y291bnQ7CiAgICAgICAgICAgICAgICAkaGFzQmxhbmtMaW5lID0gZmFsc2U7CiAgICAgICAgICAgICAgICBpZiAoJHRoaXMtPm1hdGNoKCdccyo/XG5ccypcbicsICRvdXQsIGZhbHNlKSkgewogICAgICAgICAgICAgICAgICAgICRoYXNCbGFua0xpbmUgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICR0aGlzLT5zZWVrKCRzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRpc05vdFJvb3QgPSAhIGVtcHR5KCR0aGlzLT5lbnYtPnBhcmVudCk7CiAgICAgICAgICAgICAgICAkdGhpcy0+YXBwZW5kKFtUeXBlOjpUX0RJUkVDVElWRSwgWyRkaXJOYW1lLCAkZGlyVmFsdWUsICRoYXNCbGFua0xpbmUsICRpc05vdFJvb3RdXSwgJHMpOwogICAgICAgICAgICAgICAgJHRoaXMtPndoaXRlc3BhY2UoKTsKCiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHRoaXMtPnNlZWsoJHMpOwoKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgJGluQ3NzU2VsZWN0b3IgPSBudWxsOwogICAgICAgIGlmICgkdGhpcy0+Y3NzT25seSkgewogICAgICAgICAgICAkaW5Dc3NTZWxlY3RvciA9ICghIGVtcHR5KCR0aGlzLT5lbnYtPnBhcmVudCkgJiYKICAgICAgICAgICAgICAgICEgaW5fYXJyYXkoJHRoaXMtPmVudi0+dHlwZSwgW1R5cGU6OlRfRElSRUNUSVZFLCBUeXBlOjpUX01FRElBXSkpOwogICAgICAgIH0KICAgICAgICAvLyBjdXN0b20gcHJvcGVydGllcyA6IHJpZ2h0IHBhcnQgaXMgc3RhdGljCiAgICAgICAgaWYgKCgkdGhpcy0+Y3VzdG9tUHJvcGVydHkoJG5hbWUpICkgJiYgJHRoaXMtPm1hdGNoQ2hhcignOicsIGZhbHNlKSkgewogICAgICAgICAgICAkc3RhcnQgPSAkdGhpcy0+Y291bnQ7CgogICAgICAgICAgICAvLyBidXQgY2FuIGJlIGNvbXBsZXggYW5kIGZpbmlzaCB3aXRoIDsgb3IgfQogICAgICAgICAgICBmb3JlYWNoIChbJzsnLCd9J10gYXMgJGVuZGluZykgewogICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICR0aGlzLT5vcGVuU3RyaW5nKCRlbmRpbmcsICRzdHJpbmdWYWx1ZSwgJygnLCAnKScsIGZhbHNlKSAmJgogICAgICAgICAgICAgICAgICAgICR0aGlzLT5lbmQoKQogICAgICAgICAgICAgICAgKSB7CiAgICAgICAgICAgICAgICAgICAgJGVuZCA9ICR0aGlzLT5jb3VudDsKICAgICAgICAgICAgICAgICAgICAkdmFsdWUgPSAkc3RyaW5nVmFsdWU7CgogICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlmIHdlIGhhdmUgb25seSBhIHBhcnRpYWwgdmFsdWUgZHVlIHRvIG5lc3RlZCBbXSBvciB7IH0gdG8gdGFrZSBpbiBhY2NvdW50CiAgICAgICAgICAgICAgICAgICAgJG5lc3RpbmdQYWlycyA9IFtbJ1snLCAnXSddLCBbJ3snLCAnfSddXTsKCiAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAoJG5lc3RpbmdQYWlycyBhcyAkbmVzdGluZ1BhaXIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJHAgPSBzdHJwb3MoJHRoaXMtPmJ1ZmZlciwgJG5lc3RpbmdQYWlyWzBdLCAkc3RhcnQpOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRwICYmICRwIDwgJGVuZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnNlZWsoJHN0YXJ0KTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPm9wZW5TdHJpbmcoJGVuZGluZywgJHN0cmluZ1ZhbHVlLCAkbmVzdGluZ1BhaXJbMF0sICRuZXN0aW5nUGFpclsxXSwgZmFsc2UpICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmVuZCgpICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmNvdW50ID4gJGVuZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGVuZCA9ICR0aGlzLT5jb3VudDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdmFsdWUgPSAkc3RyaW5nVmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICR0aGlzLT5zZWVrKCRlbmQpOwogICAgICAgICAgICAgICAgICAgICR0aGlzLT5hcHBlbmQoW1R5cGU6OlRfQ1VTVE9NX1BST1BFUlRZLCAkbmFtZSwgJHZhbHVlXSwgJHMpOwoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gVE9ETzogb3V0cHV0IGFuIGVycm9yIGhlcmUgaWYgbm90aGluZyBmb3VuZCBhY2NvcmRpbmcgdG8gc2FzcyBzcGVjCiAgICAgICAgfQoKICAgICAgICAkdGhpcy0+c2Vlaygkcyk7CgogICAgICAgIC8vIHByb3BlcnR5IHNob3J0Y3V0CiAgICAgICAgLy8gY2FwdHVyZXMgbW9zdCBwcm9wZXJ0aWVzIGJlZm9yZSBoYXZpbmcgdG8gcGFyc2UgYSBzZWxlY3RvcgogICAgICAgIGlmICgKICAgICAgICAgICAgJHRoaXMtPmtleXdvcmQoJG5hbWUsIGZhbHNlKSAmJgogICAgICAgICAgICAkdGhpcy0+bGl0ZXJhbCgnOiAnLCAyKSAmJgogICAgICAgICAgICAkdGhpcy0+dmFsdWVMaXN0KCR2YWx1ZSkgJiYKICAgICAgICAgICAgJHRoaXMtPmVuZCgpCiAgICAgICAgKSB7CiAgICAgICAgICAgICRuYW1lID0gW1R5cGU6OlRfU1RSSU5HLCAnJywgWyRuYW1lXV07CiAgICAgICAgICAgICR0aGlzLT5hcHBlbmQoW1R5cGU6OlRfQVNTSUdOLCAkbmFtZSwgJHZhbHVlXSwgJHMpOwoKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQoKICAgICAgICAkdGhpcy0+c2Vlaygkcyk7CgogICAgICAgIC8vIHZhcmlhYmxlIGFzc2lnbnMKICAgICAgICBpZiAoCiAgICAgICAgICAgICR0aGlzLT52YXJpYWJsZSgkbmFtZSkgJiYKICAgICAgICAgICAgJHRoaXMtPm1hdGNoQ2hhcignOicpICYmCiAgICAgICAgICAgICR0aGlzLT52YWx1ZUxpc3QoJHZhbHVlKSAmJgogICAgICAgICAgICAkdGhpcy0+ZW5kKCkKICAgICAgICApIHsKICAgICAgICAgICAgISAkdGhpcy0+Y3NzT25seSB8fCAkdGhpcy0+YXNzZXJ0UGxhaW5Dc3NWYWxpZChmYWxzZSwgJHMpOwoKICAgICAgICAgICAgLy8gY2hlY2sgZm9yICchZmxhZycKICAgICAgICAgICAgJGFzc2lnbm1lbnRGbGFncyA9ICR0aGlzLT5zdHJpcEFzc2lnbm1lbnRGbGFncygkdmFsdWUpOwogICAgICAgICAgICAkdGhpcy0+YXBwZW5kKFtUeXBlOjpUX0FTU0lHTiwgJG5hbWUsICR2YWx1ZSwgJGFzc2lnbm1lbnRGbGFnc10sICRzKTsKCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KCiAgICAgICAgJHRoaXMtPnNlZWsoJHMpOwoKICAgICAgICAvLyBvcGVuaW5nIGNzcyBibG9jawogICAgICAgIGlmICgKICAgICAgICAgICAgJHRoaXMtPnNlbGVjdG9ycygkc2VsZWN0b3JzKSAmJgogICAgICAgICAgICAkdGhpcy0+bWF0Y2hDaGFyKCd7JywgZmFsc2UpCiAgICAgICAgKSB7CiAgICAgICAgICAgICEgJHRoaXMtPmNzc09ubHkgfHwgISAkaW5Dc3NTZWxlY3RvciB8fCAkdGhpcy0+YXNzZXJ0UGxhaW5Dc3NWYWxpZChmYWxzZSk7CgogICAgICAgICAgICAkdGhpcy0+cHVzaEJsb2NrKCRzZWxlY3RvcnMsICRzKTsKCiAgICAgICAgICAgIGlmICgkdGhpcy0+ZWF0V2hpdGVEZWZhdWx0KSB7CiAgICAgICAgICAgICAgICAkdGhpcy0+d2hpdGVzcGFjZSgpOwogICAgICAgICAgICAgICAgJHRoaXMtPmFwcGVuZChudWxsKTsgLy8gY29sbGVjdCBjb21tZW50cyBhdCB0aGUgYmVnaW5uaW5nIGlmIG5lZWRlZAogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CgogICAgICAgICR0aGlzLT5zZWVrKCRzKTsKCiAgICAgICAgLy8gcHJvcGVydHkgYXNzaWduLCBvciBuZXN0ZWQgYXNzaWduCiAgICAgICAgaWYgKAogICAgICAgICAgICAkdGhpcy0+cHJvcGVydHlOYW1lKCRuYW1lKSAmJgogICAgICAgICAgICAkdGhpcy0+bWF0Y2hDaGFyKCc6JykKICAgICAgICApIHsKICAgICAgICAgICAgJGZvdW5kU29tZXRoaW5nID0gZmFsc2U7CgogICAgICAgICAgICBpZiAoJHRoaXMtPnZhbHVlTGlzdCgkdmFsdWUpKSB7CiAgICAgICAgICAgICAgICBpZiAoZW1wdHkoJHRoaXMtPmVudi0+cGFyZW50KSkgewogICAgICAgICAgICAgICAgICAgIHRocm93ICR0aGlzLT5wYXJzZUVycm9yKCdleHBlY3RlZCAieyInKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkdGhpcy0+YXBwZW5kKFtUeXBlOjpUX0FTU0lHTiwgJG5hbWUsICR2YWx1ZV0sICRzKTsKICAgICAgICAgICAgICAgICRmb3VuZFNvbWV0aGluZyA9IHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICgkdGhpcy0+bWF0Y2hDaGFyKCd7JywgZmFsc2UpKSB7CiAgICAgICAgICAgICAgICAhICR0aGlzLT5jc3NPbmx5IHx8ICR0aGlzLT5hc3NlcnRQbGFpbkNzc1ZhbGlkKGZhbHNlKTsKCiAgICAgICAgICAgICAgICAkcHJvcEJsb2NrID0gbmV3IE5lc3RlZFByb3BlcnR5QmxvY2soKTsKICAgICAgICAgICAgICAgICR0aGlzLT5yZWdpc3RlclB1c2hlZEJsb2NrKCRwcm9wQmxvY2ssICRzKTsKICAgICAgICAgICAgICAgICRwcm9wQmxvY2stPnByZWZpeCA9ICRuYW1lOwogICAgICAgICAgICAgICAgJHByb3BCbG9jay0+aGFzVmFsdWUgPSAkZm91bmRTb21ldGhpbmc7CgogICAgICAgICAgICAgICAgJGZvdW5kU29tZXRoaW5nID0gdHJ1ZTsKICAgICAgICAgICAgfSBlbHNlaWYgKCRmb3VuZFNvbWV0aGluZykgewogICAgICAgICAgICAgICAgJGZvdW5kU29tZXRoaW5nID0gJHRoaXMtPmVuZCgpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoJGZvdW5kU29tZXRoaW5nKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJHRoaXMtPnNlZWsoJHMpOwoKICAgICAgICAvLyBjbG9zaW5nIGEgYmxvY2sKICAgICAgICBpZiAoJHRoaXMtPm1hdGNoQ2hhcignfScsIGZhbHNlKSkgewogICAgICAgICAgICAkYmxvY2sgPSAkdGhpcy0+cG9wQmxvY2soKTsKCiAgICAgICAgICAgIGlmICghIGlzc2V0KCRibG9jay0+dHlwZSkgfHwgJGJsb2NrLT50eXBlICE9PSBUeXBlOjpUX0lGKSB7CiAgICAgICAgICAgICAgICBhc3NlcnQoJHRoaXMtPmVudiAhPT0gbnVsbCk7CgogICAgICAgICAgICAgICAgaWYgKCR0aGlzLT5lbnYtPnBhcmVudCkgewogICAgICAgICAgICAgICAgICAgICR0aGlzLT5hcHBlbmQobnVsbCk7IC8vIGNvbGxlY3QgY29tbWVudHMgYmVmb3JlIG5leHQgc3RhdGVtZW50IGlmIG5lZWRlZAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoJGJsb2NrIGluc3RhbmNlb2YgQ29udGVudEJsb2NrKSB7CiAgICAgICAgICAgICAgICAkaW5jbHVkZSA9ICRibG9jay0+Y2hpbGQ7CiAgICAgICAgICAgICAgICBhc3NlcnQoXGlzX2FycmF5KCRpbmNsdWRlKSk7CiAgICAgICAgICAgICAgICB1bnNldCgkYmxvY2stPmNoaWxkKTsKICAgICAgICAgICAgICAgICRpbmNsdWRlWzNdID0gJGJsb2NrOwogICAgICAgICAgICAgICAgJHRoaXMtPmFwcGVuZCgkaW5jbHVkZSwgJHMpOwogICAgICAgICAgICB9IGVsc2VpZiAoISRibG9jayBpbnN0YW5jZW9mIEVsc2VCbG9jayAmJiAhJGJsb2NrIGluc3RhbmNlb2YgRWxzZWlmQmxvY2spIHsKICAgICAgICAgICAgICAgICR0eXBlID0gaXNzZXQoJGJsb2NrLT50eXBlKSA/ICRibG9jay0+dHlwZSA6IFR5cGU6OlRfQkxPQ0s7CiAgICAgICAgICAgICAgICAkdGhpcy0+YXBwZW5kKFskdHlwZSwgJGJsb2NrXSwgJHMpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjb2xsZWN0IGNvbW1lbnRzIGp1c3QgYWZ0ZXIgdGhlIGJsb2NrIGNsb3NpbmcgaWYgbmVlZGVkCiAgICAgICAgICAgIGlmICgkdGhpcy0+ZWF0V2hpdGVEZWZhdWx0KSB7CiAgICAgICAgICAgICAgICAkdGhpcy0+d2hpdGVzcGFjZSgpOwogICAgICAgICAgICAgICAgYXNzZXJ0KCR0aGlzLT5lbnYgIT09IG51bGwpOwoKICAgICAgICAgICAgICAgIGlmICgkdGhpcy0+ZW52LT5jb21tZW50cykgewogICAgICAgICAgICAgICAgICAgICR0aGlzLT5hcHBlbmQobnVsbCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KCiAgICAgICAgLy8gZXh0cmEgc3R1ZmYKICAgICAgICBpZiAoJHRoaXMtPm1hdGNoQ2hhcignOycpKSB7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIC8qKgogICAgICogUHVzaCBibG9jayBvbnRvIHBhcnNlIHRyZWUKICAgICAqCiAgICAgKiBAcGFyYW0gYXJyYXl8bnVsbCAkc2VsZWN0b3JzCiAgICAgKiBAcGFyYW0gaW50ICAgICAgICAkcG9zCiAgICAgKgogICAgICogQHJldHVybiBCbG9jawogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gcHVzaEJsb2NrKCRzZWxlY3RvcnMsICRwb3MgPSAwKQogICAgewogICAgICAgICRiID0gbmV3IEJsb2NrKCk7CiAgICAgICAgJGItPnNlbGVjdG9ycyA9ICRzZWxlY3RvcnM7CgogICAgICAgICR0aGlzLT5yZWdpc3RlclB1c2hlZEJsb2NrKCRiLCAkcG9zKTsKCiAgICAgICAgcmV0dXJuICRiOwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIEJsb2NrICRiCiAgICAgKiBAcGFyYW0gaW50ICAgJHBvcwogICAgICoKICAgICAqIEByZXR1cm4gdm9pZAogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIHJlZ2lzdGVyUHVzaGVkQmxvY2soQmxvY2sgJGIsICRwb3MpCiAgICB7CiAgICAgICAgbGlzdCgkbGluZSwgJGNvbHVtbikgPSAkdGhpcy0+Z2V0U291cmNlUG9zaXRpb24oJHBvcyk7CgogICAgICAgICRiLT5zb3VyY2VOYW1lICAgPSAkdGhpcy0+c291cmNlTmFtZTsKICAgICAgICAkYi0+c291cmNlTGluZSAgID0gJGxpbmU7CiAgICAgICAgJGItPnNvdXJjZUNvbHVtbiA9ICRjb2x1bW47CiAgICAgICAgJGItPnNvdXJjZUluZGV4ICA9ICR0aGlzLT5zb3VyY2VJbmRleDsKICAgICAgICAkYi0+Y29tbWVudHMgICAgID0gW107CiAgICAgICAgJGItPnBhcmVudCAgICAgICA9ICR0aGlzLT5lbnY7CgogICAgICAgIGlmICghICR0aGlzLT5lbnYpIHsKICAgICAgICAgICAgJGItPmNoaWxkcmVuID0gW107CiAgICAgICAgfSBlbHNlaWYgKGVtcHR5KCR0aGlzLT5lbnYtPmNoaWxkcmVuKSkgewogICAgICAgICAgICAkdGhpcy0+ZW52LT5jaGlsZHJlbiA9ICR0aGlzLT5lbnYtPmNvbW1lbnRzOwogICAgICAgICAgICAkYi0+Y2hpbGRyZW4gPSBbXTsKICAgICAgICAgICAgJHRoaXMtPmVudi0+Y29tbWVudHMgPSBbXTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkYi0+Y2hpbGRyZW4gPSAkdGhpcy0+ZW52LT5jb21tZW50czsKICAgICAgICAgICAgJHRoaXMtPmVudi0+Y29tbWVudHMgPSBbXTsKICAgICAgICB9CgogICAgICAgICR0aGlzLT5lbnYgPSAkYjsKCiAgICAgICAgLy8gY29sbGVjdCBjb21tZW50cyBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgYmxvY2sgaWYgbmVlZGVkCiAgICAgICAgaWYgKCR0aGlzLT5lYXRXaGl0ZURlZmF1bHQpIHsKICAgICAgICAgICAgJHRoaXMtPndoaXRlc3BhY2UoKTsKICAgICAgICAgICAgYXNzZXJ0KCR0aGlzLT5lbnYgIT09IG51bGwpOwoKICAgICAgICAgICAgaWYgKCR0aGlzLT5lbnYtPmNvbW1lbnRzKSB7CiAgICAgICAgICAgICAgICAkdGhpcy0+YXBwZW5kKG51bGwpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogUHVzaCBzcGVjaWFsIChuYW1lZCkgYmxvY2sgb250byBwYXJzZSB0cmVlCiAgICAgKgogICAgICogQGRlcHJlY2F0ZWQKICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICAkdHlwZQogICAgICogQHBhcmFtIGludCAgICAgJHBvcwogICAgICoKICAgICAqIEByZXR1cm4gQmxvY2sKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIHB1c2hTcGVjaWFsQmxvY2soJHR5cGUsICRwb3MpCiAgICB7CiAgICAgICAgJGJsb2NrID0gJHRoaXMtPnB1c2hCbG9jayhudWxsLCAkcG9zKTsKICAgICAgICAkYmxvY2stPnR5cGUgPSAkdHlwZTsKCiAgICAgICAgcmV0dXJuICRibG9jazsKICAgIH0KCiAgICAvKioKICAgICAqIFBvcCBzY29wZSBhbmQgcmV0dXJuIGxhc3QgYmxvY2sKICAgICAqCiAgICAgKiBAcmV0dXJuIEJsb2NrCiAgICAgKgogICAgICogQHRocm93cyBcRXhjZXB0aW9uCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBwb3BCbG9jaygpCiAgICB7CiAgICAgICAgYXNzZXJ0KCR0aGlzLT5lbnYgIT09IG51bGwpOwoKICAgICAgICAvLyBjb2xsZWN0IGNvbW1lbnRzIGVuZGluZyBqdXN0IGJlZm9yZSBvZiBhIGJsb2NrIGNsb3NpbmcKICAgICAgICBpZiAoJHRoaXMtPmVudi0+Y29tbWVudHMpIHsKICAgICAgICAgICAgJHRoaXMtPmFwcGVuZChudWxsKTsKICAgICAgICB9CgogICAgICAgIC8vIHBvcCB0aGUgYmxvY2sKICAgICAgICAkYmxvY2sgPSAkdGhpcy0+ZW52OwoKICAgICAgICBpZiAoZW1wdHkoJGJsb2NrLT5wYXJlbnQpKSB7CiAgICAgICAgICAgIHRocm93ICR0aGlzLT5wYXJzZUVycm9yKCd1bmV4cGVjdGVkIH0nKTsKICAgICAgICB9CgogICAgICAgIGlmICgkYmxvY2stPnR5cGUgPT0gVHlwZTo6VF9BVF9ST09UKSB7CiAgICAgICAgICAgIC8vIGtlZXBzIHRoZSBwYXJlbnQgaW4gY2FzZSBvZiBzZWxmIHNlbGVjdG9yICYKICAgICAgICAgICAgJGJsb2NrLT5zZWxmUGFyZW50ID0gJGJsb2NrLT5wYXJlbnQ7CiAgICAgICAgfQoKICAgICAgICAkdGhpcy0+ZW52ID0gJGJsb2NrLT5wYXJlbnQ7CgogICAgICAgIHVuc2V0KCRibG9jay0+cGFyZW50KTsKCiAgICAgICAgcmV0dXJuICRibG9jazsKICAgIH0KCiAgICAvKioKICAgICAqIFBlZWsgaW5wdXQgc3RyZWFtCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkcmVnZXgKICAgICAqIEBwYXJhbSBhcnJheSAgJG91dAogICAgICogQHBhcmFtIGludCAgICAkZnJvbQogICAgICoKICAgICAqIEByZXR1cm4gaW50CiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBwZWVrKCRyZWdleCwgJiRvdXQsICRmcm9tID0gbnVsbCkKICAgIHsKICAgICAgICBpZiAoISBpc3NldCgkZnJvbSkpIHsKICAgICAgICAgICAgJGZyb20gPSAkdGhpcy0+Y291bnQ7CiAgICAgICAgfQoKICAgICAgICAkciA9ICcvJyAuICRyZWdleCAuICcvJyAuICR0aGlzLT5wYXR0ZXJuTW9kaWZpZXJzOwogICAgICAgICRyZXN1bHQgPSBwcmVnX21hdGNoKCRyLCAkdGhpcy0+YnVmZmVyLCAkb3V0LCAwLCAkZnJvbSk7CgogICAgICAgIHJldHVybiAkcmVzdWx0OwogICAgfQoKICAgIC8qKgogICAgICogU2VlayB0byBwb3NpdGlvbiBpbiBpbnB1dCBzdHJlYW0gKG9yIHJldHVybiBjdXJyZW50IHBvc2l0aW9uIGluIGlucHV0IHN0cmVhbSkKICAgICAqCiAgICAgKiBAcGFyYW0gaW50ICR3aGVyZQogICAgICoKICAgICAqIEByZXR1cm4gdm9pZAogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gc2Vlaygkd2hlcmUpCiAgICB7CiAgICAgICAgJHRoaXMtPmNvdW50ID0gJHdoZXJlOwogICAgfQoKICAgIC8qKgogICAgICogQXNzZXJ0IGEgcGFyc2VkIHBhcnQgaXMgcGxhaW4gQ1NTIFZhbGlkCiAgICAgKgogICAgICogQHBhcmFtIGFycmF5fE51bWJlcnxmYWxzZSAkcGFyc2VkCiAgICAgKiBAcGFyYW0gaW50ICAgICAgICAgJHN0YXJ0UG9zCiAgICAgKgogICAgICogQHJldHVybiBhcnJheXxOdW1iZXIKICAgICAqCiAgICAgKiBAdGhyb3dzIFBhcnNlckV4Y2VwdGlvbgogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gYXNzZXJ0UGxhaW5Dc3NWYWxpZCgkcGFyc2VkLCAkc3RhcnRQb3MgPSBudWxsKQogICAgewogICAgICAgICR0eXBlID0gJyc7CiAgICAgICAgaWYgKCRwYXJzZWQpIHsKICAgICAgICAgICAgJHR5cGUgPSAkcGFyc2VkWzBdOwogICAgICAgICAgICAkcGFyc2VkID0gJHRoaXMtPmlzUGxhaW5Dc3NWYWxpZEVsZW1lbnQoJHBhcnNlZCk7CiAgICAgICAgfQogICAgICAgIGlmICghICRwYXJzZWQpIHsKICAgICAgICAgICAgaWYgKCEgXGlzX251bGwoJHN0YXJ0UG9zKSkgewogICAgICAgICAgICAgICAgJHBsYWluID0gcnRyaW0oc3Vic3RyKCR0aGlzLT5idWZmZXIsICRzdGFydFBvcywgJHRoaXMtPmNvdW50IC0gJHN0YXJ0UG9zKSk7CiAgICAgICAgICAgICAgICAkbWVzc2FnZSA9ICJFcnJvciA6IGB7JHBsYWlufWAgaXNuJ3QgYWxsb3dlZCBpbiBwbGFpbiBDU1MiOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJG1lc3NhZ2UgPSAnRXJyb3I6IFNDU1Mgc3ludGF4IG5vdCBhbGxvd2VkIGluIENTUyBmaWxlJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoJHR5cGUpIHsKICAgICAgICAgICAgICAgICRtZXNzYWdlIC49ICIgKCR0eXBlKSI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhyb3cgJHRoaXMtPnBhcnNlRXJyb3IoJG1lc3NhZ2UpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRwYXJzZWQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBDaGVjayBhIHBhcnNlZCBlbGVtZW50IGlzIHBsYWluIENTUyBWYWxpZAogICAgICoKICAgICAqIEBwYXJhbSBhcnJheXxOdW1iZXJ8c3RyaW5nICRwYXJzZWQKICAgICAqIEBwYXJhbSBib29sICAkYWxsb3dFeHByZXNzaW9uCiAgICAgKgogICAgICogQHJldHVybiAoJHBhcnNlZCBpcyBzdHJpbmcgPyBzdHJpbmcgOiAoJHBhcnNlZCBpcyBOdW1iZXIgPyBOdW1iZXIgOiBhcnJheXxmYWxzZSkpCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBpc1BsYWluQ3NzVmFsaWRFbGVtZW50KCRwYXJzZWQsICRhbGxvd0V4cHJlc3Npb24gPSBmYWxzZSkKICAgIHsKICAgICAgICAvLyBrZWVwIHN0cmluZyBhcyBpcwogICAgICAgIGlmIChpc19zdHJpbmcoJHBhcnNlZCkpIHsKICAgICAgICAgICAgcmV0dXJuICRwYXJzZWQ7CiAgICAgICAgfQoKICAgICAgICBpZiAoJHBhcnNlZCBpbnN0YW5jZW9mIE51bWJlcikgewogICAgICAgICAgICByZXR1cm4gJHBhcnNlZDsKICAgICAgICB9CgogICAgICAgIGlmICgKICAgICAgICAgICAgXGluX2FycmF5KCRwYXJzZWRbMF0sIFtUeXBlOjpUX0ZVTkNUSU9OLCBUeXBlOjpUX0ZVTkNUSU9OX0NBTExdKSAmJgogICAgICAgICAgICAhXGluX2FycmF5KCRwYXJzZWRbMV0sIFsKICAgICAgICAgICAgICAgICdhbHBoYScsCiAgICAgICAgICAgICAgICAnYXR0cicsCiAgICAgICAgICAgICAgICAnY2FsYycsCiAgICAgICAgICAgICAgICAnY3ViaWMtYmV6aWVyJywKICAgICAgICAgICAgICAgICdlbnYnLAogICAgICAgICAgICAgICAgJ2dyYXlzY2FsZScsCiAgICAgICAgICAgICAgICAnaHNsJywKICAgICAgICAgICAgICAgICdoc2xhJywKICAgICAgICAgICAgICAgICdod2InLAogICAgICAgICAgICAgICAgJ2ludmVydCcsCiAgICAgICAgICAgICAgICAnbGluZWFyLWdyYWRpZW50JywKICAgICAgICAgICAgICAgICdtaW4nLAogICAgICAgICAgICAgICAgJ21heCcsCiAgICAgICAgICAgICAgICAncmFkaWFsLWdyYWRpZW50JywKICAgICAgICAgICAgICAgICdyZXBlYXRpbmctbGluZWFyLWdyYWRpZW50JywKICAgICAgICAgICAgICAgICdyZXBlYXRpbmctcmFkaWFsLWdyYWRpZW50JywKICAgICAgICAgICAgICAgICdyZ2InLAogICAgICAgICAgICAgICAgJ3JnYmEnLAogICAgICAgICAgICAgICAgJ3JvdGF0ZScsCiAgICAgICAgICAgICAgICAnc2F0dXJhdGUnLAogICAgICAgICAgICAgICAgJ3ZhcicsCiAgICAgICAgICAgIF0pICYmCiAgICAgICAgICAgIENvbXBpbGVyOjppc05hdGl2ZUZ1bmN0aW9uKCRwYXJzZWRbMV0pCiAgICAgICAgKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CgogICAgICAgIHN3aXRjaCAoJHBhcnNlZFswXSkgewogICAgICAgICAgICBjYXNlIFR5cGU6OlRfQkxPQ0s6CiAgICAgICAgICAgIGNhc2UgVHlwZTo6VF9LRVlXT1JEOgogICAgICAgICAgICBjYXNlIFR5cGU6OlRfTlVMTDoKICAgICAgICAgICAgY2FzZSBUeXBlOjpUX05VTUJFUjoKICAgICAgICAgICAgY2FzZSBUeXBlOjpUX01FRElBOgogICAgICAgICAgICAgICAgcmV0dXJuICRwYXJzZWQ7CgogICAgICAgICAgICBjYXNlIFR5cGU6OlRfQ09NTUVOVDoKICAgICAgICAgICAgICAgIGlmIChpc3NldCgkcGFyc2VkWzJdKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiAkcGFyc2VkOwoKICAgICAgICAgICAgY2FzZSBUeXBlOjpUX0RJUkVDVElWRToKICAgICAgICAgICAgICAgIGlmIChcaXNfYXJyYXkoJHBhcnNlZFsxXSkpIHsKICAgICAgICAgICAgICAgICAgICAkcGFyc2VkWzFdWzFdID0gJHRoaXMtPmlzUGxhaW5Dc3NWYWxpZEVsZW1lbnQoJHBhcnNlZFsxXVsxXSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCEgJHBhcnNlZFsxXVsxXSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiAkcGFyc2VkOwoKICAgICAgICAgICAgY2FzZSBUeXBlOjpUX0lNUE9SVDoKICAgICAgICAgICAgICAgIGlmICgkcGFyc2VkWzFdWzBdID09PSBUeXBlOjpUX0xJU1QpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkcGFyc2VkWzFdID0gJHRoaXMtPmlzUGxhaW5Dc3NWYWxpZEVsZW1lbnQoJHBhcnNlZFsxXSk7CiAgICAgICAgICAgICAgICBpZiAoJHBhcnNlZFsxXSA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gJHBhcnNlZDsKCiAgICAgICAgICAgIGNhc2UgVHlwZTo6VF9TVFJJTkc6CiAgICAgICAgICAgICAgICBmb3JlYWNoICgkcGFyc2VkWzJdIGFzICRrID0+ICRzdWJzdHIpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoXGlzX2FycmF5KCRzdWJzdHIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRwYXJzZWRbMl1bJGtdID0gJHRoaXMtPmlzUGxhaW5Dc3NWYWxpZEVsZW1lbnQoJHN1YnN0cik7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghICRwYXJzZWRbMl1bJGtdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gJHBhcnNlZDsKCiAgICAgICAgICAgIGNhc2UgVHlwZTo6VF9MSVNUOgogICAgICAgICAgICAgICAgaWYgKCFlbXB0eSgkcGFyc2VkWydlbmNsb3NpbmcnXSkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmb3JlYWNoICgkcGFyc2VkWzJdIGFzICRrID0+ICRsaXN0RWxlbWVudCkgewogICAgICAgICAgICAgICAgICAgICRwYXJzZWRbMl1bJGtdID0gJHRoaXMtPmlzUGxhaW5Dc3NWYWxpZEVsZW1lbnQoJGxpc3RFbGVtZW50KTsKICAgICAgICAgICAgICAgICAgICBpZiAoISAkcGFyc2VkWzJdWyRrXSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuICRwYXJzZWQ7CgogICAgICAgICAgICBjYXNlIFR5cGU6OlRfQVNTSUdOOgogICAgICAgICAgICAgICAgZm9yZWFjaCAoWzEsIDIsIDNdIGFzICRrKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCEgZW1wdHkoJHBhcnNlZFska10pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRwYXJzZWRbJGtdID0gJHRoaXMtPmlzUGxhaW5Dc3NWYWxpZEVsZW1lbnQoJHBhcnNlZFska10pOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoISAkcGFyc2VkWyRrXSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuICRwYXJzZWQ7CgogICAgICAgICAgICBjYXNlIFR5cGU6OlRfRVhQUkVTU0lPTjoKICAgICAgICAgICAgICAgIGxpc3QoICwkb3AsICRsaHMsICRyaHMsICRpblBhcmVucywgJHdoaXRlQmVmb3JlLCAkd2hpdGVBZnRlcikgPSAkcGFyc2VkOwogICAgICAgICAgICAgICAgaWYgKCEgJGFsbG93RXhwcmVzc2lvbiAmJiAgISBcaW5fYXJyYXkoJG9wLCBbJ2FuZCcsICdvcicsICcvJ10pKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJGxocyA9ICR0aGlzLT5pc1BsYWluQ3NzVmFsaWRFbGVtZW50KCRsaHMsIHRydWUpOwogICAgICAgICAgICAgICAgaWYgKCEgJGxocykgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRyaHMgPSAkdGhpcy0+aXNQbGFpbkNzc1ZhbGlkRWxlbWVudCgkcmhzLCB0cnVlKTsKICAgICAgICAgICAgICAgIGlmICghICRyaHMpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmV0dXJuIFsKICAgICAgICAgICAgICAgICAgICBUeXBlOjpUX1NUUklORywKICAgICAgICAgICAgICAgICAgICAnJywgWwogICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+aW5QYXJlbnMgPyAnKCcgOiAnJywKICAgICAgICAgICAgICAgICAgICAgICAgJGxocywKICAgICAgICAgICAgICAgICAgICAgICAgKCR3aGl0ZUJlZm9yZSA/ICcgJyA6ICcnKSAuICRvcCAuICgkd2hpdGVBZnRlciA/ICcgJyA6ICcnKSwKICAgICAgICAgICAgICAgICAgICAgICAgJHJocywKICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmluUGFyZW5zID8gJyknIDogJycKICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICBdOwoKICAgICAgICAgICAgY2FzZSBUeXBlOjpUX0NVU1RPTV9QUk9QRVJUWToKICAgICAgICAgICAgY2FzZSBUeXBlOjpUX1VOQVJZOgogICAgICAgICAgICAgICAgJHBhcnNlZFsyXSA9ICR0aGlzLT5pc1BsYWluQ3NzVmFsaWRFbGVtZW50KCRwYXJzZWRbMl0pOwogICAgICAgICAgICAgICAgaWYgKCEgJHBhcnNlZFsyXSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiAkcGFyc2VkOwoKICAgICAgICAgICAgY2FzZSBUeXBlOjpUX0ZVTkNUSU9OOgogICAgICAgICAgICAgICAgJGFyZ3NMaXN0ID0gJHBhcnNlZFsyXTsKICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRhcmdzTGlzdFsyXSBhcyAkYXJnRWxlbWVudCkgewogICAgICAgICAgICAgICAgICAgIGlmICghICR0aGlzLT5pc1BsYWluQ3NzVmFsaWRFbGVtZW50KCRhcmdFbGVtZW50KSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuICRwYXJzZWQ7CgogICAgICAgICAgICBjYXNlIFR5cGU6OlRfRlVOQ1RJT05fQ0FMTDoKICAgICAgICAgICAgICAgICRwYXJzZWRbMF0gPSBUeXBlOjpUX0ZVTkNUSU9OOwogICAgICAgICAgICAgICAgJGFyZ3NMaXN0ID0gW1R5cGU6OlRfTElTVCwgJywnLCBbXV07CiAgICAgICAgICAgICAgICBmb3JlYWNoICgkcGFyc2VkWzJdIGFzICRhcmcpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJGFyZ1swXSB8fCAhIGVtcHR5KCRhcmdbMl0pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vIG5hbWVkIGFyZ3VtZW50cyBwb3NzaWJsZSBpbiBhIGNzcyBmdW5jdGlvbiBjYWxsCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vciAuLi4gYXJndW1lbnQKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkYXJnID0gJHRoaXMtPmlzUGxhaW5Dc3NWYWxpZEVsZW1lbnQoJGFyZ1sxXSwgJHBhcnNlZFsxXSA9PT0gJ2NhbGMnKTsKICAgICAgICAgICAgICAgICAgICBpZiAoISAkYXJnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgJGFyZ3NMaXN0WzJdW10gPSAkYXJnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJHBhcnNlZFsyXSA9ICRhcmdzTGlzdDsKICAgICAgICAgICAgICAgIHJldHVybiAkcGFyc2VkOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIC8qKgogICAgICogTWF0Y2ggc3RyaW5nIGxvb2tpbmcgZm9yIGVpdGhlciBlbmRpbmcgZGVsaW0sIGVzY2FwZSwgb3Igc3RyaW5nIGludGVycG9sYXRpb24KICAgICAqCiAgICAgKiB7QGludGVybmFsIFRoaXMgaXMgYSB3b3JrYXJvdW5kIGZvciBwcmVnX21hdGNoJ3MgMjUwSyBzdHJpbmcgbWF0Y2ggbGltaXQuIH19CiAgICAgKgogICAgICogQHBhcmFtIGFycmF5ICAkbSAgICAgTWF0Y2hlcyAocGFzc2VkIGJ5IHJlZmVyZW5jZSkKICAgICAqIEBwYXJhbSBzdHJpbmcgJGRlbGltIERlbGltaXRlcgogICAgICoKICAgICAqIEByZXR1cm4gYm9vbCBUcnVlIGlmIG1hdGNoOyBmYWxzZSBvdGhlcndpc2UKICAgICAqCiAgICAgKiBAcGhwc3Rhbi1pbXB1cmUKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIG1hdGNoU3RyaW5nKCYkbSwgJGRlbGltKQogICAgewogICAgICAgICR0b2tlbiA9IG51bGw7CgogICAgICAgICRlbmQgPSBcc3RybGVuKCR0aGlzLT5idWZmZXIpOwoKICAgICAgICAvLyBsb29rIGZvciBlaXRoZXIgZW5kaW5nIGRlbGltLCBlc2NhcGUsIG9yIHN0cmluZyBpbnRlcnBvbGF0aW9uCiAgICAgICAgZm9yZWFjaCAoWycjeycsICdcXCcsICJcciIsICRkZWxpbV0gYXMgJGxvb2thaGVhZCkgewogICAgICAgICAgICAkcG9zID0gc3RycG9zKCR0aGlzLT5idWZmZXIsICRsb29rYWhlYWQsICR0aGlzLT5jb3VudCk7CgogICAgICAgICAgICBpZiAoJHBvcyAhPT0gZmFsc2UgJiYgJHBvcyA8ICRlbmQpIHsKICAgICAgICAgICAgICAgICRlbmQgPSAkcG9zOwogICAgICAgICAgICAgICAgJHRva2VuID0gJGxvb2thaGVhZDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCEgaXNzZXQoJHRva2VuKSkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICAkbWF0Y2ggPSBzdWJzdHIoJHRoaXMtPmJ1ZmZlciwgJHRoaXMtPmNvdW50LCAkZW5kIC0gJHRoaXMtPmNvdW50KTsKICAgICAgICAkbSA9IFsKICAgICAgICAgICAgJG1hdGNoIC4gJHRva2VuLAogICAgICAgICAgICAkbWF0Y2gsCiAgICAgICAgICAgICR0b2tlbgogICAgICAgIF07CiAgICAgICAgJHRoaXMtPmNvdW50ID0gJGVuZCArIFxzdHJsZW4oJHRva2VuKTsKCiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgLyoqCiAgICAgKiBUcnkgdG8gbWF0Y2ggc29tZXRoaW5nIG9uIGhlYWQgb2YgYnVmZmVyCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkcmVnZXgKICAgICAqIEBwYXJhbSBhcnJheSAgJG91dAogICAgICogQHBhcmFtIGJvb2wgICAkZWF0V2hpdGVzcGFjZQogICAgICoKICAgICAqIEByZXR1cm4gYm9vbAogICAgICoKICAgICAqIEBwaHBzdGFuLWltcHVyZQogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gbWF0Y2goJHJlZ2V4LCAmJG91dCwgJGVhdFdoaXRlc3BhY2UgPSBudWxsKQogICAgewogICAgICAgICRyID0gJy8nIC4gJHJlZ2V4IC4gJy8nIC4gJHRoaXMtPnBhdHRlcm5Nb2RpZmllcnM7CgogICAgICAgIGlmICghIHByZWdfbWF0Y2goJHIsICR0aGlzLT5idWZmZXIsICRvdXQsIDAsICR0aGlzLT5jb3VudCkpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgJHRoaXMtPmNvdW50ICs9IFxzdHJsZW4oJG91dFswXSk7CgogICAgICAgIGlmICghIGlzc2V0KCRlYXRXaGl0ZXNwYWNlKSkgewogICAgICAgICAgICAkZWF0V2hpdGVzcGFjZSA9ICR0aGlzLT5lYXRXaGl0ZURlZmF1bHQ7CiAgICAgICAgfQoKICAgICAgICBpZiAoJGVhdFdoaXRlc3BhY2UpIHsKICAgICAgICAgICAgJHRoaXMtPndoaXRlc3BhY2UoKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIC8qKgogICAgICogTWF0Y2ggYSBzaW5nbGUgc3RyaW5nCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkY2hhcgogICAgICogQHBhcmFtIGJvb2wgICAkZWF0V2hpdGVzcGFjZQogICAgICoKICAgICAqIEByZXR1cm4gYm9vbAogICAgICoKICAgICAqIEBwaHBzdGFuLWltcHVyZQogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gbWF0Y2hDaGFyKCRjaGFyLCAkZWF0V2hpdGVzcGFjZSA9IG51bGwpCiAgICB7CiAgICAgICAgaWYgKCEgaXNzZXQoJHRoaXMtPmJ1ZmZlclskdGhpcy0+Y291bnRdKSB8fCAkdGhpcy0+YnVmZmVyWyR0aGlzLT5jb3VudF0gIT09ICRjaGFyKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CgogICAgICAgICR0aGlzLT5jb3VudCsrOwoKICAgICAgICBpZiAoISBpc3NldCgkZWF0V2hpdGVzcGFjZSkpIHsKICAgICAgICAgICAgJGVhdFdoaXRlc3BhY2UgPSAkdGhpcy0+ZWF0V2hpdGVEZWZhdWx0OwogICAgICAgIH0KCiAgICAgICAgaWYgKCRlYXRXaGl0ZXNwYWNlKSB7CiAgICAgICAgICAgICR0aGlzLT53aGl0ZXNwYWNlKCk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICAvKioKICAgICAqIE1hdGNoIGxpdGVyYWwgc3RyaW5nCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkd2hhdAogICAgICogQHBhcmFtIGludCAgICAkbGVuCiAgICAgKiBAcGFyYW0gYm9vbCAgICRlYXRXaGl0ZXNwYWNlCiAgICAgKgogICAgICogQHJldHVybiBib29sCiAgICAgKgogICAgICogQHBocHN0YW4taW1wdXJlCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBsaXRlcmFsKCR3aGF0LCAkbGVuLCAkZWF0V2hpdGVzcGFjZSA9IG51bGwpCiAgICB7CiAgICAgICAgaWYgKHN0cmNhc2VjbXAoc3Vic3RyKCR0aGlzLT5idWZmZXIsICR0aGlzLT5jb3VudCwgJGxlbiksICR3aGF0KSAhPT0gMCkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICAkdGhpcy0+Y291bnQgKz0gJGxlbjsKCiAgICAgICAgaWYgKCEgaXNzZXQoJGVhdFdoaXRlc3BhY2UpKSB7CiAgICAgICAgICAgICRlYXRXaGl0ZXNwYWNlID0gJHRoaXMtPmVhdFdoaXRlRGVmYXVsdDsKICAgICAgICB9CgogICAgICAgIGlmICgkZWF0V2hpdGVzcGFjZSkgewogICAgICAgICAgICAkdGhpcy0+d2hpdGVzcGFjZSgpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgLyoqCiAgICAgKiBNYXRjaCBzb21lIHdoaXRlc3BhY2UKICAgICAqCiAgICAgKiBAcmV0dXJuIGJvb2wKICAgICAqCiAgICAgKiBAcGhwc3Rhbi1pbXB1cmUKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIHdoaXRlc3BhY2UoKQogICAgewogICAgICAgICRnb3RXaGl0ZSA9IGZhbHNlOwoKICAgICAgICB3aGlsZSAocHJlZ19tYXRjaChzdGF0aWM6OiR3aGl0ZVBhdHRlcm4sICR0aGlzLT5idWZmZXIsICRtLCAwLCAkdGhpcy0+Y291bnQpKSB7CiAgICAgICAgICAgIGlmIChpc3NldCgkbVsxXSkgJiYgZW1wdHkoJHRoaXMtPmNvbW1lbnRzU2VlblskdGhpcy0+Y291bnRdKSkgewogICAgICAgICAgICAgICAgLy8gY29tbWVudCB0aGF0IGFyZSBrZXB0IGluIHRoZSBvdXRwdXQgQ1NTCiAgICAgICAgICAgICAgICAkY29tbWVudCA9IFtdOwogICAgICAgICAgICAgICAgJHN0YXJ0Q29tbWVudENvdW50ID0gJHRoaXMtPmNvdW50OwogICAgICAgICAgICAgICAgJGVuZENvbW1lbnRDb3VudCA9ICR0aGlzLT5jb3VudCArIFxzdHJsZW4oJG1bMV0pOwoKICAgICAgICAgICAgICAgIC8vIGZpbmQgaW50ZXJwb2xhdGlvbnMgaW4gY29tbWVudAogICAgICAgICAgICAgICAgJHAgPSBzdHJwb3MoJHRoaXMtPmJ1ZmZlciwgJyN7JywgJHRoaXMtPmNvdW50KTsKCiAgICAgICAgICAgICAgICB3aGlsZSAoJHAgIT09IGZhbHNlICYmICRwIDwgJGVuZENvbW1lbnRDb3VudCkgewogICAgICAgICAgICAgICAgICAgICRjICAgICAgICAgICA9IHN1YnN0cigkdGhpcy0+YnVmZmVyLCAkdGhpcy0+Y291bnQsICRwIC0gJHRoaXMtPmNvdW50KTsKICAgICAgICAgICAgICAgICAgICAkY29tbWVudFtdICAgPSAkYzsKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+Y291bnQgPSAkcDsKICAgICAgICAgICAgICAgICAgICAkb3V0ICAgICAgICAgPSBudWxsOwoKICAgICAgICAgICAgICAgICAgICBpZiAoJHRoaXMtPmludGVycG9sYXRpb24oJG91dCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8ga2VlcCByaWdodCBzcGFjZXMgaW4gdGhlIGZvbGxvd2luZyBzdHJpbmcgcGFydAogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJG91dFszXSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCR0aGlzLT5idWZmZXJbJHRoaXMtPmNvdW50IC0gMV0gIT09ICd9JykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5jb3VudC0tOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRvdXRbM10gPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgJGNvbW1lbnRbXSA9IFtUeXBlOjpUX0NPTU1FTlQsIHN1YnN0cigkdGhpcy0+YnVmZmVyLCAkcCwgJHRoaXMtPmNvdW50IC0gJHApLCAkb3V0XTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBsaXN0KCRsaW5lLCAkY29sdW1uKSA9ICR0aGlzLT5nZXRTb3VyY2VQb3NpdGlvbigkdGhpcy0+Y291bnQpOwogICAgICAgICAgICAgICAgICAgICAgICAkZmlsZSA9ICR0aGlzLT5zb3VyY2VOYW1lOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoISR0aGlzLT5kaXNjYXJkQ29tbWVudHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5sb2dnZXItPndhcm4oIlVudGVybWluYXRlZCBpbnRlcnBvbGF0aW9ucyBpbiBtdWx0aWxpbmUgY29tbWVudHMgYXJlIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBTY3NzUGhwIDIuMCwgaW4gXCIkZmlsZVwiLCBsaW5lICRsaW5lLCBjb2x1bW4gJGNvbHVtbi4iLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAkY29tbWVudFtdID0gc3Vic3RyKCR0aGlzLT5idWZmZXIsICR0aGlzLT5jb3VudCwgMik7CgogICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+Y291bnQgKz0gMjsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICRwID0gc3RycG9zKCR0aGlzLT5idWZmZXIsICcjeycsICR0aGlzLT5jb3VudCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gcmVtYWluaW5nIHBhcnQKICAgICAgICAgICAgICAgICRjID0gc3Vic3RyKCR0aGlzLT5idWZmZXIsICR0aGlzLT5jb3VudCwgJGVuZENvbW1lbnRDb3VudCAtICR0aGlzLT5jb3VudCk7CgogICAgICAgICAgICAgICAgaWYgKCEgJGNvbW1lbnQpIHsKICAgICAgICAgICAgICAgICAgICAvLyBzaW5nbGUgcGFydCBzdGF0aWMgY29tbWVudAogICAgICAgICAgICAgICAgICAgICRjb21tZW50U3RhdGVtZW50ID0gW1R5cGU6OlRfQ09NTUVOVCwgJGNdOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkY29tbWVudFtdID0gJGM7CiAgICAgICAgICAgICAgICAgICAgJHN0YXRpY0NvbW1lbnQgPSBzdWJzdHIoJHRoaXMtPmJ1ZmZlciwgJHN0YXJ0Q29tbWVudENvdW50LCAkZW5kQ29tbWVudENvdW50IC0gJHN0YXJ0Q29tbWVudENvdW50KTsKICAgICAgICAgICAgICAgICAgICAkY29tbWVudFN0YXRlbWVudCA9IFtUeXBlOjpUX0NPTU1FTlQsICRzdGF0aWNDb21tZW50LCBbVHlwZTo6VF9TVFJJTkcsICcnLCAkY29tbWVudF1dOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGxpc3QoJGxpbmUsICRjb2x1bW4pID0gJHRoaXMtPmdldFNvdXJjZVBvc2l0aW9uKCRzdGFydENvbW1lbnRDb3VudCk7CiAgICAgICAgICAgICAgICAkY29tbWVudFN0YXRlbWVudFtzZWxmOjpTT1VSQ0VfTElORV0gPSAkbGluZTsKICAgICAgICAgICAgICAgICRjb21tZW50U3RhdGVtZW50W3NlbGY6OlNPVVJDRV9DT0xVTU5dID0gJGNvbHVtbjsKICAgICAgICAgICAgICAgICRjb21tZW50U3RhdGVtZW50W3NlbGY6OlNPVVJDRV9JTkRFWF0gPSAkdGhpcy0+c291cmNlSW5kZXg7CgogICAgICAgICAgICAgICAgJHRoaXMtPmFwcGVuZENvbW1lbnQoJGNvbW1lbnRTdGF0ZW1lbnQpOwoKICAgICAgICAgICAgICAgICR0aGlzLT5jb21tZW50c1NlZW5bJHN0YXJ0Q29tbWVudENvdW50XSA9IHRydWU7CiAgICAgICAgICAgICAgICAkdGhpcy0+Y291bnQgPSAkZW5kQ29tbWVudENvdW50OwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgLy8gY29tbWVudCB0aGF0IGFyZSBpZ25vcmVkIGFuZCBub3Qga2VwdCBpbiB0aGUgb3V0cHV0IGNzcwogICAgICAgICAgICAgICAgJHRoaXMtPmNvdW50ICs9IFxzdHJsZW4oJG1bMF0pOwogICAgICAgICAgICAgICAgLy8gc2lsZW50IGNvbW1lbnRzIGFyZSBub3QgYWxsb3dlZCBpbiBwbGFpbiBDU1MgZmlsZXMKICAgICAgICAgICAgICAgICEgJHRoaXMtPmNzc09ubHkKICAgICAgICAgICAgICAgICAgfHwgISBcc3RybGVuKHRyaW0oJG1bMF0pKQogICAgICAgICAgICAgICAgICB8fCAkdGhpcy0+YXNzZXJ0UGxhaW5Dc3NWYWxpZChmYWxzZSwgJHRoaXMtPmNvdW50IC0gXHN0cmxlbigkbVswXSkpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkZ290V2hpdGUgPSB0cnVlOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRnb3RXaGl0ZTsKICAgIH0KCiAgICAvKioKICAgICAqIEFwcGVuZCBjb21tZW50IHRvIGN1cnJlbnQgYmxvY2sKICAgICAqCiAgICAgKiBAcGFyYW0gYXJyYXkgJGNvbW1lbnQKICAgICAqCiAgICAgKiBAcmV0dXJuIHZvaWQKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGFwcGVuZENvbW1lbnQoJGNvbW1lbnQpCiAgICB7CiAgICAgICAgaWYgKCEgJHRoaXMtPmRpc2NhcmRDb21tZW50cykgewogICAgICAgICAgICBhc3NlcnQoJHRoaXMtPmVudiAhPT0gbnVsbCk7CgogICAgICAgICAgICAkdGhpcy0+ZW52LT5jb21tZW50c1tdID0gJGNvbW1lbnQ7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQXBwZW5kIHN0YXRlbWVudCB0byBjdXJyZW50IGJsb2NrCiAgICAgKgogICAgICogQHBhcmFtIGFycmF5fG51bGwgJHN0YXRlbWVudAogICAgICogQHBhcmFtIGludCAgICAgICAgJHBvcwogICAgICoKICAgICAqIEByZXR1cm4gdm9pZAogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gYXBwZW5kKCRzdGF0ZW1lbnQsICRwb3MgPSBudWxsKQogICAgewogICAgICAgIGFzc2VydCgkdGhpcy0+ZW52ICE9PSBudWxsKTsKCiAgICAgICAgaWYgKCEgXGlzX251bGwoJHN0YXRlbWVudCkpIHsKICAgICAgICAgICAgISAkdGhpcy0+Y3NzT25seSB8fCAoJHN0YXRlbWVudCA9ICR0aGlzLT5hc3NlcnRQbGFpbkNzc1ZhbGlkKCRzdGF0ZW1lbnQsICRwb3MpKTsKCiAgICAgICAgICAgIGlmICghIFxpc19udWxsKCRwb3MpKSB7CiAgICAgICAgICAgICAgICBsaXN0KCRsaW5lLCAkY29sdW1uKSA9ICR0aGlzLT5nZXRTb3VyY2VQb3NpdGlvbigkcG9zKTsKCiAgICAgICAgICAgICAgICAkc3RhdGVtZW50W3N0YXRpYzo6U09VUkNFX0xJTkVdICAgPSAkbGluZTsKICAgICAgICAgICAgICAgICRzdGF0ZW1lbnRbc3RhdGljOjpTT1VSQ0VfQ09MVU1OXSA9ICRjb2x1bW47CiAgICAgICAgICAgICAgICAkc3RhdGVtZW50W3N0YXRpYzo6U09VUkNFX0lOREVYXSAgPSAkdGhpcy0+c291cmNlSW5kZXg7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICR0aGlzLT5lbnYtPmNoaWxkcmVuW10gPSAkc3RhdGVtZW50OwogICAgICAgIH0KCiAgICAgICAgJGNvbW1lbnRzID0gJHRoaXMtPmVudi0+Y29tbWVudHM7CgogICAgICAgIGlmICgkY29tbWVudHMpIHsKICAgICAgICAgICAgJHRoaXMtPmVudi0+Y2hpbGRyZW4gPSBhcnJheV9tZXJnZSgkdGhpcy0+ZW52LT5jaGlsZHJlbiwgJGNvbW1lbnRzKTsKICAgICAgICAgICAgJHRoaXMtPmVudi0+Y29tbWVudHMgPSBbXTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIGxhc3QgY2hpbGQgd2FzIGFwcGVuZGVkCiAgICAgKgogICAgICogQHJldHVybiBhcnJheXxudWxsCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBsYXN0KCkKICAgIHsKICAgICAgICBhc3NlcnQoJHRoaXMtPmVudiAhPT0gbnVsbCk7CgogICAgICAgICRpID0gXGNvdW50KCR0aGlzLT5lbnYtPmNoaWxkcmVuKSAtIDE7CgogICAgICAgIGlmIChpc3NldCgkdGhpcy0+ZW52LT5jaGlsZHJlblskaV0pKSB7CiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+ZW52LT5jaGlsZHJlblskaV07CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KCiAgICAvKioKICAgICAqIFBhcnNlIG1lZGlhIHF1ZXJ5IGxpc3QKICAgICAqCiAgICAgKiBAcGFyYW0gYXJyYXkgJG91dAogICAgICoKICAgICAqIEByZXR1cm4gYm9vbAogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gbWVkaWFRdWVyeUxpc3QoJiRvdXQpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5nZW5lcmljTGlzdCgkb3V0LCAnbWVkaWFRdWVyeScsICcsJywgZmFsc2UpOwogICAgfQoKICAgIC8qKgogICAgICogUGFyc2UgbWVkaWEgcXVlcnkKICAgICAqCiAgICAgKiBAcGFyYW0gYXJyYXkgJG91dAogICAgICoKICAgICAqIEByZXR1cm4gYm9vbAogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gbWVkaWFRdWVyeSgmJG91dCkKICAgIHsKICAgICAgICAkZXhwcmVzc2lvbnMgPSBudWxsOwogICAgICAgICRwYXJ0cyA9IFtdOwoKICAgICAgICBpZiAoCiAgICAgICAgICAgICgkdGhpcy0+bGl0ZXJhbCgnb25seScsIDQpICYmICgkb25seSA9IHRydWUpIHx8CiAgICAgICAgICAgICR0aGlzLT5saXRlcmFsKCdub3QnLCAzKSAmJiAoJG5vdCA9IHRydWUpIHx8IHRydWUpICYmCiAgICAgICAgICAgICR0aGlzLT5taXhlZEtleXdvcmQoJG1lZGlhVHlwZSkKICAgICAgICApIHsKICAgICAgICAgICAgJHByb3AgPSBbVHlwZTo6VF9NRURJQV9UWVBFXTsKCiAgICAgICAgICAgIGlmIChpc3NldCgkb25seSkpIHsKICAgICAgICAgICAgICAgICRwcm9wW10gPSBbVHlwZTo6VF9LRVlXT1JELCAnb25seSddOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoaXNzZXQoJG5vdCkpIHsKICAgICAgICAgICAgICAgICRwcm9wW10gPSBbVHlwZTo6VF9LRVlXT1JELCAnbm90J107CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRtZWRpYSA9IFtUeXBlOjpUX0xJU1QsICcnLCBbXV07CgogICAgICAgICAgICBmb3JlYWNoICgoYXJyYXkpICRtZWRpYVR5cGUgYXMgJHR5cGUpIHsKICAgICAgICAgICAgICAgIGlmIChcaXNfYXJyYXkoJHR5cGUpKSB7CiAgICAgICAgICAgICAgICAgICAgJG1lZGlhWzJdW10gPSAkdHlwZTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJG1lZGlhWzJdW10gPSBbVHlwZTo6VF9LRVlXT1JELCAkdHlwZV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRwcm9wW10gID0gJG1lZGlhOwogICAgICAgICAgICAkcGFydHNbXSA9ICRwcm9wOwogICAgICAgIH0KCiAgICAgICAgaWYgKGVtcHR5KCRwYXJ0cykgfHwgJHRoaXMtPmxpdGVyYWwoJ2FuZCcsIDMpKSB7CiAgICAgICAgICAgICR0aGlzLT5nZW5lcmljTGlzdCgkZXhwcmVzc2lvbnMsICdtZWRpYUV4cHJlc3Npb24nLCAnYW5kJywgZmFsc2UpOwoKICAgICAgICAgICAgaWYgKFxpc19hcnJheSgkZXhwcmVzc2lvbnMpKSB7CiAgICAgICAgICAgICAgICAkcGFydHMgPSBhcnJheV9tZXJnZSgkcGFydHMsICRleHByZXNzaW9uc1syXSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICRvdXQgPSAkcGFydHM7CgogICAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIC8qKgogICAgICogUGFyc2Ugc3VwcG9ydHMgcXVlcnkKICAgICAqCiAgICAgKiBAcGFyYW0gYXJyYXkgJG91dAogICAgICoKICAgICAqIEByZXR1cm4gYm9vbAogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gc3VwcG9ydHNRdWVyeSgmJG91dCkKICAgIHsKICAgICAgICAkZXhwcmVzc2lvbnMgPSBudWxsOwogICAgICAgICRwYXJ0cyA9IFtdOwoKICAgICAgICAkcyA9ICR0aGlzLT5jb3VudDsKCiAgICAgICAgJG5vdCA9IGZhbHNlOwoKICAgICAgICBpZiAoCiAgICAgICAgICAgICgkdGhpcy0+bGl0ZXJhbCgnbm90JywgMykgJiYgKCRub3QgPSB0cnVlKSB8fCB0cnVlKSAmJgogICAgICAgICAgICAkdGhpcy0+bWF0Y2hDaGFyKCcoJykgJiYKICAgICAgICAgICAgKCR0aGlzLT5leHByZXNzaW9uKCRwcm9wZXJ0eSkpICYmCiAgICAgICAgICAgICR0aGlzLT5saXRlcmFsKCc6ICcsIDIpICYmCiAgICAgICAgICAgICR0aGlzLT52YWx1ZUxpc3QoJHZhbHVlKSAmJgogICAgICAgICAgICAkdGhpcy0+bWF0Y2hDaGFyKCcpJykKICAgICAgICApIHsKICAgICAgICAgICAgJHN1cHBvcnQgPSBbVHlwZTo6VF9TVFJJTkcsICcnLCBbW1R5cGU6OlRfS0VZV09SRCwgKCRub3QgPyAnbm90ICcgOiAnJykgLiAnKCddXV07CiAgICAgICAgICAgICRzdXBwb3J0WzJdW10gPSAkcHJvcGVydHk7CiAgICAgICAgICAgICRzdXBwb3J0WzJdW10gPSBbVHlwZTo6VF9LRVlXT1JELCAnOiAnXTsKICAgICAgICAgICAgJHN1cHBvcnRbMl1bXSA9ICR2YWx1ZTsKICAgICAgICAgICAgJHN1cHBvcnRbMl1bXSA9IFtUeXBlOjpUX0tFWVdPUkQsICcpJ107CgogICAgICAgICAgICAkcGFydHNbXSA9ICRzdXBwb3J0OwogICAgICAgICAgICAkcyA9ICR0aGlzLT5jb3VudDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkdGhpcy0+c2Vlaygkcyk7CiAgICAgICAgfQoKICAgICAgICBpZiAoCiAgICAgICAgICAgICR0aGlzLT5tYXRjaENoYXIoJygnKSAmJgogICAgICAgICAgICAkdGhpcy0+c3VwcG9ydHNRdWVyeSgkc3ViUXVlcnkpICYmCiAgICAgICAgICAgICR0aGlzLT5tYXRjaENoYXIoJyknKQogICAgICAgICkgewogICAgICAgICAgICAkcGFydHNbXSA9IFtUeXBlOjpUX1NUUklORywgJycsIFtbVHlwZTo6VF9LRVlXT1JELCAnKCddLCAkc3ViUXVlcnksIFtUeXBlOjpUX0tFWVdPUkQsICcpJ11dXTsKICAgICAgICAgICAgJHMgPSAkdGhpcy0+Y291bnQ7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJHRoaXMtPnNlZWsoJHMpOwogICAgICAgIH0KCiAgICAgICAgaWYgKAogICAgICAgICAgICAkdGhpcy0+bGl0ZXJhbCgnbm90JywgMykgJiYKICAgICAgICAgICAgJHRoaXMtPnN1cHBvcnRzUXVlcnkoJHN1YlF1ZXJ5KQogICAgICAgICkgewogICAgICAgICAgICAkcGFydHNbXSA9IFtUeXBlOjpUX1NUUklORywgJycsIFtbVHlwZTo6VF9LRVlXT1JELCAnbm90ICddLCAkc3ViUXVlcnldXTsKICAgICAgICAgICAgJHMgPSAkdGhpcy0+Y291bnQ7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJHRoaXMtPnNlZWsoJHMpOwogICAgICAgIH0KCiAgICAgICAgaWYgKAogICAgICAgICAgICAkdGhpcy0+bGl0ZXJhbCgnc2VsZWN0b3IoJywgOSkgJiYKICAgICAgICAgICAgJHRoaXMtPnNlbGVjdG9yKCRzZWxlY3RvcikgJiYKICAgICAgICAgICAgJHRoaXMtPm1hdGNoQ2hhcignKScpCiAgICAgICAgKSB7CiAgICAgICAgICAgICRzdXBwb3J0ID0gW1R5cGU6OlRfU1RSSU5HLCAnJywgW1tUeXBlOjpUX0tFWVdPUkQsICdzZWxlY3RvcignXV1dOwoKICAgICAgICAgICAgJHNlbGVjdG9yTGlzdCA9IFtUeXBlOjpUX0xJU1QsICcnLCBbXV07CgogICAgICAgICAgICBmb3JlYWNoICgkc2VsZWN0b3IgYXMgJHNjKSB7CiAgICAgICAgICAgICAgICAkY29tcG91bmQgPSBbVHlwZTo6VF9TVFJJTkcsICcnLCBbXV07CgogICAgICAgICAgICAgICAgZm9yZWFjaCAoJHNjIGFzICRzY3ApIHsKICAgICAgICAgICAgICAgICAgICBpZiAoXGlzX2FycmF5KCRzY3ApKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRjb21wb3VuZFsyXVtdID0gJHNjcDsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAkY29tcG91bmRbMl1bXSA9IFtUeXBlOjpUX0tFWVdPUkQsICRzY3BdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkc2VsZWN0b3JMaXN0WzJdW10gPSAkY29tcG91bmQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRzdXBwb3J0WzJdW10gPSAkc2VsZWN0b3JMaXN0OwogICAgICAgICAgICAkc3VwcG9ydFsyXVtdID0gW1R5cGU6OlRfS0VZV09SRCwgJyknXTsKICAgICAgICAgICAgJHBhcnRzW10gPSAkc3VwcG9ydDsKICAgICAgICAgICAgJHMgPSAkdGhpcy0+Y291bnQ7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJHRoaXMtPnNlZWsoJHMpOwogICAgICAgIH0KCiAgICAgICAgaWYgKCR0aGlzLT52YXJpYWJsZSgkdmFyKSBvciAkdGhpcy0+aW50ZXJwb2xhdGlvbigkdmFyKSkgewogICAgICAgICAgICAkcGFydHNbXSA9ICR2YXI7CiAgICAgICAgICAgICRzID0gJHRoaXMtPmNvdW50OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICR0aGlzLT5zZWVrKCRzKTsKICAgICAgICB9CgogICAgICAgIGlmICgKICAgICAgICAgICAgJHRoaXMtPmxpdGVyYWwoJ2FuZCcsIDMpICYmCiAgICAgICAgICAgICR0aGlzLT5nZW5lcmljTGlzdCgkZXhwcmVzc2lvbnMsICdzdXBwb3J0c1F1ZXJ5JywgJyBhbmQnLCBmYWxzZSkKICAgICAgICApIHsKICAgICAgICAgICAgYXJyYXlfdW5zaGlmdCgkZXhwcmVzc2lvbnNbMl0sIFtUeXBlOjpUX1NUUklORywgJycsICRwYXJ0c10pOwoKICAgICAgICAgICAgJHBhcnRzID0gWyRleHByZXNzaW9uc107CiAgICAgICAgICAgICRzID0gJHRoaXMtPmNvdW50OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICR0aGlzLT5zZWVrKCRzKTsKICAgICAgICB9CgogICAgICAgIGlmICgKICAgICAgICAgICAgJHRoaXMtPmxpdGVyYWwoJ29yJywgMikgJiYKICAgICAgICAgICAgJHRoaXMtPmdlbmVyaWNMaXN0KCRleHByZXNzaW9ucywgJ3N1cHBvcnRzUXVlcnknLCAnIG9yJywgZmFsc2UpCiAgICAgICAgKSB7CiAgICAgICAgICAgIGFycmF5X3Vuc2hpZnQoJGV4cHJlc3Npb25zWzJdLCBbVHlwZTo6VF9TVFJJTkcsICcnLCAkcGFydHNdKTsKCiAgICAgICAgICAgICRwYXJ0cyA9IFskZXhwcmVzc2lvbnNdOwogICAgICAgICAgICAkcyA9ICR0aGlzLT5jb3VudDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkdGhpcy0+c2Vlaygkcyk7CiAgICAgICAgfQoKICAgICAgICBpZiAoXGNvdW50KCRwYXJ0cykpIHsKICAgICAgICAgICAgaWYgKCR0aGlzLT5lYXRXaGl0ZURlZmF1bHQpIHsKICAgICAgICAgICAgICAgICR0aGlzLT53aGl0ZXNwYWNlKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRvdXQgPSBbVHlwZTo6VF9TVFJJTkcsICcnLCAkcGFydHNdOwoKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgoKICAgIC8qKgogICAgICogUGFyc2UgbWVkaWEgZXhwcmVzc2lvbgogICAgICoKICAgICAqIEBwYXJhbSBhcnJheSAkb3V0CiAgICAgKgogICAgICogQHJldHVybiBib29sCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBtZWRpYUV4cHJlc3Npb24oJiRvdXQpCiAgICB7CiAgICAgICAgJHMgPSAkdGhpcy0+Y291bnQ7CiAgICAgICAgJHZhbHVlID0gbnVsbDsKCiAgICAgICAgaWYgKAogICAgICAgICAgICAkdGhpcy0+bWF0Y2hDaGFyKCcoJykgJiYKICAgICAgICAgICAgJHRoaXMtPmV4cHJlc3Npb24oJGZlYXR1cmUpICYmCiAgICAgICAgICAgICgkdGhpcy0+bWF0Y2hDaGFyKCc6JykgJiYKICAgICAgICAgICAgICAgICR0aGlzLT5leHByZXNzaW9uKCR2YWx1ZSkgfHwgdHJ1ZSkgJiYKICAgICAgICAgICAgJHRoaXMtPm1hdGNoQ2hhcignKScpCiAgICAgICAgKSB7CiAgICAgICAgICAgICRvdXQgPSBbVHlwZTo6VF9NRURJQV9FWFBSRVNTSU9OLCAkZmVhdHVyZV07CgogICAgICAgICAgICBpZiAoJHZhbHVlKSB7CiAgICAgICAgICAgICAgICAkb3V0W10gPSAkdmFsdWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KCiAgICAgICAgJHRoaXMtPnNlZWsoJHMpOwoKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgLyoqCiAgICAgKiBQYXJzZSBhcmd1bWVudCB2YWx1ZXMKICAgICAqCiAgICAgKiBAcGFyYW0gYXJyYXkgJG91dAogICAgICoKICAgICAqIEByZXR1cm4gYm9vbAogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gYXJnVmFsdWVzKCYkb3V0KQogICAgewogICAgICAgICRkaXNjYXJkQ29tbWVudHMgPSAkdGhpcy0+ZGlzY2FyZENvbW1lbnRzOwogICAgICAgICR0aGlzLT5kaXNjYXJkQ29tbWVudHMgPSB0cnVlOwoKICAgICAgICBpZiAoJHRoaXMtPmdlbmVyaWNMaXN0KCRsaXN0LCAnYXJnVmFsdWUnLCAnLCcsIGZhbHNlKSkgewogICAgICAgICAgICAkb3V0ID0gJGxpc3RbMl07CgogICAgICAgICAgICAkdGhpcy0+ZGlzY2FyZENvbW1lbnRzID0gJGRpc2NhcmRDb21tZW50czsKCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KCiAgICAgICAgJHRoaXMtPmRpc2NhcmRDb21tZW50cyA9ICRkaXNjYXJkQ29tbWVudHM7CgogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICAvKioKICAgICAqIFBhcnNlIGFyZ3VtZW50IHZhbHVlCiAgICAgKgogICAgICogQHBhcmFtIGFycmF5ICRvdXQKICAgICAqCiAgICAgKiBAcmV0dXJuIGJvb2wKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGFyZ1ZhbHVlKCYkb3V0KQogICAgewogICAgICAgICRzID0gJHRoaXMtPmNvdW50OwoKICAgICAgICAka2V5d29yZCA9IG51bGw7CgogICAgICAgIGlmICghICR0aGlzLT52YXJpYWJsZSgka2V5d29yZCkgfHwgISAkdGhpcy0+bWF0Y2hDaGFyKCc6JykpIHsKICAgICAgICAgICAgJHRoaXMtPnNlZWsoJHMpOwoKICAgICAgICAgICAgJGtleXdvcmQgPSBudWxsOwogICAgICAgIH0KCiAgICAgICAgaWYgKCR0aGlzLT5nZW5lcmljTGlzdCgkdmFsdWUsICdleHByZXNzaW9uJywgJycsIHRydWUpKSB7CiAgICAgICAgICAgICRvdXQgPSBbJGtleXdvcmQsICR2YWx1ZSwgZmFsc2VdOwogICAgICAgICAgICAkcyA9ICR0aGlzLT5jb3VudDsKCiAgICAgICAgICAgIGlmICgkdGhpcy0+bGl0ZXJhbCgnLi4uJywgMykpIHsKICAgICAgICAgICAgICAgICRvdXRbMl0gPSB0cnVlOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJHRoaXMtPnNlZWsoJHMpOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICAvKioKICAgICAqIENoZWNrIGlmIGEgZ2VuZXJpYyBkaXJlY3RpdmUgaXMga25vd24gdG8gYmUgYWJsZSB0byBhbGxvdyBhbG1vc3QgYW55IHN5bnRheCBvciBub3QKICAgICAqIEBwYXJhbSBtaXhlZCAkZGlyZWN0aXZlTmFtZQogICAgICogQHJldHVybiBib29sCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBpc0tub3duR2VuZXJpY0RpcmVjdGl2ZSgkZGlyZWN0aXZlTmFtZSkKICAgIHsKICAgICAgICBpZiAoXGlzX2FycmF5KCRkaXJlY3RpdmVOYW1lKSAmJiBcaXNfc3RyaW5nKHJlc2V0KCRkaXJlY3RpdmVOYW1lKSkpIHsKICAgICAgICAgICAgJGRpcmVjdGl2ZU5hbWUgPSByZXNldCgkZGlyZWN0aXZlTmFtZSk7CiAgICAgICAgfQogICAgICAgIGlmICghIFxpc19zdHJpbmcoJGRpcmVjdGl2ZU5hbWUpKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgaWYgKAogICAgICAgICAgICBcaW5fYXJyYXkoJGRpcmVjdGl2ZU5hbWUsIFsKICAgICAgICAgICAgJ2F0LXJvb3QnLAogICAgICAgICAgICAnbWVkaWEnLAogICAgICAgICAgICAnbWl4aW4nLAogICAgICAgICAgICAnaW5jbHVkZScsCiAgICAgICAgICAgICdzY3NzcGhwLWltcG9ydC1vbmNlJywKICAgICAgICAgICAgJ2ltcG9ydCcsCiAgICAgICAgICAgICdleHRlbmQnLAogICAgICAgICAgICAnZnVuY3Rpb24nLAogICAgICAgICAgICAnYnJlYWsnLAogICAgICAgICAgICAnY29udGludWUnLAogICAgICAgICAgICAncmV0dXJuJywKICAgICAgICAgICAgJ2VhY2gnLAogICAgICAgICAgICAnd2hpbGUnLAogICAgICAgICAgICAnZm9yJywKICAgICAgICAgICAgJ2lmJywKICAgICAgICAgICAgJ2RlYnVnJywKICAgICAgICAgICAgJ3dhcm4nLAogICAgICAgICAgICAnZXJyb3InLAogICAgICAgICAgICAnY29udGVudCcsCiAgICAgICAgICAgICdlbHNlJywKICAgICAgICAgICAgJ2NoYXJzZXQnLAogICAgICAgICAgICAnc3VwcG9ydHMnLAogICAgICAgICAgICAvLyBUb2RvCiAgICAgICAgICAgICd1c2UnLAogICAgICAgICAgICAnZm9yd2FyZCcsCiAgICAgICAgICAgIF0pCiAgICAgICAgKSB7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgLyoqCiAgICAgKiBQYXJzZSBkaXJlY3RpdmUgdmFsdWUgbGlzdCB0aGF0IGNvbnNpZGVycyAkdmFycyBhcyBrZXl3b3JkCiAgICAgKgogICAgICogQHBhcmFtIG1peGVkICAgICAgICAkb3V0CiAgICAgKiBAcGFyYW0gc3RyaW5nfGZhbHNlICRlbmRDaGFyCiAgICAgKiBAcGFyYW0tb3V0IGFycmF5fE51bWJlciAkb3V0CiAgICAgKgogICAgICogQHJldHVybiBib29sCiAgICAgKgogICAgICogQHBocHN0YW4taW1wdXJlCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBkaXJlY3RpdmVWYWx1ZSgmJG91dCwgJGVuZENoYXIgPSBmYWxzZSkKICAgIHsKICAgICAgICAkcyA9ICR0aGlzLT5jb3VudDsKCiAgICAgICAgaWYgKCR0aGlzLT52YXJpYWJsZSgkb3V0KSkgewogICAgICAgICAgICBpZiAoJGVuZENoYXIgJiYgJHRoaXMtPm1hdGNoQ2hhcigkZW5kQ2hhciwgZmFsc2UpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCEgJGVuZENoYXIgJiYgJHRoaXMtPmVuZCgpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJHRoaXMtPnNlZWsoJHMpOwoKICAgICAgICBpZiAoXGlzX3N0cmluZygkZW5kQ2hhcikgJiYgJHRoaXMtPm9wZW5TdHJpbmcoJGVuZENoYXIgPyAkZW5kQ2hhciA6ICc7JywgJG91dCwgbnVsbCwgbnVsbCwgdHJ1ZSwgIjt9eyIpKSB7CiAgICAgICAgICAgIGlmICgkZW5kQ2hhciAmJiAkdGhpcy0+bWF0Y2hDaGFyKCRlbmRDaGFyLCBmYWxzZSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRzcyA9ICR0aGlzLT5jb3VudDsKICAgICAgICAgICAgaWYgKCEkZW5kQ2hhciAmJiAkdGhpcy0+ZW5kKCkpIHsKICAgICAgICAgICAgICAgICR0aGlzLT5zZWVrKCRzcyk7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJHRoaXMtPnNlZWsoJHMpOwoKICAgICAgICAkYWxsb3dWYXJzID0gJHRoaXMtPmFsbG93VmFyczsKICAgICAgICAkdGhpcy0+YWxsb3dWYXJzID0gZmFsc2U7CgogICAgICAgICRyZXMgPSAkdGhpcy0+Z2VuZXJpY0xpc3QoJG91dCwgJ3NwYWNlTGlzdCcsICcsJyk7CiAgICAgICAgJHRoaXMtPmFsbG93VmFycyA9ICRhbGxvd1ZhcnM7CgogICAgICAgIGlmICgkcmVzKSB7CiAgICAgICAgICAgIGlmICgkZW5kQ2hhciAmJiAkdGhpcy0+bWF0Y2hDaGFyKCRlbmRDaGFyLCBmYWxzZSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoISAkZW5kQ2hhciAmJiAkdGhpcy0+ZW5kKCkpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkdGhpcy0+c2Vlaygkcyk7CgogICAgICAgIGlmICgkZW5kQ2hhciAmJiAkdGhpcy0+bWF0Y2hDaGFyKCRlbmRDaGFyLCBmYWxzZSkpIHsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgLyoqCiAgICAgKiBQYXJzZSBjb21tYSBzZXBhcmF0ZWQgdmFsdWUgbGlzdAogICAgICoKICAgICAqIEBwYXJhbSBtaXhlZCAkb3V0CiAgICAgKiBAcGFyYW0tb3V0IGFycmF5fE51bWJlciAkb3V0CiAgICAgKgogICAgICogQHJldHVybiBib29sCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiB2YWx1ZUxpc3QoJiRvdXQpCiAgICB7CiAgICAgICAgJGRpc2NhcmRDb21tZW50cyA9ICR0aGlzLT5kaXNjYXJkQ29tbWVudHM7CiAgICAgICAgJHRoaXMtPmRpc2NhcmRDb21tZW50cyA9IHRydWU7CiAgICAgICAgJHJlcyA9ICR0aGlzLT5nZW5lcmljTGlzdCgkb3V0LCAnc3BhY2VMaXN0JywgJywnKTsKICAgICAgICAkdGhpcy0+ZGlzY2FyZENvbW1lbnRzID0gJGRpc2NhcmRDb21tZW50czsKCiAgICAgICAgcmV0dXJuICRyZXM7CiAgICB9CgogICAgLyoqCiAgICAgKiBQYXJzZSBhIGZ1bmN0aW9uIGNhbGwsIHdoZXJlIGV4dGVybmFscyAoKSBhcmUgcGFydCBvZiB0aGUgY2FsbAogICAgICogYW5kIG5vdCBvZiB0aGUgdmFsdWUgbGlzdAogICAgICoKICAgICAqIEBwYXJhbSBtaXhlZCAgICAgICAkb3V0CiAgICAgKiBAcGFyYW0gYm9vbCAgICAgICAgJG1hbmRhdG9yeUVuY2xvcwogICAgICogQHBhcmFtIG51bGx8c3RyaW5nICRjaGFyQWZ0ZXIKICAgICAqIEBwYXJhbSBudWxsfGJvb2wgICAkZWF0V2hpdGVTcAogICAgICogQHBhcmFtLW91dCBhcnJheXxOdW1iZXIgJG91dAogICAgICoKICAgICAqIEByZXR1cm4gYm9vbAogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gZnVuY3Rpb25DYWxsQXJndW1lbnRzTGlzdCgmJG91dCwgJG1hbmRhdG9yeUVuY2xvcyA9IHRydWUsICRjaGFyQWZ0ZXIgPSBudWxsLCAkZWF0V2hpdGVTcCA9IG51bGwpCiAgICB7CiAgICAgICAgJHMgPSAkdGhpcy0+Y291bnQ7CgogICAgICAgIGlmICgKICAgICAgICAgICAgJHRoaXMtPm1hdGNoQ2hhcignKCcpICYmCiAgICAgICAgICAgICR0aGlzLT52YWx1ZUxpc3QoJG91dCkgJiYKICAgICAgICAgICAgJHRoaXMtPm1hdGNoQ2hhcignKScpICYmCiAgICAgICAgICAgICgkY2hhckFmdGVyID8gJHRoaXMtPm1hdGNoQ2hhcigkY2hhckFmdGVyLCAkZWF0V2hpdGVTcCkgOiAkdGhpcy0+ZW5kKCkpCiAgICAgICAgKSB7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KCiAgICAgICAgaWYgKCEgJG1hbmRhdG9yeUVuY2xvcykgewogICAgICAgICAgICAkdGhpcy0+c2Vlaygkcyk7CgogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAkdGhpcy0+dmFsdWVMaXN0KCRvdXQpICYmCiAgICAgICAgICAgICAgICAoJGNoYXJBZnRlciA/ICR0aGlzLT5tYXRjaENoYXIoJGNoYXJBZnRlciwgJGVhdFdoaXRlU3ApIDogJHRoaXMtPmVuZCgpKQogICAgICAgICAgICApIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkdGhpcy0+c2Vlaygkcyk7CgogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICAvKioKICAgICAqIFBhcnNlIHNwYWNlIHNlcGFyYXRlZCB2YWx1ZSBsaXN0CiAgICAgKgogICAgICogQHBhcmFtIG1peGVkICRvdXQKICAgICAqIEBwYXJhbS1vdXQgYXJyYXl8TnVtYmVyICRvdXQKICAgICAqCiAgICAgKiBAcmV0dXJuIGJvb2wKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIHNwYWNlTGlzdCgmJG91dCkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmdlbmVyaWNMaXN0KCRvdXQsICdleHByZXNzaW9uJyk7CiAgICB9CgogICAgLyoqCiAgICAgKiBQYXJzZSBnZW5lcmljIGxpc3QKICAgICAqCiAgICAgKiBAcGFyYW0gbWl4ZWQgICRvdXQKICAgICAqIEBwYXJhbSBzdHJpbmcgJHBhcnNlSXRlbSBUaGUgbmFtZSBvZiB0aGUgbWV0aG9kIHVzZWQgdG8gcGFyc2UgaXRlbXMKICAgICAqIEBwYXJhbSBzdHJpbmcgJGRlbGltCiAgICAgKiBAcGFyYW0gYm9vbCAgICRmbGF0dGVuCiAgICAgKiBAcGFyYW0tb3V0ICgkZmxhdHRlbiBpcyBmYWxzZSA/IGFycmF5IDogYXJyYXl8TnVtYmVyKSAkb3V0CiAgICAgKgogICAgICogQHJldHVybiBib29sCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBnZW5lcmljTGlzdCgmJG91dCwgJHBhcnNlSXRlbSwgJGRlbGltID0gJycsICRmbGF0dGVuID0gdHJ1ZSkKICAgIHsKICAgICAgICAkcyAgICAgPSAkdGhpcy0+Y291bnQ7CiAgICAgICAgJGl0ZW1zID0gW107CiAgICAgICAgLyoqIEB2YXIgYXJyYXl8TnVtYmVyfG51bGwgJHZhbHVlICovCiAgICAgICAgJHZhbHVlID0gbnVsbDsKCiAgICAgICAgd2hpbGUgKCR0aGlzLT4kcGFyc2VJdGVtKCR2YWx1ZSkpIHsKICAgICAgICAgICAgJHRyYWlsaW5nX2RlbGltID0gZmFsc2U7CiAgICAgICAgICAgICRpdGVtc1tdID0gJHZhbHVlOwoKICAgICAgICAgICAgaWYgKCRkZWxpbSkgewogICAgICAgICAgICAgICAgaWYgKCEgJHRoaXMtPmxpdGVyYWwoJGRlbGltLCBcc3RybGVuKCRkZWxpbSkpKSB7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJHRyYWlsaW5nX2RlbGltID0gdHJ1ZTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGFzc2VydChcaXNfYXJyYXkoJHZhbHVlKSB8fCAkdmFsdWUgaW5zdGFuY2VvZiBOdW1iZXIpOwogICAgICAgICAgICAgICAgLy8gaWYgbm8gZGVsaW0gd2F0Y2ggdGhhdCBhIGtleXdvcmQgZGlkbid0IGVhdCB0aGUgc2luZ2xlL2RvdWJsZSBxdW90ZQogICAgICAgICAgICAgICAgLy8gZnJvbSB0aGUgZm9sbG93aW5nIHN0YXJ0aW5nIHN0cmluZwogICAgICAgICAgICAgICAgaWYgKCR2YWx1ZVswXSA9PT0gVHlwZTo6VF9LRVlXT1JEKSB7CiAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KFxpc19hcnJheSgkdmFsdWUpKTsKICAgICAgICAgICAgICAgICAgICAvKiogQHZhciBzdHJpbmcgJHdvcmQgKi8KICAgICAgICAgICAgICAgICAgICAkd29yZCA9ICR2YWx1ZVsxXTsKCiAgICAgICAgICAgICAgICAgICAgJGxhc3RfY2hhciA9IHN1YnN0cigkd29yZCwgLTEpOwoKICAgICAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmxlbigkd29yZCkgPiAxICYmCiAgICAgICAgICAgICAgICAgICAgICAgIGluX2FycmF5KCRsYXN0X2NoYXIsIFsgIiciLCAnIiddKSAmJgogICAgICAgICAgICAgICAgICAgICAgICBzdWJzdHIoJHdvcmQsIC0yLCAxKSAhPT0gJ1xcJwogICAgICAgICAgICAgICAgICAgICkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGVyZSBpcyBhIG5vbiBlc2NhcGVkIG9wZW5pbmcgcXVvdGUgaW4gdGhlIGtleXdvcmQsIHRoaXMgc2VlbXMgdW5saWtlbHkgYSBtaXN0YWtlCiAgICAgICAgICAgICAgICAgICAgICAgICR3b3JkID0gc3RyX3JlcGxhY2UoJ1xcJyAuICRsYXN0X2NoYXIsICdcXFxcJywgJHdvcmQpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RycG9zKCR3b3JkLCAkbGFzdF9jaGFyKSA8IHN0cmxlbigkd29yZCkgLSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgJGN1cnJlbnRDb3VudCA9ICR0aGlzLT5jb3VudDsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxldCdzIHRyeSB0byByZXdpbmQgdG8gcHJldmlvdXMgY2hhciBhbmQgdHJ5IGEgcGFyc2UKICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmNvdW50LS07CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluIGNhc2UgdGhlIGtleXdvcmQgYWxzbyBlYXQgc3BhY2VzCiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChzdWJzdHIoJHRoaXMtPmJ1ZmZlciwgJHRoaXMtPmNvdW50LCAxKSAhPT0gJGxhc3RfY2hhcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmNvdW50LS07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBAdmFyIGFycmF5fE51bWJlcnxudWxsICRuZXh0VmFsdWUgKi8KICAgICAgICAgICAgICAgICAgICAgICAgJG5leHRWYWx1ZSA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkdGhpcy0+JHBhcnNlSXRlbSgkbmV4dFZhbHVlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KFxpc19hcnJheSgkbmV4dFZhbHVlKSB8fCAkbmV4dFZhbHVlIGluc3RhbmNlb2YgTnVtYmVyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkbmV4dFZhbHVlWzBdID09PSBUeXBlOjpUX0tFWVdPUkQgJiYgJG5leHRWYWx1ZVsxXSA9PT0gJGxhc3RfY2hhcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJhZCB0cnksIGZvcmdldCBpdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5zZWVrKCRjdXJyZW50Q291bnQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRuZXh0VmFsdWVbMF0gIT09IFR5cGU6OlRfU1RSSU5HKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmFkIHRyeSwgZm9yZ2V0IGl0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnNlZWsoJGN1cnJlbnRDb3VudCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT0sgaXQgd2FzIGEgZ29vZCBpZGVhCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdmFsdWVbMV0gPSBzdWJzdHIoJHZhbHVlWzFdLCAwLCAtMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheV9wb3AoJGl0ZW1zKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRpdGVtc1tdID0gJHZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGl0ZW1zW10gPSAkbmV4dFZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmFkIHRyeSwgZm9yZ2V0IGl0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+c2VlaygkY3VycmVudENvdW50KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoISAkaXRlbXMpIHsKICAgICAgICAgICAgJHRoaXMtPnNlZWsoJHMpOwoKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgaWYgKCR0cmFpbGluZ19kZWxpbSkgewogICAgICAgICAgICAkaXRlbXNbXSA9IFtUeXBlOjpUX05VTExdOwogICAgICAgIH0KCiAgICAgICAgaWYgKCRmbGF0dGVuICYmIFxjb3VudCgkaXRlbXMpID09PSAxKSB7CiAgICAgICAgICAgICRvdXQgPSAkaXRlbXNbMF07CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJG91dCA9IFtUeXBlOjpUX0xJU1QsICRkZWxpbSwgJGl0ZW1zXTsKICAgICAgICB9CgogICAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIC8qKgogICAgICogUGFyc2UgZXhwcmVzc2lvbgogICAgICoKICAgICAqIEBwYXJhbSBtaXhlZCAkb3V0CiAgICAgKiBAcGFyYW0gYm9vbCAgJGxpc3RPbmx5CiAgICAgKiBAcGFyYW0gYm9vbCAgJGxvb2tGb3JFeHAKICAgICAqIEBwYXJhbS1vdXQgYXJyYXl8TnVtYmVyICRvdXQKICAgICAqCiAgICAgKiBAcmV0dXJuIGJvb2wKICAgICAqCiAgICAgKiBAcGhwc3Rhbi1pbXB1cmUKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGV4cHJlc3Npb24oJiRvdXQsICRsaXN0T25seSA9IGZhbHNlLCAkbG9va0ZvckV4cCA9IHRydWUpCiAgICB7CiAgICAgICAgJHMgPSAkdGhpcy0+Y291bnQ7CiAgICAgICAgJGRpc2NhcmQgPSAkdGhpcy0+ZGlzY2FyZENvbW1lbnRzOwogICAgICAgICR0aGlzLT5kaXNjYXJkQ29tbWVudHMgPSB0cnVlOwogICAgICAgICRhbGxvd2VkVHlwZXMgPSAoJGxpc3RPbmx5ID8gW1R5cGU6OlRfTElTVF0gOiBbVHlwZTo6VF9MSVNULCBUeXBlOjpUX01BUF0pOwoKICAgICAgICBpZiAoJHRoaXMtPm1hdGNoQ2hhcignKCcpKSB7CiAgICAgICAgICAgIGlmICgkdGhpcy0+ZW5jbG9zZWRFeHByZXNzaW9uKCRsaHMsICRzLCAnKScsICRhbGxvd2VkVHlwZXMpKSB7CiAgICAgICAgICAgICAgICBpZiAoJGxvb2tGb3JFeHApIHsKICAgICAgICAgICAgICAgICAgICAkb3V0ID0gJHRoaXMtPmV4cEhlbHBlcigkbGhzLCAwKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJG91dCA9ICRsaHM7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJHRoaXMtPmRpc2NhcmRDb21tZW50cyA9ICRkaXNjYXJkOwoKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkdGhpcy0+c2Vlaygkcyk7CiAgICAgICAgfQoKICAgICAgICBpZiAoXGluX2FycmF5KFR5cGU6OlRfTElTVCwgJGFsbG93ZWRUeXBlcykgJiYgJHRoaXMtPm1hdGNoQ2hhcignWycpKSB7CiAgICAgICAgICAgIGlmICgkdGhpcy0+ZW5jbG9zZWRFeHByZXNzaW9uKCRsaHMsICRzLCAnXScsIFtUeXBlOjpUX0xJU1RdKSkgewogICAgICAgICAgICAgICAgaWYgKCRsb29rRm9yRXhwKSB7CiAgICAgICAgICAgICAgICAgICAgJG91dCA9ICR0aGlzLT5leHBIZWxwZXIoJGxocywgMCk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICRvdXQgPSAkbGhzOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICR0aGlzLT5kaXNjYXJkQ29tbWVudHMgPSAkZGlzY2FyZDsKCiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHRoaXMtPnNlZWsoJHMpOwogICAgICAgIH0KCiAgICAgICAgaWYgKCEgJGxpc3RPbmx5ICYmICR0aGlzLT52YWx1ZSgkbGhzKSkgewogICAgICAgICAgICBpZiAoJGxvb2tGb3JFeHApIHsKICAgICAgICAgICAgICAgICRvdXQgPSAkdGhpcy0+ZXhwSGVscGVyKCRsaHMsIDApOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJG91dCA9ICRsaHM7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICR0aGlzLT5kaXNjYXJkQ29tbWVudHMgPSAkZGlzY2FyZDsKCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KCiAgICAgICAgJHRoaXMtPmRpc2NhcmRDb21tZW50cyA9ICRkaXNjYXJkOwoKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgLyoqCiAgICAgKiBQYXJzZSBleHByZXNzaW9uIHNwZWNpZmljYWxseSBjaGVja2luZyBmb3IgbGlzdHMgaW4gcGFyZW50aGVzaXMgb3IgYnJhY2tldHMKICAgICAqCiAgICAgKiBAcGFyYW0gbWl4ZWQgICAgJG91dAogICAgICogQHBhcmFtIGludCAgICAgICRzCiAgICAgKiBAcGFyYW0gc3RyaW5nICAgJGNsb3NpbmdQYXJlbgogICAgICogQHBhcmFtIHN0cmluZ1tdICRhbGxvd2VkVHlwZXMKICAgICAqIEBwYXJhbS1vdXQgYXJyYXl8TnVtYmVyICRvdXQKICAgICAqCiAgICAgKiBAcmV0dXJuIGJvb2wKICAgICAqCiAgICAgKiBAcGhwc3Rhbi1wYXJhbSBhcnJheTxUeXBlOjoqPiAkYWxsb3dlZFR5cGVzCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBlbmNsb3NlZEV4cHJlc3Npb24oJiRvdXQsICRzLCAkY2xvc2luZ1BhcmVuID0gJyknLCAkYWxsb3dlZFR5cGVzID0gW1R5cGU6OlRfTElTVCwgVHlwZTo6VF9NQVBdKQogICAgewogICAgICAgIGlmICgkdGhpcy0+bWF0Y2hDaGFyKCRjbG9zaW5nUGFyZW4pICYmIFxpbl9hcnJheShUeXBlOjpUX0xJU1QsICRhbGxvd2VkVHlwZXMpKSB7CiAgICAgICAgICAgICRvdXQgPSBbVHlwZTo6VF9MSVNULCAnJywgW11dOwoKICAgICAgICAgICAgc3dpdGNoICgkY2xvc2luZ1BhcmVuKSB7CiAgICAgICAgICAgICAgICBjYXNlICcpJzoKICAgICAgICAgICAgICAgICAgICAkb3V0WydlbmNsb3NpbmcnXSA9ICdwYXJlbnQnOyAvLyBwYXJlbnRoZXNpcyBsaXN0CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgY2FzZSAnXSc6CiAgICAgICAgICAgICAgICAgICAgJG91dFsnZW5jbG9zaW5nJ10gPSAnYnJhY2tldCc7IC8vIGJyYWNrZXRlZCBsaXN0CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KCiAgICAgICAgaWYgKAogICAgICAgICAgICAkdGhpcy0+dmFsdWVMaXN0KCRvdXQpICYmCiAgICAgICAgICAgICR0aGlzLT5tYXRjaENoYXIoJGNsb3NpbmdQYXJlbikgJiYgISAoJGNsb3NpbmdQYXJlbiA9PT0gJyknICYmCiAgICAgICAgICAgIFxpbl9hcnJheSgkb3V0WzBdLCBbVHlwZTo6VF9FWFBSRVNTSU9OLCBUeXBlOjpUX1VOQVJZXSkpICYmCiAgICAgICAgICAgIFxpbl9hcnJheShUeXBlOjpUX0xJU1QsICRhbGxvd2VkVHlwZXMpCiAgICAgICAgKSB7CiAgICAgICAgICAgIGlmICgkb3V0WzBdICE9PSBUeXBlOjpUX0xJU1QgfHwgISBlbXB0eSgkb3V0WydlbmNsb3NpbmcnXSkpIHsKICAgICAgICAgICAgICAgICRvdXQgPSBbVHlwZTo6VF9MSVNULCAnJywgWyRvdXRdXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgc3dpdGNoICgkY2xvc2luZ1BhcmVuKSB7CiAgICAgICAgICAgICAgICBjYXNlICcpJzoKICAgICAgICAgICAgICAgICAgICAkb3V0WydlbmNsb3NpbmcnXSA9ICdwYXJlbnQnOyAvLyBwYXJlbnRoZXNpcyBsaXN0CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgY2FzZSAnXSc6CiAgICAgICAgICAgICAgICAgICAgJG91dFsnZW5jbG9zaW5nJ10gPSAnYnJhY2tldCc7IC8vIGJyYWNrZXRlZCBsaXN0CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KCiAgICAgICAgJHRoaXMtPnNlZWsoJHMpOwoKICAgICAgICBpZiAoXGluX2FycmF5KFR5cGU6OlRfTUFQLCAkYWxsb3dlZFR5cGVzKSAmJiAkdGhpcy0+bWFwKCRvdXQpKSB7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIC8qKgogICAgICogUGFyc2UgbGVmdC1oYW5kIHNpZGUgb2Ygc3ViZXhwcmVzc2lvbgogICAgICoKICAgICAqIEBwYXJhbSBhcnJheXxOdW1iZXIgJGxocwogICAgICogQHBhcmFtIGludCAgICAgICAgICAkbWluUAogICAgICoKICAgICAqIEByZXR1cm4gYXJyYXl8TnVtYmVyCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBleHBIZWxwZXIoJGxocywgJG1pblApCiAgICB7CiAgICAgICAgJG9wZXJhdG9ycyA9IHN0YXRpYzo6JG9wZXJhdG9yUGF0dGVybjsKCiAgICAgICAgJHNzID0gJHRoaXMtPmNvdW50OwogICAgICAgICR3aGl0ZUJlZm9yZSA9IGlzc2V0KCR0aGlzLT5idWZmZXJbJHRoaXMtPmNvdW50IC0gMV0pICYmCiAgICAgICAgICAgIGN0eXBlX3NwYWNlKCR0aGlzLT5idWZmZXJbJHRoaXMtPmNvdW50IC0gMV0pOwoKICAgICAgICB3aGlsZSAoJHRoaXMtPm1hdGNoKCRvcGVyYXRvcnMsICRtLCBmYWxzZSkgJiYgc3RhdGljOjokcHJlY2VkZW5jZVtzdHJ0b2xvd2VyKCRtWzFdKV0gPj0gJG1pblApIHsKICAgICAgICAgICAgJHdoaXRlQWZ0ZXIgPSBpc3NldCgkdGhpcy0+YnVmZmVyWyR0aGlzLT5jb3VudF0pICYmCiAgICAgICAgICAgICAgICBjdHlwZV9zcGFjZSgkdGhpcy0+YnVmZmVyWyR0aGlzLT5jb3VudF0pOwogICAgICAgICAgICAkdmFyQWZ0ZXIgPSBpc3NldCgkdGhpcy0+YnVmZmVyWyR0aGlzLT5jb3VudF0pICYmCiAgICAgICAgICAgICAgICAkdGhpcy0+YnVmZmVyWyR0aGlzLT5jb3VudF0gPT09ICckJzsKCiAgICAgICAgICAgICR0aGlzLT53aGl0ZXNwYWNlKCk7CgogICAgICAgICAgICAkb3AgPSAkbVsxXTsKCiAgICAgICAgICAgIC8vIGRvbid0IHR1cm4gbmVnYXRpdmUgbnVtYmVycyBpbnRvIGV4cHJlc3Npb25zCiAgICAgICAgICAgIGlmICgkb3AgPT09ICctJyAmJiAkd2hpdGVCZWZvcmUgJiYgISAkd2hpdGVBZnRlciAmJiAhICR2YXJBZnRlcikgewogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghICR0aGlzLT52YWx1ZSgkcmhzKSAmJiAhICR0aGlzLT5leHByZXNzaW9uKCRyaHMsIHRydWUsIGZhbHNlKSkgewogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICgkb3AgPT09ICctJyAmJiAhICR3aGl0ZUFmdGVyICYmICRyaHNbMF0gPT09IFR5cGU6OlRfS0VZV09SRCkgewogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGNvbnN1bWUgaGlnaGVyLXByZWNlZGVuY2Ugb3BlcmF0b3JzIG9uIHRoZSByaWdodC1oYW5kIHNpZGUKICAgICAgICAgICAgJHJocyA9ICR0aGlzLT5leHBIZWxwZXIoJHJocywgc3RhdGljOjokcHJlY2VkZW5jZVtzdHJ0b2xvd2VyKCRvcCldICsgMSk7CgogICAgICAgICAgICAkbGhzID0gW1R5cGU6OlRfRVhQUkVTU0lPTiwgJG9wLCAkbGhzLCAkcmhzLCAkdGhpcy0+aW5QYXJlbnMsICR3aGl0ZUJlZm9yZSwgJHdoaXRlQWZ0ZXJdOwoKICAgICAgICAgICAgJHNzID0gJHRoaXMtPmNvdW50OwogICAgICAgICAgICAkd2hpdGVCZWZvcmUgPSBpc3NldCgkdGhpcy0+YnVmZmVyWyR0aGlzLT5jb3VudCAtIDFdKSAmJgogICAgICAgICAgICAgICAgY3R5cGVfc3BhY2UoJHRoaXMtPmJ1ZmZlclskdGhpcy0+Y291bnQgLSAxXSk7CiAgICAgICAgfQoKICAgICAgICAkdGhpcy0+c2Vlaygkc3MpOwoKICAgICAgICByZXR1cm4gJGxoczsKICAgIH0KCiAgICAvKioKICAgICAqIFBhcnNlIHZhbHVlCiAgICAgKgogICAgICogQHBhcmFtIG1peGVkICRvdXQKICAgICAqIEBwYXJhbS1vdXQgYXJyYXl8TnVtYmVyICRvdXQKICAgICAqCiAgICAgKiBAcmV0dXJuIGJvb2wKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIHZhbHVlKCYkb3V0KQogICAgewogICAgICAgIGlmICghIGlzc2V0KCR0aGlzLT5idWZmZXJbJHRoaXMtPmNvdW50XSkpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgJHMgPSAkdGhpcy0+Y291bnQ7CiAgICAgICAgJGNoYXIgPSAkdGhpcy0+YnVmZmVyWyR0aGlzLT5jb3VudF07CgogICAgICAgIGlmICgKICAgICAgICAgICAgJHRoaXMtPmxpdGVyYWwoJ3VybCgnLCA0KSAmJgogICAgICAgICAgICAkdGhpcy0+bWF0Y2goJ2RhdGE6KFthLXpdKylcLyhbYS16MC05ListXSspO2Jhc2U2NCwnLCAkbSwgZmFsc2UpCiAgICAgICAgKSB7CiAgICAgICAgICAgICRsZW4gPSBzdHJzcG4oCiAgICAgICAgICAgICAgICAkdGhpcy0+YnVmZmVyLAogICAgICAgICAgICAgICAgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd5eHowMTIzNDU2Nzg5Ky89JywKICAgICAgICAgICAgICAgICR0aGlzLT5jb3VudAogICAgICAgICAgICApOwoKICAgICAgICAgICAgJHRoaXMtPmNvdW50ICs9ICRsZW47CgogICAgICAgICAgICBpZiAoJHRoaXMtPm1hdGNoQ2hhcignKScpKSB7CiAgICAgICAgICAgICAgICAkY29udGVudCA9IHN1YnN0cigkdGhpcy0+YnVmZmVyLCAkcywgJHRoaXMtPmNvdW50IC0gJHMpOwogICAgICAgICAgICAgICAgJG91dCA9IFtUeXBlOjpUX0tFWVdPUkQsICRjb250ZW50XTsKCiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJHRoaXMtPnNlZWsoJHMpOwoKICAgICAgICBpZiAoCiAgICAgICAgICAgICR0aGlzLT5saXRlcmFsKCd1cmwoJywgNCwgZmFsc2UpICYmCiAgICAgICAgICAgICR0aGlzLT5tYXRjaCgnXHMqKFwvXC9bXlxzXCldKylccyonLCAkbSkKICAgICAgICApIHsKICAgICAgICAgICAgJGNvbnRlbnQgPSAndXJsKCcgLiAkbVsxXTsKCiAgICAgICAgICAgIGlmICgkdGhpcy0+bWF0Y2hDaGFyKCcpJykpIHsKICAgICAgICAgICAgICAgICRjb250ZW50IC49ICcpJzsKICAgICAgICAgICAgICAgICRvdXQgPSBbVHlwZTo6VF9LRVlXT1JELCAkY29udGVudF07CgogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICR0aGlzLT5zZWVrKCRzKTsKCiAgICAgICAgLy8gbm90CiAgICAgICAgaWYgKCRjaGFyID09PSAnbicgJiYgJHRoaXMtPmxpdGVyYWwoJ25vdCcsIDMsIGZhbHNlKSkgewogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAkdGhpcy0+d2hpdGVzcGFjZSgpICYmCiAgICAgICAgICAgICAgICAkdGhpcy0+dmFsdWUoJGlubmVyKQogICAgICAgICAgICApIHsKICAgICAgICAgICAgICAgICRvdXQgPSBbVHlwZTo6VF9VTkFSWSwgJ25vdCcsICRpbm5lciwgJHRoaXMtPmluUGFyZW5zXTsKCiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHRoaXMtPnNlZWsoJHMpOwoKICAgICAgICAgICAgaWYgKCR0aGlzLT5wYXJlblZhbHVlKCRpbm5lcikpIHsKICAgICAgICAgICAgICAgICRvdXQgPSBbVHlwZTo6VF9VTkFSWSwgJ25vdCcsICRpbm5lciwgJHRoaXMtPmluUGFyZW5zXTsKCiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHRoaXMtPnNlZWsoJHMpOwogICAgICAgIH0KCiAgICAgICAgLy8gYWRkaXRpb24KICAgICAgICBpZiAoJGNoYXIgPT09ICcrJykgewogICAgICAgICAgICAkdGhpcy0+Y291bnQrKzsKCiAgICAgICAgICAgICRmb2xsb3dfd2hpdGUgPSAkdGhpcy0+d2hpdGVzcGFjZSgpOwoKICAgICAgICAgICAgaWYgKCR0aGlzLT52YWx1ZSgkaW5uZXIpKSB7CiAgICAgICAgICAgICAgICAkb3V0ID0gW1R5cGU6OlRfVU5BUlksICcrJywgJGlubmVyLCAkdGhpcy0+aW5QYXJlbnNdOwoKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoJGZvbGxvd193aGl0ZSkgewogICAgICAgICAgICAgICAgJG91dCA9IFtUeXBlOjpUX0tFWVdPUkQsICRjaGFyXTsKICAgICAgICAgICAgICAgIHJldHVybiAgdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHRoaXMtPnNlZWsoJHMpOwoKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgLy8gbmVnYXRpb24KICAgICAgICBpZiAoJGNoYXIgPT09ICctJykgewogICAgICAgICAgICBpZiAoJHRoaXMtPmN1c3RvbVByb3BlcnR5KCRvdXQpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHRoaXMtPmNvdW50Kys7CgogICAgICAgICAgICAkZm9sbG93X3doaXRlID0gJHRoaXMtPndoaXRlc3BhY2UoKTsKCiAgICAgICAgICAgIGlmICgkdGhpcy0+dmFyaWFibGUoJGlubmVyKSB8fCAkdGhpcy0+dW5pdCgkaW5uZXIpIHx8ICR0aGlzLT5wYXJlblZhbHVlKCRpbm5lcikpIHsKICAgICAgICAgICAgICAgICRvdXQgPSBbVHlwZTo6VF9VTkFSWSwgJy0nLCAkaW5uZXIsICR0aGlzLT5pblBhcmVuc107CgogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICR0aGlzLT5rZXl3b3JkKCRpbm5lcikgJiYKICAgICAgICAgICAgICAgICEgJHRoaXMtPmZ1bmMoJGlubmVyLCAkb3V0KQogICAgICAgICAgICApIHsKICAgICAgICAgICAgICAgICRvdXQgPSBbVHlwZTo6VF9VTkFSWSwgJy0nLCAkaW5uZXIsICR0aGlzLT5pblBhcmVuc107CgogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICgkZm9sbG93X3doaXRlKSB7CiAgICAgICAgICAgICAgICAkb3V0ID0gW1R5cGU6OlRfS0VZV09SRCwgJGNoYXJdOwoKICAgICAgICAgICAgICAgIHJldHVybiAgdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHRoaXMtPnNlZWsoJHMpOwogICAgICAgIH0KCiAgICAgICAgLy8gcGFyZW4KICAgICAgICBpZiAoJGNoYXIgPT09ICcoJyAmJiAkdGhpcy0+cGFyZW5WYWx1ZSgkb3V0KSkgewogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CgogICAgICAgIGlmICgkY2hhciA9PT0gJyMnKSB7CiAgICAgICAgICAgIGlmICgkdGhpcy0+aW50ZXJwb2xhdGlvbigkb3V0KSB8fCAkdGhpcy0+Y29sb3IoJG91dCkpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkdGhpcy0+Y291bnQrKzsKCiAgICAgICAgICAgIGlmICgkdGhpcy0+a2V5d29yZCgka2V5d29yZCkpIHsKICAgICAgICAgICAgICAgICRvdXQgPSBbVHlwZTo6VF9LRVlXT1JELCAnIycgLiAka2V5d29yZF07CgogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICR0aGlzLT5jb3VudC0tOwogICAgICAgIH0KCiAgICAgICAgaWYgKCR0aGlzLT5tYXRjaENoYXIoJyYnLCB0cnVlKSkgewogICAgICAgICAgICAkb3V0ID0gW1R5cGU6OlRfU0VMRl07CgogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CgogICAgICAgIGlmICgkY2hhciA9PT0gJyQnICYmICR0aGlzLT52YXJpYWJsZSgkb3V0KSkgewogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CgogICAgICAgIGlmICgkY2hhciA9PT0gJ3AnICYmICR0aGlzLT5wcm9naWQoJG91dCkpIHsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQoKICAgICAgICBpZiAoKCRjaGFyID09PSAnIicgfHwgJGNoYXIgPT09ICInIikgJiYgJHRoaXMtPnN0cmluZygkb3V0KSkgewogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CgogICAgICAgIGlmICgkdGhpcy0+dW5pdCgkb3V0KSkgewogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CgogICAgICAgIC8vIHVuaWNvZGUgcmFuZ2Ugd2l0aCB3aWxkY2FyZHMKICAgICAgICBpZiAoCiAgICAgICAgICAgICR0aGlzLT5saXRlcmFsKCdVKycsIDIpICYmCiAgICAgICAgICAgICR0aGlzLT5tYXRjaCgnXD8rfChbMC05QS1GXSsoXD8rfCgtWzAtOUEtRl0rKSk/KScsICRtLCBmYWxzZSkKICAgICAgICApIHsKICAgICAgICAgICAgJHVuaWNvZGUgPSBleHBsb2RlKCctJywgJG1bMF0pOwogICAgICAgICAgICBpZiAoc3RybGVuKHJlc2V0KCR1bmljb2RlKSkgPD0gNiAmJiBzdHJsZW4oZW5kKCR1bmljb2RlKSkgPD0gNikgewogICAgICAgICAgICAgICAgJG91dCA9IFtUeXBlOjpUX0tFWVdPUkQsICdVKycgLiAkbVswXV07CgogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJHRoaXMtPmNvdW50IC09IHN0cmxlbigkbVswXSkgKyAyOwogICAgICAgIH0KCiAgICAgICAgaWYgKCR0aGlzLT5rZXl3b3JkKCRrZXl3b3JkLCBmYWxzZSkpIHsKICAgICAgICAgICAgaWYgKCR0aGlzLT5mdW5jKCRrZXl3b3JkLCAkb3V0KSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICR0aGlzLT53aGl0ZXNwYWNlKCk7CgogICAgICAgICAgICBpZiAoJGtleXdvcmQgPT09ICdudWxsJykgewogICAgICAgICAgICAgICAgJG91dCA9IFtUeXBlOjpUX05VTExdOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJG91dCA9IFtUeXBlOjpUX0tFWVdPUkQsICRrZXl3b3JkXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgLyoqCiAgICAgKiBQYXJzZSBwYXJlbnRoZXNpemVkIHZhbHVlCiAgICAgKgogICAgICogQHBhcmFtIG1peGVkICRvdXQKICAgICAqIEBwYXJhbS1vdXQgYXJyYXl8TnVtYmVyICRvdXQKICAgICAqCiAgICAgKiBAcmV0dXJuIGJvb2wKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIHBhcmVuVmFsdWUoJiRvdXQpCiAgICB7CiAgICAgICAgJHMgPSAkdGhpcy0+Y291bnQ7CgogICAgICAgICRpblBhcmVucyA9ICR0aGlzLT5pblBhcmVuczsKCiAgICAgICAgaWYgKCR0aGlzLT5tYXRjaENoYXIoJygnKSkgewogICAgICAgICAgICBpZiAoJHRoaXMtPm1hdGNoQ2hhcignKScpKSB7CiAgICAgICAgICAgICAgICAkb3V0ID0gW1R5cGU6OlRfTElTVCwgJycsIFtdXTsKCiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHRoaXMtPmluUGFyZW5zID0gdHJ1ZTsKCiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICR0aGlzLT5leHByZXNzaW9uKCRleHApICYmCiAgICAgICAgICAgICAgICAkdGhpcy0+bWF0Y2hDaGFyKCcpJykKICAgICAgICAgICAgKSB7CiAgICAgICAgICAgICAgICAkb3V0ID0gJGV4cDsKICAgICAgICAgICAgICAgICR0aGlzLT5pblBhcmVucyA9ICRpblBhcmVuczsKCiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJHRoaXMtPmluUGFyZW5zID0gJGluUGFyZW5zOwogICAgICAgICR0aGlzLT5zZWVrKCRzKTsKCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIC8qKgogICAgICogUGFyc2UgInByb2dpZDoiCiAgICAgKgogICAgICogQHBhcmFtIGFycmF5ICRvdXQKICAgICAqCiAgICAgKiBAcmV0dXJuIGJvb2wKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIHByb2dpZCgmJG91dCkKICAgIHsKICAgICAgICAkcyA9ICR0aGlzLT5jb3VudDsKCiAgICAgICAgaWYgKAogICAgICAgICAgICAkdGhpcy0+bGl0ZXJhbCgncHJvZ2lkOicsIDcsIGZhbHNlKSAmJgogICAgICAgICAgICAkdGhpcy0+b3BlblN0cmluZygnKCcsICRmbikgJiYKICAgICAgICAgICAgJHRoaXMtPm1hdGNoQ2hhcignKCcpCiAgICAgICAgKSB7CiAgICAgICAgICAgICR0aGlzLT5vcGVuU3RyaW5nKCcpJywgJGFyZ3MsICcoJyk7CgogICAgICAgICAgICBpZiAoJHRoaXMtPm1hdGNoQ2hhcignKScpKSB7CiAgICAgICAgICAgICAgICAkb3V0ID0gW1R5cGU6OlRfU1RSSU5HLCAnJywgWwogICAgICAgICAgICAgICAgICAgICdwcm9naWQ6JywgJGZuLCAnKCcsICRhcmdzLCAnKScKICAgICAgICAgICAgICAgIF1dOwoKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkdGhpcy0+c2Vlaygkcyk7CgogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICAvKioKICAgICAqIFBhcnNlIGZ1bmN0aW9uIGNhbGwKICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lCiAgICAgKiBAcGFyYW0gbWl4ZWQgICRmdW5jCiAgICAgKiBAcGFyYW0tb3V0IGFycmF5ICRmdW5jCiAgICAgKgogICAgICogQHJldHVybiBib29sCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBmdW5jKCRuYW1lLCAmJGZ1bmMpCiAgICB7CiAgICAgICAgJHMgPSAkdGhpcy0+Y291bnQ7CgogICAgICAgIGlmICgkdGhpcy0+bWF0Y2hDaGFyKCcoJykpIHsKICAgICAgICAgICAgaWYgKCRuYW1lID09PSAnYWxwaGEnICYmICR0aGlzLT5hcmd1bWVudExpc3QoJGFyZ3MpKSB7CiAgICAgICAgICAgICAgICAkZnVuYyA9IFtUeXBlOjpUX0ZVTkNUSU9OLCAkbmFtZSwgW1R5cGU6OlRfU1RSSU5HLCAnJywgJGFyZ3NdXTsKCiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCRuYW1lICE9PSAnZXhwcmVzc2lvbicgJiYgISBwcmVnX21hdGNoKCcvXigtW2Etel0rLSk/Y2FsYyQvJywgJG5hbWUpKSB7CiAgICAgICAgICAgICAgICAkc3MgPSAkdGhpcy0+Y291bnQ7CgogICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICR0aGlzLT5hcmdWYWx1ZXMoJGFyZ3MpICYmCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPm1hdGNoQ2hhcignKScpCiAgICAgICAgICAgICAgICApIHsKICAgICAgICAgICAgICAgICAgICBpZiAoc3RydG9sb3dlcigkbmFtZSkgPT09ICd2YXInICYmIFxjb3VudCgkYXJncykgPT09IDIgJiYgJGFyZ3NbMV1bMF0gPT09IFR5cGU6OlRfTlVMTCkgewogICAgICAgICAgICAgICAgICAgICAgICAkYXJnc1sxXSA9IFtudWxsLCBbVHlwZTo6VF9TVFJJTkcsICcnLCBbJyAnXV0sIGZhbHNlXTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICRmdW5jID0gW1R5cGU6OlRfRlVOQ1RJT05fQ0FMTCwgJG5hbWUsICRhcmdzXTsKCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJHRoaXMtPnNlZWsoJHNzKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgKCR0aGlzLT5vcGVuU3RyaW5nKCcpJywgJHN0ciwgJygnKSB8fCB0cnVlKSAmJgogICAgICAgICAgICAgICAgJHRoaXMtPm1hdGNoQ2hhcignKScpCiAgICAgICAgICAgICkgewogICAgICAgICAgICAgICAgJGFyZ3MgPSBbXTsKCiAgICAgICAgICAgICAgICBpZiAoISBlbXB0eSgkc3RyKSkgewogICAgICAgICAgICAgICAgICAgICRhcmdzW10gPSBbbnVsbCwgW1R5cGU6OlRfU1RSSU5HLCAnJywgWyRzdHJdXV07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJGZ1bmMgPSBbVHlwZTo6VF9GVU5DVElPTl9DQUxMLCAkbmFtZSwgJGFyZ3NdOwoKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkdGhpcy0+c2Vlaygkcyk7CgogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICAvKioKICAgICAqIFBhcnNlIGZ1bmN0aW9uIGNhbGwgYXJndW1lbnQgbGlzdAogICAgICoKICAgICAqIEBwYXJhbSBhcnJheSAkb3V0CiAgICAgKgogICAgICogQHJldHVybiBib29sCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBhcmd1bWVudExpc3QoJiRvdXQpCiAgICB7CiAgICAgICAgJHMgPSAkdGhpcy0+Y291bnQ7CiAgICAgICAgJHRoaXMtPm1hdGNoQ2hhcignKCcpOwoKICAgICAgICAkYXJncyA9IFtdOwoKICAgICAgICB3aGlsZSAoJHRoaXMtPmtleXdvcmQoJHZhcikpIHsKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJHRoaXMtPm1hdGNoQ2hhcignPScpICYmCiAgICAgICAgICAgICAgICAkdGhpcy0+ZXhwcmVzc2lvbigkZXhwKQogICAgICAgICAgICApIHsKICAgICAgICAgICAgICAgICRhcmdzW10gPSBbVHlwZTo6VF9TVFJJTkcsICcnLCBbJHZhciAuICc9J11dOwogICAgICAgICAgICAgICAgJGFyZyA9ICRleHA7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJGFyZ3NbXSA9ICRhcmc7CgogICAgICAgICAgICBpZiAoISAkdGhpcy0+bWF0Y2hDaGFyKCcsJykpIHsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkYXJnc1tdID0gW1R5cGU6OlRfU1RSSU5HLCAnJywgWycsICddXTsKICAgICAgICB9CgogICAgICAgIGlmICghICR0aGlzLT5tYXRjaENoYXIoJyknKSB8fCAhICRhcmdzKSB7CiAgICAgICAgICAgICR0aGlzLT5zZWVrKCRzKTsKCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CgogICAgICAgICRvdXQgPSAkYXJnczsKCiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgLyoqCiAgICAgKiBQYXJzZSBtaXhpbi9mdW5jdGlvbiBkZWZpbml0aW9uICBhcmd1bWVudCBsaXN0CiAgICAgKgogICAgICogQHBhcmFtIG1peGVkICRvdXQKICAgICAqIEBwYXJhbS1vdXQgbGlzdDxhcnJheXtzdHJpbmcsIGFycmF5fE51bWJlcnxudWxsLCBib29sfT4gJG91dAogICAgICoKICAgICAqIEByZXR1cm4gYm9vbAogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gYXJndW1lbnREZWYoJiRvdXQpCiAgICB7CiAgICAgICAgJHMgPSAkdGhpcy0+Y291bnQ7CiAgICAgICAgJHRoaXMtPm1hdGNoQ2hhcignKCcpOwoKICAgICAgICAkYXJncyA9IFtdOwoKICAgICAgICB3aGlsZSAoJHRoaXMtPnZhcmlhYmxlKCR2YXIpKSB7CiAgICAgICAgICAgICRhcmcgPSBbJHZhclsxXSwgbnVsbCwgZmFsc2VdOwoKICAgICAgICAgICAgJHNzID0gJHRoaXMtPmNvdW50OwoKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJHRoaXMtPm1hdGNoQ2hhcignOicpICYmCiAgICAgICAgICAgICAgICAkdGhpcy0+Z2VuZXJpY0xpc3QoJGRlZmF1bHRWYWwsICdleHByZXNzaW9uJywgJycsIHRydWUpCiAgICAgICAgICAgICkgewogICAgICAgICAgICAgICAgJGFyZ1sxXSA9ICRkZWZhdWx0VmFsOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJHRoaXMtPnNlZWsoJHNzKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHNzID0gJHRoaXMtPmNvdW50OwoKICAgICAgICAgICAgaWYgKCR0aGlzLT5saXRlcmFsKCcuLi4nLCAzKSkgewogICAgICAgICAgICAgICAgJHNzcyA9ICR0aGlzLT5jb3VudDsKCiAgICAgICAgICAgICAgICBpZiAoISAkdGhpcy0+bWF0Y2hDaGFyKCcpJykpIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyAkdGhpcy0+cGFyc2VFcnJvcignLi4uIGhhcyB0byBiZSBhZnRlciB0aGUgZmluYWwgYXJndW1lbnQnKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkYXJnWzJdID0gdHJ1ZTsKCiAgICAgICAgICAgICAgICAkdGhpcy0+c2Vlaygkc3NzKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICR0aGlzLT5zZWVrKCRzcyk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRhcmdzW10gPSAkYXJnOwoKICAgICAgICAgICAgaWYgKCEgJHRoaXMtPm1hdGNoQ2hhcignLCcpKSB7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCEgJHRoaXMtPm1hdGNoQ2hhcignKScpKSB7CiAgICAgICAgICAgICR0aGlzLT5zZWVrKCRzKTsKCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CgogICAgICAgICRvdXQgPSAkYXJnczsKCiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgLyoqCiAgICAgKiBQYXJzZSBtYXAKICAgICAqCiAgICAgKiBAcGFyYW0gbWl4ZWQgJG91dAogICAgICogQHBhcmFtLW91dCBhcnJheSAkb3V0CiAgICAgKgogICAgICogQHJldHVybiBib29sCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBtYXAoJiRvdXQpCiAgICB7CiAgICAgICAgJHMgPSAkdGhpcy0+Y291bnQ7CgogICAgICAgIGlmICghICR0aGlzLT5tYXRjaENoYXIoJygnKSkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICAka2V5cyA9IFtdOwogICAgICAgICR2YWx1ZXMgPSBbXTsKCiAgICAgICAgd2hpbGUgKAogICAgICAgICAgICAkdGhpcy0+Z2VuZXJpY0xpc3QoJGtleSwgJ2V4cHJlc3Npb24nLCAnJywgdHJ1ZSkgJiYKICAgICAgICAgICAgJHRoaXMtPm1hdGNoQ2hhcignOicpICYmCiAgICAgICAgICAgICR0aGlzLT5nZW5lcmljTGlzdCgkdmFsdWUsICdleHByZXNzaW9uJywgJycsIHRydWUpCiAgICAgICAgKSB7CiAgICAgICAgICAgICRrZXlzW10gPSAka2V5OwogICAgICAgICAgICAkdmFsdWVzW10gPSAkdmFsdWU7CgogICAgICAgICAgICBpZiAoISAkdGhpcy0+bWF0Y2hDaGFyKCcsJykpIHsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoISAka2V5cyB8fCAhICR0aGlzLT5tYXRjaENoYXIoJyknKSkgewogICAgICAgICAgICAkdGhpcy0+c2Vlaygkcyk7CgogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICAkb3V0ID0gW1R5cGU6OlRfTUFQLCAka2V5cywgJHZhbHVlc107CgogICAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIC8qKgogICAgICogUGFyc2UgY29sb3IKICAgICAqCiAgICAgKiBAcGFyYW0gbWl4ZWQgJG91dAogICAgICogQHBhcmFtLW91dCBhcnJheSAkb3V0CiAgICAgKgogICAgICogQHJldHVybiBib29sCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBjb2xvcigmJG91dCkKICAgIHsKICAgICAgICAkcyA9ICR0aGlzLT5jb3VudDsKCiAgICAgICAgaWYgKCR0aGlzLT5tYXRjaCgnKCMoWzAtOWEtZl0rKVxiKScsICRtKSkgewogICAgICAgICAgICBpZiAoXGluX2FycmF5KFxzdHJsZW4oJG1bMl0pLCBbMyw0LDYsOF0pKSB7CiAgICAgICAgICAgICAgICAkb3V0ID0gW1R5cGU6OlRfS0VZV09SRCwgJG1bMF1dOwoKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkdGhpcy0+c2Vlaygkcyk7CgogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgLyoqCiAgICAgKiBQYXJzZSBudW1iZXIgd2l0aCB1bml0CiAgICAgKgogICAgICogQHBhcmFtIG1peGVkICR1bml0CiAgICAgKiBAcGFyYW0tb3V0IE51bWJlciAkdW5pdAogICAgICoKICAgICAqIEByZXR1cm4gYm9vbAogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gdW5pdCgmJHVuaXQpCiAgICB7CiAgICAgICAgJHMgPSAkdGhpcy0+Y291bnQ7CgogICAgICAgIGlmICgkdGhpcy0+bWF0Y2goJyhbMC05XSooXC4pP1swLTldKykoWyVhLXpBLVpdKyk/JywgJG0sIGZhbHNlKSkgewogICAgICAgICAgICBpZiAoXHN0cmxlbigkdGhpcy0+YnVmZmVyKSA9PT0gJHRoaXMtPmNvdW50IHx8ICEgY3R5cGVfZGlnaXQoJHRoaXMtPmJ1ZmZlclskdGhpcy0+Y291bnRdKSkgewogICAgICAgICAgICAgICAgJHRoaXMtPndoaXRlc3BhY2UoKTsKCiAgICAgICAgICAgICAgICAkdW5pdCA9IG5ldyBOb2RlXE51bWJlcigkbVsxXSwgZW1wdHkoJG1bM10pID8gJycgOiAkbVszXSk7CgogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICR0aGlzLT5zZWVrKCRzKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICAvKioKICAgICAqIFBhcnNlIHN0cmluZwogICAgICoKICAgICAqIEBwYXJhbSBhcnJheSAkb3V0CiAgICAgKiBAcGFyYW0gYm9vbCAgJGtlZXBEZWxpbVdpdGhJbnRlcnBvbGF0aW9uCiAgICAgKgogICAgICogQHJldHVybiBib29sCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBzdHJpbmcoJiRvdXQsICRrZWVwRGVsaW1XaXRoSW50ZXJwb2xhdGlvbiA9IGZhbHNlKQogICAgewogICAgICAgICRzID0gJHRoaXMtPmNvdW50OwoKICAgICAgICBpZiAoJHRoaXMtPm1hdGNoQ2hhcignIicsIGZhbHNlKSkgewogICAgICAgICAgICAkZGVsaW0gPSAnIic7CiAgICAgICAgfSBlbHNlaWYgKCR0aGlzLT5tYXRjaENoYXIoIiciLCBmYWxzZSkpIHsKICAgICAgICAgICAgJGRlbGltID0gIiciOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CgogICAgICAgICRjb250ZW50ID0gW107CiAgICAgICAgJG9sZFdoaXRlID0gJHRoaXMtPmVhdFdoaXRlRGVmYXVsdDsKICAgICAgICAkdGhpcy0+ZWF0V2hpdGVEZWZhdWx0ID0gZmFsc2U7CiAgICAgICAgJGhhc0ludGVycG9sYXRpb24gPSBmYWxzZTsKCiAgICAgICAgd2hpbGUgKCR0aGlzLT5tYXRjaFN0cmluZygkbSwgJGRlbGltKSkgewogICAgICAgICAgICBpZiAoJG1bMV0gIT09ICcnKSB7CiAgICAgICAgICAgICAgICAkY29udGVudFtdID0gJG1bMV07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICgkbVsyXSA9PT0gJyN7JykgewogICAgICAgICAgICAgICAgJHRoaXMtPmNvdW50IC09IFxzdHJsZW4oJG1bMl0pOwoKICAgICAgICAgICAgICAgIGlmICgkdGhpcy0+aW50ZXJwb2xhdGlvbigkaW50ZXIsIGZhbHNlKSkgewogICAgICAgICAgICAgICAgICAgICRjb250ZW50W10gPSAkaW50ZXI7CiAgICAgICAgICAgICAgICAgICAgJGhhc0ludGVycG9sYXRpb24gPSB0cnVlOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+Y291bnQgKz0gXHN0cmxlbigkbVsyXSk7CiAgICAgICAgICAgICAgICAgICAgJGNvbnRlbnRbXSA9ICcjeyc7IC8vIGlnbm9yZSBpdAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2VpZiAoJG1bMl0gPT09ICJcciIpIHsKICAgICAgICAgICAgICAgICRjb250ZW50W10gPSBjaHIoMTApOwogICAgICAgICAgICAgICAgLy8gVE9ETyA6IHdhcm5pbmcKICAgICAgICAgICAgICAgICMgREVQUkVDQVRJT04gV0FSTklORyBvbiBsaW5lIHgsIGNvbHVtbiB5IG9mIHp6ejoKICAgICAgICAgICAgICAgICMgVW5lc2NhcGVkIG11bHRpbGluZSBzdHJpbmdzIGFyZSBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgdmVyc2lvbiBvZiBTYXNzLgogICAgICAgICAgICAgICAgIyBUbyBpbmNsdWRlIGEgbmV3bGluZSBpbiBhIHN0cmluZywgdXNlICJcYSIgb3IgIlxhICIgYXMgaW4gQ1NTLgogICAgICAgICAgICAgICAgaWYgKCR0aGlzLT5tYXRjaENoYXIoIlxuIiwgZmFsc2UpKSB7CiAgICAgICAgICAgICAgICAgICAgJGNvbnRlbnRbXSA9ICcgJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlaWYgKCRtWzJdID09PSAnXFwnKSB7CiAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmxpdGVyYWwoIlxyXG4iLCAyLCBmYWxzZSkgfHwKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+bWF0Y2hDaGFyKCJcciIsIGZhbHNlKSB8fAogICAgICAgICAgICAgICAgICAgICR0aGlzLT5tYXRjaENoYXIoIlxuIiwgZmFsc2UpIHx8CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPm1hdGNoQ2hhcigiXGYiLCBmYWxzZSkKICAgICAgICAgICAgICAgICkgewogICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgYSBjb250aW51YXRpb24gZXNjYXBpbmcsIHRvIGJlIGlnbm9yZWQKICAgICAgICAgICAgICAgIH0gZWxzZWlmICgkdGhpcy0+bWF0Y2hFc2NhcGVDaGFyYWN0ZXIoJGMpKSB7CiAgICAgICAgICAgICAgICAgICAgJGNvbnRlbnRbXSA9ICRjOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyAkdGhpcy0+cGFyc2VFcnJvcignVW50ZXJtaW5hdGVkIGVzY2FwZSBzZXF1ZW5jZScpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJHRoaXMtPmNvdW50IC09IFxzdHJsZW4oJGRlbGltKTsKICAgICAgICAgICAgICAgIGJyZWFrOyAvLyBkZWxpbQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkdGhpcy0+ZWF0V2hpdGVEZWZhdWx0ID0gJG9sZFdoaXRlOwoKICAgICAgICBpZiAoJHRoaXMtPmxpdGVyYWwoJGRlbGltLCBcc3RybGVuKCRkZWxpbSkpKSB7CiAgICAgICAgICAgIGlmICgkaGFzSW50ZXJwb2xhdGlvbiAmJiAhICRrZWVwRGVsaW1XaXRoSW50ZXJwb2xhdGlvbikgewogICAgICAgICAgICAgICAgJGRlbGltID0gJyInOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkb3V0ID0gW1R5cGU6OlRfU1RSSU5HLCAkZGVsaW0sICRjb250ZW50XTsKCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KCiAgICAgICAgJHRoaXMtPnNlZWsoJHMpOwoKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0gc3RyaW5nICRvdXQKICAgICAqIEBwYXJhbSBib29sICAgJGluS2V5d29yZHMKICAgICAqCiAgICAgKiBAcmV0dXJuIGJvb2wKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIG1hdGNoRXNjYXBlQ2hhcmFjdGVyKCYkb3V0LCAkaW5LZXl3b3JkcyA9IGZhbHNlKQogICAgewogICAgICAgICRzID0gJHRoaXMtPmNvdW50OwogICAgICAgIGlmICgkdGhpcy0+bWF0Y2goJ1thLWYwLTldJywgJG0sIGZhbHNlKSkgewogICAgICAgICAgICAkaGV4ID0gJG1bMF07CgogICAgICAgICAgICBmb3IgKCRpID0gNTsgJGktLTspIHsKICAgICAgICAgICAgICAgIGlmICgkdGhpcy0+bWF0Y2goJ1thLWYwLTldJywgJG0sIGZhbHNlKSkgewogICAgICAgICAgICAgICAgICAgICRoZXggLj0gJG1bMF07CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBDU1MgYWxsb3dzIFVuaWNvZGUgZXNjYXBlIHNlcXVlbmNlcyB0byBiZSBmb2xsb3dlZCBieSBhIGRlbGltaXRlciBzcGFjZQogICAgICAgICAgICAvLyAobmVjZXNzYXJ5IGluIHNvbWUgY2FzZXMgZm9yIHNob3J0ZXIgc2VxdWVuY2VzIHRvIGRpc2FtYmlndWF0ZSB0aGVpciBlbmQpCiAgICAgICAgICAgICR0aGlzLT5tYXRjaENoYXIoJyAnLCBmYWxzZSk7CgogICAgICAgICAgICAkdmFsdWUgPSBoZXhkZWMoJGhleCk7CgogICAgICAgICAgICBpZiAoISRpbktleXdvcmRzICYmICgkdmFsdWUgPT0gMCB8fCAoJHZhbHVlID49IDB4RDgwMCAmJiAkdmFsdWUgPD0gMHhERkZGKSB8fCAkdmFsdWUgPj0gMHgxMEZGRkYpKSB7CiAgICAgICAgICAgICAgICAkb3V0ID0gIlx4RUZceEJGXHhCRCI7IC8vICJcdXtGRkZEfSIgYnV0IHdpdGggYSBzeW50YXggc3VwcG9ydGVkIG9uIFBIUCA1CiAgICAgICAgICAgIH0gZWxzZWlmICgkdmFsdWUgPCAweDIwKSB7CiAgICAgICAgICAgICAgICAkb3V0ID0gVXRpbDo6bWJDaHIoJHZhbHVlKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICRvdXQgPSBVdGlsOjptYkNocigkdmFsdWUpOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CgogICAgICAgIGlmICgkdGhpcy0+bWF0Y2goJy4nLCAkbSwgZmFsc2UpKSB7CiAgICAgICAgICAgIGlmICgkaW5LZXl3b3JkcyAmJiBpbl9hcnJheSgkbVswXSwgWyInIiwnIicsJ0AnLCcmJywnICcsJ1xcJywnOicsJy8nLCclJ10pKSB7CiAgICAgICAgICAgICAgICAkdGhpcy0+c2Vlaygkcyk7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJG91dCA9ICRtWzBdOwoKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgLyoqCiAgICAgKiBQYXJzZSBrZXl3b3JkIG9yIGludGVycG9sYXRpb24KICAgICAqCiAgICAgKiBAcGFyYW0gYXJyYXkgJG91dAogICAgICogQHBhcmFtIGJvb2wgICRyZXN0cmljdGVkCiAgICAgKgogICAgICogQHJldHVybiBib29sCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBtaXhlZEtleXdvcmQoJiRvdXQsICRyZXN0cmljdGVkID0gZmFsc2UpCiAgICB7CiAgICAgICAgJHBhcnRzID0gW107CgogICAgICAgICRvbGRXaGl0ZSA9ICR0aGlzLT5lYXRXaGl0ZURlZmF1bHQ7CiAgICAgICAgJHRoaXMtPmVhdFdoaXRlRGVmYXVsdCA9IGZhbHNlOwoKICAgICAgICBmb3IgKDs7KSB7CiAgICAgICAgICAgIGlmICgkcmVzdHJpY3RlZCA/ICR0aGlzLT5yZXN0cmljdGVkS2V5d29yZCgka2V5KSA6ICR0aGlzLT5rZXl3b3JkKCRrZXkpKSB7CiAgICAgICAgICAgICAgICAkcGFydHNbXSA9ICRrZXk7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCR0aGlzLT5pbnRlcnBvbGF0aW9uKCRpbnRlcikpIHsKICAgICAgICAgICAgICAgICRwYXJ0c1tdID0gJGludGVyOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KCiAgICAgICAgJHRoaXMtPmVhdFdoaXRlRGVmYXVsdCA9ICRvbGRXaGl0ZTsKCiAgICAgICAgaWYgKCEgJHBhcnRzKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CgogICAgICAgIGlmICgkdGhpcy0+ZWF0V2hpdGVEZWZhdWx0KSB7CiAgICAgICAgICAgICR0aGlzLT53aGl0ZXNwYWNlKCk7CiAgICAgICAgfQoKICAgICAgICAkb3V0ID0gJHBhcnRzOwoKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICAvKioKICAgICAqIFBhcnNlIGFuIHVuYm91bmRlZCBzdHJpbmcgc3RvcHBlZCBieSAkZW5kCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkZW5kCiAgICAgKiBAcGFyYW0gbWl4ZWQgICRvdXQKICAgICAqIEBwYXJhbSBzdHJpbmcgJG5lc3RPcGVuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRuZXN0Q2xvc2UKICAgICAqIEBwYXJhbSBib29sICAgJHJ0cmltCiAgICAgKiBAcGFyYW0gc3RyaW5nICRkaXNhbGxvdwogICAgICogQHBhcmFtLW91dCBhcnJheSAkb3V0CiAgICAgKgogICAgICogQHJldHVybiBib29sCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBvcGVuU3RyaW5nKCRlbmQsICYkb3V0LCAkbmVzdE9wZW4gPSBudWxsLCAkbmVzdENsb3NlID0gbnVsbCwgJHJ0cmltID0gdHJ1ZSwgJGRpc2FsbG93ID0gbnVsbCkKICAgIHsKICAgICAgICAkb2xkV2hpdGUgPSAkdGhpcy0+ZWF0V2hpdGVEZWZhdWx0OwogICAgICAgICR0aGlzLT5lYXRXaGl0ZURlZmF1bHQgPSBmYWxzZTsKCiAgICAgICAgaWYgKCRuZXN0T3BlbiAmJiAhICRuZXN0Q2xvc2UpIHsKICAgICAgICAgICAgJG5lc3RDbG9zZSA9ICRlbmQ7CiAgICAgICAgfQoKICAgICAgICAkcGF0dCA9ICgkZGlzYWxsb3cgPyAnW14nIC4gJHRoaXMtPnByZWdRdW90ZSgkZGlzYWxsb3cpIC4gJ10nIDogJy4nKTsKICAgICAgICAkcGF0dCA9ICcoJyAuICRwYXR0IC4gJyo/KShbXCciXXwjXHt8JwogICAgICAgICAgICAuICR0aGlzLT5wcmVnUXVvdGUoJGVuZCkgLiAnfCcKICAgICAgICAgICAgLiAoKCRuZXN0Q2xvc2UgJiYgJG5lc3RDbG9zZSAhPT0gJGVuZCkgPyAkdGhpcy0+cHJlZ1F1b3RlKCRuZXN0Q2xvc2UpIC4gJ3wnIDogJycpCiAgICAgICAgICAgIC4gc3RhdGljOjokY29tbWVudFBhdHRlcm4gLiAnKSc7CgogICAgICAgICRuZXN0aW5nTGV2ZWwgPSAwOwoKICAgICAgICAkY29udGVudCA9IFtdOwoKICAgICAgICB3aGlsZSAoJHRoaXMtPm1hdGNoKCRwYXR0LCAkbSwgZmFsc2UpKSB7CiAgICAgICAgICAgIGlmIChpc3NldCgkbVsxXSkgJiYgJG1bMV0gIT09ICcnKSB7CiAgICAgICAgICAgICAgICAkY29udGVudFtdID0gJG1bMV07CgogICAgICAgICAgICAgICAgaWYgKCRuZXN0T3BlbikgewogICAgICAgICAgICAgICAgICAgICRuZXN0aW5nTGV2ZWwgKz0gc3Vic3RyX2NvdW50KCRtWzFdLCAkbmVzdE9wZW4pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAkdG9rID0gJG1bMl07CgogICAgICAgICAgICAkdGhpcy0+Y291bnQgLT0gXHN0cmxlbigkdG9rKTsKCiAgICAgICAgICAgIGlmICgkdG9rID09PSAkZW5kICYmICEgJG5lc3RpbmdMZXZlbCkgewogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICgkdG9rID09PSAkbmVzdENsb3NlKSB7CiAgICAgICAgICAgICAgICAkbmVzdGluZ0xldmVsLS07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICgoJHRvayA9PT0gIiciIHx8ICR0b2sgPT09ICciJykgJiYgJHRoaXMtPnN0cmluZygkc3RyLCB0cnVlKSkgewogICAgICAgICAgICAgICAgJGNvbnRlbnRbXSA9ICRzdHI7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCR0b2sgPT09ICcjeycgJiYgJHRoaXMtPmludGVycG9sYXRpb24oJGludGVyKSkgewogICAgICAgICAgICAgICAgJGNvbnRlbnRbXSA9ICRpbnRlcjsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkY29udGVudFtdID0gJHRvazsKICAgICAgICAgICAgJHRoaXMtPmNvdW50ICs9IFxzdHJsZW4oJHRvayk7CiAgICAgICAgfQoKICAgICAgICAkdGhpcy0+ZWF0V2hpdGVEZWZhdWx0ID0gJG9sZFdoaXRlOwoKICAgICAgICBpZiAoISAkY29udGVudCB8fCAkdG9rICE9PSAkZW5kKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CgogICAgICAgIC8vIHRyaW0gdGhlIGVuZAogICAgICAgIGlmICgkcnRyaW0gJiYgXGlzX3N0cmluZyhlbmQoJGNvbnRlbnQpKSkgewogICAgICAgICAgICAkY29udGVudFtcY291bnQoJGNvbnRlbnQpIC0gMV0gPSBydHJpbShlbmQoJGNvbnRlbnQpKTsKICAgICAgICB9CgogICAgICAgICRvdXQgPSBbVHlwZTo6VF9TVFJJTkcsICcnLCAkY29udGVudF07CgogICAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIC8qKgogICAgICogUGFyc2VyIGludGVycG9sYXRpb24KICAgICAqCiAgICAgKiBAcGFyYW0gbWl4ZWQgJG91dAogICAgICogQHBhcmFtIGJvb2wgICRsb29rV2hpdGUgc2F2ZSBpbmZvcm1hdGlvbiBhYm91dCB3aGl0ZXNwYWNlIGJlZm9yZSBhbmQgYWZ0ZXIKICAgICAqIEBwYXJhbS1vdXQgYXJyYXkgJG91dAogICAgICoKICAgICAqIEByZXR1cm4gYm9vbAogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gaW50ZXJwb2xhdGlvbigmJG91dCwgJGxvb2tXaGl0ZSA9IHRydWUpCiAgICB7CiAgICAgICAgJG9sZFdoaXRlID0gJHRoaXMtPmVhdFdoaXRlRGVmYXVsdDsKICAgICAgICAkYWxsb3dWYXJzID0gJHRoaXMtPmFsbG93VmFyczsKICAgICAgICAkdGhpcy0+YWxsb3dWYXJzID0gdHJ1ZTsKICAgICAgICAkdGhpcy0+ZWF0V2hpdGVEZWZhdWx0ID0gdHJ1ZTsKCiAgICAgICAgJHMgPSAkdGhpcy0+Y291bnQ7CgogICAgICAgIGlmICgKICAgICAgICAgICAgJHRoaXMtPmxpdGVyYWwoJyN7JywgMikgJiYKICAgICAgICAgICAgJHRoaXMtPnZhbHVlTGlzdCgkdmFsdWUpICYmCiAgICAgICAgICAgICR0aGlzLT5tYXRjaENoYXIoJ30nLCBmYWxzZSkKICAgICAgICApIHsKICAgICAgICAgICAgaWYgKCR2YWx1ZSA9PT0gW1R5cGU6OlRfU0VMRl0pIHsKICAgICAgICAgICAgICAgICRvdXQgPSAkdmFsdWU7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBpZiAoJGxvb2tXaGl0ZSkgewogICAgICAgICAgICAgICAgICAgICRsZWZ0ID0gKCRzID4gMCAmJiBwcmVnX21hdGNoKCcvXHMvJywgJHRoaXMtPmJ1ZmZlclskcyAtIDFdKSkgPyAnICcgOiAnJzsKICAgICAgICAgICAgICAgICAgICAkcmlnaHQgPSAoCiAgICAgICAgICAgICAgICAgICAgICAgICEgZW1wdHkoJHRoaXMtPmJ1ZmZlclskdGhpcy0+Y291bnRdKSAmJgogICAgICAgICAgICAgICAgICAgICAgICBwcmVnX21hdGNoKCcvXHMvJywgJHRoaXMtPmJ1ZmZlclskdGhpcy0+Y291bnRdKQogICAgICAgICAgICAgICAgICAgICkgPyAnICcgOiAnJzsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJGxlZnQgPSAkcmlnaHQgPSBmYWxzZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkb3V0ID0gW1R5cGU6OlRfSU5URVJQT0xBVEUsICR2YWx1ZSwgJGxlZnQsICRyaWdodF07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICR0aGlzLT5lYXRXaGl0ZURlZmF1bHQgPSAkb2xkV2hpdGU7CiAgICAgICAgICAgICR0aGlzLT5hbGxvd1ZhcnMgPSAkYWxsb3dWYXJzOwoKICAgICAgICAgICAgaWYgKCR0aGlzLT5lYXRXaGl0ZURlZmF1bHQpIHsKICAgICAgICAgICAgICAgICR0aGlzLT53aGl0ZXNwYWNlKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KCiAgICAgICAgJHRoaXMtPnNlZWsoJHMpOwoKICAgICAgICAkdGhpcy0+ZWF0V2hpdGVEZWZhdWx0ID0gJG9sZFdoaXRlOwogICAgICAgICR0aGlzLT5hbGxvd1ZhcnMgPSAkYWxsb3dWYXJzOwoKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgLyoqCiAgICAgKiBQYXJzZSBwcm9wZXJ0eSBuYW1lIChhcyBhbiBhcnJheSBvZiBwYXJ0cyBvciBhIHN0cmluZykKICAgICAqCiAgICAgKiBAcGFyYW0gYXJyYXkgJG91dAogICAgICoKICAgICAqIEByZXR1cm4gYm9vbAogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gcHJvcGVydHlOYW1lKCYkb3V0KQogICAgewogICAgICAgICRwYXJ0cyA9IFtdOwoKICAgICAgICAkb2xkV2hpdGUgPSAkdGhpcy0+ZWF0V2hpdGVEZWZhdWx0OwogICAgICAgICR0aGlzLT5lYXRXaGl0ZURlZmF1bHQgPSBmYWxzZTsKCiAgICAgICAgZm9yICg7OykgewogICAgICAgICAgICBpZiAoJHRoaXMtPmludGVycG9sYXRpb24oJGludGVyKSkgewogICAgICAgICAgICAgICAgJHBhcnRzW10gPSAkaW50ZXI7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCR0aGlzLT5rZXl3b3JkKCR0ZXh0KSkgewogICAgICAgICAgICAgICAgJHBhcnRzW10gPSAkdGV4dDsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoISAkcGFydHMgJiYgJHRoaXMtPm1hdGNoKCdbOi4jXScsICRtLCBmYWxzZSkpIHsKICAgICAgICAgICAgICAgIC8vIGNzcyBoYWNrcwogICAgICAgICAgICAgICAgJHBhcnRzW10gPSAkbVswXTsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBicmVhazsKICAgICAgICB9CgogICAgICAgICR0aGlzLT5lYXRXaGl0ZURlZmF1bHQgPSAkb2xkV2hpdGU7CgogICAgICAgIGlmICghICRwYXJ0cykgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICAvLyBtYXRjaCBjb21tZW50IGhhY2sKICAgICAgICBpZiAocHJlZ19tYXRjaChzdGF0aWM6OiR3aGl0ZVBhdHRlcm4sICR0aGlzLT5idWZmZXIsICRtLCAwLCAkdGhpcy0+Y291bnQpKSB7CiAgICAgICAgICAgIGlmICghIGVtcHR5KCRtWzBdKSkgewogICAgICAgICAgICAgICAgJHBhcnRzW10gPSAkbVswXTsKICAgICAgICAgICAgICAgICR0aGlzLT5jb3VudCArPSBcc3RybGVuKCRtWzBdKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJHRoaXMtPndoaXRlc3BhY2UoKTsgLy8gZ2V0IGFueSBleHRyYSB3aGl0ZXNwYWNlCgogICAgICAgICRvdXQgPSBbVHlwZTo6VF9TVFJJTkcsICcnLCAkcGFydHNdOwoKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICAvKioKICAgICAqIFBhcnNlIGN1c3RvbSBwcm9wZXJ0eSBuYW1lIChhcyBhbiBhcnJheSBvZiBwYXJ0cyBvciBhIHN0cmluZykKICAgICAqCiAgICAgKiBAcGFyYW0gYXJyYXkgJG91dAogICAgICoKICAgICAqIEByZXR1cm4gYm9vbAogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gY3VzdG9tUHJvcGVydHkoJiRvdXQpCiAgICB7CiAgICAgICAgJHMgPSAkdGhpcy0+Y291bnQ7CgogICAgICAgIGlmICghICR0aGlzLT5saXRlcmFsKCctLScsIDIsIGZhbHNlKSkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICAkcGFydHMgPSBbJy0tJ107CgogICAgICAgICRvbGRXaGl0ZSA9ICR0aGlzLT5lYXRXaGl0ZURlZmF1bHQ7CiAgICAgICAgJHRoaXMtPmVhdFdoaXRlRGVmYXVsdCA9IGZhbHNlOwoKICAgICAgICBmb3IgKDs7KSB7CiAgICAgICAgICAgIGlmICgkdGhpcy0+aW50ZXJwb2xhdGlvbigkaW50ZXIpKSB7CiAgICAgICAgICAgICAgICAkcGFydHNbXSA9ICRpbnRlcjsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoJHRoaXMtPm1hdGNoQ2hhcignJicsIGZhbHNlKSkgewogICAgICAgICAgICAgICAgJHBhcnRzW10gPSBbVHlwZTo6VF9TRUxGXTsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoJHRoaXMtPnZhcmlhYmxlKCR2YXIpKSB7CiAgICAgICAgICAgICAgICAkcGFydHNbXSA9ICR2YXI7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCR0aGlzLT5rZXl3b3JkKCR0ZXh0KSkgewogICAgICAgICAgICAgICAgJHBhcnRzW10gPSAkdGV4dDsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBicmVhazsKICAgICAgICB9CgogICAgICAgICR0aGlzLT5lYXRXaGl0ZURlZmF1bHQgPSAkb2xkV2hpdGU7CgogICAgICAgIGlmIChcY291bnQoJHBhcnRzKSA9PSAxKSB7CiAgICAgICAgICAgICR0aGlzLT5zZWVrKCRzKTsKCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CgogICAgICAgICR0aGlzLT53aGl0ZXNwYWNlKCk7IC8vIGdldCBhbnkgZXh0cmEgd2hpdGVzcGFjZQoKICAgICAgICAkb3V0ID0gW1R5cGU6OlRfU1RSSU5HLCAnJywgJHBhcnRzXTsKCiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgLyoqCiAgICAgKiBQYXJzZSBjb21tYSBzZXBhcmF0ZWQgc2VsZWN0b3IgbGlzdAogICAgICoKICAgICAqIEBwYXJhbSBhcnJheSAkb3V0CiAgICAgKiBAcGFyYW0gc3RyaW5nfGJvb2wgJHN1YlNlbGVjdG9yCiAgICAgKgogICAgICogQHJldHVybiBib29sCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBzZWxlY3RvcnMoJiRvdXQsICRzdWJTZWxlY3RvciA9IGZhbHNlKQogICAgewogICAgICAgICRzID0gJHRoaXMtPmNvdW50OwogICAgICAgICRzZWxlY3RvcnMgPSBbXTsKCiAgICAgICAgd2hpbGUgKCR0aGlzLT5zZWxlY3Rvcigkc2VsLCAkc3ViU2VsZWN0b3IpKSB7CiAgICAgICAgICAgICRzZWxlY3RvcnNbXSA9ICRzZWw7CgogICAgICAgICAgICBpZiAoISAkdGhpcy0+bWF0Y2hDaGFyKCcsJywgdHJ1ZSkpIHsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CgogICAgICAgICAgICB3aGlsZSAoJHRoaXMtPm1hdGNoQ2hhcignLCcsIHRydWUpKSB7CiAgICAgICAgICAgICAgICA7IC8vIGlnbm9yZSBleHRyYQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoISAkc2VsZWN0b3JzKSB7CiAgICAgICAgICAgICR0aGlzLT5zZWVrKCRzKTsKCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CgogICAgICAgICRvdXQgPSAkc2VsZWN0b3JzOwoKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICAvKioKICAgICAqIFBhcnNlIHdoaXRlc3BhY2Ugc2VwYXJhdGVkIHNlbGVjdG9yIGxpc3QKICAgICAqCiAgICAgKiBAcGFyYW0gYXJyYXkgICAgICAgICAgJG91dAogICAgICogQHBhcmFtIHN0cmluZ3xib29sICRzdWJTZWxlY3RvcgogICAgICoKICAgICAqIEByZXR1cm4gYm9vbAogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gc2VsZWN0b3IoJiRvdXQsICRzdWJTZWxlY3RvciA9IGZhbHNlKQogICAgewogICAgICAgICRzZWxlY3RvciA9IFtdOwoKICAgICAgICAkZGlzY2FyZENvbW1lbnRzID0gJHRoaXMtPmRpc2NhcmRDb21tZW50czsKICAgICAgICAkdGhpcy0+ZGlzY2FyZENvbW1lbnRzID0gdHJ1ZTsKCiAgICAgICAgZm9yICg7OykgewogICAgICAgICAgICAkcyA9ICR0aGlzLT5jb3VudDsKCiAgICAgICAgICAgIGlmICgkdGhpcy0+bWF0Y2goJ1s+K35dKycsICRtLCB0cnVlKSkgewogICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICRzdWJTZWxlY3RvciAmJiBcaXNfc3RyaW5nKCRzdWJTZWxlY3RvcikgJiYgc3RycG9zKCRzdWJTZWxlY3RvciwgJ250aC0nKSA9PT0gMCAmJgogICAgICAgICAgICAgICAgICAgICRtWzBdID09PSAnKycgJiYgJHRoaXMtPm1hdGNoKCIoXGQrfG5cYikiLCAkY291bnRlcikKICAgICAgICAgICAgICAgICkgewogICAgICAgICAgICAgICAgICAgICR0aGlzLT5zZWVrKCRzKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJHNlbGVjdG9yW10gPSBbJG1bMF1dOwogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoJHRoaXMtPnNlbGVjdG9yU2luZ2xlKCRwYXJ0LCAkc3ViU2VsZWN0b3IpKSB7CiAgICAgICAgICAgICAgICAkc2VsZWN0b3JbXSA9ICRwYXJ0OwogICAgICAgICAgICAgICAgJHRoaXMtPndoaXRlc3BhY2UoKTsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBicmVhazsKICAgICAgICB9CgogICAgICAgICR0aGlzLT5kaXNjYXJkQ29tbWVudHMgPSAkZGlzY2FyZENvbW1lbnRzOwoKICAgICAgICBpZiAoISAkc2VsZWN0b3IpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgJG91dCA9ICRzZWxlY3RvcjsKCiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgLyoqCiAgICAgKiBwYXJzaW5nIGVzY2FwZWQgY2hhcnMgaW4gc2VsZWN0b3JzOgogICAgICogLSBlc2NhcGVkIHNpbmdsZSBjaGFycyBhcmUga2VwdCBlc2NhcGVkIGluIHRoZSBzZWxlY3RvciBidXQgaW4gYSBub3JtYWxpemVkIGZvcm0KICAgICAqICAgKGlmIG5vdCBpbiAwLTlhLWYgcmFuZ2UgYXMgdGhpcyB3b3VsZCBiZSBhbWJpZ291cykKICAgICAqIC0gb3RoZXIgZXNjYXBlZCBzZXF1ZW5jZXMgKG11bHRpYnl0ZSBjaGFycyBvciAwLTlhLWYpIGFyZSBrZXB0IGluIHRoZWlyIGluaXRpYWwgZXNjYXBlZCBmb3JtLAogICAgICogICBub3JtYWxpemVkIHRvIGxvd2VyY2FzZQogICAgICoKICAgICAqIFRPRE86IHRoaXMgaXMgYSBmYWxsYmFjayBzb2x1dGlvbi4gSWRlYWxseSBlc2NhcGVkIGNoYXJzIGluIHNlbGVjdG9ycyBzaG91bGQgYmUgZW5jb2RlZCBhcyB0aGUgZ2VudWluZSBjaGFycywKICAgICAqIGFuZCBlc2NhcGluZyBhZGRlZCB3aGVuIHByaW50aW5nIGluIHRoZSBDb21waWxlciwgd2hlcmUvaWYgaXQncyBtYW5kYXRvcnkKICAgICAqIC0gYnV0IHRoaXMgcmVxdWlyZSBhIGJldHRlciBmb3JtYWwgc2VsZWN0b3IgcmVwcmVzZW50YXRpb24gaW5zdGVhZCBvZiB0aGUgYXJyYXkgd2UgaGF2ZSBub3cKICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICRvdXQKICAgICAqIEBwYXJhbSBib29sICAgJGtlZXBFc2NhcGVkTnVtYmVyCiAgICAgKgogICAgICogQHJldHVybiBib29sCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBtYXRjaEVzY2FwZUNoYXJhY3RlckluU2VsZWN0b3IoJiRvdXQsICRrZWVwRXNjYXBlZE51bWJlciA9IGZhbHNlKQogICAgewogICAgICAgICRzX2VzY2FwZSA9ICR0aGlzLT5jb3VudDsKICAgICAgICBpZiAoJHRoaXMtPm1hdGNoKCdcXFxcJywgJG0pKSB7CiAgICAgICAgICAgICRvdXQgPSAnXFwnIC4gJG1bMF07CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KCiAgICAgICAgaWYgKCR0aGlzLT5tYXRjaEVzY2FwZUNoYXJhY3RlcigkZXNjYXBlZG91dCwgdHJ1ZSkpIHsKICAgICAgICAgICAgaWYgKHN0cmxlbigkZXNjYXBlZG91dCkgPT09IDEpIHsKICAgICAgICAgICAgICAgIGlmICghcHJlZ19tYXRjaCgiLFx3LCIsICRlc2NhcGVkb3V0KSkgewogICAgICAgICAgICAgICAgICAgICRvdXQgPSAnXFwnIC4gJGVzY2FwZWRvdXQ7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICB9IGVsc2VpZiAoISAka2VlcEVzY2FwZWROdW1iZXIgfHwgISBcaXNfbnVtZXJpYygkZXNjYXBlZG91dCkpIHsKICAgICAgICAgICAgICAgICAgICAkb3V0ID0gJGVzY2FwZWRvdXQ7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJGVzY2FwZV9zZXF1ZW5jZSA9IHJ0cmltKHN1YnN0cigkdGhpcy0+YnVmZmVyLCAkc19lc2NhcGUsICR0aGlzLT5jb3VudCAtICRzX2VzY2FwZSkpOwogICAgICAgICAgICBpZiAoc3RybGVuKCRlc2NhcGVfc2VxdWVuY2UpIDwgNikgewogICAgICAgICAgICAgICAgJGVzY2FwZV9zZXF1ZW5jZSAuPSAnICc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJG91dCA9ICdcXCcgLiBzdHJ0b2xvd2VyKCRlc2NhcGVfc2VxdWVuY2UpOwogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgaWYgKCR0aGlzLT5tYXRjaCgnXFxTJywgJG0pKSB7CiAgICAgICAgICAgICRvdXQgPSAnXFwnIC4gJG1bMF07CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KCgogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICAvKioKICAgICAqIFBhcnNlIHRoZSBwYXJ0cyB0aGF0IG1ha2UgdXAgYSBzZWxlY3RvcgogICAgICoKICAgICAqIHtAaW50ZXJuYWwKICAgICAqICAgICBkaXZbeWVzPW5vXSNzb21ldGhpbmcuaGVsbG8ud29ybGQ6bnRoLWNoaWxkKC0ybisxKSVwbGFjZWhvbGRlcgogICAgICogfX0KICAgICAqCiAgICAgKiBAcGFyYW0gYXJyYXkgICAgICAgICAgJG91dAogICAgICogQHBhcmFtIHN0cmluZ3xib29sICRzdWJTZWxlY3RvcgogICAgICoKICAgICAqIEByZXR1cm4gYm9vbAogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gc2VsZWN0b3JTaW5nbGUoJiRvdXQsICRzdWJTZWxlY3RvciA9IGZhbHNlKQogICAgewogICAgICAgICRvbGRXaGl0ZSA9ICR0aGlzLT5lYXRXaGl0ZURlZmF1bHQ7CiAgICAgICAgJHRoaXMtPmVhdFdoaXRlRGVmYXVsdCA9IGZhbHNlOwoKICAgICAgICAkcGFydHMgPSBbXTsKCiAgICAgICAgaWYgKCR0aGlzLT5tYXRjaENoYXIoJyonLCBmYWxzZSkpIHsKICAgICAgICAgICAgJHBhcnRzW10gPSAnKic7CiAgICAgICAgfQoKICAgICAgICBmb3IgKDs7KSB7CiAgICAgICAgICAgIGlmICghIGlzc2V0KCR0aGlzLT5idWZmZXJbJHRoaXMtPmNvdW50XSkpIHsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkcyA9ICR0aGlzLT5jb3VudDsKICAgICAgICAgICAgJGNoYXIgPSAkdGhpcy0+YnVmZmVyWyR0aGlzLT5jb3VudF07CgogICAgICAgICAgICAvLyBzZWUgaWYgd2UgY2FuIHN0b3AgZWFybHkKICAgICAgICAgICAgaWYgKCRjaGFyID09PSAneycgfHwgJGNoYXIgPT09ICcsJyB8fCAkY2hhciA9PT0gJzsnIHx8ICRjaGFyID09PSAnfScgfHwgJGNoYXIgPT09ICdAJykgewogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHBhcnNpbmcgYSBzdWIgc2VsZWN0b3IgaW4gKCkgc3RvcCB3aXRoIHRoZSBjbG9zaW5nICkKICAgICAgICAgICAgaWYgKCRzdWJTZWxlY3RvciAmJiAkY2hhciA9PT0gJyknKSB7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy9zZWxmCiAgICAgICAgICAgIHN3aXRjaCAoJGNoYXIpIHsKICAgICAgICAgICAgICAgIGNhc2UgJyYnOgogICAgICAgICAgICAgICAgICAgICRwYXJ0c1tdID0gQ29tcGlsZXI6OiRzZWxmU2VsZWN0b3I7CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmNvdW50Kys7CiAgICAgICAgICAgICAgICAgICAgISAkdGhpcy0+Y3NzT25seSB8fCAkdGhpcy0+YXNzZXJ0UGxhaW5Dc3NWYWxpZChmYWxzZSwgJHMpOwogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlIDI7CgogICAgICAgICAgICAgICAgY2FzZSAnLic6CiAgICAgICAgICAgICAgICAgICAgJHBhcnRzW10gPSAnLic7CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmNvdW50Kys7CiAgICAgICAgICAgICAgICAgICAgY29udGludWUgMjsKCiAgICAgICAgICAgICAgICBjYXNlICd8JzoKICAgICAgICAgICAgICAgICAgICAkcGFydHNbXSA9ICd8JzsKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+Y291bnQrKzsKICAgICAgICAgICAgICAgICAgICBjb250aW51ZSAyOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBoYW5kbGluZyBvZiBlc2NhcGluZyBpbiBzZWxlY3RvcnMgOiBnZXQgdGhlIGVzY2FwZWQgY2hhcgogICAgICAgICAgICBpZiAoJGNoYXIgPT09ICdcXCcpIHsKICAgICAgICAgICAgICAgICR0aGlzLT5jb3VudCsrOwogICAgICAgICAgICAgICAgaWYgKCR0aGlzLT5tYXRjaEVzY2FwZUNoYXJhY3RlckluU2VsZWN0b3IoJGVzY2FwZWQsIHRydWUpKSB7CiAgICAgICAgICAgICAgICAgICAgJHBhcnRzW10gPSAkZXNjYXBlZDsKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICR0aGlzLT5jb3VudC0tOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoJGNoYXIgPT09ICclJykgewogICAgICAgICAgICAgICAgJHRoaXMtPmNvdW50Kys7CgogICAgICAgICAgICAgICAgaWYgKCR0aGlzLT5wbGFjZWhvbGRlcigkcGxhY2Vob2xkZXIpKSB7CiAgICAgICAgICAgICAgICAgICAgJHBhcnRzW10gPSAnJSc7CiAgICAgICAgICAgICAgICAgICAgJHBhcnRzW10gPSAkcGxhY2Vob2xkZXI7CiAgICAgICAgICAgICAgICAgICAgISAkdGhpcy0+Y3NzT25seSB8fCAkdGhpcy0+YXNzZXJ0UGxhaW5Dc3NWYWxpZChmYWxzZSwgJHMpOwogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoJGNoYXIgPT09ICcjJykgewogICAgICAgICAgICAgICAgaWYgKCR0aGlzLT5pbnRlcnBvbGF0aW9uKCRpbnRlcikpIHsKICAgICAgICAgICAgICAgICAgICAkcGFydHNbXSA9ICRpbnRlcjsKICAgICAgICAgICAgICAgICAgICAhICR0aGlzLT5jc3NPbmx5IHx8ICR0aGlzLT5hc3NlcnRQbGFpbkNzc1ZhbGlkKGZhbHNlLCAkcyk7CiAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJHBhcnRzW10gPSAnIyc7CiAgICAgICAgICAgICAgICAkdGhpcy0+Y291bnQrKzsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBhIHBzZXVkbyBzZWxlY3RvcgogICAgICAgICAgICBpZiAoJGNoYXIgPT09ICc6JykgewogICAgICAgICAgICAgICAgaWYgKCR0aGlzLT5idWZmZXJbJHRoaXMtPmNvdW50ICsgMV0gPT09ICc6JykgewogICAgICAgICAgICAgICAgICAgICR0aGlzLT5jb3VudCArPSAyOwogICAgICAgICAgICAgICAgICAgICRwYXJ0ID0gJzo6JzsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmNvdW50Kys7CiAgICAgICAgICAgICAgICAgICAgJHBhcnQgPSAnOic7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCR0aGlzLT5taXhlZEtleXdvcmQoJG5hbWVQYXJ0cywgdHJ1ZSkpIHsKICAgICAgICAgICAgICAgICAgICAkcGFydHNbXSA9ICRwYXJ0OwoKICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICgkbmFtZVBhcnRzIGFzICRzdWIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJHBhcnRzW10gPSAkc3ViOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgJHNzID0gJHRoaXMtPmNvdW50OwoKICAgICAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgICAgICRuYW1lUGFydHMgPT09IFsnbm90J10gfHwKICAgICAgICAgICAgICAgICAgICAgICAgJG5hbWVQYXJ0cyA9PT0gWydpcyddIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICRuYW1lUGFydHMgPT09IFsnaGFzJ10gfHwKICAgICAgICAgICAgICAgICAgICAgICAgJG5hbWVQYXJ0cyA9PT0gWyd3aGVyZSddIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICRuYW1lUGFydHMgPT09IFsnc2xvdHRlZCddIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICRuYW1lUGFydHMgPT09IFsnbnRoLWNoaWxkJ10gfHwKICAgICAgICAgICAgICAgICAgICAgICAgJG5hbWVQYXJ0cyA9PT0gWydudGgtbGFzdC1jaGlsZCddIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICRuYW1lUGFydHMgPT09IFsnbnRoLW9mLXR5cGUnXSB8fAogICAgICAgICAgICAgICAgICAgICAgICAkbmFtZVBhcnRzID09PSBbJ250aC1sYXN0LW9mLXR5cGUnXQogICAgICAgICAgICAgICAgICAgICkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+bWF0Y2hDaGFyKCcoJywgdHJ1ZSkgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICgkdGhpcy0+c2VsZWN0b3JzKCRzdWJzLCByZXNldCgkbmFtZVBhcnRzKSkgfHwgdHJ1ZSkgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5tYXRjaENoYXIoJyknKQogICAgICAgICAgICAgICAgICAgICAgICApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRwYXJ0c1tdID0gJygnOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgkc3ViID0gYXJyYXlfc2hpZnQoJHN1YnMpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCRwcyA9IGFycmF5X3NoaWZ0KCRzdWIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRwcyBhcyAmJHApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRwYXJ0c1tdID0gJHA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcY291bnQoJHN1YikgJiYgcmVzZXQoJHN1YikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRwYXJ0c1tdID0gJyAnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXGNvdW50KCRzdWJzKSAmJiByZXNldCgkc3VicykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHBhcnRzW10gPSAnLCAnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcGFydHNbXSA9ICcpJzsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5zZWVrKCRzcyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9IGVsc2VpZiAoCiAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5tYXRjaENoYXIoJygnLCB0cnVlKSAmJgogICAgICAgICAgICAgICAgICAgICAgICAoJHRoaXMtPm9wZW5TdHJpbmcoJyknLCAkc3RyLCAnKCcpIHx8IHRydWUpICYmCiAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5tYXRjaENoYXIoJyknKQogICAgICAgICAgICAgICAgICAgICkgewogICAgICAgICAgICAgICAgICAgICAgICAkcGFydHNbXSA9ICcoJzsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIGVtcHR5KCRzdHIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcGFydHNbXSA9ICRzdHI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICRwYXJ0c1tdID0gJyknOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5zZWVrKCRzcyk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHRoaXMtPnNlZWsoJHMpOwoKICAgICAgICAgICAgLy8gMm4rMQogICAgICAgICAgICBpZiAoJHN1YlNlbGVjdG9yICYmIFxpc19zdHJpbmcoJHN1YlNlbGVjdG9yKSAmJiBzdHJwb3MoJHN1YlNlbGVjdG9yLCAnbnRoLScpID09PSAwKSB7CiAgICAgICAgICAgICAgICBpZiAoJHRoaXMtPm1hdGNoKCIoXHMqKFwrXHMqfFwtXHMqKT8oXGQrfG58XGQrbikpKyIsICRjb3VudGVyKSkgewogICAgICAgICAgICAgICAgICAgICRwYXJ0c1tdID0gJGNvdW50ZXJbMF07CiAgICAgICAgICAgICAgICAgICAgLy8kcGFydHNbXSA9IHN0cl9yZXBsYWNlKCcgJywgJycsICRjb3VudGVyWzBdKTsKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHRoaXMtPnNlZWsoJHMpOwoKICAgICAgICAgICAgLy8gYXR0cmlidXRlIHNlbGVjdG9yCiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICRjaGFyID09PSAnWycgJiYKICAgICAgICAgICAgICAgICR0aGlzLT5tYXRjaENoYXIoJ1snKSAmJgogICAgICAgICAgICAgICAgKCR0aGlzLT5vcGVuU3RyaW5nKCddJywgJHN0ciwgJ1snKSB8fCB0cnVlKSAmJgogICAgICAgICAgICAgICAgJHRoaXMtPm1hdGNoQ2hhcignXScpCiAgICAgICAgICAgICkgewogICAgICAgICAgICAgICAgJHBhcnRzW10gPSAnWyc7CgogICAgICAgICAgICAgICAgaWYgKCEgZW1wdHkoJHN0cikpIHsKICAgICAgICAgICAgICAgICAgICAkcGFydHNbXSA9ICRzdHI7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJHBhcnRzW10gPSAnXSc7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHRoaXMtPnNlZWsoJHMpOwoKICAgICAgICAgICAgLy8gZm9yIGtleWZyYW1lcwogICAgICAgICAgICBpZiAoJHRoaXMtPnVuaXQoJHVuaXQpKSB7CiAgICAgICAgICAgICAgICAkcGFydHNbXSA9ICR1bml0OwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICgkdGhpcy0+cmVzdHJpY3RlZEtleXdvcmQoJG5hbWUsIGZhbHNlLCB0cnVlKSkgewogICAgICAgICAgICAgICAgJHBhcnRzW10gPSAkbmFtZTsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBicmVhazsKICAgICAgICB9CgogICAgICAgICR0aGlzLT5lYXRXaGl0ZURlZmF1bHQgPSAkb2xkV2hpdGU7CgogICAgICAgIGlmICghICRwYXJ0cykgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICAkb3V0ID0gJHBhcnRzOwoKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICAvKioKICAgICAqIFBhcnNlIGEgdmFyaWFibGUKICAgICAqCiAgICAgKiBAcGFyYW0gbWl4ZWQgJG91dAogICAgICogQHBhcmFtLW91dCBhcnJheXtUeXBlOjoqLCBzdHJpbmd9ICRvdXQKICAgICAqCiAgICAgKiBAcmV0dXJuIGJvb2wKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIHZhcmlhYmxlKCYkb3V0KQogICAgewogICAgICAgICRzID0gJHRoaXMtPmNvdW50OwoKICAgICAgICBpZiAoCiAgICAgICAgICAgICR0aGlzLT5tYXRjaENoYXIoJyQnLCBmYWxzZSkgJiYKICAgICAgICAgICAgJHRoaXMtPmtleXdvcmQoJG5hbWUpCiAgICAgICAgKSB7CiAgICAgICAgICAgIGlmICgkdGhpcy0+YWxsb3dWYXJzKSB7CiAgICAgICAgICAgICAgICAkb3V0ID0gW1R5cGU6OlRfVkFSSUFCTEUsICRuYW1lXTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICRvdXQgPSBbVHlwZTo6VF9LRVlXT1JELCAnJCcgLiAkbmFtZV07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KCiAgICAgICAgJHRoaXMtPnNlZWsoJHMpOwoKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgLyoqCiAgICAgKiBQYXJzZSBhIGtleXdvcmQKICAgICAqCiAgICAgKiBAcGFyYW0gbWl4ZWQgJHdvcmQKICAgICAqIEBwYXJhbSBib29sICAkZWF0V2hpdGVzcGFjZQogICAgICogQHBhcmFtIGJvb2wgICRpblNlbGVjdG9yCiAgICAgKiBAcGFyYW0tb3V0IHN0cmluZyAkd29yZAogICAgICoKICAgICAqIEByZXR1cm4gYm9vbAogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24ga2V5d29yZCgmJHdvcmQsICRlYXRXaGl0ZXNwYWNlID0gbnVsbCwgJGluU2VsZWN0b3IgPSBmYWxzZSkKICAgIHsKICAgICAgICAkcyA9ICR0aGlzLT5jb3VudDsKICAgICAgICAkbWF0Y2ggPSAkdGhpcy0+bWF0Y2goCiAgICAgICAgICAgICR0aGlzLT51dGY4CiAgICAgICAgICAgICAgICA/ICcoKFtccExcd1x4ezAwQTB9LVx4ezEwRkZGRn1fXC1cKiEiXCddfFxcXFxbYS1mMC05XXs2fSA/fFxcXFxbYS1mMC05XXsxLDV9KD8hW2EtZjAtOV0pID98W1xcXFxdLikoW1xwTFx3XHh7MDBBMH0tXHh7MTBGRkZGfVwtXyJcJ118XFxcXFthLWYwLTldezZ9ID98XFxcXFthLWYwLTldezEsNX0oPyFbYS1mMC05XSkgP3xbXFxcXF0uKSopJwogICAgICAgICAgICAgICAgOiAnKChbXHdfXC1cKiEiXCddfFxcXFxbYS1mMC05XXs2fSA/fFxcXFxbYS1mMC05XXsxLDV9KD8hW2EtZjAtOV0pID98W1xcXFxdLikoW1x3XC1fIlwnXXxcXFxcW2EtZjAtOV17Nn0gP3xcXFxcW2EtZjAtOV17MSw1fSg/IVthLWYwLTldKSA/fFtcXFxcXS4pKiknLAogICAgICAgICAgICAkbSwKICAgICAgICAgICAgZmFsc2UKICAgICAgICApOwoKICAgICAgICBpZiAoJG1hdGNoKSB7CiAgICAgICAgICAgICR3b3JkID0gJG1bMV07CgogICAgICAgICAgICAvLyBoYW5kbGluZyBvZiBlc2NhcGluZyBpbiBrZXl3b3JkIDogZ2V0IHRoZSBlc2NhcGVkIGNoYXIKICAgICAgICAgICAgaWYgKHN0cnBvcygkd29yZCwgJ1xcJykgIT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAkc2VuZCA9ICR0aGlzLT5jb3VudDsKICAgICAgICAgICAgICAgICRlc2NhcGVkV29yZCA9IFtdOwogICAgICAgICAgICAgICAgJHRoaXMtPnNlZWsoJHMpOwogICAgICAgICAgICAgICAgJHByZXZpb3VzRXNjYXBlID0gZmFsc2U7CiAgICAgICAgICAgICAgICB3aGlsZSAoJHRoaXMtPmNvdW50IDwgJHNlbmQpIHsKICAgICAgICAgICAgICAgICAgICAkY2hhciA9ICR0aGlzLT5idWZmZXJbJHRoaXMtPmNvdW50XTsKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+Y291bnQrKzsKICAgICAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5jb3VudCA8ICRzZW5kCiAgICAgICAgICAgICAgICAgICAgICAgICYmICRjaGFyID09PSAnXFwnCiAgICAgICAgICAgICAgICAgICAgICAgICYmICEkcHJldmlvdXNFc2NhcGUKICAgICAgICAgICAgICAgICAgICAgICAgJiYgKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGluU2VsZWN0b3IgPwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5tYXRjaEVzY2FwZUNoYXJhY3RlckluU2VsZWN0b3IoJG91dCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPm1hdGNoRXNjYXBlQ2hhcmFjdGVyKCRvdXQsIHRydWUpCiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJGVzY2FwZWRXb3JkW10gPSAkb3V0OwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkcHJldmlvdXNFc2NhcGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRwcmV2aW91c0VzY2FwZSA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2VpZiAoJGNoYXIgPT09ICdcXCcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRwcmV2aW91c0VzY2FwZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgJGVzY2FwZWRXb3JkW10gPSAkY2hhcjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJHdvcmQgPSBpbXBsb2RlKCcnLCAkZXNjYXBlZFdvcmQpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoaXNfbnVsbCgkZWF0V2hpdGVzcGFjZSkgPyAkdGhpcy0+ZWF0V2hpdGVEZWZhdWx0IDogJGVhdFdoaXRlc3BhY2UpIHsKICAgICAgICAgICAgICAgICR0aGlzLT53aGl0ZXNwYWNlKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIC8qKgogICAgICogUGFyc2UgYSBrZXl3b3JkIHRoYXQgc2hvdWxkIG5vdCBzdGFydCB3aXRoIGEgbnVtYmVyCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkd29yZAogICAgICogQHBhcmFtIGJvb2wgICAkZWF0V2hpdGVzcGFjZQogICAgICogQHBhcmFtIGJvb2wgICAkaW5TZWxlY3RvcgogICAgICoKICAgICAqIEByZXR1cm4gYm9vbAogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gcmVzdHJpY3RlZEtleXdvcmQoJiR3b3JkLCAkZWF0V2hpdGVzcGFjZSA9IG51bGwsICRpblNlbGVjdG9yID0gZmFsc2UpCiAgICB7CiAgICAgICAgJHMgPSAkdGhpcy0+Y291bnQ7CgogICAgICAgIGlmICgkdGhpcy0+a2V5d29yZCgkd29yZCwgJGVhdFdoaXRlc3BhY2UsICRpblNlbGVjdG9yKSAmJiAoXG9yZCgkd29yZFswXSkgPiA1NyB8fCBcb3JkKCR3b3JkWzBdKSA8IDQ4KSkgewogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CgogICAgICAgICR0aGlzLT5zZWVrKCRzKTsKCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIC8qKgogICAgICogUGFyc2UgYSBwbGFjZWhvbGRlcgogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmd8YXJyYXkgJHBsYWNlaG9sZGVyCiAgICAgKgogICAgICogQHJldHVybiBib29sCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBwbGFjZWhvbGRlcigmJHBsYWNlaG9sZGVyKQogICAgewogICAgICAgICRtYXRjaCA9ICR0aGlzLT5tYXRjaCgKICAgICAgICAgICAgJHRoaXMtPnV0ZjgKICAgICAgICAgICAgICAgID8gJyhbXHBMXHdcLV9dKyknCiAgICAgICAgICAgICAgICA6ICcoW1x3XC1fXSspJywKICAgICAgICAgICAgJG0KICAgICAgICApOwoKICAgICAgICBpZiAoJG1hdGNoKSB7CiAgICAgICAgICAgICRwbGFjZWhvbGRlciA9ICRtWzFdOwoKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQoKICAgICAgICBpZiAoJHRoaXMtPmludGVycG9sYXRpb24oJHBsYWNlaG9sZGVyKSkgewogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICAvKioKICAgICAqIFBhcnNlIGEgdXJsCiAgICAgKgogICAgICogQHBhcmFtIG1peGVkICRvdXQKICAgICAqIEBwYXJhbS1vdXQgYXJyYXkgJG91dAogICAgICoKICAgICAqIEByZXR1cm4gYm9vbAogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gdXJsKCYkb3V0KQogICAgewogICAgICAgIGlmICgkdGhpcy0+bGl0ZXJhbCgndXJsKCcsIDQpKSB7CiAgICAgICAgICAgICRzID0gJHRoaXMtPmNvdW50OwoKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgKCR0aGlzLT5zdHJpbmcoJGlubmVyKSB8fCAkdGhpcy0+c3BhY2VMaXN0KCRpbm5lcikpICYmCiAgICAgICAgICAgICAgICAkdGhpcy0+bWF0Y2hDaGFyKCcpJykKICAgICAgICAgICAgKSB7CiAgICAgICAgICAgICAgICAkb3V0ID0gW1R5cGU6OlRfU1RSSU5HLCAnJywgWyd1cmwoJywgJGlubmVyLCAnKSddXTsKCiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHRoaXMtPnNlZWsoJHMpOwoKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJHRoaXMtPm9wZW5TdHJpbmcoJyknLCAkb3V0KSAmJgogICAgICAgICAgICAgICAgJHRoaXMtPm1hdGNoQ2hhcignKScpCiAgICAgICAgICAgICkgewogICAgICAgICAgICAgICAgJG91dCA9IFtUeXBlOjpUX1NUUklORywgJycsIFsndXJsKCcsICRvdXQsICcpJ11dOwoKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgLyoqCiAgICAgKiBDb25zdW1lIGFuIGVuZCBvZiBzdGF0ZW1lbnQgZGVsaW1pdGVyCiAgICAgKiBAcGFyYW0gYm9vbCAkZWF0V2hpdGVzcGFjZQogICAgICoKICAgICAqIEByZXR1cm4gYm9vbAogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gZW5kKCRlYXRXaGl0ZXNwYWNlID0gbnVsbCkKICAgIHsKICAgICAgICBpZiAoJHRoaXMtPm1hdGNoQ2hhcignOycsICRlYXRXaGl0ZXNwYWNlKSkgewogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CgogICAgICAgIGlmICgkdGhpcy0+Y291bnQgPT09IFxzdHJsZW4oJHRoaXMtPmJ1ZmZlcikgfHwgJHRoaXMtPmJ1ZmZlclskdGhpcy0+Y291bnRdID09PSAnfScpIHsKICAgICAgICAgICAgLy8gaWYgdGhlcmUgaXMgZW5kIG9mIGZpbGUgb3IgYSBjbG9zaW5nIGJsb2NrIG5leHQgdGhlbiB3ZSBkb24ndCBuZWVkIGEgOwogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICAvKioKICAgICAqIFN0cmlwIGFzc2lnbm1lbnQgZmxhZyBmcm9tIHRoZSBsaXN0CiAgICAgKgogICAgICogQHBhcmFtIGFycmF5fE51bWJlciAkdmFsdWUKICAgICAqCiAgICAgKiBAcmV0dXJuIHN0cmluZ1tdCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBzdHJpcEFzc2lnbm1lbnRGbGFncygmJHZhbHVlKQogICAgewogICAgICAgICRmbGFncyA9IFtdOwoKICAgICAgICBmb3IgKCR0b2tlbiA9ICYkdmFsdWU7ICR0b2tlblswXSA9PT0gVHlwZTo6VF9MSVNUICYmICgkcyA9IFxjb3VudCgkdG9rZW5bMl0pKTsgJHRva2VuID0gJiRsYXN0Tm9kZSkgewogICAgICAgICAgICAkbGFzdE5vZGUgPSAmJHRva2VuWzJdWyRzIC0gMV07CgogICAgICAgICAgICB3aGlsZSAoJGxhc3ROb2RlWzBdID09PSBUeXBlOjpUX0tFWVdPUkQgJiYgXGluX2FycmF5KCRsYXN0Tm9kZVsxXSwgWychZGVmYXVsdCcsICchZ2xvYmFsJ10pKSB7CiAgICAgICAgICAgICAgICBhcnJheV9wb3AoJHRva2VuWzJdKTsKCiAgICAgICAgICAgICAgICAkbm9kZSAgICAgPSBlbmQoJHRva2VuWzJdKTsKICAgICAgICAgICAgICAgICR0b2tlbiAgICA9ICR0aGlzLT5mbGF0dGVuTGlzdCgkdG9rZW4pOwogICAgICAgICAgICAgICAgJGZsYWdzW10gID0gJGxhc3ROb2RlWzFdOwogICAgICAgICAgICAgICAgJGxhc3ROb2RlID0gJG5vZGU7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiAkZmxhZ3M7CiAgICB9CgogICAgLyoqCiAgICAgKiBTdHJpcCBvcHRpb25hbCBmbGFnIGZyb20gc2VsZWN0b3IgbGlzdAogICAgICoKICAgICAqIEBwYXJhbSBhcnJheSAkc2VsZWN0b3JzCiAgICAgKgogICAgICogQHJldHVybiBib29sCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBzdHJpcE9wdGlvbmFsRmxhZygmJHNlbGVjdG9ycykKICAgIHsKICAgICAgICAkb3B0aW9uYWwgPSBmYWxzZTsKICAgICAgICAkc2VsZWN0b3IgPSBlbmQoJHNlbGVjdG9ycyk7CiAgICAgICAgJHBhcnQgICAgID0gZW5kKCRzZWxlY3Rvcik7CgogICAgICAgIGlmICgkcGFydCA9PT0gWychb3B0aW9uYWwnXSkgewogICAgICAgICAgICBhcnJheV9wb3AoJHNlbGVjdG9yc1tcY291bnQoJHNlbGVjdG9ycykgLSAxXSk7CgogICAgICAgICAgICAkb3B0aW9uYWwgPSB0cnVlOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRvcHRpb25hbDsKICAgIH0KCiAgICAvKioKICAgICAqIFR1cm4gbGlzdCBvZiBsZW5ndGggMSBpbnRvIHZhbHVlIHR5cGUKICAgICAqCiAgICAgKiBAcGFyYW0gYXJyYXkgJHZhbHVlCiAgICAgKgogICAgICogQHJldHVybiBhcnJheQogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gZmxhdHRlbkxpc3QoJHZhbHVlKQogICAgewogICAgICAgIGlmICgkdmFsdWVbMF0gPT09IFR5cGU6OlRfTElTVCAmJiBcY291bnQoJHZhbHVlWzJdKSA9PT0gMSkgewogICAgICAgICAgICByZXR1cm4gJHRoaXMtPmZsYXR0ZW5MaXN0KCR2YWx1ZVsyXVswXSk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJHZhbHVlOwogICAgfQoKICAgIC8qKgogICAgICogUXVvdGUgcmVndWxhciBleHByZXNzaW9uCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkd2hhdAogICAgICoKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gcHJlZ1F1b3RlKCR3aGF0KQogICAgewogICAgICAgIHJldHVybiBwcmVnX3F1b3RlKCR3aGF0LCAnLycpOwogICAgfQoKICAgIC8qKgogICAgICogRXh0cmFjdCBsaW5lIG51bWJlcnMgZnJvbSBidWZmZXIKICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICRidWZmZXIKICAgICAqCiAgICAgKiBAcmV0dXJuIHZvaWQKICAgICAqLwogICAgcHJpdmF0ZSBmdW5jdGlvbiBleHRyYWN0TGluZU51bWJlcnMoJGJ1ZmZlcikKICAgIHsKICAgICAgICAkdGhpcy0+c291cmNlUG9zaXRpb25zID0gWzAgPT4gMF07CiAgICAgICAgJHByZXYgPSAwOwoKICAgICAgICB3aGlsZSAoKCRwb3MgPSBzdHJwb3MoJGJ1ZmZlciwgIlxuIiwgJHByZXYpKSAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgJHRoaXMtPnNvdXJjZVBvc2l0aW9uc1tdID0gJHBvczsKICAgICAgICAgICAgJHByZXYgPSAkcG9zICsgMTsKICAgICAgICB9CgogICAgICAgICR0aGlzLT5zb3VyY2VQb3NpdGlvbnNbXSA9IFxzdHJsZW4oJGJ1ZmZlcik7CgogICAgICAgIGlmIChzdWJzdHIoJGJ1ZmZlciwgLTEpICE9PSAiXG4iKSB7CiAgICAgICAgICAgICR0aGlzLT5zb3VyY2VQb3NpdGlvbnNbXSA9IFxzdHJsZW4oJGJ1ZmZlcikgKyAxOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEdldCBzb3VyY2UgbGluZSBudW1iZXIgYW5kIGNvbHVtbiAoZ2l2ZW4gY2hhcmFjdGVyIHBvc2l0aW9uIGluIHRoZSBidWZmZXIpCiAgICAgKgogICAgICogQHBhcmFtIGludCAkcG9zCiAgICAgKgogICAgICogQHJldHVybiBhcnJheQogICAgICogQHBocHN0YW4tcmV0dXJuIGFycmF5e2ludCwgaW50fQogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIGdldFNvdXJjZVBvc2l0aW9uKCRwb3MpCiAgICB7CiAgICAgICAgJGxvdyA9IDA7CiAgICAgICAgJGhpZ2ggPSBcY291bnQoJHRoaXMtPnNvdXJjZVBvc2l0aW9ucyk7CgogICAgICAgIHdoaWxlICgkbG93IDwgJGhpZ2gpIHsKICAgICAgICAgICAgJG1pZCA9IChpbnQpICgoJGhpZ2ggKyAkbG93KSAvIDIpOwoKICAgICAgICAgICAgaWYgKCRwb3MgPCAkdGhpcy0+c291cmNlUG9zaXRpb25zWyRtaWRdKSB7CiAgICAgICAgICAgICAgICAkaGlnaCA9ICRtaWQgLSAxOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICgkcG9zID49ICR0aGlzLT5zb3VyY2VQb3NpdGlvbnNbJG1pZCArIDFdKSB7CiAgICAgICAgICAgICAgICAkbG93ID0gJG1pZCArIDE7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIFskbWlkICsgMSwgJHBvcyAtICR0aGlzLT5zb3VyY2VQb3NpdGlvbnNbJG1pZF1dOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIFskbG93ICsgMSwgJHBvcyAtICR0aGlzLT5zb3VyY2VQb3NpdGlvbnNbJGxvd11dOwogICAgfQoKICAgIC8qKgogICAgICogU2F2ZSBpbnRlcm5hbCBlbmNvZGluZyBvZiBtYnN0cmluZwogICAgICoKICAgICAqIFdoZW4gbWJzdHJpbmcuZnVuY19vdmVybG9hZCBpcyB1c2VkIHRvIHJlcGxhY2UgdGhlIHN0YW5kYXJkIFBIUCBzdHJpbmcgZnVuY3Rpb25zLAogICAgICogdGhpcyBtZXRob2QgY29uZmlndXJlcyB0aGUgaW50ZXJuYWwgZW5jb2RpbmcgdG8gYSBzaW5nbGUtYnl0ZSBvbmUgc28gdGhhdCB0aGUKICAgICAqIGJlaGF2aW9yIG1hdGNoZXMgdGhlIG5vcm1hbCBiZWhhdmlvciBvZiBQSFAgc3RyaW5nIGZ1bmN0aW9ucyB3aGlsZSB1c2luZyB0aGUgcGFyc2VyLgogICAgICogVGhlIGV4aXN0aW5nIGludGVybmFsIGVuY29kaW5nIGlzIHNhdmVkIGFuZCB3aWxsIGJlIHJlc3RvcmVkIHdoZW4gY2FsbGluZyB7QHNlZSByZXN0b3JlRW5jb2Rpbmd9LgogICAgICoKICAgICAqIElmIG1ic3RyaW5nLmZ1bmNfb3ZlcmxvYWQgaXMgbm90IHVzZWQgKG9yIGRvZXMgbm90IG92ZXJyaWRlIHN0cmluZyBmdW5jdGlvbnMpLCB0aGlzIG1ldGhvZCBpcyBhIG5vLW9wLgogICAgICoKICAgICAqIEByZXR1cm4gdm9pZAogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIHNhdmVFbmNvZGluZygpCiAgICB7CiAgICAgICAgaWYgKFxQSFBfVkVSU0lPTl9JRCA8IDgwMDAwICYmIFxleHRlbnNpb25fbG9hZGVkKCdtYnN0cmluZycpICYmICgyICYgKGludCkgaW5pX2dldCgnbWJzdHJpbmcuZnVuY19vdmVybG9hZCcpKSA+IDApIHsKICAgICAgICAgICAgJHRoaXMtPmVuY29kaW5nID0gbWJfaW50ZXJuYWxfZW5jb2RpbmcoKTsKCiAgICAgICAgICAgIG1iX2ludGVybmFsX2VuY29kaW5nKCdpc28tODg1OS0xJyk7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogUmVzdG9yZSBpbnRlcm5hbCBlbmNvZGluZwogICAgICoKICAgICAqIEByZXR1cm4gdm9pZAogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIHJlc3RvcmVFbmNvZGluZygpCiAgICB7CiAgICAgICAgaWYgKFxleHRlbnNpb25fbG9hZGVkKCdtYnN0cmluZycpICYmICR0aGlzLT5lbmNvZGluZykgewogICAgICAgICAgICBtYl9pbnRlcm5hbF9lbmNvZGluZygkdGhpcy0+ZW5jb2RpbmcpOwogICAgICAgIH0KICAgIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/extra/scssphp/src/SourceMap/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/extra/scssphp/src/SourceMap/Base64.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXFNvdXJjZU1hcDsKCi8qKgogKiBCYXNlIDY0IEVuY29kZS9EZWNvZGUKICoKICogQGF1dGhvciBBbnRob24gUGFuZyA8YW50aG9uLnBhbmdAZ21haWwuY29tPgogKgogKiBAaW50ZXJuYWwKICovCmNsYXNzIEJhc2U2NAp7CiAgICAvKioKICAgICAqIEB2YXIgYXJyYXk8aW50LCBzdHJpbmc+CiAgICAgKi8KICAgIHByaXZhdGUgc3RhdGljICRlbmNvZGluZ01hcCA9IFsKICAgICAgICAwID0+ICdBJywKICAgICAgICAxID0+ICdCJywKICAgICAgICAyID0+ICdDJywKICAgICAgICAzID0+ICdEJywKICAgICAgICA0ID0+ICdFJywKICAgICAgICA1ID0+ICdGJywKICAgICAgICA2ID0+ICdHJywKICAgICAgICA3ID0+ICdIJywKICAgICAgICA4ID0+ICdJJywKICAgICAgICA5ID0+ICdKJywKICAgICAgICAxMCA9PiAnSycsCiAgICAgICAgMTEgPT4gJ0wnLAogICAgICAgIDEyID0+ICdNJywKICAgICAgICAxMyA9PiAnTicsCiAgICAgICAgMTQgPT4gJ08nLAogICAgICAgIDE1ID0+ICdQJywKICAgICAgICAxNiA9PiAnUScsCiAgICAgICAgMTcgPT4gJ1InLAogICAgICAgIDE4ID0+ICdTJywKICAgICAgICAxOSA9PiAnVCcsCiAgICAgICAgMjAgPT4gJ1UnLAogICAgICAgIDIxID0+ICdWJywKICAgICAgICAyMiA9PiAnVycsCiAgICAgICAgMjMgPT4gJ1gnLAogICAgICAgIDI0ID0+ICdZJywKICAgICAgICAyNSA9PiAnWicsCiAgICAgICAgMjYgPT4gJ2EnLAogICAgICAgIDI3ID0+ICdiJywKICAgICAgICAyOCA9PiAnYycsCiAgICAgICAgMjkgPT4gJ2QnLAogICAgICAgIDMwID0+ICdlJywKICAgICAgICAzMSA9PiAnZicsCiAgICAgICAgMzIgPT4gJ2cnLAogICAgICAgIDMzID0+ICdoJywKICAgICAgICAzNCA9PiAnaScsCiAgICAgICAgMzUgPT4gJ2onLAogICAgICAgIDM2ID0+ICdrJywKICAgICAgICAzNyA9PiAnbCcsCiAgICAgICAgMzggPT4gJ20nLAogICAgICAgIDM5ID0+ICduJywKICAgICAgICA0MCA9PiAnbycsCiAgICAgICAgNDEgPT4gJ3AnLAogICAgICAgIDQyID0+ICdxJywKICAgICAgICA0MyA9PiAncicsCiAgICAgICAgNDQgPT4gJ3MnLAogICAgICAgIDQ1ID0+ICd0JywKICAgICAgICA0NiA9PiAndScsCiAgICAgICAgNDcgPT4gJ3YnLAogICAgICAgIDQ4ID0+ICd3JywKICAgICAgICA0OSA9PiAneCcsCiAgICAgICAgNTAgPT4gJ3knLAogICAgICAgIDUxID0+ICd6JywKICAgICAgICA1MiA9PiAnMCcsCiAgICAgICAgNTMgPT4gJzEnLAogICAgICAgIDU0ID0+ICcyJywKICAgICAgICA1NSA9PiAnMycsCiAgICAgICAgNTYgPT4gJzQnLAogICAgICAgIDU3ID0+ICc1JywKICAgICAgICA1OCA9PiAnNicsCiAgICAgICAgNTkgPT4gJzcnLAogICAgICAgIDYwID0+ICc4JywKICAgICAgICA2MSA9PiAnOScsCiAgICAgICAgNjIgPT4gJysnLAogICAgICAgIDYzID0+ICcvJywKICAgIF07CgogICAgLyoqCiAgICAgKiBAdmFyIGFycmF5PHN0cmluZ3xpbnQsIGludD4KICAgICAqLwogICAgcHJpdmF0ZSBzdGF0aWMgJGRlY29kaW5nTWFwID0gWwogICAgICAgICdBJyA9PiAwLAogICAgICAgICdCJyA9PiAxLAogICAgICAgICdDJyA9PiAyLAogICAgICAgICdEJyA9PiAzLAogICAgICAgICdFJyA9PiA0LAogICAgICAgICdGJyA9PiA1LAogICAgICAgICdHJyA9PiA2LAogICAgICAgICdIJyA9PiA3LAogICAgICAgICdJJyA9PiA4LAogICAgICAgICdKJyA9PiA5LAogICAgICAgICdLJyA9PiAxMCwKICAgICAgICAnTCcgPT4gMTEsCiAgICAgICAgJ00nID0+IDEyLAogICAgICAgICdOJyA9PiAxMywKICAgICAgICAnTycgPT4gMTQsCiAgICAgICAgJ1AnID0+IDE1LAogICAgICAgICdRJyA9PiAxNiwKICAgICAgICAnUicgPT4gMTcsCiAgICAgICAgJ1MnID0+IDE4LAogICAgICAgICdUJyA9PiAxOSwKICAgICAgICAnVScgPT4gMjAsCiAgICAgICAgJ1YnID0+IDIxLAogICAgICAgICdXJyA9PiAyMiwKICAgICAgICAnWCcgPT4gMjMsCiAgICAgICAgJ1knID0+IDI0LAogICAgICAgICdaJyA9PiAyNSwKICAgICAgICAnYScgPT4gMjYsCiAgICAgICAgJ2InID0+IDI3LAogICAgICAgICdjJyA9PiAyOCwKICAgICAgICAnZCcgPT4gMjksCiAgICAgICAgJ2UnID0+IDMwLAogICAgICAgICdmJyA9PiAzMSwKICAgICAgICAnZycgPT4gMzIsCiAgICAgICAgJ2gnID0+IDMzLAogICAgICAgICdpJyA9PiAzNCwKICAgICAgICAnaicgPT4gMzUsCiAgICAgICAgJ2snID0+IDM2LAogICAgICAgICdsJyA9PiAzNywKICAgICAgICAnbScgPT4gMzgsCiAgICAgICAgJ24nID0+IDM5LAogICAgICAgICdvJyA9PiA0MCwKICAgICAgICAncCcgPT4gNDEsCiAgICAgICAgJ3EnID0+IDQyLAogICAgICAgICdyJyA9PiA0MywKICAgICAgICAncycgPT4gNDQsCiAgICAgICAgJ3QnID0+IDQ1LAogICAgICAgICd1JyA9PiA0NiwKICAgICAgICAndicgPT4gNDcsCiAgICAgICAgJ3cnID0+IDQ4LAogICAgICAgICd4JyA9PiA0OSwKICAgICAgICAneScgPT4gNTAsCiAgICAgICAgJ3onID0+IDUxLAogICAgICAgIDAgPT4gNTIsCiAgICAgICAgMSA9PiA1MywKICAgICAgICAyID0+IDU0LAogICAgICAgIDMgPT4gNTUsCiAgICAgICAgNCA9PiA1NiwKICAgICAgICA1ID0+IDU3LAogICAgICAgIDYgPT4gNTgsCiAgICAgICAgNyA9PiA1OSwKICAgICAgICA4ID0+IDYwLAogICAgICAgIDkgPT4gNjEsCiAgICAgICAgJysnID0+IDYyLAogICAgICAgICcvJyA9PiA2MywKICAgIF07CgogICAgLyoqCiAgICAgKiBDb252ZXJ0IHRvIGJhc2U2NAogICAgICoKICAgICAqIEBwYXJhbSBpbnQgJHZhbHVlCiAgICAgKgogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBlbmNvZGUoJHZhbHVlKQogICAgewogICAgICAgIHJldHVybiBzZWxmOjokZW5jb2RpbmdNYXBbJHZhbHVlXTsKICAgIH0KCiAgICAvKioKICAgICAqIENvbnZlcnQgZnJvbSBiYXNlNjQKICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICR2YWx1ZQogICAgICoKICAgICAqIEByZXR1cm4gaW50CiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZGVjb2RlKCR2YWx1ZSkKICAgIHsKICAgICAgICByZXR1cm4gc2VsZjo6JGRlY29kaW5nTWFwWyR2YWx1ZV07CiAgICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/extra/scssphp/src/SourceMap/Base64VLQ.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXFNvdXJjZU1hcDsKCi8qKgogKiBCYXNlIDY0IFZMUQogKgogKiBCYXNlZCBvbiB0aGUgQmFzZSA2NCBWTFEgaW1wbGVtZW50YXRpb24gaW4gQ2xvc3VyZSBDb21waWxlcjoKICogaHR0cHM6Ly9naXRodWIuY29tL2dvb2dsZS9jbG9zdXJlLWNvbXBpbGVyL2Jsb2IvbWFzdGVyL3NyYy9jb20vZ29vZ2xlL2RlYnVnZ2luZy9zb3VyY2VtYXAvQmFzZTY0VkxRLmphdmEKICoKICogQ29weXJpZ2h0IDIwMTEgVGhlIENsb3N1cmUgQ29tcGlsZXIgQXV0aG9ycy4KICoKICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqCiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICoKICogQGF1dGhvciBKb2huIExlbnogPGpvaG5sZW56QGdvb2dsZS5jb20+CiAqIEBhdXRob3IgQW50aG9uIFBhbmcgPGFudGhvbi5wYW5nQGdtYWlsLmNvbT4KICoKICogQGludGVybmFsCiAqLwpjbGFzcyBCYXNlNjRWTFEKewogICAgLy8gQSBCYXNlNjQgVkxRIGRpZ2l0IGNhbiByZXByZXNlbnQgNSBiaXRzLCBzbyBpdCBpcyBiYXNlLTMyLgogICAgY29uc3QgVkxRX0JBU0VfU0hJRlQgPSA1OwoKICAgIC8vIEEgbWFzayBvZiBiaXRzIGZvciBhIFZMUSBkaWdpdCAoMTExMTEpLCAzMSBkZWNpbWFsLgogICAgY29uc3QgVkxRX0JBU0VfTUFTSyA9IDMxOwoKICAgIC8vIFRoZSBjb250aW51YXRpb24gYml0IGlzIHRoZSA2dGggYml0LgogICAgY29uc3QgVkxRX0NPTlRJTlVBVElPTl9CSVQgPSAzMjsKCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIFZMUSBlbmNvZGVkIHZhbHVlLgogICAgICoKICAgICAqIEBwYXJhbSBpbnQgJHZhbHVlCiAgICAgKgogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBlbmNvZGUoJHZhbHVlKQogICAgewogICAgICAgICRlbmNvZGVkID0gJyc7CiAgICAgICAgJHZscSA9IHNlbGY6OnRvVkxRU2lnbmVkKCR2YWx1ZSk7CgogICAgICAgIGRvIHsKICAgICAgICAgICAgJGRpZ2l0ID0gJHZscSAmIHNlbGY6OlZMUV9CQVNFX01BU0s7CgogICAgICAgICAgICAvLyR2bHEgPj4+PSBzZWxmOjpWTFFfQkFTRV9TSElGVDsgLy8gdW5zaWduZWQgcmlnaHQgc2hpZnQKICAgICAgICAgICAgJHZscSA9ICgoJHZscSA+PiAxKSAmIFBIUF9JTlRfTUFYKSA+PiAoc2VsZjo6VkxRX0JBU0VfU0hJRlQgLSAxKTsKCiAgICAgICAgICAgIGlmICgkdmxxID4gMCkgewogICAgICAgICAgICAgICAgJGRpZ2l0IHw9IHNlbGY6OlZMUV9DT05USU5VQVRJT05fQklUOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkZW5jb2RlZCAuPSBCYXNlNjQ6OmVuY29kZSgkZGlnaXQpOwogICAgICAgIH0gd2hpbGUgKCR2bHEgPiAwKTsKCiAgICAgICAgcmV0dXJuICRlbmNvZGVkOwogICAgfQoKICAgIC8qKgogICAgICogRGVjb2RlcyBWTFFWYWx1ZS4KICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICRzdHIKICAgICAqIEBwYXJhbSBpbnQgICAgJGluZGV4CiAgICAgKgogICAgICogQHJldHVybiBpbnQKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBkZWNvZGUoJHN0ciwgJiRpbmRleCkKICAgIHsKICAgICAgICAkcmVzdWx0ID0gMDsKICAgICAgICAkc2hpZnQgPSAwOwoKICAgICAgICBkbyB7CiAgICAgICAgICAgICRjID0gJHN0clskaW5kZXgrK107CiAgICAgICAgICAgICRkaWdpdCA9IEJhc2U2NDo6ZGVjb2RlKCRjKTsKICAgICAgICAgICAgJGNvbnRpbnVhdGlvbiA9ICgkZGlnaXQgJiBzZWxmOjpWTFFfQ09OVElOVUFUSU9OX0JJVCkgIT0gMDsKICAgICAgICAgICAgJGRpZ2l0ICY9IHNlbGY6OlZMUV9CQVNFX01BU0s7CiAgICAgICAgICAgICRyZXN1bHQgPSAkcmVzdWx0ICsgKCRkaWdpdCA8PCAkc2hpZnQpOwogICAgICAgICAgICAkc2hpZnQgPSAkc2hpZnQgKyBzZWxmOjpWTFFfQkFTRV9TSElGVDsKICAgICAgICB9IHdoaWxlICgkY29udGludWF0aW9uKTsKCiAgICAgICAgcmV0dXJuIHNlbGY6OmZyb21WTFFTaWduZWQoJHJlc3VsdCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDb252ZXJ0cyBmcm9tIGEgdHdvLWNvbXBsZW1lbnQgdmFsdWUgdG8gYSB2YWx1ZSB3aGVyZSB0aGUgc2lnbiBiaXQgaXMKICAgICAqIGlzIHBsYWNlZCBpbiB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0LiAgRm9yIGV4YW1wbGUsIGFzIGRlY2ltYWxzOgogICAgICogICAxIGJlY29tZXMgMiAoMTAgYmluYXJ5KSwgLTEgYmVjb21lcyAzICgxMSBiaW5hcnkpCiAgICAgKiAgIDIgYmVjb21lcyA0ICgxMDAgYmluYXJ5KSwgLTIgYmVjb21lcyA1ICgxMDEgYmluYXJ5KQogICAgICoKICAgICAqIEBwYXJhbSBpbnQgJHZhbHVlCiAgICAgKgogICAgICogQHJldHVybiBpbnQKICAgICAqLwogICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gdG9WTFFTaWduZWQoJHZhbHVlKQogICAgewogICAgICAgIGlmICgkdmFsdWUgPCAwKSB7CiAgICAgICAgICAgIHJldHVybiAoKC0kdmFsdWUpIDw8IDEpICsgMTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAoJHZhbHVlIDw8IDEpICsgMDsKICAgIH0KCiAgICAvKioKICAgICAqIENvbnZlcnRzIHRvIGEgdHdvLWNvbXBsZW1lbnQgdmFsdWUgZnJvbSBhIHZhbHVlIHdoZXJlIHRoZSBzaWduIGJpdCBpcwogICAgICogaXMgcGxhY2VkIGluIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXQuICBGb3IgZXhhbXBsZSwgYXMgZGVjaW1hbHM6CiAgICAgKiAgIDIgKDEwIGJpbmFyeSkgYmVjb21lcyAxLCAzICgxMSBiaW5hcnkpIGJlY29tZXMgLTEKICAgICAqICAgNCAoMTAwIGJpbmFyeSkgYmVjb21lcyAyLCA1ICgxMDEgYmluYXJ5KSBiZWNvbWVzIC0yCiAgICAgKgogICAgICogQHBhcmFtIGludCAkdmFsdWUKICAgICAqCiAgICAgKiBAcmV0dXJuIGludAogICAgICovCiAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBmcm9tVkxRU2lnbmVkKCR2YWx1ZSkKICAgIHsKICAgICAgICAkbmVnYXRlID0gKCR2YWx1ZSAmIDEpID09PSAxOwoKICAgICAgICAvLyR2YWx1ZSA+Pj49IDE7IC8vIHVuc2lnbmVkIHJpZ2h0IHNoaWZ0CiAgICAgICAgJHZhbHVlID0gKCR2YWx1ZSA+PiAxKSAmIFBIUF9JTlRfTUFYOwoKICAgICAgICBpZiAoISAkbmVnYXRlKSB7CiAgICAgICAgICAgIHJldHVybiAkdmFsdWU7CiAgICAgICAgfQoKICAgICAgICAvLyBXZSBuZWVkIHRvIE9SIDB4ODAwMDAwMDAgaGVyZSB0byBlbnN1cmUgdGhlIDMybmQgYml0ICh0aGUgc2lnbiBiaXQpIGlzCiAgICAgICAgLy8gYWx3YXlzIHNldCBmb3IgbmVnYXRpdmUgbnVtYmVycy4gSWYgYHZhbHVlYCB3ZXJlIDEsIChtZWFuaW5nIGBuZWdhdGVgIGlzCiAgICAgICAgLy8gdHJ1ZSBhbmQgYWxsIG90aGVyIGJpdHMgd2VyZSB6ZXJvcyksIGB2YWx1ZWAgd291bGQgbm93IGJlIDAuIC0wIGlzIGp1c3QKICAgICAgICAvLyAwLCBhbmQgZG9lc24ndCBmbGlwIHRoZSAzMm5kIGJpdCBhcyBpbnRlbmRlZC4gQWxsIHBvc2l0aXZlIG51bWJlcnMgd2lsbAogICAgICAgIC8vIHN1Y2Nlc3NmdWxseSBmbGlwIHRoZSAzMm5kIGJpdCB3aXRob3V0IGlzc3VlLCBzbyBpdCdzIGEgbm9vcCBmb3IgdGhlbS4KICAgICAgICByZXR1cm4gLSR2YWx1ZSB8IDB4ODAwMDAwMDA7CiAgICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/extra/scssphp/src/SourceMap/SourceMapGenerator.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXFNvdXJjZU1hcDsKCnVzZSBTY3NzUGhwXFNjc3NQaHBcRXhjZXB0aW9uXENvbXBpbGVyRXhjZXB0aW9uOwoKLyoqCiAqIFNvdXJjZSBNYXAgR2VuZXJhdG9yCiAqCiAqIHtAaW50ZXJuYWwgRGVyaXZhdGl2ZSBvZiBveWVqb3JnZS9sZXNzLnBocCdzIGxpYi9Tb3VyY2VNYXAvR2VuZXJhdG9yLnBocCwgcmVsaWNlbnNlZCB3aXRoIHBlcm1pc3Npb24uIH19CiAqCiAqIEBhdXRob3IgSm9zaCBTY2htaWR0IDxveWVqb3JnZUBnbWFpbC5jb20+CiAqIEBhdXRob3IgTmljb2xhcyBGUkFOw4dPSVMgPG5pY29sYXMuZnJhbmNvaXNAZnJvZy1sYWJzLmNvbT4KICoKICogQGludGVybmFsCiAqLwpjbGFzcyBTb3VyY2VNYXBHZW5lcmF0b3IKewogICAgLyoqCiAgICAgKiBXaGF0IHZlcnNpb24gb2Ygc291cmNlIG1hcCBkb2VzIHRoZSBnZW5lcmF0b3IgZ2VuZXJhdGU/CiAgICAgKi8KICAgIGNvbnN0IFZFUlNJT04gPSAzOwoKICAgIC8qKgogICAgICogQXJyYXkgb2YgZGVmYXVsdCBvcHRpb25zCiAgICAgKgogICAgICogQHZhciBhcnJheQogICAgICogQHBocHN0YW4tdmFyIGFycmF5e3NvdXJjZVJvb3Q6IHN0cmluZywgc291cmNlTWFwRmlsZW5hbWU6IHN0cmluZ3xudWxsLCBzb3VyY2VNYXBVUkw6IHN0cmluZ3xudWxsLCBzb3VyY2VNYXBXcml0ZVRvOiBzdHJpbmd8bnVsbCwgb3V0cHV0U291cmNlRmlsZXM6IGJvb2wsIHNvdXJjZU1hcFJvb3RwYXRoOiBzdHJpbmcsIHNvdXJjZU1hcEJhc2VwYXRoOiBzdHJpbmd9CiAgICAgKi8KICAgIHByb3RlY3RlZCAkZGVmYXVsdE9wdGlvbnMgPSBbCiAgICAgICAgLy8gYW4gb3B0aW9uYWwgc291cmNlIHJvb3QsIHVzZWZ1bCBmb3IgcmVsb2NhdGluZyBzb3VyY2UgZmlsZXMKICAgICAgICAvLyBvbiBhIHNlcnZlciBvciByZW1vdmluZyByZXBlYXRlZCB2YWx1ZXMgaW4gdGhlICdzb3VyY2VzJyBlbnRyeS4KICAgICAgICAvLyBUaGlzIHZhbHVlIGlzIHByZXBlbmRlZCB0byB0aGUgaW5kaXZpZHVhbCBlbnRyaWVzIGluIHRoZSAnc291cmNlJyBmaWVsZC4KICAgICAgICAnc291cmNlUm9vdCcgPT4gJycsCgogICAgICAgIC8vIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGdlbmVyYXRlZCBjb2RlIHRoYXQgdGhpcyBzb3VyY2UgbWFwIGlzIGFzc29jaWF0ZWQgd2l0aC4KICAgICAgICAnc291cmNlTWFwRmlsZW5hbWUnID0+IG51bGwsCgogICAgICAgIC8vIHVybCBvZiB0aGUgbWFwCiAgICAgICAgJ3NvdXJjZU1hcFVSTCcgPT4gbnVsbCwKCiAgICAgICAgLy8gYWJzb2x1dGUgcGF0aCB0byBhIGZpbGUgdG8gd3JpdGUgdGhlIG1hcCB0bwogICAgICAgICdzb3VyY2VNYXBXcml0ZVRvJyA9PiBudWxsLAoKICAgICAgICAvLyBvdXRwdXQgc291cmNlIGNvbnRlbnRzPwogICAgICAgICdvdXRwdXRTb3VyY2VGaWxlcycgPT4gZmFsc2UsCgogICAgICAgIC8vIGJhc2UgcGF0aCBmb3IgZmlsZW5hbWUgbm9ybWFsaXphdGlvbgogICAgICAgICdzb3VyY2VNYXBSb290cGF0aCcgPT4gJycsCgogICAgICAgIC8vIGJhc2UgcGF0aCBmb3IgZmlsZW5hbWUgbm9ybWFsaXphdGlvbgogICAgICAgICdzb3VyY2VNYXBCYXNlcGF0aCcgPT4gJycKICAgIF07CgogICAgLyoqCiAgICAgKiBUaGUgYmFzZTY0IFZMUSBlbmNvZGVyCiAgICAgKgogICAgICogQHZhciBcU2Nzc1BocFxTY3NzUGhwXFNvdXJjZU1hcFxCYXNlNjRWTFEKICAgICAqLwogICAgcHJvdGVjdGVkICRlbmNvZGVyOwoKICAgIC8qKgogICAgICogQXJyYXkgb2YgbWFwcGluZ3MKICAgICAqCiAgICAgKiBAdmFyIGFycmF5CiAgICAgKiBAcGhwc3Rhbi12YXIgbGlzdDxhcnJheXtnZW5lcmF0ZWRfbGluZTogaW50LCBnZW5lcmF0ZWRfY29sdW1uOiBpbnQsIG9yaWdpbmFsX2xpbmU6IGludCwgb3JpZ2luYWxfY29sdW1uOiBpbnQsIHNvdXJjZV9maWxlOiBzdHJpbmd9PgogICAgICovCiAgICBwcm90ZWN0ZWQgJG1hcHBpbmdzID0gW107CgogICAgLyoqCiAgICAgKiBBcnJheSBvZiBjb250ZW50cyBtYXAKICAgICAqCiAgICAgKiBAdmFyIGFycmF5CiAgICAgKi8KICAgIHByb3RlY3RlZCAkY29udGVudHNNYXAgPSBbXTsKCiAgICAvKioKICAgICAqIEZpbGUgdG8gY29udGVudCBtYXAKICAgICAqCiAgICAgKiBAdmFyIGFycmF5PHN0cmluZywgc3RyaW5nPgogICAgICovCiAgICBwcm90ZWN0ZWQgJHNvdXJjZXMgPSBbXTsKCiAgICAvKioKICAgICAqIEB2YXIgYXJyYXk8c3RyaW5nLCBpbnQ+CiAgICAgKi8KICAgIHByb3RlY3RlZCAkc291cmNlS2V5cyA9IFtdOwoKICAgIC8qKgogICAgICogQHZhciBhcnJheQogICAgICogQHBocHN0YW4tdmFyIGFycmF5e3NvdXJjZVJvb3Q6IHN0cmluZywgc291cmNlTWFwRmlsZW5hbWU6IHN0cmluZ3xudWxsLCBzb3VyY2VNYXBVUkw6IHN0cmluZ3xudWxsLCBzb3VyY2VNYXBXcml0ZVRvOiBzdHJpbmd8bnVsbCwgb3V0cHV0U291cmNlRmlsZXM6IGJvb2wsIHNvdXJjZU1hcFJvb3RwYXRoOiBzdHJpbmcsIHNvdXJjZU1hcEJhc2VwYXRoOiBzdHJpbmd9CiAgICAgKi8KICAgIHByaXZhdGUgJG9wdGlvbnM7CgogICAgLyoqCiAgICAgKiBAcGhwc3Rhbi1wYXJhbSBhcnJheXtzb3VyY2VSb290Pzogc3RyaW5nLCBzb3VyY2VNYXBGaWxlbmFtZT86IHN0cmluZ3xudWxsLCBzb3VyY2VNYXBVUkw/OiBzdHJpbmd8bnVsbCwgc291cmNlTWFwV3JpdGVUbz86IHN0cmluZ3xudWxsLCBvdXRwdXRTb3VyY2VGaWxlcz86IGJvb2wsIHNvdXJjZU1hcFJvb3RwYXRoPzogc3RyaW5nLCBzb3VyY2VNYXBCYXNlcGF0aD86IHN0cmluZ30gJG9wdGlvbnMKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KGFycmF5ICRvcHRpb25zID0gW10pCiAgICB7CiAgICAgICAgJHRoaXMtPm9wdGlvbnMgPSBhcnJheV9yZXBsYWNlKCR0aGlzLT5kZWZhdWx0T3B0aW9ucywgJG9wdGlvbnMpOwogICAgICAgICR0aGlzLT5lbmNvZGVyID0gbmV3IEJhc2U2NFZMUSgpOwogICAgfQoKICAgIC8qKgogICAgICogQWRkcyBhIG1hcHBpbmcKICAgICAqCiAgICAgKiBAcGFyYW0gaW50ICAgICRnZW5lcmF0ZWRMaW5lICAgVGhlIGxpbmUgbnVtYmVyIGluIGdlbmVyYXRlZCBmaWxlCiAgICAgKiBAcGFyYW0gaW50ICAgICRnZW5lcmF0ZWRDb2x1bW4gVGhlIGNvbHVtbiBudW1iZXIgaW4gZ2VuZXJhdGVkIGZpbGUKICAgICAqIEBwYXJhbSBpbnQgICAgJG9yaWdpbmFsTGluZSAgICBUaGUgbGluZSBudW1iZXIgaW4gb3JpZ2luYWwgZmlsZQogICAgICogQHBhcmFtIGludCAgICAkb3JpZ2luYWxDb2x1bW4gIFRoZSBjb2x1bW4gbnVtYmVyIGluIG9yaWdpbmFsIGZpbGUKICAgICAqIEBwYXJhbSBzdHJpbmcgJHNvdXJjZUZpbGUgICAgICBUaGUgb3JpZ2luYWwgc291cmNlIGZpbGUKICAgICAqCiAgICAgKiBAcmV0dXJuIHZvaWQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGFkZE1hcHBpbmcoJGdlbmVyYXRlZExpbmUsICRnZW5lcmF0ZWRDb2x1bW4sICRvcmlnaW5hbExpbmUsICRvcmlnaW5hbENvbHVtbiwgJHNvdXJjZUZpbGUpCiAgICB7CiAgICAgICAgJHRoaXMtPm1hcHBpbmdzW10gPSBbCiAgICAgICAgICAgICdnZW5lcmF0ZWRfbGluZScgICA9PiAkZ2VuZXJhdGVkTGluZSwKICAgICAgICAgICAgJ2dlbmVyYXRlZF9jb2x1bW4nID0+ICRnZW5lcmF0ZWRDb2x1bW4sCiAgICAgICAgICAgICdvcmlnaW5hbF9saW5lJyAgICA9PiAkb3JpZ2luYWxMaW5lLAogICAgICAgICAgICAnb3JpZ2luYWxfY29sdW1uJyAgPT4gJG9yaWdpbmFsQ29sdW1uLAogICAgICAgICAgICAnc291cmNlX2ZpbGUnICAgICAgPT4gJHNvdXJjZUZpbGUKICAgICAgICBdOwoKICAgICAgICAkdGhpcy0+c291cmNlc1skc291cmNlRmlsZV0gPSAkc291cmNlRmlsZTsKICAgIH0KCiAgICAvKioKICAgICAqIFNhdmVzIHRoZSBzb3VyY2UgbWFwIHRvIGEgZmlsZQogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgJGNvbnRlbnQgVGhlIGNvbnRlbnQgdG8gd3JpdGUKICAgICAqCiAgICAgKiBAcmV0dXJuIHN0cmluZ3xudWxsCiAgICAgKgogICAgICogQHRocm93cyBcU2Nzc1BocFxTY3NzUGhwXEV4Y2VwdGlvblxDb21waWxlckV4Y2VwdGlvbiBJZiB0aGUgZmlsZSBjb3VsZCBub3QgYmUgc2F2ZWQKICAgICAqIEBkZXByZWNhdGVkCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzYXZlTWFwKCRjb250ZW50KQogICAgewogICAgICAgICRmaWxlID0gJHRoaXMtPm9wdGlvbnNbJ3NvdXJjZU1hcFdyaXRlVG8nXTsKICAgICAgICBhc3NlcnQoJGZpbGUgIT09IG51bGwpOwogICAgICAgICRkaXIgID0gXGRpcm5hbWUoJGZpbGUpOwoKICAgICAgICAvLyBkaXJlY3RvcnkgZG9lcyBub3QgZXhpc3QKICAgICAgICBpZiAoISBpc19kaXIoJGRpcikpIHsKICAgICAgICAgICAgLy8gRklYTUU6IGNyZWF0ZSB0aGUgZGlyIGF1dG9tYXRpY2FsbHk/CiAgICAgICAgICAgIHRocm93IG5ldyBDb21waWxlckV4Y2VwdGlvbigKICAgICAgICAgICAgICAgIHNwcmludGYoJ1RoZSBkaXJlY3RvcnkgIiVzIiBkb2VzIG5vdCBleGlzdC4gQ2Fubm90IHNhdmUgdGhlIHNvdXJjZSBtYXAuJywgJGRpcikKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIC8vIEZJWE1FOiBwcm9wZXIgc2F2aW5nLCB3aXRoIGRpciB3cml0ZSBjaGVjayEKICAgICAgICBpZiAoZmlsZV9wdXRfY29udGVudHMoJGZpbGUsICRjb250ZW50KSA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IENvbXBpbGVyRXhjZXB0aW9uKHNwcmludGYoJ0Nhbm5vdCBzYXZlIHRoZSBzb3VyY2UgbWFwIHRvICIlcyInLCAkZmlsZSkpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICR0aGlzLT5vcHRpb25zWydzb3VyY2VNYXBVUkwnXTsKICAgIH0KCiAgICAvKioKICAgICAqIEdlbmVyYXRlcyB0aGUgSlNPTiBzb3VyY2UgbWFwCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkcHJlZml4IEEgcHJlZml4IGFkZGVkIGluIHRoZSBvdXRwdXQgZmlsZSwgd2hpY2ggbmVlZHMgdG8gc2hpZnQgbWFwcGluZ3MKICAgICAqCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICoKICAgICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vZG9jdW1lbnQvZC8xVTFSR0FlaFF3UnlwVVRvdkYxS1JscGlPRnplMGItXzJnYzZmQUgwS1kway9lZGl0IwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2VuZXJhdGVKc29uKCRwcmVmaXggPSAnJykKICAgIHsKICAgICAgICAkc291cmNlTWFwID0gW107CiAgICAgICAgJG1hcHBpbmdzICA9ICR0aGlzLT5nZW5lcmF0ZU1hcHBpbmdzKCRwcmVmaXgpOwoKICAgICAgICAvLyBGaWxlIHZlcnNpb24gKGFsd2F5cyB0aGUgZmlyc3QgZW50cnkgaW4gdGhlIG9iamVjdCkgYW5kIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyLgogICAgICAgICRzb3VyY2VNYXBbJ3ZlcnNpb24nXSA9IHNlbGY6OlZFUlNJT047CgogICAgICAgIC8vIEFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGdlbmVyYXRlZCBjb2RlIHRoYXQgdGhpcyBzb3VyY2UgbWFwIGlzIGFzc29jaWF0ZWQgd2l0aC4KICAgICAgICAkZmlsZSA9ICR0aGlzLT5vcHRpb25zWydzb3VyY2VNYXBGaWxlbmFtZSddOwoKICAgICAgICBpZiAoJGZpbGUpIHsKICAgICAgICAgICAgJHNvdXJjZU1hcFsnZmlsZSddID0gJGZpbGU7CiAgICAgICAgfQoKICAgICAgICAvLyBBbiBvcHRpb25hbCBzb3VyY2Ugcm9vdCwgdXNlZnVsIGZvciByZWxvY2F0aW5nIHNvdXJjZSBmaWxlcyBvbiBhIHNlcnZlciBvciByZW1vdmluZyByZXBlYXRlZCB2YWx1ZXMgaW4gdGhlCiAgICAgICAgLy8gJ3NvdXJjZXMnIGVudHJ5LiBUaGlzIHZhbHVlIGlzIHByZXBlbmRlZCB0byB0aGUgaW5kaXZpZHVhbCBlbnRyaWVzIGluIHRoZSAnc291cmNlJyBmaWVsZC4KICAgICAgICAkcm9vdCA9ICR0aGlzLT5vcHRpb25zWydzb3VyY2VSb290J107CgogICAgICAgIGlmICgkcm9vdCkgewogICAgICAgICAgICAkc291cmNlTWFwWydzb3VyY2VSb290J10gPSAkcm9vdDsKICAgICAgICB9CgogICAgICAgIC8vIEEgbGlzdCBvZiBvcmlnaW5hbCBzb3VyY2VzIHVzZWQgYnkgdGhlICdtYXBwaW5ncycgZW50cnkuCiAgICAgICAgJHNvdXJjZU1hcFsnc291cmNlcyddID0gW107CgogICAgICAgIGZvcmVhY2ggKCR0aGlzLT5zb3VyY2VzIGFzICRzb3VyY2VGaWxlbmFtZSkgewogICAgICAgICAgICAkc291cmNlTWFwWydzb3VyY2VzJ11bXSA9ICR0aGlzLT5ub3JtYWxpemVGaWxlbmFtZSgkc291cmNlRmlsZW5hbWUpOwogICAgICAgIH0KCiAgICAgICAgLy8gQSBsaXN0IG9mIHN5bWJvbCBuYW1lcyB1c2VkIGJ5IHRoZSAnbWFwcGluZ3MnIGVudHJ5LgogICAgICAgICRzb3VyY2VNYXBbJ25hbWVzJ10gPSBbXTsKCiAgICAgICAgLy8gQSBzdHJpbmcgd2l0aCB0aGUgZW5jb2RlZCBtYXBwaW5nIGRhdGEuCiAgICAgICAgJHNvdXJjZU1hcFsnbWFwcGluZ3MnXSA9ICRtYXBwaW5nczsKCiAgICAgICAgaWYgKCR0aGlzLT5vcHRpb25zWydvdXRwdXRTb3VyY2VGaWxlcyddKSB7CiAgICAgICAgICAgIC8vIEFuIG9wdGlvbmFsIGxpc3Qgb2Ygc291cmNlIGNvbnRlbnQsIHVzZWZ1bCB3aGVuIHRoZSAnc291cmNlJyBjYW4ndCBiZSBob3N0ZWQuCiAgICAgICAgICAgIC8vIFRoZSBjb250ZW50cyBhcmUgbGlzdGVkIGluIHRoZSBzYW1lIG9yZGVyIGFzIHRoZSBzb3VyY2VzIGFib3ZlLgogICAgICAgICAgICAvLyAnbnVsbCcgbWF5IGJlIHVzZWQgaWYgc29tZSBvcmlnaW5hbCBzb3VyY2VzIHNob3VsZCBiZSByZXRyaWV2ZWQgYnkgbmFtZS4KICAgICAgICAgICAgJHNvdXJjZU1hcFsnc291cmNlc0NvbnRlbnQnXSA9ICR0aGlzLT5nZXRTb3VyY2VzQ29udGVudCgpOwogICAgICAgIH0KCiAgICAgICAgLy8gbGVzcy5qcyBjb21wYXQgZml4ZXMKICAgICAgICBpZiAoXGNvdW50KCRzb3VyY2VNYXBbJ3NvdXJjZXMnXSkgJiYgZW1wdHkoJHNvdXJjZU1hcFsnc291cmNlUm9vdCddKSkgewogICAgICAgICAgICB1bnNldCgkc291cmNlTWFwWydzb3VyY2VSb290J10pOwogICAgICAgIH0KCiAgICAgICAgJGpzb25Tb3VyY2VNYXAgPSBqc29uX2VuY29kZSgkc291cmNlTWFwLCBKU09OX1VORVNDQVBFRF9TTEFTSEVTKTsKCiAgICAgICAgaWYgKGpzb25fbGFzdF9lcnJvcigpICE9PSBKU09OX0VSUk9SX05PTkUpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKGpzb25fbGFzdF9lcnJvcl9tc2coKSk7CiAgICAgICAgfQoKICAgICAgICBhc3NlcnQoJGpzb25Tb3VyY2VNYXAgIT09IGZhbHNlKTsKCiAgICAgICAgcmV0dXJuICRqc29uU291cmNlTWFwOwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgc291cmNlcyBjb250ZW50cwogICAgICoKICAgICAqIEByZXR1cm4gc3RyaW5nW118bnVsbAogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0U291cmNlc0NvbnRlbnQoKQogICAgewogICAgICAgIGlmIChlbXB0eSgkdGhpcy0+c291cmNlcykpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQoKICAgICAgICAkY29udGVudCA9IFtdOwoKICAgICAgICBmb3JlYWNoICgkdGhpcy0+c291cmNlcyBhcyAkc291cmNlRmlsZSkgewogICAgICAgICAgICAkY29udGVudFtdID0gZmlsZV9nZXRfY29udGVudHMoJHNvdXJjZUZpbGUpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRjb250ZW50OwogICAgfQoKICAgIC8qKgogICAgICogR2VuZXJhdGVzIHRoZSBtYXBwaW5ncyBzdHJpbmcKICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICRwcmVmaXggQSBwcmVmaXggYWRkZWQgaW4gdGhlIG91dHB1dCBmaWxlLCB3aGljaCBuZWVkcyB0byBzaGlmdCBtYXBwaW5ncwogICAgICoKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZW5lcmF0ZU1hcHBpbmdzKCRwcmVmaXggPSAnJykKICAgIHsKICAgICAgICBpZiAoISBcY291bnQoJHRoaXMtPm1hcHBpbmdzKSkgewogICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgfQoKICAgICAgICAkcHJlZml4TGluZXMgPSBzdWJzdHJfY291bnQoJHByZWZpeCwgIlxuIik7CiAgICAgICAgJGxhc3RQcmVmaXhOZXdMaW5lID0gc3RycnBvcygkcHJlZml4LCAiXG4iKTsKICAgICAgICAkbGFzdFByZWZpeExpbmVTdGFydCA9IGZhbHNlID09PSAkbGFzdFByZWZpeE5ld0xpbmUgPyAwIDogJGxhc3RQcmVmaXhOZXdMaW5lICsgMTsKICAgICAgICAkcHJlZml4Q29sdW1uID0gc3RybGVuKCRwcmVmaXgpIC0gJGxhc3RQcmVmaXhMaW5lU3RhcnQ7CgogICAgICAgICR0aGlzLT5zb3VyY2VLZXlzID0gYXJyYXlfZmxpcChhcnJheV9rZXlzKCR0aGlzLT5zb3VyY2VzKSk7CgogICAgICAgIC8vIGdyb3VwIG1hcHBpbmdzIGJ5IGdlbmVyYXRlZCBsaW5lIG51bWJlci4KICAgICAgICAkZ3JvdXBlZE1hcCA9ICRncm91cGVkTWFwRW5jb2RlZCA9IFtdOwoKICAgICAgICBmb3JlYWNoICgkdGhpcy0+bWFwcGluZ3MgYXMgJG0pIHsKICAgICAgICAgICAgJGdyb3VwZWRNYXBbJG1bJ2dlbmVyYXRlZF9saW5lJ11dW10gPSAkbTsKICAgICAgICB9CgogICAgICAgIGtzb3J0KCRncm91cGVkTWFwKTsKCiAgICAgICAgJGxhc3RHZW5lcmF0ZWRMaW5lID0gJGxhc3RPcmlnaW5hbEluZGV4ID0gJGxhc3RPcmlnaW5hbExpbmUgPSAkbGFzdE9yaWdpbmFsQ29sdW1uID0gMDsKCiAgICAgICAgZm9yZWFjaCAoJGdyb3VwZWRNYXAgYXMgJGxpbmVOdW1iZXIgPT4gJGxpbmVNYXApIHsKICAgICAgICAgICAgaWYgKCRsaW5lTnVtYmVyID4gMSkgewogICAgICAgICAgICAgICAgLy8gVGhlIHByZWZpeCBvbmx5IGltcGFjdHMgdGhlIGNvbHVtbiBmb3IgdGhlIGZpcnN0IGxpbmUgb2YgdGhlIG9yaWdpbmFsIG91dHB1dAogICAgICAgICAgICAgICAgJHByZWZpeENvbHVtbiA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJGxpbmVOdW1iZXIgKz0gJHByZWZpeExpbmVzOwoKICAgICAgICAgICAgd2hpbGUgKCsrJGxhc3RHZW5lcmF0ZWRMaW5lIDwgJGxpbmVOdW1iZXIpIHsKICAgICAgICAgICAgICAgICRncm91cGVkTWFwRW5jb2RlZFtdID0gJzsnOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkbGluZU1hcEVuY29kZWQgPSBbXTsKICAgICAgICAgICAgJGxhc3RHZW5lcmF0ZWRDb2x1bW4gPSAwOwoKICAgICAgICAgICAgZm9yZWFjaCAoJGxpbmVNYXAgYXMgJG0pIHsKICAgICAgICAgICAgICAgICRnZW5lcmF0ZWRDb2x1bW4gPSAkbVsnZ2VuZXJhdGVkX2NvbHVtbiddICsgJHByZWZpeENvbHVtbjsKCiAgICAgICAgICAgICAgICAkbWFwRW5jb2RlZCA9ICR0aGlzLT5lbmNvZGVyLT5lbmNvZGUoJGdlbmVyYXRlZENvbHVtbiAtICRsYXN0R2VuZXJhdGVkQ29sdW1uKTsKICAgICAgICAgICAgICAgICRsYXN0R2VuZXJhdGVkQ29sdW1uID0gJGdlbmVyYXRlZENvbHVtbjsKCiAgICAgICAgICAgICAgICAvLyBmaW5kIHRoZSBpbmRleAogICAgICAgICAgICAgICAgaWYgKCRtWydzb3VyY2VfZmlsZSddKSB7CiAgICAgICAgICAgICAgICAgICAgJGluZGV4ID0gJHRoaXMtPmZpbmRGaWxlSW5kZXgoJG1bJ3NvdXJjZV9maWxlJ10pOwoKICAgICAgICAgICAgICAgICAgICBpZiAoJGluZGV4ICE9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgICAgICAgICAkbWFwRW5jb2RlZCAuPSAkdGhpcy0+ZW5jb2Rlci0+ZW5jb2RlKCRpbmRleCAtICRsYXN0T3JpZ2luYWxJbmRleCk7CiAgICAgICAgICAgICAgICAgICAgICAgICRsYXN0T3JpZ2luYWxJbmRleCA9ICRpbmRleDsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGluZXMgYXJlIHN0b3JlZCAwLWJhc2VkIGluIFNvdXJjZU1hcCBzcGVjIHZlcnNpb24gMwogICAgICAgICAgICAgICAgICAgICAgICAkbWFwRW5jb2RlZCAuPSAkdGhpcy0+ZW5jb2Rlci0+ZW5jb2RlKCRtWydvcmlnaW5hbF9saW5lJ10gLSAxIC0gJGxhc3RPcmlnaW5hbExpbmUpOwogICAgICAgICAgICAgICAgICAgICAgICAkbGFzdE9yaWdpbmFsTGluZSA9ICRtWydvcmlnaW5hbF9saW5lJ10gLSAxOwogICAgICAgICAgICAgICAgICAgICAgICAkbWFwRW5jb2RlZCAuPSAkdGhpcy0+ZW5jb2Rlci0+ZW5jb2RlKCRtWydvcmlnaW5hbF9jb2x1bW4nXSAtICRsYXN0T3JpZ2luYWxDb2x1bW4pOwogICAgICAgICAgICAgICAgICAgICAgICAkbGFzdE9yaWdpbmFsQ29sdW1uID0gJG1bJ29yaWdpbmFsX2NvbHVtbiddOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkbGluZU1hcEVuY29kZWRbXSA9ICRtYXBFbmNvZGVkOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkZ3JvdXBlZE1hcEVuY29kZWRbXSA9IGltcGxvZGUoJywnLCAkbGluZU1hcEVuY29kZWQpIC4gJzsnOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHJ0cmltKGltcGxvZGUoJGdyb3VwZWRNYXBFbmNvZGVkKSwgJzsnKTsKICAgIH0KCiAgICAvKioKICAgICAqIEZpbmRzIHRoZSBpbmRleCBmb3IgdGhlIGZpbGVuYW1lCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkZmlsZW5hbWUKICAgICAqCiAgICAgKiBAcmV0dXJuIGludHxmYWxzZQogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gZmluZEZpbGVJbmRleCgkZmlsZW5hbWUpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5zb3VyY2VLZXlzWyRmaWxlbmFtZV07CiAgICB9CgogICAgLyoqCiAgICAgKiBOb3JtYWxpemUgZmlsZW5hbWUKICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICRmaWxlbmFtZQogICAgICoKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBub3JtYWxpemVGaWxlbmFtZSgkZmlsZW5hbWUpCiAgICB7CiAgICAgICAgJGZpbGVuYW1lID0gJHRoaXMtPmZpeFdpbmRvd3NQYXRoKCRmaWxlbmFtZSk7CiAgICAgICAgJHJvb3RwYXRoID0gJHRoaXMtPm9wdGlvbnNbJ3NvdXJjZU1hcFJvb3RwYXRoJ107CiAgICAgICAgJGJhc2VQYXRoID0gJHRoaXMtPm9wdGlvbnNbJ3NvdXJjZU1hcEJhc2VwYXRoJ107CgogICAgICAgIC8vICJUcmltIiB0aGUgJ3NvdXJjZU1hcEJhc2VwYXRoJyBmcm9tIHRoZSBvdXRwdXQgZmlsZW5hbWUuCiAgICAgICAgaWYgKFxzdHJsZW4oJGJhc2VQYXRoKSAmJiBzdHJwb3MoJGZpbGVuYW1lLCAkYmFzZVBhdGgpID09PSAwKSB7CiAgICAgICAgICAgICRmaWxlbmFtZSA9IHN1YnN0cigkZmlsZW5hbWUsIFxzdHJsZW4oJGJhc2VQYXRoKSk7CiAgICAgICAgfQoKICAgICAgICAvLyBSZW1vdmUgZXh0cmEgbGVhZGluZyBwYXRoIHNlcGFyYXRvcnMuCiAgICAgICAgaWYgKHN0cnBvcygkZmlsZW5hbWUsICdcXCcpID09PSAwIHx8IHN0cnBvcygkZmlsZW5hbWUsICcvJykgPT09IDApIHsKICAgICAgICAgICAgJGZpbGVuYW1lID0gc3Vic3RyKCRmaWxlbmFtZSwgMSk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJHJvb3RwYXRoIC4gJGZpbGVuYW1lOwogICAgfQoKICAgIC8qKgogICAgICogRml4IHdpbmRvd3MgcGF0aHMKICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICRwYXRoCiAgICAgKiBAcGFyYW0gYm9vbCAgICRhZGRFbmRTbGFzaAogICAgICoKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBmaXhXaW5kb3dzUGF0aCgkcGF0aCwgJGFkZEVuZFNsYXNoID0gZmFsc2UpCiAgICB7CiAgICAgICAgJHNsYXNoID0gKCRhZGRFbmRTbGFzaCkgPyAnLycgOiAnJzsKCiAgICAgICAgaWYgKCEgZW1wdHkoJHBhdGgpKSB7CiAgICAgICAgICAgICRwYXRoID0gc3RyX3JlcGxhY2UoJ1xcJywgJy8nLCAkcGF0aCk7CiAgICAgICAgICAgICRwYXRoID0gcnRyaW0oJHBhdGgsICcvJykgLiAkc2xhc2g7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJHBhdGg7CiAgICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/extra/scssphp/src/Type.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwOwoKLyoqCiAqIEJsb2NrL25vZGUgdHlwZXMKICoKICogQGF1dGhvciBBbnRob24gUGFuZyA8YW50aG9uLnBhbmdAZ21haWwuY29tPgogKi8KY2xhc3MgVHlwZQp7CiAgICAvKioKICAgICAqIEBpbnRlcm5hbAogICAgICovCiAgICBjb25zdCBUX0FTU0lHTiA9ICdhc3NpZ24nOwogICAgLyoqCiAgICAgKiBAaW50ZXJuYWwKICAgICAqLwogICAgY29uc3QgVF9BVF9ST09UID0gJ2F0LXJvb3QnOwogICAgLyoqCiAgICAgKiBAaW50ZXJuYWwKICAgICAqLwogICAgY29uc3QgVF9CTE9DSyA9ICdibG9jayc7CiAgICAvKioKICAgICAqIEBkZXByZWNhdGVkCiAgICAgKiBAaW50ZXJuYWwKICAgICAqLwogICAgY29uc3QgVF9CUkVBSyA9ICdicmVhayc7CiAgICAvKioKICAgICAqIEBpbnRlcm5hbAogICAgICovCiAgICBjb25zdCBUX0NIQVJTRVQgPSAnY2hhcnNldCc7CiAgICBjb25zdCBUX0NPTE9SID0gJ2NvbG9yJzsKICAgIC8qKgogICAgICogQGludGVybmFsCiAgICAgKi8KICAgIGNvbnN0IFRfQ09NTUVOVCA9ICdjb21tZW50JzsKICAgIC8qKgogICAgICogQGRlcHJlY2F0ZWQKICAgICAqIEBpbnRlcm5hbAogICAgICovCiAgICBjb25zdCBUX0NPTlRJTlVFID0gJ2NvbnRpbnVlJzsKICAgIC8qKgogICAgICogQGRlcHJlY2F0ZWQKICAgICAqIEBpbnRlcm5hbAogICAgICovCiAgICBjb25zdCBUX0NPTlRST0wgPSAnY29udHJvbCc7CiAgICAvKioKICAgICAqIEBpbnRlcm5hbAogICAgICovCiAgICBjb25zdCBUX0NVU1RPTV9QUk9QRVJUWSA9ICdjdXN0b20nOwogICAgLyoqCiAgICAgKiBAaW50ZXJuYWwKICAgICAqLwogICAgY29uc3QgVF9ERUJVRyA9ICdkZWJ1Zyc7CiAgICAvKioKICAgICAqIEBpbnRlcm5hbAogICAgICovCiAgICBjb25zdCBUX0RJUkVDVElWRSA9ICdkaXJlY3RpdmUnOwogICAgLyoqCiAgICAgKiBAaW50ZXJuYWwKICAgICAqLwogICAgY29uc3QgVF9FQUNIID0gJ2VhY2gnOwogICAgLyoqCiAgICAgKiBAaW50ZXJuYWwKICAgICAqLwogICAgY29uc3QgVF9FTFNFID0gJ2Vsc2UnOwogICAgLyoqCiAgICAgKiBAaW50ZXJuYWwKICAgICAqLwogICAgY29uc3QgVF9FTFNFSUYgPSAnZWxzZWlmJzsKICAgIC8qKgogICAgICogQGludGVybmFsCiAgICAgKi8KICAgIGNvbnN0IFRfRVJST1IgPSAnZXJyb3InOwogICAgLyoqCiAgICAgKiBAaW50ZXJuYWwKICAgICAqLwogICAgY29uc3QgVF9FWFBSRVNTSU9OID0gJ2V4cCc7CiAgICAvKioKICAgICAqIEBpbnRlcm5hbAogICAgICovCiAgICBjb25zdCBUX0VYVEVORCA9ICdleHRlbmQnOwogICAgLyoqCiAgICAgKiBAaW50ZXJuYWwKICAgICAqLwogICAgY29uc3QgVF9GT1IgPSAnZm9yJzsKICAgIC8qKgogICAgICogQGludGVybmFsCiAgICAgKi8KICAgIGNvbnN0IFRfRlVOQ1RJT04gPSAnZnVuY3Rpb24nOwogICAgLyoqCiAgICAgKiBAaW50ZXJuYWwKICAgICAqLwogICAgY29uc3QgVF9GVU5DVElPTl9SRUZFUkVOQ0UgPSAnZnVuY3Rpb24tcmVmZXJlbmNlJzsKICAgIC8qKgogICAgICogQGludGVybmFsCiAgICAgKi8KICAgIGNvbnN0IFRfRlVOQ1RJT05fQ0FMTCA9ICdmbmNhbGwnOwogICAgLyoqCiAgICAgKiBAaW50ZXJuYWwKICAgICAqLwogICAgY29uc3QgVF9IU0wgPSAnaHNsJzsKICAgIC8qKgogICAgICogQGludGVybmFsCiAgICAgKi8KICAgIGNvbnN0IFRfSFdCID0gJ2h3Yic7CiAgICAvKioKICAgICAqIEBpbnRlcm5hbAogICAgICovCiAgICBjb25zdCBUX0lGID0gJ2lmJzsKICAgIC8qKgogICAgICogQGludGVybmFsCiAgICAgKi8KICAgIGNvbnN0IFRfSU1QT1JUID0gJ2ltcG9ydCc7CiAgICAvKioKICAgICAqIEBpbnRlcm5hbAogICAgICovCiAgICBjb25zdCBUX0lOQ0xVREUgPSAnaW5jbHVkZSc7CiAgICAvKioKICAgICAqIEBpbnRlcm5hbAogICAgICovCiAgICBjb25zdCBUX0lOVEVSUE9MQVRFID0gJ2ludGVycG9sYXRlJzsKICAgIC8qKgogICAgICogQGludGVybmFsCiAgICAgKi8KICAgIGNvbnN0IFRfSU5URVJQT0xBVEVEID0gJ2ludGVycG9sYXRlZCc7CiAgICAvKioKICAgICAqIEBpbnRlcm5hbAogICAgICovCiAgICBjb25zdCBUX0tFWVdPUkQgPSAna2V5d29yZCc7CiAgICBjb25zdCBUX0xJU1QgPSAnbGlzdCc7CiAgICBjb25zdCBUX01BUCA9ICdtYXAnOwogICAgLyoqCiAgICAgKiBAaW50ZXJuYWwKICAgICAqLwogICAgY29uc3QgVF9NRURJQSA9ICdtZWRpYSc7CiAgICAvKioKICAgICAqIEBpbnRlcm5hbAogICAgICovCiAgICBjb25zdCBUX01FRElBX0VYUFJFU1NJT04gPSAnbWVkaWFFeHAnOwogICAgLyoqCiAgICAgKiBAaW50ZXJuYWwKICAgICAqLwogICAgY29uc3QgVF9NRURJQV9UWVBFID0gJ21lZGlhVHlwZSc7CiAgICAvKioKICAgICAqIEBpbnRlcm5hbAogICAgICovCiAgICBjb25zdCBUX01FRElBX1ZBTFVFID0gJ21lZGlhVmFsdWUnOwogICAgLyoqCiAgICAgKiBAaW50ZXJuYWwKICAgICAqLwogICAgY29uc3QgVF9NSVhJTiA9ICdtaXhpbic7CiAgICAvKioKICAgICAqIEBpbnRlcm5hbAogICAgICovCiAgICBjb25zdCBUX01JWElOX0NPTlRFTlQgPSAnbWl4aW5fY29udGVudCc7CiAgICAvKioKICAgICAqIEBpbnRlcm5hbAogICAgICovCiAgICBjb25zdCBUX05FU1RFRF9QUk9QRVJUWSA9ICduZXN0ZWRwcm9wJzsKICAgIC8qKgogICAgICogQGludGVybmFsCiAgICAgKi8KICAgIGNvbnN0IFRfTk9UID0gJ25vdCc7CiAgICBjb25zdCBUX05VTEwgPSAnbnVsbCc7CiAgICBjb25zdCBUX05VTUJFUiA9ICdudW1iZXInOwogICAgLyoqCiAgICAgKiBAaW50ZXJuYWwKICAgICAqLwogICAgY29uc3QgVF9SRVRVUk4gPSAncmV0dXJuJzsKICAgIC8qKgogICAgICogQGludGVybmFsCiAgICAgKi8KICAgIGNvbnN0IFRfUk9PVCA9ICdyb290JzsKICAgIC8qKgogICAgICogQGludGVybmFsCiAgICAgKi8KICAgIGNvbnN0IFRfU0NTU1BIUF9JTVBPUlRfT05DRSA9ICdzY3NzcGhwLWltcG9ydC1vbmNlJzsKICAgIC8qKgogICAgICogQGludGVybmFsCiAgICAgKi8KICAgIGNvbnN0IFRfU0VMRiA9ICdzZWxmJzsKICAgIGNvbnN0IFRfU1RSSU5HID0gJ3N0cmluZyc7CiAgICAvKioKICAgICAqIEBpbnRlcm5hbAogICAgICovCiAgICBjb25zdCBUX1VOQVJZID0gJ3VuYXJ5JzsKICAgIC8qKgogICAgICogQGludGVybmFsCiAgICAgKi8KICAgIGNvbnN0IFRfVkFSSUFCTEUgPSAndmFyJzsKICAgIC8qKgogICAgICogQGludGVybmFsCiAgICAgKi8KICAgIGNvbnN0IFRfV0FSTiA9ICd3YXJuJzsKICAgIC8qKgogICAgICogQGludGVybmFsCiAgICAgKi8KICAgIGNvbnN0IFRfV0hJTEUgPSAnd2hpbGUnOwp9Cg==]]></data>
	</file>
	<file>
	  <filename>/extra/scssphp/src/Util.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwOwoKdXNlIFNjc3NQaHBcU2Nzc1BocFxCYXNlXFJhbmdlOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEV4Y2VwdGlvblxSYW5nZUV4Y2VwdGlvbjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxOb2RlXE51bWJlcjsKCi8qKgogKiBVdGlsaXR5IGZ1bmN0aW9ucwogKgogKiBAYXV0aG9yIEFudGhvbiBQYW5nIDxhbnRob24ucGFuZ0BnbWFpbC5jb20+CiAqCiAqIEBpbnRlcm5hbAogKi8KY2xhc3MgVXRpbAp7CiAgICAvKioKICAgICAqIEFzc2VydHMgdGhhdCBgdmFsdWVgIGZhbGxzIHdpdGhpbiBgcmFuZ2VgIChpbmNsdXNpdmUpLCBsZWF2aW5nCiAgICAgKiByb29tIGZvciBzbGlnaHQgZmxvYXRpbmctcG9pbnQgZXJyb3JzLgogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgICAgICAgJG5hbWUgIFRoZSBuYW1lIG9mIHRoZSB2YWx1ZS4gVXNlZCBpbiB0aGUgZXJyb3IgbWVzc2FnZS4KICAgICAqIEBwYXJhbSBSYW5nZSAgICAgICAgJHJhbmdlIFJhbmdlIG9mIHZhbHVlcy4KICAgICAqIEBwYXJhbSBhcnJheXxOdW1iZXIgJHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay4KICAgICAqIEBwYXJhbSBzdHJpbmcgICAgICAgJHVuaXQgIFRoZSB1bml0IG9mIHRoZSB2YWx1ZS4gVXNlZCBpbiBlcnJvciByZXBvcnRpbmcuCiAgICAgKgogICAgICogQHJldHVybiBtaXhlZCBgdmFsdWVgIGFkanVzdGVkIHRvIGZhbGwgd2l0aGluIHJhbmdlLCBpZiBpdCB3YXMgb3V0c2lkZSBieSBhIGZsb2F0aW5nLXBvaW50IG1hcmdpbi4KICAgICAqCiAgICAgKiBAdGhyb3dzIFxTY3NzUGhwXFNjc3NQaHBcRXhjZXB0aW9uXFJhbmdlRXhjZXB0aW9uCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY2hlY2tSYW5nZSgkbmFtZSwgUmFuZ2UgJHJhbmdlLCAkdmFsdWUsICR1bml0ID0gJycpCiAgICB7CiAgICAgICAgJHZhbCA9ICR2YWx1ZVsxXTsKICAgICAgICAkZ3JhY2UgPSBuZXcgUmFuZ2UoLTAuMDAwMDEsIDAuMDAwMDEpOwoKICAgICAgICBpZiAoISBcaXNfbnVtZXJpYygkdmFsKSkgewogICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFeGNlcHRpb24oIiRuYW1lIHskdmFsfSBpcyBub3QgYSBudW1iZXIuIik7CiAgICAgICAgfQoKICAgICAgICBpZiAoJHJhbmdlLT5pbmNsdWRlcygkdmFsKSkgewogICAgICAgICAgICByZXR1cm4gJHZhbDsKICAgICAgICB9CgogICAgICAgIGlmICgkZ3JhY2UtPmluY2x1ZGVzKCR2YWwgLSAkcmFuZ2UtPmZpcnN0KSkgewogICAgICAgICAgICByZXR1cm4gJHJhbmdlLT5maXJzdDsKICAgICAgICB9CgogICAgICAgIGlmICgkZ3JhY2UtPmluY2x1ZGVzKCR2YWwgLSAkcmFuZ2UtPmxhc3QpKSB7CiAgICAgICAgICAgIHJldHVybiAkcmFuZ2UtPmxhc3Q7CiAgICAgICAgfQoKICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFeGNlcHRpb24oIiRuYW1lIHskdmFsfSBtdXN0IGJlIGJldHdlZW4geyRyYW5nZS0+Zmlyc3R9IGFuZCB7JHJhbmdlLT5sYXN0fSR1bml0Iik7CiAgICB9CgogICAgLyoqCiAgICAgKiBFbmNvZGUgVVJJIGNvbXBvbmVudAogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgJHN0cmluZwogICAgICoKICAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZW5jb2RlVVJJQ29tcG9uZW50KCRzdHJpbmcpCiAgICB7CiAgICAgICAgJHJldmVydCA9IFsnJTIxJyA9PiAnIScsICclMkEnID0+ICcqJywgJyUyNycgPT4gIiciLCAnJTI4JyA9PiAnKCcsICclMjknID0+ICcpJ107CgogICAgICAgIHJldHVybiBzdHJ0cihyYXd1cmxlbmNvZGUoJHN0cmluZyksICRyZXZlcnQpOwogICAgfQoKICAgIC8qKgogICAgICogbWJfY2hyKCkgd3JhcHBlcgogICAgICoKICAgICAqIEBwYXJhbSBpbnQgJGNvZGUKICAgICAqCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG1iQ2hyKCRjb2RlKQogICAgewogICAgICAgIC8vIFVzZSB0aGUgbmF0aXZlIGltcGxlbWVudGF0aW9uIGlmIGF2YWlsYWJsZSwgYnV0IG5vdCBvbiBQSFAgNy4yIGFzIG1iX2NocigwKSBpcyBidWdneSB0aGVyZQogICAgICAgIGlmIChcUEhQX1ZFUlNJT05fSUQgPiA3MDMwMCAmJiBcZnVuY3Rpb25fZXhpc3RzKCdtYl9jaHInKSkgewogICAgICAgICAgICByZXR1cm4gbWJfY2hyKCRjb2RlLCAnVVRGLTgnKTsKICAgICAgICB9CgogICAgICAgIGlmICgweDgwID4gJGNvZGUgJT0gMHgyMDAwMDApIHsKICAgICAgICAgICAgJHMgPSBcY2hyKCRjb2RlKTsKICAgICAgICB9IGVsc2VpZiAoMHg4MDAgPiAkY29kZSkgewogICAgICAgICAgICAkcyA9IFxjaHIoMHhDMCB8ICRjb2RlID4+IDYpIC4gXGNocigweDgwIHwgJGNvZGUgJiAweDNGKTsKICAgICAgICB9IGVsc2VpZiAoMHgxMDAwMCA+ICRjb2RlKSB7CiAgICAgICAgICAgICRzID0gXGNocigweEUwIHwgJGNvZGUgPj4gMTIpIC4gXGNocigweDgwIHwgJGNvZGUgPj4gNiAmIDB4M0YpIC4gXGNocigweDgwIHwgJGNvZGUgJiAweDNGKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkcyA9IFxjaHIoMHhGMCB8ICRjb2RlID4+IDE4KSAuIFxjaHIoMHg4MCB8ICRjb2RlID4+IDEyICYgMHgzRikKICAgICAgICAgICAgICAgIC4gXGNocigweDgwIHwgJGNvZGUgPj4gNiAmIDB4M0YpIC4gXGNocigweDgwIHwgJGNvZGUgJiAweDNGKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkczsKICAgIH0KCiAgICAvKioKICAgICAqIG1iX3N0cmxlbigpIHdyYXBwZXIKICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICRzdHJpbmcKICAgICAqIEByZXR1cm4gaW50CiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbWJTdHJsZW4oJHN0cmluZykKICAgIHsKICAgICAgICAvLyBVc2UgdGhlIG5hdGl2ZSBpbXBsZW1lbnRhdGlvbiBpZiBhdmFpbGFibGUuCiAgICAgICAgaWYgKFxmdW5jdGlvbl9leGlzdHMoJ21iX3N0cmxlbicpKSB7CiAgICAgICAgICAgIHJldHVybiBtYl9zdHJsZW4oJHN0cmluZywgJ1VURi04Jyk7CiAgICAgICAgfQoKICAgICAgICBpZiAoXGZ1bmN0aW9uX2V4aXN0cygnaWNvbnZfc3RybGVuJykpIHsKICAgICAgICAgICAgcmV0dXJuIChpbnQpIEBpY29udl9zdHJsZW4oJHN0cmluZywgJ1VURi04Jyk7CiAgICAgICAgfQoKICAgICAgICB0aHJvdyBuZXcgXExvZ2ljRXhjZXB0aW9uKCdFaXRoZXIgbWJzdHJpbmcgKHJlY29tbWVuZGVkKSBvciBpY29udiBpcyBuZWNlc3NhcnkgdG8gdXNlIFNjc3NwaHAuJyk7CiAgICB9CgogICAgLyoqCiAgICAgKiBtYl9zdWJzdHIoKSB3cmFwcGVyCiAgICAgKiBAcGFyYW0gc3RyaW5nICRzdHJpbmcKICAgICAqIEBwYXJhbSBpbnQgJHN0YXJ0CiAgICAgKiBAcGFyYW0gbnVsbHxpbnQgJGxlbmd0aAogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBtYlN1YnN0cigkc3RyaW5nLCAkc3RhcnQsICRsZW5ndGggPSBudWxsKQogICAgewogICAgICAgIC8vIFVzZSB0aGUgbmF0aXZlIGltcGxlbWVudGF0aW9uIGlmIGF2YWlsYWJsZS4KICAgICAgICBpZiAoXGZ1bmN0aW9uX2V4aXN0cygnbWJfc3Vic3RyJykpIHsKICAgICAgICAgICAgcmV0dXJuIG1iX3N1YnN0cigkc3RyaW5nLCAkc3RhcnQsICRsZW5ndGgsICdVVEYtOCcpOwogICAgICAgIH0KCiAgICAgICAgaWYgKFxmdW5jdGlvbl9leGlzdHMoJ2ljb252X3N1YnN0cicpKSB7CiAgICAgICAgICAgIGlmICgkc3RhcnQgPCAwKSB7CiAgICAgICAgICAgICAgICAkc3RhcnQgPSBzdGF0aWM6Om1iU3RybGVuKCRzdHJpbmcpICsgJHN0YXJ0OwogICAgICAgICAgICAgICAgaWYgKCRzdGFydCA8IDApIHsKICAgICAgICAgICAgICAgICAgICAkc3RhcnQgPSAwOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAobnVsbCA9PT0gJGxlbmd0aCkgewogICAgICAgICAgICAgICAgJGxlbmd0aCA9IDIxNDc0ODM2NDc7CiAgICAgICAgICAgIH0gZWxzZWlmICgkbGVuZ3RoIDwgMCkgewogICAgICAgICAgICAgICAgJGxlbmd0aCA9IHN0YXRpYzo6bWJTdHJsZW4oJHN0cmluZykgKyAkbGVuZ3RoIC0gJHN0YXJ0OwogICAgICAgICAgICAgICAgaWYgKCRsZW5ndGggPCAwKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gKHN0cmluZylpY29udl9zdWJzdHIoJHN0cmluZywgJHN0YXJ0LCAkbGVuZ3RoLCAnVVRGLTgnKTsKICAgICAgICB9CgogICAgICAgIHRocm93IG5ldyBcTG9naWNFeGNlcHRpb24oJ0VpdGhlciBtYnN0cmluZyAocmVjb21tZW5kZWQpIG9yIGljb252IGlzIG5lY2Vzc2FyeSB0byB1c2UgU2Nzc3BocC4nKTsKICAgIH0KCiAgICAvKioKICAgICAqIG1iX3N0cnBvcyB3cmFwcGVyCiAgICAgKiBAcGFyYW0gc3RyaW5nICRoYXlzdGFjawogICAgICogQHBhcmFtIHN0cmluZyAkbmVlZGxlCiAgICAgKiBAcGFyYW0gaW50ICRvZmZzZXQKICAgICAqCiAgICAgKiBAcmV0dXJuIGludHxmYWxzZQogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG1iU3RycG9zKCRoYXlzdGFjaywgJG5lZWRsZSwgJG9mZnNldCA9IDApCiAgICB7CiAgICAgICAgaWYgKFxmdW5jdGlvbl9leGlzdHMoJ21iX3N0cnBvcycpKSB7CiAgICAgICAgICAgIHJldHVybiBtYl9zdHJwb3MoJGhheXN0YWNrLCAkbmVlZGxlLCAkb2Zmc2V0LCAnVVRGLTgnKTsKICAgICAgICB9CgogICAgICAgIGlmIChcZnVuY3Rpb25fZXhpc3RzKCdpY29udl9zdHJwb3MnKSkgewogICAgICAgICAgICByZXR1cm4gaWNvbnZfc3RycG9zKCRoYXlzdGFjaywgJG5lZWRsZSwgJG9mZnNldCwgJ1VURi04Jyk7CiAgICAgICAgfQoKICAgICAgICB0aHJvdyBuZXcgXExvZ2ljRXhjZXB0aW9uKCdFaXRoZXIgbWJzdHJpbmcgKHJlY29tbWVuZGVkKSBvciBpY29udiBpcyBuZWNlc3NhcnkgdG8gdXNlIFNjc3NwaHAuJyk7CiAgICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/extra/scssphp/src/Util/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/extra/scssphp/src/Util/Path.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCm5hbWVzcGFjZSBTY3NzUGhwXFNjc3NQaHBcVXRpbDsKCi8qKgogKiBAaW50ZXJuYWwKICovCmNsYXNzIFBhdGgKewogICAgLyoqCiAgICAgKiBAcGFyYW0gc3RyaW5nICRwYXRoCiAgICAgKgogICAgICogQHJldHVybiBib29sCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaXNBYnNvbHV0ZSgkcGF0aCkKICAgIHsKICAgICAgICBpZiAoJHBhdGggPT09ICcnKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CgogICAgICAgIGlmICgkcGF0aFswXSA9PT0gJy8nKSB7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KCiAgICAgICAgaWYgKFxESVJFQ1RPUllfU0VQQVJBVE9SICE9PSAnXFwnKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CgogICAgICAgIGlmICgkcGF0aFswXSA9PT0gJ1xcJykgewogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CgogICAgICAgIGlmIChcc3RybGVuKCRwYXRoKSA8IDMpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgaWYgKCRwYXRoWzFdICE9PSAnOicpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgaWYgKCRwYXRoWzJdICE9PSAnLycgJiYgJHBhdGhbMl0gIT09ICdcXCcpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgaWYgKCFwcmVnX21hdGNoKCcvXltBLVphLXpdJC8nLCAkcGF0aFswXSkpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0gc3RyaW5nICRwYXJ0MQogICAgICogQHBhcmFtIHN0cmluZyAkcGFydDIKICAgICAqCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGpvaW4oJHBhcnQxLCAkcGFydDIpCiAgICB7CiAgICAgICAgaWYgKCRwYXJ0MSA9PT0gJycgfHwgc2VsZjo6aXNBYnNvbHV0ZSgkcGFydDIpKSB7CiAgICAgICAgICAgIHJldHVybiAkcGFydDI7CiAgICAgICAgfQoKICAgICAgICBpZiAoJHBhcnQyID09PSAnJykgewogICAgICAgICAgICByZXR1cm4gJHBhcnQxOwogICAgICAgIH0KCiAgICAgICAgJGxhc3QgPSAkcGFydDFbXHN0cmxlbigkcGFydDEpIC0gMV07CiAgICAgICAgJHNlcGFyYXRvciA9IFxESVJFQ1RPUllfU0VQQVJBVE9SOwoKICAgICAgICBpZiAoJGxhc3QgPT09ICcvJyB8fCAkbGFzdCA9PT0gXERJUkVDVE9SWV9TRVBBUkFUT1IpIHsKICAgICAgICAgICAgJHNlcGFyYXRvciA9ICcnOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRwYXJ0MSAuICRzZXBhcmF0b3IgLiAkcGFydDI7CiAgICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/extra/scssphp/src/ValueConverter.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwOwoKdXNlIFNjc3NQaHBcU2Nzc1BocFxOb2RlXE51bWJlcjsKCmZpbmFsIGNsYXNzIFZhbHVlQ29udmVydGVyCnsKICAgIC8vIFByZXZlbnQgaW5zdGFudGlhdGluZyBpdAogICAgcHJpdmF0ZSBmdW5jdGlvbiBfX2NvbnN0cnVjdCgpCiAgICB7CiAgICB9CgogICAgLyoqCiAgICAgKiBQYXJzZXMgYSB2YWx1ZSBmcm9tIGEgU2NzcyBzb3VyY2Ugc3RyaW5nLgogICAgICoKICAgICAqIFRoZSByZXR1cm5lZCB2YWx1ZSBpcyBndWFyYW50ZWVkIHRvIGJlIHN1cHBvcnRlZCBieSB0aGUKICAgICAqIENvbXBpbGVyIG1ldGhvZHMgZm9yIHJlZ2lzdGVyaW5nIGN1c3RvbSB2YXJpYWJsZXMuIE5vIG90aGVyCiAgICAgKiBndWFyYW50ZWUgYWJvdXQgaXQgaXMgcHJvdmlkZWQuIEl0IHNob3VsZCBiZSBjb25zaWRlcmVkCiAgICAgKiBvcGFxdWUgdmFsdWVzIGJ5IHRoZSBjYWxsZXIuCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkc291cmNlCiAgICAgKgogICAgICogQHJldHVybiBtaXhlZAogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHBhcnNlVmFsdWUoJHNvdXJjZSkKICAgIHsKICAgICAgICAkcGFyc2VyID0gbmV3IFBhcnNlcihfX0NMQVNTX18pOwoKICAgICAgICBpZiAoISRwYXJzZXItPnBhcnNlVmFsdWUoJHNvdXJjZSwgJHZhbHVlKSkgewogICAgICAgICAgICB0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihzcHJpbnRmKCdJbnZhbGlkIHZhbHVlIHNvdXJjZSAiJXMiLicsICRzb3VyY2UpKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkdmFsdWU7CiAgICB9CgogICAgLyoqCiAgICAgKiBDb252ZXJ0cyBhIFBIUCB2YWx1ZSB0byBhIFNhc3MgdmFsdWUKICAgICAqCiAgICAgKiBUaGUgcmV0dXJuZWQgdmFsdWUgaXMgZ3VhcmFudGVlZCB0byBiZSBzdXBwb3J0ZWQgYnkgdGhlCiAgICAgKiBDb21waWxlciBtZXRob2RzIGZvciByZWdpc3RlcmluZyBjdXN0b20gdmFyaWFibGVzLiBObyBvdGhlcgogICAgICogZ3VhcmFudGVlIGFib3V0IGl0IGlzIHByb3ZpZGVkLiBJdCBzaG91bGQgYmUgY29uc2lkZXJlZAogICAgICogb3BhcXVlIHZhbHVlcyBieSB0aGUgY2FsbGVyLgogICAgICoKICAgICAqIEBwYXJhbSBtaXhlZCAkdmFsdWUKICAgICAqCiAgICAgKiBAcmV0dXJuIG1peGVkCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZnJvbVBocCgkdmFsdWUpCiAgICB7CiAgICAgICAgaWYgKCR2YWx1ZSBpbnN0YW5jZW9mIE51bWJlcikgewogICAgICAgICAgICByZXR1cm4gJHZhbHVlOwogICAgICAgIH0KCiAgICAgICAgaWYgKGlzX2FycmF5KCR2YWx1ZSkgJiYgaXNzZXQoJHZhbHVlWzBdKSAmJiBcaW5fYXJyYXkoJHZhbHVlWzBdLCBbVHlwZTo6VF9OVUxMLCBUeXBlOjpUX0NPTE9SLCBUeXBlOjpUX0tFWVdPUkQsIFR5cGU6OlRfTElTVCwgVHlwZTo6VF9NQVAsIFR5cGU6OlRfU1RSSU5HXSkpIHsKICAgICAgICAgICAgcmV0dXJuICR2YWx1ZTsKICAgICAgICB9CgogICAgICAgIGlmICgkdmFsdWUgPT09IG51bGwpIHsKICAgICAgICAgICAgcmV0dXJuIENvbXBpbGVyOjokbnVsbDsKICAgICAgICB9CgogICAgICAgIGlmICgkdmFsdWUgPT09IHRydWUpIHsKICAgICAgICAgICAgcmV0dXJuIENvbXBpbGVyOjokdHJ1ZTsKICAgICAgICB9CgogICAgICAgIGlmICgkdmFsdWUgPT09IGZhbHNlKSB7CiAgICAgICAgICAgIHJldHVybiBDb21waWxlcjo6JGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgaWYgKCR2YWx1ZSA9PT0gJycpIHsKICAgICAgICAgICAgcmV0dXJuIENvbXBpbGVyOjokZW1wdHlTdHJpbmc7CiAgICAgICAgfQoKICAgICAgICBpZiAoXGlzX2ludCgkdmFsdWUpIHx8IFxpc19mbG9hdCgkdmFsdWUpKSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgTnVtYmVyKCR2YWx1ZSwgJycpOwogICAgICAgIH0KCiAgICAgICAgaWYgKFxpc19zdHJpbmcoJHZhbHVlKSkgewogICAgICAgICAgICByZXR1cm4gW1R5cGU6OlRfU1RSSU5HLCAnIicsIFskdmFsdWVdXTsKICAgICAgICB9CgogICAgICAgIHRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKHNwcmludGYoJ0Nhbm5vdCBjb252ZXJ0IHRoZSB2YWx1ZSBvZiB0eXBlICIlcyIgdG8gYSBTYXNzIHZhbHVlLicsIGdldHR5cGUoJHZhbHVlKSkpOwogICAgfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/extra/scssphp/src/Version.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwOwoKLyoqCiAqIFNDU1NQSFAgdmVyc2lvbgogKgogKiBAYXV0aG9yIExlYWYgQ29yY29yYW4gPGxlYWZvdEBnbWFpbC5jb20+CiAqLwpjbGFzcyBWZXJzaW9uCnsKICAgIGNvbnN0IFZFUlNJT04gPSAnMS4xMy4wJzsKfQo=]]></data>
	</file>
	<file>
	  <filename>/extra/scssphp/src/Warn.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwOwoKZmluYWwgY2xhc3MgV2Fybgp7CiAgICAvKioKICAgICAqIEB2YXIgY2FsbGFibGV8bnVsbAogICAgICogQHBocHN0YW4tdmFyIChjYWxsYWJsZShzdHJpbmcsIGJvb2wpOiB2b2lkKXxudWxsCiAgICAgKi8KICAgIHByaXZhdGUgc3RhdGljICRjYWxsYmFjazsKCiAgICAvKioKICAgICAqIFByaW50cyBhIHdhcm5pbmcgbWVzc2FnZSBhc3NvY2lhdGVkIHdpdGggdGhlIGN1cnJlbnQgYEBpbXBvcnRgIG9yIGZ1bmN0aW9uIGNhbGwuCiAgICAgKgogICAgICogVGhpcyBtYXkgb25seSBiZSBjYWxsZWQgd2l0aGluIGEgY3VzdG9tIGZ1bmN0aW9uIG9yIGltcG9ydGVyIGNhbGxiYWNrLgogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgJG1lc3NhZ2UKICAgICAqCiAgICAgKiBAcmV0dXJuIHZvaWQKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiB3YXJuaW5nKCRtZXNzYWdlKQogICAgewogICAgICAgIHNlbGY6OnJlcG9ydFdhcm5pbmcoJG1lc3NhZ2UsIGZhbHNlKTsKICAgIH0KCiAgICAvKioKICAgICAqIFByaW50cyBhIGRlcHJlY2F0aW9uIHdhcm5pbmcgbWVzc2FnZSBhc3NvY2lhdGVkIHdpdGggdGhlIGN1cnJlbnQgYEBpbXBvcnRgIG9yIGZ1bmN0aW9uIGNhbGwuCiAgICAgKgogICAgICogVGhpcyBtYXkgb25seSBiZSBjYWxsZWQgd2l0aGluIGEgY3VzdG9tIGZ1bmN0aW9uIG9yIGltcG9ydGVyIGNhbGxiYWNrLgogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgJG1lc3NhZ2UKICAgICAqCiAgICAgKiBAcmV0dXJuIHZvaWQKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBkZXByZWNhdGlvbigkbWVzc2FnZSkKICAgIHsKICAgICAgICBzZWxmOjpyZXBvcnRXYXJuaW5nKCRtZXNzYWdlLCB0cnVlKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSBjYWxsYWJsZXxudWxsICRjYWxsYmFjawogICAgICoKICAgICAqIEByZXR1cm4gY2FsbGFibGV8bnVsbCBUaGUgcHJldmlvdXMgd2FybiBjYWxsYmFjawogICAgICoKICAgICAqIEBwaHBzdGFuLXBhcmFtIChjYWxsYWJsZShzdHJpbmcsIGJvb2wpOiB2b2lkKXxudWxsICRjYWxsYmFjawogICAgICoKICAgICAqIEBwaHBzdGFuLXJldHVybiAoY2FsbGFibGUoc3RyaW5nLCBib29sKTogdm9pZCl8bnVsbAogICAgICoKICAgICAqIEBpbnRlcm5hbAogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHNldENhbGxiYWNrKGNhbGxhYmxlICRjYWxsYmFjayA9IG51bGwpCiAgICB7CiAgICAgICAgJHByZXZpb3VzQ2FsbGJhY2sgPSBzZWxmOjokY2FsbGJhY2s7CiAgICAgICAgc2VsZjo6JGNhbGxiYWNrID0gJGNhbGxiYWNrOwoKICAgICAgICByZXR1cm4gJHByZXZpb3VzQ2FsbGJhY2s7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0gc3RyaW5nICRtZXNzYWdlCiAgICAgKiBAcGFyYW0gYm9vbCAgICRkZXByZWNhdGlvbgogICAgICoKICAgICAqIEByZXR1cm4gdm9pZAogICAgICovCiAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiByZXBvcnRXYXJuaW5nKCRtZXNzYWdlLCAkZGVwcmVjYXRpb24pCiAgICB7CiAgICAgICAgaWYgKHNlbGY6OiRjYWxsYmFjayA9PT0gbnVsbCkgewogICAgICAgICAgICB0aHJvdyBuZXcgXEJhZE1ldGhvZENhbGxFeGNlcHRpb24oJ1RoZSB3YXJuaW5nIFJlcG9ydGVyIG1heSBvbmx5IGJlIGNhbGxlZCB3aXRoaW4gYSBjdXN0b20gZnVuY3Rpb24gb3IgaW1wb3J0ZXIgY2FsbGJhY2suJyk7CiAgICAgICAgfQoKICAgICAgICBcY2FsbF91c2VyX2Z1bmMoc2VsZjo6JGNhbGxiYWNrLCAkbWVzc2FnZSwgJGRlcHJlY2F0aW9uKTsKICAgIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/KStyle.module.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCmlmICghaXNzZXQoJGdDbXMpKSBleGl0Ow0KDQpjbGFzcyBLU3R5bGUgZXh0ZW5kcyBDTVNNb2R1bGUgew0KDQovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqXA0KICAgIFZhcmlhYmxlcw0KXCogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8NCg0KcHVibGljIHN0YXRpYyAkcHJlZmVyZW5jZXMgPSBbDQogICAgJ3N0YXR1cycgPT4gZmFsc2UsDQogICAgJ3RpbWVvdXQnID0+IDMwLA0KICAgICdsYXN0X3VwZGF0ZScgPT4gMCwNCiAgICAnc291cmNlX3BhdGgnID0+ICdhc3NldHMnLkRJUkVDVE9SWV9TRVBBUkFUT1IuJ3Njc3MnLA0KICAgICdleHRlbnNpb25zJyA9PiAnc2Nzcyxjc3MnLA0KICAgICdmb3JtYXQnID0+ICdtaW5pZmllZCcsDQogICAgJ3JlbW92ZV9odHRwc19wcmVmaXgnID0+IHRydWUsDQogICAgJ3Njc3NfdmVyc2lvbicgPT4gJzEuMTMuMCcNCl07DQoNCnB1YmxpYyBzdGF0aWMgJHBlcm1pc3Npb25zID0gWw0KICAgICdrc3R5bGVfZGFzaGJvYXJkJyA9PiAnS1N0eWxlIC0gRGFzaGJvYXJkJywNCiAgICAna3N0eWxlX3NldHRpbmdzJyA9PiAnS1N0eWxlIC0gU2V0dGluZ3MnDQpdOw0KDQovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqXA0KICAgIEdsb2JhbA0KXCogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8NCg0KcHVibGljIGZ1bmN0aW9uIEdldE5hbWUoKSB7IHJldHVybiAnS1N0eWxlJzsgfQ0KcHVibGljIGZ1bmN0aW9uIEdldEZyaWVuZGx5TmFtZSgpIHsgcmV0dXJuICR0aGlzLT5MYW5nKCdmcmllbmRseW5hbWUnKTsgfQ0KcHVibGljIGZ1bmN0aW9uIEdldFZlcnNpb24oKSB7IHJldHVybiAnMS4wJzsgfQ0KcHVibGljIGZ1bmN0aW9uIEdldEF1dGhvcigpIHsgcmV0dXJuICJLb2EnbGluayI7IH0NCnB1YmxpYyBmdW5jdGlvbiBHZXRBdXRob3JFbWFpbCgpIHsgcmV0dXJuICdpbmZvQGtvYWxpbmsuZnInOyB9DQpwdWJsaWMgZnVuY3Rpb24gSXNQbHVnaW5Nb2R1bGUoKSB7IHJldHVybiB0cnVlOyB9DQpwdWJsaWMgZnVuY3Rpb24gSGFzQWRtaW4oKSB7IHJldHVybiB0cnVlOyB9DQpwdWJsaWMgZnVuY3Rpb24gR2V0QWRtaW5TZWN0aW9uKCkgeyByZXR1cm4gJ2xheW91dCc7IH0NCnB1YmxpYyBmdW5jdGlvbiBHZXRBZG1pbkRlc2NyaXB0aW9uKCkgeyByZXR1cm4gJHRoaXMtPkxhbmcoJ2FkbWluZGVzY3JpcHRpb24nKTsgfQ0KcHVibGljIGZ1bmN0aW9uIE1pbmltdW1DTVNWZXJzaW9uKCkgeyByZXR1cm4gIjIuMiI7IH0NCnB1YmxpYyBmdW5jdGlvbiBMYXp5TG9hZEFkbWluKCkgeyByZXR1cm4gdHJ1ZTsgfQ0KcHVibGljIGZ1bmN0aW9uIExhenlMb2FkRnJvbnRlbmQoKSB7IHJldHVybiB0cnVlOyB9DQoNCg0KLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKlwNCiAgICBJbml0aWFsaXNhdGlvbnMNClwqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovDQoNCnB1YmxpYyBmdW5jdGlvbiBJbml0aWFsaXplQWRtaW4oKSB7DQoNCiAgICAkdGhpcy0+Y2hlY2tTdGF0dXMoKTsNCg0KfQ0KDQpwdWJsaWMgZnVuY3Rpb24gSW5pdGlhbGl6ZUZyb250ZW5kKCkgew0KDQogICAgcGFyZW50OjpJbml0aWFsaXplRnJvbnRlbmQoKTsNCg0KfQ0KDQovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqXA0KICAgIEFpZGUNClwqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovDQoNCnB1YmxpYyBmdW5jdGlvbiBHZXRIZWxwKCkgew0KICAgICRsYW5nID0gXENtc05sc09wZXJhdGlvbnM6OmdldF9jdXJyZW50X2xhbmd1YWdlKCk7DQogICAgJGhlbHBGaWxlID0gJHRoaXMtPkdldE1vZHVsZVBhdGgoKSAuICcvZG9jL2hlbHAuJyAuICRsYW5nIC4gJy5pbmMnOw0KICAgIA0KICAgIGlmICghZmlsZV9leGlzdHMoJGhlbHBGaWxlKSkgew0KICAgICAgICAvLyBGYWxsYmFjayB0byBFbmdsaXNoIGlmIHRoZSBjdXJyZW50IGxhbmd1YWdlIGZpbGUgZG9lc24ndCBleGlzdA0KICAgICAgICAkaGVscEZpbGUgPSAkdGhpcy0+R2V0TW9kdWxlUGF0aCgpIC4gJy9kb2MvaGVscC5lbl9VUy5pbmMnOw0KICAgIH0NCg0KICAgIGlmIChmaWxlX2V4aXN0cygkaGVscEZpbGUpKSB7DQogICAgICAgICRoZWxwID0gQGZpbGVfZ2V0X2NvbnRlbnRzKCRoZWxwRmlsZSk7DQogICAgICAgIGlmICgkaGVscCAhPT0gZmFsc2UpIHsNCiAgICAgICAgICAgIHJldHVybiAkaGVscDsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIC8vIEZhbGxiYWNrIGNvbnRlbnQgaWYgZmlsZSByZWFkaW5nIGZhaWxzDQogICAgcmV0dXJuICR0aGlzLT5MYW5nKCdoZWxwX25vdF9mb3VuZCcpOw0KfQ0KDQovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqXA0KICAgIENoYW5nZWxvZw0KXCogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8NCg0KcHVibGljIGZ1bmN0aW9uIEdldENoYW5nZUxvZygpIHsNCiAgICAkbGFuZyA9IFxDbXNObHNPcGVyYXRpb25zOjpnZXRfY3VycmVudF9sYW5ndWFnZSgpOw0KICAgICRjaGFuZ2Vsb2dGaWxlID0gJHRoaXMtPkdldE1vZHVsZVBhdGgoKSAuICcvZG9jL2NoYW5nZWxvZy4nIC4gJGxhbmcgLiAnLmluYyc7DQogICAgDQogICAgaWYgKCFmaWxlX2V4aXN0cygkY2hhbmdlbG9nRmlsZSkpIHsNCiAgICAgICAgLy8gRmFsbGJhY2sgdG8gRW5nbGlzaCBpZiB0aGUgY3VycmVudCBsYW5ndWFnZSBmaWxlIGRvZXNuJ3QgZXhpc3QNCiAgICAgICAgJGNoYW5nZWxvZ0ZpbGUgPSAkdGhpcy0+R2V0TW9kdWxlUGF0aCgpIC4gJy9kb2MvY2hhbmdlbG9nLmVuX1VTLmluYyc7DQogICAgfQ0KDQogICAgaWYgKGZpbGVfZXhpc3RzKCRjaGFuZ2Vsb2dGaWxlKSkgew0KICAgICAgICAkY2hhbmdlbG9nID0gQGZpbGVfZ2V0X2NvbnRlbnRzKCRjaGFuZ2Vsb2dGaWxlKTsNCiAgICAgICAgaWYgKCRjaGFuZ2Vsb2cgIT09IGZhbHNlKSB7DQogICAgICAgICAgICByZXR1cm4gJGNoYW5nZWxvZzsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIC8vIEZhbGxiYWNrIGNvbnRlbnQgaWYgZmlsZSByZWFkaW5nIGZhaWxzDQogICAgcmV0dXJuICR0aGlzLT5MYW5nKCdjaGFuZ2Vsb2dfbm90X2ZvdW5kJyk7DQp9DQoNCg0KLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKlwNCiAgICBBY3Rpb25zDQpcKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLw0KDQpwdWJsaWMgZnVuY3Rpb24gRG9BY3Rpb24oJG5hbWUsICRpZCwgJHBhcmFtcywgJHJldHVybmlkPScnKSB7DQogICAgc3dpdGNoKCRuYW1lKSB7DQogICAgICAgIGNhc2UgJ2RlZmF1bHQnOg0KICAgICAgICAgICAgJHRoaXMtPmdldE91dHB1dCgkcGFyYW1zKTsNCiAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgZGVmYXVsdDoNCiAgICAgICAgICAgIHJldHVybiBwYXJlbnQ6OkRvQWN0aW9uKCRuYW1lLCAkaWQsICRwYXJhbXMsICRyZXR1cm5pZCk7DQogICAgfQ0KfQ0KDQoNCg0KLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKlwNCiAgIENoYW5nZW1lbnQgZCfDqXRhdA0KXCogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8NCg0KcHVibGljIGZ1bmN0aW9uIHN3aXRjaFN0YXR1cygpIHsNCiAgDQokc3RhdHVzID0gJHRoaXMtPkdldFByZWZlcmVuY2UoJ3N0YXR1cycpOw0KDQogICAgaWYgKCEkc3RhdHVzKSB7DQogICAgICAgICRzdGF0dXMgPSB0cnVlOw0KICAgICAgICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgibGFzdF91cGRhdGUiLCB0aW1lKCkpOw0KICAgIH0gZWxzZSB7DQogICAgICAgICRzdGF0dXMgPSBmYWxzZTsNCiAgICB9DQoNCiAgICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgic3RhdHVzIiwgJHN0YXR1cyk7DQoNCiAgICByZXR1cm4gJHN0YXR1czsNCg0KfQ0KDQovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqXA0KICAgIFLDqWN1cMOpcmVyIGxlIHRlbXBzIGQnYWN0aXZhdGlvbiByZXN0YW50DQpcKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLw0KDQpwdWJsaWMgZnVuY3Rpb24gZ2V0VGltZUxlZnQoKSB7DQoNCiAgICAkdGltZW91dCA9ICR0aGlzLT5HZXRQcmVmZXJlbmNlKCd0aW1lb3V0Jyk7DQogICAgJGxhc3RfdXBkYXRlID0gJHRoaXMtPkdldFByZWZlcmVuY2UoJ2xhc3RfdXBkYXRlJyk7DQogICAgJG5vdyA9IHRpbWUoKTsNCg0KICAgICRvdXRwdXQgPSByb3VuZCgkdGltZW91dCAtICgoJG5vdyAtICRsYXN0X3VwZGF0ZSkvIDYwKSwgMCk7DQoNCiAgICByZXR1cm4gJG91dHB1dDsNCg0KfQ0KDQovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqXA0KICAgIFbDqXJpZmljYXRpb24gZGUgbCfDqXRhdA0KXCogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8NCg0KcHJpdmF0ZSBmdW5jdGlvbiBjaGVja1N0YXR1cygpIHsNCg0KICAgICR0aW1lX2xlZnQgPSAkdGhpcy0+Z2V0VGltZUxlZnQoKTsNCg0KICAgIGlmICgkdGltZV9sZWZ0IDw9IDApIHsNCg0KICAgICAgICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgnc3RhdHVzJywgZmFsc2UpOw0KDQogICAgfQ0KDQogICAgcmV0dXJuICR0aGlzLT5HZXRQcmVmZXJlbmNlKCdzdGF0dXMnKTsNCg0KfQ0KDQovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqXA0KICAgIFJldG91cm5lIGxhIHNvcnRpZSBkdSBtb2R1bGUge0tTdHlsZX0NClwqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovDQoNCnByaXZhdGUgZnVuY3Rpb24gZ2V0T3V0cHV0KCRwYXJhbXMgPSBbXSkgew0KDQogICAgJHN0YXR1cyA9ICR0aGlzLT5jaGVja1N0YXR1cygpOw0KDQogICAgJGZpbGVTeXN0ZW0gPSBuZXcgXEtTdHlsZVxGaWxlU3lzdGVtKCk7DQogICAgJGNhY2hlRmlsZSA9ICRmaWxlU3lzdGVtLT5nZXRDYWNoZSgpOw0KDQogICAgaWYgKCAkc3RhdHVzIHx8ICRjYWNoZUZpbGUgPT09IGZhbHNlKSB7DQoNCiAgICAgICAgJGNvbXBpbGF0b3IgPSBuZXcgXEtTdHlsZVxDb21waWxhdG9yKCk7DQogICAgICAgICRjYWNoZUZpbGUgPSAkY29tcGlsYXRvci0+ZXhlY3V0ZSgpOw0KIA0KICAgIH0NCg0KICAgIGlmICghaXNfYXJyYXkoJGNhY2hlRmlsZSkpIHsNCiAgICAgICAgZWNobyAiPCEtLSAiIC4gJHRoaXMtPkxhbmcoJ2tzdHlsZV9lcnJvcicpIC4gIiAtLT4iOw0KICAgIH0NCiAgICANCiAgICBpZiAoIGlzc2V0KCRwYXJhbXNbJ3VybG9ubHknXSkgQU5EICRwYXJhbXNbJ3VybG9ubHknXSApIHsNCg0KICAgICAgICBlY2hvICRjYWNoZUZpbGVbJ3VybCddOw0KDQogICAgfSBlbHNlIHsNCg0KICAgICAgICBlY2hvICI8bGluayBocmVmPVwiIiAuICRjYWNoZUZpbGVbJ3VybCddIC4gIlwiIHJlbD1cInN0eWxlc2hlZXRcIj4iOw0KDQogICAgfQ0KDQp9DQoNCi8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICpcDQogICAgR2VzdGlvbiBkZXMgZXJyZXVycw0KXCogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8NCg0KcHVibGljIGZ1bmN0aW9uIGhhbmRsZUVycm9yKCRlcnJvck1lc3NhZ2UpIHsNCg0KICAgIC8vIEpvdXJuYWxpc2VyIGwnZXJyZXVyDQogICAgYXVkaXQoJycsICJLU3R5bGUiLCAkZXJyb3JNZXNzYWdlKTsNCg0KICAgIC8vIFNpIG5vdXMgc29tbWVzIGVuIG1vZGUgZGVidWcsIGFmZmljaGVyIGwnZXJyZXVyIGltbcOpZGlhdGVtZW50DQogICAgaWYgKFxDbXNBcHA6OmdldF9pbnN0YW5jZSgpLT5jb25maWdbJ2RlYnVnJ10pIHsNCiAgICAgICAgZWNobyAiS1N0eWxlIEVycm9yOiB7JGVycm9yTWVzc2FnZX0iOw0KICAgIH0NCg0KfQ0KDQp9IC8vIEVuZCBvZiBjbGFzcw==]]></data>
	</file>
	<file>
	  <filename>/lang/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lang/en_US.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCg0KLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKlwNCiAgIEdlbmVyYWwNClwqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovDQoNCiRsYW5nWydmcmllbmRseW5hbWUnXSA9ICdLU3R5bGUnOw0KJGxhbmdbJ2FkbWluZGVzY3JpcHRpb24nXSA9ICdTQ1NTIHRvIENTUyBDb21waWxlcic7DQoNCiRsYW5nWyd5ZXMnXSA9ICJZZXMiOw0KJGxhbmdbJ25vJ10gPSAiTm8iOw0KJGxhbmdbJ3NhdmUnXSA9ICJTYXZlIjsNCiRsYW5nWydhcHBseSddID0gIkFwcGx5IjsNCiRsYW5nWydjYW5jZWwnXSA9ICJDYW5jZWwiOw0KJGxhbmdbJ3VwZGF0ZSddID0gIlVwZGF0ZSI7DQokbGFuZ1snbWludXRlJ10gPSAibWludXRlIjsNCiRsYW5nWydtaW51dGVzJ10gPSAibWludXRlcyI7DQoNCi8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICpcDQogICBGcm9udA0KXCogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8NCg0KJGxhbmdbJ2tzdHlsZV9lcnJvciddID0gIktTdHlsZTogRXJyb3IuIFBsZWFzZSBjaGVjayB0aGUgYWRtaW4gbG9nLiI7DQoNCi8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICpcDQogICBBZG1pbmlzdHJhdGlvbg0KXCogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8NCg0KJGxhbmdbJ2hlbHBfbm90X2ZvdW5kJ10gPSAiSGVscCBmaWxlIG5vdCBmb3VuZCI7DQokbGFuZ1snY2hhbmdlbG9nX25vdF9mb3VuZCddID0gIkNoYW5nZWxvZyBub3QgZm91bmQiOw0KJGxhbmdbJ2FjY2Vzc2RlbmllZCddID0gIkFjY2VzcyBkZW5pZWQiOw0KDQovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqXA0KICAgRGFzaGJvYXJkDQpcKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLw0KDQokbGFuZ1snZGFzaGJvYXJkJ10gPSAiRGFzaGJvYXJkIjsNCiRsYW5nWydtb2R1bGVfZW5hYmxlZCddID0gIk1vZHVsZSBlbmFibGVkIjsNCiRsYW5nWydtb2R1bGVfZGlzYWJsZWQnXSA9ICJNb2R1bGUgZGlzYWJsZWQiOw0KJGxhbmdbJ2VuYWJsZSddID0gIkVuYWJsZSI7DQokbGFuZ1snZGlzYWJsZSddID0gIkRpc2FibGUiOw0KJGxhbmdbJ3RvX2VuYWJsZSddID0gIkVuYWJsZSI7DQokbGFuZ1sndG9fZGlzYWJsZSddID0gIkRpc2FibGUiOw0KJGxhbmdbJ2V4dGVuc2lvbnNfdG9fY29tcGlsZSddID0gIkV4dGVuc2lvbnMgdG8gY29tcGlsZSI7DQokbGFuZ1snZXh0ZW5zaW9uc190b19jb21waWxlX2luZm8nXSA9ICIoZS5nLiwgY3NzLCBzY3NzKSI7DQokbGFuZ1sncmVtYWluaW5nX3RpbWUnXSA9ICJSZW1haW5pbmcgdGltZToiOw0KDQovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqXA0KICAgU2V0dGluZ3MNClwqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovDQoNCiRsYW5nWydzZXR0aW5ncyddID0gIlNldHRpbmdzIjsNCiRsYW5nWydzZXR0aW5nc19jaGFuZ2VkJ10gPSAiU2V0dGluZ3MgY2hhbmdlZCI7DQokbGFuZ1snZmlsZXMnXSA9ICJGaWxlcyI7DQokbGFuZ1sncGF0aF9vZl9maWxlc190b19jb21waWxlJ10gPSAiUGF0aCBvZiBmaWxlcyB0byBjb21waWxlIjsNCiRsYW5nWydhZHZhbmNlZF9zZXR0aW5ncyddID0gIkFkdmFuY2VkIHNldHRpbmdzIjsNCiRsYW5nWydvdXRwdXRfZm9ybWF0dGluZyddID0gIk91dHB1dCBmb3JtYXR0aW5nIjsNCiRsYW5nWydleHRlbmRlZCddID0gIkV4dGVuZGVkIjsNCiRsYW5nWydjb21wcmVzc2VkJ10gPSAiQ29tcHJlc3NlZCI7DQokbGFuZ1snbWluaWZpZWQnXSA9ICJNaW5pZmllZCI7DQokbGFuZ1sncmVtb3ZlX2h0dHBzX3ByZWZpeGVzX2Zyb21fdXJscyddID0gIlJlbW92ZSBodHRwKHMpIHByZWZpeGVzIGZyb20gVVJMcyI7DQokbGFuZ1snb3BlcmF0aW9uJ10gPSAiT3BlcmF0aW9uIjsNCiRsYW5nWydhY3RpdmF0aW9uX2R1cmF0aW9uJ10gPSAiQWN0aXZhdGlvbiBkdXJhdGlvbiI7DQoNCg0KLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKlwNCiAgIENsYXNzOiBGaWxlU3lzdGVtDQpcKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLw0KDQokbGFuZ1sndW5hYmxlX3RvX2NyZWF0ZV9jYWNoZV9kaXJlY3RvcnknXSA9ICJVbmFibGUgdG8gY3JlYXRlIGNhY2hlIGRpcmVjdG9yeSI7DQokbGFuZ1sndW5hYmxlX3RvX3dyaXRlX2ZpbGUnXSA9ICJVbmFibGUgdG8gd3JpdGUgZmlsZSI7DQoNCi8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICpcDQogICBDbGFzczogQ29tcGlsYXRvcg0KXCogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8NCg0KJGxhbmdbJ2Vycm9yX2R1cmluZ19zY3NzX2NvbXBpbGF0aW9uJ10gPSAiRXJyb3IgZHVyaW5nIFNDU1MgY29tcGlsYXRpb246ICI7DQokbGFuZ1snZXJyb3JfZHVyaW5nX3NtYXJ0eV9jb21waWxhdGlvbiddID0gIkVycm9yIGR1cmluZyBTbWFydHkgY29tcGlsYXRpb246ICI7]]></data>
	</file>
	<file>
	  <filename>/lang/ext/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lang/ext/fr_FR.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCg0KLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKlwNCiAgIEfDqW7DqXJhbA0KXCogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8NCg0KJGxhbmdbJ2ZyaWVuZGx5bmFtZSddID0gJ0tTdHlsZSc7DQokbGFuZ1snYWRtaW5kZXNjcmlwdGlvbiddID0gJ0NvbXBpbGF0ZXVyIFNDU1MgZW4gQ1NTJzsNCg0KJGxhbmdbJ3llcyddID0gIk91aSI7DQokbGFuZ1snbm8nXSA9ICJOb24iOw0KJGxhbmdbJ3NhdmUnXSA9ICJFbnJlZ2lzdHJlciI7DQokbGFuZ1snYXBwbHknXSA9ICJBcHBsaXF1ZXIiOw0KJGxhbmdbJ2NhbmNlbCddID0gIkFubnVsZXIiOw0KJGxhbmdbJ3VwZGF0ZSddID0gIk1ldHRyZSDDoCBqb3VyIjsNCiRsYW5nWydtaW51dGUnXSA9ICJtaW51dGUiOw0KJGxhbmdbJ21pbnV0ZXMnXSA9ICJtaW51dGVzIjsNCg0KLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKlwNCiAgIEZyb250DQpcKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLw0KDQokbGFuZ1sna3N0eWxlX2Vycm9yJ10gPSAiS1N0eWxlIDogRXJyZXVyLiBWZXVpbGxleiBjb25zdWx0ZXIgbGUgam91cm5hbCBkJ2FkbWluaXN0cmF0aW9uIjsNCg0KLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKlwNCiAgIEFkbWluaXN0cmF0aW9uDQpcKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLw0KDQokbGFuZ1snaGVscF9ub3RfZm91bmQnXSA9ICJGaWNoaWVyIGQnYWlkZSBpbnRyb3V2YWJsZSI7DQokbGFuZ1snY2hhbmdlbG9nX25vdF9mb3VuZCddID0gIkNoYW5nZWxvZiBpbnRyb3V2YWJsZSI7DQokbGFuZ1snYWNjZXNzZGVuaWVkJ10gPSAiQWNjw6hzIHJlZnVzw6kiOw0KDQovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqXA0KICAgVGFibGVhdSBkZSBib3JkDQpcKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLw0KDQokbGFuZ1snZGFzaGJvYXJkJ10gPSAiVGFibGVhdSBkZSBib3JkIjsNCiRsYW5nWydtb2R1bGVfZW5hYmxlZCddID0gIk1vZHVsZSBhY3RpdsOpIjsNCiRsYW5nWydtb2R1bGVfZGlzYWJsZWQnXSA9ICJNb2R1bGUgZMOpc2FjdGl2w6kiOw0KJGxhbmdbJ2VuYWJsZSddID0gIkFjdGlmIjsNCiRsYW5nWydkaXNhYmxlJ10gPSAiSW5hY3RpZiI7DQokbGFuZ1sndG9fZW5hYmxlJ10gPSAiQWN0aXZlciI7DQokbGFuZ1sndG9fZGlzYWJsZSddID0gIkTDqXNhY3RpdmVyIjsNCiRsYW5nWydleHRlbnNpb25zX3RvX2NvbXBpbGUnXSA9ICJFeHRlbnNpb25zIMOgIGNvbXBpbGVyIjsNCiRsYW5nWydleHRlbnNpb25zX3RvX2NvbXBpbGVfaW5mbyddID0gIihleC46IGNzcyxzY3NzKSI7DQokbGFuZ1sncmVtYWluaW5nX3RpbWUnXSA9ICJUZW1wcyByZXN0YW50IDoiOw0KDQovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqXA0KICAgUGFyYW3DqHRyZXMNClwqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovDQoNCiRsYW5nWydzZXR0aW5ncyddID0gIlBhcmFtw6h0cmVzIjsNCiRsYW5nWydzZXR0aW5nc19jaGFuZ2VkJ10gPSAiUGFyYW3DqHRyZXMgbW9kaWZpw6lzIjsNCiRsYW5nWydmaWxlcyddID0gIkZpY2hpZXJzIjsNCiRsYW5nWydwYXRoX29mX2ZpbGVzX3RvX2NvbXBpbGUnXSA9ICJDaGVtaW4gZGVzIGZpY2hpZXJzIMOgIGNvbXBpbGVyIjsNCiRsYW5nWydhZHZhbmNlZF9zZXR0aW5ncyddID0gIlBhcmFtw6h0cmVzIGF2YW5jw6lzIjsNCiRsYW5nWydvdXRwdXRfZm9ybWF0dGluZyddID0gIkZvcm1hdGFnZSBkZSBzb3J0aWUiOw0KJGxhbmdbJ2V4dGVuZGVkJ10gPSAiw4l0ZW5kdSI7DQokbGFuZ1snY29tcHJlc3NlZCddID0gIkNvbXByZXNzw6kiOw0KJGxhbmdbJ21pbmlmaWVkJ10gPSAiTWluaWZpw6kiOw0KJGxhbmdbJ3JlbW92ZV9odHRwc19wcmVmaXhlc19mcm9tX3VybHMnXSA9ICJTdXBwcmltZXIgbGVzIHByw6lmaXhlcyBodHRwKHMpIGRlcyB1cmxzIjsNCiRsYW5nWydvcGVyYXRpb24nXSA9ICJGb25jdGlvbm5lbWVudCI7DQokbGFuZ1snYWN0aXZhdGlvbl9kdXJhdGlvbiddID0gIkR1csOpZSBkJ2FjdGl2YXRpb24iOw0KDQoNCi8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICpcDQogICBDbGFzc2UgOiBGaWxlU3lzdGVtDQpcKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLw0KDQokbGFuZ1sndW5hYmxlX3RvX2NyZWF0ZV9jYWNoZV9kaXJlY3RvcnknXSA9ICJJbXBvc3NpYmxlIGRlIGNyw6llciBsZSByw6lwZXJ0b2lyZSBkZSBjYWNoZSI7DQokbGFuZ1sndW5hYmxlX3RvX3dyaXRlX2ZpbGUnXSA9ICJJbXBvc3NpYmxlIGQnw6ljcmlyZSBsZSBmaWNoaWVyIjsNCg0KLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKlwNCiAgIENsYXNzZSA6IENvbXBpbGF0b3INClwqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovDQoNCiRsYW5nWydlcnJvcl9kdXJpbmdfc2Nzc19jb21waWxhdGlvbiddID0gIkVycmV1ciBsb3JzIGRlIGxhIGNvbXBpbGF0aW9uIFNDU1MgOiAiOw0KJGxhbmdbJ2Vycm9yX2R1cmluZ19zbWFydHlfY29tcGlsYXRpb24nXSA9ICJFcnJldXIgbG9ycyBkZSBsYSBjb21waWxhdGlvbiBTbWFydHkgOiAiOw==]]></data>
	</file>
	<file>
	  <filename>/lib/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/class.Compilator.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCm5hbWVzcGFjZSBLU3R5bGU7DQoNCmNsYXNzIENvbXBpbGF0b3Igew0KDQovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqXA0KICAgIFZhcmlhYmxlcw0KXCogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8NCg0KcHJpdmF0ZSAkbW9kdWxlOw0KcHJpdmF0ZSAkZmlsZVN5c3RlbTsNCg0KLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKlwNCiAgICBDb25zdHJ1Y3Rpb24NClwqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovDQoNCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgpIHsNCg0KICAgICR0aGlzLT5tb2R1bGUgPSBcY21zX3V0aWxzOjpnZXRfbW9kdWxlKCdLU3R5bGUnKTsNCiAgICAkdGhpcy0+ZmlsZVN5c3RlbSA9IG5ldyBcS1N0eWxlXEZpbGVTeXN0ZW0oKTsNCg0KfQ0KDQovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqXA0KICAgIEV4ZWN1dGUNClwqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovDQoNCnB1YmxpYyBmdW5jdGlvbiBleGVjdXRlKCkgew0KDQogICAgJGNvbnRlbnQgPSBudWxsOw0KDQogICAgLy8gUsOpY3Vww6lyZXIgbGEgbGlzdGUgZGVzIGZpY2hpZXJzIGV0IGxldXIgY29udGVudQ0KICAgICRmaWxlTGlzdCA9ICR0aGlzLT5maWxlU3lzdGVtLT5nZXRGaWxlTGlzdCgpOw0KDQogICAgLy8gVsOpcmlmaWVyIHNpIHVuIGZpY2hpZXIgYSB1bmUgZGF0ZSBkZSBtb2RpZmljYXRpb24gcGx1cyByw6ljZW50ZSBxdWUgbGEgZGVybmnDqHJlIGV4w6ljdXRpb24NCiAgICAkbmV3X2ZpbGUgPSBmYWxzZTsNCiAgICAkbGFzdF91cGRhdGUgPSAkdGhpcy0+bW9kdWxlLT5HZXRQcmVmZXJlbmNlKCdsYXN0X3VwZGF0ZScpOw0KICAgIGZvcmVhY2ggKCRmaWxlTGlzdCBhcyAkZmlsZSkgew0KICAgICAgICBpZiAoJGZpbGVbJ2RhdGVfbW9kaWZpY2F0aW9uJ10gPiAkbGFzdF91cGRhdGUpIHsNCiAgICAgICAgICAgICRuZXdfZmlsZSA9IHRydWU7DQogICAgICAgICAgICBicmVhazsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIC8vIFMnaWwgbid5IGEgcGFzIGV1IGRlIG1vZGlmaWNhdGlvbiwgdsOpcmlmaWVyIHNpIGxlIGZpY2hpZXIgY2FjaGUgZXhpc3RlDQogICAgaWYgKCAhJG5ld19maWxlICkgew0KDQogICAgICAgIC8vIFNpIGxlIGZpY2hpZXIgY2FjaGUgZXhpc3RlDQogICAgICAgICRjYWNoZUZpbGUgPSAkdGhpcy0+ZmlsZVN5c3RlbS0+Z2V0Q2FjaGUoKTsNCg0KICAgICAgICBpZiAoJGNhY2hlRmlsZSAhPT0gZmFsc2UpIHsNCiAgICAgICAgICAgIHJldHVybiAkY2FjaGVGaWxlOw0KICAgICAgICB9DQoNCiAgICB9DQogIA0KICAgICRjb250ZW50QXJyYXkgPSBbXTsNCiAgICBmb3JlYWNoICgkZmlsZUxpc3QgYXMgJGZpbGUpIHsgDQogICAgICAgICRjb250ZW50QXJyYXlbXSA9ICRmaWxlWydjb250ZW50J107DQogICAgfQ0KICAgICRjb250ZW50ID0gaW1wbG9kZSgiXG4iLCAkY29udGVudEFycmF5KTsNCg0KICAgIC8vIENvbXBpbGVyIGxlIFNtYXJ0eQ0KICAgICRjb250ZW50ID0gJHRoaXMtPnNtYXJ0eUNvbXBpbGUoJGNvbnRlbnQpOw0KDQogICAgLy8gQ29tcGlsZXIgYXZlYyBTQ1NTDQogICAgdHJ5IHsNCiAgICAgICAgJGNvbnRlbnQgPSAkdGhpcy0+c2Fzc0NvbXBpbGUoJGNvbnRlbnQpOw0KICAgIH0gY2F0Y2ggKFxFeGNlcHRpb24gJGUpIHsNCg0KICAgICAgICAvLyBHw6lyZXIgbCdlcnJldXIgKGxvZywgdGhyb3csIGV0Yy4pDQogICAgICAgICR0aGlzLT5tb2R1bGUtPmhhbmRsZUVycm9yKCR0aGlzLT5tb2R1bGUtPkxhbmcoJ2Vycm9yX2R1cmluZ19zY3NzX2NvbXBpbGF0aW9uJykgLiAkZS0+Z2V0TWVzc2FnZSgpKTsNCiAgICAgICAgcmV0dXJuICRjb250ZW50OyAvLyBSZXRvdXJuZXIgbGUgY29udGVudSBvcmlnaW5hbCBlbiBjYXMgZCdlcnJldXINCg0KICAgIH0NCg0KICAgIC8vIEFwcGxpcXVlciBsZXMgb3B0aW1pc2F0aW9ucw0KICAgICRjb250ZW50ID0gJHRoaXMtPm9wdGltaXplQ29udGVudCgkY29udGVudCk7DQoNCiAgICAvLyBDcsOpZXIgbGUgY2FjaGUNCiAgICAkY2FjaGVGaWxlID0gJHRoaXMtPmZpbGVTeXN0ZW0tPmNyZWF0ZUNhY2hlKCRjb250ZW50KTsNCg0KICAgIHJldHVybiAkY2FjaGVGaWxlOw0KDQp9DQoNCi8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICpcDQogICAgU21hcnR5IENvbXBpbGUNClwqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovDQoNCnByaXZhdGUgZnVuY3Rpb24gc21hcnR5Q29tcGlsZSAoJGNvbnRlbnQ9JycpIHsNCg0KICAgIGlmIChlbXB0eSh0cmltKCRjb250ZW50KSkpIHsNCiAgICAgICAgcmV0dXJuICcnOw0KICAgIH0NCg0KICAgICRzbWFydHkgPSBcY21zbXMoKS0+R2V0U21hcnR5KCk7DQoNCiAgICAvLyBTYXV2ZWdhcmRlciBsZXMgY29uZmlndXJhdGlvbnMgb3JpZ2luYWxlcw0KICAgICRvcmlnaW5hbFNldHRpbmdzID0gWw0KICAgICAgICAnbGVmdF9kZWxpbWl0ZXInID0+ICRzbWFydHktPmxlZnRfZGVsaW1pdGVyLA0KICAgICAgICAncmlnaHRfZGVsaW1pdGVyJyA9PiAkc21hcnR5LT5yaWdodF9kZWxpbWl0ZXIsDQogICAgICAgICdmb3JjZV9jb21waWxlJyA9PiAkc21hcnR5LT5mb3JjZV9jb21waWxlDQogICAgXTsNCg0KICAgIHRyeSB7DQoNCiAgICAgICAgLy8gQ29uZmlndXJlciBTbWFydHkgcG91ciBsYSBjb21waWxhdGlvbg0KICAgICAgICAkc21hcnR5LT5sZWZ0X2RlbGltaXRlciA9ICdbWyc7DQogICAgICAgICRzbWFydHktPnJpZ2h0X2RlbGltaXRlciA9ICddXSc7DQogICAgICAgICRzbWFydHktPmZvcmNlX2NvbXBpbGUgPSB0cnVlOw0KDQogICAgICAgIC8vIENvbXBpbGVyIGxlIGNvbnRlbnUNCiAgICAgICAgJGNvbXBpbGVkQ29udGVudCA9ICRzbWFydHktPmZldGNoKCdzdHJpbmc6JyAuICRjb250ZW50KTsNCg0KICAgICAgICByZXR1cm4gJGNvbXBpbGVkQ29udGVudDsNCg0KICAgIH0gY2F0Y2ggKFxFeGNlcHRpb24gJGUpIHsNCg0KICAgICAgICAvLyBHw6lyZXIgbCdlcnJldXIgKGxvZywgdGhyb3csIGV0Yy4pDQogICAgICAgICR0aGlzLT5tb2R1bGUtPmhhbmRsZUVycm9yKCR0aGlzLT5tb2R1bGUtPkxhbmcoJ2Vycm9yX2R1cmluZ19zbWFydHlfY29tcGlsYXRpb24nKSAuICRlLT5nZXRNZXNzYWdlKCkpOw0KICAgICAgICByZXR1cm4gJGNvbnRlbnQ7IC8vIFJldG91cm5lciBsZSBjb250ZW51IG9yaWdpbmFsIGVuIGNhcyBkJ2VycmV1cg0KDQogICAgfSBmaW5hbGx5IHsNCg0KICAgICAgICAvLyBSZXN0YXVyZXIgbGEgY29uZmlndXJhdGlvbiBvcmlnaW5hbGUNCiAgICAgICAgJHNtYXJ0eS0+bGVmdF9kZWxpbWl0ZXIgPSAkb3JpZ2luYWxTZXR0aW5nc1snbGVmdF9kZWxpbWl0ZXInXTsNCiAgICAgICAgJHNtYXJ0eS0+cmlnaHRfZGVsaW1pdGVyID0gJG9yaWdpbmFsU2V0dGluZ3NbJ3JpZ2h0X2RlbGltaXRlciddOw0KICAgICAgICAkc21hcnR5LT5mb3JjZV9jb21waWxlID0gJG9yaWdpbmFsU2V0dGluZ3NbJ2ZvcmNlX2NvbXBpbGUnXTsNCg0KICAgIH0NCiAgICANCn0NCg0KLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKlwNCiAgIFNhc3MgQ29tcGlsZQ0KXCogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8NCg0KcHJpdmF0ZSBmdW5jdGlvbiBzYXNzQ29tcGlsZSAoJGNvbnRlbnQ9JycpIHsNCg0KICAgIGlmIChlbXB0eSh0cmltKCRjb250ZW50KSkpIHsNCiAgICAgICAgcmV0dXJuICcnOw0KICAgIH0NCg0KICAgIHRyeSB7DQoNCiAgICAgICAgcmVxdWlyZV9vbmNlKCR0aGlzLT5tb2R1bGUtPkdldE1vZHVsZVBhdGgoKSAuICcvZXh0cmEvc2Nzc3BocC9zY3NzLmluYy5waHAnKTsNCiAgICAgICAgJGNvbXBpbGVyID0gbmV3IFxTY3NzUGhwXFNjc3NQaHBcQ29tcGlsZXIoKTsNCg0KICAgICAgICAkZm9ybWF0ID0gJHRoaXMtPm1vZHVsZS0+R2V0UHJlZmVyZW5jZSgnZm9ybWF0Jyk7DQogICAgICAgIHN3aXRjaCAoJGZvcm1hdCkgew0KICAgICAgICAgICAgY2FzZSAnY29tcHJlc3NlZCc6DQogICAgICAgICAgICBjYXNlICdtaW5pZmllZCc6DQogICAgICAgICAgICAgICAgJGNvbXBpbGVyLT5zZXRPdXRwdXRTdHlsZShcU2Nzc1BocFxTY3NzUGhwXE91dHB1dFN0eWxlOjpDT01QUkVTU0VEKTsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIGRlZmF1bHQ6DQogICAgICAgICAgICAgICAgJGNvbXBpbGVyLT5zZXRPdXRwdXRTdHlsZShcU2Nzc1BocFxTY3NzUGhwXE91dHB1dFN0eWxlOjpFWFBBTkRFRCk7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIH0NCg0KICAgICAgICAkY29udGVudCA9ICRjb21waWxlci0+Y29tcGlsZVN0cmluZygkY29udGVudCktPmdldENzcygpOw0KDQogICAgICAgIHJldHVybiAkY29udGVudDsNCg0KICAgIH0gY2F0Y2ggKFxTY3NzUGhwXFNjc3NQaHBcRXhjZXB0aW9uXEV4Y2VwdGlvbiAkZSkgew0KDQogICAgICAgIHJldHVybiAnJzsNCg0KICAgIH0NCg0KfQ0KDQovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqXA0KICAgT3B0aW1pc2VyIGxlIGNvbnRlbnUNClwqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovDQoNCnByaXZhdGUgZnVuY3Rpb24gb3B0aW1pemVDb250ZW50ICgkY29udGVudD1udWxsKSB7DQoNCiAgICBpZiAoJGNvbnRlbnQgPT09IG51bGwgfHwgdHJpbSgkY29udGVudCkgPT09ICcnKSB7DQogICAgICAgIHJldHVybiAnJzsNCiAgICB9DQoNCiAgICAvLyBBam91dCBkdSBwb2ludC12aXJndWxlIHN1cHByaW3DqSBwYXIgbGEgY29tcHJlc3Npb24gZHUgcGFyc2VyDQogICAgJGNvbnRlbnQgPSBwcmVnX3JlcGxhY2UoJy8oW147e31dKX1ccyooPyF9KS8nLCAnJDE7fScsICRjb250ZW50KTsNCg0KICAgIC8vIFN1cHByZXNzaW9uIGRlcyBwcsOpZml4ZXMgaHR0cChzKQ0KICAgICRyZW1vdmVfaHR0cHNfcHJlZml4ID0gJHRoaXMtPm1vZHVsZS0+R2V0UHJlZmVyZW5jZSgncmVtb3ZlX2h0dHBzX3ByZWZpeCcpOw0KICAgIGlmICgkcmVtb3ZlX2h0dHBzX3ByZWZpeCkgew0KICAgICAgICAkY29udGVudCA9IHByZWdfcmVwbGFjZSgnI2h0dHBzPzojJywgJycsICRjb250ZW50KTsNCiAgICB9DQoNCiAgICAvLyBTdXBwcmltZXIgbGVzIGVzcGFjZXMgaW51dGlsZXMNCiAgICAkY29udGVudCA9IHByZWdfcmVwbGFjZSgnL1xzKy8nLCAnICcsICRjb250ZW50KTsNCiAgICAkY29udGVudCA9IHByZWdfcmVwbGFjZSgnLyA/KFssOjt7fV0pID8vJywgJyQxJywgJGNvbnRlbnQpOw0KDQogICAgLy8gQ29udmVydGlyIGxlcyBjb3VsZXVycyBoZXhhZMOpY2ltYWxlcyBlbiBmb3JtZSBjb3VydGUgc2kgcG9zc2libGUNCiAgICAkY29udGVudCA9IHByZWdfcmVwbGFjZSgnLyMoWzAtOWEtZl0pXDEoWzAtOWEtZl0pXDIoWzAtOWEtZl0pXDMvaScsICcjJDEkMiQzJywgJGNvbnRlbnQpOw0KDQogICAgcmV0dXJuIHRyaW0oJGNvbnRlbnQpOw0KDQp9DQoNCn0gLy8gRW5kIGNsYXNzDQo=]]></data>
	</file>
	<file>
	  <filename>/lib/class.FileSystem.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCm5hbWVzcGFjZSBLU3R5bGU7DQoNCmlmICghaXNzZXQoJGdDbXMpKSBleGl0Ow0KDQpjbGFzcyBGaWxlU3lzdGVtIHsNCg0KLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKlwNCiAgICBWYXJpYWJsZXMNClwqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovDQoNCnByaXZhdGUgJG1vZHVsZTsNCg0KLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKlwNCiAgICBDb25zdHJ1Y3Rpb24NClwqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovDQoNCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgpIHsNCg0KICAgICR0aGlzLT5tb2R1bGUgPSBcY21zX3V0aWxzOjpnZXRfbW9kdWxlKCdLU3R5bGUnKTsNCg0KfQ0KDQovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqXA0KICAgUsOpY3Vww6lyZXIgbGEgbGlzdGUgZGVzIGZpY2hpZXJzDQpcKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLw0KDQpwdWJsaWMgZnVuY3Rpb24gZ2V0RmlsZUxpc3QoKTogYXJyYXkgew0KICANCiAgICAkZ0NtcyA9IFxDbXNBcHA6OmdldF9pbnN0YW5jZSgpOw0KICAgICRjb25maWcgPSAkZ0Ntcy0+R2V0Q29uZmlnKCk7DQoNCiAgICAkc291cmNlUGF0aCA9ICR0aGlzLT5tb2R1bGUtPkdldFByZWZlcmVuY2UoJ3NvdXJjZV9wYXRoJyk7DQogICAgJHBhdGggPSBjbXNfam9pbl9wYXRoKCRjb25maWdbJ3Jvb3RfcGF0aCddLCAkc291cmNlUGF0aCk7DQogICAgJGV4dGVuc2lvbnMgPSBhcnJheV9mbGlwKGFycmF5X21hcCgndHJpbScsIGV4cGxvZGUoJywnLCAkdGhpcy0+bW9kdWxlLT5HZXRQcmVmZXJlbmNlKCdleHRlbnNpb25zJykpKSk7DQoNCiAgICAkb3V0cHV0ID0gW107DQoNCiAgICAkaXRlcmF0b3IgPSBuZXcgXFJlY3Vyc2l2ZUl0ZXJhdG9ySXRlcmF0b3IoDQogICAgICAgIG5ldyBcUmVjdXJzaXZlRGlyZWN0b3J5SXRlcmF0b3IoJHBhdGgsIFxSZWN1cnNpdmVEaXJlY3RvcnlJdGVyYXRvcjo6U0tJUF9ET1RTKSwNCiAgICAgICAgXFJlY3Vyc2l2ZUl0ZXJhdG9ySXRlcmF0b3I6OkxFQVZFU19PTkxZDQogICAgKTsNCg0KICAgIGZvcmVhY2ggKCRpdGVyYXRvciBhcyAkaXRlbSkgew0KICAgICAgICBpZiAoaXNzZXQoJGV4dGVuc2lvbnNbJGl0ZW0tPmdldEV4dGVuc2lvbigpXSkpIHsNCiAgICAgICAgICAgICRvdXRwdXRbXSA9IFsNCiAgICAgICAgICAgICAgICAnZmlsZW5hbWUnID0+ICRpdGVtLT5nZXRGaWxlbmFtZSgpLA0KICAgICAgICAgICAgICAgICdiYXNlbmFtZScgPT4gJGl0ZW0tPmdldEJhc2VuYW1lKCcuJyAuICRpdGVtLT5nZXRFeHRlbnNpb24oKSksDQogICAgICAgICAgICAgICAgJ2V4dGVuc2lvbicgPT4gJGl0ZW0tPmdldEV4dGVuc2lvbigpLA0KICAgICAgICAgICAgICAgICdkYXRlX21vZGlmaWNhdGlvbicgPT4gJGl0ZW0tPmdldE1UaW1lKCksDQogICAgICAgICAgICAgICAgJ3NpemUnID0+ICRpdGVtLT5nZXRTaXplKCksDQogICAgICAgICAgICAgICAgJ2NvbnRlbnQnID0+IGZpbGVfZ2V0X2NvbnRlbnRzKCRpdGVtLT5nZXRQYXRobmFtZSgpKQ0KICAgICAgICAgICAgXTsNCiAgICAgICAgfQ0KICAgIH0NCiAgDQogICAgLy8gVHJpIGRlcyBmaWNoaWVycyBkYW5zIGwnb3JkcmUgYWxwaGFiw6l0aXF1ZQ0KICAgIHVzb3J0KCRvdXRwdXQsIGZuKCRhLCAkYikgPT4gc3RyY21wKCRhWydmaWxlbmFtZSddLCAkYlsnZmlsZW5hbWUnXSkpOw0KICAgIA0KICAgIHJldHVybiAkb3V0cHV0Ow0KICANCn0NCg0KLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKlwNCiAgIFLDqWN1cMOpcmVyIGxlIGZpY2hpZXIgY2FjaGUNClwqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovDQoNCnB1YmxpYyBmdW5jdGlvbiBnZXRDYWNoZSgpIHsNCg0KICAgICRnQ21zID0gXENtc0FwcDo6Z2V0X2luc3RhbmNlKCk7DQogICAgJGNvbmZpZyA9ICRnQ21zLT5HZXRDb25maWcoKTsNCiAgICAkb3V0cHV0ID0gW107DQogICAgJGxhc3RfdXBkYXRlID0gJHRoaXMtPm1vZHVsZS0+R2V0UHJlZmVyZW5jZSgnbGFzdF91cGRhdGUnKTsNCg0KICAgIC8vIENoZW1pbiBkdSBmaWNoaWVyDQogICAgJGNhY2hlRGlyID0gVE1QX0NBQ0hFX0xPQ0FUSU9OOw0KICAgICRjYWNoZUZpbGVOYW1lID0gJ2tzdHlsZV8nIC4gJGxhc3RfdXBkYXRlIC4gJy5jc3MnOw0KICAgICRjYWNoZUZpbGVQYXRoID0gJGNhY2hlRGlyIC4gJy8nIC4gJGNhY2hlRmlsZU5hbWU7DQoNCiAgICAvLyBWw6lyaWZpZSBzaSBsZSBmaWNoaWVyIGV4aXN0ZQ0KICAgIGlmICghZmlsZV9leGlzdHMoJGNhY2hlRmlsZVBhdGgpKSB7DQogICAgICAgIHJldHVybiBmYWxzZTsNCiAgICB9DQoNCiAgICAvLyBWw6lyaWZpZSBzaSBsZSBmaWNoaWVyIG4nZXN0IHBhcyB2aWRlDQogICAgaWYgKGZpbGVzaXplKCRjYWNoZUZpbGVQYXRoKSA9PT0gMCkgew0KICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgfQ0KDQogICAgJG91dHB1dCA9IFsNCiAgICAgICAgJ3BhdGgnID0+ICRjYWNoZUZpbGVQYXRoLA0KICAgICAgICAndXJsJyA9PiAkdGhpcy0+Y29udmVydFBhdGgyVXJsKCRjYWNoZUZpbGVQYXRoKQ0KICAgIF07DQoNCiAgICByZXR1cm4gJG91dHB1dDsNCg0KfQ0KDQovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqXA0KICAgQ3LDqWVyIGxlIGNhY2hlDQpcKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLw0KDQpwdWJsaWMgZnVuY3Rpb24gY3JlYXRlQ2FjaGUoJGNvbnRlbnQpIHsNCg0KICAgICRvdXRwdXQgPSBbXTsNCiAgICAkZ0NtcyA9IFxDbXNBcHA6OmdldF9pbnN0YW5jZSgpOw0KICAgICRjb25maWcgPSAkZ0Ntcy0+R2V0Q29uZmlnKCk7DQogICAgJHVwZGF0ZVRpbWUgPSB0aW1lKCk7DQoNCiAgICAvLyBTdXBwcmltZXIgbGVzIGFuY2llbnMgZmljaGllcnMgY2FjaGUNCiAgICAkZmlsZXMgPSBnbG9iKGNtc19qb2luX3BhdGgoJGNvbmZpZ1sndG1wX2NhY2hlX2xvY2F0aW9uJ10sJ2tzdHlsZV8qJykpOw0KICAgIGlmIChjb3VudCgkZmlsZXMpID4gMCkgew0KICAgICAgICBmb3JlYWNoICgkZmlsZXMgYXMgJGYpIHsNCiAgICAgICAgICAgIHVubGluaygkZik7DQogICAgICAgIH0NCiAgICB9DQoNCiAgICAvLyBWw6lyaWZpZXIgZHUgZG9zc2llciBkJ8OpY3JpdHVyZQ0KICAgICRjYWNoZURpciA9IFRNUF9DQUNIRV9MT0NBVElPTjsNCiAgICBpZiAoIWlzX2RpcigkY2FjaGVEaXIpKSB7DQogICAgICAgIGlmICghbWtkaXIoJGNhY2hlRGlyLCAwNzU1LCB0cnVlKSkgew0KICAgICAgICAgICAgJHRoaXMtPm1vZHVsZS0+aGFuZGxlRXJyb3IoJHRoaXMtPm1vZHVsZS0+TGFuZygndW5hYmxlX3RvX2NyZWF0ZV9jYWNoZV9kaXJlY3RvcnknKSk7DQogICAgICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgIH0NCiAgICB9DQoNCiAgICAvLyDDiWNyaXJlIGxlIGNvbnRlbnUgZGFucyBsZSBmaWNoaWVyIGNhY2hlDQogICAgJGNhY2hlRmlsZU5hbWUgPSAna3N0eWxlXycgLiAkdXBkYXRlVGltZSAuICcuY3NzJzsNCiAgICAkY2FjaGVGaWxlUGF0aCA9ICRjYWNoZURpciAuICcvJyAuICRjYWNoZUZpbGVOYW1lOw0KICAgIGlmIChmaWxlX3B1dF9jb250ZW50cygkY2FjaGVGaWxlUGF0aCwgJGNvbnRlbnQpID09PSBmYWxzZSkgew0KICAgICAgICAkdGhpcy0+bW9kdWxlLT5oYW5kbGVFcnJvcigkdGhpcy0+bW9kdWxlLT5MYW5nKCd1bmFibGVfdG9fd3JpdGVfZmlsZScpKTsNCiAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgIH0NCg0KICAgICRvdXRwdXQgPSBbDQogICAgICAgICdwYXRoJyA9PiAkY2FjaGVGaWxlUGF0aCwNCiAgICAgICAgJ3VybCcgPT4gJHRoaXMtPmNvbnZlcnRQYXRoMlVybCgkY2FjaGVGaWxlUGF0aCkNCiAgICBdOw0KICANCiAgICAvLyBNZXR0cmUgw6Agam91ciBsYSBkYXRlIGRlIGRlcm5pw6hyZSBjb21waWxhdGlvbg0KICAgICR0aGlzLT5tb2R1bGUtPlNldFByZWZlcmVuY2UoJ2xhc3RfdXBkYXRlJywgJHVwZGF0ZVRpbWUpOw0KDQogICAgcmV0dXJuICRvdXRwdXQ7DQoNCn0NCg0KLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKlwNCiAgIENvbnZlcnRpciB1biBjaGVtaW4gZW4gVVJMDQpcKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLw0KDQpwcml2YXRlIGZ1bmN0aW9uIGNvbnZlcnRQYXRoMlVybCgkcGF0aCkgew0KDQogICAgJGNvbmZpZyA9IFxDbXNBcHA6OmdldF9pbnN0YW5jZSgpLT5HZXRDb25maWcoKTsNCiAgICAkcm9vdFBhdGggPSAkY29uZmlnWydyb290X3BhdGgnXTsNCiAgICAkcm9vdFVybCA9ICRjb25maWdbJ3Jvb3RfdXJsJ107DQoNCiAgICAvLyBOb3JtYWxpc2VyIGxlcyBzw6lwYXJhdGV1cnMgZGUgY2hlbWluDQogICAgJHBhdGggPSBzdHJfcmVwbGFjZSgnXFwnLCAnLycsICRwYXRoKTsNCiAgICAkcm9vdFBhdGggPSBzdHJfcmVwbGFjZSgnXFwnLCAnLycsICRyb290UGF0aCk7DQoNCiAgICAvLyBWw6lyaWZpZXIgc2kgbGUgY2hlbWluIGVzdCBkYW5zIGxlIHLDqXBlcnRvaXJlIHJhY2luZQ0KICAgIGlmIChzdHJwb3MoJHBhdGgsICRyb290UGF0aCkgPT09IDApIHsNCiAgICAgICAgJHJlbGF0aXZlUGF0aCA9IHN1YnN0cigkcGF0aCwgc3RybGVuKCRyb290UGF0aCkpOw0KICAgICAgICByZXR1cm4gJHJvb3RVcmwgLiAkcmVsYXRpdmVQYXRoOw0KICAgIH0NCg0KICAgIC8vIFNpIGxlIGNoZW1pbiBuJ2VzdCBwYXMgZGFucyBsZSByw6lwZXJ0b2lyZSByYWNpbmUsIHJldG91cm5lciBmYWxzZSBvdSBsYW5jZXIgdW5lIGV4Y2VwdGlvbg0KICAgIHJldHVybiBmYWxzZTsNCg0KfQ0KDQp9IC8vIEVuZCBjbGFzcw==]]></data>
	</file>
	<file>
	  <filename>/method.install.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCmlmICggIWRlZmluZWQoJ0NNU19WRVJTSU9OJykgKSBleGl0Ow0KDQovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqXA0KICAgUGVybWlzc2lvbnMNClwqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovDQoNCiRwZXJtaXNzaW9ucyA9IEtTdHlsZTo6JHBlcm1pc3Npb25zOw0KDQpmb3JlYWNoICgkcGVybWlzc2lvbnMgYXMgJGtleSA9PiAkdmFsdWUpIHsNCiAgICR0aGlzLT5DcmVhdGVQZXJtaXNzaW9uKCRrZXksICR2YWx1ZSk7DQp9DQoNCi8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICpcDQogICBQcmVmZXJlbmNlcw0KXCogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8NCg0KJHByZWZlcmVuY2VzID0gS1N0eWxlOjokcHJlZmVyZW5jZXM7DQoNCmZvcmVhY2ggKCRwcmVmZXJlbmNlcyBhcyAka2V5ID0+ICR2YWx1ZSkgew0KICAgICR0aGlzLT5TZXRQcmVmZXJlbmNlKCRrZXksICR2YWx1ZSk7DQp9DQoNCi8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICpcDQogICBQbHVnaW4NClwqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovDQoNCiR0aGlzLT5SZWdpc3Rlck1vZHVsZVBsdWdpbih0cnVlKTsNCg0KPz4=]]></data>
	</file>
	<file>
	  <filename>/method.uninstall.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCmlmKCAhZGVmaW5lZCgnQ01TX1ZFUlNJT04nKSApIGV4aXQ7DQoNCi8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICpcDQogICBQZXJtaXNzaW9ucw0KXCogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8NCg0KJHBlcm1pc3Npb25zID0gS1N0eWxlOjokcGVybWlzc2lvbnM7DQoNCmZvcmVhY2ggKCRwZXJtaXNzaW9ucyBhcyAkaXRlbSkgew0KICAgICR0aGlzLT5SZW1vdmVQZXJtaXNzaW9uKCRpdGVtKTsNCn0NCg0KLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKlwNCiAgIFByZWZlcmVuY2VzDQpcKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLw0KDQokdGhpcy0+UmVtb3ZlUHJlZmVyZW5jZSgpOw0KDQovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqXA0KICAgUGx1Z2luDQpcKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLw0KDQokdGhpcy0+UmVtb3ZlU21hcnR5UGx1Z2luKCk7DQoNCj8+]]></data>
	</file>
	<file>
	  <filename>/moduleinfo.ini</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[W21vZHVsZV0KbmFtZSA9ICJLU3R5bGUiCnZlcnNpb24gPSAxLjAKYXV0aG9yID0gIktvYSdsaW5rIgphdXRob3JlbWFpbCA9ICJpbmZvQGtvYWxpbmsuZnIiCm1pbmNtc3ZlcnNpb24gPSAyLjIKbGF6eWxvYWRhZG1pbiA9IDEKbGF6eWxvYWRmcm9udGVuZCA9IDEK]]></data>
	</file>
	<file>
	  <filename>/templates/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/templates/defaultadmin.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[e2lmICRwZXJtaXNzaW9ucy5rc3R5bGVfZGFzaGJvYXJkfQ0KICB7dGFiX2hlYWRlciBuYW1lPSdkYXNoYm9hcmQnIGxhYmVsPSJ7JG1vZC0+TGFuZygnZGFzaGJvYXJkJyl9In0NCnsvaWZ9DQoNCntpZiAkcGVybWlzc2lvbnMua3N0eWxlX3NldHRpbmdzfQ0KICB7dGFiX2hlYWRlciBuYW1lPSdzZXR0aW5ncycgbGFiZWw9InskbW9kLT5MYW5nKCdzZXR0aW5ncycpfSJ9DQp7L2lmfQ0KDQp7aWYgJHBlcm1pc3Npb25zLmtzdHlsZV9kYXNoYm9hcmR9DQp7dGFiX3N0YXJ0IG5hbWU9J2Rhc2hib2FyZCd9DQogIHtpbmNsdWRlIGZpbGU9Im1vZHVsZV9maWxlX3RwbDokYWN0aW9ubW9kdWxlO2RlZmF1bHRhZG1pbl90YWJfZGFzaGJvYXJkLnRwbCIgc2NvcGU9J3Jvb3QnfQ0Key9pZn0NCg0Ke2lmICRwZXJtaXNzaW9ucy5rc3R5bGVfc2V0dGluZ3N9DQp7dGFiX3N0YXJ0IG5hbWU9J3NldHRpbmdzJ30NCiAge2luY2x1ZGUgZmlsZT0ibW9kdWxlX2ZpbGVfdHBsOiRhY3Rpb25tb2R1bGU7ZGVmYXVsdGFkbWluX3RhYl9zZXR0aW5ncy50cGwiIHNjb3BlPSdyb290J30NCnsvaWZ9DQoNCnt0YWJfZW5kfQ==]]></data>
	</file>
	<file>
	  <filename>/templates/defaultadmin_tab_dashboard.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[e2Zvcm1fc3RhcnR9DQoNCjxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+DQogIDxwIGNsYXNzPSJwYWdldGV4dCI+w4l0YXQ8L3A+DQogIDxwIGNsYXNzPSJwYWdlaW5wdXQiPg0KICAgIHtpZiAkc2V0dGluZ3MtPnN0YXR1c30NCiAgICAgIHskbW9kLT5MYW5nKCdlbmFibGUnKX0NCiAgICB7ZWxzZX0NCiAgICAgIHskbW9kLT5MYW5nKCdkaXNhYmxlJyl9DQogICAgey9pZn0NCiAgPC9wPg0KPC9kaXY+DQoNCntpZiAkc2V0dGluZ3MtPnN0YXR1c30NCiAgPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4NCiAgICA8cCBjbGFzcz0icGFnZXRleHQiPnskbW9kLT5MYW5nKCdyZW1haW5pbmdfdGltZScpfTwvcD4NCiAgICA8cCBjbGFzcz0icGFnZWlucHV0Ij4NCiAgICAgIHskc2V0dGluZ3MtPnRpbWVfbGVmdH0NCiAgICAgIHtpZiAkc2V0dGluZ3MtPnRpbWVfbGVmdCA8PSAxfQ0KICAgICAgICB7JG1vZC0+TGFuZygnbWludXRlJyl9DQogICAgICB7ZWxzZX0NCiAgICAgICAgeyRtb2QtPkxhbmcoJ21pbnV0ZXMnKX0NCiAgICAgIHsvaWZ9DQogICAgPC9wPg0KICA8L2Rpdj4NCnsvaWZ9DQoNCjxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+DQogIDxwIGNsYXNzPSJwYWdlaW5wdXQiPg0KICAgIHtpZiAkc2V0dGluZ3MtPnN0YXR1c30NCiAgICAgIDxpbnB1dCB0eXBlPSJzdWJtaXQiIG5hbWU9InskYWN0aW9uaWR9c3VibWl0X2Rhc2hib2FyZCIgdmFsdWU9InskbW9kLT5MYW5nKCd0b19kaXNhYmxlJyl9Ij4NCiAgICB7ZWxzZX0NCiAgICAgIDxpbnB1dCB0eXBlPSJzdWJtaXQiIG5hbWU9InskYWN0aW9uaWR9c3VibWl0X2Rhc2hib2FyZCIgdmFsdWU9InskbW9kLT5MYW5nKCd0b19lbmFibGUnKX0iPg0KICAgIHsvaWZ9DQogIDwvcD4NCjwvZGl2Pg0KDQp7Zm9ybV9lbmR9]]></data>
	</file>
	<file>
	  <filename>/templates/defaultadmin_tab_settings.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[e2Zvcm1fc3RhcnR9DQoNCjxmaWVsZHNldD4NCg0KICA8bGVnZW5kPnskbW9kLT5MYW5nKCdmaWxlcycpfTwvbGVnZW5kPg0KDQogIDxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+DQogICAgPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JG1vZC0+TGFuZygncGF0aF9vZl9maWxlc190b19jb21waWxlJyl9PC9wPg0KICAgIDxwIGNsYXNzPSJwYWdlaW5wdXQiPg0KICAgICAge2lmICRzZXR0aW5ncy0+c3RhdHVzfQ0KICAgICAgICB7JHNldHRpbmdzLT5yb290X3BhdGh9L3skc2V0dGluZ3MtPnNvdXJjZV9wYXRofQ0KICAgICAge2Vsc2V9DQogICAgICAgIHskc2V0dGluZ3MtPnJvb3RfcGF0aH0vPGlucHV0IHR5cGU9InRleHQiIG5hbWU9InskYWN0aW9uaWR9c291cmNlX3BhdGgiIHZhbHVlPSJ7JHNldHRpbmdzLT5zb3VyY2VfcGF0aH0iPg0KICAgICAgey9pZn0NCiAgICA8L3A+DQogIDwvZGl2Pg0KDQogIDxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+DQogICAgPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JG1vZC0+TGFuZygnZXh0ZW5zaW9uc190b19jb21waWxlJyl9PC9wPg0KICAgIDxwIGNsYXNzPSJwYWdlaW5wdXQiPg0KICAgICAge2lmICRzZXR0aW5ncy0+c3RhdHVzfQ0KICAgICAgICB7JHNldHRpbmdzLT5leHRlbnNpb25zfQ0KICAgICAge2Vsc2V9DQogICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJ7JGFjdGlvbmlkfWV4dGVuc2lvbnMiIHZhbHVlPSJ7JHNldHRpbmdzLT5leHRlbnNpb25zfSI+IHskbW9kLT5MYW5nKCdleHRlbnNpb25zX3RvX2NvbXBpbGVfaW5mbycpfQ0KICAgICAgey9pZn0NCiAgICA8L3A+DQogIDwvZGl2Pg0KDQo8L2ZpZWxkc2V0Pg0KDQo8ZmllbGRzZXQ+DQoNCiAgPGxlZ2VuZD57JG1vZC0+TGFuZygnYWR2YW5jZWRfc2V0dGluZ3MnKX08L2xlZ2VuZD4NCg0KICA8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPg0KICAgIDxwIGNsYXNzPSJwYWdldGV4dCI+eyRtb2QtPkxhbmcoJ291dHB1dF9mb3JtYXR0aW5nJyl9PC9wPg0KICAgIDxwIGNsYXNzPSJwYWdlaW5wdXQiPg0KICAgICAge2lmICRzZXR0aW5ncy0+c3RhdHVzfQ0KICAgICAgICB7JHNldHRpbmdzLT5mb3JtYXR9DQogICAgICB7ZWxzZX0NCiAgICAgICAgPHNlbGVjdCBuYW1lPSJ7JGFjdGlvbmlkfWZvcm1hdCI+DQogICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iZXh0ZW5kZWQiIHtpZiAkc2V0dGluZ3MtPmZvcm1hdCA9PSAnZXh0ZW5kZWQnfXNlbGVjdGVkey9pZn0+eyRtb2QtPkxhbmcoJ2V4dGVuZGVkJyl9PC9vcHRpb24+DQogICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iY29tcHJlc3NlZCIge2lmICRzZXR0aW5ncy0+Zm9ybWF0ID09ICdjb21wcmVzc2VkJ31zZWxlY3RlZHsvaWZ9PnskbW9kLT5MYW5nKCdjb21wcmVzc2VkJyl9PC9vcHRpb24+DQogICAgICAgICAgPG9wdGlvbiB2YWx1ZT0ibWluaWZpZWQiIHtpZiAkc2V0dGluZ3MtPmZvcm1hdCA9PSAnbWluaWZpZWQnfXNlbGVjdGVkey9pZn0+eyRtb2QtPkxhbmcoJ21pbmlmaWVkJyl9PC9vcHRpb24+DQogICAgICAgIDwvc2VsZWN0Pg0KICAgICAgey9pZn0NCiAgICA8L3A+DQogIDwvZGl2Pg0KDQogIDxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+DQogICAgPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JG1vZC0+TGFuZygncmVtb3ZlX2h0dHBzX3ByZWZpeGVzX2Zyb21fdXJscycpfTwvcD4NCiAgICA8cCBjbGFzcz0icGFnZWlucHV0Ij4NCiAgICAgIHtpZiAkc2V0dGluZ3MtPnN0YXR1c30NCiAgICAgICAge2lmICRzZXR0aW5ncy0+cmVtb3ZlX2h0dHBzX3ByZWZpeH0NCiAgICAgICAgICB7JG1vZC0+TGFuZygneWVzJyl9DQogICAgICAgIHtlbHNlfQ0KICAgICAgICAgIHskbW9kLT5MYW5nKCdubycpfQ0KICAgICAgICB7L2lmfQ0KICAgICAge2Vsc2V9DQogICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0ieyRhY3Rpb25pZH1yZW1vdmVfaHR0cHNfcHJlZml4IiB7aWYgJHNldHRpbmdzLT5yZW1vdmVfaHR0cHNfcHJlZml4fWNoZWNrZWR7L2lmfT4NCiAgICAgIHsvaWZ9DQogICAgPC9wPg0KICA8L2Rpdj4NCg0KPC9maWVsZHNldD4NCg0KPGZpZWxkc2V0Pg0KDQogIDxsZWdlbmQ+eyRtb2QtPkxhbmcoJ29wZXJhdGlvbicpfTwvbGVnZW5kPg0KDQogIDxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+DQogICAgPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JG1vZC0+TGFuZygnYWN0aXZhdGlvbl9kdXJhdGlvbicpfTwvcD4NCiAgICA8cCBjbGFzcz0icGFnZWlucHV0Ij4NCiAgICAgIHtpZiAkc2V0dGluZ3MtPnN0YXR1cyA9PSB0cnVlfQ0KICAgICAgICB7JHNldHRpbmdzLT50aW1lb3V0fSB7JG1vZC0+TGFuZygnbWludXRlcycpfQ0KICAgICAge2Vsc2V9DQogICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJ7JGFjdGlvbmlkfXRpbWVvdXQiIHZhbHVlPSJ7JHNldHRpbmdzLT50aW1lb3V0fSI+IHskbW9kLT5MYW5nKCdtaW51dGVzJyl9DQogICAgICB7L2lmfQ0KICAgIDwvcD4NCiAgPC9kaXY+DQoNCjwvZmllbGRzZXQ+DQoNCntpZiAhJHNldHRpbmdzLT5zdGF0dXN9DQogIDxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+DQogICAgPHAgY2xhc3M9InBhZ2VpbnB1dCI+DQogICAgICA8aW5wdXQgdHlwZT0ic3VibWl0IiBuYW1lPSJ7JGFjdGlvbmlkfXN1Ym1pdF9zZXR0aW5ncyIgdmFsdWU9InskbW9kLT5MYW5nKCdzYXZlJyl9Ij4NCiAgICA8L3A+DQogIDwvZGl2Pg0Key9pZn0NCg0Ke2Zvcm1fZW5kfQ==]]></data>
	</file>
</module>
