<?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>JQueryPlot</name>
	<version>0.8</version>
  <mincmsversion>1.9.4</mincmsversion>
	<help><![CDATA[PGgzPldoYXQgRG9lcyBUaGlzIERvPzwvaDM+CjxwPkEgbW9kdWxlIHRvIHByZXBhcmUgY2hhcnRzL2dyYXBocyBiYXNlZCB1cG9uIEpRdWVyeVBsb3QuIENoYXJ0cyBhcmUgb25seSBhdmFpbGFibGUgaW4gdGhlIGJhY2sgZW5kLjwvcD4KPGgzPkhvdyBEbyBJIFVzZSBJdDwvaDM+CjxwPlRoaXMgbW9kdWxlIGZvcm1zIGEgYmFzZSBmb3IgZ3JhcGhzIGFuZCBwbG90cyB0byBiZSB1c2VkIGluIG90aGVyIG1vZHVsZXMuPC9wPgo8cD5EdXJpbmcgaW5zdGFsbGF0aW9uIGEgc3R5bGVzaGVldCBpcyBhZGRlZCB0byB0aGUgYXZhaWxhYmxlIHN0eWxlc2hlZXRzLiBJdCBoYXMgdGhlIG5hbWUgJ01vZHVsZTogR3JhcGhzJy4KQWRkIHRoaXMgc3R5bGVzaGVldCB0byB0aGUgbGlzdCBvZiBzdHlsZXNoZWV0cyBpbiB1c2Ugd2l0aCBhIHRlbXBsYXRlLjxiciAvPgpPdGhlciBtb2R1bGVzIGNhbiB1c2UgdGhpcyBzdHlsZXNoZWV0LjwvcD4KPGgzPkJ1aWxkIHlvdXIgb3duIGNoYXJ0czwvaDM+CkJ1eSB0aGUgY2hhcnRzIGZyb20gdGhlIDxhIGhyZWY9Imh0dHA6Ly93d3cuZHVrZXRvd24uZXUvc2hvcC9fY2F0YWxvZy9ncmFwaHMvY2hhcnRzL2NoYXJ0c19mb3JfZ3JhcGhzIiB0YXJnZXQ9Il9ibGFuayI+c2hvcCBvZiBEdWtldG93bjwvYT4uPGJyIC8+CkFsdGVybmF0aXZlbHkgeW91IGNhbiBwcmVwYXJlIHlvdXIgb3duIGFzIHdlbGwuIFNvbWUgcmVzdHJpY3Rpb25zIGFyZSBpbiBwbGFjZS48YnIgLz4KWW91IHdpbGwgaGF2ZSB0byBwcmVwYXJlIGEgcGhwIHByb2dyYW0gdGhhdCBmb2xsb3dzIHRoZSBuYW1pbmcgY29udmVudGlvbjogbXljaGFydC5bbmFtZSBvZiBmdW5jdGlvbiBpbiBwcm9ncmFtXS5waHA8YnIgLz4KVHdvIHBhcmFtZXRlcnMgYXJlIHBhc3NlZDogdGhlIG51bWJlciBvZiB0aGUgY2hhcnQuIFRoaXMgaXMgbmVlZGVkIHRvIHBsYWNlIHlvdXIgY2hhcnQgY29ycmVjdGx5IGluIAp0aGUgZGFzaGJvYXJkLjxiciAvPgpUaGUgc2Vjb25kIHBhcmFtZXRlciBjb250YWlucyB0aGUgcGF0aCB0byB0aGUgcGx1Z2lucyBkaXJlY3RvcnkgdG8gcGVyZm9ybSBzcGVjaWFsIHRoaW5ncyB3aXRoIHRoZSBjaGFydHMuPGJyIC8+CjxiciAvPgo8cD4KVGFrZSBhIGxvb2sgYXQgPGEgaHJlZj0iaHR0cDovL3dpa2kuY21zbWFkZXNpbXBsZS5vcmcvaW5kZXgucGhwP3RpdGxlPVVzZXJfSGFuZGJvb2svQWRtaW5fUGFuZWwvRXh0ZW5zaW9ucy9Nb2R1bGVzL1NlcnZpY2VEZXNrL0dvbGQjRXh0ZW5kaW5nX3RoZV9EYXNoYm9hcmQiIAp0YXJnZXQ9Il9ibGFuayI+ZXh0ZW5kaW5nIHRoZSBTZXJ2aWNlIERlc2sgZGFzaGJvYXJkPC9hPiBmb3IgYW4gZXhhbXBsZSBvZiBhIHByb2dyYW0uPGJyIC8+ClNhdmUgdGhlIHByb2dyYW0gd2l0aCBuYW1lIG15Y2hhcnQucHJlcE15Q2hhcnQucGhwLjxiciAvPgpPbmNlIHJlYWR5IHBsYWNlIHRoZSBjaGFydCBpbiBkaXJlY3RvcnkgbW9kdWxlc1xKUXVlcnlQbG90LjxiciAvPgpVc2UgPGEgaHJlZj0iaHR0cDovL3d3dy5qcXBsb3QuY29tIiB0YXJnZXQ9Il9ibGFuayI+anFwbG90LmNvbTwvYT4gd2l0aCBleGFtcGxlcyB0byBidWlsZCB5b3VyIG93biBjaGFydHMuPC9wPgo8aDM+V2hhdCBQYXJhbWV0ZXJzIERvZXMgSXQgVGFrZTwvaDM+CjxwPk5vbmU8L3A+CjxoMz5TdXBwb3J0PC9oMz4KPHA+QXMgcGVyIHRoZSBHUEwsIHRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYXMtaXMuIFBsZWFzZSByZWFkIHRoZSB0ZXh0IG9mIHRoZSBsaWNlbnNlIGZvciB0aGUgZnVsbCBkaXNjbGFpbWVyLjwvcD4KPGgzPkNvcHlyaWdodCBhbmQgTGljZW5zZTwvaDM+CjxwPkNvcHlyaWdodCAmY29weTsgMjAxMSAtIDIwMTIsIER1a2V0b3duLiAKPHA+Tm93IHRoYXQgeW91IGFyZSB1c2luZyB0aGlzIGZyZWUgbW9kdWxlLCB3aHkgbm90IG1ha2UgYSBkb25hdGlvbiB0byBqcXBsb3QgKHdobyBwcmVwYXJlZCB0aGUgalF1ZXJ5IFBsb3QgcGFydHMpISBUaGFua3MgaW4gYWR2YW5jZS4KPGZvcm0gdGFyZ2V0PSJfYmxhbmsiIGFjdGlvbj0iaHR0cHM6Ly93d3cucGF5cGFsLmNvbS9jZ2ktYmluL3dlYnNjciIgbWV0aG9kPSJwb3N0Ij4KPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iY21kIiB2YWx1ZT0iX3MteGNsaWNrIj4KPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iaG9zdGVkX2J1dHRvbl9pZCIgdmFsdWU9IjkxMjMxODQiPgo8aW5wdXQgdHlwZT0iaW1hZ2UiIHNyYz0iaHR0cHM6Ly93d3cucGF5cGFsb2JqZWN0cy5jb20vZW5fVVMvaS9idG4vYnRuX2RvbmF0ZV9TTS5naWYiIGJvcmRlcj0iMCIgbmFtZT0ic3VibWl0IiBhbHQ9IlBheVBhbCAtIFRoZSBzYWZlciwgZWFzaWVyIHdheSB0byBwYXkgb25saW5lISI+CjxpbWcgYWx0PSIiIGJvcmRlcj0iMCIgc3JjPSJodHRwczovL3d3dy5wYXlwYWxvYmplY3RzLmNvbS9lbl9VUy9pL3Njci9waXhlbC5naWYiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiPgo8L2Zvcm0+CjwvcD4KQWxsIFJpZ2h0cyBBcmUgUmVzZXJ2ZWQuPC9wPgo8cD5UaGlzIG1vZHVsZSBoYXMgYmVlbiByZWxlYXNlZCB1bmRlciB0aGUgPGEgaHJlZj0iaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xpY2Vuc2VzLmh0bWwjR1BMIj5HTlUgUHVibGljIExpY2Vuc2U8L2E+LiBZb3UgbXVzdCBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UgYmVmb3JlIHVzaW5nIHRoZSBtb2R1bGUuPC9wPjxoMz5QYXJhbWV0ZXJzPC9oMz48dWw+PGxpPjxlbT4ob3B0aW9uYWwpPC9lbT4gbGFuZz0iZW5fVVMiIC0gUGFyYW1ldGVyIGlzIHVzZWQgdG8gc3BlY2lmeSB3aGF0IGxhbmd1YWdlIHRvIHVzZSBmb3IgZGlzcGxheSBvbiB0aGUgZnJvbnRlbmQuIE5vdCBhbGwgbW9kdWxlcyBzdXBwb3J0IG9yIG5lZWQgdGhpcy48L2xpPjwvdWw+]]></help>
	<about><![CDATA[PGJyIC8+QXV0aG9yOiBEdWtldG93bjxiciAvPjxiciAvPlZlcnNpb246IDAuODxiciAvPjxiciAvPkNoYW5nZSBIaXN0b3J5OjxiciAvPjx1bD4KCTxsaT5WZXJzaW9uIDAuOCAtIDIgRmViIDIwMTI8YnIgLz4KCQk8dWw+CgkJPGxpPkJldHRlciBoYW5kbGluZyBvZiBpbml0aWFsaXphdGlvbiBvZiBjaGFydHMgKGdldCByaWQgb2Y6IDxzdHJvbmc+Tm90aWNlPC9zdHJvbmc+OiBVbmRlZmluZWQgb2Zmc2V0Li4uKSAuPC9saT4KCQk8L3VsPgoJPC9saT4KCTxsaT5WZXJzaW9uIDAuNyAtIDI2IERlYyAyMDExPGJyIC8+CgkJPHVsPgoJCQk8bGk+QWRkZWQgbmV3IG9wdGlvbiB0byBzZXQgaWYgaGVpZ2h0IG9mIGNoYXJ0IG1heSByZXNpemUgb24gZGFzaGJvYXJkOzwvbGk+CgkJCTxsaT5BZGRlZCBuZXcgb3B0aW9uIHRvIHNldCBtYXhpbXVtIHdpZHRoIG9mIHBpeGVscyB0byB1c2Ugb24gZGFzaGJvYXJkOzwvbGk+CgkJCTxsaT5BZGRlZCBpY29uIGZvciBiYWNrIGVuZDs8L2xpPgoJCQk8bGk+SW5jbHVkZWQgdHJhbnNsYXRpb25zIG9mIG1vbnRoIHRoYXQgY2FuIGJlIHVzZWQgaW4gY2hhcnRzLjwvbGk+CgkJPC91bD4KCTwvbGk+Cgk8bGk+VmVyc2lvbiAwLjYgLSAyMiBEZWMgMjAxMTxiciAvPgoJCTx1bD4KCQkJPGxpPkluaXRpYWwgUmVsZWFzZS48L2xpPgoJCTwvdWw+Cgk8L2xpPgo8L3VsPjxiciAvPg==]]></about>
	<description><![CDATA[A set of programs, scripts that support the building of charts/graphs based upon <a href="http://www.jqplot.com" target="_blank">jqPlot</a>]]></description>
	<file>
	  <filename>/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/action.dashboard.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKIyBKUXVlcnlQbG90LiBBIG1vZHVsZSBmb3IgQ01TIC0gQ01TIE1hZGUgU2ltcGxlCiMgQSBtb2R1bGUgdG8gcHJlcGFyZSBncmFwaHMgYmFzZWQgdXBvbiBKUXVlcnlQbG90CiMgQ29weXJpZ2h0IChjKSAyMDExIGJ5IER1a2V0b3duCiMKIyBUaGlzIGZ1bmN0aW9uIHN1cHBvcnRzIGZyb250IGVuZCBjYWxscyBmb3IgdGhlIG1vZHVsZSBKUXVlcnlQbG90CiMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBDTVMgLSBDTVMgTWFkZSBTaW1wbGUgaXMgKGMpIDIwMDUgYnkgVGVkIEt1bHAgKHdpc2h5QGNtc21hZGVzaW1wbGUub3JnKQojIFRoaXMgcHJvamVjdCdzIGhvbWVwYWdlIGlzOiBodHRwOi8vd3d3LmNtc21hZGVzaW1wbGUub3JnCiMgVGhlIG1vZHVsZSdzIGhvbWVwYWdlIGlzOiBodHRwOi8vZGV2LmNtc21hZGVzaW1wbGUub3JnL3Byb2plY3RzL0pRdWVyeVBsb3QKIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQojIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQojIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCiMgT3IgcmVhZCBpdCBvbmxpbmU6IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTAojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgokZ0NtcyA9IGNtc21zKCk7IGlmKCAhaXNfb2JqZWN0KCRnQ21zKSApIGV4aXQ7CgokY29uZmlnID0gJGdDbXMtPkdldENvbmZpZygpOwovLyBTZXQgdXAgcGF0aCB0byB0aGUgalF1ZXJ5IG1vZHVsZSAKJHBhdGggPSBjbXNfam9pbl9wYXRoKCRjb25maWdbJ3Jvb3RfdXJsJ10sICdtb2R1bGVzJywgJ0pRdWVyeVBsb3QnLCAnc3JjJywnJyk7CiRwYXRocGx1ZyA9IGNtc19qb2luX3BhdGgoJGNvbmZpZ1sncm9vdF91cmwnXSwgJ21vZHVsZXMnLCAnSlF1ZXJ5UGxvdCcsICdzcmMnLCdwbHVnaW5zJywnJyk7CgovLyBSZXRyaWV2ZSB0aGUgc3R5bGVzaGVldCBmb3IgdGhlIGdyYXBocwokc3R5bGVzaGVldCA9ICR0aGlzLT5HZXRQcmVmZXJlbmNlKCdqcXBkZWZhdWx0c3R5bGVzaGVldCcsIC0xKTsKJHNtYXJ0eS0+YXNzaWduKCdzdHlsZXNoZWV0JywgJHN0eWxlc2hlZXQpOwokc21hcnR5LT5hc3NpZ24oJ2pxcGNzcycgLCAkdGhpcy0+c2V0Q21zU3R5bGVzaGVldChhcnJheSgndGVtcGxhdGVpZCc9PiRzdHlsZXNoZWV0KSwgJHNtYXJ0eSkpOwokc21hcnR5LT5hc3NpZ24oJHRoaXMtPkdldE5hbWUoKSwgJHRoaXMpOwoKLy8gU2V0IHRoZSBudW1iZXIgb2YgY29sdW1ucyB0byB1c2UKJG1heHdpZHRocGl4ZWxzID0gJHRoaXMtPkdldFByZWZlcmVuY2UoJ21heHdpZHRocGl4ZWxzJywgOTAwKTsKaWYgKCRtYXh3aWR0aHBpeGVscyA8PSAwKSAkbWF4d2lkdGhwaXhlbHMgPSAzMDA7CiRjb2x1bW5zID0gJHRoaXMtPkdldFByZWZlcmVuY2UoJ251bWJlcm9mY29sdW1ucycsIDMpOwovLyBDYWxjdWxhdGUgdGhlIHdpZHRoL2hlaWdodCBvZiB0aGUgY2hhcnRzCiRoZWlnaHQgPSAkdGhpcy0+R2V0UHJlZmVyZW5jZSgnY2hhcnRtYXhoZWlnaHQnLCAyNTApOwppZiAoJGNvbHVtbnMgPiAwKSB7Cgkkd2lkdGggPSBpbnR2YWwoJG1heHdpZHRocGl4ZWxzIC8gJGNvbHVtbnMpOwoJaWYgKCR0aGlzLT5HZXRQcmVmZXJlbmNlKCdjaGFydHJlc2l6ZWhlaWdodCcsIDEpKSB7CgkJaWYgKCRjb2x1bW5zID49IDMpIHsKCQkJJGhlaWdodCA9IGludHZhbCggJGhlaWdodCAvICgkY29sdW1ucyAvIDMpKTsKCQl9Cgl9Cn0KJHNtYXJ0eS0+YXNzaWduKCdjb2xudW0nLCAkY29sdW1ucyk7CgovLyBQcmVwYXJlIGEgbGlzdCBvZiBhdmFpbGFibGUgY2hhcnRzCiRteWNoYXJ0cyA9IGFycmF5KCk7Ci8vIFJlYWQgdGhlIGZvbGRlciB0byBjaGVjayBpZiB0aGVyZSBhcmUgbW9yZSBjaGFydHMgYWRkZWQgbWFudWFsbHkKJGNoYXJ0bm8gPSAxOwokY2hhcnRjb3VudCA9IDA7CiRjaGFydHJvd3MgPSAiXG48dHI+XG4iOwokZGlyID0gZGlybmFtZShfX0ZJTEVfXyk7CmlmICgkZGggPSBvcGVuZGlyKCRkaXIpKSB7Cgl3aGlsZSAoKCRmaWxlID0gcmVhZGRpcigkZGgpKSAhPT0gZmFsc2UpIHsKCQlpZiAoc3Vic3RyKCRmaWxlLCAwLCA3KSA9PSAnbXljaGFydCcpIHsKCQkJJG15Y2hhcnRzW10gPSAkZmlsZTsKCQkJJGNoYXJ0Y291bnQrKzsKCQl9Cgl9CgljbG9zZWRpcigkZGgpOwp9CgppZiAoJGNoYXJ0Y291bnQgPiAwICkgewoJZm9yICgkaSA9IDA7ICRpIDwgJGNoYXJ0Y291bnQ7ICRpKyspIHsKCQlpZiAoJGNoYXJ0bm8gJSAkY29sdW1ucyA9PSAxIHx8ICRjb2x1bW5zID09IDEpIHsKCQkJJGNoYXJ0cm93cyAuPSAiPC90cj5cbiI7CgkJCSRjaGFydHJvd3MgLj0gIjx0cj5cbiI7CgkJfQoJCSRjaGFydHJvd3MgLj0gJwk8dGQ+PGRpdiBpZD0iY2hhcnQnLiRjaGFydG5vLiciIHN0eWxlPSJoZWlnaHQ6Jy4kaGVpZ2h0LidweDt3aWR0aDonLiR3aWR0aC4ncHg7Ij48L2Rpdj48L3RkPicuIlxuIjsKCQkkY2hhcnRubysrOwoJfQp9CmVsc2UgewoJJGNoYXJ0cm93cyAuPSAnPHRkPicuJHRoaXMtPkxhbmcoJ25vY2hhcnRzZm91bmQnKS4nPC90ZD4nOwp9CiRjaGFydHJvd3MgLj0gIjwvdHI+XG4iOwoKLy8gRGlzcGxheSB0aGUgY2hhcnRzCiR0ZW1wbGF0ZSA9ICcKeyRqcXBjc3N9Cjx0YWJsZSBib3JkZXI9IjAiPicuCiRjaGFydHJvd3MKLicKPC90YWJsZT4Ke2xpdGVyYWx9IAo8IS0tW2lmIGx0IElFIDldPjxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJleGNhbnZhcy5qcyI+PC9zY3JpcHQ+PCFbZW5kaWZdLS0+CjxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ7L2xpdGVyYWx9Jy4kcGF0aC4ne2xpdGVyYWx9anF1ZXJ5Lm1pbi5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ7L2xpdGVyYWx9Jy4kcGF0aC4ne2xpdGVyYWx9anF1ZXJ5LmpxcGxvdC5taW4uanMiPjwvc2NyaXB0Pgp7L2xpdGVyYWx9JzsKCgovLyBQcmVwYXJlIHRoZSBob21lZ3Jvd24gY2hhcnRzIGtub3duIGluIGFycmF5IG15Y2hhcnRzCmZvciAoJGkgPSAwOyAkaSA8IGNvdW50KCRteWNoYXJ0cyk7ICRpKyspIHsKCWluY2x1ZGUoJG15Y2hhcnRzWyRpXSk7CgkkcHJvZ3JhbW5hbWUgPSBleHBsb2RlKCcuJywgJG15Y2hhcnRzWyRpXSk7CgkkZnVuY3Rpb24yY2FsbCA9ICRwcm9ncmFtbmFtZVsxXTsgCgkkdGVtcGxhdGUgLj0gJGZ1bmN0aW9uMmNhbGwoJGkrMSwgJHBhdGhwbHVnKTsKfQoKCmVjaG8gJHRoaXMtPlByb2Nlc3NUZW1wbGF0ZUZyb21EYXRhKCR0ZW1wbGF0ZSk7Cgo/Pgo=]]></data>
	</file>
	<file>
	  <filename>/action.default.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKIyBKUXVlcnlQbG90LiBBIG1vZHVsZSBmb3IgQ01TIC0gQ01TIE1hZGUgU2ltcGxlCiMgQSBtb2R1bGUgdG8gcHJlcGFyZSBncmFwaHMgYmFzZWQgdXBvbiBKUXVlcnlQbG90CiMgQ29weXJpZ2h0IChjKSAyMDExIGJ5IER1a2V0b3duCiMKIyBUaGlzIGZ1bmN0aW9uIHN1cHBvcnRzIGZyb250IGVuZCBjYWxscyBmb3IgdGhlIG1vZHVsZSBKUXVlcnlQbG90CiMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBDTVMgLSBDTVMgTWFkZSBTaW1wbGUgaXMgKGMpIDIwMDUgYnkgVGVkIEt1bHAgKHdpc2h5QGNtc21hZGVzaW1wbGUub3JnKQojIFRoaXMgcHJvamVjdCdzIGhvbWVwYWdlIGlzOiBodHRwOi8vd3d3LmNtc21hZGVzaW1wbGUub3JnCiMgVGhlIG1vZHVsZSdzIGhvbWVwYWdlIGlzOiBodHRwOi8vZGV2LmNtc21hZGVzaW1wbGUub3JnL3Byb2plY3RzL0pRdWVyeVBsb3QKIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQojIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQojIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCiMgT3IgcmVhZCBpdCBvbmxpbmU6IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTAojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgokZ0NtcyA9IGNtc21zKCk7IGlmKCAhaXNfb2JqZWN0KCRnQ21zKSApIGV4aXQ7CgoKCj8+]]></data>
	</file>
	<file>
	  <filename>/action.defaultadmin.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKIyBKUXVlcnlQbG90LiBBIG1vZHVsZSBmb3IgQ01TIC0gQ01TIE1hZGUgU2ltcGxlCiMgQSBtb2R1bGUgdG8gcHJlcGFyZSBncmFwaHMgYmFzZWQgdXBvbiBKUXVlcnlQbG90CiMgQ29weXJpZ2h0IChjKSAyMDExIGJ5IER1a2V0b3duCiMKIyBUaGlzIGZ1bmN0aW9uIHN1cHBvcnRzIHRoZSBiYWNrIGVuZCBmb3IgdGhlIG1vZHVsZSBKUXVlcnlQbG90CiMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBDTVMgLSBDTVMgTWFkZSBTaW1wbGUgaXMgKGMpIDIwMDUgYnkgVGVkIEt1bHAgKHdpc2h5QGNtc21hZGVzaW1wbGUub3JnKQojIFRoaXMgcHJvamVjdCdzIGhvbWVwYWdlIGlzOiBodHRwOi8vd3d3LmNtc21hZGVzaW1wbGUub3JnCiMgVGhlIG1vZHVsZSdzIGhvbWVwYWdlIGlzOiBodHRwOi8vZGV2LmNtc21hZGVzaW1wbGUub3JnL3Byb2plY3RzL0pRdWVyeVBsb3QKIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQojIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQojIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCiMgT3IgcmVhZCBpdCBvbmxpbmU6IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTAojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgokZ0NtcyA9IGNtc21zKCk7IGlmKCAhaXNfb2JqZWN0KCRnQ21zKSApIGV4aXQ7CgppZiAoISAkdGhpcy0+Q2hlY2tBY2Nlc3MoKSkKCXsKCXJldHVybiAkdGhpcy0+RGlzcGxheUVycm9yUGFnZSgkaWQsICRwYXJhbXMsICRyZXR1cm5pZCwkdGhpcy0+TGFuZygnYWNjZXNzZGVuaWVkJykpOwoJfQoKaWYgKEZBTFNFID09IGVtcHR5KCRwYXJhbXNbJ2FjdGl2ZV90YWInXSkpCnsKCSR0YWIgPSAkcGFyYW1zWydhY3RpdmVfdGFiJ107Cn0gZWxzZSB7CgkkdGFiID0gJyc7Cn0KZWNobyAkdGhpcy0+U3RhcnRUYWJIZWFkZXJzKCk7CgllY2hvICR0aGlzLT5TZXRUYWJIZWFkZXIoJ2Rhc2hib2FyZCcsJHRoaXMtPkxhbmcoJ3RpdGxlX2Rhc2hib2FyZCcpLCAoJ2Rhc2hib2FyZCcgPT0gJHRhYik/dHJ1ZTpmYWxzZSk7CglpZiAoJHRoaXMtPkNoZWNrQWNjZXNzKCdNb2RpZnkgU2l0ZSBQcmVmZXJlbmNlcycpKSB7CgkJZWNobyAkdGhpcy0+U2V0VGFiSGVhZGVyKCdvcHRpb25zJywkdGhpcy0+TGFuZygndGl0bGVfb3B0aW9ucycpLCAoJ29wdGlvbnMnID09ICR0YWIpP3RydWU6ZmFsc2UpOwoJfQplY2hvICR0aGlzLT5FbmRUYWJIZWFkZXJzKCk7CgovLyBUaGUgY29udGVudCBvZiB0aGUgdGFicwplY2hvICR0aGlzLT5TdGFydFRhYkNvbnRlbnQoKTsKewoKCS8vIC0tLSBTdGFydCB0YWIgZGFzaGJvYXJkIC0tLQoJZWNobyAkdGhpcy0+U3RhcnRUYWIoJ2Rhc2hib2FyZCcsICRwYXJhbXMpOwoJaW5jbHVkZShkaXJuYW1lKF9fRklMRV9fKS4nL2FjdGlvbi5kYXNoYm9hcmQucGhwJyk7CgkKCWVjaG8gJHRoaXMtPkVuZFRhYigpOwoJLy8gLS0tIEVuZCB0YWIgZGFzaGJvYXJkIC0tLQoKCS8vIC0tLSBTdGFydCB0YWIgb3B0aW9ucyAtLS0KCWlmICgkdGhpcy0+Q2hlY2tBY2Nlc3MoJ01vZGlmeSBTaXRlIFByZWZlcmVuY2VzJykpIHsKCQllY2hvICR0aGlzLT5TdGFydFRhYignb3B0aW9ucycsICRwYXJhbXMpOwoJCWluY2x1ZGUoZGlybmFtZShfX0ZJTEVfXykuJy9mdW5jdGlvbi5hZG1pbl9vcHRpb25zdGFiLnBocCcpOwoJCgkJZWNobyAkdGhpcy0+RW5kVGFiKCk7Cgl9CgkvLyAtLS0gRW5kIHRhYiBvcHRpb25zIC0tLQoKfQoKPz4=]]></data>
	</file>
	<file>
	  <filename>/action.save_admin_options.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKIyBKUXVlcnlQbG90LiBBIG1vZHVsZSBmb3IgQ01TIC0gQ01TIE1hZGUgU2ltcGxlCiMgQSBtb2R1bGUgdG8gcHJlcGFyZSBncmFwaHMgYmFzZWQgdXBvbiBKUXVlcnlQbG90CiMgQ29weXJpZ2h0IChjKSAyMDExIGJ5IER1a2V0b3duCiMKIyBUaGlzIGZ1bmN0aW9uIGFsbG93cyB0aGUgYWRtaW5pc3RyYXRvciB0byB1cGRhdGUgdGhlIHByZWZlcmVuY2VzCiMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBDTVMgLSBDTVMgTWFkZSBTaW1wbGUgaXMgKGMpIDIwMDUgYnkgVGVkIEt1bHAgKHdpc2h5QGNtc21hZGVzaW1wbGUub3JnKQojIFRoaXMgcHJvamVjdCdzIGhvbWVwYWdlIGlzOiBodHRwOi8vd3d3LmNtc21hZGVzaW1wbGUub3JnCiMgVGhlIG1vZHVsZSdzIGhvbWVwYWdlIGlzOiBodHRwOi8vZGV2LmNtc21hZGVzaW1wbGUub3JnL3Byb2plY3RzL0pRdWVyeVBsb3QKIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQojIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQojIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCiMgT3IgcmVhZCBpdCBvbmxpbmU6IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTAojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgokZ0NtcyA9IGNtc21zKCk7IGlmKCAhaXNfb2JqZWN0KCRnQ21zKSApIGV4aXQ7CgppZiggISR0aGlzLT5DaGVja1Blcm1pc3Npb24oICdNb2RpZnkgU2l0ZSBQcmVmZXJlbmNlcycgKSApCnsKICByZXR1cm47Cn0KJHVzZXJfaWQgPSAnJzsKaWYgKGdldF91c2VyaWQoKSApIHsKCSR1c2VyX2lkID0gZ2V0X3VzZXJpZCgpOwp9CgovLyBOb3JtYWwgc2F2ZSBmdW5jdGlvbgokdGhpcy0+U2V0UHJlZmVyZW5jZSgnY2hhcnRtYXhoZWlnaHQnLCAkcGFyYW1zWydjaGFydG1heGhlaWdodCddKTsKJHRoaXMtPlNldFByZWZlcmVuY2UoJ2NoYXJ0cmVzaXplaGVpZ2h0JywgMCk7CmlmIChpc3NldCgkcGFyYW1zWydjaGFydHJlc2l6ZWhlaWdodCddKSkgewoJJHRoaXMtPlNldFByZWZlcmVuY2UoJ2NoYXJ0cmVzaXplaGVpZ2h0JywgMSk7Cn0KJHRoaXMtPlNldFByZWZlcmVuY2UoJ2pxcGRlZmF1bHRzdHlsZXNoZWV0JywgJHBhcmFtc1snanFwZGVmYXVsdHN0eWxlc2hlZXQnXSk7CiR0aGlzLT5TZXRQcmVmZXJlbmNlKCdtYXh3aWR0aHBpeGVscycsICRwYXJhbXNbJ21heHdpZHRocGl4ZWxzJ10pOwokdGhpcy0+U2V0UHJlZmVyZW5jZSgnbnVtYmVyb2Zjb2x1bW5zJywgJHBhcmFtc1snbnVtYmVyb2Zjb2x1bW5zJ10pOwoKJHBhcmFtcyA9IGFycmF5KCd0YWJfbWVzc2FnZSc9PiAnb3B0aW9uc3VwZGF0ZWQnLCAnYWN0aXZlX3RhYicgPT4gJ29wdGlvbnMnKTsKJHRoaXMtPlJlZGlyZWN0KCRpZCwgJ2RlZmF1bHRhZG1pbicsICcnLCAkcGFyYW1zKTsKPz4K]]></data>
	</file>
	<file>
	  <filename>/changelog.inc</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PHVsPgoJPGxpPlZlcnNpb24gMC44IC0gMiBGZWIgMjAxMjxiciAvPgoJCTx1bD4KCQk8bGk+QmV0dGVyIGhhbmRsaW5nIG9mIGluaXRpYWxpemF0aW9uIG9mIGNoYXJ0cyAoZ2V0IHJpZCBvZjogPHN0cm9uZz5Ob3RpY2U8L3N0cm9uZz46IFVuZGVmaW5lZCBvZmZzZXQuLi4pIC48L2xpPgoJCTwvdWw+Cgk8L2xpPgoJPGxpPlZlcnNpb24gMC43IC0gMjYgRGVjIDIwMTE8YnIgLz4KCQk8dWw+CgkJCTxsaT5BZGRlZCBuZXcgb3B0aW9uIHRvIHNldCBpZiBoZWlnaHQgb2YgY2hhcnQgbWF5IHJlc2l6ZSBvbiBkYXNoYm9hcmQ7PC9saT4KCQkJPGxpPkFkZGVkIG5ldyBvcHRpb24gdG8gc2V0IG1heGltdW0gd2lkdGggb2YgcGl4ZWxzIHRvIHVzZSBvbiBkYXNoYm9hcmQ7PC9saT4KCQkJPGxpPkFkZGVkIGljb24gZm9yIGJhY2sgZW5kOzwvbGk+CgkJCTxsaT5JbmNsdWRlZCB0cmFuc2xhdGlvbnMgb2YgbW9udGggdGhhdCBjYW4gYmUgdXNlZCBpbiBjaGFydHMuPC9saT4KCQk8L3VsPgoJPC9saT4KCTxsaT5WZXJzaW9uIDAuNiAtIDIyIERlYyAyMDExPGJyIC8+CgkJPHVsPgoJCQk8bGk+SW5pdGlhbCBSZWxlYXNlLjwvbGk+CgkJPC91bD4KCTwvbGk+CjwvdWw+]]></data>
	</file>
	<file>
	  <filename>/function.admin_optionstab.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKIyBKUXVlcnlQbG90LiBBIG1vZHVsZSBmb3IgQ01TIC0gQ01TIE1hZGUgU2ltcGxlCiMgQSBtb2R1bGUgdG8gcHJlcGFyZSBncmFwaHMgYmFzZWQgdXBvbiBKUXVlcnlQbG90CiMgQ29weXJpZ2h0IChjKSAyMDExIGJ5IER1a2V0b3duCiMKIyBUaGlzIGZ1bmN0aW9uIHN1cHBvcnRzIHRoZSBiYWNrIGVuZCBmb3IgdGhlIG1vZHVsZSBKUXVlcnlQbG90CiMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBDTVMgLSBDTVMgTWFkZSBTaW1wbGUgaXMgKGMpIDIwMDUgYnkgVGVkIEt1bHAgKHdpc2h5QGNtc21hZGVzaW1wbGUub3JnKQojIFRoaXMgcHJvamVjdCdzIGhvbWVwYWdlIGlzOiBodHRwOi8vd3d3LmNtc21hZGVzaW1wbGUub3JnCiMgVGhlIG1vZHVsZSdzIGhvbWVwYWdlIGlzOiBodHRwOi8vZGV2LmNtc21hZGVzaW1wbGUub3JnL3Byb2plY3RzL0pRdWVyeVBsb3QKIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQojIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQojIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCiMgT3IgcmVhZCBpdCBvbmxpbmU6IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTAojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgokZ0NtcyA9IGNtc21zKCk7IGlmKCAhaXNfb2JqZWN0KCRnQ21zKSApIGV4aXQ7CgovLyBQcmVwYXJlIGxpc3Qgb2YgcG9zc2libGUgc3R5bGVzaGVldHMgdG8gc2VsZWN0IGZyb20KJG51bWJlcm9mY29sdW1uc2xpc3QgPSBhcnJheSgpOwokbnVtYmVyb2Zjb2x1bW5zbGlzdCA9ICR0aGlzLT5HZXRMaXN0TnVtYmVyT2ZDb2x1bW5zKCk7CgovLyBQcmVwYXJlIGxpc3Qgb2YgcG9zc2libGUgc3R5bGVzaGVldHMgdG8gc2VsZWN0IGZyb20KJHN0eWxlc2hlZXRsaXN0ID0gYXJyYXkoKTsKJHN0eWxlc2hlZXRsaXN0ID0gJHRoaXMtPkdldExpc3RTdHlsZXNoZWV0cygpOwoKJHNtYXJ0eS0+YXNzaWduKCdzdGFydGZvcm0nLCAkdGhpcy0+Q3JlYXRlRm9ybVN0YXJ0ICgkaWQsICdzYXZlX2FkbWluX29wdGlvbnMnLCAkcmV0dXJuaWQpKTsKJHNtYXJ0eS0+YXNzaWduKCd0aXRsZV9tYXh3aWR0aHBpeGVscycsICR0aGlzLT5MYW5nKCd0aXRsZV9tYXh3aWR0aHBpeGVscycpKTsKJHNtYXJ0eS0+YXNzaWduKCdpbnB1dF9tYXh3aWR0aHBpeGVscycsICR0aGlzLT5DcmVhdGVJbnB1dFRleHQoJGlkLCAnbWF4d2lkdGhwaXhlbHMnLCAKCSR0aGlzLT5HZXRQcmVmZXJlbmNlKCdtYXh3aWR0aHBpeGVscycsIDkwMCksCTUsIDUpKTsKJHNtYXJ0eS0+YXNzaWduKCd0aXRsZV9jaGFydG1heGhlaWdodCcsICR0aGlzLT5MYW5nKCd0aXRsZV9jaGFydG1heGhlaWdodCcpKTsKJHNtYXJ0eS0+YXNzaWduKCdpbnB1dF9jaGFydG1heGhlaWdodCcsICR0aGlzLT5DcmVhdGVJbnB1dFRleHQoJGlkLCAnY2hhcnRtYXhoZWlnaHQnLCAKCSR0aGlzLT5HZXRQcmVmZXJlbmNlKCdjaGFydG1heGhlaWdodCcsIDI1MCksCTUsIDUpKTsKJHNtYXJ0eS0+YXNzaWduKCd0aXRsZV9jaGFydHJlc2l6ZWhlaWdodCcsJHRoaXMtPkxhbmcoJ3RpdGxlX2NoYXJ0cmVzaXplaGVpZ2h0JykpOwokc21hcnR5LT5hc3NpZ24oJ2lucHV0X2NoYXJ0cmVzaXplaGVpZ2h0JywgJHRoaXMtPkNyZWF0ZUlucHV0Q2hlY2tib3goJGlkLCAKCSdjaGFydHJlc2l6ZWhlaWdodCcsIDEsICR0aGlzLT5HZXRQcmVmZXJlbmNlKCdjaGFydHJlc2l6ZWhlaWdodCcsIDEpKSk7CiRzbWFydHktPmFzc2lnbigndGl0bGVfbnVtYmVyb2Zjb2x1bW5zJywkdGhpcy0+TGFuZygndGl0bGVfbnVtYmVyb2Zjb2x1bW5zJykpOwokc21hcnR5LT5hc3NpZ24oJ2lucHV0X251bWJlcm9mY29sdW1ucycsICR0aGlzLT5DcmVhdGVJbnB1dERyb3Bkb3duKCRpZCwgJ251bWJlcm9mY29sdW1ucycsIAoJJG51bWJlcm9mY29sdW1uc2xpc3QsIC0xLCAkdGhpcy0+R2V0UHJlZmVyZW5jZSgnbnVtYmVyb2Zjb2x1bW5zJywgMykpKTsKJHNtYXJ0eS0+YXNzaWduKCd0aXRsZV9kZWZhdWx0c3R5bGVzaGVldCcsJHRoaXMtPkxhbmcoJ3RpdGxlX2RlZmF1bHRzdHlsZXNoZWV0JykpOwokc21hcnR5LT5hc3NpZ24oJ2lucHV0X2RlZmF1bHRzdHlsZXNoZWV0JywgJHRoaXMtPkNyZWF0ZUlucHV0RHJvcGRvd24oJGlkLCAnanFwZGVmYXVsdHN0eWxlc2hlZXQnLCAKCSRzdHlsZXNoZWV0bGlzdCwgLTEsICR0aGlzLT5HZXRQcmVmZXJlbmNlKCdqcXBkZWZhdWx0c3R5bGVzaGVldCcsIC0xKSkpOwoKJHNtYXJ0eS0+YXNzaWduKCdzdWJtaXQnLCAkdGhpcy0+Q3JlYXRlSW5wdXRTdWJtaXQgKCRpZCwgJ29wdGlvbnNzdWJtaXRidXR0b24nLCAkdGhpcy0+TGFuZygnc3VibWl0JykpKTsKJHNtYXJ0eS0+YXNzaWduKCdlbmRmb3JtJywgJHRoaXMtPkNyZWF0ZUZvcm1FbmQgKCkpOwoKLy8gRGlzcGxheSB0aGUgb3B0aW9ucwplY2hvICR0aGlzLT5Qcm9jZXNzVGVtcGxhdGUoJ2xpc3RvcHRpb25zLnRwbCcpOwoKPz4K]]></data>
	</file>
	<file>
	  <filename>/images/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/images/icon.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhHAAgAPcAAGiE32qG4GmG3W2K43OM2XeP23+W24GY3XOP4niS3oCX2Yef43aLxYKX0oic1Imd1I6i2oWYzZmt44+g0YqbyZ6w4ZWm1J2v356v3aW14J2pyoyf0Zir25Kk0pyt2KS24aCx25inzqe44qi4356t0aCu0qCu0aaz0qS02aOx0bLC46i206a00bG/3LjF37fE3rK+1rbC2rO/17jE27bB1rzJ4L/L4a+5zMrS4LfD17bC1rvH2sbR47jC0rvD0La8xr3J2rzH2MfS4sHL2sDK2cPM2rzH1svV48HL2MzW487X48zT3M3X48zW4srT3sjR3MPM183W4cnR28jR28TM09LZ38XO1cvT2cjQ1sfP1dXd48DIzdbe49Pb4NLb4MvS1sLKztDY3Nnh5Nne39Ta28/W19ng397l49bc2tbZ2OHn4ePo49HW0d7i3dfc1d3i29ba0dPWzuvv4+vv4u7y4+vv4efq39zf1Ojr4Ort4Ovu4PH04+fq2vT34/P24/L14+rs39DSxurs3ezu4OXn2fT24+Xn1dzeze/x4Ovt3OXm1PDx3+/w3v7/4/r73/3+4/r74vj54Pr74/T13vn64/f44unq1f//4/7+4v394fz84Pv73/r63vn53fT02fPz2PHx1uvr0f7+4/394vv74Pr63/b23PT02vz84vv74ff33fLy2eTkzPf33vT03Pj44Orq1Pb23/Hx2/Dw2uzs1uvr1enp1Ojo0/X13/Hx3Ojo1OXl0fLy3t7ey+/v3O7u3Ozs2uLi0e3t3ODg0NLSxObm2NHRxM/Pw87Ow8nJv8jIvsnJwMPDu729uLm5tP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAM8ALAAAAAAcACAAAAj/AHe1GkiwlSpZBQsiTNjKlDJalyJKjIhr4sSKFiMSg5jx0hgRHTFm3NjxUpUGpDKKtEisVkk7JEKWJBZMmM2bNtNEAIbTZrGeN5dxzLhkAyeVM2HI6ejCgyekHYlZCFAq44cWlqCOVEQhU0YOTtwgpcODZa0Kriw+mqDGykRJTBhdSkKg08SNXN5Y/KMBEo2JfwDcuVQHDktaoq5YXPPjkgyLEAhdMsPn8CUol0RJ1BLoUgyLD+JcejHJco4+A4REjNLr0o6Je0zcuARiE0tdl2pgCfEl4pNbl4ZMPAOmQ6USmCxLUECqSEQksy5NSR7xyKEMZLaM5KjpEpGIRiqGybEb0UYoHChYbZ8IZJSYBLkudQElcYanRQ4+rZfYxJCSE/GpgIFEOmwCiAGOjDQMKgyiMscKKZzCCyptMBAJgz2kIkgBqzTYoDG2vCLiK3kIwMYrvog4iBQi+oBiLCPGiMxQl/hxQSKXYNTIAiNcQkWOM9F4kUR6sHBJFkBGJaREK3mBRxlJjuSSTBIVcgAaUd4WY4y/xIgIAkG80uWWIh6zJEUWUYJKlnedySaTQZa00pBRwSLnnVE1k8yefO7JTJ99/gnons4EBAA7]]></data>
	</file>
	<file>
	  <filename>/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[]]></data>
	</file>
	<file>
	  <filename>/JQueryPlot.module.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBNb2R1bGU6IEpRdWVyeVBsb3QgLSBBIG1vZHVsZSB0byBwcmVwYXJlIGdyYXBocyBiYXNlZCB1cG9uIEpRdWVyeVBsb3QKIyBWZXJzaW9uOiAwLjYsIER1a2V0b3duCiMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBDTVMgLSBDTVMgTWFkZSBTaW1wbGUgaXMgKGMpIDIwMTEgYnkgVGVkIEt1bHAgKHdpc2h5QGNtc21hZGVzaW1wbGUub3JnKQojIFRoaXMgcHJvamVjdCdzIGhvbWVwYWdlIGlzOiBodHRwOi8vd3d3LmNtc21hZGVzaW1wbGUub3JnCiMKIyBUaGlzIGZpbGUgb3JpZ2luYWxseSBjcmVhdGVkIGJ5IE1vZHVsZU1ha2VyIG1vZHVsZSwgdmVyc2lvbiAwLjMuMQojIENvcHlyaWdodCAoYykgMjAxMSBieSBTYW11ZWwgR29sZHN0ZWluIChzamdAY21zbWFkZXNpbXBsZS5vcmcpIAojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMKIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQojIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKIyBPciByZWFkIGl0IG9ubGluZTogaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xpY2Vuc2VzLmh0bWwjR1BMCiMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmNsYXNzIEpRdWVyeVBsb3QgZXh0ZW5kcyBDTVNNb2R1bGUKewoJZnVuY3Rpb24gX19jb25zdHJ1Y3QoKQoJewoJCXBhcmVudDo6X19jb25zdHJ1Y3QoKTsKCX0KCglmdW5jdGlvbiBHZXROYW1lKCkKCXsKCQlyZXR1cm4gJ0pRdWVyeVBsb3QnOwoJfQoKCWZ1bmN0aW9uIEdldEZyaWVuZGx5TmFtZSgpCgl7CgkJLy8gU2V0IHRoZSB2ZXJzaW9uIGluIGEgcHJlZmVyZW5jZSwgZm9yIHNwZWVkIGFuZCBjaGVjayBpbiB2YXJpb3VzIG90aGVyIAoJCS8vIGludmVudG9yeSBtYW5hZ2VtZW50IHByb2dyYW1zCgkJJHRoaXMtPlNldFByZWZlcmVuY2UoJ0pRdWVyeVBsb3QnLid2ZXJzaW9uJywgJ2ZyZWUnKTsKCQkkZm4gPSBjbXNfam9pbl9wYXRoKGRpcm5hbWUoX19GSUxFX18pLCdnb2xkJyk7CgkJaWYgKGZpbGVfZXhpc3RzKCAkZm4gKSApIHsKCQkJJHRoaXMtPlNldFByZWZlcmVuY2UoJ0pRdWVyeVBsb3QnLid2ZXJzaW9uJywgJ2dvbGQnKTsKCQkJcmV0dXJuICR0aGlzLT5MYW5nKCdmcmllbmRseW5hbWVnb2xkJyk7CgkJfQoJCSRmbiA9IGNtc19qb2luX3BhdGgoZGlybmFtZShfX0ZJTEVfXyksJ3NpbHZlcicpOwoJCWlmIChmaWxlX2V4aXN0cyggJGZuICkgKSB7CgkJCSR0aGlzLT5TZXRQcmVmZXJlbmNlKCdKUXVlcnlQbG90Jy4ndmVyc2lvbicsICdzaWx2ZXInKTsKCQkJcmV0dXJuICR0aGlzLT5MYW5nKCdmcmllbmRseW5hbWVzaWx2ZXInKTsKCQl9CgkJcmV0dXJuICR0aGlzLT5MYW5nKCdmcmllbmRseW5hbWUnKTsKCX0KCglmdW5jdGlvbiBHZXRWZXJzaW9uKCkKCXsKCQlyZXR1cm4gJzAuOCc7Cgl9CgoJZnVuY3Rpb24gR2V0SGVscCgpCgl7CgkJcmV0dXJuICR0aGlzLT5MYW5nKCdoZWxwJyk7Cgl9CgoJZnVuY3Rpb24gR2V0QXV0aG9yKCkKCXsKCQlyZXR1cm4gJ0R1a2V0b3duJzsKCX0KCglmdW5jdGlvbiBHZXRBdXRob3JFbWFpbCgpCgl7CgkJcmV0dXJuICcnOwoJfQoKCWZ1bmN0aW9uIEdldENoYW5nZUxvZygpCgl7CgkJcmV0dXJuIGZpbGVfZ2V0X2NvbnRlbnRzKGRpcm5hbWUoX19GSUxFX18pLicvY2hhbmdlbG9nLmluYycpOwoJfQoKCWZ1bmN0aW9uIElzUGx1Z2luTW9kdWxlKCkKCXsKCQlyZXR1cm4gZmFsc2U7Cgl9CgoJZnVuY3Rpb24gSGFzQWRtaW4oKQoJewoJCXJldHVybiB0cnVlOwoJfQoKCWZ1bmN0aW9uIEdldEFkbWluU2VjdGlvbigpCgl7CgkJcmV0dXJuICdleHRlbnNpb25zJzsKCX0KCglmdW5jdGlvbiBHZXRBZG1pbkRlc2NyaXB0aW9uKCkKCXsKCQlyZXR1cm4gJHRoaXMtPkxhbmcoJ2FkbWluZGVzY3JpcHRpb24nKTsKCX0KCglmdW5jdGlvbiBWaXNpYmxlVG9BZG1pblVzZXIoKQoJewogICAgICAgIHJldHVybiAkdGhpcy0+Q2hlY2tBY2Nlc3MoKTsKCX0KCgkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJICAgQ2hlY2tBY2Nlc3MoKQoJICAgVGhpcyB3cmFwcGVyIGZ1bmN0aW9uIHdpbGwgY2hlY2sgYWdhaW5zdCB0aGUgc3BlY2lmaWVkIHBlcm1pc3Npb24sCgkgICBhbmQgZGlzcGxheSBhbiBlcnJvciBwYWdlIGlmIHRoZSB1c2VyIGRvZXNuJ3QgaGF2ZSBhZGVxdWF0ZSBwZXJtaXNzaW9ucy4KCSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCWZ1bmN0aW9uIENoZWNrQWNjZXNzKCRwZXJtID0gJycpCgl7CgkJJGFjY2VzcyA9IGZhbHNlOwoJCWlmICgkcGVybSA9PSAnJykgewoJCQkkYWNjZXNzID0gJHRoaXMtPkNoZWNrUGVybWlzc2lvbignTW9kaWZ5SlF1ZXJ5UGxvdENvcmUnKTsKCQl9CgkJZWxzZSB7CgkJCSRhY2Nlc3MgPSAkdGhpcy0+Q2hlY2tQZXJtaXNzaW9uKCRwZXJtKTsKCQl9CgkJcmV0dXJuICRhY2Nlc3M7Cgl9CgkKCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgkgICBEaXNwbGF5RXJyb3JQYWdlKCkKCSAgIFRoaXMgaXMgYSBzaW1wbGUgZnVuY3Rpb24gZm9yIGdlbmVyYXRpbmcgZXJyb3IgcGFnZXMuCgkgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICBmdW5jdGlvbiBEaXNwbGF5RXJyb3JQYWdlKCRpZCwgJiRwYXJhbXMsICRyZXR1cm5faWQsICRtZXNzYWdlPScnKQogICAgewoJCSR0aGlzLT5zbWFydHktPmFzc2lnbigndGl0bGVfZXJyb3InLCAkdGhpcy0+TGFuZygnZXJyb3InKSk7CgkJJHRoaXMtPnNtYXJ0eS0+YXNzaWduX2J5X3JlZignbWVzc2FnZScsICRtZXNzYWdlKTsKCiAgICAgICAgLy8gRGlzcGxheSB0aGUgcG9wdWxhdGVkIHRlbXBsYXRlCiAgICAgICAgZWNobyAkdGhpcy0+UHJvY2Vzc1RlbXBsYXRlKCdlcnJvci50cGwnKTsKICAgIH0KCgkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJICAgR2V0RGVwZW5kZW5jaWVzKCkKCSAgIFlvdXIgbW9kdWxlIG1heSBuZWVkIGFub3RoZXIgbW9kdWxlIHRvIGFscmVhZHkgYmUgaW5zdGFsbGVkCgkgICBiZWZvcmUgeW91IGNhbiBpbnN0YWxsIGl0LgoJICAgVGhpcyBtZXRob2QgcmV0dXJucyBhIGxpc3Qgb2YgdGhvc2UgZGVwZW5kZW5jaWVzIGFuZAoJICAgbWluaW11bSB2ZXJzaW9uIG51bWJlcnMgdGhhdCB0aGlzIG1vZHVsZSByZXF1aXJlcy4KCSAgIAoJICAgSXQgc2hvdWxkIHJldHVybiBhbiBoYXNoLCBlZy4KCSAgIHJldHVybiBhcnJheSgnc29tZW1vZHVsZSc9PicxLjAnLCAnb3RoZXJtb2R1bGUnPT4nMS4xJyk7CgkgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCglmdW5jdGlvbiBHZXREZXBlbmRlbmNpZXMoKQoJewoJCXJldHVybiBhcnJheSgpOwoJfQoKCWZ1bmN0aW9uIE1pbmltdW1DTVNWZXJzaW9uKCkKCXsKCQlyZXR1cm4gJzEuOS40JzsKCX0KCglmdW5jdGlvbiBNYXhpbXVtQ01TVmVyc2lvbigpCgl7CgkJcmV0dXJuICcxLjEwLjknOwoJfQoKCWZ1bmN0aW9uIEluc3RhbGxQb3N0TWVzc2FnZSgpCgl7CgkJcmV0dXJuICR0aGlzLT5MYW5nKCdwb3N0aW5zdGFsbCcpOwoJfQoKCWZ1bmN0aW9uIFVuaW5zdGFsbFBvc3RNZXNzYWdlKCkKCXsKCQlyZXR1cm4gJHRoaXMtPkxhbmcoJ3Bvc3R1bmluc3RhbGwnKTsKCX0KCglmdW5jdGlvbiBVbmluc3RhbGxQcmVNZXNzYWdlKCkKCXsKCQlyZXR1cm4gJHRoaXMtPkxhbmcoJ3JlYWxseV91bmluc3RhbGwnKTsKCX0KCQoJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCSAgIFNldFBhcmFtZXRlcnMoKQoJICAgRGVzY3JpcHRpb24gb2YgdGhlIGF2YWlsYWJsZSBwYXJhbWV0ZXJzIGZvciB0aGUgZnJvbnQgZW5kCgkgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCglmdW5jdGlvbiBTZXRQYXJhbWV0ZXJzKCkKCXsKCQkkdGhpcy0+UmVzdHJpY3RVbmtub3duUGFyYW1zKCk7CgoJCSR0aGlzLT5TZXRQYXJhbWV0ZXJUeXBlKCdjdXJyZW50dXNlcicsQ0xFQU5fSU5UKTsKCQkkdGhpcy0+U2V0UGFyYW1ldGVyVHlwZSgnZGV0YWlscGFnZScsQ0xFQU5fU1RSSU5HKTsKCgkJLy8gRm9ybSBwYXJhbWV0ZXJzCgkJJHRoaXMtPlNldFBhcmFtZXRlclR5cGUoJ3N1Ym1pdCcsQ0xFQU5fU1RSSU5HKTsKCQkkdGhpcy0+U2V0UGFyYW1ldGVyVHlwZSgnY2FuY2VsJyxDTEVBTl9TVFJJTkcpOwoKCQkkdGhpcy0+bUNhY2hhYmxlID0gZmFsc2U7CgoJfQoJCgkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJICAgR2V0RGFzaGJvYXJkT3V0cHV0KCkKCSAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBieSBBZG1pblxkYXNoYm9hcmQucGhwLgoJICAgQ2FyZWZ1bGwgZGFzaGJvYXJkLnBocCBpcyBub3Qgd29ya2luZyBhcyBvZiB2ZXJzaW9uIDEuNgoJICAgVGhlIHN0cmluZyB0aGF0IGlzIHByZXBhcmVkIGluIHRoaXMgZnVuY3Rpb24gaXMgZGlzcGxheWVkIG9uIHRoZSBkYXNoYm9hcmQuCgkgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCglmdW5jdGlvbiBHZXREYXNoYm9hcmRPdXRwdXQoKQoJewoJCSMkb3V0cHV0ID0gJ0hlbGxvIHdvcmxkJzsKCQkjcmV0dXJuICRvdXRwdXQ7Cgl9CgoJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCSAgIEdldEhlYWRlckhUTUwoKQoJICAgVGhpcyBmdW5jdGlvbiBpbnNlcnRzIGphdmFzY3JpcHQgKGFuZCBsaW5rcykgaW50byBoZWFkZXIgb2YgSFRNTAoJICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoJZnVuY3Rpb24gR2V0SGVhZGVySFRNTCgpCgl7CgkJJGphdmFzY3JpcHQgPSAnJzsKCQkvLyBJbmNsdWRlIGphdmFzY3JpcHQgc28gZWFzeSBkYXRlIHNlbGVjdGlvbiBpcyBwb3NzaWJsZQoJCSRqYXZhc2NyaXB0IC49ICc8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJodHRwOi8vYWpheC5nb29nbGVhcGlzLmNvbS9hamF4L2xpYnMvanF1ZXJ5LzEuMy4yL2pxdWVyeS5taW4uanMiPjwvc2NyaXB0Pic7CgkJJGphdmFzY3JpcHQgLj0gJzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHA6Ly9hamF4Lmdvb2dsZWFwaXMuY29tL2FqYXgvbGlicy9qcXVlcnl1aS8xLjcuMi9qcXVlcnktdWkubWluLmpzIj48L3NjcmlwdD4nOwoJCSRqYXZhc2NyaXB0IC49ICc8bGluayB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwOi8vYWpheC5nb29nbGVhcGlzLmNvbS9hamF4L2xpYnMvanF1ZXJ5dWkvMS43LjIvdGhlbWVzL3Ntb290aG5lc3MvanF1ZXJ5LXVpLmNzcyIgLz4nOwoKCQkvLyBJbmNsdWRlIHNjcmlwdCBzbyBzb3J0aW5nIG9mIHRhYmxlcyBpbiBiYWNrZW5kIGlzIHBvc3NpYmxlCgkJJGphdmFzY3JpcHQgLj0gJzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Ii4uL21vZHVsZXMvSlF1ZXJ5VG9vbHMvbGliL2pxdWVyeS50YWJsZXNvcnRlci5qcyI+PC9zY3JpcHQ+Jy4iXG4iOwoJCSRqYXZhc2NyaXB0IC49ICc8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9tb2R1bGVzL0pRdWVyeVRvb2xzL2xpYi9jc3MvSlF1ZXJ5VG9vbHMuY3NzIiBtZWRpYT0ic2NyZWVuIiAvPicuIlxuIjsKCQkkamF2YXNjcmlwdCAuPSAnPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGlkPSJqcyI+alF1ZXJ5KGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpIAoJCXsgCgkJCWpRdWVyeSgiLmNtc19zb3J0YWJsZSIpCgkJCQkudGFibGVzb3J0ZXIoIAoJCQkJKTsgCgkJfSAKCQkpOyAKCQk8L3NjcmlwdD4nOwoJCXJldHVybiAkamF2YXNjcmlwdDsKCX0KCgkvKioKCSAqIEdldExpc3ROdW1iZXJPZkNvbHVtbnMoKQoJICogQSBmdW5jdGlvbiB0byByZXR1cm4gZmlsbCBhcnJheSB3aXRoIHBvc3NpYmxlIG51bWJlciBvZiBjb2x1bW5zCgkgKiBAcmV0dXJuIGFycmF5IGxpc3Qgb2YgbnVtYmVycwoJICovCQoJZnVuY3Rpb24gR2V0TGlzdE51bWJlck9mQ29sdW1ucygpCgl7CgkJJG51bWJlcm9mY29sdW1uc2xpc3QgPSBhcnJheSgpOwoJCWZvciAoJGkgPSAxOyAkaSA8IDEwOyAkaSsrKSB7CgkJCSRudW1iZXJvZmNvbHVtbnNsaXN0WyRpXSA9ICRpOwoJCX0KCQkKCQlyZXR1cm4gJG51bWJlcm9mY29sdW1uc2xpc3Q7Cgl9CgoJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCQlHZXRMaXN0UGFnZUxpbWl0KCkKCQlBIGZ1bmN0aW9uIHRvIHJldHVybiBmaWxsIGFycmF5IHdpdGggcG9zc2libGUgcGFnZWxpbWl0cwoJCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8JCglmdW5jdGlvbiBHZXRMaXN0UGFnZUxpbWl0KCkKCXsKCQkkcGFnZWxpbWl0bGlzdCA9IGFycmF5KCk7CgkJJHBhZ2VsaW1pdGxpc3RbJzUnXSA9IDU7CgkJJHBhZ2VsaW1pdGxpc3RbJzEwJ10gPSAxMDsKCQkkcGFnZWxpbWl0bGlzdFsnMjUnXSA9IDI1OwoJCSRwYWdlbGltaXRsaXN0Wyc1MCddID0gNTA7CgkJJHBhZ2VsaW1pdGxpc3RbJzEwMCddID0gMTAwOwoJCSRwYWdlbGltaXRsaXN0WyR0aGlzLT5MYW5nKCd1bmxpbWl0ZWQnKV0gPSA5OTk5OTk5OTsKCQkKCQlyZXR1cm4gJHBhZ2VsaW1pdGxpc3Q7Cgl9CgoJLyoqCgkgKiBHZXRMaXN0U3R5bGVzaGVldHMoKQoJICogQSBmdW5jdGlvbiB0byByZXR1cm4gZmlsbCBhcnJheSB3aXRoIHBvc3NpYmxlIHBhZ2VsaW1pdHMKCSAqIEByZXR1cm4gYXJyYXkgbGlzdCBvZiBzdHlsZXNoZWV0cwoJICovCQoJZnVuY3Rpb24gR2V0TGlzdFN0eWxlc2hlZXRzKCkKCXsKCQkvLyBJbml0aWFsaXplIHRoZSBEYXRhYmFzZQoJCSRkYiA9IGNtc21zKCktPkdldERiKCk7CgoJCSRzdHlsZXNoZWV0bGlzdCA9IGFycmF5KCk7CgkJJHF1ZXJ5ID0gJ1NFTEVDVCAqIEZST00gJy5jbXNfZGJfcHJlZml4KCkuJ2NzcyBPUkRFUiBCWSBjc3NfbmFtZSc7CgkJJGRicmVzdWx0ID0gJGRiLT5FeGVjdXRlKCRxdWVyeSk7CgoJCXdoaWxlICgkZGJyZXN1bHQgJiYgJHJvdyA9ICRkYnJlc3VsdC0+RmV0Y2hSb3coKSkKCQl7CgkJCSRzdHlsZXNoZWV0bGlzdFskcm93Wydjc3NfbmFtZSddXSA9ICRyb3dbJ2Nzc19pZCddOwoJCX0KCgkJcmV0dXJuICRzdHlsZXNoZWV0bGlzdDsKCX0KCgkvKioKCSAqIENvcHkgZnJvbSBwbHVnaW4gc21hcnR5X2Ntc19mdW5jdGlvbl9jbXNfc3R5bGVzaGVldAoJICogQHBhcmFtIGFycmF5ICRwYXJhbXMgd2l0aCB2YXJpYWJsZXMKCSAqIEByZXR1cm4gc3RyaW5nIHdpdGggbGlua3MKCSAqLwoJZnVuY3Rpb24gc2V0Q21zU3R5bGVzaGVldCgkcGFyYW1zLCAmJHNtYXJ0eSkKCXsKCQkvLwoJCS8vIGJlZ2luCgkJLy8KCQkkZ0NtcyA9IGNtc21zKCk7CgkJZ2xvYmFsICRDTVNfU1RZTEVTSEVFVDsKCQkkQ01TX1NUWUxFU0hFRVQgPSAxOwoJCSR0ZW1wbGF0ZV9pZCA9ICcnOwoJCSR1c2VfaHR0cHMgPSAtMTsKCQoJCWlmIChpc3NldCgkcGFyYW1zWyJ0ZW1wbGF0ZWlkIl0pICYmICRwYXJhbXNbInRlbXBsYXRlaWQiXSE9IiIpCgkJewoJCQkkdGVtcGxhdGVfaWQgPSAkcGFyYW1zWyJ0ZW1wbGF0ZWlkIl07CgkJfQoJCWVsc2UgewoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJCQoJCSRjb25maWcgPSAkZ0Ntcy0+Y29uZmlnOwoJCSRkYiA9ICRnQ21zLT5HZXREYigpOwoJCSRyb290X3VybCA9ICRjb25maWdbJ3Jvb3RfdXJsJ107CgkKCQkkY2FjaGVfZGlyID0gVE1QX0NBQ0hFX0xPQ0FUSU9OOwoJCSRzdHlsZXNoZWV0ID0gJyc7CgkKCQkkcXBhcm1zID0gYXJyYXkoKTsKCQkkd2hlcmUgPSBhcnJheSgpOwoJCSRxdWVyeSA9ICcnOwoJCSRvcmRlciA9ICcnOwoJCSRjb21iaW5lX3N0eWxlc2hlZXRzID0gRkFMU0U7CgkJJHF1ZXJ5ID0gJ1NFTEVDVCBESVNUSU5DVCBBLmNzc19pZCxBLmNzc19uYW1lLEEuY3NzX3RleHQsQS5tb2RpZmllZF9kYXRlLCBBLm1lZGlhX3R5cGUKCQkJCQlGUk9NICcuY21zX2RiX3ByZWZpeCgpLidjc3MgQSc7CgkJJHdoZXJlW10gPSAnQS5jc3NfaWQgPSA/JzsKCQkkcXVlcnkgLj0gIiBXSEVSRSAiLmltcGxvZGUoJyBBTkQgJywkd2hlcmUpLicgJy4kb3JkZXI7CgkJaWYoIGlzc2V0KCRwYXJhbXNbJ25vY29tYmluZSddKSAmJiAkcGFyYW1zWydub2NvbWJpbmUnXSApCgkJewoJCQkvLyBmb3JjZWQgbm90IHRvIGNvbWJpbmUuCgkJCSRjb21iaW5lX3N0eWxlc2hlZXRzID0gRkFMU0U7CgkJfQoJCgkJJGZuc3VmZml4ID0gJyc7CgkJJHRyaW1iYWNrZ3JvdW5kID0gRkFMU0U7CgkJaWYoIGlzc2V0KCRwYXJhbXNbJ2FkanVzdGZvcmVkaXRvciddKS8qICYmICRwYXJhbXNbJ2FkanVzdGZvcmVkaXRvciddKi8pCgkJewoJCQkkZm5zdWZmaXggPSAnX2UnOwoJCQkkdHJpbWJhY2tncm91bmQgPSBUUlVFOwoJCX0KCQoJCSRyZXMgPSAkZGItPkdldFJvdygkcXVlcnksIGFycmF5KCR0ZW1wbGF0ZV9pZCkpOwoJCWlmKCAkcmVzICkKCQl7CgkKCQkJJG1vZGlmaWVkX2RhdGUgPSAwOwoJCQkkbWVkaWFfY2hhbmdlZCA9IGZhbHNlOwoJCQkkdGVzdF9tZWRpYSA9ICcnOwoJCQlpZiggJGNvbWJpbmVfc3R5bGVzaGVldHMgKQoJCQl7CgkJCQkvLyBpZiB3ZSBzdGlsbCB0aGluayB3ZSBjYW4gY29tYmluZSBzdHlsZXNoZWV0cywgZG8gYSBjaGVjayB0aHJvdWdoIGFsbCBvZiB0aGUgbWVkaWEgdHlwZXMKCQkJCS8vIHRvIGVuc3VyZSB0aGF0IHRoZXkgYXJlIHRoZSBzYW1lLi4gaWYgdGhleSBhcmVuJ3QgZG8gbm90IGNvbWJpbmUgdGhlbQoJCQkJLy8gdGhpcyBjb3VsZCBiZSBzbWFydGVyLgoJCQkJZm9yKCAkaSA9IDA7ICRpIDwgY291bnQoJHJlcyk7ICRpKysgKQoJCQkJewoJCQkJCSRtb2RpZmllZF9kYXRlID0gbWF4KCRtb2RpZmllZF9kYXRlLHN0cnRvdGltZSgkcmVzWyRpXVsnbW9kaWZpZWRfZGF0ZSddKSk7CgkJCQkJaWYoICR0ZXN0X21lZGlhID09ICcnICkKCQkJCQl7CgkJCQkJCSR0ZXN0X21lZGlhID0gJHJlc1skaV1bJ21lZGlhX3R5cGUnXTsKCQkJCQl9CgkJCQkJaWYoICRyZXNbJGldWydtZWRpYV90eXBlJ10gIT0gJHRlc3RfbWVkaWEgKQoJCQkJCXsKCQkJCQkJJG1lZGlhX2NoYW5nZWQgPSBUUlVFOwoJCQkJCX0KCQkJCX0KCQkJCWlmKCAkbWVkaWFfY2hhbmdlZCApICRjb21iaW5lX3N0eWxlc2hlZXRzID0gRkFMU0U7CgkJCX0KCQoJCQlpZiggJGNvbWJpbmVfc3R5bGVzaGVldHMgJiYgJHRlbXBsYXRlX2lkID4gMCApCgkJCXsKCQkJCS8vIGNvbWJpbmUgYWxsIG1hdGNoZXMgaW50byBvbmUgc3R5bGVzaGVldC4KCQkJCSRmaWxlbmFtZSA9ICdzdHlsZXNoZWV0X2NvbWJpbmVkXycubWQ1KCR0ZW1wbGF0ZV9pZC4kdXNlX2h0dHBzLiRtb2RpZmllZF9kYXRlLiRmbnN1ZmZpeCkuJy5jc3MnOwoJCQkJJGZuID0gY21zX2pvaW5fcGF0aCgkY2FjaGVfZGlyLCRmaWxlbmFtZSk7CgkJCQlpZiggIWZpbGVfZXhpc3RzKCRmbikgKQoJCQkJewoJCQkJCSR0ZXh0ID0gJyc7CgkJCQkJZm9yKCAkaSA9IDA7ICRpIDwgY291bnQoJHJlcyk7ICRpKysgKQoJCQkJCXsKCQkJCQkJJG9uZSA9ICRyZXNbJGldOwoJCQkJCQkkdGV4dCAuPSAnLyogU3R5bGVzaGVldDogJy4kb25lWydjc3NfbmFtZSddLicgTW9kaWZpZWQgT24gJy4kb25lWydtb2RpZmllZF9kYXRlJ10uIiAqL1xuIjsKCQkJCQkJJHRleHQgLj0gJG9uZVsnY3NzX3RleHQnXTsKCQkJCQkJaWYoICFlbmRzd2l0aCgkdGV4dCwiXG4iKSApICR0ZXh0IC49ICJcbiI7CgkJCQkJfQoJCgkJCQkJJHNtYXJ0eSA9IGNtc21zKCktPkdldFNtYXJ0eSgpOwoJCQkJCSRzbWFydHktPmxlZnRfZGVsaW1pdGVyID0gJ1tbJzsKCQkJCQkkc21hcnR5LT5yaWdodF9kZWxpbWl0ZXIgPSAnXV0nOwoJCQkJCSRzbWFydHktPl9jb21waWxlX3NvdXJjZSgnc3R5bGVzaGVldDpjb21iaW5lZCcsICR0ZXh0LCAkX2NvbXBpbGVkICk7CgkJCQkJQG9iX3N0YXJ0KCk7CgkJCQkJJHNtYXJ0eS0+X2V2YWwoJz8+JyAuICRfY29tcGlsZWQpOwoJCQkJCSRfY29udGVudHMgPSBAb2JfZ2V0X2NvbnRlbnRzKCk7CgkJCQkJQG9iX2VuZF9jbGVhbigpOwoJCgkJCQkJaWYoICR0cmltYmFja2dyb3VuZCApCgkJCQkJewoJCQkJCQkvLyBhdHRlbXB0IHRvIHRyaW0gYmFja2dyb3VuZCBzdHVmZiBmcm9tIHN0eWxlc2hlZXRzLgoJCQkJCQkkX2NvbnRlbnRzID0gcHJlZ19yZXBsYWNlKCcvKFx3Kj9iYWNrZ3JvdW5kLWNvbG9yLio/XDpcdyo/KS4qPyg7Lio/KS8nLCAnXFwxdHJhbnNwYXJlbnRcXDInLCAkX2NvbnRlbnRzKTsKCQkJCQkJJF9jb250ZW50cyA9IHByZWdfcmVwbGFjZSgnLyhcdyo/YmFja2dyb3VuZC1pbWFnZS4qP1w6XHcqPykuKj8oOy4qPykvJywgJycsICRfY29udGVudHMpOwoJCQkJCQkkX2NvbnRlbnRzID0gcHJlZ19yZXBsYWNlKCcvKFx3Kj9iYWNrZ3JvdW5kLio/XDpcdyo/KS4qPyg7Lio/KS8nLCAnJywgJF9jb250ZW50cyk7CgkJCQkJfQoJCgkJCQkJJGZoID0gZm9wZW4oJGZuLCd3Jyk7CgkJCQkJZndyaXRlKCRmaCwkX2NvbnRlbnRzKTsKCQkJCQlmY2xvc2UoJGZoKTsKCQoJCQkJCSRzbWFydHktPmxlZnRfZGVsaW1pdGVyID0gJ3snOwoJCQkJCSRzbWFydHktPnJpZ2h0X2RlbGltaXRlciA9ICd9JzsKCQkJCX0KCQoJCQkJaWYoIGlzc2V0KCRwYXJhbXNbJ25vbGlua3MnXSkgKQoJCQkJewoJCQkJCSRzdHlsZXNoZWV0IC49ICRyb290X3VybC4nL3RtcC9jYWNoZS8nLiRmaWxlbmFtZTsKCQkJCX0KCQkJCWVsc2UKCQkJCXsKCQkJCQkkc3R5bGVzaGVldCAuPSAnPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iJy4kcm9vdF91cmwuJy90bXAvY2FjaGUvJy4kZmlsZW5hbWUuJyIvPicuIlxuIjsKCQkJCX0KCQkJfQoJCQllbHNlCgkJCXsKCQkJCS8vIHNlcGFyZXRlIHN0eWxlc2hlZXQgcmVjb3Jkcy4KCQkJCSRmbXQxID0gJzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIG1lZGlhPSIlcyIgaHJlZj0iJXMiIC8+JzsKCQkJCSRmbXQyID0gJzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9IiVzIiAvPic7CgkJCQkkbWVkaWFfdHlwZSA9IHN0cl9yZXBsYWNlKCcgJywnJywkcmVzWydtZWRpYV90eXBlJ10pOwoJCQkJJGZpbGVuYW1lID0gJ3N0eWxlc2hlZXRfJy5tZDUoJ3NpbmdsZScuJHJlc1snY3NzX2lkJ10uJHVzZV9odHRwcy5zdHJ0b3RpbWUoJHJlc1snbW9kaWZpZWRfZGF0ZSddKS4kZm5zdWZmaXgpLicuY3NzJzsKCQkJCWlmICggIWZpbGVfZXhpc3RzKGNtc19qb2luX3BhdGgoJGNhY2hlX2RpciwkZmlsZW5hbWUpKSApCgkJCQl7CgkJCQkJJHNtYXJ0eSA9ICRnQ21zLT5HZXRTbWFydHkoKTsKCQkJCQkkc21hcnR5LT5sZWZ0X2RlbGltaXRlciA9ICdbWyc7CgkJCQkJJHNtYXJ0eS0+cmlnaHRfZGVsaW1pdGVyID0gJ11dJzsKCQkJCQkkc21hcnR5LT5fY29tcGlsZV9zb3VyY2UoJ3N0eWxlc2hlZXQ6Jy4kcmVzWydjc3NfbmFtZSddLCAkcmVzWydjc3NfdGV4dCddLCAkX2NvbXBpbGVkICk7CgkJCQkJQG9iX3N0YXJ0KCk7CgkJCQkJJHNtYXJ0eS0+X2V2YWwoJz8+JyAuICRfY29tcGlsZWQpOwoJCQkJCSRfY29udGVudHMgPSBAb2JfZ2V0X2NvbnRlbnRzKCk7CgkJCQkJQG9iX2VuZF9jbGVhbigpOwoJCQkJCSRzbWFydHktPmxlZnRfZGVsaW1pdGVyID0gJ3snOwoJCQkJCSRzbWFydHktPnJpZ2h0X2RlbGltaXRlciA9ICd9JzsKCgkJCQkJaWYoICR0cmltYmFja2dyb3VuZCApCgkJCQkJewoJCQkJCQkkX2NvbnRlbnRzID0gcHJlZ19yZXBsYWNlKCcvKFx3Kj9iYWNrZ3JvdW5kLWNvbG9yLio/XDpcdyo/KS4qPyg7Lio/KS8nLCAnXFwxdHJhbnNwYXJlbnRcXDInLCAkX2NvbnRlbnRzKTsKCQkJCQkJJF9jb250ZW50cyA9IHByZWdfcmVwbGFjZSgnLyhcdyo/YmFja2dyb3VuZC1pbWFnZS4qP1w6XHcqPykuKj8oOy4qPykvJywgJycsICRfY29udGVudHMpOwoJCQkJCQkkX2NvbnRlbnRzID0gcHJlZ19yZXBsYWNlKCcvKFx3Kj9iYWNrZ3JvdW5kLio/XDpcdyo/KS4qPyg7Lio/KS8nLCAnJywgJF9jb250ZW50cyk7CgkJCQkJfQoKCQkJCQkkZm5hbWUgPSBjbXNfam9pbl9wYXRoKCRjYWNoZV9kaXIsJGZpbGVuYW1lKTsKCQkJCQkkZnAgPSBmb3BlbigkZm5hbWUsICd3Jyk7CgkJCQkJLy93ZSBjb252ZXJ0IENSTEYgdG8gTEYgZm9yIHVuaXggY29tcGF0aWJpbGl0eQoJCQkJCWZ3cml0ZSgkZnAsIHN0cl9yZXBsYWNlKCJcclxuIiwgIlxuIiwgJF9jb250ZW50cykpOwoJCQkJCWZjbG9zZSgkZnApOwoJCQkJCS8vc2V0IHRoZSBtb2RpZmllZCBkYXRlIHRvIHRoZSB0ZW1wbGF0ZSBtb2RpZmllZCBkYXRlCgkJCQkJLy90b3VjaCgkZm5hbWUsICRkYi0+VW5peFRpbWVTdGFtcCgkb25lWydtb2RpZmllZF9kYXRlJ10pKTsKCQkJCX0KCgkJCQlpZiggaXNzZXQoJHBhcmFtc1snbm9saW5rcyddKSApCgkJCQl7CgkJCQkJJHN0eWxlc2hlZXQgLj0gJHJvb3RfdXJsLicvdG1wL2NhY2hlLycuJGZpbGVuYW1lLicsJzsKCQkJCX0KCQkJCWVsc2UKCQkJCXsJCgkJCQkJaWYgKCBlbXB0eSgkbWVkaWFfdHlwZSkgKQoJCQkJCQl7CgkJCQkJCQkkc3R5bGVzaGVldCAuPSAnPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iJy4kcm9vdF91cmwuJy90bXAvY2FjaGUvJy4kZmlsZW5hbWUuJyIvPicuIlxuIjsKCQkJCQkJfQoJCQkJCWVsc2UKCQkJCQkJewoJCQkJCQkJJHN0eWxlc2hlZXQgLj0gJzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9IicuJHJvb3RfdXJsLicvdG1wL2NhY2hlLycuJGZpbGVuYW1lLiciIG1lZGlhPSInLiRtZWRpYV90eXBlLiciLz4nLiJcbiI7CgkJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCgkJaWYgKCEoaXNzZXQoJGNvbmZpZ1sidXNlX3NtYXJ0eV9waHBfdGFncyJdKSAmJiAkY29uZmlnWyJ1c2Vfc21hcnR5X3BocF90YWdzIl0gPT0gdHJ1ZSkpCgkJewoJCQkkc3R5bGVzaGVldCA9IHByZWdfcmVwbGFjZSgiL1x7XC8/cGhwXH0vIiwgIiIsICRzdHlsZXNoZWV0KTsKCQl9CgkKCQlpZiggaXNzZXQoJHBhcmFtc1snbm9saW5rcyddKSAmJiBlbmRzd2l0aCgkc3R5bGVzaGVldCwnLCcpICkKCQl7CgkJCSRzdHlsZXNoZWV0ID0gc3Vic3RyKCRzdHlsZXNoZWV0LDAsc3RybGVuKCRzdHlsZXNoZWV0KS0xKTsKCQl9CgkKCQkkQ01TX1NUWUxFU0hFRVQgPSAwOwoJCXVuc2V0KCRDTVNfU1RZTEVTSEVFVCk7CgkJdW5zZXQoJEdMT0JBTFNbJ0NNU19TVFlMRVNIRUVUJ10pOwoJCWlmKCBpc3NldCgkcGFyYW1zWydhc3NpZ24nXSkgKXsKCQkJJHNtYXJ0eS0+YXNzaWduKHRyaW0oJHBhcmFtc1snYXNzaWduJ10pLCRzdHlsZXNoZWV0KTsKCQkJcmV0dXJuOwoJCX0KCQlyZXR1cm4gJHN0eWxlc2hlZXQ7Cgl9Cgp9Cgo/Pgo=]]></data>
	</file>
	<file>
	  <filename>/lang/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lang/en_US.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbJ2ZyaWVuZGx5bmFtZSddID0gJ0dyYXBocyc7CiRsYW5nWydmcmllbmRseW5hbWVnb2xkJ10gPSAnR3JhcGhzIEdvbGQnOwokbGFuZ1snZnJpZW5kbHluYW1lc2lsdmVyJ10gPSAnR3JhcGhzIFNpbHZlcic7CiRsYW5nWydwb3N0aW5zdGFsbCddID0gJ1RoYW5rcyBmb3IgaW5zdGFsbGluZyB0aGlzIG1vZHVsZSc7CiRsYW5nWydwb3N0dW5pbnN0YWxsJ10gPSAnU29ycnkgdG8gbm90aWNlIHlvdSBkZWxldGVkIHRoZSBtb2R1bGUnOwokbGFuZ1sncmVhbGx5X3VuaW5zdGFsbCddID0gJ1JlYWxseT8gQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIHVuc2luc3RhbGwgdGhpcyBtb2R1bGU/JzsKJGxhbmdbJ3VuaW5zdGFsbGVkJ10gPSAnTW9kdWxlIFVuaW5zdGFsbGVkLic7CiRsYW5nWydpbnN0YWxsZWQnXSA9ICdNb2R1bGUgdmVyc2lvbiAlcyBpbnN0YWxsZWQuJzsKJGxhbmdbJ3VwZ3JhZGVkJ10gPSAnTW9kdWxlIHVwZ3JhZGVkIHRvIHZlcnNpb24gJXMuJzsKJGxhbmdbJ21vZGRlc2NyaXB0aW9uJ10gPSAnQSBtb2R1bGUgdG8gcHJlcGFyZSBncmFwaHMgYmFzZWQgdXBvbiBKUXVlcnlQbG90JzsKCiRsYW5nWydhY2Nlc3NkZW5pZWQnXSA9ICdBY2Nlc3MgRGVuaWVkLiBQbGVhc2UgY2hlY2sgeW91ciBwZXJtaXNzaW9ucy4nOwokbGFuZ1snYWRtaW5kZXNjcmlwdGlvbiddID0gJ0Egc2V0IG9mIHByb2dyYW1zLCBzY3JpcHRzIHRoYXQgc3VwcG9ydCB0aGUgYnVpbGRpbmcgb2YgY2hhcnRzL2dyYXBocyBiYXNlZCB1cG9uIDxhIGhyZWY9Imh0dHA6Ly93d3cuanFwbG90LmNvbSIgdGFyZ2V0PSJfYmxhbmsiPmpxUGxvdDwvYT4nOwokbGFuZ1snYWRtaW5fdGl0bGUnXSA9ICdHcmFwaHMgQWRtaW4gUGFuZWwnOwokbGFuZ1snYXJleW91c3VyZSddID0gJ0FyZSB5b3Ugc3VyZSB0byBkZWxldGUgdGhpcz8nOwokbGFuZ1snYXBwbHknXSA9ICdBcHBseSc7CiRsYW5nWydjYW5jZWwnXSA9ICdDYW5jZWwnOwokbGFuZ1snZGVsZXRlJ10gPSAnRGVsZXRlJzsKJGxhbmdbJ2VkaXQnXSA9ICdFZGl0JzsKJGxhbmdbJ2Vycm9yJ10gPSAnRXJyb3IhJzsKJGxhbmdbJ3Jlc2V0J10gPSAnUmVzZXQnOwokbGFuZ1snc3VibWl0J10gPSAnU3VibWl0JzsKJGxhbmdbJ2ZpcnN0cGFnZSddID0gJzw8JzsKJGxhbmdbJ2xhc3RwYWdlJ10gPSAnPj4nOwoKJGxhbmdbJ21vZHVsZV9leGFtcGxlX3N0eWxlc2hlZXQnXT0nTW9kdWxlOiBHcmFwaHMnOwokbGFuZ1snbW4xJ10gPSAnSmFudWFyeSc7CiRsYW5nWydtbjInXSA9ICdGZWJydWFyeSc7CiRsYW5nWydtbjMnXSA9ICdNYXJjaCc7CiRsYW5nWydtbjQnXSA9ICdBcHJpbCc7CiRsYW5nWydtbjUnXSA9ICdNYXknOwokbGFuZ1snbW42J10gPScgSnVuZSc7CiRsYW5nWydtbjcnXSA9ICdKdWx5JzsKJGxhbmdbJ21uOCddID0gJ0F1Z3VzdCc7CiRsYW5nWydtbjknXSA9ICdTZXB0ZW1iZXInOwokbGFuZ1snbW4xMCddID0gJ09jdG9iZXInOwokbGFuZ1snbW4xMSddID0gJ05vdmVtYmVyJzsKJGxhbmdbJ21uMTInXSA9ICdEZWNlbWJlcic7CiRsYW5nWydtczEnXSA9ICdKYW4nOwokbGFuZ1snbXMyJ10gPSAnRmViJzsKJGxhbmdbJ21zMyddID0gJ01hcic7CiRsYW5nWydtczQnXSA9ICdBcHInOwokbGFuZ1snbXM1J10gPSAnTWF5JzsKJGxhbmdbJ21zNiddID0nIEp1bic7CiRsYW5nWydtczcnXSA9ICdKdWwnOwokbGFuZ1snbXM4J10gPSAnQXVnJzsKJGxhbmdbJ21zOSddID0gJ1NlcCc7CiRsYW5nWydtczEwJ10gPSAnT2N0JzsKJGxhbmdbJ21zMTEnXSA9ICdOb3YnOwokbGFuZ1snbXMxMiddID0gJ0RlYyc7CiRsYW5nWyduZXh0cGFnZSddID0gJz4nOwokbGFuZ1snbm9jaGFydHNmb3VuZCddID0gJ05vIGNoYXJ0cyBmb3VuZC4gQ3JlYXRlIHRoZW0geW91cnNlbGYgb3IgYnV5IHRoZW0gZnJvbSB0aGUgCjxhIGhyZWY9Imh0dHA6Ly93d3cuZHVrZXRvd24uZXUvc2hvcC9fY2F0YWxvZy9ncmFwaHMvY2hhcnRzL2NoYXJ0c19mb3JfZ3JhcGhzIiB0YXJnZXQ9Il9ibGFuayI+c2hvcCBvZiBEdWtldG93bi48L2E+JzsKJGxhbmdbJ25vZ29sZG9wdGlvbnMnXSA9ICdObyBnb2xkIG9wdGlvbnMgYXZhaWxhYmxlJzsKJGxhbmdbJ25vc2lsdmVyb3B0aW9ucyddID0gJ05vIHNpbHZlciBvcHRpb25zIGF2YWlsYWJsZSc7CiRsYW5nWydwYWdlbmFtZSddID0gJ1BhZ2UnOwokbGFuZ1sncHJldnBhZ2UnXSA9ICc8JzsKJGxhbmdbJ3Byb21wdF9vZiddID0gJ29mJzsKJGxhbmdbJ3RpdGxlX2NoYXJ0bWF4aGVpZ2h0J10gPSAnQ2hhcnQgbWF4IGhlaWdodCBpbiBwaXhlbHMnOwokbGFuZ1sndGl0bGVfY2hhcnRyZXNpemVoZWlnaHQnXSA9ICdSZXNpemUgY2hhcnQgaGVpZ2h0cz8nOwokbGFuZ1sndGl0bGVfZGFzaGJvYXJkJ10gPSAnRGFzaGJvYXJkJzsKJGxhbmdbJ3RpdGxlX2RlZmF1bHRzdHlsZXNoZWV0J10gPSAnRGVmYXVsdCBzdHlsZXNoZWV0JzsKJGxhbmdbJ3RpdGxlX21heHdpZHRocGl4ZWxzJ10gPSAnTWF4IHdpZHRoIGluIHBpeGVscyB0byB1c2Ugb24gZGFzaGJvYXJkJzsKJGxhbmdbJ3RpdGxlX251bWJlcm9mY29sdW1ucyddID0gJ051bWJlciBvZiBjb2x1bW5zJzsKJGxhbmdbJ3RpdGxlX29wdGlvbnMnXSA9ICdPcHRpb25zJzsKJGxhbmdbJ3RpdGxlX29wdGlvbnNnb2xkJ10gPSAnT3B0aW9ucyBHb2xkJzsKJGxhbmdbJ3RpdGxlX29wdGlvbnNzaWx2ZXInXSA9ICdPcHRpb25zIFNpbHZlcic7CiRsYW5nWyd0aXRsZV9wYWdlbGltaXQnXSA9ICdNYXggbGluZXMvcGFnZSBpbiBiYWNrIGVuZCc7CiRsYW5nWyd1bmxpbWl0ZWQnXSA9ICdVbmxpbWl0ZWQnOwoKCiRsYW5nWydvcHRpb25zdXBkYXRlZCddID0gJ09wdGlvbnMgaGF2ZSBiZWVuIHVwZGF0ZWQnOwoKJGxhbmdbJ2hlbHAnXSA9ICc8aDM+V2hhdCBEb2VzIFRoaXMgRG8/PC9oMz4KPHA+QSBtb2R1bGUgdG8gcHJlcGFyZSBjaGFydHMvZ3JhcGhzIGJhc2VkIHVwb24gSlF1ZXJ5UGxvdC4gQ2hhcnRzIGFyZSBvbmx5IGF2YWlsYWJsZSBpbiB0aGUgYmFjayBlbmQuPC9wPgo8aDM+SG93IERvIEkgVXNlIEl0PC9oMz4KPHA+VGhpcyBtb2R1bGUgZm9ybXMgYSBiYXNlIGZvciBncmFwaHMgYW5kIHBsb3RzIHRvIGJlIHVzZWQgaW4gb3RoZXIgbW9kdWxlcy48L3A+CjxwPkR1cmluZyBpbnN0YWxsYXRpb24gYSBzdHlsZXNoZWV0IGlzIGFkZGVkIHRvIHRoZSBhdmFpbGFibGUgc3R5bGVzaGVldHMuIEl0IGhhcyB0aGUgbmFtZSBcJ01vZHVsZTogR3JhcGhzXCcuCkFkZCB0aGlzIHN0eWxlc2hlZXQgdG8gdGhlIGxpc3Qgb2Ygc3R5bGVzaGVldHMgaW4gdXNlIHdpdGggYSB0ZW1wbGF0ZS48YnIgLz4KT3RoZXIgbW9kdWxlcyBjYW4gdXNlIHRoaXMgc3R5bGVzaGVldC48L3A+CjxoMz5CdWlsZCB5b3VyIG93biBjaGFydHM8L2gzPgpCdXkgdGhlIGNoYXJ0cyBmcm9tIHRoZSA8YSBocmVmPSJodHRwOi8vd3d3LmR1a2V0b3duLmV1L3Nob3AvX2NhdGFsb2cvZ3JhcGhzL2NoYXJ0cy9jaGFydHNfZm9yX2dyYXBocyIgdGFyZ2V0PSJfYmxhbmsiPnNob3Agb2YgRHVrZXRvd248L2E+LjxiciAvPgpBbHRlcm5hdGl2ZWx5IHlvdSBjYW4gcHJlcGFyZSB5b3VyIG93biBhcyB3ZWxsLiBTb21lIHJlc3RyaWN0aW9ucyBhcmUgaW4gcGxhY2UuPGJyIC8+CllvdSB3aWxsIGhhdmUgdG8gcHJlcGFyZSBhIHBocCBwcm9ncmFtIHRoYXQgZm9sbG93cyB0aGUgbmFtaW5nIGNvbnZlbnRpb246IG15Y2hhcnQuW25hbWUgb2YgZnVuY3Rpb24gaW4gcHJvZ3JhbV0ucGhwPGJyIC8+ClR3byBwYXJhbWV0ZXJzIGFyZSBwYXNzZWQ6IHRoZSBudW1iZXIgb2YgdGhlIGNoYXJ0LiBUaGlzIGlzIG5lZWRlZCB0byBwbGFjZSB5b3VyIGNoYXJ0IGNvcnJlY3RseSBpbiAKdGhlIGRhc2hib2FyZC48YnIgLz4KVGhlIHNlY29uZCBwYXJhbWV0ZXIgY29udGFpbnMgdGhlIHBhdGggdG8gdGhlIHBsdWdpbnMgZGlyZWN0b3J5IHRvIHBlcmZvcm0gc3BlY2lhbCB0aGluZ3Mgd2l0aCB0aGUgY2hhcnRzLjxiciAvPgo8YnIgLz4KPHA+ClRha2UgYSBsb29rIGF0IDxhIGhyZWY9Imh0dHA6Ly93aWtpLmNtc21hZGVzaW1wbGUub3JnL2luZGV4LnBocD90aXRsZT1Vc2VyX0hhbmRib29rL0FkbWluX1BhbmVsL0V4dGVuc2lvbnMvTW9kdWxlcy9TZXJ2aWNlRGVzay9Hb2xkI0V4dGVuZGluZ190aGVfRGFzaGJvYXJkIiAKdGFyZ2V0PSJfYmxhbmsiPmV4dGVuZGluZyB0aGUgU2VydmljZSBEZXNrIGRhc2hib2FyZDwvYT4gZm9yIGFuIGV4YW1wbGUgb2YgYSBwcm9ncmFtLjxiciAvPgpTYXZlIHRoZSBwcm9ncmFtIHdpdGggbmFtZSBteWNoYXJ0LnByZXBNeUNoYXJ0LnBocC48YnIgLz4KT25jZSByZWFkeSBwbGFjZSB0aGUgY2hhcnQgaW4gZGlyZWN0b3J5IG1vZHVsZXNcSlF1ZXJ5UGxvdC48YnIgLz4KVXNlIDxhIGhyZWY9Imh0dHA6Ly93d3cuanFwbG90LmNvbSIgdGFyZ2V0PSJfYmxhbmsiPmpxcGxvdC5jb208L2E+IHdpdGggZXhhbXBsZXMgdG8gYnVpbGQgeW91ciBvd24gY2hhcnRzLjwvcD4KPGgzPldoYXQgUGFyYW1ldGVycyBEb2VzIEl0IFRha2U8L2gzPgo8cD5Ob25lPC9wPgo8aDM+U3VwcG9ydDwvaDM+CjxwPkFzIHBlciB0aGUgR1BMLCB0aGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGFzLWlzLiBQbGVhc2UgcmVhZCB0aGUgdGV4dCBvZiB0aGUgbGljZW5zZSBmb3IgdGhlIGZ1bGwgZGlzY2xhaW1lci48L3A+CjxoMz5Db3B5cmlnaHQgYW5kIExpY2Vuc2U8L2gzPgo8cD5Db3B5cmlnaHQgJmNvcHk7IDIwMTEgLSAnLmRhdGUoIlkiKS4nLCBEdWtldG93bi4gCjxwPk5vdyB0aGF0IHlvdSBhcmUgdXNpbmcgdGhpcyBmcmVlIG1vZHVsZSwgd2h5IG5vdCBtYWtlIGEgZG9uYXRpb24gdG8ganFwbG90ICh3aG8gcHJlcGFyZWQgdGhlIGpRdWVyeSBQbG90IHBhcnRzKSEgVGhhbmtzIGluIGFkdmFuY2UuCjxmb3JtIHRhcmdldD0iX2JsYW5rIiBhY3Rpb249Imh0dHBzOi8vd3d3LnBheXBhbC5jb20vY2dpLWJpbi93ZWJzY3IiIG1ldGhvZD0icG9zdCI+CjxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImNtZCIgdmFsdWU9Il9zLXhjbGljayI+CjxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9Imhvc3RlZF9idXR0b25faWQiIHZhbHVlPSI5MTIzMTg0Ij4KPGlucHV0IHR5cGU9ImltYWdlIiBzcmM9Imh0dHBzOi8vd3d3LnBheXBhbG9iamVjdHMuY29tL2VuX1VTL2kvYnRuL2J0bl9kb25hdGVfU00uZ2lmIiBib3JkZXI9IjAiIG5hbWU9InN1Ym1pdCIgYWx0PSJQYXlQYWwgLSBUaGUgc2FmZXIsIGVhc2llciB3YXkgdG8gcGF5IG9ubGluZSEiPgo8aW1nIGFsdD0iIiBib3JkZXI9IjAiIHNyYz0iaHR0cHM6Ly93d3cucGF5cGFsb2JqZWN0cy5jb20vZW5fVVMvaS9zY3IvcGl4ZWwuZ2lmIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIj4KPC9mb3JtPgo8L3A+CkFsbCBSaWdodHMgQXJlIFJlc2VydmVkLjwvcD4KPHA+VGhpcyBtb2R1bGUgaGFzIGJlZW4gcmVsZWFzZWQgdW5kZXIgdGhlIDxhIGhyZWY9Imh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTCI+R05VIFB1YmxpYyBMaWNlbnNlPC9hPi4gWW91IG11c3QgYWdyZWUgdG8gdGhpcyBsaWNlbnNlIGJlZm9yZSB1c2luZyB0aGUgbW9kdWxlLjwvcD4nOwo/Pg==]]></data>
	</file>
	<file>
	  <filename>/lib/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/method.install.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKIyBKUXVlcnlQbG90LiBBIG1vZHVsZSBmb3IgQ01TIC0gQ01TIE1hZGUgU2ltcGxlCiMgQSBtb2R1bGUgdG8gcHJlcGFyZSBncmFwaHMgYmFzZWQgdXBvbiBKUXVlcnlQbG90CiMgQ29weXJpZ2h0IChjKSAyMDExIGJ5IER1a2V0b3duCiMKIyBUaGlzIGZ1bmN0aW9uIHdpbGwgY3JlYXRlIHRhYmxlcyBhbmQgZ2VuZXJhdGUgcmVjb3JkcyBuZWVkZWQgZm9yIHRoZSBtb2R1bGUgSlF1ZXJ5UGxvdAojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgQ01TIC0gQ01TIE1hZGUgU2ltcGxlIGlzIChjKSAyMDA1IGJ5IFRlZCBLdWxwICh3aXNoeUBjbXNtYWRlc2ltcGxlLm9yZykKIyBUaGlzIHByb2plY3QncyBob21lcGFnZSBpczogaHR0cDovL3d3dy5jbXNtYWRlc2ltcGxlLm9yZwojIFRoZSBtb2R1bGUncyBob21lcGFnZSBpczogaHR0cDovL2Rldi5jbXNtYWRlc2ltcGxlLm9yZy9wcm9qZWN0cy9KUXVlcnlQbG90CiMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIwojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgojIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMKIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQojIE9yIHJlYWQgaXQgb25saW5lOiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvbGljZW5zZXMuaHRtbCNHUEwKIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKJGdDbXMgPSBjbXNtcygpOyBpZiggIWlzX29iamVjdCgkZ0NtcykgKSBleGl0OwoKLyoKLy8gSW5pdGlhbGl6ZSB0aGUgRGF0YWJhc2UKJGRiID0gY21zbXMoKS0+R2V0RGIoKTsKCi8vIE15U1FMLXNwZWNpZmljLCBidXQgaWdub3JlZCBieSBvdGhlciBkYXRhYmFzZQokdGFib3B0YXJyYXkgPSBhcnJheSgnbXlzcWwnID0+ICdUWVBFPU15SVNBTScpOwokZGljdCA9IE5ld0RhdGFEaWN0aW9uYXJ5KCRkYik7CgovLyBUYWJsZSBzY2hlbWEgZGVzY3JpcHRpb24KJGZsZHMgPSAiCglpZCBJIEtFWSwKCWRlc2NyaXB0aW9uIEMoODApCgkiOwoKLy8gQ3JlYXRlIGl0LiAKJHNxbGFycmF5ID0gJGRpY3QtPkNyZWF0ZVRhYmxlU1FMKGNtc19kYl9wcmVmaXgoKS4nbW9kdWxlX0pRdWVyeVBsb3QnLAoJCSRmbGRzLCAkdGFib3B0YXJyYXkpOwokZGljdC0+RXhlY3V0ZVNRTEFycmF5KCRzcWxhcnJheSk7CgovLyBDcmVhdGUgYSBzZXF1ZW5jZQokZGItPkNyZWF0ZVNlcXVlbmNlKGNtc19kYl9wcmVmaXgoKS4nbW9kdWxlX0pRdWVyeVBsb3Rfc2VxJyk7CiovCgovLyBQZXJtaXNzaW9ucwoKLyoqCiAqIENyZWF0ZSBhbiBleGFtcGxlIHN0eWxlc2hlZXQgZm9yIEpRdWVyeUdyYXBocyB0YWdzCiAqLwokY3NzX25hbWUgPSAkdGhpcy0+TGFuZygnbW9kdWxlX2V4YW1wbGVfc3R5bGVzaGVldCcpOyAvLyBSZXRyaWV2ZSB0aGUgbmFtZSBvZiB0aGUgbmV3IHN0eWxlc2hlZXQgbG9jYXRlIGluIHRoZSBjc3MgZGlyZWN0b3J5Ci8vIENoZWNrIGlmIHRoaXMgbW9kZWwgc3R5bGUgc2hlZXQgYWxscmVhZHkgZXhpc3RzCiRxdWVyeSA9ICdTRUxFQ1QgKiBGUk9NICcuIGNtc19kYl9wcmVmaXgoKSAuJ2NzcyBXSEVSRSBjc3NfbmFtZSA9ID8nOwokZGJyZXN1bHQgPSAkZGItPkV4ZWN1dGUoJHF1ZXJ5LCBhcnJheSgkY3NzX25hbWUpKTsKaWYoICEkZGJyZXN1bHQgfHwgJGRicmVzdWx0LT5SZWNvcmRDb3VudCgpID09IDAgKSB7CgkkbmV3X2Nzc19pZCA9ICRkYi0+R2VuSUQoY21zX2RiX3ByZWZpeCgpIC4gImNzc19zZXEiKTsKCSRmbiA9IGNtc19qb2luX3BhdGgoZGlybmFtZShfX0ZJTEVfXyksICdzcmMnLCAnanF1ZXJ5LmpxcGxvdC5jc3MnKTsKCSRjc3NfdGV4dCA9IEBmaWxlX2dldF9jb250ZW50cygkZm4pOwoJJG1lZGlhX3R5cGUgPSAnc2NyZWVuJzsKCS8vIEFkZCB0aGUgc3R5bGVzaGVldCB0byB0aGUgZGF0YWJhc2UKCSRxdWVyeSA9ICJJTlNFUlQgSU5UTyAiIC4gY21zX2RiX3ByZWZpeCgpIC4gImNzcyAoY3NzX2lkLCBjc3NfbmFtZSwgY3NzX3RleHQsIG1lZGlhX3R5cGUsIGNyZWF0ZV9kYXRlLCBtb2RpZmllZF9kYXRlKSBWQUxVRVMgKD8sID8sID8sID8sID8sID8pIjsKCSRyZXN1bHQgPSAkZGItPkV4ZWN1dGUoJHF1ZXJ5LCBhcnJheSgkbmV3X2Nzc19pZCwgJGNzc19uYW1lLCAkY3NzX3RleHQsICRtZWRpYV90eXBlLCAkZGItPkRCVGltZVN0YW1wKHRpbWUoKSksICRkYi0+REJUaW1lU3RhbXAodGltZSgpKSkpOwp9CgovLyBQcmVmZXJlbmNlcwokdGhpcy0+U2V0UHJlZmVyZW5jZSgnanFwZGVmYXVsdHN0eWxlc2hlZXQnLCAkbmV3X2Nzc19pZCk7CgovLyBXcml0ZSBhdWRpdCB0cmFpbCB0byB0aGUgYWRtaW4gbG9nCiR0aGlzLT5BdWRpdCggMCwgJHRoaXMtPkxhbmcoJ2ZyaWVuZGx5bmFtZScpLCAkdGhpcy0+TGFuZygnaW5zdGFsbGVkJywkdGhpcy0+R2V0VmVyc2lvbigpKSk7CgkJCj8+]]></data>
	</file>
	<file>
	  <filename>/method.uninstall.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKIyBKUXVlcnlQbG90LiBBIG1vZHVsZSBmb3IgQ01TIC0gQ01TIE1hZGUgU2ltcGxlCiMgQSBtb2R1bGUgdG8gcHJlcGFyZSBncmFwaHMgYmFzZWQgdXBvbiBKUXVlcnlQbG90CiMgQ29weXJpZ2h0IChjKSAyMDExIGJ5IER1a2V0b3duCiMKIyBUaGlzIGZ1bmN0aW9uIHdpbGwgcmVtb3ZlIGFsbCBtb2R1bGUgSlF1ZXJ5UGxvdCByZWxhdGVkIG1hdGVyaWFsCiMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBDTVMgLSBDTVMgTWFkZSBTaW1wbGUgaXMgKGMpIDIwMDUgYnkgVGVkIEt1bHAgKHdpc2h5QGNtc21hZGVzaW1wbGUub3JnKQojIFRoaXMgcHJvamVjdCdzIGhvbWVwYWdlIGlzOiBodHRwOi8vd3d3LmNtc21hZGVzaW1wbGUub3JnCiMgVGhlIG1vZHVsZSdzIGhvbWVwYWdlIGlzOiBodHRwOi8vZGV2LmNtc21hZGVzaW1wbGUub3JnL3Byb2plY3RzL0pRdWVyeVBsb3QKIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQojIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQojIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCiMgT3IgcmVhZCBpdCBvbmxpbmU6IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTAojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgokZ0NtcyA9IGNtc21zKCk7IGlmKCAhaXNfb2JqZWN0KCRnQ21zKSApIGV4aXQ7CgovKgovLyBJbml0aWFsaXplIHRoZSBEYXRhYmFzZQokZGIgPSBjbXNtcygpLT5HZXREYigpOwoKLy8gUmVtb3ZlIHRoZSBkYXRhYmFzZSB0YWJsZQokZGljdCA9IE5ld0RhdGFEaWN0aW9uYXJ5KCAkZGIgKTsKJHNxbGFycmF5ID0gJGRpY3QtPkRyb3BUYWJsZVNRTCggY21zX2RiX3ByZWZpeCgpLidtb2R1bGVfSlF1ZXJ5UGxvdCcgKTsKJGRpY3QtPkV4ZWN1dGVTUUxBcnJheSgkc3FsYXJyYXkpOwoKLy8gUmVtb3ZlIHRoZSBzZXF1ZW5jZQokZGItPkRyb3BTZXF1ZW5jZSggY21zX2RiX3ByZWZpeCgpLidtb2R1bGVfSlF1ZXJ5UGxvdF9zZXEnICk7CiovCgovLyBSZW1vdmUgdGhlIHBlcm1pc3Npb25zCgovLyBSZW1vdmUgYWxsIHRoZSBwcmVmZXJlbmNlcyB0aGF0IGFyZSBjb25uZWN0ZWQgdG8gdGhpcyBtb2R1bGUKJHRoaXMtPlJlbW92ZVByZWZlcmVuY2UoKTsKCi8vIFByZXBhcmUgYW4gYXVkaXQgdHJhaWwgaW4gdGhlIGFkbWluIGxvZwokdGhpcy0+QXVkaXQoIDAsICR0aGlzLT5MYW5nKCdmcmllbmRseW5hbWUnKSwgJHRoaXMtPkxhbmcoJ3VuaW5zdGFsbGVkJykpOwoKPz4=]]></data>
	</file>
	<file>
	  <filename>/method.upgrade.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKIyBKUXVlcnlQbG90LiBBIG1vZHVsZSBmb3IgQ01TIC0gQ01TIE1hZGUgU2ltcGxlCiMgQSBtb2R1bGUgdG8gcHJlcGFyZSBncmFwaHMgYmFzZWQgdXBvbiBKUXVlcnlQbG90CiMgQ29weXJpZ2h0IChjKSAyMDExIGJ5IER1a2V0b3duCiMKIyBUaGlzIGZ1bmN0aW9uIHN1cHBvcnRzIHVwZ3JhZGluZyBtb2R1bGUgSlF1ZXJ5UGxvdCB0byB0aGUgbmV4dCB2ZXJzaW9uCiMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBDTVMgLSBDTVMgTWFkZSBTaW1wbGUgaXMgKGMpIDIwMDUgYnkgVGVkIEt1bHAgKHdpc2h5QGNtc21hZGVzaW1wbGUub3JnKQojIFRoaXMgcHJvamVjdCdzIGhvbWVwYWdlIGlzOiBodHRwOi8vd3d3LmNtc21hZGVzaW1wbGUub3JnCiMgVGhlIG1vZHVsZSdzIGhvbWVwYWdlIGlzOiBodHRwOi8vZGV2LmNtc21hZGVzaW1wbGUub3JnL3Byb2plY3RzL0pRdWVyeVBsb3QKIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQojIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQojIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCiMgT3IgcmVhZCBpdCBvbmxpbmU6IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTAojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgokZ0NtcyA9IGNtc21zKCk7IGlmKCAhaXNfb2JqZWN0KCRnQ21zKSApIGV4aXQ7CgokY3VycmVudF92ZXJzaW9uID0gJG9sZHZlcnNpb247CnN3aXRjaCgkY3VycmVudF92ZXJzaW9uKQp7CgljYXNlICcwLjYnOgogIAkJJGN1cnJlbnRfdmVyc2lvbiA9ICcwLjcnOwoJY2FzZSAnMC43JzoKICAJCSRjdXJyZW50X3ZlcnNpb24gPSAnMC44JzsKICAJCWJyZWFrOwp9CgovLyBHZW5lcmF0ZSBhbiBhdWRpdCB0cmFpbCBpbiB0aGUgYWRtaW4gbG9nCiR0aGlzLT5BdWRpdCggMCwgJHRoaXMtPkxhbmcoJ2ZyaWVuZGx5bmFtZScpLCAkdGhpcy0+TGFuZygndXBncmFkZWQnLCR0aGlzLT5HZXRWZXJzaW9uKCkpKTsKCj8+]]></data>
	</file>
	<file>
	  <filename>/src/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/src/copyright.txt</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqCiAqIGpxUGxvdAogKiBQdXJlIEphdmFTY3JpcHQgcGxvdHRpbmcgcGx1Z2luIHVzaW5nIGpRdWVyeQogKgogKiBWZXJzaW9uOiBAVkVSU0lPTgogKgogKiBDb3B5cmlnaHQgKGMpIDIwMDktMjAxMSBDaHJpcyBMZW9uZWxsbwogKiBqcVBsb3QgaXMgY3VycmVudGx5IGF2YWlsYWJsZSBmb3IgdXNlIGluIGFsbCBwZXJzb25hbCBvciBjb21tZXJjaWFsIHByb2plY3RzIAogKiB1bmRlciBib3RoIHRoZSBNSVQgKGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbWl0LWxpY2Vuc2UucGhwKSBhbmQgR1BMIAogKiB2ZXJzaW9uIDIuMCAoaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAuaHRtbCkgbGljZW5zZXMuIFRoaXMgbWVhbnMgdGhhdCB5b3UgY2FuIAogKiBjaG9vc2UgdGhlIGxpY2Vuc2UgdGhhdCBiZXN0IHN1aXRzIHlvdXIgcHJvamVjdCBhbmQgdXNlIGl0IGFjY29yZGluZ2x5LiAKICoKICogQWx0aG91Z2ggbm90IHJlcXVpcmVkLCB0aGUgYXV0aG9yIHdvdWxkIGFwcHJlY2lhdGUgYW4gZW1haWwgbGV0dGluZyBoaW0gCiAqIGtub3cgb2YgYW55IHN1YnN0YW50aWFsIHVzZSBvZiBqcVBsb3QuICBZb3UgY2FuIHJlYWNoIHRoZSBhdXRob3IgYXQ6IAogKiBjaHJpcyBhdCBqcXBsb3QgZG90IGNvbSBvciBzZWUgaHR0cDovL3d3dy5qcXBsb3QuY29tL2luZm8ucGhwIC4KICoKICogSWYgeW91IGFyZSBmZWVsaW5nIGtpbmQgYW5kIGdlbmVyb3VzLCBjb25zaWRlciBzdXBwb3J0aW5nIHRoZSBwcm9qZWN0IGJ5CiAqIG1ha2luZyBhIGRvbmF0aW9uIGF0OiBodHRwOi8vd3d3LmpxcGxvdC5jb20vZG9uYXRlLnBocCAuCiAqCiAqIHNwcmludGYgZnVuY3Rpb25zIGNvbnRhaW5lZCBpbiBqcXBsb3Quc3ByaW50Zi5qcyBieSBBc2ggU2VhcmxlOgogKgogKiAgICAgdmVyc2lvbiAyMDA3LjA0LjI3CiAqICAgICBhdXRob3IgQXNoIFNlYXJsZQogKiAgICAgaHR0cDovL2hleG1lbi5jb20vYmxvZy8yMDA3LzAzL3ByaW50Zi1zcHJpbnRmLwogKiAgICAgaHR0cDovL2hleG1lbi5jb20vanMvc3ByaW50Zi5qcwogKiAgICAgVGhlIGF1dGhvciAoQXNoIFNlYXJsZSkgaGFzIHBsYWNlZCB0aGlzIGNvZGUgaW4gdGhlIHB1YmxpYyBkb21haW46CiAqICAgICAiVGhpcyBjb2RlIGlzIHVucmVzdHJpY3RlZDogeW91IGFyZSBmcmVlIHRvIHVzZSBpdCBob3dldmVyIHlvdSBsaWtlLiIKICoKICogaW5jbHVkZWQganNEYXRlIGxpYnJhcnkgYnkgQ2hyaXMgTGVvbmVsbG86CiAqCiAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExIENocmlzIExlb25lbGxvCiAqCiAqIGpzRGF0ZSBpcyBjdXJyZW50bHkgYXZhaWxhYmxlIGZvciB1c2UgaW4gYWxsIHBlcnNvbmFsIG9yIGNvbW1lcmNpYWwgcHJvamVjdHMgCiAqIHVuZGVyIGJvdGggdGhlIE1JVCBhbmQgR1BMIHZlcnNpb24gMi4wIGxpY2Vuc2VzLiBUaGlzIG1lYW5zIHRoYXQgeW91IGNhbiAKICogY2hvb3NlIHRoZSBsaWNlbnNlIHRoYXQgYmVzdCBzdWl0cyB5b3VyIHByb2plY3QgYW5kIHVzZSBpdCBhY2NvcmRpbmdseS4KICoKICoganNEYXRlIGJvcnJvd3MgbWFueSBjb25jZXB0cyBhbmQgaWRlYXMgZnJvbSB0aGUgRGF0ZSBJbnN0YW5jZSAKICogTWV0aG9kcyBieSBLZW4gU255ZGVyIGFsb25nIHdpdGggc29tZSBwYXJ0cyBvZiBLZW4ncyBhY3R1YWwgY29kZS4KICogCiAqIEtlbidzIG9yaWdpYW5sIERhdGUgSW5zdGFuY2UgTWV0aG9kcyBhbmQgY29weXJpZ2h0IG5vdGljZToKICogCiAqIEtlbiBTbnlkZXIgKGtlbiBkIHNueWRlciBhdCBnbWFpbCBkb3QgY29tKQogKiAyMDA4LTA5LTEwCiAqIHZlcnNpb24gMi4wLjIgKGh0dHA6Ly9rZW5kc255ZGVyLmNvbS9zYW5kYm94L2RhdGUvKSAgICAgCiAqIENyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24gTGljZW5zZSAzLjAgKGh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LzMuMC8pCiAqCiAqIGpxcGxvdFRvSW1hZ2UgZnVuY3Rpb24gYmFzZWQgb24gTGFycnkgU2lkZW4ncyBleHBvcnQtanFwbG90LXRvLXBuZy5qcy4KICogTGFycnkgaGFzIGdlbmVyb3VzbHkgZ2l2ZW4gcGVybWlzc2lvbiB0byBhZGFwdCBoaXMgY29kZSBmb3IgaW5jbHVzaW9uCiAqIGludG8ganFQbG90LgogKgogKiBMYXJyeSdzIG9yaWdpbmFsIGNvZGUgY2FuIGJlIGZvdW5kIGhlcmU6CiAqCiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9sc2lkZW4vZXhwb3J0LWpxcGxvdC10by1wbmcKICogCiAqIAogKi8K]]></data>
	</file>
	<file>
	  <filename>/src/excanvas.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gTWVtb3J5IExlYWtzIHBhdGNoIGZyb20gaHR0cDovL2V4cGxvcmVyY2FudmFzLmdvb2dsZWNvZGUuY29tL3N2bi90cnVuay8gCi8vICBzdm4gOiByNzMKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIENvcHlyaWdodCAyMDA2IEdvb2dsZSBJbmMuCi8vCi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwovLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAovLwovLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAovLwovLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgovLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgoKCi8vIEtub3duIElzc3VlczoKLy8KLy8gKiBQYXR0ZXJucyBvbmx5IHN1cHBvcnQgcmVwZWF0LgovLyAqIFJhZGlhbCBncmFkaWVudCBhcmUgbm90IGltcGxlbWVudGVkLiBUaGUgVk1MIHZlcnNpb24gb2YgdGhlc2UgbG9vayB2ZXJ5Ci8vICAgZGlmZmVyZW50IGZyb20gdGhlIGNhbnZhcyBvbmUuCi8vICogQ2xpcHBpbmcgcGF0aHMgYXJlIG5vdCBpbXBsZW1lbnRlZC4KLy8gKiBDb29yZHNpemUuIFRoZSB3aWR0aCBhbmQgaGVpZ2h0IGF0dHJpYnV0ZSBoYXZlIGhpZ2hlciBwcmlvcml0eSB0aGFuIHRoZQovLyAgIHdpZHRoIGFuZCBoZWlnaHQgc3R5bGUgdmFsdWVzIHdoaWNoIGlzbid0IGNvcnJlY3QuCi8vICogUGFpbnRpbmcgbW9kZSBpc24ndCBpbXBsZW1lbnRlZC4KLy8gKiBDYW52YXMgd2lkdGgvaGVpZ2h0IHNob3VsZCBpcyB1c2luZyBjb250ZW50LWJveCBieSBkZWZhdWx0LiBJRSBpbgovLyAgIFF1aXJrcyBtb2RlIHdpbGwgZHJhdyB0aGUgY2FudmFzIHVzaW5nIGJvcmRlci1ib3guIEVpdGhlciBjaGFuZ2UgeW91cgovLyAgIGRvY3R5cGUgdG8gSFRNTDUKLy8gICAoaHR0cDovL3d3dy53aGF0d2cub3JnL3NwZWNzL3dlYi1hcHBzL2N1cnJlbnQtd29yay8jdGhlLWRvY3R5cGUpCi8vICAgb3IgdXNlIEJveCBTaXppbmcgQmVoYXZpb3IgZnJvbSBXZWJGWAovLyAgIChodHRwOi8vd2ViZnguZWFlLm5ldC9kaHRtbC9ib3hzaXppbmcvYm94c2l6aW5nLmh0bWwpCi8vICogTm9uIHVuaWZvcm0gc2NhbGluZyBkb2VzIG5vdCBjb3JyZWN0bHkgc2NhbGUgc3Ryb2tlcy4KLy8gKiBPcHRpbWl6ZS4gVGhlcmUgaXMgYWx3YXlzIHJvb20gZm9yIHNwZWVkIGltcHJvdmVtZW50cy4KCi8vIE9ubHkgYWRkIHRoaXMgY29kZSBpZiB3ZSBkbyBub3QgYWxyZWFkeSBoYXZlIGEgY2FudmFzIGltcGxlbWVudGF0aW9uCmlmICghZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJykuZ2V0Q29udGV4dCkgewoKKGZ1bmN0aW9uKCkgewoKICAvLyBhbGlhcyBzb21lIGZ1bmN0aW9ucyB0byBtYWtlIChjb21waWxlZCkgY29kZSBzaG9ydGVyCiAgdmFyIG0gPSBNYXRoOwogIHZhciBtciA9IG0ucm91bmQ7CiAgdmFyIG1zID0gbS5zaW47CiAgdmFyIG1jID0gbS5jb3M7CiAgdmFyIGFicyA9IG0uYWJzOwogIHZhciBzcXJ0ID0gbS5zcXJ0OwoKICAvLyB0aGlzIGlzIHVzZWQgZm9yIHN1YiBwaXhlbCBwcmVjaXNpb24KICB2YXIgWiA9IDEwOwogIHZhciBaMiA9IFogLyAyOwoKICB2YXIgSUVfVkVSU0lPTiA9ICtuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9NU0lFIChbXGQuXSspPy8pWzFdOwoKICAvKioKICAgKiBUaGlzIGZ1bnRpb24gaXMgYXNzaWduZWQgdG8gdGhlIDxjYW52YXM+IGVsZW1lbnRzIGFzIGVsZW1lbnQuZ2V0Q29udGV4dCgpLgogICAqIEB0aGlzIHtIVE1MRWxlbWVudH0KICAgKiBAcmV0dXJuIHtDYW52YXNSZW5kZXJpbmdDb250ZXh0MkRffQogICAqLwogIGZ1bmN0aW9uIGdldENvbnRleHQoKSB7CiAgICByZXR1cm4gdGhpcy5jb250ZXh0XyB8fAogICAgICAgICh0aGlzLmNvbnRleHRfID0gbmV3IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRF8odGhpcykpOwogIH0KCiAgdmFyIHNsaWNlID0gQXJyYXkucHJvdG90eXBlLnNsaWNlOwoKICAvKioKICAgKiBCaW5kcyBhIGZ1bmN0aW9uIHRvIGFuIG9iamVjdC4gVGhlIHJldHVybmVkIGZ1bmN0aW9uIHdpbGwgYWx3YXlzIHVzZSB0aGUKICAgKiBwYXNzZWQgaW4ge0Bjb2RlIG9ian0gYXMge0Bjb2RlIHRoaXN9LgogICAqCiAgICogRXhhbXBsZToKICAgKgogICAqICAgZyA9IGJpbmQoZiwgb2JqLCBhLCBiKQogICAqICAgZyhjLCBkKSAvLyB3aWxsIGRvIGYuY2FsbChvYmosIGEsIGIsIGMsIGQpCiAgICoKICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmIFRoZSBmdW5jdGlvbiB0byBiaW5kIHRoZSBvYmplY3QgdG8KICAgKiBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmplY3QgdGhhdCBzaG91bGQgYWN0IGFzIHRoaXMgd2hlbiB0aGUgZnVuY3Rpb24KICAgKiAgICAgaXMgY2FsbGVkCiAgICogQHBhcmFtIHsqfSB2YXJfYXJncyBSZXN0IGFyZ3VtZW50cyB0aGF0IHdpbGwgYmUgdXNlZCBhcyB0aGUgaW5pdGlhbAogICAqICAgICBhcmd1bWVudHMgd2hlbiB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkCiAgICogQHJldHVybiB7RnVuY3Rpb259IEEgbmV3IGZ1bmN0aW9uIHRoYXQgaGFzIGJvdW5kIHRoaXMKICAgKi8KICBmdW5jdGlvbiBiaW5kKGYsIG9iaiwgdmFyX2FyZ3MpIHsKICAgIHZhciBhID0gc2xpY2UuY2FsbChhcmd1bWVudHMsIDIpOwogICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gZi5hcHBseShvYmosIGEuY29uY2F0KHNsaWNlLmNhbGwoYXJndW1lbnRzKSkpOwogICAgfTsKICB9CgogIGZ1bmN0aW9uIGVuY29kZUh0bWxBdHRyaWJ1dGUocykgewogICAgcmV0dXJuIFN0cmluZyhzKS5yZXBsYWNlKC8mL2csICcmYW1wOycpLnJlcGxhY2UoLyIvZywgJyZxdW90OycpOwogIH0KCiAgZnVuY3Rpb24gYWRkTmFtZXNwYWNlKGRvYywgcHJlZml4LCB1cm4pIHsKICAgIGlmICghZG9jLm5hbWVzcGFjZXNbcHJlZml4XSkgewogICAgICBkb2MubmFtZXNwYWNlcy5hZGQocHJlZml4LCB1cm4sICcjZGVmYXVsdCNWTUwnKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGFkZE5hbWVzcGFjZXNBbmRTdHlsZXNoZWV0KGRvYykgewogICAgYWRkTmFtZXNwYWNlKGRvYywgJ2dfdm1sXycsICd1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOnZtbCcpOwogICAgYWRkTmFtZXNwYWNlKGRvYywgJ2dfb18nLCAndXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlJyk7CgogICAgLy8gU2V0dXAgZGVmYXVsdCBDU1MuICBPbmx5IGFkZCBvbmUgc3R5bGUgc2hlZXQgcGVyIGRvY3VtZW50CiAgICBpZiAoIWRvYy5zdHlsZVNoZWV0c1snZXhfY2FudmFzXyddKSB7CiAgICAgIHZhciBzcyA9IGRvYy5jcmVhdGVTdHlsZVNoZWV0KCk7CiAgICAgIHNzLm93bmluZ0VsZW1lbnQuaWQgPSAnZXhfY2FudmFzXyc7CiAgICAgIHNzLmNzc1RleHQgPSAnY2FudmFze2Rpc3BsYXk6aW5saW5lLWJsb2NrO292ZXJmbG93OmhpZGRlbjsnICsKICAgICAgICAgIC8vIGRlZmF1bHQgc2l6ZSBpcyAzMDB4MTUwIGluIEdlY2tvIGFuZCBPcGVyYQogICAgICAgICAgJ3RleHQtYWxpZ246bGVmdDt3aWR0aDozMDBweDtoZWlnaHQ6MTUwcHh9JzsKICAgIH0KICB9CgogIC8vIEFkZCBuYW1lc3BhY2VzIGFuZCBzdHlsZXNoZWV0IGF0IHN0YXJ0dXAuCiAgYWRkTmFtZXNwYWNlc0FuZFN0eWxlc2hlZXQoZG9jdW1lbnQpOwoKICB2YXIgR192bWxDYW52YXNNYW5hZ2VyXyA9IHsKICAgIGluaXQ6IGZ1bmN0aW9uKG9wdF9kb2MpIHsKICAgICAgdmFyIGRvYyA9IG9wdF9kb2MgfHwgZG9jdW1lbnQ7CiAgICAgIC8vIENyZWF0ZSBhIGR1bW15IGVsZW1lbnQgc28gdGhhdCBJRSB3aWxsIGFsbG93IGNhbnZhcyBlbGVtZW50cyB0byBiZQogICAgICAvLyByZWNvZ25pemVkLgogICAgICBkb2MuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7CiAgICAgIGRvYy5hdHRhY2hFdmVudCgnb25yZWFkeXN0YXRlY2hhbmdlJywgYmluZCh0aGlzLmluaXRfLCB0aGlzLCBkb2MpKTsKICAgIH0sCgogICAgaW5pdF86IGZ1bmN0aW9uKGRvYykgewogICAgICAvLyBmaW5kIGFsbCBjYW52YXMgZWxlbWVudHMKICAgICAgdmFyIGVscyA9IGRvYy5nZXRFbGVtZW50c0J5VGFnTmFtZSgnY2FudmFzJyk7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgdGhpcy5pbml0RWxlbWVudChlbHNbaV0pOwogICAgICB9CiAgICB9LAoKICAgIC8qKgogICAgICogUHVibGljIGluaXRpYWxpemVzIGEgY2FudmFzIGVsZW1lbnQgc28gdGhhdCBpdCBjYW4gYmUgdXNlZCBhcyBjYW52YXMKICAgICAqIGVsZW1lbnQgZnJvbSBub3cgb24uIFRoaXMgaXMgY2FsbGVkIGF1dG9tYXRpY2FsbHkgYmVmb3JlIHRoZSBwYWdlIGlzCiAgICAgKiBsb2FkZWQgYnV0IGlmIHlvdSBhcmUgY3JlYXRpbmcgZWxlbWVudHMgdXNpbmcgY3JlYXRlRWxlbWVudCB5b3UgbmVlZCB0bwogICAgICogbWFrZSBzdXJlIHRoaXMgaXMgY2FsbGVkIG9uIHRoZSBlbGVtZW50LgogICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWwgVGhlIGNhbnZhcyBlbGVtZW50IHRvIGluaXRpYWxpemUuCiAgICAgKiBAcmV0dXJuIHtIVE1MRWxlbWVudH0gdGhlIGVsZW1lbnQgdGhhdCB3YXMgY3JlYXRlZC4KICAgICAqLwogICAgaW5pdEVsZW1lbnQ6IGZ1bmN0aW9uKGVsKSB7CiAgICAgIGlmICghZWwuZ2V0Q29udGV4dCkgewogICAgICAgIGVsLmdldENvbnRleHQgPSBnZXRDb250ZXh0OwoKICAgICAgICAvLyBBZGQgbmFtZXNwYWNlcyBhbmQgc3R5bGVzaGVldCB0byBkb2N1bWVudCBvZiB0aGUgZWxlbWVudC4KICAgICAgICBhZGROYW1lc3BhY2VzQW5kU3R5bGVzaGVldChlbC5vd25lckRvY3VtZW50KTsKCiAgICAgICAgLy8gUmVtb3ZlIGZhbGxiYWNrIGNvbnRlbnQuIFRoZXJlIGlzIG5vIHdheSB0byBoaWRlIHRleHQgbm9kZXMgc28gd2UKICAgICAgICAvLyBqdXN0IHJlbW92ZSBhbGwgY2hpbGROb2Rlcy4gV2UgY291bGQgaGlkZSBhbGwgZWxlbWVudHMgYW5kIHJlbW92ZQogICAgICAgIC8vIHRleHQgbm9kZXMgYnV0IHdobyByZWFsbHkgY2FyZXMgYWJvdXQgdGhlIGZhbGxiYWNrIGNvbnRlbnQuCiAgICAgICAgZWwuaW5uZXJIVE1MID0gJyc7CgogICAgICAgIC8vIGRvIG5vdCB1c2UgaW5saW5lIGZ1bmN0aW9uIGJlY2F1c2UgdGhhdCB3aWxsIGxlYWsgbWVtb3J5CiAgICAgICAgZWwuYXR0YWNoRXZlbnQoJ29ucHJvcGVydHljaGFuZ2UnLCBvblByb3BlcnR5Q2hhbmdlKTsKICAgICAgICBlbC5hdHRhY2hFdmVudCgnb25yZXNpemUnLCBvblJlc2l6ZSk7CgogICAgICAgIHZhciBhdHRycyA9IGVsLmF0dHJpYnV0ZXM7CiAgICAgICAgaWYgKGF0dHJzLndpZHRoICYmIGF0dHJzLndpZHRoLnNwZWNpZmllZCkgewogICAgICAgICAgLy8gVE9ETzogdXNlIHJ1bnRpbWVTdHlsZSBhbmQgY29vcmRzaXplCiAgICAgICAgICAvLyBlbC5nZXRDb250ZXh0KCkuc2V0V2lkdGhfKGF0dHJzLndpZHRoLm5vZGVWYWx1ZSk7CiAgICAgICAgICBlbC5zdHlsZS53aWR0aCA9IGF0dHJzLndpZHRoLm5vZGVWYWx1ZSArICdweCc7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGVsLndpZHRoID0gZWwuY2xpZW50V2lkdGg7CiAgICAgICAgfQogICAgICAgIGlmIChhdHRycy5oZWlnaHQgJiYgYXR0cnMuaGVpZ2h0LnNwZWNpZmllZCkgewogICAgICAgICAgLy8gVE9ETzogdXNlIHJ1bnRpbWVTdHlsZSBhbmQgY29vcmRzaXplCiAgICAgICAgICAvLyBlbC5nZXRDb250ZXh0KCkuc2V0SGVpZ2h0XyhhdHRycy5oZWlnaHQubm9kZVZhbHVlKTsKICAgICAgICAgIGVsLnN0eWxlLmhlaWdodCA9IGF0dHJzLmhlaWdodC5ub2RlVmFsdWUgKyAncHgnOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBlbC5oZWlnaHQgPSBlbC5jbGllbnRIZWlnaHQ7CiAgICAgICAgfQogICAgICAgIC8vZWwuZ2V0Q29udGV4dCgpLnNldENvb3Jkc2l6ZV8oKQogICAgICB9CiAgICAgIHJldHVybiBlbDsKICAgIH0sCgogICAgLy8gTWVtb3J5IExlYWtzIHBhdGNoIDogc2VlIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9leHBsb3JlcmNhbnZhcy9pc3N1ZXMvZGV0YWlsP2lkPTgyCiAgICB1bmluaXRFbGVtZW50OiBmdW5jdGlvbihlbCl7CiAgICAgIGlmIChlbC5nZXRDb250ZXh0KSB7CiAgICAgICAgdmFyIGN0eCA9IGVsLmdldENvbnRleHQoKTsKICAgICAgICBkZWxldGUgY3R4LmVsZW1lbnRfOwogICAgICAgIGRlbGV0ZSBjdHguY2FudmFzOwogICAgICAgIGVsLmlubmVySFRNTCA9ICIiOwogICAgICAgIC8vZWwub3V0ZXJIVE1MID0gIiI7CiAgICAgICAgZWwuY29udGV4dF8gPSBudWxsOwogICAgICAgIGVsLmdldENvbnRleHQgPSBudWxsOwogICAgICAgIGVsLmRldGFjaEV2ZW50KCJvbnByb3BlcnR5Y2hhbmdlIiwgb25Qcm9wZXJ0eUNoYW5nZSk7CiAgICAgICAgZWwuZGV0YWNoRXZlbnQoIm9ucmVzaXplIiwgb25SZXNpemUpOwogICAgICB9CiAgICB9CiAgfTsKCiAgZnVuY3Rpb24gb25Qcm9wZXJ0eUNoYW5nZShlKSB7CiAgICB2YXIgZWwgPSBlLnNyY0VsZW1lbnQ7CgogICAgc3dpdGNoIChlLnByb3BlcnR5TmFtZSkgewogICAgICBjYXNlICd3aWR0aCc6CiAgICAgICAgZWwuZ2V0Q29udGV4dCgpLmNsZWFyUmVjdCgpOwogICAgICAgIGVsLnN0eWxlLndpZHRoID0gZWwuYXR0cmlidXRlcy53aWR0aC5ub2RlVmFsdWUgKyAncHgnOwogICAgICAgIC8vIEluIElFOCB0aGlzIGRvZXMgbm90IHRyaWdnZXIgb25yZXNpemUuCiAgICAgICAgZWwuZmlyc3RDaGlsZC5zdHlsZS53aWR0aCA9ICBlbC5jbGllbnRXaWR0aCArICdweCc7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgJ2hlaWdodCc6CiAgICAgICAgZWwuZ2V0Q29udGV4dCgpLmNsZWFyUmVjdCgpOwogICAgICAgIGVsLnN0eWxlLmhlaWdodCA9IGVsLmF0dHJpYnV0ZXMuaGVpZ2h0Lm5vZGVWYWx1ZSArICdweCc7CiAgICAgICAgZWwuZmlyc3RDaGlsZC5zdHlsZS5oZWlnaHQgPSBlbC5jbGllbnRIZWlnaHQgKyAncHgnOwogICAgICAgIGJyZWFrOwogICAgfQogIH0KCiAgZnVuY3Rpb24gb25SZXNpemUoZSkgewogICAgdmFyIGVsID0gZS5zcmNFbGVtZW50OwogICAgaWYgKGVsLmZpcnN0Q2hpbGQpIHsKICAgICAgZWwuZmlyc3RDaGlsZC5zdHlsZS53aWR0aCA9ICBlbC5jbGllbnRXaWR0aCArICdweCc7CiAgICAgIGVsLmZpcnN0Q2hpbGQuc3R5bGUuaGVpZ2h0ID0gZWwuY2xpZW50SGVpZ2h0ICsgJ3B4JzsKICAgIH0KICB9CgogIEdfdm1sQ2FudmFzTWFuYWdlcl8uaW5pdCgpOwoKICAvLyBwcmVjb21wdXRlICIwMCIgdG8gIkZGIgogIHZhciBkZWNUb0hleCA9IFtdOwogIGZvciAodmFyIGkgPSAwOyBpIDwgMTY7IGkrKykgewogICAgZm9yICh2YXIgaiA9IDA7IGogPCAxNjsgaisrKSB7CiAgICAgIGRlY1RvSGV4W2kgKiAxNiArIGpdID0gaS50b1N0cmluZygxNikgKyBqLnRvU3RyaW5nKDE2KTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGNyZWF0ZU1hdHJpeElkZW50aXR5KCkgewogICAgcmV0dXJuIFsKICAgICAgWzEsIDAsIDBdLAogICAgICBbMCwgMSwgMF0sCiAgICAgIFswLCAwLCAxXQogICAgXTsKICB9CgogIGZ1bmN0aW9uIG1hdHJpeE11bHRpcGx5KG0xLCBtMikgewogICAgdmFyIHJlc3VsdCA9IGNyZWF0ZU1hdHJpeElkZW50aXR5KCk7CgogICAgZm9yICh2YXIgeCA9IDA7IHggPCAzOyB4KyspIHsKICAgICAgZm9yICh2YXIgeSA9IDA7IHkgPCAzOyB5KyspIHsKICAgICAgICB2YXIgc3VtID0gMDsKCiAgICAgICAgZm9yICh2YXIgeiA9IDA7IHogPCAzOyB6KyspIHsKICAgICAgICAgIHN1bSArPSBtMVt4XVt6XSAqIG0yW3pdW3ldOwogICAgICAgIH0KCiAgICAgICAgcmVzdWx0W3hdW3ldID0gc3VtOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgZnVuY3Rpb24gY29weVN0YXRlKG8xLCBvMikgewogICAgbzIuZmlsbFN0eWxlICAgICA9IG8xLmZpbGxTdHlsZTsKICAgIG8yLmxpbmVDYXAgICAgICAgPSBvMS5saW5lQ2FwOwogICAgbzIubGluZUpvaW4gICAgICA9IG8xLmxpbmVKb2luOwogICAgbzIubGluZVdpZHRoICAgICA9IG8xLmxpbmVXaWR0aDsKICAgIG8yLm1pdGVyTGltaXQgICAgPSBvMS5taXRlckxpbWl0OwogICAgbzIuc2hhZG93Qmx1ciAgICA9IG8xLnNoYWRvd0JsdXI7CiAgICBvMi5zaGFkb3dDb2xvciAgID0gbzEuc2hhZG93Q29sb3I7CiAgICBvMi5zaGFkb3dPZmZzZXRYID0gbzEuc2hhZG93T2Zmc2V0WDsKICAgIG8yLnNoYWRvd09mZnNldFkgPSBvMS5zaGFkb3dPZmZzZXRZOwogICAgbzIuc3Ryb2tlU3R5bGUgICA9IG8xLnN0cm9rZVN0eWxlOwogICAgbzIuZ2xvYmFsQWxwaGEgICA9IG8xLmdsb2JhbEFscGhhOwogICAgbzIuZm9udCAgICAgICAgICA9IG8xLmZvbnQ7CiAgICBvMi50ZXh0QWxpZ24gICAgID0gbzEudGV4dEFsaWduOwogICAgbzIudGV4dEJhc2VsaW5lICA9IG8xLnRleHRCYXNlbGluZTsKICAgIG8yLmFyY1NjYWxlWF8gICAgPSBvMS5hcmNTY2FsZVhfOwogICAgbzIuYXJjU2NhbGVZXyAgICA9IG8xLmFyY1NjYWxlWV87CiAgICBvMi5saW5lU2NhbGVfICAgID0gbzEubGluZVNjYWxlXzsKICB9CgogIHZhciBjb2xvckRhdGEgPSB7CiAgICBhbGljZWJsdWU6ICcjRjBGOEZGJywKICAgIGFudGlxdWV3aGl0ZTogJyNGQUVCRDcnLAogICAgYXF1YW1hcmluZTogJyM3RkZGRDQnLAogICAgYXp1cmU6ICcjRjBGRkZGJywKICAgIGJlaWdlOiAnI0Y1RjVEQycsCiAgICBiaXNxdWU6ICcjRkZFNEM0JywKICAgIGJsYWNrOiAnIzAwMDAwMCcsCiAgICBibGFuY2hlZGFsbW9uZDogJyNGRkVCQ0QnLAogICAgYmx1ZXZpb2xldDogJyM4QTJCRTInLAogICAgYnJvd246ICcjQTUyQTJBJywKICAgIGJ1cmx5d29vZDogJyNERUI4ODcnLAogICAgY2FkZXRibHVlOiAnIzVGOUVBMCcsCiAgICBjaGFydHJldXNlOiAnIzdGRkYwMCcsCiAgICBjaG9jb2xhdGU6ICcjRDI2OTFFJywKICAgIGNvcmFsOiAnI0ZGN0Y1MCcsCiAgICBjb3JuZmxvd2VyYmx1ZTogJyM2NDk1RUQnLAogICAgY29ybnNpbGs6ICcjRkZGOERDJywKICAgIGNyaW1zb246ICcjREMxNDNDJywKICAgIGN5YW46ICcjMDBGRkZGJywKICAgIGRhcmtibHVlOiAnIzAwMDA4QicsCiAgICBkYXJrY3lhbjogJyMwMDhCOEInLAogICAgZGFya2dvbGRlbnJvZDogJyNCODg2MEInLAogICAgZGFya2dyYXk6ICcjQTlBOUE5JywKICAgIGRhcmtncmVlbjogJyMwMDY0MDAnLAogICAgZGFya2dyZXk6ICcjQTlBOUE5JywKICAgIGRhcmtraGFraTogJyNCREI3NkInLAogICAgZGFya21hZ2VudGE6ICcjOEIwMDhCJywKICAgIGRhcmtvbGl2ZWdyZWVuOiAnIzU1NkIyRicsCiAgICBkYXJrb3JhbmdlOiAnI0ZGOEMwMCcsCiAgICBkYXJrb3JjaGlkOiAnIzk5MzJDQycsCiAgICBkYXJrcmVkOiAnIzhCMDAwMCcsCiAgICBkYXJrc2FsbW9uOiAnI0U5OTY3QScsCiAgICBkYXJrc2VhZ3JlZW46ICcjOEZCQzhGJywKICAgIGRhcmtzbGF0ZWJsdWU6ICcjNDgzRDhCJywKICAgIGRhcmtzbGF0ZWdyYXk6ICcjMkY0RjRGJywKICAgIGRhcmtzbGF0ZWdyZXk6ICcjMkY0RjRGJywKICAgIGRhcmt0dXJxdW9pc2U6ICcjMDBDRUQxJywKICAgIGRhcmt2aW9sZXQ6ICcjOTQwMEQzJywKICAgIGRlZXBwaW5rOiAnI0ZGMTQ5MycsCiAgICBkZWVwc2t5Ymx1ZTogJyMwMEJGRkYnLAogICAgZGltZ3JheTogJyM2OTY5NjknLAogICAgZGltZ3JleTogJyM2OTY5NjknLAogICAgZG9kZ2VyYmx1ZTogJyMxRTkwRkYnLAogICAgZmlyZWJyaWNrOiAnI0IyMjIyMicsCiAgICBmbG9yYWx3aGl0ZTogJyNGRkZBRjAnLAogICAgZm9yZXN0Z3JlZW46ICcjMjI4QjIyJywKICAgIGdhaW5zYm9ybzogJyNEQ0RDREMnLAogICAgZ2hvc3R3aGl0ZTogJyNGOEY4RkYnLAogICAgZ29sZDogJyNGRkQ3MDAnLAogICAgZ29sZGVucm9kOiAnI0RBQTUyMCcsCiAgICBncmV5OiAnIzgwODA4MCcsCiAgICBncmVlbnllbGxvdzogJyNBREZGMkYnLAogICAgaG9uZXlkZXc6ICcjRjBGRkYwJywKICAgIGhvdHBpbms6ICcjRkY2OUI0JywKICAgIGluZGlhbnJlZDogJyNDRDVDNUMnLAogICAgaW5kaWdvOiAnIzRCMDA4MicsCiAgICBpdm9yeTogJyNGRkZGRjAnLAogICAga2hha2k6ICcjRjBFNjhDJywKICAgIGxhdmVuZGVyOiAnI0U2RTZGQScsCiAgICBsYXZlbmRlcmJsdXNoOiAnI0ZGRjBGNScsCiAgICBsYXduZ3JlZW46ICcjN0NGQzAwJywKICAgIGxlbW9uY2hpZmZvbjogJyNGRkZBQ0QnLAogICAgbGlnaHRibHVlOiAnI0FERDhFNicsCiAgICBsaWdodGNvcmFsOiAnI0YwODA4MCcsCiAgICBsaWdodGN5YW46ICcjRTBGRkZGJywKICAgIGxpZ2h0Z29sZGVucm9keWVsbG93OiAnI0ZBRkFEMicsCiAgICBsaWdodGdyZWVuOiAnIzkwRUU5MCcsCiAgICBsaWdodGdyZXk6ICcjRDNEM0QzJywKICAgIGxpZ2h0cGluazogJyNGRkI2QzEnLAogICAgbGlnaHRzYWxtb246ICcjRkZBMDdBJywKICAgIGxpZ2h0c2VhZ3JlZW46ICcjMjBCMkFBJywKICAgIGxpZ2h0c2t5Ymx1ZTogJyM4N0NFRkEnLAogICAgbGlnaHRzbGF0ZWdyYXk6ICcjNzc4ODk5JywKICAgIGxpZ2h0c2xhdGVncmV5OiAnIzc3ODg5OScsCiAgICBsaWdodHN0ZWVsYmx1ZTogJyNCMEM0REUnLAogICAgbGlnaHR5ZWxsb3c6ICcjRkZGRkUwJywKICAgIGxpbWVncmVlbjogJyMzMkNEMzInLAogICAgbGluZW46ICcjRkFGMEU2JywKICAgIG1hZ2VudGE6ICcjRkYwMEZGJywKICAgIG1lZGl1bWFxdWFtYXJpbmU6ICcjNjZDREFBJywKICAgIG1lZGl1bWJsdWU6ICcjMDAwMENEJywKICAgIG1lZGl1bW9yY2hpZDogJyNCQTU1RDMnLAogICAgbWVkaXVtcHVycGxlOiAnIzkzNzBEQicsCiAgICBtZWRpdW1zZWFncmVlbjogJyMzQ0IzNzEnLAogICAgbWVkaXVtc2xhdGVibHVlOiAnIzdCNjhFRScsCiAgICBtZWRpdW1zcHJpbmdncmVlbjogJyMwMEZBOUEnLAogICAgbWVkaXVtdHVycXVvaXNlOiAnIzQ4RDFDQycsCiAgICBtZWRpdW12aW9sZXRyZWQ6ICcjQzcxNTg1JywKICAgIG1pZG5pZ2h0Ymx1ZTogJyMxOTE5NzAnLAogICAgbWludGNyZWFtOiAnI0Y1RkZGQScsCiAgICBtaXN0eXJvc2U6ICcjRkZFNEUxJywKICAgIG1vY2Nhc2luOiAnI0ZGRTRCNScsCiAgICBuYXZham93aGl0ZTogJyNGRkRFQUQnLAogICAgb2xkbGFjZTogJyNGREY1RTYnLAogICAgb2xpdmVkcmFiOiAnIzZCOEUyMycsCiAgICBvcmFuZ2U6ICcjRkZBNTAwJywKICAgIG9yYW5nZXJlZDogJyNGRjQ1MDAnLAogICAgb3JjaGlkOiAnI0RBNzBENicsCiAgICBwYWxlZ29sZGVucm9kOiAnI0VFRThBQScsCiAgICBwYWxlZ3JlZW46ICcjOThGQjk4JywKICAgIHBhbGV0dXJxdW9pc2U6ICcjQUZFRUVFJywKICAgIHBhbGV2aW9sZXRyZWQ6ICcjREI3MDkzJywKICAgIHBhcGF5YXdoaXA6ICcjRkZFRkQ1JywKICAgIHBlYWNocHVmZjogJyNGRkRBQjknLAogICAgcGVydTogJyNDRDg1M0YnLAogICAgcGluazogJyNGRkMwQ0InLAogICAgcGx1bTogJyNEREEwREQnLAogICAgcG93ZGVyYmx1ZTogJyNCMEUwRTYnLAogICAgcm9zeWJyb3duOiAnI0JDOEY4RicsCiAgICByb3lhbGJsdWU6ICcjNDE2OUUxJywKICAgIHNhZGRsZWJyb3duOiAnIzhCNDUxMycsCiAgICBzYWxtb246ICcjRkE4MDcyJywKICAgIHNhbmR5YnJvd246ICcjRjRBNDYwJywKICAgIHNlYWdyZWVuOiAnIzJFOEI1NycsCiAgICBzZWFzaGVsbDogJyNGRkY1RUUnLAogICAgc2llbm5hOiAnI0EwNTIyRCcsCiAgICBza3libHVlOiAnIzg3Q0VFQicsCiAgICBzbGF0ZWJsdWU6ICcjNkE1QUNEJywKICAgIHNsYXRlZ3JheTogJyM3MDgwOTAnLAogICAgc2xhdGVncmV5OiAnIzcwODA5MCcsCiAgICBzbm93OiAnI0ZGRkFGQScsCiAgICBzcHJpbmdncmVlbjogJyMwMEZGN0YnLAogICAgc3RlZWxibHVlOiAnIzQ2ODJCNCcsCiAgICB0YW46ICcjRDJCNDhDJywKICAgIHRoaXN0bGU6ICcjRDhCRkQ4JywKICAgIHRvbWF0bzogJyNGRjYzNDcnLAogICAgdHVycXVvaXNlOiAnIzQwRTBEMCcsCiAgICB2aW9sZXQ6ICcjRUU4MkVFJywKICAgIHdoZWF0OiAnI0Y1REVCMycsCiAgICB3aGl0ZXNtb2tlOiAnI0Y1RjVGNScsCiAgICB5ZWxsb3dncmVlbjogJyM5QUNEMzInCiAgfTsKCgogIGZ1bmN0aW9uIGdldFJnYkhzbENvbnRlbnQoc3R5bGVTdHJpbmcpIHsKICAgIHZhciBzdGFydCA9IHN0eWxlU3RyaW5nLmluZGV4T2YoJygnLCAzKTsKICAgIHZhciBlbmQgPSBzdHlsZVN0cmluZy5pbmRleE9mKCcpJywgc3RhcnQgKyAxKTsKICAgIHZhciBwYXJ0cyA9IHN0eWxlU3RyaW5nLnN1YnN0cmluZyhzdGFydCArIDEsIGVuZCkuc3BsaXQoJywnKTsKICAgIC8vIGFkZCBhbHBoYSBpZiBuZWVkZWQKICAgIGlmIChwYXJ0cy5sZW5ndGggIT0gNCB8fCBzdHlsZVN0cmluZy5jaGFyQXQoMykgIT0gJ2EnKSB7CiAgICAgIHBhcnRzWzNdID0gMTsKICAgIH0KICAgIHJldHVybiBwYXJ0czsKICB9CgogIGZ1bmN0aW9uIHBlcmNlbnQocykgewogICAgcmV0dXJuIHBhcnNlRmxvYXQocykgLyAxMDA7CiAgfQoKICBmdW5jdGlvbiBjbGFtcCh2LCBtaW4sIG1heCkgewogICAgcmV0dXJuIE1hdGgubWluKG1heCwgTWF0aC5tYXgobWluLCB2KSk7CiAgfQoKICBmdW5jdGlvbiBoc2xUb1JnYihwYXJ0cyl7CiAgICB2YXIgciwgZywgYiwgaCwgcywgbDsKICAgIGggPSBwYXJzZUZsb2F0KHBhcnRzWzBdKSAvIDM2MCAlIDM2MDsKICAgIGlmIChoIDwgMCkKICAgICAgaCsrOwogICAgcyA9IGNsYW1wKHBlcmNlbnQocGFydHNbMV0pLCAwLCAxKTsKICAgIGwgPSBjbGFtcChwZXJjZW50KHBhcnRzWzJdKSwgMCwgMSk7CiAgICBpZiAocyA9PSAwKSB7CiAgICAgIHIgPSBnID0gYiA9IGw7IC8vIGFjaHJvbWF0aWMKICAgIH0gZWxzZSB7CiAgICAgIHZhciBxID0gbCA8IDAuNSA/IGwgKiAoMSArIHMpIDogbCArIHMgLSBsICogczsKICAgICAgdmFyIHAgPSAyICogbCAtIHE7CiAgICAgIHIgPSBodWVUb1JnYihwLCBxLCBoICsgMSAvIDMpOwogICAgICBnID0gaHVlVG9SZ2IocCwgcSwgaCk7CiAgICAgIGIgPSBodWVUb1JnYihwLCBxLCBoIC0gMSAvIDMpOwogICAgfQoKICAgIHJldHVybiAnIycgKyBkZWNUb0hleFtNYXRoLmZsb29yKHIgKiAyNTUpXSArCiAgICAgICAgZGVjVG9IZXhbTWF0aC5mbG9vcihnICogMjU1KV0gKwogICAgICAgIGRlY1RvSGV4W01hdGguZmxvb3IoYiAqIDI1NSldOwogIH0KCiAgZnVuY3Rpb24gaHVlVG9SZ2IobTEsIG0yLCBoKSB7CiAgICBpZiAoaCA8IDApCiAgICAgIGgrKzsKICAgIGlmIChoID4gMSkKICAgICAgaC0tOwoKICAgIGlmICg2ICogaCA8IDEpCiAgICAgIHJldHVybiBtMSArIChtMiAtIG0xKSAqIDYgKiBoOwogICAgZWxzZSBpZiAoMiAqIGggPCAxKQogICAgICByZXR1cm4gbTI7CiAgICBlbHNlIGlmICgzICogaCA8IDIpCiAgICAgIHJldHVybiBtMSArIChtMiAtIG0xKSAqICgyIC8gMyAtIGgpICogNjsKICAgIGVsc2UKICAgICAgcmV0dXJuIG0xOwogIH0KCiAgdmFyIHByb2Nlc3NTdHlsZUNhY2hlID0ge307CgogIGZ1bmN0aW9uIHByb2Nlc3NTdHlsZShzdHlsZVN0cmluZykgewogICAgaWYgKHN0eWxlU3RyaW5nIGluIHByb2Nlc3NTdHlsZUNhY2hlKSB7CiAgICAgIHJldHVybiBwcm9jZXNzU3R5bGVDYWNoZVtzdHlsZVN0cmluZ107CiAgICB9CgogICAgdmFyIHN0ciwgYWxwaGEgPSAxOwoKICAgIHN0eWxlU3RyaW5nID0gU3RyaW5nKHN0eWxlU3RyaW5nKTsKICAgIGlmIChzdHlsZVN0cmluZy5jaGFyQXQoMCkgPT0gJyMnKSB7CiAgICAgIHN0ciA9IHN0eWxlU3RyaW5nOwogICAgfSBlbHNlIGlmICgvXnJnYi8udGVzdChzdHlsZVN0cmluZykpIHsKICAgICAgdmFyIHBhcnRzID0gZ2V0UmdiSHNsQ29udGVudChzdHlsZVN0cmluZyk7CiAgICAgIHZhciBzdHIgPSAnIycsIG47CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMzsgaSsrKSB7CiAgICAgICAgaWYgKHBhcnRzW2ldLmluZGV4T2YoJyUnKSAhPSAtMSkgewogICAgICAgICAgbiA9IE1hdGguZmxvb3IocGVyY2VudChwYXJ0c1tpXSkgKiAyNTUpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBuID0gK3BhcnRzW2ldOwogICAgICAgIH0KICAgICAgICBzdHIgKz0gZGVjVG9IZXhbY2xhbXAobiwgMCwgMjU1KV07CiAgICAgIH0KICAgICAgYWxwaGEgPSArcGFydHNbM107CiAgICB9IGVsc2UgaWYgKC9eaHNsLy50ZXN0KHN0eWxlU3RyaW5nKSkgewogICAgICB2YXIgcGFydHMgPSBnZXRSZ2JIc2xDb250ZW50KHN0eWxlU3RyaW5nKTsKICAgICAgc3RyID0gaHNsVG9SZ2IocGFydHMpOwogICAgICBhbHBoYSA9IHBhcnRzWzNdOwogICAgfSBlbHNlIHsKICAgICAgc3RyID0gY29sb3JEYXRhW3N0eWxlU3RyaW5nXSB8fCBzdHlsZVN0cmluZzsKICAgIH0KICAgIHJldHVybiBwcm9jZXNzU3R5bGVDYWNoZVtzdHlsZVN0cmluZ10gPSB7Y29sb3I6IHN0ciwgYWxwaGE6IGFscGhhfTsKICB9CgogIHZhciBERUZBVUxUX1NUWUxFID0gewogICAgc3R5bGU6ICdub3JtYWwnLAogICAgdmFyaWFudDogJ25vcm1hbCcsCiAgICB3ZWlnaHQ6ICdub3JtYWwnLAogICAgc2l6ZTogMTAsCiAgICBmYW1pbHk6ICdzYW5zLXNlcmlmJwogIH07CgogIC8vIEludGVybmFsIHRleHQgc3R5bGUgY2FjaGUKICB2YXIgZm9udFN0eWxlQ2FjaGUgPSB7fTsKCiAgZnVuY3Rpb24gcHJvY2Vzc0ZvbnRTdHlsZShzdHlsZVN0cmluZykgewogICAgaWYgKGZvbnRTdHlsZUNhY2hlW3N0eWxlU3RyaW5nXSkgewogICAgICByZXR1cm4gZm9udFN0eWxlQ2FjaGVbc3R5bGVTdHJpbmddOwogICAgfQoKICAgIHZhciBlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgdmFyIHN0eWxlID0gZWwuc3R5bGU7CiAgICB0cnkgewogICAgICBzdHlsZS5mb250ID0gc3R5bGVTdHJpbmc7CiAgICB9IGNhdGNoIChleCkgewogICAgICAvLyBJZ25vcmUgZmFpbHVyZXMgdG8gc2V0IHRvIGludmFsaWQgZm9udC4KICAgIH0KCiAgICByZXR1cm4gZm9udFN0eWxlQ2FjaGVbc3R5bGVTdHJpbmddID0gewogICAgICBzdHlsZTogc3R5bGUuZm9udFN0eWxlIHx8IERFRkFVTFRfU1RZTEUuc3R5bGUsCiAgICAgIHZhcmlhbnQ6IHN0eWxlLmZvbnRWYXJpYW50IHx8IERFRkFVTFRfU1RZTEUudmFyaWFudCwKICAgICAgd2VpZ2h0OiBzdHlsZS5mb250V2VpZ2h0IHx8IERFRkFVTFRfU1RZTEUud2VpZ2h0LAogICAgICBzaXplOiBzdHlsZS5mb250U2l6ZSB8fCBERUZBVUxUX1NUWUxFLnNpemUsCiAgICAgIGZhbWlseTogc3R5bGUuZm9udEZhbWlseSB8fCBERUZBVUxUX1NUWUxFLmZhbWlseQogICAgfTsKICB9CgogIGZ1bmN0aW9uIGdldENvbXB1dGVkU3R5bGUoc3R5bGUsIGVsZW1lbnQpIHsKICAgIHZhciBjb21wdXRlZFN0eWxlID0ge307CgogICAgZm9yICh2YXIgcCBpbiBzdHlsZSkgewogICAgICBjb21wdXRlZFN0eWxlW3BdID0gc3R5bGVbcF07CiAgICB9CgogICAgLy8gQ29tcHV0ZSB0aGUgc2l6ZQogICAgdmFyIGNhbnZhc0ZvbnRTaXplID0gcGFyc2VGbG9hdChlbGVtZW50LmN1cnJlbnRTdHlsZS5mb250U2l6ZSksCiAgICAgICAgZm9udFNpemUgPSBwYXJzZUZsb2F0KHN0eWxlLnNpemUpOwoKICAgIGlmICh0eXBlb2Ygc3R5bGUuc2l6ZSA9PSAnbnVtYmVyJykgewogICAgICBjb21wdXRlZFN0eWxlLnNpemUgPSBzdHlsZS5zaXplOwogICAgfSBlbHNlIGlmIChzdHlsZS5zaXplLmluZGV4T2YoJ3B4JykgIT0gLTEpIHsKICAgICAgY29tcHV0ZWRTdHlsZS5zaXplID0gZm9udFNpemU7CiAgICB9IGVsc2UgaWYgKHN0eWxlLnNpemUuaW5kZXhPZignZW0nKSAhPSAtMSkgewogICAgICBjb21wdXRlZFN0eWxlLnNpemUgPSBjYW52YXNGb250U2l6ZSAqIGZvbnRTaXplOwogICAgfSBlbHNlIGlmKHN0eWxlLnNpemUuaW5kZXhPZignJScpICE9IC0xKSB7CiAgICAgIGNvbXB1dGVkU3R5bGUuc2l6ZSA9IChjYW52YXNGb250U2l6ZSAvIDEwMCkgKiBmb250U2l6ZTsKICAgIH0gZWxzZSBpZiAoc3R5bGUuc2l6ZS5pbmRleE9mKCdwdCcpICE9IC0xKSB7CiAgICAgIGNvbXB1dGVkU3R5bGUuc2l6ZSA9IGZvbnRTaXplIC8gLjc1OwogICAgfSBlbHNlIHsKICAgICAgY29tcHV0ZWRTdHlsZS5zaXplID0gY2FudmFzRm9udFNpemU7CiAgICB9CgogICAgLy8gRGlmZmVyZW50IHNjYWxpbmcgYmV0d2VlbiBub3JtYWwgdGV4dCBhbmQgVk1MIHRleHQuIFRoaXMgd2FzIGZvdW5kIHVzaW5nCiAgICAvLyB0cmlhbCBhbmQgZXJyb3IgdG8gZ2V0IHRoZSBzYW1lIHNpemUgYXMgbm9uIFZNTCB0ZXh0LgogICAgY29tcHV0ZWRTdHlsZS5zaXplICo9IDAuOTgxOwoKICAgIC8vIEZpeCBmb3IgVk1MIGhhbmRsaW5nIG9mIGJhcmUgZm9udCBmYW1pbHkgbmFtZXMuICBBZGQgYSAnJyBhcm91bmQgZm9udCBmYW1pbHkgbmFtZXMuCiAgICBjb21wdXRlZFN0eWxlLmZhbWlseSA9ICAiJyIgKyBjb21wdXRlZFN0eWxlLmZhbWlseS5yZXBsYWNlKC8oXCd8XCIpL2csJycpLnJlcGxhY2UoL1xzKixccyovZywgIicsICciKSArICInIjsKCiAgICByZXR1cm4gY29tcHV0ZWRTdHlsZTsKICB9CgogIGZ1bmN0aW9uIGJ1aWxkU3R5bGUoc3R5bGUpIHsKICAgIHJldHVybiBzdHlsZS5zdHlsZSArICcgJyArIHN0eWxlLnZhcmlhbnQgKyAnICcgKyBzdHlsZS53ZWlnaHQgKyAnICcgKwogICAgICAgIHN0eWxlLnNpemUgKyAncHggJyArIHN0eWxlLmZhbWlseTsKICB9CgogIHZhciBsaW5lQ2FwTWFwID0gewogICAgJ2J1dHQnOiAnZmxhdCcsCiAgICAncm91bmQnOiAncm91bmQnCiAgfTsKCiAgZnVuY3Rpb24gcHJvY2Vzc0xpbmVDYXAobGluZUNhcCkgewogICAgcmV0dXJuIGxpbmVDYXBNYXBbbGluZUNhcF0gfHwgJ3NxdWFyZSc7CiAgfQoKICAvKioKICAgKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEIGludGVyZmFjZSBhcyBkZXNjcmliZWQgYnkKICAgKiB0aGUgV0hBVFdHLgogICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGNhbnZhc0VsZW1lbnQgVGhlIGVsZW1lbnQgdGhhdCB0aGUgMkQgY29udGV4dCBzaG91bGQKICAgKiBiZSBhc3NvY2lhdGVkIHdpdGgKICAgKi8KICBmdW5jdGlvbiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkRfKGNhbnZhc0VsZW1lbnQpIHsKICAgIHRoaXMubV8gPSBjcmVhdGVNYXRyaXhJZGVudGl0eSgpOwoKICAgIHRoaXMubVN0YWNrXyA9IFtdOwogICAgdGhpcy5hU3RhY2tfID0gW107CiAgICB0aGlzLmN1cnJlbnRQYXRoXyA9IFtdOwoKICAgIC8vIENhbnZhcyBjb250ZXh0IHByb3BlcnRpZXMKICAgIHRoaXMuc3Ryb2tlU3R5bGUgPSAnIzAwMCc7CiAgICB0aGlzLmZpbGxTdHlsZSA9ICcjMDAwJzsKCiAgICB0aGlzLmxpbmVXaWR0aCA9IDE7CiAgICB0aGlzLmxpbmVKb2luID0gJ21pdGVyJzsKICAgIHRoaXMubGluZUNhcCA9ICdidXR0JzsKICAgIHRoaXMubWl0ZXJMaW1pdCA9IFogKiAxOwogICAgdGhpcy5nbG9iYWxBbHBoYSA9IDE7CiAgICB0aGlzLmZvbnQgPSAnMTBweCBzYW5zLXNlcmlmJzsKICAgIHRoaXMudGV4dEFsaWduID0gJ2xlZnQnOwogICAgdGhpcy50ZXh0QmFzZWxpbmUgPSAnYWxwaGFiZXRpYyc7CiAgICB0aGlzLmNhbnZhcyA9IGNhbnZhc0VsZW1lbnQ7CgogICAgdmFyIGNzc1RleHQgPSAnd2lkdGg6JyArIGNhbnZhc0VsZW1lbnQuY2xpZW50V2lkdGggKyAncHg7aGVpZ2h0OicgKwogICAgICAgIGNhbnZhc0VsZW1lbnQuY2xpZW50SGVpZ2h0ICsgJ3B4O292ZXJmbG93OmhpZGRlbjtwb3NpdGlvbjphYnNvbHV0ZSc7CiAgICB2YXIgZWwgPSBjYW52YXNFbGVtZW50Lm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICBlbC5zdHlsZS5jc3NUZXh0ID0gY3NzVGV4dDsKICAgIGNhbnZhc0VsZW1lbnQuYXBwZW5kQ2hpbGQoZWwpOwoKICAgIHZhciBvdmVybGF5RWwgPSBlbC5jbG9uZU5vZGUoZmFsc2UpOwogICAgLy8gVXNlIGEgbm9uIHRyYW5zcGFyZW50IGJhY2tncm91bmQuCiAgICBvdmVybGF5RWwuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gJ3JlZCc7CiAgICBvdmVybGF5RWwuc3R5bGUuZmlsdGVyID0gJ2FscGhhKG9wYWNpdHk9MCknOwogICAgY2FudmFzRWxlbWVudC5hcHBlbmRDaGlsZChvdmVybGF5RWwpOwoKICAgIHRoaXMuZWxlbWVudF8gPSBlbDsKICAgIHRoaXMuYXJjU2NhbGVYXyA9IDE7CiAgICB0aGlzLmFyY1NjYWxlWV8gPSAxOwogICAgdGhpcy5saW5lU2NhbGVfID0gMTsKICB9CgogIHZhciBjb250ZXh0UHJvdG90eXBlID0gQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEXy5wcm90b3R5cGU7CiAgY29udGV4dFByb3RvdHlwZS5jbGVhclJlY3QgPSBmdW5jdGlvbigpIHsKICAgIGlmICh0aGlzLnRleHRNZWFzdXJlRWxfKSB7CiAgICAgIHRoaXMudGV4dE1lYXN1cmVFbF8ucmVtb3ZlTm9kZSh0cnVlKTsKICAgICAgdGhpcy50ZXh0TWVhc3VyZUVsXyA9IG51bGw7CiAgICB9CiAgICB0aGlzLmVsZW1lbnRfLmlubmVySFRNTCA9ICcnOwogIH07CgogIGNvbnRleHRQcm90b3R5cGUuYmVnaW5QYXRoID0gZnVuY3Rpb24oKSB7CiAgICAvLyBUT0RPOiBCcmFuY2ggY3VycmVudCBtYXRyaXggc28gdGhhdCBzYXZlL3Jlc3RvcmUgaGFzIG5vIGVmZmVjdAogICAgLy8gICAgICAgYXMgcGVyIHNhZmFyaSBkb2NzLgogICAgdGhpcy5jdXJyZW50UGF0aF8gPSBbXTsKICB9OwoKICBjb250ZXh0UHJvdG90eXBlLm1vdmVUbyA9IGZ1bmN0aW9uKGFYLCBhWSkgewogICAgdmFyIHAgPSBnZXRDb29yZHModGhpcywgYVgsIGFZKTsKICAgIHRoaXMuY3VycmVudFBhdGhfLnB1c2goe3R5cGU6ICdtb3ZlVG8nLCB4OiBwLngsIHk6IHAueX0pOwogICAgdGhpcy5jdXJyZW50WF8gPSBwLng7CiAgICB0aGlzLmN1cnJlbnRZXyA9IHAueTsKICB9OwoKICBjb250ZXh0UHJvdG90eXBlLmxpbmVUbyA9IGZ1bmN0aW9uKGFYLCBhWSkgewogICAgdmFyIHAgPSBnZXRDb29yZHModGhpcywgYVgsIGFZKTsKICAgIHRoaXMuY3VycmVudFBhdGhfLnB1c2goe3R5cGU6ICdsaW5lVG8nLCB4OiBwLngsIHk6IHAueX0pOwoKICAgIHRoaXMuY3VycmVudFhfID0gcC54OwogICAgdGhpcy5jdXJyZW50WV8gPSBwLnk7CiAgfTsKCiAgY29udGV4dFByb3RvdHlwZS5iZXppZXJDdXJ2ZVRvID0gZnVuY3Rpb24oYUNQMXgsIGFDUDF5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFDUDJ4LCBhQ1AyeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhWCwgYVkpIHsKICAgIHZhciBwID0gZ2V0Q29vcmRzKHRoaXMsIGFYLCBhWSk7CiAgICB2YXIgY3AxID0gZ2V0Q29vcmRzKHRoaXMsIGFDUDF4LCBhQ1AxeSk7CiAgICB2YXIgY3AyID0gZ2V0Q29vcmRzKHRoaXMsIGFDUDJ4LCBhQ1AyeSk7CiAgICBiZXppZXJDdXJ2ZVRvKHRoaXMsIGNwMSwgY3AyLCBwKTsKICB9OwoKICAvLyBIZWxwZXIgZnVuY3Rpb24gdGhhdCB0YWtlcyB0aGUgYWxyZWFkeSBmaXhlZCBjb3JkaW5hdGVzLgogIGZ1bmN0aW9uIGJlemllckN1cnZlVG8oc2VsZiwgY3AxLCBjcDIsIHApIHsKICAgIHNlbGYuY3VycmVudFBhdGhfLnB1c2goewogICAgICB0eXBlOiAnYmV6aWVyQ3VydmVUbycsCiAgICAgIGNwMXg6IGNwMS54LAogICAgICBjcDF5OiBjcDEueSwKICAgICAgY3AyeDogY3AyLngsCiAgICAgIGNwMnk6IGNwMi55LAogICAgICB4OiBwLngsCiAgICAgIHk6IHAueQogICAgfSk7CiAgICBzZWxmLmN1cnJlbnRYXyA9IHAueDsKICAgIHNlbGYuY3VycmVudFlfID0gcC55OwogIH0KCiAgY29udGV4dFByb3RvdHlwZS5xdWFkcmF0aWNDdXJ2ZVRvID0gZnVuY3Rpb24oYUNQeCwgYUNQeSwgYVgsIGFZKSB7CiAgICAvLyB0aGUgZm9sbG93aW5nIGlzIGxpZnRlZCBhbG1vc3QgZGlyZWN0bHkgZnJvbQogICAgLy8gaHR0cDovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9kb2NzL0NhbnZhc190dXRvcmlhbDpEcmF3aW5nX3NoYXBlcwoKICAgIHZhciBjcCA9IGdldENvb3Jkcyh0aGlzLCBhQ1B4LCBhQ1B5KTsKICAgIHZhciBwID0gZ2V0Q29vcmRzKHRoaXMsIGFYLCBhWSk7CgogICAgdmFyIGNwMSA9IHsKICAgICAgeDogdGhpcy5jdXJyZW50WF8gKyAyLjAgLyAzLjAgKiAoY3AueCAtIHRoaXMuY3VycmVudFhfKSwKICAgICAgeTogdGhpcy5jdXJyZW50WV8gKyAyLjAgLyAzLjAgKiAoY3AueSAtIHRoaXMuY3VycmVudFlfKQogICAgfTsKICAgIHZhciBjcDIgPSB7CiAgICAgIHg6IGNwMS54ICsgKHAueCAtIHRoaXMuY3VycmVudFhfKSAvIDMuMCwKICAgICAgeTogY3AxLnkgKyAocC55IC0gdGhpcy5jdXJyZW50WV8pIC8gMy4wCiAgICB9OwoKICAgIGJlemllckN1cnZlVG8odGhpcywgY3AxLCBjcDIsIHApOwogIH07CgogIGNvbnRleHRQcm90b3R5cGUuYXJjID0gZnVuY3Rpb24oYVgsIGFZLCBhUmFkaXVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYVN0YXJ0QW5nbGUsIGFFbmRBbmdsZSwgYUNsb2Nrd2lzZSkgewogICAgYVJhZGl1cyAqPSBaOwogICAgdmFyIGFyY1R5cGUgPSBhQ2xvY2t3aXNlID8gJ2F0JyA6ICd3YSc7CgogICAgdmFyIHhTdGFydCA9IGFYICsgbWMoYVN0YXJ0QW5nbGUpICogYVJhZGl1cyAtIFoyOwogICAgdmFyIHlTdGFydCA9IGFZICsgbXMoYVN0YXJ0QW5nbGUpICogYVJhZGl1cyAtIFoyOwoKICAgIHZhciB4RW5kID0gYVggKyBtYyhhRW5kQW5nbGUpICogYVJhZGl1cyAtIFoyOwogICAgdmFyIHlFbmQgPSBhWSArIG1zKGFFbmRBbmdsZSkgKiBhUmFkaXVzIC0gWjI7CgogICAgLy8gSUUgd29uJ3QgcmVuZGVyIGFyY2hlcyBkcmF3biBjb3VudGVyIGNsb2Nrd2lzZSBpZiB4U3RhcnQgPT0geEVuZC4KICAgIGlmICh4U3RhcnQgPT0geEVuZCAmJiAhYUNsb2Nrd2lzZSkgewogICAgICB4U3RhcnQgKz0gMC4xMjU7IC8vIE9mZnNldCB4U3RhcnQgYnkgMS84MCBvZiBhIHBpeGVsLiBVc2Ugc29tZXRoaW5nCiAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhhdCBjYW4gYmUgcmVwcmVzZW50ZWQgaW4gYmluYXJ5CiAgICB9CgogICAgdmFyIHAgPSBnZXRDb29yZHModGhpcywgYVgsIGFZKTsKICAgIHZhciBwU3RhcnQgPSBnZXRDb29yZHModGhpcywgeFN0YXJ0LCB5U3RhcnQpOwogICAgdmFyIHBFbmQgPSBnZXRDb29yZHModGhpcywgeEVuZCwgeUVuZCk7CgogICAgdGhpcy5jdXJyZW50UGF0aF8ucHVzaCh7dHlwZTogYXJjVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgeDogcC54LAogICAgICAgICAgICAgICAgICAgICAgICAgICB5OiBwLnksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhZGl1czogYVJhZGl1cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgeFN0YXJ0OiBwU3RhcnQueCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgeVN0YXJ0OiBwU3RhcnQueSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgeEVuZDogcEVuZC54LAogICAgICAgICAgICAgICAgICAgICAgICAgICB5RW5kOiBwRW5kLnl9KTsKCiAgfTsKCiAgY29udGV4dFByb3RvdHlwZS5yZWN0ID0gZnVuY3Rpb24oYVgsIGFZLCBhV2lkdGgsIGFIZWlnaHQpIHsKICAgIHRoaXMubW92ZVRvKGFYLCBhWSk7CiAgICB0aGlzLmxpbmVUbyhhWCArIGFXaWR0aCwgYVkpOwogICAgdGhpcy5saW5lVG8oYVggKyBhV2lkdGgsIGFZICsgYUhlaWdodCk7CiAgICB0aGlzLmxpbmVUbyhhWCwgYVkgKyBhSGVpZ2h0KTsKICAgIHRoaXMuY2xvc2VQYXRoKCk7CiAgfTsKCiAgY29udGV4dFByb3RvdHlwZS5zdHJva2VSZWN0ID0gZnVuY3Rpb24oYVgsIGFZLCBhV2lkdGgsIGFIZWlnaHQpIHsKICAgIHZhciBvbGRQYXRoID0gdGhpcy5jdXJyZW50UGF0aF87CiAgICB0aGlzLmJlZ2luUGF0aCgpOwoKICAgIHRoaXMubW92ZVRvKGFYLCBhWSk7CiAgICB0aGlzLmxpbmVUbyhhWCArIGFXaWR0aCwgYVkpOwogICAgdGhpcy5saW5lVG8oYVggKyBhV2lkdGgsIGFZICsgYUhlaWdodCk7CiAgICB0aGlzLmxpbmVUbyhhWCwgYVkgKyBhSGVpZ2h0KTsKICAgIHRoaXMuY2xvc2VQYXRoKCk7CiAgICB0aGlzLnN0cm9rZSgpOwoKICAgIHRoaXMuY3VycmVudFBhdGhfID0gb2xkUGF0aDsKICB9OwoKICBjb250ZXh0UHJvdG90eXBlLmZpbGxSZWN0ID0gZnVuY3Rpb24oYVgsIGFZLCBhV2lkdGgsIGFIZWlnaHQpIHsKICAgIHZhciBvbGRQYXRoID0gdGhpcy5jdXJyZW50UGF0aF87CiAgICB0aGlzLmJlZ2luUGF0aCgpOwoKICAgIHRoaXMubW92ZVRvKGFYLCBhWSk7CiAgICB0aGlzLmxpbmVUbyhhWCArIGFXaWR0aCwgYVkpOwogICAgdGhpcy5saW5lVG8oYVggKyBhV2lkdGgsIGFZICsgYUhlaWdodCk7CiAgICB0aGlzLmxpbmVUbyhhWCwgYVkgKyBhSGVpZ2h0KTsKICAgIHRoaXMuY2xvc2VQYXRoKCk7CiAgICB0aGlzLmZpbGwoKTsKCiAgICB0aGlzLmN1cnJlbnRQYXRoXyA9IG9sZFBhdGg7CiAgfTsKCiAgY29udGV4dFByb3RvdHlwZS5jcmVhdGVMaW5lYXJHcmFkaWVudCA9IGZ1bmN0aW9uKGFYMCwgYVkwLCBhWDEsIGFZMSkgewogICAgdmFyIGdyYWRpZW50ID0gbmV3IENhbnZhc0dyYWRpZW50XygnZ3JhZGllbnQnKTsKICAgIGdyYWRpZW50LngwXyA9IGFYMDsKICAgIGdyYWRpZW50LnkwXyA9IGFZMDsKICAgIGdyYWRpZW50LngxXyA9IGFYMTsKICAgIGdyYWRpZW50LnkxXyA9IGFZMTsKICAgIHJldHVybiBncmFkaWVudDsKICB9OwoKICBjb250ZXh0UHJvdG90eXBlLmNyZWF0ZVJhZGlhbEdyYWRpZW50ID0gZnVuY3Rpb24oYVgwLCBhWTAsIGFSMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYVgxLCBhWTEsIGFSMSkgewogICAgdmFyIGdyYWRpZW50ID0gbmV3IENhbnZhc0dyYWRpZW50XygnZ3JhZGllbnRyYWRpYWwnKTsKICAgIGdyYWRpZW50LngwXyA9IGFYMDsKICAgIGdyYWRpZW50LnkwXyA9IGFZMDsKICAgIGdyYWRpZW50LnIwXyA9IGFSMDsKICAgIGdyYWRpZW50LngxXyA9IGFYMTsKICAgIGdyYWRpZW50LnkxXyA9IGFZMTsKICAgIGdyYWRpZW50LnIxXyA9IGFSMTsKICAgIHJldHVybiBncmFkaWVudDsKICB9OwoKICBjb250ZXh0UHJvdG90eXBlLmRyYXdJbWFnZSA9IGZ1bmN0aW9uKGltYWdlLCB2YXJfYXJncykgewogICAgdmFyIGR4LCBkeSwgZHcsIGRoLCBzeCwgc3ksIHN3LCBzaDsKCiAgICAvLyB0byBmaW5kIHRoZSBvcmlnaW5hbCB3aWR0aCB3ZSBvdmVyaWRlIHRoZSB3aWR0aCBhbmQgaGVpZ2h0CiAgICB2YXIgb2xkUnVudGltZVdpZHRoID0gaW1hZ2UucnVudGltZVN0eWxlLndpZHRoOwogICAgdmFyIG9sZFJ1bnRpbWVIZWlnaHQgPSBpbWFnZS5ydW50aW1lU3R5bGUuaGVpZ2h0OwogICAgaW1hZ2UucnVudGltZVN0eWxlLndpZHRoID0gJ2F1dG8nOwogICAgaW1hZ2UucnVudGltZVN0eWxlLmhlaWdodCA9ICdhdXRvJzsKCiAgICAvLyBnZXQgdGhlIG9yaWdpbmFsIHNpemUKICAgIHZhciB3ID0gaW1hZ2Uud2lkdGg7CiAgICB2YXIgaCA9IGltYWdlLmhlaWdodDsKCiAgICAvLyBhbmQgcmVtb3ZlIG92ZXJpZGVzCiAgICBpbWFnZS5ydW50aW1lU3R5bGUud2lkdGggPSBvbGRSdW50aW1lV2lkdGg7CiAgICBpbWFnZS5ydW50aW1lU3R5bGUuaGVpZ2h0ID0gb2xkUnVudGltZUhlaWdodDsKCiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAzKSB7CiAgICAgIGR4ID0gYXJndW1lbnRzWzFdOwogICAgICBkeSA9IGFyZ3VtZW50c1syXTsKICAgICAgc3ggPSBzeSA9IDA7CiAgICAgIHN3ID0gZHcgPSB3OwogICAgICBzaCA9IGRoID0gaDsKICAgIH0gZWxzZSBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSA1KSB7CiAgICAgIGR4ID0gYXJndW1lbnRzWzFdOwogICAgICBkeSA9IGFyZ3VtZW50c1syXTsKICAgICAgZHcgPSBhcmd1bWVudHNbM107CiAgICAgIGRoID0gYXJndW1lbnRzWzRdOwogICAgICBzeCA9IHN5ID0gMDsKICAgICAgc3cgPSB3OwogICAgICBzaCA9IGg7CiAgICB9IGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gOSkgewogICAgICBzeCA9IGFyZ3VtZW50c1sxXTsKICAgICAgc3kgPSBhcmd1bWVudHNbMl07CiAgICAgIHN3ID0gYXJndW1lbnRzWzNdOwogICAgICBzaCA9IGFyZ3VtZW50c1s0XTsKICAgICAgZHggPSBhcmd1bWVudHNbNV07CiAgICAgIGR5ID0gYXJndW1lbnRzWzZdOwogICAgICBkdyA9IGFyZ3VtZW50c1s3XTsKICAgICAgZGggPSBhcmd1bWVudHNbOF07CiAgICB9IGVsc2UgewogICAgICB0aHJvdyBFcnJvcignSW52YWxpZCBudW1iZXIgb2YgYXJndW1lbnRzJyk7CiAgICB9CgogICAgdmFyIGQgPSBnZXRDb29yZHModGhpcywgZHgsIGR5KTsKCiAgICB2YXIgdzIgPSBzdyAvIDI7CiAgICB2YXIgaDIgPSBzaCAvIDI7CgogICAgdmFyIHZtbFN0ciA9IFtdOwoKICAgIHZhciBXID0gMTA7CiAgICB2YXIgSCA9IDEwOwoKICAgIC8vIEZvciBzb21lIHJlYXNvbiB0aGF0IEkndmUgbm93IGZvcmdvdHRlbiwgdXNpbmcgZGl2cyBkaWRuJ3Qgd29yawogICAgdm1sU3RyLnB1c2goJyA8Z192bWxfOmdyb3VwJywKICAgICAgICAgICAgICAgICcgY29vcmRzaXplPSInLCBaICogVywgJywnLCBaICogSCwgJyInLAogICAgICAgICAgICAgICAgJyBjb29yZG9yaWdpbj0iMCwwIicgLAogICAgICAgICAgICAgICAgJyBzdHlsZT0id2lkdGg6JywgVywgJ3B4O2hlaWdodDonLCBILCAncHg7cG9zaXRpb246YWJzb2x1dGU7Jyk7CgogICAgLy8gSWYgZmlsdGVycyBhcmUgbmVjZXNzYXJ5IChyb3RhdGlvbiBleGlzdHMpLCBjcmVhdGUgdGhlbQogICAgLy8gZmlsdGVycyBhcmUgYm9nLXNsb3csIHNvIG9ubHkgY3JlYXRlIHRoZW0gaWYgYWJic29sdXRlbHkgbmVjZXNzYXJ5CiAgICAvLyBUaGUgZm9sbG93aW5nIGNoZWNrIGRvZXNuJ3QgYWNjb3VudCBmb3Igc2tld3MgKHdoaWNoIGRvbid0IGV4aXN0CiAgICAvLyBpbiB0aGUgY2FudmFzIHNwZWMgKHlldCkgYW55d2F5LgoKICAgIGlmICh0aGlzLm1fWzBdWzBdICE9IDEgfHwgdGhpcy5tX1swXVsxXSB8fAogICAgICAgIHRoaXMubV9bMV1bMV0gIT0gMSB8fCB0aGlzLm1fWzFdWzBdKSB7CiAgICAgIHZhciBmaWx0ZXIgPSBbXTsKCiAgICAgIC8vIE5vdGUgdGhlIDEyLzIxIHJldmVyc2FsCiAgICAgIGZpbHRlci5wdXNoKCdNMTE9JywgdGhpcy5tX1swXVswXSwgJywnLAogICAgICAgICAgICAgICAgICAnTTEyPScsIHRoaXMubV9bMV1bMF0sICcsJywKICAgICAgICAgICAgICAgICAgJ00yMT0nLCB0aGlzLm1fWzBdWzFdLCAnLCcsCiAgICAgICAgICAgICAgICAgICdNMjI9JywgdGhpcy5tX1sxXVsxXSwgJywnLAogICAgICAgICAgICAgICAgICAnRHg9JywgbXIoZC54IC8gWiksICcsJywKICAgICAgICAgICAgICAgICAgJ0R5PScsIG1yKGQueSAvIFopLCAnJyk7CgogICAgICAvLyBCb3VuZGluZyBib3ggY2FsY3VsYXRpb24gKG5lZWQgdG8gbWluaW1pemUgZGlzcGxheWVkIGFyZWEgc28gdGhhdAogICAgICAvLyBmaWx0ZXJzIGRvbid0IHdhc3RlIHRpbWUgb24gdW51c2VkIHBpeGVscy4KICAgICAgdmFyIG1heCA9IGQ7CiAgICAgIHZhciBjMiA9IGdldENvb3Jkcyh0aGlzLCBkeCArIGR3LCBkeSk7CiAgICAgIHZhciBjMyA9IGdldENvb3Jkcyh0aGlzLCBkeCwgZHkgKyBkaCk7CiAgICAgIHZhciBjNCA9IGdldENvb3Jkcyh0aGlzLCBkeCArIGR3LCBkeSArIGRoKTsKCiAgICAgIG1heC54ID0gbS5tYXgobWF4LngsIGMyLngsIGMzLngsIGM0LngpOwogICAgICBtYXgueSA9IG0ubWF4KG1heC55LCBjMi55LCBjMy55LCBjNC55KTsKCiAgICAgIHZtbFN0ci5wdXNoKCdwYWRkaW5nOjAgJywgbXIobWF4LnggLyBaKSwgJ3B4ICcsIG1yKG1heC55IC8gWiksCiAgICAgICAgICAgICAgICAgICdweCAwO2ZpbHRlcjpwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuTWF0cml4KCcsCiAgICAgICAgICAgICAgICAgIGZpbHRlci5qb2luKCcnKSwgIiwgc2l6aW5nbWV0aG9kPSdjbGlwJyk7Iik7CgogICAgfSBlbHNlIHsKICAgICAgdm1sU3RyLnB1c2goJ3RvcDonLCBtcihkLnkgLyBaKSwgJ3B4O2xlZnQ6JywgbXIoZC54IC8gWiksICdweDsnKTsKICAgIH0KCiAgICB2bWxTdHIucHVzaCgnICI+JyAsCiAgICAgICAgICAgICAgICAnPGdfdm1sXzppbWFnZSBzcmM9IicsIGltYWdlLnNyYywgJyInLAogICAgICAgICAgICAgICAgJyBzdHlsZT0id2lkdGg6JywgWiAqIGR3LCAncHg7JywKICAgICAgICAgICAgICAgICcgaGVpZ2h0OicsIFogKiBkaCwgJ3B4IicsCiAgICAgICAgICAgICAgICAnIGNyb3BsZWZ0PSInLCBzeCAvIHcsICciJywKICAgICAgICAgICAgICAgICcgY3JvcHRvcD0iJywgc3kgLyBoLCAnIicsCiAgICAgICAgICAgICAgICAnIGNyb3ByaWdodD0iJywgKHcgLSBzeCAtIHN3KSAvIHcsICciJywKICAgICAgICAgICAgICAgICcgY3JvcGJvdHRvbT0iJywgKGggLSBzeSAtIHNoKSAvIGgsICciJywKICAgICAgICAgICAgICAgICcgLz4nLAogICAgICAgICAgICAgICAgJzwvZ192bWxfOmdyb3VwPicpOwoKICAgIHRoaXMuZWxlbWVudF8uaW5zZXJ0QWRqYWNlbnRIVE1MKCdCZWZvcmVFbmQnLCB2bWxTdHIuam9pbignJykpOwogIH07CgogIGNvbnRleHRQcm90b3R5cGUuc3Ryb2tlID0gZnVuY3Rpb24oYUZpbGwpIHsKICAgIHZhciBsaW5lU3RyID0gW107CiAgICB2YXIgbGluZU9wZW4gPSBmYWxzZTsKCiAgICB2YXIgVyA9IDEwOwogICAgdmFyIEggPSAxMDsKCiAgICBsaW5lU3RyLnB1c2goJzxnX3ZtbF86c2hhcGUnLAogICAgICAgICAgICAgICAgICcgZmlsbGVkPSInLCAhIWFGaWxsLCAnIicsCiAgICAgICAgICAgICAgICAgJyBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7d2lkdGg6JywgVywgJ3B4O2hlaWdodDonLCBILCAncHg7IicsCiAgICAgICAgICAgICAgICAgJyBjb29yZG9yaWdpbj0iMCwwIicsCiAgICAgICAgICAgICAgICAgJyBjb29yZHNpemU9IicsIFogKiBXLCAnLCcsIFogKiBILCAnIicsCiAgICAgICAgICAgICAgICAgJyBzdHJva2VkPSInLCAhYUZpbGwsICciJywKICAgICAgICAgICAgICAgICAnIHBhdGg9IicpOwoKICAgIHZhciBuZXdTZXEgPSBmYWxzZTsKICAgIHZhciBtaW4gPSB7eDogbnVsbCwgeTogbnVsbH07CiAgICB2YXIgbWF4ID0ge3g6IG51bGwsIHk6IG51bGx9OwoKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jdXJyZW50UGF0aF8ubGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIHAgPSB0aGlzLmN1cnJlbnRQYXRoX1tpXTsKICAgICAgdmFyIGM7CgogICAgICBzd2l0Y2ggKHAudHlwZSkgewogICAgICAgIGNhc2UgJ21vdmVUbyc6CiAgICAgICAgICBjID0gcDsKICAgICAgICAgIGxpbmVTdHIucHVzaCgnIG0gJywgbXIocC54KSwgJywnLCBtcihwLnkpKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ2xpbmVUbyc6CiAgICAgICAgICBsaW5lU3RyLnB1c2goJyBsICcsIG1yKHAueCksICcsJywgbXIocC55KSk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdjbG9zZSc6CiAgICAgICAgICBsaW5lU3RyLnB1c2goJyB4ICcpOwogICAgICAgICAgcCA9IG51bGw7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdiZXppZXJDdXJ2ZVRvJzoKICAgICAgICAgIGxpbmVTdHIucHVzaCgnIGMgJywKICAgICAgICAgICAgICAgICAgICAgICBtcihwLmNwMXgpLCAnLCcsIG1yKHAuY3AxeSksICcsJywKICAgICAgICAgICAgICAgICAgICAgICBtcihwLmNwMngpLCAnLCcsIG1yKHAuY3AyeSksICcsJywKICAgICAgICAgICAgICAgICAgICAgICBtcihwLngpLCAnLCcsIG1yKHAueSkpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnYXQnOgogICAgICAgIGNhc2UgJ3dhJzoKICAgICAgICAgIGxpbmVTdHIucHVzaCgnICcsIHAudHlwZSwgJyAnLAogICAgICAgICAgICAgICAgICAgICAgIG1yKHAueCAtIHRoaXMuYXJjU2NhbGVYXyAqIHAucmFkaXVzKSwgJywnLAogICAgICAgICAgICAgICAgICAgICAgIG1yKHAueSAtIHRoaXMuYXJjU2NhbGVZXyAqIHAucmFkaXVzKSwgJyAnLAogICAgICAgICAgICAgICAgICAgICAgIG1yKHAueCArIHRoaXMuYXJjU2NhbGVYXyAqIHAucmFkaXVzKSwgJywnLAogICAgICAgICAgICAgICAgICAgICAgIG1yKHAueSArIHRoaXMuYXJjU2NhbGVZXyAqIHAucmFkaXVzKSwgJyAnLAogICAgICAgICAgICAgICAgICAgICAgIG1yKHAueFN0YXJ0KSwgJywnLCBtcihwLnlTdGFydCksICcgJywKICAgICAgICAgICAgICAgICAgICAgICBtcihwLnhFbmQpLCAnLCcsIG1yKHAueUVuZCkpOwogICAgICAgICAgYnJlYWs7CiAgICAgIH0KCgogICAgICAvLyBUT0RPOiBGb2xsb3dpbmcgaXMgYnJva2VuIGZvciBjdXJ2ZXMgZHVlIHRvCiAgICAgIC8vICAgICAgIG1vdmUgdG8gcHJvcGVyIHBhdGhzLgoKICAgICAgLy8gRmlndXJlIG91dCBkaW1lbnNpb25zIHNvIHdlIGNhbiBkbyBncmFkaWVudCBmaWxscwogICAgICAvLyBwcm9wZXJseQogICAgICBpZiAocCkgewogICAgICAgIGlmIChtaW4ueCA9PSBudWxsIHx8IHAueCA8IG1pbi54KSB7CiAgICAgICAgICBtaW4ueCA9IHAueDsKICAgICAgICB9CiAgICAgICAgaWYgKG1heC54ID09IG51bGwgfHwgcC54ID4gbWF4LngpIHsKICAgICAgICAgIG1heC54ID0gcC54OwogICAgICAgIH0KICAgICAgICBpZiAobWluLnkgPT0gbnVsbCB8fCBwLnkgPCBtaW4ueSkgewogICAgICAgICAgbWluLnkgPSBwLnk7CiAgICAgICAgfQogICAgICAgIGlmIChtYXgueSA9PSBudWxsIHx8IHAueSA+IG1heC55KSB7CiAgICAgICAgICBtYXgueSA9IHAueTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGxpbmVTdHIucHVzaCgnICI+Jyk7CgogICAgaWYgKCFhRmlsbCkgewogICAgICBhcHBlbmRTdHJva2UodGhpcywgbGluZVN0cik7CiAgICB9IGVsc2UgewogICAgICBhcHBlbmRGaWxsKHRoaXMsIGxpbmVTdHIsIG1pbiwgbWF4KTsKICAgIH0KCiAgICBsaW5lU3RyLnB1c2goJzwvZ192bWxfOnNoYXBlPicpOwoKICAgIHRoaXMuZWxlbWVudF8uaW5zZXJ0QWRqYWNlbnRIVE1MKCdiZWZvcmVFbmQnLCBsaW5lU3RyLmpvaW4oJycpKTsKICB9OwoKICBmdW5jdGlvbiBhcHBlbmRTdHJva2UoY3R4LCBsaW5lU3RyKSB7CiAgICB2YXIgYSA9IHByb2Nlc3NTdHlsZShjdHguc3Ryb2tlU3R5bGUpOwogICAgdmFyIGNvbG9yID0gYS5jb2xvcjsKICAgIHZhciBvcGFjaXR5ID0gYS5hbHBoYSAqIGN0eC5nbG9iYWxBbHBoYTsKICAgIHZhciBsaW5lV2lkdGggPSBjdHgubGluZVNjYWxlXyAqIGN0eC5saW5lV2lkdGg7CgogICAgLy8gVk1MIGNhbm5vdCBjb3JyZWN0bHkgcmVuZGVyIGEgbGluZSBpZiB0aGUgd2lkdGggaXMgbGVzcyB0aGFuIDFweC4KICAgIC8vIEluIHRoYXQgY2FzZSwgd2UgZGlsdXRlIHRoZSBjb2xvciB0byBtYWtlIHRoZSBsaW5lIGxvb2sgdGhpbm5lci4KICAgIGlmIChsaW5lV2lkdGggPCAxKSB7CiAgICAgIG9wYWNpdHkgKj0gbGluZVdpZHRoOwogICAgfQoKICAgIGxpbmVTdHIucHVzaCgKICAgICAgJzxnX3ZtbF86c3Ryb2tlJywKICAgICAgJyBvcGFjaXR5PSInLCBvcGFjaXR5LCAnIicsCiAgICAgICcgam9pbnN0eWxlPSInLCBjdHgubGluZUpvaW4sICciJywKICAgICAgJyBtaXRlcmxpbWl0PSInLCBjdHgubWl0ZXJMaW1pdCwgJyInLAogICAgICAnIGVuZGNhcD0iJywgcHJvY2Vzc0xpbmVDYXAoY3R4LmxpbmVDYXApLCAnIicsCiAgICAgICcgd2VpZ2h0PSInLCBsaW5lV2lkdGgsICdweCInLAogICAgICAnIGNvbG9yPSInLCBjb2xvciwgJyIgLz4nCiAgICApOwogIH0KCiAgZnVuY3Rpb24gYXBwZW5kRmlsbChjdHgsIGxpbmVTdHIsIG1pbiwgbWF4KSB7CiAgICB2YXIgZmlsbFN0eWxlID0gY3R4LmZpbGxTdHlsZTsKICAgIHZhciBhcmNTY2FsZVggPSBjdHguYXJjU2NhbGVYXzsKICAgIHZhciBhcmNTY2FsZVkgPSBjdHguYXJjU2NhbGVZXzsKICAgIHZhciB3aWR0aCA9IG1heC54IC0gbWluLng7CiAgICB2YXIgaGVpZ2h0ID0gbWF4LnkgLSBtaW4ueTsKICAgIGlmIChmaWxsU3R5bGUgaW5zdGFuY2VvZiBDYW52YXNHcmFkaWVudF8pIHsKICAgICAgLy8gVE9ETzogR3JhZGllbnRzIHRyYW5zZm9ybWVkIHdpdGggdGhlIHRyYW5zZm9ybWF0aW9uIG1hdHJpeC4KICAgICAgdmFyIGFuZ2xlID0gMDsKICAgICAgdmFyIGZvY3VzID0ge3g6IDAsIHk6IDB9OwoKICAgICAgLy8gYWRkaXRpb25hbCBvZmZzZXQKICAgICAgdmFyIHNoaWZ0ID0gMDsKICAgICAgLy8gc2NhbGUgZmFjdG9yIGZvciBvZmZzZXQKICAgICAgdmFyIGV4cGFuc2lvbiA9IDE7CgogICAgICBpZiAoZmlsbFN0eWxlLnR5cGVfID09ICdncmFkaWVudCcpIHsKICAgICAgICB2YXIgeDAgPSBmaWxsU3R5bGUueDBfIC8gYXJjU2NhbGVYOwogICAgICAgIHZhciB5MCA9IGZpbGxTdHlsZS55MF8gLyBhcmNTY2FsZVk7CiAgICAgICAgdmFyIHgxID0gZmlsbFN0eWxlLngxXyAvIGFyY1NjYWxlWDsKICAgICAgICB2YXIgeTEgPSBmaWxsU3R5bGUueTFfIC8gYXJjU2NhbGVZOwogICAgICAgIHZhciBwMCA9IGdldENvb3JkcyhjdHgsIHgwLCB5MCk7CiAgICAgICAgdmFyIHAxID0gZ2V0Q29vcmRzKGN0eCwgeDEsIHkxKTsKICAgICAgICB2YXIgZHggPSBwMS54IC0gcDAueDsKICAgICAgICB2YXIgZHkgPSBwMS55IC0gcDAueTsKICAgICAgICBhbmdsZSA9IE1hdGguYXRhbjIoZHgsIGR5KSAqIDE4MCAvIE1hdGguUEk7CgogICAgICAgIC8vIFRoZSBhbmdsZSBzaG91bGQgYmUgYSBub24tbmVnYXRpdmUgbnVtYmVyLgogICAgICAgIGlmIChhbmdsZSA8IDApIHsKICAgICAgICAgIGFuZ2xlICs9IDM2MDsKICAgICAgICB9CgogICAgICAgIC8vIFZlcnkgc21hbGwgYW5nbGVzIHByb2R1Y2UgYW4gdW5leHBlY3RlZCByZXN1bHQgYmVjYXVzZSB0aGV5IGFyZQogICAgICAgIC8vIGNvbnZlcnRlZCB0byBhIHNjaWVudGlmaWMgbm90YXRpb24gc3RyaW5nLgogICAgICAgIGlmIChhbmdsZSA8IDFlLTYpIHsKICAgICAgICAgIGFuZ2xlID0gMDsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdmFyIHAwID0gZ2V0Q29vcmRzKGN0eCwgZmlsbFN0eWxlLngwXywgZmlsbFN0eWxlLnkwXyk7CiAgICAgICAgZm9jdXMgPSB7CiAgICAgICAgICB4OiAocDAueCAtIG1pbi54KSAvIHdpZHRoLAogICAgICAgICAgeTogKHAwLnkgLSBtaW4ueSkgLyBoZWlnaHQKICAgICAgICB9OwoKICAgICAgICB3aWR0aCAgLz0gYXJjU2NhbGVYICogWjsKICAgICAgICBoZWlnaHQgLz0gYXJjU2NhbGVZICogWjsKICAgICAgICB2YXIgZGltZW5zaW9uID0gbS5tYXgod2lkdGgsIGhlaWdodCk7CiAgICAgICAgc2hpZnQgPSAyICogZmlsbFN0eWxlLnIwXyAvIGRpbWVuc2lvbjsKICAgICAgICBleHBhbnNpb24gPSAyICogZmlsbFN0eWxlLnIxXyAvIGRpbWVuc2lvbiAtIHNoaWZ0OwogICAgICB9CgogICAgICAvLyBXZSBuZWVkIHRvIHNvcnQgdGhlIGNvbG9yIHN0b3BzIGluIGFzY2VuZGluZyBvcmRlciBieSBvZmZzZXQsCiAgICAgIC8vIG90aGVyd2lzZSBJRSB3b24ndCBpbnRlcnByZXQgaXQgY29ycmVjdGx5LgogICAgICB2YXIgc3RvcHMgPSBmaWxsU3R5bGUuY29sb3JzXzsKICAgICAgc3RvcHMuc29ydChmdW5jdGlvbihjczEsIGNzMikgewogICAgICAgIHJldHVybiBjczEub2Zmc2V0IC0gY3MyLm9mZnNldDsKICAgICAgfSk7CgogICAgICB2YXIgbGVuZ3RoID0gc3RvcHMubGVuZ3RoOwogICAgICB2YXIgY29sb3IxID0gc3RvcHNbMF0uY29sb3I7CiAgICAgIHZhciBjb2xvcjIgPSBzdG9wc1tsZW5ndGggLSAxXS5jb2xvcjsKICAgICAgdmFyIG9wYWNpdHkxID0gc3RvcHNbMF0uYWxwaGEgKiBjdHguZ2xvYmFsQWxwaGE7CiAgICAgIHZhciBvcGFjaXR5MiA9IHN0b3BzW2xlbmd0aCAtIDFdLmFscGhhICogY3R4Lmdsb2JhbEFscGhhOwoKICAgICAgdmFyIGNvbG9ycyA9IFtdOwogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgICAgdmFyIHN0b3AgPSBzdG9wc1tpXTsKICAgICAgICBjb2xvcnMucHVzaChzdG9wLm9mZnNldCAqIGV4cGFuc2lvbiArIHNoaWZ0ICsgJyAnICsgc3RvcC5jb2xvcik7CiAgICAgIH0KCiAgICAgIC8vIFdoZW4gY29sb3JzIGF0dHJpYnV0ZSBpcyB1c2VkLCB0aGUgbWVhbmluZ3Mgb2Ygb3BhY2l0eSBhbmQgbzpvcGFjaXR5MgogICAgICAvLyBhcmUgcmV2ZXJzZWQuCiAgICAgIGxpbmVTdHIucHVzaCgnPGdfdm1sXzpmaWxsIHR5cGU9IicsIGZpbGxTdHlsZS50eXBlXywgJyInLAogICAgICAgICAgICAgICAgICAgJyBtZXRob2Q9Im5vbmUiIGZvY3VzPSIxMDAlIicsCiAgICAgICAgICAgICAgICAgICAnIGNvbG9yPSInLCBjb2xvcjEsICciJywKICAgICAgICAgICAgICAgICAgICcgY29sb3IyPSInLCBjb2xvcjIsICciJywKICAgICAgICAgICAgICAgICAgICcgY29sb3JzPSInLCBjb2xvcnMuam9pbignLCcpLCAnIicsCiAgICAgICAgICAgICAgICAgICAnIG9wYWNpdHk9IicsIG9wYWNpdHkyLCAnIicsCiAgICAgICAgICAgICAgICAgICAnIGdfb186b3BhY2l0eTI9IicsIG9wYWNpdHkxLCAnIicsCiAgICAgICAgICAgICAgICAgICAnIGFuZ2xlPSInLCBhbmdsZSwgJyInLAogICAgICAgICAgICAgICAgICAgJyBmb2N1c3Bvc2l0aW9uPSInLCBmb2N1cy54LCAnLCcsIGZvY3VzLnksICciIC8+Jyk7CiAgICB9IGVsc2UgaWYgKGZpbGxTdHlsZSBpbnN0YW5jZW9mIENhbnZhc1BhdHRlcm5fKSB7CiAgICAgIGlmICh3aWR0aCAmJiBoZWlnaHQpIHsKICAgICAgICB2YXIgZGVsdGFMZWZ0ID0gLW1pbi54OwogICAgICAgIHZhciBkZWx0YVRvcCA9IC1taW4ueTsKICAgICAgICBsaW5lU3RyLnB1c2goJzxnX3ZtbF86ZmlsbCcsCiAgICAgICAgICAgICAgICAgICAgICcgcG9zaXRpb249IicsCiAgICAgICAgICAgICAgICAgICAgIGRlbHRhTGVmdCAvIHdpZHRoICogYXJjU2NhbGVYICogYXJjU2NhbGVYLCAnLCcsCiAgICAgICAgICAgICAgICAgICAgIGRlbHRhVG9wIC8gaGVpZ2h0ICogYXJjU2NhbGVZICogYXJjU2NhbGVZLCAnIicsCiAgICAgICAgICAgICAgICAgICAgICcgdHlwZT0idGlsZSInLAogICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBGaWd1cmUgb3V0IHRoZSBjb3JyZWN0IHNpemUgdG8gZml0IHRoZSBzY2FsZS4KICAgICAgICAgICAgICAgICAgICAgLy8nIHNpemU9IicsIHcsICdweCAnLCBoLCAncHgiJywKICAgICAgICAgICAgICAgICAgICAgJyBzcmM9IicsIGZpbGxTdHlsZS5zcmNfLCAnIiAvPicpOwogICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgdmFyIGEgPSBwcm9jZXNzU3R5bGUoY3R4LmZpbGxTdHlsZSk7CiAgICAgIHZhciBjb2xvciA9IGEuY29sb3I7CiAgICAgIHZhciBvcGFjaXR5ID0gYS5hbHBoYSAqIGN0eC5nbG9iYWxBbHBoYTsKICAgICAgbGluZVN0ci5wdXNoKCc8Z192bWxfOmZpbGwgY29sb3I9IicsIGNvbG9yLCAnIiBvcGFjaXR5PSInLCBvcGFjaXR5LAogICAgICAgICAgICAgICAgICAgJyIgLz4nKTsKICAgIH0KICB9CgogIGNvbnRleHRQcm90b3R5cGUuZmlsbCA9IGZ1bmN0aW9uKCkgewogICAgdGhpcy5zdHJva2UodHJ1ZSk7CiAgfTsKCiAgY29udGV4dFByb3RvdHlwZS5jbG9zZVBhdGggPSBmdW5jdGlvbigpIHsKICAgIHRoaXMuY3VycmVudFBhdGhfLnB1c2goe3R5cGU6ICdjbG9zZSd9KTsKICB9OwoKICBmdW5jdGlvbiBnZXRDb29yZHMoY3R4LCBhWCwgYVkpIHsKICAgIHZhciBtID0gY3R4Lm1fOwogICAgcmV0dXJuIHsKICAgICAgeDogWiAqIChhWCAqIG1bMF1bMF0gKyBhWSAqIG1bMV1bMF0gKyBtWzJdWzBdKSAtIFoyLAogICAgICB5OiBaICogKGFYICogbVswXVsxXSArIGFZICogbVsxXVsxXSArIG1bMl1bMV0pIC0gWjIKICAgIH07CiAgfTsKCiAgY29udGV4dFByb3RvdHlwZS5zYXZlID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgbyA9IHt9OwogICAgY29weVN0YXRlKHRoaXMsIG8pOwogICAgdGhpcy5hU3RhY2tfLnB1c2gobyk7CiAgICB0aGlzLm1TdGFja18ucHVzaCh0aGlzLm1fKTsKICAgIHRoaXMubV8gPSBtYXRyaXhNdWx0aXBseShjcmVhdGVNYXRyaXhJZGVudGl0eSgpLCB0aGlzLm1fKTsKICB9OwoKICBjb250ZXh0UHJvdG90eXBlLnJlc3RvcmUgPSBmdW5jdGlvbigpIHsKICAgIGlmICh0aGlzLmFTdGFja18ubGVuZ3RoKSB7CiAgICAgIGNvcHlTdGF0ZSh0aGlzLmFTdGFja18ucG9wKCksIHRoaXMpOwogICAgICB0aGlzLm1fID0gdGhpcy5tU3RhY2tfLnBvcCgpOwogICAgfQogIH07CgogIGZ1bmN0aW9uIG1hdHJpeElzRmluaXRlKG0pIHsKICAgIHJldHVybiBpc0Zpbml0ZShtWzBdWzBdKSAmJiBpc0Zpbml0ZShtWzBdWzFdKSAmJgogICAgICAgIGlzRmluaXRlKG1bMV1bMF0pICYmIGlzRmluaXRlKG1bMV1bMV0pICYmCiAgICAgICAgaXNGaW5pdGUobVsyXVswXSkgJiYgaXNGaW5pdGUobVsyXVsxXSk7CiAgfQoKICBmdW5jdGlvbiBzZXRNKGN0eCwgbSwgdXBkYXRlTGluZVNjYWxlKSB7CiAgICBpZiAoIW1hdHJpeElzRmluaXRlKG0pKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGN0eC5tXyA9IG07CgogICAgaWYgKHVwZGF0ZUxpbmVTY2FsZSkgewogICAgICAvLyBHZXQgdGhlIGxpbmUgc2NhbGUuCiAgICAgIC8vIERldGVybWluYW50IG9mIHRoaXMubV8gbWVhbnMgaG93IG11Y2ggdGhlIGFyZWEgaXMgZW5sYXJnZWQgYnkgdGhlCiAgICAgIC8vIHRyYW5zZm9ybWF0aW9uLiBTbyBpdHMgc3F1YXJlIHJvb3QgY2FuIGJlIHVzZWQgYXMgYSBzY2FsZSBmYWN0b3IKICAgICAgLy8gZm9yIHdpZHRoLgogICAgICB2YXIgZGV0ID0gbVswXVswXSAqIG1bMV1bMV0gLSBtWzBdWzFdICogbVsxXVswXTsKICAgICAgY3R4LmxpbmVTY2FsZV8gPSBzcXJ0KGFicyhkZXQpKTsKICAgIH0KICB9CgogIGNvbnRleHRQcm90b3R5cGUudHJhbnNsYXRlID0gZnVuY3Rpb24oYVgsIGFZKSB7CiAgICB2YXIgbTEgPSBbCiAgICAgIFsxLCAgMCwgIDBdLAogICAgICBbMCwgIDEsICAwXSwKICAgICAgW2FYLCBhWSwgMV0KICAgIF07CgogICAgc2V0TSh0aGlzLCBtYXRyaXhNdWx0aXBseShtMSwgdGhpcy5tXyksIGZhbHNlKTsKICB9OwoKICBjb250ZXh0UHJvdG90eXBlLnJvdGF0ZSA9IGZ1bmN0aW9uKGFSb3QpIHsKICAgIHZhciBjID0gbWMoYVJvdCk7CiAgICB2YXIgcyA9IG1zKGFSb3QpOwoKICAgIHZhciBtMSA9IFsKICAgICAgW2MsICBzLCAwXSwKICAgICAgWy1zLCBjLCAwXSwKICAgICAgWzAsICAwLCAxXQogICAgXTsKCiAgICBzZXRNKHRoaXMsIG1hdHJpeE11bHRpcGx5KG0xLCB0aGlzLm1fKSwgZmFsc2UpOwogIH07CgogIGNvbnRleHRQcm90b3R5cGUuc2NhbGUgPSBmdW5jdGlvbihhWCwgYVkpIHsKICAgIHRoaXMuYXJjU2NhbGVYXyAqPSBhWDsKICAgIHRoaXMuYXJjU2NhbGVZXyAqPSBhWTsKICAgIHZhciBtMSA9IFsKICAgICAgW2FYLCAwLCAgMF0sCiAgICAgIFswLCAgYVksIDBdLAogICAgICBbMCwgIDAsICAxXQogICAgXTsKCiAgICBzZXRNKHRoaXMsIG1hdHJpeE11bHRpcGx5KG0xLCB0aGlzLm1fKSwgdHJ1ZSk7CiAgfTsKCiAgY29udGV4dFByb3RvdHlwZS50cmFuc2Zvcm0gPSBmdW5jdGlvbihtMTEsIG0xMiwgbTIxLCBtMjIsIGR4LCBkeSkgewogICAgdmFyIG0xID0gWwogICAgICBbbTExLCBtMTIsIDBdLAogICAgICBbbTIxLCBtMjIsIDBdLAogICAgICBbZHgsICBkeSwgIDFdCiAgICBdOwoKICAgIHNldE0odGhpcywgbWF0cml4TXVsdGlwbHkobTEsIHRoaXMubV8pLCB0cnVlKTsKICB9OwoKICBjb250ZXh0UHJvdG90eXBlLnNldFRyYW5zZm9ybSA9IGZ1bmN0aW9uKG0xMSwgbTEyLCBtMjEsIG0yMiwgZHgsIGR5KSB7CiAgICB2YXIgbSA9IFsKICAgICAgW20xMSwgbTEyLCAwXSwKICAgICAgW20yMSwgbTIyLCAwXSwKICAgICAgW2R4LCAgZHksICAxXQogICAgXTsKCiAgICBzZXRNKHRoaXMsIG0sIHRydWUpOwogIH07CgogIC8qKgogICAqIFRoZSB0ZXh0IGRyYXdpbmcgZnVuY3Rpb24uCiAgICogVGhlIG1heFdpZHRoIGFyZ3VtZW50IGlzbid0IHRha2VuIGluIGFjY291bnQsIHNpbmNlIG5vIGJyb3dzZXIgc3VwcG9ydHMKICAgKiBpdCB5ZXQuCiAgICovCiAgY29udGV4dFByb3RvdHlwZS5kcmF3VGV4dF8gPSBmdW5jdGlvbih0ZXh0LCB4LCB5LCBtYXhXaWR0aCwgc3Ryb2tlKSB7CiAgICB2YXIgbSA9IHRoaXMubV8sCiAgICAgICAgZGVsdGEgPSAxMDAwLAogICAgICAgIGxlZnQgPSAwLAogICAgICAgIHJpZ2h0ID0gZGVsdGEsCiAgICAgICAgb2Zmc2V0ID0ge3g6IDAsIHk6IDB9LAogICAgICAgIGxpbmVTdHIgPSBbXTsKCiAgICB2YXIgZm9udFN0eWxlID0gZ2V0Q29tcHV0ZWRTdHlsZShwcm9jZXNzRm9udFN0eWxlKHRoaXMuZm9udCksIHRoaXMuZWxlbWVudF8pOwoKICAgIHZhciBmb250U3R5bGVTdHJpbmcgPSBidWlsZFN0eWxlKGZvbnRTdHlsZSk7CgogICAgdmFyIGVsZW1lbnRTdHlsZSA9IHRoaXMuZWxlbWVudF8uY3VycmVudFN0eWxlOwogICAgdmFyIHRleHRBbGlnbiA9IHRoaXMudGV4dEFsaWduLnRvTG93ZXJDYXNlKCk7CiAgICBzd2l0Y2ggKHRleHRBbGlnbikgewogICAgICBjYXNlICdsZWZ0JzoKICAgICAgY2FzZSAnY2VudGVyJzoKICAgICAgY2FzZSAncmlnaHQnOgogICAgICAgIGJyZWFrOwogICAgICBjYXNlICdlbmQnOgogICAgICAgIHRleHRBbGlnbiA9IGVsZW1lbnRTdHlsZS5kaXJlY3Rpb24gPT0gJ2x0cicgPyAncmlnaHQnIDogJ2xlZnQnOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICdzdGFydCc6CiAgICAgICAgdGV4dEFsaWduID0gZWxlbWVudFN0eWxlLmRpcmVjdGlvbiA9PSAncnRsJyA/ICdyaWdodCcgOiAnbGVmdCc7CiAgICAgICAgYnJlYWs7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgdGV4dEFsaWduID0gJ2xlZnQnOwogICAgfQoKICAgIC8vIDEuNzUgaXMgYW4gYXJiaXRyYXJ5IG51bWJlciwgYXMgdGhlcmUgaXMgbm8gaW5mbyBhYm91dCB0aGUgdGV4dCBiYXNlbGluZQogICAgc3dpdGNoICh0aGlzLnRleHRCYXNlbGluZSkgewogICAgICBjYXNlICdoYW5naW5nJzoKICAgICAgY2FzZSAndG9wJzoKICAgICAgICBvZmZzZXQueSA9IGZvbnRTdHlsZS5zaXplIC8gMS43NTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAnbWlkZGxlJzoKICAgICAgICBicmVhazsKICAgICAgZGVmYXVsdDoKICAgICAgY2FzZSBudWxsOgogICAgICBjYXNlICdhbHBoYWJldGljJzoKICAgICAgY2FzZSAnaWRlb2dyYXBoaWMnOgogICAgICBjYXNlICdib3R0b20nOgogICAgICAgIG9mZnNldC55ID0gLWZvbnRTdHlsZS5zaXplIC8gMi4yNTsKICAgICAgICBicmVhazsKICAgIH0KCiAgICBzd2l0Y2godGV4dEFsaWduKSB7CiAgICAgIGNhc2UgJ3JpZ2h0JzoKICAgICAgICBsZWZ0ID0gZGVsdGE7CiAgICAgICAgcmlnaHQgPSAwLjA1OwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICdjZW50ZXInOgogICAgICAgIGxlZnQgPSByaWdodCA9IGRlbHRhIC8gMjsKICAgICAgICBicmVhazsKICAgIH0KCiAgICB2YXIgZCA9IGdldENvb3Jkcyh0aGlzLCB4ICsgb2Zmc2V0LngsIHkgKyBvZmZzZXQueSk7CgogICAgbGluZVN0ci5wdXNoKCc8Z192bWxfOmxpbmUgZnJvbT0iJywgLWxlZnQgLCcgMCIgdG89IicsIHJpZ2h0ICwnIDAuMDUiICcsCiAgICAgICAgICAgICAgICAgJyBjb29yZHNpemU9IjEwMCAxMDAiIGNvb3Jkb3JpZ2luPSIwIDAiJywKICAgICAgICAgICAgICAgICAnIGZpbGxlZD0iJywgIXN0cm9rZSwgJyIgc3Ryb2tlZD0iJywgISFzdHJva2UsCiAgICAgICAgICAgICAgICAgJyIgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3dpZHRoOjFweDtoZWlnaHQ6MXB4OyI+Jyk7CgogICAgaWYgKHN0cm9rZSkgewogICAgICBhcHBlbmRTdHJva2UodGhpcywgbGluZVN0cik7CiAgICB9IGVsc2UgewogICAgICAvLyBUT0RPOiBGaXggdGhlIG1pbiBhbmQgbWF4IHBhcmFtcy4KICAgICAgYXBwZW5kRmlsbCh0aGlzLCBsaW5lU3RyLCB7eDogLWxlZnQsIHk6IDB9LAogICAgICAgICAgICAgICAgIHt4OiByaWdodCwgeTogZm9udFN0eWxlLnNpemV9KTsKICAgIH0KCiAgICB2YXIgc2tld00gPSBtWzBdWzBdLnRvRml4ZWQoMykgKyAnLCcgKyBtWzFdWzBdLnRvRml4ZWQoMykgKyAnLCcgKwogICAgICAgICAgICAgICAgbVswXVsxXS50b0ZpeGVkKDMpICsgJywnICsgbVsxXVsxXS50b0ZpeGVkKDMpICsgJywwLDAnOwoKICAgIHZhciBza2V3T2Zmc2V0ID0gbXIoZC54IC8gWiArIDEgLSBtWzBdWzBdKSArICcsJyArIG1yKGQueSAvIFogLSAyICogbVsxXVswXSk7CgoKICAgIGxpbmVTdHIucHVzaCgnPGdfdm1sXzpza2V3IG9uPSJ0IiBtYXRyaXg9IicsIHNrZXdNICwnIiAnLAogICAgICAgICAgICAgICAgICcgb2Zmc2V0PSInLCBza2V3T2Zmc2V0LCAnIiBvcmlnaW49IicsIGxlZnQgLCcgMCIgLz4nLAogICAgICAgICAgICAgICAgICc8Z192bWxfOnBhdGggdGV4dHBhdGhvaz0idHJ1ZSIgLz4nLAogICAgICAgICAgICAgICAgICc8Z192bWxfOnRleHRwYXRoIG9uPSJ0cnVlIiBzdHJpbmc9IicsCiAgICAgICAgICAgICAgICAgZW5jb2RlSHRtbEF0dHJpYnV0ZSh0ZXh0KSwKICAgICAgICAgICAgICAgICAnIiBzdHlsZT0idi10ZXh0LWFsaWduOicsIHRleHRBbGlnbiwKICAgICAgICAgICAgICAgICAnO2ZvbnQ6JywgZW5jb2RlSHRtbEF0dHJpYnV0ZShmb250U3R5bGVTdHJpbmcpLAogICAgICAgICAgICAgICAgICciIC8+PC9nX3ZtbF86bGluZT4nKTsKCiAgICB0aGlzLmVsZW1lbnRfLmluc2VydEFkamFjZW50SFRNTCgnYmVmb3JlRW5kJywgbGluZVN0ci5qb2luKCcnKSk7CiAgfTsKCiAgY29udGV4dFByb3RvdHlwZS5maWxsVGV4dCA9IGZ1bmN0aW9uKHRleHQsIHgsIHksIG1heFdpZHRoKSB7CiAgICB0aGlzLmRyYXdUZXh0Xyh0ZXh0LCB4LCB5LCBtYXhXaWR0aCwgZmFsc2UpOwogIH07CgogIGNvbnRleHRQcm90b3R5cGUuc3Ryb2tlVGV4dCA9IGZ1bmN0aW9uKHRleHQsIHgsIHksIG1heFdpZHRoKSB7CiAgICB0aGlzLmRyYXdUZXh0Xyh0ZXh0LCB4LCB5LCBtYXhXaWR0aCwgdHJ1ZSk7CiAgfTsKCiAgY29udGV4dFByb3RvdHlwZS5tZWFzdXJlVGV4dCA9IGZ1bmN0aW9uKHRleHQpIHsKICAgIGlmICghdGhpcy50ZXh0TWVhc3VyZUVsXykgewogICAgICB2YXIgcyA9ICc8c3BhbiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7JyArCiAgICAgICAgICAndG9wOi0yMDAwMHB4O2xlZnQ6MDtwYWRkaW5nOjA7bWFyZ2luOjA7Ym9yZGVyOm5vbmU7JyArCiAgICAgICAgICAnd2hpdGUtc3BhY2U6cHJlOyI+PC9zcGFuPic7CiAgICAgIHRoaXMuZWxlbWVudF8uaW5zZXJ0QWRqYWNlbnRIVE1MKCdiZWZvcmVFbmQnLCBzKTsKICAgICAgdGhpcy50ZXh0TWVhc3VyZUVsXyA9IHRoaXMuZWxlbWVudF8ubGFzdENoaWxkOwogICAgfQogICAgdmFyIGRvYyA9IHRoaXMuZWxlbWVudF8ub3duZXJEb2N1bWVudDsKICAgIHRoaXMudGV4dE1lYXN1cmVFbF8uaW5uZXJIVE1MID0gJyc7CiAgICB0aGlzLnRleHRNZWFzdXJlRWxfLnN0eWxlLmZvbnQgPSB0aGlzLmZvbnQ7CiAgICAvLyBEb24ndCB1c2UgaW5uZXJIVE1MIG9yIGlubmVyVGV4dCBiZWNhdXNlIHRoZXkgYWxsb3cgbWFya3VwL3doaXRlc3BhY2UuCiAgICB0aGlzLnRleHRNZWFzdXJlRWxfLmFwcGVuZENoaWxkKGRvYy5jcmVhdGVUZXh0Tm9kZSh0ZXh0KSk7CiAgICByZXR1cm4ge3dpZHRoOiB0aGlzLnRleHRNZWFzdXJlRWxfLm9mZnNldFdpZHRofTsKICB9OwoKICAvKioqKioqKiogU1RVQlMgKioqKioqKiovCiAgY29udGV4dFByb3RvdHlwZS5jbGlwID0gZnVuY3Rpb24oKSB7CiAgICAvLyBUT0RPOiBJbXBsZW1lbnQKICB9OwoKICBjb250ZXh0UHJvdG90eXBlLmFyY1RvID0gZnVuY3Rpb24oKSB7CiAgICAvLyBUT0RPOiBJbXBsZW1lbnQKICB9OwoKICBjb250ZXh0UHJvdG90eXBlLmNyZWF0ZVBhdHRlcm4gPSBmdW5jdGlvbihpbWFnZSwgcmVwZXRpdGlvbikgewogICAgcmV0dXJuIG5ldyBDYW52YXNQYXR0ZXJuXyhpbWFnZSwgcmVwZXRpdGlvbik7CiAgfTsKCiAgLy8gR3JhZGllbnQgLyBQYXR0ZXJuIFN0dWJzCiAgZnVuY3Rpb24gQ2FudmFzR3JhZGllbnRfKGFUeXBlKSB7CiAgICB0aGlzLnR5cGVfID0gYVR5cGU7CiAgICB0aGlzLngwXyA9IDA7CiAgICB0aGlzLnkwXyA9IDA7CiAgICB0aGlzLnIwXyA9IDA7CiAgICB0aGlzLngxXyA9IDA7CiAgICB0aGlzLnkxXyA9IDA7CiAgICB0aGlzLnIxXyA9IDA7CiAgICB0aGlzLmNvbG9yc18gPSBbXTsKICB9CgogIENhbnZhc0dyYWRpZW50Xy5wcm90b3R5cGUuYWRkQ29sb3JTdG9wID0gZnVuY3Rpb24oYU9mZnNldCwgYUNvbG9yKSB7CiAgICBhQ29sb3IgPSBwcm9jZXNzU3R5bGUoYUNvbG9yKTsKICAgIHRoaXMuY29sb3JzXy5wdXNoKHtvZmZzZXQ6IGFPZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6IGFDb2xvci5jb2xvciwKICAgICAgICAgICAgICAgICAgICAgICBhbHBoYTogYUNvbG9yLmFscGhhfSk7CiAgfTsKCiAgZnVuY3Rpb24gQ2FudmFzUGF0dGVybl8oaW1hZ2UsIHJlcGV0aXRpb24pIHsKICAgIGFzc2VydEltYWdlSXNWYWxpZChpbWFnZSk7CiAgICBzd2l0Y2ggKHJlcGV0aXRpb24pIHsKICAgICAgY2FzZSAncmVwZWF0JzoKICAgICAgY2FzZSBudWxsOgogICAgICBjYXNlICcnOgogICAgICAgIHRoaXMucmVwZXRpdGlvbl8gPSAncmVwZWF0JzsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAncmVwZWF0LXgnOgogICAgICBjYXNlICdyZXBlYXQteSc6CiAgICAgIGNhc2UgJ25vLXJlcGVhdCc6CiAgICAgICAgdGhpcy5yZXBldGl0aW9uXyA9IHJlcGV0aXRpb247CiAgICAgICAgYnJlYWs7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgdGhyb3dFeGNlcHRpb24oJ1NZTlRBWF9FUlInKTsKICAgIH0KCiAgICB0aGlzLnNyY18gPSBpbWFnZS5zcmM7CiAgICB0aGlzLndpZHRoXyA9IGltYWdlLndpZHRoOwogICAgdGhpcy5oZWlnaHRfID0gaW1hZ2UuaGVpZ2h0OwogIH0KCiAgZnVuY3Rpb24gdGhyb3dFeGNlcHRpb24ocykgewogICAgdGhyb3cgbmV3IERPTUV4Y2VwdGlvbl8ocyk7CiAgfQoKICBmdW5jdGlvbiBhc3NlcnRJbWFnZUlzVmFsaWQoaW1nKSB7CiAgICBpZiAoIWltZyB8fCBpbWcubm9kZVR5cGUgIT0gMSB8fCBpbWcudGFnTmFtZSAhPSAnSU1HJykgewogICAgICB0aHJvd0V4Y2VwdGlvbignVFlQRV9NSVNNQVRDSF9FUlInKTsKICAgIH0KICAgIGlmIChpbWcucmVhZHlTdGF0ZSAhPSAnY29tcGxldGUnKSB7CiAgICAgIHRocm93RXhjZXB0aW9uKCdJTlZBTElEX1NUQVRFX0VSUicpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gRE9NRXhjZXB0aW9uXyhzKSB7CiAgICB0aGlzLmNvZGUgPSB0aGlzW3NdOwogICAgdGhpcy5tZXNzYWdlID0gcyArJzogRE9NIEV4Y2VwdGlvbiAnICsgdGhpcy5jb2RlOwogIH0KICB2YXIgcCA9IERPTUV4Y2VwdGlvbl8ucHJvdG90eXBlID0gbmV3IEVycm9yOwogIHAuSU5ERVhfU0laRV9FUlIgPSAxOwogIHAuRE9NU1RSSU5HX1NJWkVfRVJSID0gMjsKICBwLkhJRVJBUkNIWV9SRVFVRVNUX0VSUiA9IDM7CiAgcC5XUk9OR19ET0NVTUVOVF9FUlIgPSA0OwogIHAuSU5WQUxJRF9DSEFSQUNURVJfRVJSID0gNTsKICBwLk5PX0RBVEFfQUxMT1dFRF9FUlIgPSA2OwogIHAuTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSID0gNzsKICBwLk5PVF9GT1VORF9FUlIgPSA4OwogIHAuTk9UX1NVUFBPUlRFRF9FUlIgPSA5OwogIHAuSU5VU0VfQVRUUklCVVRFX0VSUiA9IDEwOwogIHAuSU5WQUxJRF9TVEFURV9FUlIgPSAxMTsKICBwLlNZTlRBWF9FUlIgPSAxMjsKICBwLklOVkFMSURfTU9ESUZJQ0FUSU9OX0VSUiA9IDEzOwogIHAuTkFNRVNQQUNFX0VSUiA9IDE0OwogIHAuSU5WQUxJRF9BQ0NFU1NfRVJSID0gMTU7CiAgcC5WQUxJREFUSU9OX0VSUiA9IDE2OwogIHAuVFlQRV9NSVNNQVRDSF9FUlIgPSAxNzsKCiAgLy8gc2V0IHVwIGV4dGVybnMKICBHX3ZtbENhbnZhc01hbmFnZXIgPSBHX3ZtbENhbnZhc01hbmFnZXJfOwogIENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCA9IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRF87CiAgQ2FudmFzR3JhZGllbnQgPSBDYW52YXNHcmFkaWVudF87CiAgQ2FudmFzUGF0dGVybiA9IENhbnZhc1BhdHRlcm5fOwogIERPTUV4Y2VwdGlvbiA9IERPTUV4Y2VwdGlvbl87CiAgR192bWxDYW52YXNNYW5hZ2VyLl92ZXJzaW9uID0gODg4Owp9KSgpOwoKfSAvLyBpZgo=]]></data>
	</file>
	<file>
	  <filename>/src/excanvas.min.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqCiAqIGpxUGxvdAogKiBQdXJlIEphdmFTY3JpcHQgcGxvdHRpbmcgcGx1Z2luIHVzaW5nIGpRdWVyeQogKgogKiBWZXJzaW9uOiBAVkVSU0lPTgogKgogKiBDb3B5cmlnaHQgKGMpIDIwMDktMjAxMSBDaHJpcyBMZW9uZWxsbwogKiBqcVBsb3QgaXMgY3VycmVudGx5IGF2YWlsYWJsZSBmb3IgdXNlIGluIGFsbCBwZXJzb25hbCBvciBjb21tZXJjaWFsIHByb2plY3RzIAogKiB1bmRlciBib3RoIHRoZSBNSVQgKGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbWl0LWxpY2Vuc2UucGhwKSBhbmQgR1BMIAogKiB2ZXJzaW9uIDIuMCAoaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAuaHRtbCkgbGljZW5zZXMuIFRoaXMgbWVhbnMgdGhhdCB5b3UgY2FuIAogKiBjaG9vc2UgdGhlIGxpY2Vuc2UgdGhhdCBiZXN0IHN1aXRzIHlvdXIgcHJvamVjdCBhbmQgdXNlIGl0IGFjY29yZGluZ2x5LiAKICoKICogQWx0aG91Z2ggbm90IHJlcXVpcmVkLCB0aGUgYXV0aG9yIHdvdWxkIGFwcHJlY2lhdGUgYW4gZW1haWwgbGV0dGluZyBoaW0gCiAqIGtub3cgb2YgYW55IHN1YnN0YW50aWFsIHVzZSBvZiBqcVBsb3QuICBZb3UgY2FuIHJlYWNoIHRoZSBhdXRob3IgYXQ6IAogKiBjaHJpcyBhdCBqcXBsb3QgZG90IGNvbSBvciBzZWUgaHR0cDovL3d3dy5qcXBsb3QuY29tL2luZm8ucGhwIC4KICoKICogSWYgeW91IGFyZSBmZWVsaW5nIGtpbmQgYW5kIGdlbmVyb3VzLCBjb25zaWRlciBzdXBwb3J0aW5nIHRoZSBwcm9qZWN0IGJ5CiAqIG1ha2luZyBhIGRvbmF0aW9uIGF0OiBodHRwOi8vd3d3LmpxcGxvdC5jb20vZG9uYXRlLnBocCAuCiAqCiAqIHNwcmludGYgZnVuY3Rpb25zIGNvbnRhaW5lZCBpbiBqcXBsb3Quc3ByaW50Zi5qcyBieSBBc2ggU2VhcmxlOgogKgogKiAgICAgdmVyc2lvbiAyMDA3LjA0LjI3CiAqICAgICBhdXRob3IgQXNoIFNlYXJsZQogKiAgICAgaHR0cDovL2hleG1lbi5jb20vYmxvZy8yMDA3LzAzL3ByaW50Zi1zcHJpbnRmLwogKiAgICAgaHR0cDovL2hleG1lbi5jb20vanMvc3ByaW50Zi5qcwogKiAgICAgVGhlIGF1dGhvciAoQXNoIFNlYXJsZSkgaGFzIHBsYWNlZCB0aGlzIGNvZGUgaW4gdGhlIHB1YmxpYyBkb21haW46CiAqICAgICAiVGhpcyBjb2RlIGlzIHVucmVzdHJpY3RlZDogeW91IGFyZSBmcmVlIHRvIHVzZSBpdCBob3dldmVyIHlvdSBsaWtlLiIKICoKICogaW5jbHVkZWQganNEYXRlIGxpYnJhcnkgYnkgQ2hyaXMgTGVvbmVsbG86CiAqCiAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExIENocmlzIExlb25lbGxvCiAqCiAqIGpzRGF0ZSBpcyBjdXJyZW50bHkgYXZhaWxhYmxlIGZvciB1c2UgaW4gYWxsIHBlcnNvbmFsIG9yIGNvbW1lcmNpYWwgcHJvamVjdHMgCiAqIHVuZGVyIGJvdGggdGhlIE1JVCBhbmQgR1BMIHZlcnNpb24gMi4wIGxpY2Vuc2VzLiBUaGlzIG1lYW5zIHRoYXQgeW91IGNhbiAKICogY2hvb3NlIHRoZSBsaWNlbnNlIHRoYXQgYmVzdCBzdWl0cyB5b3VyIHByb2plY3QgYW5kIHVzZSBpdCBhY2NvcmRpbmdseS4KICoKICoganNEYXRlIGJvcnJvd3MgbWFueSBjb25jZXB0cyBhbmQgaWRlYXMgZnJvbSB0aGUgRGF0ZSBJbnN0YW5jZSAKICogTWV0aG9kcyBieSBLZW4gU255ZGVyIGFsb25nIHdpdGggc29tZSBwYXJ0cyBvZiBLZW4ncyBhY3R1YWwgY29kZS4KICogCiAqIEtlbidzIG9yaWdpYW5sIERhdGUgSW5zdGFuY2UgTWV0aG9kcyBhbmQgY29weXJpZ2h0IG5vdGljZToKICogCiAqIEtlbiBTbnlkZXIgKGtlbiBkIHNueWRlciBhdCBnbWFpbCBkb3QgY29tKQogKiAyMDA4LTA5LTEwCiAqIHZlcnNpb24gMi4wLjIgKGh0dHA6Ly9rZW5kc255ZGVyLmNvbS9zYW5kYm94L2RhdGUvKSAgICAgCiAqIENyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24gTGljZW5zZSAzLjAgKGh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LzMuMC8pCiAqCiAqIGpxcGxvdFRvSW1hZ2UgZnVuY3Rpb24gYmFzZWQgb24gTGFycnkgU2lkZW4ncyBleHBvcnQtanFwbG90LXRvLXBuZy5qcy4KICogTGFycnkgaGFzIGdlbmVyb3VzbHkgZ2l2ZW4gcGVybWlzc2lvbiB0byBhZGFwdCBoaXMgY29kZSBmb3IgaW5jbHVzaW9uCiAqIGludG8ganFQbG90LgogKgogKiBMYXJyeSdzIG9yaWdpbmFsIGNvZGUgY2FuIGJlIGZvdW5kIGhlcmU6CiAqCiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9sc2lkZW4vZXhwb3J0LWpxcGxvdC10by1wbmcKICogCiAqIAogKi8KaWYoIWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpLmdldENvbnRleHQpeyhmdW5jdGlvbigpe3ZhciBhYj1NYXRoO3ZhciBuPWFiLnJvdW5kO3ZhciBsPWFiLnNpbjt2YXIgQT1hYi5jb3M7dmFyIEg9YWIuYWJzO3ZhciBOPWFiLnNxcnQ7dmFyIGQ9MTA7dmFyIGY9ZC8yO3ZhciB6PStuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9NU0lFIChbXGQuXSspPy8pWzFdO2Z1bmN0aW9uIHkoKXtyZXR1cm4gdGhpcy5jb250ZXh0X3x8KHRoaXMuY29udGV4dF89bmV3IEQodGhpcykpfXZhciB0PUFycmF5LnByb3RvdHlwZS5zbGljZTtmdW5jdGlvbiBnKGosbSxwKXt2YXIgaT10LmNhbGwoYXJndW1lbnRzLDIpO3JldHVybiBmdW5jdGlvbigpe3JldHVybiBqLmFwcGx5KG0saS5jb25jYXQodC5jYWxsKGFyZ3VtZW50cykpKX19ZnVuY3Rpb24gYWYoaSl7cmV0dXJuIFN0cmluZyhpKS5yZXBsYWNlKC8mL2csIiZhbXA7IikucmVwbGFjZSgvIi9nLCImcXVvdDsiKX1mdW5jdGlvbiBZKG0saixpKXtpZighbS5uYW1lc3BhY2VzW2pdKXttLm5hbWVzcGFjZXMuYWRkKGosaSwiI2RlZmF1bHQjVk1MIil9fWZ1bmN0aW9uIFIoail7WShqLCJnX3ZtbF8iLCJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOnZtbCIpO1koaiwiZ19vXyIsInVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIpO2lmKCFqLnN0eWxlU2hlZXRzLmV4X2NhbnZhc18pe3ZhciBpPWouY3JlYXRlU3R5bGVTaGVldCgpO2kub3duaW5nRWxlbWVudC5pZD0iZXhfY2FudmFzXyI7aS5jc3NUZXh0PSJjYW52YXN7ZGlzcGxheTppbmxpbmUtYmxvY2s7b3ZlcmZsb3c6aGlkZGVuO3RleHQtYWxpZ246bGVmdDt3aWR0aDozMDBweDtoZWlnaHQ6MTUwcHh9In19Uihkb2N1bWVudCk7dmFyIGU9e2luaXQ6ZnVuY3Rpb24oaSl7dmFyIGo9aXx8ZG9jdW1lbnQ7ai5jcmVhdGVFbGVtZW50KCJjYW52YXMiKTtqLmF0dGFjaEV2ZW50KCJvbnJlYWR5c3RhdGVjaGFuZ2UiLGcodGhpcy5pbml0Xyx0aGlzLGopKX0saW5pdF86ZnVuY3Rpb24ocCl7dmFyIG09cC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiY2FudmFzIik7Zm9yKHZhciBqPTA7ajxtLmxlbmd0aDtqKyspe3RoaXMuaW5pdEVsZW1lbnQobVtqXSl9fSxpbml0RWxlbWVudDpmdW5jdGlvbihqKXtpZighai5nZXRDb250ZXh0KXtqLmdldENvbnRleHQ9eTtSKGoub3duZXJEb2N1bWVudCk7ai5pbm5lckhUTUw9IiI7ai5hdHRhY2hFdmVudCgib25wcm9wZXJ0eWNoYW5nZSIseCk7ai5hdHRhY2hFdmVudCgib25yZXNpemUiLFcpO3ZhciBpPWouYXR0cmlidXRlcztpZihpLndpZHRoJiZpLndpZHRoLnNwZWNpZmllZCl7ai5zdHlsZS53aWR0aD1pLndpZHRoLm5vZGVWYWx1ZSsicHgifWVsc2V7ai53aWR0aD1qLmNsaWVudFdpZHRofWlmKGkuaGVpZ2h0JiZpLmhlaWdodC5zcGVjaWZpZWQpe2ouc3R5bGUuaGVpZ2h0PWkuaGVpZ2h0Lm5vZGVWYWx1ZSsicHgifWVsc2V7ai5oZWlnaHQ9ai5jbGllbnRIZWlnaHR9fXJldHVybiBqfSx1bmluaXRFbGVtZW50OmZ1bmN0aW9uKGope2lmKGouZ2V0Q29udGV4dCl7dmFyIGk9ai5nZXRDb250ZXh0KCk7ZGVsZXRlIGkuZWxlbWVudF87ZGVsZXRlIGkuY2FudmFzO2ouaW5uZXJIVE1MPSIiO2ouY29udGV4dF89bnVsbDtqLmdldENvbnRleHQ9bnVsbDtqLmRldGFjaEV2ZW50KCJvbnByb3BlcnR5Y2hhbmdlIix4KTtqLmRldGFjaEV2ZW50KCJvbnJlc2l6ZSIsVyl9fX07ZnVuY3Rpb24geChqKXt2YXIgaT1qLnNyY0VsZW1lbnQ7c3dpdGNoKGoucHJvcGVydHlOYW1lKXtjYXNlIndpZHRoIjppLmdldENvbnRleHQoKS5jbGVhclJlY3QoKTtpLnN0eWxlLndpZHRoPWkuYXR0cmlidXRlcy53aWR0aC5ub2RlVmFsdWUrInB4IjtpLmZpcnN0Q2hpbGQuc3R5bGUud2lkdGg9aS5jbGllbnRXaWR0aCsicHgiO2JyZWFrO2Nhc2UiaGVpZ2h0IjppLmdldENvbnRleHQoKS5jbGVhclJlY3QoKTtpLnN0eWxlLmhlaWdodD1pLmF0dHJpYnV0ZXMuaGVpZ2h0Lm5vZGVWYWx1ZSsicHgiO2kuZmlyc3RDaGlsZC5zdHlsZS5oZWlnaHQ9aS5jbGllbnRIZWlnaHQrInB4IjticmVha319ZnVuY3Rpb24gVyhqKXt2YXIgaT1qLnNyY0VsZW1lbnQ7aWYoaS5maXJzdENoaWxkKXtpLmZpcnN0Q2hpbGQuc3R5bGUud2lkdGg9aS5jbGllbnRXaWR0aCsicHgiO2kuZmlyc3RDaGlsZC5zdHlsZS5oZWlnaHQ9aS5jbGllbnRIZWlnaHQrInB4In19ZS5pbml0KCk7dmFyIGs9W107Zm9yKHZhciBhZT0wO2FlPDE2O2FlKyspe2Zvcih2YXIgYWQ9MDthZDwxNjthZCsrKXtrW2FlKjE2K2FkXT1hZS50b1N0cmluZygxNikrYWQudG9TdHJpbmcoMTYpfX1mdW5jdGlvbiBCKCl7cmV0dXJuW1sxLDAsMF0sWzAsMSwwXSxbMCwwLDFdXX1mdW5jdGlvbiBKKHAsbSl7dmFyIGo9QigpO2Zvcih2YXIgaT0wO2k8MztpKyspe2Zvcih2YXIgYWg9MDthaDwzO2FoKyspe3ZhciBaPTA7Zm9yKHZhciBhZz0wO2FnPDM7YWcrKyl7Wis9cFtpXVthZ10qbVthZ11bYWhdfWpbaV1bYWhdPVp9fXJldHVybiBqfWZ1bmN0aW9uIHYoaixpKXtpLmZpbGxTdHlsZT1qLmZpbGxTdHlsZTtpLmxpbmVDYXA9ai5saW5lQ2FwO2kubGluZUpvaW49ai5saW5lSm9pbjtpLmxpbmVXaWR0aD1qLmxpbmVXaWR0aDtpLm1pdGVyTGltaXQ9ai5taXRlckxpbWl0O2kuc2hhZG93Qmx1cj1qLnNoYWRvd0JsdXI7aS5zaGFkb3dDb2xvcj1qLnNoYWRvd0NvbG9yO2kuc2hhZG93T2Zmc2V0WD1qLnNoYWRvd09mZnNldFg7aS5zaGFkb3dPZmZzZXRZPWouc2hhZG93T2Zmc2V0WTtpLnN0cm9rZVN0eWxlPWouc3Ryb2tlU3R5bGU7aS5nbG9iYWxBbHBoYT1qLmdsb2JhbEFscGhhO2kuZm9udD1qLmZvbnQ7aS50ZXh0QWxpZ249ai50ZXh0QWxpZ247aS50ZXh0QmFzZWxpbmU9ai50ZXh0QmFzZWxpbmU7aS5hcmNTY2FsZVhfPWouYXJjU2NhbGVYXztpLmFyY1NjYWxlWV89ai5hcmNTY2FsZVlfO2kubGluZVNjYWxlXz1qLmxpbmVTY2FsZV99dmFyIGI9e2FsaWNlYmx1ZToiI0YwRjhGRiIsYW50aXF1ZXdoaXRlOiIjRkFFQkQ3IixhcXVhbWFyaW5lOiIjN0ZGRkQ0IixhenVyZToiI0YwRkZGRiIsYmVpZ2U6IiNGNUY1REMiLGJpc3F1ZToiI0ZGRTRDNCIsYmxhY2s6IiMwMDAwMDAiLGJsYW5jaGVkYWxtb25kOiIjRkZFQkNEIixibHVldmlvbGV0OiIjOEEyQkUyIixicm93bjoiI0E1MkEyQSIsYnVybHl3b29kOiIjREVCODg3IixjYWRldGJsdWU6IiM1RjlFQTAiLGNoYXJ0cmV1c2U6IiM3RkZGMDAiLGNob2NvbGF0ZToiI0QyNjkxRSIsY29yYWw6IiNGRjdGNTAiLGNvcm5mbG93ZXJibHVlOiIjNjQ5NUVEIixjb3Juc2lsazoiI0ZGRjhEQyIsY3JpbXNvbjoiI0RDMTQzQyIsY3lhbjoiIzAwRkZGRiIsZGFya2JsdWU6IiMwMDAwOEIiLGRhcmtjeWFuOiIjMDA4QjhCIixkYXJrZ29sZGVucm9kOiIjQjg4NjBCIixkYXJrZ3JheToiI0E5QTlBOSIsZGFya2dyZWVuOiIjMDA2NDAwIixkYXJrZ3JleToiI0E5QTlBOSIsZGFya2toYWtpOiIjQkRCNzZCIixkYXJrbWFnZW50YToiIzhCMDA4QiIsZGFya29saXZlZ3JlZW46IiM1NTZCMkYiLGRhcmtvcmFuZ2U6IiNGRjhDMDAiLGRhcmtvcmNoaWQ6IiM5OTMyQ0MiLGRhcmtyZWQ6IiM4QjAwMDAiLGRhcmtzYWxtb246IiNFOTk2N0EiLGRhcmtzZWFncmVlbjoiIzhGQkM4RiIsZGFya3NsYXRlYmx1ZToiIzQ4M0Q4QiIsZGFya3NsYXRlZ3JheToiIzJGNEY0RiIsZGFya3NsYXRlZ3JleToiIzJGNEY0RiIsZGFya3R1cnF1b2lzZToiIzAwQ0VEMSIsZGFya3Zpb2xldDoiIzk0MDBEMyIsZGVlcHBpbms6IiNGRjE0OTMiLGRlZXBza3libHVlOiIjMDBCRkZGIixkaW1ncmF5OiIjNjk2OTY5IixkaW1ncmV5OiIjNjk2OTY5Iixkb2RnZXJibHVlOiIjMUU5MEZGIixmaXJlYnJpY2s6IiNCMjIyMjIiLGZsb3JhbHdoaXRlOiIjRkZGQUYwIixmb3Jlc3RncmVlbjoiIzIyOEIyMiIsZ2FpbnNib3JvOiIjRENEQ0RDIixnaG9zdHdoaXRlOiIjRjhGOEZGIixnb2xkOiIjRkZENzAwIixnb2xkZW5yb2Q6IiNEQUE1MjAiLGdyZXk6IiM4MDgwODAiLGdyZWVueWVsbG93OiIjQURGRjJGIixob25leWRldzoiI0YwRkZGMCIsaG90cGluazoiI0ZGNjlCNCIsaW5kaWFucmVkOiIjQ0Q1QzVDIixpbmRpZ286IiM0QjAwODIiLGl2b3J5OiIjRkZGRkYwIixraGFraToiI0YwRTY4QyIsbGF2ZW5kZXI6IiNFNkU2RkEiLGxhdmVuZGVyYmx1c2g6IiNGRkYwRjUiLGxhd25ncmVlbjoiIzdDRkMwMCIsbGVtb25jaGlmZm9uOiIjRkZGQUNEIixsaWdodGJsdWU6IiNBREQ4RTYiLGxpZ2h0Y29yYWw6IiNGMDgwODAiLGxpZ2h0Y3lhbjoiI0UwRkZGRiIsbGlnaHRnb2xkZW5yb2R5ZWxsb3c6IiNGQUZBRDIiLGxpZ2h0Z3JlZW46IiM5MEVFOTAiLGxpZ2h0Z3JleToiI0QzRDNEMyIsbGlnaHRwaW5rOiIjRkZCNkMxIixsaWdodHNhbG1vbjoiI0ZGQTA3QSIsbGlnaHRzZWFncmVlbjoiIzIwQjJBQSIsbGlnaHRza3libHVlOiIjODdDRUZBIixsaWdodHNsYXRlZ3JheToiIzc3ODg5OSIsbGlnaHRzbGF0ZWdyZXk6IiM3Nzg4OTkiLGxpZ2h0c3RlZWxibHVlOiIjQjBDNERFIixsaWdodHllbGxvdzoiI0ZGRkZFMCIsbGltZWdyZWVuOiIjMzJDRDMyIixsaW5lbjoiI0ZBRjBFNiIsbWFnZW50YToiI0ZGMDBGRiIsbWVkaXVtYXF1YW1hcmluZToiIzY2Q0RBQSIsbWVkaXVtYmx1ZToiIzAwMDBDRCIsbWVkaXVtb3JjaGlkOiIjQkE1NUQzIixtZWRpdW1wdXJwbGU6IiM5MzcwREIiLG1lZGl1bXNlYWdyZWVuOiIjM0NCMzcxIixtZWRpdW1zbGF0ZWJsdWU6IiM3QjY4RUUiLG1lZGl1bXNwcmluZ2dyZWVuOiIjMDBGQTlBIixtZWRpdW10dXJxdW9pc2U6IiM0OEQxQ0MiLG1lZGl1bXZpb2xldHJlZDoiI0M3MTU4NSIsbWlkbmlnaHRibHVlOiIjMTkxOTcwIixtaW50Y3JlYW06IiNGNUZGRkEiLG1pc3R5cm9zZToiI0ZGRTRFMSIsbW9jY2FzaW46IiNGRkU0QjUiLG5hdmFqb3doaXRlOiIjRkZERUFEIixvbGRsYWNlOiIjRkRGNUU2IixvbGl2ZWRyYWI6IiM2QjhFMjMiLG9yYW5nZToiI0ZGQTUwMCIsb3JhbmdlcmVkOiIjRkY0NTAwIixvcmNoaWQ6IiNEQTcwRDYiLHBhbGVnb2xkZW5yb2Q6IiNFRUU4QUEiLHBhbGVncmVlbjoiIzk4RkI5OCIscGFsZXR1cnF1b2lzZToiI0FGRUVFRSIscGFsZXZpb2xldHJlZDoiI0RCNzA5MyIscGFwYXlhd2hpcDoiI0ZGRUZENSIscGVhY2hwdWZmOiIjRkZEQUI5IixwZXJ1OiIjQ0Q4NTNGIixwaW5rOiIjRkZDMENCIixwbHVtOiIjRERBMEREIixwb3dkZXJibHVlOiIjQjBFMEU2Iixyb3N5YnJvd246IiNCQzhGOEYiLHJveWFsYmx1ZToiIzQxNjlFMSIsc2FkZGxlYnJvd246IiM4QjQ1MTMiLHNhbG1vbjoiI0ZBODA3MiIsc2FuZHlicm93bjoiI0Y0QTQ2MCIsc2VhZ3JlZW46IiMyRThCNTciLHNlYXNoZWxsOiIjRkZGNUVFIixzaWVubmE6IiNBMDUyMkQiLHNreWJsdWU6IiM4N0NFRUIiLHNsYXRlYmx1ZToiIzZBNUFDRCIsc2xhdGVncmF5OiIjNzA4MDkwIixzbGF0ZWdyZXk6IiM3MDgwOTAiLHNub3c6IiNGRkZBRkEiLHNwcmluZ2dyZWVuOiIjMDBGRjdGIixzdGVlbGJsdWU6IiM0NjgyQjQiLHRhbjoiI0QyQjQ4QyIsdGhpc3RsZToiI0Q4QkZEOCIsdG9tYXRvOiIjRkY2MzQ3Iix0dXJxdW9pc2U6IiM0MEUwRDAiLHZpb2xldDoiI0VFODJFRSIsd2hlYXQ6IiNGNURFQjMiLHdoaXRlc21va2U6IiNGNUY1RjUiLHllbGxvd2dyZWVuOiIjOUFDRDMyIn07ZnVuY3Rpb24gTShqKXt2YXIgcD1qLmluZGV4T2YoIigiLDMpO3ZhciBpPWouaW5kZXhPZigiKSIscCsxKTt2YXIgbT1qLnN1YnN0cmluZyhwKzEsaSkuc3BsaXQoIiwiKTtpZihtLmxlbmd0aCE9NHx8ai5jaGFyQXQoMykhPSJhIil7bVszXT0xfXJldHVybiBtfWZ1bmN0aW9uIGMoaSl7cmV0dXJuIHBhcnNlRmxvYXQoaSkvMTAwfWZ1bmN0aW9uIHIoaixtLGkpe3JldHVybiBNYXRoLm1pbihpLE1hdGgubWF4KG0saikpfWZ1bmN0aW9uIEkoYWcpe3ZhciBpLGFpLGFqLGFoLGFrLFo7YWg9cGFyc2VGbG9hdChhZ1swXSkvMzYwJTM2MDtpZihhaDwwKXthaCsrfWFrPXIoYyhhZ1sxXSksMCwxKTtaPXIoYyhhZ1syXSksMCwxKTtpZihhaz09MCl7aT1haT1haj1afWVsc2V7dmFyIGo9WjwwLjU/WiooMSthayk6Withay1aKmFrO3ZhciBtPTIqWi1qO2k9YShtLGosYWgrMS8zKTthaT1hKG0saixhaCk7YWo9YShtLGosYWgtMS8zKX1yZXR1cm4iIyIra1tNYXRoLmZsb29yKGkqMjU1KV0ra1tNYXRoLmZsb29yKGFpKjI1NSldK2tbTWF0aC5mbG9vcihhaioyNTUpXX1mdW5jdGlvbiBhKGosaSxtKXtpZihtPDApe20rK31pZihtPjEpe20tLX1pZig2Km08MSl7cmV0dXJuIGorKGktaikqNiptfWVsc2V7aWYoMiptPDEpe3JldHVybiBpfWVsc2V7aWYoMyptPDIpe3JldHVybiBqKyhpLWopKigyLzMtbSkqNn1lbHNle3JldHVybiBqfX19fXZhciBDPXt9O2Z1bmN0aW9uIEYoail7aWYoaiBpbiBDKXtyZXR1cm4gQ1tqXX12YXIgYWcsWj0xO2o9U3RyaW5nKGopO2lmKGouY2hhckF0KDApPT0iIyIpe2FnPWp9ZWxzZXtpZigvXnJnYi8udGVzdChqKSl7dmFyIHA9TShqKTt2YXIgYWc9IiMiLGFoO2Zvcih2YXIgbT0wO208MzttKyspe2lmKHBbbV0uaW5kZXhPZigiJSIpIT0tMSl7YWg9TWF0aC5mbG9vcihjKHBbbV0pKjI1NSl9ZWxzZXthaD0rcFttXX1hZys9a1tyKGFoLDAsMjU1KV19Wj0rcFszXX1lbHNle2lmKC9eaHNsLy50ZXN0KGopKXt2YXIgcD1NKGopO2FnPUkocCk7Wj1wWzNdfWVsc2V7YWc9YltqXXx8an19fXJldHVybiBDW2pdPXtjb2xvcjphZyxhbHBoYTpafX12YXIgbz17c3R5bGU6Im5vcm1hbCIsdmFyaWFudDoibm9ybWFsIix3ZWlnaHQ6Im5vcm1hbCIsc2l6ZToxMCxmYW1pbHk6InNhbnMtc2VyaWYifTt2YXIgTD17fTtmdW5jdGlvbiBFKGkpe2lmKExbaV0pe3JldHVybiBMW2ldfXZhciBwPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3ZhciBtPXAuc3R5bGU7dHJ5e20uZm9udD1pfWNhdGNoKGope31yZXR1cm4gTFtpXT17c3R5bGU6bS5mb250U3R5bGV8fG8uc3R5bGUsdmFyaWFudDptLmZvbnRWYXJpYW50fHxvLnZhcmlhbnQsd2VpZ2h0Om0uZm9udFdlaWdodHx8by53ZWlnaHQsc2l6ZTptLmZvbnRTaXplfHxvLnNpemUsZmFtaWx5Om0uZm9udEZhbWlseXx8by5mYW1pbHl9fWZ1bmN0aW9uIHUobSxqKXt2YXIgaT17fTtmb3IodmFyIGFoIGluIG0pe2lbYWhdPW1bYWhdfXZhciBhZz1wYXJzZUZsb2F0KGouY3VycmVudFN0eWxlLmZvbnRTaXplKSxaPXBhcnNlRmxvYXQobS5zaXplKTtpZih0eXBlb2YgbS5zaXplPT0ibnVtYmVyIil7aS5zaXplPW0uc2l6ZX1lbHNle2lmKG0uc2l6ZS5pbmRleE9mKCJweCIpIT0tMSl7aS5zaXplPVp9ZWxzZXtpZihtLnNpemUuaW5kZXhPZigiZW0iKSE9LTEpe2kuc2l6ZT1hZypafWVsc2V7aWYobS5zaXplLmluZGV4T2YoIiUiKSE9LTEpe2kuc2l6ZT0oYWcvMTAwKSpafWVsc2V7aWYobS5zaXplLmluZGV4T2YoInB0IikhPS0xKXtpLnNpemU9Wi8wLjc1fWVsc2V7aS5zaXplPWFnfX19fX1pLnNpemUqPTAuOTgxO2kuZmFtaWx5PSInIitpLmZhbWlseS5yZXBsYWNlKC8oXCd8XCIpL2csIiIpLnJlcGxhY2UoL1xzKixccyovZywiJywgJyIpKyInIjtyZXR1cm4gaX1mdW5jdGlvbiBhYyhpKXtyZXR1cm4gaS5zdHlsZSsiICIraS52YXJpYW50KyIgIitpLndlaWdodCsiICIraS5zaXplKyJweCAiK2kuZmFtaWx5fXZhciBzPXtidXR0OiJmbGF0Iixyb3VuZDoicm91bmQifTtmdW5jdGlvbiBTKGkpe3JldHVybiBzW2ldfHwic3F1YXJlIn1mdW5jdGlvbiBEKGkpe3RoaXMubV89QigpO3RoaXMubVN0YWNrXz1bXTt0aGlzLmFTdGFja189W107dGhpcy5jdXJyZW50UGF0aF89W107dGhpcy5zdHJva2VTdHlsZT0iIzAwMCI7dGhpcy5maWxsU3R5bGU9IiMwMDAiO3RoaXMubGluZVdpZHRoPTE7dGhpcy5saW5lSm9pbj0ibWl0ZXIiO3RoaXMubGluZUNhcD0iYnV0dCI7dGhpcy5taXRlckxpbWl0PWQqMTt0aGlzLmdsb2JhbEFscGhhPTE7dGhpcy5mb250PSIxMHB4IHNhbnMtc2VyaWYiO3RoaXMudGV4dEFsaWduPSJsZWZ0Ijt0aGlzLnRleHRCYXNlbGluZT0iYWxwaGFiZXRpYyI7dGhpcy5jYW52YXM9aTt2YXIgbT0id2lkdGg6IitpLmNsaWVudFdpZHRoKyJweDtoZWlnaHQ6IitpLmNsaWVudEhlaWdodCsicHg7b3ZlcmZsb3c6aGlkZGVuO3Bvc2l0aW9uOmFic29sdXRlIjt2YXIgaj1pLm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7ai5zdHlsZS5jc3NUZXh0PW07aS5hcHBlbmRDaGlsZChqKTt2YXIgcD1qLmNsb25lTm9kZShmYWxzZSk7cC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9InJlZCI7cC5zdHlsZS5maWx0ZXI9ImFscGhhKG9wYWNpdHk9MCkiO2kuYXBwZW5kQ2hpbGQocCk7dGhpcy5lbGVtZW50Xz1qO3RoaXMuYXJjU2NhbGVYXz0xO3RoaXMuYXJjU2NhbGVZXz0xO3RoaXMubGluZVNjYWxlXz0xfXZhciBxPUQucHJvdG90eXBlO3EuY2xlYXJSZWN0PWZ1bmN0aW9uKCl7aWYodGhpcy50ZXh0TWVhc3VyZUVsXyl7dGhpcy50ZXh0TWVhc3VyZUVsXy5yZW1vdmVOb2RlKHRydWUpO3RoaXMudGV4dE1lYXN1cmVFbF89bnVsbH10aGlzLmVsZW1lbnRfLmlubmVySFRNTD0iIn07cS5iZWdpblBhdGg9ZnVuY3Rpb24oKXt0aGlzLmN1cnJlbnRQYXRoXz1bXX07cS5tb3ZlVG89ZnVuY3Rpb24oaixpKXt2YXIgbT1WKHRoaXMsaixpKTt0aGlzLmN1cnJlbnRQYXRoXy5wdXNoKHt0eXBlOiJtb3ZlVG8iLHg6bS54LHk6bS55fSk7dGhpcy5jdXJyZW50WF89bS54O3RoaXMuY3VycmVudFlfPW0ueX07cS5saW5lVG89ZnVuY3Rpb24oaixpKXt2YXIgbT1WKHRoaXMsaixpKTt0aGlzLmN1cnJlbnRQYXRoXy5wdXNoKHt0eXBlOiJsaW5lVG8iLHg6bS54LHk6bS55fSk7dGhpcy5jdXJyZW50WF89bS54O3RoaXMuY3VycmVudFlfPW0ueX07cS5iZXppZXJDdXJ2ZVRvPWZ1bmN0aW9uKG0saixhayxhaixhaSxhZyl7dmFyIGk9Vih0aGlzLGFpLGFnKTt2YXIgYWg9Vih0aGlzLG0saik7dmFyIFo9Vih0aGlzLGFrLGFqKTtLKHRoaXMsYWgsWixpKX07ZnVuY3Rpb24gSyhpLFosbSxqKXtpLmN1cnJlbnRQYXRoXy5wdXNoKHt0eXBlOiJiZXppZXJDdXJ2ZVRvIixjcDF4OloueCxjcDF5OloueSxjcDJ4Om0ueCxjcDJ5Om0ueSx4OmoueCx5OmoueX0pO2kuY3VycmVudFhfPWoueDtpLmN1cnJlbnRZXz1qLnl9cS5xdWFkcmF0aWNDdXJ2ZVRvPWZ1bmN0aW9uKGFpLG0saixpKXt2YXIgYWg9Vih0aGlzLGFpLG0pO3ZhciBhZz1WKHRoaXMsaixpKTt2YXIgYWo9e3g6dGhpcy5jdXJyZW50WF8rMi8zKihhaC54LXRoaXMuY3VycmVudFhfKSx5OnRoaXMuY3VycmVudFlfKzIvMyooYWgueS10aGlzLmN1cnJlbnRZXyl9O3ZhciBaPXt4OmFqLngrKGFnLngtdGhpcy5jdXJyZW50WF8pLzMseTphai55KyhhZy55LXRoaXMuY3VycmVudFlfKS8zfTtLKHRoaXMsYWosWixhZyl9O3EuYXJjPWZ1bmN0aW9uKGFsLGFqLGFrLGFnLGosbSl7YWsqPWQ7dmFyIGFwPW0/ImF0Ijoid2EiO3ZhciBhbT1hbCtBKGFnKSphay1mO3ZhciBhbz1haitsKGFnKSphay1mO3ZhciBpPWFsK0EoaikqYWstZjt2YXIgYW49YWorbChqKSphay1mO2lmKGFtPT1pJiYhbSl7YW0rPTAuMTI1fXZhciBaPVYodGhpcyxhbCxhaik7dmFyIGFpPVYodGhpcyxhbSxhbyk7dmFyIGFoPVYodGhpcyxpLGFuKTt0aGlzLmN1cnJlbnRQYXRoXy5wdXNoKHt0eXBlOmFwLHg6Wi54LHk6Wi55LHJhZGl1czphayx4U3RhcnQ6YWkueCx5U3RhcnQ6YWkueSx4RW5kOmFoLngseUVuZDphaC55fSl9O3EucmVjdD1mdW5jdGlvbihtLGosaSxwKXt0aGlzLm1vdmVUbyhtLGopO3RoaXMubGluZVRvKG0raSxqKTt0aGlzLmxpbmVUbyhtK2ksaitwKTt0aGlzLmxpbmVUbyhtLGorcCk7dGhpcy5jbG9zZVBhdGgoKX07cS5zdHJva2VSZWN0PWZ1bmN0aW9uKG0saixpLHApe3ZhciBaPXRoaXMuY3VycmVudFBhdGhfO3RoaXMuYmVnaW5QYXRoKCk7dGhpcy5tb3ZlVG8obSxqKTt0aGlzLmxpbmVUbyhtK2ksaik7dGhpcy5saW5lVG8obStpLGorcCk7dGhpcy5saW5lVG8obSxqK3ApO3RoaXMuY2xvc2VQYXRoKCk7dGhpcy5zdHJva2UoKTt0aGlzLmN1cnJlbnRQYXRoXz1afTtxLmZpbGxSZWN0PWZ1bmN0aW9uKG0saixpLHApe3ZhciBaPXRoaXMuY3VycmVudFBhdGhfO3RoaXMuYmVnaW5QYXRoKCk7dGhpcy5tb3ZlVG8obSxqKTt0aGlzLmxpbmVUbyhtK2ksaik7dGhpcy5saW5lVG8obStpLGorcCk7dGhpcy5saW5lVG8obSxqK3ApO3RoaXMuY2xvc2VQYXRoKCk7dGhpcy5maWxsKCk7dGhpcy5jdXJyZW50UGF0aF89Wn07cS5jcmVhdGVMaW5lYXJHcmFkaWVudD1mdW5jdGlvbihqLHAsaSxtKXt2YXIgWj1uZXcgVSgiZ3JhZGllbnQiKTtaLngwXz1qO1oueTBfPXA7Wi54MV89aTtaLnkxXz1tO3JldHVybiBafTtxLmNyZWF0ZVJhZGlhbEdyYWRpZW50PWZ1bmN0aW9uKHAsYWcsbSxqLFosaSl7dmFyIGFoPW5ldyBVKCJncmFkaWVudHJhZGlhbCIpO2FoLngwXz1wO2FoLnkwXz1hZzthaC5yMF89bTthaC54MV89ajthaC55MV89WjthaC5yMV89aTtyZXR1cm4gYWh9O3EuZHJhd0ltYWdlPWZ1bmN0aW9uKGFxLG0pe3ZhciBhaixhaCxhbCxheSxhbyxhbSxhdCxhQTt2YXIgYWs9YXEucnVudGltZVN0eWxlLndpZHRoO3ZhciBhcD1hcS5ydW50aW1lU3R5bGUuaGVpZ2h0O2FxLnJ1bnRpbWVTdHlsZS53aWR0aD0iYXV0byI7YXEucnVudGltZVN0eWxlLmhlaWdodD0iYXV0byI7dmFyIGFpPWFxLndpZHRoO3ZhciBhdz1hcS5oZWlnaHQ7YXEucnVudGltZVN0eWxlLndpZHRoPWFrO2FxLnJ1bnRpbWVTdHlsZS5oZWlnaHQ9YXA7aWYoYXJndW1lbnRzLmxlbmd0aD09Myl7YWo9YXJndW1lbnRzWzFdO2FoPWFyZ3VtZW50c1syXTthbz1hbT0wO2F0PWFsPWFpO2FBPWF5PWF3fWVsc2V7aWYoYXJndW1lbnRzLmxlbmd0aD09NSl7YWo9YXJndW1lbnRzWzFdO2FoPWFyZ3VtZW50c1syXTthbD1hcmd1bWVudHNbM107YXk9YXJndW1lbnRzWzRdO2FvPWFtPTA7YXQ9YWk7YUE9YXd9ZWxzZXtpZihhcmd1bWVudHMubGVuZ3RoPT05KXthbz1hcmd1bWVudHNbMV07YW09YXJndW1lbnRzWzJdO2F0PWFyZ3VtZW50c1szXTthQT1hcmd1bWVudHNbNF07YWo9YXJndW1lbnRzWzVdO2FoPWFyZ3VtZW50c1s2XTthbD1hcmd1bWVudHNbN107YXk9YXJndW1lbnRzWzhdfWVsc2V7dGhyb3cgRXJyb3IoIkludmFsaWQgbnVtYmVyIG9mIGFyZ3VtZW50cyIpfX19dmFyIGF6PVYodGhpcyxhaixhaCk7dmFyIHA9YXQvMjt2YXIgaj1hQS8yO3ZhciBheD1bXTt2YXIgaT0xMDt2YXIgYWc9MTA7YXgucHVzaCgiIDxnX3ZtbF86Z3JvdXAiLCcgY29vcmRzaXplPSInLGQqaSwiLCIsZCphZywnIicsJyBjb29yZG9yaWdpbj0iMCwwIicsJyBzdHlsZT0id2lkdGg6JyxpLCJweDtoZWlnaHQ6IixhZywicHg7cG9zaXRpb246YWJzb2x1dGU7Iik7aWYodGhpcy5tX1swXVswXSE9MXx8dGhpcy5tX1swXVsxXXx8dGhpcy5tX1sxXVsxXSE9MXx8dGhpcy5tX1sxXVswXSl7dmFyIFo9W107Wi5wdXNoKCJNMTE9Iix0aGlzLm1fWzBdWzBdLCIsIiwiTTEyPSIsdGhpcy5tX1sxXVswXSwiLCIsIk0yMT0iLHRoaXMubV9bMF1bMV0sIiwiLCJNMjI9Iix0aGlzLm1fWzFdWzFdLCIsIiwiRHg9IixuKGF6LngvZCksIiwiLCJEeT0iLG4oYXoueS9kKSwiIik7dmFyIGF2PWF6O3ZhciBhdT1WKHRoaXMsYWorYWwsYWgpO3ZhciBhcj1WKHRoaXMsYWosYWgrYXkpO3ZhciBhbj1WKHRoaXMsYWorYWwsYWgrYXkpO2F2Lng9YWIubWF4KGF2LngsYXUueCxhci54LGFuLngpO2F2Lnk9YWIubWF4KGF2LnksYXUueSxhci55LGFuLnkpO2F4LnB1c2goInBhZGRpbmc6MCAiLG4oYXYueC9kKSwicHggIixuKGF2LnkvZCksInB4IDA7ZmlsdGVyOnByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5NYXRyaXgoIixaLmpvaW4oIiIpLCIsIHNpemluZ21ldGhvZD0nY2xpcCcpOyIpfWVsc2V7YXgucHVzaCgidG9wOiIsbihhei55L2QpLCJweDtsZWZ0OiIsbihhei54L2QpLCJweDsiKX1heC5wdXNoKCcgIj4nLCc8Z192bWxfOmltYWdlIHNyYz0iJyxhcS5zcmMsJyInLCcgc3R5bGU9IndpZHRoOicsZCphbCwicHg7IiwiIGhlaWdodDoiLGQqYXksJ3B4IicsJyBjcm9wbGVmdD0iJyxhby9haSwnIicsJyBjcm9wdG9wPSInLGFtL2F3LCciJywnIGNyb3ByaWdodD0iJywoYWktYW8tYXQpL2FpLCciJywnIGNyb3Bib3R0b209IicsKGF3LWFtLWFBKS9hdywnIicsIiAvPiIsIjwvZ192bWxfOmdyb3VwPiIpO3RoaXMuZWxlbWVudF8uaW5zZXJ0QWRqYWNlbnRIVE1MKCJCZWZvcmVFbmQiLGF4LmpvaW4oIiIpKX07cS5zdHJva2U9ZnVuY3Rpb24oYWwpe3ZhciBhaj1bXTt2YXIgWj1mYWxzZTt2YXIgbT0xMDt2YXIgYW09MTA7YWoucHVzaCgiPGdfdm1sXzpzaGFwZSIsJyBmaWxsZWQ9IicsISFhbCwnIicsJyBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7d2lkdGg6JyxtLCJweDtoZWlnaHQ6IixhbSwncHg7IicsJyBjb29yZG9yaWdpbj0iMCwwIicsJyBjb29yZHNpemU9IicsZCptLCIsIixkKmFtLCciJywnIHN0cm9rZWQ9IicsIWFsLCciJywnIHBhdGg9IicpO3ZhciBhbj1mYWxzZTt2YXIgYWc9e3g6bnVsbCx5Om51bGx9O3ZhciBhaz17eDpudWxsLHk6bnVsbH07Zm9yKHZhciBhaD0wO2FoPHRoaXMuY3VycmVudFBhdGhfLmxlbmd0aDthaCsrKXt2YXIgaj10aGlzLmN1cnJlbnRQYXRoX1thaF07dmFyIGFpO3N3aXRjaChqLnR5cGUpe2Nhc2UibW92ZVRvIjphaT1qO2FqLnB1c2goIiBtICIsbihqLngpLCIsIixuKGoueSkpO2JyZWFrO2Nhc2UibGluZVRvIjphai5wdXNoKCIgbCAiLG4oai54KSwiLCIsbihqLnkpKTticmVhaztjYXNlImNsb3NlIjphai5wdXNoKCIgeCAiKTtqPW51bGw7YnJlYWs7Y2FzZSJiZXppZXJDdXJ2ZVRvIjphai5wdXNoKCIgYyAiLG4oai5jcDF4KSwiLCIsbihqLmNwMXkpLCIsIixuKGouY3AyeCksIiwiLG4oai5jcDJ5KSwiLCIsbihqLngpLCIsIixuKGoueSkpO2JyZWFrO2Nhc2UiYXQiOmNhc2Uid2EiOmFqLnB1c2goIiAiLGoudHlwZSwiICIsbihqLngtdGhpcy5hcmNTY2FsZVhfKmoucmFkaXVzKSwiLCIsbihqLnktdGhpcy5hcmNTY2FsZVlfKmoucmFkaXVzKSwiICIsbihqLngrdGhpcy5hcmNTY2FsZVhfKmoucmFkaXVzKSwiLCIsbihqLnkrdGhpcy5hcmNTY2FsZVlfKmoucmFkaXVzKSwiICIsbihqLnhTdGFydCksIiwiLG4oai55U3RhcnQpLCIgIixuKGoueEVuZCksIiwiLG4oai55RW5kKSk7YnJlYWt9aWYoail7aWYoYWcueD09bnVsbHx8ai54PGFnLngpe2FnLng9ai54fWlmKGFrLng9PW51bGx8fGoueD5hay54KXthay54PWoueH1pZihhZy55PT1udWxsfHxqLnk8YWcueSl7YWcueT1qLnl9aWYoYWsueT09bnVsbHx8ai55PmFrLnkpe2FrLnk9ai55fX19YWoucHVzaCgnICI+Jyk7aWYoIWFsKXt3KHRoaXMsYWopfWVsc2V7Ryh0aGlzLGFqLGFnLGFrKX1hai5wdXNoKCI8L2dfdm1sXzpzaGFwZT4iKTt0aGlzLmVsZW1lbnRfLmluc2VydEFkamFjZW50SFRNTCgiYmVmb3JlRW5kIixhai5qb2luKCIiKSl9O2Z1bmN0aW9uIHcobSxhZyl7dmFyIGo9RihtLnN0cm9rZVN0eWxlKTt2YXIgcD1qLmNvbG9yO3ZhciBaPWouYWxwaGEqbS5nbG9iYWxBbHBoYTt2YXIgaT1tLmxpbmVTY2FsZV8qbS5saW5lV2lkdGg7aWYoaTwxKXtaKj1pfWFnLnB1c2goIjxnX3ZtbF86c3Ryb2tlIiwnIG9wYWNpdHk9IicsWiwnIicsJyBqb2luc3R5bGU9IicsbS5saW5lSm9pbiwnIicsJyBtaXRlcmxpbWl0PSInLG0ubWl0ZXJMaW1pdCwnIicsJyBlbmRjYXA9IicsUyhtLmxpbmVDYXApLCciJywnIHdlaWdodD0iJyxpLCdweCInLCcgY29sb3I9IicscCwnIiAvPicpfWZ1bmN0aW9uIEcoYXEsYWksYUssYXIpe3ZhciBhaj1hcS5maWxsU3R5bGU7dmFyIGFCPWFxLmFyY1NjYWxlWF87dmFyIGFBPWFxLmFyY1NjYWxlWV87dmFyIGo9YXIueC1hSy54O3ZhciBwPWFyLnktYUsueTtpZihhaiBpbnN0YW5jZW9mIFUpe3ZhciBhbj0wO3ZhciBhRj17eDowLHk6MH07dmFyIGF4PTA7dmFyIGFtPTE7aWYoYWoudHlwZV89PSJncmFkaWVudCIpe3ZhciBhbD1hai54MF8vYUI7dmFyIG09YWoueTBfL2FBO3ZhciBhaz1hai54MV8vYUI7dmFyIGFNPWFqLnkxXy9hQTt2YXIgYUo9VihhcSxhbCxtKTt2YXIgYUk9VihhcSxhayxhTSk7dmFyIGFnPWFJLngtYUoueDt2YXIgWj1hSS55LWFKLnk7YW49TWF0aC5hdGFuMihhZyxaKSoxODAvTWF0aC5QSTtpZihhbjwwKXthbis9MzYwfWlmKGFuPDAuMDAwMDAxKXthbj0wfX1lbHNle3ZhciBhSj1WKGFxLGFqLngwXyxhai55MF8pO2FGPXt4OihhSi54LWFLLngpL2oseTooYUoueS1hSy55KS9wfTtqLz1hQipkO3AvPWFBKmQ7dmFyIGFEPWFiLm1heChqLHApO2F4PTIqYWoucjBfL2FEO2FtPTIqYWoucjFfL2FELWF4fXZhciBhdj1hai5jb2xvcnNfO2F2LnNvcnQoZnVuY3Rpb24oYU4saSl7cmV0dXJuIGFOLm9mZnNldC1pLm9mZnNldH0pO3ZhciBhcD1hdi5sZW5ndGg7dmFyIGF1PWF2WzBdLmNvbG9yO3ZhciBhdD1hdlthcC0xXS5jb2xvcjt2YXIgYXo9YXZbMF0uYWxwaGEqYXEuZ2xvYmFsQWxwaGE7dmFyIGF5PWF2W2FwLTFdLmFscGhhKmFxLmdsb2JhbEFscGhhO3ZhciBhRT1bXTtmb3IodmFyIGFIPTA7YUg8YXA7YUgrKyl7dmFyIGFvPWF2W2FIXTthRS5wdXNoKGFvLm9mZnNldCphbStheCsiICIrYW8uY29sb3IpfWFpLnB1c2goJzxnX3ZtbF86ZmlsbCB0eXBlPSInLGFqLnR5cGVfLCciJywnIG1ldGhvZD0ibm9uZSIgZm9jdXM9IjEwMCUiJywnIGNvbG9yPSInLGF1LCciJywnIGNvbG9yMj0iJyxhdCwnIicsJyBjb2xvcnM9IicsYUUuam9pbigiLCIpLCciJywnIG9wYWNpdHk9IicsYXksJyInLCcgZ19vXzpvcGFjaXR5Mj0iJyxheiwnIicsJyBhbmdsZT0iJyxhbiwnIicsJyBmb2N1c3Bvc2l0aW9uPSInLGFGLngsIiwiLGFGLnksJyIgLz4nKX1lbHNle2lmKGFqIGluc3RhbmNlb2YgVCl7aWYoaiYmcCl7dmFyIGFoPS1hSy54O3ZhciBhQz0tYUsueTthaS5wdXNoKCI8Z192bWxfOmZpbGwiLCcgcG9zaXRpb249IicsYWgvaiphQiphQiwiLCIsYUMvcCphQSphQSwnIicsJyB0eXBlPSJ0aWxlIicsJyBzcmM9IicsYWouc3JjXywnIiAvPicpfX1lbHNle3ZhciBhTD1GKGFxLmZpbGxTdHlsZSk7dmFyIGF3PWFMLmNvbG9yO3ZhciBhRz1hTC5hbHBoYSphcS5nbG9iYWxBbHBoYTthaS5wdXNoKCc8Z192bWxfOmZpbGwgY29sb3I9IicsYXcsJyIgb3BhY2l0eT0iJyxhRywnIiAvPicpfX19cS5maWxsPWZ1bmN0aW9uKCl7dGhpcy5zdHJva2UodHJ1ZSl9O3EuY2xvc2VQYXRoPWZ1bmN0aW9uKCl7dGhpcy5jdXJyZW50UGF0aF8ucHVzaCh7dHlwZToiY2xvc2UifSl9O2Z1bmN0aW9uIFYoaixaLHApe3ZhciBpPWoubV87cmV0dXJue3g6ZCooWippWzBdWzBdK3AqaVsxXVswXStpWzJdWzBdKS1mLHk6ZCooWippWzBdWzFdK3AqaVsxXVsxXStpWzJdWzFdKS1mfX1xLnNhdmU9ZnVuY3Rpb24oKXt2YXIgaT17fTt2KHRoaXMsaSk7dGhpcy5hU3RhY2tfLnB1c2goaSk7dGhpcy5tU3RhY2tfLnB1c2godGhpcy5tXyk7dGhpcy5tXz1KKEIoKSx0aGlzLm1fKX07cS5yZXN0b3JlPWZ1bmN0aW9uKCl7aWYodGhpcy5hU3RhY2tfLmxlbmd0aCl7dih0aGlzLmFTdGFja18ucG9wKCksdGhpcyk7dGhpcy5tXz10aGlzLm1TdGFja18ucG9wKCl9fTtmdW5jdGlvbiBoKGkpe3JldHVybiBpc0Zpbml0ZShpWzBdWzBdKSYmaXNGaW5pdGUoaVswXVsxXSkmJmlzRmluaXRlKGlbMV1bMF0pJiZpc0Zpbml0ZShpWzFdWzFdKSYmaXNGaW5pdGUoaVsyXVswXSkmJmlzRmluaXRlKGlbMl1bMV0pfWZ1bmN0aW9uIGFhKGosaSxwKXtpZighaChpKSl7cmV0dXJufWoubV89aTtpZihwKXt2YXIgWj1pWzBdWzBdKmlbMV1bMV0taVswXVsxXSppWzFdWzBdO2oubGluZVNjYWxlXz1OKEgoWikpfX1xLnRyYW5zbGF0ZT1mdW5jdGlvbihtLGope3ZhciBpPVtbMSwwLDBdLFswLDEsMF0sW20saiwxXV07YWEodGhpcyxKKGksdGhpcy5tXyksZmFsc2UpfTtxLnJvdGF0ZT1mdW5jdGlvbihqKXt2YXIgcD1BKGopO3ZhciBtPWwoaik7dmFyIGk9W1twLG0sMF0sWy1tLHAsMF0sWzAsMCwxXV07YWEodGhpcyxKKGksdGhpcy5tXyksZmFsc2UpfTtxLnNjYWxlPWZ1bmN0aW9uKG0sail7dGhpcy5hcmNTY2FsZVhfKj1tO3RoaXMuYXJjU2NhbGVZXyo9ajt2YXIgaT1bW20sMCwwXSxbMCxqLDBdLFswLDAsMV1dO2FhKHRoaXMsSihpLHRoaXMubV8pLHRydWUpfTtxLnRyYW5zZm9ybT1mdW5jdGlvbihaLHAsYWgsYWcsaixpKXt2YXIgbT1bW1oscCwwXSxbYWgsYWcsMF0sW2osaSwxXV07YWEodGhpcyxKKG0sdGhpcy5tXyksdHJ1ZSl9O3Euc2V0VHJhbnNmb3JtPWZ1bmN0aW9uKGFnLFosYWksYWgscCxqKXt2YXIgaT1bW2FnLFosMF0sW2FpLGFoLDBdLFtwLGosMV1dO2FhKHRoaXMsaSx0cnVlKX07cS5kcmF3VGV4dF89ZnVuY3Rpb24oYW0sYWssYWosYXAsYWkpe3ZhciBhbz10aGlzLm1fLGF0PTEwMDAsaj0wLGFyPWF0LGFoPXt4OjAseTowfSxhZz1bXTt2YXIgaT11KEUodGhpcy5mb250KSx0aGlzLmVsZW1lbnRfKTt2YXIgcD1hYyhpKTt2YXIgYXU9dGhpcy5lbGVtZW50Xy5jdXJyZW50U3R5bGU7dmFyIFo9dGhpcy50ZXh0QWxpZ24udG9Mb3dlckNhc2UoKTtzd2l0Y2goWil7Y2FzZSJsZWZ0IjpjYXNlImNlbnRlciI6Y2FzZSJyaWdodCI6YnJlYWs7Y2FzZSJlbmQiOlo9YXUuZGlyZWN0aW9uPT0ibHRyIj8icmlnaHQiOiJsZWZ0IjticmVhaztjYXNlInN0YXJ0IjpaPWF1LmRpcmVjdGlvbj09InJ0bCI/InJpZ2h0IjoibGVmdCI7YnJlYWs7ZGVmYXVsdDpaPSJsZWZ0In1zd2l0Y2godGhpcy50ZXh0QmFzZWxpbmUpe2Nhc2UiaGFuZ2luZyI6Y2FzZSJ0b3AiOmFoLnk9aS5zaXplLzEuNzU7YnJlYWs7Y2FzZSJtaWRkbGUiOmJyZWFrO2RlZmF1bHQ6Y2FzZSBudWxsOmNhc2UiYWxwaGFiZXRpYyI6Y2FzZSJpZGVvZ3JhcGhpYyI6Y2FzZSJib3R0b20iOmFoLnk9LWkuc2l6ZS8yLjI1O2JyZWFrfXN3aXRjaChaKXtjYXNlInJpZ2h0IjpqPWF0O2FyPTAuMDU7YnJlYWs7Y2FzZSJjZW50ZXIiOmo9YXI9YXQvMjticmVha312YXIgYXE9Vih0aGlzLGFrK2FoLngsYWorYWgueSk7YWcucHVzaCgnPGdfdm1sXzpsaW5lIGZyb209IicsLWosJyAwIiB0bz0iJyxhciwnIDAuMDUiICcsJyBjb29yZHNpemU9IjEwMCAxMDAiIGNvb3Jkb3JpZ2luPSIwIDAiJywnIGZpbGxlZD0iJywhYWksJyIgc3Ryb2tlZD0iJywhIWFpLCciIHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDoxcHg7aGVpZ2h0OjFweDsiPicpO2lmKGFpKXt3KHRoaXMsYWcpfWVsc2V7Ryh0aGlzLGFnLHt4Oi1qLHk6MH0se3g6YXIseTppLnNpemV9KX12YXIgYW49YW9bMF1bMF0udG9GaXhlZCgzKSsiLCIrYW9bMV1bMF0udG9GaXhlZCgzKSsiLCIrYW9bMF1bMV0udG9GaXhlZCgzKSsiLCIrYW9bMV1bMV0udG9GaXhlZCgzKSsiLDAsMCI7dmFyIGFsPW4oYXEueC9kKzEtYW9bMF1bMF0pKyIsIituKGFxLnkvZC0yKmFvWzFdWzBdKTthZy5wdXNoKCc8Z192bWxfOnNrZXcgb249InQiIG1hdHJpeD0iJyxhbiwnIiAnLCcgb2Zmc2V0PSInLGFsLCciIG9yaWdpbj0iJyxqLCcgMCIgLz4nLCc8Z192bWxfOnBhdGggdGV4dHBhdGhvaz0idHJ1ZSIgLz4nLCc8Z192bWxfOnRleHRwYXRoIG9uPSJ0cnVlIiBzdHJpbmc9IicsYWYoYW0pLCciIHN0eWxlPSJ2LXRleHQtYWxpZ246JyxaLCI7Zm9udDoiLGFmKHApLCciIC8+PC9nX3ZtbF86bGluZT4nKTt0aGlzLmVsZW1lbnRfLmluc2VydEFkamFjZW50SFRNTCgiYmVmb3JlRW5kIixhZy5qb2luKCIiKSl9O3EuZmlsbFRleHQ9ZnVuY3Rpb24obSxpLHAsail7dGhpcy5kcmF3VGV4dF8obSxpLHAsaixmYWxzZSl9O3Euc3Ryb2tlVGV4dD1mdW5jdGlvbihtLGkscCxqKXt0aGlzLmRyYXdUZXh0XyhtLGkscCxqLHRydWUpfTtxLm1lYXN1cmVUZXh0PWZ1bmN0aW9uKG0pe2lmKCF0aGlzLnRleHRNZWFzdXJlRWxfKXt2YXIgaT0nPHNwYW4gc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3RvcDotMjAwMDBweDtsZWZ0OjA7cGFkZGluZzowO21hcmdpbjowO2JvcmRlcjpub25lO3doaXRlLXNwYWNlOnByZTsiPjwvc3Bhbj4nO3RoaXMuZWxlbWVudF8uaW5zZXJ0QWRqYWNlbnRIVE1MKCJiZWZvcmVFbmQiLGkpO3RoaXMudGV4dE1lYXN1cmVFbF89dGhpcy5lbGVtZW50Xy5sYXN0Q2hpbGR9dmFyIGo9dGhpcy5lbGVtZW50Xy5vd25lckRvY3VtZW50O3RoaXMudGV4dE1lYXN1cmVFbF8uaW5uZXJIVE1MPSIiO3RoaXMudGV4dE1lYXN1cmVFbF8uc3R5bGUuZm9udD10aGlzLmZvbnQ7dGhpcy50ZXh0TWVhc3VyZUVsXy5hcHBlbmRDaGlsZChqLmNyZWF0ZVRleHROb2RlKG0pKTtyZXR1cm57d2lkdGg6dGhpcy50ZXh0TWVhc3VyZUVsXy5vZmZzZXRXaWR0aH19O3EuY2xpcD1mdW5jdGlvbigpe307cS5hcmNUbz1mdW5jdGlvbigpe307cS5jcmVhdGVQYXR0ZXJuPWZ1bmN0aW9uKGosaSl7cmV0dXJuIG5ldyBUKGosaSl9O2Z1bmN0aW9uIFUoaSl7dGhpcy50eXBlXz1pO3RoaXMueDBfPTA7dGhpcy55MF89MDt0aGlzLnIwXz0wO3RoaXMueDFfPTA7dGhpcy55MV89MDt0aGlzLnIxXz0wO3RoaXMuY29sb3JzXz1bXX1VLnByb3RvdHlwZS5hZGRDb2xvclN0b3A9ZnVuY3Rpb24oaixpKXtpPUYoaSk7dGhpcy5jb2xvcnNfLnB1c2goe29mZnNldDpqLGNvbG9yOmkuY29sb3IsYWxwaGE6aS5hbHBoYX0pfTtmdW5jdGlvbiBUKGosaSl7UShqKTtzd2l0Y2goaSl7Y2FzZSJyZXBlYXQiOmNhc2UgbnVsbDpjYXNlIiI6dGhpcy5yZXBldGl0aW9uXz0icmVwZWF0IjticmVhaztjYXNlInJlcGVhdC14IjpjYXNlInJlcGVhdC15IjpjYXNlIm5vLXJlcGVhdCI6dGhpcy5yZXBldGl0aW9uXz1pO2JyZWFrO2RlZmF1bHQ6TygiU1lOVEFYX0VSUiIpfXRoaXMuc3JjXz1qLnNyYzt0aGlzLndpZHRoXz1qLndpZHRoO3RoaXMuaGVpZ2h0Xz1qLmhlaWdodH1mdW5jdGlvbiBPKGkpe3Rocm93IG5ldyBQKGkpfWZ1bmN0aW9uIFEoaSl7aWYoIWl8fGkubm9kZVR5cGUhPTF8fGkudGFnTmFtZSE9IklNRyIpe08oIlRZUEVfTUlTTUFUQ0hfRVJSIil9aWYoaS5yZWFkeVN0YXRlIT0iY29tcGxldGUiKXtPKCJJTlZBTElEX1NUQVRFX0VSUiIpfX1mdW5jdGlvbiBQKGkpe3RoaXMuY29kZT10aGlzW2ldO3RoaXMubWVzc2FnZT1pKyI6IERPTSBFeGNlcHRpb24gIit0aGlzLmNvZGV9dmFyIFg9UC5wcm90b3R5cGU9bmV3IEVycm9yO1guSU5ERVhfU0laRV9FUlI9MTtYLkRPTVNUUklOR19TSVpFX0VSUj0yO1guSElFUkFSQ0hZX1JFUVVFU1RfRVJSPTM7WC5XUk9OR19ET0NVTUVOVF9FUlI9NDtYLklOVkFMSURfQ0hBUkFDVEVSX0VSUj01O1guTk9fREFUQV9BTExPV0VEX0VSUj02O1guTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSPTc7WC5OT1RfRk9VTkRfRVJSPTg7WC5OT1RfU1VQUE9SVEVEX0VSUj05O1guSU5VU0VfQVRUUklCVVRFX0VSUj0xMDtYLklOVkFMSURfU1RBVEVfRVJSPTExO1guU1lOVEFYX0VSUj0xMjtYLklOVkFMSURfTU9ESUZJQ0FUSU9OX0VSUj0xMztYLk5BTUVTUEFDRV9FUlI9MTQ7WC5JTlZBTElEX0FDQ0VTU19FUlI9MTU7WC5WQUxJREFUSU9OX0VSUj0xNjtYLlRZUEVfTUlTTUFUQ0hfRVJSPTE3O0dfdm1sQ2FudmFzTWFuYWdlcj1lO0NhbnZhc1JlbmRlcmluZ0NvbnRleHQyRD1EO0NhbnZhc0dyYWRpZW50PVU7Q2FudmFzUGF0dGVybj1UO0RPTUV4Y2VwdGlvbj1QO0dfdm1sQ2FudmFzTWFuYWdlci5fdmVyc2lvbj04ODh9KSgpfTs=]]></data>
	</file>
	<file>
	  <filename>/src/jquery.jqplot.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LypydWxlcyBmb3IgdGhlIHBsb3QgdGFyZ2V0IGRpdi4gIFRoZXNlIHdpbGwgYmUgY2FzY2FkZWQgZG93biB0byBhbGwgcGxvdCBlbGVtZW50cyBhY2NvcmRpbmcgdG8gY3NzIHJ1bGVzKi8KLmpxcGxvdC10YXJnZXQgewogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgY29sb3I6ICM2NjY2NjY7CiAgICBmb250LWZhbWlseTogIlRyZWJ1Y2hldCBNUyIsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7CiAgICBmb250LXNpemU6IDFlbTsKLyogICAgaGVpZ2h0OiAzMDBweDsKICAgIHdpZHRoOiA0MDBweDsqLwp9CgovKnJ1bGVzIGFwcGxpZWQgdG8gYWxsIGF4ZXMqLwouanFwbG90LWF4aXMgewogICAgZm9udC1zaXplOiAwLjc1ZW07Cn0KCi5qcXBsb3QteGF4aXMgewogICAgbWFyZ2luLXRvcDogMTBweDsKfQoKLmpxcGxvdC14MmF4aXMgewogICAgbWFyZ2luLWJvdHRvbTogMTBweDsKfQoKLmpxcGxvdC15YXhpcyB7CiAgICBtYXJnaW4tcmlnaHQ6IDEwcHg7Cn0KCi5qcXBsb3QteTJheGlzLCAuanFwbG90LXkzYXhpcywgLmpxcGxvdC15NGF4aXMsIC5qcXBsb3QteTVheGlzLCAuanFwbG90LXk2YXhpcywgLmpxcGxvdC15N2F4aXMsIC5qcXBsb3QteThheGlzLCAuanFwbG90LXk5YXhpcywgLmpxcGxvdC15TWlkQXhpcyB7CiAgICBtYXJnaW4tbGVmdDogMTBweDsKICAgIG1hcmdpbi1yaWdodDogMTBweDsKfQoKLypydWxlcyBhcHBsaWVkIHRvIGFsbCBheGlzIHRpY2sgZGl2cyovCi5qcXBsb3QtYXhpcy10aWNrLCAuanFwbG90LXhheGlzLXRpY2ssIC5qcXBsb3QteWF4aXMtdGljaywgLmpxcGxvdC14MmF4aXMtdGljaywgLmpxcGxvdC15MmF4aXMtdGljaywgLmpxcGxvdC15M2F4aXMtdGljaywgLmpxcGxvdC15NGF4aXMtdGljaywgLmpxcGxvdC15NWF4aXMtdGljaywgLmpxcGxvdC15NmF4aXMtdGljaywgLmpxcGxvdC15N2F4aXMtdGljaywgLmpxcGxvdC15OGF4aXMtdGljaywgLmpxcGxvdC15OWF4aXMtdGljaywgLmpxcGxvdC15TWlkQXhpcy10aWNrIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHdoaXRlLXNwYWNlOiBwcmU7Cn0KCgouanFwbG90LXhheGlzLXRpY2sgewogICAgdG9wOiAwcHg7CiAgICAvKiBpbml0aWFsIHBvc2l0aW9uIHVudGlsbCB0aWNrIGlzIGRyYXduIGluIHByb3BlciBwbGFjZSAqLwogICAgbGVmdDogMTVweDsKLyogICAgcGFkZGluZy10b3A6IDEwcHg7Ki8KICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7Cn0KCi5qcXBsb3QteDJheGlzLXRpY2sgewogICAgYm90dG9tOiAwcHg7CiAgICAvKiBpbml0aWFsIHBvc2l0aW9uIHVudGlsbCB0aWNrIGlzIGRyYXduIGluIHByb3BlciBwbGFjZSAqLwogICAgbGVmdDogMTVweDsKLyogICAgcGFkZGluZy1ib3R0b206IDEwcHg7Ki8KICAgIHZlcnRpY2FsLWFsaWduOiBib3R0b207Cn0KCi5qcXBsb3QteWF4aXMtdGljayB7CiAgICByaWdodDogMHB4OwogICAgLyogaW5pdGlhbCBwb3NpdGlvbiB1bnRpbGwgdGljayBpcyBkcmF3biBpbiBwcm9wZXIgcGxhY2UgKi8KICAgIHRvcDogMTVweDsKLyogICAgcGFkZGluZy1yaWdodDogMTBweDsqLwogICAgdGV4dC1hbGlnbjogcmlnaHQ7Cn0KCi5qcXBsb3QteWF4aXMtdGljay5qcXBsb3QtYnJlYWtUaWNrIHsKCXJpZ2h0OiAtMjBweDsKCW1hcmdpbi1yaWdodDogMHB4OwoJcGFkZGluZzoxcHggNXB4IDFweCA1cHg7Ci8qCWJhY2tncm91bmQtY29sb3I6IHdoaXRlOyovCgl6LWluZGV4OiAyOwoJZm9udC1zaXplOiAxLjVlbTsKfQoKLmpxcGxvdC15MmF4aXMtdGljaywgLmpxcGxvdC15M2F4aXMtdGljaywgLmpxcGxvdC15NGF4aXMtdGljaywgLmpxcGxvdC15NWF4aXMtdGljaywgLmpxcGxvdC15NmF4aXMtdGljaywgLmpxcGxvdC15N2F4aXMtdGljaywgLmpxcGxvdC15OGF4aXMtdGljaywgLmpxcGxvdC15OWF4aXMtdGljayB7CiAgICBsZWZ0OiAwcHg7CiAgICAvKiBpbml0aWFsIHBvc2l0aW9uIHVudGlsbCB0aWNrIGlzIGRyYXduIGluIHByb3BlciBwbGFjZSAqLwogICAgdG9wOiAxNXB4OwovKiAgICBwYWRkaW5nLWxlZnQ6IDEwcHg7Ki8KLyogICAgcGFkZGluZy1yaWdodDogMTVweDsqLwogICAgdGV4dC1hbGlnbjogbGVmdDsKfQoKLmpxcGxvdC15TWlkQXhpcy10aWNrIHsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KCi5qcXBsb3QteGF4aXMtbGFiZWwgewogICAgbWFyZ2luLXRvcDogMTBweDsKICAgIGZvbnQtc2l6ZTogMTFwdDsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKfQoKLmpxcGxvdC14MmF4aXMtbGFiZWwgewogICAgbWFyZ2luLWJvdHRvbTogMTBweDsKICAgIGZvbnQtc2l6ZTogMTFwdDsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKfQoKLmpxcGxvdC15YXhpcy1sYWJlbCB7CiAgICBtYXJnaW4tcmlnaHQ6IDEwcHg7Ci8qICAgIHRleHQtYWxpZ246IGNlbnRlcjsqLwogICAgZm9udC1zaXplOiAxMXB0OwogICAgcG9zaXRpb246IGFic29sdXRlOwp9CgouanFwbG90LXlNaWRBeGlzLWxhYmVsIHsKICAgIGZvbnQtc2l6ZTogMTFwdDsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKfQoKLmpxcGxvdC15MmF4aXMtbGFiZWwsIC5qcXBsb3QteTNheGlzLWxhYmVsLCAuanFwbG90LXk0YXhpcy1sYWJlbCwgLmpxcGxvdC15NWF4aXMtbGFiZWwsIC5qcXBsb3QteTZheGlzLWxhYmVsLCAuanFwbG90LXk3YXhpcy1sYWJlbCwgLmpxcGxvdC15OGF4aXMtbGFiZWwsIC5qcXBsb3QteTlheGlzLWxhYmVsIHsKLyogICAgdGV4dC1hbGlnbjogY2VudGVyOyovCiAgICBmb250LXNpemU6IDExcHQ7CiAgICBtYXJnaW4tbGVmdDogMTBweDsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKfQoKLmpxcGxvdC1tZXRlckdhdWdlLXRpY2sgewogICAgZm9udC1zaXplOiAwLjc1ZW07CiAgICBjb2xvcjogIzk5OTk5OTsKfQoKLmpxcGxvdC1tZXRlckdhdWdlLWxhYmVsIHsKICAgIGZvbnQtc2l6ZTogMWVtOwogICAgY29sb3I6ICM5OTk5OTk7Cn0KCnRhYmxlLmpxcGxvdC10YWJsZS1sZWdlbmQgewogICAgbWFyZ2luLXRvcDogMTJweDsKICAgIG1hcmdpbi1ib3R0b206IDEycHg7CiAgICBtYXJnaW4tbGVmdDogMTJweDsKICAgIG1hcmdpbi1yaWdodDogMTJweDsKfQoKdGFibGUuanFwbG90LXRhYmxlLWxlZ2VuZCwgdGFibGUuanFwbG90LWN1cnNvci1sZWdlbmQgewogICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgyNTUsMjU1LDI1NSwwLjYpOwogICAgYm9yZGVyOiAxcHggc29saWQgI2NjY2NjYzsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGZvbnQtc2l6ZTogMC43NWVtOwp9Cgp0ZC5qcXBsb3QtdGFibGUtbGVnZW5kIHsKICAgIHZlcnRpY2FsLWFsaWduOm1pZGRsZTsKfQoKLyoKVGhlc2UgcnVsZXMgY291bGQgYmUgdXNlZCBpbnN0ZWFkIG9mIGFzc2lnbmluZwplbGVtZW50IHN0eWxlcyBhbmQgcmVseWluZyBvbiBqcyBvYmplY3QgcHJvcGVydGllcy4KKi8KCi8qCnRkLmpxcGxvdC10YWJsZS1sZWdlbmQtc3dhdGNoIHsKICAgIHBhZGRpbmctdG9wOiAwLjVlbTsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKfQoKdHIuanFwbG90LXRhYmxlLWxlZ2VuZDpmaXJzdCB0ZC5qcXBsb3QtdGFibGUtbGVnZW5kLXN3YXRjaCB7CiAgICBwYWRkaW5nLXRvcDogMHB4Owp9CiovCgp0ZC5qcXBsb3Qtc2VyaWVzVG9nZ2xlOmhvdmVyLCB0ZC5qcXBsb3Qtc2VyaWVzVG9nZ2xlOmFjdGl2ZSB7CiAgICBjdXJzb3I6IHBvaW50ZXI7Cn0KCi5qcXBsb3QtdGFibGUtbGVnZW5kIC5qcXBsb3Qtc2VyaWVzLWhpZGRlbiB7CiAgICB0ZXh0LWRlY29yYXRpb246IGxpbmUtdGhyb3VnaDsKfQoKZGl2LmpxcGxvdC10YWJsZS1sZWdlbmQtc3dhdGNoLW91dGxpbmUgewogICAgYm9yZGVyOiAxcHggc29saWQgI2NjY2NjYzsKICAgIHBhZGRpbmc6MXB4Owp9CgpkaXYuanFwbG90LXRhYmxlLWxlZ2VuZC1zd2F0Y2ggewogICAgd2lkdGg6MHB4OwogICAgaGVpZ2h0OjBweDsKICAgIGJvcmRlci10b3Atd2lkdGg6IDVweDsKICAgIGJvcmRlci1ib3R0b20td2lkdGg6IDVweDsKICAgIGJvcmRlci1sZWZ0LXdpZHRoOiA2cHg7CiAgICBib3JkZXItcmlnaHQtd2lkdGg6IDZweDsKICAgIGJvcmRlci10b3Atc3R5bGU6IHNvbGlkOwogICAgYm9yZGVyLWJvdHRvbS1zdHlsZTogc29saWQ7CiAgICBib3JkZXItbGVmdC1zdHlsZTogc29saWQ7CiAgICBib3JkZXItcmlnaHQtc3R5bGU6IHNvbGlkOwp9CgouanFwbG90LXRpdGxlIHsKICAgIHRvcDogMHB4OwogICAgbGVmdDogMHB4OwogICAgcGFkZGluZy1ib3R0b206IDAuNWVtOwogICAgZm9udC1zaXplOiAxLjJlbTsKfQoKdGFibGUuanFwbG90LWN1cnNvci10b29sdGlwIHsKICAgIGJvcmRlcjogMXB4IHNvbGlkICNjY2NjY2M7CiAgICBmb250LXNpemU6IDAuNzVlbTsKfQoKCi5qcXBsb3QtY3Vyc29yLXRvb2x0aXAgewogICAgYm9yZGVyOiAxcHggc29saWQgI2NjY2NjYzsKICAgIGZvbnQtc2l6ZTogMC43NWVtOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjA4LDIwOCwyMDgsMC41KTsKICAgIHBhZGRpbmc6IDFweDsKfQoKLmpxcGxvdC1oaWdobGlnaHRlci10b29sdGlwLCAuanFwbG90LWNhbnZhc092ZXJsYXktdG9vbHRpcCB7CiAgICBib3JkZXI6IDFweCBzb2xpZCAjY2NjY2NjOwogICAgZm9udC1zaXplOiAwLjc1ZW07CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgYmFja2dyb3VuZDogcmdiYSgyMDgsMjA4LDIwOCwwLjUpOwogICAgcGFkZGluZzogMXB4Owp9CgouanFwbG90LXBvaW50LWxhYmVsIHsKICAgIGZvbnQtc2l6ZTogMC43NWVtOwogICAgei1pbmRleDogMjsKfQogICAgICAKdGQuanFwbG90LWN1cnNvci1sZWdlbmQtc3dhdGNoIHsKICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KCmRpdi5qcXBsb3QtY3Vyc29yLWxlZ2VuZC1zd2F0Y2ggewogICAgd2lkdGg6IDEuMmVtOwogICAgaGVpZ2h0OiAwLjdlbTsKfQoKLmpxcGxvdC1lcnJvciB7Ci8qICAgU3R5bGVzIGFkZGVkIHRvIHRoZSBwbG90IHRhcmdldCBjb250YWluZXIgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBnbyBoZXJlLiovCiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KCi5qcXBsb3QtZXJyb3ItbWVzc2FnZSB7Ci8qICAgIFN0eWxpbmcgb2YgdGhlIGN1c3RvbSBlcnJvciBtZXNzYWdlIGRpdiBnb2VzIGhlcmUuKi8KICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIHRvcDogNDYlOwogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwp9CgpkaXYuanFwbG90LWJ1YmJsZS1sYWJlbCB7CiAgICBmb250LXNpemU6IDAuOGVtOwovKiAgICBiYWNrZ3JvdW5kOiByZ2JhKDkwJSwgOTAlLCA5MCUsIDAuMTUpOyovCiAgICBwYWRkaW5nLWxlZnQ6IDJweDsKICAgIHBhZGRpbmctcmlnaHQ6IDJweDsKICAgIGNvbG9yOiByZ2IoMjAlLCAyMCUsIDIwJSk7Cn0KCmRpdi5qcXBsb3QtYnViYmxlLWxhYmVsLmpxcGxvdC1idWJibGUtbGFiZWwtaGlnaGxpZ2h0IHsKICAgIGJhY2tncm91bmQ6IHJnYmEoOTAlLCA5MCUsIDkwJSwgMC43KTsKfQoKZGl2LmpxcGxvdC1ub0RhdGEtY29udGFpbmVyIHsKCXRleHQtYWxpZ246IGNlbnRlcjsKCWJhY2tncm91bmQtY29sb3I6IHJnYmEoOTYlLCA5NiUsIDk2JSwgMC4zKTsKfQo=]]></data>
	</file>
	<file>
	  <filename>/src/jquery.jqplot.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqCiAqIFRpdGxlOiBqcVBsb3QgQ2hhcnRzCiAqIAogKiBQdXJlIEphdmFTY3JpcHQgcGxvdHRpbmcgcGx1Z2luIGZvciBqUXVlcnkuCiAqIAogKiBBYm91dDogVmVyc2lvbgogKiAKICogMS4wLjBiMl9yMTAxMiAKICogCiAqIEFib3V0OiBDb3B5cmlnaHQgJiBMaWNlbnNlCiAqIAogKiBDb3B5cmlnaHQgKGMpIDIwMDktMjAxMSBDaHJpcyBMZW9uZWxsbwogKiBqcVBsb3QgaXMgY3VycmVudGx5IGF2YWlsYWJsZSBmb3IgdXNlIGluIGFsbCBwZXJzb25hbCBvciBjb21tZXJjaWFsIHByb2plY3RzIAogKiB1bmRlciBib3RoIHRoZSBNSVQgYW5kIEdQTCB2ZXJzaW9uIDIuMCBsaWNlbnNlcy4gVGhpcyBtZWFucyB0aGF0IHlvdSBjYW4gCiAqIGNob29zZSB0aGUgbGljZW5zZSB0aGF0IGJlc3Qgc3VpdHMgeW91ciBwcm9qZWN0IGFuZCB1c2UgaXQgYWNjb3JkaW5nbHkuCiAqIAogKiBTZWUgPEdQTCBWZXJzaW9uIDI+IGFuZCA8TUlUIExpY2Vuc2U+IGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBkaXN0cmlidXRpb24gZm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24uIAogKgogKiBUaGUgYXV0aG9yIHdvdWxkIGFwcHJlY2lhdGUgYW4gZW1haWwgbGV0dGluZyBoaW0ga25vdyBvZiBhbnkgc3Vic3RhbnRpYWwKICogdXNlIG9mIGpxUGxvdC4gIFlvdSBjYW4gcmVhY2ggdGhlIGF1dGhvciBhdDogY2hyaXMgYXQganFwbG90IGRvdCBjb20gCiAqIG9yIHNlZSBodHRwOi8vd3d3LmpxcGxvdC5jb20vaW5mby5waHAuICBUaGlzIGlzLCBvZiBjb3Vyc2UsIG5vdCByZXF1aXJlZC4KICoKICogSWYgeW91IGFyZSBmZWVsaW5nIGtpbmQgYW5kIGdlbmVyb3VzLCBjb25zaWRlciBzdXBwb3J0aW5nIHRoZSBwcm9qZWN0IGJ5CiAqIG1ha2luZyBhIGRvbmF0aW9uIGF0OiBodHRwOi8vd3d3LmpxcGxvdC5jb20vZG9uYXRlLnBocC4KICoKICogc3ByaW50ZiBmdW5jdGlvbnMgY29udGFpbmVkIGluIGpxcGxvdC5zcHJpbnRmLmpzIGJ5IEFzaCBTZWFybGU6CiAqIAogKiAgICAgdmVyc2lvbiAyMDA3LjA0LjI3CiAqICAgICBhdXRob3IgQXNoIFNlYXJsZQogKiAgICAgaHR0cDovL2hleG1lbi5jb20vYmxvZy8yMDA3LzAzL3ByaW50Zi1zcHJpbnRmLwogKiAgICAgaHR0cDovL2hleG1lbi5jb20vanMvc3ByaW50Zi5qcwogKiAgICAgVGhlIGF1dGhvciAoQXNoIFNlYXJsZSkgaGFzIHBsYWNlZCB0aGlzIGNvZGUgaW4gdGhlIHB1YmxpYyBkb21haW46CiAqICAgICAiVGhpcyBjb2RlIGlzIHVucmVzdHJpY3RlZDogeW91IGFyZSBmcmVlIHRvIHVzZSBpdCBob3dldmVyIHlvdSBsaWtlLiIKICogCiAqIAogKiBBYm91dDogSW50cm9kdWN0aW9uCiAqIAogKiBqcVBsb3QgcmVxdWlyZXMgalF1ZXJ5ICgxLjQrIHJlcXVpcmVkIGZvciBjZXJ0YWluIGZlYXR1cmVzKS4galF1ZXJ5IDEuNC4yIGlzIGluY2x1ZGVkIGluIHRoZSBkaXN0cmlidXRpb24uICAKICogVG8gdXNlIGpxUGxvdCBpbmNsdWRlIGpRdWVyeSwgdGhlIGpxUGxvdCBqUXVlcnkgcGx1Z2luLCB0aGUganFQbG90IGNzcyBmaWxlIGFuZCBvcHRpb25hbGx5IAogKiB0aGUgZXhjYW52YXMgc2NyaXB0IGZvciBJRSBzdXBwb3J0IGluIHlvdXIgd2ViIHBhZ2U6CiAqIAogKiA+IDwhLS1baWYgbHQgSUUgOV0+PHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9ImV4Y2FudmFzLmpzIj48L3NjcmlwdD48IVtlbmRpZl0tLT4KICogPiA8c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0ianF1ZXJ5LTEuNC40Lm1pbi5qcyI+PC9zY3JpcHQ+CiAqID4gPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9ImpxdWVyeS5qcXBsb3QubWluLmpzIj48L3NjcmlwdD4KICogPiA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJqcXVlcnkuanFwbG90LmNzcyIgLz4KICogCiAqIGpxUGxvdCBjYW4gYmUgY3VzdG9taXplZCBieSBvdmVycmlkaW5nIHRoZSBkZWZhdWx0cyBvZiBhbnkgb2YgdGhlIG9iamVjdHMgd2hpY2ggbWFrZQogKiB1cCB0aGUgcGxvdC4gVGhlIGdlbmVyYWwgdXNhZ2Ugb2YganFwbG90IGlzOgogKiAKICogPiBjaGFydCA9ICQuanFwbG90KCd0YXJnZXRFbGVtSWQnLCBbZGF0YUFycmF5LC4uLl0sIHtvcHRpb25zT2JqZWN0fSk7CiAqIAogKiBUaGUgb3B0aW9ucyBhdmFpbGFibGUgdG8ganFwbG90IGFyZSBkZXRhaWxlZCBpbiA8anFQbG90IE9wdGlvbnM+IGluIHRoZSBqcVBsb3RPcHRpb25zLnR4dCBmaWxlLgogKiAKICogQW4gYWN0dWFsIGNhbGwgdG8gJC5qcXBsb3QoKSBtYXkgbG9vayBsaWtlIHRoZSAKICogZXhhbXBsZXMgYmVsb3c6CiAqIAogKiA+IGNoYXJ0ID0gJC5qcXBsb3QoJ2NoYXJ0ZGl2JywgIFtbWzEsIDJdLFszLDUuMTJdLFs1LDEzLjFdLFs3LDMzLjZdLFs5LDg1LjldLFsxMSwyMTkuOV1dXSk7CiAqIAogKiBvcgogKiAKICogPiBkYXRhQXJyYXkgPSBbMzQsMTIsNDMsNTUsNzddOwogKiA+IGNoYXJ0ID0gJC5qcXBsb3QoJ3RhcmdldEVsZW1JZCcsIFtkYXRhQXJyYXksIC4uLl0sIHt0aXRsZTonTXkgUGxvdCcsIGF4ZXM6e3lheGlzOnttaW46MjAsIG1heDoxMDB9fX0pOwogKiAKICogRm9yIG1vcmUgaW5mb3JybWF0aW9uLCBzZWUgPGpxUGxvdCBVc2FnZT4uCiAqIAogKiBBYm91dDogVXNhZ2UKICogCiAqIFNlZSA8anFQbG90IFVzYWdlPgogKiAKICogQWJvdXQ6IEF2YWlsYWJsZSBPcHRpb25zIAogKiAKICogU2VlIDxqcVBsb3QgT3B0aW9ucz4gZm9yIGEgbGlzdCBvZiBvcHRpb25zIGF2YWlsYWJsZSB0aG9ydWdoIHRoZSBvcHRpb25zIG9iamVjdCAobm90IGNvbXBsZXRlIHlldCEpCiAqIAogKiBBYm91dDogT3B0aW9ucyBVc2FnZQogKiAKICogU2VlIDxPcHRpb25zIFR1dG9yaWFsPgogKiAKICogQWJvdXQ6IENoYW5nZXMKICogCiAqIFNlZSA8Q2hhbmdlIExvZz4KICogCiAqLwoKKGZ1bmN0aW9uKCQpIHsKICAgIC8vIG1ha2Ugc3VyZSB1bmRlZmluZWQgaXMgdW5kZWZpbmVkCiAgICB2YXIgdW5kZWZpbmVkOwogICAgCiAgICAkLmZuLmVtcHR5Rm9yY2UgPSBmdW5jdGlvbigpIHsKICAgICAgZm9yICggdmFyIGkgPSAwLCBlbGVtOyAoZWxlbSA9ICQodGhpcylbaV0pICE9IG51bGw7IGkrKyApIHsKICAgICAgICAvLyBSZW1vdmUgZWxlbWVudCBub2RlcyBhbmQgcHJldmVudCBtZW1vcnkgbGVha3MKICAgICAgICBpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7CiAgICAgICAgICBqUXVlcnkuY2xlYW5EYXRhKCBlbGVtLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikgKTsKICAgICAgICB9CiAgCiAgICAgICAgLy8gUmVtb3ZlIGFueSByZW1haW5pbmcgbm9kZXMKICAgICAgICBpZiAoJC5qcXBsb3RfdXNlX2V4Y2FudmFzKSB7CiAgICAgICAgICBlbGVtLm91dGVySFRNTCA9ICIiOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgIHdoaWxlICggZWxlbS5maXJzdENoaWxkICkgewogICAgICAgICAgICBlbGVtLnJlbW92ZUNoaWxkKCBlbGVtLmZpcnN0Q2hpbGQgKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGVsZW0gPSBudWxsOwogICAgICB9CiAgCiAgICAgIHJldHVybiAkKHRoaXMpOwogICAgfTsKICAKICAgICQuZm4ucmVtb3ZlQ2hpbGRGb3JjZSA9IGZ1bmN0aW9uKHBhcmVudCkgewogICAgICB3aGlsZSAoIHBhcmVudC5maXJzdENoaWxkICkgewogICAgICAgIHRoaXMucmVtb3ZlQ2hpbGRGb3JjZSggcGFyZW50LmZpcnN0Q2hpbGQgKTsKICAgICAgICBwYXJlbnQucmVtb3ZlQ2hpbGQoIHBhcmVudC5maXJzdENoaWxkICk7CiAgICAgIH0KICAgIH07CgoKICAgIC8qKgogICAgICogTmFtZXNwYWNlOiAkLmpxcGxvdAogICAgICogalF1ZXJ5IGZ1bmN0aW9uIGNhbGxlZCBieSB0aGUgdXNlciB0byBjcmVhdGUgYSBwbG90LgogICAgICogIAogICAgICogUGFyYW1ldGVyczoKICAgICAqIHRhcmdldCAtIElEIG9mIHRhcmdldCBlbGVtZW50IHRvIHJlbmRlciB0aGUgcGxvdCBpbnRvLgogICAgICogZGF0YSAtIGFuIGFycmF5IG9mIGRhdGEgc2VyaWVzLgogICAgICogb3B0aW9ucyAtIHVzZXIgZGVmaW5lZCBvcHRpb25zIG9iamVjdC4gIFNlZSB0aGUgaW5kaXZpZHVhbCBjbGFzc2VzIGZvciBhdmFpbGFibGUgb3B0aW9ucy4KICAgICAqIAogICAgICogUHJvcGVydGllczoKICAgICAqIGNvbmZpZyAtIG9iamVjdCB0byBob2xkIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIGpxUGxvdCBwbG90IG9iamVjdC4KICAgICAqIAogICAgICogYXR0cmlidXRlczoKICAgICAqIGVuYWJsZVBsdWdpbnMgLSBGYWxzZSB0byBkaXNhYmxlIHBsdWdpbnMgYnkgZGVmYXVsdC4gIFBsdWdpbnMgbXVzdCB0aGVuIGJlIGV4cGxpY2l0bHkgCiAgICAgKiAgIGVuYWJsZWQgaW4gdGhlIGluZGl2aWR1YWwgcGxvdCBvcHRpb25zLiAgRGVmYXVsdDogZmFsc2UuCiAgICAgKiAgIFRoaXMgcHJvcGVydHkgc2V0cyB0aGUgInNob3ciIHByb3BlcnR5IG9mIGNlcnRhaW4gcGx1Z2lucyB0byB0cnVlIG9yIGZhbHNlLgogICAgICogICBPbmx5IHBsdWdpbnMgdGhhdCBjYW4gYmUgaW1tZWRpYXRlbHkgYWN0aXZlIHVwb24gbG9hZGluZyBhcmUgYWZmZWN0ZWQuICBUaGlzIGluY2x1ZGVzCiAgICAgKiAgIG5vbi1yZW5kZXJlciBwbHVnaW5zIGxpa2UgY3Vyc29yLCBkcmFnYWJsZSwgaGlnaGxpZ2h0ZXIsIGFuZCB0cmVuZGxpbmUuCiAgICAgKiBkZWZhdWx0SGVpZ2h0IC0gRGVmYXVsdCBoZWlnaHQgZm9yIHBsb3RzIHdoZXJlIG5vIGNzcyBoZWlnaHQgc3BlY2lmaWNhdGlvbiBleGlzdHMuICBUaGlzCiAgICAgKiAgIGlzIGEganFwbG90IHdpZGUgZGVmYXVsdC4KICAgICAqIGRlZmF1bHRXaWR0aCAtIERlZmF1bHQgaGVpZ2h0IGZvciBwbG90cyB3aGVyZSBubyBjc3MgaGVpZ2h0IHNwZWNpZmljYXRpb24gZXhpc3RzLiAgVGhpcwogICAgICogICBpcyBhIGpxcGxvdCB3aWRlIGRlZmF1bHQuCiAgICAgKi8KCiAgICAkLmpxcGxvdCA9IGZ1bmN0aW9uKHRhcmdldCwgZGF0YSwgb3B0aW9ucykgewogICAgICAgIHZhciBfZGF0YSwgX29wdGlvbnM7CiAgICAgICAgCiAgICAgICAgaWYgKG9wdGlvbnMgPT0gbnVsbCkgewogICAgICAgICAgICBpZiAoalF1ZXJ5LmlzQXJyYXkoZGF0YSkpIHsKICAgICAgICAgICAgICAgIF9kYXRhID0gZGF0YTsKICAgICAgICAgICAgICAgIF9vcHRpb25zID0gbnVsbDsgICAKICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mKGRhdGEpID09PSAnb2JqZWN0JykgewogICAgICAgICAgICAgICAgX2RhdGEgPSBudWxsOwogICAgICAgICAgICAgICAgX29wdGlvbnMgPSBkYXRhOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBfZGF0YSA9IGRhdGE7CiAgICAgICAgICAgIF9vcHRpb25zID0gb3B0aW9uczsKICAgICAgICB9CiAgICAgICAgdmFyIHBsb3QgPSBuZXcganFQbG90KCk7CiAgICAgICAgLy8gcmVtb3ZlIGFueSBlcnJvciBjbGFzcyB0aGF0IG1heSBiZSBzdHVjayBvbiB0YXJnZXQuCiAgICAgICAgJCgnIycrdGFyZ2V0KS5yZW1vdmVDbGFzcygnanFwbG90LWVycm9yJyk7CiAgICAgICAgCiAgICAgICAgaWYgKCQuanFwbG90LmNvbmZpZy5jYXRjaEVycm9ycykgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgcGxvdC5pbml0KHRhcmdldCwgX2RhdGEsIF9vcHRpb25zKTsKICAgICAgICAgICAgICAgIHBsb3QuZHJhdygpOwogICAgICAgICAgICAgICAgcGxvdC50aGVtZUVuZ2luZS5pbml0LmNhbGwocGxvdCk7CiAgICAgICAgICAgICAgICByZXR1cm4gcGxvdDsKICAgICAgICAgICAgfQogICAgICAgICAgICBjYXRjaChlKSB7CiAgICAgICAgICAgICAgICB2YXIgbXNnID0gJC5qcXBsb3QuY29uZmlnLmVycm9yTWVzc2FnZSB8fCBlLm1lc3NhZ2U7CiAgICAgICAgICAgICAgICAkKCcjJyt0YXJnZXQpLmFwcGVuZCgnPGRpdiBjbGFzcz0ianFwbG90LWVycm9yLW1lc3NhZ2UiPicrbXNnKyc8L2Rpdj4nKTsKICAgICAgICAgICAgICAgICQoJyMnK3RhcmdldCkuYWRkQ2xhc3MoJ2pxcGxvdC1lcnJvcicpOwogICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGFyZ2V0KS5zdHlsZS5iYWNrZ3JvdW5kID0gJC5qcXBsb3QuY29uZmlnLmVycm9yQmFja2dyb3VuZDsKICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRhcmdldCkuc3R5bGUuYm9yZGVyID0gJC5qcXBsb3QuY29uZmlnLmVycm9yQm9yZGVyOwogICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGFyZ2V0KS5zdHlsZS5mb250RmFtaWx5ID0gJC5qcXBsb3QuY29uZmlnLmVycm9yRm9udEZhbWlseTsKICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRhcmdldCkuc3R5bGUuZm9udFNpemUgPSAkLmpxcGxvdC5jb25maWcuZXJyb3JGb250U2l6ZTsKICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRhcmdldCkuc3R5bGUuZm9udFN0eWxlID0gJC5qcXBsb3QuY29uZmlnLmVycm9yRm9udFN0eWxlOwogICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGFyZ2V0KS5zdHlsZS5mb250V2VpZ2h0ID0gJC5qcXBsb3QuY29uZmlnLmVycm9yRm9udFdlaWdodDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsgICAgICAgIAogICAgICAgICAgICBwbG90LmluaXQodGFyZ2V0LCBfZGF0YSwgX29wdGlvbnMpOwogICAgICAgICAgICBwbG90LmRyYXcoKTsKICAgICAgICAgICAgcGxvdC50aGVtZUVuZ2luZS5pbml0LmNhbGwocGxvdCk7CiAgICAgICAgICAgIHJldHVybiBwbG90OwogICAgICAgIH0KICAgIH07CgogICAgJC5qcXBsb3QudmVyc2lvbiA9ICIxLjAuMGIyX3IxMDEyIjsKCiAgICAvLyBjYW52YXMgbWFuYWdlciB0byByZXVzZSBjYW52YXNlcyBvbiB0aGUgcGxvdC4KICAgIC8vIFNob3VsZCBoZWxwIHNvbHZlIHByb2JsZW0gb2YgY2FudmFzZXMgbm90IGJlaW5nIGZyZWVkIGFuZAogICAgLy8gcHJvYmxlbSBvZiB3YWl0aW5nIGZvcmV2ZXIgZm9yIGZpcmVmb3ggdG8gZGVjaWRlIHRvIGZyZWUgbWVtb3J5LgogICAgJC5qcXBsb3QuQ2FudmFzTWFuYWdlciA9IGZ1bmN0aW9uKCkgewogICAgICAgIC8vIGNhbnZhc2VzIGFyZSBtYW5hZ2VkIGdsb2JhbGx5IHNvIHRoYXQgdGhleSBjYW4gYmUgcmV1c2VkCiAgICAgICAgLy8gYWNyb3NzIHBsb3RzIGFmdGVyIHRoZXkgaGF2ZSBiZWVuIGZyZWVkCiAgICAgICAgaWYgKHR5cGVvZiAkLmpxcGxvdC5DYW52YXNNYW5hZ2VyLmNhbnZhc2VzID09ICd1bmRlZmluZWQnKSB7CiAgICAgICAgICAgICQuanFwbG90LkNhbnZhc01hbmFnZXIuY2FudmFzZXMgPSBbXTsKICAgICAgICAgICAgJC5qcXBsb3QuQ2FudmFzTWFuYWdlci5mcmVlID0gW107CiAgICAgICAgfQogICAgICAgIAogICAgICAgIHZhciBteUNhbnZhc2VzID0gW107CiAgICAgICAgCiAgICAgICAgdGhpcy5nZXRDYW52YXMgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIGNhbnZhczsKICAgICAgICAgICAgdmFyIG1ha2VOZXcgPSB0cnVlOwogICAgICAgICAgICAKICAgICAgICAgICAgaWYgKCEkLmpxcGxvdC51c2VfZXhjYW52YXMpIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gJC5qcXBsb3QuQ2FudmFzTWFuYWdlci5jYW52YXNlcy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJC5qcXBsb3QuQ2FudmFzTWFuYWdlci5mcmVlW2ldID09PSB0cnVlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VOZXcgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgY2FudmFzID0gJC5qcXBsb3QuQ2FudmFzTWFuYWdlci5jYW52YXNlc1tpXTsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gJChjYW52YXMpLnJlbW92ZUNsYXNzKCdqcXBsb3QtY2FudmFzTWFuYWdlci1mcmVlJykuYWRkQ2xhc3MoJ2pxcGxvdC1jYW52YXNNYW5hZ2VyLWludXNlJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICQuanFwbG90LkNhbnZhc01hbmFnZXIuZnJlZVtpXSA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICBteUNhbnZhc2VzLnB1c2goaSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKG1ha2VOZXcpIHsKICAgICAgICAgICAgICAgIGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpOwogICAgICAgICAgICAgICAgbXlDYW52YXNlcy5wdXNoKCQuanFwbG90LkNhbnZhc01hbmFnZXIuY2FudmFzZXMubGVuZ3RoKTsKICAgICAgICAgICAgICAgICQuanFwbG90LkNhbnZhc01hbmFnZXIuY2FudmFzZXMucHVzaChjYW52YXMpOwogICAgICAgICAgICAgICAgJC5qcXBsb3QuQ2FudmFzTWFuYWdlci5mcmVlLnB1c2goZmFsc2UpOwogICAgICAgICAgICB9ICAgCiAgICAgICAgICAgIAogICAgICAgICAgICByZXR1cm4gY2FudmFzOwogICAgICAgIH07CiAgICAgICAgCiAgICAgICAgLy8gdGhpcyBtZXRob2QgaGFzIHRvIGJlIHVzZWQgYWZ0ZXIgc2V0dGluZ3MgdGhlIGRpbWVzaW9ucwogICAgICAgIC8vIG9uIHRoZSBlbGVtZW50IHJldHVybmVkIGJ5IGdldENhbnZhcygpCiAgICAgICAgdGhpcy5pbml0Q2FudmFzID0gZnVuY3Rpb24oY2FudmFzKSB7CiAgICAgICAgICAgIGlmICgkLmpxcGxvdC51c2VfZXhjYW52YXMpIHsKICAgICAgICAgICAgICAgIHJldHVybiB3aW5kb3cuR192bWxDYW52YXNNYW5hZ2VyLmluaXRFbGVtZW50KGNhbnZhcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGNhbnZhczsKICAgICAgICB9OwoKICAgICAgICB0aGlzLmZyZWVBbGxDYW52YXNlcyA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgbD1teUNhbnZhc2VzLmxlbmd0aDsgaSA8IGw7IGkrKykgewogICAgICAgICAgICAgICAgdGhpcy5mcmVlQ2FudmFzKG15Q2FudmFzZXNbaV0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG15Q2FudmFzZXMgPSBbXTsKICAgICAgICB9OwoKICAgICAgICB0aGlzLmZyZWVDYW52YXMgPSBmdW5jdGlvbihpZHgpIHsKICAgICAgICAgICAgaWYgKCQuanFwbG90LnVzZV9leGNhbnZhcyAmJiB3aW5kb3cuR192bWxDYW52YXNNYW5hZ2VyLnVuaW5pdEVsZW1lbnQgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgLy8gZXhjYW52YXMgY2FuJ3QgYmUgcmV1c2VkLCBidXQgcHJvcGVybHkgdW5zZXQKICAgICAgICAgICAgICAgIHdpbmRvdy5HX3ZtbENhbnZhc01hbmFnZXIudW5pbml0RWxlbWVudCgkLmpxcGxvdC5DYW52YXNNYW5hZ2VyLmNhbnZhc2VzW2lkeF0pOwogICAgICAgICAgICAgICAgJC5qcXBsb3QuQ2FudmFzTWFuYWdlci5jYW52YXNlc1tpZHhdID0gbnVsbDsKICAgICAgICAgICAgfSAKICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICB2YXIgY2FudmFzID0gJC5qcXBsb3QuQ2FudmFzTWFuYWdlci5jYW52YXNlc1tpZHhdOwogICAgICAgICAgICAgICAgY2FudmFzLmdldENvbnRleHQoJzJkJykuY2xlYXJSZWN0KDAsIDAsIGNhbnZhcy53aWR0aCwgY2FudmFzLmhlaWdodCk7CiAgICAgICAgICAgICAgICAkKGNhbnZhcykudW5iaW5kKCkucmVtb3ZlQXR0cignY2xhc3MnKS5yZW1vdmVBdHRyKCdzdHlsZScpOwogICAgICAgICAgICAgICAgLy8gU3R5bGUgYXR0cmlidXRlcyBzZWVtZWQgdG8gYmUgc3RpbGwgaGFuZ2luZyBhcm91bmQuICB3aWVyZC4gIFNvbWUgdGlja3MKICAgICAgICAgICAgICAgIC8vIHN0aWxsIHJldGFpbmVkIGEgbGVmdDogMHB4IGF0dHJpYnV0ZSBhZnRlciByZXVzaW5nIGEgY2FudmFzLgogICAgICAgICAgICAgICAgJChjYW52YXMpLmNzcyh7bGVmdDogJycsIHRvcDogJycsIHBvc2l0aW9uOiAnJ30pOwogICAgICAgICAgICAgICAgLy8gc2V0dGluZyBzaXplIHRvIDAgbWF5IHNhdmUgbWVtb3J5IG9mIHVudXNlZCBjYW52YXNlcz8KICAgICAgICAgICAgICAgIGNhbnZhcy53aWR0aCA9IDA7CiAgICAgICAgICAgICAgICBjYW52YXMuaGVpZ2h0ID0gMDsKICAgICAgICAgICAgICAgICQuanFwbG90LkNhbnZhc01hbmFnZXIuZnJlZVtpZHhdID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgCiAgICB9OwoKICAgICAgICAgICAgCiAgICAvLyBDb252aWVuZW5jZSBmdW5jdGlvbiB0aGF0IHdvbid0IGhhbmcgSUUgb3IgRkYgd2l0aG91dCBGaXJlQnVnLgogICAgJC5qcXBsb3QubG9nID0gZnVuY3Rpb24oKSB7CiAgICAgICAgaWYgKHdpbmRvdy5jb25zb2xlKSB7CiAgICAgICAgICAgIHdpbmRvdy5jb25zb2xlLmxvZy5hcHBseSh3aW5kb3cuY29uc29sZSwgYXJndW1lbnRzKTsKICAgICAgICB9CiAgICB9OwogICAgICAgIAogICAgJC5qcXBsb3QuY29uZmlnID0gewogICAgICAgIGFkZERvbVJlZmVyZW5jZTogZmFsc2UsCiAgICAgICAgZW5hYmxlUGx1Z2luczpmYWxzZSwKICAgICAgICBkZWZhdWx0SGVpZ2h0OjMwMCwKICAgICAgICBkZWZhdWx0V2lkdGg6NDAwLAogICAgICAgIFVUQ0FkanVzdDpmYWxzZSwKICAgICAgICB0aW1lem9uZU9mZnNldDogbmV3IERhdGUobmV3IERhdGUoKS5nZXRUaW1lem9uZU9mZnNldCgpICogNjAwMDApLAogICAgICAgIGVycm9yTWVzc2FnZTogJycsCiAgICAgICAgZXJyb3JCYWNrZ3JvdW5kOiAnJywKICAgICAgICBlcnJvckJvcmRlcjogJycsCiAgICAgICAgZXJyb3JGb250RmFtaWx5OiAnJywKICAgICAgICBlcnJvckZvbnRTaXplOiAnJywKICAgICAgICBlcnJvckZvbnRTdHlsZTogJycsCiAgICAgICAgZXJyb3JGb250V2VpZ2h0OiAnJywKICAgICAgICBjYXRjaEVycm9yczogZmFsc2UsCiAgICAgICAgZGVmYXVsdFRpY2tGb3JtYXRTdHJpbmc6ICIlLjFmIiwKICAgICAgICBkZWZhdWx0Q29sb3JzOiBbICIjNGJiMmM1IiwgIiNFQUEyMjgiLCAiI2M1YjQ3ZiIsICIjNTc5NTc1IiwgIiM4Mzk1NTciLCAiIzk1OGMxMiIsICIjOTUzNTc5IiwgIiM0YjVkZTQiLCAiI2Q4YjgzZiIsICIjZmY1ODAwIiwgIiMwMDg1Y2MiLCAiI2M3NDdhMyIsICIjY2RkZjU0IiwgIiNGQkQxNzgiLCAiIzI2QjRFMyIsICIjYmQ3MGM3Il0sCiAgICAgICAgZGVmYXVsdE5lZ2F0aXZlQ29sb3JzOiBbICIjNDk4OTkxIiwgIiNDMDg4NDAiLCAiIzlGOTI3NCIsICIjNTQ2RDYxIiwgIiM2NDZDNEEiLCAiIzZGNjYyMSIsICIjNkUzRjVGIiwgIiM0RjY0QjAiLCAiI0E4OTA1MCIsICIjQzQ1OTIzIiwgIiMxODczOTkiLCAiIzk0NTM4MSIsICIjOTU5RTVDIiwgIiNDN0FGN0IiLCAiIzQ3ODM5NiIsICIjOTA3Mjk0Il0sCiAgICAgICAgZGFzaExlbmd0aDogNCwKICAgICAgICBnYXBMZW5ndGg6IDQsCiAgICAgICAgZG90R2FwTGVuZ3RoOiAyLjUsCiAgICAgICAgc3JjTG9jYXRpb246ICdqcXBsb3Qvc3JjLycsCiAgICAgICAgcGx1Z2luTG9jYXRpb246ICdqcXBsb3Qvc3JjL3BsdWdpbnMvJwogICAgfTsKICAgIAogICAgCiAgICAkLmpxcGxvdC5hcnJheU1heCA9IGZ1bmN0aW9uKCBhcnJheSApewogICAgICAgIHJldHVybiBNYXRoLm1heC5hcHBseSggTWF0aCwgYXJyYXkgKTsKICAgIH07CiAgICAKICAgICQuanFwbG90LmFycmF5TWluID0gZnVuY3Rpb24oIGFycmF5ICl7CiAgICAgICAgcmV0dXJuIE1hdGgubWluLmFwcGx5KCBNYXRoLCBhcnJheSApOwogICAgfTsKICAgIAogICAgJC5qcXBsb3QuZW5hYmxlUGx1Z2lucyA9ICQuanFwbG90LmNvbmZpZy5lbmFibGVQbHVnaW5zOwogICAgCiAgICAvLyBjYW52YXMgcmVsYXRlZCB0ZXN0cyB0YWtlbiBmcm9tIG1vZGVybml6ZXI6CiAgICAvLyBDb3B5cmlnaHQgKGMpIDIwMDkgLSAyMDEwIEZhcnVrIEF0ZXMuCiAgICAvLyBodHRwOi8vd3d3Lm1vZGVybml6ci5jb20KICAgIAogICAgJC5qcXBsb3Quc3VwcG9ydF9jYW52YXMgPSBmdW5jdGlvbigpIHsKICAgICAgICBpZiAodHlwZW9mICQuanFwbG90LnN1cHBvcnRfY2FudmFzLnJlc3VsdCA9PSAndW5kZWZpbmVkJykgewogICAgICAgICAgICAkLmpxcGxvdC5zdXBwb3J0X2NhbnZhcy5yZXN1bHQgPSAhIWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpLmdldENvbnRleHQ7IAogICAgICAgIH0KICAgICAgICByZXR1cm4gJC5qcXBsb3Quc3VwcG9ydF9jYW52YXMucmVzdWx0OwogICAgfTsKICAgICAgICAgICAgCiAgICAkLmpxcGxvdC5zdXBwb3J0X2NhbnZhc190ZXh0ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgaWYgKHR5cGVvZiAkLmpxcGxvdC5zdXBwb3J0X2NhbnZhc190ZXh0LnJlc3VsdCA9PSAndW5kZWZpbmVkJykgewogICAgICAgICAgICBpZiAod2luZG93Lkdfdm1sQ2FudmFzTWFuYWdlciAhPT0gdW5kZWZpbmVkICYmIHdpbmRvdy5HX3ZtbENhbnZhc01hbmFnZXIuX3ZlcnNpb24gPiA4ODcpIHsKICAgICAgICAgICAgICAgICQuanFwbG90LnN1cHBvcnRfY2FudmFzX3RleHQucmVzdWx0ID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICQuanFwbG90LnN1cHBvcnRfY2FudmFzX3RleHQucmVzdWx0ID0gISEoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJykuZ2V0Q29udGV4dCAmJiB0eXBlb2YgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJykuZ2V0Q29udGV4dCgnMmQnKS5maWxsVGV4dCA9PSAnZnVuY3Rpb24nKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAgCiAgICAgICAgfQogICAgICAgIHJldHVybiAkLmpxcGxvdC5zdXBwb3J0X2NhbnZhc190ZXh0LnJlc3VsdDsKICAgIH07CiAgICAKICAgICQuanFwbG90LnVzZV9leGNhbnZhcyA9ICgkLmJyb3dzZXIubXNpZSAmJiAhJC5qcXBsb3Quc3VwcG9ydF9jYW52YXMoKSkgPyB0cnVlIDogZmFsc2U7CiAgICAKICAgIC8qKgogICAgICogCiAgICAgKiBIb29rczoganFQbG90IFB1Z2luIEhvb2tzCiAgICAgKiAKICAgICAqICQuanFwbG90LnByZUluaXRIb29rcyAtIGNhbGxlZCBiZWZvcmUgaW5pdGlhbGl6YXRpb24uCiAgICAgKiAkLmpxcGxvdC5wb3N0SW5pdEhvb2tzIC0gY2FsbGVkIGFmdGVyIGluaXRpYWxpemF0aW9uLgogICAgICogJC5qcXBsb3QucHJlUGFyc2VPcHRpb25zSG9va3MgLSBjYWxsZWQgYmVmb3JlIHVzZXIgb3B0aW9ucyBhcmUgcGFyc2VkLgogICAgICogJC5qcXBsb3QucG9zdFBhcnNlT3B0aW9uc0hvb2tzIC0gY2FsbGVkIGFmdGVyIHVzZXIgb3B0aW9ucyBhcmUgcGFyc2VkLgogICAgICogJC5qcXBsb3QucHJlRHJhd0hvb2tzIC0gY2FsbGVkIGJlZm9yZSBwbG90IGRyYXcuCiAgICAgKiAkLmpxcGxvdC5wb3N0RHJhd0hvb2tzIC0gY2FsbGVkIGFmdGVyIHBsb3QgZHJhdy4KICAgICAqICQuanFwbG90LnByZURyYXdTZXJpZXNIb29rcyAtIGNhbGxlZCBiZWZvcmUgZWFjaCBzZXJpZXMgaXMgZHJhd24uCiAgICAgKiAkLmpxcGxvdC5wb3N0RHJhd1Nlcmllc0hvb2tzIC0gY2FsbGVkIGFmdGVyIGVhY2ggc2VyaWVzIGlzIGRyYXduLgogICAgICogJC5qcXBsb3QucHJlRHJhd0xlZ2VuZEhvb2tzIC0gY2FsbGVkIGJlZm9yZSB0aGUgbGVnZW5kIGlzIGRyYXduLgogICAgICogJC5qcXBsb3QuYWRkTGVnZW5kUm93SG9va3MgLSBjYWxsZWQgYXQgdGhlIGVuZCBvZiBsZWdlbmQgZHJhdywgc28gcGx1Z2lucwogICAgICogICAgIGNhbiBhZGQgcm93cyB0byB0aGUgbGVnZW5kIHRhYmxlLgogICAgICogJC5qcXBsb3QucHJlU2VyaWVzSW5pdEhvb2tzIC0gY2FsbGVkIGJlZm9yZSBzZXJpZXMgaXMgaW5pdGlhbGl6ZWQuCiAgICAgKiAkLmpxcGxvdC5wb3N0U2VyaWVzSW5pdEhvb2tzIC0gY2FsbGVkIGFmdGVyIHNlcmllcyBpcyBpbml0aWFsaXplZC4KICAgICAqICQuanFwbG90LnByZVBhcnNlU2VyaWVzT3B0aW9uc0hvb2tzIC0gY2FsbGVkIGJlZm9yZSBzZXJpZXMgcmVsYXRlZCBvcHRpb25zCiAgICAgKiAgICAgYXJlIHBhcnNlZC4KICAgICAqICQuanFwbG90LnBvc3RQYXJzZVNlcmllc09wdGlvbnNIb29rcyAtIGNhbGxlZCBhZnRlciBzZXJpZXMgcmVsYXRlZCBvcHRpb25zCiAgICAgKiAgICAgYXJlIHBhcnNlZC4KICAgICAqICQuanFwbG90LmV2ZW50TGlzdGVuZXJIb29rcyAtIGNhbGxlZCBhdCB0aGUgZW5kIG9mIHBsb3QgZHJhd2luZywgYmluZHMKICAgICAqICAgICBsaXN0ZW5lcnMgdG8gdGhlIGV2ZW50IGNhbnZhcyB3aGljaCBsYXlzIG9uIHRvcCBvZiB0aGUgZ3JpZCBhcmVhLgogICAgICogJC5qcXBsb3QucHJlRHJhd1Nlcmllc1NoYWRvd0hvb2tzIC0gY2FsbGVkIGJlZm9yZSBzZXJpZXMgc2hhZG93cyBhcmUgZHJhd24uCiAgICAgKiAkLmpxcGxvdC5wb3N0RHJhd1Nlcmllc1NoYWRvd0hvb2tzIC0gY2FsbGVkIGFmdGVyIHNlcmllcyBzaGFkb3dzIGFyZSBkcmF3bi4KICAgICAqIAogICAgICovCiAgICAKICAgICQuanFwbG90LnByZUluaXRIb29rcyA9IFtdOwogICAgJC5qcXBsb3QucG9zdEluaXRIb29rcyA9IFtdOwogICAgJC5qcXBsb3QucHJlUGFyc2VPcHRpb25zSG9va3MgPSBbXTsKICAgICQuanFwbG90LnBvc3RQYXJzZU9wdGlvbnNIb29rcyA9IFtdOwogICAgJC5qcXBsb3QucHJlRHJhd0hvb2tzID0gW107CiAgICAkLmpxcGxvdC5wb3N0RHJhd0hvb2tzID0gW107CiAgICAkLmpxcGxvdC5wcmVEcmF3U2VyaWVzSG9va3MgPSBbXTsKICAgICQuanFwbG90LnBvc3REcmF3U2VyaWVzSG9va3MgPSBbXTsKICAgICQuanFwbG90LnByZURyYXdMZWdlbmRIb29rcyA9IFtdOwogICAgJC5qcXBsb3QuYWRkTGVnZW5kUm93SG9va3MgPSBbXTsKICAgICQuanFwbG90LnByZVNlcmllc0luaXRIb29rcyA9IFtdOwogICAgJC5qcXBsb3QucG9zdFNlcmllc0luaXRIb29rcyA9IFtdOwogICAgJC5qcXBsb3QucHJlUGFyc2VTZXJpZXNPcHRpb25zSG9va3MgPSBbXTsKICAgICQuanFwbG90LnBvc3RQYXJzZVNlcmllc09wdGlvbnNIb29rcyA9IFtdOwogICAgJC5qcXBsb3QuZXZlbnRMaXN0ZW5lckhvb2tzID0gW107CiAgICAkLmpxcGxvdC5wcmVEcmF3U2VyaWVzU2hhZG93SG9va3MgPSBbXTsKICAgICQuanFwbG90LnBvc3REcmF3U2VyaWVzU2hhZG93SG9va3MgPSBbXTsKCiAgICAvLyBBIHN1cGVyY2xhc3MgaG9sZGluZyBzb21lIGNvbW1vbiBwcm9wZXJ0aWVzIGFuZCBtZXRob2RzLgogICAgJC5qcXBsb3QuRWxlbUNvbnRhaW5lciA9IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuX2VsZW07CiAgICAgICAgdGhpcy5fcGxvdFdpZHRoOwogICAgICAgIHRoaXMuX3Bsb3RIZWlnaHQ7CiAgICAgICAgdGhpcy5fcGxvdERpbWVuc2lvbnMgPSB7aGVpZ2h0Om51bGwsIHdpZHRoOm51bGx9OwogICAgfTsKICAgIAogICAgJC5qcXBsb3QuRWxlbUNvbnRhaW5lci5wcm90b3R5cGUuY3JlYXRlRWxlbWVudCA9IGZ1bmN0aW9uKGVsLCBvZmZzZXRzLCBjbHNzLCBjc3NvcHRzLCBhdHRyaWIpIHsKICAgICAgICB0aGlzLl9vZmZzZXRzID0gb2Zmc2V0czsKICAgICAgICB2YXIga2xhc3MgPSBjbHNzIHx8ICdqcXBsb3QnOwogICAgICAgIHZhciBlbGVtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChlbCk7CiAgICAgICAgdGhpcy5fZWxlbSA9ICQoZWxlbSk7CiAgICAgICAgdGhpcy5fZWxlbS5hZGRDbGFzcyhrbGFzcyk7CiAgICAgICAgdGhpcy5fZWxlbS5jc3MoY3Nzb3B0cyk7CiAgICAgICAgdGhpcy5fZWxlbS5hdHRyKGF0dHJpYik7CiAgICAgICAgLy8gYXZvaWQgbWVtb3J5IGxlYWs7CiAgICAgICAgZWxlbSA9IG51bGw7CiAgICAgICAgcmV0dXJuIHRoaXMuX2VsZW07CiAgICB9OwogICAgCiAgICAkLmpxcGxvdC5FbGVtQ29udGFpbmVyLnByb3RvdHlwZS5nZXRXaWR0aCA9IGZ1bmN0aW9uKCkgewogICAgICAgIGlmICh0aGlzLl9lbGVtKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9lbGVtLm91dGVyV2lkdGgodHJ1ZSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICB9OwogICAgCiAgICAkLmpxcGxvdC5FbGVtQ29udGFpbmVyLnByb3RvdHlwZS5nZXRIZWlnaHQgPSBmdW5jdGlvbigpIHsKICAgICAgICBpZiAodGhpcy5fZWxlbSkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fZWxlbS5vdXRlckhlaWdodCh0cnVlKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgIH07CiAgICAKICAgICQuanFwbG90LkVsZW1Db250YWluZXIucHJvdG90eXBlLmdldFBvc2l0aW9uID0gZnVuY3Rpb24oKSB7CiAgICAgICAgaWYgKHRoaXMuX2VsZW0pIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2VsZW0ucG9zaXRpb24oKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHJldHVybiB7dG9wOm51bGwsIGxlZnQ6bnVsbCwgYm90dG9tOm51bGwsIHJpZ2h0Om51bGx9OwogICAgICAgIH0KICAgIH07CiAgICAKICAgICQuanFwbG90LkVsZW1Db250YWluZXIucHJvdG90eXBlLmdldFRvcCA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLmdldFBvc2l0aW9uKCkudG9wOwogICAgfTsKICAgIAogICAgJC5qcXBsb3QuRWxlbUNvbnRhaW5lci5wcm90b3R5cGUuZ2V0TGVmdCA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLmdldFBvc2l0aW9uKCkubGVmdDsKICAgIH07CiAgICAKICAgICQuanFwbG90LkVsZW1Db250YWluZXIucHJvdG90eXBlLmdldEJvdHRvbSA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLl9lbGVtLmNzcygnYm90dG9tJyk7CiAgICB9OwogICAgCiAgICAkLmpxcGxvdC5FbGVtQ29udGFpbmVyLnByb3RvdHlwZS5nZXRSaWdodCA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLl9lbGVtLmNzcygncmlnaHQnKTsKICAgIH07CiAgICAKCiAgICAvKioKICAgICAqIENsYXNzOiBBeGlzCiAgICAgKiBBbiBpbmRpdmlkdWFsIGF4aXMgb2JqZWN0LiAgQ2Fubm90IGJlIGluc3RhbnRpYXRlZCBkaXJlY3RseSwgYnV0IGNyZWF0ZWQKICAgICAqIGJ5IHRoZSBQbG90IG9qZWN0LiAgQXhpcyBwcm9wZXJ0aWVzIGNhbiBiZSBzZXQgb3Igb3ZlcnJpZGVuIGJ5IHRoZSAKICAgICAqIG9wdGlvbnMgcGFzc2VkIGluIGZyb20gdGhlIHVzZXIuCiAgICAgKiAKICAgICAqLwogICAgZnVuY3Rpb24gQXhpcyhuYW1lKSB7CiAgICAgICAgJC5qcXBsb3QuRWxlbUNvbnRhaW5lci5jYWxsKHRoaXMpOwogICAgICAgIC8vIEdyb3VwOiBQcm9wZXJ0aWVzCiAgICAgICAgLy8KICAgICAgICAvLyBBeGVzIG9wdGlvbnMgYXJlIHNwZWNpZmllZCB3aXRoaW4gYW4gYXhlcyBvYmplY3QgYXQgdGhlIHRvcCBsZXZlbCBvZiB0aGUgCiAgICAgICAgLy8gcGxvdCBvcHRpb25zIGxpa2Ugc286CiAgICAgICAgLy8gPiB7CiAgICAgICAgLy8gPiAgICBheGVzOiB7CiAgICAgICAgLy8gPiAgICAgICAgeGF4aXM6IHttaW46IDV9LAogICAgICAgIC8vID4gICAgICAgIHlheGlzOiB7bWluOiAyLCBtYXg6IDgsIG51bWJlclRpY2tzOjR9LAogICAgICAgIC8vID4gICAgICAgIHgyYXhpczoge3BhZDogMS41fSwKICAgICAgICAvLyA+ICAgICAgICB5MmF4aXM6IHt0aWNrczpbMjIsIDQ0LCA2NiwgODhdfQogICAgICAgIC8vID4gICAgICAgIH0KICAgICAgICAvLyA+IH0KICAgICAgICAvLyBUaGVyZSBhcmUgMiB4IGF4ZXMsICd4YXhpcycgYW5kICd4MmF4aXMnLCBhbmQgCiAgICAgICAgLy8gOSB5YXhlcywgJ3lheGlzJywgJ3kyYXhpcycuICd5M2F4aXMnLCAuLi4gIEFueSBvciBhbGwgb2Ygd2hpY2ggbWF5IGJlIHNwZWNpZmllZC4KICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwogICAgICAgIHRoaXMuX3NlcmllcyA9IFtdOwogICAgICAgIC8vIHByb3A6IHNob3cKICAgICAgICAvLyBXZXRoZXIgdG8gZGlzcGxheSB0aGUgYXhpcyBvbiB0aGUgZ3JhcGguCiAgICAgICAgdGhpcy5zaG93ID0gZmFsc2U7CiAgICAgICAgLy8gcHJvcDogdGlja1JlbmRlcmVyCiAgICAgICAgLy8gQSBjbGFzcyBvZiBhIHJlbmRlcmluZyBlbmdpbmUgZm9yIGNyZWF0aW5nIHRoZSB0aWNrcyBsYWJlbHMgZGlzcGxheWVkIG9uIHRoZSBwbG90LCAKICAgICAgICAvLyBTZWUgPCQuanFwbG90LkF4aXNUaWNrUmVuZGVyZXI+LgogICAgICAgIHRoaXMudGlja1JlbmRlcmVyID0gJC5qcXBsb3QuQXhpc1RpY2tSZW5kZXJlcjsKICAgICAgICAvLyBwcm9wOiB0aWNrT3B0aW9ucwogICAgICAgIC8vIE9wdGlvbnMgdGhhdCB3aWxsIGJlIHBhc3NlZCB0byB0aGUgdGlja1JlbmRlcmVyLCBzZWUgPCQuanFwbG90LkF4aXNUaWNrUmVuZGVyZXI+IG9wdGlvbnMuCiAgICAgICAgdGhpcy50aWNrT3B0aW9ucyA9IHt9OwogICAgICAgIC8vIHByb3A6IGxhYmVsUmVuZGVyZXIKICAgICAgICAvLyBBIGNsYXNzIG9mIGEgcmVuZGVyaW5nIGVuZ2luZSBmb3IgY3JlYXRpbmcgYW4gYXhpcyBsYWJlbC4KICAgICAgICB0aGlzLmxhYmVsUmVuZGVyZXIgPSAkLmpxcGxvdC5BeGlzTGFiZWxSZW5kZXJlcjsKICAgICAgICAvLyBwcm9wOiBsYWJlbE9wdGlvbnMKICAgICAgICAvLyBPcHRpb25zIHBhc3NlZCB0byB0aGUgbGFiZWwgcmVuZGVyZXIuCiAgICAgICAgdGhpcy5sYWJlbE9wdGlvbnMgPSB7fTsKICAgICAgICAvLyBwcm9wOiBsYWJlbAogICAgICAgIC8vIExhYmVsIGZvciB0aGUgYXhpcwogICAgICAgIHRoaXMubGFiZWwgPSBudWxsOwogICAgICAgIC8vIHByb3A6IHNob3dMYWJlbAogICAgICAgIC8vIHRydWUgdG8gc2hvdyB0aGUgYXhpcyBsYWJlbC4KICAgICAgICB0aGlzLnNob3dMYWJlbCA9IHRydWU7CiAgICAgICAgLy8gcHJvcDogbWluCiAgICAgICAgLy8gbWluaW11bSB2YWx1ZSBvZiB0aGUgYXhpcyAoaW4gZGF0YSB1bml0cywgbm90IHBpeGVscykuCiAgICAgICAgdGhpcy5taW4gPSBudWxsOwogICAgICAgIC8vIHByb3A6IG1heAogICAgICAgIC8vIG1heGltdW0gdmFsdWUgb2YgdGhlIGF4aXMgKGluIGRhdGEgdW5pdHMsIG5vdCBwaXhlbHMpLgogICAgICAgIHRoaXMubWF4ID0gbnVsbDsKICAgICAgICAvLyBwcm9wOiBhdXRvc2NhbGUKICAgICAgICAvLyBERVBSRUNBVEVECiAgICAgICAgLy8gdGhlIGRlZmF1bHQgc2NhbGluZyBhbGdvcml0aG0gcHJvZHVjZXMgc3VwZXJpb3IgcmVzdWx0cy4KICAgICAgICB0aGlzLmF1dG9zY2FsZSA9IGZhbHNlOwogICAgICAgIC8vIHByb3A6IHBhZAogICAgICAgIC8vIFBhZGRpbmcgdG8gZXh0ZW5kIHRoZSByYW5nZSBhYm92ZSBhbmQgYmVsb3cgdGhlIGRhdGEgYm91bmRzLgogICAgICAgIC8vIFRoZSBkYXRhIHJhbmdlIGlzIG11bHRpcGxpZWQgYnkgdGhpcyBmYWN0b3IgdG8gZGV0ZXJtaW5lIG1pbmltdW0gYW5kIG1heGltdW0gYXhpcyBib3VuZHMuCiAgICAgICAgLy8gQSB2YWx1ZSBvZiAwIHdpbGwgYmUgaW50ZXJwcmV0ZWQgdG8gbWVhbiBubyBwYWRkaW5nLCBhbmQgcGFkIHdpbGwgYmUgc2V0IHRvIDEuMC4KICAgICAgICB0aGlzLnBhZCA9IDEuMjsKICAgICAgICAvLyBwcm9wOiBwYWRNYXgKICAgICAgICAvLyBQYWRkaW5nIHRvIGV4dGVuZCB0aGUgcmFuZ2UgYWJvdmUgZGF0YSBib3VuZHMuCiAgICAgICAgLy8gVGhlIHRvcCBvZiB0aGUgZGF0YSByYW5nZSBpcyBtdWx0aXBsaWVkIGJ5IHRoaXMgZmFjdG9yIHRvIGRldGVybWluZSBtYXhpbXVtIGF4aXMgYm91bmRzLgogICAgICAgIC8vIEEgdmFsdWUgb2YgMCB3aWxsIGJlIGludGVycHJldGVkIHRvIG1lYW4gbm8gcGFkZGluZywgYW5kIHBhZE1heCB3aWxsIGJlIHNldCB0byAxLjAuCiAgICAgICAgdGhpcy5wYWRNYXggPSBudWxsOwogICAgICAgIC8vIHByb3A6IHBhZE1pbgogICAgICAgIC8vIFBhZGRpbmcgdG8gZXh0ZW5kIHRoZSByYW5nZSBiZWxvdyBkYXRhIGJvdW5kcy4KICAgICAgICAvLyBUaGUgYm90dG9tIG9mIHRoZSBkYXRhIHJhbmdlIGlzIG11bHRpcGxpZWQgYnkgdGhpcyBmYWN0b3IgdG8gZGV0ZXJtaW5lIG1pbmltdW0gYXhpcyBib3VuZHMuCiAgICAgICAgLy8gQSB2YWx1ZSBvZiAwIHdpbGwgYmUgaW50ZXJwcmV0ZWQgdG8gbWVhbiBubyBwYWRkaW5nLCBhbmQgcGFkTWluIHdpbGwgYmUgc2V0IHRvIDEuMC4KICAgICAgICB0aGlzLnBhZE1pbiA9IG51bGw7CiAgICAgICAgLy8gcHJvcDogdGlja3MKICAgICAgICAvLyAxRCBbdmFsLCB2YWwsIC4uLl0gb3IgMkQgW1t2YWwsIGxhYmVsXSwgW3ZhbCwgbGFiZWxdLCAuLi5dIGFycmF5IG9mIHRpY2tzIGZvciB0aGUgYXhpcy4KICAgICAgICAvLyBJZiBubyBsYWJlbCBpcyBzcGVjaWZpZWQsIHRoZSB2YWx1ZSBpcyBmb3JtYXR0ZWQgaW50byBhbiBhcHByb3ByaWF0ZSBsYWJlbC4KICAgICAgICB0aGlzLnRpY2tzID0gW107CiAgICAgICAgLy8gcHJvcDogbnVtYmVyVGlja3MKICAgICAgICAvLyBEZXNpcmVkIG51bWJlciBvZiB0aWNrcy4gIERlZmF1bHQgaXMgdG8gY29tcHV0ZSBhdXRvbWF0aWNhbGx5LgogICAgICAgIHRoaXMubnVtYmVyVGlja3M7CiAgICAgICAgLy8gcHJvcDogdGlja0ludGVydmFsCiAgICAgICAgLy8gbnVtYmVyIG9mIHVuaXRzIGJldHdlZW4gdGlja3MuICBNdXR1YWxseSBleGNsdXNpdmUgd2l0aCBudW1iZXJUaWNrcy4KICAgICAgICB0aGlzLnRpY2tJbnRlcnZhbDsKICAgICAgICAvLyBwcm9wOiByZW5kZXJlcgogICAgICAgIC8vIEEgY2xhc3Mgb2YgYSByZW5kZXJpbmcgZW5naW5lIHRoYXQgaGFuZGxlcyB0aWNrIGdlbmVyYXRpb24sIAogICAgICAgIC8vIHNjYWxpbmcgaW5wdXQgZGF0YSB0byBwaXhlbCBncmlkIHVuaXRzIGFuZCBkcmF3aW5nIHRoZSBheGlzIGVsZW1lbnQuCiAgICAgICAgdGhpcy5yZW5kZXJlciA9ICQuanFwbG90LkxpbmVhckF4aXNSZW5kZXJlcjsKICAgICAgICAvLyBwcm9wOiByZW5kZXJlck9wdGlvbnMKICAgICAgICAvLyByZW5kZXJlciBzcGVjaWZpYyBvcHRpb25zLiAgU2VlIDwkLmpxcGxvdC5MaW5lYXJBeGlzUmVuZGVyZXI+IGZvciBvcHRpb25zLgogICAgICAgIHRoaXMucmVuZGVyZXJPcHRpb25zID0ge307CiAgICAgICAgLy8gcHJvcDogc2hvd1RpY2tzCiAgICAgICAgLy8gV2V0aGVyIHRvIHNob3cgdGhlIHRpY2tzIChib3RoIG1hcmtzIGFuZCBsYWJlbHMpIG9yIG5vdC4KICAgICAgICAvLyBXaWxsIG5vdCBvdmVycmlkZSBzaG93TWFyayBhbmQgc2hvd0xhYmVsIG9wdGlvbnMgaWYgc3BlY2lmaWVkIG9uIHRoZSB0aWNrcyB0aGVtc2VsdmVzLgogICAgICAgIHRoaXMuc2hvd1RpY2tzID0gdHJ1ZTsKICAgICAgICAvLyBwcm9wOiBzaG93VGlja01hcmtzCiAgICAgICAgLy8gV2V0aGVyIHRvIHNob3cgdGhlIHRpY2sgbWFya3MgKGxpbmUgY3Jvc3NpbmcgZ3JpZCkgb3Igbm90LgogICAgICAgIC8vIE92ZXJyaWRkZW4gYnkgc2hvd1RpY2tzIGFuZCBzaG93TWFyayBvcHRpb24gb2YgdGljayBpdHNlbGYuCiAgICAgICAgdGhpcy5zaG93VGlja01hcmtzID0gdHJ1ZTsKICAgICAgICAvLyBwcm9wOiBzaG93TWlub3JUaWNrcwogICAgICAgIC8vIFdldGhlciBvciBub3QgdG8gc2hvdyBtaW5vciB0aWNrcy4gIFRoaXMgaXMgcmVuZGVyZXIgZGVwZW5kZW50LgogICAgICAgIHRoaXMuc2hvd01pbm9yVGlja3MgPSB0cnVlOwogICAgICAgIC8vIHByb3A6IGRyYXdNYWpvckdyaWRsaW5lcwogICAgICAgIC8vIFRydWUgdG8gZHJhdyBncmlkbGluZXMgZm9yIG1ham9yIGF4aXMgdGlja3MuCiAgICAgICAgdGhpcy5kcmF3TWFqb3JHcmlkbGluZXMgPSB0cnVlOwogICAgICAgIC8vIHByb3A6IGRyYXdNaW5vckdyaWRsaW5lcwogICAgICAgIC8vIFRydWUgdG8gZHJhdyBncmlkbGluZXMgZm9yIG1pbm9yIHRpY2tzLgogICAgICAgIHRoaXMuZHJhd01pbm9yR3JpZGxpbmVzID0gZmFsc2U7CiAgICAgICAgLy8gcHJvcDogZHJhd01ham9yVGlja01hcmtzCiAgICAgICAgLy8gVHJ1ZSB0byBkcmF3IHRpY2sgbWFya3MgZm9yIG1ham9yIGF4aXMgdGlja3MuCiAgICAgICAgdGhpcy5kcmF3TWFqb3JUaWNrTWFya3MgPSB0cnVlOwogICAgICAgIC8vIHByb3A6IGRyYXdNaW5vclRpY2tNYXJrcwogICAgICAgIC8vIFRydWUgdG8gZHJhdyB0aWNrIG1hcmtzIGZvciBtaW5vciB0aWNrcy4gIFRoaXMgaXMgcmVuZGVyZXIgZGVwZW5kZW50LgogICAgICAgIHRoaXMuZHJhd01pbm9yVGlja01hcmtzID0gdHJ1ZTsKICAgICAgICAvLyBwcm9wOiB1c2VTZXJpZXNDb2xvcgogICAgICAgIC8vIFVzZSB0aGUgY29sb3Igb2YgdGhlIGZpcnN0IHNlcmllcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBheGlzIGZvciB0aGUKICAgICAgICAvLyB0aWNrIG1hcmtzIGFuZCBsaW5lIGJvcmRlcmluZyB0aGlzIGF4aXMuCiAgICAgICAgdGhpcy51c2VTZXJpZXNDb2xvciA9IGZhbHNlOwogICAgICAgIC8vIHByb3A6IGJvcmRlcldpZHRoCiAgICAgICAgLy8gd2lkdGggb2YgbGluZSBzdHJva2VkIGF0IHRoZSBib3JkZXIgb2YgdGhlIGF4aXMuICBEZWZhdWx0cwogICAgICAgIC8vIHRvIHRoZSB3aWR0aCBvZiB0aGUgZ3JpZCBib2FyZGVyLgogICAgICAgIHRoaXMuYm9yZGVyV2lkdGggPSBudWxsOwogICAgICAgIC8vIHByb3A6IGJvcmRlckNvbG9yCiAgICAgICAgLy8gY29sb3Igb2YgdGhlIGJvcmRlciBhZGphY2VudCB0byB0aGUgYXhpcy4gIERlZmF1bHRzIHRvIGdyaWQgYm9yZGVyIGNvbG9yLgogICAgICAgIHRoaXMuYm9yZGVyQ29sb3IgPSBudWxsOwogICAgICAgIC8vIG1pbmltdW0gYW5kIG1heGltdW0gdmFsdWVzIG9uIHRoZSBheGlzLgogICAgICAgIHRoaXMuX2RhdGFCb3VuZHMgPSB7bWluOm51bGwsIG1heDpudWxsfTsKICAgICAgICAvLyBzdGF0aXN0aWNzIChtaW4sIG1heCwgbWVhbikgYXMgd2VsbCBhcyBhY3R1YWwgZGF0YSBpbnRlcnZhbHMgZm9yIGVhY2ggc2VyaWVzIGF0dGFjaGVkIHRvIGF4aXMuCiAgICAgICAgLy8gaG9sZHMgY29sbGVjdGlvbiBvZiB7aW50ZXJ2YWxzOltdLCBtaW46LCBtYXg6LCBtZWFuOiB9IG9iamVjdHMgZm9yIGVhY2ggc2VyaWVzIG9uIGF4aXMuCiAgICAgICAgdGhpcy5faW50ZXJ2YWxTdGF0cyA9IFtdOwogICAgICAgIC8vIHBpeGVsIHBvc2l0aW9uIGZyb20gdGhlIHRvcCBsZWZ0IG9mIHRoZSBtaW4gdmFsdWUgYW5kIG1heCB2YWx1ZSBvbiB0aGUgYXhpcy4KICAgICAgICB0aGlzLl9vZmZzZXRzID0ge21pbjpudWxsLCBtYXg6bnVsbH07CiAgICAgICAgdGhpcy5fdGlja3M9W107CiAgICAgICAgdGhpcy5fbGFiZWwgPSBudWxsOwogICAgICAgIC8vIHByb3A6IHN5bmNUaWNrcwogICAgICAgIC8vIHRydWUgdG8gdHJ5IGFuZCBzeW5jaHJvbml6ZSB0aWNrIHNwYWNpbmcgYWNyb3NzIG11bHRpcGxlIGF4ZXMgc28gdGhhdCB0aWNrcyBhbmQKICAgICAgICAvLyBncmlkIGxpbmVzIGxpbmUgdXAuICBUaGlzIGhhcyBhbiBpbXBhY3Qgb24gYXV0b3NjYWxpbmcgYWxnb3JpdGhtLCBob3dldmVyLgogICAgICAgIC8vIEluIGdlbmVyYWwsIGF1dG9zY2FsaW5nIGFuIGluZGl2aWR1YWwgYXhpcyB3aWxsIHdvcmsgYmV0dGVyIGlmIGl0IGRvZXMgbm90CiAgICAgICAgLy8gaGF2ZSB0byBzeW5jIHRpY2tzLgogICAgICAgIHRoaXMuc3luY1RpY2tzID0gbnVsbDsKICAgICAgICAvLyBwcm9wOiB0aWNrU3BhY2luZwogICAgICAgIC8vIEFwcHJveGltYXRlIHBpeGVsIHNwYWNpbmcgYmV0d2VlbiB0aWNrcyBvbiBncmFwaC4gIFVzZWQgZHVyaW5nIGF1dG9zY2FsaW5nLgogICAgICAgIC8vIFRoaXMgbnVtYmVyIHdpbGwgYmUgYW4gdXBwZXIgYm91bmQsIGFjdHVhbCBzcGFjaW5nIHdpbGwgYmUgbGVzcy4KICAgICAgICB0aGlzLnRpY2tTcGFjaW5nID0gNzU7CiAgICAgICAgLy8gUHJvcGVydGllcyB0byBob2xkIHRoZSBvcmlnaW5hbCB2YWx1ZXMgZm9yIG1pbiwgbWF4LCB0aWNrcywgdGlja0ludGVydmFsIGFuZCBudW1iZXJUaWNrcwogICAgICAgIC8vIHNvIHRoZXkgY2FuIGJlIHJlc3RvcmVkIGlmIGFsdGVyZWQgYnkgcGx1Z2lucy4KICAgICAgICB0aGlzLl9taW4gPSBudWxsOwogICAgICAgIHRoaXMuX21heCA9IG51bGw7CiAgICAgICAgdGhpcy5fdGlja0ludGVydmFsID0gbnVsbDsKICAgICAgICB0aGlzLl9udW1iZXJUaWNrcyA9IG51bGw7CiAgICAgICAgdGhpcy5fX3RpY2tzID0gbnVsbDsKICAgICAgICAvLyBob2xkIG9yaWdpbmFsIHVzZXIgb3B0aW9ucy4KICAgICAgICB0aGlzLl9vcHRpb25zID0ge307CiAgICB9CiAgICAKICAgIEF4aXMucHJvdG90eXBlID0gbmV3ICQuanFwbG90LkVsZW1Db250YWluZXIoKTsKICAgIEF4aXMucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQXhpczsKICAgIAogICAgQXhpcy5wcm90b3R5cGUuaW5pdCA9IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMucmVuZGVyZXIgPSBuZXcgdGhpcy5yZW5kZXJlcigpOwogICAgICAgIC8vIHNldCB0aGUgYXhpcyBuYW1lCiAgICAgICAgdGhpcy50aWNrT3B0aW9ucy5heGlzID0gdGhpcy5uYW1lOwogICAgICAgIC8vIGlmIHNob3dNYXJrIG9yIHNob3dMYWJlbCB0aWNrIG9wdGlvbnMgbm90IHNwZWNpZmllZCwgdXNlIHZhbHVlIG9mIGF4aXMgb3B0aW9uLgogICAgICAgIC8vIHNob3dUaWNrcyBvdmVycmlkZXMgc2hvd1RpY2tNYXJrcy4KICAgICAgICBpZiAodGhpcy50aWNrT3B0aW9ucy5zaG93TWFyayA9PSBudWxsKSB7CiAgICAgICAgICAgIHRoaXMudGlja09wdGlvbnMuc2hvd01hcmsgPSB0aGlzLnNob3dUaWNrczsKICAgICAgICB9CiAgICAgICAgaWYgKHRoaXMudGlja09wdGlvbnMuc2hvd01hcmsgPT0gbnVsbCkgewogICAgICAgICAgICB0aGlzLnRpY2tPcHRpb25zLnNob3dNYXJrID0gdGhpcy5zaG93VGlja01hcmtzOwogICAgICAgIH0KICAgICAgICBpZiAodGhpcy50aWNrT3B0aW9ucy5zaG93TGFiZWwgPT0gbnVsbCkgewogICAgICAgICAgICB0aGlzLnRpY2tPcHRpb25zLnNob3dMYWJlbCA9IHRoaXMuc2hvd1RpY2tzOwogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZiAodGhpcy5sYWJlbCA9PSBudWxsIHx8IHRoaXMubGFiZWwgPT0gJycpIHsKICAgICAgICAgICAgdGhpcy5zaG93TGFiZWwgPSBmYWxzZTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHRoaXMubGFiZWxPcHRpb25zLmxhYmVsID0gdGhpcy5sYWJlbDsKICAgICAgICB9CiAgICAgICAgaWYgKHRoaXMuc2hvd0xhYmVsID09IGZhbHNlKSB7CiAgICAgICAgICAgIHRoaXMubGFiZWxPcHRpb25zLnNob3cgPSBmYWxzZTsKICAgICAgICB9CiAgICAgICAgLy8gc2V0IHRoZSBkZWZhdWx0IHBhZE1heCwgcGFkTWluIGlmIG5vdCBzcGVjaWZpZWQKICAgICAgICAvLyBzcGVjaWFsIGNoZWNrLCBpZiBubyBwYWRkaW5nIGRlc2lyZWQsIHBhZGRpbmcKICAgICAgICAvLyBzaG91bGQgYmUgc2V0IHRvIDEuMAogICAgICAgIGlmICh0aGlzLnBhZCA9PSAwKSB7CiAgICAgICAgICAgIHRoaXMucGFkID0gMS4wOwogICAgICAgIH0KICAgICAgICBpZiAodGhpcy5wYWRNYXggPT0gMCkgewogICAgICAgICAgICB0aGlzLnBhZE1heCA9IDEuMDsKICAgICAgICB9CiAgICAgICAgaWYgKHRoaXMucGFkTWluID09IDApIHsKICAgICAgICAgICAgdGhpcy5wYWRNaW4gPSAxLjA7CiAgICAgICAgfQogICAgICAgIGlmICh0aGlzLnBhZE1heCA9PSBudWxsKSB7CiAgICAgICAgICAgIHRoaXMucGFkTWF4ID0gKHRoaXMucGFkLTEpLzIgKyAxOwogICAgICAgIH0KICAgICAgICBpZiAodGhpcy5wYWRNaW4gPT0gbnVsbCkgewogICAgICAgICAgICB0aGlzLnBhZE1pbiA9ICh0aGlzLnBhZC0xKS8yICsgMTsKICAgICAgICB9CiAgICAgICAgLy8gbm93IHRoYXQgcGFkTWluIGFuZCBwYWRNYXggYXJlIGNvcnJlY3RseSBzZXQsIHJlc2V0IHBhZCBpbiBjYXNlIHVzZXIgaGFzIHN1cHBsaWVkIAogICAgICAgIC8vIHBhZE1pbiBhbmQvb3IgcGFkTWF4CiAgICAgICAgdGhpcy5wYWQgPSB0aGlzLnBhZE1heCArIHRoaXMucGFkTWluIC0gMTsKICAgICAgICBpZiAodGhpcy5taW4gIT0gbnVsbCB8fCB0aGlzLm1heCAhPSBudWxsKSB7CiAgICAgICAgICAgIHRoaXMuYXV0b3NjYWxlID0gZmFsc2U7CiAgICAgICAgfQogICAgICAgIC8vIGlmIG5vdCBzZXQsIHN5bmMgdGlja3MgZm9yIHkgYXhlcyBidXQgbm90IHggYnkgZGVmYXVsdC4KICAgICAgICBpZiAodGhpcy5zeW5jVGlja3MgPT0gbnVsbCAmJiB0aGlzLm5hbWUuaW5kZXhPZigneScpID4gLTEpIHsKICAgICAgICAgICAgdGhpcy5zeW5jVGlja3MgPSB0cnVlOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmICh0aGlzLnN5bmNUaWNrcyA9PSBudWxsKXsKICAgICAgICAgICAgdGhpcy5zeW5jVGlja3MgPSBmYWxzZTsKICAgICAgICB9CiAgICAgICAgdGhpcy5yZW5kZXJlci5pbml0LmNhbGwodGhpcywgdGhpcy5yZW5kZXJlck9wdGlvbnMpOwogICAgICAgIAogICAgfTsKICAgIAogICAgQXhpcy5wcm90b3R5cGUuZHJhdyA9IGZ1bmN0aW9uKGN0eCwgcGxvdCkgewogICAgICAgIC8vIE1lbW9yeSBMZWFrcyBwYXRjaAogICAgICAgIGlmICh0aGlzLl9fdGlja3MpIHsKICAgICAgICAgIHRoaXMuX190aWNrcyA9IG51bGw7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gdGhpcy5yZW5kZXJlci5kcmF3LmNhbGwodGhpcywgY3R4LCBwbG90KTsKICAgICAgICAKICAgIH07CiAgICAKICAgIEF4aXMucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMucmVuZGVyZXIuc2V0LmNhbGwodGhpcyk7CiAgICB9OwogICAgCiAgICBBeGlzLnByb3RvdHlwZS5wYWNrID0gZnVuY3Rpb24ocG9zLCBvZmZzZXRzKSB7CiAgICAgICAgaWYgKHRoaXMuc2hvdykgewogICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnBhY2suY2FsbCh0aGlzLCBwb3MsIG9mZnNldHMpOwogICAgICAgIH0KICAgICAgICAvLyB0aGVzZSBwcm9wZXJ0aWVzIHNob3VsZCBhbGwgYmUgYXZhaWxhYmxlIG5vdy4KICAgICAgICBpZiAodGhpcy5fbWluID09IG51bGwpIHsKICAgICAgICAgICAgdGhpcy5fbWluID0gdGhpcy5taW47CiAgICAgICAgICAgIHRoaXMuX21heCA9IHRoaXMubWF4OwogICAgICAgICAgICB0aGlzLl90aWNrSW50ZXJ2YWwgPSB0aGlzLnRpY2tJbnRlcnZhbDsKICAgICAgICAgICAgdGhpcy5fbnVtYmVyVGlja3MgPSB0aGlzLm51bWJlclRpY2tzOwogICAgICAgICAgICB0aGlzLl9fdGlja3MgPSB0aGlzLl90aWNrczsKICAgICAgICB9CiAgICB9OwogICAgCiAgICAvLyByZXNldCB0aGUgYXhpcyBiYWNrIHRvIG9yaWdpbmFsIHZhbHVlcyBpZiBpdCBoYXMgYmVlbiBzY2FsZWQsIHpvb21lZCwgZXRjLgogICAgQXhpcy5wcm90b3R5cGUucmVzZXQgPSBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLnJlbmRlcmVyLnJlc2V0LmNhbGwodGhpcyk7CiAgICB9OwogICAgCiAgICBBeGlzLnByb3RvdHlwZS5yZXNldFNjYWxlID0gZnVuY3Rpb24ob3B0cykgewogICAgICAgICQuZXh0ZW5kKHRydWUsIHRoaXMsIHttaW46IG51bGwsIG1heDogbnVsbCwgbnVtYmVyVGlja3M6IG51bGwsIHRpY2tJbnRlcnZhbDogbnVsbCwgX3RpY2tzOiBbXSwgdGlja3M6IFtdfSwgb3B0cyk7CiAgICAgICAgdGhpcy5yZXNldERhdGFCb3VuZHMoKTsKICAgIH07CiAgICAKICAgIEF4aXMucHJvdG90eXBlLnJlc2V0RGF0YUJvdW5kcyA9IGZ1bmN0aW9uKCkgewogICAgICAgIC8vIEdvIHRocm91Z2ggYWxsIHRoZSBzZXJpZXMgYXR0YWNoZWQgdG8gdGhpcyBheGlzIGFuZCBmaW5kCiAgICAgICAgLy8gdGhlIG1pbi9tYXggYm91bmRzIGZvciB0aGlzIGF4aXMuCiAgICAgICAgdmFyIGRiID0gdGhpcy5fZGF0YUJvdW5kczsKICAgICAgICBkYi5taW4gPSBudWxsOwogICAgICAgIGRiLm1heCA9IG51bGw7CiAgICAgICAgdmFyIGwsIHMsIGQ7CiAgICAgICAgLy8gY2hlY2sgZm9yIHdoZW4gdG8gZm9yY2UgbWluIDAgb24gYmFyIHNlcmllcyBwbG90cy4KICAgICAgICB2YXIgZG9mb3JjZSA9ICh0aGlzLnNob3cpID8gdHJ1ZSA6IGZhbHNlOwogICAgICAgIGZvciAodmFyIGk9MDsgaTx0aGlzLl9zZXJpZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgcyA9IHRoaXMuX3Nlcmllc1tpXTsKICAgICAgICAgICAgaWYgKHMuc2hvdykgewogICAgICAgICAgICAgICAgZCA9IHMuX3Bsb3REYXRhOwogICAgICAgICAgICAgICAgaWYgKHMuX3R5cGUgPT09ICdsaW5lJyAmJiBzLnJlbmRlcmVyLmJhbmRzLnNob3cgJiYgdGhpcy5uYW1lLmNoYXJBdCgwKSAhPT0gJ3gnKSB7CiAgICAgICAgICAgICAgICAgICAgZCA9IFtbMCwgcy5yZW5kZXJlci5iYW5kcy5fbWluXSwgWzEsIHMucmVuZGVyZXIuYmFuZHMuX21heF1dOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciBtaW55aWR4ID0gMSwgbWF4eWlkeCA9IDE7CgogICAgICAgICAgICAgICAgaWYgKHMuX3R5cGUgIT0gbnVsbCAmJiBzLl90eXBlID09ICdvaGxjJykgewogICAgICAgICAgICAgICAgICAgIG1pbnlpZHggPSAzOwogICAgICAgICAgICAgICAgICAgIG1heHlpZHggPSAyOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBmb3IgKHZhciBqPTAsIGw9ZC5sZW5ndGg7IGo8bDsgaisrKSB7IAogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm5hbWUgPT0gJ3hheGlzJyB8fCB0aGlzLm5hbWUgPT0gJ3gyYXhpcycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChkW2pdWzBdICE9IG51bGwgJiYgZFtqXVswXSA8IGRiLm1pbikgfHwgZGIubWluID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRiLm1pbiA9IGRbal1bMF07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChkW2pdWzBdICE9IG51bGwgJiYgZFtqXVswXSA+IGRiLm1heCkgfHwgZGIubWF4ID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRiLm1heCA9IGRbal1bMF07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChkW2pdW21pbnlpZHhdICE9IG51bGwgJiYgZFtqXVttaW55aWR4XSA8IGRiLm1pbikgfHwgZGIubWluID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRiLm1pbiA9IGRbal1bbWlueWlkeF07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChkW2pdW21heHlpZHhdICE9IG51bGwgJiYgZFtqXVttYXh5aWR4XSA+IGRiLm1heCkgfHwgZGIubWF4ID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRiLm1heCA9IGRbal1bbWF4eWlkeF07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBIYWNrIHRvIG5vdCBwYWQgb3V0IGJvdHRvbSBvZiBiYXIgcGxvdHMgdW5sZXNzIHVzZXIgaGFzIHNwZWNpZmllZCBhIHBhZGRpbmcuCiAgICAgICAgICAgICAgICAvLyBldmVyeSBzZXJpZXMgd2lsbCBoYXZlIGEgY2hhbmNlIHRvIHNldCBkb2ZvcmNlIHRvIGZhbHNlLiAgb25jZSBpdCBpcyBzZXQgdG8gCiAgICAgICAgICAgICAgICAvLyBmYWxzZSwgaXQgY2Fubm90IGJlIHJlc2V0IHRvIHRydWUuCiAgICAgICAgICAgICAgICAvLyBJZiBhbnkgc2VyaWVzIGF0dGFjaGVkIHRvIGF4aXMgaXMgbm90IGEgYmFyLCB3b250IGZvcmNlIDAuCiAgICAgICAgICAgICAgICBpZiAoZG9mb3JjZSAmJiBzLnJlbmRlcmVyLmNvbnN0cnVjdG9yICE9PSAkLmpxcGxvdC5CYXJSZW5kZXJlcikgewogICAgICAgICAgICAgICAgICAgIGRvZm9yY2UgPSBmYWxzZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBlbHNlIGlmIChkb2ZvcmNlICYmIHRoaXMuX29wdGlvbnMuaGFzT3duUHJvcGVydHkoJ2ZvcmNlVGlja0F0MCcpICYmIHRoaXMuX29wdGlvbnMuZm9yY2VUaWNrQXQwID09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAgICAgZG9mb3JjZSA9IGZhbHNlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGVsc2UgaWYgKGRvZm9yY2UgJiYgcy5yZW5kZXJlci5jb25zdHJ1Y3RvciA9PT0gJC5qcXBsb3QuQmFyUmVuZGVyZXIpIHsKICAgICAgICAgICAgICAgICAgICBpZiAocy5iYXJEaXJlY3Rpb24gPT0gJ3ZlcnRpY2FsJyAmJiB0aGlzLm5hbWUgIT0gJ3hheGlzJyAmJiB0aGlzLm5hbWUgIT0gJ3gyYXhpcycpIHsgCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9vcHRpb25zLnBhZCAhPSBudWxsIHx8IHRoaXMuX29wdGlvbnMucGFkTWluICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvZm9yY2UgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocy5iYXJEaXJlY3Rpb24gPT0gJ2hvcml6b250YWwnICYmICh0aGlzLm5hbWUgPT0gJ3hheGlzJyB8fCB0aGlzLm5hbWUgPT0gJ3gyYXhpcycpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9vcHRpb25zLnBhZCAhPSBudWxsIHx8IHRoaXMuX29wdGlvbnMucGFkTWluICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvZm9yY2UgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmIChkb2ZvcmNlICYmIHRoaXMucmVuZGVyZXIuY29uc3RydWN0b3IgPT09ICQuanFwbG90LkxpbmVhckF4aXNSZW5kZXJlciAmJiBkYi5taW4gPj0gMCkgewogICAgICAgICAgICB0aGlzLnBhZE1pbiA9IDEuMDsKICAgICAgICAgICAgdGhpcy5mb3JjZVRpY2tBdDAgPSB0cnVlOwogICAgICAgIH0KICAgIH07CgogICAgLyoqCiAgICAgKiBDbGFzczogTGVnZW5kCiAgICAgKiBMZWdlbmQgb2JqZWN0LiAgQ2Fubm90IGJlIGluc3RhbnRpYXRlZCBkaXJlY3RseSwgYnV0IGNyZWF0ZWQKICAgICAqIGJ5IHRoZSBQbG90IG9qZWN0LiAgTGVnZW5kIHByb3BlcnRpZXMgY2FuIGJlIHNldCBvciBvdmVycmlkZW4gYnkgdGhlIAogICAgICogb3B0aW9ucyBwYXNzZWQgaW4gZnJvbSB0aGUgdXNlci4KICAgICAqLwogICAgZnVuY3Rpb24gTGVnZW5kKG9wdGlvbnMpIHsKICAgICAgICAkLmpxcGxvdC5FbGVtQ29udGFpbmVyLmNhbGwodGhpcyk7CiAgICAgICAgLy8gR3JvdXA6IFByb3BlcnRpZXMKICAgICAgICAKICAgICAgICAvLyBwcm9wOiBzaG93CiAgICAgICAgLy8gV2V0aGVyIHRvIGRpc3BsYXkgdGhlIGxlZ2VuZCBvbiB0aGUgZ3JhcGguCiAgICAgICAgdGhpcy5zaG93ID0gZmFsc2U7CiAgICAgICAgLy8gcHJvcDogbG9jYXRpb24KICAgICAgICAvLyBQbGFjZW1lbnQgb2YgdGhlIGxlZ2VuZC4gIG9uZSBvZiB0aGUgY29tcGFzcyBkaXJlY3Rpb25zOiBudywgbiwgbmUsIGUsIHNlLCBzLCBzdywgdwogICAgICAgIHRoaXMubG9jYXRpb24gPSAnbmUnOwogICAgICAgIC8vIHByb3A6IGxhYmVscwogICAgICAgIC8vIEFycmF5IG9mIGxhYmVscyB0byB1c2UuICBCeSBkZWZhdWx0IHRoZSByZW5kZXJlciB3aWxsIGxvb2sgZm9yIGxhYmVscyBvbiB0aGUgc2VyaWVzLgogICAgICAgIC8vIExhYmVscyBzcGVjaWZpZWQgaW4gdGhpcyBhcnJheSB3aWxsIG92ZXJyaWRlIGxhYmVscyBzcGVjaWZpZWQgb24gdGhlIHNlcmllcy4KICAgICAgICB0aGlzLmxhYmVscyA9IFtdOwogICAgICAgIC8vIHByb3A6IHNob3dMYWJlbHMKICAgICAgICAvLyB0cnVlIHRvIHNob3cgdGhlIGxhYmVsIHRleHQgb24gdGhlICBsZWdlbmQuCiAgICAgICAgdGhpcy5zaG93TGFiZWxzID0gdHJ1ZTsKICAgICAgICAvLyBwcm9wOiBzaG93U3dhdGNoCiAgICAgICAgLy8gdHJ1ZSB0byBzaG93IHRoZSBjb2xvciBzd2F0Y2hlcyBvbiB0aGUgbGVnZW5kLgogICAgICAgIHRoaXMuc2hvd1N3YXRjaGVzID0gdHJ1ZTsKICAgICAgICAvLyBwcm9wOiBwbGFjZW1lbnQKICAgICAgICAvLyAiaW5zaWRlR3JpZCIgcGxhY2VzIGxlZ2VuZCBpbnNpZGUgdGhlIGdyaWQgYXJlYSBvZiB0aGUgcGxvdC4KICAgICAgICAvLyAib3V0c2lkZUdyaWQiIHBsYWNlcyB0aGUgbGVnZW5kIG91dHNpZGUgdGhlIGdyaWQgYnV0IGluc2lkZSB0aGUgcGxvdCBjb250YWluZXIsIAogICAgICAgIC8vIHNocmlua2luZyB0aGUgZ3JpZCB0byBhY2NvbW9kYXRlIHRoZSBsZWdlbmQuCiAgICAgICAgLy8gImluc2lkZSIgc3lub255bSBmb3IgImluc2lkZUdyaWQiLCAKICAgICAgICAvLyAib3V0c2lkZSIgcGxhY2VzIHRoZSBsZWdlbmQgb3VzaWRlIHRoZSBncmlkIGFyZWEsIGJ1dCBkb2VzIG5vdCBzaHJpbmsgdGhlIGdyaWQgd2hpY2gKICAgICAgICAvLyBjYW4gY2F1c2UgdGhlIGxlZ2VuZCB0byBvdmVyZmxvdyB0aGUgcGxvdCBjb250YWluZXIuCiAgICAgICAgdGhpcy5wbGFjZW1lbnQgPSAiaW5zaWRlR3JpZCI7CiAgICAgICAgLy8gcHJvcDogeG9mZnNldAogICAgICAgIC8vIERFUFJFQ0FURUQuICBTZXQgdGhlIG1hcmdpbnMgb24gdGhlIGxlZ2VuZCB1c2luZyB0aGUgbWFyZ2luVG9wLCBtYXJnaW5MZWZ0LCBldGMuIAogICAgICAgIC8vIHByb3BlcnRpZXMgb3IgdmlhIENTUyBtYXJnaW4gc3R5bGluZyBvZiB0aGUgLmpxcGxvdC10YWJsZS1sZWdlbmQgY2xhc3MuCiAgICAgICAgdGhpcy54b2Zmc2V0ID0gMDsKICAgICAgICAvLyBwcm9wOiB5b2Zmc2V0CiAgICAgICAgLy8gREVQUkVDQVRFRC4gIFNldCB0aGUgbWFyZ2lucyBvbiB0aGUgbGVnZW5kIHVzaW5nIHRoZSBtYXJnaW5Ub3AsIG1hcmdpbkxlZnQsIGV0Yy4gCiAgICAgICAgLy8gcHJvcGVydGllcyBvciB2aWEgQ1NTIG1hcmdpbiBzdHlsaW5nIG9mIHRoZSAuanFwbG90LXRhYmxlLWxlZ2VuZCBjbGFzcy4KICAgICAgICB0aGlzLnlvZmZzZXQgPSAwOwogICAgICAgIC8vIHByb3A6IGJvcmRlcgogICAgICAgIC8vIGNzcyBzcGVjIGZvciB0aGUgYm9yZGVyIGFyb3VuZCB0aGUgbGVnZW5kIGJveC4KICAgICAgICB0aGlzLmJvcmRlcjsKICAgICAgICAvLyBwcm9wOiBiYWNrZ3JvdW5kCiAgICAgICAgLy8gY3NzIHNwZWMgZm9yIHRoZSBiYWNrZ3JvdW5kIG9mIHRoZSBsZWdlbmQgYm94LgogICAgICAgIHRoaXMuYmFja2dyb3VuZDsKICAgICAgICAvLyBwcm9wOiB0ZXh0Q29sb3IKICAgICAgICAvLyBjc3MgY29sb3Igc3BlYyBmb3IgdGhlIGxlZ2VuZCB0ZXh0LgogICAgICAgIHRoaXMudGV4dENvbG9yOwogICAgICAgIC8vIHByb3A6IGZvbnRGYW1pbHkKICAgICAgICAvLyBjc3MgZm9udC1mYW1pbHkgc3BlYyBmb3IgdGhlIGxlZ2VuZCB0ZXh0LgogICAgICAgIHRoaXMuZm9udEZhbWlseTsgCiAgICAgICAgLy8gcHJvcDogZm9udFNpemUKICAgICAgICAvLyBjc3MgZm9udC1zaXplIHNwZWMgZm9yIHRoZSBsZWdlbmQgdGV4dC4KICAgICAgICB0aGlzLmZvbnRTaXplIDsKICAgICAgICAvLyBwcm9wOiByb3dTcGFjaW5nCiAgICAgICAgLy8gY3NzIHBhZGRpbmctdG9wIHNwZWMgZm9yIHRoZSByb3dzIGluIHRoZSBsZWdlbmQuCiAgICAgICAgdGhpcy5yb3dTcGFjaW5nID0gJzAuNWVtJzsKICAgICAgICAvLyByZW5kZXJlcgogICAgICAgIC8vIEEgY2xhc3MgdGhhdCB3aWxsIGNyZWF0ZSBhIERPTSBvYmplY3QgZm9yIHRoZSBsZWdlbmQsCiAgICAgICAgLy8gc2VlIDwkLmpxcGxvdC5UYWJsZUxlZ2VuZFJlbmRlcmVyPi4KICAgICAgICB0aGlzLnJlbmRlcmVyID0gJC5qcXBsb3QuVGFibGVMZWdlbmRSZW5kZXJlcjsKICAgICAgICAvLyBwcm9wOiByZW5kZXJlck9wdGlvbnMKICAgICAgICAvLyByZW5kZXJlciBzcGVjaWZpYyBvcHRpb25zIHBhc3NlZCB0byB0aGUgcmVuZGVyZXIuCiAgICAgICAgdGhpcy5yZW5kZXJlck9wdGlvbnMgPSB7fTsKICAgICAgICAvLyBwcm9wOiBwcmVkcmF3CiAgICAgICAgLy8gV2V0aGVyIHRvIGRyYXcgdGhlIGxlZ2VuZCBiZWZvcmUgdGhlIHNlcmllcyBvciBub3QuCiAgICAgICAgLy8gVXNlZCB3aXRoIHNlcmllcyBzcGVjaWZpYyBsZWdlbmQgcmVuZGVyZXJzIGZvciBwaWUsIGRvbnV0LCBtZWtrbyBjaGFydHMsIGV0Yy4KICAgICAgICB0aGlzLnByZURyYXcgPSBmYWxzZTsKICAgICAgICAvLyBwcm9wOiBtYXJnaW5Ub3AKICAgICAgICAvLyBDU1MgbWFyZ2luIGZvciB0aGUgbGVnZW5kIERPTSBlbGVtZW50LiBUaGlzIHdpbGwgc2V0IGFuIGVsZW1lbnQgCiAgICAgICAgLy8gQ1NTIHN0eWxlIGZvciB0aGUgbWFyZ2luIHdoaWNoIHdpbGwgb3ZlcnJpZGUgYW55IHN0eWxlIHNoZWV0IHNldHRpbmcuCiAgICAgICAgLy8gVGhlIGRlZmF1bHQgd2lsbCBiZSB0YWtlbiBmcm9tIHRoZSBzdHlsZXNoZWV0LgogICAgICAgIHRoaXMubWFyZ2luVG9wID0gbnVsbDsKICAgICAgICAvLyBwcm9wOiBtYXJnaW5SaWdodAogICAgICAgIC8vIENTUyBtYXJnaW4gZm9yIHRoZSBsZWdlbmQgRE9NIGVsZW1lbnQuIFRoaXMgd2lsbCBzZXQgYW4gZWxlbWVudCAKICAgICAgICAvLyBDU1Mgc3R5bGUgZm9yIHRoZSBtYXJnaW4gd2hpY2ggd2lsbCBvdmVycmlkZSBhbnkgc3R5bGUgc2hlZXQgc2V0dGluZy4KICAgICAgICAvLyBUaGUgZGVmYXVsdCB3aWxsIGJlIHRha2VuIGZyb20gdGhlIHN0eWxlc2hlZXQuCiAgICAgICAgdGhpcy5tYXJnaW5SaWdodCA9IG51bGw7CiAgICAgICAgLy8gcHJvcDogbWFyZ2luQm90dG9tCiAgICAgICAgLy8gQ1NTIG1hcmdpbiBmb3IgdGhlIGxlZ2VuZCBET00gZWxlbWVudC4gVGhpcyB3aWxsIHNldCBhbiBlbGVtZW50IAogICAgICAgIC8vIENTUyBzdHlsZSBmb3IgdGhlIG1hcmdpbiB3aGljaCB3aWxsIG92ZXJyaWRlIGFueSBzdHlsZSBzaGVldCBzZXR0aW5nLgogICAgICAgIC8vIFRoZSBkZWZhdWx0IHdpbGwgYmUgdGFrZW4gZnJvbSB0aGUgc3R5bGVzaGVldC4KICAgICAgICB0aGlzLm1hcmdpbkJvdHRvbSA9IG51bGw7CiAgICAgICAgLy8gcHJvcDogbWFyZ2luTGVmdAogICAgICAgIC8vIENTUyBtYXJnaW4gZm9yIHRoZSBsZWdlbmQgRE9NIGVsZW1lbnQuIFRoaXMgd2lsbCBzZXQgYW4gZWxlbWVudCAKICAgICAgICAvLyBDU1Mgc3R5bGUgZm9yIHRoZSBtYXJnaW4gd2hpY2ggd2lsbCBvdmVycmlkZSBhbnkgc3R5bGUgc2hlZXQgc2V0dGluZy4KICAgICAgICAvLyBUaGUgZGVmYXVsdCB3aWxsIGJlIHRha2VuIGZyb20gdGhlIHN0eWxlc2hlZXQuCiAgICAgICAgdGhpcy5tYXJnaW5MZWZ0ID0gbnVsbDsKICAgICAgICAvLyBwcm9wOiBlc2NhcGVIdG1sCiAgICAgICAgLy8gVHJ1ZSB0byBlc2NhcGUgc3BlY2lhbCBjaGFyYWN0ZXJzIHdpdGggdGhlaXIgaHRtbCBlbnRpdHkgZXF1aXZhbGVudHMKICAgICAgICAvLyBpbiBsZWdlbmQgdGV4dC4gICI8IiBiZWNvbWVzICZsdDsgYW5kIHNvIG9uLCBzbyBodG1sIHRhZ3MgYXJlIG5vdCByZW5kZXJlZC4KICAgICAgICB0aGlzLmVzY2FwZUh0bWwgPSBmYWxzZTsKICAgICAgICB0aGlzLl9zZXJpZXMgPSBbXTsKICAgICAgICAKICAgICAgICAkLmV4dGVuZCh0cnVlLCB0aGlzLCBvcHRpb25zKTsKICAgIH0KICAgIAogICAgTGVnZW5kLnByb3RvdHlwZSA9IG5ldyAkLmpxcGxvdC5FbGVtQ29udGFpbmVyKCk7CiAgICBMZWdlbmQucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTGVnZW5kOwogICAgCiAgICBMZWdlbmQucHJvdG90eXBlLnNldE9wdGlvbnMgPSBmdW5jdGlvbihvcHRpb25zKSB7CiAgICAgICAgJC5leHRlbmQodHJ1ZSwgdGhpcywgb3B0aW9ucyk7CiAgICAgICAgCiAgICAgICAgLy8gVHJ5IHRvIGVtdWxhdGUgZGVwcmVjYXRlZCBiZWhhdmlvdXIKICAgICAgICAvLyBpZiB1c2VyIGhhcyBzcGVjaWZpZWQgeG9mZnNldCBvciB5b2Zmc2V0LCBjb3B5IHRoZXNlIHRvCiAgICAgICAgLy8gdGhlIG1hcmdpbiBwcm9wZXJ0aWVzLgogICAgICAgIAogICAgICAgIGlmICh0aGlzLnBsYWNlbWVudCA9PSAgJ2luc2lkZScpIHsKICAgICAgICAgICAgdGhpcy5wbGFjZW1lbnQgPSAnaW5zaWRlR3JpZCc7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmICh0aGlzLnhvZmZzZXQgPjApIHsKICAgICAgICAgICAgaWYgKHRoaXMucGxhY2VtZW50ID09ICdpbnNpZGVHcmlkJykgewogICAgICAgICAgICAgICAgc3dpdGNoICh0aGlzLmxvY2F0aW9uKSB7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAnbncnOgogICAgICAgICAgICAgICAgICAgIGNhc2UgJ3cnOgogICAgICAgICAgICAgICAgICAgIGNhc2UgJ3N3JzoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubWFyZ2luTGVmdCA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1hcmdpbkxlZnQgPSB0aGlzLnhvZmZzZXQgKyAncHgnOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWFyZ2luUmlnaHQgPSAnMHB4JzsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAnbmUnOgogICAgICAgICAgICAgICAgICAgIGNhc2UgJ2UnOgogICAgICAgICAgICAgICAgICAgIGNhc2UgJ3NlJzoKICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5tYXJnaW5SaWdodCA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1hcmdpblJpZ2h0ID0gdGhpcy54b2Zmc2V0ICsgJ3B4JzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1hcmdpbkxlZnQgPSAnMHB4JzsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5wbGFjZW1lbnQgPT0gJ291dHNpZGUnKSB7CiAgICAgICAgICAgICAgICBzd2l0Y2ggKHRoaXMubG9jYXRpb24pIHsKICAgICAgICAgICAgICAgICAgICBjYXNlICdudyc6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAndyc6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAnc3cnOgogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5tYXJnaW5SaWdodCA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1hcmdpblJpZ2h0ID0gdGhpcy54b2Zmc2V0ICsgJ3B4JzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1hcmdpbkxlZnQgPSAnMHB4JzsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAnbmUnOgogICAgICAgICAgICAgICAgICAgIGNhc2UgJ2UnOgogICAgICAgICAgICAgICAgICAgIGNhc2UgJ3NlJzoKICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5tYXJnaW5MZWZ0ID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWFyZ2luTGVmdCA9IHRoaXMueG9mZnNldCArICdweCc7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXJnaW5SaWdodCA9ICcwcHgnOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLnhvZmZzZXQgPSAwOwogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZiAodGhpcy55b2Zmc2V0ID4wKSB7CiAgICAgICAgICAgIGlmICh0aGlzLnBsYWNlbWVudCA9PSAnb3V0c2lkZScpIHsKICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpcy5sb2NhdGlvbikgewogICAgICAgICAgICAgICAgICAgIGNhc2UgJ3N3JzoKICAgICAgICAgICAgICAgICAgICBjYXNlICdzJzoKICAgICAgICAgICAgICAgICAgICBjYXNlICdzZSc6CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm1hcmdpblRvcCA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1hcmdpblRvcCA9IHRoaXMueW9mZnNldCArICdweCc7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXJnaW5Cb3R0b20gPSAnMHB4JzsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAnbmUnOgogICAgICAgICAgICAgICAgICAgIGNhc2UgJ24nOgogICAgICAgICAgICAgICAgICAgIGNhc2UgJ253JzoKICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5tYXJnaW5Cb3R0b20gPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXJnaW5Cb3R0b20gPSB0aGlzLnlvZmZzZXQgKyAncHgnOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWFyZ2luVG9wID0gJzBweCc7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMucGxhY2VtZW50ID09ICdpbnNpZGVHcmlkJykgewogICAgICAgICAgICAgICAgc3dpdGNoICh0aGlzLmxvY2F0aW9uKSB7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAnc3cnOgogICAgICAgICAgICAgICAgICAgIGNhc2UgJ3MnOgogICAgICAgICAgICAgICAgICAgIGNhc2UgJ3NlJzoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubWFyZ2luQm90dG9tID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWFyZ2luQm90dG9tID0gdGhpcy55b2Zmc2V0ICsgJ3B4JzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1hcmdpblRvcCA9ICcwcHgnOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlICduZSc6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAnbic6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAnbncnOgogICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm1hcmdpblRvcCA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1hcmdpblRvcCA9IHRoaXMueW9mZnNldCArICdweCc7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXJnaW5Cb3R0b20gPSAnMHB4JzsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy55b2Zmc2V0ID0gMDsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLy8gVE8tRE86CiAgICAgICAgLy8gSGFuZGxlIGNhc2Ugd2hlcmUgb2Zmc2V0cyBhcmUgPCAwLgogICAgICAgIC8vCiAgICB9OwogICAgCiAgICBMZWdlbmQucHJvdG90eXBlLmluaXQgPSBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLnJlbmRlcmVyID0gbmV3IHRoaXMucmVuZGVyZXIoKTsKICAgICAgICB0aGlzLnJlbmRlcmVyLmluaXQuY2FsbCh0aGlzLCB0aGlzLnJlbmRlcmVyT3B0aW9ucyk7CiAgICB9OwogICAgCiAgICBMZWdlbmQucHJvdG90eXBlLmRyYXcgPSBmdW5jdGlvbihvZmZzZXRzKSB7CiAgICAgICAgZm9yICh2YXIgaT0wOyBpPCQuanFwbG90LnByZURyYXdMZWdlbmRIb29rcy5sZW5ndGg7IGkrKyl7CiAgICAgICAgICAgICQuanFwbG90LnByZURyYXdMZWdlbmRIb29rc1tpXS5jYWxsKHRoaXMsIG9mZnNldHMpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5yZW5kZXJlci5kcmF3LmNhbGwodGhpcywgb2Zmc2V0cyk7CiAgICB9OwogICAgCiAgICBMZWdlbmQucHJvdG90eXBlLnBhY2sgPSBmdW5jdGlvbihvZmZzZXRzKSB7CiAgICAgICAgdGhpcy5yZW5kZXJlci5wYWNrLmNhbGwodGhpcywgb2Zmc2V0cyk7CiAgICB9OwoKICAgIC8qKgogICAgICogQ2xhc3M6IFRpdGxlCiAgICAgKiBQbG90IFRpdGxlIG9iamVjdC4gIENhbm5vdCBiZSBpbnN0YW50aWF0ZWQgZGlyZWN0bHksIGJ1dCBjcmVhdGVkCiAgICAgKiBieSB0aGUgUGxvdCBvamVjdC4gIFRpdGxlIHByb3BlcnRpZXMgY2FuIGJlIHNldCBvciBvdmVycmlkZW4gYnkgdGhlIAogICAgICogb3B0aW9ucyBwYXNzZWQgaW4gZnJvbSB0aGUgdXNlci4KICAgICAqIAogICAgICogUGFyYW1ldGVyczoKICAgICAqIHRleHQgLSB0ZXh0IG9mIHRoZSB0aXRsZS4KICAgICAqLwogICAgZnVuY3Rpb24gVGl0bGUodGV4dCkgewogICAgICAgICQuanFwbG90LkVsZW1Db250YWluZXIuY2FsbCh0aGlzKTsKICAgICAgICAvLyBHcm91cDogUHJvcGVydGllcwogICAgICAgIAogICAgICAgIC8vIHByb3A6IHRleHQKICAgICAgICAvLyB0ZXh0IG9mIHRoZSB0aXRsZTsKICAgICAgICB0aGlzLnRleHQgPSB0ZXh0OwogICAgICAgIC8vIHByb3A6IHNob3cKICAgICAgICAvLyB3ZXRoZXIgb3Igbm90IHRvIHNob3cgdGhlIHRpdGxlCiAgICAgICAgdGhpcy5zaG93ID0gdHJ1ZTsKICAgICAgICAvLyBwcm9wOiBmb250RmFtaWx5CiAgICAgICAgLy8gY3NzIGZvbnQtZmFtaWx5IHNwZWMgZm9yIHRoZSB0ZXh0LgogICAgICAgIHRoaXMuZm9udEZhbWlseTsKICAgICAgICAvLyBwcm9wOiBmb250U2l6ZQogICAgICAgIC8vIGNzcyBmb250LXNpemUgc3BlYyBmb3IgdGhlIHRleHQuCiAgICAgICAgdGhpcy5mb250U2l6ZSA7CiAgICAgICAgLy8gcHJvcDogdGV4dEFsaWduCiAgICAgICAgLy8gY3NzIHRleHQtYWxpZ24gc3BlYyBmb3IgdGhlIHRleHQuCiAgICAgICAgdGhpcy50ZXh0QWxpZ247CiAgICAgICAgLy8gcHJvcDogdGV4dENvbG9yCiAgICAgICAgLy8gY3NzIGNvbG9yIHNwZWMgZm9yIHRoZSB0ZXh0LgogICAgICAgIHRoaXMudGV4dENvbG9yOwogICAgICAgIC8vIHByb3A6IHJlbmRlcmVyCiAgICAgICAgLy8gQSBjbGFzcyBmb3IgY3JlYXRpbmcgYSBET00gZWxlbWVudCBmb3IgdGhlIHRpdGxlLAogICAgICAgIC8vIHNlZSA8JC5qcXBsb3QuRGl2VGl0bGVSZW5kZXJlcj4uCiAgICAgICAgdGhpcy5yZW5kZXJlciA9ICQuanFwbG90LkRpdlRpdGxlUmVuZGVyZXI7CiAgICAgICAgLy8gcHJvcDogcmVuZGVyZXJPcHRpb25zCiAgICAgICAgLy8gcmVuZGVyZXIgc3BlY2lmaWMgb3B0aW9ucyBwYXNzZWQgdG8gdGhlIHJlbmRlcmVyLgogICAgICAgIHRoaXMucmVuZGVyZXJPcHRpb25zID0ge307ICAgCiAgICAgICAgLy8gcHJvcDogZXNjYXBlSHRtbAogICAgICAgIC8vIFRydWUgdG8gZXNjYXBlIHNwZWNpYWwgY2hhcmFjdGVycyB3aXRoIHRoZWlyIGh0bWwgZW50aXR5IGVxdWl2YWxlbnRzCiAgICAgICAgLy8gaW4gdGl0bGUgdGV4dC4gICI8IiBiZWNvbWVzICZsdDsgYW5kIHNvIG9uLCBzbyBodG1sIHRhZ3MgYXJlIG5vdCByZW5kZXJlZC4KICAgICAgICB0aGlzLmVzY2FwZUh0bWwgPSBmYWxzZTsKICAgIH0KICAgIAogICAgVGl0bGUucHJvdG90eXBlID0gbmV3ICQuanFwbG90LkVsZW1Db250YWluZXIoKTsKICAgIFRpdGxlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFRpdGxlOwogICAgCiAgICBUaXRsZS5wcm90b3R5cGUuaW5pdCA9IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMucmVuZGVyZXIgPSBuZXcgdGhpcy5yZW5kZXJlcigpOwogICAgICAgIHRoaXMucmVuZGVyZXIuaW5pdC5jYWxsKHRoaXMsIHRoaXMucmVuZGVyZXJPcHRpb25zKTsKICAgIH07CiAgICAKICAgIFRpdGxlLnByb3RvdHlwZS5kcmF3ID0gZnVuY3Rpb24od2lkdGgpIHsKICAgICAgICByZXR1cm4gdGhpcy5yZW5kZXJlci5kcmF3LmNhbGwodGhpcywgd2lkdGgpOwogICAgfTsKICAgIAogICAgVGl0bGUucHJvdG90eXBlLnBhY2sgPSBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLnJlbmRlcmVyLnBhY2suY2FsbCh0aGlzKTsKICAgIH07CgoKICAgIC8qKgogICAgICogQ2xhc3M6IFNlcmllcwogICAgICogQW4gaW5kaXZpZHVhbCBkYXRhIHNlcmllcyBvYmplY3QuICBDYW5ub3QgYmUgaW5zdGFudGlhdGVkIGRpcmVjdGx5LCBidXQgY3JlYXRlZAogICAgICogYnkgdGhlIFBsb3Qgb2plY3QuICBTZXJpZXMgcHJvcGVydGllcyBjYW4gYmUgc2V0IG9yIG92ZXJyaWRlbiBieSB0aGUgCiAgICAgKiBvcHRpb25zIHBhc3NlZCBpbiBmcm9tIHRoZSB1c2VyLgogICAgICovCiAgICBmdW5jdGlvbiBTZXJpZXMoKSB7CiAgICAgICAgJC5qcXBsb3QuRWxlbUNvbnRhaW5lci5jYWxsKHRoaXMpOwogICAgICAgIC8vIEdyb3VwOiBQcm9wZXJ0aWVzCiAgICAgICAgLy8gUHJvcGVydGllcyB3aWxsIGJlIGFzc2lnbmVkIGZyb20gYSBzZXJpZXMgYXJyYXkgYXQgdGhlIHRvcCBsZXZlbCBvZiB0aGUKICAgICAgICAvLyBvcHRpb25zLiAgSWYgeW91IGhhZCB0d28gc2VyaWVzIGFuZCB3YW50ZWQgdG8gY2hhbmdlIHRoZSBjb2xvciBhbmQgbGluZQogICAgICAgIC8vIHdpZHRoIG9mIHRoZSBmaXJzdCBhbmQgc2V0IHRoZSBzZWNvbmQgdG8gdXNlIHRoZSBzZWNvbmRhcnkgeSBheGlzIHdpdGgKICAgICAgICAvLyBubyBzaGFkb3cgYW5kIHN1cHBseSBjdXN0b20gbGFiZWxzIGZvciBlYWNoOgogICAgICAgIC8vID4gewogICAgICAgIC8vID4gICAgc2VyaWVzOlsKICAgICAgICAvLyA+ICAgICAgICB7Y29sb3I6ICcjZmY0NDY2JywgbGluZVdpZHRoOiA1LCBsYWJlbDonZ29vZCBsaW5lJ30sCiAgICAgICAgLy8gPiAgICAgICAge3lheGlzOiAneTJheGlzJywgc2hhZG93OiBmYWxzZSwgbGFiZWw6J2JhZCBsaW5lJ30KICAgICAgICAvLyA+ICAgIF0KICAgICAgICAvLyA+IH0KCiAgICAgICAgLy8gcHJvcDogc2hvdwogICAgICAgIC8vIHdldGhlciBvciBub3QgdG8gZHJhdyB0aGUgc2VyaWVzLgogICAgICAgIHRoaXMuc2hvdyA9IHRydWU7CiAgICAgICAgLy8gcHJvcDogeGF4aXMKICAgICAgICAvLyB3aGljaCB4IGF4aXMgdG8gdXNlIHdpdGggdGhpcyBzZXJpZXMsIGVpdGhlciAneGF4aXMnIG9yICd4MmF4aXMnLgogICAgICAgIHRoaXMueGF4aXMgPSAneGF4aXMnOwogICAgICAgIHRoaXMuX3hheGlzOwogICAgICAgIC8vIHByb3A6IHlheGlzCiAgICAgICAgLy8gd2hpY2ggeSBheGlzIHRvIHVzZSB3aXRoIHRoaXMgc2VyaWVzLCBlaXRoZXIgJ3lheGlzJyBvciAneTJheGlzJy4KICAgICAgICB0aGlzLnlheGlzID0gJ3lheGlzJzsKICAgICAgICB0aGlzLl95YXhpczsKICAgICAgICB0aGlzLmdyaWRCb3JkZXJXaWR0aCA9IDIuMDsKICAgICAgICAvLyBwcm9wOiByZW5kZXJlcgogICAgICAgIC8vIEEgY2xhc3Mgb2YgYSByZW5kZXJlciB3aGljaCB3aWxsIGRyYXcgdGhlIHNlcmllcywgCiAgICAgICAgLy8gc2VlIDwkLmpxcGxvdC5MaW5lUmVuZGVyZXI+LgogICAgICAgIHRoaXMucmVuZGVyZXIgPSAkLmpxcGxvdC5MaW5lUmVuZGVyZXI7CiAgICAgICAgLy8gcHJvcDogcmVuZGVyZXJPcHRpb25zCiAgICAgICAgLy8gT3B0aW9ucyB0byBwYXNzIG9uIHRvIHRoZSByZW5kZXJlci4KICAgICAgICB0aGlzLnJlbmRlcmVyT3B0aW9ucyA9IHt9OwogICAgICAgIHRoaXMuZGF0YSA9IFtdOwogICAgICAgIHRoaXMuZ3JpZERhdGEgPSBbXTsKICAgICAgICAvLyBwcm9wOiBsYWJlbAogICAgICAgIC8vIExpbmUgbGFiZWwgdG8gdXNlIGluIHRoZSBsZWdlbmQuCiAgICAgICAgdGhpcy5sYWJlbCA9ICcnOwogICAgICAgIC8vIHByb3A6IHNob3dMYWJlbAogICAgICAgIC8vIHRydWUgdG8gc2hvdyBsYWJlbCBmb3IgdGhpcyBzZXJpZXMgaW4gdGhlIGxlZ2VuZC4KICAgICAgICB0aGlzLnNob3dMYWJlbCA9IHRydWU7CiAgICAgICAgLy8gcHJvcDogY29sb3IKICAgICAgICAvLyBjc3MgY29sb3Igc3BlYyBmb3IgdGhlIHNlcmllcwogICAgICAgIHRoaXMuY29sb3I7CiAgICAgICAgLy8gcHJvcDogbmVnYXRpdmVDb2xvcgogICAgICAgIC8vIGNzcyBjb2xvciBzcGVjIHVzZWQgZm9yIGZpbGxlZCAoYXJlYSkgcGxvdHMgdGhhdCBhcmUgZmlsbGVkIHRvIHplcm8gYW5kCiAgICAgICAgLy8gdGhlICJ1c2VOZWdhdGl2ZUNvbG9ycyIgb3B0aW9uIGlzIHRydWUuCiAgICAgICAgdGhpcy5uZWdhdGl2ZUNvbG9yOwogICAgICAgIC8vIHByb3A6IGxpbmVXaWR0aAogICAgICAgIC8vIHdpZHRoIG9mIHRoZSBsaW5lIGluIHBpeGVscy4gIE1heSBoYXZlIGRpZmZlcmVudCBtZWFuaW5ncyBkZXBlbmRpbmcgb24gcmVuZGVyZXIuCiAgICAgICAgdGhpcy5saW5lV2lkdGggPSAyLjU7CiAgICAgICAgLy8gcHJvcDogbGluZUpvaW4KICAgICAgICAvLyBDYW52YXMgbGluZUpvaW4gc3R5bGUgYmV0d2VlbiBzZWdtZW50cyBvZiBzZXJpZXMuCiAgICAgICAgdGhpcy5saW5lSm9pbiA9ICdyb3VuZCc7CiAgICAgICAgLy8gcHJvcDogbGluZUNhcAogICAgICAgIC8vIENhbnZhcyBsaW5lQ2FwIHN0eWxlIGF0IGVuZHMgb2YgbGluZS4KICAgICAgICB0aGlzLmxpbmVDYXAgPSAncm91bmQnOwogICAgICAgIC8vIHByb3A6IGxpbmVQYXR0ZXJuCiAgICAgICAgLy8gbGluZSBwYXR0ZXJuICdkYXNoZWQnLCAnZG90dGVkJywgJ3NvbGlkJywgc29tZSBjb21iaW5hdGlvbgogICAgICAgIC8vIG9mICctJyBhbmQgJy4nIGNoYXJhY3RlcnMgc3VjaCBhcyAnLi0uJyBvciBhIG51bWVyaWNhbCBhcnJheSBsaWtlIAogICAgICAgIC8vIFtkcmF3LCBza2lwLCBkcmF3LCBza2lwLCAuLi5dIHN1Y2ggYXMgWzEsIDEwXSB0byBkcmF3IGEgZG90dGVkIGxpbmUsIAogICAgICAgIC8vIFsxLCAxMCwgMjAsIDEwXSB0byBkcmF3IGEgZG90LWRhc2ggbGluZSwgYW5kIHNvIG9uLgogICAgICAgIHRoaXMubGluZVBhdHRlcm4gPSAnc29saWQnOwogICAgICAgIHRoaXMuc2hhZG93ID0gdHJ1ZTsKICAgICAgICAvLyBwcm9wOiBzaGFkb3dBbmdsZQogICAgICAgIC8vIFNoYWRvdyBhbmdsZSBpbiBkZWdyZWVzCiAgICAgICAgdGhpcy5zaGFkb3dBbmdsZSA9IDQ1OwogICAgICAgIC8vIHByb3A6IHNoYWRvd09mZnNldAogICAgICAgIC8vIFNoYWRvdyBvZmZzZXQgZnJvbSBsaW5lIGluIHBpeGVscwogICAgICAgIHRoaXMuc2hhZG93T2Zmc2V0ID0gMS4yNTsKICAgICAgICAvLyBwcm9wOiBzaGFkb3dEZXB0aAogICAgICAgIC8vIE51bWJlciBvZiB0aW1lcyBzaGFkb3cgaXMgc3Ryb2tlZCwgZWFjaCBzdHJva2Ugb2Zmc2V0IHNoYWRvd09mZnNldCBmcm9tIHRoZSBsYXN0LgogICAgICAgIHRoaXMuc2hhZG93RGVwdGggPSAzOwogICAgICAgIC8vIHByb3A6IHNoYWRvd0FscGhhCiAgICAgICAgLy8gQWxwaGEgY2hhbm5lbCB0cmFuc3BhcmVuY3kgb2Ygc2hhZG93LiAgMCA9IHRyYW5zcGFyZW50LgogICAgICAgIHRoaXMuc2hhZG93QWxwaGEgPSAnMC4xJzsKICAgICAgICAvLyBwcm9wOiBicmVha09uTnVsbAogICAgICAgIC8vIFdldGhlciBsaW5lIHNlZ21lbnRzIHNob3VsZCBiZSBiZSBicm9rZW4gYXQgbnVsbCB2YWx1ZS4KICAgICAgICAvLyBGYWxzZSB3aWxsIGpvaW4gcG9pbnQgb24gZWl0aGVyIHNpZGUgb2YgbGluZS4KICAgICAgICB0aGlzLmJyZWFrT25OdWxsID0gZmFsc2U7CiAgICAgICAgLy8gcHJvcDogbWFya2VyUmVuZGVyZXIKICAgICAgICAvLyBBIGNsYXNzIG9mIGEgcmVuZGVyZXIgd2hpY2ggd2lsbCBkcmF3IG1hcmtlciAoZS5nLiBjaXJjbGUsIHNxdWFyZSwgLi4uKSBhdCB0aGUgZGF0YSBwb2ludHMsCiAgICAgICAgLy8gc2VlIDwkLmpxcGxvdC5NYXJrZXJSZW5kZXJlcj4uCiAgICAgICAgdGhpcy5tYXJrZXJSZW5kZXJlciA9ICQuanFwbG90Lk1hcmtlclJlbmRlcmVyOwogICAgICAgIC8vIHByb3A6IG1hcmtlck9wdGlvbnMKICAgICAgICAvLyByZW5kZXJlciBzcGVjaWZpYyBvcHRpb25zIHRvIHBhc3MgdG8gdGhlIG1hcmtlclJlbmRlcmVyLAogICAgICAgIC8vIHNlZSA8JC5qcXBsb3QuTWFya2VyUmVuZGVyZXI+LgogICAgICAgIHRoaXMubWFya2VyT3B0aW9ucyA9IHt9OwogICAgICAgIC8vIHByb3A6IHNob3dMaW5lCiAgICAgICAgLy8gd2V0aGVyIHRvIGFjdHVhbGx5IGRyYXcgdGhlIGxpbmUgb3Igbm90LiAgU2VyaWVzIHdpbGwgc3RpbGwgYmUgcmVuZGVyZXJlZCwgZXZlbiBpZiBubyBsaW5lIGlzIGRyYXduLgogICAgICAgIHRoaXMuc2hvd0xpbmUgPSB0cnVlOwogICAgICAgIC8vIHByb3A6IHNob3dNYXJrZXIKICAgICAgICAvLyB3ZXRoZXIgb3Igbm90IHRvIHNob3cgdGhlIG1hcmtlcnMgYXQgdGhlIGRhdGEgcG9pbnRzLgogICAgICAgIHRoaXMuc2hvd01hcmtlciA9IHRydWU7CiAgICAgICAgLy8gcHJvcDogaW5kZXgKICAgICAgICAvLyAwIGJhc2VkIGluZGV4IG9mIHRoaXMgc2VyaWVzIGluIHRoZSBwbG90IHNlcmllcyBhcnJheS4KICAgICAgICB0aGlzLmluZGV4OwogICAgICAgIC8vIHByb3A6IGZpbGwKICAgICAgICAvLyB0cnVlIG9yIGZhbHNlLCB3ZXRoZXIgdG8gZmlsbCB1bmRlciBsaW5lcyBvciBpbiBiYXJzLgogICAgICAgIC8vIE1heSBub3QgYmUgaW1wbGVtZW50ZWQgaW4gYWxsIHJlbmRlcmVycy4KICAgICAgICB0aGlzLmZpbGwgPSBmYWxzZTsKICAgICAgICAvLyBwcm9wOiBmaWxsQ29sb3IKICAgICAgICAvLyBDU1MgY29sb3Igc3BlYyB0byB1c2UgZm9yIGZpbGwgdW5kZXIgbGluZS4gIERlZmF1bHRzIHRvIGxpbmUgY29sb3IuCiAgICAgICAgdGhpcy5maWxsQ29sb3I7CiAgICAgICAgLy8gcHJvcDogZmlsbEFscGhhCiAgICAgICAgLy8gQWxwaGEgdHJhbnNwYXJlbmN5IHRvIGFwcGx5IHRvIHRoZSBmaWxsIHVuZGVyIHRoZSBsaW5lLgogICAgICAgIC8vIFVzZSB0aGlzIHRvIGFkanVzdCBhbHBoYSBzZXBhcmF0ZSBmcm9tIGZpbGwgY29sb3IuCiAgICAgICAgdGhpcy5maWxsQWxwaGE7CiAgICAgICAgLy8gcHJvcDogZmlsbEFuZFN0cm9rZQogICAgICAgIC8vIElmIHRydWUgd2lsbCBzdHJva2UgdGhlIGxpbmUgKHdpdGggY29sb3IgdGhpcy5jb2xvcikgYXMgd2VsbCBhcyBmaWxsIHVuZGVyIGl0LgogICAgICAgIC8vIEFwcGxpZXMgb25seSB3aGVuIGZpbGwgaXMgdHJ1ZS4KICAgICAgICB0aGlzLmZpbGxBbmRTdHJva2UgPSBmYWxzZTsKICAgICAgICAvLyBwcm9wOiBkaXNhYmxlU3RhY2sKICAgICAgICAvLyB0cnVlIHRvIG5vdCBzdGFjayB0aGlzIHNlcmllcyB3aXRoIG90aGVyIHNlcmllcyBpbiB0aGUgcGxvdC4KICAgICAgICAvLyBUbyByZW5kZXIgcHJvcGVybHksIG5vbi1zdGFja2VkIHNlcmllcyBtdXN0IGNvbWUgYWZ0ZXIgYW55IHN0YWNrZWQgc2VyaWVzCiAgICAgICAgLy8gaW4gdGhlIHBsb3QncyBkYXRhIHNlcmllcyBhcnJheS4gIFNvLCB0aGUgcGxvdCdzIGRhdGEgc2VyaWVzIGFycmF5IHdvdWxkIGxvb2sgbGlrZToKICAgICAgICAvLyA+IFtzdGFja2VkU2VyaWVzMSwgc3RhY2tlZFNlcmllczIsIC4uLiwgbm9uU3RhY2tlZFNlcmllczEsIG5vblN0YWNrZWRTZXJpZXMyLCAuLi5dCiAgICAgICAgLy8gZGlzYWJsZVN0YWNrIHdpbGwgcHV0IGEgZ2FwIGluIHRoZSBzdGFja2luZyBvcmRlciBvZiBzZXJpZXMsIGFuZCBzdWJzZXF1ZW50CiAgICAgICAgLy8gc3RhY2tlZCBzZXJpZXMgd2lsbCBub3QgZmlsbCBkb3duIHRocm91Z2ggdGhlIG5vbi1zdGFja2VkIHNlcmllcyBhbmQgd2lsbAogICAgICAgIC8vIG1vc3QgbGlrZWx5IG5vdCBzdGFjayBwcm9wZXJseSBvbiB0b3Agb2YgdGhlIG5vbi1zdGFja2VkIHNlcmllcy4KICAgICAgICB0aGlzLmRpc2FibGVTdGFjayA9IGZhbHNlOwogICAgICAgIC8vIF9zdGFjayBpcyBzZXQgYnkgdGhlIFBsb3QgaWYgdGhlIHBsb3QgaXMgYSBzdGFja2VkIGNoYXJ0LgogICAgICAgIC8vIHdpbGwgc3RhY2sgbGluZXMgb3IgYmFycyBvbiB0b3Agb2Ygb25lIGFub3RoZXIgdG8gYnVpbGQgYSAibW91bnRhaW4iIHN0eWxlIGNoYXJ0LgogICAgICAgIC8vIE1heSBub3QgYmUgaW1wbGVtZW50ZWQgaW4gYWxsIHJlbmRlcmVycy4KICAgICAgICB0aGlzLl9zdGFjayA9IGZhbHNlOwogICAgICAgIC8vIHByb3A6IG5laWdoYm9yVGhyZXNob2xkCiAgICAgICAgLy8gaG93IGNsb3NlIG9yIGZhciAoaW4gcGl4ZWxzKSB0aGUgY3Vyc29yIG11c3QgYmUgZnJvbSBhIHBvaW50IG1hcmtlciB0byBkZXRlY3QgdGhlIHBvaW50LgogICAgICAgIHRoaXMubmVpZ2hib3JUaHJlc2hvbGQgPSA0OwogICAgICAgIC8vIHByb3A6IGZpbGxUb1plcm8KICAgICAgICAvLyB0cnVlIHdpbGwgZm9yY2UgYmFyIGFuZCBmaWxsZWQgc2VyaWVzIHRvIGZpbGwgdG93YXJkIHplcm8gb24gdGhlIGZpbGwgQXhpcy4KICAgICAgICB0aGlzLmZpbGxUb1plcm8gPSBmYWxzZTsKICAgICAgICAvLyBwcm9wOiBmaWxsVG9WYWx1ZQogICAgICAgIC8vIGZpbGwgYSBmaWxsZWQgc2VyaWVzIHRvIHRoaXMgdmFsdWUgb24gdGhlIGZpbGwgYXhpcy4KICAgICAgICAvLyBXb3JrcyBpbiBjb25qdW5jdGlvbiB3aXRoIGZpbGxUb1plcm8sIHNvIHRoYXQgbXVzdCBiZSB0cnVlLgogICAgICAgIHRoaXMuZmlsbFRvVmFsdWUgPSAwOwogICAgICAgIC8vIHByb3A6IGZpbGxBeGlzCiAgICAgICAgLy8gRWl0aGVyICd4JyBvciAneScuICBXaGljaCBheGlzIHRvIGZpbGwgdGhlIGxpbmUgdG93YXJkIGlmIGZpbGxUb1plcm8gaXMgdHJ1ZS4KICAgICAgICAvLyAneScgbWVhbnMgZmlsbCB1cC9kb3duIHRvIDAgb24gdGhlIHkgYXhpcyBmb3IgdGhpcyBzZXJpZXMuCiAgICAgICAgdGhpcy5maWxsQXhpcyA9ICd5JzsKICAgICAgICAvLyBwcm9wOiB1c2VOZWdhdGl2ZUNvbG9ycwogICAgICAgIC8vIHRydWUgdG8gY29sb3IgbmVnYXRpdmUgdmFsdWVzIGRpZmZlcmVudGx5IGluIGZpbGxlZCBhbmQgYmFyIGNoYXJ0cy4KICAgICAgICB0aGlzLnVzZU5lZ2F0aXZlQ29sb3JzID0gdHJ1ZTsKICAgICAgICB0aGlzLl9zdGFja0RhdGEgPSBbXTsKICAgICAgICAvLyBfcGxvdERhdGEgYWNjb3VudHMgZm9yIHN0YWNraW5nLiAgSWYgcGxvdHMgbm90IHN0YWNrZWQsIF9wbG90RGF0YSBhbmQgZGF0YSBhcmUgc2FtZS4gIElmCiAgICAgICAgLy8gc3RhY2tlZCwgX3Bsb3REYXRhIGlzIGFjY3VtdWxhdGlvbiBvZiBzdGFja2luZyBkYXRhLgogICAgICAgIHRoaXMuX3Bsb3REYXRhID0gW107CiAgICAgICAgLy8gX3Bsb3RWYWx1ZXMgaG9sZCB0aGUgaW5kaXZpZHVhbCB4IGFuZCB5IHZhbHVlcyB0aGF0IHdpbGwgYmUgcGxvdHRlZCBmb3IgdGhpcyBzZXJpZXMuCiAgICAgICAgdGhpcy5fcGxvdFZhbHVlcyA9IHt4OltdLCB5OltdfTsKICAgICAgICAvLyBzdGF0aXN0aWNzIGFib3V0IHRoZSBpbnRlcnZhbHMgYmV0d2VlbiBkYXRhIHBvaW50cy4gIFVzZWQgZm9yIGF1dG8gc2NhbGluZy4KICAgICAgICB0aGlzLl9pbnRlcnZhbHMgPSB7eDp7fSwgeTp7fX07CiAgICAgICAgLy8gZGF0YSBmcm9tIHRoZSBwcmV2aW91cyBzZXJpZXMsIGZvciBzdGFja2VkIGNoYXJ0cy4KICAgICAgICB0aGlzLl9wcmV2UGxvdERhdGEgPSBbXTsKICAgICAgICB0aGlzLl9wcmV2R3JpZERhdGEgPSBbXTsKICAgICAgICB0aGlzLl9zdGFja0F4aXMgPSAneSc7CiAgICAgICAgdGhpcy5fcHJpbWFyeUF4aXMgPSAnX3hheGlzJzsKICAgICAgICAvLyBnaXZlIGVhY2ggc2VyaWVzIGEgY2FudmFzIHRvIGRyYXcgb24uICBUaGlzIHNob3VsZCBhbGxvdyBmb3IgcmVkcmF3aW5nIHNwZWVkdXBzLgogICAgICAgIHRoaXMuY2FudmFzID0gbmV3ICQuanFwbG90LkdlbmVyaWNDYW52YXMoKTsKICAgICAgICB0aGlzLnNoYWRvd0NhbnZhcyA9IG5ldyAkLmpxcGxvdC5HZW5lcmljQ2FudmFzKCk7CiAgICAgICAgdGhpcy5wbHVnaW5zID0ge307CiAgICAgICAgLy8gc3VtIG9mIHkgdmFsdWVzIGluIHRoaXMgc2VyaWVzLgogICAgICAgIHRoaXMuX3N1bXkgPSAwOwogICAgICAgIHRoaXMuX3N1bXggPSAwOwogICAgICAgIHRoaXMuX3R5cGUgPSAnJzsKICAgIH0KICAgIAogICAgU2VyaWVzLnByb3RvdHlwZSA9IG5ldyAkLmpxcGxvdC5FbGVtQ29udGFpbmVyKCk7CiAgICBTZXJpZXMucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gU2VyaWVzOwogICAgCiAgICBTZXJpZXMucHJvdG90eXBlLmluaXQgPSBmdW5jdGlvbihpbmRleCwgZ3JpZGJ3LCBwbG90KSB7CiAgICAgICAgLy8gd2VlZCBvdXQgYW55IG51bGwgdmFsdWVzIGluIHRoZSBkYXRhLgogICAgICAgIHRoaXMuaW5kZXggPSBpbmRleDsKICAgICAgICB0aGlzLmdyaWRCb3JkZXJXaWR0aCA9IGdyaWRidzsKICAgICAgICB2YXIgZCA9IHRoaXMuZGF0YTsKICAgICAgICB2YXIgdGVtcCA9IFtdLCBpOwogICAgICAgIGZvciAoaT0wOyBpPGQubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgaWYgKCEgdGhpcy5icmVha09uTnVsbCkgewogICAgICAgICAgICAgICAgaWYgKGRbaV0gPT0gbnVsbCB8fCBkW2ldWzBdID09IG51bGwgfHwgZFtpXVsxXSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0ZW1wLnB1c2goZFtpXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAvLyBUT0RPOiBmaWd1cmUgb3V0IHdoYXQgdG8gZG8gd2l0aCBudWxsIHZhbHVlcwogICAgICAgICAgICAgICAgLy8gcHJvYmFibHkgaW52b2x2ZSBrZWVwaW5nIG51bGxzIGluIGRhdGEgYXJyYXkKICAgICAgICAgICAgICAgIC8vIGFuZCB0aGVuIHVwZGF0aW5nIHJlbmRlcmVycyB0byBicmVhayBsaW5lCiAgICAgICAgICAgICAgICAvLyB3aGVuIGl0IGhpdHMgbnVsbCB2YWx1ZS4KICAgICAgICAgICAgICAgIC8vIEZvciBub3csIGp1c3Qga2VlcCB2YWx1ZS4KICAgICAgICAgICAgICAgIHRlbXAucHVzaChkW2ldKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB0aGlzLmRhdGEgPSB0ZW1wOwoKICAgICAgICAvLyBwYXJzZSB0aGUgcmVuZGVyZXIgb3B0aW9ucyBhbmQgYXBwbHkgZGVmYXVsdCBjb2xvcnMgaWYgbm90IHByb3ZpZGVkCiAgICAgICAgaWYgKCF0aGlzLmNvbG9yICYmIHRoaXMuc2hvdykgewogICAgICAgICAgICB0aGlzLmNvbG9yID0gcGxvdC5jb2xvckdlbmVyYXRvci5nZXQodGhpcy5pbmRleCk7CiAgICAgICAgfQogICAgICAgIGlmICghdGhpcy5uZWdhdGl2ZUNvbG9yICYmIHRoaXMuc2hvdykgewogICAgICAgICAgICB0aGlzLm5lZ2F0aXZlQ29sb3IgPSBwbG90Lm5lZ2F0aXZlQ29sb3JHZW5lcmF0b3IuZ2V0KHRoaXMuaW5kZXgpOwogICAgICAgIH0KCgogICAgICAgIGlmICghdGhpcy5maWxsQ29sb3IpIHsKICAgICAgICAgICAgdGhpcy5maWxsQ29sb3IgPSB0aGlzLmNvbG9yOwogICAgICAgIH0KICAgICAgICBpZiAodGhpcy5maWxsQWxwaGEpIHsKICAgICAgICAgICAgdmFyIGNvbXAgPSAkLmpxcGxvdC5ub3JtYWxpemUycmdiKHRoaXMuZmlsbENvbG9yKTsKICAgICAgICAgICAgdmFyIGNvbXAgPSAkLmpxcGxvdC5nZXRDb2xvckNvbXBvbmVudHMoY29tcCk7CiAgICAgICAgICAgIHRoaXMuZmlsbENvbG9yID0gJ3JnYmEoJytjb21wWzBdKycsJytjb21wWzFdKycsJytjb21wWzJdKycsJyt0aGlzLmZpbGxBbHBoYSsnKSc7CiAgICAgICAgfQogICAgICAgIHRoaXMucmVuZGVyZXIgPSBuZXcgdGhpcy5yZW5kZXJlcigpOwogICAgICAgIHRoaXMucmVuZGVyZXIuaW5pdC5jYWxsKHRoaXMsIHRoaXMucmVuZGVyZXJPcHRpb25zLCBwbG90KTsKICAgICAgICB0aGlzLm1hcmtlclJlbmRlcmVyID0gbmV3IHRoaXMubWFya2VyUmVuZGVyZXIoKTsKICAgICAgICBpZiAoIXRoaXMubWFya2VyT3B0aW9ucy5jb2xvcikgewogICAgICAgICAgICB0aGlzLm1hcmtlck9wdGlvbnMuY29sb3IgPSB0aGlzLmNvbG9yOwogICAgICAgIH0KICAgICAgICBpZiAodGhpcy5tYXJrZXJPcHRpb25zLnNob3cgPT0gbnVsbCkgewogICAgICAgICAgICB0aGlzLm1hcmtlck9wdGlvbnMuc2hvdyA9IHRoaXMuc2hvd01hcmtlcjsKICAgICAgICB9CiAgICAgICAgdGhpcy5zaG93TWFya2VyID0gdGhpcy5tYXJrZXJPcHRpb25zLnNob3c7CiAgICAgICAgLy8gdGhlIG1hcmtlclJlbmRlcmVyIGlzIGNhbGxlZCB3aXRoaW4gaXQncyBvd24gc2Nhb3BlLCBkb24ndCB3YW50IHRvIG92ZXJ3cml0ZSBzZXJpZXMgb3B0aW9ucyEhCiAgICAgICAgdGhpcy5tYXJrZXJSZW5kZXJlci5pbml0KHRoaXMubWFya2VyT3B0aW9ucyk7CiAgICB9OwogICAgCiAgICAvLyBkYXRhIC0gb3B0aW9uYWwgZGF0YSBwb2ludCBhcnJheSB0byBkcmF3IHVzaW5nIHRoaXMgc2VyaWVzIHJlbmRlcmVyCiAgICAvLyBncmlkRGF0YSAtIG9wdGlvbmFsIGdyaWQgZGF0YSBwb2ludCBhcnJheSB0byBkcmF3IHVzaW5nIHRoaXMgc2VyaWVzIHJlbmRlcmVyCiAgICAvLyBzdGFja0RhdGEgLSBhcnJheSBvZiBjdW11bGF0aXZlIGRhdGEgZm9yIHN0YWNrZWQgcGxvdHMuCiAgICBTZXJpZXMucHJvdG90eXBlLmRyYXcgPSBmdW5jdGlvbihzY3R4LCBvcHRzLCBwbG90KSB7CiAgICAgICAgdmFyIG9wdGlvbnMgPSAob3B0cyA9PSB1bmRlZmluZWQpID8ge30gOiBvcHRzOwogICAgICAgIHNjdHggPSAoc2N0eCA9PSB1bmRlZmluZWQpID8gdGhpcy5jYW52YXMuX2N0eCA6IHNjdHg7CiAgICAgICAgCiAgICAgICAgdmFyIGosIGRhdGEsIGdyaWREYXRhOwogICAgICAgIAogICAgICAgIC8vIGhvb2tzIGdldCBjYWxsZWQgZXZlbiBpZiBzZXJpZXMgbm90IHNob3duCiAgICAgICAgLy8gd2UgZG9uJ3QgY2xlYXIgY2FudmFzIGhlcmUsIGl0IHdvdWxkIHdpcGUgb3V0IGFsbCBvdGhlciBzZXJpZXMgYXMgd2VsbC4KICAgICAgICBmb3IgKGo9MDsgajwkLmpxcGxvdC5wcmVEcmF3U2VyaWVzSG9va3MubGVuZ3RoOyBqKyspIHsKICAgICAgICAgICAgJC5qcXBsb3QucHJlRHJhd1Nlcmllc0hvb2tzW2pdLmNhbGwodGhpcywgc2N0eCwgb3B0aW9ucyk7CiAgICAgICAgfQogICAgICAgIGlmICh0aGlzLnNob3cpIHsKICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRHcmlkRGF0YS5jYWxsKHRoaXMsIHBsb3QpOwogICAgICAgICAgICBpZiAoIW9wdGlvbnMucHJldmVudEpxUGxvdFNlcmllc0RyYXdUcmlnZ2VyKSB7CiAgICAgICAgICAgICAgICAkKHNjdHguY2FudmFzKS50cmlnZ2VyKCdqcXBsb3RTZXJpZXNEcmF3JywgW3RoaXMuZGF0YSwgdGhpcy5ncmlkRGF0YV0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGRhdGEgPSBbXTsKICAgICAgICAgICAgaWYgKG9wdGlvbnMuZGF0YSkgewogICAgICAgICAgICAgICAgZGF0YSA9IG9wdGlvbnMuZGF0YTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICghdGhpcy5fc3RhY2spIHsKICAgICAgICAgICAgICAgIGRhdGEgPSB0aGlzLmRhdGE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBkYXRhID0gdGhpcy5fcGxvdERhdGE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ3JpZERhdGEgPSBvcHRpb25zLmdyaWREYXRhIHx8IHRoaXMucmVuZGVyZXIubWFrZUdyaWREYXRhLmNhbGwodGhpcywgZGF0YSwgcGxvdCk7CgogICAgICAgICAgICBpZiAodGhpcy5fdHlwZSA9PT0gJ2xpbmUnICYmIHRoaXMucmVuZGVyZXIuc21vb3RoICYmIHRoaXMucmVuZGVyZXIuX3Ntb290aGVkRGF0YS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgIGdyaWREYXRhID0gdGhpcy5yZW5kZXJlci5fc21vb3RoZWREYXRhOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmRyYXcuY2FsbCh0aGlzLCBzY3R4LCBncmlkRGF0YSwgb3B0aW9ucywgcGxvdCk7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGZvciAoaj0wOyBqPCQuanFwbG90LnBvc3REcmF3U2VyaWVzSG9va3MubGVuZ3RoOyBqKyspIHsKICAgICAgICAgICAgJC5qcXBsb3QucG9zdERyYXdTZXJpZXNIb29rc1tqXS5jYWxsKHRoaXMsIHNjdHgsIG9wdGlvbnMsIHBsb3QpOwogICAgICAgIH0KICAgICAgICAKICAgICAgICBzY3R4ID0gb3B0cyA9IHBsb3QgPSBqID0gZGF0YSA9IGdyaWREYXRhID0gbnVsbDsKICAgIH07CiAgICAKICAgIFNlcmllcy5wcm90b3R5cGUuZHJhd1NoYWRvdyA9IGZ1bmN0aW9uKHNjdHgsIG9wdHMsIHBsb3QpIHsKICAgICAgICB2YXIgb3B0aW9ucyA9IChvcHRzID09IHVuZGVmaW5lZCkgPyB7fSA6IG9wdHM7CiAgICAgICAgc2N0eCA9IChzY3R4ID09IHVuZGVmaW5lZCkgPyB0aGlzLnNoYWRvd0NhbnZhcy5fY3R4IDogc2N0eDsKICAgICAgICAKICAgICAgICB2YXIgaiwgZGF0YSwgZ3JpZERhdGE7CiAgICAgICAgCiAgICAgICAgLy8gaG9va3MgZ2V0IGNhbGxlZCBldmVuIGlmIHNlcmllcyBub3Qgc2hvd24KICAgICAgICAvLyB3ZSBkb24ndCBjbGVhciBjYW52YXMgaGVyZSwgaXQgd291bGQgd2lwZSBvdXQgYWxsIG90aGVyIHNlcmllcyBhcyB3ZWxsLgogICAgICAgIGZvciAoaj0wOyBqPCQuanFwbG90LnByZURyYXdTZXJpZXNTaGFkb3dIb29rcy5sZW5ndGg7IGorKykgewogICAgICAgICAgICAkLmpxcGxvdC5wcmVEcmF3U2VyaWVzU2hhZG93SG9va3Nbal0uY2FsbCh0aGlzLCBzY3R4LCBvcHRpb25zKTsKICAgICAgICB9CiAgICAgICAgaWYgKHRoaXMuc2hhZG93KSB7CiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0R3JpZERhdGEuY2FsbCh0aGlzLCBwbG90KTsKCiAgICAgICAgICAgIGRhdGEgPSBbXTsKICAgICAgICAgICAgaWYgKG9wdGlvbnMuZGF0YSkgewogICAgICAgICAgICAgICAgZGF0YSA9IG9wdGlvbnMuZGF0YTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICghdGhpcy5fc3RhY2spIHsKICAgICAgICAgICAgICAgIGRhdGEgPSB0aGlzLmRhdGE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBkYXRhID0gdGhpcy5fcGxvdERhdGE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ3JpZERhdGEgPSBvcHRpb25zLmdyaWREYXRhIHx8IHRoaXMucmVuZGVyZXIubWFrZUdyaWREYXRhLmNhbGwodGhpcywgZGF0YSwgcGxvdCk7CiAgICAgICAgCiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuZHJhd1NoYWRvdy5jYWxsKHRoaXMsIHNjdHgsIGdyaWREYXRhLCBvcHRpb25zKTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgZm9yIChqPTA7IGo8JC5qcXBsb3QucG9zdERyYXdTZXJpZXNTaGFkb3dIb29rcy5sZW5ndGg7IGorKykgewogICAgICAgICAgICAkLmpxcGxvdC5wb3N0RHJhd1Nlcmllc1NoYWRvd0hvb2tzW2pdLmNhbGwodGhpcywgc2N0eCwgb3B0aW9ucyk7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIHNjdHggPSBvcHRzID0gcGxvdCA9IGogPSBkYXRhID0gZ3JpZERhdGEgPSBudWxsOwogICAgICAgIAogICAgfTsKICAgIAogICAgLy8gdG9nZ2xlcyBzZXJpZXMgZGlzcGxheSBvbiBwbG90LCBlLmcuIHNob3cvaGlkZSBzZXJpZXMKICAgIFNlcmllcy5wcm90b3R5cGUudG9nZ2xlRGlzcGxheSA9IGZ1bmN0aW9uKGV2KSB7CiAgICAgICAgdmFyIHMsIHNwZWVkOwogICAgICAgIGlmIChldi5kYXRhLnNlcmllcykgewogICAgICAgICAgICBzID0gZXYuZGF0YS5zZXJpZXM7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBzID0gdGhpczsKICAgICAgICB9CiAgICAgICAgaWYgKGV2LmRhdGEuc3BlZWQpIHsKICAgICAgICAgICAgc3BlZWQgPSBldi5kYXRhLnNwZWVkOwogICAgICAgIH0KICAgICAgICBpZiAoc3BlZWQpIHsKICAgICAgICAgICAgaWYgKHMuY2FudmFzLl9lbGVtLmlzKCc6aGlkZGVuJykpIHsKICAgICAgICAgICAgICAgIHMuY2FudmFzLl9lbGVtLnJlbW92ZUNsYXNzKCdqcXBsb3Qtc2VyaWVzLWhpZGRlbicpOwogICAgICAgICAgICAgICAgaWYgKHMuc2hhZG93Q2FudmFzLl9lbGVtKSB7CiAgICAgICAgICAgICAgICAgICAgcy5zaGFkb3dDYW52YXMuX2VsZW0uZmFkZUluKHNwZWVkKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHMuY2FudmFzLl9lbGVtLmZhZGVJbihzcGVlZCk7CiAgICAgICAgICAgICAgICBzLmNhbnZhcy5fZWxlbS5uZXh0QWxsKCcuanFwbG90LXBvaW50LWxhYmVsLmpxcGxvdC1zZXJpZXMtJytzLmluZGV4KS5mYWRlSW4oc3BlZWQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgcy5jYW52YXMuX2VsZW0uYWRkQ2xhc3MoJ2pxcGxvdC1zZXJpZXMtaGlkZGVuJyk7CiAgICAgICAgICAgICAgICBpZiAocy5zaGFkb3dDYW52YXMuX2VsZW0pIHsKICAgICAgICAgICAgICAgICAgICBzLnNoYWRvd0NhbnZhcy5fZWxlbS5mYWRlT3V0KHNwZWVkKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHMuY2FudmFzLl9lbGVtLmZhZGVPdXQoc3BlZWQpOwogICAgICAgICAgICAgICAgcy5jYW52YXMuX2VsZW0ubmV4dEFsbCgnLmpxcGxvdC1wb2ludC1sYWJlbC5qcXBsb3Qtc2VyaWVzLScrcy5pbmRleCkuZmFkZU91dChzcGVlZCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGlmIChzLmNhbnZhcy5fZWxlbS5pcygnOmhpZGRlbicpKSB7CiAgICAgICAgICAgICAgICBzLmNhbnZhcy5fZWxlbS5yZW1vdmVDbGFzcygnanFwbG90LXNlcmllcy1oaWRkZW4nKTsKICAgICAgICAgICAgICAgIGlmIChzLnNoYWRvd0NhbnZhcy5fZWxlbSkgewogICAgICAgICAgICAgICAgICAgIHMuc2hhZG93Q2FudmFzLl9lbGVtLnNob3coKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHMuY2FudmFzLl9lbGVtLnNob3coKTsKICAgICAgICAgICAgICAgIHMuY2FudmFzLl9lbGVtLm5leHRBbGwoJy5qcXBsb3QtcG9pbnQtbGFiZWwuanFwbG90LXNlcmllcy0nK3MuaW5kZXgpLnNob3coKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHMuY2FudmFzLl9lbGVtLmFkZENsYXNzKCdqcXBsb3Qtc2VyaWVzLWhpZGRlbicpOwogICAgICAgICAgICAgICAgaWYgKHMuc2hhZG93Q2FudmFzLl9lbGVtKSB7CiAgICAgICAgICAgICAgICAgICAgcy5zaGFkb3dDYW52YXMuX2VsZW0uaGlkZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcy5jYW52YXMuX2VsZW0uaGlkZSgpOwogICAgICAgICAgICAgICAgcy5jYW52YXMuX2VsZW0ubmV4dEFsbCgnLmpxcGxvdC1wb2ludC1sYWJlbC5qcXBsb3Qtc2VyaWVzLScrcy5pbmRleCkuaGlkZSgpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfTsKICAgIAoKCiAgICAvKioKICAgICAqIENsYXNzOiBHcmlkCiAgICAgKiAKICAgICAqIE9iamVjdCByZXByZXNlbnRpbmcgdGhlIGdyaWQgb24gd2hpY2ggdGhlIHBsb3QgaXMgZHJhd24uICBUaGUgZ3JpZCBpbiB0aGlzCiAgICAgKiBjb250ZXh0IGlzIHRoZSBhcmVhIGJvdW5kZWQgYnkgdGhlIGF4ZXMsIHRoZSBhcmVhIHdoaWNoIHdpbGwgY29udGFpbiB0aGUgc2VyaWVzLgogICAgICogTm90ZSwgdGhlIHNlcmllcyBhcmUgZHJhd24gb24gdGhlaXIgb3duIGNhbnZhcy4KICAgICAqIFRoZSBHcmlkIG9iamVjdCBjYW5ub3QgYmUgaW5zdGFudGlhdGVkIGRpcmVjdGx5LCBidXQgaXMgY3JlYXRlZCBieSB0aGUgUGxvdCBvamVjdC4gIAogICAgICogR3JpZCBwcm9wZXJ0aWVzIGNhbiBiZSBzZXQgb3Igb3ZlcnJpZGVuIGJ5IHRoZSBvcHRpb25zIHBhc3NlZCBpbiBmcm9tIHRoZSB1c2VyLgogICAgICovCiAgICBmdW5jdGlvbiBHcmlkKCkgewogICAgICAgICQuanFwbG90LkVsZW1Db250YWluZXIuY2FsbCh0aGlzKTsKICAgICAgICAvLyBHcm91cDogUHJvcGVydGllcwogICAgICAgIAogICAgICAgIC8vIHByb3A6IGRyYXdHcmlkbGluZXMKICAgICAgICAvLyB3ZXRoZXIgdG8gZHJhdyB0aGUgZ3JpZGxpbmVzIG9uIHRoZSBwbG90LgogICAgICAgIHRoaXMuZHJhd0dyaWRsaW5lcyA9IHRydWU7CiAgICAgICAgLy8gcHJvcDogZ3JpZExpbmVDb2xvcgogICAgICAgIC8vIGNvbG9yIG9mIHRoZSBncmlkIGxpbmVzLgogICAgICAgIHRoaXMuZ3JpZExpbmVDb2xvciA9ICcjY2NjY2NjJzsKICAgICAgICAvLyBwcm9wOiBncmlkTGluZVdpZHRoCiAgICAgICAgLy8gd2lkdGggb2YgdGhlIGdyaWQgbGluZXMuCiAgICAgICAgdGhpcy5ncmlkTGluZVdpZHRoID0gMS4wOwogICAgICAgIC8vIHByb3A6IGJhY2tncm91bmQKICAgICAgICAvLyBjc3Mgc3BlYyBmb3IgdGhlIGJhY2tncm91bmQgY29sb3IuCiAgICAgICAgdGhpcy5iYWNrZ3JvdW5kID0gJyNmZmZkZjYnOwogICAgICAgIC8vIHByb3A6IGJvcmRlckNvbG9yCiAgICAgICAgLy8gY3NzIHNwZWMgZm9yIHRoZSBjb2xvciBvZiB0aGUgZ3JpZCBib3JkZXIuCiAgICAgICAgdGhpcy5ib3JkZXJDb2xvciA9ICcjOTk5OTk5JzsKICAgICAgICAvLyBwcm9wOiBib3JkZXJXaWR0aAogICAgICAgIC8vIHdpZHRoIG9mIHRoZSBib3JkZXIgaW4gcGl4ZWxzLgogICAgICAgIHRoaXMuYm9yZGVyV2lkdGggPSAyLjA7CiAgICAgICAgLy8gcHJvcDogZHJhd0JvcmRlcgogICAgICAgIC8vIFRydWUgdG8gZHJhdyBib3JkZXIgYXJvdW5kIGdyaWQuCiAgICAgICAgdGhpcy5kcmF3Qm9yZGVyID0gdHJ1ZTsKICAgICAgICAvLyBwcm9wOiBzaGFkb3cKICAgICAgICAvLyB3ZXRoZXIgdG8gc2hvdyBhIHNoYWRvdyBiZWhpbmQgdGhlIGdyaWQuCiAgICAgICAgdGhpcy5zaGFkb3cgPSB0cnVlOwogICAgICAgIC8vIHByb3A6IHNoYWRvd0FuZ2xlCiAgICAgICAgLy8gc2hhZG93IGFuZ2xlIGluIGRlZ3JlZXMKICAgICAgICB0aGlzLnNoYWRvd0FuZ2xlID0gNDU7CiAgICAgICAgLy8gcHJvcDogc2hhZG93T2Zmc2V0CiAgICAgICAgLy8gT2Zmc2V0IG9mIGVhY2ggc2hhZG93IHN0cm9rZSBmcm9tIHRoZSBib3JkZXIgaW4gcGl4ZWxzCiAgICAgICAgdGhpcy5zaGFkb3dPZmZzZXQgPSAxLjU7CiAgICAgICAgLy8gcHJvcDogc2hhZG93V2lkdGgKICAgICAgICAvLyB3aWR0aCBvZiB0aGUgc3Rva2UgZm9yIHRoZSBzaGFkb3cKICAgICAgICB0aGlzLnNoYWRvd1dpZHRoID0gMzsKICAgICAgICAvLyBwcm9wOiBzaGFkb3dEZXB0aAogICAgICAgIC8vIE51bWJlciBvZiB0aW1lcyBzaGFkb3cgaXMgc3Ryb2tlZCwgZWFjaCBzdHJva2Ugb2Zmc2V0IHNoYWRvd09mZnNldCBmcm9tIHRoZSBsYXN0LgogICAgICAgIHRoaXMuc2hhZG93RGVwdGggPSAzOwogICAgICAgIC8vIHByb3A6IHNoYWRvd0NvbG9yCiAgICAgICAgLy8gYW4gb3B0aW9uYWwgY3NzIGNvbG9yIHNwZWMgZm9yIHRoZSBzaGFkb3cgaW4gJ3JnYmEobiwgbiwgbiwgbiknIGZvcm0KICAgICAgICB0aGlzLnNoYWRvd0NvbG9yID0gbnVsbDsKICAgICAgICAvLyBwcm9wOiBzaGFkb3dBbHBoYQogICAgICAgIC8vIEFscGhhIGNoYW5uZWwgdHJhbnNwYXJlbmN5IG9mIHNoYWRvdy4gIDAgPSB0cmFuc3BhcmVudC4KICAgICAgICB0aGlzLnNoYWRvd0FscGhhID0gJzAuMDcnOwogICAgICAgIHRoaXMuX2xlZnQ7CiAgICAgICAgdGhpcy5fdG9wOwogICAgICAgIHRoaXMuX3JpZ2h0OwogICAgICAgIHRoaXMuX2JvdHRvbTsKICAgICAgICB0aGlzLl93aWR0aDsKICAgICAgICB0aGlzLl9oZWlnaHQ7CiAgICAgICAgdGhpcy5fYXhlcyA9IFtdOwogICAgICAgIC8vIHByb3A6IHJlbmRlcmVyCiAgICAgICAgLy8gSW5zdGFuY2Ugb2YgYSByZW5kZXJlciB3aGljaCB3aWxsIGFjdHVhbGx5IHJlbmRlciB0aGUgZ3JpZCwKICAgICAgICAvLyBzZWUgPCQuanFwbG90LkNhbnZhc0dyaWRSZW5kZXJlcj4uCiAgICAgICAgdGhpcy5yZW5kZXJlciA9ICQuanFwbG90LkNhbnZhc0dyaWRSZW5kZXJlcjsKICAgICAgICAvLyBwcm9wOiByZW5kZXJlck9wdGlvbnMKICAgICAgICAvLyBPcHRpb25zIHRvIHBhc3Mgb24gdG8gdGhlIHJlbmRlcmVyLAogICAgICAgIC8vIHNlZSA8JC5qcXBsb3QuQ2FudmFzR3JpZFJlbmRlcmVyPi4KICAgICAgICB0aGlzLnJlbmRlcmVyT3B0aW9ucyA9IHt9OwogICAgICAgIHRoaXMuX29mZnNldHMgPSB7dG9wOm51bGwsIGJvdHRvbTpudWxsLCBsZWZ0Om51bGwsIHJpZ2h0Om51bGx9OwogICAgfQogICAgCiAgICBHcmlkLnByb3RvdHlwZSA9IG5ldyAkLmpxcGxvdC5FbGVtQ29udGFpbmVyKCk7CiAgICBHcmlkLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEdyaWQ7CiAgICAKICAgIEdyaWQucHJvdG90eXBlLmluaXQgPSBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLnJlbmRlcmVyID0gbmV3IHRoaXMucmVuZGVyZXIoKTsKICAgICAgICB0aGlzLnJlbmRlcmVyLmluaXQuY2FsbCh0aGlzLCB0aGlzLnJlbmRlcmVyT3B0aW9ucyk7CiAgICB9OwogICAgCiAgICBHcmlkLnByb3RvdHlwZS5jcmVhdGVFbGVtZW50ID0gZnVuY3Rpb24ob2Zmc2V0cyxwbG90KSB7CiAgICAgICAgdGhpcy5fb2Zmc2V0cyA9IG9mZnNldHM7CiAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVyZXIuY3JlYXRlRWxlbWVudC5jYWxsKHRoaXMsIHBsb3QpOwogICAgfTsKICAgIAogICAgR3JpZC5wcm90b3R5cGUuZHJhdyA9IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMucmVuZGVyZXIuZHJhdy5jYWxsKHRoaXMpOwogICAgfTsKICAgIAogICAgJC5qcXBsb3QuR2VuZXJpY0NhbnZhcyA9IGZ1bmN0aW9uKCkgewogICAgICAgICQuanFwbG90LkVsZW1Db250YWluZXIuY2FsbCh0aGlzKTsKICAgICAgICB0aGlzLl9jdHg7ICAKICAgIH07CiAgICAKICAgICQuanFwbG90LkdlbmVyaWNDYW52YXMucHJvdG90eXBlID0gbmV3ICQuanFwbG90LkVsZW1Db250YWluZXIoKTsKICAgICQuanFwbG90LkdlbmVyaWNDYW52YXMucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gJC5qcXBsb3QuR2VuZXJpY0NhbnZhczsKICAgIAogICAgJC5qcXBsb3QuR2VuZXJpY0NhbnZhcy5wcm90b3R5cGUuY3JlYXRlRWxlbWVudCA9IGZ1bmN0aW9uKG9mZnNldHMsIGNsc3MsIHBsb3REaW1lbnNpb25zLCBwbG90KSB7CiAgICAgICAgdGhpcy5fb2Zmc2V0cyA9IG9mZnNldHM7CiAgICAgICAgdmFyIGtsYXNzID0gJ2pxcGxvdCc7CiAgICAgICAgaWYgKGNsc3MgIT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgIGtsYXNzID0gY2xzczsKICAgICAgICB9CiAgICAgICAgdmFyIGVsZW07CgogICAgICAgIGVsZW0gPSBwbG90LmNhbnZhc01hbmFnZXIuZ2V0Q2FudmFzKCk7CiAgICAgICAgCiAgICAgICAgLy8gaWYgbmV3IHBsb3REaW1lbnNpb25zIHN1cHBsaWVkLCB1c2UgdGhlbS4KICAgICAgICBpZiAocGxvdERpbWVuc2lvbnMgIT0gbnVsbCkgewogICAgICAgICAgICB0aGlzLl9wbG90RGltZW5zaW9ucyA9IHBsb3REaW1lbnNpb25zOwogICAgICAgIH0KICAgICAgICAKICAgICAgICBlbGVtLndpZHRoID0gdGhpcy5fcGxvdERpbWVuc2lvbnMud2lkdGggLSB0aGlzLl9vZmZzZXRzLmxlZnQgLSB0aGlzLl9vZmZzZXRzLnJpZ2h0OwogICAgICAgIGVsZW0uaGVpZ2h0ID0gdGhpcy5fcGxvdERpbWVuc2lvbnMuaGVpZ2h0IC0gdGhpcy5fb2Zmc2V0cy50b3AgLSB0aGlzLl9vZmZzZXRzLmJvdHRvbTsKICAgICAgICB0aGlzLl9lbGVtID0gJChlbGVtKTsKICAgICAgICB0aGlzLl9lbGVtLmNzcyh7IHBvc2l0aW9uOiAnYWJzb2x1dGUnLCBsZWZ0OiB0aGlzLl9vZmZzZXRzLmxlZnQsIHRvcDogdGhpcy5fb2Zmc2V0cy50b3AgfSk7CiAgICAgICAgCiAgICAgICAgdGhpcy5fZWxlbS5hZGRDbGFzcyhrbGFzcyk7CiAgICAgICAgCiAgICAgICAgZWxlbSA9IHBsb3QuY2FudmFzTWFuYWdlci5pbml0Q2FudmFzKGVsZW0pOwogICAgICAgIAogICAgICAgIGVsZW0gPSBudWxsOwogICAgICAgIHJldHVybiB0aGlzLl9lbGVtOwogICAgfTsKICAgIAogICAgJC5qcXBsb3QuR2VuZXJpY0NhbnZhcy5wcm90b3R5cGUuc2V0Q29udGV4dCA9IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuX2N0eCA9IHRoaXMuX2VsZW0uZ2V0KDApLmdldENvbnRleHQoIjJkIik7CiAgICAgICAgcmV0dXJuIHRoaXMuX2N0eDsKICAgIH07CiAgICAKICAgIC8vIE1lbW9yeSBMZWFrcyBwYXRjaAogICAgJC5qcXBsb3QuR2VuZXJpY0NhbnZhcy5wcm90b3R5cGUucmVzZXRDYW52YXMgPSBmdW5jdGlvbigpIHsKICAgICAgaWYgKHRoaXMuX2VsZW0pIHsKICAgICAgICBpZiAoJC5qcXBsb3QudXNlX2V4Y2FudmFzICYmIHdpbmRvdy5HX3ZtbENhbnZhc01hbmFnZXIudW5pbml0RWxlbWVudCAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgd2luZG93Lkdfdm1sQ2FudmFzTWFuYWdlci51bmluaXRFbGVtZW50KHRoaXMuX2VsZW0uZ2V0KDApKTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLy90aGlzLl9lbGVtLnJlbW92ZSgpOwogICAgICAgIHRoaXMuX2VsZW0uZW1wdHlGb3JjZSgpOwogICAgICB9CiAgICAgIAogICAgICB0aGlzLl9jdHggPSBudWxsOwogICAgfTsKICAgIAogICAgJC5qcXBsb3QuSG9va3NNYW5hZ2VyID0gZnVuY3Rpb24gKCkgewogICAgICAgIHRoaXMuaG9va3MgPVtdOwogICAgICAgIHRoaXMuYXJncyA9IFtdOwogICAgfTsKICAgIAogICAgJC5qcXBsb3QuSG9va3NNYW5hZ2VyLnByb3RvdHlwZS5hZGRPbmNlID0gZnVuY3Rpb24oZm4sIGFyZ3MpIHsKICAgICAgICBhcmdzID0gYXJncyB8fCBbXTsKICAgICAgICB2YXIgaGF2ZWhvb2sgPSBmYWxzZTsKICAgICAgICBmb3IgKHZhciBpPTAsIGw9dGhpcy5ob29rcy5sZW5ndGg7IGk8bDsgaSsrKSB7CiAgICAgICAgICAgIGlmICh0aGlzLmhvb2tzW2ldWzBdID09IGZuKSB7CiAgICAgICAgICAgICAgICBoYXZlaG9vayA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCFoYXZlaG9vaykgewogICAgICAgICAgICB0aGlzLmhvb2tzLnB1c2goZm4pOwogICAgICAgICAgICB0aGlzLmFyZ3MucHVzaChhcmdzKTsKICAgICAgICB9CiAgICB9OwogICAgCiAgICAkLmpxcGxvdC5Ib29rc01hbmFnZXIucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uKGZuLCBhcmdzKSB7CiAgICAgICAgYXJncyA9IGFyZ3MgfHwgW107CiAgICAgICAgdGhpcy5ob29rcy5wdXNoKGZuKTsKICAgICAgICB0aGlzLmFyZ3MucHVzaChhcmdzKTsKICAgIH07CiAgICAKICAgICQuanFwbG90LkV2ZW50TGlzdGVuZXJNYW5hZ2VyID0gZnVuY3Rpb24gKCkgewogICAgICAgIHRoaXMuaG9va3MgPVtdOwogICAgfTsKICAgIAogICAgJC5qcXBsb3QuRXZlbnRMaXN0ZW5lck1hbmFnZXIucHJvdG90eXBlLmFkZE9uY2UgPSBmdW5jdGlvbihldiwgZm4pIHsKICAgICAgICB2YXIgaGF2ZWhvb2sgPSBmYWxzZSwgaCwgaTsKICAgICAgICBmb3IgKHZhciBpPTAsIGw9dGhpcy5ob29rcy5sZW5ndGg7IGk8bDsgaSsrKSB7CiAgICAgICAgICAgIGggPSB0aGlzLmhvb2tzW2ldOwogICAgICAgICAgICBpZiAoaFswXSA9PSBldiAmJiBoWzFdID09IGZuKSB7CiAgICAgICAgICAgICAgICBoYXZlaG9vayA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCFoYXZlaG9vaykgewogICAgICAgICAgICB0aGlzLmhvb2tzLnB1c2goW2V2LCBmbl0pOwogICAgICAgIH0KICAgIH07CiAgICAKICAgICQuanFwbG90LkV2ZW50TGlzdGVuZXJNYW5hZ2VyLnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbihldiwgZm4pIHsKICAgICAgICB0aGlzLmhvb2tzLnB1c2goW2V2LCBmbl0pOwogICAgfTsKCgogICAgdmFyIF9heGlzTmFtZXMgPSBbJ3lNaWRBeGlzJywgJ3hheGlzJywgJ3lheGlzJywgJ3gyYXhpcycsICd5MmF4aXMnLCAneTNheGlzJywgJ3k0YXhpcycsICd5NWF4aXMnLCAneTZheGlzJywgJ3k3YXhpcycsICd5OGF4aXMnLCAneTlheGlzJ107CgogICAgLyoqCiAgICAgKiBDbGFzczoganFQbG90CiAgICAgKiBQbG90IG9iamVjdCByZXR1cm5lZCBieSBjYWxsIHRvICQuanFwbG90LiAgSGFuZGxlcyBwYXJzaW5nIHVzZXIgb3B0aW9ucywKICAgICAqIGNyZWF0aW5nIHN1YiBvYmplY3RzIChBeGVzLCBsZWdlbmQsIHRpdGxlLCBzZXJpZXMpIGFuZCByZW5kZXJpbmcgdGhlIHBsb3QuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGpxUGxvdCgpIHsKICAgICAgICAvLyBHcm91cDogUHJvcGVydGllcwogICAgICAgIC8vIFRoZXNlIHByb3BlcnRpZXMgYXJlIHNwZWNpZmllZCBhdCB0aGUgdG9wIG9mIHRoZSBvcHRpb25zIG9iamVjdAogICAgICAgIC8vIGxpa2Ugc286CiAgICAgICAgLy8gPiB7CiAgICAgICAgLy8gPiAgICAgYXhlc0RlZmF1bHRzOnttaW46MH0sCiAgICAgICAgLy8gPiAgICAgc2VyaWVzOlt7Y29sb3I6JyM2NjMzZGQnfV0sCiAgICAgICAgLy8gPiAgICAgdGl0bGU6ICdBIFBsb3QnCiAgICAgICAgLy8gPiB9CiAgICAgICAgLy8KCiAgICAgICAgLy8gcHJvcDogYW5pbWF0ZQogICAgICAgIC8vIFRydWUgdG8gYW5pbWF0ZSB0aGUgc2VyaWVzIG9uIGluaXRpYWwgcGxvdCBkcmF3IChyZW5kZXJlciBkZXBlbmRlbnQpLgogICAgICAgIC8vIEFjdHVhbCBhbmltYXRpb24gZnVuY3Rpb25hbGl0eSBtdXN0IGJlIHN1cHBvcnRlZCBpbiB0aGUgcmVuZGVyZXIuCiAgICAgICAgdGhpcy5hbmltYXRlID0gZmFsc2U7CiAgICAgICAgLy8gcHJvcDogYW5pbWF0ZVJlcGxvdAogICAgICAgIC8vIFRydWUgdG8gYW5pbWF0ZSBzZXJpZXMgYWZ0ZXIgYSBjYWxsIHRvIHRoZSByZXBsb3QoKSBtZXRob2QuCiAgICAgICAgLy8gVXNlIHdpdGggY2F1dGlvbiEgIFJlcGxvdHMgY2FuIGhhcHBlbiB2ZXJ5IGZyZXF1ZW50bHkgdW5kZXIKICAgICAgICAvLyBjZXJ0YWluIGNpcmN1bXN0YW5jZXMgKGUuZy4gcmVzaXppbmcsIGRyYWdnaW5nIHBvaW50cykgYW5kCiAgICAgICAgLy8gYW5pbWF0aW9uIGluIHRoZXNlIHNpdHVhdGlvbnMgY2FuIGNhdXNlIHByb2JsZW1zLgogICAgICAgIHRoaXMuYW5pbWF0ZVJlcGxvdCA9IGZhbHNlOwogICAgICAgIC8vIHByb3A6IGF4ZXMKICAgICAgICAvLyB1cCB0byA0IGF4ZXMgYXJlIHN1cHBvcnRlZCwgZWFjaCB3aXRoIGl0J3Mgb3duIG9wdGlvbnMsIAogICAgICAgIC8vIFNlZSA8QXhpcz4gZm9yIGF4aXMgc3BlY2lmaWMgb3B0aW9ucy4KICAgICAgICB0aGlzLmF4ZXMgPSB7eGF4aXM6IG5ldyBBeGlzKCd4YXhpcycpLCB5YXhpczogbmV3IEF4aXMoJ3lheGlzJyksIHgyYXhpczogbmV3IEF4aXMoJ3gyYXhpcycpLCB5MmF4aXM6IG5ldyBBeGlzKCd5MmF4aXMnKSwgeTNheGlzOiBuZXcgQXhpcygneTNheGlzJyksIHk0YXhpczogbmV3IEF4aXMoJ3k0YXhpcycpLCB5NWF4aXM6IG5ldyBBeGlzKCd5NWF4aXMnKSwgeTZheGlzOiBuZXcgQXhpcygneTZheGlzJyksIHk3YXhpczogbmV3IEF4aXMoJ3k3YXhpcycpLCB5OGF4aXM6IG5ldyBBeGlzKCd5OGF4aXMnKSwgeTlheGlzOiBuZXcgQXhpcygneTlheGlzJyksIHlNaWRBeGlzOiBuZXcgQXhpcygneU1pZEF4aXMnKX07CiAgICAgICAgdGhpcy5iYXNlQ2FudmFzID0gbmV3ICQuanFwbG90LkdlbmVyaWNDYW52YXMoKTsKICAgICAgICAvLyB0cnVlIHRvIGludGVyY2VwdCByaWdodCBjbGljayBldmVudHMgYW5kIGZpcmUgYSAnanFwbG90UmlnaHRDbGljaycgZXZlbnQuCiAgICAgICAgLy8gdGhpcyB3aWxsIGFsc28gYmxvY2sgdGhlIGNvbnRleHQgbWVudS4KICAgICAgICB0aGlzLmNhcHR1cmVSaWdodENsaWNrID0gZmFsc2U7CiAgICAgICAgLy8gcHJvcDogZGF0YQogICAgICAgIC8vIHVzZXIncyBkYXRhLiAgRGF0YSBzaG91bGQgKk5PVCogYmUgc3BlY2lmaWVkIGluIHRoZSBvcHRpb25zIG9iamVjdCwKICAgICAgICAvLyBidXQgYmUgcGFzc2VkIGluIGFzIHRoZSBzZWNvbmQgYXJndW1lbnQgdG8gdGhlICQuanFwbG90KCkgZnVuY3Rpb24uCiAgICAgICAgLy8gVGhlIGRhdGEgcHJvcGVydHkgaXMgZGVzY3JpYmVkIGhlcmUgc29sZXkgZm9yIHJlZmVyZW5jZS4gCiAgICAgICAgLy8gVGhlIGRhdGEgc2hvdWxkIGJlIGluIHRoZSBmb3JtIG9mIGFuIGFycmF5IG9mIDJEIG9yIDFEIGFycmF5cyBsaWtlCiAgICAgICAgLy8gPiBbIFtbeDEsIHkxXSwgW3gyLCB5Ml0sLi4uXSwgW3kxLCB5MiwgLi4uXSBdLgogICAgICAgIHRoaXMuZGF0YSA9IFtdOwogICAgICAgIC8vIHByb3A6IGRhdGFSZW5kZXJlcgogICAgICAgIC8vIEEgY2FsbGFibGUgd2hpY2ggY2FuIGJlIHVzZWQgdG8gcHJlcHJvY2VzcyBkYXRhIHBhc3NlZCBpbnRvIHRoZSBwbG90LgogICAgICAgIC8vIFdpbGwgYmUgY2FsbGVkIHdpdGggMiBhcmd1bWVudHMsIHRoZSBwbG90IGRhdGEgYW5kIGEgcmVmZXJlbmNlIHRvIHRoZSBwbG90LgogICAgICAgIHRoaXMuZGF0YVJlbmRlcmVyOwogICAgICAgIC8vIHByb3A6IGRhdGFSZW5kZXJlck9wdGlvbnMKICAgICAgICAvLyBPcHRpb25zIHRoYXQgd2lsbCBiZSBwYXNzZWQgdG8gdGhlIGRhdGFSZW5kZXJlci4KICAgICAgICAvLyBDYW4gYmUgb2YgYW55IHR5cGUuCiAgICAgICAgdGhpcy5kYXRhUmVuZGVyZXJPcHRpb25zOwogICAgICAgIHRoaXMuZGVmYXVsdHMgPSB7CiAgICAgICAgICAgIC8vIHByb3A6IGF4ZXNEZWZhdWx0cwogICAgICAgICAgICAvLyBkZWZhdWx0IG9wdGlvbnMgdGhhdCB3aWxsIGJlIGFwcGxpZWQgdG8gYWxsIGF4ZXMuCiAgICAgICAgICAgIC8vIHNlZSA8QXhpcz4gZm9yIGF4ZXMgb3B0aW9ucy4KICAgICAgICAgICAgYXhlc0RlZmF1bHRzOiB7fSwKICAgICAgICAgICAgYXhlczoge3hheGlzOnt9LCB5YXhpczp7fSwgeDJheGlzOnt9LCB5MmF4aXM6e30sIHkzYXhpczp7fSwgeTRheGlzOnt9LCB5NWF4aXM6e30sIHk2YXhpczp7fSwgeTdheGlzOnt9LCB5OGF4aXM6e30sIHk5YXhpczp7fSwgeU1pZEF4aXM6e319LAogICAgICAgICAgICAvLyBwcm9wOiBzZXJpZXNEZWZhdWx0cwogICAgICAgICAgICAvLyBkZWZhdWx0IG9wdGlvbnMgdGhhdCB3aWxsIGJlIGFwcGxpZWQgdG8gYWxsIHNlcmllcy4KICAgICAgICAgICAgLy8gc2VlIDxTZXJpZXM+IGZvciBzZXJpZXMgb3B0aW9ucy4KICAgICAgICAgICAgc2VyaWVzRGVmYXVsdHM6IHt9LAogICAgICAgICAgICBzZXJpZXM6W10KICAgICAgICB9OwogICAgICAgIC8vIHByb3A6IGRlZmF1bHRBeGlzU3RhcnQKICAgICAgICAvLyAxLUQgZGF0YSBzZXJpZXMgYXJlIGludGVybmFsbHkgY29udmVydGVkIGludG8gMi1EIFt4LHldIGRhdGEgcG9pbnQgYXJyYXlzCiAgICAgICAgLy8gYnkganFQbG90LiAgVGhpcyBpcyB0aGUgZGVmYXVsdCBzdGFydGluZyB2YWx1ZSBmb3IgdGhlIG1pc3NpbmcgeCBvciB5IHZhbHVlLgogICAgICAgIC8vIFRoZSBhZGRlZCBkYXRhIHdpbGwgYmUgYSBtb25vdG9uaWNhbGx5IGluY3JlYXNpbmcgc2VyaWVzIChlLmcuIFsxLCAyLCAzLCAuLi5dKQogICAgICAgIC8vIHN0YXJ0aW5nIGF0IHRoaXMgdmFsdWUuCiAgICAgICAgdGhpcy5kZWZhdWx0QXhpc1N0YXJ0ID0gMTsKICAgICAgICAvLyB0aGlzLmRvQ3VzdG9tRXZlbnRCaW5kaW5nID0gdHJ1ZTsKICAgICAgICAvLyBwcm9wOiBkcmF3SWZIaWRkZW4KICAgICAgICAvLyBUcnVlIHRvIGV4ZWN1dGUgdGhlIGRyYXcgbWV0aG9kIGV2ZW4gaWYgdGhlIHBsb3QgdGFyZ2V0IGlzIGhpZGRlbi4KICAgICAgICAvLyBHZW5lcmFsbHksIHRoaXMgc2hvdWxkIGJlIGZhbHNlLiAgTW9zdCBwbG90IGVsZW1lbnRzIHdpbGwgbm90IGJlIHNpemVkLwogICAgICAgIC8vIHBvc2l0aW9uZWQgY29ycmVjbHR5IGlmIHJlbmRlcmVyZWQgaW50byBhIGhpZGRlbiBjb250YWluZXIuICBUbyByZW5kZXIgaW50bwogICAgICAgIC8vIGEgaGlkZGVuIGNvbnRhaW5lciwgY2FsbCB0aGUgcmVwbG90IG1ldGhvZCB3aGVuIHRoZSBjb250YWluZXIgaXMgc2hvd24uCiAgICAgICAgdGhpcy5kcmF3SWZIaWRkZW4gPSBmYWxzZTsKICAgICAgICB0aGlzLmV2ZW50Q2FudmFzID0gbmV3ICQuanFwbG90LkdlbmVyaWNDYW52YXMoKTsKICAgICAgICAvLyBwcm9wOiBmaWxsQmV0d2VlbgogICAgICAgIC8vIEZpbGwgYmV0d2VlbiAyIGxpbmUgc2VyaWVzIGluIGEgcGxvdC4KICAgICAgICAvLyBPcHRpb25zIG9iamVjdDoKICAgICAgICAvLyB7CiAgICAgICAgLy8gICAgc2VyaWVzMTogZmlyc3QgaW5kZXggKDAgYmFzZWQpIG9mIHNlcmllcyBpbiBmaWxsCiAgICAgICAgLy8gICAgc2VyaWVzMjogc2Vjb25kIGluZGV4ICgwIGJhc2VkKSBvZiBzZXJpZXMgaW4gZmlsbAogICAgICAgIC8vICAgIGNvbG9yOiBjb2xvciBvZiBmaWxsIFtkZWZhdWx0IGZpbGxDb2xvciBvZiBzZXJpZXMxXQogICAgICAgIC8vICAgIGJhc2VTZXJpZXM6ICBmaWxsIHdpbGwgYmUgZHJhd24gYmVsb3cgdGhpcyBzZXJpZXMgKDAgYmFzZWQgaW5kZXgpCiAgICAgICAgLy8gICAgZmlsbDogZmFsc2UgdG8gdHVybiBvZmYgZmlsbCBbZGVmYXVsdCB0cnVlXS4KICAgICAgICAvLyAgfQogICAgICAgIHRoaXMuZmlsbEJldHdlZW4gPSB7CiAgICAgICAgICAgIHNlcmllczE6IG51bGwsCiAgICAgICAgICAgIHNlcmllczI6IG51bGwsCiAgICAgICAgICAgIGNvbG9yOiBudWxsLAogICAgICAgICAgICBiYXNlU2VyaWVzOiAwLAogICAgICAgICAgICBmaWxsOiB0cnVlCiAgICAgICAgfTsKICAgICAgICAvLyBwcm9wOyBmb250RmFtaWx5CiAgICAgICAgLy8gY3NzIHNwZWMgZm9yIHRoZSBmb250LWZhbWlseSBhdHRyaWJ1dGUuICBEZWZhdWx0IGZvciB0aGUgZW50aXJlIHBsb3QuCiAgICAgICAgdGhpcy5mb250RmFtaWx5OwogICAgICAgIC8vIHByb3A6IGZvbnRTaXplCiAgICAgICAgLy8gY3NzIHNwZWMgZm9yIHRoZSBmb250LXNpemUgYXR0cmlidXRlLiAgRGVmYXVsdCBmb3IgdGhlIGVudGlyZSBwbG90LgogICAgICAgIHRoaXMuZm9udFNpemU7CiAgICAgICAgLy8gcHJvcDogZ3JpZAogICAgICAgIC8vIFNlZSA8R3JpZD4gZm9yIGdyaWQgc3BlY2lmaWMgb3B0aW9ucy4KICAgICAgICB0aGlzLmdyaWQgPSBuZXcgR3JpZCgpOwogICAgICAgIC8vIHByb3A6IGxlZ2VuZAogICAgICAgIC8vIHNlZSA8JC5qcXBsb3QuVGFibGVMZWdlbmRSZW5kZXJlcj4KICAgICAgICB0aGlzLmxlZ2VuZCA9IG5ldyBMZWdlbmQoKTsKICAgICAgICAvLyBwcm9wOiBub0RhdGFJbmRpY2F0b3IKICAgICAgICAvLyBPcHRpb25zIHRvIHNldCB1cCBhIG1vY2sgcGxvdCB3aXRoIGEgZGF0YSBsb2FkaW5nIGluZGljYXRvciBpZiBubyBkYXRhIGlzIHNwZWNpZmllZC4KICAgICAgICB0aGlzLm5lZ2F0aXZlU2VyaWVzQ29sb3JzID0gJC5qcXBsb3QuY29uZmlnLmRlZmF1bHROZWdhdGl2ZUNvbG9yczsKICAgICAgICB0aGlzLm5vRGF0YUluZGljYXRvciA9IHsgICAgCiAgICAgICAgICAgIHNob3c6IGZhbHNlLAogICAgICAgICAgICBpbmRpY2F0b3I6ICdMb2FkaW5nIERhdGEuLi4nLAogICAgICAgICAgICBheGVzOiB7CiAgICAgICAgICAgICAgICB4YXhpczogewogICAgICAgICAgICAgICAgICAgIG1pbjogMCwKICAgICAgICAgICAgICAgICAgICBtYXg6IDEwLAogICAgICAgICAgICAgICAgICAgIHRpY2tJbnRlcnZhbDogMiwKICAgICAgICAgICAgICAgICAgICBzaG93OiB0cnVlCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgeWF4aXM6IHsKICAgICAgICAgICAgICAgICAgICBtaW46IDAsCiAgICAgICAgICAgICAgICAgICAgbWF4OiAxMiwKICAgICAgICAgICAgICAgICAgICB0aWNrSW50ZXJ2YWw6IDMsCiAgICAgICAgICAgICAgICAgICAgc2hvdzogdHJ1ZQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICAvLyBjb250YWluZXIgdG8gaG9sZCBhbGwgb2YgdGhlIG1lcmdlZCBvcHRpb25zLiAgQ29udmllbmVuY2UgZm9yIHBsdWdpbnMuCiAgICAgICAgdGhpcy5vcHRpb25zID0ge307CiAgICAgICAgdGhpcy5wcmV2aW91c1Nlcmllc1N0YWNrID0gW107CiAgICAgICAgLy8gTmFtZXNwZWNlIHRvIGhvbGQgcGx1Z2lucy4gIEdlbmVyYWxseSBub24tcmVuZGVyZXIgcGx1Z2lucyBhZGQgdGhlbXNlbHZlcyB0byBoZXJlLgogICAgICAgIHRoaXMucGx1Z2lucyA9IHt9OwogICAgICAgIC8vIHByb3A6IHNlcmllcwogICAgICAgIC8vIEFycmF5IG9mIHNlcmllcyBvYmplY3Qgb3B0aW9ucy4KICAgICAgICAvLyBzZWUgPFNlcmllcz4gZm9yIHNlcmllcyBzcGVjaWZpYyBvcHRpb25zLgogICAgICAgIHRoaXMuc2VyaWVzID0gW107CiAgICAgICAgLy8gYXJyYXkgb2Ygc2VyaWVzIGluZGljaWVzLiBLZWVwIHRyYWNrIG9mIG9yZGVyCiAgICAgICAgLy8gd2hpY2ggc2VyaWVzIGNhbnZhc2VzIGFyZSBkaXNwbGF5ZWQsIGxvd2VzdAogICAgICAgIC8vIHRvIGhpZ2hlc3QsIGJhY2sgdG8gZnJvbnQuCiAgICAgICAgdGhpcy5zZXJpZXNTdGFjayA9IFtdOwogICAgICAgIC8vIHByb3A6IHNlcmllc0NvbG9ycwogICAgICAgIC8vIEFubiBhcnJheSBvZiBDU1MgY29sb3Igc3BlY2lmaWNhdGlvbnMgdGhhdCB3aWxsIGJlIGFwcGxpZWQsIGluIG9yZGVyLAogICAgICAgIC8vIHRvIHRoZSBzZXJpZXMgaW4gdGhlIHBsb3QuICBDb2xvcnMgd2lsbCB3cmFwIGFyb3VuZCBzbywgaWYgdGhlaXIKICAgICAgICAvLyBhcmUgbW9yZSBzZXJpZXMgdGhhbiBjb2xvcnMsIGNvbG9ycyB3aWxsIGJlIHJldXNlZCBzdGFydGluZyBhdCB0aGUKICAgICAgICAvLyBiZWdpbm5pbmcuICBGb3IgcGllIGNoYXJ0cywgdGhpcyBzcGVjaWZpZXMgdGhlIGNvbG9ycyBvZiB0aGUgc2xpY2VzLgogICAgICAgIHRoaXMuc2VyaWVzQ29sb3JzID0gJC5qcXBsb3QuY29uZmlnLmRlZmF1bHRDb2xvcnM7CiAgICAgICAgLy8gcHJvcDogc29ydERhdGEKICAgICAgICAvLyBmYWxzZSB0byBub3Qgc29ydCB0aGUgZGF0YSBwYXNzZWQgaW4gYnkgdGhlIHVzZXIuCiAgICAgICAgLy8gTWFueSBiYXIsIHN0YWtjZWQgYW5kIG90aGVyIGdyYXBocyBhcyB3ZWxsIGFzIG1hbnkgcGx1Z2lucyBkZXBlbmQgb24KICAgICAgICAvLyBoYXZpbmcgc29ydGVkIGRhdGEuCiAgICAgICAgdGhpcy5zb3J0RGF0YSA9IHRydWU7CiAgICAgICAgLy8gcHJvcDogc3RhY2tTZXJpZXMKICAgICAgICAvLyB0cnVlIG9yIGZhbHNlLCBjcmVhdGVzIGEgc3RhY2sgb3IgIm1vdW50YWluIiBwbG90LgogICAgICAgIC8vIE5vdCBhbGwgc2VyaWVzIHJlbmRlcmVycyBtYXkgaW1wbGVtZW50IHRoaXMgb3B0aW9uLgogICAgICAgIHRoaXMuc3RhY2tTZXJpZXMgPSBmYWxzZTsKICAgICAgICAvLyBhIHNob3J0Y3V0IGZvciBheGlzIHN5bmNUaWNrcyBvcHRpb25zLiAgTm90IGltcGxlbWVudGVkIHlldC4KICAgICAgICB0aGlzLnN5bmNYVGlja3MgPSB0cnVlOwogICAgICAgIC8vIGEgc2hvcnRjdXQgZm9yIGF4aXMgc3luY1RpY2tzIG9wdGlvbnMuICBOb3QgaW1wbGVtZW50ZWQgeWV0LgogICAgICAgIHRoaXMuc3luY1lUaWNrcyA9IHRydWU7CiAgICAgICAgLy8gdGhlIGpxdWVyeSBvYmplY3QgZm9yIHRoZSBkb20gdGFyZ2V0LgogICAgICAgIHRoaXMudGFyZ2V0ID0gbnVsbDsgCiAgICAgICAgLy8gVGhlIGlkIG9mIHRoZSBkb20gZWxlbWVudCB0byByZW5kZXIgdGhlIHBsb3QgaW50bwogICAgICAgIHRoaXMudGFyZ2V0SWQgPSBudWxsOwogICAgICAgIC8vIHByb3AgdGV4dENvbG9yCiAgICAgICAgLy8gY3NzIHNwZWMgZm9yIHRoZSBjc3MgY29sb3IgYXR0cmlidXRlLiAgRGVmYXVsdCBmb3IgdGhlIGVudGlyZSBwbG90LgogICAgICAgIHRoaXMudGV4dENvbG9yOwogICAgICAgIC8vIHByb3A6IHRpdGxlCiAgICAgICAgLy8gVGl0bGUgb2JqZWN0LiAgU2VlIDxUaXRsZT4gZm9yIHNwZWNpZmljIG9wdGlvbnMuICBBcyBhIHNob3J0Y3V0LCB5b3UKICAgICAgICAvLyBjYW4gc3BlY2lmeSB0aGUgdGl0bGUgb3B0aW9uIGFzIGp1c3QgYSBzdHJpbmcgbGlrZTogdGl0bGU6ICdNeSBQbG90JwogICAgICAgIC8vIGFuZCB0aGlzIHdpbGwgY3JlYXRlIGEgbmV3IHRpdGxlIG9iamVjdCB3aXRoIHRoZSBzcGVjaWZpZWQgdGV4dC4KICAgICAgICB0aGlzLnRpdGxlID0gbmV3IFRpdGxlKCk7CiAgICAgICAgLy8gQ291bnQgaG93IG1hbnkgdGltZXMgdGhlIGRyYXcgbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCB3aGlsZSB0aGUgcGxvdCBpcyB2aXNpYmxlLgogICAgICAgIC8vIE1vc3RseSB1c2VkIHRvIHRlc3QgaWYgcGxvdCBoYXMgbmV2ZXIgYmVlbiBkcmFuICg9MCksIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBkcmF3bgogICAgICAgIC8vIGludG8gYSB2aXNpYmxlIGNvbnRhaW5lciBvbmNlICg9MSkgb3IgZHJhdyBtb3JlIHRoYW4gb25jZSBpbnRvIGEgdmlzaWJsZSBjb250YWluZXIuCiAgICAgICAgLy8gQ2FuIHVzZSB0aGlzIGluIHRlc3RzIHRvIHNlZSBpZiBwbG90IGhhcyBiZWVuIHZpc2libHkgZHJhd24gYXQgbGVhc3Qgb25lIHRpbWUuCiAgICAgICAgLy8gQWZ0ZXIgcGxvdCBoYXMgYmVlbiB2aXNpYmx5IGRyYXduIG9uY2UsIGl0IGdlbmVyYWxseSBkb2Vzbid0IG5lZWQgcmVkcmF3biBpZiBpdHMKICAgICAgICAvLyBjb250YWluZXIgaXMgaGlkZGVuIGFuZCBzaG93bi4KICAgICAgICB0aGlzLl9kcmF3Q291bnQgPSAwOwogICAgICAgIC8vIHN1bSBvZiB5IHZhbHVlcyBmb3IgYWxsIHNlcmllcyBpbiBwbG90LgogICAgICAgIC8vIHVzZWQgaW4gbWVra28gY2hhcnQuCiAgICAgICAgdGhpcy5fc3VteSA9IDA7CiAgICAgICAgdGhpcy5fc3VteCA9IDA7CiAgICAgICAgLy8gYXJyYXkgdG8gaG9sZCB0aGUgY3VtdWxhdGl2ZSBzdGFja2VkIHNlcmllcyBkYXRhLgogICAgICAgIC8vIHVzZWQgdG8gYWp1c3QgdGhlIGluZGl2aWR1YWwgc2VyaWVzIGRhdGEsIHdoaWNoIHdvbid0IGhhdmUgYWNjZXNzIHRvIG90aGVyCiAgICAgICAgLy8gc2VyaWVzIGRhdGEuCiAgICAgICAgdGhpcy5fc3RhY2tEYXRhID0gW107CiAgICAgICAgLy8gYXJyYXkgdGhhdCBob2xkcyB0aGUgZGF0YSB0byBiZSBwbG90dGVkLiBUaGlzIHdpbGwgYmUgdGhlIHNlcmllcyBkYXRhCiAgICAgICAgLy8gbWVyZ2VkIHdpdGggdGhlIHRoZSBhcHByb3ByaWF0ZSBkYXRhIGZyb20gX3N0YWNrRGF0YSBhY2NvcmRpbmcgdG8gdGhlIHN0YWNrQXhpcy4KICAgICAgICB0aGlzLl9wbG90RGF0YSA9IFtdOwogICAgICAgIHRoaXMuX3dpZHRoID0gbnVsbDsKICAgICAgICB0aGlzLl9oZWlnaHQgPSBudWxsOyAKICAgICAgICB0aGlzLl9wbG90RGltZW5zaW9ucyA9IHtoZWlnaHQ6bnVsbCwgd2lkdGg6bnVsbH07CiAgICAgICAgdGhpcy5fZ3JpZFBhZGRpbmcgPSB7dG9wOm51bGwsIHJpZ2h0Om51bGwsIGJvdHRvbTpudWxsLCBsZWZ0Om51bGx9OwogICAgICAgIHRoaXMuX2RlZmF1bHRHcmlkUGFkZGluZyA9IHt0b3A6MTAsIHJpZ2h0OjEwLCBib3R0b206MjMsIGxlZnQ6MTB9OwoKICAgICAgICB0aGlzLl9hZGREb21SZWZlcmVuY2UgPSAkLmpxcGxvdC5jb25maWcuYWRkRG9tUmVmZXJlbmNlOwoKICAgICAgICB0aGlzLnByZUluaXRIb29rcyA9IG5ldyAkLmpxcGxvdC5Ib29rc01hbmFnZXIoKTsKICAgICAgICB0aGlzLnBvc3RJbml0SG9va3MgPSBuZXcgJC5qcXBsb3QuSG9va3NNYW5hZ2VyKCk7CiAgICAgICAgdGhpcy5wcmVQYXJzZU9wdGlvbnNIb29rcyA9IG5ldyAkLmpxcGxvdC5Ib29rc01hbmFnZXIoKTsKICAgICAgICB0aGlzLnBvc3RQYXJzZU9wdGlvbnNIb29rcyA9IG5ldyAkLmpxcGxvdC5Ib29rc01hbmFnZXIoKTsKICAgICAgICB0aGlzLnByZURyYXdIb29rcyA9IG5ldyAkLmpxcGxvdC5Ib29rc01hbmFnZXIoKTsKICAgICAgICB0aGlzLnBvc3REcmF3SG9va3MgPSBuZXcgJC5qcXBsb3QuSG9va3NNYW5hZ2VyKCk7CiAgICAgICAgdGhpcy5wcmVEcmF3U2VyaWVzSG9va3MgPSBuZXcgJC5qcXBsb3QuSG9va3NNYW5hZ2VyKCk7CiAgICAgICAgdGhpcy5wb3N0RHJhd1Nlcmllc0hvb2tzID0gbmV3ICQuanFwbG90Lkhvb2tzTWFuYWdlcigpOwogICAgICAgIHRoaXMucHJlRHJhd0xlZ2VuZEhvb2tzID0gbmV3ICQuanFwbG90Lkhvb2tzTWFuYWdlcigpOwogICAgICAgIHRoaXMuYWRkTGVnZW5kUm93SG9va3MgPSBuZXcgJC5qcXBsb3QuSG9va3NNYW5hZ2VyKCk7CiAgICAgICAgdGhpcy5wcmVTZXJpZXNJbml0SG9va3MgPSBuZXcgJC5qcXBsb3QuSG9va3NNYW5hZ2VyKCk7CiAgICAgICAgdGhpcy5wb3N0U2VyaWVzSW5pdEhvb2tzID0gbmV3ICQuanFwbG90Lkhvb2tzTWFuYWdlcigpOwogICAgICAgIHRoaXMucHJlUGFyc2VTZXJpZXNPcHRpb25zSG9va3MgPSBuZXcgJC5qcXBsb3QuSG9va3NNYW5hZ2VyKCk7CiAgICAgICAgdGhpcy5wb3N0UGFyc2VTZXJpZXNPcHRpb25zSG9va3MgPSBuZXcgJC5qcXBsb3QuSG9va3NNYW5hZ2VyKCk7CiAgICAgICAgdGhpcy5ldmVudExpc3RlbmVySG9va3MgPSBuZXcgJC5qcXBsb3QuRXZlbnRMaXN0ZW5lck1hbmFnZXIoKTsKICAgICAgICB0aGlzLnByZURyYXdTZXJpZXNTaGFkb3dIb29rcyA9IG5ldyAkLmpxcGxvdC5Ib29rc01hbmFnZXIoKTsKICAgICAgICB0aGlzLnBvc3REcmF3U2VyaWVzU2hhZG93SG9va3MgPSBuZXcgJC5qcXBsb3QuSG9va3NNYW5hZ2VyKCk7CiAgICAgICAgCiAgICAgICAgdGhpcy5jb2xvckdlbmVyYXRvciA9IG5ldyAkLmpxcGxvdC5Db2xvckdlbmVyYXRvcigpOwogICAgICAgIHRoaXMubmVnYXRpdmVDb2xvckdlbmVyYXRvciA9IG5ldyAkLmpxcGxvdC5Db2xvckdlbmVyYXRvcigpOwoKICAgICAgICB0aGlzLmNhbnZhc01hbmFnZXIgPSBuZXcgJC5qcXBsb3QuQ2FudmFzTWFuYWdlcigpOwoKICAgICAgICB0aGlzLnRoZW1lRW5naW5lID0gbmV3ICQuanFwbG90LlRoZW1lRW5naW5lKCk7CiAgICAgICAgCiAgICAgICAgdmFyIHNlcmllc0NvbG9yc0luZGV4ID0gMDsKCiAgICAgICAgLy8gR3JvdXA6IG1ldGhvZHMKICAgICAgICAvLwogICAgICAgIC8vIG1ldGhvZDogaW5pdAogICAgICAgIC8vIHNldHMgdGhlIHBsb3QgdGFyZ2V0LCBjaGVja3MgZGF0YSBhbmQgYXBwbGllcyB1c2VyCiAgICAgICAgLy8gb3B0aW9ucyB0byBwbG90LgogICAgICAgIHRoaXMuaW5pdCA9IGZ1bmN0aW9uKHRhcmdldCwgZGF0YSwgb3B0aW9ucykgewogICAgICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKICAgICAgICAgICAgZm9yICh2YXIgaT0wOyBpPCQuanFwbG90LnByZUluaXRIb29rcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgJC5qcXBsb3QucHJlSW5pdEhvb2tzW2ldLmNhbGwodGhpcywgdGFyZ2V0LCBkYXRhLCBvcHRpb25zKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZm9yICh2YXIgaT0wOyBpPHRoaXMucHJlSW5pdEhvb2tzLmhvb2tzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICB0aGlzLnByZUluaXRIb29rcy5ob29rc1tpXS5jYWxsKHRoaXMsIHRhcmdldCwgZGF0YSwgb3B0aW9ucyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgICAgIHRoaXMudGFyZ2V0SWQgPSAnIycrdGFyZ2V0OwogICAgICAgICAgICB0aGlzLnRhcmdldCA9ICQoJyMnK3RhcmdldCk7CgogICAgICAgICAgICAvLy8vLy8KICAgICAgICAgICAgLy8gQWRkIGEgcmVmZXJlbmNlIHRvIHBsb3QKICAgICAgICAgICAgLy8vLy8vCiAgICAgICAgICAgIGlmICh0aGlzLl9hZGREb21SZWZlcmVuY2UpIHsKICAgICAgICAgICAgICAgIHRoaXMudGFyZ2V0LmRhdGEoJ2pxcGxvdF9wbG90JywgdGhpcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gcmVtb3ZlIGFueSBlcnJvciBjbGFzcyB0aGF0IG1heSBiZSBzdHVjayBvbiB0YXJnZXQuCiAgICAgICAgICAgIHRoaXMudGFyZ2V0LnJlbW92ZUNsYXNzKCdqcXBsb3QtZXJyb3InKTsKICAgICAgICAgICAgaWYgKCF0aGlzLnRhcmdldC5nZXQoMCkpIHsKICAgICAgICAgICAgICAgIHRocm93ICJObyBwbG90IHRhcmdldCBzcGVjaWZpZWQiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICAvLyBtYWtlIHN1cmUgdGhlIHRhcmdldCBpcyBwb3NpdGlvbmVkIGJ5IHNvbWUgbWVhbnMgYW5kIHNldCBjc3MKICAgICAgICAgICAgaWYgKHRoaXMudGFyZ2V0LmNzcygncG9zaXRpb24nKSA9PSAnc3RhdGljJykgewogICAgICAgICAgICAgICAgdGhpcy50YXJnZXQuY3NzKCdwb3NpdGlvbicsICdyZWxhdGl2ZScpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghdGhpcy50YXJnZXQuaGFzQ2xhc3MoJ2pxcGxvdC10YXJnZXQnKSkgewogICAgICAgICAgICAgICAgdGhpcy50YXJnZXQuYWRkQ2xhc3MoJ2pxcGxvdC10YXJnZXQnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgLy8gaWYgbm8gaGVpZ2h0IG9yIHdpZHRoIHNwZWNpZmllZCwgdXNlIGEgZGVmYXVsdC4KICAgICAgICAgICAgaWYgKCF0aGlzLnRhcmdldC5oZWlnaHQoKSkgewogICAgICAgICAgICAgICAgdmFyIGg7CiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLmhlaWdodCkgewogICAgICAgICAgICAgICAgICAgIGggPSBwYXJzZUludChvcHRpb25zLmhlaWdodCwgMTApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAodGhpcy50YXJnZXQuYXR0cignZGF0YS1oZWlnaHQnKSkgewogICAgICAgICAgICAgICAgICAgIGggPSBwYXJzZUludCh0aGlzLnRhcmdldC5hdHRyKCdkYXRhLWhlaWdodCcpLCAxMCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBoID0gcGFyc2VJbnQoJC5qcXBsb3QuY29uZmlnLmRlZmF1bHRIZWlnaHQsIDEwKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRoaXMuX2hlaWdodCA9IGg7CiAgICAgICAgICAgICAgICB0aGlzLnRhcmdldC5jc3MoJ2hlaWdodCcsIGgrJ3B4Jyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICB0aGlzLl9oZWlnaHQgPSBoID0gdGhpcy50YXJnZXQuaGVpZ2h0KCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCF0aGlzLnRhcmdldC53aWR0aCgpKSB7CiAgICAgICAgICAgICAgICB2YXIgdzsKICAgICAgICAgICAgICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMud2lkdGgpIHsKICAgICAgICAgICAgICAgICAgICB3ID0gcGFyc2VJbnQob3B0aW9ucy53aWR0aCwgMTApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAodGhpcy50YXJnZXQuYXR0cignZGF0YS13aWR0aCcpKSB7CiAgICAgICAgICAgICAgICAgICAgdyA9IHBhcnNlSW50KHRoaXMudGFyZ2V0LmF0dHIoJ2RhdGEtd2lkdGgnKSwgMTApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdyA9IHBhcnNlSW50KCQuanFwbG90LmNvbmZpZy5kZWZhdWx0V2lkdGgsIDEwKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRoaXMuX3dpZHRoID0gdzsKICAgICAgICAgICAgICAgIHRoaXMudGFyZ2V0LmNzcygnd2lkdGgnLCB3KydweCcpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgdGhpcy5fd2lkdGggPSB3ID0gdGhpcy50YXJnZXQud2lkdGgoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgdGhpcy5fcGxvdERpbWVuc2lvbnMuaGVpZ2h0ID0gdGhpcy5faGVpZ2h0OwogICAgICAgICAgICB0aGlzLl9wbG90RGltZW5zaW9ucy53aWR0aCA9IHRoaXMuX3dpZHRoOwogICAgICAgICAgICB0aGlzLmdyaWQuX3Bsb3REaW1lbnNpb25zID0gdGhpcy5fcGxvdERpbWVuc2lvbnM7CiAgICAgICAgICAgIHRoaXMudGl0bGUuX3Bsb3REaW1lbnNpb25zID0gdGhpcy5fcGxvdERpbWVuc2lvbnM7CiAgICAgICAgICAgIHRoaXMuYmFzZUNhbnZhcy5fcGxvdERpbWVuc2lvbnMgPSB0aGlzLl9wbG90RGltZW5zaW9uczsKICAgICAgICAgICAgdGhpcy5ldmVudENhbnZhcy5fcGxvdERpbWVuc2lvbnMgPSB0aGlzLl9wbG90RGltZW5zaW9uczsKICAgICAgICAgICAgdGhpcy5sZWdlbmQuX3Bsb3REaW1lbnNpb25zID0gdGhpcy5fcGxvdERpbWVuc2lvbnM7CiAgICAgICAgICAgIGlmICh0aGlzLl9oZWlnaHQgPD0wIHx8IHRoaXMuX3dpZHRoIDw9MCB8fCAhdGhpcy5faGVpZ2h0IHx8ICF0aGlzLl93aWR0aCkgewogICAgICAgICAgICAgICAgdGhyb3cgIkNhbnZhcyBkaW1lbnNpb24gbm90IHNldCI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgICAgIGlmIChvcHRpb25zLmRhdGFSZW5kZXJlciAmJiBqUXVlcnkuaXNGdW5jdGlvbihvcHRpb25zLmRhdGFSZW5kZXJlcikpIHsKICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmRhdGFSZW5kZXJlck9wdGlvbnMpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGFSZW5kZXJlck9wdGlvbnMgPSBvcHRpb25zLmRhdGFSZW5kZXJlck9wdGlvbnM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aGlzLmRhdGFSZW5kZXJlciA9IG9wdGlvbnMuZGF0YVJlbmRlcmVyOwogICAgICAgICAgICAgICAgZGF0YSA9IHRoaXMuZGF0YVJlbmRlcmVyKGRhdGEsIHRoaXMsIHRoaXMuZGF0YVJlbmRlcmVyT3B0aW9ucyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgICAgIGlmIChvcHRpb25zLm5vRGF0YUluZGljYXRvciAmJiBqUXVlcnkuaXNQbGFpbk9iamVjdChvcHRpb25zLm5vRGF0YUluZGljYXRvcikpIHsKICAgICAgICAgICAgICAgICQuZXh0ZW5kKHRydWUsIHRoaXMubm9EYXRhSW5kaWNhdG9yLCBvcHRpb25zLm5vRGF0YUluZGljYXRvcik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgICAgIGlmIChkYXRhID09IG51bGwgfHwgalF1ZXJ5LmlzQXJyYXkoZGF0YSkgPT0gZmFsc2UgfHwgZGF0YS5sZW5ndGggPT0gMCB8fCBqUXVlcnkuaXNBcnJheShkYXRhWzBdKSA9PSBmYWxzZSB8fCBkYXRhWzBdLmxlbmd0aCA9PSAwKSB7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGlmICh0aGlzLm5vRGF0YUluZGljYXRvci5zaG93ID09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3d7CiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICJEYXRhRXJyb3IiLAogICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAiTm8gZGF0YSB0byBwbG90LiIKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAvLyBoYXZlIHRvIGJlIGRlc2NydWN0aXZlIGhlcmUgaW4gb3JkZXIgZm9yIHBsb3QgdG8gbm90IHRyeSBhbmQgcmVuZGVyIHNlcmllcy4KICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIG1lYW5zIHRoYXQgJC5qcXBsb3QoKSB3aWxsIGhhdmUgdG8gYmUgY2FsbGVkIGFnYWluIHdoZW4gdGhlcmUgaXMgZGF0YS4KICAgICAgICAgICAgICAgICAgICAvL2RlbGV0ZSBvcHRpb25zLnNlcmllczsKICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBheCBpbiB0aGlzLm5vRGF0YUluZGljYXRvci5heGVzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHByb3AgaW4gdGhpcy5ub0RhdGFJbmRpY2F0b3IuYXhlc1theF0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXhlc1theF1bcHJvcF0gPSB0aGlzLm5vRGF0YUluZGljYXRvci5heGVzW2F4XVtwcm9wXTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICB0aGlzLnBvc3REcmF3SG9va3MuYWRkKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZWggPSB0aGlzLmV2ZW50Q2FudmFzLmdldEhlaWdodCgpOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZXcgPSB0aGlzLmV2ZW50Q2FudmFzLmdldFdpZHRoKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ZW1wID0gJCgnPGRpdiBjbGFzcz0ianFwbG90LW5vRGF0YS1jb250YWluZXIiIHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTsiPjwvZGl2PicpOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRhcmdldC5hcHBlbmQodGVtcCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAuaGVpZ2h0KGVoKTsKICAgICAgICAgICAgICAgICAgICAgICAgdGVtcC53aWR0aChldyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAuY3NzKCd0b3AnLCB0aGlzLmV2ZW50Q2FudmFzLl9vZmZzZXRzLnRvcCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAuY3NzKCdsZWZ0JywgdGhpcy5ldmVudENhbnZhcy5fb2Zmc2V0cy5sZWZ0KTsKICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ZW1wMiA9ICQoJzxkaXYgY2xhc3M9ImpxcGxvdC1ub0RhdGEtY29udGVudHMiIHN0eWxlPSJ0ZXh0LWFsaWduOmNlbnRlcjsgcG9zaXRpb246cmVsYXRpdmU7IG1hcmdpbi1sZWZ0OmF1dG87IG1hcmdpbi1yaWdodDphdXRvOyI+PC9kaXY+Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAuYXBwZW5kKHRlbXAyKTsKICAgICAgICAgICAgICAgICAgICAgICAgdGVtcDIuaHRtbCh0aGlzLm5vRGF0YUluZGljYXRvci5pbmRpY2F0b3IpOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGggPSB0ZW1wMi5oZWlnaHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHR3ID0gdGVtcDIud2lkdGgoKTsKICAgICAgICAgICAgICAgICAgICAgICAgdGVtcDIuaGVpZ2h0KHRoKTsKICAgICAgICAgICAgICAgICAgICAgICAgdGVtcDIud2lkdGgodHcpOwogICAgICAgICAgICAgICAgICAgICAgICB0ZW1wMi5jc3MoJ3RvcCcsIChlaCAtIHRoKS8yICsgJ3B4Jyk7CiAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICB0aGlzLmRhdGEgPSBkYXRhOwogICAgICAgICAgICAKICAgICAgICAgICAgdGhpcy5wYXJzZU9wdGlvbnMob3B0aW9ucyk7CiAgICAgICAgICAgIAogICAgICAgICAgICBpZiAodGhpcy50ZXh0Q29sb3IpIHsKICAgICAgICAgICAgICAgIHRoaXMudGFyZ2V0LmNzcygnY29sb3InLCB0aGlzLnRleHRDb2xvcik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRoaXMuZm9udEZhbWlseSkgewogICAgICAgICAgICAgICAgdGhpcy50YXJnZXQuY3NzKCdmb250LWZhbWlseScsIHRoaXMuZm9udEZhbWlseSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRoaXMuZm9udFNpemUpIHsKICAgICAgICAgICAgICAgIHRoaXMudGFyZ2V0LmNzcygnZm9udC1zaXplJywgdGhpcy5mb250U2l6ZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgICAgIHRoaXMudGl0bGUuaW5pdCgpOwogICAgICAgICAgICB0aGlzLmxlZ2VuZC5pbml0KCk7CiAgICAgICAgICAgIHRoaXMuX3N1bXkgPSAwOwogICAgICAgICAgICB0aGlzLl9zdW14ID0gMDsKICAgICAgICAgICAgZm9yICh2YXIgaT0wOyBpPHRoaXMuc2VyaWVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAvLyBzZXQgZGVmYXVsdCBzdGFja2luZyBvcmRlciBmb3Igc2VyaWVzIGNhbnZhc2VzCiAgICAgICAgICAgICAgICB0aGlzLnNlcmllc1N0YWNrLnB1c2goaSk7CiAgICAgICAgICAgICAgICB0aGlzLnByZXZpb3VzU2VyaWVzU3RhY2sucHVzaChpKTsKICAgICAgICAgICAgICAgIHRoaXMuc2VyaWVzW2ldLnNoYWRvd0NhbnZhcy5fcGxvdERpbWVuc2lvbnMgPSB0aGlzLl9wbG90RGltZW5zaW9uczsKICAgICAgICAgICAgICAgIHRoaXMuc2VyaWVzW2ldLmNhbnZhcy5fcGxvdERpbWVuc2lvbnMgPSB0aGlzLl9wbG90RGltZW5zaW9uczsKICAgICAgICAgICAgICAgIGZvciAodmFyIGo9MDsgajwkLmpxcGxvdC5wcmVTZXJpZXNJbml0SG9va3MubGVuZ3RoOyBqKyspIHsKICAgICAgICAgICAgICAgICAgICAkLmpxcGxvdC5wcmVTZXJpZXNJbml0SG9va3Nbal0uY2FsbCh0aGlzLnNlcmllc1tpXSwgdGFyZ2V0LCBkYXRhLCB0aGlzLm9wdGlvbnMuc2VyaWVzRGVmYXVsdHMsIHRoaXMub3B0aW9ucy5zZXJpZXNbaV0sIHRoaXMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZm9yICh2YXIgaj0wOyBqPHRoaXMucHJlU2VyaWVzSW5pdEhvb2tzLmhvb2tzLmxlbmd0aDsgaisrKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcmVTZXJpZXNJbml0SG9va3MuaG9va3Nbal0uY2FsbCh0aGlzLnNlcmllc1tpXSwgdGFyZ2V0LCBkYXRhLCB0aGlzLm9wdGlvbnMuc2VyaWVzRGVmYXVsdHMsIHRoaXMub3B0aW9ucy5zZXJpZXNbaV0sIHRoaXMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGhpcy5wb3B1bGF0ZVBsb3REYXRhKHRoaXMuc2VyaWVzW2ldLCBpKTsKICAgICAgICAgICAgICAgIHRoaXMuc2VyaWVzW2ldLl9wbG90RGltZW5zaW9ucyA9IHRoaXMuX3Bsb3REaW1lbnNpb25zOwogICAgICAgICAgICAgICAgdGhpcy5zZXJpZXNbaV0uaW5pdChpLCB0aGlzLmdyaWQuYm9yZGVyV2lkdGgsIHRoaXMpOwogICAgICAgICAgICAgICAgZm9yICh2YXIgaj0wOyBqPCQuanFwbG90LnBvc3RTZXJpZXNJbml0SG9va3MubGVuZ3RoOyBqKyspIHsKICAgICAgICAgICAgICAgICAgICAkLmpxcGxvdC5wb3N0U2VyaWVzSW5pdEhvb2tzW2pdLmNhbGwodGhpcy5zZXJpZXNbaV0sIHRhcmdldCwgZGF0YSwgdGhpcy5vcHRpb25zLnNlcmllc0RlZmF1bHRzLCB0aGlzLm9wdGlvbnMuc2VyaWVzW2ldLCB0aGlzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZvciAodmFyIGo9MDsgajx0aGlzLnBvc3RTZXJpZXNJbml0SG9va3MuaG9va3MubGVuZ3RoOyBqKyspIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLnBvc3RTZXJpZXNJbml0SG9va3MuaG9va3Nbal0uY2FsbCh0aGlzLnNlcmllc1tpXSwgdGFyZ2V0LCBkYXRhLCB0aGlzLm9wdGlvbnMuc2VyaWVzRGVmYXVsdHMsIHRoaXMub3B0aW9ucy5zZXJpZXNbaV0sIHRoaXMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGhpcy5fc3VteSArPSB0aGlzLnNlcmllc1tpXS5fc3VteTsKICAgICAgICAgICAgICAgIHRoaXMuX3N1bXggKz0gdGhpcy5zZXJpZXNbaV0uX3N1bXg7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBuYW1lOwogICAgICAgICAgICBmb3IgKHZhciBpPTA7IGk8MTI7IGkrKykgewogICAgICAgICAgICAgICAgbmFtZSA9IF9heGlzTmFtZXNbaV07CiAgICAgICAgICAgICAgICB0aGlzLmF4ZXNbbmFtZV0uX3Bsb3REaW1lbnNpb25zID0gdGhpcy5fcGxvdERpbWVuc2lvbnM7CiAgICAgICAgICAgICAgICB0aGlzLmF4ZXNbbmFtZV0uaW5pdCgpOwogICAgICAgICAgICAgICAgaWYgKHRoaXMuYXhlc1tuYW1lXS5ib3JkZXJDb2xvciA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUuY2hhckF0KDApICE9PSAneCcgJiYgdGhpcy5heGVzW25hbWVdLnVzZVNlcmllc0NvbG9yID09PSB0cnVlICYmIHRoaXMuYXhlc1tuYW1lXS5zaG93KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXhlc1tuYW1lXS5ib3JkZXJDb2xvciA9IHRoaXMuYXhlc1tuYW1lXS5fc2VyaWVzWzBdLmNvbG9yOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5heGVzW25hbWVdLmJvcmRlckNvbG9yID0gdGhpcy5ncmlkLmJvcmRlckNvbG9yOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgaWYgKHRoaXMuc29ydERhdGEpIHsKICAgICAgICAgICAgICAgIHNvcnREYXRhKHRoaXMuc2VyaWVzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLmdyaWQuaW5pdCgpOwogICAgICAgICAgICB0aGlzLmdyaWQuX2F4ZXMgPSB0aGlzLmF4ZXM7CiAgICAgICAgICAgIAogICAgICAgICAgICB0aGlzLmxlZ2VuZC5fc2VyaWVzID0gdGhpcy5zZXJpZXM7CgogICAgICAgICAgICBmb3IgKHZhciBpPTA7IGk8JC5qcXBsb3QucG9zdEluaXRIb29rcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgJC5qcXBsb3QucG9zdEluaXRIb29rc1tpXS5jYWxsKHRoaXMsIHRhcmdldCwgZGF0YSwgb3B0aW9ucyk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGZvciAodmFyIGk9MDsgaTx0aGlzLnBvc3RJbml0SG9va3MuaG9va3MubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIHRoaXMucG9zdEluaXRIb29rcy5ob29rc1tpXS5jYWxsKHRoaXMsIHRhcmdldCwgZGF0YSwgb3B0aW9ucyk7CiAgICAgICAgICAgIH0KICAgICAgICB9OyAgCiAgICAgICAgCiAgICAgICAgLy8gbWV0aG9kOiByZXNldEF4ZXNTY2FsZQogICAgICAgIC8vIFJlc2V0IHRoZSBzcGVjaWZpZWQgYXhlcyBtaW4sIG1heCwgbnVtYmVyVGlja3MgYW5kIHRpY2tJbnRlcnZhbCBwcm9wZXJ0aWVzIHRvIG51bGwKICAgICAgICAvLyBvciByZXNldCB0aGVzZSBwcm9wZXJ0aWVzIG9uIGFsbCBheGVzIGlmIG5vIGxpc3Qgb2YgYXhlcyBpcyBwcm92aWRlZC4KICAgICAgICAvLwogICAgICAgIC8vIFBhcmFtZXRlcnM6CiAgICAgICAgLy8gYXhlcyAtIEJvb2xlYW4gdG8gcmVzZXQgb3Igbm90IHJlc2V0IGFsbCBheGVzIG9yIGFuIGFycmF5IG9yIG9iamVjdCBvZiBheGlzIG5hbWVzIHRvIHJlc2V0LgogICAgICAgIHRoaXMucmVzZXRBeGVzU2NhbGUgPSBmdW5jdGlvbihheGVzLCBvcHRpb25zKSB7CiAgICAgICAgICAgIHZhciBvcHRzID0gb3B0aW9ucyB8fCB7fTsKICAgICAgICAgICAgdmFyIGF4ID0gYXhlcyB8fCB0aGlzLmF4ZXM7CiAgICAgICAgICAgIGlmIChheCA9PT0gdHJ1ZSkgewogICAgICAgICAgICAgICAgYXggPSB0aGlzLmF4ZXM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGpRdWVyeS5pc0FycmF5KGF4KSkgewogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBheC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgIHRoaXMuYXhlc1theFtpXV0ucmVzZXRTY2FsZShvcHRzW2F4W2ldXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mKGF4KSA9PT0gJ29iamVjdCcpIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIG5hbWUgaW4gYXgpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmF4ZXNbbmFtZV0ucmVzZXRTY2FsZShvcHRzW25hbWVdKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgLy8gbWV0aG9kOiByZUluaXRpYWxpemUKICAgICAgICAvLyByZWluaXRpYWxpemUgcGxvdCBmb3IgcmVwbG90dGluZy4KICAgICAgICAvLyBub3QgY2FsbGVkIGRpcmVjdGx5LgogICAgICAgIHRoaXMucmVJbml0aWFsaXplID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAvLyBQbG90IHNob3VsZCBiZSB2aXNpYmxlIGFuZCBoYXZlIGEgaGVpZ2h0IGFuZCB3aWR0aC4KICAgICAgICAgICAgLy8gSWYgcGxvdCBkb2Vzbid0IGhhdmUgaGVpZ2h0IGFuZCB3aWR0aCBmb3Igc29tZQogICAgICAgICAgICAvLyByZWFzb24sIHNldCBpdCBieSBvdGhlciBtZWFucy4gIFBsb3QgbXVzdCBub3QgaGF2ZQogICAgICAgICAgICAvLyBhIGRpc3BsYXk6bm9uZSBhdHRyaWJ1dGUsIGhvd2V2ZXIuCiAgICAgICAgICAgIAogICAgICAgICAgICB0aGlzLl9oZWlnaHQgPSB0aGlzLnRhcmdldC5oZWlnaHQoKTsKICAgICAgICAgICAgdGhpcy5fd2lkdGggPSB0aGlzLnRhcmdldC53aWR0aCgpOwogICAgICAgICAgICAKICAgICAgICAgICAgaWYgKHRoaXMuX2hlaWdodCA8PTAgfHwgdGhpcy5fd2lkdGggPD0wIHx8ICF0aGlzLl9oZWlnaHQgfHwgIXRoaXMuX3dpZHRoKSB7CiAgICAgICAgICAgICAgICB0aHJvdyAiVGFyZ2V0IGRpbWVuc2lvbiBub3Qgc2V0IjsKICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgdGhpcy5fcGxvdERpbWVuc2lvbnMuaGVpZ2h0ID0gdGhpcy5faGVpZ2h0OwogICAgICAgICAgICB0aGlzLl9wbG90RGltZW5zaW9ucy53aWR0aCA9IHRoaXMuX3dpZHRoOwogICAgICAgICAgICB0aGlzLmdyaWQuX3Bsb3REaW1lbnNpb25zID0gdGhpcy5fcGxvdERpbWVuc2lvbnM7CiAgICAgICAgICAgIHRoaXMudGl0bGUuX3Bsb3REaW1lbnNpb25zID0gdGhpcy5fcGxvdERpbWVuc2lvbnM7CiAgICAgICAgICAgIHRoaXMuYmFzZUNhbnZhcy5fcGxvdERpbWVuc2lvbnMgPSB0aGlzLl9wbG90RGltZW5zaW9uczsKICAgICAgICAgICAgdGhpcy5ldmVudENhbnZhcy5fcGxvdERpbWVuc2lvbnMgPSB0aGlzLl9wbG90RGltZW5zaW9uczsKICAgICAgICAgICAgdGhpcy5sZWdlbmQuX3Bsb3REaW1lbnNpb25zID0gdGhpcy5fcGxvdERpbWVuc2lvbnM7CiAgICAgICAgICAgIAogICAgICAgICAgICBmb3IgKHZhciBuIGluIHRoaXMuYXhlcykgewogICAgICAgICAgICAgICAgdGhpcy5heGVzW25dLl9wbG90V2lkdGggPSB0aGlzLl93aWR0aDsKICAgICAgICAgICAgICAgIHRoaXMuYXhlc1tuXS5fcGxvdEhlaWdodCA9IHRoaXMuX2hlaWdodDsKICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgdGhpcy50aXRsZS5fcGxvdFdpZHRoID0gdGhpcy5fd2lkdGg7CiAgICAgICAgICAgIAogICAgICAgICAgICBpZiAodGhpcy50ZXh0Q29sb3IpIHsKICAgICAgICAgICAgICAgIHRoaXMudGFyZ2V0LmNzcygnY29sb3InLCB0aGlzLnRleHRDb2xvcik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRoaXMuZm9udEZhbWlseSkgewogICAgICAgICAgICAgICAgdGhpcy50YXJnZXQuY3NzKCdmb250LWZhbWlseScsIHRoaXMuZm9udEZhbWlseSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRoaXMuZm9udFNpemUpIHsKICAgICAgICAgICAgICAgIHRoaXMudGFyZ2V0LmNzcygnZm9udC1zaXplJywgdGhpcy5mb250U2l6ZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgICAgIHRoaXMuX3N1bXkgPSAwOwogICAgICAgICAgICB0aGlzLl9zdW14ID0gMDsKICAgICAgICAgICAgZm9yICh2YXIgaT0wOyBpPHRoaXMuc2VyaWVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICB0aGlzLnBvcHVsYXRlUGxvdERhdGEodGhpcy5zZXJpZXNbaV0sIGkpOwogICAgICAgICAgICAgICAgaWYgKHRoaXMuc2VyaWVzW2ldLl90eXBlID09PSAnbGluZScgJiYgdGhpcy5zZXJpZXNbaV0ucmVuZGVyZXIuYmFuZHMuc2hvdykgewogICAgICAgICAgICAgICAgICAgIHRoaXMuc2VyaWVzW2ldLnJlbmRlcmVyLmluaXRCYW5kcy5jYWxsKHRoaXMuc2VyaWVzW2ldLCB0aGlzLnNlcmllc1tpXS5yZW5kZXJlci5vcHRpb25zLCB0aGlzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRoaXMuc2VyaWVzW2ldLl9wbG90RGltZW5zaW9ucyA9IHRoaXMuX3Bsb3REaW1lbnNpb25zOwogICAgICAgICAgICAgICAgdGhpcy5zZXJpZXNbaV0uY2FudmFzLl9wbG90RGltZW5zaW9ucyA9IHRoaXMuX3Bsb3REaW1lbnNpb25zOwogICAgICAgICAgICAgICAgLy90aGlzLnNlcmllc1tpXS5pbml0KGksIHRoaXMuZ3JpZC5ib3JkZXJXaWR0aCk7CiAgICAgICAgICAgICAgICB0aGlzLl9zdW15ICs9IHRoaXMuc2VyaWVzW2ldLl9zdW15OwogICAgICAgICAgICAgICAgdGhpcy5fc3VteCArPSB0aGlzLnNlcmllc1tpXS5fc3VteDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIG5hbWU7CiAgICAgICAgICAgIAogICAgICAgICAgICBmb3IgKHZhciBqPTA7IGo8MTI7IGorKykgewogICAgICAgICAgICAgICAgbmFtZSA9IF9heGlzTmFtZXNbal07CiAgICAgICAgICAgICAgICAvLyBNZW1vcnkgTGVha3MgcGF0Y2ggOiBjbGVhciB0aWNrcyBlbGVtZW50cwogICAgICAgICAgICAgICAgdmFyIHQgPSB0aGlzLmF4ZXNbbmFtZV0uX3RpY2tzOwogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgIHZhciBlbCA9IHRbaV0uX2VsZW07CiAgICAgICAgICAgICAgICAgIGlmIChlbCkgewogICAgICAgICAgICAgICAgICAgIC8vIGlmIGNhbnZhcyByZW5kZXJlcgogICAgICAgICAgICAgICAgICAgIGlmICgkLmpxcGxvdC51c2VfZXhjYW52YXMgJiYgd2luZG93Lkdfdm1sQ2FudmFzTWFuYWdlci51bmluaXRFbGVtZW50ICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5HX3ZtbENhbnZhc01hbmFnZXIudW5pbml0RWxlbWVudChlbC5nZXQoMCkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbC5lbXB0eUZvcmNlKCk7CiAgICAgICAgICAgICAgICAgICAgZWwgPSBudWxsOwogICAgICAgICAgICAgICAgICAgIHQuX2VsZW0gPSBudWxsOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0ID0gbnVsbDsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdGhpcy5heGVzW25hbWVdLl9wbG90RGltZW5zaW9ucyA9IHRoaXMuX3Bsb3REaW1lbnNpb25zOwogICAgICAgICAgICAgICAgdGhpcy5heGVzW25hbWVdLl90aWNrcyA9IFtdOwogICAgICAgICAgICAgICAgLy8gdGhpcy5heGVzW25hbWVdLnJlbmRlcmVyLmluaXQuY2FsbCh0aGlzLmF4ZXNbbmFtZV0sIHt9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgaWYgKHRoaXMuc29ydERhdGEpIHsKICAgICAgICAgICAgICAgIHNvcnREYXRhKHRoaXMuc2VyaWVzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgdGhpcy5ncmlkLl9heGVzID0gdGhpcy5heGVzOwogICAgICAgICAgICAKICAgICAgICAgICAgdGhpcy5sZWdlbmQuX3NlcmllcyA9IHRoaXMuc2VyaWVzOwogICAgICAgIH07CiAgICAgICAgCiAgICAgICAgLy8gc29ydCB0aGUgc2VyaWVzIGRhdGEgaW4gaW5jcmVhc2luZyBvcmRlci4KICAgICAgICBmdW5jdGlvbiBzb3J0RGF0YShzZXJpZXMpIHsKICAgICAgICAgICAgdmFyIGQsIHNkLCBwZCwgcHBkLCByZXQ7CiAgICAgICAgICAgIGZvciAodmFyIGk9MDsgaTxzZXJpZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIHZhciBjaGVjazsKICAgICAgICAgICAgICAgIHZhciBiYXQgPSBbc2VyaWVzW2ldLmRhdGEsIHNlcmllc1tpXS5fc3RhY2tEYXRhLCBzZXJpZXNbaV0uX3Bsb3REYXRhLCBzZXJpZXNbaV0uX3ByZXZQbG90RGF0YV07CiAgICAgICAgICAgICAgICBmb3IgKHZhciBuPTA7IG48NDsgbisrKSB7CiAgICAgICAgICAgICAgICAgICAgY2hlY2sgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIGQgPSBiYXRbbl07CiAgICAgICAgICAgICAgICAgICAgaWYgKHNlcmllc1tpXS5fc3RhY2tBeGlzID09ICd4JykgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGQubGVuZ3RoOyBqKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YoZFtqXVsxXSkgIT0gIm51bWJlciIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVjayA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGVjaykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZC5zb3J0KGZ1bmN0aW9uKGEsYikgeyByZXR1cm4gYVsxXSAtIGJbMV07IH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGQubGVuZ3RoOyBqKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YoZFtqXVswXSkgIT0gIm51bWJlciIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVjayA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGVjaykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZC5zb3J0KGZ1bmN0aW9uKGEsYikgeyByZXR1cm4gYVswXSAtIGJbMF07IH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAKICAgICAgICAvLyBwb3B1bGF0ZSB0aGUgX3N0YWNrRGF0YSBhbmQgX3Bsb3REYXRhIGFycmF5cyBmb3IgdGhlIHBsb3QgYW5kIHRoZSBzZXJpZXMuCiAgICAgICAgdGhpcy5wb3B1bGF0ZVBsb3REYXRhID0gZnVuY3Rpb24oc2VyaWVzLCBpbmRleCkgewogICAgICAgICAgICAvLyBpZiBhIHN0YWNrZWQgY2hhcnQsIGNvbXB1dGUgdGhlIHN0YWNrZWQgZGF0YQogICAgICAgICAgICB0aGlzLl9wbG90RGF0YSA9IFtdOwogICAgICAgICAgICB0aGlzLl9zdGFja0RhdGEgPSBbXTsKICAgICAgICAgICAgc2VyaWVzLl9zdGFja0RhdGEgPSBbXTsKICAgICAgICAgICAgc2VyaWVzLl9wbG90RGF0YSA9IFtdOwogICAgICAgICAgICB2YXIgcGxvdFZhbHVlcyA9IHt4OltdLCB5OltdfTsKICAgICAgICAgICAgaWYgKHRoaXMuc3RhY2tTZXJpZXMgJiYgIXNlcmllcy5kaXNhYmxlU3RhY2spIHsKICAgICAgICAgICAgICAgIHNlcmllcy5fc3RhY2sgPSB0cnVlOwogICAgICAgICAgICAgICAgdmFyIHNpZHggPSBzZXJpZXMuX3N0YWNrQXhpcyA9PSAneCcgPyAwIDogMTsKICAgICAgICAgICAgICAgIHZhciBpZHggPSBzaWR4ID8gMCA6IDE7CiAgICAgICAgICAgICAgICAvLyBwdXNoIHRoZSBjdXJyZW50IGRhdGEgaW50byBzdGFja0RhdGEKICAgICAgICAgICAgICAgIC8vdGhpcy5fc3RhY2tEYXRhLnB1c2godGhpcy5zZXJpZXNbaV0uZGF0YSk7CiAgICAgICAgICAgICAgICB2YXIgdGVtcCA9ICQuZXh0ZW5kKHRydWUsIFtdLCBzZXJpZXMuZGF0YSk7CiAgICAgICAgICAgICAgICAvLyBjcmVhdGUgdGhlIGRhdGEgdGhhdCB3aWxsIGJlIHBsb3R0ZWQgZm9yIHRoaXMgc2VyaWVzCiAgICAgICAgICAgICAgICB2YXIgcGxvdGRhdGEgPSAkLmV4dGVuZCh0cnVlLCBbXSwgc2VyaWVzLmRhdGEpOwogICAgICAgICAgICAgICAgLy8gZm9yIGZpcnN0IHNlcmllcywgbm90aGluZyB0byBhZGQgdG8gc3RhY2tEYXRhLgogICAgICAgICAgICAgICAgZm9yICh2YXIgaj0wOyBqPGluZGV4OyBqKyspIHsKICAgICAgICAgICAgICAgICAgICB2YXIgY2QgPSB0aGlzLnNlcmllc1tqXS5kYXRhOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGs9MDsgazxjZC5sZW5ndGg7IGsrKykgewogICAgICAgICAgICAgICAgICAgICAgICB0ZW1wW2tdWzBdICs9IGNkW2tdWzBdOwogICAgICAgICAgICAgICAgICAgICAgICB0ZW1wW2tdWzFdICs9IGNkW2tdWzFdOwogICAgICAgICAgICAgICAgICAgICAgICAvLyBvbmx5IG5lZWQgdG8gc3VtIHVwIHRoZSBzdGFjayBheGlzIGNvbHVtbiBvZiBkYXRhCiAgICAgICAgICAgICAgICAgICAgICAgIHBsb3RkYXRhW2tdW3NpZHhdICs9IGNkW2tdW3NpZHhdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZvciAodmFyIGk9MDsgaTxwbG90ZGF0YS5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgIHBsb3RWYWx1ZXMueC5wdXNoKHBsb3RkYXRhW2ldWzBdKTsKICAgICAgICAgICAgICAgICAgICBwbG90VmFsdWVzLnkucHVzaChwbG90ZGF0YVtpXVsxXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aGlzLl9wbG90RGF0YS5wdXNoKHBsb3RkYXRhKTsKICAgICAgICAgICAgICAgIHRoaXMuX3N0YWNrRGF0YS5wdXNoKHRlbXApOwogICAgICAgICAgICAgICAgc2VyaWVzLl9zdGFja0RhdGEgPSB0ZW1wOwogICAgICAgICAgICAgICAgc2VyaWVzLl9wbG90RGF0YSA9IHBsb3RkYXRhOwogICAgICAgICAgICAgICAgc2VyaWVzLl9wbG90VmFsdWVzID0gcGxvdFZhbHVlczsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIGk9MDsgaTxzZXJpZXMuZGF0YS5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgIHBsb3RWYWx1ZXMueC5wdXNoKHNlcmllcy5kYXRhW2ldWzBdKTsKICAgICAgICAgICAgICAgICAgICBwbG90VmFsdWVzLnkucHVzaChzZXJpZXMuZGF0YVtpXVsxXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aGlzLl9zdGFja0RhdGEucHVzaChzZXJpZXMuZGF0YSk7CiAgICAgICAgICAgICAgICB0aGlzLnNlcmllc1tpbmRleF0uX3N0YWNrRGF0YSA9IHNlcmllcy5kYXRhOwogICAgICAgICAgICAgICAgdGhpcy5fcGxvdERhdGEucHVzaChzZXJpZXMuZGF0YSk7CiAgICAgICAgICAgICAgICBzZXJpZXMuX3Bsb3REYXRhID0gc2VyaWVzLmRhdGE7CiAgICAgICAgICAgICAgICBzZXJpZXMuX3Bsb3RWYWx1ZXMgPSBwbG90VmFsdWVzOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChpbmRleD4wKSB7CiAgICAgICAgICAgICAgICBzZXJpZXMuX3ByZXZQbG90RGF0YSA9IHRoaXMuc2VyaWVzW2luZGV4LTFdLl9wbG90RGF0YTsKICAgICAgICAgICAgfQogICAgICAgICAgICBzZXJpZXMuX3N1bXkgPSAwOwogICAgICAgICAgICBzZXJpZXMuX3N1bXggPSAwOwogICAgICAgICAgICBmb3IgKGk9c2VyaWVzLmRhdGEubGVuZ3RoLTE7IGk+LTE7IGktLSkgewogICAgICAgICAgICAgICAgc2VyaWVzLl9zdW15ICs9IHNlcmllcy5kYXRhW2ldWzFdOwogICAgICAgICAgICAgICAgc2VyaWVzLl9zdW14ICs9IHNlcmllcy5kYXRhW2ldWzBdOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICAKICAgICAgICAvLyBmdW5jdGlvbiB0byBzYWZlbHkgcmV0dXJuIGNvbG9ycyBmcm9tIHRoZSBjb2xvciBhcnJheSBhbmQgd3JhcCBhcm91bmQgYXQgdGhlIGVuZC4KICAgICAgICB0aGlzLmdldE5leHRTZXJpZXNDb2xvciA9IChmdW5jdGlvbih0KSB7CiAgICAgICAgICAgIHZhciBpZHggPSAwOwogICAgICAgICAgICB2YXIgc2MgPSB0LnNlcmllc0NvbG9yczsKICAgICAgICAgICAgCiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7IAogICAgICAgICAgICAgICAgaWYgKGlkeCA8IHNjLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBzY1tpZHgrK107CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBpZHggPSAwOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBzY1tpZHgrK107CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgfSkodGhpcyk7CiAgICAKICAgICAgICB0aGlzLnBhcnNlT3B0aW9ucyA9IGZ1bmN0aW9uKG9wdGlvbnMpewogICAgICAgICAgICBmb3IgKHZhciBpPTA7IGk8dGhpcy5wcmVQYXJzZU9wdGlvbnNIb29rcy5ob29rcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgdGhpcy5wcmVQYXJzZU9wdGlvbnNIb29rcy5ob29rc1tpXS5jYWxsKHRoaXMsIG9wdGlvbnMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvciAodmFyIGk9MDsgaTwkLmpxcGxvdC5wcmVQYXJzZU9wdGlvbnNIb29rcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgJC5qcXBsb3QucHJlUGFyc2VPcHRpb25zSG9va3NbaV0uY2FsbCh0aGlzLCBvcHRpb25zKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLm9wdGlvbnMgPSAkLmV4dGVuZCh0cnVlLCB7fSwgdGhpcy5kZWZhdWx0cywgb3B0aW9ucyk7CiAgICAgICAgICAgIHZhciBvcHRzID0gdGhpcy5vcHRpb25zOwogICAgICAgICAgICB0aGlzLmFuaW1hdGUgPSBvcHRzLmFuaW1hdGU7CiAgICAgICAgICAgIHRoaXMuYW5pbWF0ZVJlcGxvdCA9IG9wdHMuYW5pbWF0ZVJlcGxvdDsKICAgICAgICAgICAgdGhpcy5zdGFja1NlcmllcyA9IG9wdHMuc3RhY2tTZXJpZXM7CiAgICAgICAgICAgIGlmICgkLmlzUGxhaW5PYmplY3Qob3B0cy5maWxsQmV0d2VlbikpIHsKCiAgICAgICAgICAgICAgICB2YXIgdGVtcCA9IFsnc2VyaWVzMScsICdzZXJpZXMyJywgJ2NvbG9yJywgJ2Jhc2VTZXJpZXMnLCAnZmlsbCddLCAKICAgICAgICAgICAgICAgICAgICB0ZW1waTsKCiAgICAgICAgICAgICAgICBmb3IgKHZhciBpPTAsIGw9dGVtcC5sZW5ndGg7IGk8bDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgdGVtcGkgPSB0ZW1wW2ldOwogICAgICAgICAgICAgICAgICAgIGlmIChvcHRzLmZpbGxCZXR3ZWVuW3RlbXBpXSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmlsbEJldHdlZW5bdGVtcGldID0gb3B0cy5maWxsQmV0d2Vlblt0ZW1waV07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAob3B0cy5zZXJpZXNDb2xvcnMpIHsKICAgICAgICAgICAgICAgIHRoaXMuc2VyaWVzQ29sb3JzID0gb3B0cy5zZXJpZXNDb2xvcnM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKG9wdHMubmVnYXRpdmVTZXJpZXNDb2xvcnMpIHsKICAgICAgICAgICAgICAgIHRoaXMubmVnYXRpdmVTZXJpZXNDb2xvcnMgPSBvcHRzLm5lZ2F0aXZlU2VyaWVzQ29sb3JzOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChvcHRzLmNhcHR1cmVSaWdodENsaWNrKSB7CiAgICAgICAgICAgICAgICB0aGlzLmNhcHR1cmVSaWdodENsaWNrID0gb3B0cy5jYXB0dXJlUmlnaHRDbGljazsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLmRlZmF1bHRBeGlzU3RhcnQgPSAob3B0aW9ucyAmJiBvcHRpb25zLmRlZmF1bHRBeGlzU3RhcnQgIT0gbnVsbCkgPyBvcHRpb25zLmRlZmF1bHRBeGlzU3RhcnQgOiB0aGlzLmRlZmF1bHRBeGlzU3RhcnQ7CiAgICAgICAgICAgIHRoaXMuY29sb3JHZW5lcmF0b3Iuc2V0Q29sb3JzKHRoaXMuc2VyaWVzQ29sb3JzKTsKICAgICAgICAgICAgdGhpcy5uZWdhdGl2ZUNvbG9yR2VuZXJhdG9yLnNldENvbG9ycyh0aGlzLm5lZ2F0aXZlU2VyaWVzQ29sb3JzKTsKICAgICAgICAgICAgLy8gdmFyIGNnID0gbmV3IHRoaXMuY29sb3JHZW5lcmF0b3IodGhpcy5zZXJpZXNDb2xvcnMpOwogICAgICAgICAgICAvLyB2YXIgbmNnID0gbmV3IHRoaXMuY29sb3JHZW5lcmF0b3IodGhpcy5uZWdhdGl2ZVNlcmllc0NvbG9ycyk7CiAgICAgICAgICAgIC8vIHRoaXMuX2dyaWRQYWRkaW5nID0gdGhpcy5vcHRpb25zLmdyaWRQYWRkaW5nOwogICAgICAgICAgICAkLmV4dGVuZCh0cnVlLCB0aGlzLl9ncmlkUGFkZGluZywgb3B0cy5ncmlkUGFkZGluZyk7CiAgICAgICAgICAgIHRoaXMuc29ydERhdGEgPSAob3B0cy5zb3J0RGF0YSAhPSBudWxsKSA/IG9wdHMuc29ydERhdGEgOiB0aGlzLnNvcnREYXRhOwogICAgICAgICAgICBmb3IgKHZhciBpPTA7IGk8MTI7IGkrKykgewogICAgICAgICAgICAgICAgdmFyIG4gPSBfYXhpc05hbWVzW2ldOwogICAgICAgICAgICAgICAgdmFyIGF4aXMgPSB0aGlzLmF4ZXNbbl07CiAgICAgICAgICAgICAgICBheGlzLl9vcHRpb25zID0gJC5leHRlbmQodHJ1ZSwge30sIG9wdHMuYXhlc0RlZmF1bHRzLCBvcHRzLmF4ZXNbbl0pOwogICAgICAgICAgICAgICAgJC5leHRlbmQodHJ1ZSwgYXhpcywgb3B0cy5heGVzRGVmYXVsdHMsIG9wdHMuYXhlc1tuXSk7CiAgICAgICAgICAgICAgICBheGlzLl9wbG90V2lkdGggPSB0aGlzLl93aWR0aDsKICAgICAgICAgICAgICAgIGF4aXMuX3Bsb3RIZWlnaHQgPSB0aGlzLl9oZWlnaHQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gaWYgKHRoaXMuZGF0YS5sZW5ndGggPT0gMCkgewogICAgICAgICAgICAvLyAgICAgdGhpcy5kYXRhID0gW107CiAgICAgICAgICAgIC8vICAgICBmb3IgKHZhciBpPTA7IGk8dGhpcy5vcHRpb25zLnNlcmllcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAvLyAgICAgICAgIHRoaXMuZGF0YS5wdXNoKHRoaXMub3B0aW9ucy5zZXJpZXMuZGF0YSk7CiAgICAgICAgICAgIC8vICAgICB9ICAgIAogICAgICAgICAgICAvLyB9CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgdmFyIG5vcm1hbGl6ZURhdGEgPSBmdW5jdGlvbihkYXRhLCBkaXIsIHN0YXJ0KSB7CiAgICAgICAgICAgICAgICAvLyByZXR1cm4gZGF0YSBhcyBhbiBhcnJheSBvZiBwb2ludCBhcnJheXMsCiAgICAgICAgICAgICAgICAvLyBpbiBmb3JtIFtbeDEseTEuLi5dLCBbeDIseTIuLi5dLCAuLi5dCiAgICAgICAgICAgICAgICB2YXIgdGVtcCA9IFtdOwogICAgICAgICAgICAgICAgdmFyIGk7CiAgICAgICAgICAgICAgICBkaXIgPSBkaXIgfHwgJ3ZlcnRpY2FsJzsKICAgICAgICAgICAgICAgIGlmICghalF1ZXJ5LmlzQXJyYXkoZGF0YVswXSkpIHsKICAgICAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIGEgc2VyaWVzIG9mIHNjYWxhcnMuICBPbmUgbGluZSB3aXRoIGp1c3QgeSB2YWx1ZXMuCiAgICAgICAgICAgICAgICAgICAgLy8gdHVybiB0aGUgc2NhbGFyIGxpc3Qgb2YgZGF0YSBpbnRvIGEgZGF0YSBhcnJheSBvZiBmb3JtOgogICAgICAgICAgICAgICAgICAgIC8vIFtbMSwgZGF0YVswXV0sIFsyLCBkYXRhWzFdXSwgLi4uXQogICAgICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpPGRhdGEubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpciA9PSAndmVydGljYWwnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wLnB1c2goW3N0YXJ0ICsgaSwgZGF0YVtpXV0pOyAgIAogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcC5wdXNoKFtkYXRhW2ldLCBzdGFydCtpXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIGEgcHJvcGVybHkgZm9ybWF0dGVkIGRhdGEgc2VyaWVzLCBjb3B5IGl0LgogICAgICAgICAgICAgICAgICAgICQuZXh0ZW5kKHRydWUsIHRlbXAsIGRhdGEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIHRlbXA7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICB2YXIgY29sb3JJbmRleCA9IDA7CiAgICAgICAgICAgIGZvciAodmFyIGk9MDsgaTx0aGlzLmRhdGEubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIHZhciB0ZW1wID0gbmV3IFNlcmllcygpOwogICAgICAgICAgICAgICAgZm9yICh2YXIgaj0wOyBqPCQuanFwbG90LnByZVBhcnNlU2VyaWVzT3B0aW9uc0hvb2tzLmxlbmd0aDsgaisrKSB7CiAgICAgICAgICAgICAgICAgICAgJC5qcXBsb3QucHJlUGFyc2VTZXJpZXNPcHRpb25zSG9va3Nbal0uY2FsbCh0ZW1wLCB0aGlzLm9wdGlvbnMuc2VyaWVzRGVmYXVsdHMsIHRoaXMub3B0aW9ucy5zZXJpZXNbaV0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZm9yICh2YXIgaj0wOyBqPHRoaXMucHJlUGFyc2VTZXJpZXNPcHRpb25zSG9va3MuaG9va3MubGVuZ3RoOyBqKyspIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLnByZVBhcnNlU2VyaWVzT3B0aW9uc0hvb2tzLmhvb2tzW2pdLmNhbGwodGVtcCwgdGhpcy5vcHRpb25zLnNlcmllc0RlZmF1bHRzLCB0aGlzLm9wdGlvbnMuc2VyaWVzW2ldKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICQuZXh0ZW5kKHRydWUsIHRlbXAsIHtzZXJpZXNDb2xvcnM6dGhpcy5zZXJpZXNDb2xvcnMsIG5lZ2F0aXZlU2VyaWVzQ29sb3JzOnRoaXMubmVnYXRpdmVTZXJpZXNDb2xvcnN9LCB0aGlzLm9wdGlvbnMuc2VyaWVzRGVmYXVsdHMsIHRoaXMub3B0aW9ucy5zZXJpZXNbaV0sIHtyZW5kZXJlck9wdGlvbnM6e2FuaW1hdGlvbjp7c2hvdzogdGhpcy5hbmltYXRlfX19KTsKICAgICAgICAgICAgICAgIHZhciBkaXIgPSAndmVydGljYWwnOwogICAgICAgICAgICAgICAgaWYgKHRlbXAucmVuZGVyZXIgPT09ICQuanFwbG90LkJhclJlbmRlcmVyICYmIHRlbXAucmVuZGVyZXJPcHRpb25zICYmIHRlbXAucmVuZGVyZXJPcHRpb25zLmJhckRpcmVjdGlvbiA9PSAnaG9yaXpvbnRhbCcgJiYgdGVtcC50cmFuc3Bvc2VEYXRhID09PSB0cnVlKSB7CiAgICAgICAgICAgICAgICAgICAgZGlyID0gJ2hvcml6b250YWwnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGVtcC5kYXRhID0gbm9ybWFsaXplRGF0YSh0aGlzLmRhdGFbaV0sIGRpciwgdGhpcy5kZWZhdWx0QXhpc1N0YXJ0KTsKICAgICAgICAgICAgICAgIHN3aXRjaCAodGVtcC54YXhpcykgewogICAgICAgICAgICAgICAgICAgIGNhc2UgJ3hheGlzJzoKICAgICAgICAgICAgICAgICAgICAgICAgdGVtcC5feGF4aXMgPSB0aGlzLmF4ZXMueGF4aXM7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgJ3gyYXhpcyc6CiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAuX3hheGlzID0gdGhpcy5heGVzLngyYXhpczsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0ZW1wLl95YXhpcyA9IHRoaXMuYXhlc1t0ZW1wLnlheGlzXTsKICAgICAgICAgICAgICAgIHRlbXAuX3hheGlzLl9zZXJpZXMucHVzaCh0ZW1wKTsKICAgICAgICAgICAgICAgIHRlbXAuX3lheGlzLl9zZXJpZXMucHVzaCh0ZW1wKTsKICAgICAgICAgICAgICAgIGlmICh0ZW1wLnNob3cpIHsKICAgICAgICAgICAgICAgICAgICB0ZW1wLl94YXhpcy5zaG93ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB0ZW1wLl95YXhpcy5zaG93ID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyAvLyBwYXJzZSB0aGUgcmVuZGVyZXIgb3B0aW9ucyBhbmQgYXBwbHkgZGVmYXVsdCBjb2xvcnMgaWYgbm90IHByb3ZpZGVkCiAgICAgICAgICAgICAgICAvLyBpZiAoIXRlbXAuY29sb3IgJiYgdGVtcC5zaG93ICE9IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAvLyAgICAgdGVtcC5jb2xvciA9IGNnLm5leHQoKTsKICAgICAgICAgICAgICAgIC8vICAgICBjb2xvckluZGV4ID0gY2cuZ2V0SW5kZXgoKSAtIDE7OwogICAgICAgICAgICAgICAgLy8gfQogICAgICAgICAgICAgICAgLy8gaWYgKCF0ZW1wLm5lZ2F0aXZlQ29sb3IgJiYgdGVtcC5zaG93ICE9IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAvLyAgICAgdGVtcC5uZWdhdGl2ZUNvbG9yID0gbmNnLmdldChjb2xvckluZGV4KTsKICAgICAgICAgICAgICAgIC8vICAgICBuY2cuc2V0SW5kZXgoY29sb3JJbmRleCk7CiAgICAgICAgICAgICAgICAvLyB9CiAgICAgICAgICAgICAgICBpZiAoIXRlbXAubGFiZWwpIHsKICAgICAgICAgICAgICAgICAgICB0ZW1wLmxhYmVsID0gJ1NlcmllcyAnKyAoaSsxKS50b1N0cmluZygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gdGVtcC5yZW5kZXJlck9wdGlvbnMuc2hvdyA9IHRlbXAuc2hvdzsKICAgICAgICAgICAgICAgIC8vICQuZXh0ZW5kKHRydWUsIHRlbXAucmVuZGVyZXIsIHtjb2xvcjp0aGlzLnNlcmllc0NvbG9yc1tpXX0sIHRoaXMucmVuZGVyZXJPcHRpb25zKTsKICAgICAgICAgICAgICAgIHRoaXMuc2VyaWVzLnB1c2godGVtcCk7ICAKICAgICAgICAgICAgICAgIGZvciAodmFyIGo9MDsgajwkLmpxcGxvdC5wb3N0UGFyc2VTZXJpZXNPcHRpb25zSG9va3MubGVuZ3RoOyBqKyspIHsKICAgICAgICAgICAgICAgICAgICAkLmpxcGxvdC5wb3N0UGFyc2VTZXJpZXNPcHRpb25zSG9va3Nbal0uY2FsbCh0aGlzLnNlcmllc1tpXSwgdGhpcy5vcHRpb25zLnNlcmllc0RlZmF1bHRzLCB0aGlzLm9wdGlvbnMuc2VyaWVzW2ldKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZvciAodmFyIGo9MDsgajx0aGlzLnBvc3RQYXJzZVNlcmllc09wdGlvbnNIb29rcy5ob29rcy5sZW5ndGg7IGorKykgewogICAgICAgICAgICAgICAgICAgIHRoaXMucG9zdFBhcnNlU2VyaWVzT3B0aW9uc0hvb2tzLmhvb2tzW2pdLmNhbGwodGhpcy5zZXJpZXNbaV0sIHRoaXMub3B0aW9ucy5zZXJpZXNEZWZhdWx0cywgdGhpcy5vcHRpb25zLnNlcmllc1tpXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgICAgIC8vIGNvcHkgdGhlIGdyaWQgYW5kIHRpdGxlIG9wdGlvbnMgaW50byB0aGlzIG9iamVjdC4KICAgICAgICAgICAgJC5leHRlbmQodHJ1ZSwgdGhpcy5ncmlkLCB0aGlzLm9wdGlvbnMuZ3JpZCk7CiAgICAgICAgICAgIC8vIGlmIGF4aXMgYm9yZGVyIHByb3BlcnRpZXMgYXJlbid0IHNldCwgc2V0IGRlZmF1bHQuCiAgICAgICAgICAgIGZvciAodmFyIGk9MDsgaTwxMjsgaSsrKSB7CiAgICAgICAgICAgICAgICB2YXIgbiA9IF9heGlzTmFtZXNbaV07CiAgICAgICAgICAgICAgICB2YXIgYXhpcyA9IHRoaXMuYXhlc1tuXTsKICAgICAgICAgICAgICAgIGlmIChheGlzLmJvcmRlcldpZHRoID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICBheGlzLmJvcmRlcldpZHRoID10aGlzLmdyaWQuYm9yZGVyV2lkdGg7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5vcHRpb25zLnRpdGxlID09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgICAgICB0aGlzLnRpdGxlLnRleHQgPSB0aGlzLm9wdGlvbnMudGl0bGU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIHRoaXMub3B0aW9ucy50aXRsZSA9PSAnb2JqZWN0JykgewogICAgICAgICAgICAgICAgJC5leHRlbmQodHJ1ZSwgdGhpcy50aXRsZSwgdGhpcy5vcHRpb25zLnRpdGxlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLnRpdGxlLl9wbG90V2lkdGggPSB0aGlzLl93aWR0aDsKICAgICAgICAgICAgdGhpcy5sZWdlbmQuc2V0T3B0aW9ucyh0aGlzLm9wdGlvbnMubGVnZW5kKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIGZvciAodmFyIGk9MDsgaTwkLmpxcGxvdC5wb3N0UGFyc2VPcHRpb25zSG9va3MubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICQuanFwbG90LnBvc3RQYXJzZU9wdGlvbnNIb29rc1tpXS5jYWxsKHRoaXMsIG9wdGlvbnMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvciAodmFyIGk9MDsgaTx0aGlzLnBvc3RQYXJzZU9wdGlvbnNIb29rcy5ob29rcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgdGhpcy5wb3N0UGFyc2VPcHRpb25zSG9va3MuaG9va3NbaV0uY2FsbCh0aGlzLCBvcHRpb25zKTsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgCiAgICAgICAgLy8gbWV0aG9kOiBkZXN0cm95CiAgICAgICAgLy8gUmVsZWFzZXMgYWxsIHJlc291cmNlcyBvY2N1cGllZCBieSB0aGUgcGxvdAogICAgICAgIHRoaXMuZGVzdHJveSA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB0aGlzLmNhbnZhc01hbmFnZXIuZnJlZUFsbENhbnZhc2VzKCk7CiAgICAgICAgICAgIGlmICh0aGlzLmV2ZW50Q2FudmFzICYmIHRoaXMuZXZlbnRDYW52YXMuX2VsZW0pIHsKICAgICAgICAgICAgICAgIHRoaXMuZXZlbnRDYW52YXMuX2VsZW0udW5iaW5kKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gQ291cGxlIG9mIHBvc3RzIG9uIFN0YWNrIE92ZXJmbG93IGluZGljYXRlIHRoYXQgZW1wdHkoKSBkb2Vzbid0CiAgICAgICAgICAgIC8vIGFsd2F5cyBjZWFyIHVwIHRoZSBkb20gYW5kIHJlbGVhc2UgbWVtb3J5LiAgU29tZXRpbWVzIHNldHRpbmcKICAgICAgICAgICAgLy8gaW5uZXJIVE1MIHByb3BlcnR5IHRvIG51bGwgaXMgbmVlZGVkLiAgUGFydGljdWxhcmx5IG9uIElFLCBtYXkgCiAgICAgICAgICAgIC8vIGhhdmUgdG8gZGlyZWN0bHkgc2V0IGl0IHRvIG51bGwsIGJ5cGFzc2luZyBqUXVlcnkuCiAgICAgICAgICAgIHRoaXMudGFyZ2V0LmVtcHR5KCk7CgogICAgICAgICAgICB0aGlzLnRhcmdldFswXS5pbm5lckhUTUwgPSAnJzsKICAgICAgICB9OwogICAgICAgIAogICAgICAgIC8vIG1ldGhvZDogcmVwbG90CiAgICAgICAgLy8gRG9lcyBhIHJlaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBsb3QgZm9sbG93ZWQgYnkKICAgICAgICAvLyBhIHJlZHJhdy4gIE1ldGhvZCBjb3VsZCBiZSB1c2VkIHRvIGludGVyYWN0aXZlbHkKICAgICAgICAvLyBjaGFuZ2UgcGxvdCBjaGFyYWN0ZXJpc3RpY3MgYW5kIHRoZW4gcmVwbG90LgogICAgICAgIC8vCiAgICAgICAgLy8gUGFyYW1ldGVyczoKICAgICAgICAvLyBvcHRpb25zIC0gT3B0aW9ucyB1c2VkIGZvciByZXBsb3R0aW5nLgogICAgICAgIC8vCiAgICAgICAgLy8gUHJvcGVydGllczoKICAgICAgICAvLyBjbGVhciAtIGZhbHNlIHRvIG5vdCBjbGVhciAoZW1wdHkpIHRoZSBwbG90IGNvbnRhaW5lciBiZWZvcmUgcmVwbG90dGluZyAoZGVmYXVsdDogdHJ1ZSkuCiAgICAgICAgLy8gcmVzZXRBeGVzIC0gdHJ1ZSB0byByZXNldCBhbGwgYXhlcyBtaW4sIG1heCwgbnVtYmVyVGlja3MgYW5kIHRpY2tJbnRlcnZhbCBzZXR0aW5nIHNvIGF4ZXMgd2lsbCByZXNjYWxlIHRoZW1zZWx2ZXMuCiAgICAgICAgLy8gICAgICAgICAgICAgb3B0aW9uYWxseSBwYXNzIGluIGxpc3Qgb2YgYXhlcyB0byByZXNldCAoZS5nLiBbJ3hheGlzJywgJ3kyYXhpcyddKSAoZGVmYXVsdDogZmFsc2UpLgogICAgICAgIHRoaXMucmVwbG90ID0gZnVuY3Rpb24ob3B0aW9ucykgewogICAgICAgICAgICB2YXIgb3B0cyA9ICBvcHRpb25zIHx8IHt9OwogICAgICAgICAgICB2YXIgY2xlYXIgPSAob3B0cy5jbGVhciA9PT0gZmFsc2UpID8gZmFsc2UgOiB0cnVlOwogICAgICAgICAgICB2YXIgcmVzZXRBeGVzID0gb3B0cy5yZXNldEF4ZXMgfHwgZmFsc2U7CiAgICAgICAgICAgIHRoaXMudGFyZ2V0LnRyaWdnZXIoJ2pxcGxvdFByZVJlcGxvdCcpOwogICAgICAgICAgICAKICAgICAgICAgICAgaWYgKGNsZWFyKSB7CiAgICAgICAgICAgICAgICB0aGlzLmRlc3Ryb3koKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLnJlSW5pdGlhbGl6ZSgpOwogICAgICAgICAgICBpZiAocmVzZXRBeGVzKSB7CiAgICAgICAgICAgICAgICB0aGlzLnJlc2V0QXhlc1NjYWxlKHJlc2V0QXhlcywgb3B0cy5heGVzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLmRyYXcoKTsKICAgICAgICAgICAgdGhpcy50YXJnZXQudHJpZ2dlcignanFwbG90UG9zdFJlcGxvdCcpOwogICAgICAgIH07CiAgICAgICAgCiAgICAgICAgLy8gbWV0aG9kOiByZWRyYXcKICAgICAgICAvLyBFbXB0aWVzIHRoZSBwbG90IHRhcmdldCBkaXYgYW5kIHJlZHJhd3MgdGhlIHBsb3QuCiAgICAgICAgLy8gVGhpcyBlbmFibGVzIHBsb3QgZGF0YSBhbmQgcHJvcGVydGllcyB0byBiZSBjaGFuZ2VkCiAgICAgICAgLy8gYW5kIHRoZW4gdG8gY29tbGV0ZWx5IGNsZWFyIHRoZSBwbG90IGFuZCByZWRyYXcuCiAgICAgICAgLy8gcmVkcmF3ICp3aWxsIG5vdCogcmVpbml0aWFsaXplIGFueSBwbG90IGVsZW1lbnRzLgogICAgICAgIC8vIFRoYXQgaXMsIGF4ZXMgd2lsbCBub3QgYmUgYXV0b3NjYWxlZCBhbmQgZGVmYXVsdHMKICAgICAgICAvLyB3aWxsIG5vdCBiZSByZWFwcGxpZWQgdG8gYW55IHBsb3QgZWxlbWVudHMuICByZWRyYXcKICAgICAgICAvLyBpcyB1c2VkIHByaW1hcmlseSB3aXRoIHpvb21pbmcuIAogICAgICAgIC8vCiAgICAgICAgLy8gUGFyYW1ldGVyczoKICAgICAgICAvLyBjbGVhciAtIGZhbHNlIHRvIG5vdCBjbGVhciAoZW1wdHkpIHRoZSBwbG90IGNvbnRhaW5lciBiZWZvcmUgcmVkcmF3aW5nIChkZWZhdWx0OiB0cnVlKS4KICAgICAgICB0aGlzLnJlZHJhdyA9IGZ1bmN0aW9uKGNsZWFyKSB7CiAgICAgICAgICAgIGNsZWFyID0gKGNsZWFyICE9IG51bGwpID8gY2xlYXIgOiB0cnVlOwogICAgICAgICAgICB0aGlzLnRhcmdldC50cmlnZ2VyKCdqcXBsb3RQcmVSZWRyYXcnKTsKICAgICAgICAgICAgaWYgKGNsZWFyKSB7CiAgICAgICAgICAgICAgICB0aGlzLmNhbnZhc01hbmFnZXIuZnJlZUFsbENhbnZhc2VzKCk7CiAgICAgICAgICAgICAgICB0aGlzLmV2ZW50Q2FudmFzLl9lbGVtLnVuYmluZCgpOwogICAgICAgICAgICAgICAgLy8gRG9udCB0aGluayBJIGJpbmQgYW55IGV2ZW50cyB0byB0aGUgdGFyZ2V0LCB0aGlzIHNob3VsZG4ndCBiZSBuZWNlc3NhcnkuCiAgICAgICAgICAgICAgICAvLyBJdCB3aWxsIHJlbW92ZSB1c2VyJ3MgZXZlbnRzLgogICAgICAgICAgICAgICAgLy8gdGhpcy50YXJnZXQudW5iaW5kKCk7CiAgICAgICAgICAgICAgICB0aGlzLnRhcmdldC5lbXB0eSgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgICBmb3IgKHZhciBheCBpbiB0aGlzLmF4ZXMpIHsKICAgICAgICAgICAgICAgIHRoaXMuYXhlc1theF0uX3RpY2tzID0gW107CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yICh2YXIgaT0wOyBpPHRoaXMuc2VyaWVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICB0aGlzLnBvcHVsYXRlUGxvdERhdGEodGhpcy5zZXJpZXNbaV0sIGkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX3N1bXkgPSAwOwogICAgICAgICAgICB0aGlzLl9zdW14ID0gMDsKICAgICAgICAgICAgZm9yIChpPTA7IGk8dGhpcy5zZXJpZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIHRoaXMuX3N1bXkgKz0gdGhpcy5zZXJpZXNbaV0uX3N1bXk7CiAgICAgICAgICAgICAgICB0aGlzLl9zdW14ICs9IHRoaXMuc2VyaWVzW2ldLl9zdW14OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuZHJhdygpOwogICAgICAgICAgICB0aGlzLnRhcmdldC50cmlnZ2VyKCdqcXBsb3RQb3N0UmVkcmF3Jyk7CiAgICAgICAgfTsKICAgICAgICAKICAgICAgICAvLyBtZXRob2Q6IGRyYXcKICAgICAgICAvLyBEcmF3cyBhbGwgZWxlbWVudHMgb2YgdGhlIHBsb3QgaW50byB0aGUgY29udGFpbmVyLgogICAgICAgIC8vIERvZXMgbm90IGNsZWFyIHRoZSBjb250YWluZXIgYmVmb3JlIGRyYXdpbmcuCiAgICAgICAgdGhpcy5kcmF3ID0gZnVuY3Rpb24oKXsKICAgICAgICAgICAgaWYgKHRoaXMuZHJhd0lmSGlkZGVuIHx8IHRoaXMudGFyZ2V0LmlzKCc6dmlzaWJsZScpKSB7CiAgICAgICAgICAgICAgICB0aGlzLnRhcmdldC50cmlnZ2VyKCdqcXBsb3RQcmVEcmF3Jyk7CiAgICAgICAgICAgICAgICB2YXIgaSwKICAgICAgICAgICAgICAgICAgICBqLAogICAgICAgICAgICAgICAgICAgIGwsCiAgICAgICAgICAgICAgICAgICAgdGVtcHNlcmllczsKICAgICAgICAgICAgICAgIGZvciAoaT0wLCBsPSQuanFwbG90LnByZURyYXdIb29rcy5sZW5ndGg7IGk8bDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgJC5qcXBsb3QucHJlRHJhd0hvb2tzW2ldLmNhbGwodGhpcyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmb3IgKGk9MCwgbD10aGlzLnByZURyYXdIb29rcy5sZW5ndGg7IGk8bDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcmVEcmF3SG9va3MuaG9va3NbaV0uYXBwbHkodGhpcywgdGhpcy5wcmVEcmF3U2VyaWVzSG9va3MuYXJnc1tpXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvLyBjcmVhdGUgYW4gdW5kZXJseWluZyBjYW52YXMgdG8gYmUgdXNlZCBmb3Igc3BlY2lhbCBmZWF0dXJlcy4KICAgICAgICAgICAgICAgIHRoaXMudGFyZ2V0LmFwcGVuZCh0aGlzLmJhc2VDYW52YXMuY3JlYXRlRWxlbWVudCh7bGVmdDowLCByaWdodDowLCB0b3A6MCwgYm90dG9tOjB9LCAnanFwbG90LWJhc2UtY2FudmFzJywgbnVsbCwgdGhpcykpOwogICAgICAgICAgICAgICAgdGhpcy5iYXNlQ2FudmFzLnNldENvbnRleHQoKTsKICAgICAgICAgICAgICAgIHRoaXMudGFyZ2V0LmFwcGVuZCh0aGlzLnRpdGxlLmRyYXcoKSk7CiAgICAgICAgICAgICAgICB0aGlzLnRpdGxlLnBhY2soe3RvcDowLCBsZWZ0OjB9KTsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgLy8gbWFrZSByb29tICBmb3IgdGhlIGxlZ2VuZCBiZXR3ZWVuIHRoZSBncmlkIGFuZCB0aGUgZWRnZS4KICAgICAgICAgICAgICAgIHZhciBsZWdlbmRFbGVtID0gdGhpcy5sZWdlbmQuZHJhdygpOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgZ3JpZFBhZGRpbmcgPSB7dG9wOjAsIGxlZnQ6MCwgYm90dG9tOjAsIHJpZ2h0OjB9OwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBpZiAodGhpcy5sZWdlbmQucGxhY2VtZW50ID09ICJvdXRzaWRlR3JpZCIpIHsKICAgICAgICAgICAgICAgICAgICAvLyB0ZW1wb3JhcmlseSBhcHBlbmQgdGhlIGxlZ2VuZCB0byBnZXQgZGltZW5zaW9ucwogICAgICAgICAgICAgICAgICAgIHRoaXMudGFyZ2V0LmFwcGVuZChsZWdlbmRFbGVtKTsKICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHRoaXMubGVnZW5kLmxvY2F0aW9uKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ24nOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JpZFBhZGRpbmcudG9wICs9IHRoaXMubGVnZW5kLmdldEhlaWdodCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3MnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JpZFBhZGRpbmcuYm90dG9tICs9IHRoaXMubGVnZW5kLmdldEhlaWdodCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ25lJzoKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnZSc6CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3NlJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyaWRQYWRkaW5nLnJpZ2h0ICs9IHRoaXMubGVnZW5kLmdldFdpZHRoKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnbncnOgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd3JzoKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnc3cnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JpZFBhZGRpbmcubGVmdCArPSB0aGlzLmxlZ2VuZC5nZXRXaWR0aCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6ICAvLyBzYW1lIGFzICduZScKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyaWRQYWRkaW5nLnJpZ2h0ICs9IHRoaXMubGVnZW5kLmdldFdpZHRoKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgbGVnZW5kRWxlbSA9IGxlZ2VuZEVsZW0uZGV0YWNoKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBheCA9IHRoaXMuYXhlczsKICAgICAgICAgICAgICAgIHZhciBuYW1lOwogICAgICAgICAgICAgICAgLy8gZHJhdyB0aGUgeU1pZEF4aXMgZmlyc3QsIHNvIHhheGlzIG9mIHB5cmFtaWQgY2hhcnQgY2FuIGFkanVzdCBpdHNlbGYgaWYgbmVlZGVkLgogICAgICAgICAgICAgICAgZm9yIChpPTA7IGk8MTI7IGkrKykgewogICAgICAgICAgICAgICAgICAgIG5hbWUgPSBfYXhpc05hbWVzW2ldOwogICAgICAgICAgICAgICAgICAgIHRoaXMudGFyZ2V0LmFwcGVuZChheFtuYW1lXS5kcmF3KHRoaXMuYmFzZUNhbnZhcy5fY3R4LCB0aGlzKSk7CiAgICAgICAgICAgICAgICAgICAgYXhbbmFtZV0uc2V0KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoYXgueWF4aXMuc2hvdykgewogICAgICAgICAgICAgICAgICAgIGdyaWRQYWRkaW5nLmxlZnQgKz0gYXgueWF4aXMuZ2V0V2lkdGgoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciByYSA9IFsneTJheGlzJywgJ3kzYXhpcycsICd5NGF4aXMnLCAneTVheGlzJywgJ3k2YXhpcycsICd5N2F4aXMnLCAneThheGlzJywgJ3k5YXhpcyddOwogICAgICAgICAgICAgICAgdmFyIHJhcGFkID0gWzAsIDAsIDAsIDAsIDAsIDAsIDAsIDBdOwogICAgICAgICAgICAgICAgdmFyIGdwciA9IDA7CiAgICAgICAgICAgICAgICB2YXIgbjsKICAgICAgICAgICAgICAgIGZvciAobj0wOyBuPDg7IG4rKykgewogICAgICAgICAgICAgICAgICAgIGlmIChheFtyYVtuXV0uc2hvdykgewogICAgICAgICAgICAgICAgICAgICAgICBncHIgKz0gYXhbcmFbbl1dLmdldFdpZHRoKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJhcGFkW25dID0gZ3ByOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGdyaWRQYWRkaW5nLnJpZ2h0ICs9IGdwcjsKICAgICAgICAgICAgICAgIGlmIChheC54MmF4aXMuc2hvdykgewogICAgICAgICAgICAgICAgICAgIGdyaWRQYWRkaW5nLnRvcCArPSBheC54MmF4aXMuZ2V0SGVpZ2h0KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAodGhpcy50aXRsZS5zaG93KSB7CiAgICAgICAgICAgICAgICAgICAgZ3JpZFBhZGRpbmcudG9wICs9IHRoaXMudGl0bGUuZ2V0SGVpZ2h0KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoYXgueGF4aXMuc2hvdykgewogICAgICAgICAgICAgICAgICAgIGdyaWRQYWRkaW5nLmJvdHRvbSArPSBheC54YXhpcy5nZXRIZWlnaHQoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgLy8gZW5kIG9mIGdyaWRQYWRkaW5nIGFkanVzdG1lbnRzLgoKICAgICAgICAgICAgICAgIC8vIGlmIHVzZXIgcGFzc2VkIGluIGdyaWREaW1lbnNpb25zIG9wdGlvbiwgY2hlY2sgYWdhaW5zdCBjYWxjdWxhdGVkIGdyaWRQYWRkaW5nCiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmdyaWREaW1lbnNpb25zICYmICQuaXNQbGFpbk9iamVjdCh0aGlzLm9wdGlvbnMuZ3JpZERpbWVuc2lvbnMpKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGdkdyA9IHBhcnNlSW50KHRoaXMub3B0aW9ucy5ncmlkRGltZW5zaW9ucy53aWR0aCwgMTApIHx8IDA7CiAgICAgICAgICAgICAgICAgICAgdmFyIGdkaCA9IHBhcnNlSW50KHRoaXMub3B0aW9ucy5ncmlkRGltZW5zaW9ucy5oZWlnaHQsIDEwKSB8fCAwOwogICAgICAgICAgICAgICAgICAgIHZhciB3aWR0aEFkaiA9ICh0aGlzLl93aWR0aCAtIGdyaWRQYWRkaW5nLmxlZnQgLSBncmlkUGFkZGluZy5yaWdodCAtIGdkdykvMjsKICAgICAgICAgICAgICAgICAgICB2YXIgaGVpZ2h0QWRqID0gKHRoaXMuX2hlaWdodCAtIGdyaWRQYWRkaW5nLnRvcCAtIGdyaWRQYWRkaW5nLmJvdHRvbSAtIGdkaCkvMjsKCiAgICAgICAgICAgICAgICAgICAgaWYgKGhlaWdodEFkaiA+PSAwICYmIHdpZHRoQWRqID49IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgZ3JpZFBhZGRpbmcudG9wICs9IGhlaWdodEFkajsKICAgICAgICAgICAgICAgICAgICAgICAgZ3JpZFBhZGRpbmcuYm90dG9tICs9IGhlaWdodEFkajsKICAgICAgICAgICAgICAgICAgICAgICAgZ3JpZFBhZGRpbmcubGVmdCArPSB3aWR0aEFkajsKICAgICAgICAgICAgICAgICAgICAgICAgZ3JpZFBhZGRpbmcucmlnaHQgKz0gd2lkdGhBZGo7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIGFyciA9IFsndG9wJywgJ2JvdHRvbScsICdsZWZ0JywgJ3JpZ2h0J107CiAgICAgICAgICAgICAgICBmb3IgKHZhciBuIGluIGFycikgewogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9ncmlkUGFkZGluZ1thcnJbbl1dID09IG51bGwgJiYgZ3JpZFBhZGRpbmdbYXJyW25dXSA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZ3JpZFBhZGRpbmdbYXJyW25dXSA9IGdyaWRQYWRkaW5nW2FycltuXV07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuX2dyaWRQYWRkaW5nW2FycltuXV0gPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9ncmlkUGFkZGluZ1thcnJbbl1dID0gdGhpcy5fZGVmYXVsdEdyaWRQYWRkaW5nW2FycltuXV07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgbGVnZW5kUGFkZGluZyA9ICh0aGlzLmxlZ2VuZC5wbGFjZW1lbnQgPT0gJ291dHNpZGVHcmlkJykgPyB7dG9wOnRoaXMudGl0bGUuZ2V0SGVpZ2h0KCksIGxlZnQ6IDAsIHJpZ2h0OiAwLCBib3R0b206IDB9IDogdGhpcy5fZ3JpZFBhZGRpbmc7CiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgYXgueGF4aXMucGFjayh7cG9zaXRpb246J2Fic29sdXRlJywgYm90dG9tOnRoaXMuX2dyaWRQYWRkaW5nLmJvdHRvbSAtIGF4LnhheGlzLmdldEhlaWdodCgpLCBsZWZ0OjAsIHdpZHRoOnRoaXMuX3dpZHRofSwge21pbjp0aGlzLl9ncmlkUGFkZGluZy5sZWZ0LCBtYXg6dGhpcy5fd2lkdGggLSB0aGlzLl9ncmlkUGFkZGluZy5yaWdodH0pOwogICAgICAgICAgICAgICAgYXgueWF4aXMucGFjayh7cG9zaXRpb246J2Fic29sdXRlJywgdG9wOjAsIGxlZnQ6dGhpcy5fZ3JpZFBhZGRpbmcubGVmdCAtIGF4LnlheGlzLmdldFdpZHRoKCksIGhlaWdodDp0aGlzLl9oZWlnaHR9LCB7bWluOnRoaXMuX2hlaWdodCAtIHRoaXMuX2dyaWRQYWRkaW5nLmJvdHRvbSwgbWF4OiB0aGlzLl9ncmlkUGFkZGluZy50b3B9KTsKICAgICAgICAgICAgICAgIGF4LngyYXhpcy5wYWNrKHtwb3NpdGlvbjonYWJzb2x1dGUnLCB0b3A6dGhpcy5fZ3JpZFBhZGRpbmcudG9wIC0gYXgueDJheGlzLmdldEhlaWdodCgpLCBsZWZ0OjAsIHdpZHRoOnRoaXMuX3dpZHRofSwge21pbjp0aGlzLl9ncmlkUGFkZGluZy5sZWZ0LCBtYXg6dGhpcy5fd2lkdGggLSB0aGlzLl9ncmlkUGFkZGluZy5yaWdodH0pOwogICAgICAgICAgICAgICAgZm9yIChpPTg7IGk+MDsgaS0tKSB7CiAgICAgICAgICAgICAgICAgICAgYXhbcmFbaS0xXV0ucGFjayh7cG9zaXRpb246J2Fic29sdXRlJywgdG9wOjAsIHJpZ2h0OnRoaXMuX2dyaWRQYWRkaW5nLnJpZ2h0IC0gcmFwYWRbaS0xXX0sIHttaW46dGhpcy5faGVpZ2h0IC0gdGhpcy5fZ3JpZFBhZGRpbmcuYm90dG9tLCBtYXg6IHRoaXMuX2dyaWRQYWRkaW5nLnRvcH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIGx0ZW1wID0gKHRoaXMuX3dpZHRoIC0gdGhpcy5fZ3JpZFBhZGRpbmcubGVmdCAtIHRoaXMuX2dyaWRQYWRkaW5nLnJpZ2h0KS8yLjAgKyB0aGlzLl9ncmlkUGFkZGluZy5sZWZ0IC0gYXgueU1pZEF4aXMuZ2V0V2lkdGgoKS8yLjA7CiAgICAgICAgICAgICAgICBheC55TWlkQXhpcy5wYWNrKHtwb3NpdGlvbjonYWJzb2x1dGUnLCB0b3A6MCwgbGVmdDpsdGVtcCwgekluZGV4OjksIHRleHRBbGlnbjogJ2NlbnRlcid9LCB7bWluOnRoaXMuX2hlaWdodCAtIHRoaXMuX2dyaWRQYWRkaW5nLmJvdHRvbSwgbWF4OiB0aGlzLl9ncmlkUGFkZGluZy50b3B9KTsKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB0aGlzLnRhcmdldC5hcHBlbmQodGhpcy5ncmlkLmNyZWF0ZUVsZW1lbnQodGhpcy5fZ3JpZFBhZGRpbmcsIHRoaXMpKTsKICAgICAgICAgICAgICAgIHRoaXMuZ3JpZC5kcmF3KCk7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBzZXJpZXMgPSB0aGlzLnNlcmllczsKICAgICAgICAgICAgICAgIHZhciBzZXJpZXNMZW5ndGggPSBzZXJpZXMubGVuZ3RoOwogICAgICAgICAgICAgICAgLy8gcHV0IHRoZSBzaGFkb3cgY2FudmFzZXMgYmVoaW5kIHRoZSBzZXJpZXMgY2FudmFzZXMgc28gc2hhZG93cyBkb24ndCBvdmVybGFwIG9uIHN0YWNrZWQgYmFycy4KICAgICAgICAgICAgICAgIGZvciAoaT0wLCBsPXNlcmllc0xlbmd0aDsgaTxsOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAvLyBkcmF3IHNlcmllcyBpbiBvcmRlciBvZiBzdGFja2luZy4gIFRoaXMgYWZmZWN0cyBvbmx5CiAgICAgICAgICAgICAgICAgICAgLy8gb3JkZXIgaW4gd2hpY2ggY2FudmFzZXMgYXJlIGFkZGVkIHRvIGRvbS4KICAgICAgICAgICAgICAgICAgICBqID0gdGhpcy5zZXJpZXNTdGFja1tpXTsKICAgICAgICAgICAgICAgICAgICB0aGlzLnRhcmdldC5hcHBlbmQoc2VyaWVzW2pdLnNoYWRvd0NhbnZhcy5jcmVhdGVFbGVtZW50KHRoaXMuX2dyaWRQYWRkaW5nLCAnanFwbG90LXNlcmllcy1zaGFkb3dDYW52YXMnLCBudWxsLCB0aGlzKSk7CiAgICAgICAgICAgICAgICAgICAgc2VyaWVzW2pdLnNoYWRvd0NhbnZhcy5zZXRDb250ZXh0KCk7CiAgICAgICAgICAgICAgICAgICAgc2VyaWVzW2pdLnNoYWRvd0NhbnZhcy5fZWxlbS5kYXRhKCdzZXJpZXNJbmRleCcsIGopOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBmb3IgKGk9MCwgbD1zZXJpZXNMZW5ndGg7IGk8bDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gZHJhdyBzZXJpZXMgaW4gb3JkZXIgb2Ygc3RhY2tpbmcuICBUaGlzIGFmZmVjdHMgb25seQogICAgICAgICAgICAgICAgICAgIC8vIG9yZGVyIGluIHdoaWNoIGNhbnZhc2VzIGFyZSBhZGRlZCB0byBkb20uCiAgICAgICAgICAgICAgICAgICAgaiA9IHRoaXMuc2VyaWVzU3RhY2tbaV07CiAgICAgICAgICAgICAgICAgICAgdGhpcy50YXJnZXQuYXBwZW5kKHNlcmllc1tqXS5jYW52YXMuY3JlYXRlRWxlbWVudCh0aGlzLl9ncmlkUGFkZGluZywgJ2pxcGxvdC1zZXJpZXMtY2FudmFzJywgbnVsbCwgdGhpcykpOwogICAgICAgICAgICAgICAgICAgIHNlcmllc1tqXS5jYW52YXMuc2V0Q29udGV4dCgpOwogICAgICAgICAgICAgICAgICAgIHNlcmllc1tqXS5jYW52YXMuX2VsZW0uZGF0YSgnc2VyaWVzSW5kZXgnLCBqKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIE5lZWQgdG8gdXNlIGZpbGxlZCBjYW52YXMgdG8gY2FwdHVyZSBldmVudHMgaW4gSUUuCiAgICAgICAgICAgICAgICAvLyBBbHNvLCBjYW52YXMgc2VlbXMgdG8gYmxvY2sgc2VsZWN0aW9uIG9mIG90aGVyIGVsZW1lbnRzIGluIGRvY3VtZW50IG9uIEZGLgogICAgICAgICAgICAgICAgdGhpcy50YXJnZXQuYXBwZW5kKHRoaXMuZXZlbnRDYW52YXMuY3JlYXRlRWxlbWVudCh0aGlzLl9ncmlkUGFkZGluZywgJ2pxcGxvdC1ldmVudC1jYW52YXMnLCBudWxsLCB0aGlzKSk7CiAgICAgICAgICAgICAgICB0aGlzLmV2ZW50Q2FudmFzLnNldENvbnRleHQoKTsKICAgICAgICAgICAgICAgIHRoaXMuZXZlbnRDYW52YXMuX2N0eC5maWxsU3R5bGUgPSAncmdiYSgwLDAsMCwwKSc7CiAgICAgICAgICAgICAgICB0aGlzLmV2ZW50Q2FudmFzLl9jdHguZmlsbFJlY3QoMCwwLHRoaXMuZXZlbnRDYW52YXMuX2N0eC5jYW52YXMud2lkdGgsIHRoaXMuZXZlbnRDYW52YXMuX2N0eC5jYW52YXMuaGVpZ2h0KTsKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAvLyBiaW5kIGN1c3RvbSBldmVudCBoYW5kbGVycyB0byByZWd1bGFyIGV2ZW50cy4KICAgICAgICAgICAgICAgIHRoaXMuYmluZEN1c3RvbUV2ZW50cygpOwogICAgICAgICAgICAKICAgICAgICAgICAgICAgIC8vIGRyYXcgbGVnZW5kIGJlZm9yZSBzZXJpZXMgaWYgdGhlIHNlcmllcyBuZWVkcyB0byBrbm93IHRoZSBsZWdlbmQgZGltZW5zaW9ucy4KICAgICAgICAgICAgICAgIGlmICh0aGlzLmxlZ2VuZC5wcmVEcmF3KSB7ICAKICAgICAgICAgICAgICAgICAgICB0aGlzLmV2ZW50Q2FudmFzLl9lbGVtLmJlZm9yZShsZWdlbmRFbGVtKTsKICAgICAgICAgICAgICAgICAgICB0aGlzLmxlZ2VuZC5wYWNrKGxlZ2VuZFBhZGRpbmcpOwogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmxlZ2VuZC5fZWxlbSkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRyYXdTZXJpZXMoe2xlZ2VuZEluZm86e2xvY2F0aW9uOnRoaXMubGVnZW5kLmxvY2F0aW9uLCBwbGFjZW1lbnQ6dGhpcy5sZWdlbmQucGxhY2VtZW50LCB3aWR0aDp0aGlzLmxlZ2VuZC5nZXRXaWR0aCgpLCBoZWlnaHQ6dGhpcy5sZWdlbmQuZ2V0SGVpZ2h0KCksIHhvZmZzZXQ6dGhpcy5sZWdlbmQueG9mZnNldCwgeW9mZnNldDp0aGlzLmxlZ2VuZC55b2Zmc2V0fX0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kcmF3U2VyaWVzKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7ICAvLyBkcmF3IHNlcmllcyBiZWZvcmUgbGVnZW5kCiAgICAgICAgICAgICAgICAgICAgdGhpcy5kcmF3U2VyaWVzKCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHNlcmllc0xlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICAkKHNlcmllc1tzZXJpZXNMZW5ndGgtMV0uY2FudmFzLl9lbGVtKS5hZnRlcihsZWdlbmRFbGVtKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdGhpcy5sZWdlbmQucGFjayhsZWdlbmRQYWRkaW5nKTsgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgLy8gcmVnaXN0ZXIgZXZlbnQgbGlzdGVuZXJzIG9uIHRoZSBvdmVybGF5IGNhbnZhcwogICAgICAgICAgICAgICAgZm9yICh2YXIgaT0wLCBsPSQuanFwbG90LmV2ZW50TGlzdGVuZXJIb29rcy5sZW5ndGg7IGk8bDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gaW4gdGhlIGhhbmRsZXIsIHRoaXMgd2lsbCByZWZlciB0byB0aGUgZXZlbnRDYW52YXMgZG9tIGVsZW1lbnQuCiAgICAgICAgICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHRoZXJlIGFyZSByZWZlcmVuY2VzIGJhY2sgaW50byBwbG90IG9iamVjdHMuCiAgICAgICAgICAgICAgICAgICAgdGhpcy5ldmVudENhbnZhcy5fZWxlbS5iaW5kKCQuanFwbG90LmV2ZW50TGlzdGVuZXJIb29rc1tpXVswXSwge3Bsb3Q6dGhpc30sICQuanFwbG90LmV2ZW50TGlzdGVuZXJIb29rc1tpXVsxXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgLy8gcmVnaXN0ZXIgZXZlbnQgbGlzdGVuZXJzIG9uIHRoZSBvdmVybGF5IGNhbnZhcwogICAgICAgICAgICAgICAgZm9yICh2YXIgaT0wLCBsPXRoaXMuZXZlbnRMaXN0ZW5lckhvb2tzLmhvb2tzLmxlbmd0aDsgaTxsOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAvLyBpbiB0aGUgaGFuZGxlciwgdGhpcyB3aWxsIHJlZmVyIHRvIHRoZSBldmVudENhbnZhcyBkb20gZWxlbWVudC4KICAgICAgICAgICAgICAgICAgICAvLyBtYWtlIHN1cmUgdGhlcmUgYXJlIHJlZmVyZW5jZXMgYmFjayBpbnRvIHBsb3Qgb2JqZWN0cy4KICAgICAgICAgICAgICAgICAgICB0aGlzLmV2ZW50Q2FudmFzLl9lbGVtLmJpbmQodGhpcy5ldmVudExpc3RlbmVySG9va3MuaG9va3NbaV1bMF0sIHtwbG90OnRoaXN9LCB0aGlzLmV2ZW50TGlzdGVuZXJIb29rcy5ob29rc1tpXVsxXSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIGZiID0gdGhpcy5maWxsQmV0d2VlbjsKICAgICAgICAgICAgICAgIGlmIChmYi5maWxsICYmIGZiLnNlcmllczEgIT09IGZiLnNlcmllczIgJiYgZmIuc2VyaWVzMSA8IHNlcmllc0xlbmd0aCAmJiBmYi5zZXJpZXMyIDwgc2VyaWVzTGVuZ3RoICYmIHNlcmllc1tmYi5zZXJpZXMxXS5fdHlwZSA9PT0gJ2xpbmUnICYmIHNlcmllc1tmYi5zZXJpZXMyXS5fdHlwZSA9PT0gJ2xpbmUnKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5kb0ZpbGxCZXR3ZWVuTGluZXMoKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBmb3IgKHZhciBpPTAsIGw9JC5qcXBsb3QucG9zdERyYXdIb29rcy5sZW5ndGg7IGk8bDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgJC5qcXBsb3QucG9zdERyYXdIb29rc1tpXS5jYWxsKHRoaXMpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGZvciAodmFyIGk9MCwgbD10aGlzLnBvc3REcmF3SG9va3MuaG9va3MubGVuZ3RoOyBpPGw7IGkrKykgewogICAgICAgICAgICAgICAgICAgIHRoaXMucG9zdERyYXdIb29rcy5ob29rc1tpXS5hcHBseSh0aGlzLCB0aGlzLnBvc3REcmF3SG9va3MuYXJnc1tpXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgaWYgKHRoaXMudGFyZ2V0LmlzKCc6dmlzaWJsZScpKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZHJhd0NvdW50ICs9IDE7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIHRlbXBzLCAKICAgICAgICAgICAgICAgICAgICB0ZW1wciwKICAgICAgICAgICAgICAgICAgICBzZWwsCiAgICAgICAgICAgICAgICAgICAgX2VsczsKICAgICAgICAgICAgICAgIC8vIHVnaGguICBpZGVhbGx5IHdvdWxkIGhpZGUgYWxsIHNlcmllcyB0aGVuIHNob3cgdGhlbS4KICAgICAgICAgICAgICAgIGZvciAoaT0wLCBsPXNlcmllc0xlbmd0aDsgaTxsOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICB0ZW1wcyA9IHNlcmllc1tpXTsKICAgICAgICAgICAgICAgICAgICB0ZW1wciA9IHRlbXBzLnJlbmRlcmVyOwogICAgICAgICAgICAgICAgICAgIHNlbCA9ICcuanFwbG90LXBvaW50LWxhYmVsLmpxcGxvdC1zZXJpZXMtJytpOwogICAgICAgICAgICAgICAgICAgIGlmICh0ZW1wci5hbmltYXRpb24gJiYgdGVtcHIuYW5pbWF0aW9uLl9zdXBwb3J0ZWQgJiYgdGVtcHIuYW5pbWF0aW9uLnNob3cgJiYgKHRoaXMuX2RyYXdDb3VudCA8IDIgfHwgdGhpcy5hbmltYXRlUmVwbG90KSkgewogICAgICAgICAgICAgICAgICAgICAgICBfZWxzID0gdGhpcy50YXJnZXQuZmluZChzZWwpOwogICAgICAgICAgICAgICAgICAgICAgICBfZWxzLnN0b3AodHJ1ZSwgdHJ1ZSkuaGlkZSgpOwogICAgICAgICAgICAgICAgICAgICAgICB0ZW1wcy5jYW52YXMuX2VsZW0uc3RvcCh0cnVlLCB0cnVlKS5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBzLnNoYWRvd0NhbnZhcy5fZWxlbS5zdG9wKHRydWUsIHRydWUpLmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgdGVtcHMuY2FudmFzLl9lbGVtLmpxcGxvdEVmZmVjdCgnYmxpbmQnLCB7bW9kZTogJ3Nob3cnLCBkaXJlY3Rpb246IHRlbXByLmFuaW1hdGlvbi5kaXJlY3Rpb259LCB0ZW1wci5hbmltYXRpb24uc3BlZWQpOwogICAgICAgICAgICAgICAgICAgICAgICB0ZW1wcy5zaGFkb3dDYW52YXMuX2VsZW0uanFwbG90RWZmZWN0KCdibGluZCcsIHttb2RlOiAnc2hvdycsIGRpcmVjdGlvbjogdGVtcHIuYW5pbWF0aW9uLmRpcmVjdGlvbn0sIHRlbXByLmFuaW1hdGlvbi5zcGVlZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIF9lbHMuZmFkZUluKHRlbXByLmFuaW1hdGlvbi5zcGVlZCowLjgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIF9lbHMgPSBudWxsOwogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHRoaXMudGFyZ2V0LnRyaWdnZXIoJ2pxcGxvdFBvc3REcmF3JywgW3RoaXNdKTsKICAgICAgICAgICAgfQogICAgICAgIH07CgogICAgICAgIGpxUGxvdC5wcm90b3R5cGUuZG9GaWxsQmV0d2VlbkxpbmVzID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgZmIgPSB0aGlzLmZpbGxCZXR3ZWVuOwogICAgICAgICAgICB2YXIgc2lkMSA9IGZiLnNlcmllczE7CiAgICAgICAgICAgIHZhciBzaWQyID0gZmIuc2VyaWVzMjsKICAgICAgICAgICAgLy8gZmlyc3Qgc2VyaWVzIHNob3VsZCBhbHdheXMgYmUgbG93ZXN0IGluZGV4CiAgICAgICAgICAgIHZhciBpZDEgPSAoc2lkMSA8IHNpZDIpID8gc2lkMSA6IHNpZDI7CiAgICAgICAgICAgIHZhciBpZDIgPSAoc2lkMiA+ICBzaWQxKSA/IHNpZDIgOiBzaWQxOwoKICAgICAgICAgICAgdmFyIHNlcmllczEgPSB0aGlzLnNlcmllc1tpZDFdOwogICAgICAgICAgICB2YXIgc2VyaWVzMiA9IHRoaXMuc2VyaWVzW2lkMl07CgogICAgICAgICAgICBpZiAoc2VyaWVzMi5yZW5kZXJlci5zbW9vdGgpIHsKICAgICAgICAgICAgICAgIHZhciB0ZW1wZ2QgPSBzZXJpZXMyLnJlbmRlcmVyLl9zbW9vdGhlZERhdGEuc2xpY2UoMCkucmV2ZXJzZSgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgdmFyIHRlbXBnZCA9IHNlcmllczIuZ3JpZERhdGEuc2xpY2UoMCkucmV2ZXJzZSgpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoc2VyaWVzMS5yZW5kZXJlci5zbW9vdGgpIHsKICAgICAgICAgICAgICAgIHZhciBnZCA9IHNlcmllczEucmVuZGVyZXIuX3Ntb290aGVkRGF0YS5jb25jYXQodGVtcGdkKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHZhciBnZCA9IHNlcmllczEuZ3JpZERhdGEuY29uY2F0KHRlbXBnZCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBjb2xvciA9IChmYi5jb2xvciAhPT0gbnVsbCkgPyBmYi5jb2xvciA6IHRoaXMuc2VyaWVzW3NpZDFdLmZpbGxDb2xvcjsKICAgICAgICAgICAgdmFyIGJhc2VTZXJpZXMgPSAoZmIuYmFzZVNlcmllcyAhPT0gbnVsbCkgPyBmYi5iYXNlU2VyaWVzIDogaWQxOwoKICAgICAgICAgICAgLy8gbm93IGFwcGx5IGEgZmlsbCB0byB0aGUgc2hhcGUgb24gdGhlIGxvd2VyIHNlcmllcyBzaGFkb3cgY2FudmFzLAogICAgICAgICAgICAvLyBzbyBpdCBpcyBiZWhpbmQgYm90aCBzZXJpZXMuCiAgICAgICAgICAgIHZhciBzciA9IHRoaXMuc2VyaWVzW2Jhc2VTZXJpZXNdLnJlbmRlcmVyLnNoYXBlUmVuZGVyZXI7CiAgICAgICAgICAgIHZhciBvcHRzID0ge2ZpbGxTdHlsZTogY29sb3IsIGZpbGw6IHRydWUsIGNsb3NlUGF0aDogdHJ1ZX07CiAgICAgICAgICAgIHNyLmRyYXcoc2VyaWVzMS5zaGFkb3dDYW52YXMuX2N0eCwgZ2QsIG9wdHMpOwogICAgICAgIH07CiAgICAgICAgCiAgICAgICAgdGhpcy5iaW5kQ3VzdG9tRXZlbnRzID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHRoaXMuZXZlbnRDYW52YXMuX2VsZW0uYmluZCgnY2xpY2snLCB7cGxvdDp0aGlzfSwgdGhpcy5vbkNsaWNrKTsKICAgICAgICAgICAgdGhpcy5ldmVudENhbnZhcy5fZWxlbS5iaW5kKCdkYmxjbGljaycsIHtwbG90OnRoaXN9LCB0aGlzLm9uRGJsQ2xpY2spOwogICAgICAgICAgICB0aGlzLmV2ZW50Q2FudmFzLl9lbGVtLmJpbmQoJ21vdXNlZG93bicsIHtwbG90OnRoaXN9LCB0aGlzLm9uTW91c2VEb3duKTsKICAgICAgICAgICAgdGhpcy5ldmVudENhbnZhcy5fZWxlbS5iaW5kKCdtb3VzZW1vdmUnLCB7cGxvdDp0aGlzfSwgdGhpcy5vbk1vdXNlTW92ZSk7CiAgICAgICAgICAgIHRoaXMuZXZlbnRDYW52YXMuX2VsZW0uYmluZCgnbW91c2VlbnRlcicsIHtwbG90OnRoaXN9LCB0aGlzLm9uTW91c2VFbnRlcik7CiAgICAgICAgICAgIHRoaXMuZXZlbnRDYW52YXMuX2VsZW0uYmluZCgnbW91c2VsZWF2ZScsIHtwbG90OnRoaXN9LCB0aGlzLm9uTW91c2VMZWF2ZSk7CiAgICAgICAgICAgIGlmICh0aGlzLmNhcHR1cmVSaWdodENsaWNrKSB7CiAgICAgICAgICAgICAgICB0aGlzLmV2ZW50Q2FudmFzLl9lbGVtLmJpbmQoJ21vdXNldXAnLCB7cGxvdDp0aGlzfSwgdGhpcy5vblJpZ2h0Q2xpY2spOwogICAgICAgICAgICAgICAgdGhpcy5ldmVudENhbnZhcy5fZWxlbS5nZXQoMCkub25jb250ZXh0bWVudSA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICB0aGlzLmV2ZW50Q2FudmFzLl9lbGVtLmJpbmQoJ21vdXNldXAnLCB7cGxvdDp0aGlzfSwgdGhpcy5vbk1vdXNlVXApOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICAKICAgICAgICBmdW5jdGlvbiBnZXRFdmVudFBvc2l0aW9uKGV2KSB7CiAgICAgICAgICAgIHZhciBwbG90ID0gZXYuZGF0YS5wbG90OwogICAgICAgICAgICB2YXIgZ28gPSBwbG90LmV2ZW50Q2FudmFzLl9lbGVtLm9mZnNldCgpOwogICAgICAgICAgICB2YXIgZ3JpZFBvcyA9IHt4OmV2LnBhZ2VYIC0gZ28ubGVmdCwgeTpldi5wYWdlWSAtIGdvLnRvcH07CiAgICAgICAgICAgIHZhciBkYXRhUG9zID0ge3hheGlzOm51bGwsIHlheGlzOm51bGwsIHgyYXhpczpudWxsLCB5MmF4aXM6bnVsbCwgeTNheGlzOm51bGwsIHk0YXhpczpudWxsLCB5NWF4aXM6bnVsbCwgeTZheGlzOm51bGwsIHk3YXhpczpudWxsLCB5OGF4aXM6bnVsbCwgeTlheGlzOm51bGwsIHlNaWRBeGlzOm51bGx9OwogICAgICAgICAgICB2YXIgYW4gPSBbJ3hheGlzJywgJ3lheGlzJywgJ3gyYXhpcycsICd5MmF4aXMnLCAneTNheGlzJywgJ3k0YXhpcycsICd5NWF4aXMnLCAneTZheGlzJywgJ3k3YXhpcycsICd5OGF4aXMnLCAneTlheGlzJywgJ3lNaWRBeGlzJ107CiAgICAgICAgICAgIHZhciBheCA9IHBsb3QuYXhlczsKICAgICAgICAgICAgdmFyIG4sIGF4aXM7CiAgICAgICAgICAgIGZvciAobj0xMTsgbj4wOyBuLS0pIHsKICAgICAgICAgICAgICAgIGF4aXMgPSBhbltuLTFdOwogICAgICAgICAgICAgICAgaWYgKGF4W2F4aXNdLnNob3cpIHsKICAgICAgICAgICAgICAgICAgICBkYXRhUG9zW2F4aXNdID0gYXhbYXhpc10uc2VyaWVzX3AydShncmlkUG9zW2F4aXMuY2hhckF0KDApXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB7b2Zmc2V0czpnbywgZ3JpZFBvczpncmlkUG9zLCBkYXRhUG9zOmRhdGFQb3N9OwogICAgICAgIH0KICAgICAgICAKICAgICAgICAKICAgICAgICAvLyBmdW5jdGlvbiB0byBjaGVjayBpZiBldmVudCBsb2NhdGlvbiBpcyBvdmVyIGEgYXJlYSBhcmVhCiAgICAgICAgZnVuY3Rpb24gY2hlY2tJbnRlcnNlY3Rpb24oZ3JpZHBvcywgcGxvdCkgewogICAgICAgICAgICB2YXIgc2VyaWVzID0gcGxvdC5zZXJpZXM7CiAgICAgICAgICAgIHZhciBpLCBqLCBrLCBzLCByLCB4LCB5LCB0aGV0YSwgc20sIHNhLCBtaW5hbmcsIG1heGFuZzsKICAgICAgICAgICAgdmFyIGQwLCBkLCBwLCBwcCwgcG9pbnRzLCBidzsKICAgICAgICAgICAgdmFyIHRocmVzaG9sZCwgdDsKICAgICAgICAgICAgZm9yIChrPXBsb3Quc2VyaWVzU3RhY2subGVuZ3RoLTE7IGs+PTA7IGstLSkgewogICAgICAgICAgICAgICAgaSA9IHBsb3Quc2VyaWVzU3RhY2tba107CiAgICAgICAgICAgICAgICBzID0gc2VyaWVzW2ldOwogICAgICAgICAgICAgICAgc3dpdGNoIChzLnJlbmRlcmVyLmNvbnN0cnVjdG9yKSB7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAkLmpxcGxvdC5CYXJSZW5kZXJlcjoKICAgICAgICAgICAgICAgICAgICBjYXNlICQuanFwbG90LlB5cmFtaWRSZW5kZXJlcjoKICAgICAgICAgICAgICAgICAgICAgICAgeCA9IGdyaWRwb3MueDsKICAgICAgICAgICAgICAgICAgICAgICAgeSA9IGdyaWRwb3MueTsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChqPTA7IGo8cy5fYmFyUG9pbnRzLmxlbmd0aDsgaisrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludHMgPSBzLl9iYXJQb2ludHNbal07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwID0gcy5ncmlkRGF0YVtqXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh4PnBvaW50c1swXVswXSAmJiB4PHBvaW50c1syXVswXSAmJiB5PnBvaW50c1syXVsxXSAmJiB5PHBvaW50c1swXVsxXSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7c2VyaWVzSW5kZXg6cy5pbmRleCwgcG9pbnRJbmRleDpqLCBncmlkRGF0YTpwLCBkYXRhOnMuZGF0YVtqXSwgcG9pbnRzOnMuX2JhclBvaW50c1tqXX07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgY2FzZSAkLmpxcGxvdC5Eb251dFJlbmRlcmVyOgogICAgICAgICAgICAgICAgICAgICAgICBzYSA9IHMuc3RhcnRBbmdsZS8xODAqTWF0aC5QSTsKICAgICAgICAgICAgICAgICAgICAgICAgeCA9IGdyaWRwb3MueCAtIHMuX2NlbnRlclswXTsKICAgICAgICAgICAgICAgICAgICAgICAgeSA9IGdyaWRwb3MueSAtIHMuX2NlbnRlclsxXTsKICAgICAgICAgICAgICAgICAgICAgICAgciA9IE1hdGguc3FydChNYXRoLnBvdyh4LCAyKSArIE1hdGgucG93KHksIDIpKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHggPiAwICYmIC15ID49IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZXRhID0gMipNYXRoLlBJIC0gTWF0aC5hdGFuKC15L3gpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHggPiAwICYmIC15IDwgMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhldGEgPSAtTWF0aC5hdGFuKC15L3gpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHggPCAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGV0YSA9IE1hdGguUEkgLSBNYXRoLmF0YW4oLXkveCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoeCA9PSAwICYmIC15ID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhldGEgPSAzKk1hdGguUEkvMjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh4ID09IDAgJiYgLXkgPCAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGV0YSA9IE1hdGguUEkvMjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh4ID09IDAgJiYgeSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGV0YSA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGV0YSAtPSBzYTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGV0YSA8IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGV0YSArPSAyKk1hdGguUEk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0aGV0YSA+IDIqTWF0aC5QSSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZXRhIC09IDIqTWF0aC5QSTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgc20gPSBzLnNsaWNlTWFyZ2luLzE4MCpNYXRoLlBJOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAociA8IHMuX3JhZGl1cyAmJiByID4gcy5faW5uZXJSYWRpdXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaj0wOyBqPHMuZ3JpZERhdGEubGVuZ3RoOyBqKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5hbmcgPSAoaj4wKSA/IHMuZ3JpZERhdGFbai0xXVsxXStzbSA6IHNtOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heGFuZyA9IHMuZ3JpZERhdGFbal1bMV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoZXRhID4gbWluYW5nICYmIHRoZXRhIDwgbWF4YW5nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7c2VyaWVzSW5kZXg6cy5pbmRleCwgcG9pbnRJbmRleDpqLCBncmlkRGF0YTpzLmdyaWREYXRhW2pdLCBkYXRhOnMuZGF0YVtqXX07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICBjYXNlICQuanFwbG90LlBpZVJlbmRlcmVyOgogICAgICAgICAgICAgICAgICAgICAgICBzYSA9IHMuc3RhcnRBbmdsZS8xODAqTWF0aC5QSTsKICAgICAgICAgICAgICAgICAgICAgICAgeCA9IGdyaWRwb3MueCAtIHMuX2NlbnRlclswXTsKICAgICAgICAgICAgICAgICAgICAgICAgeSA9IGdyaWRwb3MueSAtIHMuX2NlbnRlclsxXTsKICAgICAgICAgICAgICAgICAgICAgICAgciA9IE1hdGguc3FydChNYXRoLnBvdyh4LCAyKSArIE1hdGgucG93KHksIDIpKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHggPiAwICYmIC15ID49IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZXRhID0gMipNYXRoLlBJIC0gTWF0aC5hdGFuKC15L3gpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHggPiAwICYmIC15IDwgMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhldGEgPSAtTWF0aC5hdGFuKC15L3gpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHggPCAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGV0YSA9IE1hdGguUEkgLSBNYXRoLmF0YW4oLXkveCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoeCA9PSAwICYmIC15ID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhldGEgPSAzKk1hdGguUEkvMjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh4ID09IDAgJiYgLXkgPCAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGV0YSA9IE1hdGguUEkvMjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh4ID09IDAgJiYgeSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGV0YSA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGV0YSAtPSBzYTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGV0YSA8IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGV0YSArPSAyKk1hdGguUEk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0aGV0YSA+IDIqTWF0aC5QSSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZXRhIC09IDIqTWF0aC5QSTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgc20gPSBzLnNsaWNlTWFyZ2luLzE4MCpNYXRoLlBJOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAociA8IHMuX3JhZGl1cykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChqPTA7IGo8cy5ncmlkRGF0YS5sZW5ndGg7IGorKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbmFuZyA9IChqPjApID8gcy5ncmlkRGF0YVtqLTFdWzFdK3NtIDogc207CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4YW5nID0gcy5ncmlkRGF0YVtqXVsxXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhldGEgPiBtaW5hbmcgJiYgdGhldGEgPCBtYXhhbmcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtzZXJpZXNJbmRleDpzLmluZGV4LCBwb2ludEluZGV4OmosIGdyaWREYXRhOnMuZ3JpZERhdGFbal0sIGRhdGE6cy5kYXRhW2pdfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIGNhc2UgJC5qcXBsb3QuQnViYmxlUmVuZGVyZXI6CiAgICAgICAgICAgICAgICAgICAgICAgIHggPSBncmlkcG9zLng7CiAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBncmlkcG9zLnk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXQgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHMuc2hvdykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaj0wOyBqPHMuZ3JpZERhdGEubGVuZ3RoOyBqKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwID0gcy5ncmlkRGF0YVtqXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkID0gTWF0aC5zcXJ0KCAoeC1wWzBdKSAqICh4LXBbMF0pICsgKHktcFsxXSkgKiAoeS1wWzFdKSApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkIDw9IHBbMl0gJiYgKGQgPD0gZDAgfHwgZDAgPT0gbnVsbCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkMCA9IGQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0ge3Nlcmllc0luZGV4OiBpLCBwb2ludEluZGV4OmosIGdyaWREYXRhOnAsIGRhdGE6cy5kYXRhW2pdfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0ICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICBjYXNlICQuanFwbG90LkZ1bm5lbFJlbmRlcmVyOgogICAgICAgICAgICAgICAgICAgICAgICB4ID0gZ3JpZHBvcy54OwogICAgICAgICAgICAgICAgICAgICAgICB5ID0gZ3JpZHBvcy55OwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdiA9IHMuX3ZlcnRpY2VzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmZpcnN0ID0gdlswXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZsYXN0ID0gdlt2Lmxlbmd0aC0xXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN2OwogICAgCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVxdWF0aW9ucyBvZiByaWdodCBhbmQgbGVmdCBzaWRlcywgcmV0dXJucyB4LCB5IHZhbHVlcyBnaXZlbiBoZWlnaHQgb2Ygc2VjdGlvbiAoeSB2YWx1ZSBhbmQgMiBwb2ludHMpCiAgICAKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZmluZGVkZ2UgKGwsIHAxICwgcDIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtID0gKHAxWzFdIC0gcDJbMV0pLyhwMVswXSAtIHAyWzBdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBiID0gcDFbMV0gLSBtKnAxWzBdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHkgPSBsICsgcDFbMV07CiAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWyh5IC0gYikvbSwgeV07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgIAogICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBlYWNoIHNlY3Rpb24KICAgICAgICAgICAgICAgICAgICAgICAgbGV4ID0gZmluZGVkZ2UoeSwgdmZpcnN0WzBdLCB2bGFzdFszXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJleCA9IGZpbmRlZGdlKHksIHZmaXJzdFsxXSwgdmxhc3RbMl0pOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGo9MDsgajx2Lmxlbmd0aDsgaisrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdiA9IHZbal07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoeSA+PSBjdlswXVsxXSAmJiB5IDw9IGN2WzNdWzFdICYmIHggPj0gbGV4WzBdICYmIHggPD0gcmV4WzBdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtzZXJpZXNJbmRleDpzLmluZGV4LCBwb2ludEluZGV4OmosIGdyaWREYXRhOm51bGwsIGRhdGE6cy5kYXRhW2pdfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIGNhc2UgJC5qcXBsb3QuTGluZVJlbmRlcmVyOgogICAgICAgICAgICAgICAgICAgICAgICB4ID0gZ3JpZHBvcy54OwogICAgICAgICAgICAgICAgICAgICAgICB5ID0gZ3JpZHBvcy55OwogICAgICAgICAgICAgICAgICAgICAgICByID0gcy5yZW5kZXJlcjsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHMuc2hvdykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChzLmZpbGwgfHwgKHMucmVuZGVyZXIuYmFuZHMuc2hvdyAmJiBzLnJlbmRlcmVyLmJhbmRzLmZpbGwpKSAmJiAoIXBsb3QucGx1Z2lucy5oaWdobGlnaHRlciB8fCAhcGxvdC5wbHVnaW5zLmhpZ2hsaWdodGVyLnNob3cpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmlyc3QgY2hlY2sgaWYgaXQgaXMgaW4gYm91bmRpbmcgYm94CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGluc2lkZSA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh4PnMuX2JvdW5kaW5nQm94WzBdWzBdICYmIHg8cy5fYm91bmRpbmdCb3hbMV1bMF0gJiYgeT5zLl9ib3VuZGluZ0JveFsxXVsxXSAmJiB5PHMuX2JvdW5kaW5nQm94WzBdWzFdKSB7IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBub3cgY2hlY2sgdGhlIGNyb3NzaW5nIG51bWJlciAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG51bVBvaW50cyA9IHMuX2FyZWFQb2ludHMubGVuZ3RoOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaWk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBqID0gbnVtUG9pbnRzLTE7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IodmFyIGlpPTA7IGlpIDwgbnVtUG9pbnRzOyBpaSsrKSB7IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZlcnRleDEgPSBbcy5fYXJlYVBvaW50c1tpaV1bMF0sIHMuX2FyZWFQb2ludHNbaWldWzFdXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2ZXJ0ZXgyID0gW3MuX2FyZWFQb2ludHNbal1bMF0sIHMuX2FyZWFQb2ludHNbal1bMV1dOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2ZXJ0ZXgxWzFdIDwgeSAmJiB2ZXJ0ZXgyWzFdID49IHkgfHwgdmVydGV4MlsxXSA8IHkgJiYgdmVydGV4MVsxXSA+PSB5KSAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2ZXJ0ZXgxWzBdICsgKHkgLSB2ZXJ0ZXgxWzFdKSAvICh2ZXJ0ZXgyWzFdIC0gdmVydGV4MVsxXSkgKiAodmVydGV4MlswXSAtIHZlcnRleDFbMF0pIDwgeCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnNpZGUgPSAhaW5zaWRlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqID0gaWk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5zaWRlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7c2VyaWVzSW5kZXg6aSwgcG9pbnRJbmRleDpudWxsLCBncmlkRGF0YTpzLmdyaWREYXRhLCBkYXRhOnMuZGF0YSwgcG9pbnRzOnMuX2FyZWFQb2ludHN9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID0gcy5tYXJrZXJSZW5kZXJlci5zaXplLzIrcy5uZWlnaGJvclRocmVzaG9sZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlc2hvbGQgPSAodCA+IDApID8gdCA6IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaj0wOyBqPHMuZ3JpZERhdGEubGVuZ3RoOyBqKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcCA9IHMuZ3JpZERhdGFbal07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5laWdoYm9yIGxvb2tzIGRpZmZlcmVudCB0byBPSExDIGNoYXJ0LgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoci5jb25zdHJ1Y3RvciA9PSAkLmpxcGxvdC5PSExDUmVuZGVyZXIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyLmNhbmRsZVN0aWNrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHlwID0gcy5feWF4aXMuc2VyaWVzX3UycDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoeCA+PSBwWzBdLXIuX2JvZHlXaWR0aC8yICYmIHggPD0gcFswXStyLl9ib2R5V2lkdGgvMiAmJiB5ID49IHlwKHMuZGF0YVtqXVsyXSkgJiYgeSA8PSB5cChzLmRhdGFbal1bM10pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7c2VyaWVzSW5kZXg6IGksIHBvaW50SW5kZXg6aiwgZ3JpZERhdGE6cCwgZGF0YTpzLmRhdGFbal19OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIGFuIG9wZW4gaGkgbG93IGNsb3NlIGNoYXJ0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICghci5obGMpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB5cCA9IHMuX3lheGlzLnNlcmllc191MnA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHggPj0gcFswXS1yLl90aWNrTGVuZ3RoICYmIHggPD0gcFswXStyLl90aWNrTGVuZ3RoICYmIHkgPj0geXAocy5kYXRhW2pdWzJdKSAmJiB5IDw9IHlwKHMuZGF0YVtqXVszXSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtzZXJpZXNJbmRleDogaSwgcG9pbnRJbmRleDpqLCBncmlkRGF0YTpwLCBkYXRhOnMuZGF0YVtqXX07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYSBoaSBsb3cgY2xvc2UgY2hhcnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB5cCA9IHMuX3lheGlzLnNlcmllc191MnA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHggPj0gcFswXS1yLl90aWNrTGVuZ3RoICYmIHggPD0gcFswXStyLl90aWNrTGVuZ3RoICYmIHkgPj0geXAocy5kYXRhW2pdWzFdKSAmJiB5IDw9IHlwKHMuZGF0YVtqXVsyXSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtzZXJpZXNJbmRleDogaSwgcG9pbnRJbmRleDpqLCBncmlkRGF0YTpwLCBkYXRhOnMuZGF0YVtqXX07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocFswXSAhPSBudWxsICYmIHBbMV0gIT0gbnVsbCl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkID0gTWF0aC5zcXJ0KCAoeC1wWzBdKSAqICh4LXBbMF0pICsgKHktcFsxXSkgKiAoeS1wWzFdKSApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGQgPD0gdGhyZXNob2xkICYmIChkIDw9IGQwIHx8IGQwID09IG51bGwpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkMCA9IGQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge3Nlcmllc0luZGV4OiBpLCBwb2ludEluZGV4OmosIGdyaWREYXRhOnAsIGRhdGE6cy5kYXRhW2pdfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgIHggPSBncmlkcG9zLng7CiAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBncmlkcG9zLnk7CiAgICAgICAgICAgICAgICAgICAgICAgIHIgPSBzLnJlbmRlcmVyOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAocy5zaG93KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID0gcy5tYXJrZXJSZW5kZXJlci5zaXplLzIrcy5uZWlnaGJvclRocmVzaG9sZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVzaG9sZCA9ICh0ID4gMCkgPyB0IDogMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGo9MDsgajxzLmdyaWREYXRhLmxlbmd0aDsgaisrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcCA9IHMuZ3JpZERhdGFbal07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmVpZ2hib3IgbG9va3MgZGlmZmVyZW50IHRvIE9ITEMgY2hhcnQuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHIuY29uc3RydWN0b3IgPT0gJC5qcXBsb3QuT0hMQ1JlbmRlcmVyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyLmNhbmRsZVN0aWNrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgeXAgPSBzLl95YXhpcy5zZXJpZXNfdTJwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHggPj0gcFswXS1yLl9ib2R5V2lkdGgvMiAmJiB4IDw9IHBbMF0rci5fYm9keVdpZHRoLzIgJiYgeSA+PSB5cChzLmRhdGFbal1bMl0pICYmIHkgPD0geXAocy5kYXRhW2pdWzNdKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7c2VyaWVzSW5kZXg6IGksIHBvaW50SW5kZXg6aiwgZ3JpZERhdGE6cCwgZGF0YTpzLmRhdGFbal19OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIGFuIG9wZW4gaGkgbG93IGNsb3NlIGNoYXJ0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFyLmhsYyl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgeXAgPSBzLl95YXhpcy5zZXJpZXNfdTJwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHggPj0gcFswXS1yLl90aWNrTGVuZ3RoICYmIHggPD0gcFswXStyLl90aWNrTGVuZ3RoICYmIHkgPj0geXAocy5kYXRhW2pdWzJdKSAmJiB5IDw9IHlwKHMuZGF0YVtqXVszXSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge3Nlcmllc0luZGV4OiBpLCBwb2ludEluZGV4OmosIGdyaWREYXRhOnAsIGRhdGE6cy5kYXRhW2pdfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhIGhpIGxvdyBjbG9zZSBjaGFydAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB5cCA9IHMuX3lheGlzLnNlcmllc191MnA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoeCA+PSBwWzBdLXIuX3RpY2tMZW5ndGggJiYgeCA8PSBwWzBdK3IuX3RpY2tMZW5ndGggJiYgeSA+PSB5cChzLmRhdGFbal1bMV0pICYmIHkgPD0geXAocy5kYXRhW2pdWzJdKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7c2VyaWVzSW5kZXg6IGksIHBvaW50SW5kZXg6aiwgZ3JpZERhdGE6cCwgZGF0YTpzLmRhdGFbal19OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQgPSBNYXRoLnNxcnQoICh4LXBbMF0pICogKHgtcFswXSkgKyAoeS1wWzFdKSAqICh5LXBbMV0pICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkIDw9IHRocmVzaG9sZCAmJiAoZCA8PSBkMCB8fCBkMCA9PSBudWxsKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkMCA9IGQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7c2VyaWVzSW5kZXg6IGksIHBvaW50SW5kZXg6aiwgZ3JpZERhdGE6cCwgZGF0YTpzLmRhdGFbal19OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgIHRoaXMub25DbGljayA9IGZ1bmN0aW9uKGV2KSB7CiAgICAgICAgICAgIC8vIEV2ZW50IHBhc3NlZCBpbiBpcyBub3JtYWxpemVkIGFuZCB3aWxsIGhhdmUgZGF0YSBhdHRyaWJ1dGUuCiAgICAgICAgICAgIC8vIEV2ZW50IHBhc3NlZCBvdXQgaXMgdW5ub3JtYWxpemVkLgogICAgICAgICAgICB2YXIgcG9zaXRpb25zID0gZ2V0RXZlbnRQb3NpdGlvbihldik7CiAgICAgICAgICAgIHZhciBwID0gZXYuZGF0YS5wbG90OwogICAgICAgICAgICB2YXIgbmVpZ2hib3IgPSBjaGVja0ludGVyc2VjdGlvbihwb3NpdGlvbnMuZ3JpZFBvcywgcCk7CiAgICAgICAgICAgIHZhciBldnQgPSBqUXVlcnkuRXZlbnQoJ2pxcGxvdENsaWNrJyk7CiAgICAgICAgICAgIGV2dC5wYWdlWCA9IGV2LnBhZ2VYOwogICAgICAgICAgICBldnQucGFnZVkgPSBldi5wYWdlWTsKICAgICAgICAgICAgJCh0aGlzKS50cmlnZ2VyKGV2dCwgW3Bvc2l0aW9ucy5ncmlkUG9zLCBwb3NpdGlvbnMuZGF0YVBvcywgbmVpZ2hib3IsIHBdKTsKICAgICAgICB9OwogICAgICAgIAogICAgICAgIHRoaXMub25EYmxDbGljayA9IGZ1bmN0aW9uKGV2KSB7CiAgICAgICAgICAgIC8vIEV2ZW50IHBhc3NlZCBpbiBpcyBub3JtYWxpemVkIGFuZCB3aWxsIGhhdmUgZGF0YSBhdHRyaWJ1dGUuCiAgICAgICAgICAgIC8vIEV2ZW50IHBhc3NlZCBvdXQgaXMgdW5ub3JtYWxpemVkLgogICAgICAgICAgICB2YXIgcG9zaXRpb25zID0gZ2V0RXZlbnRQb3NpdGlvbihldik7CiAgICAgICAgICAgIHZhciBwID0gZXYuZGF0YS5wbG90OwogICAgICAgICAgICB2YXIgbmVpZ2hib3IgPSBjaGVja0ludGVyc2VjdGlvbihwb3NpdGlvbnMuZ3JpZFBvcywgcCk7CiAgICAgICAgICAgIHZhciBldnQgPSBqUXVlcnkuRXZlbnQoJ2pxcGxvdERibENsaWNrJyk7CiAgICAgICAgICAgIGV2dC5wYWdlWCA9IGV2LnBhZ2VYOwogICAgICAgICAgICBldnQucGFnZVkgPSBldi5wYWdlWTsKICAgICAgICAgICAgJCh0aGlzKS50cmlnZ2VyKGV2dCwgW3Bvc2l0aW9ucy5ncmlkUG9zLCBwb3NpdGlvbnMuZGF0YVBvcywgbmVpZ2hib3IsIHBdKTsKICAgICAgICB9OwogICAgICAgIAogICAgICAgIHRoaXMub25Nb3VzZURvd24gPSBmdW5jdGlvbihldikgewogICAgICAgICAgICB2YXIgcG9zaXRpb25zID0gZ2V0RXZlbnRQb3NpdGlvbihldik7CiAgICAgICAgICAgIHZhciBwID0gZXYuZGF0YS5wbG90OwogICAgICAgICAgICB2YXIgbmVpZ2hib3IgPSBjaGVja0ludGVyc2VjdGlvbihwb3NpdGlvbnMuZ3JpZFBvcywgcCk7CiAgICAgICAgICAgIHZhciBldnQgPSBqUXVlcnkuRXZlbnQoJ2pxcGxvdE1vdXNlRG93bicpOwogICAgICAgICAgICBldnQucGFnZVggPSBldi5wYWdlWDsKICAgICAgICAgICAgZXZ0LnBhZ2VZID0gZXYucGFnZVk7CiAgICAgICAgICAgICQodGhpcykudHJpZ2dlcihldnQsIFtwb3NpdGlvbnMuZ3JpZFBvcywgcG9zaXRpb25zLmRhdGFQb3MsIG5laWdoYm9yLCBwXSk7CiAgICAgICAgfTsKICAgICAgICAKICAgICAgICB0aGlzLm9uTW91c2VVcCA9IGZ1bmN0aW9uKGV2KSB7CiAgICAgICAgICAgIHZhciBwb3NpdGlvbnMgPSBnZXRFdmVudFBvc2l0aW9uKGV2KTsKICAgICAgICAgICAgdmFyIGV2dCA9IGpRdWVyeS5FdmVudCgnanFwbG90TW91c2VVcCcpOwogICAgICAgICAgICBldnQucGFnZVggPSBldi5wYWdlWDsKICAgICAgICAgICAgZXZ0LnBhZ2VZID0gZXYucGFnZVk7CiAgICAgICAgICAgICQodGhpcykudHJpZ2dlcihldnQsIFtwb3NpdGlvbnMuZ3JpZFBvcywgcG9zaXRpb25zLmRhdGFQb3MsIG51bGwsIGV2LmRhdGEucGxvdF0pOwogICAgICAgIH07CiAgICAgICAgCiAgICAgICAgdGhpcy5vblJpZ2h0Q2xpY2sgPSBmdW5jdGlvbihldikgewogICAgICAgICAgICB2YXIgcG9zaXRpb25zID0gZ2V0RXZlbnRQb3NpdGlvbihldik7CiAgICAgICAgICAgIHZhciBwID0gZXYuZGF0YS5wbG90OwogICAgICAgICAgICB2YXIgbmVpZ2hib3IgPSBjaGVja0ludGVyc2VjdGlvbihwb3NpdGlvbnMuZ3JpZFBvcywgcCk7CiAgICAgICAgICAgIGlmIChwLmNhcHR1cmVSaWdodENsaWNrKSB7CiAgICAgICAgICAgICAgICBpZiAoZXYud2hpY2ggPT0gMykgewogICAgICAgICAgICAgICAgdmFyIGV2dCA9IGpRdWVyeS5FdmVudCgnanFwbG90UmlnaHRDbGljaycpOwogICAgICAgICAgICAgICAgZXZ0LnBhZ2VYID0gZXYucGFnZVg7CiAgICAgICAgICAgICAgICBldnQucGFnZVkgPSBldi5wYWdlWTsKICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLnRyaWdnZXIoZXZ0LCBbcG9zaXRpb25zLmdyaWRQb3MsIHBvc2l0aW9ucy5kYXRhUG9zLCBuZWlnaGJvciwgcF0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICB2YXIgZXZ0ID0galF1ZXJ5LkV2ZW50KCdqcXBsb3RNb3VzZVVwJyk7CiAgICAgICAgICAgICAgICBldnQucGFnZVggPSBldi5wYWdlWDsKICAgICAgICAgICAgICAgIGV2dC5wYWdlWSA9IGV2LnBhZ2VZOwogICAgICAgICAgICAgICAgICAgICQodGhpcykudHJpZ2dlcihldnQsIFtwb3NpdGlvbnMuZ3JpZFBvcywgcG9zaXRpb25zLmRhdGFQb3MsIG5laWdoYm9yLCBwXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIAogICAgICAgIHRoaXMub25Nb3VzZU1vdmUgPSBmdW5jdGlvbihldikgewogICAgICAgICAgICB2YXIgcG9zaXRpb25zID0gZ2V0RXZlbnRQb3NpdGlvbihldik7CiAgICAgICAgICAgIHZhciBwID0gZXYuZGF0YS5wbG90OwogICAgICAgICAgICB2YXIgbmVpZ2hib3IgPSBjaGVja0ludGVyc2VjdGlvbihwb3NpdGlvbnMuZ3JpZFBvcywgcCk7CiAgICAgICAgICAgIHZhciBldnQgPSBqUXVlcnkuRXZlbnQoJ2pxcGxvdE1vdXNlTW92ZScpOwogICAgICAgICAgICBldnQucGFnZVggPSBldi5wYWdlWDsKICAgICAgICAgICAgZXZ0LnBhZ2VZID0gZXYucGFnZVk7CiAgICAgICAgICAgICQodGhpcykudHJpZ2dlcihldnQsIFtwb3NpdGlvbnMuZ3JpZFBvcywgcG9zaXRpb25zLmRhdGFQb3MsIG5laWdoYm9yLCBwXSk7CiAgICAgICAgfTsKICAgICAgICAKICAgICAgICB0aGlzLm9uTW91c2VFbnRlciA9IGZ1bmN0aW9uKGV2KSB7CiAgICAgICAgICAgIHZhciBwb3NpdGlvbnMgPSBnZXRFdmVudFBvc2l0aW9uKGV2KTsKICAgICAgICAgICAgdmFyIHAgPSBldi5kYXRhLnBsb3Q7CiAgICAgICAgICAgIHZhciBldnQgPSBqUXVlcnkuRXZlbnQoJ2pxcGxvdE1vdXNlRW50ZXInKTsKICAgICAgICAgICAgZXZ0LnBhZ2VYID0gZXYucGFnZVg7CiAgICAgICAgICAgIGV2dC5wYWdlWSA9IGV2LnBhZ2VZOwogICAgICAgICAgICBldnQucmVsYXRlZFRhcmdldCA9IGV2LnJlbGF0ZWRUYXJnZXQ7CiAgICAgICAgICAgICQodGhpcykudHJpZ2dlcihldnQsIFtwb3NpdGlvbnMuZ3JpZFBvcywgcG9zaXRpb25zLmRhdGFQb3MsIG51bGwsIHBdKTsKICAgICAgICB9OwogICAgICAgIAogICAgICAgIHRoaXMub25Nb3VzZUxlYXZlID0gZnVuY3Rpb24oZXYpIHsKICAgICAgICAgICAgdmFyIHBvc2l0aW9ucyA9IGdldEV2ZW50UG9zaXRpb24oZXYpOwogICAgICAgICAgICB2YXIgcCA9IGV2LmRhdGEucGxvdDsKICAgICAgICAgICAgdmFyIGV2dCA9IGpRdWVyeS5FdmVudCgnanFwbG90TW91c2VMZWF2ZScpOwogICAgICAgICAgICBldnQucGFnZVggPSBldi5wYWdlWDsKICAgICAgICAgICAgZXZ0LnBhZ2VZID0gZXYucGFnZVk7CiAgICAgICAgICAgIGV2dC5yZWxhdGVkVGFyZ2V0ID0gZXYucmVsYXRlZFRhcmdldDsKICAgICAgICAgICAgJCh0aGlzKS50cmlnZ2VyKGV2dCwgW3Bvc2l0aW9ucy5ncmlkUG9zLCBwb3NpdGlvbnMuZGF0YVBvcywgbnVsbCwgcF0pOwogICAgICAgIH07CiAgICAgICAgCiAgICAgICAgLy8gbWV0aG9kOiBkcmF3U2VyaWVzCiAgICAgICAgLy8gUmVkcmF3cyBhbGwgb3IganVzdCBvbmUgc2VyaWVzIG9uIHRoZSBwbG90LiAgTm8gYXhpcyBzY2FsaW5nCiAgICAgICAgLy8gaXMgcGVyZm9ybWVkIGFuZCBubyBvdGhlciBlbGVtZW50cyBvbiB0aGUgcGxvdCBhcmUgcmVkcmF3bi4KICAgICAgICAvLyBvcHRpb25zIGlzIGFuIG9wdGlvbnMgb2JqZWN0IHRvIHBhc3Mgb24gdG8gdGhlIHNlcmllcyByZW5kZXJlcnMuCiAgICAgICAgLy8gSXQgY2FuIGJlIGFuIGVtcHR5IG9iamVjdCB7fS4gIGlkeCBpcyB0aGUgc2VyaWVzIGluZGV4CiAgICAgICAgLy8gdG8gcmVkcmF3IGlmIG9ubHkgb25lIHNlcmllcyBpcyB0byBiZSByZWRyYXduLgogICAgICAgIHRoaXMuZHJhd1NlcmllcyA9IGZ1bmN0aW9uKG9wdGlvbnMsIGlkeCl7CiAgICAgICAgICAgIHZhciBpLCBzZXJpZXMsIGN0eDsKICAgICAgICAgICAgLy8gaWYgb25seSBvbmUgYXJndW1lbnQgcGFzc2VkIGluIGFuZCBpdCBpcyBhIG51bWJlciwgdXNlIGl0IGFkIGlkeC4KICAgICAgICAgICAgaWR4ID0gKHR5cGVvZihvcHRpb25zKSA9PT0gIm51bWJlciIgJiYgaWR4ID09IG51bGwpID8gb3B0aW9ucyA6IGlkeDsKICAgICAgICAgICAgb3B0aW9ucyA9ICh0eXBlb2Yob3B0aW9ucykgPT09ICJvYmplY3QiKSA/IG9wdGlvbnMgOiB7fTsKICAgICAgICAgICAgLy8gZHJhdyBzcGVjaWZpZWQgc2VyaWVzCiAgICAgICAgICAgIGlmIChpZHggIT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICBzZXJpZXMgPSB0aGlzLnNlcmllc1tpZHhdOwogICAgICAgICAgICAgICAgY3R4ID0gc2VyaWVzLnNoYWRvd0NhbnZhcy5fY3R4OwogICAgICAgICAgICAgICAgY3R4LmNsZWFyUmVjdCgwLCAwLCBjdHguY2FudmFzLndpZHRoLCBjdHguY2FudmFzLmhlaWdodCk7CiAgICAgICAgICAgICAgICBzZXJpZXMuZHJhd1NoYWRvdyhjdHgsIG9wdGlvbnMsIHRoaXMpOwogICAgICAgICAgICAgICAgY3R4ID0gc2VyaWVzLmNhbnZhcy5fY3R4OwogICAgICAgICAgICAgICAgY3R4LmNsZWFyUmVjdCgwLCAwLCBjdHguY2FudmFzLndpZHRoLCBjdHguY2FudmFzLmhlaWdodCk7CiAgICAgICAgICAgICAgICBzZXJpZXMuZHJhdyhjdHgsIG9wdGlvbnMsIHRoaXMpOwogICAgICAgICAgICAgICAgaWYgKHNlcmllcy5yZW5kZXJlci5jb25zdHJ1Y3RvciA9PSAkLmpxcGxvdC5CZXppZXJDdXJ2ZVJlbmRlcmVyKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGlkeCA8IHRoaXMuc2VyaWVzLmxlbmd0aCAtIDEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kcmF3U2VyaWVzKGlkeCsxKTsgCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIC8vIGlmIGNhbGwgc2VyaWVzIGRyYXdTaGFkb3cgbWV0aG9kIGZpcnN0LCBpbiBjYXNlIGFsbCBzZXJpZXMgc2hhZG93cwogICAgICAgICAgICAgICAgLy8gc2hvdWxkIGJlIGRyYXduIGJlZm9yZSBhbnkgc2VyaWVzLiAgVGhpcyB3aWxsIGVuc3VyZSwgbGlrZSBmb3IgCiAgICAgICAgICAgICAgICAvLyBzdGFja2VkIGJhciBwbG90cywgdGhhdCBzaGFkb3dzIGRvbid0IG92ZXJsYXAgc2VyaWVzLgogICAgICAgICAgICAgICAgZm9yIChpPTA7IGk8dGhpcy5zZXJpZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAvLyBmaXJzdCBjbGVhciB0aGUgY2FudmFzCiAgICAgICAgICAgICAgICAgICAgc2VyaWVzID0gdGhpcy5zZXJpZXNbaV07CiAgICAgICAgICAgICAgICAgICAgY3R4ID0gc2VyaWVzLnNoYWRvd0NhbnZhcy5fY3R4OwogICAgICAgICAgICAgICAgICAgIGN0eC5jbGVhclJlY3QoMCwgMCwgY3R4LmNhbnZhcy53aWR0aCwgY3R4LmNhbnZhcy5oZWlnaHQpOwogICAgICAgICAgICAgICAgICAgIHNlcmllcy5kcmF3U2hhZG93KGN0eCwgb3B0aW9ucywgdGhpcyk7CiAgICAgICAgICAgICAgICAgICAgY3R4ID0gc2VyaWVzLmNhbnZhcy5fY3R4OwogICAgICAgICAgICAgICAgICAgIGN0eC5jbGVhclJlY3QoMCwgMCwgY3R4LmNhbnZhcy53aWR0aCwgY3R4LmNhbnZhcy5oZWlnaHQpOwogICAgICAgICAgICAgICAgICAgIHNlcmllcy5kcmF3KGN0eCwgb3B0aW9ucywgdGhpcyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgb3B0aW9ucyA9IGlkeCA9IGkgPSBzZXJpZXMgPSBjdHggPSBudWxsOwogICAgICAgIH07CiAgICAgICAgCiAgICAgICAgLy8gbWV0aG9kOiBtb3ZlU2VyaWVzVG9Gcm9udAogICAgICAgIC8vIFRoaXMgbWV0aG9kIHJlcXVpcmVzIGpRdWVyeSAxLjQrCiAgICAgICAgLy8gTW92ZXMgdGhlIHNwZWNpZmllZCBzZXJpZXMgY2FudmFzIGluIGZyb250IG9mIGFsbCBvdGhlciBzZXJpZXMgY2FudmFzZXMuCiAgICAgICAgLy8gVGhpcyBlZmZlY3RpdmVseSAiZHJhd3MiIHRoZSBzcGVjaWZpZWQgc2VyaWVzIG9uIHRvcCBvZiBhbGwgb3RoZXIgc2VyaWVzLAogICAgICAgIC8vIGFsdGhvdWdoIGl0IGlzIHBlcmZvcm1lZCB0aHJvdWdoIERPTSBtYW5pcHVsYXRpb24sIG5vIHJlZHJhd2luZyBpcyBwZXJmb3JtZWQuCiAgICAgICAgLy8KICAgICAgICAvLyBQYXJhbWV0ZXJzOgogICAgICAgIC8vIGlkeCAtIDAgYmFzZWQgaW5kZXggb2YgdGhlIHNlcmllcyB0byBtb3ZlLiAgVGhpcyB3aWxsIGJlIHRoZSBpbmRleCBvZiB0aGUgc2VyaWVzCiAgICAgICAgLy8gYXMgaXQgd2FzIGZpcnN0IHBhc3NlZCBpbnRvIHRoZSBqcXBsb3QgZnVuY3Rpb24uCiAgICAgICAgdGhpcy5tb3ZlU2VyaWVzVG9Gcm9udCA9IGZ1bmN0aW9uIChpZHgpIHsgCiAgICAgICAgICAgIGlkeCA9IHBhcnNlSW50KGlkeCwgMTApOwogICAgICAgICAgICB2YXIgc3RhY2tJbmRleCA9ICQuaW5BcnJheShpZHgsIHRoaXMuc2VyaWVzU3RhY2spOwogICAgICAgICAgICAvLyBpZiBhbHJlYWR5IGluIGZyb250LCByZXR1cm4KICAgICAgICAgICAgaWYgKHN0YWNrSW5kZXggPT0gLTEpIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoc3RhY2tJbmRleCA9PSB0aGlzLnNlcmllc1N0YWNrLmxlbmd0aCAtMSkgewogICAgICAgICAgICAgICAgdGhpcy5wcmV2aW91c1Nlcmllc1N0YWNrID0gdGhpcy5zZXJpZXNTdGFjay5zbGljZSgwKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgb3BpZHggPSB0aGlzLnNlcmllc1N0YWNrW3RoaXMuc2VyaWVzU3RhY2subGVuZ3RoIC0xXTsKICAgICAgICAgICAgdmFyIHNlcmVsZW0gPSB0aGlzLnNlcmllc1tpZHhdLmNhbnZhcy5fZWxlbS5kZXRhY2goKTsKICAgICAgICAgICAgdmFyIHNoYWRlbGVtID0gdGhpcy5zZXJpZXNbaWR4XS5zaGFkb3dDYW52YXMuX2VsZW0uZGV0YWNoKCk7CiAgICAgICAgICAgIHRoaXMuc2VyaWVzW29waWR4XS5zaGFkb3dDYW52YXMuX2VsZW0uYWZ0ZXIoc2hhZGVsZW0pOwogICAgICAgICAgICB0aGlzLnNlcmllc1tvcGlkeF0uY2FudmFzLl9lbGVtLmFmdGVyKHNlcmVsZW0pOwogICAgICAgICAgICB0aGlzLnByZXZpb3VzU2VyaWVzU3RhY2sgPSB0aGlzLnNlcmllc1N0YWNrLnNsaWNlKDApOwogICAgICAgICAgICB0aGlzLnNlcmllc1N0YWNrLnNwbGljZShzdGFja0luZGV4LCAxKTsKICAgICAgICAgICAgdGhpcy5zZXJpZXNTdGFjay5wdXNoKGlkeCk7CiAgICAgICAgfTsKICAgICAgICAKICAgICAgICAvLyBtZXRob2Q6IG1vdmVTZXJpZXNUb0JhY2sKICAgICAgICAvLyBUaGlzIG1ldGhvZCByZXF1aXJlcyBqUXVlcnkgMS40KwogICAgICAgIC8vIE1vdmVzIHRoZSBzcGVjaWZpZWQgc2VyaWVzIGNhbnZhcyBiZWhpbmQgYWxsIG90aGVyIHNlcmllcyBjYW52YXNlcy4KICAgICAgICAvLwogICAgICAgIC8vIFBhcmFtZXRlcnM6CiAgICAgICAgLy8gaWR4IC0gMCBiYXNlZCBpbmRleCBvZiB0aGUgc2VyaWVzIHRvIG1vdmUuICBUaGlzIHdpbGwgYmUgdGhlIGluZGV4IG9mIHRoZSBzZXJpZXMKICAgICAgICAvLyBhcyBpdCB3YXMgZmlyc3QgcGFzc2VkIGludG8gdGhlIGpxcGxvdCBmdW5jdGlvbi4KICAgICAgICB0aGlzLm1vdmVTZXJpZXNUb0JhY2sgPSBmdW5jdGlvbiAoaWR4KSB7CiAgICAgICAgICAgIGlkeCA9IHBhcnNlSW50KGlkeCwgMTApOwogICAgICAgICAgICB2YXIgc3RhY2tJbmRleCA9ICQuaW5BcnJheShpZHgsIHRoaXMuc2VyaWVzU3RhY2spOwogICAgICAgICAgICAvLyBpZiBhbHJlYWR5IGluIGJhY2ssIHJldHVybgogICAgICAgICAgICBpZiAoc3RhY2tJbmRleCA9PSAwIHx8IHN0YWNrSW5kZXggPT0gLTEpIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgb3BpZHggPSB0aGlzLnNlcmllc1N0YWNrWzBdOwogICAgICAgICAgICB2YXIgc2VyZWxlbSA9IHRoaXMuc2VyaWVzW2lkeF0uY2FudmFzLl9lbGVtLmRldGFjaCgpOwogICAgICAgICAgICB2YXIgc2hhZGVsZW0gPSB0aGlzLnNlcmllc1tpZHhdLnNoYWRvd0NhbnZhcy5fZWxlbS5kZXRhY2goKTsKICAgICAgICAgICAgdGhpcy5zZXJpZXNbb3BpZHhdLnNoYWRvd0NhbnZhcy5fZWxlbS5iZWZvcmUoc2hhZGVsZW0pOwogICAgICAgICAgICB0aGlzLnNlcmllc1tvcGlkeF0uY2FudmFzLl9lbGVtLmJlZm9yZShzZXJlbGVtKTsKICAgICAgICAgICAgdGhpcy5wcmV2aW91c1Nlcmllc1N0YWNrID0gdGhpcy5zZXJpZXNTdGFjay5zbGljZSgwKTsKICAgICAgICAgICAgdGhpcy5zZXJpZXNTdGFjay5zcGxpY2Uoc3RhY2tJbmRleCwgMSk7CiAgICAgICAgICAgIHRoaXMuc2VyaWVzU3RhY2sudW5zaGlmdChpZHgpOwogICAgICAgIH07CiAgICAgICAgCiAgICAgICAgLy8gbWV0aG9kOiByZXN0b3JlUHJldmlvdXNTZXJpZXNPcmRlcgogICAgICAgIC8vIFRoaXMgbWV0aG9kIHJlcXVpcmVzIGpRdWVyeSAxLjQrCiAgICAgICAgLy8gUmVzdG9yZSB0aGUgc2VyaWVzIGNhbnZhcyBvcmRlciB0byBpdHMgcHJldmlvdXMgc3RhdGUuCiAgICAgICAgLy8gVXNlZnVsIHRvIHB1dCBhIHNlcmllcyBiYWNrIHdoZXJlIGl0IGJlbG9uZ3MgYWZ0ZXIgbW92aW5nCiAgICAgICAgLy8gaXQgdG8gdGhlIGZyb250LgogICAgICAgIHRoaXMucmVzdG9yZVByZXZpb3VzU2VyaWVzT3JkZXIgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBpLCBqLCBzZXJlbGVtLCBzaGFkZWxlbSwgdGVtcCwgbW92ZSwga2VlcDsKICAgICAgICAgICAgLy8gaWYgbm8gY2hhbmdlLCByZXR1cm4uCiAgICAgICAgICAgIGlmICh0aGlzLnNlcmllc1N0YWNrID09IHRoaXMucHJldmlvdXNTZXJpZXNTdGFjaykgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvciAoaT0xOyBpPHRoaXMucHJldmlvdXNTZXJpZXNTdGFjay5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgbW92ZSA9IHRoaXMucHJldmlvdXNTZXJpZXNTdGFja1tpXTsKICAgICAgICAgICAgICAgIGtlZXAgPSB0aGlzLnByZXZpb3VzU2VyaWVzU3RhY2tbaS0xXTsKICAgICAgICAgICAgICAgIHNlcmVsZW0gPSB0aGlzLnNlcmllc1ttb3ZlXS5jYW52YXMuX2VsZW0uZGV0YWNoKCk7CiAgICAgICAgICAgICAgICBzaGFkZWxlbSA9IHRoaXMuc2VyaWVzW21vdmVdLnNoYWRvd0NhbnZhcy5fZWxlbS5kZXRhY2goKTsKICAgICAgICAgICAgICAgIHRoaXMuc2VyaWVzW2tlZXBdLnNoYWRvd0NhbnZhcy5fZWxlbS5hZnRlcihzaGFkZWxlbSk7CiAgICAgICAgICAgICAgICB0aGlzLnNlcmllc1trZWVwXS5jYW52YXMuX2VsZW0uYWZ0ZXIoc2VyZWxlbSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGVtcCA9IHRoaXMuc2VyaWVzU3RhY2suc2xpY2UoMCk7CiAgICAgICAgICAgIHRoaXMuc2VyaWVzU3RhY2sgPSB0aGlzLnByZXZpb3VzU2VyaWVzU3RhY2suc2xpY2UoMCk7CiAgICAgICAgICAgIHRoaXMucHJldmlvdXNTZXJpZXNTdGFjayA9IHRlbXA7CiAgICAgICAgfTsKICAgICAgICAKICAgICAgICAvLyBtZXRob2Q6IHJlc3RvcmVPcmlnaW5hbFNlcmllc09yZGVyCiAgICAgICAgLy8gVGhpcyBtZXRob2QgcmVxdWlyZXMgalF1ZXJ5IDEuNCsKICAgICAgICAvLyBSZXN0b3JlIHRoZSBzZXJpZXMgY2FudmFzIG9yZGVyIHRvIGl0cyBvcmlnaW5hbCBvcmRlcgogICAgICAgIC8vIHdoZW4gdGhlIHBsb3Qgd2FzIGNyZWF0ZWQuCiAgICAgICAgdGhpcy5yZXN0b3JlT3JpZ2luYWxTZXJpZXNPcmRlciA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIGksIGosIGFycj1bXSwgc2VyZWxlbSwgc2hhZGVsZW07CiAgICAgICAgICAgIGZvciAoaT0wOyBpPHRoaXMuc2VyaWVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICBhcnIucHVzaChpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGhpcy5zZXJpZXNTdGFjayA9PSBhcnIpIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLnByZXZpb3VzU2VyaWVzU3RhY2sgPSB0aGlzLnNlcmllc1N0YWNrLnNsaWNlKDApOwogICAgICAgICAgICB0aGlzLnNlcmllc1N0YWNrID0gYXJyOwogICAgICAgICAgICBmb3IgKGk9MTsgaTx0aGlzLnNlcmllc1N0YWNrLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICBzZXJlbGVtID0gdGhpcy5zZXJpZXNbaV0uY2FudmFzLl9lbGVtLmRldGFjaCgpOwogICAgICAgICAgICAgICAgc2hhZGVsZW0gPSB0aGlzLnNlcmllc1tpXS5zaGFkb3dDYW52YXMuX2VsZW0uZGV0YWNoKCk7CiAgICAgICAgICAgICAgICB0aGlzLnNlcmllc1tpLTFdLnNoYWRvd0NhbnZhcy5fZWxlbS5hZnRlcihzaGFkZWxlbSk7CiAgICAgICAgICAgICAgICB0aGlzLnNlcmllc1tpLTFdLmNhbnZhcy5fZWxlbS5hZnRlcihzZXJlbGVtKTsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgCiAgICAgICAgdGhpcy5hY3RpdmF0ZVRoZW1lID0gZnVuY3Rpb24gKG5hbWUpIHsKICAgICAgICAgICAgdGhpcy50aGVtZUVuZ2luZS5hY3RpdmF0ZSh0aGlzLCBuYW1lKTsKICAgICAgICB9OwogICAgfQogICAgCiAgICAKICAgIC8vIGNvbnB1dGUgYSBoaWdobGlnaHQgY29sb3Igb3IgYXJyYXkgb2YgaGlnaGxpZ2h0IGNvbG9ycyBmcm9tIGdpdmVuIGNvbG9ycy4KICAgICQuanFwbG90LmNvbXB1dGVIaWdobGlnaHRDb2xvcnMgID0gZnVuY3Rpb24oY29sb3JzKSB7CiAgICAgICAgdmFyIHJldDsKICAgICAgICBpZiAoalF1ZXJ5LmlzQXJyYXkoY29sb3JzKSkgewogICAgICAgICAgICByZXQgPSBbXTsKICAgICAgICAgICAgZm9yICh2YXIgaT0wOyBpPGNvbG9ycy5sZW5ndGg7IGkrKyl7CiAgICAgICAgICAgICAgICB2YXIgcmdiYSA9ICQuanFwbG90LmdldENvbG9yQ29tcG9uZW50cyhjb2xvcnNbaV0pOwogICAgICAgICAgICAgICAgdmFyIG5ld3JnYiA9IFtyZ2JhWzBdLCByZ2JhWzFdLCByZ2JhWzJdXTsKICAgICAgICAgICAgICAgIHZhciBzdW0gPSBuZXdyZ2JbMF0gKyBuZXdyZ2JbMV0gKyBuZXdyZ2JbMl07CiAgICAgICAgICAgICAgICBmb3IgKHZhciBqPTA7IGo8MzsgaisrKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gd2hlbiBkYXJrZW5pbmcsIGxvd2VzdCBjb2xvciBjb21wb25lbnQgY2FuIGJlIGlzIDYwLgogICAgICAgICAgICAgICAgICAgIG5ld3JnYltqXSA9IChzdW0gPiA2NjApID8gIG5ld3JnYltqXSAqIDAuODUgOiAwLjczICogbmV3cmdiW2pdICsgOTA7CiAgICAgICAgICAgICAgICAgICAgbmV3cmdiW2pdID0gcGFyc2VJbnQobmV3cmdiW2pdLCAxMCk7CiAgICAgICAgICAgICAgICAgICAgKG5ld3JnYltqXSA+IDI1NSkgPyAyNTUgOiBuZXdyZ2Jbal07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvLyBuZXdyZ2JbM10gPSAocmdiYVszXSA+IDAuNCkgPyByZ2JhWzNdICogMC40IDogcmdiYVszXSAqIDEuNTsKICAgICAgICAgICAgICAgIC8vIG5ld3JnYlszXSA9IChyZ2JhWzNdID4gMC41KSA/IDAuOCAqIHJnYmFbM10gLSAuMSA6IHJnYmFbM10gKyAwLjI7CiAgICAgICAgICAgICAgICBuZXdyZ2JbM10gPSAwLjMgKyAwLjM1ICogcmdiYVszXTsKICAgICAgICAgICAgICAgIHJldC5wdXNoKCdyZ2JhKCcrbmV3cmdiWzBdKycsJytuZXdyZ2JbMV0rJywnK25ld3JnYlsyXSsnLCcrbmV3cmdiWzNdKycpJyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHZhciByZ2JhID0gJC5qcXBsb3QuZ2V0Q29sb3JDb21wb25lbnRzKGNvbG9ycyk7CiAgICAgICAgICAgIHZhciBuZXdyZ2IgPSBbcmdiYVswXSwgcmdiYVsxXSwgcmdiYVsyXV07CiAgICAgICAgICAgIHZhciBzdW0gPSBuZXdyZ2JbMF0gKyBuZXdyZ2JbMV0gKyBuZXdyZ2JbMl07CiAgICAgICAgICAgIGZvciAodmFyIGo9MDsgajwzOyBqKyspIHsKICAgICAgICAgICAgICAgIC8vIHdoZW4gZGFya2VuaW5nLCBsb3dlc3QgY29sb3IgY29tcG9uZW50IGNhbiBiZSBpcyA2MC4KICAgICAgICAgICAgICAgIC8vIG5ld3JnYltqXSA9IChzdW0gPiA1NzApID8gIG5ld3JnYltqXSAqIDAuOCA6IG5ld3JnYltqXSArIDAuMyAqICgyNTUgLSBuZXdyZ2Jbal0pOwogICAgICAgICAgICAgICAgLy8gbmV3cmdiW2pdID0gcGFyc2VJbnQobmV3cmdiW2pdLCAxMCk7CiAgICAgICAgICAgICAgICBuZXdyZ2Jbal0gPSAoc3VtID4gNjYwKSA/ICBuZXdyZ2Jbal0gKiAwLjg1IDogMC43MyAqIG5ld3JnYltqXSArIDkwOwogICAgICAgICAgICAgICAgbmV3cmdiW2pdID0gcGFyc2VJbnQobmV3cmdiW2pdLCAxMCk7CiAgICAgICAgICAgICAgICAobmV3cmdiW2pdID4gMjU1KSA/IDI1NSA6IG5ld3JnYltqXTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBuZXdyZ2JbM10gPSAocmdiYVszXSA+IDAuNCkgPyByZ2JhWzNdICogMC40IDogcmdiYVszXSAqIDEuNTsKICAgICAgICAgICAgLy8gbmV3cmdiWzNdID0gKHJnYmFbM10gPiAwLjUpID8gMC44ICogcmdiYVszXSAtIC4xIDogcmdiYVszXSArIDAuMjsKICAgICAgICAgICAgbmV3cmdiWzNdID0gMC4zICsgMC4zNSAqIHJnYmFbM107CiAgICAgICAgICAgIHJldCA9ICdyZ2JhKCcrbmV3cmdiWzBdKycsJytuZXdyZ2JbMV0rJywnK25ld3JnYlsyXSsnLCcrbmV3cmdiWzNdKycpJzsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJldDsKICAgIH07CiAgICAgICAgCiAgICQuanFwbG90LkNvbG9yR2VuZXJhdG9yID0gZnVuY3Rpb24oY29sb3JzKSB7CiAgICAgICAgY29sb3JzID0gY29sb3JzIHx8ICQuanFwbG90LmNvbmZpZy5kZWZhdWx0Q29sb3JzOwogICAgICAgIHZhciBpZHggPSAwOwogICAgICAgIAogICAgICAgIHRoaXMubmV4dCA9IGZ1bmN0aW9uICgpIHsgCiAgICAgICAgICAgIGlmIChpZHggPCBjb2xvcnMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gY29sb3JzW2lkeCsrXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGlkeCA9IDA7CiAgICAgICAgICAgICAgICByZXR1cm4gY29sb3JzW2lkeCsrXTsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgCiAgICAgICAgdGhpcy5wcmV2aW91cyA9IGZ1bmN0aW9uICgpIHsgCiAgICAgICAgICAgIGlmIChpZHggPiAwKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gY29sb3JzW2lkeC0tXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGlkeCA9IGNvbG9ycy5sZW5ndGgtMTsKICAgICAgICAgICAgICAgIHJldHVybiBjb2xvcnNbaWR4XTsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgCiAgICAgICAgLy8gZ2V0IGEgY29sb3IgYnkgaW5kZXggd2l0aG91dCBhZHZhbmNpbmcgcG9pbnRlci4KICAgICAgICB0aGlzLmdldCA9IGZ1bmN0aW9uKGkpIHsKICAgICAgICAgICAgdmFyIGlkeCA9IGkgLSBjb2xvcnMubGVuZ3RoICogTWF0aC5mbG9vcihpL2NvbG9ycy5sZW5ndGgpOwogICAgICAgICAgICByZXR1cm4gY29sb3JzW2lkeF07CiAgICAgICAgfTsKICAgICAgICAKICAgICAgICB0aGlzLnNldENvbG9ycyA9IGZ1bmN0aW9uKGMpIHsKICAgICAgICAgICAgY29sb3JzID0gYzsKICAgICAgICB9OwogICAgICAgIAogICAgICAgIHRoaXMucmVzZXQgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgaWR4ID0gMDsKICAgICAgICB9OwoKICAgICAgICB0aGlzLmdldEluZGV4ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBpZHg7CiAgICAgICAgfTsKCiAgICAgICAgdGhpcy5zZXRJbmRleCA9IGZ1bmN0aW9uKGluZGV4KSB7CiAgICAgICAgICAgIGlkeCA9IGluZGV4OwogICAgICAgIH07CiAgICB9OwoKICAgIC8vIGNvbnZlcnQgYSBoZXggY29sb3Igc3RyaW5nIHRvIHJnYiBzdHJpbmcuCiAgICAvLyBoIC0gMyBvciA2IGNoYXJhY3RlciBoZXggc3RyaW5nLCB3aXRoIG9yIHdpdGhvdXQgbGVhZGluZyAjCiAgICAvLyBhIC0gb3B0aW9uYWwgYWxwaGEKICAgICQuanFwbG90LmhleDJyZ2IgPSBmdW5jdGlvbihoLCBhKSB7CiAgICAgICAgaCA9IGgucmVwbGFjZSgnIycsICcnKTsKICAgICAgICBpZiAoaC5sZW5ndGggPT0gMykgewogICAgICAgICAgICBoID0gaC5jaGFyQXQoMCkraC5jaGFyQXQoMCkraC5jaGFyQXQoMSkraC5jaGFyQXQoMSkraC5jaGFyQXQoMikraC5jaGFyQXQoMik7CiAgICAgICAgfQogICAgICAgIHZhciByZ2I7CiAgICAgICAgcmdiID0gJ3JnYmEoJytwYXJzZUludChoLnNsaWNlKDAsMiksIDE2KSsnLCAnK3BhcnNlSW50KGguc2xpY2UoMiw0KSwgMTYpKycsICcrcGFyc2VJbnQoaC5zbGljZSg0LDYpLCAxNik7CiAgICAgICAgaWYgKGEpIHsKICAgICAgICAgICAgcmdiICs9ICcsICcrYTsKICAgICAgICB9CiAgICAgICAgcmdiICs9ICcpJzsKICAgICAgICByZXR1cm4gcmdiOwogICAgfTsKICAgIAogICAgLy8gY29udmVydCBhbiByZ2IgY29sb3Igc3BlYyB0byBhIGhleCBzcGVjLiAgaWdub3JlIGFueSBhbHBoYSBzcGVjaWZpY2F0aW9uLgogICAgJC5qcXBsb3QucmdiMmhleCA9IGZ1bmN0aW9uKHMpIHsKICAgICAgICB2YXIgcGF0ID0gL3JnYmE/XCggKihbMC05XXsxLDN9XC4/WzAtOV0qJT8pICosICooWzAtOV17MSwzfVwuP1swLTldKiU/KSAqLCAqKFswLTldezEsM31cLj9bMC05XSolPykgKig/OiwgKlswLTkuXSopP1wpLzsKICAgICAgICB2YXIgbSA9IHMubWF0Y2gocGF0KTsKICAgICAgICB2YXIgaCA9ICcjJzsKICAgICAgICBmb3IgKHZhciBpPTE7IGk8NDsgaSsrKSB7CiAgICAgICAgICAgIHZhciB0ZW1wOwogICAgICAgICAgICBpZiAobVtpXS5zZWFyY2goLyUvKSAhPSAtMSkgewogICAgICAgICAgICAgICAgdGVtcCA9IHBhcnNlSW50KDI1NSptW2ldLzEwMCwgMTApLnRvU3RyaW5nKDE2KTsKICAgICAgICAgICAgICAgIGlmICh0ZW1wLmxlbmd0aCA9PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgdGVtcCA9ICcwJyt0ZW1wOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgdGVtcCA9IHBhcnNlSW50KG1baV0sIDEwKS50b1N0cmluZygxNik7CiAgICAgICAgICAgICAgICBpZiAodGVtcC5sZW5ndGggPT0gMSkgewogICAgICAgICAgICAgICAgICAgIHRlbXAgPSAnMCcrdGVtcDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBoICs9IHRlbXA7CiAgICAgICAgfQogICAgICAgIHJldHVybiBoOwogICAgfTsKICAgIAogICAgLy8gZ2l2ZW4gYSBjc3MgY29sb3Igc3BlYywgcmV0dXJuIGFuIHJnYiBjc3MgY29sb3Igc3BlYwogICAgJC5qcXBsb3Qubm9ybWFsaXplMnJnYiA9IGZ1bmN0aW9uKHMsIGEpIHsKICAgICAgICBpZiAocy5zZWFyY2goL14gKnJnYmE/XCgvKSAhPSAtMSkgewogICAgICAgICAgICByZXR1cm4gczsgCiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHMuc2VhcmNoKC9eICojP1swLTlhLWZBLUZdP1swLTlhLWZBLUZdLykgIT0gLTEpIHsKICAgICAgICAgICAgcmV0dXJuICQuanFwbG90LmhleDJyZ2IocywgYSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICB0aHJvdyAnaW52YWxpZCBjb2xvciBzcGVjJzsKICAgICAgICB9CiAgICB9OwogICAgCiAgICAvLyBleHRyYWN0IHRoZSByLCBnLCBiLCBhIGNvbG9yIGNvbXBvbmVudHMgb3V0IG9mIGEgY3NzIGNvbG9yIHNwZWMuCiAgICAkLmpxcGxvdC5nZXRDb2xvckNvbXBvbmVudHMgPSBmdW5jdGlvbihzKSB7CiAgICAgICAgLy8gY2hlY2sgdG8gc2VlIGlmIGEgY29sb3Iga2V5d29yZC4KICAgICAgICBzID0gJC5qcXBsb3QuY29sb3JLZXl3b3JkTWFwW3NdIHx8IHM7CiAgICAgICAgdmFyIHJnYiA9ICQuanFwbG90Lm5vcm1hbGl6ZTJyZ2Iocyk7CiAgICAgICAgdmFyIHBhdCA9IC9yZ2JhP1woICooWzAtOV17MSwzfVwuP1swLTldKiU/KSAqLCAqKFswLTldezEsM31cLj9bMC05XSolPykgKiwgKihbMC05XXsxLDN9XC4/WzAtOV0qJT8pICosPyAqKFswLTkuXSogKik/XCkvOwogICAgICAgIHZhciBtID0gcmdiLm1hdGNoKHBhdCk7CiAgICAgICAgdmFyIHJldCA9IFtdOwogICAgICAgIGZvciAodmFyIGk9MTsgaTw0OyBpKyspIHsKICAgICAgICAgICAgaWYgKG1baV0uc2VhcmNoKC8lLykgIT0gLTEpIHsKICAgICAgICAgICAgICAgIHJldFtpLTFdID0gcGFyc2VJbnQoMjU1Km1baV0vMTAwLCAxMCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICByZXRbaS0xXSA9IHBhcnNlSW50KG1baV0sIDEwKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXRbM10gPSBwYXJzZUZsb2F0KG1bNF0pID8gcGFyc2VGbG9hdChtWzRdKSA6IDEuMDsKICAgICAgICByZXR1cm4gcmV0OwogICAgfTsKICAgIAogICAgJC5qcXBsb3QuY29sb3JLZXl3b3JkTWFwID0gewogICAgICAgIGFsaWNlYmx1ZTogJ3JnYigyNDAsIDI0OCwgMjU1KScsCiAgICAgICAgYW50aXF1ZXdoaXRlOiAncmdiKDI1MCwgMjM1LCAyMTUpJywKICAgICAgICBhcXVhOiAncmdiKCAwLCAyNTUsIDI1NSknLAogICAgICAgIGFxdWFtYXJpbmU6ICdyZ2IoMTI3LCAyNTUsIDIxMiknLAogICAgICAgIGF6dXJlOiAncmdiKDI0MCwgMjU1LCAyNTUpJywKICAgICAgICBiZWlnZTogJ3JnYigyNDUsIDI0NSwgMjIwKScsCiAgICAgICAgYmlzcXVlOiAncmdiKDI1NSwgMjI4LCAxOTYpJywKICAgICAgICBibGFjazogJ3JnYiggMCwgMCwgMCknLAogICAgICAgIGJsYW5jaGVkYWxtb25kOiAncmdiKDI1NSwgMjM1LCAyMDUpJywKICAgICAgICBibHVlOiAncmdiKCAwLCAwLCAyNTUpJywKICAgICAgICBibHVldmlvbGV0OiAncmdiKDEzOCwgNDMsIDIyNiknLAogICAgICAgIGJyb3duOiAncmdiKDE2NSwgNDIsIDQyKScsCiAgICAgICAgYnVybHl3b29kOiAncmdiKDIyMiwgMTg0LCAxMzUpJywKICAgICAgICBjYWRldGJsdWU6ICdyZ2IoIDk1LCAxNTgsIDE2MCknLAogICAgICAgIGNoYXJ0cmV1c2U6ICdyZ2IoMTI3LCAyNTUsIDApJywKICAgICAgICBjaG9jb2xhdGU6ICdyZ2IoMjEwLCAxMDUsIDMwKScsCiAgICAgICAgY29yYWw6ICdyZ2IoMjU1LCAxMjcsIDgwKScsCiAgICAgICAgY29ybmZsb3dlcmJsdWU6ICdyZ2IoMTAwLCAxNDksIDIzNyknLAogICAgICAgIGNvcm5zaWxrOiAncmdiKDI1NSwgMjQ4LCAyMjApJywKICAgICAgICBjcmltc29uOiAncmdiKDIyMCwgMjAsIDYwKScsCiAgICAgICAgY3lhbjogJ3JnYiggMCwgMjU1LCAyNTUpJywKICAgICAgICBkYXJrYmx1ZTogJ3JnYiggMCwgMCwgMTM5KScsCiAgICAgICAgZGFya2N5YW46ICdyZ2IoIDAsIDEzOSwgMTM5KScsCiAgICAgICAgZGFya2dvbGRlbnJvZDogJ3JnYigxODQsIDEzNCwgMTEpJywKICAgICAgICBkYXJrZ3JheTogJ3JnYigxNjksIDE2OSwgMTY5KScsCiAgICAgICAgZGFya2dyZWVuOiAncmdiKCAwLCAxMDAsIDApJywKICAgICAgICBkYXJrZ3JleTogJ3JnYigxNjksIDE2OSwgMTY5KScsCiAgICAgICAgZGFya2toYWtpOiAncmdiKDE4OSwgMTgzLCAxMDcpJywKICAgICAgICBkYXJrbWFnZW50YTogJ3JnYigxMzksIDAsIDEzOSknLAogICAgICAgIGRhcmtvbGl2ZWdyZWVuOiAncmdiKCA4NSwgMTA3LCA0NyknLAogICAgICAgIGRhcmtvcmFuZ2U6ICdyZ2IoMjU1LCAxNDAsIDApJywKICAgICAgICBkYXJrb3JjaGlkOiAncmdiKDE1MywgNTAsIDIwNCknLAogICAgICAgIGRhcmtyZWQ6ICdyZ2IoMTM5LCAwLCAwKScsCiAgICAgICAgZGFya3NhbG1vbjogJ3JnYigyMzMsIDE1MCwgMTIyKScsCiAgICAgICAgZGFya3NlYWdyZWVuOiAncmdiKDE0MywgMTg4LCAxNDMpJywKICAgICAgICBkYXJrc2xhdGVibHVlOiAncmdiKCA3MiwgNjEsIDEzOSknLAogICAgICAgIGRhcmtzbGF0ZWdyYXk6ICdyZ2IoIDQ3LCA3OSwgNzkpJywKICAgICAgICBkYXJrc2xhdGVncmV5OiAncmdiKCA0NywgNzksIDc5KScsCiAgICAgICAgZGFya3R1cnF1b2lzZTogJ3JnYiggMCwgMjA2LCAyMDkpJywKICAgICAgICBkYXJrdmlvbGV0OiAncmdiKDE0OCwgMCwgMjExKScsCiAgICAgICAgZGVlcHBpbms6ICdyZ2IoMjU1LCAyMCwgMTQ3KScsCiAgICAgICAgZGVlcHNreWJsdWU6ICdyZ2IoIDAsIDE5MSwgMjU1KScsCiAgICAgICAgZGltZ3JheTogJ3JnYigxMDUsIDEwNSwgMTA1KScsCiAgICAgICAgZGltZ3JleTogJ3JnYigxMDUsIDEwNSwgMTA1KScsCiAgICAgICAgZG9kZ2VyYmx1ZTogJ3JnYiggMzAsIDE0NCwgMjU1KScsCiAgICAgICAgZmlyZWJyaWNrOiAncmdiKDE3OCwgMzQsIDM0KScsCiAgICAgICAgZmxvcmFsd2hpdGU6ICdyZ2IoMjU1LCAyNTAsIDI0MCknLAogICAgICAgIGZvcmVzdGdyZWVuOiAncmdiKCAzNCwgMTM5LCAzNCknLAogICAgICAgIGZ1Y2hzaWE6ICdyZ2IoMjU1LCAwLCAyNTUpJywKICAgICAgICBnYWluc2Jvcm86ICdyZ2IoMjIwLCAyMjAsIDIyMCknLAogICAgICAgIGdob3N0d2hpdGU6ICdyZ2IoMjQ4LCAyNDgsIDI1NSknLAogICAgICAgIGdvbGQ6ICdyZ2IoMjU1LCAyMTUsIDApJywKICAgICAgICBnb2xkZW5yb2Q6ICdyZ2IoMjE4LCAxNjUsIDMyKScsCiAgICAgICAgZ3JheTogJ3JnYigxMjgsIDEyOCwgMTI4KScsCiAgICAgICAgZ3JleTogJ3JnYigxMjgsIDEyOCwgMTI4KScsCiAgICAgICAgZ3JlZW46ICdyZ2IoIDAsIDEyOCwgMCknLAogICAgICAgIGdyZWVueWVsbG93OiAncmdiKDE3MywgMjU1LCA0NyknLAogICAgICAgIGhvbmV5ZGV3OiAncmdiKDI0MCwgMjU1LCAyNDApJywKICAgICAgICBob3RwaW5rOiAncmdiKDI1NSwgMTA1LCAxODApJywKICAgICAgICBpbmRpYW5yZWQ6ICdyZ2IoMjA1LCA5MiwgOTIpJywKICAgICAgICBpbmRpZ286ICdyZ2IoIDc1LCAwLCAxMzApJywKICAgICAgICBpdm9yeTogJ3JnYigyNTUsIDI1NSwgMjQwKScsCiAgICAgICAga2hha2k6ICdyZ2IoMjQwLCAyMzAsIDE0MCknLAogICAgICAgIGxhdmVuZGVyOiAncmdiKDIzMCwgMjMwLCAyNTApJywKICAgICAgICBsYXZlbmRlcmJsdXNoOiAncmdiKDI1NSwgMjQwLCAyNDUpJywKICAgICAgICBsYXduZ3JlZW46ICdyZ2IoMTI0LCAyNTIsIDApJywKICAgICAgICBsZW1vbmNoaWZmb246ICdyZ2IoMjU1LCAyNTAsIDIwNSknLAogICAgICAgIGxpZ2h0Ymx1ZTogJ3JnYigxNzMsIDIxNiwgMjMwKScsCiAgICAgICAgbGlnaHRjb3JhbDogJ3JnYigyNDAsIDEyOCwgMTI4KScsCiAgICAgICAgbGlnaHRjeWFuOiAncmdiKDIyNCwgMjU1LCAyNTUpJywKICAgICAgICBsaWdodGdvbGRlbnJvZHllbGxvdzogJ3JnYigyNTAsIDI1MCwgMjEwKScsCiAgICAgICAgbGlnaHRncmF5OiAncmdiKDIxMSwgMjExLCAyMTEpJywKICAgICAgICBsaWdodGdyZWVuOiAncmdiKDE0NCwgMjM4LCAxNDQpJywKICAgICAgICBsaWdodGdyZXk6ICdyZ2IoMjExLCAyMTEsIDIxMSknLAogICAgICAgIGxpZ2h0cGluazogJ3JnYigyNTUsIDE4MiwgMTkzKScsCiAgICAgICAgbGlnaHRzYWxtb246ICdyZ2IoMjU1LCAxNjAsIDEyMiknLAogICAgICAgIGxpZ2h0c2VhZ3JlZW46ICdyZ2IoIDMyLCAxNzgsIDE3MCknLAogICAgICAgIGxpZ2h0c2t5Ymx1ZTogJ3JnYigxMzUsIDIwNiwgMjUwKScsCiAgICAgICAgbGlnaHRzbGF0ZWdyYXk6ICdyZ2IoMTE5LCAxMzYsIDE1MyknLAogICAgICAgIGxpZ2h0c2xhdGVncmV5OiAncmdiKDExOSwgMTM2LCAxNTMpJywKICAgICAgICBsaWdodHN0ZWVsYmx1ZTogJ3JnYigxNzYsIDE5NiwgMjIyKScsCiAgICAgICAgbGlnaHR5ZWxsb3c6ICdyZ2IoMjU1LCAyNTUsIDIyNCknLAogICAgICAgIGxpbWU6ICdyZ2IoIDAsIDI1NSwgMCknLAogICAgICAgIGxpbWVncmVlbjogJ3JnYiggNTAsIDIwNSwgNTApJywKICAgICAgICBsaW5lbjogJ3JnYigyNTAsIDI0MCwgMjMwKScsCiAgICAgICAgbWFnZW50YTogJ3JnYigyNTUsIDAsIDI1NSknLAogICAgICAgIG1hcm9vbjogJ3JnYigxMjgsIDAsIDApJywKICAgICAgICBtZWRpdW1hcXVhbWFyaW5lOiAncmdiKDEwMiwgMjA1LCAxNzApJywKICAgICAgICBtZWRpdW1ibHVlOiAncmdiKCAwLCAwLCAyMDUpJywKICAgICAgICBtZWRpdW1vcmNoaWQ6ICdyZ2IoMTg2LCA4NSwgMjExKScsCiAgICAgICAgbWVkaXVtcHVycGxlOiAncmdiKDE0NywgMTEyLCAyMTkpJywKICAgICAgICBtZWRpdW1zZWFncmVlbjogJ3JnYiggNjAsIDE3OSwgMTEzKScsCiAgICAgICAgbWVkaXVtc2xhdGVibHVlOiAncmdiKDEyMywgMTA0LCAyMzgpJywKICAgICAgICBtZWRpdW1zcHJpbmdncmVlbjogJ3JnYiggMCwgMjUwLCAxNTQpJywKICAgICAgICBtZWRpdW10dXJxdW9pc2U6ICdyZ2IoIDcyLCAyMDksIDIwNCknLAogICAgICAgIG1lZGl1bXZpb2xldHJlZDogJ3JnYigxOTksIDIxLCAxMzMpJywKICAgICAgICBtaWRuaWdodGJsdWU6ICdyZ2IoIDI1LCAyNSwgMTEyKScsCiAgICAgICAgbWludGNyZWFtOiAncmdiKDI0NSwgMjU1LCAyNTApJywKICAgICAgICBtaXN0eXJvc2U6ICdyZ2IoMjU1LCAyMjgsIDIyNSknLAogICAgICAgIG1vY2Nhc2luOiAncmdiKDI1NSwgMjI4LCAxODEpJywKICAgICAgICBuYXZham93aGl0ZTogJ3JnYigyNTUsIDIyMiwgMTczKScsCiAgICAgICAgbmF2eTogJ3JnYiggMCwgMCwgMTI4KScsCiAgICAgICAgb2xkbGFjZTogJ3JnYigyNTMsIDI0NSwgMjMwKScsCiAgICAgICAgb2xpdmU6ICdyZ2IoMTI4LCAxMjgsIDApJywKICAgICAgICBvbGl2ZWRyYWI6ICdyZ2IoMTA3LCAxNDIsIDM1KScsCiAgICAgICAgb3JhbmdlOiAncmdiKDI1NSwgMTY1LCAwKScsCiAgICAgICAgb3JhbmdlcmVkOiAncmdiKDI1NSwgNjksIDApJywKICAgICAgICBvcmNoaWQ6ICdyZ2IoMjE4LCAxMTIsIDIxNCknLAogICAgICAgIHBhbGVnb2xkZW5yb2Q6ICdyZ2IoMjM4LCAyMzIsIDE3MCknLAogICAgICAgIHBhbGVncmVlbjogJ3JnYigxNTIsIDI1MSwgMTUyKScsCiAgICAgICAgcGFsZXR1cnF1b2lzZTogJ3JnYigxNzUsIDIzOCwgMjM4KScsCiAgICAgICAgcGFsZXZpb2xldHJlZDogJ3JnYigyMTksIDExMiwgMTQ3KScsCiAgICAgICAgcGFwYXlhd2hpcDogJ3JnYigyNTUsIDIzOSwgMjEzKScsCiAgICAgICAgcGVhY2hwdWZmOiAncmdiKDI1NSwgMjE4LCAxODUpJywKICAgICAgICBwZXJ1OiAncmdiKDIwNSwgMTMzLCA2MyknLAogICAgICAgIHBpbms6ICdyZ2IoMjU1LCAxOTIsIDIwMyknLAogICAgICAgIHBsdW06ICdyZ2IoMjIxLCAxNjAsIDIyMSknLAogICAgICAgIHBvd2RlcmJsdWU6ICdyZ2IoMTc2LCAyMjQsIDIzMCknLAogICAgICAgIHB1cnBsZTogJ3JnYigxMjgsIDAsIDEyOCknLAogICAgICAgIHJlZDogJ3JnYigyNTUsIDAsIDApJywKICAgICAgICByb3N5YnJvd246ICdyZ2IoMTg4LCAxNDMsIDE0MyknLAogICAgICAgIHJveWFsYmx1ZTogJ3JnYiggNjUsIDEwNSwgMjI1KScsCiAgICAgICAgc2FkZGxlYnJvd246ICdyZ2IoMTM5LCA2OSwgMTkpJywKICAgICAgICBzYWxtb246ICdyZ2IoMjUwLCAxMjgsIDExNCknLAogICAgICAgIHNhbmR5YnJvd246ICdyZ2IoMjQ0LCAxNjQsIDk2KScsCiAgICAgICAgc2VhZ3JlZW46ICdyZ2IoIDQ2LCAxMzksIDg3KScsCiAgICAgICAgc2Vhc2hlbGw6ICdyZ2IoMjU1LCAyNDUsIDIzOCknLAogICAgICAgIHNpZW5uYTogJ3JnYigxNjAsIDgyLCA0NSknLAogICAgICAgIHNpbHZlcjogJ3JnYigxOTIsIDE5MiwgMTkyKScsCiAgICAgICAgc2t5Ymx1ZTogJ3JnYigxMzUsIDIwNiwgMjM1KScsCiAgICAgICAgc2xhdGVibHVlOiAncmdiKDEwNiwgOTAsIDIwNSknLAogICAgICAgIHNsYXRlZ3JheTogJ3JnYigxMTIsIDEyOCwgMTQ0KScsCiAgICAgICAgc2xhdGVncmV5OiAncmdiKDExMiwgMTI4LCAxNDQpJywKICAgICAgICBzbm93OiAncmdiKDI1NSwgMjUwLCAyNTApJywKICAgICAgICBzcHJpbmdncmVlbjogJ3JnYiggMCwgMjU1LCAxMjcpJywKICAgICAgICBzdGVlbGJsdWU6ICdyZ2IoIDcwLCAxMzAsIDE4MCknLAogICAgICAgIHRhbjogJ3JnYigyMTAsIDE4MCwgMTQwKScsCiAgICAgICAgdGVhbDogJ3JnYiggMCwgMTI4LCAxMjgpJywKICAgICAgICB0aGlzdGxlOiAncmdiKDIxNiwgMTkxLCAyMTYpJywKICAgICAgICB0b21hdG86ICdyZ2IoMjU1LCA5OSwgNzEpJywKICAgICAgICB0dXJxdW9pc2U6ICdyZ2IoIDY0LCAyMjQsIDIwOCknLAogICAgICAgIHZpb2xldDogJ3JnYigyMzgsIDEzMCwgMjM4KScsCiAgICAgICAgd2hlYXQ6ICdyZ2IoMjQ1LCAyMjIsIDE3OSknLAogICAgICAgIHdoaXRlOiAncmdiKDI1NSwgMjU1LCAyNTUpJywKICAgICAgICB3aGl0ZXNtb2tlOiAncmdiKDI0NSwgMjQ1LCAyNDUpJywKICAgICAgICB5ZWxsb3c6ICdyZ2IoMjU1LCAyNTUsIDApJywKICAgICAgICB5ZWxsb3dncmVlbjogJ3JnYigxNTQsIDIwNSwgNTApJwogICAgfTsKCiAgICAKCiAgICAvLyBjbGFzczogJC5qcXBsb3QuQXhpc0xhYmVsUmVuZGVyZXIKICAgIC8vIFJlbmRlcmVyIHRvIHBsYWNlIGxhYmVscyBvbiB0aGUgYXhlcy4KICAgICQuanFwbG90LkF4aXNMYWJlbFJlbmRlcmVyID0gZnVuY3Rpb24ob3B0aW9ucykgewogICAgICAgIC8vIEdyb3VwOiBQcm9wZXJ0aWVzCiAgICAgICAgJC5qcXBsb3QuRWxlbUNvbnRhaW5lci5jYWxsKHRoaXMpOwogICAgICAgIC8vIG5hbWUgb2YgdGhlIGF4aXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdGljawogICAgICAgIHRoaXMuYXhpczsKICAgICAgICAvLyBwcm9wOiBzaG93CiAgICAgICAgLy8gd2V0aGVyIG9yIG5vdCB0byBzaG93IHRoZSB0aWNrIChtYXJrIGFuZCBsYWJlbCkuCiAgICAgICAgdGhpcy5zaG93ID0gdHJ1ZTsKICAgICAgICAvLyBwcm9wOiBsYWJlbAogICAgICAgIC8vIFRoZSB0ZXh0IG9yIGh0bWwgZm9yIHRoZSBsYWJlbC4KICAgICAgICB0aGlzLmxhYmVsID0gJyc7CiAgICAgICAgdGhpcy5mb250RmFtaWx5ID0gbnVsbDsKICAgICAgICB0aGlzLmZvbnRTaXplID0gbnVsbDsKICAgICAgICB0aGlzLnRleHRDb2xvciA9IG51bGw7CiAgICAgICAgdGhpcy5fZWxlbTsKICAgICAgICAvLyBwcm9wOiBlc2NhcGVIVE1MCiAgICAgICAgLy8gdHJ1ZSB0byBlc2NhcGUgSFRNTCBlbnRpdGllcyBpbiB0aGUgbGFiZWwuCiAgICAgICAgdGhpcy5lc2NhcGVIVE1MID0gZmFsc2U7CiAgICAgICAgCiAgICAgICAgJC5leHRlbmQodHJ1ZSwgdGhpcywgb3B0aW9ucyk7CiAgICB9OwogICAgCiAgICAkLmpxcGxvdC5BeGlzTGFiZWxSZW5kZXJlci5wcm90b3R5cGUgPSBuZXcgJC5qcXBsb3QuRWxlbUNvbnRhaW5lcigpOwogICAgJC5qcXBsb3QuQXhpc0xhYmVsUmVuZGVyZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gJC5qcXBsb3QuQXhpc0xhYmVsUmVuZGVyZXI7CiAgICAKICAgICQuanFwbG90LkF4aXNMYWJlbFJlbmRlcmVyLnByb3RvdHlwZS5pbml0ID0gZnVuY3Rpb24ob3B0aW9ucykgewogICAgICAgICQuZXh0ZW5kKHRydWUsIHRoaXMsIG9wdGlvbnMpOwogICAgfTsKICAgIAogICAgJC5qcXBsb3QuQXhpc0xhYmVsUmVuZGVyZXIucHJvdG90eXBlLmRyYXcgPSBmdW5jdGlvbihjdHgsIHBsb3QpIHsKICAgICAgICAvLyBNZW1vcnkgTGVha3MgcGF0Y2gKICAgICAgICBpZiAodGhpcy5fZWxlbSkgewogICAgICAgICAgICB0aGlzLl9lbGVtLmVtcHR5Rm9yY2UoKTsKICAgICAgICAgICAgdGhpcy5fZWxlbSA9IG51bGw7CiAgICAgICAgfQoKICAgICAgICB0aGlzLl9lbGVtID0gJCgnPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7IiBjbGFzcz0ianFwbG90LScrdGhpcy5heGlzKyctbGFiZWwiPjwvZGl2PicpOwogICAgICAgIAogICAgICAgIGlmIChOdW1iZXIodGhpcy5sYWJlbCkpIHsKICAgICAgICAgICAgdGhpcy5fZWxlbS5jc3MoJ3doaXRlLXNwYWNlJywgJ25vd3JhcCcpOwogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZiAoIXRoaXMuZXNjYXBlSFRNTCkgewogICAgICAgICAgICB0aGlzLl9lbGVtLmh0bWwodGhpcy5sYWJlbCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICB0aGlzLl9lbGVtLnRleHQodGhpcy5sYWJlbCk7CiAgICAgICAgfQogICAgICAgIGlmICh0aGlzLmZvbnRGYW1pbHkpIHsKICAgICAgICAgICAgdGhpcy5fZWxlbS5jc3MoJ2ZvbnQtZmFtaWx5JywgdGhpcy5mb250RmFtaWx5KTsKICAgICAgICB9CiAgICAgICAgaWYgKHRoaXMuZm9udFNpemUpIHsKICAgICAgICAgICAgdGhpcy5fZWxlbS5jc3MoJ2ZvbnQtc2l6ZScsIHRoaXMuZm9udFNpemUpOwogICAgICAgIH0KICAgICAgICBpZiAodGhpcy50ZXh0Q29sb3IpIHsKICAgICAgICAgICAgdGhpcy5fZWxlbS5jc3MoJ2NvbG9yJywgdGhpcy50ZXh0Q29sb3IpOwogICAgICAgIH0KICAgICAgICAKICAgICAgICByZXR1cm4gdGhpcy5fZWxlbTsKICAgIH07CiAgICAKICAgICQuanFwbG90LkF4aXNMYWJlbFJlbmRlcmVyLnByb3RvdHlwZS5wYWNrID0gZnVuY3Rpb24oKSB7CiAgICB9OwoKICAgIC8vIGNsYXNzOiAkLmpxcGxvdC5BeGlzVGlja1JlbmRlcmVyCiAgICAvLyBBICJ0aWNrIiBvYmplY3Qgc2hvd2luZyB0aGUgdmFsdWUgb2YgYSB0aWNrL2dyaWRsaW5lIG9uIHRoZSBwbG90LgogICAgJC5qcXBsb3QuQXhpc1RpY2tSZW5kZXJlciA9IGZ1bmN0aW9uKG9wdGlvbnMpIHsKICAgICAgICAvLyBHcm91cDogUHJvcGVydGllcwogICAgICAgICQuanFwbG90LkVsZW1Db250YWluZXIuY2FsbCh0aGlzKTsKICAgICAgICAvLyBwcm9wOiBtYXJrCiAgICAgICAgLy8gdGljayBtYXJrIG9uIHRoZSBheGlzLiAgT25lIG9mICdpbnNpZGUnLCAnb3V0c2lkZScsICdjcm9zcycsICcnIG9yIG51bGwuCiAgICAgICAgdGhpcy5tYXJrID0gJ291dHNpZGUnOwogICAgICAgIC8vIG5hbWUgb2YgdGhlIGF4aXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdGljawogICAgICAgIHRoaXMuYXhpczsKICAgICAgICAvLyBwcm9wOiBzaG93TWFyawogICAgICAgIC8vIHdldGhlciBvciBub3QgdG8gc2hvdyB0aGUgbWFyayBvbiB0aGUgYXhpcy4KICAgICAgICB0aGlzLnNob3dNYXJrID0gdHJ1ZTsKICAgICAgICAvLyBwcm9wOiBzaG93R3JpZGxpbmUKICAgICAgICAvLyB3ZXRoZXIgb3Igbm90IHRvIGRyYXcgdGhlIGdyaWRsaW5lIG9uIHRoZSBncmlkIGF0IHRoaXMgdGljay4KICAgICAgICB0aGlzLnNob3dHcmlkbGluZSA9IHRydWU7CiAgICAgICAgLy8gcHJvcDogaXNNaW5vclRpY2sKICAgICAgICAvLyBpZiB0aGlzIGlzIGEgbWlub3IgdGljay4KICAgICAgICB0aGlzLmlzTWlub3JUaWNrID0gZmFsc2U7CiAgICAgICAgLy8gcHJvcDogc2l6ZQogICAgICAgIC8vIExlbmd0aCBvZiB0aGUgdGljayBiZXlvbmQgdGhlIGdyaWQgaW4gcGl4ZWxzLgogICAgICAgIC8vIERFUFJFQ0FURUQ6IFRoaXMgaGFzIGJlZW4gc3VwZXJjZWVkZWQgYnkgbWFya1NpemUKICAgICAgICB0aGlzLnNpemUgPSA0OwogICAgICAgIC8vIHByb3A6ICBtYXJrU2l6ZQogICAgICAgIC8vIExlbmd0aCBvZiB0aGUgdGljayBtYXJrcyBpbiBwaXhlbHMuICBGb3IgJ2Nyb3NzJyBzdHlsZSwgbGVuZ3RoCiAgICAgICAgLy8gd2lsbCBiZSBzdG9rZWQgYWJvdmUgYW5kIGJlbG93IGF4aXMsIHNvIHRvdGFsIGxlbmd0aCB3aWxsIGJlIHR3aWNlIHRoaXMuCiAgICAgICAgdGhpcy5tYXJrU2l6ZSA9IDY7CiAgICAgICAgLy8gcHJvcDogc2hvdwogICAgICAgIC8vIHdldGhlciBvciBub3QgdG8gc2hvdyB0aGUgdGljayAobWFyayBhbmQgbGFiZWwpLgogICAgICAgIC8vIFNldHRpbmcgdGhpcyB0byBmYWxzZSByZXF1aXJlcyBtb3JlIHRlc3RpbmcuICBJdCBpcyByZWNvbW1lbmRlZAogICAgICAgIC8vIHRvIHNldCBzaG93TGFiZWwgYW5kIHNob3dNYXJrIHRvIGZhbHNlIGluc3RlYWQuCiAgICAgICAgdGhpcy5zaG93ID0gdHJ1ZTsKICAgICAgICAvLyBwcm9wOiBzaG93TGFiZWwKICAgICAgICAvLyB3ZXRoZXIgb3Igbm90IHRvIHNob3cgdGhlIGxhYmVsLgogICAgICAgIHRoaXMuc2hvd0xhYmVsID0gdHJ1ZTsKICAgICAgICB0aGlzLmxhYmVsID0gbnVsbDsKICAgICAgICB0aGlzLnZhbHVlID0gbnVsbDsKICAgICAgICB0aGlzLl9zdHlsZXMgPSB7fTsKICAgICAgICAvLyBwcm9wOiBmb3JtYXR0ZXIKICAgICAgICAvLyBBIGNsYXNzIG9mIGEgZm9ybWF0dGVyIGZvciB0aGUgdGljayB0ZXh0LiAgc3ByaW50ZiBieSBkZWZhdWx0LgogICAgICAgIHRoaXMuZm9ybWF0dGVyID0gJC5qcXBsb3QuRGVmYXVsdFRpY2tGb3JtYXR0ZXI7CiAgICAgICAgLy8gcHJvcDogcHJlZml4CiAgICAgICAgLy8gU3RyaW5nIHRvIHByZXBlbmQgdG8gdGhlIHRpY2sgbGFiZWwuCiAgICAgICAgLy8gUHJlZml4IGlzIHByZXBlbmRlZCB0byB0aGUgZm9ybWF0dGVkIHRpY2sgbGFiZWwuCiAgICAgICAgdGhpcy5wcmVmaXggPSAnJzsKICAgICAgICAvLyBwcm9wOiBmb3JtYXRTdHJpbmcKICAgICAgICAvLyBzdHJpbmcgcGFzc2VkIHRvIHRoZSBmb3JtYXR0ZXIuCiAgICAgICAgdGhpcy5mb3JtYXRTdHJpbmcgPSAnJzsKICAgICAgICAvLyBwcm9wOiBmb250RmFtaWx5CiAgICAgICAgLy8gY3NzIHNwZWMgZm9yIHRoZSBmb250LWZhbWlseSBjc3MgYXR0cmlidXRlLgogICAgICAgIHRoaXMuZm9udEZhbWlseTsKICAgICAgICAvLyBwcm9wOiBmb250U2l6ZQogICAgICAgIC8vIGNzcyBzcGVjIGZvciB0aGUgZm9udC1zaXplIGNzcyBhdHRyaWJ1dGUuCiAgICAgICAgdGhpcy5mb250U2l6ZTsKICAgICAgICAvLyBwcm9wOiB0ZXh0Q29sb3IKICAgICAgICAvLyBjc3Mgc3BlYyBmb3IgdGhlIGNvbG9yIGF0dHJpYnV0ZS4KICAgICAgICB0aGlzLnRleHRDb2xvcjsKICAgICAgICAvLyBwcm9wOiBlc2NhcGVIVE1MCiAgICAgICAgLy8gdHJ1ZSB0byBlc2NhcGUgSFRNTCBlbnRpdGllcyBpbiB0aGUgbGFiZWwuCiAgICAgICAgdGhpcy5lc2NhcGVIVE1MID0gZmFsc2U7CiAgICAgICAgdGhpcy5fZWxlbTsKCQl0aGlzLl9icmVha1RpY2sgPSBmYWxzZTsKICAgICAgICAKICAgICAgICAkLmV4dGVuZCh0cnVlLCB0aGlzLCBvcHRpb25zKTsKICAgIH07CiAgICAKICAgICQuanFwbG90LkF4aXNUaWNrUmVuZGVyZXIucHJvdG90eXBlLmluaXQgPSBmdW5jdGlvbihvcHRpb25zKSB7CiAgICAgICAgJC5leHRlbmQodHJ1ZSwgdGhpcywgb3B0aW9ucyk7CiAgICB9OwogICAgCiAgICAkLmpxcGxvdC5BeGlzVGlja1JlbmRlcmVyLnByb3RvdHlwZSA9IG5ldyAkLmpxcGxvdC5FbGVtQ29udGFpbmVyKCk7CiAgICAkLmpxcGxvdC5BeGlzVGlja1JlbmRlcmVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9ICQuanFwbG90LkF4aXNUaWNrUmVuZGVyZXI7CiAgICAKICAgICQuanFwbG90LkF4aXNUaWNrUmVuZGVyZXIucHJvdG90eXBlLnNldFRpY2sgPSBmdW5jdGlvbih2YWx1ZSwgYXhpc05hbWUsIGlzTWlub3IpIHsKICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CiAgICAgICAgdGhpcy5heGlzID0gYXhpc05hbWU7CiAgICAgICAgaWYgKGlzTWlub3IpIHsKICAgICAgICAgICAgdGhpcy5pc01pbm9yVGljayA9IHRydWU7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzOwogICAgfTsKICAgIAogICAgJC5qcXBsb3QuQXhpc1RpY2tSZW5kZXJlci5wcm90b3R5cGUuZHJhdyA9IGZ1bmN0aW9uKCkgewogICAgICAgIGlmICh0aGlzLmxhYmVsID09PSBudWxsKSB7CiAgICAgICAgICAgIHRoaXMubGFiZWwgPSB0aGlzLnByZWZpeCArIHRoaXMuZm9ybWF0dGVyKHRoaXMuZm9ybWF0U3RyaW5nLCB0aGlzLnZhbHVlKTsKICAgICAgICB9CiAgICAgICAgdmFyIHN0eWxlID0ge3Bvc2l0aW9uOiAnYWJzb2x1dGUnfTsKICAgICAgICBpZiAoTnVtYmVyKHRoaXMubGFiZWwpKSB7CiAgICAgICAgICAgIHN0eWxlWyd3aGl0U3BhY2UnXSA9ICdub3dyYXAnOwogICAgICAgIH0KICAgICAgICAKICAgICAgICAvLyBNZW1vcnkgTGVha3MgcGF0Y2gKICAgICAgICBpZiAodGhpcy5fZWxlbSkgewogICAgICAgICAgICB0aGlzLl9lbGVtLmVtcHR5Rm9yY2UoKTsKICAgICAgICAgICAgdGhpcy5fZWxlbSA9IG51bGw7CiAgICAgICAgfQoKICAgICAgICB0aGlzLl9lbGVtID0gJChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSk7CiAgICAgICAgdGhpcy5fZWxlbS5hZGRDbGFzcygianFwbG90LSIrdGhpcy5heGlzKyItdGljayIpOwogICAgICAgIAogICAgICAgIGlmICghdGhpcy5lc2NhcGVIVE1MKSB7CiAgICAgICAgICAgIHRoaXMuX2VsZW0uaHRtbCh0aGlzLmxhYmVsKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHRoaXMuX2VsZW0udGV4dCh0aGlzLmxhYmVsKTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgdGhpcy5fZWxlbS5jc3Moc3R5bGUpOwoKICAgICAgICBmb3IgKHZhciBzIGluIHRoaXMuX3N0eWxlcykgewogICAgICAgICAgICB0aGlzLl9lbGVtLmNzcyhzLCB0aGlzLl9zdHlsZXNbc10pOwogICAgICAgIH0KICAgICAgICBpZiAodGhpcy5mb250RmFtaWx5KSB7CiAgICAgICAgICAgIHRoaXMuX2VsZW0uY3NzKCdmb250LWZhbWlseScsIHRoaXMuZm9udEZhbWlseSk7CiAgICAgICAgfQogICAgICAgIGlmICh0aGlzLmZvbnRTaXplKSB7CiAgICAgICAgICAgIHRoaXMuX2VsZW0uY3NzKCdmb250LXNpemUnLCB0aGlzLmZvbnRTaXplKTsKICAgICAgICB9CiAgICAgICAgaWYgKHRoaXMudGV4dENvbG9yKSB7CiAgICAgICAgICAgIHRoaXMuX2VsZW0uY3NzKCdjb2xvcicsIHRoaXMudGV4dENvbG9yKTsKICAgICAgICB9CgkJaWYgKHRoaXMuX2JyZWFrVGljaykgewoJCQl0aGlzLl9lbGVtLmFkZENsYXNzKCdqcXBsb3QtYnJlYWtUaWNrJyk7CgkJfQogICAgICAgIAogICAgICAgIHJldHVybiB0aGlzLl9lbGVtOwogICAgfTsKICAgICAgICAKICAgICQuanFwbG90LkRlZmF1bHRUaWNrRm9ybWF0dGVyID0gZnVuY3Rpb24gKGZvcm1hdCwgdmFsKSB7CiAgICAgICAgaWYgKHR5cGVvZiB2YWwgPT0gJ251bWJlcicpIHsKICAgICAgICAgICAgaWYgKCFmb3JtYXQpIHsKICAgICAgICAgICAgICAgIGZvcm1hdCA9ICQuanFwbG90LmNvbmZpZy5kZWZhdWx0VGlja0Zvcm1hdFN0cmluZzsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gJC5qcXBsb3Quc3ByaW50Zihmb3JtYXQsIHZhbCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICByZXR1cm4gU3RyaW5nKHZhbCk7CiAgICAgICAgfQogICAgfTsKICAgIAogICAgJC5qcXBsb3QuQXhpc1RpY2tSZW5kZXJlci5wcm90b3R5cGUucGFjayA9IGZ1bmN0aW9uKCkgewogICAgfTsKICAgICAKICAgIC8vIENsYXNzOiAkLmpxcGxvdC5DYW52YXNHcmlkUmVuZGVyZXIKICAgIC8vIFRoZSBkZWZhdWx0IGpxUGxvdCBncmlkIHJlbmRlcmVyLCBjcmVhdGluZyBhIGdyaWQgb24gYSBjYW52YXMgZWxlbWVudC4KICAgIC8vIFRoZSByZW5kZXJlciBoYXMgbm8gYWRkaXRpb25hbCBvcHRpb25zIGJleW9uZCB0aGUgPEdyaWQ+IGNsYXNzLgogICAgJC5qcXBsb3QuQ2FudmFzR3JpZFJlbmRlcmVyID0gZnVuY3Rpb24oKXsKICAgICAgICB0aGlzLnNoYWRvd1JlbmRlcmVyID0gbmV3ICQuanFwbG90LlNoYWRvd1JlbmRlcmVyKCk7CiAgICB9OwogICAgCiAgICAvLyBjYWxsZWQgd2l0aCBjb250ZXh0IG9mIEdyaWQgb2JqZWN0CiAgICAkLmpxcGxvdC5DYW52YXNHcmlkUmVuZGVyZXIucHJvdG90eXBlLmluaXQgPSBmdW5jdGlvbihvcHRpb25zKSB7CiAgICAgICAgdGhpcy5fY3R4OwogICAgICAgICQuZXh0ZW5kKHRydWUsIHRoaXMsIG9wdGlvbnMpOwogICAgICAgIC8vIHNldCB0aGUgc2hhZG93IHJlbmRlcmVyIG9wdGlvbnMKICAgICAgICB2YXIgc29wdHMgPSB7bGluZUpvaW46J21pdGVyJywgbGluZUNhcDoncm91bmQnLCBmaWxsOmZhbHNlLCBpc2FyYzpmYWxzZSwgYW5nbGU6dGhpcy5zaGFkb3dBbmdsZSwgb2Zmc2V0OnRoaXMuc2hhZG93T2Zmc2V0LCBhbHBoYTp0aGlzLnNoYWRvd0FscGhhLCBkZXB0aDp0aGlzLnNoYWRvd0RlcHRoLCBsaW5lV2lkdGg6dGhpcy5zaGFkb3dXaWR0aCwgY2xvc2VQYXRoOmZhbHNlLCBzdHJva2VTdHlsZTp0aGlzLnNoYWRvd0NvbG9yfTsKICAgICAgICB0aGlzLnJlbmRlcmVyLnNoYWRvd1JlbmRlcmVyLmluaXQoc29wdHMpOwogICAgfTsKICAgIAogICAgLy8gY2FsbGVkIHdpdGggY29udGV4dCBvZiBHcmlkLgogICAgJC5qcXBsb3QuQ2FudmFzR3JpZFJlbmRlcmVyLnByb3RvdHlwZS5jcmVhdGVFbGVtZW50ID0gZnVuY3Rpb24ocGxvdCkgewogICAgICAgIHZhciBlbGVtOwogICAgICAgIC8vIE1lbW9yeSBMZWFrcyBwYXRjaAogICAgICAgIGlmICh0aGlzLl9lbGVtKSB7CiAgICAgICAgICBpZiAoJC5qcXBsb3QudXNlX2V4Y2FudmFzICYmIHdpbmRvdy5HX3ZtbENhbnZhc01hbmFnZXIudW5pbml0RWxlbWVudCAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgIGVsZW0gPSB0aGlzLl9lbGVtLmdldCgwKTsKICAgICAgICAgICAgd2luZG93Lkdfdm1sQ2FudmFzTWFuYWdlci51bmluaXRFbGVtZW50KGVsZW0pOwogICAgICAgICAgICBlbGVtID0gbnVsbDsKICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgdGhpcy5fZWxlbS5lbXB0eUZvcmNlKCk7CiAgICAgICAgICB0aGlzLl9lbGVtID0gbnVsbDsKICAgICAgICB9CiAgICAgIAogICAgICAgIGVsZW0gPSBwbG90LmNhbnZhc01hbmFnZXIuZ2V0Q2FudmFzKCk7CgogICAgICAgIHZhciB3ID0gdGhpcy5fcGxvdERpbWVuc2lvbnMud2lkdGg7CiAgICAgICAgdmFyIGggPSB0aGlzLl9wbG90RGltZW5zaW9ucy5oZWlnaHQ7CiAgICAgICAgZWxlbS53aWR0aCA9IHc7CiAgICAgICAgZWxlbS5oZWlnaHQgPSBoOwogICAgICAgIHRoaXMuX2VsZW0gPSAkKGVsZW0pOwogICAgICAgIHRoaXMuX2VsZW0uYWRkQ2xhc3MoJ2pxcGxvdC1ncmlkLWNhbnZhcycpOwogICAgICAgIHRoaXMuX2VsZW0uY3NzKHsgcG9zaXRpb246ICdhYnNvbHV0ZScsIGxlZnQ6IDAsIHRvcDogMCB9KTsKICAgICAgICAKCQllbGVtID0gcGxvdC5jYW52YXNNYW5hZ2VyLmluaXRDYW52YXMoZWxlbSk7CgkJCiAgICAgICAgdGhpcy5fdG9wID0gdGhpcy5fb2Zmc2V0cy50b3A7CiAgICAgICAgdGhpcy5fYm90dG9tID0gaCAtIHRoaXMuX29mZnNldHMuYm90dG9tOwogICAgICAgIHRoaXMuX2xlZnQgPSB0aGlzLl9vZmZzZXRzLmxlZnQ7CiAgICAgICAgdGhpcy5fcmlnaHQgPSB3IC0gdGhpcy5fb2Zmc2V0cy5yaWdodDsKICAgICAgICB0aGlzLl93aWR0aCA9IHRoaXMuX3JpZ2h0IC0gdGhpcy5fbGVmdDsKICAgICAgICB0aGlzLl9oZWlnaHQgPSB0aGlzLl9ib3R0b20gLSB0aGlzLl90b3A7CiAgICAgICAgLy8gYXZvaWQgbWVtb3J5IGxlYWsKICAgICAgICBlbGVtID0gbnVsbDsKICAgICAgICByZXR1cm4gdGhpcy5fZWxlbTsKICAgIH07CiAgICAKICAgICQuanFwbG90LkNhbnZhc0dyaWRSZW5kZXJlci5wcm90b3R5cGUuZHJhdyA9IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuX2N0eCA9IHRoaXMuX2VsZW0uZ2V0KDApLmdldENvbnRleHQoIjJkIik7CiAgICAgICAgdmFyIGN0eCA9IHRoaXMuX2N0eDsKICAgICAgICB2YXIgYXhlcyA9IHRoaXMuX2F4ZXM7CiAgICAgICAgLy8gQWRkIHRoZSBncmlkIG9udG8gdGhlIGdyaWQgY2FudmFzLiAgVGhpcyBpcyB0aGUgYm90dG9tIG1vc3QgbGF5ZXIuCiAgICAgICAgY3R4LnNhdmUoKTsKICAgICAgICBjdHguY2xlYXJSZWN0KDAsIDAsIHRoaXMuX3Bsb3REaW1lbnNpb25zLndpZHRoLCB0aGlzLl9wbG90RGltZW5zaW9ucy5oZWlnaHQpOwogICAgICAgIGN0eC5maWxsU3R5bGUgPSB0aGlzLmJhY2tncm91bmRDb2xvciB8fCB0aGlzLmJhY2tncm91bmQ7CiAgICAgICAgY3R4LmZpbGxSZWN0KHRoaXMuX2xlZnQsIHRoaXMuX3RvcCwgdGhpcy5fd2lkdGgsIHRoaXMuX2hlaWdodCk7CiAgICAgICAgCiAgICAgICAgY3R4LnNhdmUoKTsKICAgICAgICBjdHgubGluZUpvaW4gPSAnbWl0ZXInOwogICAgICAgIGN0eC5saW5lQ2FwID0gJ2J1dHQnOwogICAgICAgIGN0eC5saW5lV2lkdGggPSB0aGlzLmdyaWRMaW5lV2lkdGg7CiAgICAgICAgY3R4LnN0cm9rZVN0eWxlID0gdGhpcy5ncmlkTGluZUNvbG9yOwogICAgICAgIHZhciBiLCBlLCBzLCBtOwogICAgICAgIHZhciBheCA9IFsneGF4aXMnLCAneWF4aXMnLCAneDJheGlzJywgJ3kyYXhpcyddOwogICAgICAgIGZvciAodmFyIGk9NDsgaT4wOyBpLS0pIHsKICAgICAgICAgICAgdmFyIG5hbWUgPSBheFtpLTFdOwogICAgICAgICAgICB2YXIgYXhpcyA9IGF4ZXNbbmFtZV07CiAgICAgICAgICAgIHZhciB0aWNrcyA9IGF4aXMuX3RpY2tzOwogICAgICAgICAgICB2YXIgbnVtdGlja3MgPSB0aWNrcy5sZW5ndGg7CiAgICAgICAgICAgIGlmIChheGlzLnNob3cpIHsKICAgICAgICAgICAgICAgIGlmIChheGlzLmRyYXdCYXNlbGluZSkgewogICAgICAgICAgICAgICAgICAgIHZhciBib3B0cyA9IHt9OwogICAgICAgICAgICAgICAgICAgIGlmIChheGlzLmJhc2VsaW5lV2lkdGggIT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYm9wdHMubGluZVdpZHRoID0gYXhpcy5iYXNlbGluZVdpZHRoOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoYXhpcy5iYXNlbGluZUNvbG9yICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJvcHRzLnN0cm9rZVN0eWxlID0gYXhpcy5iYXNlbGluZUNvbG9yOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG5hbWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAneGF4aXMnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJhd0xpbmUgKHRoaXMuX2xlZnQsIHRoaXMuX2JvdHRvbSwgdGhpcy5fcmlnaHQsIHRoaXMuX2JvdHRvbSwgYm9wdHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3lheGlzJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyYXdMaW5lICh0aGlzLl9sZWZ0LCB0aGlzLl9ib3R0b20sIHRoaXMuX2xlZnQsIHRoaXMuX3RvcCwgYm9wdHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3gyYXhpcyc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmF3TGluZSAodGhpcy5fbGVmdCwgdGhpcy5fYm90dG9tLCB0aGlzLl9yaWdodCwgdGhpcy5fYm90dG9tLCBib3B0cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAneTJheGlzJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyYXdMaW5lICh0aGlzLl9yaWdodCwgdGhpcy5fYm90dG9tLCB0aGlzLl9yaWdodCwgdGhpcy5fdG9wLCBib3B0cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmb3IgKHZhciBqPW51bXRpY2tzOyBqPjA7IGotLSkgewogICAgICAgICAgICAgICAgICAgIHZhciB0ID0gdGlja3Nbai0xXTsKICAgICAgICAgICAgICAgICAgICBpZiAodC5zaG93KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwb3MgPSBNYXRoLnJvdW5kKGF4aXMudTJwKHQudmFsdWUpKSArIDAuNTsKICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChuYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd4YXhpcyc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZHJhdyB0aGUgZ3JpZCBsaW5lIGlmIHdlIHNob3VsZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0LnNob3dHcmlkbGluZSAmJiB0aGlzLmRyYXdHcmlkbGluZXMgJiYgKCghdC5pc01pbm9yVGljayAmJiBheGlzLmRyYXdNYWpvckdyaWRsaW5lcykgfHwgKHQuaXNNaW5vclRpY2sgJiYgYXhpcy5kcmF3TWlub3JHcmlkbGluZXMpKSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJhd0xpbmUocG9zLCB0aGlzLl90b3AsIHBvcywgdGhpcy5fYm90dG9tKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZHJhdyB0aGUgbWFyawogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0LnNob3dNYXJrICYmIHQubWFyayAmJiAoKCF0LmlzTWlub3JUaWNrICYmIGF4aXMuZHJhd01ham9yVGlja01hcmtzKSB8fCAodC5pc01pbm9yVGljayAmJiBheGlzLmRyYXdNaW5vclRpY2tNYXJrcykpICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzID0gdC5tYXJrU2l6ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbSA9IHQubWFyazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBvcyA9IE1hdGgucm91bmQoYXhpcy51MnAodC52YWx1ZSkpICsgMC41OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ291dHNpZGUnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIgPSB0aGlzLl9ib3R0b207CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9IHRoaXMuX2JvdHRvbStzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnaW5zaWRlJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiID0gdGhpcy5fYm90dG9tLXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9IHRoaXMuX2JvdHRvbTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2Nyb3NzJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiID0gdGhpcy5fYm90dG9tLXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9IHRoaXMuX2JvdHRvbStzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiID0gdGhpcy5fYm90dG9tOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPSB0aGlzLl9ib3R0b20rczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkcmF3IHRoZSBzaGFkb3cKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2hhZG93KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNoYWRvd1JlbmRlcmVyLmRyYXcoY3R4LCBbW3BvcyxiXSxbcG9zLGVdXSwge2xpbmVDYXA6J2J1dHQnLCBsaW5lV2lkdGg6dGhpcy5ncmlkTGluZVdpZHRoLCBvZmZzZXQ6dGhpcy5ncmlkTGluZVdpZHRoKjAuNzUsIGRlcHRoOjIsIGZpbGw6ZmFsc2UsIGNsb3NlUGF0aDpmYWxzZX0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRyYXcgdGhlIGxpbmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJhd0xpbmUocG9zLCBiLCBwb3MsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3lheGlzJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkcmF3IHRoZSBncmlkIGxpbmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodC5zaG93R3JpZGxpbmUgJiYgdGhpcy5kcmF3R3JpZGxpbmVzICYmICgoIXQuaXNNaW5vclRpY2sgJiYgYXhpcy5kcmF3TWFqb3JHcmlkbGluZXMpIHx8ICh0LmlzTWlub3JUaWNrICYmIGF4aXMuZHJhd01pbm9yR3JpZGxpbmVzKSkgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyYXdMaW5lKHRoaXMuX3JpZ2h0LCBwb3MsIHRoaXMuX2xlZnQsIHBvcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRyYXcgdGhlIG1hcmsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodC5zaG93TWFyayAmJiB0Lm1hcmsgJiYgKCghdC5pc01pbm9yVGljayAmJiBheGlzLmRyYXdNYWpvclRpY2tNYXJrcykgfHwgKHQuaXNNaW5vclRpY2sgJiYgYXhpcy5kcmF3TWlub3JUaWNrTWFya3MpKSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcyA9IHQubWFya1NpemU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0gPSB0Lm1hcms7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwb3MgPSBNYXRoLnJvdW5kKGF4aXMudTJwKHQudmFsdWUpKSArIDAuNTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdvdXRzaWRlJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiID0gdGhpcy5fbGVmdC1zOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPSB0aGlzLl9sZWZ0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnaW5zaWRlJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiID0gdGhpcy5fbGVmdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0gdGhpcy5fbGVmdCtzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnY3Jvc3MnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIgPSB0aGlzLl9sZWZ0LXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9IHRoaXMuX2xlZnQrczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYiA9IHRoaXMuX2xlZnQtczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0gdGhpcy5fbGVmdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRyYXcgdGhlIHNoYWRvdwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zaGFkb3cpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2hhZG93UmVuZGVyZXIuZHJhdyhjdHgsIFtbYiwgcG9zXSwgW2UsIHBvc11dLCB7bGluZUNhcDonYnV0dCcsIGxpbmVXaWR0aDp0aGlzLmdyaWRMaW5lV2lkdGgqMS41LCBvZmZzZXQ6dGhpcy5ncmlkTGluZVdpZHRoKjAuNzUsIGZpbGw6ZmFsc2UsIGNsb3NlUGF0aDpmYWxzZX0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyYXdMaW5lKGIsIHBvcywgZSwgcG9zLCB7c3Ryb2tlU3R5bGU6YXhpcy5ib3JkZXJDb2xvcn0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3gyYXhpcyc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZHJhdyB0aGUgZ3JpZCBsaW5lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQuc2hvd0dyaWRsaW5lICYmIHRoaXMuZHJhd0dyaWRsaW5lcyAmJiAoKCF0LmlzTWlub3JUaWNrICYmIGF4aXMuZHJhd01ham9yR3JpZGxpbmVzKSB8fCAodC5pc01pbm9yVGljayAmJiBheGlzLmRyYXdNaW5vckdyaWRsaW5lcykpICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmF3TGluZShwb3MsIHRoaXMuX2JvdHRvbSwgcG9zLCB0aGlzLl90b3ApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkcmF3IHRoZSBtYXJrCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQuc2hvd01hcmsgJiYgdC5tYXJrICYmICgoIXQuaXNNaW5vclRpY2sgJiYgYXhpcy5kcmF3TWFqb3JUaWNrTWFya3MpIHx8ICh0LmlzTWlub3JUaWNrICYmIGF4aXMuZHJhd01pbm9yVGlja01hcmtzKSkgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSB0Lm1hcmtTaXplOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtID0gdC5tYXJrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcG9zID0gTWF0aC5yb3VuZChheGlzLnUycCh0LnZhbHVlKSkgKyAwLjU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnb3V0c2lkZSc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYiA9IHRoaXMuX3RvcC1zOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPSB0aGlzLl90b3A7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdpbnNpZGUnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIgPSB0aGlzLl90b3A7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9IHRoaXMuX3RvcCtzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnY3Jvc3MnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIgPSB0aGlzLl90b3AtczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0gdGhpcy5fdG9wK3M7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIgPSB0aGlzLl90b3AtczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0gdGhpcy5fdG9wOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZHJhdyB0aGUgc2hhZG93CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNoYWRvdykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zaGFkb3dSZW5kZXJlci5kcmF3KGN0eCwgW1twb3MsYl0sW3BvcyxlXV0sIHtsaW5lQ2FwOididXR0JywgbGluZVdpZHRoOnRoaXMuZ3JpZExpbmVXaWR0aCwgb2Zmc2V0OnRoaXMuZ3JpZExpbmVXaWR0aCowLjc1LCBkZXB0aDoyLCBmaWxsOmZhbHNlLCBjbG9zZVBhdGg6ZmFsc2V9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmF3TGluZShwb3MsIGIsIHBvcywgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAneTJheGlzJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkcmF3IHRoZSBncmlkIGxpbmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodC5zaG93R3JpZGxpbmUgJiYgdGhpcy5kcmF3R3JpZGxpbmVzICYmICgoIXQuaXNNaW5vclRpY2sgJiYgYXhpcy5kcmF3TWFqb3JHcmlkbGluZXMpIHx8ICh0LmlzTWlub3JUaWNrICYmIGF4aXMuZHJhd01pbm9yR3JpZGxpbmVzKSkgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyYXdMaW5lKHRoaXMuX2xlZnQsIHBvcywgdGhpcy5fcmlnaHQsIHBvcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRyYXcgdGhlIG1hcmsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodC5zaG93TWFyayAmJiB0Lm1hcmsgJiYgKCghdC5pc01pbm9yVGljayAmJiBheGlzLmRyYXdNYWpvclRpY2tNYXJrcykgfHwgKHQuaXNNaW5vclRpY2sgJiYgYXhpcy5kcmF3TWlub3JUaWNrTWFya3MpKSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcyA9IHQubWFya1NpemU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0gPSB0Lm1hcms7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwb3MgPSBNYXRoLnJvdW5kKGF4aXMudTJwKHQudmFsdWUpKSArIDAuNTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdvdXRzaWRlJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiID0gdGhpcy5fcmlnaHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9IHRoaXMuX3JpZ2h0K3M7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdpbnNpZGUnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIgPSB0aGlzLl9yaWdodC1zOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPSB0aGlzLl9yaWdodDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2Nyb3NzJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiID0gdGhpcy5fcmlnaHQtczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0gdGhpcy5fcmlnaHQrczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYiA9IHRoaXMuX3JpZ2h0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPSB0aGlzLl9yaWdodCtzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZHJhdyB0aGUgc2hhZG93CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNoYWRvdykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zaGFkb3dSZW5kZXJlci5kcmF3KGN0eCwgW1tiLCBwb3NdLCBbZSwgcG9zXV0sIHtsaW5lQ2FwOididXR0JywgbGluZVdpZHRoOnRoaXMuZ3JpZExpbmVXaWR0aCoxLjUsIG9mZnNldDp0aGlzLmdyaWRMaW5lV2lkdGgqMC43NSwgZmlsbDpmYWxzZSwgY2xvc2VQYXRoOmZhbHNlfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJhd0xpbmUoYiwgcG9zLCBlLCBwb3MsIHtzdHJva2VTdHlsZTpheGlzLmJvcmRlckNvbG9yfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHQgPSBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGF4aXMgPSBudWxsOwogICAgICAgICAgICB0aWNrcyA9IG51bGw7CiAgICAgICAgfQogICAgICAgIC8vIE5vdyBkcmF3IGdyaWQgbGluZXMgZm9yIGFkZGl0aW9uYWwgeSBheGVzCiAgICAgICAgLy8vLy8vCiAgICAgICAgLy8gVE8gRE86IGhhbmRsZSB5TWlkQXhpcwogICAgICAgIC8vLy8vLwogICAgICAgIGF4ID0gWyd5M2F4aXMnLCAneTRheGlzJywgJ3k1YXhpcycsICd5NmF4aXMnLCAneTdheGlzJywgJ3k4YXhpcycsICd5OWF4aXMnLCAneU1pZEF4aXMnXTsKICAgICAgICBmb3IgKHZhciBpPTc7IGk+MDsgaS0tKSB7CiAgICAgICAgICAgIHZhciBheGlzID0gYXhlc1theFtpLTFdXTsKICAgICAgICAgICAgdmFyIHRpY2tzID0gYXhpcy5fdGlja3M7CiAgICAgICAgICAgIGlmIChheGlzLnNob3cpIHsKICAgICAgICAgICAgICAgIHZhciB0biA9IHRpY2tzW2F4aXMubnVtYmVyVGlja3MtMV07CiAgICAgICAgICAgICAgICB2YXIgdDAgPSB0aWNrc1swXTsKICAgICAgICAgICAgICAgIHZhciBsZWZ0ID0gYXhpcy5nZXRMZWZ0KCk7CiAgICAgICAgICAgICAgICB2YXIgcG9pbnRzID0gW1tsZWZ0LCB0bi5nZXRUb3AoKSArIHRuLmdldEhlaWdodCgpLzJdLCBbbGVmdCwgdDAuZ2V0VG9wKCkgKyB0MC5nZXRIZWlnaHQoKS8yICsgMS4wXV07CiAgICAgICAgICAgICAgICAvLyBkcmF3IHRoZSBzaGFkb3cKICAgICAgICAgICAgICAgIGlmICh0aGlzLnNoYWRvdykgewogICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2hhZG93UmVuZGVyZXIuZHJhdyhjdHgsIHBvaW50cywge2xpbmVDYXA6J2J1dHQnLCBmaWxsOmZhbHNlLCBjbG9zZVBhdGg6ZmFsc2V9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIGRyYXcgdGhlIGxpbmUKICAgICAgICAgICAgICAgIGRyYXdMaW5lKHBvaW50c1swXVswXSwgcG9pbnRzWzBdWzFdLCBwb2ludHNbMV1bMF0sIHBvaW50c1sxXVsxXSwge2xpbmVDYXA6J2J1dHQnLCBzdHJva2VTdHlsZTpheGlzLmJvcmRlckNvbG9yLCBsaW5lV2lkdGg6YXhpcy5ib3JkZXJXaWR0aH0pOwogICAgICAgICAgICAgICAgLy8gZHJhdyB0aGUgdGljayBtYXJrcwogICAgICAgICAgICAgICAgZm9yICh2YXIgaj10aWNrcy5sZW5ndGg7IGo+MDsgai0tKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB0aWNrc1tqLTFdOwogICAgICAgICAgICAgICAgICAgIHMgPSB0Lm1hcmtTaXplOwogICAgICAgICAgICAgICAgICAgIG0gPSB0Lm1hcms7CiAgICAgICAgICAgICAgICAgICAgdmFyIHBvcyA9IE1hdGgucm91bmQoYXhpcy51MnAodC52YWx1ZSkpICsgMC41OwogICAgICAgICAgICAgICAgICAgIGlmICh0LnNob3dNYXJrICYmIHQubWFyaykgewogICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ291dHNpZGUnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIgPSBsZWZ0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPSBsZWZ0K3M7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdpbnNpZGUnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIgPSBsZWZ0LXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9IGxlZnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdjcm9zcyc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYiA9IGxlZnQtczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0gbGVmdCtzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiID0gbGVmdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0gbGVmdCtzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50cyA9IFtbYixwb3NdLCBbZSxwb3NdXTsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gZHJhdyB0aGUgc2hhZG93CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNoYWRvdykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zaGFkb3dSZW5kZXJlci5kcmF3KGN0eCwgcG9pbnRzLCB7bGluZUNhcDonYnV0dCcsIGxpbmVXaWR0aDp0aGlzLmdyaWRMaW5lV2lkdGgqMS41LCBvZmZzZXQ6dGhpcy5ncmlkTGluZVdpZHRoKjAuNzUsIGZpbGw6ZmFsc2UsIGNsb3NlUGF0aDpmYWxzZX0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRyYXcgdGhlIGxpbmUKICAgICAgICAgICAgICAgICAgICAgICAgZHJhd0xpbmUoYiwgcG9zLCBlLCBwb3MsIHtzdHJva2VTdHlsZTpheGlzLmJvcmRlckNvbG9yfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHQgPSBudWxsOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdDAgPSBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGF4aXMgPSBudWxsOwogICAgICAgICAgICB0aWNrcyA9ICBudWxsOwogICAgICAgIH0KICAgICAgICAKICAgICAgICBjdHgucmVzdG9yZSgpOwogICAgICAgIAogICAgICAgIGZ1bmN0aW9uIGRyYXdMaW5lKGJ4LCBieSwgZXgsIGV5LCBvcHRzKSB7CiAgICAgICAgICAgIGN0eC5zYXZlKCk7CiAgICAgICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9OwogICAgICAgICAgICBpZiAob3B0cy5saW5lV2lkdGggPT0gbnVsbCB8fCBvcHRzLmxpbmVXaWR0aCAhPSAwKXsKICAgICAgICAgICAgICAgICQuZXh0ZW5kKHRydWUsIGN0eCwgb3B0cyk7CiAgICAgICAgICAgICAgICBjdHguYmVnaW5QYXRoKCk7CiAgICAgICAgICAgICAgICBjdHgubW92ZVRvKGJ4LCBieSk7CiAgICAgICAgICAgICAgICBjdHgubGluZVRvKGV4LCBleSk7CiAgICAgICAgICAgICAgICBjdHguc3Ryb2tlKCk7CiAgICAgICAgICAgICAgICBjdHgucmVzdG9yZSgpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmICh0aGlzLnNoYWRvdykgewogICAgICAgICAgICB2YXIgcG9pbnRzID0gW1t0aGlzLl9sZWZ0LCB0aGlzLl9ib3R0b21dLCBbdGhpcy5fcmlnaHQsIHRoaXMuX2JvdHRvbV0sIFt0aGlzLl9yaWdodCwgdGhpcy5fdG9wXV07CiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2hhZG93UmVuZGVyZXIuZHJhdyhjdHgsIHBvaW50cyk7CiAgICAgICAgfQogICAgICAgIC8vIE5vdyBkcmF3IGJvcmRlciBhcm91bmQgZ3JpZC4gIFVzZSBheGlzIGJvcmRlciBkZWZpbml0aW9ucy4gc3RhcnQgYXQKICAgICAgICAvLyB1cHBlciBsZWZ0IGFuZCBnbyBjbG9ja3dpc2UuCiAgICAgICAgaWYgKHRoaXMuYm9yZGVyV2lkdGggIT0gMCAmJiB0aGlzLmRyYXdCb3JkZXIpIHsKICAgICAgICAgICAgZHJhd0xpbmUgKHRoaXMuX2xlZnQsIHRoaXMuX3RvcCwgdGhpcy5fcmlnaHQsIHRoaXMuX3RvcCwge2xpbmVDYXA6J3JvdW5kJywgc3Ryb2tlU3R5bGU6YXhlcy54MmF4aXMuYm9yZGVyQ29sb3IsIGxpbmVXaWR0aDpheGVzLngyYXhpcy5ib3JkZXJXaWR0aH0pOwogICAgICAgICAgICBkcmF3TGluZSAodGhpcy5fcmlnaHQsIHRoaXMuX3RvcCwgdGhpcy5fcmlnaHQsIHRoaXMuX2JvdHRvbSwge2xpbmVDYXA6J3JvdW5kJywgc3Ryb2tlU3R5bGU6YXhlcy55MmF4aXMuYm9yZGVyQ29sb3IsIGxpbmVXaWR0aDpheGVzLnkyYXhpcy5ib3JkZXJXaWR0aH0pOwogICAgICAgICAgICBkcmF3TGluZSAodGhpcy5fcmlnaHQsIHRoaXMuX2JvdHRvbSwgdGhpcy5fbGVmdCwgdGhpcy5fYm90dG9tLCB7bGluZUNhcDoncm91bmQnLCBzdHJva2VTdHlsZTpheGVzLnhheGlzLmJvcmRlckNvbG9yLCBsaW5lV2lkdGg6YXhlcy54YXhpcy5ib3JkZXJXaWR0aH0pOwogICAgICAgICAgICBkcmF3TGluZSAodGhpcy5fbGVmdCwgdGhpcy5fYm90dG9tLCB0aGlzLl9sZWZ0LCB0aGlzLl90b3AsIHtsaW5lQ2FwOidyb3VuZCcsIHN0cm9rZVN0eWxlOmF4ZXMueWF4aXMuYm9yZGVyQ29sb3IsIGxpbmVXaWR0aDpheGVzLnlheGlzLmJvcmRlcldpZHRofSk7CiAgICAgICAgfQogICAgICAgIC8vIGN0eC5saW5lV2lkdGggPSB0aGlzLmJvcmRlcldpZHRoOwogICAgICAgIC8vIGN0eC5zdHJva2VTdHlsZSA9IHRoaXMuYm9yZGVyQ29sb3I7CiAgICAgICAgLy8gY3R4LnN0cm9rZVJlY3QodGhpcy5fbGVmdCwgdGhpcy5fdG9wLCB0aGlzLl93aWR0aCwgdGhpcy5faGVpZ2h0KTsKICAgICAgICAKICAgICAgICBjdHgucmVzdG9yZSgpOwogICAgICAgIGN0eCA9ICBudWxsOwogICAgICAgIGF4ZXMgPSBudWxsOwogICAgfTsKIAogICAgLy8gQ2xhc3M6ICQuanFwbG90LkRpdlRpdGxlUmVuZGVyZXIKICAgIC8vIFRoZSBkZWZhdWx0IHRpdGxlIHJlbmRlcmVyIGZvciBqcVBsb3QuICBUaGlzIGNsYXNzIGhhcyBubyBvcHRpb25zIGJleW9uZCB0aGUgPFRpdGxlPiBjbGFzcy4gCiAgICAkLmpxcGxvdC5EaXZUaXRsZVJlbmRlcmVyID0gZnVuY3Rpb24oKSB7CiAgICB9OwogICAgCiAgICAkLmpxcGxvdC5EaXZUaXRsZVJlbmRlcmVyLnByb3RvdHlwZS5pbml0ID0gZnVuY3Rpb24ob3B0aW9ucykgewogICAgICAgICQuZXh0ZW5kKHRydWUsIHRoaXMsIG9wdGlvbnMpOwogICAgfTsKICAgIAogICAgJC5qcXBsb3QuRGl2VGl0bGVSZW5kZXJlci5wcm90b3R5cGUuZHJhdyA9IGZ1bmN0aW9uKCkgewogICAgICAgIC8vIE1lbW9yeSBMZWFrcyBwYXRjaAogICAgICAgIGlmICh0aGlzLl9lbGVtKSB7CiAgICAgICAgICAgIHRoaXMuX2VsZW0uZW1wdHlGb3JjZSgpOwogICAgICAgICAgICB0aGlzLl9lbGVtID0gbnVsbDsKICAgICAgICB9CgogICAgICAgIHZhciByID0gdGhpcy5yZW5kZXJlcjsKICAgICAgICB2YXIgZWxlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgICAgIHRoaXMuX2VsZW0gPSAkKGVsZW0pOwogICAgICAgIHRoaXMuX2VsZW0uYWRkQ2xhc3MoJ2pxcGxvdC10aXRsZScpOwoKICAgICAgICBpZiAoIXRoaXMudGV4dCkgewogICAgICAgICAgICB0aGlzLnNob3cgPSBmYWxzZTsKICAgICAgICAgICAgdGhpcy5fZWxlbS5oZWlnaHQoMCk7CiAgICAgICAgICAgIHRoaXMuX2VsZW0ud2lkdGgoMCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHRoaXMudGV4dCkgewogICAgICAgICAgICB2YXIgY29sb3I7CiAgICAgICAgICAgIGlmICh0aGlzLmNvbG9yKSB7CiAgICAgICAgICAgICAgICBjb2xvciA9IHRoaXMuY29sb3I7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAodGhpcy50ZXh0Q29sb3IpIHsKICAgICAgICAgICAgICAgIGNvbG9yID0gdGhpcy50ZXh0Q29sb3I7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGRvbid0IHRydXN0IHRoYXQgYSBzdHlsZXNoZWV0IGlzIHByZXNlbnQsIHNldCB0aGUgcG9zaXRpb24uCiAgICAgICAgICAgIHZhciBzdHlsZXMgPSB7cG9zaXRpb246J2Fic29sdXRlJywgdG9wOicwcHgnLCBsZWZ0OicwcHgnfTsKCiAgICAgICAgICAgIGlmICh0aGlzLl9wbG90V2lkdGgpIHsKICAgICAgICAgICAgICAgIHN0eWxlc1snd2lkdGgnXSA9IHRoaXMuX3Bsb3RXaWR0aCsncHgnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0aGlzLmZvbnRTaXplKSB7CiAgICAgICAgICAgICAgICBzdHlsZXNbJ2ZvbnRTaXplJ10gPSB0aGlzLmZvbnRTaXplOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy50ZXh0QWxpZ24gPT09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgICAgICBzdHlsZXNbJ3RleHRBbGlnbiddID0gdGhpcy50ZXh0QWxpZ247CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBzdHlsZXNbJ3RleHRBbGlnbiddID0gJ2NlbnRlcic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGNvbG9yKSB7CiAgICAgICAgICAgICAgICBzdHlsZXNbJ2NvbG9yJ10gPSBjb2xvcjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGhpcy5wYWRkaW5nQm90dG9tKSB7CiAgICAgICAgICAgICAgICBzdHlsZXNbJ3BhZGRpbmdCb3R0b20nXSA9IHRoaXMucGFkZGluZ0JvdHRvbTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGhpcy5mb250RmFtaWx5KSB7CiAgICAgICAgICAgICAgICBzdHlsZXNbJ2ZvbnRGYW1pbHknXSA9IHRoaXMuZm9udEZhbWlseTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5fZWxlbS5jc3Moc3R5bGVzKTsKICAgICAgICAgICAgaWYgKHRoaXMuZXNjYXBlSHRtbCkgewogICAgICAgICAgICAgICAgdGhpcy5fZWxlbS50ZXh0KHRoaXMudGV4dCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICB0aGlzLl9lbGVtLmh0bWwodGhpcy50ZXh0KTsKICAgICAgICAgICAgfQoKCiAgICAgICAgICAgIC8vIHN0eWxldGV4dCArPSAodGhpcy5fcGxvdFdpZHRoKSA/ICd3aWR0aDonK3RoaXMuX3Bsb3RXaWR0aCsncHg7JyA6ICcnOwogICAgICAgICAgICAvLyBzdHlsZXRleHQgKz0gKHRoaXMuZm9udFNpemUpID8gJ2ZvbnQtc2l6ZTonK3RoaXMuZm9udFNpemUrJzsnIDogJyc7CiAgICAgICAgICAgIC8vIHN0eWxldGV4dCArPSAodGhpcy50ZXh0QWxpZ24pID8gJ3RleHQtYWxpZ246Jyt0aGlzLnRleHRBbGlnbisnOycgOiAndGV4dC1hbGlnbjpjZW50ZXI7JzsKICAgICAgICAgICAgLy8gc3R5bGV0ZXh0ICs9IChjb2xvcikgPyAnY29sb3I6Jytjb2xvcisnOycgOiAnJzsKICAgICAgICAgICAgLy8gc3R5bGV0ZXh0ICs9ICh0aGlzLnBhZGRpbmdCb3R0b20pID8gJ3BhZGRpbmctYm90dG9tOicrdGhpcy5wYWRkaW5nQm90dG9tKyc7JyA6ICcnOwogICAgICAgICAgICAvLyB0aGlzLl9lbGVtID0gJCgnPGRpdiBjbGFzcz0ianFwbG90LXRpdGxlIiBzdHlsZT0iJytzdHlsZXRleHQrJyI+Jyt0aGlzLnRleHQrJzwvZGl2PicpOwogICAgICAgICAgICAvLyBpZiAodGhpcy5mb250RmFtaWx5KSB7CiAgICAgICAgICAgIC8vICAgICB0aGlzLl9lbGVtLmNzcygnZm9udC1mYW1pbHknLCB0aGlzLmZvbnRGYW1pbHkpOwogICAgICAgICAgICAvLyB9CiAgICAgICAgfQoKICAgICAgICBlbGVtID0gbnVsbDsKICAgICAgICAKICAgICAgICByZXR1cm4gdGhpcy5fZWxlbTsKICAgIH07CiAgICAKICAgICQuanFwbG90LkRpdlRpdGxlUmVuZGVyZXIucHJvdG90eXBlLnBhY2sgPSBmdW5jdGlvbigpIHsKICAgICAgICAvLyBub3RoaW5nIHRvIGRvIGhlcmUKICAgIH07CiAgCgogICAgdmFyIGRvdGxlbiA9IDAuMTsKCiAgICAkLmpxcGxvdC5MaW5lUGF0dGVybiA9IGZ1bmN0aW9uIChjdHgsIHBhdHRlcm4pIHsKCgkJdmFyIGRlZmF1bHRMaW5lUGF0dGVybnMgPSB7CgkJCWRvdHRlZDogWyBkb3RsZW4sICQuanFwbG90LmNvbmZpZy5kb3RHYXBMZW5ndGggXSwKCQkJZGFzaGVkOiBbICQuanFwbG90LmNvbmZpZy5kYXNoTGVuZ3RoLCAkLmpxcGxvdC5jb25maWcuZ2FwTGVuZ3RoIF0sCgkJCXNvbGlkOiBudWxsCgkJfTsgICAJCgogICAgICAgIGlmICh0eXBlb2YgcGF0dGVybiA9PT0gJ3N0cmluZycpIHsKICAgICAgICAgICAgaWYgKHBhdHRlcm5bMF0gPT09ICcuJyB8fCBwYXR0ZXJuWzBdID09PSAnLScpIHsKICAgICAgICAgICAgICAgIHZhciBzID0gcGF0dGVybjsKICAgICAgICAgICAgICAgIHBhdHRlcm4gPSBbXTsKICAgICAgICAgICAgICAgIGZvciAodmFyIGk9MCwgaW1heD1zLmxlbmd0aDsgaTxpbWF4OyBpKyspIHsKICAgICAgICAgICAgICAgICAgICBpZiAoc1tpXSA9PT0gJy4nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm4ucHVzaCggZG90bGVuICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHNbaV0gPT09ICctJykgewogICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuLnB1c2goICQuanFwbG90LmNvbmZpZy5kYXNoTGVuZ3RoICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcGF0dGVybi5wdXNoKCAkLmpxcGxvdC5jb25maWcuZ2FwTGVuZ3RoICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBwYXR0ZXJuID0gZGVmYXVsdExpbmVQYXR0ZXJuc1twYXR0ZXJuXTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCEocGF0dGVybiAmJiBwYXR0ZXJuLmxlbmd0aCkpIHsKICAgICAgICAgICAgcmV0dXJuIGN0eDsKICAgICAgICB9CgogICAgICAgIHZhciBwYXR0ZXJuSW5kZXggPSAwOwogICAgICAgIHZhciBwYXR0ZXJuRGlzdGFuY2UgPSBwYXR0ZXJuWzBdOwogICAgICAgIHZhciBweCA9IDA7CiAgICAgICAgdmFyIHB5ID0gMDsKICAgICAgICB2YXIgcGF0aHgwID0gMDsKICAgICAgICB2YXIgcGF0aHkwID0gMDsKCiAgICAgICAgdmFyIG1vdmVUbyA9IGZ1bmN0aW9uICh4LCB5KSB7CiAgICAgICAgICAgIGN0eC5tb3ZlVG8oIHgsIHkgKTsKICAgICAgICAgICAgcHggPSB4OwogICAgICAgICAgICBweSA9IHk7CiAgICAgICAgICAgIHBhdGh4MCA9IHg7CiAgICAgICAgICAgIHBhdGh5MCA9IHk7CiAgICAgICAgfTsKCiAgICAgICAgdmFyIGxpbmVUbyA9IGZ1bmN0aW9uICh4LCB5KSB7CiAgICAgICAgICAgIHZhciBzY2FsZSA9IGN0eC5saW5lV2lkdGg7CiAgICAgICAgICAgIHZhciBkeCA9IHggLSBweDsKICAgICAgICAgICAgdmFyIGR5ID0geSAtIHB5OwogICAgICAgICAgICB2YXIgZGlzdCA9IE1hdGguc3FydChkeCpkeCtkeSpkeSk7CiAgICAgICAgICAgIGlmICgoZGlzdCA+IDApICYmIChzY2FsZSA+IDApKSB7CiAgICAgICAgICAgICAgICBkeCAvPSBkaXN0OwogICAgICAgICAgICAgICAgZHkgLz0gZGlzdDsKICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGRwID0gc2NhbGUgKiBwYXR0ZXJuRGlzdGFuY2U7CiAgICAgICAgICAgICAgICAgICAgaWYgKGRwIDwgZGlzdCkgewogICAgICAgICAgICAgICAgICAgICAgICBweCArPSBkcCAqIGR4OwogICAgICAgICAgICAgICAgICAgICAgICBweSArPSBkcCAqIGR5OwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHBhdHRlcm5JbmRleCAmIDEpID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC5saW5lVG8oIHB4LCBweSApOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4Lm1vdmVUbyggcHgsIHB5ICk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZGlzdCAtPSBkcDsKICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybkluZGV4Kys7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXR0ZXJuSW5kZXggPj0gcGF0dGVybi5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm5JbmRleCA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybkRpc3RhbmNlID0gcGF0dGVybltwYXR0ZXJuSW5kZXhdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgcHggPSB4OwogICAgICAgICAgICAgICAgICAgICAgICBweSA9IHk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocGF0dGVybkluZGV4ICYgMSkgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LmxpbmVUbyggcHgsIHB5ICk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgubW92ZVRvKCBweCwgcHkgKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuRGlzdGFuY2UgLT0gZGlzdCAvIHNjYWxlOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9OwoKICAgICAgICB2YXIgYmVnaW5QYXRoID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICBjdHguYmVnaW5QYXRoKCk7CiAgICAgICAgfTsKCiAgICAgICAgdmFyIGNsb3NlUGF0aCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgbGluZVRvKCBwYXRoeDAsIHBhdGh5MCApOwogICAgICAgIH07CgogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIG1vdmVUbzogbW92ZVRvLAogICAgICAgICAgICBsaW5lVG86IGxpbmVUbywKICAgICAgICAgICAgYmVnaW5QYXRoOiBiZWdpblBhdGgsCiAgICAgICAgICAgIGNsb3NlUGF0aDogY2xvc2VQYXRoCiAgICAgICAgfTsKICAgIH07CgogICAgLy8gQ2xhc3M6ICQuanFwbG90LkxpbmVSZW5kZXJlcgogICAgLy8gVGhlIGRlZmF1bHQgbGluZSByZW5kZXJlciBmb3IganFQbG90LCB0aGlzIGNsYXNzIGhhcyBubyBvcHRpb25zIGJleW9uZCB0aGUgPFNlcmllcz4gY2xhc3MuCiAgICAvLyBEcmF3cyBzZXJpZXMgYXMgYSBsaW5lLgogICAgJC5qcXBsb3QuTGluZVJlbmRlcmVyID0gZnVuY3Rpb24oKXsKICAgICAgICB0aGlzLnNoYXBlUmVuZGVyZXIgPSBuZXcgJC5qcXBsb3QuU2hhcGVSZW5kZXJlcigpOwogICAgICAgIHRoaXMuc2hhZG93UmVuZGVyZXIgPSBuZXcgJC5qcXBsb3QuU2hhZG93UmVuZGVyZXIoKTsKICAgIH07CiAgICAKICAgIC8vIGNhbGxlZCB3aXRoIHNjb3BlIG9mIHNlcmllcy4KICAgICQuanFwbG90LkxpbmVSZW5kZXJlci5wcm90b3R5cGUuaW5pdCA9IGZ1bmN0aW9uKG9wdGlvbnMsIHBsb3QpIHsKICAgICAgICAvLyBHcm91cDogUHJvcGVydGllcwogICAgICAgIC8vCiAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307CiAgICAgICAgdGhpcy5fdHlwZT0nbGluZSc7CiAgICAgICAgdGhpcy5yZW5kZXJlci5hbmltYXRpb24gPSB7CiAgICAgICAgICAgIHNob3c6IGZhbHNlLAogICAgICAgICAgICBkaXJlY3Rpb246ICdsZWZ0JywKICAgICAgICAgICAgc3BlZWQ6IDI1MDAsCiAgICAgICAgICAgIF9zdXBwb3J0ZWQ6IHRydWUKICAgICAgICB9OwogICAgICAgIC8vIHByb3A6IHNtb290aAogICAgICAgIC8vIFRydWUgdG8gZHJhdyBhIHNtb290aGVkIChpbnRlcnBvbGF0ZWQpIGxpbmUgdGhyb3VnaCB0aGUgZGF0YSBwb2ludHMKICAgICAgICAvLyB3aXRoIGF1dG9tYXRpY2FsbHkgY29tcHV0ZWQgbnVtYmVyIG9mIHNtb290aGluZyBwb2ludHMuCiAgICAgICAgLy8gU2V0IHRvIGFuIGludGVnZXIgbnVtYmVyID4gMiB0byBzcGVjaWZ5IG51bWJlciBvZiBzbW9vdGhpbmcgcG9pbnRzCiAgICAgICAgLy8gdG8gdXNlIGJldHdlZW4gZWFjaCBkYXRhIHBvaW50LgogICAgICAgIHRoaXMucmVuZGVyZXIuc21vb3RoID0gZmFsc2U7ICAvLyB0cnVlIG9yIGEgbnVtYmVyID4gMiBmb3Igc21vb3RoaW5nLgogICAgICAgIHRoaXMucmVuZGVyZXIudGVuc2lvbiA9IG51bGw7IC8vIG51bGwgdG8gYXV0byBjb21wdXRlIG9yIGEgbnVtYmVyIHR5cGljYWxseSA+IDYuICBGZXdlciBwb2ludHMgcmVxdWlyZXMgaGlnaGVyIHRlbnNpb24uCiAgICAgICAgLy8gcHJvcDogY29uc3RyYWluU21vb3RoaW5nCiAgICAgICAgLy8gVHJ1ZSB0byB1c2UgYSBtb3JlIGFjY3VyYXRlIHNtb290aGluZyBhbGdvcml0aG0gdGhhdCB3aWxsCiAgICAgICAgLy8gbm90IG92ZXJzaG9vdCBhbnkgZGF0YSBwb2ludHMuICBGYWxzZSB0byBhbGxvdyBvdmVyc2hvb3QgYnV0CiAgICAgICAgLy8gcHJvZHVjZSBhIHNtb290aGVyIGxvb2tpbmcgbGluZS4KICAgICAgICB0aGlzLnJlbmRlcmVyLmNvbnN0cmFpblNtb290aGluZyA9IHRydWU7CiAgICAgICAgLy8gdGhpcyBpcyBzbW9vdGhlZCBkYXRhIGluIGdyaWQgY29vcmRpbmF0ZXMsIGxpa2UgZ3JpZERhdGEKICAgICAgICB0aGlzLnJlbmRlcmVyLl9zbW9vdGhlZERhdGEgPSBbXTsKICAgICAgICAvLyB0aGlzIGlzIHNtb290aGVkIGRhdGEgaW4gcGxvdCB1bml0cyAocGxvdCBjb29yZGluYXRlcyksIGxpa2UgcGxvdERhdGEuCiAgICAgICAgdGhpcy5yZW5kZXJlci5fc21vb3RoZWRQbG90RGF0YSA9IFtdOwogICAgICAgIHRoaXMucmVuZGVyZXIuX2hpQmFuZEdyaWREYXRhID0gW107CiAgICAgICAgdGhpcy5yZW5kZXJlci5fbG93QmFuZEdyaWREYXRhID0gW107CiAgICAgICAgdGhpcy5yZW5kZXJlci5faGlCYW5kU21vb3RoZWREYXRhID0gW107CiAgICAgICAgdGhpcy5yZW5kZXJlci5fbG93QmFuZFNtb290aGVkRGF0YSA9IFtdOwoKICAgICAgICAvLyBwcm9wOiBiYW5kRGF0YQogICAgICAgIC8vIERhdGEgdXNlZCB0byBkcmF3IGVycm9yIGJhbmRzIG9yIGNvbmZpZGVuY2UgaW50ZXJ2YWxzIGFib3ZlL2JlbG93IGEgbGluZS4KICAgICAgICAvLwogICAgICAgIC8vIGJhbmREYXRhIGNhbiBiZSBpbnB1dCBpbiAzIGZvcm1zLiAganFQbG90IHdpbGwgZmlndXJlIG91dCB3aGljaCBpcyB0aGUKICAgICAgICAvLyBsb3cgYmFuZCBsaW5lIGFuZCB3aGljaCBpcyB0aGUgaGlnaCBiYW5kIGxpbmUgZm9yIGFsbCBmb3JtczoKICAgICAgICAvLyAKICAgICAgICAvLyBBIDIgZGltZW5zaW9uYWwgYXJyYXkgbGlrZSBbW3lsMSwgeWwyLCAuLi5dLCBbeXUxLCB5dTIsIC4uLl1dIHdoZXJlCiAgICAgICAgLy8gW3lsMSwgeWwyLCAuLi5dIGFyZSB5IHZhbHVlcyBvZiB0aGUgbG93ZXIgbGluZSBhbmQKICAgICAgICAvLyBbeXUxLCB5dTIsIC4uLl0gYXJlIHkgdmFsdWVzIG9mIHRoZSB1cHBlciBsaW5lLgogICAgICAgIC8vIEluIHRoaXMgY2FzZSB0aGVyZSBtdXN0IGJlIHRoZSBzYW1lIG51bWJlciBvZiB5IGRhdGEgcG9pbnRzIGFzIGRhdGEgcG9pbnRzCiAgICAgICAgLy8gaW4gdGhlIHNlcmllcyBhbmQgdGhlIGJhbmRzIHdpbGwgaW5oZXJpdCB0aGUgeCB2YWx1ZXMgb2YgdGhlIHNlcmllcy4KICAgICAgICAvLwogICAgICAgIC8vIEEgMiBkaW1lbnNpb25hbCBhcnJheSBsaWtlIFtbW3hsMSwgeWwxXSwgW3hsMiwgeWwyXSwgLi4uXSwgW1t4aDEsIHloMV0sIFt4aDIsIHloMl0sIC4uLl1dCiAgICAgICAgLy8gd2hlcmUgW3hsMSwgeWwxXSBhcmUgeCx5IGRhdGEgcG9pbnRzIGZvciB0aGUgbG93ZXIgbGluZSBhbmQKICAgICAgICAvLyBbeGgxLCB5aDFdIGFyZSB4LHkgZGF0YSBwb2ludHMgZm9yIHRoZSBoaWdoIGxpbmUuCiAgICAgICAgLy8geCB2YWx1ZXMgZG8gbm90IGhhdmUgdG8gY29ycmVzcG9uZCB0byB0aGUgeCB2YWx1ZXMgb2YgdGhlIHNlcmllcyBhbmQgY2FuCiAgICAgICAgLy8gYmUgb2YgYW55IGFyYml0cmFyeSBsZW5ndGguCiAgICAgICAgLy8KICAgICAgICAvLyBDYW4gYmUgb2YgZm9ybSBbW3lsMSwgeXUxXSwgW3lsMiwgeXUyXSwgW3lsMywgeXUzXSwgLi4uXSB3aGVyZQogICAgICAgIC8vIHRoZXJlIG11c3QgYmUgMyBvciBtb3JlIGFycmF5cyBhbmQgdGhlcmUgbXVzdCBiZSB0aGUgc2FtZSBudW1iZXIgb2YgYXJyYXlzCiAgICAgICAgLy8gYXMgdGhlcmUgYXJlIGRhdGEgcG9pbnRzIGluIHRoZSBzZXJpZXMuICBJbiB0aGlzIGNhc2UsIAogICAgICAgIC8vIFt5bDEsIHl1MV0gc3BlY2lmaWVzIHRoZSBsb3dlciBhbmQgdXBwZXIgeSB2YWx1ZXMgZm9yIHRoZSAxc3QKICAgICAgICAvLyBkYXRhIHBvaW50IGFuZCBzbyBvbi4gIFRoZSBiYW5kcyB3aWxsIGluaGVyaXQgdGhlIHgKICAgICAgICAvLyB2YWx1ZXMgZnJvbSB0aGUgc2VyaWVzLgogICAgICAgIHRoaXMucmVuZGVyZXIuYmFuZERhdGEgPSBbXTsKCiAgICAgICAgLy8gR3JvdXA6IGJhbmRzCiAgICAgICAgLy8gQmFuZGluZyBhcm91bmQgbGluZSwgZS5nIGVycm9yIGJhbmRzIG9yIGNvbmZpZGVuY2UgaW50ZXJ2YWxzLgogICAgICAgIHRoaXMucmVuZGVyZXIuYmFuZHMgPSB7CiAgICAgICAgICAgIC8vIHByb3A6IHNob3cKICAgICAgICAgICAgLy8gdHJ1ZSB0byBzaG93IHRoZSBiYW5kcy4gIElmIGJhbmREYXRhIG9yIGludGVydmFsIGlzCiAgICAgICAgICAgIC8vIHN1cHBsaWVkLCBzaG93IHdpbGwgYmUgc2V0IHRvIHRydWUgYnkgZGVmYXVsdC4KICAgICAgICAgICAgc2hvdzogZmFsc2UsCiAgICAgICAgICAgIGhpRGF0YTogW10sCiAgICAgICAgICAgIGxvd0RhdGE6IFtdLAogICAgICAgICAgICAvLyBwcm9wOiBjb2xvcgogICAgICAgICAgICAvLyBjb2xvciBvZiBsaW5lcyBhdCB0b3AgYW5kIGJvdHRvbSBvZiBiYW5kcyBbZGVmYXVsdDogc2VyaWVzIGNvbG9yXS4KICAgICAgICAgICAgY29sb3I6IHRoaXMuY29sb3IsCiAgICAgICAgICAgIC8vIHByb3A6IHNob3dMaW5lcwogICAgICAgICAgICAvLyBUcnVlIHRvIHNob3cgbGluZXMgYXQgdG9wIGFuZCBib3R0b20gb2YgYmFuZHMgW2RlZmF1bHQ6IGZhbHNlXS4KICAgICAgICAgICAgc2hvd0xpbmVzOiBmYWxzZSwKICAgICAgICAgICAgLy8gcHJvcDogZmlsbAogICAgICAgICAgICAvLyBUcnVlIHRvIGZpbGwgYXJlYSBiZXR3ZWVuIGJhbmRzIFtkZWZhdWx0OiB0cnVlXS4KICAgICAgICAgICAgZmlsbDogdHJ1ZSwKICAgICAgICAgICAgLy8gcHJvcDogZmlsbENvbG9yCiAgICAgICAgICAgIC8vIGNzcyBjb2xvciBzcGVjIGZvciBmaWxsZWQgYXJlYS4gIFtkZWZhdWx0OiBzZXJpZXMgY29sb3JdLgogICAgICAgICAgICBmaWxsQ29sb3I6IG51bGwsCiAgICAgICAgICAgIF9taW46IG51bGwsCiAgICAgICAgICAgIF9tYXg6IG51bGwsCiAgICAgICAgICAgIC8vIHByb3A6IGludGVydmFsCiAgICAgICAgICAgIC8vIFVzZXIgc3BlY2lmaWVkIGludGVydmFsIGFib3ZlIGFuZCBiZWxvdyBsaW5lIGZvciBiYW5kcyBbZGVmYXVsdDogJzMlJyddLgogICAgICAgICAgICAvLyBDYW4gYmUgYSB2YWx1ZSBsaWtlIDMgb3IgYSBzdHJpbmcgbGlrZSAnMyUnIAogICAgICAgICAgICAvLyBvciBhbiB1cHBlci9sb3dlciBhcnJheSBsaWtlIFsxLCAtMl0gb3IgWycyJScsICctMS41JSddCiAgICAgICAgICAgIGludGVydmFsOiAnMyUnCiAgICAgICAgfTsKCgogICAgICAgIHZhciBsb3B0cyA9IHtoaWdobGlnaHRNb3VzZU92ZXI6IG9wdGlvbnMuaGlnaGxpZ2h0TW91c2VPdmVyLCBoaWdobGlnaHRNb3VzZURvd246IG9wdGlvbnMuaGlnaGxpZ2h0TW91c2VEb3duLCBoaWdobGlnaHRDb2xvcjogb3B0aW9ucy5oaWdobGlnaHRDb2xvcn07CiAgICAgICAgCiAgICAgICAgZGVsZXRlIChvcHRpb25zLmhpZ2hsaWdodE1vdXNlT3Zlcik7CiAgICAgICAgZGVsZXRlIChvcHRpb25zLmhpZ2hsaWdodE1vdXNlRG93bik7CiAgICAgICAgZGVsZXRlIChvcHRpb25zLmhpZ2hsaWdodENvbG9yKTsKICAgICAgICAKICAgICAgICAkLmV4dGVuZCh0cnVlLCB0aGlzLnJlbmRlcmVyLCBvcHRpb25zKTsKCiAgICAgICAgdGhpcy5yZW5kZXJlci5vcHRpb25zID0gb3B0aW9uczsKCiAgICAgICAgLy8gaWYgd2UgYXJlIGdpdmVuIHNvbWUgYmFuZCBkYXRhLCBhbmQgYmFuZHMgYXJlbid0IGV4cGxpY2l0eSBzZXQgdG8gZmFsc2UgaW4gb3B0aW9ucywgdHVybiB0aGVtIG9uLgogICAgICAgIGlmICh0aGlzLnJlbmRlcmVyLmJhbmREYXRhLmxlbmd0aCA+IDEgJiYgKCFvcHRpb25zLmJhbmRzIHx8IG9wdGlvbnMuYmFuZHMuc2hvdyA9PSBudWxsKSkgewogICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmJhbmRzLnNob3cgPSB0cnVlOwogICAgICAgIH0KCiAgICAgICAgLy8gaWYgd2UgYXJlIGdpdmVuIGFuIGludGVydmFsLCBhbmQgYmFuZHMgYXJlbid0IGV4cGxpY2l0eSBzZXQgdG8gZmFsc2UgaW4gb3B0aW9ucywgdHVybiB0aGVtIG9uLgogICAgICAgIGVsc2UgaWYgKG9wdGlvbnMuYmFuZHMgJiYgb3B0aW9ucy5iYW5kcy5zaG93ID09IG51bGwgJiYgb3B0aW9ucy5iYW5kcy5pbnRlcnZhbCAhPSBudWxsKSB7CiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuYmFuZHMuc2hvdyA9IHRydWU7CiAgICAgICAgfQoKICAgICAgICAvLyBpZiBwbG90IGlzIGZpbGxlZCwgdHVybiBvZmYgYmFuZHMuCiAgICAgICAgaWYgKHRoaXMuZmlsbCkgewogICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmJhbmRzLnNob3cgPSBmYWxzZTsKICAgICAgICB9CgogICAgICAgIGlmICh0aGlzLnJlbmRlcmVyLmJhbmRzLnNob3cpIHsKICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5pbml0QmFuZHMuY2FsbCh0aGlzLCB0aGlzLnJlbmRlcmVyLm9wdGlvbnMsIHBsb3QpOwogICAgICAgIH0KCgogICAgICAgIC8vIHNtb290aGluZyBpcyBub3QgY29tcGF0aWJsZSB3aXRoIHN0YWNrZWQgbGluZXMsIGRpc2FibGUKICAgICAgICBpZiAodGhpcy5fc3RhY2spIHsKICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zbW9vdGggPSBmYWxzZTsKICAgICAgICB9CgogICAgICAgIC8vIHNldCB0aGUgc2hhcGUgcmVuZGVyZXIgb3B0aW9ucwogICAgICAgIHZhciBvcHRzID0ge2xpbmVKb2luOnRoaXMubGluZUpvaW4sIGxpbmVDYXA6dGhpcy5saW5lQ2FwLCBmaWxsOnRoaXMuZmlsbCwgaXNhcmM6ZmFsc2UsIHN0cm9rZVN0eWxlOnRoaXMuY29sb3IsIGZpbGxTdHlsZTp0aGlzLmZpbGxDb2xvciwgbGluZVdpZHRoOnRoaXMubGluZVdpZHRoLCBsaW5lUGF0dGVybjp0aGlzLmxpbmVQYXR0ZXJuLCBjbG9zZVBhdGg6dGhpcy5maWxsfTsKICAgICAgICB0aGlzLnJlbmRlcmVyLnNoYXBlUmVuZGVyZXIuaW5pdChvcHRzKTsKCiAgICAgICAgdmFyIHNoYWRvd19vZmZzZXQgPSBvcHRpb25zLnNoYWRvd09mZnNldDsKICAgICAgICAvLyBzZXQgdGhlIHNoYWRvdyByZW5kZXJlciBvcHRpb25zCiAgICAgICAgaWYgKHNoYWRvd19vZmZzZXQgPT0gbnVsbCkgewogICAgICAgICAgICAvLyBzY2FsZSB0aGUgc2hhZG93T2Zmc2V0IHRvIHRoZSB3aWR0aCBvZiB0aGUgbGluZS4KICAgICAgICAgICAgaWYgKHRoaXMubGluZVdpZHRoID4gMi41KSB7CiAgICAgICAgICAgICAgICBzaGFkb3dfb2Zmc2V0ID0gMS4yNSAqICgxICsgKE1hdGguYXRhbigodGhpcy5saW5lV2lkdGgvMi41KSkvMC43ODUzOTgxNjMgLSAxKSowLjYpOwogICAgICAgICAgICAgICAgLy8gdmFyIHNoYWRvd19vZmZzZXQgPSB0aGlzLnNoYWRvd09mZnNldDsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBmb3Igc2tpbm55IGxpbmVzLCBkb24ndCBtYWtlIHN1Y2ggYSBiaWcgc2hhZG93LgogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHNoYWRvd19vZmZzZXQgPSAxLjI1ICogTWF0aC5hdGFuKCh0aGlzLmxpbmVXaWR0aC8yLjUpKS8wLjc4NTM5ODE2MzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAKICAgICAgICB2YXIgc29wdHMgPSB7bGluZUpvaW46dGhpcy5saW5lSm9pbiwgbGluZUNhcDp0aGlzLmxpbmVDYXAsIGZpbGw6dGhpcy5maWxsLCBpc2FyYzpmYWxzZSwgYW5nbGU6dGhpcy5zaGFkb3dBbmdsZSwgb2Zmc2V0OnNoYWRvd19vZmZzZXQsIGFscGhhOnRoaXMuc2hhZG93QWxwaGEsIGRlcHRoOnRoaXMuc2hhZG93RGVwdGgsIGxpbmVXaWR0aDp0aGlzLmxpbmVXaWR0aCwgbGluZVBhdHRlcm46dGhpcy5saW5lUGF0dGVybiwgY2xvc2VQYXRoOnRoaXMuZmlsbH07CiAgICAgICAgdGhpcy5yZW5kZXJlci5zaGFkb3dSZW5kZXJlci5pbml0KHNvcHRzKTsKICAgICAgICB0aGlzLl9hcmVhUG9pbnRzID0gW107CiAgICAgICAgdGhpcy5fYm91bmRpbmdCb3ggPSBbW10sW11dOwogICAgICAgIAogICAgICAgIGlmICghdGhpcy5pc1RyZW5kbGluZSAmJiB0aGlzLmZpbGwgfHwgdGhpcy5yZW5kZXJlci5iYW5kcy5zaG93KSB7CiAgICAgICAgICAgIC8vIEdyb3VwOiBQcm9wZXJ0aWVzCiAgICAgICAgICAgIC8vICAgICAgICAKICAgICAgICAgICAgLy8gcHJvcDogaGlnaGxpZ2h0TW91c2VPdmVyCiAgICAgICAgICAgIC8vIFRydWUgdG8gaGlnaGxpZ2h0IGFyZWEgb24gYSBmaWxsZWQgcGxvdCB3aGVuIG1vdXNlZCBvdmVyLgogICAgICAgICAgICAvLyBUaGlzIG11c3QgYmUgZmFsc2UgdG8gZW5hYmxlIGhpZ2hsaWdodE1vdXNlRG93biB0byBoaWdobGlnaHQgd2hlbiBjbGlja2luZyBvbiBhbiBhcmVhIG9uIGEgZmlsbGVkIHBsb3QuCiAgICAgICAgICAgIHRoaXMuaGlnaGxpZ2h0TW91c2VPdmVyID0gdHJ1ZTsKICAgICAgICAgICAgLy8gcHJvcDogaGlnaGxpZ2h0TW91c2VEb3duCiAgICAgICAgICAgIC8vIFRydWUgdG8gaGlnaGxpZ2h0IHdoZW4gYSBtb3VzZSBidXR0b24gaXMgcHJlc3NlZCBvdmVyIGFuIGFyZWEgb24gYSBmaWxsZWQgcGxvdC4KICAgICAgICAgICAgLy8gVGhpcyB3aWxsIGJlIGRpc2FibGVkIGlmIGhpZ2hsaWdodE1vdXNlT3ZlciBpcyB0cnVlLgogICAgICAgICAgICB0aGlzLmhpZ2hsaWdodE1vdXNlRG93biA9IGZhbHNlOwogICAgICAgICAgICAvLyBwcm9wOiBoaWdobGlnaHRDb2xvcgogICAgICAgICAgICAvLyBjb2xvciB0byB1c2Ugd2hlbiBoaWdobGlnaHRpbmcgYW4gYXJlYSBvbiBhIGZpbGxlZCBwbG90LgogICAgICAgICAgICB0aGlzLmhpZ2hsaWdodENvbG9yID0gbnVsbDsKICAgICAgICAgICAgLy8gaWYgdXNlciBoYXMgcGFzc2VkIGluIGhpZ2hsaWdodE1vdXNlRG93biBvcHRpb24gYW5kIG5vdCBzZXQgaGlnaGxpZ2h0TW91c2VPdmVyLCBkaXNhYmxlIGhpZ2hsaWdodE1vdXNlT3ZlcgogICAgICAgICAgICBpZiAobG9wdHMuaGlnaGxpZ2h0TW91c2VEb3duICYmIGxvcHRzLmhpZ2hsaWdodE1vdXNlT3ZlciA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICBsb3B0cy5oaWdobGlnaHRNb3VzZU92ZXIgPSBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgIAogICAgICAgICAgICAkLmV4dGVuZCh0cnVlLCB0aGlzLCB7aGlnaGxpZ2h0TW91c2VPdmVyOiBsb3B0cy5oaWdobGlnaHRNb3VzZU92ZXIsIGhpZ2hsaWdodE1vdXNlRG93bjogbG9wdHMuaGlnaGxpZ2h0TW91c2VEb3duLCBoaWdobGlnaHRDb2xvcjogbG9wdHMuaGlnaGxpZ2h0Q29sb3J9KTsKICAgICAgICAgICAgCiAgICAgICAgICAgIGlmICghdGhpcy5oaWdobGlnaHRDb2xvcikgewogICAgICAgICAgICAgICAgdmFyIGZjID0gKHRoaXMucmVuZGVyZXIuYmFuZHMuc2hvdykgPyB0aGlzLnJlbmRlcmVyLmJhbmRzLmZpbGxDb2xvciA6IHRoaXMuZmlsbENvbG9yOwogICAgICAgICAgICAgICAgdGhpcy5oaWdobGlnaHRDb2xvciA9ICQuanFwbG90LmNvbXB1dGVIaWdobGlnaHRDb2xvcnMoZmMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIHR1cm4gb2ZmIChkaXNhYmxlKSB0aGUgaGlnaGxpZ2h0ZXIgcGx1Z2luCiAgICAgICAgICAgIGlmICh0aGlzLmhpZ2hsaWdodGVyKSB7CiAgICAgICAgICAgICAgICB0aGlzLmhpZ2hsaWdodGVyLnNob3cgPSBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZiAoIXRoaXMuaXNUcmVuZGxpbmUgJiYgcGxvdCkgewogICAgICAgICAgICBwbG90LnBsdWdpbnMubGluZVJlbmRlcmVyID0ge307CiAgICAgICAgICAgIHBsb3QucG9zdEluaXRIb29rcy5hZGRPbmNlKHBvc3RJbml0KTsKICAgICAgICAgICAgcGxvdC5wb3N0RHJhd0hvb2tzLmFkZE9uY2UocG9zdFBsb3REcmF3KTsKICAgICAgICAgICAgcGxvdC5ldmVudExpc3RlbmVySG9va3MuYWRkT25jZSgnanFwbG90TW91c2VNb3ZlJywgaGFuZGxlTW92ZSk7CiAgICAgICAgICAgIHBsb3QuZXZlbnRMaXN0ZW5lckhvb2tzLmFkZE9uY2UoJ2pxcGxvdE1vdXNlRG93bicsIGhhbmRsZU1vdXNlRG93bik7CiAgICAgICAgICAgIHBsb3QuZXZlbnRMaXN0ZW5lckhvb2tzLmFkZE9uY2UoJ2pxcGxvdE1vdXNlVXAnLCBoYW5kbGVNb3VzZVVwKTsKICAgICAgICAgICAgcGxvdC5ldmVudExpc3RlbmVySG9va3MuYWRkT25jZSgnanFwbG90Q2xpY2snLCBoYW5kbGVDbGljayk7CiAgICAgICAgICAgIHBsb3QuZXZlbnRMaXN0ZW5lckhvb2tzLmFkZE9uY2UoJ2pxcGxvdFJpZ2h0Q2xpY2snLCBoYW5kbGVSaWdodENsaWNrKTsKICAgICAgICB9CgogICAgfTsKCiAgICAkLmpxcGxvdC5MaW5lUmVuZGVyZXIucHJvdG90eXBlLmluaXRCYW5kcyA9IGZ1bmN0aW9uKG9wdGlvbnMsIHBsb3QpIHsKICAgICAgICAvLyB1c2UgYmFuZERhdGEgaWYgbm8gZGF0YSBzcGVjaWZpZWQgaW4gYmFuZHMgb3B0aW9uCiAgICAgICAgLy92YXIgYmQgPSB0aGlzLnJlbmRlcmVyLmJhbmREYXRhOwogICAgICAgIHZhciBiZCA9IG9wdGlvbnMuYmFuZERhdGEgfHwgW107CiAgICAgICAgdmFyIGJhbmRzID0gdGhpcy5yZW5kZXJlci5iYW5kczsKICAgICAgICBiYW5kcy5oaURhdGEgPSBbXTsKICAgICAgICBiYW5kcy5sb3dEYXRhID0gW107CiAgICAgICAgdmFyIGRhdGEgPSB0aGlzLmRhdGE7CiAgICAgICAgYmFuZHMuX21heCA9IG51bGw7CiAgICAgICAgYmFuZHMuX21pbiA9IG51bGw7CiAgICAgICAgLy8gSWYgMiBhcnJheXMsIGFuZCBlYWNoIGFycmF5IGdyZWF0ZXIgdGhhbiAyIGVsZW1lbnRzLCBhc3N1bWUgaXQgaXMgaGkgYW5kIGxvdyBkYXRhIGJhbmRzIG9mIHkgdmFsdWVzLgogICAgICAgIGlmIChiZC5sZW5ndGggPT0gMikgewogICAgICAgICAgICAvLyBEbyB3ZSBoYXZlIGFuIGFycmF5IG9mIHgseSB2YWx1ZXM/CiAgICAgICAgICAgIC8vIGxpa2UgW1tbMSwxXSwgWzIsNF0sIFszLDNdXSwgW1sxLDNdLCBbMiw2XSwgWzMsNV1dXQogICAgICAgICAgICBpZiAoJC5pc0FycmF5KGJkWzBdWzBdKSkgewogICAgICAgICAgICAgICAgLy8gc2luY2UgYW4gYXJiaXRyYXJ5IGFycmF5IG9mIHBvaW50cywgc3BpbiB0aHJvdWdoIGFsbCBvZiB0aGVtIHRvIGRldGVybWluZSBtYXggYW5kIG1pbiBsaW5lcy4KCiAgICAgICAgICAgICAgICB2YXIgcDsKICAgICAgICAgICAgICAgIHZhciBiZG1pbmlkeCA9IDAsIGJkbWF4aWR4ID0gMDsKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gYmRbMF0ubGVuZ3RoOyBpPGw7IGkrKykgewogICAgICAgICAgICAgICAgICAgIHAgPSBiZFswXVtpXTsKICAgICAgICAgICAgICAgICAgICBpZiAoKHBbMV0gIT0gbnVsbCAmJiBwWzFdID4gYmFuZHMuX21heCkgfHwgYmFuZHMuX21heCA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJhbmRzLl9tYXggPSBwWzFdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoKHBbMV0gIT0gbnVsbCAmJiBwWzFdIDwgYmFuZHMuX21pbikgfHwgYmFuZHMuX21pbiA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJhbmRzLl9taW4gPSBwWzFdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gYmRbMV0ubGVuZ3RoOyBpPGw7IGkrKykgewogICAgICAgICAgICAgICAgICAgIHAgPSBiZFsxXVtpXTsKICAgICAgICAgICAgICAgICAgICBpZiAoKHBbMV0gIT0gbnVsbCAmJiBwWzFdID4gYmFuZHMuX21heCkgfHwgYmFuZHMuX21heCA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJhbmRzLl9tYXggPSBwWzFdOwogICAgICAgICAgICAgICAgICAgICAgICBiZG1heGlkeCA9IDE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICgocFsxXSAhPSBudWxsICYmIHBbMV0gPCBiYW5kcy5fbWluKSB8fCBiYW5kcy5fbWluID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYmFuZHMuX21pbiA9IHBbMV07CiAgICAgICAgICAgICAgICAgICAgICAgIGJkbWluaWR4ID0gMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKGJkbWF4aWR4ID09PSBiZG1pbmlkeCkgewogICAgICAgICAgICAgICAgICAgIGJhbmRzLnNob3cgPSBmYWxzZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBiYW5kcy5oaURhdGEgPSBiZFtiZG1heGlkeF07CiAgICAgICAgICAgICAgICBiYW5kcy5sb3dEYXRhID0gYmRbYmRtaW5pZHhdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIGVsc2UgZGF0YSBpcyBhcnJheXMgb2YgeSB2YWx1ZXMKICAgICAgICAgICAgLy8gbGlrZSBbWzEsNCwzXSwgWzMsNiw1XV0KICAgICAgICAgICAgLy8gbXVzdCBoYXZlIHNhbWUgbnVtYmVyIG9mIGJhbmQgZGF0YSBwb2ludHMgYXMgcG9pbnRzIGluIHNlcmllcwogICAgICAgICAgICBlbHNlIGlmIChiZFswXS5sZW5ndGggPT09IGRhdGEubGVuZ3RoICYmIGJkWzFdLmxlbmd0aCA9PT0gZGF0YS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgIHZhciBoaSA9IChiZFswXVswXSA+IGJkWzFdWzBdKSA/IDAgOiAxOwogICAgICAgICAgICAgICAgdmFyIGxvdyA9IChoaSkgPyAwIDogMTsKICAgICAgICAgICAgICAgIGZvciAodmFyIGk9MCwgbD1kYXRhLmxlbmd0aDsgaSA8IGw7IGkrKykgewogICAgICAgICAgICAgICAgICAgIGJhbmRzLmhpRGF0YS5wdXNoKFtkYXRhW2ldWzBdLCBiZFtoaV1baV1dKTsKICAgICAgICAgICAgICAgICAgICBiYW5kcy5sb3dEYXRhLnB1c2goW2RhdGFbaV1bMF0sIGJkW2xvd11baV1dKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gd2UgZG9uJ3QgaGF2ZSBwcm9wZXIgZGF0YSBhcnJheSwgZG9uJ3Qgc2hvdyBiYW5kcy4KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBiYW5kcy5zaG93ID0gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIGlmIG1vcmUgdGhhbiAyIGFycmF5cywgaGF2ZSBhcnJheXMgb2YgW3lsb3csIHloaV0gdmFsdWVzLgogICAgICAgIC8vIG5vdGUsIGNhbid0IGRpc3Rpbmd1aXNoIGNhc2Ugb2YgW1t5bG93LCB5aGldLCBbeWxvdywgeWhpXV0gZnJvbSBbW3lsb3csIHlsb3ddLCBbeWhpLCB5aGldXQogICAgICAgIC8vIHRoaXMgaXMgYXNzdW1lZCB0byBiZSBvZiB0aGUgbGF0dGVyIGZvcm0uCiAgICAgICAgZWxzZSBpZiAoYmQubGVuZ3RoID4gMiAmJiAhJC5pc0FycmF5KGJkWzBdWzBdKSkgewogICAgICAgICAgICB2YXIgaGkgPSAoYmRbMF1bMF0gPiBiZFswXVsxXSkgPyAwIDogMTsKICAgICAgICAgICAgdmFyIGxvdyA9IChoaSkgPyAwIDogMTsKICAgICAgICAgICAgZm9yICh2YXIgaT0wLCBsPWJkLmxlbmd0aDsgaTxsOyBpKyspIHsKICAgICAgICAgICAgICAgIGJhbmRzLmhpRGF0YS5wdXNoKFtkYXRhW2ldWzBdLCBiZFtpXVtoaV1dKTsKICAgICAgICAgICAgICAgIGJhbmRzLmxvd0RhdGEucHVzaChbZGF0YVtpXVswXSwgYmRbaV1bbG93XV0pOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBkb24ndCBoYXZlIHByb3BlciBkYXRhLCBhdXRvIGNhbGN1bGF0ZQogICAgICAgIGVsc2UgewogICAgICAgICAgICB2YXIgaW50cnYgPSBiYW5kcy5pbnRlcnZhbDsKICAgICAgICAgICAgdmFyIGEgPSBudWxsOwogICAgICAgICAgICB2YXIgYiA9IG51bGw7CiAgICAgICAgICAgIHZhciBhZnVuYyA9IG51bGw7CiAgICAgICAgICAgIHZhciBiZnVuYyA9IG51bGw7CgogICAgICAgICAgICBpZiAoJC5pc0FycmF5KGludHJ2KSkgewogICAgICAgICAgICAgICAgYSA9IGludHJ2WzBdOwogICAgICAgICAgICAgICAgYiA9IGludHJ2WzFdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgYSA9IGludHJ2OwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoaXNOYU4oYSkpIHsKICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgYSBzdHJpbmcKICAgICAgICAgICAgICAgIGlmIChhLmNoYXJBdChhLmxlbmd0aCAtIDEpID09PSAnJScpIHsKICAgICAgICAgICAgICAgICAgICBhZnVuYyA9ICdtdWx0aXBseSc7CiAgICAgICAgICAgICAgICAgICAgYSA9IHBhcnNlRmxvYXQoYSkvMTAwICsgMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBhID0gcGFyc2VGbG9hdChhKTsKICAgICAgICAgICAgICAgIGFmdW5jID0gJ2FkZCc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChiICE9PSBudWxsICYmIGlzTmFOKGIpKSB7CiAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIGEgc3RyaW5nCiAgICAgICAgICAgICAgICBpZiAoYi5jaGFyQXQoYi5sZW5ndGggLSAxKSA9PT0gJyUnKSB7CiAgICAgICAgICAgICAgICAgICAgYmZ1bmMgPSAnbXVsdGlwbHknOwogICAgICAgICAgICAgICAgICAgIGIgPSBwYXJzZUZsb2F0KGIpLzEwMCArIDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGVsc2UgaWYgKGIgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgIGIgPSBwYXJzZUZsb2F0KGIpOwogICAgICAgICAgICAgICAgYmZ1bmMgPSAnYWRkJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGEgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgIGlmIChiID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgYiA9IC1hOwogICAgICAgICAgICAgICAgICAgIGJmdW5jID0gYWZ1bmM7CiAgICAgICAgICAgICAgICAgICAgaWYgKGJmdW5jID09PSAnbXVsdGlwbHknKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGIgKz0gMjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gbWFrZSBzdXJlIGEgYWx3YXlzIGFwcGxpZXMgdG8gaGkgYmFuZC4KICAgICAgICAgICAgICAgIGlmIChhIDwgYikgewogICAgICAgICAgICAgICAgICAgIHZhciB0ZW1wID0gYTsKICAgICAgICAgICAgICAgICAgICBhID0gYjsKICAgICAgICAgICAgICAgICAgICBiID0gdGVtcDsKICAgICAgICAgICAgICAgICAgICB0ZW1wID0gYWZ1bmM7CiAgICAgICAgICAgICAgICAgICAgYWZ1bmMgPSBiZnVuYzsKICAgICAgICAgICAgICAgICAgICBiZnVuYyA9IHRlbXA7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgZm9yICh2YXIgaT0wLCBsID0gZGF0YS5sZW5ndGg7IGkgPCBsOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFmdW5jKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2FkZCc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYW5kcy5oaURhdGEucHVzaChbZGF0YVtpXVswXSwgZGF0YVtpXVsxXSArIGFdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdtdWx0aXBseSc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYW5kcy5oaURhdGEucHVzaChbZGF0YVtpXVswXSwgZGF0YVtpXVsxXSAqIGFdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGJmdW5jKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2FkZCc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYW5kcy5sb3dEYXRhLnB1c2goW2RhdGFbaV1bMF0sIGRhdGFbaV1bMV0gKyBiXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnbXVsdGlwbHknOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFuZHMubG93RGF0YS5wdXNoKFtkYXRhW2ldWzBdLCBkYXRhW2ldWzFdICogYl0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGJhbmRzLnNob3cgPSBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgdmFyIGhkID0gYmFuZHMuaGlEYXRhOwogICAgICAgIHZhciBsZCA9IGJhbmRzLmxvd0RhdGE7CiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBoZC5sZW5ndGg7IGk8bDsgaSsrKSB7CiAgICAgICAgICAgIGlmICgoaGRbaV1bMV0gIT0gbnVsbCAmJiBoZFtpXVsxXSA+IGJhbmRzLl9tYXgpIHx8IGJhbmRzLl9tYXggPT0gbnVsbCkgewogICAgICAgICAgICAgICAgYmFuZHMuX21heCA9IGhkW2ldWzFdOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gbGQubGVuZ3RoOyBpPGw7IGkrKykgewogICAgICAgICAgICBpZiAoKGxkW2ldWzFdICE9IG51bGwgJiYgbGRbaV1bMV0gPCBiYW5kcy5fbWluKSB8fCBiYW5kcy5fbWluID09IG51bGwpIHsKICAgICAgICAgICAgICAgIGJhbmRzLl9taW4gPSBsZFtpXVsxXTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gb25lIGxhc3QgY2hlY2sgZm9yIHByb3BlciBkYXRhCiAgICAgICAgLy8gdGhlc2UgZG9uJ3QgYXBwbHkgYW55IG1vcmUgc2luY2UgYWxsb3dpbmcgYXJiaXRyYXJ5IHgseSB2YWx1ZXMKICAgICAgICAvLyBpZiAoYmFuZHMuaGlEYXRhLmxlbmd0aCAhPSBiYW5kcy5sb3dEYXRhLmxlbmd0aCkgewogICAgICAgIC8vICAgICBiYW5kcy5zaG93ID0gZmFsc2U7CiAgICAgICAgLy8gfQoKICAgICAgICAvLyBpZiAoYmFuZHMuaGlEYXRhLmxlbmd0aCAhPSB0aGlzLmRhdGEubGVuZ3RoKSB7CiAgICAgICAgLy8gICAgIGJhbmRzLnNob3cgPSBmYWxzZTsKICAgICAgICAvLyB9CgogICAgICAgIGlmIChiYW5kcy5maWxsQ29sb3IgPT09IG51bGwpIHsKICAgICAgICAgICAgdmFyIGMgPSAkLmpxcGxvdC5nZXRDb2xvckNvbXBvbmVudHMoYmFuZHMuY29sb3IpOwogICAgICAgICAgICAvLyBub3cgYWRqdXN0IGFscGhhIHRvIGRpZmZlcmVudGlhdGUgZmlsbAogICAgICAgICAgICBjWzNdID0gY1szXSAqIDAuNTsKICAgICAgICAgICAgYmFuZHMuZmlsbENvbG9yID0gJ3JnYmEoJyArIGNbMF0gKycsICcrIGNbMV0gKycsICcrIGNbMl0gKycsICcrIGNbM10gKyAnKSc7CiAgICAgICAgfQogICAgfTsKCiAgICBmdW5jdGlvbiBnZXRTdGVwcyAoZCwgZikgewogICAgICAgIHJldHVybiAoMy40MTgyMDU0K2YpICogTWF0aC5wb3coZCwgLTAuMzUzNDk5Mik7CiAgICB9CgogICAgZnVuY3Rpb24gY29tcHV0ZVN0ZXBzIChkMSwgZDIpIHsKICAgICAgICB2YXIgcyA9IE1hdGguc3FydChNYXRoLnBvdygoZDJbMF0tIGQxWzBdKSwgMikgKyBNYXRoLnBvdyAoKGQyWzFdIC0gZDFbMV0pLCAyKSk7CiAgICAgICAgcmV0dXJuIDUuNzY0OCAqIE1hdGgubG9nKHMpICsgNy40NDU2OwogICAgfQoKICAgIGZ1bmN0aW9uIHRhbmggKHgpIHsKICAgICAgICB2YXIgYSA9IChNYXRoLmV4cCgyKngpIC0gMSkgLyAoTWF0aC5leHAoMip4KSArIDEpOwogICAgICAgIHJldHVybiBhOwogICAgfQoKICAgIC8vLy8vLy8vLy8KICAgIC8vIGNvbXB1dGVDb25zdHJhaW5lZFNtb290aGVkRGF0YQogICAgLy8gQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIGNvbnN0cmFpbmVkIGN1YmljIHNwbGluZSBpbnRlcnBvbGF0aW9uCiAgICAvLyBtZXRob2QgYXMgcHJlc2VudGVkIGluOgogICAgLy8KICAgIC8vIEtydWdlciwgQ0pDLCBDb25zdHJhaW5lZCBDdWJpYyBTcGluZSBJbnRlcnBvbGF0aW9uIGZvciBDaGVtaWNhbCBFbmdpbmVlcmluZyBBcHBsaWNhdGlvbnMKICAgIC8vIGh0dHA6Ly93d3cua29yZi5jby51ay9zcGxpbmUucGRmCiAgICAvLwogICAgLy8gVGhlIGltcGxlbWVudGF0aW9uIGJlbG93IGJvcnJvd3MgaGVhdmlseSBmcm9tIHRoZSBzYW1wbGUgVmlzdWFsIEJhc2ljCiAgICAvLyBpbXBsZW1lbnRhdGlvbiBieSBDSkMgS3J1Z2VyIGZvdW5kIGluIGh0dHA6Ly93d3cua29yZi5jby51ay9zcGxpbmUueGxzCiAgICAvLwogICAgLy8vLy8vLy8vCgogICAgLy8gY2FsbGVkIHdpdGggc2NvcGUgb2Ygc2VyaWVzCiAgICBmdW5jdGlvbiBjb21wdXRlQ29uc3RyYWluZWRTbW9vdGhlZERhdGEgKGdkKSB7CiAgICAgICAgdmFyIHNtb290aCA9IHRoaXMucmVuZGVyZXIuc21vb3RoOwogICAgICAgIHZhciBkaW0gPSB0aGlzLmNhbnZhcy5nZXRXaWR0aCgpOwogICAgICAgIHZhciB4cCA9IHRoaXMuX3hheGlzLnNlcmllc19wMnU7CiAgICAgICAgdmFyIHlwID0gdGhpcy5feWF4aXMuc2VyaWVzX3AydTsgCiAgICAgICAgdmFyIHN0ZXBzID1udWxsOwogICAgICAgIHZhciBfc3RlcHMgPSBudWxsOwogICAgICAgIHZhciBkaXN0ID0gZ2QubGVuZ3RoL2RpbTsKICAgICAgICB2YXIgX3Ntb290aGVkRGF0YSA9IFtdOwogICAgICAgIHZhciBfc21vb3RoZWRQbG90RGF0YSA9IFtdOwoKICAgICAgICBpZiAoIWlzTmFOKHBhcnNlRmxvYXQoc21vb3RoKSkpIHsKICAgICAgICAgICAgc3RlcHMgPSBwYXJzZUZsb2F0KHNtb290aCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBzdGVwcyA9IGdldFN0ZXBzKGRpc3QsIDAuNSk7CiAgICAgICAgfQoKICAgICAgICB2YXIgeXkgPSBbXTsKICAgICAgICB2YXIgeHggPSBbXTsKCiAgICAgICAgZm9yICh2YXIgaT0wLCBsID0gZ2QubGVuZ3RoOyBpPGw7IGkrKykgewogICAgICAgICAgICB5eS5wdXNoKGdkW2ldWzFdKTsKICAgICAgICAgICAgeHgucHVzaChnZFtpXVswXSk7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBkeHgoeDEsIHgwKSB7CiAgICAgICAgICAgIGlmICh4MSAtIHgwID09IDApIHsKICAgICAgICAgICAgICAgIHJldHVybiBNYXRoLnBvdygxMCwxMCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4geDEgLSB4MDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgdmFyIEEsIEIsIEMsIEQ7CiAgICAgICAgLy8gbG9vcCB0aHJvdWdoIGVhY2ggbGluZSBzZWdtZW50LiAgSGF2ZSAjIHBvaW50cyAtIDEgbGluZSBzZWdtZW50cy4gIE5tYmVyIHNlZ21lbnRzIHN0YXJ0aW5nIGF0IDEuCiAgICAgICAgdmFyIG5tYXggPSBnZC5sZW5ndGggLSAxOwogICAgICAgIGZvciAodmFyIG51bSA9IDEsIGdkbCA9IGdkLmxlbmd0aDsgbnVtPGdkbDsgbnVtKyspIHsKICAgICAgICAgICAgdmFyIGd4eCA9IFtdOwogICAgICAgICAgICB2YXIgZ2d4eCA9IFtdOwogICAgICAgICAgICAvLyBwb2ludCBhdCBlYWNoIGVuZCBvZiBzZWdtZW50LgogICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IDI7IGorKykgewogICAgICAgICAgICAgICAgdmFyIGkgPSBudW0gLSAxICsgajsgLy8gcG9pbnQgbnVtYmVyLCAwIHRvICMgcG9pbnRzLgoKICAgICAgICAgICAgICAgIGlmIChpID09IDAgfHwgaSA9PSBubWF4KSB7CiAgICAgICAgICAgICAgICAgICAgZ3h4W2pdID0gTWF0aC5wb3coMTAsIDEwKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKHl5W2krMV0gLSB5eVtpXSA9PSAwIHx8IHl5W2ldIC0geXlbaS0xXSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgZ3h4W2pdID0gMDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKCgoeHhbaSsxXSAtIHh4W2ldKSAvICh5eVtpKzFdIC0geXlbaV0pICsgKHh4W2ldIC0geHhbaS0xXSkgLyAoeXlbaV0gLSB5eVtpLTFdKSkgPT0gMCApIHsKICAgICAgICAgICAgICAgICAgICBneHhbal0gPSAwOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoICh5eVtpKzFdIC0geXlbaV0pICogKHl5W2ldIC0geXlbaS0xXSkgPCAwICkgewogICAgICAgICAgICAgICAgICAgIGd4eFtqXSA9IDA7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgZ3h4W2pdID0gMiAvIChkeHgoeHhbaSArIDFdLCB4eFtpXSkgLyAoeXlbaSArIDFdIC0geXlbaV0pICsgZHh4KHh4W2ldLCB4eFtpIC0gMV0pIC8gKHl5W2ldIC0geXlbaSAtIDFdKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIFJlc2V0IGZpcnN0IGRlcml2YXRpdmUgKHNsb3BlKSBhdCBmaXJzdCBhbmQgbGFzdCBwb2ludAogICAgICAgICAgICBpZiAobnVtID09IDEpIHsKICAgICAgICAgICAgICAgIC8vIEZpcnN0IHBvaW50IGhhcyAwIDJuZCBkZXJpdmF0aXZlCiAgICAgICAgICAgICAgICBneHhbMF0gPSAzIC8gMiAqICh5eVsxXSAtIHl5WzBdKSAvIGR4eCh4eFsxXSwgeHhbMF0pIC0gZ3h4WzFdIC8gMjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChudW0gPT0gbm1heCkgewogICAgICAgICAgICAgICAgLy8gTGFzdCBwb2ludCBoYXMgMCAybmQgZGVyaXZhdGl2ZQogICAgICAgICAgICAgICAgZ3h4WzFdID0gMyAvIDIgKiAoeXlbbm1heF0gLSB5eVtubWF4IC0gMV0pIC8gZHh4KHh4W25tYXhdLCB4eFtubWF4IC0gMV0pIC0gZ3h4WzBdIC8gMjsKICAgICAgICAgICAgfSAgIAoKICAgICAgICAgICAgLy8gQ2FsYyBzZWNvbmQgZGVyaXZhdGl2ZSBhdCBwb2ludHMKICAgICAgICAgICAgZ2d4eFswXSA9IC0yICogKGd4eFsxXSArIDIgKiBneHhbMF0pIC8gZHh4KHh4W251bV0sIHh4W251bSAtIDFdKSArIDYgKiAoeXlbbnVtXSAtIHl5W251bSAtIDFdKSAvIE1hdGgucG93KGR4eCh4eFtudW1dLCB4eFtudW0gLSAxXSksIDIpOwogICAgICAgICAgICBnZ3h4WzFdID0gMiAqICgyICogZ3h4WzFdICsgZ3h4WzBdKSAvIGR4eCh4eFtudW1dLCB4eFtudW0gLSAxXSkgLSA2ICogKHl5W251bV0gLSB5eVtudW0gLSAxXSkgLyBNYXRoLnBvdyhkeHgoeHhbbnVtXSwgeHhbbnVtIC0gMV0pLCAyKTsKCiAgICAgICAgICAgIC8vIENhbGMgY29uc3RhbnRzIGZvciBjdWJpYyBpbnRlcnBvbGF0aW9uCiAgICAgICAgICAgIEQgPSAxIC8gNiAqIChnZ3h4WzFdIC0gZ2d4eFswXSkgLyBkeHgoeHhbbnVtXSwgeHhbbnVtIC0gMV0pOwogICAgICAgICAgICBDID0gMSAvIDIgKiAoeHhbbnVtXSAqIGdneHhbMF0gLSB4eFtudW0gLSAxXSAqIGdneHhbMV0pIC8gZHh4KHh4W251bV0sIHh4W251bSAtIDFdKTsKICAgICAgICAgICAgQiA9ICh5eVtudW1dIC0geXlbbnVtIC0gMV0gLSBDICogKE1hdGgucG93KHh4W251bV0sIDIpIC0gTWF0aC5wb3coeHhbbnVtIC0gMV0sIDIpKSAtIEQgKiAoTWF0aC5wb3coeHhbbnVtXSwgMykgLSBNYXRoLnBvdyh4eFtudW0gLSAxXSwgMykpKSAvIGR4eCh4eFtudW1dLCB4eFtudW0gLSAxXSk7CiAgICAgICAgICAgIEEgPSB5eVtudW0gLSAxXSAtIEIgKiB4eFtudW0gLSAxXSAtIEMgKiBNYXRoLnBvdyh4eFtudW0gLSAxXSwgMikgLSBEICogTWF0aC5wb3coeHhbbnVtIC0gMV0sIDMpOwoKICAgICAgICAgICAgdmFyIGluY3JlbWVudCA9ICh4eFtudW1dIC0geHhbbnVtIC0gMV0pIC8gc3RlcHM7CiAgICAgICAgICAgIHZhciB0ZW1wLCB0ZW1weDsKCiAgICAgICAgICAgIGZvciAodmFyIGogPSAwLCBsID0gc3RlcHM7IGogPCBsOyBqKyspIHsKICAgICAgICAgICAgICAgIHRlbXAgPSBbXTsKICAgICAgICAgICAgICAgIHRlbXB4ID0geHhbbnVtIC0gMV0gKyBqICogaW5jcmVtZW50OwogICAgICAgICAgICAgICAgdGVtcC5wdXNoKHRlbXB4KTsKICAgICAgICAgICAgICAgIHRlbXAucHVzaChBICsgQiAqIHRlbXB4ICsgQyAqIE1hdGgucG93KHRlbXB4LCAyKSArIEQgKiBNYXRoLnBvdyh0ZW1weCwgMykpOwogICAgICAgICAgICAgICAgX3Ntb290aGVkRGF0YS5wdXNoKHRlbXApOwogICAgICAgICAgICAgICAgX3Ntb290aGVkUGxvdERhdGEucHVzaChbeHAodGVtcFswXSksIHlwKHRlbXBbMV0pXSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIF9zbW9vdGhlZERhdGEucHVzaChnZFtpXSk7CiAgICAgICAgX3Ntb290aGVkUGxvdERhdGEucHVzaChbeHAoZ2RbaV1bMF0pLCB5cChnZFtpXVsxXSldKTsKCiAgICAgICAgcmV0dXJuIFtfc21vb3RoZWREYXRhLCBfc21vb3RoZWRQbG90RGF0YV07CiAgICB9CgogICAgLy8vLy8vLwogICAgLy8gY29tcHV0ZUhlcm1pdGVTbW9vdGhlZERhdGEKICAgIC8vIEEgaGVybWl0ZSBzcGxpbmUgc21vb3RoaW5nIG9mIHRoZSBwbG90IGRhdGEuCiAgICAvLyBUaGlzIGltcGxlbWVudGF0aW9uIGlzIGRlcml2ZWQgZnJvbSB0aGUgb25lIHBvc3RlZAogICAgLy8gYnkga3J5cGluIG9uIHRoZSBqcXBsb3QtdXNlcnMgbWFpbGluZyBsaXN0OgogICAgLy8KICAgIC8vIGh0dHA6Ly9ncm91cHMuZ29vZ2xlLmNvbS9ncm91cC9qcXBsb3QtdXNlcnMvYnJvd3NlX3RocmVhZC90aHJlYWQvNzQ4YmU2YTQ0NTcyM2NlYT9wbGk9MQogICAgLy8KICAgIC8vIHdpdGggYSBibG9nIHBvc3Q6CiAgICAvLwogICAgLy8gaHR0cDovL2Jsb2cuc3RhdHNjb2xsZWN0b3IuY29tL2EtcGx1Z2luLXJlbmRlcmVyLWZvci1qcXBsb3QtdG8tZHJhdy1hLWhlcm1pdGUtc3BsaW5lLwogICAgLy8KICAgIC8vIGFuZCBkb3dubG9hZCBvZiB0aGUgb3JpZ2luYWwgcGx1Z2luOgogICAgLy8KICAgIC8vIGh0dHA6Ly9ibG9nLnN0YXRzY29sbGVjdG9yLmNvbS93cC1jb250ZW50L3VwbG9hZHMvMjAxMC8wMi9qcXBsb3QuaGVybWl0ZVNwbGluZVJlbmRlcmVyLmpzCiAgICAvLy8vLy8vLy8vCgogICAgLy8gY2FsbGVkIHdpdGggc2NvcGUgb2Ygc2VyaWVzCiAgICBmdW5jdGlvbiBjb21wdXRlSGVybWl0ZVNtb290aGVkRGF0YSAoZ2QpIHsKICAgICAgICB2YXIgc21vb3RoID0gdGhpcy5yZW5kZXJlci5zbW9vdGg7CiAgICAgICAgdmFyIHRlbnNpb24gPSB0aGlzLnJlbmRlcmVyLnRlbnNpb247CiAgICAgICAgdmFyIGRpbSA9IHRoaXMuY2FudmFzLmdldFdpZHRoKCk7CiAgICAgICAgdmFyIHhwID0gdGhpcy5feGF4aXMuc2VyaWVzX3AydTsKICAgICAgICB2YXIgeXAgPSB0aGlzLl95YXhpcy5zZXJpZXNfcDJ1OyAKICAgICAgICB2YXIgc3RlcHMgPW51bGw7CiAgICAgICAgdmFyIF9zdGVwcyA9IG51bGw7CiAgICAgICAgdmFyIGEgPSBudWxsOwogICAgICAgIHZhciBhMSA9IG51bGw7CiAgICAgICAgdmFyIGEyID0gbnVsbDsKICAgICAgICB2YXIgc2xvcGUgPSBudWxsOwogICAgICAgIHZhciBzbG9wZTIgPSBudWxsOwogICAgICAgIHZhciB0ZW1wID0gbnVsbDsKICAgICAgICB2YXIgdCwgcywgaDEsIGgyLCBoMywgaDQ7CiAgICAgICAgdmFyIFRpWCwgVGlZLCBUaTFYLCBUaTFZOwogICAgICAgIHZhciBwWCwgcFksIHA7CiAgICAgICAgdmFyIHNkID0gW107CiAgICAgICAgdmFyIHNwZCA9IFtdOwogICAgICAgIHZhciBkaXN0ID0gZ2QubGVuZ3RoL2RpbTsKICAgICAgICB2YXIgbWluLCBtYXgsIHN0cmV0Y2gsIHNjYWxlLCBzaGlmdDsKICAgICAgICB2YXIgX3Ntb290aGVkRGF0YSA9IFtdOwogICAgICAgIHZhciBfc21vb3RoZWRQbG90RGF0YSA9IFtdOwogICAgICAgIGlmICghaXNOYU4ocGFyc2VGbG9hdChzbW9vdGgpKSkgewogICAgICAgICAgICBzdGVwcyA9IHBhcnNlRmxvYXQoc21vb3RoKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHN0ZXBzID0gZ2V0U3RlcHMoZGlzdCwgMC41KTsKICAgICAgICB9CiAgICAgICAgaWYgKCFpc05hTihwYXJzZUZsb2F0KHRlbnNpb24pKSkgewogICAgICAgICAgICB0ZW5zaW9uID0gcGFyc2VGbG9hdCh0ZW5zaW9uKTsKICAgICAgICB9CgogICAgICAgIGZvciAodmFyIGk9MCwgbCA9IGdkLmxlbmd0aC0xOyBpIDwgbDsgaSsrKSB7CgogICAgICAgICAgICBpZiAodGVuc2lvbiA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgc2xvcGUgPSBNYXRoLmFicygoZ2RbaSsxXVsxXSAtIGdkW2ldWzFdKSAvIChnZFtpKzFdWzBdIC0gZ2RbaV1bMF0pKTsKCiAgICAgICAgICAgICAgICBtaW4gPSAwLjM7CiAgICAgICAgICAgICAgICBtYXggPSAwLjY7CiAgICAgICAgICAgICAgICBzdHJldGNoID0gKG1heCAtIG1pbikvMi4wOwogICAgICAgICAgICAgICAgc2NhbGUgPSAyLjU7CiAgICAgICAgICAgICAgICBzaGlmdCA9IC0xLjQ7CgogICAgICAgICAgICAgICAgdGVtcCA9IHNsb3BlL3NjYWxlICsgc2hpZnQ7CgogICAgICAgICAgICAgICAgYTEgPSBzdHJldGNoICogdGFuaCh0ZW1wKSAtIHN0cmV0Y2ggKiB0YW5oKHNoaWZ0KSArIG1pbjsKCiAgICAgICAgICAgICAgICAvLyBpZiBoYXZlIGJvdGggbGVmdCBhbmQgcmlnaHQgbGluZSBzZWdtZW50cywgd2lsbCB1c2UgIG1pbmltdW0gdGVuc2lvbi4gCiAgICAgICAgICAgICAgICBpZiAoaSA+IDApIHsKICAgICAgICAgICAgICAgICAgICBzbG9wZTIgPSBNYXRoLmFicygoZ2RbaV1bMV0gLSBnZFtpLTFdWzFdKSAvIChnZFtpXVswXSAtIGdkW2ktMV1bMF0pKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRlbXAgPSBzbG9wZTIvc2NhbGUgKyBzaGlmdDsKCiAgICAgICAgICAgICAgICBhMiA9IHN0cmV0Y2ggKiB0YW5oKHRlbXApIC0gc3RyZXRjaCAqIHRhbmgoc2hpZnQpICsgbWluOwoKICAgICAgICAgICAgICAgIGEgPSAoYTEgKyBhMikvMi4wOwoKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGEgPSB0ZW5zaW9uOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvciAodD0wOyB0IDwgc3RlcHM7IHQrKykgewogICAgICAgICAgICAgICAgcyA9IHQgLyBzdGVwczsKICAgICAgICAgICAgICAgIGgxID0gKDEgKyAyKnMpKk1hdGgucG93KCgxLXMpLDIpOwogICAgICAgICAgICAgICAgaDIgPSBzKk1hdGgucG93KCgxLXMpLDIpOwogICAgICAgICAgICAgICAgaDMgPSBNYXRoLnBvdyhzLDIpKigzLTIqcyk7CiAgICAgICAgICAgICAgICBoNCA9IE1hdGgucG93KHMsMikqKHMtMSk7ICAgICAKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgaWYgKGdkW2ktMV0pIHsgIAogICAgICAgICAgICAgICAgICAgIFRpWCA9IGEgKiAoZ2RbaSsxXVswXSAtIGdkW2ktMV1bMF0pOyAKICAgICAgICAgICAgICAgICAgICBUaVkgPSBhICogKGdkW2krMV1bMV0gLSBnZFtpLTFdWzFdKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgVGlYID0gYSAqIChnZFtpKzFdWzBdIC0gZ2RbaV1bMF0pOyAKICAgICAgICAgICAgICAgICAgICBUaVkgPSBhICogKGdkW2krMV1bMV0gLSBnZFtpXVsxXSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGdkW2krMl0pIHsgIAogICAgICAgICAgICAgICAgICAgIFRpMVggPSBhICogKGdkW2krMl1bMF0gLSBnZFtpXVswXSk7IAogICAgICAgICAgICAgICAgICAgIFRpMVkgPSBhICogKGdkW2krMl1bMV0gLSBnZFtpXVsxXSk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIFRpMVggPSBhICogKGdkW2krMV1bMF0gLSBnZFtpXVswXSk7IAogICAgICAgICAgICAgICAgICAgIFRpMVkgPSBhICogKGdkW2krMV1bMV0gLSBnZFtpXVsxXSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIHBYID0gaDEqZ2RbaV1bMF0gKyBoMypnZFtpKzFdWzBdICsgaDIqVGlYICsgaDQqVGkxWDsKICAgICAgICAgICAgICAgIHBZID0gaDEqZ2RbaV1bMV0gKyBoMypnZFtpKzFdWzFdICsgaDIqVGlZICsgaDQqVGkxWTsKICAgICAgICAgICAgICAgIHAgPSBbcFgsIHBZXTsKCiAgICAgICAgICAgICAgICBfc21vb3RoZWREYXRhLnB1c2gocCk7CiAgICAgICAgICAgICAgICBfc21vb3RoZWRQbG90RGF0YS5wdXNoKFt4cChwWCksIHlwKHBZKV0pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIF9zbW9vdGhlZERhdGEucHVzaChnZFtsXSk7CiAgICAgICAgX3Ntb290aGVkUGxvdERhdGEucHVzaChbeHAoZ2RbbF1bMF0pLCB5cChnZFtsXVsxXSldKTsKCiAgICAgICAgcmV0dXJuIFtfc21vb3RoZWREYXRhLCBfc21vb3RoZWRQbG90RGF0YV07CiAgICB9CiAgICAKICAgIC8vIHNldEdyaWREYXRhCiAgICAvLyBjb252ZXJ0cyB0aGUgdXNlciBkYXRhIHZhbHVlcyB0byBncmlkIGNvb3JkaW5hdGVzIGFuZCBzdG9yZXMgdGhlbQogICAgLy8gaW4gdGhlIGdyaWREYXRhIGFycmF5LgogICAgLy8gQ2FsbGVkIHdpdGggc2NvcGUgb2YgYSBzZXJpZXMuCiAgICAkLmpxcGxvdC5MaW5lUmVuZGVyZXIucHJvdG90eXBlLnNldEdyaWREYXRhID0gZnVuY3Rpb24ocGxvdCkgewogICAgICAgIC8vIHJlY2FsY3VsYXRlIHRoZSBncmlkIGRhdGEKICAgICAgICB2YXIgeHAgPSB0aGlzLl94YXhpcy5zZXJpZXNfdTJwOwogICAgICAgIHZhciB5cCA9IHRoaXMuX3lheGlzLnNlcmllc191MnA7CiAgICAgICAgdmFyIGRhdGEgPSB0aGlzLl9wbG90RGF0YTsKICAgICAgICB2YXIgcGRhdGEgPSB0aGlzLl9wcmV2UGxvdERhdGE7CiAgICAgICAgdGhpcy5ncmlkRGF0YSA9IFtdOwogICAgICAgIHRoaXMuX3ByZXZHcmlkRGF0YSA9IFtdOwogICAgICAgIHRoaXMucmVuZGVyZXIuX3Ntb290aGVkRGF0YSA9IFtdOwogICAgICAgIHRoaXMucmVuZGVyZXIuX3Ntb290aGVkUGxvdERhdGEgPSBbXTsKICAgICAgICB0aGlzLnJlbmRlcmVyLl9oaUJhbmRHcmlkRGF0YSA9IFtdOwogICAgICAgIHRoaXMucmVuZGVyZXIuX2xvd0JhbmRHcmlkRGF0YSA9IFtdOwogICAgICAgIHRoaXMucmVuZGVyZXIuX2hpQmFuZFNtb290aGVkRGF0YSA9IFtdOwogICAgICAgIHRoaXMucmVuZGVyZXIuX2xvd0JhbmRTbW9vdGhlZERhdGEgPSBbXTsKICAgICAgICB2YXIgYmFuZHMgPSB0aGlzLnJlbmRlcmVyLmJhbmRzOwogICAgICAgIHZhciBoYXNOdWxsID0gZmFsc2U7CiAgICAgICAgZm9yICh2YXIgaT0wLCBsPXRoaXMuZGF0YS5sZW5ndGg7IGkgPCBsOyBpKyspIHsKICAgICAgICAgICAgLy8gaWYgbm90IGEgbGluZSBzZXJpZXMgb3IgaWYgbm8gbnVsbHMgaW4gZGF0YSwgcHVzaCB0aGUgY29udmVydGVkIHBvaW50IG9udG8gdGhlIGFycmF5LgogICAgICAgICAgICBpZiAoZGF0YVtpXVswXSAhPSBudWxsICYmIGRhdGFbaV1bMV0gIT0gbnVsbCkgewogICAgICAgICAgICAgICAgdGhpcy5ncmlkRGF0YS5wdXNoKFt4cC5jYWxsKHRoaXMuX3hheGlzLCBkYXRhW2ldWzBdKSwgeXAuY2FsbCh0aGlzLl95YXhpcywgZGF0YVtpXVsxXSldKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBlbHNlIGlmIHRoZXJlIGlzIGEgbnVsbCwgcHJlc2VydmUgaXQuCiAgICAgICAgICAgIGVsc2UgaWYgKGRhdGFbaV1bMF0gPT0gbnVsbCkgewogICAgICAgICAgICAgICAgaGFzTnVsbCA9IHRydWU7CiAgICAgICAgICAgICAgICB0aGlzLmdyaWREYXRhLnB1c2goW251bGwsIHlwLmNhbGwodGhpcy5feWF4aXMsIGRhdGFbaV1bMV0pXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoZGF0YVtpXVsxXSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICBoYXNOdWxsID0gdHJ1ZTsKICAgICAgICAgICAgICAgIHRoaXMuZ3JpZERhdGEucHVzaChbeHAuY2FsbCh0aGlzLl94YXhpcywgZGF0YVtpXVswXSksIG51bGxdKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBpZiBub3QgYSBsaW5lIHNlcmllcyBvciBpZiBubyBudWxscyBpbiBkYXRhLCBwdXNoIHRoZSBjb252ZXJ0ZWQgcG9pbnQgb250byB0aGUgYXJyYXkuCiAgICAgICAgICAgIGlmIChwZGF0YVtpXSAhPSBudWxsICYmIHBkYXRhW2ldWzBdICE9IG51bGwgJiYgcGRhdGFbaV1bMV0gIT0gbnVsbCkgewogICAgICAgICAgICAgICAgdGhpcy5fcHJldkdyaWREYXRhLnB1c2goW3hwLmNhbGwodGhpcy5feGF4aXMsIHBkYXRhW2ldWzBdKSwgeXAuY2FsbCh0aGlzLl95YXhpcywgcGRhdGFbaV1bMV0pXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gZWxzZSBpZiB0aGVyZSBpcyBhIG51bGwsIHByZXNlcnZlIGl0LgogICAgICAgICAgICBlbHNlIGlmIChwZGF0YVtpXSAhPSBudWxsICYmIHBkYXRhW2ldWzBdID09IG51bGwpIHsKICAgICAgICAgICAgICAgIHRoaXMuX3ByZXZHcmlkRGF0YS5wdXNoKFtudWxsLCB5cC5jYWxsKHRoaXMuX3lheGlzLCBwZGF0YVtpXVsxXSldKTsKICAgICAgICAgICAgfSAgCiAgICAgICAgICAgIGVsc2UgaWYgKHBkYXRhW2ldICE9IG51bGwgJiYgcGRhdGFbaV1bMF0gIT0gbnVsbCAmJiBwZGF0YVtpXVsxXSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9wcmV2R3JpZERhdGEucHVzaChbeHAuY2FsbCh0aGlzLl94YXhpcywgcGRhdGFbaV1bMF0pLCBudWxsXSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIGRvbid0IGRvIHNtb290aGluZyBvciBiYW5kcyBvbiBicm9rZW4gbGluZXMuCiAgICAgICAgaWYgKGhhc051bGwpIHsKICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zbW9vdGggPSBmYWxzZTsKICAgICAgICAgICAgaWYgKHRoaXMuX3R5cGUgPT09ICdsaW5lJykgewogICAgICAgICAgICAgICAgYmFuZHMuc2hvdyA9IGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAodGhpcy5fdHlwZSA9PT0gJ2xpbmUnICYmIGJhbmRzLnNob3cpIHsKICAgICAgICAgICAgZm9yICh2YXIgaT0wLCBsPWJhbmRzLmhpRGF0YS5sZW5ndGg7IGk8bDsgaSsrKSB7CiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLl9oaUJhbmRHcmlkRGF0YS5wdXNoKFt4cC5jYWxsKHRoaXMuX3hheGlzLCBiYW5kcy5oaURhdGFbaV1bMF0pLCB5cC5jYWxsKHRoaXMuX3lheGlzLCBiYW5kcy5oaURhdGFbaV1bMV0pXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yICh2YXIgaT0wLCBsPWJhbmRzLmxvd0RhdGEubGVuZ3RoOyBpPGw7IGkrKykgewogICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5fbG93QmFuZEdyaWREYXRhLnB1c2goW3hwLmNhbGwodGhpcy5feGF4aXMsIGJhbmRzLmxvd0RhdGFbaV1bMF0pLCB5cC5jYWxsKHRoaXMuX3lheGlzLCBiYW5kcy5sb3dEYXRhW2ldWzFdKV0pOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBjYWxjdWxhdGUgc21vb3RoZWQgZGF0YSBpZiBlbm91Z2ggcG9pbnRzIGFuZCBubyBudWxscwogICAgICAgIGlmICh0aGlzLl90eXBlID09PSAnbGluZScgJiYgdGhpcy5yZW5kZXJlci5zbW9vdGggJiYgdGhpcy5ncmlkRGF0YS5sZW5ndGggPiAyKSB7CiAgICAgICAgICAgIHZhciByZXQ7CiAgICAgICAgICAgIGlmICh0aGlzLnJlbmRlcmVyLmNvbnN0cmFpblNtb290aGluZykgewogICAgICAgICAgICAgICAgcmV0ID0gY29tcHV0ZUNvbnN0cmFpbmVkU21vb3RoZWREYXRhLmNhbGwodGhpcywgdGhpcy5ncmlkRGF0YSk7CiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLl9zbW9vdGhlZERhdGEgPSByZXRbMF07CiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLl9zbW9vdGhlZFBsb3REYXRhID0gcmV0WzFdOwoKICAgICAgICAgICAgICAgIGlmIChiYW5kcy5zaG93KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0ID0gY29tcHV0ZUNvbnN0cmFpbmVkU21vb3RoZWREYXRhLmNhbGwodGhpcywgdGhpcy5yZW5kZXJlci5faGlCYW5kR3JpZERhdGEpOwogICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuX2hpQmFuZFNtb290aGVkRGF0YSA9IHJldFswXTsKICAgICAgICAgICAgICAgICAgICByZXQgPSBjb21wdXRlQ29uc3RyYWluZWRTbW9vdGhlZERhdGEuY2FsbCh0aGlzLCB0aGlzLnJlbmRlcmVyLl9sb3dCYW5kR3JpZERhdGEpOwogICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuX2xvd0JhbmRTbW9vdGhlZERhdGEgPSByZXRbMF07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmV0ID0gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHJldCA9IGNvbXB1dGVIZXJtaXRlU21vb3RoZWREYXRhLmNhbGwodGhpcywgdGhpcy5ncmlkRGF0YSk7CiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLl9zbW9vdGhlZERhdGEgPSByZXRbMF07CiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLl9zbW9vdGhlZFBsb3REYXRhID0gcmV0WzFdOwoKICAgICAgICAgICAgICAgIGlmIChiYW5kcy5zaG93KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0ID0gY29tcHV0ZUhlcm1pdGVTbW9vdGhlZERhdGEuY2FsbCh0aGlzLCB0aGlzLnJlbmRlcmVyLl9oaUJhbmRHcmlkRGF0YSk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5faGlCYW5kU21vb3RoZWREYXRhID0gcmV0WzBdOwogICAgICAgICAgICAgICAgICAgIHJldCA9IGNvbXB1dGVIZXJtaXRlU21vb3RoZWREYXRhLmNhbGwodGhpcywgdGhpcy5yZW5kZXJlci5fbG93QmFuZEdyaWREYXRhKTsKICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLl9sb3dCYW5kU21vb3RoZWREYXRhID0gcmV0WzBdOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldCA9IG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9OwogICAgCiAgICAvLyBtYWtlR3JpZERhdGEKICAgIC8vIGNvbnZlcnRzIGFueSBhcmJpdHJhcnkgZGF0YSB2YWx1ZXMgdG8gZ3JpZCBjb29yZGluYXRlcyBhbmQKICAgIC8vIHJldHVybnMgdGhlbS4gIFRoaXMgbWV0aG9kIGV4aXN0cyBzbyB0aGF0IHBsdWdpbnMgY2FuIHVzZSBhIHNlcmllcycKICAgIC8vIGxpbmVyZW5kZXJlciB0byBnZW5lcmF0ZSBncmlkIGRhdGEgcG9pbnRzIHdpdGhvdXQgb3ZlcndyaXRpbmcgdGhlCiAgICAvLyBncmlkIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoYXQgc2VyaWVzLgogICAgLy8gQ2FsbGVkIHdpdGggc2NvcGUgb2YgYSBzZXJpZXMuCiAgICAkLmpxcGxvdC5MaW5lUmVuZGVyZXIucHJvdG90eXBlLm1ha2VHcmlkRGF0YSA9IGZ1bmN0aW9uKGRhdGEsIHBsb3QpIHsKICAgICAgICAvLyByZWNhbGN1bGF0ZSB0aGUgZ3JpZCBkYXRhCiAgICAgICAgdmFyIHhwID0gdGhpcy5feGF4aXMuc2VyaWVzX3UycDsKICAgICAgICB2YXIgeXAgPSB0aGlzLl95YXhpcy5zZXJpZXNfdTJwOwogICAgICAgIHZhciBnZCA9IFtdOwogICAgICAgIHZhciBwZ2QgPSBbXTsKICAgICAgICB0aGlzLnJlbmRlcmVyLl9zbW9vdGhlZERhdGEgPSBbXTsKICAgICAgICB0aGlzLnJlbmRlcmVyLl9zbW9vdGhlZFBsb3REYXRhID0gW107CiAgICAgICAgdGhpcy5yZW5kZXJlci5faGlCYW5kR3JpZERhdGEgPSBbXTsKICAgICAgICB0aGlzLnJlbmRlcmVyLl9sb3dCYW5kR3JpZERhdGEgPSBbXTsKICAgICAgICB0aGlzLnJlbmRlcmVyLl9oaUJhbmRTbW9vdGhlZERhdGEgPSBbXTsKICAgICAgICB0aGlzLnJlbmRlcmVyLl9sb3dCYW5kU21vb3RoZWREYXRhID0gW107CiAgICAgICAgdmFyIGJhbmRzID0gdGhpcy5yZW5kZXJlci5iYW5kczsKICAgICAgICB2YXIgaGFzTnVsbCA9IGZhbHNlOwogICAgICAgIGZvciAodmFyIGk9MDsgaTxkYXRhLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIC8vIGlmIG5vdCBhIGxpbmUgc2VyaWVzIG9yIGlmIG5vIG51bGxzIGluIGRhdGEsIHB1c2ggdGhlIGNvbnZlcnRlZCBwb2ludCBvbnRvIHRoZSBhcnJheS4KICAgICAgICAgICAgaWYgKGRhdGFbaV1bMF0gIT0gbnVsbCAmJiBkYXRhW2ldWzFdICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIGdkLnB1c2goW3hwLmNhbGwodGhpcy5feGF4aXMsIGRhdGFbaV1bMF0pLCB5cC5jYWxsKHRoaXMuX3lheGlzLCBkYXRhW2ldWzFdKV0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIGVsc2UgaWYgdGhlcmUgaXMgYSBudWxsLCBwcmVzZXJ2ZSBpdC4KICAgICAgICAgICAgZWxzZSBpZiAoZGF0YVtpXVswXSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICBoYXNOdWxsID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGdkLnB1c2goW251bGwsIHlwLmNhbGwodGhpcy5feWF4aXMsIGRhdGFbaV1bMV0pXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoZGF0YVtpXVsxXSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICBoYXNOdWxsID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGdkLnB1c2goW3hwLmNhbGwodGhpcy5feGF4aXMsIGRhdGFbaV1bMF0pLCBudWxsXSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIGRvbid0IGRvIHNtb290aGluZyBvciBiYW5kcyBvbiBicm9rZW4gbGluZXMuCiAgICAgICAgaWYgKGhhc051bGwpIHsKICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zbW9vdGggPSBmYWxzZTsKICAgICAgICAgICAgaWYgKHRoaXMuX3R5cGUgPT09ICdsaW5lJykgewogICAgICAgICAgICAgICAgYmFuZHMuc2hvdyA9IGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAodGhpcy5fdHlwZSA9PT0gJ2xpbmUnICYmIGJhbmRzLnNob3cpIHsKICAgICAgICAgICAgZm9yICh2YXIgaT0wLCBsPWJhbmRzLmhpRGF0YS5sZW5ndGg7IGk8bDsgaSsrKSB7CiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLl9oaUJhbmRHcmlkRGF0YS5wdXNoKFt4cC5jYWxsKHRoaXMuX3hheGlzLCBiYW5kcy5oaURhdGFbaV1bMF0pLCB5cC5jYWxsKHRoaXMuX3lheGlzLCBiYW5kcy5oaURhdGFbaV1bMV0pXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yICh2YXIgaT0wLCBsPWJhbmRzLmxvd0RhdGEubGVuZ3RoOyBpPGw7IGkrKykgewogICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5fbG93QmFuZEdyaWREYXRhLnB1c2goW3hwLmNhbGwodGhpcy5feGF4aXMsIGJhbmRzLmxvd0RhdGFbaV1bMF0pLCB5cC5jYWxsKHRoaXMuX3lheGlzLCBiYW5kcy5sb3dEYXRhW2ldWzFdKV0pOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAodGhpcy5fdHlwZSA9PT0gJ2xpbmUnICYmIHRoaXMucmVuZGVyZXIuc21vb3RoICYmIGdkLmxlbmd0aCA+IDIpIHsKICAgICAgICAgICAgdmFyIHJldDsKICAgICAgICAgICAgaWYgKHRoaXMucmVuZGVyZXIuY29uc3RyYWluU21vb3RoaW5nKSB7CiAgICAgICAgICAgICAgICByZXQgPSBjb21wdXRlQ29uc3RyYWluZWRTbW9vdGhlZERhdGEuY2FsbCh0aGlzLCBnZCk7CiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLl9zbW9vdGhlZERhdGEgPSByZXRbMF07CiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLl9zbW9vdGhlZFBsb3REYXRhID0gcmV0WzFdOwoKICAgICAgICAgICAgICAgIGlmIChiYW5kcy5zaG93KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0ID0gY29tcHV0ZUNvbnN0cmFpbmVkU21vb3RoZWREYXRhLmNhbGwodGhpcywgdGhpcy5yZW5kZXJlci5faGlCYW5kR3JpZERhdGEpOwogICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuX2hpQmFuZFNtb290aGVkRGF0YSA9IHJldFswXTsKICAgICAgICAgICAgICAgICAgICByZXQgPSBjb21wdXRlQ29uc3RyYWluZWRTbW9vdGhlZERhdGEuY2FsbCh0aGlzLCB0aGlzLnJlbmRlcmVyLl9sb3dCYW5kR3JpZERhdGEpOwogICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuX2xvd0JhbmRTbW9vdGhlZERhdGEgPSByZXRbMF07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmV0ID0gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHJldCA9IGNvbXB1dGVIZXJtaXRlU21vb3RoZWREYXRhLmNhbGwodGhpcywgZ2QpOwogICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5fc21vb3RoZWREYXRhID0gcmV0WzBdOwogICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5fc21vb3RoZWRQbG90RGF0YSA9IHJldFsxXTsKCiAgICAgICAgICAgICAgICBpZiAoYmFuZHMuc2hvdykgewogICAgICAgICAgICAgICAgICAgIHJldCA9IGNvbXB1dGVIZXJtaXRlU21vb3RoZWREYXRhLmNhbGwodGhpcywgdGhpcy5yZW5kZXJlci5faGlCYW5kR3JpZERhdGEpOwogICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuX2hpQmFuZFNtb290aGVkRGF0YSA9IHJldFswXTsKICAgICAgICAgICAgICAgICAgICByZXQgPSBjb21wdXRlSGVybWl0ZVNtb290aGVkRGF0YS5jYWxsKHRoaXMsIHRoaXMucmVuZGVyZXIuX2xvd0JhbmRHcmlkRGF0YSk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5fbG93QmFuZFNtb290aGVkRGF0YSA9IHJldFswXTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXQgPSBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBnZDsKICAgIH07CiAgICAKCiAgICAvLyBjYWxsZWQgd2l0aGluIHNjb3BlIG9mIHNlcmllcy4KICAgICQuanFwbG90LkxpbmVSZW5kZXJlci5wcm90b3R5cGUuZHJhdyA9IGZ1bmN0aW9uKGN0eCwgZ2QsIG9wdGlvbnMsIHBsb3QpIHsKICAgICAgICB2YXIgaTsKICAgICAgICAvLyBnZXQgYSBjb3B5IG9mIHRoZSBvcHRpb25zLCBzbyB3ZSBkb24ndCBtb2RpZnkgdGhlIG9yaWdpbmFsIG9iamVjdC4KICAgICAgICB2YXIgb3B0cyA9ICQuZXh0ZW5kKHRydWUsIHt9LCBvcHRpb25zKTsKICAgICAgICB2YXIgc2hhZG93ID0gKG9wdHMuc2hhZG93ICE9IHVuZGVmaW5lZCkgPyBvcHRzLnNoYWRvdyA6IHRoaXMuc2hhZG93OwogICAgICAgIHZhciBzaG93TGluZSA9IChvcHRzLnNob3dMaW5lICE9IHVuZGVmaW5lZCkgPyBvcHRzLnNob3dMaW5lIDogdGhpcy5zaG93TGluZTsKICAgICAgICB2YXIgZmlsbCA9IChvcHRzLmZpbGwgIT0gdW5kZWZpbmVkKSA/IG9wdHMuZmlsbCA6IHRoaXMuZmlsbDsKICAgICAgICB2YXIgZmlsbEFuZFN0cm9rZSA9IChvcHRzLmZpbGxBbmRTdHJva2UgIT0gdW5kZWZpbmVkKSA/IG9wdHMuZmlsbEFuZFN0cm9rZSA6IHRoaXMuZmlsbEFuZFN0cm9rZTsKICAgICAgICB2YXIgeG1pbiwgeW1pbiwgeG1heCwgeW1heDsKICAgICAgICBjdHguc2F2ZSgpOwogICAgICAgIGlmIChnZC5sZW5ndGgpIHsKICAgICAgICAgICAgaWYgKHNob3dMaW5lKSB7CiAgICAgICAgICAgICAgICAvLyBpZiB3ZSBmaWxsLCB3ZSdsbCBoYXZlIHRvIGFkZCBwb2ludHMgdG8gY2xvc2UgdGhlIGN1cnZlLgogICAgICAgICAgICAgICAgaWYgKGZpbGwpIHsKICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5maWxsVG9aZXJvKSB7IAogICAgICAgICAgICAgICAgICAgICAgICAvLyBoYXZlIHRvIGJyZWFrIGxpbmUgdXAgaW50byBzaGFwZXMgYXQgYXhpcyBjcm9zc2luZ3MKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5lZ2F0aXZlQ29sb3IgPSB0aGlzLm5lZ2F0aXZlQ29sb3I7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIHRoaXMudXNlTmVnYXRpdmVDb2xvcnMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZ2F0aXZlQ29sb3IgPSBvcHRzLmZpbGxTdHlsZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaXNuZWdhdGl2ZSA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgcG9zZnMgPSBvcHRzLmZpbGxTdHlsZTsKICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgc3Rva2luZyBsaW5lIGFzIHdlbGwgYXMgZmlsbGluZywgZ2V0IGEgY29weSBvZiBsaW5lIGRhdGEuCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWxsQW5kU3Ryb2tlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmFzZ2QgPSBnZC5zbGljZSgwKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBub3Qgc3RhY2tlZCwgZmlsbCBkb3duIHRvIGF4aXMKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaW5kZXggPT0gMCB8fCAhdGhpcy5fc3RhY2spIHsKICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGVtcGdkID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcGQgPSAodGhpcy5yZW5kZXJlci5zbW9vdGgpID8gdGhpcy5yZW5kZXJlci5fc21vb3RoZWRQbG90RGF0YSA6IHRoaXMuX3Bsb3REYXRhOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fYXJlYVBvaW50cyA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHB5emVybyA9IHRoaXMuX3lheGlzLnNlcmllc191MnAodGhpcy5maWxsVG9WYWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcHh6ZXJvID0gdGhpcy5feGF4aXMuc2VyaWVzX3UycCh0aGlzLmZpbGxUb1ZhbHVlKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRzLmNsb3NlUGF0aCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmZpbGxBeGlzID09ICd5JykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBnZC5wdXNoKFtnZFswXVswXSwgcHl6ZXJvXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fYXJlYVBvaW50cy5wdXNoKFtnZFswXVswXSwgcHl6ZXJvXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaT0wOyBpPGdkLmxlbmd0aC0xOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGdkLnB1c2goZ2RbaV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9hcmVhUG9pbnRzLnB1c2goZ2RbaV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkbyB3ZSBoYXZlIGFuIGF4aXMgY3Jvc3Npbmc/CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwZFtpXVsxXSAqIHBkW2krMV1bMV0gPCAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGRbaV1bMV0gPCAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNuZWdhdGl2ZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0cy5maWxsU3R5bGUgPSBuZWdhdGl2ZUNvbG9yOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNuZWdhdGl2ZSA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdHMuZmlsbFN0eWxlID0gcG9zZnM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB4aW50ZXJjZXB0ID0gZ2RbaV1bMF0gKyAoZ2RbaSsxXVswXSAtIGdkW2ldWzBdKSAqIChweXplcm8tZ2RbaV1bMV0pLyhnZFtpKzFdWzFdIC0gZ2RbaV1bMV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGdkLnB1c2goW3hpbnRlcmNlcHQsIHB5emVyb10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fYXJlYVBvaW50cy5wdXNoKFt4aW50ZXJjZXB0LCBweXplcm9dKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdyBkcmF3IHRoaXMgc2hhcGUgYW5kIHNoYWRvdy4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaGFkb3cpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNoYWRvd1JlbmRlcmVyLmRyYXcoY3R4LCB0ZW1wZ2QsIG9wdHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zaGFwZVJlbmRlcmVyLmRyYXcoY3R4LCB0ZW1wZ2QsIG9wdHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm93IGVtcHR5IHRlbXAgYXJyYXkgYW5kIGNvbnRpbnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wZ2QgPSBbW3hpbnRlcmNlcHQsIHB5emVyb11dOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5fYXJlYVBvaW50cyA9IFtbeGludGVyY2VwdCwgcHl6ZXJvXV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBkW2dkLmxlbmd0aC0xXVsxXSA8IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNuZWdhdGl2ZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdHMuZmlsbFN0eWxlID0gbmVnYXRpdmVDb2xvcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzbmVnYXRpdmUgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0cy5maWxsU3R5bGUgPSBwb3NmczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGdkLnB1c2goZ2RbZ2QubGVuZ3RoLTFdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9hcmVhUG9pbnRzLnB1c2goZ2RbZ2QubGVuZ3RoLTFdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wZ2QucHVzaChbZ2RbZ2QubGVuZ3RoLTFdWzBdLCBweXplcm9dKTsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fYXJlYVBvaW50cy5wdXNoKFtnZFtnZC5sZW5ndGgtMV1bMF0sIHB5emVyb10pOyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdyBkcmF3IHRoZSBsYXN0IGFyZWEuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2hhZG93KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zaGFkb3dSZW5kZXJlci5kcmF3KGN0eCwgdGVtcGdkLCBvcHRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2hhcGVSZW5kZXJlci5kcmF3KGN0eCwgdGVtcGdkLCBvcHRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB2YXIgZ3JpZHltaW4gPSB0aGlzLl95YXhpcy5zZXJpZXNfdTJwKDApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gLy8gSUUgZG9lc24ndCByZXR1cm4gbmV3IGxlbmd0aCBvbiB1bnNoaWZ0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBnZC51bnNoaWZ0KFtnZFswXVswXSwgZ3JpZHltaW5dKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxlbiA9IGdkLmxlbmd0aDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdkLnB1c2goW2dkW2xlbiAtIDFdWzBdLCBncmlkeW1pbl0pOyAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBzdGFja2VkLCBmaWxsIHRvIGxpbmUgYmVsb3cgCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHByZXYgPSB0aGlzLl9wcmV2R3JpZERhdGE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpPXByZXYubGVuZ3RoOyBpPjA7IGktLSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdkLnB1c2gocHJldltpLTFdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLl9hcmVhUG9pbnRzLnB1c2gocHJldltpLTFdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaGFkb3cpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNoYWRvd1JlbmRlcmVyLmRyYXcoY3R4LCBnZCwgb3B0cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9hcmVhUG9pbnRzID0gZ2Q7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNoYXBlUmVuZGVyZXIuZHJhdyhjdHgsIGdkLCBvcHRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAgICAgICAgICAgICAgICAgLy8gTm90IGZpbGxlZCB0byB6ZXJvCiAgICAgICAgICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAgICAgICAgICAgICAgICAgZWxzZSB7ICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgc3Rva2luZyBsaW5lIGFzIHdlbGwgYXMgZmlsbGluZywgZ2V0IGEgY29weSBvZiBsaW5lIGRhdGEuCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWxsQW5kU3Ryb2tlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmFzZ2QgPSBnZC5zbGljZSgwKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBub3Qgc3RhY2tlZCwgZmlsbCBkb3duIHRvIGF4aXMKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaW5kZXggPT0gMCB8fCAhdGhpcy5fc3RhY2spIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHZhciBncmlkeW1pbiA9IHRoaXMuX3lheGlzLnNlcmllc191MnAodGhpcy5feWF4aXMubWluKSAtIHRoaXMuZ3JpZEJvcmRlcldpZHRoIC8gMjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBncmlkeW1pbiA9IGN0eC5jYW52YXMuaGVpZ2h0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSUUgZG9lc24ndCByZXR1cm4gbmV3IGxlbmd0aCBvbiB1bnNoaWZ0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZC51bnNoaWZ0KFtnZFswXVswXSwgZ3JpZHltaW5dKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsZW4gPSBnZC5sZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZC5wdXNoKFtnZFtsZW4gLSAxXVswXSwgZ3JpZHltaW5dKTsgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgc3RhY2tlZCwgZmlsbCB0byBsaW5lIGJlbG93IAogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwcmV2ID0gdGhpcy5fcHJldkdyaWREYXRhOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaT1wcmV2Lmxlbmd0aDsgaT4wOyBpLS0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZC5wdXNoKHByZXZbaS0xXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fYXJlYVBvaW50cyA9IGdkOwogICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNoYWRvdykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zaGFkb3dSZW5kZXJlci5kcmF3KGN0eCwgZ2QsIG9wdHMpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNoYXBlUmVuZGVyZXIuZHJhdyhjdHgsIGdkLCBvcHRzKTsgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGxBbmRTdHJva2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZhc29wdHMgPSAkLmV4dGVuZCh0cnVlLCB7fSwgb3B0cywge2ZpbGw6ZmFsc2UsIGNsb3NlUGF0aDpmYWxzZX0pOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNoYXBlUmVuZGVyZXIuZHJhdyhjdHgsIGZhc2dkLCBmYXNvcHRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgLy8vLy8vLy8vLwogICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBmaWd1cmUgb3V0IHNvbWUgd2F5IHRvIGRvIHNoYWRvd3MgbmljZWx5CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIChzaGFkb3cpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIHRoaXMucmVuZGVyZXIuc2hhZG93UmVuZGVyZXIuZHJhdyhjdHgsIGZhc2dkLCBmYXNvcHRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gfQogICAgICAgICAgICAgICAgICAgICAgICAvLyBub3cgZHJhdyB0aGUgbWFya2VycwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5tYXJrZXJSZW5kZXJlci5zaG93KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5yZW5kZXJlci5zbW9vdGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYXNnZCA9IHRoaXMuZ3JpZERhdGE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaTxmYXNnZC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWFya2VyUmVuZGVyZXIuZHJhdyhmYXNnZFtpXVswXSwgZmFzZ2RbaV1bMV0sIGN0eCwgb3B0cy5tYXJrZXJPcHRpb25zKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewoKICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5yZW5kZXJlci5iYW5kcy5zaG93KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBiZGF0OwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYm9wdHMgPSAkLmV4dGVuZCh0cnVlLCB7fSwgb3B0cyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlbmRlcmVyLmJhbmRzLnNob3dMaW5lcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmRhdCA9ICh0aGlzLnJlbmRlcmVyLnNtb290aCkgPyB0aGlzLnJlbmRlcmVyLl9oaUJhbmRTbW9vdGhlZERhdGEgOiB0aGlzLnJlbmRlcmVyLl9oaUJhbmRHcmlkRGF0YTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2hhcGVSZW5kZXJlci5kcmF3KGN0eCwgYmRhdCwgb3B0cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZGF0ID0gKHRoaXMucmVuZGVyZXIuc21vb3RoKSA/IHRoaXMucmVuZGVyZXIuX2xvd0JhbmRTbW9vdGhlZERhdGEgOiB0aGlzLnJlbmRlcmVyLl9sb3dCYW5kR3JpZERhdGE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNoYXBlUmVuZGVyZXIuZHJhdyhjdHgsIGJkYXQsIGJvcHRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucmVuZGVyZXIuYmFuZHMuZmlsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucmVuZGVyZXIuc21vb3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmRhdCA9IHRoaXMucmVuZGVyZXIuX2hpQmFuZFNtb290aGVkRGF0YS5jb25jYXQodGhpcy5yZW5kZXJlci5fbG93QmFuZFNtb290aGVkRGF0YS5yZXZlcnNlKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmRhdCA9IHRoaXMucmVuZGVyZXIuX2hpQmFuZEdyaWREYXRhLmNvbmNhdCh0aGlzLnJlbmRlcmVyLl9sb3dCYW5kR3JpZERhdGEucmV2ZXJzZSgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2FyZWFQb2ludHMgPSBiZGF0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9wdHMuY2xvc2VQYXRoID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcHRzLmZpbGwgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9wdHMuZmlsbFN0eWxlID0gdGhpcy5yZW5kZXJlci5iYW5kcy5maWxsQ29sb3I7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNoYXBlUmVuZGVyZXIuZHJhdyhjdHgsIGJkYXQsIGJvcHRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKHNoYWRvdykgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNoYWRvd1JlbmRlcmVyLmRyYXcoY3R4LCBnZCwgb3B0cyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgCiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zaGFwZVJlbmRlcmVyLmRyYXcoY3R4LCBnZCwgb3B0cyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gY2FsY3VsYXRlIHRoZSBib3VuZGluZyBib3gKICAgICAgICAgICAgdmFyIHhtaW4gPSB4bWF4ID0geW1pbiA9IHltYXggPSBudWxsOwogICAgICAgICAgICBmb3IgKGk9MDsgaTx0aGlzLl9hcmVhUG9pbnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICB2YXIgcCA9IHRoaXMuX2FyZWFQb2ludHNbaV07CiAgICAgICAgICAgICAgICBpZiAoeG1pbiA+IHBbMF0gfHwgeG1pbiA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgeG1pbiA9IHBbMF07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoeW1heCA8IHBbMV0gfHwgeW1heCA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgeW1heCA9IHBbMV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoeG1heCA8IHBbMF0gfHwgeG1heCA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgeG1heCA9IHBbMF07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoeW1pbiA+IHBbMV0gfHwgeW1pbiA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgeW1pbiA9IHBbMV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh0aGlzLnR5cGUgPT09ICdsaW5lJyAmJiB0aGlzLnJlbmRlcmVyLmJhbmRzLnNob3cpIHsKICAgICAgICAgICAgICAgIHltYXggPSB0aGlzLl95YXhpcy5zZXJpZXNfdTJwKHRoaXMucmVuZGVyZXIuYmFuZHMuX21pbik7CiAgICAgICAgICAgICAgICB5bWluID0gdGhpcy5feWF4aXMuc2VyaWVzX3UycCh0aGlzLnJlbmRlcmVyLmJhbmRzLl9tYXgpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLl9ib3VuZGluZ0JveCA9IFtbeG1pbiwgeW1heF0sIFt4bWF4LCB5bWluXV07CiAgICAgICAgCiAgICAgICAgICAgIC8vIG5vdyBkcmF3IHRoZSBtYXJrZXJzCiAgICAgICAgICAgIGlmICh0aGlzLm1hcmtlclJlbmRlcmVyLnNob3cgJiYgIWZpbGwpIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlbmRlcmVyLnNtb290aCkgewogICAgICAgICAgICAgICAgICAgIGdkID0gdGhpcy5ncmlkRGF0YTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpPGdkLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGdkW2ldWzBdICE9IG51bGwgJiYgZ2RbaV1bMV0gIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1hcmtlclJlbmRlcmVyLmRyYXcoZ2RbaV1bMF0sIGdkW2ldWzFdLCBjdHgsIG9wdHMubWFya2VyT3B0aW9ucyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGN0eC5yZXN0b3JlKCk7CiAgICB9OyAgCiAgICAKICAgICQuanFwbG90LkxpbmVSZW5kZXJlci5wcm90b3R5cGUuZHJhd1NoYWRvdyA9IGZ1bmN0aW9uKGN0eCwgZ2QsIG9wdGlvbnMpIHsKICAgICAgICAvLyBUaGlzIGlzIGEgbm8tb3AsIHNoYWRvd3MgZHJhd24gd2l0aCBsaW5lcy4KICAgIH07CiAgICAKICAgIC8vIGNhbGxlZCB3aXRoIHNjb3BlIG9mIHBsb3QuCiAgICAvLyBtYWtlIHN1cmUgdG8gbm90IGxlYXZlIGFueXRoaW5nIGhpZ2hsaWdodGVkLgogICAgZnVuY3Rpb24gcG9zdEluaXQodGFyZ2V0LCBkYXRhLCBvcHRpb25zKSB7CiAgICAgICAgZm9yICh2YXIgaT0wOyBpPHRoaXMuc2VyaWVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIGlmICh0aGlzLnNlcmllc1tpXS5yZW5kZXJlci5jb25zdHJ1Y3RvciA9PSAkLmpxcGxvdC5MaW5lUmVuZGVyZXIpIHsKICAgICAgICAgICAgICAgIC8vIGRvbid0IGFsbG93IG1vdXNlb3ZlciBhbmQgbW91c2Vkb3duIGF0IHNhbWUgdGltZS4KICAgICAgICAgICAgICAgIGlmICh0aGlzLnNlcmllc1tpXS5oaWdobGlnaHRNb3VzZU92ZXIpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLnNlcmllc1tpXS5oaWdobGlnaHRNb3VzZURvd24gPSBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0gIAogICAgCiAgICAvLyBjYWxsZWQgd2l0aGluIGNvbnRleHQgb2YgcGxvdAogICAgLy8gY3JlYXRlIGEgY2FudmFzIHdoaWNoIHdlIGNhbiBkcmF3IG9uLgogICAgLy8gaW5zZXJ0IGl0IGJlZm9yZSB0aGUgZXZlbnRDYW52YXMsIHNvIGV2ZW50Q2FudmFzIHdpbGwgc3RpbGwgY2FwdHVyZSBldmVudHMuCiAgICBmdW5jdGlvbiBwb3N0UGxvdERyYXcoKSB7CiAgICAgICAgLy8gTWVtb3J5IExlYWtzIHBhdGNoICAgIAogICAgICAgIGlmICh0aGlzLnBsdWdpbnMubGluZVJlbmRlcmVyICYmIHRoaXMucGx1Z2lucy5saW5lUmVuZGVyZXIuaGlnaGxpZ2h0Q2FudmFzKSB7CiAgICAgICAgICB0aGlzLnBsdWdpbnMubGluZVJlbmRlcmVyLmhpZ2hsaWdodENhbnZhcy5yZXNldENhbnZhcygpOwogICAgICAgICAgdGhpcy5wbHVnaW5zLmxpbmVSZW5kZXJlci5oaWdobGlnaHRDYW52YXMgPSBudWxsOwogICAgICAgIH0KICAgICAgICAKICAgICAgICB0aGlzLnBsdWdpbnMubGluZVJlbmRlcmVyLmhpZ2hsaWdodGVkU2VyaWVzSW5kZXggPSBudWxsOwogICAgICAgIHRoaXMucGx1Z2lucy5saW5lUmVuZGVyZXIuaGlnaGxpZ2h0Q2FudmFzID0gbmV3ICQuanFwbG90LkdlbmVyaWNDYW52YXMoKTsKICAgICAgICAKICAgICAgICB0aGlzLmV2ZW50Q2FudmFzLl9lbGVtLmJlZm9yZSh0aGlzLnBsdWdpbnMubGluZVJlbmRlcmVyLmhpZ2hsaWdodENhbnZhcy5jcmVhdGVFbGVtZW50KHRoaXMuX2dyaWRQYWRkaW5nLCAnanFwbG90LWxpbmVSZW5kZXJlci1oaWdobGlnaHQtY2FudmFzJywgdGhpcy5fcGxvdERpbWVuc2lvbnMsIHRoaXMpKTsKICAgICAgICB0aGlzLnBsdWdpbnMubGluZVJlbmRlcmVyLmhpZ2hsaWdodENhbnZhcy5zZXRDb250ZXh0KCk7CiAgICAgICAgdGhpcy5ldmVudENhbnZhcy5fZWxlbS5iaW5kKCdtb3VzZWxlYXZlJywge3Bsb3Q6dGhpc30sIGZ1bmN0aW9uIChldikgeyB1bmhpZ2hsaWdodChldi5kYXRhLnBsb3QpOyB9KTsKICAgIH0gCiAgICAKICAgIGZ1bmN0aW9uIGhpZ2hsaWdodCAocGxvdCwgc2lkeCwgcGlkeCwgcG9pbnRzKSB7CiAgICAgICAgdmFyIHMgPSBwbG90LnNlcmllc1tzaWR4XTsKICAgICAgICB2YXIgY2FudmFzID0gcGxvdC5wbHVnaW5zLmxpbmVSZW5kZXJlci5oaWdobGlnaHRDYW52YXM7CiAgICAgICAgY2FudmFzLl9jdHguY2xlYXJSZWN0KDAsMCxjYW52YXMuX2N0eC5jYW52YXMud2lkdGgsIGNhbnZhcy5fY3R4LmNhbnZhcy5oZWlnaHQpOwogICAgICAgIHMuX2hpZ2hsaWdodGVkUG9pbnQgPSBwaWR4OwogICAgICAgIHBsb3QucGx1Z2lucy5saW5lUmVuZGVyZXIuaGlnaGxpZ2h0ZWRTZXJpZXNJbmRleCA9IHNpZHg7CiAgICAgICAgdmFyIG9wdHMgPSB7ZmlsbFN0eWxlOiBzLmhpZ2hsaWdodENvbG9yfTsKICAgICAgICBpZiAocy50eXBlID09PSAnbGluZScgJiYgcy5yZW5kZXJlci5iYW5kcy5zaG93KSB7CiAgICAgICAgICAgIG9wdHMuZmlsbCA9IHRydWU7CiAgICAgICAgICAgIG9wdHMuY2xvc2VQYXRoID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgcy5yZW5kZXJlci5zaGFwZVJlbmRlcmVyLmRyYXcoY2FudmFzLl9jdHgsIHBvaW50cywgb3B0cyk7CiAgICAgICAgY2FudmFzID0gbnVsbDsKICAgIH0KICAgIAogICAgZnVuY3Rpb24gdW5oaWdobGlnaHQgKHBsb3QpIHsKICAgICAgICB2YXIgY2FudmFzID0gcGxvdC5wbHVnaW5zLmxpbmVSZW5kZXJlci5oaWdobGlnaHRDYW52YXM7CiAgICAgICAgY2FudmFzLl9jdHguY2xlYXJSZWN0KDAsMCwgY2FudmFzLl9jdHguY2FudmFzLndpZHRoLCBjYW52YXMuX2N0eC5jYW52YXMuaGVpZ2h0KTsKICAgICAgICBmb3IgKHZhciBpPTA7IGk8cGxvdC5zZXJpZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgcGxvdC5zZXJpZXNbaV0uX2hpZ2hsaWdodGVkUG9pbnQgPSBudWxsOwogICAgICAgIH0KICAgICAgICBwbG90LnBsdWdpbnMubGluZVJlbmRlcmVyLmhpZ2hsaWdodGVkU2VyaWVzSW5kZXggPSBudWxsOwogICAgICAgIHBsb3QudGFyZ2V0LnRyaWdnZXIoJ2pxcGxvdERhdGFVbmhpZ2hsaWdodCcpOwogICAgICAgIGNhbnZhcyA9IG51bGw7CiAgICB9CiAgICAKICAgIAogICAgZnVuY3Rpb24gaGFuZGxlTW92ZShldiwgZ3JpZHBvcywgZGF0YXBvcywgbmVpZ2hib3IsIHBsb3QpIHsKICAgICAgICBpZiAobmVpZ2hib3IpIHsKICAgICAgICAgICAgdmFyIGlucyA9IFtuZWlnaGJvci5zZXJpZXNJbmRleCwgbmVpZ2hib3IucG9pbnRJbmRleCwgbmVpZ2hib3IuZGF0YV07CiAgICAgICAgICAgIHZhciBldnQxID0galF1ZXJ5LkV2ZW50KCdqcXBsb3REYXRhTW91c2VPdmVyJyk7CiAgICAgICAgICAgIGV2dDEucGFnZVggPSBldi5wYWdlWDsKICAgICAgICAgICAgZXZ0MS5wYWdlWSA9IGV2LnBhZ2VZOwogICAgICAgICAgICBwbG90LnRhcmdldC50cmlnZ2VyKGV2dDEsIGlucyk7CiAgICAgICAgICAgIGlmIChwbG90LnNlcmllc1tpbnNbMF1dLmhpZ2hsaWdodE1vdXNlT3ZlciAmJiAhKGluc1swXSA9PSBwbG90LnBsdWdpbnMubGluZVJlbmRlcmVyLmhpZ2hsaWdodGVkU2VyaWVzSW5kZXgpKSB7CiAgICAgICAgICAgICAgICB2YXIgZXZ0ID0galF1ZXJ5LkV2ZW50KCdqcXBsb3REYXRhSGlnaGxpZ2h0Jyk7CiAgICAgICAgICAgICAgICBldnQucGFnZVggPSBldi5wYWdlWDsKICAgICAgICAgICAgICAgIGV2dC5wYWdlWSA9IGV2LnBhZ2VZOwogICAgICAgICAgICAgICAgcGxvdC50YXJnZXQudHJpZ2dlcihldnQsIGlucyk7CiAgICAgICAgICAgICAgICBoaWdobGlnaHQgKHBsb3QsIG5laWdoYm9yLnNlcmllc0luZGV4LCBuZWlnaGJvci5wb2ludEluZGV4LCBuZWlnaGJvci5wb2ludHMpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKG5laWdoYm9yID09IG51bGwpIHsKICAgICAgICAgICAgdW5oaWdobGlnaHQgKHBsb3QpOwogICAgICAgIH0KICAgIH0KICAgIAogICAgZnVuY3Rpb24gaGFuZGxlTW91c2VEb3duKGV2LCBncmlkcG9zLCBkYXRhcG9zLCBuZWlnaGJvciwgcGxvdCkgewogICAgICAgIGlmIChuZWlnaGJvcikgewogICAgICAgICAgICB2YXIgaW5zID0gW25laWdoYm9yLnNlcmllc0luZGV4LCBuZWlnaGJvci5wb2ludEluZGV4LCBuZWlnaGJvci5kYXRhXTsKICAgICAgICAgICAgaWYgKHBsb3Quc2VyaWVzW2luc1swXV0uaGlnaGxpZ2h0TW91c2VEb3duICYmICEoaW5zWzBdID09IHBsb3QucGx1Z2lucy5saW5lUmVuZGVyZXIuaGlnaGxpZ2h0ZWRTZXJpZXNJbmRleCkpIHsKICAgICAgICAgICAgICAgIHZhciBldnQgPSBqUXVlcnkuRXZlbnQoJ2pxcGxvdERhdGFIaWdobGlnaHQnKTsKICAgICAgICAgICAgICAgIGV2dC5wYWdlWCA9IGV2LnBhZ2VYOwogICAgICAgICAgICAgICAgZXZ0LnBhZ2VZID0gZXYucGFnZVk7CiAgICAgICAgICAgICAgICBwbG90LnRhcmdldC50cmlnZ2VyKGV2dCwgaW5zKTsKICAgICAgICAgICAgICAgIGhpZ2hsaWdodCAocGxvdCwgbmVpZ2hib3Iuc2VyaWVzSW5kZXgsIG5laWdoYm9yLnBvaW50SW5kZXgsIG5laWdoYm9yLnBvaW50cyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAobmVpZ2hib3IgPT0gbnVsbCkgewogICAgICAgICAgICB1bmhpZ2hsaWdodCAocGxvdCk7CiAgICAgICAgfQogICAgfQogICAgCiAgICBmdW5jdGlvbiBoYW5kbGVNb3VzZVVwKGV2LCBncmlkcG9zLCBkYXRhcG9zLCBuZWlnaGJvciwgcGxvdCkgewogICAgICAgIHZhciBpZHggPSBwbG90LnBsdWdpbnMubGluZVJlbmRlcmVyLmhpZ2hsaWdodGVkU2VyaWVzSW5kZXg7CiAgICAgICAgaWYgKGlkeCAhPSBudWxsICYmIHBsb3Quc2VyaWVzW2lkeF0uaGlnaGxpZ2h0TW91c2VEb3duKSB7CiAgICAgICAgICAgIHVuaGlnaGxpZ2h0KHBsb3QpOwogICAgICAgIH0KICAgIH0KICAgIAogICAgZnVuY3Rpb24gaGFuZGxlQ2xpY2soZXYsIGdyaWRwb3MsIGRhdGFwb3MsIG5laWdoYm9yLCBwbG90KSB7CiAgICAgICAgaWYgKG5laWdoYm9yKSB7CiAgICAgICAgICAgIHZhciBpbnMgPSBbbmVpZ2hib3Iuc2VyaWVzSW5kZXgsIG5laWdoYm9yLnBvaW50SW5kZXgsIG5laWdoYm9yLmRhdGFdOwogICAgICAgICAgICB2YXIgZXZ0ID0galF1ZXJ5LkV2ZW50KCdqcXBsb3REYXRhQ2xpY2snKTsKICAgICAgICAgICAgZXZ0LnBhZ2VYID0gZXYucGFnZVg7CiAgICAgICAgICAgIGV2dC5wYWdlWSA9IGV2LnBhZ2VZOwogICAgICAgICAgICBwbG90LnRhcmdldC50cmlnZ2VyKGV2dCwgaW5zKTsKICAgICAgICB9CiAgICB9CiAgICAKICAgIGZ1bmN0aW9uIGhhbmRsZVJpZ2h0Q2xpY2soZXYsIGdyaWRwb3MsIGRhdGFwb3MsIG5laWdoYm9yLCBwbG90KSB7CiAgICAgICAgaWYgKG5laWdoYm9yKSB7CiAgICAgICAgICAgIHZhciBpbnMgPSBbbmVpZ2hib3Iuc2VyaWVzSW5kZXgsIG5laWdoYm9yLnBvaW50SW5kZXgsIG5laWdoYm9yLmRhdGFdOwogICAgICAgICAgICB2YXIgaWR4ID0gcGxvdC5wbHVnaW5zLmxpbmVSZW5kZXJlci5oaWdobGlnaHRlZFNlcmllc0luZGV4OwogICAgICAgICAgICBpZiAoaWR4ICE9IG51bGwgJiYgcGxvdC5zZXJpZXNbaWR4XS5oaWdobGlnaHRNb3VzZURvd24pIHsKICAgICAgICAgICAgICAgIHVuaGlnaGxpZ2h0KHBsb3QpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBldnQgPSBqUXVlcnkuRXZlbnQoJ2pxcGxvdERhdGFSaWdodENsaWNrJyk7CiAgICAgICAgICAgIGV2dC5wYWdlWCA9IGV2LnBhZ2VYOwogICAgICAgICAgICBldnQucGFnZVkgPSBldi5wYWdlWTsKICAgICAgICAgICAgcGxvdC50YXJnZXQudHJpZ2dlcihldnQsIGlucyk7CiAgICAgICAgfQogICAgfQogICAgCiAgICAKICAgIC8vIGNsYXNzOiAkLmpxcGxvdC5MaW5lYXJBeGlzUmVuZGVyZXIKICAgIC8vIFRoZSBkZWZhdWx0IGpxUGxvdCBheGlzIHJlbmRlcmVyLCBjcmVhdGluZyBhIG51bWVyaWMgYXhpcy4KICAgICQuanFwbG90LkxpbmVhckF4aXNSZW5kZXJlciA9IGZ1bmN0aW9uKCkgewogICAgfTsKICAgIAogICAgLy8gY2FsbGVkIHdpdGggc2NvcGUgb2YgYXhpcyBvYmplY3QuCiAgICAkLmpxcGxvdC5MaW5lYXJBeGlzUmVuZGVyZXIucHJvdG90eXBlLmluaXQgPSBmdW5jdGlvbihvcHRpb25zKXsKICAgICAgICAvLyBwcm9wOiBicmVha1BvaW50cwogICAgICAgIC8vIEVYUEVSSU1FTlRBTCEhIFVzZSBhdCB5b3VyIG93biByaXNrIQogICAgICAgIC8vIFdvcmtzIG9ubHkgd2l0aCBsaW5lYXIgYXhlcyBhbmQgdGhlIGRlZmF1bHQgdGljayByZW5kZXJlci4KICAgICAgICAvLyBBcnJheSBvZiBbc3RhcnQsIHN0b3BdIHBvaW50cyB0byBjcmVhdGUgYSBicm9rZW4gYXhpcy4KICAgICAgICAvLyBCcm9rZW4gYXhlcyBoYXZlIGEgImp1bXAiIGluIHRoZW0sIHdoaWNoIGlzIGFuIGltbWVkaWF0ZSAKICAgICAgICAvLyB0cmFuc2l0aW9uIGZyb20gYSBzbWFsbGVyIHZhbHVlIHRvIGEgbGFyZ2VyIHZhbHVlLgogICAgICAgIC8vIEN1cnJlbnRseSwgYXhpcyB0aWNrcyBNVVNUIGJlIG1hbnVhbGx5IGFzc2lnbmVkIGlmIHVzaW5nIGJyZWFrUG9pbnRzCiAgICAgICAgLy8gYnkgdXNpbmcgdGhlIGF4aXMgdGlja3MgYXJyYXkgb3B0aW9uLgogICAgICAgIHRoaXMuYnJlYWtQb2ludHMgPSBudWxsOwogICAgICAgIC8vIHByb3A6IGJyZWFrVGlja0xhYmVsCiAgICAgICAgLy8gTGFiZWwgdG8gdXNlIGF0IHRoZSBheGlzIGJyZWFrIGlmIGJyZWFrUG9pbnRzIGFyZSBzcGVjaWZpZWQuCiAgICAgICAgdGhpcy5icmVha1RpY2tMYWJlbCA9ICImYXN5bXA7IjsKICAgICAgICAvLyBwcm9wOiBkcmF3QmFzZWxpbmUKICAgICAgICAvLyBUcnVlIHRvIGRyYXcgdGhlIGF4aXMgYmFzZWxpbmUuCiAgICAgICAgdGhpcy5kcmF3QmFzZWxpbmUgPSB0cnVlOwogICAgICAgIC8vIHByb3A6IGJhc2VsaW5lV2lkdGgKICAgICAgICAvLyB3aWR0aCBvZiB0aGUgYmFzZWxpbmUgaW4gcGl4ZWxzLgogICAgICAgIHRoaXMuYmFzZWxpbmVXaWR0aCA9IG51bGw7CiAgICAgICAgLy8gcHJvcDogYmFzZWxpbmVDb2xvcgogICAgICAgIC8vIENTUyBjb2xvciBzcGVjIGZvciB0aGUgYmFzZWxpbmUuCiAgICAgICAgdGhpcy5iYXNlbGluZUNvbG9yID0gbnVsbDsKICAgICAgICAvLyBwcm9wOiBmb3JjZVRpY2tBdDAKICAgICAgICAvLyBUaGlzIHdpbGwgZW5zdXJlIHRoYXQgdGhlcmUgaXMgYWx3YXlzIGEgdGljayBtYXJrIGF0IDAuCiAgICAgICAgLy8gSWYgZGF0YSByYW5nZSBpcyBzdHJpY3RseSBwb3NpdGl2ZSBvciBuZWdhdGl2ZSwKICAgICAgICAvLyB0aGlzIHdpbGwgZm9yY2UgMCB0byBiZSBpbnNpZGUgdGhlIGF4aXMgYm91bmRzIHVubGVzcwogICAgICAgIC8vIHRoZSBhcHByb3ByaWF0ZSBheGlzIHBhZCAocGFkLCBwYWRNaW4gb3IgcGFkTWF4KSBpcyBzZXQKICAgICAgICAvLyB0byAwLCB0aGVuIHRoaXMgd2lsbCBmb3JjZSBhbiBheGlzIG1pbiBvciBtYXggdmFsdWUgYXQgMC4KICAgICAgICAvLyBUaGlzIGhhcyBrbm93IGVmZmVjdCB3aGVuIGFueSBvZiB0aGUgZm9sbG93aW5nIG9wdGlvbnMKICAgICAgICAvLyBhcmUgc2V0OiAgYXV0b3NjYWxlLCBtaW4sIG1heCwgbnVtYmVyVGlja3Mgb3IgdGlja0ludGVydmFsLgogICAgICAgIHRoaXMuZm9yY2VUaWNrQXQwID0gZmFsc2U7CiAgICAgICAgLy8gcHJvcDogZm9yY2VUaWNrQXQxMDAKICAgICAgICAvLyBUaGlzIHdpbGwgZW5zdXJlIHRoYXQgdGhlcmUgaXMgYWx3YXlzIGEgdGljayBtYXJrIGF0IDEwMC4KICAgICAgICAvLyBJZiBkYXRhIHJhbmdlIGlzIHN0cmljdGx5IGFib3ZlIG9yIGJlbG93IDEwMCwKICAgICAgICAvLyB0aGlzIHdpbGwgZm9yY2UgMTAwIHRvIGJlIGluc2lkZSB0aGUgYXhpcyBib3VuZHMgdW5sZXNzCiAgICAgICAgLy8gdGhlIGFwcHJvcHJpYXRlIGF4aXMgcGFkIChwYWQsIHBhZE1pbiBvciBwYWRNYXgpIGlzIHNldAogICAgICAgIC8vIHRvIDAsIHRoZW4gdGhpcyB3aWxsIGZvcmNlIGFuIGF4aXMgbWluIG9yIG1heCB2YWx1ZSBhdCAxMDAuCiAgICAgICAgLy8gVGhpcyBoYXMga25vdyBlZmZlY3Qgd2hlbiBhbnkgb2YgdGhlIGZvbGxvd2luZyBvcHRpb25zCiAgICAgICAgLy8gYXJlIHNldDogIGF1dG9zY2FsZSwgbWluLCBtYXgsIG51bWJlclRpY2tzIG9yIHRpY2tJbnRlcnZhbC4KICAgICAgICB0aGlzLmZvcmNlVGlja0F0MTAwID0gZmFsc2U7CiAgICAgICAgLy8gcHJvcDogdGlja0luc2V0CiAgICAgICAgLy8gQ29udHJvbHMgdGhlIGFtb3VudCB0byBpbnNldCB0aGUgZmlyc3QgYW5kIGxhc3QgdGlja3MgZnJvbSAKICAgICAgICAvLyB0aGUgZWRnZXMgb2YgdGhlIGdyaWQsIGluIG11bHRpcGxlcyBvZiB0aGUgdGljayBpbnRlcnZhbC4KICAgICAgICAvLyAwIGlzIG5vIGluc2V0LCAwLjUgaXMgb25lIGhhbGYgYSB0aWNrIGludGVydmFsLCAxIGlzIGEgZnVsbAogICAgICAgIC8vIHRpY2sgaW50ZXJ2YWwsIGV0Yy4KICAgICAgICB0aGlzLnRpY2tJbnNldCA9IDA7CiAgICAgICAgLy8gcHJvcDogbWlub3JUaWNrcwogICAgICAgIC8vIE51bWJlciBvZiB0aWNrcyB0byBhZGQgYmV0d2VlbiAibWFqb3IiIHRpY2tzLgogICAgICAgIC8vIE1ham9yIHRpY2tzIGFyZSB0aWNrcyBzdXBwbGllZCBieSB1c2VyIG9yIGF1dG8gY29tcHV0ZWQuCiAgICAgICAgLy8gTWlub3IgdGlja3MgY2Fubm90IGJlIGNyZWF0ZWQgYnkgdXNlci4KICAgICAgICB0aGlzLm1pbm9yVGlja3MgPSAwOwogICAgICAgIC8vIHByb3A6IGFsaWduVGlja3MKICAgICAgICAvLyB0cnVlIHRvIGFsaWduIHRpY2sgbWFya3MgYWNyb3NzIG9wcG9zZWQgYXhlcwogICAgICAgIC8vIHN1Y2ggYXMgZnJvbSB0aGUgeTJheGlzIHRvIHlheGlzLgogICAgICAgIHRoaXMuYWxpZ25UaWNrcyA9IGZhbHNlOwogICAgICAgIHRoaXMuX2F1dG9Gb3JtYXRTdHJpbmcgPSAnJzsKICAgICAgICB0aGlzLl9vdmVycmlkZUZvcm1hdFN0cmluZyA9IGZhbHNlOwogICAgICAgIHRoaXMuX3NjYWxlZmFjdCA9IDEuMDsKICAgICAgICAkLmV4dGVuZCh0cnVlLCB0aGlzLCBvcHRpb25zKTsKICAgICAgICBpZiAodGhpcy5icmVha1BvaW50cykgewogICAgICAgICAgICBpZiAoISQuaXNBcnJheSh0aGlzLmJyZWFrUG9pbnRzKSkgewogICAgICAgICAgICAgICAgdGhpcy5icmVha1BvaW50cyA9IG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5icmVha1BvaW50cy5sZW5ndGggPCAyIHx8IHRoaXMuYnJlYWtQb2ludHNbMV0gPD0gdGhpcy5icmVha1BvaW50c1swXSkgewogICAgICAgICAgICAgICAgdGhpcy5icmVha1BvaW50cyA9IG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKHRoaXMubnVtYmVyVGlja3MgIT0gbnVsbCAmJiB0aGlzLm51bWJlclRpY2tzIDwgMikgewogICAgICAgICAgICB0aGlzLm51bWJlclRpY2tzID0gMjsKICAgICAgICB9CiAgICAgICAgdGhpcy5yZXNldERhdGFCb3VuZHMoKTsKICAgIH07CiAgICAKICAgIC8vIGNhbGxlZCB3aXRoIHNjb3BlIG9mIGF4aXMKICAgICQuanFwbG90LkxpbmVhckF4aXNSZW5kZXJlci5wcm90b3R5cGUuZHJhdyA9IGZ1bmN0aW9uKGN0eCwgcGxvdCkgewogICAgICAgIGlmICh0aGlzLnNob3cpIHsKICAgICAgICAgICAgLy8gcG9wdWxhdGUgdGhlIGF4aXMgbGFiZWwgYW5kIHZhbHVlIHByb3BlcnRpZXMuCiAgICAgICAgICAgIC8vIGNyZWF0ZVRpY2tzIGlzIGEgbWV0aG9kIG9uIHRoZSByZW5kZXJlciwgYnV0CiAgICAgICAgICAgIC8vIGNhbGwgaXQgd2l0aGluIHRoZSBzY29wZSBvZiB0aGUgYXhpcy4KICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5jcmVhdGVUaWNrcy5jYWxsKHRoaXMsIHBsb3QpOwogICAgICAgICAgICAvLyBmaWxsIGEgZGl2IHdpdGggYXhlcyBsYWJlbHMgaW4gdGhlIHJpZ2h0IGRpcmVjdGlvbi4KICAgICAgICAgICAgLy8gTmVlZCB0byBwcmVnZW5lcmF0ZSBlYWNoIGF4aXMgdG8gZ2V0IGl0J3MgYm91bmRzIGFuZAogICAgICAgICAgICAvLyBwb3NpdGlvbiBpdCBhbmQgdGhlIGxhYmVscyBjb3JyZWN0bHkgb24gdGhlIHBsb3QuCiAgICAgICAgICAgIHZhciBkaW09MDsKICAgICAgICAgICAgdmFyIHRlbXA7CiAgICAgICAgICAgIC8vIEFkZGVkIGZvciB0aGVtaW5nLgogICAgICAgICAgICBpZiAodGhpcy5fZWxlbSkgewogICAgICAgICAgICAgICAgLy8gTWVtb3J5IExlYWtzIHBhdGNoCiAgICAgICAgICAgICAgICAvL3RoaXMuX2VsZW0uZW1wdHkoKTsKICAgICAgICAgICAgICAgIHRoaXMuX2VsZW0uZW1wdHlGb3JjZSgpOwogICAgICAgICAgICAgICAgdGhpcy5fZWxlbSA9IG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgICAgIHRoaXMuX2VsZW0gPSAkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpKTsKICAgICAgICAgICAgdGhpcy5fZWxlbS5hZGRDbGFzcygnanFwbG90LWF4aXMganFwbG90LScrdGhpcy5uYW1lKTsKICAgICAgICAgICAgdGhpcy5fZWxlbS5jc3MoJ3Bvc2l0aW9uJywgJ2Fic29sdXRlJyk7CgogICAgICAgICAgICAKICAgICAgICAgICAgaWYgKHRoaXMubmFtZSA9PSAneGF4aXMnIHx8IHRoaXMubmFtZSA9PSAneDJheGlzJykgewogICAgICAgICAgICAgICAgdGhpcy5fZWxlbS53aWR0aCh0aGlzLl9wbG90RGltZW5zaW9ucy53aWR0aCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICB0aGlzLl9lbGVtLmhlaWdodCh0aGlzLl9wbG90RGltZW5zaW9ucy5oZWlnaHQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICAvLyBjcmVhdGUgYSBfbGFiZWwgb2JqZWN0LgogICAgICAgICAgICB0aGlzLmxhYmVsT3B0aW9ucy5heGlzID0gdGhpcy5uYW1lOwogICAgICAgICAgICB0aGlzLl9sYWJlbCA9IG5ldyB0aGlzLmxhYmVsUmVuZGVyZXIodGhpcy5sYWJlbE9wdGlvbnMpOwogICAgICAgICAgICBpZiAodGhpcy5fbGFiZWwuc2hvdykgewogICAgICAgICAgICAgICAgdmFyIGVsZW0gPSB0aGlzLl9sYWJlbC5kcmF3KGN0eCwgcGxvdCk7CiAgICAgICAgICAgICAgICBlbGVtLmFwcGVuZFRvKHRoaXMuX2VsZW0pOwogICAgICAgICAgICAgICAgZWxlbSA9IG51bGw7CiAgICAgICAgICAgIH0KICAgIAogICAgICAgICAgICB2YXIgdCA9IHRoaXMuX3RpY2tzOwogICAgICAgICAgICB2YXIgdGljazsKICAgICAgICAgICAgZm9yICh2YXIgaT0wOyBpPHQubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIHRpY2sgPSB0W2ldOwogICAgICAgICAgICAgICAgaWYgKHRpY2suc2hvdyAmJiB0aWNrLnNob3dMYWJlbCAmJiAoIXRpY2suaXNNaW5vclRpY2sgfHwgdGhpcy5zaG93TWlub3JUaWNrcykpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9lbGVtLmFwcGVuZCh0aWNrLmRyYXcoY3R4LCBwbG90KSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGljayA9IG51bGw7CiAgICAgICAgICAgIHQgPSBudWxsOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5fZWxlbTsKICAgIH07CiAgICAKICAgIC8vIGNhbGxlZCB3aXRoIHNjb3BlIG9mIGFuIGF4aXMKICAgICQuanFwbG90LkxpbmVhckF4aXNSZW5kZXJlci5wcm90b3R5cGUucmVzZXQgPSBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLm1pbiA9IHRoaXMuX29wdGlvbnMubWluOwogICAgICAgIHRoaXMubWF4ID0gdGhpcy5fb3B0aW9ucy5tYXg7CiAgICAgICAgdGhpcy50aWNrSW50ZXJ2YWwgPSB0aGlzLl9vcHRpb25zLnRpY2tJbnRlcnZhbDsKICAgICAgICB0aGlzLm51bWJlclRpY2tzID0gdGhpcy5fb3B0aW9ucy5udW1iZXJUaWNrczsKICAgICAgICB0aGlzLl9hdXRvRm9ybWF0U3RyaW5nID0gJyc7CiAgICAgICAgaWYgKHRoaXMuX292ZXJyaWRlRm9ybWF0U3RyaW5nICYmIHRoaXMudGlja09wdGlvbnMgJiYgdGhpcy50aWNrT3B0aW9ucy5mb3JtYXRTdHJpbmcpIHsKICAgICAgICAgICAgdGhpcy50aWNrT3B0aW9ucy5mb3JtYXRTdHJpbmcgPSAnJzsKICAgICAgICB9CgogICAgICAgIC8vIHRoaXMuX3RpY2tzID0gdGhpcy5fX3RpY2tzOwogICAgfTsKICAgIAogICAgLy8gY2FsbGVkIHdpdGggc2NvcGUgb2YgYXhpcwogICAgJC5qcXBsb3QuTGluZWFyQXhpc1JlbmRlcmVyLnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbigpIHsgCiAgICAgICAgdmFyIGRpbSA9IDA7CiAgICAgICAgdmFyIHRlbXA7CiAgICAgICAgdmFyIHcgPSAwOwogICAgICAgIHZhciBoID0gMDsKICAgICAgICB2YXIgbHNob3cgPSAodGhpcy5fbGFiZWwgPT0gbnVsbCkgPyBmYWxzZSA6IHRoaXMuX2xhYmVsLnNob3c7CiAgICAgICAgaWYgKHRoaXMuc2hvdykgewogICAgICAgICAgICB2YXIgdCA9IHRoaXMuX3RpY2tzOwogICAgICAgICAgICB2YXIgdGljazsKICAgICAgICAgICAgZm9yICh2YXIgaT0wOyBpPHQubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIHRpY2sgPSB0W2ldOwogICAgICAgICAgICAgICAgaWYgKCF0aWNrLl9icmVha1RpY2sgJiYgdGljay5zaG93ICYmIHRpY2suc2hvd0xhYmVsICYmICghdGljay5pc01pbm9yVGljayB8fCB0aGlzLnNob3dNaW5vclRpY2tzKSkgewogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm5hbWUgPT0gJ3hheGlzJyB8fCB0aGlzLm5hbWUgPT0gJ3gyYXhpcycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGVtcCA9IHRpY2suX2VsZW0ub3V0ZXJIZWlnaHQodHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICB0ZW1wID0gdGljay5fZWxlbS5vdXRlcldpZHRoKHRydWUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAodGVtcCA+IGRpbSkgewogICAgICAgICAgICAgICAgICAgICAgICBkaW0gPSB0ZW1wOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICB0aWNrID0gbnVsbDsKICAgICAgICAgICAgdCA9IG51bGw7CiAgICAgICAgICAgIAogICAgICAgICAgICBpZiAobHNob3cpIHsKICAgICAgICAgICAgICAgIHcgPSB0aGlzLl9sYWJlbC5fZWxlbS5vdXRlcldpZHRoKHRydWUpOwogICAgICAgICAgICAgICAgaCA9IHRoaXMuX2xhYmVsLl9lbGVtLm91dGVySGVpZ2h0KHRydWUpOyAKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGhpcy5uYW1lID09ICd4YXhpcycpIHsKICAgICAgICAgICAgICAgIGRpbSA9IGRpbSArIGg7CiAgICAgICAgICAgICAgICB0aGlzLl9lbGVtLmNzcyh7J2hlaWdodCc6ZGltKydweCcsIGxlZnQ6JzBweCcsIGJvdHRvbTonMHB4J30pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMubmFtZSA9PSAneDJheGlzJykgewogICAgICAgICAgICAgICAgZGltID0gZGltICsgaDsKICAgICAgICAgICAgICAgIHRoaXMuX2VsZW0uY3NzKHsnaGVpZ2h0JzpkaW0rJ3B4JywgbGVmdDonMHB4JywgdG9wOicwcHgnfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5uYW1lID09ICd5YXhpcycpIHsKICAgICAgICAgICAgICAgIGRpbSA9IGRpbSArIHc7CiAgICAgICAgICAgICAgICB0aGlzLl9lbGVtLmNzcyh7J3dpZHRoJzpkaW0rJ3B4JywgbGVmdDonMHB4JywgdG9wOicwcHgnfSk7CiAgICAgICAgICAgICAgICBpZiAobHNob3cgJiYgdGhpcy5fbGFiZWwuY29uc3RydWN0b3IgPT0gJC5qcXBsb3QuQXhpc0xhYmVsUmVuZGVyZXIpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9sYWJlbC5fZWxlbS5jc3MoJ3dpZHRoJywgdysncHgnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGRpbSA9IGRpbSArIHc7CiAgICAgICAgICAgICAgICB0aGlzLl9lbGVtLmNzcyh7J3dpZHRoJzpkaW0rJ3B4JywgcmlnaHQ6JzBweCcsIHRvcDonMHB4J30pOwogICAgICAgICAgICAgICAgaWYgKGxzaG93ICYmIHRoaXMuX2xhYmVsLmNvbnN0cnVjdG9yID09ICQuanFwbG90LkF4aXNMYWJlbFJlbmRlcmVyKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbGFiZWwuX2VsZW0uY3NzKCd3aWR0aCcsIHcrJ3B4Jyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9ICAKICAgIH07ICAgIAogICAgCiAgICAvLyBjYWxsZWQgd2l0aCBzY29wZSBvZiBheGlzCiAgICAkLmpxcGxvdC5MaW5lYXJBeGlzUmVuZGVyZXIucHJvdG90eXBlLmNyZWF0ZVRpY2tzID0gZnVuY3Rpb24ocGxvdCkgewogICAgICAgIC8vIHdlJ3JlIGFyZSBvcGVyYXRpbmcgb24gYW4gYXhpcyBoZXJlCiAgICAgICAgdmFyIHRpY2tzID0gdGhpcy5fdGlja3M7CiAgICAgICAgdmFyIHVzZXJUaWNrcyA9IHRoaXMudGlja3M7CiAgICAgICAgdmFyIG5hbWUgPSB0aGlzLm5hbWU7CiAgICAgICAgLy8gZGF0YWJvdW5kcyB3ZXJlIHNldCBvbiBheGlzIGluaXRpYWxpemF0aW9uLgogICAgICAgIHZhciBkYiA9IHRoaXMuX2RhdGFCb3VuZHM7CiAgICAgICAgdmFyIGRpbSA9ICh0aGlzLm5hbWUuY2hhckF0KDApID09PSAneCcpID8gdGhpcy5fcGxvdERpbWVuc2lvbnMud2lkdGggOiB0aGlzLl9wbG90RGltZW5zaW9ucy5oZWlnaHQ7CiAgICAgICAgdmFyIGludGVydmFsOwogICAgICAgIHZhciBtaW4sIG1heDsKICAgICAgICB2YXIgcG9zMSwgcG9zMjsKICAgICAgICB2YXIgdHQsIGk7CiAgICAgICAgLy8gZ2V0IGEgY29weSBvZiB1c2VyJ3Mgc2V0dGluZ3MgZm9yIG1pbi9tYXguCiAgICAgICAgdmFyIHVzZXJNaW4gPSB0aGlzLm1pbjsKICAgICAgICB2YXIgdXNlck1heCA9IHRoaXMubWF4OwogICAgICAgIHZhciB1c2VyTlQgPSB0aGlzLm51bWJlclRpY2tzOwogICAgICAgIHZhciB1c2VyVEkgPSB0aGlzLnRpY2tJbnRlcnZhbDsKCiAgICAgICAgdmFyIHRocmVzaG9sZCA9IDMwOwogICAgICAgIHRoaXMuX3NjYWxlZmFjdCA9ICAoTWF0aC5tYXgoZGltLCB0aHJlc2hvbGQrMSkgLSB0aHJlc2hvbGQpLzMwMC4wOwogICAgICAgIAogICAgICAgIC8vIGlmIHdlIGFscmVhZHkgaGF2ZSB0aWNrcywgdXNlIHRoZW0uCiAgICAgICAgLy8gdGlja3MgbXVzdCBiZSBpbiBvcmRlciBvZiBpbmNyZWFzaW5nIHZhbHVlLgogICAgICAgIAogICAgICAgIGlmICh1c2VyVGlja3MubGVuZ3RoKSB7CiAgICAgICAgICAgIC8vIHRpY2tzIGNvdWxkIGJlIDFEIG9yIDJEIGFycmF5IG9mIFt2YWwsIHZhbCwgLCwsXSBvciBbW3ZhbCwgbGFiZWxdLCBbdmFsLCBsYWJlbF0sIC4uLl0gb3IgbWl4ZWQKICAgICAgICAgICAgZm9yIChpPTA7IGk8dXNlclRpY2tzLmxlbmd0aDsgaSsrKXsKICAgICAgICAgICAgICAgIHZhciB1dCA9IHVzZXJUaWNrc1tpXTsKICAgICAgICAgICAgICAgIHZhciB0ID0gbmV3IHRoaXMudGlja1JlbmRlcmVyKHRoaXMudGlja09wdGlvbnMpOwogICAgICAgICAgICAgICAgaWYgKCQuaXNBcnJheSh1dCkpIHsKICAgICAgICAgICAgICAgICAgICB0LnZhbHVlID0gdXRbMF07CiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuYnJlYWtQb2ludHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHV0WzBdID09IHRoaXMuYnJlYWtQb2ludHNbMF0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQubGFiZWwgPSB0aGlzLmJyZWFrVGlja0xhYmVsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5fYnJlYWtUaWNrID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuc2hvd0dyaWRsaW5lID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnNob3dNYXJrID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodXRbMF0gPiB0aGlzLmJyZWFrUG9pbnRzWzBdICYmIHV0WzBdIDw9IHRoaXMuYnJlYWtQb2ludHNbMV0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuc2hvdyA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5zaG93R3JpZGxpbmUgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQubGFiZWwgPSB1dFsxXTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQubGFiZWwgPSB1dFsxXTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgdC5sYWJlbCA9IHV0WzFdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB0LnNldFRpY2sodXRbMF0sIHRoaXMubmFtZSk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGlja3MucHVzaCh0KTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBlbHNlIGlmICgkLmlzUGxhaW5PYmplY3QodXQpKSB7CiAgICAgICAgICAgICAgICAgICAgJC5leHRlbmQodHJ1ZSwgdCwgdXQpOwogICAgICAgICAgICAgICAgICAgIHQuYXhpcyA9IHRoaXMubmFtZTsKICAgICAgICAgICAgICAgICAgICB0aGlzLl90aWNrcy5wdXNoKHQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0LnZhbHVlID0gdXQ7CiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuYnJlYWtQb2ludHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHV0ID09IHRoaXMuYnJlYWtQb2ludHNbMF0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQubGFiZWwgPSB0aGlzLmJyZWFrVGlja0xhYmVsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5fYnJlYWtUaWNrID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuc2hvd0dyaWRsaW5lID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnNob3dNYXJrID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodXQgPiB0aGlzLmJyZWFrUG9pbnRzWzBdICYmIHV0IDw9IHRoaXMuYnJlYWtQb2ludHNbMV0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuc2hvdyA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5zaG93R3JpZGxpbmUgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB0LnNldFRpY2sodXQsIHRoaXMubmFtZSk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGlja3MucHVzaCh0KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLm51bWJlclRpY2tzID0gdXNlclRpY2tzLmxlbmd0aDsKICAgICAgICAgICAgdGhpcy5taW4gPSB0aGlzLl90aWNrc1swXS52YWx1ZTsKICAgICAgICAgICAgdGhpcy5tYXggPSB0aGlzLl90aWNrc1t0aGlzLm51bWJlclRpY2tzLTFdLnZhbHVlOwogICAgICAgICAgICB0aGlzLnRpY2tJbnRlcnZhbCA9ICh0aGlzLm1heCAtIHRoaXMubWluKSAvICh0aGlzLm51bWJlclRpY2tzIC0gMSk7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC8vIHdlIGRvbid0IGhhdmUgYW55IHRpY2tzIHlldCwgbGV0J3MgbWFrZSBzb21lIQogICAgICAgIGVsc2UgewogICAgICAgICAgICBpZiAobmFtZSA9PSAneGF4aXMnIHx8IG5hbWUgPT0gJ3gyYXhpcycpIHsKICAgICAgICAgICAgICAgIGRpbSA9IHRoaXMuX3Bsb3REaW1lbnNpb25zLndpZHRoOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgZGltID0gdGhpcy5fcGxvdERpbWVuc2lvbnMuaGVpZ2h0OwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgX251bWJlclRpY2tzID0gdGhpcy5udW1iZXJUaWNrczsKCiAgICAgICAgICAgIC8vIGlmIGFsaWduaW5nIHRoaXMgYXhpcywgdXNlIG51bWJlciBvZiB0aWNrcyBmcm9tIHByZXZpb3VzIGF4aXMuCiAgICAgICAgICAgIC8vIERvIEkgbmVlZCB0byByZXNldCBzb21laG93IGlmIGFsaWduVGlja3MgaXMgY2hhbmdlZCBhbmQgdGhlbiBncmFwaCBpcyByZXBsb3R0ZWQ/PwogICAgICAgICAgICBpZiAodGhpcy5hbGlnblRpY2tzKSB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5uYW1lID09PSAneDJheGlzJyAmJiBwbG90LmF4ZXMueGF4aXMuc2hvdykgewogICAgICAgICAgICAgICAgICAgIF9udW1iZXJUaWNrcyA9IHBsb3QuYXhlcy54YXhpcy5udW1iZXJUaWNrczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMubmFtZS5jaGFyQXQoMCkgPT09ICd5JyAmJiB0aGlzLm5hbWUgIT09ICd5YXhpcycgJiYgdGhpcy5uYW1lICE9PSAneU1pZEF4aXMnICYmIHBsb3QuYXhlcy55YXhpcy5zaG93KSB7CiAgICAgICAgICAgICAgICAgICAgX251bWJlclRpY2tzID0gcGxvdC5heGVzLnlheGlzLm51bWJlclRpY2tzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgCiAgICAgICAgICAgIG1pbiA9ICgodGhpcy5taW4gIT0gbnVsbCkgPyB0aGlzLm1pbiA6IGRiLm1pbik7CiAgICAgICAgICAgIG1heCA9ICgodGhpcy5tYXggIT0gbnVsbCkgPyB0aGlzLm1heCA6IGRiLm1heCk7CgogICAgICAgICAgICB2YXIgcmFuZ2UgPSBtYXggLSBtaW47CiAgICAgICAgICAgIHZhciBybWluLCBybWF4OwogICAgICAgICAgICB2YXIgdGVtcDsKCiAgICAgICAgICAgIGlmICh0aGlzLnRpY2tPcHRpb25zID09IG51bGwgfHwgIXRoaXMudGlja09wdGlvbnMuZm9ybWF0U3RyaW5nKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9vdmVycmlkZUZvcm1hdFN0cmluZyA9IHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIERvaW5nIGNvbXBsZXRlIGF1dG9zY2FsaW5nCiAgICAgICAgICAgIGlmICh0aGlzLm1pbiA9PSBudWxsICYmIHRoaXMubWF4ID09IG51bGwgJiYgdGhpcy50aWNrSW50ZXJ2YWwgPT0gbnVsbCAmJiAhdGhpcy5hdXRvc2NhbGUpIHsKICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHVzZXIgbXVzdCBoYXZlIHRpY2sgYXQgMCBvciAxMDAgYW5kIGVuc3VyZSB0aGV5IGFyZSBpbiByYW5nZS4KICAgICAgICAgICAgICAgIC8vIFRoZSBhdXRvc2NhbGluZyBhbGdvcml0aG0gd2lsbCBhbHdheXMgcGxhY2UgdGlja3MgYXQgMCBhbmQgMTAwIGlmIHRoZXkgYXJlIGluIHJhbmdlLgogICAgICAgICAgICAgICAgaWYgKHRoaXMuZm9yY2VUaWNrQXQwKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKG1pbiA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWluID0gMDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKG1heCA8IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWF4ID0gMDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKHRoaXMuZm9yY2VUaWNrQXQxMDApIHsKICAgICAgICAgICAgICAgICAgICBpZiAobWluID4gMTAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1pbiA9IDEwMDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKG1heCA8IDEwMCkgewogICAgICAgICAgICAgICAgICAgICAgICBtYXggPSAxMDA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIHZhciB0aHJlc2hvbGQgPSAzMDsKICAgICAgICAgICAgICAgIC8vIHZhciB0ZGltID0gTWF0aC5tYXgoZGltLCB0aHJlc2hvbGQrMSk7CiAgICAgICAgICAgICAgICAvLyB0aGlzLl9zY2FsZWZhY3QgPSAgKHRkaW0tdGhyZXNob2xkKS8zMDAuMDsKICAgICAgICAgICAgICAgIHZhciByZXQgPSAkLmpxcGxvdC5MaW5lYXJUaWNrR2VuZXJhdG9yKG1pbiwgbWF4LCB0aGlzLl9zY2FsZWZhY3QsIF9udW1iZXJUaWNrcyk7IAogICAgICAgICAgICAgICAgLy8gY2FsY3VsYXRlIGEgcGFkZGVkIG1heCBhbmQgbWluLCBwb2ludHMgc2hvdWxkIGJlIGxlc3MgdGhhbiB0aGVzZQogICAgICAgICAgICAgICAgLy8gc28gdGhhdCB0aGV5IGFyZW4ndCB0b28gY2xvc2UgdG8gdGhlIGVkZ2VzIG9mIHRoZSBwbG90LgogICAgICAgICAgICAgICAgLy8gVXNlciBjYW4gYWRqdXN0IGhvdyBtdWNoIHBhZGRpbmcgaXMgYWxsb3dlZCB3aXRoIHBhZCwgcGFkTWluIGFuZCBQYWRNYXggb3B0aW9ucy4gCiAgICAgICAgICAgICAgICB2YXIgdHVtaW4gPSBtaW4gKyByYW5nZSoodGhpcy5wYWRNaW4gLSAxKTsKICAgICAgICAgICAgICAgIHZhciB0dW1heCA9IG1heCAtIHJhbmdlKih0aGlzLnBhZE1heCAtIDEpOwoKICAgICAgICAgICAgICAgIC8vIGlmIHRoZXkncmUgZXF1YWwsIHdlIHNob3VsZG4ndCBoYXZlIHRvIGRvIGFueXRoaW5nLCByaWdodD8KICAgICAgICAgICAgICAgIC8vIGlmIChtaW4gPD10dW1pbiB8fCBtYXggPj0gdHVtYXgpIHsKICAgICAgICAgICAgICAgIGlmIChtaW4gPHR1bWluIHx8IG1heCA+IHR1bWF4KSB7CiAgICAgICAgICAgICAgICAgICAgdHVtaW4gPSBtaW4gLSByYW5nZSoodGhpcy5wYWRNaW4gLSAxKTsKICAgICAgICAgICAgICAgICAgICB0dW1heCA9IG1heCArIHJhbmdlKih0aGlzLnBhZE1heCAtIDEpOwogICAgICAgICAgICAgICAgICAgIHJldCA9ICQuanFwbG90LkxpbmVhclRpY2tHZW5lcmF0b3IodHVtaW4sIHR1bWF4LCB0aGlzLl9zY2FsZWZhY3QsIF9udW1iZXJUaWNrcyk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdGhpcy5taW4gPSByZXRbMF07CiAgICAgICAgICAgICAgICB0aGlzLm1heCA9IHJldFsxXTsKICAgICAgICAgICAgICAgIC8vIGlmIG51bWJlclRpY2tzIHNwZWNpZmllZCwgaXQgc2hvdWxkIHJldHVybiB0aGUgc2FtZS4KICAgICAgICAgICAgICAgIHRoaXMubnVtYmVyVGlja3MgPSByZXRbMl07CiAgICAgICAgICAgICAgICB0aGlzLl9hdXRvRm9ybWF0U3RyaW5nID0gcmV0WzNdOwogICAgICAgICAgICAgICAgdGhpcy50aWNrSW50ZXJ2YWwgPSByZXRbNF07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIFVzZXIgaGFzIHNwZWNpZmllZCBzb21lIGF4aXMgc2NhbGUgcmVsYXRlZCBvcHRpb24sIGNhbiB1c2UgYXV0byBhbGdvcml0aG0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIC8vIGlmIG1pbiBhbmQgbWF4IGFyZSBzYW1lLCBzcGFjZSB0aGVtIG91dCBhIGJpdAogICAgICAgICAgICAgICAgaWYgKG1pbiA9PSBtYXgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgYWRqID0gMC4wNTsKICAgICAgICAgICAgICAgICAgICBpZiAobWluID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICBhZGogPSBNYXRoLm1heChNYXRoLmxvZyhtaW4pL01hdGguTE4xMCwgMC4wNSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIG1pbiAtPSBhZGo7CiAgICAgICAgICAgICAgICAgICAgbWF4ICs9IGFkajsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgLy8gYXV0b3NjYWxlLiAgQ2FuJ3QgYXV0b3NjYWxlIGlmIG1pbiBvciBtYXggaXMgc3VwcGxpZWQuCiAgICAgICAgICAgICAgICAvLyBXaWxsIHVzZSBudW1iZXJUaWNrcyBhbmQgdGlja0ludGVydmFsIGlmIHN1cHBsaWVkLiAgVGlja3MKICAgICAgICAgICAgICAgIC8vIGFjcm9zcyBtdWx0aXBsZSBheGVzIG1heSBub3QgbGluZSB1cCBkZXBlbmRpbmcgb24gaG93CiAgICAgICAgICAgICAgICAvLyBiYXJzIGFyZSB0byBiZSBwbG90dGVkLgogICAgICAgICAgICAgICAgaWYgKHRoaXMuYXV0b3NjYWxlICYmIHRoaXMubWluID09IG51bGwgJiYgdGhpcy5tYXggPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIHZhciBycmFuZ2UsIHRpLCBtYXJnaW47CiAgICAgICAgICAgICAgICAgICAgdmFyIGZvcmNlTWluWmVybyA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgIHZhciBmb3JjZVplcm9MaW5lID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgdmFyIGludGVydmFscyA9IHttaW46bnVsbCwgbWF4Om51bGwsIGF2ZXJhZ2U6bnVsbCwgc3RkZGV2Om51bGx9OwogICAgICAgICAgICAgICAgICAgIC8vIGlmIGFueSBzZXJpZXMgYXJlIGJhcnMsIG9yIGlmIGFueSBhcmUgZmlsbCB0byB6ZXJvLCBhbmQgaWYgdGhpcwogICAgICAgICAgICAgICAgICAgIC8vIGlzIHRoZSBheGlzIHRvIGZpbGwgdG93YXJkLCBjaGVjayB0byBzZWUgaWYgd2UgY2FuIHN0YXJ0IGF4aXMgYXQgemVyby4KICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpPTA7IGk8dGhpcy5fc2VyaWVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzID0gdGhpcy5fc2VyaWVzW2ldOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmFuYW1lID0gKHMuZmlsbEF4aXMgPT0gJ3gnKSA/IHMuX3hheGlzLm5hbWUgOiBzLl95YXhpcy5uYW1lOwogICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayB0byBzZWUgaWYgdGhpcyBpcyB0aGUgZmlsbCBheGlzCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm5hbWUgPT0gZmFuYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdmFscyA9IHMuX3Bsb3RWYWx1ZXNbcy5maWxsQXhpc107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdm1pbiA9IHZhbHNbMF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdm1heCA9IHZhbHNbMF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBqPTE7IGo8dmFscy5sZW5ndGg7IGorKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWxzW2pdIDwgdm1pbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2bWluID0gdmFsc1tqXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodmFsc1tqXSA+IHZtYXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm1heCA9IHZhbHNbal07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRwID0gKHZtYXggLSB2bWluKSAvIHZtYXg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpcyB0aGlzIHNyaWVzIGEgYmFyPwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHMucmVuZGVyZXIuY29uc3RydWN0b3IgPT0gJC5qcXBsb3QuQmFyUmVuZGVyZXIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBubyBuZWdhdGl2ZSB2YWx1ZXMgYW5kIGNvdWxkIGFsc28gY2hlY2sgcmFuZ2UuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZtaW4gPj0gMCAmJiAocy5maWxsVG9aZXJvIHx8IGRwID4gMC4xKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JjZU1pblplcm8gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yY2VNaW5aZXJvID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzLmZpbGwgJiYgcy5maWxsVG9aZXJvICYmIHZtaW4gPCAwICYmIHZtYXggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JjZVplcm9MaW5lID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmNlWmVyb0xpbmUgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgbm90IGEgYmFyIGFuZCBmaWxsaW5nLCB1c2UgYXBwcm9wcmlhdGUgbWV0aG9kLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocy5maWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZtaW4gPj0gMCAmJiAocy5maWxsVG9aZXJvIHx8IGRwID4gMC4xKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JjZU1pblplcm8gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh2bWluIDwgMCAmJiB2bWF4ID4gMCAmJiBzLmZpbGxUb1plcm8pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yY2VNaW5aZXJvID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmNlWmVyb0xpbmUgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yY2VNaW5aZXJvID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmNlWmVyb0xpbmUgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIG5vdCBhIGJhciBhbmQgbm90IGZpbGxpbmcsIG9ubHkgY2hhbmdlIGV4aXN0aW5nIHN0YXRlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBpdCBkb2Vzbid0IG1ha2Ugc2Vuc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHZtaW4gPCAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yY2VNaW5aZXJvID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgaWYgd2UgbmVlZCBtYWtlIGF4aXMgbWluIGF0IDAuCiAgICAgICAgICAgICAgICAgICAgaWYgKGZvcmNlTWluWmVybykgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBjb21wdXRlIG51bWJlciBvZiB0aWNrcwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm51bWJlclRpY2tzID0gMiArIE1hdGguY2VpbCgoZGltLSh0aGlzLnRpY2tTcGFjaW5nLTEpKS90aGlzLnRpY2tTcGFjaW5nKTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5taW4gPSAwOwogICAgICAgICAgICAgICAgICAgICAgICB1c2VyTWluID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hhdCBvcmRlciBpcyB0aGlzIHJhbmdlPwogICAgICAgICAgICAgICAgICAgICAgICAvLyB3aGF0IHRpY2sgaW50ZXJ2YWwgZG9lcyB0aGF0IGdpdmUgdXM/CiAgICAgICAgICAgICAgICAgICAgICAgIHRpID0gbWF4Lyh0aGlzLm51bWJlclRpY2tzLTEpOwogICAgICAgICAgICAgICAgICAgICAgICB0ZW1wID0gTWF0aC5wb3coMTAsIE1hdGguYWJzKE1hdGguZmxvb3IoTWF0aC5sb2codGkpL01hdGguTE4xMCkpKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRpL3RlbXAgPT0gcGFyc2VJbnQodGkvdGVtcCwgMTApKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aSArPSB0ZW1wOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGlja0ludGVydmFsID0gTWF0aC5jZWlsKHRpL3RlbXApICogdGVtcDsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXggPSB0aGlzLnRpY2tJbnRlcnZhbCAqICh0aGlzLm51bWJlclRpY2tzIC0gMSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlmIHdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoZXJlIGlzIGEgdGljayBhdCAwLgogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGZvcmNlWmVyb0xpbmUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29tcHV0ZSBudW1iZXIgb2YgdGlja3MKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5udW1iZXJUaWNrcyA9IDIgKyBNYXRoLmNlaWwoKGRpbS0odGhpcy50aWNrU3BhY2luZy0xKSkvdGhpcy50aWNrU3BhY2luZyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBudG1pbiA9IE1hdGguY2VpbChNYXRoLmFicyhtaW4pL3JhbmdlKih0aGlzLm51bWJlclRpY2tzLTEpKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG50bWF4ID0gdGhpcy5udW1iZXJUaWNrcyAtIDEgIC0gbnRtaW47CiAgICAgICAgICAgICAgICAgICAgICAgIHRpID0gTWF0aC5tYXgoTWF0aC5hYnMobWluL250bWluKSwgTWF0aC5hYnMobWF4L250bWF4KSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAgPSBNYXRoLnBvdygxMCwgTWF0aC5hYnMoTWF0aC5mbG9vcihNYXRoLmxvZyh0aSkvTWF0aC5MTjEwKSkpOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRpY2tJbnRlcnZhbCA9IE1hdGguY2VpbCh0aS90ZW1wKSAqIHRlbXA7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWF4ID0gdGhpcy50aWNrSW50ZXJ2YWwgKiBudG1heDsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5taW4gPSAtdGhpcy50aWNrSW50ZXJ2YWwgKiBudG1pbjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgLy8gaWYgbm90aGluZyBlbHNlLCBkbyBhdXRvc2NhbGluZyB3aGljaCB3aWxsIHRyeSB0byBsaW5lIHVwIHRpY2tzIGFjcm9zcyBheGVzLgogICAgICAgICAgICAgICAgICAgIGVsc2UgeyAgCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm51bWJlclRpY2tzID09IG51bGwpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudGlja0ludGVydmFsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5udW1iZXJUaWNrcyA9IDMgKyBNYXRoLmNlaWwocmFuZ2UgLyB0aGlzLnRpY2tJbnRlcnZhbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm51bWJlclRpY2tzID0gMiArIE1hdGguY2VpbCgoZGltLSh0aGlzLnRpY2tTcGFjaW5nLTEpKS90aGlzLnRpY2tTcGFjaW5nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnRpY2tJbnRlcnZhbCA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBnZXQgYSB0aWNrIGludGVydmFsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aSA9IHJhbmdlLyh0aGlzLm51bWJlclRpY2tzIC0gMSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRpIDwgMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAgPSBNYXRoLnBvdygxMCwgTWF0aC5hYnMoTWF0aC5mbG9vcihNYXRoLmxvZyh0aSkvTWF0aC5MTjEwKSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcCA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRpY2tJbnRlcnZhbCA9IE1hdGguY2VpbCh0aSp0ZW1wKnRoaXMucGFkKS90ZW1wOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcCA9IDEgLyB0aGlzLnRpY2tJbnRlcnZhbDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHJ5IHRvIGNvbXB1dGUgYSBuaWNlciwgbW9yZSBldmVuIHRpY2sgaW50ZXJ2YWwKICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGVtcCA9IE1hdGgucG93KDEwLCBNYXRoLmZsb29yKE1hdGgubG9nKHRpKS9NYXRoLkxOMTApKTsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy50aWNrSW50ZXJ2YWwgPSBNYXRoLmNlaWwodGkvdGVtcCkgKiB0ZW1wOwogICAgICAgICAgICAgICAgICAgICAgICBycmFuZ2UgPSB0aGlzLnRpY2tJbnRlcnZhbCAqICh0aGlzLm51bWJlclRpY2tzIC0gMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbiA9IChycmFuZ2UgLSByYW5nZSkvMjsKICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubWluID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWluID0gTWF0aC5mbG9vcih0ZW1wKihtaW4tbWFyZ2luKSkvdGVtcDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5tYXggPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXggPSB0aGlzLm1pbiArIHJyYW5nZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gQ29tcHV0ZSBhIHNvbWV3aGF0IGRlY2VudCBmb3JtYXQgc3RyaW5nIGlmIGl0IGlzIG5lZWRlZC4KICAgICAgICAgICAgICAgICAgICAvLyBnZXQgcHJlY2lzaW9uIG9mIGludGVydmFsIGFuZCBkZXRlcm1pbmUgYSBmb3JtYXQgc3RyaW5nLgogICAgICAgICAgICAgICAgICAgIHZhciBzZiA9ICQuanFwbG90LmdldFNpZ25pZmljYW50RmlndXJlcyh0aGlzLnRpY2tJbnRlcnZhbCk7CgogICAgICAgICAgICAgICAgICAgIHZhciBmc3RyOwoKICAgICAgICAgICAgICAgICAgICAvLyBpZiB3ZSBoYXZlIG9ubHkgYSB3aG9sZSBudW1iZXIsIHVzZSBpbnRlZ2VyIGZvcm1hdHRpbmcKICAgICAgICAgICAgICAgICAgICBpZiAoc2YuZGlnaXRzTGVmdCA+PSBzZi5zaWduaWZpY2FudERpZ2l0cykgewogICAgICAgICAgICAgICAgICAgICAgICBmc3RyID0gJyVkJzsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGVtcCA9IE1hdGgubWF4KDAsIDUgLSBzZi5kaWdpdHNMZWZ0KTsKICAgICAgICAgICAgICAgICAgICAgICAgdGVtcCA9IE1hdGgubWluKHRlbXAsIHNmLmRpZ2l0c1JpZ2h0KTsKICAgICAgICAgICAgICAgICAgICAgICAgZnN0ciA9ICclLicrIHRlbXAgKyAnZic7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB0aGlzLl9hdXRvRm9ybWF0U3RyaW5nID0gZnN0cjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgLy8gVXNlIHRoZSBkZWZhdWx0IGFsZ29yaXRobSB3aGljaCBwYWRzIGVhY2ggYXhpcyB0byBtYWtlIHRoZSBjaGFydAogICAgICAgICAgICAgICAgLy8gY2VudGVyZWQgbmljZWx5IG9uIHRoZSBncmlkLgogICAgICAgICAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAgICAgICAgIHJtaW4gPSAodGhpcy5taW4gIT0gbnVsbCkgPyB0aGlzLm1pbiA6IG1pbiAtIHJhbmdlKih0aGlzLnBhZE1pbiAtIDEpOwogICAgICAgICAgICAgICAgICAgIHJtYXggPSAodGhpcy5tYXggIT0gbnVsbCkgPyB0aGlzLm1heCA6IG1heCArIHJhbmdlKih0aGlzLnBhZE1heCAtIDEpOwogICAgICAgICAgICAgICAgICAgIHJhbmdlID0gcm1heCAtIHJtaW47CiAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubnVtYmVyVGlja3MgPT0gbnVsbCl7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHRpY2tJbnRlcnZhbCBpcyBzcGVjaWZpZWQgYnkgdXNlciwgd2Ugd2lsbCBpZ25vcmUgY29tcHV0ZWQgbWF4aW11bS4KICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWF4IHdpbGwgYmUgZXF1YWwgb3IgZ3JlYXRlciB0byBmaXQgZXZlbiAjIG9mIHRpY2tzLgogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy50aWNrSW50ZXJ2YWwgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5udW1iZXJUaWNrcyA9IE1hdGguY2VpbCgocm1heCAtIHJtaW4pL3RoaXMudGlja0ludGVydmFsKSsxOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGRpbSA+IDEwMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5udW1iZXJUaWNrcyA9IHBhcnNlSW50KDMrKGRpbS0xMDApLzc1LCAxMCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm51bWJlclRpY2tzID0gMjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnRpY2tJbnRlcnZhbCA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGlja0ludGVydmFsID0gcmFuZ2UgLyAodGhpcy5udW1iZXJUaWNrcy0xKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubWF4ID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcm1heCA9IHJtaW4gKyB0aGlzLnRpY2tJbnRlcnZhbCoodGhpcy5udW1iZXJUaWNrcyAtIDEpOwogICAgICAgICAgICAgICAgICAgIH0gICAgICAgIAogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm1pbiA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJtaW4gPSBybWF4IC0gdGhpcy50aWNrSW50ZXJ2YWwqKHRoaXMubnVtYmVyVGlja3MgLSAxKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIGdldCBwcmVjaXNpb24gb2YgaW50ZXJ2YWwgYW5kIGRldGVybWluZSBhIGZvcm1hdCBzdHJpbmcuCiAgICAgICAgICAgICAgICAgICAgdmFyIHNmID0gJC5qcXBsb3QuZ2V0U2lnbmlmaWNhbnRGaWd1cmVzKHRoaXMudGlja0ludGVydmFsKTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIGZzdHI7CgogICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlIGhhdmUgb25seSBhIHdob2xlIG51bWJlciwgdXNlIGludGVnZXIgZm9ybWF0dGluZwogICAgICAgICAgICAgICAgICAgIGlmIChzZi5kaWdpdHNMZWZ0ID49IHNmLnNpZ25pZmljYW50RGlnaXRzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZzdHIgPSAnJWQnOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ZW1wID0gTWF0aC5tYXgoMCwgNSAtIHNmLmRpZ2l0c0xlZnQpOwogICAgICAgICAgICAgICAgICAgICAgICB0ZW1wID0gTWF0aC5taW4odGVtcCwgc2YuZGlnaXRzUmlnaHQpOwogICAgICAgICAgICAgICAgICAgICAgICBmc3RyID0gJyUuJysgdGVtcCArICdmJzsKICAgICAgICAgICAgICAgICAgICB9CgoKICAgICAgICAgICAgICAgICAgICB0aGlzLl9hdXRvRm9ybWF0U3RyaW5nID0gZnN0cjsKCiAgICAgICAgICAgICAgICAgICAgdGhpcy5taW4gPSBybWluOwogICAgICAgICAgICAgICAgICAgIHRoaXMubWF4ID0gcm1heDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgaWYgKHRoaXMucmVuZGVyZXIuY29uc3RydWN0b3IgPT0gJC5qcXBsb3QuTGluZWFyQXhpc1JlbmRlcmVyICYmIHRoaXMuX2F1dG9Gb3JtYXRTdHJpbmcgPT0gJycpIHsKICAgICAgICAgICAgICAgICAgICAvLyBmaXggZm9yIG1pc2xlYWRpbmcgdGljayBkaXNwbGF5IHdpdGggc21hbGwgcmFuZ2UgYW5kIGxvdyBwcmVjaXNpb24uCiAgICAgICAgICAgICAgICAgICAgcmFuZ2UgPSB0aGlzLm1heCAtIHRoaXMubWluOwogICAgICAgICAgICAgICAgICAgIC8vIGZpZ3VyZSBvdXQgcHJlY2lzaW9uCiAgICAgICAgICAgICAgICAgICAgdmFyIHRlbXB0aWNrID0gbmV3IHRoaXMudGlja1JlbmRlcmVyKHRoaXMudGlja09wdGlvbnMpOwogICAgICAgICAgICAgICAgICAgIC8vIHVzZSB0aGUgdGljayBmb3JtYXRTdHJpbmcgb3IsIHRoZSBkZWZhdWx0LgogICAgICAgICAgICAgICAgICAgIHZhciBmcyA9IHRlbXB0aWNrLmZvcm1hdFN0cmluZyB8fCAkLmpxcGxvdC5jb25maWcuZGVmYXVsdFRpY2tGb3JtYXRTdHJpbmc7IAogICAgICAgICAgICAgICAgICAgIHZhciBmcyA9IGZzLm1hdGNoKCQuanFwbG90LnNwcmludGYucmVnZXgpWzBdOwogICAgICAgICAgICAgICAgICAgIHZhciBwcmVjaXNpb24gPSAwOwogICAgICAgICAgICAgICAgICAgIGlmIChmcykgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZnMuc2VhcmNoKC9bZkZlRWdHcFBdLykgPiAtMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG0gPSBmcy5tYXRjaCgvXCVcLihcZHswLH0pP1tlRWZGZ0dwUF0vKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlY2lzaW9uID0gcGFyc2VJbnQobVsxXSwgMTApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlY2lzaW9uID0gNjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChmcy5zZWFyY2goL1tkaV0vKSA+IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVjaXNpb24gPSAwOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZhY3Qgd2lsbCBiZSA8PSAxOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmFjdCA9IE1hdGgucG93KDEwLCAtcHJlY2lzaW9uKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudGlja0ludGVydmFsIDwgZmFjdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmVlZCB0byBjb3JyZWN0IHVuZGVycmFuZ2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1c2VyTlQgPT0gbnVsbCAmJiB1c2VyVEkgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGlja0ludGVydmFsID0gZmFjdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodXNlck1heCA9PSBudWxsICYmIHVzZXJNaW4gPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLm1pbiA9IE1hdGguZmxvb3IoKHRoaXMuX2RhdGFCb3VuZHMubWluIC0gdGhpcy50aWNrSW50ZXJ2YWwpL2ZhY3QpICogZmFjdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5taW4gPSBNYXRoLmZsb29yKHRoaXMuX2RhdGFCb3VuZHMubWluL2ZhY3QpICogZmFjdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubWluID09IHRoaXMuX2RhdGFCb3VuZHMubWluKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1pbiA9IHRoaXMuX2RhdGFCb3VuZHMubWluIC0gdGhpcy50aWNrSW50ZXJ2YWw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5tYXggPSBNYXRoLmNlaWwoKHRoaXMuX2RhdGFCb3VuZHMubWF4ICsgdGhpcy50aWNrSW50ZXJ2YWwpL2ZhY3QpICogZmFjdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXggPSBNYXRoLmNlaWwodGhpcy5fZGF0YUJvdW5kcy5tYXgvZmFjdCkgKiBmYWN0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5tYXggPT0gdGhpcy5fZGF0YUJvdW5kcy5tYXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWF4ID0gdGhpcy5fZGF0YUJvdW5kcy5tYXggKyB0aGlzLnRpY2tJbnRlcnZhbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9ICh0aGlzLm1heCAtIHRoaXMubWluKS90aGlzLnRpY2tJbnRlcnZhbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiA9IG4udG9GaXhlZCgxMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSBNYXRoLmNlaWwobik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubnVtYmVyVGlja3MgPSBuICsgMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodXNlck1heCA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFkZCBvbmUgdGljayBmb3IgdG9wIG9mIHJhbmdlLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9ICh0aGlzLl9kYXRhQm91bmRzLm1heCAtIHRoaXMubWluKSAvIHRoaXMudGlja0ludGVydmFsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuID0gbi50b0ZpeGVkKDExKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5udW1iZXJUaWNrcyA9IE1hdGguY2VpbChuKSArIDI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWF4ID0gdGhpcy5taW4gKyB0aGlzLnRpY2tJbnRlcnZhbCAqICh0aGlzLm51bWJlclRpY2tzLTEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh1c2VyTWluID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWRkIG9uZSB0aWNrIGZvciBib3R0b20gb2YgcmFuZ2UuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gKHRoaXMubWF4IC0gdGhpcy5fZGF0YUJvdW5kcy5taW4pIC8gdGhpcy50aWNrSW50ZXJ2YWw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSBuLnRvRml4ZWQoMTEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm51bWJlclRpY2tzID0gTWF0aC5jZWlsKG4pICsgMjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5taW4gPSB0aGlzLm1heCAtIHRoaXMudGlja0ludGVydmFsICogKHRoaXMubnVtYmVyVGlja3MtMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjYWxjdWxhdGUgYSBudW1iZXIgb2YgdGlja3Mgc28gbWF4IGlzIHdpdGhpbiBheGlzIHNjYWxlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubnVtYmVyVGlja3MgPSBNYXRoLmNlaWwoKHVzZXJNYXggLSB1c2VyTWluKS90aGlzLnRpY2tJbnRlcnZhbCkgKyAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB1c2VyJ3MgbWluIGFuZCBtYXggZG9uJ3QgZml0IGV2ZW5seSBpbiB0aWNrcywgYWRqdXN0LgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIHRha2VzIGNhcmUgb2YgY2FzZXMgc3VjaCBhcyB1c2VyIG1pbiBzZXQgdG8gMCwgbWF4IHNldCB0byAzLjUgYnV0IHRpY2sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9ybWF0IHN0cmluZyBzZXQgdG8gJWQgKGludGVnZXIgdGlja3MpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWluID0gIE1hdGguZmxvb3IodXNlck1pbipNYXRoLnBvdygxMCwgcHJlY2lzaW9uKSkvTWF0aC5wb3coMTAsIHByZWNpc2lvbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWF4ID0gIE1hdGguY2VpbCh1c2VyTWF4Kk1hdGgucG93KDEwLCBwcmVjaXNpb24pKS9NYXRoLnBvdygxMCwgcHJlY2lzaW9uKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5tYXggPSB0aGlzLm1pbiArIHRoaXMudGlja0ludGVydmFsKih0aGlzLm51bWJlclRpY2tzLTEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm51bWJlclRpY2tzID0gTWF0aC5jZWlsKCh0aGlzLm1heCAtIHRoaXMubWluKS90aGlzLnRpY2tJbnRlcnZhbCkgKyAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIAogICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICBpZiAodGhpcy5fb3ZlcnJpZGVGb3JtYXRTdHJpbmcgJiYgdGhpcy5fYXV0b0Zvcm1hdFN0cmluZyAhPSAnJykgewogICAgICAgICAgICAgICAgdGhpcy50aWNrT3B0aW9ucyA9IHRoaXMudGlja09wdGlvbnMgfHwge307CiAgICAgICAgICAgICAgICB0aGlzLnRpY2tPcHRpb25zLmZvcm1hdFN0cmluZyA9IHRoaXMuX2F1dG9Gb3JtYXRTdHJpbmc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciB0LCB0bzsKICAgICAgICAgICAgZm9yICh2YXIgaT0wOyBpPHRoaXMubnVtYmVyVGlja3M7IGkrKyl7CiAgICAgICAgICAgICAgICB0dCA9IHRoaXMubWluICsgaSAqIHRoaXMudGlja0ludGVydmFsOwogICAgICAgICAgICAgICAgdCA9IG5ldyB0aGlzLnRpY2tSZW5kZXJlcih0aGlzLnRpY2tPcHRpb25zKTsKICAgICAgICAgICAgICAgIC8vIHZhciB0ID0gbmV3ICQuanFwbG90LkF4aXNUaWNrUmVuZGVyZXIodGhpcy50aWNrT3B0aW9ucyk7CgogICAgICAgICAgICAgICAgdC5zZXRUaWNrKHR0LCB0aGlzLm5hbWUpOwogICAgICAgICAgICAgICAgdGhpcy5fdGlja3MucHVzaCh0KTsKCiAgICAgICAgICAgICAgICBpZiAoaSA8IHRoaXMubnVtYmVyVGlja3MgLSAxKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaj0wOyBqPHRoaXMubWlub3JUaWNrczsgaisrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHR0ICs9IHRoaXMudGlja0ludGVydmFsLyh0aGlzLm1pbm9yVGlja3MrMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRvID0gJC5leHRlbmQodHJ1ZSwge30sIHRoaXMudGlja09wdGlvbnMsIHtuYW1lOnRoaXMubmFtZSwgdmFsdWU6dHQsIGxhYmVsOicnLCBpc01pbm9yVGljazp0cnVlfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHQgPSBuZXcgdGhpcy50aWNrUmVuZGVyZXIodG8pOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl90aWNrcy5wdXNoKHQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHQgPSBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAodGhpcy50aWNrSW5zZXQpIHsKICAgICAgICAgICAgdGhpcy5taW4gPSB0aGlzLm1pbiAtIHRoaXMudGlja0luc2V0ICogdGhpcy50aWNrSW50ZXJ2YWw7CiAgICAgICAgICAgIHRoaXMubWF4ID0gdGhpcy5tYXggKyB0aGlzLnRpY2tJbnNldCAqIHRoaXMudGlja0ludGVydmFsOwogICAgICAgIH0KCiAgICAgICAgdGlja3MgPSBudWxsOwogICAgfTsKICAgIAogICAgLy8gVXNlZCB0byByZXNldCBqdXN0IHRoZSB2YWx1ZXMgb2YgdGhlIHRpY2tzIGFuZCB0aGVuIHJlcGFjaywgd2hpY2ggd2lsbAogICAgLy8gcmVjYWxjdWxhdGUgdGhlIHBvc2l0aW9uaW5nIGZ1bmN0aW9ucy4gIEl0IGlzIGFzc3VlbWQgdGhhdCB0aGUgCiAgICAvLyBudW1iZXIgb2YgdGlja3MgaXMgdGhlIHNhbWUgYW5kIHRoZSB2YWx1ZXMgb2YgdGhlIG5ldyBhcnJheSBhcmUgYXQgdGhlCiAgICAvLyBwcm9wZXIgaW50ZXJ2YWwuCiAgICAvLyBUaGlzIG1ldGhvZCBuZWVkcyB0byBiZSBjYWxsZWQgd2l0aCB0aGUgc2NvcGUgb2YgYW4gYXhpcyBvYmplY3QsIGxpa2U6CiAgICAvLwogICAgLy8gPiBwbG90LmF4ZXMueWF4aXMucmVuZGVyZXIucmVzZXRUaWNrVmFsdWVzLmNhbGwocGxvdC5heGVzLnlheGlzLCB5YXJyKTsKICAgIC8vCiAgICAkLmpxcGxvdC5MaW5lYXJBeGlzUmVuZGVyZXIucHJvdG90eXBlLnJlc2V0VGlja1ZhbHVlcyA9IGZ1bmN0aW9uKG9wdHMpIHsKICAgICAgICBpZiAoJC5pc0FycmF5KG9wdHMpICYmIG9wdHMubGVuZ3RoID09IHRoaXMuX3RpY2tzLmxlbmd0aCkgewogICAgICAgICAgICB2YXIgdDsKICAgICAgICAgICAgZm9yICh2YXIgaT0wOyBpPG9wdHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIHQgPSB0aGlzLl90aWNrc1tpXTsKICAgICAgICAgICAgICAgIHQudmFsdWUgPSBvcHRzW2ldOwogICAgICAgICAgICAgICAgdC5sYWJlbCA9IHQuZm9ybWF0dGVyKHQuZm9ybWF0U3RyaW5nLCBvcHRzW2ldKTsKICAgICAgICAgICAgICAgIHQubGFiZWwgPSB0LnByZWZpeCArIHQubGFiZWw7CiAgICAgICAgICAgICAgICB0Ll9lbGVtLmh0bWwodC5sYWJlbCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdCA9IG51bGw7CiAgICAgICAgICAgIHRoaXMubWluID0gJC5qcXBsb3QuYXJyYXlNaW4ob3B0cyk7CiAgICAgICAgICAgIHRoaXMubWF4ID0gJC5qcXBsb3QuYXJyYXlNYXgob3B0cyk7CiAgICAgICAgICAgIHRoaXMucGFjaygpOwogICAgICAgIH0KICAgICAgICAvLyBOb3QgaW1wbGVtZW50ZWQgeWV0LgogICAgICAgIC8vIGVsc2UgaWYgKCQuaXNQbGFpbk9iamVjdChvcHRzKSkgewogICAgICAgIC8vIAogICAgICAgIC8vIH0KICAgIH07CiAgICAKICAgIC8vIGNhbGxlZCB3aXRoIHNjb3BlIG9mIGF4aXMKICAgICQuanFwbG90LkxpbmVhckF4aXNSZW5kZXJlci5wcm90b3R5cGUucGFjayA9IGZ1bmN0aW9uKHBvcywgb2Zmc2V0cykgewogICAgICAgIC8vIEFkZCBkZWZhdWx0cyBmb3IgcmVwYWNraW5nIGZyb20gcmVzZXRUaWNrVmFsdWVzIGZ1bmN0aW9uLgogICAgICAgIHBvcyA9IHBvcyB8fCB7fTsKICAgICAgICBvZmZzZXRzID0gb2Zmc2V0cyB8fCB0aGlzLl9vZmZzZXRzOwogICAgICAgIAogICAgICAgIHZhciB0aWNrcyA9IHRoaXMuX3RpY2tzOwogICAgICAgIHZhciBtYXggPSB0aGlzLm1heDsKICAgICAgICB2YXIgbWluID0gdGhpcy5taW47CiAgICAgICAgdmFyIG9mZm1heCA9IG9mZnNldHMubWF4OwogICAgICAgIHZhciBvZmZtaW4gPSBvZmZzZXRzLm1pbjsKICAgICAgICB2YXIgbHNob3cgPSAodGhpcy5fbGFiZWwgPT0gbnVsbCkgPyBmYWxzZSA6IHRoaXMuX2xhYmVsLnNob3c7CiAgICAgICAgCiAgICAgICAgZm9yICh2YXIgcCBpbiBwb3MpIHsKICAgICAgICAgICAgdGhpcy5fZWxlbS5jc3MocCwgcG9zW3BdKTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgdGhpcy5fb2Zmc2V0cyA9IG9mZnNldHM7CiAgICAgICAgLy8gcGl4ZWxsZW5ndGggd2lsbCBiZSArIGZvciB4IGF4ZXMgYW5kIC0gZm9yIHkgYXhlcyBiZWNhc3VlIHBpeGVscyBhbHdheXMgbWVhc3VyZWQgZnJvbSB0b3AgbGVmdC4KICAgICAgICB2YXIgcGl4ZWxsZW5ndGggPSBvZmZtYXggLSBvZmZtaW47CiAgICAgICAgdmFyIHVuaXRsZW5ndGggPSBtYXggLSBtaW47CiAgICAgICAgCiAgICAgICAgLy8gcG9pbnQgdG8gdW5pdCBhbmQgdW5pdCB0byBwb2ludCBjb252ZXJzaW9ucyByZWZlcmVuY2VzIHRvIFBsb3QgRE9NIGVsZW1lbnQgdG9wIGxlZnQgY29ybmVyLgogICAgICAgIGlmICh0aGlzLmJyZWFrUG9pbnRzKSB7CiAgICAgICAgICAgIHVuaXRsZW5ndGggPSB1bml0bGVuZ3RoIC0gdGhpcy5icmVha1BvaW50c1sxXSArIHRoaXMuYnJlYWtQb2ludHNbMF07CiAgICAgICAgICAgIAogICAgICAgICAgICB0aGlzLnAydSA9IGZ1bmN0aW9uKHApewogICAgICAgICAgICAgICAgcmV0dXJuIChwIC0gb2ZmbWluKSAqIHVuaXRsZW5ndGggLyBwaXhlbGxlbmd0aCArIG1pbjsKICAgICAgICAgICAgfTsKICAgICAgICAKICAgICAgICAgICAgdGhpcy51MnAgPSBmdW5jdGlvbih1KXsKICAgICAgICAgICAgICAgIGlmICh1ID4gdGhpcy5icmVha1BvaW50c1swXSAmJiB1IDwgdGhpcy5icmVha1BvaW50c1sxXSl7CiAgICAgICAgICAgICAgICAgICAgdSA9IHRoaXMuYnJlYWtQb2ludHNbMF07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAodSA8PSB0aGlzLmJyZWFrUG9pbnRzWzBdKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh1IC0gbWluKSAqIHBpeGVsbGVuZ3RoIC8gdW5pdGxlbmd0aCArIG9mZm1pbjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAodSAtIHRoaXMuYnJlYWtQb2ludHNbMV0gKyB0aGlzLmJyZWFrUG9pbnRzWzBdIC0gbWluKSAqIHBpeGVsbGVuZ3RoIC8gdW5pdGxlbmd0aCArIG9mZm1pbjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICBpZiAodGhpcy5uYW1lLmNoYXJBdCgwKSA9PSAneCcpewogICAgICAgICAgICAgICAgdGhpcy5zZXJpZXNfdTJwID0gZnVuY3Rpb24odSl7CiAgICAgICAgICAgICAgICAgICAgaWYgKHUgPiB0aGlzLmJyZWFrUG9pbnRzWzBdICYmIHUgPCB0aGlzLmJyZWFrUG9pbnRzWzFdKXsKICAgICAgICAgICAgICAgICAgICAgICAgdSA9IHRoaXMuYnJlYWtQb2ludHNbMF07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICh1IDw9IHRoaXMuYnJlYWtQb2ludHNbMF0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh1IC0gbWluKSAqIHBpeGVsbGVuZ3RoIC8gdW5pdGxlbmd0aDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAodSAtIHRoaXMuYnJlYWtQb2ludHNbMV0gKyB0aGlzLmJyZWFrUG9pbnRzWzBdIC0gbWluKSAqIHBpeGVsbGVuZ3RoIC8gdW5pdGxlbmd0aDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgdGhpcy5zZXJpZXNfcDJ1ID0gZnVuY3Rpb24ocCl7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHAgKiB1bml0bGVuZ3RoIC8gcGl4ZWxsZW5ndGggKyBtaW47CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgCiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgdGhpcy5zZXJpZXNfdTJwID0gZnVuY3Rpb24odSl7CiAgICAgICAgICAgICAgICAgICAgaWYgKHUgPiB0aGlzLmJyZWFrUG9pbnRzWzBdICYmIHUgPCB0aGlzLmJyZWFrUG9pbnRzWzFdKXsKICAgICAgICAgICAgICAgICAgICAgICAgdSA9IHRoaXMuYnJlYWtQb2ludHNbMF07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICh1ID49IHRoaXMuYnJlYWtQb2ludHNbMV0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh1IC0gbWF4KSAqIHBpeGVsbGVuZ3RoIC8gdW5pdGxlbmd0aDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAodSArIHRoaXMuYnJlYWtQb2ludHNbMV0gLSB0aGlzLmJyZWFrUG9pbnRzWzBdIC0gbWF4KSAqIHBpeGVsbGVuZ3RoIC8gdW5pdGxlbmd0aDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgdGhpcy5zZXJpZXNfcDJ1ID0gZnVuY3Rpb24ocCl7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHAgKiB1bml0bGVuZ3RoIC8gcGl4ZWxsZW5ndGggKyBtYXg7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICB0aGlzLnAydSA9IGZ1bmN0aW9uKHApewogICAgICAgICAgICAgICAgcmV0dXJuIChwIC0gb2ZmbWluKSAqIHVuaXRsZW5ndGggLyBwaXhlbGxlbmd0aCArIG1pbjsKICAgICAgICAgICAgfTsKICAgICAgICAKICAgICAgICAgICAgdGhpcy51MnAgPSBmdW5jdGlvbih1KXsKICAgICAgICAgICAgICAgIHJldHVybiAodSAtIG1pbikgKiBwaXhlbGxlbmd0aCAvIHVuaXRsZW5ndGggKyBvZmZtaW47CiAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgaWYgKHRoaXMubmFtZSA9PSAneGF4aXMnIHx8IHRoaXMubmFtZSA9PSAneDJheGlzJyl7CiAgICAgICAgICAgICAgICB0aGlzLnNlcmllc191MnAgPSBmdW5jdGlvbih1KXsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHUgLSBtaW4pICogcGl4ZWxsZW5ndGggLyB1bml0bGVuZ3RoOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHRoaXMuc2VyaWVzX3AydSA9IGZ1bmN0aW9uKHApewogICAgICAgICAgICAgICAgICAgIHJldHVybiBwICogdW5pdGxlbmd0aCAvIHBpeGVsbGVuZ3RoICsgbWluOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgIAogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHRoaXMuc2VyaWVzX3UycCA9IGZ1bmN0aW9uKHUpewogICAgICAgICAgICAgICAgICAgIHJldHVybiAodSAtIG1heCkgKiBwaXhlbGxlbmd0aCAvIHVuaXRsZW5ndGg7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgdGhpcy5zZXJpZXNfcDJ1ID0gZnVuY3Rpb24ocCl7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHAgKiB1bml0bGVuZ3RoIC8gcGl4ZWxsZW5ndGggKyBtYXg7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmICh0aGlzLnNob3cpIHsKICAgICAgICAgICAgaWYgKHRoaXMubmFtZSA9PSAneGF4aXMnIHx8IHRoaXMubmFtZSA9PSAneDJheGlzJykgewogICAgICAgICAgICAgICAgZm9yICh2YXIgaT0wOyBpPHRpY2tzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB0aWNrc1tpXTsKICAgICAgICAgICAgICAgICAgICBpZiAodC5zaG93ICYmIHQuc2hvd0xhYmVsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzaGltOwogICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQuY29uc3RydWN0b3IgPT0gJC5qcXBsb3QuQ2FudmFzQXhpc1RpY2tSZW5kZXJlciAmJiB0LmFuZ2xlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aWxsIG5lZWQgdG8gYWRqdXN0IGF1dG8gcG9zaXRpb25pbmcgYmFzZWQgb24gd2hpY2ggYXhpcyB0aGlzIGlzLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRlbXAgPSAodGhpcy5uYW1lID09ICd4YXhpcycpID8gMSA6IC0xOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh0LmxhYmVsUG9zaXRpb24pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdhdXRvJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcG9zaXRpb24gYXQgZW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ZW1wICogdC5hbmdsZSA8IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoaW0gPSAtdC5nZXRXaWR0aCgpICsgdC5fdGV4dFJlbmRlcmVyLmhlaWdodCAqIE1hdGguc2luKC10Ll90ZXh0UmVuZGVyZXIuYW5nbGUpIC8gMjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwb3NpdGlvbiBhdCBzdGFydAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoaW0gPSAtdC5fdGV4dFJlbmRlcmVyLmhlaWdodCAqIE1hdGguc2luKHQuX3RleHRSZW5kZXJlci5hbmdsZSkgLyAyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2VuZCc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoaW0gPSAtdC5nZXRXaWR0aCgpICsgdC5fdGV4dFJlbmRlcmVyLmhlaWdodCAqIE1hdGguc2luKC10Ll90ZXh0UmVuZGVyZXIuYW5nbGUpIC8gMjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnc3RhcnQnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGltID0gLXQuX3RleHRSZW5kZXJlci5oZWlnaHQgKiBNYXRoLnNpbih0Ll90ZXh0UmVuZGVyZXIuYW5nbGUpIC8gMjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnbWlkZGxlJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hpbSA9IC10LmdldFdpZHRoKCkvMiArIHQuX3RleHRSZW5kZXJlci5oZWlnaHQgKiBNYXRoLnNpbigtdC5fdGV4dFJlbmRlcmVyLmFuZ2xlKSAvIDI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoaW0gPSAtdC5nZXRXaWR0aCgpLzIgKyB0Ll90ZXh0UmVuZGVyZXIuaGVpZ2h0ICogTWF0aC5zaW4oLXQuX3RleHRSZW5kZXJlci5hbmdsZSkgLyAyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoaW0gPSAtdC5nZXRXaWR0aCgpLzI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZhbCA9IHRoaXMudTJwKHQudmFsdWUpICsgc2hpbSArICdweCc7CiAgICAgICAgICAgICAgICAgICAgICAgIHQuX2VsZW0uY3NzKCdsZWZ0JywgdmFsKTsKICAgICAgICAgICAgICAgICAgICAgICAgdC5wYWNrKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGxzaG93KSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHcgPSB0aGlzLl9sYWJlbC5fZWxlbS5vdXRlcldpZHRoKHRydWUpOwogICAgICAgICAgICAgICAgICAgIHRoaXMuX2xhYmVsLl9lbGVtLmNzcygnbGVmdCcsIG9mZm1pbiArIHBpeGVsbGVuZ3RoLzIgLSB3LzIgKyAncHgnKTsKICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5uYW1lID09ICd4YXhpcycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbGFiZWwuX2VsZW0uY3NzKCdib3R0b20nLCAnMHB4Jyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9sYWJlbC5fZWxlbS5jc3MoJ3RvcCcsICcwcHgnKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbGFiZWwucGFjaygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgZm9yICh2YXIgaT0wOyBpPHRpY2tzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB0aWNrc1tpXTsKICAgICAgICAgICAgICAgICAgICBpZiAodC5zaG93ICYmIHQuc2hvd0xhYmVsKSB7ICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzaGltOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodC5jb25zdHJ1Y3RvciA9PSAkLmpxcGxvdC5DYW52YXNBeGlzVGlja1JlbmRlcmVyICYmIHQuYW5nbGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdpbGwgbmVlZCB0byBhZGp1c3QgYXV0byBwb3NpdGlvbmluZyBiYXNlZCBvbiB3aGljaCBheGlzIHRoaXMgaXMuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGVtcCA9ICh0aGlzLm5hbWUgPT0gJ3lheGlzJykgPyAxIDogLTE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHQubGFiZWxQb3NpdGlvbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2F1dG8nOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwb3NpdGlvbiBhdCBlbmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdlbmQnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGVtcCAqIHQuYW5nbGUgPCAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGltID0gLXQuX3RleHRSZW5kZXJlci5oZWlnaHQgKiBNYXRoLmNvcygtdC5fdGV4dFJlbmRlcmVyLmFuZ2xlKSAvIDI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGltID0gLXQuZ2V0SGVpZ2h0KCkgKyB0Ll90ZXh0UmVuZGVyZXIuaGVpZ2h0ICogTWF0aC5jb3ModC5fdGV4dFJlbmRlcmVyLmFuZ2xlKSAvIDI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnc3RhcnQnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodC5hbmdsZSA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoaW0gPSAtdC5fdGV4dFJlbmRlcmVyLmhlaWdodCAqIE1hdGguY29zKC10Ll90ZXh0UmVuZGVyZXIuYW5nbGUpIC8gMjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoaW0gPSAtdC5nZXRIZWlnaHQoKSArIHQuX3RleHRSZW5kZXJlci5oZWlnaHQgKiBNYXRoLmNvcyh0Ll90ZXh0UmVuZGVyZXIuYW5nbGUpIC8gMjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdtaWRkbGUnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiAodC5hbmdsZSA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIHNoaW0gPSAtdC5nZXRIZWlnaHQoKS8yICsgdC5fdGV4dFJlbmRlcmVyLmhlaWdodCAqIE1hdGguc2luKC10Ll90ZXh0UmVuZGVyZXIuYW5nbGUpIC8gMjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIHNoaW0gPSAtdC5nZXRIZWlnaHQoKS8yIC0gdC5fdGV4dFJlbmRlcmVyLmhlaWdodCAqIE1hdGguc2luKHQuX3RleHRSZW5kZXJlci5hbmdsZSkgLyAyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoaW0gPSAtdC5nZXRIZWlnaHQoKS8yOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGltID0gLXQuZ2V0SGVpZ2h0KCkvMjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGltID0gLXQuZ2V0SGVpZ2h0KCkvMjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZhbCA9IHRoaXMudTJwKHQudmFsdWUpICsgc2hpbSArICdweCc7CiAgICAgICAgICAgICAgICAgICAgICAgIHQuX2VsZW0uY3NzKCd0b3AnLCB2YWwpOwogICAgICAgICAgICAgICAgICAgICAgICB0LnBhY2soKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAobHNob3cpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgaCA9IHRoaXMuX2xhYmVsLl9lbGVtLm91dGVySGVpZ2h0KHRydWUpOwogICAgICAgICAgICAgICAgICAgIHRoaXMuX2xhYmVsLl9lbGVtLmNzcygndG9wJywgb2ZmbWF4IC0gcGl4ZWxsZW5ndGgvMiAtIGgvMiArICdweCcpOwogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm5hbWUgPT0gJ3lheGlzJykgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9sYWJlbC5fZWxlbS5jc3MoJ2xlZnQnLCAnMHB4Jyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9sYWJlbC5fZWxlbS5jc3MoJ3JpZ2h0JywgJzBweCcpOwogICAgICAgICAgICAgICAgICAgIH0gICAKICAgICAgICAgICAgICAgICAgICB0aGlzLl9sYWJlbC5wYWNrKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHRpY2tzID0gbnVsbDsKICAgIH07CgoKICAgIC8qKgogICAgKiBUaGUgZm9sbG93aW5nIGNvZGUgd2FzIGdlbmVyYW91c2x5IGdpdmVuIHRvIG1lIGEgd2hpbGUgYmFjayBieSBTY290dCBQcmFobC4KICAgICogSGUgZGlkIGEgZ29vZCBqb2IgYXQgY29tcHV0aW5nIGF4ZXMgbWluLCBtYXggYW5kIG51bWJlciBvZiB0aWNrcyBmb3IgdGhlIAogICAgKiBjYXNlIHdoZXJlIHRoZSB1c2VyIGhhcyBub3Qgc2V0IGFueSBzY2FsZSByZWxhdGVkIHBhcmFtZXRlcnMgKHRpY2tJbnRlcnZhbCwKICAgICogbnVtYmVyVGlja3MsIG1pbiBvciBtYXgpLiAgSSBoYWQgaWdub3JlZCB0aGlzIHVzZSBjYXNlIGZvciBhIGxvbmcgdGltZSwKICAgICogZm9jdXNpbmcgb24gdGhlIG1vcmUgZGlmZmljdWx0IGNhc2Ugd2hlcmUgdXNlciBoYXMgc2V0IHNvbWUgb3B0aW9uIGNvbnRyb2xsaW5nCiAgICAqIHRpY2sgZ2VuZXJhdGlvbi4gIEFueXdheSwgYWJvdXQgdGltZSBJIGdvdCB0aGlzIGludG8ganFQbG90LgogICAgKiBUaGFua3MgU2NvdHQhIQogICAgKi8KICAgIAogICAgLyoqCiAgICAqIENvcHlyaWdodCAoYykgMjAxMCBTY290dCBQcmFobAogICAgKiBUaGUgbmV4dCB0aHJlZSByb3V0aW5lcyBhcmUgY3VycmVudGx5IGF2YWlsYWJsZSBmb3IgdXNlIGluIGFsbCBwZXJzb25hbCAKICAgICogb3IgY29tbWVyY2lhbCBwcm9qZWN0cyB1bmRlciBib3RoIHRoZSBNSVQgYW5kIEdQTCB2ZXJzaW9uIDIuMCBsaWNlbnNlcy4gCiAgICAqIFRoaXMgbWVhbnMgdGhhdCB5b3UgY2FuIGNob29zZSB0aGUgbGljZW5zZSB0aGF0IGJlc3Qgc3VpdHMgeW91ciBwcm9qZWN0IAogICAgKiBhbmQgdXNlIGl0IGFjY29yZGluZ2x5LiAKICAgICovCgogICAgLy8gQSBnb29kIGZvcm1hdCBzdHJpbmcgZGVwZW5kcyBvbiB0aGUgaW50ZXJ2YWwuIElmIHRoZSBpbnRlcnZhbCBpcyBncmVhdGVyIAogICAgLy8gdGhhbiAxIHRoZW4gdGhlcmUgaXMgbm8gbmVlZCB0byBzaG93IGFueSBkZWNpbWFsIGRpZ2l0cy4gSWYgaXQgaXMgPCAxLjAsIHRoZW4KICAgIC8vIHVzZSB0aGUgbWFnbml0dWRlIG9mIHRoZSBpbnRlcnZhbCB0byBkZXRlcm1pbmUgdGhlIG51bWJlciBvZiBkaWdpdHMgdG8gc2hvdy4KICAgIGZ1bmN0aW9uIGJlc3RGb3JtYXRTdHJpbmcgKGludGVydmFsKQogICAgewogICAgICAgIHZhciBmc3RyOwogICAgICAgIGludGVydmFsID0gTWF0aC5hYnMoaW50ZXJ2YWwpOwogICAgICAgIGlmIChpbnRlcnZhbCA+PSAxMCkgewogICAgICAgICAgICBmc3RyID0gJyVkJzsKICAgICAgICB9CgogICAgICAgIGVsc2UgaWYgKGludGVydmFsID4gMSkgewogICAgICAgICAgICBpZiAoaW50ZXJ2YWwgPT09IHBhcnNlSW50KGludGVydmFsLCAxMCkpIHsKICAgICAgICAgICAgICAgIGZzdHIgPSAnJWQnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgZnN0ciA9ICclLjFmJzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHZhciBleHB2ID0gLU1hdGguZmxvb3IoTWF0aC5sb2coaW50ZXJ2YWwpL01hdGguTE4xMCk7CiAgICAgICAgICAgIGZzdHIgPSAnJS4nICsgZXhwdiArICdmJzsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgcmV0dXJuIGZzdHI7IAogICAgfQoKICAgIHZhciBfZmFjdG9ycyA9IFswLjEsIDAuMiwgMC4zLCAwLjQsIDAuNSwgMC44LCAxLCAyLCAzLCA0LCA1XTsKCiAgICB2YXIgX2dldExvd2VyRmFjdG9yID0gZnVuY3Rpb24oZikgewogICAgICAgIHZhciBpID0gX2ZhY3RvcnMuaW5kZXhPZihmKTsKICAgICAgICBpZiAoaSA+IDApIHsKICAgICAgICAgICAgcmV0dXJuIF9mYWN0b3JzW2ktMV07CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICByZXR1cm4gX2ZhY3RvcnNbX2ZhY3RvcnMubGVuZ3RoIC0gMV0gLyAxMDA7CiAgICAgICAgfQogICAgfTsKCiAgICB2YXIgX2dldEhpZ2hlckZhY3RvciA9IGZ1bmN0aW9uKGYpIHsKICAgICAgICB2YXIgaSA9IF9mYWN0b3JzLmluZGV4T2YoZik7CiAgICAgICAgaWYgKGkgPCBfZmFjdG9ycy5sZW5ndGgtMSkgewogICAgICAgICAgICByZXR1cm4gX2ZhY3RvcnNbaSsxXTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHJldHVybiBfZmFjdG9yc1swXSAqIDEwMDsKICAgICAgICB9CiAgICB9OwoKICAgIC8vIEdpdmVuIGEgZml4ZWQgbWluaW11bSBhbmQgbWF4aW11bSBhbmQgYSB0YXJnZXQgbnVtYmVyIG90IHRpY2tzCiAgICAvLyBmaWd1cmUgb3V0IHRoZSBiZXN0IGludGVydmFsIGFuZCAKICAgIC8vIHJldHVybiBtaW4sIG1heCwgbnVtYmVyIHRpY2tzLCBmb3JtYXQgc3RyaW5nIGFuZCB0aWNrIGludGVydmFsCiAgICBmdW5jdGlvbiBiZXN0Q29uc3RyYWluZWRJbnRlcnZhbChtaW4sIG1heCwgbnR0YXJnZXQpIHsKICAgICAgICAvLyBydW4gdGhyb3VnaCBwb3NzaWJsZSBudW1iZXIgdG8gdGlja3MgYW5kIHNlZSB3aGljaCBpbnRlcnZhbCBpcyBiZXN0CiAgICAgICAgdmFyIGxvdyA9IE1hdGguZmxvb3IobnR0YXJnZXQvMik7CiAgICAgICAgdmFyIGhpID0gTWF0aC5jZWlsKG50dGFyZ2V0KjEuNSk7CiAgICAgICAgdmFyIGJhZG5lc3MgPSBOdW1iZXIuTUFYX1ZBTFVFOwogICAgICAgIHZhciByID0gKG1heCAtIG1pbik7CiAgICAgICAgdmFyIHRlbXA7CiAgICAgICAgdmFyIHNkOwogICAgICAgIHZhciBiZXN0TlQ7CiAgICAgICAgdmFyIGZzZDsKICAgICAgICB2YXIgZnM7CiAgICAgICAgdmFyIGdzZiA9ICQuanFwbG90LmdldFNpZ25pZmljYW50RmlndXJlczsKICAgICAgICB2YXIgY3VycmVudE5UOwogICAgICAgIHZhciBiZXN0UHJlYzsKCiAgICAgICAgZm9yICh2YXIgaT0wLCBsPWhpLWxvdysxOyBpPGw7IGkrKykgewogICAgICAgICAgICBjdXJyZW50TlQgPSBsb3cgKyBpOwogICAgICAgICAgICB0ZW1wID0gci8oY3VycmVudE5ULTEpOwogICAgICAgICAgICBzZCA9IGdzZih0ZW1wKTsKCiAgICAgICAgICAgIHRlbXAgPSBNYXRoLmFicyhudHRhcmdldCAtIGN1cnJlbnROVCkgKyBzZC5kaWdpdHNSaWdodDsKICAgICAgICAgICAgaWYgKHRlbXAgPCBiYWRuZXNzKSB7CiAgICAgICAgICAgICAgICBiYWRuZXNzID0gdGVtcDsKICAgICAgICAgICAgICAgIGJlc3ROVCA9IGN1cnJlbnROVDsKICAgICAgICAgICAgICAgIGJlc3RQcmVjID0gc2QuZGlnaXRzUmlnaHQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAodGVtcCA9PT0gYmFkbmVzcykgewogICAgICAgICAgICAgICAgLy8gbGV0IG5pY2VyIHRpY2tzIHRydW1wIG51bWJlciBvdCB0aWNrcwogICAgICAgICAgICAgICAgaWYgKHNkLmRpZ2l0c1JpZ2h0IDwgYmVzdFByZWMpIHsKICAgICAgICAgICAgICAgICAgICBiZXN0TlQgPSBjdXJyZW50TlQ7CiAgICAgICAgICAgICAgICAgICAgYmVzdFByZWMgPSBzZC5kaWdpdHNSaWdodDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICB9CgogICAgICAgIGZzZCA9IE1hdGgubWF4KGJlc3RQcmVjLCBNYXRoLm1heChnc2YobWluKS5kaWdpdHNSaWdodCwgZ3NmKG1heCkuZGlnaXRzUmlnaHQpKTsKICAgICAgICBpZiAoZnNkID09PSAwKSB7CiAgICAgICAgICAgIGZzID0gJyVkJzsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGZzID0gJyUuJyArIGZzZCArICdmJzsKICAgICAgICB9CiAgICAgICAgdGVtcCA9IHIgLyAoYmVzdE5UIC0gMSk7CiAgICAgICAgLy8gbWluLCBtYXgsIG51bWJlciB0aWNrcywgZm9ybWF0IHN0cmluZywgdGljayBpbnRlcnZhbAogICAgICAgIHJldHVybiBbbWluLCBtYXgsIGJlc3ROVCwgZnMsIHRlbXBdOwogICAgfQoKICAgIC8vIFRoaXMgd2lsbCByZXR1cm4gYW4gaW50ZXJ2YWwgb2YgZm9ybSAyICogMTBebiwgNSAqIDEwXm4gb3IgMTAgKiAxMF5uCiAgICAvLyBpdCBpcyBiYXNlZCBzb2xleSBvbiB0aGUgcmFuZ2UgYW5kIG51bWJlciBvZiB0aWNrcy4gIFNvIGlmIHVzZXIgc3BlY2lmaWVzCiAgICAvLyBudW1iZXIgb2YgdGlja3MsIHVzZSB0aGlzLgogICAgZnVuY3Rpb24gYmVzdEludGVydmFsKHJhbmdlLCBudW1iZXJUaWNrcykgewogICAgICAgIG51bWJlclRpY2tzID0gbnVtYmVyVGlja3MgfHwgNzsKICAgICAgICB2YXIgbWluaW11bSA9IHJhbmdlIC8gKG51bWJlclRpY2tzIC0gMSk7CiAgICAgICAgdmFyIG1hZ25pdHVkZSA9IE1hdGgucG93KDEwLCBNYXRoLmZsb29yKE1hdGgubG9nKG1pbmltdW0pIC8gTWF0aC5MTjEwKSk7CiAgICAgICAgdmFyIHJlc2lkdWFsID0gbWluaW11bSAvIG1hZ25pdHVkZTsKICAgICAgICB2YXIgaW50ZXJ2YWw7CiAgICAgICAgLy8gIm5pY2VzdCIgcmFuZ2VzIGFyZSAxLCAyLCA1IG9yIHBvd2VycyBvZiB0aGVzZS4KICAgICAgICAvLyBmb3IgbWFnbml0dWRlcyBiZWxvdyAxLCBvbmx5IGFsbG93IHRoZXNlLiAKICAgICAgICBpZiAobWFnbml0dWRlIDwgMSkgewogICAgICAgICAgICBpZiAocmVzaWR1YWwgPiA1KSB7CiAgICAgICAgICAgICAgICBpbnRlcnZhbCA9IDEwICogbWFnbml0dWRlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKHJlc2lkdWFsID4gMikgewogICAgICAgICAgICAgICAgaW50ZXJ2YWwgPSA1ICogbWFnbml0dWRlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKHJlc2lkdWFsID4gMSkgewogICAgICAgICAgICAgICAgaW50ZXJ2YWwgPSAyICogbWFnbml0dWRlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgaW50ZXJ2YWwgPSBtYWduaXR1ZGU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLy8gZm9yIGxhcmdlIHJhbmdlcyAod2hvbGUgaW50ZWdlcnMpLCBhbGxvdyBpbnRlcnZhbHMgbGlrZSAzLCA0IG9yIHBvd2VycyBvZiB0aGVzZS4KICAgICAgICAvLyB0aGlzIGhlbHBzIGEgbG90IHdpdGggcG9vciBjaG9pY2VzIGZvciBudW1iZXIgb2YgdGlja3MuIAogICAgICAgIGVsc2UgewogICAgICAgICAgICBpZiAocmVzaWR1YWwgPiA1KSB7CiAgICAgICAgICAgICAgICBpbnRlcnZhbCA9IDEwICogbWFnbml0dWRlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKHJlc2lkdWFsID4gNCkgewogICAgICAgICAgICAgICAgaW50ZXJ2YWwgPSA1ICogbWFnbml0dWRlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKHJlc2lkdWFsID4gMykgewogICAgICAgICAgICAgICAgaW50ZXJ2YWwgPSA0ICogbWFnbml0dWRlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKHJlc2lkdWFsID4gMikgewogICAgICAgICAgICAgICAgaW50ZXJ2YWwgPSAzICogbWFnbml0dWRlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKHJlc2lkdWFsID4gMSkgewogICAgICAgICAgICAgICAgaW50ZXJ2YWwgPSAyICogbWFnbml0dWRlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgaW50ZXJ2YWwgPSBtYWduaXR1ZGU7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiBpbnRlcnZhbDsKICAgIH0KCiAgICAvLyBUaGlzIHdpbGwgcmV0dXJuIGFuIGludGVydmFsIG9mIGZvcm0gMiAqIDEwXm4sIDUgKiAxMF5uIG9yIDEwICogMTBebgogICAgLy8gaXQgaXMgYmFzZWQgc29sZXkgb24gdGhlIHJhbmdlIG9mIGRhdGEsIG51bWJlciBvZiB0aWNrcyBtdXN0IGJlIGNvbXB1dGVkIGxhdGVyLgogICAgZnVuY3Rpb24gYmVzdExpbmVhckludGVydmFsKHJhbmdlLCBzY2FsZWZhY3QpIHsKICAgICAgICBzY2FsZWZhY3QgPSBzY2FsZWZhY3QgfHwgMTsKICAgICAgICB2YXIgZXhwdiA9IE1hdGguZmxvb3IoTWF0aC5sb2cocmFuZ2UpL01hdGguTE4xMCk7CiAgICAgICAgdmFyIG1hZ25pdHVkZSA9IE1hdGgucG93KDEwLCBleHB2KTsKICAgICAgICAvLyAwIDwgZiA8IDEwCiAgICAgICAgdmFyIGYgPSByYW5nZSAvIG1hZ25pdHVkZTsKICAgICAgICB2YXIgZmFjdDsKICAgICAgICAvLyBmb3IgbGFyZ2UgcGxvdHMsIHNjYWxlZmFjdCB3aWxsIGRlY3JlYXNlIGYgYW5kIGluY3JlYXNlIG51bWJlciBvZiB0aWNrcy4KICAgICAgICAvLyBmb3Igc21hbGwgcGxvdHMsIHNjYWxlZmFjdCB3aWxsIGluY3JlYXNlIGYgYW5kIGRlY3JlYXNlIG51bWJlciBvZiB0aWNrcy4KICAgICAgICBmID0gZi9zY2FsZWZhY3Q7CgogICAgICAgIC8vIGZvciBsYXJnZSBwbG90cywgc21hbGxlciBpbnRlcnZhbCwgbW9yZSB0aWNrcy4KICAgICAgICBpZiAoZjw9MC4zOCkgewogICAgICAgICAgICBmYWN0ID0gMC4xOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChmPD0xLjYpIHsKICAgICAgICAgICAgZmFjdCA9IDAuMjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZjw9NC4wKSB7CiAgICAgICAgICAgIGZhY3QgPSAwLjU7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGY8PTguMCkgewogICAgICAgICAgICBmYWN0ID0gMS4wOwogICAgICAgIH0KICAgICAgICAvLyBmb3IgdmVyeSBzbWFsbCBwbG90cywgbGFyZ2VyIGludGVydmFsLCBsZXNzIHRpY2tzIGluIG51bWJlciB0aWNrcwogICAgICAgIGVsc2UgaWYgKGY8PTE2LjApIHsKICAgICAgICAgICAgZmFjdCA9IDI7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBmYWN0ID0gNTsKICAgICAgICB9IAoKICAgICAgICByZXR1cm4gZmFjdCptYWduaXR1ZGU7IAogICAgfQoKICAgIGZ1bmN0aW9uIGJlc3RMaW5lYXJDb21wb25lbnRzKHJhbmdlLCBzY2FsZWZhY3QpIHsKICAgICAgICB2YXIgZXhwdiA9IE1hdGguZmxvb3IoTWF0aC5sb2cocmFuZ2UpL01hdGguTE4xMCk7CiAgICAgICAgdmFyIG1hZ25pdHVkZSA9IE1hdGgucG93KDEwLCBleHB2KTsKICAgICAgICAvLyAwIDwgZiA8IDEwCiAgICAgICAgdmFyIGYgPSByYW5nZSAvIG1hZ25pdHVkZTsKICAgICAgICB2YXIgaW50ZXJ2YWw7CiAgICAgICAgdmFyIGZhY3Q7CiAgICAgICAgLy8gZm9yIGxhcmdlIHBsb3RzLCBzY2FsZWZhY3Qgd2lsbCBkZWNyZWFzZSBmIGFuZCBpbmNyZWFzZSBudW1iZXIgb2YgdGlja3MuCiAgICAgICAgLy8gZm9yIHNtYWxsIHBsb3RzLCBzY2FsZWZhY3Qgd2lsbCBpbmNyZWFzZSBmIGFuZCBkZWNyZWFzZSBudW1iZXIgb2YgdGlja3MuCiAgICAgICAgZiA9IGYvc2NhbGVmYWN0OwoKICAgICAgICAvLyBmb3IgbGFyZ2UgcGxvdHMsIHNtYWxsZXIgaW50ZXJ2YWwsIG1vcmUgdGlja3MuCiAgICAgICAgaWYgKGY8PTAuMzgpIHsKICAgICAgICAgICAgZmFjdCA9IDAuMTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZjw9MS42KSB7CiAgICAgICAgICAgIGZhY3QgPSAwLjI7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGY8PTQuMCkgewogICAgICAgICAgICBmYWN0ID0gMC41OwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChmPD04LjApIHsKICAgICAgICAgICAgZmFjdCA9IDEuMDsKICAgICAgICB9CiAgICAgICAgLy8gZm9yIHZlcnkgc21hbGwgcGxvdHMsIGxhcmdlciBpbnRlcnZhbCwgbGVzcyB0aWNrcyBpbiBudW1iZXIgdGlja3MKICAgICAgICBlbHNlIGlmIChmPD0xNi4wKSB7CiAgICAgICAgICAgIGZhY3QgPSAyOwogICAgICAgIH0KICAgICAgICAvLyBlbHNlIGlmIChmPD0yMC4wKSB7CiAgICAgICAgLy8gICAgIGZhY3QgPSAzOwogICAgICAgIC8vIH0KICAgICAgICAvLyBlbHNlIGlmIChmPD0yNC4wKSB7CiAgICAgICAgLy8gICAgIGZhY3QgPSA0OwogICAgICAgIC8vIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgZmFjdCA9IDU7CiAgICAgICAgfSAKCiAgICAgICAgaW50ZXJ2YWwgPSBmYWN0ICogbWFnbml0dWRlOwoKICAgICAgICByZXR1cm4gW2ludGVydmFsLCBmYWN0LCBtYWduaXR1ZGVdOwogICAgfQoKICAgIC8vIEdpdmVuIHRoZSBtaW4gYW5kIG1heCBmb3IgYSBkYXRhc2V0LCByZXR1cm4gc3VpdGFibGUgZW5kcG9pbnRzCiAgICAvLyBmb3IgdGhlIGdyYXBoaW5nLCBhIGdvb2QgbnVtYmVyIGZvciB0aGUgbnVtYmVyIG9mIHRpY2tzLCBhbmQgYQogICAgLy8gZm9ybWF0IHN0cmluZyBzbyB0aGF0IGV4dHJhbmVvdXMgZGlnaXRzIGFyZSBub3QgZGlzcGxheWVkLgogICAgLy8gcmV0dXJuZWQgaXMgYW4gYXJyYXkgY29udGFpbmluZyBbbWluLCBtYXgsIG5UaWNrcywgZm9ybWF0XQogICAgJC5qcXBsb3QuTGluZWFyVGlja0dlbmVyYXRvciA9IGZ1bmN0aW9uKGF4aXNfbWluLCBheGlzX21heCwgc2NhbGVmYWN0LCBudW1iZXJUaWNrcykgewogICAgICAgIC8vIGlmIGVuZHBvaW50cyBhcmUgZXF1YWwgdHJ5IHRvIGluY2x1ZGUgemVybyBvdGhlcndpc2UgaW5jbHVkZSBvbmUKICAgICAgICBpZiAoYXhpc19taW4gPT09IGF4aXNfbWF4KSB7CiAgICAgICAgICAgIGF4aXNfbWF4ID0gKGF4aXNfbWF4KSA/IDAgOiAxOwogICAgICAgIH0KCiAgICAgICAgc2NhbGVmYWN0ID0gc2NhbGVmYWN0IHx8IDEuMDsKCiAgICAgICAgLy8gbWFrZSBzdXJlIHJhbmdlIGlzIHBvc2l0aXZlCiAgICAgICAgaWYgKGF4aXNfbWF4IDwgYXhpc19taW4pIHsKICAgICAgICAgICAgdmFyIGEgPSBheGlzX21heDsKICAgICAgICAgICAgYXhpc19tYXggPSBheGlzX21pbjsKICAgICAgICAgICAgYXhpc19taW4gPSBhOwogICAgICAgIH0KCiAgICAgICAgdmFyIHIgPSBbXTsKICAgICAgICB2YXIgc3MgPSBiZXN0TGluZWFySW50ZXJ2YWwoYXhpc19tYXggLSBheGlzX21pbiwgc2NhbGVmYWN0KTsKICAgICAgICAKICAgICAgICBpZiAobnVtYmVyVGlja3MgPT0gbnVsbCkgewoKICAgICAgICAgICAgLy8gRmlndXJlIG91dCB0aGUgYXhpcyBtaW4sIG1heCBhbmQgbnVtYmVyIG9mIHRpY2tzCiAgICAgICAgICAgIC8vIHRoZSBtaW4gYW5kIG1heCB3aWxsIGJlIHNvbWUgbXVsdGlwbGUgb2YgdGhlIHRpY2sgaW50ZXJ2YWwsCiAgICAgICAgICAgIC8vIDEqMTBebiwgMioxMF5uIG9yIDUqMTBebi4gIFRoaXMgZ2F1cmFudGVlcyB0aGF0LCBpZiB0aGUKICAgICAgICAgICAgLy8gYXhpcyBtaW4gaXMgbmVnYXRpdmUsIDAgd2lsbCBiZSBhIHRpY2suCiAgICAgICAgICAgIHJbMF0gPSBNYXRoLmZsb29yKGF4aXNfbWluIC8gc3MpICogc3M7ICAvLyBtaW4KICAgICAgICAgICAgclsxXSA9IE1hdGguY2VpbChheGlzX21heCAvIHNzKSAqIHNzOyAgIC8vIG1heAogICAgICAgICAgICByWzJdID0gTWF0aC5yb3VuZCgoclsxXS1yWzBdKS9zcysxLjApOyAgLy8gbnVtYmVyIG9mIHRpY2tzCiAgICAgICAgICAgIHJbM10gPSBiZXN0Rm9ybWF0U3RyaW5nKHNzKTsgICAgICAgICAgICAvLyBmb3JtYXQgc3RyaW5nCiAgICAgICAgICAgIHJbNF0gPSBzczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aWNrIEludGVydmFsCiAgICAgICAgfQoKICAgICAgICBlbHNlIHsKICAgICAgICAgICAgdmFyIHRlbXByID0gW107CgogICAgICAgICAgICAvLyBGaWd1cmUgb3V0IHRoZSBheGlzIG1pbiwgbWF4IGFuZCBudW1iZXIgb2YgdGlja3MKICAgICAgICAgICAgLy8gdGhlIG1pbiBhbmQgbWF4IHdpbGwgYmUgc29tZSBtdWx0aXBsZSBvZiB0aGUgdGljayBpbnRlcnZhbCwKICAgICAgICAgICAgLy8gMSoxMF5uLCAyKjEwXm4gb3IgNSoxMF5uLiAgVGhpcyBnYXVyYW50ZWVzIHRoYXQsIGlmIHRoZQogICAgICAgICAgICAvLyBheGlzIG1pbiBpcyBuZWdhdGl2ZSwgMCB3aWxsIGJlIGEgdGljay4KICAgICAgICAgICAgdGVtcHJbMF0gPSBNYXRoLmZsb29yKGF4aXNfbWluIC8gc3MpICogc3M7ICAvLyBtaW4KICAgICAgICAgICAgdGVtcHJbMV0gPSBNYXRoLmNlaWwoYXhpc19tYXggLyBzcykgKiBzczsgICAvLyBtYXgKICAgICAgICAgICAgdGVtcHJbMl0gPSBNYXRoLnJvdW5kKCh0ZW1wclsxXS10ZW1wclswXSkvc3MrMS4wKTsgICAgLy8gbnVtYmVyIG9mIHRpY2tzCiAgICAgICAgICAgIHRlbXByWzNdID0gYmVzdEZvcm1hdFN0cmluZyhzcyk7ICAgICAgICAgICAgLy8gZm9ybWF0IHN0cmluZwogICAgICAgICAgICB0ZW1wcls0XSA9IHNzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRpY2sgSW50ZXJ2YWwKCiAgICAgICAgICAgIC8vIGZpcnN0LCBzZWUgaWYgd2UgaGFwcGVuIHRvIGdldCB0aGUgcmlnaHQgbnVtYmVyIG9mIHRpY2tzCiAgICAgICAgICAgIGlmICh0ZW1wclsyXSA9PT0gbnVtYmVyVGlja3MpIHsKICAgICAgICAgICAgICAgIHIgPSB0ZW1wcjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAgICAgdmFyIG5ld3RpID0gYmVzdEludGVydmFsKHRlbXByWzFdIC0gdGVtcHJbMF0sIG51bWJlclRpY2tzKTsKCiAgICAgICAgICAgICAgICByWzBdID0gdGVtcHJbMF07CiAgICAgICAgICAgICAgICByWzJdID0gbnVtYmVyVGlja3M7CiAgICAgICAgICAgICAgICByWzRdID0gbmV3dGk7CiAgICAgICAgICAgICAgICByWzNdID0gYmVzdEZvcm1hdFN0cmluZyhuZXd0aSk7CiAgICAgICAgICAgICAgICByWzFdID0gclswXSArIChyWzJdIC0gMSkgKiByWzRdOyAgICAgICAgLy8gbWF4CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiByOwogICAgfTsKCiAgICAkLmpxcGxvdC5MaW5lYXJUaWNrR2VuZXJhdG9yLmJlc3RMaW5lYXJJbnRlcnZhbCA9IGJlc3RMaW5lYXJJbnRlcnZhbDsKICAgICQuanFwbG90LkxpbmVhclRpY2tHZW5lcmF0b3IuYmVzdEludGVydmFsID0gYmVzdEludGVydmFsOwogICAgJC5qcXBsb3QuTGluZWFyVGlja0dlbmVyYXRvci5iZXN0TGluZWFyQ29tcG9uZW50cyA9IGJlc3RMaW5lYXJDb21wb25lbnRzOwogICAgJC5qcXBsb3QuTGluZWFyVGlja0dlbmVyYXRvci5iZXN0Q29uc3RyYWluZWRJbnRlcnZhbCA9IGJlc3RDb25zdHJhaW5lZEludGVydmFsOwoKCiAgICAvLyBjbGFzczogJC5qcXBsb3QuTWFya2VyUmVuZGVyZXIKICAgIC8vIFRoZSBkZWZhdWx0IGpxUGxvdCBtYXJrZXIgcmVuZGVyZXIsIHJlbmRlcmluZyB0aGUgcG9pbnRzIG9uIHRoZSBsaW5lLgogICAgJC5qcXBsb3QuTWFya2VyUmVuZGVyZXIgPSBmdW5jdGlvbihvcHRpb25zKXsKICAgICAgICAvLyBHcm91cDogUHJvcGVydGllcwogICAgICAgIAogICAgICAgIC8vIHByb3A6IHNob3cKICAgICAgICAvLyB3ZXRoZXIgb3Igbm90IHRvIHNob3cgdGhlIG1hcmtlci4KICAgICAgICB0aGlzLnNob3cgPSB0cnVlOwogICAgICAgIC8vIHByb3A6IHN0eWxlCiAgICAgICAgLy8gT25lIG9mIGRpYW1vbmQsIGNpcmNsZSwgc3F1YXJlLCB4LCBwbHVzLCBkYXNoLCBmaWxsZWREaWFtb25kLCBmaWxsZWRDaXJjbGUsIGZpbGxlZFNxdWFyZQogICAgICAgIHRoaXMuc3R5bGUgPSAnZmlsbGVkQ2lyY2xlJzsKICAgICAgICAvLyBwcm9wOiBsaW5lV2lkdGgKICAgICAgICAvLyBzaXplIG9mIHRoZSBsaW5lIGZvciBub24tZmlsbGVkIG1hcmtlcnMuCiAgICAgICAgdGhpcy5saW5lV2lkdGggPSAyOwogICAgICAgIC8vIHByb3A6IHNpemUKICAgICAgICAvLyBTaXplIG9mIHRoZSBtYXJrZXIgKGRpYW1ldGVyIG9yIGNpcmNsZSwgbGVuZ3RoIG9mIGVkZ2Ugb2Ygc3F1YXJlLCBldGMuKQogICAgICAgIHRoaXMuc2l6ZSA9IDkuMDsKICAgICAgICAvLyBwcm9wOiBjb2xvcgogICAgICAgIC8vIGNvbG9yIG9mIG1hcmtlci4gIFdpbGwgYmUgc2V0IHRvIGNvbG9yIG9mIHNlcmllcyBieSBkZWZhdWx0IG9uIGluaXQuCiAgICAgICAgdGhpcy5jb2xvciA9ICcjNjY2NjY2JzsKICAgICAgICAvLyBwcm9wOiBzaGFkb3cKICAgICAgICAvLyB3ZXRoZXIgb3Igbm90IHRvIGRyYXcgYSBzaGFkb3cgb24gdGhlIGxpbmUKICAgICAgICB0aGlzLnNoYWRvdyA9IHRydWU7CiAgICAgICAgLy8gcHJvcDogc2hhZG93QW5nbGUKICAgICAgICAvLyBTaGFkb3cgYW5nbGUgaW4gZGVncmVlcwogICAgICAgIHRoaXMuc2hhZG93QW5nbGUgPSA0NTsKICAgICAgICAvLyBwcm9wOiBzaGFkb3dPZmZzZXQKICAgICAgICAvLyBTaGFkb3cgb2Zmc2V0IGZyb20gbGluZSBpbiBwaXhlbHMKICAgICAgICB0aGlzLnNoYWRvd09mZnNldCA9IDE7CiAgICAgICAgLy8gcHJvcDogc2hhZG93RGVwdGgKICAgICAgICAvLyBOdW1iZXIgb2YgdGltZXMgc2hhZG93IGlzIHN0cm9rZWQsIGVhY2ggc3Ryb2tlIG9mZnNldCBzaGFkb3dPZmZzZXQgZnJvbSB0aGUgbGFzdC4KICAgICAgICB0aGlzLnNoYWRvd0RlcHRoID0gMzsKICAgICAgICAvLyBwcm9wOiBzaGFkb3dBbHBoYQogICAgICAgIC8vIEFscGhhIGNoYW5uZWwgdHJhbnNwYXJlbmN5IG9mIHNoYWRvdy4gIDAgPSB0cmFuc3BhcmVudC4KICAgICAgICB0aGlzLnNoYWRvd0FscGhhID0gJzAuMDcnOwogICAgICAgIC8vIHByb3A6IHNoYWRvd1JlbmRlcmVyCiAgICAgICAgLy8gUmVuZGVyZXIgdGhhdCB3aWxsIGRyYXdzIHRoZSBzaGFkb3dzIG9uIHRoZSBtYXJrZXIuCiAgICAgICAgdGhpcy5zaGFkb3dSZW5kZXJlciA9IG5ldyAkLmpxcGxvdC5TaGFkb3dSZW5kZXJlcigpOwogICAgICAgIC8vIHByb3A6IHNoYXBlUmVuZGVyZXIKICAgICAgICAvLyBSZW5kZXJlciB0aGF0IHdpbGwgZHJhdyB0aGUgbWFya2VyLgogICAgICAgIHRoaXMuc2hhcGVSZW5kZXJlciA9IG5ldyAkLmpxcGxvdC5TaGFwZVJlbmRlcmVyKCk7CiAgICAgICAgCiAgICAgICAgJC5leHRlbmQodHJ1ZSwgdGhpcywgb3B0aW9ucyk7CiAgICB9OwogICAgCiAgICAkLmpxcGxvdC5NYXJrZXJSZW5kZXJlci5wcm90b3R5cGUuaW5pdCA9IGZ1bmN0aW9uKG9wdGlvbnMpIHsKICAgICAgICAkLmV4dGVuZCh0cnVlLCB0aGlzLCBvcHRpb25zKTsKICAgICAgICB2YXIgc2RvcHQgPSB7YW5nbGU6dGhpcy5zaGFkb3dBbmdsZSwgb2Zmc2V0OnRoaXMuc2hhZG93T2Zmc2V0LCBhbHBoYTp0aGlzLnNoYWRvd0FscGhhLCBsaW5lV2lkdGg6dGhpcy5saW5lV2lkdGgsIGRlcHRoOnRoaXMuc2hhZG93RGVwdGgsIGNsb3NlUGF0aDp0cnVlfTsKICAgICAgICBpZiAodGhpcy5zdHlsZS5pbmRleE9mKCdmaWxsZWQnKSAhPSAtMSkgewogICAgICAgICAgICBzZG9wdC5maWxsID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgaWYgKHRoaXMuc3R5bGUuaW5kZXhPZignaXJjbGUnKSAhPSAtMSkgewogICAgICAgICAgICBzZG9wdC5pc2FyYyA9IHRydWU7CiAgICAgICAgICAgIHNkb3B0LmNsb3NlUGF0aCA9IGZhbHNlOwogICAgICAgIH0KICAgICAgICB0aGlzLnNoYWRvd1JlbmRlcmVyLmluaXQoc2RvcHQpOwogICAgICAgIAogICAgICAgIHZhciBzaG9wdCA9IHtmaWxsOmZhbHNlLCBpc2FyYzpmYWxzZSwgc3Ryb2tlU3R5bGU6dGhpcy5jb2xvciwgZmlsbFN0eWxlOnRoaXMuY29sb3IsIGxpbmVXaWR0aDp0aGlzLmxpbmVXaWR0aCwgY2xvc2VQYXRoOnRydWV9OwogICAgICAgIGlmICh0aGlzLnN0eWxlLmluZGV4T2YoJ2ZpbGxlZCcpICE9IC0xKSB7CiAgICAgICAgICAgIHNob3B0LmZpbGwgPSB0cnVlOwogICAgICAgIH0KICAgICAgICBpZiAodGhpcy5zdHlsZS5pbmRleE9mKCdpcmNsZScpICE9IC0xKSB7CiAgICAgICAgICAgIHNob3B0LmlzYXJjID0gdHJ1ZTsKICAgICAgICAgICAgc2hvcHQuY2xvc2VQYXRoID0gZmFsc2U7CiAgICAgICAgfQogICAgICAgIHRoaXMuc2hhcGVSZW5kZXJlci5pbml0KHNob3B0KTsKICAgIH07CiAgICAKICAgICQuanFwbG90Lk1hcmtlclJlbmRlcmVyLnByb3RvdHlwZS5kcmF3RGlhbW9uZCA9IGZ1bmN0aW9uKHgsIHksIGN0eCwgZmlsbCwgb3B0aW9ucykgewogICAgICAgIHZhciBzdHJldGNoID0gMS4yOwogICAgICAgIHZhciBkeCA9IHRoaXMuc2l6ZS8yL3N0cmV0Y2g7CiAgICAgICAgdmFyIGR5ID0gdGhpcy5zaXplLzIqc3RyZXRjaDsKICAgICAgICB2YXIgcG9pbnRzID0gW1t4LWR4LCB5XSwgW3gsIHkrZHldLCBbeCtkeCwgeV0sIFt4LCB5LWR5XV07CiAgICAgICAgaWYgKHRoaXMuc2hhZG93KSB7CiAgICAgICAgICAgIHRoaXMuc2hhZG93UmVuZGVyZXIuZHJhdyhjdHgsIHBvaW50cyk7CiAgICAgICAgfQogICAgICAgIHRoaXMuc2hhcGVSZW5kZXJlci5kcmF3KGN0eCwgcG9pbnRzLCBvcHRpb25zKTsKICAgIH07CiAgICAKICAgICQuanFwbG90Lk1hcmtlclJlbmRlcmVyLnByb3RvdHlwZS5kcmF3UGx1cyA9IGZ1bmN0aW9uKHgsIHksIGN0eCwgZmlsbCwgb3B0aW9ucykgewogICAgICAgIHZhciBzdHJldGNoID0gMS4wOwogICAgICAgIHZhciBkeCA9IHRoaXMuc2l6ZS8yKnN0cmV0Y2g7CiAgICAgICAgdmFyIGR5ID0gdGhpcy5zaXplLzIqc3RyZXRjaDsKICAgICAgICB2YXIgcG9pbnRzMSA9IFtbeCwgeS1keV0sIFt4LCB5K2R5XV07CiAgICAgICAgdmFyIHBvaW50czIgPSBbW3grZHgsIHldLCBbeC1keCwgeV1dOwogICAgICAgIHZhciBvcHRzID0gJC5leHRlbmQodHJ1ZSwge30sIHRoaXMub3B0aW9ucywge2Nsb3NlUGF0aDpmYWxzZX0pOwogICAgICAgIGlmICh0aGlzLnNoYWRvdykgewogICAgICAgICAgICB0aGlzLnNoYWRvd1JlbmRlcmVyLmRyYXcoY3R4LCBwb2ludHMxLCB7Y2xvc2VQYXRoOmZhbHNlfSk7CiAgICAgICAgICAgIHRoaXMuc2hhZG93UmVuZGVyZXIuZHJhdyhjdHgsIHBvaW50czIsIHtjbG9zZVBhdGg6ZmFsc2V9KTsKICAgICAgICB9CiAgICAgICAgdGhpcy5zaGFwZVJlbmRlcmVyLmRyYXcoY3R4LCBwb2ludHMxLCBvcHRzKTsKICAgICAgICB0aGlzLnNoYXBlUmVuZGVyZXIuZHJhdyhjdHgsIHBvaW50czIsIG9wdHMpOwogICAgfTsKICAgIAogICAgJC5qcXBsb3QuTWFya2VyUmVuZGVyZXIucHJvdG90eXBlLmRyYXdYID0gZnVuY3Rpb24oeCwgeSwgY3R4LCBmaWxsLCBvcHRpb25zKSB7CiAgICAgICAgdmFyIHN0cmV0Y2ggPSAxLjA7CiAgICAgICAgdmFyIGR4ID0gdGhpcy5zaXplLzIqc3RyZXRjaDsKICAgICAgICB2YXIgZHkgPSB0aGlzLnNpemUvMipzdHJldGNoOwogICAgICAgIHZhciBvcHRzID0gJC5leHRlbmQodHJ1ZSwge30sIHRoaXMub3B0aW9ucywge2Nsb3NlUGF0aDpmYWxzZX0pOwogICAgICAgIHZhciBwb2ludHMxID0gW1t4LWR4LCB5LWR5XSwgW3grZHgsIHkrZHldXTsKICAgICAgICB2YXIgcG9pbnRzMiA9IFtbeC1keCwgeStkeV0sIFt4K2R4LCB5LWR5XV07CiAgICAgICAgaWYgKHRoaXMuc2hhZG93KSB7CiAgICAgICAgICAgIHRoaXMuc2hhZG93UmVuZGVyZXIuZHJhdyhjdHgsIHBvaW50czEsIHtjbG9zZVBhdGg6ZmFsc2V9KTsKICAgICAgICAgICAgdGhpcy5zaGFkb3dSZW5kZXJlci5kcmF3KGN0eCwgcG9pbnRzMiwge2Nsb3NlUGF0aDpmYWxzZX0pOwogICAgICAgIH0KICAgICAgICB0aGlzLnNoYXBlUmVuZGVyZXIuZHJhdyhjdHgsIHBvaW50czEsIG9wdHMpOwogICAgICAgIHRoaXMuc2hhcGVSZW5kZXJlci5kcmF3KGN0eCwgcG9pbnRzMiwgb3B0cyk7CiAgICB9OwogICAgCiAgICAkLmpxcGxvdC5NYXJrZXJSZW5kZXJlci5wcm90b3R5cGUuZHJhd0Rhc2ggPSBmdW5jdGlvbih4LCB5LCBjdHgsIGZpbGwsIG9wdGlvbnMpIHsKICAgICAgICB2YXIgc3RyZXRjaCA9IDEuMDsKICAgICAgICB2YXIgZHggPSB0aGlzLnNpemUvMipzdHJldGNoOwogICAgICAgIHZhciBkeSA9IHRoaXMuc2l6ZS8yKnN0cmV0Y2g7CiAgICAgICAgdmFyIHBvaW50cyA9IFtbeC1keCwgeV0sIFt4K2R4LCB5XV07CiAgICAgICAgaWYgKHRoaXMuc2hhZG93KSB7CiAgICAgICAgICAgIHRoaXMuc2hhZG93UmVuZGVyZXIuZHJhdyhjdHgsIHBvaW50cyk7CiAgICAgICAgfQogICAgICAgIHRoaXMuc2hhcGVSZW5kZXJlci5kcmF3KGN0eCwgcG9pbnRzLCBvcHRpb25zKTsKICAgIH07CiAgICAKICAgICQuanFwbG90Lk1hcmtlclJlbmRlcmVyLnByb3RvdHlwZS5kcmF3TGluZSA9IGZ1bmN0aW9uKHAxLCBwMiwgY3R4LCBmaWxsLCBvcHRpb25zKSB7CiAgICAgICAgdmFyIHBvaW50cyA9IFtwMSwgcDJdOwogICAgICAgIGlmICh0aGlzLnNoYWRvdykgewogICAgICAgICAgICB0aGlzLnNoYWRvd1JlbmRlcmVyLmRyYXcoY3R4LCBwb2ludHMpOwogICAgICAgIH0KICAgICAgICB0aGlzLnNoYXBlUmVuZGVyZXIuZHJhdyhjdHgsIHBvaW50cywgb3B0aW9ucyk7CiAgICB9OwogICAgCiAgICAkLmpxcGxvdC5NYXJrZXJSZW5kZXJlci5wcm90b3R5cGUuZHJhd1NxdWFyZSA9IGZ1bmN0aW9uKHgsIHksIGN0eCwgZmlsbCwgb3B0aW9ucykgewogICAgICAgIHZhciBzdHJldGNoID0gMS4wOwogICAgICAgIHZhciBkeCA9IHRoaXMuc2l6ZS8yL3N0cmV0Y2g7CiAgICAgICAgdmFyIGR5ID0gdGhpcy5zaXplLzIqc3RyZXRjaDsKICAgICAgICB2YXIgcG9pbnRzID0gW1t4LWR4LCB5LWR5XSwgW3gtZHgsIHkrZHldLCBbeCtkeCwgeStkeV0sIFt4K2R4LCB5LWR5XV07CiAgICAgICAgaWYgKHRoaXMuc2hhZG93KSB7CiAgICAgICAgICAgIHRoaXMuc2hhZG93UmVuZGVyZXIuZHJhdyhjdHgsIHBvaW50cyk7CiAgICAgICAgfQogICAgICAgIHRoaXMuc2hhcGVSZW5kZXJlci5kcmF3KGN0eCwgcG9pbnRzLCBvcHRpb25zKTsKICAgIH07CiAgICAKICAgICQuanFwbG90Lk1hcmtlclJlbmRlcmVyLnByb3RvdHlwZS5kcmF3Q2lyY2xlID0gZnVuY3Rpb24oeCwgeSwgY3R4LCBmaWxsLCBvcHRpb25zKSB7CiAgICAgICAgdmFyIHJhZGl1cyA9IHRoaXMuc2l6ZS8yOwogICAgICAgIHZhciBlbmQgPSAyKk1hdGguUEk7CiAgICAgICAgdmFyIHBvaW50cyA9IFt4LCB5LCByYWRpdXMsIDAsIGVuZCwgdHJ1ZV07CiAgICAgICAgaWYgKHRoaXMuc2hhZG93KSB7CiAgICAgICAgICAgIHRoaXMuc2hhZG93UmVuZGVyZXIuZHJhdyhjdHgsIHBvaW50cyk7CiAgICAgICAgfQogICAgICAgIHRoaXMuc2hhcGVSZW5kZXJlci5kcmF3KGN0eCwgcG9pbnRzLCBvcHRpb25zKTsKICAgIH07CiAgICAKICAgICQuanFwbG90Lk1hcmtlclJlbmRlcmVyLnByb3RvdHlwZS5kcmF3ID0gZnVuY3Rpb24oeCwgeSwgY3R4LCBvcHRpb25zKSB7CiAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307CiAgICAgICAgLy8gaGFjayBoZXJlIGIvYyBzaGFwZSByZW5kZXJlciB1c2VzIGNhbnZhcyBiYXNlZCBjb2xvciBzdHlsZSBvcHRpb25zCiAgICAgICAgLy8gYW5kIG1hcmtlciB1c2VzIGNzcyBzdHlsZSBuYW1lcy4KICAgICAgICBpZiAob3B0aW9ucy5zaG93ID09IG51bGwgfHwgb3B0aW9ucy5zaG93ICE9IGZhbHNlKSB7CiAgICAgICAgICAgIGlmIChvcHRpb25zLmNvbG9yICYmICFvcHRpb25zLmZpbGxTdHlsZSkgewogICAgICAgICAgICAgICAgb3B0aW9ucy5maWxsU3R5bGUgPSBvcHRpb25zLmNvbG9yOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChvcHRpb25zLmNvbG9yICYmICFvcHRpb25zLnN0cm9rZVN0eWxlKSB7CiAgICAgICAgICAgICAgICBvcHRpb25zLnN0cm9rZVN0eWxlID0gb3B0aW9ucy5jb2xvcjsKICAgICAgICAgICAgfQogICAgICAgICAgICBzd2l0Y2ggKHRoaXMuc3R5bGUpIHsKICAgICAgICAgICAgICAgIGNhc2UgJ2RpYW1vbmQnOgogICAgICAgICAgICAgICAgICAgIHRoaXMuZHJhd0RpYW1vbmQoeCx5LGN0eCwgZmFsc2UsIG9wdGlvbnMpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAnZmlsbGVkRGlhbW9uZCc6CiAgICAgICAgICAgICAgICAgICAgdGhpcy5kcmF3RGlhbW9uZCh4LHksY3R4LCB0cnVlLCBvcHRpb25zKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJ2NpcmNsZSc6CiAgICAgICAgICAgICAgICAgICAgdGhpcy5kcmF3Q2lyY2xlKHgseSxjdHgsIGZhbHNlLCBvcHRpb25zKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJ2ZpbGxlZENpcmNsZSc6CiAgICAgICAgICAgICAgICAgICAgdGhpcy5kcmF3Q2lyY2xlKHgseSxjdHgsIHRydWUsIG9wdGlvbnMpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAnc3F1YXJlJzoKICAgICAgICAgICAgICAgICAgICB0aGlzLmRyYXdTcXVhcmUoeCx5LGN0eCwgZmFsc2UsIG9wdGlvbnMpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAnZmlsbGVkU3F1YXJlJzoKICAgICAgICAgICAgICAgICAgICB0aGlzLmRyYXdTcXVhcmUoeCx5LGN0eCwgdHJ1ZSwgb3B0aW9ucyk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICd4JzoKICAgICAgICAgICAgICAgICAgICB0aGlzLmRyYXdYKHgseSxjdHgsIHRydWUsIG9wdGlvbnMpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAncGx1cyc6CiAgICAgICAgICAgICAgICAgICAgdGhpcy5kcmF3UGx1cyh4LHksY3R4LCB0cnVlLCBvcHRpb25zKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJ2Rhc2gnOgogICAgICAgICAgICAgICAgICAgIHRoaXMuZHJhd0Rhc2goeCx5LGN0eCwgdHJ1ZSwgb3B0aW9ucyk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICdsaW5lJzoKICAgICAgICAgICAgICAgICAgICB0aGlzLmRyYXdMaW5lKHgsIHksIGN0eCwgZmFsc2UsIG9wdGlvbnMpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICB0aGlzLmRyYXdEaWFtb25kKHgseSxjdHgsIGZhbHNlLCBvcHRpb25zKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH07CiAgICAKICAgIC8vIGNsYXNzOiAkLmpxcGxvdC5zaGFkb3dSZW5kZXJlcgogICAgLy8gVGhlIGRlZmF1bHQganFQbG90IHNoYWRvdyByZW5kZXJlciwgcmVuZGVyaW5nIHNoYWRvd3MgYmVoaW5kIHNoYXBlcy4KICAgICQuanFwbG90LlNoYWRvd1JlbmRlcmVyID0gZnVuY3Rpb24ob3B0aW9ucyl7IAogICAgICAgIC8vIEdyb3VwOiBQcm9wZXJ0aWVzCiAgICAgICAgCiAgICAgICAgLy8gcHJvcDogYW5nbGUKICAgICAgICAvLyBBbmdsZSBvZiB0aGUgc2hhZG93IGluIGRlZ3JlZXMuICBNZWFzdXJlZCBjb3VudGVyLWNsb2Nrd2lzZSBmcm9tIHRoZSB4IGF4aXMuCiAgICAgICAgdGhpcy5hbmdsZSA9IDQ1OwogICAgICAgIC8vIHByb3A6IG9mZnNldAogICAgICAgIC8vIFBpeGVsIG9mZnNldCBhdCB0aGUgZ2l2ZW4gc2hhZG93IGFuZ2xlIG9mIGVhY2ggc2hhZG93IHN0cm9rZSBmcm9tIHRoZSBsYXN0IHN0cm9rZS4KICAgICAgICB0aGlzLm9mZnNldCA9IDE7CiAgICAgICAgLy8gcHJvcDogYWxwaGEKICAgICAgICAvLyBhbHBoYSB0cmFuc3BhcmVuY3kgb2Ygc2hhZG93IHN0cm9rZS4KICAgICAgICB0aGlzLmFscGhhID0gMC4wNzsKICAgICAgICAvLyBwcm9wOiBsaW5lV2lkdGgKICAgICAgICAvLyB3aWR0aCBvZiB0aGUgc2hhZG93IGxpbmUgc3Ryb2tlLgogICAgICAgIHRoaXMubGluZVdpZHRoID0gMS41OwogICAgICAgIC8vIHByb3A6IGxpbmVKb2luCiAgICAgICAgLy8gSG93IGxpbmUgc2VnbWVudHMgb2YgdGhlIHNoYWRvdyBhcmUgam9pbmVkLgogICAgICAgIHRoaXMubGluZUpvaW4gPSAnbWl0ZXInOwogICAgICAgIC8vIHByb3A6IGxpbmVDYXAKICAgICAgICAvLyBob3cgZW5kcyBvZiB0aGUgc2hhZG93IGxpbmUgYXJlIHJlbmRlcmVkLgogICAgICAgIHRoaXMubGluZUNhcCA9ICdyb3VuZCc7CiAgICAgICAgLy8gcHJvcDsgY2xvc2VQYXRoCiAgICAgICAgLy8gd2hldGhlciBsaW5lIHBhdGggc2VnbWVudCBpcyBjbG9zZWQgdXBvbiBpdHNlbGYuCiAgICAgICAgdGhpcy5jbG9zZVBhdGggPSBmYWxzZTsKICAgICAgICAvLyBwcm9wOiBmaWxsCiAgICAgICAgLy8gd2hldGhlciB0byBmaWxsIHRoZSBzaGFwZS4KICAgICAgICB0aGlzLmZpbGwgPSBmYWxzZTsKICAgICAgICAvLyBwcm9wOiBkZXB0aAogICAgICAgIC8vIGhvdyBtYW55IHRpbWVzIHRoZSBzaGFkb3cgaXMgc3Ryb2tlZC4gIEVhY2ggc3Ryb2tlIHdpbGwgYmUgb2Zmc2V0IGJ5IG9mZnNldCBhdCBhbmdsZSBkZWdyZWVzLgogICAgICAgIHRoaXMuZGVwdGggPSAzOwogICAgICAgIHRoaXMuc3Ryb2tlU3R5bGUgPSAncmdiYSgwLDAsMCwwLjEpJzsKICAgICAgICAvLyBwcm9wOiBpc2FyYwogICAgICAgIC8vIHdldGhlciB0aGUgc2hhZG93IGlzIGFuIGFyYyBvciBub3QuCiAgICAgICAgdGhpcy5pc2FyYyA9IGZhbHNlOwogICAgICAgIAogICAgICAgICQuZXh0ZW5kKHRydWUsIHRoaXMsIG9wdGlvbnMpOwogICAgfTsKICAgIAogICAgJC5qcXBsb3QuU2hhZG93UmVuZGVyZXIucHJvdG90eXBlLmluaXQgPSBmdW5jdGlvbihvcHRpb25zKSB7CiAgICAgICAgJC5leHRlbmQodHJ1ZSwgdGhpcywgb3B0aW9ucyk7CiAgICB9OwogICAgCiAgICAvLyBmdW5jdGlvbjogZHJhdwogICAgLy8gZHJhd3MgYW4gdHJhbnNwYXJlbnQgYmxhY2sgKGkuZS4gZ3JheSkgc2hhZG93LgogICAgLy8KICAgIC8vIGN0eCAtIGNhbnZhcyBkcmF3aW5nIGNvbnRleHQKICAgIC8vIHBvaW50cyAtIGFycmF5IG9mIHBvaW50cyBvciBbeCwgeSwgcmFkaXVzLCBzdGFydCBhbmdsZSAocmFkKSwgZW5kIGFuZ2xlIChyYWQpXQogICAgJC5qcXBsb3QuU2hhZG93UmVuZGVyZXIucHJvdG90eXBlLmRyYXcgPSBmdW5jdGlvbihjdHgsIHBvaW50cywgb3B0aW9ucykgewogICAgICAgIGN0eC5zYXZlKCk7CiAgICAgICAgdmFyIG9wdHMgPSAob3B0aW9ucyAhPSBudWxsKSA/IG9wdGlvbnMgOiB7fTsKICAgICAgICB2YXIgZmlsbCA9IChvcHRzLmZpbGwgIT0gbnVsbCkgPyBvcHRzLmZpbGwgOiB0aGlzLmZpbGw7CiAgICAgICAgdmFyIGZpbGxSZWN0ID0gKG9wdHMuZmlsbFJlY3QgIT0gbnVsbCkgPyBvcHRzLmZpbGxSZWN0IDogdGhpcy5maWxsUmVjdDsKICAgICAgICB2YXIgY2xvc2VQYXRoID0gKG9wdHMuY2xvc2VQYXRoICE9IG51bGwpID8gb3B0cy5jbG9zZVBhdGggOiB0aGlzLmNsb3NlUGF0aDsKICAgICAgICB2YXIgb2Zmc2V0ID0gKG9wdHMub2Zmc2V0ICE9IG51bGwpID8gb3B0cy5vZmZzZXQgOiB0aGlzLm9mZnNldDsKICAgICAgICB2YXIgYWxwaGEgPSAob3B0cy5hbHBoYSAhPSBudWxsKSA/IG9wdHMuYWxwaGEgOiB0aGlzLmFscGhhOwogICAgICAgIHZhciBkZXB0aCA9IChvcHRzLmRlcHRoICE9IG51bGwpID8gb3B0cy5kZXB0aCA6IHRoaXMuZGVwdGg7CiAgICAgICAgdmFyIGlzYXJjID0gKG9wdHMuaXNhcmMgIT0gbnVsbCkgPyBvcHRzLmlzYXJjIDogdGhpcy5pc2FyYzsKICAgICAgICB2YXIgbGluZVBhdHRlcm4gPSAob3B0cy5saW5lUGF0dGVybiAhPSBudWxsKSA/IG9wdHMubGluZVBhdHRlcm4gOiB0aGlzLmxpbmVQYXR0ZXJuOwogICAgICAgIGN0eC5saW5lV2lkdGggPSAob3B0cy5saW5lV2lkdGggIT0gbnVsbCkgPyBvcHRzLmxpbmVXaWR0aCA6IHRoaXMubGluZVdpZHRoOwogICAgICAgIGN0eC5saW5lSm9pbiA9IChvcHRzLmxpbmVKb2luICE9IG51bGwpID8gb3B0cy5saW5lSm9pbiA6IHRoaXMubGluZUpvaW47CiAgICAgICAgY3R4LmxpbmVDYXAgPSAob3B0cy5saW5lQ2FwICE9IG51bGwpID8gb3B0cy5saW5lQ2FwIDogdGhpcy5saW5lQ2FwOwogICAgICAgIGN0eC5zdHJva2VTdHlsZSA9IG9wdHMuc3Ryb2tlU3R5bGUgfHwgdGhpcy5zdHJva2VTdHlsZSB8fCAncmdiYSgwLDAsMCwnK2FscGhhKycpJzsKICAgICAgICBjdHguZmlsbFN0eWxlID0gb3B0cy5maWxsU3R5bGUgfHwgdGhpcy5maWxsU3R5bGUgfHwgJ3JnYmEoMCwwLDAsJythbHBoYSsnKSc7CiAgICAgICAgZm9yICh2YXIgaj0wOyBqPGRlcHRoOyBqKyspIHsKICAgICAgICAgICAgdmFyIGN0eFBhdHRlcm4gPSAkLmpxcGxvdC5MaW5lUGF0dGVybihjdHgsIGxpbmVQYXR0ZXJuKTsKICAgICAgICAgICAgY3R4LnRyYW5zbGF0ZShNYXRoLmNvcyh0aGlzLmFuZ2xlKk1hdGguUEkvMTgwKSpvZmZzZXQsIE1hdGguc2luKHRoaXMuYW5nbGUqTWF0aC5QSS8xODApKm9mZnNldCk7CiAgICAgICAgICAgIGN0eFBhdHRlcm4uYmVnaW5QYXRoKCk7CiAgICAgICAgICAgIGlmIChpc2FyYykgewogICAgICAgICAgICAgICAgY3R4LmFyYyhwb2ludHNbMF0sIHBvaW50c1sxXSwgcG9pbnRzWzJdLCBwb2ludHNbM10sIHBvaW50c1s0XSwgdHJ1ZSk7ICAgICAgICAgICAgICAgIAogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKGZpbGxSZWN0KSB7CiAgICAgICAgICAgICAgICBpZiAoZmlsbFJlY3QpIHsKICAgICAgICAgICAgICAgICAgICBjdHguZmlsbFJlY3QocG9pbnRzWzBdLCBwb2ludHNbMV0sIHBvaW50c1syXSwgcG9pbnRzWzNdKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChwb2ludHMgJiYgcG9pbnRzLmxlbmd0aCl7CiAgICAgICAgICAgICAgICB2YXIgbW92ZSA9IHRydWU7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpPTA7IGk8cG9pbnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gc2tpcCB0byB0aGUgZmlyc3Qgbm9uLW51bGwgcG9pbnQgYW5kIG1vdmUgdG8gaXQuCiAgICAgICAgICAgICAgICAgICAgaWYgKHBvaW50c1tpXVswXSAhPSBudWxsICYmIHBvaW50c1tpXVsxXSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtb3ZlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHhQYXR0ZXJuLm1vdmVUbyhwb2ludHNbaV1bMF0sIHBvaW50c1tpXVsxXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3ZlID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHhQYXR0ZXJuLmxpbmVUbyhwb2ludHNbaV1bMF0sIHBvaW50c1tpXVsxXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1vdmUgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIAogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChjbG9zZVBhdGgpIHsKICAgICAgICAgICAgICAgIGN0eFBhdHRlcm4uY2xvc2VQYXRoKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGZpbGwpIHsKICAgICAgICAgICAgICAgIGN0eC5maWxsKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBjdHguc3Ryb2tlKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY3R4LnJlc3RvcmUoKTsKICAgIH07CiAgICAKICAgIC8vIGNsYXNzOiAkLmpxcGxvdC5zaGFwZVJlbmRlcmVyCiAgICAvLyBUaGUgZGVmYXVsdCBqcVBsb3Qgc2hhcGUgcmVuZGVyZXIuICBHaXZlbiBhIHNldCBvZiBwb2ludHMgd2lsbAogICAgLy8gcGxvdCB0aGVtIGFuZCBlaXRoZXIgc3Ryb2tlIGEgbGluZSAoZmlsbCA9IGZhbHNlKSBvciBmaWxsIHRoZW0gKGZpbGwgPSB0cnVlKS4KICAgIC8vIElmIGEgZmlsbGVkIHNoYXBlIGlzIGRlc2lyZWQsIGNsb3NlUGF0aCA9IHRydWUgbXVzdCBhbHNvIGJlIHNldCB0byBjbG9zZQogICAgLy8gdGhlIHNoYXBlLgogICAgJC5qcXBsb3QuU2hhcGVSZW5kZXJlciA9IGZ1bmN0aW9uKG9wdGlvbnMpewogICAgICAgIAogICAgICAgIHRoaXMubGluZVdpZHRoID0gMS41OwogICAgICAgIC8vIHByb3A6IGxpbmVQYXR0ZXJuCiAgICAgICAgLy8gbGluZSBwYXR0ZXJuICdkYXNoZWQnLCAnZG90dGVkJywgJ3NvbGlkJywgc29tZSBjb21iaW5hdGlvbgogICAgICAgIC8vIG9mICctJyBhbmQgJy4nIGNoYXJhY3RlcnMgc3VjaCBhcyAnLi0uJyBvciBhIG51bWVyaWNhbCBhcnJheSBsaWtlIAogICAgICAgIC8vIFtkcmF3LCBza2lwLCBkcmF3LCBza2lwLCAuLi5dIHN1Y2ggYXMgWzEsIDEwXSB0byBkcmF3IGEgZG90dGVkIGxpbmUsIAogICAgICAgIC8vIFsxLCAxMCwgMjAsIDEwXSB0byBkcmF3IGEgZG90LWRhc2ggbGluZSwgYW5kIHNvIG9uLgogICAgICAgIHRoaXMubGluZVBhdHRlcm4gPSAnc29saWQnOwogICAgICAgIC8vIHByb3A6IGxpbmVKb2luCiAgICAgICAgLy8gSG93IGxpbmUgc2VnbWVudHMgb2YgdGhlIHNoYWRvdyBhcmUgam9pbmVkLgogICAgICAgIHRoaXMubGluZUpvaW4gPSAnbWl0ZXInOwogICAgICAgIC8vIHByb3A6IGxpbmVDYXAKICAgICAgICAvLyBob3cgZW5kcyBvZiB0aGUgc2hhZG93IGxpbmUgYXJlIHJlbmRlcmVkLgogICAgICAgIHRoaXMubGluZUNhcCA9ICdyb3VuZCc7CiAgICAgICAgLy8gcHJvcDsgY2xvc2VQYXRoCiAgICAgICAgLy8gd2hldGhlciBsaW5lIHBhdGggc2VnbWVudCBpcyBjbG9zZWQgdXBvbiBpdHNlbGYuCiAgICAgICAgdGhpcy5jbG9zZVBhdGggPSBmYWxzZTsKICAgICAgICAvLyBwcm9wOiBmaWxsCiAgICAgICAgLy8gd2hldGhlciB0byBmaWxsIHRoZSBzaGFwZS4KICAgICAgICB0aGlzLmZpbGwgPSBmYWxzZTsKICAgICAgICAvLyBwcm9wOiBpc2FyYwogICAgICAgIC8vIHdldGhlciB0aGUgc2hhZG93IGlzIGFuIGFyYyBvciBub3QuCiAgICAgICAgdGhpcy5pc2FyYyA9IGZhbHNlOwogICAgICAgIC8vIHByb3A6IGZpbGxSZWN0CiAgICAgICAgLy8gdHJ1ZSB0byBkcmF3IHNoYXBlIGFzIGEgZmlsbGVkIHJlY3RhbmdsZS4KICAgICAgICB0aGlzLmZpbGxSZWN0ID0gZmFsc2U7CiAgICAgICAgLy8gcHJvcDogc3Ryb2tlUmVjdAogICAgICAgIC8vIHRydWUgdG8gZHJhdyBzaGFwZSBhcyBhIHN0cm9rZWQgcmVjdGFuZ2xlLgogICAgICAgIHRoaXMuc3Ryb2tlUmVjdCA9IGZhbHNlOwogICAgICAgIC8vIHByb3A6IGNsZWFyUmVjdAogICAgICAgIC8vIHRydWUgdG8gY2VhciBhIHJlY3RhbmdsZS4KICAgICAgICB0aGlzLmNsZWFyUmVjdCA9IGZhbHNlOwogICAgICAgIC8vIHByb3A6IHN0cm9rZVN0eWxlCiAgICAgICAgLy8gY3NzIGNvbG9yIHNwZWMgZm9yIHRoZSBzdG9rZSBzdHlsZQogICAgICAgIHRoaXMuc3Ryb2tlU3R5bGUgPSAnIzk5OTk5OSc7CiAgICAgICAgLy8gcHJvcDogZmlsbFN0eWxlCiAgICAgICAgLy8gY3NzIGNvbG9yIHNwZWMgZm9yIHRoZSBmaWxsIHN0eWxlLgogICAgICAgIHRoaXMuZmlsbFN0eWxlID0gJyM5OTk5OTknOyAKICAgICAgICAKICAgICAgICAkLmV4dGVuZCh0cnVlLCB0aGlzLCBvcHRpb25zKTsKICAgIH07CiAgICAKICAgICQuanFwbG90LlNoYXBlUmVuZGVyZXIucHJvdG90eXBlLmluaXQgPSBmdW5jdGlvbihvcHRpb25zKSB7CiAgICAgICAgJC5leHRlbmQodHJ1ZSwgdGhpcywgb3B0aW9ucyk7CiAgICB9OwogICAgCiAgICAvLyBmdW5jdGlvbjogZHJhdwogICAgLy8gZHJhd3MgdGhlIHNoYXBlLgogICAgLy8KICAgIC8vIGN0eCAtIGNhbnZhcyBkcmF3aW5nIGNvbnRleHQKICAgIC8vIHBvaW50cyAtIGFycmF5IG9mIHBvaW50cyBmb3Igc2hhcGVzIG9yIAogICAgLy8gW3gsIHksIHdpZHRoLCBoZWlnaHRdIGZvciByZWN0YW5nbGVzIG9yCiAgICAvLyBbeCwgeSwgcmFkaXVzLCBzdGFydCBhbmdsZSAocmFkKSwgZW5kIGFuZ2xlIChyYWQpXSBmb3IgY2lyY2xlcyBhbmQgYXJjcy4KICAgICQuanFwbG90LlNoYXBlUmVuZGVyZXIucHJvdG90eXBlLmRyYXcgPSBmdW5jdGlvbihjdHgsIHBvaW50cywgb3B0aW9ucykgewogICAgICAgIGN0eC5zYXZlKCk7CiAgICAgICAgdmFyIG9wdHMgPSAob3B0aW9ucyAhPSBudWxsKSA/IG9wdGlvbnMgOiB7fTsKICAgICAgICB2YXIgZmlsbCA9IChvcHRzLmZpbGwgIT0gbnVsbCkgPyBvcHRzLmZpbGwgOiB0aGlzLmZpbGw7CiAgICAgICAgdmFyIGNsb3NlUGF0aCA9IChvcHRzLmNsb3NlUGF0aCAhPSBudWxsKSA/IG9wdHMuY2xvc2VQYXRoIDogdGhpcy5jbG9zZVBhdGg7CiAgICAgICAgdmFyIGZpbGxSZWN0ID0gKG9wdHMuZmlsbFJlY3QgIT0gbnVsbCkgPyBvcHRzLmZpbGxSZWN0IDogdGhpcy5maWxsUmVjdDsKICAgICAgICB2YXIgc3Ryb2tlUmVjdCA9IChvcHRzLnN0cm9rZVJlY3QgIT0gbnVsbCkgPyBvcHRzLnN0cm9rZVJlY3QgOiB0aGlzLnN0cm9rZVJlY3Q7CiAgICAgICAgdmFyIGNsZWFyUmVjdCA9IChvcHRzLmNsZWFyUmVjdCAhPSBudWxsKSA/IG9wdHMuY2xlYXJSZWN0IDogdGhpcy5jbGVhclJlY3Q7CiAgICAgICAgdmFyIGlzYXJjID0gKG9wdHMuaXNhcmMgIT0gbnVsbCkgPyBvcHRzLmlzYXJjIDogdGhpcy5pc2FyYzsKICAgICAgICB2YXIgbGluZVBhdHRlcm4gPSAob3B0cy5saW5lUGF0dGVybiAhPSBudWxsKSA/IG9wdHMubGluZVBhdHRlcm4gOiB0aGlzLmxpbmVQYXR0ZXJuOwogICAgICAgIHZhciBjdHhQYXR0ZXJuID0gJC5qcXBsb3QuTGluZVBhdHRlcm4oY3R4LCBsaW5lUGF0dGVybik7CiAgICAgICAgY3R4LmxpbmVXaWR0aCA9IG9wdHMubGluZVdpZHRoIHx8IHRoaXMubGluZVdpZHRoOwogICAgICAgIGN0eC5saW5lSm9pbiA9IG9wdHMubGluZUpvaW4gfHwgdGhpcy5saW5lSm9pbjsKICAgICAgICBjdHgubGluZUNhcCA9IG9wdHMubGluZUNhcCB8fCB0aGlzLmxpbmVDYXA7CiAgICAgICAgY3R4LnN0cm9rZVN0eWxlID0gKG9wdHMuc3Ryb2tlU3R5bGUgfHwgb3B0cy5jb2xvcikgfHwgdGhpcy5zdHJva2VTdHlsZTsKICAgICAgICBjdHguZmlsbFN0eWxlID0gb3B0cy5maWxsU3R5bGUgfHwgdGhpcy5maWxsU3R5bGU7CiAgICAgICAgY3R4LmJlZ2luUGF0aCgpOwogICAgICAgIGlmIChpc2FyYykgewogICAgICAgICAgICBjdHguYXJjKHBvaW50c1swXSwgcG9pbnRzWzFdLCBwb2ludHNbMl0sIHBvaW50c1szXSwgcG9pbnRzWzRdLCB0cnVlKTsgICAKICAgICAgICAgICAgaWYgKGNsb3NlUGF0aCkgewogICAgICAgICAgICAgICAgY3R4LmNsb3NlUGF0aCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChmaWxsKSB7CiAgICAgICAgICAgICAgICBjdHguZmlsbCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgY3R4LnN0cm9rZSgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGN0eC5yZXN0b3JlKCk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoY2xlYXJSZWN0KSB7CiAgICAgICAgICAgIGN0eC5jbGVhclJlY3QocG9pbnRzWzBdLCBwb2ludHNbMV0sIHBvaW50c1syXSwgcG9pbnRzWzNdKTsKICAgICAgICAgICAgY3R4LnJlc3RvcmUoKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChmaWxsUmVjdCB8fCBzdHJva2VSZWN0KSB7CiAgICAgICAgICAgIGlmIChmaWxsUmVjdCkgewogICAgICAgICAgICAgICAgY3R4LmZpbGxSZWN0KHBvaW50c1swXSwgcG9pbnRzWzFdLCBwb2ludHNbMl0sIHBvaW50c1szXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHN0cm9rZVJlY3QpIHsKICAgICAgICAgICAgICAgIGN0eC5zdHJva2VSZWN0KHBvaW50c1swXSwgcG9pbnRzWzFdLCBwb2ludHNbMl0sIHBvaW50c1szXSk7CiAgICAgICAgICAgICAgICBjdHgucmVzdG9yZSgpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHBvaW50cyAmJiBwb2ludHMubGVuZ3RoKXsKICAgICAgICAgICAgdmFyIG1vdmUgPSB0cnVlOwogICAgICAgICAgICBmb3IgKHZhciBpPTA7IGk8cG9pbnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAvLyBza2lwIHRvIHRoZSBmaXJzdCBub24tbnVsbCBwb2ludCBhbmQgbW92ZSB0byBpdC4KICAgICAgICAgICAgICAgIGlmIChwb2ludHNbaV1bMF0gIT0gbnVsbCAmJiBwb2ludHNbaV1bMV0gIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIGlmIChtb3ZlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGN0eFBhdHRlcm4ubW92ZVRvKHBvaW50c1tpXVswXSwgcG9pbnRzW2ldWzFdKTsKICAgICAgICAgICAgICAgICAgICAgICAgbW92ZSA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgY3R4UGF0dGVybi5saW5lVG8ocG9pbnRzW2ldWzBdLCBwb2ludHNbaV1bMV0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIG1vdmUgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChjbG9zZVBhdGgpIHsKICAgICAgICAgICAgICAgIGN0eFBhdHRlcm4uY2xvc2VQYXRoKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGZpbGwpIHsKICAgICAgICAgICAgICAgIGN0eC5maWxsKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBjdHguc3Ryb2tlKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY3R4LnJlc3RvcmUoKTsKICAgIH07CiAgICAKICAgIC8vIGNsYXNzICQuanFwbG90LlRhYmxlTGVnZW5kUmVuZGVyZXIKICAgIC8vIFRoZSBkZWZhdWx0IGxlZ2VuZCByZW5kZXJlciBmb3IganFQbG90LgogICAgJC5qcXBsb3QuVGFibGVMZWdlbmRSZW5kZXJlciA9IGZ1bmN0aW9uKCl7CiAgICAgICAgLy8KICAgIH07CiAgICAKICAgICQuanFwbG90LlRhYmxlTGVnZW5kUmVuZGVyZXIucHJvdG90eXBlLmluaXQgPSBmdW5jdGlvbihvcHRpb25zKSB7CiAgICAgICAgJC5leHRlbmQodHJ1ZSwgdGhpcywgb3B0aW9ucyk7CiAgICB9OwogICAgICAgIAogICAgJC5qcXBsb3QuVGFibGVMZWdlbmRSZW5kZXJlci5wcm90b3R5cGUuYWRkcm93ID0gZnVuY3Rpb24gKGxhYmVsLCBjb2xvciwgcGFkLCByZXZlcnNlKSB7CiAgICAgICAgdmFyIHJzID0gKHBhZCkgPyB0aGlzLnJvd1NwYWNpbmcrJ3B4JyA6ICcwcHgnOwogICAgICAgIHZhciB0cjsKICAgICAgICB2YXIgdGQ7CiAgICAgICAgdmFyIGVsZW07CiAgICAgICAgdmFyIGRpdjA7CiAgICAgICAgdmFyIGRpdjE7CiAgICAgICAgZWxlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CiAgICAgICAgdHIgPSAkKGVsZW0pOwogICAgICAgIHRyLmFkZENsYXNzKCdqcXBsb3QtdGFibGUtbGVnZW5kJyk7CiAgICAgICAgZWxlbSA9IG51bGw7CgogICAgICAgIGlmIChyZXZlcnNlKXsKICAgICAgICAgICAgdHIucHJlcGVuZFRvKHRoaXMuX2VsZW0pOwogICAgICAgIH0KCiAgICAgICAgZWxzZXsKICAgICAgICAgICAgdHIuYXBwZW5kVG8odGhpcy5fZWxlbSk7CiAgICAgICAgfQoKICAgICAgICBpZiAodGhpcy5zaG93U3dhdGNoZXMpIHsKICAgICAgICAgICAgdGQgPSAkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RkJykpOwogICAgICAgICAgICB0ZC5hZGRDbGFzcygnanFwbG90LXRhYmxlLWxlZ2VuZCBqcXBsb3QtdGFibGUtbGVnZW5kLXN3YXRjaCcpOwogICAgICAgICAgICB0ZC5jc3Moe3RleHRBbGlnbjogJ2NlbnRlcicsIHBhZGRpbmdUb3A6IHJzfSk7CgogICAgICAgICAgICBkaXYwID0gJChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSk7CiAgICAgICAgICAgIGRpdjAuYWRkQ2xhc3MoJ2pxcGxvdC10YWJsZS1sZWdlbmQtc3dhdGNoLW91dGxpbmUnKTsKICAgICAgICAgICAgZGl2MSA9ICQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykpOwogICAgICAgICAgICBkaXYxLmFkZENsYXNzKCdqcXBsb3QtdGFibGUtbGVnZW5kLXN3YXRjaCcpOwogICAgICAgICAgICBkaXYxLmNzcyh7YmFja2dyb3VuZENvbG9yOiBjb2xvciwgYm9yZGVyQ29sb3I6IGNvbG9yfSk7CgogICAgICAgICAgICB0ci5hcHBlbmQodGQuYXBwZW5kKGRpdjAuYXBwZW5kKGRpdjEpKSk7CgogICAgICAgICAgICAvLyAkKCc8dGQgY2xhc3M9ImpxcGxvdC10YWJsZS1sZWdlbmQiIHN0eWxlPSJ0ZXh0LWFsaWduOmNlbnRlcjtwYWRkaW5nLXRvcDonK3JzKyc7Ij4nKwogICAgICAgICAgICAvLyAnPGRpdj48ZGl2IGNsYXNzPSJqcXBsb3QtdGFibGUtbGVnZW5kLXN3YXRjaCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6Jytjb2xvcisnO2JvcmRlci1jb2xvcjonK2NvbG9yKyc7Ij48L2Rpdj4nKwogICAgICAgICAgICAvLyAnPC9kaXY+PC90ZD4nKS5hcHBlbmRUbyh0cik7CiAgICAgICAgfQogICAgICAgIGlmICh0aGlzLnNob3dMYWJlbHMpIHsKICAgICAgICAgICAgdGQgPSAkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RkJykpOwogICAgICAgICAgICB0ZC5hZGRDbGFzcygnanFwbG90LXRhYmxlLWxlZ2VuZCBqcXBsb3QtdGFibGUtbGVnZW5kLWxhYmVsJyk7CiAgICAgICAgICAgIHRkLmNzcygncGFkZGluZ1RvcCcsIHJzKTsKICAgICAgICAgICAgdHIuYXBwZW5kKHRkKTsKCiAgICAgICAgICAgIC8vIGVsZW0gPSAkKCc8dGQgY2xhc3M9ImpxcGxvdC10YWJsZS1sZWdlbmQiIHN0eWxlPSJwYWRkaW5nLXRvcDonK3JzKyc7Ij48L3RkPicpOwogICAgICAgICAgICAvLyBlbGVtLmFwcGVuZFRvKHRyKTsKICAgICAgICAgICAgaWYgKHRoaXMuZXNjYXBlSHRtbCkgewogICAgICAgICAgICAgICAgdGQudGV4dChsYWJlbCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICB0ZC5odG1sKGxhYmVsKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB0ZCA9IG51bGw7CiAgICAgICAgZGl2MCA9IG51bGw7CiAgICAgICAgZGl2MSA9IG51bGw7CiAgICAgICAgdHIgPSBudWxsOwogICAgICAgIGVsZW0gPSBudWxsOwogICAgfTsKICAgIAogICAgLy8gY2FsbGVkIHdpdGggc2NvcGUgb2YgbGVnZW5kCiAgICAkLmpxcGxvdC5UYWJsZUxlZ2VuZFJlbmRlcmVyLnByb3RvdHlwZS5kcmF3ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgaWYgKHRoaXMuX2VsZW0pIHsKICAgICAgICAgICAgdGhpcy5fZWxlbS5lbXB0eUZvcmNlKCk7CiAgICAgICAgICAgIHRoaXMuX2VsZW0gPSBudWxsOwogICAgICAgIH0KCiAgICAgICAgaWYgKHRoaXMuc2hvdykgewogICAgICAgICAgICB2YXIgc2VyaWVzID0gdGhpcy5fc2VyaWVzOwogICAgICAgICAgICAvLyBtYWtlIGEgdGFibGUuICBvbmUgbGluZSBsYWJlbCBwZXIgcm93LgogICAgICAgICAgICB2YXIgZWxlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RhYmxlJyk7CiAgICAgICAgICAgIHRoaXMuX2VsZW0gPSAkKGVsZW0pOwogICAgICAgICAgICB0aGlzLl9lbGVtLmFkZENsYXNzKCdqcXBsb3QtdGFibGUtbGVnZW5kJyk7CgogICAgICAgICAgICB2YXIgc3MgPSB7cG9zaXRpb246J2Fic29sdXRlJ307CiAgICAgICAgICAgIGlmICh0aGlzLmJhY2tncm91bmQpIHsKICAgICAgICAgICAgICAgIHNzWydiYWNrZ3JvdW5kJ10gPSB0aGlzLmJhY2tncm91bmQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRoaXMuYm9yZGVyKSB7CiAgICAgICAgICAgICAgICBzc1snYm9yZGVyJ10gPSB0aGlzLmJvcmRlcjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGhpcy5mb250U2l6ZSkgewogICAgICAgICAgICAgICAgc3NbJ2ZvbnRTaXplJ10gPSB0aGlzLmZvbnRTaXplOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0aGlzLmZvbnRGYW1pbHkpIHsKICAgICAgICAgICAgICAgIHNzWydmb250RmFtaWx5J10gPSB0aGlzLmZvbnRGYW1pbHk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRoaXMudGV4dENvbG9yKSB7CiAgICAgICAgICAgICAgICBzc1sndGV4dENvbG9yJ10gPSB0aGlzLnRleHRDb2xvcjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGhpcy5tYXJnaW5Ub3AgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgc3NbJ21hcmdpblRvcCddID0gdGhpcy5tYXJnaW5Ub3A7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRoaXMubWFyZ2luQm90dG9tICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIHNzWydtYXJnaW5Cb3R0b20nXSA9IHRoaXMubWFyZ2luQm90dG9tOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0aGlzLm1hcmdpbkxlZnQgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgc3NbJ21hcmdpbkxlZnQnXSA9IHRoaXMubWFyZ2luTGVmdDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGhpcy5tYXJnaW5SaWdodCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICBzc1snbWFyZ2luUmlnaHQnXSA9IHRoaXMubWFyZ2luUmlnaHQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgICAgIHZhciBwYWQgPSBmYWxzZSwgCiAgICAgICAgICAgICAgICByZXZlcnNlID0gZmFsc2UsCgkJCQlzOwogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaTwgc2VyaWVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICBzID0gc2VyaWVzW2ldOwogICAgICAgICAgICAgICAgaWYgKHMuX3N0YWNrIHx8IHMucmVuZGVyZXIuY29uc3RydWN0b3IgPT0gJC5qcXBsb3QuQmV6aWVyQ3VydmVSZW5kZXJlcil7CiAgICAgICAgICAgICAgICAgICAgcmV2ZXJzZSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAocy5zaG93ICYmIHMuc2hvd0xhYmVsKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGx0ID0gdGhpcy5sYWJlbHNbaV0gfHwgcy5sYWJlbC50b1N0cmluZygpOwogICAgICAgICAgICAgICAgICAgIGlmIChsdCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgY29sb3IgPSBzLmNvbG9yOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV2ZXJzZSAmJiBpIDwgc2VyaWVzLmxlbmd0aCAtIDEpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChyZXZlcnNlICYmIGkgPT0gc2VyaWVzLmxlbmd0aCAtIDEpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5hZGRyb3cuY2FsbCh0aGlzLCBsdCwgY29sb3IsIHBhZCwgcmV2ZXJzZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHBhZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC8vIGxldCBwbHVnaW5zIGFkZCBtb3JlIHJvd3MgdG8gbGVnZW5kLiAgVXNlZCBieSB0cmVuZCBsaW5lIHBsdWdpbi4KICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBqPTA7IGo8JC5qcXBsb3QuYWRkTGVnZW5kUm93SG9va3MubGVuZ3RoOyBqKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGl0ZW0gPSAkLmpxcGxvdC5hZGRMZWdlbmRSb3dIb29rc1tqXS5jYWxsKHRoaXMsIHMpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5hZGRyb3cuY2FsbCh0aGlzLCBpdGVtLmxhYmVsLCBpdGVtLmNvbG9yLCBwYWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfSAKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgbHQgPSBudWxsOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzLl9lbGVtOwogICAgfTsKICAgIAogICAgJC5qcXBsb3QuVGFibGVMZWdlbmRSZW5kZXJlci5wcm90b3R5cGUucGFjayA9IGZ1bmN0aW9uKG9mZnNldHMpIHsKICAgICAgICBpZiAodGhpcy5zaG93KSB7ICAgICAgIAogICAgICAgICAgICBpZiAodGhpcy5wbGFjZW1lbnQgPT0gJ2luc2lkZUdyaWQnKSB7CiAgICAgICAgICAgICAgICBzd2l0Y2ggKHRoaXMubG9jYXRpb24pIHsKICAgICAgICAgICAgICAgICAgICBjYXNlICdudyc6CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gb2Zmc2V0cy5sZWZ0OwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYiA9IG9mZnNldHMudG9wOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9lbGVtLmNzcygnbGVmdCcsIGEpOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9lbGVtLmNzcygndG9wJywgYik7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgJ24nOgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IChvZmZzZXRzLmxlZnQgKyAodGhpcy5fcGxvdERpbWVuc2lvbnMud2lkdGggLSBvZmZzZXRzLnJpZ2h0KSkvMiAtIHRoaXMuZ2V0V2lkdGgoKS8yOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYiA9IG9mZnNldHMudG9wOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9lbGVtLmNzcygnbGVmdCcsIGEpOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9lbGVtLmNzcygndG9wJywgYik7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgJ25lJzoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSBvZmZzZXRzLnJpZ2h0OwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYiA9IG9mZnNldHMudG9wOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9lbGVtLmNzcyh7cmlnaHQ6YSwgdG9wOmJ9KTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAnZSc6CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gb2Zmc2V0cy5yaWdodDsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGIgPSAob2Zmc2V0cy50b3AgKyAodGhpcy5fcGxvdERpbWVuc2lvbnMuaGVpZ2h0IC0gb2Zmc2V0cy5ib3R0b20pKS8yIC0gdGhpcy5nZXRIZWlnaHQoKS8yOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9lbGVtLmNzcyh7cmlnaHQ6YSwgdG9wOmJ9KTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAnc2UnOgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IG9mZnNldHMucmlnaHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBiID0gb2Zmc2V0cy5ib3R0b207CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2VsZW0uY3NzKHtyaWdodDphLCBib3R0b206Yn0pOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlICdzJzoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSAob2Zmc2V0cy5sZWZ0ICsgKHRoaXMuX3Bsb3REaW1lbnNpb25zLndpZHRoIC0gb2Zmc2V0cy5yaWdodCkpLzIgLSB0aGlzLmdldFdpZHRoKCkvMjsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGIgPSBvZmZzZXRzLmJvdHRvbTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZWxlbS5jc3Moe2xlZnQ6YSwgYm90dG9tOmJ9KTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAnc3cnOgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IG9mZnNldHMubGVmdDsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGIgPSBvZmZzZXRzLmJvdHRvbTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZWxlbS5jc3Moe2xlZnQ6YSwgYm90dG9tOmJ9KTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAndyc6CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gb2Zmc2V0cy5sZWZ0OwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYiA9IChvZmZzZXRzLnRvcCArICh0aGlzLl9wbG90RGltZW5zaW9ucy5oZWlnaHQgLSBvZmZzZXRzLmJvdHRvbSkpLzIgLSB0aGlzLmdldEhlaWdodCgpLzI7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2VsZW0uY3NzKHtsZWZ0OmEsIHRvcDpifSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6ICAvLyBzYW1lIGFzICdzZScKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSBvZmZzZXRzLnJpZ2h0OwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYiA9IG9mZnNldHMuYm90dG9tOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9lbGVtLmNzcyh7cmlnaHQ6YSwgYm90dG9tOmJ9KTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICh0aGlzLnBsYWNlbWVudCA9PSAnb3V0c2lkZScpewogICAgICAgICAgICAgICAgc3dpdGNoICh0aGlzLmxvY2F0aW9uKSB7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAnbncnOgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IHRoaXMuX3Bsb3REaW1lbnNpb25zLndpZHRoIC0gb2Zmc2V0cy5sZWZ0OwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYiA9IG9mZnNldHMudG9wOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9lbGVtLmNzcygncmlnaHQnLCBhKTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZWxlbS5jc3MoJ3RvcCcsIGIpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlICduJzoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSAob2Zmc2V0cy5sZWZ0ICsgKHRoaXMuX3Bsb3REaW1lbnNpb25zLndpZHRoIC0gb2Zmc2V0cy5yaWdodCkpLzIgLSB0aGlzLmdldFdpZHRoKCkvMjsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGIgPSB0aGlzLl9wbG90RGltZW5zaW9ucy5oZWlnaHQgLSBvZmZzZXRzLnRvcDsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZWxlbS5jc3MoJ2xlZnQnLCBhKTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZWxlbS5jc3MoJ2JvdHRvbScsIGIpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlICduZSc6CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gdGhpcy5fcGxvdERpbWVuc2lvbnMud2lkdGggLSBvZmZzZXRzLnJpZ2h0OwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYiA9IG9mZnNldHMudG9wOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9lbGVtLmNzcyh7bGVmdDphLCB0b3A6Yn0pOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlICdlJzoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSB0aGlzLl9wbG90RGltZW5zaW9ucy53aWR0aCAtIG9mZnNldHMucmlnaHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBiID0gKG9mZnNldHMudG9wICsgKHRoaXMuX3Bsb3REaW1lbnNpb25zLmhlaWdodCAtIG9mZnNldHMuYm90dG9tKSkvMiAtIHRoaXMuZ2V0SGVpZ2h0KCkvMjsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZWxlbS5jc3Moe2xlZnQ6YSwgdG9wOmJ9KTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAnc2UnOgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IHRoaXMuX3Bsb3REaW1lbnNpb25zLndpZHRoIC0gb2Zmc2V0cy5yaWdodDsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGIgPSBvZmZzZXRzLmJvdHRvbTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZWxlbS5jc3Moe2xlZnQ6YSwgYm90dG9tOmJ9KTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAncyc6CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gKG9mZnNldHMubGVmdCArICh0aGlzLl9wbG90RGltZW5zaW9ucy53aWR0aCAtIG9mZnNldHMucmlnaHQpKS8yIC0gdGhpcy5nZXRXaWR0aCgpLzI7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBiID0gdGhpcy5fcGxvdERpbWVuc2lvbnMuaGVpZ2h0IC0gb2Zmc2V0cy5ib3R0b207CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2VsZW0uY3NzKHtsZWZ0OmEsIHRvcDpifSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgJ3N3JzoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSB0aGlzLl9wbG90RGltZW5zaW9ucy53aWR0aCAtIG9mZnNldHMubGVmdDsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGIgPSBvZmZzZXRzLmJvdHRvbTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZWxlbS5jc3Moe3JpZ2h0OmEsIGJvdHRvbTpifSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgJ3cnOgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IHRoaXMuX3Bsb3REaW1lbnNpb25zLndpZHRoIC0gb2Zmc2V0cy5sZWZ0OwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYiA9IChvZmZzZXRzLnRvcCArICh0aGlzLl9wbG90RGltZW5zaW9ucy5oZWlnaHQgLSBvZmZzZXRzLmJvdHRvbSkpLzIgLSB0aGlzLmdldEhlaWdodCgpLzI7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2VsZW0uY3NzKHtyaWdodDphLCB0b3A6Yn0pOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiAgLy8gc2FtZSBhcyAnc2UnCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gb2Zmc2V0cy5yaWdodDsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGIgPSBvZmZzZXRzLmJvdHRvbTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZWxlbS5jc3Moe3JpZ2h0OmEsIGJvdHRvbTpifSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgc3dpdGNoICh0aGlzLmxvY2F0aW9uKSB7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAnbncnOgogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9lbGVtLmNzcyh7bGVmdDowLCB0b3A6b2Zmc2V0cy50b3B9KTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAnbic6CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gKG9mZnNldHMubGVmdCArICh0aGlzLl9wbG90RGltZW5zaW9ucy53aWR0aCAtIG9mZnNldHMucmlnaHQpKS8yIC0gdGhpcy5nZXRXaWR0aCgpLzI7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2VsZW0uY3NzKHtsZWZ0OiBhLCB0b3A6b2Zmc2V0cy50b3B9KTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAnbmUnOgogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9lbGVtLmNzcyh7cmlnaHQ6MCwgdG9wOm9mZnNldHMudG9wfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgJ2UnOgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYiA9IChvZmZzZXRzLnRvcCArICh0aGlzLl9wbG90RGltZW5zaW9ucy5oZWlnaHQgLSBvZmZzZXRzLmJvdHRvbSkpLzIgLSB0aGlzLmdldEhlaWdodCgpLzI7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2VsZW0uY3NzKHtyaWdodDpvZmZzZXRzLnJpZ2h0LCB0b3A6Yn0pOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlICdzZSc6CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2VsZW0uY3NzKHtyaWdodDpvZmZzZXRzLnJpZ2h0LCBib3R0b206b2Zmc2V0cy5ib3R0b219KTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAncyc6CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gKG9mZnNldHMubGVmdCArICh0aGlzLl9wbG90RGltZW5zaW9ucy53aWR0aCAtIG9mZnNldHMucmlnaHQpKS8yIC0gdGhpcy5nZXRXaWR0aCgpLzI7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2VsZW0uY3NzKHtsZWZ0OiBhLCBib3R0b206b2Zmc2V0cy5ib3R0b219KTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAnc3cnOgogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9lbGVtLmNzcyh7bGVmdDpvZmZzZXRzLmxlZnQsIGJvdHRvbTpvZmZzZXRzLmJvdHRvbX0pOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlICd3JzoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGIgPSAob2Zmc2V0cy50b3AgKyAodGhpcy5fcGxvdERpbWVuc2lvbnMuaGVpZ2h0IC0gb2Zmc2V0cy5ib3R0b20pKS8yIC0gdGhpcy5nZXRIZWlnaHQoKS8yOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9lbGVtLmNzcyh7bGVmdDpvZmZzZXRzLmxlZnQsIHRvcDpifSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6ICAvLyBzYW1lIGFzICdzZScKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZWxlbS5jc3Moe3JpZ2h0Om9mZnNldHMucmlnaHQsIGJvdHRvbTpvZmZzZXRzLmJvdHRvbX0pOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0gCiAgICB9OwoKICAgIC8qKgogICAgICogQ2xhc3M6ICQuanFwbG90LlRoZW1lRW5naW5lCiAgICAgKiBUaGVtZSBFbmdpbmUgcHJvdmlkZXMgYSBwcm9ncmFtYXRpYyB3YXkgdG8gY2hhbmdlIHNvbWUgb2YgdGhlICBtb3JlCiAgICAgKiBjb21tb24ganFwbG90IHN0eWxpbmcgb3B0aW9ucyBzdWNoIGFzIGZvbnRzLCBjb2xvcnMgYW5kIGdyaWQgb3B0aW9ucy4KICAgICAqIEEgdGhlbWUgZW5naW5lIGluc3RhbmNlIGlzIGNyZWF0ZWQgd2l0aCBlYWNoIHBsb3QuICBUaGUgdGhlbWUgZW5naW5lCiAgICAgKiBtYW5hZ2VzIGEgY29sbGVjdGlvbiBvZiB0aGVtZXMgd2hpY2ggY2FuIGJlIG1vZGlmaWVkLCBhZGRlZCB0bywgb3IgCiAgICAgKiBhcHBsaWVkIHRvIHRoZSBwbG90LgogICAgICogCiAgICAgKiBUaGUgdGhlbWVFbmdpbmUgY2xhc3MgaXMgbm90IGluc3RhbnRpYXRlZCBkaXJlY3RseS4KICAgICAqIFdoZW4gYSBwbG90IGlzIGluaXRpYWxpemVkLCB0aGUgY3VycmVudCBwbG90IG9wdGlvbnMgYXJlIHNjYW5uZWQKICAgICAqIGFuIGEgZGVmYXVsdCB0aGVtZSBuYW1lZCAiRGVmYXVsdCIgaXMgY3JlYXRlZC4gIFRoaXMgdGhlbWUgaXMKICAgICAqIHVzZWQgYXMgdGhlIGJhc2lzIGZvciBvdGhlciB0aGVtZXMgYWRkZWQgdG8gdGhlIHRoZW1lIGVuZ2luZSBhbmQKICAgICAqIGlzIGFsd2F5cyBhdmFpbGFibGUuCiAgICAgKiAKICAgICAqIEEgdGhlbWUgaXMgYSBzaW1wbGUgamF2YXNjcmlwdCBvYmplY3Qgd2l0aCBzdHlsaW5nIHBhcmFtZXRlcnMgZm9yCiAgICAgKiB2YXJpb3VzIGVudGl0aWVzIG9mIHRoZSBwbG90LiAgQSB0aGVtZSBoYXMgdGhlIGZvcm06CiAgICAgKiAKICAgICAqIAogICAgICogPiB7CiAgICAgKiA+ICAgICBfbmFtZTpmICJEZWZhdWx0IiwKICAgICAqID4gICAgIHRhcmdldDogewogICAgICogPiAgICAgICAgIGJhY2tncm91bmRDb2xvcjogInRyYW5zcGFyZW50IgogICAgICogPiAgICAgfSwKICAgICAqID4gICAgIGxlZ2VuZDogewogICAgICogPiAgICAgICAgIHRleHRDb2xvcjogbnVsbCwKICAgICAqID4gICAgICAgICBmb250RmFtaWx5OiBudWxsLAogICAgICogPiAgICAgICAgIGZvbnRTaXplOiBudWxsLAogICAgICogPiAgICAgICAgIGJvcmRlcjogbnVsbCwKICAgICAqID4gICAgICAgICBiYWNrZ3JvdW5kOiBudWxsCiAgICAgKiA+ICAgICB9LAogICAgICogPiAgICAgdGl0bGU6IHsKICAgICAqID4gICAgICAgICB0ZXh0Q29sb3I6ICJyZ2IoMTAyLCAxMDIsIDEwMikiLAogICAgICogPiAgICAgICAgIGZvbnRGYW1pbHk6ICInVHJlYnVjaGV0IE1TJyxBcmlhbCxIZWx2ZXRpY2Esc2Fucy1zZXJpZiIsCiAgICAgKiA+ICAgICAgICAgZm9udFNpemU6ICIxOS4ycHgiLAogICAgICogPiAgICAgICAgIHRleHRBbGlnbjogImNlbnRlciIKICAgICAqID4gICAgIH0sCiAgICAgKiA+ICAgICBzZXJpZXNTdHlsZXM6IHt9LAogICAgICogPiAgICAgc2VyaWVzOiBbewogICAgICogPiAgICAgICAgIGNvbG9yOiAiIzRiYjJjNSIsCiAgICAgKiA+ICAgICAgICAgbGluZVdpZHRoOiAyLjUsCiAgICAgKiA+ICAgICAgICAgbGluZVBhdHRlcm46ICJzb2xpZCIsCiAgICAgKiA+ICAgICAgICAgc2hhZG93OiB0cnVlLAogICAgICogPiAgICAgICAgIGZpbGxDb2xvcjogIiM0YmIyYzUiLAogICAgICogPiAgICAgICAgIHNob3dNYXJrZXI6IHRydWUsCiAgICAgKiA+ICAgICAgICAgbWFya2VyT3B0aW9uczogewogICAgICogPiAgICAgICAgICAgICBjb2xvcjogIiM0YmIyYzUiLAogICAgICogPiAgICAgICAgICAgICBzaG93OiB0cnVlLAogICAgICogPiAgICAgICAgICAgICBzdHlsZTogJ2ZpbGxlZENpcmNsZScsCiAgICAgKiA+ICAgICAgICAgICAgIGxpbmVXaWR0aDogMS41LAogICAgICogPiAgICAgICAgICAgICBzaXplOiA0LAogICAgICogPiAgICAgICAgICAgICBzaGFkb3c6IHRydWUKICAgICAqID4gICAgICAgICB9CiAgICAgKiA+ICAgICB9XSwKICAgICAqID4gICAgIGdyaWQ6IHsKICAgICAqID4gICAgICAgICBkcmF3R3JpZGxpbmVzOiB0cnVlLAogICAgICogPiAgICAgICAgIGdyaWRMaW5lQ29sb3I6ICIjY2NjY2NjIiwKICAgICAqID4gICAgICAgICBncmlkTGluZVdpZHRoOiAxLAogICAgICogPiAgICAgICAgIGJhY2tncm91bmRDb2xvcjogIiNmZmZkZjYiLAogICAgICogPiAgICAgICAgIGJvcmRlckNvbG9yOiAiIzk5OTk5OSIsCiAgICAgKiA+ICAgICAgICAgYm9yZGVyV2lkdGg6IDIsCiAgICAgKiA+ICAgICAgICAgc2hhZG93OiB0cnVlCiAgICAgKiA+ICAgICB9LAogICAgICogPiAgICAgYXhlc1N0eWxlczogewogICAgICogPiAgICAgICAgIGxhYmVsOiB7fSwKICAgICAqID4gICAgICAgICB0aWNrczoge30KICAgICAqID4gICAgIH0sCiAgICAgKiA+ICAgICBheGVzOiB7CiAgICAgKiA+ICAgICAgICAgeGF4aXM6IHsKICAgICAqID4gICAgICAgICAgICAgYm9yZGVyQ29sb3I6ICIjOTk5OTk5IiwKICAgICAqID4gICAgICAgICAgICAgYm9yZGVyV2lkdGg6IDIsCiAgICAgKiA+ICAgICAgICAgICAgIHRpY2tzOiB7CiAgICAgKiA+ICAgICAgICAgICAgICAgICBzaG93OiB0cnVlLAogICAgICogPiAgICAgICAgICAgICAgICAgc2hvd0dyaWRsaW5lOiB0cnVlLAogICAgICogPiAgICAgICAgICAgICAgICAgc2hvd0xhYmVsOiB0cnVlLAogICAgICogPiAgICAgICAgICAgICAgICAgc2hvd01hcms6IHRydWUsCiAgICAgKiA+ICAgICAgICAgICAgICAgICBzaXplOiA0LAogICAgICogPiAgICAgICAgICAgICAgICAgdGV4dENvbG9yOiAiIiwKICAgICAqID4gICAgICAgICAgICAgICAgIHdoaXRlU3BhY2U6ICJub3dyYXAiLAogICAgICogPiAgICAgICAgICAgICAgICAgZm9udFNpemU6ICIxMnB4IiwKICAgICAqID4gICAgICAgICAgICAgICAgIGZvbnRGYW1pbHk6ICInVHJlYnVjaGV0IE1TJyxBcmlhbCxIZWx2ZXRpY2Esc2Fucy1zZXJpZiIKICAgICAqID4gICAgICAgICAgICAgfSwKICAgICAqID4gICAgICAgICAgICAgbGFiZWw6IHsKICAgICAqID4gICAgICAgICAgICAgICAgIHRleHRDb2xvcjogInJnYigxMDIsIDEwMiwgMTAyKSIsCiAgICAgKiA+ICAgICAgICAgICAgICAgICB3aGl0ZVNwYWNlOiAibm9ybWFsIiwKICAgICAqID4gICAgICAgICAgICAgICAgIGZvbnRTaXplOiAiMTQuNjY2N3B4IiwKICAgICAqID4gICAgICAgICAgICAgICAgIGZvbnRGYW1pbHk6ICInVHJlYnVjaGV0IE1TJyxBcmlhbCxIZWx2ZXRpY2Esc2Fucy1zZXJpZiIsCiAgICAgKiA+ICAgICAgICAgICAgICAgICBmb250V2VpZ2h0OiAiNDAwIgogICAgICogPiAgICAgICAgICAgICB9CiAgICAgKiA+ICAgICAgICAgfSwKICAgICAqID4gICAgICAgICB5YXhpczogewogICAgICogPiAgICAgICAgICAgICBib3JkZXJDb2xvcjogIiM5OTk5OTkiLAogICAgICogPiAgICAgICAgICAgICBib3JkZXJXaWR0aDogMiwKICAgICAqID4gICAgICAgICAgICAgdGlja3M6IHsKICAgICAqID4gICAgICAgICAgICAgICAgIHNob3c6IHRydWUsCiAgICAgKiA+ICAgICAgICAgICAgICAgICBzaG93R3JpZGxpbmU6IHRydWUsCiAgICAgKiA+ICAgICAgICAgICAgICAgICBzaG93TGFiZWw6IHRydWUsCiAgICAgKiA+ICAgICAgICAgICAgICAgICBzaG93TWFyazogdHJ1ZSwKICAgICAqID4gICAgICAgICAgICAgICAgIHNpemU6IDQsCiAgICAgKiA+ICAgICAgICAgICAgICAgICB0ZXh0Q29sb3I6ICIiLAogICAgICogPiAgICAgICAgICAgICAgICAgd2hpdGVTcGFjZTogIm5vd3JhcCIsCiAgICAgKiA+ICAgICAgICAgICAgICAgICBmb250U2l6ZTogIjEycHgiLAogICAgICogPiAgICAgICAgICAgICAgICAgZm9udEZhbWlseTogIidUcmVidWNoZXQgTVMnLEFyaWFsLEhlbHZldGljYSxzYW5zLXNlcmlmIgogICAgICogPiAgICAgICAgICAgICB9LAogICAgICogPiAgICAgICAgICAgICBsYWJlbDogewogICAgICogPiAgICAgICAgICAgICAgICAgdGV4dENvbG9yOiBudWxsLAogICAgICogPiAgICAgICAgICAgICAgICAgd2hpdGVTcGFjZTogbnVsbCwKICAgICAqID4gICAgICAgICAgICAgICAgIGZvbnRTaXplOiBudWxsLAogICAgICogPiAgICAgICAgICAgICAgICAgZm9udEZhbWlseTogbnVsbCwKICAgICAqID4gICAgICAgICAgICAgICAgIGZvbnRXZWlnaHQ6IG51bGwKICAgICAqID4gICAgICAgICAgICAgfQogICAgICogPiAgICAgICAgIH0sCiAgICAgKiA+ICAgICAgICAgeDJheGlzOiB7Li4uCiAgICAgKiA+ICAgICAgICAgfSwKICAgICAqID4gICAgICAgICAuLi4KICAgICAqID4gICAgICAgICB5OWF4aXM6IHsuLi4KICAgICAqID4gICAgICAgICB9CiAgICAgKiA+ICAgICB9CiAgICAgKiA+IH0KICAgICAqIAogICAgICogInNlcmllc1N0eWxlcyIgaXMgYSBzdHlsZSBvYmplY3QgdGhhdCB3aWxsIGJlIGFwcGxpZWQgdG8gYWxsIHNlcmllcyBpbiB0aGUgcGxvdC4KICAgICAqIEl0IHdpbGwgZm9yY2libHkgb3ZlcnJpZGUgYW55IHN0eWxlcyBhcHBsaWVkIG9uIHRoZSBpbmRpdmlkdWFsIHNlcmllcy4gICJheGVzU3R5bGVzIiBpcwogICAgICogYSBzdHlsZSBvYmplY3QgdGhhdCB3aWxsIGJlIGFwcGxpZWQgdG8gYWxsIGF4ZXMgaW4gdGhlIHBsb3QuICBJdCB3aWxsIGFsc28gZm9yY2libHkKICAgICAqIG92ZXJyaWRlIGFueSBzdHlsZXMgb24gdGhlIGluZGl2aWR1YWwgYXhlcy4KICAgICAqIAogICAgICogVGhlIGV4YW1wbGUgc2hvd24gYWJvdmUgaGFzIHNlcmllcyBvcHRpb25zIGZvciBhIGxpbmUgc2VyaWVzLiAgT3B0aW9ucyBmb3Igb3RoZXIKICAgICAqIHNlcmllcyB0eXBlcyBhcmUgc2hvd24gYmVsb3c6CiAgICAgKiAKICAgICAqIEJhciBTZXJpZXM6CiAgICAgKiAKICAgICAqID4gewogICAgICogPiAgICAgY29sb3I6ICIjNGJiMmM1IiwKICAgICAqID4gICAgIHNlcmllc0NvbG9yczogWyIjNGJiMmM1IiwgIiNFQUEyMjgiLCAiI2M1YjQ3ZiIsICIjNTc5NTc1IiwgIiM4Mzk1NTciLCAiIzk1OGMxMiIsICIjOTUzNTc5IiwgIiM0YjVkZTQiLCAiI2Q4YjgzZiIsICIjZmY1ODAwIiwgIiMwMDg1Y2MiLCAiI2M3NDdhMyIsICIjY2RkZjU0IiwgIiNGQkQxNzgiLCAiIzI2QjRFMyIsICIjYmQ3MGM3Il0sCiAgICAgKiA+ICAgICBsaW5lV2lkdGg6IDIuNSwKICAgICAqID4gICAgIHNoYWRvdzogdHJ1ZSwKICAgICAqID4gICAgIGJhclBhZGRpbmc6IDIsCiAgICAgKiA+ICAgICBiYXJNYXJnaW46IDEwLAogICAgICogPiAgICAgYmFyV2lkdGg6IDE1LjA5Mzc1LAogICAgICogPiAgICAgaGlnaGxpZ2h0Q29sb3JzOiBbInJnYigxMjksMjAxLDIxNCkiLCAicmdiKDEyOSwyMDEsMjE0KSIsICJyZ2IoMTI5LDIwMSwyMTQpIiwgInJnYigxMjksMjAxLDIxNCkiLCAicmdiKDEyOSwyMDEsMjE0KSIsICJyZ2IoMTI5LDIwMSwyMTQpIiwgInJnYigxMjksMjAxLDIxNCkiLCAicmdiKDEyOSwyMDEsMjE0KSJdCiAgICAgKiA+IH0KICAgICAqIAogICAgICogUGllIFNlcmllczoKICAgICAqIAogICAgICogPiB7CiAgICAgKiA+ICAgICBzZXJpZXNDb2xvcnM6IFsiIzRiYjJjNSIsICIjRUFBMjI4IiwgIiNjNWI0N2YiLCAiIzU3OTU3NSIsICIjODM5NTU3IiwgIiM5NThjMTIiLCAiIzk1MzU3OSIsICIjNGI1ZGU0IiwgIiNkOGI4M2YiLCAiI2ZmNTgwMCIsICIjMDA4NWNjIiwgIiNjNzQ3YTMiLCAiI2NkZGY1NCIsICIjRkJEMTc4IiwgIiMyNkI0RTMiLCAiI2JkNzBjNyJdLAogICAgICogPiAgICAgcGFkZGluZzogMjAsCiAgICAgKiA+ICAgICBzbGljZU1hcmdpbjogMCwKICAgICAqID4gICAgIGZpbGw6IHRydWUsCiAgICAgKiA+ICAgICBzaGFkb3c6IHRydWUsCiAgICAgKiA+ICAgICBzdGFydEFuZ2xlOiAwLAogICAgICogPiAgICAgbGluZVdpZHRoOiAyLjUsCiAgICAgKiA+ICAgICBoaWdobGlnaHRDb2xvcnM6IFsicmdiKDEyOSwyMDEsMjE0KSIsICJyZ2IoMjQwLDE4OSwxMDQpIiwgInJnYigyMTQsMjAyLDE2NSkiLCAicmdiKDEzNywxODAsMTU4KSIsICJyZ2IoMTY4LDE4MCwxMzcpIiwgInJnYigxODAsMTc0LDg5KSIsICJyZ2IoMTgwLDExMywxNjEpIiwgInJnYigxMjksMTQxLDIzNikiLCAicmdiKDIyNywyMDUsMTIwKSIsICJyZ2IoMjU1LDEzOCw3NikiLCAicmdiKDc2LDE2OSwyMTkpIiwgInJnYigyMTUsMTI2LDE5MCkiLCAicmdiKDIyMCwyMzIsMTM1KSIsICJyZ2IoMjAwLDE2Nyw5NikiLCAicmdiKDEwMywyMDIsMjM1KSIsICJyZ2IoMjA4LDE1NCwyMTUpIl0KICAgICAqID4gfQogICAgICogCiAgICAgKiBGdW5uZWwgU2VyaWVzOgogICAgICogCiAgICAgKiA+IHsKICAgICAqID4gICAgIGNvbG9yOiAiIzRiYjJjNSIsCiAgICAgKiA+ICAgICBsaW5lV2lkdGg6IDIsCiAgICAgKiA+ICAgICBzaGFkb3c6IHRydWUsCiAgICAgKiA+ICAgICBwYWRkaW5nOiB7CiAgICAgKiA+ICAgICAgICAgdG9wOiAyMCwKICAgICAqID4gICAgICAgICByaWdodDogMjAsCiAgICAgKiA+ICAgICAgICAgYm90dG9tOiAyMCwKICAgICAqID4gICAgICAgICBsZWZ0OiAyMAogICAgICogPiAgICAgfSwKICAgICAqID4gICAgIHNlY3Rpb25NYXJnaW46IDYsCiAgICAgKiA+ICAgICBzZXJpZXNDb2xvcnM6IFsiIzRiYjJjNSIsICIjRUFBMjI4IiwgIiNjNWI0N2YiLCAiIzU3OTU3NSIsICIjODM5NTU3IiwgIiM5NThjMTIiLCAiIzk1MzU3OSIsICIjNGI1ZGU0IiwgIiNkOGI4M2YiLCAiI2ZmNTgwMCIsICIjMDA4NWNjIiwgIiNjNzQ3YTMiLCAiI2NkZGY1NCIsICIjRkJEMTc4IiwgIiMyNkI0RTMiLCAiI2JkNzBjNyJdLAogICAgICogPiAgICAgaGlnaGxpZ2h0Q29sb3JzOiBbInJnYigxNDcsMjA4LDIyMCkiLCAicmdiKDI0MiwxOTksMTI2KSIsICJyZ2IoMjIwLDIxMCwxNzgpIiwgInJnYigxNTQsMTkxLDE3MikiLCAicmdiKDE4MCwxOTEsMTU0KSIsICJyZ2IoMTkxLDE4NiwxMTIpIiwgInJnYigxOTEsMTMzLDE3NCkiLCAicmdiKDE0NywxNTcsMjM4KSIsICJyZ2IoMjMxLDIxMiwxMzkpIiwgInJnYigyNTUsMTU0LDEwMikiLCAicmdiKDEwMiwxODEsMjI0KSIsICJyZ2IoMjIxLDE0NCwxOTkpIiwgInJnYigyMjUsMjM1LDE1MikiLCAicmdiKDIwMCwxNjcsOTYpIiwgInJnYigxMjQsMjEwLDIzOCkiLCAicmdiKDIxNSwxNjksMjIxKSJdCiAgICAgKiA+IH0KICAgICAqIAogICAgICovCiAgICAkLmpxcGxvdC5UaGVtZUVuZ2luZSA9IGZ1bmN0aW9uKCl7CiAgICAgICAgLy8gR3JvdXA6IFByb3BlcnRpZXMKICAgICAgICAvLwogICAgICAgIC8vIHByb3A6IHRoZW1lcwogICAgICAgIC8vIGhhc2ggb2YgdGhlbWVzIG1hbmFnZWQgYnkgdGhlIHRoZW1lIGVuZ2luZS4gIAogICAgICAgIC8vIEluZGV4ZWQgYnkgdGhlbWUgbmFtZS4KICAgICAgICB0aGlzLnRoZW1lcyA9IHt9OwogICAgICAgIC8vIHByb3A6IGFjdGl2ZVRoZW1lCiAgICAgICAgLy8gUG9pbnRlciB0byBjdXJyZW50bHkgYWN0aXZlIHRoZW1lCiAgICAgICAgdGhpcy5hY3RpdmVUaGVtZT1udWxsOwogICAgICAgIAogICAgfTsKICAgIAogICAgLy8gY2FsbGVkIHdpdGggc2NvcGUgb2YgcGxvdAogICAgJC5qcXBsb3QuVGhlbWVFbmdpbmUucHJvdG90eXBlLmluaXQgPSBmdW5jdGlvbigpIHsKICAgICAgICAvLyBnZXQgdGhlIERlZmF1bHQgdGhlbWUgZnJvbSB0aGUgY3VycmVudCBwbG90IHNldHRpbmdzLgogICAgICAgIHZhciB0aCA9IG5ldyAkLmpxcGxvdC5UaGVtZSh7X25hbWU6J0RlZmF1bHQnfSk7CiAgICAgICAgdmFyIG4sIGksIG5uOwogICAgICAgIAogICAgICAgIGZvciAobiBpbiB0aC50YXJnZXQpIHsKICAgICAgICAgICAgaWYgKG4gPT0gInRleHRDb2xvciIpIHsKICAgICAgICAgICAgICAgIHRoLnRhcmdldFtuXSA9IHRoaXMudGFyZ2V0LmNzcygnY29sb3InKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHRoLnRhcmdldFtuXSA9IHRoaXMudGFyZ2V0LmNzcyhuKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZiAodGhpcy50aXRsZS5zaG93ICYmIHRoaXMudGl0bGUuX2VsZW0pIHsKICAgICAgICAgICAgZm9yIChuIGluIHRoLnRpdGxlKSB7CiAgICAgICAgICAgICAgICBpZiAobiA9PSAidGV4dENvbG9yIikgewogICAgICAgICAgICAgICAgICAgIHRoLnRpdGxlW25dID0gdGhpcy50aXRsZS5fZWxlbS5jc3MoJ2NvbG9yJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0aC50aXRsZVtuXSA9IHRoaXMudGl0bGUuX2VsZW0uY3NzKG4pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGZvciAobiBpbiB0aC5ncmlkKSB7CiAgICAgICAgICAgIHRoLmdyaWRbbl0gPSB0aGlzLmdyaWRbbl07CiAgICAgICAgfQogICAgICAgIGlmICh0aC5ncmlkLmJhY2tncm91bmRDb2xvciA9PSBudWxsICYmIHRoaXMuZ3JpZC5iYWNrZ3JvdW5kICE9IG51bGwpIHsKICAgICAgICAgICAgdGguZ3JpZC5iYWNrZ3JvdW5kQ29sb3IgPSB0aGlzLmdyaWQuYmFja2dyb3VuZDsKICAgICAgICB9CiAgICAgICAgaWYgKHRoaXMubGVnZW5kLnNob3cgJiYgdGhpcy5sZWdlbmQuX2VsZW0pIHsKICAgICAgICAgICAgZm9yIChuIGluIHRoLmxlZ2VuZCkgewogICAgICAgICAgICAgICAgaWYgKG4gPT0gJ3RleHRDb2xvcicpIHsKICAgICAgICAgICAgICAgICAgICB0aC5sZWdlbmRbbl0gPSB0aGlzLmxlZ2VuZC5fZWxlbS5jc3MoJ2NvbG9yJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0aC5sZWdlbmRbbl0gPSB0aGlzLmxlZ2VuZC5fZWxlbS5jc3Mobik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdmFyIHM7CiAgICAgICAgCiAgICAgICAgZm9yIChpPTA7IGk8dGhpcy5zZXJpZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgcyA9IHRoaXMuc2VyaWVzW2ldOwogICAgICAgICAgICBpZiAocy5yZW5kZXJlci5jb25zdHJ1Y3RvciA9PSAkLmpxcGxvdC5MaW5lUmVuZGVyZXIpIHsKICAgICAgICAgICAgICAgIHRoLnNlcmllcy5wdXNoKG5ldyBMaW5lU2VyaWVzUHJvcGVydGllcygpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChzLnJlbmRlcmVyLmNvbnN0cnVjdG9yID09ICQuanFwbG90LkJhclJlbmRlcmVyKSB7CiAgICAgICAgICAgICAgICB0aC5zZXJpZXMucHVzaChuZXcgQmFyU2VyaWVzUHJvcGVydGllcygpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChzLnJlbmRlcmVyLmNvbnN0cnVjdG9yID09ICQuanFwbG90LlBpZVJlbmRlcmVyKSB7CiAgICAgICAgICAgICAgICB0aC5zZXJpZXMucHVzaChuZXcgUGllU2VyaWVzUHJvcGVydGllcygpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChzLnJlbmRlcmVyLmNvbnN0cnVjdG9yID09ICQuanFwbG90LkRvbnV0UmVuZGVyZXIpIHsKICAgICAgICAgICAgICAgIHRoLnNlcmllcy5wdXNoKG5ldyBEb251dFNlcmllc1Byb3BlcnRpZXMoKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAocy5yZW5kZXJlci5jb25zdHJ1Y3RvciA9PSAkLmpxcGxvdC5GdW5uZWxSZW5kZXJlcikgewogICAgICAgICAgICAgICAgdGguc2VyaWVzLnB1c2gobmV3IEZ1bm5lbFNlcmllc1Byb3BlcnRpZXMoKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAocy5yZW5kZXJlci5jb25zdHJ1Y3RvciA9PSAkLmpxcGxvdC5NZXRlckdhdWdlUmVuZGVyZXIpIHsKICAgICAgICAgICAgICAgIHRoLnNlcmllcy5wdXNoKG5ldyBNZXRlclNlcmllc1Byb3BlcnRpZXMoKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICB0aC5zZXJpZXMucHVzaCh7fSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yIChuIGluIHRoLnNlcmllc1tpXSkgewogICAgICAgICAgICAgICAgdGguc2VyaWVzW2ldW25dID0gc1tuXTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB2YXIgYSwgYXg7CiAgICAgICAgZm9yIChuIGluIHRoaXMuYXhlcykgewogICAgICAgICAgICBheCA9IHRoaXMuYXhlc1tuXTsKICAgICAgICAgICAgYSA9IHRoLmF4ZXNbbl0gPSBuZXcgQXhpc1Byb3BlcnRpZXMoKTsKICAgICAgICAgICAgYS5ib3JkZXJDb2xvciA9IGF4LmJvcmRlckNvbG9yOwogICAgICAgICAgICBhLmJvcmRlcldpZHRoID0gYXguYm9yZGVyV2lkdGg7CiAgICAgICAgICAgIGlmIChheC5fdGlja3MgJiYgYXguX3RpY2tzWzBdKSB7CiAgICAgICAgICAgICAgICBmb3IgKG5uIGluIGEudGlja3MpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoYXguX3RpY2tzWzBdLmhhc093blByb3BlcnR5KG5uKSkgewogICAgICAgICAgICAgICAgICAgICAgICBhLnRpY2tzW25uXSA9IGF4Ll90aWNrc1swXVtubl07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGF4Ll90aWNrc1swXS5fZWxlbSl7CiAgICAgICAgICAgICAgICAgICAgICAgIGEudGlja3Nbbm5dID0gYXguX3RpY2tzWzBdLl9lbGVtLmNzcyhubik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChheC5fbGFiZWwgJiYgYXguX2xhYmVsLnNob3cpIHsKICAgICAgICAgICAgICAgIGZvciAobm4gaW4gYS5sYWJlbCkgewogICAgICAgICAgICAgICAgICAgIC8vIGEubGFiZWxbbm5dID0gYXguX2xhYmVsLl9lbGVtLmNzcyhubik7CiAgICAgICAgICAgICAgICAgICAgaWYgKGF4Ll9sYWJlbFtubl0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgYS5sYWJlbFtubl0gPSBheC5fbGFiZWxbbm5dOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChheC5fbGFiZWwuX2VsZW0pewogICAgICAgICAgICAgICAgICAgICAgICBpZiAobm4gPT0gJ3RleHRDb2xvcicpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEubGFiZWxbbm5dID0gYXguX2xhYmVsLl9lbGVtLmNzcygnY29sb3InKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEubGFiZWxbbm5dID0gYXguX2xhYmVsLl9lbGVtLmNzcyhubik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdGhpcy50aGVtZUVuZ2luZS5fYWRkKHRoKTsKICAgICAgICB0aGlzLnRoZW1lRW5naW5lLmFjdGl2ZVRoZW1lICA9IHRoaXMudGhlbWVFbmdpbmUudGhlbWVzW3RoLl9uYW1lXTsKICAgIH07CiAgICAvKioKICAgICAqIEdyb3VwOiBtZXRob2RzCiAgICAgKiAKICAgICAqIG1ldGhvZDogZ2V0CiAgICAgKiAKICAgICAqIEdldCBhbmQgcmV0dXJuIHRoZSBuYW1lZCB0aGVtZSBvciB0aGUgYWN0aXZlIHRoZW1lIGlmIG5vIG5hbWUgZ2l2ZW4uCiAgICAgKiAKICAgICAqIHBhcmFtZXRlcjoKICAgICAqIAogICAgICogbmFtZSAtIG5hbWUgb2YgdGhlbWUgdG8gZ2V0LgogICAgICogCiAgICAgKiByZXR1cm5zOgogICAgICogCiAgICAgKiBUaGVtZSBpbnN0YW5jZSBvZiBnaXZlbiBuYW1lLgogICAgICovICAgCiAgICAkLmpxcGxvdC5UaGVtZUVuZ2luZS5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24obmFtZSkgewogICAgICAgIGlmICghbmFtZSkgewogICAgICAgICAgICAvLyByZXR1cm4gdGhlIGFjdGl2ZSB0aGVtZQogICAgICAgICAgICByZXR1cm4gdGhpcy5hY3RpdmVUaGVtZTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLnRoZW1lc1tuYW1lXTsKICAgICAgICB9CiAgICB9OwogICAgCiAgICBmdW5jdGlvbiBudW1lcmljYWxPcmRlcihhLGIpIHsgcmV0dXJuIGEtYjsgfQogICAgCiAgICAvKioKICAgICAqIG1ldGhvZDogZ2V0VGhlbWVOYW1lcwogICAgICogCiAgICAgKiBSZXR1cm4gdGhlIGxpc3Qgb2YgdGhlbWUgbmFtZXMgaW4gdGhpcyBtYW5hZ2VyIGluIGFscGhhLW51bWVyaWNhbCBvcmRlci4KICAgICAqIAogICAgICogcGFyYW1ldGVyOgogICAgICogCiAgICAgKiBOb25lCiAgICAgKiAKICAgICAqIHJldHVybnM6CiAgICAgKiAKICAgICAqIEEgdGhlIGxpc3Qgb2YgdGhlbWUgbmFtZXMgaW4gdGhpcyBtYW5hZ2VyIGluIGFscGhhLW51bWVyaWNhbCBvcmRlci4KICAgICAqLyAgICAgICAKICAgICQuanFwbG90LlRoZW1lRW5naW5lLnByb3RvdHlwZS5nZXRUaGVtZU5hbWVzID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIHRuID0gW107CiAgICAgICAgZm9yICh2YXIgbiBpbiB0aGlzLnRoZW1lcykgewogICAgICAgICAgICB0bi5wdXNoKG4pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdG4uc29ydChudW1lcmljYWxPcmRlcik7CiAgICB9OwoKICAgIC8qKgogICAgICogbWV0aG9kOiBnZXRUaGVtZXMKICAgICAqIAogICAgICogUmV0dXJuIGEgbGlzdCBvZiB0aGVtZXMgaW4gYWxwaGEtbnVtZXJpY2FsIG9yZGVyIGJ5IG5hbWUuCiAgICAgKiAKICAgICAqIHBhcmFtZXRlcjoKICAgICAqIAogICAgICogTm9uZQogICAgICogCiAgICAgKiByZXR1cm5zOgogICAgICogCiAgICAgKiBBIGxpc3Qgb2YgdGhlbWVzIGluIGFscGhhLW51bWVyaWNhbCBvcmRlciBieSBuYW1lLgogICAgICovIAogICAgJC5qcXBsb3QuVGhlbWVFbmdpbmUucHJvdG90eXBlLmdldFRoZW1lcyA9IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciB0biA9IFtdOwogICAgICAgIHZhciB0aGVtZXMgPSBbXTsKICAgICAgICBmb3IgKHZhciBuIGluIHRoaXMudGhlbWVzKSB7CiAgICAgICAgICAgIHRuLnB1c2gobik7CiAgICAgICAgfQogICAgICAgIHRuLnNvcnQobnVtZXJpY2FsT3JkZXIpOwogICAgICAgIGZvciAodmFyIGk9MDsgaTx0bi5sZW5ndGg7IGkrKykgewogICAgICAgICAgICB0aGVtZXMucHVzaCh0aGlzLnRoZW1lc1t0bltpXV0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhlbWVzOwogICAgfTsKICAgIAogICAgJC5qcXBsb3QuVGhlbWVFbmdpbmUucHJvdG90eXBlLmFjdGl2YXRlID0gZnVuY3Rpb24ocGxvdCwgbmFtZSkgewogICAgICAgIC8vIHNvbWV0aW1lcyBuZWVkIHRvIHJlZHJhdyB3aG9sZSBwbG90LgogICAgICAgIHZhciByZWRyYXdQbG90ID0gZmFsc2U7CiAgICAgICAgaWYgKCFuYW1lICYmIHRoaXMuYWN0aXZlVGhlbWUgJiYgdGhpcy5hY3RpdmVUaGVtZS5fbmFtZSkgewogICAgICAgICAgICBuYW1lID0gdGhpcy5hY3RpdmVUaGVtZS5fbmFtZTsKICAgICAgICB9CiAgICAgICAgaWYgKCF0aGlzLnRoZW1lcy5oYXNPd25Qcm9wZXJ0eShuYW1lKSkgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIk5vIHRoZW1lIG9mIHRoYXQgbmFtZSIpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgdmFyIHRoID0gdGhpcy50aGVtZXNbbmFtZV07CiAgICAgICAgICAgIHRoaXMuYWN0aXZlVGhlbWUgPSB0aDsKICAgICAgICAgICAgdmFyIHZhbCwgY2hlY2tCb3JkZXJDb2xvciA9IGZhbHNlLCBjaGVja0JvcmRlcldpZHRoID0gZmFsc2U7CiAgICAgICAgICAgIHZhciBhcnIgPSBbJ3hheGlzJywgJ3gyYXhpcycsICd5YXhpcycsICd5MmF4aXMnXTsKICAgICAgICAgICAgCiAgICAgICAgICAgIGZvciAoaT0wOyBpPGFyci5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgdmFyIGF4ID0gYXJyW2ldOwogICAgICAgICAgICAgICAgaWYgKHRoLmF4ZXNTdHlsZXMuYm9yZGVyQ29sb3IgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIHBsb3QuYXhlc1theF0uYm9yZGVyQ29sb3IgPSB0aC5heGVzU3R5bGVzLmJvcmRlckNvbG9yOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHRoLmF4ZXNTdHlsZXMuYm9yZGVyV2lkdGggIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIHBsb3QuYXhlc1theF0uYm9yZGVyV2lkdGggPSB0aC5heGVzU3R5bGVzLmJvcmRlcldpZHRoOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICBmb3IgKHZhciBheG5hbWUgaW4gcGxvdC5heGVzKSB7CiAgICAgICAgICAgICAgICB2YXIgYXhpcyA9IHBsb3QuYXhlc1theG5hbWVdOwogICAgICAgICAgICAgICAgaWYgKGF4aXMuc2hvdykgewogICAgICAgICAgICAgICAgICAgIHZhciB0aGF4aXMgPSB0aC5heGVzW2F4bmFtZV0gfHwge307CiAgICAgICAgICAgICAgICAgICAgdmFyIHRoYXhzdHlsZSA9IHRoLmF4ZXNTdHlsZXM7CiAgICAgICAgICAgICAgICAgICAgdmFyIHRoYXggPSAkLmpxcGxvdC5leHRlbmQodHJ1ZSwge30sIHRoYXhpcywgdGhheHN0eWxlKTsKICAgICAgICAgICAgICAgICAgICB2YWwgPSAodGguYXhlc1N0eWxlcy5ib3JkZXJDb2xvciAhPSBudWxsKSA/IHRoLmF4ZXNTdHlsZXMuYm9yZGVyQ29sb3IgOiB0aGF4LmJvcmRlckNvbG9yOwogICAgICAgICAgICAgICAgICAgIGlmICh0aGF4LmJvcmRlckNvbG9yICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy5ib3JkZXJDb2xvciA9IHRoYXguYm9yZGVyQ29sb3I7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlZHJhd1Bsb3QgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB2YWwgPSAodGguYXhlc1N0eWxlcy5ib3JkZXJXaWR0aCAhPSBudWxsKSA/IHRoLmF4ZXNTdHlsZXMuYm9yZGVyV2lkdGggOiB0aGF4LmJvcmRlcldpZHRoOwogICAgICAgICAgICAgICAgICAgIGlmICh0aGF4LmJvcmRlcldpZHRoICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy5ib3JkZXJXaWR0aCA9IHRoYXguYm9yZGVyV2lkdGg7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlZHJhd1Bsb3QgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoYXhpcy5fdGlja3MgJiYgYXhpcy5fdGlja3NbMF0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbm4gaW4gdGhheC50aWNrcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdmFsID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmICh0aC5heGVzU3R5bGVzLnRpY2tzICYmIHRoLmF4ZXNTdHlsZXMudGlja3Nbbm5dICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICB2YWwgPSB0aC5heGVzU3R5bGVzLnRpY2tzW25uXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVsc2UgaWYgKHRoYXgudGlja3Nbbm5dICE9IG51bGwpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIHZhbCA9IHRoYXgudGlja3Nbbm5dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSB0aGF4LnRpY2tzW25uXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWwgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGlja09wdGlvbnNbbm5dID0gdmFsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMuX3RpY2tzID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVkcmF3UGxvdCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKGF4aXMuX2xhYmVsICYmIGF4aXMuX2xhYmVsLnNob3cpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbm4gaW4gdGhheC5sYWJlbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdmFsID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmICh0aC5heGVzU3R5bGVzLmxhYmVsICYmIHRoLmF4ZXNTdHlsZXMubGFiZWxbbm5dICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICB2YWwgPSB0aC5heGVzU3R5bGVzLmxhYmVsW25uXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVsc2UgaWYgKHRoYXgubGFiZWwgJiYgdGhheC5sYWJlbFtubl0gIT0gbnVsbCl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgdmFsID0gdGhheC5sYWJlbFtubl0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IHRoYXgubGFiZWxbbm5dOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy5sYWJlbE9wdGlvbnNbbm5dID0gdmFsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZHJhd1Bsb3QgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9ICAgICAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICBmb3IgKHZhciBuIGluIHRoLmdyaWQpIHsKICAgICAgICAgICAgICAgIGlmICh0aC5ncmlkW25dICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICBwbG90LmdyaWRbbl0gPSB0aC5ncmlkW25dOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghcmVkcmF3UGxvdCkgewogICAgICAgICAgICAgICAgcGxvdC5ncmlkLmRyYXcoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgaWYgKHBsb3QubGVnZW5kLnNob3cpIHsgCiAgICAgICAgICAgICAgICBmb3IgKG4gaW4gdGgubGVnZW5kKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHRoLmxlZ2VuZFtuXSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBsb3QubGVnZW5kW25dID0gdGgubGVnZW5kW25dOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAocGxvdC50aXRsZS5zaG93KSB7CiAgICAgICAgICAgICAgICBmb3IgKG4gaW4gdGgudGl0bGUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAodGgudGl0bGVbbl0gIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICBwbG90LnRpdGxlW25dID0gdGgudGl0bGVbbl07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgaTsKICAgICAgICAgICAgZm9yIChpPTA7IGk8dGguc2VyaWVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICB2YXIgb3B0cyA9IHt9OwogICAgICAgICAgICAgICAgdmFyIHJlZHJhd1NlcmllcyA9IGZhbHNlOwogICAgICAgICAgICAgICAgZm9yIChuIGluIHRoLnNlcmllc1tpXSkgewogICAgICAgICAgICAgICAgICAgIHZhbCA9ICh0aC5zZXJpZXNTdHlsZXNbbl0gIT0gbnVsbCkgPyB0aC5zZXJpZXNTdHlsZXNbbl0gOiB0aC5zZXJpZXNbaV1bbl07CiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG9wdHNbbl0gPSB2YWw7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuID09ICdjb2xvcicpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3Quc2VyaWVzW2ldLnJlbmRlcmVyLnNoYXBlUmVuZGVyZXIuZmlsbFN0eWxlID0gdmFsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxvdC5zZXJpZXNbaV0ucmVuZGVyZXIuc2hhcGVSZW5kZXJlci5zdHJva2VTdHlsZSA9IHZhbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3Quc2VyaWVzW2ldW25dID0gdmFsOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKChuID09ICdsaW5lV2lkdGgnKSB8fCAobiA9PSAnbGluZVBhdHRlcm4nKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxvdC5zZXJpZXNbaV0ucmVuZGVyZXIuc2hhcGVSZW5kZXJlcltuXSA9IHZhbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3Quc2VyaWVzW2ldW25dID0gdmFsOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG4gPT0gJ21hcmtlck9wdGlvbnMnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXJnZSAocGxvdC5zZXJpZXNbaV0ubWFya2VyT3B0aW9ucywgdmFsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lcmdlIChwbG90LnNlcmllc1tpXS5tYXJrZXJSZW5kZXJlciwgdmFsKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3Quc2VyaWVzW2ldW25dID0gdmFsOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJlZHJhd1Bsb3QgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgaWYgKHJlZHJhd1Bsb3QpIHsKICAgICAgICAgICAgICAgIHBsb3QudGFyZ2V0LmVtcHR5KCk7CiAgICAgICAgICAgICAgICBwbG90LmRyYXcoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgZm9yIChuIGluIHRoLnRhcmdldCkgewogICAgICAgICAgICAgICAgaWYgKHRoLnRhcmdldFtuXSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgcGxvdC50YXJnZXQuY3NzKG4sIHRoLnRhcmdldFtuXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgCiAgICB9OwogICAgCiAgICAkLmpxcGxvdC5UaGVtZUVuZ2luZS5wcm90b3R5cGUuX2FkZCA9IGZ1bmN0aW9uKHRoZW1lLCBuYW1lKSB7CiAgICAgICAgaWYgKG5hbWUpIHsKICAgICAgICAgICAgdGhlbWUuX25hbWUgPSBuYW1lOwogICAgICAgIH0KICAgICAgICBpZiAoIXRoZW1lLl9uYW1lKSB7CiAgICAgICAgICAgIHRoZW1lLl9uYW1lID0gRGF0ZS5wYXJzZShuZXcgRGF0ZSgpKTsKICAgICAgICB9CiAgICAgICAgaWYgKCF0aGlzLnRoZW1lcy5oYXNPd25Qcm9wZXJ0eSh0aGVtZS5fbmFtZSkpIHsKICAgICAgICAgICAgdGhpcy50aGVtZXNbdGhlbWUuX25hbWVdID0gdGhlbWU7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoImpxcGxvdC5UaGVtZUVuZ2luZSBFcnJvcjogVGhlbWUgYWxyZWFkeSBpbiB1c2UiKTsKICAgICAgICB9CiAgICB9OwogICAgCiAgICAvLyBtZXRob2QgcmVtb3ZlCiAgICAvLyBEZWxldGUgdGhlIG5hbWVkIHRoZW1lLCByZXR1cm4gdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBvbiBmYWlsdXJlLgogICAgCgogICAgLyoqCiAgICAgKiBtZXRob2Q6IHJlbW92ZQogICAgICogCiAgICAgKiBSZW1vdmUgdGhlIGdpdmVuIHRoZW1lIGZyb20gdGhlIHRoZW1lRW5naW5lLgogICAgICogCiAgICAgKiBwYXJhbWV0ZXJzOgogICAgICogCiAgICAgKiBuYW1lIC0gbmFtZSBvZiB0aGUgdGhlbWUgdG8gcmVtb3ZlLgogICAgICogCiAgICAgKiByZXR1cm5zOgogICAgICogCiAgICAgKiB0cnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIG9uIGZhaWx1cmUuCiAgICAgKi8KICAgICQuanFwbG90LlRoZW1lRW5naW5lLnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbihuYW1lKSB7CiAgICAgICAgaWYgKG5hbWUgPT0gJ0RlZmF1bHQnKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGRlbGV0ZSB0aGlzLnRoZW1lc1tuYW1lXTsKICAgIH07CgogICAgLyoqCiAgICAgKiBtZXRob2Q6IG5ld1RoZW1lCiAgICAgKiAKICAgICAqIENyZWF0ZSBhIG5ldyB0aGVtZSBiYXNlZCBvbiB0aGUgZGVmYXVsdCB0aGVtZSwgYWRkaW5nIGl0IHRoZSB0aGVtZUVuZ2luZS4KICAgICAqIAogICAgICogcGFyYW1ldGVyczoKICAgICAqIAogICAgICogbmFtZSAtIG5hbWUgb2YgdGhlIG5ldyB0aGVtZS4KICAgICAqIG9iaiAtIG9wdGlvbmFsIG9iamVjdCBvZiBzdHlsZXMgdG8gYmUgYXBwbGllZCB0byB0aGlzIG5ldyB0aGVtZS4KICAgICAqIAogICAgICogcmV0dXJuczoKICAgICAqIAogICAgICogbmV3IFRoZW1lIG9iamVjdC4KICAgICAqLwogICAgJC5qcXBsb3QuVGhlbWVFbmdpbmUucHJvdG90eXBlLm5ld1RoZW1lID0gZnVuY3Rpb24obmFtZSwgb2JqKSB7CiAgICAgICAgaWYgKHR5cGVvZihuYW1lKSA9PSAnb2JqZWN0JykgewogICAgICAgICAgICBvYmogPSBvYmogfHwgbmFtZTsKICAgICAgICAgICAgbmFtZSA9IG51bGw7CiAgICAgICAgfQogICAgICAgIGlmIChvYmogJiYgb2JqLl9uYW1lKSB7CiAgICAgICAgICAgIG5hbWUgPSBvYmouX25hbWU7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBuYW1lID0gbmFtZSB8fCBEYXRlLnBhcnNlKG5ldyBEYXRlKCkpOwogICAgICAgIH0KICAgICAgICAvLyB2YXIgdGggPSBuZXcgJC5qcXBsb3QuVGhlbWUobmFtZSk7CiAgICAgICAgdmFyIHRoID0gdGhpcy5jb3B5KHRoaXMudGhlbWVzWydEZWZhdWx0J10uX25hbWUsIG5hbWUpOwogICAgICAgICQuanFwbG90LmV4dGVuZCh0aCwgb2JqKTsKICAgICAgICByZXR1cm4gdGg7CiAgICB9OwogICAgCiAgICAvLyBmdW5jdGlvbiBjbG9uZShvYmopIHsKICAgIC8vICAgICByZXR1cm4gZXZhbChvYmoudG9Tb3VyY2UoKSk7CiAgICAvLyB9CiAgICAKICAgIGZ1bmN0aW9uIGNsb25lKG9iail7CiAgICAgICAgaWYob2JqID09IG51bGwgfHwgdHlwZW9mKG9iaikgIT0gJ29iamVjdCcpewogICAgICAgICAgICByZXR1cm4gb2JqOwogICAgICAgIH0KICAgIAogICAgICAgIHZhciB0ZW1wID0gbmV3IG9iai5jb25zdHJ1Y3RvcigpOwogICAgICAgIGZvcih2YXIga2V5IGluIG9iail7CiAgICAgICAgICAgIHRlbXBba2V5XSA9IGNsb25lKG9ialtrZXldKTsKICAgICAgICB9ICAgCiAgICAgICAgcmV0dXJuIHRlbXA7CiAgICB9CiAgICAKICAgICQuanFwbG90LmNsb25lID0gY2xvbmU7CiAgICAKICAgIGZ1bmN0aW9uIG1lcmdlKG9iajEsIG9iajIpIHsKICAgICAgICBpZiAob2JqMiA9PSAgbnVsbCB8fCB0eXBlb2Yob2JqMikgIT0gJ29iamVjdCcpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBmb3IgKHZhciBrZXkgaW4gb2JqMikgewogICAgICAgICAgICBpZiAoa2V5ID09ICdoaWdobGlnaHRDb2xvcnMnKSB7CiAgICAgICAgICAgICAgICBvYmoxW2tleV0gPSBjbG9uZShvYmoyW2tleV0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChvYmoyW2tleV0gIT0gbnVsbCAmJiB0eXBlb2Yob2JqMltrZXldKSA9PSAnb2JqZWN0JykgewogICAgICAgICAgICAgICAgaWYgKCFvYmoxLmhhc093blByb3BlcnR5KGtleSkpIHsKICAgICAgICAgICAgICAgICAgICBvYmoxW2tleV0gPSB7fTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG1lcmdlKG9iajFba2V5XSwgb2JqMltrZXldKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIG9iajFba2V5XSA9IG9iajJba2V5XTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIAogICAgJC5qcXBsb3QubWVyZ2UgPSBtZXJnZTsKICAgIAogICAgICAgIC8vIFVzZSB0aGUgalF1ZXJ5IDEuMy4yIGV4dGVuZCBmdW5jdGlvbiBzaW5jZSBiZWhhdmlvdXIgaW4galF1ZXJ5IDEuNCBzZWVtcyBwcm9ibGVtYXRpYwogICAgJC5qcXBsb3QuZXh0ZW5kID0gZnVuY3Rpb24oKSB7CiAgICAgICAgLy8gY29weSByZWZlcmVuY2UgdG8gdGFyZ2V0IG9iamVjdAogICAgICAgIHZhciB0YXJnZXQgPSBhcmd1bWVudHNbMF0gfHwge30sIGkgPSAxLCBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoLCBkZWVwID0gZmFsc2UsIG9wdGlvbnM7CgogICAgICAgIC8vIEhhbmRsZSBhIGRlZXAgY29weSBzaXR1YXRpb24KICAgICAgICBpZiAoIHR5cGVvZiB0YXJnZXQgPT09ICJib29sZWFuIiApIHsKICAgICAgICAgICAgZGVlcCA9IHRhcmdldDsKICAgICAgICAgICAgdGFyZ2V0ID0gYXJndW1lbnRzWzFdIHx8IHt9OwogICAgICAgICAgICAvLyBza2lwIHRoZSBib29sZWFuIGFuZCB0aGUgdGFyZ2V0CiAgICAgICAgICAgIGkgPSAyOwogICAgICAgIH0KCiAgICAgICAgLy8gSGFuZGxlIGNhc2Ugd2hlbiB0YXJnZXQgaXMgYSBzdHJpbmcgb3Igc29tZXRoaW5nIChwb3NzaWJsZSBpbiBkZWVwIGNvcHkpCiAgICAgICAgaWYgKCB0eXBlb2YgdGFyZ2V0ICE9PSAib2JqZWN0IiAmJiAhdG9TdHJpbmcuY2FsbCh0YXJnZXQpID09PSAiW29iamVjdCBGdW5jdGlvbl0iICkgewogICAgICAgICAgICB0YXJnZXQgPSB7fTsKICAgICAgICB9CgogICAgICAgIGZvciAoIDsgaSA8IGxlbmd0aDsgaSsrICl7CiAgICAgICAgICAgIC8vIE9ubHkgZGVhbCB3aXRoIG5vbi1udWxsL3VuZGVmaW5lZCB2YWx1ZXMKICAgICAgICAgICAgaWYgKCAob3B0aW9ucyA9IGFyZ3VtZW50c1sgaSBdKSAhPSBudWxsICkgewogICAgICAgICAgICAgICAgLy8gRXh0ZW5kIHRoZSBiYXNlIG9iamVjdAogICAgICAgICAgICAgICAgZm9yICggdmFyIG5hbWUgaW4gb3B0aW9ucyApIHsKICAgICAgICAgICAgICAgICAgICB2YXIgc3JjID0gdGFyZ2V0WyBuYW1lIF0sIGNvcHkgPSBvcHRpb25zWyBuYW1lIF07CgogICAgICAgICAgICAgICAgICAgIC8vIFByZXZlbnQgbmV2ZXItZW5kaW5nIGxvb3AKICAgICAgICAgICAgICAgICAgICBpZiAoIHRhcmdldCA9PT0gY29weSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyBSZWN1cnNlIGlmIHdlJ3JlIG1lcmdpbmcgb2JqZWN0IHZhbHVlcwogICAgICAgICAgICAgICAgICAgIGlmICggZGVlcCAmJiBjb3B5ICYmIHR5cGVvZiBjb3B5ID09PSAib2JqZWN0IiAmJiAhY29weS5ub2RlVHlwZSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0WyBuYW1lIF0gPSAkLmpxcGxvdC5leHRlbmQoIGRlZXAsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTmV2ZXIgbW92ZSBvcmlnaW5hbCBvYmplY3RzLCBjbG9uZSB0aGVtCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMgfHwgKCBjb3B5Lmxlbmd0aCAhPSBudWxsID8gWyBdIDogeyB9ICkKICAgICAgICAgICAgICAgICAgICAgICAgLCBjb3B5ICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC8vIERvbid0IGJyaW5nIGluIHVuZGVmaW5lZCB2YWx1ZXMKICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggY29weSAhPT0gdW5kZWZpbmVkICkgewogICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRbIG5hbWUgXSA9IGNvcHk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vIFJldHVybiB0aGUgbW9kaWZpZWQgb2JqZWN0CiAgICAgICAgcmV0dXJuIHRhcmdldDsKICAgIH07CgogICAgLyoqCiAgICAgKiBtZXRob2Q6IHJlbmFtZQogICAgICogCiAgICAgKiBSZW5hbWUgYSB0aGVtZS4KICAgICAqIAogICAgICogcGFyYW1ldGVyczoKICAgICAqIAogICAgICogb2xkTmFtZSAtIGN1cnJlbnQgbmFtZSBvZiB0aGUgdGhlbWUuCiAgICAgKiBuZXdOYW1lIC0gZGVzaXJlZCBuYW1lIG9mIHRoZSB0aGVtZS4KICAgICAqIAogICAgICogcmV0dXJuczoKICAgICAqIAogICAgICogbmV3IFRoZW1lIG9iamVjdC4KICAgICAqLwogICAgJC5qcXBsb3QuVGhlbWVFbmdpbmUucHJvdG90eXBlLnJlbmFtZSA9IGZ1bmN0aW9uIChvbGROYW1lLCBuZXdOYW1lKSB7CiAgICAgICAgaWYgKG9sZE5hbWUgPT0gJ0RlZmF1bHQnIHx8IG5ld05hbWUgPT0gJ0RlZmF1bHQnKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvciAoImpxcGxvdC5UaGVtZUVuZ2luZSBFcnJvcjogQ2Fubm90IHJlbmFtZSBmcm9tL3RvIERlZmF1bHQiKTsKICAgICAgICB9CiAgICAgICAgaWYgKHRoaXMudGhlbWVzLmhhc093blByb3BlcnR5KG5ld05hbWUpKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvciAoImpxcGxvdC5UaGVtZUVuZ2luZSBFcnJvcjogTmV3IG5hbWUgYWxyZWFkeSBpbiB1c2UuIik7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHRoaXMudGhlbWVzLmhhc093blByb3BlcnR5KG9sZE5hbWUpKSB7CiAgICAgICAgICAgIHZhciB0aCA9IHRoaXMuY29weSAob2xkTmFtZSwgbmV3TmFtZSk7CiAgICAgICAgICAgIHRoaXMucmVtb3ZlKG9sZE5hbWUpOwogICAgICAgICAgICByZXR1cm4gdGg7CiAgICAgICAgfQogICAgICAgIHRocm93IG5ldyBFcnJvcigianFwbG90LlRoZW1lRW5naW5lIEVycm9yOiBPbGQgbmFtZSBvciBuZXcgbmFtZSBpbnZhbGlkIik7CiAgICB9OwoKICAgIC8qKgogICAgICogbWV0aG9kOiBjb3B5CiAgICAgKiAKICAgICAqIENyZWF0ZSBhIGNvcHkgb2YgYW4gZXhpc3RpbmcgdGhlbWUgaW4gdGhlIHRoZW1lRW5naW5lLCBhZGRpbmcgaXQgdGhlIHRoZW1lRW5naW5lLgogICAgICogCiAgICAgKiBwYXJhbWV0ZXJzOgogICAgICogCiAgICAgKiBzb3VyY2VOYW1lIC0gbmFtZSBvZiB0aGUgZXhpc3RpbmcgdGhlbWUuCiAgICAgKiB0YXJnZXROYW1lIC0gbmFtZSBvZiB0aGUgY29weS4KICAgICAqIG9iaiAtIG9wdGlvbmFsIG9iamVjdCBvZiBzdHlsZSBwYXJhbWV0ZXIgdG8gYXBwbHkgdG8gdGhlIG5ldyB0aGVtZS4KICAgICAqIAogICAgICogcmV0dXJuczoKICAgICAqIAogICAgICogbmV3IFRoZW1lIG9iamVjdC4KICAgICAqLwogICAgJC5qcXBsb3QuVGhlbWVFbmdpbmUucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiAoc291cmNlTmFtZSwgdGFyZ2V0TmFtZSwgb2JqKSB7CiAgICAgICAgaWYgKHRhcmdldE5hbWUgPT0gJ0RlZmF1bHQnKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvciAoImpxcGxvdC5UaGVtZUVuZ2luZSBFcnJvcjogQ2Fubm90IGNvcHkgb3ZlciBEZWZhdWx0IHRoZW1lIik7CiAgICAgICAgfQogICAgICAgIGlmICghdGhpcy50aGVtZXMuaGFzT3duUHJvcGVydHkoc291cmNlTmFtZSkpIHsKICAgICAgICAgICAgdmFyIHMgPSAianFwbG90LlRoZW1lRW5naW5lIEVycm9yOiBTb3VyY2UgbmFtZSBpbnZhbGlkIjsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHMpOwogICAgICAgIH0KICAgICAgICBpZiAodGhpcy50aGVtZXMuaGFzT3duUHJvcGVydHkodGFyZ2V0TmFtZSkpIHsKICAgICAgICAgICAgdmFyIHMgPSAianFwbG90LlRoZW1lRW5naW5lIEVycm9yOiBUYXJnZXQgbmFtZSBpbnZhbGlkIjsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHMpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgdmFyIHRoID0gY2xvbmUodGhpcy50aGVtZXNbc291cmNlTmFtZV0pOwogICAgICAgICAgICB0aC5fbmFtZSA9IHRhcmdldE5hbWU7CiAgICAgICAgICAgICQuanFwbG90LmV4dGVuZCh0cnVlLCB0aCwgb2JqKTsKICAgICAgICAgICAgdGhpcy5fYWRkKHRoKTsKICAgICAgICAgICAgcmV0dXJuIHRoOwogICAgICAgIH0KICAgIH07CiAgICAKICAgIAogICAgJC5qcXBsb3QuVGhlbWUgPSBmdW5jdGlvbihuYW1lLCBvYmopIHsKICAgICAgICBpZiAodHlwZW9mKG5hbWUpID09ICdvYmplY3QnKSB7CiAgICAgICAgICAgIG9iaiA9IG9iaiB8fCBuYW1lOwogICAgICAgICAgICBuYW1lID0gbnVsbDsKICAgICAgICB9CiAgICAgICAgbmFtZSA9IG5hbWUgfHwgRGF0ZS5wYXJzZShuZXcgRGF0ZSgpKTsKICAgICAgICB0aGlzLl9uYW1lID0gbmFtZTsKICAgICAgICB0aGlzLnRhcmdldCA9IHsKICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiBudWxsCiAgICAgICAgfTsKICAgICAgICB0aGlzLmxlZ2VuZCA9IHsKICAgICAgICAgICAgdGV4dENvbG9yOiBudWxsLAogICAgICAgICAgICBmb250RmFtaWx5OiBudWxsLAogICAgICAgICAgICBmb250U2l6ZTogbnVsbCwKICAgICAgICAgICAgYm9yZGVyOiBudWxsLAogICAgICAgICAgICBiYWNrZ3JvdW5kOiBudWxsCiAgICAgICAgfTsKICAgICAgICB0aGlzLnRpdGxlID0gewogICAgICAgICAgICB0ZXh0Q29sb3I6IG51bGwsCiAgICAgICAgICAgIGZvbnRGYW1pbHk6IG51bGwsCiAgICAgICAgICAgIGZvbnRTaXplOiBudWxsLAogICAgICAgICAgICB0ZXh0QWxpZ246IG51bGwKICAgICAgICB9OwogICAgICAgIHRoaXMuc2VyaWVzU3R5bGVzID0ge307CiAgICAgICAgdGhpcy5zZXJpZXMgPSBbXTsKICAgICAgICB0aGlzLmdyaWQgPSB7CiAgICAgICAgICAgIGRyYXdHcmlkbGluZXM6IG51bGwsCiAgICAgICAgICAgIGdyaWRMaW5lQ29sb3I6IG51bGwsCiAgICAgICAgICAgIGdyaWRMaW5lV2lkdGg6IG51bGwsCiAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogbnVsbCwKICAgICAgICAgICAgYm9yZGVyQ29sb3I6IG51bGwsCiAgICAgICAgICAgIGJvcmRlcldpZHRoOiBudWxsLAogICAgICAgICAgICBzaGFkb3c6IG51bGwKICAgICAgICB9OwogICAgICAgIHRoaXMuYXhlc1N0eWxlcyA9IHtsYWJlbDp7fSwgdGlja3M6e319OwogICAgICAgIHRoaXMuYXhlcyA9IHt9OwogICAgICAgIGlmICh0eXBlb2Yob2JqKSA9PSAnc3RyaW5nJykgewogICAgICAgICAgICB0aGlzLl9uYW1lID0gb2JqOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmKHR5cGVvZihvYmopID09ICdvYmplY3QnKSB7CiAgICAgICAgICAgICQuanFwbG90LmV4dGVuZCh0cnVlLCB0aGlzLCBvYmopOwogICAgICAgIH0KICAgIH07CiAgICAKICAgIHZhciBBeGlzUHJvcGVydGllcyA9IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuYm9yZGVyQ29sb3IgPSBudWxsOwogICAgICAgIHRoaXMuYm9yZGVyV2lkdGggPSBudWxsOwogICAgICAgIHRoaXMudGlja3MgPSBuZXcgQXhpc1RpY2tzKCk7CiAgICAgICAgdGhpcy5sYWJlbCA9IG5ldyBBeGlzTGFiZWwoKTsKICAgIH07CiAgICAKICAgIHZhciBBeGlzVGlja3MgPSBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLnNob3cgPSBudWxsOwogICAgICAgIHRoaXMuc2hvd0dyaWRsaW5lID0gbnVsbDsKICAgICAgICB0aGlzLnNob3dMYWJlbCA9IG51bGw7CiAgICAgICAgdGhpcy5zaG93TWFyayA9IG51bGw7CiAgICAgICAgdGhpcy5zaXplID0gbnVsbDsKICAgICAgICB0aGlzLnRleHRDb2xvciA9IG51bGw7CiAgICAgICAgdGhpcy53aGl0ZVNwYWNlID0gbnVsbDsKICAgICAgICB0aGlzLmZvbnRTaXplID0gbnVsbDsKICAgICAgICB0aGlzLmZvbnRGYW1pbHkgPSBudWxsOwogICAgfTsKICAgIAogICAgdmFyIEF4aXNMYWJlbCA9IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMudGV4dENvbG9yID0gbnVsbDsKICAgICAgICB0aGlzLndoaXRlU3BhY2UgPSBudWxsOwogICAgICAgIHRoaXMuZm9udFNpemUgPSBudWxsOwogICAgICAgIHRoaXMuZm9udEZhbWlseSA9IG51bGw7CiAgICAgICAgdGhpcy5mb250V2VpZ2h0ID0gbnVsbDsKICAgIH07CiAgICAKICAgIHZhciBMaW5lU2VyaWVzUHJvcGVydGllcyA9IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuY29sb3I9bnVsbDsKICAgICAgICB0aGlzLmxpbmVXaWR0aD1udWxsOwogICAgICAgIHRoaXMubGluZVBhdHRlcm49bnVsbDsKICAgICAgICB0aGlzLnNoYWRvdz1udWxsOwogICAgICAgIHRoaXMuZmlsbENvbG9yPW51bGw7CiAgICAgICAgdGhpcy5zaG93TWFya2VyPW51bGw7CiAgICAgICAgdGhpcy5tYXJrZXJPcHRpb25zID0gbmV3IE1hcmtlck9wdGlvbnMoKTsKICAgIH07CiAgICAKICAgIHZhciBNYXJrZXJPcHRpb25zID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5zaG93ID0gbnVsbDsKICAgICAgICB0aGlzLnN0eWxlID0gbnVsbDsKICAgICAgICB0aGlzLmxpbmVXaWR0aCA9IG51bGw7CiAgICAgICAgdGhpcy5zaXplID0gbnVsbDsKICAgICAgICB0aGlzLmNvbG9yID0gbnVsbDsKICAgICAgICB0aGlzLnNoYWRvdyA9IG51bGw7CiAgICB9OwogICAgCiAgICB2YXIgQmFyU2VyaWVzUHJvcGVydGllcyA9IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuY29sb3I9bnVsbDsKICAgICAgICB0aGlzLnNlcmllc0NvbG9ycz1udWxsOwogICAgICAgIHRoaXMubGluZVdpZHRoPW51bGw7CiAgICAgICAgdGhpcy5zaGFkb3c9bnVsbDsKICAgICAgICB0aGlzLmJhclBhZGRpbmc9bnVsbDsKICAgICAgICB0aGlzLmJhck1hcmdpbj1udWxsOwogICAgICAgIHRoaXMuYmFyV2lkdGg9bnVsbDsKICAgICAgICB0aGlzLmhpZ2hsaWdodENvbG9ycz1udWxsOwogICAgfTsKICAgIAogICAgdmFyIFBpZVNlcmllc1Byb3BlcnRpZXMgPSBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLnNlcmllc0NvbG9ycz1udWxsOwogICAgICAgIHRoaXMucGFkZGluZz1udWxsOwogICAgICAgIHRoaXMuc2xpY2VNYXJnaW49bnVsbDsKICAgICAgICB0aGlzLmZpbGw9bnVsbDsKICAgICAgICB0aGlzLnNoYWRvdz1udWxsOwogICAgICAgIHRoaXMuc3RhcnRBbmdsZT1udWxsOwogICAgICAgIHRoaXMubGluZVdpZHRoPW51bGw7CiAgICAgICAgdGhpcy5oaWdobGlnaHRDb2xvcnM9bnVsbDsKICAgIH07CiAgICAKICAgIHZhciBEb251dFNlcmllc1Byb3BlcnRpZXMgPSBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLnNlcmllc0NvbG9ycz1udWxsOwogICAgICAgIHRoaXMucGFkZGluZz1udWxsOwogICAgICAgIHRoaXMuc2xpY2VNYXJnaW49bnVsbDsKICAgICAgICB0aGlzLmZpbGw9bnVsbDsKICAgICAgICB0aGlzLnNoYWRvdz1udWxsOwogICAgICAgIHRoaXMuc3RhcnRBbmdsZT1udWxsOwogICAgICAgIHRoaXMubGluZVdpZHRoPW51bGw7CiAgICAgICAgdGhpcy5pbm5lckRpYW1ldGVyPW51bGw7CiAgICAgICAgdGhpcy50aGlja25lc3M9bnVsbDsKICAgICAgICB0aGlzLnJpbmdNYXJnaW49bnVsbDsKICAgICAgICB0aGlzLmhpZ2hsaWdodENvbG9ycz1udWxsOwogICAgfTsKICAgIAogICAgdmFyIEZ1bm5lbFNlcmllc1Byb3BlcnRpZXMgPSBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLmNvbG9yPW51bGw7CiAgICAgICAgdGhpcy5saW5lV2lkdGg9bnVsbDsKICAgICAgICB0aGlzLnNoYWRvdz1udWxsOwogICAgICAgIHRoaXMucGFkZGluZz1udWxsOwogICAgICAgIHRoaXMuc2VjdGlvbk1hcmdpbj1udWxsOwogICAgICAgIHRoaXMuc2VyaWVzQ29sb3JzPW51bGw7CiAgICAgICAgdGhpcy5oaWdobGlnaHRDb2xvcnM9bnVsbDsKICAgIH07CiAgICAKICAgIHZhciBNZXRlclNlcmllc1Byb3BlcnRpZXMgPSBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLnBhZGRpbmc9bnVsbDsKICAgICAgICB0aGlzLmJhY2tncm91bmRDb2xvcj1udWxsOwogICAgICAgIHRoaXMucmluZ0NvbG9yPW51bGw7CiAgICAgICAgdGhpcy50aWNrQ29sb3I9bnVsbDsKICAgICAgICB0aGlzLnJpbmdXaWR0aD1udWxsOwogICAgICAgIHRoaXMuaW50ZXJ2YWxDb2xvcnM9bnVsbDsKICAgICAgICB0aGlzLmludGVydmFsSW5uZXJSYWRpdXM9bnVsbDsKICAgICAgICB0aGlzLmludGVydmFsT3V0ZXJSYWRpdXM9bnVsbDsKICAgICAgICB0aGlzLmh1YlJhZGl1cz1udWxsOwogICAgICAgIHRoaXMubmVlZGxlVGhpY2tuZXNzPW51bGw7CiAgICAgICAgdGhpcy5uZWVkbGVQYWQ9bnVsbDsKICAgIH07CiAgICAgICAgCgoKCiAgICAkLmZuLmpxcGxvdENoaWxkVGV4dCA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiAkKHRoaXMpLmNvbnRlbnRzKCkuZmlsdGVyKGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5ub2RlVHlwZSA9PSAzOyAgLy8gTm9kZS5URVhUX05PREUgbm90IGRlZmluZWQgaW4gSTcKICAgICAgICB9KS50ZXh0KCk7CiAgICB9OwoKICAgIC8vIFJldHVybnMgZm9udCBzdHlsZSBhcyBhYmJyZXZpYXRpb24gZm9yICJmb250IiBwcm9wZXJ0eS4KICAgICQuZm4uanFwbG90R2V0Q29tcHV0ZWRGb250U3R5bGUgPSBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgY3NzID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUgPyAgd2luZG93LmdldENvbXB1dGVkU3R5bGUodGhpc1swXSkgOiB0aGlzWzBdLmN1cnJlbnRTdHlsZTsKICAgICAgICB2YXIgYXR0cnMgPSBjc3NbJ2ZvbnQtc3R5bGUnXSA/IFsnZm9udC1zdHlsZScsICdmb250LXdlaWdodCcsICdmb250LXNpemUnLCAnZm9udC1mYW1pbHknXSA6IFsnZm9udFN0eWxlJywgJ2ZvbnRXZWlnaHQnLCAnZm9udFNpemUnLCAnZm9udEZhbWlseSddOwogICAgICAgIHZhciBzdHlsZSA9IFtdOwoKICAgICAgICBmb3IgKHZhciBpPTAgOyBpIDwgYXR0cnMubGVuZ3RoOyArK2kpIHsKICAgICAgICAgICAgdmFyIGF0dHIgPSBTdHJpbmcoY3NzW2F0dHJzW2ldXSk7CgogICAgICAgICAgICBpZiAoYXR0ciAmJiBhdHRyICE9ICdub3JtYWwnKSB7CiAgICAgICAgICAgICAgICBzdHlsZS5wdXNoKGF0dHIpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBzdHlsZS5qb2luKCcgJyk7CiAgICB9OwoKICAgIC8qKgogICAgICogTmFtZXNwYWNlOiAkLmZuCiAgICAgKiBqUXVlcnkgbmFtZXNwYWNlIHRvIGF0dGFjaCBmdW5jdGlvbnMgdG8galF1ZXJ5IGVsZW1lbnRzLgogICAgICogIAogICAgICovCgogICAgJC5mbi5qcXBsb3RUb0ltYWdlQ2FudmFzID0gZnVuY3Rpb24ob3B0aW9ucykgewoKICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKICAgICAgICB2YXIgeF9vZmZzZXQgPSAob3B0aW9ucy54X29mZnNldCA9PSBudWxsKSA/IDAgOiBvcHRpb25zLnhfb2Zmc2V0OwogICAgICAgIHZhciB5X29mZnNldCA9IChvcHRpb25zLnlfb2Zmc2V0ID09IG51bGwpID8gMCA6IG9wdGlvbnMueV9vZmZzZXQ7CiAgICAgICAgdmFyIGJhY2tncm91bmRDb2xvciA9IChvcHRpb25zLmJhY2tncm91bmRDb2xvciA9PSBudWxsKSA/ICdyZ2IoMjU1LDI1NSwyNTUpJyA6IG9wdGlvbnMuYmFja2dyb3VuZENvbG9yOwoKICAgICAgICBpZiAoJCh0aGlzKS53aWR0aCgpID09IDAgfHwgJCh0aGlzKS5oZWlnaHQoKSA9PSAwKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KCiAgICAgICAgLy8gZXhjYW52YXMgYW5kIGhlbmNlIElFIDwgOSBkbyBub3Qgc3VwcG9ydCB0b0RhdGFVUkwgYW5kIGNhbm5vdCBleHBvcnQgaW1hZ2VzLgogICAgICAgIGlmICghJC5qcXBsb3Quc3VwcG9ydF9jYW52YXMpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIHZhciBuZXdDYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKTsKICAgICAgICB2YXIgaCA9ICQodGhpcykub3V0ZXJIZWlnaHQodHJ1ZSk7CiAgICAgICAgdmFyIHcgPSAkKHRoaXMpLm91dGVyV2lkdGgodHJ1ZSk7CiAgICAgICAgdmFyIG9mZnMgPSAkKHRoaXMpLm9mZnNldCgpOwogICAgICAgIHZhciBwbG90bGVmdCA9IG9mZnMubGVmdDsKICAgICAgICB2YXIgcGxvdHRvcCA9IG9mZnMudG9wOwogICAgICAgIHZhciB0cmFuc3ggPSAwLCB0cmFuc3kgPSAwOwoKICAgICAgICAvLyBoYXZlIHRvIGNoZWNrIGlmIGFueSBlbGVtZW50cyBhcmUgaGFuZ2luZyBvdXRzaWRlIG9mIHBsb3QgYXJlYSBiZWZvcmUgcmVuZGVyaW5nLAogICAgICAgIC8vIHNpbmNlIGNoYW5naW5nIHdpZHRoIG9mIGNhbnZhcyB3aWxsIGVyYXNlIGNhbnZhcy4KCiAgICAgICAgdmFyIGNsc2VzID0gWydqcXBsb3QtdGFibGUtbGVnZW5kJywgJ2pxcGxvdC14YXhpcy10aWNrJywgJ2pxcGxvdC14MmF4aXMtdGljaycsICdqcXBsb3QteWF4aXMtdGljaycsICdqcXBsb3QteTJheGlzLXRpY2snLCAnanFwbG90LXkzYXhpcy10aWNrJywgCiAgICAgICAgJ2pxcGxvdC15NGF4aXMtdGljaycsICdqcXBsb3QteTVheGlzLXRpY2snLCAnanFwbG90LXk2YXhpcy10aWNrJywgJ2pxcGxvdC15N2F4aXMtdGljaycsICdqcXBsb3QteThheGlzLXRpY2snLCAnanFwbG90LXk5YXhpcy10aWNrJywKICAgICAgICAnanFwbG90LXhheGlzLWxhYmVsJywgJ2pxcGxvdC14MmF4aXMtbGFiZWwnLCAnanFwbG90LXlheGlzLWxhYmVsJywgJ2pxcGxvdC15MmF4aXMtbGFiZWwnLCAnanFwbG90LXkzYXhpcy1sYWJlbCcsICdqcXBsb3QteTRheGlzLWxhYmVsJywgCiAgICAgICAgJ2pxcGxvdC15NWF4aXMtbGFiZWwnLCAnanFwbG90LXk2YXhpcy1sYWJlbCcsICdqcXBsb3QteTdheGlzLWxhYmVsJywgJ2pxcGxvdC15OGF4aXMtbGFiZWwnLCAnanFwbG90LXk5YXhpcy1sYWJlbCcgXTsKCiAgICAgICAgdmFyIHRlbXB0b3AsIHRlbXBsZWZ0LCB0ZW1wYm90dG9tLCB0ZW1wcmlnaHQ7CgogICAgICAgIGZvciAodmFyIGkgaW4gY2xzZXMpIHsKICAgICAgICAgICAgJCh0aGlzKS5maW5kKCcuJytjbHNlc1tpXSkuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHRlbXB0b3AgPSAkKHRoaXMpLm9mZnNldCgpLnRvcCAtIHBsb3R0b3A7CiAgICAgICAgICAgICAgICB0ZW1wbGVmdCA9ICQodGhpcykub2Zmc2V0KCkubGVmdCAtIHBsb3RsZWZ0OwogICAgICAgICAgICAgICAgdGVtcHJpZ2h0ID0gdGVtcGxlZnQgKyAkKHRoaXMpLm91dGVyV2lkdGgodHJ1ZSkgKyB0cmFuc3g7CiAgICAgICAgICAgICAgICB0ZW1wYm90dG9tID0gdGVtcHRvcCArICQodGhpcykub3V0ZXJIZWlnaHQodHJ1ZSkgKyB0cmFuc3k7CiAgICAgICAgICAgICAgICBpZiAodGVtcGxlZnQgPCAtdHJhbnN4KSB7CiAgICAgICAgICAgICAgICAgICAgdyA9IHcgLSB0cmFuc3ggLSB0ZW1wbGVmdDsKICAgICAgICAgICAgICAgICAgICB0cmFuc3ggPSAtdGVtcGxlZnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAodGVtcHRvcCA8IC10cmFuc3kpIHsKICAgICAgICAgICAgICAgICAgICBoID0gaCAtIHRyYW5zeSAtIHRlbXB0b3A7CiAgICAgICAgICAgICAgICAgICAgdHJhbnN5ID0gLSB0ZW1wdG9wOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHRlbXByaWdodCA+IHcpIHsKICAgICAgICAgICAgICAgICAgICB3ID0gdGVtcHJpZ2h0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHRlbXBib3R0b20gPiBoKSB7CiAgICAgICAgICAgICAgICAgICAgaCA9ICB0ZW1wYm90dG9tOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIG5ld0NhbnZhcy53aWR0aCA9IHcgKyBOdW1iZXIoeF9vZmZzZXQpOwogICAgICAgIG5ld0NhbnZhcy5oZWlnaHQgPSBoICsgTnVtYmVyKHlfb2Zmc2V0KTsKCiAgICAgICAgdmFyIG5ld0NvbnRleHQgPSBuZXdDYW52YXMuZ2V0Q29udGV4dCgiMmQiKTsgCgogICAgICAgIG5ld0NvbnRleHQuc2F2ZSgpOwogICAgICAgIG5ld0NvbnRleHQuZmlsbFN0eWxlID0gYmFja2dyb3VuZENvbG9yOwogICAgICAgIG5ld0NvbnRleHQuZmlsbFJlY3QoMCwwLCBuZXdDYW52YXMud2lkdGgsIG5ld0NhbnZhcy5oZWlnaHQpOwogICAgICAgIG5ld0NvbnRleHQucmVzdG9yZSgpOwoKICAgICAgICBuZXdDb250ZXh0LnRyYW5zbGF0ZSh0cmFuc3gsIHRyYW5zeSk7CiAgICAgICAgbmV3Q29udGV4dC50ZXh0QWxpZ24gPSAnbGVmdCc7CiAgICAgICAgbmV3Q29udGV4dC50ZXh0QmFzZWxpbmUgPSAndG9wJzsKCiAgICAgICAgZnVuY3Rpb24gZ2V0TGluZWhlaWdodChlbCkgewogICAgICAgICAgICB2YXIgbGluZWhlaWdodCA9IHBhcnNlSW50KCQoZWwpLmNzcygnbGluZS1oZWlnaHQnKSwgMTApOwoKICAgICAgICAgICAgaWYgKGlzTmFOKGxpbmVoZWlnaHQpKSB7CiAgICAgICAgICAgICAgICBsaW5laGVpZ2h0ID0gcGFyc2VJbnQoJChlbCkuY3NzKCdmb250LXNpemUnKSwgMTApICogMS4yOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBsaW5laGVpZ2h0OwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gd3JpdGVXcmFwcGVkVGV4dCAoZWwsIGNvbnRleHQsIHRleHQsIGxlZnQsIHRvcCwgY2FudmFzV2lkdGgpIHsKICAgICAgICAgICAgdmFyIGxpbmVoZWlnaHQgPSBnZXRMaW5laGVpZ2h0KGVsKTsKICAgICAgICAgICAgdmFyIHRhZ3dpZHRoID0gJChlbCkuaW5uZXJXaWR0aCgpOwogICAgICAgICAgICB2YXIgdGFnaGVpZ2h0ID0gJChlbCkuaW5uZXJIZWlnaHQoKTsKICAgICAgICAgICAgdmFyIHdvcmRzID0gdGV4dC5zcGxpdCgvXHMrLyk7CiAgICAgICAgICAgIHZhciB3bCA9IHdvcmRzLmxlbmd0aDsKICAgICAgICAgICAgdmFyIHcgPSAnJzsKICAgICAgICAgICAgdmFyIGJyZWFrcyA9IFtdOwogICAgICAgICAgICB2YXIgdGVtcHRvcCA9IHRvcDsKICAgICAgICAgICAgdmFyIHRlbXBsZWZ0ID0gbGVmdDsKCiAgICAgICAgICAgIGZvciAodmFyIGk9MDsgaTx3bDsgaSsrKSB7CiAgICAgICAgICAgICAgICB3ICs9IHdvcmRzW2ldOwogICAgICAgICAgICAgICAgaWYgKGNvbnRleHQubWVhc3VyZVRleHQodykud2lkdGggPiB0YWd3aWR0aCkgewogICAgICAgICAgICAgICAgICAgIGJyZWFrcy5wdXNoKGkpOwogICAgICAgICAgICAgICAgICAgIHcgPSAnJzsKICAgICAgICAgICAgICAgIH0gICAKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoYnJlYWtzLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgLy8gY2VudGVyIHRleHQgaWYgbmVjZXNzYXJ5CiAgICAgICAgICAgICAgICBpZiAoJChlbCkuY3NzKCd0ZXh0QWxpZ24nKSA9PT0gJ2NlbnRlcicpIHsKICAgICAgICAgICAgICAgICAgICB0ZW1wbGVmdCA9IGxlZnQgKyAoY2FudmFzV2lkdGggLSBjb250ZXh0Lm1lYXN1cmVUZXh0KHcpLndpZHRoKS8yICAtIHRyYW5zeDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNvbnRleHQuZmlsbFRleHQodGV4dCwgdGVtcGxlZnQsIHRvcCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICB3ID0gd29yZHMuc2xpY2UoMCwgYnJlYWtzWzBdKS5qb2luKCcgJyk7CiAgICAgICAgICAgICAgICAvLyBjZW50ZXIgdGV4dCBpZiBuZWNlc3NhcnkKICAgICAgICAgICAgICAgIGlmICgkKGVsKS5jc3MoJ3RleHRBbGlnbicpID09PSAnY2VudGVyJykgewogICAgICAgICAgICAgICAgICAgIHRlbXBsZWZ0ID0gbGVmdCArIChjYW52YXNXaWR0aCAtIGNvbnRleHQubWVhc3VyZVRleHQodykud2lkdGgpLzIgIC0gdHJhbnN4OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY29udGV4dC5maWxsVGV4dCh3LCB0ZW1wbGVmdCwgdGVtcHRvcCk7CiAgICAgICAgICAgICAgICB0ZW1wdG9wICs9IGxpbmVoZWlnaHQ7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpPTEsIGw9YnJlYWtzLmxlbmd0aDsgaTxsOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICB3ID0gd29yZHMuc2xpY2UoYnJlYWtzW2ktMV0sIGJyZWFrc1tpXSkuam9pbignICcpOwogICAgICAgICAgICAgICAgICAgIC8vIGNlbnRlciB0ZXh0IGlmIG5lY2Vzc2FyeQogICAgICAgICAgICAgICAgICAgIGlmICgkKGVsKS5jc3MoJ3RleHRBbGlnbicpID09PSAnY2VudGVyJykgewogICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGVmdCA9IGxlZnQgKyAoY2FudmFzV2lkdGggLSBjb250ZXh0Lm1lYXN1cmVUZXh0KHcpLndpZHRoKS8yICAtIHRyYW5zeDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY29udGV4dC5maWxsVGV4dCh3LCB0ZW1wbGVmdCwgdGVtcHRvcCk7CiAgICAgICAgICAgICAgICAgICAgdGVtcHRvcCArPSBsaW5laGVpZ2h0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdyA9IHdvcmRzLnNsaWNlKGJyZWFrc1tpLTFdLCB3b3Jkcy5sZW5ndGgpLmpvaW4oJyAnKTsKICAgICAgICAgICAgICAgIC8vIGNlbnRlciB0ZXh0IGlmIG5lY2Vzc2FyeQogICAgICAgICAgICAgICAgaWYgKCQoZWwpLmNzcygndGV4dEFsaWduJykgPT09ICdjZW50ZXInKSB7CiAgICAgICAgICAgICAgICAgICAgdGVtcGxlZnQgPSBsZWZ0ICsgKGNhbnZhc1dpZHRoIC0gY29udGV4dC5tZWFzdXJlVGV4dCh3KS53aWR0aCkvMiAgLSB0cmFuc3g7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjb250ZXh0LmZpbGxUZXh0KHcsIHRlbXBsZWZ0LCB0ZW1wdG9wKTsKICAgICAgICAgICAgfQoKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIF9qcXBUb0ltYWdlKGVsLCB4X29mZnNldCwgeV9vZmZzZXQpIHsKICAgICAgICAgICAgdmFyIHRhZ25hbWUgPSBlbC50YWdOYW1lLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgICAgIHZhciBwID0gJChlbCkucG9zaXRpb24oKTsKICAgICAgICAgICAgdmFyIGNzcyA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlID8gIHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsKSA6IGVsLmN1cnJlbnRTdHlsZTsgLy8gZm9yIElFIDwgOQogICAgICAgICAgICB2YXIgbGVmdCA9IHhfb2Zmc2V0ICsgcC5sZWZ0ICsgcGFyc2VJbnQoY3NzLm1hcmdpbkxlZnQsIDEwKSArIHBhcnNlSW50KGNzcy5ib3JkZXJMZWZ0V2lkdGgsIDEwKSArIHBhcnNlSW50KGNzcy5wYWRkaW5nTGVmdCwgMTApOwogICAgICAgICAgICB2YXIgdG9wID0geV9vZmZzZXQgKyBwLnRvcCArIHBhcnNlSW50KGNzcy5tYXJnaW5Ub3AsIDEwKSArIHBhcnNlSW50KGNzcy5ib3JkZXJUb3BXaWR0aCwgMTApKyBwYXJzZUludChjc3MucGFkZGluZ1RvcCwgMTApOwogICAgICAgICAgICB2YXIgdyA9IG5ld0NhbnZhcy53aWR0aDsKICAgICAgICAgICAgLy8gdmFyIGxlZnQgPSB4X29mZnNldCArIHAubGVmdCArICQoZWwpLmNzcygnbWFyZ2luTGVmdCcpICsgJChlbCkuY3NzKCdib3JkZXJMZWZ0V2lkdGgnKSAKCiAgICAgICAgICAgIGlmICgodGFnbmFtZSA9PSAnZGl2JyB8fCB0YWduYW1lID09ICdzcGFuJykgJiYgISQoZWwpLmhhc0NsYXNzKCdqcXBsb3QtaGlnaGxpZ2h0ZXItdG9vbHRpcCcpKSB7CiAgICAgICAgICAgICAgICAkKGVsKS5jaGlsZHJlbigpLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgX2pxcFRvSW1hZ2UodGhpcywgbGVmdCwgdG9wKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgdmFyIHRleHQgPSAkKGVsKS5qcXBsb3RDaGlsZFRleHQoKTsKCiAgICAgICAgICAgICAgICBpZiAodGV4dCkgewogICAgICAgICAgICAgICAgICAgIG5ld0NvbnRleHQuZm9udCA9ICQoZWwpLmpxcGxvdEdldENvbXB1dGVkRm9udFN0eWxlKCk7CiAgICAgICAgICAgICAgICAgICAgbmV3Q29udGV4dC5maWxsU3R5bGUgPSAkKGVsKS5jc3MoJ2NvbG9yJyk7CgogICAgICAgICAgICAgICAgICAgIHdyaXRlV3JhcHBlZFRleHQoZWwsIG5ld0NvbnRleHQsIHRleHQsIGxlZnQsIHRvcCwgdyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGhhbmRsZSB0aGUgc3RhbmRhcmQgdGFibGUgbGVnZW5kCgogICAgICAgICAgICBlbHNlIGlmICh0YWduYW1lID09PSAndGFibGUnICYmICQoZWwpLmhhc0NsYXNzKCdqcXBsb3QtdGFibGUtbGVnZW5kJykpIHsKICAgICAgICAgICAgICAgIG5ld0NvbnRleHQuc3Ryb2tlU3R5bGUgPSAkKGVsKS5jc3MoJ2JvcmRlci10b3AtY29sb3InKTsKICAgICAgICAgICAgICAgIG5ld0NvbnRleHQuZmlsbFN0eWxlID0gJChlbCkuY3NzKCdiYWNrZ3JvdW5kLWNvbG9yJyk7CiAgICAgICAgICAgICAgICBuZXdDb250ZXh0LmZpbGxSZWN0KGxlZnQsIHRvcCwgJChlbCkuaW5uZXJXaWR0aCgpLCAkKGVsKS5pbm5lckhlaWdodCgpKTsKICAgICAgICAgICAgICAgIGlmIChwYXJzZUludCgkKGVsKS5jc3MoJ2JvcmRlci10b3Atd2lkdGgnKSwgMTApID4gMCkgewogICAgICAgICAgICAgICAgICAgIG5ld0NvbnRleHQuc3Ryb2tlUmVjdChsZWZ0LCB0b3AsICQoZWwpLmlubmVyV2lkdGgoKSwgJChlbCkuaW5uZXJIZWlnaHQoKSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gZmluZCBhbGwgdGhlIHN3YXRjaGVzCiAgICAgICAgICAgICAgICAkKGVsKS5maW5kKCdkaXYuanFwbG90LXRhYmxlLWxlZ2VuZC1zd2F0Y2gtb3V0bGluZScpLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBmaXJzdCBkaXYgYW5kIHN0cm9rZSBpdAogICAgICAgICAgICAgICAgICAgIHZhciBlbGVtID0gJCh0aGlzKTsKICAgICAgICAgICAgICAgICAgICBuZXdDb250ZXh0LnN0cm9rZVN0eWxlID0gZWxlbS5jc3MoJ2JvcmRlci10b3AtY29sb3InKTsKICAgICAgICAgICAgICAgICAgICB2YXIgbCA9IGxlZnQgKyBlbGVtLnBvc2l0aW9uKCkubGVmdDsKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHRvcCArIGVsZW0ucG9zaXRpb24oKS50b3A7CiAgICAgICAgICAgICAgICAgICAgbmV3Q29udGV4dC5zdHJva2VSZWN0KGwsIHQsIGVsZW0uaW5uZXJXaWR0aCgpLCBlbGVtLmlubmVySGVpZ2h0KCkpOwoKICAgICAgICAgICAgICAgICAgICAvLyBub3cgZmlsbCB0aGUgc3dhdGNoCiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgbCArPSBwYXJzZUludChlbGVtLmNzcygncGFkZGluZy1sZWZ0JyksIDEwKTsKICAgICAgICAgICAgICAgICAgICB0ICs9IHBhcnNlSW50KGVsZW0uY3NzKCdwYWRkaW5nLXRvcCcpLCAxMCk7CiAgICAgICAgICAgICAgICAgICAgdmFyIGggPSBlbGVtLmlubmVySGVpZ2h0KCkgLSAyICogcGFyc2VJbnQoZWxlbS5jc3MoJ3BhZGRpbmctdG9wJyksIDEwKTsKICAgICAgICAgICAgICAgICAgICB2YXIgdyA9IGVsZW0uaW5uZXJXaWR0aCgpIC0gMiAqIHBhcnNlSW50KGVsZW0uY3NzKCdwYWRkaW5nLWxlZnQnKSwgMTApOwoKICAgICAgICAgICAgICAgICAgICB2YXIgc3dhdGNoID0gZWxlbS5jaGlsZHJlbignZGl2LmpxcGxvdC10YWJsZS1sZWdlbmQtc3dhdGNoJyk7CiAgICAgICAgICAgICAgICAgICAgbmV3Q29udGV4dC5maWxsU3R5bGUgPSBzd2F0Y2guY3NzKCdiYWNrZ3JvdW5kLWNvbG9yJyk7CiAgICAgICAgICAgICAgICAgICAgbmV3Q29udGV4dC5maWxsUmVjdChsLCB0LCB3LCBoKTsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIC8vIG5vdyBhZGQgdGV4dAoKICAgICAgICAgICAgICAgICQoZWwpLmZpbmQoJ3RkLmpxcGxvdC10YWJsZS1sZWdlbmQtbGFiZWwnKS5lYWNoKGZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICAgICAgdmFyIGVsZW0gPSAkKHRoaXMpOwogICAgICAgICAgICAgICAgICAgIHZhciBsID0gbGVmdCArIGVsZW0ucG9zaXRpb24oKS5sZWZ0OwogICAgICAgICAgICAgICAgICAgIHZhciB0ID0gdG9wICsgZWxlbS5wb3NpdGlvbigpLnRvcCArIHBhcnNlSW50KGVsZW0uY3NzKCdwYWRkaW5nLXRvcCcpLCAxMCk7CiAgICAgICAgICAgICAgICAgICAgbmV3Q29udGV4dC5mb250ID0gZWxlbS5qcXBsb3RHZXRDb21wdXRlZEZvbnRTdHlsZSgpOwogICAgICAgICAgICAgICAgICAgIG5ld0NvbnRleHQuZmlsbFN0eWxlID0gZWxlbS5jc3MoJ2NvbG9yJyk7CiAgICAgICAgICAgICAgICAgICAgbmV3Q29udGV4dC5maWxsVGV4dChlbGVtLnRleHQoKSwgbCwgdCk7CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICB2YXIgZWxlbSA9IG51bGw7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGVsc2UgaWYgKHRhZ25hbWUgPT0gJ2NhbnZhcycpIHsKICAgICAgICAgICAgICAgIG5ld0NvbnRleHQuZHJhd0ltYWdlKGVsLCBsZWZ0LCB0b3ApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICQodGhpcykuY2hpbGRyZW4oKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICBfanFwVG9JbWFnZSh0aGlzLCB4X29mZnNldCwgeV9vZmZzZXQpOwogICAgICAgIH0pOwogICAgICAgIHJldHVybiBuZXdDYW52YXM7CiAgICB9OwoKICAgICQuZm4uanFwbG90VG9JbWFnZVN0ciA9IGZ1bmN0aW9uKG9wdGlvbnMpIHsKICAgICAgICB2YXIgaW1nQ2FudmFzID0gJCh0aGlzKS5qcXBsb3RUb0ltYWdlQ2FudmFzKG9wdGlvbnMpOwogICAgICAgIGlmIChpbWdDYW52YXMpIHsKICAgICAgICAgICAgcmV0dXJuIGltZ0NhbnZhcy50b0RhdGFVUkwoImltYWdlL3BuZyIpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgfTsKCiAgICAvLyBjcmVhdGUgYW4gPGltZz4gZWxlbWVudCBhbmQgcmV0dXJuIGl0LgogICAgLy8gU2hvdWxkIHdvcmsgb24gY2FudmFzIHN1cHBvcnRpbmcgYnJvd3NlcnMuCiAgICAkLmZuLmpxcGxvdFRvSW1hZ2VFbGVtID0gZnVuY3Rpb24ob3B0aW9ucykgewogICAgICAgIHZhciBlbGVtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIik7CiAgICAgICAgdmFyIHN0ciA9ICQodGhpcykuanFwbG90VG9JbWFnZVN0cihvcHRpb25zKTsKICAgICAgICBlbGVtLnNyYyA9IHN0cjsKICAgICAgICByZXR1cm4gZWxlbTsKICAgIH07CgogICAgLy8gY3JlYXRlIGFuIDxpbWc+IGVsZW1lbnQgYW5kIHJldHVybiBpdC4KICAgIC8vIFNob3VsZCB3b3JrIG9uIGNhbnZhcyBzdXBwb3J0aW5nIGJyb3dzZXJzLgogICAgJC5mbi5qcXBsb3RUb0ltYWdlRWxlbVN0ciA9IGZ1bmN0aW9uKG9wdGlvbnMpIHsKICAgICAgICB2YXIgc3RyID0gJzxpbWcgc3JjPScrJCh0aGlzKS5qcXBsb3RUb0ltYWdlU3RyKG9wdGlvbnMpKycgLz4nOwogICAgICAgIHJldHVybiBzdHI7CiAgICB9OwoKICAgIC8vIE5vdCBnYXVyYW50ZWVkIHRvIHdvcmssIGV2ZW4gb24gY2FudmFzIHN1cHBvcnRpbmcgYnJvd3NlcnMgZHVlIHRvIAogICAgLy8gbGltaXRhdGlvbnMgd2l0aCBsb2NhdGlvbi5ocmVmIGFuZCBicm93c2VyIHN1cHBvcnQuCiAgICAkLmZuLmpxcGxvdFNhdmVJbWFnZSA9IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBpbWdEYXRhID0gJCh0aGlzKS5qcXBsb3RUb0ltYWdlU3RyKHt9KTsKICAgICAgICBpZiAoaW1nRGF0YSkgewogICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IGltZ0RhdGEucmVwbGFjZSgiaW1hZ2UvcG5nIiwgImltYWdlL29jdGV0LXN0cmVhbSIpOwogICAgICAgIH0KCiAgICB9OwoKICAgIC8vIE5vdCBnYXVyYW50ZWVkIHRvIHdvcmssIGV2ZW4gb24gY2FudmFzIHN1cHBvcnRpbmcgYnJvd3NlcnMgZHVlIHRvCiAgICAvLyBsaW1pdGF0aW9ucyB3aXRoIHdpbmRvdy5vcGVuIGFuZCBhcmJpdHJhcnkgZGF0YS4KICAgICQuZm4uanFwbG90Vmlld0ltYWdlID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIGltZ1N0ciA9ICQodGhpcykuanFwbG90VG9JbWFnZUVsZW1TdHIoe30pOwogICAgICAgIHZhciBpbWdEYXRhID0gJCh0aGlzKS5qcXBsb3RUb0ltYWdlU3RyKHt9KTsKICAgICAgICBpZiAoaW1nU3RyKSB7CiAgICAgICAgICAgIHZhciB3ID0gd2luZG93Lm9wZW4oJycpOwogICAgICAgICAgICB3LmRvY3VtZW50Lm9wZW4oImltYWdlL3BuZyIpOwogICAgICAgICAgICB3LmRvY3VtZW50LndyaXRlKGltZ1N0cik7CiAgICAgICAgICAgIHcuZG9jdW1lbnQuY2xvc2UoKTsKICAgICAgICAgICAgdyA9IG51bGw7CiAgICAgICAgfQogICAgfTsKICAgIAoKCiAgICAvKiogCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqIDxwPk9iamVjdCB3aXRoIGV4dGVuZGVkIGRhdGUgcGFyc2luZyBhbmQgZm9ybWF0dGluZyBjYXBhYmlsaXRpZXMuCiAgICAgKiBUaGlzIGxpYnJhcnkgYm9ycm93cyBtYW55IGNvbmNlcHRzIGFuZCBpZGVhcyBmcm9tIHRoZSBEYXRlIEluc3RhbmNlIAogICAgICogTWV0aG9kcyBieSBLZW4gU255ZGVyIGFsb25nIHdpdGggc29tZSBwYXJ0cyBvZiBLZW4ncyBhY3R1YWwgY29kZS48L3A+CiAgICAgKgogICAgICogPHA+anNEYXRlIHRha2VzIGEgZGlmZmVyZW50IGFwcHJvYWNoIGJ5IG5vdCBleHRlbmRpbmcgdGhlIGJ1aWx0LWluIAogICAgICogRGF0ZSBPYmplY3QsIGltcHJvdmluZyBkYXRlIHBhcnNpbmcsIGFsbG93aW5nIGZvciBtdWx0aXBsZSBmb3JtYXR0aW5nIAogICAgICogc3ludGF4ZXMgYW5kIG11bHRpcGxlIGFuZCBtb3JlIGVhc2lseSBleHBhbmRhYmxlIGxvY2FsaXphdGlvbi48L3A+CiAgICAgKiAKICAgICAqIEBhdXRob3IgQ2hyaXMgTGVvbmVsbG8KICAgICAqIEBkYXRlICNkYXRlIwogICAgICogQHZlcnNpb24gI1ZFUlNJT04jCiAgICAgKiBAY29weXJpZ2h0IChjKSAyMDEwIENocmlzIExlb25lbGxvCiAgICAgKiBqc0RhdGUgaXMgY3VycmVudGx5IGF2YWlsYWJsZSBmb3IgdXNlIGluIGFsbCBwZXJzb25hbCBvciBjb21tZXJjaWFsIHByb2plY3RzIAogICAgICogdW5kZXIgYm90aCB0aGUgTUlUIGFuZCBHUEwgdmVyc2lvbiAyLjAgbGljZW5zZXMuIFRoaXMgbWVhbnMgdGhhdCB5b3UgY2FuIAogICAgICogY2hvb3NlIHRoZSBsaWNlbnNlIHRoYXQgYmVzdCBzdWl0cyB5b3VyIHByb2plY3QgYW5kIHVzZSBpdCBhY2NvcmRpbmdseS4KICAgICAqIAogICAgICogPHA+S2VuJ3Mgb3JpZ2lhbmwgRGF0ZSBJbnN0YW5jZSBNZXRob2RzIGFuZCBjb3B5cmlnaHQgbm90aWNlOjwvcD4KICAgICAqIDxwcmU+CiAgICAgKiBLZW4gU255ZGVyIChrZW4gZCBzbnlkZXIgYXQgZ21haWwgZG90IGNvbSkKICAgICAqIDIwMDgtMDktMTAKICAgICAqIHZlcnNpb24gMi4wLjIgKGh0dHA6Ly9rZW5kc255ZGVyLmNvbS9zYW5kYm94L2RhdGUvKSAgICAgCiAgICAgKiBDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uIExpY2Vuc2UgMy4wIChodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9ieS8zLjAvKQogICAgICogPC9wcmU+CiAgICAgKiAKICAgICAqIEBjbGFzcwogICAgICogQG5hbWUganNEYXRlCiAgICAgKiBAcGFyYW0gIHtTdHJpbmcgfCBOdW1iZXIgfCBBcnJheSB8IERhdGUmbmJzcDtPYmplY3QgfCBPcHRpb25zJm5ic3A7T2JqZWN0fSBhcmd1bWVudHMgT3B0aW9uYWwgYXJndW1lbnRzLCBlaXRoZXIgYSBwYXJzYWJsZSBkYXRlL3RpbWUgc3RyaW5nLAogICAgICogYSBKYXZhU2NyaXB0IHRpbWVzdGFtcCwgYW4gYXJyYXkgb2YgbnVtYmVycyBvZiBmb3JtIFt5ZWFyLCBtb250aCwgZGF5LCBob3VycywgbWludXRlcywgc2Vjb25kcywgbWlsbGlzZWNvbmRzXSwKICAgICAqIGEgRGF0ZSBvYmplY3QsIG9yIGFuIG9wdGlvbnMgb2JqZWN0IG9mIGZvcm0ge3N5bnRheDogInBlcmwiLCBkYXRlOnNvbWUgRGF0ZX0gd2hlcmUgYWxsIG9wdGlvbnMgYXJlIG9wdGlvbmFsLgogICAgICovCiAgICAgCiAgICB2YXIganNEYXRlID0gZnVuY3Rpb24gKCkgewogICAgCiAgICAgICAgdGhpcy5zeW50YXggPSBqc0RhdGUuY29uZmlnLnN5bnRheDsKICAgICAgICB0aGlzLl90eXBlID0gImpzRGF0ZSI7CiAgICAgICAgdGhpcy5wcm94eSA9IG5ldyBEYXRlKCk7CiAgICAgICAgdGhpcy5vcHRpb25zID0ge307CiAgICAgICAgdGhpcy5sb2NhbGUgPSBqc0RhdGUucmVnaW9uYWwuZ2V0TG9jYWxlKCk7CiAgICAgICAgdGhpcy5mb3JtYXRTdHJpbmcgPSAnJzsKICAgICAgICB0aGlzLmRlZmF1bHRDZW50dXJ5ID0ganNEYXRlLmNvbmZpZy5kZWZhdWx0Q2VudHVyeTsKCiAgICAgICAgc3dpdGNoICggYXJndW1lbnRzLmxlbmd0aCApIHsKICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgICAgIC8vIG90aGVyIG9iamVjdHMgZWl0aGVyIHdvbid0IGhhdmUgYSBfdHlwZSBwcm9wZXJ0eSBvciwKICAgICAgICAgICAgICAgIC8vIGlmIHRoZXkgZG8sIGl0IHNob3VsZG4ndCBiZSBzZXQgdG8gImpzRGF0ZSIsIHNvCiAgICAgICAgICAgICAgICAvLyBhc3N1bWUgaXQgaXMgYW4gb3B0aW9ucyBhcmd1bWVudC4KICAgICAgICAgICAgICAgIGlmIChnZXRfdHlwZShhcmd1bWVudHNbMF0pID09ICJbb2JqZWN0IE9iamVjdF0iICYmIGFyZ3VtZW50c1swXS5fdHlwZSAhPSAianNEYXRlIikgewogICAgICAgICAgICAgICAgICAgIHZhciBvcHRzID0gdGhpcy5vcHRpb25zID0gYXJndW1lbnRzWzBdOwogICAgICAgICAgICAgICAgICAgIHRoaXMuc3ludGF4ID0gb3B0cy5zeW50YXggfHwgdGhpcy5zeW50YXg7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWZhdWx0Q2VudHVyeSA9IG9wdHMuZGVmYXVsdENlbnR1cnkgfHwgdGhpcy5kZWZhdWx0Q2VudHVyeTsKICAgICAgICAgICAgICAgICAgICB0aGlzLnByb3h5ID0ganNEYXRlLmNyZWF0ZURhdGUob3B0cy5kYXRlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHRoaXMucHJveHkgPSBqc0RhdGUuY3JlYXRlRGF0ZShhcmd1bWVudHNbMF0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICB2YXIgYSA9IFtdOwogICAgICAgICAgICAgICAgZm9yICggdmFyIGk9MDsgaTxhcmd1bWVudHMubGVuZ3RoOyBpKysgKSB7CiAgICAgICAgICAgICAgICAgICAgYS5wdXNoKGFyZ3VtZW50c1tpXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvLyB0aGlzIHNob3VsZCBiZSB0aGUgY3VycmVudCBkYXRlL3RpbWU/CiAgICAgICAgICAgICAgICB0aGlzLnByb3h5ID0gbmV3IERhdGUoKTsKICAgICAgICAgICAgICAgIHRoaXMucHJveHkuc2V0RnVsbFllYXIuYXBwbHkoIHRoaXMucHJveHksIGEuc2xpY2UoMCwzKSApOwogICAgICAgICAgICAgICAgaWYgKCBhLnNsaWNlKDMpLmxlbmd0aCApIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLnByb3h5LnNldEhvdXJzLmFwcGx5KCB0aGlzLnByb3h5LCBhLnNsaWNlKDMpICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICB9OwogICAgCiAgICAvKioKICAgICAqIEBuYW1lc3BhY2UgQ29uZmlndXJhdGlvbiBvcHRpb25zIHRoYXQgd2lsbCBiZSB1c2VkIGFzIGRlZmF1bHRzIGZvciBhbGwgaW5zdGFuY2VzIG9uIHRoZSBwYWdlLgogICAgICogQHByb3BlcnR5IHtTdHJpbmd9IGRlZmF1bHRMb2NhbGUgVGhlIGRlZmF1bHQgbG9jYWxlIHRvIHVzZSBbZW5dLgogICAgICogQHByb3BlcnR5IHtTdHJpbmd9IHN5bnRheCBUaGUgZGVmYXVsdCBzeW50YXggdG8gdXNlIFtwZXJsXS4KICAgICAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBkZWZhdWx0Q2VudHVyeSBUaGUgZGVmYXVsdCBjZW50cnkgZm9yIDIgZGlnaXQgZGF0ZXMuCiAgICAgKi8KICAgIGpzRGF0ZS5jb25maWcgPSB7CiAgICAgICAgZGVmYXVsdExvY2FsZTogJ2VuJywKICAgICAgICBzeW50YXg6ICdwZXJsJywKICAgICAgICBkZWZhdWx0Q2VudHVyeTogMTkwMAogICAgfTsKICAgICAgICAKICAgIC8qKgogICAgICogQWRkIGFuIGFyYml0cmFyeSBhbW91bnQgdG8gdGhlIGN1cnJlbnRseSBzdG9yZWQgZGF0ZQogICAgICogCiAgICAgKiBAcGFyYW0ge051bWJlcn0gbnVtYmVyICAgICAgCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdW5pdAogICAgICogQHJldHVybnMge2pzRGF0ZX0gICAgICAgCiAgICAgKi8KICAgICAKICAgIGpzRGF0ZS5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24obnVtYmVyLCB1bml0KSB7CiAgICAgICAgdmFyIGZhY3RvciA9IG11bHRpcGxpZXJzW3VuaXRdIHx8IG11bHRpcGxpZXJzLmRheTsKICAgICAgICBpZiAodHlwZW9mIGZhY3RvciA9PSAnbnVtYmVyJykgewogICAgICAgICAgICB0aGlzLnByb3h5LnNldFRpbWUodGhpcy5wcm94eS5nZXRUaW1lKCkgKyAoZmFjdG9yICogbnVtYmVyKSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZmFjdG9yLmFkZCh0aGlzLCBudW1iZXIpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpczsKICAgIH07CiAgICAgICAgCiAgICAvKioKICAgICAqIENyZWF0ZSBhIG5ldyBqcXBsb3QuZGF0ZSBvYmplY3Qgd2l0aCB0aGUgc2FtZSBkYXRlCiAgICAgKiAKICAgICAqIEByZXR1cm5zIHtqc0RhdGV9CiAgICAgKi8gIAogICAgIAogICAganNEYXRlLnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gbmV3IGpzRGF0ZSh0aGlzLnByb3h5LmdldFRpbWUoKSk7CiAgICB9OwoKICAgIC8qKgogICAgICogR2V0IHRoZSBVVEMgVGltZVpvbmUgT2Zmc2V0IG9mIHRoaXMgZGF0ZSBpbiBtaWxsaXNlY29uZHMuCiAgICAgKgogICAgICogQHJldHVybnMge051bWJlcn0KICAgICAqLwoKICAgIGpzRGF0ZS5wcm90b3R5cGUuZ2V0VXRjT2Zmc2V0ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMucHJveHkuZ2V0VGltZXpvbmVPZmZzZXQoKSAqIDYwMDAwOwogICAgfTsKCiAgICAvKioKICAgICAqIEZpbmQgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGlzIGpzRGF0ZSBhbmQgYW5vdGhlciBkYXRlLgogICAgICogCiAgICAgKiBAcGFyYW0ge1N0cmluZ3wgTnVtYmVyfCBBcnJheXwganNEYXRlJm5ic3A7T2JqZWN0fCBEYXRlJm5ic3A7T2JqZWN0fSBkYXRlT2JqCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdW5pdAogICAgICogQHBhcmFtIHtCb29sZWFufSBhbGxvd0RlY2ltYWwKICAgICAqIEByZXR1cm5zIHtOdW1iZXJ9IE51bWJlciBvZiB1bml0cyBkaWZmZXJlbmNlIGJldHdlZW4gZGF0ZXMuCiAgICAgKi8KICAgICAKICAgIGpzRGF0ZS5wcm90b3R5cGUuZGlmZiA9IGZ1bmN0aW9uKGRhdGVPYmosIHVuaXQsIGFsbG93RGVjaW1hbCkgewogICAgICAgIC8vIGVuc3VyZSB3ZSBoYXZlIGEgRGF0ZSBvYmplY3QKICAgICAgICBkYXRlT2JqID0gbmV3IGpzRGF0ZShkYXRlT2JqKTsKICAgICAgICBpZiAoZGF0ZU9iaiA9PT0gbnVsbCkgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgLy8gZ2V0IHRoZSBtdWx0aXBseWluZyBmYWN0b3IgaW50ZWdlciBvciBmYWN0b3IgZnVuY3Rpb24KICAgICAgICB2YXIgZmFjdG9yID0gbXVsdGlwbGllcnNbdW5pdF0gfHwgbXVsdGlwbGllcnMuZGF5OwogICAgICAgIGlmICh0eXBlb2YgZmFjdG9yID09ICdudW1iZXInKSB7CiAgICAgICAgICAgIC8vIG11bHRpcGx5CiAgICAgICAgICAgIHZhciB1bml0RGlmZiA9ICh0aGlzLnByb3h5LmdldFRpbWUoKSAtIGRhdGVPYmoucHJveHkuZ2V0VGltZSgpKSAvIGZhY3RvcjsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvLyBydW4gZnVuY3Rpb24KICAgICAgICAgICAgdmFyIHVuaXREaWZmID0gZmFjdG9yLmRpZmYodGhpcy5wcm94eSwgZGF0ZU9iai5wcm94eSk7CiAgICAgICAgfQogICAgICAgIC8vIGlmIGRlY2ltYWxzIGFyZSBub3QgYWxsb3dlZCwgcm91bmQgdG93YXJkIHplcm8KICAgICAgICByZXR1cm4gKGFsbG93RGVjaW1hbCA/IHVuaXREaWZmIDogTWF0aFt1bml0RGlmZiA+IDAgPyAnZmxvb3InIDogJ2NlaWwnXSh1bml0RGlmZikpOyAgICAgICAgICAKICAgIH07CiAgICAKICAgIC8qKgogICAgICogR2V0IHRoZSBhYmJyZXZpYXRlZCBuYW1lIG9mIHRoZSBjdXJyZW50IHdlZWsgZGF5CiAgICAgKiAKICAgICAqIEByZXR1cm5zIHtTdHJpbmd9CiAgICAgKi8gICAKICAgICAKICAgIGpzRGF0ZS5wcm90b3R5cGUuZ2V0QWJickRheU5hbWUgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4ganNEYXRlLnJlZ2lvbmFsW3RoaXMubG9jYWxlXVsiZGF5TmFtZXNTaG9ydCJdW3RoaXMucHJveHkuZ2V0RGF5KCldOwogICAgfTsKICAgIAogICAgLyoqCiAgICAgKiBHZXQgdGhlIGFiYnJldmlhdGVkIG5hbWUgb2YgdGhlIGN1cnJlbnQgbW9udGgKICAgICAqIAogICAgICogQHJldHVybnMge1N0cmluZ30KICAgICAqLwogICAgIAogICAganNEYXRlLnByb3RvdHlwZS5nZXRBYmJyTW9udGhOYW1lID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIGpzRGF0ZS5yZWdpb25hbFt0aGlzLmxvY2FsZV1bIm1vbnRoTmFtZXNTaG9ydCJdW3RoaXMucHJveHkuZ2V0TW9udGgoKV07CiAgICB9OwogICAgCiAgICAvKioKICAgICAqIEdldCBVUFBFUiBDQVNFIEFNIG9yIFBNIGZvciB0aGUgY3VycmVudCB0aW1lCiAgICAgKiAKICAgICAqIEByZXR1cm5zIHtTdHJpbmd9CiAgICAgKi8KICAgICAKICAgIGpzRGF0ZS5wcm90b3R5cGUuZ2V0QU1QTSA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLnByb3h5LmdldEhvdXJzKCkgPj0gMTIgPyAnUE0nIDogJ0FNJzsKICAgIH07CiAgICAKICAgIC8qKgogICAgICogR2V0IGxvd2VyIGNhc2UgYW0gb3IgcG0gZm9yIHRoZSBjdXJyZW50IHRpbWUKICAgICAqIAogICAgICogQHJldHVybnMge1N0cmluZ30KICAgICAqLwogICAgIAogICAganNEYXRlLnByb3RvdHlwZS5nZXRBbVBtID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMucHJveHkuZ2V0SG91cnMoKSA+PSAxMiA/ICdwbScgOiAnYW0nOwogICAgfTsKICAgIAogICAgLyoqCiAgICAgKiBHZXQgdGhlIGNlbnR1cnkgKDE5IGZvciAyMHRoIENlbnR1cnkpCiAgICAgKgogICAgICogQHJldHVybnMge0ludGVnZXJ9IENlbnR1cnkgKDE5IGZvciAyMHRoIGNlbnR1cnkpLgogICAgICovCiAgICBqc0RhdGUucHJvdG90eXBlLmdldENlbnR1cnkgPSBmdW5jdGlvbigpIHsgCiAgICAgICAgcmV0dXJuIHBhcnNlSW50KHRoaXMucHJveHkuZ2V0RnVsbFllYXIoKS8xMDAsIDEwKTsKICAgIH07CiAgICAKICAgIC8qKgogICAgICogSW1wbGVtZW50cyBEYXRlIGZ1bmN0aW9uYWxpdHkKICAgICAqLwogICAganNEYXRlLnByb3RvdHlwZS5nZXREYXRlID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMucHJveHkuZ2V0RGF0ZSgpOwogICAgfTsKICAgIAogICAgLyoqCiAgICAgKiBJbXBsZW1lbnRzIERhdGUgZnVuY3Rpb25hbGl0eQogICAgICovCiAgICBqc0RhdGUucHJvdG90eXBlLmdldERheSA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLnByb3h5LmdldERheSgpOwogICAgfTsKICAgIAogICAgLyoqCiAgICAgKiBHZXQgdGhlIERheSBvZiB3ZWVrIDEgKE1vbmRheSkgdGhydSA3IChTdW5kYXkpCiAgICAgKiAKICAgICAqIEByZXR1cm5zIHtJbnRlZ2VyfSBEYXkgb2Ygd2VlayAxIChNb25kYXkpIHRocnUgNyAoU3VuZGF5KQogICAgICovCiAgICBqc0RhdGUucHJvdG90eXBlLmdldERheU9mV2VlayA9IGZ1bmN0aW9uKCkgeyAKICAgICAgICB2YXIgZG93ID0gdGhpcy5wcm94eS5nZXREYXkoKTsgCiAgICAgICAgcmV0dXJuIGRvdz09PTA/Nzpkb3c7IAogICAgfTsKICAgIAogICAgLyoqCiAgICAgKiBHZXQgdGhlIGRheSBvZiB0aGUgeWVhcgogICAgICogCiAgICAgKiBAcmV0dXJucyB7SW50ZWdlcn0gMSAtIDM2NiwgZGF5IG9mIHRoZSB5ZWFyCiAgICAgKi8KICAgIGpzRGF0ZS5wcm90b3R5cGUuZ2V0RGF5T2ZZZWFyID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIGQgPSB0aGlzLnByb3h5OwogICAgICAgIHZhciBtcyA9IGQgLSBuZXcgRGF0ZSgnJyArIGQuZ2V0RnVsbFllYXIoKSArICcvMS8xIEdNVCcpOwogICAgICAgIG1zICs9IGQuZ2V0VGltZXpvbmVPZmZzZXQoKSo2MDAwMDsKICAgICAgICBkID0gbnVsbDsKICAgICAgICByZXR1cm4gcGFyc2VJbnQobXMvNjAwMDAvNjAvMjQsIDEwKSsxOwogICAgfTsKICAgIAogICAgLyoqCiAgICAgKiBHZXQgdGhlIG5hbWUgb2YgdGhlIGN1cnJlbnQgd2VlayBkYXkKICAgICAqIAogICAgICogQHJldHVybnMge1N0cmluZ30KICAgICAqLyAgCiAgICAgCiAgICBqc0RhdGUucHJvdG90eXBlLmdldERheU5hbWUgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4ganNEYXRlLnJlZ2lvbmFsW3RoaXMubG9jYWxlXVsiZGF5TmFtZXMiXVt0aGlzLnByb3h5LmdldERheSgpXTsKICAgIH07CiAgICAKICAgIC8qKgogICAgICogR2V0IHRoZSB3ZWVrIG51bWJlciBvZiB0aGUgZ2l2ZW4geWVhciwgc3RhcnRpbmcgd2l0aCB0aGUgZmlyc3QgU3VuZGF5IGFzIHRoZSBmaXJzdCB3ZWVrCiAgICAgKiBAcmV0dXJucyB7SW50ZWdlcn0gV2VlayBudW1iZXIgKDEzIGZvciB0aGUgMTN0aCBmdWxsIHdlZWsgb2YgdGhlIHllYXIpLgogICAgICovCiAgICBqc0RhdGUucHJvdG90eXBlLmdldEZ1bGxXZWVrT2ZZZWFyID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIGQgPSB0aGlzLnByb3h5OwogICAgICAgIHZhciBkb3kgPSB0aGlzLmdldERheU9mWWVhcigpOwogICAgICAgIHZhciByZG93ID0gNi1kLmdldERheSgpOwogICAgICAgIHZhciB3b3kgPSBwYXJzZUludCgoZG95K3Jkb3cpLzcsIDEwKTsKICAgICAgICByZXR1cm4gd295OwogICAgfTsKICAgIAogICAgLyoqCiAgICAgKiBJbXBsZW1lbnRzIERhdGUgZnVuY3Rpb25hbGl0eQogICAgICovCiAgICBqc0RhdGUucHJvdG90eXBlLmdldEZ1bGxZZWFyID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMucHJveHkuZ2V0RnVsbFllYXIoKTsKICAgIH07CiAgICAKICAgIC8qKgogICAgICogR2V0IHRoZSBHTVQgb2Zmc2V0IGluIGhvdXJzIGFuZCBtaW51dGVzIChlLmcuICswNjozMCkKICAgICAqIAogICAgICogQHJldHVybnMge1N0cmluZ30KICAgICAqLwogICAgIAogICAganNEYXRlLnByb3RvdHlwZS5nZXRHbXRPZmZzZXQgPSBmdW5jdGlvbigpIHsKICAgICAgICAvLyBkaXZpZGUgdGhlIG1pbnV0ZXMgb2Zmc2V0IGJ5IDYwCiAgICAgICAgdmFyIGhvdXJzID0gdGhpcy5wcm94eS5nZXRUaW1lem9uZU9mZnNldCgpIC8gNjA7CiAgICAgICAgLy8gZGVjaWRlIGlmIHdlIGFyZSBhaGVhZCBvZiBvciBiZWhpbmQgR01UCiAgICAgICAgdmFyIHByZWZpeCA9IGhvdXJzIDwgMCA/ICcrJyA6ICctJzsKICAgICAgICAvLyByZW1vdmUgdGhlIG5lZ2F0aXZlIHNpZ24gaWYgYW55CiAgICAgICAgaG91cnMgPSBNYXRoLmFicyhob3Vycyk7CiAgICAgICAgLy8gYWRkIHRoZSArLy0gdG8gdGhlIHBhZGRlZCBudW1iZXIgb2YgaG91cnMgdG8gOiB0byB0aGUgcGFkZGVkIG1pbnV0ZXMKICAgICAgICByZXR1cm4gcHJlZml4ICsgYWRkWmVyb3MoTWF0aC5mbG9vcihob3VycyksIDIpICsgJzonICsgYWRkWmVyb3MoKGhvdXJzICUgMSkgKiA2MCwgMik7CiAgICB9OwogICAgCiAgICAvKioKICAgICAqIEltcGxlbWVudHMgRGF0ZSBmdW5jdGlvbmFsaXR5CiAgICAgKi8KICAgIGpzRGF0ZS5wcm90b3R5cGUuZ2V0SG91cnMgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpcy5wcm94eS5nZXRIb3VycygpOwogICAgfTsKICAgIAogICAgLyoqCiAgICAgKiBHZXQgdGhlIGN1cnJlbnQgaG91ciBvbiBhIDEyLWhvdXIgc2NoZW1lCiAgICAgKiAKICAgICAqIEByZXR1cm5zIHtJbnRlZ2VyfQogICAgICovCiAgICAgCiAgICBqc0RhdGUucHJvdG90eXBlLmdldEhvdXJzMTIgID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIGhvdXJzID0gdGhpcy5wcm94eS5nZXRIb3VycygpOwogICAgICAgIHJldHVybiBob3VycyA+IDEyID8gaG91cnMgLSAxMiA6IChob3VycyA9PSAwID8gMTIgOiBob3Vycyk7CiAgICB9OwogICAgCiAgICAKICAgIGpzRGF0ZS5wcm90b3R5cGUuZ2V0SXNvV2VlayA9IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBkID0gdGhpcy5wcm94eTsKICAgICAgICB2YXIgd295ID0gZC5nZXRXZWVrT2ZZZWFyKCk7CiAgICAgICAgdmFyIGRvdzFfMSA9IChuZXcgRGF0ZSgnJyArIGQuZ2V0RnVsbFllYXIoKSArICcvMS8xJykpLmdldERheSgpOwogICAgICAgIC8vIEZpcnN0IHdlZWsgaXMgMDEgYW5kIG5vdCAwMCBhcyBpbiB0aGUgY2FzZSBvZiAlVSBhbmQgJVcsCiAgICAgICAgLy8gc28gd2UgYWRkIDEgdG8gdGhlIGZpbmFsIHJlc3VsdCBleGNlcHQgaWYgZGF5IDEgb2YgdGhlIHllYXIKICAgICAgICAvLyBpcyBhIE1vbmRheSAodGhlbiAlVyByZXR1cm5zIDAxKS4KICAgICAgICAvLyBXZSBhbHNvIG5lZWQgdG8gc3VidHJhY3QgMSBpZiB0aGUgZGF5IDEgb2YgdGhlIHllYXIgaXMgCiAgICAgICAgLy8gRnJpZGF5LVN1bmRheSwgc28gdGhlIHJlc3VsdGluZyBlcXVhdGlvbiBiZWNvbWVzOgogICAgICAgIHZhciBpZG93ID0gd295ICsgKGRvdzFfMSA+IDQgfHwgZG93MV8xIDw9IDEgPyAwIDogMSk7CiAgICAgICAgaWYoaWRvdyA9PSA1MyAmJiAobmV3IERhdGUoJycgKyBkLmdldEZ1bGxZZWFyKCkgKyAnLzEyLzMxJykpLmdldERheSgpIDwgNCkKICAgICAgICB7CiAgICAgICAgICAgIGlkb3cgPSAxOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmKGlkb3cgPT09IDApCiAgICAgICAgewogICAgICAgICAgICBkID0gbmV3IGpzRGF0ZShuZXcgRGF0ZSgnJyArIChkLmdldEZ1bGxZZWFyKCktMSkgKyAnLzEyLzMxJykpOwogICAgICAgICAgICBpZG93ID0gZC5nZXRJc29XZWVrKCk7CiAgICAgICAgfQogICAgICAgIGQgPSBudWxsOwogICAgICAgIHJldHVybiBpZG93OwogICAgfTsKICAgIAogICAgLyoqCiAgICAgKiBJbXBsZW1lbnRzIERhdGUgZnVuY3Rpb25hbGl0eQogICAgICovCiAgICBqc0RhdGUucHJvdG90eXBlLmdldE1pbGxpc2Vjb25kcyA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLnByb3h5LmdldE1pbGxpc2Vjb25kcygpOwogICAgfTsKICAgIAogICAgLyoqCiAgICAgKiBJbXBsZW1lbnRzIERhdGUgZnVuY3Rpb25hbGl0eQogICAgICovCiAgICBqc0RhdGUucHJvdG90eXBlLmdldE1pbnV0ZXMgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpcy5wcm94eS5nZXRNaW51dGVzKCk7CiAgICB9OwogICAgCiAgICAvKioKICAgICAqIEltcGxlbWVudHMgRGF0ZSBmdW5jdGlvbmFsaXR5CiAgICAgKi8KICAgIGpzRGF0ZS5wcm90b3R5cGUuZ2V0TW9udGggPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpcy5wcm94eS5nZXRNb250aCgpOwogICAgfTsKICAgIAogICAgLyoqCiAgICAgKiBHZXQgdGhlIG5hbWUgb2YgdGhlIGN1cnJlbnQgbW9udGgKICAgICAqIAogICAgICogQHJldHVybnMge1N0cmluZ30KICAgICAqLwogICAgIAogICAganNEYXRlLnByb3RvdHlwZS5nZXRNb250aE5hbWUgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4ganNEYXRlLnJlZ2lvbmFsW3RoaXMubG9jYWxlXVsibW9udGhOYW1lcyJdW3RoaXMucHJveHkuZ2V0TW9udGgoKV07CiAgICB9OwogICAgCiAgICAvKioKICAgICAqIEdldCB0aGUgbnVtYmVyIG9mIHRoZSBjdXJyZW50IG1vbnRoLCAxLTEyCiAgICAgKiAKICAgICAqIEByZXR1cm5zIHtJbnRlZ2VyfQogICAgICovCiAgICAgCiAgICBqc0RhdGUucHJvdG90eXBlLmdldE1vbnRoTnVtYmVyID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMucHJveHkuZ2V0TW9udGgoKSArIDE7CiAgICB9OwogICAgCiAgICAvKioKICAgICAqIEltcGxlbWVudHMgRGF0ZSBmdW5jdGlvbmFsaXR5CiAgICAgKi8KICAgIGpzRGF0ZS5wcm90b3R5cGUuZ2V0U2Vjb25kcyA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLnByb3h5LmdldFNlY29uZHMoKTsKICAgIH07CiAgICAKICAgIC8qKgogICAgICogUmV0dXJuIGEgcHJvcGVyIHR3by1kaWdpdCB5ZWFyIGludGVnZXIKICAgICAqIAogICAgICogQHJldHVybnMge0ludGVnZXJ9CiAgICAgKi8KICAgICAKICAgIGpzRGF0ZS5wcm90b3R5cGUuZ2V0U2hvcnRZZWFyID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMucHJveHkuZ2V0WWVhcigpICUgMTAwOwogICAgfTsKICAgIAogICAgLyoqCiAgICAgKiBJbXBsZW1lbnRzIERhdGUgZnVuY3Rpb25hbGl0eQogICAgICovCiAgICBqc0RhdGUucHJvdG90eXBlLmdldFRpbWUgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpcy5wcm94eS5nZXRUaW1lKCk7CiAgICB9OwogICAgCiAgICAvKioKICAgICAqIEdldCB0aGUgdGltZXpvbmUgYWJicmV2aWF0aW9uCiAgICAgKgogICAgICogQHJldHVybnMge1N0cmluZ30gQWJicmV2aWF0aW9uIGZvciB0aGUgdGltZXpvbmUKICAgICAqLwogICAganNEYXRlLnByb3RvdHlwZS5nZXRUaW1lem9uZUFiYnIgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpcy5wcm94eS50b1N0cmluZygpLnJlcGxhY2UoL14uKlwoKFteKV0rKVwpJC8sICckMScpOyAKICAgIH07CiAgICAKICAgIC8qKgogICAgICogR2V0IHRoZSBicm93c2VyLXJlcG9ydGVkIG5hbWUgZm9yIHRoZSBjdXJyZW50IHRpbWV6b25lIChlLmcuIE1EVCwgTW91bnRhaW4gRGF5bGlnaHQgVGltZSkKICAgICAqIAogICAgICogQHJldHVybnMge1N0cmluZ30KICAgICAqLwogICAganNEYXRlLnByb3RvdHlwZS5nZXRUaW1lem9uZU5hbWUgPSBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgbWF0Y2ggPSAvKD86XCgoLispXCkkfCAoW0EtWl17M30pICkvLmV4ZWModGhpcy50b1N0cmluZygpKTsKICAgICAgICByZXR1cm4gbWF0Y2hbMV0gfHwgbWF0Y2hbMl0gfHwgJ0dNVCcgKyB0aGlzLmdldEdtdE9mZnNldCgpOwogICAgfTsgCiAgICAKICAgIC8qKgogICAgICogSW1wbGVtZW50cyBEYXRlIGZ1bmN0aW9uYWxpdHkKICAgICAqLwogICAganNEYXRlLnByb3RvdHlwZS5nZXRUaW1lem9uZU9mZnNldCA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLnByb3h5LmdldFRpbWV6b25lT2Zmc2V0KCk7CiAgICB9OwogICAgCiAgICAKICAgIC8qKgogICAgICogR2V0IHRoZSB3ZWVrIG51bWJlciBvZiB0aGUgZ2l2ZW4geWVhciwgc3RhcnRpbmcgd2l0aCB0aGUgZmlyc3QgTW9uZGF5IGFzIHRoZSBmaXJzdCB3ZWVrCiAgICAgKiBAcmV0dXJucyB7SW50ZWdlcn0gV2VlayBudW1iZXIgKDEzIGZvciB0aGUgMTN0aCB3ZWVrIG9mIHRoZSB5ZWFyKS4KICAgICAqLwogICAganNEYXRlLnByb3RvdHlwZS5nZXRXZWVrT2ZZZWFyID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIGRveSA9IHRoaXMuZ2V0RGF5T2ZZZWFyKCk7CiAgICAgICAgdmFyIHJkb3cgPSA3IC0gdGhpcy5nZXREYXlPZldlZWsoKTsKICAgICAgICB2YXIgd295ID0gcGFyc2VJbnQoKGRveStyZG93KS83LCAxMCk7CiAgICAgICAgcmV0dXJuIHdveTsKICAgIH07CiAgICAKICAgIC8qKgogICAgICogR2V0IHRoZSBjdXJyZW50IGRhdGUgYXMgYSBVbml4IHRpbWVzdGFtcAogICAgICogCiAgICAgKiBAcmV0dXJucyB7SW50ZWdlcn0KICAgICAqLwogICAgIAogICAganNEYXRlLnByb3RvdHlwZS5nZXRVbml4ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIE1hdGgucm91bmQodGhpcy5wcm94eS5nZXRUaW1lKCkgLyAxMDAwLCAwKTsKICAgIH07IAogICAgCiAgICAvKioKICAgICAqIEltcGxlbWVudHMgRGF0ZSBmdW5jdGlvbmFsaXR5CiAgICAgKi8KICAgIGpzRGF0ZS5wcm90b3R5cGUuZ2V0WWVhciA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLnByb3h5LmdldFllYXIoKTsKICAgIH07CiAgICAKICAgIC8qKgogICAgICogUmV0dXJuIGEgZGF0ZSBvbmUgZGF5IGFoZWFkIChvciBhbnkgb3RoZXIgdW5pdCkKICAgICAqIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHVuaXQgT3B0aW9uYWwsIHllYXIgfCBtb250aCB8IGRheSB8IHdlZWsgfCBob3VyIHwgbWludXRlIHwgc2Vjb25kIHwgbWlsbGlzZWNvbmQKICAgICAqIEByZXR1cm5zIHtqc0RhdGV9CiAgICAgKi8KICAgICAKICAgIGpzRGF0ZS5wcm90b3R5cGUubmV4dCA9IGZ1bmN0aW9uKHVuaXQpIHsKICAgICAgICB1bml0ID0gdW5pdCB8fCAnZGF5JzsKICAgICAgICByZXR1cm4gdGhpcy5jbG9uZSgpLmFkZCgxLCB1bml0KTsKICAgIH07CiAgICAKICAgIC8qKgogICAgICogU2V0IHRoZSBqc0RhdGUgaW5zdGFuY2UgdG8gYSBuZXcgZGF0ZS4KICAgICAqCiAgICAgKiBAcGFyYW0gIHtTdHJpbmcgfCBOdW1iZXIgfCBBcnJheSB8IERhdGUgT2JqZWN0IHwganNEYXRlIE9iamVjdCB8IE9wdGlvbnMgT2JqZWN0fSBhcmd1bWVudHMgT3B0aW9uYWwgYXJndW1lbnRzLCAKICAgICAqIGVpdGhlciBhIHBhcnNhYmxlIGRhdGUvdGltZSBzdHJpbmcsCiAgICAgKiBhIEphdmFTY3JpcHQgdGltZXN0YW1wLCBhbiBhcnJheSBvZiBudW1iZXJzIG9mIGZvcm0gW3llYXIsIG1vbnRoLCBkYXksIGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzLCBtaWxsaXNlY29uZHNdLAogICAgICogYSBEYXRlIG9iamVjdCwganNEYXRlIE9iamVjdCBvciBhbiBvcHRpb25zIG9iamVjdCBvZiBmb3JtIHtzeW50YXg6ICJwZXJsIiwgZGF0ZTpzb21lIERhdGV9IHdoZXJlIGFsbCBvcHRpb25zIGFyZSBvcHRpb25hbC4KICAgICAqLwogICAganNEYXRlLnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbigpIHsKICAgICAgICBzd2l0Y2ggKCBhcmd1bWVudHMubGVuZ3RoICkgewogICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICB0aGlzLnByb3h5ID0gbmV3IERhdGUoKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgICAvLyBvdGhlciBvYmplY3RzIGVpdGhlciB3b24ndCBoYXZlIGEgX3R5cGUgcHJvcGVydHkgb3IsCiAgICAgICAgICAgICAgICAvLyBpZiB0aGV5IGRvLCBpdCBzaG91bGRuJ3QgYmUgc2V0IHRvICJqc0RhdGUiLCBzbwogICAgICAgICAgICAgICAgLy8gYXNzdW1lIGl0IGlzIGFuIG9wdGlvbnMgYXJndW1lbnQuCiAgICAgICAgICAgICAgICBpZiAoZ2V0X3R5cGUoYXJndW1lbnRzWzBdKSA9PSAiW29iamVjdCBPYmplY3RdIiAmJiBhcmd1bWVudHNbMF0uX3R5cGUgIT0gImpzRGF0ZSIpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgb3B0cyA9IHRoaXMub3B0aW9ucyA9IGFyZ3VtZW50c1swXTsKICAgICAgICAgICAgICAgICAgICB0aGlzLnN5bnRheCA9IG9wdHMuc3ludGF4IHx8IHRoaXMuc3ludGF4OwogICAgICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdENlbnR1cnkgPSBvcHRzLmRlZmF1bHRDZW50dXJ5IHx8IHRoaXMuZGVmYXVsdENlbnR1cnk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm94eSA9IGpzRGF0ZS5jcmVhdGVEYXRlKG9wdHMuZGF0ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLnByb3h5ID0ganNEYXRlLmNyZWF0ZURhdGUoYXJndW1lbnRzWzBdKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgdmFyIGEgPSBbXTsKICAgICAgICAgICAgICAgIGZvciAoIHZhciBpPTA7IGk8YXJndW1lbnRzLmxlbmd0aDsgaSsrICkgewogICAgICAgICAgICAgICAgICAgIGEucHVzaChhcmd1bWVudHNbaV0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gdGhpcyBzaG91bGQgYmUgdGhlIGN1cnJlbnQgZGF0ZS90aW1lCiAgICAgICAgICAgICAgICB0aGlzLnByb3h5ID0gbmV3IERhdGUoKTsKICAgICAgICAgICAgICAgIHRoaXMucHJveHkuc2V0RnVsbFllYXIuYXBwbHkoIHRoaXMucHJveHksIGEuc2xpY2UoMCwzKSApOwogICAgICAgICAgICAgICAgaWYgKCBhLnNsaWNlKDMpLmxlbmd0aCApIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLnByb3h5LnNldEhvdXJzLmFwcGx5KCB0aGlzLnByb3h5LCBhLnNsaWNlKDMpICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICB9OwogICAgCiAgICAvKioKICAgICAqIFNldHMgdGhlIGRheSBvZiB0aGUgbW9udGggZm9yIGEgc3BlY2lmaWVkIGRhdGUgYWNjb3JkaW5nIHRvIGxvY2FsIHRpbWUuCiAgICAgKiBAcGFyYW0ge0ludGVnZXJ9IGRheVZhbHVlIEFuIGludGVnZXIgZnJvbSAxIHRvIDMxLCByZXByZXNlbnRpbmcgdGhlIGRheSBvZiB0aGUgbW9udGguIAogICAgICovCiAgICBqc0RhdGUucHJvdG90eXBlLnNldERhdGUgPSBmdW5jdGlvbihuKSB7CiAgICAgICAgdGhpcy5wcm94eS5zZXREYXRlKG4pOwogICAgICAgIHJldHVybiB0aGlzOwogICAgfTsKICAgIAogICAgLyoqCiAgICAgKiBTZXRzIHRoZSBmdWxsIHllYXIgZm9yIGEgc3BlY2lmaWVkIGRhdGUgYWNjb3JkaW5nIHRvIGxvY2FsIHRpbWUuCiAgICAgKiBAcGFyYW0ge0ludGVnZXJ9IHllYXJWYWx1ZSBUaGUgbnVtZXJpYyB2YWx1ZSBvZiB0aGUgeWVhciwgZm9yIGV4YW1wbGUsIDE5OTUuICAKICAgICAqIEBwYXJhbSB7SW50ZWdlcn0gbW9udGhWYWx1ZSBPcHRpb25hbCwgYmV0d2VlbiAwIGFuZCAxMSByZXByZXNlbnRpbmcgdGhlIG1vbnRocyBKYW51YXJ5IHRocm91Z2ggRGVjZW1iZXIuICAKICAgICAqIEBwYXJhbSB7SW50ZWdlcn0gZGF5VmFsdWUgT3B0aW9uYWwsIGJldHdlZW4gMSBhbmQgMzEgcmVwcmVzZW50aW5nIHRoZSBkYXkgb2YgdGhlIG1vbnRoLiBJZiB5b3Ugc3BlY2lmeSB0aGUgZGF5VmFsdWUgcGFyYW1ldGVyLCB5b3UgbXVzdCBhbHNvIHNwZWNpZnkgdGhlIG1vbnRoVmFsdWUuIAogICAgICovCiAgICBqc0RhdGUucHJvdG90eXBlLnNldEZ1bGxZZWFyID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5wcm94eS5zZXRGdWxsWWVhci5hcHBseSh0aGlzLnByb3h5LCBhcmd1bWVudHMpOwogICAgICAgIHJldHVybiB0aGlzOwogICAgfTsKICAgIAogICAgLyoqCiAgICAgKiBTZXRzIHRoZSBob3VycyBmb3IgYSBzcGVjaWZpZWQgZGF0ZSBhY2NvcmRpbmcgdG8gbG9jYWwgdGltZS4KICAgICAqIAogICAgICogQHBhcmFtIHtJbnRlZ2VyfSBob3Vyc1ZhbHVlIEFuIGludGVnZXIgYmV0d2VlbiAwIGFuZCAyMywgcmVwcmVzZW50aW5nIHRoZSBob3VyLiAgCiAgICAgKiBAcGFyYW0ge0ludGVnZXJ9IG1pbnV0ZXNWYWx1ZSBPcHRpb25hbCwgQW4gaW50ZWdlciBiZXR3ZWVuIDAgYW5kIDU5LCByZXByZXNlbnRpbmcgdGhlIG1pbnV0ZXMuICAKICAgICAqIEBwYXJhbSB7SW50ZWdlcn0gc2Vjb25kc1ZhbHVlIE9wdGlvbmFsLCBBbiBpbnRlZ2VyIGJldHdlZW4gMCBhbmQgNTksIHJlcHJlc2VudGluZyB0aGUgc2Vjb25kcy4gCiAgICAgKiBJZiB5b3Ugc3BlY2lmeSB0aGUgc2Vjb25kc1ZhbHVlIHBhcmFtZXRlciwgeW91IG11c3QgYWxzbyBzcGVjaWZ5IHRoZSBtaW51dGVzVmFsdWUuICAKICAgICAqIEBwYXJhbSB7SW50ZWdlcn0gbXNWYWx1ZSBPcHRpb25hbCwgQSBudW1iZXIgYmV0d2VlbiAwIGFuZCA5OTksIHJlcHJlc2VudGluZyB0aGUgbWlsbGlzZWNvbmRzLiAKICAgICAqIElmIHlvdSBzcGVjaWZ5IHRoZSBtc1ZhbHVlIHBhcmFtZXRlciwgeW91IG11c3QgYWxzbyBzcGVjaWZ5IHRoZSBtaW51dGVzVmFsdWUgYW5kIHNlY29uZHNWYWx1ZS4gCiAgICAgKi8KICAgIGpzRGF0ZS5wcm90b3R5cGUuc2V0SG91cnMgPSBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLnByb3h5LnNldEhvdXJzLmFwcGx5KHRoaXMucHJveHksIGFyZ3VtZW50cyk7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICB9OwogICAgCiAgICAvKioKICAgICAqIEltcGxlbWVudHMgRGF0ZSBmdW5jdGlvbmFsaXR5CiAgICAgKi8gCiAgICBqc0RhdGUucHJvdG90eXBlLnNldE1pbGxpc2Vjb25kcyA9IGZ1bmN0aW9uKG4pIHsKICAgICAgICB0aGlzLnByb3h5LnNldE1pbGxpc2Vjb25kcyhuKTsKICAgICAgICByZXR1cm4gdGhpczsKICAgIH07CiAgICAKICAgIC8qKgogICAgICogSW1wbGVtZW50cyBEYXRlIGZ1bmN0aW9uYWxpdHkKICAgICAqLyAKICAgIGpzRGF0ZS5wcm90b3R5cGUuc2V0TWludXRlcyA9IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMucHJveHkuc2V0TWludXRlcy5hcHBseSh0aGlzLnByb3h5LCBhcmd1bWVudHMpOwogICAgICAgIHJldHVybiB0aGlzOwogICAgfTsKICAgIAogICAgLyoqCiAgICAgKiBJbXBsZW1lbnRzIERhdGUgZnVuY3Rpb25hbGl0eQogICAgICovIAogICAganNEYXRlLnByb3RvdHlwZS5zZXRNb250aCA9IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMucHJveHkuc2V0TW9udGguYXBwbHkodGhpcy5wcm94eSwgYXJndW1lbnRzKTsKICAgICAgICByZXR1cm4gdGhpczsKICAgIH07CiAgICAKICAgIC8qKgogICAgICogSW1wbGVtZW50cyBEYXRlIGZ1bmN0aW9uYWxpdHkKICAgICAqLyAKICAgIGpzRGF0ZS5wcm90b3R5cGUuc2V0U2Vjb25kcyA9IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMucHJveHkuc2V0U2Vjb25kcy5hcHBseSh0aGlzLnByb3h5LCBhcmd1bWVudHMpOwogICAgICAgIHJldHVybiB0aGlzOwogICAgfTsKICAgIAogICAgLyoqCiAgICAgKiBJbXBsZW1lbnRzIERhdGUgZnVuY3Rpb25hbGl0eQogICAgICovIAogICAganNEYXRlLnByb3RvdHlwZS5zZXRUaW1lID0gZnVuY3Rpb24obikgewogICAgICAgIHRoaXMucHJveHkuc2V0VGltZShuKTsKICAgICAgICByZXR1cm4gdGhpczsKICAgIH07CiAgICAKICAgIC8qKgogICAgICogSW1wbGVtZW50cyBEYXRlIGZ1bmN0aW9uYWxpdHkKICAgICAqLyAKICAgIGpzRGF0ZS5wcm90b3R5cGUuc2V0WWVhciA9IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMucHJveHkuc2V0WWVhci5hcHBseSh0aGlzLnByb3h5LCBhcmd1bWVudHMpOwogICAgICAgIHJldHVybiB0aGlzOwogICAgfTsKICAgIAogICAgLyoqCiAgICAgKiBQcm92aWRlIGEgZm9ybWF0dGVkIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIGRhdGUuCiAgICAgKiAKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBmb3JtYXRTdHJpbmcgQSBmb3JtYXQgc3RyaW5nLiAgCiAgICAgKiBTZWU6IHtAbGluayBqc0RhdGUuZm9ybWF0c30uCiAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSBEYXRlIFN0cmluZy4KICAgICAqLwogICAgICAgICAgICAKICAgIGpzRGF0ZS5wcm90b3R5cGUuc3RyZnRpbWUgPSBmdW5jdGlvbihmb3JtYXRTdHJpbmcpIHsKICAgICAgICBmb3JtYXRTdHJpbmcgPSBmb3JtYXRTdHJpbmcgfHwgdGhpcy5mb3JtYXRTdHJpbmcgfHwganNEYXRlLnJlZ2lvbmFsW3RoaXMubG9jYWxlXVsnZm9ybWF0U3RyaW5nJ107CiAgICAgICAgcmV0dXJuIGpzRGF0ZS5zdHJmdGltZSh0aGlzLCBmb3JtYXRTdHJpbmcsIHRoaXMuc3ludGF4KTsKICAgIH07CiAgICAgICAgCiAgICAvKioKICAgICAqIFJldHVybiBhIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIGpzRGF0ZSBvYmplY3QuCiAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSBEYXRlIHN0cmluZy4KICAgICAqLwogICAgCiAgICBqc0RhdGUucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMucHJveHkudG9TdHJpbmcoKTsKICAgIH07CiAgICAgICAgCiAgICAvKioKICAgICAqIENvbnZlcnQgdGhlIGN1cnJlbnQgZGF0ZSB0byBhbiA4LWRpZ2l0IGludGVnZXIgKCVZJW0lZCkKICAgICAqIAogICAgICogQHJldHVybnMge0ludGVnZXJ9CiAgICAgKi8KICAgICAKICAgIGpzRGF0ZS5wcm90b3R5cGUudG9ZbWRJbnQgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gKHRoaXMucHJveHkuZ2V0RnVsbFllYXIoKSAqIDEwMDAwKSArICh0aGlzLmdldE1vbnRoTnVtYmVyKCkgKiAxMDApICsgdGhpcy5wcm94eS5nZXREYXRlKCk7CiAgICB9OwogICAgCiAgICAvKioKICAgICAqIEBuYW1lc3BhY2UgSG9sZHMgbG9jYWxpemF0aW9ucyBmb3IgbW9udGgvZGF5IG5hbWVzLgogICAgICogPHA+anNEYXRlIGF0dGVtcHRzIHRvIGRldGVjdCBsb2NhbGUgd2hlbiBsb2FkZWQgYW5kIGRlZmF1bHRzIHRvICdlbicuCiAgICAgKiBJZiBhIGxvY2FsaXphdGlvbiBpcyBkZXRlY3RlZCB3aGljaCBpcyBub3QgYXZhaWxhYmxlLCBqc0RhdGUgZGVmYXVsdHMgdG8gJ2VuJy4KICAgICAqIEFkZGl0aW9uYWwgbG9jYWxpemF0aW9ucyBjYW4gYmUgYWRkZWQgYWZ0ZXIganNEYXRlIGxvYWRzLiAgQWZ0ZXIgYWRkaW5nIGEgbG9jYWxpemF0aW9uLAogICAgICogY2FsbCB0aGUganNEYXRlLnJlZ2lvbmFsLmdldExvY2FsZSgpIG1ldGhvZC4gIEN1cnJlbnRseSwgZW4sIGZyIGFuZCBkZSBhcmUgZGVmaW5lZC48L3A+CiAgICAgKiAKICAgICAqIDxwPkxvY2FsaXphdGlvbnMgbXVzdCBiZSBhbiBvYmplY3QgYW5kIGhhdmUgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzIGRlZmluZWQ6ICBtb250aE5hbWVzLCBtb250aE5hbWVzU2hvcnQsIGRheU5hbWVzLCBkYXlOYW1lc1Nob3J0IGFuZCBMb2NhbGl6YXRpb25zIGFyZSBhZGRlZCBsaWtlOjwvcD4KICAgICAqIDxwcmUgY2xhc3M9ImNvZGUiPgogICAgICoganNEYXRlLnJlZ2lvbmFsWydlbiddID0gewogICAgICogbW9udGhOYW1lcyAgICAgIDogJ0phbnVhcnkgRmVicnVhcnkgTWFyY2ggQXByaWwgTWF5IEp1bmUgSnVseSBBdWd1c3QgU2VwdGVtYmVyIE9jdG9iZXIgTm92ZW1iZXIgRGVjZW1iZXInLnNwbGl0KCcgJyksCiAgICAgKiBtb250aE5hbWVzU2hvcnQgOiAnSmFuIEZlYiBNYXIgQXByIE1heSBKdW4gSnVsIEF1ZyBTZXAgT2N0IE5vdiBEZWMnLnNwbGl0KCcgJyksCiAgICAgKiBkYXlOYW1lcyAgICAgICAgOiAnU3VuZGF5IE1vbmRheSBUdWVzZGF5IFdlZG5lc2RheSBUaHVyc2RheSBGcmlkYXkgU2F0dXJkYXknLnNwbGl0KCcgJyksCiAgICAgKiBkYXlOYW1lc1Nob3J0ICAgOiAnU3VuIE1vbiBUdWUgV2VkIFRodSBGcmkgU2F0Jy5zcGxpdCgnICcpCiAgICAgKiB9OwogICAgICogPC9wcmU+CiAgICAgKiA8cD5BZnRlciBhZGRpbmcgbG9jYWxpemF0aW9ucywgY2FsbCA8Y29kZT5qc0RhdGUucmVnaW9uYWwuZ2V0TG9jYWxlKCk7PC9jb2RlPiB0byB1cGRhdGUgdGhlIGxvY2FsZSBzZXR0aW5nIHdpdGggdGhlCiAgICAgKiBuZXcgbG9jYWxpemF0aW9ucy48L3A+CiAgICAgKi8KICAgICAKICAgIGpzRGF0ZS5yZWdpb25hbCA9IHsKICAgICAgICAnZW4nOiB7CiAgICAgICAgICAgIG1vbnRoTmFtZXM6IFsnSmFudWFyeScsJ0ZlYnJ1YXJ5JywnTWFyY2gnLCdBcHJpbCcsJ01heScsJ0p1bmUnLCdKdWx5JywnQXVndXN0JywnU2VwdGVtYmVyJywnT2N0b2JlcicsJ05vdmVtYmVyJywnRGVjZW1iZXInXSwKICAgICAgICAgICAgbW9udGhOYW1lc1Nob3J0OiBbJ0phbicsICdGZWInLCAnTWFyJywgJ0FwcicsICdNYXknLCAnSnVuJywnSnVsJywgJ0F1ZycsICdTZXAnLCAnT2N0JywgJ05vdicsICdEZWMnXSwKICAgICAgICAgICAgZGF5TmFtZXM6IFsnU3VuZGF5JywgJ01vbmRheScsICdUdWVzZGF5JywgJ1dlZG5lc2RheScsICdUaHVyc2RheScsICdGcmlkYXknLCAnU2F0dXJkYXknXSwKICAgICAgICAgICAgZGF5TmFtZXNTaG9ydDogWydTdW4nLCAnTW9uJywgJ1R1ZScsICdXZWQnLCAnVGh1JywgJ0ZyaScsICdTYXQnXSwKICAgICAgICAgICAgZm9ybWF0U3RyaW5nOiAnJVktJW0tJWQgJUg6JU06JVMnCiAgICAgICAgfSwKICAgICAgICAKICAgICAgICAnZnInOiB7CiAgICAgICAgICAgIG1vbnRoTmFtZXM6IFsnSmFudmllcicsJ0bDqXZyaWVyJywnTWFycycsJ0F2cmlsJywnTWFpJywnSnVpbicsJ0p1aWxsZXQnLCdBb8O7dCcsJ1NlcHRlbWJyZScsJ09jdG9icmUnLCdOb3ZlbWJyZScsJ0TDqWNlbWJyZSddLAogICAgICAgICAgICBtb250aE5hbWVzU2hvcnQ6IFsnSmFuJywnRsOpdicsJ01hcicsJ0F2cicsJ01haScsJ0p1bicsJ0p1bCcsJ0Fvw7snLCdTZXAnLCdPY3QnLCdOb3YnLCdEw6ljJ10sCiAgICAgICAgICAgIGRheU5hbWVzOiBbJ0RpbWFuY2hlJywnTHVuZGknLCdNYXJkaScsJ01lcmNyZWRpJywnSmV1ZGknLCdWZW5kcmVkaScsJ1NhbWVkaSddLAogICAgICAgICAgICBkYXlOYW1lc1Nob3J0OiBbJ0RpbScsJ0x1bicsJ01hcicsJ01lcicsJ0pldScsJ1ZlbicsJ1NhbSddLAogICAgICAgICAgICBmb3JtYXRTdHJpbmc6ICclWS0lbS0lZCAlSDolTTolUycKICAgICAgICB9LAogICAgICAgIAogICAgICAgICdkZSc6IHsKICAgICAgICAgICAgbW9udGhOYW1lczogWydKYW51YXInLCdGZWJydWFyJywnTcOkcnonLCdBcHJpbCcsJ01haScsJ0p1bmknLCdKdWxpJywnQXVndXN0JywnU2VwdGVtYmVyJywnT2t0b2JlcicsJ05vdmVtYmVyJywnRGV6ZW1iZXInXSwKICAgICAgICAgICAgbW9udGhOYW1lc1Nob3J0OiBbJ0phbicsJ0ZlYicsJ03DpHInLCdBcHInLCdNYWknLCdKdW4nLCdKdWwnLCdBdWcnLCdTZXAnLCdPa3QnLCdOb3YnLCdEZXonXSwKICAgICAgICAgICAgZGF5TmFtZXM6IFsnU29ubnRhZycsJ01vbnRhZycsJ0RpZW5zdGFnJywnTWl0dHdvY2gnLCdEb25uZXJzdGFnJywnRnJlaXRhZycsJ1NhbXN0YWcnXSwKICAgICAgICAgICAgZGF5TmFtZXNTaG9ydDogWydTbycsJ01vJywnRGknLCdNaScsJ0RvJywnRnInLCdTYSddLAogICAgICAgICAgICBmb3JtYXRTdHJpbmc6ICclWS0lbS0lZCAlSDolTTolUycKICAgICAgICB9LAogICAgICAgIAogICAgICAgICdlcyc6IHsKICAgICAgICAgICAgbW9udGhOYW1lczogWydFbmVybycsJ0ZlYnJlcm8nLCdNYXJ6bycsJ0FicmlsJywnTWF5bycsJ0p1bmlvJywgJ0p1bGlvJywnQWdvc3RvJywnU2VwdGllbWJyZScsJ09jdHVicmUnLCdOb3ZpZW1icmUnLCdEaWNpZW1icmUnXSwKICAgICAgICAgICAgbW9udGhOYW1lc1Nob3J0OiBbJ0VuZScsJ0ZlYicsJ01hcicsJ0FicicsJ01heScsJ0p1bicsICdKdWwnLCdBZ28nLCdTZXAnLCdPY3QnLCdOb3YnLCdEaWMnXSwKICAgICAgICAgICAgZGF5TmFtZXM6IFsnRG9taW5nbycsJ0x1bmVzJywnTWFydGVzJywnTWkmZWFjdXRlO3Jjb2xlcycsJ0p1ZXZlcycsJ1ZpZXJuZXMnLCdTJmFhY3V0ZTtiYWRvJ10sCiAgICAgICAgICAgIGRheU5hbWVzU2hvcnQ6IFsnRG9tJywnTHVuJywnTWFyJywnTWkmZWFjdXRlOycsJ0p1dicsJ1ZpZScsJ1MmYWFjdXRlO2InXSwKICAgICAgICAgICAgZm9ybWF0U3RyaW5nOiAnJVktJW0tJWQgJUg6JU06JVMnCiAgICAgICAgfSwKICAgICAgICAKICAgICAgICAncnUnOiB7CiAgICAgICAgICAgIG1vbnRoTmFtZXM6IFsn0K/QvdCy0LDRgNGMJywn0KTQtdCy0YDQsNC70YwnLCfQnNCw0YDRgicsJ9CQ0L/RgNC10LvRjCcsJ9Cc0LDQuScsJ9CY0Y7QvdGMJywn0JjRjtC70YwnLCfQkNCy0LPRg9GB0YInLCfQodC10L3RgtGP0LHRgNGMJywn0J7QutGC0Y/QsdGA0YwnLCfQndC+0Y/QsdGA0YwnLCfQlNC10LrQsNCx0YDRjCddLAogICAgICAgICAgICBtb250aE5hbWVzU2hvcnQ6IFsn0K/QvdCyJywn0KTQtdCyJywn0JzQsNGAJywn0JDQv9GAJywn0JzQsNC5Jywn0JjRjtC9Jywn0JjRjtC7Jywn0JDQstCzJywn0KHQtdC9Jywn0J7QutGCJywn0J3QvtGPJywn0JTQtdC6J10sCiAgICAgICAgICAgIGRheU5hbWVzOiBbJ9Cy0L7RgdC60YDQtdGB0LXQvdGM0LUnLCfQv9C+0L3QtdC00LXQu9GM0L3QuNC6Jywn0LLRgtC+0YDQvdC40LonLCfRgdGA0LXQtNCwJywn0YfQtdGC0LLQtdGA0LMnLCfQv9GP0YLQvdC40YbQsCcsJ9GB0YPQsdCx0L7RgtCwJ10sCiAgICAgICAgICAgIGRheU5hbWVzU2hvcnQ6IFsn0LLRgdC6Jywn0L/QvdC0Jywn0LLRgtGAJywn0YHRgNC0Jywn0YfRgtCyJywn0L/RgtC9Jywn0YHQsdGCJ10sCiAgICAgICAgICAgIGZvcm1hdFN0cmluZzogJyVZLSVtLSVkICVIOiVNOiVTJwogICAgICAgIH0sCiAgICAgICAgCiAgICAgICAgJ2FyJzogewogICAgICAgICAgICBtb250aE5hbWVzOiBbJ9mD2KfZhtmI2YYg2KfZhNir2KfZhtmKJywgJ9i02KjYp9i3JywgJ9ii2LDYp9ixJywgJ9mG2YrYs9in2YYnLCAn2KLYsNin2LEnLCAn2K3YstmK2LHYp9mGJywn2KrZhdmI2LInLCAn2KLYqCcsICfYo9mK2YTZiNmEJywgICAn2KrYtNix2YrZhiDYp9mE2KPZiNmEJywgJ9iq2LTYsdmK2YYg2KfZhNir2KfZhtmKJywgJ9mD2KfZhtmI2YYg2KfZhNij2YjZhCddLAogICAgICAgICAgICBtb250aE5hbWVzU2hvcnQ6IFsnMScsJzInLCczJywnNCcsJzUnLCc2JywnNycsJzgnLCc5JywnMTAnLCcxMScsJzEyJ10sCiAgICAgICAgICAgIGRheU5hbWVzOiBbJ9in2YTYs9io2KonLCAn2KfZhNij2K3YrycsICfYp9mE2KfYq9mG2YrZhicsICfYp9mE2KvZhNin2KvYp9ihJywgJ9in2YTYo9ix2KjYudin2KEnLCAn2KfZhNiu2YXZitizJywgJ9in2YTYrNmF2LnYqSddLAogICAgICAgICAgICBkYXlOYW1lc1Nob3J0OiBbJ9iz2KjYqicsICfYo9it2K8nLCAn2KfYq9mG2YrZhicsICfYq9mE2KfYq9in2KEnLCAn2KPYsdio2LnYp9ihJywgJ9iu2YXZitizJywgJ9is2YXYudipJ10sCiAgICAgICAgICAgIGZvcm1hdFN0cmluZzogJyVZLSVtLSVkICVIOiVNOiVTJwogICAgICAgIH0sCiAgICAgICAgCiAgICAgICAgJ3B0JzogewogICAgICAgICAgICBtb250aE5hbWVzOiBbJ0phbmVpcm8nLCdGZXZlcmVpcm8nLCdNYXImY2NlZGlsO28nLCdBYnJpbCcsJ01haW8nLCdKdW5obycsJ0p1bGhvJywnQWdvc3RvJywnU2V0ZW1icm8nLCdPdXR1YnJvJywnTm92ZW1icm8nLCdEZXplbWJybyddLAogICAgICAgICAgICBtb250aE5hbWVzU2hvcnQ6IFsnSmFuJywnRmV2JywnTWFyJywnQWJyJywnTWFpJywnSnVuJywnSnVsJywnQWdvJywnU2V0JywnT3V0JywnTm92JywnRGV6J10sCiAgICAgICAgICAgIGRheU5hbWVzOiBbJ0RvbWluZ28nLCdTZWd1bmRhLWZlaXJhJywnVGVyJmNjZWRpbDthLWZlaXJhJywnUXVhcnRhLWZlaXJhJywnUXVpbnRhLWZlaXJhJywnU2V4dGEtZmVpcmEnLCdTJmFhY3V0ZTtiYWRvJ10sCiAgICAgICAgICAgIGRheU5hbWVzU2hvcnQ6IFsnRG9tJywnU2VnJywnVGVyJywnUXVhJywnUXVpJywnU2V4JywnUyZhYWN1dGU7YiddLAogICAgICAgICAgICBmb3JtYXRTdHJpbmc6ICclWS0lbS0lZCAlSDolTTolUycgICAKICAgICAgICB9LAogICAgICAgIAogICAgICAgICdwdC1CUic6IHsKICAgICAgICAgICAgbW9udGhOYW1lczogWydKYW5laXJvJywnRmV2ZXJlaXJvJywnTWFyJmNjZWRpbDtvJywnQWJyaWwnLCdNYWlvJywnSnVuaG8nLCAnSnVsaG8nLCdBZ29zdG8nLCdTZXRlbWJybycsJ091dHVicm8nLCdOb3ZlbWJybycsJ0RlemVtYnJvJ10sCiAgICAgICAgICAgIG1vbnRoTmFtZXNTaG9ydDogWydKYW4nLCdGZXYnLCdNYXInLCdBYnInLCdNYWknLCdKdW4nLCdKdWwnLCdBZ28nLCdTZXQnLCdPdXQnLCdOb3YnLCdEZXonXSwKICAgICAgICAgICAgZGF5TmFtZXM6IFsnRG9taW5nbycsJ1NlZ3VuZGEtZmVpcmEnLCdUZXImY2NlZGlsO2EtZmVpcmEnLCdRdWFydGEtZmVpcmEnLCdRdWludGEtZmVpcmEnLCdTZXh0YS1mZWlyYScsJ1MmYWFjdXRlO2JhZG8nXSwKICAgICAgICAgICAgZGF5TmFtZXNTaG9ydDogWydEb20nLCdTZWcnLCdUZXInLCdRdWEnLCdRdWknLCdTZXgnLCdTJmFhY3V0ZTtiJ10sCiAgICAgICAgICAgIGZvcm1hdFN0cmluZzogJyVZLSVtLSVkICVIOiVNOiVTJwogICAgICAgIH0KICAgICAgICAKICAgIAogICAgfTsKICAgIAogICAgLy8gU2V0IGVuZ2xpc2ggdmFyaWFudHMgdG8gJ2VuJwogICAganNEYXRlLnJlZ2lvbmFsWydlbi1VUyddID0ganNEYXRlLnJlZ2lvbmFsWydlbi1HQiddID0ganNEYXRlLnJlZ2lvbmFsWydlbiddOwogICAgCiAgICAvKioKICAgICAqIFRyeSB0byBkZXRlcm1pbmUgdGhlIHVzZXJzIGxvY2FsZSBiYXNlZCBvbiB0aGUgbGFuZyBhdHRyaWJ1dGUgb2YgdGhlIGh0bWwgcGFnZS4gIERlZmF1bHRzIHRvICdlbicKICAgICAqIGlmIGl0IGNhbm5vdCBmaWd1cmUgb3V0IGEgbG9jYWxlIG9mIGlmIHRoZSBsb2NhbGUgZG9lcyBub3QgaGF2ZSBhIGxvY2FsaXphdGlvbiBkZWZpbmVkLgogICAgICogQHJldHVybnMge1N0cmluZ30gbG9jYWxlCiAgICAgKi8KICAgICAKICAgIGpzRGF0ZS5yZWdpb25hbC5nZXRMb2NhbGUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIGwgPSBqc0RhdGUuY29uZmlnLmRlZmF1bHRMb2NhbGU7CiAgICAgICAgCiAgICAgICAgaWYgKCBkb2N1bWVudCAmJiBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaHRtbCcpICYmIGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdodG1sJylbMF0ubGFuZyApIHsKICAgICAgICAgICAgbCA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdodG1sJylbMF0ubGFuZzsKICAgICAgICAgICAgaWYgKCFqc0RhdGUucmVnaW9uYWwuaGFzT3duUHJvcGVydHkobCkpIHsKICAgICAgICAgICAgICAgIGwgPSBqc0RhdGUuY29uZmlnLmRlZmF1bHRMb2NhbGU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgcmV0dXJuIGw7CiAgICB9OwogICAgCiAgICAvLyBtcyBpbiBkYXkKICAgIHZhciBkYXkgPSAyNCAqIDYwICogNjAgKiAxMDAwOwogICAgCiAgICAvLyBwYWRkIGEgbnVtYmVyIHdpdGggemVyb3MKICAgIHZhciBhZGRaZXJvcyA9IGZ1bmN0aW9uKG51bSwgZGlnaXRzKSB7CiAgICAgICAgbnVtID0gU3RyaW5nKG51bSk7CiAgICAgICAgdmFyIGkgPSBkaWdpdHMgLSBudW0ubGVuZ3RoOwogICAgICAgIHZhciBzID0gU3RyaW5nKE1hdGgucG93KDEwLCBpKSkuc2xpY2UoMSk7CiAgICAgICAgcmV0dXJuIHMuY29uY2F0KG51bSk7CiAgICB9OwoKICAgIC8vIHJlcHJlc2VudGF0aW9ucyB1c2VkIGZvciBjYWxjdWxhdGluZyBkaWZmZXJlbmNlcyBiZXR3ZWVuIGRhdGVzLgogICAgLy8gVGhpcyBib3Jyb3dzIGhlYXZpbHkgZnJvbSBLZW4gU255ZGVyJ3Mgd29yay4KICAgIHZhciBtdWx0aXBsaWVycyA9IHsKICAgICAgICBtaWxsaXNlY29uZDogMSwKICAgICAgICBzZWNvbmQ6IDEwMDAsCiAgICAgICAgbWludXRlOiA2MCAqIDEwMDAsCiAgICAgICAgaG91cjogNjAgKiA2MCAqIDEwMDAsCiAgICAgICAgZGF5OiBkYXksCiAgICAgICAgd2VlazogNyAqIGRheSwKICAgICAgICBtb250aDogewogICAgICAgICAgICAvLyBhZGQgYSBudW1iZXIgb2YgbW9udGhzCiAgICAgICAgICAgIGFkZDogZnVuY3Rpb24oZCwgbnVtYmVyKSB7CiAgICAgICAgICAgICAgICAvLyBhZGQgYW55IHllYXJzIG5lZWRlZCAoaW5jcmVtZW50cyBvZiAxMikKICAgICAgICAgICAgICAgIG11bHRpcGxpZXJzLnllYXIuYWRkKGQsIE1hdGhbbnVtYmVyID4gMCA/ICdmbG9vcicgOiAnY2VpbCddKG51bWJlciAvIDEyKSk7CiAgICAgICAgICAgICAgICAvLyBlbnN1cmUgdGhhdCB3ZSBwcm9wZXJseSB3cmFwIGJldHdlbiBEZWNlbWJlciBhbmQgSmFudWFyeQogICAgICAgICAgICAgICAgLy8gMTEgJSAxMiA9IDExCiAgICAgICAgICAgICAgICAvLyAxMiAlIDEyID0gMAogICAgICAgICAgICAgICAgdmFyIHByZXZNb250aCA9IGQuZ2V0TW9udGgoKSArIChudW1iZXIgJSAxMik7CiAgICAgICAgICAgICAgICBpZiAocHJldk1vbnRoID09IDEyKSB7CiAgICAgICAgICAgICAgICAgICAgcHJldk1vbnRoID0gMDsKICAgICAgICAgICAgICAgICAgICBkLnNldFllYXIoZC5nZXRGdWxsWWVhcigpICsgMSk7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHByZXZNb250aCA9PSAtMSkgewogICAgICAgICAgICAgICAgICAgIHByZXZNb250aCA9IDExOwogICAgICAgICAgICAgICAgICAgIGQuc2V0WWVhcihkLmdldEZ1bGxZZWFyKCkgLSAxKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGQuc2V0TW9udGgocHJldk1vbnRoKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgLy8gZ2V0IHRoZSBudW1iZXIgb2YgbW9udGhzIGJldHdlZW4gdHdvIERhdGUgb2JqZWN0cyAoZGVjaW1hbCB0byB0aGUgbmVhcmVzdCBkYXkpCiAgICAgICAgICAgIGRpZmY6IGZ1bmN0aW9uKGQxLCBkMikgewogICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBudW1iZXIgb2YgeWVhcnMKICAgICAgICAgICAgICAgIHZhciBkaWZmWWVhcnMgPSBkMS5nZXRGdWxsWWVhcigpIC0gZDIuZ2V0RnVsbFllYXIoKTsKICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgbnVtYmVyIG9mIHJlbWFpbmluZyBtb250aHMKICAgICAgICAgICAgICAgIHZhciBkaWZmTW9udGhzID0gZDEuZ2V0TW9udGgoKSAtIGQyLmdldE1vbnRoKCkgKyAoZGlmZlllYXJzICogMTIpOwogICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBudW1iZXIgb2YgcmVtYWluaW5nIGRheXMKICAgICAgICAgICAgICAgIHZhciBkaWZmRGF5cyA9IGQxLmdldERhdGUoKSAtIGQyLmdldERhdGUoKTsKICAgICAgICAgICAgICAgIC8vIHJldHVybiB0aGUgbW9udGggZGlmZmVyZW5jZSB3aXRoIHRoZSBkYXlzIGRpZmZlcmVuY2UgYXMgYSBkZWNpbWFsCiAgICAgICAgICAgICAgICByZXR1cm4gZGlmZk1vbnRocyArIChkaWZmRGF5cyAvIDMwKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgeWVhcjogewogICAgICAgICAgICAvLyBhZGQgYSBudW1iZXIgb2YgeWVhcnMKICAgICAgICAgICAgYWRkOiBmdW5jdGlvbihkLCBudW1iZXIpIHsKICAgICAgICAgICAgICAgIGQuc2V0WWVhcihkLmdldEZ1bGxZZWFyKCkgKyBNYXRoW251bWJlciA+IDAgPyAnZmxvb3InIDogJ2NlaWwnXShudW1iZXIpKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgLy8gZ2V0IHRoZSBudW1iZXIgb2YgeWVhcnMgYmV0d2VlbiB0d28gRGF0ZSBvYmplY3RzIChkZWNpbWFsIHRvIHRoZSBuZWFyZXN0IGRheSkKICAgICAgICAgICAgZGlmZjogZnVuY3Rpb24oZDEsIGQyKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbXVsdGlwbGllcnMubW9udGguZGlmZihkMSwgZDIpIC8gMTI7CiAgICAgICAgICAgIH0KICAgICAgICB9ICAgICAgICAKICAgIH07CiAgICAvLwogICAgLy8gQWxpYXMgZWFjaCBtdWx0aXBsaWVyIHdpdGggYW4gJ3MnIHRvIGFsbG93ICd5ZWFyJyBhbmQgJ3llYXJzJyBmb3IgZXhhbXBsZS4KICAgIC8vIFRoaXMgY29tZXMgZnJvbSBLZW4gU255ZGVycyB3b3JrLgogICAgLy8KICAgIGZvciAodmFyIHVuaXQgaW4gbXVsdGlwbGllcnMpIHsKICAgICAgICBpZiAodW5pdC5zdWJzdHJpbmcodW5pdC5sZW5ndGggLSAxKSAhPSAncycpIHsgLy8gSUUgd2lsbCBpdGVyYXRlIG5ld2x5IGFkZGVkIHByb3BlcnRpZXMgOnwKICAgICAgICAgICAgbXVsdGlwbGllcnNbdW5pdCArICdzJ10gPSBtdWx0aXBsaWVyc1t1bml0XTsKICAgICAgICB9CiAgICB9CiAgICAKICAgIC8vCiAgICAvLyB0YWtlIGEganNEYXRlIGluc3RhbmNlIGFuZCBhIGZvcm1hdCBjb2RlIGFuZCByZXR1cm4gdGhlIGZvcm1hdHRlZCB2YWx1ZS4KICAgIC8vIFRoaXMgaXMgYSBzb21ld2hhdCBtb2RpZmllZCB2ZXJzaW9uIG9mIEtlbiBTbnlkZXIncyBtZXRob2QuCiAgICAvLwogICAgdmFyIGZvcm1hdCA9IGZ1bmN0aW9uKGQsIGNvZGUsIHN5bnRheCkgewogICAgICAgIC8vIGlmIHNob3JjdXQgY29kZXMgYXJlIHVzZWQsIHJlY3Vyc2l2ZWx5IGV4cGFuZCB0aG9zZS4KICAgICAgICBpZiAoanNEYXRlLmZvcm1hdHNbc3ludGF4XVsic2hvcnRjdXRzIl1bY29kZV0pIHsKICAgICAgICAgICAgcmV0dXJuIGpzRGF0ZS5zdHJmdGltZShkLCBqc0RhdGUuZm9ybWF0c1tzeW50YXhdWyJzaG9ydGN1dHMiXVtjb2RlXSwgc3ludGF4KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvLyBnZXQgdGhlIGZvcm1hdCBjb2RlIGZ1bmN0aW9uIGFuZCBhZGRaZXJvcygpIGFyZ3VtZW50CiAgICAgICAgICAgIHZhciBnZXR0ZXIgPSAoanNEYXRlLmZvcm1hdHNbc3ludGF4XVsiY29kZXMiXVtjb2RlXSB8fCAnJykuc3BsaXQoJy4nKTsKICAgICAgICAgICAgdmFyIG5iciA9IGRbJ2dldCcgKyBnZXR0ZXJbMF1dID8gZFsnZ2V0JyArIGdldHRlclswXV0oKSA6ICcnOwogICAgICAgICAgICBpZiAoZ2V0dGVyWzFdKSB7CiAgICAgICAgICAgICAgICBuYnIgPSBhZGRaZXJvcyhuYnIsIGdldHRlclsxXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIG5icjsKICAgICAgICB9ICAgICAgIAogICAgfTsKICAgIAogICAgLyoqCiAgICAgKiBAc3RhdGljCiAgICAgKiBTdGF0aWMgZnVuY3Rpb24gZm9yIGNvbnZlcnQgYSBkYXRlIHRvIGEgc3RyaW5nIGFjY29yZGluZyB0byBhIGdpdmVuIGZvcm1hdC4gIEFsc28gYWN0cyBhcyBuYW1lc3BhY2UgZm9yIHN0cmZ0aW1lIGZvcm1hdCBjb2Rlcy4KICAgICAqIDxwPnN0cmZ0aW1lIGZvcm1hdHRpbmcgY2FuIGJlIGFjY29tcGxpc2hlZCB3aXRob3V0IGNyZWF0aW5nIGEganNEYXRlIG9iamVjdCBieSBjYWxsaW5nIGpzRGF0ZS5zdHJmdGltZSgpOjwvcD4KICAgICAqIDxwcmUgY2xhc3M9ImNvZGUiPgogICAgICogdmFyIGZvcm1hdHRlZERhdGUgPSBqc0RhdGUuc3RyZnRpbWUoJ0ZlYiA4LCAyMDA2IDg6NDg6MzInLCAnJVktJW0tJWQgJUg6JU06JVMnKTsKICAgICAqIDwvcHJlPgogICAgICogQHBhcmFtIHtTdHJpbmcgfCBOdW1iZXIgfCBBcnJheSB8IGpzRGF0ZSZuYnNwO09iamVjdCB8IERhdGUmbmJzcDtPYmplY3R9IGRhdGUgQSBwYXJzYWJsZSBkYXRlIHN0cmluZywgSmF2YVNjcmlwdCB0aW1lIHN0YW1wLCBBcnJheSBvZiBmb3JtIFt5ZWFyLCBtb250aCwgZGF5LCBob3VycywgbWludXRlcywgc2Vjb25kcywgbWlsbGlzZWNvbmRzXSwganNEYXRlIE9iamVjdCBvciBEYXRlIG9iamVjdC4KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBmb3JtYXRTdHJpbmcgU3RyaW5nIHdpdGggZW1iZWRkZWQgZGF0ZSBmb3JtYXR0aW5nIGNvZGVzLiAgCiAgICAgKiBTZWU6IHtAbGluayBqc0RhdGUuZm9ybWF0c30uIAogICAgICogQHBhcmFtIHtTdHJpbmd9IHN5bnRheCBPcHRpb25hbCBzeW50YXggdG8gdXNlIFtkZWZhdWx0IHBlcmxdLgogICAgICogQHBhcmFtIHtTdHJpbmd9IGxvY2FsZSBPcHRpb25hbCBsb2NhbGUgdG8gdXNlLgogICAgICogQHJldHVybnMge1N0cmluZ30gRm9ybWF0dGVkIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBkYXRlLgogICAgKi8KICAgIC8vCiAgICAvLyBMb2dpYyBhcyBpbXBsZW1lbnRlZCBoZXJlIGlzIHZlcnkgc2ltaWxhciB0byBLZW4gU255ZGVyJ3MgRGF0ZSBJbnN0YW5jZSBNZXRob2RzLgogICAgLy8KICAgIGpzRGF0ZS5zdHJmdGltZSA9IGZ1bmN0aW9uKGQsIGZvcm1hdFN0cmluZywgc3ludGF4LCBsb2NhbGUpIHsKICAgICAgICB2YXIgc3luID0gJ3BlcmwnOwogICAgICAgIHZhciBsb2MgPSBqc0RhdGUucmVnaW9uYWwuZ2V0TG9jYWxlKCk7CiAgICAgICAgCiAgICAgICAgLy8gY2hlY2sgaWYgc3ludGF4IGFuZCBsb2NhbGUgYXJlIGF2YWlsYWJsZSBvciByZXZlcnNlZAogICAgICAgIGlmIChzeW50YXggJiYganNEYXRlLmZvcm1hdHMuaGFzT3duUHJvcGVydHkoc3ludGF4KSkgewogICAgICAgICAgICBzeW4gPSBzeW50YXg7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHN5bnRheCAmJiBqc0RhdGUucmVnaW9uYWwuaGFzT3duUHJvcGVydHkoc3ludGF4KSkgewogICAgICAgICAgICBsb2MgPSBzeW50YXg7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmIChsb2NhbGUgJiYganNEYXRlLmZvcm1hdHMuaGFzT3duUHJvcGVydHkobG9jYWxlKSkgewogICAgICAgICAgICBzeW4gPSBsb2NhbGU7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGxvY2FsZSAmJiBqc0RhdGUucmVnaW9uYWwuaGFzT3duUHJvcGVydHkobG9jYWxlKSkgewogICAgICAgICAgICBsb2MgPSBsb2NhbGU7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmIChnZXRfdHlwZShkKSAhPSAiW29iamVjdCBPYmplY3RdIiB8fCBkLl90eXBlICE9ICJqc0RhdGUiKSB7CiAgICAgICAgICAgIGQgPSBuZXcganNEYXRlKGQpOwogICAgICAgICAgICBkLmxvY2FsZSA9IGxvYzsKICAgICAgICB9CiAgICAgICAgaWYgKCFmb3JtYXRTdHJpbmcpIHsKICAgICAgICAgICAgZm9ybWF0U3RyaW5nID0gZC5mb3JtYXRTdHJpbmcgfHwganNEYXRlLnJlZ2lvbmFsW2xvY11bJ2Zvcm1hdFN0cmluZyddOwogICAgICAgIH0KICAgICAgICAvLyBkZWZhdWx0IHRoZSBmb3JtYXQgc3RyaW5nIHRvIHllYXItbW9udGgtZGF5CiAgICAgICAgdmFyIHNvdXJjZSA9IGZvcm1hdFN0cmluZyB8fCAnJVktJW0tJWQnLCAKICAgICAgICAgICAgcmVzdWx0ID0gJycsIAogICAgICAgICAgICBtYXRjaDsKICAgICAgICAvLyByZXBsYWNlIGVhY2ggZm9ybWF0IGNvZGUKICAgICAgICB3aGlsZSAoc291cmNlLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgaWYgKG1hdGNoID0gc291cmNlLm1hdGNoKGpzRGF0ZS5mb3JtYXRzW3N5bl0uY29kZXMubWF0Y2hlcikpIHsKICAgICAgICAgICAgICAgIHJlc3VsdCArPSBzb3VyY2Uuc2xpY2UoMCwgbWF0Y2guaW5kZXgpOwogICAgICAgICAgICAgICAgcmVzdWx0ICs9IChtYXRjaFsxXSB8fCAnJykgKyBmb3JtYXQoZCwgbWF0Y2hbMl0sIHN5bik7CiAgICAgICAgICAgICAgICBzb3VyY2UgPSBzb3VyY2Uuc2xpY2UobWF0Y2guaW5kZXggKyBtYXRjaFswXS5sZW5ndGgpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgcmVzdWx0ICs9IHNvdXJjZTsKICAgICAgICAgICAgICAgIHNvdXJjZSA9ICcnOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9OwogICAgCiAgICAvKioKICAgICAqIEBuYW1lc3BhY2UKICAgICAqIE5hbWVzcGFjZSB0byBob2xkIGZvcm1hdCBjb2RlcyBhbmQgZm9ybWF0IHNob3J0Y3V0cy4gICJwZXJsIiBhbmQgInBocCIgZm9ybWF0IGNvZGVzIAogICAgICogYW5kIHNob3J0Y3V0cyBhcmUgZGVmaW5lZCBieSBkZWZhdWx0LiAgQWRkaXRpb25hbCBjb2RlcyBhbmQgc2hvcnRjdXRzIGNhbiBiZQogICAgICogYWRkZWQgbGlrZToKICAgICAqIAogICAgICogPHByZSBjbGFzcz0iY29kZSI+CiAgICAgKiBqc0RhdGUuZm9ybWF0c1sicGVybCJdID0gewogICAgICogICAgICJjb2RlcyI6IHsKICAgICAqICAgICAgICAgbWF0Y2hlcjogL3NvbWVyZWdleC8sCiAgICAgKiAgICAgICAgIFk6ICJmdWxsWWVhciIsICAvLyBuYW1lIG9mICJnZXQiIG1ldGhvZCB3aXRob3V0IHRoZSAiZ2V0IiwKICAgICAqICAgICAgICAgLi4uLCAgICAgICAgICAgIC8vIG1vcmUgY29kZXMKICAgICAqICAgICB9LAogICAgICogICAgICJzaG9ydGN1dHMiOiB7CiAgICAgKiAgICAgICAgIEY6ICclWS0lbS0lZCcsCiAgICAgKiAgICAgICAgIC4uLiwgICAgICAgICAgICAvLyBtb3JlIHNob3J0Y3V0cwogICAgICogICAgIH0KICAgICAqIH07CiAgICAgKiA8L3ByZT4KICAgICAqIAogICAgICogPHA+QWRkaXRpb25hbGx5LCBJU08gYW5kIFNRTCBzaG9ydGN1dHMgYXJlIGRlZmluZWQgYW5kIGNhbiBiZSBhY2Nlc3NlcyB2aWE6CiAgICAgKiA8Y29kZT5qc0RhdGUuZm9ybWF0cy5JU088L2NvZGU+IGFuZCA8Y29kZT5qc0RhdGUuZm9ybWF0cy5TUUw8L2NvZGU+CiAgICAgKi8KICAgIAogICAganNEYXRlLmZvcm1hdHMgPSB7CiAgICAgICAgSVNPOiclWS0lbS0lZFQlSDolTTolUy4lTiVHJywKICAgICAgICBTUUw6JyVZLSVtLSVkICVIOiVNOiVTJwogICAgfTsKICAgIAogICAgLyoqCiAgICAgKiBQZXJsIGZvcm1hdCBjb2RlcyBhbmQgc2hvcnRjdXRzIGZvciBzdHJmdGltZS4KICAgICAqIAogICAgICogQSBoYXNoIChvYmplY3QpIG9mIGNvZGVzIHdoZXJlIGVhY2ggY29kZSBtdXN0IGJlIGFuIGFycmF5IHdoZXJlIHRoZSBmaXJzdCBtZW1iZXIgaXMgCiAgICAgKiB0aGUgbmFtZSBvZiBhIERhdGUucHJvdG90eXBlIG9yIGpzRGF0ZS5wcm90b3R5cGUgZnVuY3Rpb24gdG8gY2FsbAogICAgICogYW5kIG9wdGlvbmFsbHkgYSBzZWNvbmQgbWVtYmVyIGluZGljYXRpbmcgdGhlIG51bWJlciB0byBwYXNzIHRvIGFkZFplcm9zKCkKICAgICAqIAogICAgICogPHA+VGhlIGZvbGxvd2luZyBmb3JtYXQgY29kZXMgYXJlIGRlZmluZWQ6PC9wPgogICAgICogCiAgICAgKiA8cHJlIGNsYXNzPSJjb2RlIj4KICAgICAqIENvZGUgICAgUmVzdWx0ICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbgogICAgICogPT0gWWVhcnMgPT0gICAgICAgICAgIAogICAgICogJVkgICAgICAyMDA4ICAgICAgICAgICAgICAgICAgICAgIEZvdXItZGlnaXQgeWVhcgogICAgICogJXkgICAgICAwOCAgICAgICAgICAgICAgICAgICAgICAgIFR3by1kaWdpdCB5ZWFyCiAgICAgKiAKICAgICAqID09IE1vbnRocyA9PSAgICAgICAgICAKICAgICAqICVtICAgICAgMDkgICAgICAgICAgICAgICAgICAgICAgICBUd28tZGlnaXQgbW9udGgKICAgICAqICUjbSAgICAgOSAgICAgICAgICAgICAgICAgICAgICAgICBPbmUgb3IgdHdvLWRpZ2l0IG1vbnRoCiAgICAgKiAlQiAgICAgIFNlcHRlbWJlciAgICAgICAgICAgICAgICAgRnVsbCBtb250aCBuYW1lCiAgICAgKiAlYiAgICAgIFNlcCAgICAgICAgICAgICAgICAgICAgICAgQWJicmV2aWF0ZWQgbW9udGggbmFtZQogICAgICogCiAgICAgKiA9PSBEYXlzID09ICAgICAgICAgICAgCiAgICAgKiAlZCAgICAgIDA1ICAgICAgICAgICAgICAgICAgICAgICAgVHdvLWRpZ2l0IGRheSBvZiBtb250aAogICAgICogJSNkICAgICA1ICAgICAgICAgICAgICAgICAgICAgICAgIE9uZSBvciB0d28tZGlnaXQgZGF5IG9mIG1vbnRoCiAgICAgKiAlZSAgICAgIDUgICAgICAgICAgICAgICAgICAgICAgICAgT25lIG9yIHR3by1kaWdpdCBkYXkgb2YgbW9udGgKICAgICAqICVBICAgICAgU3VuZGF5ICAgICAgICAgICAgICAgICAgICBGdWxsIG5hbWUgb2YgdGhlIGRheSBvZiB0aGUgd2VlawogICAgICogJWEgICAgICBTdW4gICAgICAgICAgICAgICAgICAgICAgIEFiYnJldmlhdGVkIG5hbWUgb2YgdGhlIGRheSBvZiB0aGUgd2VlawogICAgICogJXcgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgIE51bWJlciBvZiB0aGUgZGF5IG9mIHRoZSB3ZWVrICgwID0gU3VuZGF5LCA2ID0gU2F0dXJkYXkpCiAgICAgKiAKICAgICAqID09IEhvdXJzID09ICAgICAgICAgICAKICAgICAqICVIICAgICAgMjMgICAgICAgICAgICAgICAgICAgICAgICBIb3VycyBpbiAyNC1ob3VyIGZvcm1hdCAodHdvIGRpZ2l0cykKICAgICAqICUjSCAgICAgMyAgICAgICAgICAgICAgICAgICAgICAgICBIb3VycyBpbiAyNC1ob3VyIGludGVnZXIgZm9ybWF0IChvbmUgb3IgdHdvIGRpZ2l0cykKICAgICAqICVJICAgICAgMTEgICAgICAgICAgICAgICAgICAgICAgICBIb3VycyBpbiAxMi1ob3VyIGZvcm1hdCAodHdvIGRpZ2l0cykKICAgICAqICUjSSAgICAgMyAgICAgICAgICAgICAgICAgICAgICAgICBIb3VycyBpbiAxMi1ob3VyIGludGVnZXIgZm9ybWF0IChvbmUgb3IgdHdvIGRpZ2l0cykKICAgICAqICVwICAgICAgUE0gICAgICAgICAgICAgICAgICAgICAgICBBTSBvciBQTQogICAgICogCiAgICAgKiA9PSBNaW51dGVzID09ICAgICAgICAgCiAgICAgKiAlTSAgICAgIDA5ICAgICAgICAgICAgICAgICAgICAgICAgTWludXRlcyAodHdvIGRpZ2l0cykKICAgICAqICUjTSAgICAgOSAgICAgICAgICAgICAgICAgICAgICAgICBNaW51dGVzIChvbmUgb3IgdHdvIGRpZ2l0cykKICAgICAqIAogICAgICogPT0gU2Vjb25kcyA9PSAgICAgICAgIAogICAgICogJVMgICAgICAwMiAgICAgICAgICAgICAgICAgICAgICAgIFNlY29uZHMgKHR3byBkaWdpdHMpCiAgICAgKiAlI1MgICAgIDIgICAgICAgICAgICAgICAgICAgICAgICAgU2Vjb25kcyAob25lIG9yIHR3byBkaWdpdHMpCiAgICAgKiAlcyAgICAgIDEyMDY1Njc2MjU3MjMgICAgICAgICAgICAgVW5peCB0aW1lc3RhbXAgKFNlY29uZHMgcGFzdCAxOTcwLTAxLTAxIDAwOjAwOjAwKQogICAgICogCiAgICAgKiA9PSBNaWxsaXNlY29uZHMgPT0gICAgCiAgICAgKiAlTiAgICAgIDAwOCAgICAgICAgICAgICAgICAgICAgICAgTWlsbGlzZWNvbmRzICh0aHJlZSBkaWdpdHMpCiAgICAgKiAlI04gICAgIDggICAgICAgICAgICAgICAgICAgICAgICAgTWlsbGlzZWNvbmRzIChvbmUgdG8gdGhyZWUgZGlnaXRzKQogICAgICogCiAgICAgKiA9PSBUaW1lem9uZSA9PSAgICAgICAgCiAgICAgKiAlTyAgICAgIDM2MCAgICAgICAgICAgICAgICAgICAgICAgZGlmZmVyZW5jZSBpbiBtaW51dGVzIGJldHdlZW4gbG9jYWwgdGltZSBhbmQgR01UCiAgICAgKiAlWiAgICAgIE1vdW50YWluIFN0YW5kYXJkIFRpbWUgICAgTmFtZSBvZiB0aW1lem9uZSBhcyByZXBvcnRlZCBieSBicm93c2VyCiAgICAgKiAlRyAgICAgIDA2OjAwICAgICAgICAgICAgICAgICAgICAgSG91cnMgYW5kIG1pbnV0ZXMgYmV0d2VlbiBHTVQKICAgICAqIAogICAgICogPT0gU2hvcnRjdXRzID09ICAgICAgIAogICAgICogJUYgICAgICAyMDA4LTAzLTI2ICAgICAgICAgICAgICAgICVZLSVtLSVkCiAgICAgKiAlVCAgICAgIDA1OjA2OjMwICAgICAgICAgICAgICAgICAgJUg6JU06JVMKICAgICAqICVYICAgICAgMDU6MDY6MzAgICAgICAgICAgICAgICAgICAlSDolTTolUwogICAgICogJXggICAgICAwMy8yNi8wOCAgICAgICAgICAgICAgICAgICVtLyVkLyV5CiAgICAgKiAlRCAgICAgIDAzLzI2LzA4ICAgICAgICAgICAgICAgICAgJW0vJWQvJXkKICAgICAqICUjYyAgICAgV2VkIE1hciAyNiAxNTozMTowMCAyMDA4ICAlYSAlYiAlZSAlSDolTTolUyAlWQogICAgICogJXYgICAgICAzLVNlcC0yMDA4ICAgICAgICAgICAgICAgICVlLSViLSVZCiAgICAgKiAlUiAgICAgIDE1OjMxICAgICAgICAgICAgICAgICAgICAgJUg6JU0KICAgICAqICVyICAgICAgMDM6MzE6MDAgUE0gICAgICAgICAgICAgICAlSTolTTolUyAlcAogICAgICogCiAgICAgKiA9PSBDaGFyYWN0ZXJzID09ICAgICAgCiAgICAgKiAlbiAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgTmV3bGluZQogICAgICogJXQgICAgICBcdCAgICAgICAgICAgICAgICAgICAgICAgIFRhYgogICAgICogJSUgICAgICAlICAgICAgICAgICAgICAgICAgICAgICAgIFBlcmNlbnQgU3ltYm9sCiAgICAgKiA8L3ByZT4KICAgICAqIAogICAgICogPHA+Rm9ybWF0dGluZyBzaG9ydGN1dHMgdGhhdCB3aWxsIGJlIHRyYW5zbGF0ZWQgaW50byB0aGVpciBsb25nZXIgdmVyc2lvbi4KICAgICAqIEJlIHN1cmUgdGhhdCBmb3JtYXQgc2hvcnRjdXRzIGRvIG5vdCByZWZlciB0byB0aGVtc2VsdmVzOiB0aGlzIHdpbGwgY2F1c2UgYW4gaW5maW5pdGUgbG9vcC48L3A+CiAgICAgKiAKICAgICAqIDxwPkZvcm1hdCBjb2RlcyBhbmQgZm9ybWF0IHNob3J0Y3V0cyBjYW4gYmUgcmVkZWZpbmVkIGFmdGVyIHRoZSBqc0RhdGUKICAgICAqIG1vZHVsZSBpcyBpbXBvcnRlZC48L3A+CiAgICAgKiAKICAgICAqIDxwPk5vdGUgdGhhdCBpZiB5b3UgcmVkZWZpbmUgdGhlIHdob2xlIGhhc2ggKG9iamVjdCksIHlvdSBtdXN0IHN1cHBseSBhICJtYXRjaGVyIgogICAgICogcmVnZXggZm9yIHRoZSBwYXJzZXIuICBUaGUgZGVmYXVsdCBtYXRjaGVyIGlzOjwvcD4KICAgICAqIAogICAgICogPGNvZGU+LygpJSgjPyglfFthLXpdKSkvaTwvY29kZT4KICAgICAqIAogICAgICogPHA+d2hpY2ggY29ycmVzcG9uZHMgdG8gdGhlIFBlcmwgc3ludGF4IHVzZWQgYnkgZGVmYXVsdC48L3A+CiAgICAgKiAKICAgICAqIDxwPkJ5IGN1c3RvbWl6aW5nIHRoZSBtYXRjaGVyIGFuZCBmb3JtYXQgY29kZXMsIG5lYXJseSBhbnkgc3RyZnRpbWUgZnVuY3Rpb25hbGl0eSBpcyBwb3NzaWJsZS48L3A+CiAgICAgKi8KICAgICAKICAgIGpzRGF0ZS5mb3JtYXRzLnBlcmwgPSB7CiAgICAgICAgY29kZXM6IHsKICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8gMi1wYXJ0IHJlZ2V4IG1hdGNoZXIgZm9yIGZvcm1hdCBjb2RlcwogICAgICAgICAgICAvLwogICAgICAgICAgICAvLyBmaXJzdCBtYXRjaCBtdXN0IGJlIHRoZSBjaGFyYWN0ZXIgYmVmb3JlIHRoZSBjb2RlICh0byBhY2NvdW50IGZvciBlc2NhcGluZykKICAgICAgICAgICAgLy8gc2Vjb25kIG1hdGNoIG11c3QgYmUgdGhlIGZvcm1hdCBjb2RlIGNoYXJhY3RlcihzKQogICAgICAgICAgICAvLwogICAgICAgICAgICBtYXRjaGVyOiAvKCklKCM/KCV8W2Etel0pKS9pLAogICAgICAgICAgICAvLyB5ZWFyCiAgICAgICAgICAgIFk6ICdGdWxsWWVhcicsCiAgICAgICAgICAgIHk6ICdTaG9ydFllYXIuMicsCiAgICAgICAgICAgIC8vIG1vbnRoCiAgICAgICAgICAgIG06ICdNb250aE51bWJlci4yJywKICAgICAgICAgICAgJyNtJzogJ01vbnRoTnVtYmVyJywKICAgICAgICAgICAgQjogJ01vbnRoTmFtZScsCiAgICAgICAgICAgIGI6ICdBYmJyTW9udGhOYW1lJywKICAgICAgICAgICAgLy8gZGF5CiAgICAgICAgICAgIGQ6ICdEYXRlLjInLAogICAgICAgICAgICAnI2QnOiAnRGF0ZScsCiAgICAgICAgICAgIGU6ICdEYXRlJywKICAgICAgICAgICAgQTogJ0RheU5hbWUnLAogICAgICAgICAgICBhOiAnQWJickRheU5hbWUnLAogICAgICAgICAgICB3OiAnRGF5JywKICAgICAgICAgICAgLy8gaG91cnMKICAgICAgICAgICAgSDogJ0hvdXJzLjInLAogICAgICAgICAgICAnI0gnOiAnSG91cnMnLAogICAgICAgICAgICBJOiAnSG91cnMxMi4yJywKICAgICAgICAgICAgJyNJJzogJ0hvdXJzMTInLAogICAgICAgICAgICBwOiAnQU1QTScsCiAgICAgICAgICAgIC8vIG1pbnV0ZXMKICAgICAgICAgICAgTTogJ01pbnV0ZXMuMicsCiAgICAgICAgICAgICcjTSc6ICdNaW51dGVzJywKICAgICAgICAgICAgLy8gc2Vjb25kcwogICAgICAgICAgICBTOiAnU2Vjb25kcy4yJywKICAgICAgICAgICAgJyNTJzogJ1NlY29uZHMnLAogICAgICAgICAgICBzOiAnVW5peCcsCiAgICAgICAgICAgIC8vIG1pbGxpc2Vjb25kcwogICAgICAgICAgICBOOiAnTWlsbGlzZWNvbmRzLjMnLAogICAgICAgICAgICAnI04nOiAnTWlsbGlzZWNvbmRzJywKICAgICAgICAgICAgLy8gdGltZXpvbmUKICAgICAgICAgICAgTzogJ1RpbWV6b25lT2Zmc2V0JywKICAgICAgICAgICAgWjogJ1RpbWV6b25lTmFtZScsCiAgICAgICAgICAgIEc6ICdHbXRPZmZzZXQnICAKICAgICAgICB9LAogICAgICAgIAogICAgICAgIHNob3J0Y3V0czogewogICAgICAgICAgICAvLyBkYXRlCiAgICAgICAgICAgIEY6ICclWS0lbS0lZCcsCiAgICAgICAgICAgIC8vIHRpbWUKICAgICAgICAgICAgVDogJyVIOiVNOiVTJywKICAgICAgICAgICAgWDogJyVIOiVNOiVTJywKICAgICAgICAgICAgLy8gbG9jYWwgZm9ybWF0IGRhdGUKICAgICAgICAgICAgeDogJyVtLyVkLyV5JywKICAgICAgICAgICAgRDogJyVtLyVkLyV5JywKICAgICAgICAgICAgLy8gbG9jYWwgZm9ybWF0IGV4dGVuZGVkCiAgICAgICAgICAgICcjYyc6ICclYSAlYiAlZSAlSDolTTolUyAlWScsCiAgICAgICAgICAgIC8vIGxvY2FsIGZvcm1hdCBzaG9ydAogICAgICAgICAgICB2OiAnJWUtJWItJVknLAogICAgICAgICAgICBSOiAnJUg6JU0nLAogICAgICAgICAgICByOiAnJUk6JU06JVMgJXAnLAogICAgICAgICAgICAvLyB0YWIgYW5kIG5ld2xpbmUKICAgICAgICAgICAgdDogJ1x0JywKICAgICAgICAgICAgbjogJ1xuJywKICAgICAgICAgICAgJyUnOiAnJScKICAgICAgICB9CiAgICB9OwogICAgCiAgICAvKioKICAgICAqIFBIUCBmb3JtYXQgY29kZXMgYW5kIHNob3J0Y3V0cyBmb3Igc3RyZnRpbWUuCiAgICAgKiAKICAgICAqIEEgaGFzaCAob2JqZWN0KSBvZiBjb2RlcyB3aGVyZSBlYWNoIGNvZGUgbXVzdCBiZSBhbiBhcnJheSB3aGVyZSB0aGUgZmlyc3QgbWVtYmVyIGlzIAogICAgICogdGhlIG5hbWUgb2YgYSBEYXRlLnByb3RvdHlwZSBvciBqc0RhdGUucHJvdG90eXBlIGZ1bmN0aW9uIHRvIGNhbGwKICAgICAqIGFuZCBvcHRpb25hbGx5IGEgc2Vjb25kIG1lbWJlciBpbmRpY2F0aW5nIHRoZSBudW1iZXIgdG8gcGFzcyB0byBhZGRaZXJvcygpCiAgICAgKiAKICAgICAqIDxwPlRoZSBmb2xsb3dpbmcgZm9ybWF0IGNvZGVzIGFyZSBkZWZpbmVkOjwvcD4KICAgICAqIAogICAgICogPHByZSBjbGFzcz0iY29kZSI+CiAgICAgKiBDb2RlICAgIFJlc3VsdCAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24KICAgICAqID09PSBEYXlzID09PSAgICAgICAgCiAgICAgKiAlYSAgICAgIFN1biB0aHJvdWdoIFNhdCAgICAgICAgICAgQW4gYWJicmV2aWF0ZWQgdGV4dHVhbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgZGF5CiAgICAgKiAlQSAgICAgIFN1bmRheSAtIFNhdHVyZGF5ICAgICAgICAgQSBmdWxsIHRleHR1YWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIGRheQogICAgICogJWQgICAgICAwMSB0byAzMSAgICAgICAgICAgICAgICAgIFR3by1kaWdpdCBkYXkgb2YgdGhlIG1vbnRoICh3aXRoIGxlYWRpbmcgemVyb3MpCiAgICAgKiAlZSAgICAgIDEgdG8gMzEgICAgICAgICAgICAgICAgICAgRGF5IG9mIHRoZSBtb250aCwgd2l0aCBhIHNwYWNlIHByZWNlZGluZyBzaW5nbGUgZGlnaXRzLgogICAgICogJWogICAgICAwMDEgdG8gMzY2ICAgICAgICAgICAgICAgIERheSBvZiB0aGUgeWVhciwgMyBkaWdpdHMgd2l0aCBsZWFkaW5nIHplcm9zCiAgICAgKiAldSAgICAgIDEgLSA3IChNb24gLSBTdW4pICAgICAgICAgSVNPLTg2MDEgbnVtZXJpYyByZXByZXNlbnRhdGlvbiBvZiB0aGUgZGF5IG9mIHRoZSB3ZWVrCiAgICAgKiAldyAgICAgIDAgLSA2IChTdW4gLSBTYXQpICAgICAgICAgTnVtZXJpYyByZXByZXNlbnRhdGlvbiBvZiB0aGUgZGF5IG9mIHRoZSB3ZWVrCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAqID09PSBXZWVrID09PSAgICAgICAgICAgICAgICAgICAgIAogICAgICogJVUgICAgICAxMyAgICAgICAgICAgICAgICAgICAgICAgIEZ1bGwgV2VlayBudW1iZXIsIHN0YXJ0aW5nIHdpdGggdGhlIGZpcnN0IFN1bmRheSBhcyB0aGUgZmlyc3Qgd2VlawogICAgICogJVYgICAgICAwMSB0aHJvdWdoIDUzICAgICAgICAgICAgIElTTy04NjAxOjE5ODggd2VlayBudW1iZXIsIHN0YXJ0aW5nIHdpdGggdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIgCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBhdCBsZWFzdCA0IHdlZWtkYXlzLCB3aXRoIE1vbmRheSBiZWluZyB0aGUgc3RhcnQgb2YgdGhlIHdlZWsKICAgICAqICVXICAgICAgNDYgICAgICAgICAgICAgICAgICAgICAgICBBIG51bWVyaWMgcmVwcmVzZW50YXRpb24gb2YgdGhlIHdlZWsgb2YgdGhlIHllYXIsIAogICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0aW5nIHdpdGggdGhlIGZpcnN0IE1vbmRheSBhcyB0aGUgZmlyc3Qgd2VlawogICAgICogPT09IE1vbnRoID09PSAgICAgICAgICAgICAgICAgICAgCiAgICAgKiAlYiAgICAgIEphbiB0aHJvdWdoIERlYyAgICAgICAgICAgQWJicmV2aWF0ZWQgbW9udGggbmFtZSwgYmFzZWQgb24gdGhlIGxvY2FsZQogICAgICogJUIgICAgICBKYW51YXJ5IC0gRGVjZW1iZXIgICAgICAgIEZ1bGwgbW9udGggbmFtZSwgYmFzZWQgb24gdGhlIGxvY2FsZQogICAgICogJWggICAgICBKYW4gdGhyb3VnaCBEZWMgICAgICAgICAgIEFiYnJldmlhdGVkIG1vbnRoIG5hbWUsIGJhc2VkIG9uIHRoZSBsb2NhbGUgKGFuIGFsaWFzIG9mICViKQogICAgICogJW0gICAgICAwMSAtIDEyIChKYW4gLSBEZWMpICAgICAgIFR3byBkaWdpdCByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9udGgKICAgICAqIAogICAgICogPT09IFllYXIgPT09ICAgICAgICAgICAgICAgICAgICAgCiAgICAgKiAlQyAgICAgIDE5ICAgICAgICAgICAgICAgICAgICAgICAgVHdvIGRpZ2l0IGNlbnR1cnkgKHllYXIvMTAwLCB0cnVuY2F0ZWQgdG8gYW4gaW50ZWdlcikKICAgICAqICV5ICAgICAgMDkgZm9yIDIwMDkgICAgICAgICAgICAgICBUd28gZGlnaXQgeWVhcgogICAgICogJVkgICAgICAyMDM4ICAgICAgICAgICAgICAgICAgICAgIEZvdXIgZGlnaXQgeWVhcgogICAgICogCiAgICAgKiA9PT0gVGltZSA9PT0gICAgICAgICAgICAgICAgICAgICAKICAgICAqICVIICAgICAgMDAgdGhyb3VnaCAyMyAgICAgICAgICAgICBUd28gZGlnaXQgcmVwcmVzZW50YXRpb24gb2YgdGhlIGhvdXIgaW4gMjQtaG91ciBmb3JtYXQKICAgICAqICVJICAgICAgMDEgdGhyb3VnaCAxMiAgICAgICAgICAgICBUd28gZGlnaXQgcmVwcmVzZW50YXRpb24gb2YgdGhlIGhvdXIgaW4gMTItaG91ciBmb3JtYXQKICAgICAqICVsICAgICAgMSB0aHJvdWdoIDEyICAgICAgICAgICAgICBIb3VyIGluIDEyLWhvdXIgZm9ybWF0LCB3aXRoIGEgc3BhY2UgcHJlY2VlZGluZyBzaW5nbGUgZGlnaXRzCiAgICAgKiAlTSAgICAgIDAwIHRocm91Z2ggNTkgICAgICAgICAgICAgVHdvIGRpZ2l0IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtaW51dGUKICAgICAqICVwICAgICAgQU0vUE0gICAgICAgICAgICAgICAgICAgICBVUFBFUi1DQVNFICdBTScgb3IgJ1BNJyBiYXNlZCBvbiB0aGUgZ2l2ZW4gdGltZQogICAgICogJVAgICAgICBhbS9wbSAgICAgICAgICAgICAgICAgICAgIGxvd2VyLWNhc2UgJ2FtJyBvciAncG0nIGJhc2VkIG9uIHRoZSBnaXZlbiB0aW1lCiAgICAgKiAlciAgICAgIDA5OjM0OjE3IFBNICAgICAgICAgICAgICAgU2FtZSBhcyAlSTolTTolUyAlcAogICAgICogJVIgICAgICAwMDozNSAgICAgICAgICAgICAgICAgICAgIFNhbWUgYXMgJUg6JU0KICAgICAqICVTICAgICAgMDAgdGhyb3VnaCA1OSAgICAgICAgICAgICBUd28gZGlnaXQgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNlY29uZAogICAgICogJVQgICAgICAyMTozNDoxNyAgICAgICAgICAgICAgICAgIFNhbWUgYXMgJUg6JU06JVMKICAgICAqICVYICAgICAgMDM6NTk6MTYgICAgICAgICAgICAgICAgICBQcmVmZXJyZWQgdGltZSByZXByZXNlbnRhdGlvbiBiYXNlZCBvbiBsb2NhbGUsIHdpdGhvdXQgdGhlIGRhdGUKICAgICAqICV6ICAgICAgLTA1MDAgb3IgRVNUICAgICAgICAgICAgICBFaXRoZXIgdGhlIHRpbWUgem9uZSBvZmZzZXQgZnJvbSBVVEMgb3IgdGhlIGFiYnJldmlhdGlvbgogICAgICogJVogICAgICAtMDUwMCBvciBFU1QgICAgICAgICAgICAgIFRoZSB0aW1lIHpvbmUgb2Zmc2V0L2FiYnJldmlhdGlvbiBvcHRpb24gTk9UIGdpdmVuIGJ5ICV6CiAgICAgKiAKICAgICAqID09PSBUaW1lIGFuZCBEYXRlID09PSAgICAgICAgICAgIAogICAgICogJUQgICAgICAwMi8wNS8wOSAgICAgICAgICAgICAgICAgIFNhbWUgYXMgJW0vJWQvJXkKICAgICAqICVGICAgICAgMjAwOS0wMi0wNSAgICAgICAgICAgICAgICBTYW1lIGFzICVZLSVtLSVkIChjb21tb25seSB1c2VkIGluIGRhdGFiYXNlIGRhdGVzdGFtcHMpCiAgICAgKiAlcyAgICAgIDMwNTgxNTIwMCAgICAgICAgICAgICAgICAgVW5peCBFcG9jaCBUaW1lIHRpbWVzdGFtcCAoc2FtZSBhcyB0aGUgdGltZSgpIGZ1bmN0aW9uKQogICAgICogJXggICAgICAwMi8wNS8wOSAgICAgICAgICAgICAgICAgIFByZWZlcnJlZCBkYXRlIHJlcHJlc2VudGF0aW9uLCB3aXRob3V0IHRoZSB0aW1lCiAgICAgKiAKICAgICAqID09PSBNaXNjZWxsYW5lb3VzID09PSAgICAgICAgICAgIAogICAgICogJW4gICAgICAgIC0tLSAgICAgICAgICAgICAgICAgICAgIEEgbmV3bGluZSBjaGFyYWN0ZXIgKFxuKQogICAgICogJXQgICAgICAgIC0tLSAgICAgICAgICAgICAgICAgICAgIEEgVGFiIGNoYXJhY3RlciAoXHQpCiAgICAgKiAlJSAgICAgICAgLS0tICAgICAgICAgICAgICAgICAgICAgQSBsaXRlcmFsIHBlcmNlbnRhZ2UgY2hhcmFjdGVyICglKQogICAgICogPC9wcmU+CiAgICAgKi8KIAogICAganNEYXRlLmZvcm1hdHMucGhwID0gewogICAgICAgIGNvZGVzOiB7CiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vIDItcGFydCByZWdleCBtYXRjaGVyIGZvciBmb3JtYXQgY29kZXMKICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8gZmlyc3QgbWF0Y2ggbXVzdCBiZSB0aGUgY2hhcmFjdGVyIGJlZm9yZSB0aGUgY29kZSAodG8gYWNjb3VudCBmb3IgZXNjYXBpbmcpCiAgICAgICAgICAgIC8vIHNlY29uZCBtYXRjaCBtdXN0IGJlIHRoZSBmb3JtYXQgY29kZSBjaGFyYWN0ZXIocykKICAgICAgICAgICAgLy8KICAgICAgICAgICAgbWF0Y2hlcjogLygpJSgoJXxbYS16XSkpL2ksCiAgICAgICAgICAgIC8vIGRheQogICAgICAgICAgICBhOiAnQWJickRheU5hbWUnLAogICAgICAgICAgICBBOiAnRGF5TmFtZScsCiAgICAgICAgICAgIGQ6ICdEYXRlLjInLAogICAgICAgICAgICBlOiAnRGF0ZScsCiAgICAgICAgICAgIGo6ICdEYXlPZlllYXIuMycsCiAgICAgICAgICAgIHU6ICdEYXlPZldlZWsnLAogICAgICAgICAgICB3OiAnRGF5JywKICAgICAgICAgICAgLy8gd2VlawogICAgICAgICAgICBVOiAnRnVsbFdlZWtPZlllYXIuMicsCiAgICAgICAgICAgIFY6ICdJc29XZWVrLjInLAogICAgICAgICAgICBXOiAnV2Vla09mWWVhci4yJywKICAgICAgICAgICAgLy8gbW9udGgKICAgICAgICAgICAgYjogJ0FiYnJNb250aE5hbWUnLAogICAgICAgICAgICBCOiAnTW9udGhOYW1lJywKICAgICAgICAgICAgbTogJ01vbnRoTnVtYmVyLjInLAogICAgICAgICAgICBoOiAnQWJick1vbnRoTmFtZScsCiAgICAgICAgICAgIC8vIHllYXIKICAgICAgICAgICAgQzogJ0NlbnR1cnkuMicsCiAgICAgICAgICAgIHk6ICdTaG9ydFllYXIuMicsCiAgICAgICAgICAgIFk6ICdGdWxsWWVhcicsCiAgICAgICAgICAgIC8vIHRpbWUKICAgICAgICAgICAgSDogJ0hvdXJzLjInLAogICAgICAgICAgICBJOiAnSG91cnMxMi4yJywKICAgICAgICAgICAgbDogJ0hvdXJzMTInLAogICAgICAgICAgICBwOiAnQU1QTScsCiAgICAgICAgICAgIFA6ICdBbVBtJywKICAgICAgICAgICAgTTogJ01pbnV0ZXMuMicsCiAgICAgICAgICAgIFM6ICdTZWNvbmRzLjInLAogICAgICAgICAgICBzOiAnVW5peCcsCiAgICAgICAgICAgIE86ICdUaW1lem9uZU9mZnNldCcsCiAgICAgICAgICAgIHo6ICdHbXRPZmZzZXQnLAogICAgICAgICAgICBaOiAnVGltZXpvbmVBYmJyJwogICAgICAgIH0sCiAgICAgICAgCiAgICAgICAgc2hvcnRjdXRzOiB7CiAgICAgICAgICAgIEQ6ICclbS8lZC8leScsCiAgICAgICAgICAgIEY6ICclWS0lbS0lZCcsCiAgICAgICAgICAgIFQ6ICclSDolTTolUycsCiAgICAgICAgICAgIFg6ICclSDolTTolUycsCiAgICAgICAgICAgIHg6ICclbS8lZC8leScsCiAgICAgICAgICAgIFI6ICclSDolTScsCiAgICAgICAgICAgIHI6ICclSTolTTolUyAlcCcsCiAgICAgICAgICAgIHQ6ICdcdCcsCiAgICAgICAgICAgIG46ICdcbicsCiAgICAgICAgICAgICclJzogJyUnCiAgICAgICAgfQogICAgfTsgICAKICAgIC8vCiAgICAvLyBDb25jZXB0dWFsbHksIHRoZSBsb2dpYyBpbXBsZW1lbnRlZCBoZXJlIGlzIHNpbWlsYXIgdG8gS2VuIFNueWRlcidzIERhdGUgSW5zdGFuY2UgTWV0aG9kcy4KICAgIC8vIEkgdXNlIGhpcyBpZGVhIG9mIGEgc2V0IG9mIHBhcnNlcnMgd2hpY2ggY2FuIGJlIHJlZ3VsYXIgZXhwcmVzc2lvbnMgb3IgZnVuY3Rpb25zLAogICAgLy8gaXRlcmF0aW5nIHRocm91Z2ggdGhvc2UsIGFuZCB0aGVuIHNlZWluZyBpZiBEYXRlLnBhcnNlKCkgd2lsbCBjcmVhdGUgYSBkYXRlLgogICAgLy8gVGhlIHBhcnNlciBleHByZXNzaW9ucyBhbmQgZnVuY3Rpb25zIGFyZSBhIGxpdHRsZSBkaWZmZXJlbnQgYW5kIHNvbWUgYnVncyBoYXZlIGJlZW4KICAgIC8vIHdvcmtlZCBvdXQuICBBbHNvLCBhIGxvdCBvZiAicHJlLXBhcnNpbmciIGlzIGRvbmUgdG8gZml4IGltcGxlbWVudGF0aW9uCiAgICAvLyB2YXJpYXRpb25zIG9mIERhdGUucGFyc2UoKSBiZXR3ZWVuIGJyb3dzZXJzLgogICAgLy8KICAgIGpzRGF0ZS5jcmVhdGVEYXRlID0gZnVuY3Rpb24oZGF0ZSkgewogICAgICAgIC8vIGlmIHBhc3NpbmcgaW4gbXVsdGlwbGUgYXJndW1lbnRzLCB0cnkgRGF0ZSBjb25zdHJ1Y3RvcgogICAgICAgIGlmIChkYXRlID09IG51bGwpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBEYXRlKCk7CiAgICAgICAgfQogICAgICAgIC8vIElmIHRoZSBwYXNzZWQgdmFsdWUgaXMgYWxyZWFkeSBhIGRhdGUgb2JqZWN0LCByZXR1cm4gaXQKICAgICAgICBpZiAoZGF0ZSBpbnN0YW5jZW9mIERhdGUpIHsKICAgICAgICAgICAgcmV0dXJuIGRhdGU7CiAgICAgICAgfQogICAgICAgIC8vIGlmICh0eXBlb2YgZGF0ZSA9PSAnbnVtYmVyJykgcmV0dXJuIG5ldyBEYXRlKGRhdGUgKiAxMDAwKTsKICAgICAgICAvLyBJZiB0aGUgcGFzc2VkIHZhbHVlIGlzIGFuIGludGVnZXIsIGludGVycHJldCBpdCBhcyBhIGphdmFzY3JpcHQgdGltZXN0YW1wCiAgICAgICAgaWYgKHR5cGVvZiBkYXRlID09ICdudW1iZXInKSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgRGF0ZShkYXRlKTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLy8gQmVmb3JlIHBhc3Npbmcgc3RyaW5ncyBpbnRvIERhdGUucGFyc2UoKSwgaGF2ZSB0byBub3JtYWxpemUgdGhlbSBmb3IgY2VydGFpbiBjb25kaXRpb25zLgogICAgICAgIC8vIElmIHN0cmluZ3MgYXJlIG5vdCBmb3JtYXR0ZWQgc3RhY2NvcmRpbmcgdG8gdGhlIEVjbWFTY3JpcHQgc3BlYywgcmVzdWx0cyBmcm9tIERhdGUgcGFyc2Ugd2lsbCBiZSBpbXBsZW1lbnRhdGlvbiBkZXBlbmRlbnQuICAKICAgICAgICAvLyAKICAgICAgICAvLyBGb3IgZXhhbXBsZTogCiAgICAgICAgLy8gICogRkYgYW5kIE9wZXJhIGFzc3VtZSAyIGRpZ2l0IGRhdGVzIGFyZSBwcmUgeTJrLCBDaG9tZSBhc3N1bWVzIDw1MCBpcyBwcmUgeTJrLCA1MCsgaXMgMjFzdCBjZW50dXJ5LiAgCiAgICAgICAgLy8gICogQ2hyb21lIHdpbGwgY29ycmVjdGx5IHBhcnNlICcxOTg0LTEtMjUnIGludG8gbG9jYWx0aW1lLCBGRiBhbmQgT3BlcmEgd2lsbCBub3QgcGFyc2UuCiAgICAgICAgLy8gICogQm90aCBGRiwgQ2hyb21lIGFuZCBPcGVyYSB3aWxsIHBhcnNlICcxOTg0LzEvMjUnIGludG8gbG9jYWx0aW1lLgogICAgICAgIAogICAgICAgIC8vIHJlbW92ZSBsZWFkaW5nIGFuZCB0cmFpbGluZyBzcGFjZXMKICAgICAgICB2YXIgcGFyc2FibGUgPSBTdHJpbmcoZGF0ZSkucmVwbGFjZSgvXlxzKiguKylccyokL2csICckMScpOwogICAgICAgIAogICAgICAgIC8vIHJlcGxhY2UgZGFoc2VzICgtKSB3aXRoIHNsYXNoZXMgKC8pIGluIGRhdGVzIGxpa2Ugbltubm5dL25bbl0vbltubm5dCiAgICAgICAgcGFyc2FibGUgPSBwYXJzYWJsZS5yZXBsYWNlKC9eKFswLTldezEsNH0pLShbMC05XXsxLDJ9KS0oWzAtOV17MSw0fSkvLCAiJDEvJDIvJDMiKTsKICAgICAgICAKICAgICAgICAvLy8vLy8vLy8KICAgICAgICAvLyBOZWVkIHRvIGNoZWNrIGZvciAnMTUtRGVjLTA5JyBhbHNvLgogICAgICAgIC8vIEZGIHdpbGwgbm90IHBhcnNlLCBidXQgQ2hyb21lIHdpbGwuCiAgICAgICAgLy8gQ2hyb21lIHdpbGwgc2V0IGRhdGUgdG8gMjAwOSBhcyB3ZWxsLgogICAgICAgIC8vLy8vLy8vLwogICAgICAgIAogICAgICAgIC8vIGZpcnN0IGNoZWNrIGZvciAnZGQtbW1tLXl5eXknIG9yICdkZC9tbW0veXl5eScgbGlrZSAnMTUtRGVjLTIwMTAnCiAgICAgICAgcGFyc2FibGUgPSBwYXJzYWJsZS5yZXBsYWNlKC9eKDNbMDFdfFswLTJdP1xkKVstXC9dKFthLXpdezMsfSlbLVwvXShcZHs0fSkvaSwgIiQxICQyICQzIik7CiAgICAgICAgCiAgICAgICAgLy8gTm93IGNoZWNrIGZvciAnZGQtbW1tLXl5JyBvciAnZGQvbW1tL3l5JyBhbmQgbm9ybWFsaXplIHllYXJzIHRvIGRlZmF1bHQgY2VudHVyeS4KICAgICAgICB2YXIgbWF0Y2ggPSBwYXJzYWJsZS5tYXRjaCgvXigzWzAxXXxbMC0yXT9cZClbLVwvXShbYS16XXszLH0pWy1cL10oXGR7Mn0pXEQqL2kpOwogICAgICAgIGlmIChtYXRjaCAmJiBtYXRjaC5sZW5ndGggPiAzKSB7CiAgICAgICAgICAgIHZhciBtMyA9IHBhcnNlRmxvYXQobWF0Y2hbM10pOwogICAgICAgICAgICB2YXIgbnkgPSBqc0RhdGUuY29uZmlnLmRlZmF1bHRDZW50dXJ5ICsgbTM7CiAgICAgICAgICAgIG55ID0gU3RyaW5nKG55KTsKICAgICAgICAgICAgCiAgICAgICAgICAgIC8vIG5vdyByZXBsYWNlIDIgZGlnaXQgeWVhciB3aXRoIDQgZGlnaXQgeWVhcgogICAgICAgICAgICBwYXJzYWJsZSA9IHBhcnNhYmxlLnJlcGxhY2UoL14oM1swMV18WzAtMl0/XGQpWy1cL10oW2Etel17Myx9KVstXC9dKFxkezJ9KVxEKi9pLCBtYXRjaFsxXSArJyAnKyBtYXRjaFsyXSArJyAnKyBueSk7CiAgICAgICAgICAgIAogICAgICAgIH0KICAgICAgICAKICAgICAgICAvLyBDaGVjayBmb3IgJzEvMTkvNzAgODoxNFBNJwogICAgICAgIC8vIHdoZXJlIHN0YXJ0cyB3aXRoIG1tL2RkL3l5IG9yIHl5L21tL2RkIGFuZCBoYXZlIHNvbWV0aGluZyBhZnRlcgogICAgICAgIC8vIENoZWNrIGlmIDFzdCBwb3N0aWlvbiBpcyBncmVhdGVyIHRoYW4gMzEsIGFzc3VtZSBpdCBpcyB5ZWFyLgogICAgICAgIC8vIEFzc21lIGFsbCAyIGRpZ2l0IHllYXJzIGFyZSAxOTAwJ3MuCiAgICAgICAgLy8gRmluYWxseSwgY2hhbmdlIHRoZW0gaW50byBVUyBzdHlsZSBtbS9kZC95eXl5IHJlcHJlc2VudGF0aW9ucy4KICAgICAgICBtYXRjaCA9IHBhcnNhYmxlLm1hdGNoKC9eKFswLTldezEsMn0pWy1cL10oWzAtOV17MSwyfSlbLVwvXShbMC05XXsxLDJ9KVteMC05XS8pOwogICAgICAgIAogICAgICAgIGZ1bmN0aW9uIGgxKHBhcnNhYmxlLCBtYXRjaCkgewogICAgICAgICAgICB2YXIgbTEgPSBwYXJzZUZsb2F0KG1hdGNoWzFdKTsKICAgICAgICAgICAgdmFyIG0yID0gcGFyc2VGbG9hdChtYXRjaFsyXSk7CiAgICAgICAgICAgIHZhciBtMyA9IHBhcnNlRmxvYXQobWF0Y2hbM10pOwogICAgICAgICAgICB2YXIgY2VudCA9IGpzRGF0ZS5jb25maWcuZGVmYXVsdENlbnR1cnk7CiAgICAgICAgICAgIHZhciBueSwgbmQsIG5tLCBzdHI7CiAgICAgICAgICAgIAogICAgICAgICAgICBpZiAobTEgPiAzMSkgeyAvLyBmaXJzdCBudW1iZXIgaXMgYSB5ZWFyCiAgICAgICAgICAgICAgICBuZCA9IG0zOwogICAgICAgICAgICAgICAgbm0gPSBtMjsKICAgICAgICAgICAgICAgIG55ID0gY2VudCArIG0xOwogICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICBlbHNlIHsgLy8gbGFzdCBudW1iZXIgaXMgdGhlIHllYXIKICAgICAgICAgICAgICAgIG5kID0gbTI7CiAgICAgICAgICAgICAgICBubSA9IG0xOwogICAgICAgICAgICAgICAgbnkgPSBjZW50ICsgbTM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgICAgIHN0ciA9IG5tKycvJytuZCsnLycrbnk7CiAgICAgICAgICAgIAogICAgICAgICAgICAvLyBub3cgcmVwbGFjZSAyIGRpZ2l0IHllYXIgd2l0aCA0IGRpZ2l0IHllYXIKICAgICAgICAgICAgcmV0dXJuICBwYXJzYWJsZS5yZXBsYWNlKC9eKFswLTldezEsMn0pWy1cL10oWzAtOV17MSwyfSlbLVwvXShbMC05XXsxLDJ9KS8sIHN0cik7CiAgICAgICAgCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmIChtYXRjaCAmJiBtYXRjaC5sZW5ndGggPiAzKSB7CiAgICAgICAgICAgIHBhcnNhYmxlID0gaDEocGFyc2FibGUsIG1hdGNoKTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLy8gTm93IGNoZWNrIGZvciAnMS8xOS83MCcgd2l0aCBub3RoaW5nIGFmdGVyIGFuZCBkbyBhcyBhYm92ZQogICAgICAgIHZhciBtYXRjaCA9IHBhcnNhYmxlLm1hdGNoKC9eKFswLTldezEsMn0pWy1cL10oWzAtOV17MSwyfSlbLVwvXShbMC05XXsxLDJ9KSQvKTsKICAgICAgICAKICAgICAgICBpZiAobWF0Y2ggJiYgbWF0Y2gubGVuZ3RoID4gMykgewogICAgICAgICAgICBwYXJzYWJsZSA9IGgxKHBhcnNhYmxlLCBtYXRjaCk7CiAgICAgICAgfQogICAgICAgICAgICAgICAgCiAgICAgICAgCiAgICAgICAgdmFyIGkgPSAwOwogICAgICAgIHZhciBsZW5ndGggPSBqc0RhdGUubWF0Y2hlcnMubGVuZ3RoOwogICAgICAgIHZhciBwYXR0ZXJuLAogICAgICAgICAgICBtcywKICAgICAgICAgICAgY3VycmVudCA9IHBhcnNhYmxlLAogICAgICAgICAgICBvYmo7CiAgICAgICAgd2hpbGUgKGkgPCBsZW5ndGgpIHsKICAgICAgICAgICAgbXMgPSBEYXRlLnBhcnNlKGN1cnJlbnQpOwogICAgICAgICAgICBpZiAoIWlzTmFOKG1zKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEYXRlKG1zKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBwYXR0ZXJuID0ganNEYXRlLm1hdGNoZXJzW2ldOwogICAgICAgICAgICBpZiAodHlwZW9mIHBhdHRlcm4gPT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgICAgICAgb2JqID0gcGF0dGVybi5jYWxsKGpzRGF0ZSwgY3VycmVudCk7CiAgICAgICAgICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgRGF0ZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBvYmo7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBjdXJyZW50ID0gcGFyc2FibGUucmVwbGFjZShwYXR0ZXJuWzBdLCBwYXR0ZXJuWzFdKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpKys7CiAgICAgICAgfQogICAgICAgIHJldHVybiBOYU47CiAgICB9OwogICAgCgogICAgLyoqCiAgICAgKiBAc3RhdGljCiAgICAgKiBIYW5keSBzdGF0aWMgdXRpbGl0eSBmdW5jdGlvbiB0byByZXR1cm4gdGhlIG51bWJlciBvZiBkYXlzIGluIGEgZ2l2ZW4gbW9udGguCiAgICAgKiBAcGFyYW0ge0ludGVnZXJ9IHllYXIgWWVhcgogICAgICogQHBhcmFtIHtJbnRlZ2VyfSBtb250aCBNb250aCAoMS0xMikKICAgICAqIEByZXR1cm5zIHtJbnRlZ2VyfSBOdW1iZXIgb2YgZGF5cyBpbiB0aGUgbW9udGguCiAgICAqLwogICAgLy8KICAgIC8vIGhhbmR5IHV0aWxpdHkgbWV0aG9kIEJvcnJvd2VkIHJpZ2h0IGZyb20gS2VuIFNueWRlcidzIERhdGUgSW5zdGFuY2UgTWVodG9kcy4KICAgIC8vIAogICAganNEYXRlLmRheXNJbk1vbnRoID0gZnVuY3Rpb24oeWVhciwgbW9udGgpIHsKICAgICAgICBpZiAobW9udGggPT0gMikgewogICAgICAgICAgICByZXR1cm4gbmV3IERhdGUoeWVhciwgMSwgMjkpLmdldERhdGUoKSA9PSAyOSA/IDI5IDogMjg7CiAgICAgICAgfQogICAgICAgIHJldHVybiBbdW5kZWZpbmVkLDMxLHVuZGVmaW5lZCwzMSwzMCwzMSwzMCwzMSwzMSwzMCwzMSwzMCwzMV1bbW9udGhdOwogICAgfTsKCgogICAgLy8KICAgIC8vIEFuIEFycmF5IG9mIHJlZ3VsYXIgZXhwcmVzc2lvbnMgb3IgZnVuY3Rpb25zIHRoYXQgd2lsbCBhdHRlbXB0IHRvIG1hdGNoIHRoZSBkYXRlIHN0cmluZy4KICAgIC8vIEZ1bmN0aW9ucyBhcmUgY2FsbGVkIHdpdGggc2NvcGUgb2YgYSBqc0RhdGUgaW5zdGFuY2UuCiAgICAvLwogICAganNEYXRlLm1hdGNoZXJzID0gWwogICAgICAgIC8vIGNvbnZlcnQgZGQubW1tLnl5eXkgdG8gbW0vZGQveXl5eSAod29ybGQgZGF0ZSB0byBVUyBkYXRlKS4KICAgICAgICBbLygzWzAxXXxbMC0yXVxkKVxzKlwuXHMqKDFbMC0yXXwwXGQpXHMqXC5ccyooWzEtOV1cZHszfSkvLCAnJDIvJDEvJDMnXSwKICAgICAgICAvLyBjb252ZXJ0IHl5eXktbW0tZGQgdG8gbW0vZGQveXl5eSAoSVNPIGRhdGUgdG8gVVMgZGF0ZSkuCiAgICAgICAgWy8oWzEtOV1cZHszfSlccyotXHMqKDFbMC0yXXwwXGQpXHMqLVxzKigzWzAxXXxbMC0yXVxkKS8sICckMi8kMy8kMSddLAogICAgICAgIC8vIEhhbmRsZSAxMiBob3VyIG9yIDI0IGhvdXIgdGltZSB3aXRoIG1pbGxpc2Vjb25kcyBhbS9wbSBhbmQgb3B0aW9uYWwgZGF0ZSBwYXJ0LgogICAgICAgIGZ1bmN0aW9uKHN0cikgeyAKICAgICAgICAgICAgdmFyIG1hdGNoID0gc3RyLm1hdGNoKC9eKD86KC4rKVxzKyk/KFswMTJdP1xkKSg/OlxzKlw6XHMqKFxkXGQpKT8oPzpccypcOlxzKihcZFxkKFwuXGQqKT8pKT9ccyooYW18cG0pP1xzKiQvaSk7CiAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgIG9wdC4gZGF0ZSAgICAgIGhvdXIgICAgICAgb3B0LiBtaW51dGUgICAgIG9wdC4gc2Vjb25kICAgICAgIG9wdC4gbXNlYyAgIG9wdC4gYW0gb3IgcG0KICAgICAgICAgICAgaWYgKG1hdGNoKSB7CiAgICAgICAgICAgICAgICBpZiAobWF0Y2hbMV0pIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZCA9IHRoaXMuY3JlYXRlRGF0ZShtYXRjaFsxXSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGlzTmFOKGQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHZhciBkID0gbmV3IERhdGUoKTsKICAgICAgICAgICAgICAgICAgICBkLnNldE1pbGxpc2Vjb25kcygwKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBob3VyID0gcGFyc2VGbG9hdChtYXRjaFsyXSk7CiAgICAgICAgICAgICAgICBpZiAobWF0Y2hbNl0pIHsKICAgICAgICAgICAgICAgICAgICBob3VyID0gbWF0Y2hbNl0udG9Mb3dlckNhc2UoKSA9PSAnYW0nID8gKGhvdXIgPT0gMTIgPyAwIDogaG91cikgOiAoaG91ciA9PSAxMiA/IDEyIDogaG91ciArIDEyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGQuc2V0SG91cnMoaG91ciwgcGFyc2VJbnQobWF0Y2hbM10gfHwgMCwgMTApLCBwYXJzZUludChtYXRjaFs0XSB8fCAwLCAxMCksICgocGFyc2VGbG9hdChtYXRjaFs1XSB8fCAwKSkgfHwgMCkqMTAwMCk7CiAgICAgICAgICAgICAgICByZXR1cm4gZDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiBzdHI7CiAgICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIC8vIEhhbmRsZSBJU08gdGltZXN0YW1wIHdpdGggdGltZSB6b25lLgogICAgICAgIGZ1bmN0aW9uKHN0cikgewogICAgICAgICAgICB2YXIgbWF0Y2ggPSBzdHIubWF0Y2goL14oPzooLispKVtUfFxzK10oWzAxMl1cZCkoPzpcOihcZFxkKSkoPzpcOihcZFxkKSkoPzpcLlxkKykoW1wrXC1dXGRcZFw6XGRcZCkkL2kpOwogICAgICAgICAgICBpZiAobWF0Y2gpIHsKICAgICAgICAgICAgICAgIGlmIChtYXRjaFsxXSkgewogICAgICAgICAgICAgICAgICAgIHZhciBkID0gdGhpcy5jcmVhdGVEYXRlKG1hdGNoWzFdKTsKICAgICAgICAgICAgICAgICAgICBpZiAoaXNOYU4oZCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGQgPSBuZXcgRGF0ZSgpOwogICAgICAgICAgICAgICAgICAgIGQuc2V0TWlsbGlzZWNvbmRzKDApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIGhvdXIgPSBwYXJzZUZsb2F0KG1hdGNoWzJdKTsKICAgICAgICAgICAgICAgIGQuc2V0SG91cnMoaG91ciwgcGFyc2VJbnQobWF0Y2hbM10sIDEwKSwgcGFyc2VJbnQobWF0Y2hbNF0sIDEwKSwgcGFyc2VGbG9hdChtYXRjaFs1XSkqMTAwMCk7CiAgICAgICAgICAgICAgICByZXR1cm4gZDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RyOwogICAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICAvLyBUcnkgdG8gbWF0Y2ggYW1iaWd1b3VzIHN0cmluZ3MgbGlrZSAxMi84LzIyLgogICAgICAgIC8vIFVzZSBGRiBkYXRlIGFzc3VtcHRpb24gdGhhdCAyIGRpZ2l0IHllYXJzIGFyZSAyMHRoIGNlbnR1cnkgKGkuZS4gMTkwMCdzKS4KICAgICAgICAvLyBUaGlzIG1heSBiZSByZWR1bmRhbnQgd2l0aCBwcmUgcHJvY2Vzc2luZyBvZiBkYXRlIGFscmVhZHkgcGVyZm9ybWVkLgogICAgICAgIGZ1bmN0aW9uKHN0cikgewogICAgICAgICAgICB2YXIgbWF0Y2ggPSBzdHIubWF0Y2goL14oWzAtM10/XGQpXHMqWy1cLy5cc117MX1ccyooW2EtekEtWl17Myw5fSlccypbLVwvLlxzXXsxfVxzKihbMC0zXT9cZCkkLyk7CiAgICAgICAgICAgIGlmIChtYXRjaCkgewogICAgICAgICAgICAgICAgdmFyIGQgPSBuZXcgRGF0ZSgpOwogICAgICAgICAgICAgICAgdmFyIGNlbnQgPSBqc0RhdGUuY29uZmlnLmRlZmF1bHRDZW50dXJ5OwogICAgICAgICAgICAgICAgdmFyIG0xID0gcGFyc2VGbG9hdChtYXRjaFsxXSk7CiAgICAgICAgICAgICAgICB2YXIgbTMgPSBwYXJzZUZsb2F0KG1hdGNoWzNdKTsKICAgICAgICAgICAgICAgIHZhciBueSwgbmQsIG5tOwogICAgICAgICAgICAgICAgaWYgKG0xID4gMzEpIHsgLy8gZmlyc3QgbnVtYmVyIGlzIGEgeWVhcgogICAgICAgICAgICAgICAgICAgIG5kID0gbTM7CiAgICAgICAgICAgICAgICAgICAgbnkgPSBjZW50ICsgbTE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGVsc2UgeyAvLyBsYXN0IG51bWJlciBpcyB0aGUgeWVhcgogICAgICAgICAgICAgICAgICAgIG5kID0gbTE7CiAgICAgICAgICAgICAgICAgICAgbnkgPSBjZW50ICsgbTM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBubSA9IGluQXJyYXkobWF0Y2hbMl0sIGpzRGF0ZS5yZWdpb25hbFtqc0RhdGUucmVnaW9uYWwuZ2V0TG9jYWxlKCldWyJtb250aE5hbWVzU2hvcnQiXSk7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGlmIChubSA9PSAtMSkgewogICAgICAgICAgICAgICAgICAgIG5tID0gaW5BcnJheShtYXRjaFsyXSwganNEYXRlLnJlZ2lvbmFsW2pzRGF0ZS5yZWdpb25hbC5nZXRMb2NhbGUoKV1bIm1vbnRoTmFtZXMiXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgZC5zZXRGdWxsWWVhcihueSwgbm0sIG5kKTsKICAgICAgICAgICAgICAgIGQuc2V0SG91cnMoMCwwLDAsMCk7CiAgICAgICAgICAgICAgICByZXR1cm4gZDsKICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gc3RyOwogICAgICAgICAgICB9CiAgICAgICAgfSAgICAgIAogICAgXTsKCiAgICAvLwogICAgLy8gSSB0aGluayBKb2huIFJlaXNpZyBwdWJsaXNoZWQgdGhpcyBtZXRob2Qgb24gaGlzIGJsb2csIGVqb2huLgogICAgLy8KICAgIGZ1bmN0aW9uIGluQXJyYXkoIGVsZW0sIGFycmF5ICkgewogICAgICAgIGlmICggYXJyYXkuaW5kZXhPZiApIHsKICAgICAgICAgICAgcmV0dXJuIGFycmF5LmluZGV4T2YoIGVsZW0gKTsKICAgICAgICB9CgogICAgICAgIGZvciAoIHZhciBpID0gMCwgbGVuZ3RoID0gYXJyYXkubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKysgKSB7CiAgICAgICAgICAgIGlmICggYXJyYXlbIGkgXSA9PT0gZWxlbSApIHsKICAgICAgICAgICAgICAgIHJldHVybiBpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gLTE7CiAgICB9CiAgICAKICAgIC8vCiAgICAvLyBUaGFua3MgdG8gS2FuZ2F4LCBDaHJpc3RpYW4gU2NpYmVycmFzIGFuZCBTdGFjayBPdmVyZmxvdyBmb3IgdGhpcyBtZXRob2QuCiAgICAvLwogICAgZnVuY3Rpb24gZ2V0X3R5cGUodGhpbmcpewogICAgICAgIGlmKHRoaW5nPT09bnVsbCkgcmV0dXJuICJbb2JqZWN0IE51bGxdIjsgLy8gc3BlY2lhbCBjYXNlCiAgICAgICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0aGluZyk7CiAgICB9CiAgICAKICAgICQuanNEYXRlID0ganNEYXRlOwoKICAgICAgCiAgICAvKioKICAgICAqIEphdmFTY3JpcHQgcHJpbnRmL3NwcmludGYgZnVuY3Rpb25zLgogICAgICogCiAgICAgKiBUaGlzIGNvZGUgaGFzIGJlZW4gYWRhcHRlZCBmcm9tIHRoZSBwdWJsaWNseSBhdmFpbGFibGUgc3ByaW50ZiBtZXRob2RzCiAgICAgKiBieSBBc2ggU2VhcmxlLiBIaXMgb3JpZ2luYWwgaGVhZGVyIGZvbGxvd3M6CiAgICAgKgogICAgICogICAgIFRoaXMgY29kZSBpcyB1bnJlc3RyaWN0ZWQ6IHlvdSBhcmUgZnJlZSB0byB1c2UgaXQgaG93ZXZlciB5b3UgbGlrZS4KICAgICAqICAgICAKICAgICAqICAgICBUaGUgZnVuY3Rpb25zIHNob3VsZCB3b3JrIGFzIGV4cGVjdGVkLCBwZXJmb3JtaW5nIGxlZnQgb3IgcmlnaHQgYWxpZ25tZW50LAogICAgICogICAgIHRydW5jYXRpbmcgc3RyaW5ncywgb3V0cHV0dGluZyBudW1iZXJzIHdpdGggYSByZXF1aXJlZCBwcmVjaXNpb24gZXRjLgogICAgICoKICAgICAqICAgICBGb3IgY29tcGxleCBjYXNlcywgdGhlc2UgZnVuY3Rpb25zIGZvbGxvdyB0aGUgUGVybCBpbXBsZW1lbnRhdGlvbnMgb2YKICAgICAqICAgICAocylwcmludGYsIGFsbG93aW5nIGFyZ3VtZW50cyB0byBiZSBwYXNzZWQgb3V0LW9mLW9yZGVyLCBhbmQgdG8gc2V0IHRoZQogICAgICogICAgIHByZWNpc2lvbiBvciBsZW5ndGggb2YgdGhlIG91dHB1dCBiYXNlZCBvbiBhcmd1bWVudHMgaW5zdGVhZCBvZiBmaXhlZAogICAgICogICAgIG51bWJlcnMuCiAgICAgKgogICAgICogICAgIFNlZSBodHRwOi8vcGVybGRvYy5wZXJsLm9yZy9mdW5jdGlvbnMvc3ByaW50Zi5odG1sIGZvciBtb3JlIGluZm9ybWF0aW9uLgogICAgICoKICAgICAqICAgICBJbXBsZW1lbnRlZDoKICAgICAqICAgICAtIHplcm8gYW5kIHNwYWNlLXBhZGRpbmcKICAgICAqICAgICAtIHJpZ2h0IGFuZCBsZWZ0LWFsaWdubWVudCwKICAgICAqICAgICAtIGJhc2UgWCBwcmVmaXggKGJpbmFyeSwgb2N0YWwgYW5kIGhleCkKICAgICAqICAgICAtIHBvc2l0aXZlIG51bWJlciBwcmVmaXgKICAgICAqICAgICAtIChtaW5pbXVtKSB3aWR0aAogICAgICogICAgIC0gcHJlY2lzaW9uIC8gdHJ1bmNhdGlvbiAvIG1heGltdW0gd2lkdGgKICAgICAqICAgICAtIG91dCBvZiBvcmRlciBhcmd1bWVudHMKICAgICAqCiAgICAgKiAgICAgTm90IGltcGxlbWVudGVkICh5ZXQpOgogICAgICogICAgIC0gdmVjdG9yIGZsYWcKICAgICAqICAgICAtIHNpemUgKGJ5dGVzLCB3b3JkcywgbG9uZy13b3JkcyBldGMuKQogICAgICogICAgIAogICAgICogICAgIFdpbGwgbm90IGltcGxlbWVudDoKICAgICAqICAgICAtICVuIG9yICVwIChubyBwYXNzLWJ5LXJlZmVyZW5jZSBpbiBKYXZhU2NyaXB0KQogICAgICoKICAgICAqICAgICBAdmVyc2lvbiAyMDA3LjA0LjI3CiAgICAgKiAgICAgQGF1dGhvciBBc2ggU2VhcmxlIAogICAgICogCiAgICAgKiBZb3UgY2FuIHNlZSB0aGUgb3JpZ2luYWwgd29yayBhbmQgY29tbWVudHMgb24gaGlzIGJsb2c6CiAgICAgKiBodHRwOi8vaGV4bWVuLmNvbS9ibG9nLzIwMDcvMDMvcHJpbnRmLXNwcmludGYvCiAgICAgKiBodHRwOi8vaGV4bWVuLmNvbS9qcy9zcHJpbnRmLmpzCiAgICAgKi8KICAgICAKICAgICAvKioKICAgICAgKiBATW9kaWZpY2F0aW9ucyAyMDA5LjA1LjI2CiAgICAgICogQGF1dGhvciBDaHJpcyBMZW9uZWxsbwogICAgICAqIAogICAgICAqIEFkZGVkICVwICVQIHNwZWNpZmllcgogICAgICAqIEFjdHMgbGlrZSAlZyBvciAlRyBidXQgd2lsbCBub3QgYWRkIG1vcmUgc2lnbmlmaWNhbnQgZGlnaXRzIHRvIHRoZSBvdXRwdXQgdGhhbiBwcmVzZW50IGluIHRoZSBpbnB1dC4KICAgICAgKiBFeGFtcGxlOgogICAgICAqIEZvcm1hdDogJyUuM3AnLCBJbnB1dDogMC4wMTIsIE91dHB1dDogMC4wMTIKICAgICAgKiBGb3JtYXQ6ICclLjNnJywgSW5wdXQ6IDAuMDEyLCBPdXRwdXQ6IDAuMDEyMAogICAgICAqIEZvcm1hdDogJyUuNHAnLCBJbnB1dDogMTIuMCwgT3V0cHV0OiAxMi4wCiAgICAgICogRm9ybWF0OiAnJS40ZycsIElucHV0OiAxMi4wLCBPdXRwdXQ6IDEyLjAwCiAgICAgICogRm9ybWF0OiAnJS40cCcsIElucHV0OiA0LjMyMWUtNSwgT3V0cHV0OiA0LjMyMWUtNQogICAgICAqIEZvcm1hdDogJyUuNGcnLCBJbnB1dDogNC4zMjFlLTUsIE91dHB1dDogNC4zMjEwZS01CiAgICAgICogCiAgICAgICogRXhhbXBsZToKICAgICAgKiA+Pj4gJC5qcXBsb3Quc3ByaW50ZignJS4yZiwgJWQnLCAyMy4zNDUyLCA0My4yMykKICAgICAgKiAiMjMuMzUsIDQzIgogICAgICAqID4+PiAkLmpxcGxvdC5zcHJpbnRmKCJubyB2YWx1ZTogJW4sIGRlY2ltYWwgd2l0aCB0aG91c2FuZHMgc2VwYXJhdG9yOiAlJ2QiLCAyMy4zNDUyLCA0MzM1MjQpCiAgICAgICogIm5vIHZhbHVlOiAsIGRlY2ltYWwgd2l0aCB0aG91c2FuZHMgc2VwYXJhdG9yOiA0MzMsNTI0IgogICAgICAqLwogICAgJC5qcXBsb3Quc3ByaW50ZiA9IGZ1bmN0aW9uKCkgewogICAgICAgIGZ1bmN0aW9uIHBhZChzdHIsIGxlbiwgY2hyLCBsZWZ0SnVzdGlmeSkgewogICAgICAgICAgICB2YXIgcGFkZGluZyA9IChzdHIubGVuZ3RoID49IGxlbikgPyAnJyA6IEFycmF5KDEgKyBsZW4gLSBzdHIubGVuZ3RoID4+PiAwKS5qb2luKGNocik7CiAgICAgICAgICAgIHJldHVybiBsZWZ0SnVzdGlmeSA/IHN0ciArIHBhZGRpbmcgOiBwYWRkaW5nICsgc3RyOwoKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIHRob3VzYW5kX3NlcGFyYXRlKHZhbHVlKSB7CiAgICAgICAgICAgIHZhciB2YWx1ZV9zdHIgPSBuZXcgU3RyaW5nKHZhbHVlKTsKICAgICAgICAgICAgZm9yICh2YXIgaT0xMDsgaT4wOyBpLS0pIHsKICAgICAgICAgICAgICAgIGlmICh2YWx1ZV9zdHIgPT0gKHZhbHVlX3N0ciA9IHZhbHVlX3N0ci5yZXBsYWNlKC9eKFxkKykoXGR7M30pLywgIiQxIiskLmpxcGxvdC5zcHJpbnRmLnRob3VzYW5kc1NlcGFyYXRvcisiJDIiKSkpIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB2YWx1ZV9zdHI7IAogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24ganVzdGlmeSh2YWx1ZSwgcHJlZml4LCBsZWZ0SnVzdGlmeSwgbWluV2lkdGgsIHplcm9QYWQsIGh0bWxTcGFjZSkgewogICAgICAgICAgICB2YXIgZGlmZiA9IG1pbldpZHRoIC0gdmFsdWUubGVuZ3RoOwogICAgICAgICAgICBpZiAoZGlmZiA+IDApIHsKICAgICAgICAgICAgICAgIHZhciBzcGNoYXIgPSAnICc7CiAgICAgICAgICAgICAgICBpZiAoaHRtbFNwYWNlKSB7IHNwY2hhciA9ICcmbmJzcDsnOyB9CiAgICAgICAgICAgICAgICBpZiAobGVmdEp1c3RpZnkgfHwgIXplcm9QYWQpIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHBhZCh2YWx1ZSwgbWluV2lkdGgsIHNwY2hhciwgbGVmdEp1c3RpZnkpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnNsaWNlKDAsIHByZWZpeC5sZW5ndGgpICsgcGFkKCcnLCBkaWZmLCAnMCcsIHRydWUpICsgdmFsdWUuc2xpY2UocHJlZml4Lmxlbmd0aCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gZm9ybWF0QmFzZVgodmFsdWUsIGJhc2UsIHByZWZpeCwgbGVmdEp1c3RpZnksIG1pbldpZHRoLCBwcmVjaXNpb24sIHplcm9QYWQsIGh0bWxTcGFjZSkgewogICAgICAgICAgICAvLyBOb3RlOiBjYXN0cyBuZWdhdGl2ZSBudW1iZXJzIHRvIHBvc2l0aXZlIG9uZXMKICAgICAgICAgICAgdmFyIG51bWJlciA9IHZhbHVlID4+PiAwOwogICAgICAgICAgICBwcmVmaXggPSBwcmVmaXggJiYgbnVtYmVyICYmIHsnMic6ICcwYicsICc4JzogJzAnLCAnMTYnOiAnMHgnfVtiYXNlXSB8fCAnJzsKICAgICAgICAgICAgdmFsdWUgPSBwcmVmaXggKyBwYWQobnVtYmVyLnRvU3RyaW5nKGJhc2UpLCBwcmVjaXNpb24gfHwgMCwgJzAnLCBmYWxzZSk7CiAgICAgICAgICAgIHJldHVybiBqdXN0aWZ5KHZhbHVlLCBwcmVmaXgsIGxlZnRKdXN0aWZ5LCBtaW5XaWR0aCwgemVyb1BhZCwgaHRtbFNwYWNlKTsKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIGZvcm1hdFN0cmluZyh2YWx1ZSwgbGVmdEp1c3RpZnksIG1pbldpZHRoLCBwcmVjaXNpb24sIHplcm9QYWQsIGh0bWxTcGFjZSkgewogICAgICAgICAgICBpZiAocHJlY2lzaW9uICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUuc2xpY2UoMCwgcHJlY2lzaW9uKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4ganVzdGlmeSh2YWx1ZSwgJycsIGxlZnRKdXN0aWZ5LCBtaW5XaWR0aCwgemVyb1BhZCwgaHRtbFNwYWNlKTsKICAgICAgICB9CgogICAgICAgIHZhciBhID0gYXJndW1lbnRzLCBpID0gMCwgZm9ybWF0ID0gYVtpKytdOwoKICAgICAgICByZXR1cm4gZm9ybWF0LnJlcGxhY2UoJC5qcXBsb3Quc3ByaW50Zi5yZWdleCwgZnVuY3Rpb24oc3Vic3RyaW5nLCB2YWx1ZUluZGV4LCBmbGFncywgbWluV2lkdGgsIF8sIHByZWNpc2lvbiwgdHlwZSkgewogICAgICAgICAgICBpZiAoc3Vic3RyaW5nID09ICclJScpIHsgcmV0dXJuICclJzsgfQoKICAgICAgICAgICAgLy8gcGFyc2UgZmxhZ3MKICAgICAgICAgICAgdmFyIGxlZnRKdXN0aWZ5ID0gZmFsc2UsIHBvc2l0aXZlUHJlZml4ID0gJycsIHplcm9QYWQgPSBmYWxzZSwgcHJlZml4QmFzZVggPSBmYWxzZSwgaHRtbFNwYWNlID0gZmFsc2UsIHRob3VzYW5kU2VwYXJhdGlvbiA9IGZhbHNlOwogICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgZmxhZ3MgJiYgaiA8IGZsYWdzLmxlbmd0aDsgaisrKSBzd2l0Y2ggKGZsYWdzLmNoYXJBdChqKSkgewogICAgICAgICAgICAgICAgY2FzZSAnICc6IHBvc2l0aXZlUHJlZml4ID0gJyAnOyBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJysnOiBwb3NpdGl2ZVByZWZpeCA9ICcrJzsgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICctJzogbGVmdEp1c3RpZnkgPSB0cnVlOyBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJzAnOiB6ZXJvUGFkID0gdHJ1ZTsgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICcjJzogcHJlZml4QmFzZVggPSB0cnVlOyBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJyYnOiBodG1sU3BhY2UgPSB0cnVlOyBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJ1wnJzogdGhvdXNhbmRTZXBhcmF0aW9uID0gdHJ1ZTsgYnJlYWs7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHBhcmFtZXRlcnMgbWF5IGJlIG51bGwsIHVuZGVmaW5lZCwgZW1wdHktc3RyaW5nIG9yIHJlYWwgdmFsdWVkCiAgICAgICAgICAgIC8vIHdlIHdhbnQgdG8gaWdub3JlIG51bGwsIHVuZGVmaW5lZCBhbmQgZW1wdHktc3RyaW5nIHZhbHVlcwoKICAgICAgICAgICAgaWYgKCFtaW5XaWR0aCkgewogICAgICAgICAgICAgICAgbWluV2lkdGggPSAwOwogICAgICAgICAgICB9IAogICAgICAgICAgICBlbHNlIGlmIChtaW5XaWR0aCA9PSAnKicpIHsKICAgICAgICAgICAgICAgIG1pbldpZHRoID0gK2FbaSsrXTsKICAgICAgICAgICAgfSAKICAgICAgICAgICAgZWxzZSBpZiAobWluV2lkdGguY2hhckF0KDApID09ICcqJykgewogICAgICAgICAgICAgICAgbWluV2lkdGggPSArYVttaW5XaWR0aC5zbGljZSgxLCAtMSldOwogICAgICAgICAgICB9IAogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIG1pbldpZHRoID0gK21pbldpZHRoOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBOb3RlOiB1bmRvY3VtZW50ZWQgcGVybCBmZWF0dXJlOgogICAgICAgICAgICBpZiAobWluV2lkdGggPCAwKSB7CiAgICAgICAgICAgICAgICBtaW5XaWR0aCA9IC1taW5XaWR0aDsKICAgICAgICAgICAgICAgIGxlZnRKdXN0aWZ5ID0gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFpc0Zpbml0ZShtaW5XaWR0aCkpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignJC5qcXBsb3Quc3ByaW50ZjogKG1pbmltdW0tKXdpZHRoIG11c3QgYmUgZmluaXRlJyk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghcHJlY2lzaW9uKSB7CiAgICAgICAgICAgICAgICBwcmVjaXNpb24gPSAnZkZlRScuaW5kZXhPZih0eXBlKSA+IC0xID8gNiA6ICh0eXBlID09ICdkJykgPyAwIDogdm9pZCgwKTsKICAgICAgICAgICAgfSAKICAgICAgICAgICAgZWxzZSBpZiAocHJlY2lzaW9uID09ICcqJykgewogICAgICAgICAgICAgICAgcHJlY2lzaW9uID0gK2FbaSsrXTsKICAgICAgICAgICAgfSAKICAgICAgICAgICAgZWxzZSBpZiAocHJlY2lzaW9uLmNoYXJBdCgwKSA9PSAnKicpIHsKICAgICAgICAgICAgICAgIHByZWNpc2lvbiA9ICthW3ByZWNpc2lvbi5zbGljZSgxLCAtMSldOwogICAgICAgICAgICB9IAogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHByZWNpc2lvbiA9ICtwcmVjaXNpb247CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGdyYWIgdmFsdWUgdXNpbmcgdmFsdWVJbmRleCBpZiByZXF1aXJlZD8KICAgICAgICAgICAgdmFyIHZhbHVlID0gdmFsdWVJbmRleCA/IGFbdmFsdWVJbmRleC5zbGljZSgwLCAtMSldIDogYVtpKytdOwoKICAgICAgICAgICAgc3dpdGNoICh0eXBlKSB7CiAgICAgICAgICAgIGNhc2UgJ3MnOiB7CiAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBmb3JtYXRTdHJpbmcoU3RyaW5nKHZhbHVlKSwgbGVmdEp1c3RpZnksIG1pbldpZHRoLCBwcmVjaXNpb24sIHplcm9QYWQsIGh0bWxTcGFjZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2FzZSAnYyc6IHJldHVybiBmb3JtYXRTdHJpbmcoU3RyaW5nLmZyb21DaGFyQ29kZSgrdmFsdWUpLCBsZWZ0SnVzdGlmeSwgbWluV2lkdGgsIHByZWNpc2lvbiwgemVyb1BhZCwgaHRtbFNwYWNlKTsKICAgICAgICAgICAgY2FzZSAnYic6IHJldHVybiBmb3JtYXRCYXNlWCh2YWx1ZSwgMiwgcHJlZml4QmFzZVgsIGxlZnRKdXN0aWZ5LCBtaW5XaWR0aCwgcHJlY2lzaW9uLCB6ZXJvUGFkLGh0bWxTcGFjZSk7CiAgICAgICAgICAgIGNhc2UgJ28nOiByZXR1cm4gZm9ybWF0QmFzZVgodmFsdWUsIDgsIHByZWZpeEJhc2VYLCBsZWZ0SnVzdGlmeSwgbWluV2lkdGgsIHByZWNpc2lvbiwgemVyb1BhZCwgaHRtbFNwYWNlKTsKICAgICAgICAgICAgY2FzZSAneCc6IHJldHVybiBmb3JtYXRCYXNlWCh2YWx1ZSwgMTYsIHByZWZpeEJhc2VYLCBsZWZ0SnVzdGlmeSwgbWluV2lkdGgsIHByZWNpc2lvbiwgemVyb1BhZCwgaHRtbFNwYWNlKTsKICAgICAgICAgICAgY2FzZSAnWCc6IHJldHVybiBmb3JtYXRCYXNlWCh2YWx1ZSwgMTYsIHByZWZpeEJhc2VYLCBsZWZ0SnVzdGlmeSwgbWluV2lkdGgsIHByZWNpc2lvbiwgemVyb1BhZCwgaHRtbFNwYWNlKS50b1VwcGVyQ2FzZSgpOwogICAgICAgICAgICBjYXNlICd1JzogcmV0dXJuIGZvcm1hdEJhc2VYKHZhbHVlLCAxMCwgcHJlZml4QmFzZVgsIGxlZnRKdXN0aWZ5LCBtaW5XaWR0aCwgcHJlY2lzaW9uLCB6ZXJvUGFkLCBodG1sU3BhY2UpOwogICAgICAgICAgICBjYXNlICdpJzogewogICAgICAgICAgICAgIHZhciBudW1iZXIgPSBwYXJzZUludCgrdmFsdWUsIDEwKTsKICAgICAgICAgICAgICBpZiAoaXNOYU4obnVtYmVyKSkgewogICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB2YXIgcHJlZml4ID0gbnVtYmVyIDwgMCA/ICctJyA6IHBvc2l0aXZlUHJlZml4OwogICAgICAgICAgICAgIHZhciBudW1iZXJfc3RyID0gdGhvdXNhbmRTZXBhcmF0aW9uID8gdGhvdXNhbmRfc2VwYXJhdGUoU3RyaW5nKE1hdGguYWJzKG51bWJlcikpKTogU3RyaW5nKE1hdGguYWJzKG51bWJlcikpOwogICAgICAgICAgICAgIHZhbHVlID0gcHJlZml4ICsgcGFkKG51bWJlcl9zdHIsIHByZWNpc2lvbiwgJzAnLCBmYWxzZSk7CiAgICAgICAgICAgICAgLy92YWx1ZSA9IHByZWZpeCArIHBhZChTdHJpbmcoTWF0aC5hYnMobnVtYmVyKSksIHByZWNpc2lvbiwgJzAnLCBmYWxzZSk7CiAgICAgICAgICAgICAgcmV0dXJuIGp1c3RpZnkodmFsdWUsIHByZWZpeCwgbGVmdEp1c3RpZnksIG1pbldpZHRoLCB6ZXJvUGFkLCBodG1sU3BhY2UpOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIGNhc2UgJ2QnOiB7CiAgICAgICAgICAgICAgdmFyIG51bWJlciA9IE1hdGgucm91bmQoK3ZhbHVlKTsKICAgICAgICAgICAgICBpZiAoaXNOYU4obnVtYmVyKSkgewogICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB2YXIgcHJlZml4ID0gbnVtYmVyIDwgMCA/ICctJyA6IHBvc2l0aXZlUHJlZml4OwogICAgICAgICAgICAgIHZhciBudW1iZXJfc3RyID0gdGhvdXNhbmRTZXBhcmF0aW9uID8gdGhvdXNhbmRfc2VwYXJhdGUoU3RyaW5nKE1hdGguYWJzKG51bWJlcikpKTogU3RyaW5nKE1hdGguYWJzKG51bWJlcikpOwogICAgICAgICAgICAgIHZhbHVlID0gcHJlZml4ICsgcGFkKG51bWJlcl9zdHIsIHByZWNpc2lvbiwgJzAnLCBmYWxzZSk7CiAgICAgICAgICAgICAgcmV0dXJuIGp1c3RpZnkodmFsdWUsIHByZWZpeCwgbGVmdEp1c3RpZnksIG1pbldpZHRoLCB6ZXJvUGFkLCBodG1sU3BhY2UpOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIGNhc2UgJ2UnOgogICAgICAgICAgICBjYXNlICdFJzoKICAgICAgICAgICAgY2FzZSAnZic6CiAgICAgICAgICAgIGNhc2UgJ0YnOgogICAgICAgICAgICBjYXNlICdnJzoKICAgICAgICAgICAgY2FzZSAnRyc6CiAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICB2YXIgbnVtYmVyID0gK3ZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgaWYgKGlzTmFOKG51bWJlcikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICB2YXIgcHJlZml4ID0gbnVtYmVyIDwgMCA/ICctJyA6IHBvc2l0aXZlUHJlZml4OwogICAgICAgICAgICAgICAgICAgICAgdmFyIG1ldGhvZCA9IFsndG9FeHBvbmVudGlhbCcsICd0b0ZpeGVkJywgJ3RvUHJlY2lzaW9uJ11bJ2VmZycuaW5kZXhPZih0eXBlLnRvTG93ZXJDYXNlKCkpXTsKICAgICAgICAgICAgICAgICAgICAgIHZhciB0ZXh0VHJhbnNmb3JtID0gWyd0b1N0cmluZycsICd0b1VwcGVyQ2FzZSddWydlRWZGZ0cnLmluZGV4T2YodHlwZSkgJSAyXTsKICAgICAgICAgICAgICAgICAgICAgIHZhciBudW1iZXJfc3RyID0gTWF0aC5hYnMobnVtYmVyKVttZXRob2RdKHByZWNpc2lvbik7CiAgICAgICAgICAgICAgICAgICAgICBudW1iZXJfc3RyID0gdGhvdXNhbmRTZXBhcmF0aW9uID8gdGhvdXNhbmRfc2VwYXJhdGUobnVtYmVyX3N0cik6IG51bWJlcl9zdHI7CiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHByZWZpeCArIG51bWJlcl9zdHI7CiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ganVzdGlmeSh2YWx1ZSwgcHJlZml4LCBsZWZ0SnVzdGlmeSwgbWluV2lkdGgsIHplcm9QYWQsIGh0bWxTcGFjZSlbdGV4dFRyYW5zZm9ybV0oKTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICBjYXNlICdwJzoKICAgICAgICAgICAgY2FzZSAnUCc6CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSBudW1iZXIgaXMgYSBudW1iZXIKICAgICAgICAgICAgICAgIHZhciBudW1iZXIgPSArdmFsdWU7CiAgICAgICAgICAgICAgICBpZiAoaXNOYU4obnVtYmVyKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBwcmVmaXggPSBudW1iZXIgPCAwID8gJy0nIDogcG9zaXRpdmVQcmVmaXg7CgogICAgICAgICAgICAgICAgdmFyIHBhcnRzID0gU3RyaW5nKE51bWJlcihNYXRoLmFicyhudW1iZXIpKS50b0V4cG9uZW50aWFsKCkpLnNwbGl0KC9lfEUvKTsKICAgICAgICAgICAgICAgIHZhciBzZCA9IChwYXJ0c1swXS5pbmRleE9mKCcuJykgIT0gLTEpID8gcGFydHNbMF0ubGVuZ3RoIC0gMSA6IHBhcnRzWzBdLmxlbmd0aDsKICAgICAgICAgICAgICAgIHZhciB6ZXJvcyA9IChwYXJ0c1sxXSA8IDApID8gLXBhcnRzWzFdIC0gMSA6IDA7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGlmIChNYXRoLmFicyhudW1iZXIpIDwgMSkgewogICAgICAgICAgICAgICAgICAgIGlmIChzZCArIHplcm9zICA8PSBwcmVjaXNpb24pIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBwcmVmaXggKyBNYXRoLmFicyhudW1iZXIpLnRvUHJlY2lzaW9uKHNkKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZCAgPD0gcHJlY2lzaW9uIC0gMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBwcmVmaXggKyBNYXRoLmFicyhudW1iZXIpLnRvRXhwb25lbnRpYWwoc2QtMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHByZWZpeCArIE1hdGguYWJzKG51bWJlcikudG9FeHBvbmVudGlhbChwcmVjaXNpb24tMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcHJlYyA9IChzZCA8PSBwcmVjaXNpb24pID8gc2QgOiBwcmVjaXNpb247CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBwcmVmaXggKyBNYXRoLmFicyhudW1iZXIpLnRvUHJlY2lzaW9uKHByZWMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIHRleHRUcmFuc2Zvcm0gPSBbJ3RvU3RyaW5nJywgJ3RvVXBwZXJDYXNlJ11bJ3BQJy5pbmRleE9mKHR5cGUpICUgMl07CiAgICAgICAgICAgICAgICByZXR1cm4ganVzdGlmeSh2YWx1ZSwgcHJlZml4LCBsZWZ0SnVzdGlmeSwgbWluV2lkdGgsIHplcm9QYWQsIGh0bWxTcGFjZSlbdGV4dFRyYW5zZm9ybV0oKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjYXNlICduJzogcmV0dXJuICcnOwogICAgICAgICAgICBkZWZhdWx0OiByZXR1cm4gc3Vic3RyaW5nOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICB9OwoKICAgICQuanFwbG90LnNwcmludGYudGhvdXNhbmRzU2VwYXJhdG9yID0gJywnOwogICAgCiAgICAkLmpxcGxvdC5zcHJpbnRmLnJlZ2V4ID0gLyUlfCUoXGQrXCQpPyhbLSsjMCZcJyBdKikoXCpcZCtcJHxcKnxcZCspPyhcLihcKlxkK1wkfFwqfFxkKykpPyhbbkFzY2JveFh1aWRmZWdwRUdQXSkvZzsKCiAgICAkLmpxcGxvdC5nZXRTaWduaWZpY2FudEZpZ3VyZXMgPSBmdW5jdGlvbihudW1iZXIpIHsKICAgICAgICB2YXIgcGFydHMgPSBTdHJpbmcoTnVtYmVyKE1hdGguYWJzKG51bWJlcikpLnRvRXhwb25lbnRpYWwoKSkuc3BsaXQoL2V8RS8pOwogICAgICAgIC8vIHRvdGFsIHNpZ25pZmljYW50IGRpZ2l0cwogICAgICAgIHZhciBzZCA9IChwYXJ0c1swXS5pbmRleE9mKCcuJykgIT0gLTEpID8gcGFydHNbMF0ubGVuZ3RoIC0gMSA6IHBhcnRzWzBdLmxlbmd0aDsKICAgICAgICB2YXIgemVyb3MgPSAocGFydHNbMV0gPCAwKSA/IC1wYXJ0c1sxXSAtIDEgOiAwOwogICAgICAgIC8vIGV4cG9uZW50CiAgICAgICAgdmFyIGV4cG4gPSBwYXJzZUludChwYXJ0c1sxXSwgMTApOwogICAgICAgIC8vIGRpZ2l0cyB0byB0aGUgbGVmdCBvZiB0aGUgZGVjaW1hbCBwbGFjZQogICAgICAgIHZhciBkbGVmdCA9IChleHBuICsgMSA+IDApID8gZXhwbiArIDEgOiAwOwogICAgICAgIC8vIGRpZ2l0cyB0byB0aGUgcmlnaHQgb2YgdGhlIGRlY2ltYWwgcGxhY2UKICAgICAgICB2YXIgZHJpZ2h0ID0gKHNkIDw9IGRsZWZ0KSA/IDAgOiBzZCAtIGV4cG4gLSAxOwogICAgICAgIHJldHVybiB7c2lnbmlmaWNhbnREaWdpdHM6IHNkLCBkaWdpdHNMZWZ0OiBkbGVmdCwgZGlnaXRzUmlnaHQ6IGRyaWdodCwgemVyb3M6IHplcm9zLCBleHBvbmVudDogZXhwbn0gOwogICAgfTsKCiAgICAkLmpxcGxvdC5nZXRQcmVjaXNpb24gPSBmdW5jdGlvbihudW1iZXIpIHsKICAgICAgICByZXR1cm4gJC5qcXBsb3QuZ2V0U2lnbmlmaWNhbnRGaWd1cmVzKG51bWJlcikuZGlnaXRzUmlnaHQ7CiAgICB9OwoKfSkoalF1ZXJ5KTsgIAoKCiAgICB2YXIgYmFja0NvbXBhdCA9ICQudWlCYWNrQ29tcGF0ICE9PSBmYWxzZTsKCiAgICAkLmpxcGxvdC5lZmZlY3RzID0gewogICAgICAgIGVmZmVjdDoge30KICAgIH07CgogICAgLy8gcHJlZml4IHVzZWQgZm9yIHN0b3JpbmcgZGF0YSBvbiAuZGF0YSgpCiAgICB2YXIgZGF0YVNwYWNlID0gImpxcGxvdC5zdG9yYWdlLiI7CgogICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBFRkZFQ1RTICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKICAgICQuZXh0ZW5kKCAkLmpxcGxvdC5lZmZlY3RzLCB7CiAgICAgICAgdmVyc2lvbjogIjEuOXByZSIsCgogICAgICAgIC8vIFNhdmVzIGEgc2V0IG9mIHByb3BlcnRpZXMgaW4gYSBkYXRhIHN0b3JhZ2UKICAgICAgICBzYXZlOiBmdW5jdGlvbiggZWxlbWVudCwgc2V0ICkgewogICAgICAgICAgICBmb3IoIHZhciBpPTA7IGkgPCBzZXQubGVuZ3RoOyBpKysgKSB7CiAgICAgICAgICAgICAgICBpZiAoIHNldFsgaSBdICE9PSBudWxsICkgewogICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuZGF0YSggZGF0YVNwYWNlICsgc2V0WyBpIF0sIGVsZW1lbnRbIDAgXS5zdHlsZVsgc2V0WyBpIF0gXSApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLy8gUmVzdG9yZXMgYSBzZXQgb2YgcHJldmlvdXNseSBzYXZlZCBwcm9wZXJ0aWVzIGZyb20gYSBkYXRhIHN0b3JhZ2UKICAgICAgICByZXN0b3JlOiBmdW5jdGlvbiggZWxlbWVudCwgc2V0ICkgewogICAgICAgICAgICBmb3IoIHZhciBpPTA7IGkgPCBzZXQubGVuZ3RoOyBpKysgKSB7CiAgICAgICAgICAgICAgICBpZiAoIHNldFsgaSBdICE9PSBudWxsICkgewogICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuY3NzKCBzZXRbIGkgXSwgZWxlbWVudC5kYXRhKCBkYXRhU3BhY2UgKyBzZXRbIGkgXSApICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBzZXRNb2RlOiBmdW5jdGlvbiggZWwsIG1vZGUgKSB7CiAgICAgICAgICAgIGlmIChtb2RlID09PSAidG9nZ2xlIikgewogICAgICAgICAgICAgICAgbW9kZSA9IGVsLmlzKCAiOmhpZGRlbiIgKSA/ICJzaG93IiA6ICJoaWRlIjsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gbW9kZTsKICAgICAgICB9LAoKICAgICAgICAvLyBXcmFwcyB0aGUgZWxlbWVudCBhcm91bmQgYSB3cmFwcGVyIHRoYXQgY29waWVzIHBvc2l0aW9uIHByb3BlcnRpZXMKICAgICAgICBjcmVhdGVXcmFwcGVyOiBmdW5jdGlvbiggZWxlbWVudCApIHsKCiAgICAgICAgICAgIC8vIGlmIHRoZSBlbGVtZW50IGlzIGFscmVhZHkgd3JhcHBlZCwgcmV0dXJuIGl0CiAgICAgICAgICAgIGlmICggZWxlbWVudC5wYXJlbnQoKS5pcyggIi51aS1lZmZlY3RzLXdyYXBwZXIiICkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBlbGVtZW50LnBhcmVudCgpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyB3cmFwIHRoZSBlbGVtZW50CiAgICAgICAgICAgIHZhciBwcm9wcyA9IHsKICAgICAgICAgICAgICAgICAgICB3aWR0aDogZWxlbWVudC5vdXRlcldpZHRoKHRydWUpLAogICAgICAgICAgICAgICAgICAgIGhlaWdodDogZWxlbWVudC5vdXRlckhlaWdodCh0cnVlKSwKICAgICAgICAgICAgICAgICAgICAiZmxvYXQiOiBlbGVtZW50LmNzcyggImZsb2F0IiApCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgd3JhcHBlciA9ICQoICI8ZGl2PjwvZGl2PiIgKQogICAgICAgICAgICAgICAgICAgIC5hZGRDbGFzcyggInVpLWVmZmVjdHMtd3JhcHBlciIgKQogICAgICAgICAgICAgICAgICAgIC5jc3MoewogICAgICAgICAgICAgICAgICAgICAgICBmb250U2l6ZTogIjEwMCUiLAogICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiAidHJhbnNwYXJlbnQiLAogICAgICAgICAgICAgICAgICAgICAgICBib3JkZXI6ICJub25lIiwKICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luOiAwLAogICAgICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOiAwCiAgICAgICAgICAgICAgICAgICAgfSksCiAgICAgICAgICAgICAgICAvLyBTdG9yZSB0aGUgc2l6ZSBpbiBjYXNlIHdpZHRoL2hlaWdodCBhcmUgZGVmaW5lZCBpbiAlIC0gRml4ZXMgIzUyNDUKICAgICAgICAgICAgICAgIHNpemUgPSB7CiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IGVsZW1lbnQud2lkdGgoKSwKICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IGVsZW1lbnQuaGVpZ2h0KCkKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBhY3RpdmUgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50OwoKICAgICAgICAgICAgZWxlbWVudC53cmFwKCB3cmFwcGVyICk7CgogICAgICAgICAgICAvLyBGaXhlcyAjNzU5NSAtIEVsZW1lbnRzIGxvc2UgZm9jdXMgd2hlbiB3cmFwcGVkLgogICAgICAgICAgICBpZiAoIGVsZW1lbnRbIDAgXSA9PT0gYWN0aXZlIHx8ICQuY29udGFpbnMoIGVsZW1lbnRbIDAgXSwgYWN0aXZlICkgKSB7CiAgICAgICAgICAgICAgICAkKCBhY3RpdmUgKS5mb2N1cygpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB3cmFwcGVyID0gZWxlbWVudC5wYXJlbnQoKTsgLy9Ib3RmaXggZm9yIGpRdWVyeSAxLjQgc2luY2Ugc29tZSBjaGFuZ2UgaW4gd3JhcCgpIHNlZW1zIHRvIGFjdHVhbGx5IGxvb3NlIHRoZSByZWZlcmVuY2UgdG8gdGhlIHdyYXBwZWQgZWxlbWVudAoKICAgICAgICAgICAgLy8gdHJhbnNmZXIgcG9zaXRpb25pbmcgcHJvcGVydGllcyB0byB0aGUgd3JhcHBlcgogICAgICAgICAgICBpZiAoIGVsZW1lbnQuY3NzKCAicG9zaXRpb24iICkgPT09ICJzdGF0aWMiICkgewogICAgICAgICAgICAgICAgd3JhcHBlci5jc3MoeyBwb3NpdGlvbjogInJlbGF0aXZlIiB9KTsKICAgICAgICAgICAgICAgIGVsZW1lbnQuY3NzKHsgcG9zaXRpb246ICJyZWxhdGl2ZSIgfSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkLmV4dGVuZCggcHJvcHMsIHsKICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogZWxlbWVudC5jc3MoICJwb3NpdGlvbiIgKSwKICAgICAgICAgICAgICAgICAgICB6SW5kZXg6IGVsZW1lbnQuY3NzKCAiei1pbmRleCIgKQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAkLmVhY2goWyAidG9wIiwgImxlZnQiLCAiYm90dG9tIiwgInJpZ2h0IiBdLCBmdW5jdGlvbihpLCBwb3MpIHsKICAgICAgICAgICAgICAgICAgICBwcm9wc1sgcG9zIF0gPSBlbGVtZW50LmNzcyggcG9zICk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCBpc05hTiggcGFyc2VJbnQoIHByb3BzWyBwb3MgXSwgMTAgKSApICkgewogICAgICAgICAgICAgICAgICAgICAgICBwcm9wc1sgcG9zIF0gPSAiYXV0byI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBlbGVtZW50LmNzcyh7CiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246ICJyZWxhdGl2ZSIsCiAgICAgICAgICAgICAgICAgICAgdG9wOiAwLAogICAgICAgICAgICAgICAgICAgIGxlZnQ6IDAsCiAgICAgICAgICAgICAgICAgICAgcmlnaHQ6ICJhdXRvIiwKICAgICAgICAgICAgICAgICAgICBib3R0b206ICJhdXRvIgogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxlbWVudC5jc3Moc2l6ZSk7CgogICAgICAgICAgICByZXR1cm4gd3JhcHBlci5jc3MoIHByb3BzICkuc2hvdygpOwogICAgICAgIH0sCgogICAgICAgIHJlbW92ZVdyYXBwZXI6IGZ1bmN0aW9uKCBlbGVtZW50ICkgewogICAgICAgICAgICB2YXIgYWN0aXZlID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDsKCiAgICAgICAgICAgIGlmICggZWxlbWVudC5wYXJlbnQoKS5pcyggIi51aS1lZmZlY3RzLXdyYXBwZXIiICkgKSB7CiAgICAgICAgICAgICAgICBlbGVtZW50LnBhcmVudCgpLnJlcGxhY2VXaXRoKCBlbGVtZW50ICk7CgogICAgICAgICAgICAgICAgLy8gRml4ZXMgIzc1OTUgLSBFbGVtZW50cyBsb3NlIGZvY3VzIHdoZW4gd3JhcHBlZC4KICAgICAgICAgICAgICAgIGlmICggZWxlbWVudFsgMCBdID09PSBhY3RpdmUgfHwgJC5jb250YWlucyggZWxlbWVudFsgMCBdLCBhY3RpdmUgKSApIHsKICAgICAgICAgICAgICAgICAgICAkKCBhY3RpdmUgKS5mb2N1cygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgoKICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQ7CiAgICAgICAgfQogICAgfSk7CgogICAgLy8gcmV0dXJuIGFuIGVmZmVjdCBvcHRpb25zIG9iamVjdCBmb3IgdGhlIGdpdmVuIHBhcmFtZXRlcnM6CiAgICBmdW5jdGlvbiBfbm9ybWFsaXplQXJndW1lbnRzKCBlZmZlY3QsIG9wdGlvbnMsIHNwZWVkLCBjYWxsYmFjayApIHsKCiAgICAgICAgLy8gc2hvcnQgcGF0aCBmb3IgcGFzc2luZyBhbiBlZmZlY3Qgb3B0aW9ucyBvYmplY3Q6CiAgICAgICAgaWYgKCAkLmlzUGxhaW5PYmplY3QoIGVmZmVjdCApICkgewogICAgICAgICAgICByZXR1cm4gZWZmZWN0OwogICAgICAgIH0KCiAgICAgICAgLy8gY29udmVydCB0byBhbiBvYmplY3QKICAgICAgICBlZmZlY3QgPSB7IGVmZmVjdDogZWZmZWN0IH07CgogICAgICAgIC8vIGNhdGNoIChlZmZlY3QpCiAgICAgICAgaWYgKCBvcHRpb25zID09PSB1bmRlZmluZWQgKSB7CiAgICAgICAgICAgIG9wdGlvbnMgPSB7fTsKICAgICAgICB9CgogICAgICAgIC8vIGNhdGNoIChlZmZlY3QsIGNhbGxiYWNrKQogICAgICAgIGlmICggJC5pc0Z1bmN0aW9uKCBvcHRpb25zICkgKSB7CiAgICAgICAgICAgIGNhbGxiYWNrID0gb3B0aW9uczsKICAgICAgICAgICAgc3BlZWQgPSBudWxsOwogICAgICAgICAgICBvcHRpb25zID0ge307CiAgICAgICAgfQoKICAgICAgICAvLyBjYXRjaCAoZWZmZWN0LCBzcGVlZCwgPykKICAgICAgICBpZiAoICQudHlwZSggb3B0aW9ucyApID09PSAibnVtYmVyIiB8fCAkLmZ4LnNwZWVkc1sgb3B0aW9ucyBdKSB7CiAgICAgICAgICAgIGNhbGxiYWNrID0gc3BlZWQ7CiAgICAgICAgICAgIHNwZWVkID0gb3B0aW9uczsKICAgICAgICAgICAgb3B0aW9ucyA9IHt9OwogICAgICAgIH0KCiAgICAgICAgLy8gY2F0Y2ggKGVmZmVjdCwgb3B0aW9ucywgY2FsbGJhY2spCiAgICAgICAgaWYgKCAkLmlzRnVuY3Rpb24oIHNwZWVkICkgKSB7CiAgICAgICAgICAgIGNhbGxiYWNrID0gc3BlZWQ7CiAgICAgICAgICAgIHNwZWVkID0gbnVsbDsKICAgICAgICB9CgogICAgICAgIC8vIGFkZCBvcHRpb25zIHRvIGVmZmVjdAogICAgICAgIGlmICggb3B0aW9ucyApIHsKICAgICAgICAgICAgJC5leHRlbmQoIGVmZmVjdCwgb3B0aW9ucyApOwogICAgICAgIH0KCiAgICAgICAgc3BlZWQgPSBzcGVlZCB8fCBvcHRpb25zLmR1cmF0aW9uOwogICAgICAgIGVmZmVjdC5kdXJhdGlvbiA9ICQuZngub2ZmID8gMCA6IHR5cGVvZiBzcGVlZCA9PT0gIm51bWJlciIKICAgICAgICAgICAgPyBzcGVlZCA6IHNwZWVkIGluICQuZnguc3BlZWRzID8gJC5meC5zcGVlZHNbIHNwZWVkIF0gOiAkLmZ4LnNwZWVkcy5fZGVmYXVsdDsKCiAgICAgICAgZWZmZWN0LmNvbXBsZXRlID0gY2FsbGJhY2sgfHwgb3B0aW9ucy5jb21wbGV0ZTsKCiAgICAgICAgcmV0dXJuIGVmZmVjdDsKICAgIH0KCiAgICBmdW5jdGlvbiBzdGFuZGFyZFNwZWVkKCBzcGVlZCApIHsKICAgICAgICAvLyB2YWxpZCBzdGFuZGFyZCBzcGVlZHMKICAgICAgICBpZiAoICFzcGVlZCB8fCB0eXBlb2Ygc3BlZWQgPT09ICJudW1iZXIiIHx8ICQuZnguc3BlZWRzWyBzcGVlZCBdICkgewogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CgogICAgICAgIC8vIGludmFsaWQgc3RyaW5ncyAtIHRyZWF0IGFzICJub3JtYWwiIHNwZWVkCiAgICAgICAgaWYgKCB0eXBlb2Ygc3BlZWQgPT09ICJzdHJpbmciICYmICEkLmpxcGxvdC5lZmZlY3RzLmVmZmVjdFsgc3BlZWQgXSApIHsKICAgICAgICAgICAgLy8gVE9ETzogcmVtb3ZlIGluIDIuMCAoIzcxMTUpCiAgICAgICAgICAgIGlmICggYmFja0NvbXBhdCAmJiAkLmpxcGxvdC5lZmZlY3RzWyBzcGVlZCBdICkgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgICQuZm4uZXh0ZW5kKHsKICAgICAgICBqcXBsb3RFZmZlY3Q6IGZ1bmN0aW9uKCBlZmZlY3QsIG9wdGlvbnMsIHNwZWVkLCBjYWxsYmFjayApIHsKICAgICAgICAgICAgdmFyIGFyZ3MgPSBfbm9ybWFsaXplQXJndW1lbnRzLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKSwKICAgICAgICAgICAgICAgIG1vZGUgPSBhcmdzLm1vZGUsCiAgICAgICAgICAgICAgICBxdWV1ZSA9IGFyZ3MucXVldWUsCiAgICAgICAgICAgICAgICBlZmZlY3RNZXRob2QgPSAkLmpxcGxvdC5lZmZlY3RzLmVmZmVjdFsgYXJncy5lZmZlY3QgXSwKCiAgICAgICAgICAgICAgICAvLyBERVBSRUNBVEVEOiByZW1vdmUgaW4gMi4wICgjNzExNSkKICAgICAgICAgICAgICAgIG9sZEVmZmVjdE1ldGhvZCA9ICFlZmZlY3RNZXRob2QgJiYgYmFja0NvbXBhdCAmJiAkLmpxcGxvdC5lZmZlY3RzWyBhcmdzLmVmZmVjdCBdOwoKICAgICAgICAgICAgaWYgKCAkLmZ4Lm9mZiB8fCAhKCBlZmZlY3RNZXRob2QgfHwgb2xkRWZmZWN0TWV0aG9kICkgKSB7CiAgICAgICAgICAgICAgICAvLyBkZWxlZ2F0ZSB0byB0aGUgb3JpZ2luYWwgbWV0aG9kIChlLmcuLCAuc2hvdygpKSBpZiBwb3NzaWJsZQogICAgICAgICAgICAgICAgaWYgKCBtb2RlICkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzWyBtb2RlIF0oIGFyZ3MuZHVyYXRpb24sIGFyZ3MuY29tcGxldGUgKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggYXJncy5jb21wbGV0ZSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MuY29tcGxldGUuY2FsbCggdGhpcyApOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGZ1bmN0aW9uIHJ1biggbmV4dCApIHsKICAgICAgICAgICAgICAgIHZhciBlbGVtID0gJCggdGhpcyApLAogICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlID0gYXJncy5jb21wbGV0ZSwKICAgICAgICAgICAgICAgICAgICBtb2RlID0gYXJncy5tb2RlOwoKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGRvbmUoKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAkLmlzRnVuY3Rpb24oIGNvbXBsZXRlICkgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlLmNhbGwoIGVsZW1bMF0gKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCAkLmlzRnVuY3Rpb24oIG5leHQgKSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBpZiB0aGUgZWxlbWVudCBpcyBoaWRkZGVuIGFuZCBtb2RlIGlzIGhpZGUsCiAgICAgICAgICAgICAgICAvLyBvciBlbGVtZW50IGlzIHZpc2libGUgYW5kIG1vZGUgaXMgc2hvdwogICAgICAgICAgICAgICAgaWYgKCBlbGVtLmlzKCAiOmhpZGRlbiIgKSA/IG1vZGUgPT09ICJoaWRlIiA6IG1vZGUgPT09ICJzaG93IiApIHsKICAgICAgICAgICAgICAgICAgICBkb25lKCk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGVmZmVjdE1ldGhvZC5jYWxsKCBlbGVtWzBdLCBhcmdzLCBkb25lICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIFRPRE86IHJlbW92ZSB0aGlzIGNoZWNrIGluIDIuMCwgZWZmZWN0TWV0aG9kIHdpbGwgYWx3YXlzIGJlIHRydWUKICAgICAgICAgICAgaWYgKCBlZmZlY3RNZXRob2QgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gcXVldWUgPT09IGZhbHNlID8gdGhpcy5lYWNoKCBydW4gKSA6IHRoaXMucXVldWUoIHF1ZXVlIHx8ICJmeCIsIHJ1biApOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgLy8gREVQUkVDQVRFRDogcmVtb3ZlIGluIDIuMCAoIzcxMTUpCiAgICAgICAgICAgICAgICByZXR1cm4gb2xkRWZmZWN0TWV0aG9kLmNhbGwodGhpcywgewogICAgICAgICAgICAgICAgICAgIG9wdGlvbnM6IGFyZ3MsCiAgICAgICAgICAgICAgICAgICAgZHVyYXRpb246IGFyZ3MuZHVyYXRpb24sCiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2s6IGFyZ3MuY29tcGxldGUsCiAgICAgICAgICAgICAgICAgICAgbW9kZTogYXJncy5tb2RlCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0pOwoKCgoKICAgIHZhciBydmVydGljYWwgPSAvdXB8ZG93bnx2ZXJ0aWNhbC8sCiAgICAgICAgcnBvc2l0aXZlbW90aW9uID0gL3VwfGxlZnR8dmVydGljYWx8aG9yaXpvbnRhbC87CgogICAgJC5qcXBsb3QuZWZmZWN0cy5lZmZlY3QuYmxpbmQgPSBmdW5jdGlvbiggbywgZG9uZSApIHsKICAgICAgICAvLyBDcmVhdGUgZWxlbWVudAogICAgICAgIHZhciBlbCA9ICQoIHRoaXMgKSwKICAgICAgICAgICAgcHJvcHMgPSBbICJwb3NpdGlvbiIsICJ0b3AiLCAiYm90dG9tIiwgImxlZnQiLCAicmlnaHQiLCAiaGVpZ2h0IiwgIndpZHRoIiBdLAogICAgICAgICAgICBtb2RlID0gJC5qcXBsb3QuZWZmZWN0cy5zZXRNb2RlKCBlbCwgby5tb2RlIHx8ICJoaWRlIiApLAogICAgICAgICAgICBkaXJlY3Rpb24gPSBvLmRpcmVjdGlvbiB8fCAidXAiLAogICAgICAgICAgICB2ZXJ0aWNhbCA9IHJ2ZXJ0aWNhbC50ZXN0KCBkaXJlY3Rpb24gKSwKICAgICAgICAgICAgcmVmID0gdmVydGljYWwgPyAiaGVpZ2h0IiA6ICJ3aWR0aCIsCiAgICAgICAgICAgIHJlZjIgPSB2ZXJ0aWNhbCA/ICJ0b3AiIDogImxlZnQiLAogICAgICAgICAgICBtb3Rpb24gPSBycG9zaXRpdmVtb3Rpb24udGVzdCggZGlyZWN0aW9uICksCiAgICAgICAgICAgIGFuaW1hdGlvbiA9IHt9LAogICAgICAgICAgICBzaG93ID0gbW9kZSA9PT0gInNob3ciLAogICAgICAgICAgICB3cmFwcGVyLCBkaXN0YW5jZSwgdG9wOwoKICAgICAgICAvLyAvLyBpZiBhbHJlYWR5IHdyYXBwZWQsIHRoZSB3cmFwcGVyJ3MgcHJvcGVydGllcyBhcmUgbXkgcHJvcGVydHkuICM2MjQ1CiAgICAgICAgaWYgKCBlbC5wYXJlbnQoKS5pcyggIi51aS1lZmZlY3RzLXdyYXBwZXIiICkgKSB7CiAgICAgICAgICAgICQuanFwbG90LmVmZmVjdHMuc2F2ZSggZWwucGFyZW50KCksIHByb3BzICk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJC5qcXBsb3QuZWZmZWN0cy5zYXZlKCBlbCwgcHJvcHMgKTsKICAgICAgICB9CiAgICAgICAgZWwuc2hvdygpOwogICAgICAgIHRvcCA9IHBhcnNlSW50KGVsLmNzcygndG9wJyksIDEwKTsKICAgICAgICB3cmFwcGVyID0gJC5qcXBsb3QuZWZmZWN0cy5jcmVhdGVXcmFwcGVyKCBlbCApLmNzcyh7CiAgICAgICAgICAgIG92ZXJmbG93OiAiaGlkZGVuIgogICAgICAgIH0pOwoKICAgICAgICBkaXN0YW5jZSA9IHZlcnRpY2FsID8gd3JhcHBlclsgcmVmIF0oKSArIHRvcCA6IHdyYXBwZXJbIHJlZiBdKCk7CgogICAgICAgIGFuaW1hdGlvblsgcmVmIF0gPSBzaG93ID8gU3RyaW5nKGRpc3RhbmNlKSA6ICcwJzsKICAgICAgICBpZiAoICFtb3Rpb24gKSB7CiAgICAgICAgICAgIGVsCiAgICAgICAgICAgICAgICAuY3NzKCB2ZXJ0aWNhbCA/ICJib3R0b20iIDogInJpZ2h0IiwgMCApCiAgICAgICAgICAgICAgICAuY3NzKCB2ZXJ0aWNhbCA/ICJ0b3AiIDogImxlZnQiLCAiIiApCiAgICAgICAgICAgICAgICAuY3NzKHsgcG9zaXRpb246ICJhYnNvbHV0ZSIgfSk7CiAgICAgICAgICAgIGFuaW1hdGlvblsgcmVmMiBdID0gc2hvdyA/ICcwJyA6IFN0cmluZyhkaXN0YW5jZSk7CiAgICAgICAgfQoKICAgICAgICAvLyAvLyBzdGFydCBhdCAwIGlmIHdlIGFyZSBzaG93aW5nCiAgICAgICAgaWYgKCBzaG93ICkgewogICAgICAgICAgICB3cmFwcGVyLmNzcyggcmVmLCAwICk7CiAgICAgICAgICAgIGlmICggISBtb3Rpb24gKSB7CiAgICAgICAgICAgICAgICB3cmFwcGVyLmNzcyggcmVmMiwgZGlzdGFuY2UgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gLy8gQW5pbWF0ZQogICAgICAgIHdyYXBwZXIuYW5pbWF0ZSggYW5pbWF0aW9uLCB7CiAgICAgICAgICAgIGR1cmF0aW9uOiBvLmR1cmF0aW9uLAogICAgICAgICAgICBlYXNpbmc6IG8uZWFzaW5nLAogICAgICAgICAgICBxdWV1ZTogZmFsc2UsCiAgICAgICAgICAgIGNvbXBsZXRlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIGlmICggbW9kZSA9PT0gImhpZGUiICkgewogICAgICAgICAgICAgICAgICAgIGVsLmhpZGUoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICQuanFwbG90LmVmZmVjdHMucmVzdG9yZSggZWwsIHByb3BzICk7CiAgICAgICAgICAgICAgICAkLmpxcGxvdC5lZmZlY3RzLnJlbW92ZVdyYXBwZXIoIGVsICk7CiAgICAgICAgICAgICAgICBkb25lKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKCiAgICB9OwoKCg==]]></data>
	</file>
	<file>
	  <filename>/src/jquery.jqplot.min.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqCiAqIGpxUGxvdAogKiBQdXJlIEphdmFTY3JpcHQgcGxvdHRpbmcgcGx1Z2luIHVzaW5nIGpRdWVyeQogKgogKiBWZXJzaW9uOiAxLjAuMGIyX3IxMDEyCiAqCiAqIENvcHlyaWdodCAoYykgMjAwOS0yMDExIENocmlzIExlb25lbGxvCiAqIGpxUGxvdCBpcyBjdXJyZW50bHkgYXZhaWxhYmxlIGZvciB1c2UgaW4gYWxsIHBlcnNvbmFsIG9yIGNvbW1lcmNpYWwgcHJvamVjdHMgCiAqIHVuZGVyIGJvdGggdGhlIE1JVCAoaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHApIGFuZCBHUEwgCiAqIHZlcnNpb24gMi4wIChodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC5odG1sKSBsaWNlbnNlcy4gVGhpcyBtZWFucyB0aGF0IHlvdSBjYW4gCiAqIGNob29zZSB0aGUgbGljZW5zZSB0aGF0IGJlc3Qgc3VpdHMgeW91ciBwcm9qZWN0IGFuZCB1c2UgaXQgYWNjb3JkaW5nbHkuIAogKgogKiBBbHRob3VnaCBub3QgcmVxdWlyZWQsIHRoZSBhdXRob3Igd291bGQgYXBwcmVjaWF0ZSBhbiBlbWFpbCBsZXR0aW5nIGhpbSAKICoga25vdyBvZiBhbnkgc3Vic3RhbnRpYWwgdXNlIG9mIGpxUGxvdC4gIFlvdSBjYW4gcmVhY2ggdGhlIGF1dGhvciBhdDogCiAqIGNocmlzIGF0IGpxcGxvdCBkb3QgY29tIG9yIHNlZSBodHRwOi8vd3d3LmpxcGxvdC5jb20vaW5mby5waHAgLgogKgogKiBJZiB5b3UgYXJlIGZlZWxpbmcga2luZCBhbmQgZ2VuZXJvdXMsIGNvbnNpZGVyIHN1cHBvcnRpbmcgdGhlIHByb2plY3QgYnkKICogbWFraW5nIGEgZG9uYXRpb24gYXQ6IGh0dHA6Ly93d3cuanFwbG90LmNvbS9kb25hdGUucGhwIC4KICoKICogc3ByaW50ZiBmdW5jdGlvbnMgY29udGFpbmVkIGluIGpxcGxvdC5zcHJpbnRmLmpzIGJ5IEFzaCBTZWFybGU6CiAqCiAqICAgICB2ZXJzaW9uIDIwMDcuMDQuMjcKICogICAgIGF1dGhvciBBc2ggU2VhcmxlCiAqICAgICBodHRwOi8vaGV4bWVuLmNvbS9ibG9nLzIwMDcvMDMvcHJpbnRmLXNwcmludGYvCiAqICAgICBodHRwOi8vaGV4bWVuLmNvbS9qcy9zcHJpbnRmLmpzCiAqICAgICBUaGUgYXV0aG9yIChBc2ggU2VhcmxlKSBoYXMgcGxhY2VkIHRoaXMgY29kZSBpbiB0aGUgcHVibGljIGRvbWFpbjoKICogICAgICJUaGlzIGNvZGUgaXMgdW5yZXN0cmljdGVkOiB5b3UgYXJlIGZyZWUgdG8gdXNlIGl0IGhvd2V2ZXIgeW91IGxpa2UuIgogKgogKiBpbmNsdWRlZCBqc0RhdGUgbGlicmFyeSBieSBDaHJpcyBMZW9uZWxsbzoKICoKICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEgQ2hyaXMgTGVvbmVsbG8KICoKICoganNEYXRlIGlzIGN1cnJlbnRseSBhdmFpbGFibGUgZm9yIHVzZSBpbiBhbGwgcGVyc29uYWwgb3IgY29tbWVyY2lhbCBwcm9qZWN0cyAKICogdW5kZXIgYm90aCB0aGUgTUlUIGFuZCBHUEwgdmVyc2lvbiAyLjAgbGljZW5zZXMuIFRoaXMgbWVhbnMgdGhhdCB5b3UgY2FuIAogKiBjaG9vc2UgdGhlIGxpY2Vuc2UgdGhhdCBiZXN0IHN1aXRzIHlvdXIgcHJvamVjdCBhbmQgdXNlIGl0IGFjY29yZGluZ2x5LgogKgogKiBqc0RhdGUgYm9ycm93cyBtYW55IGNvbmNlcHRzIGFuZCBpZGVhcyBmcm9tIHRoZSBEYXRlIEluc3RhbmNlIAogKiBNZXRob2RzIGJ5IEtlbiBTbnlkZXIgYWxvbmcgd2l0aCBzb21lIHBhcnRzIG9mIEtlbidzIGFjdHVhbCBjb2RlLgogKiAKICogS2VuJ3Mgb3JpZ2lhbmwgRGF0ZSBJbnN0YW5jZSBNZXRob2RzIGFuZCBjb3B5cmlnaHQgbm90aWNlOgogKiAKICogS2VuIFNueWRlciAoa2VuIGQgc255ZGVyIGF0IGdtYWlsIGRvdCBjb20pCiAqIDIwMDgtMDktMTAKICogdmVyc2lvbiAyLjAuMiAoaHR0cDovL2tlbmRzbnlkZXIuY29tL3NhbmRib3gvZGF0ZS8pICAgICAKICogQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbiBMaWNlbnNlIDMuMCAoaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnkvMy4wLykKICoKICoganFwbG90VG9JbWFnZSBmdW5jdGlvbiBiYXNlZCBvbiBMYXJyeSBTaWRlbidzIGV4cG9ydC1qcXBsb3QtdG8tcG5nLmpzLgogKiBMYXJyeSBoYXMgZ2VuZXJvdXNseSBnaXZlbiBwZXJtaXNzaW9uIHRvIGFkYXB0IGhpcyBjb2RlIGZvciBpbmNsdXNpb24KICogaW50byBqcVBsb3QuCiAqCiAqIExhcnJ5J3Mgb3JpZ2luYWwgY29kZSBjYW4gYmUgZm91bmQgaGVyZToKICoKICogaHR0cHM6Ly9naXRodWIuY29tL2xzaWRlbi9leHBvcnQtanFwbG90LXRvLXBuZwogKiAKICogCiAqLwooZnVuY3Rpb24oSCl7dmFyIHI7SC5mbi5lbXB0eUZvcmNlPWZ1bmN0aW9uKCl7Zm9yKHZhciBhYj0wLGFjOyhhYz1IKHRoaXMpW2FiXSkhPW51bGw7YWIrKyl7aWYoYWMubm9kZVR5cGU9PT0xKXtqUXVlcnkuY2xlYW5EYXRhKGFjLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikpfWlmKEguanFwbG90X3VzZV9leGNhbnZhcyl7YWMub3V0ZXJIVE1MPSIifWVsc2V7d2hpbGUoYWMuZmlyc3RDaGlsZCl7YWMucmVtb3ZlQ2hpbGQoYWMuZmlyc3RDaGlsZCl9fWFjPW51bGx9cmV0dXJuIEgodGhpcyl9O0guZm4ucmVtb3ZlQ2hpbGRGb3JjZT1mdW5jdGlvbihhYil7d2hpbGUoYWIuZmlyc3RDaGlsZCl7dGhpcy5yZW1vdmVDaGlsZEZvcmNlKGFiLmZpcnN0Q2hpbGQpO2FiLnJlbW92ZUNoaWxkKGFiLmZpcnN0Q2hpbGQpfX07SC5qcXBsb3Q9ZnVuY3Rpb24oYWgsYWUsYWMpe3ZhciBhZCxhYjtpZihhYz09bnVsbCl7aWYoalF1ZXJ5LmlzQXJyYXkoYWUpKXthZD1hZTthYj1udWxsfWVsc2V7aWYodHlwZW9mKGFlKT09PSJvYmplY3QiKXthZD1udWxsO2FiPWFlfX19ZWxzZXthZD1hZTthYj1hY312YXIgYWc9bmV3IE4oKTtIKCIjIithaCkucmVtb3ZlQ2xhc3MoImpxcGxvdC1lcnJvciIpO2lmKEguanFwbG90LmNvbmZpZy5jYXRjaEVycm9ycyl7dHJ5e2FnLmluaXQoYWgsYWQsYWIpO2FnLmRyYXcoKTthZy50aGVtZUVuZ2luZS5pbml0LmNhbGwoYWcpO3JldHVybiBhZ31jYXRjaChhZil7dmFyIGFpPUguanFwbG90LmNvbmZpZy5lcnJvck1lc3NhZ2V8fGFmLm1lc3NhZ2U7SCgiIyIrYWgpLmFwcGVuZCgnPGRpdiBjbGFzcz0ianFwbG90LWVycm9yLW1lc3NhZ2UiPicrYWkrIjwvZGl2PiIpO0goIiMiK2FoKS5hZGRDbGFzcygianFwbG90LWVycm9yIik7ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYWgpLnN0eWxlLmJhY2tncm91bmQ9SC5qcXBsb3QuY29uZmlnLmVycm9yQmFja2dyb3VuZDtkb2N1bWVudC5nZXRFbGVtZW50QnlJZChhaCkuc3R5bGUuYm9yZGVyPUguanFwbG90LmNvbmZpZy5lcnJvckJvcmRlcjtkb2N1bWVudC5nZXRFbGVtZW50QnlJZChhaCkuc3R5bGUuZm9udEZhbWlseT1ILmpxcGxvdC5jb25maWcuZXJyb3JGb250RmFtaWx5O2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGFoKS5zdHlsZS5mb250U2l6ZT1ILmpxcGxvdC5jb25maWcuZXJyb3JGb250U2l6ZTtkb2N1bWVudC5nZXRFbGVtZW50QnlJZChhaCkuc3R5bGUuZm9udFN0eWxlPUguanFwbG90LmNvbmZpZy5lcnJvckZvbnRTdHlsZTtkb2N1bWVudC5nZXRFbGVtZW50QnlJZChhaCkuc3R5bGUuZm9udFdlaWdodD1ILmpxcGxvdC5jb25maWcuZXJyb3JGb250V2VpZ2h0fX1lbHNle2FnLmluaXQoYWgsYWQsYWIpO2FnLmRyYXcoKTthZy50aGVtZUVuZ2luZS5pbml0LmNhbGwoYWcpO3JldHVybiBhZ319O0guanFwbG90LnZlcnNpb249IjEuMC4wYjJfcjEwMTIiO0guanFwbG90LkNhbnZhc01hbmFnZXI9ZnVuY3Rpb24oKXtpZih0eXBlb2YgSC5qcXBsb3QuQ2FudmFzTWFuYWdlci5jYW52YXNlcz09InVuZGVmaW5lZCIpe0guanFwbG90LkNhbnZhc01hbmFnZXIuY2FudmFzZXM9W107SC5qcXBsb3QuQ2FudmFzTWFuYWdlci5mcmVlPVtdfXZhciBhYj1bXTt0aGlzLmdldENhbnZhcz1mdW5jdGlvbigpe3ZhciBhZTt2YXIgYWQ9dHJ1ZTtpZighSC5qcXBsb3QudXNlX2V4Y2FudmFzKXtmb3IodmFyIGFmPTAsYWM9SC5qcXBsb3QuQ2FudmFzTWFuYWdlci5jYW52YXNlcy5sZW5ndGg7YWY8YWM7YWYrKyl7aWYoSC5qcXBsb3QuQ2FudmFzTWFuYWdlci5mcmVlW2FmXT09PXRydWUpe2FkPWZhbHNlO2FlPUguanFwbG90LkNhbnZhc01hbmFnZXIuY2FudmFzZXNbYWZdO0guanFwbG90LkNhbnZhc01hbmFnZXIuZnJlZVthZl09ZmFsc2U7YWIucHVzaChhZik7YnJlYWt9fX1pZihhZCl7YWU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIik7YWIucHVzaChILmpxcGxvdC5DYW52YXNNYW5hZ2VyLmNhbnZhc2VzLmxlbmd0aCk7SC5qcXBsb3QuQ2FudmFzTWFuYWdlci5jYW52YXNlcy5wdXNoKGFlKTtILmpxcGxvdC5DYW52YXNNYW5hZ2VyLmZyZWUucHVzaChmYWxzZSl9cmV0dXJuIGFlfTt0aGlzLmluaXRDYW52YXM9ZnVuY3Rpb24oYWMpe2lmKEguanFwbG90LnVzZV9leGNhbnZhcyl7cmV0dXJuIHdpbmRvdy5HX3ZtbENhbnZhc01hbmFnZXIuaW5pdEVsZW1lbnQoYWMpfXJldHVybiBhY307dGhpcy5mcmVlQWxsQ2FudmFzZXM9ZnVuY3Rpb24oKXtmb3IodmFyIGFkPTAsYWM9YWIubGVuZ3RoO2FkPGFjO2FkKyspe3RoaXMuZnJlZUNhbnZhcyhhYlthZF0pfWFiPVtdfTt0aGlzLmZyZWVDYW52YXM9ZnVuY3Rpb24oYWMpe2lmKEguanFwbG90LnVzZV9leGNhbnZhcyYmd2luZG93Lkdfdm1sQ2FudmFzTWFuYWdlci51bmluaXRFbGVtZW50IT09cil7d2luZG93Lkdfdm1sQ2FudmFzTWFuYWdlci51bmluaXRFbGVtZW50KEguanFwbG90LkNhbnZhc01hbmFnZXIuY2FudmFzZXNbYWNdKTtILmpxcGxvdC5DYW52YXNNYW5hZ2VyLmNhbnZhc2VzW2FjXT1udWxsfWVsc2V7dmFyIGFkPUguanFwbG90LkNhbnZhc01hbmFnZXIuY2FudmFzZXNbYWNdO2FkLmdldENvbnRleHQoIjJkIikuY2xlYXJSZWN0KDAsMCxhZC53aWR0aCxhZC5oZWlnaHQpO0goYWQpLnVuYmluZCgpLnJlbW92ZUF0dHIoImNsYXNzIikucmVtb3ZlQXR0cigic3R5bGUiKTtIKGFkKS5jc3Moe2xlZnQ6IiIsdG9wOiIiLHBvc2l0aW9uOiIifSk7YWQud2lkdGg9MDthZC5oZWlnaHQ9MDtILmpxcGxvdC5DYW52YXNNYW5hZ2VyLmZyZWVbYWNdPXRydWV9fX07SC5qcXBsb3QubG9nPWZ1bmN0aW9uKCl7aWYod2luZG93LmNvbnNvbGUpe3dpbmRvdy5jb25zb2xlLmxvZy5hcHBseSh3aW5kb3cuY29uc29sZSxhcmd1bWVudHMpfX07SC5qcXBsb3QuY29uZmlnPXthZGREb21SZWZlcmVuY2U6ZmFsc2UsZW5hYmxlUGx1Z2luczpmYWxzZSxkZWZhdWx0SGVpZ2h0OjMwMCxkZWZhdWx0V2lkdGg6NDAwLFVUQ0FkanVzdDpmYWxzZSx0aW1lem9uZU9mZnNldDpuZXcgRGF0ZShuZXcgRGF0ZSgpLmdldFRpbWV6b25lT2Zmc2V0KCkqNjAwMDApLGVycm9yTWVzc2FnZToiIixlcnJvckJhY2tncm91bmQ6IiIsZXJyb3JCb3JkZXI6IiIsZXJyb3JGb250RmFtaWx5OiIiLGVycm9yRm9udFNpemU6IiIsZXJyb3JGb250U3R5bGU6IiIsZXJyb3JGb250V2VpZ2h0OiIiLGNhdGNoRXJyb3JzOmZhbHNlLGRlZmF1bHRUaWNrRm9ybWF0U3RyaW5nOiIlLjFmIixkZWZhdWx0Q29sb3JzOlsiIzRiYjJjNSIsIiNFQUEyMjgiLCIjYzViNDdmIiwiIzU3OTU3NSIsIiM4Mzk1NTciLCIjOTU4YzEyIiwiIzk1MzU3OSIsIiM0YjVkZTQiLCIjZDhiODNmIiwiI2ZmNTgwMCIsIiMwMDg1Y2MiLCIjYzc0N2EzIiwiI2NkZGY1NCIsIiNGQkQxNzgiLCIjMjZCNEUzIiwiI2JkNzBjNyJdLGRlZmF1bHROZWdhdGl2ZUNvbG9yczpbIiM0OTg5OTEiLCIjQzA4ODQwIiwiIzlGOTI3NCIsIiM1NDZENjEiLCIjNjQ2QzRBIiwiIzZGNjYyMSIsIiM2RTNGNUYiLCIjNEY2NEIwIiwiI0E4OTA1MCIsIiNDNDU5MjMiLCIjMTg3Mzk5IiwiIzk0NTM4MSIsIiM5NTlFNUMiLCIjQzdBRjdCIiwiIzQ3ODM5NiIsIiM5MDcyOTQiXSxkYXNoTGVuZ3RoOjQsZ2FwTGVuZ3RoOjQsZG90R2FwTGVuZ3RoOjIuNSxzcmNMb2NhdGlvbjoianFwbG90L3NyYy8iLHBsdWdpbkxvY2F0aW9uOiJqcXBsb3Qvc3JjL3BsdWdpbnMvIn07SC5qcXBsb3QuYXJyYXlNYXg9ZnVuY3Rpb24oYWIpe3JldHVybiBNYXRoLm1heC5hcHBseShNYXRoLGFiKX07SC5qcXBsb3QuYXJyYXlNaW49ZnVuY3Rpb24oYWIpe3JldHVybiBNYXRoLm1pbi5hcHBseShNYXRoLGFiKX07SC5qcXBsb3QuZW5hYmxlUGx1Z2lucz1ILmpxcGxvdC5jb25maWcuZW5hYmxlUGx1Z2lucztILmpxcGxvdC5zdXBwb3J0X2NhbnZhcz1mdW5jdGlvbigpe2lmKHR5cGVvZiBILmpxcGxvdC5zdXBwb3J0X2NhbnZhcy5yZXN1bHQ9PSJ1bmRlZmluZWQiKXtILmpxcGxvdC5zdXBwb3J0X2NhbnZhcy5yZXN1bHQ9ISFkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKS5nZXRDb250ZXh0fXJldHVybiBILmpxcGxvdC5zdXBwb3J0X2NhbnZhcy5yZXN1bHR9O0guanFwbG90LnN1cHBvcnRfY2FudmFzX3RleHQ9ZnVuY3Rpb24oKXtpZih0eXBlb2YgSC5qcXBsb3Quc3VwcG9ydF9jYW52YXNfdGV4dC5yZXN1bHQ9PSJ1bmRlZmluZWQiKXtpZih3aW5kb3cuR192bWxDYW52YXNNYW5hZ2VyIT09ciYmd2luZG93Lkdfdm1sQ2FudmFzTWFuYWdlci5fdmVyc2lvbj44ODcpe0guanFwbG90LnN1cHBvcnRfY2FudmFzX3RleHQucmVzdWx0PXRydWV9ZWxzZXtILmpxcGxvdC5zdXBwb3J0X2NhbnZhc190ZXh0LnJlc3VsdD0hIShkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKS5nZXRDb250ZXh0JiZ0eXBlb2YgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIikuZ2V0Q29udGV4dCgiMmQiKS5maWxsVGV4dD09ImZ1bmN0aW9uIil9fXJldHVybiBILmpxcGxvdC5zdXBwb3J0X2NhbnZhc190ZXh0LnJlc3VsdH07SC5qcXBsb3QudXNlX2V4Y2FudmFzPShILmJyb3dzZXIubXNpZSYmIUguanFwbG90LnN1cHBvcnRfY2FudmFzKCkpP3RydWU6ZmFsc2U7SC5qcXBsb3QucHJlSW5pdEhvb2tzPVtdO0guanFwbG90LnBvc3RJbml0SG9va3M9W107SC5qcXBsb3QucHJlUGFyc2VPcHRpb25zSG9va3M9W107SC5qcXBsb3QucG9zdFBhcnNlT3B0aW9uc0hvb2tzPVtdO0guanFwbG90LnByZURyYXdIb29rcz1bXTtILmpxcGxvdC5wb3N0RHJhd0hvb2tzPVtdO0guanFwbG90LnByZURyYXdTZXJpZXNIb29rcz1bXTtILmpxcGxvdC5wb3N0RHJhd1Nlcmllc0hvb2tzPVtdO0guanFwbG90LnByZURyYXdMZWdlbmRIb29rcz1bXTtILmpxcGxvdC5hZGRMZWdlbmRSb3dIb29rcz1bXTtILmpxcGxvdC5wcmVTZXJpZXNJbml0SG9va3M9W107SC5qcXBsb3QucG9zdFNlcmllc0luaXRIb29rcz1bXTtILmpxcGxvdC5wcmVQYXJzZVNlcmllc09wdGlvbnNIb29rcz1bXTtILmpxcGxvdC5wb3N0UGFyc2VTZXJpZXNPcHRpb25zSG9va3M9W107SC5qcXBsb3QuZXZlbnRMaXN0ZW5lckhvb2tzPVtdO0guanFwbG90LnByZURyYXdTZXJpZXNTaGFkb3dIb29rcz1bXTtILmpxcGxvdC5wb3N0RHJhd1Nlcmllc1NoYWRvd0hvb2tzPVtdO0guanFwbG90LkVsZW1Db250YWluZXI9ZnVuY3Rpb24oKXt0aGlzLl9lbGVtO3RoaXMuX3Bsb3RXaWR0aDt0aGlzLl9wbG90SGVpZ2h0O3RoaXMuX3Bsb3REaW1lbnNpb25zPXtoZWlnaHQ6bnVsbCx3aWR0aDpudWxsfX07SC5qcXBsb3QuRWxlbUNvbnRhaW5lci5wcm90b3R5cGUuY3JlYXRlRWxlbWVudD1mdW5jdGlvbihhZSxhZyxhYyxhZCxhaCl7dGhpcy5fb2Zmc2V0cz1hZzt2YXIgYWI9YWN8fCJqcXBsb3QiO3ZhciBhZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KGFlKTt0aGlzLl9lbGVtPUgoYWYpO3RoaXMuX2VsZW0uYWRkQ2xhc3MoYWIpO3RoaXMuX2VsZW0uY3NzKGFkKTt0aGlzLl9lbGVtLmF0dHIoYWgpO2FmPW51bGw7cmV0dXJuIHRoaXMuX2VsZW19O0guanFwbG90LkVsZW1Db250YWluZXIucHJvdG90eXBlLmdldFdpZHRoPWZ1bmN0aW9uKCl7aWYodGhpcy5fZWxlbSl7cmV0dXJuIHRoaXMuX2VsZW0ub3V0ZXJXaWR0aCh0cnVlKX1lbHNle3JldHVybiBudWxsfX07SC5qcXBsb3QuRWxlbUNvbnRhaW5lci5wcm90b3R5cGUuZ2V0SGVpZ2h0PWZ1bmN0aW9uKCl7aWYodGhpcy5fZWxlbSl7cmV0dXJuIHRoaXMuX2VsZW0ub3V0ZXJIZWlnaHQodHJ1ZSl9ZWxzZXtyZXR1cm4gbnVsbH19O0guanFwbG90LkVsZW1Db250YWluZXIucHJvdG90eXBlLmdldFBvc2l0aW9uPWZ1bmN0aW9uKCl7aWYodGhpcy5fZWxlbSl7cmV0dXJuIHRoaXMuX2VsZW0ucG9zaXRpb24oKX1lbHNle3JldHVybnt0b3A6bnVsbCxsZWZ0Om51bGwsYm90dG9tOm51bGwscmlnaHQ6bnVsbH19fTtILmpxcGxvdC5FbGVtQ29udGFpbmVyLnByb3RvdHlwZS5nZXRUb3A9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRQb3NpdGlvbigpLnRvcH07SC5qcXBsb3QuRWxlbUNvbnRhaW5lci5wcm90b3R5cGUuZ2V0TGVmdD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFBvc2l0aW9uKCkubGVmdH07SC5qcXBsb3QuRWxlbUNvbnRhaW5lci5wcm90b3R5cGUuZ2V0Qm90dG9tPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2VsZW0uY3NzKCJib3R0b20iKX07SC5qcXBsb3QuRWxlbUNvbnRhaW5lci5wcm90b3R5cGUuZ2V0UmlnaHQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZWxlbS5jc3MoInJpZ2h0Iil9O2Z1bmN0aW9uIHMoYWIpe0guanFwbG90LkVsZW1Db250YWluZXIuY2FsbCh0aGlzKTt0aGlzLm5hbWU9YWI7dGhpcy5fc2VyaWVzPVtdO3RoaXMuc2hvdz1mYWxzZTt0aGlzLnRpY2tSZW5kZXJlcj1ILmpxcGxvdC5BeGlzVGlja1JlbmRlcmVyO3RoaXMudGlja09wdGlvbnM9e307dGhpcy5sYWJlbFJlbmRlcmVyPUguanFwbG90LkF4aXNMYWJlbFJlbmRlcmVyO3RoaXMubGFiZWxPcHRpb25zPXt9O3RoaXMubGFiZWw9bnVsbDt0aGlzLnNob3dMYWJlbD10cnVlO3RoaXMubWluPW51bGw7dGhpcy5tYXg9bnVsbDt0aGlzLmF1dG9zY2FsZT1mYWxzZTt0aGlzLnBhZD0xLjI7dGhpcy5wYWRNYXg9bnVsbDt0aGlzLnBhZE1pbj1udWxsO3RoaXMudGlja3M9W107dGhpcy5udW1iZXJUaWNrczt0aGlzLnRpY2tJbnRlcnZhbDt0aGlzLnJlbmRlcmVyPUguanFwbG90LkxpbmVhckF4aXNSZW5kZXJlcjt0aGlzLnJlbmRlcmVyT3B0aW9ucz17fTt0aGlzLnNob3dUaWNrcz10cnVlO3RoaXMuc2hvd1RpY2tNYXJrcz10cnVlO3RoaXMuc2hvd01pbm9yVGlja3M9dHJ1ZTt0aGlzLmRyYXdNYWpvckdyaWRsaW5lcz10cnVlO3RoaXMuZHJhd01pbm9yR3JpZGxpbmVzPWZhbHNlO3RoaXMuZHJhd01ham9yVGlja01hcmtzPXRydWU7dGhpcy5kcmF3TWlub3JUaWNrTWFya3M9dHJ1ZTt0aGlzLnVzZVNlcmllc0NvbG9yPWZhbHNlO3RoaXMuYm9yZGVyV2lkdGg9bnVsbDt0aGlzLmJvcmRlckNvbG9yPW51bGw7dGhpcy5fZGF0YUJvdW5kcz17bWluOm51bGwsbWF4Om51bGx9O3RoaXMuX2ludGVydmFsU3RhdHM9W107dGhpcy5fb2Zmc2V0cz17bWluOm51bGwsbWF4Om51bGx9O3RoaXMuX3RpY2tzPVtdO3RoaXMuX2xhYmVsPW51bGw7dGhpcy5zeW5jVGlja3M9bnVsbDt0aGlzLnRpY2tTcGFjaW5nPTc1O3RoaXMuX21pbj1udWxsO3RoaXMuX21heD1udWxsO3RoaXMuX3RpY2tJbnRlcnZhbD1udWxsO3RoaXMuX251bWJlclRpY2tzPW51bGw7dGhpcy5fX3RpY2tzPW51bGw7dGhpcy5fb3B0aW9ucz17fX1zLnByb3RvdHlwZT1uZXcgSC5qcXBsb3QuRWxlbUNvbnRhaW5lcigpO3MucHJvdG90eXBlLmNvbnN0cnVjdG9yPXM7cy5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbigpe3RoaXMucmVuZGVyZXI9bmV3IHRoaXMucmVuZGVyZXIoKTt0aGlzLnRpY2tPcHRpb25zLmF4aXM9dGhpcy5uYW1lO2lmKHRoaXMudGlja09wdGlvbnMuc2hvd01hcms9PW51bGwpe3RoaXMudGlja09wdGlvbnMuc2hvd01hcms9dGhpcy5zaG93VGlja3N9aWYodGhpcy50aWNrT3B0aW9ucy5zaG93TWFyaz09bnVsbCl7dGhpcy50aWNrT3B0aW9ucy5zaG93TWFyaz10aGlzLnNob3dUaWNrTWFya3N9aWYodGhpcy50aWNrT3B0aW9ucy5zaG93TGFiZWw9PW51bGwpe3RoaXMudGlja09wdGlvbnMuc2hvd0xhYmVsPXRoaXMuc2hvd1RpY2tzfWlmKHRoaXMubGFiZWw9PW51bGx8fHRoaXMubGFiZWw9PSIiKXt0aGlzLnNob3dMYWJlbD1mYWxzZX1lbHNle3RoaXMubGFiZWxPcHRpb25zLmxhYmVsPXRoaXMubGFiZWx9aWYodGhpcy5zaG93TGFiZWw9PWZhbHNlKXt0aGlzLmxhYmVsT3B0aW9ucy5zaG93PWZhbHNlfWlmKHRoaXMucGFkPT0wKXt0aGlzLnBhZD0xfWlmKHRoaXMucGFkTWF4PT0wKXt0aGlzLnBhZE1heD0xfWlmKHRoaXMucGFkTWluPT0wKXt0aGlzLnBhZE1pbj0xfWlmKHRoaXMucGFkTWF4PT1udWxsKXt0aGlzLnBhZE1heD0odGhpcy5wYWQtMSkvMisxfWlmKHRoaXMucGFkTWluPT1udWxsKXt0aGlzLnBhZE1pbj0odGhpcy5wYWQtMSkvMisxfXRoaXMucGFkPXRoaXMucGFkTWF4K3RoaXMucGFkTWluLTE7aWYodGhpcy5taW4hPW51bGx8fHRoaXMubWF4IT1udWxsKXt0aGlzLmF1dG9zY2FsZT1mYWxzZX1pZih0aGlzLnN5bmNUaWNrcz09bnVsbCYmdGhpcy5uYW1lLmluZGV4T2YoInkiKT4tMSl7dGhpcy5zeW5jVGlja3M9dHJ1ZX1lbHNle2lmKHRoaXMuc3luY1RpY2tzPT1udWxsKXt0aGlzLnN5bmNUaWNrcz1mYWxzZX19dGhpcy5yZW5kZXJlci5pbml0LmNhbGwodGhpcyx0aGlzLnJlbmRlcmVyT3B0aW9ucyl9O3MucHJvdG90eXBlLmRyYXc9ZnVuY3Rpb24oYWIsYWMpe2lmKHRoaXMuX190aWNrcyl7dGhpcy5fX3RpY2tzPW51bGx9cmV0dXJuIHRoaXMucmVuZGVyZXIuZHJhdy5jYWxsKHRoaXMsYWIsYWMpfTtzLnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24oKXt0aGlzLnJlbmRlcmVyLnNldC5jYWxsKHRoaXMpfTtzLnByb3RvdHlwZS5wYWNrPWZ1bmN0aW9uKGFjLGFiKXtpZih0aGlzLnNob3cpe3RoaXMucmVuZGVyZXIucGFjay5jYWxsKHRoaXMsYWMsYWIpfWlmKHRoaXMuX21pbj09bnVsbCl7dGhpcy5fbWluPXRoaXMubWluO3RoaXMuX21heD10aGlzLm1heDt0aGlzLl90aWNrSW50ZXJ2YWw9dGhpcy50aWNrSW50ZXJ2YWw7dGhpcy5fbnVtYmVyVGlja3M9dGhpcy5udW1iZXJUaWNrczt0aGlzLl9fdGlja3M9dGhpcy5fdGlja3N9fTtzLnByb3RvdHlwZS5yZXNldD1mdW5jdGlvbigpe3RoaXMucmVuZGVyZXIucmVzZXQuY2FsbCh0aGlzKX07cy5wcm90b3R5cGUucmVzZXRTY2FsZT1mdW5jdGlvbihhYil7SC5leHRlbmQodHJ1ZSx0aGlzLHttaW46bnVsbCxtYXg6bnVsbCxudW1iZXJUaWNrczpudWxsLHRpY2tJbnRlcnZhbDpudWxsLF90aWNrczpbXSx0aWNrczpbXX0sYWIpO3RoaXMucmVzZXREYXRhQm91bmRzKCl9O3MucHJvdG90eXBlLnJlc2V0RGF0YUJvdW5kcz1mdW5jdGlvbigpe3ZhciBhaT10aGlzLl9kYXRhQm91bmRzO2FpLm1pbj1udWxsO2FpLm1heD1udWxsO3ZhciBhYyxhaixhZzt2YXIgYWQ9KHRoaXMuc2hvdyk/dHJ1ZTpmYWxzZTtmb3IodmFyIGFmPTA7YWY8dGhpcy5fc2VyaWVzLmxlbmd0aDthZisrKXthaj10aGlzLl9zZXJpZXNbYWZdO2lmKGFqLnNob3cpe2FnPWFqLl9wbG90RGF0YTtpZihhai5fdHlwZT09PSJsaW5lIiYmYWoucmVuZGVyZXIuYmFuZHMuc2hvdyYmdGhpcy5uYW1lLmNoYXJBdCgwKSE9PSJ4Iil7YWc9W1swLGFqLnJlbmRlcmVyLmJhbmRzLl9taW5dLFsxLGFqLnJlbmRlcmVyLmJhbmRzLl9tYXhdXX12YXIgYWI9MSxhaD0xO2lmKGFqLl90eXBlIT1udWxsJiZhai5fdHlwZT09Im9obGMiKXthYj0zO2FoPTJ9Zm9yKHZhciBhZT0wLGFjPWFnLmxlbmd0aDthZTxhYzthZSsrKXtpZih0aGlzLm5hbWU9PSJ4YXhpcyJ8fHRoaXMubmFtZT09IngyYXhpcyIpe2lmKChhZ1thZV1bMF0hPW51bGwmJmFnW2FlXVswXTxhaS5taW4pfHxhaS5taW49PW51bGwpe2FpLm1pbj1hZ1thZV1bMF19aWYoKGFnW2FlXVswXSE9bnVsbCYmYWdbYWVdWzBdPmFpLm1heCl8fGFpLm1heD09bnVsbCl7YWkubWF4PWFnW2FlXVswXX19ZWxzZXtpZigoYWdbYWVdW2FiXSE9bnVsbCYmYWdbYWVdW2FiXTxhaS5taW4pfHxhaS5taW49PW51bGwpe2FpLm1pbj1hZ1thZV1bYWJdfWlmKChhZ1thZV1bYWhdIT1udWxsJiZhZ1thZV1bYWhdPmFpLm1heCl8fGFpLm1heD09bnVsbCl7YWkubWF4PWFnW2FlXVthaF19fX1pZihhZCYmYWoucmVuZGVyZXIuY29uc3RydWN0b3IhPT1ILmpxcGxvdC5CYXJSZW5kZXJlcil7YWQ9ZmFsc2V9ZWxzZXtpZihhZCYmdGhpcy5fb3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgiZm9yY2VUaWNrQXQwIikmJnRoaXMuX29wdGlvbnMuZm9yY2VUaWNrQXQwPT1mYWxzZSl7YWQ9ZmFsc2V9ZWxzZXtpZihhZCYmYWoucmVuZGVyZXIuY29uc3RydWN0b3I9PT1ILmpxcGxvdC5CYXJSZW5kZXJlcil7aWYoYWouYmFyRGlyZWN0aW9uPT0idmVydGljYWwiJiZ0aGlzLm5hbWUhPSJ4YXhpcyImJnRoaXMubmFtZSE9IngyYXhpcyIpe2lmKHRoaXMuX29wdGlvbnMucGFkIT1udWxsfHx0aGlzLl9vcHRpb25zLnBhZE1pbiE9bnVsbCl7YWQ9ZmFsc2V9fWVsc2V7aWYoYWouYmFyRGlyZWN0aW9uPT0iaG9yaXpvbnRhbCImJih0aGlzLm5hbWU9PSJ4YXhpcyJ8fHRoaXMubmFtZT09IngyYXhpcyIpKXtpZih0aGlzLl9vcHRpb25zLnBhZCE9bnVsbHx8dGhpcy5fb3B0aW9ucy5wYWRNaW4hPW51bGwpe2FkPWZhbHNlfX19fX19fX1pZihhZCYmdGhpcy5yZW5kZXJlci5jb25zdHJ1Y3Rvcj09PUguanFwbG90LkxpbmVhckF4aXNSZW5kZXJlciYmYWkubWluPj0wKXt0aGlzLnBhZE1pbj0xO3RoaXMuZm9yY2VUaWNrQXQwPXRydWV9fTtmdW5jdGlvbiBuKGFiKXtILmpxcGxvdC5FbGVtQ29udGFpbmVyLmNhbGwodGhpcyk7dGhpcy5zaG93PWZhbHNlO3RoaXMubG9jYXRpb249Im5lIjt0aGlzLmxhYmVscz1bXTt0aGlzLnNob3dMYWJlbHM9dHJ1ZTt0aGlzLnNob3dTd2F0Y2hlcz10cnVlO3RoaXMucGxhY2VtZW50PSJpbnNpZGVHcmlkIjt0aGlzLnhvZmZzZXQ9MDt0aGlzLnlvZmZzZXQ9MDt0aGlzLmJvcmRlcjt0aGlzLmJhY2tncm91bmQ7dGhpcy50ZXh0Q29sb3I7dGhpcy5mb250RmFtaWx5O3RoaXMuZm9udFNpemU7dGhpcy5yb3dTcGFjaW5nPSIwLjVlbSI7dGhpcy5yZW5kZXJlcj1ILmpxcGxvdC5UYWJsZUxlZ2VuZFJlbmRlcmVyO3RoaXMucmVuZGVyZXJPcHRpb25zPXt9O3RoaXMucHJlRHJhdz1mYWxzZTt0aGlzLm1hcmdpblRvcD1udWxsO3RoaXMubWFyZ2luUmlnaHQ9bnVsbDt0aGlzLm1hcmdpbkJvdHRvbT1udWxsO3RoaXMubWFyZ2luTGVmdD1udWxsO3RoaXMuZXNjYXBlSHRtbD1mYWxzZTt0aGlzLl9zZXJpZXM9W107SC5leHRlbmQodHJ1ZSx0aGlzLGFiKX1uLnByb3RvdHlwZT1uZXcgSC5qcXBsb3QuRWxlbUNvbnRhaW5lcigpO24ucHJvdG90eXBlLmNvbnN0cnVjdG9yPW47bi5wcm90b3R5cGUuc2V0T3B0aW9ucz1mdW5jdGlvbihhYil7SC5leHRlbmQodHJ1ZSx0aGlzLGFiKTtpZih0aGlzLnBsYWNlbWVudD09Imluc2lkZSIpe3RoaXMucGxhY2VtZW50PSJpbnNpZGVHcmlkIn1pZih0aGlzLnhvZmZzZXQ+MCl7aWYodGhpcy5wbGFjZW1lbnQ9PSJpbnNpZGVHcmlkIil7c3dpdGNoKHRoaXMubG9jYXRpb24pe2Nhc2UibnciOmNhc2UidyI6Y2FzZSJzdyI6aWYodGhpcy5tYXJnaW5MZWZ0PT1udWxsKXt0aGlzLm1hcmdpbkxlZnQ9dGhpcy54b2Zmc2V0KyJweCJ9dGhpcy5tYXJnaW5SaWdodD0iMHB4IjticmVhaztjYXNlIm5lIjpjYXNlImUiOmNhc2Uic2UiOmRlZmF1bHQ6aWYodGhpcy5tYXJnaW5SaWdodD09bnVsbCl7dGhpcy5tYXJnaW5SaWdodD10aGlzLnhvZmZzZXQrInB4In10aGlzLm1hcmdpbkxlZnQ9IjBweCI7YnJlYWt9fWVsc2V7aWYodGhpcy5wbGFjZW1lbnQ9PSJvdXRzaWRlIil7c3dpdGNoKHRoaXMubG9jYXRpb24pe2Nhc2UibnciOmNhc2UidyI6Y2FzZSJzdyI6aWYodGhpcy5tYXJnaW5SaWdodD09bnVsbCl7dGhpcy5tYXJnaW5SaWdodD10aGlzLnhvZmZzZXQrInB4In10aGlzLm1hcmdpbkxlZnQ9IjBweCI7YnJlYWs7Y2FzZSJuZSI6Y2FzZSJlIjpjYXNlInNlIjpkZWZhdWx0OmlmKHRoaXMubWFyZ2luTGVmdD09bnVsbCl7dGhpcy5tYXJnaW5MZWZ0PXRoaXMueG9mZnNldCsicHgifXRoaXMubWFyZ2luUmlnaHQ9IjBweCI7YnJlYWt9fX10aGlzLnhvZmZzZXQ9MH1pZih0aGlzLnlvZmZzZXQ+MCl7aWYodGhpcy5wbGFjZW1lbnQ9PSJvdXRzaWRlIil7c3dpdGNoKHRoaXMubG9jYXRpb24pe2Nhc2Uic3ciOmNhc2UicyI6Y2FzZSJzZSI6aWYodGhpcy5tYXJnaW5Ub3A9PW51bGwpe3RoaXMubWFyZ2luVG9wPXRoaXMueW9mZnNldCsicHgifXRoaXMubWFyZ2luQm90dG9tPSIwcHgiO2JyZWFrO2Nhc2UibmUiOmNhc2UibiI6Y2FzZSJudyI6ZGVmYXVsdDppZih0aGlzLm1hcmdpbkJvdHRvbT09bnVsbCl7dGhpcy5tYXJnaW5Cb3R0b209dGhpcy55b2Zmc2V0KyJweCJ9dGhpcy5tYXJnaW5Ub3A9IjBweCI7YnJlYWt9fWVsc2V7aWYodGhpcy5wbGFjZW1lbnQ9PSJpbnNpZGVHcmlkIil7c3dpdGNoKHRoaXMubG9jYXRpb24pe2Nhc2Uic3ciOmNhc2UicyI6Y2FzZSJzZSI6aWYodGhpcy5tYXJnaW5Cb3R0b209PW51bGwpe3RoaXMubWFyZ2luQm90dG9tPXRoaXMueW9mZnNldCsicHgifXRoaXMubWFyZ2luVG9wPSIwcHgiO2JyZWFrO2Nhc2UibmUiOmNhc2UibiI6Y2FzZSJudyI6ZGVmYXVsdDppZih0aGlzLm1hcmdpblRvcD09bnVsbCl7dGhpcy5tYXJnaW5Ub3A9dGhpcy55b2Zmc2V0KyJweCJ9dGhpcy5tYXJnaW5Cb3R0b209IjBweCI7YnJlYWt9fX10aGlzLnlvZmZzZXQ9MH19O24ucHJvdG90eXBlLmluaXQ9ZnVuY3Rpb24oKXt0aGlzLnJlbmRlcmVyPW5ldyB0aGlzLnJlbmRlcmVyKCk7dGhpcy5yZW5kZXJlci5pbml0LmNhbGwodGhpcyx0aGlzLnJlbmRlcmVyT3B0aW9ucyl9O24ucHJvdG90eXBlLmRyYXc9ZnVuY3Rpb24oYWMpe2Zvcih2YXIgYWI9MDthYjxILmpxcGxvdC5wcmVEcmF3TGVnZW5kSG9va3MubGVuZ3RoO2FiKyspe0guanFwbG90LnByZURyYXdMZWdlbmRIb29rc1thYl0uY2FsbCh0aGlzLGFjKX1yZXR1cm4gdGhpcy5yZW5kZXJlci5kcmF3LmNhbGwodGhpcyxhYyl9O24ucHJvdG90eXBlLnBhY2s9ZnVuY3Rpb24oYWIpe3RoaXMucmVuZGVyZXIucGFjay5jYWxsKHRoaXMsYWIpfTtmdW5jdGlvbiB1KGFiKXtILmpxcGxvdC5FbGVtQ29udGFpbmVyLmNhbGwodGhpcyk7dGhpcy50ZXh0PWFiO3RoaXMuc2hvdz10cnVlO3RoaXMuZm9udEZhbWlseTt0aGlzLmZvbnRTaXplO3RoaXMudGV4dEFsaWduO3RoaXMudGV4dENvbG9yO3RoaXMucmVuZGVyZXI9SC5qcXBsb3QuRGl2VGl0bGVSZW5kZXJlcjt0aGlzLnJlbmRlcmVyT3B0aW9ucz17fTt0aGlzLmVzY2FwZUh0bWw9ZmFsc2V9dS5wcm90b3R5cGU9bmV3IEguanFwbG90LkVsZW1Db250YWluZXIoKTt1LnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj11O3UucHJvdG90eXBlLmluaXQ9ZnVuY3Rpb24oKXt0aGlzLnJlbmRlcmVyPW5ldyB0aGlzLnJlbmRlcmVyKCk7dGhpcy5yZW5kZXJlci5pbml0LmNhbGwodGhpcyx0aGlzLnJlbmRlcmVyT3B0aW9ucyl9O3UucHJvdG90eXBlLmRyYXc9ZnVuY3Rpb24oYWIpe3JldHVybiB0aGlzLnJlbmRlcmVyLmRyYXcuY2FsbCh0aGlzLGFiKX07dS5wcm90b3R5cGUucGFjaz1mdW5jdGlvbigpe3RoaXMucmVuZGVyZXIucGFjay5jYWxsKHRoaXMpfTtmdW5jdGlvbiBPKCl7SC5qcXBsb3QuRWxlbUNvbnRhaW5lci5jYWxsKHRoaXMpO3RoaXMuc2hvdz10cnVlO3RoaXMueGF4aXM9InhheGlzIjt0aGlzLl94YXhpczt0aGlzLnlheGlzPSJ5YXhpcyI7dGhpcy5feWF4aXM7dGhpcy5ncmlkQm9yZGVyV2lkdGg9Mjt0aGlzLnJlbmRlcmVyPUguanFwbG90LkxpbmVSZW5kZXJlcjt0aGlzLnJlbmRlcmVyT3B0aW9ucz17fTt0aGlzLmRhdGE9W107dGhpcy5ncmlkRGF0YT1bXTt0aGlzLmxhYmVsPSIiO3RoaXMuc2hvd0xhYmVsPXRydWU7dGhpcy5jb2xvcjt0aGlzLm5lZ2F0aXZlQ29sb3I7dGhpcy5saW5lV2lkdGg9Mi41O3RoaXMubGluZUpvaW49InJvdW5kIjt0aGlzLmxpbmVDYXA9InJvdW5kIjt0aGlzLmxpbmVQYXR0ZXJuPSJzb2xpZCI7dGhpcy5zaGFkb3c9dHJ1ZTt0aGlzLnNoYWRvd0FuZ2xlPTQ1O3RoaXMuc2hhZG93T2Zmc2V0PTEuMjU7dGhpcy5zaGFkb3dEZXB0aD0zO3RoaXMuc2hhZG93QWxwaGE9IjAuMSI7dGhpcy5icmVha09uTnVsbD1mYWxzZTt0aGlzLm1hcmtlclJlbmRlcmVyPUguanFwbG90Lk1hcmtlclJlbmRlcmVyO3RoaXMubWFya2VyT3B0aW9ucz17fTt0aGlzLnNob3dMaW5lPXRydWU7dGhpcy5zaG93TWFya2VyPXRydWU7dGhpcy5pbmRleDt0aGlzLmZpbGw9ZmFsc2U7dGhpcy5maWxsQ29sb3I7dGhpcy5maWxsQWxwaGE7dGhpcy5maWxsQW5kU3Ryb2tlPWZhbHNlO3RoaXMuZGlzYWJsZVN0YWNrPWZhbHNlO3RoaXMuX3N0YWNrPWZhbHNlO3RoaXMubmVpZ2hib3JUaHJlc2hvbGQ9NDt0aGlzLmZpbGxUb1plcm89ZmFsc2U7dGhpcy5maWxsVG9WYWx1ZT0wO3RoaXMuZmlsbEF4aXM9InkiO3RoaXMudXNlTmVnYXRpdmVDb2xvcnM9dHJ1ZTt0aGlzLl9zdGFja0RhdGE9W107dGhpcy5fcGxvdERhdGE9W107dGhpcy5fcGxvdFZhbHVlcz17eDpbXSx5OltdfTt0aGlzLl9pbnRlcnZhbHM9e3g6e30seTp7fX07dGhpcy5fcHJldlBsb3REYXRhPVtdO3RoaXMuX3ByZXZHcmlkRGF0YT1bXTt0aGlzLl9zdGFja0F4aXM9InkiO3RoaXMuX3ByaW1hcnlBeGlzPSJfeGF4aXMiO3RoaXMuY2FudmFzPW5ldyBILmpxcGxvdC5HZW5lcmljQ2FudmFzKCk7dGhpcy5zaGFkb3dDYW52YXM9bmV3IEguanFwbG90LkdlbmVyaWNDYW52YXMoKTt0aGlzLnBsdWdpbnM9e307dGhpcy5fc3VteT0wO3RoaXMuX3N1bXg9MDt0aGlzLl90eXBlPSIifU8ucHJvdG90eXBlPW5ldyBILmpxcGxvdC5FbGVtQ29udGFpbmVyKCk7Ty5wcm90b3R5cGUuY29uc3RydWN0b3I9TztPLnByb3RvdHlwZS5pbml0PWZ1bmN0aW9uKGFkLGFoLGFmKXt0aGlzLmluZGV4PWFkO3RoaXMuZ3JpZEJvcmRlcldpZHRoPWFoO3ZhciBhZz10aGlzLmRhdGE7dmFyIGFjPVtdLGFlO2ZvcihhZT0wO2FlPGFnLmxlbmd0aDthZSsrKXtpZighdGhpcy5icmVha09uTnVsbCl7aWYoYWdbYWVdPT1udWxsfHxhZ1thZV1bMF09PW51bGx8fGFnW2FlXVsxXT09bnVsbCl7Y29udGludWV9ZWxzZXthYy5wdXNoKGFnW2FlXSl9fWVsc2V7YWMucHVzaChhZ1thZV0pfX10aGlzLmRhdGE9YWM7aWYoIXRoaXMuY29sb3ImJnRoaXMuc2hvdyl7dGhpcy5jb2xvcj1hZi5jb2xvckdlbmVyYXRvci5nZXQodGhpcy5pbmRleCl9aWYoIXRoaXMubmVnYXRpdmVDb2xvciYmdGhpcy5zaG93KXt0aGlzLm5lZ2F0aXZlQ29sb3I9YWYubmVnYXRpdmVDb2xvckdlbmVyYXRvci5nZXQodGhpcy5pbmRleCl9aWYoIXRoaXMuZmlsbENvbG9yKXt0aGlzLmZpbGxDb2xvcj10aGlzLmNvbG9yfWlmKHRoaXMuZmlsbEFscGhhKXt2YXIgYWI9SC5qcXBsb3Qubm9ybWFsaXplMnJnYih0aGlzLmZpbGxDb2xvcik7dmFyIGFiPUguanFwbG90LmdldENvbG9yQ29tcG9uZW50cyhhYik7dGhpcy5maWxsQ29sb3I9InJnYmEoIithYlswXSsiLCIrYWJbMV0rIiwiK2FiWzJdKyIsIit0aGlzLmZpbGxBbHBoYSsiKSJ9dGhpcy5yZW5kZXJlcj1uZXcgdGhpcy5yZW5kZXJlcigpO3RoaXMucmVuZGVyZXIuaW5pdC5jYWxsKHRoaXMsdGhpcy5yZW5kZXJlck9wdGlvbnMsYWYpO3RoaXMubWFya2VyUmVuZGVyZXI9bmV3IHRoaXMubWFya2VyUmVuZGVyZXIoKTtpZighdGhpcy5tYXJrZXJPcHRpb25zLmNvbG9yKXt0aGlzLm1hcmtlck9wdGlvbnMuY29sb3I9dGhpcy5jb2xvcn1pZih0aGlzLm1hcmtlck9wdGlvbnMuc2hvdz09bnVsbCl7dGhpcy5tYXJrZXJPcHRpb25zLnNob3c9dGhpcy5zaG93TWFya2VyfXRoaXMuc2hvd01hcmtlcj10aGlzLm1hcmtlck9wdGlvbnMuc2hvdzt0aGlzLm1hcmtlclJlbmRlcmVyLmluaXQodGhpcy5tYXJrZXJPcHRpb25zKX07Ty5wcm90b3R5cGUuZHJhdz1mdW5jdGlvbihhaCxhZSxhZyl7dmFyIGFjPShhZT09cik/e306YWU7YWg9KGFoPT1yKT90aGlzLmNhbnZhcy5fY3R4OmFoO3ZhciBhYixhZixhZDtmb3IoYWI9MDthYjxILmpxcGxvdC5wcmVEcmF3U2VyaWVzSG9va3MubGVuZ3RoO2FiKyspe0guanFwbG90LnByZURyYXdTZXJpZXNIb29rc1thYl0uY2FsbCh0aGlzLGFoLGFjKX1pZih0aGlzLnNob3cpe3RoaXMucmVuZGVyZXIuc2V0R3JpZERhdGEuY2FsbCh0aGlzLGFnKTtpZighYWMucHJldmVudEpxUGxvdFNlcmllc0RyYXdUcmlnZ2VyKXtIKGFoLmNhbnZhcykudHJpZ2dlcigianFwbG90U2VyaWVzRHJhdyIsW3RoaXMuZGF0YSx0aGlzLmdyaWREYXRhXSl9YWY9W107aWYoYWMuZGF0YSl7YWY9YWMuZGF0YX1lbHNle2lmKCF0aGlzLl9zdGFjayl7YWY9dGhpcy5kYXRhfWVsc2V7YWY9dGhpcy5fcGxvdERhdGF9fWFkPWFjLmdyaWREYXRhfHx0aGlzLnJlbmRlcmVyLm1ha2VHcmlkRGF0YS5jYWxsKHRoaXMsYWYsYWcpO2lmKHRoaXMuX3R5cGU9PT0ibGluZSImJnRoaXMucmVuZGVyZXIuc21vb3RoJiZ0aGlzLnJlbmRlcmVyLl9zbW9vdGhlZERhdGEubGVuZ3RoKXthZD10aGlzLnJlbmRlcmVyLl9zbW9vdGhlZERhdGF9dGhpcy5yZW5kZXJlci5kcmF3LmNhbGwodGhpcyxhaCxhZCxhYyxhZyl9Zm9yKGFiPTA7YWI8SC5qcXBsb3QucG9zdERyYXdTZXJpZXNIb29rcy5sZW5ndGg7YWIrKyl7SC5qcXBsb3QucG9zdERyYXdTZXJpZXNIb29rc1thYl0uY2FsbCh0aGlzLGFoLGFjLGFnKX1haD1hZT1hZz1hYj1hZj1hZD1udWxsfTtPLnByb3RvdHlwZS5kcmF3U2hhZG93PWZ1bmN0aW9uKGFoLGFlLGFnKXt2YXIgYWM9KGFlPT1yKT97fTphZTthaD0oYWg9PXIpP3RoaXMuc2hhZG93Q2FudmFzLl9jdHg6YWg7dmFyIGFiLGFmLGFkO2ZvcihhYj0wO2FiPEguanFwbG90LnByZURyYXdTZXJpZXNTaGFkb3dIb29rcy5sZW5ndGg7YWIrKyl7SC5qcXBsb3QucHJlRHJhd1Nlcmllc1NoYWRvd0hvb2tzW2FiXS5jYWxsKHRoaXMsYWgsYWMpfWlmKHRoaXMuc2hhZG93KXt0aGlzLnJlbmRlcmVyLnNldEdyaWREYXRhLmNhbGwodGhpcyxhZyk7YWY9W107aWYoYWMuZGF0YSl7YWY9YWMuZGF0YX1lbHNle2lmKCF0aGlzLl9zdGFjayl7YWY9dGhpcy5kYXRhfWVsc2V7YWY9dGhpcy5fcGxvdERhdGF9fWFkPWFjLmdyaWREYXRhfHx0aGlzLnJlbmRlcmVyLm1ha2VHcmlkRGF0YS5jYWxsKHRoaXMsYWYsYWcpO3RoaXMucmVuZGVyZXIuZHJhd1NoYWRvdy5jYWxsKHRoaXMsYWgsYWQsYWMpfWZvcihhYj0wO2FiPEguanFwbG90LnBvc3REcmF3U2VyaWVzU2hhZG93SG9va3MubGVuZ3RoO2FiKyspe0guanFwbG90LnBvc3REcmF3U2VyaWVzU2hhZG93SG9va3NbYWJdLmNhbGwodGhpcyxhaCxhYyl9YWg9YWU9YWc9YWI9YWY9YWQ9bnVsbH07Ty5wcm90b3R5cGUudG9nZ2xlRGlzcGxheT1mdW5jdGlvbihhYyl7dmFyIGFiLGFkO2lmKGFjLmRhdGEuc2VyaWVzKXthYj1hYy5kYXRhLnNlcmllc31lbHNle2FiPXRoaXN9aWYoYWMuZGF0YS5zcGVlZCl7YWQ9YWMuZGF0YS5zcGVlZH1pZihhZCl7aWYoYWIuY2FudmFzLl9lbGVtLmlzKCI6aGlkZGVuIikpe2FiLmNhbnZhcy5fZWxlbS5yZW1vdmVDbGFzcygianFwbG90LXNlcmllcy1oaWRkZW4iKTtpZihhYi5zaGFkb3dDYW52YXMuX2VsZW0pe2FiLnNoYWRvd0NhbnZhcy5fZWxlbS5mYWRlSW4oYWQpfWFiLmNhbnZhcy5fZWxlbS5mYWRlSW4oYWQpO2FiLmNhbnZhcy5fZWxlbS5uZXh0QWxsKCIuanFwbG90LXBvaW50LWxhYmVsLmpxcGxvdC1zZXJpZXMtIithYi5pbmRleCkuZmFkZUluKGFkKX1lbHNle2FiLmNhbnZhcy5fZWxlbS5hZGRDbGFzcygianFwbG90LXNlcmllcy1oaWRkZW4iKTtpZihhYi5zaGFkb3dDYW52YXMuX2VsZW0pe2FiLnNoYWRvd0NhbnZhcy5fZWxlbS5mYWRlT3V0KGFkKX1hYi5jYW52YXMuX2VsZW0uZmFkZU91dChhZCk7YWIuY2FudmFzLl9lbGVtLm5leHRBbGwoIi5qcXBsb3QtcG9pbnQtbGFiZWwuanFwbG90LXNlcmllcy0iK2FiLmluZGV4KS5mYWRlT3V0KGFkKX19ZWxzZXtpZihhYi5jYW52YXMuX2VsZW0uaXMoIjpoaWRkZW4iKSl7YWIuY2FudmFzLl9lbGVtLnJlbW92ZUNsYXNzKCJqcXBsb3Qtc2VyaWVzLWhpZGRlbiIpO2lmKGFiLnNoYWRvd0NhbnZhcy5fZWxlbSl7YWIuc2hhZG93Q2FudmFzLl9lbGVtLnNob3coKX1hYi5jYW52YXMuX2VsZW0uc2hvdygpO2FiLmNhbnZhcy5fZWxlbS5uZXh0QWxsKCIuanFwbG90LXBvaW50LWxhYmVsLmpxcGxvdC1zZXJpZXMtIithYi5pbmRleCkuc2hvdygpfWVsc2V7YWIuY2FudmFzLl9lbGVtLmFkZENsYXNzKCJqcXBsb3Qtc2VyaWVzLWhpZGRlbiIpO2lmKGFiLnNoYWRvd0NhbnZhcy5fZWxlbSl7YWIuc2hhZG93Q2FudmFzLl9lbGVtLmhpZGUoKX1hYi5jYW52YXMuX2VsZW0uaGlkZSgpO2FiLmNhbnZhcy5fZWxlbS5uZXh0QWxsKCIuanFwbG90LXBvaW50LWxhYmVsLmpxcGxvdC1zZXJpZXMtIithYi5pbmRleCkuaGlkZSgpfX19O2Z1bmN0aW9uIEkoKXtILmpxcGxvdC5FbGVtQ29udGFpbmVyLmNhbGwodGhpcyk7dGhpcy5kcmF3R3JpZGxpbmVzPXRydWU7dGhpcy5ncmlkTGluZUNvbG9yPSIjY2NjY2NjIjt0aGlzLmdyaWRMaW5lV2lkdGg9MTt0aGlzLmJhY2tncm91bmQ9IiNmZmZkZjYiO3RoaXMuYm9yZGVyQ29sb3I9IiM5OTk5OTkiO3RoaXMuYm9yZGVyV2lkdGg9Mjt0aGlzLmRyYXdCb3JkZXI9dHJ1ZTt0aGlzLnNoYWRvdz10cnVlO3RoaXMuc2hhZG93QW5nbGU9NDU7dGhpcy5zaGFkb3dPZmZzZXQ9MS41O3RoaXMuc2hhZG93V2lkdGg9Mzt0aGlzLnNoYWRvd0RlcHRoPTM7dGhpcy5zaGFkb3dDb2xvcj1udWxsO3RoaXMuc2hhZG93QWxwaGE9IjAuMDciO3RoaXMuX2xlZnQ7dGhpcy5fdG9wO3RoaXMuX3JpZ2h0O3RoaXMuX2JvdHRvbTt0aGlzLl93aWR0aDt0aGlzLl9oZWlnaHQ7dGhpcy5fYXhlcz1bXTt0aGlzLnJlbmRlcmVyPUguanFwbG90LkNhbnZhc0dyaWRSZW5kZXJlcjt0aGlzLnJlbmRlcmVyT3B0aW9ucz17fTt0aGlzLl9vZmZzZXRzPXt0b3A6bnVsbCxib3R0b206bnVsbCxsZWZ0Om51bGwscmlnaHQ6bnVsbH19SS5wcm90b3R5cGU9bmV3IEguanFwbG90LkVsZW1Db250YWluZXIoKTtJLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1JO0kucHJvdG90eXBlLmluaXQ9ZnVuY3Rpb24oKXt0aGlzLnJlbmRlcmVyPW5ldyB0aGlzLnJlbmRlcmVyKCk7dGhpcy5yZW5kZXJlci5pbml0LmNhbGwodGhpcyx0aGlzLnJlbmRlcmVyT3B0aW9ucyl9O0kucHJvdG90eXBlLmNyZWF0ZUVsZW1lbnQ9ZnVuY3Rpb24oYWIsYWMpe3RoaXMuX29mZnNldHM9YWI7cmV0dXJuIHRoaXMucmVuZGVyZXIuY3JlYXRlRWxlbWVudC5jYWxsKHRoaXMsYWMpfTtJLnByb3RvdHlwZS5kcmF3PWZ1bmN0aW9uKCl7dGhpcy5yZW5kZXJlci5kcmF3LmNhbGwodGhpcyl9O0guanFwbG90LkdlbmVyaWNDYW52YXM9ZnVuY3Rpb24oKXtILmpxcGxvdC5FbGVtQ29udGFpbmVyLmNhbGwodGhpcyk7dGhpcy5fY3R4fTtILmpxcGxvdC5HZW5lcmljQ2FudmFzLnByb3RvdHlwZT1uZXcgSC5qcXBsb3QuRWxlbUNvbnRhaW5lcigpO0guanFwbG90LkdlbmVyaWNDYW52YXMucHJvdG90eXBlLmNvbnN0cnVjdG9yPUguanFwbG90LkdlbmVyaWNDYW52YXM7SC5qcXBsb3QuR2VuZXJpY0NhbnZhcy5wcm90b3R5cGUuY3JlYXRlRWxlbWVudD1mdW5jdGlvbihhZixhZCxhYyxhZyl7dGhpcy5fb2Zmc2V0cz1hZjt2YXIgYWI9ImpxcGxvdCI7aWYoYWQhPXIpe2FiPWFkfXZhciBhZTthZT1hZy5jYW52YXNNYW5hZ2VyLmdldENhbnZhcygpO2lmKGFjIT1udWxsKXt0aGlzLl9wbG90RGltZW5zaW9ucz1hY31hZS53aWR0aD10aGlzLl9wbG90RGltZW5zaW9ucy53aWR0aC10aGlzLl9vZmZzZXRzLmxlZnQtdGhpcy5fb2Zmc2V0cy5yaWdodDthZS5oZWlnaHQ9dGhpcy5fcGxvdERpbWVuc2lvbnMuaGVpZ2h0LXRoaXMuX29mZnNldHMudG9wLXRoaXMuX29mZnNldHMuYm90dG9tO3RoaXMuX2VsZW09SChhZSk7dGhpcy5fZWxlbS5jc3Moe3Bvc2l0aW9uOiJhYnNvbHV0ZSIsbGVmdDp0aGlzLl9vZmZzZXRzLmxlZnQsdG9wOnRoaXMuX29mZnNldHMudG9wfSk7dGhpcy5fZWxlbS5hZGRDbGFzcyhhYik7YWU9YWcuY2FudmFzTWFuYWdlci5pbml0Q2FudmFzKGFlKTthZT1udWxsO3JldHVybiB0aGlzLl9lbGVtfTtILmpxcGxvdC5HZW5lcmljQ2FudmFzLnByb3RvdHlwZS5zZXRDb250ZXh0PWZ1bmN0aW9uKCl7dGhpcy5fY3R4PXRoaXMuX2VsZW0uZ2V0KDApLmdldENvbnRleHQoIjJkIik7cmV0dXJuIHRoaXMuX2N0eH07SC5qcXBsb3QuR2VuZXJpY0NhbnZhcy5wcm90b3R5cGUucmVzZXRDYW52YXM9ZnVuY3Rpb24oKXtpZih0aGlzLl9lbGVtKXtpZihILmpxcGxvdC51c2VfZXhjYW52YXMmJndpbmRvdy5HX3ZtbENhbnZhc01hbmFnZXIudW5pbml0RWxlbWVudCE9PXIpe3dpbmRvdy5HX3ZtbENhbnZhc01hbmFnZXIudW5pbml0RWxlbWVudCh0aGlzLl9lbGVtLmdldCgwKSl9dGhpcy5fZWxlbS5lbXB0eUZvcmNlKCl9dGhpcy5fY3R4PW51bGx9O0guanFwbG90Lkhvb2tzTWFuYWdlcj1mdW5jdGlvbigpe3RoaXMuaG9va3M9W107dGhpcy5hcmdzPVtdfTtILmpxcGxvdC5Ib29rc01hbmFnZXIucHJvdG90eXBlLmFkZE9uY2U9ZnVuY3Rpb24oYWUsYWMpe2FjPWFjfHxbXTt2YXIgYWY9ZmFsc2U7Zm9yKHZhciBhZD0wLGFiPXRoaXMuaG9va3MubGVuZ3RoO2FkPGFiO2FkKyspe2lmKHRoaXMuaG9va3NbYWRdWzBdPT1hZSl7YWY9dHJ1ZX19aWYoIWFmKXt0aGlzLmhvb2tzLnB1c2goYWUpO3RoaXMuYXJncy5wdXNoKGFjKX19O0guanFwbG90Lkhvb2tzTWFuYWdlci5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKGFjLGFiKXthYj1hYnx8W107dGhpcy5ob29rcy5wdXNoKGFjKTt0aGlzLmFyZ3MucHVzaChhYil9O0guanFwbG90LkV2ZW50TGlzdGVuZXJNYW5hZ2VyPWZ1bmN0aW9uKCl7dGhpcy5ob29rcz1bXX07SC5qcXBsb3QuRXZlbnRMaXN0ZW5lck1hbmFnZXIucHJvdG90eXBlLmFkZE9uY2U9ZnVuY3Rpb24oYWYsYWUpe3ZhciBhZz1mYWxzZSxhZCxhYztmb3IodmFyIGFjPTAsYWI9dGhpcy5ob29rcy5sZW5ndGg7YWM8YWI7YWMrKyl7YWQ9dGhpcy5ob29rc1thY107aWYoYWRbMF09PWFmJiZhZFsxXT09YWUpe2FnPXRydWV9fWlmKCFhZyl7dGhpcy5ob29rcy5wdXNoKFthZixhZV0pfX07SC5qcXBsb3QuRXZlbnRMaXN0ZW5lck1hbmFnZXIucHJvdG90eXBlLmFkZD1mdW5jdGlvbihhYyxhYil7dGhpcy5ob29rcy5wdXNoKFthYyxhYl0pfTt2YXIgUT1bInlNaWRBeGlzIiwieGF4aXMiLCJ5YXhpcyIsIngyYXhpcyIsInkyYXhpcyIsInkzYXhpcyIsInk0YXhpcyIsInk1YXhpcyIsInk2YXhpcyIsInk3YXhpcyIsInk4YXhpcyIsInk5YXhpcyJdO2Z1bmN0aW9uIE4oKXt0aGlzLmFuaW1hdGU9ZmFsc2U7dGhpcy5hbmltYXRlUmVwbG90PWZhbHNlO3RoaXMuYXhlcz17eGF4aXM6bmV3IHMoInhheGlzIikseWF4aXM6bmV3IHMoInlheGlzIikseDJheGlzOm5ldyBzKCJ4MmF4aXMiKSx5MmF4aXM6bmV3IHMoInkyYXhpcyIpLHkzYXhpczpuZXcgcygieTNheGlzIikseTRheGlzOm5ldyBzKCJ5NGF4aXMiKSx5NWF4aXM6bmV3IHMoInk1YXhpcyIpLHk2YXhpczpuZXcgcygieTZheGlzIikseTdheGlzOm5ldyBzKCJ5N2F4aXMiKSx5OGF4aXM6bmV3IHMoInk4YXhpcyIpLHk5YXhpczpuZXcgcygieTlheGlzIikseU1pZEF4aXM6bmV3IHMoInlNaWRBeGlzIil9O3RoaXMuYmFzZUNhbnZhcz1uZXcgSC5qcXBsb3QuR2VuZXJpY0NhbnZhcygpO3RoaXMuY2FwdHVyZVJpZ2h0Q2xpY2s9ZmFsc2U7dGhpcy5kYXRhPVtdO3RoaXMuZGF0YVJlbmRlcmVyO3RoaXMuZGF0YVJlbmRlcmVyT3B0aW9uczt0aGlzLmRlZmF1bHRzPXtheGVzRGVmYXVsdHM6e30sYXhlczp7eGF4aXM6e30seWF4aXM6e30seDJheGlzOnt9LHkyYXhpczp7fSx5M2F4aXM6e30seTRheGlzOnt9LHk1YXhpczp7fSx5NmF4aXM6e30seTdheGlzOnt9LHk4YXhpczp7fSx5OWF4aXM6e30seU1pZEF4aXM6e319LHNlcmllc0RlZmF1bHRzOnt9LHNlcmllczpbXX07dGhpcy5kZWZhdWx0QXhpc1N0YXJ0PTE7dGhpcy5kcmF3SWZIaWRkZW49ZmFsc2U7dGhpcy5ldmVudENhbnZhcz1uZXcgSC5qcXBsb3QuR2VuZXJpY0NhbnZhcygpO3RoaXMuZmlsbEJldHdlZW49e3NlcmllczE6bnVsbCxzZXJpZXMyOm51bGwsY29sb3I6bnVsbCxiYXNlU2VyaWVzOjAsZmlsbDp0cnVlfTt0aGlzLmZvbnRGYW1pbHk7dGhpcy5mb250U2l6ZTt0aGlzLmdyaWQ9bmV3IEkoKTt0aGlzLmxlZ2VuZD1uZXcgbigpO3RoaXMubmVnYXRpdmVTZXJpZXNDb2xvcnM9SC5qcXBsb3QuY29uZmlnLmRlZmF1bHROZWdhdGl2ZUNvbG9yczt0aGlzLm5vRGF0YUluZGljYXRvcj17c2hvdzpmYWxzZSxpbmRpY2F0b3I6IkxvYWRpbmcgRGF0YS4uLiIsYXhlczp7eGF4aXM6e21pbjowLG1heDoxMCx0aWNrSW50ZXJ2YWw6MixzaG93OnRydWV9LHlheGlzOnttaW46MCxtYXg6MTIsdGlja0ludGVydmFsOjMsc2hvdzp0cnVlfX19O3RoaXMub3B0aW9ucz17fTt0aGlzLnByZXZpb3VzU2VyaWVzU3RhY2s9W107dGhpcy5wbHVnaW5zPXt9O3RoaXMuc2VyaWVzPVtdO3RoaXMuc2VyaWVzU3RhY2s9W107dGhpcy5zZXJpZXNDb2xvcnM9SC5qcXBsb3QuY29uZmlnLmRlZmF1bHRDb2xvcnM7dGhpcy5zb3J0RGF0YT10cnVlO3RoaXMuc3RhY2tTZXJpZXM9ZmFsc2U7dGhpcy5zeW5jWFRpY2tzPXRydWU7dGhpcy5zeW5jWVRpY2tzPXRydWU7dGhpcy50YXJnZXQ9bnVsbDt0aGlzLnRhcmdldElkPW51bGw7dGhpcy50ZXh0Q29sb3I7dGhpcy50aXRsZT1uZXcgdSgpO3RoaXMuX2RyYXdDb3VudD0wO3RoaXMuX3N1bXk9MDt0aGlzLl9zdW14PTA7dGhpcy5fc3RhY2tEYXRhPVtdO3RoaXMuX3Bsb3REYXRhPVtdO3RoaXMuX3dpZHRoPW51bGw7dGhpcy5faGVpZ2h0PW51bGw7dGhpcy5fcGxvdERpbWVuc2lvbnM9e2hlaWdodDpudWxsLHdpZHRoOm51bGx9O3RoaXMuX2dyaWRQYWRkaW5nPXt0b3A6bnVsbCxyaWdodDpudWxsLGJvdHRvbTpudWxsLGxlZnQ6bnVsbH07dGhpcy5fZGVmYXVsdEdyaWRQYWRkaW5nPXt0b3A6MTAscmlnaHQ6MTAsYm90dG9tOjIzLGxlZnQ6MTB9O3RoaXMuX2FkZERvbVJlZmVyZW5jZT1ILmpxcGxvdC5jb25maWcuYWRkRG9tUmVmZXJlbmNlO3RoaXMucHJlSW5pdEhvb2tzPW5ldyBILmpxcGxvdC5Ib29rc01hbmFnZXIoKTt0aGlzLnBvc3RJbml0SG9va3M9bmV3IEguanFwbG90Lkhvb2tzTWFuYWdlcigpO3RoaXMucHJlUGFyc2VPcHRpb25zSG9va3M9bmV3IEguanFwbG90Lkhvb2tzTWFuYWdlcigpO3RoaXMucG9zdFBhcnNlT3B0aW9uc0hvb2tzPW5ldyBILmpxcGxvdC5Ib29rc01hbmFnZXIoKTt0aGlzLnByZURyYXdIb29rcz1uZXcgSC5qcXBsb3QuSG9va3NNYW5hZ2VyKCk7dGhpcy5wb3N0RHJhd0hvb2tzPW5ldyBILmpxcGxvdC5Ib29rc01hbmFnZXIoKTt0aGlzLnByZURyYXdTZXJpZXNIb29rcz1uZXcgSC5qcXBsb3QuSG9va3NNYW5hZ2VyKCk7dGhpcy5wb3N0RHJhd1Nlcmllc0hvb2tzPW5ldyBILmpxcGxvdC5Ib29rc01hbmFnZXIoKTt0aGlzLnByZURyYXdMZWdlbmRIb29rcz1uZXcgSC5qcXBsb3QuSG9va3NNYW5hZ2VyKCk7dGhpcy5hZGRMZWdlbmRSb3dIb29rcz1uZXcgSC5qcXBsb3QuSG9va3NNYW5hZ2VyKCk7dGhpcy5wcmVTZXJpZXNJbml0SG9va3M9bmV3IEguanFwbG90Lkhvb2tzTWFuYWdlcigpO3RoaXMucG9zdFNlcmllc0luaXRIb29rcz1uZXcgSC5qcXBsb3QuSG9va3NNYW5hZ2VyKCk7dGhpcy5wcmVQYXJzZVNlcmllc09wdGlvbnNIb29rcz1uZXcgSC5qcXBsb3QuSG9va3NNYW5hZ2VyKCk7dGhpcy5wb3N0UGFyc2VTZXJpZXNPcHRpb25zSG9va3M9bmV3IEguanFwbG90Lkhvb2tzTWFuYWdlcigpO3RoaXMuZXZlbnRMaXN0ZW5lckhvb2tzPW5ldyBILmpxcGxvdC5FdmVudExpc3RlbmVyTWFuYWdlcigpO3RoaXMucHJlRHJhd1Nlcmllc1NoYWRvd0hvb2tzPW5ldyBILmpxcGxvdC5Ib29rc01hbmFnZXIoKTt0aGlzLnBvc3REcmF3U2VyaWVzU2hhZG93SG9va3M9bmV3IEguanFwbG90Lkhvb2tzTWFuYWdlcigpO3RoaXMuY29sb3JHZW5lcmF0b3I9bmV3IEguanFwbG90LkNvbG9yR2VuZXJhdG9yKCk7dGhpcy5uZWdhdGl2ZUNvbG9yR2VuZXJhdG9yPW5ldyBILmpxcGxvdC5Db2xvckdlbmVyYXRvcigpO3RoaXMuY2FudmFzTWFuYWdlcj1uZXcgSC5qcXBsb3QuQ2FudmFzTWFuYWdlcigpO3RoaXMudGhlbWVFbmdpbmU9bmV3IEguanFwbG90LlRoZW1lRW5naW5lKCk7dmFyIGFkPTA7dGhpcy5pbml0PWZ1bmN0aW9uKGFtLGFqLGFvKXthbz1hb3x8e307Zm9yKHZhciBhaz0wO2FrPEguanFwbG90LnByZUluaXRIb29rcy5sZW5ndGg7YWsrKyl7SC5qcXBsb3QucHJlSW5pdEhvb2tzW2FrXS5jYWxsKHRoaXMsYW0sYWosYW8pfWZvcih2YXIgYWs9MDthazx0aGlzLnByZUluaXRIb29rcy5ob29rcy5sZW5ndGg7YWsrKyl7dGhpcy5wcmVJbml0SG9va3MuaG9va3NbYWtdLmNhbGwodGhpcyxhbSxhaixhbyl9dGhpcy50YXJnZXRJZD0iIyIrYW07dGhpcy50YXJnZXQ9SCgiIyIrYW0pO2lmKHRoaXMuX2FkZERvbVJlZmVyZW5jZSl7dGhpcy50YXJnZXQuZGF0YSgianFwbG90X3Bsb3QiLHRoaXMpfXRoaXMudGFyZ2V0LnJlbW92ZUNsYXNzKCJqcXBsb3QtZXJyb3IiKTtpZighdGhpcy50YXJnZXQuZ2V0KDApKXt0aHJvdyJObyBwbG90IHRhcmdldCBzcGVjaWZpZWQifWlmKHRoaXMudGFyZ2V0LmNzcygicG9zaXRpb24iKT09InN0YXRpYyIpe3RoaXMudGFyZ2V0LmNzcygicG9zaXRpb24iLCJyZWxhdGl2ZSIpfWlmKCF0aGlzLnRhcmdldC5oYXNDbGFzcygianFwbG90LXRhcmdldCIpKXt0aGlzLnRhcmdldC5hZGRDbGFzcygianFwbG90LXRhcmdldCIpfWlmKCF0aGlzLnRhcmdldC5oZWlnaHQoKSl7dmFyIGFsO2lmKGFvJiZhby5oZWlnaHQpe2FsPXBhcnNlSW50KGFvLmhlaWdodCwxMCl9ZWxzZXtpZih0aGlzLnRhcmdldC5hdHRyKCJkYXRhLWhlaWdodCIpKXthbD1wYXJzZUludCh0aGlzLnRhcmdldC5hdHRyKCJkYXRhLWhlaWdodCIpLDEwKX1lbHNle2FsPXBhcnNlSW50KEguanFwbG90LmNvbmZpZy5kZWZhdWx0SGVpZ2h0LDEwKX19dGhpcy5faGVpZ2h0PWFsO3RoaXMudGFyZ2V0LmNzcygiaGVpZ2h0IixhbCsicHgiKX1lbHNle3RoaXMuX2hlaWdodD1hbD10aGlzLnRhcmdldC5oZWlnaHQoKX1pZighdGhpcy50YXJnZXQud2lkdGgoKSl7dmFyIGFuO2lmKGFvJiZhby53aWR0aCl7YW49cGFyc2VJbnQoYW8ud2lkdGgsMTApfWVsc2V7aWYodGhpcy50YXJnZXQuYXR0cigiZGF0YS13aWR0aCIpKXthbj1wYXJzZUludCh0aGlzLnRhcmdldC5hdHRyKCJkYXRhLXdpZHRoIiksMTApfWVsc2V7YW49cGFyc2VJbnQoSC5qcXBsb3QuY29uZmlnLmRlZmF1bHRXaWR0aCwxMCl9fXRoaXMuX3dpZHRoPWFuO3RoaXMudGFyZ2V0LmNzcygid2lkdGgiLGFuKyJweCIpfWVsc2V7dGhpcy5fd2lkdGg9YW49dGhpcy50YXJnZXQud2lkdGgoKX10aGlzLl9wbG90RGltZW5zaW9ucy5oZWlnaHQ9dGhpcy5faGVpZ2h0O3RoaXMuX3Bsb3REaW1lbnNpb25zLndpZHRoPXRoaXMuX3dpZHRoO3RoaXMuZ3JpZC5fcGxvdERpbWVuc2lvbnM9dGhpcy5fcGxvdERpbWVuc2lvbnM7dGhpcy50aXRsZS5fcGxvdERpbWVuc2lvbnM9dGhpcy5fcGxvdERpbWVuc2lvbnM7dGhpcy5iYXNlQ2FudmFzLl9wbG90RGltZW5zaW9ucz10aGlzLl9wbG90RGltZW5zaW9uczt0aGlzLmV2ZW50Q2FudmFzLl9wbG90RGltZW5zaW9ucz10aGlzLl9wbG90RGltZW5zaW9uczt0aGlzLmxlZ2VuZC5fcGxvdERpbWVuc2lvbnM9dGhpcy5fcGxvdERpbWVuc2lvbnM7aWYodGhpcy5faGVpZ2h0PD0wfHx0aGlzLl93aWR0aDw9MHx8IXRoaXMuX2hlaWdodHx8IXRoaXMuX3dpZHRoKXt0aHJvdyJDYW52YXMgZGltZW5zaW9uIG5vdCBzZXQifWlmKGFvLmRhdGFSZW5kZXJlciYmalF1ZXJ5LmlzRnVuY3Rpb24oYW8uZGF0YVJlbmRlcmVyKSl7aWYoYW8uZGF0YVJlbmRlcmVyT3B0aW9ucyl7dGhpcy5kYXRhUmVuZGVyZXJPcHRpb25zPWFvLmRhdGFSZW5kZXJlck9wdGlvbnN9dGhpcy5kYXRhUmVuZGVyZXI9YW8uZGF0YVJlbmRlcmVyO2FqPXRoaXMuZGF0YVJlbmRlcmVyKGFqLHRoaXMsdGhpcy5kYXRhUmVuZGVyZXJPcHRpb25zKX1pZihhby5ub0RhdGFJbmRpY2F0b3ImJmpRdWVyeS5pc1BsYWluT2JqZWN0KGFvLm5vRGF0YUluZGljYXRvcikpe0guZXh0ZW5kKHRydWUsdGhpcy5ub0RhdGFJbmRpY2F0b3IsYW8ubm9EYXRhSW5kaWNhdG9yKX1pZihhaj09bnVsbHx8alF1ZXJ5LmlzQXJyYXkoYWopPT1mYWxzZXx8YWoubGVuZ3RoPT0wfHxqUXVlcnkuaXNBcnJheShhalswXSk9PWZhbHNlfHxhalswXS5sZW5ndGg9PTApe2lmKHRoaXMubm9EYXRhSW5kaWNhdG9yLnNob3c9PWZhbHNlKXt0aHJvdyB7bmFtZToiRGF0YUVycm9yIixtZXNzYWdlOiJObyBkYXRhIHRvIHBsb3QuIn19ZWxzZXtmb3IodmFyIGFmIGluIHRoaXMubm9EYXRhSW5kaWNhdG9yLmF4ZXMpe2Zvcih2YXIgYWggaW4gdGhpcy5ub0RhdGFJbmRpY2F0b3IuYXhlc1thZl0pe3RoaXMuYXhlc1thZl1bYWhdPXRoaXMubm9EYXRhSW5kaWNhdG9yLmF4ZXNbYWZdW2FoXX19dGhpcy5wb3N0RHJhd0hvb2tzLmFkZChmdW5jdGlvbigpe3ZhciBhdj10aGlzLmV2ZW50Q2FudmFzLmdldEhlaWdodCgpO3ZhciBhcj10aGlzLmV2ZW50Q2FudmFzLmdldFdpZHRoKCk7dmFyIGFxPUgoJzxkaXYgY2xhc3M9ImpxcGxvdC1ub0RhdGEtY29udGFpbmVyIiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7Ij48L2Rpdj4nKTt0aGlzLnRhcmdldC5hcHBlbmQoYXEpO2FxLmhlaWdodChhdik7YXEud2lkdGgoYXIpO2FxLmNzcygidG9wIix0aGlzLmV2ZW50Q2FudmFzLl9vZmZzZXRzLnRvcCk7YXEuY3NzKCJsZWZ0Iix0aGlzLmV2ZW50Q2FudmFzLl9vZmZzZXRzLmxlZnQpO3ZhciBhdT1IKCc8ZGl2IGNsYXNzPSJqcXBsb3Qtbm9EYXRhLWNvbnRlbnRzIiBzdHlsZT0idGV4dC1hbGlnbjpjZW50ZXI7IHBvc2l0aW9uOnJlbGF0aXZlOyBtYXJnaW4tbGVmdDphdXRvOyBtYXJnaW4tcmlnaHQ6YXV0bzsiPjwvZGl2PicpO2FxLmFwcGVuZChhdSk7YXUuaHRtbCh0aGlzLm5vRGF0YUluZGljYXRvci5pbmRpY2F0b3IpO3ZhciBhdD1hdS5oZWlnaHQoKTt2YXIgYXA9YXUud2lkdGgoKTthdS5oZWlnaHQoYXQpO2F1LndpZHRoKGFwKTthdS5jc3MoInRvcCIsKGF2LWF0KS8yKyJweCIpfSl9fXRoaXMuZGF0YT1hajt0aGlzLnBhcnNlT3B0aW9ucyhhbyk7aWYodGhpcy50ZXh0Q29sb3Ipe3RoaXMudGFyZ2V0LmNzcygiY29sb3IiLHRoaXMudGV4dENvbG9yKX1pZih0aGlzLmZvbnRGYW1pbHkpe3RoaXMudGFyZ2V0LmNzcygiZm9udC1mYW1pbHkiLHRoaXMuZm9udEZhbWlseSl9aWYodGhpcy5mb250U2l6ZSl7dGhpcy50YXJnZXQuY3NzKCJmb250LXNpemUiLHRoaXMuZm9udFNpemUpfXRoaXMudGl0bGUuaW5pdCgpO3RoaXMubGVnZW5kLmluaXQoKTt0aGlzLl9zdW15PTA7dGhpcy5fc3VteD0wO2Zvcih2YXIgYWs9MDthazx0aGlzLnNlcmllcy5sZW5ndGg7YWsrKyl7dGhpcy5zZXJpZXNTdGFjay5wdXNoKGFrKTt0aGlzLnByZXZpb3VzU2VyaWVzU3RhY2sucHVzaChhayk7dGhpcy5zZXJpZXNbYWtdLnNoYWRvd0NhbnZhcy5fcGxvdERpbWVuc2lvbnM9dGhpcy5fcGxvdERpbWVuc2lvbnM7dGhpcy5zZXJpZXNbYWtdLmNhbnZhcy5fcGxvdERpbWVuc2lvbnM9dGhpcy5fcGxvdERpbWVuc2lvbnM7Zm9yKHZhciBhaT0wO2FpPEguanFwbG90LnByZVNlcmllc0luaXRIb29rcy5sZW5ndGg7YWkrKyl7SC5qcXBsb3QucHJlU2VyaWVzSW5pdEhvb2tzW2FpXS5jYWxsKHRoaXMuc2VyaWVzW2FrXSxhbSxhaix0aGlzLm9wdGlvbnMuc2VyaWVzRGVmYXVsdHMsdGhpcy5vcHRpb25zLnNlcmllc1tha10sdGhpcyl9Zm9yKHZhciBhaT0wO2FpPHRoaXMucHJlU2VyaWVzSW5pdEhvb2tzLmhvb2tzLmxlbmd0aDthaSsrKXt0aGlzLnByZVNlcmllc0luaXRIb29rcy5ob29rc1thaV0uY2FsbCh0aGlzLnNlcmllc1tha10sYW0sYWosdGhpcy5vcHRpb25zLnNlcmllc0RlZmF1bHRzLHRoaXMub3B0aW9ucy5zZXJpZXNbYWtdLHRoaXMpfXRoaXMucG9wdWxhdGVQbG90RGF0YSh0aGlzLnNlcmllc1tha10sYWspO3RoaXMuc2VyaWVzW2FrXS5fcGxvdERpbWVuc2lvbnM9dGhpcy5fcGxvdERpbWVuc2lvbnM7dGhpcy5zZXJpZXNbYWtdLmluaXQoYWssdGhpcy5ncmlkLmJvcmRlcldpZHRoLHRoaXMpO2Zvcih2YXIgYWk9MDthaTxILmpxcGxvdC5wb3N0U2VyaWVzSW5pdEhvb2tzLmxlbmd0aDthaSsrKXtILmpxcGxvdC5wb3N0U2VyaWVzSW5pdEhvb2tzW2FpXS5jYWxsKHRoaXMuc2VyaWVzW2FrXSxhbSxhaix0aGlzLm9wdGlvbnMuc2VyaWVzRGVmYXVsdHMsdGhpcy5vcHRpb25zLnNlcmllc1tha10sdGhpcyl9Zm9yKHZhciBhaT0wO2FpPHRoaXMucG9zdFNlcmllc0luaXRIb29rcy5ob29rcy5sZW5ndGg7YWkrKyl7dGhpcy5wb3N0U2VyaWVzSW5pdEhvb2tzLmhvb2tzW2FpXS5jYWxsKHRoaXMuc2VyaWVzW2FrXSxhbSxhaix0aGlzLm9wdGlvbnMuc2VyaWVzRGVmYXVsdHMsdGhpcy5vcHRpb25zLnNlcmllc1tha10sdGhpcyl9dGhpcy5fc3VteSs9dGhpcy5zZXJpZXNbYWtdLl9zdW15O3RoaXMuX3N1bXgrPXRoaXMuc2VyaWVzW2FrXS5fc3VteH12YXIgYWc7Zm9yKHZhciBhaz0wO2FrPDEyO2FrKyspe2FnPVFbYWtdO3RoaXMuYXhlc1thZ10uX3Bsb3REaW1lbnNpb25zPXRoaXMuX3Bsb3REaW1lbnNpb25zO3RoaXMuYXhlc1thZ10uaW5pdCgpO2lmKHRoaXMuYXhlc1thZ10uYm9yZGVyQ29sb3I9PW51bGwpe2lmKGFnLmNoYXJBdCgwKSE9PSJ4IiYmdGhpcy5heGVzW2FnXS51c2VTZXJpZXNDb2xvcj09PXRydWUmJnRoaXMuYXhlc1thZ10uc2hvdyl7dGhpcy5heGVzW2FnXS5ib3JkZXJDb2xvcj10aGlzLmF4ZXNbYWddLl9zZXJpZXNbMF0uY29sb3J9ZWxzZXt0aGlzLmF4ZXNbYWddLmJvcmRlckNvbG9yPXRoaXMuZ3JpZC5ib3JkZXJDb2xvcn19fWlmKHRoaXMuc29ydERhdGEpe2FiKHRoaXMuc2VyaWVzKX10aGlzLmdyaWQuaW5pdCgpO3RoaXMuZ3JpZC5fYXhlcz10aGlzLmF4ZXM7dGhpcy5sZWdlbmQuX3Nlcmllcz10aGlzLnNlcmllcztmb3IodmFyIGFrPTA7YWs8SC5qcXBsb3QucG9zdEluaXRIb29rcy5sZW5ndGg7YWsrKyl7SC5qcXBsb3QucG9zdEluaXRIb29rc1tha10uY2FsbCh0aGlzLGFtLGFqLGFvKX1mb3IodmFyIGFrPTA7YWs8dGhpcy5wb3N0SW5pdEhvb2tzLmhvb2tzLmxlbmd0aDthaysrKXt0aGlzLnBvc3RJbml0SG9va3MuaG9va3NbYWtdLmNhbGwodGhpcyxhbSxhaixhbyl9fTt0aGlzLnJlc2V0QXhlc1NjYWxlPWZ1bmN0aW9uKGFrLGFnKXt2YXIgYWk9YWd8fHt9O3ZhciBhaj1ha3x8dGhpcy5heGVzO2lmKGFqPT09dHJ1ZSl7YWo9dGhpcy5heGVzfWlmKGpRdWVyeS5pc0FycmF5KGFqKSl7Zm9yKHZhciBhaD0wO2FoPGFqLmxlbmd0aDthaCsrKXt0aGlzLmF4ZXNbYWpbYWhdXS5yZXNldFNjYWxlKGFpW2FqW2FoXV0pfX1lbHNle2lmKHR5cGVvZihhaik9PT0ib2JqZWN0Iil7Zm9yKHZhciBhZiBpbiBhail7dGhpcy5heGVzW2FmXS5yZXNldFNjYWxlKGFpW2FmXSl9fX19O3RoaXMucmVJbml0aWFsaXplPWZ1bmN0aW9uKCl7dGhpcy5faGVpZ2h0PXRoaXMudGFyZ2V0LmhlaWdodCgpO3RoaXMuX3dpZHRoPXRoaXMudGFyZ2V0LndpZHRoKCk7aWYodGhpcy5faGVpZ2h0PD0wfHx0aGlzLl93aWR0aDw9MHx8IXRoaXMuX2hlaWdodHx8IXRoaXMuX3dpZHRoKXt0aHJvdyJUYXJnZXQgZGltZW5zaW9uIG5vdCBzZXQifXRoaXMuX3Bsb3REaW1lbnNpb25zLmhlaWdodD10aGlzLl9oZWlnaHQ7dGhpcy5fcGxvdERpbWVuc2lvbnMud2lkdGg9dGhpcy5fd2lkdGg7dGhpcy5ncmlkLl9wbG90RGltZW5zaW9ucz10aGlzLl9wbG90RGltZW5zaW9uczt0aGlzLnRpdGxlLl9wbG90RGltZW5zaW9ucz10aGlzLl9wbG90RGltZW5zaW9uczt0aGlzLmJhc2VDYW52YXMuX3Bsb3REaW1lbnNpb25zPXRoaXMuX3Bsb3REaW1lbnNpb25zO3RoaXMuZXZlbnRDYW52YXMuX3Bsb3REaW1lbnNpb25zPXRoaXMuX3Bsb3REaW1lbnNpb25zO3RoaXMubGVnZW5kLl9wbG90RGltZW5zaW9ucz10aGlzLl9wbG90RGltZW5zaW9ucztmb3IodmFyIGFrIGluIHRoaXMuYXhlcyl7dGhpcy5heGVzW2FrXS5fcGxvdFdpZHRoPXRoaXMuX3dpZHRoO3RoaXMuYXhlc1tha10uX3Bsb3RIZWlnaHQ9dGhpcy5faGVpZ2h0fXRoaXMudGl0bGUuX3Bsb3RXaWR0aD10aGlzLl93aWR0aDtpZih0aGlzLnRleHRDb2xvcil7dGhpcy50YXJnZXQuY3NzKCJjb2xvciIsdGhpcy50ZXh0Q29sb3IpfWlmKHRoaXMuZm9udEZhbWlseSl7dGhpcy50YXJnZXQuY3NzKCJmb250LWZhbWlseSIsdGhpcy5mb250RmFtaWx5KX1pZih0aGlzLmZvbnRTaXplKXt0aGlzLnRhcmdldC5jc3MoImZvbnQtc2l6ZSIsdGhpcy5mb250U2l6ZSl9dGhpcy5fc3VteT0wO3RoaXMuX3N1bXg9MDtmb3IodmFyIGFpPTA7YWk8dGhpcy5zZXJpZXMubGVuZ3RoO2FpKyspe3RoaXMucG9wdWxhdGVQbG90RGF0YSh0aGlzLnNlcmllc1thaV0sYWkpO2lmKHRoaXMuc2VyaWVzW2FpXS5fdHlwZT09PSJsaW5lIiYmdGhpcy5zZXJpZXNbYWldLnJlbmRlcmVyLmJhbmRzLnNob3cpe3RoaXMuc2VyaWVzW2FpXS5yZW5kZXJlci5pbml0QmFuZHMuY2FsbCh0aGlzLnNlcmllc1thaV0sdGhpcy5zZXJpZXNbYWldLnJlbmRlcmVyLm9wdGlvbnMsdGhpcyl9dGhpcy5zZXJpZXNbYWldLl9wbG90RGltZW5zaW9ucz10aGlzLl9wbG90RGltZW5zaW9uczt0aGlzLnNlcmllc1thaV0uY2FudmFzLl9wbG90RGltZW5zaW9ucz10aGlzLl9wbG90RGltZW5zaW9uczt0aGlzLl9zdW15Kz10aGlzLnNlcmllc1thaV0uX3N1bXk7dGhpcy5fc3VteCs9dGhpcy5zZXJpZXNbYWldLl9zdW14fXZhciBhZztmb3IodmFyIGFmPTA7YWY8MTI7YWYrKyl7YWc9UVthZl07dmFyIGFoPXRoaXMuYXhlc1thZ10uX3RpY2tzO2Zvcih2YXIgYWk9MDthaTxhaC5sZW5ndGg7YWkrKyl7dmFyIGFqPWFoW2FpXS5fZWxlbTtpZihhail7aWYoSC5qcXBsb3QudXNlX2V4Y2FudmFzJiZ3aW5kb3cuR192bWxDYW52YXNNYW5hZ2VyLnVuaW5pdEVsZW1lbnQhPT1yKXt3aW5kb3cuR192bWxDYW52YXNNYW5hZ2VyLnVuaW5pdEVsZW1lbnQoYWouZ2V0KDApKX1hai5lbXB0eUZvcmNlKCk7YWo9bnVsbDthaC5fZWxlbT1udWxsfX1haD1udWxsO3RoaXMuYXhlc1thZ10uX3Bsb3REaW1lbnNpb25zPXRoaXMuX3Bsb3REaW1lbnNpb25zO3RoaXMuYXhlc1thZ10uX3RpY2tzPVtdfWlmKHRoaXMuc29ydERhdGEpe2FiKHRoaXMuc2VyaWVzKX10aGlzLmdyaWQuX2F4ZXM9dGhpcy5heGVzO3RoaXMubGVnZW5kLl9zZXJpZXM9dGhpcy5zZXJpZXN9O2Z1bmN0aW9uIGFiKGFqKXt2YXIgYW4sYW8sYXAsYWYsYW07Zm9yKHZhciBhaz0wO2FrPGFqLmxlbmd0aDthaysrKXt2YXIgYWc7dmFyIGFsPVthaltha10uZGF0YSxhaltha10uX3N0YWNrRGF0YSxhaltha10uX3Bsb3REYXRhLGFqW2FrXS5fcHJldlBsb3REYXRhXTtmb3IodmFyIGFoPTA7YWg8NDthaCsrKXthZz10cnVlO2FuPWFsW2FoXTtpZihhaltha10uX3N0YWNrQXhpcz09IngiKXtmb3IodmFyIGFpPTA7YWk8YW4ubGVuZ3RoO2FpKyspe2lmKHR5cGVvZihhblthaV1bMV0pIT0ibnVtYmVyIil7YWc9ZmFsc2U7YnJlYWt9fWlmKGFnKXthbi5zb3J0KGZ1bmN0aW9uKGFyLGFxKXtyZXR1cm4gYXJbMV0tYXFbMV19KX19ZWxzZXtmb3IodmFyIGFpPTA7YWk8YW4ubGVuZ3RoO2FpKyspe2lmKHR5cGVvZihhblthaV1bMF0pIT0ibnVtYmVyIil7YWc9ZmFsc2U7YnJlYWt9fWlmKGFnKXthbi5zb3J0KGZ1bmN0aW9uKGFyLGFxKXtyZXR1cm4gYXJbMF0tYXFbMF19KX19fX19dGhpcy5wb3B1bGF0ZVBsb3REYXRhPWZ1bmN0aW9uKGFqLGFrKXt0aGlzLl9wbG90RGF0YT1bXTt0aGlzLl9zdGFja0RhdGE9W107YWouX3N0YWNrRGF0YT1bXTthai5fcGxvdERhdGE9W107dmFyIGFuPXt4OltdLHk6W119O2lmKHRoaXMuc3RhY2tTZXJpZXMmJiFhai5kaXNhYmxlU3RhY2spe2FqLl9zdGFjaz10cnVlO3ZhciBhbD1hai5fc3RhY2tBeGlzPT0ieCI/MDoxO3ZhciBhbT1hbD8wOjE7dmFyIGFvPUguZXh0ZW5kKHRydWUsW10sYWouZGF0YSk7dmFyIGFwPUguZXh0ZW5kKHRydWUsW10sYWouZGF0YSk7Zm9yKHZhciBhaD0wO2FoPGFrO2FoKyspe3ZhciBhZj10aGlzLnNlcmllc1thaF0uZGF0YTtmb3IodmFyIGFnPTA7YWc8YWYubGVuZ3RoO2FnKyspe2FvW2FnXVswXSs9YWZbYWddWzBdO2FvW2FnXVsxXSs9YWZbYWddWzFdO2FwW2FnXVthbF0rPWFmW2FnXVthbF19fWZvcih2YXIgYWk9MDthaTxhcC5sZW5ndGg7YWkrKyl7YW4ueC5wdXNoKGFwW2FpXVswXSk7YW4ueS5wdXNoKGFwW2FpXVsxXSl9dGhpcy5fcGxvdERhdGEucHVzaChhcCk7dGhpcy5fc3RhY2tEYXRhLnB1c2goYW8pO2FqLl9zdGFja0RhdGE9YW87YWouX3Bsb3REYXRhPWFwO2FqLl9wbG90VmFsdWVzPWFufWVsc2V7Zm9yKHZhciBhaT0wO2FpPGFqLmRhdGEubGVuZ3RoO2FpKyspe2FuLngucHVzaChhai5kYXRhW2FpXVswXSk7YW4ueS5wdXNoKGFqLmRhdGFbYWldWzFdKX10aGlzLl9zdGFja0RhdGEucHVzaChhai5kYXRhKTt0aGlzLnNlcmllc1tha10uX3N0YWNrRGF0YT1hai5kYXRhO3RoaXMuX3Bsb3REYXRhLnB1c2goYWouZGF0YSk7YWouX3Bsb3REYXRhPWFqLmRhdGE7YWouX3Bsb3RWYWx1ZXM9YW59aWYoYWs+MCl7YWouX3ByZXZQbG90RGF0YT10aGlzLnNlcmllc1thay0xXS5fcGxvdERhdGF9YWouX3N1bXk9MDthai5fc3VteD0wO2ZvcihhaT1hai5kYXRhLmxlbmd0aC0xO2FpPi0xO2FpLS0pe2FqLl9zdW15Kz1hai5kYXRhW2FpXVsxXTthai5fc3VteCs9YWouZGF0YVthaV1bMF19fTt0aGlzLmdldE5leHRTZXJpZXNDb2xvcj0oZnVuY3Rpb24oYWcpe3ZhciBhZj0wO3ZhciBhaD1hZy5zZXJpZXNDb2xvcnM7cmV0dXJuIGZ1bmN0aW9uKCl7aWYoYWY8YWgubGVuZ3RoKXtyZXR1cm4gYWhbYWYrK119ZWxzZXthZj0wO3JldHVybiBhaFthZisrXX19fSkodGhpcyk7dGhpcy5wYXJzZU9wdGlvbnM9ZnVuY3Rpb24oYXEpe2Zvcih2YXIgYWw9MDthbDx0aGlzLnByZVBhcnNlT3B0aW9uc0hvb2tzLmhvb2tzLmxlbmd0aDthbCsrKXt0aGlzLnByZVBhcnNlT3B0aW9uc0hvb2tzLmhvb2tzW2FsXS5jYWxsKHRoaXMsYXEpfWZvcih2YXIgYWw9MDthbDxILmpxcGxvdC5wcmVQYXJzZU9wdGlvbnNIb29rcy5sZW5ndGg7YWwrKyl7SC5qcXBsb3QucHJlUGFyc2VPcHRpb25zSG9va3NbYWxdLmNhbGwodGhpcyxhcSl9dGhpcy5vcHRpb25zPUguZXh0ZW5kKHRydWUse30sdGhpcy5kZWZhdWx0cyxhcSk7dmFyIGFmPXRoaXMub3B0aW9uczt0aGlzLmFuaW1hdGU9YWYuYW5pbWF0ZTt0aGlzLmFuaW1hdGVSZXBsb3Q9YWYuYW5pbWF0ZVJlcGxvdDt0aGlzLnN0YWNrU2VyaWVzPWFmLnN0YWNrU2VyaWVzO2lmKEguaXNQbGFpbk9iamVjdChhZi5maWxsQmV0d2Vlbikpe3ZhciBhcD1bInNlcmllczEiLCJzZXJpZXMyIiwiY29sb3IiLCJiYXNlU2VyaWVzIiwiZmlsbCJdLGFtO2Zvcih2YXIgYWw9MCxhaj1hcC5sZW5ndGg7YWw8YWo7YWwrKyl7YW09YXBbYWxdO2lmKGFmLmZpbGxCZXR3ZWVuW2FtXSE9bnVsbCl7dGhpcy5maWxsQmV0d2VlblthbV09YWYuZmlsbEJldHdlZW5bYW1dfX19aWYoYWYuc2VyaWVzQ29sb3JzKXt0aGlzLnNlcmllc0NvbG9ycz1hZi5zZXJpZXNDb2xvcnN9aWYoYWYubmVnYXRpdmVTZXJpZXNDb2xvcnMpe3RoaXMubmVnYXRpdmVTZXJpZXNDb2xvcnM9YWYubmVnYXRpdmVTZXJpZXNDb2xvcnN9aWYoYWYuY2FwdHVyZVJpZ2h0Q2xpY2spe3RoaXMuY2FwdHVyZVJpZ2h0Q2xpY2s9YWYuY2FwdHVyZVJpZ2h0Q2xpY2t9dGhpcy5kZWZhdWx0QXhpc1N0YXJ0PShhcSYmYXEuZGVmYXVsdEF4aXNTdGFydCE9bnVsbCk/YXEuZGVmYXVsdEF4aXNTdGFydDp0aGlzLmRlZmF1bHRBeGlzU3RhcnQ7dGhpcy5jb2xvckdlbmVyYXRvci5zZXRDb2xvcnModGhpcy5zZXJpZXNDb2xvcnMpO3RoaXMubmVnYXRpdmVDb2xvckdlbmVyYXRvci5zZXRDb2xvcnModGhpcy5uZWdhdGl2ZVNlcmllc0NvbG9ycyk7SC5leHRlbmQodHJ1ZSx0aGlzLl9ncmlkUGFkZGluZyxhZi5ncmlkUGFkZGluZyk7dGhpcy5zb3J0RGF0YT0oYWYuc29ydERhdGEhPW51bGwpP2FmLnNvcnREYXRhOnRoaXMuc29ydERhdGE7Zm9yKHZhciBhbD0wO2FsPDEyO2FsKyspe3ZhciBhZz1RW2FsXTt2YXIgYWk9dGhpcy5heGVzW2FnXTthaS5fb3B0aW9ucz1ILmV4dGVuZCh0cnVlLHt9LGFmLmF4ZXNEZWZhdWx0cyxhZi5heGVzW2FnXSk7SC5leHRlbmQodHJ1ZSxhaSxhZi5heGVzRGVmYXVsdHMsYWYuYXhlc1thZ10pO2FpLl9wbG90V2lkdGg9dGhpcy5fd2lkdGg7YWkuX3Bsb3RIZWlnaHQ9dGhpcy5faGVpZ2h0fXZhciBhbz1mdW5jdGlvbihhdixhdCxhdyl7dmFyIGFyPVtdO3ZhciBhdTthdD1hdHx8InZlcnRpY2FsIjtpZighalF1ZXJ5LmlzQXJyYXkoYXZbMF0pKXtmb3IoYXU9MDthdTxhdi5sZW5ndGg7YXUrKyl7aWYoYXQ9PSJ2ZXJ0aWNhbCIpe2FyLnB1c2goW2F3K2F1LGF2W2F1XV0pfWVsc2V7YXIucHVzaChbYXZbYXVdLGF3K2F1XSl9fX1lbHNle0guZXh0ZW5kKHRydWUsYXIsYXYpfXJldHVybiBhcn07dmFyIGFuPTA7Zm9yKHZhciBhbD0wO2FsPHRoaXMuZGF0YS5sZW5ndGg7YWwrKyl7dmFyIGFwPW5ldyBPKCk7Zm9yKHZhciBhaz0wO2FrPEguanFwbG90LnByZVBhcnNlU2VyaWVzT3B0aW9uc0hvb2tzLmxlbmd0aDthaysrKXtILmpxcGxvdC5wcmVQYXJzZVNlcmllc09wdGlvbnNIb29rc1tha10uY2FsbChhcCx0aGlzLm9wdGlvbnMuc2VyaWVzRGVmYXVsdHMsdGhpcy5vcHRpb25zLnNlcmllc1thbF0pfWZvcih2YXIgYWs9MDthazx0aGlzLnByZVBhcnNlU2VyaWVzT3B0aW9uc0hvb2tzLmhvb2tzLmxlbmd0aDthaysrKXt0aGlzLnByZVBhcnNlU2VyaWVzT3B0aW9uc0hvb2tzLmhvb2tzW2FrXS5jYWxsKGFwLHRoaXMub3B0aW9ucy5zZXJpZXNEZWZhdWx0cyx0aGlzLm9wdGlvbnMuc2VyaWVzW2FsXSl9SC5leHRlbmQodHJ1ZSxhcCx7c2VyaWVzQ29sb3JzOnRoaXMuc2VyaWVzQ29sb3JzLG5lZ2F0aXZlU2VyaWVzQ29sb3JzOnRoaXMubmVnYXRpdmVTZXJpZXNDb2xvcnN9LHRoaXMub3B0aW9ucy5zZXJpZXNEZWZhdWx0cyx0aGlzLm9wdGlvbnMuc2VyaWVzW2FsXSx7cmVuZGVyZXJPcHRpb25zOnthbmltYXRpb246e3Nob3c6dGhpcy5hbmltYXRlfX19KTt2YXIgYWg9InZlcnRpY2FsIjtpZihhcC5yZW5kZXJlcj09PUguanFwbG90LkJhclJlbmRlcmVyJiZhcC5yZW5kZXJlck9wdGlvbnMmJmFwLnJlbmRlcmVyT3B0aW9ucy5iYXJEaXJlY3Rpb249PSJob3Jpem9udGFsIiYmYXAudHJhbnNwb3NlRGF0YT09PXRydWUpe2FoPSJob3Jpem9udGFsIn1hcC5kYXRhPWFvKHRoaXMuZGF0YVthbF0sYWgsdGhpcy5kZWZhdWx0QXhpc1N0YXJ0KTtzd2l0Y2goYXAueGF4aXMpe2Nhc2UieGF4aXMiOmFwLl94YXhpcz10aGlzLmF4ZXMueGF4aXM7YnJlYWs7Y2FzZSJ4MmF4aXMiOmFwLl94YXhpcz10aGlzLmF4ZXMueDJheGlzO2JyZWFrO2RlZmF1bHQ6YnJlYWt9YXAuX3lheGlzPXRoaXMuYXhlc1thcC55YXhpc107YXAuX3hheGlzLl9zZXJpZXMucHVzaChhcCk7YXAuX3lheGlzLl9zZXJpZXMucHVzaChhcCk7aWYoYXAuc2hvdyl7YXAuX3hheGlzLnNob3c9dHJ1ZTthcC5feWF4aXMuc2hvdz10cnVlfWlmKCFhcC5sYWJlbCl7YXAubGFiZWw9IlNlcmllcyAiKyhhbCsxKS50b1N0cmluZygpfXRoaXMuc2VyaWVzLnB1c2goYXApO2Zvcih2YXIgYWs9MDthazxILmpxcGxvdC5wb3N0UGFyc2VTZXJpZXNPcHRpb25zSG9va3MubGVuZ3RoO2FrKyspe0guanFwbG90LnBvc3RQYXJzZVNlcmllc09wdGlvbnNIb29rc1tha10uY2FsbCh0aGlzLnNlcmllc1thbF0sdGhpcy5vcHRpb25zLnNlcmllc0RlZmF1bHRzLHRoaXMub3B0aW9ucy5zZXJpZXNbYWxdKX1mb3IodmFyIGFrPTA7YWs8dGhpcy5wb3N0UGFyc2VTZXJpZXNPcHRpb25zSG9va3MuaG9va3MubGVuZ3RoO2FrKyspe3RoaXMucG9zdFBhcnNlU2VyaWVzT3B0aW9uc0hvb2tzLmhvb2tzW2FrXS5jYWxsKHRoaXMuc2VyaWVzW2FsXSx0aGlzLm9wdGlvbnMuc2VyaWVzRGVmYXVsdHMsdGhpcy5vcHRpb25zLnNlcmllc1thbF0pfX1ILmV4dGVuZCh0cnVlLHRoaXMuZ3JpZCx0aGlzLm9wdGlvbnMuZ3JpZCk7Zm9yKHZhciBhbD0wO2FsPDEyO2FsKyspe3ZhciBhZz1RW2FsXTt2YXIgYWk9dGhpcy5heGVzW2FnXTtpZihhaS5ib3JkZXJXaWR0aD09bnVsbCl7YWkuYm9yZGVyV2lkdGg9dGhpcy5ncmlkLmJvcmRlcldpZHRofX1pZih0eXBlb2YgdGhpcy5vcHRpb25zLnRpdGxlPT0ic3RyaW5nIil7dGhpcy50aXRsZS50ZXh0PXRoaXMub3B0aW9ucy50aXRsZX1lbHNle2lmKHR5cGVvZiB0aGlzLm9wdGlvbnMudGl0bGU9PSJvYmplY3QiKXtILmV4dGVuZCh0cnVlLHRoaXMudGl0bGUsdGhpcy5vcHRpb25zLnRpdGxlKX19dGhpcy50aXRsZS5fcGxvdFdpZHRoPXRoaXMuX3dpZHRoO3RoaXMubGVnZW5kLnNldE9wdGlvbnModGhpcy5vcHRpb25zLmxlZ2VuZCk7Zm9yKHZhciBhbD0wO2FsPEguanFwbG90LnBvc3RQYXJzZU9wdGlvbnNIb29rcy5sZW5ndGg7YWwrKyl7SC5qcXBsb3QucG9zdFBhcnNlT3B0aW9uc0hvb2tzW2FsXS5jYWxsKHRoaXMsYXEpfWZvcih2YXIgYWw9MDthbDx0aGlzLnBvc3RQYXJzZU9wdGlvbnNIb29rcy5ob29rcy5sZW5ndGg7YWwrKyl7dGhpcy5wb3N0UGFyc2VPcHRpb25zSG9va3MuaG9va3NbYWxdLmNhbGwodGhpcyxhcSl9fTt0aGlzLmRlc3Ryb3k9ZnVuY3Rpb24oKXt0aGlzLmNhbnZhc01hbmFnZXIuZnJlZUFsbENhbnZhc2VzKCk7aWYodGhpcy5ldmVudENhbnZhcyYmdGhpcy5ldmVudENhbnZhcy5fZWxlbSl7dGhpcy5ldmVudENhbnZhcy5fZWxlbS51bmJpbmQoKX10aGlzLnRhcmdldC5lbXB0eSgpO3RoaXMudGFyZ2V0WzBdLmlubmVySFRNTD0iIn07dGhpcy5yZXBsb3Q9ZnVuY3Rpb24oYWcpe3ZhciBhaD1hZ3x8e307dmFyIGFmPShhaC5jbGVhcj09PWZhbHNlKT9mYWxzZTp0cnVlO3ZhciBhaT1haC5yZXNldEF4ZXN8fGZhbHNlO3RoaXMudGFyZ2V0LnRyaWdnZXIoImpxcGxvdFByZVJlcGxvdCIpO2lmKGFmKXt0aGlzLmRlc3Ryb3koKX10aGlzLnJlSW5pdGlhbGl6ZSgpO2lmKGFpKXt0aGlzLnJlc2V0QXhlc1NjYWxlKGFpLGFoLmF4ZXMpfXRoaXMuZHJhdygpO3RoaXMudGFyZ2V0LnRyaWdnZXIoImpxcGxvdFBvc3RSZXBsb3QiKX07dGhpcy5yZWRyYXc9ZnVuY3Rpb24oYWYpe2FmPShhZiE9bnVsbCk/YWY6dHJ1ZTt0aGlzLnRhcmdldC50cmlnZ2VyKCJqcXBsb3RQcmVSZWRyYXciKTtpZihhZil7dGhpcy5jYW52YXNNYW5hZ2VyLmZyZWVBbGxDYW52YXNlcygpO3RoaXMuZXZlbnRDYW52YXMuX2VsZW0udW5iaW5kKCk7dGhpcy50YXJnZXQuZW1wdHkoKX1mb3IodmFyIGFoIGluIHRoaXMuYXhlcyl7dGhpcy5heGVzW2FoXS5fdGlja3M9W119Zm9yKHZhciBhZz0wO2FnPHRoaXMuc2VyaWVzLmxlbmd0aDthZysrKXt0aGlzLnBvcHVsYXRlUGxvdERhdGEodGhpcy5zZXJpZXNbYWddLGFnKX10aGlzLl9zdW15PTA7dGhpcy5fc3VteD0wO2ZvcihhZz0wO2FnPHRoaXMuc2VyaWVzLmxlbmd0aDthZysrKXt0aGlzLl9zdW15Kz10aGlzLnNlcmllc1thZ10uX3N1bXk7dGhpcy5fc3VteCs9dGhpcy5zZXJpZXNbYWddLl9zdW14fXRoaXMuZHJhdygpO3RoaXMudGFyZ2V0LnRyaWdnZXIoImpxcGxvdFBvc3RSZWRyYXciKX07dGhpcy5kcmF3PWZ1bmN0aW9uKCl7aWYodGhpcy5kcmF3SWZIaWRkZW58fHRoaXMudGFyZ2V0LmlzKCI6dmlzaWJsZSIpKXt0aGlzLnRhcmdldC50cmlnZ2VyKCJqcXBsb3RQcmVEcmF3Iik7dmFyIGFCLGF6LGF5LGFpO2ZvcihhQj0wLGF5PUguanFwbG90LnByZURyYXdIb29rcy5sZW5ndGg7YUI8YXk7YUIrKyl7SC5qcXBsb3QucHJlRHJhd0hvb2tzW2FCXS5jYWxsKHRoaXMpfWZvcihhQj0wLGF5PXRoaXMucHJlRHJhd0hvb2tzLmxlbmd0aDthQjxheTthQisrKXt0aGlzLnByZURyYXdIb29rcy5ob29rc1thQl0uYXBwbHkodGhpcyx0aGlzLnByZURyYXdTZXJpZXNIb29rcy5hcmdzW2FCXSl9dGhpcy50YXJnZXQuYXBwZW5kKHRoaXMuYmFzZUNhbnZhcy5jcmVhdGVFbGVtZW50KHtsZWZ0OjAscmlnaHQ6MCx0b3A6MCxib3R0b206MH0sImpxcGxvdC1iYXNlLWNhbnZhcyIsbnVsbCx0aGlzKSk7dGhpcy5iYXNlQ2FudmFzLnNldENvbnRleHQoKTt0aGlzLnRhcmdldC5hcHBlbmQodGhpcy50aXRsZS5kcmF3KCkpO3RoaXMudGl0bGUucGFjayh7dG9wOjAsbGVmdDowfSk7dmFyIGFGPXRoaXMubGVnZW5kLmRyYXcoKTt2YXIgYWY9e3RvcDowLGxlZnQ6MCxib3R0b206MCxyaWdodDowfTtpZih0aGlzLmxlZ2VuZC5wbGFjZW1lbnQ9PSJvdXRzaWRlR3JpZCIpe3RoaXMudGFyZ2V0LmFwcGVuZChhRik7c3dpdGNoKHRoaXMubGVnZW5kLmxvY2F0aW9uKXtjYXNlIm4iOmFmLnRvcCs9dGhpcy5sZWdlbmQuZ2V0SGVpZ2h0KCk7YnJlYWs7Y2FzZSJzIjphZi5ib3R0b20rPXRoaXMubGVnZW5kLmdldEhlaWdodCgpO2JyZWFrO2Nhc2UibmUiOmNhc2UiZSI6Y2FzZSJzZSI6YWYucmlnaHQrPXRoaXMubGVnZW5kLmdldFdpZHRoKCk7YnJlYWs7Y2FzZSJudyI6Y2FzZSJ3IjpjYXNlInN3IjphZi5sZWZ0Kz10aGlzLmxlZ2VuZC5nZXRXaWR0aCgpO2JyZWFrO2RlZmF1bHQ6YWYucmlnaHQrPXRoaXMubGVnZW5kLmdldFdpZHRoKCk7YnJlYWt9YUY9YUYuZGV0YWNoKCl9dmFyIGFsPXRoaXMuYXhlczt2YXIgYUc7Zm9yKGFCPTA7YUI8MTI7YUIrKyl7YUc9UVthQl07dGhpcy50YXJnZXQuYXBwZW5kKGFsW2FHXS5kcmF3KHRoaXMuYmFzZUNhbnZhcy5fY3R4LHRoaXMpKTthbFthR10uc2V0KCl9aWYoYWwueWF4aXMuc2hvdyl7YWYubGVmdCs9YWwueWF4aXMuZ2V0V2lkdGgoKX12YXIgYUE9WyJ5MmF4aXMiLCJ5M2F4aXMiLCJ5NGF4aXMiLCJ5NWF4aXMiLCJ5NmF4aXMiLCJ5N2F4aXMiLCJ5OGF4aXMiLCJ5OWF4aXMiXTt2YXIgYXI9WzAsMCwwLDAsMCwwLDAsMF07dmFyIGF2PTA7dmFyIGF1O2ZvcihhdT0wO2F1PDg7YXUrKyl7aWYoYWxbYUFbYXVdXS5zaG93KXthdis9YWxbYUFbYXVdXS5nZXRXaWR0aCgpO2FyW2F1XT1hdn19YWYucmlnaHQrPWF2O2lmKGFsLngyYXhpcy5zaG93KXthZi50b3ArPWFsLngyYXhpcy5nZXRIZWlnaHQoKX1pZih0aGlzLnRpdGxlLnNob3cpe2FmLnRvcCs9dGhpcy50aXRsZS5nZXRIZWlnaHQoKX1pZihhbC54YXhpcy5zaG93KXthZi5ib3R0b20rPWFsLnhheGlzLmdldEhlaWdodCgpfWlmKHRoaXMub3B0aW9ucy5ncmlkRGltZW5zaW9ucyYmSC5pc1BsYWluT2JqZWN0KHRoaXMub3B0aW9ucy5ncmlkRGltZW5zaW9ucykpe3ZhciBhbT1wYXJzZUludCh0aGlzLm9wdGlvbnMuZ3JpZERpbWVuc2lvbnMud2lkdGgsMTApfHwwO3ZhciBhQz1wYXJzZUludCh0aGlzLm9wdGlvbnMuZ3JpZERpbWVuc2lvbnMuaGVpZ2h0LDEwKXx8MDt2YXIgYWg9KHRoaXMuX3dpZHRoLWFmLmxlZnQtYWYucmlnaHQtYW0pLzI7dmFyIGFFPSh0aGlzLl9oZWlnaHQtYWYudG9wLWFmLmJvdHRvbS1hQykvMjtpZihhRT49MCYmYWg+PTApe2FmLnRvcCs9YUU7YWYuYm90dG9tKz1hRTthZi5sZWZ0Kz1haDthZi5yaWdodCs9YWh9fXZhciBhZz1bInRvcCIsImJvdHRvbSIsImxlZnQiLCJyaWdodCJdO2Zvcih2YXIgYXUgaW4gYWcpe2lmKHRoaXMuX2dyaWRQYWRkaW5nW2FnW2F1XV09PW51bGwmJmFmW2FnW2F1XV0+MCl7dGhpcy5fZ3JpZFBhZGRpbmdbYWdbYXVdXT1hZlthZ1thdV1dfWVsc2V7aWYodGhpcy5fZ3JpZFBhZGRpbmdbYWdbYXVdXT09bnVsbCl7dGhpcy5fZ3JpZFBhZGRpbmdbYWdbYXVdXT10aGlzLl9kZWZhdWx0R3JpZFBhZGRpbmdbYWdbYXVdXX19fXZhciBhdD0odGhpcy5sZWdlbmQucGxhY2VtZW50PT0ib3V0c2lkZUdyaWQiKT97dG9wOnRoaXMudGl0bGUuZ2V0SGVpZ2h0KCksbGVmdDowLHJpZ2h0OjAsYm90dG9tOjB9OnRoaXMuX2dyaWRQYWRkaW5nO2FsLnhheGlzLnBhY2soe3Bvc2l0aW9uOiJhYnNvbHV0ZSIsYm90dG9tOnRoaXMuX2dyaWRQYWRkaW5nLmJvdHRvbS1hbC54YXhpcy5nZXRIZWlnaHQoKSxsZWZ0OjAsd2lkdGg6dGhpcy5fd2lkdGh9LHttaW46dGhpcy5fZ3JpZFBhZGRpbmcubGVmdCxtYXg6dGhpcy5fd2lkdGgtdGhpcy5fZ3JpZFBhZGRpbmcucmlnaHR9KTthbC55YXhpcy5wYWNrKHtwb3NpdGlvbjoiYWJzb2x1dGUiLHRvcDowLGxlZnQ6dGhpcy5fZ3JpZFBhZGRpbmcubGVmdC1hbC55YXhpcy5nZXRXaWR0aCgpLGhlaWdodDp0aGlzLl9oZWlnaHR9LHttaW46dGhpcy5faGVpZ2h0LXRoaXMuX2dyaWRQYWRkaW5nLmJvdHRvbSxtYXg6dGhpcy5fZ3JpZFBhZGRpbmcudG9wfSk7YWwueDJheGlzLnBhY2soe3Bvc2l0aW9uOiJhYnNvbHV0ZSIsdG9wOnRoaXMuX2dyaWRQYWRkaW5nLnRvcC1hbC54MmF4aXMuZ2V0SGVpZ2h0KCksbGVmdDowLHdpZHRoOnRoaXMuX3dpZHRofSx7bWluOnRoaXMuX2dyaWRQYWRkaW5nLmxlZnQsbWF4OnRoaXMuX3dpZHRoLXRoaXMuX2dyaWRQYWRkaW5nLnJpZ2h0fSk7Zm9yKGFCPTg7YUI+MDthQi0tKXthbFthQVthQi0xXV0ucGFjayh7cG9zaXRpb246ImFic29sdXRlIix0b3A6MCxyaWdodDp0aGlzLl9ncmlkUGFkZGluZy5yaWdodC1hclthQi0xXX0se21pbjp0aGlzLl9oZWlnaHQtdGhpcy5fZ3JpZFBhZGRpbmcuYm90dG9tLG1heDp0aGlzLl9ncmlkUGFkZGluZy50b3B9KX12YXIgYW49KHRoaXMuX3dpZHRoLXRoaXMuX2dyaWRQYWRkaW5nLmxlZnQtdGhpcy5fZ3JpZFBhZGRpbmcucmlnaHQpLzIrdGhpcy5fZ3JpZFBhZGRpbmcubGVmdC1hbC55TWlkQXhpcy5nZXRXaWR0aCgpLzI7YWwueU1pZEF4aXMucGFjayh7cG9zaXRpb246ImFic29sdXRlIix0b3A6MCxsZWZ0OmFuLHpJbmRleDo5LHRleHRBbGlnbjoiY2VudGVyIn0se21pbjp0aGlzLl9oZWlnaHQtdGhpcy5fZ3JpZFBhZGRpbmcuYm90dG9tLG1heDp0aGlzLl9ncmlkUGFkZGluZy50b3B9KTt0aGlzLnRhcmdldC5hcHBlbmQodGhpcy5ncmlkLmNyZWF0ZUVsZW1lbnQodGhpcy5fZ3JpZFBhZGRpbmcsdGhpcykpO3RoaXMuZ3JpZC5kcmF3KCk7dmFyIGFrPXRoaXMuc2VyaWVzO3ZhciBhRD1hay5sZW5ndGg7Zm9yKGFCPTAsYXk9YUQ7YUI8YXk7YUIrKyl7YXo9dGhpcy5zZXJpZXNTdGFja1thQl07dGhpcy50YXJnZXQuYXBwZW5kKGFrW2F6XS5zaGFkb3dDYW52YXMuY3JlYXRlRWxlbWVudCh0aGlzLl9ncmlkUGFkZGluZywianFwbG90LXNlcmllcy1zaGFkb3dDYW52YXMiLG51bGwsdGhpcykpO2FrW2F6XS5zaGFkb3dDYW52YXMuc2V0Q29udGV4dCgpO2FrW2F6XS5zaGFkb3dDYW52YXMuX2VsZW0uZGF0YSgic2VyaWVzSW5kZXgiLGF6KX1mb3IoYUI9MCxheT1hRDthQjxheTthQisrKXthej10aGlzLnNlcmllc1N0YWNrW2FCXTt0aGlzLnRhcmdldC5hcHBlbmQoYWtbYXpdLmNhbnZhcy5jcmVhdGVFbGVtZW50KHRoaXMuX2dyaWRQYWRkaW5nLCJqcXBsb3Qtc2VyaWVzLWNhbnZhcyIsbnVsbCx0aGlzKSk7YWtbYXpdLmNhbnZhcy5zZXRDb250ZXh0KCk7YWtbYXpdLmNhbnZhcy5fZWxlbS5kYXRhKCJzZXJpZXNJbmRleCIsYXopfXRoaXMudGFyZ2V0LmFwcGVuZCh0aGlzLmV2ZW50Q2FudmFzLmNyZWF0ZUVsZW1lbnQodGhpcy5fZ3JpZFBhZGRpbmcsImpxcGxvdC1ldmVudC1jYW52YXMiLG51bGwsdGhpcykpO3RoaXMuZXZlbnRDYW52YXMuc2V0Q29udGV4dCgpO3RoaXMuZXZlbnRDYW52YXMuX2N0eC5maWxsU3R5bGU9InJnYmEoMCwwLDAsMCkiO3RoaXMuZXZlbnRDYW52YXMuX2N0eC5maWxsUmVjdCgwLDAsdGhpcy5ldmVudENhbnZhcy5fY3R4LmNhbnZhcy53aWR0aCx0aGlzLmV2ZW50Q2FudmFzLl9jdHguY2FudmFzLmhlaWdodCk7dGhpcy5iaW5kQ3VzdG9tRXZlbnRzKCk7aWYodGhpcy5sZWdlbmQucHJlRHJhdyl7dGhpcy5ldmVudENhbnZhcy5fZWxlbS5iZWZvcmUoYUYpO3RoaXMubGVnZW5kLnBhY2soYXQpO2lmKHRoaXMubGVnZW5kLl9lbGVtKXt0aGlzLmRyYXdTZXJpZXMoe2xlZ2VuZEluZm86e2xvY2F0aW9uOnRoaXMubGVnZW5kLmxvY2F0aW9uLHBsYWNlbWVudDp0aGlzLmxlZ2VuZC5wbGFjZW1lbnQsd2lkdGg6dGhpcy5sZWdlbmQuZ2V0V2lkdGgoKSxoZWlnaHQ6dGhpcy5sZWdlbmQuZ2V0SGVpZ2h0KCkseG9mZnNldDp0aGlzLmxlZ2VuZC54b2Zmc2V0LHlvZmZzZXQ6dGhpcy5sZWdlbmQueW9mZnNldH19KX1lbHNle3RoaXMuZHJhd1NlcmllcygpfX1lbHNle3RoaXMuZHJhd1NlcmllcygpO2lmKGFEKXtIKGFrW2FELTFdLmNhbnZhcy5fZWxlbSkuYWZ0ZXIoYUYpfXRoaXMubGVnZW5kLnBhY2soYXQpfWZvcih2YXIgYUI9MCxheT1ILmpxcGxvdC5ldmVudExpc3RlbmVySG9va3MubGVuZ3RoO2FCPGF5O2FCKyspe3RoaXMuZXZlbnRDYW52YXMuX2VsZW0uYmluZChILmpxcGxvdC5ldmVudExpc3RlbmVySG9va3NbYUJdWzBdLHtwbG90OnRoaXN9LEguanFwbG90LmV2ZW50TGlzdGVuZXJIb29rc1thQl1bMV0pfWZvcih2YXIgYUI9MCxheT10aGlzLmV2ZW50TGlzdGVuZXJIb29rcy5ob29rcy5sZW5ndGg7YUI8YXk7YUIrKyl7dGhpcy5ldmVudENhbnZhcy5fZWxlbS5iaW5kKHRoaXMuZXZlbnRMaXN0ZW5lckhvb2tzLmhvb2tzW2FCXVswXSx7cGxvdDp0aGlzfSx0aGlzLmV2ZW50TGlzdGVuZXJIb29rcy5ob29rc1thQl1bMV0pfXZhciBhcT10aGlzLmZpbGxCZXR3ZWVuO2lmKGFxLmZpbGwmJmFxLnNlcmllczEhPT1hcS5zZXJpZXMyJiZhcS5zZXJpZXMxPGFEJiZhcS5zZXJpZXMyPGFEJiZha1thcS5zZXJpZXMxXS5fdHlwZT09PSJsaW5lIiYmYWtbYXEuc2VyaWVzMl0uX3R5cGU9PT0ibGluZSIpe3RoaXMuZG9GaWxsQmV0d2VlbkxpbmVzKCl9Zm9yKHZhciBhQj0wLGF5PUguanFwbG90LnBvc3REcmF3SG9va3MubGVuZ3RoO2FCPGF5O2FCKyspe0guanFwbG90LnBvc3REcmF3SG9va3NbYUJdLmNhbGwodGhpcyl9Zm9yKHZhciBhQj0wLGF5PXRoaXMucG9zdERyYXdIb29rcy5ob29rcy5sZW5ndGg7YUI8YXk7YUIrKyl7dGhpcy5wb3N0RHJhd0hvb2tzLmhvb2tzW2FCXS5hcHBseSh0aGlzLHRoaXMucG9zdERyYXdIb29rcy5hcmdzW2FCXSl9aWYodGhpcy50YXJnZXQuaXMoIjp2aXNpYmxlIikpe3RoaXMuX2RyYXdDb3VudCs9MX12YXIgYW8sYXAsYXcsYWo7Zm9yKGFCPTAsYXk9YUQ7YUI8YXk7YUIrKyl7YW89YWtbYUJdO2FwPWFvLnJlbmRlcmVyO2F3PSIuanFwbG90LXBvaW50LWxhYmVsLmpxcGxvdC1zZXJpZXMtIithQjtpZihhcC5hbmltYXRpb24mJmFwLmFuaW1hdGlvbi5fc3VwcG9ydGVkJiZhcC5hbmltYXRpb24uc2hvdyYmKHRoaXMuX2RyYXdDb3VudDwyfHx0aGlzLmFuaW1hdGVSZXBsb3QpKXthaj10aGlzLnRhcmdldC5maW5kKGF3KTthai5zdG9wKHRydWUsdHJ1ZSkuaGlkZSgpO2FvLmNhbnZhcy5fZWxlbS5zdG9wKHRydWUsdHJ1ZSkuaGlkZSgpO2FvLnNoYWRvd0NhbnZhcy5fZWxlbS5zdG9wKHRydWUsdHJ1ZSkuaGlkZSgpO2FvLmNhbnZhcy5fZWxlbS5qcXBsb3RFZmZlY3QoImJsaW5kIix7bW9kZToic2hvdyIsZGlyZWN0aW9uOmFwLmFuaW1hdGlvbi5kaXJlY3Rpb259LGFwLmFuaW1hdGlvbi5zcGVlZCk7YW8uc2hhZG93Q2FudmFzLl9lbGVtLmpxcGxvdEVmZmVjdCgiYmxpbmQiLHttb2RlOiJzaG93IixkaXJlY3Rpb246YXAuYW5pbWF0aW9uLmRpcmVjdGlvbn0sYXAuYW5pbWF0aW9uLnNwZWVkKTthai5mYWRlSW4oYXAuYW5pbWF0aW9uLnNwZWVkKjAuOCl9fWFqPW51bGw7dGhpcy50YXJnZXQudHJpZ2dlcigianFwbG90UG9zdERyYXciLFt0aGlzXSl9fTtOLnByb3RvdHlwZS5kb0ZpbGxCZXR3ZWVuTGluZXM9ZnVuY3Rpb24oKXt2YXIgYWg9dGhpcy5maWxsQmV0d2Vlbjt2YXIgYXE9YWguc2VyaWVzMTt2YXIgYW89YWguc2VyaWVzMjt2YXIgYXA9KGFxPGFvKT9hcTphbzt2YXIgYW49KGFvPmFxKT9hbzphcTt2YXIgYWw9dGhpcy5zZXJpZXNbYXBdO3ZhciBhaz10aGlzLnNlcmllc1thbl07aWYoYWsucmVuZGVyZXIuc21vb3RoKXt2YXIgYWo9YWsucmVuZGVyZXIuX3Ntb290aGVkRGF0YS5zbGljZSgwKS5yZXZlcnNlKCl9ZWxzZXt2YXIgYWo9YWsuZ3JpZERhdGEuc2xpY2UoMCkucmV2ZXJzZSgpfWlmKGFsLnJlbmRlcmVyLnNtb290aCl7dmFyIGFtPWFsLnJlbmRlcmVyLl9zbW9vdGhlZERhdGEuY29uY2F0KGFqKX1lbHNle3ZhciBhbT1hbC5ncmlkRGF0YS5jb25jYXQoYWopfXZhciBhaT0oYWguY29sb3IhPT1udWxsKT9haC5jb2xvcjp0aGlzLnNlcmllc1thcV0uZmlsbENvbG9yO3ZhciBhcj0oYWguYmFzZVNlcmllcyE9PW51bGwpP2FoLmJhc2VTZXJpZXM6YXA7dmFyIGFnPXRoaXMuc2VyaWVzW2FyXS5yZW5kZXJlci5zaGFwZVJlbmRlcmVyO3ZhciBhZj17ZmlsbFN0eWxlOmFpLGZpbGw6dHJ1ZSxjbG9zZVBhdGg6dHJ1ZX07YWcuZHJhdyhhbC5zaGFkb3dDYW52YXMuX2N0eCxhbSxhZil9O3RoaXMuYmluZEN1c3RvbUV2ZW50cz1mdW5jdGlvbigpe3RoaXMuZXZlbnRDYW52YXMuX2VsZW0uYmluZCgiY2xpY2siLHtwbG90OnRoaXN9LHRoaXMub25DbGljayk7dGhpcy5ldmVudENhbnZhcy5fZWxlbS5iaW5kKCJkYmxjbGljayIse3Bsb3Q6dGhpc30sdGhpcy5vbkRibENsaWNrKTt0aGlzLmV2ZW50Q2FudmFzLl9lbGVtLmJpbmQoIm1vdXNlZG93biIse3Bsb3Q6dGhpc30sdGhpcy5vbk1vdXNlRG93bik7dGhpcy5ldmVudENhbnZhcy5fZWxlbS5iaW5kKCJtb3VzZW1vdmUiLHtwbG90OnRoaXN9LHRoaXMub25Nb3VzZU1vdmUpO3RoaXMuZXZlbnRDYW52YXMuX2VsZW0uYmluZCgibW91c2VlbnRlciIse3Bsb3Q6dGhpc30sdGhpcy5vbk1vdXNlRW50ZXIpO3RoaXMuZXZlbnRDYW52YXMuX2VsZW0uYmluZCgibW91c2VsZWF2ZSIse3Bsb3Q6dGhpc30sdGhpcy5vbk1vdXNlTGVhdmUpO2lmKHRoaXMuY2FwdHVyZVJpZ2h0Q2xpY2spe3RoaXMuZXZlbnRDYW52YXMuX2VsZW0uYmluZCgibW91c2V1cCIse3Bsb3Q6dGhpc30sdGhpcy5vblJpZ2h0Q2xpY2spO3RoaXMuZXZlbnRDYW52YXMuX2VsZW0uZ2V0KDApLm9uY29udGV4dG1lbnU9ZnVuY3Rpb24oKXtyZXR1cm4gZmFsc2V9fWVsc2V7dGhpcy5ldmVudENhbnZhcy5fZWxlbS5iaW5kKCJtb3VzZXVwIix7cGxvdDp0aGlzfSx0aGlzLm9uTW91c2VVcCl9fTtmdW5jdGlvbiBhYyhhbyl7dmFyIGFtPWFvLmRhdGEucGxvdDt2YXIgYWk9YW0uZXZlbnRDYW52YXMuX2VsZW0ub2Zmc2V0KCk7dmFyIGFsPXt4OmFvLnBhZ2VYLWFpLmxlZnQseTphby5wYWdlWS1haS50b3B9O3ZhciBhaj17eGF4aXM6bnVsbCx5YXhpczpudWxsLHgyYXhpczpudWxsLHkyYXhpczpudWxsLHkzYXhpczpudWxsLHk0YXhpczpudWxsLHk1YXhpczpudWxsLHk2YXhpczpudWxsLHk3YXhpczpudWxsLHk4YXhpczpudWxsLHk5YXhpczpudWxsLHlNaWRBeGlzOm51bGx9O3ZhciBhaz1bInhheGlzIiwieWF4aXMiLCJ4MmF4aXMiLCJ5MmF4aXMiLCJ5M2F4aXMiLCJ5NGF4aXMiLCJ5NWF4aXMiLCJ5NmF4aXMiLCJ5N2F4aXMiLCJ5OGF4aXMiLCJ5OWF4aXMiLCJ5TWlkQXhpcyJdO3ZhciBhZj1hbS5heGVzO3ZhciBhZyxhaDtmb3IoYWc9MTE7YWc+MDthZy0tKXthaD1ha1thZy0xXTtpZihhZlthaF0uc2hvdyl7YWpbYWhdPWFmW2FoXS5zZXJpZXNfcDJ1KGFsW2FoLmNoYXJBdCgwKV0pfX1yZXR1cm57b2Zmc2V0czphaSxncmlkUG9zOmFsLGRhdGFQb3M6YWp9fWZ1bmN0aW9uIGFlKGFmLGFnKXt2YXIgYWs9YWcuc2VyaWVzO3ZhciBhUCxhTyxhTixhSSxhSixhRCxhQyxhcCxhbixhdCxhdSxhRTt2YXIgYU0sYVEsYUssYWwsYUIsYUc7dmFyIGFoLGFIO2ZvcihhTj1hZy5zZXJpZXNTdGFjay5sZW5ndGgtMTthTj49MDthTi0tKXthUD1hZy5zZXJpZXNTdGFja1thTl07YUk9YWtbYVBdO3N3aXRjaChhSS5yZW5kZXJlci5jb25zdHJ1Y3Rvcil7Y2FzZSBILmpxcGxvdC5CYXJSZW5kZXJlcjpjYXNlIEguanFwbG90LlB5cmFtaWRSZW5kZXJlcjphRD1hZi54O2FDPWFmLnk7Zm9yKGFPPTA7YU88YUkuX2JhclBvaW50cy5sZW5ndGg7YU8rKyl7YUI9YUkuX2JhclBvaW50c1thT107YUs9YUkuZ3JpZERhdGFbYU9dO2lmKGFEPmFCWzBdWzBdJiZhRDxhQlsyXVswXSYmYUM+YUJbMl1bMV0mJmFDPGFCWzBdWzFdKXtyZXR1cm57c2VyaWVzSW5kZXg6YUkuaW5kZXgscG9pbnRJbmRleDphTyxncmlkRGF0YTphSyxkYXRhOmFJLmRhdGFbYU9dLHBvaW50czphSS5fYmFyUG9pbnRzW2FPXX19fWJyZWFrO2Nhc2UgSC5qcXBsb3QuRG9udXRSZW5kZXJlcjphdD1hSS5zdGFydEFuZ2xlLzE4MCpNYXRoLlBJO2FEPWFmLngtYUkuX2NlbnRlclswXTthQz1hZi55LWFJLl9jZW50ZXJbMV07YUo9TWF0aC5zcXJ0KE1hdGgucG93KGFELDIpK01hdGgucG93KGFDLDIpKTtpZihhRD4wJiYtYUM+PTApe2FwPTIqTWF0aC5QSS1NYXRoLmF0YW4oLWFDL2FEKX1lbHNle2lmKGFEPjAmJi1hQzwwKXthcD0tTWF0aC5hdGFuKC1hQy9hRCl9ZWxzZXtpZihhRDwwKXthcD1NYXRoLlBJLU1hdGguYXRhbigtYUMvYUQpfWVsc2V7aWYoYUQ9PTAmJi1hQz4wKXthcD0zKk1hdGguUEkvMn1lbHNle2lmKGFEPT0wJiYtYUM8MCl7YXA9TWF0aC5QSS8yfWVsc2V7aWYoYUQ9PTAmJmFDPT0wKXthcD0wfX19fX19aWYoYXQpe2FwLT1hdDtpZihhcDwwKXthcCs9MipNYXRoLlBJfWVsc2V7aWYoYXA+MipNYXRoLlBJKXthcC09MipNYXRoLlBJfX19YW49YUkuc2xpY2VNYXJnaW4vMTgwKk1hdGguUEk7aWYoYUo8YUkuX3JhZGl1cyYmYUo+YUkuX2lubmVyUmFkaXVzKXtmb3IoYU89MDthTzxhSS5ncmlkRGF0YS5sZW5ndGg7YU8rKyl7YXU9KGFPPjApP2FJLmdyaWREYXRhW2FPLTFdWzFdK2FuOmFuO2FFPWFJLmdyaWREYXRhW2FPXVsxXTtpZihhcD5hdSYmYXA8YUUpe3JldHVybntzZXJpZXNJbmRleDphSS5pbmRleCxwb2ludEluZGV4OmFPLGdyaWREYXRhOmFJLmdyaWREYXRhW2FPXSxkYXRhOmFJLmRhdGFbYU9dfX19fWJyZWFrO2Nhc2UgSC5qcXBsb3QuUGllUmVuZGVyZXI6YXQ9YUkuc3RhcnRBbmdsZS8xODAqTWF0aC5QSTthRD1hZi54LWFJLl9jZW50ZXJbMF07YUM9YWYueS1hSS5fY2VudGVyWzFdO2FKPU1hdGguc3FydChNYXRoLnBvdyhhRCwyKStNYXRoLnBvdyhhQywyKSk7aWYoYUQ+MCYmLWFDPj0wKXthcD0yKk1hdGguUEktTWF0aC5hdGFuKC1hQy9hRCl9ZWxzZXtpZihhRD4wJiYtYUM8MCl7YXA9LU1hdGguYXRhbigtYUMvYUQpfWVsc2V7aWYoYUQ8MCl7YXA9TWF0aC5QSS1NYXRoLmF0YW4oLWFDL2FEKX1lbHNle2lmKGFEPT0wJiYtYUM+MCl7YXA9MypNYXRoLlBJLzJ9ZWxzZXtpZihhRD09MCYmLWFDPDApe2FwPU1hdGguUEkvMn1lbHNle2lmKGFEPT0wJiZhQz09MCl7YXA9MH19fX19fWlmKGF0KXthcC09YXQ7aWYoYXA8MCl7YXArPTIqTWF0aC5QSX1lbHNle2lmKGFwPjIqTWF0aC5QSSl7YXAtPTIqTWF0aC5QSX19fWFuPWFJLnNsaWNlTWFyZ2luLzE4MCpNYXRoLlBJO2lmKGFKPGFJLl9yYWRpdXMpe2ZvcihhTz0wO2FPPGFJLmdyaWREYXRhLmxlbmd0aDthTysrKXthdT0oYU8+MCk/YUkuZ3JpZERhdGFbYU8tMV1bMV0rYW46YW47YUU9YUkuZ3JpZERhdGFbYU9dWzFdO2lmKGFwPmF1JiZhcDxhRSl7cmV0dXJue3Nlcmllc0luZGV4OmFJLmluZGV4LHBvaW50SW5kZXg6YU8sZ3JpZERhdGE6YUkuZ3JpZERhdGFbYU9dLGRhdGE6YUkuZGF0YVthT119fX19YnJlYWs7Y2FzZSBILmpxcGxvdC5CdWJibGVSZW5kZXJlcjphRD1hZi54O2FDPWFmLnk7dmFyIGF6PW51bGw7aWYoYUkuc2hvdyl7Zm9yKHZhciBhTz0wO2FPPGFJLmdyaWREYXRhLmxlbmd0aDthTysrKXthSz1hSS5ncmlkRGF0YVthT107YVE9TWF0aC5zcXJ0KChhRC1hS1swXSkqKGFELWFLWzBdKSsoYUMtYUtbMV0pKihhQy1hS1sxXSkpO2lmKGFRPD1hS1syXSYmKGFRPD1hTXx8YU09PW51bGwpKXthTT1hUTthej17c2VyaWVzSW5kZXg6YVAscG9pbnRJbmRleDphTyxncmlkRGF0YTphSyxkYXRhOmFJLmRhdGFbYU9dfX19aWYoYXohPW51bGwpe3JldHVybiBhen19YnJlYWs7Y2FzZSBILmpxcGxvdC5GdW5uZWxSZW5kZXJlcjphRD1hZi54O2FDPWFmLnk7dmFyIGFGPWFJLl92ZXJ0aWNlcyxhaj1hRlswXSxhaT1hRlthRi5sZW5ndGgtMV0sYW0sYXksYXI7ZnVuY3Rpb24gYUwoYVQsYVYsYVUpe3ZhciBhUz0oYVZbMV0tYVVbMV0pLyhhVlswXS1hVVswXSk7dmFyIGFSPWFWWzFdLWFTKmFWWzBdO3ZhciBhVz1hVCthVlsxXTtyZXR1cm5bKGFXLWFSKS9hUyxhV119YW09YUwoYUMsYWpbMF0sYWlbM10pO2F5PWFMKGFDLGFqWzFdLGFpWzJdKTtmb3IoYU89MDthTzxhRi5sZW5ndGg7YU8rKyl7YXI9YUZbYU9dO2lmKGFDPj1hclswXVsxXSYmYUM8PWFyWzNdWzFdJiZhRD49YW1bMF0mJmFEPD1heVswXSl7cmV0dXJue3Nlcmllc0luZGV4OmFJLmluZGV4LHBvaW50SW5kZXg6YU8sZ3JpZERhdGE6bnVsbCxkYXRhOmFJLmRhdGFbYU9dfX19YnJlYWs7Y2FzZSBILmpxcGxvdC5MaW5lUmVuZGVyZXI6YUQ9YWYueDthQz1hZi55O2FKPWFJLnJlbmRlcmVyO2lmKGFJLnNob3cpe2lmKChhSS5maWxsfHwoYUkucmVuZGVyZXIuYmFuZHMuc2hvdyYmYUkucmVuZGVyZXIuYmFuZHMuZmlsbCkpJiYoIWFnLnBsdWdpbnMuaGlnaGxpZ2h0ZXJ8fCFhZy5wbHVnaW5zLmhpZ2hsaWdodGVyLnNob3cpKXt2YXIgYXE9ZmFsc2U7aWYoYUQ+YUkuX2JvdW5kaW5nQm94WzBdWzBdJiZhRDxhSS5fYm91bmRpbmdCb3hbMV1bMF0mJmFDPmFJLl9ib3VuZGluZ0JveFsxXVsxXSYmYUM8YUkuX2JvdW5kaW5nQm94WzBdWzFdKXt2YXIgYXg9YUkuX2FyZWFQb2ludHMubGVuZ3RoO3ZhciBhQTt2YXIgYU89YXgtMTtmb3IodmFyIGFBPTA7YUE8YXg7YUErKyl7dmFyIGF3PVthSS5fYXJlYVBvaW50c1thQV1bMF0sYUkuX2FyZWFQb2ludHNbYUFdWzFdXTt2YXIgYXY9W2FJLl9hcmVhUG9pbnRzW2FPXVswXSxhSS5fYXJlYVBvaW50c1thT11bMV1dO2lmKGF3WzFdPGFDJiZhdlsxXT49YUN8fGF2WzFdPGFDJiZhd1sxXT49YUMpe2lmKGF3WzBdKyhhQy1hd1sxXSkvKGF2WzFdLWF3WzFdKSooYXZbMF0tYXdbMF0pPGFEKXthcT0hYXF9fWFPPWFBfX1pZihhcSl7cmV0dXJue3Nlcmllc0luZGV4OmFQLHBvaW50SW5kZXg6bnVsbCxncmlkRGF0YTphSS5ncmlkRGF0YSxkYXRhOmFJLmRhdGEscG9pbnRzOmFJLl9hcmVhUG9pbnRzfX1icmVha31lbHNle2FIPWFJLm1hcmtlclJlbmRlcmVyLnNpemUvMithSS5uZWlnaGJvclRocmVzaG9sZDthaD0oYUg+MCk/YUg6MDtmb3IodmFyIGFPPTA7YU88YUkuZ3JpZERhdGEubGVuZ3RoO2FPKyspe2FLPWFJLmdyaWREYXRhW2FPXTtpZihhSi5jb25zdHJ1Y3Rvcj09SC5qcXBsb3QuT0hMQ1JlbmRlcmVyKXtpZihhSi5jYW5kbGVTdGljayl7dmFyIGFvPWFJLl95YXhpcy5zZXJpZXNfdTJwO2lmKGFEPj1hS1swXS1hSi5fYm9keVdpZHRoLzImJmFEPD1hS1swXSthSi5fYm9keVdpZHRoLzImJmFDPj1hbyhhSS5kYXRhW2FPXVsyXSkmJmFDPD1hbyhhSS5kYXRhW2FPXVszXSkpe3JldHVybntzZXJpZXNJbmRleDphUCxwb2ludEluZGV4OmFPLGdyaWREYXRhOmFLLGRhdGE6YUkuZGF0YVthT119fX1lbHNle2lmKCFhSi5obGMpe3ZhciBhbz1hSS5feWF4aXMuc2VyaWVzX3UycDtpZihhRD49YUtbMF0tYUouX3RpY2tMZW5ndGgmJmFEPD1hS1swXSthSi5fdGlja0xlbmd0aCYmYUM+PWFvKGFJLmRhdGFbYU9dWzJdKSYmYUM8PWFvKGFJLmRhdGFbYU9dWzNdKSl7cmV0dXJue3Nlcmllc0luZGV4OmFQLHBvaW50SW5kZXg6YU8sZ3JpZERhdGE6YUssZGF0YTphSS5kYXRhW2FPXX19fWVsc2V7dmFyIGFvPWFJLl95YXhpcy5zZXJpZXNfdTJwO2lmKGFEPj1hS1swXS1hSi5fdGlja0xlbmd0aCYmYUQ8PWFLWzBdK2FKLl90aWNrTGVuZ3RoJiZhQz49YW8oYUkuZGF0YVthT11bMV0pJiZhQzw9YW8oYUkuZGF0YVthT11bMl0pKXtyZXR1cm57c2VyaWVzSW5kZXg6YVAscG9pbnRJbmRleDphTyxncmlkRGF0YTphSyxkYXRhOmFJLmRhdGFbYU9dfX19fX1lbHNle2lmKGFLWzBdIT1udWxsJiZhS1sxXSE9bnVsbCl7YVE9TWF0aC5zcXJ0KChhRC1hS1swXSkqKGFELWFLWzBdKSsoYUMtYUtbMV0pKihhQy1hS1sxXSkpO2lmKGFRPD1haCYmKGFRPD1hTXx8YU09PW51bGwpKXthTT1hUTtyZXR1cm57c2VyaWVzSW5kZXg6YVAscG9pbnRJbmRleDphTyxncmlkRGF0YTphSyxkYXRhOmFJLmRhdGFbYU9dfX19fX19fWJyZWFrO2RlZmF1bHQ6YUQ9YWYueDthQz1hZi55O2FKPWFJLnJlbmRlcmVyO2lmKGFJLnNob3cpe2FIPWFJLm1hcmtlclJlbmRlcmVyLnNpemUvMithSS5uZWlnaGJvclRocmVzaG9sZDthaD0oYUg+MCk/YUg6MDtmb3IodmFyIGFPPTA7YU88YUkuZ3JpZERhdGEubGVuZ3RoO2FPKyspe2FLPWFJLmdyaWREYXRhW2FPXTtpZihhSi5jb25zdHJ1Y3Rvcj09SC5qcXBsb3QuT0hMQ1JlbmRlcmVyKXtpZihhSi5jYW5kbGVTdGljayl7dmFyIGFvPWFJLl95YXhpcy5zZXJpZXNfdTJwO2lmKGFEPj1hS1swXS1hSi5fYm9keVdpZHRoLzImJmFEPD1hS1swXSthSi5fYm9keVdpZHRoLzImJmFDPj1hbyhhSS5kYXRhW2FPXVsyXSkmJmFDPD1hbyhhSS5kYXRhW2FPXVszXSkpe3JldHVybntzZXJpZXNJbmRleDphUCxwb2ludEluZGV4OmFPLGdyaWREYXRhOmFLLGRhdGE6YUkuZGF0YVthT119fX1lbHNle2lmKCFhSi5obGMpe3ZhciBhbz1hSS5feWF4aXMuc2VyaWVzX3UycDtpZihhRD49YUtbMF0tYUouX3RpY2tMZW5ndGgmJmFEPD1hS1swXSthSi5fdGlja0xlbmd0aCYmYUM+PWFvKGFJLmRhdGFbYU9dWzJdKSYmYUM8PWFvKGFJLmRhdGFbYU9dWzNdKSl7cmV0dXJue3Nlcmllc0luZGV4OmFQLHBvaW50SW5kZXg6YU8sZ3JpZERhdGE6YUssZGF0YTphSS5kYXRhW2FPXX19fWVsc2V7dmFyIGFvPWFJLl95YXhpcy5zZXJpZXNfdTJwO2lmKGFEPj1hS1swXS1hSi5fdGlja0xlbmd0aCYmYUQ8PWFLWzBdK2FKLl90aWNrTGVuZ3RoJiZhQz49YW8oYUkuZGF0YVthT11bMV0pJiZhQzw9YW8oYUkuZGF0YVthT11bMl0pKXtyZXR1cm57c2VyaWVzSW5kZXg6YVAscG9pbnRJbmRleDphTyxncmlkRGF0YTphSyxkYXRhOmFJLmRhdGFbYU9dfX19fX1lbHNle2FRPU1hdGguc3FydCgoYUQtYUtbMF0pKihhRC1hS1swXSkrKGFDLWFLWzFdKSooYUMtYUtbMV0pKTtpZihhUTw9YWgmJihhUTw9YU18fGFNPT1udWxsKSl7YU09YVE7cmV0dXJue3Nlcmllc0luZGV4OmFQLHBvaW50SW5kZXg6YU8sZ3JpZERhdGE6YUssZGF0YTphSS5kYXRhW2FPXX19fX19YnJlYWt9fXJldHVybiBudWxsfXRoaXMub25DbGljaz1mdW5jdGlvbihhaCl7dmFyIGFnPWFjKGFoKTt2YXIgYWo9YWguZGF0YS5wbG90O3ZhciBhaT1hZShhZy5ncmlkUG9zLGFqKTt2YXIgYWY9alF1ZXJ5LkV2ZW50KCJqcXBsb3RDbGljayIpO2FmLnBhZ2VYPWFoLnBhZ2VYO2FmLnBhZ2VZPWFoLnBhZ2VZO0godGhpcykudHJpZ2dlcihhZixbYWcuZ3JpZFBvcyxhZy5kYXRhUG9zLGFpLGFqXSl9O3RoaXMub25EYmxDbGljaz1mdW5jdGlvbihhaCl7dmFyIGFnPWFjKGFoKTt2YXIgYWo9YWguZGF0YS5wbG90O3ZhciBhaT1hZShhZy5ncmlkUG9zLGFqKTt2YXIgYWY9alF1ZXJ5LkV2ZW50KCJqcXBsb3REYmxDbGljayIpO2FmLnBhZ2VYPWFoLnBhZ2VYO2FmLnBhZ2VZPWFoLnBhZ2VZO0godGhpcykudHJpZ2dlcihhZixbYWcuZ3JpZFBvcyxhZy5kYXRhUG9zLGFpLGFqXSl9O3RoaXMub25Nb3VzZURvd249ZnVuY3Rpb24oYWgpe3ZhciBhZz1hYyhhaCk7dmFyIGFqPWFoLmRhdGEucGxvdDt2YXIgYWk9YWUoYWcuZ3JpZFBvcyxhaik7dmFyIGFmPWpRdWVyeS5FdmVudCgianFwbG90TW91c2VEb3duIik7YWYucGFnZVg9YWgucGFnZVg7YWYucGFnZVk9YWgucGFnZVk7SCh0aGlzKS50cmlnZ2VyKGFmLFthZy5ncmlkUG9zLGFnLmRhdGFQb3MsYWksYWpdKX07dGhpcy5vbk1vdXNlVXA9ZnVuY3Rpb24oYWgpe3ZhciBhZz1hYyhhaCk7dmFyIGFmPWpRdWVyeS5FdmVudCgianFwbG90TW91c2VVcCIpO2FmLnBhZ2VYPWFoLnBhZ2VYO2FmLnBhZ2VZPWFoLnBhZ2VZO0godGhpcykudHJpZ2dlcihhZixbYWcuZ3JpZFBvcyxhZy5kYXRhUG9zLG51bGwsYWguZGF0YS5wbG90XSl9O3RoaXMub25SaWdodENsaWNrPWZ1bmN0aW9uKGFoKXt2YXIgYWc9YWMoYWgpO3ZhciBhaj1haC5kYXRhLnBsb3Q7dmFyIGFpPWFlKGFnLmdyaWRQb3MsYWopO2lmKGFqLmNhcHR1cmVSaWdodENsaWNrKXtpZihhaC53aGljaD09Myl7dmFyIGFmPWpRdWVyeS5FdmVudCgianFwbG90UmlnaHRDbGljayIpO2FmLnBhZ2VYPWFoLnBhZ2VYO2FmLnBhZ2VZPWFoLnBhZ2VZO0godGhpcykudHJpZ2dlcihhZixbYWcuZ3JpZFBvcyxhZy5kYXRhUG9zLGFpLGFqXSl9ZWxzZXt2YXIgYWY9alF1ZXJ5LkV2ZW50KCJqcXBsb3RNb3VzZVVwIik7YWYucGFnZVg9YWgucGFnZVg7YWYucGFnZVk9YWgucGFnZVk7SCh0aGlzKS50cmlnZ2VyKGFmLFthZy5ncmlkUG9zLGFnLmRhdGFQb3MsYWksYWpdKX19fTt0aGlzLm9uTW91c2VNb3ZlPWZ1bmN0aW9uKGFoKXt2YXIgYWc9YWMoYWgpO3ZhciBhaj1haC5kYXRhLnBsb3Q7dmFyIGFpPWFlKGFnLmdyaWRQb3MsYWopO3ZhciBhZj1qUXVlcnkuRXZlbnQoImpxcGxvdE1vdXNlTW92ZSIpO2FmLnBhZ2VYPWFoLnBhZ2VYO2FmLnBhZ2VZPWFoLnBhZ2VZO0godGhpcykudHJpZ2dlcihhZixbYWcuZ3JpZFBvcyxhZy5kYXRhUG9zLGFpLGFqXSl9O3RoaXMub25Nb3VzZUVudGVyPWZ1bmN0aW9uKGFoKXt2YXIgYWc9YWMoYWgpO3ZhciBhaT1haC5kYXRhLnBsb3Q7dmFyIGFmPWpRdWVyeS5FdmVudCgianFwbG90TW91c2VFbnRlciIpO2FmLnBhZ2VYPWFoLnBhZ2VYO2FmLnBhZ2VZPWFoLnBhZ2VZO2FmLnJlbGF0ZWRUYXJnZXQ9YWgucmVsYXRlZFRhcmdldDtIKHRoaXMpLnRyaWdnZXIoYWYsW2FnLmdyaWRQb3MsYWcuZGF0YVBvcyxudWxsLGFpXSl9O3RoaXMub25Nb3VzZUxlYXZlPWZ1bmN0aW9uKGFoKXt2YXIgYWc9YWMoYWgpO3ZhciBhaT1haC5kYXRhLnBsb3Q7dmFyIGFmPWpRdWVyeS5FdmVudCgianFwbG90TW91c2VMZWF2ZSIpO2FmLnBhZ2VYPWFoLnBhZ2VYO2FmLnBhZ2VZPWFoLnBhZ2VZO2FmLnJlbGF0ZWRUYXJnZXQ9YWgucmVsYXRlZFRhcmdldDtIKHRoaXMpLnRyaWdnZXIoYWYsW2FnLmdyaWRQb3MsYWcuZGF0YVBvcyxudWxsLGFpXSl9O3RoaXMuZHJhd1Nlcmllcz1mdW5jdGlvbihhaCxhZil7dmFyIGFqLGFpLGFnO2FmPSh0eXBlb2YoYWgpPT09Im51bWJlciImJmFmPT1udWxsKT9haDphZjthaD0odHlwZW9mKGFoKT09PSJvYmplY3QiKT9haDp7fTtpZihhZiE9cil7YWk9dGhpcy5zZXJpZXNbYWZdO2FnPWFpLnNoYWRvd0NhbnZhcy5fY3R4O2FnLmNsZWFyUmVjdCgwLDAsYWcuY2FudmFzLndpZHRoLGFnLmNhbnZhcy5oZWlnaHQpO2FpLmRyYXdTaGFkb3coYWcsYWgsdGhpcyk7YWc9YWkuY2FudmFzLl9jdHg7YWcuY2xlYXJSZWN0KDAsMCxhZy5jYW52YXMud2lkdGgsYWcuY2FudmFzLmhlaWdodCk7YWkuZHJhdyhhZyxhaCx0aGlzKTtpZihhaS5yZW5kZXJlci5jb25zdHJ1Y3Rvcj09SC5qcXBsb3QuQmV6aWVyQ3VydmVSZW5kZXJlcil7aWYoYWY8dGhpcy5zZXJpZXMubGVuZ3RoLTEpe3RoaXMuZHJhd1NlcmllcyhhZisxKX19fWVsc2V7Zm9yKGFqPTA7YWo8dGhpcy5zZXJpZXMubGVuZ3RoO2FqKyspe2FpPXRoaXMuc2VyaWVzW2FqXTthZz1haS5zaGFkb3dDYW52YXMuX2N0eDthZy5jbGVhclJlY3QoMCwwLGFnLmNhbnZhcy53aWR0aCxhZy5jYW52YXMuaGVpZ2h0KTthaS5kcmF3U2hhZG93KGFnLGFoLHRoaXMpO2FnPWFpLmNhbnZhcy5fY3R4O2FnLmNsZWFyUmVjdCgwLDAsYWcuY2FudmFzLndpZHRoLGFnLmNhbnZhcy5oZWlnaHQpO2FpLmRyYXcoYWcsYWgsdGhpcyl9fWFoPWFmPWFqPWFpPWFnPW51bGx9O3RoaXMubW92ZVNlcmllc1RvRnJvbnQ9ZnVuY3Rpb24oYWcpe2FnPXBhcnNlSW50KGFnLDEwKTt2YXIgYWo9SC5pbkFycmF5KGFnLHRoaXMuc2VyaWVzU3RhY2spO2lmKGFqPT0tMSl7cmV0dXJufWlmKGFqPT10aGlzLnNlcmllc1N0YWNrLmxlbmd0aC0xKXt0aGlzLnByZXZpb3VzU2VyaWVzU3RhY2s9dGhpcy5zZXJpZXNTdGFjay5zbGljZSgwKTtyZXR1cm59dmFyIGFmPXRoaXMuc2VyaWVzU3RhY2tbdGhpcy5zZXJpZXNTdGFjay5sZW5ndGgtMV07dmFyIGFpPXRoaXMuc2VyaWVzW2FnXS5jYW52YXMuX2VsZW0uZGV0YWNoKCk7dmFyIGFoPXRoaXMuc2VyaWVzW2FnXS5zaGFkb3dDYW52YXMuX2VsZW0uZGV0YWNoKCk7dGhpcy5zZXJpZXNbYWZdLnNoYWRvd0NhbnZhcy5fZWxlbS5hZnRlcihhaCk7dGhpcy5zZXJpZXNbYWZdLmNhbnZhcy5fZWxlbS5hZnRlcihhaSk7dGhpcy5wcmV2aW91c1Nlcmllc1N0YWNrPXRoaXMuc2VyaWVzU3RhY2suc2xpY2UoMCk7dGhpcy5zZXJpZXNTdGFjay5zcGxpY2UoYWosMSk7dGhpcy5zZXJpZXNTdGFjay5wdXNoKGFnKX07dGhpcy5tb3ZlU2VyaWVzVG9CYWNrPWZ1bmN0aW9uKGFnKXthZz1wYXJzZUludChhZywxMCk7dmFyIGFqPUguaW5BcnJheShhZyx0aGlzLnNlcmllc1N0YWNrKTtpZihhaj09MHx8YWo9PS0xKXtyZXR1cm59dmFyIGFmPXRoaXMuc2VyaWVzU3RhY2tbMF07dmFyIGFpPXRoaXMuc2VyaWVzW2FnXS5jYW52YXMuX2VsZW0uZGV0YWNoKCk7dmFyIGFoPXRoaXMuc2VyaWVzW2FnXS5zaGFkb3dDYW52YXMuX2VsZW0uZGV0YWNoKCk7dGhpcy5zZXJpZXNbYWZdLnNoYWRvd0NhbnZhcy5fZWxlbS5iZWZvcmUoYWgpO3RoaXMuc2VyaWVzW2FmXS5jYW52YXMuX2VsZW0uYmVmb3JlKGFpKTt0aGlzLnByZXZpb3VzU2VyaWVzU3RhY2s9dGhpcy5zZXJpZXNTdGFjay5zbGljZSgwKTt0aGlzLnNlcmllc1N0YWNrLnNwbGljZShhaiwxKTt0aGlzLnNlcmllc1N0YWNrLnVuc2hpZnQoYWcpfTt0aGlzLnJlc3RvcmVQcmV2aW91c1Nlcmllc09yZGVyPWZ1bmN0aW9uKCl7dmFyIGFsLGFrLGFqLGFpLGFoLGFmLGFnO2lmKHRoaXMuc2VyaWVzU3RhY2s9PXRoaXMucHJldmlvdXNTZXJpZXNTdGFjayl7cmV0dXJufWZvcihhbD0xO2FsPHRoaXMucHJldmlvdXNTZXJpZXNTdGFjay5sZW5ndGg7YWwrKyl7YWY9dGhpcy5wcmV2aW91c1Nlcmllc1N0YWNrW2FsXTthZz10aGlzLnByZXZpb3VzU2VyaWVzU3RhY2tbYWwtMV07YWo9dGhpcy5zZXJpZXNbYWZdLmNhbnZhcy5fZWxlbS5kZXRhY2goKTthaT10aGlzLnNlcmllc1thZl0uc2hhZG93Q2FudmFzLl9lbGVtLmRldGFjaCgpO3RoaXMuc2VyaWVzW2FnXS5zaGFkb3dDYW52YXMuX2VsZW0uYWZ0ZXIoYWkpO3RoaXMuc2VyaWVzW2FnXS5jYW52YXMuX2VsZW0uYWZ0ZXIoYWopfWFoPXRoaXMuc2VyaWVzU3RhY2suc2xpY2UoMCk7dGhpcy5zZXJpZXNTdGFjaz10aGlzLnByZXZpb3VzU2VyaWVzU3RhY2suc2xpY2UoMCk7dGhpcy5wcmV2aW91c1Nlcmllc1N0YWNrPWFofTt0aGlzLnJlc3RvcmVPcmlnaW5hbFNlcmllc09yZGVyPWZ1bmN0aW9uKCl7dmFyIGFqLGFpLGFmPVtdLGFoLGFnO2Zvcihhaj0wO2FqPHRoaXMuc2VyaWVzLmxlbmd0aDthaisrKXthZi5wdXNoKGFqKX1pZih0aGlzLnNlcmllc1N0YWNrPT1hZil7cmV0dXJufXRoaXMucHJldmlvdXNTZXJpZXNTdGFjaz10aGlzLnNlcmllc1N0YWNrLnNsaWNlKDApO3RoaXMuc2VyaWVzU3RhY2s9YWY7Zm9yKGFqPTE7YWo8dGhpcy5zZXJpZXNTdGFjay5sZW5ndGg7YWorKyl7YWg9dGhpcy5zZXJpZXNbYWpdLmNhbnZhcy5fZWxlbS5kZXRhY2goKTthZz10aGlzLnNlcmllc1thal0uc2hhZG93Q2FudmFzLl9lbGVtLmRldGFjaCgpO3RoaXMuc2VyaWVzW2FqLTFdLnNoYWRvd0NhbnZhcy5fZWxlbS5hZnRlcihhZyk7dGhpcy5zZXJpZXNbYWotMV0uY2FudmFzLl9lbGVtLmFmdGVyKGFoKX19O3RoaXMuYWN0aXZhdGVUaGVtZT1mdW5jdGlvbihhZil7dGhpcy50aGVtZUVuZ2luZS5hY3RpdmF0ZSh0aGlzLGFmKX19SC5qcXBsb3QuY29tcHV0ZUhpZ2hsaWdodENvbG9ycz1mdW5jdGlvbihhYyl7dmFyIGFlO2lmKGpRdWVyeS5pc0FycmF5KGFjKSl7YWU9W107Zm9yKHZhciBhZz0wO2FnPGFjLmxlbmd0aDthZysrKXt2YXIgYWY9SC5qcXBsb3QuZ2V0Q29sb3JDb21wb25lbnRzKGFjW2FnXSk7dmFyIGFiPVthZlswXSxhZlsxXSxhZlsyXV07dmFyIGFoPWFiWzBdK2FiWzFdK2FiWzJdO2Zvcih2YXIgYWQ9MDthZDwzO2FkKyspe2FiW2FkXT0oYWg+NjYwKT9hYlthZF0qMC44NTowLjczKmFiW2FkXSs5MDthYlthZF09cGFyc2VJbnQoYWJbYWRdLDEwKTsoYWJbYWRdPjI1NSk/MjU1OmFiW2FkXX1hYlszXT0wLjMrMC4zNSphZlszXTthZS5wdXNoKCJyZ2JhKCIrYWJbMF0rIiwiK2FiWzFdKyIsIithYlsyXSsiLCIrYWJbM10rIikiKX19ZWxzZXt2YXIgYWY9SC5qcXBsb3QuZ2V0Q29sb3JDb21wb25lbnRzKGFjKTt2YXIgYWI9W2FmWzBdLGFmWzFdLGFmWzJdXTt2YXIgYWg9YWJbMF0rYWJbMV0rYWJbMl07Zm9yKHZhciBhZD0wO2FkPDM7YWQrKyl7YWJbYWRdPShhaD42NjApP2FiW2FkXSowLjg1OjAuNzMqYWJbYWRdKzkwO2FiW2FkXT1wYXJzZUludChhYlthZF0sMTApOyhhYlthZF0+MjU1KT8yNTU6YWJbYWRdfWFiWzNdPTAuMyswLjM1KmFmWzNdO2FlPSJyZ2JhKCIrYWJbMF0rIiwiK2FiWzFdKyIsIithYlsyXSsiLCIrYWJbM10rIikifXJldHVybiBhZX07SC5qcXBsb3QuQ29sb3JHZW5lcmF0b3I9ZnVuY3Rpb24oYWMpe2FjPWFjfHxILmpxcGxvdC5jb25maWcuZGVmYXVsdENvbG9yczt2YXIgYWI9MDt0aGlzLm5leHQ9ZnVuY3Rpb24oKXtpZihhYjxhYy5sZW5ndGgpe3JldHVybiBhY1thYisrXX1lbHNle2FiPTA7cmV0dXJuIGFjW2FiKytdfX07dGhpcy5wcmV2aW91cz1mdW5jdGlvbigpe2lmKGFiPjApe3JldHVybiBhY1thYi0tXX1lbHNle2FiPWFjLmxlbmd0aC0xO3JldHVybiBhY1thYl19fTt0aGlzLmdldD1mdW5jdGlvbihhZSl7dmFyIGFkPWFlLWFjLmxlbmd0aCpNYXRoLmZsb29yKGFlL2FjLmxlbmd0aCk7cmV0dXJuIGFjW2FkXX07dGhpcy5zZXRDb2xvcnM9ZnVuY3Rpb24oYWQpe2FjPWFkfTt0aGlzLnJlc2V0PWZ1bmN0aW9uKCl7YWI9MH07dGhpcy5nZXRJbmRleD1mdW5jdGlvbigpe3JldHVybiBhYn07dGhpcy5zZXRJbmRleD1mdW5jdGlvbihhZCl7YWI9YWR9fTtILmpxcGxvdC5oZXgycmdiPWZ1bmN0aW9uKGFkLGFiKXthZD1hZC5yZXBsYWNlKCIjIiwiIik7aWYoYWQubGVuZ3RoPT0zKXthZD1hZC5jaGFyQXQoMCkrYWQuY2hhckF0KDApK2FkLmNoYXJBdCgxKSthZC5jaGFyQXQoMSkrYWQuY2hhckF0KDIpK2FkLmNoYXJBdCgyKX12YXIgYWM7YWM9InJnYmEoIitwYXJzZUludChhZC5zbGljZSgwLDIpLDE2KSsiLCAiK3BhcnNlSW50KGFkLnNsaWNlKDIsNCksMTYpKyIsICIrcGFyc2VJbnQoYWQuc2xpY2UoNCw2KSwxNik7aWYoYWIpe2FjKz0iLCAiK2FifWFjKz0iKSI7cmV0dXJuIGFjfTtILmpxcGxvdC5yZ2IyaGV4PWZ1bmN0aW9uKGFnKXt2YXIgYWQ9L3JnYmE/XCggKihbMC05XXsxLDN9XC4/WzAtOV0qJT8pICosICooWzAtOV17MSwzfVwuP1swLTldKiU/KSAqLCAqKFswLTldezEsM31cLj9bMC05XSolPykgKig/OiwgKlswLTkuXSopP1wpLzt2YXIgYWI9YWcubWF0Y2goYWQpO3ZhciBhZj0iIyI7Zm9yKHZhciBhZT0xO2FlPDQ7YWUrKyl7dmFyIGFjO2lmKGFiW2FlXS5zZWFyY2goLyUvKSE9LTEpe2FjPXBhcnNlSW50KDI1NSphYlthZV0vMTAwLDEwKS50b1N0cmluZygxNik7aWYoYWMubGVuZ3RoPT0xKXthYz0iMCIrYWN9fWVsc2V7YWM9cGFyc2VJbnQoYWJbYWVdLDEwKS50b1N0cmluZygxNik7aWYoYWMubGVuZ3RoPT0xKXthYz0iMCIrYWN9fWFmKz1hY31yZXR1cm4gYWZ9O0guanFwbG90Lm5vcm1hbGl6ZTJyZ2I9ZnVuY3Rpb24oYWMsYWIpe2lmKGFjLnNlYXJjaCgvXiAqcmdiYT9cKC8pIT0tMSl7cmV0dXJuIGFjfWVsc2V7aWYoYWMuc2VhcmNoKC9eICojP1swLTlhLWZBLUZdP1swLTlhLWZBLUZdLykhPS0xKXtyZXR1cm4gSC5qcXBsb3QuaGV4MnJnYihhYyxhYil9ZWxzZXt0aHJvdyJpbnZhbGlkIGNvbG9yIHNwZWMifX19O0guanFwbG90LmdldENvbG9yQ29tcG9uZW50cz1mdW5jdGlvbihhZyl7YWc9SC5qcXBsb3QuY29sb3JLZXl3b3JkTWFwW2FnXXx8YWc7dmFyIGFlPUguanFwbG90Lm5vcm1hbGl6ZTJyZ2IoYWcpO3ZhciBhZD0vcmdiYT9cKCAqKFswLTldezEsM31cLj9bMC05XSolPykgKiwgKihbMC05XXsxLDN9XC4/WzAtOV0qJT8pICosICooWzAtOV17MSwzfVwuP1swLTldKiU/KSAqLD8gKihbMC05Ll0qICopP1wpLzt2YXIgYWI9YWUubWF0Y2goYWQpO3ZhciBhYz1bXTtmb3IodmFyIGFmPTE7YWY8NDthZisrKXtpZihhYlthZl0uc2VhcmNoKC8lLykhPS0xKXthY1thZi0xXT1wYXJzZUludCgyNTUqYWJbYWZdLzEwMCwxMCl9ZWxzZXthY1thZi0xXT1wYXJzZUludChhYlthZl0sMTApfX1hY1szXT1wYXJzZUZsb2F0KGFiWzRdKT9wYXJzZUZsb2F0KGFiWzRdKToxO3JldHVybiBhY307SC5qcXBsb3QuY29sb3JLZXl3b3JkTWFwPXthbGljZWJsdWU6InJnYigyNDAsIDI0OCwgMjU1KSIsYW50aXF1ZXdoaXRlOiJyZ2IoMjUwLCAyMzUsIDIxNSkiLGFxdWE6InJnYiggMCwgMjU1LCAyNTUpIixhcXVhbWFyaW5lOiJyZ2IoMTI3LCAyNTUsIDIxMikiLGF6dXJlOiJyZ2IoMjQwLCAyNTUsIDI1NSkiLGJlaWdlOiJyZ2IoMjQ1LCAyNDUsIDIyMCkiLGJpc3F1ZToicmdiKDI1NSwgMjI4LCAxOTYpIixibGFjazoicmdiKCAwLCAwLCAwKSIsYmxhbmNoZWRhbG1vbmQ6InJnYigyNTUsIDIzNSwgMjA1KSIsYmx1ZToicmdiKCAwLCAwLCAyNTUpIixibHVldmlvbGV0OiJyZ2IoMTM4LCA0MywgMjI2KSIsYnJvd246InJnYigxNjUsIDQyLCA0MikiLGJ1cmx5d29vZDoicmdiKDIyMiwgMTg0LCAxMzUpIixjYWRldGJsdWU6InJnYiggOTUsIDE1OCwgMTYwKSIsY2hhcnRyZXVzZToicmdiKDEyNywgMjU1LCAwKSIsY2hvY29sYXRlOiJyZ2IoMjEwLCAxMDUsIDMwKSIsY29yYWw6InJnYigyNTUsIDEyNywgODApIixjb3JuZmxvd2VyYmx1ZToicmdiKDEwMCwgMTQ5LCAyMzcpIixjb3Juc2lsazoicmdiKDI1NSwgMjQ4LCAyMjApIixjcmltc29uOiJyZ2IoMjIwLCAyMCwgNjApIixjeWFuOiJyZ2IoIDAsIDI1NSwgMjU1KSIsZGFya2JsdWU6InJnYiggMCwgMCwgMTM5KSIsZGFya2N5YW46InJnYiggMCwgMTM5LCAxMzkpIixkYXJrZ29sZGVucm9kOiJyZ2IoMTg0LCAxMzQsIDExKSIsZGFya2dyYXk6InJnYigxNjksIDE2OSwgMTY5KSIsZGFya2dyZWVuOiJyZ2IoIDAsIDEwMCwgMCkiLGRhcmtncmV5OiJyZ2IoMTY5LCAxNjksIDE2OSkiLGRhcmtraGFraToicmdiKDE4OSwgMTgzLCAxMDcpIixkYXJrbWFnZW50YToicmdiKDEzOSwgMCwgMTM5KSIsZGFya29saXZlZ3JlZW46InJnYiggODUsIDEwNywgNDcpIixkYXJrb3JhbmdlOiJyZ2IoMjU1LCAxNDAsIDApIixkYXJrb3JjaGlkOiJyZ2IoMTUzLCA1MCwgMjA0KSIsZGFya3JlZDoicmdiKDEzOSwgMCwgMCkiLGRhcmtzYWxtb246InJnYigyMzMsIDE1MCwgMTIyKSIsZGFya3NlYWdyZWVuOiJyZ2IoMTQzLCAxODgsIDE0MykiLGRhcmtzbGF0ZWJsdWU6InJnYiggNzIsIDYxLCAxMzkpIixkYXJrc2xhdGVncmF5OiJyZ2IoIDQ3LCA3OSwgNzkpIixkYXJrc2xhdGVncmV5OiJyZ2IoIDQ3LCA3OSwgNzkpIixkYXJrdHVycXVvaXNlOiJyZ2IoIDAsIDIwNiwgMjA5KSIsZGFya3Zpb2xldDoicmdiKDE0OCwgMCwgMjExKSIsZGVlcHBpbms6InJnYigyNTUsIDIwLCAxNDcpIixkZWVwc2t5Ymx1ZToicmdiKCAwLCAxOTEsIDI1NSkiLGRpbWdyYXk6InJnYigxMDUsIDEwNSwgMTA1KSIsZGltZ3JleToicmdiKDEwNSwgMTA1LCAxMDUpIixkb2RnZXJibHVlOiJyZ2IoIDMwLCAxNDQsIDI1NSkiLGZpcmVicmljazoicmdiKDE3OCwgMzQsIDM0KSIsZmxvcmFsd2hpdGU6InJnYigyNTUsIDI1MCwgMjQwKSIsZm9yZXN0Z3JlZW46InJnYiggMzQsIDEzOSwgMzQpIixmdWNoc2lhOiJyZ2IoMjU1LCAwLCAyNTUpIixnYWluc2Jvcm86InJnYigyMjAsIDIyMCwgMjIwKSIsZ2hvc3R3aGl0ZToicmdiKDI0OCwgMjQ4LCAyNTUpIixnb2xkOiJyZ2IoMjU1LCAyMTUsIDApIixnb2xkZW5yb2Q6InJnYigyMTgsIDE2NSwgMzIpIixncmF5OiJyZ2IoMTI4LCAxMjgsIDEyOCkiLGdyZXk6InJnYigxMjgsIDEyOCwgMTI4KSIsZ3JlZW46InJnYiggMCwgMTI4LCAwKSIsZ3JlZW55ZWxsb3c6InJnYigxNzMsIDI1NSwgNDcpIixob25leWRldzoicmdiKDI0MCwgMjU1LCAyNDApIixob3RwaW5rOiJyZ2IoMjU1LCAxMDUsIDE4MCkiLGluZGlhbnJlZDoicmdiKDIwNSwgOTIsIDkyKSIsaW5kaWdvOiJyZ2IoIDc1LCAwLCAxMzApIixpdm9yeToicmdiKDI1NSwgMjU1LCAyNDApIixraGFraToicmdiKDI0MCwgMjMwLCAxNDApIixsYXZlbmRlcjoicmdiKDIzMCwgMjMwLCAyNTApIixsYXZlbmRlcmJsdXNoOiJyZ2IoMjU1LCAyNDAsIDI0NSkiLGxhd25ncmVlbjoicmdiKDEyNCwgMjUyLCAwKSIsbGVtb25jaGlmZm9uOiJyZ2IoMjU1LCAyNTAsIDIwNSkiLGxpZ2h0Ymx1ZToicmdiKDE3MywgMjE2LCAyMzApIixsaWdodGNvcmFsOiJyZ2IoMjQwLCAxMjgsIDEyOCkiLGxpZ2h0Y3lhbjoicmdiKDIyNCwgMjU1LCAyNTUpIixsaWdodGdvbGRlbnJvZHllbGxvdzoicmdiKDI1MCwgMjUwLCAyMTApIixsaWdodGdyYXk6InJnYigyMTEsIDIxMSwgMjExKSIsbGlnaHRncmVlbjoicmdiKDE0NCwgMjM4LCAxNDQpIixsaWdodGdyZXk6InJnYigyMTEsIDIxMSwgMjExKSIsbGlnaHRwaW5rOiJyZ2IoMjU1LCAxODIsIDE5MykiLGxpZ2h0c2FsbW9uOiJyZ2IoMjU1LCAxNjAsIDEyMikiLGxpZ2h0c2VhZ3JlZW46InJnYiggMzIsIDE3OCwgMTcwKSIsbGlnaHRza3libHVlOiJyZ2IoMTM1LCAyMDYsIDI1MCkiLGxpZ2h0c2xhdGVncmF5OiJyZ2IoMTE5LCAxMzYsIDE1MykiLGxpZ2h0c2xhdGVncmV5OiJyZ2IoMTE5LCAxMzYsIDE1MykiLGxpZ2h0c3RlZWxibHVlOiJyZ2IoMTc2LCAxOTYsIDIyMikiLGxpZ2h0eWVsbG93OiJyZ2IoMjU1LCAyNTUsIDIyNCkiLGxpbWU6InJnYiggMCwgMjU1LCAwKSIsbGltZWdyZWVuOiJyZ2IoIDUwLCAyMDUsIDUwKSIsbGluZW46InJnYigyNTAsIDI0MCwgMjMwKSIsbWFnZW50YToicmdiKDI1NSwgMCwgMjU1KSIsbWFyb29uOiJyZ2IoMTI4LCAwLCAwKSIsbWVkaXVtYXF1YW1hcmluZToicmdiKDEwMiwgMjA1LCAxNzApIixtZWRpdW1ibHVlOiJyZ2IoIDAsIDAsIDIwNSkiLG1lZGl1bW9yY2hpZDoicmdiKDE4NiwgODUsIDIxMSkiLG1lZGl1bXB1cnBsZToicmdiKDE0NywgMTEyLCAyMTkpIixtZWRpdW1zZWFncmVlbjoicmdiKCA2MCwgMTc5LCAxMTMpIixtZWRpdW1zbGF0ZWJsdWU6InJnYigxMjMsIDEwNCwgMjM4KSIsbWVkaXVtc3ByaW5nZ3JlZW46InJnYiggMCwgMjUwLCAxNTQpIixtZWRpdW10dXJxdW9pc2U6InJnYiggNzIsIDIwOSwgMjA0KSIsbWVkaXVtdmlvbGV0cmVkOiJyZ2IoMTk5LCAyMSwgMTMzKSIsbWlkbmlnaHRibHVlOiJyZ2IoIDI1LCAyNSwgMTEyKSIsbWludGNyZWFtOiJyZ2IoMjQ1LCAyNTUsIDI1MCkiLG1pc3R5cm9zZToicmdiKDI1NSwgMjI4LCAyMjUpIixtb2NjYXNpbjoicmdiKDI1NSwgMjI4LCAxODEpIixuYXZham93aGl0ZToicmdiKDI1NSwgMjIyLCAxNzMpIixuYXZ5OiJyZ2IoIDAsIDAsIDEyOCkiLG9sZGxhY2U6InJnYigyNTMsIDI0NSwgMjMwKSIsb2xpdmU6InJnYigxMjgsIDEyOCwgMCkiLG9saXZlZHJhYjoicmdiKDEwNywgMTQyLCAzNSkiLG9yYW5nZToicmdiKDI1NSwgMTY1LCAwKSIsb3JhbmdlcmVkOiJyZ2IoMjU1LCA2OSwgMCkiLG9yY2hpZDoicmdiKDIxOCwgMTEyLCAyMTQpIixwYWxlZ29sZGVucm9kOiJyZ2IoMjM4LCAyMzIsIDE3MCkiLHBhbGVncmVlbjoicmdiKDE1MiwgMjUxLCAxNTIpIixwYWxldHVycXVvaXNlOiJyZ2IoMTc1LCAyMzgsIDIzOCkiLHBhbGV2aW9sZXRyZWQ6InJnYigyMTksIDExMiwgMTQ3KSIscGFwYXlhd2hpcDoicmdiKDI1NSwgMjM5LCAyMTMpIixwZWFjaHB1ZmY6InJnYigyNTUsIDIxOCwgMTg1KSIscGVydToicmdiKDIwNSwgMTMzLCA2MykiLHBpbms6InJnYigyNTUsIDE5MiwgMjAzKSIscGx1bToicmdiKDIyMSwgMTYwLCAyMjEpIixwb3dkZXJibHVlOiJyZ2IoMTc2LCAyMjQsIDIzMCkiLHB1cnBsZToicmdiKDEyOCwgMCwgMTI4KSIscmVkOiJyZ2IoMjU1LCAwLCAwKSIscm9zeWJyb3duOiJyZ2IoMTg4LCAxNDMsIDE0MykiLHJveWFsYmx1ZToicmdiKCA2NSwgMTA1LCAyMjUpIixzYWRkbGVicm93bjoicmdiKDEzOSwgNjksIDE5KSIsc2FsbW9uOiJyZ2IoMjUwLCAxMjgsIDExNCkiLHNhbmR5YnJvd246InJnYigyNDQsIDE2NCwgOTYpIixzZWFncmVlbjoicmdiKCA0NiwgMTM5LCA4NykiLHNlYXNoZWxsOiJyZ2IoMjU1LCAyNDUsIDIzOCkiLHNpZW5uYToicmdiKDE2MCwgODIsIDQ1KSIsc2lsdmVyOiJyZ2IoMTkyLCAxOTIsIDE5MikiLHNreWJsdWU6InJnYigxMzUsIDIwNiwgMjM1KSIsc2xhdGVibHVlOiJyZ2IoMTA2LCA5MCwgMjA1KSIsc2xhdGVncmF5OiJyZ2IoMTEyLCAxMjgsIDE0NCkiLHNsYXRlZ3JleToicmdiKDExMiwgMTI4LCAxNDQpIixzbm93OiJyZ2IoMjU1LCAyNTAsIDI1MCkiLHNwcmluZ2dyZWVuOiJyZ2IoIDAsIDI1NSwgMTI3KSIsc3RlZWxibHVlOiJyZ2IoIDcwLCAxMzAsIDE4MCkiLHRhbjoicmdiKDIxMCwgMTgwLCAxNDApIix0ZWFsOiJyZ2IoIDAsIDEyOCwgMTI4KSIsdGhpc3RsZToicmdiKDIxNiwgMTkxLCAyMTYpIix0b21hdG86InJnYigyNTUsIDk5LCA3MSkiLHR1cnF1b2lzZToicmdiKCA2NCwgMjI0LCAyMDgpIix2aW9sZXQ6InJnYigyMzgsIDEzMCwgMjM4KSIsd2hlYXQ6InJnYigyNDUsIDIyMiwgMTc5KSIsd2hpdGU6InJnYigyNTUsIDI1NSwgMjU1KSIsd2hpdGVzbW9rZToicmdiKDI0NSwgMjQ1LCAyNDUpIix5ZWxsb3c6InJnYigyNTUsIDI1NSwgMCkiLHllbGxvd2dyZWVuOiJyZ2IoMTU0LCAyMDUsIDUwKSJ9O0guanFwbG90LkF4aXNMYWJlbFJlbmRlcmVyPWZ1bmN0aW9uKGFiKXtILmpxcGxvdC5FbGVtQ29udGFpbmVyLmNhbGwodGhpcyk7dGhpcy5heGlzO3RoaXMuc2hvdz10cnVlO3RoaXMubGFiZWw9IiI7dGhpcy5mb250RmFtaWx5PW51bGw7dGhpcy5mb250U2l6ZT1udWxsO3RoaXMudGV4dENvbG9yPW51bGw7dGhpcy5fZWxlbTt0aGlzLmVzY2FwZUhUTUw9ZmFsc2U7SC5leHRlbmQodHJ1ZSx0aGlzLGFiKX07SC5qcXBsb3QuQXhpc0xhYmVsUmVuZGVyZXIucHJvdG90eXBlPW5ldyBILmpxcGxvdC5FbGVtQ29udGFpbmVyKCk7SC5qcXBsb3QuQXhpc0xhYmVsUmVuZGVyZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yPUguanFwbG90LkF4aXNMYWJlbFJlbmRlcmVyO0guanFwbG90LkF4aXNMYWJlbFJlbmRlcmVyLnByb3RvdHlwZS5pbml0PWZ1bmN0aW9uKGFiKXtILmV4dGVuZCh0cnVlLHRoaXMsYWIpfTtILmpxcGxvdC5BeGlzTGFiZWxSZW5kZXJlci5wcm90b3R5cGUuZHJhdz1mdW5jdGlvbihhYixhYyl7aWYodGhpcy5fZWxlbSl7dGhpcy5fZWxlbS5lbXB0eUZvcmNlKCk7dGhpcy5fZWxlbT1udWxsfXRoaXMuX2VsZW09SCgnPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7IiBjbGFzcz0ianFwbG90LScrdGhpcy5heGlzKyctbGFiZWwiPjwvZGl2PicpO2lmKE51bWJlcih0aGlzLmxhYmVsKSl7dGhpcy5fZWxlbS5jc3MoIndoaXRlLXNwYWNlIiwibm93cmFwIil9aWYoIXRoaXMuZXNjYXBlSFRNTCl7dGhpcy5fZWxlbS5odG1sKHRoaXMubGFiZWwpfWVsc2V7dGhpcy5fZWxlbS50ZXh0KHRoaXMubGFiZWwpfWlmKHRoaXMuZm9udEZhbWlseSl7dGhpcy5fZWxlbS5jc3MoImZvbnQtZmFtaWx5Iix0aGlzLmZvbnRGYW1pbHkpfWlmKHRoaXMuZm9udFNpemUpe3RoaXMuX2VsZW0uY3NzKCJmb250LXNpemUiLHRoaXMuZm9udFNpemUpfWlmKHRoaXMudGV4dENvbG9yKXt0aGlzLl9lbGVtLmNzcygiY29sb3IiLHRoaXMudGV4dENvbG9yKX1yZXR1cm4gdGhpcy5fZWxlbX07SC5qcXBsb3QuQXhpc0xhYmVsUmVuZGVyZXIucHJvdG90eXBlLnBhY2s9ZnVuY3Rpb24oKXt9O0guanFwbG90LkF4aXNUaWNrUmVuZGVyZXI9ZnVuY3Rpb24oYWIpe0guanFwbG90LkVsZW1Db250YWluZXIuY2FsbCh0aGlzKTt0aGlzLm1hcms9Im91dHNpZGUiO3RoaXMuYXhpczt0aGlzLnNob3dNYXJrPXRydWU7dGhpcy5zaG93R3JpZGxpbmU9dHJ1ZTt0aGlzLmlzTWlub3JUaWNrPWZhbHNlO3RoaXMuc2l6ZT00O3RoaXMubWFya1NpemU9Njt0aGlzLnNob3c9dHJ1ZTt0aGlzLnNob3dMYWJlbD10cnVlO3RoaXMubGFiZWw9bnVsbDt0aGlzLnZhbHVlPW51bGw7dGhpcy5fc3R5bGVzPXt9O3RoaXMuZm9ybWF0dGVyPUguanFwbG90LkRlZmF1bHRUaWNrRm9ybWF0dGVyO3RoaXMucHJlZml4PSIiO3RoaXMuZm9ybWF0U3RyaW5nPSIiO3RoaXMuZm9udEZhbWlseTt0aGlzLmZvbnRTaXplO3RoaXMudGV4dENvbG9yO3RoaXMuZXNjYXBlSFRNTD1mYWxzZTt0aGlzLl9lbGVtO3RoaXMuX2JyZWFrVGljaz1mYWxzZTtILmV4dGVuZCh0cnVlLHRoaXMsYWIpfTtILmpxcGxvdC5BeGlzVGlja1JlbmRlcmVyLnByb3RvdHlwZS5pbml0PWZ1bmN0aW9uKGFiKXtILmV4dGVuZCh0cnVlLHRoaXMsYWIpfTtILmpxcGxvdC5BeGlzVGlja1JlbmRlcmVyLnByb3RvdHlwZT1uZXcgSC5qcXBsb3QuRWxlbUNvbnRhaW5lcigpO0guanFwbG90LkF4aXNUaWNrUmVuZGVyZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yPUguanFwbG90LkF4aXNUaWNrUmVuZGVyZXI7SC5qcXBsb3QuQXhpc1RpY2tSZW5kZXJlci5wcm90b3R5cGUuc2V0VGljaz1mdW5jdGlvbihhYixhZCxhYyl7dGhpcy52YWx1ZT1hYjt0aGlzLmF4aXM9YWQ7aWYoYWMpe3RoaXMuaXNNaW5vclRpY2s9dHJ1ZX1yZXR1cm4gdGhpc307SC5qcXBsb3QuQXhpc1RpY2tSZW5kZXJlci5wcm90b3R5cGUuZHJhdz1mdW5jdGlvbigpe2lmKHRoaXMubGFiZWw9PT1udWxsKXt0aGlzLmxhYmVsPXRoaXMucHJlZml4K3RoaXMuZm9ybWF0dGVyKHRoaXMuZm9ybWF0U3RyaW5nLHRoaXMudmFsdWUpfXZhciBhYz17cG9zaXRpb246ImFic29sdXRlIn07aWYoTnVtYmVyKHRoaXMubGFiZWwpKXthYy53aGl0U3BhY2U9Im5vd3JhcCJ9aWYodGhpcy5fZWxlbSl7dGhpcy5fZWxlbS5lbXB0eUZvcmNlKCk7dGhpcy5fZWxlbT1udWxsfXRoaXMuX2VsZW09SChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSk7dGhpcy5fZWxlbS5hZGRDbGFzcygianFwbG90LSIrdGhpcy5heGlzKyItdGljayIpO2lmKCF0aGlzLmVzY2FwZUhUTUwpe3RoaXMuX2VsZW0uaHRtbCh0aGlzLmxhYmVsKX1lbHNle3RoaXMuX2VsZW0udGV4dCh0aGlzLmxhYmVsKX10aGlzLl9lbGVtLmNzcyhhYyk7Zm9yKHZhciBhYiBpbiB0aGlzLl9zdHlsZXMpe3RoaXMuX2VsZW0uY3NzKGFiLHRoaXMuX3N0eWxlc1thYl0pfWlmKHRoaXMuZm9udEZhbWlseSl7dGhpcy5fZWxlbS5jc3MoImZvbnQtZmFtaWx5Iix0aGlzLmZvbnRGYW1pbHkpfWlmKHRoaXMuZm9udFNpemUpe3RoaXMuX2VsZW0uY3NzKCJmb250LXNpemUiLHRoaXMuZm9udFNpemUpfWlmKHRoaXMudGV4dENvbG9yKXt0aGlzLl9lbGVtLmNzcygiY29sb3IiLHRoaXMudGV4dENvbG9yKX1pZih0aGlzLl9icmVha1RpY2spe3RoaXMuX2VsZW0uYWRkQ2xhc3MoImpxcGxvdC1icmVha1RpY2siKX1yZXR1cm4gdGhpcy5fZWxlbX07SC5qcXBsb3QuRGVmYXVsdFRpY2tGb3JtYXR0ZXI9ZnVuY3Rpb24oYWIsYWMpe2lmKHR5cGVvZiBhYz09Im51bWJlciIpe2lmKCFhYil7YWI9SC5qcXBsb3QuY29uZmlnLmRlZmF1bHRUaWNrRm9ybWF0U3RyaW5nfXJldHVybiBILmpxcGxvdC5zcHJpbnRmKGFiLGFjKX1lbHNle3JldHVybiBTdHJpbmcoYWMpfX07SC5qcXBsb3QuQXhpc1RpY2tSZW5kZXJlci5wcm90b3R5cGUucGFjaz1mdW5jdGlvbigpe307SC5qcXBsb3QuQ2FudmFzR3JpZFJlbmRlcmVyPWZ1bmN0aW9uKCl7dGhpcy5zaGFkb3dSZW5kZXJlcj1uZXcgSC5qcXBsb3QuU2hhZG93UmVuZGVyZXIoKX07SC5qcXBsb3QuQ2FudmFzR3JpZFJlbmRlcmVyLnByb3RvdHlwZS5pbml0PWZ1bmN0aW9uKGFjKXt0aGlzLl9jdHg7SC5leHRlbmQodHJ1ZSx0aGlzLGFjKTt2YXIgYWI9e2xpbmVKb2luOiJtaXRlciIsbGluZUNhcDoicm91bmQiLGZpbGw6ZmFsc2UsaXNhcmM6ZmFsc2UsYW5nbGU6dGhpcy5zaGFkb3dBbmdsZSxvZmZzZXQ6dGhpcy5zaGFkb3dPZmZzZXQsYWxwaGE6dGhpcy5zaGFkb3dBbHBoYSxkZXB0aDp0aGlzLnNoYWRvd0RlcHRoLGxpbmVXaWR0aDp0aGlzLnNoYWRvd1dpZHRoLGNsb3NlUGF0aDpmYWxzZSxzdHJva2VTdHlsZTp0aGlzLnNoYWRvd0NvbG9yfTt0aGlzLnJlbmRlcmVyLnNoYWRvd1JlbmRlcmVyLmluaXQoYWIpfTtILmpxcGxvdC5DYW52YXNHcmlkUmVuZGVyZXIucHJvdG90eXBlLmNyZWF0ZUVsZW1lbnQ9ZnVuY3Rpb24oYWUpe3ZhciBhZDtpZih0aGlzLl9lbGVtKXtpZihILmpxcGxvdC51c2VfZXhjYW52YXMmJndpbmRvdy5HX3ZtbENhbnZhc01hbmFnZXIudW5pbml0RWxlbWVudCE9PXIpe2FkPXRoaXMuX2VsZW0uZ2V0KDApO3dpbmRvdy5HX3ZtbENhbnZhc01hbmFnZXIudW5pbml0RWxlbWVudChhZCk7YWQ9bnVsbH10aGlzLl9lbGVtLmVtcHR5Rm9yY2UoKTt0aGlzLl9lbGVtPW51bGx9YWQ9YWUuY2FudmFzTWFuYWdlci5nZXRDYW52YXMoKTt2YXIgYWI9dGhpcy5fcGxvdERpbWVuc2lvbnMud2lkdGg7dmFyIGFjPXRoaXMuX3Bsb3REaW1lbnNpb25zLmhlaWdodDthZC53aWR0aD1hYjthZC5oZWlnaHQ9YWM7dGhpcy5fZWxlbT1IKGFkKTt0aGlzLl9lbGVtLmFkZENsYXNzKCJqcXBsb3QtZ3JpZC1jYW52YXMiKTt0aGlzLl9lbGVtLmNzcyh7cG9zaXRpb246ImFic29sdXRlIixsZWZ0OjAsdG9wOjB9KTthZD1hZS5jYW52YXNNYW5hZ2VyLmluaXRDYW52YXMoYWQpO3RoaXMuX3RvcD10aGlzLl9vZmZzZXRzLnRvcDt0aGlzLl9ib3R0b209YWMtdGhpcy5fb2Zmc2V0cy5ib3R0b207dGhpcy5fbGVmdD10aGlzLl9vZmZzZXRzLmxlZnQ7dGhpcy5fcmlnaHQ9YWItdGhpcy5fb2Zmc2V0cy5yaWdodDt0aGlzLl93aWR0aD10aGlzLl9yaWdodC10aGlzLl9sZWZ0O3RoaXMuX2hlaWdodD10aGlzLl9ib3R0b20tdGhpcy5fdG9wO2FkPW51bGw7cmV0dXJuIHRoaXMuX2VsZW19O0guanFwbG90LkNhbnZhc0dyaWRSZW5kZXJlci5wcm90b3R5cGUuZHJhdz1mdW5jdGlvbigpe3RoaXMuX2N0eD10aGlzLl9lbGVtLmdldCgwKS5nZXRDb250ZXh0KCIyZCIpO3ZhciBhbT10aGlzLl9jdHg7dmFyIGFwPXRoaXMuX2F4ZXM7YW0uc2F2ZSgpO2FtLmNsZWFyUmVjdCgwLDAsdGhpcy5fcGxvdERpbWVuc2lvbnMud2lkdGgsdGhpcy5fcGxvdERpbWVuc2lvbnMuaGVpZ2h0KTthbS5maWxsU3R5bGU9dGhpcy5iYWNrZ3JvdW5kQ29sb3J8fHRoaXMuYmFja2dyb3VuZDthbS5maWxsUmVjdCh0aGlzLl9sZWZ0LHRoaXMuX3RvcCx0aGlzLl93aWR0aCx0aGlzLl9oZWlnaHQpO2FtLnNhdmUoKTthbS5saW5lSm9pbj0ibWl0ZXIiO2FtLmxpbmVDYXA9ImJ1dHQiO2FtLmxpbmVXaWR0aD10aGlzLmdyaWRMaW5lV2lkdGg7YW0uc3Ryb2tlU3R5bGU9dGhpcy5ncmlkTGluZUNvbG9yO3ZhciBhdCxhcixhaixhazt2YXIgYWc9WyJ4YXhpcyIsInlheGlzIiwieDJheGlzIiwieTJheGlzIl07Zm9yKHZhciBhcT00O2FxPjA7YXEtLSl7dmFyIGF3PWFnW2FxLTFdO3ZhciBhYj1hcFthd107dmFyIGF1PWFiLl90aWNrczt2YXIgYWw9YXUubGVuZ3RoO2lmKGFiLnNob3cpe2lmKGFiLmRyYXdCYXNlbGluZSl7dmFyIGF2PXt9O2lmKGFiLmJhc2VsaW5lV2lkdGghPT1udWxsKXthdi5saW5lV2lkdGg9YWIuYmFzZWxpbmVXaWR0aH1pZihhYi5iYXNlbGluZUNvbG9yIT09bnVsbCl7YXYuc3Ryb2tlU3R5bGU9YWIuYmFzZWxpbmVDb2xvcn1zd2l0Y2goYXcpe2Nhc2UieGF4aXMiOmFpKHRoaXMuX2xlZnQsdGhpcy5fYm90dG9tLHRoaXMuX3JpZ2h0LHRoaXMuX2JvdHRvbSxhdik7YnJlYWs7Y2FzZSJ5YXhpcyI6YWkodGhpcy5fbGVmdCx0aGlzLl9ib3R0b20sdGhpcy5fbGVmdCx0aGlzLl90b3AsYXYpO2JyZWFrO2Nhc2UieDJheGlzIjphaSh0aGlzLl9sZWZ0LHRoaXMuX2JvdHRvbSx0aGlzLl9yaWdodCx0aGlzLl9ib3R0b20sYXYpO2JyZWFrO2Nhc2UieTJheGlzIjphaSh0aGlzLl9yaWdodCx0aGlzLl9ib3R0b20sdGhpcy5fcmlnaHQsdGhpcy5fdG9wLGF2KTticmVha319Zm9yKHZhciBhbj1hbDthbj4wO2FuLS0pe3ZhciBhaD1hdVthbi0xXTtpZihhaC5zaG93KXt2YXIgYWU9TWF0aC5yb3VuZChhYi51MnAoYWgudmFsdWUpKSswLjU7c3dpdGNoKGF3KXtjYXNlInhheGlzIjppZihhaC5zaG93R3JpZGxpbmUmJnRoaXMuZHJhd0dyaWRsaW5lcyYmKCghYWguaXNNaW5vclRpY2smJmFiLmRyYXdNYWpvckdyaWRsaW5lcyl8fChhaC5pc01pbm9yVGljayYmYWIuZHJhd01pbm9yR3JpZGxpbmVzKSkpe2FpKGFlLHRoaXMuX3RvcCxhZSx0aGlzLl9ib3R0b20pfWlmKGFoLnNob3dNYXJrJiZhaC5tYXJrJiYoKCFhaC5pc01pbm9yVGljayYmYWIuZHJhd01ham9yVGlja01hcmtzKXx8KGFoLmlzTWlub3JUaWNrJiZhYi5kcmF3TWlub3JUaWNrTWFya3MpKSl7YWo9YWgubWFya1NpemU7YWs9YWgubWFyazt2YXIgYWU9TWF0aC5yb3VuZChhYi51MnAoYWgudmFsdWUpKSswLjU7c3dpdGNoKGFrKXtjYXNlIm91dHNpZGUiOmF0PXRoaXMuX2JvdHRvbTthcj10aGlzLl9ib3R0b20rYWo7YnJlYWs7Y2FzZSJpbnNpZGUiOmF0PXRoaXMuX2JvdHRvbS1hajthcj10aGlzLl9ib3R0b207YnJlYWs7Y2FzZSJjcm9zcyI6YXQ9dGhpcy5fYm90dG9tLWFqO2FyPXRoaXMuX2JvdHRvbSthajticmVhaztkZWZhdWx0OmF0PXRoaXMuX2JvdHRvbTthcj10aGlzLl9ib3R0b20rYWo7YnJlYWt9aWYodGhpcy5zaGFkb3cpe3RoaXMucmVuZGVyZXIuc2hhZG93UmVuZGVyZXIuZHJhdyhhbSxbW2FlLGF0XSxbYWUsYXJdXSx7bGluZUNhcDoiYnV0dCIsbGluZVdpZHRoOnRoaXMuZ3JpZExpbmVXaWR0aCxvZmZzZXQ6dGhpcy5ncmlkTGluZVdpZHRoKjAuNzUsZGVwdGg6MixmaWxsOmZhbHNlLGNsb3NlUGF0aDpmYWxzZX0pfWFpKGFlLGF0LGFlLGFyKX1icmVhaztjYXNlInlheGlzIjppZihhaC5zaG93R3JpZGxpbmUmJnRoaXMuZHJhd0dyaWRsaW5lcyYmKCghYWguaXNNaW5vclRpY2smJmFiLmRyYXdNYWpvckdyaWRsaW5lcyl8fChhaC5pc01pbm9yVGljayYmYWIuZHJhd01pbm9yR3JpZGxpbmVzKSkpe2FpKHRoaXMuX3JpZ2h0LGFlLHRoaXMuX2xlZnQsYWUpfWlmKGFoLnNob3dNYXJrJiZhaC5tYXJrJiYoKCFhaC5pc01pbm9yVGljayYmYWIuZHJhd01ham9yVGlja01hcmtzKXx8KGFoLmlzTWlub3JUaWNrJiZhYi5kcmF3TWlub3JUaWNrTWFya3MpKSl7YWo9YWgubWFya1NpemU7YWs9YWgubWFyazt2YXIgYWU9TWF0aC5yb3VuZChhYi51MnAoYWgudmFsdWUpKSswLjU7c3dpdGNoKGFrKXtjYXNlIm91dHNpZGUiOmF0PXRoaXMuX2xlZnQtYWo7YXI9dGhpcy5fbGVmdDticmVhaztjYXNlImluc2lkZSI6YXQ9dGhpcy5fbGVmdDthcj10aGlzLl9sZWZ0K2FqO2JyZWFrO2Nhc2UiY3Jvc3MiOmF0PXRoaXMuX2xlZnQtYWo7YXI9dGhpcy5fbGVmdCthajticmVhaztkZWZhdWx0OmF0PXRoaXMuX2xlZnQtYWo7YXI9dGhpcy5fbGVmdDticmVha31pZih0aGlzLnNoYWRvdyl7dGhpcy5yZW5kZXJlci5zaGFkb3dSZW5kZXJlci5kcmF3KGFtLFtbYXQsYWVdLFthcixhZV1dLHtsaW5lQ2FwOiJidXR0IixsaW5lV2lkdGg6dGhpcy5ncmlkTGluZVdpZHRoKjEuNSxvZmZzZXQ6dGhpcy5ncmlkTGluZVdpZHRoKjAuNzUsZmlsbDpmYWxzZSxjbG9zZVBhdGg6ZmFsc2V9KX1haShhdCxhZSxhcixhZSx7c3Ryb2tlU3R5bGU6YWIuYm9yZGVyQ29sb3J9KX1icmVhaztjYXNlIngyYXhpcyI6aWYoYWguc2hvd0dyaWRsaW5lJiZ0aGlzLmRyYXdHcmlkbGluZXMmJigoIWFoLmlzTWlub3JUaWNrJiZhYi5kcmF3TWFqb3JHcmlkbGluZXMpfHwoYWguaXNNaW5vclRpY2smJmFiLmRyYXdNaW5vckdyaWRsaW5lcykpKXthaShhZSx0aGlzLl9ib3R0b20sYWUsdGhpcy5fdG9wKX1pZihhaC5zaG93TWFyayYmYWgubWFyayYmKCghYWguaXNNaW5vclRpY2smJmFiLmRyYXdNYWpvclRpY2tNYXJrcyl8fChhaC5pc01pbm9yVGljayYmYWIuZHJhd01pbm9yVGlja01hcmtzKSkpe2FqPWFoLm1hcmtTaXplO2FrPWFoLm1hcms7dmFyIGFlPU1hdGgucm91bmQoYWIudTJwKGFoLnZhbHVlKSkrMC41O3N3aXRjaChhayl7Y2FzZSJvdXRzaWRlIjphdD10aGlzLl90b3AtYWo7YXI9dGhpcy5fdG9wO2JyZWFrO2Nhc2UiaW5zaWRlIjphdD10aGlzLl90b3A7YXI9dGhpcy5fdG9wK2FqO2JyZWFrO2Nhc2UiY3Jvc3MiOmF0PXRoaXMuX3RvcC1hajthcj10aGlzLl90b3ArYWo7YnJlYWs7ZGVmYXVsdDphdD10aGlzLl90b3AtYWo7YXI9dGhpcy5fdG9wO2JyZWFrfWlmKHRoaXMuc2hhZG93KXt0aGlzLnJlbmRlcmVyLnNoYWRvd1JlbmRlcmVyLmRyYXcoYW0sW1thZSxhdF0sW2FlLGFyXV0se2xpbmVDYXA6ImJ1dHQiLGxpbmVXaWR0aDp0aGlzLmdyaWRMaW5lV2lkdGgsb2Zmc2V0OnRoaXMuZ3JpZExpbmVXaWR0aCowLjc1LGRlcHRoOjIsZmlsbDpmYWxzZSxjbG9zZVBhdGg6ZmFsc2V9KX1haShhZSxhdCxhZSxhcil9YnJlYWs7Y2FzZSJ5MmF4aXMiOmlmKGFoLnNob3dHcmlkbGluZSYmdGhpcy5kcmF3R3JpZGxpbmVzJiYoKCFhaC5pc01pbm9yVGljayYmYWIuZHJhd01ham9yR3JpZGxpbmVzKXx8KGFoLmlzTWlub3JUaWNrJiZhYi5kcmF3TWlub3JHcmlkbGluZXMpKSl7YWkodGhpcy5fbGVmdCxhZSx0aGlzLl9yaWdodCxhZSl9aWYoYWguc2hvd01hcmsmJmFoLm1hcmsmJigoIWFoLmlzTWlub3JUaWNrJiZhYi5kcmF3TWFqb3JUaWNrTWFya3MpfHwoYWguaXNNaW5vclRpY2smJmFiLmRyYXdNaW5vclRpY2tNYXJrcykpKXthaj1haC5tYXJrU2l6ZTthaz1haC5tYXJrO3ZhciBhZT1NYXRoLnJvdW5kKGFiLnUycChhaC52YWx1ZSkpKzAuNTtzd2l0Y2goYWspe2Nhc2Uib3V0c2lkZSI6YXQ9dGhpcy5fcmlnaHQ7YXI9dGhpcy5fcmlnaHQrYWo7YnJlYWs7Y2FzZSJpbnNpZGUiOmF0PXRoaXMuX3JpZ2h0LWFqO2FyPXRoaXMuX3JpZ2h0O2JyZWFrO2Nhc2UiY3Jvc3MiOmF0PXRoaXMuX3JpZ2h0LWFqO2FyPXRoaXMuX3JpZ2h0K2FqO2JyZWFrO2RlZmF1bHQ6YXQ9dGhpcy5fcmlnaHQ7YXI9dGhpcy5fcmlnaHQrYWo7YnJlYWt9aWYodGhpcy5zaGFkb3cpe3RoaXMucmVuZGVyZXIuc2hhZG93UmVuZGVyZXIuZHJhdyhhbSxbW2F0LGFlXSxbYXIsYWVdXSx7bGluZUNhcDoiYnV0dCIsbGluZVdpZHRoOnRoaXMuZ3JpZExpbmVXaWR0aCoxLjUsb2Zmc2V0OnRoaXMuZ3JpZExpbmVXaWR0aCowLjc1LGZpbGw6ZmFsc2UsY2xvc2VQYXRoOmZhbHNlfSl9YWkoYXQsYWUsYXIsYWUse3N0cm9rZVN0eWxlOmFiLmJvcmRlckNvbG9yfSl9YnJlYWs7ZGVmYXVsdDpicmVha319fWFoPW51bGx9YWI9bnVsbDthdT1udWxsfWFnPVsieTNheGlzIiwieTRheGlzIiwieTVheGlzIiwieTZheGlzIiwieTdheGlzIiwieThheGlzIiwieTlheGlzIiwieU1pZEF4aXMiXTtmb3IodmFyIGFxPTc7YXE+MDthcS0tKXt2YXIgYWI9YXBbYWdbYXEtMV1dO3ZhciBhdT1hYi5fdGlja3M7aWYoYWIuc2hvdyl7dmFyIGFjPWF1W2FiLm51bWJlclRpY2tzLTFdO3ZhciBhZj1hdVswXTt2YXIgYWQ9YWIuZ2V0TGVmdCgpO3ZhciBhbz1bW2FkLGFjLmdldFRvcCgpK2FjLmdldEhlaWdodCgpLzJdLFthZCxhZi5nZXRUb3AoKSthZi5nZXRIZWlnaHQoKS8yKzFdXTtpZih0aGlzLnNoYWRvdyl7dGhpcy5yZW5kZXJlci5zaGFkb3dSZW5kZXJlci5kcmF3KGFtLGFvLHtsaW5lQ2FwOiJidXR0IixmaWxsOmZhbHNlLGNsb3NlUGF0aDpmYWxzZX0pfWFpKGFvWzBdWzBdLGFvWzBdWzFdLGFvWzFdWzBdLGFvWzFdWzFdLHtsaW5lQ2FwOiJidXR0IixzdHJva2VTdHlsZTphYi5ib3JkZXJDb2xvcixsaW5lV2lkdGg6YWIuYm9yZGVyV2lkdGh9KTtmb3IodmFyIGFuPWF1Lmxlbmd0aDthbj4wO2FuLS0pe3ZhciBhaD1hdVthbi0xXTthaj1haC5tYXJrU2l6ZTthaz1haC5tYXJrO3ZhciBhZT1NYXRoLnJvdW5kKGFiLnUycChhaC52YWx1ZSkpKzAuNTtpZihhaC5zaG93TWFyayYmYWgubWFyayl7c3dpdGNoKGFrKXtjYXNlIm91dHNpZGUiOmF0PWFkO2FyPWFkK2FqO2JyZWFrO2Nhc2UiaW5zaWRlIjphdD1hZC1hajthcj1hZDticmVhaztjYXNlImNyb3NzIjphdD1hZC1hajthcj1hZCthajticmVhaztkZWZhdWx0OmF0PWFkO2FyPWFkK2FqO2JyZWFrfWFvPVtbYXQsYWVdLFthcixhZV1dO2lmKHRoaXMuc2hhZG93KXt0aGlzLnJlbmRlcmVyLnNoYWRvd1JlbmRlcmVyLmRyYXcoYW0sYW8se2xpbmVDYXA6ImJ1dHQiLGxpbmVXaWR0aDp0aGlzLmdyaWRMaW5lV2lkdGgqMS41LG9mZnNldDp0aGlzLmdyaWRMaW5lV2lkdGgqMC43NSxmaWxsOmZhbHNlLGNsb3NlUGF0aDpmYWxzZX0pfWFpKGF0LGFlLGFyLGFlLHtzdHJva2VTdHlsZTphYi5ib3JkZXJDb2xvcn0pfWFoPW51bGx9YWY9bnVsbH1hYj1udWxsO2F1PW51bGx9YW0ucmVzdG9yZSgpO2Z1bmN0aW9uIGFpKGFCLGFBLGF5LGF4LGF6KXthbS5zYXZlKCk7YXo9YXp8fHt9O2lmKGF6LmxpbmVXaWR0aD09bnVsbHx8YXoubGluZVdpZHRoIT0wKXtILmV4dGVuZCh0cnVlLGFtLGF6KTthbS5iZWdpblBhdGgoKTthbS5tb3ZlVG8oYUIsYUEpO2FtLmxpbmVUbyhheSxheCk7YW0uc3Ryb2tlKCk7YW0ucmVzdG9yZSgpfX1pZih0aGlzLnNoYWRvdyl7dmFyIGFvPVtbdGhpcy5fbGVmdCx0aGlzLl9ib3R0b21dLFt0aGlzLl9yaWdodCx0aGlzLl9ib3R0b21dLFt0aGlzLl9yaWdodCx0aGlzLl90b3BdXTt0aGlzLnJlbmRlcmVyLnNoYWRvd1JlbmRlcmVyLmRyYXcoYW0sYW8pfWlmKHRoaXMuYm9yZGVyV2lkdGghPTAmJnRoaXMuZHJhd0JvcmRlcil7YWkodGhpcy5fbGVmdCx0aGlzLl90b3AsdGhpcy5fcmlnaHQsdGhpcy5fdG9wLHtsaW5lQ2FwOiJyb3VuZCIsc3Ryb2tlU3R5bGU6YXAueDJheGlzLmJvcmRlckNvbG9yLGxpbmVXaWR0aDphcC54MmF4aXMuYm9yZGVyV2lkdGh9KTthaSh0aGlzLl9yaWdodCx0aGlzLl90b3AsdGhpcy5fcmlnaHQsdGhpcy5fYm90dG9tLHtsaW5lQ2FwOiJyb3VuZCIsc3Ryb2tlU3R5bGU6YXAueTJheGlzLmJvcmRlckNvbG9yLGxpbmVXaWR0aDphcC55MmF4aXMuYm9yZGVyV2lkdGh9KTthaSh0aGlzLl9yaWdodCx0aGlzLl9ib3R0b20sdGhpcy5fbGVmdCx0aGlzLl9ib3R0b20se2xpbmVDYXA6InJvdW5kIixzdHJva2VTdHlsZTphcC54YXhpcy5ib3JkZXJDb2xvcixsaW5lV2lkdGg6YXAueGF4aXMuYm9yZGVyV2lkdGh9KTthaSh0aGlzLl9sZWZ0LHRoaXMuX2JvdHRvbSx0aGlzLl9sZWZ0LHRoaXMuX3RvcCx7bGluZUNhcDoicm91bmQiLHN0cm9rZVN0eWxlOmFwLnlheGlzLmJvcmRlckNvbG9yLGxpbmVXaWR0aDphcC55YXhpcy5ib3JkZXJXaWR0aH0pfWFtLnJlc3RvcmUoKTthbT1udWxsO2FwPW51bGx9O0guanFwbG90LkRpdlRpdGxlUmVuZGVyZXI9ZnVuY3Rpb24oKXt9O0guanFwbG90LkRpdlRpdGxlUmVuZGVyZXIucHJvdG90eXBlLmluaXQ9ZnVuY3Rpb24oYWIpe0guZXh0ZW5kKHRydWUsdGhpcyxhYil9O0guanFwbG90LkRpdlRpdGxlUmVuZGVyZXIucHJvdG90eXBlLmRyYXc9ZnVuY3Rpb24oKXtpZih0aGlzLl9lbGVtKXt0aGlzLl9lbGVtLmVtcHR5Rm9yY2UoKTt0aGlzLl9lbGVtPW51bGx9dmFyIGFlPXRoaXMucmVuZGVyZXI7dmFyIGFkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuX2VsZW09SChhZCk7dGhpcy5fZWxlbS5hZGRDbGFzcygianFwbG90LXRpdGxlIik7aWYoIXRoaXMudGV4dCl7dGhpcy5zaG93PWZhbHNlO3RoaXMuX2VsZW0uaGVpZ2h0KDApO3RoaXMuX2VsZW0ud2lkdGgoMCl9ZWxzZXtpZih0aGlzLnRleHQpe3ZhciBhYjtpZih0aGlzLmNvbG9yKXthYj10aGlzLmNvbG9yfWVsc2V7aWYodGhpcy50ZXh0Q29sb3Ipe2FiPXRoaXMudGV4dENvbG9yfX12YXIgYWM9e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsdG9wOiIwcHgiLGxlZnQ6IjBweCJ9O2lmKHRoaXMuX3Bsb3RXaWR0aCl7YWMud2lkdGg9dGhpcy5fcGxvdFdpZHRoKyJweCJ9aWYodGhpcy5mb250U2l6ZSl7YWMuZm9udFNpemU9dGhpcy5mb250U2l6ZX1pZih0eXBlb2YgdGhpcy50ZXh0QWxpZ249PT0ic3RyaW5nIil7YWMudGV4dEFsaWduPXRoaXMudGV4dEFsaWdufWVsc2V7YWMudGV4dEFsaWduPSJjZW50ZXIifWlmKGFiKXthYy5jb2xvcj1hYn1pZih0aGlzLnBhZGRpbmdCb3R0b20pe2FjLnBhZGRpbmdCb3R0b209dGhpcy5wYWRkaW5nQm90dG9tfWlmKHRoaXMuZm9udEZhbWlseSl7YWMuZm9udEZhbWlseT10aGlzLmZvbnRGYW1pbHl9dGhpcy5fZWxlbS5jc3MoYWMpO2lmKHRoaXMuZXNjYXBlSHRtbCl7dGhpcy5fZWxlbS50ZXh0KHRoaXMudGV4dCl9ZWxzZXt0aGlzLl9lbGVtLmh0bWwodGhpcy50ZXh0KX19fWFkPW51bGw7cmV0dXJuIHRoaXMuX2VsZW19O0guanFwbG90LkRpdlRpdGxlUmVuZGVyZXIucHJvdG90eXBlLnBhY2s9ZnVuY3Rpb24oKXt9O3ZhciBvPTAuMTtILmpxcGxvdC5MaW5lUGF0dGVybj1mdW5jdGlvbihhcCxhayl7dmFyIGFqPXtkb3R0ZWQ6W28sSC5qcXBsb3QuY29uZmlnLmRvdEdhcExlbmd0aF0sZGFzaGVkOltILmpxcGxvdC5jb25maWcuZGFzaExlbmd0aCxILmpxcGxvdC5jb25maWcuZ2FwTGVuZ3RoXSxzb2xpZDpudWxsfTtpZih0eXBlb2YgYWs9PT0ic3RyaW5nIil7aWYoYWtbMF09PT0iLiJ8fGFrWzBdPT09Ii0iKXt2YXIgYXE9YWs7YWs9W107Zm9yKHZhciBhaT0wLGFmPWFxLmxlbmd0aDthaTxhZjthaSsrKXtpZihhcVthaV09PT0iLiIpe2FrLnB1c2gobyl9ZWxzZXtpZihhcVthaV09PT0iLSIpe2FrLnB1c2goSC5qcXBsb3QuY29uZmlnLmRhc2hMZW5ndGgpfWVsc2V7Y29udGludWV9fWFrLnB1c2goSC5qcXBsb3QuY29uZmlnLmdhcExlbmd0aCl9fWVsc2V7YWs9YWpbYWtdfX1pZighKGFrJiZhay5sZW5ndGgpKXtyZXR1cm4gYXB9dmFyIGFlPTA7dmFyIGFsPWFrWzBdO3ZhciBhbj0wO3ZhciBhbT0wO3ZhciBhaD0wO3ZhciBhYj0wO3ZhciBhbz1mdW5jdGlvbihhcixhdCl7YXAubW92ZVRvKGFyLGF0KTthbj1hcjthbT1hdDthaD1hcjthYj1hdH07dmFyIGFkPWZ1bmN0aW9uKGFyLGF5KXt2YXIgYXc9YXAubGluZVdpZHRoO3ZhciBhdT1hci1hbjt2YXIgYXQ9YXktYW07dmFyIGF2PU1hdGguc3FydChhdSphdSthdCphdCk7aWYoKGF2PjApJiYoYXc+MCkpe2F1Lz1hdjthdC89YXY7d2hpbGUodHJ1ZSl7dmFyIGF4PWF3KmFsO2lmKGF4PGF2KXthbis9YXgqYXU7YW0rPWF4KmF0O2lmKChhZSYxKT09MCl7YXAubGluZVRvKGFuLGFtKX1lbHNle2FwLm1vdmVUbyhhbixhbSl9YXYtPWF4O2FlKys7aWYoYWU+PWFrLmxlbmd0aCl7YWU9MH1hbD1ha1thZV19ZWxzZXthbj1hcjthbT1heTtpZigoYWUmMSk9PTApe2FwLmxpbmVUbyhhbixhbSl9ZWxzZXthcC5tb3ZlVG8oYW4sYW0pfWFsLT1hdi9hdzticmVha319fX07dmFyIGFjPWZ1bmN0aW9uKCl7YXAuYmVnaW5QYXRoKCl9O3ZhciBhZz1mdW5jdGlvbigpe2FkKGFoLGFiKX07cmV0dXJue21vdmVUbzphbyxsaW5lVG86YWQsYmVnaW5QYXRoOmFjLGNsb3NlUGF0aDphZ319O0guanFwbG90LkxpbmVSZW5kZXJlcj1mdW5jdGlvbigpe3RoaXMuc2hhcGVSZW5kZXJlcj1uZXcgSC5qcXBsb3QuU2hhcGVSZW5kZXJlcigpO3RoaXMuc2hhZG93UmVuZGVyZXI9bmV3IEguanFwbG90LlNoYWRvd1JlbmRlcmVyKCl9O0guanFwbG90LkxpbmVSZW5kZXJlci5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbihhYyxhaCl7YWM9YWN8fHt9O3RoaXMuX3R5cGU9ImxpbmUiO3RoaXMucmVuZGVyZXIuYW5pbWF0aW9uPXtzaG93OmZhbHNlLGRpcmVjdGlvbjoibGVmdCIsc3BlZWQ6MjUwMCxfc3VwcG9ydGVkOnRydWV9O3RoaXMucmVuZGVyZXIuc21vb3RoPWZhbHNlO3RoaXMucmVuZGVyZXIudGVuc2lvbj1udWxsO3RoaXMucmVuZGVyZXIuY29uc3RyYWluU21vb3RoaW5nPXRydWU7dGhpcy5yZW5kZXJlci5fc21vb3RoZWREYXRhPVtdO3RoaXMucmVuZGVyZXIuX3Ntb290aGVkUGxvdERhdGE9W107dGhpcy5yZW5kZXJlci5faGlCYW5kR3JpZERhdGE9W107dGhpcy5yZW5kZXJlci5fbG93QmFuZEdyaWREYXRhPVtdO3RoaXMucmVuZGVyZXIuX2hpQmFuZFNtb290aGVkRGF0YT1bXTt0aGlzLnJlbmRlcmVyLl9sb3dCYW5kU21vb3RoZWREYXRhPVtdO3RoaXMucmVuZGVyZXIuYmFuZERhdGE9W107dGhpcy5yZW5kZXJlci5iYW5kcz17c2hvdzpmYWxzZSxoaURhdGE6W10sbG93RGF0YTpbXSxjb2xvcjp0aGlzLmNvbG9yLHNob3dMaW5lczpmYWxzZSxmaWxsOnRydWUsZmlsbENvbG9yOm51bGwsX21pbjpudWxsLF9tYXg6bnVsbCxpbnRlcnZhbDoiMyUifTt2YXIgYWY9e2hpZ2hsaWdodE1vdXNlT3ZlcjphYy5oaWdobGlnaHRNb3VzZU92ZXIsaGlnaGxpZ2h0TW91c2VEb3duOmFjLmhpZ2hsaWdodE1vdXNlRG93bixoaWdobGlnaHRDb2xvcjphYy5oaWdobGlnaHRDb2xvcn07ZGVsZXRlIChhYy5oaWdobGlnaHRNb3VzZU92ZXIpO2RlbGV0ZSAoYWMuaGlnaGxpZ2h0TW91c2VEb3duKTtkZWxldGUgKGFjLmhpZ2hsaWdodENvbG9yKTtILmV4dGVuZCh0cnVlLHRoaXMucmVuZGVyZXIsYWMpO3RoaXMucmVuZGVyZXIub3B0aW9ucz1hYztpZih0aGlzLnJlbmRlcmVyLmJhbmREYXRhLmxlbmd0aD4xJiYoIWFjLmJhbmRzfHxhYy5iYW5kcy5zaG93PT1udWxsKSl7dGhpcy5yZW5kZXJlci5iYW5kcy5zaG93PXRydWV9ZWxzZXtpZihhYy5iYW5kcyYmYWMuYmFuZHMuc2hvdz09bnVsbCYmYWMuYmFuZHMuaW50ZXJ2YWwhPW51bGwpe3RoaXMucmVuZGVyZXIuYmFuZHMuc2hvdz10cnVlfX1pZih0aGlzLmZpbGwpe3RoaXMucmVuZGVyZXIuYmFuZHMuc2hvdz1mYWxzZX1pZih0aGlzLnJlbmRlcmVyLmJhbmRzLnNob3cpe3RoaXMucmVuZGVyZXIuaW5pdEJhbmRzLmNhbGwodGhpcyx0aGlzLnJlbmRlcmVyLm9wdGlvbnMsYWgpfWlmKHRoaXMuX3N0YWNrKXt0aGlzLnJlbmRlcmVyLnNtb290aD1mYWxzZX12YXIgYWc9e2xpbmVKb2luOnRoaXMubGluZUpvaW4sbGluZUNhcDp0aGlzLmxpbmVDYXAsZmlsbDp0aGlzLmZpbGwsaXNhcmM6ZmFsc2Usc3Ryb2tlU3R5bGU6dGhpcy5jb2xvcixmaWxsU3R5bGU6dGhpcy5maWxsQ29sb3IsbGluZVdpZHRoOnRoaXMubGluZVdpZHRoLGxpbmVQYXR0ZXJuOnRoaXMubGluZVBhdHRlcm4sY2xvc2VQYXRoOnRoaXMuZmlsbH07dGhpcy5yZW5kZXJlci5zaGFwZVJlbmRlcmVyLmluaXQoYWcpO3ZhciBhZD1hYy5zaGFkb3dPZmZzZXQ7aWYoYWQ9PW51bGwpe2lmKHRoaXMubGluZVdpZHRoPjIuNSl7YWQ9MS4yNSooMSsoTWF0aC5hdGFuKCh0aGlzLmxpbmVXaWR0aC8yLjUpKS8wLjc4NTM5ODE2My0xKSowLjYpfWVsc2V7YWQ9MS4yNSpNYXRoLmF0YW4oKHRoaXMubGluZVdpZHRoLzIuNSkpLzAuNzg1Mzk4MTYzfX12YXIgYWI9e2xpbmVKb2luOnRoaXMubGluZUpvaW4sbGluZUNhcDp0aGlzLmxpbmVDYXAsZmlsbDp0aGlzLmZpbGwsaXNhcmM6ZmFsc2UsYW5nbGU6dGhpcy5zaGFkb3dBbmdsZSxvZmZzZXQ6YWQsYWxwaGE6dGhpcy5zaGFkb3dBbHBoYSxkZXB0aDp0aGlzLnNoYWRvd0RlcHRoLGxpbmVXaWR0aDp0aGlzLmxpbmVXaWR0aCxsaW5lUGF0dGVybjp0aGlzLmxpbmVQYXR0ZXJuLGNsb3NlUGF0aDp0aGlzLmZpbGx9O3RoaXMucmVuZGVyZXIuc2hhZG93UmVuZGVyZXIuaW5pdChhYik7dGhpcy5fYXJlYVBvaW50cz1bXTt0aGlzLl9ib3VuZGluZ0JveD1bW10sW11dO2lmKCF0aGlzLmlzVHJlbmRsaW5lJiZ0aGlzLmZpbGx8fHRoaXMucmVuZGVyZXIuYmFuZHMuc2hvdyl7dGhpcy5oaWdobGlnaHRNb3VzZU92ZXI9dHJ1ZTt0aGlzLmhpZ2hsaWdodE1vdXNlRG93bj1mYWxzZTt0aGlzLmhpZ2hsaWdodENvbG9yPW51bGw7aWYoYWYuaGlnaGxpZ2h0TW91c2VEb3duJiZhZi5oaWdobGlnaHRNb3VzZU92ZXI9PW51bGwpe2FmLmhpZ2hsaWdodE1vdXNlT3Zlcj1mYWxzZX1ILmV4dGVuZCh0cnVlLHRoaXMse2hpZ2hsaWdodE1vdXNlT3ZlcjphZi5oaWdobGlnaHRNb3VzZU92ZXIsaGlnaGxpZ2h0TW91c2VEb3duOmFmLmhpZ2hsaWdodE1vdXNlRG93bixoaWdobGlnaHRDb2xvcjphZi5oaWdobGlnaHRDb2xvcn0pO2lmKCF0aGlzLmhpZ2hsaWdodENvbG9yKXt2YXIgYWU9KHRoaXMucmVuZGVyZXIuYmFuZHMuc2hvdyk/dGhpcy5yZW5kZXJlci5iYW5kcy5maWxsQ29sb3I6dGhpcy5maWxsQ29sb3I7dGhpcy5oaWdobGlnaHRDb2xvcj1ILmpxcGxvdC5jb21wdXRlSGlnaGxpZ2h0Q29sb3JzKGFlKX1pZih0aGlzLmhpZ2hsaWdodGVyKXt0aGlzLmhpZ2hsaWdodGVyLnNob3c9ZmFsc2V9fWlmKCF0aGlzLmlzVHJlbmRsaW5lJiZhaCl7YWgucGx1Z2lucy5saW5lUmVuZGVyZXI9e307YWgucG9zdEluaXRIb29rcy5hZGRPbmNlKHYpO2FoLnBvc3REcmF3SG9va3MuYWRkT25jZShaKTthaC5ldmVudExpc3RlbmVySG9va3MuYWRkT25jZSgianFwbG90TW91c2VNb3ZlIixnKTthaC5ldmVudExpc3RlbmVySG9va3MuYWRkT25jZSgianFwbG90TW91c2VEb3duIixkKTthaC5ldmVudExpc3RlbmVySG9va3MuYWRkT25jZSgianFwbG90TW91c2VVcCIsWSk7YWguZXZlbnRMaXN0ZW5lckhvb2tzLmFkZE9uY2UoImpxcGxvdENsaWNrIixmKTthaC5ldmVudExpc3RlbmVySG9va3MuYWRkT25jZSgianFwbG90UmlnaHRDbGljayIscCl9fTtILmpxcGxvdC5MaW5lUmVuZGVyZXIucHJvdG90eXBlLmluaXRCYW5kcz1mdW5jdGlvbihhZSxhbyl7dmFyIGFmPWFlLmJhbmREYXRhfHxbXTt2YXIgYWg9dGhpcy5yZW5kZXJlci5iYW5kczthaC5oaURhdGE9W107YWgubG93RGF0YT1bXTt2YXIgYXY9dGhpcy5kYXRhO2FoLl9tYXg9bnVsbDthaC5fbWluPW51bGw7aWYoYWYubGVuZ3RoPT0yKXtpZihILmlzQXJyYXkoYWZbMF1bMF0pKXt2YXIgYWk7dmFyIGFiPTAsYWw9MDtmb3IodmFyIGFwPTAsYW09YWZbMF0ubGVuZ3RoO2FwPGFtO2FwKyspe2FpPWFmWzBdW2FwXTtpZigoYWlbMV0hPW51bGwmJmFpWzFdPmFoLl9tYXgpfHxhaC5fbWF4PT1udWxsKXthaC5fbWF4PWFpWzFdfWlmKChhaVsxXSE9bnVsbCYmYWlbMV08YWguX21pbil8fGFoLl9taW49PW51bGwpe2FoLl9taW49YWlbMV19fWZvcih2YXIgYXA9MCxhbT1hZlsxXS5sZW5ndGg7YXA8YW07YXArKyl7YWk9YWZbMV1bYXBdO2lmKChhaVsxXSE9bnVsbCYmYWlbMV0+YWguX21heCl8fGFoLl9tYXg9PW51bGwpe2FoLl9tYXg9YWlbMV07YWw9MX1pZigoYWlbMV0hPW51bGwmJmFpWzFdPGFoLl9taW4pfHxhaC5fbWluPT1udWxsKXthaC5fbWluPWFpWzFdO2FiPTF9fWlmKGFsPT09YWIpe2FoLnNob3c9ZmFsc2V9YWguaGlEYXRhPWFmW2FsXTthaC5sb3dEYXRhPWFmW2FiXX1lbHNle2lmKGFmWzBdLmxlbmd0aD09PWF2Lmxlbmd0aCYmYWZbMV0ubGVuZ3RoPT09YXYubGVuZ3RoKXt2YXIgYWQ9KGFmWzBdWzBdPmFmWzFdWzBdKT8wOjE7dmFyIGF3PShhZCk/MDoxO2Zvcih2YXIgYXA9MCxhbT1hdi5sZW5ndGg7YXA8YW07YXArKyl7YWguaGlEYXRhLnB1c2goW2F2W2FwXVswXSxhZlthZF1bYXBdXSk7YWgubG93RGF0YS5wdXNoKFthdlthcF1bMF0sYWZbYXddW2FwXV0pfX1lbHNle2FoLnNob3c9ZmFsc2V9fX1lbHNle2lmKGFmLmxlbmd0aD4yJiYhSC5pc0FycmF5KGFmWzBdWzBdKSl7dmFyIGFkPShhZlswXVswXT5hZlswXVsxXSk/MDoxO3ZhciBhdz0oYWQpPzA6MTtmb3IodmFyIGFwPTAsYW09YWYubGVuZ3RoO2FwPGFtO2FwKyspe2FoLmhpRGF0YS5wdXNoKFthdlthcF1bMF0sYWZbYXBdW2FkXV0pO2FoLmxvd0RhdGEucHVzaChbYXZbYXBdWzBdLGFmW2FwXVthd11dKX19ZWxzZXt2YXIgYWs9YWguaW50ZXJ2YWw7dmFyIGF1PW51bGw7dmFyIGF0PW51bGw7dmFyIGFjPW51bGw7dmFyIGFuPW51bGw7aWYoSC5pc0FycmF5KGFrKSl7YXU9YWtbMF07YXQ9YWtbMV19ZWxzZXthdT1ha31pZihpc05hTihhdSkpe2lmKGF1LmNoYXJBdChhdS5sZW5ndGgtMSk9PT0iJSIpe2FjPSJtdWx0aXBseSI7YXU9cGFyc2VGbG9hdChhdSkvMTAwKzF9fWVsc2V7YXU9cGFyc2VGbG9hdChhdSk7YWM9ImFkZCJ9aWYoYXQhPT1udWxsJiZpc05hTihhdCkpe2lmKGF0LmNoYXJBdChhdC5sZW5ndGgtMSk9PT0iJSIpe2FuPSJtdWx0aXBseSI7YXQ9cGFyc2VGbG9hdChhdCkvMTAwKzF9fWVsc2V7aWYoYXQhPT1udWxsKXthdD1wYXJzZUZsb2F0KGF0KTthbj0iYWRkIn19aWYoYXUhPT1udWxsKXtpZihhdD09PW51bGwpe2F0PS1hdTthbj1hYztpZihhbj09PSJtdWx0aXBseSIpe2F0Kz0yfX1pZihhdTxhdCl7dmFyIGFxPWF1O2F1PWF0O2F0PWFxO2FxPWFjO2FjPWFuO2FuPWFxfWZvcih2YXIgYXA9MCxhbT1hdi5sZW5ndGg7YXA8YW07YXArKyl7c3dpdGNoKGFjKXtjYXNlImFkZCI6YWguaGlEYXRhLnB1c2goW2F2W2FwXVswXSxhdlthcF1bMV0rYXVdKTticmVhaztjYXNlIm11bHRpcGx5IjphaC5oaURhdGEucHVzaChbYXZbYXBdWzBdLGF2W2FwXVsxXSphdV0pO2JyZWFrfXN3aXRjaChhbil7Y2FzZSJhZGQiOmFoLmxvd0RhdGEucHVzaChbYXZbYXBdWzBdLGF2W2FwXVsxXSthdF0pO2JyZWFrO2Nhc2UibXVsdGlwbHkiOmFoLmxvd0RhdGEucHVzaChbYXZbYXBdWzBdLGF2W2FwXVsxXSphdF0pO2JyZWFrfX19ZWxzZXthaC5zaG93PWZhbHNlfX19dmFyIGFnPWFoLmhpRGF0YTt2YXIgYWo9YWgubG93RGF0YTtmb3IodmFyIGFwPTAsYW09YWcubGVuZ3RoO2FwPGFtO2FwKyspe2lmKChhZ1thcF1bMV0hPW51bGwmJmFnW2FwXVsxXT5haC5fbWF4KXx8YWguX21heD09bnVsbCl7YWguX21heD1hZ1thcF1bMV19fWZvcih2YXIgYXA9MCxhbT1hai5sZW5ndGg7YXA8YW07YXArKyl7aWYoKGFqW2FwXVsxXSE9bnVsbCYmYWpbYXBdWzFdPGFoLl9taW4pfHxhaC5fbWluPT1udWxsKXthaC5fbWluPWFqW2FwXVsxXX19aWYoYWguZmlsbENvbG9yPT09bnVsbCl7dmFyIGFyPUguanFwbG90LmdldENvbG9yQ29tcG9uZW50cyhhaC5jb2xvcik7YXJbM109YXJbM10qMC41O2FoLmZpbGxDb2xvcj0icmdiYSgiK2FyWzBdKyIsICIrYXJbMV0rIiwgIithclsyXSsiLCAiK2FyWzNdKyIpIn19O2Z1bmN0aW9uIEcoYWMsYWIpe3JldHVybigzLjQxODIwNTQrYWIpKk1hdGgucG93KGFjLC0wLjM1MzQ5OTIpfWZ1bmN0aW9uIGsoYWQsYWMpe3ZhciBhYj1NYXRoLnNxcnQoTWF0aC5wb3coKGFjWzBdLWFkWzBdKSwyKStNYXRoLnBvdygoYWNbMV0tYWRbMV0pLDIpKTtyZXR1cm4gNS43NjQ4Kk1hdGgubG9nKGFiKSs3LjQ0NTZ9ZnVuY3Rpb24gdyhhYil7dmFyIGFjPShNYXRoLmV4cCgyKmFiKS0xKS8oTWF0aC5leHAoMiphYikrMSk7cmV0dXJuIGFjfWZ1bmN0aW9uIEYoYUQpe3ZhciBhbT10aGlzLnJlbmRlcmVyLnNtb290aDt2YXIgYXg9dGhpcy5jYW52YXMuZ2V0V2lkdGgoKTt2YXIgYWg9dGhpcy5feGF4aXMuc2VyaWVzX3AydTt2YXIgYUE9dGhpcy5feWF4aXMuc2VyaWVzX3AydTt2YXIgYXo9bnVsbDt2YXIgYWc9bnVsbDt2YXIgYXQ9YUQubGVuZ3RoL2F4O3ZhciBhZD1bXTt2YXIgYXI9W107aWYoIWlzTmFOKHBhcnNlRmxvYXQoYW0pKSl7YXo9cGFyc2VGbG9hdChhbSl9ZWxzZXthej1HKGF0LDAuNSl9dmFyIGFwPVtdO3ZhciBhZT1bXTtmb3IodmFyIGF5PTAsYXU9YUQubGVuZ3RoO2F5PGF1O2F5Kyspe2FwLnB1c2goYURbYXldWzFdKTthZS5wdXNoKGFEW2F5XVswXSl9ZnVuY3Rpb24gYW8oYUUsYUYpe2lmKGFFLWFGPT0wKXtyZXR1cm4gTWF0aC5wb3coMTAsMTApfWVsc2V7cmV0dXJuIGFFLWFGfX12YXIgYXEsYWwsYWssYWo7dmFyIGFiPWFELmxlbmd0aC0xO2Zvcih2YXIgYWY9MSxhdj1hRC5sZW5ndGg7YWY8YXY7YWYrKyl7dmFyIGFjPVtdO3ZhciBhbj1bXTtmb3IodmFyIGF3PTA7YXc8MjthdysrKXt2YXIgYXk9YWYtMSthdztpZihheT09MHx8YXk9PWFiKXthY1thd109TWF0aC5wb3coMTAsMTApfWVsc2V7aWYoYXBbYXkrMV0tYXBbYXldPT0wfHxhcFtheV0tYXBbYXktMV09PTApe2FjW2F3XT0wfWVsc2V7aWYoKChhZVtheSsxXS1hZVtheV0pLyhhcFtheSsxXS1hcFtheV0pKyhhZVtheV0tYWVbYXktMV0pLyhhcFtheV0tYXBbYXktMV0pKT09MCl7YWNbYXddPTB9ZWxzZXtpZigoYXBbYXkrMV0tYXBbYXldKSooYXBbYXldLWFwW2F5LTFdKTwwKXthY1thd109MH1lbHNle2FjW2F3XT0yLyhhbyhhZVtheSsxXSxhZVtheV0pLyhhcFtheSsxXS1hcFtheV0pK2FvKGFlW2F5XSxhZVtheS0xXSkvKGFwW2F5XS1hcFtheS0xXSkpfX19fX1pZihhZj09MSl7YWNbMF09My8yKihhcFsxXS1hcFswXSkvYW8oYWVbMV0sYWVbMF0pLWFjWzFdLzJ9ZWxzZXtpZihhZj09YWIpe2FjWzFdPTMvMiooYXBbYWJdLWFwW2FiLTFdKS9hbyhhZVthYl0sYWVbYWItMV0pLWFjWzBdLzJ9fWFuWzBdPS0yKihhY1sxXSsyKmFjWzBdKS9hbyhhZVthZl0sYWVbYWYtMV0pKzYqKGFwW2FmXS1hcFthZi0xXSkvTWF0aC5wb3coYW8oYWVbYWZdLGFlW2FmLTFdKSwyKTthblsxXT0yKigyKmFjWzFdK2FjWzBdKS9hbyhhZVthZl0sYWVbYWYtMV0pLTYqKGFwW2FmXS1hcFthZi0xXSkvTWF0aC5wb3coYW8oYWVbYWZdLGFlW2FmLTFdKSwyKTthaj0xLzYqKGFuWzFdLWFuWzBdKS9hbyhhZVthZl0sYWVbYWYtMV0pO2FrPTEvMiooYWVbYWZdKmFuWzBdLWFlW2FmLTFdKmFuWzFdKS9hbyhhZVthZl0sYWVbYWYtMV0pO2FsPShhcFthZl0tYXBbYWYtMV0tYWsqKE1hdGgucG93KGFlW2FmXSwyKS1NYXRoLnBvdyhhZVthZi0xXSwyKSktYWoqKE1hdGgucG93KGFlW2FmXSwzKS1NYXRoLnBvdyhhZVthZi0xXSwzKSkpL2FvKGFlW2FmXSxhZVthZi0xXSk7YXE9YXBbYWYtMV0tYWwqYWVbYWYtMV0tYWsqTWF0aC5wb3coYWVbYWYtMV0sMiktYWoqTWF0aC5wb3coYWVbYWYtMV0sMyk7dmFyIGFDPShhZVthZl0tYWVbYWYtMV0pL2F6O3ZhciBhQixhaTtmb3IodmFyIGF3PTAsYXU9YXo7YXc8YXU7YXcrKyl7YUI9W107YWk9YWVbYWYtMV0rYXcqYUM7YUIucHVzaChhaSk7YUIucHVzaChhcSthbCphaSthaypNYXRoLnBvdyhhaSwyKSthaipNYXRoLnBvdyhhaSwzKSk7YWQucHVzaChhQik7YXIucHVzaChbYWgoYUJbMF0pLGFBKGFCWzFdKV0pfX1hZC5wdXNoKGFEW2F5XSk7YXIucHVzaChbYWgoYURbYXldWzBdKSxhQShhRFtheV1bMV0pXSk7cmV0dXJuW2FkLGFyXX1mdW5jdGlvbiBCKGFqKXt2YXIgYWk9dGhpcy5yZW5kZXJlci5zbW9vdGg7dmFyIGFPPXRoaXMucmVuZGVyZXIudGVuc2lvbjt2YXIgYWI9dGhpcy5jYW52YXMuZ2V0V2lkdGgoKTt2YXIgYUI9dGhpcy5feGF4aXMuc2VyaWVzX3AydTt2YXIgYWs9dGhpcy5feWF4aXMuc2VyaWVzX3AydTt2YXIgYUM9bnVsbDt2YXIgYUQ9bnVsbDt2YXIgYU49bnVsbDt2YXIgYUk9bnVsbDt2YXIgYUc9bnVsbDt2YXIgYW09bnVsbDt2YXIgYUw9bnVsbDt2YXIgYWc9bnVsbDt2YXIgYUUsYUYsYXgsYXcsYXUsYXI7dmFyIGFlLGFjLGFvLGFuO3ZhciBhdixhdCxhSDt2YXIgYXA9W107dmFyIGFkPVtdO3ZhciBhZj1hai5sZW5ndGgvYWI7dmFyIGFNLGFxLGF6LGFBLGF5O3ZhciBhbD1bXTt2YXIgYWg9W107aWYoIWlzTmFOKHBhcnNlRmxvYXQoYWkpKSl7YUM9cGFyc2VGbG9hdChhaSl9ZWxzZXthQz1HKGFmLDAuNSl9aWYoIWlzTmFOKHBhcnNlRmxvYXQoYU8pKSl7YU89cGFyc2VGbG9hdChhTyl9Zm9yKHZhciBhSz0wLGFKPWFqLmxlbmd0aC0xO2FLPGFKO2FLKyspe2lmKGFPPT09bnVsbCl7YW09TWF0aC5hYnMoKGFqW2FLKzFdWzFdLWFqW2FLXVsxXSkvKGFqW2FLKzFdWzBdLWFqW2FLXVswXSkpO2FNPTAuMzthcT0wLjY7YXo9KGFxLWFNKS8yO2FBPTIuNTtheT0tMS40O2FnPWFtL2FBK2F5O2FJPWF6KncoYWcpLWF6KncoYXkpK2FNO2lmKGFLPjApe2FMPU1hdGguYWJzKChhalthS11bMV0tYWpbYUstMV1bMV0pLyhhalthS11bMF0tYWpbYUstMV1bMF0pKX1hZz1hTC9hQStheTthRz1heip3KGFnKS1heip3KGF5KSthTTthTj0oYUkrYUcpLzJ9ZWxzZXthTj1hT31mb3IoYUU9MDthRTxhQzthRSsrKXthRj1hRS9hQztheD0oMSsyKmFGKSpNYXRoLnBvdygoMS1hRiksMik7YXc9YUYqTWF0aC5wb3coKDEtYUYpLDIpO2F1PU1hdGgucG93KGFGLDIpKigzLTIqYUYpO2FyPU1hdGgucG93KGFGLDIpKihhRi0xKTtpZihhalthSy0xXSl7YWU9YU4qKGFqW2FLKzFdWzBdLWFqW2FLLTFdWzBdKTthYz1hTiooYWpbYUsrMV1bMV0tYWpbYUstMV1bMV0pfWVsc2V7YWU9YU4qKGFqW2FLKzFdWzBdLWFqW2FLXVswXSk7YWM9YU4qKGFqW2FLKzFdWzFdLWFqW2FLXVsxXSl9aWYoYWpbYUsrMl0pe2FvPWFOKihhalthSysyXVswXS1halthS11bMF0pO2FuPWFOKihhalthSysyXVsxXS1halthS11bMV0pfWVsc2V7YW89YU4qKGFqW2FLKzFdWzBdLWFqW2FLXVswXSk7YW49YU4qKGFqW2FLKzFdWzFdLWFqW2FLXVsxXSl9YXY9YXgqYWpbYUtdWzBdK2F1KmFqW2FLKzFdWzBdK2F3KmFlK2FyKmFvO2F0PWF4KmFqW2FLXVsxXSthdSphalthSysxXVsxXSthdyphYythciphbjthSD1bYXYsYXRdO2FsLnB1c2goYUgpO2FoLnB1c2goW2FCKGF2KSxhayhhdCldKX19YWwucHVzaChhalthSl0pO2FoLnB1c2goW2FCKGFqW2FKXVswXSksYWsoYWpbYUpdWzFdKV0pO3JldHVyblthbCxhaF19SC5qcXBsb3QuTGluZVJlbmRlcmVyLnByb3RvdHlwZS5zZXRHcmlkRGF0YT1mdW5jdGlvbihhail7dmFyIGFmPXRoaXMuX3hheGlzLnNlcmllc191MnA7dmFyIGFiPXRoaXMuX3lheGlzLnNlcmllc191MnA7dmFyIGFnPXRoaXMuX3Bsb3REYXRhO3ZhciBhaz10aGlzLl9wcmV2UGxvdERhdGE7dGhpcy5ncmlkRGF0YT1bXTt0aGlzLl9wcmV2R3JpZERhdGE9W107dGhpcy5yZW5kZXJlci5fc21vb3RoZWREYXRhPVtdO3RoaXMucmVuZGVyZXIuX3Ntb290aGVkUGxvdERhdGE9W107dGhpcy5yZW5kZXJlci5faGlCYW5kR3JpZERhdGE9W107dGhpcy5yZW5kZXJlci5fbG93QmFuZEdyaWREYXRhPVtdO3RoaXMucmVuZGVyZXIuX2hpQmFuZFNtb290aGVkRGF0YT1bXTt0aGlzLnJlbmRlcmVyLl9sb3dCYW5kU21vb3RoZWREYXRhPVtdO3ZhciBhZT10aGlzLnJlbmRlcmVyLmJhbmRzO3ZhciBhYz1mYWxzZTtmb3IodmFyIGFoPTAsYWQ9dGhpcy5kYXRhLmxlbmd0aDthaDxhZDthaCsrKXtpZihhZ1thaF1bMF0hPW51bGwmJmFnW2FoXVsxXSE9bnVsbCl7dGhpcy5ncmlkRGF0YS5wdXNoKFthZi5jYWxsKHRoaXMuX3hheGlzLGFnW2FoXVswXSksYWIuY2FsbCh0aGlzLl95YXhpcyxhZ1thaF1bMV0pXSl9ZWxzZXtpZihhZ1thaF1bMF09PW51bGwpe2FjPXRydWU7dGhpcy5ncmlkRGF0YS5wdXNoKFtudWxsLGFiLmNhbGwodGhpcy5feWF4aXMsYWdbYWhdWzFdKV0pfWVsc2V7aWYoYWdbYWhdWzFdPT1udWxsKXthYz10cnVlO3RoaXMuZ3JpZERhdGEucHVzaChbYWYuY2FsbCh0aGlzLl94YXhpcyxhZ1thaF1bMF0pLG51bGxdKX19fWlmKGFrW2FoXSE9bnVsbCYmYWtbYWhdWzBdIT1udWxsJiZha1thaF1bMV0hPW51bGwpe3RoaXMuX3ByZXZHcmlkRGF0YS5wdXNoKFthZi5jYWxsKHRoaXMuX3hheGlzLGFrW2FoXVswXSksYWIuY2FsbCh0aGlzLl95YXhpcyxha1thaF1bMV0pXSl9ZWxzZXtpZihha1thaF0hPW51bGwmJmFrW2FoXVswXT09bnVsbCl7dGhpcy5fcHJldkdyaWREYXRhLnB1c2goW251bGwsYWIuY2FsbCh0aGlzLl95YXhpcyxha1thaF1bMV0pXSl9ZWxzZXtpZihha1thaF0hPW51bGwmJmFrW2FoXVswXSE9bnVsbCYmYWtbYWhdWzFdPT1udWxsKXt0aGlzLl9wcmV2R3JpZERhdGEucHVzaChbYWYuY2FsbCh0aGlzLl94YXhpcyxha1thaF1bMF0pLG51bGxdKX19fX1pZihhYyl7dGhpcy5yZW5kZXJlci5zbW9vdGg9ZmFsc2U7aWYodGhpcy5fdHlwZT09PSJsaW5lIil7YWUuc2hvdz1mYWxzZX19aWYodGhpcy5fdHlwZT09PSJsaW5lIiYmYWUuc2hvdyl7Zm9yKHZhciBhaD0wLGFkPWFlLmhpRGF0YS5sZW5ndGg7YWg8YWQ7YWgrKyl7dGhpcy5yZW5kZXJlci5faGlCYW5kR3JpZERhdGEucHVzaChbYWYuY2FsbCh0aGlzLl94YXhpcyxhZS5oaURhdGFbYWhdWzBdKSxhYi5jYWxsKHRoaXMuX3lheGlzLGFlLmhpRGF0YVthaF1bMV0pXSl9Zm9yKHZhciBhaD0wLGFkPWFlLmxvd0RhdGEubGVuZ3RoO2FoPGFkO2FoKyspe3RoaXMucmVuZGVyZXIuX2xvd0JhbmRHcmlkRGF0YS5wdXNoKFthZi5jYWxsKHRoaXMuX3hheGlzLGFlLmxvd0RhdGFbYWhdWzBdKSxhYi5jYWxsKHRoaXMuX3lheGlzLGFlLmxvd0RhdGFbYWhdWzFdKV0pfX1pZih0aGlzLl90eXBlPT09ImxpbmUiJiZ0aGlzLnJlbmRlcmVyLnNtb290aCYmdGhpcy5ncmlkRGF0YS5sZW5ndGg+Mil7dmFyIGFpO2lmKHRoaXMucmVuZGVyZXIuY29uc3RyYWluU21vb3RoaW5nKXthaT1GLmNhbGwodGhpcyx0aGlzLmdyaWREYXRhKTt0aGlzLnJlbmRlcmVyLl9zbW9vdGhlZERhdGE9YWlbMF07dGhpcy5yZW5kZXJlci5fc21vb3RoZWRQbG90RGF0YT1haVsxXTtpZihhZS5zaG93KXthaT1GLmNhbGwodGhpcyx0aGlzLnJlbmRlcmVyLl9oaUJhbmRHcmlkRGF0YSk7dGhpcy5yZW5kZXJlci5faGlCYW5kU21vb3RoZWREYXRhPWFpWzBdO2FpPUYuY2FsbCh0aGlzLHRoaXMucmVuZGVyZXIuX2xvd0JhbmRHcmlkRGF0YSk7dGhpcy5yZW5kZXJlci5fbG93QmFuZFNtb290aGVkRGF0YT1haVswXX1haT1udWxsfWVsc2V7YWk9Qi5jYWxsKHRoaXMsdGhpcy5ncmlkRGF0YSk7dGhpcy5yZW5kZXJlci5fc21vb3RoZWREYXRhPWFpWzBdO3RoaXMucmVuZGVyZXIuX3Ntb290aGVkUGxvdERhdGE9YWlbMV07aWYoYWUuc2hvdyl7YWk9Qi5jYWxsKHRoaXMsdGhpcy5yZW5kZXJlci5faGlCYW5kR3JpZERhdGEpO3RoaXMucmVuZGVyZXIuX2hpQmFuZFNtb290aGVkRGF0YT1haVswXTthaT1CLmNhbGwodGhpcyx0aGlzLnJlbmRlcmVyLl9sb3dCYW5kR3JpZERhdGEpO3RoaXMucmVuZGVyZXIuX2xvd0JhbmRTbW9vdGhlZERhdGE9YWlbMF19YWk9bnVsbH19fTtILmpxcGxvdC5MaW5lUmVuZGVyZXIucHJvdG90eXBlLm1ha2VHcmlkRGF0YT1mdW5jdGlvbihhaSxhayl7dmFyIGFnPXRoaXMuX3hheGlzLnNlcmllc191MnA7dmFyIGFiPXRoaXMuX3lheGlzLnNlcmllc191MnA7dmFyIGFsPVtdO3ZhciBhZD1bXTt0aGlzLnJlbmRlcmVyLl9zbW9vdGhlZERhdGE9W107dGhpcy5yZW5kZXJlci5fc21vb3RoZWRQbG90RGF0YT1bXTt0aGlzLnJlbmRlcmVyLl9oaUJhbmRHcmlkRGF0YT1bXTt0aGlzLnJlbmRlcmVyLl9sb3dCYW5kR3JpZERhdGE9W107dGhpcy5yZW5kZXJlci5faGlCYW5kU21vb3RoZWREYXRhPVtdO3RoaXMucmVuZGVyZXIuX2xvd0JhbmRTbW9vdGhlZERhdGE9W107dmFyIGFmPXRoaXMucmVuZGVyZXIuYmFuZHM7dmFyIGFjPWZhbHNlO2Zvcih2YXIgYWg9MDthaDxhaS5sZW5ndGg7YWgrKyl7aWYoYWlbYWhdWzBdIT1udWxsJiZhaVthaF1bMV0hPW51bGwpe2FsLnB1c2goW2FnLmNhbGwodGhpcy5feGF4aXMsYWlbYWhdWzBdKSxhYi5jYWxsKHRoaXMuX3lheGlzLGFpW2FoXVsxXSldKX1lbHNle2lmKGFpW2FoXVswXT09bnVsbCl7YWM9dHJ1ZTthbC5wdXNoKFtudWxsLGFiLmNhbGwodGhpcy5feWF4aXMsYWlbYWhdWzFdKV0pfWVsc2V7aWYoYWlbYWhdWzFdPT1udWxsKXthYz10cnVlO2FsLnB1c2goW2FnLmNhbGwodGhpcy5feGF4aXMsYWlbYWhdWzBdKSxudWxsXSl9fX19aWYoYWMpe3RoaXMucmVuZGVyZXIuc21vb3RoPWZhbHNlO2lmKHRoaXMuX3R5cGU9PT0ibGluZSIpe2FmLnNob3c9ZmFsc2V9fWlmKHRoaXMuX3R5cGU9PT0ibGluZSImJmFmLnNob3cpe2Zvcih2YXIgYWg9MCxhZT1hZi5oaURhdGEubGVuZ3RoO2FoPGFlO2FoKyspe3RoaXMucmVuZGVyZXIuX2hpQmFuZEdyaWREYXRhLnB1c2goW2FnLmNhbGwodGhpcy5feGF4aXMsYWYuaGlEYXRhW2FoXVswXSksYWIuY2FsbCh0aGlzLl95YXhpcyxhZi5oaURhdGFbYWhdWzFdKV0pfWZvcih2YXIgYWg9MCxhZT1hZi5sb3dEYXRhLmxlbmd0aDthaDxhZTthaCsrKXt0aGlzLnJlbmRlcmVyLl9sb3dCYW5kR3JpZERhdGEucHVzaChbYWcuY2FsbCh0aGlzLl94YXhpcyxhZi5sb3dEYXRhW2FoXVswXSksYWIuY2FsbCh0aGlzLl95YXhpcyxhZi5sb3dEYXRhW2FoXVsxXSldKX19aWYodGhpcy5fdHlwZT09PSJsaW5lIiYmdGhpcy5yZW5kZXJlci5zbW9vdGgmJmFsLmxlbmd0aD4yKXt2YXIgYWo7aWYodGhpcy5yZW5kZXJlci5jb25zdHJhaW5TbW9vdGhpbmcpe2FqPUYuY2FsbCh0aGlzLGFsKTt0aGlzLnJlbmRlcmVyLl9zbW9vdGhlZERhdGE9YWpbMF07dGhpcy5yZW5kZXJlci5fc21vb3RoZWRQbG90RGF0YT1halsxXTtpZihhZi5zaG93KXthaj1GLmNhbGwodGhpcyx0aGlzLnJlbmRlcmVyLl9oaUJhbmRHcmlkRGF0YSk7dGhpcy5yZW5kZXJlci5faGlCYW5kU21vb3RoZWREYXRhPWFqWzBdO2FqPUYuY2FsbCh0aGlzLHRoaXMucmVuZGVyZXIuX2xvd0JhbmRHcmlkRGF0YSk7dGhpcy5yZW5kZXJlci5fbG93QmFuZFNtb290aGVkRGF0YT1halswXX1haj1udWxsfWVsc2V7YWo9Qi5jYWxsKHRoaXMsYWwpO3RoaXMucmVuZGVyZXIuX3Ntb290aGVkRGF0YT1halswXTt0aGlzLnJlbmRlcmVyLl9zbW9vdGhlZFBsb3REYXRhPWFqWzFdO2lmKGFmLnNob3cpe2FqPUIuY2FsbCh0aGlzLHRoaXMucmVuZGVyZXIuX2hpQmFuZEdyaWREYXRhKTt0aGlzLnJlbmRlcmVyLl9oaUJhbmRTbW9vdGhlZERhdGE9YWpbMF07YWo9Qi5jYWxsKHRoaXMsdGhpcy5yZW5kZXJlci5fbG93QmFuZEdyaWREYXRhKTt0aGlzLnJlbmRlcmVyLl9sb3dCYW5kU21vb3RoZWREYXRhPWFqWzBdfWFqPW51bGx9fXJldHVybiBhbH07SC5qcXBsb3QuTGluZVJlbmRlcmVyLnByb3RvdHlwZS5kcmF3PWZ1bmN0aW9uKGFxLGFDLGFjLGF2KXt2YXIgYXc7dmFyIGFrPUguZXh0ZW5kKHRydWUse30sYWMpO3ZhciBhZT0oYWsuc2hhZG93IT1yKT9hay5zaGFkb3c6dGhpcy5zaGFkb3c7dmFyIGFEPShhay5zaG93TGluZSE9cik/YWsuc2hvd0xpbmU6dGhpcy5zaG93TGluZTt2YXIgYXU9KGFrLmZpbGwhPXIpP2FrLmZpbGw6dGhpcy5maWxsO3ZhciBhYj0oYWsuZmlsbEFuZFN0cm9rZSE9cik/YWsuZmlsbEFuZFN0cm9rZTp0aGlzLmZpbGxBbmRTdHJva2U7dmFyIGFsLGFyLGFvLGF5O2FxLnNhdmUoKTtpZihhQy5sZW5ndGgpe2lmKGFEKXtpZihhdSl7aWYodGhpcy5maWxsVG9aZXJvKXt2YXIgYXo9dGhpcy5uZWdhdGl2ZUNvbG9yO2lmKCF0aGlzLnVzZU5lZ2F0aXZlQ29sb3JzKXthej1hay5maWxsU3R5bGV9dmFyIGFpPWZhbHNlO3ZhciBhaj1hay5maWxsU3R5bGU7aWYoYWIpe3ZhciBhQj1hQy5zbGljZSgwKX1pZih0aGlzLmluZGV4PT0wfHwhdGhpcy5fc3RhY2spe3ZhciBhcD1bXTt2YXIgYUY9KHRoaXMucmVuZGVyZXIuc21vb3RoKT90aGlzLnJlbmRlcmVyLl9zbW9vdGhlZFBsb3REYXRhOnRoaXMuX3Bsb3REYXRhO3RoaXMuX2FyZWFQb2ludHM9W107dmFyIGFBPXRoaXMuX3lheGlzLnNlcmllc191MnAodGhpcy5maWxsVG9WYWx1ZSk7dmFyIGFkPXRoaXMuX3hheGlzLnNlcmllc191MnAodGhpcy5maWxsVG9WYWx1ZSk7YWsuY2xvc2VQYXRoPXRydWU7aWYodGhpcy5maWxsQXhpcz09InkiKXthcC5wdXNoKFthQ1swXVswXSxhQV0pO3RoaXMuX2FyZWFQb2ludHMucHVzaChbYUNbMF1bMF0sYUFdKTtmb3IodmFyIGF3PTA7YXc8YUMubGVuZ3RoLTE7YXcrKyl7YXAucHVzaChhQ1thd10pO3RoaXMuX2FyZWFQb2ludHMucHVzaChhQ1thd10pO2lmKGFGW2F3XVsxXSphRlthdysxXVsxXTwwKXtpZihhRlthd11bMV08MCl7YWk9dHJ1ZTthay5maWxsU3R5bGU9YXp9ZWxzZXthaT1mYWxzZTthay5maWxsU3R5bGU9YWp9dmFyIGFoPWFDW2F3XVswXSsoYUNbYXcrMV1bMF0tYUNbYXddWzBdKSooYUEtYUNbYXddWzFdKS8oYUNbYXcrMV1bMV0tYUNbYXddWzFdKTthcC5wdXNoKFthaCxhQV0pO3RoaXMuX2FyZWFQb2ludHMucHVzaChbYWgsYUFdKTtpZihhZSl7dGhpcy5yZW5kZXJlci5zaGFkb3dSZW5kZXJlci5kcmF3KGFxLGFwLGFrKX10aGlzLnJlbmRlcmVyLnNoYXBlUmVuZGVyZXIuZHJhdyhhcSxhcCxhayk7YXA9W1thaCxhQV1dfX1pZihhRlthQy5sZW5ndGgtMV1bMV08MCl7YWk9dHJ1ZTthay5maWxsU3R5bGU9YXp9ZWxzZXthaT1mYWxzZTthay5maWxsU3R5bGU9YWp9YXAucHVzaChhQ1thQy5sZW5ndGgtMV0pO3RoaXMuX2FyZWFQb2ludHMucHVzaChhQ1thQy5sZW5ndGgtMV0pO2FwLnB1c2goW2FDW2FDLmxlbmd0aC0xXVswXSxhQV0pO3RoaXMuX2FyZWFQb2ludHMucHVzaChbYUNbYUMubGVuZ3RoLTFdWzBdLGFBXSl9aWYoYWUpe3RoaXMucmVuZGVyZXIuc2hhZG93UmVuZGVyZXIuZHJhdyhhcSxhcCxhayl9dGhpcy5yZW5kZXJlci5zaGFwZVJlbmRlcmVyLmRyYXcoYXEsYXAsYWspfWVsc2V7dmFyIGFuPXRoaXMuX3ByZXZHcmlkRGF0YTtmb3IodmFyIGF3PWFuLmxlbmd0aDthdz4wO2F3LS0pe2FDLnB1c2goYW5bYXctMV0pfWlmKGFlKXt0aGlzLnJlbmRlcmVyLnNoYWRvd1JlbmRlcmVyLmRyYXcoYXEsYUMsYWspfXRoaXMuX2FyZWFQb2ludHM9YUM7dGhpcy5yZW5kZXJlci5zaGFwZVJlbmRlcmVyLmRyYXcoYXEsYUMsYWspfX1lbHNle2lmKGFiKXt2YXIgYUI9YUMuc2xpY2UoMCl9aWYodGhpcy5pbmRleD09MHx8IXRoaXMuX3N0YWNrKXt2YXIgYWY9YXEuY2FudmFzLmhlaWdodDthQy51bnNoaWZ0KFthQ1swXVswXSxhZl0pO3ZhciBheD1hQy5sZW5ndGg7YUMucHVzaChbYUNbYXgtMV1bMF0sYWZdKX1lbHNle3ZhciBhbj10aGlzLl9wcmV2R3JpZERhdGE7Zm9yKHZhciBhdz1hbi5sZW5ndGg7YXc+MDthdy0tKXthQy5wdXNoKGFuW2F3LTFdKX19dGhpcy5fYXJlYVBvaW50cz1hQztpZihhZSl7dGhpcy5yZW5kZXJlci5zaGFkb3dSZW5kZXJlci5kcmF3KGFxLGFDLGFrKX10aGlzLnJlbmRlcmVyLnNoYXBlUmVuZGVyZXIuZHJhdyhhcSxhQyxhayl9aWYoYWIpe3ZhciBhdD1ILmV4dGVuZCh0cnVlLHt9LGFrLHtmaWxsOmZhbHNlLGNsb3NlUGF0aDpmYWxzZX0pO3RoaXMucmVuZGVyZXIuc2hhcGVSZW5kZXJlci5kcmF3KGFxLGFCLGF0KTtpZih0aGlzLm1hcmtlclJlbmRlcmVyLnNob3cpe2lmKHRoaXMucmVuZGVyZXIuc21vb3RoKXthQj10aGlzLmdyaWREYXRhfWZvcihhdz0wO2F3PGFCLmxlbmd0aDthdysrKXt0aGlzLm1hcmtlclJlbmRlcmVyLmRyYXcoYUJbYXddWzBdLGFCW2F3XVsxXSxhcSxhay5tYXJrZXJPcHRpb25zKX19fX1lbHNle2lmKHRoaXMucmVuZGVyZXIuYmFuZHMuc2hvdyl7dmFyIGFnO3ZhciBhRT1ILmV4dGVuZCh0cnVlLHt9LGFrKTtpZih0aGlzLnJlbmRlcmVyLmJhbmRzLnNob3dMaW5lcyl7YWc9KHRoaXMucmVuZGVyZXIuc21vb3RoKT90aGlzLnJlbmRlcmVyLl9oaUJhbmRTbW9vdGhlZERhdGE6dGhpcy5yZW5kZXJlci5faGlCYW5kR3JpZERhdGE7dGhpcy5yZW5kZXJlci5zaGFwZVJlbmRlcmVyLmRyYXcoYXEsYWcsYWspO2FnPSh0aGlzLnJlbmRlcmVyLnNtb290aCk/dGhpcy5yZW5kZXJlci5fbG93QmFuZFNtb290aGVkRGF0YTp0aGlzLnJlbmRlcmVyLl9sb3dCYW5kR3JpZERhdGE7dGhpcy5yZW5kZXJlci5zaGFwZVJlbmRlcmVyLmRyYXcoYXEsYWcsYUUpfWlmKHRoaXMucmVuZGVyZXIuYmFuZHMuZmlsbCl7aWYodGhpcy5yZW5kZXJlci5zbW9vdGgpe2FnPXRoaXMucmVuZGVyZXIuX2hpQmFuZFNtb290aGVkRGF0YS5jb25jYXQodGhpcy5yZW5kZXJlci5fbG93QmFuZFNtb290aGVkRGF0YS5yZXZlcnNlKCkpfWVsc2V7YWc9dGhpcy5yZW5kZXJlci5faGlCYW5kR3JpZERhdGEuY29uY2F0KHRoaXMucmVuZGVyZXIuX2xvd0JhbmRHcmlkRGF0YS5yZXZlcnNlKCkpfXRoaXMuX2FyZWFQb2ludHM9YWc7YUUuY2xvc2VQYXRoPXRydWU7YUUuZmlsbD10cnVlO2FFLmZpbGxTdHlsZT10aGlzLnJlbmRlcmVyLmJhbmRzLmZpbGxDb2xvcjt0aGlzLnJlbmRlcmVyLnNoYXBlUmVuZGVyZXIuZHJhdyhhcSxhZyxhRSl9fWlmKGFlKXt0aGlzLnJlbmRlcmVyLnNoYWRvd1JlbmRlcmVyLmRyYXcoYXEsYUMsYWspfXRoaXMucmVuZGVyZXIuc2hhcGVSZW5kZXJlci5kcmF3KGFxLGFDLGFrKX19dmFyIGFsPWFvPWFyPWF5PW51bGw7Zm9yKGF3PTA7YXc8dGhpcy5fYXJlYVBvaW50cy5sZW5ndGg7YXcrKyl7dmFyIGFtPXRoaXMuX2FyZWFQb2ludHNbYXddO2lmKGFsPmFtWzBdfHxhbD09bnVsbCl7YWw9YW1bMF19aWYoYXk8YW1bMV18fGF5PT1udWxsKXtheT1hbVsxXX1pZihhbzxhbVswXXx8YW89PW51bGwpe2FvPWFtWzBdfWlmKGFyPmFtWzFdfHxhcj09bnVsbCl7YXI9YW1bMV19fWlmKHRoaXMudHlwZT09PSJsaW5lIiYmdGhpcy5yZW5kZXJlci5iYW5kcy5zaG93KXtheT10aGlzLl95YXhpcy5zZXJpZXNfdTJwKHRoaXMucmVuZGVyZXIuYmFuZHMuX21pbik7YXI9dGhpcy5feWF4aXMuc2VyaWVzX3UycCh0aGlzLnJlbmRlcmVyLmJhbmRzLl9tYXgpfXRoaXMuX2JvdW5kaW5nQm94PVtbYWwsYXldLFthbyxhcl1dO2lmKHRoaXMubWFya2VyUmVuZGVyZXIuc2hvdyYmIWF1KXtpZih0aGlzLnJlbmRlcmVyLnNtb290aCl7YUM9dGhpcy5ncmlkRGF0YX1mb3IoYXc9MDthdzxhQy5sZW5ndGg7YXcrKyl7aWYoYUNbYXddWzBdIT1udWxsJiZhQ1thd11bMV0hPW51bGwpe3RoaXMubWFya2VyUmVuZGVyZXIuZHJhdyhhQ1thd11bMF0sYUNbYXddWzFdLGFxLGFrLm1hcmtlck9wdGlvbnMpfX19fWFxLnJlc3RvcmUoKX07SC5qcXBsb3QuTGluZVJlbmRlcmVyLnByb3RvdHlwZS5kcmF3U2hhZG93PWZ1bmN0aW9uKGFiLGFkLGFjKXt9O2Z1bmN0aW9uIHYoYWUsYWQsYWIpe2Zvcih2YXIgYWM9MDthYzx0aGlzLnNlcmllcy5sZW5ndGg7YWMrKyl7aWYodGhpcy5zZXJpZXNbYWNdLnJlbmRlcmVyLmNvbnN0cnVjdG9yPT1ILmpxcGxvdC5MaW5lUmVuZGVyZXIpe2lmKHRoaXMuc2VyaWVzW2FjXS5oaWdobGlnaHRNb3VzZU92ZXIpe3RoaXMuc2VyaWVzW2FjXS5oaWdobGlnaHRNb3VzZURvd249ZmFsc2V9fX19ZnVuY3Rpb24gWigpe2lmKHRoaXMucGx1Z2lucy5saW5lUmVuZGVyZXImJnRoaXMucGx1Z2lucy5saW5lUmVuZGVyZXIuaGlnaGxpZ2h0Q2FudmFzKXt0aGlzLnBsdWdpbnMubGluZVJlbmRlcmVyLmhpZ2hsaWdodENhbnZhcy5yZXNldENhbnZhcygpO3RoaXMucGx1Z2lucy5saW5lUmVuZGVyZXIuaGlnaGxpZ2h0Q2FudmFzPW51bGx9dGhpcy5wbHVnaW5zLmxpbmVSZW5kZXJlci5oaWdobGlnaHRlZFNlcmllc0luZGV4PW51bGw7dGhpcy5wbHVnaW5zLmxpbmVSZW5kZXJlci5oaWdobGlnaHRDYW52YXM9bmV3IEguanFwbG90LkdlbmVyaWNDYW52YXMoKTt0aGlzLmV2ZW50Q2FudmFzLl9lbGVtLmJlZm9yZSh0aGlzLnBsdWdpbnMubGluZVJlbmRlcmVyLmhpZ2hsaWdodENhbnZhcy5jcmVhdGVFbGVtZW50KHRoaXMuX2dyaWRQYWRkaW5nLCJqcXBsb3QtbGluZVJlbmRlcmVyLWhpZ2hsaWdodC1jYW52YXMiLHRoaXMuX3Bsb3REaW1lbnNpb25zLHRoaXMpKTt0aGlzLnBsdWdpbnMubGluZVJlbmRlcmVyLmhpZ2hsaWdodENhbnZhcy5zZXRDb250ZXh0KCk7dGhpcy5ldmVudENhbnZhcy5fZWxlbS5iaW5kKCJtb3VzZWxlYXZlIix7cGxvdDp0aGlzfSxmdW5jdGlvbihhYil7VihhYi5kYXRhLnBsb3QpfSl9ZnVuY3Rpb24gWChhaCxhZyxhZSxhZCl7dmFyIGFjPWFoLnNlcmllc1thZ107dmFyIGFiPWFoLnBsdWdpbnMubGluZVJlbmRlcmVyLmhpZ2hsaWdodENhbnZhczthYi5fY3R4LmNsZWFyUmVjdCgwLDAsYWIuX2N0eC5jYW52YXMud2lkdGgsYWIuX2N0eC5jYW52YXMuaGVpZ2h0KTthYy5faGlnaGxpZ2h0ZWRQb2ludD1hZTthaC5wbHVnaW5zLmxpbmVSZW5kZXJlci5oaWdobGlnaHRlZFNlcmllc0luZGV4PWFnO3ZhciBhZj17ZmlsbFN0eWxlOmFjLmhpZ2hsaWdodENvbG9yfTtpZihhYy50eXBlPT09ImxpbmUiJiZhYy5yZW5kZXJlci5iYW5kcy5zaG93KXthZi5maWxsPXRydWU7YWYuY2xvc2VQYXRoPXRydWV9YWMucmVuZGVyZXIuc2hhcGVSZW5kZXJlci5kcmF3KGFiLl9jdHgsYWQsYWYpO2FiPW51bGx9ZnVuY3Rpb24gVihhZCl7dmFyIGFiPWFkLnBsdWdpbnMubGluZVJlbmRlcmVyLmhpZ2hsaWdodENhbnZhczthYi5fY3R4LmNsZWFyUmVjdCgwLDAsYWIuX2N0eC5jYW52YXMud2lkdGgsYWIuX2N0eC5jYW52YXMuaGVpZ2h0KTtmb3IodmFyIGFjPTA7YWM8YWQuc2VyaWVzLmxlbmd0aDthYysrKXthZC5zZXJpZXNbYWNdLl9oaWdobGlnaHRlZFBvaW50PW51bGx9YWQucGx1Z2lucy5saW5lUmVuZGVyZXIuaGlnaGxpZ2h0ZWRTZXJpZXNJbmRleD1udWxsO2FkLnRhcmdldC50cmlnZ2VyKCJqcXBsb3REYXRhVW5oaWdobGlnaHQiKTthYj1udWxsfWZ1bmN0aW9uIGcoYWYsYWUsYWksYWgsYWcpe2lmKGFoKXt2YXIgYWQ9W2FoLnNlcmllc0luZGV4LGFoLnBvaW50SW5kZXgsYWguZGF0YV07dmFyIGFjPWpRdWVyeS5FdmVudCgianFwbG90RGF0YU1vdXNlT3ZlciIpO2FjLnBhZ2VYPWFmLnBhZ2VYO2FjLnBhZ2VZPWFmLnBhZ2VZO2FnLnRhcmdldC50cmlnZ2VyKGFjLGFkKTtpZihhZy5zZXJpZXNbYWRbMF1dLmhpZ2hsaWdodE1vdXNlT3ZlciYmIShhZFswXT09YWcucGx1Z2lucy5saW5lUmVuZGVyZXIuaGlnaGxpZ2h0ZWRTZXJpZXNJbmRleCkpe3ZhciBhYj1qUXVlcnkuRXZlbnQoImpxcGxvdERhdGFIaWdobGlnaHQiKTthYi5wYWdlWD1hZi5wYWdlWDthYi5wYWdlWT1hZi5wYWdlWTthZy50YXJnZXQudHJpZ2dlcihhYixhZCk7WChhZyxhaC5zZXJpZXNJbmRleCxhaC5wb2ludEluZGV4LGFoLnBvaW50cyl9fWVsc2V7aWYoYWg9PW51bGwpe1YoYWcpfX19ZnVuY3Rpb24gZChhZSxhZCxhaCxhZyxhZil7aWYoYWcpe3ZhciBhYz1bYWcuc2VyaWVzSW5kZXgsYWcucG9pbnRJbmRleCxhZy5kYXRhXTtpZihhZi5zZXJpZXNbYWNbMF1dLmhpZ2hsaWdodE1vdXNlRG93biYmIShhY1swXT09YWYucGx1Z2lucy5saW5lUmVuZGVyZXIuaGlnaGxpZ2h0ZWRTZXJpZXNJbmRleCkpe3ZhciBhYj1qUXVlcnkuRXZlbnQoImpxcGxvdERhdGFIaWdobGlnaHQiKTthYi5wYWdlWD1hZS5wYWdlWDthYi5wYWdlWT1hZS5wYWdlWTthZi50YXJnZXQudHJpZ2dlcihhYixhYyk7WChhZixhZy5zZXJpZXNJbmRleCxhZy5wb2ludEluZGV4LGFnLnBvaW50cyl9fWVsc2V7aWYoYWc9PW51bGwpe1YoYWYpfX19ZnVuY3Rpb24gWShhZCxhYyxhZyxhZixhZSl7dmFyIGFiPWFlLnBsdWdpbnMubGluZVJlbmRlcmVyLmhpZ2hsaWdodGVkU2VyaWVzSW5kZXg7aWYoYWIhPW51bGwmJmFlLnNlcmllc1thYl0uaGlnaGxpZ2h0TW91c2VEb3duKXtWKGFlKX19ZnVuY3Rpb24gZihhZSxhZCxhaCxhZyxhZil7aWYoYWcpe3ZhciBhYz1bYWcuc2VyaWVzSW5kZXgsYWcucG9pbnRJbmRleCxhZy5kYXRhXTt2YXIgYWI9alF1ZXJ5LkV2ZW50KCJqcXBsb3REYXRhQ2xpY2siKTthYi5wYWdlWD1hZS5wYWdlWDthYi5wYWdlWT1hZS5wYWdlWTthZi50YXJnZXQudHJpZ2dlcihhYixhYyl9fWZ1bmN0aW9uIHAoYWYsYWUsYWksYWgsYWcpe2lmKGFoKXt2YXIgYWQ9W2FoLnNlcmllc0luZGV4LGFoLnBvaW50SW5kZXgsYWguZGF0YV07dmFyIGFiPWFnLnBsdWdpbnMubGluZVJlbmRlcmVyLmhpZ2hsaWdodGVkU2VyaWVzSW5kZXg7aWYoYWIhPW51bGwmJmFnLnNlcmllc1thYl0uaGlnaGxpZ2h0TW91c2VEb3duKXtWKGFnKX12YXIgYWM9alF1ZXJ5LkV2ZW50KCJqcXBsb3REYXRhUmlnaHRDbGljayIpO2FjLnBhZ2VYPWFmLnBhZ2VYO2FjLnBhZ2VZPWFmLnBhZ2VZO2FnLnRhcmdldC50cmlnZ2VyKGFjLGFkKX19SC5qcXBsb3QuTGluZWFyQXhpc1JlbmRlcmVyPWZ1bmN0aW9uKCl7fTtILmpxcGxvdC5MaW5lYXJBeGlzUmVuZGVyZXIucHJvdG90eXBlLmluaXQ9ZnVuY3Rpb24oYWIpe3RoaXMuYnJlYWtQb2ludHM9bnVsbDt0aGlzLmJyZWFrVGlja0xhYmVsPSImYXN5bXA7Ijt0aGlzLmRyYXdCYXNlbGluZT10cnVlO3RoaXMuYmFzZWxpbmVXaWR0aD1udWxsO3RoaXMuYmFzZWxpbmVDb2xvcj1udWxsO3RoaXMuZm9yY2VUaWNrQXQwPWZhbHNlO3RoaXMuZm9yY2VUaWNrQXQxMDA9ZmFsc2U7dGhpcy50aWNrSW5zZXQ9MDt0aGlzLm1pbm9yVGlja3M9MDt0aGlzLmFsaWduVGlja3M9ZmFsc2U7dGhpcy5fYXV0b0Zvcm1hdFN0cmluZz0iIjt0aGlzLl9vdmVycmlkZUZvcm1hdFN0cmluZz1mYWxzZTt0aGlzLl9zY2FsZWZhY3Q9MTtILmV4dGVuZCh0cnVlLHRoaXMsYWIpO2lmKHRoaXMuYnJlYWtQb2ludHMpe2lmKCFILmlzQXJyYXkodGhpcy5icmVha1BvaW50cykpe3RoaXMuYnJlYWtQb2ludHM9bnVsbH1lbHNle2lmKHRoaXMuYnJlYWtQb2ludHMubGVuZ3RoPDJ8fHRoaXMuYnJlYWtQb2ludHNbMV08PXRoaXMuYnJlYWtQb2ludHNbMF0pe3RoaXMuYnJlYWtQb2ludHM9bnVsbH19fWlmKHRoaXMubnVtYmVyVGlja3MhPW51bGwmJnRoaXMubnVtYmVyVGlja3M8Mil7dGhpcy5udW1iZXJUaWNrcz0yfXRoaXMucmVzZXREYXRhQm91bmRzKCl9O0guanFwbG90LkxpbmVhckF4aXNSZW5kZXJlci5wcm90b3R5cGUuZHJhdz1mdW5jdGlvbihhYixhaSl7aWYodGhpcy5zaG93KXt0aGlzLnJlbmRlcmVyLmNyZWF0ZVRpY2tzLmNhbGwodGhpcyxhaSk7dmFyIGFoPTA7dmFyIGFjO2lmKHRoaXMuX2VsZW0pe3RoaXMuX2VsZW0uZW1wdHlGb3JjZSgpO3RoaXMuX2VsZW09bnVsbH10aGlzLl9lbGVtPUgoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikpO3RoaXMuX2VsZW0uYWRkQ2xhc3MoImpxcGxvdC1heGlzIGpxcGxvdC0iK3RoaXMubmFtZSk7dGhpcy5fZWxlbS5jc3MoInBvc2l0aW9uIiwiYWJzb2x1dGUiKTtpZih0aGlzLm5hbWU9PSJ4YXhpcyJ8fHRoaXMubmFtZT09IngyYXhpcyIpe3RoaXMuX2VsZW0ud2lkdGgodGhpcy5fcGxvdERpbWVuc2lvbnMud2lkdGgpfWVsc2V7dGhpcy5fZWxlbS5oZWlnaHQodGhpcy5fcGxvdERpbWVuc2lvbnMuaGVpZ2h0KX10aGlzLmxhYmVsT3B0aW9ucy5heGlzPXRoaXMubmFtZTt0aGlzLl9sYWJlbD1uZXcgdGhpcy5sYWJlbFJlbmRlcmVyKHRoaXMubGFiZWxPcHRpb25zKTtpZih0aGlzLl9sYWJlbC5zaG93KXt2YXIgYWc9dGhpcy5fbGFiZWwuZHJhdyhhYixhaSk7YWcuYXBwZW5kVG8odGhpcy5fZWxlbSk7YWc9bnVsbH12YXIgYWY9dGhpcy5fdGlja3M7dmFyIGFlO2Zvcih2YXIgYWQ9MDthZDxhZi5sZW5ndGg7YWQrKyl7YWU9YWZbYWRdO2lmKGFlLnNob3cmJmFlLnNob3dMYWJlbCYmKCFhZS5pc01pbm9yVGlja3x8dGhpcy5zaG93TWlub3JUaWNrcykpe3RoaXMuX2VsZW0uYXBwZW5kKGFlLmRyYXcoYWIsYWkpKX19YWU9bnVsbDthZj1udWxsfXJldHVybiB0aGlzLl9lbGVtfTtILmpxcGxvdC5MaW5lYXJBeGlzUmVuZGVyZXIucHJvdG90eXBlLnJlc2V0PWZ1bmN0aW9uKCl7dGhpcy5taW49dGhpcy5fb3B0aW9ucy5taW47dGhpcy5tYXg9dGhpcy5fb3B0aW9ucy5tYXg7dGhpcy50aWNrSW50ZXJ2YWw9dGhpcy5fb3B0aW9ucy50aWNrSW50ZXJ2YWw7dGhpcy5udW1iZXJUaWNrcz10aGlzLl9vcHRpb25zLm51bWJlclRpY2tzO3RoaXMuX2F1dG9Gb3JtYXRTdHJpbmc9IiI7aWYodGhpcy5fb3ZlcnJpZGVGb3JtYXRTdHJpbmcmJnRoaXMudGlja09wdGlvbnMmJnRoaXMudGlja09wdGlvbnMuZm9ybWF0U3RyaW5nKXt0aGlzLnRpY2tPcHRpb25zLmZvcm1hdFN0cmluZz0iIn19O0guanFwbG90LkxpbmVhckF4aXNSZW5kZXJlci5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uKCl7dmFyIGFpPTA7dmFyIGFkO3ZhciBhYz0wO3ZhciBhaD0wO3ZhciBhYj0odGhpcy5fbGFiZWw9PW51bGwpP2ZhbHNlOnRoaXMuX2xhYmVsLnNob3c7aWYodGhpcy5zaG93KXt2YXIgYWc9dGhpcy5fdGlja3M7dmFyIGFmO2Zvcih2YXIgYWU9MDthZTxhZy5sZW5ndGg7YWUrKyl7YWY9YWdbYWVdO2lmKCFhZi5fYnJlYWtUaWNrJiZhZi5zaG93JiZhZi5zaG93TGFiZWwmJighYWYuaXNNaW5vclRpY2t8fHRoaXMuc2hvd01pbm9yVGlja3MpKXtpZih0aGlzLm5hbWU9PSJ4YXhpcyJ8fHRoaXMubmFtZT09IngyYXhpcyIpe2FkPWFmLl9lbGVtLm91dGVySGVpZ2h0KHRydWUpfWVsc2V7YWQ9YWYuX2VsZW0ub3V0ZXJXaWR0aCh0cnVlKX1pZihhZD5haSl7YWk9YWR9fX1hZj1udWxsO2FnPW51bGw7aWYoYWIpe2FjPXRoaXMuX2xhYmVsLl9lbGVtLm91dGVyV2lkdGgodHJ1ZSk7YWg9dGhpcy5fbGFiZWwuX2VsZW0ub3V0ZXJIZWlnaHQodHJ1ZSl9aWYodGhpcy5uYW1lPT0ieGF4aXMiKXthaT1haSthaDt0aGlzLl9lbGVtLmNzcyh7aGVpZ2h0OmFpKyJweCIsbGVmdDoiMHB4Iixib3R0b206IjBweCJ9KX1lbHNle2lmKHRoaXMubmFtZT09IngyYXhpcyIpe2FpPWFpK2FoO3RoaXMuX2VsZW0uY3NzKHtoZWlnaHQ6YWkrInB4IixsZWZ0OiIwcHgiLHRvcDoiMHB4In0pfWVsc2V7aWYodGhpcy5uYW1lPT0ieWF4aXMiKXthaT1haSthYzt0aGlzLl9lbGVtLmNzcyh7d2lkdGg6YWkrInB4IixsZWZ0OiIwcHgiLHRvcDoiMHB4In0pO2lmKGFiJiZ0aGlzLl9sYWJlbC5jb25zdHJ1Y3Rvcj09SC5qcXBsb3QuQXhpc0xhYmVsUmVuZGVyZXIpe3RoaXMuX2xhYmVsLl9lbGVtLmNzcygid2lkdGgiLGFjKyJweCIpfX1lbHNle2FpPWFpK2FjO3RoaXMuX2VsZW0uY3NzKHt3aWR0aDphaSsicHgiLHJpZ2h0OiIwcHgiLHRvcDoiMHB4In0pO2lmKGFiJiZ0aGlzLl9sYWJlbC5jb25zdHJ1Y3Rvcj09SC5qcXBsb3QuQXhpc0xhYmVsUmVuZGVyZXIpe3RoaXMuX2xhYmVsLl9lbGVtLmNzcygid2lkdGgiLGFjKyJweCIpfX19fX19O0guanFwbG90LkxpbmVhckF4aXNSZW5kZXJlci5wcm90b3R5cGUuY3JlYXRlVGlja3M9ZnVuY3Rpb24oYWQpe3ZhciBhTT10aGlzLl90aWNrczt2YXIgYUQ9dGhpcy50aWNrczt2YXIgYXQ9dGhpcy5uYW1lO3ZhciBhdj10aGlzLl9kYXRhQm91bmRzO3ZhciBhYj0odGhpcy5uYW1lLmNoYXJBdCgwKT09PSJ4Iik/dGhpcy5fcGxvdERpbWVuc2lvbnMud2lkdGg6dGhpcy5fcGxvdERpbWVuc2lvbnMuaGVpZ2h0O3ZhciBhaDt2YXIgYVksYUI7dmFyIGFqLGFpO3ZhciBhVyxhVDt2YXIgYUE9dGhpcy5taW47dmFyIGFYPXRoaXMubWF4O3ZhciBhUD10aGlzLm51bWJlclRpY2tzO3ZhciBhMj10aGlzLnRpY2tJbnRlcnZhbDt2YXIgYWc9MzA7dGhpcy5fc2NhbGVmYWN0PShNYXRoLm1heChhYixhZysxKS1hZykvMzAwO2lmKGFELmxlbmd0aCl7Zm9yKGFUPTA7YVQ8YUQubGVuZ3RoO2FUKyspe3ZhciBhSD1hRFthVF07dmFyIGFOPW5ldyB0aGlzLnRpY2tSZW5kZXJlcih0aGlzLnRpY2tPcHRpb25zKTtpZihILmlzQXJyYXkoYUgpKXthTi52YWx1ZT1hSFswXTtpZih0aGlzLmJyZWFrUG9pbnRzKXtpZihhSFswXT09dGhpcy5icmVha1BvaW50c1swXSl7YU4ubGFiZWw9dGhpcy5icmVha1RpY2tMYWJlbDthTi5fYnJlYWtUaWNrPXRydWU7YU4uc2hvd0dyaWRsaW5lPWZhbHNlO2FOLnNob3dNYXJrPWZhbHNlfWVsc2V7aWYoYUhbMF0+dGhpcy5icmVha1BvaW50c1swXSYmYUhbMF08PXRoaXMuYnJlYWtQb2ludHNbMV0pe2FOLnNob3c9ZmFsc2U7YU4uc2hvd0dyaWRsaW5lPWZhbHNlO2FOLmxhYmVsPWFIWzFdfWVsc2V7YU4ubGFiZWw9YUhbMV19fX1lbHNle2FOLmxhYmVsPWFIWzFdfWFOLnNldFRpY2soYUhbMF0sdGhpcy5uYW1lKTt0aGlzLl90aWNrcy5wdXNoKGFOKX1lbHNle2lmKEguaXNQbGFpbk9iamVjdChhSCkpe0guZXh0ZW5kKHRydWUsYU4sYUgpO2FOLmF4aXM9dGhpcy5uYW1lO3RoaXMuX3RpY2tzLnB1c2goYU4pfWVsc2V7YU4udmFsdWU9YUg7aWYodGhpcy5icmVha1BvaW50cyl7aWYoYUg9PXRoaXMuYnJlYWtQb2ludHNbMF0pe2FOLmxhYmVsPXRoaXMuYnJlYWtUaWNrTGFiZWw7YU4uX2JyZWFrVGljaz10cnVlO2FOLnNob3dHcmlkbGluZT1mYWxzZTthTi5zaG93TWFyaz1mYWxzZX1lbHNle2lmKGFIPnRoaXMuYnJlYWtQb2ludHNbMF0mJmFIPD10aGlzLmJyZWFrUG9pbnRzWzFdKXthTi5zaG93PWZhbHNlO2FOLnNob3dHcmlkbGluZT1mYWxzZX19fWFOLnNldFRpY2soYUgsdGhpcy5uYW1lKTt0aGlzLl90aWNrcy5wdXNoKGFOKX19fXRoaXMubnVtYmVyVGlja3M9YUQubGVuZ3RoO3RoaXMubWluPXRoaXMuX3RpY2tzWzBdLnZhbHVlO3RoaXMubWF4PXRoaXMuX3RpY2tzW3RoaXMubnVtYmVyVGlja3MtMV0udmFsdWU7dGhpcy50aWNrSW50ZXJ2YWw9KHRoaXMubWF4LXRoaXMubWluKS8odGhpcy5udW1iZXJUaWNrcy0xKX1lbHNle2lmKGF0PT0ieGF4aXMifHxhdD09IngyYXhpcyIpe2FiPXRoaXMuX3Bsb3REaW1lbnNpb25zLndpZHRofWVsc2V7YWI9dGhpcy5fcGxvdERpbWVuc2lvbnMuaGVpZ2h0fXZhciBhcT10aGlzLm51bWJlclRpY2tzO2lmKHRoaXMuYWxpZ25UaWNrcyl7aWYodGhpcy5uYW1lPT09IngyYXhpcyImJmFkLmF4ZXMueGF4aXMuc2hvdyl7YXE9YWQuYXhlcy54YXhpcy5udW1iZXJUaWNrc31lbHNle2lmKHRoaXMubmFtZS5jaGFyQXQoMCk9PT0ieSImJnRoaXMubmFtZSE9PSJ5YXhpcyImJnRoaXMubmFtZSE9PSJ5TWlkQXhpcyImJmFkLmF4ZXMueWF4aXMuc2hvdyl7YXE9YWQuYXhlcy55YXhpcy5udW1iZXJUaWNrc319fWFZPSgodGhpcy5taW4hPW51bGwpP3RoaXMubWluOmF2Lm1pbik7YUI9KCh0aGlzLm1heCE9bnVsbCk/dGhpcy5tYXg6YXYubWF4KTt2YXIgYW89YUItYVk7dmFyIGFMLGFyO3ZhciBhbTtpZih0aGlzLnRpY2tPcHRpb25zPT1udWxsfHwhdGhpcy50aWNrT3B0aW9ucy5mb3JtYXRTdHJpbmcpe3RoaXMuX292ZXJyaWRlRm9ybWF0U3RyaW5nPXRydWV9aWYodGhpcy5taW49PW51bGwmJnRoaXMubWF4PT1udWxsJiZ0aGlzLnRpY2tJbnRlcnZhbD09bnVsbCYmIXRoaXMuYXV0b3NjYWxlKXtpZih0aGlzLmZvcmNlVGlja0F0MCl7aWYoYVk+MCl7YVk9MH1pZihhQjwwKXthQj0wfX1pZih0aGlzLmZvcmNlVGlja0F0MTAwKXtpZihhWT4xMDApe2FZPTEwMH1pZihhQjwxMDApe2FCPTEwMH19dmFyIGFJPUguanFwbG90LkxpbmVhclRpY2tHZW5lcmF0b3IoYVksYUIsdGhpcy5fc2NhbGVmYWN0LGFxKTt2YXIgYXA9YVkrYW8qKHRoaXMucGFkTWluLTEpO3ZhciBhSj1hQi1hbyoodGhpcy5wYWRNYXgtMSk7aWYoYVk8YXB8fGFCPmFKKXthcD1hWS1hbyoodGhpcy5wYWRNaW4tMSk7YUo9YUIrYW8qKHRoaXMucGFkTWF4LTEpO2FJPUguanFwbG90LkxpbmVhclRpY2tHZW5lcmF0b3IoYXAsYUosdGhpcy5fc2NhbGVmYWN0LGFxKX10aGlzLm1pbj1hSVswXTt0aGlzLm1heD1hSVsxXTt0aGlzLm51bWJlclRpY2tzPWFJWzJdO3RoaXMuX2F1dG9Gb3JtYXRTdHJpbmc9YUlbM107dGhpcy50aWNrSW50ZXJ2YWw9YUlbNF19ZWxzZXtpZihhWT09YUIpe3ZhciBhYz0wLjA1O2lmKGFZPjApe2FjPU1hdGgubWF4KE1hdGgubG9nKGFZKS9NYXRoLkxOMTAsMC4wNSl9YVktPWFjO2FCKz1hY31pZih0aGlzLmF1dG9zY2FsZSYmdGhpcy5taW49PW51bGwmJnRoaXMubWF4PT1udWxsKXt2YXIgYWUsYWYsYWw7dmFyIGF3PWZhbHNlO3ZhciBhRz1mYWxzZTt2YXIgYXU9e21pbjpudWxsLG1heDpudWxsLGF2ZXJhZ2U6bnVsbCxzdGRkZXY6bnVsbH07Zm9yKHZhciBhVD0wO2FUPHRoaXMuX3Nlcmllcy5sZW5ndGg7YVQrKyl7dmFyIGFPPXRoaXMuX3Nlcmllc1thVF07dmFyIGF4PShhTy5maWxsQXhpcz09IngiKT9hTy5feGF4aXMubmFtZTphTy5feWF4aXMubmFtZTtpZih0aGlzLm5hbWU9PWF4KXt2YXIgYUs9YU8uX3Bsb3RWYWx1ZXNbYU8uZmlsbEF4aXNdO3ZhciBhej1hS1swXTt2YXIgYVU9YUtbMF07Zm9yKHZhciBhUz0xO2FTPGFLLmxlbmd0aDthUysrKXtpZihhS1thU108YXope2F6PWFLW2FTXX1lbHNle2lmKGFLW2FTXT5hVSl7YVU9YUtbYVNdfX19dmFyIGFuPShhVS1heikvYVU7aWYoYU8ucmVuZGVyZXIuY29uc3RydWN0b3I9PUguanFwbG90LkJhclJlbmRlcmVyKXtpZihhej49MCYmKGFPLmZpbGxUb1plcm98fGFuPjAuMSkpe2F3PXRydWV9ZWxzZXthdz1mYWxzZTtpZihhTy5maWxsJiZhTy5maWxsVG9aZXJvJiZhejwwJiZhVT4wKXthRz10cnVlfWVsc2V7YUc9ZmFsc2V9fX1lbHNle2lmKGFPLmZpbGwpe2lmKGF6Pj0wJiYoYU8uZmlsbFRvWmVyb3x8YW4+MC4xKSl7YXc9dHJ1ZX1lbHNle2lmKGF6PDAmJmFVPjAmJmFPLmZpbGxUb1plcm8pe2F3PWZhbHNlO2FHPXRydWV9ZWxzZXthdz1mYWxzZTthRz1mYWxzZX19fWVsc2V7aWYoYXo8MCl7YXc9ZmFsc2V9fX19fWlmKGF3KXt0aGlzLm51bWJlclRpY2tzPTIrTWF0aC5jZWlsKChhYi0odGhpcy50aWNrU3BhY2luZy0xKSkvdGhpcy50aWNrU3BhY2luZyk7dGhpcy5taW49MDthQT0wO2FmPWFCLyh0aGlzLm51bWJlclRpY2tzLTEpO2FtPU1hdGgucG93KDEwLE1hdGguYWJzKE1hdGguZmxvb3IoTWF0aC5sb2coYWYpL01hdGguTE4xMCkpKTtpZihhZi9hbT09cGFyc2VJbnQoYWYvYW0sMTApKXthZis9YW19dGhpcy50aWNrSW50ZXJ2YWw9TWF0aC5jZWlsKGFmL2FtKSphbTt0aGlzLm1heD10aGlzLnRpY2tJbnRlcnZhbCoodGhpcy5udW1iZXJUaWNrcy0xKX1lbHNle2lmKGFHKXt0aGlzLm51bWJlclRpY2tzPTIrTWF0aC5jZWlsKChhYi0odGhpcy50aWNrU3BhY2luZy0xKSkvdGhpcy50aWNrU3BhY2luZyk7dmFyIGFDPU1hdGguY2VpbChNYXRoLmFicyhhWSkvYW8qKHRoaXMubnVtYmVyVGlja3MtMSkpO3ZhciBhMT10aGlzLm51bWJlclRpY2tzLTEtYUM7YWY9TWF0aC5tYXgoTWF0aC5hYnMoYVkvYUMpLE1hdGguYWJzKGFCL2ExKSk7YW09TWF0aC5wb3coMTAsTWF0aC5hYnMoTWF0aC5mbG9vcihNYXRoLmxvZyhhZikvTWF0aC5MTjEwKSkpO3RoaXMudGlja0ludGVydmFsPU1hdGguY2VpbChhZi9hbSkqYW07dGhpcy5tYXg9dGhpcy50aWNrSW50ZXJ2YWwqYTE7dGhpcy5taW49LXRoaXMudGlja0ludGVydmFsKmFDfWVsc2V7aWYodGhpcy5udW1iZXJUaWNrcz09bnVsbCl7aWYodGhpcy50aWNrSW50ZXJ2YWwpe3RoaXMubnVtYmVyVGlja3M9MytNYXRoLmNlaWwoYW8vdGhpcy50aWNrSW50ZXJ2YWwpfWVsc2V7dGhpcy5udW1iZXJUaWNrcz0yK01hdGguY2VpbCgoYWItKHRoaXMudGlja1NwYWNpbmctMSkpL3RoaXMudGlja1NwYWNpbmcpfX1pZih0aGlzLnRpY2tJbnRlcnZhbD09bnVsbCl7YWY9YW8vKHRoaXMubnVtYmVyVGlja3MtMSk7aWYoYWY8MSl7YW09TWF0aC5wb3coMTAsTWF0aC5hYnMoTWF0aC5mbG9vcihNYXRoLmxvZyhhZikvTWF0aC5MTjEwKSkpfWVsc2V7YW09MX10aGlzLnRpY2tJbnRlcnZhbD1NYXRoLmNlaWwoYWYqYW0qdGhpcy5wYWQpL2FtfWVsc2V7YW09MS90aGlzLnRpY2tJbnRlcnZhbH1hZT10aGlzLnRpY2tJbnRlcnZhbCoodGhpcy5udW1iZXJUaWNrcy0xKTthbD0oYWUtYW8pLzI7aWYodGhpcy5taW49PW51bGwpe3RoaXMubWluPU1hdGguZmxvb3IoYW0qKGFZLWFsKSkvYW19aWYodGhpcy5tYXg9PW51bGwpe3RoaXMubWF4PXRoaXMubWluK2FlfX19dmFyIGF5PUguanFwbG90LmdldFNpZ25pZmljYW50RmlndXJlcyh0aGlzLnRpY2tJbnRlcnZhbCk7dmFyIGFGO2lmKGF5LmRpZ2l0c0xlZnQ+PWF5LnNpZ25pZmljYW50RGlnaXRzKXthRj0iJWQifWVsc2V7dmFyIGFtPU1hdGgubWF4KDAsNS1heS5kaWdpdHNMZWZ0KTthbT1NYXRoLm1pbihhbSxheS5kaWdpdHNSaWdodCk7YUY9IiUuIithbSsiZiJ9dGhpcy5fYXV0b0Zvcm1hdFN0cmluZz1hRn1lbHNle2FMPSh0aGlzLm1pbiE9bnVsbCk/dGhpcy5taW46YVktYW8qKHRoaXMucGFkTWluLTEpO2FyPSh0aGlzLm1heCE9bnVsbCk/dGhpcy5tYXg6YUIrYW8qKHRoaXMucGFkTWF4LTEpO2FvPWFyLWFMO2lmKHRoaXMubnVtYmVyVGlja3M9PW51bGwpe2lmKHRoaXMudGlja0ludGVydmFsIT1udWxsKXt0aGlzLm51bWJlclRpY2tzPU1hdGguY2VpbCgoYXItYUwpL3RoaXMudGlja0ludGVydmFsKSsxfWVsc2V7aWYoYWI+MTAwKXt0aGlzLm51bWJlclRpY2tzPXBhcnNlSW50KDMrKGFiLTEwMCkvNzUsMTApfWVsc2V7dGhpcy5udW1iZXJUaWNrcz0yfX19aWYodGhpcy50aWNrSW50ZXJ2YWw9PW51bGwpe3RoaXMudGlja0ludGVydmFsPWFvLyh0aGlzLm51bWJlclRpY2tzLTEpfWlmKHRoaXMubWF4PT1udWxsKXthcj1hTCt0aGlzLnRpY2tJbnRlcnZhbCoodGhpcy5udW1iZXJUaWNrcy0xKX1pZih0aGlzLm1pbj09bnVsbCl7YUw9YXItdGhpcy50aWNrSW50ZXJ2YWwqKHRoaXMubnVtYmVyVGlja3MtMSl9dmFyIGF5PUguanFwbG90LmdldFNpZ25pZmljYW50RmlndXJlcyh0aGlzLnRpY2tJbnRlcnZhbCk7dmFyIGFGO2lmKGF5LmRpZ2l0c0xlZnQ+PWF5LnNpZ25pZmljYW50RGlnaXRzKXthRj0iJWQifWVsc2V7dmFyIGFtPU1hdGgubWF4KDAsNS1heS5kaWdpdHNMZWZ0KTthbT1NYXRoLm1pbihhbSxheS5kaWdpdHNSaWdodCk7YUY9IiUuIithbSsiZiJ9dGhpcy5fYXV0b0Zvcm1hdFN0cmluZz1hRjt0aGlzLm1pbj1hTDt0aGlzLm1heD1hcn1pZih0aGlzLnJlbmRlcmVyLmNvbnN0cnVjdG9yPT1ILmpxcGxvdC5MaW5lYXJBeGlzUmVuZGVyZXImJnRoaXMuX2F1dG9Gb3JtYXRTdHJpbmc9PSIiKXthbz10aGlzLm1heC10aGlzLm1pbjt2YXIgYVo9bmV3IHRoaXMudGlja1JlbmRlcmVyKHRoaXMudGlja09wdGlvbnMpO3ZhciBhRT1hWi5mb3JtYXRTdHJpbmd8fEguanFwbG90LmNvbmZpZy5kZWZhdWx0VGlja0Zvcm1hdFN0cmluZzt2YXIgYUU9YUUubWF0Y2goSC5qcXBsb3Quc3ByaW50Zi5yZWdleClbMF07dmFyIGFWPTA7aWYoYUUpe2lmKGFFLnNlYXJjaCgvW2ZGZUVnR3BQXS8pPi0xKXt2YXIgYVI9YUUubWF0Y2goL1wlXC4oXGR7MCx9KT9bZUVmRmdHcFBdLyk7aWYoYVIpe2FWPXBhcnNlSW50KGFSWzFdLDEwKX1lbHNle2FWPTZ9fWVsc2V7aWYoYUUuc2VhcmNoKC9bZGldLyk+LTEpe2FWPTB9fXZhciBhaz1NYXRoLnBvdygxMCwtYVYpO2lmKHRoaXMudGlja0ludGVydmFsPGFrKXtpZihhUD09bnVsbCYmYTI9PW51bGwpe3RoaXMudGlja0ludGVydmFsPWFrO2lmKGFYPT1udWxsJiZhQT09bnVsbCl7dGhpcy5taW49TWF0aC5mbG9vcih0aGlzLl9kYXRhQm91bmRzLm1pbi9haykqYWs7aWYodGhpcy5taW49PXRoaXMuX2RhdGFCb3VuZHMubWluKXt0aGlzLm1pbj10aGlzLl9kYXRhQm91bmRzLm1pbi10aGlzLnRpY2tJbnRlcnZhbH10aGlzLm1heD1NYXRoLmNlaWwodGhpcy5fZGF0YUJvdW5kcy5tYXgvYWspKmFrO2lmKHRoaXMubWF4PT10aGlzLl9kYXRhQm91bmRzLm1heCl7dGhpcy5tYXg9dGhpcy5fZGF0YUJvdW5kcy5tYXgrdGhpcy50aWNrSW50ZXJ2YWx9dmFyIGFRPSh0aGlzLm1heC10aGlzLm1pbikvdGhpcy50aWNrSW50ZXJ2YWw7YVE9YVEudG9GaXhlZCgxMSk7YVE9TWF0aC5jZWlsKGFRKTt0aGlzLm51bWJlclRpY2tzPWFRKzF9ZWxzZXtpZihhWD09bnVsbCl7dmFyIGFRPSh0aGlzLl9kYXRhQm91bmRzLm1heC10aGlzLm1pbikvdGhpcy50aWNrSW50ZXJ2YWw7YVE9YVEudG9GaXhlZCgxMSk7dGhpcy5udW1iZXJUaWNrcz1NYXRoLmNlaWwoYVEpKzI7dGhpcy5tYXg9dGhpcy5taW4rdGhpcy50aWNrSW50ZXJ2YWwqKHRoaXMubnVtYmVyVGlja3MtMSl9ZWxzZXtpZihhQT09bnVsbCl7dmFyIGFRPSh0aGlzLm1heC10aGlzLl9kYXRhQm91bmRzLm1pbikvdGhpcy50aWNrSW50ZXJ2YWw7YVE9YVEudG9GaXhlZCgxMSk7dGhpcy5udW1iZXJUaWNrcz1NYXRoLmNlaWwoYVEpKzI7dGhpcy5taW49dGhpcy5tYXgtdGhpcy50aWNrSW50ZXJ2YWwqKHRoaXMubnVtYmVyVGlja3MtMSl9ZWxzZXt0aGlzLm51bWJlclRpY2tzPU1hdGguY2VpbCgoYVgtYUEpL3RoaXMudGlja0ludGVydmFsKSsxO3RoaXMubWluPU1hdGguZmxvb3IoYUEqTWF0aC5wb3coMTAsYVYpKS9NYXRoLnBvdygxMCxhVik7dGhpcy5tYXg9TWF0aC5jZWlsKGFYKk1hdGgucG93KDEwLGFWKSkvTWF0aC5wb3coMTAsYVYpO3RoaXMubnVtYmVyVGlja3M9TWF0aC5jZWlsKCh0aGlzLm1heC10aGlzLm1pbikvdGhpcy50aWNrSW50ZXJ2YWwpKzF9fX19fX19fWlmKHRoaXMuX292ZXJyaWRlRm9ybWF0U3RyaW5nJiZ0aGlzLl9hdXRvRm9ybWF0U3RyaW5nIT0iIil7dGhpcy50aWNrT3B0aW9ucz10aGlzLnRpY2tPcHRpb25zfHx7fTt0aGlzLnRpY2tPcHRpb25zLmZvcm1hdFN0cmluZz10aGlzLl9hdXRvRm9ybWF0U3RyaW5nfXZhciBhTixhMDtmb3IodmFyIGFUPTA7YVQ8dGhpcy5udW1iZXJUaWNrczthVCsrKXthVz10aGlzLm1pbithVCp0aGlzLnRpY2tJbnRlcnZhbDthTj1uZXcgdGhpcy50aWNrUmVuZGVyZXIodGhpcy50aWNrT3B0aW9ucyk7YU4uc2V0VGljayhhVyx0aGlzLm5hbWUpO3RoaXMuX3RpY2tzLnB1c2goYU4pO2lmKGFUPHRoaXMubnVtYmVyVGlja3MtMSl7Zm9yKHZhciBhUz0wO2FTPHRoaXMubWlub3JUaWNrczthUysrKXthVys9dGhpcy50aWNrSW50ZXJ2YWwvKHRoaXMubWlub3JUaWNrcysxKTthMD1ILmV4dGVuZCh0cnVlLHt9LHRoaXMudGlja09wdGlvbnMse25hbWU6dGhpcy5uYW1lLHZhbHVlOmFXLGxhYmVsOiIiLGlzTWlub3JUaWNrOnRydWV9KTthTj1uZXcgdGhpcy50aWNrUmVuZGVyZXIoYTApO3RoaXMuX3RpY2tzLnB1c2goYU4pfX1hTj1udWxsfX1pZih0aGlzLnRpY2tJbnNldCl7dGhpcy5taW49dGhpcy5taW4tdGhpcy50aWNrSW5zZXQqdGhpcy50aWNrSW50ZXJ2YWw7dGhpcy5tYXg9dGhpcy5tYXgrdGhpcy50aWNrSW5zZXQqdGhpcy50aWNrSW50ZXJ2YWx9YU09bnVsbH07SC5qcXBsb3QuTGluZWFyQXhpc1JlbmRlcmVyLnByb3RvdHlwZS5yZXNldFRpY2tWYWx1ZXM9ZnVuY3Rpb24oYWQpe2lmKEguaXNBcnJheShhZCkmJmFkLmxlbmd0aD09dGhpcy5fdGlja3MubGVuZ3RoKXt2YXIgYWM7Zm9yKHZhciBhYj0wO2FiPGFkLmxlbmd0aDthYisrKXthYz10aGlzLl90aWNrc1thYl07YWMudmFsdWU9YWRbYWJdO2FjLmxhYmVsPWFjLmZvcm1hdHRlcihhYy5mb3JtYXRTdHJpbmcsYWRbYWJdKTthYy5sYWJlbD1hYy5wcmVmaXgrYWMubGFiZWw7YWMuX2VsZW0uaHRtbChhYy5sYWJlbCl9YWM9bnVsbDt0aGlzLm1pbj1ILmpxcGxvdC5hcnJheU1pbihhZCk7dGhpcy5tYXg9SC5qcXBsb3QuYXJyYXlNYXgoYWQpO3RoaXMucGFjaygpfX07SC5qcXBsb3QuTGluZWFyQXhpc1JlbmRlcmVyLnByb3RvdHlwZS5wYWNrPWZ1bmN0aW9uKGFkLGFjKXthZD1hZHx8e307YWM9YWN8fHRoaXMuX29mZnNldHM7dmFyIGFyPXRoaXMuX3RpY2tzO3ZhciBhbj10aGlzLm1heDt2YXIgYW09dGhpcy5taW47dmFyIGFpPWFjLm1heDt2YXIgYWc9YWMubWluO3ZhciBhaz0odGhpcy5fbGFiZWw9PW51bGwpP2ZhbHNlOnRoaXMuX2xhYmVsLnNob3c7Zm9yKHZhciBhbCBpbiBhZCl7dGhpcy5fZWxlbS5jc3MoYWwsYWRbYWxdKX10aGlzLl9vZmZzZXRzPWFjO3ZhciBhZT1haS1hZzt2YXIgYWY9YW4tYW07aWYodGhpcy5icmVha1BvaW50cyl7YWY9YWYtdGhpcy5icmVha1BvaW50c1sxXSt0aGlzLmJyZWFrUG9pbnRzWzBdO3RoaXMucDJ1PWZ1bmN0aW9uKGF1KXtyZXR1cm4oYXUtYWcpKmFmL2FlK2FtfTt0aGlzLnUycD1mdW5jdGlvbihhdSl7aWYoYXU+dGhpcy5icmVha1BvaW50c1swXSYmYXU8dGhpcy5icmVha1BvaW50c1sxXSl7YXU9dGhpcy5icmVha1BvaW50c1swXX1pZihhdTw9dGhpcy5icmVha1BvaW50c1swXSl7cmV0dXJuKGF1LWFtKSphZS9hZithZ31lbHNle3JldHVybihhdS10aGlzLmJyZWFrUG9pbnRzWzFdK3RoaXMuYnJlYWtQb2ludHNbMF0tYW0pKmFlL2FmK2FnfX07aWYodGhpcy5uYW1lLmNoYXJBdCgwKT09IngiKXt0aGlzLnNlcmllc191MnA9ZnVuY3Rpb24oYXUpe2lmKGF1PnRoaXMuYnJlYWtQb2ludHNbMF0mJmF1PHRoaXMuYnJlYWtQb2ludHNbMV0pe2F1PXRoaXMuYnJlYWtQb2ludHNbMF19aWYoYXU8PXRoaXMuYnJlYWtQb2ludHNbMF0pe3JldHVybihhdS1hbSkqYWUvYWZ9ZWxzZXtyZXR1cm4oYXUtdGhpcy5icmVha1BvaW50c1sxXSt0aGlzLmJyZWFrUG9pbnRzWzBdLWFtKSphZS9hZn19O3RoaXMuc2VyaWVzX3AydT1mdW5jdGlvbihhdSl7cmV0dXJuIGF1KmFmL2FlK2FtfX1lbHNle3RoaXMuc2VyaWVzX3UycD1mdW5jdGlvbihhdSl7aWYoYXU+dGhpcy5icmVha1BvaW50c1swXSYmYXU8dGhpcy5icmVha1BvaW50c1sxXSl7YXU9dGhpcy5icmVha1BvaW50c1swXX1pZihhdT49dGhpcy5icmVha1BvaW50c1sxXSl7cmV0dXJuKGF1LWFuKSphZS9hZn1lbHNle3JldHVybihhdSt0aGlzLmJyZWFrUG9pbnRzWzFdLXRoaXMuYnJlYWtQb2ludHNbMF0tYW4pKmFlL2FmfX07dGhpcy5zZXJpZXNfcDJ1PWZ1bmN0aW9uKGF1KXtyZXR1cm4gYXUqYWYvYWUrYW59fX1lbHNle3RoaXMucDJ1PWZ1bmN0aW9uKGF1KXtyZXR1cm4oYXUtYWcpKmFmL2FlK2FtfTt0aGlzLnUycD1mdW5jdGlvbihhdSl7cmV0dXJuKGF1LWFtKSphZS9hZithZ307aWYodGhpcy5uYW1lPT0ieGF4aXMifHx0aGlzLm5hbWU9PSJ4MmF4aXMiKXt0aGlzLnNlcmllc191MnA9ZnVuY3Rpb24oYXUpe3JldHVybihhdS1hbSkqYWUvYWZ9O3RoaXMuc2VyaWVzX3AydT1mdW5jdGlvbihhdSl7cmV0dXJuIGF1KmFmL2FlK2FtfX1lbHNle3RoaXMuc2VyaWVzX3UycD1mdW5jdGlvbihhdSl7cmV0dXJuKGF1LWFuKSphZS9hZn07dGhpcy5zZXJpZXNfcDJ1PWZ1bmN0aW9uKGF1KXtyZXR1cm4gYXUqYWYvYWUrYW59fX1pZih0aGlzLnNob3cpe2lmKHRoaXMubmFtZT09InhheGlzInx8dGhpcy5uYW1lPT0ieDJheGlzIil7Zm9yKHZhciBhbz0wO2FvPGFyLmxlbmd0aDthbysrKXt2YXIgYWo9YXJbYW9dO2lmKGFqLnNob3cmJmFqLnNob3dMYWJlbCl7dmFyIGFiO2lmKGFqLmNvbnN0cnVjdG9yPT1ILmpxcGxvdC5DYW52YXNBeGlzVGlja1JlbmRlcmVyJiZhai5hbmdsZSl7dmFyIGFxPSh0aGlzLm5hbWU9PSJ4YXhpcyIpPzE6LTE7c3dpdGNoKGFqLmxhYmVsUG9zaXRpb24pe2Nhc2UiYXV0byI6aWYoYXEqYWouYW5nbGU8MCl7YWI9LWFqLmdldFdpZHRoKCkrYWouX3RleHRSZW5kZXJlci5oZWlnaHQqTWF0aC5zaW4oLWFqLl90ZXh0UmVuZGVyZXIuYW5nbGUpLzJ9ZWxzZXthYj0tYWouX3RleHRSZW5kZXJlci5oZWlnaHQqTWF0aC5zaW4oYWouX3RleHRSZW5kZXJlci5hbmdsZSkvMn1icmVhaztjYXNlImVuZCI6YWI9LWFqLmdldFdpZHRoKCkrYWouX3RleHRSZW5kZXJlci5oZWlnaHQqTWF0aC5zaW4oLWFqLl90ZXh0UmVuZGVyZXIuYW5nbGUpLzI7YnJlYWs7Y2FzZSJzdGFydCI6YWI9LWFqLl90ZXh0UmVuZGVyZXIuaGVpZ2h0Kk1hdGguc2luKGFqLl90ZXh0UmVuZGVyZXIuYW5nbGUpLzI7YnJlYWs7Y2FzZSJtaWRkbGUiOmFiPS1hai5nZXRXaWR0aCgpLzIrYWouX3RleHRSZW5kZXJlci5oZWlnaHQqTWF0aC5zaW4oLWFqLl90ZXh0UmVuZGVyZXIuYW5nbGUpLzI7YnJlYWs7ZGVmYXVsdDphYj0tYWouZ2V0V2lkdGgoKS8yK2FqLl90ZXh0UmVuZGVyZXIuaGVpZ2h0Kk1hdGguc2luKC1hai5fdGV4dFJlbmRlcmVyLmFuZ2xlKS8yO2JyZWFrfX1lbHNle2FiPS1hai5nZXRXaWR0aCgpLzJ9dmFyIGF0PXRoaXMudTJwKGFqLnZhbHVlKSthYisicHgiO2FqLl9lbGVtLmNzcygibGVmdCIsYXQpO2FqLnBhY2soKX19aWYoYWspe3ZhciBhaD10aGlzLl9sYWJlbC5fZWxlbS5vdXRlcldpZHRoKHRydWUpO3RoaXMuX2xhYmVsLl9lbGVtLmNzcygibGVmdCIsYWcrYWUvMi1haC8yKyJweCIpO2lmKHRoaXMubmFtZT09InhheGlzIil7dGhpcy5fbGFiZWwuX2VsZW0uY3NzKCJib3R0b20iLCIwcHgiKX1lbHNle3RoaXMuX2xhYmVsLl9lbGVtLmNzcygidG9wIiwiMHB4Iil9dGhpcy5fbGFiZWwucGFjaygpfX1lbHNle2Zvcih2YXIgYW89MDthbzxhci5sZW5ndGg7YW8rKyl7dmFyIGFqPWFyW2FvXTtpZihhai5zaG93JiZhai5zaG93TGFiZWwpe3ZhciBhYjtpZihhai5jb25zdHJ1Y3Rvcj09SC5qcXBsb3QuQ2FudmFzQXhpc1RpY2tSZW5kZXJlciYmYWouYW5nbGUpe3ZhciBhcT0odGhpcy5uYW1lPT0ieWF4aXMiKT8xOi0xO3N3aXRjaChhai5sYWJlbFBvc2l0aW9uKXtjYXNlImF1dG8iOmNhc2UiZW5kIjppZihhcSphai5hbmdsZTwwKXthYj0tYWouX3RleHRSZW5kZXJlci5oZWlnaHQqTWF0aC5jb3MoLWFqLl90ZXh0UmVuZGVyZXIuYW5nbGUpLzJ9ZWxzZXthYj0tYWouZ2V0SGVpZ2h0KCkrYWouX3RleHRSZW5kZXJlci5oZWlnaHQqTWF0aC5jb3MoYWouX3RleHRSZW5kZXJlci5hbmdsZSkvMn1icmVhaztjYXNlInN0YXJ0IjppZihhai5hbmdsZT4wKXthYj0tYWouX3RleHRSZW5kZXJlci5oZWlnaHQqTWF0aC5jb3MoLWFqLl90ZXh0UmVuZGVyZXIuYW5nbGUpLzJ9ZWxzZXthYj0tYWouZ2V0SGVpZ2h0KCkrYWouX3RleHRSZW5kZXJlci5oZWlnaHQqTWF0aC5jb3MoYWouX3RleHRSZW5kZXJlci5hbmdsZSkvMn1icmVhaztjYXNlIm1pZGRsZSI6YWI9LWFqLmdldEhlaWdodCgpLzI7YnJlYWs7ZGVmYXVsdDphYj0tYWouZ2V0SGVpZ2h0KCkvMjticmVha319ZWxzZXthYj0tYWouZ2V0SGVpZ2h0KCkvMn12YXIgYXQ9dGhpcy51MnAoYWoudmFsdWUpK2FiKyJweCI7YWouX2VsZW0uY3NzKCJ0b3AiLGF0KTthai5wYWNrKCl9fWlmKGFrKXt2YXIgYXA9dGhpcy5fbGFiZWwuX2VsZW0ub3V0ZXJIZWlnaHQodHJ1ZSk7dGhpcy5fbGFiZWwuX2VsZW0uY3NzKCJ0b3AiLGFpLWFlLzItYXAvMisicHgiKTtpZih0aGlzLm5hbWU9PSJ5YXhpcyIpe3RoaXMuX2xhYmVsLl9lbGVtLmNzcygibGVmdCIsIjBweCIpfWVsc2V7dGhpcy5fbGFiZWwuX2VsZW0uY3NzKCJyaWdodCIsIjBweCIpfXRoaXMuX2xhYmVsLnBhY2soKX19fWFyPW51bGx9O2Z1bmN0aW9uIGgoYWMpe3ZhciBhYjthYz1NYXRoLmFicyhhYyk7aWYoYWM+PTEwKXthYj0iJWQifWVsc2V7aWYoYWM+MSl7aWYoYWM9PT1wYXJzZUludChhYywxMCkpe2FiPSIlZCJ9ZWxzZXthYj0iJS4xZiJ9fWVsc2V7dmFyIGFkPS1NYXRoLmZsb29yKE1hdGgubG9nKGFjKS9NYXRoLkxOMTApO2FiPSIlLiIrYWQrImYifX1yZXR1cm4gYWJ9dmFyIGE9WzAuMSwwLjIsMC4zLDAuNCwwLjUsMC44LDEsMiwzLDQsNV07dmFyIGI9ZnVuY3Rpb24oYWMpe3ZhciBhYj1hLmluZGV4T2YoYWMpO2lmKGFiPjApe3JldHVybiBhW2FiLTFdfWVsc2V7cmV0dXJuIGFbYS5sZW5ndGgtMV0vMTAwfX07dmFyIGk9ZnVuY3Rpb24oYWMpe3ZhciBhYj1hLmluZGV4T2YoYWMpO2lmKGFiPGEubGVuZ3RoLTEpe3JldHVybiBhW2FiKzFdfWVsc2V7cmV0dXJuIGFbMF0qMTAwfX07ZnVuY3Rpb24gYyhhZixhbixhbSl7dmFyIGFrPU1hdGguZmxvb3IoYW0vMik7dmFyIGFjPU1hdGguY2VpbChhbSoxLjUpO3ZhciBhZT1OdW1iZXIuTUFYX1ZBTFVFO3ZhciBhYj0oYW4tYWYpO3ZhciBhcTt2YXIgYWo7dmFyIGFsO3ZhciBhcDt2YXIgYWg7dmFyIGFyPUguanFwbG90LmdldFNpZ25pZmljYW50RmlndXJlczt2YXIgYWk7dmFyIGFvO2Zvcih2YXIgYWc9MCxhZD1hYy1haysxO2FnPGFkO2FnKyspe2FpPWFrK2FnO2FxPWFiLyhhaS0xKTthaj1hcihhcSk7YXE9TWF0aC5hYnMoYW0tYWkpK2FqLmRpZ2l0c1JpZ2h0O2lmKGFxPGFlKXthZT1hcTthbD1haTthbz1hai5kaWdpdHNSaWdodH1lbHNle2lmKGFxPT09YWUpe2lmKGFqLmRpZ2l0c1JpZ2h0PGFvKXthbD1haTthbz1hai5kaWdpdHNSaWdodH19fX1hcD1NYXRoLm1heChhbyxNYXRoLm1heChhcihhZikuZGlnaXRzUmlnaHQsYXIoYW4pLmRpZ2l0c1JpZ2h0KSk7aWYoYXA9PT0wKXthaD0iJWQifWVsc2V7YWg9IiUuIithcCsiZiJ9YXE9YWIvKGFsLTEpO3JldHVyblthZixhbixhbCxhaCxhcV19ZnVuY3Rpb24gUyhhYyxhZil7YWY9YWZ8fDc7dmFyIGFlPWFjLyhhZi0xKTt2YXIgYWQ9TWF0aC5wb3coMTAsTWF0aC5mbG9vcihNYXRoLmxvZyhhZSkvTWF0aC5MTjEwKSk7dmFyIGFnPWFlL2FkO3ZhciBhYjtpZihhZDwxKXtpZihhZz41KXthYj0xMCphZH1lbHNle2lmKGFnPjIpe2FiPTUqYWR9ZWxzZXtpZihhZz4xKXthYj0yKmFkfWVsc2V7YWI9YWR9fX19ZWxzZXtpZihhZz41KXthYj0xMCphZH1lbHNle2lmKGFnPjQpe2FiPTUqYWR9ZWxzZXtpZihhZz4zKXthYj00KmFkfWVsc2V7aWYoYWc+Mil7YWI9MyphZH1lbHNle2lmKGFnPjEpe2FiPTIqYWR9ZWxzZXthYj1hZH19fX19fXJldHVybiBhYn1mdW5jdGlvbiBNKGFjLGFiKXthYj1hYnx8MTt2YXIgYWU9TWF0aC5mbG9vcihNYXRoLmxvZyhhYykvTWF0aC5MTjEwKTt2YXIgYWc9TWF0aC5wb3coMTAsYWUpO3ZhciBhZj1hYy9hZzt2YXIgYWQ7YWY9YWYvYWI7aWYoYWY8PTAuMzgpe2FkPTAuMX1lbHNle2lmKGFmPD0xLjYpe2FkPTAuMn1lbHNle2lmKGFmPD00KXthZD0wLjV9ZWxzZXtpZihhZjw9OCl7YWQ9MX1lbHNle2lmKGFmPD0xNil7YWQ9Mn1lbHNle2FkPTV9fX19fXJldHVybiBhZCphZ31mdW5jdGlvbiB0KGFkLGFjKXt2YXIgYWY9TWF0aC5mbG9vcihNYXRoLmxvZyhhZCkvTWF0aC5MTjEwKTt2YXIgYWg9TWF0aC5wb3coMTAsYWYpO3ZhciBhZz1hZC9haDt2YXIgYWI7dmFyIGFlO2FnPWFnL2FjO2lmKGFnPD0wLjM4KXthZT0wLjF9ZWxzZXtpZihhZzw9MS42KXthZT0wLjJ9ZWxzZXtpZihhZzw9NCl7YWU9MC41fWVsc2V7aWYoYWc8PTgpe2FlPTF9ZWxzZXtpZihhZzw9MTYpe2FlPTJ9ZWxzZXthZT01fX19fX1hYj1hZSphaDtyZXR1cm5bYWIsYWUsYWhdfUguanFwbG90LkxpbmVhclRpY2tHZW5lcmF0b3I9ZnVuY3Rpb24oYWcsYWgsYWQsYWUpe2lmKGFnPT09YWgpe2FoPShhaCk/MDoxfWFkPWFkfHwxO2lmKGFoPGFnKXt2YXIgYWk9YWg7YWg9YWc7YWc9YWl9dmFyIGFjPVtdO3ZhciBhaj1NKGFoLWFnLGFkKTtpZihhZT09bnVsbCl7YWNbMF09TWF0aC5mbG9vcihhZy9haikqYWo7YWNbMV09TWF0aC5jZWlsKGFoL2FqKSphajthY1syXT1NYXRoLnJvdW5kKChhY1sxXS1hY1swXSkvYWorMSk7YWNbM109aChhaik7YWNbNF09YWp9ZWxzZXt2YXIgYWY9W107YWZbMF09TWF0aC5mbG9vcihhZy9haikqYWo7YWZbMV09TWF0aC5jZWlsKGFoL2FqKSphajthZlsyXT1NYXRoLnJvdW5kKChhZlsxXS1hZlswXSkvYWorMSk7YWZbM109aChhaik7YWZbNF09YWo7aWYoYWZbMl09PT1hZSl7YWM9YWZ9ZWxzZXt2YXIgYWI9UyhhZlsxXS1hZlswXSxhZSk7YWNbMF09YWZbMF07YWNbMl09YWU7YWNbNF09YWI7YWNbM109aChhYik7YWNbMV09YWNbMF0rKGFjWzJdLTEpKmFjWzRdfX1yZXR1cm4gYWN9O0guanFwbG90LkxpbmVhclRpY2tHZW5lcmF0b3IuYmVzdExpbmVhckludGVydmFsPU07SC5qcXBsb3QuTGluZWFyVGlja0dlbmVyYXRvci5iZXN0SW50ZXJ2YWw9UztILmpxcGxvdC5MaW5lYXJUaWNrR2VuZXJhdG9yLmJlc3RMaW5lYXJDb21wb25lbnRzPXQ7SC5qcXBsb3QuTGluZWFyVGlja0dlbmVyYXRvci5iZXN0Q29uc3RyYWluZWRJbnRlcnZhbD1jO0guanFwbG90Lk1hcmtlclJlbmRlcmVyPWZ1bmN0aW9uKGFiKXt0aGlzLnNob3c9dHJ1ZTt0aGlzLnN0eWxlPSJmaWxsZWRDaXJjbGUiO3RoaXMubGluZVdpZHRoPTI7dGhpcy5zaXplPTk7dGhpcy5jb2xvcj0iIzY2NjY2NiI7dGhpcy5zaGFkb3c9dHJ1ZTt0aGlzLnNoYWRvd0FuZ2xlPTQ1O3RoaXMuc2hhZG93T2Zmc2V0PTE7dGhpcy5zaGFkb3dEZXB0aD0zO3RoaXMuc2hhZG93QWxwaGE9IjAuMDciO3RoaXMuc2hhZG93UmVuZGVyZXI9bmV3IEguanFwbG90LlNoYWRvd1JlbmRlcmVyKCk7dGhpcy5zaGFwZVJlbmRlcmVyPW5ldyBILmpxcGxvdC5TaGFwZVJlbmRlcmVyKCk7SC5leHRlbmQodHJ1ZSx0aGlzLGFiKX07SC5qcXBsb3QuTWFya2VyUmVuZGVyZXIucHJvdG90eXBlLmluaXQ9ZnVuY3Rpb24oYWIpe0guZXh0ZW5kKHRydWUsdGhpcyxhYik7dmFyIGFkPXthbmdsZTp0aGlzLnNoYWRvd0FuZ2xlLG9mZnNldDp0aGlzLnNoYWRvd09mZnNldCxhbHBoYTp0aGlzLnNoYWRvd0FscGhhLGxpbmVXaWR0aDp0aGlzLmxpbmVXaWR0aCxkZXB0aDp0aGlzLnNoYWRvd0RlcHRoLGNsb3NlUGF0aDp0cnVlfTtpZih0aGlzLnN0eWxlLmluZGV4T2YoImZpbGxlZCIpIT0tMSl7YWQuZmlsbD10cnVlfWlmKHRoaXMuc3R5bGUuaW5kZXhPZigiaXJjbGUiKSE9LTEpe2FkLmlzYXJjPXRydWU7YWQuY2xvc2VQYXRoPWZhbHNlfXRoaXMuc2hhZG93UmVuZGVyZXIuaW5pdChhZCk7dmFyIGFjPXtmaWxsOmZhbHNlLGlzYXJjOmZhbHNlLHN0cm9rZVN0eWxlOnRoaXMuY29sb3IsZmlsbFN0eWxlOnRoaXMuY29sb3IsbGluZVdpZHRoOnRoaXMubGluZVdpZHRoLGNsb3NlUGF0aDp0cnVlfTtpZih0aGlzLnN0eWxlLmluZGV4T2YoImZpbGxlZCIpIT0tMSl7YWMuZmlsbD10cnVlfWlmKHRoaXMuc3R5bGUuaW5kZXhPZigiaXJjbGUiKSE9LTEpe2FjLmlzYXJjPXRydWU7YWMuY2xvc2VQYXRoPWZhbHNlfXRoaXMuc2hhcGVSZW5kZXJlci5pbml0KGFjKX07SC5qcXBsb3QuTWFya2VyUmVuZGVyZXIucHJvdG90eXBlLmRyYXdEaWFtb25kPWZ1bmN0aW9uKGFkLGFjLGFnLGFmLGFpKXt2YXIgYWI9MS4yO3ZhciBhaj10aGlzLnNpemUvMi9hYjt2YXIgYWg9dGhpcy5zaXplLzIqYWI7dmFyIGFlPVtbYWQtYWosYWNdLFthZCxhYythaF0sW2FkK2FqLGFjXSxbYWQsYWMtYWhdXTtpZih0aGlzLnNoYWRvdyl7dGhpcy5zaGFkb3dSZW5kZXJlci5kcmF3KGFnLGFlKX10aGlzLnNoYXBlUmVuZGVyZXIuZHJhdyhhZyxhZSxhaSl9O0guanFwbG90Lk1hcmtlclJlbmRlcmVyLnByb3RvdHlwZS5kcmF3UGx1cz1mdW5jdGlvbihhZSxhZCxhaCxhZyxhayl7dmFyIGFjPTE7dmFyIGFsPXRoaXMuc2l6ZS8yKmFjO3ZhciBhaT10aGlzLnNpemUvMiphYzt2YXIgYWo9W1thZSxhZC1haV0sW2FlLGFkK2FpXV07dmFyIGFmPVtbYWUrYWwsYWRdLFthZS1hbCxhZF1dO3ZhciBhYj1ILmV4dGVuZCh0cnVlLHt9LHRoaXMub3B0aW9ucyx7Y2xvc2VQYXRoOmZhbHNlfSk7aWYodGhpcy5zaGFkb3cpe3RoaXMuc2hhZG93UmVuZGVyZXIuZHJhdyhhaCxhaix7Y2xvc2VQYXRoOmZhbHNlfSk7dGhpcy5zaGFkb3dSZW5kZXJlci5kcmF3KGFoLGFmLHtjbG9zZVBhdGg6ZmFsc2V9KX10aGlzLnNoYXBlUmVuZGVyZXIuZHJhdyhhaCxhaixhYik7dGhpcy5zaGFwZVJlbmRlcmVyLmRyYXcoYWgsYWYsYWIpfTtILmpxcGxvdC5NYXJrZXJSZW5kZXJlci5wcm90b3R5cGUuZHJhd1g9ZnVuY3Rpb24oYWUsYWQsYWgsYWcsYWspe3ZhciBhYz0xO3ZhciBhbD10aGlzLnNpemUvMiphYzt2YXIgYWk9dGhpcy5zaXplLzIqYWM7dmFyIGFiPUguZXh0ZW5kKHRydWUse30sdGhpcy5vcHRpb25zLHtjbG9zZVBhdGg6ZmFsc2V9KTt2YXIgYWo9W1thZS1hbCxhZC1haV0sW2FlK2FsLGFkK2FpXV07dmFyIGFmPVtbYWUtYWwsYWQrYWldLFthZSthbCxhZC1haV1dO2lmKHRoaXMuc2hhZG93KXt0aGlzLnNoYWRvd1JlbmRlcmVyLmRyYXcoYWgsYWose2Nsb3NlUGF0aDpmYWxzZX0pO3RoaXMuc2hhZG93UmVuZGVyZXIuZHJhdyhhaCxhZix7Y2xvc2VQYXRoOmZhbHNlfSl9dGhpcy5zaGFwZVJlbmRlcmVyLmRyYXcoYWgsYWosYWIpO3RoaXMuc2hhcGVSZW5kZXJlci5kcmF3KGFoLGFmLGFiKX07SC5qcXBsb3QuTWFya2VyUmVuZGVyZXIucHJvdG90eXBlLmRyYXdEYXNoPWZ1bmN0aW9uKGFkLGFjLGFnLGFmLGFpKXt2YXIgYWI9MTt2YXIgYWo9dGhpcy5zaXplLzIqYWI7dmFyIGFoPXRoaXMuc2l6ZS8yKmFiO3ZhciBhZT1bW2FkLWFqLGFjXSxbYWQrYWosYWNdXTtpZih0aGlzLnNoYWRvdyl7dGhpcy5zaGFkb3dSZW5kZXJlci5kcmF3KGFnLGFlKX10aGlzLnNoYXBlUmVuZGVyZXIuZHJhdyhhZyxhZSxhaSl9O0guanFwbG90Lk1hcmtlclJlbmRlcmVyLnByb3RvdHlwZS5kcmF3TGluZT1mdW5jdGlvbihhZyxhZixhYixhZSxhYyl7dmFyIGFkPVthZyxhZl07aWYodGhpcy5zaGFkb3cpe3RoaXMuc2hhZG93UmVuZGVyZXIuZHJhdyhhYixhZCl9dGhpcy5zaGFwZVJlbmRlcmVyLmRyYXcoYWIsYWQsYWMpfTtILmpxcGxvdC5NYXJrZXJSZW5kZXJlci5wcm90b3R5cGUuZHJhd1NxdWFyZT1mdW5jdGlvbihhZCxhYyxhZyxhZixhaSl7dmFyIGFiPTE7dmFyIGFqPXRoaXMuc2l6ZS8yL2FiO3ZhciBhaD10aGlzLnNpemUvMiphYjt2YXIgYWU9W1thZC1haixhYy1haF0sW2FkLWFqLGFjK2FoXSxbYWQrYWosYWMrYWhdLFthZCthaixhYy1haF1dO2lmKHRoaXMuc2hhZG93KXt0aGlzLnNoYWRvd1JlbmRlcmVyLmRyYXcoYWcsYWUpfXRoaXMuc2hhcGVSZW5kZXJlci5kcmF3KGFnLGFlLGFpKX07SC5qcXBsb3QuTWFya2VyUmVuZGVyZXIucHJvdG90eXBlLmRyYXdDaXJjbGU9ZnVuY3Rpb24oYWMsYWksYWUsYWgsYWYpe3ZhciBhYj10aGlzLnNpemUvMjt2YXIgYWQ9MipNYXRoLlBJO3ZhciBhZz1bYWMsYWksYWIsMCxhZCx0cnVlXTtpZih0aGlzLnNoYWRvdyl7dGhpcy5zaGFkb3dSZW5kZXJlci5kcmF3KGFlLGFnKX10aGlzLnNoYXBlUmVuZGVyZXIuZHJhdyhhZSxhZyxhZil9O0guanFwbG90Lk1hcmtlclJlbmRlcmVyLnByb3RvdHlwZS5kcmF3PWZ1bmN0aW9uKGFiLGFlLGFjLGFkKXthZD1hZHx8e307aWYoYWQuc2hvdz09bnVsbHx8YWQuc2hvdyE9ZmFsc2Upe2lmKGFkLmNvbG9yJiYhYWQuZmlsbFN0eWxlKXthZC5maWxsU3R5bGU9YWQuY29sb3J9aWYoYWQuY29sb3ImJiFhZC5zdHJva2VTdHlsZSl7YWQuc3Ryb2tlU3R5bGU9YWQuY29sb3J9c3dpdGNoKHRoaXMuc3R5bGUpe2Nhc2UiZGlhbW9uZCI6dGhpcy5kcmF3RGlhbW9uZChhYixhZSxhYyxmYWxzZSxhZCk7YnJlYWs7Y2FzZSJmaWxsZWREaWFtb25kIjp0aGlzLmRyYXdEaWFtb25kKGFiLGFlLGFjLHRydWUsYWQpO2JyZWFrO2Nhc2UiY2lyY2xlIjp0aGlzLmRyYXdDaXJjbGUoYWIsYWUsYWMsZmFsc2UsYWQpO2JyZWFrO2Nhc2UiZmlsbGVkQ2lyY2xlIjp0aGlzLmRyYXdDaXJjbGUoYWIsYWUsYWMsdHJ1ZSxhZCk7YnJlYWs7Y2FzZSJzcXVhcmUiOnRoaXMuZHJhd1NxdWFyZShhYixhZSxhYyxmYWxzZSxhZCk7YnJlYWs7Y2FzZSJmaWxsZWRTcXVhcmUiOnRoaXMuZHJhd1NxdWFyZShhYixhZSxhYyx0cnVlLGFkKTticmVhaztjYXNlIngiOnRoaXMuZHJhd1goYWIsYWUsYWMsdHJ1ZSxhZCk7YnJlYWs7Y2FzZSJwbHVzIjp0aGlzLmRyYXdQbHVzKGFiLGFlLGFjLHRydWUsYWQpO2JyZWFrO2Nhc2UiZGFzaCI6dGhpcy5kcmF3RGFzaChhYixhZSxhYyx0cnVlLGFkKTticmVhaztjYXNlImxpbmUiOnRoaXMuZHJhd0xpbmUoYWIsYWUsYWMsZmFsc2UsYWQpO2JyZWFrO2RlZmF1bHQ6dGhpcy5kcmF3RGlhbW9uZChhYixhZSxhYyxmYWxzZSxhZCk7YnJlYWt9fX07SC5qcXBsb3QuU2hhZG93UmVuZGVyZXI9ZnVuY3Rpb24oYWIpe3RoaXMuYW5nbGU9NDU7dGhpcy5vZmZzZXQ9MTt0aGlzLmFscGhhPTAuMDc7dGhpcy5saW5lV2lkdGg9MS41O3RoaXMubGluZUpvaW49Im1pdGVyIjt0aGlzLmxpbmVDYXA9InJvdW5kIjt0aGlzLmNsb3NlUGF0aD1mYWxzZTt0aGlzLmZpbGw9ZmFsc2U7dGhpcy5kZXB0aD0zO3RoaXMuc3Ryb2tlU3R5bGU9InJnYmEoMCwwLDAsMC4xKSI7dGhpcy5pc2FyYz1mYWxzZTtILmV4dGVuZCh0cnVlLHRoaXMsYWIpfTtILmpxcGxvdC5TaGFkb3dSZW5kZXJlci5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbihhYil7SC5leHRlbmQodHJ1ZSx0aGlzLGFiKX07SC5qcXBsb3QuU2hhZG93UmVuZGVyZXIucHJvdG90eXBlLmRyYXc9ZnVuY3Rpb24oYW8sYW0sYXEpe2FvLnNhdmUoKTt2YXIgYWI9KGFxIT1udWxsKT9hcTp7fTt2YXIgYW49KGFiLmZpbGwhPW51bGwpP2FiLmZpbGw6dGhpcy5maWxsO3ZhciBhaj0oYWIuZmlsbFJlY3QhPW51bGwpP2FiLmZpbGxSZWN0OnRoaXMuZmlsbFJlY3Q7dmFyIGFpPShhYi5jbG9zZVBhdGghPW51bGwpP2FiLmNsb3NlUGF0aDp0aGlzLmNsb3NlUGF0aDt2YXIgYWY9KGFiLm9mZnNldCE9bnVsbCk/YWIub2Zmc2V0OnRoaXMub2Zmc2V0O3ZhciBhZD0oYWIuYWxwaGEhPW51bGwpP2FiLmFscGhhOnRoaXMuYWxwaGE7dmFyIGFoPShhYi5kZXB0aCE9bnVsbCk/YWIuZGVwdGg6dGhpcy5kZXB0aDt2YXIgYXA9KGFiLmlzYXJjIT1udWxsKT9hYi5pc2FyYzp0aGlzLmlzYXJjO3ZhciBhaz0oYWIubGluZVBhdHRlcm4hPW51bGwpP2FiLmxpbmVQYXR0ZXJuOnRoaXMubGluZVBhdHRlcm47YW8ubGluZVdpZHRoPShhYi5saW5lV2lkdGghPW51bGwpP2FiLmxpbmVXaWR0aDp0aGlzLmxpbmVXaWR0aDthby5saW5lSm9pbj0oYWIubGluZUpvaW4hPW51bGwpP2FiLmxpbmVKb2luOnRoaXMubGluZUpvaW47YW8ubGluZUNhcD0oYWIubGluZUNhcCE9bnVsbCk/YWIubGluZUNhcDp0aGlzLmxpbmVDYXA7YW8uc3Ryb2tlU3R5bGU9YWIuc3Ryb2tlU3R5bGV8fHRoaXMuc3Ryb2tlU3R5bGV8fCJyZ2JhKDAsMCwwLCIrYWQrIikiO2FvLmZpbGxTdHlsZT1hYi5maWxsU3R5bGV8fHRoaXMuZmlsbFN0eWxlfHwicmdiYSgwLDAsMCwiK2FkKyIpIjtmb3IodmFyIGFlPTA7YWU8YWg7YWUrKyl7dmFyIGFsPUguanFwbG90LkxpbmVQYXR0ZXJuKGFvLGFrKTthby50cmFuc2xhdGUoTWF0aC5jb3ModGhpcy5hbmdsZSpNYXRoLlBJLzE4MCkqYWYsTWF0aC5zaW4odGhpcy5hbmdsZSpNYXRoLlBJLzE4MCkqYWYpO2FsLmJlZ2luUGF0aCgpO2lmKGFwKXthby5hcmMoYW1bMF0sYW1bMV0sYW1bMl0sYW1bM10sYW1bNF0sdHJ1ZSl9ZWxzZXtpZihhail7aWYoYWope2FvLmZpbGxSZWN0KGFtWzBdLGFtWzFdLGFtWzJdLGFtWzNdKX19ZWxzZXtpZihhbSYmYW0ubGVuZ3RoKXt2YXIgYWM9dHJ1ZTtmb3IodmFyIGFnPTA7YWc8YW0ubGVuZ3RoO2FnKyspe2lmKGFtW2FnXVswXSE9bnVsbCYmYW1bYWddWzFdIT1udWxsKXtpZihhYyl7YWwubW92ZVRvKGFtW2FnXVswXSxhbVthZ11bMV0pO2FjPWZhbHNlfWVsc2V7YWwubGluZVRvKGFtW2FnXVswXSxhbVthZ11bMV0pfX1lbHNle2FjPXRydWV9fX19fWlmKGFpKXthbC5jbG9zZVBhdGgoKX1pZihhbil7YW8uZmlsbCgpfWVsc2V7YW8uc3Ryb2tlKCl9fWFvLnJlc3RvcmUoKX07SC5qcXBsb3QuU2hhcGVSZW5kZXJlcj1mdW5jdGlvbihhYil7dGhpcy5saW5lV2lkdGg9MS41O3RoaXMubGluZVBhdHRlcm49InNvbGlkIjt0aGlzLmxpbmVKb2luPSJtaXRlciI7dGhpcy5saW5lQ2FwPSJyb3VuZCI7dGhpcy5jbG9zZVBhdGg9ZmFsc2U7dGhpcy5maWxsPWZhbHNlO3RoaXMuaXNhcmM9ZmFsc2U7dGhpcy5maWxsUmVjdD1mYWxzZTt0aGlzLnN0cm9rZVJlY3Q9ZmFsc2U7dGhpcy5jbGVhclJlY3Q9ZmFsc2U7dGhpcy5zdHJva2VTdHlsZT0iIzk5OTk5OSI7dGhpcy5maWxsU3R5bGU9IiM5OTk5OTkiO0guZXh0ZW5kKHRydWUsdGhpcyxhYil9O0guanFwbG90LlNoYXBlUmVuZGVyZXIucHJvdG90eXBlLmluaXQ9ZnVuY3Rpb24oYWIpe0guZXh0ZW5kKHRydWUsdGhpcyxhYil9O0guanFwbG90LlNoYXBlUmVuZGVyZXIucHJvdG90eXBlLmRyYXc9ZnVuY3Rpb24oYW0sYWssYW8pe2FtLnNhdmUoKTt2YXIgYWI9KGFvIT1udWxsKT9hbzp7fTt2YXIgYWw9KGFiLmZpbGwhPW51bGwpP2FiLmZpbGw6dGhpcy5maWxsO3ZhciBhZz0oYWIuY2xvc2VQYXRoIT1udWxsKT9hYi5jbG9zZVBhdGg6dGhpcy5jbG9zZVBhdGg7dmFyIGFoPShhYi5maWxsUmVjdCE9bnVsbCk/YWIuZmlsbFJlY3Q6dGhpcy5maWxsUmVjdDt2YXIgYWU9KGFiLnN0cm9rZVJlY3QhPW51bGwpP2FiLnN0cm9rZVJlY3Q6dGhpcy5zdHJva2VSZWN0O3ZhciBhYz0oYWIuY2xlYXJSZWN0IT1udWxsKT9hYi5jbGVhclJlY3Q6dGhpcy5jbGVhclJlY3Q7dmFyIGFuPShhYi5pc2FyYyE9bnVsbCk/YWIuaXNhcmM6dGhpcy5pc2FyYzt2YXIgYWk9KGFiLmxpbmVQYXR0ZXJuIT1udWxsKT9hYi5saW5lUGF0dGVybjp0aGlzLmxpbmVQYXR0ZXJuO3ZhciBhaj1ILmpxcGxvdC5MaW5lUGF0dGVybihhbSxhaSk7YW0ubGluZVdpZHRoPWFiLmxpbmVXaWR0aHx8dGhpcy5saW5lV2lkdGg7YW0ubGluZUpvaW49YWIubGluZUpvaW58fHRoaXMubGluZUpvaW47YW0ubGluZUNhcD1hYi5saW5lQ2FwfHx0aGlzLmxpbmVDYXA7YW0uc3Ryb2tlU3R5bGU9KGFiLnN0cm9rZVN0eWxlfHxhYi5jb2xvcil8fHRoaXMuc3Ryb2tlU3R5bGU7YW0uZmlsbFN0eWxlPWFiLmZpbGxTdHlsZXx8dGhpcy5maWxsU3R5bGU7YW0uYmVnaW5QYXRoKCk7aWYoYW4pe2FtLmFyYyhha1swXSxha1sxXSxha1syXSxha1szXSxha1s0XSx0cnVlKTtpZihhZyl7YW0uY2xvc2VQYXRoKCl9aWYoYWwpe2FtLmZpbGwoKX1lbHNle2FtLnN0cm9rZSgpfWFtLnJlc3RvcmUoKTtyZXR1cm59ZWxzZXtpZihhYyl7YW0uY2xlYXJSZWN0KGFrWzBdLGFrWzFdLGFrWzJdLGFrWzNdKTthbS5yZXN0b3JlKCk7cmV0dXJufWVsc2V7aWYoYWh8fGFlKXtpZihhaCl7YW0uZmlsbFJlY3QoYWtbMF0sYWtbMV0sYWtbMl0sYWtbM10pfWlmKGFlKXthbS5zdHJva2VSZWN0KGFrWzBdLGFrWzFdLGFrWzJdLGFrWzNdKTthbS5yZXN0b3JlKCk7cmV0dXJufX1lbHNle2lmKGFrJiZhay5sZW5ndGgpe3ZhciBhZD10cnVlO2Zvcih2YXIgYWY9MDthZjxhay5sZW5ndGg7YWYrKyl7aWYoYWtbYWZdWzBdIT1udWxsJiZha1thZl1bMV0hPW51bGwpe2lmKGFkKXthai5tb3ZlVG8oYWtbYWZdWzBdLGFrW2FmXVsxXSk7YWQ9ZmFsc2V9ZWxzZXthai5saW5lVG8oYWtbYWZdWzBdLGFrW2FmXVsxXSl9fWVsc2V7YWQ9dHJ1ZX19aWYoYWcpe2FqLmNsb3NlUGF0aCgpfWlmKGFsKXthbS5maWxsKCl9ZWxzZXthbS5zdHJva2UoKX19fX19YW0ucmVzdG9yZSgpfTtILmpxcGxvdC5UYWJsZUxlZ2VuZFJlbmRlcmVyPWZ1bmN0aW9uKCl7fTtILmpxcGxvdC5UYWJsZUxlZ2VuZFJlbmRlcmVyLnByb3RvdHlwZS5pbml0PWZ1bmN0aW9uKGFiKXtILmV4dGVuZCh0cnVlLHRoaXMsYWIpfTtILmpxcGxvdC5UYWJsZUxlZ2VuZFJlbmRlcmVyLnByb3RvdHlwZS5hZGRyb3c9ZnVuY3Rpb24oYWssYWUsYWIsYWkpe3ZhciBhZj0oYWIpP3RoaXMucm93U3BhY2luZysicHgiOiIwcHgiO3ZhciBhajt2YXIgYWQ7dmFyIGFjO3ZhciBhaDt2YXIgYWc7YWM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidHIiKTthaj1IKGFjKTthai5hZGRDbGFzcygianFwbG90LXRhYmxlLWxlZ2VuZCIpO2FjPW51bGw7aWYoYWkpe2FqLnByZXBlbmRUbyh0aGlzLl9lbGVtKX1lbHNle2FqLmFwcGVuZFRvKHRoaXMuX2VsZW0pfWlmKHRoaXMuc2hvd1N3YXRjaGVzKXthZD1IKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRkIikpO2FkLmFkZENsYXNzKCJqcXBsb3QtdGFibGUtbGVnZW5kIGpxcGxvdC10YWJsZS1sZWdlbmQtc3dhdGNoIik7YWQuY3NzKHt0ZXh0QWxpZ246ImNlbnRlciIscGFkZGluZ1RvcDphZn0pO2FoPUgoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikpO2FoLmFkZENsYXNzKCJqcXBsb3QtdGFibGUtbGVnZW5kLXN3YXRjaC1vdXRsaW5lIik7YWc9SChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSk7YWcuYWRkQ2xhc3MoImpxcGxvdC10YWJsZS1sZWdlbmQtc3dhdGNoIik7YWcuY3NzKHtiYWNrZ3JvdW5kQ29sb3I6YWUsYm9yZGVyQ29sb3I6YWV9KTthai5hcHBlbmQoYWQuYXBwZW5kKGFoLmFwcGVuZChhZykpKX1pZih0aGlzLnNob3dMYWJlbHMpe2FkPUgoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGQiKSk7YWQuYWRkQ2xhc3MoImpxcGxvdC10YWJsZS1sZWdlbmQganFwbG90LXRhYmxlLWxlZ2VuZC1sYWJlbCIpO2FkLmNzcygicGFkZGluZ1RvcCIsYWYpO2FqLmFwcGVuZChhZCk7aWYodGhpcy5lc2NhcGVIdG1sKXthZC50ZXh0KGFrKX1lbHNle2FkLmh0bWwoYWspfX1hZD1udWxsO2FoPW51bGw7YWc9bnVsbDthaj1udWxsO2FjPW51bGx9O0guanFwbG90LlRhYmxlTGVnZW5kUmVuZGVyZXIucHJvdG90eXBlLmRyYXc9ZnVuY3Rpb24oKXtpZih0aGlzLl9lbGVtKXt0aGlzLl9lbGVtLmVtcHR5Rm9yY2UoKTt0aGlzLl9lbGVtPW51bGx9aWYodGhpcy5zaG93KXt2YXIgYWc9dGhpcy5fc2VyaWVzO3ZhciBhYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0YWJsZSIpO3RoaXMuX2VsZW09SChhYyk7dGhpcy5fZWxlbS5hZGRDbGFzcygianFwbG90LXRhYmxlLWxlZ2VuZCIpO3ZhciBhbD17cG9zaXRpb246ImFic29sdXRlIn07aWYodGhpcy5iYWNrZ3JvdW5kKXthbC5iYWNrZ3JvdW5kPXRoaXMuYmFja2dyb3VuZH1pZih0aGlzLmJvcmRlcil7YWwuYm9yZGVyPXRoaXMuYm9yZGVyfWlmKHRoaXMuZm9udFNpemUpe2FsLmZvbnRTaXplPXRoaXMuZm9udFNpemV9aWYodGhpcy5mb250RmFtaWx5KXthbC5mb250RmFtaWx5PXRoaXMuZm9udEZhbWlseX1pZih0aGlzLnRleHRDb2xvcil7YWwudGV4dENvbG9yPXRoaXMudGV4dENvbG9yfWlmKHRoaXMubWFyZ2luVG9wIT1udWxsKXthbC5tYXJnaW5Ub3A9dGhpcy5tYXJnaW5Ub3B9aWYodGhpcy5tYXJnaW5Cb3R0b20hPW51bGwpe2FsLm1hcmdpbkJvdHRvbT10aGlzLm1hcmdpbkJvdHRvbX1pZih0aGlzLm1hcmdpbkxlZnQhPW51bGwpe2FsLm1hcmdpbkxlZnQ9dGhpcy5tYXJnaW5MZWZ0fWlmKHRoaXMubWFyZ2luUmlnaHQhPW51bGwpe2FsLm1hcmdpblJpZ2h0PXRoaXMubWFyZ2luUmlnaHR9dmFyIGFiPWZhbHNlLGFpPWZhbHNlLGFrO2Zvcih2YXIgYWg9MDthaDxhZy5sZW5ndGg7YWgrKyl7YWs9YWdbYWhdO2lmKGFrLl9zdGFja3x8YWsucmVuZGVyZXIuY29uc3RydWN0b3I9PUguanFwbG90LkJlemllckN1cnZlUmVuZGVyZXIpe2FpPXRydWV9aWYoYWsuc2hvdyYmYWsuc2hvd0xhYmVsKXt2YXIgYWY9dGhpcy5sYWJlbHNbYWhdfHxhay5sYWJlbC50b1N0cmluZygpO2lmKGFmKXt2YXIgYWQ9YWsuY29sb3I7aWYoYWkmJmFoPGFnLmxlbmd0aC0xKXthYj10cnVlfWVsc2V7aWYoYWkmJmFoPT1hZy5sZW5ndGgtMSl7YWI9ZmFsc2V9fXRoaXMucmVuZGVyZXIuYWRkcm93LmNhbGwodGhpcyxhZixhZCxhYixhaSk7YWI9dHJ1ZX1mb3IodmFyIGFlPTA7YWU8SC5qcXBsb3QuYWRkTGVnZW5kUm93SG9va3MubGVuZ3RoO2FlKyspe3ZhciBhaj1ILmpxcGxvdC5hZGRMZWdlbmRSb3dIb29rc1thZV0uY2FsbCh0aGlzLGFrKTtpZihhail7dGhpcy5yZW5kZXJlci5hZGRyb3cuY2FsbCh0aGlzLGFqLmxhYmVsLGFqLmNvbG9yLGFiKTthYj10cnVlfX1hZj1udWxsfX19cmV0dXJuIHRoaXMuX2VsZW19O0guanFwbG90LlRhYmxlTGVnZW5kUmVuZGVyZXIucHJvdG90eXBlLnBhY2s9ZnVuY3Rpb24oYWQpe2lmKHRoaXMuc2hvdyl7aWYodGhpcy5wbGFjZW1lbnQ9PSJpbnNpZGVHcmlkIil7c3dpdGNoKHRoaXMubG9jYXRpb24pe2Nhc2UibnciOnZhciBhYz1hZC5sZWZ0O3ZhciBhYj1hZC50b3A7dGhpcy5fZWxlbS5jc3MoImxlZnQiLGFjKTt0aGlzLl9lbGVtLmNzcygidG9wIixhYik7YnJlYWs7Y2FzZSJuIjp2YXIgYWM9KGFkLmxlZnQrKHRoaXMuX3Bsb3REaW1lbnNpb25zLndpZHRoLWFkLnJpZ2h0KSkvMi10aGlzLmdldFdpZHRoKCkvMjt2YXIgYWI9YWQudG9wO3RoaXMuX2VsZW0uY3NzKCJsZWZ0IixhYyk7dGhpcy5fZWxlbS5jc3MoInRvcCIsYWIpO2JyZWFrO2Nhc2UibmUiOnZhciBhYz1hZC5yaWdodDt2YXIgYWI9YWQudG9wO3RoaXMuX2VsZW0uY3NzKHtyaWdodDphYyx0b3A6YWJ9KTticmVhaztjYXNlImUiOnZhciBhYz1hZC5yaWdodDt2YXIgYWI9KGFkLnRvcCsodGhpcy5fcGxvdERpbWVuc2lvbnMuaGVpZ2h0LWFkLmJvdHRvbSkpLzItdGhpcy5nZXRIZWlnaHQoKS8yO3RoaXMuX2VsZW0uY3NzKHtyaWdodDphYyx0b3A6YWJ9KTticmVhaztjYXNlInNlIjp2YXIgYWM9YWQucmlnaHQ7dmFyIGFiPWFkLmJvdHRvbTt0aGlzLl9lbGVtLmNzcyh7cmlnaHQ6YWMsYm90dG9tOmFifSk7YnJlYWs7Y2FzZSJzIjp2YXIgYWM9KGFkLmxlZnQrKHRoaXMuX3Bsb3REaW1lbnNpb25zLndpZHRoLWFkLnJpZ2h0KSkvMi10aGlzLmdldFdpZHRoKCkvMjt2YXIgYWI9YWQuYm90dG9tO3RoaXMuX2VsZW0uY3NzKHtsZWZ0OmFjLGJvdHRvbTphYn0pO2JyZWFrO2Nhc2Uic3ciOnZhciBhYz1hZC5sZWZ0O3ZhciBhYj1hZC5ib3R0b207dGhpcy5fZWxlbS5jc3Moe2xlZnQ6YWMsYm90dG9tOmFifSk7YnJlYWs7Y2FzZSJ3Ijp2YXIgYWM9YWQubGVmdDt2YXIgYWI9KGFkLnRvcCsodGhpcy5fcGxvdERpbWVuc2lvbnMuaGVpZ2h0LWFkLmJvdHRvbSkpLzItdGhpcy5nZXRIZWlnaHQoKS8yO3RoaXMuX2VsZW0uY3NzKHtsZWZ0OmFjLHRvcDphYn0pO2JyZWFrO2RlZmF1bHQ6dmFyIGFjPWFkLnJpZ2h0O3ZhciBhYj1hZC5ib3R0b207dGhpcy5fZWxlbS5jc3Moe3JpZ2h0OmFjLGJvdHRvbTphYn0pO2JyZWFrfX1lbHNle2lmKHRoaXMucGxhY2VtZW50PT0ib3V0c2lkZSIpe3N3aXRjaCh0aGlzLmxvY2F0aW9uKXtjYXNlIm53Ijp2YXIgYWM9dGhpcy5fcGxvdERpbWVuc2lvbnMud2lkdGgtYWQubGVmdDt2YXIgYWI9YWQudG9wO3RoaXMuX2VsZW0uY3NzKCJyaWdodCIsYWMpO3RoaXMuX2VsZW0uY3NzKCJ0b3AiLGFiKTticmVhaztjYXNlIm4iOnZhciBhYz0oYWQubGVmdCsodGhpcy5fcGxvdERpbWVuc2lvbnMud2lkdGgtYWQucmlnaHQpKS8yLXRoaXMuZ2V0V2lkdGgoKS8yO3ZhciBhYj10aGlzLl9wbG90RGltZW5zaW9ucy5oZWlnaHQtYWQudG9wO3RoaXMuX2VsZW0uY3NzKCJsZWZ0IixhYyk7dGhpcy5fZWxlbS5jc3MoImJvdHRvbSIsYWIpO2JyZWFrO2Nhc2UibmUiOnZhciBhYz10aGlzLl9wbG90RGltZW5zaW9ucy53aWR0aC1hZC5yaWdodDt2YXIgYWI9YWQudG9wO3RoaXMuX2VsZW0uY3NzKHtsZWZ0OmFjLHRvcDphYn0pO2JyZWFrO2Nhc2UiZSI6dmFyIGFjPXRoaXMuX3Bsb3REaW1lbnNpb25zLndpZHRoLWFkLnJpZ2h0O3ZhciBhYj0oYWQudG9wKyh0aGlzLl9wbG90RGltZW5zaW9ucy5oZWlnaHQtYWQuYm90dG9tKSkvMi10aGlzLmdldEhlaWdodCgpLzI7dGhpcy5fZWxlbS5jc3Moe2xlZnQ6YWMsdG9wOmFifSk7YnJlYWs7Y2FzZSJzZSI6dmFyIGFjPXRoaXMuX3Bsb3REaW1lbnNpb25zLndpZHRoLWFkLnJpZ2h0O3ZhciBhYj1hZC5ib3R0b207dGhpcy5fZWxlbS5jc3Moe2xlZnQ6YWMsYm90dG9tOmFifSk7YnJlYWs7Y2FzZSJzIjp2YXIgYWM9KGFkLmxlZnQrKHRoaXMuX3Bsb3REaW1lbnNpb25zLndpZHRoLWFkLnJpZ2h0KSkvMi10aGlzLmdldFdpZHRoKCkvMjt2YXIgYWI9dGhpcy5fcGxvdERpbWVuc2lvbnMuaGVpZ2h0LWFkLmJvdHRvbTt0aGlzLl9lbGVtLmNzcyh7bGVmdDphYyx0b3A6YWJ9KTticmVhaztjYXNlInN3Ijp2YXIgYWM9dGhpcy5fcGxvdERpbWVuc2lvbnMud2lkdGgtYWQubGVmdDt2YXIgYWI9YWQuYm90dG9tO3RoaXMuX2VsZW0uY3NzKHtyaWdodDphYyxib3R0b206YWJ9KTticmVhaztjYXNlInciOnZhciBhYz10aGlzLl9wbG90RGltZW5zaW9ucy53aWR0aC1hZC5sZWZ0O3ZhciBhYj0oYWQudG9wKyh0aGlzLl9wbG90RGltZW5zaW9ucy5oZWlnaHQtYWQuYm90dG9tKSkvMi10aGlzLmdldEhlaWdodCgpLzI7dGhpcy5fZWxlbS5jc3Moe3JpZ2h0OmFjLHRvcDphYn0pO2JyZWFrO2RlZmF1bHQ6dmFyIGFjPWFkLnJpZ2h0O3ZhciBhYj1hZC5ib3R0b207dGhpcy5fZWxlbS5jc3Moe3JpZ2h0OmFjLGJvdHRvbTphYn0pO2JyZWFrfX1lbHNle3N3aXRjaCh0aGlzLmxvY2F0aW9uKXtjYXNlIm53Ijp0aGlzLl9lbGVtLmNzcyh7bGVmdDowLHRvcDphZC50b3B9KTticmVhaztjYXNlIm4iOnZhciBhYz0oYWQubGVmdCsodGhpcy5fcGxvdERpbWVuc2lvbnMud2lkdGgtYWQucmlnaHQpKS8yLXRoaXMuZ2V0V2lkdGgoKS8yO3RoaXMuX2VsZW0uY3NzKHtsZWZ0OmFjLHRvcDphZC50b3B9KTticmVhaztjYXNlIm5lIjp0aGlzLl9lbGVtLmNzcyh7cmlnaHQ6MCx0b3A6YWQudG9wfSk7YnJlYWs7Y2FzZSJlIjp2YXIgYWI9KGFkLnRvcCsodGhpcy5fcGxvdERpbWVuc2lvbnMuaGVpZ2h0LWFkLmJvdHRvbSkpLzItdGhpcy5nZXRIZWlnaHQoKS8yO3RoaXMuX2VsZW0uY3NzKHtyaWdodDphZC5yaWdodCx0b3A6YWJ9KTticmVhaztjYXNlInNlIjp0aGlzLl9lbGVtLmNzcyh7cmlnaHQ6YWQucmlnaHQsYm90dG9tOmFkLmJvdHRvbX0pO2JyZWFrO2Nhc2UicyI6dmFyIGFjPShhZC5sZWZ0Kyh0aGlzLl9wbG90RGltZW5zaW9ucy53aWR0aC1hZC5yaWdodCkpLzItdGhpcy5nZXRXaWR0aCgpLzI7dGhpcy5fZWxlbS5jc3Moe2xlZnQ6YWMsYm90dG9tOmFkLmJvdHRvbX0pO2JyZWFrO2Nhc2Uic3ciOnRoaXMuX2VsZW0uY3NzKHtsZWZ0OmFkLmxlZnQsYm90dG9tOmFkLmJvdHRvbX0pO2JyZWFrO2Nhc2UidyI6dmFyIGFiPShhZC50b3ArKHRoaXMuX3Bsb3REaW1lbnNpb25zLmhlaWdodC1hZC5ib3R0b20pKS8yLXRoaXMuZ2V0SGVpZ2h0KCkvMjt0aGlzLl9lbGVtLmNzcyh7bGVmdDphZC5sZWZ0LHRvcDphYn0pO2JyZWFrO2RlZmF1bHQ6dGhpcy5fZWxlbS5jc3Moe3JpZ2h0OmFkLnJpZ2h0LGJvdHRvbTphZC5ib3R0b219KTticmVha319fX19O0guanFwbG90LlRoZW1lRW5naW5lPWZ1bmN0aW9uKCl7dGhpcy50aGVtZXM9e307dGhpcy5hY3RpdmVUaGVtZT1udWxsfTtILmpxcGxvdC5UaGVtZUVuZ2luZS5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbigpe3ZhciBhZT1uZXcgSC5qcXBsb3QuVGhlbWUoe19uYW1lOiJEZWZhdWx0In0pO3ZhciBhaCxhYyxhZztmb3IoYWggaW4gYWUudGFyZ2V0KXtpZihhaD09InRleHRDb2xvciIpe2FlLnRhcmdldFthaF09dGhpcy50YXJnZXQuY3NzKCJjb2xvciIpfWVsc2V7YWUudGFyZ2V0W2FoXT10aGlzLnRhcmdldC5jc3MoYWgpfX1pZih0aGlzLnRpdGxlLnNob3cmJnRoaXMudGl0bGUuX2VsZW0pe2ZvcihhaCBpbiBhZS50aXRsZSl7aWYoYWg9PSJ0ZXh0Q29sb3IiKXthZS50aXRsZVthaF09dGhpcy50aXRsZS5fZWxlbS5jc3MoImNvbG9yIil9ZWxzZXthZS50aXRsZVthaF09dGhpcy50aXRsZS5fZWxlbS5jc3MoYWgpfX19Zm9yKGFoIGluIGFlLmdyaWQpe2FlLmdyaWRbYWhdPXRoaXMuZ3JpZFthaF19aWYoYWUuZ3JpZC5iYWNrZ3JvdW5kQ29sb3I9PW51bGwmJnRoaXMuZ3JpZC5iYWNrZ3JvdW5kIT1udWxsKXthZS5ncmlkLmJhY2tncm91bmRDb2xvcj10aGlzLmdyaWQuYmFja2dyb3VuZH1pZih0aGlzLmxlZ2VuZC5zaG93JiZ0aGlzLmxlZ2VuZC5fZWxlbSl7Zm9yKGFoIGluIGFlLmxlZ2VuZCl7aWYoYWg9PSJ0ZXh0Q29sb3IiKXthZS5sZWdlbmRbYWhdPXRoaXMubGVnZW5kLl9lbGVtLmNzcygiY29sb3IiKX1lbHNle2FlLmxlZ2VuZFthaF09dGhpcy5sZWdlbmQuX2VsZW0uY3NzKGFoKX19fXZhciBhZDtmb3IoYWM9MDthYzx0aGlzLnNlcmllcy5sZW5ndGg7YWMrKyl7YWQ9dGhpcy5zZXJpZXNbYWNdO2lmKGFkLnJlbmRlcmVyLmNvbnN0cnVjdG9yPT1ILmpxcGxvdC5MaW5lUmVuZGVyZXIpe2FlLnNlcmllcy5wdXNoKG5ldyBtKCkpfWVsc2V7aWYoYWQucmVuZGVyZXIuY29uc3RydWN0b3I9PUguanFwbG90LkJhclJlbmRlcmVyKXthZS5zZXJpZXMucHVzaChuZXcgUCgpKX1lbHNle2lmKGFkLnJlbmRlcmVyLmNvbnN0cnVjdG9yPT1ILmpxcGxvdC5QaWVSZW5kZXJlcil7YWUuc2VyaWVzLnB1c2gobmV3IGUoKSl9ZWxzZXtpZihhZC5yZW5kZXJlci5jb25zdHJ1Y3Rvcj09SC5qcXBsb3QuRG9udXRSZW5kZXJlcil7YWUuc2VyaWVzLnB1c2gobmV3IEMoKSl9ZWxzZXtpZihhZC5yZW5kZXJlci5jb25zdHJ1Y3Rvcj09SC5qcXBsb3QuRnVubmVsUmVuZGVyZXIpe2FlLnNlcmllcy5wdXNoKG5ldyBVKCkpfWVsc2V7aWYoYWQucmVuZGVyZXIuY29uc3RydWN0b3I9PUguanFwbG90Lk1ldGVyR2F1Z2VSZW5kZXJlcil7YWUuc2VyaWVzLnB1c2gobmV3IHooKSl9ZWxzZXthZS5zZXJpZXMucHVzaCh7fSl9fX19fX1mb3IoYWggaW4gYWUuc2VyaWVzW2FjXSl7YWUuc2VyaWVzW2FjXVthaF09YWRbYWhdfX12YXIgYWIsYWY7Zm9yKGFoIGluIHRoaXMuYXhlcyl7YWY9dGhpcy5heGVzW2FoXTthYj1hZS5heGVzW2FoXT1uZXcgTCgpO2FiLmJvcmRlckNvbG9yPWFmLmJvcmRlckNvbG9yO2FiLmJvcmRlcldpZHRoPWFmLmJvcmRlcldpZHRoO2lmKGFmLl90aWNrcyYmYWYuX3RpY2tzWzBdKXtmb3IoYWcgaW4gYWIudGlja3Mpe2lmKGFmLl90aWNrc1swXS5oYXNPd25Qcm9wZXJ0eShhZykpe2FiLnRpY2tzW2FnXT1hZi5fdGlja3NbMF1bYWddfWVsc2V7aWYoYWYuX3RpY2tzWzBdLl9lbGVtKXthYi50aWNrc1thZ109YWYuX3RpY2tzWzBdLl9lbGVtLmNzcyhhZyl9fX19aWYoYWYuX2xhYmVsJiZhZi5fbGFiZWwuc2hvdyl7Zm9yKGFnIGluIGFiLmxhYmVsKXtpZihhZi5fbGFiZWxbYWddKXthYi5sYWJlbFthZ109YWYuX2xhYmVsW2FnXX1lbHNle2lmKGFmLl9sYWJlbC5fZWxlbSl7aWYoYWc9PSJ0ZXh0Q29sb3IiKXthYi5sYWJlbFthZ109YWYuX2xhYmVsLl9lbGVtLmNzcygiY29sb3IiKX1lbHNle2FiLmxhYmVsW2FnXT1hZi5fbGFiZWwuX2VsZW0uY3NzKGFnKX19fX19fXRoaXMudGhlbWVFbmdpbmUuX2FkZChhZSk7dGhpcy50aGVtZUVuZ2luZS5hY3RpdmVUaGVtZT10aGlzLnRoZW1lRW5naW5lLnRoZW1lc1thZS5fbmFtZV19O0guanFwbG90LlRoZW1lRW5naW5lLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24oYWIpe2lmKCFhYil7cmV0dXJuIHRoaXMuYWN0aXZlVGhlbWV9ZWxzZXtyZXR1cm4gdGhpcy50aGVtZXNbYWJdfX07ZnVuY3Rpb24gSyhhYyxhYil7cmV0dXJuIGFjLWFifUguanFwbG90LlRoZW1lRW5naW5lLnByb3RvdHlwZS5nZXRUaGVtZU5hbWVzPWZ1bmN0aW9uKCl7dmFyIGFiPVtdO2Zvcih2YXIgYWMgaW4gdGhpcy50aGVtZXMpe2FiLnB1c2goYWMpfXJldHVybiBhYi5zb3J0KEspfTtILmpxcGxvdC5UaGVtZUVuZ2luZS5wcm90b3R5cGUuZ2V0VGhlbWVzPWZ1bmN0aW9uKCl7dmFyIGFjPVtdO3ZhciBhYj1bXTtmb3IodmFyIGFlIGluIHRoaXMudGhlbWVzKXthYy5wdXNoKGFlKX1hYy5zb3J0KEspO2Zvcih2YXIgYWQ9MDthZDxhYy5sZW5ndGg7YWQrKyl7YWIucHVzaCh0aGlzLnRoZW1lc1thY1thZF1dKX1yZXR1cm4gYWJ9O0guanFwbG90LlRoZW1lRW5naW5lLnByb3RvdHlwZS5hY3RpdmF0ZT1mdW5jdGlvbihhbyxhdSl7dmFyIGFiPWZhbHNlO2lmKCFhdSYmdGhpcy5hY3RpdmVUaGVtZSYmdGhpcy5hY3RpdmVUaGVtZS5fbmFtZSl7YXU9dGhpcy5hY3RpdmVUaGVtZS5fbmFtZX1pZighdGhpcy50aGVtZXMuaGFzT3duUHJvcGVydHkoYXUpKXt0aHJvdyBuZXcgRXJyb3IoIk5vIHRoZW1lIG9mIHRoYXQgbmFtZSIpfWVsc2V7dmFyIGFnPXRoaXMudGhlbWVzW2F1XTt0aGlzLmFjdGl2ZVRoZW1lPWFnO3ZhciBhdCxhbT1mYWxzZSxhbD1mYWxzZTt2YXIgYWM9WyJ4YXhpcyIsIngyYXhpcyIsInlheGlzIiwieTJheGlzIl07Zm9yKGFwPTA7YXA8YWMubGVuZ3RoO2FwKyspe3ZhciBhaD1hY1thcF07aWYoYWcuYXhlc1N0eWxlcy5ib3JkZXJDb2xvciE9bnVsbCl7YW8uYXhlc1thaF0uYm9yZGVyQ29sb3I9YWcuYXhlc1N0eWxlcy5ib3JkZXJDb2xvcn1pZihhZy5heGVzU3R5bGVzLmJvcmRlcldpZHRoIT1udWxsKXthby5heGVzW2FoXS5ib3JkZXJXaWR0aD1hZy5heGVzU3R5bGVzLmJvcmRlcldpZHRofX1mb3IodmFyIGFyIGluIGFvLmF4ZXMpe3ZhciBhZT1hby5heGVzW2FyXTtpZihhZS5zaG93KXt2YXIgYWs9YWcuYXhlc1thcl18fHt9O3ZhciBhaT1hZy5heGVzU3R5bGVzO3ZhciBhZj1ILmpxcGxvdC5leHRlbmQodHJ1ZSx7fSxhayxhaSk7YXQ9KGFnLmF4ZXNTdHlsZXMuYm9yZGVyQ29sb3IhPW51bGwpP2FnLmF4ZXNTdHlsZXMuYm9yZGVyQ29sb3I6YWYuYm9yZGVyQ29sb3I7aWYoYWYuYm9yZGVyQ29sb3IhPW51bGwpe2FlLmJvcmRlckNvbG9yPWFmLmJvcmRlckNvbG9yO2FiPXRydWV9YXQ9KGFnLmF4ZXNTdHlsZXMuYm9yZGVyV2lkdGghPW51bGwpP2FnLmF4ZXNTdHlsZXMuYm9yZGVyV2lkdGg6YWYuYm9yZGVyV2lkdGg7aWYoYWYuYm9yZGVyV2lkdGghPW51bGwpe2FlLmJvcmRlcldpZHRoPWFmLmJvcmRlcldpZHRoO2FiPXRydWV9aWYoYWUuX3RpY2tzJiZhZS5fdGlja3NbMF0pe2Zvcih2YXIgYWQgaW4gYWYudGlja3Mpe2F0PWFmLnRpY2tzW2FkXTtpZihhdCE9bnVsbCl7YWUudGlja09wdGlvbnNbYWRdPWF0O2FlLl90aWNrcz1bXTthYj10cnVlfX19aWYoYWUuX2xhYmVsJiZhZS5fbGFiZWwuc2hvdyl7Zm9yKHZhciBhZCBpbiBhZi5sYWJlbCl7YXQ9YWYubGFiZWxbYWRdO2lmKGF0IT1udWxsKXthZS5sYWJlbE9wdGlvbnNbYWRdPWF0O2FiPXRydWV9fX19fWZvcih2YXIgYW4gaW4gYWcuZ3JpZCl7aWYoYWcuZ3JpZFthbl0hPW51bGwpe2FvLmdyaWRbYW5dPWFnLmdyaWRbYW5dfX1pZighYWIpe2FvLmdyaWQuZHJhdygpfWlmKGFvLmxlZ2VuZC5zaG93KXtmb3IoYW4gaW4gYWcubGVnZW5kKXtpZihhZy5sZWdlbmRbYW5dIT1udWxsKXthby5sZWdlbmRbYW5dPWFnLmxlZ2VuZFthbl19fX1pZihhby50aXRsZS5zaG93KXtmb3IoYW4gaW4gYWcudGl0bGUpe2lmKGFnLnRpdGxlW2FuXSE9bnVsbCl7YW8udGl0bGVbYW5dPWFnLnRpdGxlW2FuXX19fXZhciBhcDtmb3IoYXA9MDthcDxhZy5zZXJpZXMubGVuZ3RoO2FwKyspe3ZhciBhaj17fTt2YXIgYXE9ZmFsc2U7Zm9yKGFuIGluIGFnLnNlcmllc1thcF0pe2F0PShhZy5zZXJpZXNTdHlsZXNbYW5dIT1udWxsKT9hZy5zZXJpZXNTdHlsZXNbYW5dOmFnLnNlcmllc1thcF1bYW5dO2lmKGF0IT1udWxsKXthalthbl09YXQ7aWYoYW49PSJjb2xvciIpe2FvLnNlcmllc1thcF0ucmVuZGVyZXIuc2hhcGVSZW5kZXJlci5maWxsU3R5bGU9YXQ7YW8uc2VyaWVzW2FwXS5yZW5kZXJlci5zaGFwZVJlbmRlcmVyLnN0cm9rZVN0eWxlPWF0O2FvLnNlcmllc1thcF1bYW5dPWF0fWVsc2V7aWYoKGFuPT0ibGluZVdpZHRoIil8fChhbj09ImxpbmVQYXR0ZXJuIikpe2FvLnNlcmllc1thcF0ucmVuZGVyZXIuc2hhcGVSZW5kZXJlclthbl09YXQ7YW8uc2VyaWVzW2FwXVthbl09YXR9ZWxzZXtpZihhbj09Im1hcmtlck9wdGlvbnMiKXtSKGFvLnNlcmllc1thcF0ubWFya2VyT3B0aW9ucyxhdCk7Uihhby5zZXJpZXNbYXBdLm1hcmtlclJlbmRlcmVyLGF0KX1lbHNle2FvLnNlcmllc1thcF1bYW5dPWF0fX19YWI9dHJ1ZX19fWlmKGFiKXthby50YXJnZXQuZW1wdHkoKTthby5kcmF3KCl9Zm9yKGFuIGluIGFnLnRhcmdldCl7aWYoYWcudGFyZ2V0W2FuXSE9bnVsbCl7YW8udGFyZ2V0LmNzcyhhbixhZy50YXJnZXRbYW5dKX19fX07SC5qcXBsb3QuVGhlbWVFbmdpbmUucHJvdG90eXBlLl9hZGQ9ZnVuY3Rpb24oYWMsYWIpe2lmKGFiKXthYy5fbmFtZT1hYn1pZighYWMuX25hbWUpe2FjLl9uYW1lPURhdGUucGFyc2UobmV3IERhdGUoKSl9aWYoIXRoaXMudGhlbWVzLmhhc093blByb3BlcnR5KGFjLl9uYW1lKSl7dGhpcy50aGVtZXNbYWMuX25hbWVdPWFjfWVsc2V7dGhyb3cgbmV3IEVycm9yKCJqcXBsb3QuVGhlbWVFbmdpbmUgRXJyb3I6IFRoZW1lIGFscmVhZHkgaW4gdXNlIil9fTtILmpxcGxvdC5UaGVtZUVuZ2luZS5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKGFiKXtpZihhYj09IkRlZmF1bHQiKXtyZXR1cm4gZmFsc2V9cmV0dXJuIGRlbGV0ZSB0aGlzLnRoZW1lc1thYl19O0guanFwbG90LlRoZW1lRW5naW5lLnByb3RvdHlwZS5uZXdUaGVtZT1mdW5jdGlvbihhYixhZCl7aWYodHlwZW9mKGFiKT09Im9iamVjdCIpe2FkPWFkfHxhYjthYj1udWxsfWlmKGFkJiZhZC5fbmFtZSl7YWI9YWQuX25hbWV9ZWxzZXthYj1hYnx8RGF0ZS5wYXJzZShuZXcgRGF0ZSgpKX12YXIgYWM9dGhpcy5jb3B5KHRoaXMudGhlbWVzLkRlZmF1bHQuX25hbWUsYWIpO0guanFwbG90LmV4dGVuZChhYyxhZCk7cmV0dXJuIGFjfTtmdW5jdGlvbiB4KGFkKXtpZihhZD09bnVsbHx8dHlwZW9mKGFkKSE9Im9iamVjdCIpe3JldHVybiBhZH12YXIgYWI9bmV3IGFkLmNvbnN0cnVjdG9yKCk7Zm9yKHZhciBhYyBpbiBhZCl7YWJbYWNdPXgoYWRbYWNdKX1yZXR1cm4gYWJ9SC5qcXBsb3QuY2xvbmU9eDtmdW5jdGlvbiBSKGFkLGFjKXtpZihhYz09bnVsbHx8dHlwZW9mKGFjKSE9Im9iamVjdCIpe3JldHVybn1mb3IodmFyIGFiIGluIGFjKXtpZihhYj09ImhpZ2hsaWdodENvbG9ycyIpe2FkW2FiXT14KGFjW2FiXSl9aWYoYWNbYWJdIT1udWxsJiZ0eXBlb2YoYWNbYWJdKT09Im9iamVjdCIpe2lmKCFhZC5oYXNPd25Qcm9wZXJ0eShhYikpe2FkW2FiXT17fX1SKGFkW2FiXSxhY1thYl0pfWVsc2V7YWRbYWJdPWFjW2FiXX19fUguanFwbG90Lm1lcmdlPVI7SC5qcXBsb3QuZXh0ZW5kPWZ1bmN0aW9uKCl7dmFyIGFnPWFyZ3VtZW50c1swXXx8e30sYWU9MSxhZj1hcmd1bWVudHMubGVuZ3RoLGFiPWZhbHNlLGFkO2lmKHR5cGVvZiBhZz09PSJib29sZWFuIil7YWI9YWc7YWc9YXJndW1lbnRzWzFdfHx7fTthZT0yfWlmKHR5cGVvZiBhZyE9PSJvYmplY3QiJiYhdG9TdHJpbmcuY2FsbChhZyk9PT0iW29iamVjdCBGdW5jdGlvbl0iKXthZz17fX1mb3IoO2FlPGFmO2FlKyspe2lmKChhZD1hcmd1bWVudHNbYWVdKSE9bnVsbCl7Zm9yKHZhciBhYyBpbiBhZCl7dmFyIGFoPWFnW2FjXSxhaT1hZFthY107aWYoYWc9PT1haSl7Y29udGludWV9aWYoYWImJmFpJiZ0eXBlb2YgYWk9PT0ib2JqZWN0IiYmIWFpLm5vZGVUeXBlKXthZ1thY109SC5qcXBsb3QuZXh0ZW5kKGFiLGFofHwoYWkubGVuZ3RoIT1udWxsP1tdOnt9KSxhaSl9ZWxzZXtpZihhaSE9PXIpe2FnW2FjXT1haX19fX19cmV0dXJuIGFnfTtILmpxcGxvdC5UaGVtZUVuZ2luZS5wcm90b3R5cGUucmVuYW1lPWZ1bmN0aW9uKGFjLGFiKXtpZihhYz09IkRlZmF1bHQifHxhYj09IkRlZmF1bHQiKXt0aHJvdyBuZXcgRXJyb3IoImpxcGxvdC5UaGVtZUVuZ2luZSBFcnJvcjogQ2Fubm90IHJlbmFtZSBmcm9tL3RvIERlZmF1bHQiKX1pZih0aGlzLnRoZW1lcy5oYXNPd25Qcm9wZXJ0eShhYikpe3Rocm93IG5ldyBFcnJvcigianFwbG90LlRoZW1lRW5naW5lIEVycm9yOiBOZXcgbmFtZSBhbHJlYWR5IGluIHVzZS4iKX1lbHNle2lmKHRoaXMudGhlbWVzLmhhc093blByb3BlcnR5KGFjKSl7dmFyIGFkPXRoaXMuY29weShhYyxhYik7dGhpcy5yZW1vdmUoYWMpO3JldHVybiBhZH19dGhyb3cgbmV3IEVycm9yKCJqcXBsb3QuVGhlbWVFbmdpbmUgRXJyb3I6IE9sZCBuYW1lIG9yIG5ldyBuYW1lIGludmFsaWQiKX07SC5qcXBsb3QuVGhlbWVFbmdpbmUucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oYWIsYWQsYWYpe2lmKGFkPT0iRGVmYXVsdCIpe3Rocm93IG5ldyBFcnJvcigianFwbG90LlRoZW1lRW5naW5lIEVycm9yOiBDYW5ub3QgY29weSBvdmVyIERlZmF1bHQgdGhlbWUiKX1pZighdGhpcy50aGVtZXMuaGFzT3duUHJvcGVydHkoYWIpKXt2YXIgYWM9ImpxcGxvdC5UaGVtZUVuZ2luZSBFcnJvcjogU291cmNlIG5hbWUgaW52YWxpZCI7dGhyb3cgbmV3IEVycm9yKGFjKX1pZih0aGlzLnRoZW1lcy5oYXNPd25Qcm9wZXJ0eShhZCkpe3ZhciBhYz0ianFwbG90LlRoZW1lRW5naW5lIEVycm9yOiBUYXJnZXQgbmFtZSBpbnZhbGlkIjt0aHJvdyBuZXcgRXJyb3IoYWMpfWVsc2V7dmFyIGFlPXgodGhpcy50aGVtZXNbYWJdKTthZS5fbmFtZT1hZDtILmpxcGxvdC5leHRlbmQodHJ1ZSxhZSxhZik7dGhpcy5fYWRkKGFlKTtyZXR1cm4gYWV9fTtILmpxcGxvdC5UaGVtZT1mdW5jdGlvbihhYixhYyl7aWYodHlwZW9mKGFiKT09Im9iamVjdCIpe2FjPWFjfHxhYjthYj1udWxsfWFiPWFifHxEYXRlLnBhcnNlKG5ldyBEYXRlKCkpO3RoaXMuX25hbWU9YWI7dGhpcy50YXJnZXQ9e2JhY2tncm91bmRDb2xvcjpudWxsfTt0aGlzLmxlZ2VuZD17dGV4dENvbG9yOm51bGwsZm9udEZhbWlseTpudWxsLGZvbnRTaXplOm51bGwsYm9yZGVyOm51bGwsYmFja2dyb3VuZDpudWxsfTt0aGlzLnRpdGxlPXt0ZXh0Q29sb3I6bnVsbCxmb250RmFtaWx5Om51bGwsZm9udFNpemU6bnVsbCx0ZXh0QWxpZ246bnVsbH07dGhpcy5zZXJpZXNTdHlsZXM9e307dGhpcy5zZXJpZXM9W107dGhpcy5ncmlkPXtkcmF3R3JpZGxpbmVzOm51bGwsZ3JpZExpbmVDb2xvcjpudWxsLGdyaWRMaW5lV2lkdGg6bnVsbCxiYWNrZ3JvdW5kQ29sb3I6bnVsbCxib3JkZXJDb2xvcjpudWxsLGJvcmRlcldpZHRoOm51bGwsc2hhZG93Om51bGx9O3RoaXMuYXhlc1N0eWxlcz17bGFiZWw6e30sdGlja3M6e319O3RoaXMuYXhlcz17fTtpZih0eXBlb2YoYWMpPT0ic3RyaW5nIil7dGhpcy5fbmFtZT1hY31lbHNle2lmKHR5cGVvZihhYyk9PSJvYmplY3QiKXtILmpxcGxvdC5leHRlbmQodHJ1ZSx0aGlzLGFjKX19fTt2YXIgTD1mdW5jdGlvbigpe3RoaXMuYm9yZGVyQ29sb3I9bnVsbDt0aGlzLmJvcmRlcldpZHRoPW51bGw7dGhpcy50aWNrcz1uZXcgbCgpO3RoaXMubGFiZWw9bmV3IHEoKX07dmFyIGw9ZnVuY3Rpb24oKXt0aGlzLnNob3c9bnVsbDt0aGlzLnNob3dHcmlkbGluZT1udWxsO3RoaXMuc2hvd0xhYmVsPW51bGw7dGhpcy5zaG93TWFyaz1udWxsO3RoaXMuc2l6ZT1udWxsO3RoaXMudGV4dENvbG9yPW51bGw7dGhpcy53aGl0ZVNwYWNlPW51bGw7dGhpcy5mb250U2l6ZT1udWxsO3RoaXMuZm9udEZhbWlseT1udWxsfTt2YXIgcT1mdW5jdGlvbigpe3RoaXMudGV4dENvbG9yPW51bGw7dGhpcy53aGl0ZVNwYWNlPW51bGw7dGhpcy5mb250U2l6ZT1udWxsO3RoaXMuZm9udEZhbWlseT1udWxsO3RoaXMuZm9udFdlaWdodD1udWxsfTt2YXIgbT1mdW5jdGlvbigpe3RoaXMuY29sb3I9bnVsbDt0aGlzLmxpbmVXaWR0aD1udWxsO3RoaXMubGluZVBhdHRlcm49bnVsbDt0aGlzLnNoYWRvdz1udWxsO3RoaXMuZmlsbENvbG9yPW51bGw7dGhpcy5zaG93TWFya2VyPW51bGw7dGhpcy5tYXJrZXJPcHRpb25zPW5ldyBFKCl9O3ZhciBFPWZ1bmN0aW9uKCl7dGhpcy5zaG93PW51bGw7dGhpcy5zdHlsZT1udWxsO3RoaXMubGluZVdpZHRoPW51bGw7dGhpcy5zaXplPW51bGw7dGhpcy5jb2xvcj1udWxsO3RoaXMuc2hhZG93PW51bGx9O3ZhciBQPWZ1bmN0aW9uKCl7dGhpcy5jb2xvcj1udWxsO3RoaXMuc2VyaWVzQ29sb3JzPW51bGw7dGhpcy5saW5lV2lkdGg9bnVsbDt0aGlzLnNoYWRvdz1udWxsO3RoaXMuYmFyUGFkZGluZz1udWxsO3RoaXMuYmFyTWFyZ2luPW51bGw7dGhpcy5iYXJXaWR0aD1udWxsO3RoaXMuaGlnaGxpZ2h0Q29sb3JzPW51bGx9O3ZhciBlPWZ1bmN0aW9uKCl7dGhpcy5zZXJpZXNDb2xvcnM9bnVsbDt0aGlzLnBhZGRpbmc9bnVsbDt0aGlzLnNsaWNlTWFyZ2luPW51bGw7dGhpcy5maWxsPW51bGw7dGhpcy5zaGFkb3c9bnVsbDt0aGlzLnN0YXJ0QW5nbGU9bnVsbDt0aGlzLmxpbmVXaWR0aD1udWxsO3RoaXMuaGlnaGxpZ2h0Q29sb3JzPW51bGx9O3ZhciBDPWZ1bmN0aW9uKCl7dGhpcy5zZXJpZXNDb2xvcnM9bnVsbDt0aGlzLnBhZGRpbmc9bnVsbDt0aGlzLnNsaWNlTWFyZ2luPW51bGw7dGhpcy5maWxsPW51bGw7dGhpcy5zaGFkb3c9bnVsbDt0aGlzLnN0YXJ0QW5nbGU9bnVsbDt0aGlzLmxpbmVXaWR0aD1udWxsO3RoaXMuaW5uZXJEaWFtZXRlcj1udWxsO3RoaXMudGhpY2tuZXNzPW51bGw7dGhpcy5yaW5nTWFyZ2luPW51bGw7dGhpcy5oaWdobGlnaHRDb2xvcnM9bnVsbH07dmFyIFU9ZnVuY3Rpb24oKXt0aGlzLmNvbG9yPW51bGw7dGhpcy5saW5lV2lkdGg9bnVsbDt0aGlzLnNoYWRvdz1udWxsO3RoaXMucGFkZGluZz1udWxsO3RoaXMuc2VjdGlvbk1hcmdpbj1udWxsO3RoaXMuc2VyaWVzQ29sb3JzPW51bGw7dGhpcy5oaWdobGlnaHRDb2xvcnM9bnVsbH07dmFyIHo9ZnVuY3Rpb24oKXt0aGlzLnBhZGRpbmc9bnVsbDt0aGlzLmJhY2tncm91bmRDb2xvcj1udWxsO3RoaXMucmluZ0NvbG9yPW51bGw7dGhpcy50aWNrQ29sb3I9bnVsbDt0aGlzLnJpbmdXaWR0aD1udWxsO3RoaXMuaW50ZXJ2YWxDb2xvcnM9bnVsbDt0aGlzLmludGVydmFsSW5uZXJSYWRpdXM9bnVsbDt0aGlzLmludGVydmFsT3V0ZXJSYWRpdXM9bnVsbDt0aGlzLmh1YlJhZGl1cz1udWxsO3RoaXMubmVlZGxlVGhpY2tuZXNzPW51bGw7dGhpcy5uZWVkbGVQYWQ9bnVsbH07SC5mbi5qcXBsb3RDaGlsZFRleHQ9ZnVuY3Rpb24oKXtyZXR1cm4gSCh0aGlzKS5jb250ZW50cygpLmZpbHRlcihmdW5jdGlvbigpe3JldHVybiB0aGlzLm5vZGVUeXBlPT0zfSkudGV4dCgpfTtILmZuLmpxcGxvdEdldENvbXB1dGVkRm9udFN0eWxlPWZ1bmN0aW9uKCl7dmFyIGFlPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlP3dpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRoaXNbMF0pOnRoaXNbMF0uY3VycmVudFN0eWxlO3ZhciBhYz1hZVsiZm9udC1zdHlsZSJdP1siZm9udC1zdHlsZSIsImZvbnQtd2VpZ2h0IiwiZm9udC1zaXplIiwiZm9udC1mYW1pbHkiXTpbImZvbnRTdHlsZSIsImZvbnRXZWlnaHQiLCJmb250U2l6ZSIsImZvbnRGYW1pbHkiXTt2YXIgYWY9W107Zm9yKHZhciBhZD0wO2FkPGFjLmxlbmd0aDsrK2FkKXt2YXIgYWI9U3RyaW5nKGFlW2FjW2FkXV0pO2lmKGFiJiZhYiE9Im5vcm1hbCIpe2FmLnB1c2goYWIpfX1yZXR1cm4gYWYuam9pbigiICIpfTtILmZuLmpxcGxvdFRvSW1hZ2VDYW52YXM9ZnVuY3Rpb24oYWQpe2FkPWFkfHx7fTt2YXIgYW89KGFkLnhfb2Zmc2V0PT1udWxsKT8wOmFkLnhfb2Zmc2V0O3ZhciBhcT0oYWQueV9vZmZzZXQ9PW51bGwpPzA6YWQueV9vZmZzZXQ7dmFyIGFmPShhZC5iYWNrZ3JvdW5kQ29sb3I9PW51bGwpPyJyZ2IoMjU1LDI1NSwyNTUpIjphZC5iYWNrZ3JvdW5kQ29sb3I7aWYoSCh0aGlzKS53aWR0aCgpPT0wfHxIKHRoaXMpLmhlaWdodCgpPT0wKXtyZXR1cm4gbnVsbH1pZighSC5qcXBsb3Quc3VwcG9ydF9jYW52YXMpe3JldHVybiBudWxsfXZhciBhaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKTt2YXIgYXU9SCh0aGlzKS5vdXRlckhlaWdodCh0cnVlKTt2YXIgYW09SCh0aGlzKS5vdXRlcldpZHRoKHRydWUpO3ZhciBhZz1IKHRoaXMpLm9mZnNldCgpO3ZhciBhaT1hZy5sZWZ0O3ZhciBhaz1hZy50b3A7dmFyIGFuPTAsYWw9MDt2YXIgYXI9WyJqcXBsb3QtdGFibGUtbGVnZW5kIiwianFwbG90LXhheGlzLXRpY2siLCJqcXBsb3QteDJheGlzLXRpY2siLCJqcXBsb3QteWF4aXMtdGljayIsImpxcGxvdC15MmF4aXMtdGljayIsImpxcGxvdC15M2F4aXMtdGljayIsImpxcGxvdC15NGF4aXMtdGljayIsImpxcGxvdC15NWF4aXMtdGljayIsImpxcGxvdC15NmF4aXMtdGljayIsImpxcGxvdC15N2F4aXMtdGljayIsImpxcGxvdC15OGF4aXMtdGljayIsImpxcGxvdC15OWF4aXMtdGljayIsImpxcGxvdC14YXhpcy1sYWJlbCIsImpxcGxvdC14MmF4aXMtbGFiZWwiLCJqcXBsb3QteWF4aXMtbGFiZWwiLCJqcXBsb3QteTJheGlzLWxhYmVsIiwianFwbG90LXkzYXhpcy1sYWJlbCIsImpxcGxvdC15NGF4aXMtbGFiZWwiLCJqcXBsb3QteTVheGlzLWxhYmVsIiwianFwbG90LXk2YXhpcy1sYWJlbCIsImpxcGxvdC15N2F4aXMtbGFiZWwiLCJqcXBsb3QteThheGlzLWxhYmVsIiwianFwbG90LXk5YXhpcy1sYWJlbCJdO3ZhciBhaixhYixhYyxhdjtmb3IodmFyIGF0IGluIGFyKXtIKHRoaXMpLmZpbmQoIi4iK2FyW2F0XSkuZWFjaChmdW5jdGlvbigpe2FqPUgodGhpcykub2Zmc2V0KCkudG9wLWFrO2FiPUgodGhpcykub2Zmc2V0KCkubGVmdC1haTthdj1hYitIKHRoaXMpLm91dGVyV2lkdGgodHJ1ZSkrYW47YWM9YWorSCh0aGlzKS5vdXRlckhlaWdodCh0cnVlKSthbDtpZihhYjwtYW4pe2FtPWFtLWFuLWFiO2FuPS1hYn1pZihhajwtYWwpe2F1PWF1LWFsLWFqO2FsPS1han1pZihhdj5hbSl7YW09YXZ9aWYoYWM+YXUpe2F1PWFjfX0pfWFoLndpZHRoPWFtK051bWJlcihhbyk7YWguaGVpZ2h0PWF1K051bWJlcihhcSk7dmFyIGFlPWFoLmdldENvbnRleHQoIjJkIik7YWUuc2F2ZSgpO2FlLmZpbGxTdHlsZT1hZjthZS5maWxsUmVjdCgwLDAsYWgud2lkdGgsYWguaGVpZ2h0KTthZS5yZXN0b3JlKCk7YWUudHJhbnNsYXRlKGFuLGFsKTthZS50ZXh0QWxpZ249ImxlZnQiO2FlLnRleHRCYXNlbGluZT0idG9wIjtmdW5jdGlvbiBhdyhheSl7dmFyIGF6PXBhcnNlSW50KEgoYXkpLmNzcygibGluZS1oZWlnaHQiKSwxMCk7aWYoaXNOYU4oYXopKXthej1wYXJzZUludChIKGF5KS5jc3MoImZvbnQtc2l6ZSIpLDEwKSoxLjJ9cmV0dXJuIGF6fWZ1bmN0aW9uIGF4KGF6LGF5LGFNLGFBLGFJLGFCKXt2YXIgYUs9YXcoYXopO3ZhciBhRT1IKGF6KS5pbm5lcldpZHRoKCk7dmFyIGFGPUgoYXopLmlubmVySGVpZ2h0KCk7dmFyIGFIPWFNLnNwbGl0KC9ccysvKTt2YXIgYUw9YUgubGVuZ3RoO3ZhciBhSj0iIjt2YXIgYUc9W107dmFyIGFPPWFJO3ZhciBhTj1hQTtmb3IodmFyIGFEPTA7YUQ8YUw7YUQrKyl7YUorPWFIW2FEXTtpZihheS5tZWFzdXJlVGV4dChhSikud2lkdGg+YUUpe2FHLnB1c2goYUQpO2FKPSIifX1pZihhRy5sZW5ndGg9PT0wKXtpZihIKGF6KS5jc3MoInRleHRBbGlnbiIpPT09ImNlbnRlciIpe2FOPWFBKyhhQi1heS5tZWFzdXJlVGV4dChhSikud2lkdGgpLzItYW59YXkuZmlsbFRleHQoYU0sYU4sYUkpfWVsc2V7YUo9YUguc2xpY2UoMCxhR1swXSkuam9pbigiICIpO2lmKEgoYXopLmNzcygidGV4dEFsaWduIik9PT0iY2VudGVyIil7YU49YUErKGFCLWF5Lm1lYXN1cmVUZXh0KGFKKS53aWR0aCkvMi1hbn1heS5maWxsVGV4dChhSixhTixhTyk7YU8rPWFLO2Zvcih2YXIgYUQ9MSxhQz1hRy5sZW5ndGg7YUQ8YUM7YUQrKyl7YUo9YUguc2xpY2UoYUdbYUQtMV0sYUdbYURdKS5qb2luKCIgIik7aWYoSChheikuY3NzKCJ0ZXh0QWxpZ24iKT09PSJjZW50ZXIiKXthTj1hQSsoYUItYXkubWVhc3VyZVRleHQoYUopLndpZHRoKS8yLWFufWF5LmZpbGxUZXh0KGFKLGFOLGFPKTthTys9YUt9YUo9YUguc2xpY2UoYUdbYUQtMV0sYUgubGVuZ3RoKS5qb2luKCIgIik7aWYoSChheikuY3NzKCJ0ZXh0QWxpZ24iKT09PSJjZW50ZXIiKXthTj1hQSsoYUItYXkubWVhc3VyZVRleHQoYUopLndpZHRoKS8yLWFufWF5LmZpbGxUZXh0KGFKLGFOLGFPKX19ZnVuY3Rpb24gYXAoYUEsYUQsYXkpe3ZhciBhSD1hQS50YWdOYW1lLnRvTG93ZXJDYXNlKCk7dmFyIGF6PUgoYUEpLnBvc2l0aW9uKCk7dmFyIGFFPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlP3dpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGFBKTphQS5jdXJyZW50U3R5bGU7dmFyIGFDPWFEK2F6LmxlZnQrcGFyc2VJbnQoYUUubWFyZ2luTGVmdCwxMCkrcGFyc2VJbnQoYUUuYm9yZGVyTGVmdFdpZHRoLDEwKStwYXJzZUludChhRS5wYWRkaW5nTGVmdCwxMCk7dmFyIGFGPWF5K2F6LnRvcCtwYXJzZUludChhRS5tYXJnaW5Ub3AsMTApK3BhcnNlSW50KGFFLmJvcmRlclRvcFdpZHRoLDEwKStwYXJzZUludChhRS5wYWRkaW5nVG9wLDEwKTt2YXIgYUc9YWgud2lkdGg7aWYoKGFIPT0iZGl2Inx8YUg9PSJzcGFuIikmJiFIKGFBKS5oYXNDbGFzcygianFwbG90LWhpZ2hsaWdodGVyLXRvb2x0aXAiKSl7SChhQSkuY2hpbGRyZW4oKS5lYWNoKGZ1bmN0aW9uKCl7YXAodGhpcyxhQyxhRil9KTt2YXIgYUk9SChhQSkuanFwbG90Q2hpbGRUZXh0KCk7aWYoYUkpe2FlLmZvbnQ9SChhQSkuanFwbG90R2V0Q29tcHV0ZWRGb250U3R5bGUoKTthZS5maWxsU3R5bGU9SChhQSkuY3NzKCJjb2xvciIpO2F4KGFBLGFlLGFJLGFDLGFGLGFHKX19ZWxzZXtpZihhSD09PSJ0YWJsZSImJkgoYUEpLmhhc0NsYXNzKCJqcXBsb3QtdGFibGUtbGVnZW5kIikpe2FlLnN0cm9rZVN0eWxlPUgoYUEpLmNzcygiYm9yZGVyLXRvcC1jb2xvciIpO2FlLmZpbGxTdHlsZT1IKGFBKS5jc3MoImJhY2tncm91bmQtY29sb3IiKTthZS5maWxsUmVjdChhQyxhRixIKGFBKS5pbm5lcldpZHRoKCksSChhQSkuaW5uZXJIZWlnaHQoKSk7aWYocGFyc2VJbnQoSChhQSkuY3NzKCJib3JkZXItdG9wLXdpZHRoIiksMTApPjApe2FlLnN0cm9rZVJlY3QoYUMsYUYsSChhQSkuaW5uZXJXaWR0aCgpLEgoYUEpLmlubmVySGVpZ2h0KCkpfUgoYUEpLmZpbmQoImRpdi5qcXBsb3QtdGFibGUtbGVnZW5kLXN3YXRjaC1vdXRsaW5lIikuZWFjaChmdW5jdGlvbigpe3ZhciBhTz1IKHRoaXMpO2FlLnN0cm9rZVN0eWxlPWFPLmNzcygiYm9yZGVyLXRvcC1jb2xvciIpO3ZhciBhSz1hQythTy5wb3NpdGlvbigpLmxlZnQ7dmFyIGFMPWFGK2FPLnBvc2l0aW9uKCkudG9wO2FlLnN0cm9rZVJlY3QoYUssYUwsYU8uaW5uZXJXaWR0aCgpLGFPLmlubmVySGVpZ2h0KCkpO2FLKz1wYXJzZUludChhTy5jc3MoInBhZGRpbmctbGVmdCIpLDEwKTthTCs9cGFyc2VJbnQoYU8uY3NzKCJwYWRkaW5nLXRvcCIpLDEwKTt2YXIgYU49YU8uaW5uZXJIZWlnaHQoKS0yKnBhcnNlSW50KGFPLmNzcygicGFkZGluZy10b3AiKSwxMCk7dmFyIGFKPWFPLmlubmVyV2lkdGgoKS0yKnBhcnNlSW50KGFPLmNzcygicGFkZGluZy1sZWZ0IiksMTApO3ZhciBhTT1hTy5jaGlsZHJlbigiZGl2LmpxcGxvdC10YWJsZS1sZWdlbmQtc3dhdGNoIik7YWUuZmlsbFN0eWxlPWFNLmNzcygiYmFja2dyb3VuZC1jb2xvciIpO2FlLmZpbGxSZWN0KGFLLGFMLGFKLGFOKX0pO0goYUEpLmZpbmQoInRkLmpxcGxvdC10YWJsZS1sZWdlbmQtbGFiZWwiKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIGFMPUgodGhpcyk7dmFyIGFKPWFDK2FMLnBvc2l0aW9uKCkubGVmdDt2YXIgYUs9YUYrYUwucG9zaXRpb24oKS50b3ArcGFyc2VJbnQoYUwuY3NzKCJwYWRkaW5nLXRvcCIpLDEwKTthZS5mb250PWFMLmpxcGxvdEdldENvbXB1dGVkRm9udFN0eWxlKCk7YWUuZmlsbFN0eWxlPWFMLmNzcygiY29sb3IiKTthZS5maWxsVGV4dChhTC50ZXh0KCksYUosYUspfSk7dmFyIGFCPW51bGx9ZWxzZXtpZihhSD09ImNhbnZhcyIpe2FlLmRyYXdJbWFnZShhQSxhQyxhRil9fX19SCh0aGlzKS5jaGlsZHJlbigpLmVhY2goZnVuY3Rpb24oKXthcCh0aGlzLGFvLGFxKX0pO3JldHVybiBhaH07SC5mbi5qcXBsb3RUb0ltYWdlU3RyPWZ1bmN0aW9uKGFjKXt2YXIgYWI9SCh0aGlzKS5qcXBsb3RUb0ltYWdlQ2FudmFzKGFjKTtpZihhYil7cmV0dXJuIGFiLnRvRGF0YVVSTCgiaW1hZ2UvcG5nIil9ZWxzZXtyZXR1cm4gbnVsbH19O0guZm4uanFwbG90VG9JbWFnZUVsZW09ZnVuY3Rpb24oYWIpe3ZhciBhYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKTt2YXIgYWQ9SCh0aGlzKS5qcXBsb3RUb0ltYWdlU3RyKGFiKTthYy5zcmM9YWQ7cmV0dXJuIGFjfTtILmZuLmpxcGxvdFRvSW1hZ2VFbGVtU3RyPWZ1bmN0aW9uKGFiKXt2YXIgYWM9IjxpbWcgc3JjPSIrSCh0aGlzKS5qcXBsb3RUb0ltYWdlU3RyKGFiKSsiIC8+IjtyZXR1cm4gYWN9O0guZm4uanFwbG90U2F2ZUltYWdlPWZ1bmN0aW9uKCl7dmFyIGFiPUgodGhpcykuanFwbG90VG9JbWFnZVN0cih7fSk7aWYoYWIpe3dpbmRvdy5sb2NhdGlvbi5ocmVmPWFiLnJlcGxhY2UoImltYWdlL3BuZyIsImltYWdlL29jdGV0LXN0cmVhbSIpfX07SC5mbi5qcXBsb3RWaWV3SW1hZ2U9ZnVuY3Rpb24oKXt2YXIgYWM9SCh0aGlzKS5qcXBsb3RUb0ltYWdlRWxlbVN0cih7fSk7dmFyIGFkPUgodGhpcykuanFwbG90VG9JbWFnZVN0cih7fSk7aWYoYWMpe3ZhciBhYj13aW5kb3cub3BlbigiIik7YWIuZG9jdW1lbnQub3BlbigiaW1hZ2UvcG5nIik7YWIuZG9jdW1lbnQud3JpdGUoYWMpO2FiLmRvY3VtZW50LmNsb3NlKCk7YWI9bnVsbH19O3ZhciBhYT1mdW5jdGlvbigpe3RoaXMuc3ludGF4PWFhLmNvbmZpZy5zeW50YXg7dGhpcy5fdHlwZT0ianNEYXRlIjt0aGlzLnByb3h5PW5ldyBEYXRlKCk7dGhpcy5vcHRpb25zPXt9O3RoaXMubG9jYWxlPWFhLnJlZ2lvbmFsLmdldExvY2FsZSgpO3RoaXMuZm9ybWF0U3RyaW5nPSIiO3RoaXMuZGVmYXVsdENlbnR1cnk9YWEuY29uZmlnLmRlZmF1bHRDZW50dXJ5O3N3aXRjaChhcmd1bWVudHMubGVuZ3RoKXtjYXNlIDA6YnJlYWs7Y2FzZSAxOmlmKGooYXJndW1lbnRzWzBdKT09IltvYmplY3QgT2JqZWN0XSImJmFyZ3VtZW50c1swXS5fdHlwZSE9ImpzRGF0ZSIpe3ZhciBhZD10aGlzLm9wdGlvbnM9YXJndW1lbnRzWzBdO3RoaXMuc3ludGF4PWFkLnN5bnRheHx8dGhpcy5zeW50YXg7dGhpcy5kZWZhdWx0Q2VudHVyeT1hZC5kZWZhdWx0Q2VudHVyeXx8dGhpcy5kZWZhdWx0Q2VudHVyeTt0aGlzLnByb3h5PWFhLmNyZWF0ZURhdGUoYWQuZGF0ZSl9ZWxzZXt0aGlzLnByb3h5PWFhLmNyZWF0ZURhdGUoYXJndW1lbnRzWzBdKX1icmVhaztkZWZhdWx0OnZhciBhYj1bXTtmb3IodmFyIGFjPTA7YWM8YXJndW1lbnRzLmxlbmd0aDthYysrKXthYi5wdXNoKGFyZ3VtZW50c1thY10pfXRoaXMucHJveHk9bmV3IERhdGUoKTt0aGlzLnByb3h5LnNldEZ1bGxZZWFyLmFwcGx5KHRoaXMucHJveHksYWIuc2xpY2UoMCwzKSk7aWYoYWIuc2xpY2UoMykubGVuZ3RoKXt0aGlzLnByb3h5LnNldEhvdXJzLmFwcGx5KHRoaXMucHJveHksYWIuc2xpY2UoMykpfWJyZWFrfX07YWEuY29uZmlnPXtkZWZhdWx0TG9jYWxlOiJlbiIsc3ludGF4OiJwZXJsIixkZWZhdWx0Q2VudHVyeToxOTAwfTthYS5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKGFkLGFjKXt2YXIgYWI9QVthY118fEEuZGF5O2lmKHR5cGVvZiBhYj09Im51bWJlciIpe3RoaXMucHJveHkuc2V0VGltZSh0aGlzLnByb3h5LmdldFRpbWUoKSsoYWIqYWQpKX1lbHNle2FiLmFkZCh0aGlzLGFkKX1yZXR1cm4gdGhpc307YWEucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBhYSh0aGlzLnByb3h5LmdldFRpbWUoKSl9O2FhLnByb3RvdHlwZS5nZXRVdGNPZmZzZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wcm94eS5nZXRUaW1lem9uZU9mZnNldCgpKjYwMDAwfTthYS5wcm90b3R5cGUuZGlmZj1mdW5jdGlvbihhYyxhZixhYil7YWM9bmV3IGFhKGFjKTtpZihhYz09PW51bGwpe3JldHVybiBudWxsfXZhciBhZD1BW2FmXXx8QS5kYXk7aWYodHlwZW9mIGFkPT0ibnVtYmVyIil7dmFyIGFlPSh0aGlzLnByb3h5LmdldFRpbWUoKS1hYy5wcm94eS5nZXRUaW1lKCkpL2FkfWVsc2V7dmFyIGFlPWFkLmRpZmYodGhpcy5wcm94eSxhYy5wcm94eSl9cmV0dXJuKGFiP2FlOk1hdGhbYWU+MD8iZmxvb3IiOiJjZWlsIl0oYWUpKX07YWEucHJvdG90eXBlLmdldEFiYnJEYXlOYW1lPWZ1bmN0aW9uKCl7cmV0dXJuIGFhLnJlZ2lvbmFsW3RoaXMubG9jYWxlXVsiZGF5TmFtZXNTaG9ydCJdW3RoaXMucHJveHkuZ2V0RGF5KCldfTthYS5wcm90b3R5cGUuZ2V0QWJick1vbnRoTmFtZT1mdW5jdGlvbigpe3JldHVybiBhYS5yZWdpb25hbFt0aGlzLmxvY2FsZV1bIm1vbnRoTmFtZXNTaG9ydCJdW3RoaXMucHJveHkuZ2V0TW9udGgoKV19O2FhLnByb3RvdHlwZS5nZXRBTVBNPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHJveHkuZ2V0SG91cnMoKT49MTI/IlBNIjoiQU0ifTthYS5wcm90b3R5cGUuZ2V0QW1QbT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnByb3h5LmdldEhvdXJzKCk+PTEyPyJwbSI6ImFtIn07YWEucHJvdG90eXBlLmdldENlbnR1cnk9ZnVuY3Rpb24oKXtyZXR1cm4gcGFyc2VJbnQodGhpcy5wcm94eS5nZXRGdWxsWWVhcigpLzEwMCwxMCl9O2FhLnByb3RvdHlwZS5nZXREYXRlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHJveHkuZ2V0RGF0ZSgpfTthYS5wcm90b3R5cGUuZ2V0RGF5PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHJveHkuZ2V0RGF5KCl9O2FhLnByb3RvdHlwZS5nZXREYXlPZldlZWs9ZnVuY3Rpb24oKXt2YXIgYWI9dGhpcy5wcm94eS5nZXREYXkoKTtyZXR1cm4gYWI9PT0wPzc6YWJ9O2FhLnByb3RvdHlwZS5nZXREYXlPZlllYXI9ZnVuY3Rpb24oKXt2YXIgYWM9dGhpcy5wcm94eTt2YXIgYWI9YWMtbmV3IERhdGUoIiIrYWMuZ2V0RnVsbFllYXIoKSsiLzEvMSBHTVQiKTthYis9YWMuZ2V0VGltZXpvbmVPZmZzZXQoKSo2MDAwMDthYz1udWxsO3JldHVybiBwYXJzZUludChhYi82MDAwMC82MC8yNCwxMCkrMX07YWEucHJvdG90eXBlLmdldERheU5hbWU9ZnVuY3Rpb24oKXtyZXR1cm4gYWEucmVnaW9uYWxbdGhpcy5sb2NhbGVdWyJkYXlOYW1lcyJdW3RoaXMucHJveHkuZ2V0RGF5KCldfTthYS5wcm90b3R5cGUuZ2V0RnVsbFdlZWtPZlllYXI9ZnVuY3Rpb24oKXt2YXIgYWU9dGhpcy5wcm94eTt2YXIgYWI9dGhpcy5nZXREYXlPZlllYXIoKTt2YXIgYWQ9Ni1hZS5nZXREYXkoKTt2YXIgYWM9cGFyc2VJbnQoKGFiK2FkKS83LDEwKTtyZXR1cm4gYWN9O2FhLnByb3RvdHlwZS5nZXRGdWxsWWVhcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLnByb3h5LmdldEZ1bGxZZWFyKCl9O2FhLnByb3RvdHlwZS5nZXRHbXRPZmZzZXQ9ZnVuY3Rpb24oKXt2YXIgYWI9dGhpcy5wcm94eS5nZXRUaW1lem9uZU9mZnNldCgpLzYwO3ZhciBhYz1hYjwwPyIrIjoiLSI7YWI9TWF0aC5hYnMoYWIpO3JldHVybiBhYytKKE1hdGguZmxvb3IoYWIpLDIpKyI6IitKKChhYiUxKSo2MCwyKX07YWEucHJvdG90eXBlLmdldEhvdXJzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHJveHkuZ2V0SG91cnMoKX07YWEucHJvdG90eXBlLmdldEhvdXJzMTI9ZnVuY3Rpb24oKXt2YXIgYWI9dGhpcy5wcm94eS5nZXRIb3VycygpO3JldHVybiBhYj4xMj9hYi0xMjooYWI9PTA/MTI6YWIpfTthYS5wcm90b3R5cGUuZ2V0SXNvV2Vlaz1mdW5jdGlvbigpe3ZhciBhZT10aGlzLnByb3h5O3ZhciBhZD1hZS5nZXRXZWVrT2ZZZWFyKCk7dmFyIGFiPShuZXcgRGF0ZSgiIithZS5nZXRGdWxsWWVhcigpKyIvMS8xIikpLmdldERheSgpO3ZhciBhYz1hZCsoYWI+NHx8YWI8PTE/MDoxKTtpZihhYz09NTMmJihuZXcgRGF0ZSgiIithZS5nZXRGdWxsWWVhcigpKyIvMTIvMzEiKSkuZ2V0RGF5KCk8NCl7YWM9MX1lbHNle2lmKGFjPT09MCl7YWU9bmV3IGFhKG5ldyBEYXRlKCIiKyhhZS5nZXRGdWxsWWVhcigpLTEpKyIvMTIvMzEiKSk7YWM9YWUuZ2V0SXNvV2VlaygpfX1hZT1udWxsO3JldHVybiBhY307YWEucHJvdG90eXBlLmdldE1pbGxpc2Vjb25kcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnByb3h5LmdldE1pbGxpc2Vjb25kcygpfTthYS5wcm90b3R5cGUuZ2V0TWludXRlcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnByb3h5LmdldE1pbnV0ZXMoKX07YWEucHJvdG90eXBlLmdldE1vbnRoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHJveHkuZ2V0TW9udGgoKX07YWEucHJvdG90eXBlLmdldE1vbnRoTmFtZT1mdW5jdGlvbigpe3JldHVybiBhYS5yZWdpb25hbFt0aGlzLmxvY2FsZV1bIm1vbnRoTmFtZXMiXVt0aGlzLnByb3h5LmdldE1vbnRoKCldfTthYS5wcm90b3R5cGUuZ2V0TW9udGhOdW1iZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wcm94eS5nZXRNb250aCgpKzF9O2FhLnByb3RvdHlwZS5nZXRTZWNvbmRzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHJveHkuZ2V0U2Vjb25kcygpfTthYS5wcm90b3R5cGUuZ2V0U2hvcnRZZWFyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHJveHkuZ2V0WWVhcigpJTEwMH07YWEucHJvdG90eXBlLmdldFRpbWU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wcm94eS5nZXRUaW1lKCl9O2FhLnByb3RvdHlwZS5nZXRUaW1lem9uZUFiYnI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wcm94eS50b1N0cmluZygpLnJlcGxhY2UoL14uKlwoKFteKV0rKVwpJC8sIiQxIil9O2FhLnByb3RvdHlwZS5nZXRUaW1lem9uZU5hbWU9ZnVuY3Rpb24oKXt2YXIgYWI9Lyg/OlwoKC4rKVwpJHwgKFtBLVpdezN9KSApLy5leGVjKHRoaXMudG9TdHJpbmcoKSk7cmV0dXJuIGFiWzFdfHxhYlsyXXx8IkdNVCIrdGhpcy5nZXRHbXRPZmZzZXQoKX07YWEucHJvdG90eXBlLmdldFRpbWV6b25lT2Zmc2V0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHJveHkuZ2V0VGltZXpvbmVPZmZzZXQoKX07YWEucHJvdG90eXBlLmdldFdlZWtPZlllYXI9ZnVuY3Rpb24oKXt2YXIgYWI9dGhpcy5nZXREYXlPZlllYXIoKTt2YXIgYWQ9Ny10aGlzLmdldERheU9mV2VlaygpO3ZhciBhYz1wYXJzZUludCgoYWIrYWQpLzcsMTApO3JldHVybiBhY307YWEucHJvdG90eXBlLmdldFVuaXg9ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZCh0aGlzLnByb3h5LmdldFRpbWUoKS8xMDAwLDApfTthYS5wcm90b3R5cGUuZ2V0WWVhcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLnByb3h5LmdldFllYXIoKX07YWEucHJvdG90eXBlLm5leHQ9ZnVuY3Rpb24oYWIpe2FiPWFifHwiZGF5IjtyZXR1cm4gdGhpcy5jbG9uZSgpLmFkZCgxLGFiKX07YWEucHJvdG90eXBlLnNldD1mdW5jdGlvbigpe3N3aXRjaChhcmd1bWVudHMubGVuZ3RoKXtjYXNlIDA6dGhpcy5wcm94eT1uZXcgRGF0ZSgpO2JyZWFrO2Nhc2UgMTppZihqKGFyZ3VtZW50c1swXSk9PSJbb2JqZWN0IE9iamVjdF0iJiZhcmd1bWVudHNbMF0uX3R5cGUhPSJqc0RhdGUiKXt2YXIgYWQ9dGhpcy5vcHRpb25zPWFyZ3VtZW50c1swXTt0aGlzLnN5bnRheD1hZC5zeW50YXh8fHRoaXMuc3ludGF4O3RoaXMuZGVmYXVsdENlbnR1cnk9YWQuZGVmYXVsdENlbnR1cnl8fHRoaXMuZGVmYXVsdENlbnR1cnk7dGhpcy5wcm94eT1hYS5jcmVhdGVEYXRlKGFkLmRhdGUpfWVsc2V7dGhpcy5wcm94eT1hYS5jcmVhdGVEYXRlKGFyZ3VtZW50c1swXSl9YnJlYWs7ZGVmYXVsdDp2YXIgYWI9W107Zm9yKHZhciBhYz0wO2FjPGFyZ3VtZW50cy5sZW5ndGg7YWMrKyl7YWIucHVzaChhcmd1bWVudHNbYWNdKX10aGlzLnByb3h5PW5ldyBEYXRlKCk7dGhpcy5wcm94eS5zZXRGdWxsWWVhci5hcHBseSh0aGlzLnByb3h5LGFiLnNsaWNlKDAsMykpO2lmKGFiLnNsaWNlKDMpLmxlbmd0aCl7dGhpcy5wcm94eS5zZXRIb3Vycy5hcHBseSh0aGlzLnByb3h5LGFiLnNsaWNlKDMpKX1icmVha31yZXR1cm4gdGhpc307YWEucHJvdG90eXBlLnNldERhdGU9ZnVuY3Rpb24oYWIpe3RoaXMucHJveHkuc2V0RGF0ZShhYik7cmV0dXJuIHRoaXN9O2FhLnByb3RvdHlwZS5zZXRGdWxsWWVhcj1mdW5jdGlvbigpe3RoaXMucHJveHkuc2V0RnVsbFllYXIuYXBwbHkodGhpcy5wcm94eSxhcmd1bWVudHMpO3JldHVybiB0aGlzfTthYS5wcm90b3R5cGUuc2V0SG91cnM9ZnVuY3Rpb24oKXt0aGlzLnByb3h5LnNldEhvdXJzLmFwcGx5KHRoaXMucHJveHksYXJndW1lbnRzKTtyZXR1cm4gdGhpc307YWEucHJvdG90eXBlLnNldE1pbGxpc2Vjb25kcz1mdW5jdGlvbihhYil7dGhpcy5wcm94eS5zZXRNaWxsaXNlY29uZHMoYWIpO3JldHVybiB0aGlzfTthYS5wcm90b3R5cGUuc2V0TWludXRlcz1mdW5jdGlvbigpe3RoaXMucHJveHkuc2V0TWludXRlcy5hcHBseSh0aGlzLnByb3h5LGFyZ3VtZW50cyk7cmV0dXJuIHRoaXN9O2FhLnByb3RvdHlwZS5zZXRNb250aD1mdW5jdGlvbigpe3RoaXMucHJveHkuc2V0TW9udGguYXBwbHkodGhpcy5wcm94eSxhcmd1bWVudHMpO3JldHVybiB0aGlzfTthYS5wcm90b3R5cGUuc2V0U2Vjb25kcz1mdW5jdGlvbigpe3RoaXMucHJveHkuc2V0U2Vjb25kcy5hcHBseSh0aGlzLnByb3h5LGFyZ3VtZW50cyk7cmV0dXJuIHRoaXN9O2FhLnByb3RvdHlwZS5zZXRUaW1lPWZ1bmN0aW9uKGFiKXt0aGlzLnByb3h5LnNldFRpbWUoYWIpO3JldHVybiB0aGlzfTthYS5wcm90b3R5cGUuc2V0WWVhcj1mdW5jdGlvbigpe3RoaXMucHJveHkuc2V0WWVhci5hcHBseSh0aGlzLnByb3h5LGFyZ3VtZW50cyk7cmV0dXJuIHRoaXN9O2FhLnByb3RvdHlwZS5zdHJmdGltZT1mdW5jdGlvbihhYil7YWI9YWJ8fHRoaXMuZm9ybWF0U3RyaW5nfHxhYS5yZWdpb25hbFt0aGlzLmxvY2FsZV1bImZvcm1hdFN0cmluZyJdO3JldHVybiBhYS5zdHJmdGltZSh0aGlzLGFiLHRoaXMuc3ludGF4KX07YWEucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHJveHkudG9TdHJpbmcoKX07YWEucHJvdG90eXBlLnRvWW1kSW50PWZ1bmN0aW9uKCl7cmV0dXJuKHRoaXMucHJveHkuZ2V0RnVsbFllYXIoKSoxMDAwMCkrKHRoaXMuZ2V0TW9udGhOdW1iZXIoKSoxMDApK3RoaXMucHJveHkuZ2V0RGF0ZSgpfTthYS5yZWdpb25hbD17ZW46e21vbnRoTmFtZXM6WyJKYW51YXJ5IiwiRmVicnVhcnkiLCJNYXJjaCIsIkFwcmlsIiwiTWF5IiwiSnVuZSIsIkp1bHkiLCJBdWd1c3QiLCJTZXB0ZW1iZXIiLCJPY3RvYmVyIiwiTm92ZW1iZXIiLCJEZWNlbWJlciJdLG1vbnRoTmFtZXNTaG9ydDpbIkphbiIsIkZlYiIsIk1hciIsIkFwciIsIk1heSIsIkp1biIsIkp1bCIsIkF1ZyIsIlNlcCIsIk9jdCIsIk5vdiIsIkRlYyJdLGRheU5hbWVzOlsiU3VuZGF5IiwiTW9uZGF5IiwiVHVlc2RheSIsIldlZG5lc2RheSIsIlRodXJzZGF5IiwiRnJpZGF5IiwiU2F0dXJkYXkiXSxkYXlOYW1lc1Nob3J0OlsiU3VuIiwiTW9uIiwiVHVlIiwiV2VkIiwiVGh1IiwiRnJpIiwiU2F0Il0sZm9ybWF0U3RyaW5nOiIlWS0lbS0lZCAlSDolTTolUyJ9LGZyOnttb250aE5hbWVzOlsiSmFudmllciIsIkbDqXZyaWVyIiwiTWFycyIsIkF2cmlsIiwiTWFpIiwiSnVpbiIsIkp1aWxsZXQiLCJBb8O7dCIsIlNlcHRlbWJyZSIsIk9jdG9icmUiLCJOb3ZlbWJyZSIsIkTDqWNlbWJyZSJdLG1vbnRoTmFtZXNTaG9ydDpbIkphbiIsIkbDqXYiLCJNYXIiLCJBdnIiLCJNYWkiLCJKdW4iLCJKdWwiLCJBb8O7IiwiU2VwIiwiT2N0IiwiTm92IiwiRMOpYyJdLGRheU5hbWVzOlsiRGltYW5jaGUiLCJMdW5kaSIsIk1hcmRpIiwiTWVyY3JlZGkiLCJKZXVkaSIsIlZlbmRyZWRpIiwiU2FtZWRpIl0sZGF5TmFtZXNTaG9ydDpbIkRpbSIsIkx1biIsIk1hciIsIk1lciIsIkpldSIsIlZlbiIsIlNhbSJdLGZvcm1hdFN0cmluZzoiJVktJW0tJWQgJUg6JU06JVMifSxkZTp7bW9udGhOYW1lczpbIkphbnVhciIsIkZlYnJ1YXIiLCJNw6RyeiIsIkFwcmlsIiwiTWFpIiwiSnVuaSIsIkp1bGkiLCJBdWd1c3QiLCJTZXB0ZW1iZXIiLCJPa3RvYmVyIiwiTm92ZW1iZXIiLCJEZXplbWJlciJdLG1vbnRoTmFtZXNTaG9ydDpbIkphbiIsIkZlYiIsIk3DpHIiLCJBcHIiLCJNYWkiLCJKdW4iLCJKdWwiLCJBdWciLCJTZXAiLCJPa3QiLCJOb3YiLCJEZXoiXSxkYXlOYW1lczpbIlNvbm50YWciLCJNb250YWciLCJEaWVuc3RhZyIsIk1pdHR3b2NoIiwiRG9ubmVyc3RhZyIsIkZyZWl0YWciLCJTYW1zdGFnIl0sZGF5TmFtZXNTaG9ydDpbIlNvIiwiTW8iLCJEaSIsIk1pIiwiRG8iLCJGciIsIlNhIl0sZm9ybWF0U3RyaW5nOiIlWS0lbS0lZCAlSDolTTolUyJ9LGVzOnttb250aE5hbWVzOlsiRW5lcm8iLCJGZWJyZXJvIiwiTWFyem8iLCJBYnJpbCIsIk1heW8iLCJKdW5pbyIsIkp1bGlvIiwiQWdvc3RvIiwiU2VwdGllbWJyZSIsIk9jdHVicmUiLCJOb3ZpZW1icmUiLCJEaWNpZW1icmUiXSxtb250aE5hbWVzU2hvcnQ6WyJFbmUiLCJGZWIiLCJNYXIiLCJBYnIiLCJNYXkiLCJKdW4iLCJKdWwiLCJBZ28iLCJTZXAiLCJPY3QiLCJOb3YiLCJEaWMiXSxkYXlOYW1lczpbIkRvbWluZ28iLCJMdW5lcyIsIk1hcnRlcyIsIk1pJmVhY3V0ZTtyY29sZXMiLCJKdWV2ZXMiLCJWaWVybmVzIiwiUyZhYWN1dGU7YmFkbyJdLGRheU5hbWVzU2hvcnQ6WyJEb20iLCJMdW4iLCJNYXIiLCJNaSZlYWN1dGU7IiwiSnV2IiwiVmllIiwiUyZhYWN1dGU7YiJdLGZvcm1hdFN0cmluZzoiJVktJW0tJWQgJUg6JU06JVMifSxydTp7bW9udGhOYW1lczpbItCv0L3QstCw0YDRjCIsItCk0LXQstGA0LDQu9GMIiwi0JzQsNGA0YIiLCLQkNC/0YDQtdC70YwiLCLQnNCw0LkiLCLQmNGO0L3RjCIsItCY0Y7Qu9GMIiwi0JDQstCz0YPRgdGCIiwi0KHQtdC90YLRj9Cx0YDRjCIsItCe0LrRgtGP0LHRgNGMIiwi0J3QvtGP0LHRgNGMIiwi0JTQtdC60LDQsdGA0YwiXSxtb250aE5hbWVzU2hvcnQ6WyLQr9C90LIiLCLQpNC10LIiLCLQnNCw0YAiLCLQkNC/0YAiLCLQnNCw0LkiLCLQmNGO0L0iLCLQmNGO0LsiLCLQkNCy0LMiLCLQodC10L0iLCLQntC60YIiLCLQndC+0Y8iLCLQlNC10LoiXSxkYXlOYW1lczpbItCy0L7RgdC60YDQtdGB0LXQvdGM0LUiLCLQv9C+0L3QtdC00LXQu9GM0L3QuNC6Iiwi0LLRgtC+0YDQvdC40LoiLCLRgdGA0LXQtNCwIiwi0YfQtdGC0LLQtdGA0LMiLCLQv9GP0YLQvdC40YbQsCIsItGB0YPQsdCx0L7RgtCwIl0sZGF5TmFtZXNTaG9ydDpbItCy0YHQuiIsItC/0L3QtCIsItCy0YLRgCIsItGB0YDQtCIsItGH0YLQsiIsItC/0YLQvSIsItGB0LHRgiJdLGZvcm1hdFN0cmluZzoiJVktJW0tJWQgJUg6JU06JVMifSxhcjp7bW9udGhOYW1lczpbItmD2KfZhtmI2YYg2KfZhNir2KfZhtmKIiwi2LTYqNin2LciLCLYotiw2KfYsSIsItmG2YrYs9in2YYiLCLYotiw2KfYsSIsItit2LLZitix2KfZhiIsItiq2YXZiNiyIiwi2KLYqCIsItij2YrZhNmI2YQiLCLYqti02LHZitmGINin2YTYo9mI2YQiLCLYqti02LHZitmGINin2YTYq9in2YbZiiIsItmD2KfZhtmI2YYg2KfZhNij2YjZhCJdLG1vbnRoTmFtZXNTaG9ydDpbIjEiLCIyIiwiMyIsIjQiLCI1IiwiNiIsIjciLCI4IiwiOSIsIjEwIiwiMTEiLCIxMiJdLGRheU5hbWVzOlsi2KfZhNiz2KjYqiIsItin2YTYo9it2K8iLCLYp9mE2KfYq9mG2YrZhiIsItin2YTYq9mE2KfYq9in2KEiLCLYp9mE2KPYsdio2LnYp9ihIiwi2KfZhNiu2YXZitizIiwi2KfZhNis2YXYudipIl0sZGF5TmFtZXNTaG9ydDpbItiz2KjYqiIsItij2K3YryIsItin2KvZhtmK2YYiLCLYq9mE2KfYq9in2KEiLCLYo9ix2KjYudin2KEiLCLYrtmF2YrYsyIsItis2YXYudipIl0sZm9ybWF0U3RyaW5nOiIlWS0lbS0lZCAlSDolTTolUyJ9LHB0Onttb250aE5hbWVzOlsiSmFuZWlybyIsIkZldmVyZWlybyIsIk1hciZjY2VkaWw7byIsIkFicmlsIiwiTWFpbyIsIkp1bmhvIiwiSnVsaG8iLCJBZ29zdG8iLCJTZXRlbWJybyIsIk91dHVicm8iLCJOb3ZlbWJybyIsIkRlemVtYnJvIl0sbW9udGhOYW1lc1Nob3J0OlsiSmFuIiwiRmV2IiwiTWFyIiwiQWJyIiwiTWFpIiwiSnVuIiwiSnVsIiwiQWdvIiwiU2V0IiwiT3V0IiwiTm92IiwiRGV6Il0sZGF5TmFtZXM6WyJEb21pbmdvIiwiU2VndW5kYS1mZWlyYSIsIlRlciZjY2VkaWw7YS1mZWlyYSIsIlF1YXJ0YS1mZWlyYSIsIlF1aW50YS1mZWlyYSIsIlNleHRhLWZlaXJhIiwiUyZhYWN1dGU7YmFkbyJdLGRheU5hbWVzU2hvcnQ6WyJEb20iLCJTZWciLCJUZXIiLCJRdWEiLCJRdWkiLCJTZXgiLCJTJmFhY3V0ZTtiIl0sZm9ybWF0U3RyaW5nOiIlWS0lbS0lZCAlSDolTTolUyJ9LCJwdC1CUiI6e21vbnRoTmFtZXM6WyJKYW5laXJvIiwiRmV2ZXJlaXJvIiwiTWFyJmNjZWRpbDtvIiwiQWJyaWwiLCJNYWlvIiwiSnVuaG8iLCJKdWxobyIsIkFnb3N0byIsIlNldGVtYnJvIiwiT3V0dWJybyIsIk5vdmVtYnJvIiwiRGV6ZW1icm8iXSxtb250aE5hbWVzU2hvcnQ6WyJKYW4iLCJGZXYiLCJNYXIiLCJBYnIiLCJNYWkiLCJKdW4iLCJKdWwiLCJBZ28iLCJTZXQiLCJPdXQiLCJOb3YiLCJEZXoiXSxkYXlOYW1lczpbIkRvbWluZ28iLCJTZWd1bmRhLWZlaXJhIiwiVGVyJmNjZWRpbDthLWZlaXJhIiwiUXVhcnRhLWZlaXJhIiwiUXVpbnRhLWZlaXJhIiwiU2V4dGEtZmVpcmEiLCJTJmFhY3V0ZTtiYWRvIl0sZGF5TmFtZXNTaG9ydDpbIkRvbSIsIlNlZyIsIlRlciIsIlF1YSIsIlF1aSIsIlNleCIsIlMmYWFjdXRlO2IiXSxmb3JtYXRTdHJpbmc6IiVZLSVtLSVkICVIOiVNOiVTIn19O2FhLnJlZ2lvbmFsWyJlbi1VUyJdPWFhLnJlZ2lvbmFsWyJlbi1HQiJdPWFhLnJlZ2lvbmFsLmVuO2FhLnJlZ2lvbmFsLmdldExvY2FsZT1mdW5jdGlvbigpe3ZhciBhYj1hYS5jb25maWcuZGVmYXVsdExvY2FsZTtpZihkb2N1bWVudCYmZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImh0bWwiKSYmZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImh0bWwiKVswXS5sYW5nKXthYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaHRtbCIpWzBdLmxhbmc7aWYoIWFhLnJlZ2lvbmFsLmhhc093blByb3BlcnR5KGFiKSl7YWI9YWEuY29uZmlnLmRlZmF1bHRMb2NhbGV9fXJldHVybiBhYn07dmFyIHk9MjQqNjAqNjAqMTAwMDt2YXIgSj1mdW5jdGlvbihhYixhZSl7YWI9U3RyaW5nKGFiKTt2YXIgYWM9YWUtYWIubGVuZ3RoO3ZhciBhZD1TdHJpbmcoTWF0aC5wb3coMTAsYWMpKS5zbGljZSgxKTtyZXR1cm4gYWQuY29uY2F0KGFiKX07dmFyIEE9e21pbGxpc2Vjb25kOjEsc2Vjb25kOjEwMDAsbWludXRlOjYwKjEwMDAsaG91cjo2MCo2MCoxMDAwLGRheTp5LHdlZWs6Nyp5LG1vbnRoOnthZGQ6ZnVuY3Rpb24oYWQsYWIpe0EueWVhci5hZGQoYWQsTWF0aFthYj4wPyJmbG9vciI6ImNlaWwiXShhYi8xMikpO3ZhciBhYz1hZC5nZXRNb250aCgpKyhhYiUxMik7aWYoYWM9PTEyKXthYz0wO2FkLnNldFllYXIoYWQuZ2V0RnVsbFllYXIoKSsxKX1lbHNle2lmKGFjPT0tMSl7YWM9MTE7YWQuc2V0WWVhcihhZC5nZXRGdWxsWWVhcigpLTEpfX1hZC5zZXRNb250aChhYyl9LGRpZmY6ZnVuY3Rpb24oYWYsYWQpe3ZhciBhYj1hZi5nZXRGdWxsWWVhcigpLWFkLmdldEZ1bGxZZWFyKCk7dmFyIGFjPWFmLmdldE1vbnRoKCktYWQuZ2V0TW9udGgoKSsoYWIqMTIpO3ZhciBhZT1hZi5nZXREYXRlKCktYWQuZ2V0RGF0ZSgpO3JldHVybiBhYysoYWUvMzApfX0seWVhcjp7YWRkOmZ1bmN0aW9uKGFjLGFiKXthYy5zZXRZZWFyKGFjLmdldEZ1bGxZZWFyKCkrTWF0aFthYj4wPyJmbG9vciI6ImNlaWwiXShhYikpfSxkaWZmOmZ1bmN0aW9uKGFjLGFiKXtyZXR1cm4gQS5tb250aC5kaWZmKGFjLGFiKS8xMn19fTtmb3IodmFyIFQgaW4gQSl7aWYoVC5zdWJzdHJpbmcoVC5sZW5ndGgtMSkhPSJzIil7QVtUKyJzIl09QVtUXX19dmFyIEQ9ZnVuY3Rpb24oYWYsYWUsYWMpe2lmKGFhLmZvcm1hdHNbYWNdWyJzaG9ydGN1dHMiXVthZV0pe3JldHVybiBhYS5zdHJmdGltZShhZixhYS5mb3JtYXRzW2FjXVsic2hvcnRjdXRzIl1bYWVdLGFjKX1lbHNle3ZhciBhYj0oYWEuZm9ybWF0c1thY11bImNvZGVzIl1bYWVdfHwiIikuc3BsaXQoIi4iKTt2YXIgYWQ9YWZbImdldCIrYWJbMF1dP2FmWyJnZXQiK2FiWzBdXSgpOiIiO2lmKGFiWzFdKXthZD1KKGFkLGFiWzFdKX1yZXR1cm4gYWR9fTthYS5zdHJmdGltZT1mdW5jdGlvbihhaCxhZSxhZCxhaSl7dmFyIGFjPSJwZXJsIjt2YXIgYWc9YWEucmVnaW9uYWwuZ2V0TG9jYWxlKCk7aWYoYWQmJmFhLmZvcm1hdHMuaGFzT3duUHJvcGVydHkoYWQpKXthYz1hZH1lbHNle2lmKGFkJiZhYS5yZWdpb25hbC5oYXNPd25Qcm9wZXJ0eShhZCkpe2FnPWFkfX1pZihhaSYmYWEuZm9ybWF0cy5oYXNPd25Qcm9wZXJ0eShhaSkpe2FjPWFpfWVsc2V7aWYoYWkmJmFhLnJlZ2lvbmFsLmhhc093blByb3BlcnR5KGFpKSl7YWc9YWl9fWlmKGooYWgpIT0iW29iamVjdCBPYmplY3RdInx8YWguX3R5cGUhPSJqc0RhdGUiKXthaD1uZXcgYWEoYWgpO2FoLmxvY2FsZT1hZ31pZighYWUpe2FlPWFoLmZvcm1hdFN0cmluZ3x8YWEucmVnaW9uYWxbYWddWyJmb3JtYXRTdHJpbmciXX12YXIgYWI9YWV8fCIlWS0lbS0lZCIsYWo9IiIsYWY7d2hpbGUoYWIubGVuZ3RoPjApe2lmKGFmPWFiLm1hdGNoKGFhLmZvcm1hdHNbYWNdLmNvZGVzLm1hdGNoZXIpKXthais9YWIuc2xpY2UoMCxhZi5pbmRleCk7YWorPShhZlsxXXx8IiIpK0QoYWgsYWZbMl0sYWMpO2FiPWFiLnNsaWNlKGFmLmluZGV4K2FmWzBdLmxlbmd0aCl9ZWxzZXthais9YWI7YWI9IiJ9fXJldHVybiBhan07YWEuZm9ybWF0cz17SVNPOiIlWS0lbS0lZFQlSDolTTolUy4lTiVHIixTUUw6IiVZLSVtLSVkICVIOiVNOiVTIn07YWEuZm9ybWF0cy5wZXJsPXtjb2Rlczp7bWF0Y2hlcjovKCklKCM/KCV8W2Etel0pKS9pLFk6IkZ1bGxZZWFyIix5OiJTaG9ydFllYXIuMiIsbToiTW9udGhOdW1iZXIuMiIsIiNtIjoiTW9udGhOdW1iZXIiLEI6Ik1vbnRoTmFtZSIsYjoiQWJick1vbnRoTmFtZSIsZDoiRGF0ZS4yIiwiI2QiOiJEYXRlIixlOiJEYXRlIixBOiJEYXlOYW1lIixhOiJBYmJyRGF5TmFtZSIsdzoiRGF5IixIOiJIb3Vycy4yIiwiI0giOiJIb3VycyIsSToiSG91cnMxMi4yIiwiI0kiOiJIb3VyczEyIixwOiJBTVBNIixNOiJNaW51dGVzLjIiLCIjTSI6Ik1pbnV0ZXMiLFM6IlNlY29uZHMuMiIsIiNTIjoiU2Vjb25kcyIsczoiVW5peCIsTjoiTWlsbGlzZWNvbmRzLjMiLCIjTiI6Ik1pbGxpc2Vjb25kcyIsTzoiVGltZXpvbmVPZmZzZXQiLFo6IlRpbWV6b25lTmFtZSIsRzoiR210T2Zmc2V0In0sc2hvcnRjdXRzOntGOiIlWS0lbS0lZCIsVDoiJUg6JU06JVMiLFg6IiVIOiVNOiVTIix4OiIlbS8lZC8leSIsRDoiJW0vJWQvJXkiLCIjYyI6IiVhICViICVlICVIOiVNOiVTICVZIix2OiIlZS0lYi0lWSIsUjoiJUg6JU0iLHI6IiVJOiVNOiVTICVwIix0OiJcdCIsbjoiXG4iLCIlIjoiJSJ9fTthYS5mb3JtYXRzLnBocD17Y29kZXM6e21hdGNoZXI6LygpJSgoJXxbYS16XSkpL2ksYToiQWJickRheU5hbWUiLEE6IkRheU5hbWUiLGQ6IkRhdGUuMiIsZToiRGF0ZSIsajoiRGF5T2ZZZWFyLjMiLHU6IkRheU9mV2VlayIsdzoiRGF5IixVOiJGdWxsV2Vla09mWWVhci4yIixWOiJJc29XZWVrLjIiLFc6IldlZWtPZlllYXIuMiIsYjoiQWJick1vbnRoTmFtZSIsQjoiTW9udGhOYW1lIixtOiJNb250aE51bWJlci4yIixoOiJBYmJyTW9udGhOYW1lIixDOiJDZW50dXJ5LjIiLHk6IlNob3J0WWVhci4yIixZOiJGdWxsWWVhciIsSDoiSG91cnMuMiIsSToiSG91cnMxMi4yIixsOiJIb3VyczEyIixwOiJBTVBNIixQOiJBbVBtIixNOiJNaW51dGVzLjIiLFM6IlNlY29uZHMuMiIsczoiVW5peCIsTzoiVGltZXpvbmVPZmZzZXQiLHo6IkdtdE9mZnNldCIsWjoiVGltZXpvbmVBYmJyIn0sc2hvcnRjdXRzOntEOiIlbS8lZC8leSIsRjoiJVktJW0tJWQiLFQ6IiVIOiVNOiVTIixYOiIlSDolTTolUyIseDoiJW0vJWQvJXkiLFI6IiVIOiVNIixyOiIlSTolTTolUyAlcCIsdDoiXHQiLG46IlxuIiwiJSI6IiUifX07YWEuY3JlYXRlRGF0ZT1mdW5jdGlvbihhZCl7aWYoYWQ9PW51bGwpe3JldHVybiBuZXcgRGF0ZSgpfWlmKGFkIGluc3RhbmNlb2YgRGF0ZSl7cmV0dXJuIGFkfWlmKHR5cGVvZiBhZD09Im51bWJlciIpe3JldHVybiBuZXcgRGF0ZShhZCl9dmFyIGFpPVN0cmluZyhhZCkucmVwbGFjZSgvXlxzKiguKylccyokL2csIiQxIik7YWk9YWkucmVwbGFjZSgvXihbMC05XXsxLDR9KS0oWzAtOV17MSwyfSktKFswLTldezEsNH0pLywiJDEvJDIvJDMiKTthaT1haS5yZXBsYWNlKC9eKDNbMDFdfFswLTJdP1xkKVstXC9dKFthLXpdezMsfSlbLVwvXShcZHs0fSkvaSwiJDEgJDIgJDMiKTt2YXIgYWg9YWkubWF0Y2goL14oM1swMV18WzAtMl0/XGQpWy1cL10oW2Etel17Myx9KVstXC9dKFxkezJ9KVxEKi9pKTtpZihhaCYmYWgubGVuZ3RoPjMpe3ZhciBhbT1wYXJzZUZsb2F0KGFoWzNdKTt2YXIgYWc9YWEuY29uZmlnLmRlZmF1bHRDZW50dXJ5K2FtO2FnPVN0cmluZyhhZyk7YWk9YWkucmVwbGFjZSgvXigzWzAxXXxbMC0yXT9cZClbLVwvXShbYS16XXszLH0pWy1cL10oXGR7Mn0pXEQqL2ksYWhbMV0rIiAiK2FoWzJdKyIgIithZyl9YWg9YWkubWF0Y2goL14oWzAtOV17MSwyfSlbLVwvXShbMC05XXsxLDJ9KVstXC9dKFswLTldezEsMn0pW14wLTldLyk7ZnVuY3Rpb24gYWwoYXEsYXApe3ZhciBhdz1wYXJzZUZsb2F0KGFwWzFdKTt2YXIgYXY9cGFyc2VGbG9hdChhcFsyXSk7dmFyIGF1PXBhcnNlRmxvYXQoYXBbM10pO3ZhciBhdD1hYS5jb25maWcuZGVmYXVsdENlbnR1cnk7dmFyIGFvLGFuLGF4LGFyO2lmKGF3PjMxKXthbj1hdTtheD1hdjthbz1hdCthd31lbHNle2FuPWF2O2F4PWF3O2FvPWF0K2F1fWFyPWF4KyIvIithbisiLyIrYW87cmV0dXJuIGFxLnJlcGxhY2UoL14oWzAtOV17MSwyfSlbLVwvXShbMC05XXsxLDJ9KVstXC9dKFswLTldezEsMn0pLyxhcil9aWYoYWgmJmFoLmxlbmd0aD4zKXthaT1hbChhaSxhaCl9dmFyIGFoPWFpLm1hdGNoKC9eKFswLTldezEsMn0pWy1cL10oWzAtOV17MSwyfSlbLVwvXShbMC05XXsxLDJ9KSQvKTtpZihhaCYmYWgubGVuZ3RoPjMpe2FpPWFsKGFpLGFoKX12YXIgYWY9MDt2YXIgYWM9YWEubWF0Y2hlcnMubGVuZ3RoO3ZhciBhayxhYixhaj1haSxhZTt3aGlsZShhZjxhYyl7YWI9RGF0ZS5wYXJzZShhaik7aWYoIWlzTmFOKGFiKSl7cmV0dXJuIG5ldyBEYXRlKGFiKX1haz1hYS5tYXRjaGVyc1thZl07aWYodHlwZW9mIGFrPT0iZnVuY3Rpb24iKXthZT1hay5jYWxsKGFhLGFqKTtpZihhZSBpbnN0YW5jZW9mIERhdGUpe3JldHVybiBhZX19ZWxzZXthaj1haS5yZXBsYWNlKGFrWzBdLGFrWzFdKX1hZisrfXJldHVybiBOYU59O2FhLmRheXNJbk1vbnRoPWZ1bmN0aW9uKGFiLGFjKXtpZihhYz09Mil7cmV0dXJuIG5ldyBEYXRlKGFiLDEsMjkpLmdldERhdGUoKT09Mjk/Mjk6Mjh9cmV0dXJuW3IsMzEsciwzMSwzMCwzMSwzMCwzMSwzMSwzMCwzMSwzMCwzMV1bYWNdfTthYS5tYXRjaGVycz1bWy8oM1swMV18WzAtMl1cZClccypcLlxzKigxWzAtMl18MFxkKVxzKlwuXHMqKFsxLTldXGR7M30pLywiJDIvJDEvJDMiXSxbLyhbMS05XVxkezN9KVxzKi1ccyooMVswLTJdfDBcZClccyotXHMqKDNbMDFdfFswLTJdXGQpLywiJDIvJDMvJDEiXSxmdW5jdGlvbihhZSl7dmFyIGFjPWFlLm1hdGNoKC9eKD86KC4rKVxzKyk/KFswMTJdP1xkKSg/OlxzKlw6XHMqKFxkXGQpKT8oPzpccypcOlxzKihcZFxkKFwuXGQqKT8pKT9ccyooYW18cG0pP1xzKiQvaSk7aWYoYWMpe2lmKGFjWzFdKXt2YXIgYWQ9dGhpcy5jcmVhdGVEYXRlKGFjWzFdKTtpZihpc05hTihhZCkpe3JldHVybn19ZWxzZXt2YXIgYWQ9bmV3IERhdGUoKTthZC5zZXRNaWxsaXNlY29uZHMoMCl9dmFyIGFiPXBhcnNlRmxvYXQoYWNbMl0pO2lmKGFjWzZdKXthYj1hY1s2XS50b0xvd2VyQ2FzZSgpPT0iYW0iPyhhYj09MTI/MDphYik6KGFiPT0xMj8xMjphYisxMil9YWQuc2V0SG91cnMoYWIscGFyc2VJbnQoYWNbM118fDAsMTApLHBhcnNlSW50KGFjWzRdfHwwLDEwKSwoKHBhcnNlRmxvYXQoYWNbNV18fDApKXx8MCkqMTAwMCk7cmV0dXJuIGFkfWVsc2V7cmV0dXJuIGFlfX0sZnVuY3Rpb24oYWUpe3ZhciBhYz1hZS5tYXRjaCgvXig/OiguKykpW1R8XHMrXShbMDEyXVxkKSg/Olw6KFxkXGQpKSg/Olw6KFxkXGQpKSg/OlwuXGQrKShbXCtcLV1cZFxkXDpcZFxkKSQvaSk7aWYoYWMpe2lmKGFjWzFdKXt2YXIgYWQ9dGhpcy5jcmVhdGVEYXRlKGFjWzFdKTtpZihpc05hTihhZCkpe3JldHVybn19ZWxzZXt2YXIgYWQ9bmV3IERhdGUoKTthZC5zZXRNaWxsaXNlY29uZHMoMCl9dmFyIGFiPXBhcnNlRmxvYXQoYWNbMl0pO2FkLnNldEhvdXJzKGFiLHBhcnNlSW50KGFjWzNdLDEwKSxwYXJzZUludChhY1s0XSwxMCkscGFyc2VGbG9hdChhY1s1XSkqMTAwMCk7cmV0dXJuIGFkfWVsc2V7cmV0dXJuIGFlfX0sZnVuY3Rpb24oYWYpe3ZhciBhZD1hZi5tYXRjaCgvXihbMC0zXT9cZClccypbLVwvLlxzXXsxfVxzKihbYS16QS1aXXszLDl9KVxzKlstXC8uXHNdezF9XHMqKFswLTNdP1xkKSQvKTtpZihhZCl7dmFyIGFlPW5ldyBEYXRlKCk7dmFyIGFnPWFhLmNvbmZpZy5kZWZhdWx0Q2VudHVyeTt2YXIgYWk9cGFyc2VGbG9hdChhZFsxXSk7dmFyIGFoPXBhcnNlRmxvYXQoYWRbM10pO3ZhciBhYyxhYixhajtpZihhaT4zMSl7YWI9YWg7YWM9YWcrYWl9ZWxzZXthYj1haTthYz1hZythaH12YXIgYWo9VyhhZFsyXSxhYS5yZWdpb25hbFthYS5yZWdpb25hbC5nZXRMb2NhbGUoKV1bIm1vbnRoTmFtZXNTaG9ydCJdKTtpZihhaj09LTEpe2FqPVcoYWRbMl0sYWEucmVnaW9uYWxbYWEucmVnaW9uYWwuZ2V0TG9jYWxlKCldWyJtb250aE5hbWVzIl0pfWFlLnNldEZ1bGxZZWFyKGFjLGFqLGFiKTthZS5zZXRIb3VycygwLDAsMCwwKTtyZXR1cm4gYWV9ZWxzZXtyZXR1cm4gYWZ9fV07ZnVuY3Rpb24gVyhhZCxhZSl7aWYoYWUuaW5kZXhPZil7cmV0dXJuIGFlLmluZGV4T2YoYWQpfWZvcih2YXIgYWI9MCxhYz1hZS5sZW5ndGg7YWI8YWM7YWIrKyl7aWYoYWVbYWJdPT09YWQpe3JldHVybiBhYn19cmV0dXJuIC0xfWZ1bmN0aW9uIGooYWIpe2lmKGFiPT09bnVsbCl7cmV0dXJuIltvYmplY3QgTnVsbF0ifXJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYWIpfUguanNEYXRlPWFhO0guanFwbG90LnNwcmludGY9ZnVuY3Rpb24oKXtmdW5jdGlvbiBhaChhbixhaixhayxhbSl7dmFyIGFsPShhbi5sZW5ndGg+PWFqKT8iIjpBcnJheSgxK2FqLWFuLmxlbmd0aD4+PjApLmpvaW4oYWspO3JldHVybiBhbT9hbithbDphbCthbn1mdW5jdGlvbiBhZShhbCl7dmFyIGFrPW5ldyBTdHJpbmcoYWwpO2Zvcih2YXIgYWo9MTA7YWo+MDthai0tKXtpZihhaz09KGFrPWFrLnJlcGxhY2UoL14oXGQrKShcZHszfSkvLCIkMSIrSC5qcXBsb3Quc3ByaW50Zi50aG91c2FuZHNTZXBhcmF0b3IrIiQyIikpKXticmVha319cmV0dXJuIGFrfWZ1bmN0aW9uIGFkKGFvLGFuLGFxLGFsLGFtLGFrKXt2YXIgYXA9YWwtYW8ubGVuZ3RoO2lmKGFwPjApe3ZhciBhaj0iICI7aWYoYWspe2FqPSImbmJzcDsifWlmKGFxfHwhYW0pe2FvPWFoKGFvLGFsLGFqLGFxKX1lbHNle2FvPWFvLnNsaWNlKDAsYW4ubGVuZ3RoKSthaCgiIixhcCwiMCIsdHJ1ZSkrYW8uc2xpY2UoYW4ubGVuZ3RoKX19cmV0dXJuIGFvfWZ1bmN0aW9uIGFpKGFyLGFrLGFwLGFsLGFqLGFvLGFxLGFuKXt2YXIgYW09YXI+Pj4wO2FwPWFwJiZhbSYmeyIyIjoiMGIiLCI4IjoiMCIsIjE2IjoiMHgifVtha118fCIiO2FyPWFwK2FoKGFtLnRvU3RyaW5nKGFrKSxhb3x8MCwiMCIsZmFsc2UpO3JldHVybiBhZChhcixhcCxhbCxhaixhcSxhbil9ZnVuY3Rpb24gYWIoYW4sYW8sYWwsYWosYW0sYWspe2lmKGFqIT1udWxsKXthbj1hbi5zbGljZSgwLGFqKX1yZXR1cm4gYWQoYW4sIiIsYW8sYWwsYW0sYWspfXZhciBhYz1hcmd1bWVudHMsYWY9MCxhZz1hY1thZisrXTtyZXR1cm4gYWcucmVwbGFjZShILmpxcGxvdC5zcHJpbnRmLnJlZ2V4LGZ1bmN0aW9uKGFGLGFxLGFyLGF2LGFILGFDLGFvKXtpZihhRj09IiUlIil7cmV0dXJuIiUifXZhciBhdz1mYWxzZSxhdD0iIixhdT1mYWxzZSxhRT1mYWxzZSxhcD1mYWxzZSxhbj1mYWxzZTtmb3IodmFyIGFCPTA7YXImJmFCPGFyLmxlbmd0aDthQisrKXtzd2l0Y2goYXIuY2hhckF0KGFCKSl7Y2FzZSIgIjphdD0iICI7YnJlYWs7Y2FzZSIrIjphdD0iKyI7YnJlYWs7Y2FzZSItIjphdz10cnVlO2JyZWFrO2Nhc2UiMCI6YXU9dHJ1ZTticmVhaztjYXNlIiMiOmFFPXRydWU7YnJlYWs7Y2FzZSImIjphcD10cnVlO2JyZWFrO2Nhc2UiJyI6YW49dHJ1ZTticmVha319aWYoIWF2KXthdj0wfWVsc2V7aWYoYXY9PSIqIil7YXY9K2FjW2FmKytdfWVsc2V7aWYoYXYuY2hhckF0KDApPT0iKiIpe2F2PSthY1thdi5zbGljZSgxLC0xKV19ZWxzZXthdj0rYXZ9fX1pZihhdjwwKXthdj0tYXY7YXc9dHJ1ZX1pZighaXNGaW5pdGUoYXYpKXt0aHJvdyBuZXcgRXJyb3IoIiQuanFwbG90LnNwcmludGY6IChtaW5pbXVtLSl3aWR0aCBtdXN0IGJlIGZpbml0ZSIpfWlmKCFhQyl7YUM9ImZGZUUiLmluZGV4T2YoYW8pPi0xPzY6KGFvPT0iZCIpPzA6dm9pZCAoMCl9ZWxzZXtpZihhQz09IioiKXthQz0rYWNbYWYrK119ZWxzZXtpZihhQy5jaGFyQXQoMCk9PSIqIil7YUM9K2FjW2FDLnNsaWNlKDEsLTEpXX1lbHNle2FDPSthQ319fXZhciBheT1hcT9hY1thcS5zbGljZSgwLC0xKV06YWNbYWYrK107c3dpdGNoKGFvKXtjYXNlInMiOmlmKGF5PT1udWxsKXtyZXR1cm4iIn1yZXR1cm4gYWIoU3RyaW5nKGF5KSxhdyxhdixhQyxhdSxhcCk7Y2FzZSJjIjpyZXR1cm4gYWIoU3RyaW5nLmZyb21DaGFyQ29kZSgrYXkpLGF3LGF2LGFDLGF1LGFwKTtjYXNlImIiOnJldHVybiBhaShheSwyLGFFLGF3LGF2LGFDLGF1LGFwKTtjYXNlIm8iOnJldHVybiBhaShheSw4LGFFLGF3LGF2LGFDLGF1LGFwKTtjYXNlIngiOnJldHVybiBhaShheSwxNixhRSxhdyxhdixhQyxhdSxhcCk7Y2FzZSJYIjpyZXR1cm4gYWkoYXksMTYsYUUsYXcsYXYsYUMsYXUsYXApLnRvVXBwZXJDYXNlKCk7Y2FzZSJ1IjpyZXR1cm4gYWkoYXksMTAsYUUsYXcsYXYsYUMsYXUsYXApO2Nhc2UiaSI6dmFyIGFsPXBhcnNlSW50KCtheSwxMCk7aWYoaXNOYU4oYWwpKXtyZXR1cm4iIn12YXIgYUE9YWw8MD8iLSI6YXQ7dmFyIGFEPWFuP2FlKFN0cmluZyhNYXRoLmFicyhhbCkpKTpTdHJpbmcoTWF0aC5hYnMoYWwpKTtheT1hQSthaChhRCxhQywiMCIsZmFsc2UpO3JldHVybiBhZChheSxhQSxhdyxhdixhdSxhcCk7Y2FzZSJkIjp2YXIgYWw9TWF0aC5yb3VuZCgrYXkpO2lmKGlzTmFOKGFsKSl7cmV0dXJuIiJ9dmFyIGFBPWFsPDA/Ii0iOmF0O3ZhciBhRD1hbj9hZShTdHJpbmcoTWF0aC5hYnMoYWwpKSk6U3RyaW5nKE1hdGguYWJzKGFsKSk7YXk9YUErYWgoYUQsYUMsIjAiLGZhbHNlKTtyZXR1cm4gYWQoYXksYUEsYXcsYXYsYXUsYXApO2Nhc2UiZSI6Y2FzZSJFIjpjYXNlImYiOmNhc2UiRiI6Y2FzZSJnIjpjYXNlIkciOnZhciBhbD0rYXk7aWYoaXNOYU4oYWwpKXtyZXR1cm4iIn12YXIgYUE9YWw8MD8iLSI6YXQ7dmFyIGFtPVsidG9FeHBvbmVudGlhbCIsInRvRml4ZWQiLCJ0b1ByZWNpc2lvbiJdWyJlZmciLmluZGV4T2YoYW8udG9Mb3dlckNhc2UoKSldO3ZhciBhRz1bInRvU3RyaW5nIiwidG9VcHBlckNhc2UiXVsiZUVmRmdHIi5pbmRleE9mKGFvKSUyXTt2YXIgYUQ9TWF0aC5hYnMoYWwpW2FtXShhQyk7YUQ9YW4/YWUoYUQpOmFEO2F5PWFBK2FEO3JldHVybiBhZChheSxhQSxhdyxhdixhdSxhcClbYUddKCk7Y2FzZSJwIjpjYXNlIlAiOnZhciBhbD0rYXk7aWYoaXNOYU4oYWwpKXtyZXR1cm4iIn12YXIgYUE9YWw8MD8iLSI6YXQ7dmFyIGF4PVN0cmluZyhOdW1iZXIoTWF0aC5hYnMoYWwpKS50b0V4cG9uZW50aWFsKCkpLnNwbGl0KC9lfEUvKTt2YXIgYWs9KGF4WzBdLmluZGV4T2YoIi4iKSE9LTEpP2F4WzBdLmxlbmd0aC0xOmF4WzBdLmxlbmd0aDt2YXIgYXo9KGF4WzFdPDApPy1heFsxXS0xOjA7aWYoTWF0aC5hYnMoYWwpPDEpe2lmKGFrK2F6PD1hQyl7YXk9YUErTWF0aC5hYnMoYWwpLnRvUHJlY2lzaW9uKGFrKX1lbHNle2lmKGFrPD1hQy0xKXtheT1hQStNYXRoLmFicyhhbCkudG9FeHBvbmVudGlhbChhay0xKX1lbHNle2F5PWFBK01hdGguYWJzKGFsKS50b0V4cG9uZW50aWFsKGFDLTEpfX19ZWxzZXt2YXIgYWo9KGFrPD1hQyk/YWs6YUM7YXk9YUErTWF0aC5hYnMoYWwpLnRvUHJlY2lzaW9uKGFqKX12YXIgYUc9WyJ0b1N0cmluZyIsInRvVXBwZXJDYXNlIl1bInBQIi5pbmRleE9mKGFvKSUyXTtyZXR1cm4gYWQoYXksYUEsYXcsYXYsYXUsYXApW2FHXSgpO2Nhc2UibiI6cmV0dXJuIiI7ZGVmYXVsdDpyZXR1cm4gYUZ9fSl9O0guanFwbG90LnNwcmludGYudGhvdXNhbmRzU2VwYXJhdG9yPSIsIjtILmpxcGxvdC5zcHJpbnRmLnJlZ2V4PS8lJXwlKFxkK1wkKT8oWy0rIzAmXCcgXSopKFwqXGQrXCR8XCp8XGQrKT8oXC4oXCpcZCtcJHxcKnxcZCspKT8oW25Bc2Nib3hYdWlkZmVncEVHUF0pL2c7SC5qcXBsb3QuZ2V0U2lnbmlmaWNhbnRGaWd1cmVzPWZ1bmN0aW9uKGFmKXt2YXIgYWg9U3RyaW5nKE51bWJlcihNYXRoLmFicyhhZikpLnRvRXhwb25lbnRpYWwoKSkuc3BsaXQoL2V8RS8pO3ZhciBhZz0oYWhbMF0uaW5kZXhPZigiLiIpIT0tMSk/YWhbMF0ubGVuZ3RoLTE6YWhbMF0ubGVuZ3RoO3ZhciBhYz0oYWhbMV08MCk/LWFoWzFdLTE6MDt2YXIgYWI9cGFyc2VJbnQoYWhbMV0sMTApO3ZhciBhZD0oYWIrMT4wKT9hYisxOjA7dmFyIGFlPShhZzw9YWQpPzA6YWctYWItMTtyZXR1cm57c2lnbmlmaWNhbnREaWdpdHM6YWcsZGlnaXRzTGVmdDphZCxkaWdpdHNSaWdodDphZSx6ZXJvczphYyxleHBvbmVudDphYn19O0guanFwbG90LmdldFByZWNpc2lvbj1mdW5jdGlvbihhYil7cmV0dXJuIEguanFwbG90LmdldFNpZ25pZmljYW50RmlndXJlcyhhYikuZGlnaXRzUmlnaHR9fSkoalF1ZXJ5KTt2YXIgYmFja0NvbXBhdD0kLnVpQmFja0NvbXBhdCE9PWZhbHNlOyQuanFwbG90LmVmZmVjdHM9e2VmZmVjdDp7fX07dmFyIGRhdGFTcGFjZT0ianFwbG90LnN0b3JhZ2UuIjskLmV4dGVuZCgkLmpxcGxvdC5lZmZlY3RzLHt2ZXJzaW9uOiIxLjlwcmUiLHNhdmU6ZnVuY3Rpb24oYixjKXtmb3IodmFyIGE9MDthPGMubGVuZ3RoO2ErKyl7aWYoY1thXSE9PW51bGwpe2IuZGF0YShkYXRhU3BhY2UrY1thXSxiWzBdLnN0eWxlW2NbYV1dKX19fSxyZXN0b3JlOmZ1bmN0aW9uKGIsYyl7Zm9yKHZhciBhPTA7YTxjLmxlbmd0aDthKyspe2lmKGNbYV0hPT1udWxsKXtiLmNzcyhjW2FdLGIuZGF0YShkYXRhU3BhY2UrY1thXSkpfX19LHNldE1vZGU6ZnVuY3Rpb24oYSxiKXtpZihiPT09InRvZ2dsZSIpe2I9YS5pcygiOmhpZGRlbiIpPyJzaG93IjoiaGlkZSJ9cmV0dXJuIGJ9LGNyZWF0ZVdyYXBwZXI6ZnVuY3Rpb24oYil7aWYoYi5wYXJlbnQoKS5pcygiLnVpLWVmZmVjdHMtd3JhcHBlciIpKXtyZXR1cm4gYi5wYXJlbnQoKX12YXIgYz17d2lkdGg6Yi5vdXRlcldpZHRoKHRydWUpLGhlaWdodDpiLm91dGVySGVpZ2h0KHRydWUpLCJmbG9hdCI6Yi5jc3MoImZsb2F0Iil9LGU9JCgiPGRpdj48L2Rpdj4iKS5hZGRDbGFzcygidWktZWZmZWN0cy13cmFwcGVyIikuY3NzKHtmb250U2l6ZToiMTAwJSIsYmFja2dyb3VuZDoidHJhbnNwYXJlbnQiLGJvcmRlcjoibm9uZSIsbWFyZ2luOjAscGFkZGluZzowfSksYT17d2lkdGg6Yi53aWR0aCgpLGhlaWdodDpiLmhlaWdodCgpfSxkPWRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7Yi53cmFwKGUpO2lmKGJbMF09PT1kfHwkLmNvbnRhaW5zKGJbMF0sZCkpeyQoZCkuZm9jdXMoKX1lPWIucGFyZW50KCk7aWYoYi5jc3MoInBvc2l0aW9uIik9PT0ic3RhdGljIil7ZS5jc3Moe3Bvc2l0aW9uOiJyZWxhdGl2ZSJ9KTtiLmNzcyh7cG9zaXRpb246InJlbGF0aXZlIn0pfWVsc2V7JC5leHRlbmQoYyx7cG9zaXRpb246Yi5jc3MoInBvc2l0aW9uIiksekluZGV4OmIuY3NzKCJ6LWluZGV4Iil9KTskLmVhY2goWyJ0b3AiLCJsZWZ0IiwiYm90dG9tIiwicmlnaHQiXSxmdW5jdGlvbihmLGcpe2NbZ109Yi5jc3MoZyk7aWYoaXNOYU4ocGFyc2VJbnQoY1tnXSwxMCkpKXtjW2ddPSJhdXRvIn19KTtiLmNzcyh7cG9zaXRpb246InJlbGF0aXZlIix0b3A6MCxsZWZ0OjAscmlnaHQ6ImF1dG8iLGJvdHRvbToiYXV0byJ9KX1iLmNzcyhhKTtyZXR1cm4gZS5jc3MoYykuc2hvdygpfSxyZW1vdmVXcmFwcGVyOmZ1bmN0aW9uKGEpe3ZhciBiPWRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7aWYoYS5wYXJlbnQoKS5pcygiLnVpLWVmZmVjdHMtd3JhcHBlciIpKXthLnBhcmVudCgpLnJlcGxhY2VXaXRoKGEpO2lmKGFbMF09PT1ifHwkLmNvbnRhaW5zKGFbMF0sYikpeyQoYikuZm9jdXMoKX19cmV0dXJuIGF9fSk7ZnVuY3Rpb24gX25vcm1hbGl6ZUFyZ3VtZW50cyhiLGEsYyxkKXtpZigkLmlzUGxhaW5PYmplY3QoYikpe3JldHVybiBifWI9e2VmZmVjdDpifTtpZihhPT09dW5kZWZpbmVkKXthPXt9fWlmKCQuaXNGdW5jdGlvbihhKSl7ZD1hO2M9bnVsbDthPXt9fWlmKCQudHlwZShhKT09PSJudW1iZXIifHwkLmZ4LnNwZWVkc1thXSl7ZD1jO2M9YTthPXt9fWlmKCQuaXNGdW5jdGlvbihjKSl7ZD1jO2M9bnVsbH1pZihhKXskLmV4dGVuZChiLGEpfWM9Y3x8YS5kdXJhdGlvbjtiLmR1cmF0aW9uPSQuZngub2ZmPzA6dHlwZW9mIGM9PT0ibnVtYmVyIj9jOmMgaW4gJC5meC5zcGVlZHM/JC5meC5zcGVlZHNbY106JC5meC5zcGVlZHMuX2RlZmF1bHQ7Yi5jb21wbGV0ZT1kfHxhLmNvbXBsZXRlO3JldHVybiBifWZ1bmN0aW9uIHN0YW5kYXJkU3BlZWQoYSl7aWYoIWF8fHR5cGVvZiBhPT09Im51bWJlciJ8fCQuZnguc3BlZWRzW2FdKXtyZXR1cm4gdHJ1ZX1pZih0eXBlb2YgYT09PSJzdHJpbmciJiYhJC5qcXBsb3QuZWZmZWN0cy5lZmZlY3RbYV0pe2lmKGJhY2tDb21wYXQmJiQuanFwbG90LmVmZmVjdHNbYV0pe3JldHVybiBmYWxzZX1yZXR1cm4gdHJ1ZX1yZXR1cm4gZmFsc2V9JC5mbi5leHRlbmQoe2pxcGxvdEVmZmVjdDpmdW5jdGlvbihpLGosYixoKXt2YXIgZz1fbm9ybWFsaXplQXJndW1lbnRzLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxkPWcubW9kZSxlPWcucXVldWUsZj0kLmpxcGxvdC5lZmZlY3RzLmVmZmVjdFtnLmVmZmVjdF0sYT0hZiYmYmFja0NvbXBhdCYmJC5qcXBsb3QuZWZmZWN0c1tnLmVmZmVjdF07aWYoJC5meC5vZmZ8fCEoZnx8YSkpe2lmKGQpe3JldHVybiB0aGlzW2RdKGcuZHVyYXRpb24sZy5jb21wbGV0ZSl9ZWxzZXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7aWYoZy5jb21wbGV0ZSl7Zy5jb21wbGV0ZS5jYWxsKHRoaXMpfX0pfX1mdW5jdGlvbiBjKG0pe3ZhciBuPSQodGhpcyksbD1nLmNvbXBsZXRlLG89Zy5tb2RlO2Z1bmN0aW9uIGsoKXtpZigkLmlzRnVuY3Rpb24obCkpe2wuY2FsbChuWzBdKX1pZigkLmlzRnVuY3Rpb24obSkpe20oKX19aWYobi5pcygiOmhpZGRlbiIpP289PT0iaGlkZSI6bz09PSJzaG93Iil7aygpfWVsc2V7Zi5jYWxsKG5bMF0sZyxrKX19aWYoZil7cmV0dXJuIGU9PT1mYWxzZT90aGlzLmVhY2goYyk6dGhpcy5xdWV1ZShlfHwiZngiLGMpfWVsc2V7cmV0dXJuIGEuY2FsbCh0aGlzLHtvcHRpb25zOmcsZHVyYXRpb246Zy5kdXJhdGlvbixjYWxsYmFjazpnLmNvbXBsZXRlLG1vZGU6Zy5tb2RlfSl9fX0pO3ZhciBydmVydGljYWw9L3VwfGRvd258dmVydGljYWwvLHJwb3NpdGl2ZW1vdGlvbj0vdXB8bGVmdHx2ZXJ0aWNhbHxob3Jpem9udGFsLzskLmpxcGxvdC5lZmZlY3RzLmVmZmVjdC5ibGluZD1mdW5jdGlvbihjLGgpe3ZhciBkPSQodGhpcyksaz1bInBvc2l0aW9uIiwidG9wIiwiYm90dG9tIiwibGVmdCIsInJpZ2h0IiwiaGVpZ2h0Iiwid2lkdGgiXSxpPSQuanFwbG90LmVmZmVjdHMuc2V0TW9kZShkLGMubW9kZXx8ImhpZGUiKSxtPWMuZGlyZWN0aW9ufHwidXAiLGY9cnZlcnRpY2FsLnRlc3QobSksZT1mPyJoZWlnaHQiOiJ3aWR0aCIsaj1mPyJ0b3AiOiJsZWZ0IixwPXJwb3NpdGl2ZW1vdGlvbi50ZXN0KG0pLGc9e30sbj1pPT09InNob3ciLGIsYSxsO2lmKGQucGFyZW50KCkuaXMoIi51aS1lZmZlY3RzLXdyYXBwZXIiKSl7JC5qcXBsb3QuZWZmZWN0cy5zYXZlKGQucGFyZW50KCksayl9ZWxzZXskLmpxcGxvdC5lZmZlY3RzLnNhdmUoZCxrKX1kLnNob3coKTtsPXBhcnNlSW50KGQuY3NzKCJ0b3AiKSwxMCk7Yj0kLmpxcGxvdC5lZmZlY3RzLmNyZWF0ZVdyYXBwZXIoZCkuY3NzKHtvdmVyZmxvdzoiaGlkZGVuIn0pO2E9Zj9iW2VdKCkrbDpiW2VdKCk7Z1tlXT1uP1N0cmluZyhhKToiMCI7aWYoIXApe2QuY3NzKGY/ImJvdHRvbSI6InJpZ2h0IiwwKS5jc3MoZj8idG9wIjoibGVmdCIsIiIpLmNzcyh7cG9zaXRpb246ImFic29sdXRlIn0pO2dbal09bj8iMCI6U3RyaW5nKGEpfWlmKG4pe2IuY3NzKGUsMCk7aWYoIXApe2IuY3NzKGosYSl9fWIuYW5pbWF0ZShnLHtkdXJhdGlvbjpjLmR1cmF0aW9uLGVhc2luZzpjLmVhc2luZyxxdWV1ZTpmYWxzZSxjb21wbGV0ZTpmdW5jdGlvbigpe2lmKGk9PT0iaGlkZSIpe2QuaGlkZSgpfSQuanFwbG90LmVmZmVjdHMucmVzdG9yZShkLGspOyQuanFwbG90LmVmZmVjdHMucmVtb3ZlV3JhcHBlcihkKTtoKCl9fSl9Ow==]]></data>
	</file>
	<file>
	  <filename>/src/jquery.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyohCiAqIGpRdWVyeSBKYXZhU2NyaXB0IExpYnJhcnkgdjEuNi40CiAqIGh0dHA6Ly9qcXVlcnkuY29tLwogKgogKiBDb3B5cmlnaHQgMjAxMSwgSm9obiBSZXNpZwogKiBEdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgb3IgR1BMIFZlcnNpb24gMiBsaWNlbnNlcy4KICogaHR0cDovL2pxdWVyeS5vcmcvbGljZW5zZQogKgogKiBJbmNsdWRlcyBTaXp6bGUuanMKICogaHR0cDovL3NpenpsZWpzLmNvbS8KICogQ29weXJpZ2h0IDIwMTEsIFRoZSBEb2pvIEZvdW5kYXRpb24KICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCwgQlNELCBhbmQgR1BMIExpY2Vuc2VzLgogKgogKiBEYXRlOiBNb24gU2VwIDEyIDE4OjU0OjQ4IDIwMTEgLTA0MDAKICovCihmdW5jdGlvbiggd2luZG93LCB1bmRlZmluZWQgKSB7CgovLyBVc2UgdGhlIGNvcnJlY3QgZG9jdW1lbnQgYWNjb3JkaW5nbHkgd2l0aCB3aW5kb3cgYXJndW1lbnQgKHNhbmRib3gpCnZhciBkb2N1bWVudCA9IHdpbmRvdy5kb2N1bWVudCwKCW5hdmlnYXRvciA9IHdpbmRvdy5uYXZpZ2F0b3IsCglsb2NhdGlvbiA9IHdpbmRvdy5sb2NhdGlvbjsKdmFyIGpRdWVyeSA9IChmdW5jdGlvbigpIHsKCi8vIERlZmluZSBhIGxvY2FsIGNvcHkgb2YgalF1ZXJ5CnZhciBqUXVlcnkgPSBmdW5jdGlvbiggc2VsZWN0b3IsIGNvbnRleHQgKSB7CgkJLy8gVGhlIGpRdWVyeSBvYmplY3QgaXMgYWN0dWFsbHkganVzdCB0aGUgaW5pdCBjb25zdHJ1Y3RvciAnZW5oYW5jZWQnCgkJcmV0dXJuIG5ldyBqUXVlcnkuZm4uaW5pdCggc2VsZWN0b3IsIGNvbnRleHQsIHJvb3RqUXVlcnkgKTsKCX0sCgoJLy8gTWFwIG92ZXIgalF1ZXJ5IGluIGNhc2Ugb2Ygb3ZlcndyaXRlCglfalF1ZXJ5ID0gd2luZG93LmpRdWVyeSwKCgkvLyBNYXAgb3ZlciB0aGUgJCBpbiBjYXNlIG9mIG92ZXJ3cml0ZQoJXyQgPSB3aW5kb3cuJCwKCgkvLyBBIGNlbnRyYWwgcmVmZXJlbmNlIHRvIHRoZSByb290IGpRdWVyeShkb2N1bWVudCkKCXJvb3RqUXVlcnksCgoJLy8gQSBzaW1wbGUgd2F5IHRvIGNoZWNrIGZvciBIVE1MIHN0cmluZ3Mgb3IgSUQgc3RyaW5ncwoJLy8gUHJpb3JpdGl6ZSAjaWQgb3ZlciA8dGFnPiB0byBhdm9pZCBYU1MgdmlhIGxvY2F0aW9uLmhhc2ggKCM5NTIxKQoJcXVpY2tFeHByID0gL14oPzpbXiM8XSooPFtcd1xXXSs+KVtePl0qJHwjKFtcd1wtXSopJCkvLAoKCS8vIENoZWNrIGlmIGEgc3RyaW5nIGhhcyBhIG5vbi13aGl0ZXNwYWNlIGNoYXJhY3RlciBpbiBpdAoJcm5vdHdoaXRlID0gL1xTLywKCgkvLyBVc2VkIGZvciB0cmltbWluZyB3aGl0ZXNwYWNlCgl0cmltTGVmdCA9IC9eXHMrLywKCXRyaW1SaWdodCA9IC9ccyskLywKCgkvLyBDaGVjayBmb3IgZGlnaXRzCglyZGlnaXQgPSAvXGQvLAoKCS8vIE1hdGNoIGEgc3RhbmRhbG9uZSB0YWcKCXJzaW5nbGVUYWcgPSAvXjwoXHcrKVxzKlwvPz4oPzo8XC9cMT4pPyQvLAoKCS8vIEpTT04gUmVnRXhwCglydmFsaWRjaGFycyA9IC9eW1xdLDp7fVxzXSokLywKCXJ2YWxpZGVzY2FwZSA9IC9cXCg/OlsiXFxcL2JmbnJ0XXx1WzAtOWEtZkEtRl17NH0pL2csCglydmFsaWR0b2tlbnMgPSAvIlteIlxcXG5ccl0qInx0cnVlfGZhbHNlfG51bGx8LT9cZCsoPzpcLlxkKik/KD86W2VFXVsrXC1dP1xkKyk/L2csCglydmFsaWRicmFjZXMgPSAvKD86Xnw6fCwpKD86XHMqXFspKy9nLAoKCS8vIFVzZXJhZ2VudCBSZWdFeHAKCXJ3ZWJraXQgPSAvKHdlYmtpdClbIFwvXShbXHcuXSspLywKCXJvcGVyYSA9IC8ob3BlcmEpKD86Lip2ZXJzaW9uKT9bIFwvXShbXHcuXSspLywKCXJtc2llID0gLyhtc2llKSAoW1x3Ll0rKS8sCglybW96aWxsYSA9IC8obW96aWxsYSkoPzouKj8gcnY6KFtcdy5dKykpPy8sCgoJLy8gTWF0Y2hlcyBkYXNoZWQgc3RyaW5nIGZvciBjYW1lbGl6aW5nCglyZGFzaEFscGhhID0gLy0oW2Etel18WzAtOV0pL2lnLAoJcm1zUHJlZml4ID0gL14tbXMtLywKCgkvLyBVc2VkIGJ5IGpRdWVyeS5jYW1lbENhc2UgYXMgY2FsbGJhY2sgdG8gcmVwbGFjZSgpCglmY2FtZWxDYXNlID0gZnVuY3Rpb24oIGFsbCwgbGV0dGVyICkgewoJCXJldHVybiAoIGxldHRlciArICIiICkudG9VcHBlckNhc2UoKTsKCX0sCgoJLy8gS2VlcCBhIFVzZXJBZ2VudCBzdHJpbmcgZm9yIHVzZSB3aXRoIGpRdWVyeS5icm93c2VyCgl1c2VyQWdlbnQgPSBuYXZpZ2F0b3IudXNlckFnZW50LAoKCS8vIEZvciBtYXRjaGluZyB0aGUgZW5naW5lIGFuZCB2ZXJzaW9uIG9mIHRoZSBicm93c2VyCglicm93c2VyTWF0Y2gsCgoJLy8gVGhlIGRlZmVycmVkIHVzZWQgb24gRE9NIHJlYWR5CglyZWFkeUxpc3QsCgoJLy8gVGhlIHJlYWR5IGV2ZW50IGhhbmRsZXIKCURPTUNvbnRlbnRMb2FkZWQsCgoJLy8gU2F2ZSBhIHJlZmVyZW5jZSB0byBzb21lIGNvcmUgbWV0aG9kcwoJdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLAoJaGFzT3duID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSwKCXB1c2ggPSBBcnJheS5wcm90b3R5cGUucHVzaCwKCXNsaWNlID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLAoJdHJpbSA9IFN0cmluZy5wcm90b3R5cGUudHJpbSwKCWluZGV4T2YgPSBBcnJheS5wcm90b3R5cGUuaW5kZXhPZiwKCgkvLyBbW0NsYXNzXV0gLT4gdHlwZSBwYWlycwoJY2xhc3MydHlwZSA9IHt9OwoKalF1ZXJ5LmZuID0galF1ZXJ5LnByb3RvdHlwZSA9IHsKCWNvbnN0cnVjdG9yOiBqUXVlcnksCglpbml0OiBmdW5jdGlvbiggc2VsZWN0b3IsIGNvbnRleHQsIHJvb3RqUXVlcnkgKSB7CgkJdmFyIG1hdGNoLCBlbGVtLCByZXQsIGRvYzsKCgkJLy8gSGFuZGxlICQoIiIpLCAkKG51bGwpLCBvciAkKHVuZGVmaW5lZCkKCQlpZiAoICFzZWxlY3RvciApIHsKCQkJcmV0dXJuIHRoaXM7CgkJfQoKCQkvLyBIYW5kbGUgJChET01FbGVtZW50KQoJCWlmICggc2VsZWN0b3Iubm9kZVR5cGUgKSB7CgkJCXRoaXMuY29udGV4dCA9IHRoaXNbMF0gPSBzZWxlY3RvcjsKCQkJdGhpcy5sZW5ndGggPSAxOwoJCQlyZXR1cm4gdGhpczsKCQl9CgoJCS8vIFRoZSBib2R5IGVsZW1lbnQgb25seSBleGlzdHMgb25jZSwgb3B0aW1pemUgZmluZGluZyBpdAoJCWlmICggc2VsZWN0b3IgPT09ICJib2R5IiAmJiAhY29udGV4dCAmJiBkb2N1bWVudC5ib2R5ICkgewoJCQl0aGlzLmNvbnRleHQgPSBkb2N1bWVudDsKCQkJdGhpc1swXSA9IGRvY3VtZW50LmJvZHk7CgkJCXRoaXMuc2VsZWN0b3IgPSBzZWxlY3RvcjsKCQkJdGhpcy5sZW5ndGggPSAxOwoJCQlyZXR1cm4gdGhpczsKCQl9CgoJCS8vIEhhbmRsZSBIVE1MIHN0cmluZ3MKCQlpZiAoIHR5cGVvZiBzZWxlY3RvciA9PT0gInN0cmluZyIgKSB7CgkJCS8vIEFyZSB3ZSBkZWFsaW5nIHdpdGggSFRNTCBzdHJpbmcgb3IgYW4gSUQ/CgkJCWlmICggc2VsZWN0b3IuY2hhckF0KDApID09PSAiPCIgJiYgc2VsZWN0b3IuY2hhckF0KCBzZWxlY3Rvci5sZW5ndGggLSAxICkgPT09ICI+IiAmJiBzZWxlY3Rvci5sZW5ndGggPj0gMyApIHsKCQkJCS8vIEFzc3VtZSB0aGF0IHN0cmluZ3MgdGhhdCBzdGFydCBhbmQgZW5kIHdpdGggPD4gYXJlIEhUTUwgYW5kIHNraXAgdGhlIHJlZ2V4IGNoZWNrCgkJCQltYXRjaCA9IFsgbnVsbCwgc2VsZWN0b3IsIG51bGwgXTsKCgkJCX0gZWxzZSB7CgkJCQltYXRjaCA9IHF1aWNrRXhwci5leGVjKCBzZWxlY3RvciApOwoJCQl9CgoJCQkvLyBWZXJpZnkgYSBtYXRjaCwgYW5kIHRoYXQgbm8gY29udGV4dCB3YXMgc3BlY2lmaWVkIGZvciAjaWQKCQkJaWYgKCBtYXRjaCAmJiAobWF0Y2hbMV0gfHwgIWNvbnRleHQpICkgewoKCQkJCS8vIEhBTkRMRTogJChodG1sKSAtPiAkKGFycmF5KQoJCQkJaWYgKCBtYXRjaFsxXSApIHsKCQkJCQljb250ZXh0ID0gY29udGV4dCBpbnN0YW5jZW9mIGpRdWVyeSA/IGNvbnRleHRbMF0gOiBjb250ZXh0OwoJCQkJCWRvYyA9IChjb250ZXh0ID8gY29udGV4dC5vd25lckRvY3VtZW50IHx8IGNvbnRleHQgOiBkb2N1bWVudCk7CgoJCQkJCS8vIElmIGEgc2luZ2xlIHN0cmluZyBpcyBwYXNzZWQgaW4gYW5kIGl0J3MgYSBzaW5nbGUgdGFnCgkJCQkJLy8ganVzdCBkbyBhIGNyZWF0ZUVsZW1lbnQgYW5kIHNraXAgdGhlIHJlc3QKCQkJCQlyZXQgPSByc2luZ2xlVGFnLmV4ZWMoIHNlbGVjdG9yICk7CgoJCQkJCWlmICggcmV0ICkgewoJCQkJCQlpZiAoIGpRdWVyeS5pc1BsYWluT2JqZWN0KCBjb250ZXh0ICkgKSB7CgkJCQkJCQlzZWxlY3RvciA9IFsgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggcmV0WzFdICkgXTsKCQkJCQkJCWpRdWVyeS5mbi5hdHRyLmNhbGwoIHNlbGVjdG9yLCBjb250ZXh0LCB0cnVlICk7CgoJCQkJCQl9IGVsc2UgewoJCQkJCQkJc2VsZWN0b3IgPSBbIGRvYy5jcmVhdGVFbGVtZW50KCByZXRbMV0gKSBdOwoJCQkJCQl9CgoJCQkJCX0gZWxzZSB7CgkJCQkJCXJldCA9IGpRdWVyeS5idWlsZEZyYWdtZW50KCBbIG1hdGNoWzFdIF0sIFsgZG9jIF0gKTsKCQkJCQkJc2VsZWN0b3IgPSAocmV0LmNhY2hlYWJsZSA/IGpRdWVyeS5jbG9uZShyZXQuZnJhZ21lbnQpIDogcmV0LmZyYWdtZW50KS5jaGlsZE5vZGVzOwoJCQkJCX0KCgkJCQkJcmV0dXJuIGpRdWVyeS5tZXJnZSggdGhpcywgc2VsZWN0b3IgKTsKCgkJCQkvLyBIQU5ETEU6ICQoIiNpZCIpCgkJCQl9IGVsc2UgewoJCQkJCWVsZW0gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCggbWF0Y2hbMl0gKTsKCgkJCQkJLy8gQ2hlY2sgcGFyZW50Tm9kZSB0byBjYXRjaCB3aGVuIEJsYWNrYmVycnkgNC42IHJldHVybnMKCQkJCQkvLyBub2RlcyB0aGF0IGFyZSBubyBsb25nZXIgaW4gdGhlIGRvY3VtZW50ICM2OTYzCgkJCQkJaWYgKCBlbGVtICYmIGVsZW0ucGFyZW50Tm9kZSApIHsKCQkJCQkJLy8gSGFuZGxlIHRoZSBjYXNlIHdoZXJlIElFIGFuZCBPcGVyYSByZXR1cm4gaXRlbXMKCQkJCQkJLy8gYnkgbmFtZSBpbnN0ZWFkIG9mIElECgkJCQkJCWlmICggZWxlbS5pZCAhPT0gbWF0Y2hbMl0gKSB7CgkJCQkJCQlyZXR1cm4gcm9vdGpRdWVyeS5maW5kKCBzZWxlY3RvciApOwoJCQkJCQl9CgoJCQkJCQkvLyBPdGhlcndpc2UsIHdlIGluamVjdCB0aGUgZWxlbWVudCBkaXJlY3RseSBpbnRvIHRoZSBqUXVlcnkgb2JqZWN0CgkJCQkJCXRoaXMubGVuZ3RoID0gMTsKCQkJCQkJdGhpc1swXSA9IGVsZW07CgkJCQkJfQoKCQkJCQl0aGlzLmNvbnRleHQgPSBkb2N1bWVudDsKCQkJCQl0aGlzLnNlbGVjdG9yID0gc2VsZWN0b3I7CgkJCQkJcmV0dXJuIHRoaXM7CgkJCQl9CgoJCQkvLyBIQU5ETEU6ICQoZXhwciwgJCguLi4pKQoJCQl9IGVsc2UgaWYgKCAhY29udGV4dCB8fCBjb250ZXh0LmpxdWVyeSApIHsKCQkJCXJldHVybiAoY29udGV4dCB8fCByb290alF1ZXJ5KS5maW5kKCBzZWxlY3RvciApOwoKCQkJLy8gSEFORExFOiAkKGV4cHIsIGNvbnRleHQpCgkJCS8vICh3aGljaCBpcyBqdXN0IGVxdWl2YWxlbnQgdG86ICQoY29udGV4dCkuZmluZChleHByKQoJCQl9IGVsc2UgewoJCQkJcmV0dXJuIHRoaXMuY29uc3RydWN0b3IoIGNvbnRleHQgKS5maW5kKCBzZWxlY3RvciApOwoJCQl9CgoJCS8vIEhBTkRMRTogJChmdW5jdGlvbikKCQkvLyBTaG9ydGN1dCBmb3IgZG9jdW1lbnQgcmVhZHkKCQl9IGVsc2UgaWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggc2VsZWN0b3IgKSApIHsKCQkJcmV0dXJuIHJvb3RqUXVlcnkucmVhZHkoIHNlbGVjdG9yICk7CgkJfQoKCQlpZiAoc2VsZWN0b3Iuc2VsZWN0b3IgIT09IHVuZGVmaW5lZCkgewoJCQl0aGlzLnNlbGVjdG9yID0gc2VsZWN0b3Iuc2VsZWN0b3I7CgkJCXRoaXMuY29udGV4dCA9IHNlbGVjdG9yLmNvbnRleHQ7CgkJfQoKCQlyZXR1cm4galF1ZXJ5Lm1ha2VBcnJheSggc2VsZWN0b3IsIHRoaXMgKTsKCX0sCgoJLy8gU3RhcnQgd2l0aCBhbiBlbXB0eSBzZWxlY3RvcgoJc2VsZWN0b3I6ICIiLAoKCS8vIFRoZSBjdXJyZW50IHZlcnNpb24gb2YgalF1ZXJ5IGJlaW5nIHVzZWQKCWpxdWVyeTogIjEuNi40IiwKCgkvLyBUaGUgZGVmYXVsdCBsZW5ndGggb2YgYSBqUXVlcnkgb2JqZWN0IGlzIDAKCWxlbmd0aDogMCwKCgkvLyBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGNvbnRhaW5lZCBpbiB0aGUgbWF0Y2hlZCBlbGVtZW50IHNldAoJc2l6ZTogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMubGVuZ3RoOwoJfSwKCgl0b0FycmF5OiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gc2xpY2UuY2FsbCggdGhpcywgMCApOwoJfSwKCgkvLyBHZXQgdGhlIE50aCBlbGVtZW50IGluIHRoZSBtYXRjaGVkIGVsZW1lbnQgc2V0IE9SCgkvLyBHZXQgdGhlIHdob2xlIG1hdGNoZWQgZWxlbWVudCBzZXQgYXMgYSBjbGVhbiBhcnJheQoJZ2V0OiBmdW5jdGlvbiggbnVtICkgewoJCXJldHVybiBudW0gPT0gbnVsbCA/CgoJCQkvLyBSZXR1cm4gYSAnY2xlYW4nIGFycmF5CgkJCXRoaXMudG9BcnJheSgpIDoKCgkJCS8vIFJldHVybiBqdXN0IHRoZSBvYmplY3QKCQkJKCBudW0gPCAwID8gdGhpc1sgdGhpcy5sZW5ndGggKyBudW0gXSA6IHRoaXNbIG51bSBdICk7Cgl9LAoKCS8vIFRha2UgYW4gYXJyYXkgb2YgZWxlbWVudHMgYW5kIHB1c2ggaXQgb250byB0aGUgc3RhY2sKCS8vIChyZXR1cm5pbmcgdGhlIG5ldyBtYXRjaGVkIGVsZW1lbnQgc2V0KQoJcHVzaFN0YWNrOiBmdW5jdGlvbiggZWxlbXMsIG5hbWUsIHNlbGVjdG9yICkgewoJCS8vIEJ1aWxkIGEgbmV3IGpRdWVyeSBtYXRjaGVkIGVsZW1lbnQgc2V0CgkJdmFyIHJldCA9IHRoaXMuY29uc3RydWN0b3IoKTsKCgkJaWYgKCBqUXVlcnkuaXNBcnJheSggZWxlbXMgKSApIHsKCQkJcHVzaC5hcHBseSggcmV0LCBlbGVtcyApOwoKCQl9IGVsc2UgewoJCQlqUXVlcnkubWVyZ2UoIHJldCwgZWxlbXMgKTsKCQl9CgoJCS8vIEFkZCB0aGUgb2xkIG9iamVjdCBvbnRvIHRoZSBzdGFjayAoYXMgYSByZWZlcmVuY2UpCgkJcmV0LnByZXZPYmplY3QgPSB0aGlzOwoKCQlyZXQuY29udGV4dCA9IHRoaXMuY29udGV4dDsKCgkJaWYgKCBuYW1lID09PSAiZmluZCIgKSB7CgkJCXJldC5zZWxlY3RvciA9IHRoaXMuc2VsZWN0b3IgKyAodGhpcy5zZWxlY3RvciA/ICIgIiA6ICIiKSArIHNlbGVjdG9yOwoJCX0gZWxzZSBpZiAoIG5hbWUgKSB7CgkJCXJldC5zZWxlY3RvciA9IHRoaXMuc2VsZWN0b3IgKyAiLiIgKyBuYW1lICsgIigiICsgc2VsZWN0b3IgKyAiKSI7CgkJfQoKCQkvLyBSZXR1cm4gdGhlIG5ld2x5LWZvcm1lZCBlbGVtZW50IHNldAoJCXJldHVybiByZXQ7Cgl9LAoKCS8vIEV4ZWN1dGUgYSBjYWxsYmFjayBmb3IgZXZlcnkgZWxlbWVudCBpbiB0aGUgbWF0Y2hlZCBzZXQuCgkvLyAoWW91IGNhbiBzZWVkIHRoZSBhcmd1bWVudHMgd2l0aCBhbiBhcnJheSBvZiBhcmdzLCBidXQgdGhpcyBpcwoJLy8gb25seSB1c2VkIGludGVybmFsbHkuKQoJZWFjaDogZnVuY3Rpb24oIGNhbGxiYWNrLCBhcmdzICkgewoJCXJldHVybiBqUXVlcnkuZWFjaCggdGhpcywgY2FsbGJhY2ssIGFyZ3MgKTsKCX0sCgoJcmVhZHk6IGZ1bmN0aW9uKCBmbiApIHsKCQkvLyBBdHRhY2ggdGhlIGxpc3RlbmVycwoJCWpRdWVyeS5iaW5kUmVhZHkoKTsKCgkJLy8gQWRkIHRoZSBjYWxsYmFjawoJCXJlYWR5TGlzdC5kb25lKCBmbiApOwoKCQlyZXR1cm4gdGhpczsKCX0sCgoJZXE6IGZ1bmN0aW9uKCBpICkgewoJCXJldHVybiBpID09PSAtMSA/CgkJCXRoaXMuc2xpY2UoIGkgKSA6CgkJCXRoaXMuc2xpY2UoIGksICtpICsgMSApOwoJfSwKCglmaXJzdDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuZXEoIDAgKTsKCX0sCgoJbGFzdDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuZXEoIC0xICk7Cgl9LAoKCXNsaWNlOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy5wdXNoU3RhY2soIHNsaWNlLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKSwKCQkJInNsaWNlIiwgc2xpY2UuY2FsbChhcmd1bWVudHMpLmpvaW4oIiwiKSApOwoJfSwKCgltYXA6IGZ1bmN0aW9uKCBjYWxsYmFjayApIHsKCQlyZXR1cm4gdGhpcy5wdXNoU3RhY2soIGpRdWVyeS5tYXAodGhpcywgZnVuY3Rpb24oIGVsZW0sIGkgKSB7CgkJCXJldHVybiBjYWxsYmFjay5jYWxsKCBlbGVtLCBpLCBlbGVtICk7CgkJfSkpOwoJfSwKCgllbmQ6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLnByZXZPYmplY3QgfHwgdGhpcy5jb25zdHJ1Y3RvcihudWxsKTsKCX0sCgoJLy8gRm9yIGludGVybmFsIHVzZSBvbmx5LgoJLy8gQmVoYXZlcyBsaWtlIGFuIEFycmF5J3MgbWV0aG9kLCBub3QgbGlrZSBhIGpRdWVyeSBtZXRob2QuCglwdXNoOiBwdXNoLAoJc29ydDogW10uc29ydCwKCXNwbGljZTogW10uc3BsaWNlCn07CgovLyBHaXZlIHRoZSBpbml0IGZ1bmN0aW9uIHRoZSBqUXVlcnkgcHJvdG90eXBlIGZvciBsYXRlciBpbnN0YW50aWF0aW9uCmpRdWVyeS5mbi5pbml0LnByb3RvdHlwZSA9IGpRdWVyeS5mbjsKCmpRdWVyeS5leHRlbmQgPSBqUXVlcnkuZm4uZXh0ZW5kID0gZnVuY3Rpb24oKSB7Cgl2YXIgb3B0aW9ucywgbmFtZSwgc3JjLCBjb3B5LCBjb3B5SXNBcnJheSwgY2xvbmUsCgkJdGFyZ2V0ID0gYXJndW1lbnRzWzBdIHx8IHt9LAoJCWkgPSAxLAoJCWxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGgsCgkJZGVlcCA9IGZhbHNlOwoKCS8vIEhhbmRsZSBhIGRlZXAgY29weSBzaXR1YXRpb24KCWlmICggdHlwZW9mIHRhcmdldCA9PT0gImJvb2xlYW4iICkgewoJCWRlZXAgPSB0YXJnZXQ7CgkJdGFyZ2V0ID0gYXJndW1lbnRzWzFdIHx8IHt9OwoJCS8vIHNraXAgdGhlIGJvb2xlYW4gYW5kIHRoZSB0YXJnZXQKCQlpID0gMjsKCX0KCgkvLyBIYW5kbGUgY2FzZSB3aGVuIHRhcmdldCBpcyBhIHN0cmluZyBvciBzb21ldGhpbmcgKHBvc3NpYmxlIGluIGRlZXAgY29weSkKCWlmICggdHlwZW9mIHRhcmdldCAhPT0gIm9iamVjdCIgJiYgIWpRdWVyeS5pc0Z1bmN0aW9uKHRhcmdldCkgKSB7CgkJdGFyZ2V0ID0ge307Cgl9CgoJLy8gZXh0ZW5kIGpRdWVyeSBpdHNlbGYgaWYgb25seSBvbmUgYXJndW1lbnQgaXMgcGFzc2VkCglpZiAoIGxlbmd0aCA9PT0gaSApIHsKCQl0YXJnZXQgPSB0aGlzOwoJCS0taTsKCX0KCglmb3IgKCA7IGkgPCBsZW5ndGg7IGkrKyApIHsKCQkvLyBPbmx5IGRlYWwgd2l0aCBub24tbnVsbC91bmRlZmluZWQgdmFsdWVzCgkJaWYgKCAob3B0aW9ucyA9IGFyZ3VtZW50c1sgaSBdKSAhPSBudWxsICkgewoJCQkvLyBFeHRlbmQgdGhlIGJhc2Ugb2JqZWN0CgkJCWZvciAoIG5hbWUgaW4gb3B0aW9ucyApIHsKCQkJCXNyYyA9IHRhcmdldFsgbmFtZSBdOwoJCQkJY29weSA9IG9wdGlvbnNbIG5hbWUgXTsKCgkJCQkvLyBQcmV2ZW50IG5ldmVyLWVuZGluZyBsb29wCgkJCQlpZiAoIHRhcmdldCA9PT0gY29weSApIHsKCQkJCQljb250aW51ZTsKCQkJCX0KCgkJCQkvLyBSZWN1cnNlIGlmIHdlJ3JlIG1lcmdpbmcgcGxhaW4gb2JqZWN0cyBvciBhcnJheXMKCQkJCWlmICggZGVlcCAmJiBjb3B5ICYmICggalF1ZXJ5LmlzUGxhaW5PYmplY3QoY29weSkgfHwgKGNvcHlJc0FycmF5ID0galF1ZXJ5LmlzQXJyYXkoY29weSkpICkgKSB7CgkJCQkJaWYgKCBjb3B5SXNBcnJheSApIHsKCQkJCQkJY29weUlzQXJyYXkgPSBmYWxzZTsKCQkJCQkJY2xvbmUgPSBzcmMgJiYgalF1ZXJ5LmlzQXJyYXkoc3JjKSA/IHNyYyA6IFtdOwoKCQkJCQl9IGVsc2UgewoJCQkJCQljbG9uZSA9IHNyYyAmJiBqUXVlcnkuaXNQbGFpbk9iamVjdChzcmMpID8gc3JjIDoge307CgkJCQkJfQoKCQkJCQkvLyBOZXZlciBtb3ZlIG9yaWdpbmFsIG9iamVjdHMsIGNsb25lIHRoZW0KCQkJCQl0YXJnZXRbIG5hbWUgXSA9IGpRdWVyeS5leHRlbmQoIGRlZXAsIGNsb25lLCBjb3B5ICk7CgoJCQkJLy8gRG9uJ3QgYnJpbmcgaW4gdW5kZWZpbmVkIHZhbHVlcwoJCQkJfSBlbHNlIGlmICggY29weSAhPT0gdW5kZWZpbmVkICkgewoJCQkJCXRhcmdldFsgbmFtZSBdID0gY29weTsKCQkJCX0KCQkJfQoJCX0KCX0KCgkvLyBSZXR1cm4gdGhlIG1vZGlmaWVkIG9iamVjdAoJcmV0dXJuIHRhcmdldDsKfTsKCmpRdWVyeS5leHRlbmQoewoJbm9Db25mbGljdDogZnVuY3Rpb24oIGRlZXAgKSB7CgkJaWYgKCB3aW5kb3cuJCA9PT0galF1ZXJ5ICkgewoJCQl3aW5kb3cuJCA9IF8kOwoJCX0KCgkJaWYgKCBkZWVwICYmIHdpbmRvdy5qUXVlcnkgPT09IGpRdWVyeSApIHsKCQkJd2luZG93LmpRdWVyeSA9IF9qUXVlcnk7CgkJfQoKCQlyZXR1cm4galF1ZXJ5OwoJfSwKCgkvLyBJcyB0aGUgRE9NIHJlYWR5IHRvIGJlIHVzZWQ/IFNldCB0byB0cnVlIG9uY2UgaXQgb2NjdXJzLgoJaXNSZWFkeTogZmFsc2UsCgoJLy8gQSBjb3VudGVyIHRvIHRyYWNrIGhvdyBtYW55IGl0ZW1zIHRvIHdhaXQgZm9yIGJlZm9yZQoJLy8gdGhlIHJlYWR5IGV2ZW50IGZpcmVzLiBTZWUgIzY3ODEKCXJlYWR5V2FpdDogMSwKCgkvLyBIb2xkIChvciByZWxlYXNlKSB0aGUgcmVhZHkgZXZlbnQKCWhvbGRSZWFkeTogZnVuY3Rpb24oIGhvbGQgKSB7CgkJaWYgKCBob2xkICkgewoJCQlqUXVlcnkucmVhZHlXYWl0Kys7CgkJfSBlbHNlIHsKCQkJalF1ZXJ5LnJlYWR5KCB0cnVlICk7CgkJfQoJfSwKCgkvLyBIYW5kbGUgd2hlbiB0aGUgRE9NIGlzIHJlYWR5CglyZWFkeTogZnVuY3Rpb24oIHdhaXQgKSB7CgkJLy8gRWl0aGVyIGEgcmVsZWFzZWQgaG9sZCBvciBhbiBET01yZWFkeS9sb2FkIGV2ZW50IGFuZCBub3QgeWV0IHJlYWR5CgkJaWYgKCAod2FpdCA9PT0gdHJ1ZSAmJiAhLS1qUXVlcnkucmVhZHlXYWl0KSB8fCAod2FpdCAhPT0gdHJ1ZSAmJiAhalF1ZXJ5LmlzUmVhZHkpICkgewoJCQkvLyBNYWtlIHN1cmUgYm9keSBleGlzdHMsIGF0IGxlYXN0LCBpbiBjYXNlIElFIGdldHMgYSBsaXR0bGUgb3ZlcnplYWxvdXMgKHRpY2tldCAjNTQ0MykuCgkJCWlmICggIWRvY3VtZW50LmJvZHkgKSB7CgkJCQlyZXR1cm4gc2V0VGltZW91dCggalF1ZXJ5LnJlYWR5LCAxICk7CgkJCX0KCgkJCS8vIFJlbWVtYmVyIHRoYXQgdGhlIERPTSBpcyByZWFkeQoJCQlqUXVlcnkuaXNSZWFkeSA9IHRydWU7CgoJCQkvLyBJZiBhIG5vcm1hbCBET00gUmVhZHkgZXZlbnQgZmlyZWQsIGRlY3JlbWVudCwgYW5kIHdhaXQgaWYgbmVlZCBiZQoJCQlpZiAoIHdhaXQgIT09IHRydWUgJiYgLS1qUXVlcnkucmVhZHlXYWl0ID4gMCApIHsKCQkJCXJldHVybjsKCQkJfQoKCQkJLy8gSWYgdGhlcmUgYXJlIGZ1bmN0aW9ucyBib3VuZCwgdG8gZXhlY3V0ZQoJCQlyZWFkeUxpc3QucmVzb2x2ZVdpdGgoIGRvY3VtZW50LCBbIGpRdWVyeSBdICk7CgoJCQkvLyBUcmlnZ2VyIGFueSBib3VuZCByZWFkeSBldmVudHMKCQkJaWYgKCBqUXVlcnkuZm4udHJpZ2dlciApIHsKCQkJCWpRdWVyeSggZG9jdW1lbnQgKS50cmlnZ2VyKCAicmVhZHkiICkudW5iaW5kKCAicmVhZHkiICk7CgkJCX0KCQl9Cgl9LAoKCWJpbmRSZWFkeTogZnVuY3Rpb24oKSB7CgkJaWYgKCByZWFkeUxpc3QgKSB7CgkJCXJldHVybjsKCQl9CgoJCXJlYWR5TGlzdCA9IGpRdWVyeS5fRGVmZXJyZWQoKTsKCgkJLy8gQ2F0Y2ggY2FzZXMgd2hlcmUgJChkb2N1bWVudCkucmVhZHkoKSBpcyBjYWxsZWQgYWZ0ZXIgdGhlCgkJLy8gYnJvd3NlciBldmVudCBoYXMgYWxyZWFkeSBvY2N1cnJlZC4KCQlpZiAoIGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICJjb21wbGV0ZSIgKSB7CgkJCS8vIEhhbmRsZSBpdCBhc3luY2hyb25vdXNseSB0byBhbGxvdyBzY3JpcHRzIHRoZSBvcHBvcnR1bml0eSB0byBkZWxheSByZWFkeQoJCQlyZXR1cm4gc2V0VGltZW91dCggalF1ZXJ5LnJlYWR5LCAxICk7CgkJfQoKCQkvLyBNb3ppbGxhLCBPcGVyYSBhbmQgd2Via2l0IG5pZ2h0bGllcyBjdXJyZW50bHkgc3VwcG9ydCB0aGlzIGV2ZW50CgkJaWYgKCBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyICkgewoJCQkvLyBVc2UgdGhlIGhhbmR5IGV2ZW50IGNhbGxiYWNrCgkJCWRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoICJET01Db250ZW50TG9hZGVkIiwgRE9NQ29udGVudExvYWRlZCwgZmFsc2UgKTsKCgkJCS8vIEEgZmFsbGJhY2sgdG8gd2luZG93Lm9ubG9hZCwgdGhhdCB3aWxsIGFsd2F5cyB3b3JrCgkJCXdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCAibG9hZCIsIGpRdWVyeS5yZWFkeSwgZmFsc2UgKTsKCgkJLy8gSWYgSUUgZXZlbnQgbW9kZWwgaXMgdXNlZAoJCX0gZWxzZSBpZiAoIGRvY3VtZW50LmF0dGFjaEV2ZW50ICkgewoJCQkvLyBlbnN1cmUgZmlyaW5nIGJlZm9yZSBvbmxvYWQsCgkJCS8vIG1heWJlIGxhdGUgYnV0IHNhZmUgYWxzbyBmb3IgaWZyYW1lcwoJCQlkb2N1bWVudC5hdHRhY2hFdmVudCggIm9ucmVhZHlzdGF0ZWNoYW5nZSIsIERPTUNvbnRlbnRMb2FkZWQgKTsKCgkJCS8vIEEgZmFsbGJhY2sgdG8gd2luZG93Lm9ubG9hZCwgdGhhdCB3aWxsIGFsd2F5cyB3b3JrCgkJCXdpbmRvdy5hdHRhY2hFdmVudCggIm9ubG9hZCIsIGpRdWVyeS5yZWFkeSApOwoKCQkJLy8gSWYgSUUgYW5kIG5vdCBhIGZyYW1lCgkJCS8vIGNvbnRpbnVhbGx5IGNoZWNrIHRvIHNlZSBpZiB0aGUgZG9jdW1lbnQgaXMgcmVhZHkKCQkJdmFyIHRvcGxldmVsID0gZmFsc2U7CgoJCQl0cnkgewoJCQkJdG9wbGV2ZWwgPSB3aW5kb3cuZnJhbWVFbGVtZW50ID09IG51bGw7CgkJCX0gY2F0Y2goZSkge30KCgkJCWlmICggZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmRvU2Nyb2xsICYmIHRvcGxldmVsICkgewoJCQkJZG9TY3JvbGxDaGVjaygpOwoJCQl9CgkJfQoJfSwKCgkvLyBTZWUgdGVzdC91bml0L2NvcmUuanMgZm9yIGRldGFpbHMgY29uY2VybmluZyBpc0Z1bmN0aW9uLgoJLy8gU2luY2UgdmVyc2lvbiAxLjMsIERPTSBtZXRob2RzIGFuZCBmdW5jdGlvbnMgbGlrZSBhbGVydAoJLy8gYXJlbid0IHN1cHBvcnRlZC4gVGhleSByZXR1cm4gZmFsc2Ugb24gSUUgKCMyOTY4KS4KCWlzRnVuY3Rpb246IGZ1bmN0aW9uKCBvYmogKSB7CgkJcmV0dXJuIGpRdWVyeS50eXBlKG9iaikgPT09ICJmdW5jdGlvbiI7Cgl9LAoKCWlzQXJyYXk6IEFycmF5LmlzQXJyYXkgfHwgZnVuY3Rpb24oIG9iaiApIHsKCQlyZXR1cm4galF1ZXJ5LnR5cGUob2JqKSA9PT0gImFycmF5IjsKCX0sCgoJLy8gQSBjcnVkZSB3YXkgb2YgZGV0ZXJtaW5pbmcgaWYgYW4gb2JqZWN0IGlzIGEgd2luZG93Cglpc1dpbmRvdzogZnVuY3Rpb24oIG9iaiApIHsKCQlyZXR1cm4gb2JqICYmIHR5cGVvZiBvYmogPT09ICJvYmplY3QiICYmICJzZXRJbnRlcnZhbCIgaW4gb2JqOwoJfSwKCglpc05hTjogZnVuY3Rpb24oIG9iaiApIHsKCQlyZXR1cm4gb2JqID09IG51bGwgfHwgIXJkaWdpdC50ZXN0KCBvYmogKSB8fCBpc05hTiggb2JqICk7Cgl9LAoKCXR5cGU6IGZ1bmN0aW9uKCBvYmogKSB7CgkJcmV0dXJuIG9iaiA9PSBudWxsID8KCQkJU3RyaW5nKCBvYmogKSA6CgkJCWNsYXNzMnR5cGVbIHRvU3RyaW5nLmNhbGwob2JqKSBdIHx8ICJvYmplY3QiOwoJfSwKCglpc1BsYWluT2JqZWN0OiBmdW5jdGlvbiggb2JqICkgewoJCS8vIE11c3QgYmUgYW4gT2JqZWN0LgoJCS8vIEJlY2F1c2Ugb2YgSUUsIHdlIGFsc28gaGF2ZSB0byBjaGVjayB0aGUgcHJlc2VuY2Ugb2YgdGhlIGNvbnN0cnVjdG9yIHByb3BlcnR5LgoJCS8vIE1ha2Ugc3VyZSB0aGF0IERPTSBub2RlcyBhbmQgd2luZG93IG9iamVjdHMgZG9uJ3QgcGFzcyB0aHJvdWdoLCBhcyB3ZWxsCgkJaWYgKCAhb2JqIHx8IGpRdWVyeS50eXBlKG9iaikgIT09ICJvYmplY3QiIHx8IG9iai5ub2RlVHlwZSB8fCBqUXVlcnkuaXNXaW5kb3coIG9iaiApICkgewoJCQlyZXR1cm4gZmFsc2U7CgkJfQoKCQl0cnkgewoJCQkvLyBOb3Qgb3duIGNvbnN0cnVjdG9yIHByb3BlcnR5IG11c3QgYmUgT2JqZWN0CgkJCWlmICggb2JqLmNvbnN0cnVjdG9yICYmCgkJCQkhaGFzT3duLmNhbGwob2JqLCAiY29uc3RydWN0b3IiKSAmJgoJCQkJIWhhc093bi5jYWxsKG9iai5jb25zdHJ1Y3Rvci5wcm90b3R5cGUsICJpc1Byb3RvdHlwZU9mIikgKSB7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KCQl9IGNhdGNoICggZSApIHsKCQkJLy8gSUU4LDkgV2lsbCB0aHJvdyBleGNlcHRpb25zIG9uIGNlcnRhaW4gaG9zdCBvYmplY3RzICM5ODk3CgkJCXJldHVybiBmYWxzZTsKCQl9CgoJCS8vIE93biBwcm9wZXJ0aWVzIGFyZSBlbnVtZXJhdGVkIGZpcnN0bHksIHNvIHRvIHNwZWVkIHVwLAoJCS8vIGlmIGxhc3Qgb25lIGlzIG93biwgdGhlbiBhbGwgcHJvcGVydGllcyBhcmUgb3duLgoKCQl2YXIga2V5OwoJCWZvciAoIGtleSBpbiBvYmogKSB7fQoKCQlyZXR1cm4ga2V5ID09PSB1bmRlZmluZWQgfHwgaGFzT3duLmNhbGwoIG9iaiwga2V5ICk7Cgl9LAoKCWlzRW1wdHlPYmplY3Q6IGZ1bmN0aW9uKCBvYmogKSB7CgkJZm9yICggdmFyIG5hbWUgaW4gb2JqICkgewoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJCXJldHVybiB0cnVlOwoJfSwKCgllcnJvcjogZnVuY3Rpb24oIG1zZyApIHsKCQl0aHJvdyBtc2c7Cgl9LAoKCXBhcnNlSlNPTjogZnVuY3Rpb24oIGRhdGEgKSB7CgkJaWYgKCB0eXBlb2YgZGF0YSAhPT0gInN0cmluZyIgfHwgIWRhdGEgKSB7CgkJCXJldHVybiBudWxsOwoJCX0KCgkJLy8gTWFrZSBzdXJlIGxlYWRpbmcvdHJhaWxpbmcgd2hpdGVzcGFjZSBpcyByZW1vdmVkIChJRSBjYW4ndCBoYW5kbGUgaXQpCgkJZGF0YSA9IGpRdWVyeS50cmltKCBkYXRhICk7CgoJCS8vIEF0dGVtcHQgdG8gcGFyc2UgdXNpbmcgdGhlIG5hdGl2ZSBKU09OIHBhcnNlciBmaXJzdAoJCWlmICggd2luZG93LkpTT04gJiYgd2luZG93LkpTT04ucGFyc2UgKSB7CgkJCXJldHVybiB3aW5kb3cuSlNPTi5wYXJzZSggZGF0YSApOwoJCX0KCgkJLy8gTWFrZSBzdXJlIHRoZSBpbmNvbWluZyBkYXRhIGlzIGFjdHVhbCBKU09OCgkJLy8gTG9naWMgYm9ycm93ZWQgZnJvbSBodHRwOi8vanNvbi5vcmcvanNvbjIuanMKCQlpZiAoIHJ2YWxpZGNoYXJzLnRlc3QoIGRhdGEucmVwbGFjZSggcnZhbGlkZXNjYXBlLCAiQCIgKQoJCQkucmVwbGFjZSggcnZhbGlkdG9rZW5zLCAiXSIgKQoJCQkucmVwbGFjZSggcnZhbGlkYnJhY2VzLCAiIikpICkgewoKCQkJcmV0dXJuIChuZXcgRnVuY3Rpb24oICJyZXR1cm4gIiArIGRhdGEgKSkoKTsKCgkJfQoJCWpRdWVyeS5lcnJvciggIkludmFsaWQgSlNPTjogIiArIGRhdGEgKTsKCX0sCgoJLy8gQ3Jvc3MtYnJvd3NlciB4bWwgcGFyc2luZwoJcGFyc2VYTUw6IGZ1bmN0aW9uKCBkYXRhICkgewoJCXZhciB4bWwsIHRtcDsKCQl0cnkgewoJCQlpZiAoIHdpbmRvdy5ET01QYXJzZXIgKSB7IC8vIFN0YW5kYXJkCgkJCQl0bXAgPSBuZXcgRE9NUGFyc2VyKCk7CgkJCQl4bWwgPSB0bXAucGFyc2VGcm9tU3RyaW5nKCBkYXRhICwgInRleHQveG1sIiApOwoJCQl9IGVsc2UgeyAvLyBJRQoJCQkJeG1sID0gbmV3IEFjdGl2ZVhPYmplY3QoICJNaWNyb3NvZnQuWE1MRE9NIiApOwoJCQkJeG1sLmFzeW5jID0gImZhbHNlIjsKCQkJCXhtbC5sb2FkWE1MKCBkYXRhICk7CgkJCX0KCQl9IGNhdGNoKCBlICkgewoJCQl4bWwgPSB1bmRlZmluZWQ7CgkJfQoJCWlmICggIXhtbCB8fCAheG1sLmRvY3VtZW50RWxlbWVudCB8fCB4bWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoICJwYXJzZXJlcnJvciIgKS5sZW5ndGggKSB7CgkJCWpRdWVyeS5lcnJvciggIkludmFsaWQgWE1MOiAiICsgZGF0YSApOwoJCX0KCQlyZXR1cm4geG1sOwoJfSwKCglub29wOiBmdW5jdGlvbigpIHt9LAoKCS8vIEV2YWx1YXRlcyBhIHNjcmlwdCBpbiBhIGdsb2JhbCBjb250ZXh0CgkvLyBXb3JrYXJvdW5kcyBiYXNlZCBvbiBmaW5kaW5ncyBieSBKaW0gRHJpc2NvbGwKCS8vIGh0dHA6Ly93ZWJsb2dzLmphdmEubmV0L2Jsb2cvZHJpc2NvbGwvYXJjaGl2ZS8yMDA5LzA5LzA4L2V2YWwtamF2YXNjcmlwdC1nbG9iYWwtY29udGV4dAoJZ2xvYmFsRXZhbDogZnVuY3Rpb24oIGRhdGEgKSB7CgkJaWYgKCBkYXRhICYmIHJub3R3aGl0ZS50ZXN0KCBkYXRhICkgKSB7CgkJCS8vIFdlIHVzZSBleGVjU2NyaXB0IG9uIEludGVybmV0IEV4cGxvcmVyCgkJCS8vIFdlIHVzZSBhbiBhbm9ueW1vdXMgZnVuY3Rpb24gc28gdGhhdCBjb250ZXh0IGlzIHdpbmRvdwoJCQkvLyByYXRoZXIgdGhhbiBqUXVlcnkgaW4gRmlyZWZveAoJCQkoIHdpbmRvdy5leGVjU2NyaXB0IHx8IGZ1bmN0aW9uKCBkYXRhICkgewoJCQkJd2luZG93WyAiZXZhbCIgXS5jYWxsKCB3aW5kb3csIGRhdGEgKTsKCQkJfSApKCBkYXRhICk7CgkJfQoJfSwKCgkvLyBDb252ZXJ0IGRhc2hlZCB0byBjYW1lbENhc2U7IHVzZWQgYnkgdGhlIGNzcyBhbmQgZGF0YSBtb2R1bGVzCgkvLyBNaWNyb3NvZnQgZm9yZ290IHRvIGh1bXAgdGhlaXIgdmVuZG9yIHByZWZpeCAoIzk1NzIpCgljYW1lbENhc2U6IGZ1bmN0aW9uKCBzdHJpbmcgKSB7CgkJcmV0dXJuIHN0cmluZy5yZXBsYWNlKCBybXNQcmVmaXgsICJtcy0iICkucmVwbGFjZSggcmRhc2hBbHBoYSwgZmNhbWVsQ2FzZSApOwoJfSwKCglub2RlTmFtZTogZnVuY3Rpb24oIGVsZW0sIG5hbWUgKSB7CgkJcmV0dXJuIGVsZW0ubm9kZU5hbWUgJiYgZWxlbS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSBuYW1lLnRvVXBwZXJDYXNlKCk7Cgl9LAoKCS8vIGFyZ3MgaXMgZm9yIGludGVybmFsIHVzYWdlIG9ubHkKCWVhY2g6IGZ1bmN0aW9uKCBvYmplY3QsIGNhbGxiYWNrLCBhcmdzICkgewoJCXZhciBuYW1lLCBpID0gMCwKCQkJbGVuZ3RoID0gb2JqZWN0Lmxlbmd0aCwKCQkJaXNPYmogPSBsZW5ndGggPT09IHVuZGVmaW5lZCB8fCBqUXVlcnkuaXNGdW5jdGlvbiggb2JqZWN0ICk7CgoJCWlmICggYXJncyApIHsKCQkJaWYgKCBpc09iaiApIHsKCQkJCWZvciAoIG5hbWUgaW4gb2JqZWN0ICkgewoJCQkJCWlmICggY2FsbGJhY2suYXBwbHkoIG9iamVjdFsgbmFtZSBdLCBhcmdzICkgPT09IGZhbHNlICkgewoJCQkJCQlicmVhazsKCQkJCQl9CgkJCQl9CgkJCX0gZWxzZSB7CgkJCQlmb3IgKCA7IGkgPCBsZW5ndGg7ICkgewoJCQkJCWlmICggY2FsbGJhY2suYXBwbHkoIG9iamVjdFsgaSsrIF0sIGFyZ3MgKSA9PT0gZmFsc2UgKSB7CgkJCQkJCWJyZWFrOwoJCQkJCX0KCQkJCX0KCQkJfQoKCQkvLyBBIHNwZWNpYWwsIGZhc3QsIGNhc2UgZm9yIHRoZSBtb3N0IGNvbW1vbiB1c2Ugb2YgZWFjaAoJCX0gZWxzZSB7CgkJCWlmICggaXNPYmogKSB7CgkJCQlmb3IgKCBuYW1lIGluIG9iamVjdCApIHsKCQkJCQlpZiAoIGNhbGxiYWNrLmNhbGwoIG9iamVjdFsgbmFtZSBdLCBuYW1lLCBvYmplY3RbIG5hbWUgXSApID09PSBmYWxzZSApIHsKCQkJCQkJYnJlYWs7CgkJCQkJfQoJCQkJfQoJCQl9IGVsc2UgewoJCQkJZm9yICggOyBpIDwgbGVuZ3RoOyApIHsKCQkJCQlpZiAoIGNhbGxiYWNrLmNhbGwoIG9iamVjdFsgaSBdLCBpLCBvYmplY3RbIGkrKyBdICkgPT09IGZhbHNlICkgewoJCQkJCQlicmVhazsKCQkJCQl9CgkJCQl9CgkJCX0KCQl9CgoJCXJldHVybiBvYmplY3Q7Cgl9LAoKCS8vIFVzZSBuYXRpdmUgU3RyaW5nLnRyaW0gZnVuY3Rpb24gd2hlcmV2ZXIgcG9zc2libGUKCXRyaW06IHRyaW0gPwoJCWZ1bmN0aW9uKCB0ZXh0ICkgewoJCQlyZXR1cm4gdGV4dCA9PSBudWxsID8KCQkJCSIiIDoKCQkJCXRyaW0uY2FsbCggdGV4dCApOwoJCX0gOgoKCQkvLyBPdGhlcndpc2UgdXNlIG91ciBvd24gdHJpbW1pbmcgZnVuY3Rpb25hbGl0eQoJCWZ1bmN0aW9uKCB0ZXh0ICkgewoJCQlyZXR1cm4gdGV4dCA9PSBudWxsID8KCQkJCSIiIDoKCQkJCXRleHQudG9TdHJpbmcoKS5yZXBsYWNlKCB0cmltTGVmdCwgIiIgKS5yZXBsYWNlKCB0cmltUmlnaHQsICIiICk7CgkJfSwKCgkvLyByZXN1bHRzIGlzIGZvciBpbnRlcm5hbCB1c2FnZSBvbmx5CgltYWtlQXJyYXk6IGZ1bmN0aW9uKCBhcnJheSwgcmVzdWx0cyApIHsKCQl2YXIgcmV0ID0gcmVzdWx0cyB8fCBbXTsKCgkJaWYgKCBhcnJheSAhPSBudWxsICkgewoJCQkvLyBUaGUgd2luZG93LCBzdHJpbmdzIChhbmQgZnVuY3Rpb25zKSBhbHNvIGhhdmUgJ2xlbmd0aCcKCQkJLy8gVGhlIGV4dHJhIHR5cGVvZiBmdW5jdGlvbiBjaGVjayBpcyB0byBwcmV2ZW50IGNyYXNoZXMKCQkJLy8gaW4gU2FmYXJpIDIgKFNlZTogIzMwMzkpCgkJCS8vIFR3ZWFrZWQgbG9naWMgc2xpZ2h0bHkgdG8gaGFuZGxlIEJsYWNrYmVycnkgNC43IFJlZ0V4cCBpc3N1ZXMgIzY5MzAKCQkJdmFyIHR5cGUgPSBqUXVlcnkudHlwZSggYXJyYXkgKTsKCgkJCWlmICggYXJyYXkubGVuZ3RoID09IG51bGwgfHwgdHlwZSA9PT0gInN0cmluZyIgfHwgdHlwZSA9PT0gImZ1bmN0aW9uIiB8fCB0eXBlID09PSAicmVnZXhwIiB8fCBqUXVlcnkuaXNXaW5kb3coIGFycmF5ICkgKSB7CgkJCQlwdXNoLmNhbGwoIHJldCwgYXJyYXkgKTsKCQkJfSBlbHNlIHsKCQkJCWpRdWVyeS5tZXJnZSggcmV0LCBhcnJheSApOwoJCQl9CgkJfQoKCQlyZXR1cm4gcmV0OwoJfSwKCglpbkFycmF5OiBmdW5jdGlvbiggZWxlbSwgYXJyYXkgKSB7CgkJaWYgKCAhYXJyYXkgKSB7CgkJCXJldHVybiAtMTsKCQl9CgoJCWlmICggaW5kZXhPZiApIHsKCQkJcmV0dXJuIGluZGV4T2YuY2FsbCggYXJyYXksIGVsZW0gKTsKCQl9CgoJCWZvciAoIHZhciBpID0gMCwgbGVuZ3RoID0gYXJyYXkubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKysgKSB7CgkJCWlmICggYXJyYXlbIGkgXSA9PT0gZWxlbSApIHsKCQkJCXJldHVybiBpOwoJCQl9CgkJfQoKCQlyZXR1cm4gLTE7Cgl9LAoKCW1lcmdlOiBmdW5jdGlvbiggZmlyc3QsIHNlY29uZCApIHsKCQl2YXIgaSA9IGZpcnN0Lmxlbmd0aCwKCQkJaiA9IDA7CgoJCWlmICggdHlwZW9mIHNlY29uZC5sZW5ndGggPT09ICJudW1iZXIiICkgewoJCQlmb3IgKCB2YXIgbCA9IHNlY29uZC5sZW5ndGg7IGogPCBsOyBqKysgKSB7CgkJCQlmaXJzdFsgaSsrIF0gPSBzZWNvbmRbIGogXTsKCQkJfQoKCQl9IGVsc2UgewoJCQl3aGlsZSAoIHNlY29uZFtqXSAhPT0gdW5kZWZpbmVkICkgewoJCQkJZmlyc3RbIGkrKyBdID0gc2Vjb25kWyBqKysgXTsKCQkJfQoJCX0KCgkJZmlyc3QubGVuZ3RoID0gaTsKCgkJcmV0dXJuIGZpcnN0OwoJfSwKCglncmVwOiBmdW5jdGlvbiggZWxlbXMsIGNhbGxiYWNrLCBpbnYgKSB7CgkJdmFyIHJldCA9IFtdLCByZXRWYWw7CgkJaW52ID0gISFpbnY7CgoJCS8vIEdvIHRocm91Z2ggdGhlIGFycmF5LCBvbmx5IHNhdmluZyB0aGUgaXRlbXMKCQkvLyB0aGF0IHBhc3MgdGhlIHZhbGlkYXRvciBmdW5jdGlvbgoJCWZvciAoIHZhciBpID0gMCwgbGVuZ3RoID0gZWxlbXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKysgKSB7CgkJCXJldFZhbCA9ICEhY2FsbGJhY2soIGVsZW1zWyBpIF0sIGkgKTsKCQkJaWYgKCBpbnYgIT09IHJldFZhbCApIHsKCQkJCXJldC5wdXNoKCBlbGVtc1sgaSBdICk7CgkJCX0KCQl9CgoJCXJldHVybiByZXQ7Cgl9LAoKCS8vIGFyZyBpcyBmb3IgaW50ZXJuYWwgdXNhZ2Ugb25seQoJbWFwOiBmdW5jdGlvbiggZWxlbXMsIGNhbGxiYWNrLCBhcmcgKSB7CgkJdmFyIHZhbHVlLCBrZXksIHJldCA9IFtdLAoJCQlpID0gMCwKCQkJbGVuZ3RoID0gZWxlbXMubGVuZ3RoLAoJCQkvLyBqcXVlcnkgb2JqZWN0cyBhcmUgdHJlYXRlZCBhcyBhcnJheXMKCQkJaXNBcnJheSA9IGVsZW1zIGluc3RhbmNlb2YgalF1ZXJ5IHx8IGxlbmd0aCAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBsZW5ndGggPT09ICJudW1iZXIiICYmICggKCBsZW5ndGggPiAwICYmIGVsZW1zWyAwIF0gJiYgZWxlbXNbIGxlbmd0aCAtMSBdICkgfHwgbGVuZ3RoID09PSAwIHx8IGpRdWVyeS5pc0FycmF5KCBlbGVtcyApICkgOwoKCQkvLyBHbyB0aHJvdWdoIHRoZSBhcnJheSwgdHJhbnNsYXRpbmcgZWFjaCBvZiB0aGUgaXRlbXMgdG8gdGhlaXIKCQlpZiAoIGlzQXJyYXkgKSB7CgkJCWZvciAoIDsgaSA8IGxlbmd0aDsgaSsrICkgewoJCQkJdmFsdWUgPSBjYWxsYmFjayggZWxlbXNbIGkgXSwgaSwgYXJnICk7CgoJCQkJaWYgKCB2YWx1ZSAhPSBudWxsICkgewoJCQkJCXJldFsgcmV0Lmxlbmd0aCBdID0gdmFsdWU7CgkJCQl9CgkJCX0KCgkJLy8gR28gdGhyb3VnaCBldmVyeSBrZXkgb24gdGhlIG9iamVjdCwKCQl9IGVsc2UgewoJCQlmb3IgKCBrZXkgaW4gZWxlbXMgKSB7CgkJCQl2YWx1ZSA9IGNhbGxiYWNrKCBlbGVtc1sga2V5IF0sIGtleSwgYXJnICk7CgoJCQkJaWYgKCB2YWx1ZSAhPSBudWxsICkgewoJCQkJCXJldFsgcmV0Lmxlbmd0aCBdID0gdmFsdWU7CgkJCQl9CgkJCX0KCQl9CgoJCS8vIEZsYXR0ZW4gYW55IG5lc3RlZCBhcnJheXMKCQlyZXR1cm4gcmV0LmNvbmNhdC5hcHBseSggW10sIHJldCApOwoJfSwKCgkvLyBBIGdsb2JhbCBHVUlEIGNvdW50ZXIgZm9yIG9iamVjdHMKCWd1aWQ6IDEsCgoJLy8gQmluZCBhIGZ1bmN0aW9uIHRvIGEgY29udGV4dCwgb3B0aW9uYWxseSBwYXJ0aWFsbHkgYXBwbHlpbmcgYW55CgkvLyBhcmd1bWVudHMuCglwcm94eTogZnVuY3Rpb24oIGZuLCBjb250ZXh0ICkgewoJCWlmICggdHlwZW9mIGNvbnRleHQgPT09ICJzdHJpbmciICkgewoJCQl2YXIgdG1wID0gZm5bIGNvbnRleHQgXTsKCQkJY29udGV4dCA9IGZuOwoJCQlmbiA9IHRtcDsKCQl9CgoJCS8vIFF1aWNrIGNoZWNrIHRvIGRldGVybWluZSBpZiB0YXJnZXQgaXMgY2FsbGFibGUsIGluIHRoZSBzcGVjCgkJLy8gdGhpcyB0aHJvd3MgYSBUeXBlRXJyb3IsIGJ1dCB3ZSB3aWxsIGp1c3QgcmV0dXJuIHVuZGVmaW5lZC4KCQlpZiAoICFqUXVlcnkuaXNGdW5jdGlvbiggZm4gKSApIHsKCQkJcmV0dXJuIHVuZGVmaW5lZDsKCQl9CgoJCS8vIFNpbXVsYXRlZCBiaW5kCgkJdmFyIGFyZ3MgPSBzbGljZS5jYWxsKCBhcmd1bWVudHMsIDIgKSwKCQkJcHJveHkgPSBmdW5jdGlvbigpIHsKCQkJCXJldHVybiBmbi5hcHBseSggY29udGV4dCwgYXJncy5jb25jYXQoIHNsaWNlLmNhbGwoIGFyZ3VtZW50cyApICkgKTsKCQkJfTsKCgkJLy8gU2V0IHRoZSBndWlkIG9mIHVuaXF1ZSBoYW5kbGVyIHRvIHRoZSBzYW1lIG9mIG9yaWdpbmFsIGhhbmRsZXIsIHNvIGl0IGNhbiBiZSByZW1vdmVkCgkJcHJveHkuZ3VpZCA9IGZuLmd1aWQgPSBmbi5ndWlkIHx8IHByb3h5Lmd1aWQgfHwgalF1ZXJ5Lmd1aWQrKzsKCgkJcmV0dXJuIHByb3h5OwoJfSwKCgkvLyBNdXRpZnVuY3Rpb25hbCBtZXRob2QgdG8gZ2V0IGFuZCBzZXQgdmFsdWVzIHRvIGEgY29sbGVjdGlvbgoJLy8gVGhlIHZhbHVlL3MgY2FuIG9wdGlvbmFsbHkgYmUgZXhlY3V0ZWQgaWYgaXQncyBhIGZ1bmN0aW9uCglhY2Nlc3M6IGZ1bmN0aW9uKCBlbGVtcywga2V5LCB2YWx1ZSwgZXhlYywgZm4sIHBhc3MgKSB7CgkJdmFyIGxlbmd0aCA9IGVsZW1zLmxlbmd0aDsKCgkJLy8gU2V0dGluZyBtYW55IGF0dHJpYnV0ZXMKCQlpZiAoIHR5cGVvZiBrZXkgPT09ICJvYmplY3QiICkgewoJCQlmb3IgKCB2YXIgayBpbiBrZXkgKSB7CgkJCQlqUXVlcnkuYWNjZXNzKCBlbGVtcywgaywga2V5W2tdLCBleGVjLCBmbiwgdmFsdWUgKTsKCQkJfQoJCQlyZXR1cm4gZWxlbXM7CgkJfQoKCQkvLyBTZXR0aW5nIG9uZSBhdHRyaWJ1dGUKCQlpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7CgkJCS8vIE9wdGlvbmFsbHksIGZ1bmN0aW9uIHZhbHVlcyBnZXQgZXhlY3V0ZWQgaWYgZXhlYyBpcyB0cnVlCgkJCWV4ZWMgPSAhcGFzcyAmJiBleGVjICYmIGpRdWVyeS5pc0Z1bmN0aW9uKHZhbHVlKTsKCgkJCWZvciAoIHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrICkgewoJCQkJZm4oIGVsZW1zW2ldLCBrZXksIGV4ZWMgPyB2YWx1ZS5jYWxsKCBlbGVtc1tpXSwgaSwgZm4oIGVsZW1zW2ldLCBrZXkgKSApIDogdmFsdWUsIHBhc3MgKTsKCQkJfQoKCQkJcmV0dXJuIGVsZW1zOwoJCX0KCgkJLy8gR2V0dGluZyBhbiBhdHRyaWJ1dGUKCQlyZXR1cm4gbGVuZ3RoID8gZm4oIGVsZW1zWzBdLCBrZXkgKSA6IHVuZGVmaW5lZDsKCX0sCgoJbm93OiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gKG5ldyBEYXRlKCkpLmdldFRpbWUoKTsKCX0sCgoJLy8gVXNlIG9mIGpRdWVyeS5icm93c2VyIGlzIGZyb3duZWQgdXBvbi4KCS8vIE1vcmUgZGV0YWlsczogaHR0cDovL2RvY3MuanF1ZXJ5LmNvbS9VdGlsaXRpZXMvalF1ZXJ5LmJyb3dzZXIKCXVhTWF0Y2g6IGZ1bmN0aW9uKCB1YSApIHsKCQl1YSA9IHVhLnRvTG93ZXJDYXNlKCk7CgoJCXZhciBtYXRjaCA9IHJ3ZWJraXQuZXhlYyggdWEgKSB8fAoJCQlyb3BlcmEuZXhlYyggdWEgKSB8fAoJCQlybXNpZS5leGVjKCB1YSApIHx8CgkJCXVhLmluZGV4T2YoImNvbXBhdGlibGUiKSA8IDAgJiYgcm1vemlsbGEuZXhlYyggdWEgKSB8fAoJCQlbXTsKCgkJcmV0dXJuIHsgYnJvd3NlcjogbWF0Y2hbMV0gfHwgIiIsIHZlcnNpb246IG1hdGNoWzJdIHx8ICIwIiB9OwoJfSwKCglzdWI6IGZ1bmN0aW9uKCkgewoJCWZ1bmN0aW9uIGpRdWVyeVN1Yiggc2VsZWN0b3IsIGNvbnRleHQgKSB7CgkJCXJldHVybiBuZXcgalF1ZXJ5U3ViLmZuLmluaXQoIHNlbGVjdG9yLCBjb250ZXh0ICk7CgkJfQoJCWpRdWVyeS5leHRlbmQoIHRydWUsIGpRdWVyeVN1YiwgdGhpcyApOwoJCWpRdWVyeVN1Yi5zdXBlcmNsYXNzID0gdGhpczsKCQlqUXVlcnlTdWIuZm4gPSBqUXVlcnlTdWIucHJvdG90eXBlID0gdGhpcygpOwoJCWpRdWVyeVN1Yi5mbi5jb25zdHJ1Y3RvciA9IGpRdWVyeVN1YjsKCQlqUXVlcnlTdWIuc3ViID0gdGhpcy5zdWI7CgkJalF1ZXJ5U3ViLmZuLmluaXQgPSBmdW5jdGlvbiBpbml0KCBzZWxlY3RvciwgY29udGV4dCApIHsKCQkJaWYgKCBjb250ZXh0ICYmIGNvbnRleHQgaW5zdGFuY2VvZiBqUXVlcnkgJiYgIShjb250ZXh0IGluc3RhbmNlb2YgalF1ZXJ5U3ViKSApIHsKCQkJCWNvbnRleHQgPSBqUXVlcnlTdWIoIGNvbnRleHQgKTsKCQkJfQoKCQkJcmV0dXJuIGpRdWVyeS5mbi5pbml0LmNhbGwoIHRoaXMsIHNlbGVjdG9yLCBjb250ZXh0LCByb290alF1ZXJ5U3ViICk7CgkJfTsKCQlqUXVlcnlTdWIuZm4uaW5pdC5wcm90b3R5cGUgPSBqUXVlcnlTdWIuZm47CgkJdmFyIHJvb3RqUXVlcnlTdWIgPSBqUXVlcnlTdWIoZG9jdW1lbnQpOwoJCXJldHVybiBqUXVlcnlTdWI7Cgl9LAoKCWJyb3dzZXI6IHt9Cn0pOwoKLy8gUG9wdWxhdGUgdGhlIGNsYXNzMnR5cGUgbWFwCmpRdWVyeS5lYWNoKCJCb29sZWFuIE51bWJlciBTdHJpbmcgRnVuY3Rpb24gQXJyYXkgRGF0ZSBSZWdFeHAgT2JqZWN0Ii5zcGxpdCgiICIpLCBmdW5jdGlvbihpLCBuYW1lKSB7CgljbGFzczJ0eXBlWyAiW29iamVjdCAiICsgbmFtZSArICJdIiBdID0gbmFtZS50b0xvd2VyQ2FzZSgpOwp9KTsKCmJyb3dzZXJNYXRjaCA9IGpRdWVyeS51YU1hdGNoKCB1c2VyQWdlbnQgKTsKaWYgKCBicm93c2VyTWF0Y2guYnJvd3NlciApIHsKCWpRdWVyeS5icm93c2VyWyBicm93c2VyTWF0Y2guYnJvd3NlciBdID0gdHJ1ZTsKCWpRdWVyeS5icm93c2VyLnZlcnNpb24gPSBicm93c2VyTWF0Y2gudmVyc2lvbjsKfQoKLy8gRGVwcmVjYXRlZCwgdXNlIGpRdWVyeS5icm93c2VyLndlYmtpdCBpbnN0ZWFkCmlmICggalF1ZXJ5LmJyb3dzZXIud2Via2l0ICkgewoJalF1ZXJ5LmJyb3dzZXIuc2FmYXJpID0gdHJ1ZTsKfQoKLy8gSUUgZG9lc24ndCBtYXRjaCBub24tYnJlYWtpbmcgc3BhY2VzIHdpdGggXHMKaWYgKCBybm90d2hpdGUudGVzdCggIlx4QTAiICkgKSB7Cgl0cmltTGVmdCA9IC9eW1xzXHhBMF0rLzsKCXRyaW1SaWdodCA9IC9bXHNceEEwXSskLzsKfQoKLy8gQWxsIGpRdWVyeSBvYmplY3RzIHNob3VsZCBwb2ludCBiYWNrIHRvIHRoZXNlCnJvb3RqUXVlcnkgPSBqUXVlcnkoZG9jdW1lbnQpOwoKLy8gQ2xlYW51cCBmdW5jdGlvbnMgZm9yIHRoZSBkb2N1bWVudCByZWFkeSBtZXRob2QKaWYgKCBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyICkgewoJRE9NQ29udGVudExvYWRlZCA9IGZ1bmN0aW9uKCkgewoJCWRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoICJET01Db250ZW50TG9hZGVkIiwgRE9NQ29udGVudExvYWRlZCwgZmFsc2UgKTsKCQlqUXVlcnkucmVhZHkoKTsKCX07Cgp9IGVsc2UgaWYgKCBkb2N1bWVudC5hdHRhY2hFdmVudCApIHsKCURPTUNvbnRlbnRMb2FkZWQgPSBmdW5jdGlvbigpIHsKCQkvLyBNYWtlIHN1cmUgYm9keSBleGlzdHMsIGF0IGxlYXN0LCBpbiBjYXNlIElFIGdldHMgYSBsaXR0bGUgb3ZlcnplYWxvdXMgKHRpY2tldCAjNTQ0MykuCgkJaWYgKCBkb2N1bWVudC5yZWFkeVN0YXRlID09PSAiY29tcGxldGUiICkgewoJCQlkb2N1bWVudC5kZXRhY2hFdmVudCggIm9ucmVhZHlzdGF0ZWNoYW5nZSIsIERPTUNvbnRlbnRMb2FkZWQgKTsKCQkJalF1ZXJ5LnJlYWR5KCk7CgkJfQoJfTsKfQoKLy8gVGhlIERPTSByZWFkeSBjaGVjayBmb3IgSW50ZXJuZXQgRXhwbG9yZXIKZnVuY3Rpb24gZG9TY3JvbGxDaGVjaygpIHsKCWlmICggalF1ZXJ5LmlzUmVhZHkgKSB7CgkJcmV0dXJuOwoJfQoKCXRyeSB7CgkJLy8gSWYgSUUgaXMgdXNlZCwgdXNlIHRoZSB0cmljayBieSBEaWVnbyBQZXJpbmkKCQkvLyBodHRwOi8vamF2YXNjcmlwdC5ud2JveC5jb20vSUVDb250ZW50TG9hZGVkLwoJCWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5kb1Njcm9sbCgibGVmdCIpOwoJfSBjYXRjaChlKSB7CgkJc2V0VGltZW91dCggZG9TY3JvbGxDaGVjaywgMSApOwoJCXJldHVybjsKCX0KCgkvLyBhbmQgZXhlY3V0ZSBhbnkgd2FpdGluZyBmdW5jdGlvbnMKCWpRdWVyeS5yZWFkeSgpOwp9CgpyZXR1cm4galF1ZXJ5OwoKfSkoKTsKCgp2YXIgLy8gUHJvbWlzZSBtZXRob2RzCglwcm9taXNlTWV0aG9kcyA9ICJkb25lIGZhaWwgaXNSZXNvbHZlZCBpc1JlamVjdGVkIHByb21pc2UgdGhlbiBhbHdheXMgcGlwZSIuc3BsaXQoICIgIiApLAoJLy8gU3RhdGljIHJlZmVyZW5jZSB0byBzbGljZQoJc2xpY2VEZWZlcnJlZCA9IFtdLnNsaWNlOwoKalF1ZXJ5LmV4dGVuZCh7CgkvLyBDcmVhdGUgYSBzaW1wbGUgZGVmZXJyZWQgKG9uZSBjYWxsYmFja3MgbGlzdCkKCV9EZWZlcnJlZDogZnVuY3Rpb24oKSB7CgkJdmFyIC8vIGNhbGxiYWNrcyBsaXN0CgkJCWNhbGxiYWNrcyA9IFtdLAoJCQkvLyBzdG9yZWQgWyBjb250ZXh0ICwgYXJncyBdCgkJCWZpcmVkLAoJCQkvLyB0byBhdm9pZCBmaXJpbmcgd2hlbiBhbHJlYWR5IGRvaW5nIHNvCgkJCWZpcmluZywKCQkJLy8gZmxhZyB0byBrbm93IGlmIHRoZSBkZWZlcnJlZCBoYXMgYmVlbiBjYW5jZWxsZWQKCQkJY2FuY2VsbGVkLAoJCQkvLyB0aGUgZGVmZXJyZWQgaXRzZWxmCgkJCWRlZmVycmVkICA9IHsKCgkJCQkvLyBkb25lKCBmMSwgZjIsIC4uLikKCQkJCWRvbmU6IGZ1bmN0aW9uKCkgewoJCQkJCWlmICggIWNhbmNlbGxlZCApIHsKCQkJCQkJdmFyIGFyZ3MgPSBhcmd1bWVudHMsCgkJCQkJCQlpLAoJCQkJCQkJbGVuZ3RoLAoJCQkJCQkJZWxlbSwKCQkJCQkJCXR5cGUsCgkJCQkJCQlfZmlyZWQ7CgkJCQkJCWlmICggZmlyZWQgKSB7CgkJCQkJCQlfZmlyZWQgPSBmaXJlZDsKCQkJCQkJCWZpcmVkID0gMDsKCQkJCQkJfQoJCQkJCQlmb3IgKCBpID0gMCwgbGVuZ3RoID0gYXJncy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKyApIHsKCQkJCQkJCWVsZW0gPSBhcmdzWyBpIF07CgkJCQkJCQl0eXBlID0galF1ZXJ5LnR5cGUoIGVsZW0gKTsKCQkJCQkJCWlmICggdHlwZSA9PT0gImFycmF5IiApIHsKCQkJCQkJCQlkZWZlcnJlZC5kb25lLmFwcGx5KCBkZWZlcnJlZCwgZWxlbSApOwoJCQkJCQkJfSBlbHNlIGlmICggdHlwZSA9PT0gImZ1bmN0aW9uIiApIHsKCQkJCQkJCQljYWxsYmFja3MucHVzaCggZWxlbSApOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJCWlmICggX2ZpcmVkICkgewoJCQkJCQkJZGVmZXJyZWQucmVzb2x2ZVdpdGgoIF9maXJlZFsgMCBdLCBfZmlyZWRbIDEgXSApOwoJCQkJCQl9CgkJCQkJfQoJCQkJCXJldHVybiB0aGlzOwoJCQkJfSwKCgkJCQkvLyByZXNvbHZlIHdpdGggZ2l2ZW4gY29udGV4dCBhbmQgYXJncwoJCQkJcmVzb2x2ZVdpdGg6IGZ1bmN0aW9uKCBjb250ZXh0LCBhcmdzICkgewoJCQkJCWlmICggIWNhbmNlbGxlZCAmJiAhZmlyZWQgJiYgIWZpcmluZyApIHsKCQkJCQkJLy8gbWFrZSBzdXJlIGFyZ3MgYXJlIGF2YWlsYWJsZSAoIzg0MjEpCgkJCQkJCWFyZ3MgPSBhcmdzIHx8IFtdOwoJCQkJCQlmaXJpbmcgPSAxOwoJCQkJCQl0cnkgewoJCQkJCQkJd2hpbGUoIGNhbGxiYWNrc1sgMCBdICkgewoJCQkJCQkJCWNhbGxiYWNrcy5zaGlmdCgpLmFwcGx5KCBjb250ZXh0LCBhcmdzICk7CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQkJZmluYWxseSB7CgkJCQkJCQlmaXJlZCA9IFsgY29udGV4dCwgYXJncyBdOwoJCQkJCQkJZmlyaW5nID0gMDsKCQkJCQkJfQoJCQkJCX0KCQkJCQlyZXR1cm4gdGhpczsKCQkJCX0sCgoJCQkJLy8gcmVzb2x2ZSB3aXRoIHRoaXMgYXMgY29udGV4dCBhbmQgZ2l2ZW4gYXJndW1lbnRzCgkJCQlyZXNvbHZlOiBmdW5jdGlvbigpIHsKCQkJCQlkZWZlcnJlZC5yZXNvbHZlV2l0aCggdGhpcywgYXJndW1lbnRzICk7CgkJCQkJcmV0dXJuIHRoaXM7CgkJCQl9LAoKCQkJCS8vIEhhcyB0aGlzIGRlZmVycmVkIGJlZW4gcmVzb2x2ZWQ/CgkJCQlpc1Jlc29sdmVkOiBmdW5jdGlvbigpIHsKCQkJCQlyZXR1cm4gISEoIGZpcmluZyB8fCBmaXJlZCApOwoJCQkJfSwKCgkJCQkvLyBDYW5jZWwKCQkJCWNhbmNlbDogZnVuY3Rpb24oKSB7CgkJCQkJY2FuY2VsbGVkID0gMTsKCQkJCQljYWxsYmFja3MgPSBbXTsKCQkJCQlyZXR1cm4gdGhpczsKCQkJCX0KCQkJfTsKCgkJcmV0dXJuIGRlZmVycmVkOwoJfSwKCgkvLyBGdWxsIGZsZWRnZWQgZGVmZXJyZWQgKHR3byBjYWxsYmFja3MgbGlzdCkKCURlZmVycmVkOiBmdW5jdGlvbiggZnVuYyApIHsKCQl2YXIgZGVmZXJyZWQgPSBqUXVlcnkuX0RlZmVycmVkKCksCgkJCWZhaWxEZWZlcnJlZCA9IGpRdWVyeS5fRGVmZXJyZWQoKSwKCQkJcHJvbWlzZTsKCQkvLyBBZGQgZXJyb3JEZWZlcnJlZCBtZXRob2RzLCB0aGVuIGFuZCBwcm9taXNlCgkJalF1ZXJ5LmV4dGVuZCggZGVmZXJyZWQsIHsKCQkJdGhlbjogZnVuY3Rpb24oIGRvbmVDYWxsYmFja3MsIGZhaWxDYWxsYmFja3MgKSB7CgkJCQlkZWZlcnJlZC5kb25lKCBkb25lQ2FsbGJhY2tzICkuZmFpbCggZmFpbENhbGxiYWNrcyApOwoJCQkJcmV0dXJuIHRoaXM7CgkJCX0sCgkJCWFsd2F5czogZnVuY3Rpb24oKSB7CgkJCQlyZXR1cm4gZGVmZXJyZWQuZG9uZS5hcHBseSggZGVmZXJyZWQsIGFyZ3VtZW50cyApLmZhaWwuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApOwoJCQl9LAoJCQlmYWlsOiBmYWlsRGVmZXJyZWQuZG9uZSwKCQkJcmVqZWN0V2l0aDogZmFpbERlZmVycmVkLnJlc29sdmVXaXRoLAoJCQlyZWplY3Q6IGZhaWxEZWZlcnJlZC5yZXNvbHZlLAoJCQlpc1JlamVjdGVkOiBmYWlsRGVmZXJyZWQuaXNSZXNvbHZlZCwKCQkJcGlwZTogZnVuY3Rpb24oIGZuRG9uZSwgZm5GYWlsICkgewoJCQkJcmV0dXJuIGpRdWVyeS5EZWZlcnJlZChmdW5jdGlvbiggbmV3RGVmZXIgKSB7CgkJCQkJalF1ZXJ5LmVhY2goIHsKCQkJCQkJZG9uZTogWyBmbkRvbmUsICJyZXNvbHZlIiBdLAoJCQkJCQlmYWlsOiBbIGZuRmFpbCwgInJlamVjdCIgXQoJCQkJCX0sIGZ1bmN0aW9uKCBoYW5kbGVyLCBkYXRhICkgewoJCQkJCQl2YXIgZm4gPSBkYXRhWyAwIF0sCgkJCQkJCQlhY3Rpb24gPSBkYXRhWyAxIF0sCgkJCQkJCQlyZXR1cm5lZDsKCQkJCQkJaWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggZm4gKSApIHsKCQkJCQkJCWRlZmVycmVkWyBoYW5kbGVyIF0oZnVuY3Rpb24oKSB7CgkJCQkJCQkJcmV0dXJuZWQgPSBmbi5hcHBseSggdGhpcywgYXJndW1lbnRzICk7CgkJCQkJCQkJaWYgKCByZXR1cm5lZCAmJiBqUXVlcnkuaXNGdW5jdGlvbiggcmV0dXJuZWQucHJvbWlzZSApICkgewoJCQkJCQkJCQlyZXR1cm5lZC5wcm9taXNlKCkudGhlbiggbmV3RGVmZXIucmVzb2x2ZSwgbmV3RGVmZXIucmVqZWN0ICk7CgkJCQkJCQkJfSBlbHNlIHsKCQkJCQkJCQkJbmV3RGVmZXJbIGFjdGlvbiArICJXaXRoIiBdKCB0aGlzID09PSBkZWZlcnJlZCA/IG5ld0RlZmVyIDogdGhpcywgWyByZXR1cm5lZCBdICk7CgkJCQkJCQkJfQoJCQkJCQkJfSk7CgkJCQkJCX0gZWxzZSB7CgkJCQkJCQlkZWZlcnJlZFsgaGFuZGxlciBdKCBuZXdEZWZlclsgYWN0aW9uIF0gKTsKCQkJCQkJfQoJCQkJCX0pOwoJCQkJfSkucHJvbWlzZSgpOwoJCQl9LAoJCQkvLyBHZXQgYSBwcm9taXNlIGZvciB0aGlzIGRlZmVycmVkCgkJCS8vIElmIG9iaiBpcyBwcm92aWRlZCwgdGhlIHByb21pc2UgYXNwZWN0IGlzIGFkZGVkIHRvIHRoZSBvYmplY3QKCQkJcHJvbWlzZTogZnVuY3Rpb24oIG9iaiApIHsKCQkJCWlmICggb2JqID09IG51bGwgKSB7CgkJCQkJaWYgKCBwcm9taXNlICkgewoJCQkJCQlyZXR1cm4gcHJvbWlzZTsKCQkJCQl9CgkJCQkJcHJvbWlzZSA9IG9iaiA9IHt9OwoJCQkJfQoJCQkJdmFyIGkgPSBwcm9taXNlTWV0aG9kcy5sZW5ndGg7CgkJCQl3aGlsZSggaS0tICkgewoJCQkJCW9ialsgcHJvbWlzZU1ldGhvZHNbaV0gXSA9IGRlZmVycmVkWyBwcm9taXNlTWV0aG9kc1tpXSBdOwoJCQkJfQoJCQkJcmV0dXJuIG9iajsKCQkJfQoJCX0pOwoJCS8vIE1ha2Ugc3VyZSBvbmx5IG9uZSBjYWxsYmFjayBsaXN0IHdpbGwgYmUgdXNlZAoJCWRlZmVycmVkLmRvbmUoIGZhaWxEZWZlcnJlZC5jYW5jZWwgKS5mYWlsKCBkZWZlcnJlZC5jYW5jZWwgKTsKCQkvLyBVbmV4cG9zZSBjYW5jZWwKCQlkZWxldGUgZGVmZXJyZWQuY2FuY2VsOwoJCS8vIENhbGwgZ2l2ZW4gZnVuYyBpZiBhbnkKCQlpZiAoIGZ1bmMgKSB7CgkJCWZ1bmMuY2FsbCggZGVmZXJyZWQsIGRlZmVycmVkICk7CgkJfQoJCXJldHVybiBkZWZlcnJlZDsKCX0sCgoJLy8gRGVmZXJyZWQgaGVscGVyCgl3aGVuOiBmdW5jdGlvbiggZmlyc3RQYXJhbSApIHsKCQl2YXIgYXJncyA9IGFyZ3VtZW50cywKCQkJaSA9IDAsCgkJCWxlbmd0aCA9IGFyZ3MubGVuZ3RoLAoJCQljb3VudCA9IGxlbmd0aCwKCQkJZGVmZXJyZWQgPSBsZW5ndGggPD0gMSAmJiBmaXJzdFBhcmFtICYmIGpRdWVyeS5pc0Z1bmN0aW9uKCBmaXJzdFBhcmFtLnByb21pc2UgKSA/CgkJCQlmaXJzdFBhcmFtIDoKCQkJCWpRdWVyeS5EZWZlcnJlZCgpOwoJCWZ1bmN0aW9uIHJlc29sdmVGdW5jKCBpICkgewoJCQlyZXR1cm4gZnVuY3Rpb24oIHZhbHVlICkgewoJCQkJYXJnc1sgaSBdID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBzbGljZURlZmVycmVkLmNhbGwoIGFyZ3VtZW50cywgMCApIDogdmFsdWU7CgkJCQlpZiAoICEoIC0tY291bnQgKSApIHsKCQkJCQkvLyBTdHJhbmdlIGJ1ZyBpbiBGRjQ6CgkJCQkJLy8gVmFsdWVzIGNoYW5nZWQgb250byB0aGUgYXJndW1lbnRzIG9iamVjdCBzb21ldGltZXMgZW5kIHVwIGFzIHVuZGVmaW5lZCB2YWx1ZXMKCQkJCQkvLyBvdXRzaWRlIHRoZSAkLndoZW4gbWV0aG9kLiBDbG9uaW5nIHRoZSBvYmplY3QgaW50byBhIGZyZXNoIGFycmF5IHNvbHZlcyB0aGUgaXNzdWUKCQkJCQlkZWZlcnJlZC5yZXNvbHZlV2l0aCggZGVmZXJyZWQsIHNsaWNlRGVmZXJyZWQuY2FsbCggYXJncywgMCApICk7CgkJCQl9CgkJCX07CgkJfQoJCWlmICggbGVuZ3RoID4gMSApIHsKCQkJZm9yKCA7IGkgPCBsZW5ndGg7IGkrKyApIHsKCQkJCWlmICggYXJnc1sgaSBdICYmIGpRdWVyeS5pc0Z1bmN0aW9uKCBhcmdzWyBpIF0ucHJvbWlzZSApICkgewoJCQkJCWFyZ3NbIGkgXS5wcm9taXNlKCkudGhlbiggcmVzb2x2ZUZ1bmMoaSksIGRlZmVycmVkLnJlamVjdCApOwoJCQkJfSBlbHNlIHsKCQkJCQktLWNvdW50OwoJCQkJfQoJCQl9CgkJCWlmICggIWNvdW50ICkgewoJCQkJZGVmZXJyZWQucmVzb2x2ZVdpdGgoIGRlZmVycmVkLCBhcmdzICk7CgkJCX0KCQl9IGVsc2UgaWYgKCBkZWZlcnJlZCAhPT0gZmlyc3RQYXJhbSApIHsKCQkJZGVmZXJyZWQucmVzb2x2ZVdpdGgoIGRlZmVycmVkLCBsZW5ndGggPyBbIGZpcnN0UGFyYW0gXSA6IFtdICk7CgkJfQoJCXJldHVybiBkZWZlcnJlZC5wcm9taXNlKCk7Cgl9Cn0pOwoKCgpqUXVlcnkuc3VwcG9ydCA9IChmdW5jdGlvbigpIHsKCgl2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggImRpdiIgKSwKCQlkb2N1bWVudEVsZW1lbnQgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsCgkJYWxsLAoJCWEsCgkJc2VsZWN0LAoJCW9wdCwKCQlpbnB1dCwKCQltYXJnaW5EaXYsCgkJc3VwcG9ydCwKCQlmcmFnbWVudCwKCQlib2R5LAoJCXRlc3RFbGVtZW50UGFyZW50LAoJCXRlc3RFbGVtZW50LAoJCXRlc3RFbGVtZW50U3R5bGUsCgkJdGRzLAoJCWV2ZW50cywKCQlldmVudE5hbWUsCgkJaSwKCQlpc1N1cHBvcnRlZDsKCgkvLyBQcmVsaW1pbmFyeSB0ZXN0cwoJZGl2LnNldEF0dHJpYnV0ZSgiY2xhc3NOYW1lIiwgInQiKTsKCWRpdi5pbm5lckhUTUwgPSAiICAgPGxpbmsvPjx0YWJsZT48L3RhYmxlPjxhIGhyZWY9Jy9hJyBzdHlsZT0ndG9wOjFweDtmbG9hdDpsZWZ0O29wYWNpdHk6LjU1Oyc+YTwvYT48aW5wdXQgdHlwZT0nY2hlY2tib3gnLz4iOwoKCglhbGwgPSBkaXYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoICIqIiApOwoJYSA9IGRpdi5nZXRFbGVtZW50c0J5VGFnTmFtZSggImEiIClbIDAgXTsKCgkvLyBDYW4ndCBnZXQgYmFzaWMgdGVzdCBzdXBwb3J0CglpZiAoICFhbGwgfHwgIWFsbC5sZW5ndGggfHwgIWEgKSB7CgkJcmV0dXJuIHt9OwoJfQoKCS8vIEZpcnN0IGJhdGNoIG9mIHN1cHBvcnRzIHRlc3RzCglzZWxlY3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAic2VsZWN0IiApOwoJb3B0ID0gc2VsZWN0LmFwcGVuZENoaWxkKCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJvcHRpb24iKSApOwoJaW5wdXQgPSBkaXYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoICJpbnB1dCIgKVsgMCBdOwoKCXN1cHBvcnQgPSB7CgkJLy8gSUUgc3RyaXBzIGxlYWRpbmcgd2hpdGVzcGFjZSB3aGVuIC5pbm5lckhUTUwgaXMgdXNlZAoJCWxlYWRpbmdXaGl0ZXNwYWNlOiAoIGRpdi5maXJzdENoaWxkLm5vZGVUeXBlID09PSAzICksCgoJCS8vIE1ha2Ugc3VyZSB0aGF0IHRib2R5IGVsZW1lbnRzIGFyZW4ndCBhdXRvbWF0aWNhbGx5IGluc2VydGVkCgkJLy8gSUUgd2lsbCBpbnNlcnQgdGhlbSBpbnRvIGVtcHR5IHRhYmxlcwoJCXRib2R5OiAhZGl2LmdldEVsZW1lbnRzQnlUYWdOYW1lKCAidGJvZHkiICkubGVuZ3RoLAoKCQkvLyBNYWtlIHN1cmUgdGhhdCBsaW5rIGVsZW1lbnRzIGdldCBzZXJpYWxpemVkIGNvcnJlY3RseSBieSBpbm5lckhUTUwKCQkvLyBUaGlzIHJlcXVpcmVzIGEgd3JhcHBlciBlbGVtZW50IGluIElFCgkJaHRtbFNlcmlhbGl6ZTogISFkaXYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoICJsaW5rIiApLmxlbmd0aCwKCgkJLy8gR2V0IHRoZSBzdHlsZSBpbmZvcm1hdGlvbiBmcm9tIGdldEF0dHJpYnV0ZQoJCS8vIChJRSB1c2VzIC5jc3NUZXh0IGluc3RlYWQpCgkJc3R5bGU6IC90b3AvLnRlc3QoIGEuZ2V0QXR0cmlidXRlKCJzdHlsZSIpICksCgoJCS8vIE1ha2Ugc3VyZSB0aGF0IFVSTHMgYXJlbid0IG1hbmlwdWxhdGVkCgkJLy8gKElFIG5vcm1hbGl6ZXMgaXQgYnkgZGVmYXVsdCkKCQlocmVmTm9ybWFsaXplZDogKCBhLmdldEF0dHJpYnV0ZSggImhyZWYiICkgPT09ICIvYSIgKSwKCgkJLy8gTWFrZSBzdXJlIHRoYXQgZWxlbWVudCBvcGFjaXR5IGV4aXN0cwoJCS8vIChJRSB1c2VzIGZpbHRlciBpbnN0ZWFkKQoJCS8vIFVzZSBhIHJlZ2V4IHRvIHdvcmsgYXJvdW5kIGEgV2ViS2l0IGlzc3VlLiBTZWUgIzUxNDUKCQlvcGFjaXR5OiAvXjAuNTUkLy50ZXN0KCBhLnN0eWxlLm9wYWNpdHkgKSwKCgkJLy8gVmVyaWZ5IHN0eWxlIGZsb2F0IGV4aXN0ZW5jZQoJCS8vIChJRSB1c2VzIHN0eWxlRmxvYXQgaW5zdGVhZCBvZiBjc3NGbG9hdCkKCQljc3NGbG9hdDogISFhLnN0eWxlLmNzc0Zsb2F0LAoKCQkvLyBNYWtlIHN1cmUgdGhhdCBpZiBubyB2YWx1ZSBpcyBzcGVjaWZpZWQgZm9yIGEgY2hlY2tib3gKCQkvLyB0aGF0IGl0IGRlZmF1bHRzIHRvICJvbiIuCgkJLy8gKFdlYktpdCBkZWZhdWx0cyB0byAiIiBpbnN0ZWFkKQoJCWNoZWNrT246ICggaW5wdXQudmFsdWUgPT09ICJvbiIgKSwKCgkJLy8gTWFrZSBzdXJlIHRoYXQgYSBzZWxlY3RlZC1ieS1kZWZhdWx0IG9wdGlvbiBoYXMgYSB3b3JraW5nIHNlbGVjdGVkIHByb3BlcnR5LgoJCS8vIChXZWJLaXQgZGVmYXVsdHMgdG8gZmFsc2UgaW5zdGVhZCBvZiB0cnVlLCBJRSB0b28sIGlmIGl0J3MgaW4gYW4gb3B0Z3JvdXApCgkJb3B0U2VsZWN0ZWQ6IG9wdC5zZWxlY3RlZCwKCgkJLy8gVGVzdCBzZXRBdHRyaWJ1dGUgb24gY2FtZWxDYXNlIGNsYXNzLiBJZiBpdCB3b3Jrcywgd2UgbmVlZCBhdHRyRml4ZXMgd2hlbiBkb2luZyBnZXQvc2V0QXR0cmlidXRlIChpZTYvNykKCQlnZXRTZXRBdHRyaWJ1dGU6IGRpdi5jbGFzc05hbWUgIT09ICJ0IiwKCgkJLy8gV2lsbCBiZSBkZWZpbmVkIGxhdGVyCgkJc3VibWl0QnViYmxlczogdHJ1ZSwKCQljaGFuZ2VCdWJibGVzOiB0cnVlLAoJCWZvY3VzaW5CdWJibGVzOiBmYWxzZSwKCQlkZWxldGVFeHBhbmRvOiB0cnVlLAoJCW5vQ2xvbmVFdmVudDogdHJ1ZSwKCQlpbmxpbmVCbG9ja05lZWRzTGF5b3V0OiBmYWxzZSwKCQlzaHJpbmtXcmFwQmxvY2tzOiBmYWxzZSwKCQlyZWxpYWJsZU1hcmdpblJpZ2h0OiB0cnVlCgl9OwoKCS8vIE1ha2Ugc3VyZSBjaGVja2VkIHN0YXR1cyBpcyBwcm9wZXJseSBjbG9uZWQKCWlucHV0LmNoZWNrZWQgPSB0cnVlOwoJc3VwcG9ydC5ub0Nsb25lQ2hlY2tlZCA9IGlucHV0LmNsb25lTm9kZSggdHJ1ZSApLmNoZWNrZWQ7CgoJLy8gTWFrZSBzdXJlIHRoYXQgdGhlIG9wdGlvbnMgaW5zaWRlIGRpc2FibGVkIHNlbGVjdHMgYXJlbid0IG1hcmtlZCBhcyBkaXNhYmxlZAoJLy8gKFdlYktpdCBtYXJrcyB0aGVtIGFzIGRpc2FibGVkKQoJc2VsZWN0LmRpc2FibGVkID0gdHJ1ZTsKCXN1cHBvcnQub3B0RGlzYWJsZWQgPSAhb3B0LmRpc2FibGVkOwoKCS8vIFRlc3QgdG8gc2VlIGlmIGl0J3MgcG9zc2libGUgdG8gZGVsZXRlIGFuIGV4cGFuZG8gZnJvbSBhbiBlbGVtZW50CgkvLyBGYWlscyBpbiBJbnRlcm5ldCBFeHBsb3JlcgoJdHJ5IHsKCQlkZWxldGUgZGl2LnRlc3Q7Cgl9IGNhdGNoKCBlICkgewoJCXN1cHBvcnQuZGVsZXRlRXhwYW5kbyA9IGZhbHNlOwoJfQoKCWlmICggIWRpdi5hZGRFdmVudExpc3RlbmVyICYmIGRpdi5hdHRhY2hFdmVudCAmJiBkaXYuZmlyZUV2ZW50ICkgewoJCWRpdi5hdHRhY2hFdmVudCggIm9uY2xpY2siLCBmdW5jdGlvbigpIHsKCQkJLy8gQ2xvbmluZyBhIG5vZGUgc2hvdWxkbid0IGNvcHkgb3ZlciBhbnkKCQkJLy8gYm91bmQgZXZlbnQgaGFuZGxlcnMgKElFIGRvZXMgdGhpcykKCQkJc3VwcG9ydC5ub0Nsb25lRXZlbnQgPSBmYWxzZTsKCQl9KTsKCQlkaXYuY2xvbmVOb2RlKCB0cnVlICkuZmlyZUV2ZW50KCAib25jbGljayIgKTsKCX0KCgkvLyBDaGVjayBpZiBhIHJhZGlvIG1haW50YWlucyBpdCdzIHZhbHVlCgkvLyBhZnRlciBiZWluZyBhcHBlbmRlZCB0byB0aGUgRE9NCglpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlucHV0Iik7CglpbnB1dC52YWx1ZSA9ICJ0IjsKCWlucHV0LnNldEF0dHJpYnV0ZSgidHlwZSIsICJyYWRpbyIpOwoJc3VwcG9ydC5yYWRpb1ZhbHVlID0gaW5wdXQudmFsdWUgPT09ICJ0IjsKCglpbnB1dC5zZXRBdHRyaWJ1dGUoImNoZWNrZWQiLCAiY2hlY2tlZCIpOwoJZGl2LmFwcGVuZENoaWxkKCBpbnB1dCApOwoJZnJhZ21lbnQgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7CglmcmFnbWVudC5hcHBlbmRDaGlsZCggZGl2LmZpcnN0Q2hpbGQgKTsKCgkvLyBXZWJLaXQgZG9lc24ndCBjbG9uZSBjaGVja2VkIHN0YXRlIGNvcnJlY3RseSBpbiBmcmFnbWVudHMKCXN1cHBvcnQuY2hlY2tDbG9uZSA9IGZyYWdtZW50LmNsb25lTm9kZSggdHJ1ZSApLmNsb25lTm9kZSggdHJ1ZSApLmxhc3RDaGlsZC5jaGVja2VkOwoKCWRpdi5pbm5lckhUTUwgPSAiIjsKCgkvLyBGaWd1cmUgb3V0IGlmIHRoZSBXM0MgYm94IG1vZGVsIHdvcmtzIGFzIGV4cGVjdGVkCglkaXYuc3R5bGUud2lkdGggPSBkaXYuc3R5bGUucGFkZGluZ0xlZnQgPSAiMXB4IjsKCglib2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoICJib2R5IiApWyAwIF07CgkvLyBXZSB1c2Ugb3VyIG93biwgaW52aXNpYmxlLCBib2R5IHVubGVzcyB0aGUgYm9keSBpcyBhbHJlYWR5IHByZXNlbnQKCS8vIGluIHdoaWNoIGNhc2Ugd2UgdXNlIGEgZGl2ICgjOTIzOSkKCXRlc3RFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggYm9keSA/ICJkaXYiIDogImJvZHkiICk7Cgl0ZXN0RWxlbWVudFN0eWxlID0gewoJCXZpc2liaWxpdHk6ICJoaWRkZW4iLAoJCXdpZHRoOiAwLAoJCWhlaWdodDogMCwKCQlib3JkZXI6IDAsCgkJbWFyZ2luOiAwLAoJCWJhY2tncm91bmQ6ICJub25lIgoJfTsKCWlmICggYm9keSApIHsKCQlqUXVlcnkuZXh0ZW5kKCB0ZXN0RWxlbWVudFN0eWxlLCB7CgkJCXBvc2l0aW9uOiAiYWJzb2x1dGUiLAoJCQlsZWZ0OiAiLTEwMDBweCIsCgkJCXRvcDogIi0xMDAwcHgiCgkJfSk7Cgl9Cglmb3IgKCBpIGluIHRlc3RFbGVtZW50U3R5bGUgKSB7CgkJdGVzdEVsZW1lbnQuc3R5bGVbIGkgXSA9IHRlc3RFbGVtZW50U3R5bGVbIGkgXTsKCX0KCXRlc3RFbGVtZW50LmFwcGVuZENoaWxkKCBkaXYgKTsKCXRlc3RFbGVtZW50UGFyZW50ID0gYm9keSB8fCBkb2N1bWVudEVsZW1lbnQ7Cgl0ZXN0RWxlbWVudFBhcmVudC5pbnNlcnRCZWZvcmUoIHRlc3RFbGVtZW50LCB0ZXN0RWxlbWVudFBhcmVudC5maXJzdENoaWxkICk7CgoJLy8gQ2hlY2sgaWYgYSBkaXNjb25uZWN0ZWQgY2hlY2tib3ggd2lsbCByZXRhaW4gaXRzIGNoZWNrZWQKCS8vIHZhbHVlIG9mIHRydWUgYWZ0ZXIgYXBwZW5kZWQgdG8gdGhlIERPTSAoSUU2LzcpCglzdXBwb3J0LmFwcGVuZENoZWNrZWQgPSBpbnB1dC5jaGVja2VkOwoKCXN1cHBvcnQuYm94TW9kZWwgPSBkaXYub2Zmc2V0V2lkdGggPT09IDI7CgoJaWYgKCAiem9vbSIgaW4gZGl2LnN0eWxlICkgewoJCS8vIENoZWNrIGlmIG5hdGl2ZWx5IGJsb2NrLWxldmVsIGVsZW1lbnRzIGFjdCBsaWtlIGlubGluZS1ibG9jawoJCS8vIGVsZW1lbnRzIHdoZW4gc2V0dGluZyB0aGVpciBkaXNwbGF5IHRvICdpbmxpbmUnIGFuZCBnaXZpbmcKCQkvLyB0aGVtIGxheW91dAoJCS8vIChJRSA8IDggZG9lcyB0aGlzKQoJCWRpdi5zdHlsZS5kaXNwbGF5ID0gImlubGluZSI7CgkJZGl2LnN0eWxlLnpvb20gPSAxOwoJCXN1cHBvcnQuaW5saW5lQmxvY2tOZWVkc0xheW91dCA9ICggZGl2Lm9mZnNldFdpZHRoID09PSAyICk7CgoJCS8vIENoZWNrIGlmIGVsZW1lbnRzIHdpdGggbGF5b3V0IHNocmluay13cmFwIHRoZWlyIGNoaWxkcmVuCgkJLy8gKElFIDYgZG9lcyB0aGlzKQoJCWRpdi5zdHlsZS5kaXNwbGF5ID0gIiI7CgkJZGl2LmlubmVySFRNTCA9ICI8ZGl2IHN0eWxlPSd3aWR0aDo0cHg7Jz48L2Rpdj4iOwoJCXN1cHBvcnQuc2hyaW5rV3JhcEJsb2NrcyA9ICggZGl2Lm9mZnNldFdpZHRoICE9PSAyICk7Cgl9CgoJZGl2LmlubmVySFRNTCA9ICI8dGFibGU+PHRyPjx0ZCBzdHlsZT0ncGFkZGluZzowO2JvcmRlcjowO2Rpc3BsYXk6bm9uZSc+PC90ZD48dGQ+dDwvdGQ+PC90cj48L3RhYmxlPiI7Cgl0ZHMgPSBkaXYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoICJ0ZCIgKTsKCgkvLyBDaGVjayBpZiB0YWJsZSBjZWxscyBzdGlsbCBoYXZlIG9mZnNldFdpZHRoL0hlaWdodCB3aGVuIHRoZXkgYXJlIHNldAoJLy8gdG8gZGlzcGxheTpub25lIGFuZCB0aGVyZSBhcmUgc3RpbGwgb3RoZXIgdmlzaWJsZSB0YWJsZSBjZWxscyBpbiBhCgkvLyB0YWJsZSByb3c7IGlmIHNvLCBvZmZzZXRXaWR0aC9IZWlnaHQgYXJlIG5vdCByZWxpYWJsZSBmb3IgdXNlIHdoZW4KCS8vIGRldGVybWluaW5nIGlmIGFuIGVsZW1lbnQgaGFzIGJlZW4gaGlkZGVuIGRpcmVjdGx5IHVzaW5nCgkvLyBkaXNwbGF5Om5vbmUgKGl0IGlzIHN0aWxsIHNhZmUgdG8gdXNlIG9mZnNldHMgaWYgYSBwYXJlbnQgZWxlbWVudCBpcwoJLy8gaGlkZGVuOyBkb24gc2FmZXR5IGdvZ2dsZXMgYW5kIHNlZSBidWcgIzQ1MTIgZm9yIG1vcmUgaW5mb3JtYXRpb24pLgoJLy8gKG9ubHkgSUUgOCBmYWlscyB0aGlzIHRlc3QpCglpc1N1cHBvcnRlZCA9ICggdGRzWyAwIF0ub2Zmc2V0SGVpZ2h0ID09PSAwICk7CgoJdGRzWyAwIF0uc3R5bGUuZGlzcGxheSA9ICIiOwoJdGRzWyAxIF0uc3R5bGUuZGlzcGxheSA9ICJub25lIjsKCgkvLyBDaGVjayBpZiBlbXB0eSB0YWJsZSBjZWxscyBzdGlsbCBoYXZlIG9mZnNldFdpZHRoL0hlaWdodAoJLy8gKElFIDwgOCBmYWlsIHRoaXMgdGVzdCkKCXN1cHBvcnQucmVsaWFibGVIaWRkZW5PZmZzZXRzID0gaXNTdXBwb3J0ZWQgJiYgKCB0ZHNbIDAgXS5vZmZzZXRIZWlnaHQgPT09IDAgKTsKCWRpdi5pbm5lckhUTUwgPSAiIjsKCgkvLyBDaGVjayBpZiBkaXYgd2l0aCBleHBsaWNpdCB3aWR0aCBhbmQgbm8gbWFyZ2luLXJpZ2h0IGluY29ycmVjdGx5CgkvLyBnZXRzIGNvbXB1dGVkIG1hcmdpbi1yaWdodCBiYXNlZCBvbiB3aWR0aCBvZiBjb250YWluZXIuIEZvciBtb3JlCgkvLyBpbmZvIHNlZSBidWcgIzMzMzMKCS8vIEZhaWxzIGluIFdlYktpdCBiZWZvcmUgRmViIDIwMTEgbmlnaHRsaWVzCgkvLyBXZWJLaXQgQnVnIDEzMzQzIC0gZ2V0Q29tcHV0ZWRTdHlsZSByZXR1cm5zIHdyb25nIHZhbHVlIGZvciBtYXJnaW4tcmlnaHQKCWlmICggZG9jdW1lbnQuZGVmYXVsdFZpZXcgJiYgZG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSApIHsKCQltYXJnaW5EaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAiZGl2IiApOwoJCW1hcmdpbkRpdi5zdHlsZS53aWR0aCA9ICIwIjsKCQltYXJnaW5EaXYuc3R5bGUubWFyZ2luUmlnaHQgPSAiMCI7CgkJZGl2LmFwcGVuZENoaWxkKCBtYXJnaW5EaXYgKTsKCQlzdXBwb3J0LnJlbGlhYmxlTWFyZ2luUmlnaHQgPQoJCQkoIHBhcnNlSW50KCAoIGRvY3VtZW50LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUoIG1hcmdpbkRpdiwgbnVsbCApIHx8IHsgbWFyZ2luUmlnaHQ6IDAgfSApLm1hcmdpblJpZ2h0LCAxMCApIHx8IDAgKSA9PT0gMDsKCX0KCgkvLyBSZW1vdmUgdGhlIGJvZHkgZWxlbWVudCB3ZSBhZGRlZAoJdGVzdEVsZW1lbnQuaW5uZXJIVE1MID0gIiI7Cgl0ZXN0RWxlbWVudFBhcmVudC5yZW1vdmVDaGlsZCggdGVzdEVsZW1lbnQgKTsKCgkvLyBUZWNobmlxdWUgZnJvbSBKdXJpeSBaYXl0c2V2CgkvLyBodHRwOi8vdGhpbmt3ZWIyLmNvbS9wcm9qZWN0cy9wcm90b3R5cGUvZGV0ZWN0aW5nLWV2ZW50LXN1cHBvcnQtd2l0aG91dC1icm93c2VyLXNuaWZmaW5nLwoJLy8gV2Ugb25seSBjYXJlIGFib3V0IHRoZSBjYXNlIHdoZXJlIG5vbi1zdGFuZGFyZCBldmVudCBzeXN0ZW1zCgkvLyBhcmUgdXNlZCwgbmFtZWx5IGluIElFLiBTaG9ydC1jaXJjdWl0aW5nIGhlcmUgaGVscHMgdXMgdG8KCS8vIGF2b2lkIGFuIGV2YWwgY2FsbCAoaW4gc2V0QXR0cmlidXRlKSB3aGljaCBjYW4gY2F1c2UgQ1NQCgkvLyB0byBnbyBoYXl3aXJlLiBTZWU6IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL1NlY3VyaXR5L0NTUAoJaWYgKCBkaXYuYXR0YWNoRXZlbnQgKSB7CgkJZm9yKCBpIGluIHsKCQkJc3VibWl0OiAxLAoJCQljaGFuZ2U6IDEsCgkJCWZvY3VzaW46IDEKCQl9ICkgewoJCQlldmVudE5hbWUgPSAib24iICsgaTsKCQkJaXNTdXBwb3J0ZWQgPSAoIGV2ZW50TmFtZSBpbiBkaXYgKTsKCQkJaWYgKCAhaXNTdXBwb3J0ZWQgKSB7CgkJCQlkaXYuc2V0QXR0cmlidXRlKCBldmVudE5hbWUsICJyZXR1cm47IiApOwoJCQkJaXNTdXBwb3J0ZWQgPSAoIHR5cGVvZiBkaXZbIGV2ZW50TmFtZSBdID09PSAiZnVuY3Rpb24iICk7CgkJCX0KCQkJc3VwcG9ydFsgaSArICJCdWJibGVzIiBdID0gaXNTdXBwb3J0ZWQ7CgkJfQoJfQoKCS8vIE51bGwgY29ubmVjdGVkIGVsZW1lbnRzIHRvIGF2b2lkIGxlYWtzIGluIElFCgl0ZXN0RWxlbWVudCA9IGZyYWdtZW50ID0gc2VsZWN0ID0gb3B0ID0gYm9keSA9IG1hcmdpbkRpdiA9IGRpdiA9IGlucHV0ID0gbnVsbDsKCglyZXR1cm4gc3VwcG9ydDsKfSkoKTsKCi8vIEtlZXAgdHJhY2sgb2YgYm94TW9kZWwKalF1ZXJ5LmJveE1vZGVsID0galF1ZXJ5LnN1cHBvcnQuYm94TW9kZWw7CgoKCgp2YXIgcmJyYWNlID0gL14oPzpcey4qXH18XFsuKlxdKSQvLAoJcm11bHRpRGFzaCA9IC8oW0EtWl0pL2c7CgpqUXVlcnkuZXh0ZW5kKHsKCWNhY2hlOiB7fSwKCgkvLyBQbGVhc2UgdXNlIHdpdGggY2F1dGlvbgoJdXVpZDogMCwKCgkvLyBVbmlxdWUgZm9yIGVhY2ggY29weSBvZiBqUXVlcnkgb24gdGhlIHBhZ2UKCS8vIE5vbi1kaWdpdHMgcmVtb3ZlZCB0byBtYXRjaCByaW5saW5lalF1ZXJ5CglleHBhbmRvOiAialF1ZXJ5IiArICggalF1ZXJ5LmZuLmpxdWVyeSArIE1hdGgucmFuZG9tKCkgKS5yZXBsYWNlKCAvXEQvZywgIiIgKSwKCgkvLyBUaGUgZm9sbG93aW5nIGVsZW1lbnRzIHRocm93IHVuY2F0Y2hhYmxlIGV4Y2VwdGlvbnMgaWYgeW91CgkvLyBhdHRlbXB0IHRvIGFkZCBleHBhbmRvIHByb3BlcnRpZXMgdG8gdGhlbS4KCW5vRGF0YTogewoJCSJlbWJlZCI6IHRydWUsCgkJLy8gQmFuIGFsbCBvYmplY3RzIGV4Y2VwdCBmb3IgRmxhc2ggKHdoaWNoIGhhbmRsZSBleHBhbmRvcykKCQkib2JqZWN0IjogImNsc2lkOkQyN0NEQjZFLUFFNkQtMTFjZi05NkI4LTQ0NDU1MzU0MDAwMCIsCgkJImFwcGxldCI6IHRydWUKCX0sCgoJaGFzRGF0YTogZnVuY3Rpb24oIGVsZW0gKSB7CgkJZWxlbSA9IGVsZW0ubm9kZVR5cGUgPyBqUXVlcnkuY2FjaGVbIGVsZW1balF1ZXJ5LmV4cGFuZG9dIF0gOiBlbGVtWyBqUXVlcnkuZXhwYW5kbyBdOwoKCQlyZXR1cm4gISFlbGVtICYmICFpc0VtcHR5RGF0YU9iamVjdCggZWxlbSApOwoJfSwKCglkYXRhOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgZGF0YSwgcHZ0IC8qIEludGVybmFsIFVzZSBPbmx5ICovICkgewoJCWlmICggIWpRdWVyeS5hY2NlcHREYXRhKCBlbGVtICkgKSB7CgkJCXJldHVybjsKCQl9CgoJCXZhciB0aGlzQ2FjaGUsIHJldCwKCQkJaW50ZXJuYWxLZXkgPSBqUXVlcnkuZXhwYW5kbywKCQkJZ2V0QnlOYW1lID0gdHlwZW9mIG5hbWUgPT09ICJzdHJpbmciLAoKCQkJLy8gV2UgaGF2ZSB0byBoYW5kbGUgRE9NIG5vZGVzIGFuZCBKUyBvYmplY3RzIGRpZmZlcmVudGx5IGJlY2F1c2UgSUU2LTcKCQkJLy8gY2FuJ3QgR0Mgb2JqZWN0IHJlZmVyZW5jZXMgcHJvcGVybHkgYWNyb3NzIHRoZSBET00tSlMgYm91bmRhcnkKCQkJaXNOb2RlID0gZWxlbS5ub2RlVHlwZSwKCgkJCS8vIE9ubHkgRE9NIG5vZGVzIG5lZWQgdGhlIGdsb2JhbCBqUXVlcnkgY2FjaGU7IEpTIG9iamVjdCBkYXRhIGlzCgkJCS8vIGF0dGFjaGVkIGRpcmVjdGx5IHRvIHRoZSBvYmplY3Qgc28gR0MgY2FuIG9jY3VyIGF1dG9tYXRpY2FsbHkKCQkJY2FjaGUgPSBpc05vZGUgPyBqUXVlcnkuY2FjaGUgOiBlbGVtLAoKCQkJLy8gT25seSBkZWZpbmluZyBhbiBJRCBmb3IgSlMgb2JqZWN0cyBpZiBpdHMgY2FjaGUgYWxyZWFkeSBleGlzdHMgYWxsb3dzCgkJCS8vIHRoZSBjb2RlIHRvIHNob3J0Y3V0IG9uIHRoZSBzYW1lIHBhdGggYXMgYSBET00gbm9kZSB3aXRoIG5vIGNhY2hlCgkJCWlkID0gaXNOb2RlID8gZWxlbVsgalF1ZXJ5LmV4cGFuZG8gXSA6IGVsZW1bIGpRdWVyeS5leHBhbmRvIF0gJiYgalF1ZXJ5LmV4cGFuZG87CgoJCS8vIEF2b2lkIGRvaW5nIGFueSBtb3JlIHdvcmsgdGhhbiB3ZSBuZWVkIHRvIHdoZW4gdHJ5aW5nIHRvIGdldCBkYXRhIG9uIGFuCgkJLy8gb2JqZWN0IHRoYXQgaGFzIG5vIGRhdGEgYXQgYWxsCgkJaWYgKCAoIWlkIHx8IChwdnQgJiYgaWQgJiYgKGNhY2hlWyBpZCBdICYmICFjYWNoZVsgaWQgXVsgaW50ZXJuYWxLZXkgXSkpKSAmJiBnZXRCeU5hbWUgJiYgZGF0YSA9PT0gdW5kZWZpbmVkICkgewoJCQlyZXR1cm47CgkJfQoKCQlpZiAoICFpZCApIHsKCQkJLy8gT25seSBET00gbm9kZXMgbmVlZCBhIG5ldyB1bmlxdWUgSUQgZm9yIGVhY2ggZWxlbWVudCBzaW5jZSB0aGVpciBkYXRhCgkJCS8vIGVuZHMgdXAgaW4gdGhlIGdsb2JhbCBjYWNoZQoJCQlpZiAoIGlzTm9kZSApIHsKCQkJCWVsZW1bIGpRdWVyeS5leHBhbmRvIF0gPSBpZCA9ICsralF1ZXJ5LnV1aWQ7CgkJCX0gZWxzZSB7CgkJCQlpZCA9IGpRdWVyeS5leHBhbmRvOwoJCQl9CgkJfQoKCQlpZiAoICFjYWNoZVsgaWQgXSApIHsKCQkJY2FjaGVbIGlkIF0gPSB7fTsKCgkJCS8vIFRPRE86IFRoaXMgaXMgYSBoYWNrIGZvciAxLjUgT05MWS4gQXZvaWRzIGV4cG9zaW5nIGpRdWVyeQoJCQkvLyBtZXRhZGF0YSBvbiBwbGFpbiBKUyBvYmplY3RzIHdoZW4gdGhlIG9iamVjdCBpcyBzZXJpYWxpemVkIHVzaW5nCgkJCS8vIEpTT04uc3RyaW5naWZ5CgkJCWlmICggIWlzTm9kZSApIHsKCQkJCWNhY2hlWyBpZCBdLnRvSlNPTiA9IGpRdWVyeS5ub29wOwoJCQl9CgkJfQoKCQkvLyBBbiBvYmplY3QgY2FuIGJlIHBhc3NlZCB0byBqUXVlcnkuZGF0YSBpbnN0ZWFkIG9mIGEga2V5L3ZhbHVlIHBhaXI7IHRoaXMgZ2V0cwoJCS8vIHNoYWxsb3cgY29waWVkIG92ZXIgb250byB0aGUgZXhpc3RpbmcgY2FjaGUKCQlpZiAoIHR5cGVvZiBuYW1lID09PSAib2JqZWN0IiB8fCB0eXBlb2YgbmFtZSA9PT0gImZ1bmN0aW9uIiApIHsKCQkJaWYgKCBwdnQgKSB7CgkJCQljYWNoZVsgaWQgXVsgaW50ZXJuYWxLZXkgXSA9IGpRdWVyeS5leHRlbmQoY2FjaGVbIGlkIF1bIGludGVybmFsS2V5IF0sIG5hbWUpOwoJCQl9IGVsc2UgewoJCQkJY2FjaGVbIGlkIF0gPSBqUXVlcnkuZXh0ZW5kKGNhY2hlWyBpZCBdLCBuYW1lKTsKCQkJfQoJCX0KCgkJdGhpc0NhY2hlID0gY2FjaGVbIGlkIF07CgoJCS8vIEludGVybmFsIGpRdWVyeSBkYXRhIGlzIHN0b3JlZCBpbiBhIHNlcGFyYXRlIG9iamVjdCBpbnNpZGUgdGhlIG9iamVjdCdzIGRhdGEKCQkvLyBjYWNoZSBpbiBvcmRlciB0byBhdm9pZCBrZXkgY29sbGlzaW9ucyBiZXR3ZWVuIGludGVybmFsIGRhdGEgYW5kIHVzZXItZGVmaW5lZAoJCS8vIGRhdGEKCQlpZiAoIHB2dCApIHsKCQkJaWYgKCAhdGhpc0NhY2hlWyBpbnRlcm5hbEtleSBdICkgewoJCQkJdGhpc0NhY2hlWyBpbnRlcm5hbEtleSBdID0ge307CgkJCX0KCgkJCXRoaXNDYWNoZSA9IHRoaXNDYWNoZVsgaW50ZXJuYWxLZXkgXTsKCQl9CgoJCWlmICggZGF0YSAhPT0gdW5kZWZpbmVkICkgewoJCQl0aGlzQ2FjaGVbIGpRdWVyeS5jYW1lbENhc2UoIG5hbWUgKSBdID0gZGF0YTsKCQl9CgoJCS8vIFRPRE86IFRoaXMgaXMgYSBoYWNrIGZvciAxLjUgT05MWS4gSXQgd2lsbCBiZSByZW1vdmVkIGluIDEuNi4gVXNlcnMgc2hvdWxkCgkJLy8gbm90IGF0dGVtcHQgdG8gaW5zcGVjdCB0aGUgaW50ZXJuYWwgZXZlbnRzIG9iamVjdCB1c2luZyBqUXVlcnkuZGF0YSwgYXMgdGhpcwoJCS8vIGludGVybmFsIGRhdGEgb2JqZWN0IGlzIHVuZG9jdW1lbnRlZCBhbmQgc3ViamVjdCB0byBjaGFuZ2UuCgkJaWYgKCBuYW1lID09PSAiZXZlbnRzIiAmJiAhdGhpc0NhY2hlW25hbWVdICkgewoJCQlyZXR1cm4gdGhpc0NhY2hlWyBpbnRlcm5hbEtleSBdICYmIHRoaXNDYWNoZVsgaW50ZXJuYWxLZXkgXS5ldmVudHM7CgkJfQoKCQkvLyBDaGVjayBmb3IgYm90aCBjb252ZXJ0ZWQtdG8tY2FtZWwgYW5kIG5vbi1jb252ZXJ0ZWQgZGF0YSBwcm9wZXJ0eSBuYW1lcwoJCS8vIElmIGEgZGF0YSBwcm9wZXJ0eSB3YXMgc3BlY2lmaWVkCgkJaWYgKCBnZXRCeU5hbWUgKSB7CgoJCQkvLyBGaXJzdCBUcnkgdG8gZmluZCBhcy1pcyBwcm9wZXJ0eSBkYXRhCgkJCXJldCA9IHRoaXNDYWNoZVsgbmFtZSBdOwoKCQkJLy8gVGVzdCBmb3IgbnVsbHx1bmRlZmluZWQgcHJvcGVydHkgZGF0YQoJCQlpZiAoIHJldCA9PSBudWxsICkgewoKCQkJCS8vIFRyeSB0byBmaW5kIHRoZSBjYW1lbENhc2VkIHByb3BlcnR5CgkJCQlyZXQgPSB0aGlzQ2FjaGVbIGpRdWVyeS5jYW1lbENhc2UoIG5hbWUgKSBdOwoJCQl9CgkJfSBlbHNlIHsKCQkJcmV0ID0gdGhpc0NhY2hlOwoJCX0KCgkJcmV0dXJuIHJldDsKCX0sCgoJcmVtb3ZlRGF0YTogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIHB2dCAvKiBJbnRlcm5hbCBVc2UgT25seSAqLyApIHsKCQlpZiAoICFqUXVlcnkuYWNjZXB0RGF0YSggZWxlbSApICkgewoJCQlyZXR1cm47CgkJfQoKCQl2YXIgdGhpc0NhY2hlLAoKCQkJLy8gUmVmZXJlbmNlIHRvIGludGVybmFsIGRhdGEgY2FjaGUga2V5CgkJCWludGVybmFsS2V5ID0galF1ZXJ5LmV4cGFuZG8sCgoJCQlpc05vZGUgPSBlbGVtLm5vZGVUeXBlLAoKCQkJLy8gU2VlIGpRdWVyeS5kYXRhIGZvciBtb3JlIGluZm9ybWF0aW9uCgkJCWNhY2hlID0gaXNOb2RlID8galF1ZXJ5LmNhY2hlIDogZWxlbSwKCgkJCS8vIFNlZSBqUXVlcnkuZGF0YSBmb3IgbW9yZSBpbmZvcm1hdGlvbgoJCQlpZCA9IGlzTm9kZSA/IGVsZW1bIGpRdWVyeS5leHBhbmRvIF0gOiBqUXVlcnkuZXhwYW5kbzsKCgkJLy8gSWYgdGhlcmUgaXMgYWxyZWFkeSBubyBjYWNoZSBlbnRyeSBmb3IgdGhpcyBvYmplY3QsIHRoZXJlIGlzIG5vCgkJLy8gcHVycG9zZSBpbiBjb250aW51aW5nCgkJaWYgKCAhY2FjaGVbIGlkIF0gKSB7CgkJCXJldHVybjsKCQl9CgoJCWlmICggbmFtZSApIHsKCgkJCXRoaXNDYWNoZSA9IHB2dCA/IGNhY2hlWyBpZCBdWyBpbnRlcm5hbEtleSBdIDogY2FjaGVbIGlkIF07CgoJCQlpZiAoIHRoaXNDYWNoZSApIHsKCgkJCQkvLyBTdXBwb3J0IGludGVyb3BlcmFibGUgcmVtb3ZhbCBvZiBoeXBoZW5hdGVkIG9yIGNhbWVsY2FzZWQga2V5cwoJCQkJaWYgKCAhdGhpc0NhY2hlWyBuYW1lIF0gKSB7CgkJCQkJbmFtZSA9IGpRdWVyeS5jYW1lbENhc2UoIG5hbWUgKTsKCQkJCX0KCgkJCQlkZWxldGUgdGhpc0NhY2hlWyBuYW1lIF07CgoJCQkJLy8gSWYgdGhlcmUgaXMgbm8gZGF0YSBsZWZ0IGluIHRoZSBjYWNoZSwgd2Ugd2FudCB0byBjb250aW51ZQoJCQkJLy8gYW5kIGxldCB0aGUgY2FjaGUgb2JqZWN0IGl0c2VsZiBnZXQgZGVzdHJveWVkCgkJCQlpZiAoICFpc0VtcHR5RGF0YU9iamVjdCh0aGlzQ2FjaGUpICkgewoJCQkJCXJldHVybjsKCQkJCX0KCQkJfQoJCX0KCgkJLy8gU2VlIGpRdWVyeS5kYXRhIGZvciBtb3JlIGluZm9ybWF0aW9uCgkJaWYgKCBwdnQgKSB7CgkJCWRlbGV0ZSBjYWNoZVsgaWQgXVsgaW50ZXJuYWxLZXkgXTsKCgkJCS8vIERvbid0IGRlc3Ryb3kgdGhlIHBhcmVudCBjYWNoZSB1bmxlc3MgdGhlIGludGVybmFsIGRhdGEgb2JqZWN0CgkJCS8vIGhhZCBiZWVuIHRoZSBvbmx5IHRoaW5nIGxlZnQgaW4gaXQKCQkJaWYgKCAhaXNFbXB0eURhdGFPYmplY3QoY2FjaGVbIGlkIF0pICkgewoJCQkJcmV0dXJuOwoJCQl9CgkJfQoKCQl2YXIgaW50ZXJuYWxDYWNoZSA9IGNhY2hlWyBpZCBdWyBpbnRlcm5hbEtleSBdOwoKCQkvLyBCcm93c2VycyB0aGF0IGZhaWwgZXhwYW5kbyBkZWxldGlvbiBhbHNvIHJlZnVzZSB0byBkZWxldGUgZXhwYW5kb3Mgb24KCQkvLyB0aGUgd2luZG93LCBidXQgaXQgd2lsbCBhbGxvdyBpdCBvbiBhbGwgb3RoZXIgSlMgb2JqZWN0czsgb3RoZXIgYnJvd3NlcnMKCQkvLyBkb24ndCBjYXJlCgkJLy8gRW5zdXJlIHRoYXQgYGNhY2hlYCBpcyBub3QgYSB3aW5kb3cgb2JqZWN0ICMxMDA4MAoJCWlmICggalF1ZXJ5LnN1cHBvcnQuZGVsZXRlRXhwYW5kbyB8fCAhY2FjaGUuc2V0SW50ZXJ2YWwgKSB7CgkJCWRlbGV0ZSBjYWNoZVsgaWQgXTsKCQl9IGVsc2UgewoJCQljYWNoZVsgaWQgXSA9IG51bGw7CgkJfQoKCQkvLyBXZSBkZXN0cm95ZWQgdGhlIGVudGlyZSB1c2VyIGNhY2hlIGF0IG9uY2UgYmVjYXVzZSBpdCdzIGZhc3RlciB0aGFuCgkJLy8gaXRlcmF0aW5nIHRocm91Z2ggZWFjaCBrZXksIGJ1dCB3ZSBuZWVkIHRvIGNvbnRpbnVlIHRvIHBlcnNpc3QgaW50ZXJuYWwKCQkvLyBkYXRhIGlmIGl0IGV4aXN0ZWQKCQlpZiAoIGludGVybmFsQ2FjaGUgKSB7CgkJCWNhY2hlWyBpZCBdID0ge307CgkJCS8vIFRPRE86IFRoaXMgaXMgYSBoYWNrIGZvciAxLjUgT05MWS4gQXZvaWRzIGV4cG9zaW5nIGpRdWVyeQoJCQkvLyBtZXRhZGF0YSBvbiBwbGFpbiBKUyBvYmplY3RzIHdoZW4gdGhlIG9iamVjdCBpcyBzZXJpYWxpemVkIHVzaW5nCgkJCS8vIEpTT04uc3RyaW5naWZ5CgkJCWlmICggIWlzTm9kZSApIHsKCQkJCWNhY2hlWyBpZCBdLnRvSlNPTiA9IGpRdWVyeS5ub29wOwoJCQl9CgoJCQljYWNoZVsgaWQgXVsgaW50ZXJuYWxLZXkgXSA9IGludGVybmFsQ2FjaGU7CgoJCS8vIE90aGVyd2lzZSwgd2UgbmVlZCB0byBlbGltaW5hdGUgdGhlIGV4cGFuZG8gb24gdGhlIG5vZGUgdG8gYXZvaWQKCQkvLyBmYWxzZSBsb29rdXBzIGluIHRoZSBjYWNoZSBmb3IgZW50cmllcyB0aGF0IG5vIGxvbmdlciBleGlzdAoJCX0gZWxzZSBpZiAoIGlzTm9kZSApIHsKCQkJLy8gSUUgZG9lcyBub3QgYWxsb3cgdXMgdG8gZGVsZXRlIGV4cGFuZG8gcHJvcGVydGllcyBmcm9tIG5vZGVzLAoJCQkvLyBub3IgZG9lcyBpdCBoYXZlIGEgcmVtb3ZlQXR0cmlidXRlIGZ1bmN0aW9uIG9uIERvY3VtZW50IG5vZGVzOwoJCQkvLyB3ZSBtdXN0IGhhbmRsZSBhbGwgb2YgdGhlc2UgY2FzZXMKCQkJaWYgKCBqUXVlcnkuc3VwcG9ydC5kZWxldGVFeHBhbmRvICkgewoJCQkJZGVsZXRlIGVsZW1bIGpRdWVyeS5leHBhbmRvIF07CgkJCX0gZWxzZSBpZiAoIGVsZW0ucmVtb3ZlQXR0cmlidXRlICkgewoJCQkJZWxlbS5yZW1vdmVBdHRyaWJ1dGUoIGpRdWVyeS5leHBhbmRvICk7CgkJCX0gZWxzZSB7CgkJCQllbGVtWyBqUXVlcnkuZXhwYW5kbyBdID0gbnVsbDsKCQkJfQoJCX0KCX0sCgoJLy8gRm9yIGludGVybmFsIHVzZSBvbmx5LgoJX2RhdGE6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBkYXRhICkgewoJCXJldHVybiBqUXVlcnkuZGF0YSggZWxlbSwgbmFtZSwgZGF0YSwgdHJ1ZSApOwoJfSwKCgkvLyBBIG1ldGhvZCBmb3IgZGV0ZXJtaW5pbmcgaWYgYSBET00gbm9kZSBjYW4gaGFuZGxlIHRoZSBkYXRhIGV4cGFuZG8KCWFjY2VwdERhdGE6IGZ1bmN0aW9uKCBlbGVtICkgewoJCWlmICggZWxlbS5ub2RlTmFtZSApIHsKCQkJdmFyIG1hdGNoID0galF1ZXJ5Lm5vRGF0YVsgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIF07CgoJCQlpZiAoIG1hdGNoICkgewoJCQkJcmV0dXJuICEobWF0Y2ggPT09IHRydWUgfHwgZWxlbS5nZXRBdHRyaWJ1dGUoImNsYXNzaWQiKSAhPT0gbWF0Y2gpOwoJCQl9CgkJfQoKCQlyZXR1cm4gdHJ1ZTsKCX0KfSk7CgpqUXVlcnkuZm4uZXh0ZW5kKHsKCWRhdGE6IGZ1bmN0aW9uKCBrZXksIHZhbHVlICkgewoJCXZhciBkYXRhID0gbnVsbDsKCgkJaWYgKCB0eXBlb2Yga2V5ID09PSAidW5kZWZpbmVkIiApIHsKCQkJaWYgKCB0aGlzLmxlbmd0aCApIHsKCQkJCWRhdGEgPSBqUXVlcnkuZGF0YSggdGhpc1swXSApOwoKCQkJCWlmICggdGhpc1swXS5ub2RlVHlwZSA9PT0gMSApIHsKCQkJICAgIHZhciBhdHRyID0gdGhpc1swXS5hdHRyaWJ1dGVzLCBuYW1lOwoJCQkJCWZvciAoIHZhciBpID0gMCwgbCA9IGF0dHIubGVuZ3RoOyBpIDwgbDsgaSsrICkgewoJCQkJCQluYW1lID0gYXR0cltpXS5uYW1lOwoKCQkJCQkJaWYgKCBuYW1lLmluZGV4T2YoICJkYXRhLSIgKSA9PT0gMCApIHsKCQkJCQkJCW5hbWUgPSBqUXVlcnkuY2FtZWxDYXNlKCBuYW1lLnN1YnN0cmluZyg1KSApOwoKCQkJCQkJCWRhdGFBdHRyKCB0aGlzWzBdLCBuYW1lLCBkYXRhWyBuYW1lIF0gKTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJfQoKCQkJcmV0dXJuIGRhdGE7CgoJCX0gZWxzZSBpZiAoIHR5cGVvZiBrZXkgPT09ICJvYmplY3QiICkgewoJCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewoJCQkJalF1ZXJ5LmRhdGEoIHRoaXMsIGtleSApOwoJCQl9KTsKCQl9CgoJCXZhciBwYXJ0cyA9IGtleS5zcGxpdCgiLiIpOwoJCXBhcnRzWzFdID0gcGFydHNbMV0gPyAiLiIgKyBwYXJ0c1sxXSA6ICIiOwoKCQlpZiAoIHZhbHVlID09PSB1bmRlZmluZWQgKSB7CgkJCWRhdGEgPSB0aGlzLnRyaWdnZXJIYW5kbGVyKCJnZXREYXRhIiArIHBhcnRzWzFdICsgIiEiLCBbcGFydHNbMF1dKTsKCgkJCS8vIFRyeSB0byBmZXRjaCBhbnkgaW50ZXJuYWxseSBzdG9yZWQgZGF0YSBmaXJzdAoJCQlpZiAoIGRhdGEgPT09IHVuZGVmaW5lZCAmJiB0aGlzLmxlbmd0aCApIHsKCQkJCWRhdGEgPSBqUXVlcnkuZGF0YSggdGhpc1swXSwga2V5ICk7CgkJCQlkYXRhID0gZGF0YUF0dHIoIHRoaXNbMF0sIGtleSwgZGF0YSApOwoJCQl9CgoJCQlyZXR1cm4gZGF0YSA9PT0gdW5kZWZpbmVkICYmIHBhcnRzWzFdID8KCQkJCXRoaXMuZGF0YSggcGFydHNbMF0gKSA6CgkJCQlkYXRhOwoKCQl9IGVsc2UgewoJCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewoJCQkJdmFyICR0aGlzID0galF1ZXJ5KCB0aGlzICksCgkJCQkJYXJncyA9IFsgcGFydHNbMF0sIHZhbHVlIF07CgoJCQkJJHRoaXMudHJpZ2dlckhhbmRsZXIoICJzZXREYXRhIiArIHBhcnRzWzFdICsgIiEiLCBhcmdzICk7CgkJCQlqUXVlcnkuZGF0YSggdGhpcywga2V5LCB2YWx1ZSApOwoJCQkJJHRoaXMudHJpZ2dlckhhbmRsZXIoICJjaGFuZ2VEYXRhIiArIHBhcnRzWzFdICsgIiEiLCBhcmdzICk7CgkJCX0pOwoJCX0KCX0sCgoJcmVtb3ZlRGF0YTogZnVuY3Rpb24oIGtleSApIHsKCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewoJCQlqUXVlcnkucmVtb3ZlRGF0YSggdGhpcywga2V5ICk7CgkJfSk7Cgl9Cn0pOwoKZnVuY3Rpb24gZGF0YUF0dHIoIGVsZW0sIGtleSwgZGF0YSApIHsKCS8vIElmIG5vdGhpbmcgd2FzIGZvdW5kIGludGVybmFsbHksIHRyeSB0byBmZXRjaCBhbnkKCS8vIGRhdGEgZnJvbSB0aGUgSFRNTDUgZGF0YS0qIGF0dHJpYnV0ZQoJaWYgKCBkYXRhID09PSB1bmRlZmluZWQgJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSApIHsKCgkJdmFyIG5hbWUgPSAiZGF0YS0iICsga2V5LnJlcGxhY2UoIHJtdWx0aURhc2gsICItJDEiICkudG9Mb3dlckNhc2UoKTsKCgkJZGF0YSA9IGVsZW0uZ2V0QXR0cmlidXRlKCBuYW1lICk7CgoJCWlmICggdHlwZW9mIGRhdGEgPT09ICJzdHJpbmciICkgewoJCQl0cnkgewoJCQkJZGF0YSA9IGRhdGEgPT09ICJ0cnVlIiA/IHRydWUgOgoJCQkJZGF0YSA9PT0gImZhbHNlIiA/IGZhbHNlIDoKCQkJCWRhdGEgPT09ICJudWxsIiA/IG51bGwgOgoJCQkJIWpRdWVyeS5pc05hTiggZGF0YSApID8gcGFyc2VGbG9hdCggZGF0YSApIDoKCQkJCQlyYnJhY2UudGVzdCggZGF0YSApID8galF1ZXJ5LnBhcnNlSlNPTiggZGF0YSApIDoKCQkJCQlkYXRhOwoJCQl9IGNhdGNoKCBlICkge30KCgkJCS8vIE1ha2Ugc3VyZSB3ZSBzZXQgdGhlIGRhdGEgc28gaXQgaXNuJ3QgY2hhbmdlZCBsYXRlcgoJCQlqUXVlcnkuZGF0YSggZWxlbSwga2V5LCBkYXRhICk7CgoJCX0gZWxzZSB7CgkJCWRhdGEgPSB1bmRlZmluZWQ7CgkJfQoJfQoKCXJldHVybiBkYXRhOwp9CgovLyBUT0RPOiBUaGlzIGlzIGEgaGFjayBmb3IgMS41IE9OTFkgdG8gYWxsb3cgb2JqZWN0cyB3aXRoIGEgc2luZ2xlIHRvSlNPTgovLyBwcm9wZXJ0eSB0byBiZSBjb25zaWRlcmVkIGVtcHR5IG9iamVjdHM7IHRoaXMgcHJvcGVydHkgYWx3YXlzIGV4aXN0cyBpbgovLyBvcmRlciB0byBtYWtlIHN1cmUgSlNPTi5zdHJpbmdpZnkgZG9lcyBub3QgZXhwb3NlIGludGVybmFsIG1ldGFkYXRhCmZ1bmN0aW9uIGlzRW1wdHlEYXRhT2JqZWN0KCBvYmogKSB7Cglmb3IgKCB2YXIgbmFtZSBpbiBvYmogKSB7CgkJaWYgKCBuYW1lICE9PSAidG9KU09OIiApIHsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCX0KCglyZXR1cm4gdHJ1ZTsKfQoKCgoKZnVuY3Rpb24gaGFuZGxlUXVldWVNYXJrRGVmZXIoIGVsZW0sIHR5cGUsIHNyYyApIHsKCXZhciBkZWZlckRhdGFLZXkgPSB0eXBlICsgImRlZmVyIiwKCQlxdWV1ZURhdGFLZXkgPSB0eXBlICsgInF1ZXVlIiwKCQltYXJrRGF0YUtleSA9IHR5cGUgKyAibWFyayIsCgkJZGVmZXIgPSBqUXVlcnkuZGF0YSggZWxlbSwgZGVmZXJEYXRhS2V5LCB1bmRlZmluZWQsIHRydWUgKTsKCWlmICggZGVmZXIgJiYKCQkoIHNyYyA9PT0gInF1ZXVlIiB8fCAhalF1ZXJ5LmRhdGEoIGVsZW0sIHF1ZXVlRGF0YUtleSwgdW5kZWZpbmVkLCB0cnVlICkgKSAmJgoJCSggc3JjID09PSAibWFyayIgfHwgIWpRdWVyeS5kYXRhKCBlbGVtLCBtYXJrRGF0YUtleSwgdW5kZWZpbmVkLCB0cnVlICkgKSApIHsKCQkvLyBHaXZlIHJvb20gZm9yIGhhcmQtY29kZWQgY2FsbGJhY2tzIHRvIGZpcmUgZmlyc3QKCQkvLyBhbmQgZXZlbnR1YWxseSBtYXJrL3F1ZXVlIHNvbWV0aGluZyBlbHNlIG9uIHRoZSBlbGVtZW50CgkJc2V0VGltZW91dCggZnVuY3Rpb24oKSB7CgkJCWlmICggIWpRdWVyeS5kYXRhKCBlbGVtLCBxdWV1ZURhdGFLZXksIHVuZGVmaW5lZCwgdHJ1ZSApICYmCgkJCQkhalF1ZXJ5LmRhdGEoIGVsZW0sIG1hcmtEYXRhS2V5LCB1bmRlZmluZWQsIHRydWUgKSApIHsKCQkJCWpRdWVyeS5yZW1vdmVEYXRhKCBlbGVtLCBkZWZlckRhdGFLZXksIHRydWUgKTsKCQkJCWRlZmVyLnJlc29sdmUoKTsKCQkJfQoJCX0sIDAgKTsKCX0KfQoKalF1ZXJ5LmV4dGVuZCh7CgoJX21hcms6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlICkgewoJCWlmICggZWxlbSApIHsKCQkJdHlwZSA9ICh0eXBlIHx8ICJmeCIpICsgIm1hcmsiOwoJCQlqUXVlcnkuZGF0YSggZWxlbSwgdHlwZSwgKGpRdWVyeS5kYXRhKGVsZW0sdHlwZSx1bmRlZmluZWQsdHJ1ZSkgfHwgMCkgKyAxLCB0cnVlICk7CgkJfQoJfSwKCglfdW5tYXJrOiBmdW5jdGlvbiggZm9yY2UsIGVsZW0sIHR5cGUgKSB7CgkJaWYgKCBmb3JjZSAhPT0gdHJ1ZSApIHsKCQkJdHlwZSA9IGVsZW07CgkJCWVsZW0gPSBmb3JjZTsKCQkJZm9yY2UgPSBmYWxzZTsKCQl9CgkJaWYgKCBlbGVtICkgewoJCQl0eXBlID0gdHlwZSB8fCAiZngiOwoJCQl2YXIga2V5ID0gdHlwZSArICJtYXJrIiwKCQkJCWNvdW50ID0gZm9yY2UgPyAwIDogKCAoalF1ZXJ5LmRhdGEoIGVsZW0sIGtleSwgdW5kZWZpbmVkLCB0cnVlKSB8fCAxICkgLSAxICk7CgkJCWlmICggY291bnQgKSB7CgkJCQlqUXVlcnkuZGF0YSggZWxlbSwga2V5LCBjb3VudCwgdHJ1ZSApOwoJCQl9IGVsc2UgewoJCQkJalF1ZXJ5LnJlbW92ZURhdGEoIGVsZW0sIGtleSwgdHJ1ZSApOwoJCQkJaGFuZGxlUXVldWVNYXJrRGVmZXIoIGVsZW0sIHR5cGUsICJtYXJrIiApOwoJCQl9CgkJfQoJfSwKCglxdWV1ZTogZnVuY3Rpb24oIGVsZW0sIHR5cGUsIGRhdGEgKSB7CgkJaWYgKCBlbGVtICkgewoJCQl0eXBlID0gKHR5cGUgfHwgImZ4IikgKyAicXVldWUiOwoJCQl2YXIgcSA9IGpRdWVyeS5kYXRhKCBlbGVtLCB0eXBlLCB1bmRlZmluZWQsIHRydWUgKTsKCQkJLy8gU3BlZWQgdXAgZGVxdWV1ZSBieSBnZXR0aW5nIG91dCBxdWlja2x5IGlmIHRoaXMgaXMganVzdCBhIGxvb2t1cAoJCQlpZiAoIGRhdGEgKSB7CgkJCQlpZiAoICFxIHx8IGpRdWVyeS5pc0FycmF5KGRhdGEpICkgewoJCQkJCXEgPSBqUXVlcnkuZGF0YSggZWxlbSwgdHlwZSwgalF1ZXJ5Lm1ha2VBcnJheShkYXRhKSwgdHJ1ZSApOwoJCQkJfSBlbHNlIHsKCQkJCQlxLnB1c2goIGRhdGEgKTsKCQkJCX0KCQkJfQoJCQlyZXR1cm4gcSB8fCBbXTsKCQl9Cgl9LAoKCWRlcXVldWU6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlICkgewoJCXR5cGUgPSB0eXBlIHx8ICJmeCI7CgoJCXZhciBxdWV1ZSA9IGpRdWVyeS5xdWV1ZSggZWxlbSwgdHlwZSApLAoJCQlmbiA9IHF1ZXVlLnNoaWZ0KCksCgkJCWRlZmVyOwoKCQkvLyBJZiB0aGUgZnggcXVldWUgaXMgZGVxdWV1ZWQsIGFsd2F5cyByZW1vdmUgdGhlIHByb2dyZXNzIHNlbnRpbmVsCgkJaWYgKCBmbiA9PT0gImlucHJvZ3Jlc3MiICkgewoJCQlmbiA9IHF1ZXVlLnNoaWZ0KCk7CgkJfQoKCQlpZiAoIGZuICkgewoJCQkvLyBBZGQgYSBwcm9ncmVzcyBzZW50aW5lbCB0byBwcmV2ZW50IHRoZSBmeCBxdWV1ZSBmcm9tIGJlaW5nCgkJCS8vIGF1dG9tYXRpY2FsbHkgZGVxdWV1ZWQKCQkJaWYgKCB0eXBlID09PSAiZngiICkgewoJCQkJcXVldWUudW5zaGlmdCgiaW5wcm9ncmVzcyIpOwoJCQl9CgoJCQlmbi5jYWxsKGVsZW0sIGZ1bmN0aW9uKCkgewoJCQkJalF1ZXJ5LmRlcXVldWUoZWxlbSwgdHlwZSk7CgkJCX0pOwoJCX0KCgkJaWYgKCAhcXVldWUubGVuZ3RoICkgewoJCQlqUXVlcnkucmVtb3ZlRGF0YSggZWxlbSwgdHlwZSArICJxdWV1ZSIsIHRydWUgKTsKCQkJaGFuZGxlUXVldWVNYXJrRGVmZXIoIGVsZW0sIHR5cGUsICJxdWV1ZSIgKTsKCQl9Cgl9Cn0pOwoKalF1ZXJ5LmZuLmV4dGVuZCh7CglxdWV1ZTogZnVuY3Rpb24oIHR5cGUsIGRhdGEgKSB7CgkJaWYgKCB0eXBlb2YgdHlwZSAhPT0gInN0cmluZyIgKSB7CgkJCWRhdGEgPSB0eXBlOwoJCQl0eXBlID0gImZ4IjsKCQl9CgoJCWlmICggZGF0YSA9PT0gdW5kZWZpbmVkICkgewoJCQlyZXR1cm4galF1ZXJ5LnF1ZXVlKCB0aGlzWzBdLCB0eXBlICk7CgkJfQoJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7CgkJCXZhciBxdWV1ZSA9IGpRdWVyeS5xdWV1ZSggdGhpcywgdHlwZSwgZGF0YSApOwoKCQkJaWYgKCB0eXBlID09PSAiZngiICYmIHF1ZXVlWzBdICE9PSAiaW5wcm9ncmVzcyIgKSB7CgkJCQlqUXVlcnkuZGVxdWV1ZSggdGhpcywgdHlwZSApOwoJCQl9CgkJfSk7Cgl9LAoJZGVxdWV1ZTogZnVuY3Rpb24oIHR5cGUgKSB7CgkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHsKCQkJalF1ZXJ5LmRlcXVldWUoIHRoaXMsIHR5cGUgKTsKCQl9KTsKCX0sCgkvLyBCYXNlZCBvZmYgb2YgdGhlIHBsdWdpbiBieSBDbGludCBIZWxmZXJzLCB3aXRoIHBlcm1pc3Npb24uCgkvLyBodHRwOi8vYmxpbmRzaWduYWxzLmNvbS9pbmRleC5waHAvMjAwOS8wNy9qcXVlcnktZGVsYXkvCglkZWxheTogZnVuY3Rpb24oIHRpbWUsIHR5cGUgKSB7CgkJdGltZSA9IGpRdWVyeS5meCA/IGpRdWVyeS5meC5zcGVlZHNbdGltZV0gfHwgdGltZSA6IHRpbWU7CgkJdHlwZSA9IHR5cGUgfHwgImZ4IjsKCgkJcmV0dXJuIHRoaXMucXVldWUoIHR5cGUsIGZ1bmN0aW9uKCkgewoJCQl2YXIgZWxlbSA9IHRoaXM7CgkJCXNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CgkJCQlqUXVlcnkuZGVxdWV1ZSggZWxlbSwgdHlwZSApOwoJCQl9LCB0aW1lICk7CgkJfSk7Cgl9LAoJY2xlYXJRdWV1ZTogZnVuY3Rpb24oIHR5cGUgKSB7CgkJcmV0dXJuIHRoaXMucXVldWUoIHR5cGUgfHwgImZ4IiwgW10gKTsKCX0sCgkvLyBHZXQgYSBwcm9taXNlIHJlc29sdmVkIHdoZW4gcXVldWVzIG9mIGEgY2VydGFpbiB0eXBlCgkvLyBhcmUgZW1wdGllZCAoZnggaXMgdGhlIHR5cGUgYnkgZGVmYXVsdCkKCXByb21pc2U6IGZ1bmN0aW9uKCB0eXBlLCBvYmplY3QgKSB7CgkJaWYgKCB0eXBlb2YgdHlwZSAhPT0gInN0cmluZyIgKSB7CgkJCW9iamVjdCA9IHR5cGU7CgkJCXR5cGUgPSB1bmRlZmluZWQ7CgkJfQoJCXR5cGUgPSB0eXBlIHx8ICJmeCI7CgkJdmFyIGRlZmVyID0galF1ZXJ5LkRlZmVycmVkKCksCgkJCWVsZW1lbnRzID0gdGhpcywKCQkJaSA9IGVsZW1lbnRzLmxlbmd0aCwKCQkJY291bnQgPSAxLAoJCQlkZWZlckRhdGFLZXkgPSB0eXBlICsgImRlZmVyIiwKCQkJcXVldWVEYXRhS2V5ID0gdHlwZSArICJxdWV1ZSIsCgkJCW1hcmtEYXRhS2V5ID0gdHlwZSArICJtYXJrIiwKCQkJdG1wOwoJCWZ1bmN0aW9uIHJlc29sdmUoKSB7CgkJCWlmICggISggLS1jb3VudCApICkgewoJCQkJZGVmZXIucmVzb2x2ZVdpdGgoIGVsZW1lbnRzLCBbIGVsZW1lbnRzIF0gKTsKCQkJfQoJCX0KCQl3aGlsZSggaS0tICkgewoJCQlpZiAoKCB0bXAgPSBqUXVlcnkuZGF0YSggZWxlbWVudHNbIGkgXSwgZGVmZXJEYXRhS2V5LCB1bmRlZmluZWQsIHRydWUgKSB8fAoJCQkJCSggalF1ZXJ5LmRhdGEoIGVsZW1lbnRzWyBpIF0sIHF1ZXVlRGF0YUtleSwgdW5kZWZpbmVkLCB0cnVlICkgfHwKCQkJCQkJalF1ZXJ5LmRhdGEoIGVsZW1lbnRzWyBpIF0sIG1hcmtEYXRhS2V5LCB1bmRlZmluZWQsIHRydWUgKSApICYmCgkJCQkJalF1ZXJ5LmRhdGEoIGVsZW1lbnRzWyBpIF0sIGRlZmVyRGF0YUtleSwgalF1ZXJ5Ll9EZWZlcnJlZCgpLCB0cnVlICkgKSkgewoJCQkJY291bnQrKzsKCQkJCXRtcC5kb25lKCByZXNvbHZlICk7CgkJCX0KCQl9CgkJcmVzb2x2ZSgpOwoJCXJldHVybiBkZWZlci5wcm9taXNlKCk7Cgl9Cn0pOwoKCgoKdmFyIHJjbGFzcyA9IC9bXG5cdFxyXS9nLAoJcnNwYWNlID0gL1xzKy8sCglycmV0dXJuID0gL1xyL2csCglydHlwZSA9IC9eKD86YnV0dG9ufGlucHV0KSQvaSwKCXJmb2N1c2FibGUgPSAvXig/OmJ1dHRvbnxpbnB1dHxvYmplY3R8c2VsZWN0fHRleHRhcmVhKSQvaSwKCXJjbGlja2FibGUgPSAvXmEoPzpyZWEpPyQvaSwKCXJib29sZWFuID0gL14oPzphdXRvZm9jdXN8YXV0b3BsYXl8YXN5bmN8Y2hlY2tlZHxjb250cm9sc3xkZWZlcnxkaXNhYmxlZHxoaWRkZW58bG9vcHxtdWx0aXBsZXxvcGVufHJlYWRvbmx5fHJlcXVpcmVkfHNjb3BlZHxzZWxlY3RlZCkkL2ksCglub2RlSG9vaywgYm9vbEhvb2s7CgpqUXVlcnkuZm4uZXh0ZW5kKHsKCWF0dHI6IGZ1bmN0aW9uKCBuYW1lLCB2YWx1ZSApIHsKCQlyZXR1cm4galF1ZXJ5LmFjY2VzcyggdGhpcywgbmFtZSwgdmFsdWUsIHRydWUsIGpRdWVyeS5hdHRyICk7Cgl9LAoKCXJlbW92ZUF0dHI6IGZ1bmN0aW9uKCBuYW1lICkgewoJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7CgkJCWpRdWVyeS5yZW1vdmVBdHRyKCB0aGlzLCBuYW1lICk7CgkJfSk7Cgl9LAoJCglwcm9wOiBmdW5jdGlvbiggbmFtZSwgdmFsdWUgKSB7CgkJcmV0dXJuIGpRdWVyeS5hY2Nlc3MoIHRoaXMsIG5hbWUsIHZhbHVlLCB0cnVlLCBqUXVlcnkucHJvcCApOwoJfSwKCQoJcmVtb3ZlUHJvcDogZnVuY3Rpb24oIG5hbWUgKSB7CgkJbmFtZSA9IGpRdWVyeS5wcm9wRml4WyBuYW1lIF0gfHwgbmFtZTsKCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewoJCQkvLyB0cnkvY2F0Y2ggaGFuZGxlcyBjYXNlcyB3aGVyZSBJRSBiYWxrcyAoc3VjaCBhcyByZW1vdmluZyBhIHByb3BlcnR5IG9uIHdpbmRvdykKCQkJdHJ5IHsKCQkJCXRoaXNbIG5hbWUgXSA9IHVuZGVmaW5lZDsKCQkJCWRlbGV0ZSB0aGlzWyBuYW1lIF07CgkJCX0gY2F0Y2goIGUgKSB7fQoJCX0pOwoJfSwKCglhZGRDbGFzczogZnVuY3Rpb24oIHZhbHVlICkgewoJCXZhciBjbGFzc05hbWVzLCBpLCBsLCBlbGVtLAoJCQlzZXRDbGFzcywgYywgY2w7CgoJCWlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHZhbHVlICkgKSB7CgkJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oIGogKSB7CgkJCQlqUXVlcnkoIHRoaXMgKS5hZGRDbGFzcyggdmFsdWUuY2FsbCh0aGlzLCBqLCB0aGlzLmNsYXNzTmFtZSkgKTsKCQkJfSk7CgkJfQoKCQlpZiAoIHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gInN0cmluZyIgKSB7CgkJCWNsYXNzTmFtZXMgPSB2YWx1ZS5zcGxpdCggcnNwYWNlICk7CgoJCQlmb3IgKCBpID0gMCwgbCA9IHRoaXMubGVuZ3RoOyBpIDwgbDsgaSsrICkgewoJCQkJZWxlbSA9IHRoaXNbIGkgXTsKCgkJCQlpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7CgkJCQkJaWYgKCAhZWxlbS5jbGFzc05hbWUgJiYgY2xhc3NOYW1lcy5sZW5ndGggPT09IDEgKSB7CgkJCQkJCWVsZW0uY2xhc3NOYW1lID0gdmFsdWU7CgoJCQkJCX0gZWxzZSB7CgkJCQkJCXNldENsYXNzID0gIiAiICsgZWxlbS5jbGFzc05hbWUgKyAiICI7CgoJCQkJCQlmb3IgKCBjID0gMCwgY2wgPSBjbGFzc05hbWVzLmxlbmd0aDsgYyA8IGNsOyBjKysgKSB7CgkJCQkJCQlpZiAoICF+c2V0Q2xhc3MuaW5kZXhPZiggIiAiICsgY2xhc3NOYW1lc1sgYyBdICsgIiAiICkgKSB7CgkJCQkJCQkJc2V0Q2xhc3MgKz0gY2xhc3NOYW1lc1sgYyBdICsgIiAiOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJCWVsZW0uY2xhc3NOYW1lID0galF1ZXJ5LnRyaW0oIHNldENsYXNzICk7CgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoKCQlyZXR1cm4gdGhpczsKCX0sCgoJcmVtb3ZlQ2xhc3M6IGZ1bmN0aW9uKCB2YWx1ZSApIHsKCQl2YXIgY2xhc3NOYW1lcywgaSwgbCwgZWxlbSwgY2xhc3NOYW1lLCBjLCBjbDsKCgkJaWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggdmFsdWUgKSApIHsKCQkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiggaiApIHsKCQkJCWpRdWVyeSggdGhpcyApLnJlbW92ZUNsYXNzKCB2YWx1ZS5jYWxsKHRoaXMsIGosIHRoaXMuY2xhc3NOYW1lKSApOwoJCQl9KTsKCQl9CgoJCWlmICggKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gInN0cmluZyIpIHx8IHZhbHVlID09PSB1bmRlZmluZWQgKSB7CgkJCWNsYXNzTmFtZXMgPSAodmFsdWUgfHwgIiIpLnNwbGl0KCByc3BhY2UgKTsKCgkJCWZvciAoIGkgPSAwLCBsID0gdGhpcy5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CgkJCQllbGVtID0gdGhpc1sgaSBdOwoKCQkJCWlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSAmJiBlbGVtLmNsYXNzTmFtZSApIHsKCQkJCQlpZiAoIHZhbHVlICkgewoJCQkJCQljbGFzc05hbWUgPSAoIiAiICsgZWxlbS5jbGFzc05hbWUgKyAiICIpLnJlcGxhY2UoIHJjbGFzcywgIiAiICk7CgkJCQkJCWZvciAoIGMgPSAwLCBjbCA9IGNsYXNzTmFtZXMubGVuZ3RoOyBjIDwgY2w7IGMrKyApIHsKCQkJCQkJCWNsYXNzTmFtZSA9IGNsYXNzTmFtZS5yZXBsYWNlKCIgIiArIGNsYXNzTmFtZXNbIGMgXSArICIgIiwgIiAiKTsKCQkJCQkJfQoJCQkJCQllbGVtLmNsYXNzTmFtZSA9IGpRdWVyeS50cmltKCBjbGFzc05hbWUgKTsKCgkJCQkJfSBlbHNlIHsKCQkJCQkJZWxlbS5jbGFzc05hbWUgPSAiIjsKCQkJCQl9CgkJCQl9CgkJCX0KCQl9CgoJCXJldHVybiB0aGlzOwoJfSwKCgl0b2dnbGVDbGFzczogZnVuY3Rpb24oIHZhbHVlLCBzdGF0ZVZhbCApIHsKCQl2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZSwKCQkJaXNCb29sID0gdHlwZW9mIHN0YXRlVmFsID09PSAiYm9vbGVhbiI7CgoJCWlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHZhbHVlICkgKSB7CgkJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oIGkgKSB7CgkJCQlqUXVlcnkoIHRoaXMgKS50b2dnbGVDbGFzcyggdmFsdWUuY2FsbCh0aGlzLCBpLCB0aGlzLmNsYXNzTmFtZSwgc3RhdGVWYWwpLCBzdGF0ZVZhbCApOwoJCQl9KTsKCQl9CgoJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7CgkJCWlmICggdHlwZSA9PT0gInN0cmluZyIgKSB7CgkJCQkvLyB0b2dnbGUgaW5kaXZpZHVhbCBjbGFzcyBuYW1lcwoJCQkJdmFyIGNsYXNzTmFtZSwKCQkJCQlpID0gMCwKCQkJCQlzZWxmID0galF1ZXJ5KCB0aGlzICksCgkJCQkJc3RhdGUgPSBzdGF0ZVZhbCwKCQkJCQljbGFzc05hbWVzID0gdmFsdWUuc3BsaXQoIHJzcGFjZSApOwoKCQkJCXdoaWxlICggKGNsYXNzTmFtZSA9IGNsYXNzTmFtZXNbIGkrKyBdKSApIHsKCQkJCQkvLyBjaGVjayBlYWNoIGNsYXNzTmFtZSBnaXZlbiwgc3BhY2Ugc2VwZXJhdGVkIGxpc3QKCQkJCQlzdGF0ZSA9IGlzQm9vbCA/IHN0YXRlIDogIXNlbGYuaGFzQ2xhc3MoIGNsYXNzTmFtZSApOwoJCQkJCXNlbGZbIHN0YXRlID8gImFkZENsYXNzIiA6ICJyZW1vdmVDbGFzcyIgXSggY2xhc3NOYW1lICk7CgkJCQl9CgoJCQl9IGVsc2UgaWYgKCB0eXBlID09PSAidW5kZWZpbmVkIiB8fCB0eXBlID09PSAiYm9vbGVhbiIgKSB7CgkJCQlpZiAoIHRoaXMuY2xhc3NOYW1lICkgewoJCQkJCS8vIHN0b3JlIGNsYXNzTmFtZSBpZiBzZXQKCQkJCQlqUXVlcnkuX2RhdGEoIHRoaXMsICJfX2NsYXNzTmFtZV9fIiwgdGhpcy5jbGFzc05hbWUgKTsKCQkJCX0KCgkJCQkvLyB0b2dnbGUgd2hvbGUgY2xhc3NOYW1lCgkJCQl0aGlzLmNsYXNzTmFtZSA9IHRoaXMuY2xhc3NOYW1lIHx8IHZhbHVlID09PSBmYWxzZSA/ICIiIDogalF1ZXJ5Ll9kYXRhKCB0aGlzLCAiX19jbGFzc05hbWVfXyIgKSB8fCAiIjsKCQkJfQoJCX0pOwoJfSwKCgloYXNDbGFzczogZnVuY3Rpb24oIHNlbGVjdG9yICkgewoJCXZhciBjbGFzc05hbWUgPSAiICIgKyBzZWxlY3RvciArICIgIjsKCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSB0aGlzLmxlbmd0aDsgaSA8IGw7IGkrKyApIHsKCQkJaWYgKCB0aGlzW2ldLm5vZGVUeXBlID09PSAxICYmICgiICIgKyB0aGlzW2ldLmNsYXNzTmFtZSArICIgIikucmVwbGFjZShyY2xhc3MsICIgIikuaW5kZXhPZiggY2xhc3NOYW1lICkgPiAtMSApIHsKCQkJCXJldHVybiB0cnVlOwoJCQl9CgkJfQoKCQlyZXR1cm4gZmFsc2U7Cgl9LAoKCXZhbDogZnVuY3Rpb24oIHZhbHVlICkgewoJCXZhciBob29rcywgcmV0LAoJCQllbGVtID0gdGhpc1swXTsKCQkKCQlpZiAoICFhcmd1bWVudHMubGVuZ3RoICkgewoJCQlpZiAoIGVsZW0gKSB7CgkJCQlob29rcyA9IGpRdWVyeS52YWxIb29rc1sgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIF0gfHwgalF1ZXJ5LnZhbEhvb2tzWyBlbGVtLnR5cGUgXTsKCgkJCQlpZiAoIGhvb2tzICYmICJnZXQiIGluIGhvb2tzICYmIChyZXQgPSBob29rcy5nZXQoIGVsZW0sICJ2YWx1ZSIgKSkgIT09IHVuZGVmaW5lZCApIHsKCQkJCQlyZXR1cm4gcmV0OwoJCQkJfQoKCQkJCXJldCA9IGVsZW0udmFsdWU7CgoJCQkJcmV0dXJuIHR5cGVvZiByZXQgPT09ICJzdHJpbmciID8gCgkJCQkJLy8gaGFuZGxlIG1vc3QgY29tbW9uIHN0cmluZyBjYXNlcwoJCQkJCXJldC5yZXBsYWNlKHJyZXR1cm4sICIiKSA6IAoJCQkJCS8vIGhhbmRsZSBjYXNlcyB3aGVyZSB2YWx1ZSBpcyBudWxsL3VuZGVmIG9yIG51bWJlcgoJCQkJCXJldCA9PSBudWxsID8gIiIgOiByZXQ7CgkJCX0KCgkJCXJldHVybiB1bmRlZmluZWQ7CgkJfQoKCQl2YXIgaXNGdW5jdGlvbiA9IGpRdWVyeS5pc0Z1bmN0aW9uKCB2YWx1ZSApOwoKCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCBpICkgewoJCQl2YXIgc2VsZiA9IGpRdWVyeSh0aGlzKSwgdmFsOwoKCQkJaWYgKCB0aGlzLm5vZGVUeXBlICE9PSAxICkgewoJCQkJcmV0dXJuOwoJCQl9CgoJCQlpZiAoIGlzRnVuY3Rpb24gKSB7CgkJCQl2YWwgPSB2YWx1ZS5jYWxsKCB0aGlzLCBpLCBzZWxmLnZhbCgpICk7CgkJCX0gZWxzZSB7CgkJCQl2YWwgPSB2YWx1ZTsKCQkJfQoKCQkJLy8gVHJlYXQgbnVsbC91bmRlZmluZWQgYXMgIiI7IGNvbnZlcnQgbnVtYmVycyB0byBzdHJpbmcKCQkJaWYgKCB2YWwgPT0gbnVsbCApIHsKCQkJCXZhbCA9ICIiOwoJCQl9IGVsc2UgaWYgKCB0eXBlb2YgdmFsID09PSAibnVtYmVyIiApIHsKCQkJCXZhbCArPSAiIjsKCQkJfSBlbHNlIGlmICggalF1ZXJ5LmlzQXJyYXkoIHZhbCApICkgewoJCQkJdmFsID0galF1ZXJ5Lm1hcCh2YWwsIGZ1bmN0aW9uICggdmFsdWUgKSB7CgkJCQkJcmV0dXJuIHZhbHVlID09IG51bGwgPyAiIiA6IHZhbHVlICsgIiI7CgkJCQl9KTsKCQkJfQoKCQkJaG9va3MgPSBqUXVlcnkudmFsSG9va3NbIHRoaXMubm9kZU5hbWUudG9Mb3dlckNhc2UoKSBdIHx8IGpRdWVyeS52YWxIb29rc1sgdGhpcy50eXBlIF07CgoJCQkvLyBJZiBzZXQgcmV0dXJucyB1bmRlZmluZWQsIGZhbGwgYmFjayB0byBub3JtYWwgc2V0dGluZwoJCQlpZiAoICFob29rcyB8fCAhKCJzZXQiIGluIGhvb2tzKSB8fCBob29rcy5zZXQoIHRoaXMsIHZhbCwgInZhbHVlIiApID09PSB1bmRlZmluZWQgKSB7CgkJCQl0aGlzLnZhbHVlID0gdmFsOwoJCQl9CgkJfSk7Cgl9Cn0pOwoKalF1ZXJ5LmV4dGVuZCh7Cgl2YWxIb29rczogewoJCW9wdGlvbjogewoJCQlnZXQ6IGZ1bmN0aW9uKCBlbGVtICkgewoJCQkJLy8gYXR0cmlidXRlcy52YWx1ZSBpcyB1bmRlZmluZWQgaW4gQmxhY2tiZXJyeSA0LjcgYnV0CgkJCQkvLyB1c2VzIC52YWx1ZS4gU2VlICM2OTMyCgkJCQl2YXIgdmFsID0gZWxlbS5hdHRyaWJ1dGVzLnZhbHVlOwoJCQkJcmV0dXJuICF2YWwgfHwgdmFsLnNwZWNpZmllZCA/IGVsZW0udmFsdWUgOiBlbGVtLnRleHQ7CgkJCX0KCQl9LAoJCXNlbGVjdDogewoJCQlnZXQ6IGZ1bmN0aW9uKCBlbGVtICkgewoJCQkJdmFyIHZhbHVlLAoJCQkJCWluZGV4ID0gZWxlbS5zZWxlY3RlZEluZGV4LAoJCQkJCXZhbHVlcyA9IFtdLAoJCQkJCW9wdGlvbnMgPSBlbGVtLm9wdGlvbnMsCgkJCQkJb25lID0gZWxlbS50eXBlID09PSAic2VsZWN0LW9uZSI7CgoJCQkJLy8gTm90aGluZyB3YXMgc2VsZWN0ZWQKCQkJCWlmICggaW5kZXggPCAwICkgewoJCQkJCXJldHVybiBudWxsOwoJCQkJfQoKCQkJCS8vIExvb3AgdGhyb3VnaCBhbGwgdGhlIHNlbGVjdGVkIG9wdGlvbnMKCQkJCWZvciAoIHZhciBpID0gb25lID8gaW5kZXggOiAwLCBtYXggPSBvbmUgPyBpbmRleCArIDEgOiBvcHRpb25zLmxlbmd0aDsgaSA8IG1heDsgaSsrICkgewoJCQkJCXZhciBvcHRpb24gPSBvcHRpb25zWyBpIF07CgoJCQkJCS8vIERvbid0IHJldHVybiBvcHRpb25zIHRoYXQgYXJlIGRpc2FibGVkIG9yIGluIGEgZGlzYWJsZWQgb3B0Z3JvdXAKCQkJCQlpZiAoIG9wdGlvbi5zZWxlY3RlZCAmJiAoalF1ZXJ5LnN1cHBvcnQub3B0RGlzYWJsZWQgPyAhb3B0aW9uLmRpc2FibGVkIDogb3B0aW9uLmdldEF0dHJpYnV0ZSgiZGlzYWJsZWQiKSA9PT0gbnVsbCkgJiYKCQkJCQkJCSghb3B0aW9uLnBhcmVudE5vZGUuZGlzYWJsZWQgfHwgIWpRdWVyeS5ub2RlTmFtZSggb3B0aW9uLnBhcmVudE5vZGUsICJvcHRncm91cCIgKSkgKSB7CgoJCQkJCQkvLyBHZXQgdGhlIHNwZWNpZmljIHZhbHVlIGZvciB0aGUgb3B0aW9uCgkJCQkJCXZhbHVlID0galF1ZXJ5KCBvcHRpb24gKS52YWwoKTsKCgkJCQkJCS8vIFdlIGRvbid0IG5lZWQgYW4gYXJyYXkgZm9yIG9uZSBzZWxlY3RzCgkJCQkJCWlmICggb25lICkgewoJCQkJCQkJcmV0dXJuIHZhbHVlOwoJCQkJCQl9CgoJCQkJCQkvLyBNdWx0aS1TZWxlY3RzIHJldHVybiBhbiBhcnJheQoJCQkJCQl2YWx1ZXMucHVzaCggdmFsdWUgKTsKCQkJCQl9CgkJCQl9CgoJCQkJLy8gRml4ZXMgQnVnICMyNTUxIC0tIHNlbGVjdC52YWwoKSBicm9rZW4gaW4gSUUgYWZ0ZXIgZm9ybS5yZXNldCgpCgkJCQlpZiAoIG9uZSAmJiAhdmFsdWVzLmxlbmd0aCAmJiBvcHRpb25zLmxlbmd0aCApIHsKCQkJCQlyZXR1cm4galF1ZXJ5KCBvcHRpb25zWyBpbmRleCBdICkudmFsKCk7CgkJCQl9CgoJCQkJcmV0dXJuIHZhbHVlczsKCQkJfSwKCgkJCXNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlICkgewoJCQkJdmFyIHZhbHVlcyA9IGpRdWVyeS5tYWtlQXJyYXkoIHZhbHVlICk7CgoJCQkJalF1ZXJ5KGVsZW0pLmZpbmQoIm9wdGlvbiIpLmVhY2goZnVuY3Rpb24oKSB7CgkJCQkJdGhpcy5zZWxlY3RlZCA9IGpRdWVyeS5pbkFycmF5KCBqUXVlcnkodGhpcykudmFsKCksIHZhbHVlcyApID49IDA7CgkJCQl9KTsKCgkJCQlpZiAoICF2YWx1ZXMubGVuZ3RoICkgewoJCQkJCWVsZW0uc2VsZWN0ZWRJbmRleCA9IC0xOwoJCQkJfQoJCQkJcmV0dXJuIHZhbHVlczsKCQkJfQoJCX0KCX0sCgoJYXR0ckZuOiB7CgkJdmFsOiB0cnVlLAoJCWNzczogdHJ1ZSwKCQlodG1sOiB0cnVlLAoJCXRleHQ6IHRydWUsCgkJZGF0YTogdHJ1ZSwKCQl3aWR0aDogdHJ1ZSwKCQloZWlnaHQ6IHRydWUsCgkJb2Zmc2V0OiB0cnVlCgl9LAoJCglhdHRyRml4OiB7CgkJLy8gQWx3YXlzIG5vcm1hbGl6ZSB0byBlbnN1cmUgaG9vayB1c2FnZQoJCXRhYmluZGV4OiAidGFiSW5kZXgiCgl9LAoJCglhdHRyOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgdmFsdWUsIHBhc3MgKSB7CgkJdmFyIG5UeXBlID0gZWxlbS5ub2RlVHlwZTsKCQkKCQkvLyBkb24ndCBnZXQvc2V0IGF0dHJpYnV0ZXMgb24gdGV4dCwgY29tbWVudCBhbmQgYXR0cmlidXRlIG5vZGVzCgkJaWYgKCAhZWxlbSB8fCBuVHlwZSA9PT0gMyB8fCBuVHlwZSA9PT0gOCB8fCBuVHlwZSA9PT0gMiApIHsKCQkJcmV0dXJuIHVuZGVmaW5lZDsKCQl9CgoJCWlmICggcGFzcyAmJiBuYW1lIGluIGpRdWVyeS5hdHRyRm4gKSB7CgkJCXJldHVybiBqUXVlcnkoIGVsZW0gKVsgbmFtZSBdKCB2YWx1ZSApOwoJCX0KCgkJLy8gRmFsbGJhY2sgdG8gcHJvcCB3aGVuIGF0dHJpYnV0ZXMgYXJlIG5vdCBzdXBwb3J0ZWQKCQlpZiAoICEoImdldEF0dHJpYnV0ZSIgaW4gZWxlbSkgKSB7CgkJCXJldHVybiBqUXVlcnkucHJvcCggZWxlbSwgbmFtZSwgdmFsdWUgKTsKCQl9CgoJCXZhciByZXQsIGhvb2tzLAoJCQlub3R4bWwgPSBuVHlwZSAhPT0gMSB8fCAhalF1ZXJ5LmlzWE1MRG9jKCBlbGVtICk7CgoJCS8vIE5vcm1hbGl6ZSB0aGUgbmFtZSBpZiBuZWVkZWQKCQlpZiAoIG5vdHhtbCApIHsKCQkJbmFtZSA9IGpRdWVyeS5hdHRyRml4WyBuYW1lIF0gfHwgbmFtZTsKCgkJCWhvb2tzID0galF1ZXJ5LmF0dHJIb29rc1sgbmFtZSBdOwoKCQkJaWYgKCAhaG9va3MgKSB7CgkJCQkvLyBVc2UgYm9vbEhvb2sgZm9yIGJvb2xlYW4gYXR0cmlidXRlcwoJCQkJaWYgKCByYm9vbGVhbi50ZXN0KCBuYW1lICkgKSB7CgkJCQkJaG9va3MgPSBib29sSG9vazsKCgkJCQkvLyBVc2Ugbm9kZUhvb2sgaWYgYXZhaWxhYmxlKCBJRTYvNyApCgkJCQl9IGVsc2UgaWYgKCBub2RlSG9vayApIHsKCQkJCQlob29rcyA9IG5vZGVIb29rOwoJCQkJfQoJCQl9CgkJfQoKCQlpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7CgoJCQlpZiAoIHZhbHVlID09PSBudWxsICkgewoJCQkJalF1ZXJ5LnJlbW92ZUF0dHIoIGVsZW0sIG5hbWUgKTsKCQkJCXJldHVybiB1bmRlZmluZWQ7CgoJCQl9IGVsc2UgaWYgKCBob29rcyAmJiAic2V0IiBpbiBob29rcyAmJiBub3R4bWwgJiYgKHJldCA9IGhvb2tzLnNldCggZWxlbSwgdmFsdWUsIG5hbWUgKSkgIT09IHVuZGVmaW5lZCApIHsKCQkJCXJldHVybiByZXQ7CgoJCQl9IGVsc2UgewoJCQkJZWxlbS5zZXRBdHRyaWJ1dGUoIG5hbWUsICIiICsgdmFsdWUgKTsKCQkJCXJldHVybiB2YWx1ZTsKCQkJfQoKCQl9IGVsc2UgaWYgKCBob29rcyAmJiAiZ2V0IiBpbiBob29rcyAmJiBub3R4bWwgJiYgKHJldCA9IGhvb2tzLmdldCggZWxlbSwgbmFtZSApKSAhPT0gbnVsbCApIHsKCQkJcmV0dXJuIHJldDsKCgkJfSBlbHNlIHsKCgkJCXJldCA9IGVsZW0uZ2V0QXR0cmlidXRlKCBuYW1lICk7CgoJCQkvLyBOb24tZXhpc3RlbnQgYXR0cmlidXRlcyByZXR1cm4gbnVsbCwgd2Ugbm9ybWFsaXplIHRvIHVuZGVmaW5lZAoJCQlyZXR1cm4gcmV0ID09PSBudWxsID8KCQkJCXVuZGVmaW5lZCA6CgkJCQlyZXQ7CgkJfQoJfSwKCglyZW1vdmVBdHRyOiBmdW5jdGlvbiggZWxlbSwgbmFtZSApIHsKCQl2YXIgcHJvcE5hbWU7CgkJaWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICkgewoJCQluYW1lID0galF1ZXJ5LmF0dHJGaXhbIG5hbWUgXSB8fCBuYW1lOwoKCQkJalF1ZXJ5LmF0dHIoIGVsZW0sIG5hbWUsICIiICk7CgkJCWVsZW0ucmVtb3ZlQXR0cmlidXRlKCBuYW1lICk7CgoJCQkvLyBTZXQgY29ycmVzcG9uZGluZyBwcm9wZXJ0eSB0byBmYWxzZSBmb3IgYm9vbGVhbiBhdHRyaWJ1dGVzCgkJCWlmICggcmJvb2xlYW4udGVzdCggbmFtZSApICYmIChwcm9wTmFtZSA9IGpRdWVyeS5wcm9wRml4WyBuYW1lIF0gfHwgbmFtZSkgaW4gZWxlbSApIHsKCQkJCWVsZW1bIHByb3BOYW1lIF0gPSBmYWxzZTsKCQkJfQoJCX0KCX0sCgoJYXR0ckhvb2tzOiB7CgkJdHlwZTogewoJCQlzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSApIHsKCQkJCS8vIFdlIGNhbid0IGFsbG93IHRoZSB0eXBlIHByb3BlcnR5IHRvIGJlIGNoYW5nZWQgKHNpbmNlIGl0IGNhdXNlcyBwcm9ibGVtcyBpbiBJRSkKCQkJCWlmICggcnR5cGUudGVzdCggZWxlbS5ub2RlTmFtZSApICYmIGVsZW0ucGFyZW50Tm9kZSApIHsKCQkJCQlqUXVlcnkuZXJyb3IoICJ0eXBlIHByb3BlcnR5IGNhbid0IGJlIGNoYW5nZWQiICk7CgkJCQl9IGVsc2UgaWYgKCAhalF1ZXJ5LnN1cHBvcnQucmFkaW9WYWx1ZSAmJiB2YWx1ZSA9PT0gInJhZGlvIiAmJiBqUXVlcnkubm9kZU5hbWUoZWxlbSwgImlucHV0IikgKSB7CgkJCQkJLy8gU2V0dGluZyB0aGUgdHlwZSBvbiBhIHJhZGlvIGJ1dHRvbiBhZnRlciB0aGUgdmFsdWUgcmVzZXRzIHRoZSB2YWx1ZSBpbiBJRTYtOQoJCQkJCS8vIFJlc2V0IHZhbHVlIHRvIGl0J3MgZGVmYXVsdCBpbiBjYXNlIHR5cGUgaXMgc2V0IGFmdGVyIHZhbHVlCgkJCQkJLy8gVGhpcyBpcyBmb3IgZWxlbWVudCBjcmVhdGlvbgoJCQkJCXZhciB2YWwgPSBlbGVtLnZhbHVlOwoJCQkJCWVsZW0uc2V0QXR0cmlidXRlKCAidHlwZSIsIHZhbHVlICk7CgkJCQkJaWYgKCB2YWwgKSB7CgkJCQkJCWVsZW0udmFsdWUgPSB2YWw7CgkJCQkJfQoJCQkJCXJldHVybiB2YWx1ZTsKCQkJCX0KCQkJfQoJCX0sCgkJLy8gVXNlIHRoZSB2YWx1ZSBwcm9wZXJ0eSBmb3IgYmFjayBjb21wYXQKCQkvLyBVc2UgdGhlIG5vZGVIb29rIGZvciBidXR0b24gZWxlbWVudHMgaW4gSUU2LzcgKCMxOTU0KQoJCXZhbHVlOiB7CgkJCWdldDogZnVuY3Rpb24oIGVsZW0sIG5hbWUgKSB7CgkJCQlpZiAoIG5vZGVIb29rICYmIGpRdWVyeS5ub2RlTmFtZSggZWxlbSwgImJ1dHRvbiIgKSApIHsKCQkJCQlyZXR1cm4gbm9kZUhvb2suZ2V0KCBlbGVtLCBuYW1lICk7CgkJCQl9CgkJCQlyZXR1cm4gbmFtZSBpbiBlbGVtID8KCQkJCQllbGVtLnZhbHVlIDoKCQkJCQludWxsOwoJCQl9LAoJCQlzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSwgbmFtZSApIHsKCQkJCWlmICggbm9kZUhvb2sgJiYgalF1ZXJ5Lm5vZGVOYW1lKCBlbGVtLCAiYnV0dG9uIiApICkgewoJCQkJCXJldHVybiBub2RlSG9vay5zZXQoIGVsZW0sIHZhbHVlLCBuYW1lICk7CgkJCQl9CgkJCQkvLyBEb2VzIG5vdCByZXR1cm4gc28gdGhhdCBzZXRBdHRyaWJ1dGUgaXMgYWxzbyB1c2VkCgkJCQllbGVtLnZhbHVlID0gdmFsdWU7CgkJCX0KCQl9Cgl9LAoKCXByb3BGaXg6IHsKCQl0YWJpbmRleDogInRhYkluZGV4IiwKCQlyZWFkb25seTogInJlYWRPbmx5IiwKCQkiZm9yIjogImh0bWxGb3IiLAoJCSJjbGFzcyI6ICJjbGFzc05hbWUiLAoJCW1heGxlbmd0aDogIm1heExlbmd0aCIsCgkJY2VsbHNwYWNpbmc6ICJjZWxsU3BhY2luZyIsCgkJY2VsbHBhZGRpbmc6ICJjZWxsUGFkZGluZyIsCgkJcm93c3BhbjogInJvd1NwYW4iLAoJCWNvbHNwYW46ICJjb2xTcGFuIiwKCQl1c2VtYXA6ICJ1c2VNYXAiLAoJCWZyYW1lYm9yZGVyOiAiZnJhbWVCb3JkZXIiLAoJCWNvbnRlbnRlZGl0YWJsZTogImNvbnRlbnRFZGl0YWJsZSIKCX0sCgkKCXByb3A6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCB2YWx1ZSApIHsKCQl2YXIgblR5cGUgPSBlbGVtLm5vZGVUeXBlOwoKCQkvLyBkb24ndCBnZXQvc2V0IHByb3BlcnRpZXMgb24gdGV4dCwgY29tbWVudCBhbmQgYXR0cmlidXRlIG5vZGVzCgkJaWYgKCAhZWxlbSB8fCBuVHlwZSA9PT0gMyB8fCBuVHlwZSA9PT0gOCB8fCBuVHlwZSA9PT0gMiApIHsKCQkJcmV0dXJuIHVuZGVmaW5lZDsKCQl9CgoJCXZhciByZXQsIGhvb2tzLAoJCQlub3R4bWwgPSBuVHlwZSAhPT0gMSB8fCAhalF1ZXJ5LmlzWE1MRG9jKCBlbGVtICk7CgoJCWlmICggbm90eG1sICkgewoJCQkvLyBGaXggbmFtZSBhbmQgYXR0YWNoIGhvb2tzCgkJCW5hbWUgPSBqUXVlcnkucHJvcEZpeFsgbmFtZSBdIHx8IG5hbWU7CgkJCWhvb2tzID0galF1ZXJ5LnByb3BIb29rc1sgbmFtZSBdOwoJCX0KCgkJaWYgKCB2YWx1ZSAhPT0gdW5kZWZpbmVkICkgewoJCQlpZiAoIGhvb2tzICYmICJzZXQiIGluIGhvb2tzICYmIChyZXQgPSBob29rcy5zZXQoIGVsZW0sIHZhbHVlLCBuYW1lICkpICE9PSB1bmRlZmluZWQgKSB7CgkJCQlyZXR1cm4gcmV0OwoKCQkJfSBlbHNlIHsKCQkJCXJldHVybiAoZWxlbVsgbmFtZSBdID0gdmFsdWUpOwoJCQl9CgoJCX0gZWxzZSB7CgkJCWlmICggaG9va3MgJiYgImdldCIgaW4gaG9va3MgJiYgKHJldCA9IGhvb2tzLmdldCggZWxlbSwgbmFtZSApKSAhPT0gbnVsbCApIHsKCQkJCXJldHVybiByZXQ7CgoJCQl9IGVsc2UgewoJCQkJcmV0dXJuIGVsZW1bIG5hbWUgXTsKCQkJfQoJCX0KCX0sCgkKCXByb3BIb29rczogewoJCXRhYkluZGV4OiB7CgkJCWdldDogZnVuY3Rpb24oIGVsZW0gKSB7CgkJCQkvLyBlbGVtLnRhYkluZGV4IGRvZXNuJ3QgYWx3YXlzIHJldHVybiB0aGUgY29ycmVjdCB2YWx1ZSB3aGVuIGl0IGhhc24ndCBiZWVuIGV4cGxpY2l0bHkgc2V0CgkJCQkvLyBodHRwOi8vZmx1aWRwcm9qZWN0Lm9yZy9ibG9nLzIwMDgvMDEvMDkvZ2V0dGluZy1zZXR0aW5nLWFuZC1yZW1vdmluZy10YWJpbmRleC12YWx1ZXMtd2l0aC1qYXZhc2NyaXB0LwoJCQkJdmFyIGF0dHJpYnV0ZU5vZGUgPSBlbGVtLmdldEF0dHJpYnV0ZU5vZGUoInRhYmluZGV4Iik7CgoJCQkJcmV0dXJuIGF0dHJpYnV0ZU5vZGUgJiYgYXR0cmlidXRlTm9kZS5zcGVjaWZpZWQgPwoJCQkJCXBhcnNlSW50KCBhdHRyaWJ1dGVOb2RlLnZhbHVlLCAxMCApIDoKCQkJCQlyZm9jdXNhYmxlLnRlc3QoIGVsZW0ubm9kZU5hbWUgKSB8fCByY2xpY2thYmxlLnRlc3QoIGVsZW0ubm9kZU5hbWUgKSAmJiBlbGVtLmhyZWYgPwoJCQkJCQkwIDoKCQkJCQkJdW5kZWZpbmVkOwoJCQl9CgkJfQoJfQp9KTsKCi8vIEFkZCB0aGUgdGFiaW5kZXggcHJvcEhvb2sgdG8gYXR0ckhvb2tzIGZvciBiYWNrLWNvbXBhdApqUXVlcnkuYXR0ckhvb2tzLnRhYkluZGV4ID0galF1ZXJ5LnByb3BIb29rcy50YWJJbmRleDsKCi8vIEhvb2sgZm9yIGJvb2xlYW4gYXR0cmlidXRlcwpib29sSG9vayA9IHsKCWdldDogZnVuY3Rpb24oIGVsZW0sIG5hbWUgKSB7CgkJLy8gQWxpZ24gYm9vbGVhbiBhdHRyaWJ1dGVzIHdpdGggY29ycmVzcG9uZGluZyBwcm9wZXJ0aWVzCgkJLy8gRmFsbCBiYWNrIHRvIGF0dHJpYnV0ZSBwcmVzZW5jZSB3aGVyZSBzb21lIGJvb2xlYW5zIGFyZSBub3Qgc3VwcG9ydGVkCgkJdmFyIGF0dHJOb2RlOwoJCXJldHVybiBqUXVlcnkucHJvcCggZWxlbSwgbmFtZSApID09PSB0cnVlIHx8ICggYXR0ck5vZGUgPSBlbGVtLmdldEF0dHJpYnV0ZU5vZGUoIG5hbWUgKSApICYmIGF0dHJOb2RlLm5vZGVWYWx1ZSAhPT0gZmFsc2UgPwoJCQluYW1lLnRvTG93ZXJDYXNlKCkgOgoJCQl1bmRlZmluZWQ7Cgl9LAoJc2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUsIG5hbWUgKSB7CgkJdmFyIHByb3BOYW1lOwoJCWlmICggdmFsdWUgPT09IGZhbHNlICkgewoJCQkvLyBSZW1vdmUgYm9vbGVhbiBhdHRyaWJ1dGVzIHdoZW4gc2V0IHRvIGZhbHNlCgkJCWpRdWVyeS5yZW1vdmVBdHRyKCBlbGVtLCBuYW1lICk7CgkJfSBlbHNlIHsKCQkJLy8gdmFsdWUgaXMgdHJ1ZSBzaW5jZSB3ZSBrbm93IGF0IHRoaXMgcG9pbnQgaXQncyB0eXBlIGJvb2xlYW4gYW5kIG5vdCBmYWxzZQoJCQkvLyBTZXQgYm9vbGVhbiBhdHRyaWJ1dGVzIHRvIHRoZSBzYW1lIG5hbWUgYW5kIHNldCB0aGUgRE9NIHByb3BlcnR5CgkJCXByb3BOYW1lID0galF1ZXJ5LnByb3BGaXhbIG5hbWUgXSB8fCBuYW1lOwoJCQlpZiAoIHByb3BOYW1lIGluIGVsZW0gKSB7CgkJCQkvLyBPbmx5IHNldCB0aGUgSURMIHNwZWNpZmljYWxseSBpZiBpdCBhbHJlYWR5IGV4aXN0cyBvbiB0aGUgZWxlbWVudAoJCQkJZWxlbVsgcHJvcE5hbWUgXSA9IHRydWU7CgkJCX0KCgkJCWVsZW0uc2V0QXR0cmlidXRlKCBuYW1lLCBuYW1lLnRvTG93ZXJDYXNlKCkgKTsKCQl9CgkJcmV0dXJuIG5hbWU7Cgl9Cn07CgovLyBJRTYvNyBkbyBub3Qgc3VwcG9ydCBnZXR0aW5nL3NldHRpbmcgc29tZSBhdHRyaWJ1dGVzIHdpdGggZ2V0L3NldEF0dHJpYnV0ZQppZiAoICFqUXVlcnkuc3VwcG9ydC5nZXRTZXRBdHRyaWJ1dGUgKSB7CgkKCS8vIFVzZSB0aGlzIGZvciBhbnkgYXR0cmlidXRlIGluIElFNi83CgkvLyBUaGlzIGZpeGVzIGFsbW9zdCBldmVyeSBJRTYvNyBpc3N1ZQoJbm9kZUhvb2sgPSBqUXVlcnkudmFsSG9va3MuYnV0dG9uID0gewoJCWdldDogZnVuY3Rpb24oIGVsZW0sIG5hbWUgKSB7CgkJCXZhciByZXQ7CgkJCXJldCA9IGVsZW0uZ2V0QXR0cmlidXRlTm9kZSggbmFtZSApOwoJCQkvLyBSZXR1cm4gdW5kZWZpbmVkIGlmIG5vZGVWYWx1ZSBpcyBlbXB0eSBzdHJpbmcKCQkJcmV0dXJuIHJldCAmJiByZXQubm9kZVZhbHVlICE9PSAiIiA/CgkJCQlyZXQubm9kZVZhbHVlIDoKCQkJCXVuZGVmaW5lZDsKCQl9LAoJCXNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlLCBuYW1lICkgewoJCQkvLyBTZXQgdGhlIGV4aXN0aW5nIG9yIGNyZWF0ZSBhIG5ldyBhdHRyaWJ1dGUgbm9kZQoJCQl2YXIgcmV0ID0gZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKCBuYW1lICk7CgkJCWlmICggIXJldCApIHsKCQkJCXJldCA9IGRvY3VtZW50LmNyZWF0ZUF0dHJpYnV0ZSggbmFtZSApOwoJCQkJZWxlbS5zZXRBdHRyaWJ1dGVOb2RlKCByZXQgKTsKCQkJfQoJCQlyZXR1cm4gKHJldC5ub2RlVmFsdWUgPSB2YWx1ZSArICIiKTsKCQl9Cgl9OwoKCS8vIFNldCB3aWR0aCBhbmQgaGVpZ2h0IHRvIGF1dG8gaW5zdGVhZCBvZiAwIG9uIGVtcHR5IHN0cmluZyggQnVnICM4MTUwICkKCS8vIFRoaXMgaXMgZm9yIHJlbW92YWxzCglqUXVlcnkuZWFjaChbICJ3aWR0aCIsICJoZWlnaHQiIF0sIGZ1bmN0aW9uKCBpLCBuYW1lICkgewoJCWpRdWVyeS5hdHRySG9va3NbIG5hbWUgXSA9IGpRdWVyeS5leHRlbmQoIGpRdWVyeS5hdHRySG9va3NbIG5hbWUgXSwgewoJCQlzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSApIHsKCQkJCWlmICggdmFsdWUgPT09ICIiICkgewoJCQkJCWVsZW0uc2V0QXR0cmlidXRlKCBuYW1lLCAiYXV0byIgKTsKCQkJCQlyZXR1cm4gdmFsdWU7CgkJCQl9CgkJCX0KCQl9KTsKCX0pOwp9CgoKLy8gU29tZSBhdHRyaWJ1dGVzIHJlcXVpcmUgYSBzcGVjaWFsIGNhbGwgb24gSUUKaWYgKCAhalF1ZXJ5LnN1cHBvcnQuaHJlZk5vcm1hbGl6ZWQgKSB7CglqUXVlcnkuZWFjaChbICJocmVmIiwgInNyYyIsICJ3aWR0aCIsICJoZWlnaHQiIF0sIGZ1bmN0aW9uKCBpLCBuYW1lICkgewoJCWpRdWVyeS5hdHRySG9va3NbIG5hbWUgXSA9IGpRdWVyeS5leHRlbmQoIGpRdWVyeS5hdHRySG9va3NbIG5hbWUgXSwgewoJCQlnZXQ6IGZ1bmN0aW9uKCBlbGVtICkgewoJCQkJdmFyIHJldCA9IGVsZW0uZ2V0QXR0cmlidXRlKCBuYW1lLCAyICk7CgkJCQlyZXR1cm4gcmV0ID09PSBudWxsID8gdW5kZWZpbmVkIDogcmV0OwoJCQl9CgkJfSk7Cgl9KTsKfQoKaWYgKCAhalF1ZXJ5LnN1cHBvcnQuc3R5bGUgKSB7CglqUXVlcnkuYXR0ckhvb2tzLnN0eWxlID0gewoJCWdldDogZnVuY3Rpb24oIGVsZW0gKSB7CgkJCS8vIFJldHVybiB1bmRlZmluZWQgaW4gdGhlIGNhc2Ugb2YgZW1wdHkgc3RyaW5nCgkJCS8vIE5vcm1hbGl6ZSB0byBsb3dlcmNhc2Ugc2luY2UgSUUgdXBwZXJjYXNlcyBjc3MgcHJvcGVydHkgbmFtZXMKCQkJcmV0dXJuIGVsZW0uc3R5bGUuY3NzVGV4dC50b0xvd2VyQ2FzZSgpIHx8IHVuZGVmaW5lZDsKCQl9LAoJCXNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlICkgewoJCQlyZXR1cm4gKGVsZW0uc3R5bGUuY3NzVGV4dCA9ICIiICsgdmFsdWUpOwoJCX0KCX07Cn0KCi8vIFNhZmFyaSBtaXMtcmVwb3J0cyB0aGUgZGVmYXVsdCBzZWxlY3RlZCBwcm9wZXJ0eSBvZiBhbiBvcHRpb24KLy8gQWNjZXNzaW5nIHRoZSBwYXJlbnQncyBzZWxlY3RlZEluZGV4IHByb3BlcnR5IGZpeGVzIGl0CmlmICggIWpRdWVyeS5zdXBwb3J0Lm9wdFNlbGVjdGVkICkgewoJalF1ZXJ5LnByb3BIb29rcy5zZWxlY3RlZCA9IGpRdWVyeS5leHRlbmQoIGpRdWVyeS5wcm9wSG9va3Muc2VsZWN0ZWQsIHsKCQlnZXQ6IGZ1bmN0aW9uKCBlbGVtICkgewoJCQl2YXIgcGFyZW50ID0gZWxlbS5wYXJlbnROb2RlOwoKCQkJaWYgKCBwYXJlbnQgKSB7CgkJCQlwYXJlbnQuc2VsZWN0ZWRJbmRleDsKCgkJCQkvLyBNYWtlIHN1cmUgdGhhdCBpdCBhbHNvIHdvcmtzIHdpdGggb3B0Z3JvdXBzLCBzZWUgIzU3MDEKCQkJCWlmICggcGFyZW50LnBhcmVudE5vZGUgKSB7CgkJCQkJcGFyZW50LnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleDsKCQkJCX0KCQkJfQoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9KTsKfQoKLy8gUmFkaW9zIGFuZCBjaGVja2JveGVzIGdldHRlci9zZXR0ZXIKaWYgKCAhalF1ZXJ5LnN1cHBvcnQuY2hlY2tPbiApIHsKCWpRdWVyeS5lYWNoKFsgInJhZGlvIiwgImNoZWNrYm94IiBdLCBmdW5jdGlvbigpIHsKCQlqUXVlcnkudmFsSG9va3NbIHRoaXMgXSA9IHsKCQkJZ2V0OiBmdW5jdGlvbiggZWxlbSApIHsKCQkJCS8vIEhhbmRsZSB0aGUgY2FzZSB3aGVyZSBpbiBXZWJraXQgIiIgaXMgcmV0dXJuZWQgaW5zdGVhZCBvZiAib24iIGlmIGEgdmFsdWUgaXNuJ3Qgc3BlY2lmaWVkCgkJCQlyZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoInZhbHVlIikgPT09IG51bGwgPyAib24iIDogZWxlbS52YWx1ZTsKCQkJfQoJCX07Cgl9KTsKfQpqUXVlcnkuZWFjaChbICJyYWRpbyIsICJjaGVja2JveCIgXSwgZnVuY3Rpb24oKSB7CglqUXVlcnkudmFsSG9va3NbIHRoaXMgXSA9IGpRdWVyeS5leHRlbmQoIGpRdWVyeS52YWxIb29rc1sgdGhpcyBdLCB7CgkJc2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUgKSB7CgkJCWlmICggalF1ZXJ5LmlzQXJyYXkoIHZhbHVlICkgKSB7CgkJCQlyZXR1cm4gKGVsZW0uY2hlY2tlZCA9IGpRdWVyeS5pbkFycmF5KCBqUXVlcnkoZWxlbSkudmFsKCksIHZhbHVlICkgPj0gMCk7CgkJCX0KCQl9Cgl9KTsKfSk7CgoKCgp2YXIgcm5hbWVzcGFjZXMgPSAvXC4oLiopJC8sCglyZm9ybUVsZW1zID0gL14oPzp0ZXh0YXJlYXxpbnB1dHxzZWxlY3QpJC9pLAoJcnBlcmlvZCA9IC9cLi9nLAoJcnNwYWNlcyA9IC8gL2csCglyZXNjYXBlID0gL1teXHdccy58YF0vZywKCWZjbGVhbnVwID0gZnVuY3Rpb24oIG5tICkgewoJCXJldHVybiBubS5yZXBsYWNlKHJlc2NhcGUsICJcXCQmIik7Cgl9OwoKLyoKICogQSBudW1iZXIgb2YgaGVscGVyIGZ1bmN0aW9ucyB1c2VkIGZvciBtYW5hZ2luZyBldmVudHMuCiAqIE1hbnkgb2YgdGhlIGlkZWFzIGJlaGluZCB0aGlzIGNvZGUgb3JpZ2luYXRlZCBmcm9tCiAqIERlYW4gRWR3YXJkcycgYWRkRXZlbnQgbGlicmFyeS4KICovCmpRdWVyeS5ldmVudCA9IHsKCgkvLyBCaW5kIGFuIGV2ZW50IHRvIGFuIGVsZW1lbnQKCS8vIE9yaWdpbmFsIGJ5IERlYW4gRWR3YXJkcwoJYWRkOiBmdW5jdGlvbiggZWxlbSwgdHlwZXMsIGhhbmRsZXIsIGRhdGEgKSB7CgkJaWYgKCBlbGVtLm5vZGVUeXBlID09PSAzIHx8IGVsZW0ubm9kZVR5cGUgPT09IDggKSB7CgkJCXJldHVybjsKCQl9CgoJCWlmICggaGFuZGxlciA9PT0gZmFsc2UgKSB7CgkJCWhhbmRsZXIgPSByZXR1cm5GYWxzZTsKCQl9IGVsc2UgaWYgKCAhaGFuZGxlciApIHsKCQkJLy8gRml4ZXMgYnVnICM3MjI5LiBGaXggcmVjb21tZW5kZWQgYnkgamRhbHRvbgoJCQlyZXR1cm47CgkJfQoKCQl2YXIgaGFuZGxlT2JqSW4sIGhhbmRsZU9iajsKCgkJaWYgKCBoYW5kbGVyLmhhbmRsZXIgKSB7CgkJCWhhbmRsZU9iakluID0gaGFuZGxlcjsKCQkJaGFuZGxlciA9IGhhbmRsZU9iakluLmhhbmRsZXI7CgkJfQoKCQkvLyBNYWtlIHN1cmUgdGhhdCB0aGUgZnVuY3Rpb24gYmVpbmcgZXhlY3V0ZWQgaGFzIGEgdW5pcXVlIElECgkJaWYgKCAhaGFuZGxlci5ndWlkICkgewoJCQloYW5kbGVyLmd1aWQgPSBqUXVlcnkuZ3VpZCsrOwoJCX0KCgkJLy8gSW5pdCB0aGUgZWxlbWVudCdzIGV2ZW50IHN0cnVjdHVyZQoJCXZhciBlbGVtRGF0YSA9IGpRdWVyeS5fZGF0YSggZWxlbSApOwoKCQkvLyBJZiBubyBlbGVtRGF0YSBpcyBmb3VuZCB0aGVuIHdlIG11c3QgYmUgdHJ5aW5nIHRvIGJpbmQgdG8gb25lIG9mIHRoZQoJCS8vIGJhbm5lZCBub0RhdGEgZWxlbWVudHMKCQlpZiAoICFlbGVtRGF0YSApIHsKCQkJcmV0dXJuOwoJCX0KCgkJdmFyIGV2ZW50cyA9IGVsZW1EYXRhLmV2ZW50cywKCQkJZXZlbnRIYW5kbGUgPSBlbGVtRGF0YS5oYW5kbGU7CgoJCWlmICggIWV2ZW50cyApIHsKCQkJZWxlbURhdGEuZXZlbnRzID0gZXZlbnRzID0ge307CgkJfQoKCQlpZiAoICFldmVudEhhbmRsZSApIHsKCQkJZWxlbURhdGEuaGFuZGxlID0gZXZlbnRIYW5kbGUgPSBmdW5jdGlvbiggZSApIHsKCQkJCS8vIERpc2NhcmQgdGhlIHNlY29uZCBldmVudCBvZiBhIGpRdWVyeS5ldmVudC50cmlnZ2VyKCkgYW5kCgkJCQkvLyB3aGVuIGFuIGV2ZW50IGlzIGNhbGxlZCBhZnRlciBhIHBhZ2UgaGFzIHVubG9hZGVkCgkJCQlyZXR1cm4gdHlwZW9mIGpRdWVyeSAhPT0gInVuZGVmaW5lZCIgJiYgKCFlIHx8IGpRdWVyeS5ldmVudC50cmlnZ2VyZWQgIT09IGUudHlwZSkgPwoJCQkJCWpRdWVyeS5ldmVudC5oYW5kbGUuYXBwbHkoIGV2ZW50SGFuZGxlLmVsZW0sIGFyZ3VtZW50cyApIDoKCQkJCQl1bmRlZmluZWQ7CgkJCX07CgkJfQoKCQkvLyBBZGQgZWxlbSBhcyBhIHByb3BlcnR5IG9mIHRoZSBoYW5kbGUgZnVuY3Rpb24KCQkvLyBUaGlzIGlzIHRvIHByZXZlbnQgYSBtZW1vcnkgbGVhayB3aXRoIG5vbi1uYXRpdmUgZXZlbnRzIGluIElFLgoJCWV2ZW50SGFuZGxlLmVsZW0gPSBlbGVtOwoKCQkvLyBIYW5kbGUgbXVsdGlwbGUgZXZlbnRzIHNlcGFyYXRlZCBieSBhIHNwYWNlCgkJLy8galF1ZXJ5KC4uLikuYmluZCgibW91c2VvdmVyIG1vdXNlb3V0IiwgZm4pOwoJCXR5cGVzID0gdHlwZXMuc3BsaXQoIiAiKTsKCgkJdmFyIHR5cGUsIGkgPSAwLCBuYW1lc3BhY2VzOwoKCQl3aGlsZSAoICh0eXBlID0gdHlwZXNbIGkrKyBdKSApIHsKCQkJaGFuZGxlT2JqID0gaGFuZGxlT2JqSW4gPwoJCQkJalF1ZXJ5LmV4dGVuZCh7fSwgaGFuZGxlT2JqSW4pIDoKCQkJCXsgaGFuZGxlcjogaGFuZGxlciwgZGF0YTogZGF0YSB9OwoKCQkJLy8gTmFtZXNwYWNlZCBldmVudCBoYW5kbGVycwoJCQlpZiAoIHR5cGUuaW5kZXhPZigiLiIpID4gLTEgKSB7CgkJCQluYW1lc3BhY2VzID0gdHlwZS5zcGxpdCgiLiIpOwoJCQkJdHlwZSA9IG5hbWVzcGFjZXMuc2hpZnQoKTsKCQkJCWhhbmRsZU9iai5uYW1lc3BhY2UgPSBuYW1lc3BhY2VzLnNsaWNlKDApLnNvcnQoKS5qb2luKCIuIik7CgoJCQl9IGVsc2UgewoJCQkJbmFtZXNwYWNlcyA9IFtdOwoJCQkJaGFuZGxlT2JqLm5hbWVzcGFjZSA9ICIiOwoJCQl9CgoJCQloYW5kbGVPYmoudHlwZSA9IHR5cGU7CgkJCWlmICggIWhhbmRsZU9iai5ndWlkICkgewoJCQkJaGFuZGxlT2JqLmd1aWQgPSBoYW5kbGVyLmd1aWQ7CgkJCX0KCgkJCS8vIEdldCB0aGUgY3VycmVudCBsaXN0IG9mIGZ1bmN0aW9ucyBib3VuZCB0byB0aGlzIGV2ZW50CgkJCXZhciBoYW5kbGVycyA9IGV2ZW50c1sgdHlwZSBdLAoJCQkJc3BlY2lhbCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsWyB0eXBlIF0gfHwge307CgoJCQkvLyBJbml0IHRoZSBldmVudCBoYW5kbGVyIHF1ZXVlCgkJCWlmICggIWhhbmRsZXJzICkgewoJCQkJaGFuZGxlcnMgPSBldmVudHNbIHR5cGUgXSA9IFtdOwoKCQkJCS8vIENoZWNrIGZvciBhIHNwZWNpYWwgZXZlbnQgaGFuZGxlcgoJCQkJLy8gT25seSB1c2UgYWRkRXZlbnRMaXN0ZW5lci9hdHRhY2hFdmVudCBpZiB0aGUgc3BlY2lhbAoJCQkJLy8gZXZlbnRzIGhhbmRsZXIgcmV0dXJucyBmYWxzZQoJCQkJaWYgKCAhc3BlY2lhbC5zZXR1cCB8fCBzcGVjaWFsLnNldHVwLmNhbGwoIGVsZW0sIGRhdGEsIG5hbWVzcGFjZXMsIGV2ZW50SGFuZGxlICkgPT09IGZhbHNlICkgewoJCQkJCS8vIEJpbmQgdGhlIGdsb2JhbCBldmVudCBoYW5kbGVyIHRvIHRoZSBlbGVtZW50CgkJCQkJaWYgKCBlbGVtLmFkZEV2ZW50TGlzdGVuZXIgKSB7CgkJCQkJCWVsZW0uYWRkRXZlbnRMaXN0ZW5lciggdHlwZSwgZXZlbnRIYW5kbGUsIGZhbHNlICk7CgoJCQkJCX0gZWxzZSBpZiAoIGVsZW0uYXR0YWNoRXZlbnQgKSB7CgkJCQkJCWVsZW0uYXR0YWNoRXZlbnQoICJvbiIgKyB0eXBlLCBldmVudEhhbmRsZSApOwoJCQkJCX0KCQkJCX0KCQkJfQoKCQkJaWYgKCBzcGVjaWFsLmFkZCApIHsKCQkJCXNwZWNpYWwuYWRkLmNhbGwoIGVsZW0sIGhhbmRsZU9iaiApOwoKCQkJCWlmICggIWhhbmRsZU9iai5oYW5kbGVyLmd1aWQgKSB7CgkJCQkJaGFuZGxlT2JqLmhhbmRsZXIuZ3VpZCA9IGhhbmRsZXIuZ3VpZDsKCQkJCX0KCQkJfQoKCQkJLy8gQWRkIHRoZSBmdW5jdGlvbiB0byB0aGUgZWxlbWVudCdzIGhhbmRsZXIgbGlzdAoJCQloYW5kbGVycy5wdXNoKCBoYW5kbGVPYmogKTsKCgkJCS8vIEtlZXAgdHJhY2sgb2Ygd2hpY2ggZXZlbnRzIGhhdmUgYmVlbiB1c2VkLCBmb3IgZXZlbnQgb3B0aW1pemF0aW9uCgkJCWpRdWVyeS5ldmVudC5nbG9iYWxbIHR5cGUgXSA9IHRydWU7CgkJfQoKCQkvLyBOdWxsaWZ5IGVsZW0gdG8gcHJldmVudCBtZW1vcnkgbGVha3MgaW4gSUUKCQllbGVtID0gbnVsbDsKCX0sCgoJZ2xvYmFsOiB7fSwKCgkvLyBEZXRhY2ggYW4gZXZlbnQgb3Igc2V0IG9mIGV2ZW50cyBmcm9tIGFuIGVsZW1lbnQKCXJlbW92ZTogZnVuY3Rpb24oIGVsZW0sIHR5cGVzLCBoYW5kbGVyLCBwb3MgKSB7CgkJLy8gZG9uJ3QgZG8gZXZlbnRzIG9uIHRleHQgYW5kIGNvbW1lbnQgbm9kZXMKCQlpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDMgfHwgZWxlbS5ub2RlVHlwZSA9PT0gOCApIHsKCQkJcmV0dXJuOwoJCX0KCgkJaWYgKCBoYW5kbGVyID09PSBmYWxzZSApIHsKCQkJaGFuZGxlciA9IHJldHVybkZhbHNlOwoJCX0KCgkJdmFyIHJldCwgdHlwZSwgZm4sIGosIGkgPSAwLCBhbGwsIG5hbWVzcGFjZXMsIG5hbWVzcGFjZSwgc3BlY2lhbCwgZXZlbnRUeXBlLCBoYW5kbGVPYmosIG9yaWdUeXBlLAoJCQllbGVtRGF0YSA9IGpRdWVyeS5oYXNEYXRhKCBlbGVtICkgJiYgalF1ZXJ5Ll9kYXRhKCBlbGVtICksCgkJCWV2ZW50cyA9IGVsZW1EYXRhICYmIGVsZW1EYXRhLmV2ZW50czsKCgkJaWYgKCAhZWxlbURhdGEgfHwgIWV2ZW50cyApIHsKCQkJcmV0dXJuOwoJCX0KCgkJLy8gdHlwZXMgaXMgYWN0dWFsbHkgYW4gZXZlbnQgb2JqZWN0IGhlcmUKCQlpZiAoIHR5cGVzICYmIHR5cGVzLnR5cGUgKSB7CgkJCWhhbmRsZXIgPSB0eXBlcy5oYW5kbGVyOwoJCQl0eXBlcyA9IHR5cGVzLnR5cGU7CgkJfQoKCQkvLyBVbmJpbmQgYWxsIGV2ZW50cyBmb3IgdGhlIGVsZW1lbnQKCQlpZiAoICF0eXBlcyB8fCB0eXBlb2YgdHlwZXMgPT09ICJzdHJpbmciICYmIHR5cGVzLmNoYXJBdCgwKSA9PT0gIi4iICkgewoJCQl0eXBlcyA9IHR5cGVzIHx8ICIiOwoKCQkJZm9yICggdHlwZSBpbiBldmVudHMgKSB7CgkJCQlqUXVlcnkuZXZlbnQucmVtb3ZlKCBlbGVtLCB0eXBlICsgdHlwZXMgKTsKCQkJfQoKCQkJcmV0dXJuOwoJCX0KCgkJLy8gSGFuZGxlIG11bHRpcGxlIGV2ZW50cyBzZXBhcmF0ZWQgYnkgYSBzcGFjZQoJCS8vIGpRdWVyeSguLi4pLnVuYmluZCgibW91c2VvdmVyIG1vdXNlb3V0IiwgZm4pOwoJCXR5cGVzID0gdHlwZXMuc3BsaXQoIiAiKTsKCgkJd2hpbGUgKCAodHlwZSA9IHR5cGVzWyBpKysgXSkgKSB7CgkJCW9yaWdUeXBlID0gdHlwZTsKCQkJaGFuZGxlT2JqID0gbnVsbDsKCQkJYWxsID0gdHlwZS5pbmRleE9mKCIuIikgPCAwOwoJCQluYW1lc3BhY2VzID0gW107CgoJCQlpZiAoICFhbGwgKSB7CgkJCQkvLyBOYW1lc3BhY2VkIGV2ZW50IGhhbmRsZXJzCgkJCQluYW1lc3BhY2VzID0gdHlwZS5zcGxpdCgiLiIpOwoJCQkJdHlwZSA9IG5hbWVzcGFjZXMuc2hpZnQoKTsKCgkJCQluYW1lc3BhY2UgPSBuZXcgUmVnRXhwKCIoXnxcXC4pIiArCgkJCQkJalF1ZXJ5Lm1hcCggbmFtZXNwYWNlcy5zbGljZSgwKS5zb3J0KCksIGZjbGVhbnVwICkuam9pbigiXFwuKD86LipcXC4pPyIpICsgIihcXC58JCkiKTsKCQkJfQoKCQkJZXZlbnRUeXBlID0gZXZlbnRzWyB0eXBlIF07CgoJCQlpZiAoICFldmVudFR5cGUgKSB7CgkJCQljb250aW51ZTsKCQkJfQoKCQkJaWYgKCAhaGFuZGxlciApIHsKCQkJCWZvciAoIGogPSAwOyBqIDwgZXZlbnRUeXBlLmxlbmd0aDsgaisrICkgewoJCQkJCWhhbmRsZU9iaiA9IGV2ZW50VHlwZVsgaiBdOwoKCQkJCQlpZiAoIGFsbCB8fCBuYW1lc3BhY2UudGVzdCggaGFuZGxlT2JqLm5hbWVzcGFjZSApICkgewoJCQkJCQlqUXVlcnkuZXZlbnQucmVtb3ZlKCBlbGVtLCBvcmlnVHlwZSwgaGFuZGxlT2JqLmhhbmRsZXIsIGogKTsKCQkJCQkJZXZlbnRUeXBlLnNwbGljZSggai0tLCAxICk7CgkJCQkJfQoJCQkJfQoKCQkJCWNvbnRpbnVlOwoJCQl9CgoJCQlzcGVjaWFsID0galF1ZXJ5LmV2ZW50LnNwZWNpYWxbIHR5cGUgXSB8fCB7fTsKCgkJCWZvciAoIGogPSBwb3MgfHwgMDsgaiA8IGV2ZW50VHlwZS5sZW5ndGg7IGorKyApIHsKCQkJCWhhbmRsZU9iaiA9IGV2ZW50VHlwZVsgaiBdOwoKCQkJCWlmICggaGFuZGxlci5ndWlkID09PSBoYW5kbGVPYmouZ3VpZCApIHsKCQkJCQkvLyByZW1vdmUgdGhlIGdpdmVuIGhhbmRsZXIgZm9yIHRoZSBnaXZlbiB0eXBlCgkJCQkJaWYgKCBhbGwgfHwgbmFtZXNwYWNlLnRlc3QoIGhhbmRsZU9iai5uYW1lc3BhY2UgKSApIHsKCQkJCQkJaWYgKCBwb3MgPT0gbnVsbCApIHsKCQkJCQkJCWV2ZW50VHlwZS5zcGxpY2UoIGotLSwgMSApOwoJCQkJCQl9CgoJCQkJCQlpZiAoIHNwZWNpYWwucmVtb3ZlICkgewoJCQkJCQkJc3BlY2lhbC5yZW1vdmUuY2FsbCggZWxlbSwgaGFuZGxlT2JqICk7CgkJCQkJCX0KCQkJCQl9CgoJCQkJCWlmICggcG9zICE9IG51bGwgKSB7CgkJCQkJCWJyZWFrOwoJCQkJCX0KCQkJCX0KCQkJfQoKCQkJLy8gcmVtb3ZlIGdlbmVyaWMgZXZlbnQgaGFuZGxlciBpZiBubyBtb3JlIGhhbmRsZXJzIGV4aXN0CgkJCWlmICggZXZlbnRUeXBlLmxlbmd0aCA9PT0gMCB8fCBwb3MgIT0gbnVsbCAmJiBldmVudFR5cGUubGVuZ3RoID09PSAxICkgewoJCQkJaWYgKCAhc3BlY2lhbC50ZWFyZG93biB8fCBzcGVjaWFsLnRlYXJkb3duLmNhbGwoIGVsZW0sIG5hbWVzcGFjZXMgKSA9PT0gZmFsc2UgKSB7CgkJCQkJalF1ZXJ5LnJlbW92ZUV2ZW50KCBlbGVtLCB0eXBlLCBlbGVtRGF0YS5oYW5kbGUgKTsKCQkJCX0KCgkJCQlyZXQgPSBudWxsOwoJCQkJZGVsZXRlIGV2ZW50c1sgdHlwZSBdOwoJCQl9CgkJfQoKCQkvLyBSZW1vdmUgdGhlIGV4cGFuZG8gaWYgaXQncyBubyBsb25nZXIgdXNlZAoJCWlmICggalF1ZXJ5LmlzRW1wdHlPYmplY3QoIGV2ZW50cyApICkgewoJCQl2YXIgaGFuZGxlID0gZWxlbURhdGEuaGFuZGxlOwoJCQlpZiAoIGhhbmRsZSApIHsKCQkJCWhhbmRsZS5lbGVtID0gbnVsbDsKCQkJfQoKCQkJZGVsZXRlIGVsZW1EYXRhLmV2ZW50czsKCQkJZGVsZXRlIGVsZW1EYXRhLmhhbmRsZTsKCgkJCWlmICggalF1ZXJ5LmlzRW1wdHlPYmplY3QoIGVsZW1EYXRhICkgKSB7CgkJCQlqUXVlcnkucmVtb3ZlRGF0YSggZWxlbSwgdW5kZWZpbmVkLCB0cnVlICk7CgkJCX0KCQl9Cgl9LAoJCgkvLyBFdmVudHMgdGhhdCBhcmUgc2FmZSB0byBzaG9ydC1jaXJjdWl0IGlmIG5vIGhhbmRsZXJzIGFyZSBhdHRhY2hlZC4KCS8vIE5hdGl2ZSBET00gZXZlbnRzIHNob3VsZCBub3QgYmUgYWRkZWQsIHRoZXkgbWF5IGhhdmUgaW5saW5lIGhhbmRsZXJzLgoJY3VzdG9tRXZlbnQ6IHsKCQkiZ2V0RGF0YSI6IHRydWUsCgkJInNldERhdGEiOiB0cnVlLAoJCSJjaGFuZ2VEYXRhIjogdHJ1ZQoJfSwKCgl0cmlnZ2VyOiBmdW5jdGlvbiggZXZlbnQsIGRhdGEsIGVsZW0sIG9ubHlIYW5kbGVycyApIHsKCQkvLyBFdmVudCBvYmplY3Qgb3IgZXZlbnQgdHlwZQoJCXZhciB0eXBlID0gZXZlbnQudHlwZSB8fCBldmVudCwKCQkJbmFtZXNwYWNlcyA9IFtdLAoJCQlleGNsdXNpdmU7CgoJCWlmICggdHlwZS5pbmRleE9mKCIhIikgPj0gMCApIHsKCQkJLy8gRXhjbHVzaXZlIGV2ZW50cyB0cmlnZ2VyIG9ubHkgZm9yIHRoZSBleGFjdCBldmVudCAobm8gbmFtZXNwYWNlcykKCQkJdHlwZSA9IHR5cGUuc2xpY2UoMCwgLTEpOwoJCQlleGNsdXNpdmUgPSB0cnVlOwoJCX0KCgkJaWYgKCB0eXBlLmluZGV4T2YoIi4iKSA+PSAwICkgewoJCQkvLyBOYW1lc3BhY2VkIHRyaWdnZXI7IGNyZWF0ZSBhIHJlZ2V4cCB0byBtYXRjaCBldmVudCB0eXBlIGluIGhhbmRsZSgpCgkJCW5hbWVzcGFjZXMgPSB0eXBlLnNwbGl0KCIuIik7CgkJCXR5cGUgPSBuYW1lc3BhY2VzLnNoaWZ0KCk7CgkJCW5hbWVzcGFjZXMuc29ydCgpOwoJCX0KCgkJaWYgKCAoIWVsZW0gfHwgalF1ZXJ5LmV2ZW50LmN1c3RvbUV2ZW50WyB0eXBlIF0pICYmICFqUXVlcnkuZXZlbnQuZ2xvYmFsWyB0eXBlIF0gKSB7CgkJCS8vIE5vIGpRdWVyeSBoYW5kbGVycyBmb3IgdGhpcyBldmVudCB0eXBlLCBhbmQgaXQgY2FuJ3QgaGF2ZSBpbmxpbmUgaGFuZGxlcnMKCQkJcmV0dXJuOwoJCX0KCgkJLy8gQ2FsbGVyIGNhbiBwYXNzIGluIGFuIEV2ZW50LCBPYmplY3QsIG9yIGp1c3QgYW4gZXZlbnQgdHlwZSBzdHJpbmcKCQlldmVudCA9IHR5cGVvZiBldmVudCA9PT0gIm9iamVjdCIgPwoJCQkvLyBqUXVlcnkuRXZlbnQgb2JqZWN0CgkJCWV2ZW50WyBqUXVlcnkuZXhwYW5kbyBdID8gZXZlbnQgOgoJCQkvLyBPYmplY3QgbGl0ZXJhbAoJCQluZXcgalF1ZXJ5LkV2ZW50KCB0eXBlLCBldmVudCApIDoKCQkJLy8gSnVzdCB0aGUgZXZlbnQgdHlwZSAoc3RyaW5nKQoJCQluZXcgalF1ZXJ5LkV2ZW50KCB0eXBlICk7CgoJCWV2ZW50LnR5cGUgPSB0eXBlOwoJCWV2ZW50LmV4Y2x1c2l2ZSA9IGV4Y2x1c2l2ZTsKCQlldmVudC5uYW1lc3BhY2UgPSBuYW1lc3BhY2VzLmpvaW4oIi4iKTsKCQlldmVudC5uYW1lc3BhY2VfcmUgPSBuZXcgUmVnRXhwKCIoXnxcXC4pIiArIG5hbWVzcGFjZXMuam9pbigiXFwuKD86LipcXC4pPyIpICsgIihcXC58JCkiKTsKCQkKCQkvLyB0cmlnZ2VySGFuZGxlcigpIGFuZCBnbG9iYWwgZXZlbnRzIGRvbid0IGJ1YmJsZSBvciBydW4gdGhlIGRlZmF1bHQgYWN0aW9uCgkJaWYgKCBvbmx5SGFuZGxlcnMgfHwgIWVsZW0gKSB7CgkJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7CgkJCWV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOwoJCX0KCgkJLy8gSGFuZGxlIGEgZ2xvYmFsIHRyaWdnZXIKCQlpZiAoICFlbGVtICkgewoJCQkvLyBUT0RPOiBTdG9wIHRhdW50aW5nIHRoZSBkYXRhIGNhY2hlOyByZW1vdmUgZ2xvYmFsIGV2ZW50cyBhbmQgYWx3YXlzIGF0dGFjaCB0byBkb2N1bWVudAoJCQlqUXVlcnkuZWFjaCggalF1ZXJ5LmNhY2hlLCBmdW5jdGlvbigpIHsKCQkJCS8vIGludGVybmFsS2V5IHZhcmlhYmxlIGlzIGp1c3QgdXNlZCB0byBtYWtlIGl0IGVhc2llciB0byBmaW5kCgkJCQkvLyBhbmQgcG90ZW50aWFsbHkgY2hhbmdlIHRoaXMgc3R1ZmYgbGF0ZXI7IGN1cnJlbnRseSBpdCBqdXN0CgkJCQkvLyBwb2ludHMgdG8galF1ZXJ5LmV4cGFuZG8KCQkJCXZhciBpbnRlcm5hbEtleSA9IGpRdWVyeS5leHBhbmRvLAoJCQkJCWludGVybmFsQ2FjaGUgPSB0aGlzWyBpbnRlcm5hbEtleSBdOwoJCQkJaWYgKCBpbnRlcm5hbENhY2hlICYmIGludGVybmFsQ2FjaGUuZXZlbnRzICYmIGludGVybmFsQ2FjaGUuZXZlbnRzWyB0eXBlIF0gKSB7CgkJCQkJalF1ZXJ5LmV2ZW50LnRyaWdnZXIoIGV2ZW50LCBkYXRhLCBpbnRlcm5hbENhY2hlLmhhbmRsZS5lbGVtICk7CgkJCQl9CgkJCX0pOwoJCQlyZXR1cm47CgkJfQoKCQkvLyBEb24ndCBkbyBldmVudHMgb24gdGV4dCBhbmQgY29tbWVudCBub2RlcwoJCWlmICggZWxlbS5ub2RlVHlwZSA9PT0gMyB8fCBlbGVtLm5vZGVUeXBlID09PSA4ICkgewoJCQlyZXR1cm47CgkJfQoKCQkvLyBDbGVhbiB1cCB0aGUgZXZlbnQgaW4gY2FzZSBpdCBpcyBiZWluZyByZXVzZWQKCQlldmVudC5yZXN1bHQgPSB1bmRlZmluZWQ7CgkJZXZlbnQudGFyZ2V0ID0gZWxlbTsKCgkJLy8gQ2xvbmUgYW55IGluY29taW5nIGRhdGEgYW5kIHByZXBlbmQgdGhlIGV2ZW50LCBjcmVhdGluZyB0aGUgaGFuZGxlciBhcmcgbGlzdAoJCWRhdGEgPSBkYXRhICE9IG51bGwgPyBqUXVlcnkubWFrZUFycmF5KCBkYXRhICkgOiBbXTsKCQlkYXRhLnVuc2hpZnQoIGV2ZW50ICk7CgoJCXZhciBjdXIgPSBlbGVtLAoJCQkvLyBJRSBkb2Vzbid0IGxpa2UgbWV0aG9kIG5hbWVzIHdpdGggYSBjb2xvbiAoIzM1MzMsICM4MjcyKQoJCQlvbnR5cGUgPSB0eXBlLmluZGV4T2YoIjoiKSA8IDAgPyAib24iICsgdHlwZSA6ICIiOwoKCQkvLyBGaXJlIGV2ZW50IG9uIHRoZSBjdXJyZW50IGVsZW1lbnQsIHRoZW4gYnViYmxlIHVwIHRoZSBET00gdHJlZQoJCWRvIHsKCQkJdmFyIGhhbmRsZSA9IGpRdWVyeS5fZGF0YSggY3VyLCAiaGFuZGxlIiApOwoKCQkJZXZlbnQuY3VycmVudFRhcmdldCA9IGN1cjsKCQkJaWYgKCBoYW5kbGUgKSB7CgkJCQloYW5kbGUuYXBwbHkoIGN1ciwgZGF0YSApOwoJCQl9CgoJCQkvLyBUcmlnZ2VyIGFuIGlubGluZSBib3VuZCBzY3JpcHQKCQkJaWYgKCBvbnR5cGUgJiYgalF1ZXJ5LmFjY2VwdERhdGEoIGN1ciApICYmIGN1clsgb250eXBlIF0gJiYgY3VyWyBvbnR5cGUgXS5hcHBseSggY3VyLCBkYXRhICkgPT09IGZhbHNlICkgewoJCQkJZXZlbnQucmVzdWx0ID0gZmFsc2U7CgkJCQlldmVudC5wcmV2ZW50RGVmYXVsdCgpOwoJCQl9CgoJCQkvLyBCdWJibGUgdXAgdG8gZG9jdW1lbnQsIHRoZW4gdG8gd2luZG93CgkJCWN1ciA9IGN1ci5wYXJlbnROb2RlIHx8IGN1ci5vd25lckRvY3VtZW50IHx8IGN1ciA9PT0gZXZlbnQudGFyZ2V0Lm93bmVyRG9jdW1lbnQgJiYgd2luZG93OwoJCX0gd2hpbGUgKCBjdXIgJiYgIWV2ZW50LmlzUHJvcGFnYXRpb25TdG9wcGVkKCkgKTsKCgkJLy8gSWYgbm9ib2R5IHByZXZlbnRlZCB0aGUgZGVmYXVsdCBhY3Rpb24sIGRvIGl0IG5vdwoJCWlmICggIWV2ZW50LmlzRGVmYXVsdFByZXZlbnRlZCgpICkgewoJCQl2YXIgb2xkLAoJCQkJc3BlY2lhbCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsWyB0eXBlIF0gfHwge307CgoJCQlpZiAoICghc3BlY2lhbC5fZGVmYXVsdCB8fCBzcGVjaWFsLl9kZWZhdWx0LmNhbGwoIGVsZW0ub3duZXJEb2N1bWVudCwgZXZlbnQgKSA9PT0gZmFsc2UpICYmCgkJCQkhKHR5cGUgPT09ICJjbGljayIgJiYgalF1ZXJ5Lm5vZGVOYW1lKCBlbGVtLCAiYSIgKSkgJiYgalF1ZXJ5LmFjY2VwdERhdGEoIGVsZW0gKSApIHsKCgkJCQkvLyBDYWxsIGEgbmF0aXZlIERPTSBtZXRob2Qgb24gdGhlIHRhcmdldCB3aXRoIHRoZSBzYW1lIG5hbWUgbmFtZSBhcyB0aGUgZXZlbnQuCgkJCQkvLyBDYW4ndCB1c2UgYW4gLmlzRnVuY3Rpb24pKCkgY2hlY2sgaGVyZSBiZWNhdXNlIElFNi83IGZhaWxzIHRoYXQgdGVzdC4KCQkJCS8vIElFPDkgZGllcyBvbiBmb2N1cyB0byBoaWRkZW4gZWxlbWVudCAoIzE0ODYpLCBtYXkgd2FudCB0byByZXZpc2l0IGEgdHJ5L2NhdGNoLgoJCQkJdHJ5IHsKCQkJCQlpZiAoIG9udHlwZSAmJiBlbGVtWyB0eXBlIF0gKSB7CgkJCQkJCS8vIERvbid0IHJlLXRyaWdnZXIgYW4gb25GT08gZXZlbnQgd2hlbiB3ZSBjYWxsIGl0cyBGT08oKSBtZXRob2QKCQkJCQkJb2xkID0gZWxlbVsgb250eXBlIF07CgoJCQkJCQlpZiAoIG9sZCApIHsKCQkJCQkJCWVsZW1bIG9udHlwZSBdID0gbnVsbDsKCQkJCQkJfQoKCQkJCQkJalF1ZXJ5LmV2ZW50LnRyaWdnZXJlZCA9IHR5cGU7CgkJCQkJCWVsZW1bIHR5cGUgXSgpOwoJCQkJCX0KCQkJCX0gY2F0Y2ggKCBpZUVycm9yICkge30KCgkJCQlpZiAoIG9sZCApIHsKCQkJCQllbGVtWyBvbnR5cGUgXSA9IG9sZDsKCQkJCX0KCgkJCQlqUXVlcnkuZXZlbnQudHJpZ2dlcmVkID0gdW5kZWZpbmVkOwoJCQl9CgkJfQoJCQoJCXJldHVybiBldmVudC5yZXN1bHQ7Cgl9LAoKCWhhbmRsZTogZnVuY3Rpb24oIGV2ZW50ICkgewoJCWV2ZW50ID0galF1ZXJ5LmV2ZW50LmZpeCggZXZlbnQgfHwgd2luZG93LmV2ZW50ICk7CgkJLy8gU25hcHNob3QgdGhlIGhhbmRsZXJzIGxpc3Qgc2luY2UgYSBjYWxsZWQgaGFuZGxlciBtYXkgYWRkL3JlbW92ZSBldmVudHMuCgkJdmFyIGhhbmRsZXJzID0gKChqUXVlcnkuX2RhdGEoIHRoaXMsICJldmVudHMiICkgfHwge30pWyBldmVudC50eXBlIF0gfHwgW10pLnNsaWNlKDApLAoJCQlydW5fYWxsID0gIWV2ZW50LmV4Y2x1c2l2ZSAmJiAhZXZlbnQubmFtZXNwYWNlLAoJCQlhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoIGFyZ3VtZW50cywgMCApOwoKCQkvLyBVc2UgdGhlIGZpeC1lZCBFdmVudCByYXRoZXIgdGhhbiB0aGUgKHJlYWQtb25seSkgbmF0aXZlIGV2ZW50CgkJYXJnc1swXSA9IGV2ZW50OwoJCWV2ZW50LmN1cnJlbnRUYXJnZXQgPSB0aGlzOwoKCQlmb3IgKCB2YXIgaiA9IDAsIGwgPSBoYW5kbGVycy5sZW5ndGg7IGogPCBsOyBqKysgKSB7CgkJCXZhciBoYW5kbGVPYmogPSBoYW5kbGVyc1sgaiBdOwoKCQkJLy8gVHJpZ2dlcmVkIGV2ZW50IG11c3QgMSkgYmUgbm9uLWV4Y2x1c2l2ZSBhbmQgaGF2ZSBubyBuYW1lc3BhY2UsIG9yCgkJCS8vIDIpIGhhdmUgbmFtZXNwYWNlKHMpIGEgc3Vic2V0IG9yIGVxdWFsIHRvIHRob3NlIGluIHRoZSBib3VuZCBldmVudC4KCQkJaWYgKCBydW5fYWxsIHx8IGV2ZW50Lm5hbWVzcGFjZV9yZS50ZXN0KCBoYW5kbGVPYmoubmFtZXNwYWNlICkgKSB7CgkJCQkvLyBQYXNzIGluIGEgcmVmZXJlbmNlIHRvIHRoZSBoYW5kbGVyIGZ1bmN0aW9uIGl0c2VsZgoJCQkJLy8gU28gdGhhdCB3ZSBjYW4gbGF0ZXIgcmVtb3ZlIGl0CgkJCQlldmVudC5oYW5kbGVyID0gaGFuZGxlT2JqLmhhbmRsZXI7CgkJCQlldmVudC5kYXRhID0gaGFuZGxlT2JqLmRhdGE7CgkJCQlldmVudC5oYW5kbGVPYmogPSBoYW5kbGVPYmo7CgoJCQkJdmFyIHJldCA9IGhhbmRsZU9iai5oYW5kbGVyLmFwcGx5KCB0aGlzLCBhcmdzICk7CgoJCQkJaWYgKCByZXQgIT09IHVuZGVmaW5lZCApIHsKCQkJCQlldmVudC5yZXN1bHQgPSByZXQ7CgkJCQkJaWYgKCByZXQgPT09IGZhbHNlICkgewoJCQkJCQlldmVudC5wcmV2ZW50RGVmYXVsdCgpOwoJCQkJCQlldmVudC5zdG9wUHJvcGFnYXRpb24oKTsKCQkJCQl9CgkJCQl9CgoJCQkJaWYgKCBldmVudC5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpICkgewoJCQkJCWJyZWFrOwoJCQkJfQoJCQl9CgkJfQoJCXJldHVybiBldmVudC5yZXN1bHQ7Cgl9LAoKCXByb3BzOiAiYWx0S2V5IGF0dHJDaGFuZ2UgYXR0ck5hbWUgYnViYmxlcyBidXR0b24gY2FuY2VsYWJsZSBjaGFyQ29kZSBjbGllbnRYIGNsaWVudFkgY3RybEtleSBjdXJyZW50VGFyZ2V0IGRhdGEgZGV0YWlsIGV2ZW50UGhhc2UgZnJvbUVsZW1lbnQgaGFuZGxlciBrZXlDb2RlIGxheWVyWCBsYXllclkgbWV0YUtleSBuZXdWYWx1ZSBvZmZzZXRYIG9mZnNldFkgcGFnZVggcGFnZVkgcHJldlZhbHVlIHJlbGF0ZWROb2RlIHJlbGF0ZWRUYXJnZXQgc2NyZWVuWCBzY3JlZW5ZIHNoaWZ0S2V5IHNyY0VsZW1lbnQgdGFyZ2V0IHRvRWxlbWVudCB2aWV3IHdoZWVsRGVsdGEgd2hpY2giLnNwbGl0KCIgIiksCgoJZml4OiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJaWYgKCBldmVudFsgalF1ZXJ5LmV4cGFuZG8gXSApIHsKCQkJcmV0dXJuIGV2ZW50OwoJCX0KCgkJLy8gc3RvcmUgYSBjb3B5IG9mIHRoZSBvcmlnaW5hbCBldmVudCBvYmplY3QKCQkvLyBhbmQgImNsb25lIiB0byBzZXQgcmVhZC1vbmx5IHByb3BlcnRpZXMKCQl2YXIgb3JpZ2luYWxFdmVudCA9IGV2ZW50OwoJCWV2ZW50ID0galF1ZXJ5LkV2ZW50KCBvcmlnaW5hbEV2ZW50ICk7CgoJCWZvciAoIHZhciBpID0gdGhpcy5wcm9wcy5sZW5ndGgsIHByb3A7IGk7ICkgewoJCQlwcm9wID0gdGhpcy5wcm9wc1sgLS1pIF07CgkJCWV2ZW50WyBwcm9wIF0gPSBvcmlnaW5hbEV2ZW50WyBwcm9wIF07CgkJfQoKCQkvLyBGaXggdGFyZ2V0IHByb3BlcnR5LCBpZiBuZWNlc3NhcnkKCQlpZiAoICFldmVudC50YXJnZXQgKSB7CgkJCS8vIEZpeGVzICMxOTI1IHdoZXJlIHNyY0VsZW1lbnQgbWlnaHQgbm90IGJlIGRlZmluZWQgZWl0aGVyCgkJCWV2ZW50LnRhcmdldCA9IGV2ZW50LnNyY0VsZW1lbnQgfHwgZG9jdW1lbnQ7CgkJfQoKCQkvLyBjaGVjayBpZiB0YXJnZXQgaXMgYSB0ZXh0bm9kZSAoc2FmYXJpKQoJCWlmICggZXZlbnQudGFyZ2V0Lm5vZGVUeXBlID09PSAzICkgewoJCQlldmVudC50YXJnZXQgPSBldmVudC50YXJnZXQucGFyZW50Tm9kZTsKCQl9CgoJCS8vIEFkZCByZWxhdGVkVGFyZ2V0LCBpZiBuZWNlc3NhcnkKCQlpZiAoICFldmVudC5yZWxhdGVkVGFyZ2V0ICYmIGV2ZW50LmZyb21FbGVtZW50ICkgewoJCQlldmVudC5yZWxhdGVkVGFyZ2V0ID0gZXZlbnQuZnJvbUVsZW1lbnQgPT09IGV2ZW50LnRhcmdldCA/IGV2ZW50LnRvRWxlbWVudCA6IGV2ZW50LmZyb21FbGVtZW50OwoJCX0KCgkJLy8gQ2FsY3VsYXRlIHBhZ2VYL1kgaWYgbWlzc2luZyBhbmQgY2xpZW50WC9ZIGF2YWlsYWJsZQoJCWlmICggZXZlbnQucGFnZVggPT0gbnVsbCAmJiBldmVudC5jbGllbnRYICE9IG51bGwgKSB7CgkJCXZhciBldmVudERvY3VtZW50ID0gZXZlbnQudGFyZ2V0Lm93bmVyRG9jdW1lbnQgfHwgZG9jdW1lbnQsCgkJCQlkb2MgPSBldmVudERvY3VtZW50LmRvY3VtZW50RWxlbWVudCwKCQkJCWJvZHkgPSBldmVudERvY3VtZW50LmJvZHk7CgoJCQlldmVudC5wYWdlWCA9IGV2ZW50LmNsaWVudFggKyAoZG9jICYmIGRvYy5zY3JvbGxMZWZ0IHx8IGJvZHkgJiYgYm9keS5zY3JvbGxMZWZ0IHx8IDApIC0gKGRvYyAmJiBkb2MuY2xpZW50TGVmdCB8fCBib2R5ICYmIGJvZHkuY2xpZW50TGVmdCB8fCAwKTsKCQkJZXZlbnQucGFnZVkgPSBldmVudC5jbGllbnRZICsgKGRvYyAmJiBkb2Muc2Nyb2xsVG9wICB8fCBib2R5ICYmIGJvZHkuc2Nyb2xsVG9wICB8fCAwKSAtIChkb2MgJiYgZG9jLmNsaWVudFRvcCAgfHwgYm9keSAmJiBib2R5LmNsaWVudFRvcCAgfHwgMCk7CgkJfQoKCQkvLyBBZGQgd2hpY2ggZm9yIGtleSBldmVudHMKCQlpZiAoIGV2ZW50LndoaWNoID09IG51bGwgJiYgKGV2ZW50LmNoYXJDb2RlICE9IG51bGwgfHwgZXZlbnQua2V5Q29kZSAhPSBudWxsKSApIHsKCQkJZXZlbnQud2hpY2ggPSBldmVudC5jaGFyQ29kZSAhPSBudWxsID8gZXZlbnQuY2hhckNvZGUgOiBldmVudC5rZXlDb2RlOwoJCX0KCgkJLy8gQWRkIG1ldGFLZXkgdG8gbm9uLU1hYyBicm93c2VycyAodXNlIGN0cmwgZm9yIFBDJ3MgYW5kIE1ldGEgZm9yIE1hY3MpCgkJaWYgKCAhZXZlbnQubWV0YUtleSAmJiBldmVudC5jdHJsS2V5ICkgewoJCQlldmVudC5tZXRhS2V5ID0gZXZlbnQuY3RybEtleTsKCQl9CgoJCS8vIEFkZCB3aGljaCBmb3IgY2xpY2s6IDEgPT09IGxlZnQ7IDIgPT09IG1pZGRsZTsgMyA9PT0gcmlnaHQKCQkvLyBOb3RlOiBidXR0b24gaXMgbm90IG5vcm1hbGl6ZWQsIHNvIGRvbid0IHVzZSBpdAoJCWlmICggIWV2ZW50LndoaWNoICYmIGV2ZW50LmJ1dHRvbiAhPT0gdW5kZWZpbmVkICkgewoJCQlldmVudC53aGljaCA9IChldmVudC5idXR0b24gJiAxID8gMSA6ICggZXZlbnQuYnV0dG9uICYgMiA/IDMgOiAoIGV2ZW50LmJ1dHRvbiAmIDQgPyAyIDogMCApICkpOwoJCX0KCgkJcmV0dXJuIGV2ZW50OwoJfSwKCgkvLyBEZXByZWNhdGVkLCB1c2UgalF1ZXJ5Lmd1aWQgaW5zdGVhZAoJZ3VpZDogMUU4LAoKCS8vIERlcHJlY2F0ZWQsIHVzZSBqUXVlcnkucHJveHkgaW5zdGVhZAoJcHJveHk6IGpRdWVyeS5wcm94eSwKCglzcGVjaWFsOiB7CgkJcmVhZHk6IHsKCQkJLy8gTWFrZSBzdXJlIHRoZSByZWFkeSBldmVudCBpcyBzZXR1cAoJCQlzZXR1cDogalF1ZXJ5LmJpbmRSZWFkeSwKCQkJdGVhcmRvd246IGpRdWVyeS5ub29wCgkJfSwKCgkJbGl2ZTogewoJCQlhZGQ6IGZ1bmN0aW9uKCBoYW5kbGVPYmogKSB7CgkJCQlqUXVlcnkuZXZlbnQuYWRkKCB0aGlzLAoJCQkJCWxpdmVDb252ZXJ0KCBoYW5kbGVPYmoub3JpZ1R5cGUsIGhhbmRsZU9iai5zZWxlY3RvciApLAoJCQkJCWpRdWVyeS5leHRlbmQoe30sIGhhbmRsZU9iaiwge2hhbmRsZXI6IGxpdmVIYW5kbGVyLCBndWlkOiBoYW5kbGVPYmouaGFuZGxlci5ndWlkfSkgKTsKCQkJfSwKCgkJCXJlbW92ZTogZnVuY3Rpb24oIGhhbmRsZU9iaiApIHsKCQkJCWpRdWVyeS5ldmVudC5yZW1vdmUoIHRoaXMsIGxpdmVDb252ZXJ0KCBoYW5kbGVPYmoub3JpZ1R5cGUsIGhhbmRsZU9iai5zZWxlY3RvciApLCBoYW5kbGVPYmogKTsKCQkJfQoJCX0sCgoJCWJlZm9yZXVubG9hZDogewoJCQlzZXR1cDogZnVuY3Rpb24oIGRhdGEsIG5hbWVzcGFjZXMsIGV2ZW50SGFuZGxlICkgewoJCQkJLy8gV2Ugb25seSB3YW50IHRvIGRvIHRoaXMgc3BlY2lhbCBjYXNlIG9uIHdpbmRvd3MKCQkJCWlmICggalF1ZXJ5LmlzV2luZG93KCB0aGlzICkgKSB7CgkJCQkJdGhpcy5vbmJlZm9yZXVubG9hZCA9IGV2ZW50SGFuZGxlOwoJCQkJfQoJCQl9LAoKCQkJdGVhcmRvd246IGZ1bmN0aW9uKCBuYW1lc3BhY2VzLCBldmVudEhhbmRsZSApIHsKCQkJCWlmICggdGhpcy5vbmJlZm9yZXVubG9hZCA9PT0gZXZlbnRIYW5kbGUgKSB7CgkJCQkJdGhpcy5vbmJlZm9yZXVubG9hZCA9IG51bGw7CgkJCQl9CgkJCX0KCQl9Cgl9Cn07CgpqUXVlcnkucmVtb3ZlRXZlbnQgPSBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyID8KCWZ1bmN0aW9uKCBlbGVtLCB0eXBlLCBoYW5kbGUgKSB7CgkJaWYgKCBlbGVtLnJlbW92ZUV2ZW50TGlzdGVuZXIgKSB7CgkJCWVsZW0ucmVtb3ZlRXZlbnRMaXN0ZW5lciggdHlwZSwgaGFuZGxlLCBmYWxzZSApOwoJCX0KCX0gOgoJZnVuY3Rpb24oIGVsZW0sIHR5cGUsIGhhbmRsZSApIHsKCQlpZiAoIGVsZW0uZGV0YWNoRXZlbnQgKSB7CgkJCWVsZW0uZGV0YWNoRXZlbnQoICJvbiIgKyB0eXBlLCBoYW5kbGUgKTsKCQl9Cgl9OwoKalF1ZXJ5LkV2ZW50ID0gZnVuY3Rpb24oIHNyYywgcHJvcHMgKSB7CgkvLyBBbGxvdyBpbnN0YW50aWF0aW9uIHdpdGhvdXQgdGhlICduZXcnIGtleXdvcmQKCWlmICggIXRoaXMucHJldmVudERlZmF1bHQgKSB7CgkJcmV0dXJuIG5ldyBqUXVlcnkuRXZlbnQoIHNyYywgcHJvcHMgKTsKCX0KCgkvLyBFdmVudCBvYmplY3QKCWlmICggc3JjICYmIHNyYy50eXBlICkgewoJCXRoaXMub3JpZ2luYWxFdmVudCA9IHNyYzsKCQl0aGlzLnR5cGUgPSBzcmMudHlwZTsKCgkJLy8gRXZlbnRzIGJ1YmJsaW5nIHVwIHRoZSBkb2N1bWVudCBtYXkgaGF2ZSBiZWVuIG1hcmtlZCBhcyBwcmV2ZW50ZWQKCQkvLyBieSBhIGhhbmRsZXIgbG93ZXIgZG93biB0aGUgdHJlZTsgcmVmbGVjdCB0aGUgY29ycmVjdCB2YWx1ZS4KCQl0aGlzLmlzRGVmYXVsdFByZXZlbnRlZCA9IChzcmMuZGVmYXVsdFByZXZlbnRlZCB8fCBzcmMucmV0dXJuVmFsdWUgPT09IGZhbHNlIHx8CgkJCXNyYy5nZXRQcmV2ZW50RGVmYXVsdCAmJiBzcmMuZ2V0UHJldmVudERlZmF1bHQoKSkgPyByZXR1cm5UcnVlIDogcmV0dXJuRmFsc2U7CgoJLy8gRXZlbnQgdHlwZQoJfSBlbHNlIHsKCQl0aGlzLnR5cGUgPSBzcmM7Cgl9CgoJLy8gUHV0IGV4cGxpY2l0bHkgcHJvdmlkZWQgcHJvcGVydGllcyBvbnRvIHRoZSBldmVudCBvYmplY3QKCWlmICggcHJvcHMgKSB7CgkJalF1ZXJ5LmV4dGVuZCggdGhpcywgcHJvcHMgKTsKCX0KCgkvLyB0aW1lU3RhbXAgaXMgYnVnZ3kgZm9yIHNvbWUgZXZlbnRzIG9uIEZpcmVmb3goIzM4NDMpCgkvLyBTbyB3ZSB3b24ndCByZWx5IG9uIHRoZSBuYXRpdmUgdmFsdWUKCXRoaXMudGltZVN0YW1wID0galF1ZXJ5Lm5vdygpOwoKCS8vIE1hcmsgaXQgYXMgZml4ZWQKCXRoaXNbIGpRdWVyeS5leHBhbmRvIF0gPSB0cnVlOwp9OwoKZnVuY3Rpb24gcmV0dXJuRmFsc2UoKSB7CglyZXR1cm4gZmFsc2U7Cn0KZnVuY3Rpb24gcmV0dXJuVHJ1ZSgpIHsKCXJldHVybiB0cnVlOwp9CgovLyBqUXVlcnkuRXZlbnQgaXMgYmFzZWQgb24gRE9NMyBFdmVudHMgYXMgc3BlY2lmaWVkIGJ5IHRoZSBFQ01BU2NyaXB0IExhbmd1YWdlIEJpbmRpbmcKLy8gaHR0cDovL3d3dy53My5vcmcvVFIvMjAwMy9XRC1ET00tTGV2ZWwtMy1FdmVudHMtMjAwMzAzMzEvZWNtYS1zY3JpcHQtYmluZGluZy5odG1sCmpRdWVyeS5FdmVudC5wcm90b3R5cGUgPSB7CglwcmV2ZW50RGVmYXVsdDogZnVuY3Rpb24oKSB7CgkJdGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQgPSByZXR1cm5UcnVlOwoKCQl2YXIgZSA9IHRoaXMub3JpZ2luYWxFdmVudDsKCQlpZiAoICFlICkgewoJCQlyZXR1cm47CgkJfQoKCQkvLyBpZiBwcmV2ZW50RGVmYXVsdCBleGlzdHMgcnVuIGl0IG9uIHRoZSBvcmlnaW5hbCBldmVudAoJCWlmICggZS5wcmV2ZW50RGVmYXVsdCApIHsKCQkJZS5wcmV2ZW50RGVmYXVsdCgpOwoKCQkvLyBvdGhlcndpc2Ugc2V0IHRoZSByZXR1cm5WYWx1ZSBwcm9wZXJ0eSBvZiB0aGUgb3JpZ2luYWwgZXZlbnQgdG8gZmFsc2UgKElFKQoJCX0gZWxzZSB7CgkJCWUucmV0dXJuVmFsdWUgPSBmYWxzZTsKCQl9Cgl9LAoJc3RvcFByb3BhZ2F0aW9uOiBmdW5jdGlvbigpIHsKCQl0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkID0gcmV0dXJuVHJ1ZTsKCgkJdmFyIGUgPSB0aGlzLm9yaWdpbmFsRXZlbnQ7CgkJaWYgKCAhZSApIHsKCQkJcmV0dXJuOwoJCX0KCQkvLyBpZiBzdG9wUHJvcGFnYXRpb24gZXhpc3RzIHJ1biBpdCBvbiB0aGUgb3JpZ2luYWwgZXZlbnQKCQlpZiAoIGUuc3RvcFByb3BhZ2F0aW9uICkgewoJCQllLnN0b3BQcm9wYWdhdGlvbigpOwoJCX0KCQkvLyBvdGhlcndpc2Ugc2V0IHRoZSBjYW5jZWxCdWJibGUgcHJvcGVydHkgb2YgdGhlIG9yaWdpbmFsIGV2ZW50IHRvIHRydWUgKElFKQoJCWUuY2FuY2VsQnViYmxlID0gdHJ1ZTsKCX0sCglzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb246IGZ1bmN0aW9uKCkgewoJCXRoaXMuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQgPSByZXR1cm5UcnVlOwoJCXRoaXMuc3RvcFByb3BhZ2F0aW9uKCk7Cgl9LAoJaXNEZWZhdWx0UHJldmVudGVkOiByZXR1cm5GYWxzZSwKCWlzUHJvcGFnYXRpb25TdG9wcGVkOiByZXR1cm5GYWxzZSwKCWlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkOiByZXR1cm5GYWxzZQp9OwoKLy8gQ2hlY2tzIGlmIGFuIGV2ZW50IGhhcHBlbmVkIG9uIGFuIGVsZW1lbnQgd2l0aGluIGFub3RoZXIgZWxlbWVudAovLyBVc2VkIGluIGpRdWVyeS5ldmVudC5zcGVjaWFsLm1vdXNlZW50ZXIgYW5kIG1vdXNlbGVhdmUgaGFuZGxlcnMKdmFyIHdpdGhpbkVsZW1lbnQgPSBmdW5jdGlvbiggZXZlbnQgKSB7CgoJLy8gQ2hlY2sgaWYgbW91c2Uob3ZlcnxvdXQpIGFyZSBzdGlsbCB3aXRoaW4gdGhlIHNhbWUgcGFyZW50IGVsZW1lbnQKCXZhciByZWxhdGVkID0gZXZlbnQucmVsYXRlZFRhcmdldCwKCQlpbnNpZGUgPSBmYWxzZSwKCQlldmVudFR5cGUgPSBldmVudC50eXBlOwoKCWV2ZW50LnR5cGUgPSBldmVudC5kYXRhOwoKCWlmICggcmVsYXRlZCAhPT0gdGhpcyApIHsKCgkJaWYgKCByZWxhdGVkICkgewoJCQlpbnNpZGUgPSBqUXVlcnkuY29udGFpbnMoIHRoaXMsIHJlbGF0ZWQgKTsKCQl9CgoJCWlmICggIWluc2lkZSApIHsKCgkJCWpRdWVyeS5ldmVudC5oYW5kbGUuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApOwoKCQkJZXZlbnQudHlwZSA9IGV2ZW50VHlwZTsKCQl9Cgl9Cn0sCgovLyBJbiBjYXNlIG9mIGV2ZW50IGRlbGVnYXRpb24sIHdlIG9ubHkgbmVlZCB0byByZW5hbWUgdGhlIGV2ZW50LnR5cGUsCi8vIGxpdmVIYW5kbGVyIHdpbGwgdGFrZSBjYXJlIG9mIHRoZSByZXN0LgpkZWxlZ2F0ZSA9IGZ1bmN0aW9uKCBldmVudCApIHsKCWV2ZW50LnR5cGUgPSBldmVudC5kYXRhOwoJalF1ZXJ5LmV2ZW50LmhhbmRsZS5hcHBseSggdGhpcywgYXJndW1lbnRzICk7Cn07CgovLyBDcmVhdGUgbW91c2VlbnRlciBhbmQgbW91c2VsZWF2ZSBldmVudHMKalF1ZXJ5LmVhY2goewoJbW91c2VlbnRlcjogIm1vdXNlb3ZlciIsCgltb3VzZWxlYXZlOiAibW91c2VvdXQiCn0sIGZ1bmN0aW9uKCBvcmlnLCBmaXggKSB7CglqUXVlcnkuZXZlbnQuc3BlY2lhbFsgb3JpZyBdID0gewoJCXNldHVwOiBmdW5jdGlvbiggZGF0YSApIHsKCQkJalF1ZXJ5LmV2ZW50LmFkZCggdGhpcywgZml4LCBkYXRhICYmIGRhdGEuc2VsZWN0b3IgPyBkZWxlZ2F0ZSA6IHdpdGhpbkVsZW1lbnQsIG9yaWcgKTsKCQl9LAoJCXRlYXJkb3duOiBmdW5jdGlvbiggZGF0YSApIHsKCQkJalF1ZXJ5LmV2ZW50LnJlbW92ZSggdGhpcywgZml4LCBkYXRhICYmIGRhdGEuc2VsZWN0b3IgPyBkZWxlZ2F0ZSA6IHdpdGhpbkVsZW1lbnQgKTsKCQl9Cgl9Owp9KTsKCi8vIHN1Ym1pdCBkZWxlZ2F0aW9uCmlmICggIWpRdWVyeS5zdXBwb3J0LnN1Ym1pdEJ1YmJsZXMgKSB7CgoJalF1ZXJ5LmV2ZW50LnNwZWNpYWwuc3VibWl0ID0gewoJCXNldHVwOiBmdW5jdGlvbiggZGF0YSwgbmFtZXNwYWNlcyApIHsKCQkJaWYgKCAhalF1ZXJ5Lm5vZGVOYW1lKCB0aGlzLCAiZm9ybSIgKSApIHsKCQkJCWpRdWVyeS5ldmVudC5hZGQodGhpcywgImNsaWNrLnNwZWNpYWxTdWJtaXQiLCBmdW5jdGlvbiggZSApIHsKCQkJCQkvLyBBdm9pZCB0cmlnZ2VyaW5nIGVycm9yIG9uIG5vbi1leGlzdGVudCB0eXBlIGF0dHJpYnV0ZSBpbiBJRSBWTUwgKCM3MDcxKQoJCQkJCXZhciBlbGVtID0gZS50YXJnZXQsCgkJCQkJCXR5cGUgPSBqUXVlcnkubm9kZU5hbWUoIGVsZW0sICJpbnB1dCIgKSB8fCBqUXVlcnkubm9kZU5hbWUoIGVsZW0sICJidXR0b24iICkgPyBlbGVtLnR5cGUgOiAiIjsKCgkJCQkJaWYgKCAodHlwZSA9PT0gInN1Ym1pdCIgfHwgdHlwZSA9PT0gImltYWdlIikgJiYgalF1ZXJ5KCBlbGVtICkuY2xvc2VzdCgiZm9ybSIpLmxlbmd0aCApIHsKCQkJCQkJdHJpZ2dlciggInN1Ym1pdCIsIHRoaXMsIGFyZ3VtZW50cyApOwoJCQkJCX0KCQkJCX0pOwoKCQkJCWpRdWVyeS5ldmVudC5hZGQodGhpcywgImtleXByZXNzLnNwZWNpYWxTdWJtaXQiLCBmdW5jdGlvbiggZSApIHsKCQkJCQl2YXIgZWxlbSA9IGUudGFyZ2V0LAoJCQkJCQl0eXBlID0galF1ZXJ5Lm5vZGVOYW1lKCBlbGVtLCAiaW5wdXQiICkgfHwgalF1ZXJ5Lm5vZGVOYW1lKCBlbGVtLCAiYnV0dG9uIiApID8gZWxlbS50eXBlIDogIiI7CgoJCQkJCWlmICggKHR5cGUgPT09ICJ0ZXh0IiB8fCB0eXBlID09PSAicGFzc3dvcmQiKSAmJiBqUXVlcnkoIGVsZW0gKS5jbG9zZXN0KCJmb3JtIikubGVuZ3RoICYmIGUua2V5Q29kZSA9PT0gMTMgKSB7CgkJCQkJCXRyaWdnZXIoICJzdWJtaXQiLCB0aGlzLCBhcmd1bWVudHMgKTsKCQkJCQl9CgkJCQl9KTsKCgkJCX0gZWxzZSB7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KCQl9LAoKCQl0ZWFyZG93bjogZnVuY3Rpb24oIG5hbWVzcGFjZXMgKSB7CgkJCWpRdWVyeS5ldmVudC5yZW1vdmUoIHRoaXMsICIuc3BlY2lhbFN1Ym1pdCIgKTsKCQl9Cgl9OwoKfQoKLy8gY2hhbmdlIGRlbGVnYXRpb24sIGhhcHBlbnMgaGVyZSBzbyB3ZSBoYXZlIGJpbmQuCmlmICggIWpRdWVyeS5zdXBwb3J0LmNoYW5nZUJ1YmJsZXMgKSB7CgoJdmFyIGNoYW5nZUZpbHRlcnMsCgoJZ2V0VmFsID0gZnVuY3Rpb24oIGVsZW0gKSB7CgkJdmFyIHR5cGUgPSBqUXVlcnkubm9kZU5hbWUoIGVsZW0sICJpbnB1dCIgKSA/IGVsZW0udHlwZSA6ICIiLAoJCQl2YWwgPSBlbGVtLnZhbHVlOwoKCQlpZiAoIHR5cGUgPT09ICJyYWRpbyIgfHwgdHlwZSA9PT0gImNoZWNrYm94IiApIHsKCQkJdmFsID0gZWxlbS5jaGVja2VkOwoKCQl9IGVsc2UgaWYgKCB0eXBlID09PSAic2VsZWN0LW11bHRpcGxlIiApIHsKCQkJdmFsID0gZWxlbS5zZWxlY3RlZEluZGV4ID4gLTEgPwoJCQkJalF1ZXJ5Lm1hcCggZWxlbS5vcHRpb25zLCBmdW5jdGlvbiggZWxlbSApIHsKCQkJCQlyZXR1cm4gZWxlbS5zZWxlY3RlZDsKCQkJCX0pLmpvaW4oIi0iKSA6CgkJCQkiIjsKCgkJfSBlbHNlIGlmICggalF1ZXJ5Lm5vZGVOYW1lKCBlbGVtLCAic2VsZWN0IiApICkgewoJCQl2YWwgPSBlbGVtLnNlbGVjdGVkSW5kZXg7CgkJfQoKCQlyZXR1cm4gdmFsOwoJfSwKCgl0ZXN0Q2hhbmdlID0gZnVuY3Rpb24gdGVzdENoYW5nZSggZSApIHsKCQl2YXIgZWxlbSA9IGUudGFyZ2V0LCBkYXRhLCB2YWw7CgoJCWlmICggIXJmb3JtRWxlbXMudGVzdCggZWxlbS5ub2RlTmFtZSApIHx8IGVsZW0ucmVhZE9ubHkgKSB7CgkJCXJldHVybjsKCQl9CgoJCWRhdGEgPSBqUXVlcnkuX2RhdGEoIGVsZW0sICJfY2hhbmdlX2RhdGEiICk7CgkJdmFsID0gZ2V0VmFsKGVsZW0pOwoKCQkvLyB0aGUgY3VycmVudCBkYXRhIHdpbGwgYmUgYWxzbyByZXRyaWV2ZWQgYnkgYmVmb3JlYWN0aXZhdGUKCQlpZiAoIGUudHlwZSAhPT0gImZvY3Vzb3V0IiB8fCBlbGVtLnR5cGUgIT09ICJyYWRpbyIgKSB7CgkJCWpRdWVyeS5fZGF0YSggZWxlbSwgIl9jaGFuZ2VfZGF0YSIsIHZhbCApOwoJCX0KCgkJaWYgKCBkYXRhID09PSB1bmRlZmluZWQgfHwgdmFsID09PSBkYXRhICkgewoJCQlyZXR1cm47CgkJfQoKCQlpZiAoIGRhdGEgIT0gbnVsbCB8fCB2YWwgKSB7CgkJCWUudHlwZSA9ICJjaGFuZ2UiOwoJCQllLmxpdmVGaXJlZCA9IHVuZGVmaW5lZDsKCQkJalF1ZXJ5LmV2ZW50LnRyaWdnZXIoIGUsIGFyZ3VtZW50c1sxXSwgZWxlbSApOwoJCX0KCX07CgoJalF1ZXJ5LmV2ZW50LnNwZWNpYWwuY2hhbmdlID0gewoJCWZpbHRlcnM6IHsKCQkJZm9jdXNvdXQ6IHRlc3RDaGFuZ2UsCgoJCQliZWZvcmVkZWFjdGl2YXRlOiB0ZXN0Q2hhbmdlLAoKCQkJY2xpY2s6IGZ1bmN0aW9uKCBlICkgewoJCQkJdmFyIGVsZW0gPSBlLnRhcmdldCwgdHlwZSA9IGpRdWVyeS5ub2RlTmFtZSggZWxlbSwgImlucHV0IiApID8gZWxlbS50eXBlIDogIiI7CgoJCQkJaWYgKCB0eXBlID09PSAicmFkaW8iIHx8IHR5cGUgPT09ICJjaGVja2JveCIgfHwgalF1ZXJ5Lm5vZGVOYW1lKCBlbGVtLCAic2VsZWN0IiApICkgewoJCQkJCXRlc3RDaGFuZ2UuY2FsbCggdGhpcywgZSApOwoJCQkJfQoJCQl9LAoKCQkJLy8gQ2hhbmdlIGhhcyB0byBiZSBjYWxsZWQgYmVmb3JlIHN1Ym1pdAoJCQkvLyBLZXlkb3duIHdpbGwgYmUgY2FsbGVkIGJlZm9yZSBrZXlwcmVzcywgd2hpY2ggaXMgdXNlZCBpbiBzdWJtaXQtZXZlbnQgZGVsZWdhdGlvbgoJCQlrZXlkb3duOiBmdW5jdGlvbiggZSApIHsKCQkJCXZhciBlbGVtID0gZS50YXJnZXQsIHR5cGUgPSBqUXVlcnkubm9kZU5hbWUoIGVsZW0sICJpbnB1dCIgKSA/IGVsZW0udHlwZSA6ICIiOwoKCQkJCWlmICggKGUua2V5Q29kZSA9PT0gMTMgJiYgIWpRdWVyeS5ub2RlTmFtZSggZWxlbSwgInRleHRhcmVhIiApICkgfHwKCQkJCQkoZS5rZXlDb2RlID09PSAzMiAmJiAodHlwZSA9PT0gImNoZWNrYm94IiB8fCB0eXBlID09PSAicmFkaW8iKSkgfHwKCQkJCQl0eXBlID09PSAic2VsZWN0LW11bHRpcGxlIiApIHsKCQkJCQl0ZXN0Q2hhbmdlLmNhbGwoIHRoaXMsIGUgKTsKCQkJCX0KCQkJfSwKCgkJCS8vIEJlZm9yZWFjdGl2YXRlIGhhcHBlbnMgYWxzbyBiZWZvcmUgdGhlIHByZXZpb3VzIGVsZW1lbnQgaXMgYmx1cnJlZAoJCQkvLyB3aXRoIHRoaXMgZXZlbnQgeW91IGNhbid0IHRyaWdnZXIgYSBjaGFuZ2UgZXZlbnQsIGJ1dCB5b3UgY2FuIHN0b3JlCgkJCS8vIGluZm9ybWF0aW9uCgkJCWJlZm9yZWFjdGl2YXRlOiBmdW5jdGlvbiggZSApIHsKCQkJCXZhciBlbGVtID0gZS50YXJnZXQ7CgkJCQlqUXVlcnkuX2RhdGEoIGVsZW0sICJfY2hhbmdlX2RhdGEiLCBnZXRWYWwoZWxlbSkgKTsKCQkJfQoJCX0sCgoJCXNldHVwOiBmdW5jdGlvbiggZGF0YSwgbmFtZXNwYWNlcyApIHsKCQkJaWYgKCB0aGlzLnR5cGUgPT09ICJmaWxlIiApIHsKCQkJCXJldHVybiBmYWxzZTsKCQkJfQoKCQkJZm9yICggdmFyIHR5cGUgaW4gY2hhbmdlRmlsdGVycyApIHsKCQkJCWpRdWVyeS5ldmVudC5hZGQoIHRoaXMsIHR5cGUgKyAiLnNwZWNpYWxDaGFuZ2UiLCBjaGFuZ2VGaWx0ZXJzW3R5cGVdICk7CgkJCX0KCgkJCXJldHVybiByZm9ybUVsZW1zLnRlc3QoIHRoaXMubm9kZU5hbWUgKTsKCQl9LAoKCQl0ZWFyZG93bjogZnVuY3Rpb24oIG5hbWVzcGFjZXMgKSB7CgkJCWpRdWVyeS5ldmVudC5yZW1vdmUoIHRoaXMsICIuc3BlY2lhbENoYW5nZSIgKTsKCgkJCXJldHVybiByZm9ybUVsZW1zLnRlc3QoIHRoaXMubm9kZU5hbWUgKTsKCQl9Cgl9OwoKCWNoYW5nZUZpbHRlcnMgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbC5jaGFuZ2UuZmlsdGVyczsKCgkvLyBIYW5kbGUgd2hlbiB0aGUgaW5wdXQgaXMgLmZvY3VzKCknZAoJY2hhbmdlRmlsdGVycy5mb2N1cyA9IGNoYW5nZUZpbHRlcnMuYmVmb3JlYWN0aXZhdGU7Cn0KCmZ1bmN0aW9uIHRyaWdnZXIoIHR5cGUsIGVsZW0sIGFyZ3MgKSB7CgkvLyBQaWdneWJhY2sgb24gYSBkb25vciBldmVudCB0byBzaW11bGF0ZSBhIGRpZmZlcmVudCBvbmUuCgkvLyBGYWtlIG9yaWdpbmFsRXZlbnQgdG8gYXZvaWQgZG9ub3IncyBzdG9wUHJvcGFnYXRpb24sIGJ1dCBpZiB0aGUKCS8vIHNpbXVsYXRlZCBldmVudCBwcmV2ZW50cyBkZWZhdWx0IHRoZW4gd2UgZG8gdGhlIHNhbWUgb24gdGhlIGRvbm9yLgoJLy8gRG9uJ3QgcGFzcyBhcmdzIG9yIHJlbWVtYmVyIGxpdmVGaXJlZDsgdGhleSBhcHBseSB0byB0aGUgZG9ub3IgZXZlbnQuCgl2YXIgZXZlbnQgPSBqUXVlcnkuZXh0ZW5kKCB7fSwgYXJnc1sgMCBdICk7CglldmVudC50eXBlID0gdHlwZTsKCWV2ZW50Lm9yaWdpbmFsRXZlbnQgPSB7fTsKCWV2ZW50LmxpdmVGaXJlZCA9IHVuZGVmaW5lZDsKCWpRdWVyeS5ldmVudC5oYW5kbGUuY2FsbCggZWxlbSwgZXZlbnQgKTsKCWlmICggZXZlbnQuaXNEZWZhdWx0UHJldmVudGVkKCkgKSB7CgkJYXJnc1sgMCBdLnByZXZlbnREZWZhdWx0KCk7Cgl9Cn0KCi8vIENyZWF0ZSAiYnViYmxpbmciIGZvY3VzIGFuZCBibHVyIGV2ZW50cwppZiAoICFqUXVlcnkuc3VwcG9ydC5mb2N1c2luQnViYmxlcyApIHsKCWpRdWVyeS5lYWNoKHsgZm9jdXM6ICJmb2N1c2luIiwgYmx1cjogImZvY3Vzb3V0IiB9LCBmdW5jdGlvbiggb3JpZywgZml4ICkgewoKCQkvLyBBdHRhY2ggYSBzaW5nbGUgY2FwdHVyaW5nIGhhbmRsZXIgd2hpbGUgc29tZW9uZSB3YW50cyBmb2N1c2luL2ZvY3Vzb3V0CgkJdmFyIGF0dGFjaGVzID0gMDsKCgkJalF1ZXJ5LmV2ZW50LnNwZWNpYWxbIGZpeCBdID0gewoJCQlzZXR1cDogZnVuY3Rpb24oKSB7CgkJCQlpZiAoIGF0dGFjaGVzKysgPT09IDAgKSB7CgkJCQkJZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lciggb3JpZywgaGFuZGxlciwgdHJ1ZSApOwoJCQkJfQoJCQl9LAoJCQl0ZWFyZG93bjogZnVuY3Rpb24oKSB7CgkJCQlpZiAoIC0tYXR0YWNoZXMgPT09IDAgKSB7CgkJCQkJZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lciggb3JpZywgaGFuZGxlciwgdHJ1ZSApOwoJCQkJfQoJCQl9CgkJfTsKCgkJZnVuY3Rpb24gaGFuZGxlciggZG9ub3IgKSB7CgkJCS8vIERvbm9yIGV2ZW50IGlzIGFsd2F5cyBhIG5hdGl2ZSBvbmU7IGZpeCBpdCBhbmQgc3dpdGNoIGl0cyB0eXBlLgoJCQkvLyBMZXQgZm9jdXNpbi9vdXQgaGFuZGxlciBjYW5jZWwgdGhlIGRvbm9yIGZvY3VzL2JsdXIgZXZlbnQuCgkJCXZhciBlID0galF1ZXJ5LmV2ZW50LmZpeCggZG9ub3IgKTsKCQkJZS50eXBlID0gZml4OwoJCQllLm9yaWdpbmFsRXZlbnQgPSB7fTsKCQkJalF1ZXJ5LmV2ZW50LnRyaWdnZXIoIGUsIG51bGwsIGUudGFyZ2V0ICk7CgkJCWlmICggZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSApIHsKCQkJCWRvbm9yLnByZXZlbnREZWZhdWx0KCk7CgkJCX0KCQl9Cgl9KTsKfQoKalF1ZXJ5LmVhY2goWyJiaW5kIiwgIm9uZSJdLCBmdW5jdGlvbiggaSwgbmFtZSApIHsKCWpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHR5cGUsIGRhdGEsIGZuICkgewoJCXZhciBoYW5kbGVyOwoKCQkvLyBIYW5kbGUgb2JqZWN0IGxpdGVyYWxzCgkJaWYgKCB0eXBlb2YgdHlwZSA9PT0gIm9iamVjdCIgKSB7CgkJCWZvciAoIHZhciBrZXkgaW4gdHlwZSApIHsKCQkJCXRoaXNbIG5hbWUgXShrZXksIGRhdGEsIHR5cGVba2V5XSwgZm4pOwoJCQl9CgkJCXJldHVybiB0aGlzOwoJCX0KCgkJaWYgKCBhcmd1bWVudHMubGVuZ3RoID09PSAyIHx8IGRhdGEgPT09IGZhbHNlICkgewoJCQlmbiA9IGRhdGE7CgkJCWRhdGEgPSB1bmRlZmluZWQ7CgkJfQoKCQlpZiAoIG5hbWUgPT09ICJvbmUiICkgewoJCQloYW5kbGVyID0gZnVuY3Rpb24oIGV2ZW50ICkgewoJCQkJalF1ZXJ5KCB0aGlzICkudW5iaW5kKCBldmVudCwgaGFuZGxlciApOwoJCQkJcmV0dXJuIGZuLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTsKCQkJfTsKCQkJaGFuZGxlci5ndWlkID0gZm4uZ3VpZCB8fCBqUXVlcnkuZ3VpZCsrOwoJCX0gZWxzZSB7CgkJCWhhbmRsZXIgPSBmbjsKCQl9CgoJCWlmICggdHlwZSA9PT0gInVubG9hZCIgJiYgbmFtZSAhPT0gIm9uZSIgKSB7CgkJCXRoaXMub25lKCB0eXBlLCBkYXRhLCBmbiApOwoKCQl9IGVsc2UgewoJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSB0aGlzLmxlbmd0aDsgaSA8IGw7IGkrKyApIHsKCQkJCWpRdWVyeS5ldmVudC5hZGQoIHRoaXNbaV0sIHR5cGUsIGhhbmRsZXIsIGRhdGEgKTsKCQkJfQoJCX0KCgkJcmV0dXJuIHRoaXM7Cgl9Owp9KTsKCmpRdWVyeS5mbi5leHRlbmQoewoJdW5iaW5kOiBmdW5jdGlvbiggdHlwZSwgZm4gKSB7CgkJLy8gSGFuZGxlIG9iamVjdCBsaXRlcmFscwoJCWlmICggdHlwZW9mIHR5cGUgPT09ICJvYmplY3QiICYmICF0eXBlLnByZXZlbnREZWZhdWx0ICkgewoJCQlmb3IgKCB2YXIga2V5IGluIHR5cGUgKSB7CgkJCQl0aGlzLnVuYmluZChrZXksIHR5cGVba2V5XSk7CgkJCX0KCgkJfSBlbHNlIHsKCQkJZm9yICggdmFyIGkgPSAwLCBsID0gdGhpcy5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CgkJCQlqUXVlcnkuZXZlbnQucmVtb3ZlKCB0aGlzW2ldLCB0eXBlLCBmbiApOwoJCQl9CgkJfQoKCQlyZXR1cm4gdGhpczsKCX0sCgoJZGVsZWdhdGU6IGZ1bmN0aW9uKCBzZWxlY3RvciwgdHlwZXMsIGRhdGEsIGZuICkgewoJCXJldHVybiB0aGlzLmxpdmUoIHR5cGVzLCBkYXRhLCBmbiwgc2VsZWN0b3IgKTsKCX0sCgoJdW5kZWxlZ2F0ZTogZnVuY3Rpb24oIHNlbGVjdG9yLCB0eXBlcywgZm4gKSB7CgkJaWYgKCBhcmd1bWVudHMubGVuZ3RoID09PSAwICkgewoJCQlyZXR1cm4gdGhpcy51bmJpbmQoICJsaXZlIiApOwoKCQl9IGVsc2UgewoJCQlyZXR1cm4gdGhpcy5kaWUoIHR5cGVzLCBudWxsLCBmbiwgc2VsZWN0b3IgKTsKCQl9Cgl9LAoKCXRyaWdnZXI6IGZ1bmN0aW9uKCB0eXBlLCBkYXRhICkgewoJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7CgkJCWpRdWVyeS5ldmVudC50cmlnZ2VyKCB0eXBlLCBkYXRhLCB0aGlzICk7CgkJfSk7Cgl9LAoKCXRyaWdnZXJIYW5kbGVyOiBmdW5jdGlvbiggdHlwZSwgZGF0YSApIHsKCQlpZiAoIHRoaXNbMF0gKSB7CgkJCXJldHVybiBqUXVlcnkuZXZlbnQudHJpZ2dlciggdHlwZSwgZGF0YSwgdGhpc1swXSwgdHJ1ZSApOwoJCX0KCX0sCgoJdG9nZ2xlOiBmdW5jdGlvbiggZm4gKSB7CgkJLy8gU2F2ZSByZWZlcmVuY2UgdG8gYXJndW1lbnRzIGZvciBhY2Nlc3MgaW4gY2xvc3VyZQoJCXZhciBhcmdzID0gYXJndW1lbnRzLAoJCQlndWlkID0gZm4uZ3VpZCB8fCBqUXVlcnkuZ3VpZCsrLAoJCQlpID0gMCwKCQkJdG9nZ2xlciA9IGZ1bmN0aW9uKCBldmVudCApIHsKCQkJCS8vIEZpZ3VyZSBvdXQgd2hpY2ggZnVuY3Rpb24gdG8gZXhlY3V0ZQoJCQkJdmFyIGxhc3RUb2dnbGUgPSAoIGpRdWVyeS5kYXRhKCB0aGlzLCAibGFzdFRvZ2dsZSIgKyBmbi5ndWlkICkgfHwgMCApICUgaTsKCQkJCWpRdWVyeS5kYXRhKCB0aGlzLCAibGFzdFRvZ2dsZSIgKyBmbi5ndWlkLCBsYXN0VG9nZ2xlICsgMSApOwoKCQkJCS8vIE1ha2Ugc3VyZSB0aGF0IGNsaWNrcyBzdG9wCgkJCQlldmVudC5wcmV2ZW50RGVmYXVsdCgpOwoKCQkJCS8vIGFuZCBleGVjdXRlIHRoZSBmdW5jdGlvbgoJCQkJcmV0dXJuIGFyZ3NbIGxhc3RUb2dnbGUgXS5hcHBseSggdGhpcywgYXJndW1lbnRzICkgfHwgZmFsc2U7CgkJCX07CgoJCS8vIGxpbmsgYWxsIHRoZSBmdW5jdGlvbnMsIHNvIGFueSBvZiB0aGVtIGNhbiB1bmJpbmQgdGhpcyBjbGljayBoYW5kbGVyCgkJdG9nZ2xlci5ndWlkID0gZ3VpZDsKCQl3aGlsZSAoIGkgPCBhcmdzLmxlbmd0aCApIHsKCQkJYXJnc1sgaSsrIF0uZ3VpZCA9IGd1aWQ7CgkJfQoKCQlyZXR1cm4gdGhpcy5jbGljayggdG9nZ2xlciApOwoJfSwKCglob3ZlcjogZnVuY3Rpb24oIGZuT3ZlciwgZm5PdXQgKSB7CgkJcmV0dXJuIHRoaXMubW91c2VlbnRlciggZm5PdmVyICkubW91c2VsZWF2ZSggZm5PdXQgfHwgZm5PdmVyICk7Cgl9Cn0pOwoKdmFyIGxpdmVNYXAgPSB7Cglmb2N1czogImZvY3VzaW4iLAoJYmx1cjogImZvY3Vzb3V0IiwKCW1vdXNlZW50ZXI6ICJtb3VzZW92ZXIiLAoJbW91c2VsZWF2ZTogIm1vdXNlb3V0Igp9OwoKalF1ZXJ5LmVhY2goWyJsaXZlIiwgImRpZSJdLCBmdW5jdGlvbiggaSwgbmFtZSApIHsKCWpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHR5cGVzLCBkYXRhLCBmbiwgb3JpZ1NlbGVjdG9yIC8qIEludGVybmFsIFVzZSBPbmx5ICovICkgewoJCXZhciB0eXBlLCBpID0gMCwgbWF0Y2gsIG5hbWVzcGFjZXMsIHByZVR5cGUsCgkJCXNlbGVjdG9yID0gb3JpZ1NlbGVjdG9yIHx8IHRoaXMuc2VsZWN0b3IsCgkJCWNvbnRleHQgPSBvcmlnU2VsZWN0b3IgPyB0aGlzIDogalF1ZXJ5KCB0aGlzLmNvbnRleHQgKTsKCgkJaWYgKCB0eXBlb2YgdHlwZXMgPT09ICJvYmplY3QiICYmICF0eXBlcy5wcmV2ZW50RGVmYXVsdCApIHsKCQkJZm9yICggdmFyIGtleSBpbiB0eXBlcyApIHsKCQkJCWNvbnRleHRbIG5hbWUgXSgga2V5LCBkYXRhLCB0eXBlc1trZXldLCBzZWxlY3RvciApOwoJCQl9CgoJCQlyZXR1cm4gdGhpczsKCQl9CgoJCWlmICggbmFtZSA9PT0gImRpZSIgJiYgIXR5cGVzICYmCgkJCQkJb3JpZ1NlbGVjdG9yICYmIG9yaWdTZWxlY3Rvci5jaGFyQXQoMCkgPT09ICIuIiApIHsKCgkJCWNvbnRleHQudW5iaW5kKCBvcmlnU2VsZWN0b3IgKTsKCgkJCXJldHVybiB0aGlzOwoJCX0KCgkJaWYgKCBkYXRhID09PSBmYWxzZSB8fCBqUXVlcnkuaXNGdW5jdGlvbiggZGF0YSApICkgewoJCQlmbiA9IGRhdGEgfHwgcmV0dXJuRmFsc2U7CgkJCWRhdGEgPSB1bmRlZmluZWQ7CgkJfQoKCQl0eXBlcyA9ICh0eXBlcyB8fCAiIikuc3BsaXQoIiAiKTsKCgkJd2hpbGUgKCAodHlwZSA9IHR5cGVzWyBpKysgXSkgIT0gbnVsbCApIHsKCQkJbWF0Y2ggPSBybmFtZXNwYWNlcy5leGVjKCB0eXBlICk7CgkJCW5hbWVzcGFjZXMgPSAiIjsKCgkJCWlmICggbWF0Y2ggKSAgewoJCQkJbmFtZXNwYWNlcyA9IG1hdGNoWzBdOwoJCQkJdHlwZSA9IHR5cGUucmVwbGFjZSggcm5hbWVzcGFjZXMsICIiICk7CgkJCX0KCgkJCWlmICggdHlwZSA9PT0gImhvdmVyIiApIHsKCQkJCXR5cGVzLnB1c2goICJtb3VzZWVudGVyIiArIG5hbWVzcGFjZXMsICJtb3VzZWxlYXZlIiArIG5hbWVzcGFjZXMgKTsKCQkJCWNvbnRpbnVlOwoJCQl9CgoJCQlwcmVUeXBlID0gdHlwZTsKCgkJCWlmICggbGl2ZU1hcFsgdHlwZSBdICkgewoJCQkJdHlwZXMucHVzaCggbGl2ZU1hcFsgdHlwZSBdICsgbmFtZXNwYWNlcyApOwoJCQkJdHlwZSA9IHR5cGUgKyBuYW1lc3BhY2VzOwoKCQkJfSBlbHNlIHsKCQkJCXR5cGUgPSAobGl2ZU1hcFsgdHlwZSBdIHx8IHR5cGUpICsgbmFtZXNwYWNlczsKCQkJfQoKCQkJaWYgKCBuYW1lID09PSAibGl2ZSIgKSB7CgkJCQkvLyBiaW5kIGxpdmUgaGFuZGxlcgoJCQkJZm9yICggdmFyIGogPSAwLCBsID0gY29udGV4dC5sZW5ndGg7IGogPCBsOyBqKysgKSB7CgkJCQkJalF1ZXJ5LmV2ZW50LmFkZCggY29udGV4dFtqXSwgImxpdmUuIiArIGxpdmVDb252ZXJ0KCB0eXBlLCBzZWxlY3RvciApLAoJCQkJCQl7IGRhdGE6IGRhdGEsIHNlbGVjdG9yOiBzZWxlY3RvciwgaGFuZGxlcjogZm4sIG9yaWdUeXBlOiB0eXBlLCBvcmlnSGFuZGxlcjogZm4sIHByZVR5cGU6IHByZVR5cGUgfSApOwoJCQkJfQoKCQkJfSBlbHNlIHsKCQkJCS8vIHVuYmluZCBsaXZlIGhhbmRsZXIKCQkJCWNvbnRleHQudW5iaW5kKCAibGl2ZS4iICsgbGl2ZUNvbnZlcnQoIHR5cGUsIHNlbGVjdG9yICksIGZuICk7CgkJCX0KCQl9CgoJCXJldHVybiB0aGlzOwoJfTsKfSk7CgpmdW5jdGlvbiBsaXZlSGFuZGxlciggZXZlbnQgKSB7Cgl2YXIgc3RvcCwgbWF4TGV2ZWwsIHJlbGF0ZWQsIG1hdGNoLCBoYW5kbGVPYmosIGVsZW0sIGosIGksIGwsIGRhdGEsIGNsb3NlLCBuYW1lc3BhY2UsIHJldCwKCQllbGVtcyA9IFtdLAoJCXNlbGVjdG9ycyA9IFtdLAoJCWV2ZW50cyA9IGpRdWVyeS5fZGF0YSggdGhpcywgImV2ZW50cyIgKTsKCgkvLyBNYWtlIHN1cmUgd2UgYXZvaWQgbm9uLWxlZnQtY2xpY2sgYnViYmxpbmcgaW4gRmlyZWZveCAoIzM4NjEpIGFuZCBkaXNhYmxlZCBlbGVtZW50cyBpbiBJRSAoIzY5MTEpCglpZiAoIGV2ZW50LmxpdmVGaXJlZCA9PT0gdGhpcyB8fCAhZXZlbnRzIHx8ICFldmVudHMubGl2ZSB8fCBldmVudC50YXJnZXQuZGlzYWJsZWQgfHwgZXZlbnQuYnV0dG9uICYmIGV2ZW50LnR5cGUgPT09ICJjbGljayIgKSB7CgkJcmV0dXJuOwoJfQoKCWlmICggZXZlbnQubmFtZXNwYWNlICkgewoJCW5hbWVzcGFjZSA9IG5ldyBSZWdFeHAoIihefFxcLikiICsgZXZlbnQubmFtZXNwYWNlLnNwbGl0KCIuIikuam9pbigiXFwuKD86LipcXC4pPyIpICsgIihcXC58JCkiKTsKCX0KCglldmVudC5saXZlRmlyZWQgPSB0aGlzOwoKCXZhciBsaXZlID0gZXZlbnRzLmxpdmUuc2xpY2UoMCk7CgoJZm9yICggaiA9IDA7IGogPCBsaXZlLmxlbmd0aDsgaisrICkgewoJCWhhbmRsZU9iaiA9IGxpdmVbal07CgoJCWlmICggaGFuZGxlT2JqLm9yaWdUeXBlLnJlcGxhY2UoIHJuYW1lc3BhY2VzLCAiIiApID09PSBldmVudC50eXBlICkgewoJCQlzZWxlY3RvcnMucHVzaCggaGFuZGxlT2JqLnNlbGVjdG9yICk7CgoJCX0gZWxzZSB7CgkJCWxpdmUuc3BsaWNlKCBqLS0sIDEgKTsKCQl9Cgl9CgoJbWF0Y2ggPSBqUXVlcnkoIGV2ZW50LnRhcmdldCApLmNsb3Nlc3QoIHNlbGVjdG9ycywgZXZlbnQuY3VycmVudFRhcmdldCApOwoKCWZvciAoIGkgPSAwLCBsID0gbWF0Y2gubGVuZ3RoOyBpIDwgbDsgaSsrICkgewoJCWNsb3NlID0gbWF0Y2hbaV07CgoJCWZvciAoIGogPSAwOyBqIDwgbGl2ZS5sZW5ndGg7IGorKyApIHsKCQkJaGFuZGxlT2JqID0gbGl2ZVtqXTsKCgkJCWlmICggY2xvc2Uuc2VsZWN0b3IgPT09IGhhbmRsZU9iai5zZWxlY3RvciAmJiAoIW5hbWVzcGFjZSB8fCBuYW1lc3BhY2UudGVzdCggaGFuZGxlT2JqLm5hbWVzcGFjZSApKSAmJiAhY2xvc2UuZWxlbS5kaXNhYmxlZCApIHsKCQkJCWVsZW0gPSBjbG9zZS5lbGVtOwoJCQkJcmVsYXRlZCA9IG51bGw7CgoJCQkJLy8gVGhvc2UgdHdvIGV2ZW50cyByZXF1aXJlIGFkZGl0aW9uYWwgY2hlY2tpbmcKCQkJCWlmICggaGFuZGxlT2JqLnByZVR5cGUgPT09ICJtb3VzZWVudGVyIiB8fCBoYW5kbGVPYmoucHJlVHlwZSA9PT0gIm1vdXNlbGVhdmUiICkgewoJCQkJCWV2ZW50LnR5cGUgPSBoYW5kbGVPYmoucHJlVHlwZTsKCQkJCQlyZWxhdGVkID0galF1ZXJ5KCBldmVudC5yZWxhdGVkVGFyZ2V0ICkuY2xvc2VzdCggaGFuZGxlT2JqLnNlbGVjdG9yIClbMF07CgoJCQkJCS8vIE1ha2Ugc3VyZSBub3QgdG8gYWNjaWRlbnRhbGx5IG1hdGNoIGEgY2hpbGQgZWxlbWVudCB3aXRoIHRoZSBzYW1lIHNlbGVjdG9yCgkJCQkJaWYgKCByZWxhdGVkICYmIGpRdWVyeS5jb250YWlucyggZWxlbSwgcmVsYXRlZCApICkgewoJCQkJCQlyZWxhdGVkID0gZWxlbTsKCQkJCQl9CgkJCQl9CgoJCQkJaWYgKCAhcmVsYXRlZCB8fCByZWxhdGVkICE9PSBlbGVtICkgewoJCQkJCWVsZW1zLnB1c2goeyBlbGVtOiBlbGVtLCBoYW5kbGVPYmo6IGhhbmRsZU9iaiwgbGV2ZWw6IGNsb3NlLmxldmVsIH0pOwoJCQkJfQoJCQl9CgkJfQoJfQoKCWZvciAoIGkgPSAwLCBsID0gZWxlbXMubGVuZ3RoOyBpIDwgbDsgaSsrICkgewoJCW1hdGNoID0gZWxlbXNbaV07CgoJCWlmICggbWF4TGV2ZWwgJiYgbWF0Y2gubGV2ZWwgPiBtYXhMZXZlbCApIHsKCQkJYnJlYWs7CgkJfQoKCQlldmVudC5jdXJyZW50VGFyZ2V0ID0gbWF0Y2guZWxlbTsKCQlldmVudC5kYXRhID0gbWF0Y2guaGFuZGxlT2JqLmRhdGE7CgkJZXZlbnQuaGFuZGxlT2JqID0gbWF0Y2guaGFuZGxlT2JqOwoKCQlyZXQgPSBtYXRjaC5oYW5kbGVPYmoub3JpZ0hhbmRsZXIuYXBwbHkoIG1hdGNoLmVsZW0sIGFyZ3VtZW50cyApOwoKCQlpZiAoIHJldCA9PT0gZmFsc2UgfHwgZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSApIHsKCQkJbWF4TGV2ZWwgPSBtYXRjaC5sZXZlbDsKCgkJCWlmICggcmV0ID09PSBmYWxzZSApIHsKCQkJCXN0b3AgPSBmYWxzZTsKCQkJfQoJCQlpZiAoIGV2ZW50LmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkKCkgKSB7CgkJCQlicmVhazsKCQkJfQoJCX0KCX0KCglyZXR1cm4gc3RvcDsKfQoKZnVuY3Rpb24gbGl2ZUNvbnZlcnQoIHR5cGUsIHNlbGVjdG9yICkgewoJcmV0dXJuICh0eXBlICYmIHR5cGUgIT09ICIqIiA/IHR5cGUgKyAiLiIgOiAiIikgKyBzZWxlY3Rvci5yZXBsYWNlKHJwZXJpb2QsICJgIikucmVwbGFjZShyc3BhY2VzLCAiJiIpOwp9CgpqUXVlcnkuZWFjaCggKCJibHVyIGZvY3VzIGZvY3VzaW4gZm9jdXNvdXQgbG9hZCByZXNpemUgc2Nyb2xsIHVubG9hZCBjbGljayBkYmxjbGljayAiICsKCSJtb3VzZWRvd24gbW91c2V1cCBtb3VzZW1vdmUgbW91c2VvdmVyIG1vdXNlb3V0IG1vdXNlZW50ZXIgbW91c2VsZWF2ZSAiICsKCSJjaGFuZ2Ugc2VsZWN0IHN1Ym1pdCBrZXlkb3duIGtleXByZXNzIGtleXVwIGVycm9yIikuc3BsaXQoIiAiKSwgZnVuY3Rpb24oIGksIG5hbWUgKSB7CgoJLy8gSGFuZGxlIGV2ZW50IGJpbmRpbmcKCWpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIGRhdGEsIGZuICkgewoJCWlmICggZm4gPT0gbnVsbCApIHsKCQkJZm4gPSBkYXRhOwoJCQlkYXRhID0gbnVsbDsKCQl9CgoJCXJldHVybiBhcmd1bWVudHMubGVuZ3RoID4gMCA/CgkJCXRoaXMuYmluZCggbmFtZSwgZGF0YSwgZm4gKSA6CgkJCXRoaXMudHJpZ2dlciggbmFtZSApOwoJfTsKCglpZiAoIGpRdWVyeS5hdHRyRm4gKSB7CgkJalF1ZXJ5LmF0dHJGblsgbmFtZSBdID0gdHJ1ZTsKCX0KfSk7CgoKCi8qIQogKiBTaXp6bGUgQ1NTIFNlbGVjdG9yIEVuZ2luZQogKiAgQ29weXJpZ2h0IDIwMTEsIFRoZSBEb2pvIEZvdW5kYXRpb24KICogIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQsIEJTRCwgYW5kIEdQTCBMaWNlbnNlcy4KICogIE1vcmUgaW5mb3JtYXRpb246IGh0dHA6Ly9zaXp6bGVqcy5jb20vCiAqLwooZnVuY3Rpb24oKXsKCnZhciBjaHVua2VyID0gLygoPzpcKCg/OlwoW14oKV0rXCl8W14oKV0rKStcKXxcWyg/OlxbW15cW1xdXSpcXXxbJyJdW14nIl0qWyciXXxbXlxbXF0nIl0rKStcXXxcXC58W14gPit+LChcW1xcXSspK3xbPit+XSkoXHMqLFxzKik/KCg/Oi58XHJ8XG4pKikvZywKCWRvbmUgPSAwLAoJdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLAoJaGFzRHVwbGljYXRlID0gZmFsc2UsCgliYXNlSGFzRHVwbGljYXRlID0gdHJ1ZSwKCXJCYWNrc2xhc2ggPSAvXFwvZywKCXJOb25Xb3JkID0gL1xXLzsKCi8vIEhlcmUgd2UgY2hlY2sgaWYgdGhlIEphdmFTY3JpcHQgZW5naW5lIGlzIHVzaW5nIHNvbWUgc29ydCBvZgovLyBvcHRpbWl6YXRpb24gd2hlcmUgaXQgZG9lcyBub3QgYWx3YXlzIGNhbGwgb3VyIGNvbXBhcmlzaW9uCi8vIGZ1bmN0aW9uLiBJZiB0aGF0IGlzIHRoZSBjYXNlLCBkaXNjYXJkIHRoZSBoYXNEdXBsaWNhdGUgdmFsdWUuCi8vICAgVGh1cyBmYXIgdGhhdCBpbmNsdWRlcyBHb29nbGUgQ2hyb21lLgpbMCwgMF0uc29ydChmdW5jdGlvbigpIHsKCWJhc2VIYXNEdXBsaWNhdGUgPSBmYWxzZTsKCXJldHVybiAwOwp9KTsKCnZhciBTaXp6bGUgPSBmdW5jdGlvbiggc2VsZWN0b3IsIGNvbnRleHQsIHJlc3VsdHMsIHNlZWQgKSB7CglyZXN1bHRzID0gcmVzdWx0cyB8fCBbXTsKCWNvbnRleHQgPSBjb250ZXh0IHx8IGRvY3VtZW50OwoKCXZhciBvcmlnQ29udGV4dCA9IGNvbnRleHQ7CgoJaWYgKCBjb250ZXh0Lm5vZGVUeXBlICE9PSAxICYmIGNvbnRleHQubm9kZVR5cGUgIT09IDkgKSB7CgkJcmV0dXJuIFtdOwoJfQoJCglpZiAoICFzZWxlY3RvciB8fCB0eXBlb2Ygc2VsZWN0b3IgIT09ICJzdHJpbmciICkgewoJCXJldHVybiByZXN1bHRzOwoJfQoKCXZhciBtLCBzZXQsIGNoZWNrU2V0LCBleHRyYSwgcmV0LCBjdXIsIHBvcCwgaSwKCQlwcnVuZSA9IHRydWUsCgkJY29udGV4dFhNTCA9IFNpenpsZS5pc1hNTCggY29udGV4dCApLAoJCXBhcnRzID0gW10sCgkJc29GYXIgPSBzZWxlY3RvcjsKCQoJLy8gUmVzZXQgdGhlIHBvc2l0aW9uIG9mIHRoZSBjaHVua2VyIHJlZ2V4cCAoc3RhcnQgZnJvbSBoZWFkKQoJZG8gewoJCWNodW5rZXIuZXhlYyggIiIgKTsKCQltID0gY2h1bmtlci5leGVjKCBzb0ZhciApOwoKCQlpZiAoIG0gKSB7CgkJCXNvRmFyID0gbVszXTsKCQkKCQkJcGFydHMucHVzaCggbVsxXSApOwoJCQoJCQlpZiAoIG1bMl0gKSB7CgkJCQlleHRyYSA9IG1bM107CgkJCQlicmVhazsKCQkJfQoJCX0KCX0gd2hpbGUgKCBtICk7CgoJaWYgKCBwYXJ0cy5sZW5ndGggPiAxICYmIG9yaWdQT1MuZXhlYyggc2VsZWN0b3IgKSApIHsKCgkJaWYgKCBwYXJ0cy5sZW5ndGggPT09IDIgJiYgRXhwci5yZWxhdGl2ZVsgcGFydHNbMF0gXSApIHsKCQkJc2V0ID0gcG9zUHJvY2VzcyggcGFydHNbMF0gKyBwYXJ0c1sxXSwgY29udGV4dCApOwoKCQl9IGVsc2UgewoJCQlzZXQgPSBFeHByLnJlbGF0aXZlWyBwYXJ0c1swXSBdID8KCQkJCVsgY29udGV4dCBdIDoKCQkJCVNpenpsZSggcGFydHMuc2hpZnQoKSwgY29udGV4dCApOwoKCQkJd2hpbGUgKCBwYXJ0cy5sZW5ndGggKSB7CgkJCQlzZWxlY3RvciA9IHBhcnRzLnNoaWZ0KCk7CgoJCQkJaWYgKCBFeHByLnJlbGF0aXZlWyBzZWxlY3RvciBdICkgewoJCQkJCXNlbGVjdG9yICs9IHBhcnRzLnNoaWZ0KCk7CgkJCQl9CgkJCQkKCQkJCXNldCA9IHBvc1Byb2Nlc3MoIHNlbGVjdG9yLCBzZXQgKTsKCQkJfQoJCX0KCgl9IGVsc2UgewoJCS8vIFRha2UgYSBzaG9ydGN1dCBhbmQgc2V0IHRoZSBjb250ZXh0IGlmIHRoZSByb290IHNlbGVjdG9yIGlzIGFuIElECgkJLy8gKGJ1dCBub3QgaWYgaXQnbGwgYmUgZmFzdGVyIGlmIHRoZSBpbm5lciBzZWxlY3RvciBpcyBhbiBJRCkKCQlpZiAoICFzZWVkICYmIHBhcnRzLmxlbmd0aCA+IDEgJiYgY29udGV4dC5ub2RlVHlwZSA9PT0gOSAmJiAhY29udGV4dFhNTCAmJgoJCQkJRXhwci5tYXRjaC5JRC50ZXN0KHBhcnRzWzBdKSAmJiAhRXhwci5tYXRjaC5JRC50ZXN0KHBhcnRzW3BhcnRzLmxlbmd0aCAtIDFdKSApIHsKCgkJCXJldCA9IFNpenpsZS5maW5kKCBwYXJ0cy5zaGlmdCgpLCBjb250ZXh0LCBjb250ZXh0WE1MICk7CgkJCWNvbnRleHQgPSByZXQuZXhwciA/CgkJCQlTaXp6bGUuZmlsdGVyKCByZXQuZXhwciwgcmV0LnNldCApWzBdIDoKCQkJCXJldC5zZXRbMF07CgkJfQoKCQlpZiAoIGNvbnRleHQgKSB7CgkJCXJldCA9IHNlZWQgPwoJCQkJeyBleHByOiBwYXJ0cy5wb3AoKSwgc2V0OiBtYWtlQXJyYXkoc2VlZCkgfSA6CgkJCQlTaXp6bGUuZmluZCggcGFydHMucG9wKCksIHBhcnRzLmxlbmd0aCA9PT0gMSAmJiAocGFydHNbMF0gPT09ICJ+IiB8fCBwYXJ0c1swXSA9PT0gIisiKSAmJiBjb250ZXh0LnBhcmVudE5vZGUgPyBjb250ZXh0LnBhcmVudE5vZGUgOiBjb250ZXh0LCBjb250ZXh0WE1MICk7CgoJCQlzZXQgPSByZXQuZXhwciA/CgkJCQlTaXp6bGUuZmlsdGVyKCByZXQuZXhwciwgcmV0LnNldCApIDoKCQkJCXJldC5zZXQ7CgoJCQlpZiAoIHBhcnRzLmxlbmd0aCA+IDAgKSB7CgkJCQljaGVja1NldCA9IG1ha2VBcnJheSggc2V0ICk7CgoJCQl9IGVsc2UgewoJCQkJcHJ1bmUgPSBmYWxzZTsKCQkJfQoKCQkJd2hpbGUgKCBwYXJ0cy5sZW5ndGggKSB7CgkJCQljdXIgPSBwYXJ0cy5wb3AoKTsKCQkJCXBvcCA9IGN1cjsKCgkJCQlpZiAoICFFeHByLnJlbGF0aXZlWyBjdXIgXSApIHsKCQkJCQljdXIgPSAiIjsKCQkJCX0gZWxzZSB7CgkJCQkJcG9wID0gcGFydHMucG9wKCk7CgkJCQl9CgoJCQkJaWYgKCBwb3AgPT0gbnVsbCApIHsKCQkJCQlwb3AgPSBjb250ZXh0OwoJCQkJfQoKCQkJCUV4cHIucmVsYXRpdmVbIGN1ciBdKCBjaGVja1NldCwgcG9wLCBjb250ZXh0WE1MICk7CgkJCX0KCgkJfSBlbHNlIHsKCQkJY2hlY2tTZXQgPSBwYXJ0cyA9IFtdOwoJCX0KCX0KCglpZiAoICFjaGVja1NldCApIHsKCQljaGVja1NldCA9IHNldDsKCX0KCglpZiAoICFjaGVja1NldCApIHsKCQlTaXp6bGUuZXJyb3IoIGN1ciB8fCBzZWxlY3RvciApOwoJfQoKCWlmICggdG9TdHJpbmcuY2FsbChjaGVja1NldCkgPT09ICJbb2JqZWN0IEFycmF5XSIgKSB7CgkJaWYgKCAhcHJ1bmUgKSB7CgkJCXJlc3VsdHMucHVzaC5hcHBseSggcmVzdWx0cywgY2hlY2tTZXQgKTsKCgkJfSBlbHNlIGlmICggY29udGV4dCAmJiBjb250ZXh0Lm5vZGVUeXBlID09PSAxICkgewoJCQlmb3IgKCBpID0gMDsgY2hlY2tTZXRbaV0gIT0gbnVsbDsgaSsrICkgewoJCQkJaWYgKCBjaGVja1NldFtpXSAmJiAoY2hlY2tTZXRbaV0gPT09IHRydWUgfHwgY2hlY2tTZXRbaV0ubm9kZVR5cGUgPT09IDEgJiYgU2l6emxlLmNvbnRhaW5zKGNvbnRleHQsIGNoZWNrU2V0W2ldKSkgKSB7CgkJCQkJcmVzdWx0cy5wdXNoKCBzZXRbaV0gKTsKCQkJCX0KCQkJfQoKCQl9IGVsc2UgewoJCQlmb3IgKCBpID0gMDsgY2hlY2tTZXRbaV0gIT0gbnVsbDsgaSsrICkgewoJCQkJaWYgKCBjaGVja1NldFtpXSAmJiBjaGVja1NldFtpXS5ub2RlVHlwZSA9PT0gMSApIHsKCQkJCQlyZXN1bHRzLnB1c2goIHNldFtpXSApOwoJCQkJfQoJCQl9CgkJfQoKCX0gZWxzZSB7CgkJbWFrZUFycmF5KCBjaGVja1NldCwgcmVzdWx0cyApOwoJfQoKCWlmICggZXh0cmEgKSB7CgkJU2l6emxlKCBleHRyYSwgb3JpZ0NvbnRleHQsIHJlc3VsdHMsIHNlZWQgKTsKCQlTaXp6bGUudW5pcXVlU29ydCggcmVzdWx0cyApOwoJfQoKCXJldHVybiByZXN1bHRzOwp9OwoKU2l6emxlLnVuaXF1ZVNvcnQgPSBmdW5jdGlvbiggcmVzdWx0cyApIHsKCWlmICggc29ydE9yZGVyICkgewoJCWhhc0R1cGxpY2F0ZSA9IGJhc2VIYXNEdXBsaWNhdGU7CgkJcmVzdWx0cy5zb3J0KCBzb3J0T3JkZXIgKTsKCgkJaWYgKCBoYXNEdXBsaWNhdGUgKSB7CgkJCWZvciAoIHZhciBpID0gMTsgaSA8IHJlc3VsdHMubGVuZ3RoOyBpKysgKSB7CgkJCQlpZiAoIHJlc3VsdHNbaV0gPT09IHJlc3VsdHNbIGkgLSAxIF0gKSB7CgkJCQkJcmVzdWx0cy5zcGxpY2UoIGktLSwgMSApOwoJCQkJfQoJCQl9CgkJfQoJfQoKCXJldHVybiByZXN1bHRzOwp9OwoKU2l6emxlLm1hdGNoZXMgPSBmdW5jdGlvbiggZXhwciwgc2V0ICkgewoJcmV0dXJuIFNpenpsZSggZXhwciwgbnVsbCwgbnVsbCwgc2V0ICk7Cn07CgpTaXp6bGUubWF0Y2hlc1NlbGVjdG9yID0gZnVuY3Rpb24oIG5vZGUsIGV4cHIgKSB7CglyZXR1cm4gU2l6emxlKCBleHByLCBudWxsLCBudWxsLCBbbm9kZV0gKS5sZW5ndGggPiAwOwp9OwoKU2l6emxlLmZpbmQgPSBmdW5jdGlvbiggZXhwciwgY29udGV4dCwgaXNYTUwgKSB7Cgl2YXIgc2V0OwoKCWlmICggIWV4cHIgKSB7CgkJcmV0dXJuIFtdOwoJfQoKCWZvciAoIHZhciBpID0gMCwgbCA9IEV4cHIub3JkZXIubGVuZ3RoOyBpIDwgbDsgaSsrICkgewoJCXZhciBtYXRjaCwKCQkJdHlwZSA9IEV4cHIub3JkZXJbaV07CgkJCgkJaWYgKCAobWF0Y2ggPSBFeHByLmxlZnRNYXRjaFsgdHlwZSBdLmV4ZWMoIGV4cHIgKSkgKSB7CgkJCXZhciBsZWZ0ID0gbWF0Y2hbMV07CgkJCW1hdGNoLnNwbGljZSggMSwgMSApOwoKCQkJaWYgKCBsZWZ0LnN1YnN0ciggbGVmdC5sZW5ndGggLSAxICkgIT09ICJcXCIgKSB7CgkJCQltYXRjaFsxXSA9IChtYXRjaFsxXSB8fCAiIikucmVwbGFjZSggckJhY2tzbGFzaCwgIiIgKTsKCQkJCXNldCA9IEV4cHIuZmluZFsgdHlwZSBdKCBtYXRjaCwgY29udGV4dCwgaXNYTUwgKTsKCgkJCQlpZiAoIHNldCAhPSBudWxsICkgewoJCQkJCWV4cHIgPSBleHByLnJlcGxhY2UoIEV4cHIubWF0Y2hbIHR5cGUgXSwgIiIgKTsKCQkJCQlicmVhazsKCQkJCX0KCQkJfQoJCX0KCX0KCglpZiAoICFzZXQgKSB7CgkJc2V0ID0gdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgIT09ICJ1bmRlZmluZWQiID8KCQkJY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSggIioiICkgOgoJCQlbXTsKCX0KCglyZXR1cm4geyBzZXQ6IHNldCwgZXhwcjogZXhwciB9Owp9OwoKU2l6emxlLmZpbHRlciA9IGZ1bmN0aW9uKCBleHByLCBzZXQsIGlucGxhY2UsIG5vdCApIHsKCXZhciBtYXRjaCwgYW55Rm91bmQsCgkJb2xkID0gZXhwciwKCQlyZXN1bHQgPSBbXSwKCQljdXJMb29wID0gc2V0LAoJCWlzWE1MRmlsdGVyID0gc2V0ICYmIHNldFswXSAmJiBTaXp6bGUuaXNYTUwoIHNldFswXSApOwoKCXdoaWxlICggZXhwciAmJiBzZXQubGVuZ3RoICkgewoJCWZvciAoIHZhciB0eXBlIGluIEV4cHIuZmlsdGVyICkgewoJCQlpZiAoIChtYXRjaCA9IEV4cHIubGVmdE1hdGNoWyB0eXBlIF0uZXhlYyggZXhwciApKSAhPSBudWxsICYmIG1hdGNoWzJdICkgewoJCQkJdmFyIGZvdW5kLCBpdGVtLAoJCQkJCWZpbHRlciA9IEV4cHIuZmlsdGVyWyB0eXBlIF0sCgkJCQkJbGVmdCA9IG1hdGNoWzFdOwoKCQkJCWFueUZvdW5kID0gZmFsc2U7CgoJCQkJbWF0Y2guc3BsaWNlKDEsMSk7CgoJCQkJaWYgKCBsZWZ0LnN1YnN0ciggbGVmdC5sZW5ndGggLSAxICkgPT09ICJcXCIgKSB7CgkJCQkJY29udGludWU7CgkJCQl9CgoJCQkJaWYgKCBjdXJMb29wID09PSByZXN1bHQgKSB7CgkJCQkJcmVzdWx0ID0gW107CgkJCQl9CgoJCQkJaWYgKCBFeHByLnByZUZpbHRlclsgdHlwZSBdICkgewoJCQkJCW1hdGNoID0gRXhwci5wcmVGaWx0ZXJbIHR5cGUgXSggbWF0Y2gsIGN1ckxvb3AsIGlucGxhY2UsIHJlc3VsdCwgbm90LCBpc1hNTEZpbHRlciApOwoKCQkJCQlpZiAoICFtYXRjaCApIHsKCQkJCQkJYW55Rm91bmQgPSBmb3VuZCA9IHRydWU7CgoJCQkJCX0gZWxzZSBpZiAoIG1hdGNoID09PSB0cnVlICkgewoJCQkJCQljb250aW51ZTsKCQkJCQl9CgkJCQl9CgoJCQkJaWYgKCBtYXRjaCApIHsKCQkJCQlmb3IgKCB2YXIgaSA9IDA7IChpdGVtID0gY3VyTG9vcFtpXSkgIT0gbnVsbDsgaSsrICkgewoJCQkJCQlpZiAoIGl0ZW0gKSB7CgkJCQkJCQlmb3VuZCA9IGZpbHRlciggaXRlbSwgbWF0Y2gsIGksIGN1ckxvb3AgKTsKCQkJCQkJCXZhciBwYXNzID0gbm90IF4gISFmb3VuZDsKCgkJCQkJCQlpZiAoIGlucGxhY2UgJiYgZm91bmQgIT0gbnVsbCApIHsKCQkJCQkJCQlpZiAoIHBhc3MgKSB7CgkJCQkJCQkJCWFueUZvdW5kID0gdHJ1ZTsKCgkJCQkJCQkJfSBlbHNlIHsKCQkJCQkJCQkJY3VyTG9vcFtpXSA9IGZhbHNlOwoJCQkJCQkJCX0KCgkJCQkJCQl9IGVsc2UgaWYgKCBwYXNzICkgewoJCQkJCQkJCXJlc3VsdC5wdXNoKCBpdGVtICk7CgkJCQkJCQkJYW55Rm91bmQgPSB0cnVlOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJfQoJCQkJfQoKCQkJCWlmICggZm91bmQgIT09IHVuZGVmaW5lZCApIHsKCQkJCQlpZiAoICFpbnBsYWNlICkgewoJCQkJCQljdXJMb29wID0gcmVzdWx0OwoJCQkJCX0KCgkJCQkJZXhwciA9IGV4cHIucmVwbGFjZSggRXhwci5tYXRjaFsgdHlwZSBdLCAiIiApOwoKCQkJCQlpZiAoICFhbnlGb3VuZCApIHsKCQkJCQkJcmV0dXJuIFtdOwoJCQkJCX0KCgkJCQkJYnJlYWs7CgkJCQl9CgkJCX0KCQl9CgoJCS8vIEltcHJvcGVyIGV4cHJlc3Npb24KCQlpZiAoIGV4cHIgPT09IG9sZCApIHsKCQkJaWYgKCBhbnlGb3VuZCA9PSBudWxsICkgewoJCQkJU2l6emxlLmVycm9yKCBleHByICk7CgoJCQl9IGVsc2UgewoJCQkJYnJlYWs7CgkJCX0KCQl9CgoJCW9sZCA9IGV4cHI7Cgl9CgoJcmV0dXJuIGN1ckxvb3A7Cn07CgpTaXp6bGUuZXJyb3IgPSBmdW5jdGlvbiggbXNnICkgewoJdGhyb3cgIlN5bnRheCBlcnJvciwgdW5yZWNvZ25pemVkIGV4cHJlc3Npb246ICIgKyBtc2c7Cn07Cgp2YXIgRXhwciA9IFNpenpsZS5zZWxlY3RvcnMgPSB7CglvcmRlcjogWyAiSUQiLCAiTkFNRSIsICJUQUciIF0sCgoJbWF0Y2g6IHsKCQlJRDogLyMoKD86W1x3XHUwMGMwLVx1RkZGRlwtXXxcXC4pKykvLAoJCUNMQVNTOiAvXC4oKD86W1x3XHUwMGMwLVx1RkZGRlwtXXxcXC4pKykvLAoJCU5BTUU6IC9cW25hbWU9WyciXSooKD86W1x3XHUwMGMwLVx1RkZGRlwtXXxcXC4pKylbJyJdKlxdLywKCQlBVFRSOiAvXFtccyooKD86W1x3XHUwMGMwLVx1RkZGRlwtXXxcXC4pKylccyooPzooXFM/PSlccyooPzooWyciXSkoLio/KVwzfCgjPyg/Oltcd1x1MDBjMC1cdUZGRkZcLV18XFwuKSopfCl8KVxzKlxdLywKCQlUQUc6IC9eKCg/Oltcd1x1MDBjMC1cdUZGRkZcKlwtXXxcXC4pKykvLAoJCUNISUxEOiAvOihvbmx5fG50aHxsYXN0fGZpcnN0KS1jaGlsZCg/OlwoXHMqKGV2ZW58b2RkfCg/OlsrXC1dP1xkK3woPzpbK1wtXT9cZCopP25ccyooPzpbK1wtXVxzKlxkKyk/KSlccypcKSk/LywKCQlQT1M6IC86KG50aHxlcXxndHxsdHxmaXJzdHxsYXN0fGV2ZW58b2RkKSg/OlwoKFxkKilcKSk/KD89W15cLV18JCkvLAoJCVBTRVVETzogLzooKD86W1x3XHUwMGMwLVx1RkZGRlwtXXxcXC4pKykoPzpcKChbJyJdPykoKD86XChbXlwpXStcKXxbXlwoXCldKikrKVwyXCkpPy8KCX0sCgoJbGVmdE1hdGNoOiB7fSwKCglhdHRyTWFwOiB7CgkJImNsYXNzIjogImNsYXNzTmFtZSIsCgkJImZvciI6ICJodG1sRm9yIgoJfSwKCglhdHRySGFuZGxlOiB7CgkJaHJlZjogZnVuY3Rpb24oIGVsZW0gKSB7CgkJCXJldHVybiBlbGVtLmdldEF0dHJpYnV0ZSggImhyZWYiICk7CgkJfSwKCQl0eXBlOiBmdW5jdGlvbiggZWxlbSApIHsKCQkJcmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlKCAidHlwZSIgKTsKCQl9Cgl9LAoKCXJlbGF0aXZlOiB7CgkJIisiOiBmdW5jdGlvbihjaGVja1NldCwgcGFydCl7CgkJCXZhciBpc1BhcnRTdHIgPSB0eXBlb2YgcGFydCA9PT0gInN0cmluZyIsCgkJCQlpc1RhZyA9IGlzUGFydFN0ciAmJiAhck5vbldvcmQudGVzdCggcGFydCApLAoJCQkJaXNQYXJ0U3RyTm90VGFnID0gaXNQYXJ0U3RyICYmICFpc1RhZzsKCgkJCWlmICggaXNUYWcgKSB7CgkJCQlwYXJ0ID0gcGFydC50b0xvd2VyQ2FzZSgpOwoJCQl9CgoJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSBjaGVja1NldC5sZW5ndGgsIGVsZW07IGkgPCBsOyBpKysgKSB7CgkJCQlpZiAoIChlbGVtID0gY2hlY2tTZXRbaV0pICkgewoJCQkJCXdoaWxlICggKGVsZW0gPSBlbGVtLnByZXZpb3VzU2libGluZykgJiYgZWxlbS5ub2RlVHlwZSAhPT0gMSApIHt9CgoJCQkJCWNoZWNrU2V0W2ldID0gaXNQYXJ0U3RyTm90VGFnIHx8IGVsZW0gJiYgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBwYXJ0ID8KCQkJCQkJZWxlbSB8fCBmYWxzZSA6CgkJCQkJCWVsZW0gPT09IHBhcnQ7CgkJCQl9CgkJCX0KCgkJCWlmICggaXNQYXJ0U3RyTm90VGFnICkgewoJCQkJU2l6emxlLmZpbHRlciggcGFydCwgY2hlY2tTZXQsIHRydWUgKTsKCQkJfQoJCX0sCgoJCSI+IjogZnVuY3Rpb24oIGNoZWNrU2V0LCBwYXJ0ICkgewoJCQl2YXIgZWxlbSwKCQkJCWlzUGFydFN0ciA9IHR5cGVvZiBwYXJ0ID09PSAic3RyaW5nIiwKCQkJCWkgPSAwLAoJCQkJbCA9IGNoZWNrU2V0Lmxlbmd0aDsKCgkJCWlmICggaXNQYXJ0U3RyICYmICFyTm9uV29yZC50ZXN0KCBwYXJ0ICkgKSB7CgkJCQlwYXJ0ID0gcGFydC50b0xvd2VyQ2FzZSgpOwoKCQkJCWZvciAoIDsgaSA8IGw7IGkrKyApIHsKCQkJCQllbGVtID0gY2hlY2tTZXRbaV07CgoJCQkJCWlmICggZWxlbSApIHsKCQkJCQkJdmFyIHBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZTsKCQkJCQkJY2hlY2tTZXRbaV0gPSBwYXJlbnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gcGFydCA/IHBhcmVudCA6IGZhbHNlOwoJCQkJCX0KCQkJCX0KCgkJCX0gZWxzZSB7CgkJCQlmb3IgKCA7IGkgPCBsOyBpKysgKSB7CgkJCQkJZWxlbSA9IGNoZWNrU2V0W2ldOwoKCQkJCQlpZiAoIGVsZW0gKSB7CgkJCQkJCWNoZWNrU2V0W2ldID0gaXNQYXJ0U3RyID8KCQkJCQkJCWVsZW0ucGFyZW50Tm9kZSA6CgkJCQkJCQllbGVtLnBhcmVudE5vZGUgPT09IHBhcnQ7CgkJCQkJfQoJCQkJfQoKCQkJCWlmICggaXNQYXJ0U3RyICkgewoJCQkJCVNpenpsZS5maWx0ZXIoIHBhcnQsIGNoZWNrU2V0LCB0cnVlICk7CgkJCQl9CgkJCX0KCQl9LAoKCQkiIjogZnVuY3Rpb24oY2hlY2tTZXQsIHBhcnQsIGlzWE1MKXsKCQkJdmFyIG5vZGVDaGVjaywKCQkJCWRvbmVOYW1lID0gZG9uZSsrLAoJCQkJY2hlY2tGbiA9IGRpckNoZWNrOwoKCQkJaWYgKCB0eXBlb2YgcGFydCA9PT0gInN0cmluZyIgJiYgIXJOb25Xb3JkLnRlc3QoIHBhcnQgKSApIHsKCQkJCXBhcnQgPSBwYXJ0LnRvTG93ZXJDYXNlKCk7CgkJCQlub2RlQ2hlY2sgPSBwYXJ0OwoJCQkJY2hlY2tGbiA9IGRpck5vZGVDaGVjazsKCQkJfQoKCQkJY2hlY2tGbiggInBhcmVudE5vZGUiLCBwYXJ0LCBkb25lTmFtZSwgY2hlY2tTZXQsIG5vZGVDaGVjaywgaXNYTUwgKTsKCQl9LAoKCQkifiI6IGZ1bmN0aW9uKCBjaGVja1NldCwgcGFydCwgaXNYTUwgKSB7CgkJCXZhciBub2RlQ2hlY2ssCgkJCQlkb25lTmFtZSA9IGRvbmUrKywKCQkJCWNoZWNrRm4gPSBkaXJDaGVjazsKCgkJCWlmICggdHlwZW9mIHBhcnQgPT09ICJzdHJpbmciICYmICFyTm9uV29yZC50ZXN0KCBwYXJ0ICkgKSB7CgkJCQlwYXJ0ID0gcGFydC50b0xvd2VyQ2FzZSgpOwoJCQkJbm9kZUNoZWNrID0gcGFydDsKCQkJCWNoZWNrRm4gPSBkaXJOb2RlQ2hlY2s7CgkJCX0KCgkJCWNoZWNrRm4oICJwcmV2aW91c1NpYmxpbmciLCBwYXJ0LCBkb25lTmFtZSwgY2hlY2tTZXQsIG5vZGVDaGVjaywgaXNYTUwgKTsKCQl9Cgl9LAoKCWZpbmQ6IHsKCQlJRDogZnVuY3Rpb24oIG1hdGNoLCBjb250ZXh0LCBpc1hNTCApIHsKCQkJaWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50QnlJZCAhPT0gInVuZGVmaW5lZCIgJiYgIWlzWE1MICkgewoJCQkJdmFyIG0gPSBjb250ZXh0LmdldEVsZW1lbnRCeUlkKG1hdGNoWzFdKTsKCQkJCS8vIENoZWNrIHBhcmVudE5vZGUgdG8gY2F0Y2ggd2hlbiBCbGFja2JlcnJ5IDQuNiByZXR1cm5zCgkJCQkvLyBub2RlcyB0aGF0IGFyZSBubyBsb25nZXIgaW4gdGhlIGRvY3VtZW50ICM2OTYzCgkJCQlyZXR1cm4gbSAmJiBtLnBhcmVudE5vZGUgPyBbbV0gOiBbXTsKCQkJfQoJCX0sCgoJCU5BTUU6IGZ1bmN0aW9uKCBtYXRjaCwgY29udGV4dCApIHsKCQkJaWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50c0J5TmFtZSAhPT0gInVuZGVmaW5lZCIgKSB7CgkJCQl2YXIgcmV0ID0gW10sCgkJCQkJcmVzdWx0cyA9IGNvbnRleHQuZ2V0RWxlbWVudHNCeU5hbWUoIG1hdGNoWzFdICk7CgoJCQkJZm9yICggdmFyIGkgPSAwLCBsID0gcmVzdWx0cy5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CgkJCQkJaWYgKCByZXN1bHRzW2ldLmdldEF0dHJpYnV0ZSgibmFtZSIpID09PSBtYXRjaFsxXSApIHsKCQkJCQkJcmV0LnB1c2goIHJlc3VsdHNbaV0gKTsKCQkJCQl9CgkJCQl9CgoJCQkJcmV0dXJuIHJldC5sZW5ndGggPT09IDAgPyBudWxsIDogcmV0OwoJCQl9CgkJfSwKCgkJVEFHOiBmdW5jdGlvbiggbWF0Y2gsIGNvbnRleHQgKSB7CgkJCWlmICggdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgIT09ICJ1bmRlZmluZWQiICkgewoJCQkJcmV0dXJuIGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIG1hdGNoWzFdICk7CgkJCX0KCQl9Cgl9LAoJcHJlRmlsdGVyOiB7CgkJQ0xBU1M6IGZ1bmN0aW9uKCBtYXRjaCwgY3VyTG9vcCwgaW5wbGFjZSwgcmVzdWx0LCBub3QsIGlzWE1MICkgewoJCQltYXRjaCA9ICIgIiArIG1hdGNoWzFdLnJlcGxhY2UoIHJCYWNrc2xhc2gsICIiICkgKyAiICI7CgoJCQlpZiAoIGlzWE1MICkgewoJCQkJcmV0dXJuIG1hdGNoOwoJCQl9CgoJCQlmb3IgKCB2YXIgaSA9IDAsIGVsZW07IChlbGVtID0gY3VyTG9vcFtpXSkgIT0gbnVsbDsgaSsrICkgewoJCQkJaWYgKCBlbGVtICkgewoJCQkJCWlmICggbm90IF4gKGVsZW0uY2xhc3NOYW1lICYmICgiICIgKyBlbGVtLmNsYXNzTmFtZSArICIgIikucmVwbGFjZSgvW1x0XG5ccl0vZywgIiAiKS5pbmRleE9mKG1hdGNoKSA+PSAwKSApIHsKCQkJCQkJaWYgKCAhaW5wbGFjZSApIHsKCQkJCQkJCXJlc3VsdC5wdXNoKCBlbGVtICk7CgkJCQkJCX0KCgkJCQkJfSBlbHNlIGlmICggaW5wbGFjZSApIHsKCQkJCQkJY3VyTG9vcFtpXSA9IGZhbHNlOwoJCQkJCX0KCQkJCX0KCQkJfQoKCQkJcmV0dXJuIGZhbHNlOwoJCX0sCgoJCUlEOiBmdW5jdGlvbiggbWF0Y2ggKSB7CgkJCXJldHVybiBtYXRjaFsxXS5yZXBsYWNlKCByQmFja3NsYXNoLCAiIiApOwoJCX0sCgoJCVRBRzogZnVuY3Rpb24oIG1hdGNoLCBjdXJMb29wICkgewoJCQlyZXR1cm4gbWF0Y2hbMV0ucmVwbGFjZSggckJhY2tzbGFzaCwgIiIgKS50b0xvd2VyQ2FzZSgpOwoJCX0sCgoJCUNISUxEOiBmdW5jdGlvbiggbWF0Y2ggKSB7CgkJCWlmICggbWF0Y2hbMV0gPT09ICJudGgiICkgewoJCQkJaWYgKCAhbWF0Y2hbMl0gKSB7CgkJCQkJU2l6emxlLmVycm9yKCBtYXRjaFswXSApOwoJCQkJfQoKCQkJCW1hdGNoWzJdID0gbWF0Y2hbMl0ucmVwbGFjZSgvXlwrfFxzKi9nLCAnJyk7CgoJCQkJLy8gcGFyc2UgZXF1YXRpb25zIGxpa2UgJ2V2ZW4nLCAnb2RkJywgJzUnLCAnMm4nLCAnM24rMicsICc0bi0xJywgJy1uKzYnCgkJCQl2YXIgdGVzdCA9IC8oLT8pKFxkKikoPzpuKFsrXC1dP1xkKikpPy8uZXhlYygKCQkJCQltYXRjaFsyXSA9PT0gImV2ZW4iICYmICIybiIgfHwgbWF0Y2hbMl0gPT09ICJvZGQiICYmICIybisxIiB8fAoJCQkJCSEvXEQvLnRlc3QoIG1hdGNoWzJdICkgJiYgIjBuKyIgKyBtYXRjaFsyXSB8fCBtYXRjaFsyXSk7CgoJCQkJLy8gY2FsY3VsYXRlIHRoZSBudW1iZXJzIChmaXJzdCluKyhsYXN0KSBpbmNsdWRpbmcgaWYgdGhleSBhcmUgbmVnYXRpdmUKCQkJCW1hdGNoWzJdID0gKHRlc3RbMV0gKyAodGVzdFsyXSB8fCAxKSkgLSAwOwoJCQkJbWF0Y2hbM10gPSB0ZXN0WzNdIC0gMDsKCQkJfQoJCQllbHNlIGlmICggbWF0Y2hbMl0gKSB7CgkJCQlTaXp6bGUuZXJyb3IoIG1hdGNoWzBdICk7CgkJCX0KCgkJCS8vIFRPRE86IE1vdmUgdG8gbm9ybWFsIGNhY2hpbmcgc3lzdGVtCgkJCW1hdGNoWzBdID0gZG9uZSsrOwoKCQkJcmV0dXJuIG1hdGNoOwoJCX0sCgoJCUFUVFI6IGZ1bmN0aW9uKCBtYXRjaCwgY3VyTG9vcCwgaW5wbGFjZSwgcmVzdWx0LCBub3QsIGlzWE1MICkgewoJCQl2YXIgbmFtZSA9IG1hdGNoWzFdID0gbWF0Y2hbMV0ucmVwbGFjZSggckJhY2tzbGFzaCwgIiIgKTsKCQkJCgkJCWlmICggIWlzWE1MICYmIEV4cHIuYXR0ck1hcFtuYW1lXSApIHsKCQkJCW1hdGNoWzFdID0gRXhwci5hdHRyTWFwW25hbWVdOwoJCQl9CgoJCQkvLyBIYW5kbGUgaWYgYW4gdW4tcXVvdGVkIHZhbHVlIHdhcyB1c2VkCgkJCW1hdGNoWzRdID0gKCBtYXRjaFs0XSB8fCBtYXRjaFs1XSB8fCAiIiApLnJlcGxhY2UoIHJCYWNrc2xhc2gsICIiICk7CgoJCQlpZiAoIG1hdGNoWzJdID09PSAifj0iICkgewoJCQkJbWF0Y2hbNF0gPSAiICIgKyBtYXRjaFs0XSArICIgIjsKCQkJfQoKCQkJcmV0dXJuIG1hdGNoOwoJCX0sCgoJCVBTRVVETzogZnVuY3Rpb24oIG1hdGNoLCBjdXJMb29wLCBpbnBsYWNlLCByZXN1bHQsIG5vdCApIHsKCQkJaWYgKCBtYXRjaFsxXSA9PT0gIm5vdCIgKSB7CgkJCQkvLyBJZiB3ZSdyZSBkZWFsaW5nIHdpdGggYSBjb21wbGV4IGV4cHJlc3Npb24sIG9yIGEgc2ltcGxlIG9uZQoJCQkJaWYgKCAoIGNodW5rZXIuZXhlYyhtYXRjaFszXSkgfHwgIiIgKS5sZW5ndGggPiAxIHx8IC9eXHcvLnRlc3QobWF0Y2hbM10pICkgewoJCQkJCW1hdGNoWzNdID0gU2l6emxlKG1hdGNoWzNdLCBudWxsLCBudWxsLCBjdXJMb29wKTsKCgkJCQl9IGVsc2UgewoJCQkJCXZhciByZXQgPSBTaXp6bGUuZmlsdGVyKG1hdGNoWzNdLCBjdXJMb29wLCBpbnBsYWNlLCB0cnVlIF4gbm90KTsKCgkJCQkJaWYgKCAhaW5wbGFjZSApIHsKCQkJCQkJcmVzdWx0LnB1c2guYXBwbHkoIHJlc3VsdCwgcmV0ICk7CgkJCQkJfQoKCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQl9CgoJCQl9IGVsc2UgaWYgKCBFeHByLm1hdGNoLlBPUy50ZXN0KCBtYXRjaFswXSApIHx8IEV4cHIubWF0Y2guQ0hJTEQudGVzdCggbWF0Y2hbMF0gKSApIHsKCQkJCXJldHVybiB0cnVlOwoJCQl9CgkJCQoJCQlyZXR1cm4gbWF0Y2g7CgkJfSwKCgkJUE9TOiBmdW5jdGlvbiggbWF0Y2ggKSB7CgkJCW1hdGNoLnVuc2hpZnQoIHRydWUgKTsKCgkJCXJldHVybiBtYXRjaDsKCQl9Cgl9LAoJCglmaWx0ZXJzOiB7CgkJZW5hYmxlZDogZnVuY3Rpb24oIGVsZW0gKSB7CgkJCXJldHVybiBlbGVtLmRpc2FibGVkID09PSBmYWxzZSAmJiBlbGVtLnR5cGUgIT09ICJoaWRkZW4iOwoJCX0sCgoJCWRpc2FibGVkOiBmdW5jdGlvbiggZWxlbSApIHsKCQkJcmV0dXJuIGVsZW0uZGlzYWJsZWQgPT09IHRydWU7CgkJfSwKCgkJY2hlY2tlZDogZnVuY3Rpb24oIGVsZW0gKSB7CgkJCXJldHVybiBlbGVtLmNoZWNrZWQgPT09IHRydWU7CgkJfSwKCQkKCQlzZWxlY3RlZDogZnVuY3Rpb24oIGVsZW0gKSB7CgkJCS8vIEFjY2Vzc2luZyB0aGlzIHByb3BlcnR5IG1ha2VzIHNlbGVjdGVkLWJ5LWRlZmF1bHQKCQkJLy8gb3B0aW9ucyBpbiBTYWZhcmkgd29yayBwcm9wZXJseQoJCQlpZiAoIGVsZW0ucGFyZW50Tm9kZSApIHsKCQkJCWVsZW0ucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4OwoJCQl9CgkJCQoJCQlyZXR1cm4gZWxlbS5zZWxlY3RlZCA9PT0gdHJ1ZTsKCQl9LAoKCQlwYXJlbnQ6IGZ1bmN0aW9uKCBlbGVtICkgewoJCQlyZXR1cm4gISFlbGVtLmZpcnN0Q2hpbGQ7CgkJfSwKCgkJZW1wdHk6IGZ1bmN0aW9uKCBlbGVtICkgewoJCQlyZXR1cm4gIWVsZW0uZmlyc3RDaGlsZDsKCQl9LAoKCQloYXM6IGZ1bmN0aW9uKCBlbGVtLCBpLCBtYXRjaCApIHsKCQkJcmV0dXJuICEhU2l6emxlKCBtYXRjaFszXSwgZWxlbSApLmxlbmd0aDsKCQl9LAoKCQloZWFkZXI6IGZ1bmN0aW9uKCBlbGVtICkgewoJCQlyZXR1cm4gKC9oXGQvaSkudGVzdCggZWxlbS5ub2RlTmFtZSApOwoJCX0sCgoJCXRleHQ6IGZ1bmN0aW9uKCBlbGVtICkgewoJCQl2YXIgYXR0ciA9IGVsZW0uZ2V0QXR0cmlidXRlKCAidHlwZSIgKSwgdHlwZSA9IGVsZW0udHlwZTsKCQkJLy8gSUU2IGFuZCA3IHdpbGwgbWFwIGVsZW0udHlwZSB0byAndGV4dCcgZm9yIG5ldyBIVE1MNSB0eXBlcyAoc2VhcmNoLCBldGMpIAoJCQkvLyB1c2UgZ2V0QXR0cmlidXRlIGluc3RlYWQgdG8gdGVzdCB0aGlzIGNhc2UKCQkJcmV0dXJuIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gImlucHV0IiAmJiAidGV4dCIgPT09IHR5cGUgJiYgKCBhdHRyID09PSB0eXBlIHx8IGF0dHIgPT09IG51bGwgKTsKCQl9LAoKCQlyYWRpbzogZnVuY3Rpb24oIGVsZW0gKSB7CgkJCXJldHVybiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICJpbnB1dCIgJiYgInJhZGlvIiA9PT0gZWxlbS50eXBlOwoJCX0sCgoJCWNoZWNrYm94OiBmdW5jdGlvbiggZWxlbSApIHsKCQkJcmV0dXJuIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gImlucHV0IiAmJiAiY2hlY2tib3giID09PSBlbGVtLnR5cGU7CgkJfSwKCgkJZmlsZTogZnVuY3Rpb24oIGVsZW0gKSB7CgkJCXJldHVybiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICJpbnB1dCIgJiYgImZpbGUiID09PSBlbGVtLnR5cGU7CgkJfSwKCgkJcGFzc3dvcmQ6IGZ1bmN0aW9uKCBlbGVtICkgewoJCQlyZXR1cm4gZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAiaW5wdXQiICYmICJwYXNzd29yZCIgPT09IGVsZW0udHlwZTsKCQl9LAoKCQlzdWJtaXQ6IGZ1bmN0aW9uKCBlbGVtICkgewoJCQl2YXIgbmFtZSA9IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTsKCQkJcmV0dXJuIChuYW1lID09PSAiaW5wdXQiIHx8IG5hbWUgPT09ICJidXR0b24iKSAmJiAic3VibWl0IiA9PT0gZWxlbS50eXBlOwoJCX0sCgoJCWltYWdlOiBmdW5jdGlvbiggZWxlbSApIHsKCQkJcmV0dXJuIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gImlucHV0IiAmJiAiaW1hZ2UiID09PSBlbGVtLnR5cGU7CgkJfSwKCgkJcmVzZXQ6IGZ1bmN0aW9uKCBlbGVtICkgewoJCQl2YXIgbmFtZSA9IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTsKCQkJcmV0dXJuIChuYW1lID09PSAiaW5wdXQiIHx8IG5hbWUgPT09ICJidXR0b24iKSAmJiAicmVzZXQiID09PSBlbGVtLnR5cGU7CgkJfSwKCgkJYnV0dG9uOiBmdW5jdGlvbiggZWxlbSApIHsKCQkJdmFyIG5hbWUgPSBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7CgkJCXJldHVybiBuYW1lID09PSAiaW5wdXQiICYmICJidXR0b24iID09PSBlbGVtLnR5cGUgfHwgbmFtZSA9PT0gImJ1dHRvbiI7CgkJfSwKCgkJaW5wdXQ6IGZ1bmN0aW9uKCBlbGVtICkgewoJCQlyZXR1cm4gKC9pbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uL2kpLnRlc3QoIGVsZW0ubm9kZU5hbWUgKTsKCQl9LAoKCQlmb2N1czogZnVuY3Rpb24oIGVsZW0gKSB7CgkJCXJldHVybiBlbGVtID09PSBlbGVtLm93bmVyRG9jdW1lbnQuYWN0aXZlRWxlbWVudDsKCQl9Cgl9LAoJc2V0RmlsdGVyczogewoJCWZpcnN0OiBmdW5jdGlvbiggZWxlbSwgaSApIHsKCQkJcmV0dXJuIGkgPT09IDA7CgkJfSwKCgkJbGFzdDogZnVuY3Rpb24oIGVsZW0sIGksIG1hdGNoLCBhcnJheSApIHsKCQkJcmV0dXJuIGkgPT09IGFycmF5Lmxlbmd0aCAtIDE7CgkJfSwKCgkJZXZlbjogZnVuY3Rpb24oIGVsZW0sIGkgKSB7CgkJCXJldHVybiBpICUgMiA9PT0gMDsKCQl9LAoKCQlvZGQ6IGZ1bmN0aW9uKCBlbGVtLCBpICkgewoJCQlyZXR1cm4gaSAlIDIgPT09IDE7CgkJfSwKCgkJbHQ6IGZ1bmN0aW9uKCBlbGVtLCBpLCBtYXRjaCApIHsKCQkJcmV0dXJuIGkgPCBtYXRjaFszXSAtIDA7CgkJfSwKCgkJZ3Q6IGZ1bmN0aW9uKCBlbGVtLCBpLCBtYXRjaCApIHsKCQkJcmV0dXJuIGkgPiBtYXRjaFszXSAtIDA7CgkJfSwKCgkJbnRoOiBmdW5jdGlvbiggZWxlbSwgaSwgbWF0Y2ggKSB7CgkJCXJldHVybiBtYXRjaFszXSAtIDAgPT09IGk7CgkJfSwKCgkJZXE6IGZ1bmN0aW9uKCBlbGVtLCBpLCBtYXRjaCApIHsKCQkJcmV0dXJuIG1hdGNoWzNdIC0gMCA9PT0gaTsKCQl9Cgl9LAoJZmlsdGVyOiB7CgkJUFNFVURPOiBmdW5jdGlvbiggZWxlbSwgbWF0Y2gsIGksIGFycmF5ICkgewoJCQl2YXIgbmFtZSA9IG1hdGNoWzFdLAoJCQkJZmlsdGVyID0gRXhwci5maWx0ZXJzWyBuYW1lIF07CgoJCQlpZiAoIGZpbHRlciApIHsKCQkJCXJldHVybiBmaWx0ZXIoIGVsZW0sIGksIG1hdGNoLCBhcnJheSApOwoKCQkJfSBlbHNlIGlmICggbmFtZSA9PT0gImNvbnRhaW5zIiApIHsKCQkJCXJldHVybiAoZWxlbS50ZXh0Q29udGVudCB8fCBlbGVtLmlubmVyVGV4dCB8fCBTaXp6bGUuZ2V0VGV4dChbIGVsZW0gXSkgfHwgIiIpLmluZGV4T2YobWF0Y2hbM10pID49IDA7CgoJCQl9IGVsc2UgaWYgKCBuYW1lID09PSAibm90IiApIHsKCQkJCXZhciBub3QgPSBtYXRjaFszXTsKCgkJCQlmb3IgKCB2YXIgaiA9IDAsIGwgPSBub3QubGVuZ3RoOyBqIDwgbDsgaisrICkgewoJCQkJCWlmICggbm90W2pdID09PSBlbGVtICkgewoJCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQkJfQoJCQkJfQoKCQkJCXJldHVybiB0cnVlOwoKCQkJfSBlbHNlIHsKCQkJCVNpenpsZS5lcnJvciggbmFtZSApOwoJCQl9CgkJfSwKCgkJQ0hJTEQ6IGZ1bmN0aW9uKCBlbGVtLCBtYXRjaCApIHsKCQkJdmFyIHR5cGUgPSBtYXRjaFsxXSwKCQkJCW5vZGUgPSBlbGVtOwoKCQkJc3dpdGNoICggdHlwZSApIHsKCQkJCWNhc2UgIm9ubHkiOgoJCQkJY2FzZSAiZmlyc3QiOgoJCQkJCXdoaWxlICggKG5vZGUgPSBub2RlLnByZXZpb3VzU2libGluZykgKQkgewoJCQkJCQlpZiAoIG5vZGUubm9kZVR5cGUgPT09IDEgKSB7IAoJCQkJCQkJcmV0dXJuIGZhbHNlOyAKCQkJCQkJfQoJCQkJCX0KCgkJCQkJaWYgKCB0eXBlID09PSAiZmlyc3QiICkgeyAKCQkJCQkJcmV0dXJuIHRydWU7IAoJCQkJCX0KCgkJCQkJbm9kZSA9IGVsZW07CgoJCQkJY2FzZSAibGFzdCI6CgkJCQkJd2hpbGUgKCAobm9kZSA9IG5vZGUubmV4dFNpYmxpbmcpICkJIHsKCQkJCQkJaWYgKCBub2RlLm5vZGVUeXBlID09PSAxICkgeyAKCQkJCQkJCXJldHVybiBmYWxzZTsgCgkJCQkJCX0KCQkJCQl9CgoJCQkJCXJldHVybiB0cnVlOwoKCQkJCWNhc2UgIm50aCI6CgkJCQkJdmFyIGZpcnN0ID0gbWF0Y2hbMl0sCgkJCQkJCWxhc3QgPSBtYXRjaFszXTsKCgkJCQkJaWYgKCBmaXJzdCA9PT0gMSAmJiBsYXN0ID09PSAwICkgewoJCQkJCQlyZXR1cm4gdHJ1ZTsKCQkJCQl9CgkJCQkJCgkJCQkJdmFyIGRvbmVOYW1lID0gbWF0Y2hbMF0sCgkJCQkJCXBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZTsKCQoJCQkJCWlmICggcGFyZW50ICYmIChwYXJlbnQuc2l6Y2FjaGUgIT09IGRvbmVOYW1lIHx8ICFlbGVtLm5vZGVJbmRleCkgKSB7CgkJCQkJCXZhciBjb3VudCA9IDA7CgkJCQkJCQoJCQkJCQlmb3IgKCBub2RlID0gcGFyZW50LmZpcnN0Q2hpbGQ7IG5vZGU7IG5vZGUgPSBub2RlLm5leHRTaWJsaW5nICkgewoJCQkJCQkJaWYgKCBub2RlLm5vZGVUeXBlID09PSAxICkgewoJCQkJCQkJCW5vZGUubm9kZUluZGV4ID0gKytjb3VudDsKCQkJCQkJCX0KCQkJCQkJfSAKCgkJCQkJCXBhcmVudC5zaXpjYWNoZSA9IGRvbmVOYW1lOwoJCQkJCX0KCQkJCQkKCQkJCQl2YXIgZGlmZiA9IGVsZW0ubm9kZUluZGV4IC0gbGFzdDsKCgkJCQkJaWYgKCBmaXJzdCA9PT0gMCApIHsKCQkJCQkJcmV0dXJuIGRpZmYgPT09IDA7CgoJCQkJCX0gZWxzZSB7CgkJCQkJCXJldHVybiAoIGRpZmYgJSBmaXJzdCA9PT0gMCAmJiBkaWZmIC8gZmlyc3QgPj0gMCApOwoJCQkJCX0KCQkJfQoJCX0sCgoJCUlEOiBmdW5jdGlvbiggZWxlbSwgbWF0Y2ggKSB7CgkJCXJldHVybiBlbGVtLm5vZGVUeXBlID09PSAxICYmIGVsZW0uZ2V0QXR0cmlidXRlKCJpZCIpID09PSBtYXRjaDsKCQl9LAoKCQlUQUc6IGZ1bmN0aW9uKCBlbGVtLCBtYXRjaCApIHsKCQkJcmV0dXJuIChtYXRjaCA9PT0gIioiICYmIGVsZW0ubm9kZVR5cGUgPT09IDEpIHx8IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gbWF0Y2g7CgkJfSwKCQkKCQlDTEFTUzogZnVuY3Rpb24oIGVsZW0sIG1hdGNoICkgewoJCQlyZXR1cm4gKCIgIiArIChlbGVtLmNsYXNzTmFtZSB8fCBlbGVtLmdldEF0dHJpYnV0ZSgiY2xhc3MiKSkgKyAiICIpCgkJCQkuaW5kZXhPZiggbWF0Y2ggKSA+IC0xOwoJCX0sCgoJCUFUVFI6IGZ1bmN0aW9uKCBlbGVtLCBtYXRjaCApIHsKCQkJdmFyIG5hbWUgPSBtYXRjaFsxXSwKCQkJCXJlc3VsdCA9IEV4cHIuYXR0ckhhbmRsZVsgbmFtZSBdID8KCQkJCQlFeHByLmF0dHJIYW5kbGVbIG5hbWUgXSggZWxlbSApIDoKCQkJCQllbGVtWyBuYW1lIF0gIT0gbnVsbCA/CgkJCQkJCWVsZW1bIG5hbWUgXSA6CgkJCQkJCWVsZW0uZ2V0QXR0cmlidXRlKCBuYW1lICksCgkJCQl2YWx1ZSA9IHJlc3VsdCArICIiLAoJCQkJdHlwZSA9IG1hdGNoWzJdLAoJCQkJY2hlY2sgPSBtYXRjaFs0XTsKCgkJCXJldHVybiByZXN1bHQgPT0gbnVsbCA/CgkJCQl0eXBlID09PSAiIT0iIDoKCQkJCXR5cGUgPT09ICI9IiA/CgkJCQl2YWx1ZSA9PT0gY2hlY2sgOgoJCQkJdHlwZSA9PT0gIio9IiA/CgkJCQl2YWx1ZS5pbmRleE9mKGNoZWNrKSA+PSAwIDoKCQkJCXR5cGUgPT09ICJ+PSIgPwoJCQkJKCIgIiArIHZhbHVlICsgIiAiKS5pbmRleE9mKGNoZWNrKSA+PSAwIDoKCQkJCSFjaGVjayA/CgkJCQl2YWx1ZSAmJiByZXN1bHQgIT09IGZhbHNlIDoKCQkJCXR5cGUgPT09ICIhPSIgPwoJCQkJdmFsdWUgIT09IGNoZWNrIDoKCQkJCXR5cGUgPT09ICJePSIgPwoJCQkJdmFsdWUuaW5kZXhPZihjaGVjaykgPT09IDAgOgoJCQkJdHlwZSA9PT0gIiQ9IiA/CgkJCQl2YWx1ZS5zdWJzdHIodmFsdWUubGVuZ3RoIC0gY2hlY2subGVuZ3RoKSA9PT0gY2hlY2sgOgoJCQkJdHlwZSA9PT0gInw9IiA/CgkJCQl2YWx1ZSA9PT0gY2hlY2sgfHwgdmFsdWUuc3Vic3RyKDAsIGNoZWNrLmxlbmd0aCArIDEpID09PSBjaGVjayArICItIiA6CgkJCQlmYWxzZTsKCQl9LAoKCQlQT1M6IGZ1bmN0aW9uKCBlbGVtLCBtYXRjaCwgaSwgYXJyYXkgKSB7CgkJCXZhciBuYW1lID0gbWF0Y2hbMl0sCgkJCQlmaWx0ZXIgPSBFeHByLnNldEZpbHRlcnNbIG5hbWUgXTsKCgkJCWlmICggZmlsdGVyICkgewoJCQkJcmV0dXJuIGZpbHRlciggZWxlbSwgaSwgbWF0Y2gsIGFycmF5ICk7CgkJCX0KCQl9Cgl9Cn07Cgp2YXIgb3JpZ1BPUyA9IEV4cHIubWF0Y2guUE9TLAoJZmVzY2FwZSA9IGZ1bmN0aW9uKGFsbCwgbnVtKXsKCQlyZXR1cm4gIlxcIiArIChudW0gLSAwICsgMSk7Cgl9OwoKZm9yICggdmFyIHR5cGUgaW4gRXhwci5tYXRjaCApIHsKCUV4cHIubWF0Y2hbIHR5cGUgXSA9IG5ldyBSZWdFeHAoIEV4cHIubWF0Y2hbIHR5cGUgXS5zb3VyY2UgKyAoLyg/IVteXFtdKlxdKSg/IVteXChdKlwpKS8uc291cmNlKSApOwoJRXhwci5sZWZ0TWF0Y2hbIHR5cGUgXSA9IG5ldyBSZWdFeHAoIC8oXig/Oi58XHJ8XG4pKj8pLy5zb3VyY2UgKyBFeHByLm1hdGNoWyB0eXBlIF0uc291cmNlLnJlcGxhY2UoL1xcKFxkKykvZywgZmVzY2FwZSkgKTsKfQoKdmFyIG1ha2VBcnJheSA9IGZ1bmN0aW9uKCBhcnJheSwgcmVzdWx0cyApIHsKCWFycmF5ID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoIGFycmF5LCAwICk7CgoJaWYgKCByZXN1bHRzICkgewoJCXJlc3VsdHMucHVzaC5hcHBseSggcmVzdWx0cywgYXJyYXkgKTsKCQlyZXR1cm4gcmVzdWx0czsKCX0KCQoJcmV0dXJuIGFycmF5Owp9OwoKLy8gUGVyZm9ybSBhIHNpbXBsZSBjaGVjayB0byBkZXRlcm1pbmUgaWYgdGhlIGJyb3dzZXIgaXMgY2FwYWJsZSBvZgovLyBjb252ZXJ0aW5nIGEgTm9kZUxpc3QgdG8gYW4gYXJyYXkgdXNpbmcgYnVpbHRpbiBtZXRob2RzLgovLyBBbHNvIHZlcmlmaWVzIHRoYXQgdGhlIHJldHVybmVkIGFycmF5IGhvbGRzIERPTSBub2RlcwovLyAod2hpY2ggaXMgbm90IHRoZSBjYXNlIGluIHRoZSBCbGFja2JlcnJ5IGJyb3dzZXIpCnRyeSB7CglBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCggZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNoaWxkTm9kZXMsIDAgKVswXS5ub2RlVHlwZTsKCi8vIFByb3ZpZGUgYSBmYWxsYmFjayBtZXRob2QgaWYgaXQgZG9lcyBub3Qgd29yawp9IGNhdGNoKCBlICkgewoJbWFrZUFycmF5ID0gZnVuY3Rpb24oIGFycmF5LCByZXN1bHRzICkgewoJCXZhciBpID0gMCwKCQkJcmV0ID0gcmVzdWx0cyB8fCBbXTsKCgkJaWYgKCB0b1N0cmluZy5jYWxsKGFycmF5KSA9PT0gIltvYmplY3QgQXJyYXldIiApIHsKCQkJQXJyYXkucHJvdG90eXBlLnB1c2guYXBwbHkoIHJldCwgYXJyYXkgKTsKCgkJfSBlbHNlIHsKCQkJaWYgKCB0eXBlb2YgYXJyYXkubGVuZ3RoID09PSAibnVtYmVyIiApIHsKCQkJCWZvciAoIHZhciBsID0gYXJyYXkubGVuZ3RoOyBpIDwgbDsgaSsrICkgewoJCQkJCXJldC5wdXNoKCBhcnJheVtpXSApOwoJCQkJfQoKCQkJfSBlbHNlIHsKCQkJCWZvciAoIDsgYXJyYXlbaV07IGkrKyApIHsKCQkJCQlyZXQucHVzaCggYXJyYXlbaV0gKTsKCQkJCX0KCQkJfQoJCX0KCgkJcmV0dXJuIHJldDsKCX07Cn0KCnZhciBzb3J0T3JkZXIsIHNpYmxpbmdDaGVjazsKCmlmICggZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uICkgewoJc29ydE9yZGVyID0gZnVuY3Rpb24oIGEsIGIgKSB7CgkJaWYgKCBhID09PSBiICkgewoJCQloYXNEdXBsaWNhdGUgPSB0cnVlOwoJCQlyZXR1cm4gMDsKCQl9CgoJCWlmICggIWEuY29tcGFyZURvY3VtZW50UG9zaXRpb24gfHwgIWIuY29tcGFyZURvY3VtZW50UG9zaXRpb24gKSB7CgkJCXJldHVybiBhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uID8gLTEgOiAxOwoJCX0KCgkJcmV0dXJuIGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYikgJiA0ID8gLTEgOiAxOwoJfTsKCn0gZWxzZSB7Cglzb3J0T3JkZXIgPSBmdW5jdGlvbiggYSwgYiApIHsKCQkvLyBUaGUgbm9kZXMgYXJlIGlkZW50aWNhbCwgd2UgY2FuIGV4aXQgZWFybHkKCQlpZiAoIGEgPT09IGIgKSB7CgkJCWhhc0R1cGxpY2F0ZSA9IHRydWU7CgkJCXJldHVybiAwOwoKCQkvLyBGYWxsYmFjayB0byB1c2luZyBzb3VyY2VJbmRleCAoaW4gSUUpIGlmIGl0J3MgYXZhaWxhYmxlIG9uIGJvdGggbm9kZXMKCQl9IGVsc2UgaWYgKCBhLnNvdXJjZUluZGV4ICYmIGIuc291cmNlSW5kZXggKSB7CgkJCXJldHVybiBhLnNvdXJjZUluZGV4IC0gYi5zb3VyY2VJbmRleDsKCQl9CgoJCXZhciBhbCwgYmwsCgkJCWFwID0gW10sCgkJCWJwID0gW10sCgkJCWF1cCA9IGEucGFyZW50Tm9kZSwKCQkJYnVwID0gYi5wYXJlbnROb2RlLAoJCQljdXIgPSBhdXA7CgoJCS8vIElmIHRoZSBub2RlcyBhcmUgc2libGluZ3MgKG9yIGlkZW50aWNhbCkgd2UgY2FuIGRvIGEgcXVpY2sgY2hlY2sKCQlpZiAoIGF1cCA9PT0gYnVwICkgewoJCQlyZXR1cm4gc2libGluZ0NoZWNrKCBhLCBiICk7CgoJCS8vIElmIG5vIHBhcmVudHMgd2VyZSBmb3VuZCB0aGVuIHRoZSBub2RlcyBhcmUgZGlzY29ubmVjdGVkCgkJfSBlbHNlIGlmICggIWF1cCApIHsKCQkJcmV0dXJuIC0xOwoKCQl9IGVsc2UgaWYgKCAhYnVwICkgewoJCQlyZXR1cm4gMTsKCQl9CgoJCS8vIE90aGVyd2lzZSB0aGV5J3JlIHNvbWV3aGVyZSBlbHNlIGluIHRoZSB0cmVlIHNvIHdlIG5lZWQKCQkvLyB0byBidWlsZCB1cCBhIGZ1bGwgbGlzdCBvZiB0aGUgcGFyZW50Tm9kZXMgZm9yIGNvbXBhcmlzb24KCQl3aGlsZSAoIGN1ciApIHsKCQkJYXAudW5zaGlmdCggY3VyICk7CgkJCWN1ciA9IGN1ci5wYXJlbnROb2RlOwoJCX0KCgkJY3VyID0gYnVwOwoKCQl3aGlsZSAoIGN1ciApIHsKCQkJYnAudW5zaGlmdCggY3VyICk7CgkJCWN1ciA9IGN1ci5wYXJlbnROb2RlOwoJCX0KCgkJYWwgPSBhcC5sZW5ndGg7CgkJYmwgPSBicC5sZW5ndGg7CgoJCS8vIFN0YXJ0IHdhbGtpbmcgZG93biB0aGUgdHJlZSBsb29raW5nIGZvciBhIGRpc2NyZXBhbmN5CgkJZm9yICggdmFyIGkgPSAwOyBpIDwgYWwgJiYgaSA8IGJsOyBpKysgKSB7CgkJCWlmICggYXBbaV0gIT09IGJwW2ldICkgewoJCQkJcmV0dXJuIHNpYmxpbmdDaGVjayggYXBbaV0sIGJwW2ldICk7CgkJCX0KCQl9CgoJCS8vIFdlIGVuZGVkIHNvbWVwbGFjZSB1cCB0aGUgdHJlZSBzbyBkbyBhIHNpYmxpbmcgY2hlY2sKCQlyZXR1cm4gaSA9PT0gYWwgPwoJCQlzaWJsaW5nQ2hlY2soIGEsIGJwW2ldLCAtMSApIDoKCQkJc2libGluZ0NoZWNrKCBhcFtpXSwgYiwgMSApOwoJfTsKCglzaWJsaW5nQ2hlY2sgPSBmdW5jdGlvbiggYSwgYiwgcmV0ICkgewoJCWlmICggYSA9PT0gYiApIHsKCQkJcmV0dXJuIHJldDsKCQl9CgoJCXZhciBjdXIgPSBhLm5leHRTaWJsaW5nOwoKCQl3aGlsZSAoIGN1ciApIHsKCQkJaWYgKCBjdXIgPT09IGIgKSB7CgkJCQlyZXR1cm4gLTE7CgkJCX0KCgkJCWN1ciA9IGN1ci5uZXh0U2libGluZzsKCQl9CgoJCXJldHVybiAxOwoJfTsKfQoKLy8gVXRpbGl0eSBmdW5jdGlvbiBmb3IgcmV0cmVpdmluZyB0aGUgdGV4dCB2YWx1ZSBvZiBhbiBhcnJheSBvZiBET00gbm9kZXMKU2l6emxlLmdldFRleHQgPSBmdW5jdGlvbiggZWxlbXMgKSB7Cgl2YXIgcmV0ID0gIiIsIGVsZW07CgoJZm9yICggdmFyIGkgPSAwOyBlbGVtc1tpXTsgaSsrICkgewoJCWVsZW0gPSBlbGVtc1tpXTsKCgkJLy8gR2V0IHRoZSB0ZXh0IGZyb20gdGV4dCBub2RlcyBhbmQgQ0RBVEEgbm9kZXMKCQlpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDMgfHwgZWxlbS5ub2RlVHlwZSA9PT0gNCApIHsKCQkJcmV0ICs9IGVsZW0ubm9kZVZhbHVlOwoKCQkvLyBUcmF2ZXJzZSBldmVyeXRoaW5nIGVsc2UsIGV4Y2VwdCBjb21tZW50IG5vZGVzCgkJfSBlbHNlIGlmICggZWxlbS5ub2RlVHlwZSAhPT0gOCApIHsKCQkJcmV0ICs9IFNpenpsZS5nZXRUZXh0KCBlbGVtLmNoaWxkTm9kZXMgKTsKCQl9Cgl9CgoJcmV0dXJuIHJldDsKfTsKCi8vIENoZWNrIHRvIHNlZSBpZiB0aGUgYnJvd3NlciByZXR1cm5zIGVsZW1lbnRzIGJ5IG5hbWUgd2hlbgovLyBxdWVyeWluZyBieSBnZXRFbGVtZW50QnlJZCAoYW5kIHByb3ZpZGUgYSB3b3JrYXJvdW5kKQooZnVuY3Rpb24oKXsKCS8vIFdlJ3JlIGdvaW5nIHRvIGluamVjdCBhIGZha2UgaW5wdXQgZWxlbWVudCB3aXRoIGEgc3BlY2lmaWVkIG5hbWUKCXZhciBmb3JtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksCgkJaWQgPSAic2NyaXB0IiArIChuZXcgRGF0ZSgpKS5nZXRUaW1lKCksCgkJcm9vdCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDsKCglmb3JtLmlubmVySFRNTCA9ICI8YSBuYW1lPSciICsgaWQgKyAiJy8+IjsKCgkvLyBJbmplY3QgaXQgaW50byB0aGUgcm9vdCBlbGVtZW50LCBjaGVjayBpdHMgc3RhdHVzLCBhbmQgcmVtb3ZlIGl0IHF1aWNrbHkKCXJvb3QuaW5zZXJ0QmVmb3JlKCBmb3JtLCByb290LmZpcnN0Q2hpbGQgKTsKCgkvLyBUaGUgd29ya2Fyb3VuZCBoYXMgdG8gZG8gYWRkaXRpb25hbCBjaGVja3MgYWZ0ZXIgYSBnZXRFbGVtZW50QnlJZAoJLy8gV2hpY2ggc2xvd3MgdGhpbmdzIGRvd24gZm9yIG90aGVyIGJyb3dzZXJzIChoZW5jZSB0aGUgYnJhbmNoaW5nKQoJaWYgKCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCggaWQgKSApIHsKCQlFeHByLmZpbmQuSUQgPSBmdW5jdGlvbiggbWF0Y2gsIGNvbnRleHQsIGlzWE1MICkgewoJCQlpZiAoIHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRCeUlkICE9PSAidW5kZWZpbmVkIiAmJiAhaXNYTUwgKSB7CgkJCQl2YXIgbSA9IGNvbnRleHQuZ2V0RWxlbWVudEJ5SWQobWF0Y2hbMV0pOwoKCQkJCXJldHVybiBtID8KCQkJCQltLmlkID09PSBtYXRjaFsxXSB8fCB0eXBlb2YgbS5nZXRBdHRyaWJ1dGVOb2RlICE9PSAidW5kZWZpbmVkIiAmJiBtLmdldEF0dHJpYnV0ZU5vZGUoImlkIikubm9kZVZhbHVlID09PSBtYXRjaFsxXSA/CgkJCQkJCVttXSA6CgkJCQkJCXVuZGVmaW5lZCA6CgkJCQkJW107CgkJCX0KCQl9OwoKCQlFeHByLmZpbHRlci5JRCA9IGZ1bmN0aW9uKCBlbGVtLCBtYXRjaCApIHsKCQkJdmFyIG5vZGUgPSB0eXBlb2YgZWxlbS5nZXRBdHRyaWJ1dGVOb2RlICE9PSAidW5kZWZpbmVkIiAmJiBlbGVtLmdldEF0dHJpYnV0ZU5vZGUoImlkIik7CgoJCQlyZXR1cm4gZWxlbS5ub2RlVHlwZSA9PT0gMSAmJiBub2RlICYmIG5vZGUubm9kZVZhbHVlID09PSBtYXRjaDsKCQl9OwoJfQoKCXJvb3QucmVtb3ZlQ2hpbGQoIGZvcm0gKTsKCgkvLyByZWxlYXNlIG1lbW9yeSBpbiBJRQoJcm9vdCA9IGZvcm0gPSBudWxsOwp9KSgpOwoKKGZ1bmN0aW9uKCl7CgkvLyBDaGVjayB0byBzZWUgaWYgdGhlIGJyb3dzZXIgcmV0dXJucyBvbmx5IGVsZW1lbnRzCgkvLyB3aGVuIGRvaW5nIGdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikKCgkvLyBDcmVhdGUgYSBmYWtlIGVsZW1lbnQKCXZhciBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKCWRpdi5hcHBlbmRDaGlsZCggZG9jdW1lbnQuY3JlYXRlQ29tbWVudCgiIikgKTsKCgkvLyBNYWtlIHN1cmUgbm8gY29tbWVudHMgYXJlIGZvdW5kCglpZiAoIGRpdi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpLmxlbmd0aCA+IDAgKSB7CgkJRXhwci5maW5kLlRBRyA9IGZ1bmN0aW9uKCBtYXRjaCwgY29udGV4dCApIHsKCQkJdmFyIHJlc3VsdHMgPSBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lKCBtYXRjaFsxXSApOwoKCQkJLy8gRmlsdGVyIG91dCBwb3NzaWJsZSBjb21tZW50cwoJCQlpZiAoIG1hdGNoWzFdID09PSAiKiIgKSB7CgkJCQl2YXIgdG1wID0gW107CgoJCQkJZm9yICggdmFyIGkgPSAwOyByZXN1bHRzW2ldOyBpKysgKSB7CgkJCQkJaWYgKCByZXN1bHRzW2ldLm5vZGVUeXBlID09PSAxICkgewoJCQkJCQl0bXAucHVzaCggcmVzdWx0c1tpXSApOwoJCQkJCX0KCQkJCX0KCgkJCQlyZXN1bHRzID0gdG1wOwoJCQl9CgoJCQlyZXR1cm4gcmVzdWx0czsKCQl9OwoJfQoKCS8vIENoZWNrIHRvIHNlZSBpZiBhbiBhdHRyaWJ1dGUgcmV0dXJucyBub3JtYWxpemVkIGhyZWYgYXR0cmlidXRlcwoJZGl2LmlubmVySFRNTCA9ICI8YSBocmVmPScjJz48L2E+IjsKCglpZiAoIGRpdi5maXJzdENoaWxkICYmIHR5cGVvZiBkaXYuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUgIT09ICJ1bmRlZmluZWQiICYmCgkJCWRpdi5maXJzdENoaWxkLmdldEF0dHJpYnV0ZSgiaHJlZiIpICE9PSAiIyIgKSB7CgoJCUV4cHIuYXR0ckhhbmRsZS5ocmVmID0gZnVuY3Rpb24oIGVsZW0gKSB7CgkJCXJldHVybiBlbGVtLmdldEF0dHJpYnV0ZSggImhyZWYiLCAyICk7CgkJfTsKCX0KCgkvLyByZWxlYXNlIG1lbW9yeSBpbiBJRQoJZGl2ID0gbnVsbDsKfSkoKTsKCmlmICggZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCApIHsKCShmdW5jdGlvbigpewoJCXZhciBvbGRTaXp6bGUgPSBTaXp6bGUsCgkJCWRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLAoJCQlpZCA9ICJfX3NpenpsZV9fIjsKCgkJZGl2LmlubmVySFRNTCA9ICI8cCBjbGFzcz0nVEVTVCc+PC9wPiI7CgoJCS8vIFNhZmFyaSBjYW4ndCBoYW5kbGUgdXBwZXJjYXNlIG9yIHVuaWNvZGUgY2hhcmFjdGVycyB3aGVuCgkJLy8gaW4gcXVpcmtzIG1vZGUuCgkJaWYgKCBkaXYucXVlcnlTZWxlY3RvckFsbCAmJiBkaXYucXVlcnlTZWxlY3RvckFsbCgiLlRFU1QiKS5sZW5ndGggPT09IDAgKSB7CgkJCXJldHVybjsKCQl9CgkKCQlTaXp6bGUgPSBmdW5jdGlvbiggcXVlcnksIGNvbnRleHQsIGV4dHJhLCBzZWVkICkgewoJCQljb250ZXh0ID0gY29udGV4dCB8fCBkb2N1bWVudDsKCgkJCS8vIE9ubHkgdXNlIHF1ZXJ5U2VsZWN0b3JBbGwgb24gbm9uLVhNTCBkb2N1bWVudHMKCQkJLy8gKElEIHNlbGVjdG9ycyBkb24ndCB3b3JrIGluIG5vbi1IVE1MIGRvY3VtZW50cykKCQkJaWYgKCAhc2VlZCAmJiAhU2l6emxlLmlzWE1MKGNvbnRleHQpICkgewoJCQkJLy8gU2VlIGlmIHdlIGZpbmQgYSBzZWxlY3RvciB0byBzcGVlZCB1cAoJCQkJdmFyIG1hdGNoID0gL14oXHcrJCl8XlwuKFtcd1wtXSskKXxeIyhbXHdcLV0rJCkvLmV4ZWMoIHF1ZXJ5ICk7CgkJCQkKCQkJCWlmICggbWF0Y2ggJiYgKGNvbnRleHQubm9kZVR5cGUgPT09IDEgfHwgY29udGV4dC5ub2RlVHlwZSA9PT0gOSkgKSB7CgkJCQkJLy8gU3BlZWQtdXA6IFNpenpsZSgiVEFHIikKCQkJCQlpZiAoIG1hdGNoWzFdICkgewoJCQkJCQlyZXR1cm4gbWFrZUFycmF5KCBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lKCBxdWVyeSApLCBleHRyYSApOwoJCQkJCQoJCQkJCS8vIFNwZWVkLXVwOiBTaXp6bGUoIi5DTEFTUyIpCgkJCQkJfSBlbHNlIGlmICggbWF0Y2hbMl0gJiYgRXhwci5maW5kLkNMQVNTICYmIGNvbnRleHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSApIHsKCQkJCQkJcmV0dXJuIG1ha2VBcnJheSggY29udGV4dC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCBtYXRjaFsyXSApLCBleHRyYSApOwoJCQkJCX0KCQkJCX0KCQkJCQoJCQkJaWYgKCBjb250ZXh0Lm5vZGVUeXBlID09PSA5ICkgewoJCQkJCS8vIFNwZWVkLXVwOiBTaXp6bGUoImJvZHkiKQoJCQkJCS8vIFRoZSBib2R5IGVsZW1lbnQgb25seSBleGlzdHMgb25jZSwgb3B0aW1pemUgZmluZGluZyBpdAoJCQkJCWlmICggcXVlcnkgPT09ICJib2R5IiAmJiBjb250ZXh0LmJvZHkgKSB7CgkJCQkJCXJldHVybiBtYWtlQXJyYXkoIFsgY29udGV4dC5ib2R5IF0sIGV4dHJhICk7CgkJCQkJCQoJCQkJCS8vIFNwZWVkLXVwOiBTaXp6bGUoIiNJRCIpCgkJCQkJfSBlbHNlIGlmICggbWF0Y2ggJiYgbWF0Y2hbM10gKSB7CgkJCQkJCXZhciBlbGVtID0gY29udGV4dC5nZXRFbGVtZW50QnlJZCggbWF0Y2hbM10gKTsKCgkJCQkJCS8vIENoZWNrIHBhcmVudE5vZGUgdG8gY2F0Y2ggd2hlbiBCbGFja2JlcnJ5IDQuNiByZXR1cm5zCgkJCQkJCS8vIG5vZGVzIHRoYXQgYXJlIG5vIGxvbmdlciBpbiB0aGUgZG9jdW1lbnQgIzY5NjMKCQkJCQkJaWYgKCBlbGVtICYmIGVsZW0ucGFyZW50Tm9kZSApIHsKCQkJCQkJCS8vIEhhbmRsZSB0aGUgY2FzZSB3aGVyZSBJRSBhbmQgT3BlcmEgcmV0dXJuIGl0ZW1zCgkJCQkJCQkvLyBieSBuYW1lIGluc3RlYWQgb2YgSUQKCQkJCQkJCWlmICggZWxlbS5pZCA9PT0gbWF0Y2hbM10gKSB7CgkJCQkJCQkJcmV0dXJuIG1ha2VBcnJheSggWyBlbGVtIF0sIGV4dHJhICk7CgkJCQkJCQl9CgkJCQkJCQkKCQkJCQkJfSBlbHNlIHsKCQkJCQkJCXJldHVybiBtYWtlQXJyYXkoIFtdLCBleHRyYSApOwoJCQkJCQl9CgkJCQkJfQoJCQkJCQoJCQkJCXRyeSB7CgkJCQkJCXJldHVybiBtYWtlQXJyYXkoIGNvbnRleHQucXVlcnlTZWxlY3RvckFsbChxdWVyeSksIGV4dHJhICk7CgkJCQkJfSBjYXRjaChxc2FFcnJvcikge30KCgkJCQkvLyBxU0Egd29ya3Mgc3RyYW5nZWx5IG9uIEVsZW1lbnQtcm9vdGVkIHF1ZXJpZXMKCQkJCS8vIFdlIGNhbiB3b3JrIGFyb3VuZCB0aGlzIGJ5IHNwZWNpZnlpbmcgYW4gZXh0cmEgSUQgb24gdGhlIHJvb3QKCQkJCS8vIGFuZCB3b3JraW5nIHVwIGZyb20gdGhlcmUgKFRoYW5rcyB0byBBbmRyZXcgRHVwb250IGZvciB0aGUgdGVjaG5pcXVlKQoJCQkJLy8gSUUgOCBkb2Vzbid0IHdvcmsgb24gb2JqZWN0IGVsZW1lbnRzCgkJCQl9IGVsc2UgaWYgKCBjb250ZXh0Lm5vZGVUeXBlID09PSAxICYmIGNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSAhPT0gIm9iamVjdCIgKSB7CgkJCQkJdmFyIG9sZENvbnRleHQgPSBjb250ZXh0LAoJCQkJCQlvbGQgPSBjb250ZXh0LmdldEF0dHJpYnV0ZSggImlkIiApLAoJCQkJCQluaWQgPSBvbGQgfHwgaWQsCgkJCQkJCWhhc1BhcmVudCA9IGNvbnRleHQucGFyZW50Tm9kZSwKCQkJCQkJcmVsYXRpdmVIaWVyYXJjaHlTZWxlY3RvciA9IC9eXHMqWyt+XS8udGVzdCggcXVlcnkgKTsKCgkJCQkJaWYgKCAhb2xkICkgewoJCQkJCQljb250ZXh0LnNldEF0dHJpYnV0ZSggImlkIiwgbmlkICk7CgkJCQkJfSBlbHNlIHsKCQkJCQkJbmlkID0gbmlkLnJlcGxhY2UoIC8nL2csICJcXCQmIiApOwoJCQkJCX0KCQkJCQlpZiAoIHJlbGF0aXZlSGllcmFyY2h5U2VsZWN0b3IgJiYgaGFzUGFyZW50ICkgewoJCQkJCQljb250ZXh0ID0gY29udGV4dC5wYXJlbnROb2RlOwoJCQkJCX0KCgkJCQkJdHJ5IHsKCQkJCQkJaWYgKCAhcmVsYXRpdmVIaWVyYXJjaHlTZWxlY3RvciB8fCBoYXNQYXJlbnQgKSB7CgkJCQkJCQlyZXR1cm4gbWFrZUFycmF5KCBjb250ZXh0LnF1ZXJ5U2VsZWN0b3JBbGwoICJbaWQ9JyIgKyBuaWQgKyAiJ10gIiArIHF1ZXJ5ICksIGV4dHJhICk7CgkJCQkJCX0KCgkJCQkJfSBjYXRjaChwc2V1ZG9FcnJvcikgewoJCQkJCX0gZmluYWxseSB7CgkJCQkJCWlmICggIW9sZCApIHsKCQkJCQkJCW9sZENvbnRleHQucmVtb3ZlQXR0cmlidXRlKCAiaWQiICk7CgkJCQkJCX0KCQkJCQl9CgkJCQl9CgkJCX0KCQkKCQkJcmV0dXJuIG9sZFNpenpsZShxdWVyeSwgY29udGV4dCwgZXh0cmEsIHNlZWQpOwoJCX07CgoJCWZvciAoIHZhciBwcm9wIGluIG9sZFNpenpsZSApIHsKCQkJU2l6emxlWyBwcm9wIF0gPSBvbGRTaXp6bGVbIHByb3AgXTsKCQl9CgoJCS8vIHJlbGVhc2UgbWVtb3J5IGluIElFCgkJZGl2ID0gbnVsbDsKCX0pKCk7Cn0KCihmdW5jdGlvbigpewoJdmFyIGh0bWwgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsCgkJbWF0Y2hlcyA9IGh0bWwubWF0Y2hlc1NlbGVjdG9yIHx8IGh0bWwubW96TWF0Y2hlc1NlbGVjdG9yIHx8IGh0bWwud2Via2l0TWF0Y2hlc1NlbGVjdG9yIHx8IGh0bWwubXNNYXRjaGVzU2VsZWN0b3I7CgoJaWYgKCBtYXRjaGVzICkgewoJCS8vIENoZWNrIHRvIHNlZSBpZiBpdCdzIHBvc3NpYmxlIHRvIGRvIG1hdGNoZXNTZWxlY3RvcgoJCS8vIG9uIGEgZGlzY29ubmVjdGVkIG5vZGUgKElFIDkgZmFpbHMgdGhpcykKCQl2YXIgZGlzY29ubmVjdGVkTWF0Y2ggPSAhbWF0Y2hlcy5jYWxsKCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAiZGl2IiApLCAiZGl2IiApLAoJCQlwc2V1ZG9Xb3JrcyA9IGZhbHNlOwoKCQl0cnkgewoJCQkvLyBUaGlzIHNob3VsZCBmYWlsIHdpdGggYW4gZXhjZXB0aW9uCgkJCS8vIEdlY2tvIGRvZXMgbm90IGVycm9yLCByZXR1cm5zIGZhbHNlIGluc3RlYWQKCQkJbWF0Y2hlcy5jYWxsKCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsICJbdGVzdCE9JyddOnNpenpsZSIgKTsKCQoJCX0gY2F0Y2goIHBzZXVkb0Vycm9yICkgewoJCQlwc2V1ZG9Xb3JrcyA9IHRydWU7CgkJfQoKCQlTaXp6bGUubWF0Y2hlc1NlbGVjdG9yID0gZnVuY3Rpb24oIG5vZGUsIGV4cHIgKSB7CgkJCS8vIE1ha2Ugc3VyZSB0aGF0IGF0dHJpYnV0ZSBzZWxlY3RvcnMgYXJlIHF1b3RlZAoJCQlleHByID0gZXhwci5yZXBsYWNlKC9cPVxzKihbXiciXF1dKilccypcXS9nLCAiPSckMSddIik7CgoJCQlpZiAoICFTaXp6bGUuaXNYTUwoIG5vZGUgKSApIHsKCQkJCXRyeSB7IAoJCQkJCWlmICggcHNldWRvV29ya3MgfHwgIUV4cHIubWF0Y2guUFNFVURPLnRlc3QoIGV4cHIgKSAmJiAhLyE9Ly50ZXN0KCBleHByICkgKSB7CgkJCQkJCXZhciByZXQgPSBtYXRjaGVzLmNhbGwoIG5vZGUsIGV4cHIgKTsKCgkJCQkJCS8vIElFIDkncyBtYXRjaGVzU2VsZWN0b3IgcmV0dXJucyBmYWxzZSBvbiBkaXNjb25uZWN0ZWQgbm9kZXMKCQkJCQkJaWYgKCByZXQgfHwgIWRpc2Nvbm5lY3RlZE1hdGNoIHx8CgkJCQkJCQkJLy8gQXMgd2VsbCwgZGlzY29ubmVjdGVkIG5vZGVzIGFyZSBzYWlkIHRvIGJlIGluIGEgZG9jdW1lbnQKCQkJCQkJCQkvLyBmcmFnbWVudCBpbiBJRSA5LCBzbyBjaGVjayBmb3IgdGhhdAoJCQkJCQkJCW5vZGUuZG9jdW1lbnQgJiYgbm9kZS5kb2N1bWVudC5ub2RlVHlwZSAhPT0gMTEgKSB7CgkJCQkJCQlyZXR1cm4gcmV0OwoJCQkJCQl9CgkJCQkJfQoJCQkJfSBjYXRjaChlKSB7fQoJCQl9CgoJCQlyZXR1cm4gU2l6emxlKGV4cHIsIG51bGwsIG51bGwsIFtub2RlXSkubGVuZ3RoID4gMDsKCQl9OwoJfQp9KSgpOwoKKGZ1bmN0aW9uKCl7Cgl2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CgoJZGl2LmlubmVySFRNTCA9ICI8ZGl2IGNsYXNzPSd0ZXN0IGUnPjwvZGl2PjxkaXYgY2xhc3M9J3Rlc3QnPjwvZGl2PiI7CgoJLy8gT3BlcmEgY2FuJ3QgZmluZCBhIHNlY29uZCBjbGFzc25hbWUgKGluIDkuNikKCS8vIEFsc28sIG1ha2Ugc3VyZSB0aGF0IGdldEVsZW1lbnRzQnlDbGFzc05hbWUgYWN0dWFsbHkgZXhpc3RzCglpZiAoICFkaXYuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSB8fCBkaXYuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiZSIpLmxlbmd0aCA9PT0gMCApIHsKCQlyZXR1cm47Cgl9CgoJLy8gU2FmYXJpIGNhY2hlcyBjbGFzcyBhdHRyaWJ1dGVzLCBkb2Vzbid0IGNhdGNoIGNoYW5nZXMgKGluIDMuMikKCWRpdi5sYXN0Q2hpbGQuY2xhc3NOYW1lID0gImUiOwoKCWlmICggZGl2LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImUiKS5sZW5ndGggPT09IDEgKSB7CgkJcmV0dXJuOwoJfQoJCglFeHByLm9yZGVyLnNwbGljZSgxLCAwLCAiQ0xBU1MiKTsKCUV4cHIuZmluZC5DTEFTUyA9IGZ1bmN0aW9uKCBtYXRjaCwgY29udGV4dCwgaXNYTUwgKSB7CgkJaWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lICE9PSAidW5kZWZpbmVkIiAmJiAhaXNYTUwgKSB7CgkJCXJldHVybiBjb250ZXh0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUobWF0Y2hbMV0pOwoJCX0KCX07CgoJLy8gcmVsZWFzZSBtZW1vcnkgaW4gSUUKCWRpdiA9IG51bGw7Cn0pKCk7CgpmdW5jdGlvbiBkaXJOb2RlQ2hlY2soIGRpciwgY3VyLCBkb25lTmFtZSwgY2hlY2tTZXQsIG5vZGVDaGVjaywgaXNYTUwgKSB7Cglmb3IgKCB2YXIgaSA9IDAsIGwgPSBjaGVja1NldC5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CgkJdmFyIGVsZW0gPSBjaGVja1NldFtpXTsKCgkJaWYgKCBlbGVtICkgewoJCQl2YXIgbWF0Y2ggPSBmYWxzZTsKCgkJCWVsZW0gPSBlbGVtW2Rpcl07CgoJCQl3aGlsZSAoIGVsZW0gKSB7CgkJCQlpZiAoIGVsZW0uc2l6Y2FjaGUgPT09IGRvbmVOYW1lICkgewoJCQkJCW1hdGNoID0gY2hlY2tTZXRbZWxlbS5zaXpzZXRdOwoJCQkJCWJyZWFrOwoJCQkJfQoKCQkJCWlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSAmJiAhaXNYTUwgKXsKCQkJCQllbGVtLnNpemNhY2hlID0gZG9uZU5hbWU7CgkJCQkJZWxlbS5zaXpzZXQgPSBpOwoJCQkJfQoKCQkJCWlmICggZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBjdXIgKSB7CgkJCQkJbWF0Y2ggPSBlbGVtOwoJCQkJCWJyZWFrOwoJCQkJfQoKCQkJCWVsZW0gPSBlbGVtW2Rpcl07CgkJCX0KCgkJCWNoZWNrU2V0W2ldID0gbWF0Y2g7CgkJfQoJfQp9CgpmdW5jdGlvbiBkaXJDaGVjayggZGlyLCBjdXIsIGRvbmVOYW1lLCBjaGVja1NldCwgbm9kZUNoZWNrLCBpc1hNTCApIHsKCWZvciAoIHZhciBpID0gMCwgbCA9IGNoZWNrU2V0Lmxlbmd0aDsgaSA8IGw7IGkrKyApIHsKCQl2YXIgZWxlbSA9IGNoZWNrU2V0W2ldOwoKCQlpZiAoIGVsZW0gKSB7CgkJCXZhciBtYXRjaCA9IGZhbHNlOwoJCQkKCQkJZWxlbSA9IGVsZW1bZGlyXTsKCgkJCXdoaWxlICggZWxlbSApIHsKCQkJCWlmICggZWxlbS5zaXpjYWNoZSA9PT0gZG9uZU5hbWUgKSB7CgkJCQkJbWF0Y2ggPSBjaGVja1NldFtlbGVtLnNpenNldF07CgkJCQkJYnJlYWs7CgkJCQl9CgoJCQkJaWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICkgewoJCQkJCWlmICggIWlzWE1MICkgewoJCQkJCQllbGVtLnNpemNhY2hlID0gZG9uZU5hbWU7CgkJCQkJCWVsZW0uc2l6c2V0ID0gaTsKCQkJCQl9CgoJCQkJCWlmICggdHlwZW9mIGN1ciAhPT0gInN0cmluZyIgKSB7CgkJCQkJCWlmICggZWxlbSA9PT0gY3VyICkgewoJCQkJCQkJbWF0Y2ggPSB0cnVlOwoJCQkJCQkJYnJlYWs7CgkJCQkJCX0KCgkJCQkJfSBlbHNlIGlmICggU2l6emxlLmZpbHRlciggY3VyLCBbZWxlbV0gKS5sZW5ndGggPiAwICkgewoJCQkJCQltYXRjaCA9IGVsZW07CgkJCQkJCWJyZWFrOwoJCQkJCX0KCQkJCX0KCgkJCQllbGVtID0gZWxlbVtkaXJdOwoJCQl9CgoJCQljaGVja1NldFtpXSA9IG1hdGNoOwoJCX0KCX0KfQoKaWYgKCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY29udGFpbnMgKSB7CglTaXp6bGUuY29udGFpbnMgPSBmdW5jdGlvbiggYSwgYiApIHsKCQlyZXR1cm4gYSAhPT0gYiAmJiAoYS5jb250YWlucyA/IGEuY29udGFpbnMoYikgOiB0cnVlKTsKCX07Cgp9IGVsc2UgaWYgKCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY29tcGFyZURvY3VtZW50UG9zaXRpb24gKSB7CglTaXp6bGUuY29udGFpbnMgPSBmdW5jdGlvbiggYSwgYiApIHsKCQlyZXR1cm4gISEoYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihiKSAmIDE2KTsKCX07Cgp9IGVsc2UgewoJU2l6emxlLmNvbnRhaW5zID0gZnVuY3Rpb24oKSB7CgkJcmV0dXJuIGZhbHNlOwoJfTsKfQoKU2l6emxlLmlzWE1MID0gZnVuY3Rpb24oIGVsZW0gKSB7CgkvLyBkb2N1bWVudEVsZW1lbnQgaXMgdmVyaWZpZWQgZm9yIGNhc2VzIHdoZXJlIGl0IGRvZXNuJ3QgeWV0IGV4aXN0CgkvLyAoc3VjaCBhcyBsb2FkaW5nIGlmcmFtZXMgaW4gSUUgLSAjNDgzMykgCgl2YXIgZG9jdW1lbnRFbGVtZW50ID0gKGVsZW0gPyBlbGVtLm93bmVyRG9jdW1lbnQgfHwgZWxlbSA6IDApLmRvY3VtZW50RWxlbWVudDsKCglyZXR1cm4gZG9jdW1lbnRFbGVtZW50ID8gZG9jdW1lbnRFbGVtZW50Lm5vZGVOYW1lICE9PSAiSFRNTCIgOiBmYWxzZTsKfTsKCnZhciBwb3NQcm9jZXNzID0gZnVuY3Rpb24oIHNlbGVjdG9yLCBjb250ZXh0ICkgewoJdmFyIG1hdGNoLAoJCXRtcFNldCA9IFtdLAoJCWxhdGVyID0gIiIsCgkJcm9vdCA9IGNvbnRleHQubm9kZVR5cGUgPyBbY29udGV4dF0gOiBjb250ZXh0OwoKCS8vIFBvc2l0aW9uIHNlbGVjdG9ycyBtdXN0IGJlIGRvbmUgYWZ0ZXIgdGhlIGZpbHRlcgoJLy8gQW5kIHNvIG11c3QgOm5vdChwb3NpdGlvbmFsKSBzbyB3ZSBtb3ZlIGFsbCBQU0VVRE9zIHRvIHRoZSBlbmQKCXdoaWxlICggKG1hdGNoID0gRXhwci5tYXRjaC5QU0VVRE8uZXhlYyggc2VsZWN0b3IgKSkgKSB7CgkJbGF0ZXIgKz0gbWF0Y2hbMF07CgkJc2VsZWN0b3IgPSBzZWxlY3Rvci5yZXBsYWNlKCBFeHByLm1hdGNoLlBTRVVETywgIiIgKTsKCX0KCglzZWxlY3RvciA9IEV4cHIucmVsYXRpdmVbc2VsZWN0b3JdID8gc2VsZWN0b3IgKyAiKiIgOiBzZWxlY3RvcjsKCglmb3IgKCB2YXIgaSA9IDAsIGwgPSByb290Lmxlbmd0aDsgaSA8IGw7IGkrKyApIHsKCQlTaXp6bGUoIHNlbGVjdG9yLCByb290W2ldLCB0bXBTZXQgKTsKCX0KCglyZXR1cm4gU2l6emxlLmZpbHRlciggbGF0ZXIsIHRtcFNldCApOwp9OwoKLy8gRVhQT1NFCmpRdWVyeS5maW5kID0gU2l6emxlOwpqUXVlcnkuZXhwciA9IFNpenpsZS5zZWxlY3RvcnM7CmpRdWVyeS5leHByWyI6Il0gPSBqUXVlcnkuZXhwci5maWx0ZXJzOwpqUXVlcnkudW5pcXVlID0gU2l6emxlLnVuaXF1ZVNvcnQ7CmpRdWVyeS50ZXh0ID0gU2l6emxlLmdldFRleHQ7CmpRdWVyeS5pc1hNTERvYyA9IFNpenpsZS5pc1hNTDsKalF1ZXJ5LmNvbnRhaW5zID0gU2l6emxlLmNvbnRhaW5zOwoKCn0pKCk7CgoKdmFyIHJ1bnRpbCA9IC9VbnRpbCQvLAoJcnBhcmVudHNwcmV2ID0gL14oPzpwYXJlbnRzfHByZXZVbnRpbHxwcmV2QWxsKS8sCgkvLyBOb3RlOiBUaGlzIFJlZ0V4cCBzaG91bGQgYmUgaW1wcm92ZWQsIG9yIGxpa2VseSBwdWxsZWQgZnJvbSBTaXp6bGUKCXJtdWx0aXNlbGVjdG9yID0gLywvLAoJaXNTaW1wbGUgPSAvXi5bXjojXFtcLixdKiQvLAoJc2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UsCglQT1MgPSBqUXVlcnkuZXhwci5tYXRjaC5QT1MsCgkvLyBtZXRob2RzIGd1YXJhbnRlZWQgdG8gcHJvZHVjZSBhIHVuaXF1ZSBzZXQgd2hlbiBzdGFydGluZyBmcm9tIGEgdW5pcXVlIHNldAoJZ3VhcmFudGVlZFVuaXF1ZSA9IHsKCQljaGlsZHJlbjogdHJ1ZSwKCQljb250ZW50czogdHJ1ZSwKCQluZXh0OiB0cnVlLAoJCXByZXY6IHRydWUKCX07CgpqUXVlcnkuZm4uZXh0ZW5kKHsKCWZpbmQ6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHsKCQl2YXIgc2VsZiA9IHRoaXMsCgkJCWksIGw7CgoJCWlmICggdHlwZW9mIHNlbGVjdG9yICE9PSAic3RyaW5nIiApIHsKCQkJcmV0dXJuIGpRdWVyeSggc2VsZWN0b3IgKS5maWx0ZXIoZnVuY3Rpb24oKSB7CgkJCQlmb3IgKCBpID0gMCwgbCA9IHNlbGYubGVuZ3RoOyBpIDwgbDsgaSsrICkgewoJCQkJCWlmICggalF1ZXJ5LmNvbnRhaW5zKCBzZWxmWyBpIF0sIHRoaXMgKSApIHsKCQkJCQkJcmV0dXJuIHRydWU7CgkJCQkJfQoJCQkJfQoJCQl9KTsKCQl9CgoJCXZhciByZXQgPSB0aGlzLnB1c2hTdGFjayggIiIsICJmaW5kIiwgc2VsZWN0b3IgKSwKCQkJbGVuZ3RoLCBuLCByOwoKCQlmb3IgKCBpID0gMCwgbCA9IHRoaXMubGVuZ3RoOyBpIDwgbDsgaSsrICkgewoJCQlsZW5ndGggPSByZXQubGVuZ3RoOwoJCQlqUXVlcnkuZmluZCggc2VsZWN0b3IsIHRoaXNbaV0sIHJldCApOwoKCQkJaWYgKCBpID4gMCApIHsKCQkJCS8vIE1ha2Ugc3VyZSB0aGF0IHRoZSByZXN1bHRzIGFyZSB1bmlxdWUKCQkJCWZvciAoIG4gPSBsZW5ndGg7IG4gPCByZXQubGVuZ3RoOyBuKysgKSB7CgkJCQkJZm9yICggciA9IDA7IHIgPCBsZW5ndGg7IHIrKyApIHsKCQkJCQkJaWYgKCByZXRbcl0gPT09IHJldFtuXSApIHsKCQkJCQkJCXJldC5zcGxpY2Uobi0tLCAxKTsKCQkJCQkJCWJyZWFrOwoJCQkJCQl9CgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoKCQlyZXR1cm4gcmV0OwoJfSwKCgloYXM6IGZ1bmN0aW9uKCB0YXJnZXQgKSB7CgkJdmFyIHRhcmdldHMgPSBqUXVlcnkoIHRhcmdldCApOwoJCXJldHVybiB0aGlzLmZpbHRlcihmdW5jdGlvbigpIHsKCQkJZm9yICggdmFyIGkgPSAwLCBsID0gdGFyZ2V0cy5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CgkJCQlpZiAoIGpRdWVyeS5jb250YWlucyggdGhpcywgdGFyZ2V0c1tpXSApICkgewoJCQkJCXJldHVybiB0cnVlOwoJCQkJfQoJCQl9CgkJfSk7Cgl9LAoKCW5vdDogZnVuY3Rpb24oIHNlbGVjdG9yICkgewoJCXJldHVybiB0aGlzLnB1c2hTdGFjayggd2lubm93KHRoaXMsIHNlbGVjdG9yLCBmYWxzZSksICJub3QiLCBzZWxlY3Rvcik7Cgl9LAoKCWZpbHRlcjogZnVuY3Rpb24oIHNlbGVjdG9yICkgewoJCXJldHVybiB0aGlzLnB1c2hTdGFjayggd2lubm93KHRoaXMsIHNlbGVjdG9yLCB0cnVlKSwgImZpbHRlciIsIHNlbGVjdG9yICk7Cgl9LAoKCWlzOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7CgkJcmV0dXJuICEhc2VsZWN0b3IgJiYgKCB0eXBlb2Ygc2VsZWN0b3IgPT09ICJzdHJpbmciID8KCQkJalF1ZXJ5LmZpbHRlciggc2VsZWN0b3IsIHRoaXMgKS5sZW5ndGggPiAwIDoKCQkJdGhpcy5maWx0ZXIoIHNlbGVjdG9yICkubGVuZ3RoID4gMCApOwoJfSwKCgljbG9zZXN0OiBmdW5jdGlvbiggc2VsZWN0b3JzLCBjb250ZXh0ICkgewoJCXZhciByZXQgPSBbXSwgaSwgbCwgY3VyID0gdGhpc1swXTsKCQkKCQkvLyBBcnJheQoJCWlmICggalF1ZXJ5LmlzQXJyYXkoIHNlbGVjdG9ycyApICkgewoJCQl2YXIgbWF0Y2gsIHNlbGVjdG9yLAoJCQkJbWF0Y2hlcyA9IHt9LAoJCQkJbGV2ZWwgPSAxOwoKCQkJaWYgKCBjdXIgJiYgc2VsZWN0b3JzLmxlbmd0aCApIHsKCQkJCWZvciAoIGkgPSAwLCBsID0gc2VsZWN0b3JzLmxlbmd0aDsgaSA8IGw7IGkrKyApIHsKCQkJCQlzZWxlY3RvciA9IHNlbGVjdG9yc1tpXTsKCgkJCQkJaWYgKCAhbWF0Y2hlc1sgc2VsZWN0b3IgXSApIHsKCQkJCQkJbWF0Y2hlc1sgc2VsZWN0b3IgXSA9IFBPUy50ZXN0KCBzZWxlY3RvciApID8KCQkJCQkJCWpRdWVyeSggc2VsZWN0b3IsIGNvbnRleHQgfHwgdGhpcy5jb250ZXh0ICkgOgoJCQkJCQkJc2VsZWN0b3I7CgkJCQkJfQoJCQkJfQoKCQkJCXdoaWxlICggY3VyICYmIGN1ci5vd25lckRvY3VtZW50ICYmIGN1ciAhPT0gY29udGV4dCApIHsKCQkJCQlmb3IgKCBzZWxlY3RvciBpbiBtYXRjaGVzICkgewoJCQkJCQltYXRjaCA9IG1hdGNoZXNbIHNlbGVjdG9yIF07CgoJCQkJCQlpZiAoIG1hdGNoLmpxdWVyeSA/IG1hdGNoLmluZGV4KCBjdXIgKSA+IC0xIDogalF1ZXJ5KCBjdXIgKS5pcyggbWF0Y2ggKSApIHsKCQkJCQkJCXJldC5wdXNoKHsgc2VsZWN0b3I6IHNlbGVjdG9yLCBlbGVtOiBjdXIsIGxldmVsOiBsZXZlbCB9KTsKCQkJCQkJfQoJCQkJCX0KCgkJCQkJY3VyID0gY3VyLnBhcmVudE5vZGU7CgkJCQkJbGV2ZWwrKzsKCQkJCX0KCQkJfQoKCQkJcmV0dXJuIHJldDsKCQl9CgoJCS8vIFN0cmluZwoJCXZhciBwb3MgPSBQT1MudGVzdCggc2VsZWN0b3JzICkgfHwgdHlwZW9mIHNlbGVjdG9ycyAhPT0gInN0cmluZyIgPwoJCQkJalF1ZXJ5KCBzZWxlY3RvcnMsIGNvbnRleHQgfHwgdGhpcy5jb250ZXh0ICkgOgoJCQkJMDsKCgkJZm9yICggaSA9IDAsIGwgPSB0aGlzLmxlbmd0aDsgaSA8IGw7IGkrKyApIHsKCQkJY3VyID0gdGhpc1tpXTsKCgkJCXdoaWxlICggY3VyICkgewoJCQkJaWYgKCBwb3MgPyBwb3MuaW5kZXgoY3VyKSA+IC0xIDogalF1ZXJ5LmZpbmQubWF0Y2hlc1NlbGVjdG9yKGN1ciwgc2VsZWN0b3JzKSApIHsKCQkJCQlyZXQucHVzaCggY3VyICk7CgkJCQkJYnJlYWs7CgoJCQkJfSBlbHNlIHsKCQkJCQljdXIgPSBjdXIucGFyZW50Tm9kZTsKCQkJCQlpZiAoICFjdXIgfHwgIWN1ci5vd25lckRvY3VtZW50IHx8IGN1ciA9PT0gY29udGV4dCB8fCBjdXIubm9kZVR5cGUgPT09IDExICkgewoJCQkJCQlicmVhazsKCQkJCQl9CgkJCQl9CgkJCX0KCQl9CgoJCXJldCA9IHJldC5sZW5ndGggPiAxID8galF1ZXJ5LnVuaXF1ZSggcmV0ICkgOiByZXQ7CgoJCXJldHVybiB0aGlzLnB1c2hTdGFjayggcmV0LCAiY2xvc2VzdCIsIHNlbGVjdG9ycyApOwoJfSwKCgkvLyBEZXRlcm1pbmUgdGhlIHBvc2l0aW9uIG9mIGFuIGVsZW1lbnQgd2l0aGluCgkvLyB0aGUgbWF0Y2hlZCBzZXQgb2YgZWxlbWVudHMKCWluZGV4OiBmdW5jdGlvbiggZWxlbSApIHsKCgkJLy8gTm8gYXJndW1lbnQsIHJldHVybiBpbmRleCBpbiBwYXJlbnQKCQlpZiAoICFlbGVtICkgewoJCQlyZXR1cm4gKCB0aGlzWzBdICYmIHRoaXNbMF0ucGFyZW50Tm9kZSApID8gdGhpcy5wcmV2QWxsKCkubGVuZ3RoIDogLTE7CgkJfQoKCQkvLyBpbmRleCBpbiBzZWxlY3RvcgoJCWlmICggdHlwZW9mIGVsZW0gPT09ICJzdHJpbmciICkgewoJCQlyZXR1cm4galF1ZXJ5LmluQXJyYXkoIHRoaXNbMF0sIGpRdWVyeSggZWxlbSApICk7CgkJfQoKCQkvLyBMb2NhdGUgdGhlIHBvc2l0aW9uIG9mIHRoZSBkZXNpcmVkIGVsZW1lbnQKCQlyZXR1cm4galF1ZXJ5LmluQXJyYXkoCgkJCS8vIElmIGl0IHJlY2VpdmVzIGEgalF1ZXJ5IG9iamVjdCwgdGhlIGZpcnN0IGVsZW1lbnQgaXMgdXNlZAoJCQllbGVtLmpxdWVyeSA/IGVsZW1bMF0gOiBlbGVtLCB0aGlzICk7Cgl9LAoKCWFkZDogZnVuY3Rpb24oIHNlbGVjdG9yLCBjb250ZXh0ICkgewoJCXZhciBzZXQgPSB0eXBlb2Ygc2VsZWN0b3IgPT09ICJzdHJpbmciID8KCQkJCWpRdWVyeSggc2VsZWN0b3IsIGNvbnRleHQgKSA6CgkJCQlqUXVlcnkubWFrZUFycmF5KCBzZWxlY3RvciAmJiBzZWxlY3Rvci5ub2RlVHlwZSA/IFsgc2VsZWN0b3IgXSA6IHNlbGVjdG9yICksCgkJCWFsbCA9IGpRdWVyeS5tZXJnZSggdGhpcy5nZXQoKSwgc2V0ICk7CgoJCXJldHVybiB0aGlzLnB1c2hTdGFjayggaXNEaXNjb25uZWN0ZWQoIHNldFswXSApIHx8IGlzRGlzY29ubmVjdGVkKCBhbGxbMF0gKSA/CgkJCWFsbCA6CgkJCWpRdWVyeS51bmlxdWUoIGFsbCApICk7Cgl9LAoKCWFuZFNlbGY6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLmFkZCggdGhpcy5wcmV2T2JqZWN0ICk7Cgl9Cn0pOwoKLy8gQSBwYWluZnVsbHkgc2ltcGxlIGNoZWNrIHRvIHNlZSBpZiBhbiBlbGVtZW50IGlzIGRpc2Nvbm5lY3RlZAovLyBmcm9tIGEgZG9jdW1lbnQgKHNob3VsZCBiZSBpbXByb3ZlZCwgd2hlcmUgZmVhc2libGUpLgpmdW5jdGlvbiBpc0Rpc2Nvbm5lY3RlZCggbm9kZSApIHsKCXJldHVybiAhbm9kZSB8fCAhbm9kZS5wYXJlbnROb2RlIHx8IG5vZGUucGFyZW50Tm9kZS5ub2RlVHlwZSA9PT0gMTE7Cn0KCmpRdWVyeS5lYWNoKHsKCXBhcmVudDogZnVuY3Rpb24oIGVsZW0gKSB7CgkJdmFyIHBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZTsKCQlyZXR1cm4gcGFyZW50ICYmIHBhcmVudC5ub2RlVHlwZSAhPT0gMTEgPyBwYXJlbnQgOiBudWxsOwoJfSwKCXBhcmVudHM6IGZ1bmN0aW9uKCBlbGVtICkgewoJCXJldHVybiBqUXVlcnkuZGlyKCBlbGVtLCAicGFyZW50Tm9kZSIgKTsKCX0sCglwYXJlbnRzVW50aWw6IGZ1bmN0aW9uKCBlbGVtLCBpLCB1bnRpbCApIHsKCQlyZXR1cm4galF1ZXJ5LmRpciggZWxlbSwgInBhcmVudE5vZGUiLCB1bnRpbCApOwoJfSwKCW5leHQ6IGZ1bmN0aW9uKCBlbGVtICkgewoJCXJldHVybiBqUXVlcnkubnRoKCBlbGVtLCAyLCAibmV4dFNpYmxpbmciICk7Cgl9LAoJcHJldjogZnVuY3Rpb24oIGVsZW0gKSB7CgkJcmV0dXJuIGpRdWVyeS5udGgoIGVsZW0sIDIsICJwcmV2aW91c1NpYmxpbmciICk7Cgl9LAoJbmV4dEFsbDogZnVuY3Rpb24oIGVsZW0gKSB7CgkJcmV0dXJuIGpRdWVyeS5kaXIoIGVsZW0sICJuZXh0U2libGluZyIgKTsKCX0sCglwcmV2QWxsOiBmdW5jdGlvbiggZWxlbSApIHsKCQlyZXR1cm4galF1ZXJ5LmRpciggZWxlbSwgInByZXZpb3VzU2libGluZyIgKTsKCX0sCgluZXh0VW50aWw6IGZ1bmN0aW9uKCBlbGVtLCBpLCB1bnRpbCApIHsKCQlyZXR1cm4galF1ZXJ5LmRpciggZWxlbSwgIm5leHRTaWJsaW5nIiwgdW50aWwgKTsKCX0sCglwcmV2VW50aWw6IGZ1bmN0aW9uKCBlbGVtLCBpLCB1bnRpbCApIHsKCQlyZXR1cm4galF1ZXJ5LmRpciggZWxlbSwgInByZXZpb3VzU2libGluZyIsIHVudGlsICk7Cgl9LAoJc2libGluZ3M6IGZ1bmN0aW9uKCBlbGVtICkgewoJCXJldHVybiBqUXVlcnkuc2libGluZyggZWxlbS5wYXJlbnROb2RlLmZpcnN0Q2hpbGQsIGVsZW0gKTsKCX0sCgljaGlsZHJlbjogZnVuY3Rpb24oIGVsZW0gKSB7CgkJcmV0dXJuIGpRdWVyeS5zaWJsaW5nKCBlbGVtLmZpcnN0Q2hpbGQgKTsKCX0sCgljb250ZW50czogZnVuY3Rpb24oIGVsZW0gKSB7CgkJcmV0dXJuIGpRdWVyeS5ub2RlTmFtZSggZWxlbSwgImlmcmFtZSIgKSA/CgkJCWVsZW0uY29udGVudERvY3VtZW50IHx8IGVsZW0uY29udGVudFdpbmRvdy5kb2N1bWVudCA6CgkJCWpRdWVyeS5tYWtlQXJyYXkoIGVsZW0uY2hpbGROb2RlcyApOwoJfQp9LCBmdW5jdGlvbiggbmFtZSwgZm4gKSB7CglqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1bmN0aW9uKCB1bnRpbCwgc2VsZWN0b3IgKSB7CgkJdmFyIHJldCA9IGpRdWVyeS5tYXAoIHRoaXMsIGZuLCB1bnRpbCApLAoJCQkvLyBUaGUgdmFyaWFibGUgJ2FyZ3MnIHdhcyBpbnRyb2R1Y2VkIGluCgkJCS8vIGh0dHBzOi8vZ2l0aHViLmNvbS9qcXVlcnkvanF1ZXJ5L2NvbW1pdC81MmEwMjM4CgkJCS8vIHRvIHdvcmsgYXJvdW5kIGEgYnVnIGluIENocm9tZSAxMCAoRGV2KSBhbmQgc2hvdWxkIGJlIHJlbW92ZWQgd2hlbiB0aGUgYnVnIGlzIGZpeGVkLgoJCQkvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvdjgvaXNzdWVzL2RldGFpbD9pZD0xMDUwCgkJCWFyZ3MgPSBzbGljZS5jYWxsKGFyZ3VtZW50cyk7CgoJCWlmICggIXJ1bnRpbC50ZXN0KCBuYW1lICkgKSB7CgkJCXNlbGVjdG9yID0gdW50aWw7CgkJfQoKCQlpZiAoIHNlbGVjdG9yICYmIHR5cGVvZiBzZWxlY3RvciA9PT0gInN0cmluZyIgKSB7CgkJCXJldCA9IGpRdWVyeS5maWx0ZXIoIHNlbGVjdG9yLCByZXQgKTsKCQl9CgoJCXJldCA9IHRoaXMubGVuZ3RoID4gMSAmJiAhZ3VhcmFudGVlZFVuaXF1ZVsgbmFtZSBdID8galF1ZXJ5LnVuaXF1ZSggcmV0ICkgOiByZXQ7CgoJCWlmICggKHRoaXMubGVuZ3RoID4gMSB8fCBybXVsdGlzZWxlY3Rvci50ZXN0KCBzZWxlY3RvciApKSAmJiBycGFyZW50c3ByZXYudGVzdCggbmFtZSApICkgewoJCQlyZXQgPSByZXQucmV2ZXJzZSgpOwoJCX0KCgkJcmV0dXJuIHRoaXMucHVzaFN0YWNrKCByZXQsIG5hbWUsIGFyZ3Muam9pbigiLCIpICk7Cgl9Owp9KTsKCmpRdWVyeS5leHRlbmQoewoJZmlsdGVyOiBmdW5jdGlvbiggZXhwciwgZWxlbXMsIG5vdCApIHsKCQlpZiAoIG5vdCApIHsKCQkJZXhwciA9ICI6bm90KCIgKyBleHByICsgIikiOwoJCX0KCgkJcmV0dXJuIGVsZW1zLmxlbmd0aCA9PT0gMSA/CgkJCWpRdWVyeS5maW5kLm1hdGNoZXNTZWxlY3RvcihlbGVtc1swXSwgZXhwcikgPyBbIGVsZW1zWzBdIF0gOiBbXSA6CgkJCWpRdWVyeS5maW5kLm1hdGNoZXMoZXhwciwgZWxlbXMpOwoJfSwKCglkaXI6IGZ1bmN0aW9uKCBlbGVtLCBkaXIsIHVudGlsICkgewoJCXZhciBtYXRjaGVkID0gW10sCgkJCWN1ciA9IGVsZW1bIGRpciBdOwoKCQl3aGlsZSAoIGN1ciAmJiBjdXIubm9kZVR5cGUgIT09IDkgJiYgKHVudGlsID09PSB1bmRlZmluZWQgfHwgY3VyLm5vZGVUeXBlICE9PSAxIHx8ICFqUXVlcnkoIGN1ciApLmlzKCB1bnRpbCApKSApIHsKCQkJaWYgKCBjdXIubm9kZVR5cGUgPT09IDEgKSB7CgkJCQltYXRjaGVkLnB1c2goIGN1ciApOwoJCQl9CgkJCWN1ciA9IGN1cltkaXJdOwoJCX0KCQlyZXR1cm4gbWF0Y2hlZDsKCX0sCgoJbnRoOiBmdW5jdGlvbiggY3VyLCByZXN1bHQsIGRpciwgZWxlbSApIHsKCQlyZXN1bHQgPSByZXN1bHQgfHwgMTsKCQl2YXIgbnVtID0gMDsKCgkJZm9yICggOyBjdXI7IGN1ciA9IGN1cltkaXJdICkgewoJCQlpZiAoIGN1ci5ub2RlVHlwZSA9PT0gMSAmJiArK251bSA9PT0gcmVzdWx0ICkgewoJCQkJYnJlYWs7CgkJCX0KCQl9CgoJCXJldHVybiBjdXI7Cgl9LAoKCXNpYmxpbmc6IGZ1bmN0aW9uKCBuLCBlbGVtICkgewoJCXZhciByID0gW107CgoJCWZvciAoIDsgbjsgbiA9IG4ubmV4dFNpYmxpbmcgKSB7CgkJCWlmICggbi5ub2RlVHlwZSA9PT0gMSAmJiBuICE9PSBlbGVtICkgewoJCQkJci5wdXNoKCBuICk7CgkJCX0KCQl9CgoJCXJldHVybiByOwoJfQp9KTsKCi8vIEltcGxlbWVudCB0aGUgaWRlbnRpY2FsIGZ1bmN0aW9uYWxpdHkgZm9yIGZpbHRlciBhbmQgbm90CmZ1bmN0aW9uIHdpbm5vdyggZWxlbWVudHMsIHF1YWxpZmllciwga2VlcCApIHsKCgkvLyBDYW4ndCBwYXNzIG51bGwgb3IgdW5kZWZpbmVkIHRvIGluZGV4T2YgaW4gRmlyZWZveCA0CgkvLyBTZXQgdG8gMCB0byBza2lwIHN0cmluZyBjaGVjawoJcXVhbGlmaWVyID0gcXVhbGlmaWVyIHx8IDA7CgoJaWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggcXVhbGlmaWVyICkgKSB7CgkJcmV0dXJuIGpRdWVyeS5ncmVwKGVsZW1lbnRzLCBmdW5jdGlvbiggZWxlbSwgaSApIHsKCQkJdmFyIHJldFZhbCA9ICEhcXVhbGlmaWVyLmNhbGwoIGVsZW0sIGksIGVsZW0gKTsKCQkJcmV0dXJuIHJldFZhbCA9PT0ga2VlcDsKCQl9KTsKCgl9IGVsc2UgaWYgKCBxdWFsaWZpZXIubm9kZVR5cGUgKSB7CgkJcmV0dXJuIGpRdWVyeS5ncmVwKGVsZW1lbnRzLCBmdW5jdGlvbiggZWxlbSwgaSApIHsKCQkJcmV0dXJuIChlbGVtID09PSBxdWFsaWZpZXIpID09PSBrZWVwOwoJCX0pOwoKCX0gZWxzZSBpZiAoIHR5cGVvZiBxdWFsaWZpZXIgPT09ICJzdHJpbmciICkgewoJCXZhciBmaWx0ZXJlZCA9IGpRdWVyeS5ncmVwKGVsZW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHsKCQkJcmV0dXJuIGVsZW0ubm9kZVR5cGUgPT09IDE7CgkJfSk7CgoJCWlmICggaXNTaW1wbGUudGVzdCggcXVhbGlmaWVyICkgKSB7CgkJCXJldHVybiBqUXVlcnkuZmlsdGVyKHF1YWxpZmllciwgZmlsdGVyZWQsICFrZWVwKTsKCQl9IGVsc2UgewoJCQlxdWFsaWZpZXIgPSBqUXVlcnkuZmlsdGVyKCBxdWFsaWZpZXIsIGZpbHRlcmVkICk7CgkJfQoJfQoKCXJldHVybiBqUXVlcnkuZ3JlcChlbGVtZW50cywgZnVuY3Rpb24oIGVsZW0sIGkgKSB7CgkJcmV0dXJuIChqUXVlcnkuaW5BcnJheSggZWxlbSwgcXVhbGlmaWVyICkgPj0gMCkgPT09IGtlZXA7Cgl9KTsKfQoKCgoKdmFyIHJpbmxpbmVqUXVlcnkgPSAvIGpRdWVyeVxkKz0iKD86XGQrfG51bGwpIi9nLAoJcmxlYWRpbmdXaGl0ZXNwYWNlID0gL15ccysvLAoJcnhodG1sVGFnID0gLzwoPyFhcmVhfGJyfGNvbHxlbWJlZHxocnxpbWd8aW5wdXR8bGlua3xtZXRhfHBhcmFtKSgoW1x3Ol0rKVtePl0qKVwvPi9pZywKCXJ0YWdOYW1lID0gLzwoW1x3Ol0rKS8sCglydGJvZHkgPSAvPHRib2R5L2ksCglyaHRtbCA9IC88fCYjP1x3KzsvLAoJcm5vY2FjaGUgPSAvPCg/OnNjcmlwdHxvYmplY3R8ZW1iZWR8b3B0aW9ufHN0eWxlKS9pLAoJLy8gY2hlY2tlZD0iY2hlY2tlZCIgb3IgY2hlY2tlZAoJcmNoZWNrZWQgPSAvY2hlY2tlZFxzKig/OltePV18PVxzKi5jaGVja2VkLikvaSwKCXJzY3JpcHRUeXBlID0gL1wvKGphdmF8ZWNtYSlzY3JpcHQvaSwKCXJjbGVhblNjcmlwdCA9IC9eXHMqPCEoPzpcW0NEQVRBXFt8XC1cLSkvLAoJd3JhcE1hcCA9IHsKCQlvcHRpb246IFsgMSwgIjxzZWxlY3QgbXVsdGlwbGU9J211bHRpcGxlJz4iLCAiPC9zZWxlY3Q+IiBdLAoJCWxlZ2VuZDogWyAxLCAiPGZpZWxkc2V0PiIsICI8L2ZpZWxkc2V0PiIgXSwKCQl0aGVhZDogWyAxLCAiPHRhYmxlPiIsICI8L3RhYmxlPiIgXSwKCQl0cjogWyAyLCAiPHRhYmxlPjx0Ym9keT4iLCAiPC90Ym9keT48L3RhYmxlPiIgXSwKCQl0ZDogWyAzLCAiPHRhYmxlPjx0Ym9keT48dHI+IiwgIjwvdHI+PC90Ym9keT48L3RhYmxlPiIgXSwKCQljb2w6IFsgMiwgIjx0YWJsZT48dGJvZHk+PC90Ym9keT48Y29sZ3JvdXA+IiwgIjwvY29sZ3JvdXA+PC90YWJsZT4iIF0sCgkJYXJlYTogWyAxLCAiPG1hcD4iLCAiPC9tYXA+IiBdLAoJCV9kZWZhdWx0OiBbIDAsICIiLCAiIiBdCgl9OwoKd3JhcE1hcC5vcHRncm91cCA9IHdyYXBNYXAub3B0aW9uOwp3cmFwTWFwLnRib2R5ID0gd3JhcE1hcC50Zm9vdCA9IHdyYXBNYXAuY29sZ3JvdXAgPSB3cmFwTWFwLmNhcHRpb24gPSB3cmFwTWFwLnRoZWFkOwp3cmFwTWFwLnRoID0gd3JhcE1hcC50ZDsKCi8vIElFIGNhbid0IHNlcmlhbGl6ZSA8bGluaz4gYW5kIDxzY3JpcHQ+IHRhZ3Mgbm9ybWFsbHkKaWYgKCAhalF1ZXJ5LnN1cHBvcnQuaHRtbFNlcmlhbGl6ZSApIHsKCXdyYXBNYXAuX2RlZmF1bHQgPSBbIDEsICJkaXY8ZGl2PiIsICI8L2Rpdj4iIF07Cn0KCmpRdWVyeS5mbi5leHRlbmQoewoJdGV4dDogZnVuY3Rpb24oIHRleHQgKSB7CgkJaWYgKCBqUXVlcnkuaXNGdW5jdGlvbih0ZXh0KSApIHsKCQkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihpKSB7CgkJCQl2YXIgc2VsZiA9IGpRdWVyeSggdGhpcyApOwoKCQkJCXNlbGYudGV4dCggdGV4dC5jYWxsKHRoaXMsIGksIHNlbGYudGV4dCgpKSApOwoJCQl9KTsKCQl9CgoJCWlmICggdHlwZW9mIHRleHQgIT09ICJvYmplY3QiICYmIHRleHQgIT09IHVuZGVmaW5lZCApIHsKCQkJcmV0dXJuIHRoaXMuZW1wdHkoKS5hcHBlbmQoICh0aGlzWzBdICYmIHRoaXNbMF0ub3duZXJEb2N1bWVudCB8fCBkb2N1bWVudCkuY3JlYXRlVGV4dE5vZGUoIHRleHQgKSApOwoJCX0KCgkJcmV0dXJuIGpRdWVyeS50ZXh0KCB0aGlzICk7Cgl9LAoKCXdyYXBBbGw6IGZ1bmN0aW9uKCBodG1sICkgewoJCWlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIGh0bWwgKSApIHsKCQkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihpKSB7CgkJCQlqUXVlcnkodGhpcykud3JhcEFsbCggaHRtbC5jYWxsKHRoaXMsIGkpICk7CgkJCX0pOwoJCX0KCgkJaWYgKCB0aGlzWzBdICkgewoJCQkvLyBUaGUgZWxlbWVudHMgdG8gd3JhcCB0aGUgdGFyZ2V0IGFyb3VuZAoJCQl2YXIgd3JhcCA9IGpRdWVyeSggaHRtbCwgdGhpc1swXS5vd25lckRvY3VtZW50ICkuZXEoMCkuY2xvbmUodHJ1ZSk7CgoJCQlpZiAoIHRoaXNbMF0ucGFyZW50Tm9kZSApIHsKCQkJCXdyYXAuaW5zZXJ0QmVmb3JlKCB0aGlzWzBdICk7CgkJCX0KCgkJCXdyYXAubWFwKGZ1bmN0aW9uKCkgewoJCQkJdmFyIGVsZW0gPSB0aGlzOwoKCQkJCXdoaWxlICggZWxlbS5maXJzdENoaWxkICYmIGVsZW0uZmlyc3RDaGlsZC5ub2RlVHlwZSA9PT0gMSApIHsKCQkJCQllbGVtID0gZWxlbS5maXJzdENoaWxkOwoJCQkJfQoKCQkJCXJldHVybiBlbGVtOwoJCQl9KS5hcHBlbmQoIHRoaXMgKTsKCQl9CgoJCXJldHVybiB0aGlzOwoJfSwKCgl3cmFwSW5uZXI6IGZ1bmN0aW9uKCBodG1sICkgewoJCWlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIGh0bWwgKSApIHsKCQkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihpKSB7CgkJCQlqUXVlcnkodGhpcykud3JhcElubmVyKCBodG1sLmNhbGwodGhpcywgaSkgKTsKCQkJfSk7CgkJfQoKCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewoJCQl2YXIgc2VsZiA9IGpRdWVyeSggdGhpcyApLAoJCQkJY29udGVudHMgPSBzZWxmLmNvbnRlbnRzKCk7CgoJCQlpZiAoIGNvbnRlbnRzLmxlbmd0aCApIHsKCQkJCWNvbnRlbnRzLndyYXBBbGwoIGh0bWwgKTsKCgkJCX0gZWxzZSB7CgkJCQlzZWxmLmFwcGVuZCggaHRtbCApOwoJCQl9CgkJfSk7Cgl9LAoKCXdyYXA6IGZ1bmN0aW9uKCBodG1sICkgewoJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7CgkJCWpRdWVyeSggdGhpcyApLndyYXBBbGwoIGh0bWwgKTsKCQl9KTsKCX0sCgoJdW53cmFwOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy5wYXJlbnQoKS5lYWNoKGZ1bmN0aW9uKCkgewoJCQlpZiAoICFqUXVlcnkubm9kZU5hbWUoIHRoaXMsICJib2R5IiApICkgewoJCQkJalF1ZXJ5KCB0aGlzICkucmVwbGFjZVdpdGgoIHRoaXMuY2hpbGROb2RlcyApOwoJCQl9CgkJfSkuZW5kKCk7Cgl9LAoKCWFwcGVuZDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLCB0cnVlLCBmdW5jdGlvbiggZWxlbSApIHsKCQkJaWYgKCB0aGlzLm5vZGVUeXBlID09PSAxICkgewoJCQkJdGhpcy5hcHBlbmRDaGlsZCggZWxlbSApOwoJCQl9CgkJfSk7Cgl9LAoKCXByZXBlbmQ6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cywgdHJ1ZSwgZnVuY3Rpb24oIGVsZW0gKSB7CgkJCWlmICggdGhpcy5ub2RlVHlwZSA9PT0gMSApIHsKCQkJCXRoaXMuaW5zZXJ0QmVmb3JlKCBlbGVtLCB0aGlzLmZpcnN0Q2hpbGQgKTsKCQkJfQoJCX0pOwoJfSwKCgliZWZvcmU6IGZ1bmN0aW9uKCkgewoJCWlmICggdGhpc1swXSAmJiB0aGlzWzBdLnBhcmVudE5vZGUgKSB7CgkJCXJldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cywgZmFsc2UsIGZ1bmN0aW9uKCBlbGVtICkgewoJCQkJdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSggZWxlbSwgdGhpcyApOwoJCQl9KTsKCQl9IGVsc2UgaWYgKCBhcmd1bWVudHMubGVuZ3RoICkgewoJCQl2YXIgc2V0ID0galF1ZXJ5KGFyZ3VtZW50c1swXSk7CgkJCXNldC5wdXNoLmFwcGx5KCBzZXQsIHRoaXMudG9BcnJheSgpICk7CgkJCXJldHVybiB0aGlzLnB1c2hTdGFjayggc2V0LCAiYmVmb3JlIiwgYXJndW1lbnRzICk7CgkJfQoJfSwKCglhZnRlcjogZnVuY3Rpb24oKSB7CgkJaWYgKCB0aGlzWzBdICYmIHRoaXNbMF0ucGFyZW50Tm9kZSApIHsKCQkJcmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLCBmYWxzZSwgZnVuY3Rpb24oIGVsZW0gKSB7CgkJCQl0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKCBlbGVtLCB0aGlzLm5leHRTaWJsaW5nICk7CgkJCX0pOwoJCX0gZWxzZSBpZiAoIGFyZ3VtZW50cy5sZW5ndGggKSB7CgkJCXZhciBzZXQgPSB0aGlzLnB1c2hTdGFjayggdGhpcywgImFmdGVyIiwgYXJndW1lbnRzICk7CgkJCXNldC5wdXNoLmFwcGx5KCBzZXQsIGpRdWVyeShhcmd1bWVudHNbMF0pLnRvQXJyYXkoKSApOwoJCQlyZXR1cm4gc2V0OwoJCX0KCX0sCgoJLy8ga2VlcERhdGEgaXMgZm9yIGludGVybmFsIHVzZSBvbmx5LS1kbyBub3QgZG9jdW1lbnQKCXJlbW92ZTogZnVuY3Rpb24oIHNlbGVjdG9yLCBrZWVwRGF0YSApIHsKCQlmb3IgKCB2YXIgaSA9IDAsIGVsZW07IChlbGVtID0gdGhpc1tpXSkgIT0gbnVsbDsgaSsrICkgewoJCQlpZiAoICFzZWxlY3RvciB8fCBqUXVlcnkuZmlsdGVyKCBzZWxlY3RvciwgWyBlbGVtIF0gKS5sZW5ndGggKSB7CgkJCQlpZiAoICFrZWVwRGF0YSAmJiBlbGVtLm5vZGVUeXBlID09PSAxICkgewoJCQkJCWpRdWVyeS5jbGVhbkRhdGEoIGVsZW0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKSApOwoJCQkJCWpRdWVyeS5jbGVhbkRhdGEoIFsgZWxlbSBdICk7CgkJCQl9CgoJCQkJaWYgKCBlbGVtLnBhcmVudE5vZGUgKSB7CgkJCQkJZWxlbS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCBlbGVtICk7CgkJCQl9CgkJCX0KCQl9CgoJCXJldHVybiB0aGlzOwoJfSwKCgllbXB0eTogZnVuY3Rpb24oKSB7CgkJZm9yICggdmFyIGkgPSAwLCBlbGVtOyAoZWxlbSA9IHRoaXNbaV0pICE9IG51bGw7IGkrKyApIHsKCQkJLy8gUmVtb3ZlIGVsZW1lbnQgbm9kZXMgYW5kIHByZXZlbnQgbWVtb3J5IGxlYWtzCgkJCWlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSApIHsKCQkJCWpRdWVyeS5jbGVhbkRhdGEoIGVsZW0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKSApOwoJCQl9CgoJCQkvLyBSZW1vdmUgYW55IHJlbWFpbmluZyBub2RlcwoJCQl3aGlsZSAoIGVsZW0uZmlyc3RDaGlsZCApIHsKCQkJCWVsZW0ucmVtb3ZlQ2hpbGQoIGVsZW0uZmlyc3RDaGlsZCApOwoJCQl9CgkJfQoKCQlyZXR1cm4gdGhpczsKCX0sCgoJY2xvbmU6IGZ1bmN0aW9uKCBkYXRhQW5kRXZlbnRzLCBkZWVwRGF0YUFuZEV2ZW50cyApIHsKCQlkYXRhQW5kRXZlbnRzID0gZGF0YUFuZEV2ZW50cyA9PSBudWxsID8gZmFsc2UgOiBkYXRhQW5kRXZlbnRzOwoJCWRlZXBEYXRhQW5kRXZlbnRzID0gZGVlcERhdGFBbmRFdmVudHMgPT0gbnVsbCA/IGRhdGFBbmRFdmVudHMgOiBkZWVwRGF0YUFuZEV2ZW50czsKCgkJcmV0dXJuIHRoaXMubWFwKCBmdW5jdGlvbiAoKSB7CgkJCXJldHVybiBqUXVlcnkuY2xvbmUoIHRoaXMsIGRhdGFBbmRFdmVudHMsIGRlZXBEYXRhQW5kRXZlbnRzICk7CgkJfSk7Cgl9LAoKCWh0bWw6IGZ1bmN0aW9uKCB2YWx1ZSApIHsKCQlpZiAoIHZhbHVlID09PSB1bmRlZmluZWQgKSB7CgkJCXJldHVybiB0aGlzWzBdICYmIHRoaXNbMF0ubm9kZVR5cGUgPT09IDEgPwoJCQkJdGhpc1swXS5pbm5lckhUTUwucmVwbGFjZShyaW5saW5lalF1ZXJ5LCAiIikgOgoJCQkJbnVsbDsKCgkJLy8gU2VlIGlmIHdlIGNhbiB0YWtlIGEgc2hvcnRjdXQgYW5kIGp1c3QgdXNlIGlubmVySFRNTAoJCX0gZWxzZSBpZiAoIHR5cGVvZiB2YWx1ZSA9PT0gInN0cmluZyIgJiYgIXJub2NhY2hlLnRlc3QoIHZhbHVlICkgJiYKCQkJKGpRdWVyeS5zdXBwb3J0LmxlYWRpbmdXaGl0ZXNwYWNlIHx8ICFybGVhZGluZ1doaXRlc3BhY2UudGVzdCggdmFsdWUgKSkgJiYKCQkJIXdyYXBNYXBbIChydGFnTmFtZS5leGVjKCB2YWx1ZSApIHx8IFsiIiwgIiJdKVsxXS50b0xvd2VyQ2FzZSgpIF0gKSB7CgoJCQl2YWx1ZSA9IHZhbHVlLnJlcGxhY2UocnhodG1sVGFnLCAiPCQxPjwvJDI+Iik7CgoJCQl0cnkgewoJCQkJZm9yICggdmFyIGkgPSAwLCBsID0gdGhpcy5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CgkJCQkJLy8gUmVtb3ZlIGVsZW1lbnQgbm9kZXMgYW5kIHByZXZlbnQgbWVtb3J5IGxlYWtzCgkJCQkJaWYgKCB0aGlzW2ldLm5vZGVUeXBlID09PSAxICkgewoJCQkJCQlqUXVlcnkuY2xlYW5EYXRhKCB0aGlzW2ldLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikgKTsKCQkJCQkJdGhpc1tpXS5pbm5lckhUTUwgPSB2YWx1ZTsKCQkJCQl9CgkJCQl9CgoJCQkvLyBJZiB1c2luZyBpbm5lckhUTUwgdGhyb3dzIGFuIGV4Y2VwdGlvbiwgdXNlIHRoZSBmYWxsYmFjayBtZXRob2QKCQkJfSBjYXRjaChlKSB7CgkJCQl0aGlzLmVtcHR5KCkuYXBwZW5kKCB2YWx1ZSApOwoJCQl9CgoJCX0gZWxzZSBpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCB2YWx1ZSApICkgewoJCQl0aGlzLmVhY2goZnVuY3Rpb24oaSl7CgkJCQl2YXIgc2VsZiA9IGpRdWVyeSggdGhpcyApOwoKCQkJCXNlbGYuaHRtbCggdmFsdWUuY2FsbCh0aGlzLCBpLCBzZWxmLmh0bWwoKSkgKTsKCQkJfSk7CgoJCX0gZWxzZSB7CgkJCXRoaXMuZW1wdHkoKS5hcHBlbmQoIHZhbHVlICk7CgkJfQoKCQlyZXR1cm4gdGhpczsKCX0sCgoJcmVwbGFjZVdpdGg6IGZ1bmN0aW9uKCB2YWx1ZSApIHsKCQlpZiAoIHRoaXNbMF0gJiYgdGhpc1swXS5wYXJlbnROb2RlICkgewoJCQkvLyBNYWtlIHN1cmUgdGhhdCB0aGUgZWxlbWVudHMgYXJlIHJlbW92ZWQgZnJvbSB0aGUgRE9NIGJlZm9yZSB0aGV5IGFyZSBpbnNlcnRlZAoJCQkvLyB0aGlzIGNhbiBoZWxwIGZpeCByZXBsYWNpbmcgYSBwYXJlbnQgd2l0aCBjaGlsZCBlbGVtZW50cwoJCQlpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCB2YWx1ZSApICkgewoJCQkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihpKSB7CgkJCQkJdmFyIHNlbGYgPSBqUXVlcnkodGhpcyksIG9sZCA9IHNlbGYuaHRtbCgpOwoJCQkJCXNlbGYucmVwbGFjZVdpdGgoIHZhbHVlLmNhbGwoIHRoaXMsIGksIG9sZCApICk7CgkJCQl9KTsKCQkJfQoKCQkJaWYgKCB0eXBlb2YgdmFsdWUgIT09ICJzdHJpbmciICkgewoJCQkJdmFsdWUgPSBqUXVlcnkoIHZhbHVlICkuZGV0YWNoKCk7CgkJCX0KCgkJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7CgkJCQl2YXIgbmV4dCA9IHRoaXMubmV4dFNpYmxpbmcsCgkJCQkJcGFyZW50ID0gdGhpcy5wYXJlbnROb2RlOwoKCQkJCWpRdWVyeSggdGhpcyApLnJlbW92ZSgpOwoKCQkJCWlmICggbmV4dCApIHsKCQkJCQlqUXVlcnkobmV4dCkuYmVmb3JlKCB2YWx1ZSApOwoJCQkJfSBlbHNlIHsKCQkJCQlqUXVlcnkocGFyZW50KS5hcHBlbmQoIHZhbHVlICk7CgkJCQl9CgkJCX0pOwoJCX0gZWxzZSB7CgkJCXJldHVybiB0aGlzLmxlbmd0aCA/CgkJCQl0aGlzLnB1c2hTdGFjayggalF1ZXJ5KGpRdWVyeS5pc0Z1bmN0aW9uKHZhbHVlKSA/IHZhbHVlKCkgOiB2YWx1ZSksICJyZXBsYWNlV2l0aCIsIHZhbHVlICkgOgoJCQkJdGhpczsKCQl9Cgl9LAoKCWRldGFjaDogZnVuY3Rpb24oIHNlbGVjdG9yICkgewoJCXJldHVybiB0aGlzLnJlbW92ZSggc2VsZWN0b3IsIHRydWUgKTsKCX0sCgoJZG9tTWFuaXA6IGZ1bmN0aW9uKCBhcmdzLCB0YWJsZSwgY2FsbGJhY2sgKSB7CgkJdmFyIHJlc3VsdHMsIGZpcnN0LCBmcmFnbWVudCwgcGFyZW50LAoJCQl2YWx1ZSA9IGFyZ3NbMF0sCgkJCXNjcmlwdHMgPSBbXTsKCgkJLy8gV2UgY2FuJ3QgY2xvbmVOb2RlIGZyYWdtZW50cyB0aGF0IGNvbnRhaW4gY2hlY2tlZCwgaW4gV2ViS2l0CgkJaWYgKCAhalF1ZXJ5LnN1cHBvcnQuY2hlY2tDbG9uZSAmJiBhcmd1bWVudHMubGVuZ3RoID09PSAzICYmIHR5cGVvZiB2YWx1ZSA9PT0gInN0cmluZyIgJiYgcmNoZWNrZWQudGVzdCggdmFsdWUgKSApIHsKCQkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHsKCQkJCWpRdWVyeSh0aGlzKS5kb21NYW5pcCggYXJncywgdGFibGUsIGNhbGxiYWNrLCB0cnVlICk7CgkJCX0pOwoJCX0KCgkJaWYgKCBqUXVlcnkuaXNGdW5jdGlvbih2YWx1ZSkgKSB7CgkJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oaSkgewoJCQkJdmFyIHNlbGYgPSBqUXVlcnkodGhpcyk7CgkJCQlhcmdzWzBdID0gdmFsdWUuY2FsbCh0aGlzLCBpLCB0YWJsZSA/IHNlbGYuaHRtbCgpIDogdW5kZWZpbmVkKTsKCQkJCXNlbGYuZG9tTWFuaXAoIGFyZ3MsIHRhYmxlLCBjYWxsYmFjayApOwoJCQl9KTsKCQl9CgoJCWlmICggdGhpc1swXSApIHsKCQkJcGFyZW50ID0gdmFsdWUgJiYgdmFsdWUucGFyZW50Tm9kZTsKCgkJCS8vIElmIHdlJ3JlIGluIGEgZnJhZ21lbnQsIGp1c3QgdXNlIHRoYXQgaW5zdGVhZCBvZiBidWlsZGluZyBhIG5ldyBvbmUKCQkJaWYgKCBqUXVlcnkuc3VwcG9ydC5wYXJlbnROb2RlICYmIHBhcmVudCAmJiBwYXJlbnQubm9kZVR5cGUgPT09IDExICYmIHBhcmVudC5jaGlsZE5vZGVzLmxlbmd0aCA9PT0gdGhpcy5sZW5ndGggKSB7CgkJCQlyZXN1bHRzID0geyBmcmFnbWVudDogcGFyZW50IH07CgoJCQl9IGVsc2UgewoJCQkJcmVzdWx0cyA9IGpRdWVyeS5idWlsZEZyYWdtZW50KCBhcmdzLCB0aGlzLCBzY3JpcHRzICk7CgkJCX0KCgkJCWZyYWdtZW50ID0gcmVzdWx0cy5mcmFnbWVudDsKCgkJCWlmICggZnJhZ21lbnQuY2hpbGROb2Rlcy5sZW5ndGggPT09IDEgKSB7CgkJCQlmaXJzdCA9IGZyYWdtZW50ID0gZnJhZ21lbnQuZmlyc3RDaGlsZDsKCQkJfSBlbHNlIHsKCQkJCWZpcnN0ID0gZnJhZ21lbnQuZmlyc3RDaGlsZDsKCQkJfQoKCQkJaWYgKCBmaXJzdCApIHsKCQkJCXRhYmxlID0gdGFibGUgJiYgalF1ZXJ5Lm5vZGVOYW1lKCBmaXJzdCwgInRyIiApOwoKCQkJCWZvciAoIHZhciBpID0gMCwgbCA9IHRoaXMubGVuZ3RoLCBsYXN0SW5kZXggPSBsIC0gMTsgaSA8IGw7IGkrKyApIHsKCQkJCQljYWxsYmFjay5jYWxsKAoJCQkJCQl0YWJsZSA/CgkJCQkJCQlyb290KHRoaXNbaV0sIGZpcnN0KSA6CgkJCQkJCQl0aGlzW2ldLAoJCQkJCQkvLyBNYWtlIHN1cmUgdGhhdCB3ZSBkbyBub3QgbGVhayBtZW1vcnkgYnkgaW5hZHZlcnRlbnRseSBkaXNjYXJkaW5nCgkJCQkJCS8vIHRoZSBvcmlnaW5hbCBmcmFnbWVudCAod2hpY2ggbWlnaHQgaGF2ZSBhdHRhY2hlZCBkYXRhKSBpbnN0ZWFkIG9mCgkJCQkJCS8vIHVzaW5nIGl0OyBpbiBhZGRpdGlvbiwgdXNlIHRoZSBvcmlnaW5hbCBmcmFnbWVudCBvYmplY3QgZm9yIHRoZSBsYXN0CgkJCQkJCS8vIGl0ZW0gaW5zdGVhZCBvZiBmaXJzdCBiZWNhdXNlIGl0IGNhbiBlbmQgdXAgYmVpbmcgZW1wdGllZCBpbmNvcnJlY3RseQoJCQkJCQkvLyBpbiBjZXJ0YWluIHNpdHVhdGlvbnMgKEJ1ZyAjODA3MCkuCgkJCQkJCS8vIEZyYWdtZW50cyBmcm9tIHRoZSBmcmFnbWVudCBjYWNoZSBtdXN0IGFsd2F5cyBiZSBjbG9uZWQgYW5kIG5ldmVyIHVzZWQKCQkJCQkJLy8gaW4gcGxhY2UuCgkJCQkJCXJlc3VsdHMuY2FjaGVhYmxlIHx8IChsID4gMSAmJiBpIDwgbGFzdEluZGV4KSA/CgkJCQkJCQlqUXVlcnkuY2xvbmUoIGZyYWdtZW50LCB0cnVlLCB0cnVlICkgOgoJCQkJCQkJZnJhZ21lbnQKCQkJCQkpOwoJCQkJfQoJCQl9CgoJCQlpZiAoIHNjcmlwdHMubGVuZ3RoICkgewoJCQkJalF1ZXJ5LmVhY2goIHNjcmlwdHMsIGV2YWxTY3JpcHQgKTsKCQkJfQoJCX0KCgkJcmV0dXJuIHRoaXM7Cgl9Cn0pOwoKZnVuY3Rpb24gcm9vdCggZWxlbSwgY3VyICkgewoJcmV0dXJuIGpRdWVyeS5ub2RlTmFtZShlbGVtLCAidGFibGUiKSA/CgkJKGVsZW0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRib2R5IilbMF0gfHwKCQllbGVtLmFwcGVuZENoaWxkKGVsZW0ub3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0Ym9keSIpKSkgOgoJCWVsZW07Cn0KCmZ1bmN0aW9uIGNsb25lQ29weUV2ZW50KCBzcmMsIGRlc3QgKSB7CgoJaWYgKCBkZXN0Lm5vZGVUeXBlICE9PSAxIHx8ICFqUXVlcnkuaGFzRGF0YSggc3JjICkgKSB7CgkJcmV0dXJuOwoJfQoKCXZhciBpbnRlcm5hbEtleSA9IGpRdWVyeS5leHBhbmRvLAoJCW9sZERhdGEgPSBqUXVlcnkuZGF0YSggc3JjICksCgkJY3VyRGF0YSA9IGpRdWVyeS5kYXRhKCBkZXN0LCBvbGREYXRhICk7CgoJLy8gU3dpdGNoIHRvIHVzZSB0aGUgaW50ZXJuYWwgZGF0YSBvYmplY3QsIGlmIGl0IGV4aXN0cywgZm9yIHRoZSBuZXh0CgkvLyBzdGFnZSBvZiBkYXRhIGNvcHlpbmcKCWlmICggKG9sZERhdGEgPSBvbGREYXRhWyBpbnRlcm5hbEtleSBdKSApIHsKCQl2YXIgZXZlbnRzID0gb2xkRGF0YS5ldmVudHM7CgkJCQljdXJEYXRhID0gY3VyRGF0YVsgaW50ZXJuYWxLZXkgXSA9IGpRdWVyeS5leHRlbmQoe30sIG9sZERhdGEpOwoKCQlpZiAoIGV2ZW50cyApIHsKCQkJZGVsZXRlIGN1ckRhdGEuaGFuZGxlOwoJCQljdXJEYXRhLmV2ZW50cyA9IHt9OwoKCQkJZm9yICggdmFyIHR5cGUgaW4gZXZlbnRzICkgewoJCQkJZm9yICggdmFyIGkgPSAwLCBsID0gZXZlbnRzWyB0eXBlIF0ubGVuZ3RoOyBpIDwgbDsgaSsrICkgewoJCQkJCWpRdWVyeS5ldmVudC5hZGQoIGRlc3QsIHR5cGUgKyAoIGV2ZW50c1sgdHlwZSBdWyBpIF0ubmFtZXNwYWNlID8gIi4iIDogIiIgKSArIGV2ZW50c1sgdHlwZSBdWyBpIF0ubmFtZXNwYWNlLCBldmVudHNbIHR5cGUgXVsgaSBdLCBldmVudHNbIHR5cGUgXVsgaSBdLmRhdGEgKTsKCQkJCX0KCQkJfQoJCX0KCX0KfQoKZnVuY3Rpb24gY2xvbmVGaXhBdHRyaWJ1dGVzKCBzcmMsIGRlc3QgKSB7Cgl2YXIgbm9kZU5hbWU7CgoJLy8gV2UgZG8gbm90IG5lZWQgdG8gZG8gYW55dGhpbmcgZm9yIG5vbi1FbGVtZW50cwoJaWYgKCBkZXN0Lm5vZGVUeXBlICE9PSAxICkgewoJCXJldHVybjsKCX0KCgkvLyBjbGVhckF0dHJpYnV0ZXMgcmVtb3ZlcyB0aGUgYXR0cmlidXRlcywgd2hpY2ggd2UgZG9uJ3Qgd2FudCwKCS8vIGJ1dCBhbHNvIHJlbW92ZXMgdGhlIGF0dGFjaEV2ZW50IGV2ZW50cywgd2hpY2ggd2UgKmRvKiB3YW50CglpZiAoIGRlc3QuY2xlYXJBdHRyaWJ1dGVzICkgewoJCWRlc3QuY2xlYXJBdHRyaWJ1dGVzKCk7Cgl9CgoJLy8gbWVyZ2VBdHRyaWJ1dGVzLCBpbiBjb250cmFzdCwgb25seSBtZXJnZXMgYmFjayBvbiB0aGUKCS8vIG9yaWdpbmFsIGF0dHJpYnV0ZXMsIG5vdCB0aGUgZXZlbnRzCglpZiAoIGRlc3QubWVyZ2VBdHRyaWJ1dGVzICkgewoJCWRlc3QubWVyZ2VBdHRyaWJ1dGVzKCBzcmMgKTsKCX0KCglub2RlTmFtZSA9IGRlc3Qubm9kZU5hbWUudG9Mb3dlckNhc2UoKTsKCgkvLyBJRTYtOCBmYWlsIHRvIGNsb25lIGNoaWxkcmVuIGluc2lkZSBvYmplY3QgZWxlbWVudHMgdGhhdCB1c2UKCS8vIHRoZSBwcm9wcmlldGFyeSBjbGFzc2lkIGF0dHJpYnV0ZSB2YWx1ZSAocmF0aGVyIHRoYW4gdGhlIHR5cGUKCS8vIGF0dHJpYnV0ZSkgdG8gaWRlbnRpZnkgdGhlIHR5cGUgb2YgY29udGVudCB0byBkaXNwbGF5CglpZiAoIG5vZGVOYW1lID09PSAib2JqZWN0IiApIHsKCQlkZXN0Lm91dGVySFRNTCA9IHNyYy5vdXRlckhUTUw7CgoJfSBlbHNlIGlmICggbm9kZU5hbWUgPT09ICJpbnB1dCIgJiYgKHNyYy50eXBlID09PSAiY2hlY2tib3giIHx8IHNyYy50eXBlID09PSAicmFkaW8iKSApIHsKCQkvLyBJRTYtOCBmYWlscyB0byBwZXJzaXN0IHRoZSBjaGVja2VkIHN0YXRlIG9mIGEgY2xvbmVkIGNoZWNrYm94CgkJLy8gb3IgcmFkaW8gYnV0dG9uLiBXb3JzZSwgSUU2LTcgZmFpbCB0byBnaXZlIHRoZSBjbG9uZWQgZWxlbWVudAoJCS8vIGEgY2hlY2tlZCBhcHBlYXJhbmNlIGlmIHRoZSBkZWZhdWx0Q2hlY2tlZCB2YWx1ZSBpc24ndCBhbHNvIHNldAoJCWlmICggc3JjLmNoZWNrZWQgKSB7CgkJCWRlc3QuZGVmYXVsdENoZWNrZWQgPSBkZXN0LmNoZWNrZWQgPSBzcmMuY2hlY2tlZDsKCQl9CgoJCS8vIElFNi03IGdldCBjb25mdXNlZCBhbmQgZW5kIHVwIHNldHRpbmcgdGhlIHZhbHVlIG9mIGEgY2xvbmVkCgkJLy8gY2hlY2tib3gvcmFkaW8gYnV0dG9uIHRvIGFuIGVtcHR5IHN0cmluZyBpbnN0ZWFkIG9mICJvbiIKCQlpZiAoIGRlc3QudmFsdWUgIT09IHNyYy52YWx1ZSApIHsKCQkJZGVzdC52YWx1ZSA9IHNyYy52YWx1ZTsKCQl9CgoJLy8gSUU2LTggZmFpbHMgdG8gcmV0dXJuIHRoZSBzZWxlY3RlZCBvcHRpb24gdG8gdGhlIGRlZmF1bHQgc2VsZWN0ZWQKCS8vIHN0YXRlIHdoZW4gY2xvbmluZyBvcHRpb25zCgl9IGVsc2UgaWYgKCBub2RlTmFtZSA9PT0gIm9wdGlvbiIgKSB7CgkJZGVzdC5zZWxlY3RlZCA9IHNyYy5kZWZhdWx0U2VsZWN0ZWQ7CgoJLy8gSUU2LTggZmFpbHMgdG8gc2V0IHRoZSBkZWZhdWx0VmFsdWUgdG8gdGhlIGNvcnJlY3QgdmFsdWUgd2hlbgoJLy8gY2xvbmluZyBvdGhlciB0eXBlcyBvZiBpbnB1dCBmaWVsZHMKCX0gZWxzZSBpZiAoIG5vZGVOYW1lID09PSAiaW5wdXQiIHx8IG5vZGVOYW1lID09PSAidGV4dGFyZWEiICkgewoJCWRlc3QuZGVmYXVsdFZhbHVlID0gc3JjLmRlZmF1bHRWYWx1ZTsKCX0KCgkvLyBFdmVudCBkYXRhIGdldHMgcmVmZXJlbmNlZCBpbnN0ZWFkIG9mIGNvcGllZCBpZiB0aGUgZXhwYW5kbwoJLy8gZ2V0cyBjb3BpZWQgdG9vCglkZXN0LnJlbW92ZUF0dHJpYnV0ZSggalF1ZXJ5LmV4cGFuZG8gKTsKfQoKalF1ZXJ5LmJ1aWxkRnJhZ21lbnQgPSBmdW5jdGlvbiggYXJncywgbm9kZXMsIHNjcmlwdHMgKSB7Cgl2YXIgZnJhZ21lbnQsIGNhY2hlYWJsZSwgY2FjaGVyZXN1bHRzLCBkb2M7CgogIC8vIG5vZGVzIG1heSBjb250YWluIGVpdGhlciBhbiBleHBsaWNpdCBkb2N1bWVudCBvYmplY3QsCiAgLy8gYSBqUXVlcnkgY29sbGVjdGlvbiBvciBjb250ZXh0IG9iamVjdC4KICAvLyBJZiBub2Rlc1swXSBjb250YWlucyBhIHZhbGlkIG9iamVjdCB0byBhc3NpZ24gdG8gZG9jCiAgaWYgKCBub2RlcyAmJiBub2Rlc1swXSApIHsKICAgIGRvYyA9IG5vZGVzWzBdLm93bmVyRG9jdW1lbnQgfHwgbm9kZXNbMF07CiAgfQoKICAvLyBFbnN1cmUgdGhhdCBhbiBhdHRyIG9iamVjdCBkb2Vzbid0IGluY29ycmVjdGx5IHN0YW5kIGluIGFzIGEgZG9jdW1lbnQgb2JqZWN0CgkvLyBDaHJvbWUgYW5kIEZpcmVmb3ggc2VlbSB0byBhbGxvdyB0aGlzIHRvIG9jY3VyIGFuZCB3aWxsIHRocm93IGV4Y2VwdGlvbgoJLy8gRml4ZXMgIzg5NTAKCWlmICggIWRvYy5jcmVhdGVEb2N1bWVudEZyYWdtZW50ICkgewoJCWRvYyA9IGRvY3VtZW50OwoJfQoKCS8vIE9ubHkgY2FjaGUgInNtYWxsIiAoMS8yIEtCKSBIVE1MIHN0cmluZ3MgdGhhdCBhcmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBtYWluIGRvY3VtZW50CgkvLyBDbG9uaW5nIG9wdGlvbnMgbG9zZXMgdGhlIHNlbGVjdGVkIHN0YXRlLCBzbyBkb24ndCBjYWNoZSB0aGVtCgkvLyBJRSA2IGRvZXNuJ3QgbGlrZSBpdCB3aGVuIHlvdSBwdXQgPG9iamVjdD4gb3IgPGVtYmVkPiBlbGVtZW50cyBpbiBhIGZyYWdtZW50CgkvLyBBbHNvLCBXZWJLaXQgZG9lcyBub3QgY2xvbmUgJ2NoZWNrZWQnIGF0dHJpYnV0ZXMgb24gY2xvbmVOb2RlLCBzbyBkb24ndCBjYWNoZQoJaWYgKCBhcmdzLmxlbmd0aCA9PT0gMSAmJiB0eXBlb2YgYXJnc1swXSA9PT0gInN0cmluZyIgJiYgYXJnc1swXS5sZW5ndGggPCA1MTIgJiYgZG9jID09PSBkb2N1bWVudCAmJgoJCWFyZ3NbMF0uY2hhckF0KDApID09PSAiPCIgJiYgIXJub2NhY2hlLnRlc3QoIGFyZ3NbMF0gKSAmJiAoalF1ZXJ5LnN1cHBvcnQuY2hlY2tDbG9uZSB8fCAhcmNoZWNrZWQudGVzdCggYXJnc1swXSApKSApIHsKCgkJY2FjaGVhYmxlID0gdHJ1ZTsKCgkJY2FjaGVyZXN1bHRzID0galF1ZXJ5LmZyYWdtZW50c1sgYXJnc1swXSBdOwoJCWlmICggY2FjaGVyZXN1bHRzICYmIGNhY2hlcmVzdWx0cyAhPT0gMSApIHsKCQkJZnJhZ21lbnQgPSBjYWNoZXJlc3VsdHM7CgkJfQoJfQoKCWlmICggIWZyYWdtZW50ICkgewoJCWZyYWdtZW50ID0gZG9jLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTsKCQlqUXVlcnkuY2xlYW4oIGFyZ3MsIGRvYywgZnJhZ21lbnQsIHNjcmlwdHMgKTsKCX0KCglpZiAoIGNhY2hlYWJsZSApIHsKCQlqUXVlcnkuZnJhZ21lbnRzWyBhcmdzWzBdIF0gPSBjYWNoZXJlc3VsdHMgPyBmcmFnbWVudCA6IDE7Cgl9CgoJcmV0dXJuIHsgZnJhZ21lbnQ6IGZyYWdtZW50LCBjYWNoZWFibGU6IGNhY2hlYWJsZSB9Owp9OwoKalF1ZXJ5LmZyYWdtZW50cyA9IHt9OwoKalF1ZXJ5LmVhY2goewoJYXBwZW5kVG86ICJhcHBlbmQiLAoJcHJlcGVuZFRvOiAicHJlcGVuZCIsCglpbnNlcnRCZWZvcmU6ICJiZWZvcmUiLAoJaW5zZXJ0QWZ0ZXI6ICJhZnRlciIsCglyZXBsYWNlQWxsOiAicmVwbGFjZVdpdGgiCn0sIGZ1bmN0aW9uKCBuYW1lLCBvcmlnaW5hbCApIHsKCWpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHNlbGVjdG9yICkgewoJCXZhciByZXQgPSBbXSwKCQkJaW5zZXJ0ID0galF1ZXJ5KCBzZWxlY3RvciApLAoJCQlwYXJlbnQgPSB0aGlzLmxlbmd0aCA9PT0gMSAmJiB0aGlzWzBdLnBhcmVudE5vZGU7CgoJCWlmICggcGFyZW50ICYmIHBhcmVudC5ub2RlVHlwZSA9PT0gMTEgJiYgcGFyZW50LmNoaWxkTm9kZXMubGVuZ3RoID09PSAxICYmIGluc2VydC5sZW5ndGggPT09IDEgKSB7CgkJCWluc2VydFsgb3JpZ2luYWwgXSggdGhpc1swXSApOwoJCQlyZXR1cm4gdGhpczsKCgkJfSBlbHNlIHsKCQkJZm9yICggdmFyIGkgPSAwLCBsID0gaW5zZXJ0Lmxlbmd0aDsgaSA8IGw7IGkrKyApIHsKCQkJCXZhciBlbGVtcyA9IChpID4gMCA/IHRoaXMuY2xvbmUodHJ1ZSkgOiB0aGlzKS5nZXQoKTsKCQkJCWpRdWVyeSggaW5zZXJ0W2ldIClbIG9yaWdpbmFsIF0oIGVsZW1zICk7CgkJCQlyZXQgPSByZXQuY29uY2F0KCBlbGVtcyApOwoJCQl9CgoJCQlyZXR1cm4gdGhpcy5wdXNoU3RhY2soIHJldCwgbmFtZSwgaW5zZXJ0LnNlbGVjdG9yICk7CgkJfQoJfTsKfSk7CgpmdW5jdGlvbiBnZXRBbGwoIGVsZW0gKSB7CglpZiAoICJnZXRFbGVtZW50c0J5VGFnTmFtZSIgaW4gZWxlbSApIHsKCQlyZXR1cm4gZWxlbS5nZXRFbGVtZW50c0J5VGFnTmFtZSggIioiICk7CgoJfSBlbHNlIGlmICggInF1ZXJ5U2VsZWN0b3JBbGwiIGluIGVsZW0gKSB7CgkJcmV0dXJuIGVsZW0ucXVlcnlTZWxlY3RvckFsbCggIioiICk7CgoJfSBlbHNlIHsKCQlyZXR1cm4gW107Cgl9Cn0KCi8vIFVzZWQgaW4gY2xlYW4sIGZpeGVzIHRoZSBkZWZhdWx0Q2hlY2tlZCBwcm9wZXJ0eQpmdW5jdGlvbiBmaXhEZWZhdWx0Q2hlY2tlZCggZWxlbSApIHsKCWlmICggZWxlbS50eXBlID09PSAiY2hlY2tib3giIHx8IGVsZW0udHlwZSA9PT0gInJhZGlvIiApIHsKCQllbGVtLmRlZmF1bHRDaGVja2VkID0gZWxlbS5jaGVja2VkOwoJfQp9Ci8vIEZpbmRzIGFsbCBpbnB1dHMgYW5kIHBhc3NlcyB0aGVtIHRvIGZpeERlZmF1bHRDaGVja2VkCmZ1bmN0aW9uIGZpbmRJbnB1dHMoIGVsZW0gKSB7CglpZiAoIGpRdWVyeS5ub2RlTmFtZSggZWxlbSwgImlucHV0IiApICkgewoJCWZpeERlZmF1bHRDaGVja2VkKCBlbGVtICk7Cgl9IGVsc2UgaWYgKCAiZ2V0RWxlbWVudHNCeVRhZ05hbWUiIGluIGVsZW0gKSB7CgkJalF1ZXJ5LmdyZXAoIGVsZW0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlucHV0IiksIGZpeERlZmF1bHRDaGVja2VkICk7Cgl9Cn0KCmpRdWVyeS5leHRlbmQoewoJY2xvbmU6IGZ1bmN0aW9uKCBlbGVtLCBkYXRhQW5kRXZlbnRzLCBkZWVwRGF0YUFuZEV2ZW50cyApIHsKCQl2YXIgY2xvbmUgPSBlbGVtLmNsb25lTm9kZSh0cnVlKSwKCQkJCXNyY0VsZW1lbnRzLAoJCQkJZGVzdEVsZW1lbnRzLAoJCQkJaTsKCgkJaWYgKCAoIWpRdWVyeS5zdXBwb3J0Lm5vQ2xvbmVFdmVudCB8fCAhalF1ZXJ5LnN1cHBvcnQubm9DbG9uZUNoZWNrZWQpICYmCgkJCQkoZWxlbS5ub2RlVHlwZSA9PT0gMSB8fCBlbGVtLm5vZGVUeXBlID09PSAxMSkgJiYgIWpRdWVyeS5pc1hNTERvYyhlbGVtKSApIHsKCQkJLy8gSUUgY29waWVzIGV2ZW50cyBib3VuZCB2aWEgYXR0YWNoRXZlbnQgd2hlbiB1c2luZyBjbG9uZU5vZGUuCgkJCS8vIENhbGxpbmcgZGV0YWNoRXZlbnQgb24gdGhlIGNsb25lIHdpbGwgYWxzbyByZW1vdmUgdGhlIGV2ZW50cwoJCQkvLyBmcm9tIHRoZSBvcmlnaW5hbC4gSW4gb3JkZXIgdG8gZ2V0IGFyb3VuZCB0aGlzLCB3ZSB1c2Ugc29tZQoJCQkvLyBwcm9wcmlldGFyeSBtZXRob2RzIHRvIGNsZWFyIHRoZSBldmVudHMuIFRoYW5rcyB0byBNb29Ub29scwoJCQkvLyBndXlzIGZvciB0aGlzIGhvdG5lc3MuCgoJCQljbG9uZUZpeEF0dHJpYnV0ZXMoIGVsZW0sIGNsb25lICk7CgoJCQkvLyBVc2luZyBTaXp6bGUgaGVyZSBpcyBjcmF6eSBzbG93LCBzbyB3ZSB1c2UgZ2V0RWxlbWVudHNCeVRhZ05hbWUKCQkJLy8gaW5zdGVhZAoJCQlzcmNFbGVtZW50cyA9IGdldEFsbCggZWxlbSApOwoJCQlkZXN0RWxlbWVudHMgPSBnZXRBbGwoIGNsb25lICk7CgoJCQkvLyBXZWlyZCBpdGVyYXRpb24gYmVjYXVzZSBJRSB3aWxsIHJlcGxhY2UgdGhlIGxlbmd0aCBwcm9wZXJ0eQoJCQkvLyB3aXRoIGFuIGVsZW1lbnQgaWYgeW91IGFyZSBjbG9uaW5nIHRoZSBib2R5IGFuZCBvbmUgb2YgdGhlCgkJCS8vIGVsZW1lbnRzIG9uIHRoZSBwYWdlIGhhcyBhIG5hbWUgb3IgaWQgb2YgImxlbmd0aCIKCQkJZm9yICggaSA9IDA7IHNyY0VsZW1lbnRzW2ldOyArK2kgKSB7CgkJCQkvLyBFbnN1cmUgdGhhdCB0aGUgZGVzdGluYXRpb24gbm9kZSBpcyBub3QgbnVsbDsgRml4ZXMgIzk1ODcKCQkJCWlmICggZGVzdEVsZW1lbnRzW2ldICkgewoJCQkJCWNsb25lRml4QXR0cmlidXRlcyggc3JjRWxlbWVudHNbaV0sIGRlc3RFbGVtZW50c1tpXSApOwoJCQkJfQoJCQl9CgkJfQoKCQkvLyBDb3B5IHRoZSBldmVudHMgZnJvbSB0aGUgb3JpZ2luYWwgdG8gdGhlIGNsb25lCgkJaWYgKCBkYXRhQW5kRXZlbnRzICkgewoJCQljbG9uZUNvcHlFdmVudCggZWxlbSwgY2xvbmUgKTsKCgkJCWlmICggZGVlcERhdGFBbmRFdmVudHMgKSB7CgkJCQlzcmNFbGVtZW50cyA9IGdldEFsbCggZWxlbSApOwoJCQkJZGVzdEVsZW1lbnRzID0gZ2V0QWxsKCBjbG9uZSApOwoKCQkJCWZvciAoIGkgPSAwOyBzcmNFbGVtZW50c1tpXTsgKytpICkgewoJCQkJCWNsb25lQ29weUV2ZW50KCBzcmNFbGVtZW50c1tpXSwgZGVzdEVsZW1lbnRzW2ldICk7CgkJCQl9CgkJCX0KCQl9CgoJCXNyY0VsZW1lbnRzID0gZGVzdEVsZW1lbnRzID0gbnVsbDsKCgkJLy8gUmV0dXJuIHRoZSBjbG9uZWQgc2V0CgkJcmV0dXJuIGNsb25lOwoJfSwKCgljbGVhbjogZnVuY3Rpb24oIGVsZW1zLCBjb250ZXh0LCBmcmFnbWVudCwgc2NyaXB0cyApIHsKCQl2YXIgY2hlY2tTY3JpcHRUeXBlOwoKCQljb250ZXh0ID0gY29udGV4dCB8fCBkb2N1bWVudDsKCgkJLy8gIWNvbnRleHQuY3JlYXRlRWxlbWVudCBmYWlscyBpbiBJRSB3aXRoIGFuIGVycm9yIGJ1dCByZXR1cm5zIHR5cGVvZiAnb2JqZWN0JwoJCWlmICggdHlwZW9mIGNvbnRleHQuY3JlYXRlRWxlbWVudCA9PT0gInVuZGVmaW5lZCIgKSB7CgkJCWNvbnRleHQgPSBjb250ZXh0Lm93bmVyRG9jdW1lbnQgfHwgY29udGV4dFswXSAmJiBjb250ZXh0WzBdLm93bmVyRG9jdW1lbnQgfHwgZG9jdW1lbnQ7CgkJfQoKCQl2YXIgcmV0ID0gW10sIGo7CgoJCWZvciAoIHZhciBpID0gMCwgZWxlbTsgKGVsZW0gPSBlbGVtc1tpXSkgIT0gbnVsbDsgaSsrICkgewoJCQlpZiAoIHR5cGVvZiBlbGVtID09PSAibnVtYmVyIiApIHsKCQkJCWVsZW0gKz0gIiI7CgkJCX0KCgkJCWlmICggIWVsZW0gKSB7CgkJCQljb250aW51ZTsKCQkJfQoKCQkJLy8gQ29udmVydCBodG1sIHN0cmluZyBpbnRvIERPTSBub2RlcwoJCQlpZiAoIHR5cGVvZiBlbGVtID09PSAic3RyaW5nIiApIHsKCQkJCWlmICggIXJodG1sLnRlc3QoIGVsZW0gKSApIHsKCQkJCQllbGVtID0gY29udGV4dC5jcmVhdGVUZXh0Tm9kZSggZWxlbSApOwoJCQkJfSBlbHNlIHsKCQkJCQkvLyBGaXggIlhIVE1MIi1zdHlsZSB0YWdzIGluIGFsbCBicm93c2VycwoJCQkJCWVsZW0gPSBlbGVtLnJlcGxhY2UocnhodG1sVGFnLCAiPCQxPjwvJDI+Iik7CgoJCQkJCS8vIFRyaW0gd2hpdGVzcGFjZSwgb3RoZXJ3aXNlIGluZGV4T2Ygd29uJ3Qgd29yayBhcyBleHBlY3RlZAoJCQkJCXZhciB0YWcgPSAocnRhZ05hbWUuZXhlYyggZWxlbSApIHx8IFsiIiwgIiJdKVsxXS50b0xvd2VyQ2FzZSgpLAoJCQkJCQl3cmFwID0gd3JhcE1hcFsgdGFnIF0gfHwgd3JhcE1hcC5fZGVmYXVsdCwKCQkJCQkJZGVwdGggPSB3cmFwWzBdLAoJCQkJCQlkaXYgPSBjb250ZXh0LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwoKCQkJCQkvLyBHbyB0byBodG1sIGFuZCBiYWNrLCB0aGVuIHBlZWwgb2ZmIGV4dHJhIHdyYXBwZXJzCgkJCQkJZGl2LmlubmVySFRNTCA9IHdyYXBbMV0gKyBlbGVtICsgd3JhcFsyXTsKCgkJCQkJLy8gTW92ZSB0byB0aGUgcmlnaHQgZGVwdGgKCQkJCQl3aGlsZSAoIGRlcHRoLS0gKSB7CgkJCQkJCWRpdiA9IGRpdi5sYXN0Q2hpbGQ7CgkJCQkJfQoKCQkJCQkvLyBSZW1vdmUgSUUncyBhdXRvaW5zZXJ0ZWQgPHRib2R5PiBmcm9tIHRhYmxlIGZyYWdtZW50cwoJCQkJCWlmICggIWpRdWVyeS5zdXBwb3J0LnRib2R5ICkgewoKCQkJCQkJLy8gU3RyaW5nIHdhcyBhIDx0YWJsZT4sICptYXkqIGhhdmUgc3B1cmlvdXMgPHRib2R5PgoJCQkJCQl2YXIgaGFzQm9keSA9IHJ0Ym9keS50ZXN0KGVsZW0pLAoJCQkJCQkJdGJvZHkgPSB0YWcgPT09ICJ0YWJsZSIgJiYgIWhhc0JvZHkgPwoJCQkJCQkJCWRpdi5maXJzdENoaWxkICYmIGRpdi5maXJzdENoaWxkLmNoaWxkTm9kZXMgOgoKCQkJCQkJCQkvLyBTdHJpbmcgd2FzIGEgYmFyZSA8dGhlYWQ+IG9yIDx0Zm9vdD4KCQkJCQkJCQl3cmFwWzFdID09PSAiPHRhYmxlPiIgJiYgIWhhc0JvZHkgPwoJCQkJCQkJCQlkaXYuY2hpbGROb2RlcyA6CgkJCQkJCQkJCVtdOwoKCQkJCQkJZm9yICggaiA9IHRib2R5Lmxlbmd0aCAtIDE7IGogPj0gMCA7IC0taiApIHsKCQkJCQkJCWlmICggalF1ZXJ5Lm5vZGVOYW1lKCB0Ym9keVsgaiBdLCAidGJvZHkiICkgJiYgIXRib2R5WyBqIF0uY2hpbGROb2Rlcy5sZW5ndGggKSB7CgkJCQkJCQkJdGJvZHlbIGogXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCB0Ym9keVsgaiBdICk7CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQl9CgoJCQkJCS8vIElFIGNvbXBsZXRlbHkga2lsbHMgbGVhZGluZyB3aGl0ZXNwYWNlIHdoZW4gaW5uZXJIVE1MIGlzIHVzZWQKCQkJCQlpZiAoICFqUXVlcnkuc3VwcG9ydC5sZWFkaW5nV2hpdGVzcGFjZSAmJiBybGVhZGluZ1doaXRlc3BhY2UudGVzdCggZWxlbSApICkgewoJCQkJCQlkaXYuaW5zZXJ0QmVmb3JlKCBjb250ZXh0LmNyZWF0ZVRleHROb2RlKCBybGVhZGluZ1doaXRlc3BhY2UuZXhlYyhlbGVtKVswXSApLCBkaXYuZmlyc3RDaGlsZCApOwoJCQkJCX0KCgkJCQkJZWxlbSA9IGRpdi5jaGlsZE5vZGVzOwoJCQkJfQoJCQl9CgoJCQkvLyBSZXNldHMgZGVmYXVsdENoZWNrZWQgZm9yIGFueSByYWRpb3MgYW5kIGNoZWNrYm94ZXMKCQkJLy8gYWJvdXQgdG8gYmUgYXBwZW5kZWQgdG8gdGhlIERPTSBpbiBJRSA2LzcgKCM4MDYwKQoJCQl2YXIgbGVuOwoJCQlpZiAoICFqUXVlcnkuc3VwcG9ydC5hcHBlbmRDaGVja2VkICkgewoJCQkJaWYgKCBlbGVtWzBdICYmIHR5cGVvZiAobGVuID0gZWxlbS5sZW5ndGgpID09PSAibnVtYmVyIiApIHsKCQkJCQlmb3IgKCBqID0gMDsgaiA8IGxlbjsgaisrICkgewoJCQkJCQlmaW5kSW5wdXRzKCBlbGVtW2pdICk7CgkJCQkJfQoJCQkJfSBlbHNlIHsKCQkJCQlmaW5kSW5wdXRzKCBlbGVtICk7CgkJCQl9CgkJCX0KCgkJCWlmICggZWxlbS5ub2RlVHlwZSApIHsKCQkJCXJldC5wdXNoKCBlbGVtICk7CgkJCX0gZWxzZSB7CgkJCQlyZXQgPSBqUXVlcnkubWVyZ2UoIHJldCwgZWxlbSApOwoJCQl9CgkJfQoKCQlpZiAoIGZyYWdtZW50ICkgewoJCQljaGVja1NjcmlwdFR5cGUgPSBmdW5jdGlvbiggZWxlbSApIHsKCQkJCXJldHVybiAhZWxlbS50eXBlIHx8IHJzY3JpcHRUeXBlLnRlc3QoIGVsZW0udHlwZSApOwoJCQl9OwoJCQlmb3IgKCBpID0gMDsgcmV0W2ldOyBpKysgKSB7CgkJCQlpZiAoIHNjcmlwdHMgJiYgalF1ZXJ5Lm5vZGVOYW1lKCByZXRbaV0sICJzY3JpcHQiICkgJiYgKCFyZXRbaV0udHlwZSB8fCByZXRbaV0udHlwZS50b0xvd2VyQ2FzZSgpID09PSAidGV4dC9qYXZhc2NyaXB0IikgKSB7CgkJCQkJc2NyaXB0cy5wdXNoKCByZXRbaV0ucGFyZW50Tm9kZSA/IHJldFtpXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCByZXRbaV0gKSA6IHJldFtpXSApOwoKCQkJCX0gZWxzZSB7CgkJCQkJaWYgKCByZXRbaV0ubm9kZVR5cGUgPT09IDEgKSB7CgkJCQkJCXZhciBqc1RhZ3MgPSBqUXVlcnkuZ3JlcCggcmV0W2ldLmdldEVsZW1lbnRzQnlUYWdOYW1lKCAic2NyaXB0IiApLCBjaGVja1NjcmlwdFR5cGUgKTsKCgkJCQkJCXJldC5zcGxpY2UuYXBwbHkoIHJldCwgW2kgKyAxLCAwXS5jb25jYXQoIGpzVGFncyApICk7CgkJCQkJfQoJCQkJCWZyYWdtZW50LmFwcGVuZENoaWxkKCByZXRbaV0gKTsKCQkJCX0KCQkJfQoJCX0KCgkJcmV0dXJuIHJldDsKCX0sCgoJY2xlYW5EYXRhOiBmdW5jdGlvbiggZWxlbXMgKSB7CgkJdmFyIGRhdGEsIGlkLCBjYWNoZSA9IGpRdWVyeS5jYWNoZSwgaW50ZXJuYWxLZXkgPSBqUXVlcnkuZXhwYW5kbywgc3BlY2lhbCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsLAoJCQlkZWxldGVFeHBhbmRvID0galF1ZXJ5LnN1cHBvcnQuZGVsZXRlRXhwYW5kbzsKCgkJZm9yICggdmFyIGkgPSAwLCBlbGVtOyAoZWxlbSA9IGVsZW1zW2ldKSAhPSBudWxsOyBpKysgKSB7CgkJCWlmICggZWxlbS5ub2RlTmFtZSAmJiBqUXVlcnkubm9EYXRhW2VsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKV0gKSB7CgkJCQljb250aW51ZTsKCQkJfQoKCQkJaWQgPSBlbGVtWyBqUXVlcnkuZXhwYW5kbyBdOwoKCQkJaWYgKCBpZCApIHsKCQkJCWRhdGEgPSBjYWNoZVsgaWQgXSAmJiBjYWNoZVsgaWQgXVsgaW50ZXJuYWxLZXkgXTsKCgkJCQlpZiAoIGRhdGEgJiYgZGF0YS5ldmVudHMgKSB7CgkJCQkJZm9yICggdmFyIHR5cGUgaW4gZGF0YS5ldmVudHMgKSB7CgkJCQkJCWlmICggc3BlY2lhbFsgdHlwZSBdICkgewoJCQkJCQkJalF1ZXJ5LmV2ZW50LnJlbW92ZSggZWxlbSwgdHlwZSApOwoKCQkJCQkJLy8gVGhpcyBpcyBhIHNob3J0Y3V0IHRvIGF2b2lkIGpRdWVyeS5ldmVudC5yZW1vdmUncyBvdmVyaGVhZAoJCQkJCQl9IGVsc2UgewoJCQkJCQkJalF1ZXJ5LnJlbW92ZUV2ZW50KCBlbGVtLCB0eXBlLCBkYXRhLmhhbmRsZSApOwoJCQkJCQl9CgkJCQkJfQoKCQkJCQkvLyBOdWxsIHRoZSBET00gcmVmZXJlbmNlIHRvIGF2b2lkIElFNi83LzggbGVhayAoIzcwNTQpCgkJCQkJaWYgKCBkYXRhLmhhbmRsZSApIHsKCQkJCQkJZGF0YS5oYW5kbGUuZWxlbSA9IG51bGw7CgkJCQkJfQoJCQkJfQoKCQkJCWlmICggZGVsZXRlRXhwYW5kbyApIHsKCQkJCQlkZWxldGUgZWxlbVsgalF1ZXJ5LmV4cGFuZG8gXTsKCgkJCQl9IGVsc2UgaWYgKCBlbGVtLnJlbW92ZUF0dHJpYnV0ZSApIHsKCQkJCQllbGVtLnJlbW92ZUF0dHJpYnV0ZSggalF1ZXJ5LmV4cGFuZG8gKTsKCQkJCX0KCgkJCQlkZWxldGUgY2FjaGVbIGlkIF07CgkJCX0KCQl9Cgl9Cn0pOwoKZnVuY3Rpb24gZXZhbFNjcmlwdCggaSwgZWxlbSApIHsKCWlmICggZWxlbS5zcmMgKSB7CgkJalF1ZXJ5LmFqYXgoewoJCQl1cmw6IGVsZW0uc3JjLAoJCQlhc3luYzogZmFsc2UsCgkJCWRhdGFUeXBlOiAic2NyaXB0IgoJCX0pOwoJfSBlbHNlIHsKCQlqUXVlcnkuZ2xvYmFsRXZhbCggKCBlbGVtLnRleHQgfHwgZWxlbS50ZXh0Q29udGVudCB8fCBlbGVtLmlubmVySFRNTCB8fCAiIiApLnJlcGxhY2UoIHJjbGVhblNjcmlwdCwgIi8qJDAqLyIgKSApOwoJfQoKCWlmICggZWxlbS5wYXJlbnROb2RlICkgewoJCWVsZW0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCggZWxlbSApOwoJfQp9CgoKCgp2YXIgcmFscGhhID0gL2FscGhhXChbXildKlwpL2ksCglyb3BhY2l0eSA9IC9vcGFjaXR5PShbXildKikvLAoJLy8gZml4ZWQgZm9yIElFOSwgc2VlICM4MzQ2CglydXBwZXIgPSAvKFtBLVpdfF5tcykvZywKCXJudW1weCA9IC9eLT9cZCsoPzpweCk/JC9pLAoJcm51bSA9IC9eLT9cZC8sCglycmVsTnVtID0gL14oW1wtK10pPShbXC0rLlxkZV0rKS8sCgoJY3NzU2hvdyA9IHsgcG9zaXRpb246ICJhYnNvbHV0ZSIsIHZpc2liaWxpdHk6ICJoaWRkZW4iLCBkaXNwbGF5OiAiYmxvY2siIH0sCgljc3NXaWR0aCA9IFsgIkxlZnQiLCAiUmlnaHQiIF0sCgljc3NIZWlnaHQgPSBbICJUb3AiLCAiQm90dG9tIiBdLAoJY3VyQ1NTLAoKCWdldENvbXB1dGVkU3R5bGUsCgljdXJyZW50U3R5bGU7CgpqUXVlcnkuZm4uY3NzID0gZnVuY3Rpb24oIG5hbWUsIHZhbHVlICkgewoJLy8gU2V0dGluZyAndW5kZWZpbmVkJyBpcyBhIG5vLW9wCglpZiAoIGFyZ3VtZW50cy5sZW5ndGggPT09IDIgJiYgdmFsdWUgPT09IHVuZGVmaW5lZCApIHsKCQlyZXR1cm4gdGhpczsKCX0KCglyZXR1cm4galF1ZXJ5LmFjY2VzcyggdGhpcywgbmFtZSwgdmFsdWUsIHRydWUsIGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCB2YWx1ZSApIHsKCQlyZXR1cm4gdmFsdWUgIT09IHVuZGVmaW5lZCA/CgkJCWpRdWVyeS5zdHlsZSggZWxlbSwgbmFtZSwgdmFsdWUgKSA6CgkJCWpRdWVyeS5jc3MoIGVsZW0sIG5hbWUgKTsKCX0pOwp9OwoKalF1ZXJ5LmV4dGVuZCh7CgkvLyBBZGQgaW4gc3R5bGUgcHJvcGVydHkgaG9va3MgZm9yIG92ZXJyaWRpbmcgdGhlIGRlZmF1bHQKCS8vIGJlaGF2aW9yIG9mIGdldHRpbmcgYW5kIHNldHRpbmcgYSBzdHlsZSBwcm9wZXJ0eQoJY3NzSG9va3M6IHsKCQlvcGFjaXR5OiB7CgkJCWdldDogZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkICkgewoJCQkJaWYgKCBjb21wdXRlZCApIHsKCQkJCQkvLyBXZSBzaG91bGQgYWx3YXlzIGdldCBhIG51bWJlciBiYWNrIGZyb20gb3BhY2l0eQoJCQkJCXZhciByZXQgPSBjdXJDU1MoIGVsZW0sICJvcGFjaXR5IiwgIm9wYWNpdHkiICk7CgkJCQkJcmV0dXJuIHJldCA9PT0gIiIgPyAiMSIgOiByZXQ7CgoJCQkJfSBlbHNlIHsKCQkJCQlyZXR1cm4gZWxlbS5zdHlsZS5vcGFjaXR5OwoJCQkJfQoJCQl9CgkJfQoJfSwKCgkvLyBFeGNsdWRlIHRoZSBmb2xsb3dpbmcgY3NzIHByb3BlcnRpZXMgdG8gYWRkIHB4Cgljc3NOdW1iZXI6IHsKCQkiZmlsbE9wYWNpdHkiOiB0cnVlLAoJCSJmb250V2VpZ2h0IjogdHJ1ZSwKCQkibGluZUhlaWdodCI6IHRydWUsCgkJIm9wYWNpdHkiOiB0cnVlLAoJCSJvcnBoYW5zIjogdHJ1ZSwKCQkid2lkb3dzIjogdHJ1ZSwKCQkiekluZGV4IjogdHJ1ZSwKCQkiem9vbSI6IHRydWUKCX0sCgoJLy8gQWRkIGluIHByb3BlcnRpZXMgd2hvc2UgbmFtZXMgeW91IHdpc2ggdG8gZml4IGJlZm9yZQoJLy8gc2V0dGluZyBvciBnZXR0aW5nIHRoZSB2YWx1ZQoJY3NzUHJvcHM6IHsKCQkvLyBub3JtYWxpemUgZmxvYXQgY3NzIHByb3BlcnR5CgkJImZsb2F0IjogalF1ZXJ5LnN1cHBvcnQuY3NzRmxvYXQgPyAiY3NzRmxvYXQiIDogInN0eWxlRmxvYXQiCgl9LAoKCS8vIEdldCBhbmQgc2V0IHRoZSBzdHlsZSBwcm9wZXJ0eSBvbiBhIERPTSBOb2RlCglzdHlsZTogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIHZhbHVlLCBleHRyYSApIHsKCQkvLyBEb24ndCBzZXQgc3R5bGVzIG9uIHRleHQgYW5kIGNvbW1lbnQgbm9kZXMKCQlpZiAoICFlbGVtIHx8IGVsZW0ubm9kZVR5cGUgPT09IDMgfHwgZWxlbS5ub2RlVHlwZSA9PT0gOCB8fCAhZWxlbS5zdHlsZSApIHsKCQkJcmV0dXJuOwoJCX0KCgkJLy8gTWFrZSBzdXJlIHRoYXQgd2UncmUgd29ya2luZyB3aXRoIHRoZSByaWdodCBuYW1lCgkJdmFyIHJldCwgdHlwZSwgb3JpZ05hbWUgPSBqUXVlcnkuY2FtZWxDYXNlKCBuYW1lICksCgkJCXN0eWxlID0gZWxlbS5zdHlsZSwgaG9va3MgPSBqUXVlcnkuY3NzSG9va3NbIG9yaWdOYW1lIF07CgoJCW5hbWUgPSBqUXVlcnkuY3NzUHJvcHNbIG9yaWdOYW1lIF0gfHwgb3JpZ05hbWU7CgoJCS8vIENoZWNrIGlmIHdlJ3JlIHNldHRpbmcgYSB2YWx1ZQoJCWlmICggdmFsdWUgIT09IHVuZGVmaW5lZCApIHsKCQkJdHlwZSA9IHR5cGVvZiB2YWx1ZTsKCgkJCS8vIGNvbnZlcnQgcmVsYXRpdmUgbnVtYmVyIHN0cmluZ3MgKCs9IG9yIC09KSB0byByZWxhdGl2ZSBudW1iZXJzLiAjNzM0NQoJCQlpZiAoIHR5cGUgPT09ICJzdHJpbmciICYmIChyZXQgPSBycmVsTnVtLmV4ZWMoIHZhbHVlICkpICkgewoJCQkJdmFsdWUgPSAoICsoIHJldFsxXSArIDEpICogK3JldFsyXSApICsgcGFyc2VGbG9hdCggalF1ZXJ5LmNzcyggZWxlbSwgbmFtZSApICk7CgkJCQkvLyBGaXhlcyBidWcgIzkyMzcKCQkJCXR5cGUgPSAibnVtYmVyIjsKCQkJfQoKCQkJLy8gTWFrZSBzdXJlIHRoYXQgTmFOIGFuZCBudWxsIHZhbHVlcyBhcmVuJ3Qgc2V0LiBTZWU6ICM3MTE2CgkJCWlmICggdmFsdWUgPT0gbnVsbCB8fCB0eXBlID09PSAibnVtYmVyIiAmJiBpc05hTiggdmFsdWUgKSApIHsKCQkJCXJldHVybjsKCQkJfQoKCQkJLy8gSWYgYSBudW1iZXIgd2FzIHBhc3NlZCBpbiwgYWRkICdweCcgdG8gdGhlIChleGNlcHQgZm9yIGNlcnRhaW4gQ1NTIHByb3BlcnRpZXMpCgkJCWlmICggdHlwZSA9PT0gIm51bWJlciIgJiYgIWpRdWVyeS5jc3NOdW1iZXJbIG9yaWdOYW1lIF0gKSB7CgkJCQl2YWx1ZSArPSAicHgiOwoJCQl9CgoJCQkvLyBJZiBhIGhvb2sgd2FzIHByb3ZpZGVkLCB1c2UgdGhhdCB2YWx1ZSwgb3RoZXJ3aXNlIGp1c3Qgc2V0IHRoZSBzcGVjaWZpZWQgdmFsdWUKCQkJaWYgKCAhaG9va3MgfHwgISgic2V0IiBpbiBob29rcykgfHwgKHZhbHVlID0gaG9va3Muc2V0KCBlbGVtLCB2YWx1ZSApKSAhPT0gdW5kZWZpbmVkICkgewoJCQkJLy8gV3JhcHBlZCB0byBwcmV2ZW50IElFIGZyb20gdGhyb3dpbmcgZXJyb3JzIHdoZW4gJ2ludmFsaWQnIHZhbHVlcyBhcmUgcHJvdmlkZWQKCQkJCS8vIEZpeGVzIGJ1ZyAjNTUwOQoJCQkJdHJ5IHsKCQkJCQlzdHlsZVsgbmFtZSBdID0gdmFsdWU7CgkJCQl9IGNhdGNoKGUpIHt9CgkJCX0KCgkJfSBlbHNlIHsKCQkJLy8gSWYgYSBob29rIHdhcyBwcm92aWRlZCBnZXQgdGhlIG5vbi1jb21wdXRlZCB2YWx1ZSBmcm9tIHRoZXJlCgkJCWlmICggaG9va3MgJiYgImdldCIgaW4gaG9va3MgJiYgKHJldCA9IGhvb2tzLmdldCggZWxlbSwgZmFsc2UsIGV4dHJhICkpICE9PSB1bmRlZmluZWQgKSB7CgkJCQlyZXR1cm4gcmV0OwoJCQl9CgoJCQkvLyBPdGhlcndpc2UganVzdCBnZXQgdGhlIHZhbHVlIGZyb20gdGhlIHN0eWxlIG9iamVjdAoJCQlyZXR1cm4gc3R5bGVbIG5hbWUgXTsKCQl9Cgl9LAoKCWNzczogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGV4dHJhICkgewoJCXZhciByZXQsIGhvb2tzOwoKCQkvLyBNYWtlIHN1cmUgdGhhdCB3ZSdyZSB3b3JraW5nIHdpdGggdGhlIHJpZ2h0IG5hbWUKCQluYW1lID0galF1ZXJ5LmNhbWVsQ2FzZSggbmFtZSApOwoJCWhvb2tzID0galF1ZXJ5LmNzc0hvb2tzWyBuYW1lIF07CgkJbmFtZSA9IGpRdWVyeS5jc3NQcm9wc1sgbmFtZSBdIHx8IG5hbWU7CgoJCS8vIGNzc0Zsb2F0IG5lZWRzIGEgc3BlY2lhbCB0cmVhdG1lbnQKCQlpZiAoIG5hbWUgPT09ICJjc3NGbG9hdCIgKSB7CgkJCW5hbWUgPSAiZmxvYXQiOwoJCX0KCgkJLy8gSWYgYSBob29rIHdhcyBwcm92aWRlZCBnZXQgdGhlIGNvbXB1dGVkIHZhbHVlIGZyb20gdGhlcmUKCQlpZiAoIGhvb2tzICYmICJnZXQiIGluIGhvb2tzICYmIChyZXQgPSBob29rcy5nZXQoIGVsZW0sIHRydWUsIGV4dHJhICkpICE9PSB1bmRlZmluZWQgKSB7CgkJCXJldHVybiByZXQ7CgoJCS8vIE90aGVyd2lzZSwgaWYgYSB3YXkgdG8gZ2V0IHRoZSBjb21wdXRlZCB2YWx1ZSBleGlzdHMsIHVzZSB0aGF0CgkJfSBlbHNlIGlmICggY3VyQ1NTICkgewoJCQlyZXR1cm4gY3VyQ1NTKCBlbGVtLCBuYW1lICk7CgkJfQoJfSwKCgkvLyBBIG1ldGhvZCBmb3IgcXVpY2tseSBzd2FwcGluZyBpbi9vdXQgQ1NTIHByb3BlcnRpZXMgdG8gZ2V0IGNvcnJlY3QgY2FsY3VsYXRpb25zCglzd2FwOiBmdW5jdGlvbiggZWxlbSwgb3B0aW9ucywgY2FsbGJhY2sgKSB7CgkJdmFyIG9sZCA9IHt9OwoKCQkvLyBSZW1lbWJlciB0aGUgb2xkIHZhbHVlcywgYW5kIGluc2VydCB0aGUgbmV3IG9uZXMKCQlmb3IgKCB2YXIgbmFtZSBpbiBvcHRpb25zICkgewoJCQlvbGRbIG5hbWUgXSA9IGVsZW0uc3R5bGVbIG5hbWUgXTsKCQkJZWxlbS5zdHlsZVsgbmFtZSBdID0gb3B0aW9uc1sgbmFtZSBdOwoJCX0KCgkJY2FsbGJhY2suY2FsbCggZWxlbSApOwoKCQkvLyBSZXZlcnQgdGhlIG9sZCB2YWx1ZXMKCQlmb3IgKCBuYW1lIGluIG9wdGlvbnMgKSB7CgkJCWVsZW0uc3R5bGVbIG5hbWUgXSA9IG9sZFsgbmFtZSBdOwoJCX0KCX0KfSk7CgovLyBERVBSRUNBVEVELCBVc2UgalF1ZXJ5LmNzcygpIGluc3RlYWQKalF1ZXJ5LmN1ckNTUyA9IGpRdWVyeS5jc3M7CgpqUXVlcnkuZWFjaChbImhlaWdodCIsICJ3aWR0aCJdLCBmdW5jdGlvbiggaSwgbmFtZSApIHsKCWpRdWVyeS5jc3NIb29rc1sgbmFtZSBdID0gewoJCWdldDogZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkLCBleHRyYSApIHsKCQkJdmFyIHZhbDsKCgkJCWlmICggY29tcHV0ZWQgKSB7CgkJCQlpZiAoIGVsZW0ub2Zmc2V0V2lkdGggIT09IDAgKSB7CgkJCQkJcmV0dXJuIGdldFdIKCBlbGVtLCBuYW1lLCBleHRyYSApOwoJCQkJfSBlbHNlIHsKCQkJCQlqUXVlcnkuc3dhcCggZWxlbSwgY3NzU2hvdywgZnVuY3Rpb24oKSB7CgkJCQkJCXZhbCA9IGdldFdIKCBlbGVtLCBuYW1lLCBleHRyYSApOwoJCQkJCX0pOwoJCQkJfQoKCQkJCXJldHVybiB2YWw7CgkJCX0KCQl9LAoKCQlzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSApIHsKCQkJaWYgKCBybnVtcHgudGVzdCggdmFsdWUgKSApIHsKCQkJCS8vIGlnbm9yZSBuZWdhdGl2ZSB3aWR0aCBhbmQgaGVpZ2h0IHZhbHVlcyAjMTU5OQoJCQkJdmFsdWUgPSBwYXJzZUZsb2F0KCB2YWx1ZSApOwoKCQkJCWlmICggdmFsdWUgPj0gMCApIHsKCQkJCQlyZXR1cm4gdmFsdWUgKyAicHgiOwoJCQkJfQoKCQkJfSBlbHNlIHsKCQkJCXJldHVybiB2YWx1ZTsKCQkJfQoJCX0KCX07Cn0pOwoKaWYgKCAhalF1ZXJ5LnN1cHBvcnQub3BhY2l0eSApIHsKCWpRdWVyeS5jc3NIb29rcy5vcGFjaXR5ID0gewoJCWdldDogZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkICkgewoJCQkvLyBJRSB1c2VzIGZpbHRlcnMgZm9yIG9wYWNpdHkKCQkJcmV0dXJuIHJvcGFjaXR5LnRlc3QoIChjb21wdXRlZCAmJiBlbGVtLmN1cnJlbnRTdHlsZSA/IGVsZW0uY3VycmVudFN0eWxlLmZpbHRlciA6IGVsZW0uc3R5bGUuZmlsdGVyKSB8fCAiIiApID8KCQkJCSggcGFyc2VGbG9hdCggUmVnRXhwLiQxICkgLyAxMDAgKSArICIiIDoKCQkJCWNvbXB1dGVkID8gIjEiIDogIiI7CgkJfSwKCgkJc2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUgKSB7CgkJCXZhciBzdHlsZSA9IGVsZW0uc3R5bGUsCgkJCQljdXJyZW50U3R5bGUgPSBlbGVtLmN1cnJlbnRTdHlsZSwKCQkJCW9wYWNpdHkgPSBqUXVlcnkuaXNOYU4oIHZhbHVlICkgPyAiIiA6ICJhbHBoYShvcGFjaXR5PSIgKyB2YWx1ZSAqIDEwMCArICIpIiwKCQkJCWZpbHRlciA9IGN1cnJlbnRTdHlsZSAmJiBjdXJyZW50U3R5bGUuZmlsdGVyIHx8IHN0eWxlLmZpbHRlciB8fCAiIjsKCgkJCS8vIElFIGhhcyB0cm91YmxlIHdpdGggb3BhY2l0eSBpZiBpdCBkb2VzIG5vdCBoYXZlIGxheW91dAoJCQkvLyBGb3JjZSBpdCBieSBzZXR0aW5nIHRoZSB6b29tIGxldmVsCgkJCXN0eWxlLnpvb20gPSAxOwoKCQkJLy8gaWYgc2V0dGluZyBvcGFjaXR5IHRvIDEsIGFuZCBubyBvdGhlciBmaWx0ZXJzIGV4aXN0IC0gYXR0ZW1wdCB0byByZW1vdmUgZmlsdGVyIGF0dHJpYnV0ZSAjNjY1MgoJCQlpZiAoIHZhbHVlID49IDEgJiYgalF1ZXJ5LnRyaW0oIGZpbHRlci5yZXBsYWNlKCByYWxwaGEsICIiICkgKSA9PT0gIiIgKSB7CgoJCQkJLy8gU2V0dGluZyBzdHlsZS5maWx0ZXIgdG8gbnVsbCwgIiIgJiAiICIgc3RpbGwgbGVhdmUgImZpbHRlcjoiIGluIHRoZSBjc3NUZXh0CgkJCQkvLyBpZiAiZmlsdGVyOiIgaXMgcHJlc2VudCBhdCBhbGwsIGNsZWFyVHlwZSBpcyBkaXNhYmxlZCwgd2Ugd2FudCB0byBhdm9pZCB0aGlzCgkJCQkvLyBzdHlsZS5yZW1vdmVBdHRyaWJ1dGUgaXMgSUUgT25seSwgYnV0IHNvIGFwcGFyZW50bHkgaXMgdGhpcyBjb2RlIHBhdGguLi4KCQkJCXN0eWxlLnJlbW92ZUF0dHJpYnV0ZSggImZpbHRlciIgKTsKCgkJCQkvLyBpZiB0aGVyZSB0aGVyZSBpcyBubyBmaWx0ZXIgc3R5bGUgYXBwbGllZCBpbiBhIGNzcyBydWxlLCB3ZSBhcmUgZG9uZQoJCQkJaWYgKCBjdXJyZW50U3R5bGUgJiYgIWN1cnJlbnRTdHlsZS5maWx0ZXIgKSB7CgkJCQkJcmV0dXJuOwoJCQkJfQoJCQl9CgoJCQkvLyBvdGhlcndpc2UsIHNldCBuZXcgZmlsdGVyIHZhbHVlcwoJCQlzdHlsZS5maWx0ZXIgPSByYWxwaGEudGVzdCggZmlsdGVyICkgPwoJCQkJZmlsdGVyLnJlcGxhY2UoIHJhbHBoYSwgb3BhY2l0eSApIDoKCQkJCWZpbHRlciArICIgIiArIG9wYWNpdHk7CgkJfQoJfTsKfQoKalF1ZXJ5KGZ1bmN0aW9uKCkgewoJLy8gVGhpcyBob29rIGNhbm5vdCBiZSBhZGRlZCB1bnRpbCBET00gcmVhZHkgYmVjYXVzZSB0aGUgc3VwcG9ydCB0ZXN0CgkvLyBmb3IgaXQgaXMgbm90IHJ1biB1bnRpbCBhZnRlciBET00gcmVhZHkKCWlmICggIWpRdWVyeS5zdXBwb3J0LnJlbGlhYmxlTWFyZ2luUmlnaHQgKSB7CgkJalF1ZXJ5LmNzc0hvb2tzLm1hcmdpblJpZ2h0ID0gewoJCQlnZXQ6IGZ1bmN0aW9uKCBlbGVtLCBjb21wdXRlZCApIHsKCQkJCS8vIFdlYktpdCBCdWcgMTMzNDMgLSBnZXRDb21wdXRlZFN0eWxlIHJldHVybnMgd3JvbmcgdmFsdWUgZm9yIG1hcmdpbi1yaWdodAoJCQkJLy8gV29yayBhcm91bmQgYnkgdGVtcG9yYXJpbHkgc2V0dGluZyBlbGVtZW50IGRpc3BsYXkgdG8gaW5saW5lLWJsb2NrCgkJCQl2YXIgcmV0OwoJCQkJalF1ZXJ5LnN3YXAoIGVsZW0sIHsgImRpc3BsYXkiOiAiaW5saW5lLWJsb2NrIiB9LCBmdW5jdGlvbigpIHsKCQkJCQlpZiAoIGNvbXB1dGVkICkgewoJCQkJCQlyZXQgPSBjdXJDU1MoIGVsZW0sICJtYXJnaW4tcmlnaHQiLCAibWFyZ2luUmlnaHQiICk7CgkJCQkJfSBlbHNlIHsKCQkJCQkJcmV0ID0gZWxlbS5zdHlsZS5tYXJnaW5SaWdodDsKCQkJCQl9CgkJCQl9KTsKCQkJCXJldHVybiByZXQ7CgkJCX0KCQl9OwoJfQp9KTsKCmlmICggZG9jdW1lbnQuZGVmYXVsdFZpZXcgJiYgZG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSApIHsKCWdldENvbXB1dGVkU3R5bGUgPSBmdW5jdGlvbiggZWxlbSwgbmFtZSApIHsKCQl2YXIgcmV0LCBkZWZhdWx0VmlldywgY29tcHV0ZWRTdHlsZTsKCgkJbmFtZSA9IG5hbWUucmVwbGFjZSggcnVwcGVyLCAiLSQxIiApLnRvTG93ZXJDYXNlKCk7CgoJCWlmICggIShkZWZhdWx0VmlldyA9IGVsZW0ub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldykgKSB7CgkJCXJldHVybiB1bmRlZmluZWQ7CgkJfQoKCQlpZiAoIChjb21wdXRlZFN0eWxlID0gZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSggZWxlbSwgbnVsbCApKSApIHsKCQkJcmV0ID0gY29tcHV0ZWRTdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCBuYW1lICk7CgkJCWlmICggcmV0ID09PSAiIiAmJiAhalF1ZXJ5LmNvbnRhaW5zKCBlbGVtLm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCBlbGVtICkgKSB7CgkJCQlyZXQgPSBqUXVlcnkuc3R5bGUoIGVsZW0sIG5hbWUgKTsKCQkJfQoJCX0KCgkJcmV0dXJuIHJldDsKCX07Cn0KCmlmICggZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmN1cnJlbnRTdHlsZSApIHsKCWN1cnJlbnRTdHlsZSA9IGZ1bmN0aW9uKCBlbGVtLCBuYW1lICkgewoJCXZhciBsZWZ0LAoJCQlyZXQgPSBlbGVtLmN1cnJlbnRTdHlsZSAmJiBlbGVtLmN1cnJlbnRTdHlsZVsgbmFtZSBdLAoJCQlyc0xlZnQgPSBlbGVtLnJ1bnRpbWVTdHlsZSAmJiBlbGVtLnJ1bnRpbWVTdHlsZVsgbmFtZSBdLAoJCQlzdHlsZSA9IGVsZW0uc3R5bGU7CgoJCS8vIEZyb20gdGhlIGF3ZXNvbWUgaGFjayBieSBEZWFuIEVkd2FyZHMKCQkvLyBodHRwOi8vZXJpay5lYWUubmV0L2FyY2hpdmVzLzIwMDcvMDcvMjcvMTguNTQuMTUvI2NvbW1lbnQtMTAyMjkxCgoJCS8vIElmIHdlJ3JlIG5vdCBkZWFsaW5nIHdpdGggYSByZWd1bGFyIHBpeGVsIG51bWJlcgoJCS8vIGJ1dCBhIG51bWJlciB0aGF0IGhhcyBhIHdlaXJkIGVuZGluZywgd2UgbmVlZCB0byBjb252ZXJ0IGl0IHRvIHBpeGVscwoJCWlmICggIXJudW1weC50ZXN0KCByZXQgKSAmJiBybnVtLnRlc3QoIHJldCApICkgewoJCQkvLyBSZW1lbWJlciB0aGUgb3JpZ2luYWwgdmFsdWVzCgkJCWxlZnQgPSBzdHlsZS5sZWZ0OwoKCQkJLy8gUHV0IGluIHRoZSBuZXcgdmFsdWVzIHRvIGdldCBhIGNvbXB1dGVkIHZhbHVlIG91dAoJCQlpZiAoIHJzTGVmdCApIHsKCQkJCWVsZW0ucnVudGltZVN0eWxlLmxlZnQgPSBlbGVtLmN1cnJlbnRTdHlsZS5sZWZ0OwoJCQl9CgkJCXN0eWxlLmxlZnQgPSBuYW1lID09PSAiZm9udFNpemUiID8gIjFlbSIgOiAocmV0IHx8IDApOwoJCQlyZXQgPSBzdHlsZS5waXhlbExlZnQgKyAicHgiOwoKCQkJLy8gUmV2ZXJ0IHRoZSBjaGFuZ2VkIHZhbHVlcwoJCQlzdHlsZS5sZWZ0ID0gbGVmdDsKCQkJaWYgKCByc0xlZnQgKSB7CgkJCQllbGVtLnJ1bnRpbWVTdHlsZS5sZWZ0ID0gcnNMZWZ0OwoJCQl9CgkJfQoKCQlyZXR1cm4gcmV0ID09PSAiIiA/ICJhdXRvIiA6IHJldDsKCX07Cn0KCmN1ckNTUyA9IGdldENvbXB1dGVkU3R5bGUgfHwgY3VycmVudFN0eWxlOwoKZnVuY3Rpb24gZ2V0V0goIGVsZW0sIG5hbWUsIGV4dHJhICkgewoKCS8vIFN0YXJ0IHdpdGggb2Zmc2V0IHByb3BlcnR5Cgl2YXIgdmFsID0gbmFtZSA9PT0gIndpZHRoIiA/IGVsZW0ub2Zmc2V0V2lkdGggOiBlbGVtLm9mZnNldEhlaWdodCwKCQl3aGljaCA9IG5hbWUgPT09ICJ3aWR0aCIgPyBjc3NXaWR0aCA6IGNzc0hlaWdodDsKCglpZiAoIHZhbCA+IDAgKSB7CgkJaWYgKCBleHRyYSAhPT0gImJvcmRlciIgKSB7CgkJCWpRdWVyeS5lYWNoKCB3aGljaCwgZnVuY3Rpb24oKSB7CgkJCQlpZiAoICFleHRyYSApIHsKCQkJCQl2YWwgLT0gcGFyc2VGbG9hdCggalF1ZXJ5LmNzcyggZWxlbSwgInBhZGRpbmciICsgdGhpcyApICkgfHwgMDsKCQkJCX0KCQkJCWlmICggZXh0cmEgPT09ICJtYXJnaW4iICkgewoJCQkJCXZhbCArPSBwYXJzZUZsb2F0KCBqUXVlcnkuY3NzKCBlbGVtLCBleHRyYSArIHRoaXMgKSApIHx8IDA7CgkJCQl9IGVsc2UgewoJCQkJCXZhbCAtPSBwYXJzZUZsb2F0KCBqUXVlcnkuY3NzKCBlbGVtLCAiYm9yZGVyIiArIHRoaXMgKyAiV2lkdGgiICkgKSB8fCAwOwoJCQkJfQoJCQl9KTsKCQl9CgoJCXJldHVybiB2YWwgKyAicHgiOwoJfQoKCS8vIEZhbGwgYmFjayB0byBjb21wdXRlZCB0aGVuIHVuY29tcHV0ZWQgY3NzIGlmIG5lY2Vzc2FyeQoJdmFsID0gY3VyQ1NTKCBlbGVtLCBuYW1lLCBuYW1lICk7CglpZiAoIHZhbCA8IDAgfHwgdmFsID09IG51bGwgKSB7CgkJdmFsID0gZWxlbS5zdHlsZVsgbmFtZSBdIHx8IDA7Cgl9CgkvLyBOb3JtYWxpemUgIiIsIGF1dG8sIGFuZCBwcmVwYXJlIGZvciBleHRyYQoJdmFsID0gcGFyc2VGbG9hdCggdmFsICkgfHwgMDsKCgkvLyBBZGQgcGFkZGluZywgYm9yZGVyLCBtYXJnaW4KCWlmICggZXh0cmEgKSB7CgkJalF1ZXJ5LmVhY2goIHdoaWNoLCBmdW5jdGlvbigpIHsKCQkJdmFsICs9IHBhcnNlRmxvYXQoIGpRdWVyeS5jc3MoIGVsZW0sICJwYWRkaW5nIiArIHRoaXMgKSApIHx8IDA7CgkJCWlmICggZXh0cmEgIT09ICJwYWRkaW5nIiApIHsKCQkJCXZhbCArPSBwYXJzZUZsb2F0KCBqUXVlcnkuY3NzKCBlbGVtLCAiYm9yZGVyIiArIHRoaXMgKyAiV2lkdGgiICkgKSB8fCAwOwoJCQl9CgkJCWlmICggZXh0cmEgPT09ICJtYXJnaW4iICkgewoJCQkJdmFsICs9IHBhcnNlRmxvYXQoIGpRdWVyeS5jc3MoIGVsZW0sIGV4dHJhICsgdGhpcyApICkgfHwgMDsKCQkJfQoJCX0pOwoJfQoKCXJldHVybiB2YWwgKyAicHgiOwp9CgppZiAoIGpRdWVyeS5leHByICYmIGpRdWVyeS5leHByLmZpbHRlcnMgKSB7CglqUXVlcnkuZXhwci5maWx0ZXJzLmhpZGRlbiA9IGZ1bmN0aW9uKCBlbGVtICkgewoJCXZhciB3aWR0aCA9IGVsZW0ub2Zmc2V0V2lkdGgsCgkJCWhlaWdodCA9IGVsZW0ub2Zmc2V0SGVpZ2h0OwoKCQlyZXR1cm4gKHdpZHRoID09PSAwICYmIGhlaWdodCA9PT0gMCkgfHwgKCFqUXVlcnkuc3VwcG9ydC5yZWxpYWJsZUhpZGRlbk9mZnNldHMgJiYgKGVsZW0uc3R5bGUuZGlzcGxheSB8fCBqUXVlcnkuY3NzKCBlbGVtLCAiZGlzcGxheSIgKSkgPT09ICJub25lIik7Cgl9OwoKCWpRdWVyeS5leHByLmZpbHRlcnMudmlzaWJsZSA9IGZ1bmN0aW9uKCBlbGVtICkgewoJCXJldHVybiAhalF1ZXJ5LmV4cHIuZmlsdGVycy5oaWRkZW4oIGVsZW0gKTsKCX07Cn0KCgoKCnZhciByMjAgPSAvJTIwL2csCglyYnJhY2tldCA9IC9cW1xdJC8sCglyQ1JMRiA9IC9ccj9cbi9nLAoJcmhhc2ggPSAvIy4qJC8sCglyaGVhZGVycyA9IC9eKC4qPyk6WyBcdF0qKFteXHJcbl0qKVxyPyQvbWcsIC8vIElFIGxlYXZlcyBhbiBcciBjaGFyYWN0ZXIgYXQgRU9MCglyaW5wdXQgPSAvXig/OmNvbG9yfGRhdGV8ZGF0ZXRpbWV8ZGF0ZXRpbWUtbG9jYWx8ZW1haWx8aGlkZGVufG1vbnRofG51bWJlcnxwYXNzd29yZHxyYW5nZXxzZWFyY2h8dGVsfHRleHR8dGltZXx1cmx8d2VlaykkL2ksCgkvLyAjNzY1MywgIzgxMjUsICM4MTUyOiBsb2NhbCBwcm90b2NvbCBkZXRlY3Rpb24KCXJsb2NhbFByb3RvY29sID0gL14oPzphYm91dHxhcHB8YXBwXC1zdG9yYWdlfC4rXC1leHRlbnNpb258ZmlsZXxyZXN8d2lkZ2V0KTokLywKCXJub0NvbnRlbnQgPSAvXig/OkdFVHxIRUFEKSQvLAoJcnByb3RvY29sID0gL15cL1wvLywKCXJxdWVyeSA9IC9cPy8sCglyc2NyaXB0ID0gLzxzY3JpcHRcYltePF0qKD86KD8hPFwvc2NyaXB0Pik8W148XSopKjxcL3NjcmlwdD4vZ2ksCglyc2VsZWN0VGV4dGFyZWEgPSAvXig/OnNlbGVjdHx0ZXh0YXJlYSkvaSwKCXJzcGFjZXNBamF4ID0gL1xzKy8sCglydHMgPSAvKFs/Jl0pXz1bXiZdKi8sCglydXJsID0gL14oW1x3XCtcLlwtXSs6KSg/OlwvXC8oW15cLz8jOl0qKSg/OjooXGQrKSk/KT8vLAoKCS8vIEtlZXAgYSBjb3B5IG9mIHRoZSBvbGQgbG9hZCBtZXRob2QKCV9sb2FkID0galF1ZXJ5LmZuLmxvYWQsCgoJLyogUHJlZmlsdGVycwoJICogMSkgVGhleSBhcmUgdXNlZnVsIHRvIGludHJvZHVjZSBjdXN0b20gZGF0YVR5cGVzIChzZWUgYWpheC9qc29ucC5qcyBmb3IgYW4gZXhhbXBsZSkKCSAqIDIpIFRoZXNlIGFyZSBjYWxsZWQ6CgkgKiAgICAtIEJFRk9SRSBhc2tpbmcgZm9yIGEgdHJhbnNwb3J0CgkgKiAgICAtIEFGVEVSIHBhcmFtIHNlcmlhbGl6YXRpb24gKHMuZGF0YSBpcyBhIHN0cmluZyBpZiBzLnByb2Nlc3NEYXRhIGlzIHRydWUpCgkgKiAzKSBrZXkgaXMgdGhlIGRhdGFUeXBlCgkgKiA0KSB0aGUgY2F0Y2hhbGwgc3ltYm9sICIqIiBjYW4gYmUgdXNlZAoJICogNSkgZXhlY3V0aW9uIHdpbGwgc3RhcnQgd2l0aCB0cmFuc3BvcnQgZGF0YVR5cGUgYW5kIFRIRU4gY29udGludWUgZG93biB0byAiKiIgaWYgbmVlZGVkCgkgKi8KCXByZWZpbHRlcnMgPSB7fSwKCgkvKiBUcmFuc3BvcnRzIGJpbmRpbmdzCgkgKiAxKSBrZXkgaXMgdGhlIGRhdGFUeXBlCgkgKiAyKSB0aGUgY2F0Y2hhbGwgc3ltYm9sICIqIiBjYW4gYmUgdXNlZAoJICogMykgc2VsZWN0aW9uIHdpbGwgc3RhcnQgd2l0aCB0cmFuc3BvcnQgZGF0YVR5cGUgYW5kIFRIRU4gZ28gdG8gIioiIGlmIG5lZWRlZAoJICovCgl0cmFuc3BvcnRzID0ge30sCgoJLy8gRG9jdW1lbnQgbG9jYXRpb24KCWFqYXhMb2NhdGlvbiwKCgkvLyBEb2N1bWVudCBsb2NhdGlvbiBzZWdtZW50cwoJYWpheExvY1BhcnRzLAoJCgkvLyBBdm9pZCBjb21tZW50LXByb2xvZyBjaGFyIHNlcXVlbmNlICgjMTAwOTgpOyBtdXN0IGFwcGVhc2UgbGludCBhbmQgZXZhZGUgY29tcHJlc3Npb24KCWFsbFR5cGVzID0gWyIqLyJdICsgWyIqIl07CgovLyAjODEzOCwgSUUgbWF5IHRocm93IGFuIGV4Y2VwdGlvbiB3aGVuIGFjY2Vzc2luZwovLyBhIGZpZWxkIGZyb20gd2luZG93LmxvY2F0aW9uIGlmIGRvY3VtZW50LmRvbWFpbiBoYXMgYmVlbiBzZXQKdHJ5IHsKCWFqYXhMb2NhdGlvbiA9IGxvY2F0aW9uLmhyZWY7Cn0gY2F0Y2goIGUgKSB7CgkvLyBVc2UgdGhlIGhyZWYgYXR0cmlidXRlIG9mIGFuIEEgZWxlbWVudAoJLy8gc2luY2UgSUUgd2lsbCBtb2RpZnkgaXQgZ2l2ZW4gZG9jdW1lbnQubG9jYXRpb24KCWFqYXhMb2NhdGlvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICJhIiApOwoJYWpheExvY2F0aW9uLmhyZWYgPSAiIjsKCWFqYXhMb2NhdGlvbiA9IGFqYXhMb2NhdGlvbi5ocmVmOwp9CgovLyBTZWdtZW50IGxvY2F0aW9uIGludG8gcGFydHMKYWpheExvY1BhcnRzID0gcnVybC5leGVjKCBhamF4TG9jYXRpb24udG9Mb3dlckNhc2UoKSApIHx8IFtdOwoKLy8gQmFzZSAiY29uc3RydWN0b3IiIGZvciBqUXVlcnkuYWpheFByZWZpbHRlciBhbmQgalF1ZXJ5LmFqYXhUcmFuc3BvcnQKZnVuY3Rpb24gYWRkVG9QcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCBzdHJ1Y3R1cmUgKSB7CgoJLy8gZGF0YVR5cGVFeHByZXNzaW9uIGlzIG9wdGlvbmFsIGFuZCBkZWZhdWx0cyB0byAiKiIKCXJldHVybiBmdW5jdGlvbiggZGF0YVR5cGVFeHByZXNzaW9uLCBmdW5jICkgewoKCQlpZiAoIHR5cGVvZiBkYXRhVHlwZUV4cHJlc3Npb24gIT09ICJzdHJpbmciICkgewoJCQlmdW5jID0gZGF0YVR5cGVFeHByZXNzaW9uOwoJCQlkYXRhVHlwZUV4cHJlc3Npb24gPSAiKiI7CgkJfQoKCQlpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBmdW5jICkgKSB7CgkJCXZhciBkYXRhVHlwZXMgPSBkYXRhVHlwZUV4cHJlc3Npb24udG9Mb3dlckNhc2UoKS5zcGxpdCggcnNwYWNlc0FqYXggKSwKCQkJCWkgPSAwLAoJCQkJbGVuZ3RoID0gZGF0YVR5cGVzLmxlbmd0aCwKCQkJCWRhdGFUeXBlLAoJCQkJbGlzdCwKCQkJCXBsYWNlQmVmb3JlOwoKCQkJLy8gRm9yIGVhY2ggZGF0YVR5cGUgaW4gdGhlIGRhdGFUeXBlRXhwcmVzc2lvbgoJCQlmb3IoOyBpIDwgbGVuZ3RoOyBpKysgKSB7CgkJCQlkYXRhVHlwZSA9IGRhdGFUeXBlc1sgaSBdOwoJCQkJLy8gV2UgY29udHJvbCBpZiB3ZSdyZSBhc2tlZCB0byBhZGQgYmVmb3JlCgkJCQkvLyBhbnkgZXhpc3RpbmcgZWxlbWVudAoJCQkJcGxhY2VCZWZvcmUgPSAvXlwrLy50ZXN0KCBkYXRhVHlwZSApOwoJCQkJaWYgKCBwbGFjZUJlZm9yZSApIHsKCQkJCQlkYXRhVHlwZSA9IGRhdGFUeXBlLnN1YnN0ciggMSApIHx8ICIqIjsKCQkJCX0KCQkJCWxpc3QgPSBzdHJ1Y3R1cmVbIGRhdGFUeXBlIF0gPSBzdHJ1Y3R1cmVbIGRhdGFUeXBlIF0gfHwgW107CgkJCQkvLyB0aGVuIHdlIGFkZCB0byB0aGUgc3RydWN0dXJlIGFjY29yZGluZ2x5CgkJCQlsaXN0WyBwbGFjZUJlZm9yZSA/ICJ1bnNoaWZ0IiA6ICJwdXNoIiBdKCBmdW5jICk7CgkJCX0KCQl9Cgl9Owp9CgovLyBCYXNlIGluc3BlY3Rpb24gZnVuY3Rpb24gZm9yIHByZWZpbHRlcnMgYW5kIHRyYW5zcG9ydHMKZnVuY3Rpb24gaW5zcGVjdFByZWZpbHRlcnNPclRyYW5zcG9ydHMoIHN0cnVjdHVyZSwgb3B0aW9ucywgb3JpZ2luYWxPcHRpb25zLCBqcVhIUiwKCQlkYXRhVHlwZSAvKiBpbnRlcm5hbCAqLywgaW5zcGVjdGVkIC8qIGludGVybmFsICovICkgewoKCWRhdGFUeXBlID0gZGF0YVR5cGUgfHwgb3B0aW9ucy5kYXRhVHlwZXNbIDAgXTsKCWluc3BlY3RlZCA9IGluc3BlY3RlZCB8fCB7fTsKCglpbnNwZWN0ZWRbIGRhdGFUeXBlIF0gPSB0cnVlOwoKCXZhciBsaXN0ID0gc3RydWN0dXJlWyBkYXRhVHlwZSBdLAoJCWkgPSAwLAoJCWxlbmd0aCA9IGxpc3QgPyBsaXN0Lmxlbmd0aCA6IDAsCgkJZXhlY3V0ZU9ubHkgPSAoIHN0cnVjdHVyZSA9PT0gcHJlZmlsdGVycyApLAoJCXNlbGVjdGlvbjsKCglmb3IoOyBpIDwgbGVuZ3RoICYmICggZXhlY3V0ZU9ubHkgfHwgIXNlbGVjdGlvbiApOyBpKysgKSB7CgkJc2VsZWN0aW9uID0gbGlzdFsgaSBdKCBvcHRpb25zLCBvcmlnaW5hbE9wdGlvbnMsIGpxWEhSICk7CgkJLy8gSWYgd2UgZ290IHJlZGlyZWN0ZWQgdG8gYW5vdGhlciBkYXRhVHlwZQoJCS8vIHdlIHRyeSB0aGVyZSBpZiBleGVjdXRpbmcgb25seSBhbmQgbm90IGRvbmUgYWxyZWFkeQoJCWlmICggdHlwZW9mIHNlbGVjdGlvbiA9PT0gInN0cmluZyIgKSB7CgkJCWlmICggIWV4ZWN1dGVPbmx5IHx8IGluc3BlY3RlZFsgc2VsZWN0aW9uIF0gKSB7CgkJCQlzZWxlY3Rpb24gPSB1bmRlZmluZWQ7CgkJCX0gZWxzZSB7CgkJCQlvcHRpb25zLmRhdGFUeXBlcy51bnNoaWZ0KCBzZWxlY3Rpb24gKTsKCQkJCXNlbGVjdGlvbiA9IGluc3BlY3RQcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKAoJCQkJCQlzdHJ1Y3R1cmUsIG9wdGlvbnMsIG9yaWdpbmFsT3B0aW9ucywganFYSFIsIHNlbGVjdGlvbiwgaW5zcGVjdGVkICk7CgkJCX0KCQl9Cgl9CgkvLyBJZiB3ZSdyZSBvbmx5IGV4ZWN1dGluZyBvciBub3RoaW5nIHdhcyBzZWxlY3RlZAoJLy8gd2UgdHJ5IHRoZSBjYXRjaGFsbCBkYXRhVHlwZSBpZiBub3QgZG9uZSBhbHJlYWR5CglpZiAoICggZXhlY3V0ZU9ubHkgfHwgIXNlbGVjdGlvbiApICYmICFpbnNwZWN0ZWRbICIqIiBdICkgewoJCXNlbGVjdGlvbiA9IGluc3BlY3RQcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKAoJCQkJc3RydWN0dXJlLCBvcHRpb25zLCBvcmlnaW5hbE9wdGlvbnMsIGpxWEhSLCAiKiIsIGluc3BlY3RlZCApOwoJfQoJLy8gdW5uZWNlc3Nhcnkgd2hlbiBvbmx5IGV4ZWN1dGluZyAocHJlZmlsdGVycykKCS8vIGJ1dCBpdCdsbCBiZSBpZ25vcmVkIGJ5IHRoZSBjYWxsZXIgaW4gdGhhdCBjYXNlCglyZXR1cm4gc2VsZWN0aW9uOwp9CgovLyBBIHNwZWNpYWwgZXh0ZW5kIGZvciBhamF4IG9wdGlvbnMKLy8gdGhhdCB0YWtlcyAiZmxhdCIgb3B0aW9ucyAobm90IHRvIGJlIGRlZXAgZXh0ZW5kZWQpCi8vIEZpeGVzICM5ODg3CmZ1bmN0aW9uIGFqYXhFeHRlbmQoIHRhcmdldCwgc3JjICkgewoJdmFyIGtleSwgZGVlcCwKCQlmbGF0T3B0aW9ucyA9IGpRdWVyeS5hamF4U2V0dGluZ3MuZmxhdE9wdGlvbnMgfHwge307Cglmb3IoIGtleSBpbiBzcmMgKSB7CgkJaWYgKCBzcmNbIGtleSBdICE9PSB1bmRlZmluZWQgKSB7CgkJCSggZmxhdE9wdGlvbnNbIGtleSBdID8gdGFyZ2V0IDogKCBkZWVwIHx8ICggZGVlcCA9IHt9ICkgKSApWyBrZXkgXSA9IHNyY1sga2V5IF07CgkJfQoJfQoJaWYgKCBkZWVwICkgewoJCWpRdWVyeS5leHRlbmQoIHRydWUsIHRhcmdldCwgZGVlcCApOwoJfQp9CgpqUXVlcnkuZm4uZXh0ZW5kKHsKCWxvYWQ6IGZ1bmN0aW9uKCB1cmwsIHBhcmFtcywgY2FsbGJhY2sgKSB7CgkJaWYgKCB0eXBlb2YgdXJsICE9PSAic3RyaW5nIiAmJiBfbG9hZCApIHsKCQkJcmV0dXJuIF9sb2FkLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTsKCgkJLy8gRG9uJ3QgZG8gYSByZXF1ZXN0IGlmIG5vIGVsZW1lbnRzIGFyZSBiZWluZyByZXF1ZXN0ZWQKCQl9IGVsc2UgaWYgKCAhdGhpcy5sZW5ndGggKSB7CgkJCXJldHVybiB0aGlzOwoJCX0KCgkJdmFyIG9mZiA9IHVybC5pbmRleE9mKCAiICIgKTsKCQlpZiAoIG9mZiA+PSAwICkgewoJCQl2YXIgc2VsZWN0b3IgPSB1cmwuc2xpY2UoIG9mZiwgdXJsLmxlbmd0aCApOwoJCQl1cmwgPSB1cmwuc2xpY2UoIDAsIG9mZiApOwoJCX0KCgkJLy8gRGVmYXVsdCB0byBhIEdFVCByZXF1ZXN0CgkJdmFyIHR5cGUgPSAiR0VUIjsKCgkJLy8gSWYgdGhlIHNlY29uZCBwYXJhbWV0ZXIgd2FzIHByb3ZpZGVkCgkJaWYgKCBwYXJhbXMgKSB7CgkJCS8vIElmIGl0J3MgYSBmdW5jdGlvbgoJCQlpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBwYXJhbXMgKSApIHsKCQkJCS8vIFdlIGFzc3VtZSB0aGF0IGl0J3MgdGhlIGNhbGxiYWNrCgkJCQljYWxsYmFjayA9IHBhcmFtczsKCQkJCXBhcmFtcyA9IHVuZGVmaW5lZDsKCgkJCS8vIE90aGVyd2lzZSwgYnVpbGQgYSBwYXJhbSBzdHJpbmcKCQkJfSBlbHNlIGlmICggdHlwZW9mIHBhcmFtcyA9PT0gIm9iamVjdCIgKSB7CgkJCQlwYXJhbXMgPSBqUXVlcnkucGFyYW0oIHBhcmFtcywgalF1ZXJ5LmFqYXhTZXR0aW5ncy50cmFkaXRpb25hbCApOwoJCQkJdHlwZSA9ICJQT1NUIjsKCQkJfQoJCX0KCgkJdmFyIHNlbGYgPSB0aGlzOwoKCQkvLyBSZXF1ZXN0IHRoZSByZW1vdGUgZG9jdW1lbnQKCQlqUXVlcnkuYWpheCh7CgkJCXVybDogdXJsLAoJCQl0eXBlOiB0eXBlLAoJCQlkYXRhVHlwZTogImh0bWwiLAoJCQlkYXRhOiBwYXJhbXMsCgkJCS8vIENvbXBsZXRlIGNhbGxiYWNrIChyZXNwb25zZVRleHQgaXMgdXNlZCBpbnRlcm5hbGx5KQoJCQljb21wbGV0ZTogZnVuY3Rpb24oIGpxWEhSLCBzdGF0dXMsIHJlc3BvbnNlVGV4dCApIHsKCQkJCS8vIFN0b3JlIHRoZSByZXNwb25zZSBhcyBzcGVjaWZpZWQgYnkgdGhlIGpxWEhSIG9iamVjdAoJCQkJcmVzcG9uc2VUZXh0ID0ganFYSFIucmVzcG9uc2VUZXh0OwoJCQkJLy8gSWYgc3VjY2Vzc2Z1bCwgaW5qZWN0IHRoZSBIVE1MIGludG8gYWxsIHRoZSBtYXRjaGVkIGVsZW1lbnRzCgkJCQlpZiAoIGpxWEhSLmlzUmVzb2x2ZWQoKSApIHsKCQkJCQkvLyAjNDgyNTogR2V0IHRoZSBhY3R1YWwgcmVzcG9uc2UgaW4gY2FzZQoJCQkJCS8vIGEgZGF0YUZpbHRlciBpcyBwcmVzZW50IGluIGFqYXhTZXR0aW5ncwoJCQkJCWpxWEhSLmRvbmUoZnVuY3Rpb24oIHIgKSB7CgkJCQkJCXJlc3BvbnNlVGV4dCA9IHI7CgkJCQkJfSk7CgkJCQkJLy8gU2VlIGlmIGEgc2VsZWN0b3Igd2FzIHNwZWNpZmllZAoJCQkJCXNlbGYuaHRtbCggc2VsZWN0b3IgPwoJCQkJCQkvLyBDcmVhdGUgYSBkdW1teSBkaXYgdG8gaG9sZCB0aGUgcmVzdWx0cwoJCQkJCQlqUXVlcnkoIjxkaXY+IikKCQkJCQkJCS8vIGluamVjdCB0aGUgY29udGVudHMgb2YgdGhlIGRvY3VtZW50IGluLCByZW1vdmluZyB0aGUgc2NyaXB0cwoJCQkJCQkJLy8gdG8gYXZvaWQgYW55ICdQZXJtaXNzaW9uIERlbmllZCcgZXJyb3JzIGluIElFCgkJCQkJCQkuYXBwZW5kKHJlc3BvbnNlVGV4dC5yZXBsYWNlKHJzY3JpcHQsICIiKSkKCgkJCQkJCQkvLyBMb2NhdGUgdGhlIHNwZWNpZmllZCBlbGVtZW50cwoJCQkJCQkJLmZpbmQoc2VsZWN0b3IpIDoKCgkJCQkJCS8vIElmIG5vdCwganVzdCBpbmplY3QgdGhlIGZ1bGwgcmVzdWx0CgkJCQkJCXJlc3BvbnNlVGV4dCApOwoJCQkJfQoKCQkJCWlmICggY2FsbGJhY2sgKSB7CgkJCQkJc2VsZi5lYWNoKCBjYWxsYmFjaywgWyByZXNwb25zZVRleHQsIHN0YXR1cywganFYSFIgXSApOwoJCQkJfQoJCQl9CgkJfSk7CgoJCXJldHVybiB0aGlzOwoJfSwKCglzZXJpYWxpemU6IGZ1bmN0aW9uKCkgewoJCXJldHVybiBqUXVlcnkucGFyYW0oIHRoaXMuc2VyaWFsaXplQXJyYXkoKSApOwoJfSwKCglzZXJpYWxpemVBcnJheTogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCl7CgkJCXJldHVybiB0aGlzLmVsZW1lbnRzID8galF1ZXJ5Lm1ha2VBcnJheSggdGhpcy5lbGVtZW50cyApIDogdGhpczsKCQl9KQoJCS5maWx0ZXIoZnVuY3Rpb24oKXsKCQkJcmV0dXJuIHRoaXMubmFtZSAmJiAhdGhpcy5kaXNhYmxlZCAmJgoJCQkJKCB0aGlzLmNoZWNrZWQgfHwgcnNlbGVjdFRleHRhcmVhLnRlc3QoIHRoaXMubm9kZU5hbWUgKSB8fAoJCQkJCXJpbnB1dC50ZXN0KCB0aGlzLnR5cGUgKSApOwoJCX0pCgkJLm1hcChmdW5jdGlvbiggaSwgZWxlbSApewoJCQl2YXIgdmFsID0galF1ZXJ5KCB0aGlzICkudmFsKCk7CgoJCQlyZXR1cm4gdmFsID09IG51bGwgPwoJCQkJbnVsbCA6CgkJCQlqUXVlcnkuaXNBcnJheSggdmFsICkgPwoJCQkJCWpRdWVyeS5tYXAoIHZhbCwgZnVuY3Rpb24oIHZhbCwgaSApewoJCQkJCQlyZXR1cm4geyBuYW1lOiBlbGVtLm5hbWUsIHZhbHVlOiB2YWwucmVwbGFjZSggckNSTEYsICJcclxuIiApIH07CgkJCQkJfSkgOgoJCQkJCXsgbmFtZTogZWxlbS5uYW1lLCB2YWx1ZTogdmFsLnJlcGxhY2UoIHJDUkxGLCAiXHJcbiIgKSB9OwoJCX0pLmdldCgpOwoJfQp9KTsKCi8vIEF0dGFjaCBhIGJ1bmNoIG9mIGZ1bmN0aW9ucyBmb3IgaGFuZGxpbmcgY29tbW9uIEFKQVggZXZlbnRzCmpRdWVyeS5lYWNoKCAiYWpheFN0YXJ0IGFqYXhTdG9wIGFqYXhDb21wbGV0ZSBhamF4RXJyb3IgYWpheFN1Y2Nlc3MgYWpheFNlbmQiLnNwbGl0KCAiICIgKSwgZnVuY3Rpb24oIGksIG8gKXsKCWpRdWVyeS5mblsgbyBdID0gZnVuY3Rpb24oIGYgKXsKCQlyZXR1cm4gdGhpcy5iaW5kKCBvLCBmICk7Cgl9Owp9KTsKCmpRdWVyeS5lYWNoKCBbICJnZXQiLCAicG9zdCIgXSwgZnVuY3Rpb24oIGksIG1ldGhvZCApIHsKCWpRdWVyeVsgbWV0aG9kIF0gPSBmdW5jdGlvbiggdXJsLCBkYXRhLCBjYWxsYmFjaywgdHlwZSApIHsKCQkvLyBzaGlmdCBhcmd1bWVudHMgaWYgZGF0YSBhcmd1bWVudCB3YXMgb21pdHRlZAoJCWlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIGRhdGEgKSApIHsKCQkJdHlwZSA9IHR5cGUgfHwgY2FsbGJhY2s7CgkJCWNhbGxiYWNrID0gZGF0YTsKCQkJZGF0YSA9IHVuZGVmaW5lZDsKCQl9CgoJCXJldHVybiBqUXVlcnkuYWpheCh7CgkJCXR5cGU6IG1ldGhvZCwKCQkJdXJsOiB1cmwsCgkJCWRhdGE6IGRhdGEsCgkJCXN1Y2Nlc3M6IGNhbGxiYWNrLAoJCQlkYXRhVHlwZTogdHlwZQoJCX0pOwoJfTsKfSk7CgpqUXVlcnkuZXh0ZW5kKHsKCglnZXRTY3JpcHQ6IGZ1bmN0aW9uKCB1cmwsIGNhbGxiYWNrICkgewoJCXJldHVybiBqUXVlcnkuZ2V0KCB1cmwsIHVuZGVmaW5lZCwgY2FsbGJhY2ssICJzY3JpcHQiICk7Cgl9LAoKCWdldEpTT046IGZ1bmN0aW9uKCB1cmwsIGRhdGEsIGNhbGxiYWNrICkgewoJCXJldHVybiBqUXVlcnkuZ2V0KCB1cmwsIGRhdGEsIGNhbGxiYWNrLCAianNvbiIgKTsKCX0sCgoJLy8gQ3JlYXRlcyBhIGZ1bGwgZmxlZGdlZCBzZXR0aW5ncyBvYmplY3QgaW50byB0YXJnZXQKCS8vIHdpdGggYm90aCBhamF4U2V0dGluZ3MgYW5kIHNldHRpbmdzIGZpZWxkcy4KCS8vIElmIHRhcmdldCBpcyBvbWl0dGVkLCB3cml0ZXMgaW50byBhamF4U2V0dGluZ3MuCglhamF4U2V0dXA6IGZ1bmN0aW9uKCB0YXJnZXQsIHNldHRpbmdzICkgewoJCWlmICggc2V0dGluZ3MgKSB7CgkJCS8vIEJ1aWxkaW5nIGEgc2V0dGluZ3Mgb2JqZWN0CgkJCWFqYXhFeHRlbmQoIHRhcmdldCwgalF1ZXJ5LmFqYXhTZXR0aW5ncyApOwoJCX0gZWxzZSB7CgkJCS8vIEV4dGVuZGluZyBhamF4U2V0dGluZ3MKCQkJc2V0dGluZ3MgPSB0YXJnZXQ7CgkJCXRhcmdldCA9IGpRdWVyeS5hamF4U2V0dGluZ3M7CgkJfQoJCWFqYXhFeHRlbmQoIHRhcmdldCwgc2V0dGluZ3MgKTsKCQlyZXR1cm4gdGFyZ2V0OwoJfSwKCglhamF4U2V0dGluZ3M6IHsKCQl1cmw6IGFqYXhMb2NhdGlvbiwKCQlpc0xvY2FsOiBybG9jYWxQcm90b2NvbC50ZXN0KCBhamF4TG9jUGFydHNbIDEgXSApLAoJCWdsb2JhbDogdHJ1ZSwKCQl0eXBlOiAiR0VUIiwKCQljb250ZW50VHlwZTogImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIsCgkJcHJvY2Vzc0RhdGE6IHRydWUsCgkJYXN5bmM6IHRydWUsCgkJLyoKCQl0aW1lb3V0OiAwLAoJCWRhdGE6IG51bGwsCgkJZGF0YVR5cGU6IG51bGwsCgkJdXNlcm5hbWU6IG51bGwsCgkJcGFzc3dvcmQ6IG51bGwsCgkJY2FjaGU6IG51bGwsCgkJdHJhZGl0aW9uYWw6IGZhbHNlLAoJCWhlYWRlcnM6IHt9LAoJCSovCgoJCWFjY2VwdHM6IHsKCQkJeG1sOiAiYXBwbGljYXRpb24veG1sLCB0ZXh0L3htbCIsCgkJCWh0bWw6ICJ0ZXh0L2h0bWwiLAoJCQl0ZXh0OiAidGV4dC9wbGFpbiIsCgkJCWpzb246ICJhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L2phdmFzY3JpcHQiLAoJCQkiKiI6IGFsbFR5cGVzCgkJfSwKCgkJY29udGVudHM6IHsKCQkJeG1sOiAveG1sLywKCQkJaHRtbDogL2h0bWwvLAoJCQlqc29uOiAvanNvbi8KCQl9LAoKCQlyZXNwb25zZUZpZWxkczogewoJCQl4bWw6ICJyZXNwb25zZVhNTCIsCgkJCXRleHQ6ICJyZXNwb25zZVRleHQiCgkJfSwKCgkJLy8gTGlzdCBvZiBkYXRhIGNvbnZlcnRlcnMKCQkvLyAxKSBrZXkgZm9ybWF0IGlzICJzb3VyY2VfdHlwZSBkZXN0aW5hdGlvbl90eXBlIiAoYSBzaW5nbGUgc3BhY2UgaW4tYmV0d2VlbikKCQkvLyAyKSB0aGUgY2F0Y2hhbGwgc3ltYm9sICIqIiBjYW4gYmUgdXNlZCBmb3Igc291cmNlX3R5cGUKCQljb252ZXJ0ZXJzOiB7CgoJCQkvLyBDb252ZXJ0IGFueXRoaW5nIHRvIHRleHQKCQkJIiogdGV4dCI6IHdpbmRvdy5TdHJpbmcsCgoJCQkvLyBUZXh0IHRvIGh0bWwgKHRydWUgPSBubyB0cmFuc2Zvcm1hdGlvbikKCQkJInRleHQgaHRtbCI6IHRydWUsCgoJCQkvLyBFdmFsdWF0ZSB0ZXh0IGFzIGEganNvbiBleHByZXNzaW9uCgkJCSJ0ZXh0IGpzb24iOiBqUXVlcnkucGFyc2VKU09OLAoKCQkJLy8gUGFyc2UgdGV4dCBhcyB4bWwKCQkJInRleHQgeG1sIjogalF1ZXJ5LnBhcnNlWE1MCgkJfSwKCgkJLy8gRm9yIG9wdGlvbnMgdGhhdCBzaG91bGRuJ3QgYmUgZGVlcCBleHRlbmRlZDoKCQkvLyB5b3UgY2FuIGFkZCB5b3VyIG93biBjdXN0b20gb3B0aW9ucyBoZXJlIGlmCgkJLy8gYW5kIHdoZW4geW91IGNyZWF0ZSBvbmUgdGhhdCBzaG91bGRuJ3QgYmUKCQkvLyBkZWVwIGV4dGVuZGVkIChzZWUgYWpheEV4dGVuZCkKCQlmbGF0T3B0aW9uczogewoJCQljb250ZXh0OiB0cnVlLAoJCQl1cmw6IHRydWUKCQl9Cgl9LAoKCWFqYXhQcmVmaWx0ZXI6IGFkZFRvUHJlZmlsdGVyc09yVHJhbnNwb3J0cyggcHJlZmlsdGVycyApLAoJYWpheFRyYW5zcG9ydDogYWRkVG9QcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCB0cmFuc3BvcnRzICksCgoJLy8gTWFpbiBtZXRob2QKCWFqYXg6IGZ1bmN0aW9uKCB1cmwsIG9wdGlvbnMgKSB7CgoJCS8vIElmIHVybCBpcyBhbiBvYmplY3QsIHNpbXVsYXRlIHByZS0xLjUgc2lnbmF0dXJlCgkJaWYgKCB0eXBlb2YgdXJsID09PSAib2JqZWN0IiApIHsKCQkJb3B0aW9ucyA9IHVybDsKCQkJdXJsID0gdW5kZWZpbmVkOwoJCX0KCgkJLy8gRm9yY2Ugb3B0aW9ucyB0byBiZSBhbiBvYmplY3QKCQlvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKCgkJdmFyIC8vIENyZWF0ZSB0aGUgZmluYWwgb3B0aW9ucyBvYmplY3QKCQkJcyA9IGpRdWVyeS5hamF4U2V0dXAoIHt9LCBvcHRpb25zICksCgkJCS8vIENhbGxiYWNrcyBjb250ZXh0CgkJCWNhbGxiYWNrQ29udGV4dCA9IHMuY29udGV4dCB8fCBzLAoJCQkvLyBDb250ZXh0IGZvciBnbG9iYWwgZXZlbnRzCgkJCS8vIEl0J3MgdGhlIGNhbGxiYWNrQ29udGV4dCBpZiBvbmUgd2FzIHByb3ZpZGVkIGluIHRoZSBvcHRpb25zCgkJCS8vIGFuZCBpZiBpdCdzIGEgRE9NIG5vZGUgb3IgYSBqUXVlcnkgY29sbGVjdGlvbgoJCQlnbG9iYWxFdmVudENvbnRleHQgPSBjYWxsYmFja0NvbnRleHQgIT09IHMgJiYKCQkJCSggY2FsbGJhY2tDb250ZXh0Lm5vZGVUeXBlIHx8IGNhbGxiYWNrQ29udGV4dCBpbnN0YW5jZW9mIGpRdWVyeSApID8KCQkJCQkJalF1ZXJ5KCBjYWxsYmFja0NvbnRleHQgKSA6IGpRdWVyeS5ldmVudCwKCQkJLy8gRGVmZXJyZWRzCgkJCWRlZmVycmVkID0galF1ZXJ5LkRlZmVycmVkKCksCgkJCWNvbXBsZXRlRGVmZXJyZWQgPSBqUXVlcnkuX0RlZmVycmVkKCksCgkJCS8vIFN0YXR1cy1kZXBlbmRlbnQgY2FsbGJhY2tzCgkJCXN0YXR1c0NvZGUgPSBzLnN0YXR1c0NvZGUgfHwge30sCgkJCS8vIGlmTW9kaWZpZWQga2V5CgkJCWlmTW9kaWZpZWRLZXksCgkJCS8vIEhlYWRlcnMgKHRoZXkgYXJlIHNlbnQgYWxsIGF0IG9uY2UpCgkJCXJlcXVlc3RIZWFkZXJzID0ge30sCgkJCXJlcXVlc3RIZWFkZXJzTmFtZXMgPSB7fSwKCQkJLy8gUmVzcG9uc2UgaGVhZGVycwoJCQlyZXNwb25zZUhlYWRlcnNTdHJpbmcsCgkJCXJlc3BvbnNlSGVhZGVycywKCQkJLy8gdHJhbnNwb3J0CgkJCXRyYW5zcG9ydCwKCQkJLy8gdGltZW91dCBoYW5kbGUKCQkJdGltZW91dFRpbWVyLAoJCQkvLyBDcm9zcy1kb21haW4gZGV0ZWN0aW9uIHZhcnMKCQkJcGFydHMsCgkJCS8vIFRoZSBqcVhIUiBzdGF0ZQoJCQlzdGF0ZSA9IDAsCgkJCS8vIFRvIGtub3cgaWYgZ2xvYmFsIGV2ZW50cyBhcmUgdG8gYmUgZGlzcGF0Y2hlZAoJCQlmaXJlR2xvYmFscywKCQkJLy8gTG9vcCB2YXJpYWJsZQoJCQlpLAoJCQkvLyBGYWtlIHhocgoJCQlqcVhIUiA9IHsKCgkJCQlyZWFkeVN0YXRlOiAwLAoKCQkJCS8vIENhY2hlcyB0aGUgaGVhZGVyCgkJCQlzZXRSZXF1ZXN0SGVhZGVyOiBmdW5jdGlvbiggbmFtZSwgdmFsdWUgKSB7CgkJCQkJaWYgKCAhc3RhdGUgKSB7CgkJCQkJCXZhciBsbmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTsKCQkJCQkJbmFtZSA9IHJlcXVlc3RIZWFkZXJzTmFtZXNbIGxuYW1lIF0gPSByZXF1ZXN0SGVhZGVyc05hbWVzWyBsbmFtZSBdIHx8IG5hbWU7CgkJCQkJCXJlcXVlc3RIZWFkZXJzWyBuYW1lIF0gPSB2YWx1ZTsKCQkJCQl9CgkJCQkJcmV0dXJuIHRoaXM7CgkJCQl9LAoKCQkJCS8vIFJhdyBzdHJpbmcKCQkJCWdldEFsbFJlc3BvbnNlSGVhZGVyczogZnVuY3Rpb24oKSB7CgkJCQkJcmV0dXJuIHN0YXRlID09PSAyID8gcmVzcG9uc2VIZWFkZXJzU3RyaW5nIDogbnVsbDsKCQkJCX0sCgoJCQkJLy8gQnVpbGRzIGhlYWRlcnMgaGFzaHRhYmxlIGlmIG5lZWRlZAoJCQkJZ2V0UmVzcG9uc2VIZWFkZXI6IGZ1bmN0aW9uKCBrZXkgKSB7CgkJCQkJdmFyIG1hdGNoOwoJCQkJCWlmICggc3RhdGUgPT09IDIgKSB7CgkJCQkJCWlmICggIXJlc3BvbnNlSGVhZGVycyApIHsKCQkJCQkJCXJlc3BvbnNlSGVhZGVycyA9IHt9OwoJCQkJCQkJd2hpbGUoICggbWF0Y2ggPSByaGVhZGVycy5leGVjKCByZXNwb25zZUhlYWRlcnNTdHJpbmcgKSApICkgewoJCQkJCQkJCXJlc3BvbnNlSGVhZGVyc1sgbWF0Y2hbMV0udG9Mb3dlckNhc2UoKSBdID0gbWF0Y2hbIDIgXTsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCQltYXRjaCA9IHJlc3BvbnNlSGVhZGVyc1sga2V5LnRvTG93ZXJDYXNlKCkgXTsKCQkJCQl9CgkJCQkJcmV0dXJuIG1hdGNoID09PSB1bmRlZmluZWQgPyBudWxsIDogbWF0Y2g7CgkJCQl9LAoKCQkJCS8vIE92ZXJyaWRlcyByZXNwb25zZSBjb250ZW50LXR5cGUgaGVhZGVyCgkJCQlvdmVycmlkZU1pbWVUeXBlOiBmdW5jdGlvbiggdHlwZSApIHsKCQkJCQlpZiAoICFzdGF0ZSApIHsKCQkJCQkJcy5taW1lVHlwZSA9IHR5cGU7CgkJCQkJfQoJCQkJCXJldHVybiB0aGlzOwoJCQkJfSwKCgkJCQkvLyBDYW5jZWwgdGhlIHJlcXVlc3QKCQkJCWFib3J0OiBmdW5jdGlvbiggc3RhdHVzVGV4dCApIHsKCQkJCQlzdGF0dXNUZXh0ID0gc3RhdHVzVGV4dCB8fCAiYWJvcnQiOwoJCQkJCWlmICggdHJhbnNwb3J0ICkgewoJCQkJCQl0cmFuc3BvcnQuYWJvcnQoIHN0YXR1c1RleHQgKTsKCQkJCQl9CgkJCQkJZG9uZSggMCwgc3RhdHVzVGV4dCApOwoJCQkJCXJldHVybiB0aGlzOwoJCQkJfQoJCQl9OwoKCQkvLyBDYWxsYmFjayBmb3Igd2hlbiBldmVyeXRoaW5nIGlzIGRvbmUKCQkvLyBJdCBpcyBkZWZpbmVkIGhlcmUgYmVjYXVzZSBqc2xpbnQgY29tcGxhaW5zIGlmIGl0IGlzIGRlY2xhcmVkCgkJLy8gYXQgdGhlIGVuZCBvZiB0aGUgZnVuY3Rpb24gKHdoaWNoIHdvdWxkIGJlIG1vcmUgbG9naWNhbCBhbmQgcmVhZGFibGUpCgkJZnVuY3Rpb24gZG9uZSggc3RhdHVzLCBuYXRpdmVTdGF0dXNUZXh0LCByZXNwb25zZXMsIGhlYWRlcnMgKSB7CgoJCQkvLyBDYWxsZWQgb25jZQoJCQlpZiAoIHN0YXRlID09PSAyICkgewoJCQkJcmV0dXJuOwoJCQl9CgoJCQkvLyBTdGF0ZSBpcyAiZG9uZSIgbm93CgkJCXN0YXRlID0gMjsKCgkJCS8vIENsZWFyIHRpbWVvdXQgaWYgaXQgZXhpc3RzCgkJCWlmICggdGltZW91dFRpbWVyICkgewoJCQkJY2xlYXJUaW1lb3V0KCB0aW1lb3V0VGltZXIgKTsKCQkJfQoKCQkJLy8gRGVyZWZlcmVuY2UgdHJhbnNwb3J0IGZvciBlYXJseSBnYXJiYWdlIGNvbGxlY3Rpb24KCQkJLy8gKG5vIG1hdHRlciBob3cgbG9uZyB0aGUganFYSFIgb2JqZWN0IHdpbGwgYmUgdXNlZCkKCQkJdHJhbnNwb3J0ID0gdW5kZWZpbmVkOwoKCQkJLy8gQ2FjaGUgcmVzcG9uc2UgaGVhZGVycwoJCQlyZXNwb25zZUhlYWRlcnNTdHJpbmcgPSBoZWFkZXJzIHx8ICIiOwoKCQkJLy8gU2V0IHJlYWR5U3RhdGUKCQkJanFYSFIucmVhZHlTdGF0ZSA9IHN0YXR1cyA+IDAgPyA0IDogMDsKCgkJCXZhciBpc1N1Y2Nlc3MsCgkJCQlzdWNjZXNzLAoJCQkJZXJyb3IsCgkJCQlzdGF0dXNUZXh0ID0gbmF0aXZlU3RhdHVzVGV4dCwKCQkJCXJlc3BvbnNlID0gcmVzcG9uc2VzID8gYWpheEhhbmRsZVJlc3BvbnNlcyggcywganFYSFIsIHJlc3BvbnNlcyApIDogdW5kZWZpbmVkLAoJCQkJbGFzdE1vZGlmaWVkLAoJCQkJZXRhZzsKCgkJCS8vIElmIHN1Y2Nlc3NmdWwsIGhhbmRsZSB0eXBlIGNoYWluaW5nCgkJCWlmICggc3RhdHVzID49IDIwMCAmJiBzdGF0dXMgPCAzMDAgfHwgc3RhdHVzID09PSAzMDQgKSB7CgoJCQkJLy8gU2V0IHRoZSBJZi1Nb2RpZmllZC1TaW5jZSBhbmQvb3IgSWYtTm9uZS1NYXRjaCBoZWFkZXIsIGlmIGluIGlmTW9kaWZpZWQgbW9kZS4KCQkJCWlmICggcy5pZk1vZGlmaWVkICkgewoKCQkJCQlpZiAoICggbGFzdE1vZGlmaWVkID0ganFYSFIuZ2V0UmVzcG9uc2VIZWFkZXIoICJMYXN0LU1vZGlmaWVkIiApICkgKSB7CgkJCQkJCWpRdWVyeS5sYXN0TW9kaWZpZWRbIGlmTW9kaWZpZWRLZXkgXSA9IGxhc3RNb2RpZmllZDsKCQkJCQl9CgkJCQkJaWYgKCAoIGV0YWcgPSBqcVhIUi5nZXRSZXNwb25zZUhlYWRlciggIkV0YWciICkgKSApIHsKCQkJCQkJalF1ZXJ5LmV0YWdbIGlmTW9kaWZpZWRLZXkgXSA9IGV0YWc7CgkJCQkJfQoJCQkJfQoKCQkJCS8vIElmIG5vdCBtb2RpZmllZAoJCQkJaWYgKCBzdGF0dXMgPT09IDMwNCApIHsKCgkJCQkJc3RhdHVzVGV4dCA9ICJub3Rtb2RpZmllZCI7CgkJCQkJaXNTdWNjZXNzID0gdHJ1ZTsKCgkJCQkvLyBJZiB3ZSBoYXZlIGRhdGEKCQkJCX0gZWxzZSB7CgoJCQkJCXRyeSB7CgkJCQkJCXN1Y2Nlc3MgPSBhamF4Q29udmVydCggcywgcmVzcG9uc2UgKTsKCQkJCQkJc3RhdHVzVGV4dCA9ICJzdWNjZXNzIjsKCQkJCQkJaXNTdWNjZXNzID0gdHJ1ZTsKCQkJCQl9IGNhdGNoKGUpIHsKCQkJCQkJLy8gV2UgaGF2ZSBhIHBhcnNlcmVycm9yCgkJCQkJCXN0YXR1c1RleHQgPSAicGFyc2VyZXJyb3IiOwoJCQkJCQllcnJvciA9IGU7CgkJCQkJfQoJCQkJfQoJCQl9IGVsc2UgewoJCQkJLy8gV2UgZXh0cmFjdCBlcnJvciBmcm9tIHN0YXR1c1RleHQKCQkJCS8vIHRoZW4gbm9ybWFsaXplIHN0YXR1c1RleHQgYW5kIHN0YXR1cyBmb3Igbm9uLWFib3J0cwoJCQkJZXJyb3IgPSBzdGF0dXNUZXh0OwoJCQkJaWYoICFzdGF0dXNUZXh0IHx8IHN0YXR1cyApIHsKCQkJCQlzdGF0dXNUZXh0ID0gImVycm9yIjsKCQkJCQlpZiAoIHN0YXR1cyA8IDAgKSB7CgkJCQkJCXN0YXR1cyA9IDA7CgkJCQkJfQoJCQkJfQoJCQl9CgoJCQkvLyBTZXQgZGF0YSBmb3IgdGhlIGZha2UgeGhyIG9iamVjdAoJCQlqcVhIUi5zdGF0dXMgPSBzdGF0dXM7CgkJCWpxWEhSLnN0YXR1c1RleHQgPSAiIiArICggbmF0aXZlU3RhdHVzVGV4dCB8fCBzdGF0dXNUZXh0ICk7CgoJCQkvLyBTdWNjZXNzL0Vycm9yCgkJCWlmICggaXNTdWNjZXNzICkgewoJCQkJZGVmZXJyZWQucmVzb2x2ZVdpdGgoIGNhbGxiYWNrQ29udGV4dCwgWyBzdWNjZXNzLCBzdGF0dXNUZXh0LCBqcVhIUiBdICk7CgkJCX0gZWxzZSB7CgkJCQlkZWZlcnJlZC5yZWplY3RXaXRoKCBjYWxsYmFja0NvbnRleHQsIFsganFYSFIsIHN0YXR1c1RleHQsIGVycm9yIF0gKTsKCQkJfQoKCQkJLy8gU3RhdHVzLWRlcGVuZGVudCBjYWxsYmFja3MKCQkJanFYSFIuc3RhdHVzQ29kZSggc3RhdHVzQ29kZSApOwoJCQlzdGF0dXNDb2RlID0gdW5kZWZpbmVkOwoKCQkJaWYgKCBmaXJlR2xvYmFscyApIHsKCQkJCWdsb2JhbEV2ZW50Q29udGV4dC50cmlnZ2VyKCAiYWpheCIgKyAoIGlzU3VjY2VzcyA/ICJTdWNjZXNzIiA6ICJFcnJvciIgKSwKCQkJCQkJWyBqcVhIUiwgcywgaXNTdWNjZXNzID8gc3VjY2VzcyA6IGVycm9yIF0gKTsKCQkJfQoKCQkJLy8gQ29tcGxldGUKCQkJY29tcGxldGVEZWZlcnJlZC5yZXNvbHZlV2l0aCggY2FsbGJhY2tDb250ZXh0LCBbIGpxWEhSLCBzdGF0dXNUZXh0IF0gKTsKCgkJCWlmICggZmlyZUdsb2JhbHMgKSB7CgkJCQlnbG9iYWxFdmVudENvbnRleHQudHJpZ2dlciggImFqYXhDb21wbGV0ZSIsIFsganFYSFIsIHMgXSApOwoJCQkJLy8gSGFuZGxlIHRoZSBnbG9iYWwgQUpBWCBjb3VudGVyCgkJCQlpZiAoICEoIC0talF1ZXJ5LmFjdGl2ZSApICkgewoJCQkJCWpRdWVyeS5ldmVudC50cmlnZ2VyKCAiYWpheFN0b3AiICk7CgkJCQl9CgkJCX0KCQl9CgoJCS8vIEF0dGFjaCBkZWZlcnJlZHMKCQlkZWZlcnJlZC5wcm9taXNlKCBqcVhIUiApOwoJCWpxWEhSLnN1Y2Nlc3MgPSBqcVhIUi5kb25lOwoJCWpxWEhSLmVycm9yID0ganFYSFIuZmFpbDsKCQlqcVhIUi5jb21wbGV0ZSA9IGNvbXBsZXRlRGVmZXJyZWQuZG9uZTsKCgkJLy8gU3RhdHVzLWRlcGVuZGVudCBjYWxsYmFja3MKCQlqcVhIUi5zdGF0dXNDb2RlID0gZnVuY3Rpb24oIG1hcCApIHsKCQkJaWYgKCBtYXAgKSB7CgkJCQl2YXIgdG1wOwoJCQkJaWYgKCBzdGF0ZSA8IDIgKSB7CgkJCQkJZm9yKCB0bXAgaW4gbWFwICkgewoJCQkJCQlzdGF0dXNDb2RlWyB0bXAgXSA9IFsgc3RhdHVzQ29kZVt0bXBdLCBtYXBbdG1wXSBdOwoJCQkJCX0KCQkJCX0gZWxzZSB7CgkJCQkJdG1wID0gbWFwWyBqcVhIUi5zdGF0dXMgXTsKCQkJCQlqcVhIUi50aGVuKCB0bXAsIHRtcCApOwoJCQkJfQoJCQl9CgkJCXJldHVybiB0aGlzOwoJCX07CgoJCS8vIFJlbW92ZSBoYXNoIGNoYXJhY3RlciAoIzc1MzE6IGFuZCBzdHJpbmcgcHJvbW90aW9uKQoJCS8vIEFkZCBwcm90b2NvbCBpZiBub3QgcHJvdmlkZWQgKCM1ODY2OiBJRTcgaXNzdWUgd2l0aCBwcm90b2NvbC1sZXNzIHVybHMpCgkJLy8gV2UgYWxzbyB1c2UgdGhlIHVybCBwYXJhbWV0ZXIgaWYgYXZhaWxhYmxlCgkJcy51cmwgPSAoICggdXJsIHx8IHMudXJsICkgKyAiIiApLnJlcGxhY2UoIHJoYXNoLCAiIiApLnJlcGxhY2UoIHJwcm90b2NvbCwgYWpheExvY1BhcnRzWyAxIF0gKyAiLy8iICk7CgoJCS8vIEV4dHJhY3QgZGF0YVR5cGVzIGxpc3QKCQlzLmRhdGFUeXBlcyA9IGpRdWVyeS50cmltKCBzLmRhdGFUeXBlIHx8ICIqIiApLnRvTG93ZXJDYXNlKCkuc3BsaXQoIHJzcGFjZXNBamF4ICk7CgoJCS8vIERldGVybWluZSBpZiBhIGNyb3NzLWRvbWFpbiByZXF1ZXN0IGlzIGluIG9yZGVyCgkJaWYgKCBzLmNyb3NzRG9tYWluID09IG51bGwgKSB7CgkJCXBhcnRzID0gcnVybC5leGVjKCBzLnVybC50b0xvd2VyQ2FzZSgpICk7CgkJCXMuY3Jvc3NEb21haW4gPSAhISggcGFydHMgJiYKCQkJCSggcGFydHNbIDEgXSAhPSBhamF4TG9jUGFydHNbIDEgXSB8fCBwYXJ0c1sgMiBdICE9IGFqYXhMb2NQYXJ0c1sgMiBdIHx8CgkJCQkJKCBwYXJ0c1sgMyBdIHx8ICggcGFydHNbIDEgXSA9PT0gImh0dHA6IiA/IDgwIDogNDQzICkgKSAhPQoJCQkJCQkoIGFqYXhMb2NQYXJ0c1sgMyBdIHx8ICggYWpheExvY1BhcnRzWyAxIF0gPT09ICJodHRwOiIgPyA4MCA6IDQ0MyApICkgKQoJCQkpOwoJCX0KCgkJLy8gQ29udmVydCBkYXRhIGlmIG5vdCBhbHJlYWR5IGEgc3RyaW5nCgkJaWYgKCBzLmRhdGEgJiYgcy5wcm9jZXNzRGF0YSAmJiB0eXBlb2Ygcy5kYXRhICE9PSAic3RyaW5nIiApIHsKCQkJcy5kYXRhID0galF1ZXJ5LnBhcmFtKCBzLmRhdGEsIHMudHJhZGl0aW9uYWwgKTsKCQl9CgoJCS8vIEFwcGx5IHByZWZpbHRlcnMKCQlpbnNwZWN0UHJlZmlsdGVyc09yVHJhbnNwb3J0cyggcHJlZmlsdGVycywgcywgb3B0aW9ucywganFYSFIgKTsKCgkJLy8gSWYgcmVxdWVzdCB3YXMgYWJvcnRlZCBpbnNpZGUgYSBwcmVmaWxlciwgc3RvcCB0aGVyZQoJCWlmICggc3RhdGUgPT09IDIgKSB7CgkJCXJldHVybiBmYWxzZTsKCQl9CgoJCS8vIFdlIGNhbiBmaXJlIGdsb2JhbCBldmVudHMgYXMgb2Ygbm93IGlmIGFza2VkIHRvCgkJZmlyZUdsb2JhbHMgPSBzLmdsb2JhbDsKCgkJLy8gVXBwZXJjYXNlIHRoZSB0eXBlCgkJcy50eXBlID0gcy50eXBlLnRvVXBwZXJDYXNlKCk7CgoJCS8vIERldGVybWluZSBpZiByZXF1ZXN0IGhhcyBjb250ZW50CgkJcy5oYXNDb250ZW50ID0gIXJub0NvbnRlbnQudGVzdCggcy50eXBlICk7CgoJCS8vIFdhdGNoIGZvciBhIG5ldyBzZXQgb2YgcmVxdWVzdHMKCQlpZiAoIGZpcmVHbG9iYWxzICYmIGpRdWVyeS5hY3RpdmUrKyA9PT0gMCApIHsKCQkJalF1ZXJ5LmV2ZW50LnRyaWdnZXIoICJhamF4U3RhcnQiICk7CgkJfQoKCQkvLyBNb3JlIG9wdGlvbnMgaGFuZGxpbmcgZm9yIHJlcXVlc3RzIHdpdGggbm8gY29udGVudAoJCWlmICggIXMuaGFzQ29udGVudCApIHsKCgkJCS8vIElmIGRhdGEgaXMgYXZhaWxhYmxlLCBhcHBlbmQgZGF0YSB0byB1cmwKCQkJaWYgKCBzLmRhdGEgKSB7CgkJCQlzLnVybCArPSAoIHJxdWVyeS50ZXN0KCBzLnVybCApID8gIiYiIDogIj8iICkgKyBzLmRhdGE7CgkJCQkvLyAjOTY4MjogcmVtb3ZlIGRhdGEgc28gdGhhdCBpdCdzIG5vdCB1c2VkIGluIGFuIGV2ZW50dWFsIHJldHJ5CgkJCQlkZWxldGUgcy5kYXRhOwoJCQl9CgoJCQkvLyBHZXQgaWZNb2RpZmllZEtleSBiZWZvcmUgYWRkaW5nIHRoZSBhbnRpLWNhY2hlIHBhcmFtZXRlcgoJCQlpZk1vZGlmaWVkS2V5ID0gcy51cmw7CgoJCQkvLyBBZGQgYW50aS1jYWNoZSBpbiB1cmwgaWYgbmVlZGVkCgkJCWlmICggcy5jYWNoZSA9PT0gZmFsc2UgKSB7CgoJCQkJdmFyIHRzID0galF1ZXJ5Lm5vdygpLAoJCQkJCS8vIHRyeSByZXBsYWNpbmcgXz0gaWYgaXQgaXMgdGhlcmUKCQkJCQlyZXQgPSBzLnVybC5yZXBsYWNlKCBydHMsICIkMV89IiArIHRzICk7CgoJCQkJLy8gaWYgbm90aGluZyB3YXMgcmVwbGFjZWQsIGFkZCB0aW1lc3RhbXAgdG8gdGhlIGVuZAoJCQkJcy51cmwgPSByZXQgKyAoIChyZXQgPT09IHMudXJsICkgPyAoIHJxdWVyeS50ZXN0KCBzLnVybCApID8gIiYiIDogIj8iICkgKyAiXz0iICsgdHMgOiAiIiApOwoJCQl9CgkJfQoKCQkvLyBTZXQgdGhlIGNvcnJlY3QgaGVhZGVyLCBpZiBkYXRhIGlzIGJlaW5nIHNlbnQKCQlpZiAoIHMuZGF0YSAmJiBzLmhhc0NvbnRlbnQgJiYgcy5jb250ZW50VHlwZSAhPT0gZmFsc2UgfHwgb3B0aW9ucy5jb250ZW50VHlwZSApIHsKCQkJanFYSFIuc2V0UmVxdWVzdEhlYWRlciggIkNvbnRlbnQtVHlwZSIsIHMuY29udGVudFR5cGUgKTsKCQl9CgoJCS8vIFNldCB0aGUgSWYtTW9kaWZpZWQtU2luY2UgYW5kL29yIElmLU5vbmUtTWF0Y2ggaGVhZGVyLCBpZiBpbiBpZk1vZGlmaWVkIG1vZGUuCgkJaWYgKCBzLmlmTW9kaWZpZWQgKSB7CgkJCWlmTW9kaWZpZWRLZXkgPSBpZk1vZGlmaWVkS2V5IHx8IHMudXJsOwoJCQlpZiAoIGpRdWVyeS5sYXN0TW9kaWZpZWRbIGlmTW9kaWZpZWRLZXkgXSApIHsKCQkJCWpxWEhSLnNldFJlcXVlc3RIZWFkZXIoICJJZi1Nb2RpZmllZC1TaW5jZSIsIGpRdWVyeS5sYXN0TW9kaWZpZWRbIGlmTW9kaWZpZWRLZXkgXSApOwoJCQl9CgkJCWlmICggalF1ZXJ5LmV0YWdbIGlmTW9kaWZpZWRLZXkgXSApIHsKCQkJCWpxWEhSLnNldFJlcXVlc3RIZWFkZXIoICJJZi1Ob25lLU1hdGNoIiwgalF1ZXJ5LmV0YWdbIGlmTW9kaWZpZWRLZXkgXSApOwoJCQl9CgkJfQoKCQkvLyBTZXQgdGhlIEFjY2VwdHMgaGVhZGVyIGZvciB0aGUgc2VydmVyLCBkZXBlbmRpbmcgb24gdGhlIGRhdGFUeXBlCgkJanFYSFIuc2V0UmVxdWVzdEhlYWRlcigKCQkJIkFjY2VwdCIsCgkJCXMuZGF0YVR5cGVzWyAwIF0gJiYgcy5hY2NlcHRzWyBzLmRhdGFUeXBlc1swXSBdID8KCQkJCXMuYWNjZXB0c1sgcy5kYXRhVHlwZXNbMF0gXSArICggcy5kYXRhVHlwZXNbIDAgXSAhPT0gIioiID8gIiwgIiArIGFsbFR5cGVzICsgIjsgcT0wLjAxIiA6ICIiICkgOgoJCQkJcy5hY2NlcHRzWyAiKiIgXQoJCSk7CgoJCS8vIENoZWNrIGZvciBoZWFkZXJzIG9wdGlvbgoJCWZvciAoIGkgaW4gcy5oZWFkZXJzICkgewoJCQlqcVhIUi5zZXRSZXF1ZXN0SGVhZGVyKCBpLCBzLmhlYWRlcnNbIGkgXSApOwoJCX0KCgkJLy8gQWxsb3cgY3VzdG9tIGhlYWRlcnMvbWltZXR5cGVzIGFuZCBlYXJseSBhYm9ydAoJCWlmICggcy5iZWZvcmVTZW5kICYmICggcy5iZWZvcmVTZW5kLmNhbGwoIGNhbGxiYWNrQ29udGV4dCwganFYSFIsIHMgKSA9PT0gZmFsc2UgfHwgc3RhdGUgPT09IDIgKSApIHsKCQkJCS8vIEFib3J0IGlmIG5vdCBkb25lIGFscmVhZHkKCQkJCWpxWEhSLmFib3J0KCk7CgkJCQlyZXR1cm4gZmFsc2U7CgoJCX0KCgkJLy8gSW5zdGFsbCBjYWxsYmFja3Mgb24gZGVmZXJyZWRzCgkJZm9yICggaSBpbiB7IHN1Y2Nlc3M6IDEsIGVycm9yOiAxLCBjb21wbGV0ZTogMSB9ICkgewoJCQlqcVhIUlsgaSBdKCBzWyBpIF0gKTsKCQl9CgoJCS8vIEdldCB0cmFuc3BvcnQKCQl0cmFuc3BvcnQgPSBpbnNwZWN0UHJlZmlsdGVyc09yVHJhbnNwb3J0cyggdHJhbnNwb3J0cywgcywgb3B0aW9ucywganFYSFIgKTsKCgkJLy8gSWYgbm8gdHJhbnNwb3J0LCB3ZSBhdXRvLWFib3J0CgkJaWYgKCAhdHJhbnNwb3J0ICkgewoJCQlkb25lKCAtMSwgIk5vIFRyYW5zcG9ydCIgKTsKCQl9IGVsc2UgewoJCQlqcVhIUi5yZWFkeVN0YXRlID0gMTsKCQkJLy8gU2VuZCBnbG9iYWwgZXZlbnQKCQkJaWYgKCBmaXJlR2xvYmFscyApIHsKCQkJCWdsb2JhbEV2ZW50Q29udGV4dC50cmlnZ2VyKCAiYWpheFNlbmQiLCBbIGpxWEhSLCBzIF0gKTsKCQkJfQoJCQkvLyBUaW1lb3V0CgkJCWlmICggcy5hc3luYyAmJiBzLnRpbWVvdXQgPiAwICkgewoJCQkJdGltZW91dFRpbWVyID0gc2V0VGltZW91dCggZnVuY3Rpb24oKXsKCQkJCQlqcVhIUi5hYm9ydCggInRpbWVvdXQiICk7CgkJCQl9LCBzLnRpbWVvdXQgKTsKCQkJfQoKCQkJdHJ5IHsKCQkJCXN0YXRlID0gMTsKCQkJCXRyYW5zcG9ydC5zZW5kKCByZXF1ZXN0SGVhZGVycywgZG9uZSApOwoJCQl9IGNhdGNoIChlKSB7CgkJCQkvLyBQcm9wYWdhdGUgZXhjZXB0aW9uIGFzIGVycm9yIGlmIG5vdCBkb25lCgkJCQlpZiAoIHN0YXRlIDwgMiApIHsKCQkJCQlkb25lKCAtMSwgZSApOwoJCQkJLy8gU2ltcGx5IHJldGhyb3cgb3RoZXJ3aXNlCgkJCQl9IGVsc2UgewoJCQkJCWpRdWVyeS5lcnJvciggZSApOwoJCQkJfQoJCQl9CgkJfQoKCQlyZXR1cm4ganFYSFI7Cgl9LAoKCS8vIFNlcmlhbGl6ZSBhbiBhcnJheSBvZiBmb3JtIGVsZW1lbnRzIG9yIGEgc2V0IG9mCgkvLyBrZXkvdmFsdWVzIGludG8gYSBxdWVyeSBzdHJpbmcKCXBhcmFtOiBmdW5jdGlvbiggYSwgdHJhZGl0aW9uYWwgKSB7CgkJdmFyIHMgPSBbXSwKCQkJYWRkID0gZnVuY3Rpb24oIGtleSwgdmFsdWUgKSB7CgkJCQkvLyBJZiB2YWx1ZSBpcyBhIGZ1bmN0aW9uLCBpbnZva2UgaXQgYW5kIHJldHVybiBpdHMgdmFsdWUKCQkJCXZhbHVlID0galF1ZXJ5LmlzRnVuY3Rpb24oIHZhbHVlICkgPyB2YWx1ZSgpIDogdmFsdWU7CgkJCQlzWyBzLmxlbmd0aCBdID0gZW5jb2RlVVJJQ29tcG9uZW50KCBrZXkgKSArICI9IiArIGVuY29kZVVSSUNvbXBvbmVudCggdmFsdWUgKTsKCQkJfTsKCgkJLy8gU2V0IHRyYWRpdGlvbmFsIHRvIHRydWUgZm9yIGpRdWVyeSA8PSAxLjMuMiBiZWhhdmlvci4KCQlpZiAoIHRyYWRpdGlvbmFsID09PSB1bmRlZmluZWQgKSB7CgkJCXRyYWRpdGlvbmFsID0galF1ZXJ5LmFqYXhTZXR0aW5ncy50cmFkaXRpb25hbDsKCQl9CgoJCS8vIElmIGFuIGFycmF5IHdhcyBwYXNzZWQgaW4sIGFzc3VtZSB0aGF0IGl0IGlzIGFuIGFycmF5IG9mIGZvcm0gZWxlbWVudHMuCgkJaWYgKCBqUXVlcnkuaXNBcnJheSggYSApIHx8ICggYS5qcXVlcnkgJiYgIWpRdWVyeS5pc1BsYWluT2JqZWN0KCBhICkgKSApIHsKCQkJLy8gU2VyaWFsaXplIHRoZSBmb3JtIGVsZW1lbnRzCgkJCWpRdWVyeS5lYWNoKCBhLCBmdW5jdGlvbigpIHsKCQkJCWFkZCggdGhpcy5uYW1lLCB0aGlzLnZhbHVlICk7CgkJCX0pOwoKCQl9IGVsc2UgewoJCQkvLyBJZiB0cmFkaXRpb25hbCwgZW5jb2RlIHRoZSAib2xkIiB3YXkgKHRoZSB3YXkgMS4zLjIgb3Igb2xkZXIKCQkJLy8gZGlkIGl0KSwgb3RoZXJ3aXNlIGVuY29kZSBwYXJhbXMgcmVjdXJzaXZlbHkuCgkJCWZvciAoIHZhciBwcmVmaXggaW4gYSApIHsKCQkJCWJ1aWxkUGFyYW1zKCBwcmVmaXgsIGFbIHByZWZpeCBdLCB0cmFkaXRpb25hbCwgYWRkICk7CgkJCX0KCQl9CgoJCS8vIFJldHVybiB0aGUgcmVzdWx0aW5nIHNlcmlhbGl6YXRpb24KCQlyZXR1cm4gcy5qb2luKCAiJiIgKS5yZXBsYWNlKCByMjAsICIrIiApOwoJfQp9KTsKCmZ1bmN0aW9uIGJ1aWxkUGFyYW1zKCBwcmVmaXgsIG9iaiwgdHJhZGl0aW9uYWwsIGFkZCApIHsKCWlmICggalF1ZXJ5LmlzQXJyYXkoIG9iaiApICkgewoJCS8vIFNlcmlhbGl6ZSBhcnJheSBpdGVtLgoJCWpRdWVyeS5lYWNoKCBvYmosIGZ1bmN0aW9uKCBpLCB2ICkgewoJCQlpZiAoIHRyYWRpdGlvbmFsIHx8IHJicmFja2V0LnRlc3QoIHByZWZpeCApICkgewoJCQkJLy8gVHJlYXQgZWFjaCBhcnJheSBpdGVtIGFzIGEgc2NhbGFyLgoJCQkJYWRkKCBwcmVmaXgsIHYgKTsKCgkJCX0gZWxzZSB7CgkJCQkvLyBJZiBhcnJheSBpdGVtIGlzIG5vbi1zY2FsYXIgKGFycmF5IG9yIG9iamVjdCksIGVuY29kZSBpdHMKCQkJCS8vIG51bWVyaWMgaW5kZXggdG8gcmVzb2x2ZSBkZXNlcmlhbGl6YXRpb24gYW1iaWd1aXR5IGlzc3Vlcy4KCQkJCS8vIE5vdGUgdGhhdCByYWNrIChhcyBvZiAxLjAuMCkgY2FuJ3QgY3VycmVudGx5IGRlc2VyaWFsaXplCgkJCQkvLyBuZXN0ZWQgYXJyYXlzIHByb3Blcmx5LCBhbmQgYXR0ZW1wdGluZyB0byBkbyBzbyBtYXkgY2F1c2UKCQkJCS8vIGEgc2VydmVyIGVycm9yLiBQb3NzaWJsZSBmaXhlcyBhcmUgdG8gbW9kaWZ5IHJhY2sncwoJCQkJLy8gZGVzZXJpYWxpemF0aW9uIGFsZ29yaXRobSBvciB0byBwcm92aWRlIGFuIG9wdGlvbiBvciBmbGFnCgkJCQkvLyB0byBmb3JjZSBhcnJheSBzZXJpYWxpemF0aW9uIHRvIGJlIHNoYWxsb3cuCgkJCQlidWlsZFBhcmFtcyggcHJlZml4ICsgIlsiICsgKCB0eXBlb2YgdiA9PT0gIm9iamVjdCIgfHwgalF1ZXJ5LmlzQXJyYXkodikgPyBpIDogIiIgKSArICJdIiwgdiwgdHJhZGl0aW9uYWwsIGFkZCApOwoJCQl9CgkJfSk7CgoJfSBlbHNlIGlmICggIXRyYWRpdGlvbmFsICYmIG9iaiAhPSBudWxsICYmIHR5cGVvZiBvYmogPT09ICJvYmplY3QiICkgewoJCS8vIFNlcmlhbGl6ZSBvYmplY3QgaXRlbS4KCQlmb3IgKCB2YXIgbmFtZSBpbiBvYmogKSB7CgkJCWJ1aWxkUGFyYW1zKCBwcmVmaXggKyAiWyIgKyBuYW1lICsgIl0iLCBvYmpbIG5hbWUgXSwgdHJhZGl0aW9uYWwsIGFkZCApOwoJCX0KCgl9IGVsc2UgewoJCS8vIFNlcmlhbGl6ZSBzY2FsYXIgaXRlbS4KCQlhZGQoIHByZWZpeCwgb2JqICk7Cgl9Cn0KCi8vIFRoaXMgaXMgc3RpbGwgb24gdGhlIGpRdWVyeSBvYmplY3QuLi4gZm9yIG5vdwovLyBXYW50IHRvIG1vdmUgdGhpcyB0byBqUXVlcnkuYWpheCBzb21lIGRheQpqUXVlcnkuZXh0ZW5kKHsKCgkvLyBDb3VudGVyIGZvciBob2xkaW5nIHRoZSBudW1iZXIgb2YgYWN0aXZlIHF1ZXJpZXMKCWFjdGl2ZTogMCwKCgkvLyBMYXN0LU1vZGlmaWVkIGhlYWRlciBjYWNoZSBmb3IgbmV4dCByZXF1ZXN0CglsYXN0TW9kaWZpZWQ6IHt9LAoJZXRhZzoge30KCn0pOwoKLyogSGFuZGxlcyByZXNwb25zZXMgdG8gYW4gYWpheCByZXF1ZXN0OgogKiAtIHNldHMgYWxsIHJlc3BvbnNlWFhYIGZpZWxkcyBhY2NvcmRpbmdseQogKiAtIGZpbmRzIHRoZSByaWdodCBkYXRhVHlwZSAobWVkaWF0ZXMgYmV0d2VlbiBjb250ZW50LXR5cGUgYW5kIGV4cGVjdGVkIGRhdGFUeXBlKQogKiAtIHJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgcmVzcG9uc2UKICovCmZ1bmN0aW9uIGFqYXhIYW5kbGVSZXNwb25zZXMoIHMsIGpxWEhSLCByZXNwb25zZXMgKSB7CgoJdmFyIGNvbnRlbnRzID0gcy5jb250ZW50cywKCQlkYXRhVHlwZXMgPSBzLmRhdGFUeXBlcywKCQlyZXNwb25zZUZpZWxkcyA9IHMucmVzcG9uc2VGaWVsZHMsCgkJY3QsCgkJdHlwZSwKCQlmaW5hbERhdGFUeXBlLAoJCWZpcnN0RGF0YVR5cGU7CgoJLy8gRmlsbCByZXNwb25zZVhYWCBmaWVsZHMKCWZvciggdHlwZSBpbiByZXNwb25zZUZpZWxkcyApIHsKCQlpZiAoIHR5cGUgaW4gcmVzcG9uc2VzICkgewoJCQlqcVhIUlsgcmVzcG9uc2VGaWVsZHNbdHlwZV0gXSA9IHJlc3BvbnNlc1sgdHlwZSBdOwoJCX0KCX0KCgkvLyBSZW1vdmUgYXV0byBkYXRhVHlwZSBhbmQgZ2V0IGNvbnRlbnQtdHlwZSBpbiB0aGUgcHJvY2VzcwoJd2hpbGUoIGRhdGFUeXBlc1sgMCBdID09PSAiKiIgKSB7CgkJZGF0YVR5cGVzLnNoaWZ0KCk7CgkJaWYgKCBjdCA9PT0gdW5kZWZpbmVkICkgewoJCQljdCA9IHMubWltZVR5cGUgfHwganFYSFIuZ2V0UmVzcG9uc2VIZWFkZXIoICJjb250ZW50LXR5cGUiICk7CgkJfQoJfQoKCS8vIENoZWNrIGlmIHdlJ3JlIGRlYWxpbmcgd2l0aCBhIGtub3duIGNvbnRlbnQtdHlwZQoJaWYgKCBjdCApIHsKCQlmb3IgKCB0eXBlIGluIGNvbnRlbnRzICkgewoJCQlpZiAoIGNvbnRlbnRzWyB0eXBlIF0gJiYgY29udGVudHNbIHR5cGUgXS50ZXN0KCBjdCApICkgewoJCQkJZGF0YVR5cGVzLnVuc2hpZnQoIHR5cGUgKTsKCQkJCWJyZWFrOwoJCQl9CgkJfQoJfQoKCS8vIENoZWNrIHRvIHNlZSBpZiB3ZSBoYXZlIGEgcmVzcG9uc2UgZm9yIHRoZSBleHBlY3RlZCBkYXRhVHlwZQoJaWYgKCBkYXRhVHlwZXNbIDAgXSBpbiByZXNwb25zZXMgKSB7CgkJZmluYWxEYXRhVHlwZSA9IGRhdGFUeXBlc1sgMCBdOwoJfSBlbHNlIHsKCQkvLyBUcnkgY29udmVydGlibGUgZGF0YVR5cGVzCgkJZm9yICggdHlwZSBpbiByZXNwb25zZXMgKSB7CgkJCWlmICggIWRhdGFUeXBlc1sgMCBdIHx8IHMuY29udmVydGVyc1sgdHlwZSArICIgIiArIGRhdGFUeXBlc1swXSBdICkgewoJCQkJZmluYWxEYXRhVHlwZSA9IHR5cGU7CgkJCQlicmVhazsKCQkJfQoJCQlpZiAoICFmaXJzdERhdGFUeXBlICkgewoJCQkJZmlyc3REYXRhVHlwZSA9IHR5cGU7CgkJCX0KCQl9CgkJLy8gT3IganVzdCB1c2UgZmlyc3Qgb25lCgkJZmluYWxEYXRhVHlwZSA9IGZpbmFsRGF0YVR5cGUgfHwgZmlyc3REYXRhVHlwZTsKCX0KCgkvLyBJZiB3ZSBmb3VuZCBhIGRhdGFUeXBlCgkvLyBXZSBhZGQgdGhlIGRhdGFUeXBlIHRvIHRoZSBsaXN0IGlmIG5lZWRlZAoJLy8gYW5kIHJldHVybiB0aGUgY29ycmVzcG9uZGluZyByZXNwb25zZQoJaWYgKCBmaW5hbERhdGFUeXBlICkgewoJCWlmICggZmluYWxEYXRhVHlwZSAhPT0gZGF0YVR5cGVzWyAwIF0gKSB7CgkJCWRhdGFUeXBlcy51bnNoaWZ0KCBmaW5hbERhdGFUeXBlICk7CgkJfQoJCXJldHVybiByZXNwb25zZXNbIGZpbmFsRGF0YVR5cGUgXTsKCX0KfQoKLy8gQ2hhaW4gY29udmVyc2lvbnMgZ2l2ZW4gdGhlIHJlcXVlc3QgYW5kIHRoZSBvcmlnaW5hbCByZXNwb25zZQpmdW5jdGlvbiBhamF4Q29udmVydCggcywgcmVzcG9uc2UgKSB7CgoJLy8gQXBwbHkgdGhlIGRhdGFGaWx0ZXIgaWYgcHJvdmlkZWQKCWlmICggcy5kYXRhRmlsdGVyICkgewoJCXJlc3BvbnNlID0gcy5kYXRhRmlsdGVyKCByZXNwb25zZSwgcy5kYXRhVHlwZSApOwoJfQoKCXZhciBkYXRhVHlwZXMgPSBzLmRhdGFUeXBlcywKCQljb252ZXJ0ZXJzID0ge30sCgkJaSwKCQlrZXksCgkJbGVuZ3RoID0gZGF0YVR5cGVzLmxlbmd0aCwKCQl0bXAsCgkJLy8gQ3VycmVudCBhbmQgcHJldmlvdXMgZGF0YVR5cGVzCgkJY3VycmVudCA9IGRhdGFUeXBlc1sgMCBdLAoJCXByZXYsCgkJLy8gQ29udmVyc2lvbiBleHByZXNzaW9uCgkJY29udmVyc2lvbiwKCQkvLyBDb252ZXJzaW9uIGZ1bmN0aW9uCgkJY29udiwKCQkvLyBDb252ZXJzaW9uIGZ1bmN0aW9ucyAodHJhbnNpdGl2ZSBjb252ZXJzaW9uKQoJCWNvbnYxLAoJCWNvbnYyOwoKCS8vIEZvciBlYWNoIGRhdGFUeXBlIGluIHRoZSBjaGFpbgoJZm9yKCBpID0gMTsgaSA8IGxlbmd0aDsgaSsrICkgewoKCQkvLyBDcmVhdGUgY29udmVydGVycyBtYXAKCQkvLyB3aXRoIGxvd2VyY2FzZWQga2V5cwoJCWlmICggaSA9PT0gMSApIHsKCQkJZm9yKCBrZXkgaW4gcy5jb252ZXJ0ZXJzICkgewoJCQkJaWYoIHR5cGVvZiBrZXkgPT09ICJzdHJpbmciICkgewoJCQkJCWNvbnZlcnRlcnNbIGtleS50b0xvd2VyQ2FzZSgpIF0gPSBzLmNvbnZlcnRlcnNbIGtleSBdOwoJCQkJfQoJCQl9CgkJfQoKCQkvLyBHZXQgdGhlIGRhdGFUeXBlcwoJCXByZXYgPSBjdXJyZW50OwoJCWN1cnJlbnQgPSBkYXRhVHlwZXNbIGkgXTsKCgkJLy8gSWYgY3VycmVudCBpcyBhdXRvIGRhdGFUeXBlLCB1cGRhdGUgaXQgdG8gcHJldgoJCWlmKCBjdXJyZW50ID09PSAiKiIgKSB7CgkJCWN1cnJlbnQgPSBwcmV2OwoJCS8vIElmIG5vIGF1dG8gYW5kIGRhdGFUeXBlcyBhcmUgYWN0dWFsbHkgZGlmZmVyZW50CgkJfSBlbHNlIGlmICggcHJldiAhPT0gIioiICYmIHByZXYgIT09IGN1cnJlbnQgKSB7CgoJCQkvLyBHZXQgdGhlIGNvbnZlcnRlcgoJCQljb252ZXJzaW9uID0gcHJldiArICIgIiArIGN1cnJlbnQ7CgkJCWNvbnYgPSBjb252ZXJ0ZXJzWyBjb252ZXJzaW9uIF0gfHwgY29udmVydGVyc1sgIiogIiArIGN1cnJlbnQgXTsKCgkJCS8vIElmIHRoZXJlIGlzIG5vIGRpcmVjdCBjb252ZXJ0ZXIsIHNlYXJjaCB0cmFuc2l0aXZlbHkKCQkJaWYgKCAhY29udiApIHsKCQkJCWNvbnYyID0gdW5kZWZpbmVkOwoJCQkJZm9yKCBjb252MSBpbiBjb252ZXJ0ZXJzICkgewoJCQkJCXRtcCA9IGNvbnYxLnNwbGl0KCAiICIgKTsKCQkJCQlpZiAoIHRtcFsgMCBdID09PSBwcmV2IHx8IHRtcFsgMCBdID09PSAiKiIgKSB7CgkJCQkJCWNvbnYyID0gY29udmVydGVyc1sgdG1wWzFdICsgIiAiICsgY3VycmVudCBdOwoJCQkJCQlpZiAoIGNvbnYyICkgewoJCQkJCQkJY29udjEgPSBjb252ZXJ0ZXJzWyBjb252MSBdOwoJCQkJCQkJaWYgKCBjb252MSA9PT0gdHJ1ZSApIHsKCQkJCQkJCQljb252ID0gY29udjI7CgkJCQkJCQl9IGVsc2UgaWYgKCBjb252MiA9PT0gdHJ1ZSApIHsKCQkJCQkJCQljb252ID0gY29udjE7CgkJCQkJCQl9CgkJCQkJCQlicmVhazsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJfQoJCQkvLyBJZiB3ZSBmb3VuZCBubyBjb252ZXJ0ZXIsIGRpc3BhdGNoIGFuIGVycm9yCgkJCWlmICggISggY29udiB8fCBjb252MiApICkgewoJCQkJalF1ZXJ5LmVycm9yKCAiTm8gY29udmVyc2lvbiBmcm9tICIgKyBjb252ZXJzaW9uLnJlcGxhY2UoIiAiLCIgdG8gIikgKTsKCQkJfQoJCQkvLyBJZiBmb3VuZCBjb252ZXJ0ZXIgaXMgbm90IGFuIGVxdWl2YWxlbmNlCgkJCWlmICggY29udiAhPT0gdHJ1ZSApIHsKCQkJCS8vIENvbnZlcnQgd2l0aCAxIG9yIDIgY29udmVydGVycyBhY2NvcmRpbmdseQoJCQkJcmVzcG9uc2UgPSBjb252ID8gY29udiggcmVzcG9uc2UgKSA6IGNvbnYyKCBjb252MShyZXNwb25zZSkgKTsKCQkJfQoJCX0KCX0KCXJldHVybiByZXNwb25zZTsKfQoKCgoKdmFyIGpzYyA9IGpRdWVyeS5ub3coKSwKCWpzcmUgPSAvKFw9KVw/KCZ8JCl8XD9cPy9pOwoKLy8gRGVmYXVsdCBqc29ucCBzZXR0aW5ncwpqUXVlcnkuYWpheFNldHVwKHsKCWpzb25wOiAiY2FsbGJhY2siLAoJanNvbnBDYWxsYmFjazogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIGpRdWVyeS5leHBhbmRvICsgIl8iICsgKCBqc2MrKyApOwoJfQp9KTsKCi8vIERldGVjdCwgbm9ybWFsaXplIG9wdGlvbnMgYW5kIGluc3RhbGwgY2FsbGJhY2tzIGZvciBqc29ucCByZXF1ZXN0cwpqUXVlcnkuYWpheFByZWZpbHRlciggImpzb24ganNvbnAiLCBmdW5jdGlvbiggcywgb3JpZ2luYWxTZXR0aW5ncywganFYSFIgKSB7CgoJdmFyIGluc3BlY3REYXRhID0gcy5jb250ZW50VHlwZSA9PT0gImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIgJiYKCQkoIHR5cGVvZiBzLmRhdGEgPT09ICJzdHJpbmciICk7CgoJaWYgKCBzLmRhdGFUeXBlc1sgMCBdID09PSAianNvbnAiIHx8CgkJcy5qc29ucCAhPT0gZmFsc2UgJiYgKCBqc3JlLnRlc3QoIHMudXJsICkgfHwKCQkJCWluc3BlY3REYXRhICYmIGpzcmUudGVzdCggcy5kYXRhICkgKSApIHsKCgkJdmFyIHJlc3BvbnNlQ29udGFpbmVyLAoJCQlqc29ucENhbGxiYWNrID0gcy5qc29ucENhbGxiYWNrID0KCQkJCWpRdWVyeS5pc0Z1bmN0aW9uKCBzLmpzb25wQ2FsbGJhY2sgKSA/IHMuanNvbnBDYWxsYmFjaygpIDogcy5qc29ucENhbGxiYWNrLAoJCQlwcmV2aW91cyA9IHdpbmRvd1sganNvbnBDYWxsYmFjayBdLAoJCQl1cmwgPSBzLnVybCwKCQkJZGF0YSA9IHMuZGF0YSwKCQkJcmVwbGFjZSA9ICIkMSIgKyBqc29ucENhbGxiYWNrICsgIiQyIjsKCgkJaWYgKCBzLmpzb25wICE9PSBmYWxzZSApIHsKCQkJdXJsID0gdXJsLnJlcGxhY2UoIGpzcmUsIHJlcGxhY2UgKTsKCQkJaWYgKCBzLnVybCA9PT0gdXJsICkgewoJCQkJaWYgKCBpbnNwZWN0RGF0YSApIHsKCQkJCQlkYXRhID0gZGF0YS5yZXBsYWNlKCBqc3JlLCByZXBsYWNlICk7CgkJCQl9CgkJCQlpZiAoIHMuZGF0YSA9PT0gZGF0YSApIHsKCQkJCQkvLyBBZGQgY2FsbGJhY2sgbWFudWFsbHkKCQkJCQl1cmwgKz0gKC9cPy8udGVzdCggdXJsICkgPyAiJiIgOiAiPyIpICsgcy5qc29ucCArICI9IiArIGpzb25wQ2FsbGJhY2s7CgkJCQl9CgkJCX0KCQl9CgoJCXMudXJsID0gdXJsOwoJCXMuZGF0YSA9IGRhdGE7CgoJCS8vIEluc3RhbGwgY2FsbGJhY2sKCQl3aW5kb3dbIGpzb25wQ2FsbGJhY2sgXSA9IGZ1bmN0aW9uKCByZXNwb25zZSApIHsKCQkJcmVzcG9uc2VDb250YWluZXIgPSBbIHJlc3BvbnNlIF07CgkJfTsKCgkJLy8gQ2xlYW4tdXAgZnVuY3Rpb24KCQlqcVhIUi5hbHdheXMoZnVuY3Rpb24oKSB7CgkJCS8vIFNldCBjYWxsYmFjayBiYWNrIHRvIHByZXZpb3VzIHZhbHVlCgkJCXdpbmRvd1sganNvbnBDYWxsYmFjayBdID0gcHJldmlvdXM7CgkJCS8vIENhbGwgaWYgaXQgd2FzIGEgZnVuY3Rpb24gYW5kIHdlIGhhdmUgYSByZXNwb25zZQoJCQlpZiAoIHJlc3BvbnNlQ29udGFpbmVyICYmIGpRdWVyeS5pc0Z1bmN0aW9uKCBwcmV2aW91cyApICkgewoJCQkJd2luZG93WyBqc29ucENhbGxiYWNrIF0oIHJlc3BvbnNlQ29udGFpbmVyWyAwIF0gKTsKCQkJfQoJCX0pOwoKCQkvLyBVc2UgZGF0YSBjb252ZXJ0ZXIgdG8gcmV0cmlldmUganNvbiBhZnRlciBzY3JpcHQgZXhlY3V0aW9uCgkJcy5jb252ZXJ0ZXJzWyJzY3JpcHQganNvbiJdID0gZnVuY3Rpb24oKSB7CgkJCWlmICggIXJlc3BvbnNlQ29udGFpbmVyICkgewoJCQkJalF1ZXJ5LmVycm9yKCBqc29ucENhbGxiYWNrICsgIiB3YXMgbm90IGNhbGxlZCIgKTsKCQkJfQoJCQlyZXR1cm4gcmVzcG9uc2VDb250YWluZXJbIDAgXTsKCQl9OwoKCQkvLyBmb3JjZSBqc29uIGRhdGFUeXBlCgkJcy5kYXRhVHlwZXNbIDAgXSA9ICJqc29uIjsKCgkJLy8gRGVsZWdhdGUgdG8gc2NyaXB0CgkJcmV0dXJuICJzY3JpcHQiOwoJfQp9KTsKCgoKCi8vIEluc3RhbGwgc2NyaXB0IGRhdGFUeXBlCmpRdWVyeS5hamF4U2V0dXAoewoJYWNjZXB0czogewoJCXNjcmlwdDogInRleHQvamF2YXNjcmlwdCwgYXBwbGljYXRpb24vamF2YXNjcmlwdCwgYXBwbGljYXRpb24vZWNtYXNjcmlwdCwgYXBwbGljYXRpb24veC1lY21hc2NyaXB0IgoJfSwKCWNvbnRlbnRzOiB7CgkJc2NyaXB0OiAvamF2YXNjcmlwdHxlY21hc2NyaXB0LwoJfSwKCWNvbnZlcnRlcnM6IHsKCQkidGV4dCBzY3JpcHQiOiBmdW5jdGlvbiggdGV4dCApIHsKCQkJalF1ZXJ5Lmdsb2JhbEV2YWwoIHRleHQgKTsKCQkJcmV0dXJuIHRleHQ7CgkJfQoJfQp9KTsKCi8vIEhhbmRsZSBjYWNoZSdzIHNwZWNpYWwgY2FzZSBhbmQgZ2xvYmFsCmpRdWVyeS5hamF4UHJlZmlsdGVyKCAic2NyaXB0IiwgZnVuY3Rpb24oIHMgKSB7CglpZiAoIHMuY2FjaGUgPT09IHVuZGVmaW5lZCApIHsKCQlzLmNhY2hlID0gZmFsc2U7Cgl9CglpZiAoIHMuY3Jvc3NEb21haW4gKSB7CgkJcy50eXBlID0gIkdFVCI7CgkJcy5nbG9iYWwgPSBmYWxzZTsKCX0KfSk7CgovLyBCaW5kIHNjcmlwdCB0YWcgaGFjayB0cmFuc3BvcnQKalF1ZXJ5LmFqYXhUcmFuc3BvcnQoICJzY3JpcHQiLCBmdW5jdGlvbihzKSB7CgoJLy8gVGhpcyB0cmFuc3BvcnQgb25seSBkZWFscyB3aXRoIGNyb3NzIGRvbWFpbiByZXF1ZXN0cwoJaWYgKCBzLmNyb3NzRG9tYWluICkgewoKCQl2YXIgc2NyaXB0LAoJCQloZWFkID0gZG9jdW1lbnQuaGVhZCB8fCBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSggImhlYWQiIClbMF0gfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50OwoKCQlyZXR1cm4gewoKCQkJc2VuZDogZnVuY3Rpb24oIF8sIGNhbGxiYWNrICkgewoKCQkJCXNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICJzY3JpcHQiICk7CgoJCQkJc2NyaXB0LmFzeW5jID0gImFzeW5jIjsKCgkJCQlpZiAoIHMuc2NyaXB0Q2hhcnNldCApIHsKCQkJCQlzY3JpcHQuY2hhcnNldCA9IHMuc2NyaXB0Q2hhcnNldDsKCQkJCX0KCgkJCQlzY3JpcHQuc3JjID0gcy51cmw7CgoJCQkJLy8gQXR0YWNoIGhhbmRsZXJzIGZvciBhbGwgYnJvd3NlcnMKCQkJCXNjcmlwdC5vbmxvYWQgPSBzY3JpcHQub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oIF8sIGlzQWJvcnQgKSB7CgoJCQkJCWlmICggaXNBYm9ydCB8fCAhc2NyaXB0LnJlYWR5U3RhdGUgfHwgL2xvYWRlZHxjb21wbGV0ZS8udGVzdCggc2NyaXB0LnJlYWR5U3RhdGUgKSApIHsKCgkJCQkJCS8vIEhhbmRsZSBtZW1vcnkgbGVhayBpbiBJRQoJCQkJCQlzY3JpcHQub25sb2FkID0gc2NyaXB0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IG51bGw7CgoJCQkJCQkvLyBSZW1vdmUgdGhlIHNjcmlwdAoJCQkJCQlpZiAoIGhlYWQgJiYgc2NyaXB0LnBhcmVudE5vZGUgKSB7CgkJCQkJCQloZWFkLnJlbW92ZUNoaWxkKCBzY3JpcHQgKTsKCQkJCQkJfQoKCQkJCQkJLy8gRGVyZWZlcmVuY2UgdGhlIHNjcmlwdAoJCQkJCQlzY3JpcHQgPSB1bmRlZmluZWQ7CgoJCQkJCQkvLyBDYWxsYmFjayBpZiBub3QgYWJvcnQKCQkJCQkJaWYgKCAhaXNBYm9ydCApIHsKCQkJCQkJCWNhbGxiYWNrKCAyMDAsICJzdWNjZXNzIiApOwoJCQkJCQl9CgkJCQkJfQoJCQkJfTsKCQkJCS8vIFVzZSBpbnNlcnRCZWZvcmUgaW5zdGVhZCBvZiBhcHBlbmRDaGlsZCAgdG8gY2lyY3VtdmVudCBhbiBJRTYgYnVnLgoJCQkJLy8gVGhpcyBhcmlzZXMgd2hlbiBhIGJhc2Ugbm9kZSBpcyB1c2VkICgjMjcwOSBhbmQgIzQzNzgpLgoJCQkJaGVhZC5pbnNlcnRCZWZvcmUoIHNjcmlwdCwgaGVhZC5maXJzdENoaWxkICk7CgkJCX0sCgoJCQlhYm9ydDogZnVuY3Rpb24oKSB7CgkJCQlpZiAoIHNjcmlwdCApIHsKCQkJCQlzY3JpcHQub25sb2FkKCAwLCAxICk7CgkJCQl9CgkJCX0KCQl9OwoJfQp9KTsKCgoKCnZhciAvLyAjNTI4MDogSW50ZXJuZXQgRXhwbG9yZXIgd2lsbCBrZWVwIGNvbm5lY3Rpb25zIGFsaXZlIGlmIHdlIGRvbid0IGFib3J0IG9uIHVubG9hZAoJeGhyT25VbmxvYWRBYm9ydCA9IHdpbmRvdy5BY3RpdmVYT2JqZWN0ID8gZnVuY3Rpb24oKSB7CgkJLy8gQWJvcnQgYWxsIHBlbmRpbmcgcmVxdWVzdHMKCQlmb3IgKCB2YXIga2V5IGluIHhockNhbGxiYWNrcyApIHsKCQkJeGhyQ2FsbGJhY2tzWyBrZXkgXSggMCwgMSApOwoJCX0KCX0gOiBmYWxzZSwKCXhocklkID0gMCwKCXhockNhbGxiYWNrczsKCi8vIEZ1bmN0aW9ucyB0byBjcmVhdGUgeGhycwpmdW5jdGlvbiBjcmVhdGVTdGFuZGFyZFhIUigpIHsKCXRyeSB7CgkJcmV0dXJuIG5ldyB3aW5kb3cuWE1MSHR0cFJlcXVlc3QoKTsKCX0gY2F0Y2goIGUgKSB7fQp9CgpmdW5jdGlvbiBjcmVhdGVBY3RpdmVYSFIoKSB7Cgl0cnkgewoJCXJldHVybiBuZXcgd2luZG93LkFjdGl2ZVhPYmplY3QoICJNaWNyb3NvZnQuWE1MSFRUUCIgKTsKCX0gY2F0Y2goIGUgKSB7fQp9CgovLyBDcmVhdGUgdGhlIHJlcXVlc3Qgb2JqZWN0Ci8vIChUaGlzIGlzIHN0aWxsIGF0dGFjaGVkIHRvIGFqYXhTZXR0aW5ncyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSkKalF1ZXJ5LmFqYXhTZXR0aW5ncy54aHIgPSB3aW5kb3cuQWN0aXZlWE9iamVjdCA/CgkvKiBNaWNyb3NvZnQgZmFpbGVkIHRvIHByb3Blcmx5CgkgKiBpbXBsZW1lbnQgdGhlIFhNTEh0dHBSZXF1ZXN0IGluIElFNyAoY2FuJ3QgcmVxdWVzdCBsb2NhbCBmaWxlcyksCgkgKiBzbyB3ZSB1c2UgdGhlIEFjdGl2ZVhPYmplY3Qgd2hlbiBpdCBpcyBhdmFpbGFibGUKCSAqIEFkZGl0aW9uYWxseSBYTUxIdHRwUmVxdWVzdCBjYW4gYmUgZGlzYWJsZWQgaW4gSUU3L0lFOCBzbwoJICogd2UgbmVlZCBhIGZhbGxiYWNrLgoJICovCglmdW5jdGlvbigpIHsKCQlyZXR1cm4gIXRoaXMuaXNMb2NhbCAmJiBjcmVhdGVTdGFuZGFyZFhIUigpIHx8IGNyZWF0ZUFjdGl2ZVhIUigpOwoJfSA6CgkvLyBGb3IgYWxsIG90aGVyIGJyb3dzZXJzLCB1c2UgdGhlIHN0YW5kYXJkIFhNTEh0dHBSZXF1ZXN0IG9iamVjdAoJY3JlYXRlU3RhbmRhcmRYSFI7CgovLyBEZXRlcm1pbmUgc3VwcG9ydCBwcm9wZXJ0aWVzCihmdW5jdGlvbiggeGhyICkgewoJalF1ZXJ5LmV4dGVuZCggalF1ZXJ5LnN1cHBvcnQsIHsKCQlhamF4OiAhIXhociwKCQljb3JzOiAhIXhociAmJiAoICJ3aXRoQ3JlZGVudGlhbHMiIGluIHhociApCgl9KTsKfSkoIGpRdWVyeS5hamF4U2V0dGluZ3MueGhyKCkgKTsKCi8vIENyZWF0ZSB0cmFuc3BvcnQgaWYgdGhlIGJyb3dzZXIgY2FuIHByb3ZpZGUgYW4geGhyCmlmICggalF1ZXJ5LnN1cHBvcnQuYWpheCApIHsKCglqUXVlcnkuYWpheFRyYW5zcG9ydChmdW5jdGlvbiggcyApIHsKCQkvLyBDcm9zcyBkb21haW4gb25seSBhbGxvd2VkIGlmIHN1cHBvcnRlZCB0aHJvdWdoIFhNTEh0dHBSZXF1ZXN0CgkJaWYgKCAhcy5jcm9zc0RvbWFpbiB8fCBqUXVlcnkuc3VwcG9ydC5jb3JzICkgewoKCQkJdmFyIGNhbGxiYWNrOwoKCQkJcmV0dXJuIHsKCQkJCXNlbmQ6IGZ1bmN0aW9uKCBoZWFkZXJzLCBjb21wbGV0ZSApIHsKCgkJCQkJLy8gR2V0IGEgbmV3IHhocgoJCQkJCXZhciB4aHIgPSBzLnhocigpLAoJCQkJCQloYW5kbGUsCgkJCQkJCWk7CgoJCQkJCS8vIE9wZW4gdGhlIHNvY2tldAoJCQkJCS8vIFBhc3NpbmcgbnVsbCB1c2VybmFtZSwgZ2VuZXJhdGVzIGEgbG9naW4gcG9wdXAgb24gT3BlcmEgKCMyODY1KQoJCQkJCWlmICggcy51c2VybmFtZSApIHsKCQkJCQkJeGhyLm9wZW4oIHMudHlwZSwgcy51cmwsIHMuYXN5bmMsIHMudXNlcm5hbWUsIHMucGFzc3dvcmQgKTsKCQkJCQl9IGVsc2UgewoJCQkJCQl4aHIub3Blbiggcy50eXBlLCBzLnVybCwgcy5hc3luYyApOwoJCQkJCX0KCgkJCQkJLy8gQXBwbHkgY3VzdG9tIGZpZWxkcyBpZiBwcm92aWRlZAoJCQkJCWlmICggcy54aHJGaWVsZHMgKSB7CgkJCQkJCWZvciAoIGkgaW4gcy54aHJGaWVsZHMgKSB7CgkJCQkJCQl4aHJbIGkgXSA9IHMueGhyRmllbGRzWyBpIF07CgkJCQkJCX0KCQkJCQl9CgoJCQkJCS8vIE92ZXJyaWRlIG1pbWUgdHlwZSBpZiBuZWVkZWQKCQkJCQlpZiAoIHMubWltZVR5cGUgJiYgeGhyLm92ZXJyaWRlTWltZVR5cGUgKSB7CgkJCQkJCXhoci5vdmVycmlkZU1pbWVUeXBlKCBzLm1pbWVUeXBlICk7CgkJCQkJfQoKCQkJCQkvLyBYLVJlcXVlc3RlZC1XaXRoIGhlYWRlcgoJCQkJCS8vIEZvciBjcm9zcy1kb21haW4gcmVxdWVzdHMsIHNlZWluZyBhcyBjb25kaXRpb25zIGZvciBhIHByZWZsaWdodCBhcmUKCQkJCQkvLyBha2luIHRvIGEgamlnc2F3IHB1enpsZSwgd2Ugc2ltcGx5IG5ldmVyIHNldCBpdCB0byBiZSBzdXJlLgoJCQkJCS8vIChpdCBjYW4gYWx3YXlzIGJlIHNldCBvbiBhIHBlci1yZXF1ZXN0IGJhc2lzIG9yIGV2ZW4gdXNpbmcgYWpheFNldHVwKQoJCQkJCS8vIEZvciBzYW1lLWRvbWFpbiByZXF1ZXN0cywgd29uJ3QgY2hhbmdlIGhlYWRlciBpZiBhbHJlYWR5IHByb3ZpZGVkLgoJCQkJCWlmICggIXMuY3Jvc3NEb21haW4gJiYgIWhlYWRlcnNbIlgtUmVxdWVzdGVkLVdpdGgiXSApIHsKCQkJCQkJaGVhZGVyc1sgIlgtUmVxdWVzdGVkLVdpdGgiIF0gPSAiWE1MSHR0cFJlcXVlc3QiOwoJCQkJCX0KCgkJCQkJLy8gTmVlZCBhbiBleHRyYSB0cnkvY2F0Y2ggZm9yIGNyb3NzIGRvbWFpbiByZXF1ZXN0cyBpbiBGaXJlZm94IDMKCQkJCQl0cnkgewoJCQkJCQlmb3IgKCBpIGluIGhlYWRlcnMgKSB7CgkJCQkJCQl4aHIuc2V0UmVxdWVzdEhlYWRlciggaSwgaGVhZGVyc1sgaSBdICk7CgkJCQkJCX0KCQkJCQl9IGNhdGNoKCBfICkge30KCgkJCQkJLy8gRG8gc2VuZCB0aGUgcmVxdWVzdAoJCQkJCS8vIFRoaXMgbWF5IHJhaXNlIGFuIGV4Y2VwdGlvbiB3aGljaCBpcyBhY3R1YWxseQoJCQkJCS8vIGhhbmRsZWQgaW4galF1ZXJ5LmFqYXggKHNvIG5vIHRyeS9jYXRjaCBoZXJlKQoJCQkJCXhoci5zZW5kKCAoIHMuaGFzQ29udGVudCAmJiBzLmRhdGEgKSB8fCBudWxsICk7CgoJCQkJCS8vIExpc3RlbmVyCgkJCQkJY2FsbGJhY2sgPSBmdW5jdGlvbiggXywgaXNBYm9ydCApIHsKCgkJCQkJCXZhciBzdGF0dXMsCgkJCQkJCQlzdGF0dXNUZXh0LAoJCQkJCQkJcmVzcG9uc2VIZWFkZXJzLAoJCQkJCQkJcmVzcG9uc2VzLAoJCQkJCQkJeG1sOwoKCQkJCQkJLy8gRmlyZWZveCB0aHJvd3MgZXhjZXB0aW9ucyB3aGVuIGFjY2Vzc2luZyBwcm9wZXJ0aWVzCgkJCQkJCS8vIG9mIGFuIHhociB3aGVuIGEgbmV0d29yayBlcnJvciBvY2N1cmVkCgkJCQkJCS8vIGh0dHA6Ly9oZWxwZnVsLmtub2JzLWRpYWxzLmNvbS9pbmRleC5waHAvQ29tcG9uZW50X3JldHVybmVkX2ZhaWx1cmVfY29kZTpfMHg4MDA0MDExMV8oTlNfRVJST1JfTk9UX0FWQUlMQUJMRSkKCQkJCQkJdHJ5IHsKCgkJCQkJCQkvLyBXYXMgbmV2ZXIgY2FsbGVkIGFuZCBpcyBhYm9ydGVkIG9yIGNvbXBsZXRlCgkJCQkJCQlpZiAoIGNhbGxiYWNrICYmICggaXNBYm9ydCB8fCB4aHIucmVhZHlTdGF0ZSA9PT0gNCApICkgewoKCQkJCQkJCQkvLyBPbmx5IGNhbGxlZCBvbmNlCgkJCQkJCQkJY2FsbGJhY2sgPSB1bmRlZmluZWQ7CgoJCQkJCQkJCS8vIERvIG5vdCBrZWVwIGFzIGFjdGl2ZSBhbnltb3JlCgkJCQkJCQkJaWYgKCBoYW5kbGUgKSB7CgkJCQkJCQkJCXhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBqUXVlcnkubm9vcDsKCQkJCQkJCQkJaWYgKCB4aHJPblVubG9hZEFib3J0ICkgewoJCQkJCQkJCQkJZGVsZXRlIHhockNhbGxiYWNrc1sgaGFuZGxlIF07CgkJCQkJCQkJCX0KCQkJCQkJCQl9CgoJCQkJCQkJCS8vIElmIGl0J3MgYW4gYWJvcnQKCQkJCQkJCQlpZiAoIGlzQWJvcnQgKSB7CgkJCQkJCQkJCS8vIEFib3J0IGl0IG1hbnVhbGx5IGlmIG5lZWRlZAoJCQkJCQkJCQlpZiAoIHhoci5yZWFkeVN0YXRlICE9PSA0ICkgewoJCQkJCQkJCQkJeGhyLmFib3J0KCk7CgkJCQkJCQkJCX0KCQkJCQkJCQl9IGVsc2UgewoJCQkJCQkJCQlzdGF0dXMgPSB4aHIuc3RhdHVzOwoJCQkJCQkJCQlyZXNwb25zZUhlYWRlcnMgPSB4aHIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCk7CgkJCQkJCQkJCXJlc3BvbnNlcyA9IHt9OwoJCQkJCQkJCQl4bWwgPSB4aHIucmVzcG9uc2VYTUw7CgoJCQkJCQkJCQkvLyBDb25zdHJ1Y3QgcmVzcG9uc2UgbGlzdAoJCQkJCQkJCQlpZiAoIHhtbCAmJiB4bWwuZG9jdW1lbnRFbGVtZW50IC8qICM0OTU4ICovICkgewoJCQkJCQkJCQkJcmVzcG9uc2VzLnhtbCA9IHhtbDsKCQkJCQkJCQkJfQoJCQkJCQkJCQlyZXNwb25zZXMudGV4dCA9IHhoci5yZXNwb25zZVRleHQ7CgoJCQkJCQkJCQkvLyBGaXJlZm94IHRocm93cyBhbiBleGNlcHRpb24gd2hlbiBhY2Nlc3NpbmcKCQkJCQkJCQkJLy8gc3RhdHVzVGV4dCBmb3IgZmF1bHR5IGNyb3NzLWRvbWFpbiByZXF1ZXN0cwoJCQkJCQkJCQl0cnkgewoJCQkJCQkJCQkJc3RhdHVzVGV4dCA9IHhoci5zdGF0dXNUZXh0OwoJCQkJCQkJCQl9IGNhdGNoKCBlICkgewoJCQkJCQkJCQkJLy8gV2Ugbm9ybWFsaXplIHdpdGggV2Via2l0IGdpdmluZyBhbiBlbXB0eSBzdGF0dXNUZXh0CgkJCQkJCQkJCQlzdGF0dXNUZXh0ID0gIiI7CgkJCQkJCQkJCX0KCgkJCQkJCQkJCS8vIEZpbHRlciBzdGF0dXMgZm9yIG5vbiBzdGFuZGFyZCBiZWhhdmlvcnMKCgkJCQkJCQkJCS8vIElmIHRoZSByZXF1ZXN0IGlzIGxvY2FsIGFuZCB3ZSBoYXZlIGRhdGE6IGFzc3VtZSBhIHN1Y2Nlc3MKCQkJCQkJCQkJLy8gKHN1Y2Nlc3Mgd2l0aCBubyBkYXRhIHdvbid0IGdldCBub3RpZmllZCwgdGhhdCdzIHRoZSBiZXN0IHdlCgkJCQkJCQkJCS8vIGNhbiBkbyBnaXZlbiBjdXJyZW50IGltcGxlbWVudGF0aW9ucykKCQkJCQkJCQkJaWYgKCAhc3RhdHVzICYmIHMuaXNMb2NhbCAmJiAhcy5jcm9zc0RvbWFpbiApIHsKCQkJCQkJCQkJCXN0YXR1cyA9IHJlc3BvbnNlcy50ZXh0ID8gMjAwIDogNDA0OwoJCQkJCQkJCQkvLyBJRSAtICMxNDUwOiBzb21ldGltZXMgcmV0dXJucyAxMjIzIHdoZW4gaXQgc2hvdWxkIGJlIDIwNAoJCQkJCQkJCQl9IGVsc2UgaWYgKCBzdGF0dXMgPT09IDEyMjMgKSB7CgkJCQkJCQkJCQlzdGF0dXMgPSAyMDQ7CgkJCQkJCQkJCX0KCQkJCQkJCQl9CgkJCQkJCQl9CgkJCQkJCX0gY2F0Y2goIGZpcmVmb3hBY2Nlc3NFeGNlcHRpb24gKSB7CgkJCQkJCQlpZiAoICFpc0Fib3J0ICkgewoJCQkJCQkJCWNvbXBsZXRlKCAtMSwgZmlyZWZveEFjY2Vzc0V4Y2VwdGlvbiApOwoJCQkJCQkJfQoJCQkJCQl9CgoJCQkJCQkvLyBDYWxsIGNvbXBsZXRlIGlmIG5lZWRlZAoJCQkJCQlpZiAoIHJlc3BvbnNlcyApIHsKCQkJCQkJCWNvbXBsZXRlKCBzdGF0dXMsIHN0YXR1c1RleHQsIHJlc3BvbnNlcywgcmVzcG9uc2VIZWFkZXJzICk7CgkJCQkJCX0KCQkJCQl9OwoKCQkJCQkvLyBpZiB3ZSdyZSBpbiBzeW5jIG1vZGUgb3IgaXQncyBpbiBjYWNoZQoJCQkJCS8vIGFuZCBoYXMgYmVlbiByZXRyaWV2ZWQgZGlyZWN0bHkgKElFNiAmIElFNykKCQkJCQkvLyB3ZSBuZWVkIHRvIG1hbnVhbGx5IGZpcmUgdGhlIGNhbGxiYWNrCgkJCQkJaWYgKCAhcy5hc3luYyB8fCB4aHIucmVhZHlTdGF0ZSA9PT0gNCApIHsKCQkJCQkJY2FsbGJhY2soKTsKCQkJCQl9IGVsc2UgewoJCQkJCQloYW5kbGUgPSArK3hocklkOwoJCQkJCQlpZiAoIHhock9uVW5sb2FkQWJvcnQgKSB7CgkJCQkJCQkvLyBDcmVhdGUgdGhlIGFjdGl2ZSB4aHJzIGNhbGxiYWNrcyBsaXN0IGlmIG5lZWRlZAoJCQkJCQkJLy8gYW5kIGF0dGFjaCB0aGUgdW5sb2FkIGhhbmRsZXIKCQkJCQkJCWlmICggIXhockNhbGxiYWNrcyApIHsKCQkJCQkJCQl4aHJDYWxsYmFja3MgPSB7fTsKCQkJCQkJCQlqUXVlcnkoIHdpbmRvdyApLnVubG9hZCggeGhyT25VbmxvYWRBYm9ydCApOwoJCQkJCQkJfQoJCQkJCQkJLy8gQWRkIHRvIGxpc3Qgb2YgYWN0aXZlIHhocnMgY2FsbGJhY2tzCgkJCQkJCQl4aHJDYWxsYmFja3NbIGhhbmRsZSBdID0gY2FsbGJhY2s7CgkJCQkJCX0KCQkJCQkJeGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGNhbGxiYWNrOwoJCQkJCX0KCQkJCX0sCgoJCQkJYWJvcnQ6IGZ1bmN0aW9uKCkgewoJCQkJCWlmICggY2FsbGJhY2sgKSB7CgkJCQkJCWNhbGxiYWNrKDAsMSk7CgkJCQkJfQoJCQkJfQoJCQl9OwoJCX0KCX0pOwp9CgoKCgp2YXIgZWxlbWRpc3BsYXkgPSB7fSwKCWlmcmFtZSwgaWZyYW1lRG9jLAoJcmZ4dHlwZXMgPSAvXig/OnRvZ2dsZXxzaG93fGhpZGUpJC8sCglyZnhudW0gPSAvXihbK1wtXT0pPyhbXGQrLlwtXSspKFthLXolXSopJC9pLAoJdGltZXJJZCwKCWZ4QXR0cnMgPSBbCgkJLy8gaGVpZ2h0IGFuaW1hdGlvbnMKCQlbICJoZWlnaHQiLCAibWFyZ2luVG9wIiwgIm1hcmdpbkJvdHRvbSIsICJwYWRkaW5nVG9wIiwgInBhZGRpbmdCb3R0b20iIF0sCgkJLy8gd2lkdGggYW5pbWF0aW9ucwoJCVsgIndpZHRoIiwgIm1hcmdpbkxlZnQiLCAibWFyZ2luUmlnaHQiLCAicGFkZGluZ0xlZnQiLCAicGFkZGluZ1JpZ2h0IiBdLAoJCS8vIG9wYWNpdHkgYW5pbWF0aW9ucwoJCVsgIm9wYWNpdHkiIF0KCV0sCglmeE5vdzsKCmpRdWVyeS5mbi5leHRlbmQoewoJc2hvdzogZnVuY3Rpb24oIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICkgewoJCXZhciBlbGVtLCBkaXNwbGF5OwoKCQlpZiAoIHNwZWVkIHx8IHNwZWVkID09PSAwICkgewoJCQlyZXR1cm4gdGhpcy5hbmltYXRlKCBnZW5GeCgic2hvdyIsIDMpLCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayk7CgoJCX0gZWxzZSB7CgkJCWZvciAoIHZhciBpID0gMCwgaiA9IHRoaXMubGVuZ3RoOyBpIDwgajsgaSsrICkgewoJCQkJZWxlbSA9IHRoaXNbaV07CgoJCQkJaWYgKCBlbGVtLnN0eWxlICkgewoJCQkJCWRpc3BsYXkgPSBlbGVtLnN0eWxlLmRpc3BsYXk7CgoJCQkJCS8vIFJlc2V0IHRoZSBpbmxpbmUgZGlzcGxheSBvZiB0aGlzIGVsZW1lbnQgdG8gbGVhcm4gaWYgaXQgaXMKCQkJCQkvLyBiZWluZyBoaWRkZW4gYnkgY2FzY2FkZWQgcnVsZXMgb3Igbm90CgkJCQkJaWYgKCAhalF1ZXJ5Ll9kYXRhKGVsZW0sICJvbGRkaXNwbGF5IikgJiYgZGlzcGxheSA9PT0gIm5vbmUiICkgewoJCQkJCQlkaXNwbGF5ID0gZWxlbS5zdHlsZS5kaXNwbGF5ID0gIiI7CgkJCQkJfQoKCQkJCQkvLyBTZXQgZWxlbWVudHMgd2hpY2ggaGF2ZSBiZWVuIG92ZXJyaWRkZW4gd2l0aCBkaXNwbGF5OiBub25lCgkJCQkJLy8gaW4gYSBzdHlsZXNoZWV0IHRvIHdoYXRldmVyIHRoZSBkZWZhdWx0IGJyb3dzZXIgc3R5bGUgaXMKCQkJCQkvLyBmb3Igc3VjaCBhbiBlbGVtZW50CgkJCQkJaWYgKCBkaXNwbGF5ID09PSAiIiAmJiBqUXVlcnkuY3NzKCBlbGVtLCAiZGlzcGxheSIgKSA9PT0gIm5vbmUiICkgewoJCQkJCQlqUXVlcnkuX2RhdGEoZWxlbSwgIm9sZGRpc3BsYXkiLCBkZWZhdWx0RGlzcGxheShlbGVtLm5vZGVOYW1lKSk7CgkJCQkJfQoJCQkJfQoJCQl9CgoJCQkvLyBTZXQgdGhlIGRpc3BsYXkgb2YgbW9zdCBvZiB0aGUgZWxlbWVudHMgaW4gYSBzZWNvbmQgbG9vcAoJCQkvLyB0byBhdm9pZCB0aGUgY29uc3RhbnQgcmVmbG93CgkJCWZvciAoIGkgPSAwOyBpIDwgajsgaSsrICkgewoJCQkJZWxlbSA9IHRoaXNbaV07CgoJCQkJaWYgKCBlbGVtLnN0eWxlICkgewoJCQkJCWRpc3BsYXkgPSBlbGVtLnN0eWxlLmRpc3BsYXk7CgoJCQkJCWlmICggZGlzcGxheSA9PT0gIiIgfHwgZGlzcGxheSA9PT0gIm5vbmUiICkgewoJCQkJCQllbGVtLnN0eWxlLmRpc3BsYXkgPSBqUXVlcnkuX2RhdGEoZWxlbSwgIm9sZGRpc3BsYXkiKSB8fCAiIjsKCQkJCQl9CgkJCQl9CgkJCX0KCgkJCXJldHVybiB0aGlzOwoJCX0KCX0sCgoJaGlkZTogZnVuY3Rpb24oIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICkgewoJCWlmICggc3BlZWQgfHwgc3BlZWQgPT09IDAgKSB7CgkJCXJldHVybiB0aGlzLmFuaW1hdGUoIGdlbkZ4KCJoaWRlIiwgMyksIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrKTsKCgkJfSBlbHNlIHsKCQkJZm9yICggdmFyIGkgPSAwLCBqID0gdGhpcy5sZW5ndGg7IGkgPCBqOyBpKysgKSB7CgkJCQlpZiAoIHRoaXNbaV0uc3R5bGUgKSB7CgkJCQkJdmFyIGRpc3BsYXkgPSBqUXVlcnkuY3NzKCB0aGlzW2ldLCAiZGlzcGxheSIgKTsKCgkJCQkJaWYgKCBkaXNwbGF5ICE9PSAibm9uZSIgJiYgIWpRdWVyeS5fZGF0YSggdGhpc1tpXSwgIm9sZGRpc3BsYXkiICkgKSB7CgkJCQkJCWpRdWVyeS5fZGF0YSggdGhpc1tpXSwgIm9sZGRpc3BsYXkiLCBkaXNwbGF5ICk7CgkJCQkJfQoJCQkJfQoJCQl9CgoJCQkvLyBTZXQgdGhlIGRpc3BsYXkgb2YgdGhlIGVsZW1lbnRzIGluIGEgc2Vjb25kIGxvb3AKCQkJLy8gdG8gYXZvaWQgdGhlIGNvbnN0YW50IHJlZmxvdwoJCQlmb3IgKCBpID0gMDsgaSA8IGo7IGkrKyApIHsKCQkJCWlmICggdGhpc1tpXS5zdHlsZSApIHsKCQkJCQl0aGlzW2ldLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7CgkJCQl9CgkJCX0KCgkJCXJldHVybiB0aGlzOwoJCX0KCX0sCgoJLy8gU2F2ZSB0aGUgb2xkIHRvZ2dsZSBmdW5jdGlvbgoJX3RvZ2dsZTogalF1ZXJ5LmZuLnRvZ2dsZSwKCgl0b2dnbGU6IGZ1bmN0aW9uKCBmbiwgZm4yLCBjYWxsYmFjayApIHsKCQl2YXIgYm9vbCA9IHR5cGVvZiBmbiA9PT0gImJvb2xlYW4iOwoKCQlpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKGZuKSAmJiBqUXVlcnkuaXNGdW5jdGlvbihmbjIpICkgewoJCQl0aGlzLl90b2dnbGUuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApOwoKCQl9IGVsc2UgaWYgKCBmbiA9PSBudWxsIHx8IGJvb2wgKSB7CgkJCXRoaXMuZWFjaChmdW5jdGlvbigpIHsKCQkJCXZhciBzdGF0ZSA9IGJvb2wgPyBmbiA6IGpRdWVyeSh0aGlzKS5pcygiOmhpZGRlbiIpOwoJCQkJalF1ZXJ5KHRoaXMpWyBzdGF0ZSA/ICJzaG93IiA6ICJoaWRlIiBdKCk7CgkJCX0pOwoKCQl9IGVsc2UgewoJCQl0aGlzLmFuaW1hdGUoZ2VuRngoInRvZ2dsZSIsIDMpLCBmbiwgZm4yLCBjYWxsYmFjayk7CgkJfQoKCQlyZXR1cm4gdGhpczsKCX0sCgoJZmFkZVRvOiBmdW5jdGlvbiggc3BlZWQsIHRvLCBlYXNpbmcsIGNhbGxiYWNrICkgewoJCXJldHVybiB0aGlzLmZpbHRlcigiOmhpZGRlbiIpLmNzcygib3BhY2l0eSIsIDApLnNob3coKS5lbmQoKQoJCQkJCS5hbmltYXRlKHtvcGFjaXR5OiB0b30sIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrKTsKCX0sCgoJYW5pbWF0ZTogZnVuY3Rpb24oIHByb3AsIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICkgewoJCXZhciBvcHRhbGwgPSBqUXVlcnkuc3BlZWQoc3BlZWQsIGVhc2luZywgY2FsbGJhY2spOwoKCQlpZiAoIGpRdWVyeS5pc0VtcHR5T2JqZWN0KCBwcm9wICkgKSB7CgkJCXJldHVybiB0aGlzLmVhY2goIG9wdGFsbC5jb21wbGV0ZSwgWyBmYWxzZSBdICk7CgkJfQoKCQkvLyBEbyBub3QgY2hhbmdlIHJlZmVyZW5jZWQgcHJvcGVydGllcyBhcyBwZXItcHJvcGVydHkgZWFzaW5nIHdpbGwgYmUgbG9zdAoJCXByb3AgPSBqUXVlcnkuZXh0ZW5kKCB7fSwgcHJvcCApOwoKCQlyZXR1cm4gdGhpc1sgb3B0YWxsLnF1ZXVlID09PSBmYWxzZSA/ICJlYWNoIiA6ICJxdWV1ZSIgXShmdW5jdGlvbigpIHsKCQkJLy8gWFhYICd0aGlzJyBkb2VzIG5vdCBhbHdheXMgaGF2ZSBhIG5vZGVOYW1lIHdoZW4gcnVubmluZyB0aGUKCQkJLy8gdGVzdCBzdWl0ZQoKCQkJaWYgKCBvcHRhbGwucXVldWUgPT09IGZhbHNlICkgewoJCQkJalF1ZXJ5Ll9tYXJrKCB0aGlzICk7CgkJCX0KCgkJCXZhciBvcHQgPSBqUXVlcnkuZXh0ZW5kKCB7fSwgb3B0YWxsICksCgkJCQlpc0VsZW1lbnQgPSB0aGlzLm5vZGVUeXBlID09PSAxLAoJCQkJaGlkZGVuID0gaXNFbGVtZW50ICYmIGpRdWVyeSh0aGlzKS5pcygiOmhpZGRlbiIpLAoJCQkJbmFtZSwgdmFsLCBwLAoJCQkJZGlzcGxheSwgZSwKCQkJCXBhcnRzLCBzdGFydCwgZW5kLCB1bml0OwoKCQkJLy8gd2lsbCBzdG9yZSBwZXIgcHJvcGVydHkgZWFzaW5nIGFuZCBiZSB1c2VkIHRvIGRldGVybWluZSB3aGVuIGFuIGFuaW1hdGlvbiBpcyBjb21wbGV0ZQoJCQlvcHQuYW5pbWF0ZWRQcm9wZXJ0aWVzID0ge307CgoJCQlmb3IgKCBwIGluIHByb3AgKSB7CgoJCQkJLy8gcHJvcGVydHkgbmFtZSBub3JtYWxpemF0aW9uCgkJCQluYW1lID0galF1ZXJ5LmNhbWVsQ2FzZSggcCApOwoJCQkJaWYgKCBwICE9PSBuYW1lICkgewoJCQkJCXByb3BbIG5hbWUgXSA9IHByb3BbIHAgXTsKCQkJCQlkZWxldGUgcHJvcFsgcCBdOwoJCQkJfQoKCQkJCXZhbCA9IHByb3BbIG5hbWUgXTsKCgkJCQkvLyBlYXNpbmcgcmVzb2x1dGlvbjogcGVyIHByb3BlcnR5ID4gb3B0LnNwZWNpYWxFYXNpbmcgPiBvcHQuZWFzaW5nID4gJ3N3aW5nJyAoZGVmYXVsdCkKCQkJCWlmICggalF1ZXJ5LmlzQXJyYXkoIHZhbCApICkgewoJCQkJCW9wdC5hbmltYXRlZFByb3BlcnRpZXNbIG5hbWUgXSA9IHZhbFsgMSBdOwoJCQkJCXZhbCA9IHByb3BbIG5hbWUgXSA9IHZhbFsgMCBdOwoJCQkJfSBlbHNlIHsKCQkJCQlvcHQuYW5pbWF0ZWRQcm9wZXJ0aWVzWyBuYW1lIF0gPSBvcHQuc3BlY2lhbEVhc2luZyAmJiBvcHQuc3BlY2lhbEVhc2luZ1sgbmFtZSBdIHx8IG9wdC5lYXNpbmcgfHwgJ3N3aW5nJzsKCQkJCX0KCgkJCQlpZiAoIHZhbCA9PT0gImhpZGUiICYmIGhpZGRlbiB8fCB2YWwgPT09ICJzaG93IiAmJiAhaGlkZGVuICkgewoJCQkJCXJldHVybiBvcHQuY29tcGxldGUuY2FsbCggdGhpcyApOwoJCQkJfQoKCQkJCWlmICggaXNFbGVtZW50ICYmICggbmFtZSA9PT0gImhlaWdodCIgfHwgbmFtZSA9PT0gIndpZHRoIiApICkgewoJCQkJCS8vIE1ha2Ugc3VyZSB0aGF0IG5vdGhpbmcgc25lYWtzIG91dAoJCQkJCS8vIFJlY29yZCBhbGwgMyBvdmVyZmxvdyBhdHRyaWJ1dGVzIGJlY2F1c2UgSUUgZG9lcyBub3QKCQkJCQkvLyBjaGFuZ2UgdGhlIG92ZXJmbG93IGF0dHJpYnV0ZSB3aGVuIG92ZXJmbG93WCBhbmQKCQkJCQkvLyBvdmVyZmxvd1kgYXJlIHNldCB0byB0aGUgc2FtZSB2YWx1ZQoJCQkJCW9wdC5vdmVyZmxvdyA9IFsgdGhpcy5zdHlsZS5vdmVyZmxvdywgdGhpcy5zdHlsZS5vdmVyZmxvd1gsIHRoaXMuc3R5bGUub3ZlcmZsb3dZIF07CgoJCQkJCS8vIFNldCBkaXNwbGF5IHByb3BlcnR5IHRvIGlubGluZS1ibG9jayBmb3IgaGVpZ2h0L3dpZHRoCgkJCQkJLy8gYW5pbWF0aW9ucyBvbiBpbmxpbmUgZWxlbWVudHMgdGhhdCBhcmUgaGF2aW5nIHdpZHRoL2hlaWdodAoJCQkJCS8vIGFuaW1hdGVkCgkJCQkJaWYgKCBqUXVlcnkuY3NzKCB0aGlzLCAiZGlzcGxheSIgKSA9PT0gImlubGluZSIgJiYKCQkJCQkJCWpRdWVyeS5jc3MoIHRoaXMsICJmbG9hdCIgKSA9PT0gIm5vbmUiICkgewoJCQkJCQlpZiAoICFqUXVlcnkuc3VwcG9ydC5pbmxpbmVCbG9ja05lZWRzTGF5b3V0ICkgewoJCQkJCQkJdGhpcy5zdHlsZS5kaXNwbGF5ID0gImlubGluZS1ibG9jayI7CgoJCQkJCQl9IGVsc2UgewoJCQkJCQkJZGlzcGxheSA9IGRlZmF1bHREaXNwbGF5KCB0aGlzLm5vZGVOYW1lICk7CgoJCQkJCQkJLy8gaW5saW5lLWxldmVsIGVsZW1lbnRzIGFjY2VwdCBpbmxpbmUtYmxvY2s7CgkJCQkJCQkvLyBibG9jay1sZXZlbCBlbGVtZW50cyBuZWVkIHRvIGJlIGlubGluZSB3aXRoIGxheW91dAoJCQkJCQkJaWYgKCBkaXNwbGF5ID09PSAiaW5saW5lIiApIHsKCQkJCQkJCQl0aGlzLnN0eWxlLmRpc3BsYXkgPSAiaW5saW5lLWJsb2NrIjsKCgkJCQkJCQl9IGVsc2UgewoJCQkJCQkJCXRoaXMuc3R5bGUuZGlzcGxheSA9ICJpbmxpbmUiOwoJCQkJCQkJCXRoaXMuc3R5bGUuem9vbSA9IDE7CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQl9CgkJCQl9CgkJCX0KCgkJCWlmICggb3B0Lm92ZXJmbG93ICE9IG51bGwgKSB7CgkJCQl0aGlzLnN0eWxlLm92ZXJmbG93ID0gImhpZGRlbiI7CgkJCX0KCgkJCWZvciAoIHAgaW4gcHJvcCApIHsKCQkJCWUgPSBuZXcgalF1ZXJ5LmZ4KCB0aGlzLCBvcHQsIHAgKTsKCQkJCXZhbCA9IHByb3BbIHAgXTsKCgkJCQlpZiAoIHJmeHR5cGVzLnRlc3QodmFsKSApIHsKCQkJCQllWyB2YWwgPT09ICJ0b2dnbGUiID8gaGlkZGVuID8gInNob3ciIDogImhpZGUiIDogdmFsIF0oKTsKCgkJCQl9IGVsc2UgewoJCQkJCXBhcnRzID0gcmZ4bnVtLmV4ZWMoIHZhbCApOwoJCQkJCXN0YXJ0ID0gZS5jdXIoKTsKCgkJCQkJaWYgKCBwYXJ0cyApIHsKCQkJCQkJZW5kID0gcGFyc2VGbG9hdCggcGFydHNbMl0gKTsKCQkJCQkJdW5pdCA9IHBhcnRzWzNdIHx8ICggalF1ZXJ5LmNzc051bWJlclsgcCBdID8gIiIgOiAicHgiICk7CgoJCQkJCQkvLyBXZSBuZWVkIHRvIGNvbXB1dGUgc3RhcnRpbmcgdmFsdWUKCQkJCQkJaWYgKCB1bml0ICE9PSAicHgiICkgewoJCQkJCQkJalF1ZXJ5LnN0eWxlKCB0aGlzLCBwLCAoZW5kIHx8IDEpICsgdW5pdCk7CgkJCQkJCQlzdGFydCA9ICgoZW5kIHx8IDEpIC8gZS5jdXIoKSkgKiBzdGFydDsKCQkJCQkJCWpRdWVyeS5zdHlsZSggdGhpcywgcCwgc3RhcnQgKyB1bml0KTsKCQkJCQkJfQoKCQkJCQkJLy8gSWYgYSArPS8tPSB0b2tlbiB3YXMgcHJvdmlkZWQsIHdlJ3JlIGRvaW5nIGEgcmVsYXRpdmUgYW5pbWF0aW9uCgkJCQkJCWlmICggcGFydHNbMV0gKSB7CgkJCQkJCQllbmQgPSAoIChwYXJ0c1sgMSBdID09PSAiLT0iID8gLTEgOiAxKSAqIGVuZCApICsgc3RhcnQ7CgkJCQkJCX0KCgkJCQkJCWUuY3VzdG9tKCBzdGFydCwgZW5kLCB1bml0ICk7CgoJCQkJCX0gZWxzZSB7CgkJCQkJCWUuY3VzdG9tKCBzdGFydCwgdmFsLCAiIiApOwoJCQkJCX0KCQkJCX0KCQkJfQoKCQkJLy8gRm9yIEpTIHN0cmljdCBjb21wbGlhbmNlCgkJCXJldHVybiB0cnVlOwoJCX0pOwoJfSwKCglzdG9wOiBmdW5jdGlvbiggY2xlYXJRdWV1ZSwgZ290b0VuZCApIHsKCQlpZiAoIGNsZWFyUXVldWUgKSB7CgkJCXRoaXMucXVldWUoW10pOwoJCX0KCgkJdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewoJCQl2YXIgdGltZXJzID0galF1ZXJ5LnRpbWVycywKCQkJCWkgPSB0aW1lcnMubGVuZ3RoOwoJCQkvLyBjbGVhciBtYXJrZXIgY291bnRlcnMgaWYgd2Uga25vdyB0aGV5IHdvbid0IGJlCgkJCWlmICggIWdvdG9FbmQgKSB7CgkJCQlqUXVlcnkuX3VubWFyayggdHJ1ZSwgdGhpcyApOwoJCQl9CgkJCXdoaWxlICggaS0tICkgewoJCQkJaWYgKCB0aW1lcnNbaV0uZWxlbSA9PT0gdGhpcyApIHsKCQkJCQlpZiAoZ290b0VuZCkgewoJCQkJCQkvLyBmb3JjZSB0aGUgbmV4dCBzdGVwIHRvIGJlIHRoZSBsYXN0CgkJCQkJCXRpbWVyc1tpXSh0cnVlKTsKCQkJCQl9CgoJCQkJCXRpbWVycy5zcGxpY2UoaSwgMSk7CgkJCQl9CgkJCX0KCQl9KTsKCgkJLy8gc3RhcnQgdGhlIG5leHQgaW4gdGhlIHF1ZXVlIGlmIHRoZSBsYXN0IHN0ZXAgd2Fzbid0IGZvcmNlZAoJCWlmICggIWdvdG9FbmQgKSB7CgkJCXRoaXMuZGVxdWV1ZSgpOwoJCX0KCgkJcmV0dXJuIHRoaXM7Cgl9Cgp9KTsKCi8vIEFuaW1hdGlvbnMgY3JlYXRlZCBzeW5jaHJvbm91c2x5IHdpbGwgcnVuIHN5bmNocm9ub3VzbHkKZnVuY3Rpb24gY3JlYXRlRnhOb3coKSB7CglzZXRUaW1lb3V0KCBjbGVhckZ4Tm93LCAwICk7CglyZXR1cm4gKCBmeE5vdyA9IGpRdWVyeS5ub3coKSApOwp9CgpmdW5jdGlvbiBjbGVhckZ4Tm93KCkgewoJZnhOb3cgPSB1bmRlZmluZWQ7Cn0KCi8vIEdlbmVyYXRlIHBhcmFtZXRlcnMgdG8gY3JlYXRlIGEgc3RhbmRhcmQgYW5pbWF0aW9uCmZ1bmN0aW9uIGdlbkZ4KCB0eXBlLCBudW0gKSB7Cgl2YXIgb2JqID0ge307CgoJalF1ZXJ5LmVhY2goIGZ4QXR0cnMuY29uY2F0LmFwcGx5KFtdLCBmeEF0dHJzLnNsaWNlKDAsbnVtKSksIGZ1bmN0aW9uKCkgewoJCW9ialsgdGhpcyBdID0gdHlwZTsKCX0pOwoKCXJldHVybiBvYmo7Cn0KCi8vIEdlbmVyYXRlIHNob3J0Y3V0cyBmb3IgY3VzdG9tIGFuaW1hdGlvbnMKalF1ZXJ5LmVhY2goewoJc2xpZGVEb3duOiBnZW5GeCgic2hvdyIsIDEpLAoJc2xpZGVVcDogZ2VuRngoImhpZGUiLCAxKSwKCXNsaWRlVG9nZ2xlOiBnZW5GeCgidG9nZ2xlIiwgMSksCglmYWRlSW46IHsgb3BhY2l0eTogInNob3ciIH0sCglmYWRlT3V0OiB7IG9wYWNpdHk6ICJoaWRlIiB9LAoJZmFkZVRvZ2dsZTogeyBvcGFjaXR5OiAidG9nZ2xlIiB9Cn0sIGZ1bmN0aW9uKCBuYW1lLCBwcm9wcyApIHsKCWpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICkgewoJCXJldHVybiB0aGlzLmFuaW1hdGUoIHByb3BzLCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApOwoJfTsKfSk7CgpqUXVlcnkuZXh0ZW5kKHsKCXNwZWVkOiBmdW5jdGlvbiggc3BlZWQsIGVhc2luZywgZm4gKSB7CgkJdmFyIG9wdCA9IHNwZWVkICYmIHR5cGVvZiBzcGVlZCA9PT0gIm9iamVjdCIgPyBqUXVlcnkuZXh0ZW5kKHt9LCBzcGVlZCkgOiB7CgkJCWNvbXBsZXRlOiBmbiB8fCAhZm4gJiYgZWFzaW5nIHx8CgkJCQlqUXVlcnkuaXNGdW5jdGlvbiggc3BlZWQgKSAmJiBzcGVlZCwKCQkJZHVyYXRpb246IHNwZWVkLAoJCQllYXNpbmc6IGZuICYmIGVhc2luZyB8fCBlYXNpbmcgJiYgIWpRdWVyeS5pc0Z1bmN0aW9uKGVhc2luZykgJiYgZWFzaW5nCgkJfTsKCgkJb3B0LmR1cmF0aW9uID0galF1ZXJ5LmZ4Lm9mZiA/IDAgOiB0eXBlb2Ygb3B0LmR1cmF0aW9uID09PSAibnVtYmVyIiA/IG9wdC5kdXJhdGlvbiA6CgkJCW9wdC5kdXJhdGlvbiBpbiBqUXVlcnkuZnguc3BlZWRzID8galF1ZXJ5LmZ4LnNwZWVkc1tvcHQuZHVyYXRpb25dIDogalF1ZXJ5LmZ4LnNwZWVkcy5fZGVmYXVsdDsKCgkJLy8gUXVldWVpbmcKCQlvcHQub2xkID0gb3B0LmNvbXBsZXRlOwoJCW9wdC5jb21wbGV0ZSA9IGZ1bmN0aW9uKCBub1VubWFyayApIHsKCQkJaWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggb3B0Lm9sZCApICkgewoJCQkJb3B0Lm9sZC5jYWxsKCB0aGlzICk7CgkJCX0KCgkJCWlmICggb3B0LnF1ZXVlICE9PSBmYWxzZSApIHsKCQkJCWpRdWVyeS5kZXF1ZXVlKCB0aGlzICk7CgkJCX0gZWxzZSBpZiAoIG5vVW5tYXJrICE9PSBmYWxzZSApIHsKCQkJCWpRdWVyeS5fdW5tYXJrKCB0aGlzICk7CgkJCX0KCQl9OwoKCQlyZXR1cm4gb3B0OwoJfSwKCgllYXNpbmc6IHsKCQlsaW5lYXI6IGZ1bmN0aW9uKCBwLCBuLCBmaXJzdE51bSwgZGlmZiApIHsKCQkJcmV0dXJuIGZpcnN0TnVtICsgZGlmZiAqIHA7CgkJfSwKCQlzd2luZzogZnVuY3Rpb24oIHAsIG4sIGZpcnN0TnVtLCBkaWZmICkgewoJCQlyZXR1cm4gKCgtTWF0aC5jb3MocCpNYXRoLlBJKS8yKSArIDAuNSkgKiBkaWZmICsgZmlyc3ROdW07CgkJfQoJfSwKCgl0aW1lcnM6IFtdLAoKCWZ4OiBmdW5jdGlvbiggZWxlbSwgb3B0aW9ucywgcHJvcCApIHsKCQl0aGlzLm9wdGlvbnMgPSBvcHRpb25zOwoJCXRoaXMuZWxlbSA9IGVsZW07CgkJdGhpcy5wcm9wID0gcHJvcDsKCgkJb3B0aW9ucy5vcmlnID0gb3B0aW9ucy5vcmlnIHx8IHt9OwoJfQoKfSk7CgpqUXVlcnkuZngucHJvdG90eXBlID0gewoJLy8gU2ltcGxlIGZ1bmN0aW9uIGZvciBzZXR0aW5nIGEgc3R5bGUgdmFsdWUKCXVwZGF0ZTogZnVuY3Rpb24oKSB7CgkJaWYgKCB0aGlzLm9wdGlvbnMuc3RlcCApIHsKCQkJdGhpcy5vcHRpb25zLnN0ZXAuY2FsbCggdGhpcy5lbGVtLCB0aGlzLm5vdywgdGhpcyApOwoJCX0KCgkJKGpRdWVyeS5meC5zdGVwW3RoaXMucHJvcF0gfHwgalF1ZXJ5LmZ4LnN0ZXAuX2RlZmF1bHQpKCB0aGlzICk7Cgl9LAoKCS8vIEdldCB0aGUgY3VycmVudCBzaXplCgljdXI6IGZ1bmN0aW9uKCkgewoJCWlmICggdGhpcy5lbGVtW3RoaXMucHJvcF0gIT0gbnVsbCAmJiAoIXRoaXMuZWxlbS5zdHlsZSB8fCB0aGlzLmVsZW0uc3R5bGVbdGhpcy5wcm9wXSA9PSBudWxsKSApIHsKCQkJcmV0dXJuIHRoaXMuZWxlbVsgdGhpcy5wcm9wIF07CgkJfQoKCQl2YXIgcGFyc2VkLAoJCQlyID0galF1ZXJ5LmNzcyggdGhpcy5lbGVtLCB0aGlzLnByb3AgKTsKCQkvLyBFbXB0eSBzdHJpbmdzLCBudWxsLCB1bmRlZmluZWQgYW5kICJhdXRvIiBhcmUgY29udmVydGVkIHRvIDAsCgkJLy8gY29tcGxleCB2YWx1ZXMgc3VjaCBhcyAicm90YXRlKDFyYWQpIiBhcmUgcmV0dXJuZWQgYXMgaXMsCgkJLy8gc2ltcGxlIHZhbHVlcyBzdWNoIGFzICIxMHB4IiBhcmUgcGFyc2VkIHRvIEZsb2F0LgoJCXJldHVybiBpc05hTiggcGFyc2VkID0gcGFyc2VGbG9hdCggciApICkgPyAhciB8fCByID09PSAiYXV0byIgPyAwIDogciA6IHBhcnNlZDsKCX0sCgoJLy8gU3RhcnQgYW4gYW5pbWF0aW9uIGZyb20gb25lIG51bWJlciB0byBhbm90aGVyCgljdXN0b206IGZ1bmN0aW9uKCBmcm9tLCB0bywgdW5pdCApIHsKCQl2YXIgc2VsZiA9IHRoaXMsCgkJCWZ4ID0galF1ZXJ5LmZ4OwoKCQl0aGlzLnN0YXJ0VGltZSA9IGZ4Tm93IHx8IGNyZWF0ZUZ4Tm93KCk7CgkJdGhpcy5zdGFydCA9IGZyb207CgkJdGhpcy5lbmQgPSB0bzsKCQl0aGlzLnVuaXQgPSB1bml0IHx8IHRoaXMudW5pdCB8fCAoIGpRdWVyeS5jc3NOdW1iZXJbIHRoaXMucHJvcCBdID8gIiIgOiAicHgiICk7CgkJdGhpcy5ub3cgPSB0aGlzLnN0YXJ0OwoJCXRoaXMucG9zID0gdGhpcy5zdGF0ZSA9IDA7CgoJCWZ1bmN0aW9uIHQoIGdvdG9FbmQgKSB7CgkJCXJldHVybiBzZWxmLnN0ZXAoZ290b0VuZCk7CgkJfQoKCQl0LmVsZW0gPSB0aGlzLmVsZW07CgoJCWlmICggdCgpICYmIGpRdWVyeS50aW1lcnMucHVzaCh0KSAmJiAhdGltZXJJZCApIHsKCQkJdGltZXJJZCA9IHNldEludGVydmFsKCBmeC50aWNrLCBmeC5pbnRlcnZhbCApOwoJCX0KCX0sCgoJLy8gU2ltcGxlICdzaG93JyBmdW5jdGlvbgoJc2hvdzogZnVuY3Rpb24oKSB7CgkJLy8gUmVtZW1iZXIgd2hlcmUgd2Ugc3RhcnRlZCwgc28gdGhhdCB3ZSBjYW4gZ28gYmFjayB0byBpdCBsYXRlcgoJCXRoaXMub3B0aW9ucy5vcmlnW3RoaXMucHJvcF0gPSBqUXVlcnkuc3R5bGUoIHRoaXMuZWxlbSwgdGhpcy5wcm9wICk7CgkJdGhpcy5vcHRpb25zLnNob3cgPSB0cnVlOwoKCQkvLyBCZWdpbiB0aGUgYW5pbWF0aW9uCgkJLy8gTWFrZSBzdXJlIHRoYXQgd2Ugc3RhcnQgYXQgYSBzbWFsbCB3aWR0aC9oZWlnaHQgdG8gYXZvaWQgYW55CgkJLy8gZmxhc2ggb2YgY29udGVudAoJCXRoaXMuY3VzdG9tKHRoaXMucHJvcCA9PT0gIndpZHRoIiB8fCB0aGlzLnByb3AgPT09ICJoZWlnaHQiID8gMSA6IDAsIHRoaXMuY3VyKCkpOwoKCQkvLyBTdGFydCBieSBzaG93aW5nIHRoZSBlbGVtZW50CgkJalF1ZXJ5KCB0aGlzLmVsZW0gKS5zaG93KCk7Cgl9LAoKCS8vIFNpbXBsZSAnaGlkZScgZnVuY3Rpb24KCWhpZGU6IGZ1bmN0aW9uKCkgewoJCS8vIFJlbWVtYmVyIHdoZXJlIHdlIHN0YXJ0ZWQsIHNvIHRoYXQgd2UgY2FuIGdvIGJhY2sgdG8gaXQgbGF0ZXIKCQl0aGlzLm9wdGlvbnMub3JpZ1t0aGlzLnByb3BdID0galF1ZXJ5LnN0eWxlKCB0aGlzLmVsZW0sIHRoaXMucHJvcCApOwoJCXRoaXMub3B0aW9ucy5oaWRlID0gdHJ1ZTsKCgkJLy8gQmVnaW4gdGhlIGFuaW1hdGlvbgoJCXRoaXMuY3VzdG9tKHRoaXMuY3VyKCksIDApOwoJfSwKCgkvLyBFYWNoIHN0ZXAgb2YgYW4gYW5pbWF0aW9uCglzdGVwOiBmdW5jdGlvbiggZ290b0VuZCApIHsKCQl2YXIgdCA9IGZ4Tm93IHx8IGNyZWF0ZUZ4Tm93KCksCgkJCWRvbmUgPSB0cnVlLAoJCQllbGVtID0gdGhpcy5lbGVtLAoJCQlvcHRpb25zID0gdGhpcy5vcHRpb25zLAoJCQlpLCBuOwoKCQlpZiAoIGdvdG9FbmQgfHwgdCA+PSBvcHRpb25zLmR1cmF0aW9uICsgdGhpcy5zdGFydFRpbWUgKSB7CgkJCXRoaXMubm93ID0gdGhpcy5lbmQ7CgkJCXRoaXMucG9zID0gdGhpcy5zdGF0ZSA9IDE7CgkJCXRoaXMudXBkYXRlKCk7CgoJCQlvcHRpb25zLmFuaW1hdGVkUHJvcGVydGllc1sgdGhpcy5wcm9wIF0gPSB0cnVlOwoKCQkJZm9yICggaSBpbiBvcHRpb25zLmFuaW1hdGVkUHJvcGVydGllcyApIHsKCQkJCWlmICggb3B0aW9ucy5hbmltYXRlZFByb3BlcnRpZXNbaV0gIT09IHRydWUgKSB7CgkJCQkJZG9uZSA9IGZhbHNlOwoJCQkJfQoJCQl9CgoJCQlpZiAoIGRvbmUgKSB7CgkJCQkvLyBSZXNldCB0aGUgb3ZlcmZsb3cKCQkJCWlmICggb3B0aW9ucy5vdmVyZmxvdyAhPSBudWxsICYmICFqUXVlcnkuc3VwcG9ydC5zaHJpbmtXcmFwQmxvY2tzICkgewoKCQkJCQlqUXVlcnkuZWFjaCggWyAiIiwgIlgiLCAiWSIgXSwgZnVuY3Rpb24gKGluZGV4LCB2YWx1ZSkgewoJCQkJCQllbGVtLnN0eWxlWyAib3ZlcmZsb3ciICsgdmFsdWUgXSA9IG9wdGlvbnMub3ZlcmZsb3dbaW5kZXhdOwoJCQkJCX0pOwoJCQkJfQoKCQkJCS8vIEhpZGUgdGhlIGVsZW1lbnQgaWYgdGhlICJoaWRlIiBvcGVyYXRpb24gd2FzIGRvbmUKCQkJCWlmICggb3B0aW9ucy5oaWRlICkgewoJCQkJCWpRdWVyeShlbGVtKS5oaWRlKCk7CgkJCQl9CgoJCQkJLy8gUmVzZXQgdGhlIHByb3BlcnRpZXMsIGlmIHRoZSBpdGVtIGhhcyBiZWVuIGhpZGRlbiBvciBzaG93bgoJCQkJaWYgKCBvcHRpb25zLmhpZGUgfHwgb3B0aW9ucy5zaG93ICkgewoJCQkJCWZvciAoIHZhciBwIGluIG9wdGlvbnMuYW5pbWF0ZWRQcm9wZXJ0aWVzICkgewoJCQkJCQlqUXVlcnkuc3R5bGUoIGVsZW0sIHAsIG9wdGlvbnMub3JpZ1twXSApOwoJCQkJCX0KCQkJCX0KCgkJCQkvLyBFeGVjdXRlIHRoZSBjb21wbGV0ZSBmdW5jdGlvbgoJCQkJb3B0aW9ucy5jb21wbGV0ZS5jYWxsKCBlbGVtICk7CgkJCX0KCgkJCXJldHVybiBmYWxzZTsKCgkJfSBlbHNlIHsKCQkJLy8gY2xhc3NpY2FsIGVhc2luZyBjYW5ub3QgYmUgdXNlZCB3aXRoIGFuIEluZmluaXR5IGR1cmF0aW9uCgkJCWlmICggb3B0aW9ucy5kdXJhdGlvbiA9PSBJbmZpbml0eSApIHsKCQkJCXRoaXMubm93ID0gdDsKCQkJfSBlbHNlIHsKCQkJCW4gPSB0IC0gdGhpcy5zdGFydFRpbWU7CgkJCQl0aGlzLnN0YXRlID0gbiAvIG9wdGlvbnMuZHVyYXRpb247CgoJCQkJLy8gUGVyZm9ybSB0aGUgZWFzaW5nIGZ1bmN0aW9uLCBkZWZhdWx0cyB0byBzd2luZwoJCQkJdGhpcy5wb3MgPSBqUXVlcnkuZWFzaW5nWyBvcHRpb25zLmFuaW1hdGVkUHJvcGVydGllc1sgdGhpcy5wcm9wIF0gXSggdGhpcy5zdGF0ZSwgbiwgMCwgMSwgb3B0aW9ucy5kdXJhdGlvbiApOwoJCQkJdGhpcy5ub3cgPSB0aGlzLnN0YXJ0ICsgKCh0aGlzLmVuZCAtIHRoaXMuc3RhcnQpICogdGhpcy5wb3MpOwoJCQl9CgkJCS8vIFBlcmZvcm0gdGhlIG5leHQgc3RlcCBvZiB0aGUgYW5pbWF0aW9uCgkJCXRoaXMudXBkYXRlKCk7CgkJfQoKCQlyZXR1cm4gdHJ1ZTsKCX0KfTsKCmpRdWVyeS5leHRlbmQoIGpRdWVyeS5meCwgewoJdGljazogZnVuY3Rpb24oKSB7CgkJZm9yICggdmFyIHRpbWVycyA9IGpRdWVyeS50aW1lcnMsIGkgPSAwIDsgaSA8IHRpbWVycy5sZW5ndGggOyArK2kgKSB7CgkJCWlmICggIXRpbWVyc1tpXSgpICkgewoJCQkJdGltZXJzLnNwbGljZShpLS0sIDEpOwoJCQl9CgkJfQoKCQlpZiAoICF0aW1lcnMubGVuZ3RoICkgewoJCQlqUXVlcnkuZnguc3RvcCgpOwoJCX0KCX0sCgoJaW50ZXJ2YWw6IDEzLAoKCXN0b3A6IGZ1bmN0aW9uKCkgewoJCWNsZWFySW50ZXJ2YWwoIHRpbWVySWQgKTsKCQl0aW1lcklkID0gbnVsbDsKCX0sCgoJc3BlZWRzOiB7CgkJc2xvdzogNjAwLAoJCWZhc3Q6IDIwMCwKCQkvLyBEZWZhdWx0IHNwZWVkCgkJX2RlZmF1bHQ6IDQwMAoJfSwKCglzdGVwOiB7CgkJb3BhY2l0eTogZnVuY3Rpb24oIGZ4ICkgewoJCQlqUXVlcnkuc3R5bGUoIGZ4LmVsZW0sICJvcGFjaXR5IiwgZngubm93ICk7CgkJfSwKCgkJX2RlZmF1bHQ6IGZ1bmN0aW9uKCBmeCApIHsKCQkJaWYgKCBmeC5lbGVtLnN0eWxlICYmIGZ4LmVsZW0uc3R5bGVbIGZ4LnByb3AgXSAhPSBudWxsICkgewoJCQkJZnguZWxlbS5zdHlsZVsgZngucHJvcCBdID0gKGZ4LnByb3AgPT09ICJ3aWR0aCIgfHwgZngucHJvcCA9PT0gImhlaWdodCIgPyBNYXRoLm1heCgwLCBmeC5ub3cpIDogZngubm93KSArIGZ4LnVuaXQ7CgkJCX0gZWxzZSB7CgkJCQlmeC5lbGVtWyBmeC5wcm9wIF0gPSBmeC5ub3c7CgkJCX0KCQl9Cgl9Cn0pOwoKaWYgKCBqUXVlcnkuZXhwciAmJiBqUXVlcnkuZXhwci5maWx0ZXJzICkgewoJalF1ZXJ5LmV4cHIuZmlsdGVycy5hbmltYXRlZCA9IGZ1bmN0aW9uKCBlbGVtICkgewoJCXJldHVybiBqUXVlcnkuZ3JlcChqUXVlcnkudGltZXJzLCBmdW5jdGlvbiggZm4gKSB7CgkJCXJldHVybiBlbGVtID09PSBmbi5lbGVtOwoJCX0pLmxlbmd0aDsKCX07Cn0KCi8vIFRyeSB0byByZXN0b3JlIHRoZSBkZWZhdWx0IGRpc3BsYXkgdmFsdWUgb2YgYW4gZWxlbWVudApmdW5jdGlvbiBkZWZhdWx0RGlzcGxheSggbm9kZU5hbWUgKSB7CgoJaWYgKCAhZWxlbWRpc3BsYXlbIG5vZGVOYW1lIF0gKSB7CgoJCXZhciBib2R5ID0gZG9jdW1lbnQuYm9keSwKCQkJZWxlbSA9IGpRdWVyeSggIjwiICsgbm9kZU5hbWUgKyAiPiIgKS5hcHBlbmRUbyggYm9keSApLAoJCQlkaXNwbGF5ID0gZWxlbS5jc3MoICJkaXNwbGF5IiApOwoKCQllbGVtLnJlbW92ZSgpOwoKCQkvLyBJZiB0aGUgc2ltcGxlIHdheSBmYWlscywKCQkvLyBnZXQgZWxlbWVudCdzIHJlYWwgZGVmYXVsdCBkaXNwbGF5IGJ5IGF0dGFjaGluZyBpdCB0byBhIHRlbXAgaWZyYW1lCgkJaWYgKCBkaXNwbGF5ID09PSAibm9uZSIgfHwgZGlzcGxheSA9PT0gIiIgKSB7CgkJCS8vIE5vIGlmcmFtZSB0byB1c2UgeWV0LCBzbyBjcmVhdGUgaXQKCQkJaWYgKCAhaWZyYW1lICkgewoJCQkJaWZyYW1lID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggImlmcmFtZSIgKTsKCQkJCWlmcmFtZS5mcmFtZUJvcmRlciA9IGlmcmFtZS53aWR0aCA9IGlmcmFtZS5oZWlnaHQgPSAwOwoJCQl9CgoJCQlib2R5LmFwcGVuZENoaWxkKCBpZnJhbWUgKTsKCgkJCS8vIENyZWF0ZSBhIGNhY2hlYWJsZSBjb3B5IG9mIHRoZSBpZnJhbWUgZG9jdW1lbnQgb24gZmlyc3QgY2FsbC4KCQkJLy8gSUUgYW5kIE9wZXJhIHdpbGwgYWxsb3cgdXMgdG8gcmV1c2UgdGhlIGlmcmFtZURvYyB3aXRob3V0IHJlLXdyaXRpbmcgdGhlIGZha2UgSFRNTAoJCQkvLyBkb2N1bWVudCB0byBpdDsgV2ViS2l0ICYgRmlyZWZveCB3b24ndCBhbGxvdyByZXVzaW5nIHRoZSBpZnJhbWUgZG9jdW1lbnQuCgkJCWlmICggIWlmcmFtZURvYyB8fCAhaWZyYW1lLmNyZWF0ZUVsZW1lbnQgKSB7CgkJCQlpZnJhbWVEb2MgPSAoIGlmcmFtZS5jb250ZW50V2luZG93IHx8IGlmcmFtZS5jb250ZW50RG9jdW1lbnQgKS5kb2N1bWVudDsKCQkJCWlmcmFtZURvYy53cml0ZSggKCBkb2N1bWVudC5jb21wYXRNb2RlID09PSAiQ1NTMUNvbXBhdCIgPyAiPCFkb2N0eXBlIGh0bWw+IiA6ICIiICkgKyAiPGh0bWw+PGJvZHk+IiApOwoJCQkJaWZyYW1lRG9jLmNsb3NlKCk7CgkJCX0KCgkJCWVsZW0gPSBpZnJhbWVEb2MuY3JlYXRlRWxlbWVudCggbm9kZU5hbWUgKTsKCgkJCWlmcmFtZURvYy5ib2R5LmFwcGVuZENoaWxkKCBlbGVtICk7CgoJCQlkaXNwbGF5ID0galF1ZXJ5LmNzcyggZWxlbSwgImRpc3BsYXkiICk7CgoJCQlib2R5LnJlbW92ZUNoaWxkKCBpZnJhbWUgKTsKCQl9CgoJCS8vIFN0b3JlIHRoZSBjb3JyZWN0IGRlZmF1bHQgZGlzcGxheQoJCWVsZW1kaXNwbGF5WyBub2RlTmFtZSBdID0gZGlzcGxheTsKCX0KCglyZXR1cm4gZWxlbWRpc3BsYXlbIG5vZGVOYW1lIF07Cn0KCgoKCnZhciBydGFibGUgPSAvXnQoPzphYmxlfGR8aCkkL2ksCglycm9vdCA9IC9eKD86Ym9keXxodG1sKSQvaTsKCmlmICggImdldEJvdW5kaW5nQ2xpZW50UmVjdCIgaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50ICkgewoJalF1ZXJ5LmZuLm9mZnNldCA9IGZ1bmN0aW9uKCBvcHRpb25zICkgewoJCXZhciBlbGVtID0gdGhpc1swXSwgYm94OwoKCQlpZiAoIG9wdGlvbnMgKSB7CgkJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oIGkgKSB7CgkJCQlqUXVlcnkub2Zmc2V0LnNldE9mZnNldCggdGhpcywgb3B0aW9ucywgaSApOwoJCQl9KTsKCQl9CgoJCWlmICggIWVsZW0gfHwgIWVsZW0ub3duZXJEb2N1bWVudCApIHsKCQkJcmV0dXJuIG51bGw7CgkJfQoKCQlpZiAoIGVsZW0gPT09IGVsZW0ub3duZXJEb2N1bWVudC5ib2R5ICkgewoJCQlyZXR1cm4galF1ZXJ5Lm9mZnNldC5ib2R5T2Zmc2V0KCBlbGVtICk7CgkJfQoKCQl0cnkgewoJCQlib3ggPSBlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwoJCX0gY2F0Y2goZSkge30KCgkJdmFyIGRvYyA9IGVsZW0ub3duZXJEb2N1bWVudCwKCQkJZG9jRWxlbSA9IGRvYy5kb2N1bWVudEVsZW1lbnQ7CgoJCS8vIE1ha2Ugc3VyZSB3ZSdyZSBub3QgZGVhbGluZyB3aXRoIGEgZGlzY29ubmVjdGVkIERPTSBub2RlCgkJaWYgKCAhYm94IHx8ICFqUXVlcnkuY29udGFpbnMoIGRvY0VsZW0sIGVsZW0gKSApIHsKCQkJcmV0dXJuIGJveCA/IHsgdG9wOiBib3gudG9wLCBsZWZ0OiBib3gubGVmdCB9IDogeyB0b3A6IDAsIGxlZnQ6IDAgfTsKCQl9CgoJCXZhciBib2R5ID0gZG9jLmJvZHksCgkJCXdpbiA9IGdldFdpbmRvdyhkb2MpLAoJCQljbGllbnRUb3AgID0gZG9jRWxlbS5jbGllbnRUb3AgIHx8IGJvZHkuY2xpZW50VG9wICB8fCAwLAoJCQljbGllbnRMZWZ0ID0gZG9jRWxlbS5jbGllbnRMZWZ0IHx8IGJvZHkuY2xpZW50TGVmdCB8fCAwLAoJCQlzY3JvbGxUb3AgID0gd2luLnBhZ2VZT2Zmc2V0IHx8IGpRdWVyeS5zdXBwb3J0LmJveE1vZGVsICYmIGRvY0VsZW0uc2Nyb2xsVG9wICB8fCBib2R5LnNjcm9sbFRvcCwKCQkJc2Nyb2xsTGVmdCA9IHdpbi5wYWdlWE9mZnNldCB8fCBqUXVlcnkuc3VwcG9ydC5ib3hNb2RlbCAmJiBkb2NFbGVtLnNjcm9sbExlZnQgfHwgYm9keS5zY3JvbGxMZWZ0LAoJCQl0b3AgID0gYm94LnRvcCAgKyBzY3JvbGxUb3AgIC0gY2xpZW50VG9wLAoJCQlsZWZ0ID0gYm94LmxlZnQgKyBzY3JvbGxMZWZ0IC0gY2xpZW50TGVmdDsKCgkJcmV0dXJuIHsgdG9wOiB0b3AsIGxlZnQ6IGxlZnQgfTsKCX07Cgp9IGVsc2UgewoJalF1ZXJ5LmZuLm9mZnNldCA9IGZ1bmN0aW9uKCBvcHRpb25zICkgewoJCXZhciBlbGVtID0gdGhpc1swXTsKCgkJaWYgKCBvcHRpb25zICkgewoJCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCBpICkgewoJCQkJalF1ZXJ5Lm9mZnNldC5zZXRPZmZzZXQoIHRoaXMsIG9wdGlvbnMsIGkgKTsKCQkJfSk7CgkJfQoKCQlpZiAoICFlbGVtIHx8ICFlbGVtLm93bmVyRG9jdW1lbnQgKSB7CgkJCXJldHVybiBudWxsOwoJCX0KCgkJaWYgKCBlbGVtID09PSBlbGVtLm93bmVyRG9jdW1lbnQuYm9keSApIHsKCQkJcmV0dXJuIGpRdWVyeS5vZmZzZXQuYm9keU9mZnNldCggZWxlbSApOwoJCX0KCgkJalF1ZXJ5Lm9mZnNldC5pbml0aWFsaXplKCk7CgoJCXZhciBjb21wdXRlZFN0eWxlLAoJCQlvZmZzZXRQYXJlbnQgPSBlbGVtLm9mZnNldFBhcmVudCwKCQkJcHJldk9mZnNldFBhcmVudCA9IGVsZW0sCgkJCWRvYyA9IGVsZW0ub3duZXJEb2N1bWVudCwKCQkJZG9jRWxlbSA9IGRvYy5kb2N1bWVudEVsZW1lbnQsCgkJCWJvZHkgPSBkb2MuYm9keSwKCQkJZGVmYXVsdFZpZXcgPSBkb2MuZGVmYXVsdFZpZXcsCgkJCXByZXZDb21wdXRlZFN0eWxlID0gZGVmYXVsdFZpZXcgPyBkZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKCBlbGVtLCBudWxsICkgOiBlbGVtLmN1cnJlbnRTdHlsZSwKCQkJdG9wID0gZWxlbS5vZmZzZXRUb3AsCgkJCWxlZnQgPSBlbGVtLm9mZnNldExlZnQ7CgoJCXdoaWxlICggKGVsZW0gPSBlbGVtLnBhcmVudE5vZGUpICYmIGVsZW0gIT09IGJvZHkgJiYgZWxlbSAhPT0gZG9jRWxlbSApIHsKCQkJaWYgKCBqUXVlcnkub2Zmc2V0LnN1cHBvcnRzRml4ZWRQb3NpdGlvbiAmJiBwcmV2Q29tcHV0ZWRTdHlsZS5wb3NpdGlvbiA9PT0gImZpeGVkIiApIHsKCQkJCWJyZWFrOwoJCQl9CgoJCQljb21wdXRlZFN0eWxlID0gZGVmYXVsdFZpZXcgPyBkZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKGVsZW0sIG51bGwpIDogZWxlbS5jdXJyZW50U3R5bGU7CgkJCXRvcCAgLT0gZWxlbS5zY3JvbGxUb3A7CgkJCWxlZnQgLT0gZWxlbS5zY3JvbGxMZWZ0OwoKCQkJaWYgKCBlbGVtID09PSBvZmZzZXRQYXJlbnQgKSB7CgkJCQl0b3AgICs9IGVsZW0ub2Zmc2V0VG9wOwoJCQkJbGVmdCArPSBlbGVtLm9mZnNldExlZnQ7CgoJCQkJaWYgKCBqUXVlcnkub2Zmc2V0LmRvZXNOb3RBZGRCb3JkZXIgJiYgIShqUXVlcnkub2Zmc2V0LmRvZXNBZGRCb3JkZXJGb3JUYWJsZUFuZENlbGxzICYmIHJ0YWJsZS50ZXN0KGVsZW0ubm9kZU5hbWUpKSApIHsKCQkJCQl0b3AgICs9IHBhcnNlRmxvYXQoIGNvbXB1dGVkU3R5bGUuYm9yZGVyVG9wV2lkdGggICkgfHwgMDsKCQkJCQlsZWZ0ICs9IHBhcnNlRmxvYXQoIGNvbXB1dGVkU3R5bGUuYm9yZGVyTGVmdFdpZHRoICkgfHwgMDsKCQkJCX0KCgkJCQlwcmV2T2Zmc2V0UGFyZW50ID0gb2Zmc2V0UGFyZW50OwoJCQkJb2Zmc2V0UGFyZW50ID0gZWxlbS5vZmZzZXRQYXJlbnQ7CgkJCX0KCgkJCWlmICggalF1ZXJ5Lm9mZnNldC5zdWJ0cmFjdHNCb3JkZXJGb3JPdmVyZmxvd05vdFZpc2libGUgJiYgY29tcHV0ZWRTdHlsZS5vdmVyZmxvdyAhPT0gInZpc2libGUiICkgewoJCQkJdG9wICArPSBwYXJzZUZsb2F0KCBjb21wdXRlZFN0eWxlLmJvcmRlclRvcFdpZHRoICApIHx8IDA7CgkJCQlsZWZ0ICs9IHBhcnNlRmxvYXQoIGNvbXB1dGVkU3R5bGUuYm9yZGVyTGVmdFdpZHRoICkgfHwgMDsKCQkJfQoKCQkJcHJldkNvbXB1dGVkU3R5bGUgPSBjb21wdXRlZFN0eWxlOwoJCX0KCgkJaWYgKCBwcmV2Q29tcHV0ZWRTdHlsZS5wb3NpdGlvbiA9PT0gInJlbGF0aXZlIiB8fCBwcmV2Q29tcHV0ZWRTdHlsZS5wb3NpdGlvbiA9PT0gInN0YXRpYyIgKSB7CgkJCXRvcCAgKz0gYm9keS5vZmZzZXRUb3A7CgkJCWxlZnQgKz0gYm9keS5vZmZzZXRMZWZ0OwoJCX0KCgkJaWYgKCBqUXVlcnkub2Zmc2V0LnN1cHBvcnRzRml4ZWRQb3NpdGlvbiAmJiBwcmV2Q29tcHV0ZWRTdHlsZS5wb3NpdGlvbiA9PT0gImZpeGVkIiApIHsKCQkJdG9wICArPSBNYXRoLm1heCggZG9jRWxlbS5zY3JvbGxUb3AsIGJvZHkuc2Nyb2xsVG9wICk7CgkJCWxlZnQgKz0gTWF0aC5tYXgoIGRvY0VsZW0uc2Nyb2xsTGVmdCwgYm9keS5zY3JvbGxMZWZ0ICk7CgkJfQoKCQlyZXR1cm4geyB0b3A6IHRvcCwgbGVmdDogbGVmdCB9OwoJfTsKfQoKalF1ZXJ5Lm9mZnNldCA9IHsKCWluaXRpYWxpemU6IGZ1bmN0aW9uKCkgewoJCXZhciBib2R5ID0gZG9jdW1lbnQuYm9keSwgY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksIGlubmVyRGl2LCBjaGVja0RpdiwgdGFibGUsIHRkLCBib2R5TWFyZ2luVG9wID0gcGFyc2VGbG9hdCggalF1ZXJ5LmNzcyhib2R5LCAibWFyZ2luVG9wIikgKSB8fCAwLAoJCQlodG1sID0gIjxkaXYgc3R5bGU9J3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2xlZnQ6MDttYXJnaW46MDtib3JkZXI6NXB4IHNvbGlkICMwMDA7cGFkZGluZzowO3dpZHRoOjFweDtoZWlnaHQ6MXB4Oyc+PGRpdj48L2Rpdj48L2Rpdj48dGFibGUgc3R5bGU9J3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2xlZnQ6MDttYXJnaW46MDtib3JkZXI6NXB4IHNvbGlkICMwMDA7cGFkZGluZzowO3dpZHRoOjFweDtoZWlnaHQ6MXB4OycgY2VsbHBhZGRpbmc9JzAnIGNlbGxzcGFjaW5nPScwJz48dHI+PHRkPjwvdGQ+PC90cj48L3RhYmxlPiI7CgoJCWpRdWVyeS5leHRlbmQoIGNvbnRhaW5lci5zdHlsZSwgeyBwb3NpdGlvbjogImFic29sdXRlIiwgdG9wOiAwLCBsZWZ0OiAwLCBtYXJnaW46IDAsIGJvcmRlcjogMCwgd2lkdGg6ICIxcHgiLCBoZWlnaHQ6ICIxcHgiLCB2aXNpYmlsaXR5OiAiaGlkZGVuIiB9ICk7CgoJCWNvbnRhaW5lci5pbm5lckhUTUwgPSBodG1sOwoJCWJvZHkuaW5zZXJ0QmVmb3JlKCBjb250YWluZXIsIGJvZHkuZmlyc3RDaGlsZCApOwoJCWlubmVyRGl2ID0gY29udGFpbmVyLmZpcnN0Q2hpbGQ7CgkJY2hlY2tEaXYgPSBpbm5lckRpdi5maXJzdENoaWxkOwoJCXRkID0gaW5uZXJEaXYubmV4dFNpYmxpbmcuZmlyc3RDaGlsZC5maXJzdENoaWxkOwoKCQl0aGlzLmRvZXNOb3RBZGRCb3JkZXIgPSAoY2hlY2tEaXYub2Zmc2V0VG9wICE9PSA1KTsKCQl0aGlzLmRvZXNBZGRCb3JkZXJGb3JUYWJsZUFuZENlbGxzID0gKHRkLm9mZnNldFRvcCA9PT0gNSk7CgoJCWNoZWNrRGl2LnN0eWxlLnBvc2l0aW9uID0gImZpeGVkIjsKCQljaGVja0Rpdi5zdHlsZS50b3AgPSAiMjBweCI7CgoJCS8vIHNhZmFyaSBzdWJ0cmFjdHMgcGFyZW50IGJvcmRlciB3aWR0aCBoZXJlIHdoaWNoIGlzIDVweAoJCXRoaXMuc3VwcG9ydHNGaXhlZFBvc2l0aW9uID0gKGNoZWNrRGl2Lm9mZnNldFRvcCA9PT0gMjAgfHwgY2hlY2tEaXYub2Zmc2V0VG9wID09PSAxNSk7CgkJY2hlY2tEaXYuc3R5bGUucG9zaXRpb24gPSBjaGVja0Rpdi5zdHlsZS50b3AgPSAiIjsKCgkJaW5uZXJEaXYuc3R5bGUub3ZlcmZsb3cgPSAiaGlkZGVuIjsKCQlpbm5lckRpdi5zdHlsZS5wb3NpdGlvbiA9ICJyZWxhdGl2ZSI7CgoJCXRoaXMuc3VidHJhY3RzQm9yZGVyRm9yT3ZlcmZsb3dOb3RWaXNpYmxlID0gKGNoZWNrRGl2Lm9mZnNldFRvcCA9PT0gLTUpOwoKCQl0aGlzLmRvZXNOb3RJbmNsdWRlTWFyZ2luSW5Cb2R5T2Zmc2V0ID0gKGJvZHkub2Zmc2V0VG9wICE9PSBib2R5TWFyZ2luVG9wKTsKCgkJYm9keS5yZW1vdmVDaGlsZCggY29udGFpbmVyICk7CgkJalF1ZXJ5Lm9mZnNldC5pbml0aWFsaXplID0galF1ZXJ5Lm5vb3A7Cgl9LAoKCWJvZHlPZmZzZXQ6IGZ1bmN0aW9uKCBib2R5ICkgewoJCXZhciB0b3AgPSBib2R5Lm9mZnNldFRvcCwKCQkJbGVmdCA9IGJvZHkub2Zmc2V0TGVmdDsKCgkJalF1ZXJ5Lm9mZnNldC5pbml0aWFsaXplKCk7CgoJCWlmICggalF1ZXJ5Lm9mZnNldC5kb2VzTm90SW5jbHVkZU1hcmdpbkluQm9keU9mZnNldCApIHsKCQkJdG9wICArPSBwYXJzZUZsb2F0KCBqUXVlcnkuY3NzKGJvZHksICJtYXJnaW5Ub3AiKSApIHx8IDA7CgkJCWxlZnQgKz0gcGFyc2VGbG9hdCggalF1ZXJ5LmNzcyhib2R5LCAibWFyZ2luTGVmdCIpICkgfHwgMDsKCQl9CgoJCXJldHVybiB7IHRvcDogdG9wLCBsZWZ0OiBsZWZ0IH07Cgl9LAoKCXNldE9mZnNldDogZnVuY3Rpb24oIGVsZW0sIG9wdGlvbnMsIGkgKSB7CgkJdmFyIHBvc2l0aW9uID0galF1ZXJ5LmNzcyggZWxlbSwgInBvc2l0aW9uIiApOwoKCQkvLyBzZXQgcG9zaXRpb24gZmlyc3QsIGluLWNhc2UgdG9wL2xlZnQgYXJlIHNldCBldmVuIG9uIHN0YXRpYyBlbGVtCgkJaWYgKCBwb3NpdGlvbiA9PT0gInN0YXRpYyIgKSB7CgkJCWVsZW0uc3R5bGUucG9zaXRpb24gPSAicmVsYXRpdmUiOwoJCX0KCgkJdmFyIGN1ckVsZW0gPSBqUXVlcnkoIGVsZW0gKSwKCQkJY3VyT2Zmc2V0ID0gY3VyRWxlbS5vZmZzZXQoKSwKCQkJY3VyQ1NTVG9wID0galF1ZXJ5LmNzcyggZWxlbSwgInRvcCIgKSwKCQkJY3VyQ1NTTGVmdCA9IGpRdWVyeS5jc3MoIGVsZW0sICJsZWZ0IiApLAoJCQljYWxjdWxhdGVQb3NpdGlvbiA9IChwb3NpdGlvbiA9PT0gImFic29sdXRlIiB8fCBwb3NpdGlvbiA9PT0gImZpeGVkIikgJiYgalF1ZXJ5LmluQXJyYXkoImF1dG8iLCBbY3VyQ1NTVG9wLCBjdXJDU1NMZWZ0XSkgPiAtMSwKCQkJcHJvcHMgPSB7fSwgY3VyUG9zaXRpb24gPSB7fSwgY3VyVG9wLCBjdXJMZWZ0OwoKCQkvLyBuZWVkIHRvIGJlIGFibGUgdG8gY2FsY3VsYXRlIHBvc2l0aW9uIGlmIGVpdGhlciB0b3Agb3IgbGVmdCBpcyBhdXRvIGFuZCBwb3NpdGlvbiBpcyBlaXRoZXIgYWJzb2x1dGUgb3IgZml4ZWQKCQlpZiAoIGNhbGN1bGF0ZVBvc2l0aW9uICkgewoJCQljdXJQb3NpdGlvbiA9IGN1ckVsZW0ucG9zaXRpb24oKTsKCQkJY3VyVG9wID0gY3VyUG9zaXRpb24udG9wOwoJCQljdXJMZWZ0ID0gY3VyUG9zaXRpb24ubGVmdDsKCQl9IGVsc2UgewoJCQljdXJUb3AgPSBwYXJzZUZsb2F0KCBjdXJDU1NUb3AgKSB8fCAwOwoJCQljdXJMZWZ0ID0gcGFyc2VGbG9hdCggY3VyQ1NTTGVmdCApIHx8IDA7CgkJfQoKCQlpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBvcHRpb25zICkgKSB7CgkJCW9wdGlvbnMgPSBvcHRpb25zLmNhbGwoIGVsZW0sIGksIGN1ck9mZnNldCApOwoJCX0KCgkJaWYgKG9wdGlvbnMudG9wICE9IG51bGwpIHsKCQkJcHJvcHMudG9wID0gKG9wdGlvbnMudG9wIC0gY3VyT2Zmc2V0LnRvcCkgKyBjdXJUb3A7CgkJfQoJCWlmIChvcHRpb25zLmxlZnQgIT0gbnVsbCkgewoJCQlwcm9wcy5sZWZ0ID0gKG9wdGlvbnMubGVmdCAtIGN1ck9mZnNldC5sZWZ0KSArIGN1ckxlZnQ7CgkJfQoKCQlpZiAoICJ1c2luZyIgaW4gb3B0aW9ucyApIHsKCQkJb3B0aW9ucy51c2luZy5jYWxsKCBlbGVtLCBwcm9wcyApOwoJCX0gZWxzZSB7CgkJCWN1ckVsZW0uY3NzKCBwcm9wcyApOwoJCX0KCX0KfTsKCgpqUXVlcnkuZm4uZXh0ZW5kKHsKCXBvc2l0aW9uOiBmdW5jdGlvbigpIHsKCQlpZiAoICF0aGlzWzBdICkgewoJCQlyZXR1cm4gbnVsbDsKCQl9CgoJCXZhciBlbGVtID0gdGhpc1swXSwKCgkJLy8gR2V0ICpyZWFsKiBvZmZzZXRQYXJlbnQKCQlvZmZzZXRQYXJlbnQgPSB0aGlzLm9mZnNldFBhcmVudCgpLAoKCQkvLyBHZXQgY29ycmVjdCBvZmZzZXRzCgkJb2Zmc2V0ICAgICAgID0gdGhpcy5vZmZzZXQoKSwKCQlwYXJlbnRPZmZzZXQgPSBycm9vdC50ZXN0KG9mZnNldFBhcmVudFswXS5ub2RlTmFtZSkgPyB7IHRvcDogMCwgbGVmdDogMCB9IDogb2Zmc2V0UGFyZW50Lm9mZnNldCgpOwoKCQkvLyBTdWJ0cmFjdCBlbGVtZW50IG1hcmdpbnMKCQkvLyBub3RlOiB3aGVuIGFuIGVsZW1lbnQgaGFzIG1hcmdpbjogYXV0byB0aGUgb2Zmc2V0TGVmdCBhbmQgbWFyZ2luTGVmdAoJCS8vIGFyZSB0aGUgc2FtZSBpbiBTYWZhcmkgY2F1c2luZyBvZmZzZXQubGVmdCB0byBpbmNvcnJlY3RseSBiZSAwCgkJb2Zmc2V0LnRvcCAgLT0gcGFyc2VGbG9hdCggalF1ZXJ5LmNzcyhlbGVtLCAibWFyZ2luVG9wIikgKSB8fCAwOwoJCW9mZnNldC5sZWZ0IC09IHBhcnNlRmxvYXQoIGpRdWVyeS5jc3MoZWxlbSwgIm1hcmdpbkxlZnQiKSApIHx8IDA7CgoJCS8vIEFkZCBvZmZzZXRQYXJlbnQgYm9yZGVycwoJCXBhcmVudE9mZnNldC50b3AgICs9IHBhcnNlRmxvYXQoIGpRdWVyeS5jc3Mob2Zmc2V0UGFyZW50WzBdLCAiYm9yZGVyVG9wV2lkdGgiKSApIHx8IDA7CgkJcGFyZW50T2Zmc2V0LmxlZnQgKz0gcGFyc2VGbG9hdCggalF1ZXJ5LmNzcyhvZmZzZXRQYXJlbnRbMF0sICJib3JkZXJMZWZ0V2lkdGgiKSApIHx8IDA7CgoJCS8vIFN1YnRyYWN0IHRoZSB0d28gb2Zmc2V0cwoJCXJldHVybiB7CgkJCXRvcDogIG9mZnNldC50b3AgIC0gcGFyZW50T2Zmc2V0LnRvcCwKCQkJbGVmdDogb2Zmc2V0LmxlZnQgLSBwYXJlbnRPZmZzZXQubGVmdAoJCX07Cgl9LAoKCW9mZnNldFBhcmVudDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCkgewoJCQl2YXIgb2Zmc2V0UGFyZW50ID0gdGhpcy5vZmZzZXRQYXJlbnQgfHwgZG9jdW1lbnQuYm9keTsKCQkJd2hpbGUgKCBvZmZzZXRQYXJlbnQgJiYgKCFycm9vdC50ZXN0KG9mZnNldFBhcmVudC5ub2RlTmFtZSkgJiYgalF1ZXJ5LmNzcyhvZmZzZXRQYXJlbnQsICJwb3NpdGlvbiIpID09PSAic3RhdGljIikgKSB7CgkJCQlvZmZzZXRQYXJlbnQgPSBvZmZzZXRQYXJlbnQub2Zmc2V0UGFyZW50OwoJCQl9CgkJCXJldHVybiBvZmZzZXRQYXJlbnQ7CgkJfSk7Cgl9Cn0pOwoKCi8vIENyZWF0ZSBzY3JvbGxMZWZ0IGFuZCBzY3JvbGxUb3AgbWV0aG9kcwpqUXVlcnkuZWFjaCggWyJMZWZ0IiwgIlRvcCJdLCBmdW5jdGlvbiggaSwgbmFtZSApIHsKCXZhciBtZXRob2QgPSAic2Nyb2xsIiArIG5hbWU7CgoJalF1ZXJ5LmZuWyBtZXRob2QgXSA9IGZ1bmN0aW9uKCB2YWwgKSB7CgkJdmFyIGVsZW0sIHdpbjsKCgkJaWYgKCB2YWwgPT09IHVuZGVmaW5lZCApIHsKCQkJZWxlbSA9IHRoaXNbIDAgXTsKCgkJCWlmICggIWVsZW0gKSB7CgkJCQlyZXR1cm4gbnVsbDsKCQkJfQoKCQkJd2luID0gZ2V0V2luZG93KCBlbGVtICk7CgoJCQkvLyBSZXR1cm4gdGhlIHNjcm9sbCBvZmZzZXQKCQkJcmV0dXJuIHdpbiA/ICgicGFnZVhPZmZzZXQiIGluIHdpbikgPyB3aW5bIGkgPyAicGFnZVlPZmZzZXQiIDogInBhZ2VYT2Zmc2V0IiBdIDoKCQkJCWpRdWVyeS5zdXBwb3J0LmJveE1vZGVsICYmIHdpbi5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbIG1ldGhvZCBdIHx8CgkJCQkJd2luLmRvY3VtZW50LmJvZHlbIG1ldGhvZCBdIDoKCQkJCWVsZW1bIG1ldGhvZCBdOwoJCX0KCgkJLy8gU2V0IHRoZSBzY3JvbGwgb2Zmc2V0CgkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHsKCQkJd2luID0gZ2V0V2luZG93KCB0aGlzICk7CgoJCQlpZiAoIHdpbiApIHsKCQkJCXdpbi5zY3JvbGxUbygKCQkJCQkhaSA/IHZhbCA6IGpRdWVyeSggd2luICkuc2Nyb2xsTGVmdCgpLAoJCQkJCSBpID8gdmFsIDogalF1ZXJ5KCB3aW4gKS5zY3JvbGxUb3AoKQoJCQkJKTsKCgkJCX0gZWxzZSB7CgkJCQl0aGlzWyBtZXRob2QgXSA9IHZhbDsKCQkJfQoJCX0pOwoJfTsKfSk7CgpmdW5jdGlvbiBnZXRXaW5kb3coIGVsZW0gKSB7CglyZXR1cm4galF1ZXJ5LmlzV2luZG93KCBlbGVtICkgPwoJCWVsZW0gOgoJCWVsZW0ubm9kZVR5cGUgPT09IDkgPwoJCQllbGVtLmRlZmF1bHRWaWV3IHx8IGVsZW0ucGFyZW50V2luZG93IDoKCQkJZmFsc2U7Cn0KCgoKCi8vIENyZWF0ZSB3aWR0aCwgaGVpZ2h0LCBpbm5lckhlaWdodCwgaW5uZXJXaWR0aCwgb3V0ZXJIZWlnaHQgYW5kIG91dGVyV2lkdGggbWV0aG9kcwpqUXVlcnkuZWFjaChbICJIZWlnaHQiLCAiV2lkdGgiIF0sIGZ1bmN0aW9uKCBpLCBuYW1lICkgewoKCXZhciB0eXBlID0gbmFtZS50b0xvd2VyQ2FzZSgpOwoKCS8vIGlubmVySGVpZ2h0IGFuZCBpbm5lcldpZHRoCglqUXVlcnkuZm5bICJpbm5lciIgKyBuYW1lIF0gPSBmdW5jdGlvbigpIHsKCQl2YXIgZWxlbSA9IHRoaXNbMF07CgkJcmV0dXJuIGVsZW0gJiYgZWxlbS5zdHlsZSA/CgkJCXBhcnNlRmxvYXQoIGpRdWVyeS5jc3MoIGVsZW0sIHR5cGUsICJwYWRkaW5nIiApICkgOgoJCQludWxsOwoJfTsKCgkvLyBvdXRlckhlaWdodCBhbmQgb3V0ZXJXaWR0aAoJalF1ZXJ5LmZuWyAib3V0ZXIiICsgbmFtZSBdID0gZnVuY3Rpb24oIG1hcmdpbiApIHsKCQl2YXIgZWxlbSA9IHRoaXNbMF07CgkJcmV0dXJuIGVsZW0gJiYgZWxlbS5zdHlsZSA/CgkJCXBhcnNlRmxvYXQoIGpRdWVyeS5jc3MoIGVsZW0sIHR5cGUsIG1hcmdpbiA/ICJtYXJnaW4iIDogImJvcmRlciIgKSApIDoKCQkJbnVsbDsKCX07CgoJalF1ZXJ5LmZuWyB0eXBlIF0gPSBmdW5jdGlvbiggc2l6ZSApIHsKCQkvLyBHZXQgd2luZG93IHdpZHRoIG9yIGhlaWdodAoJCXZhciBlbGVtID0gdGhpc1swXTsKCQlpZiAoICFlbGVtICkgewoJCQlyZXR1cm4gc2l6ZSA9PSBudWxsID8gbnVsbCA6IHRoaXM7CgkJfQoKCQlpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBzaXplICkgKSB7CgkJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oIGkgKSB7CgkJCQl2YXIgc2VsZiA9IGpRdWVyeSggdGhpcyApOwoJCQkJc2VsZlsgdHlwZSBdKCBzaXplLmNhbGwoIHRoaXMsIGksIHNlbGZbIHR5cGUgXSgpICkgKTsKCQkJfSk7CgkJfQoKCQlpZiAoIGpRdWVyeS5pc1dpbmRvdyggZWxlbSApICkgewoJCQkvLyBFdmVyeW9uZSBlbHNlIHVzZSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQgb3IgZG9jdW1lbnQuYm9keSBkZXBlbmRpbmcgb24gUXVpcmtzIHZzIFN0YW5kYXJkcyBtb2RlCgkJCS8vIDNyZCBjb25kaXRpb24gYWxsb3dzIE5va2lhIHN1cHBvcnQsIGFzIGl0IHN1cHBvcnRzIHRoZSBkb2NFbGVtIHByb3AgYnV0IG5vdCBDU1MxQ29tcGF0CgkJCXZhciBkb2NFbGVtUHJvcCA9IGVsZW0uZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50WyAiY2xpZW50IiArIG5hbWUgXSwKCQkJCWJvZHkgPSBlbGVtLmRvY3VtZW50LmJvZHk7CgkJCXJldHVybiBlbGVtLmRvY3VtZW50LmNvbXBhdE1vZGUgPT09ICJDU1MxQ29tcGF0IiAmJiBkb2NFbGVtUHJvcCB8fAoJCQkJYm9keSAmJiBib2R5WyAiY2xpZW50IiArIG5hbWUgXSB8fCBkb2NFbGVtUHJvcDsKCgkJLy8gR2V0IGRvY3VtZW50IHdpZHRoIG9yIGhlaWdodAoJCX0gZWxzZSBpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDkgKSB7CgkJCS8vIEVpdGhlciBzY3JvbGxbV2lkdGgvSGVpZ2h0XSBvciBvZmZzZXRbV2lkdGgvSGVpZ2h0XSwgd2hpY2hldmVyIGlzIGdyZWF0ZXIKCQkJcmV0dXJuIE1hdGgubWF4KAoJCQkJZWxlbS5kb2N1bWVudEVsZW1lbnRbImNsaWVudCIgKyBuYW1lXSwKCQkJCWVsZW0uYm9keVsic2Nyb2xsIiArIG5hbWVdLCBlbGVtLmRvY3VtZW50RWxlbWVudFsic2Nyb2xsIiArIG5hbWVdLAoJCQkJZWxlbS5ib2R5WyJvZmZzZXQiICsgbmFtZV0sIGVsZW0uZG9jdW1lbnRFbGVtZW50WyJvZmZzZXQiICsgbmFtZV0KCQkJKTsKCgkJLy8gR2V0IG9yIHNldCB3aWR0aCBvciBoZWlnaHQgb24gdGhlIGVsZW1lbnQKCQl9IGVsc2UgaWYgKCBzaXplID09PSB1bmRlZmluZWQgKSB7CgkJCXZhciBvcmlnID0galF1ZXJ5LmNzcyggZWxlbSwgdHlwZSApLAoJCQkJcmV0ID0gcGFyc2VGbG9hdCggb3JpZyApOwoKCQkJcmV0dXJuIGpRdWVyeS5pc05hTiggcmV0ICkgPyBvcmlnIDogcmV0OwoKCQkvLyBTZXQgdGhlIHdpZHRoIG9yIGhlaWdodCBvbiB0aGUgZWxlbWVudCAoZGVmYXVsdCB0byBwaXhlbHMgaWYgdmFsdWUgaXMgdW5pdGxlc3MpCgkJfSBlbHNlIHsKCQkJcmV0dXJuIHRoaXMuY3NzKCB0eXBlLCB0eXBlb2Ygc2l6ZSA9PT0gInN0cmluZyIgPyBzaXplIDogc2l6ZSArICJweCIgKTsKCQl9Cgl9OwoKfSk7CgoKLy8gRXhwb3NlIGpRdWVyeSB0byB0aGUgZ2xvYmFsIG9iamVjdAp3aW5kb3cualF1ZXJ5ID0gd2luZG93LiQgPSBqUXVlcnk7Cn0pKHdpbmRvdyk7Cg==]]></data>
	</file>
	<file>
	  <filename>/src/jquery.min.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyohIGpRdWVyeSB2MS42LjQgaHR0cDovL2pxdWVyeS5jb20vIHwgaHR0cDovL2pxdWVyeS5vcmcvbGljZW5zZSAqLwooZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBjdShhKXtyZXR1cm4gZi5pc1dpbmRvdyhhKT9hOmEubm9kZVR5cGU9PT05P2EuZGVmYXVsdFZpZXd8fGEucGFyZW50V2luZG93OiExfWZ1bmN0aW9uIGNyKGEpe2lmKCFjZ1thXSl7dmFyIGI9Yy5ib2R5LGQ9ZigiPCIrYSsiPiIpLmFwcGVuZFRvKGIpLGU9ZC5jc3MoImRpc3BsYXkiKTtkLnJlbW92ZSgpO2lmKGU9PT0ibm9uZSJ8fGU9PT0iIil7Y2h8fChjaD1jLmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpLGNoLmZyYW1lQm9yZGVyPWNoLndpZHRoPWNoLmhlaWdodD0wKSxiLmFwcGVuZENoaWxkKGNoKTtpZighY2l8fCFjaC5jcmVhdGVFbGVtZW50KWNpPShjaC5jb250ZW50V2luZG93fHxjaC5jb250ZW50RG9jdW1lbnQpLmRvY3VtZW50LGNpLndyaXRlKChjLmNvbXBhdE1vZGU9PT0iQ1NTMUNvbXBhdCI/IjwhZG9jdHlwZSBodG1sPiI6IiIpKyI8aHRtbD48Ym9keT4iKSxjaS5jbG9zZSgpO2Q9Y2kuY3JlYXRlRWxlbWVudChhKSxjaS5ib2R5LmFwcGVuZENoaWxkKGQpLGU9Zi5jc3MoZCwiZGlzcGxheSIpLGIucmVtb3ZlQ2hpbGQoY2gpfWNnW2FdPWV9cmV0dXJuIGNnW2FdfWZ1bmN0aW9uIGNxKGEsYil7dmFyIGM9e307Zi5lYWNoKGNtLmNvbmNhdC5hcHBseShbXSxjbS5zbGljZSgwLGIpKSxmdW5jdGlvbigpe2NbdGhpc109YX0pO3JldHVybiBjfWZ1bmN0aW9uIGNwKCl7Y249Yn1mdW5jdGlvbiBjbygpe3NldFRpbWVvdXQoY3AsMCk7cmV0dXJuIGNuPWYubm93KCl9ZnVuY3Rpb24gY2YoKXt0cnl7cmV0dXJuIG5ldyBhLkFjdGl2ZVhPYmplY3QoIk1pY3Jvc29mdC5YTUxIVFRQIil9Y2F0Y2goYil7fX1mdW5jdGlvbiBjZSgpe3RyeXtyZXR1cm4gbmV3IGEuWE1MSHR0cFJlcXVlc3R9Y2F0Y2goYil7fX1mdW5jdGlvbiBiJChhLGMpe2EuZGF0YUZpbHRlciYmKGM9YS5kYXRhRmlsdGVyKGMsYS5kYXRhVHlwZSkpO3ZhciBkPWEuZGF0YVR5cGVzLGU9e30sZyxoLGk9ZC5sZW5ndGgsaixrPWRbMF0sbCxtLG4sbyxwO2ZvcihnPTE7ZzxpO2crKyl7aWYoZz09PTEpZm9yKGggaW4gYS5jb252ZXJ0ZXJzKXR5cGVvZiBoPT0ic3RyaW5nIiYmKGVbaC50b0xvd2VyQ2FzZSgpXT1hLmNvbnZlcnRlcnNbaF0pO2w9ayxrPWRbZ107aWYoaz09PSIqIilrPWw7ZWxzZSBpZihsIT09IioiJiZsIT09ayl7bT1sKyIgIitrLG49ZVttXXx8ZVsiKiAiK2tdO2lmKCFuKXtwPWI7Zm9yKG8gaW4gZSl7aj1vLnNwbGl0KCIgIik7aWYoalswXT09PWx8fGpbMF09PT0iKiIpe3A9ZVtqWzFdKyIgIitrXTtpZihwKXtvPWVbb10sbz09PSEwP249cDpwPT09ITAmJihuPW8pO2JyZWFrfX19fSFuJiYhcCYmZi5lcnJvcigiTm8gY29udmVyc2lvbiBmcm9tICIrbS5yZXBsYWNlKCIgIiwiIHRvICIpKSxuIT09ITAmJihjPW4/bihjKTpwKG8oYykpKX19cmV0dXJuIGN9ZnVuY3Rpb24gYlooYSxjLGQpe3ZhciBlPWEuY29udGVudHMsZj1hLmRhdGFUeXBlcyxnPWEucmVzcG9uc2VGaWVsZHMsaCxpLGosaztmb3IoaSBpbiBnKWkgaW4gZCYmKGNbZ1tpXV09ZFtpXSk7d2hpbGUoZlswXT09PSIqIilmLnNoaWZ0KCksaD09PWImJihoPWEubWltZVR5cGV8fGMuZ2V0UmVzcG9uc2VIZWFkZXIoImNvbnRlbnQtdHlwZSIpKTtpZihoKWZvcihpIGluIGUpaWYoZVtpXSYmZVtpXS50ZXN0KGgpKXtmLnVuc2hpZnQoaSk7YnJlYWt9aWYoZlswXWluIGQpaj1mWzBdO2Vsc2V7Zm9yKGkgaW4gZCl7aWYoIWZbMF18fGEuY29udmVydGVyc1tpKyIgIitmWzBdXSl7aj1pO2JyZWFrfWt8fChrPWkpfWo9anx8a31pZihqKXtqIT09ZlswXSYmZi51bnNoaWZ0KGopO3JldHVybiBkW2pdfX1mdW5jdGlvbiBiWShhLGIsYyxkKXtpZihmLmlzQXJyYXkoYikpZi5lYWNoKGIsZnVuY3Rpb24oYixlKXtjfHxiQS50ZXN0KGEpP2QoYSxlKTpiWShhKyJbIisodHlwZW9mIGU9PSJvYmplY3QifHxmLmlzQXJyYXkoZSk/YjoiIikrIl0iLGUsYyxkKX0pO2Vsc2UgaWYoIWMmJmIhPW51bGwmJnR5cGVvZiBiPT0ib2JqZWN0Iilmb3IodmFyIGUgaW4gYiliWShhKyJbIitlKyJdIixiW2VdLGMsZCk7ZWxzZSBkKGEsYil9ZnVuY3Rpb24gYlgoYSxjKXt2YXIgZCxlLGc9Zi5hamF4U2V0dGluZ3MuZmxhdE9wdGlvbnN8fHt9O2ZvcihkIGluIGMpY1tkXSE9PWImJigoZ1tkXT9hOmV8fChlPXt9KSlbZF09Y1tkXSk7ZSYmZi5leHRlbmQoITAsYSxlKX1mdW5jdGlvbiBiVyhhLGMsZCxlLGYsZyl7Zj1mfHxjLmRhdGFUeXBlc1swXSxnPWd8fHt9LGdbZl09ITA7dmFyIGg9YVtmXSxpPTAsaj1oP2gubGVuZ3RoOjAsaz1hPT09YlAsbDtmb3IoO2k8aiYmKGt8fCFsKTtpKyspbD1oW2ldKGMsZCxlKSx0eXBlb2YgbD09InN0cmluZyImJigha3x8Z1tsXT9sPWI6KGMuZGF0YVR5cGVzLnVuc2hpZnQobCksbD1iVyhhLGMsZCxlLGwsZykpKTsoa3x8IWwpJiYhZ1siKiJdJiYobD1iVyhhLGMsZCxlLCIqIixnKSk7cmV0dXJuIGx9ZnVuY3Rpb24gYlYoYSl7cmV0dXJuIGZ1bmN0aW9uKGIsYyl7dHlwZW9mIGIhPSJzdHJpbmciJiYoYz1iLGI9IioiKTtpZihmLmlzRnVuY3Rpb24oYykpe3ZhciBkPWIudG9Mb3dlckNhc2UoKS5zcGxpdChiTCksZT0wLGc9ZC5sZW5ndGgsaCxpLGo7Zm9yKDtlPGc7ZSsrKWg9ZFtlXSxqPS9eXCsvLnRlc3QoaCksaiYmKGg9aC5zdWJzdHIoMSl8fCIqIiksaT1hW2hdPWFbaF18fFtdLGlbaj8idW5zaGlmdCI6InB1c2giXShjKX19fWZ1bmN0aW9uIGJ5KGEsYixjKXt2YXIgZD1iPT09IndpZHRoIj9hLm9mZnNldFdpZHRoOmEub2Zmc2V0SGVpZ2h0LGU9Yj09PSJ3aWR0aCI/YnQ6YnU7aWYoZD4wKXtjIT09ImJvcmRlciImJmYuZWFjaChlLGZ1bmN0aW9uKCl7Y3x8KGQtPXBhcnNlRmxvYXQoZi5jc3MoYSwicGFkZGluZyIrdGhpcykpfHwwKSxjPT09Im1hcmdpbiI/ZCs9cGFyc2VGbG9hdChmLmNzcyhhLGMrdGhpcykpfHwwOmQtPXBhcnNlRmxvYXQoZi5jc3MoYSwiYm9yZGVyIit0aGlzKyJXaWR0aCIpKXx8MH0pO3JldHVybiBkKyJweCJ9ZD1idihhLGIsYik7aWYoZDwwfHxkPT1udWxsKWQ9YS5zdHlsZVtiXXx8MDtkPXBhcnNlRmxvYXQoZCl8fDAsYyYmZi5lYWNoKGUsZnVuY3Rpb24oKXtkKz1wYXJzZUZsb2F0KGYuY3NzKGEsInBhZGRpbmciK3RoaXMpKXx8MCxjIT09InBhZGRpbmciJiYoZCs9cGFyc2VGbG9hdChmLmNzcyhhLCJib3JkZXIiK3RoaXMrIldpZHRoIikpfHwwKSxjPT09Im1hcmdpbiImJihkKz1wYXJzZUZsb2F0KGYuY3NzKGEsYyt0aGlzKSl8fDApfSk7cmV0dXJuIGQrInB4In1mdW5jdGlvbiBibChhLGIpe2Iuc3JjP2YuYWpheCh7dXJsOmIuc3JjLGFzeW5jOiExLGRhdGFUeXBlOiJzY3JpcHQifSk6Zi5nbG9iYWxFdmFsKChiLnRleHR8fGIudGV4dENvbnRlbnR8fGIuaW5uZXJIVE1MfHwiIikucmVwbGFjZShiZCwiLyokMCovIikpLGIucGFyZW50Tm9kZSYmYi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGIpfWZ1bmN0aW9uIGJrKGEpe2Yubm9kZU5hbWUoYSwiaW5wdXQiKT9iaihhKToiZ2V0RWxlbWVudHNCeVRhZ05hbWUiaW4gYSYmZi5ncmVwKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlucHV0IiksYmopfWZ1bmN0aW9uIGJqKGEpe2lmKGEudHlwZT09PSJjaGVja2JveCJ8fGEudHlwZT09PSJyYWRpbyIpYS5kZWZhdWx0Q2hlY2tlZD1hLmNoZWNrZWR9ZnVuY3Rpb24gYmkoYSl7cmV0dXJuImdldEVsZW1lbnRzQnlUYWdOYW1lImluIGE/YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpOiJxdWVyeVNlbGVjdG9yQWxsImluIGE/YS5xdWVyeVNlbGVjdG9yQWxsKCIqIik6W119ZnVuY3Rpb24gYmgoYSxiKXt2YXIgYztpZihiLm5vZGVUeXBlPT09MSl7Yi5jbGVhckF0dHJpYnV0ZXMmJmIuY2xlYXJBdHRyaWJ1dGVzKCksYi5tZXJnZUF0dHJpYnV0ZXMmJmIubWVyZ2VBdHRyaWJ1dGVzKGEpLGM9Yi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO2lmKGM9PT0ib2JqZWN0IiliLm91dGVySFRNTD1hLm91dGVySFRNTDtlbHNlIGlmKGMhPT0iaW5wdXQifHxhLnR5cGUhPT0iY2hlY2tib3giJiZhLnR5cGUhPT0icmFkaW8iKXtpZihjPT09Im9wdGlvbiIpYi5zZWxlY3RlZD1hLmRlZmF1bHRTZWxlY3RlZDtlbHNlIGlmKGM9PT0iaW5wdXQifHxjPT09InRleHRhcmVhIiliLmRlZmF1bHRWYWx1ZT1hLmRlZmF1bHRWYWx1ZX1lbHNlIGEuY2hlY2tlZCYmKGIuZGVmYXVsdENoZWNrZWQ9Yi5jaGVja2VkPWEuY2hlY2tlZCksYi52YWx1ZSE9PWEudmFsdWUmJihiLnZhbHVlPWEudmFsdWUpO2IucmVtb3ZlQXR0cmlidXRlKGYuZXhwYW5kbyl9fWZ1bmN0aW9uIGJnKGEsYil7aWYoYi5ub2RlVHlwZT09PTEmJiEhZi5oYXNEYXRhKGEpKXt2YXIgYz1mLmV4cGFuZG8sZD1mLmRhdGEoYSksZT1mLmRhdGEoYixkKTtpZihkPWRbY10pe3ZhciBnPWQuZXZlbnRzO2U9ZVtjXT1mLmV4dGVuZCh7fSxkKTtpZihnKXtkZWxldGUgZS5oYW5kbGUsZS5ldmVudHM9e307Zm9yKHZhciBoIGluIGcpZm9yKHZhciBpPTAsaj1nW2hdLmxlbmd0aDtpPGo7aSsrKWYuZXZlbnQuYWRkKGIsaCsoZ1toXVtpXS5uYW1lc3BhY2U/Ii4iOiIiKStnW2hdW2ldLm5hbWVzcGFjZSxnW2hdW2ldLGdbaF1baV0uZGF0YSl9fX19ZnVuY3Rpb24gYmYoYSxiKXtyZXR1cm4gZi5ub2RlTmFtZShhLCJ0YWJsZSIpP2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRib2R5IilbMF18fGEuYXBwZW5kQ2hpbGQoYS5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRib2R5IikpOmF9ZnVuY3Rpb24gVihhLGIsYyl7Yj1ifHwwO2lmKGYuaXNGdW5jdGlvbihiKSlyZXR1cm4gZi5ncmVwKGEsZnVuY3Rpb24oYSxkKXt2YXIgZT0hIWIuY2FsbChhLGQsYSk7cmV0dXJuIGU9PT1jfSk7aWYoYi5ub2RlVHlwZSlyZXR1cm4gZi5ncmVwKGEsZnVuY3Rpb24oYSxkKXtyZXR1cm4gYT09PWI9PT1jfSk7aWYodHlwZW9mIGI9PSJzdHJpbmciKXt2YXIgZD1mLmdyZXAoYSxmdW5jdGlvbihhKXtyZXR1cm4gYS5ub2RlVHlwZT09PTF9KTtpZihRLnRlc3QoYikpcmV0dXJuIGYuZmlsdGVyKGIsZCwhYyk7Yj1mLmZpbHRlcihiLGQpfXJldHVybiBmLmdyZXAoYSxmdW5jdGlvbihhLGQpe3JldHVybiBmLmluQXJyYXkoYSxiKT49MD09PWN9KX1mdW5jdGlvbiBVKGEpe3JldHVybiFhfHwhYS5wYXJlbnROb2RlfHxhLnBhcmVudE5vZGUubm9kZVR5cGU9PT0xMX1mdW5jdGlvbiBNKGEsYil7cmV0dXJuKGEmJmEhPT0iKiI/YSsiLiI6IiIpK2IucmVwbGFjZSh5LCJgIikucmVwbGFjZSh6LCImIil9ZnVuY3Rpb24gTChhKXt2YXIgYixjLGQsZSxnLGgsaSxqLGssbCxtLG4sbyxwPVtdLHE9W10scj1mLl9kYXRhKHRoaXMsImV2ZW50cyIpO2lmKCEoYS5saXZlRmlyZWQ9PT10aGlzfHwhcnx8IXIubGl2ZXx8YS50YXJnZXQuZGlzYWJsZWR8fGEuYnV0dG9uJiZhLnR5cGU9PT0iY2xpY2siKSl7YS5uYW1lc3BhY2UmJihuPW5ldyBSZWdFeHAoIihefFxcLikiK2EubmFtZXNwYWNlLnNwbGl0KCIuIikuam9pbigiXFwuKD86LipcXC4pPyIpKyIoXFwufCQpIikpLGEubGl2ZUZpcmVkPXRoaXM7dmFyIHM9ci5saXZlLnNsaWNlKDApO2ZvcihpPTA7aTxzLmxlbmd0aDtpKyspZz1zW2ldLGcub3JpZ1R5cGUucmVwbGFjZSh3LCIiKT09PWEudHlwZT9xLnB1c2goZy5zZWxlY3Rvcik6cy5zcGxpY2UoaS0tLDEpO2U9ZihhLnRhcmdldCkuY2xvc2VzdChxLGEuY3VycmVudFRhcmdldCk7Zm9yKGo9MCxrPWUubGVuZ3RoO2o8aztqKyspe209ZVtqXTtmb3IoaT0wO2k8cy5sZW5ndGg7aSsrKXtnPXNbaV07aWYobS5zZWxlY3Rvcj09PWcuc2VsZWN0b3ImJighbnx8bi50ZXN0KGcubmFtZXNwYWNlKSkmJiFtLmVsZW0uZGlzYWJsZWQpe2g9bS5lbGVtLGQ9bnVsbDtpZihnLnByZVR5cGU9PT0ibW91c2VlbnRlciJ8fGcucHJlVHlwZT09PSJtb3VzZWxlYXZlIilhLnR5cGU9Zy5wcmVUeXBlLGQ9ZihhLnJlbGF0ZWRUYXJnZXQpLmNsb3Nlc3QoZy5zZWxlY3RvcilbMF0sZCYmZi5jb250YWlucyhoLGQpJiYoZD1oKTsoIWR8fGQhPT1oKSYmcC5wdXNoKHtlbGVtOmgsaGFuZGxlT2JqOmcsbGV2ZWw6bS5sZXZlbH0pfX19Zm9yKGo9MCxrPXAubGVuZ3RoO2o8aztqKyspe2U9cFtqXTtpZihjJiZlLmxldmVsPmMpYnJlYWs7YS5jdXJyZW50VGFyZ2V0PWUuZWxlbSxhLmRhdGE9ZS5oYW5kbGVPYmouZGF0YSxhLmhhbmRsZU9iaj1lLmhhbmRsZU9iaixvPWUuaGFuZGxlT2JqLm9yaWdIYW5kbGVyLmFwcGx5KGUuZWxlbSxhcmd1bWVudHMpO2lmKG89PT0hMXx8YS5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpKXtjPWUubGV2ZWwsbz09PSExJiYoYj0hMSk7aWYoYS5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpKWJyZWFrfX1yZXR1cm4gYn19ZnVuY3Rpb24gSihhLGMsZCl7dmFyIGU9Zi5leHRlbmQoe30sZFswXSk7ZS50eXBlPWEsZS5vcmlnaW5hbEV2ZW50PXt9LGUubGl2ZUZpcmVkPWIsZi5ldmVudC5oYW5kbGUuY2FsbChjLGUpLGUuaXNEZWZhdWx0UHJldmVudGVkKCkmJmRbMF0ucHJldmVudERlZmF1bHQoKX1mdW5jdGlvbiBEKCl7cmV0dXJuITB9ZnVuY3Rpb24gQygpe3JldHVybiExfWZ1bmN0aW9uIG0oYSxjLGQpe3ZhciBlPWMrImRlZmVyIixnPWMrInF1ZXVlIixoPWMrIm1hcmsiLGk9Zi5kYXRhKGEsZSxiLCEwKTtpJiYoZD09PSJxdWV1ZSJ8fCFmLmRhdGEoYSxnLGIsITApKSYmKGQ9PT0ibWFyayJ8fCFmLmRhdGEoYSxoLGIsITApKSYmc2V0VGltZW91dChmdW5jdGlvbigpeyFmLmRhdGEoYSxnLGIsITApJiYhZi5kYXRhKGEsaCxiLCEwKSYmKGYucmVtb3ZlRGF0YShhLGUsITApLGkucmVzb2x2ZSgpKX0sMCl9ZnVuY3Rpb24gbChhKXtmb3IodmFyIGIgaW4gYSlpZihiIT09InRvSlNPTiIpcmV0dXJuITE7cmV0dXJuITB9ZnVuY3Rpb24gayhhLGMsZCl7aWYoZD09PWImJmEubm9kZVR5cGU9PT0xKXt2YXIgZT0iZGF0YS0iK2MucmVwbGFjZShqLCItJDEiKS50b0xvd2VyQ2FzZSgpO2Q9YS5nZXRBdHRyaWJ1dGUoZSk7aWYodHlwZW9mIGQ9PSJzdHJpbmciKXt0cnl7ZD1kPT09InRydWUiPyEwOmQ9PT0iZmFsc2UiPyExOmQ9PT0ibnVsbCI/bnVsbDpmLmlzTmFOKGQpP2kudGVzdChkKT9mLnBhcnNlSlNPTihkKTpkOnBhcnNlRmxvYXQoZCl9Y2F0Y2goZyl7fWYuZGF0YShhLGMsZCl9ZWxzZSBkPWJ9cmV0dXJuIGR9dmFyIGM9YS5kb2N1bWVudCxkPWEubmF2aWdhdG9yLGU9YS5sb2NhdGlvbixmPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gSygpe2lmKCFlLmlzUmVhZHkpe3RyeXtjLmRvY3VtZW50RWxlbWVudC5kb1Njcm9sbCgibGVmdCIpfWNhdGNoKGEpe3NldFRpbWVvdXQoSywxKTtyZXR1cm59ZS5yZWFkeSgpfX12YXIgZT1mdW5jdGlvbihhLGIpe3JldHVybiBuZXcgZS5mbi5pbml0KGEsYixoKX0sZj1hLmpRdWVyeSxnPWEuJCxoLGk9L14oPzpbXiM8XSooPFtcd1xXXSs+KVtePl0qJHwjKFtcd1wtXSopJCkvLGo9L1xTLyxrPS9eXHMrLyxsPS9ccyskLyxtPS9cZC8sbj0vXjwoXHcrKVxzKlwvPz4oPzo8XC9cMT4pPyQvLG89L15bXF0sOnt9XHNdKiQvLHA9L1xcKD86WyJcXFwvYmZucnRdfHVbMC05YS1mQS1GXXs0fSkvZyxxPS8iW14iXFxcblxyXSoifHRydWV8ZmFsc2V8bnVsbHwtP1xkKyg/OlwuXGQqKT8oPzpbZUVdWytcLV0/XGQrKT8vZyxyPS8oPzpefDp8LCkoPzpccypcWykrL2cscz0vKHdlYmtpdClbIFwvXShbXHcuXSspLyx0PS8ob3BlcmEpKD86Lip2ZXJzaW9uKT9bIFwvXShbXHcuXSspLyx1PS8obXNpZSkgKFtcdy5dKykvLHY9Lyhtb3ppbGxhKSg/Oi4qPyBydjooW1x3Ll0rKSk/Lyx3PS8tKFthLXpdfFswLTldKS9pZyx4PS9eLW1zLS8seT1mdW5jdGlvbihhLGIpe3JldHVybihiKyIiKS50b1VwcGVyQ2FzZSgpfSx6PWQudXNlckFnZW50LEEsQixDLEQ9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyxFPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksRj1BcnJheS5wcm90b3R5cGUucHVzaCxHPUFycmF5LnByb3RvdHlwZS5zbGljZSxIPVN0cmluZy5wcm90b3R5cGUudHJpbSxJPUFycmF5LnByb3RvdHlwZS5pbmRleE9mLEo9e307ZS5mbj1lLnByb3RvdHlwZT17Y29uc3RydWN0b3I6ZSxpbml0OmZ1bmN0aW9uKGEsZCxmKXt2YXIgZyxoLGosaztpZighYSlyZXR1cm4gdGhpcztpZihhLm5vZGVUeXBlKXt0aGlzLmNvbnRleHQ9dGhpc1swXT1hLHRoaXMubGVuZ3RoPTE7cmV0dXJuIHRoaXN9aWYoYT09PSJib2R5IiYmIWQmJmMuYm9keSl7dGhpcy5jb250ZXh0PWMsdGhpc1swXT1jLmJvZHksdGhpcy5zZWxlY3Rvcj1hLHRoaXMubGVuZ3RoPTE7cmV0dXJuIHRoaXN9aWYodHlwZW9mIGE9PSJzdHJpbmciKXthLmNoYXJBdCgwKSE9PSI8Inx8YS5jaGFyQXQoYS5sZW5ndGgtMSkhPT0iPiJ8fGEubGVuZ3RoPDM/Zz1pLmV4ZWMoYSk6Zz1bbnVsbCxhLG51bGxdO2lmKGcmJihnWzFdfHwhZCkpe2lmKGdbMV0pe2Q9ZCBpbnN0YW5jZW9mIGU/ZFswXTpkLGs9ZD9kLm93bmVyRG9jdW1lbnR8fGQ6YyxqPW4uZXhlYyhhKSxqP2UuaXNQbGFpbk9iamVjdChkKT8oYT1bYy5jcmVhdGVFbGVtZW50KGpbMV0pXSxlLmZuLmF0dHIuY2FsbChhLGQsITApKTphPVtrLmNyZWF0ZUVsZW1lbnQoalsxXSldOihqPWUuYnVpbGRGcmFnbWVudChbZ1sxXV0sW2tdKSxhPShqLmNhY2hlYWJsZT9lLmNsb25lKGouZnJhZ21lbnQpOmouZnJhZ21lbnQpLmNoaWxkTm9kZXMpO3JldHVybiBlLm1lcmdlKHRoaXMsYSl9aD1jLmdldEVsZW1lbnRCeUlkKGdbMl0pO2lmKGgmJmgucGFyZW50Tm9kZSl7aWYoaC5pZCE9PWdbMl0pcmV0dXJuIGYuZmluZChhKTt0aGlzLmxlbmd0aD0xLHRoaXNbMF09aH10aGlzLmNvbnRleHQ9Yyx0aGlzLnNlbGVjdG9yPWE7cmV0dXJuIHRoaXN9cmV0dXJuIWR8fGQuanF1ZXJ5PyhkfHxmKS5maW5kKGEpOnRoaXMuY29uc3RydWN0b3IoZCkuZmluZChhKX1pZihlLmlzRnVuY3Rpb24oYSkpcmV0dXJuIGYucmVhZHkoYSk7YS5zZWxlY3RvciE9PWImJih0aGlzLnNlbGVjdG9yPWEuc2VsZWN0b3IsdGhpcy5jb250ZXh0PWEuY29udGV4dCk7cmV0dXJuIGUubWFrZUFycmF5KGEsdGhpcyl9LHNlbGVjdG9yOiIiLGpxdWVyeToiMS42LjQiLGxlbmd0aDowLHNpemU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sZW5ndGh9LHRvQXJyYXk6ZnVuY3Rpb24oKXtyZXR1cm4gRy5jYWxsKHRoaXMsMCl9LGdldDpmdW5jdGlvbihhKXtyZXR1cm4gYT09bnVsbD90aGlzLnRvQXJyYXkoKTphPDA/dGhpc1t0aGlzLmxlbmd0aCthXTp0aGlzW2FdfSxwdXNoU3RhY2s6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMuY29uc3RydWN0b3IoKTtlLmlzQXJyYXkoYSk/Ri5hcHBseShkLGEpOmUubWVyZ2UoZCxhKSxkLnByZXZPYmplY3Q9dGhpcyxkLmNvbnRleHQ9dGhpcy5jb250ZXh0LGI9PT0iZmluZCI/ZC5zZWxlY3Rvcj10aGlzLnNlbGVjdG9yKyh0aGlzLnNlbGVjdG9yPyIgIjoiIikrYzpiJiYoZC5zZWxlY3Rvcj10aGlzLnNlbGVjdG9yKyIuIitiKyIoIitjKyIpIik7cmV0dXJuIGR9LGVhY2g6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZS5lYWNoKHRoaXMsYSxiKX0scmVhZHk6ZnVuY3Rpb24oYSl7ZS5iaW5kUmVhZHkoKSxCLmRvbmUoYSk7cmV0dXJuIHRoaXN9LGVxOmZ1bmN0aW9uKGEpe3JldHVybiBhPT09LTE/dGhpcy5zbGljZShhKTp0aGlzLnNsaWNlKGEsK2ErMSl9LGZpcnN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXEoMCl9LGxhc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcSgtMSl9LHNsaWNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKEcuYXBwbHkodGhpcyxhcmd1bWVudHMpLCJzbGljZSIsRy5jYWxsKGFyZ3VtZW50cykuam9pbigiLCIpKX0sbWFwOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnB1c2hTdGFjayhlLm1hcCh0aGlzLGZ1bmN0aW9uKGIsYyl7cmV0dXJuIGEuY2FsbChiLGMsYil9KSl9LGVuZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnByZXZPYmplY3R8fHRoaXMuY29uc3RydWN0b3IobnVsbCl9LHB1c2g6Rixzb3J0OltdLnNvcnQsc3BsaWNlOltdLnNwbGljZX0sZS5mbi5pbml0LnByb3RvdHlwZT1lLmZuLGUuZXh0ZW5kPWUuZm4uZXh0ZW5kPWZ1bmN0aW9uKCl7dmFyIGEsYyxkLGYsZyxoLGk9YXJndW1lbnRzWzBdfHx7fSxqPTEsaz1hcmd1bWVudHMubGVuZ3RoLGw9ITE7dHlwZW9mIGk9PSJib29sZWFuIiYmKGw9aSxpPWFyZ3VtZW50c1sxXXx8e30saj0yKSx0eXBlb2YgaSE9Im9iamVjdCImJiFlLmlzRnVuY3Rpb24oaSkmJihpPXt9KSxrPT09aiYmKGk9dGhpcywtLWopO2Zvcig7ajxrO2orKylpZigoYT1hcmd1bWVudHNbal0pIT1udWxsKWZvcihjIGluIGEpe2Q9aVtjXSxmPWFbY107aWYoaT09PWYpY29udGludWU7bCYmZiYmKGUuaXNQbGFpbk9iamVjdChmKXx8KGc9ZS5pc0FycmF5KGYpKSk/KGc/KGc9ITEsaD1kJiZlLmlzQXJyYXkoZCk/ZDpbXSk6aD1kJiZlLmlzUGxhaW5PYmplY3QoZCk/ZDp7fSxpW2NdPWUuZXh0ZW5kKGwsaCxmKSk6ZiE9PWImJihpW2NdPWYpfXJldHVybiBpfSxlLmV4dGVuZCh7bm9Db25mbGljdDpmdW5jdGlvbihiKXthLiQ9PT1lJiYoYS4kPWcpLGImJmEualF1ZXJ5PT09ZSYmKGEualF1ZXJ5PWYpO3JldHVybiBlfSxpc1JlYWR5OiExLHJlYWR5V2FpdDoxLGhvbGRSZWFkeTpmdW5jdGlvbihhKXthP2UucmVhZHlXYWl0Kys6ZS5yZWFkeSghMCl9LHJlYWR5OmZ1bmN0aW9uKGEpe2lmKGE9PT0hMCYmIS0tZS5yZWFkeVdhaXR8fGEhPT0hMCYmIWUuaXNSZWFkeSl7aWYoIWMuYm9keSlyZXR1cm4gc2V0VGltZW91dChlLnJlYWR5LDEpO2UuaXNSZWFkeT0hMDtpZihhIT09ITAmJi0tZS5yZWFkeVdhaXQ+MClyZXR1cm47Qi5yZXNvbHZlV2l0aChjLFtlXSksZS5mbi50cmlnZ2VyJiZlKGMpLnRyaWdnZXIoInJlYWR5IikudW5iaW5kKCJyZWFkeSIpfX0sYmluZFJlYWR5OmZ1bmN0aW9uKCl7aWYoIUIpe0I9ZS5fRGVmZXJyZWQoKTtpZihjLnJlYWR5U3RhdGU9PT0iY29tcGxldGUiKXJldHVybiBzZXRUaW1lb3V0KGUucmVhZHksMSk7aWYoYy5hZGRFdmVudExpc3RlbmVyKWMuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsQywhMSksYS5hZGRFdmVudExpc3RlbmVyKCJsb2FkIixlLnJlYWR5LCExKTtlbHNlIGlmKGMuYXR0YWNoRXZlbnQpe2MuYXR0YWNoRXZlbnQoIm9ucmVhZHlzdGF0ZWNoYW5nZSIsQyksYS5hdHRhY2hFdmVudCgib25sb2FkIixlLnJlYWR5KTt2YXIgYj0hMTt0cnl7Yj1hLmZyYW1lRWxlbWVudD09bnVsbH1jYXRjaChkKXt9Yy5kb2N1bWVudEVsZW1lbnQuZG9TY3JvbGwmJmImJksoKX19fSxpc0Z1bmN0aW9uOmZ1bmN0aW9uKGEpe3JldHVybiBlLnR5cGUoYSk9PT0iZnVuY3Rpb24ifSxpc0FycmF5OkFycmF5LmlzQXJyYXl8fGZ1bmN0aW9uKGEpe3JldHVybiBlLnR5cGUoYSk9PT0iYXJyYXkifSxpc1dpbmRvdzpmdW5jdGlvbihhKXtyZXR1cm4gYSYmdHlwZW9mIGE9PSJvYmplY3QiJiYic2V0SW50ZXJ2YWwiaW4gYX0saXNOYU46ZnVuY3Rpb24oYSl7cmV0dXJuIGE9PW51bGx8fCFtLnRlc3QoYSl8fGlzTmFOKGEpfSx0eXBlOmZ1bmN0aW9uKGEpe3JldHVybiBhPT1udWxsP1N0cmluZyhhKTpKW0QuY2FsbChhKV18fCJvYmplY3QifSxpc1BsYWluT2JqZWN0OmZ1bmN0aW9uKGEpe2lmKCFhfHxlLnR5cGUoYSkhPT0ib2JqZWN0Inx8YS5ub2RlVHlwZXx8ZS5pc1dpbmRvdyhhKSlyZXR1cm4hMTt0cnl7aWYoYS5jb25zdHJ1Y3RvciYmIUUuY2FsbChhLCJjb25zdHJ1Y3RvciIpJiYhRS5jYWxsKGEuY29uc3RydWN0b3IucHJvdG90eXBlLCJpc1Byb3RvdHlwZU9mIikpcmV0dXJuITF9Y2F0Y2goYyl7cmV0dXJuITF9dmFyIGQ7Zm9yKGQgaW4gYSk7cmV0dXJuIGQ9PT1ifHxFLmNhbGwoYSxkKX0saXNFbXB0eU9iamVjdDpmdW5jdGlvbihhKXtmb3IodmFyIGIgaW4gYSlyZXR1cm4hMTtyZXR1cm4hMH0sZXJyb3I6ZnVuY3Rpb24oYSl7dGhyb3cgYX0scGFyc2VKU09OOmZ1bmN0aW9uKGIpe2lmKHR5cGVvZiBiIT0ic3RyaW5nInx8IWIpcmV0dXJuIG51bGw7Yj1lLnRyaW0oYik7aWYoYS5KU09OJiZhLkpTT04ucGFyc2UpcmV0dXJuIGEuSlNPTi5wYXJzZShiKTtpZihvLnRlc3QoYi5yZXBsYWNlKHAsIkAiKS5yZXBsYWNlKHEsIl0iKS5yZXBsYWNlKHIsIiIpKSlyZXR1cm4obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiKSkoKTtlLmVycm9yKCJJbnZhbGlkIEpTT046ICIrYil9LHBhcnNlWE1MOmZ1bmN0aW9uKGMpe3ZhciBkLGY7dHJ5e2EuRE9NUGFyc2VyPyhmPW5ldyBET01QYXJzZXIsZD1mLnBhcnNlRnJvbVN0cmluZyhjLCJ0ZXh0L3htbCIpKTooZD1uZXcgQWN0aXZlWE9iamVjdCgiTWljcm9zb2Z0LlhNTERPTSIpLGQuYXN5bmM9ImZhbHNlIixkLmxvYWRYTUwoYykpfWNhdGNoKGcpe2Q9Yn0oIWR8fCFkLmRvY3VtZW50RWxlbWVudHx8ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgicGFyc2VyZXJyb3IiKS5sZW5ndGgpJiZlLmVycm9yKCJJbnZhbGlkIFhNTDogIitjKTtyZXR1cm4gZH0sbm9vcDpmdW5jdGlvbigpe30sZ2xvYmFsRXZhbDpmdW5jdGlvbihiKXtiJiZqLnRlc3QoYikmJihhLmV4ZWNTY3JpcHR8fGZ1bmN0aW9uKGIpe2EuZXZhbC5jYWxsKGEsYil9KShiKX0sY2FtZWxDYXNlOmZ1bmN0aW9uKGEpe3JldHVybiBhLnJlcGxhY2UoeCwibXMtIikucmVwbGFjZSh3LHkpfSxub2RlTmFtZTpmdW5jdGlvbihhLGIpe3JldHVybiBhLm5vZGVOYW1lJiZhLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCk9PT1iLnRvVXBwZXJDYXNlKCl9LGVhY2g6ZnVuY3Rpb24oYSxjLGQpe3ZhciBmLGc9MCxoPWEubGVuZ3RoLGk9aD09PWJ8fGUuaXNGdW5jdGlvbihhKTtpZihkKXtpZihpKXtmb3IoZiBpbiBhKWlmKGMuYXBwbHkoYVtmXSxkKT09PSExKWJyZWFrfWVsc2UgZm9yKDtnPGg7KWlmKGMuYXBwbHkoYVtnKytdLGQpPT09ITEpYnJlYWt9ZWxzZSBpZihpKXtmb3IoZiBpbiBhKWlmKGMuY2FsbChhW2ZdLGYsYVtmXSk9PT0hMSlicmVha31lbHNlIGZvcig7ZzxoOylpZihjLmNhbGwoYVtnXSxnLGFbZysrXSk9PT0hMSlicmVhaztyZXR1cm4gYX0sdHJpbTpIP2Z1bmN0aW9uKGEpe3JldHVybiBhPT1udWxsPyIiOkguY2FsbChhKX06ZnVuY3Rpb24oYSl7cmV0dXJuIGE9PW51bGw/IiI6KGErIiIpLnJlcGxhY2UoaywiIikucmVwbGFjZShsLCIiKX0sbWFrZUFycmF5OmZ1bmN0aW9uKGEsYil7dmFyIGM9Ynx8W107aWYoYSE9bnVsbCl7dmFyIGQ9ZS50eXBlKGEpO2EubGVuZ3RoPT1udWxsfHxkPT09InN0cmluZyJ8fGQ9PT0iZnVuY3Rpb24ifHxkPT09InJlZ2V4cCJ8fGUuaXNXaW5kb3coYSk/Ri5jYWxsKGMsYSk6ZS5tZXJnZShjLGEpfXJldHVybiBjfSxpbkFycmF5OmZ1bmN0aW9uKGEsYil7aWYoIWIpcmV0dXJuLTE7aWYoSSlyZXR1cm4gSS5jYWxsKGIsYSk7Zm9yKHZhciBjPTAsZD1iLmxlbmd0aDtjPGQ7YysrKWlmKGJbY109PT1hKXJldHVybiBjO3JldHVybi0xfSxtZXJnZTpmdW5jdGlvbihhLGMpe3ZhciBkPWEubGVuZ3RoLGU9MDtpZih0eXBlb2YgYy5sZW5ndGg9PSJudW1iZXIiKWZvcih2YXIgZj1jLmxlbmd0aDtlPGY7ZSsrKWFbZCsrXT1jW2VdO2Vsc2Ugd2hpbGUoY1tlXSE9PWIpYVtkKytdPWNbZSsrXTthLmxlbmd0aD1kO3JldHVybiBhfSxncmVwOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD1bXSxlO2M9ISFjO2Zvcih2YXIgZj0wLGc9YS5sZW5ndGg7ZjxnO2YrKyllPSEhYihhW2ZdLGYpLGMhPT1lJiZkLnB1c2goYVtmXSk7cmV0dXJuIGR9LG1hcDpmdW5jdGlvbihhLGMsZCl7dmFyIGYsZyxoPVtdLGk9MCxqPWEubGVuZ3RoLGs9YSBpbnN0YW5jZW9mIGV8fGohPT1iJiZ0eXBlb2Ygaj09Im51bWJlciImJihqPjAmJmFbMF0mJmFbai0xXXx8aj09PTB8fGUuaXNBcnJheShhKSk7aWYoaylmb3IoO2k8ajtpKyspZj1jKGFbaV0saSxkKSxmIT1udWxsJiYoaFtoLmxlbmd0aF09Zik7ZWxzZSBmb3IoZyBpbiBhKWY9YyhhW2ddLGcsZCksZiE9bnVsbCYmKGhbaC5sZW5ndGhdPWYpO3JldHVybiBoLmNvbmNhdC5hcHBseShbXSxoKX0sZ3VpZDoxLHByb3h5OmZ1bmN0aW9uKGEsYyl7aWYodHlwZW9mIGM9PSJzdHJpbmciKXt2YXIgZD1hW2NdO2M9YSxhPWR9aWYoIWUuaXNGdW5jdGlvbihhKSlyZXR1cm4gYjt2YXIgZj1HLmNhbGwoYXJndW1lbnRzLDIpLGc9ZnVuY3Rpb24oKXtyZXR1cm4gYS5hcHBseShjLGYuY29uY2F0KEcuY2FsbChhcmd1bWVudHMpKSl9O2cuZ3VpZD1hLmd1aWQ9YS5ndWlkfHxnLmd1aWR8fGUuZ3VpZCsrO3JldHVybiBnfSxhY2Nlc3M6ZnVuY3Rpb24oYSxjLGQsZixnLGgpe3ZhciBpPWEubGVuZ3RoO2lmKHR5cGVvZiBjPT0ib2JqZWN0Iil7Zm9yKHZhciBqIGluIGMpZS5hY2Nlc3MoYSxqLGNbal0sZixnLGQpO3JldHVybiBhfWlmKGQhPT1iKXtmPSFoJiZmJiZlLmlzRnVuY3Rpb24oZCk7Zm9yKHZhciBrPTA7azxpO2srKylnKGFba10sYyxmP2QuY2FsbChhW2tdLGssZyhhW2tdLGMpKTpkLGgpO3JldHVybiBhfXJldHVybiBpP2coYVswXSxjKTpifSxub3c6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IERhdGUpLmdldFRpbWUoKX0sdWFNYXRjaDpmdW5jdGlvbihhKXthPWEudG9Mb3dlckNhc2UoKTt2YXIgYj1zLmV4ZWMoYSl8fHQuZXhlYyhhKXx8dS5leGVjKGEpfHxhLmluZGV4T2YoImNvbXBhdGlibGUiKTwwJiZ2LmV4ZWMoYSl8fFtdO3JldHVybnticm93c2VyOmJbMV18fCIiLHZlcnNpb246YlsyXXx8IjAifX0sc3ViOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShiLGMpe3JldHVybiBuZXcgYS5mbi5pbml0KGIsYyl9ZS5leHRlbmQoITAsYSx0aGlzKSxhLnN1cGVyY2xhc3M9dGhpcyxhLmZuPWEucHJvdG90eXBlPXRoaXMoKSxhLmZuLmNvbnN0cnVjdG9yPWEsYS5zdWI9dGhpcy5zdWIsYS5mbi5pbml0PWZ1bmN0aW9uKGQsZil7ZiYmZiBpbnN0YW5jZW9mIGUmJiEoZiBpbnN0YW5jZW9mIGEpJiYoZj1hKGYpKTtyZXR1cm4gZS5mbi5pbml0LmNhbGwodGhpcyxkLGYsYil9LGEuZm4uaW5pdC5wcm90b3R5cGU9YS5mbjt2YXIgYj1hKGMpO3JldHVybiBhfSxicm93c2VyOnt9fSksZS5lYWNoKCJCb29sZWFuIE51bWJlciBTdHJpbmcgRnVuY3Rpb24gQXJyYXkgRGF0ZSBSZWdFeHAgT2JqZWN0Ii5zcGxpdCgiICIpLGZ1bmN0aW9uKGEsYil7SlsiW29iamVjdCAiK2IrIl0iXT1iLnRvTG93ZXJDYXNlKCl9KSxBPWUudWFNYXRjaCh6KSxBLmJyb3dzZXImJihlLmJyb3dzZXJbQS5icm93c2VyXT0hMCxlLmJyb3dzZXIudmVyc2lvbj1BLnZlcnNpb24pLGUuYnJvd3Nlci53ZWJraXQmJihlLmJyb3dzZXIuc2FmYXJpPSEwKSxqLnRlc3QoIsKgIikmJihrPS9eW1xzXHhBMF0rLyxsPS9bXHNceEEwXSskLyksaD1lKGMpLGMuYWRkRXZlbnRMaXN0ZW5lcj9DPWZ1bmN0aW9uKCl7Yy5yZW1vdmVFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIixDLCExKSxlLnJlYWR5KCl9OmMuYXR0YWNoRXZlbnQmJihDPWZ1bmN0aW9uKCl7Yy5yZWFkeVN0YXRlPT09ImNvbXBsZXRlIiYmKGMuZGV0YWNoRXZlbnQoIm9ucmVhZHlzdGF0ZWNoYW5nZSIsQyksZS5yZWFkeSgpKX0pO3JldHVybiBlfSgpLGc9ImRvbmUgZmFpbCBpc1Jlc29sdmVkIGlzUmVqZWN0ZWQgcHJvbWlzZSB0aGVuIGFsd2F5cyBwaXBlIi5zcGxpdCgiICIpLGg9W10uc2xpY2U7Zi5leHRlbmQoe19EZWZlcnJlZDpmdW5jdGlvbigpe3ZhciBhPVtdLGIsYyxkLGU9e2RvbmU6ZnVuY3Rpb24oKXtpZighZCl7dmFyIGM9YXJndW1lbnRzLGcsaCxpLGosaztiJiYoaz1iLGI9MCk7Zm9yKGc9MCxoPWMubGVuZ3RoO2c8aDtnKyspaT1jW2ddLGo9Zi50eXBlKGkpLGo9PT0iYXJyYXkiP2UuZG9uZS5hcHBseShlLGkpOmo9PT0iZnVuY3Rpb24iJiZhLnB1c2goaSk7ayYmZS5yZXNvbHZlV2l0aChrWzBdLGtbMV0pfXJldHVybiB0aGlzfSxyZXNvbHZlV2l0aDpmdW5jdGlvbihlLGYpe2lmKCFkJiYhYiYmIWMpe2Y9Znx8W10sYz0xO3RyeXt3aGlsZShhWzBdKWEuc2hpZnQoKS5hcHBseShlLGYpfWZpbmFsbHl7Yj1bZSxmXSxjPTB9fXJldHVybiB0aGlzfSxyZXNvbHZlOmZ1bmN0aW9uKCl7ZS5yZXNvbHZlV2l0aCh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIHRoaXN9LGlzUmVzb2x2ZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hIWN8fCEhYn0sY2FuY2VsOmZ1bmN0aW9uKCl7ZD0xLGE9W107cmV0dXJuIHRoaXN9fTtyZXR1cm4gZX0sRGVmZXJyZWQ6ZnVuY3Rpb24oYSl7dmFyIGI9Zi5fRGVmZXJyZWQoKSxjPWYuX0RlZmVycmVkKCksZDtmLmV4dGVuZChiLHt0aGVuOmZ1bmN0aW9uKGEsYyl7Yi5kb25lKGEpLmZhaWwoYyk7cmV0dXJuIHRoaXN9LGFsd2F5czpmdW5jdGlvbigpe3JldHVybiBiLmRvbmUuYXBwbHkoYixhcmd1bWVudHMpLmZhaWwuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxmYWlsOmMuZG9uZSxyZWplY3RXaXRoOmMucmVzb2x2ZVdpdGgscmVqZWN0OmMucmVzb2x2ZSxpc1JlamVjdGVkOmMuaXNSZXNvbHZlZCxwaXBlOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIGYuRGVmZXJyZWQoZnVuY3Rpb24oZCl7Zi5lYWNoKHtkb25lOlthLCJyZXNvbHZlIl0sZmFpbDpbYywicmVqZWN0Il19LGZ1bmN0aW9uKGEsYyl7dmFyIGU9Y1swXSxnPWNbMV0saDtmLmlzRnVuY3Rpb24oZSk/YlthXShmdW5jdGlvbigpe2g9ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyksaCYmZi5pc0Z1bmN0aW9uKGgucHJvbWlzZSk/aC5wcm9taXNlKCkudGhlbihkLnJlc29sdmUsZC5yZWplY3QpOmRbZysiV2l0aCJdKHRoaXM9PT1iP2Q6dGhpcyxbaF0pfSk6YlthXShkW2ddKX0pfSkucHJvbWlzZSgpfSxwcm9taXNlOmZ1bmN0aW9uKGEpe2lmKGE9PW51bGwpe2lmKGQpcmV0dXJuIGQ7ZD1hPXt9fXZhciBjPWcubGVuZ3RoO3doaWxlKGMtLSlhW2dbY11dPWJbZ1tjXV07cmV0dXJuIGF9fSksYi5kb25lKGMuY2FuY2VsKS5mYWlsKGIuY2FuY2VsKSxkZWxldGUgYi5jYW5jZWwsYSYmYS5jYWxsKGIsYik7cmV0dXJuIGJ9LHdoZW46ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gaShhKXtyZXR1cm4gZnVuY3Rpb24oYyl7YlthXT1hcmd1bWVudHMubGVuZ3RoPjE/aC5jYWxsKGFyZ3VtZW50cywwKTpjLC0tZXx8Zy5yZXNvbHZlV2l0aChnLGguY2FsbChiLDApKX19dmFyIGI9YXJndW1lbnRzLGM9MCxkPWIubGVuZ3RoLGU9ZCxnPWQ8PTEmJmEmJmYuaXNGdW5jdGlvbihhLnByb21pc2UpP2E6Zi5EZWZlcnJlZCgpO2lmKGQ+MSl7Zm9yKDtjPGQ7YysrKWJbY10mJmYuaXNGdW5jdGlvbihiW2NdLnByb21pc2UpP2JbY10ucHJvbWlzZSgpLnRoZW4oaShjKSxnLnJlamVjdCk6LS1lO2V8fGcucmVzb2x2ZVdpdGgoZyxiKX1lbHNlIGchPT1hJiZnLnJlc29sdmVXaXRoKGcsZD9bYV06W10pO3JldHVybiBnLnByb21pc2UoKX19KSxmLnN1cHBvcnQ9ZnVuY3Rpb24oKXt2YXIgYT1jLmNyZWF0ZUVsZW1lbnQoImRpdiIpLGI9Yy5kb2N1bWVudEVsZW1lbnQsZCxlLGcsaCxpLGosayxsLG0sbixvLHAscSxyLHMsdCx1O2Euc2V0QXR0cmlidXRlKCJjbGFzc05hbWUiLCJ0IiksYS5pbm5lckhUTUw9IiAgIDxsaW5rLz48dGFibGU+PC90YWJsZT48YSBocmVmPScvYScgc3R5bGU9J3RvcDoxcHg7ZmxvYXQ6bGVmdDtvcGFjaXR5Oi41NTsnPmE8L2E+PGlucHV0IHR5cGU9J2NoZWNrYm94Jy8+IixkPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKSxlPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImEiKVswXTtpZighZHx8IWQubGVuZ3RofHwhZSlyZXR1cm57fTtnPWMuY3JlYXRlRWxlbWVudCgic2VsZWN0IiksaD1nLmFwcGVuZENoaWxkKGMuY3JlYXRlRWxlbWVudCgib3B0aW9uIikpLGk9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaW5wdXQiKVswXSxrPXtsZWFkaW5nV2hpdGVzcGFjZTphLmZpcnN0Q2hpbGQubm9kZVR5cGU9PT0zLHRib2R5OiFhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0Ym9keSIpLmxlbmd0aCxodG1sU2VyaWFsaXplOiEhYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgibGluayIpLmxlbmd0aCxzdHlsZTovdG9wLy50ZXN0KGUuZ2V0QXR0cmlidXRlKCJzdHlsZSIpKSxocmVmTm9ybWFsaXplZDplLmdldEF0dHJpYnV0ZSgiaHJlZiIpPT09Ii9hIixvcGFjaXR5Oi9eMC41NSQvLnRlc3QoZS5zdHlsZS5vcGFjaXR5KSxjc3NGbG9hdDohIWUuc3R5bGUuY3NzRmxvYXQsY2hlY2tPbjppLnZhbHVlPT09Im9uIixvcHRTZWxlY3RlZDpoLnNlbGVjdGVkLGdldFNldEF0dHJpYnV0ZTphLmNsYXNzTmFtZSE9PSJ0IixzdWJtaXRCdWJibGVzOiEwLGNoYW5nZUJ1YmJsZXM6ITAsZm9jdXNpbkJ1YmJsZXM6ITEsZGVsZXRlRXhwYW5kbzohMCxub0Nsb25lRXZlbnQ6ITAsaW5saW5lQmxvY2tOZWVkc0xheW91dDohMSxzaHJpbmtXcmFwQmxvY2tzOiExLHJlbGlhYmxlTWFyZ2luUmlnaHQ6ITB9LGkuY2hlY2tlZD0hMCxrLm5vQ2xvbmVDaGVja2VkPWkuY2xvbmVOb2RlKCEwKS5jaGVja2VkLGcuZGlzYWJsZWQ9ITAsay5vcHREaXNhYmxlZD0haC5kaXNhYmxlZDt0cnl7ZGVsZXRlIGEudGVzdH1jYXRjaCh2KXtrLmRlbGV0ZUV4cGFuZG89ITF9IWEuYWRkRXZlbnRMaXN0ZW5lciYmYS5hdHRhY2hFdmVudCYmYS5maXJlRXZlbnQmJihhLmF0dGFjaEV2ZW50KCJvbmNsaWNrIixmdW5jdGlvbigpe2subm9DbG9uZUV2ZW50PSExfSksYS5jbG9uZU5vZGUoITApLmZpcmVFdmVudCgib25jbGljayIpKSxpPWMuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSxpLnZhbHVlPSJ0IixpLnNldEF0dHJpYnV0ZSgidHlwZSIsInJhZGlvIiksay5yYWRpb1ZhbHVlPWkudmFsdWU9PT0idCIsaS5zZXRBdHRyaWJ1dGUoImNoZWNrZWQiLCJjaGVja2VkIiksYS5hcHBlbmRDaGlsZChpKSxsPWMuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLGwuYXBwZW5kQ2hpbGQoYS5maXJzdENoaWxkKSxrLmNoZWNrQ2xvbmU9bC5jbG9uZU5vZGUoITApLmNsb25lTm9kZSghMCkubGFzdENoaWxkLmNoZWNrZWQsYS5pbm5lckhUTUw9IiIsYS5zdHlsZS53aWR0aD1hLnN0eWxlLnBhZGRpbmdMZWZ0PSIxcHgiLG09Yy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYm9keSIpWzBdLG89Yy5jcmVhdGVFbGVtZW50KG0/ImRpdiI6ImJvZHkiKSxwPXt2aXNpYmlsaXR5OiJoaWRkZW4iLHdpZHRoOjAsaGVpZ2h0OjAsYm9yZGVyOjAsbWFyZ2luOjAsYmFja2dyb3VuZDoibm9uZSJ9LG0mJmYuZXh0ZW5kKHAse3Bvc2l0aW9uOiJhYnNvbHV0ZSIsbGVmdDoiLTEwMDBweCIsdG9wOiItMTAwMHB4In0pO2Zvcih0IGluIHApby5zdHlsZVt0XT1wW3RdO28uYXBwZW5kQ2hpbGQoYSksbj1tfHxiLG4uaW5zZXJ0QmVmb3JlKG8sbi5maXJzdENoaWxkKSxrLmFwcGVuZENoZWNrZWQ9aS5jaGVja2VkLGsuYm94TW9kZWw9YS5vZmZzZXRXaWR0aD09PTIsInpvb20iaW4gYS5zdHlsZSYmKGEuc3R5bGUuZGlzcGxheT0iaW5saW5lIixhLnN0eWxlLnpvb209MSxrLmlubGluZUJsb2NrTmVlZHNMYXlvdXQ9YS5vZmZzZXRXaWR0aD09PTIsYS5zdHlsZS5kaXNwbGF5PSIiLGEuaW5uZXJIVE1MPSI8ZGl2IHN0eWxlPSd3aWR0aDo0cHg7Jz48L2Rpdj4iLGsuc2hyaW5rV3JhcEJsb2Nrcz1hLm9mZnNldFdpZHRoIT09MiksYS5pbm5lckhUTUw9Ijx0YWJsZT48dHI+PHRkIHN0eWxlPSdwYWRkaW5nOjA7Ym9yZGVyOjA7ZGlzcGxheTpub25lJz48L3RkPjx0ZD50PC90ZD48L3RyPjwvdGFibGU+IixxPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRkIiksdT1xWzBdLm9mZnNldEhlaWdodD09PTAscVswXS5zdHlsZS5kaXNwbGF5PSIiLHFbMV0uc3R5bGUuZGlzcGxheT0ibm9uZSIsay5yZWxpYWJsZUhpZGRlbk9mZnNldHM9dSYmcVswXS5vZmZzZXRIZWlnaHQ9PT0wLGEuaW5uZXJIVE1MPSIiLGMuZGVmYXVsdFZpZXcmJmMuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSYmKGo9Yy5jcmVhdGVFbGVtZW50KCJkaXYiKSxqLnN0eWxlLndpZHRoPSIwIixqLnN0eWxlLm1hcmdpblJpZ2h0PSIwIixhLmFwcGVuZENoaWxkKGopLGsucmVsaWFibGVNYXJnaW5SaWdodD0ocGFyc2VJbnQoKGMuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShqLG51bGwpfHx7bWFyZ2luUmlnaHQ6MH0pLm1hcmdpblJpZ2h0LDEwKXx8MCk9PT0wKSxvLmlubmVySFRNTD0iIixuLnJlbW92ZUNoaWxkKG8pO2lmKGEuYXR0YWNoRXZlbnQpZm9yKHQgaW57c3VibWl0OjEsY2hhbmdlOjEsZm9jdXNpbjoxfSlzPSJvbiIrdCx1PXMgaW4gYSx1fHwoYS5zZXRBdHRyaWJ1dGUocywicmV0dXJuOyIpLHU9dHlwZW9mIGFbc109PSJmdW5jdGlvbiIpLGtbdCsiQnViYmxlcyJdPXU7bz1sPWc9aD1tPWo9YT1pPW51bGw7cmV0dXJuIGt9KCksZi5ib3hNb2RlbD1mLnN1cHBvcnQuYm94TW9kZWw7dmFyIGk9L14oPzpcey4qXH18XFsuKlxdKSQvLGo9LyhbQS1aXSkvZztmLmV4dGVuZCh7Y2FjaGU6e30sdXVpZDowLGV4cGFuZG86ImpRdWVyeSIrKGYuZm4uanF1ZXJ5K01hdGgucmFuZG9tKCkpLnJlcGxhY2UoL1xEL2csIiIpLG5vRGF0YTp7ZW1iZWQ6ITAsb2JqZWN0OiJjbHNpZDpEMjdDREI2RS1BRTZELTExY2YtOTZCOC00NDQ1NTM1NDAwMDAiLGFwcGxldDohMH0saGFzRGF0YTpmdW5jdGlvbihhKXthPWEubm9kZVR5cGU/Zi5jYWNoZVthW2YuZXhwYW5kb11dOmFbZi5leHBhbmRvXTtyZXR1cm4hIWEmJiFsKGEpfSxkYXRhOmZ1bmN0aW9uKGEsYyxkLGUpe2lmKCEhZi5hY2NlcHREYXRhKGEpKXt2YXIgZyxoLGk9Zi5leHBhbmRvLGo9dHlwZW9mIGM9PSJzdHJpbmciLGs9YS5ub2RlVHlwZSxsPWs/Zi5jYWNoZTphLG09az9hW2YuZXhwYW5kb106YVtmLmV4cGFuZG9dJiZmLmV4cGFuZG87aWYoKCFtfHxlJiZtJiZsW21dJiYhbFttXVtpXSkmJmomJmQ9PT1iKXJldHVybjttfHwoaz9hW2YuZXhwYW5kb109bT0rK2YudXVpZDptPWYuZXhwYW5kbyksbFttXXx8KGxbbV09e30sa3x8KGxbbV0udG9KU09OPWYubm9vcCkpO2lmKHR5cGVvZiBjPT0ib2JqZWN0Inx8dHlwZW9mIGM9PSJmdW5jdGlvbiIpZT9sW21dW2ldPWYuZXh0ZW5kKGxbbV1baV0sYyk6bFttXT1mLmV4dGVuZChsW21dLGMpO2c9bFttXSxlJiYoZ1tpXXx8KGdbaV09e30pLGc9Z1tpXSksZCE9PWImJihnW2YuY2FtZWxDYXNlKGMpXT1kKTtpZihjPT09ImV2ZW50cyImJiFnW2NdKXJldHVybiBnW2ldJiZnW2ldLmV2ZW50cztqPyhoPWdbY10saD09bnVsbCYmKGg9Z1tmLmNhbWVsQ2FzZShjKV0pKTpoPWc7cmV0dXJuIGh9fSxyZW1vdmVEYXRhOmZ1bmN0aW9uKGEsYixjKXtpZighIWYuYWNjZXB0RGF0YShhKSl7dmFyIGQsZT1mLmV4cGFuZG8sZz1hLm5vZGVUeXBlLGg9Zz9mLmNhY2hlOmEsaT1nP2FbZi5leHBhbmRvXTpmLmV4cGFuZG87aWYoIWhbaV0pcmV0dXJuO2lmKGIpe2Q9Yz9oW2ldW2VdOmhbaV07aWYoZCl7ZFtiXXx8KGI9Zi5jYW1lbENhc2UoYikpLGRlbGV0ZSBkW2JdO2lmKCFsKGQpKXJldHVybn19aWYoYyl7ZGVsZXRlIGhbaV1bZV07aWYoIWwoaFtpXSkpcmV0dXJufXZhciBqPWhbaV1bZV07Zi5zdXBwb3J0LmRlbGV0ZUV4cGFuZG98fCFoLnNldEludGVydmFsP2RlbGV0ZSBoW2ldOmhbaV09bnVsbCxqPyhoW2ldPXt9LGd8fChoW2ldLnRvSlNPTj1mLm5vb3ApLGhbaV1bZV09aik6ZyYmKGYuc3VwcG9ydC5kZWxldGVFeHBhbmRvP2RlbGV0ZSBhW2YuZXhwYW5kb106YS5yZW1vdmVBdHRyaWJ1dGU/YS5yZW1vdmVBdHRyaWJ1dGUoZi5leHBhbmRvKTphW2YuZXhwYW5kb109bnVsbCl9fSxfZGF0YTpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGYuZGF0YShhLGIsYywhMCl9LGFjY2VwdERhdGE6ZnVuY3Rpb24oYSl7aWYoYS5ub2RlTmFtZSl7dmFyIGI9Zi5ub0RhdGFbYS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXTtpZihiKXJldHVybiBiIT09ITAmJmEuZ2V0QXR0cmlidXRlKCJjbGFzc2lkIik9PT1ifXJldHVybiEwfX0pLGYuZm4uZXh0ZW5kKHtkYXRhOmZ1bmN0aW9uKGEsYyl7dmFyIGQ9bnVsbDtpZih0eXBlb2YgYT09InVuZGVmaW5lZCIpe2lmKHRoaXMubGVuZ3RoKXtkPWYuZGF0YSh0aGlzWzBdKTtpZih0aGlzWzBdLm5vZGVUeXBlPT09MSl7dmFyIGU9dGhpc1swXS5hdHRyaWJ1dGVzLGc7Zm9yKHZhciBoPTAsaT1lLmxlbmd0aDtoPGk7aCsrKWc9ZVtoXS5uYW1lLGcuaW5kZXhPZigiZGF0YS0iKT09PTAmJihnPWYuY2FtZWxDYXNlKGcuc3Vic3RyaW5nKDUpKSxrKHRoaXNbMF0sZyxkW2ddKSl9fXJldHVybiBkfWlmKHR5cGVvZiBhPT0ib2JqZWN0IilyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Zi5kYXRhKHRoaXMsYSl9KTt2YXIgaj1hLnNwbGl0KCIuIik7alsxXT1qWzFdPyIuIitqWzFdOiIiO2lmKGM9PT1iKXtkPXRoaXMudHJpZ2dlckhhbmRsZXIoImdldERhdGEiK2pbMV0rIiEiLFtqWzBdXSksZD09PWImJnRoaXMubGVuZ3RoJiYoZD1mLmRhdGEodGhpc1swXSxhKSxkPWsodGhpc1swXSxhLGQpKTtyZXR1cm4gZD09PWImJmpbMV0/dGhpcy5kYXRhKGpbMF0pOmR9cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBiPWYodGhpcyksZD1balswXSxjXTtiLnRyaWdnZXJIYW5kbGVyKCJzZXREYXRhIitqWzFdKyIhIixkKSxmLmRhdGEodGhpcyxhLGMpLGIudHJpZ2dlckhhbmRsZXIoImNoYW5nZURhdGEiK2pbMV0rIiEiLGQpfSl9LHJlbW92ZURhdGE6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2YucmVtb3ZlRGF0YSh0aGlzLGEpfSl9fSksZi5leHRlbmQoe19tYXJrOmZ1bmN0aW9uKGEsYyl7YSYmKGM9KGN8fCJmeCIpKyJtYXJrIixmLmRhdGEoYSxjLChmLmRhdGEoYSxjLGIsITApfHwwKSsxLCEwKSl9LF91bm1hcms6ZnVuY3Rpb24oYSxjLGQpe2EhPT0hMCYmKGQ9YyxjPWEsYT0hMSk7aWYoYyl7ZD1kfHwiZngiO3ZhciBlPWQrIm1hcmsiLGc9YT8wOihmLmRhdGEoYyxlLGIsITApfHwxKS0xO2c/Zi5kYXRhKGMsZSxnLCEwKTooZi5yZW1vdmVEYXRhKGMsZSwhMCksbShjLGQsIm1hcmsiKSl9fSxxdWV1ZTpmdW5jdGlvbihhLGMsZCl7aWYoYSl7Yz0oY3x8ImZ4IikrInF1ZXVlIjt2YXIgZT1mLmRhdGEoYSxjLGIsITApO2QmJighZXx8Zi5pc0FycmF5KGQpP2U9Zi5kYXRhKGEsYyxmLm1ha2VBcnJheShkKSwhMCk6ZS5wdXNoKGQpKTtyZXR1cm4gZXx8W119fSxkZXF1ZXVlOmZ1bmN0aW9uKGEsYil7Yj1ifHwiZngiO3ZhciBjPWYucXVldWUoYSxiKSxkPWMuc2hpZnQoKSxlO2Q9PT0iaW5wcm9ncmVzcyImJihkPWMuc2hpZnQoKSksZCYmKGI9PT0iZngiJiZjLnVuc2hpZnQoImlucHJvZ3Jlc3MiKSxkLmNhbGwoYSxmdW5jdGlvbigpe2YuZGVxdWV1ZShhLGIpfSkpLGMubGVuZ3RofHwoZi5yZW1vdmVEYXRhKGEsYisicXVldWUiLCEwKSxtKGEsYiwicXVldWUiKSl9fSksZi5mbi5leHRlbmQoe3F1ZXVlOmZ1bmN0aW9uKGEsYyl7dHlwZW9mIGEhPSJzdHJpbmciJiYoYz1hLGE9ImZ4Iik7aWYoYz09PWIpcmV0dXJuIGYucXVldWUodGhpc1swXSxhKTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGI9Zi5xdWV1ZSh0aGlzLGEsYyk7YT09PSJmeCImJmJbMF0hPT0iaW5wcm9ncmVzcyImJmYuZGVxdWV1ZSh0aGlzLGEpfSl9LGRlcXVldWU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2YuZGVxdWV1ZSh0aGlzLGEpfSl9LGRlbGF5OmZ1bmN0aW9uKGEsYil7YT1mLmZ4P2YuZnguc3BlZWRzW2FdfHxhOmEsYj1ifHwiZngiO3JldHVybiB0aGlzLnF1ZXVlKGIsZnVuY3Rpb24oKXt2YXIgYz10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtmLmRlcXVldWUoYyxiKX0sYSl9KX0sY2xlYXJRdWV1ZTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5xdWV1ZShhfHwiZngiLFtdKX0scHJvbWlzZTpmdW5jdGlvbihhLGMpe2Z1bmN0aW9uIG0oKXstLWh8fGQucmVzb2x2ZVdpdGgoZSxbZV0pfXR5cGVvZiBhIT0ic3RyaW5nIiYmKGM9YSxhPWIpLGE9YXx8ImZ4Ijt2YXIgZD1mLkRlZmVycmVkKCksZT10aGlzLGc9ZS5sZW5ndGgsaD0xLGk9YSsiZGVmZXIiLGo9YSsicXVldWUiLGs9YSsibWFyayIsbDt3aGlsZShnLS0paWYobD1mLmRhdGEoZVtnXSxpLGIsITApfHwoZi5kYXRhKGVbZ10saixiLCEwKXx8Zi5kYXRhKGVbZ10sayxiLCEwKSkmJmYuZGF0YShlW2ddLGksZi5fRGVmZXJyZWQoKSwhMCkpaCsrLGwuZG9uZShtKTttKCk7cmV0dXJuIGQucHJvbWlzZSgpfX0pO3ZhciBuPS9bXG5cdFxyXS9nLG89L1xzKy8scD0vXHIvZyxxPS9eKD86YnV0dG9ufGlucHV0KSQvaSxyPS9eKD86YnV0dG9ufGlucHV0fG9iamVjdHxzZWxlY3R8dGV4dGFyZWEpJC9pLHM9L15hKD86cmVhKT8kL2ksdD0vXig/OmF1dG9mb2N1c3xhdXRvcGxheXxhc3luY3xjaGVja2VkfGNvbnRyb2xzfGRlZmVyfGRpc2FibGVkfGhpZGRlbnxsb29wfG11bHRpcGxlfG9wZW58cmVhZG9ubHl8cmVxdWlyZWR8c2NvcGVkfHNlbGVjdGVkKSQvaSx1LHY7Zi5mbi5leHRlbmQoe2F0dHI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZi5hY2Nlc3ModGhpcyxhLGIsITAsZi5hdHRyKX0scmVtb3ZlQXR0cjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Zi5yZW1vdmVBdHRyKHRoaXMsYSl9KX0scHJvcDpmdW5jdGlvbihhLGIpe3JldHVybiBmLmFjY2Vzcyh0aGlzLGEsYiwhMCxmLnByb3ApfSxyZW1vdmVQcm9wOmZ1bmN0aW9uKGEpe2E9Zi5wcm9wRml4W2FdfHxhO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt0cnl7dGhpc1thXT1iLGRlbGV0ZSB0aGlzW2FdfWNhdGNoKGMpe319KX0sYWRkQ2xhc3M6ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGUsZyxoLGk7aWYoZi5pc0Z1bmN0aW9uKGEpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYil7Zih0aGlzKS5hZGRDbGFzcyhhLmNhbGwodGhpcyxiLHRoaXMuY2xhc3NOYW1lKSl9KTtpZihhJiZ0eXBlb2YgYT09InN0cmluZyIpe2I9YS5zcGxpdChvKTtmb3IoYz0wLGQ9dGhpcy5sZW5ndGg7YzxkO2MrKyl7ZT10aGlzW2NdO2lmKGUubm9kZVR5cGU9PT0xKWlmKCFlLmNsYXNzTmFtZSYmYi5sZW5ndGg9PT0xKWUuY2xhc3NOYW1lPWE7ZWxzZXtnPSIgIitlLmNsYXNzTmFtZSsiICI7Zm9yKGg9MCxpPWIubGVuZ3RoO2g8aTtoKyspfmcuaW5kZXhPZigiICIrYltoXSsiICIpfHwoZys9YltoXSsiICIpO2UuY2xhc3NOYW1lPWYudHJpbShnKX19fXJldHVybiB0aGlzfSxyZW1vdmVDbGFzczpmdW5jdGlvbihhKXt2YXIgYyxkLGUsZyxoLGksajtpZihmLmlzRnVuY3Rpb24oYSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihiKXtmKHRoaXMpLnJlbW92ZUNsYXNzKGEuY2FsbCh0aGlzLGIsdGhpcy5jbGFzc05hbWUpKX0pO2lmKGEmJnR5cGVvZiBhPT0ic3RyaW5nInx8YT09PWIpe2M9KGF8fCIiKS5zcGxpdChvKTtmb3IoZD0wLGU9dGhpcy5sZW5ndGg7ZDxlO2QrKyl7Zz10aGlzW2RdO2lmKGcubm9kZVR5cGU9PT0xJiZnLmNsYXNzTmFtZSlpZihhKXtoPSgiICIrZy5jbGFzc05hbWUrIiAiKS5yZXBsYWNlKG4sIiAiKTtmb3IoaT0wLGo9Yy5sZW5ndGg7aTxqO2krKyloPWgucmVwbGFjZSgiICIrY1tpXSsiICIsIiAiKTtnLmNsYXNzTmFtZT1mLnRyaW0oaCl9ZWxzZSBnLmNsYXNzTmFtZT0iIn19cmV0dXJuIHRoaXN9LHRvZ2dsZUNsYXNzOmZ1bmN0aW9uKGEsYil7dmFyIGM9dHlwZW9mIGEsZD10eXBlb2YgYj09ImJvb2xlYW4iO2lmKGYuaXNGdW5jdGlvbihhKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGMpe2YodGhpcykudG9nZ2xlQ2xhc3MoYS5jYWxsKHRoaXMsYyx0aGlzLmNsYXNzTmFtZSxiKSxiKX0pO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtpZihjPT09InN0cmluZyIpe3ZhciBlLGc9MCxoPWYodGhpcyksaT1iLGo9YS5zcGxpdChvKTt3aGlsZShlPWpbZysrXSlpPWQ/aTohaC5oYXNDbGFzcyhlKSxoW2k/ImFkZENsYXNzIjoicmVtb3ZlQ2xhc3MiXShlKX1lbHNlIGlmKGM9PT0idW5kZWZpbmVkInx8Yz09PSJib29sZWFuIil0aGlzLmNsYXNzTmFtZSYmZi5fZGF0YSh0aGlzLCJfX2NsYXNzTmFtZV9fIix0aGlzLmNsYXNzTmFtZSksdGhpcy5jbGFzc05hbWU9dGhpcy5jbGFzc05hbWV8fGE9PT0hMT8iIjpmLl9kYXRhKHRoaXMsIl9fY2xhc3NOYW1lX18iKXx8IiJ9KX0saGFzQ2xhc3M6ZnVuY3Rpb24oYSl7dmFyIGI9IiAiK2ErIiAiO2Zvcih2YXIgYz0wLGQ9dGhpcy5sZW5ndGg7YzxkO2MrKylpZih0aGlzW2NdLm5vZGVUeXBlPT09MSYmKCIgIit0aGlzW2NdLmNsYXNzTmFtZSsiICIpLnJlcGxhY2UobiwiICIpLmluZGV4T2YoYik+LTEpcmV0dXJuITA7cmV0dXJuITF9LHZhbDpmdW5jdGlvbihhKXt2YXIgYyxkLGU9dGhpc1swXTtpZighYXJndW1lbnRzLmxlbmd0aCl7aWYoZSl7Yz1mLnZhbEhvb2tzW2Uubm9kZU5hbWUudG9Mb3dlckNhc2UoKV18fGYudmFsSG9va3NbZS50eXBlXTtpZihjJiYiZ2V0ImluIGMmJihkPWMuZ2V0KGUsInZhbHVlIikpIT09YilyZXR1cm4gZDtkPWUudmFsdWU7cmV0dXJuIHR5cGVvZiBkPT0ic3RyaW5nIj9kLnJlcGxhY2UocCwiIik6ZD09bnVsbD8iIjpkfXJldHVybiBifXZhciBnPWYuaXNGdW5jdGlvbihhKTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGQpe3ZhciBlPWYodGhpcyksaDtpZih0aGlzLm5vZGVUeXBlPT09MSl7Zz9oPWEuY2FsbCh0aGlzLGQsZS52YWwoKSk6aD1hLGg9PW51bGw/aD0iIjp0eXBlb2YgaD09Im51bWJlciI/aCs9IiI6Zi5pc0FycmF5KGgpJiYoaD1mLm1hcChoLGZ1bmN0aW9uKGEpe3JldHVybiBhPT1udWxsPyIiOmErIiJ9KSksYz1mLnZhbEhvb2tzW3RoaXMubm9kZU5hbWUudG9Mb3dlckNhc2UoKV18fGYudmFsSG9va3NbdGhpcy50eXBlXTtpZighY3x8ISgic2V0ImluIGMpfHxjLnNldCh0aGlzLGgsInZhbHVlIik9PT1iKXRoaXMudmFsdWU9aH19KX19KSxmLmV4dGVuZCh7dmFsSG9va3M6e29wdGlvbjp7Z2V0OmZ1bmN0aW9uKGEpe3ZhciBiPWEuYXR0cmlidXRlcy52YWx1ZTtyZXR1cm4hYnx8Yi5zcGVjaWZpZWQ/YS52YWx1ZTphLnRleHR9fSxzZWxlY3Q6e2dldDpmdW5jdGlvbihhKXt2YXIgYixjPWEuc2VsZWN0ZWRJbmRleCxkPVtdLGU9YS5vcHRpb25zLGc9YS50eXBlPT09InNlbGVjdC1vbmUiO2lmKGM8MClyZXR1cm4gbnVsbDtmb3IodmFyIGg9Zz9jOjAsaT1nP2MrMTplLmxlbmd0aDtoPGk7aCsrKXt2YXIgaj1lW2hdO2lmKGouc2VsZWN0ZWQmJihmLnN1cHBvcnQub3B0RGlzYWJsZWQ/IWouZGlzYWJsZWQ6ai5nZXRBdHRyaWJ1dGUoImRpc2FibGVkIik9PT1udWxsKSYmKCFqLnBhcmVudE5vZGUuZGlzYWJsZWR8fCFmLm5vZGVOYW1lKGoucGFyZW50Tm9kZSwib3B0Z3JvdXAiKSkpe2I9ZihqKS52YWwoKTtpZihnKXJldHVybiBiO2QucHVzaChiKX19aWYoZyYmIWQubGVuZ3RoJiZlLmxlbmd0aClyZXR1cm4gZihlW2NdKS52YWwoKTtyZXR1cm4gZH0sc2V0OmZ1bmN0aW9uKGEsYil7dmFyIGM9Zi5tYWtlQXJyYXkoYik7ZihhKS5maW5kKCJvcHRpb24iKS5lYWNoKGZ1bmN0aW9uKCl7dGhpcy5zZWxlY3RlZD1mLmluQXJyYXkoZih0aGlzKS52YWwoKSxjKT49MH0pLGMubGVuZ3RofHwoYS5zZWxlY3RlZEluZGV4PS0xKTtyZXR1cm4gY319fSxhdHRyRm46e3ZhbDohMCxjc3M6ITAsaHRtbDohMCx0ZXh0OiEwLGRhdGE6ITAsd2lkdGg6ITAsaGVpZ2h0OiEwLG9mZnNldDohMH0sYXR0ckZpeDp7dGFiaW5kZXg6InRhYkluZGV4In0sYXR0cjpmdW5jdGlvbihhLGMsZCxlKXt2YXIgZz1hLm5vZGVUeXBlO2lmKCFhfHxnPT09M3x8Zz09PTh8fGc9PT0yKXJldHVybiBiO2lmKGUmJmMgaW4gZi5hdHRyRm4pcmV0dXJuIGYoYSlbY10oZCk7aWYoISgiZ2V0QXR0cmlidXRlImluIGEpKXJldHVybiBmLnByb3AoYSxjLGQpO3ZhciBoLGksaj1nIT09MXx8IWYuaXNYTUxEb2MoYSk7aiYmKGM9Zi5hdHRyRml4W2NdfHxjLGk9Zi5hdHRySG9va3NbY10saXx8KHQudGVzdChjKT9pPXY6dSYmKGk9dSkpKTtpZihkIT09Yil7aWYoZD09PW51bGwpe2YucmVtb3ZlQXR0cihhLGMpO3JldHVybiBifWlmKGkmJiJzZXQiaW4gaSYmaiYmKGg9aS5zZXQoYSxkLGMpKSE9PWIpcmV0dXJuIGg7YS5zZXRBdHRyaWJ1dGUoYywiIitkKTtyZXR1cm4gZH1pZihpJiYiZ2V0ImluIGkmJmomJihoPWkuZ2V0KGEsYykpIT09bnVsbClyZXR1cm4gaDtoPWEuZ2V0QXR0cmlidXRlKGMpO3JldHVybiBoPT09bnVsbD9iOmh9LHJlbW92ZUF0dHI6ZnVuY3Rpb24oYSxiKXt2YXIgYzthLm5vZGVUeXBlPT09MSYmKGI9Zi5hdHRyRml4W2JdfHxiLGYuYXR0cihhLGIsIiIpLGEucmVtb3ZlQXR0cmlidXRlKGIpLHQudGVzdChiKSYmKGM9Zi5wcm9wRml4W2JdfHxiKWluIGEmJihhW2NdPSExKSl9LGF0dHJIb29rczp7dHlwZTp7c2V0OmZ1bmN0aW9uKGEsYil7aWYocS50ZXN0KGEubm9kZU5hbWUpJiZhLnBhcmVudE5vZGUpZi5lcnJvcigidHlwZSBwcm9wZXJ0eSBjYW4ndCBiZSBjaGFuZ2VkIik7ZWxzZSBpZighZi5zdXBwb3J0LnJhZGlvVmFsdWUmJmI9PT0icmFkaW8iJiZmLm5vZGVOYW1lKGEsImlucHV0Iikpe3ZhciBjPWEudmFsdWU7YS5zZXRBdHRyaWJ1dGUoInR5cGUiLGIpLGMmJihhLnZhbHVlPWMpO3JldHVybiBifX19LHZhbHVlOntnZXQ6ZnVuY3Rpb24oYSxiKXtpZih1JiZmLm5vZGVOYW1lKGEsImJ1dHRvbiIpKXJldHVybiB1LmdldChhLGIpO3JldHVybiBiIGluIGE/YS52YWx1ZTpudWxsfSxzZXQ6ZnVuY3Rpb24oYSxiLGMpe2lmKHUmJmYubm9kZU5hbWUoYSwiYnV0dG9uIikpcmV0dXJuIHUuc2V0KGEsYixjKTthLnZhbHVlPWJ9fX0scHJvcEZpeDp7dGFiaW5kZXg6InRhYkluZGV4IixyZWFkb25seToicmVhZE9ubHkiLCJmb3IiOiJodG1sRm9yIiwiY2xhc3MiOiJjbGFzc05hbWUiLG1heGxlbmd0aDoibWF4TGVuZ3RoIixjZWxsc3BhY2luZzoiY2VsbFNwYWNpbmciLGNlbGxwYWRkaW5nOiJjZWxsUGFkZGluZyIscm93c3Bhbjoicm93U3BhbiIsY29sc3BhbjoiY29sU3BhbiIsdXNlbWFwOiJ1c2VNYXAiLGZyYW1lYm9yZGVyOiJmcmFtZUJvcmRlciIsY29udGVudGVkaXRhYmxlOiJjb250ZW50RWRpdGFibGUifSxwcm9wOmZ1bmN0aW9uKGEsYyxkKXt2YXIgZT1hLm5vZGVUeXBlO2lmKCFhfHxlPT09M3x8ZT09PTh8fGU9PT0yKXJldHVybiBiO3ZhciBnLGgsaT1lIT09MXx8IWYuaXNYTUxEb2MoYSk7aSYmKGM9Zi5wcm9wRml4W2NdfHxjLGg9Zi5wcm9wSG9va3NbY10pO3JldHVybiBkIT09Yj9oJiYic2V0ImluIGgmJihnPWguc2V0KGEsZCxjKSkhPT1iP2c6YVtjXT1kOmgmJiJnZXQiaW4gaCYmKGc9aC5nZXQoYSxjKSkhPT1udWxsP2c6YVtjXX0scHJvcEhvb2tzOnt0YWJJbmRleDp7Z2V0OmZ1bmN0aW9uKGEpe3ZhciBjPWEuZ2V0QXR0cmlidXRlTm9kZSgidGFiaW5kZXgiKTtyZXR1cm4gYyYmYy5zcGVjaWZpZWQ/cGFyc2VJbnQoYy52YWx1ZSwxMCk6ci50ZXN0KGEubm9kZU5hbWUpfHxzLnRlc3QoYS5ub2RlTmFtZSkmJmEuaHJlZj8wOmJ9fX19KSxmLmF0dHJIb29rcy50YWJJbmRleD1mLnByb3BIb29rcy50YWJJbmRleCx2PXtnZXQ6ZnVuY3Rpb24oYSxjKXt2YXIgZDtyZXR1cm4gZi5wcm9wKGEsYyk9PT0hMHx8KGQ9YS5nZXRBdHRyaWJ1dGVOb2RlKGMpKSYmZC5ub2RlVmFsdWUhPT0hMT9jLnRvTG93ZXJDYXNlKCk6Yn0sc2V0OmZ1bmN0aW9uKGEsYixjKXt2YXIgZDtiPT09ITE/Zi5yZW1vdmVBdHRyKGEsYyk6KGQ9Zi5wcm9wRml4W2NdfHxjLGQgaW4gYSYmKGFbZF09ITApLGEuc2V0QXR0cmlidXRlKGMsYy50b0xvd2VyQ2FzZSgpKSk7cmV0dXJuIGN9fSxmLnN1cHBvcnQuZ2V0U2V0QXR0cmlidXRlfHwodT1mLnZhbEhvb2tzLmJ1dHRvbj17Z2V0OmZ1bmN0aW9uKGEsYyl7dmFyIGQ7ZD1hLmdldEF0dHJpYnV0ZU5vZGUoYyk7cmV0dXJuIGQmJmQubm9kZVZhbHVlIT09IiI/ZC5ub2RlVmFsdWU6Yn0sc2V0OmZ1bmN0aW9uKGEsYixkKXt2YXIgZT1hLmdldEF0dHJpYnV0ZU5vZGUoZCk7ZXx8KGU9Yy5jcmVhdGVBdHRyaWJ1dGUoZCksYS5zZXRBdHRyaWJ1dGVOb2RlKGUpKTtyZXR1cm4gZS5ub2RlVmFsdWU9YisiIn19LGYuZWFjaChbIndpZHRoIiwiaGVpZ2h0Il0sZnVuY3Rpb24oYSxiKXtmLmF0dHJIb29rc1tiXT1mLmV4dGVuZChmLmF0dHJIb29rc1tiXSx7c2V0OmZ1bmN0aW9uKGEsYyl7aWYoYz09PSIiKXthLnNldEF0dHJpYnV0ZShiLCJhdXRvIik7cmV0dXJuIGN9fX0pfSkpLGYuc3VwcG9ydC5ocmVmTm9ybWFsaXplZHx8Zi5lYWNoKFsiaHJlZiIsInNyYyIsIndpZHRoIiwiaGVpZ2h0Il0sZnVuY3Rpb24oYSxjKXtmLmF0dHJIb29rc1tjXT1mLmV4dGVuZChmLmF0dHJIb29rc1tjXSx7Z2V0OmZ1bmN0aW9uKGEpe3ZhciBkPWEuZ2V0QXR0cmlidXRlKGMsMik7cmV0dXJuIGQ9PT1udWxsP2I6ZH19KX0pLGYuc3VwcG9ydC5zdHlsZXx8KGYuYXR0ckhvb2tzLnN0eWxlPXtnZXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuc3R5bGUuY3NzVGV4dC50b0xvd2VyQ2FzZSgpfHxifSxzZXQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5zdHlsZS5jc3NUZXh0PSIiK2J9fSksZi5zdXBwb3J0Lm9wdFNlbGVjdGVkfHwoZi5wcm9wSG9va3Muc2VsZWN0ZWQ9Zi5leHRlbmQoZi5wcm9wSG9va3Muc2VsZWN0ZWQse2dldDpmdW5jdGlvbihhKXt2YXIgYj1hLnBhcmVudE5vZGU7YiYmKGIuc2VsZWN0ZWRJbmRleCxiLnBhcmVudE5vZGUmJmIucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4KTtyZXR1cm4gbnVsbH19KSksZi5zdXBwb3J0LmNoZWNrT258fGYuZWFjaChbInJhZGlvIiwiY2hlY2tib3giXSxmdW5jdGlvbigpe2YudmFsSG9va3NbdGhpc109e2dldDpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInZhbHVlIik9PT1udWxsPyJvbiI6YS52YWx1ZX19fSksZi5lYWNoKFsicmFkaW8iLCJjaGVja2JveCJdLGZ1bmN0aW9uKCl7Zi52YWxIb29rc1t0aGlzXT1mLmV4dGVuZChmLnZhbEhvb2tzW3RoaXNdLHtzZXQ6ZnVuY3Rpb24oYSxiKXtpZihmLmlzQXJyYXkoYikpcmV0dXJuIGEuY2hlY2tlZD1mLmluQXJyYXkoZihhKS52YWwoKSxiKT49MH19KX0pO3ZhciB3PS9cLiguKikkLyx4PS9eKD86dGV4dGFyZWF8aW5wdXR8c2VsZWN0KSQvaSx5PS9cLi9nLHo9LyAvZyxBPS9bXlx3XHMufGBdL2csQj1mdW5jdGlvbihhKXtyZXR1cm4gYS5yZXBsYWNlKEEsIlxcJCYiKX07Zi5ldmVudD17YWRkOmZ1bmN0aW9uKGEsYyxkLGUpe2lmKGEubm9kZVR5cGUhPT0zJiZhLm5vZGVUeXBlIT09OCl7aWYoZD09PSExKWQ9QztlbHNlIGlmKCFkKXJldHVybjt2YXIgZyxoO2QuaGFuZGxlciYmKGc9ZCxkPWcuaGFuZGxlciksZC5ndWlkfHwoZC5ndWlkPWYuZ3VpZCsrKTt2YXIgaT1mLl9kYXRhKGEpO2lmKCFpKXJldHVybjt2YXIgaj1pLmV2ZW50cyxrPWkuaGFuZGxlO2p8fChpLmV2ZW50cz1qPXt9KSxrfHwoaS5oYW5kbGU9az1mdW5jdGlvbihhKXtyZXR1cm4gdHlwZW9mIGYhPSJ1bmRlZmluZWQiJiYoIWF8fGYuZXZlbnQudHJpZ2dlcmVkIT09YS50eXBlKT9mLmV2ZW50LmhhbmRsZS5hcHBseShrLmVsZW0sYXJndW1lbnRzKTpifSksay5lbGVtPWEsYz1jLnNwbGl0KCIgIik7dmFyIGwsbT0wLG47d2hpbGUobD1jW20rK10pe2g9Zz9mLmV4dGVuZCh7fSxnKTp7aGFuZGxlcjpkLGRhdGE6ZX0sbC5pbmRleE9mKCIuIik+LTE/KG49bC5zcGxpdCgiLiIpLGw9bi5zaGlmdCgpLGgubmFtZXNwYWNlPW4uc2xpY2UoMCkuc29ydCgpLmpvaW4oIi4iKSk6KG49W10saC5uYW1lc3BhY2U9IiIpLGgudHlwZT1sLGguZ3VpZHx8KGguZ3VpZD1kLmd1aWQpO3ZhciBvPWpbbF0scD1mLmV2ZW50LnNwZWNpYWxbbF18fHt9O2lmKCFvKXtvPWpbbF09W107aWYoIXAuc2V0dXB8fHAuc2V0dXAuY2FsbChhLGUsbixrKT09PSExKWEuYWRkRXZlbnRMaXN0ZW5lcj9hLmFkZEV2ZW50TGlzdGVuZXIobCxrLCExKTphLmF0dGFjaEV2ZW50JiZhLmF0dGFjaEV2ZW50KCJvbiIrbCxrKX1wLmFkZCYmKHAuYWRkLmNhbGwoYSxoKSxoLmhhbmRsZXIuZ3VpZHx8KGguaGFuZGxlci5ndWlkPWQuZ3VpZCkpLG8ucHVzaChoKSxmLmV2ZW50Lmdsb2JhbFtsXT0hMH1hPW51bGx9fSxnbG9iYWw6e30scmVtb3ZlOmZ1bmN0aW9uKGEsYyxkLGUpe2lmKGEubm9kZVR5cGUhPT0zJiZhLm5vZGVUeXBlIT09OCl7ZD09PSExJiYoZD1DKTt2YXIgZyxoLGksaixrPTAsbCxtLG4sbyxwLHEscixzPWYuaGFzRGF0YShhKSYmZi5fZGF0YShhKSx0PXMmJnMuZXZlbnRzO2lmKCFzfHwhdClyZXR1cm47YyYmYy50eXBlJiYoZD1jLmhhbmRsZXIsYz1jLnR5cGUpO2lmKCFjfHx0eXBlb2YgYz09InN0cmluZyImJmMuY2hhckF0KDApPT09Ii4iKXtjPWN8fCIiO2ZvcihoIGluIHQpZi5ldmVudC5yZW1vdmUoYSxoK2MpO3JldHVybn1jPWMuc3BsaXQoIiAiKTt3aGlsZShoPWNbaysrXSl7cj1oLHE9bnVsbCxsPWguaW5kZXhPZigiLiIpPDAsbT1bXSxsfHwobT1oLnNwbGl0KCIuIiksaD1tLnNoaWZ0KCksbj1uZXcgUmVnRXhwKCIoXnxcXC4pIitmLm1hcChtLnNsaWNlKDApLnNvcnQoKSxCKS5qb2luKCJcXC4oPzouKlxcLik/IikrIihcXC58JCkiKSkscD10W2hdO2lmKCFwKWNvbnRpbnVlO2lmKCFkKXtmb3Ioaj0wO2o8cC5sZW5ndGg7aisrKXtxPXBbal07aWYobHx8bi50ZXN0KHEubmFtZXNwYWNlKSlmLmV2ZW50LnJlbW92ZShhLHIscS5oYW5kbGVyLGopLHAuc3BsaWNlKGotLSwxKX1jb250aW51ZX1vPWYuZXZlbnQuc3BlY2lhbFtoXXx8e307Zm9yKGo9ZXx8MDtqPHAubGVuZ3RoO2orKyl7cT1wW2pdO2lmKGQuZ3VpZD09PXEuZ3VpZCl7aWYobHx8bi50ZXN0KHEubmFtZXNwYWNlKSllPT1udWxsJiZwLnNwbGljZShqLS0sMSksby5yZW1vdmUmJm8ucmVtb3ZlLmNhbGwoYSxxKTtpZihlIT1udWxsKWJyZWFrfX1pZihwLmxlbmd0aD09PTB8fGUhPW51bGwmJnAubGVuZ3RoPT09MSkoIW8udGVhcmRvd258fG8udGVhcmRvd24uY2FsbChhLG0pPT09ITEpJiZmLnJlbW92ZUV2ZW50KGEsaCxzLmhhbmRsZSksZz1udWxsLGRlbGV0ZSAKdFtoXX1pZihmLmlzRW1wdHlPYmplY3QodCkpe3ZhciB1PXMuaGFuZGxlO3UmJih1LmVsZW09bnVsbCksZGVsZXRlIHMuZXZlbnRzLGRlbGV0ZSBzLmhhbmRsZSxmLmlzRW1wdHlPYmplY3QocykmJmYucmVtb3ZlRGF0YShhLGIsITApfX19LGN1c3RvbUV2ZW50OntnZXREYXRhOiEwLHNldERhdGE6ITAsY2hhbmdlRGF0YTohMH0sdHJpZ2dlcjpmdW5jdGlvbihjLGQsZSxnKXt2YXIgaD1jLnR5cGV8fGMsaT1bXSxqO2guaW5kZXhPZigiISIpPj0wJiYoaD1oLnNsaWNlKDAsLTEpLGo9ITApLGguaW5kZXhPZigiLiIpPj0wJiYoaT1oLnNwbGl0KCIuIiksaD1pLnNoaWZ0KCksaS5zb3J0KCkpO2lmKCEhZSYmIWYuZXZlbnQuY3VzdG9tRXZlbnRbaF18fCEhZi5ldmVudC5nbG9iYWxbaF0pe2M9dHlwZW9mIGM9PSJvYmplY3QiP2NbZi5leHBhbmRvXT9jOm5ldyBmLkV2ZW50KGgsYyk6bmV3IGYuRXZlbnQoaCksYy50eXBlPWgsYy5leGNsdXNpdmU9aixjLm5hbWVzcGFjZT1pLmpvaW4oIi4iKSxjLm5hbWVzcGFjZV9yZT1uZXcgUmVnRXhwKCIoXnxcXC4pIitpLmpvaW4oIlxcLig/Oi4qXFwuKT8iKSsiKFxcLnwkKSIpO2lmKGd8fCFlKWMucHJldmVudERlZmF1bHQoKSxjLnN0b3BQcm9wYWdhdGlvbigpO2lmKCFlKXtmLmVhY2goZi5jYWNoZSxmdW5jdGlvbigpe3ZhciBhPWYuZXhwYW5kbyxiPXRoaXNbYV07YiYmYi5ldmVudHMmJmIuZXZlbnRzW2hdJiZmLmV2ZW50LnRyaWdnZXIoYyxkLGIuaGFuZGxlLmVsZW0pfSk7cmV0dXJufWlmKGUubm9kZVR5cGU9PT0zfHxlLm5vZGVUeXBlPT09OClyZXR1cm47Yy5yZXN1bHQ9YixjLnRhcmdldD1lLGQ9ZCE9bnVsbD9mLm1ha2VBcnJheShkKTpbXSxkLnVuc2hpZnQoYyk7dmFyIGs9ZSxsPWguaW5kZXhPZigiOiIpPDA/Im9uIitoOiIiO2Rve3ZhciBtPWYuX2RhdGEoaywiaGFuZGxlIik7Yy5jdXJyZW50VGFyZ2V0PWssbSYmbS5hcHBseShrLGQpLGwmJmYuYWNjZXB0RGF0YShrKSYma1tsXSYma1tsXS5hcHBseShrLGQpPT09ITEmJihjLnJlc3VsdD0hMSxjLnByZXZlbnREZWZhdWx0KCkpLGs9ay5wYXJlbnROb2RlfHxrLm93bmVyRG9jdW1lbnR8fGs9PT1jLnRhcmdldC5vd25lckRvY3VtZW50JiZhfXdoaWxlKGsmJiFjLmlzUHJvcGFnYXRpb25TdG9wcGVkKCkpO2lmKCFjLmlzRGVmYXVsdFByZXZlbnRlZCgpKXt2YXIgbixvPWYuZXZlbnQuc3BlY2lhbFtoXXx8e307aWYoKCFvLl9kZWZhdWx0fHxvLl9kZWZhdWx0LmNhbGwoZS5vd25lckRvY3VtZW50LGMpPT09ITEpJiYoaCE9PSJjbGljayJ8fCFmLm5vZGVOYW1lKGUsImEiKSkmJmYuYWNjZXB0RGF0YShlKSl7dHJ5e2wmJmVbaF0mJihuPWVbbF0sbiYmKGVbbF09bnVsbCksZi5ldmVudC50cmlnZ2VyZWQ9aCxlW2hdKCkpfWNhdGNoKHApe31uJiYoZVtsXT1uKSxmLmV2ZW50LnRyaWdnZXJlZD1ifX1yZXR1cm4gYy5yZXN1bHR9fSxoYW5kbGU6ZnVuY3Rpb24oYyl7Yz1mLmV2ZW50LmZpeChjfHxhLmV2ZW50KTt2YXIgZD0oKGYuX2RhdGEodGhpcywiZXZlbnRzIil8fHt9KVtjLnR5cGVdfHxbXSkuc2xpY2UoMCksZT0hYy5leGNsdXNpdmUmJiFjLm5hbWVzcGFjZSxnPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywwKTtnWzBdPWMsYy5jdXJyZW50VGFyZ2V0PXRoaXM7Zm9yKHZhciBoPTAsaT1kLmxlbmd0aDtoPGk7aCsrKXt2YXIgaj1kW2hdO2lmKGV8fGMubmFtZXNwYWNlX3JlLnRlc3Qoai5uYW1lc3BhY2UpKXtjLmhhbmRsZXI9ai5oYW5kbGVyLGMuZGF0YT1qLmRhdGEsYy5oYW5kbGVPYmo9ajt2YXIgaz1qLmhhbmRsZXIuYXBwbHkodGhpcyxnKTtrIT09YiYmKGMucmVzdWx0PWssaz09PSExJiYoYy5wcmV2ZW50RGVmYXVsdCgpLGMuc3RvcFByb3BhZ2F0aW9uKCkpKTtpZihjLmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkKCkpYnJlYWt9fXJldHVybiBjLnJlc3VsdH0scHJvcHM6ImFsdEtleSBhdHRyQ2hhbmdlIGF0dHJOYW1lIGJ1YmJsZXMgYnV0dG9uIGNhbmNlbGFibGUgY2hhckNvZGUgY2xpZW50WCBjbGllbnRZIGN0cmxLZXkgY3VycmVudFRhcmdldCBkYXRhIGRldGFpbCBldmVudFBoYXNlIGZyb21FbGVtZW50IGhhbmRsZXIga2V5Q29kZSBsYXllclggbGF5ZXJZIG1ldGFLZXkgbmV3VmFsdWUgb2Zmc2V0WCBvZmZzZXRZIHBhZ2VYIHBhZ2VZIHByZXZWYWx1ZSByZWxhdGVkTm9kZSByZWxhdGVkVGFyZ2V0IHNjcmVlblggc2NyZWVuWSBzaGlmdEtleSBzcmNFbGVtZW50IHRhcmdldCB0b0VsZW1lbnQgdmlldyB3aGVlbERlbHRhIHdoaWNoIi5zcGxpdCgiICIpLGZpeDpmdW5jdGlvbihhKXtpZihhW2YuZXhwYW5kb10pcmV0dXJuIGE7dmFyIGQ9YTthPWYuRXZlbnQoZCk7Zm9yKHZhciBlPXRoaXMucHJvcHMubGVuZ3RoLGc7ZTspZz10aGlzLnByb3BzWy0tZV0sYVtnXT1kW2ddO2EudGFyZ2V0fHwoYS50YXJnZXQ9YS5zcmNFbGVtZW50fHxjKSxhLnRhcmdldC5ub2RlVHlwZT09PTMmJihhLnRhcmdldD1hLnRhcmdldC5wYXJlbnROb2RlKSwhYS5yZWxhdGVkVGFyZ2V0JiZhLmZyb21FbGVtZW50JiYoYS5yZWxhdGVkVGFyZ2V0PWEuZnJvbUVsZW1lbnQ9PT1hLnRhcmdldD9hLnRvRWxlbWVudDphLmZyb21FbGVtZW50KTtpZihhLnBhZ2VYPT1udWxsJiZhLmNsaWVudFghPW51bGwpe3ZhciBoPWEudGFyZ2V0Lm93bmVyRG9jdW1lbnR8fGMsaT1oLmRvY3VtZW50RWxlbWVudCxqPWguYm9keTthLnBhZ2VYPWEuY2xpZW50WCsoaSYmaS5zY3JvbGxMZWZ0fHxqJiZqLnNjcm9sbExlZnR8fDApLShpJiZpLmNsaWVudExlZnR8fGomJmouY2xpZW50TGVmdHx8MCksYS5wYWdlWT1hLmNsaWVudFkrKGkmJmkuc2Nyb2xsVG9wfHxqJiZqLnNjcm9sbFRvcHx8MCktKGkmJmkuY2xpZW50VG9wfHxqJiZqLmNsaWVudFRvcHx8MCl9YS53aGljaD09bnVsbCYmKGEuY2hhckNvZGUhPW51bGx8fGEua2V5Q29kZSE9bnVsbCkmJihhLndoaWNoPWEuY2hhckNvZGUhPW51bGw/YS5jaGFyQ29kZTphLmtleUNvZGUpLCFhLm1ldGFLZXkmJmEuY3RybEtleSYmKGEubWV0YUtleT1hLmN0cmxLZXkpLCFhLndoaWNoJiZhLmJ1dHRvbiE9PWImJihhLndoaWNoPWEuYnV0dG9uJjE/MTphLmJ1dHRvbiYyPzM6YS5idXR0b24mND8yOjApO3JldHVybiBhfSxndWlkOjFlOCxwcm94eTpmLnByb3h5LHNwZWNpYWw6e3JlYWR5OntzZXR1cDpmLmJpbmRSZWFkeSx0ZWFyZG93bjpmLm5vb3B9LGxpdmU6e2FkZDpmdW5jdGlvbihhKXtmLmV2ZW50LmFkZCh0aGlzLE0oYS5vcmlnVHlwZSxhLnNlbGVjdG9yKSxmLmV4dGVuZCh7fSxhLHtoYW5kbGVyOkwsZ3VpZDphLmhhbmRsZXIuZ3VpZH0pKX0scmVtb3ZlOmZ1bmN0aW9uKGEpe2YuZXZlbnQucmVtb3ZlKHRoaXMsTShhLm9yaWdUeXBlLGEuc2VsZWN0b3IpLGEpfX0sYmVmb3JldW5sb2FkOntzZXR1cDpmdW5jdGlvbihhLGIsYyl7Zi5pc1dpbmRvdyh0aGlzKSYmKHRoaXMub25iZWZvcmV1bmxvYWQ9Yyl9LHRlYXJkb3duOmZ1bmN0aW9uKGEsYil7dGhpcy5vbmJlZm9yZXVubG9hZD09PWImJih0aGlzLm9uYmVmb3JldW5sb2FkPW51bGwpfX19fSxmLnJlbW92ZUV2ZW50PWMucmVtb3ZlRXZlbnRMaXN0ZW5lcj9mdW5jdGlvbihhLGIsYyl7YS5yZW1vdmVFdmVudExpc3RlbmVyJiZhLnJlbW92ZUV2ZW50TGlzdGVuZXIoYixjLCExKX06ZnVuY3Rpb24oYSxiLGMpe2EuZGV0YWNoRXZlbnQmJmEuZGV0YWNoRXZlbnQoIm9uIitiLGMpfSxmLkV2ZW50PWZ1bmN0aW9uKGEsYil7aWYoIXRoaXMucHJldmVudERlZmF1bHQpcmV0dXJuIG5ldyBmLkV2ZW50KGEsYik7YSYmYS50eXBlPyh0aGlzLm9yaWdpbmFsRXZlbnQ9YSx0aGlzLnR5cGU9YS50eXBlLHRoaXMuaXNEZWZhdWx0UHJldmVudGVkPWEuZGVmYXVsdFByZXZlbnRlZHx8YS5yZXR1cm5WYWx1ZT09PSExfHxhLmdldFByZXZlbnREZWZhdWx0JiZhLmdldFByZXZlbnREZWZhdWx0KCk/RDpDKTp0aGlzLnR5cGU9YSxiJiZmLmV4dGVuZCh0aGlzLGIpLHRoaXMudGltZVN0YW1wPWYubm93KCksdGhpc1tmLmV4cGFuZG9dPSEwfSxmLkV2ZW50LnByb3RvdHlwZT17cHJldmVudERlZmF1bHQ6ZnVuY3Rpb24oKXt0aGlzLmlzRGVmYXVsdFByZXZlbnRlZD1EO3ZhciBhPXRoaXMub3JpZ2luYWxFdmVudDshYXx8KGEucHJldmVudERlZmF1bHQ/YS5wcmV2ZW50RGVmYXVsdCgpOmEucmV0dXJuVmFsdWU9ITEpfSxzdG9wUHJvcGFnYXRpb246ZnVuY3Rpb24oKXt0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkPUQ7dmFyIGE9dGhpcy5vcmlnaW5hbEV2ZW50OyFhfHwoYS5zdG9wUHJvcGFnYXRpb24mJmEuc3RvcFByb3BhZ2F0aW9uKCksYS5jYW5jZWxCdWJibGU9ITApfSxzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb246ZnVuY3Rpb24oKXt0aGlzLmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkPUQsdGhpcy5zdG9wUHJvcGFnYXRpb24oKX0saXNEZWZhdWx0UHJldmVudGVkOkMsaXNQcm9wYWdhdGlvblN0b3BwZWQ6Qyxpc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZDpDfTt2YXIgRT1mdW5jdGlvbihhKXt2YXIgYj1hLnJlbGF0ZWRUYXJnZXQsYz0hMSxkPWEudHlwZTthLnR5cGU9YS5kYXRhLGIhPT10aGlzJiYoYiYmKGM9Zi5jb250YWlucyh0aGlzLGIpKSxjfHwoZi5ldmVudC5oYW5kbGUuYXBwbHkodGhpcyxhcmd1bWVudHMpLGEudHlwZT1kKSl9LEY9ZnVuY3Rpb24oYSl7YS50eXBlPWEuZGF0YSxmLmV2ZW50LmhhbmRsZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9O2YuZWFjaCh7bW91c2VlbnRlcjoibW91c2VvdmVyIixtb3VzZWxlYXZlOiJtb3VzZW91dCJ9LGZ1bmN0aW9uKGEsYil7Zi5ldmVudC5zcGVjaWFsW2FdPXtzZXR1cDpmdW5jdGlvbihjKXtmLmV2ZW50LmFkZCh0aGlzLGIsYyYmYy5zZWxlY3Rvcj9GOkUsYSl9LHRlYXJkb3duOmZ1bmN0aW9uKGEpe2YuZXZlbnQucmVtb3ZlKHRoaXMsYixhJiZhLnNlbGVjdG9yP0Y6RSl9fX0pLGYuc3VwcG9ydC5zdWJtaXRCdWJibGVzfHwoZi5ldmVudC5zcGVjaWFsLnN1Ym1pdD17c2V0dXA6ZnVuY3Rpb24oYSxiKXtpZighZi5ub2RlTmFtZSh0aGlzLCJmb3JtIikpZi5ldmVudC5hZGQodGhpcywiY2xpY2suc3BlY2lhbFN1Ym1pdCIsZnVuY3Rpb24oYSl7dmFyIGI9YS50YXJnZXQsYz1mLm5vZGVOYW1lKGIsImlucHV0Iil8fGYubm9kZU5hbWUoYiwiYnV0dG9uIik/Yi50eXBlOiIiOyhjPT09InN1Ym1pdCJ8fGM9PT0iaW1hZ2UiKSYmZihiKS5jbG9zZXN0KCJmb3JtIikubGVuZ3RoJiZKKCJzdWJtaXQiLHRoaXMsYXJndW1lbnRzKX0pLGYuZXZlbnQuYWRkKHRoaXMsImtleXByZXNzLnNwZWNpYWxTdWJtaXQiLGZ1bmN0aW9uKGEpe3ZhciBiPWEudGFyZ2V0LGM9Zi5ub2RlTmFtZShiLCJpbnB1dCIpfHxmLm5vZGVOYW1lKGIsImJ1dHRvbiIpP2IudHlwZToiIjsoYz09PSJ0ZXh0Inx8Yz09PSJwYXNzd29yZCIpJiZmKGIpLmNsb3Nlc3QoImZvcm0iKS5sZW5ndGgmJmEua2V5Q29kZT09PTEzJiZKKCJzdWJtaXQiLHRoaXMsYXJndW1lbnRzKX0pO2Vsc2UgcmV0dXJuITF9LHRlYXJkb3duOmZ1bmN0aW9uKGEpe2YuZXZlbnQucmVtb3ZlKHRoaXMsIi5zcGVjaWFsU3VibWl0Iil9fSk7aWYoIWYuc3VwcG9ydC5jaGFuZ2VCdWJibGVzKXt2YXIgRyxIPWZ1bmN0aW9uKGEpe3ZhciBiPWYubm9kZU5hbWUoYSwiaW5wdXQiKT9hLnR5cGU6IiIsYz1hLnZhbHVlO2I9PT0icmFkaW8ifHxiPT09ImNoZWNrYm94Ij9jPWEuY2hlY2tlZDpiPT09InNlbGVjdC1tdWx0aXBsZSI/Yz1hLnNlbGVjdGVkSW5kZXg+LTE/Zi5tYXAoYS5vcHRpb25zLGZ1bmN0aW9uKGEpe3JldHVybiBhLnNlbGVjdGVkfSkuam9pbigiLSIpOiIiOmYubm9kZU5hbWUoYSwic2VsZWN0IikmJihjPWEuc2VsZWN0ZWRJbmRleCk7cmV0dXJuIGN9LEk9ZnVuY3Rpb24oYyl7dmFyIGQ9Yy50YXJnZXQsZSxnO2lmKCEheC50ZXN0KGQubm9kZU5hbWUpJiYhZC5yZWFkT25seSl7ZT1mLl9kYXRhKGQsIl9jaGFuZ2VfZGF0YSIpLGc9SChkKSwoYy50eXBlIT09ImZvY3Vzb3V0Inx8ZC50eXBlIT09InJhZGlvIikmJmYuX2RhdGEoZCwiX2NoYW5nZV9kYXRhIixnKTtpZihlPT09Ynx8Zz09PWUpcmV0dXJuO2lmKGUhPW51bGx8fGcpYy50eXBlPSJjaGFuZ2UiLGMubGl2ZUZpcmVkPWIsZi5ldmVudC50cmlnZ2VyKGMsYXJndW1lbnRzWzFdLGQpfX07Zi5ldmVudC5zcGVjaWFsLmNoYW5nZT17ZmlsdGVyczp7Zm9jdXNvdXQ6SSxiZWZvcmVkZWFjdGl2YXRlOkksY2xpY2s6ZnVuY3Rpb24oYSl7dmFyIGI9YS50YXJnZXQsYz1mLm5vZGVOYW1lKGIsImlucHV0Iik/Yi50eXBlOiIiOyhjPT09InJhZGlvInx8Yz09PSJjaGVja2JveCJ8fGYubm9kZU5hbWUoYiwic2VsZWN0IikpJiZJLmNhbGwodGhpcyxhKX0sa2V5ZG93bjpmdW5jdGlvbihhKXt2YXIgYj1hLnRhcmdldCxjPWYubm9kZU5hbWUoYiwiaW5wdXQiKT9iLnR5cGU6IiI7KGEua2V5Q29kZT09PTEzJiYhZi5ub2RlTmFtZShiLCJ0ZXh0YXJlYSIpfHxhLmtleUNvZGU9PT0zMiYmKGM9PT0iY2hlY2tib3gifHxjPT09InJhZGlvIil8fGM9PT0ic2VsZWN0LW11bHRpcGxlIikmJkkuY2FsbCh0aGlzLGEpfSxiZWZvcmVhY3RpdmF0ZTpmdW5jdGlvbihhKXt2YXIgYj1hLnRhcmdldDtmLl9kYXRhKGIsIl9jaGFuZ2VfZGF0YSIsSChiKSl9fSxzZXR1cDpmdW5jdGlvbihhLGIpe2lmKHRoaXMudHlwZT09PSJmaWxlIilyZXR1cm4hMTtmb3IodmFyIGMgaW4gRylmLmV2ZW50LmFkZCh0aGlzLGMrIi5zcGVjaWFsQ2hhbmdlIixHW2NdKTtyZXR1cm4geC50ZXN0KHRoaXMubm9kZU5hbWUpfSx0ZWFyZG93bjpmdW5jdGlvbihhKXtmLmV2ZW50LnJlbW92ZSh0aGlzLCIuc3BlY2lhbENoYW5nZSIpO3JldHVybiB4LnRlc3QodGhpcy5ub2RlTmFtZSl9fSxHPWYuZXZlbnQuc3BlY2lhbC5jaGFuZ2UuZmlsdGVycyxHLmZvY3VzPUcuYmVmb3JlYWN0aXZhdGV9Zi5zdXBwb3J0LmZvY3VzaW5CdWJibGVzfHxmLmVhY2goe2ZvY3VzOiJmb2N1c2luIixibHVyOiJmb2N1c291dCJ9LGZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gZShhKXt2YXIgYz1mLmV2ZW50LmZpeChhKTtjLnR5cGU9YixjLm9yaWdpbmFsRXZlbnQ9e30sZi5ldmVudC50cmlnZ2VyKGMsbnVsbCxjLnRhcmdldCksYy5pc0RlZmF1bHRQcmV2ZW50ZWQoKSYmYS5wcmV2ZW50RGVmYXVsdCgpfXZhciBkPTA7Zi5ldmVudC5zcGVjaWFsW2JdPXtzZXR1cDpmdW5jdGlvbigpe2QrKz09PTAmJmMuYWRkRXZlbnRMaXN0ZW5lcihhLGUsITApfSx0ZWFyZG93bjpmdW5jdGlvbigpey0tZD09PTAmJmMucmVtb3ZlRXZlbnRMaXN0ZW5lcihhLGUsITApfX19KSxmLmVhY2goWyJiaW5kIiwib25lIl0sZnVuY3Rpb24oYSxjKXtmLmZuW2NdPWZ1bmN0aW9uKGEsZCxlKXt2YXIgZztpZih0eXBlb2YgYT09Im9iamVjdCIpe2Zvcih2YXIgaCBpbiBhKXRoaXNbY10oaCxkLGFbaF0sZSk7cmV0dXJuIHRoaXN9aWYoYXJndW1lbnRzLmxlbmd0aD09PTJ8fGQ9PT0hMSllPWQsZD1iO2M9PT0ib25lIj8oZz1mdW5jdGlvbihhKXtmKHRoaXMpLnVuYmluZChhLGcpO3JldHVybiBlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sZy5ndWlkPWUuZ3VpZHx8Zi5ndWlkKyspOmc9ZTtpZihhPT09InVubG9hZCImJmMhPT0ib25lIil0aGlzLm9uZShhLGQsZSk7ZWxzZSBmb3IodmFyIGk9MCxqPXRoaXMubGVuZ3RoO2k8ajtpKyspZi5ldmVudC5hZGQodGhpc1tpXSxhLGcsZCk7cmV0dXJuIHRoaXN9fSksZi5mbi5leHRlbmQoe3VuYmluZDpmdW5jdGlvbihhLGIpe2lmKHR5cGVvZiBhPT0ib2JqZWN0IiYmIWEucHJldmVudERlZmF1bHQpZm9yKHZhciBjIGluIGEpdGhpcy51bmJpbmQoYyxhW2NdKTtlbHNlIGZvcih2YXIgZD0wLGU9dGhpcy5sZW5ndGg7ZDxlO2QrKylmLmV2ZW50LnJlbW92ZSh0aGlzW2RdLGEsYik7cmV0dXJuIHRoaXN9LGRlbGVnYXRlOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiB0aGlzLmxpdmUoYixjLGQsYSl9LHVuZGVsZWdhdGU6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPT09MD90aGlzLnVuYmluZCgibGl2ZSIpOnRoaXMuZGllKGIsbnVsbCxjLGEpfSx0cmlnZ2VyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2YuZXZlbnQudHJpZ2dlcihhLGIsdGhpcyl9KX0sdHJpZ2dlckhhbmRsZXI6ZnVuY3Rpb24oYSxiKXtpZih0aGlzWzBdKXJldHVybiBmLmV2ZW50LnRyaWdnZXIoYSxiLHRoaXNbMF0sITApfSx0b2dnbGU6ZnVuY3Rpb24oYSl7dmFyIGI9YXJndW1lbnRzLGM9YS5ndWlkfHxmLmd1aWQrKyxkPTAsZT1mdW5jdGlvbihjKXt2YXIgZT0oZi5kYXRhKHRoaXMsImxhc3RUb2dnbGUiK2EuZ3VpZCl8fDApJWQ7Zi5kYXRhKHRoaXMsImxhc3RUb2dnbGUiK2EuZ3VpZCxlKzEpLGMucHJldmVudERlZmF1bHQoKTtyZXR1cm4gYltlXS5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fCExfTtlLmd1aWQ9Yzt3aGlsZShkPGIubGVuZ3RoKWJbZCsrXS5ndWlkPWM7cmV0dXJuIHRoaXMuY2xpY2soZSl9LGhvdmVyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMubW91c2VlbnRlcihhKS5tb3VzZWxlYXZlKGJ8fGEpfX0pO3ZhciBLPXtmb2N1czoiZm9jdXNpbiIsYmx1cjoiZm9jdXNvdXQiLG1vdXNlZW50ZXI6Im1vdXNlb3ZlciIsbW91c2VsZWF2ZToibW91c2VvdXQifTtmLmVhY2goWyJsaXZlIiwiZGllIl0sZnVuY3Rpb24oYSxjKXtmLmZuW2NdPWZ1bmN0aW9uKGEsZCxlLGcpe3ZhciBoLGk9MCxqLGssbCxtPWd8fHRoaXMuc2VsZWN0b3Isbj1nP3RoaXM6Zih0aGlzLmNvbnRleHQpO2lmKHR5cGVvZiBhPT0ib2JqZWN0IiYmIWEucHJldmVudERlZmF1bHQpe2Zvcih2YXIgbyBpbiBhKW5bY10obyxkLGFbb10sbSk7cmV0dXJuIHRoaXN9aWYoYz09PSJkaWUiJiYhYSYmZyYmZy5jaGFyQXQoMCk9PT0iLiIpe24udW5iaW5kKGcpO3JldHVybiB0aGlzfWlmKGQ9PT0hMXx8Zi5pc0Z1bmN0aW9uKGQpKWU9ZHx8QyxkPWI7YT0oYXx8IiIpLnNwbGl0KCIgIik7d2hpbGUoKGg9YVtpKytdKSE9bnVsbCl7aj13LmV4ZWMoaCksaz0iIixqJiYoaz1qWzBdLGg9aC5yZXBsYWNlKHcsIiIpKTtpZihoPT09ImhvdmVyIil7YS5wdXNoKCJtb3VzZWVudGVyIitrLCJtb3VzZWxlYXZlIitrKTtjb250aW51ZX1sPWgsS1toXT8oYS5wdXNoKEtbaF0rayksaD1oK2spOmg9KEtbaF18fGgpK2s7aWYoYz09PSJsaXZlIilmb3IodmFyIHA9MCxxPW4ubGVuZ3RoO3A8cTtwKyspZi5ldmVudC5hZGQobltwXSwibGl2ZS4iK00oaCxtKSx7ZGF0YTpkLHNlbGVjdG9yOm0saGFuZGxlcjplLG9yaWdUeXBlOmgsb3JpZ0hhbmRsZXI6ZSxwcmVUeXBlOmx9KTtlbHNlIG4udW5iaW5kKCJsaXZlLiIrTShoLG0pLGUpfXJldHVybiB0aGlzfX0pLGYuZWFjaCgiYmx1ciBmb2N1cyBmb2N1c2luIGZvY3Vzb3V0IGxvYWQgcmVzaXplIHNjcm9sbCB1bmxvYWQgY2xpY2sgZGJsY2xpY2sgbW91c2Vkb3duIG1vdXNldXAgbW91c2Vtb3ZlIG1vdXNlb3ZlciBtb3VzZW91dCBtb3VzZWVudGVyIG1vdXNlbGVhdmUgY2hhbmdlIHNlbGVjdCBzdWJtaXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBlcnJvciIuc3BsaXQoIiAiKSxmdW5jdGlvbihhLGIpe2YuZm5bYl09ZnVuY3Rpb24oYSxjKXtjPT1udWxsJiYoYz1hLGE9bnVsbCk7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg+MD90aGlzLmJpbmQoYixhLGMpOnRoaXMudHJpZ2dlcihiKX0sZi5hdHRyRm4mJihmLmF0dHJGbltiXT0hMCl9KSxmdW5jdGlvbigpe2Z1bmN0aW9uIHUoYSxiLGMsZCxlLGYpe2Zvcih2YXIgZz0wLGg9ZC5sZW5ndGg7ZzxoO2crKyl7dmFyIGk9ZFtnXTtpZihpKXt2YXIgaj0hMTtpPWlbYV07d2hpbGUoaSl7aWYoaS5zaXpjYWNoZT09PWMpe2o9ZFtpLnNpenNldF07YnJlYWt9aWYoaS5ub2RlVHlwZT09PTEpe2Z8fChpLnNpemNhY2hlPWMsaS5zaXpzZXQ9Zyk7aWYodHlwZW9mIGIhPSJzdHJpbmciKXtpZihpPT09Yil7aj0hMDticmVha319ZWxzZSBpZihrLmZpbHRlcihiLFtpXSkubGVuZ3RoPjApe2o9aTticmVha319aT1pW2FdfWRbZ109an19fWZ1bmN0aW9uIHQoYSxiLGMsZCxlLGYpe2Zvcih2YXIgZz0wLGg9ZC5sZW5ndGg7ZzxoO2crKyl7dmFyIGk9ZFtnXTtpZihpKXt2YXIgaj0hMTtpPWlbYV07d2hpbGUoaSl7aWYoaS5zaXpjYWNoZT09PWMpe2o9ZFtpLnNpenNldF07YnJlYWt9aS5ub2RlVHlwZT09PTEmJiFmJiYoaS5zaXpjYWNoZT1jLGkuc2l6c2V0PWcpO2lmKGkubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PWIpe2o9aTticmVha31pPWlbYV19ZFtnXT1qfX19dmFyIGE9LygoPzpcKCg/OlwoW14oKV0rXCl8W14oKV0rKStcKXxcWyg/OlxbW15cW1xdXSpcXXxbJyJdW14nIl0qWyciXXxbXlxbXF0nIl0rKStcXXxcXC58W14gPit+LChcW1xcXSspK3xbPit+XSkoXHMqLFxzKik/KCg/Oi58XHJ8XG4pKikvZyxkPTAsZT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLGc9ITEsaD0hMCxpPS9cXC9nLGo9L1xXLztbMCwwXS5zb3J0KGZ1bmN0aW9uKCl7aD0hMTtyZXR1cm4gMH0pO3ZhciBrPWZ1bmN0aW9uKGIsZCxmLGcpe2Y9Znx8W10sZD1kfHxjO3ZhciBoPWQ7aWYoZC5ub2RlVHlwZSE9PTEmJmQubm9kZVR5cGUhPT05KXJldHVybltdO2lmKCFifHx0eXBlb2YgYiE9InN0cmluZyIpcmV0dXJuIGY7dmFyIGksaixuLG8scSxyLHMsdCx1PSEwLHc9ay5pc1hNTChkKSx4PVtdLHk9Yjtkb3thLmV4ZWMoIiIpLGk9YS5leGVjKHkpO2lmKGkpe3k9aVszXSx4LnB1c2goaVsxXSk7aWYoaVsyXSl7bz1pWzNdO2JyZWFrfX19d2hpbGUoaSk7aWYoeC5sZW5ndGg+MSYmbS5leGVjKGIpKWlmKHgubGVuZ3RoPT09MiYmbC5yZWxhdGl2ZVt4WzBdXSlqPXYoeFswXSt4WzFdLGQpO2Vsc2V7aj1sLnJlbGF0aXZlW3hbMF1dP1tkXTprKHguc2hpZnQoKSxkKTt3aGlsZSh4Lmxlbmd0aCliPXguc2hpZnQoKSxsLnJlbGF0aXZlW2JdJiYoYis9eC5zaGlmdCgpKSxqPXYoYixqKX1lbHNleyFnJiZ4Lmxlbmd0aD4xJiZkLm5vZGVUeXBlPT09OSYmIXcmJmwubWF0Y2guSUQudGVzdCh4WzBdKSYmIWwubWF0Y2guSUQudGVzdCh4W3gubGVuZ3RoLTFdKSYmKHE9ay5maW5kKHguc2hpZnQoKSxkLHcpLGQ9cS5leHByP2suZmlsdGVyKHEuZXhwcixxLnNldClbMF06cS5zZXRbMF0pO2lmKGQpe3E9Zz97ZXhwcjp4LnBvcCgpLHNldDpwKGcpfTprLmZpbmQoeC5wb3AoKSx4Lmxlbmd0aD09PTEmJih4WzBdPT09In4ifHx4WzBdPT09IisiKSYmZC5wYXJlbnROb2RlP2QucGFyZW50Tm9kZTpkLHcpLGo9cS5leHByP2suZmlsdGVyKHEuZXhwcixxLnNldCk6cS5zZXQseC5sZW5ndGg+MD9uPXAoaik6dT0hMTt3aGlsZSh4Lmxlbmd0aClyPXgucG9wKCkscz1yLGwucmVsYXRpdmVbcl0/cz14LnBvcCgpOnI9IiIscz09bnVsbCYmKHM9ZCksbC5yZWxhdGl2ZVtyXShuLHMsdyl9ZWxzZSBuPXg9W119bnx8KG49aiksbnx8ay5lcnJvcihyfHxiKTtpZihlLmNhbGwobik9PT0iW29iamVjdCBBcnJheV0iKWlmKCF1KWYucHVzaC5hcHBseShmLG4pO2Vsc2UgaWYoZCYmZC5ub2RlVHlwZT09PTEpZm9yKHQ9MDtuW3RdIT1udWxsO3QrKyluW3RdJiYoblt0XT09PSEwfHxuW3RdLm5vZGVUeXBlPT09MSYmay5jb250YWlucyhkLG5bdF0pKSYmZi5wdXNoKGpbdF0pO2Vsc2UgZm9yKHQ9MDtuW3RdIT1udWxsO3QrKyluW3RdJiZuW3RdLm5vZGVUeXBlPT09MSYmZi5wdXNoKGpbdF0pO2Vsc2UgcChuLGYpO28mJihrKG8saCxmLGcpLGsudW5pcXVlU29ydChmKSk7cmV0dXJuIGZ9O2sudW5pcXVlU29ydD1mdW5jdGlvbihhKXtpZihyKXtnPWgsYS5zb3J0KHIpO2lmKGcpZm9yKHZhciBiPTE7YjxhLmxlbmd0aDtiKyspYVtiXT09PWFbYi0xXSYmYS5zcGxpY2UoYi0tLDEpfXJldHVybiBhfSxrLm1hdGNoZXM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gayhhLG51bGwsbnVsbCxiKX0say5tYXRjaGVzU2VsZWN0b3I9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gayhiLG51bGwsbnVsbCxbYV0pLmxlbmd0aD4wfSxrLmZpbmQ9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkO2lmKCFhKXJldHVybltdO2Zvcih2YXIgZT0wLGY9bC5vcmRlci5sZW5ndGg7ZTxmO2UrKyl7dmFyIGcsaD1sLm9yZGVyW2VdO2lmKGc9bC5sZWZ0TWF0Y2hbaF0uZXhlYyhhKSl7dmFyIGo9Z1sxXTtnLnNwbGljZSgxLDEpO2lmKGouc3Vic3RyKGoubGVuZ3RoLTEpIT09IlxcIil7Z1sxXT0oZ1sxXXx8IiIpLnJlcGxhY2UoaSwiIiksZD1sLmZpbmRbaF0oZyxiLGMpO2lmKGQhPW51bGwpe2E9YS5yZXBsYWNlKGwubWF0Y2hbaF0sIiIpO2JyZWFrfX19fWR8fChkPXR5cGVvZiBiLmdldEVsZW1lbnRzQnlUYWdOYW1lIT0idW5kZWZpbmVkIj9iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIik6W10pO3JldHVybntzZXQ6ZCxleHByOmF9fSxrLmZpbHRlcj1mdW5jdGlvbihhLGMsZCxlKXt2YXIgZixnLGg9YSxpPVtdLGo9YyxtPWMmJmNbMF0mJmsuaXNYTUwoY1swXSk7d2hpbGUoYSYmYy5sZW5ndGgpe2Zvcih2YXIgbiBpbiBsLmZpbHRlcilpZigoZj1sLmxlZnRNYXRjaFtuXS5leGVjKGEpKSE9bnVsbCYmZlsyXSl7dmFyIG8scCxxPWwuZmlsdGVyW25dLHI9ZlsxXTtnPSExLGYuc3BsaWNlKDEsMSk7aWYoci5zdWJzdHIoci5sZW5ndGgtMSk9PT0iXFwiKWNvbnRpbnVlO2o9PT1pJiYoaT1bXSk7aWYobC5wcmVGaWx0ZXJbbl0pe2Y9bC5wcmVGaWx0ZXJbbl0oZixqLGQsaSxlLG0pO2lmKCFmKWc9bz0hMDtlbHNlIGlmKGY9PT0hMCljb250aW51ZX1pZihmKWZvcih2YXIgcz0wOyhwPWpbc10pIT1udWxsO3MrKylpZihwKXtvPXEocCxmLHMsaik7dmFyIHQ9ZV4hIW87ZCYmbyE9bnVsbD90P2c9ITA6altzXT0hMTp0JiYoaS5wdXNoKHApLGc9ITApfWlmKG8hPT1iKXtkfHwoaj1pKSxhPWEucmVwbGFjZShsLm1hdGNoW25dLCIiKTtpZighZylyZXR1cm5bXTticmVha319aWYoYT09PWgpaWYoZz09bnVsbClrLmVycm9yKGEpO2Vsc2UgYnJlYWs7aD1hfXJldHVybiBqfSxrLmVycm9yPWZ1bmN0aW9uKGEpe3Rocm93IlN5bnRheCBlcnJvciwgdW5yZWNvZ25pemVkIGV4cHJlc3Npb246ICIrYX07dmFyIGw9ay5zZWxlY3RvcnM9e29yZGVyOlsiSUQiLCJOQU1FIiwiVEFHIl0sbWF0Y2g6e0lEOi8jKCg/Oltcd1x1MDBjMC1cdUZGRkZcLV18XFwuKSspLyxDTEFTUzovXC4oKD86W1x3XHUwMGMwLVx1RkZGRlwtXXxcXC4pKykvLE5BTUU6L1xbbmFtZT1bJyJdKigoPzpbXHdcdTAwYzAtXHVGRkZGXC1dfFxcLikrKVsnIl0qXF0vLEFUVFI6L1xbXHMqKCg/Oltcd1x1MDBjMC1cdUZGRkZcLV18XFwuKSspXHMqKD86KFxTPz0pXHMqKD86KFsnIl0pKC4qPylcM3woIz8oPzpbXHdcdTAwYzAtXHVGRkZGXC1dfFxcLikqKXwpfClccypcXS8sVEFHOi9eKCg/Oltcd1x1MDBjMC1cdUZGRkZcKlwtXXxcXC4pKykvLENISUxEOi86KG9ubHl8bnRofGxhc3R8Zmlyc3QpLWNoaWxkKD86XChccyooZXZlbnxvZGR8KD86WytcLV0/XGQrfCg/OlsrXC1dP1xkKik/blxzKig/OlsrXC1dXHMqXGQrKT8pKVxzKlwpKT8vLFBPUzovOihudGh8ZXF8Z3R8bHR8Zmlyc3R8bGFzdHxldmVufG9kZCkoPzpcKChcZCopXCkpPyg/PVteXC1dfCQpLyxQU0VVRE86LzooKD86W1x3XHUwMGMwLVx1RkZGRlwtXXxcXC4pKykoPzpcKChbJyJdPykoKD86XChbXlwpXStcKXxbXlwoXCldKikrKVwyXCkpPy99LGxlZnRNYXRjaDp7fSxhdHRyTWFwOnsiY2xhc3MiOiJjbGFzc05hbWUiLCJmb3IiOiJodG1sRm9yIn0sYXR0ckhhbmRsZTp7aHJlZjpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoImhyZWYiKX0sdHlwZTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInR5cGUiKX19LHJlbGF0aXZlOnsiKyI6ZnVuY3Rpb24oYSxiKXt2YXIgYz10eXBlb2YgYj09InN0cmluZyIsZD1jJiYhai50ZXN0KGIpLGU9YyYmIWQ7ZCYmKGI9Yi50b0xvd2VyQ2FzZSgpKTtmb3IodmFyIGY9MCxnPWEubGVuZ3RoLGg7ZjxnO2YrKylpZihoPWFbZl0pe3doaWxlKChoPWgucHJldmlvdXNTaWJsaW5nKSYmaC5ub2RlVHlwZSE9PTEpO2FbZl09ZXx8aCYmaC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09Yj9ofHwhMTpoPT09Yn1lJiZrLmZpbHRlcihiLGEsITApfSwiPiI6ZnVuY3Rpb24oYSxiKXt2YXIgYyxkPXR5cGVvZiBiPT0ic3RyaW5nIixlPTAsZj1hLmxlbmd0aDtpZihkJiYhai50ZXN0KGIpKXtiPWIudG9Mb3dlckNhc2UoKTtmb3IoO2U8ZjtlKyspe2M9YVtlXTtpZihjKXt2YXIgZz1jLnBhcmVudE5vZGU7YVtlXT1nLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1iP2c6ITF9fX1lbHNle2Zvcig7ZTxmO2UrKyljPWFbZV0sYyYmKGFbZV09ZD9jLnBhcmVudE5vZGU6Yy5wYXJlbnROb2RlPT09Yik7ZCYmay5maWx0ZXIoYixhLCEwKX19LCIiOmZ1bmN0aW9uKGEsYixjKXt2YXIgZSxmPWQrKyxnPXU7dHlwZW9mIGI9PSJzdHJpbmciJiYhai50ZXN0KGIpJiYoYj1iLnRvTG93ZXJDYXNlKCksZT1iLGc9dCksZygicGFyZW50Tm9kZSIsYixmLGEsZSxjKX0sIn4iOmZ1bmN0aW9uKGEsYixjKXt2YXIgZSxmPWQrKyxnPXU7dHlwZW9mIGI9PSJzdHJpbmciJiYhai50ZXN0KGIpJiYoYj1iLnRvTG93ZXJDYXNlKCksZT1iLGc9dCksZygicHJldmlvdXNTaWJsaW5nIixiLGYsYSxlLGMpfX0sZmluZDp7SUQ6ZnVuY3Rpb24oYSxiLGMpe2lmKHR5cGVvZiBiLmdldEVsZW1lbnRCeUlkIT0idW5kZWZpbmVkIiYmIWMpe3ZhciBkPWIuZ2V0RWxlbWVudEJ5SWQoYVsxXSk7cmV0dXJuIGQmJmQucGFyZW50Tm9kZT9bZF06W119fSxOQU1FOmZ1bmN0aW9uKGEsYil7aWYodHlwZW9mIGIuZ2V0RWxlbWVudHNCeU5hbWUhPSJ1bmRlZmluZWQiKXt2YXIgYz1bXSxkPWIuZ2V0RWxlbWVudHNCeU5hbWUoYVsxXSk7Zm9yKHZhciBlPTAsZj1kLmxlbmd0aDtlPGY7ZSsrKWRbZV0uZ2V0QXR0cmlidXRlKCJuYW1lIik9PT1hWzFdJiZjLnB1c2goZFtlXSk7cmV0dXJuIGMubGVuZ3RoPT09MD9udWxsOmN9fSxUQUc6ZnVuY3Rpb24oYSxiKXtpZih0eXBlb2YgYi5nZXRFbGVtZW50c0J5VGFnTmFtZSE9InVuZGVmaW5lZCIpcmV0dXJuIGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYVsxXSl9fSxwcmVGaWx0ZXI6e0NMQVNTOmZ1bmN0aW9uKGEsYixjLGQsZSxmKXthPSIgIithWzFdLnJlcGxhY2UoaSwiIikrIiAiO2lmKGYpcmV0dXJuIGE7Zm9yKHZhciBnPTAsaDsoaD1iW2ddKSE9bnVsbDtnKyspaCYmKGVeKGguY2xhc3NOYW1lJiYoIiAiK2guY2xhc3NOYW1lKyIgIikucmVwbGFjZSgvW1x0XG5ccl0vZywiICIpLmluZGV4T2YoYSk+PTApP2N8fGQucHVzaChoKTpjJiYoYltnXT0hMSkpO3JldHVybiExfSxJRDpmdW5jdGlvbihhKXtyZXR1cm4gYVsxXS5yZXBsYWNlKGksIiIpfSxUQUc6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYVsxXS5yZXBsYWNlKGksIiIpLnRvTG93ZXJDYXNlKCl9LENISUxEOmZ1bmN0aW9uKGEpe2lmKGFbMV09PT0ibnRoIil7YVsyXXx8ay5lcnJvcihhWzBdKSxhWzJdPWFbMl0ucmVwbGFjZSgvXlwrfFxzKi9nLCIiKTt2YXIgYj0vKC0/KShcZCopKD86bihbK1wtXT9cZCopKT8vLmV4ZWMoYVsyXT09PSJldmVuIiYmIjJuInx8YVsyXT09PSJvZGQiJiYiMm4rMSJ8fCEvXEQvLnRlc3QoYVsyXSkmJiIwbisiK2FbMl18fGFbMl0pO2FbMl09YlsxXSsoYlsyXXx8MSktMCxhWzNdPWJbM10tMH1lbHNlIGFbMl0mJmsuZXJyb3IoYVswXSk7YVswXT1kKys7cmV0dXJuIGF9LEFUVFI6ZnVuY3Rpb24oYSxiLGMsZCxlLGYpe3ZhciBnPWFbMV09YVsxXS5yZXBsYWNlKGksIiIpOyFmJiZsLmF0dHJNYXBbZ10mJihhWzFdPWwuYXR0ck1hcFtnXSksYVs0XT0oYVs0XXx8YVs1XXx8IiIpLnJlcGxhY2UoaSwiIiksYVsyXT09PSJ+PSImJihhWzRdPSIgIithWzRdKyIgIik7cmV0dXJuIGF9LFBTRVVETzpmdW5jdGlvbihiLGMsZCxlLGYpe2lmKGJbMV09PT0ibm90IilpZigoYS5leGVjKGJbM10pfHwiIikubGVuZ3RoPjF8fC9eXHcvLnRlc3QoYlszXSkpYlszXT1rKGJbM10sbnVsbCxudWxsLGMpO2Vsc2V7dmFyIGc9ay5maWx0ZXIoYlszXSxjLGQsITBeZik7ZHx8ZS5wdXNoLmFwcGx5KGUsZyk7cmV0dXJuITF9ZWxzZSBpZihsLm1hdGNoLlBPUy50ZXN0KGJbMF0pfHxsLm1hdGNoLkNISUxELnRlc3QoYlswXSkpcmV0dXJuITA7cmV0dXJuIGJ9LFBPUzpmdW5jdGlvbihhKXthLnVuc2hpZnQoITApO3JldHVybiBhfX0sZmlsdGVyczp7ZW5hYmxlZDpmdW5jdGlvbihhKXtyZXR1cm4gYS5kaXNhYmxlZD09PSExJiZhLnR5cGUhPT0iaGlkZGVuIn0sZGlzYWJsZWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZGlzYWJsZWQ9PT0hMH0sY2hlY2tlZDpmdW5jdGlvbihhKXtyZXR1cm4gYS5jaGVja2VkPT09ITB9LHNlbGVjdGVkOmZ1bmN0aW9uKGEpe2EucGFyZW50Tm9kZSYmYS5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXg7cmV0dXJuIGEuc2VsZWN0ZWQ9PT0hMH0scGFyZW50OmZ1bmN0aW9uKGEpe3JldHVybiEhYS5maXJzdENoaWxkfSxlbXB0eTpmdW5jdGlvbihhKXtyZXR1cm4hYS5maXJzdENoaWxkfSxoYXM6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiEhayhjWzNdLGEpLmxlbmd0aH0saGVhZGVyOmZ1bmN0aW9uKGEpe3JldHVybi9oXGQvaS50ZXN0KGEubm9kZU5hbWUpfSx0ZXh0OmZ1bmN0aW9uKGEpe3ZhciBiPWEuZ2V0QXR0cmlidXRlKCJ0eXBlIiksYz1hLnR5cGU7cmV0dXJuIGEubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PSJpbnB1dCImJiJ0ZXh0Ij09PWMmJihiPT09Y3x8Yj09PW51bGwpfSxyYWRpbzpmdW5jdGlvbihhKXtyZXR1cm4gYS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09ImlucHV0IiYmInJhZGlvIj09PWEudHlwZX0sY2hlY2tib3g6ZnVuY3Rpb24oYSl7cmV0dXJuIGEubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PSJpbnB1dCImJiJjaGVja2JveCI9PT1hLnR5cGV9LGZpbGU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PSJpbnB1dCImJiJmaWxlIj09PWEudHlwZX0scGFzc3dvcmQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PSJpbnB1dCImJiJwYXNzd29yZCI9PT1hLnR5cGV9LHN1Ym1pdDpmdW5jdGlvbihhKXt2YXIgYj1hLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuKGI9PT0iaW5wdXQifHxiPT09ImJ1dHRvbiIpJiYic3VibWl0Ij09PWEudHlwZX0saW1hZ2U6ZnVuY3Rpb24oYSl7cmV0dXJuIGEubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PSJpbnB1dCImJiJpbWFnZSI9PT1hLnR5cGV9LHJlc2V0OmZ1bmN0aW9uKGEpe3ZhciBiPWEubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4oYj09PSJpbnB1dCJ8fGI9PT0iYnV0dG9uIikmJiJyZXNldCI9PT1hLnR5cGV9LGJ1dHRvbjpmdW5jdGlvbihhKXt2YXIgYj1hLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuIGI9PT0iaW5wdXQiJiYiYnV0dG9uIj09PWEudHlwZXx8Yj09PSJidXR0b24ifSxpbnB1dDpmdW5jdGlvbihhKXtyZXR1cm4vaW5wdXR8c2VsZWN0fHRleHRhcmVhfGJ1dHRvbi9pLnRlc3QoYS5ub2RlTmFtZSl9LGZvY3VzOmZ1bmN0aW9uKGEpe3JldHVybiBhPT09YS5vd25lckRvY3VtZW50LmFjdGl2ZUVsZW1lbnR9fSxzZXRGaWx0ZXJzOntmaXJzdDpmdW5jdGlvbihhLGIpe3JldHVybiBiPT09MH0sbGFzdDpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gYj09PWQubGVuZ3RoLTF9LGV2ZW46ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYiUyPT09MH0sb2RkOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGIlMj09PTF9LGx0OmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gYjxjWzNdLTB9LGd0OmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gYj5jWzNdLTB9LG50aDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGNbM10tMD09PWJ9LGVxOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gY1szXS0wPT09Yn19LGZpbHRlcjp7UFNFVURPOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPWJbMV0sZj1sLmZpbHRlcnNbZV07aWYoZilyZXR1cm4gZihhLGMsYixkKTtpZihlPT09ImNvbnRhaW5zIilyZXR1cm4oYS50ZXh0Q29udGVudHx8YS5pbm5lclRleHR8fGsuZ2V0VGV4dChbYV0pfHwiIikuaW5kZXhPZihiWzNdKT49MDtpZihlPT09Im5vdCIpe3ZhciBnPWJbM107Zm9yKHZhciBoPTAsaT1nLmxlbmd0aDtoPGk7aCsrKWlmKGdbaF09PT1hKXJldHVybiExO3JldHVybiEwfWsuZXJyb3IoZSl9LENISUxEOmZ1bmN0aW9uKGEsYil7dmFyIGM9YlsxXSxkPWE7c3dpdGNoKGMpe2Nhc2Uib25seSI6Y2FzZSJmaXJzdCI6d2hpbGUoZD1kLnByZXZpb3VzU2libGluZylpZihkLm5vZGVUeXBlPT09MSlyZXR1cm4hMTtpZihjPT09ImZpcnN0IilyZXR1cm4hMDtkPWE7Y2FzZSJsYXN0Ijp3aGlsZShkPWQubmV4dFNpYmxpbmcpaWYoZC5ub2RlVHlwZT09PTEpcmV0dXJuITE7cmV0dXJuITA7Y2FzZSJudGgiOnZhciBlPWJbMl0sZj1iWzNdO2lmKGU9PT0xJiZmPT09MClyZXR1cm4hMDt2YXIgZz1iWzBdLGg9YS5wYXJlbnROb2RlO2lmKGgmJihoLnNpemNhY2hlIT09Z3x8IWEubm9kZUluZGV4KSl7dmFyIGk9MDtmb3IoZD1oLmZpcnN0Q2hpbGQ7ZDtkPWQubmV4dFNpYmxpbmcpZC5ub2RlVHlwZT09PTEmJihkLm5vZGVJbmRleD0rK2kpO2guc2l6Y2FjaGU9Z312YXIgaj1hLm5vZGVJbmRleC1mO3JldHVybiBlPT09MD9qPT09MDpqJWU9PT0wJiZqL2U+PTB9fSxJRDpmdW5jdGlvbihhLGIpe3JldHVybiBhLm5vZGVUeXBlPT09MSYmYS5nZXRBdHRyaWJ1dGUoImlkIik9PT1ifSxUQUc6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYj09PSIqIiYmYS5ub2RlVHlwZT09PTF8fGEubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PWJ9LENMQVNTOmZ1bmN0aW9uKGEsYil7cmV0dXJuKCIgIisoYS5jbGFzc05hbWV8fGEuZ2V0QXR0cmlidXRlKCJjbGFzcyIpKSsiICIpLmluZGV4T2YoYik+LTF9LEFUVFI6ZnVuY3Rpb24oYSxiKXt2YXIgYz1iWzFdLGQ9bC5hdHRySGFuZGxlW2NdP2wuYXR0ckhhbmRsZVtjXShhKTphW2NdIT1udWxsP2FbY106YS5nZXRBdHRyaWJ1dGUoYyksZT1kKyIiLGY9YlsyXSxnPWJbNF07cmV0dXJuIGQ9PW51bGw/Zj09PSIhPSI6Zj09PSI9Ij9lPT09ZzpmPT09Iio9Ij9lLmluZGV4T2YoZyk+PTA6Zj09PSJ+PSI/KCIgIitlKyIgIikuaW5kZXhPZihnKT49MDpnP2Y9PT0iIT0iP2UhPT1nOmY9PT0iXj0iP2UuaW5kZXhPZihnKT09PTA6Zj09PSIkPSI/ZS5zdWJzdHIoZS5sZW5ndGgtZy5sZW5ndGgpPT09ZzpmPT09Inw9Ij9lPT09Z3x8ZS5zdWJzdHIoMCxnLmxlbmd0aCsxKT09PWcrIi0iOiExOmUmJmQhPT0hMX0sUE9TOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPWJbMl0sZj1sLnNldEZpbHRlcnNbZV07aWYoZilyZXR1cm4gZihhLGMsYixkKX19fSxtPWwubWF0Y2guUE9TLG49ZnVuY3Rpb24oYSxiKXtyZXR1cm4iXFwiKyhiLTArMSl9O2Zvcih2YXIgbyBpbiBsLm1hdGNoKWwubWF0Y2hbb109bmV3IFJlZ0V4cChsLm1hdGNoW29dLnNvdXJjZSsvKD8hW15cW10qXF0pKD8hW15cKF0qXCkpLy5zb3VyY2UpLGwubGVmdE1hdGNoW29dPW5ldyBSZWdFeHAoLyheKD86LnxccnxcbikqPykvLnNvdXJjZStsLm1hdGNoW29dLnNvdXJjZS5yZXBsYWNlKC9cXChcZCspL2csbikpO3ZhciBwPWZ1bmN0aW9uKGEsYil7YT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhLDApO2lmKGIpe2IucHVzaC5hcHBseShiLGEpO3JldHVybiBifXJldHVybiBhfTt0cnl7QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYy5kb2N1bWVudEVsZW1lbnQuY2hpbGROb2RlcywwKVswXS5ub2RlVHlwZX1jYXRjaChxKXtwPWZ1bmN0aW9uKGEsYil7dmFyIGM9MCxkPWJ8fFtdO2lmKGUuY2FsbChhKT09PSJbb2JqZWN0IEFycmF5XSIpQXJyYXkucHJvdG90eXBlLnB1c2guYXBwbHkoZCxhKTtlbHNlIGlmKHR5cGVvZiBhLmxlbmd0aD09Im51bWJlciIpZm9yKHZhciBmPWEubGVuZ3RoO2M8ZjtjKyspZC5wdXNoKGFbY10pO2Vsc2UgZm9yKDthW2NdO2MrKylkLnB1c2goYVtjXSk7cmV0dXJuIGR9fXZhciByLHM7Yy5kb2N1bWVudEVsZW1lbnQuY29tcGFyZURvY3VtZW50UG9zaXRpb24/cj1mdW5jdGlvbihhLGIpe2lmKGE9PT1iKXtnPSEwO3JldHVybiAwfWlmKCFhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9ufHwhYi5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbilyZXR1cm4gYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbj8tMToxO3JldHVybiBhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGIpJjQ/LTE6MX06KHI9ZnVuY3Rpb24oYSxiKXtpZihhPT09Yil7Zz0hMDtyZXR1cm4gMH1pZihhLnNvdXJjZUluZGV4JiZiLnNvdXJjZUluZGV4KXJldHVybiBhLnNvdXJjZUluZGV4LWIuc291cmNlSW5kZXg7dmFyIGMsZCxlPVtdLGY9W10saD1hLnBhcmVudE5vZGUsaT1iLnBhcmVudE5vZGUsaj1oO2lmKGg9PT1pKXJldHVybiBzKGEsYik7aWYoIWgpcmV0dXJuLTE7aWYoIWkpcmV0dXJuIDE7d2hpbGUoaillLnVuc2hpZnQoaiksaj1qLnBhcmVudE5vZGU7aj1pO3doaWxlKGopZi51bnNoaWZ0KGopLGo9ai5wYXJlbnROb2RlO2M9ZS5sZW5ndGgsZD1mLmxlbmd0aDtmb3IodmFyIGs9MDtrPGMmJms8ZDtrKyspaWYoZVtrXSE9PWZba10pcmV0dXJuIHMoZVtrXSxmW2tdKTtyZXR1cm4gaz09PWM/cyhhLGZba10sLTEpOnMoZVtrXSxiLDEpfSxzPWZ1bmN0aW9uKGEsYixjKXtpZihhPT09YilyZXR1cm4gYzt2YXIgZD1hLm5leHRTaWJsaW5nO3doaWxlKGQpe2lmKGQ9PT1iKXJldHVybi0xO2Q9ZC5uZXh0U2libGluZ31yZXR1cm4gMX0pLGsuZ2V0VGV4dD1mdW5jdGlvbihhKXt2YXIgYj0iIixjO2Zvcih2YXIgZD0wO2FbZF07ZCsrKWM9YVtkXSxjLm5vZGVUeXBlPT09M3x8Yy5ub2RlVHlwZT09PTQ/Yis9Yy5ub2RlVmFsdWU6Yy5ub2RlVHlwZSE9PTgmJihiKz1rLmdldFRleHQoYy5jaGlsZE5vZGVzKSk7cmV0dXJuIGJ9LGZ1bmN0aW9uKCl7dmFyIGE9Yy5jcmVhdGVFbGVtZW50KCJkaXYiKSxkPSJzY3JpcHQiKyhuZXcgRGF0ZSkuZ2V0VGltZSgpLGU9Yy5kb2N1bWVudEVsZW1lbnQ7YS5pbm5lckhUTUw9IjxhIG5hbWU9JyIrZCsiJy8+IixlLmluc2VydEJlZm9yZShhLGUuZmlyc3RDaGlsZCksYy5nZXRFbGVtZW50QnlJZChkKSYmKGwuZmluZC5JRD1mdW5jdGlvbihhLGMsZCl7aWYodHlwZW9mIGMuZ2V0RWxlbWVudEJ5SWQhPSJ1bmRlZmluZWQiJiYhZCl7dmFyIGU9Yy5nZXRFbGVtZW50QnlJZChhWzFdKTtyZXR1cm4gZT9lLmlkPT09YVsxXXx8dHlwZW9mIGUuZ2V0QXR0cmlidXRlTm9kZSE9InVuZGVmaW5lZCImJmUuZ2V0QXR0cmlidXRlTm9kZSgiaWQiKS5ub2RlVmFsdWU9PT1hWzFdP1tlXTpiOltdfX0sbC5maWx0ZXIuSUQ9ZnVuY3Rpb24oYSxiKXt2YXIgYz10eXBlb2YgYS5nZXRBdHRyaWJ1dGVOb2RlIT0idW5kZWZpbmVkIiYmYS5nZXRBdHRyaWJ1dGVOb2RlKCJpZCIpO3JldHVybiBhLm5vZGVUeXBlPT09MSYmYyYmYy5ub2RlVmFsdWU9PT1ifSksZS5yZW1vdmVDaGlsZChhKSxlPWE9bnVsbH0oKSxmdW5jdGlvbigpe3ZhciBhPWMuY3JlYXRlRWxlbWVudCgiZGl2Iik7YS5hcHBlbmRDaGlsZChjLmNyZWF0ZUNvbW1lbnQoIiIpKSxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikubGVuZ3RoPjAmJihsLmZpbmQuVEFHPWZ1bmN0aW9uKGEsYil7dmFyIGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZShhWzFdKTtpZihhWzFdPT09IioiKXt2YXIgZD1bXTtmb3IodmFyIGU9MDtjW2VdO2UrKyljW2VdLm5vZGVUeXBlPT09MSYmZC5wdXNoKGNbZV0pO2M9ZH1yZXR1cm4gY30pLGEuaW5uZXJIVE1MPSI8YSBocmVmPScjJz48L2E+IixhLmZpcnN0Q2hpbGQmJnR5cGVvZiBhLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlIT0idW5kZWZpbmVkIiYmYS5maXJzdENoaWxkLmdldEF0dHJpYnV0ZSgiaHJlZiIpIT09IiMiJiYobC5hdHRySGFuZGxlLmhyZWY9ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJocmVmIiwyKX0pLGE9bnVsbH0oKSxjLnF1ZXJ5U2VsZWN0b3JBbGwmJmZ1bmN0aW9uKCl7dmFyIGE9ayxiPWMuY3JlYXRlRWxlbWVudCgiZGl2IiksZD0iX19zaXp6bGVfXyI7Yi5pbm5lckhUTUw9IjxwIGNsYXNzPSdURVNUJz48L3A+IjtpZighYi5xdWVyeVNlbGVjdG9yQWxsfHxiLnF1ZXJ5U2VsZWN0b3JBbGwoIi5URVNUIikubGVuZ3RoIT09MCl7az1mdW5jdGlvbihiLGUsZixnKXtlPWV8fGM7aWYoIWcmJiFrLmlzWE1MKGUpKXt2YXIgaD0vXihcdyskKXxeXC4oW1x3XC1dKyQpfF4jKFtcd1wtXSskKS8uZXhlYyhiKTtpZihoJiYoZS5ub2RlVHlwZT09PTF8fGUubm9kZVR5cGU9PT05KSl7aWYoaFsxXSlyZXR1cm4gcChlLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLGYpO2lmKGhbMl0mJmwuZmluZC5DTEFTUyYmZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKXJldHVybiBwKGUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShoWzJdKSxmKX1pZihlLm5vZGVUeXBlPT09OSl7aWYoYj09PSJib2R5IiYmZS5ib2R5KXJldHVybiBwKFtlLmJvZHldLGYpO2lmKGgmJmhbM10pe3ZhciBpPWUuZ2V0RWxlbWVudEJ5SWQoaFszXSk7aWYoIWl8fCFpLnBhcmVudE5vZGUpcmV0dXJuIHAoW10sZik7aWYoaS5pZD09PWhbM10pcmV0dXJuIHAoW2ldLGYpfXRyeXtyZXR1cm4gcChlLnF1ZXJ5U2VsZWN0b3JBbGwoYiksZil9Y2F0Y2goail7fX1lbHNlIGlmKGUubm9kZVR5cGU9PT0xJiZlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkhPT0ib2JqZWN0Iil7dmFyIG09ZSxuPWUuZ2V0QXR0cmlidXRlKCJpZCIpLG89bnx8ZCxxPWUucGFyZW50Tm9kZSxyPS9eXHMqWyt+XS8udGVzdChiKTtuP289by5yZXBsYWNlKC8nL2csIlxcJCYiKTplLnNldEF0dHJpYnV0ZSgiaWQiLG8pLHImJnEmJihlPWUucGFyZW50Tm9kZSk7dHJ5e2lmKCFyfHxxKXJldHVybiBwKGUucXVlcnlTZWxlY3RvckFsbCgiW2lkPSciK28rIiddICIrYiksZil9Y2F0Y2gocyl7fWZpbmFsbHl7bnx8bS5yZW1vdmVBdHRyaWJ1dGUoImlkIil9fX1yZXR1cm4gYShiLGUsZixnKX07Zm9yKHZhciBlIGluIGEpa1tlXT1hW2VdO2I9bnVsbH19KCksZnVuY3Rpb24oKXt2YXIgYT1jLmRvY3VtZW50RWxlbWVudCxiPWEubWF0Y2hlc1NlbGVjdG9yfHxhLm1vek1hdGNoZXNTZWxlY3Rvcnx8YS53ZWJraXRNYXRjaGVzU2VsZWN0b3J8fGEubXNNYXRjaGVzU2VsZWN0b3I7aWYoYil7dmFyIGQ9IWIuY2FsbChjLmNyZWF0ZUVsZW1lbnQoImRpdiIpLCJkaXYiKSxlPSExO3RyeXtiLmNhbGwoYy5kb2N1bWVudEVsZW1lbnQsIlt0ZXN0IT0nJ106c2l6emxlIil9Y2F0Y2goZil7ZT0hMH1rLm1hdGNoZXNTZWxlY3Rvcj1mdW5jdGlvbihhLGMpe2M9Yy5yZXBsYWNlKC9cPVxzKihbXiciXF1dKilccypcXS9nLCI9JyQxJ10iKTtpZighay5pc1hNTChhKSl0cnl7aWYoZXx8IWwubWF0Y2guUFNFVURPLnRlc3QoYykmJiEvIT0vLnRlc3QoYykpe3ZhciBmPWIuY2FsbChhLGMpO2lmKGZ8fCFkfHxhLmRvY3VtZW50JiZhLmRvY3VtZW50Lm5vZGVUeXBlIT09MTEpcmV0dXJuIGZ9fWNhdGNoKGcpe31yZXR1cm4gayhjLG51bGwsbnVsbCxbYV0pLmxlbmd0aD4wfX19KCksZnVuY3Rpb24oKXt2YXIgYT1jLmNyZWF0ZUVsZW1lbnQoImRpdiIpO2EuaW5uZXJIVE1MPSI8ZGl2IGNsYXNzPSd0ZXN0IGUnPjwvZGl2PjxkaXYgY2xhc3M9J3Rlc3QnPjwvZGl2PiI7aWYoISFhLmdldEVsZW1lbnRzQnlDbGFzc05hbWUmJmEuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiZSIpLmxlbmd0aCE9PTApe2EubGFzdENoaWxkLmNsYXNzTmFtZT0iZSI7aWYoYS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJlIikubGVuZ3RoPT09MSlyZXR1cm47bC5vcmRlci5zcGxpY2UoMSwwLCJDTEFTUyIpLGwuZmluZC5DTEFTUz1mdW5jdGlvbihhLGIsYyl7aWYodHlwZW9mIGIuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSE9InVuZGVmaW5lZCImJiFjKXJldHVybiBiLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoYVsxXSl9LGE9bnVsbH19KCksYy5kb2N1bWVudEVsZW1lbnQuY29udGFpbnM/ay5jb250YWlucz1mdW5jdGlvbihhLGIpe3JldHVybiBhIT09YiYmKGEuY29udGFpbnM/YS5jb250YWlucyhiKTohMCl9OmMuZG9jdW1lbnRFbGVtZW50LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uP2suY29udGFpbnM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4hIShhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGIpJjE2KX06ay5jb250YWlucz1mdW5jdGlvbigpe3JldHVybiExfSxrLmlzWE1MPWZ1bmN0aW9uKGEpe3ZhciBiPShhP2Eub3duZXJEb2N1bWVudHx8YTowKS5kb2N1bWVudEVsZW1lbnQ7cmV0dXJuIGI/Yi5ub2RlTmFtZSE9PSJIVE1MIjohMX07dmFyIHY9ZnVuY3Rpb24oYSxiKXt2YXIgYyxkPVtdLGU9IiIsZj1iLm5vZGVUeXBlP1tiXTpiO3doaWxlKGM9bC5tYXRjaC5QU0VVRE8uZXhlYyhhKSllKz1jWzBdLGE9YS5yZXBsYWNlKGwubWF0Y2guUFNFVURPLCIiKTthPWwucmVsYXRpdmVbYV0/YSsiKiI6YTtmb3IodmFyIGc9MCxoPWYubGVuZ3RoO2c8aDtnKyspayhhLGZbZ10sZCk7cmV0dXJuIGsuZmlsdGVyKGUsZCl9O2YuZmluZD1rLGYuZXhwcj1rLnNlbGVjdG9ycyxmLmV4cHJbIjoiXT1mLmV4cHIuZmlsdGVycyxmLnVuaXF1ZT1rLnVuaXF1ZVNvcnQsZi50ZXh0PWsuZ2V0VGV4dCxmLmlzWE1MRG9jPWsuaXNYTUwsZi5jb250YWlucz1rLmNvbnRhaW5zfSgpO3ZhciBOPS9VbnRpbCQvLE89L14oPzpwYXJlbnRzfHByZXZVbnRpbHxwcmV2QWxsKS8sUD0vLC8sUT0vXi5bXjojXFtcLixdKiQvLFI9QXJyYXkucHJvdG90eXBlLnNsaWNlLFM9Zi5leHByLm1hdGNoLlBPUyxUPXtjaGlsZHJlbjohMCxjb250ZW50czohMCxuZXh0OiEwLHByZXY6ITB9O2YuZm4uZXh0ZW5kKHtmaW5kOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMsYyxkO2lmKHR5cGVvZiBhIT0ic3RyaW5nIilyZXR1cm4gZihhKS5maWx0ZXIoZnVuY3Rpb24oKXtmb3IoYz0wLGQ9Yi5sZW5ndGg7YzxkO2MrKylpZihmLmNvbnRhaW5zKGJbY10sdGhpcykpcmV0dXJuITB9KTt2YXIgZT10aGlzLnB1c2hTdGFjaygiIiwiZmluZCIsYSksZyxoLGk7Zm9yKGM9MCxkPXRoaXMubGVuZ3RoO2M8ZDtjKyspe2c9ZS5sZW5ndGgsZi5maW5kKGEsdGhpc1tjXSxlKTtpZihjPjApZm9yKGg9ZztoPGUubGVuZ3RoO2grKylmb3IoaT0wO2k8ZztpKyspaWYoZVtpXT09PWVbaF0pe2Uuc3BsaWNlKGgtLSwxKTticmVha319cmV0dXJuIGV9LGhhczpmdW5jdGlvbihhKXt2YXIgYj1mKGEpO3JldHVybiB0aGlzLmZpbHRlcihmdW5jdGlvbigpe2Zvcih2YXIgYT0wLGM9Yi5sZW5ndGg7YTxjO2ErKylpZihmLmNvbnRhaW5zKHRoaXMsYlthXSkpcmV0dXJuITB9KX0sbm90OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnB1c2hTdGFjayhWKHRoaXMsYSwhMSksIm5vdCIsYSl9LGZpbHRlcjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soVih0aGlzLGEsITApLCJmaWx0ZXIiLGEpfSxpczpmdW5jdGlvbihhKXtyZXR1cm4hIWEmJih0eXBlb2YgYT09InN0cmluZyI/Zi5maWx0ZXIoYSx0aGlzKS5sZW5ndGg+MDp0aGlzLmZpbHRlcihhKS5sZW5ndGg+MCl9LGNsb3Nlc3Q6ZnVuY3Rpb24oYSxiKXt2YXIgYz1bXSxkLGUsZz10aGlzWzBdO2lmKGYuaXNBcnJheShhKSl7dmFyIGgsaSxqPXt9LGs9MTtpZihnJiZhLmxlbmd0aCl7Zm9yKGQ9MCxlPWEubGVuZ3RoO2Q8ZTtkKyspaT1hW2RdLGpbaV18fChqW2ldPVMudGVzdChpKT9mKGksYnx8dGhpcy5jb250ZXh0KTppKTt3aGlsZShnJiZnLm93bmVyRG9jdW1lbnQmJmchPT1iKXtmb3IoaSBpbiBqKWg9altpXSwoaC5qcXVlcnk/aC5pbmRleChnKT4tMTpmKGcpLmlzKGgpKSYmYy5wdXNoKHtzZWxlY3RvcjppLGVsZW06ZyxsZXZlbDprfSk7Zz1nLnBhcmVudE5vZGUsaysrfX1yZXR1cm4gY312YXIgbD1TLnRlc3QoYSl8fHR5cGVvZiBhIT0ic3RyaW5nIj9mKGEsYnx8dGhpcy5jb250ZXh0KTowO2ZvcihkPTAsZT10aGlzLmxlbmd0aDtkPGU7ZCsrKXtnPXRoaXNbZF07d2hpbGUoZyl7aWYobD9sLmluZGV4KGcpPi0xOmYuZmluZC5tYXRjaGVzU2VsZWN0b3IoZyxhKSl7Yy5wdXNoKGcpO2JyZWFrfWc9Zy5wYXJlbnROb2RlO2lmKCFnfHwhZy5vd25lckRvY3VtZW50fHxnPT09Ynx8Zy5ub2RlVHlwZT09PTExKWJyZWFrfX1jPWMubGVuZ3RoPjE/Zi51bmlxdWUoYyk6YztyZXR1cm4gdGhpcy5wdXNoU3RhY2soYywiY2xvc2VzdCIsYSl9LGluZGV4OmZ1bmN0aW9uKGEpe2lmKCFhKXJldHVybiB0aGlzWzBdJiZ0aGlzWzBdLnBhcmVudE5vZGU/dGhpcy5wcmV2QWxsKCkubGVuZ3RoOi0xO2lmKHR5cGVvZiBhPT0ic3RyaW5nIilyZXR1cm4gZi5pbkFycmF5KHRoaXNbMF0sZihhKSk7cmV0dXJuIGYuaW5BcnJheShhLmpxdWVyeT9hWzBdOmEsdGhpcyl9LGFkZDpmdW5jdGlvbihhLGIpe3ZhciBjPXR5cGVvZiBhPT0ic3RyaW5nIj9mKGEsYik6Zi5tYWtlQXJyYXkoYSYmYS5ub2RlVHlwZT9bYV06YSksZD1mLm1lcmdlKHRoaXMuZ2V0KCksYyk7cmV0dXJuIHRoaXMucHVzaFN0YWNrKFUoY1swXSl8fFUoZFswXSk/ZDpmLnVuaXF1ZShkKSl9LGFuZFNlbGY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hZGQodGhpcy5wcmV2T2JqZWN0KX19KSxmLmVhY2goe3BhcmVudDpmdW5jdGlvbihhKXt2YXIgYj1hLnBhcmVudE5vZGU7cmV0dXJuIGImJmIubm9kZVR5cGUhPT0xMT9iOm51bGx9LHBhcmVudHM6ZnVuY3Rpb24oYSl7cmV0dXJuIGYuZGlyKGEsInBhcmVudE5vZGUiKX0scGFyZW50c1VudGlsOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gZi5kaXIoYSwicGFyZW50Tm9kZSIsYyl9LG5leHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGYubnRoKGEsMiwibmV4dFNpYmxpbmciKX0scHJldjpmdW5jdGlvbihhKXtyZXR1cm4gZi5udGgoYSwyLCJwcmV2aW91c1NpYmxpbmciKX0sbmV4dEFsbDpmdW5jdGlvbihhKXtyZXR1cm4gZi5kaXIoYSwibmV4dFNpYmxpbmciKX0scHJldkFsbDpmdW5jdGlvbihhKXtyZXR1cm4gZi5kaXIoYSwicHJldmlvdXNTaWJsaW5nIil9LG5leHRVbnRpbDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGYuZGlyKGEsIm5leHRTaWJsaW5nIixjKX0scHJldlVudGlsOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gZi5kaXIoYSwicHJldmlvdXNTaWJsaW5nIixjKX0sc2libGluZ3M6ZnVuY3Rpb24oYSl7cmV0dXJuIGYuc2libGluZyhhLnBhcmVudE5vZGUuZmlyc3RDaGlsZCxhKX0sY2hpbGRyZW46ZnVuY3Rpb24oYSl7cmV0dXJuIGYuc2libGluZyhhLmZpcnN0Q2hpbGQpfSxjb250ZW50czpmdW5jdGlvbihhKXtyZXR1cm4gZi5ub2RlTmFtZShhLCJpZnJhbWUiKT9hLmNvbnRlbnREb2N1bWVudHx8YS5jb250ZW50V2luZG93LmRvY3VtZW50OmYubWFrZUFycmF5KGEuY2hpbGROb2Rlcyl9fSxmdW5jdGlvbihhLGIpe2YuZm5bYV09ZnVuY3Rpb24oYyxkKXt2YXIgZT1mLm1hcCh0aGlzLGIsYyksZz1SLmNhbGwoYXJndW1lbnRzKTtOLnRlc3QoYSl8fChkPWMpLGQmJnR5cGVvZiBkPT0ic3RyaW5nIiYmKGU9Zi5maWx0ZXIoZCxlKSksZT10aGlzLmxlbmd0aD4xJiYhVFthXT9mLnVuaXF1ZShlKTplLCh0aGlzLmxlbmd0aD4xfHxQLnRlc3QoZCkpJiZPLnRlc3QoYSkmJihlPWUucmV2ZXJzZSgpKTtyZXR1cm4gdGhpcy5wdXNoU3RhY2soZSxhLGcuam9pbigiLCIpKX19KSxmLmV4dGVuZCh7ZmlsdGVyOmZ1bmN0aW9uKGEsYixjKXtjJiYoYT0iOm5vdCgiK2ErIikiKTtyZXR1cm4gYi5sZW5ndGg9PT0xP2YuZmluZC5tYXRjaGVzU2VsZWN0b3IoYlswXSxhKT9bYlswXV06W106Zi5maW5kLm1hdGNoZXMoYSxiKX0sZGlyOmZ1bmN0aW9uKGEsYyxkKXt2YXIgZT1bXSxnPWFbY107d2hpbGUoZyYmZy5ub2RlVHlwZSE9PTkmJihkPT09Ynx8Zy5ub2RlVHlwZSE9PTF8fCFmKGcpLmlzKGQpKSlnLm5vZGVUeXBlPT09MSYmZS5wdXNoKGcpLGc9Z1tjXTtyZXR1cm4gZX0sbnRoOmZ1bmN0aW9uKGEsYixjLGQpe2I9Ynx8MTt2YXIgZT0wO2Zvcig7YTthPWFbY10paWYoYS5ub2RlVHlwZT09PTEmJisrZT09PWIpYnJlYWs7cmV0dXJuIGF9LHNpYmxpbmc6ZnVuY3Rpb24oYSxiKXt2YXIgYz1bXTtmb3IoO2E7YT1hLm5leHRTaWJsaW5nKWEubm9kZVR5cGU9PT0xJiZhIT09YiYmYy5wdXNoKGEpO3JldHVybiBjfX0pO3ZhciBXPS8galF1ZXJ5XGQrPSIoPzpcZCt8bnVsbCkiL2csWD0vXlxzKy8sWT0vPCg/IWFyZWF8YnJ8Y29sfGVtYmVkfGhyfGltZ3xpbnB1dHxsaW5rfG1ldGF8cGFyYW0pKChbXHc6XSspW14+XSopXC8+L2lnLFo9LzwoW1x3Ol0rKS8sJD0vPHRib2R5L2ksXz0vPHwmIz9cdys7LyxiYT0vPCg/OnNjcmlwdHxvYmplY3R8ZW1iZWR8b3B0aW9ufHN0eWxlKS9pLGJiPS9jaGVja2VkXHMqKD86W149XXw9XHMqLmNoZWNrZWQuKS9pLGJjPS9cLyhqYXZhfGVjbWEpc2NyaXB0L2ksYmQ9L15ccyo8ISg/OlxbQ0RBVEFcW3xcLVwtKS8sYmU9e29wdGlvbjpbMSwiPHNlbGVjdCBtdWx0aXBsZT0nbXVsdGlwbGUnPiIsIjwvc2VsZWN0PiJdLGxlZ2VuZDpbMSwiPGZpZWxkc2V0PiIsIjwvZmllbGRzZXQ+Il0sdGhlYWQ6WzEsIjx0YWJsZT4iLCI8L3RhYmxlPiJdLHRyOlsyLCI8dGFibGU+PHRib2R5PiIsIjwvdGJvZHk+PC90YWJsZT4iXSx0ZDpbMywiPHRhYmxlPjx0Ym9keT48dHI+IiwiPC90cj48L3Rib2R5PjwvdGFibGU+Il0sY29sOlsyLCI8dGFibGU+PHRib2R5PjwvdGJvZHk+PGNvbGdyb3VwPiIsIjwvY29sZ3JvdXA+PC90YWJsZT4iXSxhcmVhOlsxLCI8bWFwPiIsIjwvbWFwPiJdLF9kZWZhdWx0OlswLCIiLCIiXX07YmUub3B0Z3JvdXA9YmUub3B0aW9uLGJlLnRib2R5PWJlLnRmb290PWJlLmNvbGdyb3VwPWJlLmNhcHRpb249YmUudGhlYWQsYmUudGg9YmUudGQsZi5zdXBwb3J0Lmh0bWxTZXJpYWxpemV8fChiZS5fZGVmYXVsdD1bMSwiZGl2PGRpdj4iLCI8L2Rpdj4iXSksZi5mbi5leHRlbmQoe3RleHQ6ZnVuY3Rpb24oYSl7aWYoZi5pc0Z1bmN0aW9uKGEpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYil7dmFyIGM9Zih0aGlzKTtjLnRleHQoYS5jYWxsKHRoaXMsYixjLnRleHQoKSkpfSk7aWYodHlwZW9mIGEhPSJvYmplY3QiJiZhIT09YilyZXR1cm4gdGhpcy5lbXB0eSgpLmFwcGVuZCgodGhpc1swXSYmdGhpc1swXS5vd25lckRvY3VtZW50fHxjKS5jcmVhdGVUZXh0Tm9kZShhKSk7cmV0dXJuIGYudGV4dCh0aGlzKX0sd3JhcEFsbDpmdW5jdGlvbihhKXtpZihmLmlzRnVuY3Rpb24oYSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihiKXtmKHRoaXMpLndyYXBBbGwoYS5jYWxsKHRoaXMsYikpfSk7aWYodGhpc1swXSl7dmFyIGI9ZihhLHRoaXNbMF0ub3duZXJEb2N1bWVudCkuZXEoMCkuY2xvbmUoITApO3RoaXNbMF0ucGFyZW50Tm9kZSYmYi5pbnNlcnRCZWZvcmUodGhpc1swXSksYi5tYXAoZnVuY3Rpb24oKXt2YXIgYT10aGlzO3doaWxlKGEuZmlyc3RDaGlsZCYmYS5maXJzdENoaWxkLm5vZGVUeXBlPT09MSlhPWEuZmlyc3RDaGlsZDtyZXR1cm4gYX0pLmFwcGVuZCh0aGlzKX1yZXR1cm4gdGhpc30sd3JhcElubmVyOmZ1bmN0aW9uKGEpe2lmKGYuaXNGdW5jdGlvbihhKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGIpe2YodGhpcykud3JhcElubmVyKGEuY2FsbCh0aGlzLGIpKX0pO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgYj1mKHRoaXMpLGM9Yi5jb250ZW50cygpO2MubGVuZ3RoP2Mud3JhcEFsbChhKTpiLmFwcGVuZChhKX0pfSx3cmFwOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtmKHRoaXMpLndyYXBBbGwoYSl9KX0sdW53cmFwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGFyZW50KCkuZWFjaChmdW5jdGlvbigpe2Yubm9kZU5hbWUodGhpcywiYm9keSIpfHxmKHRoaXMpLnJlcGxhY2VXaXRoKHRoaXMuY2hpbGROb2Rlcyl9KS5lbmQoKX0sYXBwZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLCEwLGZ1bmN0aW9uKGEpe3RoaXMubm9kZVR5cGU9PT0xJiZ0aGlzLmFwcGVuZENoaWxkKGEpfSl9LHByZXBlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsITAsZnVuY3Rpb24oYSl7dGhpcy5ub2RlVHlwZT09PTEmJnRoaXMuaW5zZXJ0QmVmb3JlKGEsdGhpcy5maXJzdENoaWxkKX0pfSxiZWZvcmU6ZnVuY3Rpb24oKXtpZih0aGlzWzBdJiZ0aGlzWzBdLnBhcmVudE5vZGUpcmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLCExLGZ1bmN0aW9uKGEpe3RoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoYSx0aGlzKX0pO2lmKGFyZ3VtZW50cy5sZW5ndGgpe3ZhciBhPWYoYXJndW1lbnRzWzBdKTthLnB1c2guYXBwbHkoYSx0aGlzLnRvQXJyYXkoKSk7cmV0dXJuIHRoaXMucHVzaFN0YWNrKGEsImJlZm9yZSIsYXJndW1lbnRzKX19LGFmdGVyOmZ1bmN0aW9uKCl7aWYodGhpc1swXSYmdGhpc1swXS5wYXJlbnROb2RlKXJldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cywhMSxmdW5jdGlvbihhKXt0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGEsdGhpcy5uZXh0U2libGluZyl9KTtpZihhcmd1bWVudHMubGVuZ3RoKXt2YXIgYT10aGlzLnB1c2hTdGFjayh0aGlzLCJhZnRlciIsYXJndW1lbnRzKTthLnB1c2guYXBwbHkoYSxmKGFyZ3VtZW50c1swXSkudG9BcnJheSgpKTtyZXR1cm4gYX19LHJlbW92ZTpmdW5jdGlvbihhLGIpe2Zvcih2YXIgYz0wLGQ7KGQ9dGhpc1tjXSkhPW51bGw7YysrKWlmKCFhfHxmLmZpbHRlcihhLFtkXSkubGVuZ3RoKSFiJiZkLm5vZGVUeXBlPT09MSYmKGYuY2xlYW5EYXRhKGQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKSksZi5jbGVhbkRhdGEoW2RdKSksZC5wYXJlbnROb2RlJiZkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZCk7cmV0dXJuIHRoaXN9LGVtcHR5OmZ1bmN0aW9uKCl7Zm9yKHZhciBhPTAsYjsoYj10aGlzW2FdKSE9bnVsbDthKyspe2Iubm9kZVR5cGU9PT0xJiZmLmNsZWFuRGF0YShiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikpO3doaWxlKGIuZmlyc3RDaGlsZCliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCl9cmV0dXJuIHRoaXN9LGNsb25lOmZ1bmN0aW9uKGEsYil7YT1hPT1udWxsPyExOmEsYj1iPT1udWxsP2E6YjtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKXtyZXR1cm4gZi5jbG9uZSh0aGlzLGEsYil9KX0saHRtbDpmdW5jdGlvbihhKXtpZihhPT09YilyZXR1cm4gdGhpc1swXSYmdGhpc1swXS5ub2RlVHlwZT09PTE/dGhpc1swXS5pbm5lckhUTUwucmVwbGFjZShXLCIiKTpudWxsO2lmKHR5cGVvZiBhPT0ic3RyaW5nIiYmIWJhLnRlc3QoYSkmJihmLnN1cHBvcnQubGVhZGluZ1doaXRlc3BhY2V8fCFYLnRlc3QoYSkpJiYhYmVbKFouZXhlYyhhKXx8WyIiLCIiXSlbMV0udG9Mb3dlckNhc2UoKV0pe2E9YS5yZXBsYWNlKFksIjwkMT48LyQyPiIpO3RyeXtmb3IodmFyIGM9MCxkPXRoaXMubGVuZ3RoO2M8ZDtjKyspdGhpc1tjXS5ub2RlVHlwZT09PTEmJihmLmNsZWFuRGF0YSh0aGlzW2NdLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikpLHRoaXNbY10uaW5uZXJIVE1MPWEpfWNhdGNoKGUpe3RoaXMuZW1wdHkoKS5hcHBlbmQoYSl9fWVsc2UgZi5pc0Z1bmN0aW9uKGEpP3RoaXMuZWFjaChmdW5jdGlvbihiKXt2YXIgYz1mKHRoaXMpO2MuaHRtbChhLmNhbGwodGhpcyxiLGMuaHRtbCgpKSl9KTp0aGlzLmVtcHR5KCkuYXBwZW5kKGEpO3JldHVybiB0aGlzfSxyZXBsYWNlV2l0aDpmdW5jdGlvbihhKXtpZih0aGlzWzBdJiZ0aGlzWzBdLnBhcmVudE5vZGUpe2lmKGYuaXNGdW5jdGlvbihhKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGIpe3ZhciBjPWYodGhpcyksZD1jLmh0bWwoKTtjLnJlcGxhY2VXaXRoKGEuY2FsbCh0aGlzLGIsZCkpfSk7dHlwZW9mIGEhPSJzdHJpbmciJiYoYT1mKGEpLmRldGFjaCgpKTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5uZXh0U2libGluZyxjPXRoaXMucGFyZW50Tm9kZTtmKHRoaXMpLnJlbW92ZSgpLGI/ZihiKS5iZWZvcmUoYSk6ZihjKS5hcHBlbmQoYSl9KX1yZXR1cm4gdGhpcy5sZW5ndGg/dGhpcy5wdXNoU3RhY2soZihmLmlzRnVuY3Rpb24oYSk/YSgpOmEpLCJyZXBsYWNlV2l0aCIsYSk6dGhpc30sZGV0YWNoOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnJlbW92ZShhLCEwKX0sZG9tTWFuaXA6ZnVuY3Rpb24oYSxjLGQpe3ZhciBlLGcsaCxpLGo9YVswXSxrPVtdO2lmKCFmLnN1cHBvcnQuY2hlY2tDbG9uZSYmYXJndW1lbnRzLmxlbmd0aD09PTMmJnR5cGVvZiBqPT0ic3RyaW5nIiYmYmIudGVzdChqKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Zih0aGlzKS5kb21NYW5pcChhLGMsZCwhMCl9KTtpZihmLmlzRnVuY3Rpb24oaikpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihlKXt2YXIgZz1mKHRoaXMpO2FbMF09ai5jYWxsKHRoaXMsZSxjP2cuaHRtbCgpOmIpLGcuZG9tTWFuaXAoYSxjLGQpfSk7aWYodGhpc1swXSl7aT1qJiZqLnBhcmVudE5vZGUsZi5zdXBwb3J0LnBhcmVudE5vZGUmJmkmJmkubm9kZVR5cGU9PT0xMSYmaS5jaGlsZE5vZGVzLmxlbmd0aD09PXRoaXMubGVuZ3RoP2U9e2ZyYWdtZW50Oml9OmU9Zi5idWlsZEZyYWdtZW50KGEsdGhpcyxrKSxoPWUuZnJhZ21lbnQsaC5jaGlsZE5vZGVzLmxlbmd0aD09PTE/Zz1oPWguZmlyc3RDaGlsZDpnPWguZmlyc3RDaGlsZDtpZihnKXtjPWMmJmYubm9kZU5hbWUoZywidHIiKTtmb3IodmFyIGw9MCxtPXRoaXMubGVuZ3RoLG49bS0xO2w8bTtsKyspZC5jYWxsKGM/YmYodGhpc1tsXSxnKTp0aGlzW2xdLGUuY2FjaGVhYmxlfHxtPjEmJmw8bj9mLmNsb25lKGgsITAsITApOmgpfWsubGVuZ3RoJiZmLmVhY2goayxibCl9cmV0dXJuIHRoaXN9fSksZi5idWlsZEZyYWdtZW50PWZ1bmN0aW9uKGEsYixkKXt2YXIgZSxnLGgsaTtiJiZiWzBdJiYoaT1iWzBdLm93bmVyRG9jdW1lbnR8fGJbMF0pLGkuY3JlYXRlRG9jdW1lbnRGcmFnbWVudHx8KGk9YyksYS5sZW5ndGg9PT0xJiZ0eXBlb2YgYVswXT09InN0cmluZyImJmFbMF0ubGVuZ3RoPDUxMiYmaT09PWMmJmFbMF0uY2hhckF0KDApPT09IjwiJiYhYmEudGVzdChhWzBdKSYmKGYuc3VwcG9ydC5jaGVja0Nsb25lfHwhYmIudGVzdChhWzBdKSkmJihnPSEwLGg9Zi5mcmFnbWVudHNbYVswXV0saCYmaCE9PTEmJihlPWgpKSxlfHwoZT1pLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxmLmNsZWFuCihhLGksZSxkKSksZyYmKGYuZnJhZ21lbnRzW2FbMF1dPWg/ZToxKTtyZXR1cm57ZnJhZ21lbnQ6ZSxjYWNoZWFibGU6Z319LGYuZnJhZ21lbnRzPXt9LGYuZWFjaCh7YXBwZW5kVG86ImFwcGVuZCIscHJlcGVuZFRvOiJwcmVwZW5kIixpbnNlcnRCZWZvcmU6ImJlZm9yZSIsaW5zZXJ0QWZ0ZXI6ImFmdGVyIixyZXBsYWNlQWxsOiJyZXBsYWNlV2l0aCJ9LGZ1bmN0aW9uKGEsYil7Zi5mblthXT1mdW5jdGlvbihjKXt2YXIgZD1bXSxlPWYoYyksZz10aGlzLmxlbmd0aD09PTEmJnRoaXNbMF0ucGFyZW50Tm9kZTtpZihnJiZnLm5vZGVUeXBlPT09MTEmJmcuY2hpbGROb2Rlcy5sZW5ndGg9PT0xJiZlLmxlbmd0aD09PTEpe2VbYl0odGhpc1swXSk7cmV0dXJuIHRoaXN9Zm9yKHZhciBoPTAsaT1lLmxlbmd0aDtoPGk7aCsrKXt2YXIgaj0oaD4wP3RoaXMuY2xvbmUoITApOnRoaXMpLmdldCgpO2YoZVtoXSlbYl0oaiksZD1kLmNvbmNhdChqKX1yZXR1cm4gdGhpcy5wdXNoU3RhY2soZCxhLGUuc2VsZWN0b3IpfX0pLGYuZXh0ZW5kKHtjbG9uZTpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9YS5jbG9uZU5vZGUoITApLGUsZyxoO2lmKCghZi5zdXBwb3J0Lm5vQ2xvbmVFdmVudHx8IWYuc3VwcG9ydC5ub0Nsb25lQ2hlY2tlZCkmJihhLm5vZGVUeXBlPT09MXx8YS5ub2RlVHlwZT09PTExKSYmIWYuaXNYTUxEb2MoYSkpe2JoKGEsZCksZT1iaShhKSxnPWJpKGQpO2ZvcihoPTA7ZVtoXTsrK2gpZ1toXSYmYmgoZVtoXSxnW2hdKX1pZihiKXtiZyhhLGQpO2lmKGMpe2U9YmkoYSksZz1iaShkKTtmb3IoaD0wO2VbaF07KytoKWJnKGVbaF0sZ1toXSl9fWU9Zz1udWxsO3JldHVybiBkfSxjbGVhbjpmdW5jdGlvbihhLGIsZCxlKXt2YXIgZztiPWJ8fGMsdHlwZW9mIGIuY3JlYXRlRWxlbWVudD09InVuZGVmaW5lZCImJihiPWIub3duZXJEb2N1bWVudHx8YlswXSYmYlswXS5vd25lckRvY3VtZW50fHxjKTt2YXIgaD1bXSxpO2Zvcih2YXIgaj0wLGs7KGs9YVtqXSkhPW51bGw7aisrKXt0eXBlb2Ygaz09Im51bWJlciImJihrKz0iIik7aWYoIWspY29udGludWU7aWYodHlwZW9mIGs9PSJzdHJpbmciKWlmKCFfLnRlc3Qoaykpaz1iLmNyZWF0ZVRleHROb2RlKGspO2Vsc2V7az1rLnJlcGxhY2UoWSwiPCQxPjwvJDI+Iik7dmFyIGw9KFouZXhlYyhrKXx8WyIiLCIiXSlbMV0udG9Mb3dlckNhc2UoKSxtPWJlW2xdfHxiZS5fZGVmYXVsdCxuPW1bMF0sbz1iLmNyZWF0ZUVsZW1lbnQoImRpdiIpO28uaW5uZXJIVE1MPW1bMV0rayttWzJdO3doaWxlKG4tLSlvPW8ubGFzdENoaWxkO2lmKCFmLnN1cHBvcnQudGJvZHkpe3ZhciBwPSQudGVzdChrKSxxPWw9PT0idGFibGUiJiYhcD9vLmZpcnN0Q2hpbGQmJm8uZmlyc3RDaGlsZC5jaGlsZE5vZGVzOm1bMV09PT0iPHRhYmxlPiImJiFwP28uY2hpbGROb2RlczpbXTtmb3IoaT1xLmxlbmd0aC0xO2k+PTA7LS1pKWYubm9kZU5hbWUocVtpXSwidGJvZHkiKSYmIXFbaV0uY2hpbGROb2Rlcy5sZW5ndGgmJnFbaV0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChxW2ldKX0hZi5zdXBwb3J0LmxlYWRpbmdXaGl0ZXNwYWNlJiZYLnRlc3QoaykmJm8uaW5zZXJ0QmVmb3JlKGIuY3JlYXRlVGV4dE5vZGUoWC5leGVjKGspWzBdKSxvLmZpcnN0Q2hpbGQpLGs9by5jaGlsZE5vZGVzfXZhciByO2lmKCFmLnN1cHBvcnQuYXBwZW5kQ2hlY2tlZClpZihrWzBdJiZ0eXBlb2YgKHI9ay5sZW5ndGgpPT0ibnVtYmVyIilmb3IoaT0wO2k8cjtpKyspYmsoa1tpXSk7ZWxzZSBiayhrKTtrLm5vZGVUeXBlP2gucHVzaChrKTpoPWYubWVyZ2UoaCxrKX1pZihkKXtnPWZ1bmN0aW9uKGEpe3JldHVybiFhLnR5cGV8fGJjLnRlc3QoYS50eXBlKX07Zm9yKGo9MDtoW2pdO2orKylpZihlJiZmLm5vZGVOYW1lKGhbal0sInNjcmlwdCIpJiYoIWhbal0udHlwZXx8aFtqXS50eXBlLnRvTG93ZXJDYXNlKCk9PT0idGV4dC9qYXZhc2NyaXB0IikpZS5wdXNoKGhbal0ucGFyZW50Tm9kZT9oW2pdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoaFtqXSk6aFtqXSk7ZWxzZXtpZihoW2pdLm5vZGVUeXBlPT09MSl7dmFyIHM9Zi5ncmVwKGhbal0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNjcmlwdCIpLGcpO2guc3BsaWNlLmFwcGx5KGgsW2orMSwwXS5jb25jYXQocykpfWQuYXBwZW5kQ2hpbGQoaFtqXSl9fXJldHVybiBofSxjbGVhbkRhdGE6ZnVuY3Rpb24oYSl7dmFyIGIsYyxkPWYuY2FjaGUsZT1mLmV4cGFuZG8sZz1mLmV2ZW50LnNwZWNpYWwsaD1mLnN1cHBvcnQuZGVsZXRlRXhwYW5kbztmb3IodmFyIGk9MCxqOyhqPWFbaV0pIT1udWxsO2krKyl7aWYoai5ub2RlTmFtZSYmZi5ub0RhdGFbai5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXSljb250aW51ZTtjPWpbZi5leHBhbmRvXTtpZihjKXtiPWRbY10mJmRbY11bZV07aWYoYiYmYi5ldmVudHMpe2Zvcih2YXIgayBpbiBiLmV2ZW50cylnW2tdP2YuZXZlbnQucmVtb3ZlKGosayk6Zi5yZW1vdmVFdmVudChqLGssYi5oYW5kbGUpO2IuaGFuZGxlJiYoYi5oYW5kbGUuZWxlbT1udWxsKX1oP2RlbGV0ZSBqW2YuZXhwYW5kb106ai5yZW1vdmVBdHRyaWJ1dGUmJmoucmVtb3ZlQXR0cmlidXRlKGYuZXhwYW5kbyksZGVsZXRlIGRbY119fX19KTt2YXIgYm09L2FscGhhXChbXildKlwpL2ksYm49L29wYWNpdHk9KFteKV0qKS8sYm89LyhbQS1aXXxebXMpL2csYnA9L14tP1xkKyg/OnB4KT8kL2ksYnE9L14tP1xkLyxicj0vXihbXC0rXSk9KFtcLSsuXGRlXSspLyxicz17cG9zaXRpb246ImFic29sdXRlIix2aXNpYmlsaXR5OiJoaWRkZW4iLGRpc3BsYXk6ImJsb2NrIn0sYnQ9WyJMZWZ0IiwiUmlnaHQiXSxidT1bIlRvcCIsIkJvdHRvbSJdLGJ2LGJ3LGJ4O2YuZm4uY3NzPWZ1bmN0aW9uKGEsYyl7aWYoYXJndW1lbnRzLmxlbmd0aD09PTImJmM9PT1iKXJldHVybiB0aGlzO3JldHVybiBmLmFjY2Vzcyh0aGlzLGEsYywhMCxmdW5jdGlvbihhLGMsZCl7cmV0dXJuIGQhPT1iP2Yuc3R5bGUoYSxjLGQpOmYuY3NzKGEsYyl9KX0sZi5leHRlbmQoe2Nzc0hvb2tzOntvcGFjaXR5OntnZXQ6ZnVuY3Rpb24oYSxiKXtpZihiKXt2YXIgYz1idihhLCJvcGFjaXR5Iiwib3BhY2l0eSIpO3JldHVybiBjPT09IiI/IjEiOmN9cmV0dXJuIGEuc3R5bGUub3BhY2l0eX19fSxjc3NOdW1iZXI6e2ZpbGxPcGFjaXR5OiEwLGZvbnRXZWlnaHQ6ITAsbGluZUhlaWdodDohMCxvcGFjaXR5OiEwLG9ycGhhbnM6ITAsd2lkb3dzOiEwLHpJbmRleDohMCx6b29tOiEwfSxjc3NQcm9wczp7ImZsb2F0IjpmLnN1cHBvcnQuY3NzRmxvYXQ/ImNzc0Zsb2F0Ijoic3R5bGVGbG9hdCJ9LHN0eWxlOmZ1bmN0aW9uKGEsYyxkLGUpe2lmKCEhYSYmYS5ub2RlVHlwZSE9PTMmJmEubm9kZVR5cGUhPT04JiYhIWEuc3R5bGUpe3ZhciBnLGgsaT1mLmNhbWVsQ2FzZShjKSxqPWEuc3R5bGUsaz1mLmNzc0hvb2tzW2ldO2M9Zi5jc3NQcm9wc1tpXXx8aTtpZihkPT09Yil7aWYoayYmImdldCJpbiBrJiYoZz1rLmdldChhLCExLGUpKSE9PWIpcmV0dXJuIGc7cmV0dXJuIGpbY119aD10eXBlb2YgZCxoPT09InN0cmluZyImJihnPWJyLmV4ZWMoZCkpJiYoZD0rKGdbMV0rMSkqK2dbMl0rcGFyc2VGbG9hdChmLmNzcyhhLGMpKSxoPSJudW1iZXIiKTtpZihkPT1udWxsfHxoPT09Im51bWJlciImJmlzTmFOKGQpKXJldHVybjtoPT09Im51bWJlciImJiFmLmNzc051bWJlcltpXSYmKGQrPSJweCIpO2lmKCFrfHwhKCJzZXQiaW4gayl8fChkPWsuc2V0KGEsZCkpIT09Yil0cnl7altjXT1kfWNhdGNoKGwpe319fSxjc3M6ZnVuY3Rpb24oYSxjLGQpe3ZhciBlLGc7Yz1mLmNhbWVsQ2FzZShjKSxnPWYuY3NzSG9va3NbY10sYz1mLmNzc1Byb3BzW2NdfHxjLGM9PT0iY3NzRmxvYXQiJiYoYz0iZmxvYXQiKTtpZihnJiYiZ2V0ImluIGcmJihlPWcuZ2V0KGEsITAsZCkpIT09YilyZXR1cm4gZTtpZihidilyZXR1cm4gYnYoYSxjKX0sc3dhcDpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9e307Zm9yKHZhciBlIGluIGIpZFtlXT1hLnN0eWxlW2VdLGEuc3R5bGVbZV09YltlXTtjLmNhbGwoYSk7Zm9yKGUgaW4gYilhLnN0eWxlW2VdPWRbZV19fSksZi5jdXJDU1M9Zi5jc3MsZi5lYWNoKFsiaGVpZ2h0Iiwid2lkdGgiXSxmdW5jdGlvbihhLGIpe2YuY3NzSG9va3NbYl09e2dldDpmdW5jdGlvbihhLGMsZCl7dmFyIGU7aWYoYyl7aWYoYS5vZmZzZXRXaWR0aCE9PTApcmV0dXJuIGJ5KGEsYixkKTtmLnN3YXAoYSxicyxmdW5jdGlvbigpe2U9YnkoYSxiLGQpfSk7cmV0dXJuIGV9fSxzZXQ6ZnVuY3Rpb24oYSxiKXtpZighYnAudGVzdChiKSlyZXR1cm4gYjtiPXBhcnNlRmxvYXQoYik7aWYoYj49MClyZXR1cm4gYisicHgifX19KSxmLnN1cHBvcnQub3BhY2l0eXx8KGYuY3NzSG9va3Mub3BhY2l0eT17Z2V0OmZ1bmN0aW9uKGEsYil7cmV0dXJuIGJuLnRlc3QoKGImJmEuY3VycmVudFN0eWxlP2EuY3VycmVudFN0eWxlLmZpbHRlcjphLnN0eWxlLmZpbHRlcil8fCIiKT9wYXJzZUZsb2F0KFJlZ0V4cC4kMSkvMTAwKyIiOmI/IjEiOiIifSxzZXQ6ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLnN0eWxlLGQ9YS5jdXJyZW50U3R5bGUsZT1mLmlzTmFOKGIpPyIiOiJhbHBoYShvcGFjaXR5PSIrYioxMDArIikiLGc9ZCYmZC5maWx0ZXJ8fGMuZmlsdGVyfHwiIjtjLnpvb209MTtpZihiPj0xJiZmLnRyaW0oZy5yZXBsYWNlKGJtLCIiKSk9PT0iIil7Yy5yZW1vdmVBdHRyaWJ1dGUoImZpbHRlciIpO2lmKGQmJiFkLmZpbHRlcilyZXR1cm59Yy5maWx0ZXI9Ym0udGVzdChnKT9nLnJlcGxhY2UoYm0sZSk6ZysiICIrZX19KSxmKGZ1bmN0aW9uKCl7Zi5zdXBwb3J0LnJlbGlhYmxlTWFyZ2luUmlnaHR8fChmLmNzc0hvb2tzLm1hcmdpblJpZ2h0PXtnZXQ6ZnVuY3Rpb24oYSxiKXt2YXIgYztmLnN3YXAoYSx7ZGlzcGxheToiaW5saW5lLWJsb2NrIn0sZnVuY3Rpb24oKXtiP2M9YnYoYSwibWFyZ2luLXJpZ2h0IiwibWFyZ2luUmlnaHQiKTpjPWEuc3R5bGUubWFyZ2luUmlnaHR9KTtyZXR1cm4gY319KX0pLGMuZGVmYXVsdFZpZXcmJmMuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSYmKGJ3PWZ1bmN0aW9uKGEsYyl7dmFyIGQsZSxnO2M9Yy5yZXBsYWNlKGJvLCItJDEiKS50b0xvd2VyQ2FzZSgpO2lmKCEoZT1hLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcpKXJldHVybiBiO2lmKGc9ZS5nZXRDb21wdXRlZFN0eWxlKGEsbnVsbCkpZD1nLmdldFByb3BlcnR5VmFsdWUoYyksZD09PSIiJiYhZi5jb250YWlucyhhLm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LGEpJiYoZD1mLnN0eWxlKGEsYykpO3JldHVybiBkfSksYy5kb2N1bWVudEVsZW1lbnQuY3VycmVudFN0eWxlJiYoYng9ZnVuY3Rpb24oYSxiKXt2YXIgYyxkPWEuY3VycmVudFN0eWxlJiZhLmN1cnJlbnRTdHlsZVtiXSxlPWEucnVudGltZVN0eWxlJiZhLnJ1bnRpbWVTdHlsZVtiXSxmPWEuc3R5bGU7IWJwLnRlc3QoZCkmJmJxLnRlc3QoZCkmJihjPWYubGVmdCxlJiYoYS5ydW50aW1lU3R5bGUubGVmdD1hLmN1cnJlbnRTdHlsZS5sZWZ0KSxmLmxlZnQ9Yj09PSJmb250U2l6ZSI/IjFlbSI6ZHx8MCxkPWYucGl4ZWxMZWZ0KyJweCIsZi5sZWZ0PWMsZSYmKGEucnVudGltZVN0eWxlLmxlZnQ9ZSkpO3JldHVybiBkPT09IiI/ImF1dG8iOmR9KSxidj1id3x8YngsZi5leHByJiZmLmV4cHIuZmlsdGVycyYmKGYuZXhwci5maWx0ZXJzLmhpZGRlbj1mdW5jdGlvbihhKXt2YXIgYj1hLm9mZnNldFdpZHRoLGM9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGI9PT0wJiZjPT09MHx8IWYuc3VwcG9ydC5yZWxpYWJsZUhpZGRlbk9mZnNldHMmJihhLnN0eWxlLmRpc3BsYXl8fGYuY3NzKGEsImRpc3BsYXkiKSk9PT0ibm9uZSJ9LGYuZXhwci5maWx0ZXJzLnZpc2libGU9ZnVuY3Rpb24oYSl7cmV0dXJuIWYuZXhwci5maWx0ZXJzLmhpZGRlbihhKX0pO3ZhciBiej0vJTIwL2csYkE9L1xbXF0kLyxiQj0vXHI/XG4vZyxiQz0vIy4qJC8sYkQ9L14oLio/KTpbIFx0XSooW15cclxuXSopXHI/JC9tZyxiRT0vXig/OmNvbG9yfGRhdGV8ZGF0ZXRpbWV8ZGF0ZXRpbWUtbG9jYWx8ZW1haWx8aGlkZGVufG1vbnRofG51bWJlcnxwYXNzd29yZHxyYW5nZXxzZWFyY2h8dGVsfHRleHR8dGltZXx1cmx8d2VlaykkL2ksYkY9L14oPzphYm91dHxhcHB8YXBwXC1zdG9yYWdlfC4rXC1leHRlbnNpb258ZmlsZXxyZXN8d2lkZ2V0KTokLyxiRz0vXig/OkdFVHxIRUFEKSQvLGJIPS9eXC9cLy8sYkk9L1w/LyxiSj0vPHNjcmlwdFxiW148XSooPzooPyE8XC9zY3JpcHQ+KTxbXjxdKikqPFwvc2NyaXB0Pi9naSxiSz0vXig/OnNlbGVjdHx0ZXh0YXJlYSkvaSxiTD0vXHMrLyxiTT0vKFs/Jl0pXz1bXiZdKi8sYk49L14oW1x3XCtcLlwtXSs6KSg/OlwvXC8oW15cLz8jOl0qKSg/OjooXGQrKSk/KT8vLGJPPWYuZm4ubG9hZCxiUD17fSxiUT17fSxiUixiUyxiVD1bIiovIl0rWyIqIl07dHJ5e2JSPWUuaHJlZn1jYXRjaChiVSl7YlI9Yy5jcmVhdGVFbGVtZW50KCJhIiksYlIuaHJlZj0iIixiUj1iUi5ocmVmfWJTPWJOLmV4ZWMoYlIudG9Mb3dlckNhc2UoKSl8fFtdLGYuZm4uZXh0ZW5kKHtsb2FkOmZ1bmN0aW9uKGEsYyxkKXtpZih0eXBlb2YgYSE9InN0cmluZyImJmJPKXJldHVybiBiTy5hcHBseSh0aGlzLGFyZ3VtZW50cyk7aWYoIXRoaXMubGVuZ3RoKXJldHVybiB0aGlzO3ZhciBlPWEuaW5kZXhPZigiICIpO2lmKGU+PTApe3ZhciBnPWEuc2xpY2UoZSxhLmxlbmd0aCk7YT1hLnNsaWNlKDAsZSl9dmFyIGg9IkdFVCI7YyYmKGYuaXNGdW5jdGlvbihjKT8oZD1jLGM9Yik6dHlwZW9mIGM9PSJvYmplY3QiJiYoYz1mLnBhcmFtKGMsZi5hamF4U2V0dGluZ3MudHJhZGl0aW9uYWwpLGg9IlBPU1QiKSk7dmFyIGk9dGhpcztmLmFqYXgoe3VybDphLHR5cGU6aCxkYXRhVHlwZToiaHRtbCIsZGF0YTpjLGNvbXBsZXRlOmZ1bmN0aW9uKGEsYixjKXtjPWEucmVzcG9uc2VUZXh0LGEuaXNSZXNvbHZlZCgpJiYoYS5kb25lKGZ1bmN0aW9uKGEpe2M9YX0pLGkuaHRtbChnP2YoIjxkaXY+IikuYXBwZW5kKGMucmVwbGFjZShiSiwiIikpLmZpbmQoZyk6YykpLGQmJmkuZWFjaChkLFtjLGIsYV0pfX0pO3JldHVybiB0aGlzfSxzZXJpYWxpemU6ZnVuY3Rpb24oKXtyZXR1cm4gZi5wYXJhbSh0aGlzLnNlcmlhbGl6ZUFycmF5KCkpfSxzZXJpYWxpemVBcnJheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hcChmdW5jdGlvbigpe3JldHVybiB0aGlzLmVsZW1lbnRzP2YubWFrZUFycmF5KHRoaXMuZWxlbWVudHMpOnRoaXN9KS5maWx0ZXIoZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5uYW1lJiYhdGhpcy5kaXNhYmxlZCYmKHRoaXMuY2hlY2tlZHx8YksudGVzdCh0aGlzLm5vZGVOYW1lKXx8YkUudGVzdCh0aGlzLnR5cGUpKX0pLm1hcChmdW5jdGlvbihhLGIpe3ZhciBjPWYodGhpcykudmFsKCk7cmV0dXJuIGM9PW51bGw/bnVsbDpmLmlzQXJyYXkoYyk/Zi5tYXAoYyxmdW5jdGlvbihhLGMpe3JldHVybntuYW1lOmIubmFtZSx2YWx1ZTphLnJlcGxhY2UoYkIsIlxyXG4iKX19KTp7bmFtZTpiLm5hbWUsdmFsdWU6Yy5yZXBsYWNlKGJCLCJcclxuIil9fSkuZ2V0KCl9fSksZi5lYWNoKCJhamF4U3RhcnQgYWpheFN0b3AgYWpheENvbXBsZXRlIGFqYXhFcnJvciBhamF4U3VjY2VzcyBhamF4U2VuZCIuc3BsaXQoIiAiKSxmdW5jdGlvbihhLGIpe2YuZm5bYl09ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYmluZChiLGEpfX0pLGYuZWFjaChbImdldCIsInBvc3QiXSxmdW5jdGlvbihhLGMpe2ZbY109ZnVuY3Rpb24oYSxkLGUsZyl7Zi5pc0Z1bmN0aW9uKGQpJiYoZz1nfHxlLGU9ZCxkPWIpO3JldHVybiBmLmFqYXgoe3R5cGU6Yyx1cmw6YSxkYXRhOmQsc3VjY2VzczplLGRhdGFUeXBlOmd9KX19KSxmLmV4dGVuZCh7Z2V0U2NyaXB0OmZ1bmN0aW9uKGEsYyl7cmV0dXJuIGYuZ2V0KGEsYixjLCJzY3JpcHQiKX0sZ2V0SlNPTjpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGYuZ2V0KGEsYixjLCJqc29uIil9LGFqYXhTZXR1cDpmdW5jdGlvbihhLGIpe2I/YlgoYSxmLmFqYXhTZXR0aW5ncyk6KGI9YSxhPWYuYWpheFNldHRpbmdzKSxiWChhLGIpO3JldHVybiBhfSxhamF4U2V0dGluZ3M6e3VybDpiUixpc0xvY2FsOmJGLnRlc3QoYlNbMV0pLGdsb2JhbDohMCx0eXBlOiJHRVQiLGNvbnRlbnRUeXBlOiJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiLHByb2Nlc3NEYXRhOiEwLGFzeW5jOiEwLGFjY2VwdHM6e3htbDoiYXBwbGljYXRpb24veG1sLCB0ZXh0L3htbCIsaHRtbDoidGV4dC9odG1sIix0ZXh0OiJ0ZXh0L3BsYWluIixqc29uOiJhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L2phdmFzY3JpcHQiLCIqIjpiVH0sY29udGVudHM6e3htbDoveG1sLyxodG1sOi9odG1sLyxqc29uOi9qc29uL30scmVzcG9uc2VGaWVsZHM6e3htbDoicmVzcG9uc2VYTUwiLHRleHQ6InJlc3BvbnNlVGV4dCJ9LGNvbnZlcnRlcnM6eyIqIHRleHQiOmEuU3RyaW5nLCJ0ZXh0IGh0bWwiOiEwLCJ0ZXh0IGpzb24iOmYucGFyc2VKU09OLCJ0ZXh0IHhtbCI6Zi5wYXJzZVhNTH0sZmxhdE9wdGlvbnM6e2NvbnRleHQ6ITAsdXJsOiEwfX0sYWpheFByZWZpbHRlcjpiVihiUCksYWpheFRyYW5zcG9ydDpiVihiUSksYWpheDpmdW5jdGlvbihhLGMpe2Z1bmN0aW9uIHcoYSxjLGwsbSl7aWYocyE9PTIpe3M9MixxJiZjbGVhclRpbWVvdXQocSkscD1iLG49bXx8IiIsdi5yZWFkeVN0YXRlPWE+MD80OjA7dmFyIG8scix1LHc9Yyx4PWw/YlooZCx2LGwpOmIseSx6O2lmKGE+PTIwMCYmYTwzMDB8fGE9PT0zMDQpe2lmKGQuaWZNb2RpZmllZCl7aWYoeT12LmdldFJlc3BvbnNlSGVhZGVyKCJMYXN0LU1vZGlmaWVkIikpZi5sYXN0TW9kaWZpZWRba109eTtpZih6PXYuZ2V0UmVzcG9uc2VIZWFkZXIoIkV0YWciKSlmLmV0YWdba109en1pZihhPT09MzA0KXc9Im5vdG1vZGlmaWVkIixvPSEwO2Vsc2UgdHJ5e3I9YiQoZCx4KSx3PSJzdWNjZXNzIixvPSEwfWNhdGNoKEEpe3c9InBhcnNlcmVycm9yIix1PUF9fWVsc2V7dT13O2lmKCF3fHxhKXc9ImVycm9yIixhPDAmJihhPTApfXYuc3RhdHVzPWEsdi5zdGF0dXNUZXh0PSIiKyhjfHx3KSxvP2gucmVzb2x2ZVdpdGgoZSxbcix3LHZdKTpoLnJlamVjdFdpdGgoZSxbdix3LHVdKSx2LnN0YXR1c0NvZGUoaiksaj1iLHQmJmcudHJpZ2dlcigiYWpheCIrKG8/IlN1Y2Nlc3MiOiJFcnJvciIpLFt2LGQsbz9yOnVdKSxpLnJlc29sdmVXaXRoKGUsW3Ysd10pLHQmJihnLnRyaWdnZXIoImFqYXhDb21wbGV0ZSIsW3YsZF0pLC0tZi5hY3RpdmV8fGYuZXZlbnQudHJpZ2dlcigiYWpheFN0b3AiKSl9fXR5cGVvZiBhPT0ib2JqZWN0IiYmKGM9YSxhPWIpLGM9Y3x8e307dmFyIGQ9Zi5hamF4U2V0dXAoe30sYyksZT1kLmNvbnRleHR8fGQsZz1lIT09ZCYmKGUubm9kZVR5cGV8fGUgaW5zdGFuY2VvZiBmKT9mKGUpOmYuZXZlbnQsaD1mLkRlZmVycmVkKCksaT1mLl9EZWZlcnJlZCgpLGo9ZC5zdGF0dXNDb2RlfHx7fSxrLGw9e30sbT17fSxuLG8scCxxLHIscz0wLHQsdSx2PXtyZWFkeVN0YXRlOjAsc2V0UmVxdWVzdEhlYWRlcjpmdW5jdGlvbihhLGIpe2lmKCFzKXt2YXIgYz1hLnRvTG93ZXJDYXNlKCk7YT1tW2NdPW1bY118fGEsbFthXT1ifXJldHVybiB0aGlzfSxnZXRBbGxSZXNwb25zZUhlYWRlcnM6ZnVuY3Rpb24oKXtyZXR1cm4gcz09PTI/bjpudWxsfSxnZXRSZXNwb25zZUhlYWRlcjpmdW5jdGlvbihhKXt2YXIgYztpZihzPT09Mil7aWYoIW8pe289e307d2hpbGUoYz1iRC5leGVjKG4pKW9bY1sxXS50b0xvd2VyQ2FzZSgpXT1jWzJdfWM9b1thLnRvTG93ZXJDYXNlKCldfXJldHVybiBjPT09Yj9udWxsOmN9LG92ZXJyaWRlTWltZVR5cGU6ZnVuY3Rpb24oYSl7c3x8KGQubWltZVR5cGU9YSk7cmV0dXJuIHRoaXN9LGFib3J0OmZ1bmN0aW9uKGEpe2E9YXx8ImFib3J0IixwJiZwLmFib3J0KGEpLHcoMCxhKTtyZXR1cm4gdGhpc319O2gucHJvbWlzZSh2KSx2LnN1Y2Nlc3M9di5kb25lLHYuZXJyb3I9di5mYWlsLHYuY29tcGxldGU9aS5kb25lLHYuc3RhdHVzQ29kZT1mdW5jdGlvbihhKXtpZihhKXt2YXIgYjtpZihzPDIpZm9yKGIgaW4gYSlqW2JdPVtqW2JdLGFbYl1dO2Vsc2UgYj1hW3Yuc3RhdHVzXSx2LnRoZW4oYixiKX1yZXR1cm4gdGhpc30sZC51cmw9KChhfHxkLnVybCkrIiIpLnJlcGxhY2UoYkMsIiIpLnJlcGxhY2UoYkgsYlNbMV0rIi8vIiksZC5kYXRhVHlwZXM9Zi50cmltKGQuZGF0YVR5cGV8fCIqIikudG9Mb3dlckNhc2UoKS5zcGxpdChiTCksZC5jcm9zc0RvbWFpbj09bnVsbCYmKHI9Yk4uZXhlYyhkLnVybC50b0xvd2VyQ2FzZSgpKSxkLmNyb3NzRG9tYWluPSEoIXJ8fHJbMV09PWJTWzFdJiZyWzJdPT1iU1syXSYmKHJbM118fChyWzFdPT09Imh0dHA6Ij84MDo0NDMpKT09KGJTWzNdfHwoYlNbMV09PT0iaHR0cDoiPzgwOjQ0MykpKSksZC5kYXRhJiZkLnByb2Nlc3NEYXRhJiZ0eXBlb2YgZC5kYXRhIT0ic3RyaW5nIiYmKGQuZGF0YT1mLnBhcmFtKGQuZGF0YSxkLnRyYWRpdGlvbmFsKSksYlcoYlAsZCxjLHYpO2lmKHM9PT0yKXJldHVybiExO3Q9ZC5nbG9iYWwsZC50eXBlPWQudHlwZS50b1VwcGVyQ2FzZSgpLGQuaGFzQ29udGVudD0hYkcudGVzdChkLnR5cGUpLHQmJmYuYWN0aXZlKys9PT0wJiZmLmV2ZW50LnRyaWdnZXIoImFqYXhTdGFydCIpO2lmKCFkLmhhc0NvbnRlbnQpe2QuZGF0YSYmKGQudXJsKz0oYkkudGVzdChkLnVybCk/IiYiOiI/IikrZC5kYXRhLGRlbGV0ZSBkLmRhdGEpLGs9ZC51cmw7aWYoZC5jYWNoZT09PSExKXt2YXIgeD1mLm5vdygpLHk9ZC51cmwucmVwbGFjZShiTSwiJDFfPSIreCk7ZC51cmw9eSsoeT09PWQudXJsPyhiSS50ZXN0KGQudXJsKT8iJiI6Ij8iKSsiXz0iK3g6IiIpfX0oZC5kYXRhJiZkLmhhc0NvbnRlbnQmJmQuY29udGVudFR5cGUhPT0hMXx8Yy5jb250ZW50VHlwZSkmJnYuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC1UeXBlIixkLmNvbnRlbnRUeXBlKSxkLmlmTW9kaWZpZWQmJihrPWt8fGQudXJsLGYubGFzdE1vZGlmaWVkW2tdJiZ2LnNldFJlcXVlc3RIZWFkZXIoIklmLU1vZGlmaWVkLVNpbmNlIixmLmxhc3RNb2RpZmllZFtrXSksZi5ldGFnW2tdJiZ2LnNldFJlcXVlc3RIZWFkZXIoIklmLU5vbmUtTWF0Y2giLGYuZXRhZ1trXSkpLHYuc2V0UmVxdWVzdEhlYWRlcigiQWNjZXB0IixkLmRhdGFUeXBlc1swXSYmZC5hY2NlcHRzW2QuZGF0YVR5cGVzWzBdXT9kLmFjY2VwdHNbZC5kYXRhVHlwZXNbMF1dKyhkLmRhdGFUeXBlc1swXSE9PSIqIj8iLCAiK2JUKyI7IHE9MC4wMSI6IiIpOmQuYWNjZXB0c1siKiJdKTtmb3IodSBpbiBkLmhlYWRlcnMpdi5zZXRSZXF1ZXN0SGVhZGVyKHUsZC5oZWFkZXJzW3VdKTtpZihkLmJlZm9yZVNlbmQmJihkLmJlZm9yZVNlbmQuY2FsbChlLHYsZCk9PT0hMXx8cz09PTIpKXt2LmFib3J0KCk7cmV0dXJuITF9Zm9yKHUgaW57c3VjY2VzczoxLGVycm9yOjEsY29tcGxldGU6MX0pdlt1XShkW3VdKTtwPWJXKGJRLGQsYyx2KTtpZighcCl3KC0xLCJObyBUcmFuc3BvcnQiKTtlbHNle3YucmVhZHlTdGF0ZT0xLHQmJmcudHJpZ2dlcigiYWpheFNlbmQiLFt2LGRdKSxkLmFzeW5jJiZkLnRpbWVvdXQ+MCYmKHE9c2V0VGltZW91dChmdW5jdGlvbigpe3YuYWJvcnQoInRpbWVvdXQiKX0sZC50aW1lb3V0KSk7dHJ5e3M9MSxwLnNlbmQobCx3KX1jYXRjaCh6KXtzPDI/dygtMSx6KTpmLmVycm9yKHopfX1yZXR1cm4gdn0scGFyYW06ZnVuY3Rpb24oYSxjKXt2YXIgZD1bXSxlPWZ1bmN0aW9uKGEsYil7Yj1mLmlzRnVuY3Rpb24oYik/YigpOmIsZFtkLmxlbmd0aF09ZW5jb2RlVVJJQ29tcG9uZW50KGEpKyI9IitlbmNvZGVVUklDb21wb25lbnQoYil9O2M9PT1iJiYoYz1mLmFqYXhTZXR0aW5ncy50cmFkaXRpb25hbCk7aWYoZi5pc0FycmF5KGEpfHxhLmpxdWVyeSYmIWYuaXNQbGFpbk9iamVjdChhKSlmLmVhY2goYSxmdW5jdGlvbigpe2UodGhpcy5uYW1lLHRoaXMudmFsdWUpfSk7ZWxzZSBmb3IodmFyIGcgaW4gYSliWShnLGFbZ10sYyxlKTtyZXR1cm4gZC5qb2luKCImIikucmVwbGFjZShieiwiKyIpfX0pLGYuZXh0ZW5kKHthY3RpdmU6MCxsYXN0TW9kaWZpZWQ6e30sZXRhZzp7fX0pO3ZhciBiXz1mLm5vdygpLGNhPS8oXD0pXD8oJnwkKXxcP1w/L2k7Zi5hamF4U2V0dXAoe2pzb25wOiJjYWxsYmFjayIsanNvbnBDYWxsYmFjazpmdW5jdGlvbigpe3JldHVybiBmLmV4cGFuZG8rIl8iK2JfKyt9fSksZi5hamF4UHJlZmlsdGVyKCJqc29uIGpzb25wIixmdW5jdGlvbihiLGMsZCl7dmFyIGU9Yi5jb250ZW50VHlwZT09PSJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiJiZ0eXBlb2YgYi5kYXRhPT0ic3RyaW5nIjtpZihiLmRhdGFUeXBlc1swXT09PSJqc29ucCJ8fGIuanNvbnAhPT0hMSYmKGNhLnRlc3QoYi51cmwpfHxlJiZjYS50ZXN0KGIuZGF0YSkpKXt2YXIgZyxoPWIuanNvbnBDYWxsYmFjaz1mLmlzRnVuY3Rpb24oYi5qc29ucENhbGxiYWNrKT9iLmpzb25wQ2FsbGJhY2soKTpiLmpzb25wQ2FsbGJhY2ssaT1hW2hdLGo9Yi51cmwsaz1iLmRhdGEsbD0iJDEiK2grIiQyIjtiLmpzb25wIT09ITEmJihqPWoucmVwbGFjZShjYSxsKSxiLnVybD09PWomJihlJiYoaz1rLnJlcGxhY2UoY2EsbCkpLGIuZGF0YT09PWsmJihqKz0oL1w/Ly50ZXN0KGopPyImIjoiPyIpK2IuanNvbnArIj0iK2gpKSksYi51cmw9aixiLmRhdGE9ayxhW2hdPWZ1bmN0aW9uKGEpe2c9W2FdfSxkLmFsd2F5cyhmdW5jdGlvbigpe2FbaF09aSxnJiZmLmlzRnVuY3Rpb24oaSkmJmFbaF0oZ1swXSl9KSxiLmNvbnZlcnRlcnNbInNjcmlwdCBqc29uIl09ZnVuY3Rpb24oKXtnfHxmLmVycm9yKGgrIiB3YXMgbm90IGNhbGxlZCIpO3JldHVybiBnWzBdfSxiLmRhdGFUeXBlc1swXT0ianNvbiI7cmV0dXJuInNjcmlwdCJ9fSksZi5hamF4U2V0dXAoe2FjY2VwdHM6e3NjcmlwdDoidGV4dC9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9lY21hc2NyaXB0LCBhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQifSxjb250ZW50czp7c2NyaXB0Oi9qYXZhc2NyaXB0fGVjbWFzY3JpcHQvfSxjb252ZXJ0ZXJzOnsidGV4dCBzY3JpcHQiOmZ1bmN0aW9uKGEpe2YuZ2xvYmFsRXZhbChhKTtyZXR1cm4gYX19fSksZi5hamF4UHJlZmlsdGVyKCJzY3JpcHQiLGZ1bmN0aW9uKGEpe2EuY2FjaGU9PT1iJiYoYS5jYWNoZT0hMSksYS5jcm9zc0RvbWFpbiYmKGEudHlwZT0iR0VUIixhLmdsb2JhbD0hMSl9KSxmLmFqYXhUcmFuc3BvcnQoInNjcmlwdCIsZnVuY3Rpb24oYSl7aWYoYS5jcm9zc0RvbWFpbil7dmFyIGQsZT1jLmhlYWR8fGMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImhlYWQiKVswXXx8Yy5kb2N1bWVudEVsZW1lbnQ7cmV0dXJue3NlbmQ6ZnVuY3Rpb24oZixnKXtkPWMuY3JlYXRlRWxlbWVudCgic2NyaXB0IiksZC5hc3luYz0iYXN5bmMiLGEuc2NyaXB0Q2hhcnNldCYmKGQuY2hhcnNldD1hLnNjcmlwdENoYXJzZXQpLGQuc3JjPWEudXJsLGQub25sb2FkPWQub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKGEsYyl7aWYoY3x8IWQucmVhZHlTdGF0ZXx8L2xvYWRlZHxjb21wbGV0ZS8udGVzdChkLnJlYWR5U3RhdGUpKWQub25sb2FkPWQub25yZWFkeXN0YXRlY2hhbmdlPW51bGwsZSYmZC5wYXJlbnROb2RlJiZlLnJlbW92ZUNoaWxkKGQpLGQ9YixjfHxnKDIwMCwic3VjY2VzcyIpfSxlLmluc2VydEJlZm9yZShkLGUuZmlyc3RDaGlsZCl9LGFib3J0OmZ1bmN0aW9uKCl7ZCYmZC5vbmxvYWQoMCwxKX19fX0pO3ZhciBjYj1hLkFjdGl2ZVhPYmplY3Q/ZnVuY3Rpb24oKXtmb3IodmFyIGEgaW4gY2QpY2RbYV0oMCwxKX06ITEsY2M9MCxjZDtmLmFqYXhTZXR0aW5ncy54aHI9YS5BY3RpdmVYT2JqZWN0P2Z1bmN0aW9uKCl7cmV0dXJuIXRoaXMuaXNMb2NhbCYmY2UoKXx8Y2YoKX06Y2UsZnVuY3Rpb24oYSl7Zi5leHRlbmQoZi5zdXBwb3J0LHthamF4OiEhYSxjb3JzOiEhYSYmIndpdGhDcmVkZW50aWFscyJpbiBhfSl9KGYuYWpheFNldHRpbmdzLnhocigpKSxmLnN1cHBvcnQuYWpheCYmZi5hamF4VHJhbnNwb3J0KGZ1bmN0aW9uKGMpe2lmKCFjLmNyb3NzRG9tYWlufHxmLnN1cHBvcnQuY29ycyl7dmFyIGQ7cmV0dXJue3NlbmQ6ZnVuY3Rpb24oZSxnKXt2YXIgaD1jLnhocigpLGksajtjLnVzZXJuYW1lP2gub3BlbihjLnR5cGUsYy51cmwsYy5hc3luYyxjLnVzZXJuYW1lLGMucGFzc3dvcmQpOmgub3BlbihjLnR5cGUsYy51cmwsYy5hc3luYyk7aWYoYy54aHJGaWVsZHMpZm9yKGogaW4gYy54aHJGaWVsZHMpaFtqXT1jLnhockZpZWxkc1tqXTtjLm1pbWVUeXBlJiZoLm92ZXJyaWRlTWltZVR5cGUmJmgub3ZlcnJpZGVNaW1lVHlwZShjLm1pbWVUeXBlKSwhYy5jcm9zc0RvbWFpbiYmIWVbIlgtUmVxdWVzdGVkLVdpdGgiXSYmKGVbIlgtUmVxdWVzdGVkLVdpdGgiXT0iWE1MSHR0cFJlcXVlc3QiKTt0cnl7Zm9yKGogaW4gZSloLnNldFJlcXVlc3RIZWFkZXIoaixlW2pdKX1jYXRjaChrKXt9aC5zZW5kKGMuaGFzQ29udGVudCYmYy5kYXRhfHxudWxsKSxkPWZ1bmN0aW9uKGEsZSl7dmFyIGosayxsLG0sbjt0cnl7aWYoZCYmKGV8fGgucmVhZHlTdGF0ZT09PTQpKXtkPWIsaSYmKGgub25yZWFkeXN0YXRlY2hhbmdlPWYubm9vcCxjYiYmZGVsZXRlIGNkW2ldKTtpZihlKWgucmVhZHlTdGF0ZSE9PTQmJmguYWJvcnQoKTtlbHNle2o9aC5zdGF0dXMsbD1oLmdldEFsbFJlc3BvbnNlSGVhZGVycygpLG09e30sbj1oLnJlc3BvbnNlWE1MLG4mJm4uZG9jdW1lbnRFbGVtZW50JiYobS54bWw9biksbS50ZXh0PWgucmVzcG9uc2VUZXh0O3RyeXtrPWguc3RhdHVzVGV4dH1jYXRjaChvKXtrPSIifSFqJiZjLmlzTG9jYWwmJiFjLmNyb3NzRG9tYWluP2o9bS50ZXh0PzIwMDo0MDQ6aj09PTEyMjMmJihqPTIwNCl9fX1jYXRjaChwKXtlfHxnKC0xLHApfW0mJmcoaixrLG0sbCl9LCFjLmFzeW5jfHxoLnJlYWR5U3RhdGU9PT00P2QoKTooaT0rK2NjLGNiJiYoY2R8fChjZD17fSxmKGEpLnVubG9hZChjYikpLGNkW2ldPWQpLGgub25yZWFkeXN0YXRlY2hhbmdlPWQpfSxhYm9ydDpmdW5jdGlvbigpe2QmJmQoMCwxKX19fX0pO3ZhciBjZz17fSxjaCxjaSxjaj0vXig/OnRvZ2dsZXxzaG93fGhpZGUpJC8sY2s9L14oWytcLV09KT8oW1xkKy5cLV0rKShbYS16JV0qKSQvaSxjbCxjbT1bWyJoZWlnaHQiLCJtYXJnaW5Ub3AiLCJtYXJnaW5Cb3R0b20iLCJwYWRkaW5nVG9wIiwicGFkZGluZ0JvdHRvbSJdLFsid2lkdGgiLCJtYXJnaW5MZWZ0IiwibWFyZ2luUmlnaHQiLCJwYWRkaW5nTGVmdCIsInBhZGRpbmdSaWdodCJdLFsib3BhY2l0eSJdXSxjbjtmLmZuLmV4dGVuZCh7c2hvdzpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZTtpZihhfHxhPT09MClyZXR1cm4gdGhpcy5hbmltYXRlKGNxKCJzaG93IiwzKSxhLGIsYyk7Zm9yKHZhciBnPTAsaD10aGlzLmxlbmd0aDtnPGg7ZysrKWQ9dGhpc1tnXSxkLnN0eWxlJiYoZT1kLnN0eWxlLmRpc3BsYXksIWYuX2RhdGEoZCwib2xkZGlzcGxheSIpJiZlPT09Im5vbmUiJiYoZT1kLnN0eWxlLmRpc3BsYXk9IiIpLGU9PT0iIiYmZi5jc3MoZCwiZGlzcGxheSIpPT09Im5vbmUiJiZmLl9kYXRhKGQsIm9sZGRpc3BsYXkiLGNyKGQubm9kZU5hbWUpKSk7Zm9yKGc9MDtnPGg7ZysrKXtkPXRoaXNbZ107aWYoZC5zdHlsZSl7ZT1kLnN0eWxlLmRpc3BsYXk7aWYoZT09PSIifHxlPT09Im5vbmUiKWQuc3R5bGUuZGlzcGxheT1mLl9kYXRhKGQsIm9sZGRpc3BsYXkiKXx8IiJ9fXJldHVybiB0aGlzfSxoaWRlOmZ1bmN0aW9uKGEsYixjKXtpZihhfHxhPT09MClyZXR1cm4gdGhpcy5hbmltYXRlKGNxKCJoaWRlIiwzKSxhLGIsYyk7Zm9yKHZhciBkPTAsZT10aGlzLmxlbmd0aDtkPGU7ZCsrKWlmKHRoaXNbZF0uc3R5bGUpe3ZhciBnPWYuY3NzKHRoaXNbZF0sImRpc3BsYXkiKTtnIT09Im5vbmUiJiYhZi5fZGF0YSh0aGlzW2RdLCJvbGRkaXNwbGF5IikmJmYuX2RhdGEodGhpc1tkXSwib2xkZGlzcGxheSIsZyl9Zm9yKGQ9MDtkPGU7ZCsrKXRoaXNbZF0uc3R5bGUmJih0aGlzW2RdLnN0eWxlLmRpc3BsYXk9Im5vbmUiKTtyZXR1cm4gdGhpc30sX3RvZ2dsZTpmLmZuLnRvZ2dsZSx0b2dnbGU6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXR5cGVvZiBhPT0iYm9vbGVhbiI7Zi5pc0Z1bmN0aW9uKGEpJiZmLmlzRnVuY3Rpb24oYik/dGhpcy5fdG9nZ2xlLmFwcGx5KHRoaXMsYXJndW1lbnRzKTphPT1udWxsfHxkP3RoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBiPWQ/YTpmKHRoaXMpLmlzKCI6aGlkZGVuIik7Zih0aGlzKVtiPyJzaG93IjoiaGlkZSJdKCl9KTp0aGlzLmFuaW1hdGUoY3EoInRvZ2dsZSIsMyksYSxiLGMpO3JldHVybiB0aGlzfSxmYWRlVG86ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIHRoaXMuZmlsdGVyKCI6aGlkZGVuIikuY3NzKCJvcGFjaXR5IiwwKS5zaG93KCkuZW5kKCkuYW5pbWF0ZSh7b3BhY2l0eTpifSxhLGMsZCl9LGFuaW1hdGU6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9Zi5zcGVlZChiLGMsZCk7aWYoZi5pc0VtcHR5T2JqZWN0KGEpKXJldHVybiB0aGlzLmVhY2goZS5jb21wbGV0ZSxbITFdKTthPWYuZXh0ZW5kKHt9LGEpO3JldHVybiB0aGlzW2UucXVldWU9PT0hMT8iZWFjaCI6InF1ZXVlIl0oZnVuY3Rpb24oKXtlLnF1ZXVlPT09ITEmJmYuX21hcmsodGhpcyk7dmFyIGI9Zi5leHRlbmQoe30sZSksYz10aGlzLm5vZGVUeXBlPT09MSxkPWMmJmYodGhpcykuaXMoIjpoaWRkZW4iKSxnLGgsaSxqLGssbCxtLG4sbztiLmFuaW1hdGVkUHJvcGVydGllcz17fTtmb3IoaSBpbiBhKXtnPWYuY2FtZWxDYXNlKGkpLGkhPT1nJiYoYVtnXT1hW2ldLGRlbGV0ZSBhW2ldKSxoPWFbZ10sZi5pc0FycmF5KGgpPyhiLmFuaW1hdGVkUHJvcGVydGllc1tnXT1oWzFdLGg9YVtnXT1oWzBdKTpiLmFuaW1hdGVkUHJvcGVydGllc1tnXT1iLnNwZWNpYWxFYXNpbmcmJmIuc3BlY2lhbEVhc2luZ1tnXXx8Yi5lYXNpbmd8fCJzd2luZyI7aWYoaD09PSJoaWRlIiYmZHx8aD09PSJzaG93IiYmIWQpcmV0dXJuIGIuY29tcGxldGUuY2FsbCh0aGlzKTtjJiYoZz09PSJoZWlnaHQifHxnPT09IndpZHRoIikmJihiLm92ZXJmbG93PVt0aGlzLnN0eWxlLm92ZXJmbG93LHRoaXMuc3R5bGUub3ZlcmZsb3dYLHRoaXMuc3R5bGUub3ZlcmZsb3dZXSxmLmNzcyh0aGlzLCJkaXNwbGF5Iik9PT0iaW5saW5lIiYmZi5jc3ModGhpcywiZmxvYXQiKT09PSJub25lIiYmKGYuc3VwcG9ydC5pbmxpbmVCbG9ja05lZWRzTGF5b3V0PyhqPWNyKHRoaXMubm9kZU5hbWUpLGo9PT0iaW5saW5lIj90aGlzLnN0eWxlLmRpc3BsYXk9ImlubGluZS1ibG9jayI6KHRoaXMuc3R5bGUuZGlzcGxheT0iaW5saW5lIix0aGlzLnN0eWxlLnpvb209MSkpOnRoaXMuc3R5bGUuZGlzcGxheT0iaW5saW5lLWJsb2NrIikpfWIub3ZlcmZsb3chPW51bGwmJih0aGlzLnN0eWxlLm92ZXJmbG93PSJoaWRkZW4iKTtmb3IoaSBpbiBhKWs9bmV3IGYuZngodGhpcyxiLGkpLGg9YVtpXSxjai50ZXN0KGgpP2tbaD09PSJ0b2dnbGUiP2Q/InNob3ciOiJoaWRlIjpoXSgpOihsPWNrLmV4ZWMoaCksbT1rLmN1cigpLGw/KG49cGFyc2VGbG9hdChsWzJdKSxvPWxbM118fChmLmNzc051bWJlcltpXT8iIjoicHgiKSxvIT09InB4IiYmKGYuc3R5bGUodGhpcyxpLChufHwxKStvKSxtPShufHwxKS9rLmN1cigpKm0sZi5zdHlsZSh0aGlzLGksbStvKSksbFsxXSYmKG49KGxbMV09PT0iLT0iPy0xOjEpKm4rbSksay5jdXN0b20obSxuLG8pKTprLmN1c3RvbShtLGgsIiIpKTtyZXR1cm4hMH0pfSxzdG9wOmZ1bmN0aW9uKGEsYil7YSYmdGhpcy5xdWV1ZShbXSksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGE9Zi50aW1lcnMsYz1hLmxlbmd0aDtifHxmLl91bm1hcmsoITAsdGhpcyk7d2hpbGUoYy0tKWFbY10uZWxlbT09PXRoaXMmJihiJiZhW2NdKCEwKSxhLnNwbGljZShjLDEpKX0pLGJ8fHRoaXMuZGVxdWV1ZSgpO3JldHVybiB0aGlzfX0pLGYuZWFjaCh7c2xpZGVEb3duOmNxKCJzaG93IiwxKSxzbGlkZVVwOmNxKCJoaWRlIiwxKSxzbGlkZVRvZ2dsZTpjcSgidG9nZ2xlIiwxKSxmYWRlSW46e29wYWNpdHk6InNob3cifSxmYWRlT3V0OntvcGFjaXR5OiJoaWRlIn0sZmFkZVRvZ2dsZTp7b3BhY2l0eToidG9nZ2xlIn19LGZ1bmN0aW9uKGEsYil7Zi5mblthXT1mdW5jdGlvbihhLGMsZCl7cmV0dXJuIHRoaXMuYW5pbWF0ZShiLGEsYyxkKX19KSxmLmV4dGVuZCh7c3BlZWQ6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWEmJnR5cGVvZiBhPT0ib2JqZWN0Ij9mLmV4dGVuZCh7fSxhKTp7Y29tcGxldGU6Y3x8IWMmJmJ8fGYuaXNGdW5jdGlvbihhKSYmYSxkdXJhdGlvbjphLGVhc2luZzpjJiZifHxiJiYhZi5pc0Z1bmN0aW9uKGIpJiZifTtkLmR1cmF0aW9uPWYuZngub2ZmPzA6dHlwZW9mIGQuZHVyYXRpb249PSJudW1iZXIiP2QuZHVyYXRpb246ZC5kdXJhdGlvbiBpbiBmLmZ4LnNwZWVkcz9mLmZ4LnNwZWVkc1tkLmR1cmF0aW9uXTpmLmZ4LnNwZWVkcy5fZGVmYXVsdCxkLm9sZD1kLmNvbXBsZXRlLGQuY29tcGxldGU9ZnVuY3Rpb24oYSl7Zi5pc0Z1bmN0aW9uKGQub2xkKSYmZC5vbGQuY2FsbCh0aGlzKSxkLnF1ZXVlIT09ITE/Zi5kZXF1ZXVlKHRoaXMpOmEhPT0hMSYmZi5fdW5tYXJrKHRoaXMpfTtyZXR1cm4gZH0sZWFzaW5nOntsaW5lYXI6ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIGMrZCphfSxzd2luZzpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4oLU1hdGguY29zKGEqTWF0aC5QSSkvMisuNSkqZCtjfX0sdGltZXJzOltdLGZ4OmZ1bmN0aW9uKGEsYixjKXt0aGlzLm9wdGlvbnM9Yix0aGlzLmVsZW09YSx0aGlzLnByb3A9YyxiLm9yaWc9Yi5vcmlnfHx7fX19KSxmLmZ4LnByb3RvdHlwZT17dXBkYXRlOmZ1bmN0aW9uKCl7dGhpcy5vcHRpb25zLnN0ZXAmJnRoaXMub3B0aW9ucy5zdGVwLmNhbGwodGhpcy5lbGVtLHRoaXMubm93LHRoaXMpLChmLmZ4LnN0ZXBbdGhpcy5wcm9wXXx8Zi5meC5zdGVwLl9kZWZhdWx0KSh0aGlzKX0sY3VyOmZ1bmN0aW9uKCl7aWYodGhpcy5lbGVtW3RoaXMucHJvcF0hPW51bGwmJighdGhpcy5lbGVtLnN0eWxlfHx0aGlzLmVsZW0uc3R5bGVbdGhpcy5wcm9wXT09bnVsbCkpcmV0dXJuIHRoaXMuZWxlbVt0aGlzLnByb3BdO3ZhciBhLGI9Zi5jc3ModGhpcy5lbGVtLHRoaXMucHJvcCk7cmV0dXJuIGlzTmFOKGE9cGFyc2VGbG9hdChiKSk/IWJ8fGI9PT0iYXV0byI/MDpiOmF9LGN1c3RvbTpmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZyhhKXtyZXR1cm4gZC5zdGVwKGEpfXZhciBkPXRoaXMsZT1mLmZ4O3RoaXMuc3RhcnRUaW1lPWNufHxjbygpLHRoaXMuc3RhcnQ9YSx0aGlzLmVuZD1iLHRoaXMudW5pdD1jfHx0aGlzLnVuaXR8fChmLmNzc051bWJlclt0aGlzLnByb3BdPyIiOiJweCIpLHRoaXMubm93PXRoaXMuc3RhcnQsdGhpcy5wb3M9dGhpcy5zdGF0ZT0wLGcuZWxlbT10aGlzLmVsZW0sZygpJiZmLnRpbWVycy5wdXNoKGcpJiYhY2wmJihjbD1zZXRJbnRlcnZhbChlLnRpY2ssZS5pbnRlcnZhbCkpfSxzaG93OmZ1bmN0aW9uKCl7dGhpcy5vcHRpb25zLm9yaWdbdGhpcy5wcm9wXT1mLnN0eWxlKHRoaXMuZWxlbSx0aGlzLnByb3ApLHRoaXMub3B0aW9ucy5zaG93PSEwLHRoaXMuY3VzdG9tKHRoaXMucHJvcD09PSJ3aWR0aCJ8fHRoaXMucHJvcD09PSJoZWlnaHQiPzE6MCx0aGlzLmN1cigpKSxmKHRoaXMuZWxlbSkuc2hvdygpfSxoaWRlOmZ1bmN0aW9uKCl7dGhpcy5vcHRpb25zLm9yaWdbdGhpcy5wcm9wXT1mLnN0eWxlKHRoaXMuZWxlbSx0aGlzLnByb3ApLHRoaXMub3B0aW9ucy5oaWRlPSEwLHRoaXMuY3VzdG9tKHRoaXMuY3VyKCksMCl9LHN0ZXA6ZnVuY3Rpb24oYSl7dmFyIGI9Y258fGNvKCksYz0hMCxkPXRoaXMuZWxlbSxlPXRoaXMub3B0aW9ucyxnLGg7aWYoYXx8Yj49ZS5kdXJhdGlvbit0aGlzLnN0YXJ0VGltZSl7dGhpcy5ub3c9dGhpcy5lbmQsdGhpcy5wb3M9dGhpcy5zdGF0ZT0xLHRoaXMudXBkYXRlKCksZS5hbmltYXRlZFByb3BlcnRpZXNbdGhpcy5wcm9wXT0hMDtmb3IoZyBpbiBlLmFuaW1hdGVkUHJvcGVydGllcyllLmFuaW1hdGVkUHJvcGVydGllc1tnXSE9PSEwJiYoYz0hMSk7aWYoYyl7ZS5vdmVyZmxvdyE9bnVsbCYmIWYuc3VwcG9ydC5zaHJpbmtXcmFwQmxvY2tzJiZmLmVhY2goWyIiLCJYIiwiWSJdLGZ1bmN0aW9uKGEsYil7ZC5zdHlsZVsib3ZlcmZsb3ciK2JdPWUub3ZlcmZsb3dbYV19KSxlLmhpZGUmJmYoZCkuaGlkZSgpO2lmKGUuaGlkZXx8ZS5zaG93KWZvcih2YXIgaSBpbiBlLmFuaW1hdGVkUHJvcGVydGllcylmLnN0eWxlKGQsaSxlLm9yaWdbaV0pO2UuY29tcGxldGUuY2FsbChkKX1yZXR1cm4hMX1lLmR1cmF0aW9uPT1JbmZpbml0eT90aGlzLm5vdz1iOihoPWItdGhpcy5zdGFydFRpbWUsdGhpcy5zdGF0ZT1oL2UuZHVyYXRpb24sdGhpcy5wb3M9Zi5lYXNpbmdbZS5hbmltYXRlZFByb3BlcnRpZXNbdGhpcy5wcm9wXV0odGhpcy5zdGF0ZSxoLDAsMSxlLmR1cmF0aW9uKSx0aGlzLm5vdz10aGlzLnN0YXJ0Kyh0aGlzLmVuZC10aGlzLnN0YXJ0KSp0aGlzLnBvcyksdGhpcy51cGRhdGUoKTtyZXR1cm4hMH19LGYuZXh0ZW5kKGYuZngse3RpY2s6ZnVuY3Rpb24oKXtmb3IodmFyIGE9Zi50aW1lcnMsYj0wO2I8YS5sZW5ndGg7KytiKWFbYl0oKXx8YS5zcGxpY2UoYi0tLDEpO2EubGVuZ3RofHxmLmZ4LnN0b3AoKX0saW50ZXJ2YWw6MTMsc3RvcDpmdW5jdGlvbigpe2NsZWFySW50ZXJ2YWwoY2wpLGNsPW51bGx9LHNwZWVkczp7c2xvdzo2MDAsZmFzdDoyMDAsX2RlZmF1bHQ6NDAwfSxzdGVwOntvcGFjaXR5OmZ1bmN0aW9uKGEpe2Yuc3R5bGUoYS5lbGVtLCJvcGFjaXR5IixhLm5vdyl9LF9kZWZhdWx0OmZ1bmN0aW9uKGEpe2EuZWxlbS5zdHlsZSYmYS5lbGVtLnN0eWxlW2EucHJvcF0hPW51bGw/YS5lbGVtLnN0eWxlW2EucHJvcF09KGEucHJvcD09PSJ3aWR0aCJ8fGEucHJvcD09PSJoZWlnaHQiP01hdGgubWF4KDAsYS5ub3cpOmEubm93KSthLnVuaXQ6YS5lbGVtW2EucHJvcF09YS5ub3d9fX0pLGYuZXhwciYmZi5leHByLmZpbHRlcnMmJihmLmV4cHIuZmlsdGVycy5hbmltYXRlZD1mdW5jdGlvbihhKXtyZXR1cm4gZi5ncmVwKGYudGltZXJzLGZ1bmN0aW9uKGIpe3JldHVybiBhPT09Yi5lbGVtfSkubGVuZ3RofSk7dmFyIGNzPS9edCg/OmFibGV8ZHxoKSQvaSxjdD0vXig/OmJvZHl8aHRtbCkkL2k7ImdldEJvdW5kaW5nQ2xpZW50UmVjdCJpbiBjLmRvY3VtZW50RWxlbWVudD9mLmZuLm9mZnNldD1mdW5jdGlvbihhKXt2YXIgYj10aGlzWzBdLGM7aWYoYSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGIpe2Yub2Zmc2V0LnNldE9mZnNldCh0aGlzLGEsYil9KTtpZighYnx8IWIub3duZXJEb2N1bWVudClyZXR1cm4gbnVsbDtpZihiPT09Yi5vd25lckRvY3VtZW50LmJvZHkpcmV0dXJuIGYub2Zmc2V0LmJvZHlPZmZzZXQoYik7dHJ5e2M9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKX1jYXRjaChkKXt9dmFyIGU9Yi5vd25lckRvY3VtZW50LGc9ZS5kb2N1bWVudEVsZW1lbnQ7aWYoIWN8fCFmLmNvbnRhaW5zKGcsYikpcmV0dXJuIGM/e3RvcDpjLnRvcCxsZWZ0OmMubGVmdH06e3RvcDowLGxlZnQ6MH07dmFyIGg9ZS5ib2R5LGk9Y3UoZSksaj1nLmNsaWVudFRvcHx8aC5jbGllbnRUb3B8fDAsaz1nLmNsaWVudExlZnR8fGguY2xpZW50TGVmdHx8MCxsPWkucGFnZVlPZmZzZXR8fGYuc3VwcG9ydC5ib3hNb2RlbCYmZy5zY3JvbGxUb3B8fGguc2Nyb2xsVG9wLG09aS5wYWdlWE9mZnNldHx8Zi5zdXBwb3J0LmJveE1vZGVsJiZnLnNjcm9sbExlZnR8fGguc2Nyb2xsTGVmdCxuPWMudG9wK2wtaixvPWMubGVmdCttLWs7cmV0dXJue3RvcDpuLGxlZnQ6b319OmYuZm4ub2Zmc2V0PWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXNbMF07aWYoYSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGIpe2Yub2Zmc2V0LnNldE9mZnNldCh0aGlzLGEsYil9KTtpZighYnx8IWIub3duZXJEb2N1bWVudClyZXR1cm4gbnVsbDtpZihiPT09Yi5vd25lckRvY3VtZW50LmJvZHkpcmV0dXJuIGYub2Zmc2V0LmJvZHlPZmZzZXQoYik7Zi5vZmZzZXQuaW5pdGlhbGl6ZSgpO3ZhciBjLGQ9Yi5vZmZzZXRQYXJlbnQsZT1iLGc9Yi5vd25lckRvY3VtZW50LGg9Zy5kb2N1bWVudEVsZW1lbnQsaT1nLmJvZHksaj1nLmRlZmF1bHRWaWV3LGs9aj9qLmdldENvbXB1dGVkU3R5bGUoYixudWxsKTpiLmN1cnJlbnRTdHlsZSxsPWIub2Zmc2V0VG9wLG09Yi5vZmZzZXRMZWZ0O3doaWxlKChiPWIucGFyZW50Tm9kZSkmJmIhPT1pJiZiIT09aCl7aWYoZi5vZmZzZXQuc3VwcG9ydHNGaXhlZFBvc2l0aW9uJiZrLnBvc2l0aW9uPT09ImZpeGVkIilicmVhaztjPWo/ai5nZXRDb21wdXRlZFN0eWxlKGIsbnVsbCk6Yi5jdXJyZW50U3R5bGUsbC09Yi5zY3JvbGxUb3AsbS09Yi5zY3JvbGxMZWZ0LGI9PT1kJiYobCs9Yi5vZmZzZXRUb3AsbSs9Yi5vZmZzZXRMZWZ0LGYub2Zmc2V0LmRvZXNOb3RBZGRCb3JkZXImJighZi5vZmZzZXQuZG9lc0FkZEJvcmRlckZvclRhYmxlQW5kQ2VsbHN8fCFjcy50ZXN0KGIubm9kZU5hbWUpKSYmKGwrPXBhcnNlRmxvYXQoYy5ib3JkZXJUb3BXaWR0aCl8fDAsbSs9cGFyc2VGbG9hdChjLmJvcmRlckxlZnRXaWR0aCl8fDApLGU9ZCxkPWIub2Zmc2V0UGFyZW50KSxmLm9mZnNldC5zdWJ0cmFjdHNCb3JkZXJGb3JPdmVyZmxvd05vdFZpc2libGUmJmMub3ZlcmZsb3chPT0idmlzaWJsZSImJihsKz1wYXJzZUZsb2F0KGMuYm9yZGVyVG9wV2lkdGgpfHwwLG0rPXBhcnNlRmxvYXQoYy5ib3JkZXJMZWZ0V2lkdGgpfHwwKSxrPWN9aWYoay5wb3NpdGlvbj09PSJyZWxhdGl2ZSJ8fGsucG9zaXRpb249PT0ic3RhdGljIilsKz1pLm9mZnNldFRvcCxtKz1pLm9mZnNldExlZnQ7Zi5vZmZzZXQuc3VwcG9ydHNGaXhlZFBvc2l0aW9uJiZrLnBvc2l0aW9uPT09ImZpeGVkIiYmKGwrPU1hdGgubWF4KGguc2Nyb2xsVG9wLGkuc2Nyb2xsVG9wKSxtKz1NYXRoLm1heChoLnNjcm9sbExlZnQsaS5zY3JvbGxMZWZ0KSk7cmV0dXJue3RvcDpsLGxlZnQ6bX19LGYub2Zmc2V0PXtpbml0aWFsaXplOmZ1bmN0aW9uKCl7dmFyIGE9Yy5ib2R5LGI9Yy5jcmVhdGVFbGVtZW50KCJkaXYiKSxkLGUsZyxoLGk9cGFyc2VGbG9hdChmLmNzcyhhLCJtYXJnaW5Ub3AiKSl8fDAsaj0iPGRpdiBzdHlsZT0ncG9zaXRpb246YWJzb2x1dGU7dG9wOjA7bGVmdDowO21hcmdpbjowO2JvcmRlcjo1cHggc29saWQgIzAwMDtwYWRkaW5nOjA7d2lkdGg6MXB4O2hlaWdodDoxcHg7Jz48ZGl2PjwvZGl2PjwvZGl2Pjx0YWJsZSBzdHlsZT0ncG9zaXRpb246YWJzb2x1dGU7dG9wOjA7bGVmdDowO21hcmdpbjowO2JvcmRlcjo1cHggc29saWQgIzAwMDtwYWRkaW5nOjA7d2lkdGg6MXB4O2hlaWdodDoxcHg7JyBjZWxscGFkZGluZz0nMCcgY2VsbHNwYWNpbmc9JzAnPjx0cj48dGQ+PC90ZD48L3RyPjwvdGFibGU+IjtmLmV4dGVuZChiLnN0eWxlLHtwb3NpdGlvbjoiYWJzb2x1dGUiLHRvcDowLGxlZnQ6MCxtYXJnaW46MCxib3JkZXI6MCx3aWR0aDoiMXB4IixoZWlnaHQ6IjFweCIsdmlzaWJpbGl0eToiaGlkZGVuIn0pLGIuaW5uZXJIVE1MPWosYS5pbnNlcnRCZWZvcmUoYixhLmZpcnN0Q2hpbGQpLGQ9Yi5maXJzdENoaWxkLGU9ZC5maXJzdENoaWxkLGg9ZC5uZXh0U2libGluZy5maXJzdENoaWxkLmZpcnN0Q2hpbGQsdGhpcy5kb2VzTm90QWRkQm9yZGVyPWUub2Zmc2V0VG9wIT09NSx0aGlzLmRvZXNBZGRCb3JkZXJGb3JUYWJsZUFuZENlbGxzPWgub2Zmc2V0VG9wPT09NSxlLnN0eWxlLnBvc2l0aW9uPSJmaXhlZCIsZS5zdHlsZS50b3A9IjIwcHgiLHRoaXMuc3VwcG9ydHNGaXhlZFBvc2l0aW9uPWUub2Zmc2V0VG9wPT09MjB8fGUub2Zmc2V0VG9wPT09MTUsZS5zdHlsZS5wb3NpdGlvbj1lLnN0eWxlLnRvcD0iIixkLnN0eWxlLm92ZXJmbG93PSJoaWRkZW4iLGQuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIix0aGlzLnN1YnRyYWN0c0JvcmRlckZvck92ZXJmbG93Tm90VmlzaWJsZT1lLm9mZnNldFRvcD09PS01LHRoaXMuZG9lc05vdEluY2x1ZGVNYXJnaW5JbkJvZHlPZmZzZXQ9YS5vZmZzZXRUb3AhPT1pLGEucmVtb3ZlQ2hpbGQoYiksZi5vZmZzZXQuaW5pdGlhbGl6ZT1mLm5vb3B9LGJvZHlPZmZzZXQ6ZnVuY3Rpb24oYSl7dmFyIGI9YS5vZmZzZXRUb3AsYz1hLm9mZnNldExlZnQ7Zi5vZmZzZXQuaW5pdGlhbGl6ZSgpLGYub2Zmc2V0LmRvZXNOb3RJbmNsdWRlTWFyZ2luSW5Cb2R5T2Zmc2V0JiYoYis9cGFyc2VGbG9hdChmLmNzcyhhLCJtYXJnaW5Ub3AiKSl8fDAsYys9cGFyc2VGbG9hdChmLmNzcyhhLCJtYXJnaW5MZWZ0IikpfHwwKTtyZXR1cm57dG9wOmIsbGVmdDpjfX0sc2V0T2Zmc2V0OmZ1bmN0aW9uKGEsYixjKXt2YXIgZD1mLmNzcyhhLCJwb3NpdGlvbiIpO2Q9PT0ic3RhdGljIiYmKGEuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIik7dmFyIGU9ZihhKSxnPWUub2Zmc2V0KCksaD1mLmNzcyhhLCJ0b3AiKSxpPWYuY3NzKGEsImxlZnQiKSxqPShkPT09ImFic29sdXRlInx8ZD09PSJmaXhlZCIpJiZmLmluQXJyYXkoImF1dG8iLFtoLGldKT4tMSxrPXt9LGw9e30sbSxuO2o/KGw9ZS5wb3NpdGlvbigpLG09bC50b3Asbj1sLmxlZnQpOihtPXBhcnNlRmxvYXQoaCl8fDAsbj1wYXJzZUZsb2F0KGkpfHwwKSxmLmlzRnVuY3Rpb24oYikmJihiPWIuY2FsbChhLGMsZykpLGIudG9wIT1udWxsJiYoay50b3A9Yi50b3AtZy50b3ArbSksYi5sZWZ0IT1udWxsJiYoay5sZWZ0PWIubGVmdC1nLmxlZnQrbiksInVzaW5nImluIGI/Yi51c2luZy5jYWxsKGEsayk6ZS5jc3Moayl9fSxmLmZuLmV4dGVuZCh7cG9zaXRpb246ZnVuY3Rpb24oKXtpZighdGhpc1swXSlyZXR1cm4gbnVsbDt2YXIgYT10aGlzWzBdLGI9dGhpcy5vZmZzZXRQYXJlbnQoKSxjPXRoaXMub2Zmc2V0KCksZD1jdC50ZXN0KGJbMF0ubm9kZU5hbWUpP3t0b3A6MCxsZWZ0OjB9OmIub2Zmc2V0KCk7Yy50b3AtPXBhcnNlRmxvYXQoZi5jc3MoYSwibWFyZ2luVG9wIikpfHwwLGMubGVmdC09cGFyc2VGbG9hdChmLmNzcyhhLCJtYXJnaW5MZWZ0IikpfHwwLGQudG9wKz1wYXJzZUZsb2F0KGYuY3NzKGJbMF0sImJvcmRlclRvcFdpZHRoIikpfHwwLGQubGVmdCs9cGFyc2VGbG9hdChmLmNzcyhiWzBdLCJib3JkZXJMZWZ0V2lkdGgiKSl8fDA7cmV0dXJue3RvcDpjLnRvcC1kLnRvcCxsZWZ0OmMubGVmdC1kLmxlZnR9fSxvZmZzZXRQYXJlbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKXt2YXIgYT10aGlzLm9mZnNldFBhcmVudHx8Yy5ib2R5O3doaWxlKGEmJiFjdC50ZXN0KGEubm9kZU5hbWUpJiZmLmNzcyhhLCJwb3NpdGlvbiIpPT09InN0YXRpYyIpYT1hLm9mZnNldFBhcmVudDtyZXR1cm4gYX0pfX0pLGYuZWFjaChbIkxlZnQiLCJUb3AiXSxmdW5jdGlvbihhLGMpe3ZhciBkPSJzY3JvbGwiK2M7Zi5mbltkXT1mdW5jdGlvbihjKXt2YXIgZSxnO2lmKGM9PT1iKXtlPXRoaXNbMF07aWYoIWUpcmV0dXJuIG51bGw7Zz1jdShlKTtyZXR1cm4gZz8icGFnZVhPZmZzZXQiaW4gZz9nW2E/InBhZ2VZT2Zmc2V0IjoicGFnZVhPZmZzZXQiXTpmLnN1cHBvcnQuYm94TW9kZWwmJmcuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50W2RdfHxnLmRvY3VtZW50LmJvZHlbZF06ZVtkXX1yZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Zz1jdSh0aGlzKSxnP2cuc2Nyb2xsVG8oYT9mKGcpLnNjcm9sbExlZnQoKTpjLGE/YzpmKGcpLnNjcm9sbFRvcCgpKTp0aGlzW2RdPWN9KX19KSxmLmVhY2goWyJIZWlnaHQiLCJXaWR0aCJdLGZ1bmN0aW9uKGEsYyl7dmFyIGQ9Yy50b0xvd2VyQ2FzZSgpO2YuZm5bImlubmVyIitjXT1mdW5jdGlvbigpe3ZhciBhPXRoaXNbMF07cmV0dXJuIGEmJmEuc3R5bGU/cGFyc2VGbG9hdChmLmNzcyhhLGQsInBhZGRpbmciKSk6bnVsbH0sZi5mblsib3V0ZXIiK2NdPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXNbMF07cmV0dXJuIGImJmIuc3R5bGU/cGFyc2VGbG9hdChmLmNzcyhiLGQsYT8ibWFyZ2luIjoiYm9yZGVyIikpOm51bGx9LGYuZm5bZF09ZnVuY3Rpb24oYSl7dmFyIGU9dGhpc1swXTtpZighZSlyZXR1cm4gYT09bnVsbD9udWxsOnRoaXM7aWYoZi5pc0Z1bmN0aW9uKGEpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYil7dmFyIGM9Zih0aGlzKTtjW2RdKGEuY2FsbCh0aGlzLGIsY1tkXSgpKSl9KTtpZihmLmlzV2luZG93KGUpKXt2YXIgZz1lLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudFsiY2xpZW50IitjXSxoPWUuZG9jdW1lbnQuYm9keTtyZXR1cm4gZS5kb2N1bWVudC5jb21wYXRNb2RlPT09IkNTUzFDb21wYXQiJiZnfHxoJiZoWyJjbGllbnQiK2NdfHxnfWlmKGUubm9kZVR5cGU9PT05KXJldHVybiBNYXRoLm1heChlLmRvY3VtZW50RWxlbWVudFsiY2xpZW50IitjXSxlLmJvZHlbInNjcm9sbCIrY10sZS5kb2N1bWVudEVsZW1lbnRbInNjcm9sbCIrY10sZS5ib2R5WyJvZmZzZXQiK2NdLGUuZG9jdW1lbnRFbGVtZW50WyJvZmZzZXQiK2NdKTtpZihhPT09Yil7dmFyIGk9Zi5jc3MoZSxkKSxqPXBhcnNlRmxvYXQoaSk7cmV0dXJuIGYuaXNOYU4oaik/aTpqfXJldHVybiB0aGlzLmNzcyhkLHR5cGVvZiBhPT0ic3RyaW5nIj9hOmErInB4Iil9fSksYS5qUXVlcnk9YS4kPWZ9KSh3aW5kb3cpOw==]]></data>
	</file>
	<file>
	  <filename>/src/MIT-LICENSE.txt</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[VGl0bGU6IE1JVCBMaWNlbnNlCgpDb3B5cmlnaHQgKGMpIDIwMDktMjAxMSBDaHJpcyBMZW9uZWxsbwoKUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQpvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAppbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCnRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCmZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CgpUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgphbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KClRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCklNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLApGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgpMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLApPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOClRIRSBTT0ZUV0FSRS4=]]></data>
	</file>
	<file>
	  <filename>/src/plugins/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/src/plugins/jqplot.barRenderer.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqCiAqIGpxUGxvdAogKiBQdXJlIEphdmFTY3JpcHQgcGxvdHRpbmcgcGx1Z2luIHVzaW5nIGpRdWVyeQogKgogKiBWZXJzaW9uOiAxLjAuMGIyX3IxMDEyCiAqCiAqIENvcHlyaWdodCAoYykgMjAwOS0yMDExIENocmlzIExlb25lbGxvCiAqIGpxUGxvdCBpcyBjdXJyZW50bHkgYXZhaWxhYmxlIGZvciB1c2UgaW4gYWxsIHBlcnNvbmFsIG9yIGNvbW1lcmNpYWwgcHJvamVjdHMgCiAqIHVuZGVyIGJvdGggdGhlIE1JVCAoaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHApIGFuZCBHUEwgCiAqIHZlcnNpb24gMi4wIChodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC5odG1sKSBsaWNlbnNlcy4gVGhpcyBtZWFucyB0aGF0IHlvdSBjYW4gCiAqIGNob29zZSB0aGUgbGljZW5zZSB0aGF0IGJlc3Qgc3VpdHMgeW91ciBwcm9qZWN0IGFuZCB1c2UgaXQgYWNjb3JkaW5nbHkuIAogKgogKiBBbHRob3VnaCBub3QgcmVxdWlyZWQsIHRoZSBhdXRob3Igd291bGQgYXBwcmVjaWF0ZSBhbiBlbWFpbCBsZXR0aW5nIGhpbSAKICoga25vdyBvZiBhbnkgc3Vic3RhbnRpYWwgdXNlIG9mIGpxUGxvdC4gIFlvdSBjYW4gcmVhY2ggdGhlIGF1dGhvciBhdDogCiAqIGNocmlzIGF0IGpxcGxvdCBkb3QgY29tIG9yIHNlZSBodHRwOi8vd3d3LmpxcGxvdC5jb20vaW5mby5waHAgLgogKgogKiBJZiB5b3UgYXJlIGZlZWxpbmcga2luZCBhbmQgZ2VuZXJvdXMsIGNvbnNpZGVyIHN1cHBvcnRpbmcgdGhlIHByb2plY3QgYnkKICogbWFraW5nIGEgZG9uYXRpb24gYXQ6IGh0dHA6Ly93d3cuanFwbG90LmNvbS9kb25hdGUucGhwIC4KICoKICogc3ByaW50ZiBmdW5jdGlvbnMgY29udGFpbmVkIGluIGpxcGxvdC5zcHJpbnRmLmpzIGJ5IEFzaCBTZWFybGU6CiAqCiAqICAgICB2ZXJzaW9uIDIwMDcuMDQuMjcKICogICAgIGF1dGhvciBBc2ggU2VhcmxlCiAqICAgICBodHRwOi8vaGV4bWVuLmNvbS9ibG9nLzIwMDcvMDMvcHJpbnRmLXNwcmludGYvCiAqICAgICBodHRwOi8vaGV4bWVuLmNvbS9qcy9zcHJpbnRmLmpzCiAqICAgICBUaGUgYXV0aG9yIChBc2ggU2VhcmxlKSBoYXMgcGxhY2VkIHRoaXMgY29kZSBpbiB0aGUgcHVibGljIGRvbWFpbjoKICogICAgICJUaGlzIGNvZGUgaXMgdW5yZXN0cmljdGVkOiB5b3UgYXJlIGZyZWUgdG8gdXNlIGl0IGhvd2V2ZXIgeW91IGxpa2UuIgogKiAKICovCihmdW5jdGlvbigkKSB7CiAgICAKICAgIC8vIENsYXNzOiAkLmpxcGxvdC5CYXJSZW5kZXJlcgogICAgLy8gQSBwbHVnaW4gcmVuZGVyZXIgZm9yIGpxUGxvdCB0byBkcmF3IGEgYmFyIHBsb3QuCiAgICAvLyBEcmF3cyBzZXJpZXMgYXMgYSBsaW5lLgogICAgCiAgICAkLmpxcGxvdC5CYXJSZW5kZXJlciA9IGZ1bmN0aW9uKCl7CiAgICAgICAgJC5qcXBsb3QuTGluZVJlbmRlcmVyLmNhbGwodGhpcyk7CiAgICB9OwogICAgCiAgICAkLmpxcGxvdC5CYXJSZW5kZXJlci5wcm90b3R5cGUgPSBuZXcgJC5qcXBsb3QuTGluZVJlbmRlcmVyKCk7CiAgICAkLmpxcGxvdC5CYXJSZW5kZXJlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSAkLmpxcGxvdC5CYXJSZW5kZXJlcjsKICAgIAogICAgLy8gY2FsbGVkIHdpdGggc2NvcGUgb2Ygc2VyaWVzLgogICAgJC5qcXBsb3QuQmFyUmVuZGVyZXIucHJvdG90eXBlLmluaXQgPSBmdW5jdGlvbihvcHRpb25zLCBwbG90KSB7CiAgICAgICAgLy8gR3JvdXA6IFByb3BlcnRpZXMKICAgICAgICAvLwogICAgICAgIC8vIHByb3A6IGJhclBhZGRpbmcKICAgICAgICAvLyBOdW1iZXIgb2YgcGl4ZWxzIGJldHdlZW4gYWRqYWNlbnQgYmFycyBhdCB0aGUgc2FtZSBheGlzIHZhbHVlLgogICAgICAgIHRoaXMuYmFyUGFkZGluZyA9IDg7CiAgICAgICAgLy8gcHJvcDogYmFyTWFyZ2luCiAgICAgICAgLy8gTnVtYmVyIG9mIHBpeGVscyBiZXR3ZWVuIGdyb3VwcyBvZiBiYXJzIGF0IGFkamFjZW50IGF4aXMgdmFsdWVzLgogICAgICAgIHRoaXMuYmFyTWFyZ2luID0gMTA7CiAgICAgICAgLy8gcHJvcDogYmFyRGlyZWN0aW9uCiAgICAgICAgLy8gJ3ZlcnRpY2FsJyA9IHVwIGFuZCBkb3duIGJhcnMsICdob3Jpem9udGFsJyA9IHNpZGUgdG8gc2lkZSBiYXJzCiAgICAgICAgdGhpcy5iYXJEaXJlY3Rpb24gPSAndmVydGljYWwnOwogICAgICAgIC8vIHByb3A6IGJhcldpZHRoCiAgICAgICAgLy8gV2lkdGggb2YgdGhlIGJhciBpbiBwaXhlbHMgKGF1dG8gYnkgZGV2YXVsKS4gIG51bGwgPSBjYWxjdWxhdGVkIGF1dG9tYXRpY2FsbHkuCiAgICAgICAgdGhpcy5iYXJXaWR0aCA9IG51bGw7CiAgICAgICAgLy8gcHJvcDogc2hhZG93T2Zmc2V0CiAgICAgICAgLy8gb2Zmc2V0IG9mIHRoZSBzaGFkb3cgZnJvbSB0aGUgc2xpY2UgYW5kIG9mZnNldCBvZiAKICAgICAgICAvLyBlYWNoIHN1Y2Nlc2l2ZSBzdHJva2Ugb2YgdGhlIHNoYWRvdyBmcm9tIHRoZSBsYXN0LgogICAgICAgIHRoaXMuc2hhZG93T2Zmc2V0ID0gMjsKICAgICAgICAvLyBwcm9wOiBzaGFkb3dEZXB0aAogICAgICAgIC8vIG51bWJlciBvZiBzdHJva2VzIHRvIGFwcGx5IHRvIHRoZSBzaGFkb3csIAogICAgICAgIC8vIGVhY2ggc3Ryb2tlIG9mZnNldCBzaGFkb3dPZmZzZXQgZnJvbSB0aGUgbGFzdC4KICAgICAgICB0aGlzLnNoYWRvd0RlcHRoID0gNTsKICAgICAgICAvLyBwcm9wOiBzaGFkb3dBbHBoYQogICAgICAgIC8vIHRyYW5zcGFyZW5jeSBvZiB0aGUgc2hhZG93ICgwID0gdHJhbnNwYXJlbnQsIDEgPSBvcGFxdWUpCiAgICAgICAgdGhpcy5zaGFkb3dBbHBoYSA9IDAuMDg7CiAgICAgICAgLy8gcHJvcDogd2F0ZXJmYWxsCiAgICAgICAgLy8gdHJ1ZSB0byBlbmFibGUgd2F0ZXJmYWxsIHBsb3QuCiAgICAgICAgdGhpcy53YXRlcmZhbGwgPSBmYWxzZTsKICAgICAgICAvLyBwcm9wOiBncm91cHMKICAgICAgICAvLyBncm91cCBiYXJzIGludG8gdGhpcyBtYW55IGdyb3VwcwogICAgICAgIHRoaXMuZ3JvdXBzID0gMTsKICAgICAgICAvLyBwcm9wOiB2YXJ5QmFyQ29sb3IKICAgICAgICAvLyB0cnVlIHRvIGNvbG9yIGVhY2ggYmFyIG9mIGEgc2VyaWVzIHNlcGFyYXRlbHkgcmF0aGVyIHRoYW4KICAgICAgICAvLyBoYXZlIGV2ZXJ5IGJhciBvZiBhIGdpdmVuIHNlcmllcyB0aGUgc2FtZSBjb2xvci4KICAgICAgICAvLyBJZiB1c2VkIGZvciBub24tc3RhY2tlZCBtdWx0aXBsZSBzZXJpZXMgYmFyIHBsb3RzLCB1c2VyIHNob3VsZAogICAgICAgIC8vIHNwZWNpZnkgYSBzZXBhcmF0ZSAnc2VyaWVzQ29sb3JzJyBhcnJheSBmb3IgZWFjaCBzZXJpZXMuCiAgICAgICAgLy8gT3RoZXJ3aXNlLCBlYWNoIHNlcmllcyB3aWxsIHNldCB0aGVpciBiYXJzIHRvIHRoZSBzYW1lIGNvbG9yIGFycmF5LgogICAgICAgIC8vIFRoaXMgb3B0aW9uIGhhcyBubyBFZmZlY3QgZm9yIHN0YWNrZWQgYmFyIGNoYXJ0cyBhbmQgaXMgZGlzYWJsZWQuCiAgICAgICAgdGhpcy52YXJ5QmFyQ29sb3IgPSBmYWxzZTsKICAgICAgICAvLyBwcm9wOiBoaWdobGlnaHRNb3VzZU92ZXIKICAgICAgICAvLyBUcnVlIHRvIGhpZ2hsaWdodCBzbGljZSB3aGVuIG1vdXNlZCBvdmVyLgogICAgICAgIC8vIFRoaXMgbXVzdCBiZSBmYWxzZSB0byBlbmFibGUgaGlnaGxpZ2h0TW91c2VEb3duIHRvIGhpZ2hsaWdodCB3aGVuIGNsaWNraW5nIG9uIGEgc2xpY2UuCiAgICAgICAgdGhpcy5oaWdobGlnaHRNb3VzZU92ZXIgPSB0cnVlOwogICAgICAgIC8vIHByb3A6IGhpZ2hsaWdodE1vdXNlRG93bgogICAgICAgIC8vIFRydWUgdG8gaGlnaGxpZ2h0IHdoZW4gYSBtb3VzZSBidXR0b24gaXMgcHJlc3NlZCBvdmVyIGEgc2xpY2UuCiAgICAgICAgLy8gVGhpcyB3aWxsIGJlIGRpc2FibGVkIGlmIGhpZ2hsaWdodE1vdXNlT3ZlciBpcyB0cnVlLgogICAgICAgIHRoaXMuaGlnaGxpZ2h0TW91c2VEb3duID0gZmFsc2U7CiAgICAgICAgLy8gcHJvcDogaGlnaGxpZ2h0Q29sb3JzCiAgICAgICAgLy8gYW4gYXJyYXkgb2YgY29sb3JzIHRvIHVzZSB3aGVuIGhpZ2hsaWdodGluZyBhIGJhci4KICAgICAgICB0aGlzLmhpZ2hsaWdodENvbG9ycyA9IFtdOwogICAgICAgIC8vIHByb3A6IHRyYW5zcG9zZWREYXRhCiAgICAgICAgLy8gTk9UIElNUExFTUVOVEVEIFlFVC4gIFRydWUgaWYgdGhpcyBpcyBhIGhvcml6b250YWwgYmFyIHBsb3QgYW5kIAogICAgICAgIC8vIHggYW5kIHkgdmFsdWVzIGFyZSAidHJhbnNwb3NlZCIuICBUcmFucG9zZWQsIG9yICJzd2FwcGVkIiwgZGF0YSBpcyAKICAgICAgICAvLyByZXF1aXJlZCBwcmlvciB0byByZXYuIDg5NCBidWlsZHMgb2YganFQbG90IHdpdGggaG9yaXpvbnRhbCBiYXJzLiAKICAgICAgICAvLyBBbGxvd3MgYmFja3dhcmQgY29tcGF0YWJpbGl0eSBvZiBiYXIgcmVuZGVyZXIgaG9yaXpvbnRhbCBiYXJzIHdpdGggCiAgICAgICAgLy8gb2xkIHN0eWxlIGRhdGEgc2V0cy4KICAgICAgICB0aGlzLnRyYW5zcG9zZWREYXRhID0gdHJ1ZTsKICAgICAgICB0aGlzLnJlbmRlcmVyLmFuaW1hdGlvbiA9IHsKICAgICAgICAgICAgc2hvdzogZmFsc2UsCiAgICAgICAgICAgIGRpcmVjdGlvbjogJ2Rvd24nLAogICAgICAgICAgICBzcGVlZDogMzAwMCwKICAgICAgICAgICAgX3N1cHBvcnRlZDogdHJ1ZQogICAgICAgIH07CiAgICAgICAgdGhpcy5fdHlwZSA9ICdiYXInOwogICAgICAgIAogICAgICAgIC8vIGlmIHVzZXIgaGFzIHBhc3NlZCBpbiBoaWdobGlnaHRNb3VzZURvd24gb3B0aW9uIGFuZCBub3Qgc2V0IGhpZ2hsaWdodE1vdXNlT3ZlciwgZGlzYWJsZSBoaWdobGlnaHRNb3VzZU92ZXIKICAgICAgICBpZiAob3B0aW9ucy5oaWdobGlnaHRNb3VzZURvd24gJiYgb3B0aW9ucy5oaWdobGlnaHRNb3VzZU92ZXIgPT0gbnVsbCkgewogICAgICAgICAgICBvcHRpb25zLmhpZ2hsaWdodE1vdXNlT3ZlciA9IGZhbHNlOwogICAgICAgIH0KICAgICAgICAKICAgICAgICAvLy8vLy8KICAgICAgICAvLyBUaGlzIGlzIHByb2JhYmx5IHdyb25nIGhlcmUuCiAgICAgICAgLy8gQWZ0ZXIgZ29pbmcgYmFjayBhbmQgZm9ydGggb24gd2V0aGVyIHJlbmRlcmVyIHNob3VsZCBiZSB0aGUgdGhpbmcKICAgICAgICAvLyBvciBleHRlbmQgdGhlIHRoaW5nLCBpdCBzZWVtcyB0aGF0IGl0IGl0IGJlc3QgaWYgaXQgaXMgYSBwcm9wZXJ0eQogICAgICAgIC8vIG9uIHRoZSB0aGluZy4gIFRoaXMgc2hvdWxkIGJlIHNvbWV0aGluZyB0aGF0IGlzIGNvbW1vbml6ZWQgCiAgICAgICAgLy8gYW1vbmcgc2VyaWVzIHJlbmRlcmVycyBpbiB0aGUgZnV0dXJlLgogICAgICAgIC8vLy8vLwogICAgICAgICQuZXh0ZW5kKHRydWUsIHRoaXMsIG9wdGlvbnMpOwoKICAgICAgICAvLyByZWFsbHkgc2hvdWxkIHByb2JhYmx5IGRvIHRoaXMKICAgICAgICAkLmV4dGVuZCh0cnVlLCB0aGlzLnJlbmRlcmVyLCBvcHRpb25zKTsKICAgICAgICAvLyBmaWxsIGlzIHN0aWxsIG5lZWRlZCB0byBwcm9wZXJseSBkcmF3IHRoZSBsZWdlbmQuCiAgICAgICAgLy8gYmFycyBoYXZlIHRvIGJlIGZpbGxlZC4KICAgICAgICB0aGlzLmZpbGwgPSB0cnVlOwoKICAgICAgICAvLyBpZiBob3Jpem9udGFsIGJhciBhbmQgYW5pbWF0aW5nLCByZXNldCB0aGUgZGVmYXVsdCBkaXJlY3Rpb24KICAgICAgICBpZiAodGhpcy5iYXJEaXJlY3Rpb24gPT09ICdob3Jpem9udGFsJyAmJiB0aGlzLnJlbmRlcmVyT3B0aW9ucy5hbmltYXRpb24gJiYgdGhpcy5yZW5kZXJlck9wdGlvbnMuYW5pbWF0aW9uLmRpcmVjdGlvbiA9PSBudWxsKSB7CiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuYW5pbWF0aW9uLmRpcmVjdGlvbiA9ICdsZWZ0JzsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYgKHRoaXMud2F0ZXJmYWxsKSB7CiAgICAgICAgICAgIHRoaXMuZmlsbFRvWmVybyA9IGZhbHNlOwogICAgICAgICAgICB0aGlzLmRpc2FibGVTdGFjayA9IHRydWU7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmICh0aGlzLmJhckRpcmVjdGlvbiA9PSAndmVydGljYWwnICkgewogICAgICAgICAgICB0aGlzLl9wcmltYXJ5QXhpcyA9ICdfeGF4aXMnOwogICAgICAgICAgICB0aGlzLl9zdGFja0F4aXMgPSAneSc7CiAgICAgICAgICAgIHRoaXMuZmlsbEF4aXMgPSAneSc7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICB0aGlzLl9wcmltYXJ5QXhpcyA9ICdfeWF4aXMnOwogICAgICAgICAgICB0aGlzLl9zdGFja0F4aXMgPSAneCc7CiAgICAgICAgICAgIHRoaXMuZmlsbEF4aXMgPSAneCc7CiAgICAgICAgfQogICAgICAgIC8vIGluZGV4IG9mIHRoZSBjdXJyZW50eSBoaWdobGlnaHRlZCBwb2ludCwgaWYgYW55CiAgICAgICAgdGhpcy5faGlnaGxpZ2h0ZWRQb2ludCA9IG51bGw7CiAgICAgICAgLy8gdG90YWwgbnVtYmVyIG9mIHZhbHVlcyBmb3IgYWxsIGJhciBzZXJpZXMsIHRvdGFsIG51bWJlciBvZiBiYXIgc2VyaWVzLCBhbmQgcG9zaXRpb24gb2YgdGhpcyBzZXJpZXMKICAgICAgICB0aGlzLl9wbG90U2VyaWVzSW5mbyA9IG51bGw7CiAgICAgICAgLy8gQXJyYXkgb2YgYWN0dWFsIGRhdGEgY29sb3JzIHVzZWQgZm9yIGVhY2ggZGF0YSBwb2ludC4KICAgICAgICB0aGlzLl9kYXRhQ29sb3JzID0gW107CiAgICAgICAgdGhpcy5fYmFyUG9pbnRzID0gW107CiAgICAgICAgCiAgICAgICAgLy8gc2V0IHRoZSBzaGFwZSByZW5kZXJlciBvcHRpb25zCiAgICAgICAgdmFyIG9wdHMgPSB7bGluZUpvaW46J21pdGVyJywgbGluZUNhcDoncm91bmQnLCBmaWxsOnRydWUsIGlzYXJjOmZhbHNlLCBzdHJva2VTdHlsZTp0aGlzLmNvbG9yLCBmaWxsU3R5bGU6dGhpcy5jb2xvciwgY2xvc2VQYXRoOnRoaXMuZmlsbH07CiAgICAgICAgdGhpcy5yZW5kZXJlci5zaGFwZVJlbmRlcmVyLmluaXQob3B0cyk7CiAgICAgICAgLy8gc2V0IHRoZSBzaGFkb3cgcmVuZGVyZXIgb3B0aW9ucwogICAgICAgIHZhciBzb3B0cyA9IHtsaW5lSm9pbjonbWl0ZXInLCBsaW5lQ2FwOidyb3VuZCcsIGZpbGw6dHJ1ZSwgaXNhcmM6ZmFsc2UsIGFuZ2xlOnRoaXMuc2hhZG93QW5nbGUsIG9mZnNldDp0aGlzLnNoYWRvd09mZnNldCwgYWxwaGE6dGhpcy5zaGFkb3dBbHBoYSwgZGVwdGg6dGhpcy5zaGFkb3dEZXB0aCwgY2xvc2VQYXRoOnRoaXMuZmlsbH07CiAgICAgICAgdGhpcy5yZW5kZXJlci5zaGFkb3dSZW5kZXJlci5pbml0KHNvcHRzKTsKICAgICAgICAKICAgICAgICBwbG90LnBvc3RJbml0SG9va3MuYWRkT25jZShwb3N0SW5pdCk7CiAgICAgICAgcGxvdC5wb3N0RHJhd0hvb2tzLmFkZE9uY2UocG9zdFBsb3REcmF3KTsKICAgICAgICBwbG90LmV2ZW50TGlzdGVuZXJIb29rcy5hZGRPbmNlKCdqcXBsb3RNb3VzZU1vdmUnLCBoYW5kbGVNb3ZlKTsKICAgICAgICBwbG90LmV2ZW50TGlzdGVuZXJIb29rcy5hZGRPbmNlKCdqcXBsb3RNb3VzZURvd24nLCBoYW5kbGVNb3VzZURvd24pOwogICAgICAgIHBsb3QuZXZlbnRMaXN0ZW5lckhvb2tzLmFkZE9uY2UoJ2pxcGxvdE1vdXNlVXAnLCBoYW5kbGVNb3VzZVVwKTsKICAgICAgICBwbG90LmV2ZW50TGlzdGVuZXJIb29rcy5hZGRPbmNlKCdqcXBsb3RDbGljaycsIGhhbmRsZUNsaWNrKTsKICAgICAgICBwbG90LmV2ZW50TGlzdGVuZXJIb29rcy5hZGRPbmNlKCdqcXBsb3RSaWdodENsaWNrJywgaGFuZGxlUmlnaHRDbGljayk7IAogICAgfTsKICAgIAogICAgLy8gY2FsbGVkIHdpdGggc2NvcGUgb2Ygc2VyaWVzCiAgICBmdW5jdGlvbiBiYXJQcmVJbml0KHRhcmdldCwgZGF0YSwgc2VyaWVzRGVmYXVsdHMsIG9wdGlvbnMpIHsKICAgICAgICBpZiAodGhpcy5yZW5kZXJlck9wdGlvbnMuYmFyRGlyZWN0aW9uID09ICdob3Jpem9udGFsJykgewogICAgICAgICAgICB0aGlzLl9zdGFja0F4aXMgPSAneCc7CiAgICAgICAgICAgIHRoaXMuX3ByaW1hcnlBeGlzID0gJ195YXhpcyc7CiAgICAgICAgfQogICAgICAgIGlmICh0aGlzLnJlbmRlcmVyT3B0aW9ucy53YXRlcmZhbGwgPT0gdHJ1ZSkgewogICAgICAgICAgICB0aGlzLl9kYXRhID0gJC5leHRlbmQodHJ1ZSwgW10sIHRoaXMuZGF0YSk7CiAgICAgICAgICAgIHZhciBzdW0gPSAwOwogICAgICAgICAgICB2YXIgcG9zID0gKCF0aGlzLnJlbmRlcmVyT3B0aW9ucy5iYXJEaXJlY3Rpb24gfHwgdGhpcy5yZW5kZXJlck9wdGlvbnMuYmFyRGlyZWN0aW9uID09PSAndmVydGljYWwnIHx8IHRoaXMudHJhbnNwb3NlZERhdGEgPT09IGZhbHNlKSA/IDEgOiAwOwogICAgICAgICAgICBmb3IodmFyIGk9MDsgaTx0aGlzLmRhdGEubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIHN1bSArPSB0aGlzLmRhdGFbaV1bcG9zXTsKICAgICAgICAgICAgICAgIGlmIChpPjApIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGFbaV1bcG9zXSArPSB0aGlzLmRhdGFbaS0xXVtwb3NdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuZGF0YVt0aGlzLmRhdGEubGVuZ3RoXSA9IChwb3MgPT0gMSkgPyBbdGhpcy5kYXRhLmxlbmd0aCsxLCBzdW1dIDogW3N1bSwgdGhpcy5kYXRhLmxlbmd0aCsxXTsKICAgICAgICAgICAgdGhpcy5fZGF0YVt0aGlzLl9kYXRhLmxlbmd0aF0gPSAocG9zID09IDEpID8gW3RoaXMuX2RhdGEubGVuZ3RoKzEsIHN1bV0gOiBbc3VtLCB0aGlzLl9kYXRhLmxlbmd0aCsxXTsKICAgICAgICB9CiAgICAgICAgaWYgKHRoaXMucmVuZGVyZXJPcHRpb25zLmdyb3VwcyA+IDEpIHsKICAgICAgICAgICAgdGhpcy5icmVha09uTnVsbCA9IHRydWU7CiAgICAgICAgICAgIHZhciBsID0gdGhpcy5kYXRhLmxlbmd0aDsKICAgICAgICAgICAgdmFyIHNraXAgPSBwYXJzZUludChsL3RoaXMucmVuZGVyZXJPcHRpb25zLmdyb3VwcywgMTApOwogICAgICAgICAgICB2YXIgY291bnQgPSAwOwogICAgICAgICAgICBmb3IgKHZhciBpPXNraXA7IGk8bDsgaSs9c2tpcCkgewogICAgICAgICAgICAgICAgdGhpcy5kYXRhLnNwbGljZShpK2NvdW50LCAwLCBbbnVsbCwgbnVsbF0pOwogICAgICAgICAgICAgICAgY291bnQrKzsKICAgICAgICAgICAgfQogICAgICAgICAgICBmb3IgKGk9MDsgaTx0aGlzLmRhdGEubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLl9wcmltYXJ5QXhpcyA9PSAnX3hheGlzJykgewogICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YVtpXVswXSA9IGkrMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YVtpXVsxXSA9IGkrMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIAogICAgJC5qcXBsb3QucHJlU2VyaWVzSW5pdEhvb2tzLnB1c2goYmFyUHJlSW5pdCk7CiAgICAKICAgIC8vIG5lZWRzIHRvIGJlIGNhbGxlZCB3aXRoIHNjb3BlIG9mIHNlcmllcywgbm90IHJlbmRlcmVyLgogICAgJC5qcXBsb3QuQmFyUmVuZGVyZXIucHJvdG90eXBlLmNhbGNTZXJpZXNOdW1iZXJzID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIG52YWxzID0gMDsKICAgICAgICB2YXIgbnNlcmllcyA9IDA7CiAgICAgICAgdmFyIHBheGlzID0gdGhpc1t0aGlzLl9wcmltYXJ5QXhpc107CiAgICAgICAgdmFyIHMsIHNlcmllcywgcG9zOwogICAgICAgIC8vIGxvb3AgdGhyb3VnaCBhbGwgc2VyaWVzIG9uIHRoaXMgYXhpcwogICAgICAgIGZvciAodmFyIGk9MDsgaSA8IHBheGlzLl9zZXJpZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgc2VyaWVzID0gcGF4aXMuX3Nlcmllc1tpXTsKICAgICAgICAgICAgaWYgKHNlcmllcyA9PT0gdGhpcykgewogICAgICAgICAgICAgICAgcG9zID0gaTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBpcyB0aGUgc2VyaWVzIHJlbmRlcmVkIGFzIGEgYmFyPwogICAgICAgICAgICBpZiAoc2VyaWVzLnJlbmRlcmVyLmNvbnN0cnVjdG9yID09ICQuanFwbG90LkJhclJlbmRlcmVyKSB7CiAgICAgICAgICAgICAgICAvLyBncmlkRGF0YSBtYXkgbm90IGJlIGNvbXB1dGVkIHlldCwgdXNlIGRhdGEgbGVuZ3RoIGluc3RlZAogICAgICAgICAgICAgICAgbnZhbHMgKz0gc2VyaWVzLmRhdGEubGVuZ3RoOwogICAgICAgICAgICAgICAgbnNlcmllcyArPSAxOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vIHJldHVybiB0b3RhbCBudW1iZXIgb2YgdmFsdWVzIGZvciBhbGwgYmFyIHNlcmllcywgdG90YWwgbnVtYmVyIG9mIGJhciBzZXJpZXMsIGFuZCBwb3NpdGlvbiBvZiB0aGlzIHNlcmllcwogICAgICAgIHJldHVybiBbbnZhbHMsIG5zZXJpZXMsIHBvc107CiAgICB9OwoKICAgICQuanFwbG90LkJhclJlbmRlcmVyLnByb3RvdHlwZS5zZXRCYXJXaWR0aCA9IGZ1bmN0aW9uKCkgewogICAgICAgIC8vIG5lZWQgdG8ga25vdyBob3cgbWFueSBkYXRhIHZhbHVlcyB3ZSBoYXZlIG9uIHRoZSBhcHByb3ByYXRlIGF4aXMgYW5kIGZpZ3VyZSBpdCBvdXQuCiAgICAgICAgdmFyIGk7CiAgICAgICAgdmFyIG52YWxzID0gMDsKICAgICAgICB2YXIgbnNlcmllcyA9IDA7CiAgICAgICAgdmFyIHBheGlzID0gdGhpc1t0aGlzLl9wcmltYXJ5QXhpc107CiAgICAgICAgdmFyIHMsIHNlcmllcywgcG9zOwogICAgICAgIHZhciB0ZW1wID0gdGhpcy5fcGxvdFNlcmllc0luZm8gPSB0aGlzLnJlbmRlcmVyLmNhbGNTZXJpZXNOdW1iZXJzLmNhbGwodGhpcyk7CiAgICAgICAgbnZhbHMgPSB0ZW1wWzBdOwogICAgICAgIG5zZXJpZXMgPSB0ZW1wWzFdOwogICAgICAgIHZhciBudGlja3MgPSBwYXhpcy5udW1iZXJUaWNrczsKICAgICAgICB2YXIgbmJpbnMgPSAobnRpY2tzLTEpLzI7CiAgICAgICAgLy8gc28sIG5vdyB3ZSBoYXZlIHRvdGFsIG51bWJlciBvZiBheGlzIHZhbHVlcy4KICAgICAgICBpZiAocGF4aXMubmFtZSA9PSAneGF4aXMnIHx8IHBheGlzLm5hbWUgPT0gJ3gyYXhpcycpIHsKICAgICAgICAgICAgaWYgKHRoaXMuX3N0YWNrKSB7CiAgICAgICAgICAgICAgICB0aGlzLmJhcldpZHRoID0gKHBheGlzLl9vZmZzZXRzLm1heCAtIHBheGlzLl9vZmZzZXRzLm1pbikgLyBudmFscyAqIG5zZXJpZXMgLSB0aGlzLmJhck1hcmdpbjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHRoaXMuYmFyV2lkdGggPSAoKHBheGlzLl9vZmZzZXRzLm1heCAtIHBheGlzLl9vZmZzZXRzLm1pbikvbmJpbnMgIC0gdGhpcy5iYXJQYWRkaW5nICogKG5zZXJpZXMtMSkgLSB0aGlzLmJhck1hcmdpbioyKS9uc2VyaWVzOwogICAgICAgICAgICAgICAgLy8gdGhpcy5iYXJXaWR0aCA9IChwYXhpcy5fb2Zmc2V0cy5tYXggLSBwYXhpcy5fb2Zmc2V0cy5taW4pIC8gbnZhbHMgLSB0aGlzLmJhclBhZGRpbmcgLSB0aGlzLmJhck1hcmdpbi9uc2VyaWVzOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBpZiAodGhpcy5fc3RhY2spIHsKICAgICAgICAgICAgICAgIHRoaXMuYmFyV2lkdGggPSAocGF4aXMuX29mZnNldHMubWluIC0gcGF4aXMuX29mZnNldHMubWF4KSAvIG52YWxzICogbnNlcmllcyAtIHRoaXMuYmFyTWFyZ2luOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgdGhpcy5iYXJXaWR0aCA9ICgocGF4aXMuX29mZnNldHMubWluIC0gcGF4aXMuX29mZnNldHMubWF4KS9uYmlucyAgLSB0aGlzLmJhclBhZGRpbmcgKiAobnNlcmllcy0xKSAtIHRoaXMuYmFyTWFyZ2luKjIpL25zZXJpZXM7CiAgICAgICAgICAgICAgICAvLyB0aGlzLmJhcldpZHRoID0gKHBheGlzLl9vZmZzZXRzLm1pbiAtIHBheGlzLl9vZmZzZXRzLm1heCkgLyBudmFscyAtIHRoaXMuYmFyUGFkZGluZyAtIHRoaXMuYmFyTWFyZ2luL25zZXJpZXM7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIFtudmFscywgbnNlcmllc107CiAgICB9OwoKICAgIGZ1bmN0aW9uIGNvbXB1dGVIaWdobGlnaHRDb2xvcnMgKGNvbG9ycykgewogICAgICAgIHZhciByZXQgPSBbXTsKICAgICAgICBmb3IgKHZhciBpPTA7IGk8Y29sb3JzLmxlbmd0aDsgaSsrKXsKICAgICAgICAgICAgdmFyIHJnYmEgPSAkLmpxcGxvdC5nZXRDb2xvckNvbXBvbmVudHMoY29sb3JzW2ldKTsKICAgICAgICAgICAgdmFyIG5ld3JnYiA9IFtyZ2JhWzBdLCByZ2JhWzFdLCByZ2JhWzJdXTsKICAgICAgICAgICAgdmFyIHN1bSA9IG5ld3JnYlswXSArIG5ld3JnYlsxXSArIG5ld3JnYlsyXTsKICAgICAgICAgICAgZm9yICh2YXIgaj0wOyBqPDM7IGorKykgewogICAgICAgICAgICAgICAgLy8gd2hlbiBkYXJrZW5pbmcsIGxvd2VzdCBjb2xvciBjb21wb25lbnQgY2FuIGJlIGlzIDYwLgogICAgICAgICAgICAgICAgbmV3cmdiW2pdID0gKHN1bSA+IDU3MCkgPyAgbmV3cmdiW2pdICogMC44IDogbmV3cmdiW2pdICsgMC4zICogKDI1NSAtIG5ld3JnYltqXSk7CiAgICAgICAgICAgICAgICBuZXdyZ2Jbal0gPSBwYXJzZUludChuZXdyZ2Jbal0sIDEwKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXQucHVzaCgncmdiKCcrbmV3cmdiWzBdKycsJytuZXdyZ2JbMV0rJywnK25ld3JnYlsyXSsnKScpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmV0OwogICAgfQogICAgCiAgICAkLmpxcGxvdC5CYXJSZW5kZXJlci5wcm90b3R5cGUuZHJhdyA9IGZ1bmN0aW9uKGN0eCwgZ3JpZERhdGEsIG9wdGlvbnMpIHsKICAgICAgICB2YXIgaTsKICAgICAgICAvLyBVZ2hoaCwgaGF2ZSB0byBtYWtlIGEgY29weSBvZiBvcHRpb25zIGIvYyBpdCBtYXkgYmUgbW9kaWZpZWQgbGF0ZXIuCiAgICAgICAgdmFyIG9wdHMgPSAkLmV4dGVuZCh7fSwgb3B0aW9ucyk7CiAgICAgICAgdmFyIHNoYWRvdyA9IChvcHRzLnNoYWRvdyAhPSB1bmRlZmluZWQpID8gb3B0cy5zaGFkb3cgOiB0aGlzLnNoYWRvdzsKICAgICAgICB2YXIgc2hvd0xpbmUgPSAob3B0cy5zaG93TGluZSAhPSB1bmRlZmluZWQpID8gb3B0cy5zaG93TGluZSA6IHRoaXMuc2hvd0xpbmU7CiAgICAgICAgdmFyIGZpbGwgPSAob3B0cy5maWxsICE9IHVuZGVmaW5lZCkgPyBvcHRzLmZpbGwgOiB0aGlzLmZpbGw7CiAgICAgICAgdmFyIHhheGlzID0gdGhpcy54YXhpczsKICAgICAgICB2YXIgeWF4aXMgPSB0aGlzLnlheGlzOwogICAgICAgIHZhciB4cCA9IHRoaXMuX3hheGlzLnNlcmllc191MnA7CiAgICAgICAgdmFyIHlwID0gdGhpcy5feWF4aXMuc2VyaWVzX3UycDsKICAgICAgICB2YXIgcG9pbnR4LCBwb2ludHk7CiAgICAgICAgLy8gY2xlYXIgb3V0IGRhdGEgY29sb3JzLgogICAgICAgIHRoaXMuX2RhdGFDb2xvcnMgPSBbXTsKICAgICAgICB0aGlzLl9iYXJQb2ludHMgPSBbXTsKICAgICAgICAKICAgICAgICBpZiAodGhpcy5iYXJXaWR0aCA9PSBudWxsKSB7CiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0QmFyV2lkdGguY2FsbCh0aGlzKTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgdmFyIHRlbXAgPSB0aGlzLl9wbG90U2VyaWVzSW5mbyA9IHRoaXMucmVuZGVyZXIuY2FsY1Nlcmllc051bWJlcnMuY2FsbCh0aGlzKTsKICAgICAgICB2YXIgbnZhbHMgPSB0ZW1wWzBdOwogICAgICAgIHZhciBuc2VyaWVzID0gdGVtcFsxXTsKICAgICAgICB2YXIgcG9zID0gdGVtcFsyXTsKCQl2YXIgcG9pbnRzID0gW107CiAgICAgICAgCiAgICAgICAgaWYgKHRoaXMuX3N0YWNrKSB7CiAgICAgICAgICAgIHRoaXMuX2Jhck51ZGdlID0gMDsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHRoaXMuX2Jhck51ZGdlID0gKC1NYXRoLmFicyhuc2VyaWVzLzIgLSAwLjUpICsgcG9zKSAqICh0aGlzLmJhcldpZHRoICsgdGhpcy5iYXJQYWRkaW5nKTsKICAgICAgICB9CiAgICAgICAgaWYgKHNob3dMaW5lKSB7CiAgICAgICAgICAgIHZhciBuZWdhdGl2ZUNvbG9ycyA9IG5ldyAkLmpxcGxvdC5Db2xvckdlbmVyYXRvcih0aGlzLm5lZ2F0aXZlU2VyaWVzQ29sb3JzKTsKICAgICAgICAgICAgdmFyIHBvc2l0aXZlQ29sb3JzID0gbmV3ICQuanFwbG90LkNvbG9yR2VuZXJhdG9yKHRoaXMuc2VyaWVzQ29sb3JzKTsKICAgICAgICAgICAgdmFyIG5lZ2F0aXZlQ29sb3IgPSBuZWdhdGl2ZUNvbG9ycy5nZXQodGhpcy5pbmRleCk7CiAgICAgICAgICAgIGlmICghIHRoaXMudXNlTmVnYXRpdmVDb2xvcnMpIHsKICAgICAgICAgICAgICAgIG5lZ2F0aXZlQ29sb3IgPSBvcHRzLmZpbGxTdHlsZTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgcG9zaXRpdmVDb2xvciA9IG9wdHMuZmlsbFN0eWxlOwoJCQl2YXIgYmFzZTsKCQkJdmFyIHhzdGFydDsgCgkJCXZhciB5c3RhcnQ7CiAgICAgICAgICAgIAogICAgICAgICAgICBpZiAodGhpcy5iYXJEaXJlY3Rpb24gPT0gJ3ZlcnRpY2FsJykgewogICAgICAgICAgICAgICAgZm9yICh2YXIgaT0wOyBpPGdyaWREYXRhLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZGF0YVtpXVsxXSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBwb2ludHMgPSBbXTsKICAgICAgICAgICAgICAgICAgICBiYXNlID0gZ3JpZERhdGFbaV1bMF0gKyB0aGlzLl9iYXJOdWRnZTsKICAgICAgICAgICAgICAgICAgICB5c3RhcnQ7CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgLy8gc3RhY2tlZAogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9zdGFjayAmJiB0aGlzLl9wcmV2R3JpZERhdGEubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHlzdGFydCA9IHRoaXMuX3ByZXZHcmlkRGF0YVtpXVsxXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLy8gbm90IHN0YWNrZWQgYW5kIGZpcnN0IHNlcmllcyBpbiBzdGFjawogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5maWxsVG9aZXJvKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB5c3RhcnQgPSB0aGlzLl95YXhpcy5zZXJpZXNfdTJwKDApOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMud2F0ZXJmYWxsICYmIGkgPiAwICYmIGkgPCB0aGlzLmdyaWREYXRhLmxlbmd0aC0xKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB5c3RhcnQgPSB0aGlzLmdyaWREYXRhW2ktMV1bMV07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodGhpcy53YXRlcmZhbGwgJiYgaSA9PSAwICYmIGkgPCB0aGlzLmdyaWREYXRhLmxlbmd0aC0xKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5feWF4aXMubWluIDw9IDAgJiYgdGhpcy5feWF4aXMubWF4ID49IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5c3RhcnQgPSB0aGlzLl95YXhpcy5zZXJpZXNfdTJwKDApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5feWF4aXMubWluID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlzdGFydCA9IGN0eC5jYW52YXMuaGVpZ2h0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeXN0YXJ0ID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0aGlzLndhdGVyZmFsbCAmJiBpID09IHRoaXMuZ3JpZERhdGEubGVuZ3RoIC0gMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX3lheGlzLm1pbiA8PSAwICYmIHRoaXMuX3lheGlzLm1heCA+PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeXN0YXJ0ID0gdGhpcy5feWF4aXMuc2VyaWVzX3UycCgwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuX3lheGlzLm1pbiA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5c3RhcnQgPSBjdHguY2FudmFzLmhlaWdodDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlzdGFydCA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB5c3RhcnQgPSBjdHguY2FudmFzLmhlaWdodDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoKHRoaXMuZmlsbFRvWmVybyAmJiB0aGlzLl9wbG90RGF0YVtpXVsxXSA8IDApIHx8ICh0aGlzLndhdGVyZmFsbCAmJiB0aGlzLl9kYXRhW2ldWzFdIDwgMCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudmFyeUJhckNvbG9yICYmICF0aGlzLl9zdGFjaykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudXNlTmVnYXRpdmVDb2xvcnMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRzLmZpbGxTdHlsZSA9IG5lZ2F0aXZlQ29sb3JzLm5leHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdHMuZmlsbFN0eWxlID0gcG9zaXRpdmVDb2xvcnMubmV4dCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0cy5maWxsU3R5bGUgPSBuZWdhdGl2ZUNvbG9yOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy52YXJ5QmFyQ29sb3IgJiYgIXRoaXMuX3N0YWNrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRzLmZpbGxTdHlsZSA9IHBvc2l0aXZlQ29sb3JzLm5leHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdHMuZmlsbFN0eWxlID0gcG9zaXRpdmVDb2xvcjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCQkJCQkKCQkJCQlpZiAoIXRoaXMuZmlsbFRvWmVybyB8fCB0aGlzLl9wbG90RGF0YVtpXVsxXSA+PSAwKSB7IAoJCQkJCQlwb2ludHMucHVzaChbYmFzZS10aGlzLmJhcldpZHRoLzIsIHlzdGFydF0pOwoJCQkJCQlwb2ludHMucHVzaChbYmFzZS10aGlzLmJhcldpZHRoLzIsIGdyaWREYXRhW2ldWzFdXSk7CgkJCQkJCXBvaW50cy5wdXNoKFtiYXNlK3RoaXMuYmFyV2lkdGgvMiwgZ3JpZERhdGFbaV1bMV1dKTsKCQkJCQkJcG9pbnRzLnB1c2goW2Jhc2UrdGhpcy5iYXJXaWR0aC8yLCB5c3RhcnRdKTsKCQkJCQl9CgkJCQkJLy8gZm9yIG5lZ2F0aXZlIGJhcnMgbWFrZSBzdXJlIHBvaW50cyBhcmUgYWx3YXlzIG9yZGVyZWQgY2xvY2t3aXNlCgkJCQkJZWxzZSB7ICAgICAgICAgICAgICAKCQkJCQkJcG9pbnRzLnB1c2goW2Jhc2UtdGhpcy5iYXJXaWR0aC8yLCBncmlkRGF0YVtpXVsxXV0pOwoJCQkJCQlwb2ludHMucHVzaChbYmFzZS10aGlzLmJhcldpZHRoLzIsIHlzdGFydF0pOwoJCQkJCQlwb2ludHMucHVzaChbYmFzZSt0aGlzLmJhcldpZHRoLzIsIHlzdGFydF0pOwoJCQkJCQlwb2ludHMucHVzaChbYmFzZSt0aGlzLmJhcldpZHRoLzIsIGdyaWREYXRhW2ldWzFdXSk7CgkJCQkJfQogICAgICAgICAgICAgICAgICAgIHRoaXMuX2JhclBvaW50cy5wdXNoKHBvaW50cyk7CiAgICAgICAgICAgICAgICAgICAgLy8gbm93IGRyYXcgdGhlIHNoYWRvd3MgaWYgbm90IHN0YWNrZWQuCiAgICAgICAgICAgICAgICAgICAgLy8gZm9yIHN0YWNrZWQgcGxvdHMsIHRoZXkgYXJlIHByZWRyYXduIGJ5IGRyYXdTaGFkb3cKICAgICAgICAgICAgICAgICAgICBpZiAoc2hhZG93ICYmICF0aGlzLl9zdGFjaykgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgc29wdHMgPSAkLmV4dGVuZCh0cnVlLCB7fSwgb3B0cyk7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5lZWQgdG8gZ2V0IHJpZCBvZiBmaWxsU3R5bGUgb24gc2hhZG93LgogICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgc29wdHMuZmlsbFN0eWxlOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNoYWRvd1JlbmRlcmVyLmRyYXcoY3R4LCBwb2ludHMsIHNvcHRzKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdmFyIGNsciA9IG9wdHMuZmlsbFN0eWxlIHx8IHRoaXMuY29sb3I7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGF0YUNvbG9ycy5wdXNoKGNscik7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zaGFwZVJlbmRlcmVyLmRyYXcoY3R4LCBwb2ludHMsIG9wdHMpOyAKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5iYXJEaXJlY3Rpb24gPT0gJ2hvcml6b250YWwnKXsKICAgICAgICAgICAgICAgIGZvciAodmFyIGk9MDsgaTxncmlkRGF0YS5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmRhdGFbaV1bMF0gPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcG9pbnRzID0gW107CiAgICAgICAgICAgICAgICAgICAgYmFzZSA9IGdyaWREYXRhW2ldWzFdIC0gdGhpcy5fYmFyTnVkZ2U7CiAgICAgICAgICAgICAgICAgICAgeHN0YXJ0OwogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9zdGFjayAmJiB0aGlzLl9wcmV2R3JpZERhdGEubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHhzdGFydCA9IHRoaXMuX3ByZXZHcmlkRGF0YVtpXVswXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLy8gbm90IHN0YWNrZWQgYW5kIGZpcnN0IHNlcmllcyBpbiBzdGFjawogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5maWxsVG9aZXJvKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4c3RhcnQgPSB0aGlzLl94YXhpcy5zZXJpZXNfdTJwKDApOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMud2F0ZXJmYWxsICYmIGkgPiAwICYmIGkgPCB0aGlzLmdyaWREYXRhLmxlbmd0aC0xKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4c3RhcnQgPSB0aGlzLmdyaWREYXRhW2ktMV1bMV07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodGhpcy53YXRlcmZhbGwgJiYgaSA9PSAwICYmIGkgPCB0aGlzLmdyaWREYXRhLmxlbmd0aC0xKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5feGF4aXMubWluIDw9IDAgJiYgdGhpcy5feGF4aXMubWF4ID49IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4c3RhcnQgPSB0aGlzLl94YXhpcy5zZXJpZXNfdTJwKDApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5feGF4aXMubWluID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhzdGFydCA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4c3RhcnQgPSBjdHguY2FudmFzLndpZHRoOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMud2F0ZXJmYWxsICYmIGkgPT0gdGhpcy5ncmlkRGF0YS5sZW5ndGggLSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5feGF4aXMubWluIDw9IDAgJiYgdGhpcy5feGF4aXMubWF4ID49IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4c3RhcnQgPSB0aGlzLl94YXhpcy5zZXJpZXNfdTJwKDApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5feGF4aXMubWluID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhzdGFydCA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4c3RhcnQgPSBjdHguY2FudmFzLndpZHRoOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgeHN0YXJ0ID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoKHRoaXMuZmlsbFRvWmVybyAmJiB0aGlzLl9wbG90RGF0YVtpXVsxXSA8IDApIHx8ICh0aGlzLndhdGVyZmFsbCAmJiB0aGlzLl9kYXRhW2ldWzFdIDwgMCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudmFyeUJhckNvbG9yICYmICF0aGlzLl9zdGFjaykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudXNlTmVnYXRpdmVDb2xvcnMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRzLmZpbGxTdHlsZSA9IG5lZ2F0aXZlQ29sb3JzLm5leHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdHMuZmlsbFN0eWxlID0gcG9zaXRpdmVDb2xvcnMubmV4dCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy52YXJ5QmFyQ29sb3IgJiYgIXRoaXMuX3N0YWNrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRzLmZpbGxTdHlsZSA9IHBvc2l0aXZlQ29sb3JzLm5leHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdHMuZmlsbFN0eWxlID0gcG9zaXRpdmVDb2xvcjsKICAgICAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIAoKICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuZmlsbFRvWmVybyB8fCB0aGlzLl9wbG90RGF0YVtpXVswXSA+PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50cy5wdXNoKFt4c3RhcnQsIGJhc2UgKyB0aGlzLmJhcldpZHRoIC8gMl0pOwogICAgICAgICAgICAgICAgICAgICAgICBwb2ludHMucHVzaChbeHN0YXJ0LCBiYXNlIC0gdGhpcy5iYXJXaWR0aCAvIDJdKTsKICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRzLnB1c2goW2dyaWREYXRhW2ldWzBdLCBiYXNlIC0gdGhpcy5iYXJXaWR0aCAvIDJdKTsKICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRzLnB1c2goW2dyaWREYXRhW2ldWzBdLCBiYXNlICsgdGhpcy5iYXJXaWR0aCAvIDJdKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50cy5wdXNoKFtncmlkRGF0YVtpXVswXSwgYmFzZSArIHRoaXMuYmFyV2lkdGggLyAyXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50cy5wdXNoKFtncmlkRGF0YVtpXVswXSwgYmFzZSAtIHRoaXMuYmFyV2lkdGggLyAyXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50cy5wdXNoKFt4c3RhcnQsIGJhc2UgLSB0aGlzLmJhcldpZHRoIC8gMl0pOwogICAgICAgICAgICAgICAgICAgICAgICBwb2ludHMucHVzaChbeHN0YXJ0LCBiYXNlICsgdGhpcy5iYXJXaWR0aCAvIDJdKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHRoaXMuX2JhclBvaW50cy5wdXNoKHBvaW50cyk7CiAgICAgICAgICAgICAgICAgICAgLy8gbm93IGRyYXcgdGhlIHNoYWRvd3MgaWYgbm90IHN0YWNrZWQuCiAgICAgICAgICAgICAgICAgICAgLy8gZm9yIHN0YWNrZWQgcGxvdHMsIHRoZXkgYXJlIHByZWRyYXduIGJ5IGRyYXdTaGFkb3cKICAgICAgICAgICAgICAgICAgICBpZiAoc2hhZG93ICYmICF0aGlzLl9zdGFjaykgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgc29wdHMgPSAkLmV4dGVuZCh0cnVlLCB7fSwgb3B0cyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBzb3B0cy5maWxsU3R5bGU7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2hhZG93UmVuZGVyZXIuZHJhdyhjdHgsIHBvaW50cywgc29wdHMpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB2YXIgY2xyID0gb3B0cy5maWxsU3R5bGUgfHwgdGhpcy5jb2xvcjsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9kYXRhQ29sb3JzLnB1c2goY2xyKTsKICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNoYXBlUmVuZGVyZXIuZHJhdyhjdHgsIHBvaW50cywgb3B0cyk7IAogICAgICAgICAgICAgICAgfSAgCiAgICAgICAgICAgIH0KICAgICAgICB9ICAgICAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIGlmICh0aGlzLmhpZ2hsaWdodENvbG9ycy5sZW5ndGggPT0gMCkgewogICAgICAgICAgICB0aGlzLmhpZ2hsaWdodENvbG9ycyA9ICQuanFwbG90LmNvbXB1dGVIaWdobGlnaHRDb2xvcnModGhpcy5fZGF0YUNvbG9ycyk7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGVsc2UgaWYgKHR5cGVvZih0aGlzLmhpZ2hsaWdodENvbG9ycykgPT0gJ3N0cmluZycpIHsKICAgICAgICAgICAgdmFyIHRlbXAgPSB0aGlzLmhpZ2hsaWdodENvbG9yczsKICAgICAgICAgICAgdGhpcy5oaWdobGlnaHRDb2xvcnMgPSBbXTsKICAgICAgICAgICAgZm9yICh2YXIgaT0wOyBpPHRoaXMuX2RhdGFDb2xvcnMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIHRoaXMuaGlnaGxpZ2h0Q29sb3JzLnB1c2godGVtcCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgCiAgICB9OwogICAgCiAgICAgCiAgICAvLyBmb3Igc3RhY2tlZCBwbG90cywgc2hhZG93cyB3aWxsIGJlIHByZSBkcmF3biBieSBkcmF3U2hhZG93LgogICAgJC5qcXBsb3QuQmFyUmVuZGVyZXIucHJvdG90eXBlLmRyYXdTaGFkb3cgPSBmdW5jdGlvbihjdHgsIGdyaWREYXRhLCBvcHRpb25zKSB7CiAgICAgICAgdmFyIGk7CiAgICAgICAgdmFyIG9wdHMgPSAob3B0aW9ucyAhPSB1bmRlZmluZWQpID8gb3B0aW9ucyA6IHt9OwogICAgICAgIHZhciBzaGFkb3cgPSAob3B0cy5zaGFkb3cgIT0gdW5kZWZpbmVkKSA/IG9wdHMuc2hhZG93IDogdGhpcy5zaGFkb3c7CiAgICAgICAgdmFyIHNob3dMaW5lID0gKG9wdHMuc2hvd0xpbmUgIT0gdW5kZWZpbmVkKSA/IG9wdHMuc2hvd0xpbmUgOiB0aGlzLnNob3dMaW5lOwogICAgICAgIHZhciBmaWxsID0gKG9wdHMuZmlsbCAhPSB1bmRlZmluZWQpID8gb3B0cy5maWxsIDogdGhpcy5maWxsOwogICAgICAgIHZhciB4YXhpcyA9IHRoaXMueGF4aXM7CiAgICAgICAgdmFyIHlheGlzID0gdGhpcy55YXhpczsKICAgICAgICB2YXIgeHAgPSB0aGlzLl94YXhpcy5zZXJpZXNfdTJwOwogICAgICAgIHZhciB5cCA9IHRoaXMuX3lheGlzLnNlcmllc191MnA7CiAgICAgICAgdmFyIHBvaW50eCwgcG9pbnRzLCBwb2ludHksIG52YWxzLCBuc2VyaWVzLCBwb3M7CiAgICAgICAgCiAgICAgICAgaWYgKHRoaXMuX3N0YWNrICYmIHRoaXMuc2hhZG93KSB7CiAgICAgICAgICAgIGlmICh0aGlzLmJhcldpZHRoID09IG51bGwpIHsKICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0QmFyV2lkdGguY2FsbCh0aGlzKTsKICAgICAgICAgICAgfQogICAgICAgIAogICAgICAgICAgICB2YXIgdGVtcCA9IHRoaXMuX3Bsb3RTZXJpZXNJbmZvID0gdGhpcy5yZW5kZXJlci5jYWxjU2VyaWVzTnVtYmVycy5jYWxsKHRoaXMpOwogICAgICAgICAgICBudmFscyA9IHRlbXBbMF07CiAgICAgICAgICAgIG5zZXJpZXMgPSB0ZW1wWzFdOwogICAgICAgICAgICBwb3MgPSB0ZW1wWzJdOwogICAgICAgIAogICAgICAgICAgICBpZiAodGhpcy5fc3RhY2spIHsKICAgICAgICAgICAgICAgIHRoaXMuX2Jhck51ZGdlID0gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHRoaXMuX2Jhck51ZGdlID0gKC1NYXRoLmFicyhuc2VyaWVzLzIgLSAwLjUpICsgcG9zKSAqICh0aGlzLmJhcldpZHRoICsgdGhpcy5iYXJQYWRkaW5nKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoc2hvd0xpbmUpIHsKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBpZiAodGhpcy5iYXJEaXJlY3Rpb24gPT0gJ3ZlcnRpY2FsJykgewogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGk9MDsgaTxncmlkRGF0YS5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5kYXRhW2ldWzFdID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50cyA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYmFzZSA9IGdyaWREYXRhW2ldWzBdICsgdGhpcy5fYmFyTnVkZ2U7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB5c3RhcnQ7CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9zdGFjayAmJiB0aGlzLl9wcmV2R3JpZERhdGEubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB5c3RhcnQgPSB0aGlzLl9wcmV2R3JpZERhdGFbaV1bMV07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5maWxsVG9aZXJvKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeXN0YXJ0ID0gdGhpcy5feWF4aXMuc2VyaWVzX3UycCgwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlzdGFydCA9IGN0eC5jYW52YXMuaGVpZ2h0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50cy5wdXNoKFtiYXNlLXRoaXMuYmFyV2lkdGgvMiwgeXN0YXJ0XSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50cy5wdXNoKFtiYXNlLXRoaXMuYmFyV2lkdGgvMiwgZ3JpZERhdGFbaV1bMV1dKTsKICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRzLnB1c2goW2Jhc2UrdGhpcy5iYXJXaWR0aC8yLCBncmlkRGF0YVtpXVsxXV0pOwogICAgICAgICAgICAgICAgICAgICAgICBwb2ludHMucHVzaChbYmFzZSt0aGlzLmJhcldpZHRoLzIsIHlzdGFydF0pOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNoYWRvd1JlbmRlcmVyLmRyYXcoY3R4LCBwb2ludHMsIG9wdHMpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBlbHNlIGlmICh0aGlzLmJhckRpcmVjdGlvbiA9PSAnaG9yaXpvbnRhbCcpewogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGk9MDsgaTxncmlkRGF0YS5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5kYXRhW2ldWzBdID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50cyA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYmFzZSA9IGdyaWREYXRhW2ldWzFdIC0gdGhpcy5fYmFyTnVkZ2U7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB4c3RhcnQ7CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9zdGFjayAmJiB0aGlzLl9wcmV2R3JpZERhdGEubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4c3RhcnQgPSB0aGlzLl9wcmV2R3JpZERhdGFbaV1bMF07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4c3RhcnQgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50cy5wdXNoKFt4c3RhcnQsIGJhc2UrdGhpcy5iYXJXaWR0aC8yXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50cy5wdXNoKFtncmlkRGF0YVtpXVswXSwgYmFzZSt0aGlzLmJhcldpZHRoLzJdKTsKICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRzLnB1c2goW2dyaWREYXRhW2ldWzBdLCBiYXNlLXRoaXMuYmFyV2lkdGgvMl0pOwogICAgICAgICAgICAgICAgICAgICAgICBwb2ludHMucHVzaChbeHN0YXJ0LCBiYXNlLXRoaXMuYmFyV2lkdGgvMl0pOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNoYWRvd1JlbmRlcmVyLmRyYXcoY3R4LCBwb2ludHMsIG9wdHMpOwogICAgICAgICAgICAgICAgICAgIH0gIAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9ICAgCiAgICAgICAgICAgIAogICAgICAgIH0KICAgIH07CiAgICAKICAgIGZ1bmN0aW9uIHBvc3RJbml0KHRhcmdldCwgZGF0YSwgb3B0aW9ucykgewogICAgICAgIGZvciAodmFyIGk9MDsgaTx0aGlzLnNlcmllcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICBpZiAodGhpcy5zZXJpZXNbaV0ucmVuZGVyZXIuY29uc3RydWN0b3IgPT0gJC5qcXBsb3QuQmFyUmVuZGVyZXIpIHsKICAgICAgICAgICAgICAgIC8vIGRvbid0IGFsbG93IG1vdXNlb3ZlciBhbmQgbW91c2Vkb3duIGF0IHNhbWUgdGltZS4KICAgICAgICAgICAgICAgIGlmICh0aGlzLnNlcmllc1tpXS5oaWdobGlnaHRNb3VzZU92ZXIpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLnNlcmllc1tpXS5oaWdobGlnaHRNb3VzZURvd24gPSBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIAogICAgLy8gY2FsbGVkIHdpdGhpbiBjb250ZXh0IG9mIHBsb3QKICAgIC8vIGNyZWF0ZSBhIGNhbnZhcyB3aGljaCB3ZSBjYW4gZHJhdyBvbi4KICAgIC8vIGluc2VydCBpdCBiZWZvcmUgdGhlIGV2ZW50Q2FudmFzLCBzbyBldmVudENhbnZhcyB3aWxsIHN0aWxsIGNhcHR1cmUgZXZlbnRzLgogICAgZnVuY3Rpb24gcG9zdFBsb3REcmF3KCkgewogICAgICAgIC8vIE1lbW9yeSBMZWFrcyBwYXRjaCAgICAKICAgICAgICBpZiAodGhpcy5wbHVnaW5zLmJhclJlbmRlcmVyICYmIHRoaXMucGx1Z2lucy5iYXJSZW5kZXJlci5oaWdobGlnaHRDYW52YXMpIHsKCiAgICAgICAgICAgIHRoaXMucGx1Z2lucy5iYXJSZW5kZXJlci5oaWdobGlnaHRDYW52YXMucmVzZXRDYW52YXMoKTsKICAgICAgICAgICAgdGhpcy5wbHVnaW5zLmJhclJlbmRlcmVyLmhpZ2hsaWdodENhbnZhcyA9IG51bGw7CiAgICAgICAgfQogICAgICAgICAKICAgICAgICB0aGlzLnBsdWdpbnMuYmFyUmVuZGVyZXIgPSB7aGlnaGxpZ2h0ZWRTZXJpZXNJbmRleDpudWxsfTsKICAgICAgICB0aGlzLnBsdWdpbnMuYmFyUmVuZGVyZXIuaGlnaGxpZ2h0Q2FudmFzID0gbmV3ICQuanFwbG90LkdlbmVyaWNDYW52YXMoKTsKICAgICAgICAKICAgICAgICB0aGlzLmV2ZW50Q2FudmFzLl9lbGVtLmJlZm9yZSh0aGlzLnBsdWdpbnMuYmFyUmVuZGVyZXIuaGlnaGxpZ2h0Q2FudmFzLmNyZWF0ZUVsZW1lbnQodGhpcy5fZ3JpZFBhZGRpbmcsICdqcXBsb3QtYmFyUmVuZGVyZXItaGlnaGxpZ2h0LWNhbnZhcycsIHRoaXMuX3Bsb3REaW1lbnNpb25zLCB0aGlzKSk7CiAgICAgICAgdGhpcy5wbHVnaW5zLmJhclJlbmRlcmVyLmhpZ2hsaWdodENhbnZhcy5zZXRDb250ZXh0KCk7CiAgICAgICAgdGhpcy5ldmVudENhbnZhcy5fZWxlbS5iaW5kKCdtb3VzZWxlYXZlJywge3Bsb3Q6dGhpc30sIGZ1bmN0aW9uIChldikgeyB1bmhpZ2hsaWdodChldi5kYXRhLnBsb3QpOyB9KTsKICAgIH0gICAKICAgIAogICAgZnVuY3Rpb24gaGlnaGxpZ2h0IChwbG90LCBzaWR4LCBwaWR4LCBwb2ludHMpIHsKICAgICAgICB2YXIgcyA9IHBsb3Quc2VyaWVzW3NpZHhdOwogICAgICAgIHZhciBjYW52YXMgPSBwbG90LnBsdWdpbnMuYmFyUmVuZGVyZXIuaGlnaGxpZ2h0Q2FudmFzOwogICAgICAgIGNhbnZhcy5fY3R4LmNsZWFyUmVjdCgwLDAsY2FudmFzLl9jdHguY2FudmFzLndpZHRoLCBjYW52YXMuX2N0eC5jYW52YXMuaGVpZ2h0KTsKICAgICAgICBzLl9oaWdobGlnaHRlZFBvaW50ID0gcGlkeDsKICAgICAgICBwbG90LnBsdWdpbnMuYmFyUmVuZGVyZXIuaGlnaGxpZ2h0ZWRTZXJpZXNJbmRleCA9IHNpZHg7CiAgICAgICAgdmFyIG9wdHMgPSB7ZmlsbFN0eWxlOiBzLmhpZ2hsaWdodENvbG9yc1twaWR4XX07CiAgICAgICAgcy5yZW5kZXJlci5zaGFwZVJlbmRlcmVyLmRyYXcoY2FudmFzLl9jdHgsIHBvaW50cywgb3B0cyk7CiAgICAgICAgY2FudmFzID0gbnVsbDsKICAgIH0KICAgIAogICAgZnVuY3Rpb24gdW5oaWdobGlnaHQgKHBsb3QpIHsKICAgICAgICB2YXIgY2FudmFzID0gcGxvdC5wbHVnaW5zLmJhclJlbmRlcmVyLmhpZ2hsaWdodENhbnZhczsKICAgICAgICBjYW52YXMuX2N0eC5jbGVhclJlY3QoMCwwLCBjYW52YXMuX2N0eC5jYW52YXMud2lkdGgsIGNhbnZhcy5fY3R4LmNhbnZhcy5oZWlnaHQpOwogICAgICAgIGZvciAodmFyIGk9MDsgaTxwbG90LnNlcmllcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICBwbG90LnNlcmllc1tpXS5faGlnaGxpZ2h0ZWRQb2ludCA9IG51bGw7CiAgICAgICAgfQogICAgICAgIHBsb3QucGx1Z2lucy5iYXJSZW5kZXJlci5oaWdobGlnaHRlZFNlcmllc0luZGV4ID0gbnVsbDsKICAgICAgICBwbG90LnRhcmdldC50cmlnZ2VyKCdqcXBsb3REYXRhVW5oaWdobGlnaHQnKTsKICAgICAgICBjYW52YXMgPSAgbnVsbDsKICAgIH0KICAgIAogICAgCiAgICBmdW5jdGlvbiBoYW5kbGVNb3ZlKGV2LCBncmlkcG9zLCBkYXRhcG9zLCBuZWlnaGJvciwgcGxvdCkgewogICAgICAgIGlmIChuZWlnaGJvcikgewogICAgICAgICAgICB2YXIgaW5zID0gW25laWdoYm9yLnNlcmllc0luZGV4LCBuZWlnaGJvci5wb2ludEluZGV4LCBuZWlnaGJvci5kYXRhXTsKICAgICAgICAgICAgdmFyIGV2dDEgPSBqUXVlcnkuRXZlbnQoJ2pxcGxvdERhdGFNb3VzZU92ZXInKTsKICAgICAgICAgICAgZXZ0MS5wYWdlWCA9IGV2LnBhZ2VYOwogICAgICAgICAgICBldnQxLnBhZ2VZID0gZXYucGFnZVk7CiAgICAgICAgICAgIHBsb3QudGFyZ2V0LnRyaWdnZXIoZXZ0MSwgaW5zKTsKICAgICAgICAgICAgaWYgKHBsb3Quc2VyaWVzW2luc1swXV0uaGlnaGxpZ2h0TW91c2VPdmVyICYmICEoaW5zWzBdID09IHBsb3QucGx1Z2lucy5iYXJSZW5kZXJlci5oaWdobGlnaHRlZFNlcmllc0luZGV4ICYmIGluc1sxXSA9PSBwbG90LnNlcmllc1tpbnNbMF1dLl9oaWdobGlnaHRlZFBvaW50KSkgewogICAgICAgICAgICAgICAgdmFyIGV2dCA9IGpRdWVyeS5FdmVudCgnanFwbG90RGF0YUhpZ2hsaWdodCcpOwogICAgICAgICAgICAgICAgZXZ0LnBhZ2VYID0gZXYucGFnZVg7CiAgICAgICAgICAgICAgICBldnQucGFnZVkgPSBldi5wYWdlWTsKICAgICAgICAgICAgICAgIHBsb3QudGFyZ2V0LnRyaWdnZXIoZXZ0LCBpbnMpOwogICAgICAgICAgICAgICAgaGlnaGxpZ2h0IChwbG90LCBuZWlnaGJvci5zZXJpZXNJbmRleCwgbmVpZ2hib3IucG9pbnRJbmRleCwgbmVpZ2hib3IucG9pbnRzKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChuZWlnaGJvciA9PSBudWxsKSB7CiAgICAgICAgICAgIHVuaGlnaGxpZ2h0IChwbG90KTsKICAgICAgICB9CiAgICB9CiAgICAKICAgIGZ1bmN0aW9uIGhhbmRsZU1vdXNlRG93bihldiwgZ3JpZHBvcywgZGF0YXBvcywgbmVpZ2hib3IsIHBsb3QpIHsKICAgICAgICBpZiAobmVpZ2hib3IpIHsKICAgICAgICAgICAgdmFyIGlucyA9IFtuZWlnaGJvci5zZXJpZXNJbmRleCwgbmVpZ2hib3IucG9pbnRJbmRleCwgbmVpZ2hib3IuZGF0YV07CiAgICAgICAgICAgIGlmIChwbG90LnNlcmllc1tpbnNbMF1dLmhpZ2hsaWdodE1vdXNlRG93biAmJiAhKGluc1swXSA9PSBwbG90LnBsdWdpbnMuYmFyUmVuZGVyZXIuaGlnaGxpZ2h0ZWRTZXJpZXNJbmRleCAmJiBpbnNbMV0gPT0gcGxvdC5zZXJpZXNbaW5zWzBdXS5faGlnaGxpZ2h0ZWRQb2ludCkpIHsKICAgICAgICAgICAgICAgIHZhciBldnQgPSBqUXVlcnkuRXZlbnQoJ2pxcGxvdERhdGFIaWdobGlnaHQnKTsKICAgICAgICAgICAgICAgIGV2dC5wYWdlWCA9IGV2LnBhZ2VYOwogICAgICAgICAgICAgICAgZXZ0LnBhZ2VZID0gZXYucGFnZVk7CiAgICAgICAgICAgICAgICBwbG90LnRhcmdldC50cmlnZ2VyKGV2dCwgaW5zKTsKICAgICAgICAgICAgICAgIGhpZ2hsaWdodCAocGxvdCwgbmVpZ2hib3Iuc2VyaWVzSW5kZXgsIG5laWdoYm9yLnBvaW50SW5kZXgsIG5laWdoYm9yLnBvaW50cyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAobmVpZ2hib3IgPT0gbnVsbCkgewogICAgICAgICAgICB1bmhpZ2hsaWdodCAocGxvdCk7CiAgICAgICAgfQogICAgfQogICAgCiAgICBmdW5jdGlvbiBoYW5kbGVNb3VzZVVwKGV2LCBncmlkcG9zLCBkYXRhcG9zLCBuZWlnaGJvciwgcGxvdCkgewogICAgICAgIHZhciBpZHggPSBwbG90LnBsdWdpbnMuYmFyUmVuZGVyZXIuaGlnaGxpZ2h0ZWRTZXJpZXNJbmRleDsKICAgICAgICBpZiAoaWR4ICE9IG51bGwgJiYgcGxvdC5zZXJpZXNbaWR4XS5oaWdobGlnaHRNb3VzZURvd24pIHsKICAgICAgICAgICAgdW5oaWdobGlnaHQocGxvdCk7CiAgICAgICAgfQogICAgfQogICAgCiAgICBmdW5jdGlvbiBoYW5kbGVDbGljayhldiwgZ3JpZHBvcywgZGF0YXBvcywgbmVpZ2hib3IsIHBsb3QpIHsKICAgICAgICBpZiAobmVpZ2hib3IpIHsKICAgICAgICAgICAgdmFyIGlucyA9IFtuZWlnaGJvci5zZXJpZXNJbmRleCwgbmVpZ2hib3IucG9pbnRJbmRleCwgbmVpZ2hib3IuZGF0YV07CiAgICAgICAgICAgIHZhciBldnQgPSBqUXVlcnkuRXZlbnQoJ2pxcGxvdERhdGFDbGljaycpOwogICAgICAgICAgICBldnQucGFnZVggPSBldi5wYWdlWDsKICAgICAgICAgICAgZXZ0LnBhZ2VZID0gZXYucGFnZVk7CiAgICAgICAgICAgIHBsb3QudGFyZ2V0LnRyaWdnZXIoZXZ0LCBpbnMpOwogICAgICAgIH0KICAgIH0KICAgIAogICAgZnVuY3Rpb24gaGFuZGxlUmlnaHRDbGljayhldiwgZ3JpZHBvcywgZGF0YXBvcywgbmVpZ2hib3IsIHBsb3QpIHsKICAgICAgICBpZiAobmVpZ2hib3IpIHsKICAgICAgICAgICAgdmFyIGlucyA9IFtuZWlnaGJvci5zZXJpZXNJbmRleCwgbmVpZ2hib3IucG9pbnRJbmRleCwgbmVpZ2hib3IuZGF0YV07CiAgICAgICAgICAgIHZhciBpZHggPSBwbG90LnBsdWdpbnMuYmFyUmVuZGVyZXIuaGlnaGxpZ2h0ZWRTZXJpZXNJbmRleDsKICAgICAgICAgICAgaWYgKGlkeCAhPSBudWxsICYmIHBsb3Quc2VyaWVzW2lkeF0uaGlnaGxpZ2h0TW91c2VEb3duKSB7CiAgICAgICAgICAgICAgICB1bmhpZ2hsaWdodChwbG90KTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgZXZ0ID0galF1ZXJ5LkV2ZW50KCdqcXBsb3REYXRhUmlnaHRDbGljaycpOwogICAgICAgICAgICBldnQucGFnZVggPSBldi5wYWdlWDsKICAgICAgICAgICAgZXZ0LnBhZ2VZID0gZXYucGFnZVk7CiAgICAgICAgICAgIHBsb3QudGFyZ2V0LnRyaWdnZXIoZXZ0LCBpbnMpOwogICAgICAgIH0KICAgIH0KICAgIAogICAgCn0pKGpRdWVyeSk7ICAgIA==]]></data>
	</file>
	<file>
	  <filename>/src/plugins/jqplot.barRenderer.min.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqCiAqIGpxUGxvdAogKiBQdXJlIEphdmFTY3JpcHQgcGxvdHRpbmcgcGx1Z2luIHVzaW5nIGpRdWVyeQogKgogKiBWZXJzaW9uOiAxLjAuMGIyX3IxMDEyCiAqCiAqIENvcHlyaWdodCAoYykgMjAwOS0yMDExIENocmlzIExlb25lbGxvCiAqIGpxUGxvdCBpcyBjdXJyZW50bHkgYXZhaWxhYmxlIGZvciB1c2UgaW4gYWxsIHBlcnNvbmFsIG9yIGNvbW1lcmNpYWwgcHJvamVjdHMgCiAqIHVuZGVyIGJvdGggdGhlIE1JVCAoaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHApIGFuZCBHUEwgCiAqIHZlcnNpb24gMi4wIChodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC5odG1sKSBsaWNlbnNlcy4gVGhpcyBtZWFucyB0aGF0IHlvdSBjYW4gCiAqIGNob29zZSB0aGUgbGljZW5zZSB0aGF0IGJlc3Qgc3VpdHMgeW91ciBwcm9qZWN0IGFuZCB1c2UgaXQgYWNjb3JkaW5nbHkuIAogKgogKiBBbHRob3VnaCBub3QgcmVxdWlyZWQsIHRoZSBhdXRob3Igd291bGQgYXBwcmVjaWF0ZSBhbiBlbWFpbCBsZXR0aW5nIGhpbSAKICoga25vdyBvZiBhbnkgc3Vic3RhbnRpYWwgdXNlIG9mIGpxUGxvdC4gIFlvdSBjYW4gcmVhY2ggdGhlIGF1dGhvciBhdDogCiAqIGNocmlzIGF0IGpxcGxvdCBkb3QgY29tIG9yIHNlZSBodHRwOi8vd3d3LmpxcGxvdC5jb20vaW5mby5waHAgLgogKgogKiBJZiB5b3UgYXJlIGZlZWxpbmcga2luZCBhbmQgZ2VuZXJvdXMsIGNvbnNpZGVyIHN1cHBvcnRpbmcgdGhlIHByb2plY3QgYnkKICogbWFraW5nIGEgZG9uYXRpb24gYXQ6IGh0dHA6Ly93d3cuanFwbG90LmNvbS9kb25hdGUucGhwIC4KICoKICogc3ByaW50ZiBmdW5jdGlvbnMgY29udGFpbmVkIGluIGpxcGxvdC5zcHJpbnRmLmpzIGJ5IEFzaCBTZWFybGU6CiAqCiAqICAgICB2ZXJzaW9uIDIwMDcuMDQuMjcKICogICAgIGF1dGhvciBBc2ggU2VhcmxlCiAqICAgICBodHRwOi8vaGV4bWVuLmNvbS9ibG9nLzIwMDcvMDMvcHJpbnRmLXNwcmludGYvCiAqICAgICBodHRwOi8vaGV4bWVuLmNvbS9qcy9zcHJpbnRmLmpzCiAqICAgICBUaGUgYXV0aG9yIChBc2ggU2VhcmxlKSBoYXMgcGxhY2VkIHRoaXMgY29kZSBpbiB0aGUgcHVibGljIGRvbWFpbjoKICogICAgICJUaGlzIGNvZGUgaXMgdW5yZXN0cmljdGVkOiB5b3UgYXJlIGZyZWUgdG8gdXNlIGl0IGhvd2V2ZXIgeW91IGxpa2UuIgogKgogKiBpbmNsdWRlZCBqc0RhdGUgbGlicmFyeSBieSBDaHJpcyBMZW9uZWxsbzoKICoKICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEgQ2hyaXMgTGVvbmVsbG8KICoKICoganNEYXRlIGlzIGN1cnJlbnRseSBhdmFpbGFibGUgZm9yIHVzZSBpbiBhbGwgcGVyc29uYWwgb3IgY29tbWVyY2lhbCBwcm9qZWN0cyAKICogdW5kZXIgYm90aCB0aGUgTUlUIGFuZCBHUEwgdmVyc2lvbiAyLjAgbGljZW5zZXMuIFRoaXMgbWVhbnMgdGhhdCB5b3UgY2FuIAogKiBjaG9vc2UgdGhlIGxpY2Vuc2UgdGhhdCBiZXN0IHN1aXRzIHlvdXIgcHJvamVjdCBhbmQgdXNlIGl0IGFjY29yZGluZ2x5LgogKgogKiBqc0RhdGUgYm9ycm93cyBtYW55IGNvbmNlcHRzIGFuZCBpZGVhcyBmcm9tIHRoZSBEYXRlIEluc3RhbmNlIAogKiBNZXRob2RzIGJ5IEtlbiBTbnlkZXIgYWxvbmcgd2l0aCBzb21lIHBhcnRzIG9mIEtlbidzIGFjdHVhbCBjb2RlLgogKiAKICogS2VuJ3Mgb3JpZ2lhbmwgRGF0ZSBJbnN0YW5jZSBNZXRob2RzIGFuZCBjb3B5cmlnaHQgbm90aWNlOgogKiAKICogS2VuIFNueWRlciAoa2VuIGQgc255ZGVyIGF0IGdtYWlsIGRvdCBjb20pCiAqIDIwMDgtMDktMTAKICogdmVyc2lvbiAyLjAuMiAoaHR0cDovL2tlbmRzbnlkZXIuY29tL3NhbmRib3gvZGF0ZS8pICAgICAKICogQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbiBMaWNlbnNlIDMuMCAoaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnkvMy4wLykKICoKICoganFwbG90VG9JbWFnZSBmdW5jdGlvbiBiYXNlZCBvbiBMYXJyeSBTaWRlbidzIGV4cG9ydC1qcXBsb3QtdG8tcG5nLmpzLgogKiBMYXJyeSBoYXMgZ2VuZXJvdXNseSBnaXZlbiBwZXJtaXNzaW9uIHRvIGFkYXB0IGhpcyBjb2RlIGZvciBpbmNsdXNpb24KICogaW50byBqcVBsb3QuCiAqCiAqIExhcnJ5J3Mgb3JpZ2luYWwgY29kZSBjYW4gYmUgZm91bmQgaGVyZToKICoKICogaHR0cHM6Ly9naXRodWIuY29tL2xzaWRlbi9leHBvcnQtanFwbG90LXRvLXBuZwogKiAKICogCiAqLwooZnVuY3Rpb24oZCl7ZC5qcXBsb3QuQmFyUmVuZGVyZXI9ZnVuY3Rpb24oKXtkLmpxcGxvdC5MaW5lUmVuZGVyZXIuY2FsbCh0aGlzKX07ZC5qcXBsb3QuQmFyUmVuZGVyZXIucHJvdG90eXBlPW5ldyBkLmpxcGxvdC5MaW5lUmVuZGVyZXIoKTtkLmpxcGxvdC5CYXJSZW5kZXJlci5wcm90b3R5cGUuY29uc3RydWN0b3I9ZC5qcXBsb3QuQmFyUmVuZGVyZXI7ZC5qcXBsb3QuQmFyUmVuZGVyZXIucHJvdG90eXBlLmluaXQ9ZnVuY3Rpb24obixwKXt0aGlzLmJhclBhZGRpbmc9ODt0aGlzLmJhck1hcmdpbj0xMDt0aGlzLmJhckRpcmVjdGlvbj0idmVydGljYWwiO3RoaXMuYmFyV2lkdGg9bnVsbDt0aGlzLnNoYWRvd09mZnNldD0yO3RoaXMuc2hhZG93RGVwdGg9NTt0aGlzLnNoYWRvd0FscGhhPTAuMDg7dGhpcy53YXRlcmZhbGw9ZmFsc2U7dGhpcy5ncm91cHM9MTt0aGlzLnZhcnlCYXJDb2xvcj1mYWxzZTt0aGlzLmhpZ2hsaWdodE1vdXNlT3Zlcj10cnVlO3RoaXMuaGlnaGxpZ2h0TW91c2VEb3duPWZhbHNlO3RoaXMuaGlnaGxpZ2h0Q29sb3JzPVtdO3RoaXMudHJhbnNwb3NlZERhdGE9dHJ1ZTt0aGlzLnJlbmRlcmVyLmFuaW1hdGlvbj17c2hvdzpmYWxzZSxkaXJlY3Rpb246ImRvd24iLHNwZWVkOjMwMDAsX3N1cHBvcnRlZDp0cnVlfTt0aGlzLl90eXBlPSJiYXIiO2lmKG4uaGlnaGxpZ2h0TW91c2VEb3duJiZuLmhpZ2hsaWdodE1vdXNlT3Zlcj09bnVsbCl7bi5oaWdobGlnaHRNb3VzZU92ZXI9ZmFsc2V9ZC5leHRlbmQodHJ1ZSx0aGlzLG4pO2QuZXh0ZW5kKHRydWUsdGhpcy5yZW5kZXJlcixuKTt0aGlzLmZpbGw9dHJ1ZTtpZih0aGlzLmJhckRpcmVjdGlvbj09PSJob3Jpem9udGFsIiYmdGhpcy5yZW5kZXJlck9wdGlvbnMuYW5pbWF0aW9uJiZ0aGlzLnJlbmRlcmVyT3B0aW9ucy5hbmltYXRpb24uZGlyZWN0aW9uPT1udWxsKXt0aGlzLnJlbmRlcmVyLmFuaW1hdGlvbi5kaXJlY3Rpb249ImxlZnQifWlmKHRoaXMud2F0ZXJmYWxsKXt0aGlzLmZpbGxUb1plcm89ZmFsc2U7dGhpcy5kaXNhYmxlU3RhY2s9dHJ1ZX1pZih0aGlzLmJhckRpcmVjdGlvbj09InZlcnRpY2FsIil7dGhpcy5fcHJpbWFyeUF4aXM9Il94YXhpcyI7dGhpcy5fc3RhY2tBeGlzPSJ5Ijt0aGlzLmZpbGxBeGlzPSJ5In1lbHNle3RoaXMuX3ByaW1hcnlBeGlzPSJfeWF4aXMiO3RoaXMuX3N0YWNrQXhpcz0ieCI7dGhpcy5maWxsQXhpcz0ieCJ9dGhpcy5faGlnaGxpZ2h0ZWRQb2ludD1udWxsO3RoaXMuX3Bsb3RTZXJpZXNJbmZvPW51bGw7dGhpcy5fZGF0YUNvbG9ycz1bXTt0aGlzLl9iYXJQb2ludHM9W107dmFyIG89e2xpbmVKb2luOiJtaXRlciIsbGluZUNhcDoicm91bmQiLGZpbGw6dHJ1ZSxpc2FyYzpmYWxzZSxzdHJva2VTdHlsZTp0aGlzLmNvbG9yLGZpbGxTdHlsZTp0aGlzLmNvbG9yLGNsb3NlUGF0aDp0aGlzLmZpbGx9O3RoaXMucmVuZGVyZXIuc2hhcGVSZW5kZXJlci5pbml0KG8pO3ZhciBtPXtsaW5lSm9pbjoibWl0ZXIiLGxpbmVDYXA6InJvdW5kIixmaWxsOnRydWUsaXNhcmM6ZmFsc2UsYW5nbGU6dGhpcy5zaGFkb3dBbmdsZSxvZmZzZXQ6dGhpcy5zaGFkb3dPZmZzZXQsYWxwaGE6dGhpcy5zaGFkb3dBbHBoYSxkZXB0aDp0aGlzLnNoYWRvd0RlcHRoLGNsb3NlUGF0aDp0aGlzLmZpbGx9O3RoaXMucmVuZGVyZXIuc2hhZG93UmVuZGVyZXIuaW5pdChtKTtwLnBvc3RJbml0SG9va3MuYWRkT25jZShoKTtwLnBvc3REcmF3SG9va3MuYWRkT25jZShpKTtwLmV2ZW50TGlzdGVuZXJIb29rcy5hZGRPbmNlKCJqcXBsb3RNb3VzZU1vdmUiLGIpO3AuZXZlbnRMaXN0ZW5lckhvb2tzLmFkZE9uY2UoImpxcGxvdE1vdXNlRG93biIsYSk7cC5ldmVudExpc3RlbmVySG9va3MuYWRkT25jZSgianFwbG90TW91c2VVcCIsayk7cC5ldmVudExpc3RlbmVySG9va3MuYWRkT25jZSgianFwbG90Q2xpY2siLGUpO3AuZXZlbnRMaXN0ZW5lckhvb2tzLmFkZE9uY2UoImpxcGxvdFJpZ2h0Q2xpY2siLGwpfTtmdW5jdGlvbiBnKHMsbyxuLHYpe2lmKHRoaXMucmVuZGVyZXJPcHRpb25zLmJhckRpcmVjdGlvbj09Imhvcml6b250YWwiKXt0aGlzLl9zdGFja0F4aXM9IngiO3RoaXMuX3ByaW1hcnlBeGlzPSJfeWF4aXMifWlmKHRoaXMucmVuZGVyZXJPcHRpb25zLndhdGVyZmFsbD09dHJ1ZSl7dGhpcy5fZGF0YT1kLmV4dGVuZCh0cnVlLFtdLHRoaXMuZGF0YSk7dmFyIHI9MDt2YXIgdD0oIXRoaXMucmVuZGVyZXJPcHRpb25zLmJhckRpcmVjdGlvbnx8dGhpcy5yZW5kZXJlck9wdGlvbnMuYmFyRGlyZWN0aW9uPT09InZlcnRpY2FsInx8dGhpcy50cmFuc3Bvc2VkRGF0YT09PWZhbHNlKT8xOjA7Zm9yKHZhciBwPTA7cDx0aGlzLmRhdGEubGVuZ3RoO3ArKyl7cis9dGhpcy5kYXRhW3BdW3RdO2lmKHA+MCl7dGhpcy5kYXRhW3BdW3RdKz10aGlzLmRhdGFbcC0xXVt0XX19dGhpcy5kYXRhW3RoaXMuZGF0YS5sZW5ndGhdPSh0PT0xKT9bdGhpcy5kYXRhLmxlbmd0aCsxLHJdOltyLHRoaXMuZGF0YS5sZW5ndGgrMV07dGhpcy5fZGF0YVt0aGlzLl9kYXRhLmxlbmd0aF09KHQ9PTEpP1t0aGlzLl9kYXRhLmxlbmd0aCsxLHJdOltyLHRoaXMuX2RhdGEubGVuZ3RoKzFdfWlmKHRoaXMucmVuZGVyZXJPcHRpb25zLmdyb3Vwcz4xKXt0aGlzLmJyZWFrT25OdWxsPXRydWU7dmFyIG09dGhpcy5kYXRhLmxlbmd0aDt2YXIgdT1wYXJzZUludChtL3RoaXMucmVuZGVyZXJPcHRpb25zLmdyb3VwcywxMCk7dmFyIHE9MDtmb3IodmFyIHA9dTtwPG07cCs9dSl7dGhpcy5kYXRhLnNwbGljZShwK3EsMCxbbnVsbCxudWxsXSk7cSsrfWZvcihwPTA7cDx0aGlzLmRhdGEubGVuZ3RoO3ArKyl7aWYodGhpcy5fcHJpbWFyeUF4aXM9PSJfeGF4aXMiKXt0aGlzLmRhdGFbcF1bMF09cCsxfWVsc2V7dGhpcy5kYXRhW3BdWzFdPXArMX19fX1kLmpxcGxvdC5wcmVTZXJpZXNJbml0SG9va3MucHVzaChnKTtkLmpxcGxvdC5CYXJSZW5kZXJlci5wcm90b3R5cGUuY2FsY1Nlcmllc051bWJlcnM9ZnVuY3Rpb24oKXt2YXIgcT0wO3ZhciByPTA7dmFyIHA9dGhpc1t0aGlzLl9wcmltYXJ5QXhpc107dmFyIG8sbix0O2Zvcih2YXIgbT0wO208cC5fc2VyaWVzLmxlbmd0aDttKyspe249cC5fc2VyaWVzW21dO2lmKG49PT10aGlzKXt0PW19aWYobi5yZW5kZXJlci5jb25zdHJ1Y3Rvcj09ZC5qcXBsb3QuQmFyUmVuZGVyZXIpe3ErPW4uZGF0YS5sZW5ndGg7cis9MX19cmV0dXJuW3Escix0XX07ZC5qcXBsb3QuQmFyUmVuZGVyZXIucHJvdG90eXBlLnNldEJhcldpZHRoPWZ1bmN0aW9uKCl7dmFyIHA7dmFyIG09MDt2YXIgbj0wO3ZhciByPXRoaXNbdGhpcy5fcHJpbWFyeUF4aXNdO3ZhciB3LHEsdTt2YXIgdj10aGlzLl9wbG90U2VyaWVzSW5mbz10aGlzLnJlbmRlcmVyLmNhbGNTZXJpZXNOdW1iZXJzLmNhbGwodGhpcyk7bT12WzBdO249dlsxXTt2YXIgdD1yLm51bWJlclRpY2tzO3ZhciBvPSh0LTEpLzI7aWYoci5uYW1lPT0ieGF4aXMifHxyLm5hbWU9PSJ4MmF4aXMiKXtpZih0aGlzLl9zdGFjayl7dGhpcy5iYXJXaWR0aD0oci5fb2Zmc2V0cy5tYXgtci5fb2Zmc2V0cy5taW4pL20qbi10aGlzLmJhck1hcmdpbn1lbHNle3RoaXMuYmFyV2lkdGg9KChyLl9vZmZzZXRzLm1heC1yLl9vZmZzZXRzLm1pbikvby10aGlzLmJhclBhZGRpbmcqKG4tMSktdGhpcy5iYXJNYXJnaW4qMikvbn19ZWxzZXtpZih0aGlzLl9zdGFjayl7dGhpcy5iYXJXaWR0aD0oci5fb2Zmc2V0cy5taW4tci5fb2Zmc2V0cy5tYXgpL20qbi10aGlzLmJhck1hcmdpbn1lbHNle3RoaXMuYmFyV2lkdGg9KChyLl9vZmZzZXRzLm1pbi1yLl9vZmZzZXRzLm1heCkvby10aGlzLmJhclBhZGRpbmcqKG4tMSktdGhpcy5iYXJNYXJnaW4qMikvbn19cmV0dXJuW20sbl19O2Z1bmN0aW9uIGYobil7dmFyIHA9W107Zm9yKHZhciByPTA7cjxuLmxlbmd0aDtyKyspe3ZhciBxPWQuanFwbG90LmdldENvbG9yQ29tcG9uZW50cyhuW3JdKTt2YXIgbT1bcVswXSxxWzFdLHFbMl1dO3ZhciBzPW1bMF0rbVsxXSttWzJdO2Zvcih2YXIgbz0wO288MztvKyspe21bb109KHM+NTcwKT9tW29dKjAuODptW29dKzAuMyooMjU1LW1bb10pO21bb109cGFyc2VJbnQobVtvXSwxMCl9cC5wdXNoKCJyZ2IoIittWzBdKyIsIittWzFdKyIsIittWzJdKyIpIil9cmV0dXJuIHB9ZC5qcXBsb3QuQmFyUmVuZGVyZXIucHJvdG90eXBlLmRyYXc9ZnVuY3Rpb24oRCxKLHApe3ZhciBHO3ZhciB6PWQuZXh0ZW5kKHt9LHApO3ZhciB1PSh6LnNoYWRvdyE9dW5kZWZpbmVkKT96LnNoYWRvdzp0aGlzLnNoYWRvdzt2YXIgTT0oei5zaG93TGluZSE9dW5kZWZpbmVkKT96LnNob3dMaW5lOnRoaXMuc2hvd0xpbmU7dmFyIEU9KHouZmlsbCE9dW5kZWZpbmVkKT96LmZpbGw6dGhpcy5maWxsO3ZhciBvPXRoaXMueGF4aXM7dmFyIEg9dGhpcy55YXhpczt2YXIgeD10aGlzLl94YXhpcy5zZXJpZXNfdTJwO3ZhciBJPXRoaXMuX3lheGlzLnNlcmllc191MnA7dmFyIEMsQjt0aGlzLl9kYXRhQ29sb3JzPVtdO3RoaXMuX2JhclBvaW50cz1bXTtpZih0aGlzLmJhcldpZHRoPT1udWxsKXt0aGlzLnJlbmRlcmVyLnNldEJhcldpZHRoLmNhbGwodGhpcyl9dmFyIEw9dGhpcy5fcGxvdFNlcmllc0luZm89dGhpcy5yZW5kZXJlci5jYWxjU2VyaWVzTnVtYmVycy5jYWxsKHRoaXMpO3ZhciB3PUxbMF07dmFyIHY9TFsxXTt2YXIgcj1MWzJdO3ZhciBGPVtdO2lmKHRoaXMuX3N0YWNrKXt0aGlzLl9iYXJOdWRnZT0wfWVsc2V7dGhpcy5fYmFyTnVkZ2U9KC1NYXRoLmFicyh2LzItMC41KStyKSoodGhpcy5iYXJXaWR0aCt0aGlzLmJhclBhZGRpbmcpfWlmKE0pe3ZhciB0PW5ldyBkLmpxcGxvdC5Db2xvckdlbmVyYXRvcih0aGlzLm5lZ2F0aXZlU2VyaWVzQ29sb3JzKTt2YXIgQT1uZXcgZC5qcXBsb3QuQ29sb3JHZW5lcmF0b3IodGhpcy5zZXJpZXNDb2xvcnMpO3ZhciBLPXQuZ2V0KHRoaXMuaW5kZXgpO2lmKCF0aGlzLnVzZU5lZ2F0aXZlQ29sb3JzKXtLPXouZmlsbFN0eWxlfXZhciBzPXouZmlsbFN0eWxlO3ZhciBxO3ZhciBOO3ZhciBuO2lmKHRoaXMuYmFyRGlyZWN0aW9uPT0idmVydGljYWwiKXtmb3IodmFyIEc9MDtHPEoubGVuZ3RoO0crKyl7aWYodGhpcy5kYXRhW0ddWzFdPT1udWxsKXtjb250aW51ZX1GPVtdO3E9SltHXVswXSt0aGlzLl9iYXJOdWRnZTtuO2lmKHRoaXMuX3N0YWNrJiZ0aGlzLl9wcmV2R3JpZERhdGEubGVuZ3RoKXtuPXRoaXMuX3ByZXZHcmlkRGF0YVtHXVsxXX1lbHNle2lmKHRoaXMuZmlsbFRvWmVybyl7bj10aGlzLl95YXhpcy5zZXJpZXNfdTJwKDApfWVsc2V7aWYodGhpcy53YXRlcmZhbGwmJkc+MCYmRzx0aGlzLmdyaWREYXRhLmxlbmd0aC0xKXtuPXRoaXMuZ3JpZERhdGFbRy0xXVsxXX1lbHNle2lmKHRoaXMud2F0ZXJmYWxsJiZHPT0wJiZHPHRoaXMuZ3JpZERhdGEubGVuZ3RoLTEpe2lmKHRoaXMuX3lheGlzLm1pbjw9MCYmdGhpcy5feWF4aXMubWF4Pj0wKXtuPXRoaXMuX3lheGlzLnNlcmllc191MnAoMCl9ZWxzZXtpZih0aGlzLl95YXhpcy5taW4+MCl7bj1ELmNhbnZhcy5oZWlnaHR9ZWxzZXtuPTB9fX1lbHNle2lmKHRoaXMud2F0ZXJmYWxsJiZHPT10aGlzLmdyaWREYXRhLmxlbmd0aC0xKXtpZih0aGlzLl95YXhpcy5taW48PTAmJnRoaXMuX3lheGlzLm1heD49MCl7bj10aGlzLl95YXhpcy5zZXJpZXNfdTJwKDApfWVsc2V7aWYodGhpcy5feWF4aXMubWluPjApe249RC5jYW52YXMuaGVpZ2h0fWVsc2V7bj0wfX19ZWxzZXtuPUQuY2FudmFzLmhlaWdodH19fX19aWYoKHRoaXMuZmlsbFRvWmVybyYmdGhpcy5fcGxvdERhdGFbR11bMV08MCl8fCh0aGlzLndhdGVyZmFsbCYmdGhpcy5fZGF0YVtHXVsxXTwwKSl7aWYodGhpcy52YXJ5QmFyQ29sb3ImJiF0aGlzLl9zdGFjayl7aWYodGhpcy51c2VOZWdhdGl2ZUNvbG9ycyl7ei5maWxsU3R5bGU9dC5uZXh0KCl9ZWxzZXt6LmZpbGxTdHlsZT1BLm5leHQoKX19ZWxzZXt6LmZpbGxTdHlsZT1LfX1lbHNle2lmKHRoaXMudmFyeUJhckNvbG9yJiYhdGhpcy5fc3RhY2spe3ouZmlsbFN0eWxlPUEubmV4dCgpfWVsc2V7ei5maWxsU3R5bGU9c319aWYoIXRoaXMuZmlsbFRvWmVyb3x8dGhpcy5fcGxvdERhdGFbR11bMV0+PTApe0YucHVzaChbcS10aGlzLmJhcldpZHRoLzIsbl0pO0YucHVzaChbcS10aGlzLmJhcldpZHRoLzIsSltHXVsxXV0pO0YucHVzaChbcSt0aGlzLmJhcldpZHRoLzIsSltHXVsxXV0pO0YucHVzaChbcSt0aGlzLmJhcldpZHRoLzIsbl0pfWVsc2V7Ri5wdXNoKFtxLXRoaXMuYmFyV2lkdGgvMixKW0ddWzFdXSk7Ri5wdXNoKFtxLXRoaXMuYmFyV2lkdGgvMixuXSk7Ri5wdXNoKFtxK3RoaXMuYmFyV2lkdGgvMixuXSk7Ri5wdXNoKFtxK3RoaXMuYmFyV2lkdGgvMixKW0ddWzFdXSl9dGhpcy5fYmFyUG9pbnRzLnB1c2goRik7aWYodSYmIXRoaXMuX3N0YWNrKXt2YXIgeT1kLmV4dGVuZCh0cnVlLHt9LHopO2RlbGV0ZSB5LmZpbGxTdHlsZTt0aGlzLnJlbmRlcmVyLnNoYWRvd1JlbmRlcmVyLmRyYXcoRCxGLHkpfXZhciBtPXouZmlsbFN0eWxlfHx0aGlzLmNvbG9yO3RoaXMuX2RhdGFDb2xvcnMucHVzaChtKTt0aGlzLnJlbmRlcmVyLnNoYXBlUmVuZGVyZXIuZHJhdyhELEYseil9fWVsc2V7aWYodGhpcy5iYXJEaXJlY3Rpb249PSJob3Jpem9udGFsIil7Zm9yKHZhciBHPTA7RzxKLmxlbmd0aDtHKyspe2lmKHRoaXMuZGF0YVtHXVswXT09bnVsbCl7Y29udGludWV9Rj1bXTtxPUpbR11bMV0tdGhpcy5fYmFyTnVkZ2U7TjtpZih0aGlzLl9zdGFjayYmdGhpcy5fcHJldkdyaWREYXRhLmxlbmd0aCl7Tj10aGlzLl9wcmV2R3JpZERhdGFbR11bMF19ZWxzZXtpZih0aGlzLmZpbGxUb1plcm8pe049dGhpcy5feGF4aXMuc2VyaWVzX3UycCgwKX1lbHNle2lmKHRoaXMud2F0ZXJmYWxsJiZHPjAmJkc8dGhpcy5ncmlkRGF0YS5sZW5ndGgtMSl7Tj10aGlzLmdyaWREYXRhW0ctMV1bMV19ZWxzZXtpZih0aGlzLndhdGVyZmFsbCYmRz09MCYmRzx0aGlzLmdyaWREYXRhLmxlbmd0aC0xKXtpZih0aGlzLl94YXhpcy5taW48PTAmJnRoaXMuX3hheGlzLm1heD49MCl7Tj10aGlzLl94YXhpcy5zZXJpZXNfdTJwKDApfWVsc2V7aWYodGhpcy5feGF4aXMubWluPjApe049MH1lbHNle049RC5jYW52YXMud2lkdGh9fX1lbHNle2lmKHRoaXMud2F0ZXJmYWxsJiZHPT10aGlzLmdyaWREYXRhLmxlbmd0aC0xKXtpZih0aGlzLl94YXhpcy5taW48PTAmJnRoaXMuX3hheGlzLm1heD49MCl7Tj10aGlzLl94YXhpcy5zZXJpZXNfdTJwKDApfWVsc2V7aWYodGhpcy5feGF4aXMubWluPjApe049MH1lbHNle049RC5jYW52YXMud2lkdGh9fX1lbHNle049MH19fX19aWYoKHRoaXMuZmlsbFRvWmVybyYmdGhpcy5fcGxvdERhdGFbR11bMV08MCl8fCh0aGlzLndhdGVyZmFsbCYmdGhpcy5fZGF0YVtHXVsxXTwwKSl7aWYodGhpcy52YXJ5QmFyQ29sb3ImJiF0aGlzLl9zdGFjayl7aWYodGhpcy51c2VOZWdhdGl2ZUNvbG9ycyl7ei5maWxsU3R5bGU9dC5uZXh0KCl9ZWxzZXt6LmZpbGxTdHlsZT1BLm5leHQoKX19fWVsc2V7aWYodGhpcy52YXJ5QmFyQ29sb3ImJiF0aGlzLl9zdGFjayl7ei5maWxsU3R5bGU9QS5uZXh0KCl9ZWxzZXt6LmZpbGxTdHlsZT1zfX1pZighdGhpcy5maWxsVG9aZXJvfHx0aGlzLl9wbG90RGF0YVtHXVswXT49MCl7Ri5wdXNoKFtOLHErdGhpcy5iYXJXaWR0aC8yXSk7Ri5wdXNoKFtOLHEtdGhpcy5iYXJXaWR0aC8yXSk7Ri5wdXNoKFtKW0ddWzBdLHEtdGhpcy5iYXJXaWR0aC8yXSk7Ri5wdXNoKFtKW0ddWzBdLHErdGhpcy5iYXJXaWR0aC8yXSl9ZWxzZXtGLnB1c2goW0pbR11bMF0scSt0aGlzLmJhcldpZHRoLzJdKTtGLnB1c2goW0pbR11bMF0scS10aGlzLmJhcldpZHRoLzJdKTtGLnB1c2goW04scS10aGlzLmJhcldpZHRoLzJdKTtGLnB1c2goW04scSt0aGlzLmJhcldpZHRoLzJdKX10aGlzLl9iYXJQb2ludHMucHVzaChGKTtpZih1JiYhdGhpcy5fc3RhY2spe3ZhciB5PWQuZXh0ZW5kKHRydWUse30seik7ZGVsZXRlIHkuZmlsbFN0eWxlO3RoaXMucmVuZGVyZXIuc2hhZG93UmVuZGVyZXIuZHJhdyhELEYseSl9dmFyIG09ei5maWxsU3R5bGV8fHRoaXMuY29sb3I7dGhpcy5fZGF0YUNvbG9ycy5wdXNoKG0pO3RoaXMucmVuZGVyZXIuc2hhcGVSZW5kZXJlci5kcmF3KEQsRix6KX19fX1pZih0aGlzLmhpZ2hsaWdodENvbG9ycy5sZW5ndGg9PTApe3RoaXMuaGlnaGxpZ2h0Q29sb3JzPWQuanFwbG90LmNvbXB1dGVIaWdobGlnaHRDb2xvcnModGhpcy5fZGF0YUNvbG9ycyl9ZWxzZXtpZih0eXBlb2YodGhpcy5oaWdobGlnaHRDb2xvcnMpPT0ic3RyaW5nIil7dmFyIEw9dGhpcy5oaWdobGlnaHRDb2xvcnM7dGhpcy5oaWdobGlnaHRDb2xvcnM9W107Zm9yKHZhciBHPTA7Rzx0aGlzLl9kYXRhQ29sb3JzLmxlbmd0aDtHKyspe3RoaXMuaGlnaGxpZ2h0Q29sb3JzLnB1c2goTCl9fX19O2QuanFwbG90LkJhclJlbmRlcmVyLnByb3RvdHlwZS5kcmF3U2hhZG93PWZ1bmN0aW9uKHksRSxvKXt2YXIgQjt2YXIgdj0obyE9dW5kZWZpbmVkKT9vOnt9O3ZhciByPSh2LnNoYWRvdyE9dW5kZWZpbmVkKT92LnNoYWRvdzp0aGlzLnNoYWRvdzt2YXIgRz0odi5zaG93TGluZSE9dW5kZWZpbmVkKT92LnNob3dMaW5lOnRoaXMuc2hvd0xpbmU7dmFyIHo9KHYuZmlsbCE9dW5kZWZpbmVkKT92LmZpbGw6dGhpcy5maWxsO3ZhciBuPXRoaXMueGF4aXM7dmFyIEM9dGhpcy55YXhpczt2YXIgdT10aGlzLl94YXhpcy5zZXJpZXNfdTJwO3ZhciBEPXRoaXMuX3lheGlzLnNlcmllc191MnA7dmFyIHgsQSx3LHQscyxxO2lmKHRoaXMuX3N0YWNrJiZ0aGlzLnNoYWRvdyl7aWYodGhpcy5iYXJXaWR0aD09bnVsbCl7dGhpcy5yZW5kZXJlci5zZXRCYXJXaWR0aC5jYWxsKHRoaXMpfXZhciBGPXRoaXMuX3Bsb3RTZXJpZXNJbmZvPXRoaXMucmVuZGVyZXIuY2FsY1Nlcmllc051bWJlcnMuY2FsbCh0aGlzKTt0PUZbMF07cz1GWzFdO3E9RlsyXTtpZih0aGlzLl9zdGFjayl7dGhpcy5fYmFyTnVkZ2U9MH1lbHNle3RoaXMuX2Jhck51ZGdlPSgtTWF0aC5hYnMocy8yLTAuNSkrcSkqKHRoaXMuYmFyV2lkdGgrdGhpcy5iYXJQYWRkaW5nKX1pZihHKXtpZih0aGlzLmJhckRpcmVjdGlvbj09InZlcnRpY2FsIil7Zm9yKHZhciBCPTA7QjxFLmxlbmd0aDtCKyspe2lmKHRoaXMuZGF0YVtCXVsxXT09bnVsbCl7Y29udGludWV9QT1bXTt2YXIgcD1FW0JdWzBdK3RoaXMuX2Jhck51ZGdlO3ZhciBtO2lmKHRoaXMuX3N0YWNrJiZ0aGlzLl9wcmV2R3JpZERhdGEubGVuZ3RoKXttPXRoaXMuX3ByZXZHcmlkRGF0YVtCXVsxXX1lbHNle2lmKHRoaXMuZmlsbFRvWmVybyl7bT10aGlzLl95YXhpcy5zZXJpZXNfdTJwKDApfWVsc2V7bT15LmNhbnZhcy5oZWlnaHR9fUEucHVzaChbcC10aGlzLmJhcldpZHRoLzIsbV0pO0EucHVzaChbcC10aGlzLmJhcldpZHRoLzIsRVtCXVsxXV0pO0EucHVzaChbcCt0aGlzLmJhcldpZHRoLzIsRVtCXVsxXV0pO0EucHVzaChbcCt0aGlzLmJhcldpZHRoLzIsbV0pO3RoaXMucmVuZGVyZXIuc2hhZG93UmVuZGVyZXIuZHJhdyh5LEEsdil9fWVsc2V7aWYodGhpcy5iYXJEaXJlY3Rpb249PSJob3Jpem9udGFsIil7Zm9yKHZhciBCPTA7QjxFLmxlbmd0aDtCKyspe2lmKHRoaXMuZGF0YVtCXVswXT09bnVsbCl7Y29udGludWV9QT1bXTt2YXIgcD1FW0JdWzFdLXRoaXMuX2Jhck51ZGdlO3ZhciBIO2lmKHRoaXMuX3N0YWNrJiZ0aGlzLl9wcmV2R3JpZERhdGEubGVuZ3RoKXtIPXRoaXMuX3ByZXZHcmlkRGF0YVtCXVswXX1lbHNle0g9MH1BLnB1c2goW0gscCt0aGlzLmJhcldpZHRoLzJdKTtBLnB1c2goW0VbQl1bMF0scCt0aGlzLmJhcldpZHRoLzJdKTtBLnB1c2goW0VbQl1bMF0scC10aGlzLmJhcldpZHRoLzJdKTtBLnB1c2goW0gscC10aGlzLmJhcldpZHRoLzJdKTt0aGlzLnJlbmRlcmVyLnNoYWRvd1JlbmRlcmVyLmRyYXcoeSxBLHYpfX19fX19O2Z1bmN0aW9uIGgocCxvLG0pe2Zvcih2YXIgbj0wO248dGhpcy5zZXJpZXMubGVuZ3RoO24rKyl7aWYodGhpcy5zZXJpZXNbbl0ucmVuZGVyZXIuY29uc3RydWN0b3I9PWQuanFwbG90LkJhclJlbmRlcmVyKXtpZih0aGlzLnNlcmllc1tuXS5oaWdobGlnaHRNb3VzZU92ZXIpe3RoaXMuc2VyaWVzW25dLmhpZ2hsaWdodE1vdXNlRG93bj1mYWxzZX19fX1mdW5jdGlvbiBpKCl7aWYodGhpcy5wbHVnaW5zLmJhclJlbmRlcmVyJiZ0aGlzLnBsdWdpbnMuYmFyUmVuZGVyZXIuaGlnaGxpZ2h0Q2FudmFzKXt0aGlzLnBsdWdpbnMuYmFyUmVuZGVyZXIuaGlnaGxpZ2h0Q2FudmFzLnJlc2V0Q2FudmFzKCk7dGhpcy5wbHVnaW5zLmJhclJlbmRlcmVyLmhpZ2hsaWdodENhbnZhcz1udWxsfXRoaXMucGx1Z2lucy5iYXJSZW5kZXJlcj17aGlnaGxpZ2h0ZWRTZXJpZXNJbmRleDpudWxsfTt0aGlzLnBsdWdpbnMuYmFyUmVuZGVyZXIuaGlnaGxpZ2h0Q2FudmFzPW5ldyBkLmpxcGxvdC5HZW5lcmljQ2FudmFzKCk7dGhpcy5ldmVudENhbnZhcy5fZWxlbS5iZWZvcmUodGhpcy5wbHVnaW5zLmJhclJlbmRlcmVyLmhpZ2hsaWdodENhbnZhcy5jcmVhdGVFbGVtZW50KHRoaXMuX2dyaWRQYWRkaW5nLCJqcXBsb3QtYmFyUmVuZGVyZXItaGlnaGxpZ2h0LWNhbnZhcyIsdGhpcy5fcGxvdERpbWVuc2lvbnMsdGhpcykpO3RoaXMucGx1Z2lucy5iYXJSZW5kZXJlci5oaWdobGlnaHRDYW52YXMuc2V0Q29udGV4dCgpO3RoaXMuZXZlbnRDYW52YXMuX2VsZW0uYmluZCgibW91c2VsZWF2ZSIse3Bsb3Q6dGhpc30sZnVuY3Rpb24obSl7aihtLmRhdGEucGxvdCl9KX1mdW5jdGlvbiBjKHQscixwLG8pe3ZhciBuPXQuc2VyaWVzW3JdO3ZhciBtPXQucGx1Z2lucy5iYXJSZW5kZXJlci5oaWdobGlnaHRDYW52YXM7bS5fY3R4LmNsZWFyUmVjdCgwLDAsbS5fY3R4LmNhbnZhcy53aWR0aCxtLl9jdHguY2FudmFzLmhlaWdodCk7bi5faGlnaGxpZ2h0ZWRQb2ludD1wO3QucGx1Z2lucy5iYXJSZW5kZXJlci5oaWdobGlnaHRlZFNlcmllc0luZGV4PXI7dmFyIHE9e2ZpbGxTdHlsZTpuLmhpZ2hsaWdodENvbG9yc1twXX07bi5yZW5kZXJlci5zaGFwZVJlbmRlcmVyLmRyYXcobS5fY3R4LG8scSk7bT1udWxsfWZ1bmN0aW9uIGoobyl7dmFyIG09by5wbHVnaW5zLmJhclJlbmRlcmVyLmhpZ2hsaWdodENhbnZhczttLl9jdHguY2xlYXJSZWN0KDAsMCxtLl9jdHguY2FudmFzLndpZHRoLG0uX2N0eC5jYW52YXMuaGVpZ2h0KTtmb3IodmFyIG49MDtuPG8uc2VyaWVzLmxlbmd0aDtuKyspe28uc2VyaWVzW25dLl9oaWdobGlnaHRlZFBvaW50PW51bGx9by5wbHVnaW5zLmJhclJlbmRlcmVyLmhpZ2hsaWdodGVkU2VyaWVzSW5kZXg9bnVsbDtvLnRhcmdldC50cmlnZ2VyKCJqcXBsb3REYXRhVW5oaWdobGlnaHQiKTttPW51bGx9ZnVuY3Rpb24gYihxLHAsdCxzLHIpe2lmKHMpe3ZhciBvPVtzLnNlcmllc0luZGV4LHMucG9pbnRJbmRleCxzLmRhdGFdO3ZhciBuPWpRdWVyeS5FdmVudCgianFwbG90RGF0YU1vdXNlT3ZlciIpO24ucGFnZVg9cS5wYWdlWDtuLnBhZ2VZPXEucGFnZVk7ci50YXJnZXQudHJpZ2dlcihuLG8pO2lmKHIuc2VyaWVzW29bMF1dLmhpZ2hsaWdodE1vdXNlT3ZlciYmIShvWzBdPT1yLnBsdWdpbnMuYmFyUmVuZGVyZXIuaGlnaGxpZ2h0ZWRTZXJpZXNJbmRleCYmb1sxXT09ci5zZXJpZXNbb1swXV0uX2hpZ2hsaWdodGVkUG9pbnQpKXt2YXIgbT1qUXVlcnkuRXZlbnQoImpxcGxvdERhdGFIaWdobGlnaHQiKTttLnBhZ2VYPXEucGFnZVg7bS5wYWdlWT1xLnBhZ2VZO3IudGFyZ2V0LnRyaWdnZXIobSxvKTtjKHIscy5zZXJpZXNJbmRleCxzLnBvaW50SW5kZXgscy5wb2ludHMpfX1lbHNle2lmKHM9PW51bGwpe2oocil9fX1mdW5jdGlvbiBhKHAsbyxzLHIscSl7aWYocil7dmFyIG49W3Iuc2VyaWVzSW5kZXgsci5wb2ludEluZGV4LHIuZGF0YV07aWYocS5zZXJpZXNbblswXV0uaGlnaGxpZ2h0TW91c2VEb3duJiYhKG5bMF09PXEucGx1Z2lucy5iYXJSZW5kZXJlci5oaWdobGlnaHRlZFNlcmllc0luZGV4JiZuWzFdPT1xLnNlcmllc1tuWzBdXS5faGlnaGxpZ2h0ZWRQb2ludCkpe3ZhciBtPWpRdWVyeS5FdmVudCgianFwbG90RGF0YUhpZ2hsaWdodCIpO20ucGFnZVg9cC5wYWdlWDttLnBhZ2VZPXAucGFnZVk7cS50YXJnZXQudHJpZ2dlcihtLG4pO2MocSxyLnNlcmllc0luZGV4LHIucG9pbnRJbmRleCxyLnBvaW50cyl9fWVsc2V7aWYocj09bnVsbCl7aihxKX19fWZ1bmN0aW9uIGsobyxuLHIscSxwKXt2YXIgbT1wLnBsdWdpbnMuYmFyUmVuZGVyZXIuaGlnaGxpZ2h0ZWRTZXJpZXNJbmRleDtpZihtIT1udWxsJiZwLnNlcmllc1ttXS5oaWdobGlnaHRNb3VzZURvd24pe2oocCl9fWZ1bmN0aW9uIGUocCxvLHMscixxKXtpZihyKXt2YXIgbj1bci5zZXJpZXNJbmRleCxyLnBvaW50SW5kZXgsci5kYXRhXTt2YXIgbT1qUXVlcnkuRXZlbnQoImpxcGxvdERhdGFDbGljayIpO20ucGFnZVg9cC5wYWdlWDttLnBhZ2VZPXAucGFnZVk7cS50YXJnZXQudHJpZ2dlcihtLG4pfX1mdW5jdGlvbiBsKHEscCx0LHMscil7aWYocyl7dmFyIG89W3Muc2VyaWVzSW5kZXgscy5wb2ludEluZGV4LHMuZGF0YV07dmFyIG09ci5wbHVnaW5zLmJhclJlbmRlcmVyLmhpZ2hsaWdodGVkU2VyaWVzSW5kZXg7aWYobSE9bnVsbCYmci5zZXJpZXNbbV0uaGlnaGxpZ2h0TW91c2VEb3duKXtqKHIpfXZhciBuPWpRdWVyeS5FdmVudCgianFwbG90RGF0YVJpZ2h0Q2xpY2siKTtuLnBhZ2VYPXEucGFnZVg7bi5wYWdlWT1xLnBhZ2VZO3IudGFyZ2V0LnRyaWdnZXIobixvKX19fSkoalF1ZXJ5KTs=]]></data>
	</file>
	<file>
	  <filename>/src/plugins/jqplot.BezierCurveRenderer.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqCiAqIGpxUGxvdAogKiBQdXJlIEphdmFTY3JpcHQgcGxvdHRpbmcgcGx1Z2luIHVzaW5nIGpRdWVyeQogKgogKiBWZXJzaW9uOiAxLjAuMGIyX3IxMDEyCiAqCiAqIENvcHlyaWdodCAoYykgMjAwOS0yMDExIENocmlzIExlb25lbGxvCiAqIGpxUGxvdCBpcyBjdXJyZW50bHkgYXZhaWxhYmxlIGZvciB1c2UgaW4gYWxsIHBlcnNvbmFsIG9yIGNvbW1lcmNpYWwgcHJvamVjdHMgCiAqIHVuZGVyIGJvdGggdGhlIE1JVCAoaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHApIGFuZCBHUEwgCiAqIHZlcnNpb24gMi4wIChodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC5odG1sKSBsaWNlbnNlcy4gVGhpcyBtZWFucyB0aGF0IHlvdSBjYW4gCiAqIGNob29zZSB0aGUgbGljZW5zZSB0aGF0IGJlc3Qgc3VpdHMgeW91ciBwcm9qZWN0IGFuZCB1c2UgaXQgYWNjb3JkaW5nbHkuIAogKgogKiBBbHRob3VnaCBub3QgcmVxdWlyZWQsIHRoZSBhdXRob3Igd291bGQgYXBwcmVjaWF0ZSBhbiBlbWFpbCBsZXR0aW5nIGhpbSAKICoga25vdyBvZiBhbnkgc3Vic3RhbnRpYWwgdXNlIG9mIGpxUGxvdC4gIFlvdSBjYW4gcmVhY2ggdGhlIGF1dGhvciBhdDogCiAqIGNocmlzIGF0IGpxcGxvdCBkb3QgY29tIG9yIHNlZSBodHRwOi8vd3d3LmpxcGxvdC5jb20vaW5mby5waHAgLgogKgogKiBJZiB5b3UgYXJlIGZlZWxpbmcga2luZCBhbmQgZ2VuZXJvdXMsIGNvbnNpZGVyIHN1cHBvcnRpbmcgdGhlIHByb2plY3QgYnkKICogbWFraW5nIGEgZG9uYXRpb24gYXQ6IGh0dHA6Ly93d3cuanFwbG90LmNvbS9kb25hdGUucGhwIC4KICoKICogc3ByaW50ZiBmdW5jdGlvbnMgY29udGFpbmVkIGluIGpxcGxvdC5zcHJpbnRmLmpzIGJ5IEFzaCBTZWFybGU6CiAqCiAqICAgICB2ZXJzaW9uIDIwMDcuMDQuMjcKICogICAgIGF1dGhvciBBc2ggU2VhcmxlCiAqICAgICBodHRwOi8vaGV4bWVuLmNvbS9ibG9nLzIwMDcvMDMvcHJpbnRmLXNwcmludGYvCiAqICAgICBodHRwOi8vaGV4bWVuLmNvbS9qcy9zcHJpbnRmLmpzCiAqICAgICBUaGUgYXV0aG9yIChBc2ggU2VhcmxlKSBoYXMgcGxhY2VkIHRoaXMgY29kZSBpbiB0aGUgcHVibGljIGRvbWFpbjoKICogICAgICJUaGlzIGNvZGUgaXMgdW5yZXN0cmljdGVkOiB5b3UgYXJlIGZyZWUgdG8gdXNlIGl0IGhvd2V2ZXIgeW91IGxpa2UuIgogKiAKICovCihmdW5jdGlvbigkKSB7CiAgICAvLyBDbGFzczogJC5qcXBsb3QuQmV6aWVyQ3VydmVSZW5kZXJlci5qcwogICAgLy8gUmVuZGVyZXIgd2hpY2ggZHJhd3MgbGluZXMgYXMgc3RhY2tlZCBiZXppZXIgY3VydmVzLgogICAgLy8gRGF0YSBmb3IgdGhlIGxpbmUgd2lsbCBub3QgYmUgc3BlY2lmaWVkIGFzIGFuIGFycmF5IG9mCiAgICAvLyBbeCwgeV0gZGF0YSBwb2ludCB2YWx1ZXMsIGJ1dCBhcyBhIGFuIGFycmF5IG9mIFtzdGFydCBwaW9udCwgYmV6aWVyIGN1cnZlXQogICAgLy8gU28sIHRoZSBsaW5lIGlzIHNwZWNpZmllZCBhczogW1t4c3RhcnQsIHlzdGFydF0sIFtjcDF4LCBjcDF5LCBjcDJ4LCBjcDJ5LCB4ZW5kLCB5ZW5kXV0uCiAgICAkLmpxcGxvdC5CZXppZXJDdXJ2ZVJlbmRlcmVyID0gZnVuY3Rpb24oKXsKICAgICAgICAkLmpxcGxvdC5MaW5lUmVuZGVyZXIuY2FsbCh0aGlzKTsKICAgIH07CiAgICAKICAgICQuanFwbG90LkJlemllckN1cnZlUmVuZGVyZXIucHJvdG90eXBlID0gbmV3ICQuanFwbG90LkxpbmVSZW5kZXJlcigpOwogICAgJC5qcXBsb3QuQmV6aWVyQ3VydmVSZW5kZXJlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSAkLmpxcGxvdC5CZXppZXJDdXJ2ZVJlbmRlcmVyOwoKICAgIAogICAgLy8gTWV0aG9kOiBzZXRHcmlkRGF0YQogICAgLy8gY29udmVydHMgdGhlIHVzZXIgZGF0YSB2YWx1ZXMgdG8gZ3JpZCBjb29yZGluYXRlcyBhbmQgc3RvcmVzIHRoZW0KICAgIC8vIGluIHRoZSBncmlkRGF0YSBhcnJheS4KICAgIC8vIENhbGxlZCB3aXRoIHNjb3BlIG9mIGEgc2VyaWVzLgogICAgJC5qcXBsb3QuQmV6aWVyQ3VydmVSZW5kZXJlci5wcm90b3R5cGUuc2V0R3JpZERhdGEgPSBmdW5jdGlvbihwbG90KSB7CiAgICAgICAgLy8gcmVjYWxjdWxhdGUgdGhlIGdyaWQgZGF0YQogICAgICAgIHZhciB4cCA9IHRoaXMuX3hheGlzLnNlcmllc191MnA7CiAgICAgICAgdmFyIHlwID0gdGhpcy5feWF4aXMuc2VyaWVzX3UycDsKICAgICAgICAvLyB0aGlzLl9wbG90RGF0YSBzaG91bGQgYmUgc2FtZSBhcyB0aGlzLmRhdGEKICAgICAgICB2YXIgZGF0YSA9IHRoaXMuZGF0YTsKICAgICAgICB0aGlzLmdyaWREYXRhID0gW107CiAgICAgICAgdGhpcy5fcHJldkdyaWREYXRhID0gW107CiAgICAgICAgLy8gaWYgc2VyaWVzSW5kZXggPSAwLCBmaWxsIHRvIHggYXhpcy4KICAgICAgICAvLyBpZiBzZXJpZXNJbmRleCA+IDAsIGZpbGwgdG8gcHJldmlvdXMgc2VyaWVzIGRhdGEuCiAgICAgICAgdmFyIGlkeCA9IHRoaXMuaW5kZXg7CiAgICAgICAgaWYgKGRhdGEubGVuZ3RoID09IDIpIHsKICAgICAgICAgICAgaWYgKGlkeCA9PSAwKSB7CiAgICAgICAgICAgICAgICB0aGlzLmdyaWREYXRhID0gWwogICAgICAgICAgICAgICAgICAgIFt4cC5jYWxsKHRoaXMuX3hheGlzLCBkYXRhWzBdWzBdKSwgeXAuY2FsbCh0aGlzLl95YXhpcywgZGF0YVswXVsxXSldLCAKICAgICAgICAgICAgICAgICAgICBbeHAuY2FsbCh0aGlzLl94YXhpcywgZGF0YVsxXVswXSksIHlwLmNhbGwodGhpcy5feWF4aXMsIGRhdGFbMV1bMV0pLCAKICAgICAgICAgICAgICAgICAgICAgICAgeHAuY2FsbCh0aGlzLl94YXhpcywgZGF0YVsxXVsyXSksIHlwLmNhbGwodGhpcy5feWF4aXMsIGRhdGFbMV1bM10pLCAgCiAgICAgICAgICAgICAgICAgICAgICAgIHhwLmNhbGwodGhpcy5feGF4aXMsIGRhdGFbMV1bNF0pLCB5cC5jYWxsKHRoaXMuX3lheGlzLCBkYXRhWzFdWzVdKV0sCiAgICAgICAgICAgICAgICAgICAgW3hwLmNhbGwodGhpcy5feGF4aXMsIGRhdGFbMV1bNF0pLCB5cC5jYWxsKHRoaXMuX3lheGlzLCB0aGlzLl95YXhpcy5taW4pXSwKICAgICAgICAgICAgICAgICAgICBbeHAuY2FsbCh0aGlzLl94YXhpcywgZGF0YVswXVswXSksIHlwLmNhbGwodGhpcy5feWF4aXMsIHRoaXMuX3lheGlzLm1pbildCiAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgdmFyIHBzZCA9IHBsb3Quc2VyaWVzW2lkeC0xXS5kYXRhOwogICAgICAgICAgICAgICAgdGhpcy5ncmlkRGF0YSA9IFsKICAgICAgICAgICAgICAgICAgICBbeHAuY2FsbCh0aGlzLl94YXhpcywgZGF0YVswXVswXSksIHlwLmNhbGwodGhpcy5feWF4aXMsIGRhdGFbMF1bMV0pXSwgCiAgICAgICAgICAgICAgICAgICAgW3hwLmNhbGwodGhpcy5feGF4aXMsIGRhdGFbMV1bMF0pLCB5cC5jYWxsKHRoaXMuX3lheGlzLCBkYXRhWzFdWzFdKSwgCiAgICAgICAgICAgICAgICAgICAgICAgIHhwLmNhbGwodGhpcy5feGF4aXMsIGRhdGFbMV1bMl0pLCB5cC5jYWxsKHRoaXMuX3lheGlzLCBkYXRhWzFdWzNdKSwgIAogICAgICAgICAgICAgICAgICAgICAgICB4cC5jYWxsKHRoaXMuX3hheGlzLCBkYXRhWzFdWzRdKSwgeXAuY2FsbCh0aGlzLl95YXhpcywgZGF0YVsxXVs1XSldLAogICAgICAgICAgICAgICAgICAgIFt4cC5jYWxsKHRoaXMuX3hheGlzLCBwc2RbMV1bNF0pLCB5cC5jYWxsKHRoaXMuX3lheGlzLCBwc2RbMV1bNV0pXSwKICAgICAgICAgICAgICAgICAgICBbeHAuY2FsbCh0aGlzLl94YXhpcywgcHNkWzFdWzJdKSwgeXAuY2FsbCh0aGlzLl95YXhpcywgcHNkWzFdWzNdKSwgCiAgICAgICAgICAgICAgICAgICAgICAgIHhwLmNhbGwodGhpcy5feGF4aXMsIHBzZFsxXVswXSksIHlwLmNhbGwodGhpcy5feWF4aXMsIHBzZFsxXVsxXSksICAKICAgICAgICAgICAgICAgICAgICAgICAgeHAuY2FsbCh0aGlzLl94YXhpcywgcHNkWzBdWzBdKSwgeXAuY2FsbCh0aGlzLl95YXhpcywgcHNkWzBdWzFdKV0KICAgICAgICAgICAgICAgIF07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGlmIChpZHggPT0gMCkgewogICAgICAgICAgICAgICAgdGhpcy5ncmlkRGF0YSA9IFsKICAgICAgICAgICAgICAgICAgICBbeHAuY2FsbCh0aGlzLl94YXhpcywgZGF0YVswXVswXSksIHlwLmNhbGwodGhpcy5feWF4aXMsIGRhdGFbMF1bMV0pXSwgCiAgICAgICAgICAgICAgICAgICAgW3hwLmNhbGwodGhpcy5feGF4aXMsIGRhdGFbMV1bMF0pLCB5cC5jYWxsKHRoaXMuX3lheGlzLCBkYXRhWzFdWzFdKSwgCiAgICAgICAgICAgICAgICAgICAgICAgIHhwLmNhbGwodGhpcy5feGF4aXMsIGRhdGFbMl1bMF0pLCB5cC5jYWxsKHRoaXMuX3lheGlzLCBkYXRhWzJdWzFdKSwgIAogICAgICAgICAgICAgICAgICAgICAgICB4cC5jYWxsKHRoaXMuX3hheGlzLCBkYXRhWzNdWzBdKSwgeXAuY2FsbCh0aGlzLl95YXhpcywgZGF0YVszXVsxXSldLAogICAgICAgICAgICAgICAgICAgIFt4cC5jYWxsKHRoaXMuX3hheGlzLCBkYXRhWzNdWzFdKSwgeXAuY2FsbCh0aGlzLl95YXhpcywgdGhpcy5feWF4aXMubWluKV0sCiAgICAgICAgICAgICAgICAgICAgW3hwLmNhbGwodGhpcy5feGF4aXMsIGRhdGFbMF1bMF0pLCB5cC5jYWxsKHRoaXMuX3lheGlzLCB0aGlzLl95YXhpcy5taW4pXQogICAgICAgICAgICAgICAgXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHZhciBwc2QgPSBwbG90LnNlcmllc1tpZHgtMV0uZGF0YTsKICAgICAgICAgICAgICAgIHRoaXMuZ3JpZERhdGEgPSBbCiAgICAgICAgICAgICAgICAgICAgW3hwLmNhbGwodGhpcy5feGF4aXMsIGRhdGFbMF1bMF0pLCB5cC5jYWxsKHRoaXMuX3lheGlzLCBkYXRhWzBdWzFdKV0sIAogICAgICAgICAgICAgICAgICAgIFt4cC5jYWxsKHRoaXMuX3hheGlzLCBkYXRhWzFdWzBdKSwgeXAuY2FsbCh0aGlzLl95YXhpcywgZGF0YVsxXVsxXSksIAogICAgICAgICAgICAgICAgICAgICAgICB4cC5jYWxsKHRoaXMuX3hheGlzLCBkYXRhWzJdWzBdKSwgeXAuY2FsbCh0aGlzLl95YXhpcywgZGF0YVsyXVsxXSksICAKICAgICAgICAgICAgICAgICAgICAgICAgeHAuY2FsbCh0aGlzLl94YXhpcywgZGF0YVszXVswXSksIHlwLmNhbGwodGhpcy5feWF4aXMsIGRhdGFbM11bMV0pXSwKICAgICAgICAgICAgICAgICAgICBbeHAuY2FsbCh0aGlzLl94YXhpcywgcHNkWzNdWzBdKSwgeXAuY2FsbCh0aGlzLl95YXhpcywgcHNkWzNdWzFdKV0sCiAgICAgICAgICAgICAgICAgICAgW3hwLmNhbGwodGhpcy5feGF4aXMsIHBzZFsyXVswXSksIHlwLmNhbGwodGhpcy5feWF4aXMsIHBzZFsyXVsxXSksIAogICAgICAgICAgICAgICAgICAgICAgICB4cC5jYWxsKHRoaXMuX3hheGlzLCBwc2RbMV1bMF0pLCB5cC5jYWxsKHRoaXMuX3lheGlzLCBwc2RbMV1bMV0pLCAgCiAgICAgICAgICAgICAgICAgICAgICAgIHhwLmNhbGwodGhpcy5feGF4aXMsIHBzZFswXVswXSksIHlwLmNhbGwodGhpcy5feWF4aXMsIHBzZFswXVsxXSldCiAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfTsKICAgIAogICAgLy8gTWV0aG9kOiBtYWtlR3JpZERhdGEKICAgIC8vIGNvbnZlcnRzIGFueSBhcmJpdHJhcnkgZGF0YSB2YWx1ZXMgdG8gZ3JpZCBjb29yZGluYXRlcyBhbmQKICAgIC8vIHJldHVybnMgdGhlbS4gIFRoaXMgbWV0aG9kIGV4aXN0cyBzbyB0aGF0IHBsdWdpbnMgY2FuIHVzZSBhIHNlcmllcycKICAgIC8vIGxpbmVyZW5kZXJlciB0byBnZW5lcmF0ZSBncmlkIGRhdGEgcG9pbnRzIHdpdGhvdXQgb3ZlcndyaXRpbmcgdGhlCiAgICAvLyBncmlkIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoYXQgc2VyaWVzLgogICAgLy8gQ2FsbGVkIHdpdGggc2NvcGUgb2YgYSBzZXJpZXMuCiAgICAkLmpxcGxvdC5CZXppZXJDdXJ2ZVJlbmRlcmVyLnByb3RvdHlwZS5tYWtlR3JpZERhdGEgPSBmdW5jdGlvbihkYXRhLCBwbG90KSB7CiAgICAgICAgLy8gcmVjYWxjdWxhdGUgdGhlIGdyaWQgZGF0YQogICAgICAgIHZhciB4cCA9IHRoaXMuX3hheGlzLnNlcmllc191MnA7CiAgICAgICAgdmFyIHlwID0gdGhpcy5feWF4aXMuc2VyaWVzX3UycDsKICAgICAgICB2YXIgZ2QgPSBbXTsKICAgICAgICB2YXIgcGdkID0gW107CiAgICAgICAgLy8gaWYgc2VyaWVzSW5kZXggPSAwLCBmaWxsIHRvIHggYXhpcy4KICAgICAgICAvLyBpZiBzZXJpZXNJbmRleCA+IDAsIGZpbGwgdG8gcHJldmlvdXMgc2VyaWVzIGRhdGEuCiAgICAgICAgdmFyIGlkeCA9IHRoaXMuaW5kZXg7CiAgICAgICAgaWYgKGRhdGEubGVuZ3RoID09IDIpIHsKICAgICAgICAgICAgaWYgKGlkeCA9PSAwKSB7CiAgICAgICAgICAgICAgICBnZCA9IFsKICAgICAgICAgICAgICAgICAgICBbeHAuY2FsbCh0aGlzLl94YXhpcywgZGF0YVswXVswXSksIHlwLmNhbGwodGhpcy5feWF4aXMsIGRhdGFbMF1bMV0pXSwgCiAgICAgICAgICAgICAgICAgICAgW3hwLmNhbGwodGhpcy5feGF4aXMsIGRhdGFbMV1bMF0pLCB5cC5jYWxsKHRoaXMuX3lheGlzLCBkYXRhWzFdWzFdKSwgCiAgICAgICAgICAgICAgICAgICAgICAgIHhwLmNhbGwodGhpcy5feGF4aXMsIGRhdGFbMV1bMl0pLCB5cC5jYWxsKHRoaXMuX3lheGlzLCBkYXRhWzFdWzNdKSwgIAogICAgICAgICAgICAgICAgICAgICAgICB4cC5jYWxsKHRoaXMuX3hheGlzLCBkYXRhWzFdWzRdKSwgeXAuY2FsbCh0aGlzLl95YXhpcywgZGF0YVsxXVs1XSldLAogICAgICAgICAgICAgICAgICAgIFt4cC5jYWxsKHRoaXMuX3hheGlzLCBkYXRhWzFdWzRdKSwgeXAuY2FsbCh0aGlzLl95YXhpcywgdGhpcy5feWF4aXMubWluKV0sCiAgICAgICAgICAgICAgICAgICAgW3hwLmNhbGwodGhpcy5feGF4aXMsIGRhdGFbMF1bMF0pLCB5cC5jYWxsKHRoaXMuX3lheGlzLCB0aGlzLl95YXhpcy5taW4pXQogICAgICAgICAgICAgICAgXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHZhciBwc2QgPSBwbG90LnNlcmllc1tpZHgtMV0uZGF0YTsKICAgICAgICAgICAgICAgIGdkID0gWwogICAgICAgICAgICAgICAgICAgIFt4cC5jYWxsKHRoaXMuX3hheGlzLCBkYXRhWzBdWzBdKSwgeXAuY2FsbCh0aGlzLl95YXhpcywgZGF0YVswXVsxXSldLCAKICAgICAgICAgICAgICAgICAgICBbeHAuY2FsbCh0aGlzLl94YXhpcywgZGF0YVsxXVswXSksIHlwLmNhbGwodGhpcy5feWF4aXMsIGRhdGFbMV1bMV0pLCAKICAgICAgICAgICAgICAgICAgICAgICAgeHAuY2FsbCh0aGlzLl94YXhpcywgZGF0YVsxXVsyXSksIHlwLmNhbGwodGhpcy5feWF4aXMsIGRhdGFbMV1bM10pLCAgCiAgICAgICAgICAgICAgICAgICAgICAgIHhwLmNhbGwodGhpcy5feGF4aXMsIGRhdGFbMV1bNF0pLCB5cC5jYWxsKHRoaXMuX3lheGlzLCBkYXRhWzFdWzVdKV0sCiAgICAgICAgICAgICAgICAgICAgW3hwLmNhbGwodGhpcy5feGF4aXMsIHBzZFsxXVs0XSksIHlwLmNhbGwodGhpcy5feWF4aXMsIHBzZFsxXVs1XSldLAogICAgICAgICAgICAgICAgICAgIFt4cC5jYWxsKHRoaXMuX3hheGlzLCBwc2RbMV1bMl0pLCB5cC5jYWxsKHRoaXMuX3lheGlzLCBwc2RbMV1bM10pLCAKICAgICAgICAgICAgICAgICAgICAgICAgeHAuY2FsbCh0aGlzLl94YXhpcywgcHNkWzFdWzBdKSwgeXAuY2FsbCh0aGlzLl95YXhpcywgcHNkWzFdWzFdKSwgIAogICAgICAgICAgICAgICAgICAgICAgICB4cC5jYWxsKHRoaXMuX3hheGlzLCBwc2RbMF1bMF0pLCB5cC5jYWxsKHRoaXMuX3lheGlzLCBwc2RbMF1bMV0pXQogICAgICAgICAgICAgICAgXTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgaWYgKGlkeCA9PSAwKSB7CiAgICAgICAgICAgICAgICBnZCA9IFsKICAgICAgICAgICAgICAgICAgICBbeHAuY2FsbCh0aGlzLl94YXhpcywgZGF0YVswXVswXSksIHlwLmNhbGwodGhpcy5feWF4aXMsIGRhdGFbMF1bMV0pXSwgCiAgICAgICAgICAgICAgICAgICAgW3hwLmNhbGwodGhpcy5feGF4aXMsIGRhdGFbMV1bMF0pLCB5cC5jYWxsKHRoaXMuX3lheGlzLCBkYXRhWzFdWzFdKSwgCiAgICAgICAgICAgICAgICAgICAgICAgIHhwLmNhbGwodGhpcy5feGF4aXMsIGRhdGFbMl1bMF0pLCB5cC5jYWxsKHRoaXMuX3lheGlzLCBkYXRhWzJdWzFdKSwgIAogICAgICAgICAgICAgICAgICAgICAgICB4cC5jYWxsKHRoaXMuX3hheGlzLCBkYXRhWzNdWzBdKSwgeXAuY2FsbCh0aGlzLl95YXhpcywgZGF0YVszXVsxXSldLAogICAgICAgICAgICAgICAgICAgIFt4cC5jYWxsKHRoaXMuX3hheGlzLCBkYXRhWzNdWzFdKSwgeXAuY2FsbCh0aGlzLl95YXhpcywgdGhpcy5feWF4aXMubWluKV0sCiAgICAgICAgICAgICAgICAgICAgW3hwLmNhbGwodGhpcy5feGF4aXMsIGRhdGFbMF1bMF0pLCB5cC5jYWxsKHRoaXMuX3lheGlzLCB0aGlzLl95YXhpcy5taW4pXQogICAgICAgICAgICAgICAgXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHZhciBwc2QgPSBwbG90LnNlcmllc1tpZHgtMV0uZGF0YTsKICAgICAgICAgICAgICAgIGdkID0gWwogICAgICAgICAgICAgICAgICAgIFt4cC5jYWxsKHRoaXMuX3hheGlzLCBkYXRhWzBdWzBdKSwgeXAuY2FsbCh0aGlzLl95YXhpcywgZGF0YVswXVsxXSldLCAKICAgICAgICAgICAgICAgICAgICBbeHAuY2FsbCh0aGlzLl94YXhpcywgZGF0YVsxXVswXSksIHlwLmNhbGwodGhpcy5feWF4aXMsIGRhdGFbMV1bMV0pLCAKICAgICAgICAgICAgICAgICAgICAgICAgeHAuY2FsbCh0aGlzLl94YXhpcywgZGF0YVsyXVswXSksIHlwLmNhbGwodGhpcy5feWF4aXMsIGRhdGFbMl1bMV0pLCAgCiAgICAgICAgICAgICAgICAgICAgICAgIHhwLmNhbGwodGhpcy5feGF4aXMsIGRhdGFbM11bMF0pLCB5cC5jYWxsKHRoaXMuX3lheGlzLCBkYXRhWzNdWzFdKV0sCiAgICAgICAgICAgICAgICAgICAgW3hwLmNhbGwodGhpcy5feGF4aXMsIHBzZFszXVswXSksIHlwLmNhbGwodGhpcy5feWF4aXMsIHBzZFszXVsxXSldLAogICAgICAgICAgICAgICAgICAgIFt4cC5jYWxsKHRoaXMuX3hheGlzLCBwc2RbMl1bMF0pLCB5cC5jYWxsKHRoaXMuX3lheGlzLCBwc2RbMl1bMV0pLCAKICAgICAgICAgICAgICAgICAgICAgICAgeHAuY2FsbCh0aGlzLl94YXhpcywgcHNkWzFdWzBdKSwgeXAuY2FsbCh0aGlzLl95YXhpcywgcHNkWzFdWzFdKSwgIAogICAgICAgICAgICAgICAgICAgICAgICB4cC5jYWxsKHRoaXMuX3hheGlzLCBwc2RbMF1bMF0pLCB5cC5jYWxsKHRoaXMuX3lheGlzLCBwc2RbMF1bMV0pXQogICAgICAgICAgICAgICAgXTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gZ2Q7CiAgICB9OwogICAgCgogICAgLy8gY2FsbGVkIHdpdGhpbiBzY29wZSBvZiBzZXJpZXMuCiAgICAkLmpxcGxvdC5CZXppZXJDdXJ2ZVJlbmRlcmVyLnByb3RvdHlwZS5kcmF3ID0gZnVuY3Rpb24oY3R4LCBnZCwgb3B0aW9ucykgewogICAgICAgIHZhciBpOwogICAgICAgIGN0eC5zYXZlKCk7CiAgICAgICAgaWYgKGdkLmxlbmd0aCkgewogICAgICAgICAgICBpZiAodGhpcy5zaG93TGluZSkgewogICAgICAgICAgICAgICAgY3R4LnNhdmUoKTsKICAgICAgICAgICAgICAgIHZhciBvcHRzID0gKG9wdGlvbnMgIT0gbnVsbCkgPyBvcHRpb25zIDoge307CiAgICAgICAgICAgICAgICBjdHguZmlsbFN0eWxlID0gb3B0cy5maWxsU3R5bGUgfHwgdGhpcy5jb2xvcjsKICAgICAgICAgICAgICAgIGN0eC5iZWdpblBhdGgoKTsKICAgICAgICAgICAgICAgIGN0eC5tb3ZlVG8oZ2RbMF1bMF0sIGdkWzBdWzFdKTsKICAgICAgICAgICAgICAgIGN0eC5iZXppZXJDdXJ2ZVRvKGdkWzFdWzBdLCBnZFsxXVsxXSwgZ2RbMV1bMl0sIGdkWzFdWzNdLCBnZFsxXVs0XSwgZ2RbMV1bNV0pOwogICAgICAgICAgICAgICAgY3R4LmxpbmVUbyhnZFsyXVswXSwgZ2RbMl1bMV0pOwogICAgICAgICAgICAgICAgaWYgKGdkWzNdLmxlbmd0aCA9PSAyKSB7CiAgICAgICAgICAgICAgICAgICAgY3R4LmxpbmVUbyhnZFszXVswXSwgZ2RbM11bMV0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgY3R4LmJlemllckN1cnZlVG8oZ2RbM11bMF0sIGdkWzNdWzFdLCBnZFszXVsyXSwgZ2RbM11bM10sIGdkWzNdWzRdLCBnZFszXVs1XSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjdHguY2xvc2VQYXRoKCk7CiAgICAgICAgICAgICAgICBjdHguZmlsbCgpOwogICAgICAgICAgICAgICAgY3R4LnJlc3RvcmUoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAKICAgICAgICBjdHgucmVzdG9yZSgpOwogICAgfTsgIAogICAgCiAgICAkLmpxcGxvdC5CZXppZXJDdXJ2ZVJlbmRlcmVyLnByb3RvdHlwZS5kcmF3U2hhZG93ID0gZnVuY3Rpb24oY3R4LCBnZCwgb3B0aW9ucykgewogICAgICAgIC8vIFRoaXMgaXMgYSBuby1vcCwgc2hhZG93cyBkcmF3biB3aXRoIGxpbmVzLgogICAgfTsKICAgIAogICAgJC5qcXBsb3QuQmV6aWVyQXhpc1JlbmRlcmVyID0gZnVuY3Rpb24oKSB7CiAgICAgICAgJC5qcXBsb3QuTGluZWFyQXhpc1JlbmRlcmVyLmNhbGwodGhpcyk7CiAgICB9OwogICAgCiAgICAkLmpxcGxvdC5CZXppZXJBeGlzUmVuZGVyZXIucHJvdG90eXBlID0gbmV3ICQuanFwbG90LkxpbmVhckF4aXNSZW5kZXJlcigpOwogICAgJC5qcXBsb3QuQmV6aWVyQXhpc1JlbmRlcmVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9ICQuanFwbG90LkJlemllckF4aXNSZW5kZXJlcjsKICAgICAgICAKICAgIAogICAgLy8gQXhlcyBvbiBhIHBsb3Qgd2l0aCBCZXppZXIgQ3VydmVzCiAgICAkLmpxcGxvdC5CZXppZXJBeGlzUmVuZGVyZXIucHJvdG90eXBlLmluaXQgPSBmdW5jdGlvbihvcHRpb25zKXsKICAgICAgICAkLmV4dGVuZCh0cnVlLCB0aGlzLCBvcHRpb25zKTsKICAgICAgICB2YXIgZGIgPSB0aGlzLl9kYXRhQm91bmRzOwogICAgICAgIC8vIEdvIHRocm91Z2ggYWxsIHRoZSBzZXJpZXMgYXR0YWNoZWQgdG8gdGhpcyBheGlzIGFuZCBmaW5kCiAgICAgICAgLy8gdGhlIG1pbi9tYXggYm91bmRzIGZvciB0aGlzIGF4aXMuCiAgICAgICAgZm9yICh2YXIgaT0wOyBpPHRoaXMuX3Nlcmllcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICB2YXIgcyA9IHRoaXMuX3Nlcmllc1tpXTsKICAgICAgICAgICAgdmFyIGQgPSBzLmRhdGE7ICAKICAgICAgICAgICAgaWYgKGQubGVuZ3RoID09IDQpIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIGo9MDsgajxkLmxlbmd0aDsgaisrKSB7IAogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm5hbWUgPT0gJ3hheGlzJyB8fCB0aGlzLm5hbWUgPT0gJ3gyYXhpcycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRbal1bMF0gPCBkYi5taW4gfHwgZGIubWluID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRiLm1pbiA9IGRbal1bMF07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRbal1bMF0gPiBkYi5tYXggfHwgZGIubWF4ID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRiLm1heCA9IGRbal1bMF07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRbal1bMV0gPCBkYi5taW4gfHwgZGIubWluID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRiLm1pbiA9IGRbal1bMV07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRbal1bMV0gPiBkYi5tYXggfHwgZGIubWF4ID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRiLm1heCA9IGRbal1bMV07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSAgICAgICAgICAKICAgICAgICAgICAgZWxzZSB7ICAgIAogICAgICAgICAgICAgICAgaWYgKHRoaXMubmFtZSA9PSAneGF4aXMnIHx8IHRoaXMubmFtZSA9PSAneDJheGlzJykgewogICAgICAgICAgICAgICAgICAgIGlmIChkWzBdWzBdIDwgZGIubWluIHx8IGRiLm1pbiA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRiLm1pbiA9IGRbMF1bMF07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChkWzBdWzBdID4gZGIubWF4IHx8IGRiLm1heCA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRiLm1heCA9IGRbMF1bMF07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGo9MDsgajw1OyBqKz0yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkWzFdW2pdIDwgZGIubWluIHx8IGRiLm1pbiA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYi5taW4gPSBkWzFdW2pdOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkWzFdW2pdID4gZGIubWF4IHx8IGRiLm1heCA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYi5tYXggPSBkWzFdW2pdOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZFswXVsxXSA8IGRiLm1pbiB8fCBkYi5taW4gPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICBkYi5taW4gPSBkWzBdWzFdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoZFswXVsxXSA+IGRiLm1heCB8fCBkYi5tYXggPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICBkYi5tYXggPSBkWzBdWzFdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBqPTE7IGo8Njsgais9MikgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZFsxXVtqXSA8IGRiLm1pbiB8fCBkYi5taW4gPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGIubWluID0gZFsxXVtqXTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZFsxXVtqXSA+IGRiLm1heCB8fCBkYi5tYXggPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGIubWF4ID0gZFsxXVtqXTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gICAgICAgICAgIAogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfTsKICAgIAogICAgLy8gc2V0dXAgZGVmYXVsdCByZW5kZXJlcnMgZm9yIGF4ZXMgYW5kIGxlZ2VuZCBzbyB1c2VyIGRvZXNuJ3QgaGF2ZSB0bwogICAgLy8gY2FsbGVkIHdpdGggc2NvcGUgb2YgcGxvdAogICAgZnVuY3Rpb24gcHJlSW5pdCh0YXJnZXQsIGRhdGEsIG9wdGlvbnMpIHsKICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKICAgICAgICBvcHRpb25zLmF4ZXNEZWZhdWx0cyA9ICQuZXh0ZW5kKHRydWUsIHtwYWQ6MH0sIG9wdGlvbnMuYXhlc0RlZmF1bHRzKTsKICAgICAgICBvcHRpb25zLmxlZ2VuZCA9ICQuZXh0ZW5kKHRydWUsIHtwbGFjZW1lbnQ6J291dHNpZGUnfSwgb3B0aW9ucy5sZWdlbmQpOwogICAgICAgIC8vIG9ubHkgc2V0IHRoZXNlIGlmIHRoZXJlIGlzIGEgcGllIHNlcmllcwogICAgICAgIHZhciBzZXRvcHRzID0gZmFsc2U7CiAgICAgICAgaWYgKG9wdGlvbnMuc2VyaWVzRGVmYXVsdHMucmVuZGVyZXIgPT0gJC5qcXBsb3QuQmV6aWVyQ3VydmVSZW5kZXJlcikgewogICAgICAgICAgICBzZXRvcHRzID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAob3B0aW9ucy5zZXJpZXMpIHsKICAgICAgICAgICAgZm9yICh2YXIgaT0wOyBpIDwgb3B0aW9ucy5zZXJpZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnNlcmllc1tpXS5yZW5kZXJlciA9PSAkLmpxcGxvdC5CZXppZXJDdXJ2ZVJlbmRlcmVyKSB7CiAgICAgICAgICAgICAgICAgICAgc2V0b3B0cyA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYgKHNldG9wdHMpIHsKICAgICAgICAgICAgb3B0aW9ucy5heGVzRGVmYXVsdHMucmVuZGVyZXIgPSAkLmpxcGxvdC5CZXppZXJBeGlzUmVuZGVyZXI7CiAgICAgICAgfQogICAgfQogICAgCiAgICAkLmpxcGxvdC5wcmVJbml0SG9va3MucHVzaChwcmVJbml0KTsKICAgIAp9KShqUXVlcnkpOyAgICA=]]></data>
	</file>
	<file>
	  <filename>/src/plugins/jqplot.BezierCurveRenderer.min.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqCiAqIGpxUGxvdAogKiBQdXJlIEphdmFTY3JpcHQgcGxvdHRpbmcgcGx1Z2luIHVzaW5nIGpRdWVyeQogKgogKiBWZXJzaW9uOiAxLjAuMGIyX3IxMDEyCiAqCiAqIENvcHlyaWdodCAoYykgMjAwOS0yMDExIENocmlzIExlb25lbGxvCiAqIGpxUGxvdCBpcyBjdXJyZW50bHkgYXZhaWxhYmxlIGZvciB1c2UgaW4gYWxsIHBlcnNvbmFsIG9yIGNvbW1lcmNpYWwgcHJvamVjdHMgCiAqIHVuZGVyIGJvdGggdGhlIE1JVCAoaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHApIGFuZCBHUEwgCiAqIHZlcnNpb24gMi4wIChodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC5odG1sKSBsaWNlbnNlcy4gVGhpcyBtZWFucyB0aGF0IHlvdSBjYW4gCiAqIGNob29zZSB0aGUgbGljZW5zZSB0aGF0IGJlc3Qgc3VpdHMgeW91ciBwcm9qZWN0IGFuZCB1c2UgaXQgYWNjb3JkaW5nbHkuIAogKgogKiBBbHRob3VnaCBub3QgcmVxdWlyZWQsIHRoZSBhdXRob3Igd291bGQgYXBwcmVjaWF0ZSBhbiBlbWFpbCBsZXR0aW5nIGhpbSAKICoga25vdyBvZiBhbnkgc3Vic3RhbnRpYWwgdXNlIG9mIGpxUGxvdC4gIFlvdSBjYW4gcmVhY2ggdGhlIGF1dGhvciBhdDogCiAqIGNocmlzIGF0IGpxcGxvdCBkb3QgY29tIG9yIHNlZSBodHRwOi8vd3d3LmpxcGxvdC5jb20vaW5mby5waHAgLgogKgogKiBJZiB5b3UgYXJlIGZlZWxpbmcga2luZCBhbmQgZ2VuZXJvdXMsIGNvbnNpZGVyIHN1cHBvcnRpbmcgdGhlIHByb2plY3QgYnkKICogbWFraW5nIGEgZG9uYXRpb24gYXQ6IGh0dHA6Ly93d3cuanFwbG90LmNvbS9kb25hdGUucGhwIC4KICoKICogc3ByaW50ZiBmdW5jdGlvbnMgY29udGFpbmVkIGluIGpxcGxvdC5zcHJpbnRmLmpzIGJ5IEFzaCBTZWFybGU6CiAqCiAqICAgICB2ZXJzaW9uIDIwMDcuMDQuMjcKICogICAgIGF1dGhvciBBc2ggU2VhcmxlCiAqICAgICBodHRwOi8vaGV4bWVuLmNvbS9ibG9nLzIwMDcvMDMvcHJpbnRmLXNwcmludGYvCiAqICAgICBodHRwOi8vaGV4bWVuLmNvbS9qcy9zcHJpbnRmLmpzCiAqICAgICBUaGUgYXV0aG9yIChBc2ggU2VhcmxlKSBoYXMgcGxhY2VkIHRoaXMgY29kZSBpbiB0aGUgcHVibGljIGRvbWFpbjoKICogICAgICJUaGlzIGNvZGUgaXMgdW5yZXN0cmljdGVkOiB5b3UgYXJlIGZyZWUgdG8gdXNlIGl0IGhvd2V2ZXIgeW91IGxpa2UuIgogKgogKiBpbmNsdWRlZCBqc0RhdGUgbGlicmFyeSBieSBDaHJpcyBMZW9uZWxsbzoKICoKICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEgQ2hyaXMgTGVvbmVsbG8KICoKICoganNEYXRlIGlzIGN1cnJlbnRseSBhdmFpbGFibGUgZm9yIHVzZSBpbiBhbGwgcGVyc29uYWwgb3IgY29tbWVyY2lhbCBwcm9qZWN0cyAKICogdW5kZXIgYm90aCB0aGUgTUlUIGFuZCBHUEwgdmVyc2lvbiAyLjAgbGljZW5zZXMuIFRoaXMgbWVhbnMgdGhhdCB5b3UgY2FuIAogKiBjaG9vc2UgdGhlIGxpY2Vuc2UgdGhhdCBiZXN0IHN1aXRzIHlvdXIgcHJvamVjdCBhbmQgdXNlIGl0IGFjY29yZGluZ2x5LgogKgogKiBqc0RhdGUgYm9ycm93cyBtYW55IGNvbmNlcHRzIGFuZCBpZGVhcyBmcm9tIHRoZSBEYXRlIEluc3RhbmNlIAogKiBNZXRob2RzIGJ5IEtlbiBTbnlkZXIgYWxvbmcgd2l0aCBzb21lIHBhcnRzIG9mIEtlbidzIGFjdHVhbCBjb2RlLgogKiAKICogS2VuJ3Mgb3JpZ2lhbmwgRGF0ZSBJbnN0YW5jZSBNZXRob2RzIGFuZCBjb3B5cmlnaHQgbm90aWNlOgogKiAKICogS2VuIFNueWRlciAoa2VuIGQgc255ZGVyIGF0IGdtYWlsIGRvdCBjb20pCiAqIDIwMDgtMDktMTAKICogdmVyc2lvbiAyLjAuMiAoaHR0cDovL2tlbmRzbnlkZXIuY29tL3NhbmRib3gvZGF0ZS8pICAgICAKICogQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbiBMaWNlbnNlIDMuMCAoaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnkvMy4wLykKICoKICoganFwbG90VG9JbWFnZSBmdW5jdGlvbiBiYXNlZCBvbiBMYXJyeSBTaWRlbidzIGV4cG9ydC1qcXBsb3QtdG8tcG5nLmpzLgogKiBMYXJyeSBoYXMgZ2VuZXJvdXNseSBnaXZlbiBwZXJtaXNzaW9uIHRvIGFkYXB0IGhpcyBjb2RlIGZvciBpbmNsdXNpb24KICogaW50byBqcVBsb3QuCiAqCiAqIExhcnJ5J3Mgb3JpZ2luYWwgY29kZSBjYW4gYmUgZm91bmQgaGVyZToKICoKICogaHR0cHM6Ly9naXRodWIuY29tL2xzaWRlbi9leHBvcnQtanFwbG90LXRvLXBuZwogKiAKICogCiAqLwooZnVuY3Rpb24oYil7Yi5qcXBsb3QuQmV6aWVyQ3VydmVSZW5kZXJlcj1mdW5jdGlvbigpe2IuanFwbG90LkxpbmVSZW5kZXJlci5jYWxsKHRoaXMpfTtiLmpxcGxvdC5CZXppZXJDdXJ2ZVJlbmRlcmVyLnByb3RvdHlwZT1uZXcgYi5qcXBsb3QuTGluZVJlbmRlcmVyKCk7Yi5qcXBsb3QuQmV6aWVyQ3VydmVSZW5kZXJlci5wcm90b3R5cGUuY29uc3RydWN0b3I9Yi5qcXBsb3QuQmV6aWVyQ3VydmVSZW5kZXJlcjtiLmpxcGxvdC5CZXppZXJDdXJ2ZVJlbmRlcmVyLnByb3RvdHlwZS5zZXRHcmlkRGF0YT1mdW5jdGlvbihoKXt2YXIgZT10aGlzLl94YXhpcy5zZXJpZXNfdTJwO3ZhciBnPXRoaXMuX3lheGlzLnNlcmllc191MnA7dmFyIGY9dGhpcy5kYXRhO3RoaXMuZ3JpZERhdGE9W107dGhpcy5fcHJldkdyaWREYXRhPVtdO3ZhciBkPXRoaXMuaW5kZXg7aWYoZi5sZW5ndGg9PTIpe2lmKGQ9PTApe3RoaXMuZ3JpZERhdGE9W1tlLmNhbGwodGhpcy5feGF4aXMsZlswXVswXSksZy5jYWxsKHRoaXMuX3lheGlzLGZbMF1bMV0pXSxbZS5jYWxsKHRoaXMuX3hheGlzLGZbMV1bMF0pLGcuY2FsbCh0aGlzLl95YXhpcyxmWzFdWzFdKSxlLmNhbGwodGhpcy5feGF4aXMsZlsxXVsyXSksZy5jYWxsKHRoaXMuX3lheGlzLGZbMV1bM10pLGUuY2FsbCh0aGlzLl94YXhpcyxmWzFdWzRdKSxnLmNhbGwodGhpcy5feWF4aXMsZlsxXVs1XSldLFtlLmNhbGwodGhpcy5feGF4aXMsZlsxXVs0XSksZy5jYWxsKHRoaXMuX3lheGlzLHRoaXMuX3lheGlzLm1pbildLFtlLmNhbGwodGhpcy5feGF4aXMsZlswXVswXSksZy5jYWxsKHRoaXMuX3lheGlzLHRoaXMuX3lheGlzLm1pbildXX1lbHNle3ZhciBjPWguc2VyaWVzW2QtMV0uZGF0YTt0aGlzLmdyaWREYXRhPVtbZS5jYWxsKHRoaXMuX3hheGlzLGZbMF1bMF0pLGcuY2FsbCh0aGlzLl95YXhpcyxmWzBdWzFdKV0sW2UuY2FsbCh0aGlzLl94YXhpcyxmWzFdWzBdKSxnLmNhbGwodGhpcy5feWF4aXMsZlsxXVsxXSksZS5jYWxsKHRoaXMuX3hheGlzLGZbMV1bMl0pLGcuY2FsbCh0aGlzLl95YXhpcyxmWzFdWzNdKSxlLmNhbGwodGhpcy5feGF4aXMsZlsxXVs0XSksZy5jYWxsKHRoaXMuX3lheGlzLGZbMV1bNV0pXSxbZS5jYWxsKHRoaXMuX3hheGlzLGNbMV1bNF0pLGcuY2FsbCh0aGlzLl95YXhpcyxjWzFdWzVdKV0sW2UuY2FsbCh0aGlzLl94YXhpcyxjWzFdWzJdKSxnLmNhbGwodGhpcy5feWF4aXMsY1sxXVszXSksZS5jYWxsKHRoaXMuX3hheGlzLGNbMV1bMF0pLGcuY2FsbCh0aGlzLl95YXhpcyxjWzFdWzFdKSxlLmNhbGwodGhpcy5feGF4aXMsY1swXVswXSksZy5jYWxsKHRoaXMuX3lheGlzLGNbMF1bMV0pXV19fWVsc2V7aWYoZD09MCl7dGhpcy5ncmlkRGF0YT1bW2UuY2FsbCh0aGlzLl94YXhpcyxmWzBdWzBdKSxnLmNhbGwodGhpcy5feWF4aXMsZlswXVsxXSldLFtlLmNhbGwodGhpcy5feGF4aXMsZlsxXVswXSksZy5jYWxsKHRoaXMuX3lheGlzLGZbMV1bMV0pLGUuY2FsbCh0aGlzLl94YXhpcyxmWzJdWzBdKSxnLmNhbGwodGhpcy5feWF4aXMsZlsyXVsxXSksZS5jYWxsKHRoaXMuX3hheGlzLGZbM11bMF0pLGcuY2FsbCh0aGlzLl95YXhpcyxmWzNdWzFdKV0sW2UuY2FsbCh0aGlzLl94YXhpcyxmWzNdWzFdKSxnLmNhbGwodGhpcy5feWF4aXMsdGhpcy5feWF4aXMubWluKV0sW2UuY2FsbCh0aGlzLl94YXhpcyxmWzBdWzBdKSxnLmNhbGwodGhpcy5feWF4aXMsdGhpcy5feWF4aXMubWluKV1dfWVsc2V7dmFyIGM9aC5zZXJpZXNbZC0xXS5kYXRhO3RoaXMuZ3JpZERhdGE9W1tlLmNhbGwodGhpcy5feGF4aXMsZlswXVswXSksZy5jYWxsKHRoaXMuX3lheGlzLGZbMF1bMV0pXSxbZS5jYWxsKHRoaXMuX3hheGlzLGZbMV1bMF0pLGcuY2FsbCh0aGlzLl95YXhpcyxmWzFdWzFdKSxlLmNhbGwodGhpcy5feGF4aXMsZlsyXVswXSksZy5jYWxsKHRoaXMuX3lheGlzLGZbMl1bMV0pLGUuY2FsbCh0aGlzLl94YXhpcyxmWzNdWzBdKSxnLmNhbGwodGhpcy5feWF4aXMsZlszXVsxXSldLFtlLmNhbGwodGhpcy5feGF4aXMsY1szXVswXSksZy5jYWxsKHRoaXMuX3lheGlzLGNbM11bMV0pXSxbZS5jYWxsKHRoaXMuX3hheGlzLGNbMl1bMF0pLGcuY2FsbCh0aGlzLl95YXhpcyxjWzJdWzFdKSxlLmNhbGwodGhpcy5feGF4aXMsY1sxXVswXSksZy5jYWxsKHRoaXMuX3lheGlzLGNbMV1bMV0pLGUuY2FsbCh0aGlzLl94YXhpcyxjWzBdWzBdKSxnLmNhbGwodGhpcy5feWF4aXMsY1swXVsxXSldXX19fTtiLmpxcGxvdC5CZXppZXJDdXJ2ZVJlbmRlcmVyLnByb3RvdHlwZS5tYWtlR3JpZERhdGE9ZnVuY3Rpb24oZyxpKXt2YXIgZj10aGlzLl94YXhpcy5zZXJpZXNfdTJwO3ZhciBoPXRoaXMuX3lheGlzLnNlcmllc191MnA7dmFyIGU9W107dmFyIGo9W107dmFyIGQ9dGhpcy5pbmRleDtpZihnLmxlbmd0aD09Mil7aWYoZD09MCl7ZT1bW2YuY2FsbCh0aGlzLl94YXhpcyxnWzBdWzBdKSxoLmNhbGwodGhpcy5feWF4aXMsZ1swXVsxXSldLFtmLmNhbGwodGhpcy5feGF4aXMsZ1sxXVswXSksaC5jYWxsKHRoaXMuX3lheGlzLGdbMV1bMV0pLGYuY2FsbCh0aGlzLl94YXhpcyxnWzFdWzJdKSxoLmNhbGwodGhpcy5feWF4aXMsZ1sxXVszXSksZi5jYWxsKHRoaXMuX3hheGlzLGdbMV1bNF0pLGguY2FsbCh0aGlzLl95YXhpcyxnWzFdWzVdKV0sW2YuY2FsbCh0aGlzLl94YXhpcyxnWzFdWzRdKSxoLmNhbGwodGhpcy5feWF4aXMsdGhpcy5feWF4aXMubWluKV0sW2YuY2FsbCh0aGlzLl94YXhpcyxnWzBdWzBdKSxoLmNhbGwodGhpcy5feWF4aXMsdGhpcy5feWF4aXMubWluKV1dfWVsc2V7dmFyIGM9aS5zZXJpZXNbZC0xXS5kYXRhO2U9W1tmLmNhbGwodGhpcy5feGF4aXMsZ1swXVswXSksaC5jYWxsKHRoaXMuX3lheGlzLGdbMF1bMV0pXSxbZi5jYWxsKHRoaXMuX3hheGlzLGdbMV1bMF0pLGguY2FsbCh0aGlzLl95YXhpcyxnWzFdWzFdKSxmLmNhbGwodGhpcy5feGF4aXMsZ1sxXVsyXSksaC5jYWxsKHRoaXMuX3lheGlzLGdbMV1bM10pLGYuY2FsbCh0aGlzLl94YXhpcyxnWzFdWzRdKSxoLmNhbGwodGhpcy5feWF4aXMsZ1sxXVs1XSldLFtmLmNhbGwodGhpcy5feGF4aXMsY1sxXVs0XSksaC5jYWxsKHRoaXMuX3lheGlzLGNbMV1bNV0pXSxbZi5jYWxsKHRoaXMuX3hheGlzLGNbMV1bMl0pLGguY2FsbCh0aGlzLl95YXhpcyxjWzFdWzNdKSxmLmNhbGwodGhpcy5feGF4aXMsY1sxXVswXSksaC5jYWxsKHRoaXMuX3lheGlzLGNbMV1bMV0pLGYuY2FsbCh0aGlzLl94YXhpcyxjWzBdWzBdKSxoLmNhbGwodGhpcy5feWF4aXMsY1swXVsxXSldXX19ZWxzZXtpZihkPT0wKXtlPVtbZi5jYWxsKHRoaXMuX3hheGlzLGdbMF1bMF0pLGguY2FsbCh0aGlzLl95YXhpcyxnWzBdWzFdKV0sW2YuY2FsbCh0aGlzLl94YXhpcyxnWzFdWzBdKSxoLmNhbGwodGhpcy5feWF4aXMsZ1sxXVsxXSksZi5jYWxsKHRoaXMuX3hheGlzLGdbMl1bMF0pLGguY2FsbCh0aGlzLl95YXhpcyxnWzJdWzFdKSxmLmNhbGwodGhpcy5feGF4aXMsZ1szXVswXSksaC5jYWxsKHRoaXMuX3lheGlzLGdbM11bMV0pXSxbZi5jYWxsKHRoaXMuX3hheGlzLGdbM11bMV0pLGguY2FsbCh0aGlzLl95YXhpcyx0aGlzLl95YXhpcy5taW4pXSxbZi5jYWxsKHRoaXMuX3hheGlzLGdbMF1bMF0pLGguY2FsbCh0aGlzLl95YXhpcyx0aGlzLl95YXhpcy5taW4pXV19ZWxzZXt2YXIgYz1pLnNlcmllc1tkLTFdLmRhdGE7ZT1bW2YuY2FsbCh0aGlzLl94YXhpcyxnWzBdWzBdKSxoLmNhbGwodGhpcy5feWF4aXMsZ1swXVsxXSldLFtmLmNhbGwodGhpcy5feGF4aXMsZ1sxXVswXSksaC5jYWxsKHRoaXMuX3lheGlzLGdbMV1bMV0pLGYuY2FsbCh0aGlzLl94YXhpcyxnWzJdWzBdKSxoLmNhbGwodGhpcy5feWF4aXMsZ1syXVsxXSksZi5jYWxsKHRoaXMuX3hheGlzLGdbM11bMF0pLGguY2FsbCh0aGlzLl95YXhpcyxnWzNdWzFdKV0sW2YuY2FsbCh0aGlzLl94YXhpcyxjWzNdWzBdKSxoLmNhbGwodGhpcy5feWF4aXMsY1szXVsxXSldLFtmLmNhbGwodGhpcy5feGF4aXMsY1syXVswXSksaC5jYWxsKHRoaXMuX3lheGlzLGNbMl1bMV0pLGYuY2FsbCh0aGlzLl94YXhpcyxjWzFdWzBdKSxoLmNhbGwodGhpcy5feWF4aXMsY1sxXVsxXSksZi5jYWxsKHRoaXMuX3hheGlzLGNbMF1bMF0pLGguY2FsbCh0aGlzLl95YXhpcyxjWzBdWzFdKV1dfX1yZXR1cm4gZX07Yi5qcXBsb3QuQmV6aWVyQ3VydmVSZW5kZXJlci5wcm90b3R5cGUuZHJhdz1mdW5jdGlvbihjLGcsZCl7dmFyIGU7Yy5zYXZlKCk7aWYoZy5sZW5ndGgpe2lmKHRoaXMuc2hvd0xpbmUpe2Muc2F2ZSgpO3ZhciBmPShkIT1udWxsKT9kOnt9O2MuZmlsbFN0eWxlPWYuZmlsbFN0eWxlfHx0aGlzLmNvbG9yO2MuYmVnaW5QYXRoKCk7Yy5tb3ZlVG8oZ1swXVswXSxnWzBdWzFdKTtjLmJlemllckN1cnZlVG8oZ1sxXVswXSxnWzFdWzFdLGdbMV1bMl0sZ1sxXVszXSxnWzFdWzRdLGdbMV1bNV0pO2MubGluZVRvKGdbMl1bMF0sZ1syXVsxXSk7aWYoZ1szXS5sZW5ndGg9PTIpe2MubGluZVRvKGdbM11bMF0sZ1szXVsxXSl9ZWxzZXtjLmJlemllckN1cnZlVG8oZ1szXVswXSxnWzNdWzFdLGdbM11bMl0sZ1szXVszXSxnWzNdWzRdLGdbM11bNV0pfWMuY2xvc2VQYXRoKCk7Yy5maWxsKCk7Yy5yZXN0b3JlKCl9fWMucmVzdG9yZSgpfTtiLmpxcGxvdC5CZXppZXJDdXJ2ZVJlbmRlcmVyLnByb3RvdHlwZS5kcmF3U2hhZG93PWZ1bmN0aW9uKGMsZSxkKXt9O2IuanFwbG90LkJlemllckF4aXNSZW5kZXJlcj1mdW5jdGlvbigpe2IuanFwbG90LkxpbmVhckF4aXNSZW5kZXJlci5jYWxsKHRoaXMpfTtiLmpxcGxvdC5CZXppZXJBeGlzUmVuZGVyZXIucHJvdG90eXBlPW5ldyBiLmpxcGxvdC5MaW5lYXJBeGlzUmVuZGVyZXIoKTtiLmpxcGxvdC5CZXppZXJBeGlzUmVuZGVyZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yPWIuanFwbG90LkJlemllckF4aXNSZW5kZXJlcjtiLmpxcGxvdC5CZXppZXJBeGlzUmVuZGVyZXIucHJvdG90eXBlLmluaXQ9ZnVuY3Rpb24oZil7Yi5leHRlbmQodHJ1ZSx0aGlzLGYpO3ZhciBjPXRoaXMuX2RhdGFCb3VuZHM7Zm9yKHZhciBnPTA7Zzx0aGlzLl9zZXJpZXMubGVuZ3RoO2crKyl7dmFyIGg9dGhpcy5fc2VyaWVzW2ddO3ZhciBrPWguZGF0YTtpZihrLmxlbmd0aD09NCl7Zm9yKHZhciBlPTA7ZTxrLmxlbmd0aDtlKyspe2lmKHRoaXMubmFtZT09InhheGlzInx8dGhpcy5uYW1lPT0ieDJheGlzIil7aWYoa1tlXVswXTxjLm1pbnx8Yy5taW49PW51bGwpe2MubWluPWtbZV1bMF19aWYoa1tlXVswXT5jLm1heHx8Yy5tYXg9PW51bGwpe2MubWF4PWtbZV1bMF19fWVsc2V7aWYoa1tlXVsxXTxjLm1pbnx8Yy5taW49PW51bGwpe2MubWluPWtbZV1bMV19aWYoa1tlXVsxXT5jLm1heHx8Yy5tYXg9PW51bGwpe2MubWF4PWtbZV1bMV19fX19ZWxzZXtpZih0aGlzLm5hbWU9PSJ4YXhpcyJ8fHRoaXMubmFtZT09IngyYXhpcyIpe2lmKGtbMF1bMF08Yy5taW58fGMubWluPT1udWxsKXtjLm1pbj1rWzBdWzBdfWlmKGtbMF1bMF0+Yy5tYXh8fGMubWF4PT1udWxsKXtjLm1heD1rWzBdWzBdfWZvcih2YXIgZT0wO2U8NTtlKz0yKXtpZihrWzFdW2VdPGMubWlufHxjLm1pbj09bnVsbCl7Yy5taW49a1sxXVtlXX1pZihrWzFdW2VdPmMubWF4fHxjLm1heD09bnVsbCl7Yy5tYXg9a1sxXVtlXX19fWVsc2V7aWYoa1swXVsxXTxjLm1pbnx8Yy5taW49PW51bGwpe2MubWluPWtbMF1bMV19aWYoa1swXVsxXT5jLm1heHx8Yy5tYXg9PW51bGwpe2MubWF4PWtbMF1bMV19Zm9yKHZhciBlPTE7ZTw2O2UrPTIpe2lmKGtbMV1bZV08Yy5taW58fGMubWluPT1udWxsKXtjLm1pbj1rWzFdW2VdfWlmKGtbMV1bZV0+Yy5tYXh8fGMubWF4PT1udWxsKXtjLm1heD1rWzFdW2VdfX19fX19O2Z1bmN0aW9uIGEoZyxmLGQpe2Q9ZHx8e307ZC5heGVzRGVmYXVsdHM9Yi5leHRlbmQodHJ1ZSx7cGFkOjB9LGQuYXhlc0RlZmF1bHRzKTtkLmxlZ2VuZD1iLmV4dGVuZCh0cnVlLHtwbGFjZW1lbnQ6Im91dHNpZGUifSxkLmxlZ2VuZCk7dmFyIGM9ZmFsc2U7aWYoZC5zZXJpZXNEZWZhdWx0cy5yZW5kZXJlcj09Yi5qcXBsb3QuQmV6aWVyQ3VydmVSZW5kZXJlcil7Yz10cnVlfWVsc2V7aWYoZC5zZXJpZXMpe2Zvcih2YXIgZT0wO2U8ZC5zZXJpZXMubGVuZ3RoO2UrKyl7aWYoZC5zZXJpZXNbZV0ucmVuZGVyZXI9PWIuanFwbG90LkJlemllckN1cnZlUmVuZGVyZXIpe2M9dHJ1ZX19fX1pZihjKXtkLmF4ZXNEZWZhdWx0cy5yZW5kZXJlcj1iLmpxcGxvdC5CZXppZXJBeGlzUmVuZGVyZXJ9fWIuanFwbG90LnByZUluaXRIb29rcy5wdXNoKGEpfSkoalF1ZXJ5KTs=]]></data>
	</file>
	<file>
	  <filename>/src/plugins/jqplot.blockRenderer.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqCiAqIGpxUGxvdAogKiBQdXJlIEphdmFTY3JpcHQgcGxvdHRpbmcgcGx1Z2luIHVzaW5nIGpRdWVyeQogKgogKiBWZXJzaW9uOiAxLjAuMGIyX3IxMDEyCiAqCiAqIENvcHlyaWdodCAoYykgMjAwOS0yMDExIENocmlzIExlb25lbGxvCiAqIGpxUGxvdCBpcyBjdXJyZW50bHkgYXZhaWxhYmxlIGZvciB1c2UgaW4gYWxsIHBlcnNvbmFsIG9yIGNvbW1lcmNpYWwgcHJvamVjdHMgCiAqIHVuZGVyIGJvdGggdGhlIE1JVCAoaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHApIGFuZCBHUEwgCiAqIHZlcnNpb24gMi4wIChodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC5odG1sKSBsaWNlbnNlcy4gVGhpcyBtZWFucyB0aGF0IHlvdSBjYW4gCiAqIGNob29zZSB0aGUgbGljZW5zZSB0aGF0IGJlc3Qgc3VpdHMgeW91ciBwcm9qZWN0IGFuZCB1c2UgaXQgYWNjb3JkaW5nbHkuIAogKgogKiBBbHRob3VnaCBub3QgcmVxdWlyZWQsIHRoZSBhdXRob3Igd291bGQgYXBwcmVjaWF0ZSBhbiBlbWFpbCBsZXR0aW5nIGhpbSAKICoga25vdyBvZiBhbnkgc3Vic3RhbnRpYWwgdXNlIG9mIGpxUGxvdC4gIFlvdSBjYW4gcmVhY2ggdGhlIGF1dGhvciBhdDogCiAqIGNocmlzIGF0IGpxcGxvdCBkb3QgY29tIG9yIHNlZSBodHRwOi8vd3d3LmpxcGxvdC5jb20vaW5mby5waHAgLgogKgogKiBJZiB5b3UgYXJlIGZlZWxpbmcga2luZCBhbmQgZ2VuZXJvdXMsIGNvbnNpZGVyIHN1cHBvcnRpbmcgdGhlIHByb2plY3QgYnkKICogbWFraW5nIGEgZG9uYXRpb24gYXQ6IGh0dHA6Ly93d3cuanFwbG90LmNvbS9kb25hdGUucGhwIC4KICoKICogc3ByaW50ZiBmdW5jdGlvbnMgY29udGFpbmVkIGluIGpxcGxvdC5zcHJpbnRmLmpzIGJ5IEFzaCBTZWFybGU6CiAqCiAqICAgICB2ZXJzaW9uIDIwMDcuMDQuMjcKICogICAgIGF1dGhvciBBc2ggU2VhcmxlCiAqICAgICBodHRwOi8vaGV4bWVuLmNvbS9ibG9nLzIwMDcvMDMvcHJpbnRmLXNwcmludGYvCiAqICAgICBodHRwOi8vaGV4bWVuLmNvbS9qcy9zcHJpbnRmLmpzCiAqICAgICBUaGUgYXV0aG9yIChBc2ggU2VhcmxlKSBoYXMgcGxhY2VkIHRoaXMgY29kZSBpbiB0aGUgcHVibGljIGRvbWFpbjoKICogICAgICJUaGlzIGNvZGUgaXMgdW5yZXN0cmljdGVkOiB5b3UgYXJlIGZyZWUgdG8gdXNlIGl0IGhvd2V2ZXIgeW91IGxpa2UuIgogKiAKICovCihmdW5jdGlvbigkKSB7CiAgICAvKioKICAgICAqIENsYXNzOiAkLmpxcGxvdC5CbG9ja1JlbmRlcmVyCiAgICAgKiBQbHVnaW4gcmVuZGVyZXIgdG8gZHJhdyBhIHgteSBibG9jayBjaGFydC4gIEEgQmxvY2sgY2hhcnQgaGFzIGRhdGEgcG9pbnRzIGRpc3BsYXllZCBhcwogICAgICogY29sb3JlZCBzcXVhcmVzIHdpdGggYSB0ZXh0IGxhYmVsIGluc2lkZS4gIERhdGEgbXVzdCBiZSBzdXBwbGllZCBpbiB0aGUgZm9ybToKICAgICAqIAogICAgICogPiBbW3gxLCB5MSwgImxhYmVsIDEiLCB7Y3NzfV0sIFt4MiwgeTIsICJsYWJlbCAyIiwge2Nzc31dLCAuLi5dCiAgICAgKiAKICAgICAqIFRoZSBsYWJlbCBhbmQgY3NzIG9iamVjdCBhcmUgb3B0aW9uYWwuICBJZiB0aGUgbGFiZWwgaXMgb21taXR0ZWQsIHRoZQogICAgICogYm94IHdpbGwgY29sbGFwc2UgdW5sZXNzIGEgY3NzIGhlaWdodCBhbmQvb3Igd2lkdGggaXMgc3BlY2lmaWVkLgogICAgICogCiAgICAgKiBUaGUgY3NzIG9iamVjdCBpcyBhbiBvYmplY3Qgc3BlY2lmeWluZyBjc3MgcHJvcGVydGllcyAKICAgICAqIHN1Y2ggYXM6CiAgICAgKiAKICAgICAqID4ge2JhY2tncm91bmQ6JyM0Zjk4YTUnLCBib3JkZXI6JzNweCBzb2xpZCBncmF5JywgcGFkZGluZzonMXB4J30KICAgICAqIAogICAgICogTm90ZSB0aGF0IGNzcyBwcm9wZXJ0aWVzIHNwZWNpZmllZCB3aXRoIHRoZSBkYXRhIHBvaW50IG92ZXJyaWRlIGRlZmF1bHRzCiAgICAgKiBzcGVjaWZpZWQgd2l0aCB0aGUgc2VyaWVzLgogICAgICogCiAgICAgKi8KICAgICQuanFwbG90LkJsb2NrUmVuZGVyZXIgPSBmdW5jdGlvbigpewogICAgICAgICQuanFwbG90LkxpbmVSZW5kZXJlci5jYWxsKHRoaXMpOwogICAgfTsKICAgIAogICAgJC5qcXBsb3QuQmxvY2tSZW5kZXJlci5wcm90b3R5cGUgPSBuZXcgJC5qcXBsb3QuTGluZVJlbmRlcmVyKCk7CiAgICAkLmpxcGxvdC5CbG9ja1JlbmRlcmVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9ICQuanFwbG90LkJsb2NrUmVuZGVyZXI7CiAgICAKICAgIC8vIGNhbGxlZCB3aXRoIHNjb3BlIG9mIGEgc2VyaWVzCiAgICAkLmpxcGxvdC5CbG9ja1JlbmRlcmVyLnByb3RvdHlwZS5pbml0ID0gZnVuY3Rpb24ob3B0aW9ucykgewogICAgICAgIC8vIEdyb3VwOiBQcm9wZXJ0aWVzCiAgICAgICAgLy8KICAgICAgICAvLyBwcm9wOiBjc3MKICAgICAgICAvLyBkZWZhdWx0IGNzcyBzdHlsZXMgdGhhdCB3aWxsIGJlIGFwcGxpZWQgdG8gYWxsIGRhdGEgYmxvY2tzLgogICAgICAgIC8vIHRoZXNlIHZhbHVlcyB3aWxsIGJlIG92ZXJyaWRkZW4gYnkgY3NzIHN0eWxlcyBzdXBwbGllZCB3aXRoIHRoZQogICAgICAgIC8vIGluZGl2aWR1bGFsIGRhdGEgcG9pbnRzLgogICAgICAgIHRoaXMuY3NzID0ge3BhZGRpbmc6JzJweCcsIGJvcmRlcjonMXB4IHNvbGlkICM5OTknLCB0ZXh0QWxpZ246J2NlbnRlcid9OwogICAgICAgIC8vIHByb3A6IGVzY2FwZUh0bWwKICAgICAgICAvLyB0cnVlIHRvIGVzY2FwZSBodG1sIGluIHRoZSBib3ggbGFiZWwuCiAgICAgICAgdGhpcy5lc2NhcGVIdG1sID0gZmFsc2U7CiAgICAgICAgLy8gcHJvcDogaW5zZXJ0QnJlYWtzCiAgICAgICAgLy8gdHJ1ZSB0byB0dXJuIHNwYWNlcyBpbiBkYXRhIGJsb2NrIGxhYmVsIGludG8gaHRtbCBicmVha3MgPGJyIC8+LgogICAgICAgIHRoaXMuaW5zZXJ0QnJlYWtzID0gdHJ1ZTsKICAgICAgICAvLyBwcm9wOiB2YXJ5QmxvY2tDb2xvcnMKICAgICAgICAvLyB0cnVlIHRvIHZhcnkgdGhlIGNvbG9yIG9mIGVhY2ggYmxvY2sgaW4gdGhpcyBzZXJpZXMgYWNjb3JkaW5nIHRvCiAgICAgICAgLy8gdGhlIHNlcmllc0NvbG9ycyBhcnJheS4gIEZhbHNlIHRvIHNldCBlYWNoIGJsb2NrIHRvIHRoZSBjb2xvcgogICAgICAgIC8vIHNwZWNpZmllZCBvbiB0aGlzIHNlcmllcy4gIFRoaXMgaGFzIG5vIGVmZmVjdCBpZiBhIGNzcyBiYWNrZ3JvdW5kIGNvbG9yCiAgICAgICAgLy8gb3B0aW9uIGlzIHNwZWNpZmllZCBpbiB0aGUgcmVuZGVyZXIgY3NzIG9wdGlvbnMuCiAgICAgICAgdGhpcy52YXJ5QmxvY2tDb2xvcnMgPSBmYWxzZTsKICAgICAgICAkLmV4dGVuZCh0cnVlLCB0aGlzLCBvcHRpb25zKTsKICAgICAgICBpZiAodGhpcy5jc3MuYmFja2dyb3VuZENvbG9yKSB7CiAgICAgICAgICAgIHRoaXMuY29sb3IgPSB0aGlzLmNzcy5iYWNrZ3JvdW5kQ29sb3I7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHRoaXMuY3NzLmJhY2tncm91bmQpIHsKICAgICAgICAgICAgdGhpcy5jb2xvciA9IHRoaXMuY3NzLmJhY2tncm91bmQ7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKCF0aGlzLnZhcnlCbG9ja0NvbG9ycykgewogICAgICAgICAgICB0aGlzLmNzcy5iYWNrZ3JvdW5kID0gdGhpcy5jb2xvcjsKICAgICAgICB9CiAgICAgICAgdGhpcy5jYW52YXMgPSBuZXcgJC5qcXBsb3QuQmxvY2tDYW52YXMoKTsKICAgICAgICB0aGlzLnNoYWRvd0NhbnZhcyA9ICBuZXcgJC5qcXBsb3QuQmxvY2tDYW52YXMoKTsKICAgICAgICB0aGlzLmNhbnZhcy5fcGxvdERpbWVuc2lvbnMgPSB0aGlzLl9wbG90RGltZW5zaW9uczsKICAgICAgICB0aGlzLnNoYWRvd0NhbnZhcy5fcGxvdERpbWVuc2lvbnMgPSB0aGlzLl9wbG90RGltZW5zaW9uczsKICAgICAgICB0aGlzLl90eXBlID0gJ2Jsb2NrJzsKICAgICAgICAKICAgICAgICAvLyBncm91cDogTWV0aG9kcyAKICAgICAgICAvLwogICAgICAgIC8vIE1ldGhvZDogbW92ZUJsb2NrCiAgICAgICAgLy8gTW92ZXMgYW4gaW5kaXZpZHVhbCBibG9jay4gIE1vcmUgZWZmaWNpZW50IHRoYW4gcmVkcmF3aW5nCiAgICAgICAgLy8gdGhlIHdob2xlIHNlcmllcyBieSBjYWxsaW5nIHBsb3QuZHJhd1NlcmllcygpLgogICAgICAgIC8vIFByb3BlcnRpZXM6CiAgICAgICAgLy8gaWR4IC0gdGhlIDAgYmFzZWQgaW5kZXggb2YgdGhlIGJsb2NrIG9yIHBvaW50IGluIHRoaXMgc2VyaWVzLgogICAgICAgIC8vIHggLSB0aGUgeCBjb29yZGluYXRlIGluIGRhdGEgdW5pdHMgKHZhbHVlIG9uIHggYXhpcykgdG8gbW92ZSB0aGUgYmxvY2sgdG8uCiAgICAgICAgLy8geSAtIHRoZSB5IGNvb3JkaW5hdGUgaW4gZGF0YSB1bml0cyAodmFsdWUgb24gdGhlIHkgYXhpcykgdG8gbW92ZSB0aGUgYmxvY2sgdG8uCiAgICAgICAgLy8gZHVyYXRpb24gLSBvcHRpb25hbCBwYXJhbWV0ZXIgdG8gY3JlYXRlIGFuIGFuaW1hdGVkIG1vdmVtZW50LiAgQ2FuIGJlIGEKICAgICAgICAvLyBudW1iZXIgKGhpZ2hlciBpcyBzbG93ZXIgYW5pbWF0aW9uKSBvciAnZmFzdCcsICdub3JtYWwnIG9yICdzbG93Jy4gIElmIG5vdAogICAgICAgIC8vIHByb3ZpZGVkLCB0aGUgZWxlbWVudCBpcyBtb3ZlZCB3aXRob3V0IGFueSBhbmltYXRpb24uCiAgICAgICAgdGhpcy5tb3ZlQmxvY2sgPSBmdW5jdGlvbiAoaWR4LCB4LCB5LCBkdXJhdGlvbikgewogICAgICAgICAgICAvLyB1cGRhdGUgcGxvdERhdGEsIHN0YWNrRGF0YSwgZGF0YSBhbmQgZ3JpZERhdGEKICAgICAgICAgICAgLy8geCBhbmQgeSBhcmUgaW4gZGF0YSBjb29yZGluYXRlcy4KICAgICAgICAgICAgdmFyIGVsID0gdGhpcy5jYW52YXMuX2VsZW0uY2hpbGRyZW4oJzplcSgnK2lkeCsnKScpOwogICAgICAgICAgICB0aGlzLmRhdGFbaWR4XVswXSA9IHg7CiAgICAgICAgICAgIHRoaXMuZGF0YVtpZHhdWzFdID0geTsKICAgICAgICAgICAgdGhpcy5fcGxvdERhdGFbaWR4XVswXSA9IHg7CiAgICAgICAgICAgIHRoaXMuX3Bsb3REYXRhW2lkeF1bMV0gPSB5OwogICAgICAgICAgICB0aGlzLl9zdGFja0RhdGFbaWR4XVswXSA9IHg7CiAgICAgICAgICAgIHRoaXMuX3N0YWNrRGF0YVtpZHhdWzFdID0geTsKICAgICAgICAgICAgdGhpcy5ncmlkRGF0YVtpZHhdWzBdID0gdGhpcy5feGF4aXMuc2VyaWVzX3UycCh4KTsKICAgICAgICAgICAgdGhpcy5ncmlkRGF0YVtpZHhdWzFdID0gdGhpcy5feWF4aXMuc2VyaWVzX3UycCh5KTsKICAgICAgICAgICAgdmFyIHcgPSBlbC5vdXRlcldpZHRoKCk7CiAgICAgICAgICAgIHZhciBoID0gZWwub3V0ZXJIZWlnaHQoKTsKICAgICAgICAgICAgdmFyIGxlZnQgPSB0aGlzLmdyaWREYXRhW2lkeF1bMF0gLSB3LzIgKyAncHgnOwogICAgICAgICAgICB2YXIgdG9wID0gdGhpcy5ncmlkRGF0YVtpZHhdWzFdIC0gaC8yICsgJ3B4JzsKICAgICAgICAgICAgaWYgKGR1cmF0aW9uKSB7CiAgICAgICAgICAgICAgICBpZiAocGFyc2VJbnQoZHVyYXRpb24sIDEwKSkgewogICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uID0gcGFyc2VJbnQoZHVyYXRpb24sIDEwKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsLmFuaW1hdGUoe2xlZnQ6bGVmdCwgdG9wOnRvcH0sIGR1cmF0aW9uKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGVsLmNzcyh7bGVmdDpsZWZ0LCB0b3A6dG9wfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWwgPSBudWxsOwogICAgICAgIH07CiAgICB9OwogICAgCiAgICAvLyBjYWxsZWQgd2l0aCBzY29wZSBvZiBzZXJpZXMKICAgICQuanFwbG90LkJsb2NrUmVuZGVyZXIucHJvdG90eXBlLmRyYXcgPSBmdW5jdGlvbiAoY3R4LCBnZCwgb3B0aW9ucykgewogICAgICAgIGlmICh0aGlzLnBsdWdpbnMucG9pbnRMYWJlbHMpIHsKICAgICAgICAgICAgdGhpcy5wbHVnaW5zLnBvaW50TGFiZWxzLnNob3cgPSBmYWxzZTsKICAgICAgICB9CiAgICAgICAgdmFyIGksIGVsLCBkLCBnZCwgdCwgY3NzLCB3LCBoLCBsZWZ0LCB0b3A7CiAgICAgICAgdmFyIG9wdHMgPSAob3B0aW9ucyAhPSB1bmRlZmluZWQpID8gb3B0aW9ucyA6IHt9OwogICAgICAgIHZhciBjb2xvckdlbmVyYXRvciA9IG5ldyAkLmpxcGxvdC5Db2xvckdlbmVyYXRvcih0aGlzLnNlcmllc0NvbG9ycyk7CiAgICAgICAgdGhpcy5jYW52YXMuX2VsZW0uZW1wdHkoKTsKICAgICAgICBmb3IgKGk9MDsgaTx0aGlzLmdyaWREYXRhLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIGQgPSB0aGlzLmRhdGFbaV07CiAgICAgICAgICAgIGdkID0gdGhpcy5ncmlkRGF0YVtpXTsKICAgICAgICAgICAgdCA9ICcnOwogICAgICAgICAgICBjc3MgPSB7fTsKICAgICAgICAgICAgaWYgKHR5cGVvZiBkWzJdID09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgICAgICB0ID0gZFsyXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YgZFsyXSA9PSAnb2JqZWN0JykgewogICAgICAgICAgICAgICAgY3NzID0gZFsyXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodHlwZW9mIGRbM10gPT0gICdvYmplY3QnKSB7CiAgICAgICAgICAgICAgICBjc3MgPSBkWzNdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0aGlzLmluc2VydEJyZWFrcyl7IAogICAgICAgICAgICAgICAgdCA9IHQucmVwbGFjZSgvIC9nLCAnPGJyIC8+Jyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY3NzID0gJC5leHRlbmQodHJ1ZSwge30sIHRoaXMuY3NzLCBjc3MpOwogICAgICAgICAgICAvLyBjcmVhdGUgYSBkaXYKICAgICAgICAgICAgZWwgPSAkKCc8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTttYXJnaW4tbGVmdDphdXRvO21hcmdpbi1yaWdodDphdXRvOyI+PC9kaXY+Jyk7CiAgICAgICAgICAgIHRoaXMuY2FudmFzLl9lbGVtLmFwcGVuZChlbCk7CiAgICAgICAgICAgIC8vIHNldCB0ZXh0CiAgICAgICAgICAgIHRoaXMuZXNjYXBlSHRtbCA/IGVsLnRleHQodCkgOiBlbC5odG1sKHQpOwogICAgICAgICAgICAvLyBzdHlsZSBpdAogICAgICAgICAgICAvLyByZW1vdmUgc3R5bGVzIHdlIGRvbid0IHdhbnQgb3ZlcnJpZGRlbi4KICAgICAgICAgICAgZGVsZXRlIGNzcy5wb3NpdGlvbjsKICAgICAgICAgICAgZGVsZXRlIGNzcy5tYXJnaW5SaWdodDsKICAgICAgICAgICAgZGVsZXRlIGNzcy5tYXJnaW5MZWZ0OwogICAgICAgICAgICBpZiAoIWNzcy5iYWNrZ3JvdW5kICYmICFjc3MuYmFja2dyb3VuZENvbG9yICYmICFjc3MuYmFja2dyb3VuZEltYWdlKXsgCiAgICAgICAgICAgICAgICBjc3MuYmFja2dyb3VuZCA9IGNvbG9yR2VuZXJhdG9yLm5leHQoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbC5jc3MoY3NzKTsKICAgICAgICAgICAgdyA9IGVsLm91dGVyV2lkdGgoKTsKICAgICAgICAgICAgaCA9IGVsLm91dGVySGVpZ2h0KCk7CiAgICAgICAgICAgIGxlZnQgPSBnZFswXSAtIHcvMiArICdweCc7CiAgICAgICAgICAgIHRvcCA9IGdkWzFdIC0gaC8yICsgJ3B4JzsKICAgICAgICAgICAgZWwuY3NzKHtsZWZ0OmxlZnQsIHRvcDp0b3B9KTsKICAgICAgICAgICAgZWwgPSBudWxsOwogICAgICAgIH0KICAgIH07CiAgICAKICAgICQuanFwbG90LkJsb2NrQ2FudmFzID0gZnVuY3Rpb24oKSB7CiAgICAgICAgJC5qcXBsb3QuRWxlbUNvbnRhaW5lci5jYWxsKHRoaXMpOwogICAgICAgIHRoaXMuX2N0eDsgIAogICAgfTsKICAgIAogICAgJC5qcXBsb3QuQmxvY2tDYW52YXMucHJvdG90eXBlID0gbmV3ICQuanFwbG90LkVsZW1Db250YWluZXIoKTsKICAgICQuanFwbG90LkJsb2NrQ2FudmFzLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9ICQuanFwbG90LkJsb2NrQ2FudmFzOwogICAgCiAgICAkLmpxcGxvdC5CbG9ja0NhbnZhcy5wcm90b3R5cGUuY3JlYXRlRWxlbWVudCA9IGZ1bmN0aW9uKG9mZnNldHMsIGNsc3MsIHBsb3REaW1lbnNpb25zKSB7CiAgICAgICAgdGhpcy5fb2Zmc2V0cyA9IG9mZnNldHM7CiAgICAgICAgdmFyIGtsYXNzID0gJ2pxcGxvdC1ibG9ja0NhbnZhcyc7CiAgICAgICAgaWYgKGNsc3MgIT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgIGtsYXNzID0gY2xzczsKICAgICAgICB9CiAgICAgICAgdmFyIGVsZW07CiAgICAgICAgLy8gaWYgdGhpcyBjYW52YXMgYWxyZWFkeSBoYXMgYSBkb20gZWxlbWVudCwgZG9uJ3QgbWFrZSBhIG5ldyBvbmUuCiAgICAgICAgaWYgKHRoaXMuX2VsZW0pIHsKICAgICAgICAgICAgZWxlbSA9IHRoaXMuX2VsZW0uZ2V0KDApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgZWxlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgICAgIH0KICAgICAgICAvLyBpZiBuZXcgcGxvdERpbWVuc2lvbnMgc3VwcGxpZWQsIHVzZSB0aGVtLgogICAgICAgIGlmIChwbG90RGltZW5zaW9ucyAhPSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgdGhpcy5fcGxvdERpbWVuc2lvbnMgPSBwbG90RGltZW5zaW9uczsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgdmFyIHcgPSB0aGlzLl9wbG90RGltZW5zaW9ucy53aWR0aCAtIHRoaXMuX29mZnNldHMubGVmdCAtIHRoaXMuX29mZnNldHMucmlnaHQgKyAncHgnOwogICAgICAgIHZhciBoID0gdGhpcy5fcGxvdERpbWVuc2lvbnMuaGVpZ2h0IC0gdGhpcy5fb2Zmc2V0cy50b3AgLSB0aGlzLl9vZmZzZXRzLmJvdHRvbSArICdweCc7CiAgICAgICAgdGhpcy5fZWxlbSA9ICQoZWxlbSk7CiAgICAgICAgdGhpcy5fZWxlbS5jc3MoeyBwb3NpdGlvbjogJ2Fic29sdXRlJywgd2lkdGg6dywgaGVpZ2h0OmgsIGxlZnQ6IHRoaXMuX29mZnNldHMubGVmdCwgdG9wOiB0aGlzLl9vZmZzZXRzLnRvcCB9KTsKICAgICAgICAKICAgICAgICB0aGlzLl9lbGVtLmFkZENsYXNzKGtsYXNzKTsKICAgICAgICByZXR1cm4gdGhpcy5fZWxlbTsKICAgIH07CiAgICAKICAgICQuanFwbG90LkJsb2NrQ2FudmFzLnByb3RvdHlwZS5zZXRDb250ZXh0ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5fY3R4ID0gewogICAgICAgICAgICBjYW52YXM6ewogICAgICAgICAgICAgICAgd2lkdGg6MCwKICAgICAgICAgICAgICAgIGhlaWdodDowCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGNsZWFyUmVjdDpmdW5jdGlvbigpe3JldHVybiBudWxsO30KICAgICAgICB9OwogICAgICAgIHJldHVybiB0aGlzLl9jdHg7CiAgICB9OwogICAgCn0pKGpRdWVyeSk7CiAgICAKICAgIA==]]></data>
	</file>
	<file>
	  <filename>/src/plugins/jqplot.blockRenderer.min.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqCiAqIGpxUGxvdAogKiBQdXJlIEphdmFTY3JpcHQgcGxvdHRpbmcgcGx1Z2luIHVzaW5nIGpRdWVyeQogKgogKiBWZXJzaW9uOiAxLjAuMGIyX3IxMDEyCiAqCiAqIENvcHlyaWdodCAoYykgMjAwOS0yMDExIENocmlzIExlb25lbGxvCiAqIGpxUGxvdCBpcyBjdXJyZW50bHkgYXZhaWxhYmxlIGZvciB1c2UgaW4gYWxsIHBlcnNvbmFsIG9yIGNvbW1lcmNpYWwgcHJvamVjdHMgCiAqIHVuZGVyIGJvdGggdGhlIE1JVCAoaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHApIGFuZCBHUEwgCiAqIHZlcnNpb24gMi4wIChodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC5odG1sKSBsaWNlbnNlcy4gVGhpcyBtZWFucyB0aGF0IHlvdSBjYW4gCiAqIGNob29zZSB0aGUgbGljZW5zZSB0aGF0IGJlc3Qgc3VpdHMgeW91ciBwcm9qZWN0IGFuZCB1c2UgaXQgYWNjb3JkaW5nbHkuIAogKgogKiBBbHRob3VnaCBub3QgcmVxdWlyZWQsIHRoZSBhdXRob3Igd291bGQgYXBwcmVjaWF0ZSBhbiBlbWFpbCBsZXR0aW5nIGhpbSAKICoga25vdyBvZiBhbnkgc3Vic3RhbnRpYWwgdXNlIG9mIGpxUGxvdC4gIFlvdSBjYW4gcmVhY2ggdGhlIGF1dGhvciBhdDogCiAqIGNocmlzIGF0IGpxcGxvdCBkb3QgY29tIG9yIHNlZSBodHRwOi8vd3d3LmpxcGxvdC5jb20vaW5mby5waHAgLgogKgogKiBJZiB5b3UgYXJlIGZlZWxpbmcga2luZCBhbmQgZ2VuZXJvdXMsIGNvbnNpZGVyIHN1cHBvcnRpbmcgdGhlIHByb2plY3QgYnkKICogbWFraW5nIGEgZG9uYXRpb24gYXQ6IGh0dHA6Ly93d3cuanFwbG90LmNvbS9kb25hdGUucGhwIC4KICoKICogc3ByaW50ZiBmdW5jdGlvbnMgY29udGFpbmVkIGluIGpxcGxvdC5zcHJpbnRmLmpzIGJ5IEFzaCBTZWFybGU6CiAqCiAqICAgICB2ZXJzaW9uIDIwMDcuMDQuMjcKICogICAgIGF1dGhvciBBc2ggU2VhcmxlCiAqICAgICBodHRwOi8vaGV4bWVuLmNvbS9ibG9nLzIwMDcvMDMvcHJpbnRmLXNwcmludGYvCiAqICAgICBodHRwOi8vaGV4bWVuLmNvbS9qcy9zcHJpbnRmLmpzCiAqICAgICBUaGUgYXV0aG9yIChBc2ggU2VhcmxlKSBoYXMgcGxhY2VkIHRoaXMgY29kZSBpbiB0aGUgcHVibGljIGRvbWFpbjoKICogICAgICJUaGlzIGNvZGUgaXMgdW5yZXN0cmljdGVkOiB5b3UgYXJlIGZyZWUgdG8gdXNlIGl0IGhvd2V2ZXIgeW91IGxpa2UuIgogKgogKiBpbmNsdWRlZCBqc0RhdGUgbGlicmFyeSBieSBDaHJpcyBMZW9uZWxsbzoKICoKICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEgQ2hyaXMgTGVvbmVsbG8KICoKICoganNEYXRlIGlzIGN1cnJlbnRseSBhdmFpbGFibGUgZm9yIHVzZSBpbiBhbGwgcGVyc29uYWwgb3IgY29tbWVyY2lhbCBwcm9qZWN0cyAKICogdW5kZXIgYm90aCB0aGUgTUlUIGFuZCBHUEwgdmVyc2lvbiAyLjAgbGljZW5zZXMuIFRoaXMgbWVhbnMgdGhhdCB5b3UgY2FuIAogKiBjaG9vc2UgdGhlIGxpY2Vuc2UgdGhhdCBiZXN0IHN1aXRzIHlvdXIgcHJvamVjdCBhbmQgdXNlIGl0IGFjY29yZGluZ2x5LgogKgogKiBqc0RhdGUgYm9ycm93cyBtYW55IGNvbmNlcHRzIGFuZCBpZGVhcyBmcm9tIHRoZSBEYXRlIEluc3RhbmNlIAogKiBNZXRob2RzIGJ5IEtlbiBTbnlkZXIgYWxvbmcgd2l0aCBzb21lIHBhcnRzIG9mIEtlbidzIGFjdHVhbCBjb2RlLgogKiAKICogS2VuJ3Mgb3JpZ2lhbmwgRGF0ZSBJbnN0YW5jZSBNZXRob2RzIGFuZCBjb3B5cmlnaHQgbm90aWNlOgogKiAKICogS2VuIFNueWRlciAoa2VuIGQgc255ZGVyIGF0IGdtYWlsIGRvdCBjb20pCiAqIDIwMDgtMDktMTAKICogdmVyc2lvbiAyLjAuMiAoaHR0cDovL2tlbmRzbnlkZXIuY29tL3NhbmRib3gvZGF0ZS8pICAgICAKICogQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbiBMaWNlbnNlIDMuMCAoaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnkvMy4wLykKICoKICoganFwbG90VG9JbWFnZSBmdW5jdGlvbiBiYXNlZCBvbiBMYXJyeSBTaWRlbidzIGV4cG9ydC1qcXBsb3QtdG8tcG5nLmpzLgogKiBMYXJyeSBoYXMgZ2VuZXJvdXNseSBnaXZlbiBwZXJtaXNzaW9uIHRvIGFkYXB0IGhpcyBjb2RlIGZvciBpbmNsdXNpb24KICogaW50byBqcVBsb3QuCiAqCiAqIExhcnJ5J3Mgb3JpZ2luYWwgY29kZSBjYW4gYmUgZm91bmQgaGVyZToKICoKICogaHR0cHM6Ly9naXRodWIuY29tL2xzaWRlbi9leHBvcnQtanFwbG90LXRvLXBuZwogKiAKICogCiAqLwooZnVuY3Rpb24oYSl7YS5qcXBsb3QuQmxvY2tSZW5kZXJlcj1mdW5jdGlvbigpe2EuanFwbG90LkxpbmVSZW5kZXJlci5jYWxsKHRoaXMpfTthLmpxcGxvdC5CbG9ja1JlbmRlcmVyLnByb3RvdHlwZT1uZXcgYS5qcXBsb3QuTGluZVJlbmRlcmVyKCk7YS5qcXBsb3QuQmxvY2tSZW5kZXJlci5wcm90b3R5cGUuY29uc3RydWN0b3I9YS5qcXBsb3QuQmxvY2tSZW5kZXJlcjthLmpxcGxvdC5CbG9ja1JlbmRlcmVyLnByb3RvdHlwZS5pbml0PWZ1bmN0aW9uKGIpe3RoaXMuY3NzPXtwYWRkaW5nOiIycHgiLGJvcmRlcjoiMXB4IHNvbGlkICM5OTkiLHRleHRBbGlnbjoiY2VudGVyIn07dGhpcy5lc2NhcGVIdG1sPWZhbHNlO3RoaXMuaW5zZXJ0QnJlYWtzPXRydWU7dGhpcy52YXJ5QmxvY2tDb2xvcnM9ZmFsc2U7YS5leHRlbmQodHJ1ZSx0aGlzLGIpO2lmKHRoaXMuY3NzLmJhY2tncm91bmRDb2xvcil7dGhpcy5jb2xvcj10aGlzLmNzcy5iYWNrZ3JvdW5kQ29sb3J9ZWxzZXtpZih0aGlzLmNzcy5iYWNrZ3JvdW5kKXt0aGlzLmNvbG9yPXRoaXMuY3NzLmJhY2tncm91bmR9ZWxzZXtpZighdGhpcy52YXJ5QmxvY2tDb2xvcnMpe3RoaXMuY3NzLmJhY2tncm91bmQ9dGhpcy5jb2xvcn19fXRoaXMuY2FudmFzPW5ldyBhLmpxcGxvdC5CbG9ja0NhbnZhcygpO3RoaXMuc2hhZG93Q2FudmFzPW5ldyBhLmpxcGxvdC5CbG9ja0NhbnZhcygpO3RoaXMuY2FudmFzLl9wbG90RGltZW5zaW9ucz10aGlzLl9wbG90RGltZW5zaW9uczt0aGlzLnNoYWRvd0NhbnZhcy5fcGxvdERpbWVuc2lvbnM9dGhpcy5fcGxvdERpbWVuc2lvbnM7dGhpcy5fdHlwZT0iYmxvY2siO3RoaXMubW92ZUJsb2NrPWZ1bmN0aW9uKGwsaixpLGUpe3ZhciBjPXRoaXMuY2FudmFzLl9lbGVtLmNoaWxkcmVuKCI6ZXEoIitsKyIpIik7dGhpcy5kYXRhW2xdWzBdPWo7dGhpcy5kYXRhW2xdWzFdPWk7dGhpcy5fcGxvdERhdGFbbF1bMF09ajt0aGlzLl9wbG90RGF0YVtsXVsxXT1pO3RoaXMuX3N0YWNrRGF0YVtsXVswXT1qO3RoaXMuX3N0YWNrRGF0YVtsXVsxXT1pO3RoaXMuZ3JpZERhdGFbbF1bMF09dGhpcy5feGF4aXMuc2VyaWVzX3UycChqKTt0aGlzLmdyaWREYXRhW2xdWzFdPXRoaXMuX3lheGlzLnNlcmllc191MnAoaSk7dmFyIGs9Yy5vdXRlcldpZHRoKCk7dmFyIGY9Yy5vdXRlckhlaWdodCgpO3ZhciBkPXRoaXMuZ3JpZERhdGFbbF1bMF0tay8yKyJweCI7dmFyIGc9dGhpcy5ncmlkRGF0YVtsXVsxXS1mLzIrInB4IjtpZihlKXtpZihwYXJzZUludChlLDEwKSl7ZT1wYXJzZUludChlLDEwKX1jLmFuaW1hdGUoe2xlZnQ6ZCx0b3A6Z30sZSl9ZWxzZXtjLmNzcyh7bGVmdDpkLHRvcDpnfSl9Yz1udWxsfX07YS5qcXBsb3QuQmxvY2tSZW5kZXJlci5wcm90b3R5cGUuZHJhdz1mdW5jdGlvbihxLG8scil7aWYodGhpcy5wbHVnaW5zLnBvaW50TGFiZWxzKXt0aGlzLnBsdWdpbnMucG9pbnRMYWJlbHMuc2hvdz1mYWxzZX12YXIgZixjLGwsbyxwLGssbixnLGUsbTt2YXIgYj0ociE9dW5kZWZpbmVkKT9yOnt9O3ZhciBqPW5ldyBhLmpxcGxvdC5Db2xvckdlbmVyYXRvcih0aGlzLnNlcmllc0NvbG9ycyk7dGhpcy5jYW52YXMuX2VsZW0uZW1wdHkoKTtmb3IoZj0wO2Y8dGhpcy5ncmlkRGF0YS5sZW5ndGg7ZisrKXtsPXRoaXMuZGF0YVtmXTtvPXRoaXMuZ3JpZERhdGFbZl07cD0iIjtrPXt9O2lmKHR5cGVvZiBsWzJdPT0ic3RyaW5nIil7cD1sWzJdfWVsc2V7aWYodHlwZW9mIGxbMl09PSJvYmplY3QiKXtrPWxbMl19fWlmKHR5cGVvZiBsWzNdPT0ib2JqZWN0Iil7az1sWzNdfWlmKHRoaXMuaW5zZXJ0QnJlYWtzKXtwPXAucmVwbGFjZSgvIC9nLCI8YnIgLz4iKX1rPWEuZXh0ZW5kKHRydWUse30sdGhpcy5jc3Msayk7Yz1hKCc8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTttYXJnaW4tbGVmdDphdXRvO21hcmdpbi1yaWdodDphdXRvOyI+PC9kaXY+Jyk7dGhpcy5jYW52YXMuX2VsZW0uYXBwZW5kKGMpO3RoaXMuZXNjYXBlSHRtbD9jLnRleHQocCk6Yy5odG1sKHApO2RlbGV0ZSBrLnBvc2l0aW9uO2RlbGV0ZSBrLm1hcmdpblJpZ2h0O2RlbGV0ZSBrLm1hcmdpbkxlZnQ7aWYoIWsuYmFja2dyb3VuZCYmIWsuYmFja2dyb3VuZENvbG9yJiYhay5iYWNrZ3JvdW5kSW1hZ2Upe2suYmFja2dyb3VuZD1qLm5leHQoKX1jLmNzcyhrKTtuPWMub3V0ZXJXaWR0aCgpO2c9Yy5vdXRlckhlaWdodCgpO2U9b1swXS1uLzIrInB4IjttPW9bMV0tZy8yKyJweCI7Yy5jc3Moe2xlZnQ6ZSx0b3A6bX0pO2M9bnVsbH19O2EuanFwbG90LkJsb2NrQ2FudmFzPWZ1bmN0aW9uKCl7YS5qcXBsb3QuRWxlbUNvbnRhaW5lci5jYWxsKHRoaXMpO3RoaXMuX2N0eH07YS5qcXBsb3QuQmxvY2tDYW52YXMucHJvdG90eXBlPW5ldyBhLmpxcGxvdC5FbGVtQ29udGFpbmVyKCk7YS5qcXBsb3QuQmxvY2tDYW52YXMucHJvdG90eXBlLmNvbnN0cnVjdG9yPWEuanFwbG90LkJsb2NrQ2FudmFzO2EuanFwbG90LkJsb2NrQ2FudmFzLnByb3RvdHlwZS5jcmVhdGVFbGVtZW50PWZ1bmN0aW9uKGksZSxjKXt0aGlzLl9vZmZzZXRzPWk7dmFyIGI9ImpxcGxvdC1ibG9ja0NhbnZhcyI7aWYoZSE9dW5kZWZpbmVkKXtiPWV9dmFyIGc7aWYodGhpcy5fZWxlbSl7Zz10aGlzLl9lbGVtLmdldCgwKX1lbHNle2c9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iil9aWYoYyE9dW5kZWZpbmVkKXt0aGlzLl9wbG90RGltZW5zaW9ucz1jfXZhciBkPXRoaXMuX3Bsb3REaW1lbnNpb25zLndpZHRoLXRoaXMuX29mZnNldHMubGVmdC10aGlzLl9vZmZzZXRzLnJpZ2h0KyJweCI7dmFyIGY9dGhpcy5fcGxvdERpbWVuc2lvbnMuaGVpZ2h0LXRoaXMuX29mZnNldHMudG9wLXRoaXMuX29mZnNldHMuYm90dG9tKyJweCI7dGhpcy5fZWxlbT1hKGcpO3RoaXMuX2VsZW0uY3NzKHtwb3NpdGlvbjoiYWJzb2x1dGUiLHdpZHRoOmQsaGVpZ2h0OmYsbGVmdDp0aGlzLl9vZmZzZXRzLmxlZnQsdG9wOnRoaXMuX29mZnNldHMudG9wfSk7dGhpcy5fZWxlbS5hZGRDbGFzcyhiKTtyZXR1cm4gdGhpcy5fZWxlbX07YS5qcXBsb3QuQmxvY2tDYW52YXMucHJvdG90eXBlLnNldENvbnRleHQ9ZnVuY3Rpb24oKXt0aGlzLl9jdHg9e2NhbnZhczp7d2lkdGg6MCxoZWlnaHQ6MH0sY2xlYXJSZWN0OmZ1bmN0aW9uKCl7cmV0dXJuIG51bGx9fTtyZXR1cm4gdGhpcy5fY3R4fX0pKGpRdWVyeSk7]]></data>
	</file>
	<file>
	  <filename>/src/plugins/jqplot.bubbleRenderer.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqCiAqIGpxUGxvdAogKiBQdXJlIEphdmFTY3JpcHQgcGxvdHRpbmcgcGx1Z2luIHVzaW5nIGpRdWVyeQogKgogKiBWZXJzaW9uOiAxLjAuMGIyX3IxMDEyCiAqCiAqIENvcHlyaWdodCAoYykgMjAwOS0yMDExIENocmlzIExlb25lbGxvCiAqIGpxUGxvdCBpcyBjdXJyZW50bHkgYXZhaWxhYmxlIGZvciB1c2UgaW4gYWxsIHBlcnNvbmFsIG9yIGNvbW1lcmNpYWwgcHJvamVjdHMgCiAqIHVuZGVyIGJvdGggdGhlIE1JVCAoaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHApIGFuZCBHUEwgCiAqIHZlcnNpb24gMi4wIChodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC5odG1sKSBsaWNlbnNlcy4gVGhpcyBtZWFucyB0aGF0IHlvdSBjYW4gCiAqIGNob29zZSB0aGUgbGljZW5zZSB0aGF0IGJlc3Qgc3VpdHMgeW91ciBwcm9qZWN0IGFuZCB1c2UgaXQgYWNjb3JkaW5nbHkuIAogKgogKiBBbHRob3VnaCBub3QgcmVxdWlyZWQsIHRoZSBhdXRob3Igd291bGQgYXBwcmVjaWF0ZSBhbiBlbWFpbCBsZXR0aW5nIGhpbSAKICoga25vdyBvZiBhbnkgc3Vic3RhbnRpYWwgdXNlIG9mIGpxUGxvdC4gIFlvdSBjYW4gcmVhY2ggdGhlIGF1dGhvciBhdDogCiAqIGNocmlzIGF0IGpxcGxvdCBkb3QgY29tIG9yIHNlZSBodHRwOi8vd3d3LmpxcGxvdC5jb20vaW5mby5waHAgLgogKgogKiBJZiB5b3UgYXJlIGZlZWxpbmcga2luZCBhbmQgZ2VuZXJvdXMsIGNvbnNpZGVyIHN1cHBvcnRpbmcgdGhlIHByb2plY3QgYnkKICogbWFraW5nIGEgZG9uYXRpb24gYXQ6IGh0dHA6Ly93d3cuanFwbG90LmNvbS9kb25hdGUucGhwIC4KICoKICogc3ByaW50ZiBmdW5jdGlvbnMgY29udGFpbmVkIGluIGpxcGxvdC5zcHJpbnRmLmpzIGJ5IEFzaCBTZWFybGU6CiAqCiAqICAgICB2ZXJzaW9uIDIwMDcuMDQuMjcKICogICAgIGF1dGhvciBBc2ggU2VhcmxlCiAqICAgICBodHRwOi8vaGV4bWVuLmNvbS9ibG9nLzIwMDcvMDMvcHJpbnRmLXNwcmludGYvCiAqICAgICBodHRwOi8vaGV4bWVuLmNvbS9qcy9zcHJpbnRmLmpzCiAqICAgICBUaGUgYXV0aG9yIChBc2ggU2VhcmxlKSBoYXMgcGxhY2VkIHRoaXMgY29kZSBpbiB0aGUgcHVibGljIGRvbWFpbjoKICogICAgICJUaGlzIGNvZGUgaXMgdW5yZXN0cmljdGVkOiB5b3UgYXJlIGZyZWUgdG8gdXNlIGl0IGhvd2V2ZXIgeW91IGxpa2UuIgogKiAKICovCihmdW5jdGlvbigkKSB7CiAgICB2YXIgYXJyYXlNYXggPSBmdW5jdGlvbiggYXJyYXkgKXsKICAgICAgICByZXR1cm4gTWF0aC5tYXguYXBwbHkoIE1hdGgsIGFycmF5ICk7CiAgICB9OwogICAgdmFyIGFycmF5TWluID0gZnVuY3Rpb24oIGFycmF5ICl7CiAgICAgICAgcmV0dXJuIE1hdGgubWluLmFwcGx5KCBNYXRoLCBhcnJheSApOwogICAgfTsKCiAgICAvKioKICAgICAqIENsYXNzOiAkLmpxcGxvdC5CdWJibGVSZW5kZXJlcgogICAgICogUGx1Z2luIHJlbmRlcmVyIHRvIGRyYXcgYSBidWJibGUgY2hhcnQuICBBIEJ1YmJsZSBjaGFydCBoYXMgZGF0YSBwb2ludHMgZGlzcGxheWVkIGFzCiAgICAgKiBjb2xvcmVkIGNpcmNsZXMgd2l0aCBhbiBvcHRpb25hbCB0ZXh0IGxhYmVsIGluc2lkZS4gIFRvIHVzZQogICAgICogdGhlIGJ1YmJsZSByZW5kZXJlciwgeW91IG11c3QgaW5jbHVkZSB0aGUgYnViYmxlIHJlbmRlcmVyIGxpa2U6CiAgICAgKiAKICAgICAqID4gPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Ii4uL3NyYy9wbHVnaW5zL2pxcGxvdC5idWJibGVSZW5kZXJlci5qcyI+PC9zY3JpcHQ+CiAgICAgKiAKICAgICAqIERhdGEgbXVzdCBiZSBzdXBwbGllZCBpbiAKICAgICAqIHRoZSBmb3JtOgogICAgICogCiAgICAgKiA+IFtbeDEsIHkxLCByMSwgPGxhYmVsIG9yIHtsYWJlbDondGV4dCcsIGNvbG9yOmNvbG9yfT5dLCAuLi5dCiAgICAgKiAKICAgICAqIHdoZXJlIHRoZSBsYWJlbCBvciBvcHRpb25zIAogICAgICogb2JqZWN0IGlzIG9wdGlvbmFsLiAgCiAgICAgKiAKICAgICAqIE5vdGUgdGhhdCBhbGwgYnViYmxlIGNvbG9ycyB3aWxsIGJlIHRoZSBzYW1lCiAgICAgKiB1bmxlc3MgdGhlICJ2YXJ5QnViYmxlQ29sb3JzIiBvcHRpb24gaXMgc2V0IHRvIHRydWUuICBDb2xvcnMgY2FuIGJlIHNwZWNpZmllZCBpbiB0aGUgZGF0YSBhcnJheQogICAgICogb3IgaW4gdGhlIHNlcmllc0NvbG9ycyBhcnJheSBvcHRpb24gb24gdGhlIHNlcmllcy4gIElmIG5vIGNvbG9ycyBhcmUgZGVmaW5lZCwgdGhlIGRlZmF1bHQganFQbG90CiAgICAgKiBzZXJpZXMgb2YgMTYgY29sb3JzIGFyZSB1c2VkLiAgQ29sb3JzIGFyZSBhdXRvbWF0aWNhbGx5IGN5Y2xlZCBhcm91bmQgYWdhaW4gaWYgdGhlcmUgYXJlIG1vcmUKICAgICAqIGJ1YmJsZXMgdGhhbiBjb2xvcnMuCiAgICAgKiAKICAgICAqIEJ1YmJsZXMgYXJlIGF1dG9zY2FsZWQgYnkgZGVmYXVsdCB0byBmaXQgd2l0aGluIHRoZSBjaGFydCBhcmVhIHdoaWxlIG1haW50YWluaW5nIAogICAgICogcmVsYXRpdmUgc2l6ZXMuICBJZiB0aGUgImF1dG9zY2FsZUJ1YmJsZXMiIG9wdGlvbiBpcyBzZXQgdG8gZmFsc2UsIHRoZSByKGFkaXVzKSB2YWx1ZXMKICAgICAqIGluIHRoZSBkYXRhIGFycmF5IGEgdHJlYXRlZCBhcyBsaXRlcmFsIHBpeGVsIHZhbHVlcyBmb3IgdGhlIHJhZGlpIG9mIHRoZSBidWJibGVzLgogICAgICogCiAgICAgKiBQcm9wZXJ0aWVzIGFyZSBwYXNzZWQgaW50byB0aGUgYnViYmxlIHJlbmRlcmVyIGluIHRoZSByZW5kZXJlck9wdGlvbnMgb2JqZWN0IG9mCiAgICAgKiB0aGUgc2VyaWVzIG9wdGlvbnMgbGlrZToKICAgICAqIAogICAgICogPiBzZXJpZXNEZWZhdWx0czogewogICAgICogPiAgICAgcmVuZGVyZXI6ICQuanFwbG90LkJ1YmJsZVJlbmRlcmVyLAogICAgICogPiAgICAgcmVuZGVyZXJPcHRpb25zOiB7CiAgICAgKiA+ICAgICAgICAgYnViYmxlQWxwaGE6IDAuNywKICAgICAqID4gICAgICAgICB2YXJ5QnViYmxlQ29sb3JzOiBmYWxzZQogICAgICogPiAgICAgfQogICAgICogPiB9CiAgICAgKiAKICAgICAqLwogICAgJC5qcXBsb3QuQnViYmxlUmVuZGVyZXIgPSBmdW5jdGlvbigpewogICAgICAgICQuanFwbG90LkxpbmVSZW5kZXJlci5jYWxsKHRoaXMpOwogICAgfTsKICAgIAogICAgJC5qcXBsb3QuQnViYmxlUmVuZGVyZXIucHJvdG90eXBlID0gbmV3ICQuanFwbG90LkxpbmVSZW5kZXJlcigpOwogICAgJC5qcXBsb3QuQnViYmxlUmVuZGVyZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gJC5qcXBsb3QuQnViYmxlUmVuZGVyZXI7CiAgICAKICAgIC8vIGNhbGxlZCB3aXRoIHNjb3BlIG9mIGEgc2VyaWVzCiAgICAkLmpxcGxvdC5CdWJibGVSZW5kZXJlci5wcm90b3R5cGUuaW5pdCA9IGZ1bmN0aW9uKG9wdGlvbnMsIHBsb3QpIHsKICAgICAgICAvLyBHcm91cDogUHJvcGVydGllcwogICAgICAgIC8vCiAgICAgICAgLy8gcHJvcDogdmFyeUJ1YmJsZUNvbG9ycwogICAgICAgIC8vIFRydWUgdG8gdmFyeSB0aGUgY29sb3Igb2YgZWFjaCBidWJibGUgaW4gdGhpcyBzZXJpZXMgYWNjb3JkaW5nIHRvCiAgICAgICAgLy8gdGhlIHNlcmllc0NvbG9ycyBhcnJheS4gIEZhbHNlIHRvIHNldCBlYWNoIGJ1YmJsZSB0byB0aGUgY29sb3IKICAgICAgICAvLyBzcGVjaWZpZWQgb24gdGhpcyBzZXJpZXMuICBUaGlzIGhhcyBubyBlZmZlY3QgaWYgYSBjc3MgYmFja2dyb3VuZCBjb2xvcgogICAgICAgIC8vIG9wdGlvbiBpcyBzcGVjaWZpZWQgaW4gdGhlIHJlbmRlcmVyIGNzcyBvcHRpb25zLgogICAgICAgIHRoaXMudmFyeUJ1YmJsZUNvbG9ycyA9IHRydWU7CiAgICAgICAgLy8gcHJvcDogYXV0b3NjYWxlQnViYmxlcwogICAgICAgIC8vIFRydWUgdG8gc2NhbGUgdGhlIGJ1YmJsZSByYWRpdXMgYmFzZWQgb24gcGxvdCBzaXplLgogICAgICAgIC8vIEZhbHNlIHdpbGwgdXNlIHRoZSByYWRpdXMgdmFsdWUgYXMgcHJvdmlkZWQgYXMgYSByYXcgcGl4ZWwgdmFsdWUgZm9yCiAgICAgICAgLy8gYnViYmxlIHJhZGl1cy4KICAgICAgICB0aGlzLmF1dG9zY2FsZUJ1YmJsZXMgPSB0cnVlOwogICAgICAgIC8vIHByb3A6IGF1dG9zY2FsZU11bHRpcGxpZXIKICAgICAgICAvLyBNdWx0aXBsaWVyIHRoZSBidWJibGUgc2l6ZSBpZiBhdXRvc2NhbGVCdWJibGVzIGlzIHRydWUuCiAgICAgICAgdGhpcy5hdXRvc2NhbGVNdWx0aXBsaWVyID0gMS4wOwogICAgICAgIC8vIHByb3A6IGF1dG9zY2FsZVBvaW50c0ZhY3RvcgogICAgICAgIC8vIEZhY3RvciB3aGljaCBkZWNyZWFzZXMgYnViYmxlIHNpemUgYmFzZWQgb24gaG93IG1hbnkgYnViYmxlcyBvbiBvbiB0aGUgY2hhcnQuCiAgICAgICAgLy8gMCBtZWFucyBubyBhZGp1c3RtZW50IGZvciBudW1iZXIgb2YgYnViYmxlcy4gIE5lZ2F0aXZlIHZhbHVlcyB3aWxsIGRlY3JlYXNlCiAgICAgICAgLy8gc2l6ZSBvZiBidWJibGVzIGFzIG1vcmUgYnViYmxlcyBhcmUgYWRkZWQuICBWYWx1ZXMgYmV0d2VlbiAwIGFuZCAtMC4yCiAgICAgICAgLy8gc2hvdWxkIHdvcmsgd2VsbC4KICAgICAgICB0aGlzLmF1dG9zY2FsZVBvaW50c0ZhY3RvciA9IC0wLjA3OwogICAgICAgIC8vIHByb3A6IGVzY2FwZUh0bWwKICAgICAgICAvLyBUcnVlIHRvIGVzY2FwZSBodG1sIGluIGJ1YmJsZSBsYWJlbCB0ZXh0LgogICAgICAgIHRoaXMuZXNjYXBlSHRtbCA9IHRydWU7CiAgICAgICAgLy8gcHJvcDogaGlnaGxpZ2h0TW91c2VPdmVyCiAgICAgICAgLy8gVHJ1ZSB0byBoaWdobGlnaHQgYnViYmxlcyB3aGVuIG1vdXNlZCBvdmVyLgogICAgICAgIC8vIFRoaXMgbXVzdCBiZSBmYWxzZSB0byBlbmFibGUgaGlnaGxpZ2h0TW91c2VEb3duIHRvIGhpZ2hsaWdodCB3aGVuIGNsaWNraW5nIG9uIGEgc2xpY2UuCiAgICAgICAgdGhpcy5oaWdobGlnaHRNb3VzZU92ZXIgPSB0cnVlOwogICAgICAgIC8vIHByb3A6IGhpZ2hsaWdodE1vdXNlRG93bgogICAgICAgIC8vIFRydWUgdG8gaGlnaGxpZ2h0IHdoZW4gYSBtb3VzZSBidXR0b24gaXMgcHJlc3NlZCBvdmVyIGEgYnViYmxlLgogICAgICAgIC8vIFRoaXMgd2lsbCBiZSBkaXNhYmxlZCBpZiBoaWdobGlnaHRNb3VzZU92ZXIgaXMgdHJ1ZS4KICAgICAgICB0aGlzLmhpZ2hsaWdodE1vdXNlRG93biA9IGZhbHNlOwogICAgICAgIC8vIHByb3A6IGhpZ2hsaWdodENvbG9ycwogICAgICAgIC8vIEFuIGFycmF5IG9mIGNvbG9ycyB0byB1c2Ugd2hlbiBoaWdobGlnaHRpbmcgYSBzbGljZS4gIENhbGN1bGF0ZWQgYXV0b21hdGljYWxseQogICAgICAgIC8vIGlmIG5vdCBzdXBwbGllZC4KICAgICAgICB0aGlzLmhpZ2hsaWdodENvbG9ycyA9IFtdOwogICAgICAgIC8vIHByb3A6IGJ1YmJsZUFscGhhCiAgICAgICAgLy8gQWxwaGEgdHJhbnNwYXJlbmN5IHRvIGFwcGx5IHRvIGFsbCBidWJibGVzIGluIHRoaXMgc2VyaWVzLgogICAgICAgIHRoaXMuYnViYmxlQWxwaGEgPSAxLjA7CiAgICAgICAgLy8gcHJvcDogaGlnaGxpZ2h0QWxwaGEKICAgICAgICAvLyBBbHBoYSB0cmFuc3BhcmVuY3kgdG8gYXBwbHkgd2hlbiBoaWdobGlnaHRpbmcgYnViYmxlLgogICAgICAgIC8vIFNldCB0byB2YWx1ZSBvZiBidWJibGVBbHBoYSBieSBkZWZhdWx0LgogICAgICAgIHRoaXMuaGlnaGxpZ2h0QWxwaGEgPSBudWxsOwogICAgICAgIC8vIHByb3A6IGJ1YmJsZUdyYWRpZW50cwogICAgICAgIC8vIFRydWUgdG8gY29sb3IgdGhlIGJ1YmJsZXMgd2l0aCBncmFkaWVudCBmaWxscyBpbnN0ZWFkIG9mIGZsYXQgY29sb3JzLgogICAgICAgIC8vIE5PVCBBVkFJTEFCTEUgSU4gSUUgZHVlIHRvIGxhY2sgb2YgZXhjYW52YXMgc3VwcG9ydCBmb3IgcmFkaWFsIGdyYWRpZW50IGZpbGxzLgogICAgICAgIC8vIHdpbGwgYmUgaWdub3JlZCBpbiBJRS4KICAgICAgICB0aGlzLmJ1YmJsZUdyYWRpZW50cyA9IGZhbHNlOwogICAgICAgIC8vIHByb3A6IHNob3dMYWJlbHMKICAgICAgICAvLyBUcnVlIHRvIHNob3cgbGFiZWxzIG9uIGJ1YmJsZXMgKGlmIGFueSksIGZhbHNlIHRvIG5vdCBzaG93LgogICAgICAgIHRoaXMuc2hvd0xhYmVscyA9IHRydWU7CiAgICAgICAgLy8gYXJyYXkgb2YgW3BvaW50IGluZGV4LCByYWRpdXNdIHdoaWNoIHdpbGwgYmUgc29ydGVkIGluIGRlc2NlbmRpbmcgb3JkZXIgdG8gcGxvdCAKICAgICAgICAvLyBsYXJnZXN0IHBvaW50cyBiZWxvdyBzbWFsbGVyIHBvaW50cy4KICAgICAgICB0aGlzLnJhZGlpID0gW107CiAgICAgICAgdGhpcy5tYXhSYWRpdXMgPSAwOwogICAgICAgIC8vIGluZGV4IG9mIHRoZSBjdXJyZW50eSBoaWdobGlnaHRlZCBwb2ludCwgaWYgYW55CiAgICAgICAgdGhpcy5faGlnaGxpZ2h0ZWRQb2ludCA9IG51bGw7CiAgICAgICAgLy8gYXJyYXkgb2YgalF1ZXJ5IGxhYmVscy4KICAgICAgICB0aGlzLmxhYmVscyA9IFtdOwogICAgICAgIHRoaXMuYnViYmxlQ2FudmFzZXMgPSBbXTsKICAgICAgICB0aGlzLl90eXBlID0gJ2J1YmJsZSc7CiAgICAgICAgCiAgICAgICAgLy8gaWYgdXNlciBoYXMgcGFzc2VkIGluIGhpZ2hsaWdodE1vdXNlRG93biBvcHRpb24gYW5kIG5vdCBzZXQgaGlnaGxpZ2h0TW91c2VPdmVyLCBkaXNhYmxlIGhpZ2hsaWdodE1vdXNlT3ZlcgogICAgICAgIGlmIChvcHRpb25zLmhpZ2hsaWdodE1vdXNlRG93biAmJiBvcHRpb25zLmhpZ2hsaWdodE1vdXNlT3ZlciA9PSBudWxsKSB7CiAgICAgICAgICAgIG9wdGlvbnMuaGlnaGxpZ2h0TW91c2VPdmVyID0gZmFsc2U7CiAgICAgICAgfQogICAgICAgIAogICAgICAgICQuZXh0ZW5kKHRydWUsIHRoaXMsIG9wdGlvbnMpOwogICAgICAgIAogICAgICAgIGlmICh0aGlzLmhpZ2hsaWdodEFscGhhID09IG51bGwpIHsKICAgICAgICAgICAgdGhpcy5oaWdobGlnaHRBbHBoYSA9IHRoaXMuYnViYmxlQWxwaGE7CiAgICAgICAgICAgIGlmICh0aGlzLmJ1YmJsZUdyYWRpZW50cykgewogICAgICAgICAgICAgICAgdGhpcy5oaWdobGlnaHRBbHBoYSA9IDAuMzU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgdGhpcy5hdXRvc2NhbGVNdWx0aXBsaWVyID0gdGhpcy5hdXRvc2NhbGVNdWx0aXBsaWVyICogTWF0aC5wb3codGhpcy5kYXRhLmxlbmd0aCwgdGhpcy5hdXRvc2NhbGVQb2ludHNGYWN0b3IpOwogICAgICAgIAogICAgICAgIC8vIGluZGV4IG9mIHRoZSBjdXJyZW50eSBoaWdobGlnaHRlZCBwb2ludCwgaWYgYW55CiAgICAgICAgdGhpcy5faGlnaGxpZ2h0ZWRQb2ludCA9IG51bGw7CiAgICAgICAgCiAgICAgICAgLy8gYWRqdXN0IHRoZSBzZXJpZXMgY29sb3JzIGZvciBvcHRpb25zIGNvbG9ycyBwYXNzZWQgaW4gd2l0aCBkYXRhIG9yIGZvciBhbHBoYS4KICAgICAgICAvLyBub3RlLCB0aGlzIGNhbiBsZWF2ZSB1bmRlZmluZWQgaG9sZXMgaW4gdGhlIHNlcmllc0NvbG9ycyBhcnJheS4KICAgICAgICB2YXIgY29tcHM7CiAgICAgICAgZm9yICh2YXIgaT0wOyBpPHRoaXMuZGF0YS5sZW5ndGg7IGkrKykgewogICAgICAgICAgICB2YXIgY29sb3IgPSBudWxsOwogICAgICAgICAgICB2YXIgZCA9IHRoaXMuZGF0YVtpXTsKICAgICAgICAgICAgdGhpcy5tYXhSYWRpdXMgPSBNYXRoLm1heCh0aGlzLm1heFJhZGl1cywgZFsyXSk7CiAgICAgICAgICAgIGlmIChkWzNdKSB7CiAgICAgICAgICAgICAgICBpZiAodHlwZW9mKGRbM10pID09ICdvYmplY3QnKSB7CiAgICAgICAgICAgICAgICAgICAgY29sb3IgPSBkWzNdWydjb2xvciddOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICBpZiAoY29sb3IgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgaWYgKHRoaXMuc2VyaWVzQ29sb3JzW2ldICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICBjb2xvciA9IHRoaXMuc2VyaWVzQ29sb3JzW2ldOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICBpZiAoY29sb3IgJiYgdGhpcy5idWJibGVBbHBoYSA8IDEuMCkgewogICAgICAgICAgICAgICAgY29tcHMgPSAkLmpxcGxvdC5nZXRDb2xvckNvbXBvbmVudHMoY29sb3IpOwogICAgICAgICAgICAgICAgY29sb3IgPSAncmdiYSgnK2NvbXBzWzBdKycsICcrY29tcHNbMV0rJywgJytjb21wc1syXSsnLCAnK3RoaXMuYnViYmxlQWxwaGErJyknOwogICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICBpZiAoY29sb3IpIHsKICAgICAgICAgICAgICAgIHRoaXMuc2VyaWVzQ29sb3JzW2ldID0gY29sb3I7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYgKCF0aGlzLnZhcnlCdWJibGVDb2xvcnMpIHsKICAgICAgICAgICAgdGhpcy5zZXJpZXNDb2xvcnMgPSBbdGhpcy5jb2xvcl07CiAgICAgICAgfQogICAgICAgIAogICAgICAgIHRoaXMuY29sb3JHZW5lcmF0b3IgPSBuZXcgJC5qcXBsb3QuQ29sb3JHZW5lcmF0b3IodGhpcy5zZXJpZXNDb2xvcnMpOwogICAgICAgIAogICAgICAgIC8vIHNldCBoaWdobGlnaHQgY29sb3JzIGlmIG5vbmUgcHJvdmlkZWQKICAgICAgICBpZiAodGhpcy5oaWdobGlnaHRDb2xvcnMubGVuZ3RoID09IDApIHsKICAgICAgICAgICAgZm9yICh2YXIgaT0wOyBpPHRoaXMuc2VyaWVzQ29sb3JzLmxlbmd0aDsgaSsrKXsKICAgICAgICAgICAgICAgIHZhciByZ2JhID0gJC5qcXBsb3QuZ2V0Q29sb3JDb21wb25lbnRzKHRoaXMuc2VyaWVzQ29sb3JzW2ldKTsKICAgICAgICAgICAgICAgIHZhciBuZXdyZ2IgPSBbcmdiYVswXSwgcmdiYVsxXSwgcmdiYVsyXV07CiAgICAgICAgICAgICAgICB2YXIgc3VtID0gbmV3cmdiWzBdICsgbmV3cmdiWzFdICsgbmV3cmdiWzJdOwogICAgICAgICAgICAgICAgZm9yICh2YXIgaj0wOyBqPDM7IGorKykgewogICAgICAgICAgICAgICAgICAgIC8vIHdoZW4gZGFya2VuaW5nLCBsb3dlc3QgY29sb3IgY29tcG9uZW50IGNhbiBiZSBpcyA2MC4KICAgICAgICAgICAgICAgICAgICBuZXdyZ2Jbal0gPSAoc3VtID4gNTcwKSA/ICBuZXdyZ2Jbal0gKiAwLjggOiBuZXdyZ2Jbal0gKyAwLjMgKiAoMjU1IC0gbmV3cmdiW2pdKTsKICAgICAgICAgICAgICAgICAgICBuZXdyZ2Jbal0gPSBwYXJzZUludChuZXdyZ2Jbal0sIDEwKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRoaXMuaGlnaGxpZ2h0Q29sb3JzLnB1c2goJ3JnYmEoJytuZXdyZ2JbMF0rJywnK25ld3JnYlsxXSsnLCcrbmV3cmdiWzJdKycsICcrdGhpcy5oaWdobGlnaHRBbHBoYSsnKScpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIAogICAgICAgIHRoaXMuaGlnaGxpZ2h0Q29sb3JHZW5lcmF0b3IgPSBuZXcgJC5qcXBsb3QuQ29sb3JHZW5lcmF0b3IodGhpcy5oaWdobGlnaHRDb2xvcnMpOwogICAgICAgIAogICAgICAgIHZhciBzb3B0cyA9IHtmaWxsOnRydWUsIGlzYXJjOnRydWUsIGFuZ2xlOnRoaXMuc2hhZG93QW5nbGUsIGFscGhhOnRoaXMuc2hhZG93QWxwaGEsIGNsb3NlUGF0aDp0cnVlfTsKICAgICAgICAKICAgICAgICB0aGlzLnJlbmRlcmVyLnNoYWRvd1JlbmRlcmVyLmluaXQoc29wdHMpOwogICAgICAgIAogICAgICAgIHRoaXMuY2FudmFzID0gbmV3ICQuanFwbG90LkRpdkNhbnZhcygpOwogICAgICAgIHRoaXMuY2FudmFzLl9wbG90RGltZW5zaW9ucyA9IHRoaXMuX3Bsb3REaW1lbnNpb25zOwogICAgICAgIAogICAgICAgIHBsb3QuZXZlbnRMaXN0ZW5lckhvb2tzLmFkZE9uY2UoJ2pxcGxvdE1vdXNlTW92ZScsIGhhbmRsZU1vdmUpOwogICAgICAgIHBsb3QuZXZlbnRMaXN0ZW5lckhvb2tzLmFkZE9uY2UoJ2pxcGxvdE1vdXNlRG93bicsIGhhbmRsZU1vdXNlRG93bik7CiAgICAgICAgcGxvdC5ldmVudExpc3RlbmVySG9va3MuYWRkT25jZSgnanFwbG90TW91c2VVcCcsIGhhbmRsZU1vdXNlVXApOwogICAgICAgIHBsb3QuZXZlbnRMaXN0ZW5lckhvb2tzLmFkZE9uY2UoJ2pxcGxvdENsaWNrJywgaGFuZGxlQ2xpY2spOwogICAgICAgIHBsb3QuZXZlbnRMaXN0ZW5lckhvb2tzLmFkZE9uY2UoJ2pxcGxvdFJpZ2h0Q2xpY2snLCBoYW5kbGVSaWdodENsaWNrKTsKICAgICAgICBwbG90LnBvc3REcmF3SG9va3MuYWRkT25jZShwb3N0UGxvdERyYXcpOwogICAgICAgIAogICAgfTsKICAgIAoKICAgIC8vIGNvbnZlcnRzIHRoZSB1c2VyIGRhdGEgdmFsdWVzIHRvIGdyaWQgY29vcmRpbmF0ZXMgYW5kIHN0b3JlcyB0aGVtCiAgICAvLyBpbiB0aGUgZ3JpZERhdGEgYXJyYXkuCiAgICAvLyBDYWxsZWQgd2l0aCBzY29wZSBvZiBhIHNlcmllcy4KICAgICQuanFwbG90LkJ1YmJsZVJlbmRlcmVyLnByb3RvdHlwZS5zZXRHcmlkRGF0YSA9IGZ1bmN0aW9uKHBsb3QpIHsKICAgICAgICAvLyByZWNhbGN1bGF0ZSB0aGUgZ3JpZCBkYXRhCiAgICAgICAgdmFyIHhwID0gdGhpcy5feGF4aXMuc2VyaWVzX3UycDsKICAgICAgICB2YXIgeXAgPSB0aGlzLl95YXhpcy5zZXJpZXNfdTJwOwogICAgICAgIHZhciBkYXRhID0gdGhpcy5fcGxvdERhdGE7CiAgICAgICAgdGhpcy5ncmlkRGF0YSA9IFtdOwogICAgICAgIHZhciByYWRpaSA9IFtdOwogICAgICAgIHRoaXMucmFkaWkgPSBbXTsKICAgICAgICB2YXIgZGltID0gTWF0aC5taW4ocGxvdC5faGVpZ2h0LCBwbG90Ll93aWR0aCk7CiAgICAgICAgZm9yICh2YXIgaT0wOyBpPHRoaXMuZGF0YS5sZW5ndGg7IGkrKykgewogICAgICAgICAgICBpZiAoZGF0YVtpXSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICB0aGlzLmdyaWREYXRhLnB1c2goW3hwLmNhbGwodGhpcy5feGF4aXMsIGRhdGFbaV1bMF0pLCB5cC5jYWxsKHRoaXMuX3lheGlzLCBkYXRhW2ldWzFdKSwgZGF0YVtpXVsyXV0pOwogICAgICAgICAgICAgICAgdGhpcy5yYWRpaS5wdXNoKFtpLCBkYXRhW2ldWzJdXSk7CiAgICAgICAgICAgICAgICByYWRpaS5wdXNoKGRhdGFbaV1bMl0pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHZhciByLCB2YWwsIG1heHIgPSB0aGlzLm1heFJhZGl1cyA9IGFycmF5TWF4KHJhZGlpKTsKICAgICAgICB2YXIgbCA9IHRoaXMuZ3JpZERhdGEubGVuZ3RoOwogICAgICAgIGlmICh0aGlzLmF1dG9zY2FsZUJ1YmJsZXMpIHsKICAgICAgICAgICAgZm9yICh2YXIgaT0wOyBpPGw7IGkrKykgewogICAgICAgICAgICAgICAgdmFsID0gcmFkaWlbaV0vbWF4cjsKICAgICAgICAgICAgICAgIHIgPSB0aGlzLmF1dG9zY2FsZU11bHRpcGxpZXIgKiBkaW0gLyA2OwogICAgICAgICAgICAgICAgdGhpcy5ncmlkRGF0YVtpXVsyXSA9IHIgKiB2YWw7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgdGhpcy5yYWRpaS5zb3J0KGZ1bmN0aW9uKGEsIGIpIHsgcmV0dXJuIGJbMV0gLSBhWzFdOyB9KTsKICAgIH07CiAgICAKICAgIC8vIGNvbnZlcnRzIGFueSBhcmJpdHJhcnkgZGF0YSB2YWx1ZXMgdG8gZ3JpZCBjb29yZGluYXRlcyBhbmQKICAgIC8vIHJldHVybnMgdGhlbS4gIFRoaXMgbWV0aG9kIGV4aXN0cyBzbyB0aGF0IHBsdWdpbnMgY2FuIHVzZSBhIHNlcmllcycKICAgIC8vIGxpbmVyZW5kZXJlciB0byBnZW5lcmF0ZSBncmlkIGRhdGEgcG9pbnRzIHdpdGhvdXQgb3ZlcndyaXRpbmcgdGhlCiAgICAvLyBncmlkIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoYXQgc2VyaWVzLgogICAgLy8gQ2FsbGVkIHdpdGggc2NvcGUgb2YgYSBzZXJpZXMuCiAgICAkLmpxcGxvdC5CdWJibGVSZW5kZXJlci5wcm90b3R5cGUubWFrZUdyaWREYXRhID0gZnVuY3Rpb24oZGF0YSwgcGxvdCkgewogICAgICAgIC8vIHJlY2FsY3VsYXRlIHRoZSBncmlkIGRhdGEKICAgICAgICB2YXIgeHAgPSB0aGlzLl94YXhpcy5zZXJpZXNfdTJwOwogICAgICAgIHZhciB5cCA9IHRoaXMuX3lheGlzLnNlcmllc191MnA7CiAgICAgICAgdmFyIGdkID0gW107CiAgICAgICAgdmFyIHJhZGlpID0gW107CiAgICAgICAgdGhpcy5yYWRpaSA9IFtdOwogICAgICAgIHZhciBkaW0gPSBNYXRoLm1pbihwbG90Ll9oZWlnaHQsIHBsb3QuX3dpZHRoKTsKICAgICAgICBmb3IgKHZhciBpPTA7IGk8ZGF0YS5sZW5ndGg7IGkrKykgewogICAgICAgICAgICBpZiAoZGF0YVtpXSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICBnZC5wdXNoKFt4cC5jYWxsKHRoaXMuX3hheGlzLCBkYXRhW2ldWzBdKSwgeXAuY2FsbCh0aGlzLl95YXhpcywgZGF0YVtpXVsxXSksIGRhdGFbaV1bMl1dKTsKICAgICAgICAgICAgICAgIHJhZGlpLnB1c2goZGF0YVtpXVsyXSk7CiAgICAgICAgICAgICAgICB0aGlzLnJhZGlpLnB1c2goW2ksIGRhdGFbaV1bMl1dKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB2YXIgciwgdmFsLCBtYXhyID0gdGhpcy5tYXhSYWRpdXMgPSBhcnJheU1heChyYWRpaSk7CiAgICAgICAgdmFyIGwgPSB0aGlzLmdyaWREYXRhLmxlbmd0aDsKICAgICAgICBpZiAodGhpcy5hdXRvc2NhbGVCdWJibGVzKSB7CiAgICAgICAgICAgIGZvciAodmFyIGk9MDsgaTxsOyBpKyspIHsKICAgICAgICAgICAgICAgIHZhbCA9IHJhZGlpW2ldL21heHI7CiAgICAgICAgICAgICAgICByID0gdGhpcy5hdXRvc2NhbGVNdWx0aXBsaWVyICogZGltIC8gNjsKICAgICAgICAgICAgICAgIGdkW2ldWzJdID0gciAqIHZhbDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB0aGlzLnJhZGlpLnNvcnQoZnVuY3Rpb24oYSwgYikgeyByZXR1cm4gYlsxXSAtIGFbMV07IH0pOwogICAgICAgIHJldHVybiBnZDsKICAgIH07CiAgICAKICAgIC8vIGNhbGxlZCB3aXRoIHNjb3BlIG9mIHNlcmllcwogICAgJC5qcXBsb3QuQnViYmxlUmVuZGVyZXIucHJvdG90eXBlLmRyYXcgPSBmdW5jdGlvbiAoY3R4LCBnZCwgb3B0aW9ucykgewogICAgICAgIGlmICh0aGlzLnBsdWdpbnMucG9pbnRMYWJlbHMpIHsKICAgICAgICAgICAgdGhpcy5wbHVnaW5zLnBvaW50TGFiZWxzLnNob3cgPSBmYWxzZTsKICAgICAgICB9CiAgICAgICAgdmFyIG9wdHMgPSAob3B0aW9ucyAhPSB1bmRlZmluZWQpID8gb3B0aW9ucyA6IHt9OwogICAgICAgIHZhciBzaGFkb3cgPSAob3B0cy5zaGFkb3cgIT0gdW5kZWZpbmVkKSA/IG9wdHMuc2hhZG93IDogdGhpcy5zaGFkb3c7CiAgICAgICAgdGhpcy5jYW52YXMuX2VsZW0uZW1wdHkoKTsKICAgICAgICBmb3IgKHZhciBpPTA7IGk8dGhpcy5yYWRpaS5sZW5ndGg7IGkrKykgewogICAgICAgICAgICB2YXIgaWR4ID0gdGhpcy5yYWRpaVtpXVswXTsKICAgICAgICAgICAgdmFyIHQ9bnVsbDsKICAgICAgICAgICAgdmFyIGNvbG9yID0gbnVsbDsKICAgICAgICAgICAgdmFyIGVsID0gbnVsbDsKICAgICAgICAgICAgdmFyIHRlbCA9IG51bGw7CiAgICAgICAgICAgIHZhciBkID0gdGhpcy5kYXRhW2lkeF07CiAgICAgICAgICAgIHZhciBnZCA9IHRoaXMuZ3JpZERhdGFbaWR4XTsKICAgICAgICAgICAgaWYgKGRbM10pIHsKICAgICAgICAgICAgICAgIGlmICh0eXBlb2YoZFszXSkgPT0gJ29iamVjdCcpIHsKICAgICAgICAgICAgICAgICAgICB0ID0gZFszXVsnbGFiZWwnXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZihkWzNdKSA9PSAnc3RyaW5nJykgewogICAgICAgICAgICAgICAgICAgIHQgPSBkWzNdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICAvLyBjb2xvciA9ICh0aGlzLnZhcnlCdWJibGVDb2xvcnMpID8gdGhpcy5jb2xvckdlbmVyYXRvci5nZXQoaWR4KSA6IHRoaXMuY29sb3I7CiAgICAgICAgICAgIGNvbG9yID0gdGhpcy5jb2xvckdlbmVyYXRvci5nZXQoaWR4KTsKICAgICAgICAgICAgCiAgICAgICAgICAgIC8vIElmIHdlJ3JlIGRyYXdpbmcgYSBzaGFkb3csIGV4cGFuZCB0aGUgY2FudmFzIGRpbWVuc2lvbnMgdG8gYWNjb21vZGF0ZS4KICAgICAgICAgICAgdmFyIGNhbnZhc1JhZGl1cyA9IGdkWzJdOwogICAgICAgICAgICB2YXIgb2Zmc2V0LCBkZXB0aDsKICAgICAgICAgICAgaWYgKHRoaXMuc2hhZG93KSB7CiAgICAgICAgICAgICAgICBvZmZzZXQgPSAoMC43ICsgZ2RbMl0vNDApLnRvRml4ZWQoMSk7CiAgICAgICAgICAgICAgICBkZXB0aCA9IDEgKyBNYXRoLmNlaWwoZ2RbMl0vMTUpOwogICAgICAgICAgICAgICAgY2FudmFzUmFkaXVzICs9IG9mZnNldCpkZXB0aDsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLmJ1YmJsZUNhbnZhc2VzW2lkeF0gPSBuZXcgJC5qcXBsb3QuQnViYmxlQ2FudmFzKCk7CiAgICAgICAgICAgIHRoaXMuY2FudmFzLl9lbGVtLmFwcGVuZCh0aGlzLmJ1YmJsZUNhbnZhc2VzW2lkeF0uY3JlYXRlRWxlbWVudChnZFswXSwgZ2RbMV0sIGNhbnZhc1JhZGl1cykpOwogICAgICAgICAgICB0aGlzLmJ1YmJsZUNhbnZhc2VzW2lkeF0uc2V0Q29udGV4dCgpOwogICAgICAgICAgICB2YXIgY3R4ID0gdGhpcy5idWJibGVDYW52YXNlc1tpZHhdLl9jdHg7CiAgICAgICAgICAgIHZhciB4ID0gY3R4LmNhbnZhcy53aWR0aC8yOwogICAgICAgICAgICB2YXIgeSA9IGN0eC5jYW52YXMuaGVpZ2h0LzI7CiAgICAgICAgICAgIGlmICh0aGlzLnNoYWRvdykgewogICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zaGFkb3dSZW5kZXJlci5kcmF3KGN0eCwgW3gsIHksIGdkWzJdLCAwLCAyKk1hdGguUEldLCB7b2Zmc2V0OiBvZmZzZXQsIGRlcHRoOiBkZXB0aH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuYnViYmxlQ2FudmFzZXNbaWR4XS5kcmF3KGdkWzJdLCBjb2xvciwgdGhpcy5idWJibGVHcmFkaWVudHMsIHRoaXMuc2hhZG93QW5nbGUvMTgwKk1hdGguUEkpOwogICAgICAgICAgICAKICAgICAgICAgICAgLy8gbm93IGRyYXcgbGFiZWwuCiAgICAgICAgICAgIGlmICh0ICYmIHRoaXMuc2hvd0xhYmVscykgewogICAgICAgICAgICAgICAgdGVsID0gJCgnPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7IiBjbGFzcz0ianFwbG90LWJ1YmJsZS1sYWJlbCI+PC9kaXY+Jyk7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5lc2NhcGVIdG1sKSB7CiAgICAgICAgICAgICAgICAgICAgdGVsLnRleHQodCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0ZWwuaHRtbCh0KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRoaXMuY2FudmFzLl9lbGVtLmFwcGVuZCh0ZWwpOwogICAgICAgICAgICAgICAgdmFyIGggPSAkKHRlbCkub3V0ZXJIZWlnaHQoKTsKICAgICAgICAgICAgICAgIHZhciB3ID0gJCh0ZWwpLm91dGVyV2lkdGgoKTsKICAgICAgICAgICAgICAgIHZhciB0b3AgPSBnZFsxXSAtIDAuNSpoOwogICAgICAgICAgICAgICAgdmFyIGxlZnQgPSBnZFswXSAtIDAuNSp3OwogICAgICAgICAgICAgICAgdGVsLmNzcyh7dG9wOiB0b3AsIGxlZnQ6IGxlZnR9KTsKICAgICAgICAgICAgICAgIHRoaXMubGFiZWxzW2lkeF0gPSAkKHRlbCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9OwoKICAgIAogICAgJC5qcXBsb3QuRGl2Q2FudmFzID0gZnVuY3Rpb24oKSB7CiAgICAgICAgJC5qcXBsb3QuRWxlbUNvbnRhaW5lci5jYWxsKHRoaXMpOwogICAgICAgIHRoaXMuX2N0eDsgIAogICAgfTsKICAgIAogICAgJC5qcXBsb3QuRGl2Q2FudmFzLnByb3RvdHlwZSA9IG5ldyAkLmpxcGxvdC5FbGVtQ29udGFpbmVyKCk7CiAgICAkLmpxcGxvdC5EaXZDYW52YXMucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gJC5qcXBsb3QuRGl2Q2FudmFzOwogICAgCiAgICAkLmpxcGxvdC5EaXZDYW52YXMucHJvdG90eXBlLmNyZWF0ZUVsZW1lbnQgPSBmdW5jdGlvbihvZmZzZXRzLCBjbHNzLCBwbG90RGltZW5zaW9ucykgewogICAgICAgIHRoaXMuX29mZnNldHMgPSBvZmZzZXRzOwogICAgICAgIHZhciBrbGFzcyA9ICdqcXBsb3QtRGl2Q2FudmFzJzsKICAgICAgICBpZiAoY2xzcyAhPSB1bmRlZmluZWQpIHsKICAgICAgICAgICAga2xhc3MgPSBjbHNzOwogICAgICAgIH0KICAgICAgICB2YXIgZWxlbTsKICAgICAgICAvLyBpZiB0aGlzIGNhbnZhcyBhbHJlYWR5IGhhcyBhIGRvbSBlbGVtZW50LCBkb24ndCBtYWtlIGEgbmV3IG9uZS4KICAgICAgICBpZiAodGhpcy5fZWxlbSkgewogICAgICAgICAgICBlbGVtID0gdGhpcy5fZWxlbS5nZXQoMCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBlbGVtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgICAgfQogICAgICAgIC8vIGlmIG5ldyBwbG90RGltZW5zaW9ucyBzdXBwbGllZCwgdXNlIHRoZW0uCiAgICAgICAgaWYgKHBsb3REaW1lbnNpb25zICE9IHVuZGVmaW5lZCkgewogICAgICAgICAgICB0aGlzLl9wbG90RGltZW5zaW9ucyA9IHBsb3REaW1lbnNpb25zOwogICAgICAgIH0KICAgICAgICAKICAgICAgICB2YXIgdyA9IHRoaXMuX3Bsb3REaW1lbnNpb25zLndpZHRoIC0gdGhpcy5fb2Zmc2V0cy5sZWZ0IC0gdGhpcy5fb2Zmc2V0cy5yaWdodCArICdweCc7CiAgICAgICAgdmFyIGggPSB0aGlzLl9wbG90RGltZW5zaW9ucy5oZWlnaHQgLSB0aGlzLl9vZmZzZXRzLnRvcCAtIHRoaXMuX29mZnNldHMuYm90dG9tICsgJ3B4JzsKICAgICAgICB0aGlzLl9lbGVtID0gJChlbGVtKTsKICAgICAgICB0aGlzLl9lbGVtLmNzcyh7IHBvc2l0aW9uOiAnYWJzb2x1dGUnLCB3aWR0aDp3LCBoZWlnaHQ6aCwgbGVmdDogdGhpcy5fb2Zmc2V0cy5sZWZ0LCB0b3A6IHRoaXMuX29mZnNldHMudG9wIH0pOwogICAgICAgIAogICAgICAgIHRoaXMuX2VsZW0uYWRkQ2xhc3Moa2xhc3MpOwogICAgICAgIHJldHVybiB0aGlzLl9lbGVtOwogICAgfTsKICAgIAogICAgJC5qcXBsb3QuRGl2Q2FudmFzLnByb3RvdHlwZS5zZXRDb250ZXh0ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5fY3R4ID0gewogICAgICAgICAgICBjYW52YXM6ewogICAgICAgICAgICAgICAgd2lkdGg6MCwKICAgICAgICAgICAgICAgIGhlaWdodDowCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGNsZWFyUmVjdDpmdW5jdGlvbigpe3JldHVybiBudWxsO30KICAgICAgICB9OwogICAgICAgIHJldHVybiB0aGlzLl9jdHg7CiAgICB9OwogICAgCiAgICAkLmpxcGxvdC5CdWJibGVDYW52YXMgPSBmdW5jdGlvbigpIHsKICAgICAgICAkLmpxcGxvdC5FbGVtQ29udGFpbmVyLmNhbGwodGhpcyk7CiAgICAgICAgdGhpcy5fY3R4OwogICAgfTsKICAgIAogICAgJC5qcXBsb3QuQnViYmxlQ2FudmFzLnByb3RvdHlwZSA9IG5ldyAkLmpxcGxvdC5FbGVtQ29udGFpbmVyKCk7CiAgICAkLmpxcGxvdC5CdWJibGVDYW52YXMucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gJC5qcXBsb3QuQnViYmxlQ2FudmFzOwogICAgCiAgICAvLyBpbml0aWFsaXplIHdpdGggdGhlIHgseSBwb250IG9mIGJ1YmJsZSBjZW50ZXIgYW5kIHRoZSBidWJibGUgcmFkaXVzLgogICAgJC5qcXBsb3QuQnViYmxlQ2FudmFzLnByb3RvdHlwZS5jcmVhdGVFbGVtZW50ID0gZnVuY3Rpb24oeCwgeSwgcikgeyAgICAgCiAgICAgICAgdmFyIGtsYXNzID0gJ2pxcGxvdC1idWJibGUtcG9pbnQnOwoKICAgICAgICB2YXIgZWxlbTsKICAgICAgICAvLyBpZiB0aGlzIGNhbnZhcyBhbHJlYWR5IGhhcyBhIGRvbSBlbGVtZW50LCBkb24ndCBtYWtlIGEgbmV3IG9uZS4KICAgICAgICBpZiAodGhpcy5fZWxlbSkgewogICAgICAgICAgICBlbGVtID0gdGhpcy5fZWxlbS5nZXQoMCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBlbGVtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGVsZW0ud2lkdGggPSAociAhPSBudWxsKSA/IDIqciA6IGVsZW0ud2lkdGg7CiAgICAgICAgZWxlbS5oZWlnaHQgPSAociAhPSBudWxsKSA/IDIqciA6IGVsZW0uaGVpZ2h0OwogICAgICAgIHRoaXMuX2VsZW0gPSAkKGVsZW0pOwogICAgICAgIHZhciBsID0gKHggIT0gbnVsbCAmJiByICE9IG51bGwpID8geCAtIHIgOiB0aGlzLl9lbGVtLmNzcygnbGVmdCcpOwogICAgICAgIHZhciB0ID0gKHkgIT0gbnVsbCAmJiByICE9IG51bGwpID8geSAtIHIgOiB0aGlzLl9lbGVtLmNzcygndG9wJyk7CiAgICAgICAgdGhpcy5fZWxlbS5jc3MoeyBwb3NpdGlvbjogJ2Fic29sdXRlJywgbGVmdDogbCwgdG9wOiB0IH0pOwogICAgICAgIAogICAgICAgIHRoaXMuX2VsZW0uYWRkQ2xhc3Moa2xhc3MpOwogICAgICAgIGlmICgkLmpxcGxvdC51c2VfZXhjYW52YXMpIHsKICAgICAgICAgICAgd2luZG93Lkdfdm1sQ2FudmFzTWFuYWdlci5pbml0Xyhkb2N1bWVudCk7CiAgICAgICAgICAgIGVsZW0gPSB3aW5kb3cuR192bWxDYW52YXNNYW5hZ2VyLmluaXRFbGVtZW50KGVsZW0pOwogICAgICAgIH0KICAgICAgICAKICAgICAgICByZXR1cm4gdGhpcy5fZWxlbTsKICAgIH07CiAgICAKICAgICQuanFwbG90LkJ1YmJsZUNhbnZhcy5wcm90b3R5cGUuZHJhdyA9IGZ1bmN0aW9uKHIsIGNvbG9yLCBncmFkaWVudHMsIGFuZ2xlKSB7CiAgICAgICAgdmFyIGN0eCA9IHRoaXMuX2N0eDsKICAgICAgICAvLyByID0gTWF0aC5mbG9vcihyKjEuMDQpOwogICAgICAgIC8vIHZhciB4ID0gTWF0aC5yb3VuZChjdHguY2FudmFzLndpZHRoLzIpOwogICAgICAgIC8vIHZhciB5ID0gTWF0aC5yb3VuZChjdHguY2FudmFzLmhlaWdodC8yKTsKICAgICAgICB2YXIgeCA9IGN0eC5jYW52YXMud2lkdGgvMjsKICAgICAgICB2YXIgeSA9IGN0eC5jYW52YXMuaGVpZ2h0LzI7CiAgICAgICAgY3R4LnNhdmUoKTsKICAgICAgICBpZiAoZ3JhZGllbnRzICYmICEkLmpxcGxvdC51c2VfZXhjYW52YXMpIHsKICAgICAgICAgICAgciA9IHIqMS4wNDsKICAgICAgICAgICAgdmFyIGNvbXBzID0gJC5qcXBsb3QuZ2V0Q29sb3JDb21wb25lbnRzKGNvbG9yKTsKICAgICAgICAgICAgdmFyIGNvbG9yaW5uZXIgPSAncmdiYSgnK01hdGgucm91bmQoY29tcHNbMF0rMC44KigyNTUtY29tcHNbMF0pKSsnLCAnK01hdGgucm91bmQoY29tcHNbMV0rMC44KigyNTUtY29tcHNbMV0pKSsnLCAnK01hdGgucm91bmQoY29tcHNbMl0rMC44KigyNTUtY29tcHNbMl0pKSsnLCAnK2NvbXBzWzNdKycpJzsKICAgICAgICAgICAgdmFyIGNvbG9yZW5kID0gJ3JnYmEoJytjb21wc1swXSsnLCAnK2NvbXBzWzFdKycsICcrY29tcHNbMl0rJywgMCknOwogICAgICAgICAgICAvLyB2YXIgcmlubmVyID0gTWF0aC5yb3VuZCgwLjM1ICogcik7CiAgICAgICAgICAgIC8vIHZhciB4aW5uZXIgPSBNYXRoLnJvdW5kKHggLSBNYXRoLmNvcyhhbmdsZSkgKiAwLjMzICogcik7CiAgICAgICAgICAgIC8vIHZhciB5aW5uZXIgPSBNYXRoLnJvdW5kKHkgLSBNYXRoLnNpbihhbmdsZSkgKiAwLjMzICogcik7CiAgICAgICAgICAgIHZhciByaW5uZXIgPSAwLjM1ICogcjsKICAgICAgICAgICAgdmFyIHhpbm5lciA9IHggLSBNYXRoLmNvcyhhbmdsZSkgKiAwLjMzICogcjsKICAgICAgICAgICAgdmFyIHlpbm5lciA9IHkgLSBNYXRoLnNpbihhbmdsZSkgKiAwLjMzICogcjsKICAgICAgICAgICAgdmFyIHJhZGdyYWQgPSBjdHguY3JlYXRlUmFkaWFsR3JhZGllbnQoeGlubmVyLCB5aW5uZXIsIHJpbm5lciwgeCwgeSwgcik7CiAgICAgICAgICAgIHJhZGdyYWQuYWRkQ29sb3JTdG9wKDAsIGNvbG9yaW5uZXIpOwogICAgICAgICAgICByYWRncmFkLmFkZENvbG9yU3RvcCgwLjkzLCBjb2xvcik7CiAgICAgICAgICAgIHJhZGdyYWQuYWRkQ29sb3JTdG9wKDAuOTYsIGNvbG9yZW5kKTsKICAgICAgICAgICAgcmFkZ3JhZC5hZGRDb2xvclN0b3AoMSwgY29sb3JlbmQpOwogICAgICAgICAgICAvLyByYWRncmFkLmFkZENvbG9yU3RvcCguOTgsIGNvbG9yZW5kKTsKICAgICAgICAgICAgY3R4LmZpbGxTdHlsZSA9IHJhZGdyYWQ7CiAgICAgICAgICAgIGN0eC5maWxsUmVjdCgwLDAsIGN0eC5jYW52YXMud2lkdGgsIGN0eC5jYW52YXMuaGVpZ2h0KTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGN0eC5maWxsU3R5bGUgPSBjb2xvcjsKICAgICAgICAgICAgY3R4LnN0cm9rZVN0eWxlID0gY29sb3I7CiAgICAgICAgICAgIGN0eC5saW5lV2lkdGggPSAxOwogICAgICAgICAgICBjdHguYmVnaW5QYXRoKCk7CiAgICAgICAgICAgIHZhciBhbmcgPSAyKk1hdGguUEk7CiAgICAgICAgICAgIGN0eC5hcmMoeCwgeSwgciwgMCwgYW5nLCAwKTsKICAgICAgICAgICAgY3R4LmNsb3NlUGF0aCgpOwogICAgICAgICAgICBjdHguZmlsbCgpOwogICAgICAgIH0KICAgICAgICBjdHgucmVzdG9yZSgpOwogICAgfTsKICAgIAogICAgJC5qcXBsb3QuQnViYmxlQ2FudmFzLnByb3RvdHlwZS5zZXRDb250ZXh0ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5fY3R4ID0gdGhpcy5fZWxlbS5nZXQoMCkuZ2V0Q29udGV4dCgiMmQiKTsKICAgICAgICByZXR1cm4gdGhpcy5fY3R4OwogICAgfTsKICAgIAogICAgJC5qcXBsb3QuQnViYmxlQXhpc1JlbmRlcmVyID0gZnVuY3Rpb24oKSB7CiAgICAgICAgJC5qcXBsb3QuTGluZWFyQXhpc1JlbmRlcmVyLmNhbGwodGhpcyk7CiAgICB9OwogICAgCiAgICAkLmpxcGxvdC5CdWJibGVBeGlzUmVuZGVyZXIucHJvdG90eXBlID0gbmV3ICQuanFwbG90LkxpbmVhckF4aXNSZW5kZXJlcigpOwogICAgJC5qcXBsb3QuQnViYmxlQXhpc1JlbmRlcmVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9ICQuanFwbG90LkJ1YmJsZUF4aXNSZW5kZXJlcjsKICAgICAgICAKICAgIC8vIGNhbGxlZCB3aXRoIHNjb3BlIG9mIGF4aXMgb2JqZWN0LgogICAgJC5qcXBsb3QuQnViYmxlQXhpc1JlbmRlcmVyLnByb3RvdHlwZS5pbml0ID0gZnVuY3Rpb24ob3B0aW9ucyl7CiAgICAgICAgJC5leHRlbmQodHJ1ZSwgdGhpcywgb3B0aW9ucyk7CiAgICAgICAgdmFyIGRiID0gdGhpcy5fZGF0YUJvdW5kczsKICAgICAgICB2YXIgbWluc2lkeCA9IDAsCiAgICAgICAgICAgIG1pbnBpZHggPSAwLAogICAgICAgICAgICBtYXhzaWR4ID0gMCwKICAgICAgICAgICAgbWF4cGlkeCA9IDAsCiAgICAgICAgICAgIG1heHIgPSAwLAogICAgICAgICAgICBtaW5yID0gMCwKICAgICAgICAgICAgbWluTWF4UmFkaXVzID0gMCwKICAgICAgICAgICAgbWF4TWF4UmFkaXVzID0gMCwKICAgICAgICAgICAgbWF4TXVsdCA9IDAsCiAgICAgICAgICAgIG1pbk11bHQgPSAwOwogICAgICAgIC8vIEdvIHRocm91Z2ggYWxsIHRoZSBzZXJpZXMgYXR0YWNoZWQgdG8gdGhpcyBheGlzIGFuZCBmaW5kCiAgICAgICAgLy8gdGhlIG1pbi9tYXggYm91bmRzIGZvciB0aGlzIGF4aXMuCiAgICAgICAgZm9yICh2YXIgaT0wOyBpPHRoaXMuX3Nlcmllcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICB2YXIgcyA9IHRoaXMuX3Nlcmllc1tpXTsKICAgICAgICAgICAgdmFyIGQgPSBzLl9wbG90RGF0YTsKICAgICAgICAgICAgCiAgICAgICAgICAgIGZvciAodmFyIGo9MDsgajxkLmxlbmd0aDsgaisrKSB7IAogICAgICAgICAgICAgICAgaWYgKHRoaXMubmFtZSA9PSAneGF4aXMnIHx8IHRoaXMubmFtZSA9PSAneDJheGlzJykgewogICAgICAgICAgICAgICAgICAgIGlmIChkW2pdWzBdIDwgZGIubWluIHx8IGRiLm1pbiA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRiLm1pbiA9IGRbal1bMF07CiAgICAgICAgICAgICAgICAgICAgICAgIG1pbnNpZHg9aTsKICAgICAgICAgICAgICAgICAgICAgICAgbWlucGlkeD1qOwogICAgICAgICAgICAgICAgICAgICAgICBtaW5yID0gZFtqXVsyXTsKICAgICAgICAgICAgICAgICAgICAgICAgbWluTWF4UmFkaXVzID0gcy5tYXhSYWRpdXM7CiAgICAgICAgICAgICAgICAgICAgICAgIG1pbk11bHQgPSBzLmF1dG9zY2FsZU11bHRpcGxpZXI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChkW2pdWzBdID4gZGIubWF4IHx8IGRiLm1heCA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRiLm1heCA9IGRbal1bMF07CiAgICAgICAgICAgICAgICAgICAgICAgIG1heHNpZHg9aTsKICAgICAgICAgICAgICAgICAgICAgICAgbWF4cGlkeD1qOwogICAgICAgICAgICAgICAgICAgICAgICBtYXhyID0gZFtqXVsyXTsKICAgICAgICAgICAgICAgICAgICAgICAgbWF4TWF4UmFkaXVzID0gcy5tYXhSYWRpdXM7CiAgICAgICAgICAgICAgICAgICAgICAgIG1heE11bHQgPSBzLmF1dG9zY2FsZU11bHRpcGxpZXI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZFtqXVsxXSA8IGRiLm1pbiB8fCBkYi5taW4gPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICBkYi5taW4gPSBkW2pdWzFdOwogICAgICAgICAgICAgICAgICAgICAgICBtaW5zaWR4PWk7CiAgICAgICAgICAgICAgICAgICAgICAgIG1pbnBpZHg9ajsKICAgICAgICAgICAgICAgICAgICAgICAgbWluciA9IGRbal1bMl07CiAgICAgICAgICAgICAgICAgICAgICAgIG1pbk1heFJhZGl1cyA9IHMubWF4UmFkaXVzOwogICAgICAgICAgICAgICAgICAgICAgICBtaW5NdWx0ID0gcy5hdXRvc2NhbGVNdWx0aXBsaWVyOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoZFtqXVsxXSA+IGRiLm1heCB8fCBkYi5tYXggPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICBkYi5tYXggPSBkW2pdWzFdOwogICAgICAgICAgICAgICAgICAgICAgICBtYXhzaWR4PWk7CiAgICAgICAgICAgICAgICAgICAgICAgIG1heHBpZHg9ajsKICAgICAgICAgICAgICAgICAgICAgICAgbWF4ciA9IGRbal1bMl07CiAgICAgICAgICAgICAgICAgICAgICAgIG1heE1heFJhZGl1cyA9IHMubWF4UmFkaXVzOwogICAgICAgICAgICAgICAgICAgICAgICBtYXhNdWx0ID0gcy5hdXRvc2NhbGVNdWx0aXBsaWVyOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgIAogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIAogICAgICAgIHZhciBtaW5SYXRpbyA9IG1pbnIvbWluTWF4UmFkaXVzOwogICAgICAgIHZhciBtYXhSYXRpbyA9IG1heHIvbWF4TWF4UmFkaXVzOwogICAgICAgIAogICAgICAgIC8vIG5lZWQgdG8gZXN0aW1hdGUgdGhlIGVmZmVjdCBvZiB0aGUgcmFkaXVzIG9uIHRvdGFsIGF4aXMgc3BhbiBhbmQgYWRqdXN0IGF4aXMgYWNjb3JkaW5nbHkuCiAgICAgICAgdmFyIHNwYW4gPSBkYi5tYXggLSBkYi5taW47CiAgICAgICAgLy8gdmFyIGRpbSA9ICh0aGlzLm5hbWUgPT0gJ3hheGlzJyB8fCB0aGlzLm5hbWUgPT0gJ3gyYXhpcycpID8gdGhpcy5fcGxvdERpbWVuc2lvbnMud2lkdGggOiB0aGlzLl9wbG90RGltZW5zaW9ucy5oZWlnaHQ7CiAgICAgICAgdmFyIGRpbSA9IE1hdGgubWluKHRoaXMuX3Bsb3REaW1lbnNpb25zLndpZHRoLCB0aGlzLl9wbG90RGltZW5zaW9ucy5oZWlnaHQpOwogICAgICAgIAogICAgICAgIHZhciBtaW5mYWN0ID0gbWluUmF0aW8gKiBtaW5NdWx0LzMgKiBzcGFuOwogICAgICAgIHZhciBtYXhmYWN0ID0gbWF4UmF0aW8gKiBtYXhNdWx0LzMgKiBzcGFuOwogICAgICAgIGRiLm1heCArPSBtYXhmYWN0OwogICAgICAgIGRiLm1pbiAtPSBtaW5mYWN0OwogICAgfTsKICAgIAogICAgZnVuY3Rpb24gaGlnaGxpZ2h0IChwbG90LCBzaWR4LCBwaWR4KSB7CiAgICAgICAgcGxvdC5wbHVnaW5zLmJ1YmJsZVJlbmRlcmVyLmhpZ2hsaWdodExhYmVsQ2FudmFzLmVtcHR5KCk7CiAgICAgICAgdmFyIHMgPSBwbG90LnNlcmllc1tzaWR4XTsKICAgICAgICB2YXIgY2FudmFzID0gcGxvdC5wbHVnaW5zLmJ1YmJsZVJlbmRlcmVyLmhpZ2hsaWdodENhbnZhczsKICAgICAgICB2YXIgY3R4ID0gY2FudmFzLl9jdHg7CiAgICAgICAgY3R4LmNsZWFyUmVjdCgwLDAsY3R4LmNhbnZhcy53aWR0aCwgY3R4LmNhbnZhcy5oZWlnaHQpOwogICAgICAgIHMuX2hpZ2hsaWdodGVkUG9pbnQgPSBwaWR4OwogICAgICAgIHBsb3QucGx1Z2lucy5idWJibGVSZW5kZXJlci5oaWdobGlnaHRlZFNlcmllc0luZGV4ID0gc2lkeDsKICAgICAgICAKICAgICAgICB2YXIgY29sb3IgPSBzLmhpZ2hsaWdodENvbG9yR2VuZXJhdG9yLmdldChwaWR4KTsKICAgICAgICB2YXIgeCA9IHMuZ3JpZERhdGFbcGlkeF1bMF0sCiAgICAgICAgICAgIHkgPSBzLmdyaWREYXRhW3BpZHhdWzFdLAogICAgICAgICAgICByID0gcy5ncmlkRGF0YVtwaWR4XVsyXTsKICAgICAgICBjdHguc2F2ZSgpOwogICAgICAgIGN0eC5maWxsU3R5bGUgPSBjb2xvcjsKICAgICAgICBjdHguc3Ryb2tlU3R5bGUgPSBjb2xvcjsKICAgICAgICBjdHgubGluZVdpZHRoID0gMTsKICAgICAgICBjdHguYmVnaW5QYXRoKCk7CiAgICAgICAgY3R4LmFyYyh4LCB5LCByLCAwLCAyKk1hdGguUEksIDApOwogICAgICAgIGN0eC5jbG9zZVBhdGgoKTsKICAgICAgICBjdHguZmlsbCgpOwogICAgICAgIGN0eC5yZXN0b3JlKCk7ICAgICAgICAKICAgICAgICAvLyBicmluZyBsYWJlbCB0byBmcm9udAogICAgICAgIGlmIChzLmxhYmVsc1twaWR4XSkgewogICAgICAgICAgICBwbG90LnBsdWdpbnMuYnViYmxlUmVuZGVyZXIuaGlnaGxpZ2h0TGFiZWwgPSBzLmxhYmVsc1twaWR4XS5jbG9uZSgpOwogICAgICAgICAgICBwbG90LnBsdWdpbnMuYnViYmxlUmVuZGVyZXIuaGlnaGxpZ2h0TGFiZWwuYXBwZW5kVG8ocGxvdC5wbHVnaW5zLmJ1YmJsZVJlbmRlcmVyLmhpZ2hsaWdodExhYmVsQ2FudmFzKTsKICAgICAgICAgICAgcGxvdC5wbHVnaW5zLmJ1YmJsZVJlbmRlcmVyLmhpZ2hsaWdodExhYmVsLmFkZENsYXNzKCdqcXBsb3QtYnViYmxlLWxhYmVsLWhpZ2hsaWdodCcpOwogICAgICAgIH0KICAgIH0KICAgIAogICAgZnVuY3Rpb24gdW5oaWdobGlnaHQgKHBsb3QpIHsKICAgICAgICB2YXIgY2FudmFzID0gcGxvdC5wbHVnaW5zLmJ1YmJsZVJlbmRlcmVyLmhpZ2hsaWdodENhbnZhczsKICAgICAgICB2YXIgc2lkeCA9IHBsb3QucGx1Z2lucy5idWJibGVSZW5kZXJlci5oaWdobGlnaHRlZFNlcmllc0luZGV4OwogICAgICAgIHBsb3QucGx1Z2lucy5idWJibGVSZW5kZXJlci5oaWdobGlnaHRMYWJlbENhbnZhcy5lbXB0eSgpOwogICAgICAgIGNhbnZhcy5fY3R4LmNsZWFyUmVjdCgwLDAsIGNhbnZhcy5fY3R4LmNhbnZhcy53aWR0aCwgY2FudmFzLl9jdHguY2FudmFzLmhlaWdodCk7CiAgICAgICAgZm9yICh2YXIgaT0wOyBpPHBsb3Quc2VyaWVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIHBsb3Quc2VyaWVzW2ldLl9oaWdobGlnaHRlZFBvaW50ID0gbnVsbDsKICAgICAgICB9CiAgICAgICAgcGxvdC5wbHVnaW5zLmJ1YmJsZVJlbmRlcmVyLmhpZ2hsaWdodGVkU2VyaWVzSW5kZXggPSBudWxsOwogICAgICAgIHBsb3QudGFyZ2V0LnRyaWdnZXIoJ2pxcGxvdERhdGFVbmhpZ2hsaWdodCcpOwogICAgfQogICAgCiAKICAgIGZ1bmN0aW9uIGhhbmRsZU1vdmUoZXYsIGdyaWRwb3MsIGRhdGFwb3MsIG5laWdoYm9yLCBwbG90KSB7CiAgICAgICAgaWYgKG5laWdoYm9yKSB7CiAgICAgICAgICAgIHZhciBzaSA9IG5laWdoYm9yLnNlcmllc0luZGV4OwogICAgICAgICAgICB2YXIgcGkgPSBuZWlnaGJvci5wb2ludEluZGV4OwogICAgICAgICAgICB2YXIgaW5zID0gW3NpLCBwaSwgbmVpZ2hib3IuZGF0YSwgcGxvdC5zZXJpZXNbc2ldLmdyaWREYXRhW3BpXVsyXV07CiAgICAgICAgICAgIHZhciBldnQxID0galF1ZXJ5LkV2ZW50KCdqcXBsb3REYXRhTW91c2VPdmVyJyk7CiAgICAgICAgICAgIGV2dDEucGFnZVggPSBldi5wYWdlWDsKICAgICAgICAgICAgZXZ0MS5wYWdlWSA9IGV2LnBhZ2VZOwogICAgICAgICAgICBwbG90LnRhcmdldC50cmlnZ2VyKGV2dDEsIGlucyk7CiAgICAgICAgICAgIGlmIChwbG90LnNlcmllc1tpbnNbMF1dLmhpZ2hsaWdodE1vdXNlT3ZlciAmJiAhKGluc1swXSA9PSBwbG90LnBsdWdpbnMuYnViYmxlUmVuZGVyZXIuaGlnaGxpZ2h0ZWRTZXJpZXNJbmRleCAmJiBpbnNbMV0gPT0gcGxvdC5zZXJpZXNbaW5zWzBdXS5faGlnaGxpZ2h0ZWRQb2ludCkpIHsKICAgICAgICAgICAgICAgIHZhciBldnQgPSBqUXVlcnkuRXZlbnQoJ2pxcGxvdERhdGFIaWdobGlnaHQnKTsKICAgICAgICAgICAgICAgIGV2dC5wYWdlWCA9IGV2LnBhZ2VYOwogICAgICAgICAgICAgICAgZXZ0LnBhZ2VZID0gZXYucGFnZVk7CiAgICAgICAgICAgICAgICBwbG90LnRhcmdldC50cmlnZ2VyKGV2dCwgaW5zKTsKICAgICAgICAgICAgICAgIGhpZ2hsaWdodCAocGxvdCwgaW5zWzBdLCBpbnNbMV0pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKG5laWdoYm9yID09IG51bGwpIHsKICAgICAgICAgICAgdW5oaWdobGlnaHQgKHBsb3QpOwogICAgICAgIH0KICAgIH0gCiAgICAKICAgIGZ1bmN0aW9uIGhhbmRsZU1vdXNlRG93bihldiwgZ3JpZHBvcywgZGF0YXBvcywgbmVpZ2hib3IsIHBsb3QpIHsKICAgICAgICBpZiAobmVpZ2hib3IpIHsKICAgICAgICAgICAgdmFyIHNpID0gbmVpZ2hib3Iuc2VyaWVzSW5kZXg7CiAgICAgICAgICAgIHZhciBwaSA9IG5laWdoYm9yLnBvaW50SW5kZXg7CiAgICAgICAgICAgIHZhciBpbnMgPSBbc2ksIHBpLCBuZWlnaGJvci5kYXRhLCBwbG90LnNlcmllc1tzaV0uZ3JpZERhdGFbcGldWzJdXTsKICAgICAgICAgICAgaWYgKHBsb3Quc2VyaWVzW2luc1swXV0uaGlnaGxpZ2h0TW91c2VEb3duICYmICEoaW5zWzBdID09IHBsb3QucGx1Z2lucy5idWJibGVSZW5kZXJlci5oaWdobGlnaHRlZFNlcmllc0luZGV4ICYmIGluc1sxXSA9PSBwbG90LnNlcmllc1tpbnNbMF1dLl9oaWdobGlnaHRlZFBvaW50KSkgewogICAgICAgICAgICAgICAgdmFyIGV2dCA9IGpRdWVyeS5FdmVudCgnanFwbG90RGF0YUhpZ2hsaWdodCcpOwogICAgICAgICAgICAgICAgZXZ0LnBhZ2VYID0gZXYucGFnZVg7CiAgICAgICAgICAgICAgICBldnQucGFnZVkgPSBldi5wYWdlWTsKICAgICAgICAgICAgICAgIHBsb3QudGFyZ2V0LnRyaWdnZXIoZXZ0LCBpbnMpOwogICAgICAgICAgICAgICAgaGlnaGxpZ2h0IChwbG90LCBpbnNbMF0sIGluc1sxXSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAobmVpZ2hib3IgPT0gbnVsbCkgewogICAgICAgICAgICB1bmhpZ2hsaWdodCAocGxvdCk7CiAgICAgICAgfQogICAgfQogICAgCiAgICBmdW5jdGlvbiBoYW5kbGVNb3VzZVVwKGV2LCBncmlkcG9zLCBkYXRhcG9zLCBuZWlnaGJvciwgcGxvdCkgewogICAgICAgIHZhciBpZHggPSBwbG90LnBsdWdpbnMuYnViYmxlUmVuZGVyZXIuaGlnaGxpZ2h0ZWRTZXJpZXNJbmRleDsKICAgICAgICBpZiAoaWR4ICE9IG51bGwgJiYgcGxvdC5zZXJpZXNbaWR4XS5oaWdobGlnaHRNb3VzZURvd24pIHsKICAgICAgICAgICAgdW5oaWdobGlnaHQocGxvdCk7CiAgICAgICAgfQogICAgfQogICAgCiAgICBmdW5jdGlvbiBoYW5kbGVDbGljayhldiwgZ3JpZHBvcywgZGF0YXBvcywgbmVpZ2hib3IsIHBsb3QpIHsKICAgICAgICBpZiAobmVpZ2hib3IpIHsKICAgICAgICAgICAgdmFyIHNpID0gbmVpZ2hib3Iuc2VyaWVzSW5kZXg7CiAgICAgICAgICAgIHZhciBwaSA9IG5laWdoYm9yLnBvaW50SW5kZXg7CiAgICAgICAgICAgIHZhciBpbnMgPSBbc2ksIHBpLCBuZWlnaGJvci5kYXRhLCBwbG90LnNlcmllc1tzaV0uZ3JpZERhdGFbcGldWzJdXTsKICAgICAgICAgICAgdmFyIGV2dCA9IGpRdWVyeS5FdmVudCgnanFwbG90RGF0YUNsaWNrJyk7CiAgICAgICAgICAgIGV2dC5wYWdlWCA9IGV2LnBhZ2VYOwogICAgICAgICAgICBldnQucGFnZVkgPSBldi5wYWdlWTsKICAgICAgICAgICAgcGxvdC50YXJnZXQudHJpZ2dlcihldnQsIGlucyk7CiAgICAgICAgfQogICAgfQogICAgCiAgICBmdW5jdGlvbiBoYW5kbGVSaWdodENsaWNrKGV2LCBncmlkcG9zLCBkYXRhcG9zLCBuZWlnaGJvciwgcGxvdCkgewogICAgICAgIGlmIChuZWlnaGJvcikgewogICAgICAgICAgICB2YXIgc2kgPSBuZWlnaGJvci5zZXJpZXNJbmRleDsKICAgICAgICAgICAgdmFyIHBpID0gbmVpZ2hib3IucG9pbnRJbmRleDsKICAgICAgICAgICAgdmFyIGlucyA9IFtzaSwgcGksIG5laWdoYm9yLmRhdGEsIHBsb3Quc2VyaWVzW3NpXS5ncmlkRGF0YVtwaV1bMl1dOwogICAgICAgICAgICB2YXIgaWR4ID0gcGxvdC5wbHVnaW5zLmJ1YmJsZVJlbmRlcmVyLmhpZ2hsaWdodGVkU2VyaWVzSW5kZXg7CiAgICAgICAgICAgIGlmIChpZHggIT0gbnVsbCAmJiBwbG90LnNlcmllc1tpZHhdLmhpZ2hsaWdodE1vdXNlRG93bikgewogICAgICAgICAgICAgICAgdW5oaWdobGlnaHQocGxvdCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIGV2dCA9IGpRdWVyeS5FdmVudCgnanFwbG90RGF0YVJpZ2h0Q2xpY2snKTsKICAgICAgICAgICAgZXZ0LnBhZ2VYID0gZXYucGFnZVg7CiAgICAgICAgICAgIGV2dC5wYWdlWSA9IGV2LnBhZ2VZOwogICAgICAgICAgICBwbG90LnRhcmdldC50cmlnZ2VyKGV2dCwgaW5zKTsKICAgICAgICB9CiAgICB9CiAgICAKICAgIC8vIGNhbGxlZCB3aXRoaW4gY29udGV4dCBvZiBwbG90CiAgICAvLyBjcmVhdGUgYSBjYW52YXMgd2hpY2ggd2UgY2FuIGRyYXcgb24uCiAgICAvLyBpbnNlcnQgaXQgYmVmb3JlIHRoZSBldmVudENhbnZhcywgc28gZXZlbnRDYW52YXMgd2lsbCBzdGlsbCBjYXB0dXJlIGV2ZW50cy4KICAgIGZ1bmN0aW9uIHBvc3RQbG90RHJhdygpIHsKICAgICAgICAvLyBNZW1vcnkgTGVha3MgcGF0Y2ggICAgCiAgICAgICAgaWYgKHRoaXMucGx1Z2lucy5idWJibGVSZW5kZXJlciAmJiB0aGlzLnBsdWdpbnMuYnViYmxlUmVuZGVyZXIuaGlnaGxpZ2h0Q2FudmFzKSB7CiAgICAgICAgICAgIHRoaXMucGx1Z2lucy5idWJibGVSZW5kZXJlci5oaWdobGlnaHRDYW52YXMucmVzZXRDYW52YXMoKTsKICAgICAgICAgICAgdGhpcy5wbHVnaW5zLmJ1YmJsZVJlbmRlcmVyLmhpZ2hsaWdodENhbnZhcyA9IG51bGw7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIHRoaXMucGx1Z2lucy5idWJibGVSZW5kZXJlciA9IHtoaWdobGlnaHRlZFNlcmllc0luZGV4Om51bGx9OwogICAgICAgIHRoaXMucGx1Z2lucy5idWJibGVSZW5kZXJlci5oaWdobGlnaHRDYW52YXMgPSBuZXcgJC5qcXBsb3QuR2VuZXJpY0NhbnZhcygpOwogICAgICAgIHRoaXMucGx1Z2lucy5idWJibGVSZW5kZXJlci5oaWdobGlnaHRMYWJlbCA9IG51bGw7CiAgICAgICAgdGhpcy5wbHVnaW5zLmJ1YmJsZVJlbmRlcmVyLmhpZ2hsaWdodExhYmVsQ2FudmFzID0gJCgnPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7Ij48L2Rpdj4nKTsKICAgICAgICB2YXIgdG9wID0gdGhpcy5fZ3JpZFBhZGRpbmcudG9wOwogICAgICAgIHZhciBsZWZ0ID0gdGhpcy5fZ3JpZFBhZGRpbmcubGVmdDsKICAgICAgICB2YXIgd2lkdGggPSB0aGlzLl9wbG90RGltZW5zaW9ucy53aWR0aCAtIHRoaXMuX2dyaWRQYWRkaW5nLmxlZnQgLSB0aGlzLl9ncmlkUGFkZGluZy5yaWdodDsKICAgICAgICB2YXIgaGVpZ2h0ID0gdGhpcy5fcGxvdERpbWVuc2lvbnMuaGVpZ2h0IC0gdGhpcy5fZ3JpZFBhZGRpbmcudG9wIC0gdGhpcy5fZ3JpZFBhZGRpbmcuYm90dG9tOwogICAgICAgIHRoaXMucGx1Z2lucy5idWJibGVSZW5kZXJlci5oaWdobGlnaHRMYWJlbENhbnZhcy5jc3Moe3RvcDp0b3AsIGxlZnQ6bGVmdCwgd2lkdGg6d2lkdGgrJ3B4JywgaGVpZ2h0OmhlaWdodCsncHgnfSk7CgogICAgICAgIHRoaXMuZXZlbnRDYW52YXMuX2VsZW0uYmVmb3JlKHRoaXMucGx1Z2lucy5idWJibGVSZW5kZXJlci5oaWdobGlnaHRDYW52YXMuY3JlYXRlRWxlbWVudCh0aGlzLl9ncmlkUGFkZGluZywgJ2pxcGxvdC1idWJibGVSZW5kZXJlci1oaWdobGlnaHQtY2FudmFzJywgdGhpcy5fcGxvdERpbWVuc2lvbnMsIHRoaXMpKTsKICAgICAgICB0aGlzLmV2ZW50Q2FudmFzLl9lbGVtLmJlZm9yZSh0aGlzLnBsdWdpbnMuYnViYmxlUmVuZGVyZXIuaGlnaGxpZ2h0TGFiZWxDYW52YXMpOwogICAgICAgIAogICAgICAgIHZhciBoY3R4ID0gdGhpcy5wbHVnaW5zLmJ1YmJsZVJlbmRlcmVyLmhpZ2hsaWdodENhbnZhcy5zZXRDb250ZXh0KCk7CiAgICB9CgogICAgCiAgICAvLyBzZXR1cCBkZWZhdWx0IHJlbmRlcmVycyBmb3IgYXhlcyBhbmQgbGVnZW5kIHNvIHVzZXIgZG9lc24ndCBoYXZlIHRvCiAgICAvLyBjYWxsZWQgd2l0aCBzY29wZSBvZiBwbG90CiAgICBmdW5jdGlvbiBwcmVJbml0KHRhcmdldCwgZGF0YSwgb3B0aW9ucykgewogICAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OwogICAgICAgIG9wdGlvbnMuYXhlc0RlZmF1bHRzID0gb3B0aW9ucy5heGVzRGVmYXVsdHMgfHwge307CiAgICAgICAgb3B0aW9ucy5zZXJpZXNEZWZhdWx0cyA9IG9wdGlvbnMuc2VyaWVzRGVmYXVsdHMgfHwge307CiAgICAgICAgLy8gb25seSBzZXQgdGhlc2UgaWYgdGhlcmUgaXMgYSBCdWJibGUgc2VyaWVzCiAgICAgICAgdmFyIHNldG9wdHMgPSBmYWxzZTsKICAgICAgICBpZiAob3B0aW9ucy5zZXJpZXNEZWZhdWx0cy5yZW5kZXJlciA9PSAkLmpxcGxvdC5CdWJibGVSZW5kZXJlcikgewogICAgICAgICAgICBzZXRvcHRzID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAob3B0aW9ucy5zZXJpZXMpIHsKICAgICAgICAgICAgZm9yICh2YXIgaT0wOyBpIDwgb3B0aW9ucy5zZXJpZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnNlcmllc1tpXS5yZW5kZXJlciA9PSAkLmpxcGxvdC5CdWJibGVSZW5kZXJlcikgewogICAgICAgICAgICAgICAgICAgIHNldG9wdHMgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmIChzZXRvcHRzKSB7CiAgICAgICAgICAgIG9wdGlvbnMuYXhlc0RlZmF1bHRzLnJlbmRlcmVyID0gJC5qcXBsb3QuQnViYmxlQXhpc1JlbmRlcmVyOwogICAgICAgICAgICBvcHRpb25zLnNvcnREYXRhID0gZmFsc2U7CiAgICAgICAgfQogICAgfQogICAgCiAgICAkLmpxcGxvdC5wcmVJbml0SG9va3MucHVzaChwcmVJbml0KTsKICAgIAp9KShqUXVlcnkpOwogICAgCiAgICA=]]></data>
	</file>
	<file>
	  <filename>/src/plugins/jqplot.bubbleRenderer.min.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqCiAqIGpxUGxvdAogKiBQdXJlIEphdmFTY3JpcHQgcGxvdHRpbmcgcGx1Z2luIHVzaW5nIGpRdWVyeQogKgogKiBWZXJzaW9uOiAxLjAuMGIyX3IxMDEyCiAqCiAqIENvcHlyaWdodCAoYykgMjAwOS0yMDExIENocmlzIExlb25lbGxvCiAqIGpxUGxvdCBpcyBjdXJyZW50bHkgYXZhaWxhYmxlIGZvciB1c2UgaW4gYWxsIHBlcnNvbmFsIG9yIGNvbW1lcmNpYWwgcHJvamVjdHMgCiAqIHVuZGVyIGJvdGggdGhlIE1JVCAoaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHApIGFuZCBHUEwgCiAqIHZlcnNpb24gMi4wIChodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC5odG1sKSBsaWNlbnNlcy4gVGhpcyBtZWFucyB0aGF0IHlvdSBjYW4gCiAqIGNob29zZSB0aGUgbGljZW5zZSB0aGF0IGJlc3Qgc3VpdHMgeW91ciBwcm9qZWN0IGFuZCB1c2UgaXQgYWNjb3JkaW5nbHkuIAogKgogKiBBbHRob3VnaCBub3QgcmVxdWlyZWQsIHRoZSBhdXRob3Igd291bGQgYXBwcmVjaWF0ZSBhbiBlbWFpbCBsZXR0aW5nIGhpbSAKICoga25vdyBvZiBhbnkgc3Vic3RhbnRpYWwgdXNlIG9mIGpxUGxvdC4gIFlvdSBjYW4gcmVhY2ggdGhlIGF1dGhvciBhdDogCiAqIGNocmlzIGF0IGpxcGxvdCBkb3QgY29tIG9yIHNlZSBodHRwOi8vd3d3LmpxcGxvdC5jb20vaW5mby5waHAgLgogKgogKiBJZiB5b3UgYXJlIGZlZWxpbmcga2luZCBhbmQgZ2VuZXJvdXMsIGNvbnNpZGVyIHN1cHBvcnRpbmcgdGhlIHByb2plY3QgYnkKICogbWFraW5nIGEgZG9uYXRpb24gYXQ6IGh0dHA6Ly93d3cuanFwbG90LmNvbS9kb25hdGUucGhwIC4KICoKICogc3ByaW50ZiBmdW5jdGlvbnMgY29udGFpbmVkIGluIGpxcGxvdC5zcHJpbnRmLmpzIGJ5IEFzaCBTZWFybGU6CiAqCiAqICAgICB2ZXJzaW9uIDIwMDcuMDQuMjcKICogICAgIGF1dGhvciBBc2ggU2VhcmxlCiAqICAgICBodHRwOi8vaGV4bWVuLmNvbS9ibG9nLzIwMDcvMDMvcHJpbnRmLXNwcmludGYvCiAqICAgICBodHRwOi8vaGV4bWVuLmNvbS9qcy9zcHJpbnRmLmpzCiAqICAgICBUaGUgYXV0aG9yIChBc2ggU2VhcmxlKSBoYXMgcGxhY2VkIHRoaXMgY29kZSBpbiB0aGUgcHVibGljIGRvbWFpbjoKICogICAgICJUaGlzIGNvZGUgaXMgdW5yZXN0cmljdGVkOiB5b3UgYXJlIGZyZWUgdG8gdXNlIGl0IGhvd2V2ZXIgeW91IGxpa2UuIgogKgogKiBpbmNsdWRlZCBqc0RhdGUgbGlicmFyeSBieSBDaHJpcyBMZW9uZWxsbzoKICoKICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEgQ2hyaXMgTGVvbmVsbG8KICoKICoganNEYXRlIGlzIGN1cnJlbnRseSBhdmFpbGFibGUgZm9yIHVzZSBpbiBhbGwgcGVyc29uYWwgb3IgY29tbWVyY2lhbCBwcm9qZWN0cyAKICogdW5kZXIgYm90aCB0aGUgTUlUIGFuZCBHUEwgdmVyc2lvbiAyLjAgbGljZW5zZXMuIFRoaXMgbWVhbnMgdGhhdCB5b3UgY2FuIAogKiBjaG9vc2UgdGhlIGxpY2Vuc2UgdGhhdCBiZXN0IHN1aXRzIHlvdXIgcHJvamVjdCBhbmQgdXNlIGl0IGFjY29yZGluZ2x5LgogKgogKiBqc0RhdGUgYm9ycm93cyBtYW55IGNvbmNlcHRzIGFuZCBpZGVhcyBmcm9tIHRoZSBEYXRlIEluc3RhbmNlIAogKiBNZXRob2RzIGJ5IEtlbiBTbnlkZXIgYWxvbmcgd2l0aCBzb21lIHBhcnRzIG9mIEtlbidzIGFjdHVhbCBjb2RlLgogKiAKICogS2VuJ3Mgb3JpZ2lhbmwgRGF0ZSBJbnN0YW5jZSBNZXRob2RzIGFuZCBjb3B5cmlnaHQgbm90aWNlOgogKiAKICogS2VuIFNueWRlciAoa2VuIGQgc255ZGVyIGF0IGdtYWlsIGRvdCBjb20pCiAqIDIwMDgtMDktMTAKICogdmVyc2lvbiAyLjAuMiAoaHR0cDovL2tlbmRzbnlkZXIuY29tL3NhbmRib3gvZGF0ZS8pICAgICAKICogQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbiBMaWNlbnNlIDMuMCAoaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnkvMy4wLykKICoKICoganFwbG90VG9JbWFnZSBmdW5jdGlvbiBiYXNlZCBvbiBMYXJyeSBTaWRlbidzIGV4cG9ydC1qcXBsb3QtdG8tcG5nLmpzLgogKiBMYXJyeSBoYXMgZ2VuZXJvdXNseSBnaXZlbiBwZXJtaXNzaW9uIHRvIGFkYXB0IGhpcyBjb2RlIGZvciBpbmNsdXNpb24KICogaW50byBqcVBsb3QuCiAqCiAqIExhcnJ5J3Mgb3JpZ2luYWwgY29kZSBjYW4gYmUgZm91bmQgaGVyZToKICoKICogaHR0cHM6Ly9naXRodWIuY29tL2xzaWRlbi9leHBvcnQtanFwbG90LXRvLXBuZwogKiAKICogCiAqLwooZnVuY3Rpb24oZil7dmFyIGQ9ZnVuY3Rpb24obSl7cmV0dXJuIE1hdGgubWF4LmFwcGx5KE1hdGgsbSl9O3ZhciBqPWZ1bmN0aW9uKG0pe3JldHVybiBNYXRoLm1pbi5hcHBseShNYXRoLG0pfTtmLmpxcGxvdC5CdWJibGVSZW5kZXJlcj1mdW5jdGlvbigpe2YuanFwbG90LkxpbmVSZW5kZXJlci5jYWxsKHRoaXMpfTtmLmpxcGxvdC5CdWJibGVSZW5kZXJlci5wcm90b3R5cGU9bmV3IGYuanFwbG90LkxpbmVSZW5kZXJlcigpO2YuanFwbG90LkJ1YmJsZVJlbmRlcmVyLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1mLmpxcGxvdC5CdWJibGVSZW5kZXJlcjtmLmpxcGxvdC5CdWJibGVSZW5kZXJlci5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbih3LHQpe3RoaXMudmFyeUJ1YmJsZUNvbG9ycz10cnVlO3RoaXMuYXV0b3NjYWxlQnViYmxlcz10cnVlO3RoaXMuYXV0b3NjYWxlTXVsdGlwbGllcj0xO3RoaXMuYXV0b3NjYWxlUG9pbnRzRmFjdG9yPS0wLjA3O3RoaXMuZXNjYXBlSHRtbD10cnVlO3RoaXMuaGlnaGxpZ2h0TW91c2VPdmVyPXRydWU7dGhpcy5oaWdobGlnaHRNb3VzZURvd249ZmFsc2U7dGhpcy5oaWdobGlnaHRDb2xvcnM9W107dGhpcy5idWJibGVBbHBoYT0xO3RoaXMuaGlnaGxpZ2h0QWxwaGE9bnVsbDt0aGlzLmJ1YmJsZUdyYWRpZW50cz1mYWxzZTt0aGlzLnNob3dMYWJlbHM9dHJ1ZTt0aGlzLnJhZGlpPVtdO3RoaXMubWF4UmFkaXVzPTA7dGhpcy5faGlnaGxpZ2h0ZWRQb2ludD1udWxsO3RoaXMubGFiZWxzPVtdO3RoaXMuYnViYmxlQ2FudmFzZXM9W107dGhpcy5fdHlwZT0iYnViYmxlIjtpZih3LmhpZ2hsaWdodE1vdXNlRG93biYmdy5oaWdobGlnaHRNb3VzZU92ZXI9PW51bGwpe3cuaGlnaGxpZ2h0TW91c2VPdmVyPWZhbHNlfWYuZXh0ZW5kKHRydWUsdGhpcyx3KTtpZih0aGlzLmhpZ2hsaWdodEFscGhhPT1udWxsKXt0aGlzLmhpZ2hsaWdodEFscGhhPXRoaXMuYnViYmxlQWxwaGE7aWYodGhpcy5idWJibGVHcmFkaWVudHMpe3RoaXMuaGlnaGxpZ2h0QWxwaGE9MC4zNX19dGhpcy5hdXRvc2NhbGVNdWx0aXBsaWVyPXRoaXMuYXV0b3NjYWxlTXVsdGlwbGllcipNYXRoLnBvdyh0aGlzLmRhdGEubGVuZ3RoLHRoaXMuYXV0b3NjYWxlUG9pbnRzRmFjdG9yKTt0aGlzLl9oaWdobGlnaHRlZFBvaW50PW51bGw7dmFyIG47Zm9yKHZhciByPTA7cjx0aGlzLmRhdGEubGVuZ3RoO3IrKyl7dmFyIHA9bnVsbDt2YXIgdj10aGlzLmRhdGFbcl07dGhpcy5tYXhSYWRpdXM9TWF0aC5tYXgodGhpcy5tYXhSYWRpdXMsdlsyXSk7aWYodlszXSl7aWYodHlwZW9mKHZbM10pPT0ib2JqZWN0Iil7cD12WzNdWyJjb2xvciJdfX1pZihwPT1udWxsKXtpZih0aGlzLnNlcmllc0NvbG9yc1tyXSE9bnVsbCl7cD10aGlzLnNlcmllc0NvbG9yc1tyXX19aWYocCYmdGhpcy5idWJibGVBbHBoYTwxKXtuPWYuanFwbG90LmdldENvbG9yQ29tcG9uZW50cyhwKTtwPSJyZ2JhKCIrblswXSsiLCAiK25bMV0rIiwgIituWzJdKyIsICIrdGhpcy5idWJibGVBbHBoYSsiKSJ9aWYocCl7dGhpcy5zZXJpZXNDb2xvcnNbcl09cH19aWYoIXRoaXMudmFyeUJ1YmJsZUNvbG9ycyl7dGhpcy5zZXJpZXNDb2xvcnM9W3RoaXMuY29sb3JdfXRoaXMuY29sb3JHZW5lcmF0b3I9bmV3IGYuanFwbG90LkNvbG9yR2VuZXJhdG9yKHRoaXMuc2VyaWVzQ29sb3JzKTtpZih0aGlzLmhpZ2hsaWdodENvbG9ycy5sZW5ndGg9PTApe2Zvcih2YXIgcj0wO3I8dGhpcy5zZXJpZXNDb2xvcnMubGVuZ3RoO3IrKyl7dmFyIG89Zi5qcXBsb3QuZ2V0Q29sb3JDb21wb25lbnRzKHRoaXMuc2VyaWVzQ29sb3JzW3JdKTt2YXIgdT1bb1swXSxvWzFdLG9bMl1dO3ZhciBzPXVbMF0rdVsxXSt1WzJdO2Zvcih2YXIgcT0wO3E8MztxKyspe3VbcV09KHM+NTcwKT91W3FdKjAuODp1W3FdKzAuMyooMjU1LXVbcV0pO3VbcV09cGFyc2VJbnQodVtxXSwxMCl9dGhpcy5oaWdobGlnaHRDb2xvcnMucHVzaCgicmdiYSgiK3VbMF0rIiwiK3VbMV0rIiwiK3VbMl0rIiwgIit0aGlzLmhpZ2hsaWdodEFscGhhKyIpIil9fXRoaXMuaGlnaGxpZ2h0Q29sb3JHZW5lcmF0b3I9bmV3IGYuanFwbG90LkNvbG9yR2VuZXJhdG9yKHRoaXMuaGlnaGxpZ2h0Q29sb3JzKTt2YXIgbT17ZmlsbDp0cnVlLGlzYXJjOnRydWUsYW5nbGU6dGhpcy5zaGFkb3dBbmdsZSxhbHBoYTp0aGlzLnNoYWRvd0FscGhhLGNsb3NlUGF0aDp0cnVlfTt0aGlzLnJlbmRlcmVyLnNoYWRvd1JlbmRlcmVyLmluaXQobSk7dGhpcy5jYW52YXM9bmV3IGYuanFwbG90LkRpdkNhbnZhcygpO3RoaXMuY2FudmFzLl9wbG90RGltZW5zaW9ucz10aGlzLl9wbG90RGltZW5zaW9uczt0LmV2ZW50TGlzdGVuZXJIb29rcy5hZGRPbmNlKCJqcXBsb3RNb3VzZU1vdmUiLGEpO3QuZXZlbnRMaXN0ZW5lckhvb2tzLmFkZE9uY2UoImpxcGxvdE1vdXNlRG93biIsYik7dC5ldmVudExpc3RlbmVySG9va3MuYWRkT25jZSgianFwbG90TW91c2VVcCIsayk7dC5ldmVudExpc3RlbmVySG9va3MuYWRkT25jZSgianFwbG90Q2xpY2siLGcpO3QuZXZlbnRMaXN0ZW5lckhvb2tzLmFkZE9uY2UoImpxcGxvdFJpZ2h0Q2xpY2siLGwpO3QucG9zdERyYXdIb29rcy5hZGRPbmNlKGgpfTtmLmpxcGxvdC5CdWJibGVSZW5kZXJlci5wcm90b3R5cGUuc2V0R3JpZERhdGE9ZnVuY3Rpb24odyl7dmFyIHE9dGhpcy5feGF4aXMuc2VyaWVzX3UycDt2YXIgbT10aGlzLl95YXhpcy5zZXJpZXNfdTJwO3ZhciB0PXRoaXMuX3Bsb3REYXRhO3RoaXMuZ3JpZERhdGE9W107dmFyIHM9W107dGhpcy5yYWRpaT1bXTt2YXIgdj1NYXRoLm1pbih3Ll9oZWlnaHQsdy5fd2lkdGgpO2Zvcih2YXIgdT0wO3U8dGhpcy5kYXRhLmxlbmd0aDt1Kyspe2lmKHRbdV0hPW51bGwpe3RoaXMuZ3JpZERhdGEucHVzaChbcS5jYWxsKHRoaXMuX3hheGlzLHRbdV1bMF0pLG0uY2FsbCh0aGlzLl95YXhpcyx0W3VdWzFdKSx0W3VdWzJdXSk7dGhpcy5yYWRpaS5wdXNoKFt1LHRbdV1bMl1dKTtzLnB1c2godFt1XVsyXSl9fXZhciBuLG8seD10aGlzLm1heFJhZGl1cz1kKHMpO3ZhciBwPXRoaXMuZ3JpZERhdGEubGVuZ3RoO2lmKHRoaXMuYXV0b3NjYWxlQnViYmxlcyl7Zm9yKHZhciB1PTA7dTxwO3UrKyl7bz1zW3VdL3g7bj10aGlzLmF1dG9zY2FsZU11bHRpcGxpZXIqdi82O3RoaXMuZ3JpZERhdGFbdV1bMl09bipvfX10aGlzLnJhZGlpLnNvcnQoZnVuY3Rpb24oeSxyKXtyZXR1cm4gclsxXS15WzFdfSl9O2YuanFwbG90LkJ1YmJsZVJlbmRlcmVyLnByb3RvdHlwZS5tYWtlR3JpZERhdGE9ZnVuY3Rpb24odCx3KXt2YXIgcT10aGlzLl94YXhpcy5zZXJpZXNfdTJwO3ZhciBuPXRoaXMuX3lheGlzLnNlcmllc191MnA7dmFyIHg9W107dmFyIHM9W107dGhpcy5yYWRpaT1bXTt2YXIgdj1NYXRoLm1pbih3Ll9oZWlnaHQsdy5fd2lkdGgpO2Zvcih2YXIgdT0wO3U8dC5sZW5ndGg7dSsrKXtpZih0W3VdIT1udWxsKXt4LnB1c2goW3EuY2FsbCh0aGlzLl94YXhpcyx0W3VdWzBdKSxuLmNhbGwodGhpcy5feWF4aXMsdFt1XVsxXSksdFt1XVsyXV0pO3MucHVzaCh0W3VdWzJdKTt0aGlzLnJhZGlpLnB1c2goW3UsdFt1XVsyXV0pfX12YXIgbSxvLHk9dGhpcy5tYXhSYWRpdXM9ZChzKTt2YXIgcD10aGlzLmdyaWREYXRhLmxlbmd0aDtpZih0aGlzLmF1dG9zY2FsZUJ1YmJsZXMpe2Zvcih2YXIgdT0wO3U8cDt1Kyspe289c1t1XS95O209dGhpcy5hdXRvc2NhbGVNdWx0aXBsaWVyKnYvNjt4W3VdWzJdPW0qb319dGhpcy5yYWRpaS5zb3J0KGZ1bmN0aW9uKHoscil7cmV0dXJuIHJbMV0telsxXX0pO3JldHVybiB4fTtmLmpxcGxvdC5CdWJibGVSZW5kZXJlci5wcm90b3R5cGUuZHJhdz1mdW5jdGlvbihELEosbil7aWYodGhpcy5wbHVnaW5zLnBvaW50TGFiZWxzKXt0aGlzLnBsdWdpbnMucG9pbnRMYWJlbHMuc2hvdz1mYWxzZX12YXIgQT0obiE9dW5kZWZpbmVkKT9uOnt9O3ZhciByPShBLnNoYWRvdyE9dW5kZWZpbmVkKT9BLnNoYWRvdzp0aGlzLnNoYWRvdzt0aGlzLmNhbnZhcy5fZWxlbS5lbXB0eSgpO2Zvcih2YXIgRz0wO0c8dGhpcy5yYWRpaS5sZW5ndGg7RysrKXt2YXIgQz10aGlzLnJhZGlpW0ddWzBdO3ZhciB6PW51bGw7dmFyIEY9bnVsbDt2YXIgbT1udWxsO3ZhciBwPW51bGw7dmFyIEk9dGhpcy5kYXRhW0NdO3ZhciBKPXRoaXMuZ3JpZERhdGFbQ107aWYoSVszXSl7aWYodHlwZW9mKElbM10pPT0ib2JqZWN0Iil7ej1JWzNdWyJsYWJlbCJdfWVsc2V7aWYodHlwZW9mKElbM10pPT0ic3RyaW5nIil7ej1JWzNdfX19Rj10aGlzLmNvbG9yR2VuZXJhdG9yLmdldChDKTt2YXIgRT1KWzJdO3ZhciBxLEs7aWYodGhpcy5zaGFkb3cpe3E9KDAuNytKWzJdLzQwKS50b0ZpeGVkKDEpO0s9MStNYXRoLmNlaWwoSlsyXS8xNSk7RSs9cSpLfXRoaXMuYnViYmxlQ2FudmFzZXNbQ109bmV3IGYuanFwbG90LkJ1YmJsZUNhbnZhcygpO3RoaXMuY2FudmFzLl9lbGVtLmFwcGVuZCh0aGlzLmJ1YmJsZUNhbnZhc2VzW0NdLmNyZWF0ZUVsZW1lbnQoSlswXSxKWzFdLEUpKTt0aGlzLmJ1YmJsZUNhbnZhc2VzW0NdLnNldENvbnRleHQoKTt2YXIgRD10aGlzLmJ1YmJsZUNhbnZhc2VzW0NdLl9jdHg7dmFyIHU9RC5jYW52YXMud2lkdGgvMjt2YXIgcz1ELmNhbnZhcy5oZWlnaHQvMjtpZih0aGlzLnNoYWRvdyl7dGhpcy5yZW5kZXJlci5zaGFkb3dSZW5kZXJlci5kcmF3KEQsW3UscyxKWzJdLDAsMipNYXRoLlBJXSx7b2Zmc2V0OnEsZGVwdGg6S30pfXRoaXMuYnViYmxlQ2FudmFzZXNbQ10uZHJhdyhKWzJdLEYsdGhpcy5idWJibGVHcmFkaWVudHMsdGhpcy5zaGFkb3dBbmdsZS8xODAqTWF0aC5QSSk7aWYoeiYmdGhpcy5zaG93TGFiZWxzKXtwPWYoJzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlOyIgY2xhc3M9ImpxcGxvdC1idWJibGUtbGFiZWwiPjwvZGl2PicpO2lmKHRoaXMuZXNjYXBlSHRtbCl7cC50ZXh0KHopfWVsc2V7cC5odG1sKHopfXRoaXMuY2FudmFzLl9lbGVtLmFwcGVuZChwKTt2YXIgSD1mKHApLm91dGVySGVpZ2h0KCk7dmFyIHY9ZihwKS5vdXRlcldpZHRoKCk7dmFyIEI9SlsxXS0wLjUqSDt2YXIgbz1KWzBdLTAuNSp2O3AuY3NzKHt0b3A6QixsZWZ0Om99KTt0aGlzLmxhYmVsc1tDXT1mKHApfX19O2YuanFwbG90LkRpdkNhbnZhcz1mdW5jdGlvbigpe2YuanFwbG90LkVsZW1Db250YWluZXIuY2FsbCh0aGlzKTt0aGlzLl9jdHh9O2YuanFwbG90LkRpdkNhbnZhcy5wcm90b3R5cGU9bmV3IGYuanFwbG90LkVsZW1Db250YWluZXIoKTtmLmpxcGxvdC5EaXZDYW52YXMucHJvdG90eXBlLmNvbnN0cnVjdG9yPWYuanFwbG90LkRpdkNhbnZhcztmLmpxcGxvdC5EaXZDYW52YXMucHJvdG90eXBlLmNyZWF0ZUVsZW1lbnQ9ZnVuY3Rpb24ocyxwLG4pe3RoaXMuX29mZnNldHM9czt2YXIgbT0ianFwbG90LURpdkNhbnZhcyI7aWYocCE9dW5kZWZpbmVkKXttPXB9dmFyIHI7aWYodGhpcy5fZWxlbSl7cj10aGlzLl9lbGVtLmdldCgwKX1lbHNle3I9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iil9aWYobiE9dW5kZWZpbmVkKXt0aGlzLl9wbG90RGltZW5zaW9ucz1ufXZhciBvPXRoaXMuX3Bsb3REaW1lbnNpb25zLndpZHRoLXRoaXMuX29mZnNldHMubGVmdC10aGlzLl9vZmZzZXRzLnJpZ2h0KyJweCI7dmFyIHE9dGhpcy5fcGxvdERpbWVuc2lvbnMuaGVpZ2h0LXRoaXMuX29mZnNldHMudG9wLXRoaXMuX29mZnNldHMuYm90dG9tKyJweCI7dGhpcy5fZWxlbT1mKHIpO3RoaXMuX2VsZW0uY3NzKHtwb3NpdGlvbjoiYWJzb2x1dGUiLHdpZHRoOm8saGVpZ2h0OnEsbGVmdDp0aGlzLl9vZmZzZXRzLmxlZnQsdG9wOnRoaXMuX29mZnNldHMudG9wfSk7dGhpcy5fZWxlbS5hZGRDbGFzcyhtKTtyZXR1cm4gdGhpcy5fZWxlbX07Zi5qcXBsb3QuRGl2Q2FudmFzLnByb3RvdHlwZS5zZXRDb250ZXh0PWZ1bmN0aW9uKCl7dGhpcy5fY3R4PXtjYW52YXM6e3dpZHRoOjAsaGVpZ2h0OjB9LGNsZWFyUmVjdDpmdW5jdGlvbigpe3JldHVybiBudWxsfX07cmV0dXJuIHRoaXMuX2N0eH07Zi5qcXBsb3QuQnViYmxlQ2FudmFzPWZ1bmN0aW9uKCl7Zi5qcXBsb3QuRWxlbUNvbnRhaW5lci5jYWxsKHRoaXMpO3RoaXMuX2N0eH07Zi5qcXBsb3QuQnViYmxlQ2FudmFzLnByb3RvdHlwZT1uZXcgZi5qcXBsb3QuRWxlbUNvbnRhaW5lcigpO2YuanFwbG90LkJ1YmJsZUNhbnZhcy5wcm90b3R5cGUuY29uc3RydWN0b3I9Zi5qcXBsb3QuQnViYmxlQ2FudmFzO2YuanFwbG90LkJ1YmJsZUNhbnZhcy5wcm90b3R5cGUuY3JlYXRlRWxlbWVudD1mdW5jdGlvbihuLHUscyl7dmFyIG09ImpxcGxvdC1idWJibGUtcG9pbnQiO3ZhciBxO2lmKHRoaXMuX2VsZW0pe3E9dGhpcy5fZWxlbS5nZXQoMCl9ZWxzZXtxPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpfXEud2lkdGg9KHMhPW51bGwpPzIqczpxLndpZHRoO3EuaGVpZ2h0PShzIT1udWxsKT8yKnM6cS5oZWlnaHQ7dGhpcy5fZWxlbT1mKHEpO3ZhciBvPShuIT1udWxsJiZzIT1udWxsKT9uLXM6dGhpcy5fZWxlbS5jc3MoImxlZnQiKTt2YXIgcD0odSE9bnVsbCYmcyE9bnVsbCk/dS1zOnRoaXMuX2VsZW0uY3NzKCJ0b3AiKTt0aGlzLl9lbGVtLmNzcyh7cG9zaXRpb246ImFic29sdXRlIixsZWZ0Om8sdG9wOnB9KTt0aGlzLl9lbGVtLmFkZENsYXNzKG0pO2lmKGYuanFwbG90LnVzZV9leGNhbnZhcyl7d2luZG93Lkdfdm1sQ2FudmFzTWFuYWdlci5pbml0Xyhkb2N1bWVudCk7cT13aW5kb3cuR192bWxDYW52YXNNYW5hZ2VyLmluaXRFbGVtZW50KHEpfXJldHVybiB0aGlzLl9lbGVtfTtmLmpxcGxvdC5CdWJibGVDYW52YXMucHJvdG90eXBlLmRyYXc9ZnVuY3Rpb24obSxzLHYscCl7dmFyIEQ9dGhpcy5fY3R4O3ZhciBCPUQuY2FudmFzLndpZHRoLzI7dmFyIHo9RC5jYW52YXMuaGVpZ2h0LzI7RC5zYXZlKCk7aWYodiYmIWYuanFwbG90LnVzZV9leGNhbnZhcyl7bT1tKjEuMDQ7dmFyIG89Zi5qcXBsb3QuZ2V0Q29sb3JDb21wb25lbnRzKHMpO3ZhciB1PSJyZ2JhKCIrTWF0aC5yb3VuZChvWzBdKzAuOCooMjU1LW9bMF0pKSsiLCAiK01hdGgucm91bmQob1sxXSswLjgqKDI1NS1vWzFdKSkrIiwgIitNYXRoLnJvdW5kKG9bMl0rMC44KigyNTUtb1syXSkpKyIsICIrb1szXSsiKSI7dmFyIHQ9InJnYmEoIitvWzBdKyIsICIrb1sxXSsiLCAiK29bMl0rIiwgMCkiO3ZhciBDPTAuMzUqbTt2YXIgQT1CLU1hdGguY29zKHApKjAuMzMqbTt2YXIgbj16LU1hdGguc2luKHApKjAuMzMqbTt2YXIgdz1ELmNyZWF0ZVJhZGlhbEdyYWRpZW50KEEsbixDLEIseixtKTt3LmFkZENvbG9yU3RvcCgwLHUpO3cuYWRkQ29sb3JTdG9wKDAuOTMscyk7dy5hZGRDb2xvclN0b3AoMC45Nix0KTt3LmFkZENvbG9yU3RvcCgxLHQpO0QuZmlsbFN0eWxlPXc7RC5maWxsUmVjdCgwLDAsRC5jYW52YXMud2lkdGgsRC5jYW52YXMuaGVpZ2h0KX1lbHNle0QuZmlsbFN0eWxlPXM7RC5zdHJva2VTdHlsZT1zO0QubGluZVdpZHRoPTE7RC5iZWdpblBhdGgoKTt2YXIgcT0yKk1hdGguUEk7RC5hcmMoQix6LG0sMCxxLDApO0QuY2xvc2VQYXRoKCk7RC5maWxsKCl9RC5yZXN0b3JlKCl9O2YuanFwbG90LkJ1YmJsZUNhbnZhcy5wcm90b3R5cGUuc2V0Q29udGV4dD1mdW5jdGlvbigpe3RoaXMuX2N0eD10aGlzLl9lbGVtLmdldCgwKS5nZXRDb250ZXh0KCIyZCIpO3JldHVybiB0aGlzLl9jdHh9O2YuanFwbG90LkJ1YmJsZUF4aXNSZW5kZXJlcj1mdW5jdGlvbigpe2YuanFwbG90LkxpbmVhckF4aXNSZW5kZXJlci5jYWxsKHRoaXMpfTtmLmpxcGxvdC5CdWJibGVBeGlzUmVuZGVyZXIucHJvdG90eXBlPW5ldyBmLmpxcGxvdC5MaW5lYXJBeGlzUmVuZGVyZXIoKTtmLmpxcGxvdC5CdWJibGVBeGlzUmVuZGVyZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yPWYuanFwbG90LkJ1YmJsZUF4aXNSZW5kZXJlcjtmLmpxcGxvdC5CdWJibGVBeGlzUmVuZGVyZXIucHJvdG90eXBlLmluaXQ9ZnVuY3Rpb24obil7Zi5leHRlbmQodHJ1ZSx0aGlzLG4pO3ZhciBJPXRoaXMuX2RhdGFCb3VuZHM7dmFyIEg9MCx2PTAsbT0wLHk9MCxxPTAscj0wLEQ9MCx0PTAsRj0wLHo9MDtmb3IodmFyIEU9MDtFPHRoaXMuX3Nlcmllcy5sZW5ndGg7RSsrKXt2YXIgeD10aGlzLl9zZXJpZXNbRV07dmFyIEc9eC5fcGxvdERhdGE7Zm9yKHZhciBCPTA7QjxHLmxlbmd0aDtCKyspe2lmKHRoaXMubmFtZT09InhheGlzInx8dGhpcy5uYW1lPT0ieDJheGlzIil7aWYoR1tCXVswXTxJLm1pbnx8SS5taW49PW51bGwpe0kubWluPUdbQl1bMF07SD1FO3Y9QjtyPUdbQl1bMl07RD14Lm1heFJhZGl1czt6PXguYXV0b3NjYWxlTXVsdGlwbGllcn1pZihHW0JdWzBdPkkubWF4fHxJLm1heD09bnVsbCl7SS5tYXg9R1tCXVswXTttPUU7eT1CO3E9R1tCXVsyXTt0PXgubWF4UmFkaXVzO0Y9eC5hdXRvc2NhbGVNdWx0aXBsaWVyfX1lbHNle2lmKEdbQl1bMV08SS5taW58fEkubWluPT1udWxsKXtJLm1pbj1HW0JdWzFdO0g9RTt2PUI7cj1HW0JdWzJdO0Q9eC5tYXhSYWRpdXM7ej14LmF1dG9zY2FsZU11bHRpcGxpZXJ9aWYoR1tCXVsxXT5JLm1heHx8SS5tYXg9PW51bGwpe0kubWF4PUdbQl1bMV07bT1FO3k9QjtxPUdbQl1bMl07dD14Lm1heFJhZGl1cztGPXguYXV0b3NjYWxlTXVsdGlwbGllcn19fX12YXIgbz1yL0Q7dmFyIHc9cS90O3ZhciBDPUkubWF4LUkubWluO3ZhciBBPU1hdGgubWluKHRoaXMuX3Bsb3REaW1lbnNpb25zLndpZHRoLHRoaXMuX3Bsb3REaW1lbnNpb25zLmhlaWdodCk7dmFyIHA9byp6LzMqQzt2YXIgdT13KkYvMypDO0kubWF4Kz11O0kubWluLT1wfTtmdW5jdGlvbiBlKHAsdixxKXtwLnBsdWdpbnMuYnViYmxlUmVuZGVyZXIuaGlnaGxpZ2h0TGFiZWxDYW52YXMuZW1wdHkoKTt2YXIgej1wLnNlcmllc1t2XTt2YXIgbj1wLnBsdWdpbnMuYnViYmxlUmVuZGVyZXIuaGlnaGxpZ2h0Q2FudmFzO3ZhciB3PW4uX2N0eDt3LmNsZWFyUmVjdCgwLDAsdy5jYW52YXMud2lkdGgsdy5jYW52YXMuaGVpZ2h0KTt6Ll9oaWdobGlnaHRlZFBvaW50PXE7cC5wbHVnaW5zLmJ1YmJsZVJlbmRlcmVyLmhpZ2hsaWdodGVkU2VyaWVzSW5kZXg9djt2YXIgbz16LmhpZ2hsaWdodENvbG9yR2VuZXJhdG9yLmdldChxKTt2YXIgdT16LmdyaWREYXRhW3FdWzBdLHQ9ei5ncmlkRGF0YVtxXVsxXSxtPXouZ3JpZERhdGFbcV1bMl07dy5zYXZlKCk7dy5maWxsU3R5bGU9bzt3LnN0cm9rZVN0eWxlPW87dy5saW5lV2lkdGg9MTt3LmJlZ2luUGF0aCgpO3cuYXJjKHUsdCxtLDAsMipNYXRoLlBJLDApO3cuY2xvc2VQYXRoKCk7dy5maWxsKCk7dy5yZXN0b3JlKCk7aWYoei5sYWJlbHNbcV0pe3AucGx1Z2lucy5idWJibGVSZW5kZXJlci5oaWdobGlnaHRMYWJlbD16LmxhYmVsc1txXS5jbG9uZSgpO3AucGx1Z2lucy5idWJibGVSZW5kZXJlci5oaWdobGlnaHRMYWJlbC5hcHBlbmRUbyhwLnBsdWdpbnMuYnViYmxlUmVuZGVyZXIuaGlnaGxpZ2h0TGFiZWxDYW52YXMpO3AucGx1Z2lucy5idWJibGVSZW5kZXJlci5oaWdobGlnaHRMYWJlbC5hZGRDbGFzcygianFwbG90LWJ1YmJsZS1sYWJlbC1oaWdobGlnaHQiKX19ZnVuY3Rpb24gaShwKXt2YXIgbT1wLnBsdWdpbnMuYnViYmxlUmVuZGVyZXIuaGlnaGxpZ2h0Q2FudmFzO3ZhciBvPXAucGx1Z2lucy5idWJibGVSZW5kZXJlci5oaWdobGlnaHRlZFNlcmllc0luZGV4O3AucGx1Z2lucy5idWJibGVSZW5kZXJlci5oaWdobGlnaHRMYWJlbENhbnZhcy5lbXB0eSgpO20uX2N0eC5jbGVhclJlY3QoMCwwLG0uX2N0eC5jYW52YXMud2lkdGgsbS5fY3R4LmNhbnZhcy5oZWlnaHQpO2Zvcih2YXIgbj0wO248cC5zZXJpZXMubGVuZ3RoO24rKyl7cC5zZXJpZXNbbl0uX2hpZ2hsaWdodGVkUG9pbnQ9bnVsbH1wLnBsdWdpbnMuYnViYmxlUmVuZGVyZXIuaGlnaGxpZ2h0ZWRTZXJpZXNJbmRleD1udWxsO3AudGFyZ2V0LnRyaWdnZXIoImpxcGxvdERhdGFVbmhpZ2hsaWdodCIpfWZ1bmN0aW9uIGEocyxwLG0sdixyKXtpZih2KXt2YXIgbj12LnNlcmllc0luZGV4O3ZhciBvPXYucG9pbnRJbmRleDt2YXIgcT1bbixvLHYuZGF0YSxyLnNlcmllc1tuXS5ncmlkRGF0YVtvXVsyXV07dmFyIHQ9alF1ZXJ5LkV2ZW50KCJqcXBsb3REYXRhTW91c2VPdmVyIik7dC5wYWdlWD1zLnBhZ2VYO3QucGFnZVk9cy5wYWdlWTtyLnRhcmdldC50cmlnZ2VyKHQscSk7aWYoci5zZXJpZXNbcVswXV0uaGlnaGxpZ2h0TW91c2VPdmVyJiYhKHFbMF09PXIucGx1Z2lucy5idWJibGVSZW5kZXJlci5oaWdobGlnaHRlZFNlcmllc0luZGV4JiZxWzFdPT1yLnNlcmllc1txWzBdXS5faGlnaGxpZ2h0ZWRQb2ludCkpe3ZhciB1PWpRdWVyeS5FdmVudCgianFwbG90RGF0YUhpZ2hsaWdodCIpO3UucGFnZVg9cy5wYWdlWDt1LnBhZ2VZPXMucGFnZVk7ci50YXJnZXQudHJpZ2dlcih1LHEpO2UocixxWzBdLHFbMV0pfX1lbHNle2lmKHY9PW51bGwpe2kocil9fX1mdW5jdGlvbiBiKHMscCxtLHUscil7aWYodSl7dmFyIG49dS5zZXJpZXNJbmRleDt2YXIgbz11LnBvaW50SW5kZXg7dmFyIHE9W24sbyx1LmRhdGEsci5zZXJpZXNbbl0uZ3JpZERhdGFbb11bMl1dO2lmKHIuc2VyaWVzW3FbMF1dLmhpZ2hsaWdodE1vdXNlRG93biYmIShxWzBdPT1yLnBsdWdpbnMuYnViYmxlUmVuZGVyZXIuaGlnaGxpZ2h0ZWRTZXJpZXNJbmRleCYmcVsxXT09ci5zZXJpZXNbcVswXV0uX2hpZ2hsaWdodGVkUG9pbnQpKXt2YXIgdD1qUXVlcnkuRXZlbnQoImpxcGxvdERhdGFIaWdobGlnaHQiKTt0LnBhZ2VYPXMucGFnZVg7dC5wYWdlWT1zLnBhZ2VZO3IudGFyZ2V0LnRyaWdnZXIodCxxKTtlKHIscVswXSxxWzFdKX19ZWxzZXtpZih1PT1udWxsKXtpKHIpfX19ZnVuY3Rpb24gayhvLG4scixxLHApe3ZhciBtPXAucGx1Z2lucy5idWJibGVSZW5kZXJlci5oaWdobGlnaHRlZFNlcmllc0luZGV4O2lmKG0hPW51bGwmJnAuc2VyaWVzW21dLmhpZ2hsaWdodE1vdXNlRG93bil7aShwKX19ZnVuY3Rpb24gZyhzLHAsbSx1LHIpe2lmKHUpe3ZhciBuPXUuc2VyaWVzSW5kZXg7dmFyIG89dS5wb2ludEluZGV4O3ZhciBxPVtuLG8sdS5kYXRhLHIuc2VyaWVzW25dLmdyaWREYXRhW29dWzJdXTt2YXIgdD1qUXVlcnkuRXZlbnQoImpxcGxvdERhdGFDbGljayIpO3QucGFnZVg9cy5wYWdlWDt0LnBhZ2VZPXMucGFnZVk7ci50YXJnZXQudHJpZ2dlcih0LHEpfX1mdW5jdGlvbiBsKHMscCxtLHYscil7aWYodil7dmFyIG49di5zZXJpZXNJbmRleDt2YXIgbz12LnBvaW50SW5kZXg7dmFyIHE9W24sbyx2LmRhdGEsci5zZXJpZXNbbl0uZ3JpZERhdGFbb11bMl1dO3ZhciB0PXIucGx1Z2lucy5idWJibGVSZW5kZXJlci5oaWdobGlnaHRlZFNlcmllc0luZGV4O2lmKHQhPW51bGwmJnIuc2VyaWVzW3RdLmhpZ2hsaWdodE1vdXNlRG93bil7aShyKX12YXIgdT1qUXVlcnkuRXZlbnQoImpxcGxvdERhdGFSaWdodENsaWNrIik7dS5wYWdlWD1zLnBhZ2VYO3UucGFnZVk9cy5wYWdlWTtyLnRhcmdldC50cmlnZ2VyKHUscSl9fWZ1bmN0aW9uIGgoKXtpZih0aGlzLnBsdWdpbnMuYnViYmxlUmVuZGVyZXImJnRoaXMucGx1Z2lucy5idWJibGVSZW5kZXJlci5oaWdobGlnaHRDYW52YXMpe3RoaXMucGx1Z2lucy5idWJibGVSZW5kZXJlci5oaWdobGlnaHRDYW52YXMucmVzZXRDYW52YXMoKTt0aGlzLnBsdWdpbnMuYnViYmxlUmVuZGVyZXIuaGlnaGxpZ2h0Q2FudmFzPW51bGx9dGhpcy5wbHVnaW5zLmJ1YmJsZVJlbmRlcmVyPXtoaWdobGlnaHRlZFNlcmllc0luZGV4Om51bGx9O3RoaXMucGx1Z2lucy5idWJibGVSZW5kZXJlci5oaWdobGlnaHRDYW52YXM9bmV3IGYuanFwbG90LkdlbmVyaWNDYW52YXMoKTt0aGlzLnBsdWdpbnMuYnViYmxlUmVuZGVyZXIuaGlnaGxpZ2h0TGFiZWw9bnVsbDt0aGlzLnBsdWdpbnMuYnViYmxlUmVuZGVyZXIuaGlnaGxpZ2h0TGFiZWxDYW52YXM9ZignPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7Ij48L2Rpdj4nKTt2YXIgcT10aGlzLl9ncmlkUGFkZGluZy50b3A7dmFyIHA9dGhpcy5fZ3JpZFBhZGRpbmcubGVmdDt2YXIgbj10aGlzLl9wbG90RGltZW5zaW9ucy53aWR0aC10aGlzLl9ncmlkUGFkZGluZy5sZWZ0LXRoaXMuX2dyaWRQYWRkaW5nLnJpZ2h0O3ZhciBtPXRoaXMuX3Bsb3REaW1lbnNpb25zLmhlaWdodC10aGlzLl9ncmlkUGFkZGluZy50b3AtdGhpcy5fZ3JpZFBhZGRpbmcuYm90dG9tO3RoaXMucGx1Z2lucy5idWJibGVSZW5kZXJlci5oaWdobGlnaHRMYWJlbENhbnZhcy5jc3Moe3RvcDpxLGxlZnQ6cCx3aWR0aDpuKyJweCIsaGVpZ2h0Om0rInB4In0pO3RoaXMuZXZlbnRDYW52YXMuX2VsZW0uYmVmb3JlKHRoaXMucGx1Z2lucy5idWJibGVSZW5kZXJlci5oaWdobGlnaHRDYW52YXMuY3JlYXRlRWxlbWVudCh0aGlzLl9ncmlkUGFkZGluZywianFwbG90LWJ1YmJsZVJlbmRlcmVyLWhpZ2hsaWdodC1jYW52YXMiLHRoaXMuX3Bsb3REaW1lbnNpb25zLHRoaXMpKTt0aGlzLmV2ZW50Q2FudmFzLl9lbGVtLmJlZm9yZSh0aGlzLnBsdWdpbnMuYnViYmxlUmVuZGVyZXIuaGlnaGxpZ2h0TGFiZWxDYW52YXMpO3ZhciBvPXRoaXMucGx1Z2lucy5idWJibGVSZW5kZXJlci5oaWdobGlnaHRDYW52YXMuc2V0Q29udGV4dCgpfWZ1bmN0aW9uIGMocSxwLG4pe249bnx8e307bi5heGVzRGVmYXVsdHM9bi5heGVzRGVmYXVsdHN8fHt9O24uc2VyaWVzRGVmYXVsdHM9bi5zZXJpZXNEZWZhdWx0c3x8e307dmFyIG09ZmFsc2U7aWYobi5zZXJpZXNEZWZhdWx0cy5yZW5kZXJlcj09Zi5qcXBsb3QuQnViYmxlUmVuZGVyZXIpe209dHJ1ZX1lbHNle2lmKG4uc2VyaWVzKXtmb3IodmFyIG89MDtvPG4uc2VyaWVzLmxlbmd0aDtvKyspe2lmKG4uc2VyaWVzW29dLnJlbmRlcmVyPT1mLmpxcGxvdC5CdWJibGVSZW5kZXJlcil7bT10cnVlfX19fWlmKG0pe24uYXhlc0RlZmF1bHRzLnJlbmRlcmVyPWYuanFwbG90LkJ1YmJsZUF4aXNSZW5kZXJlcjtuLnNvcnREYXRhPWZhbHNlfX1mLmpxcGxvdC5wcmVJbml0SG9va3MucHVzaChjKX0pKGpRdWVyeSk7]]></data>
	</file>
	<file>
	  <filename>/src/plugins/jqplot.canvasAxisLabelRenderer.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqCiAqIGpxUGxvdAogKiBQdXJlIEphdmFTY3JpcHQgcGxvdHRpbmcgcGx1Z2luIHVzaW5nIGpRdWVyeQogKgogKiBWZXJzaW9uOiAxLjAuMGIyX3IxMDEyCiAqCiAqIENvcHlyaWdodCAoYykgMjAwOS0yMDExIENocmlzIExlb25lbGxvCiAqIGpxUGxvdCBpcyBjdXJyZW50bHkgYXZhaWxhYmxlIGZvciB1c2UgaW4gYWxsIHBlcnNvbmFsIG9yIGNvbW1lcmNpYWwgcHJvamVjdHMgCiAqIHVuZGVyIGJvdGggdGhlIE1JVCAoaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHApIGFuZCBHUEwgCiAqIHZlcnNpb24gMi4wIChodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC5odG1sKSBsaWNlbnNlcy4gVGhpcyBtZWFucyB0aGF0IHlvdSBjYW4gCiAqIGNob29zZSB0aGUgbGljZW5zZSB0aGF0IGJlc3Qgc3VpdHMgeW91ciBwcm9qZWN0IGFuZCB1c2UgaXQgYWNjb3JkaW5nbHkuIAogKgogKiBBbHRob3VnaCBub3QgcmVxdWlyZWQsIHRoZSBhdXRob3Igd291bGQgYXBwcmVjaWF0ZSBhbiBlbWFpbCBsZXR0aW5nIGhpbSAKICoga25vdyBvZiBhbnkgc3Vic3RhbnRpYWwgdXNlIG9mIGpxUGxvdC4gIFlvdSBjYW4gcmVhY2ggdGhlIGF1dGhvciBhdDogCiAqIGNocmlzIGF0IGpxcGxvdCBkb3QgY29tIG9yIHNlZSBodHRwOi8vd3d3LmpxcGxvdC5jb20vaW5mby5waHAgLgogKgogKiBJZiB5b3UgYXJlIGZlZWxpbmcga2luZCBhbmQgZ2VuZXJvdXMsIGNvbnNpZGVyIHN1cHBvcnRpbmcgdGhlIHByb2plY3QgYnkKICogbWFraW5nIGEgZG9uYXRpb24gYXQ6IGh0dHA6Ly93d3cuanFwbG90LmNvbS9kb25hdGUucGhwIC4KICoKICogc3ByaW50ZiBmdW5jdGlvbnMgY29udGFpbmVkIGluIGpxcGxvdC5zcHJpbnRmLmpzIGJ5IEFzaCBTZWFybGU6CiAqCiAqICAgICB2ZXJzaW9uIDIwMDcuMDQuMjcKICogICAgIGF1dGhvciBBc2ggU2VhcmxlCiAqICAgICBodHRwOi8vaGV4bWVuLmNvbS9ibG9nLzIwMDcvMDMvcHJpbnRmLXNwcmludGYvCiAqICAgICBodHRwOi8vaGV4bWVuLmNvbS9qcy9zcHJpbnRmLmpzCiAqICAgICBUaGUgYXV0aG9yIChBc2ggU2VhcmxlKSBoYXMgcGxhY2VkIHRoaXMgY29kZSBpbiB0aGUgcHVibGljIGRvbWFpbjoKICogICAgICJUaGlzIGNvZGUgaXMgdW5yZXN0cmljdGVkOiB5b3UgYXJlIGZyZWUgdG8gdXNlIGl0IGhvd2V2ZXIgeW91IGxpa2UuIgogKiAKICovCihmdW5jdGlvbigkKSB7CiAgICAvKioKICAgICogQ2xhc3M6ICQuanFwbG90LkNhbnZhc0F4aXNMYWJlbFJlbmRlcmVyCiAgICAqIFJlbmRlcmVyIHRvIGRyYXcgYXhpcyBsYWJlbHMgd2l0aCBhIGNhbnZhcyBlbGVtZW50IHRvIHN1cHBvcnQgYWR2YW5jZWQKICAgICogZmVhdHJ1ZXMgc3VjaCBhcyByb3RhdGVkIHRleHQuICBUaGlzIHJlbmRlcmVyIHVzZXMgYSBzZXBhcmF0ZSByZW5kZXJpbmcgZW5naW5lCiAgICAqIHRvIGRyYXcgdGhlIHRleHQgb24gdGhlIGNhbnZhcy4gIFR3byBtb2RlcyBvZiByZW5kZXJpbmcgdGhlIHRleHQgYXJlIGF2YWlsYWJsZS4KICAgICogSWYgdGhlIGJyb3dzZXIgaGFzIG5hdGl2ZSBmb250IHN1cHBvcnQgZm9yIGNhbnZhcyBmb250cyAoY3VycmVudGx5IE1vemlsYSAzLjUKICAgICogYW5kIFNhZmFyaSA0KSwgeW91IGNhbiBlbmFibGUgdGV4dCByZW5kZXJpbmcgd2l0aCB0aGUgY2FudmFzIGZpbGxUZXh0IG1ldGhvZC4KICAgICogWW91IGRvIHNvIGJ5IHNldHRpbmcgdGhlICJlbmFibGVGb250U3VwcG9ydCIgb3B0aW9uIHRvIHRydWUuIAogICAgKiAKICAgICogQnJvd3NlcnMgbGFja2luZyBuYXRpdmUgZm9udCBzdXBwb3J0IHdpbGwgaGF2ZSB0aGUgdGV4dCBkcmF3biBvbiB0aGUgY2FudmFzCiAgICAqIHVzaW5nIHRoZSBIZXJzaGV5IGZvbnQgbWV0cmljcy4gIEV2ZW4gaWYgdGhlICJlbmFibGVGb250U3VwcG9ydCIgb3B0aW9uIGlzIHRydWUKICAgICogbm9uLXN1cHBvcnRpbmcgYnJvd3NlcnMgd2lsbCBzdGlsbCByZW5kZXIgd2l0aCB0aGUgSGVyc2hleSBmb250LgogICAgKiAKICAgICovCiAgICAkLmpxcGxvdC5DYW52YXNBeGlzTGFiZWxSZW5kZXJlciA9IGZ1bmN0aW9uKG9wdGlvbnMpIHsKICAgICAgICAvLyBHcm91cDogUHJvcGVydGllcwogICAgICAgIAogICAgICAgIC8vIHByb3A6IGFuZ2xlCiAgICAgICAgLy8gYW5nbGUgb2YgdGV4dCwgbWVhc3VyZWQgY2xvY2t3aXNlIGZyb20geCBheGlzLgogICAgICAgIHRoaXMuYW5nbGUgPSAwOwogICAgICAgIC8vIG5hbWUgb2YgdGhlIGF4aXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdGljawogICAgICAgIHRoaXMuYXhpczsKICAgICAgICAvLyBwcm9wOiBzaG93CiAgICAgICAgLy8gd2V0aGVyIG9yIG5vdCB0byBzaG93IHRoZSB0aWNrIChtYXJrIGFuZCBsYWJlbCkuCiAgICAgICAgdGhpcy5zaG93ID0gdHJ1ZTsKICAgICAgICAvLyBwcm9wOiBzaG93TGFiZWwKICAgICAgICAvLyB3ZXRoZXIgb3Igbm90IHRvIHNob3cgdGhlIGxhYmVsLgogICAgICAgIHRoaXMuc2hvd0xhYmVsID0gdHJ1ZTsKICAgICAgICAvLyBwcm9wOiBsYWJlbAogICAgICAgIC8vIGxhYmVsIGZvciB0aGUgYXhpcy4KICAgICAgICB0aGlzLmxhYmVsID0gJyc7CiAgICAgICAgLy8gcHJvcDogZm9udEZhbWlseQogICAgICAgIC8vIENTUyBzcGVjIGZvciB0aGUgZm9udC1mYW1pbHkgY3NzIGF0dHJpYnV0ZS4KICAgICAgICAvLyBBcHBsaWVzIG9ubHkgdG8gYnJvd3NlcnMgc3VwcG9ydGluZyBuYXRpdmUgZm9udCByZW5kZXJpbmcgaW4gdGhlCiAgICAgICAgLy8gY2FudmFzIHRhZy4gIEN1cnJlbnRseSBNb3ppbGxhIDMuNSBhbmQgU2FmYXJpIDQuCiAgICAgICAgdGhpcy5mb250RmFtaWx5ID0gJyJUcmVidWNoZXQgTVMiLCBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmJzsKICAgICAgICAvLyBwcm9wOiBmb250U2l6ZQogICAgICAgIC8vIENTUyBzcGVjIGZvciBmb250IHNpemUuCiAgICAgICAgdGhpcy5mb250U2l6ZSA9ICcxMXB0JzsKICAgICAgICAvLyBwcm9wOiBmb250V2VpZ2h0CiAgICAgICAgLy8gQ1NTIHNwZWMgZm9yIGZvbnRXZWlnaHQ6ICBub3JtYWwsIGJvbGQsIGJvbGRlciwgbGlnaHRlciBvciBhIG51bWJlciAxMDAgLSA5MDAKICAgICAgICB0aGlzLmZvbnRXZWlnaHQgPSAnbm9ybWFsJzsKICAgICAgICAvLyBwcm9wOiBmb250U3RyZXRjaAogICAgICAgIC8vIE11bHRpcGxpZXIgdG8gY29uZGVuc2Ugb3IgZXhwYW5kIGZvbnQgd2lkdGguICAKICAgICAgICAvLyBBcHBsaWVzIG9ubHkgdG8gYnJvd3NlcnMgd2hpY2ggZG9uJ3Qgc3VwcG9ydCBjYW52YXMgbmF0aXZlIGZvbnQgcmVuZGVyaW5nLgogICAgICAgIHRoaXMuZm9udFN0cmV0Y2ggPSAxLjA7CiAgICAgICAgLy8gcHJvcDogdGV4dENvbG9yCiAgICAgICAgLy8gY3NzIHNwZWMgZm9yIHRoZSBjb2xvciBhdHRyaWJ1dGUuCiAgICAgICAgdGhpcy50ZXh0Q29sb3IgPSAnIzY2NjY2Nic7CiAgICAgICAgLy8gcHJvcDogZW5hYmxlRm9udFN1cHBvcnQKICAgICAgICAvLyB0cnVlIHRvIHR1cm4gb24gbmF0aXZlIGNhbnZhcyBmb250IHN1cHBvcnQgaW4gTW96aWxsYSAzLjUrIGFuZCBTYWZhcmkgNCsuCiAgICAgICAgLy8gSWYgdHJ1ZSwgbGFiZWwgd2lsbCBiZSBkcmF3biB3aXRoIGNhbnZhcyB0YWcgbmF0aXZlIHN1cHBvcnQgZm9yIGZvbnRzLgogICAgICAgIC8vIElmIGZhbHNlLCBsYWJlbCB3aWxsIGJlIGRyYXduIHdpdGggSGVyc2hleSBmb250IG1ldHJpY3MuCiAgICAgICAgdGhpcy5lbmFibGVGb250U3VwcG9ydCA9IHRydWU7CiAgICAgICAgLy8gcHJvcDogcHQycHgKICAgICAgICAvLyBQb2ludCB0byBwaXhlbCBzY2FsaW5nIGZhY3RvciwgdXNlZCBmb3IgY29tcHV0aW5nIGhlaWdodCBvZiBib3VuZGluZyBib3gKICAgICAgICAvLyBhcm91bmQgYSBsYWJlbC4gIFRoZSBsYWJlbHMgdGV4dCByZW5kZXJlciBoYXMgYSBkZWZhdWx0IHNldHRpbmcgb2YgMS40LCB3aGljaCAKICAgICAgICAvLyBzaG91bGQgYmUgc3VpdGFibGUgZm9yIG1vc3QgZm9udHMuICBMZWF2ZSBhcyBudWxsIHRvIHVzZSBkZWZhdWx0LiAgSWYgdG9wcyBvZgogICAgICAgIC8vIGxldHRlcnMgYXBwZWFyIGNsaXBwZWQsIGluY3JlYXNlIHRoaXMuICBJZiBib3VuZGluZyBib3ggc2VlbXMgdG9vIGJpZywgZGVjcmVhc2UuCiAgICAgICAgLy8gVGhpcyBpcyBhbiBpc3N1ZSBvbmx5IHdpdGggdGhlIG5hdGl2ZSBmb250IHJlbmRlcmVyaW5nIGNhcGFiaWxpdGllcyBvZiBNb3ppbGxhCiAgICAgICAgLy8gMy41IGFuZCBTYWZhcmkgNCBzaW5jZSB0aGV5IGRvIG5vdCBwcm92aWRlIGEgbWV0aG9kIHRvIGRldGVybWluZSB0aGUgZm9udCBoZWlnaHQuCiAgICAgICAgdGhpcy5wdDJweCA9IG51bGw7CiAgICAgICAgCiAgICAgICAgdGhpcy5fZWxlbTsKICAgICAgICB0aGlzLl9jdHg7CiAgICAgICAgdGhpcy5fcGxvdFdpZHRoOwogICAgICAgIHRoaXMuX3Bsb3RIZWlnaHQ7CiAgICAgICAgdGhpcy5fcGxvdERpbWVuc2lvbnMgPSB7aGVpZ2h0Om51bGwsIHdpZHRoOm51bGx9OwogICAgICAgIAogICAgICAgICQuZXh0ZW5kKHRydWUsIHRoaXMsIG9wdGlvbnMpOwogICAgICAgIAogICAgICAgIGlmIChvcHRpb25zLmFuZ2xlID09IG51bGwgJiYgdGhpcy5heGlzICE9ICd4YXhpcycgJiYgdGhpcy5heGlzICE9ICd4MmF4aXMnKSB7CiAgICAgICAgICAgIHRoaXMuYW5nbGUgPSAtOTA7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIHZhciByb3B0cyA9IHtmb250U2l6ZTp0aGlzLmZvbnRTaXplLCBmb250V2VpZ2h0OnRoaXMuZm9udFdlaWdodCwgZm9udFN0cmV0Y2g6dGhpcy5mb250U3RyZXRjaCwgZmlsbFN0eWxlOnRoaXMudGV4dENvbG9yLCBhbmdsZTp0aGlzLmdldEFuZ2xlUmFkKCksIGZvbnRGYW1pbHk6dGhpcy5mb250RmFtaWx5fTsKICAgICAgICBpZiAodGhpcy5wdDJweCkgewogICAgICAgICAgICByb3B0cy5wdDJweCA9IHRoaXMucHQycHg7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmICh0aGlzLmVuYWJsZUZvbnRTdXBwb3J0KSB7CiAgICAgICAgICAgIGlmICgkLmpxcGxvdC5zdXBwb3J0X2NhbnZhc190ZXh0KCkpIHsKICAgICAgICAgICAgICAgIHRoaXMuX3RleHRSZW5kZXJlciA9IG5ldyAkLmpxcGxvdC5DYW52YXNGb250UmVuZGVyZXIocm9wdHMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHRoaXMuX3RleHRSZW5kZXJlciA9IG5ldyAkLmpxcGxvdC5DYW52YXNUZXh0UmVuZGVyZXIocm9wdHMpOyAKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgdGhpcy5fdGV4dFJlbmRlcmVyID0gbmV3ICQuanFwbG90LkNhbnZhc1RleHRSZW5kZXJlcihyb3B0cyk7IAogICAgICAgIH0KICAgIH07CiAgICAKICAgICQuanFwbG90LkNhbnZhc0F4aXNMYWJlbFJlbmRlcmVyLnByb3RvdHlwZS5pbml0ID0gZnVuY3Rpb24ob3B0aW9ucykgewogICAgICAgICQuZXh0ZW5kKHRydWUsIHRoaXMsIG9wdGlvbnMpOwogICAgICAgIHRoaXMuX3RleHRSZW5kZXJlci5pbml0KHtmb250U2l6ZTp0aGlzLmZvbnRTaXplLCBmb250V2VpZ2h0OnRoaXMuZm9udFdlaWdodCwgZm9udFN0cmV0Y2g6dGhpcy5mb250U3RyZXRjaCwgZmlsbFN0eWxlOnRoaXMudGV4dENvbG9yLCBhbmdsZTp0aGlzLmdldEFuZ2xlUmFkKCksIGZvbnRGYW1pbHk6dGhpcy5mb250RmFtaWx5fSk7CiAgICB9OwogICAgCiAgICAvLyByZXR1cm4gd2lkdGggYWxvbmcgdGhlIHggYXhpcwogICAgLy8gd2lsbCBjaGVjayBmaXJzdCB0byBzZWUgaWYgYW4gZWxlbWVudCBleGlzdHMuCiAgICAvLyBpZiBub3QsIHdpbGwgcmV0dXJuIHRoZSBjb21wdXRlZCB0ZXh0IGJveCB3aWR0aC4KICAgICQuanFwbG90LkNhbnZhc0F4aXNMYWJlbFJlbmRlcmVyLnByb3RvdHlwZS5nZXRXaWR0aCA9IGZ1bmN0aW9uKGN0eCkgewogICAgICAgIGlmICh0aGlzLl9lbGVtKSB7CiAgICAgICAgIHJldHVybiB0aGlzLl9lbGVtLm91dGVyV2lkdGgodHJ1ZSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICB2YXIgdHIgPSB0aGlzLl90ZXh0UmVuZGVyZXI7CiAgICAgICAgICAgIHZhciBsID0gdHIuZ2V0V2lkdGgoY3R4KTsKICAgICAgICAgICAgdmFyIGggPSB0ci5nZXRIZWlnaHQoY3R4KTsKICAgICAgICAgICAgdmFyIHcgPSBNYXRoLmFicyhNYXRoLnNpbih0ci5hbmdsZSkqaCkgKyBNYXRoLmFicyhNYXRoLmNvcyh0ci5hbmdsZSkqbCk7CiAgICAgICAgICAgIHJldHVybiB3OwogICAgICAgIH0KICAgIH07CiAgICAKICAgIC8vIHJldHVybiBoZWlnaHQgYWxvbmcgdGhlIHkgYXhpcy4KICAgICQuanFwbG90LkNhbnZhc0F4aXNMYWJlbFJlbmRlcmVyLnByb3RvdHlwZS5nZXRIZWlnaHQgPSBmdW5jdGlvbihjdHgpIHsKICAgICAgICBpZiAodGhpcy5fZWxlbSkgewogICAgICAgICByZXR1cm4gdGhpcy5fZWxlbS5vdXRlckhlaWdodCh0cnVlKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHZhciB0ciA9IHRoaXMuX3RleHRSZW5kZXJlcjsKICAgICAgICAgICAgdmFyIGwgPSB0ci5nZXRXaWR0aChjdHgpOwogICAgICAgICAgICB2YXIgaCA9IHRyLmdldEhlaWdodChjdHgpOwogICAgICAgICAgICB2YXIgdyA9IE1hdGguYWJzKE1hdGguY29zKHRyLmFuZ2xlKSpoKSArIE1hdGguYWJzKE1hdGguc2luKHRyLmFuZ2xlKSpsKTsKICAgICAgICAgICAgcmV0dXJuIHc7CiAgICAgICAgfQogICAgfTsKICAgIAogICAgJC5qcXBsb3QuQ2FudmFzQXhpc0xhYmVsUmVuZGVyZXIucHJvdG90eXBlLmdldEFuZ2xlUmFkID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIGEgPSB0aGlzLmFuZ2xlICogTWF0aC5QSS8xODA7CiAgICAgICAgcmV0dXJuIGE7CiAgICB9OwogICAgCiAgICAkLmpxcGxvdC5DYW52YXNBeGlzTGFiZWxSZW5kZXJlci5wcm90b3R5cGUuZHJhdyA9IGZ1bmN0aW9uKGN0eCwgcGxvdCkgewogICAgICAgICAgLy8gTWVtb3J5IExlYWtzIHBhdGNoCiAgICAgICAgICBpZiAodGhpcy5fZWxlbSkgewogICAgICAgICAgICAgIGlmICgkLmpxcGxvdC51c2VfZXhjYW52YXMgJiYgd2luZG93Lkdfdm1sQ2FudmFzTWFuYWdlci51bmluaXRFbGVtZW50ICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgICAgd2luZG93Lkdfdm1sQ2FudmFzTWFuYWdlci51bmluaXRFbGVtZW50KHRoaXMuX2VsZW0uZ2V0KDApKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICAgIHRoaXMuX2VsZW0uZW1wdHlGb3JjZSgpOwogICAgICAgICAgICAgIHRoaXMuX2VsZW0gPSBudWxsOwogICAgICAgICAgfQoKICAgICAgICAvLyBjcmVhdGUgYSBjYW52YXMgaGVyZSwgYnV0IGNhbid0IGRyYXcgb24gaXQgdW50aWxsIGl0IGlzIGFwcGVuZGVkCiAgICAgICAgLy8gdG8gZG9tIGZvciBJRSBjb21wYXRhYmlsaXR5LgogICAgICAgIHZhciBlbGVtID0gcGxvdC5jYW52YXNNYW5hZ2VyLmdldENhbnZhcygpOwoKICAgICAgICB0aGlzLl90ZXh0UmVuZGVyZXIuc2V0VGV4dCh0aGlzLmxhYmVsLCBjdHgpOwogICAgICAgIHZhciB3ID0gdGhpcy5nZXRXaWR0aChjdHgpOwogICAgICAgIHZhciBoID0gdGhpcy5nZXRIZWlnaHQoY3R4KTsKICAgICAgICBlbGVtLndpZHRoID0gdzsKICAgICAgICBlbGVtLmhlaWdodCA9IGg7CiAgICAgICAgZWxlbS5zdHlsZS53aWR0aCA9IHc7CiAgICAgICAgZWxlbS5zdHlsZS5oZWlnaHQgPSBoOwogICAgICAgIAoJCWVsZW0gPSBwbG90LmNhbnZhc01hbmFnZXIuaW5pdENhbnZhcyhlbGVtKTsKCQkKICAgICAgICB0aGlzLl9lbGVtID0gJChlbGVtKTsKICAgICAgICB0aGlzLl9lbGVtLmNzcyh7IHBvc2l0aW9uOiAnYWJzb2x1dGUnfSk7CiAgICAgICAgdGhpcy5fZWxlbS5hZGRDbGFzcygnanFwbG90LScrdGhpcy5heGlzKyctbGFiZWwnKTsKICAgICAgICAKICAgICAgICBlbGVtID0gbnVsbDsKICAgICAgICByZXR1cm4gdGhpcy5fZWxlbTsKICAgIH07CiAgICAKICAgICQuanFwbG90LkNhbnZhc0F4aXNMYWJlbFJlbmRlcmVyLnByb3RvdHlwZS5wYWNrID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5fdGV4dFJlbmRlcmVyLmRyYXcodGhpcy5fZWxlbS5nZXQoMCkuZ2V0Q29udGV4dCgiMmQiKSwgdGhpcy5sYWJlbCk7CiAgICB9OwogICAgCn0pKGpRdWVyeSk7]]></data>
	</file>
	<file>
	  <filename>/src/plugins/jqplot.canvasAxisLabelRenderer.min.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqCiAqIGpxUGxvdAogKiBQdXJlIEphdmFTY3JpcHQgcGxvdHRpbmcgcGx1Z2luIHVzaW5nIGpRdWVyeQogKgogKiBWZXJzaW9uOiAxLjAuMGIyX3IxMDEyCiAqCiAqIENvcHlyaWdodCAoYykgMjAwOS0yMDExIENocmlzIExlb25lbGxvCiAqIGpxUGxvdCBpcyBjdXJyZW50bHkgYXZhaWxhYmxlIGZvciB1c2UgaW4gYWxsIHBlcnNvbmFsIG9yIGNvbW1lcmNpYWwgcHJvamVjdHMgCiAqIHVuZGVyIGJvdGggdGhlIE1JVCAoaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHApIGFuZCBHUEwgCiAqIHZlcnNpb24gMi4wIChodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC5odG1sKSBsaWNlbnNlcy4gVGhpcyBtZWFucyB0aGF0IHlvdSBjYW4gCiAqIGNob29zZSB0aGUgbGljZW5zZSB0aGF0IGJlc3Qgc3VpdHMgeW91ciBwcm9qZWN0IGFuZCB1c2UgaXQgYWNjb3JkaW5nbHkuIAogKgogKiBBbHRob3VnaCBub3QgcmVxdWlyZWQsIHRoZSBhdXRob3Igd291bGQgYXBwcmVjaWF0ZSBhbiBlbWFpbCBsZXR0aW5nIGhpbSAKICoga25vdyBvZiBhbnkgc3Vic3RhbnRpYWwgdXNlIG9mIGpxUGxvdC4gIFlvdSBjYW4gcmVhY2ggdGhlIGF1dGhvciBhdDogCiAqIGNocmlzIGF0IGpxcGxvdCBkb3QgY29tIG9yIHNlZSBodHRwOi8vd3d3LmpxcGxvdC5jb20vaW5mby5waHAgLgogKgogKiBJZiB5b3UgYXJlIGZlZWxpbmcga2luZCBhbmQgZ2VuZXJvdXMsIGNvbnNpZGVyIHN1cHBvcnRpbmcgdGhlIHByb2plY3QgYnkKICogbWFraW5nIGEgZG9uYXRpb24gYXQ6IGh0dHA6Ly93d3cuanFwbG90LmNvbS9kb25hdGUucGhwIC4KICoKICogc3ByaW50ZiBmdW5jdGlvbnMgY29udGFpbmVkIGluIGpxcGxvdC5zcHJpbnRmLmpzIGJ5IEFzaCBTZWFybGU6CiAqCiAqICAgICB2ZXJzaW9uIDIwMDcuMDQuMjcKICogICAgIGF1dGhvciBBc2ggU2VhcmxlCiAqICAgICBodHRwOi8vaGV4bWVuLmNvbS9ibG9nLzIwMDcvMDMvcHJpbnRmLXNwcmludGYvCiAqICAgICBodHRwOi8vaGV4bWVuLmNvbS9qcy9zcHJpbnRmLmpzCiAqICAgICBUaGUgYXV0aG9yIChBc2ggU2VhcmxlKSBoYXMgcGxhY2VkIHRoaXMgY29kZSBpbiB0aGUgcHVibGljIGRvbWFpbjoKICogICAgICJUaGlzIGNvZGUgaXMgdW5yZXN0cmljdGVkOiB5b3UgYXJlIGZyZWUgdG8gdXNlIGl0IGhvd2V2ZXIgeW91IGxpa2UuIgogKgogKiBpbmNsdWRlZCBqc0RhdGUgbGlicmFyeSBieSBDaHJpcyBMZW9uZWxsbzoKICoKICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEgQ2hyaXMgTGVvbmVsbG8KICoKICoganNEYXRlIGlzIGN1cnJlbnRseSBhdmFpbGFibGUgZm9yIHVzZSBpbiBhbGwgcGVyc29uYWwgb3IgY29tbWVyY2lhbCBwcm9qZWN0cyAKICogdW5kZXIgYm90aCB0aGUgTUlUIGFuZCBHUEwgdmVyc2lvbiAyLjAgbGljZW5zZXMuIFRoaXMgbWVhbnMgdGhhdCB5b3UgY2FuIAogKiBjaG9vc2UgdGhlIGxpY2Vuc2UgdGhhdCBiZXN0IHN1aXRzIHlvdXIgcHJvamVjdCBhbmQgdXNlIGl0IGFjY29yZGluZ2x5LgogKgogKiBqc0RhdGUgYm9ycm93cyBtYW55IGNvbmNlcHRzIGFuZCBpZGVhcyBmcm9tIHRoZSBEYXRlIEluc3RhbmNlIAogKiBNZXRob2RzIGJ5IEtlbiBTbnlkZXIgYWxvbmcgd2l0aCBzb21lIHBhcnRzIG9mIEtlbidzIGFjdHVhbCBjb2RlLgogKiAKICogS2VuJ3Mgb3JpZ2lhbmwgRGF0ZSBJbnN0YW5jZSBNZXRob2RzIGFuZCBjb3B5cmlnaHQgbm90aWNlOgogKiAKICogS2VuIFNueWRlciAoa2VuIGQgc255ZGVyIGF0IGdtYWlsIGRvdCBjb20pCiAqIDIwMDgtMDktMTAKICogdmVyc2lvbiAyLjAuMiAoaHR0cDovL2tlbmRzbnlkZXIuY29tL3NhbmRib3gvZGF0ZS8pICAgICAKICogQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbiBMaWNlbnNlIDMuMCAoaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnkvMy4wLykKICoKICoganFwbG90VG9JbWFnZSBmdW5jdGlvbiBiYXNlZCBvbiBMYXJyeSBTaWRlbidzIGV4cG9ydC1qcXBsb3QtdG8tcG5nLmpzLgogKiBMYXJyeSBoYXMgZ2VuZXJvdXNseSBnaXZlbiBwZXJtaXNzaW9uIHRvIGFkYXB0IGhpcyBjb2RlIGZvciBpbmNsdXNpb24KICogaW50byBqcVBsb3QuCiAqCiAqIExhcnJ5J3Mgb3JpZ2luYWwgY29kZSBjYW4gYmUgZm91bmQgaGVyZToKICoKICogaHR0cHM6Ly9naXRodWIuY29tL2xzaWRlbi9leHBvcnQtanFwbG90LXRvLXBuZwogKiAKICogCiAqLwooZnVuY3Rpb24oYSl7YS5qcXBsb3QuQ2FudmFzQXhpc0xhYmVsUmVuZGVyZXI9ZnVuY3Rpb24oYil7dGhpcy5hbmdsZT0wO3RoaXMuYXhpczt0aGlzLnNob3c9dHJ1ZTt0aGlzLnNob3dMYWJlbD10cnVlO3RoaXMubGFiZWw9IiI7dGhpcy5mb250RmFtaWx5PSciVHJlYnVjaGV0IE1TIiwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZic7dGhpcy5mb250U2l6ZT0iMTFwdCI7dGhpcy5mb250V2VpZ2h0PSJub3JtYWwiO3RoaXMuZm9udFN0cmV0Y2g9MTt0aGlzLnRleHRDb2xvcj0iIzY2NjY2NiI7dGhpcy5lbmFibGVGb250U3VwcG9ydD10cnVlO3RoaXMucHQycHg9bnVsbDt0aGlzLl9lbGVtO3RoaXMuX2N0eDt0aGlzLl9wbG90V2lkdGg7dGhpcy5fcGxvdEhlaWdodDt0aGlzLl9wbG90RGltZW5zaW9ucz17aGVpZ2h0Om51bGwsd2lkdGg6bnVsbH07YS5leHRlbmQodHJ1ZSx0aGlzLGIpO2lmKGIuYW5nbGU9PW51bGwmJnRoaXMuYXhpcyE9InhheGlzIiYmdGhpcy5heGlzIT0ieDJheGlzIil7dGhpcy5hbmdsZT0tOTB9dmFyIGM9e2ZvbnRTaXplOnRoaXMuZm9udFNpemUsZm9udFdlaWdodDp0aGlzLmZvbnRXZWlnaHQsZm9udFN0cmV0Y2g6dGhpcy5mb250U3RyZXRjaCxmaWxsU3R5bGU6dGhpcy50ZXh0Q29sb3IsYW5nbGU6dGhpcy5nZXRBbmdsZVJhZCgpLGZvbnRGYW1pbHk6dGhpcy5mb250RmFtaWx5fTtpZih0aGlzLnB0MnB4KXtjLnB0MnB4PXRoaXMucHQycHh9aWYodGhpcy5lbmFibGVGb250U3VwcG9ydCl7aWYoYS5qcXBsb3Quc3VwcG9ydF9jYW52YXNfdGV4dCgpKXt0aGlzLl90ZXh0UmVuZGVyZXI9bmV3IGEuanFwbG90LkNhbnZhc0ZvbnRSZW5kZXJlcihjKX1lbHNle3RoaXMuX3RleHRSZW5kZXJlcj1uZXcgYS5qcXBsb3QuQ2FudmFzVGV4dFJlbmRlcmVyKGMpfX1lbHNle3RoaXMuX3RleHRSZW5kZXJlcj1uZXcgYS5qcXBsb3QuQ2FudmFzVGV4dFJlbmRlcmVyKGMpfX07YS5qcXBsb3QuQ2FudmFzQXhpc0xhYmVsUmVuZGVyZXIucHJvdG90eXBlLmluaXQ9ZnVuY3Rpb24oYil7YS5leHRlbmQodHJ1ZSx0aGlzLGIpO3RoaXMuX3RleHRSZW5kZXJlci5pbml0KHtmb250U2l6ZTp0aGlzLmZvbnRTaXplLGZvbnRXZWlnaHQ6dGhpcy5mb250V2VpZ2h0LGZvbnRTdHJldGNoOnRoaXMuZm9udFN0cmV0Y2gsZmlsbFN0eWxlOnRoaXMudGV4dENvbG9yLGFuZ2xlOnRoaXMuZ2V0QW5nbGVSYWQoKSxmb250RmFtaWx5OnRoaXMuZm9udEZhbWlseX0pfTthLmpxcGxvdC5DYW52YXNBeGlzTGFiZWxSZW5kZXJlci5wcm90b3R5cGUuZ2V0V2lkdGg9ZnVuY3Rpb24oZCl7aWYodGhpcy5fZWxlbSl7cmV0dXJuIHRoaXMuX2VsZW0ub3V0ZXJXaWR0aCh0cnVlKX1lbHNle3ZhciBmPXRoaXMuX3RleHRSZW5kZXJlcjt2YXIgYz1mLmdldFdpZHRoKGQpO3ZhciBlPWYuZ2V0SGVpZ2h0KGQpO3ZhciBiPU1hdGguYWJzKE1hdGguc2luKGYuYW5nbGUpKmUpK01hdGguYWJzKE1hdGguY29zKGYuYW5nbGUpKmMpO3JldHVybiBifX07YS5qcXBsb3QuQ2FudmFzQXhpc0xhYmVsUmVuZGVyZXIucHJvdG90eXBlLmdldEhlaWdodD1mdW5jdGlvbihkKXtpZih0aGlzLl9lbGVtKXtyZXR1cm4gdGhpcy5fZWxlbS5vdXRlckhlaWdodCh0cnVlKX1lbHNle3ZhciBmPXRoaXMuX3RleHRSZW5kZXJlcjt2YXIgYz1mLmdldFdpZHRoKGQpO3ZhciBlPWYuZ2V0SGVpZ2h0KGQpO3ZhciBiPU1hdGguYWJzKE1hdGguY29zKGYuYW5nbGUpKmUpK01hdGguYWJzKE1hdGguc2luKGYuYW5nbGUpKmMpO3JldHVybiBifX07YS5qcXBsb3QuQ2FudmFzQXhpc0xhYmVsUmVuZGVyZXIucHJvdG90eXBlLmdldEFuZ2xlUmFkPWZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5hbmdsZSpNYXRoLlBJLzE4MDtyZXR1cm4gYn07YS5qcXBsb3QuQ2FudmFzQXhpc0xhYmVsUmVuZGVyZXIucHJvdG90eXBlLmRyYXc9ZnVuY3Rpb24oYyxmKXtpZih0aGlzLl9lbGVtKXtpZihhLmpxcGxvdC51c2VfZXhjYW52YXMmJndpbmRvdy5HX3ZtbENhbnZhc01hbmFnZXIudW5pbml0RWxlbWVudCE9PXVuZGVmaW5lZCl7d2luZG93Lkdfdm1sQ2FudmFzTWFuYWdlci51bmluaXRFbGVtZW50KHRoaXMuX2VsZW0uZ2V0KDApKX10aGlzLl9lbGVtLmVtcHR5Rm9yY2UoKTt0aGlzLl9lbGVtPW51bGx9dmFyIGU9Zi5jYW52YXNNYW5hZ2VyLmdldENhbnZhcygpO3RoaXMuX3RleHRSZW5kZXJlci5zZXRUZXh0KHRoaXMubGFiZWwsYyk7dmFyIGI9dGhpcy5nZXRXaWR0aChjKTt2YXIgZD10aGlzLmdldEhlaWdodChjKTtlLndpZHRoPWI7ZS5oZWlnaHQ9ZDtlLnN0eWxlLndpZHRoPWI7ZS5zdHlsZS5oZWlnaHQ9ZDtlPWYuY2FudmFzTWFuYWdlci5pbml0Q2FudmFzKGUpO3RoaXMuX2VsZW09YShlKTt0aGlzLl9lbGVtLmNzcyh7cG9zaXRpb246ImFic29sdXRlIn0pO3RoaXMuX2VsZW0uYWRkQ2xhc3MoImpxcGxvdC0iK3RoaXMuYXhpcysiLWxhYmVsIik7ZT1udWxsO3JldHVybiB0aGlzLl9lbGVtfTthLmpxcGxvdC5DYW52YXNBeGlzTGFiZWxSZW5kZXJlci5wcm90b3R5cGUucGFjaz1mdW5jdGlvbigpe3RoaXMuX3RleHRSZW5kZXJlci5kcmF3KHRoaXMuX2VsZW0uZ2V0KDApLmdldENvbnRleHQoIjJkIiksdGhpcy5sYWJlbCl9fSkoalF1ZXJ5KTs=]]></data>
	</file>
	<file>
	  <filename>/src/plugins/jqplot.canvasAxisTickRenderer.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqCiAqIGpxUGxvdAogKiBQdXJlIEphdmFTY3JpcHQgcGxvdHRpbmcgcGx1Z2luIHVzaW5nIGpRdWVyeQogKgogKiBWZXJzaW9uOiAxLjAuMGIyX3IxMDEyCiAqCiAqIENvcHlyaWdodCAoYykgMjAwOS0yMDExIENocmlzIExlb25lbGxvCiAqIGpxUGxvdCBpcyBjdXJyZW50bHkgYXZhaWxhYmxlIGZvciB1c2UgaW4gYWxsIHBlcnNvbmFsIG9yIGNvbW1lcmNpYWwgcHJvamVjdHMgCiAqIHVuZGVyIGJvdGggdGhlIE1JVCAoaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHApIGFuZCBHUEwgCiAqIHZlcnNpb24gMi4wIChodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC5odG1sKSBsaWNlbnNlcy4gVGhpcyBtZWFucyB0aGF0IHlvdSBjYW4gCiAqIGNob29zZSB0aGUgbGljZW5zZSB0aGF0IGJlc3Qgc3VpdHMgeW91ciBwcm9qZWN0IGFuZCB1c2UgaXQgYWNjb3JkaW5nbHkuIAogKgogKiBBbHRob3VnaCBub3QgcmVxdWlyZWQsIHRoZSBhdXRob3Igd291bGQgYXBwcmVjaWF0ZSBhbiBlbWFpbCBsZXR0aW5nIGhpbSAKICoga25vdyBvZiBhbnkgc3Vic3RhbnRpYWwgdXNlIG9mIGpxUGxvdC4gIFlvdSBjYW4gcmVhY2ggdGhlIGF1dGhvciBhdDogCiAqIGNocmlzIGF0IGpxcGxvdCBkb3QgY29tIG9yIHNlZSBodHRwOi8vd3d3LmpxcGxvdC5jb20vaW5mby5waHAgLgogKgogKiBJZiB5b3UgYXJlIGZlZWxpbmcga2luZCBhbmQgZ2VuZXJvdXMsIGNvbnNpZGVyIHN1cHBvcnRpbmcgdGhlIHByb2plY3QgYnkKICogbWFraW5nIGEgZG9uYXRpb24gYXQ6IGh0dHA6Ly93d3cuanFwbG90LmNvbS9kb25hdGUucGhwIC4KICoKICogc3ByaW50ZiBmdW5jdGlvbnMgY29udGFpbmVkIGluIGpxcGxvdC5zcHJpbnRmLmpzIGJ5IEFzaCBTZWFybGU6CiAqCiAqICAgICB2ZXJzaW9uIDIwMDcuMDQuMjcKICogICAgIGF1dGhvciBBc2ggU2VhcmxlCiAqICAgICBodHRwOi8vaGV4bWVuLmNvbS9ibG9nLzIwMDcvMDMvcHJpbnRmLXNwcmludGYvCiAqICAgICBodHRwOi8vaGV4bWVuLmNvbS9qcy9zcHJpbnRmLmpzCiAqICAgICBUaGUgYXV0aG9yIChBc2ggU2VhcmxlKSBoYXMgcGxhY2VkIHRoaXMgY29kZSBpbiB0aGUgcHVibGljIGRvbWFpbjoKICogICAgICJUaGlzIGNvZGUgaXMgdW5yZXN0cmljdGVkOiB5b3UgYXJlIGZyZWUgdG8gdXNlIGl0IGhvd2V2ZXIgeW91IGxpa2UuIgogKiAKICovCihmdW5jdGlvbigkKSB7CiAgICAvKioKICAgICogIENsYXNzOiAkLmpxcGxvdC5DYW52YXNBeGlzVGlja1JlbmRlcmVyCiAgICAqIFJlbmRlcmVyIHRvIGRyYXcgYXhpcyB0aWNrcyB3aXRoIGEgY2FudmFzIGVsZW1lbnQgdG8gc3VwcG9ydCBhZHZhbmNlZAogICAgKiBmZWF0cnVlcyBzdWNoIGFzIHJvdGF0ZWQgdGV4dC4gIFRoaXMgcmVuZGVyZXIgdXNlcyBhIHNlcGFyYXRlIHJlbmRlcmluZyBlbmdpbmUKICAgICogdG8gZHJhdyB0aGUgdGV4dCBvbiB0aGUgY2FudmFzLiAgVHdvIG1vZGVzIG9mIHJlbmRlcmluZyB0aGUgdGV4dCBhcmUgYXZhaWxhYmxlLgogICAgKiBJZiB0aGUgYnJvd3NlciBoYXMgbmF0aXZlIGZvbnQgc3VwcG9ydCBmb3IgY2FudmFzIGZvbnRzIChjdXJyZW50bHkgTW96aWxhIDMuNQogICAgKiBhbmQgU2FmYXJpIDQpLCB5b3UgY2FuIGVuYWJsZSB0ZXh0IHJlbmRlcmluZyB3aXRoIHRoZSBjYW52YXMgZmlsbFRleHQgbWV0aG9kLgogICAgKiBZb3UgZG8gc28gYnkgc2V0dGluZyB0aGUgImVuYWJsZUZvbnRTdXBwb3J0IiBvcHRpb24gdG8gdHJ1ZS4gCiAgICAqIAogICAgKiBCcm93c2VycyBsYWNraW5nIG5hdGl2ZSBmb250IHN1cHBvcnQgd2lsbCBoYXZlIHRoZSB0ZXh0IGRyYXduIG9uIHRoZSBjYW52YXMKICAgICogdXNpbmcgdGhlIEhlcnNoZXkgZm9udCBtZXRyaWNzLiAgRXZlbiBpZiB0aGUgImVuYWJsZUZvbnRTdXBwb3J0IiBvcHRpb24gaXMgdHJ1ZQogICAgKiBub24tc3VwcG9ydGluZyBicm93c2VycyB3aWxsIHN0aWxsIHJlbmRlciB3aXRoIHRoZSBIZXJzaGV5IGZvbnQuCiAgICAqLwogICAgJC5qcXBsb3QuQ2FudmFzQXhpc1RpY2tSZW5kZXJlciA9IGZ1bmN0aW9uKG9wdGlvbnMpIHsKICAgICAgICAvLyBHcm91cDogUHJvcGVydGllcwogICAgICAgIAogICAgICAgIC8vIHByb3A6IG1hcmsKICAgICAgICAvLyB0aWNrIG1hcmsgb24gdGhlIGF4aXMuICBPbmUgb2YgJ2luc2lkZScsICdvdXRzaWRlJywgJ2Nyb3NzJywgJycgb3IgbnVsbC4KICAgICAgICB0aGlzLm1hcmsgPSAnb3V0c2lkZSc7CiAgICAgICAgLy8gcHJvcDogc2hvd01hcmsKICAgICAgICAvLyB3ZXRoZXIgb3Igbm90IHRvIHNob3cgdGhlIG1hcmsgb24gdGhlIGF4aXMuCiAgICAgICAgdGhpcy5zaG93TWFyayA9IHRydWU7CiAgICAgICAgLy8gcHJvcDogc2hvd0dyaWRsaW5lCiAgICAgICAgLy8gd2V0aGVyIG9yIG5vdCB0byBkcmF3IHRoZSBncmlkbGluZSBvbiB0aGUgZ3JpZCBhdCB0aGlzIHRpY2suCiAgICAgICAgdGhpcy5zaG93R3JpZGxpbmUgPSB0cnVlOwogICAgICAgIC8vIHByb3A6IGlzTWlub3JUaWNrCiAgICAgICAgLy8gaWYgdGhpcyBpcyBhIG1pbm9yIHRpY2suCiAgICAgICAgdGhpcy5pc01pbm9yVGljayA9IGZhbHNlOwogICAgICAgIC8vIHByb3A6IGFuZ2xlCiAgICAgICAgLy8gYW5nbGUgb2YgdGV4dCwgbWVhc3VyZWQgY2xvY2t3aXNlIGZyb20geCBheGlzLgogICAgICAgIHRoaXMuYW5nbGUgPSAwOwogICAgICAgIC8vIHByb3A6ICBtYXJrU2l6ZQogICAgICAgIC8vIExlbmd0aCBvZiB0aGUgdGljayBtYXJrcyBpbiBwaXhlbHMuICBGb3IgJ2Nyb3NzJyBzdHlsZSwgbGVuZ3RoCiAgICAgICAgLy8gd2lsbCBiZSBzdG9rZWQgYWJvdmUgYW5kIGJlbG93IGF4aXMsIHNvIHRvdGFsIGxlbmd0aCB3aWxsIGJlIHR3aWNlIHRoaXMuCiAgICAgICAgdGhpcy5tYXJrU2l6ZSA9IDQ7CiAgICAgICAgLy8gcHJvcDogc2hvdwogICAgICAgIC8vIHdldGhlciBvciBub3QgdG8gc2hvdyB0aGUgdGljayAobWFyayBhbmQgbGFiZWwpLgogICAgICAgIHRoaXMuc2hvdyA9IHRydWU7CiAgICAgICAgLy8gcHJvcDogc2hvd0xhYmVsCiAgICAgICAgLy8gd2V0aGVyIG9yIG5vdCB0byBzaG93IHRoZSBsYWJlbC4KICAgICAgICB0aGlzLnNob3dMYWJlbCA9IHRydWU7CiAgICAgICAgLy8gcHJvcDogbGFiZWxQb3NpdGlvbgogICAgICAgIC8vICdhdXRvJywgJ3N0YXJ0JywgJ21pZGRsZScgb3IgJ2VuZCcuCiAgICAgICAgLy8gV2hldGhlciB0aWNrIGxhYmVsIHNob3VsZCBiZSBwb3NpdGlvbmVkIHNvIHRoZSBzdGFydCwgbWlkZGxlLCBvciBlbmQKICAgICAgICAvLyBvZiB0aGUgdGljayBtYXJrLgogICAgICAgIHRoaXMubGFiZWxQb3NpdGlvbiA9ICdhdXRvJzsKICAgICAgICB0aGlzLmxhYmVsID0gJyc7CiAgICAgICAgdGhpcy52YWx1ZSA9IG51bGw7CiAgICAgICAgdGhpcy5fc3R5bGVzID0ge307CiAgICAgICAgLy8gcHJvcDogZm9ybWF0dGVyCiAgICAgICAgLy8gQSBjbGFzcyBvZiBhIGZvcm1hdHRlciBmb3IgdGhlIHRpY2sgdGV4dC4KICAgICAgICAvLyBUaGUgZGVmYXVsdCAkLmpxcGxvdC5EZWZhdWx0VGlja0Zvcm1hdHRlciB1c2VzIHNwcmludGYuCiAgICAgICAgdGhpcy5mb3JtYXR0ZXIgPSAkLmpxcGxvdC5EZWZhdWx0VGlja0Zvcm1hdHRlcjsKICAgICAgICAvLyBwcm9wOiBmb3JtYXRTdHJpbmcKICAgICAgICAvLyBzdHJpbmcgcGFzc2VkIHRvIHRoZSBmb3JtYXR0ZXIuCiAgICAgICAgdGhpcy5mb3JtYXRTdHJpbmcgPSAnJzsKICAgICAgICAvLyBwcm9wOiBwcmVmaXgKICAgICAgICAvLyBTdHJpbmcgdG8gcHJlcGVuZCB0byB0aGUgdGljayBsYWJlbC4KICAgICAgICAvLyBQcmVmaXggaXMgcHJlcGVuZGVkIHRvIHRoZSBmb3JtYXR0ZWQgdGljayBsYWJlbC4KICAgICAgICB0aGlzLnByZWZpeCA9ICcnOwogICAgICAgIC8vIHByb3A6IGZvbnRGYW1pbHkKICAgICAgICAvLyBjc3Mgc3BlYyBmb3IgdGhlIGZvbnQtZmFtaWx5IGNzcyBhdHRyaWJ1dGUuCiAgICAgICAgdGhpcy5mb250RmFtaWx5ID0gJyJUcmVidWNoZXQgTVMiLCBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmJzsKICAgICAgICAvLyBwcm9wOiBmb250U2l6ZQogICAgICAgIC8vIENTUyBzcGVjIGZvciBmb250IHNpemUuCiAgICAgICAgdGhpcy5mb250U2l6ZSA9ICcxMHB0JzsKICAgICAgICAvLyBwcm9wOiBmb250V2VpZ2h0CiAgICAgICAgLy8gQ1NTIHNwZWMgZm9yIGZvbnRXZWlnaHQKICAgICAgICB0aGlzLmZvbnRXZWlnaHQgPSAnbm9ybWFsJzsKICAgICAgICAvLyBwcm9wOiBmb250U3RyZXRjaAogICAgICAgIC8vIE11bHRpcGxpZXIgdG8gY29uZGVuc2Ugb3IgZXhwYW5kIGZvbnQgd2lkdGguICAKICAgICAgICAvLyBBcHBsaWVzIG9ubHkgdG8gYnJvd3NlcnMgd2hpY2ggZG9uJ3Qgc3VwcG9ydCBjYW52YXMgbmF0aXZlIGZvbnQgcmVuZGVyaW5nLgogICAgICAgIHRoaXMuZm9udFN0cmV0Y2ggPSAxLjA7CiAgICAgICAgLy8gcHJvcDogdGV4dENvbG9yCiAgICAgICAgLy8gY3NzIHNwZWMgZm9yIHRoZSBjb2xvciBhdHRyaWJ1dGUuCiAgICAgICAgdGhpcy50ZXh0Q29sb3IgPSAnIzY2NjY2Nic7CiAgICAgICAgLy8gcHJvcDogZW5hYmxlRm9udFN1cHBvcnQKICAgICAgICAvLyB0cnVlIHRvIHR1cm4gb24gbmF0aXZlIGNhbnZhcyBmb250IHN1cHBvcnQgaW4gTW96aWxsYSAzLjUrIGFuZCBTYWZhcmkgNCsuCiAgICAgICAgLy8gSWYgdHJ1ZSwgdGljayBsYWJlbCB3aWxsIGJlIGRyYXduIHdpdGggY2FudmFzIHRhZyBuYXRpdmUgc3VwcG9ydCBmb3IgZm9udHMuCiAgICAgICAgLy8gSWYgZmFsc2UsIHRpY2sgbGFiZWwgd2lsbCBiZSBkcmF3biB3aXRoIEhlcnNoZXkgZm9udCBtZXRyaWNzLgogICAgICAgIHRoaXMuZW5hYmxlRm9udFN1cHBvcnQgPSB0cnVlOwogICAgICAgIC8vIHByb3A6IHB0MnB4CiAgICAgICAgLy8gUG9pbnQgdG8gcGl4ZWwgc2NhbGluZyBmYWN0b3IsIHVzZWQgZm9yIGNvbXB1dGluZyBoZWlnaHQgb2YgYm91bmRpbmcgYm94CiAgICAgICAgLy8gYXJvdW5kIGEgbGFiZWwuICBUaGUgbGFiZWxzIHRleHQgcmVuZGVyZXIgaGFzIGEgZGVmYXVsdCBzZXR0aW5nIG9mIDEuNCwgd2hpY2ggCiAgICAgICAgLy8gc2hvdWxkIGJlIHN1aXRhYmxlIGZvciBtb3N0IGZvbnRzLiAgTGVhdmUgYXMgbnVsbCB0byB1c2UgZGVmYXVsdC4gIElmIHRvcHMgb2YKICAgICAgICAvLyBsZXR0ZXJzIGFwcGVhciBjbGlwcGVkLCBpbmNyZWFzZSB0aGlzLiAgSWYgYm91bmRpbmcgYm94IHNlZW1zIHRvbyBiaWcsIGRlY3JlYXNlLgogICAgICAgIC8vIFRoaXMgaXMgYW4gaXNzdWUgb25seSB3aXRoIHRoZSBuYXRpdmUgZm9udCByZW5kZXJlcmluZyBjYXBhYmlsaXRpZXMgb2YgTW96aWxsYQogICAgICAgIC8vIDMuNSBhbmQgU2FmYXJpIDQgc2luY2UgdGhleSBkbyBub3QgcHJvdmlkZSBhIG1ldGhvZCB0byBkZXRlcm1pbmUgdGhlIGZvbnQgaGVpZ2h0LgogICAgICAgIHRoaXMucHQycHggPSBudWxsOwogICAgICAgIAogICAgICAgIHRoaXMuX2VsZW07CiAgICAgICAgdGhpcy5fY3R4OwogICAgICAgIHRoaXMuX3Bsb3RXaWR0aDsKICAgICAgICB0aGlzLl9wbG90SGVpZ2h0OwogICAgICAgIHRoaXMuX3Bsb3REaW1lbnNpb25zID0ge2hlaWdodDpudWxsLCB3aWR0aDpudWxsfTsKICAgICAgICAKICAgICAgICAkLmV4dGVuZCh0cnVlLCB0aGlzLCBvcHRpb25zKTsKICAgICAgICAKICAgICAgICB2YXIgcm9wdHMgPSB7Zm9udFNpemU6dGhpcy5mb250U2l6ZSwgZm9udFdlaWdodDp0aGlzLmZvbnRXZWlnaHQsIGZvbnRTdHJldGNoOnRoaXMuZm9udFN0cmV0Y2gsIGZpbGxTdHlsZTp0aGlzLnRleHRDb2xvciwgYW5nbGU6dGhpcy5nZXRBbmdsZVJhZCgpLCBmb250RmFtaWx5OnRoaXMuZm9udEZhbWlseX07CiAgICAgICAgaWYgKHRoaXMucHQycHgpIHsKICAgICAgICAgICAgcm9wdHMucHQycHggPSB0aGlzLnB0MnB4OwogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZiAodGhpcy5lbmFibGVGb250U3VwcG9ydCkgewogICAgICAgICAgICBpZiAoJC5qcXBsb3Quc3VwcG9ydF9jYW52YXNfdGV4dCgpKSB7CiAgICAgICAgICAgICAgICB0aGlzLl90ZXh0UmVuZGVyZXIgPSBuZXcgJC5qcXBsb3QuQ2FudmFzRm9udFJlbmRlcmVyKHJvcHRzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICB0aGlzLl90ZXh0UmVuZGVyZXIgPSBuZXcgJC5qcXBsb3QuQ2FudmFzVGV4dFJlbmRlcmVyKHJvcHRzKTsgCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHRoaXMuX3RleHRSZW5kZXJlciA9IG5ldyAkLmpxcGxvdC5DYW52YXNUZXh0UmVuZGVyZXIocm9wdHMpOyAKICAgICAgICB9CiAgICB9OwogICAgCiAgICAkLmpxcGxvdC5DYW52YXNBeGlzVGlja1JlbmRlcmVyLnByb3RvdHlwZS5pbml0ID0gZnVuY3Rpb24ob3B0aW9ucykgewogICAgICAgICQuZXh0ZW5kKHRydWUsIHRoaXMsIG9wdGlvbnMpOwogICAgICAgIHRoaXMuX3RleHRSZW5kZXJlci5pbml0KHtmb250U2l6ZTp0aGlzLmZvbnRTaXplLCBmb250V2VpZ2h0OnRoaXMuZm9udFdlaWdodCwgZm9udFN0cmV0Y2g6dGhpcy5mb250U3RyZXRjaCwgZmlsbFN0eWxlOnRoaXMudGV4dENvbG9yLCBhbmdsZTp0aGlzLmdldEFuZ2xlUmFkKCksIGZvbnRGYW1pbHk6dGhpcy5mb250RmFtaWx5fSk7CiAgICB9OwogICAgCiAgICAvLyByZXR1cm4gd2lkdGggYWxvbmcgdGhlIHggYXhpcwogICAgLy8gd2lsbCBjaGVjayBmaXJzdCB0byBzZWUgaWYgYW4gZWxlbWVudCBleGlzdHMuCiAgICAvLyBpZiBub3QsIHdpbGwgcmV0dXJuIHRoZSBjb21wdXRlZCB0ZXh0IGJveCB3aWR0aC4KICAgICQuanFwbG90LkNhbnZhc0F4aXNUaWNrUmVuZGVyZXIucHJvdG90eXBlLmdldFdpZHRoID0gZnVuY3Rpb24oY3R4KSB7CiAgICAgICAgaWYgKHRoaXMuX2VsZW0pIHsKICAgICAgICAgcmV0dXJuIHRoaXMuX2VsZW0ub3V0ZXJXaWR0aCh0cnVlKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHZhciB0ciA9IHRoaXMuX3RleHRSZW5kZXJlcjsKICAgICAgICAgICAgdmFyIGwgPSB0ci5nZXRXaWR0aChjdHgpOwogICAgICAgICAgICB2YXIgaCA9IHRyLmdldEhlaWdodChjdHgpOwogICAgICAgICAgICB2YXIgdyA9IE1hdGguYWJzKE1hdGguc2luKHRyLmFuZ2xlKSpoKSArIE1hdGguYWJzKE1hdGguY29zKHRyLmFuZ2xlKSpsKTsKICAgICAgICAgICAgcmV0dXJuIHc7CiAgICAgICAgfQogICAgfTsKICAgIAogICAgLy8gcmV0dXJuIGhlaWdodCBhbG9uZyB0aGUgeSBheGlzLgogICAgJC5qcXBsb3QuQ2FudmFzQXhpc1RpY2tSZW5kZXJlci5wcm90b3R5cGUuZ2V0SGVpZ2h0ID0gZnVuY3Rpb24oY3R4KSB7CiAgICAgICAgaWYgKHRoaXMuX2VsZW0pIHsKICAgICAgICAgcmV0dXJuIHRoaXMuX2VsZW0ub3V0ZXJIZWlnaHQodHJ1ZSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICB2YXIgdHIgPSB0aGlzLl90ZXh0UmVuZGVyZXI7CiAgICAgICAgICAgIHZhciBsID0gdHIuZ2V0V2lkdGgoY3R4KTsKICAgICAgICAgICAgdmFyIGggPSB0ci5nZXRIZWlnaHQoY3R4KTsKICAgICAgICAgICAgdmFyIHcgPSBNYXRoLmFicyhNYXRoLmNvcyh0ci5hbmdsZSkqaCkgKyBNYXRoLmFicyhNYXRoLnNpbih0ci5hbmdsZSkqbCk7CiAgICAgICAgICAgIHJldHVybiB3OwogICAgICAgIH0KICAgIH07CiAgICAKICAgICQuanFwbG90LkNhbnZhc0F4aXNUaWNrUmVuZGVyZXIucHJvdG90eXBlLmdldEFuZ2xlUmFkID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIGEgPSB0aGlzLmFuZ2xlICogTWF0aC5QSS8xODA7CiAgICAgICAgcmV0dXJuIGE7CiAgICB9OwogICAgCiAgICAKICAgICQuanFwbG90LkNhbnZhc0F4aXNUaWNrUmVuZGVyZXIucHJvdG90eXBlLnNldFRpY2sgPSBmdW5jdGlvbih2YWx1ZSwgYXhpc05hbWUsIGlzTWlub3IpIHsKICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CiAgICAgICAgaWYgKGlzTWlub3IpIHsKICAgICAgICAgICAgdGhpcy5pc01pbm9yVGljayA9IHRydWU7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzOwogICAgfTsKICAgIAogICAgJC5qcXBsb3QuQ2FudmFzQXhpc1RpY2tSZW5kZXJlci5wcm90b3R5cGUuZHJhdyA9IGZ1bmN0aW9uKGN0eCwgcGxvdCkgewogICAgICAgIGlmICghdGhpcy5sYWJlbCkgewogICAgICAgICAgICB0aGlzLmxhYmVsID0gdGhpcy5wcmVmaXggKyB0aGlzLmZvcm1hdHRlcih0aGlzLmZvcm1hdFN0cmluZywgdGhpcy52YWx1ZSk7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC8vIE1lbW9yeSBMZWFrcyBwYXRjaAogICAgICAgIGlmICh0aGlzLl9lbGVtKSB7CiAgICAgICAgICAgIGlmICgkLmpxcGxvdC51c2VfZXhjYW52YXMgJiYgd2luZG93Lkdfdm1sQ2FudmFzTWFuYWdlci51bmluaXRFbGVtZW50ICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgIHdpbmRvdy5HX3ZtbENhbnZhc01hbmFnZXIudW5pbml0RWxlbWVudCh0aGlzLl9lbGVtLmdldCgwKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgICAgIHRoaXMuX2VsZW0uZW1wdHlGb3JjZSgpOwogICAgICAgICAgICB0aGlzLl9lbGVtID0gbnVsbDsKICAgICAgICB9CgogICAgICAgIC8vIGNyZWF0ZSBhIGNhbnZhcyBoZXJlLCBidXQgY2FuJ3QgZHJhdyBvbiBpdCB1bnRpbGwgaXQgaXMgYXBwZW5kZWQKICAgICAgICAvLyB0byBkb20gZm9yIElFIGNvbXBhdGFiaWxpdHkuCgogICAgICAgIHZhciBlbGVtID0gcGxvdC5jYW52YXNNYW5hZ2VyLmdldENhbnZhcygpOwoKICAgICAgICB0aGlzLl90ZXh0UmVuZGVyZXIuc2V0VGV4dCh0aGlzLmxhYmVsLCBjdHgpOwogICAgICAgIHZhciB3ID0gdGhpcy5nZXRXaWR0aChjdHgpOwogICAgICAgIHZhciBoID0gdGhpcy5nZXRIZWlnaHQoY3R4KTsKICAgICAgICAvLyBjYW52YXNlcyBzZWVtIHRvIG5lZWQgdG8gaGF2ZSB3aWR0aCBhbmQgaGVpZ2ggYXR0cmlidXRlcyBkaXJlY3RseSBzZXQuCiAgICAgICAgZWxlbS53aWR0aCA9IHc7CiAgICAgICAgZWxlbS5oZWlnaHQgPSBoOwogICAgICAgIGVsZW0uc3R5bGUud2lkdGggPSB3OwogICAgICAgIGVsZW0uc3R5bGUuaGVpZ2h0ID0gaDsKICAgICAgICBlbGVtLnN0eWxlLnRleHRBbGlnbiA9ICdsZWZ0JzsKICAgICAgICBlbGVtLnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJzsKCQkKCQllbGVtID0gcGxvdC5jYW52YXNNYW5hZ2VyLmluaXRDYW52YXMoZWxlbSk7CgkJCiAgICAgICAgdGhpcy5fZWxlbSA9ICQoZWxlbSk7CiAgICAgICAgdGhpcy5fZWxlbS5jc3ModGhpcy5fc3R5bGVzKTsKICAgICAgICB0aGlzLl9lbGVtLmFkZENsYXNzKCdqcXBsb3QtJyt0aGlzLmF4aXMrJy10aWNrJyk7CgkJCiAgICAgICAgZWxlbSA9IG51bGw7CiAgICAgICAgcmV0dXJuIHRoaXMuX2VsZW07CiAgICB9OwogICAgCiAgICAkLmpxcGxvdC5DYW52YXNBeGlzVGlja1JlbmRlcmVyLnByb3RvdHlwZS5wYWNrID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5fdGV4dFJlbmRlcmVyLmRyYXcodGhpcy5fZWxlbS5nZXQoMCkuZ2V0Q29udGV4dCgiMmQiKSwgdGhpcy5sYWJlbCk7CiAgICB9OwogICAgCn0pKGpRdWVyeSk7]]></data>
	</file>
	<file>
	  <filename>/src/plugins/jqplot.canvasAxisTickRenderer.min.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqCiAqIGpxUGxvdAogKiBQdXJlIEphdmFTY3JpcHQgcGxvdHRpbmcgcGx1Z2luIHVzaW5nIGpRdWVyeQogKgogKiBWZXJzaW9uOiAxLjAuMGIyX3IxMDEyCiAqCiAqIENvcHlyaWdodCAoYykgMjAwOS0yMDExIENocmlzIExlb25lbGxvCiAqIGpxUGxvdCBpcyBjdXJyZW50bHkgYXZhaWxhYmxlIGZvciB1c2UgaW4gYWxsIHBlcnNvbmFsIG9yIGNvbW1lcmNpYWwgcHJvamVjdHMgCiAqIHVuZGVyIGJvdGggdGhlIE1JVCAoaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHApIGFuZCBHUEwgCiAqIHZlcnNpb24gMi4wIChodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC5odG1sKSBsaWNlbnNlcy4gVGhpcyBtZWFucyB0aGF0IHlvdSBjYW4gCiAqIGNob29zZSB0aGUgbGljZW5zZSB0aGF0IGJlc3Qgc3VpdHMgeW91ciBwcm9qZWN0IGFuZCB1c2UgaXQgYWNjb3JkaW5nbHkuIAogKgogKiBBbHRob3VnaCBub3QgcmVxdWlyZWQsIHRoZSBhdXRob3Igd291bGQgYXBwcmVjaWF0ZSBhbiBlbWFpbCBsZXR0aW5nIGhpbSAKICoga25vdyBvZiBhbnkgc3Vic3RhbnRpYWwgdXNlIG9mIGpxUGxvdC4gIFlvdSBjYW4gcmVhY2ggdGhlIGF1dGhvciBhdDogCiAqIGNocmlzIGF0IGpxcGxvdCBkb3QgY29tIG9yIHNlZSBodHRwOi8vd3d3LmpxcGxvdC5jb20vaW5mby5waHAgLgogKgogKiBJZiB5b3UgYXJlIGZlZWxpbmcga2luZCBhbmQgZ2VuZXJvdXMsIGNvbnNpZGVyIHN1cHBvcnRpbmcgdGhlIHByb2plY3QgYnkKICogbWFraW5nIGEgZG9uYXRpb24gYXQ6IGh0dHA6Ly93d3cuanFwbG90LmNvbS9kb25hdGUucGhwIC4KICoKICogc3ByaW50ZiBmdW5jdGlvbnMgY29udGFpbmVkIGluIGpxcGxvdC5zcHJpbnRmLmpzIGJ5IEFzaCBTZWFybGU6CiAqCiAqICAgICB2ZXJzaW9uIDIwMDcuMDQuMjcKICogICAgIGF1dGhvciBBc2ggU2VhcmxlCiAqICAgICBodHRwOi8vaGV4bWVuLmNvbS9ibG9nLzIwMDcvMDMvcHJpbnRmLXNwcmludGYvCiAqICAgICBodHRwOi8vaGV4bWVuLmNvbS9qcy9zcHJpbnRmLmpzCiAqICAgICBUaGUgYXV0aG9yIChBc2ggU2VhcmxlKSBoYXMgcGxhY2VkIHRoaXMgY29kZSBpbiB0aGUgcHVibGljIGRvbWFpbjoKICogICAgICJUaGlzIGNvZGUgaXMgdW5yZXN0cmljdGVkOiB5b3UgYXJlIGZyZWUgdG8gdXNlIGl0IGhvd2V2ZXIgeW91IGxpa2UuIgogKgogKiBpbmNsdWRlZCBqc0RhdGUgbGlicmFyeSBieSBDaHJpcyBMZW9uZWxsbzoKICoKICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEgQ2hyaXMgTGVvbmVsbG8KICoKICoganNEYXRlIGlzIGN1cnJlbnRseSBhdmFpbGFibGUgZm9yIHVzZSBpbiBhbGwgcGVyc29uYWwgb3IgY29tbWVyY2lhbCBwcm9qZWN0cyAKICogdW5kZXIgYm90aCB0aGUgTUlUIGFuZCBHUEwgdmVyc2lvbiAyLjAgbGljZW5zZXMuIFRoaXMgbWVhbnMgdGhhdCB5b3UgY2FuIAogKiBjaG9vc2UgdGhlIGxpY2Vuc2UgdGhhdCBiZXN0IHN1aXRzIHlvdXIgcHJvamVjdCBhbmQgdXNlIGl0IGFjY29yZGluZ2x5LgogKgogKiBqc0RhdGUgYm9ycm93cyBtYW55IGNvbmNlcHRzIGFuZCBpZGVhcyBmcm9tIHRoZSBEYXRlIEluc3RhbmNlIAogKiBNZXRob2RzIGJ5IEtlbiBTbnlkZXIgYWxvbmcgd2l0aCBzb21lIHBhcnRzIG9mIEtlbidzIGFjdHVhbCBjb2RlLgogKiAKICogS2VuJ3Mgb3JpZ2lhbmwgRGF0ZSBJbnN0YW5jZSBNZXRob2RzIGFuZCBjb3B5cmlnaHQgbm90aWNlOgogKiAKICogS2VuIFNueWRlciAoa2VuIGQgc255ZGVyIGF0IGdtYWlsIGRvdCBjb20pCiAqIDIwMDgtMDktMTAKICogdmVyc2lvbiAyLjAuMiAoaHR0cDovL2tlbmRzbnlkZXIuY29tL3NhbmRib3gvZGF0ZS8pICAgICAKICogQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbiBMaWNlbnNlIDMuMCAoaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnkvMy4wLykKICoKICoganFwbG90VG9JbWFnZSBmdW5jdGlvbiBiYXNlZCBvbiBMYXJyeSBTaWRlbidzIGV4cG9ydC1qcXBsb3QtdG8tcG5nLmpzLgogKiBMYXJyeSBoYXMgZ2VuZXJvdXNseSBnaXZlbiBwZXJtaXNzaW9uIHRvIGFkYXB0IGhpcyBjb2RlIGZvciBpbmNsdXNpb24KICogaW50byBqcVBsb3QuCiAqCiAqIExhcnJ5J3Mgb3JpZ2luYWwgY29kZSBjYW4gYmUgZm91bmQgaGVyZToKICoKICogaHR0cHM6Ly9naXRodWIuY29tL2xzaWRlbi9leHBvcnQtanFwbG90LXRvLXBuZwogKiAKICogCiAqLwooZnVuY3Rpb24oYSl7YS5qcXBsb3QuQ2FudmFzQXhpc1RpY2tSZW5kZXJlcj1mdW5jdGlvbihiKXt0aGlzLm1hcms9Im91dHNpZGUiO3RoaXMuc2hvd01hcms9dHJ1ZTt0aGlzLnNob3dHcmlkbGluZT10cnVlO3RoaXMuaXNNaW5vclRpY2s9ZmFsc2U7dGhpcy5hbmdsZT0wO3RoaXMubWFya1NpemU9NDt0aGlzLnNob3c9dHJ1ZTt0aGlzLnNob3dMYWJlbD10cnVlO3RoaXMubGFiZWxQb3NpdGlvbj0iYXV0byI7dGhpcy5sYWJlbD0iIjt0aGlzLnZhbHVlPW51bGw7dGhpcy5fc3R5bGVzPXt9O3RoaXMuZm9ybWF0dGVyPWEuanFwbG90LkRlZmF1bHRUaWNrRm9ybWF0dGVyO3RoaXMuZm9ybWF0U3RyaW5nPSIiO3RoaXMucHJlZml4PSIiO3RoaXMuZm9udEZhbWlseT0nIlRyZWJ1Y2hldCBNUyIsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWYnO3RoaXMuZm9udFNpemU9IjEwcHQiO3RoaXMuZm9udFdlaWdodD0ibm9ybWFsIjt0aGlzLmZvbnRTdHJldGNoPTE7dGhpcy50ZXh0Q29sb3I9IiM2NjY2NjYiO3RoaXMuZW5hYmxlRm9udFN1cHBvcnQ9dHJ1ZTt0aGlzLnB0MnB4PW51bGw7dGhpcy5fZWxlbTt0aGlzLl9jdHg7dGhpcy5fcGxvdFdpZHRoO3RoaXMuX3Bsb3RIZWlnaHQ7dGhpcy5fcGxvdERpbWVuc2lvbnM9e2hlaWdodDpudWxsLHdpZHRoOm51bGx9O2EuZXh0ZW5kKHRydWUsdGhpcyxiKTt2YXIgYz17Zm9udFNpemU6dGhpcy5mb250U2l6ZSxmb250V2VpZ2h0OnRoaXMuZm9udFdlaWdodCxmb250U3RyZXRjaDp0aGlzLmZvbnRTdHJldGNoLGZpbGxTdHlsZTp0aGlzLnRleHRDb2xvcixhbmdsZTp0aGlzLmdldEFuZ2xlUmFkKCksZm9udEZhbWlseTp0aGlzLmZvbnRGYW1pbHl9O2lmKHRoaXMucHQycHgpe2MucHQycHg9dGhpcy5wdDJweH1pZih0aGlzLmVuYWJsZUZvbnRTdXBwb3J0KXtpZihhLmpxcGxvdC5zdXBwb3J0X2NhbnZhc190ZXh0KCkpe3RoaXMuX3RleHRSZW5kZXJlcj1uZXcgYS5qcXBsb3QuQ2FudmFzRm9udFJlbmRlcmVyKGMpfWVsc2V7dGhpcy5fdGV4dFJlbmRlcmVyPW5ldyBhLmpxcGxvdC5DYW52YXNUZXh0UmVuZGVyZXIoYyl9fWVsc2V7dGhpcy5fdGV4dFJlbmRlcmVyPW5ldyBhLmpxcGxvdC5DYW52YXNUZXh0UmVuZGVyZXIoYyl9fTthLmpxcGxvdC5DYW52YXNBeGlzVGlja1JlbmRlcmVyLnByb3RvdHlwZS5pbml0PWZ1bmN0aW9uKGIpe2EuZXh0ZW5kKHRydWUsdGhpcyxiKTt0aGlzLl90ZXh0UmVuZGVyZXIuaW5pdCh7Zm9udFNpemU6dGhpcy5mb250U2l6ZSxmb250V2VpZ2h0OnRoaXMuZm9udFdlaWdodCxmb250U3RyZXRjaDp0aGlzLmZvbnRTdHJldGNoLGZpbGxTdHlsZTp0aGlzLnRleHRDb2xvcixhbmdsZTp0aGlzLmdldEFuZ2xlUmFkKCksZm9udEZhbWlseTp0aGlzLmZvbnRGYW1pbHl9KX07YS5qcXBsb3QuQ2FudmFzQXhpc1RpY2tSZW5kZXJlci5wcm90b3R5cGUuZ2V0V2lkdGg9ZnVuY3Rpb24oZCl7aWYodGhpcy5fZWxlbSl7cmV0dXJuIHRoaXMuX2VsZW0ub3V0ZXJXaWR0aCh0cnVlKX1lbHNle3ZhciBmPXRoaXMuX3RleHRSZW5kZXJlcjt2YXIgYz1mLmdldFdpZHRoKGQpO3ZhciBlPWYuZ2V0SGVpZ2h0KGQpO3ZhciBiPU1hdGguYWJzKE1hdGguc2luKGYuYW5nbGUpKmUpK01hdGguYWJzKE1hdGguY29zKGYuYW5nbGUpKmMpO3JldHVybiBifX07YS5qcXBsb3QuQ2FudmFzQXhpc1RpY2tSZW5kZXJlci5wcm90b3R5cGUuZ2V0SGVpZ2h0PWZ1bmN0aW9uKGQpe2lmKHRoaXMuX2VsZW0pe3JldHVybiB0aGlzLl9lbGVtLm91dGVySGVpZ2h0KHRydWUpfWVsc2V7dmFyIGY9dGhpcy5fdGV4dFJlbmRlcmVyO3ZhciBjPWYuZ2V0V2lkdGgoZCk7dmFyIGU9Zi5nZXRIZWlnaHQoZCk7dmFyIGI9TWF0aC5hYnMoTWF0aC5jb3MoZi5hbmdsZSkqZSkrTWF0aC5hYnMoTWF0aC5zaW4oZi5hbmdsZSkqYyk7cmV0dXJuIGJ9fTthLmpxcGxvdC5DYW52YXNBeGlzVGlja1JlbmRlcmVyLnByb3RvdHlwZS5nZXRBbmdsZVJhZD1mdW5jdGlvbigpe3ZhciBiPXRoaXMuYW5nbGUqTWF0aC5QSS8xODA7cmV0dXJuIGJ9O2EuanFwbG90LkNhbnZhc0F4aXNUaWNrUmVuZGVyZXIucHJvdG90eXBlLnNldFRpY2s9ZnVuY3Rpb24oYixkLGMpe3RoaXMudmFsdWU9YjtpZihjKXt0aGlzLmlzTWlub3JUaWNrPXRydWV9cmV0dXJuIHRoaXN9O2EuanFwbG90LkNhbnZhc0F4aXNUaWNrUmVuZGVyZXIucHJvdG90eXBlLmRyYXc9ZnVuY3Rpb24oYyxmKXtpZighdGhpcy5sYWJlbCl7dGhpcy5sYWJlbD10aGlzLnByZWZpeCt0aGlzLmZvcm1hdHRlcih0aGlzLmZvcm1hdFN0cmluZyx0aGlzLnZhbHVlKX1pZih0aGlzLl9lbGVtKXtpZihhLmpxcGxvdC51c2VfZXhjYW52YXMmJndpbmRvdy5HX3ZtbENhbnZhc01hbmFnZXIudW5pbml0RWxlbWVudCE9PXVuZGVmaW5lZCl7d2luZG93Lkdfdm1sQ2FudmFzTWFuYWdlci51bmluaXRFbGVtZW50KHRoaXMuX2VsZW0uZ2V0KDApKX10aGlzLl9lbGVtLmVtcHR5Rm9yY2UoKTt0aGlzLl9lbGVtPW51bGx9dmFyIGU9Zi5jYW52YXNNYW5hZ2VyLmdldENhbnZhcygpO3RoaXMuX3RleHRSZW5kZXJlci5zZXRUZXh0KHRoaXMubGFiZWwsYyk7dmFyIGI9dGhpcy5nZXRXaWR0aChjKTt2YXIgZD10aGlzLmdldEhlaWdodChjKTtlLndpZHRoPWI7ZS5oZWlnaHQ9ZDtlLnN0eWxlLndpZHRoPWI7ZS5zdHlsZS5oZWlnaHQ9ZDtlLnN0eWxlLnRleHRBbGlnbj0ibGVmdCI7ZS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiO2U9Zi5jYW52YXNNYW5hZ2VyLmluaXRDYW52YXMoZSk7dGhpcy5fZWxlbT1hKGUpO3RoaXMuX2VsZW0uY3NzKHRoaXMuX3N0eWxlcyk7dGhpcy5fZWxlbS5hZGRDbGFzcygianFwbG90LSIrdGhpcy5heGlzKyItdGljayIpO2U9bnVsbDtyZXR1cm4gdGhpcy5fZWxlbX07YS5qcXBsb3QuQ2FudmFzQXhpc1RpY2tSZW5kZXJlci5wcm90b3R5cGUucGFjaz1mdW5jdGlvbigpe3RoaXMuX3RleHRSZW5kZXJlci5kcmF3KHRoaXMuX2VsZW0uZ2V0KDApLmdldENvbnRleHQoIjJkIiksdGhpcy5sYWJlbCl9fSkoalF1ZXJ5KTs=]]></data>
	</file>
	<file>
	  <filename>/src/plugins/jqplot.canvasOverlay.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqCiAqIGpxUGxvdAogKiBQdXJlIEphdmFTY3JpcHQgcGxvdHRpbmcgcGx1Z2luIHVzaW5nIGpRdWVyeQogKgogKiBWZXJzaW9uOiAxLjAuMGIyX3IxMDEyCiAqCiAqIENvcHlyaWdodCAoYykgMjAwOS0yMDExIENocmlzIExlb25lbGxvCiAqIGpxUGxvdCBpcyBjdXJyZW50bHkgYXZhaWxhYmxlIGZvciB1c2UgaW4gYWxsIHBlcnNvbmFsIG9yIGNvbW1lcmNpYWwgcHJvamVjdHMgCiAqIHVuZGVyIGJvdGggdGhlIE1JVCAoaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHApIGFuZCBHUEwgCiAqIHZlcnNpb24gMi4wIChodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC5odG1sKSBsaWNlbnNlcy4gVGhpcyBtZWFucyB0aGF0IHlvdSBjYW4gCiAqIGNob29zZSB0aGUgbGljZW5zZSB0aGF0IGJlc3Qgc3VpdHMgeW91ciBwcm9qZWN0IGFuZCB1c2UgaXQgYWNjb3JkaW5nbHkuIAogKgogKiBBbHRob3VnaCBub3QgcmVxdWlyZWQsIHRoZSBhdXRob3Igd291bGQgYXBwcmVjaWF0ZSBhbiBlbWFpbCBsZXR0aW5nIGhpbSAKICoga25vdyBvZiBhbnkgc3Vic3RhbnRpYWwgdXNlIG9mIGpxUGxvdC4gIFlvdSBjYW4gcmVhY2ggdGhlIGF1dGhvciBhdDogCiAqIGNocmlzIGF0IGpxcGxvdCBkb3QgY29tIG9yIHNlZSBodHRwOi8vd3d3LmpxcGxvdC5jb20vaW5mby5waHAgLgogKgogKiBJZiB5b3UgYXJlIGZlZWxpbmcga2luZCBhbmQgZ2VuZXJvdXMsIGNvbnNpZGVyIHN1cHBvcnRpbmcgdGhlIHByb2plY3QgYnkKICogbWFraW5nIGEgZG9uYXRpb24gYXQ6IGh0dHA6Ly93d3cuanFwbG90LmNvbS9kb25hdGUucGhwIC4KICoKICogc3ByaW50ZiBmdW5jdGlvbnMgY29udGFpbmVkIGluIGpxcGxvdC5zcHJpbnRmLmpzIGJ5IEFzaCBTZWFybGU6CiAqCiAqICAgICB2ZXJzaW9uIDIwMDcuMDQuMjcKICogICAgIGF1dGhvciBBc2ggU2VhcmxlCiAqICAgICBodHRwOi8vaGV4bWVuLmNvbS9ibG9nLzIwMDcvMDMvcHJpbnRmLXNwcmludGYvCiAqICAgICBodHRwOi8vaGV4bWVuLmNvbS9qcy9zcHJpbnRmLmpzCiAqICAgICBUaGUgYXV0aG9yIChBc2ggU2VhcmxlKSBoYXMgcGxhY2VkIHRoaXMgY29kZSBpbiB0aGUgcHVibGljIGRvbWFpbjoKICogICAgICJUaGlzIGNvZGUgaXMgdW5yZXN0cmljdGVkOiB5b3UgYXJlIGZyZWUgdG8gdXNlIGl0IGhvd2V2ZXIgeW91IGxpa2UuIgogKiAKICovCihmdW5jdGlvbigkKSB7CiAgICB2YXIgb2JqQ291bnRlciA9IDA7CiAgICAvLyBjbGFzczogJC5qcXBsb3QuQ2FudmFzT3ZlcmxheQogICAgJC5qcXBsb3QuQ2FudmFzT3ZlcmxheSA9IGZ1bmN0aW9uKG9wdHMpewogICAgICAgIHZhciBvcHRpb25zID0gb3B0cyB8fCB7fTsKICAgICAgICB0aGlzLm9wdGlvbnMgPSB7CiAgICAgICAgICAgIHNob3c6ICQuanFwbG90LmNvbmZpZy5lbmFibGVQbHVnaW5zLAogICAgICAgICAgICBkZWZlckRyYXc6IGZhbHNlCiAgICAgICAgfTsKICAgICAgICAvLyBwcm9wOiBvYmplY3RzCiAgICAgICAgdGhpcy5vYmplY3RzID0gW107CiAgICAgICAgdGhpcy5vYmplY3ROYW1lcyA9IFtdOwogICAgICAgIHRoaXMuY2FudmFzID0gbnVsbDsKICAgICAgICB0aGlzLm1hcmtlclJlbmRlcmVyID0gbmV3ICQuanFwbG90Lk1hcmtlclJlbmRlcmVyKHtzdHlsZTonbGluZSd9KTsKICAgICAgICB0aGlzLm1hcmtlclJlbmRlcmVyLmluaXQoKTsKICAgICAgICB0aGlzLmhpZ2hsaWdodE9iamVjdEluZGV4ID0gbnVsbDsKICAgICAgICBpZiAob3B0aW9ucy5vYmplY3RzKSB7CiAgICAgICAgICAgIHZhciBvYmpzID0gb3B0aW9ucy5vYmplY3RzLAogICAgICAgICAgICAgICAgb2JqOwogICAgICAgICAgICBmb3IgKHZhciBpPTA7IGk8b2Jqcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgb2JqID0gb2Jqc1tpXTsKICAgICAgICAgICAgICAgIGZvciAodmFyIG4gaW4gb2JqKSB7CiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2xpbmUnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRMaW5lKG9ialtuXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnaG9yaXpvbnRhbExpbmUnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRIb3Jpem9udGFsTGluZShvYmpbbl0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2Rhc2hlZEhvcml6b250YWxMaW5lJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkRGFzaGVkSG9yaXpvbnRhbExpbmUob2JqW25dKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd2ZXJ0aWNhbExpbmUnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRWZXJ0aWNhbExpbmUob2JqW25dKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdkYXNoZWRWZXJ0aWNhbExpbmUnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGREYXNoZWRWZXJ0aWNhbExpbmUob2JqW25dKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSAgIAogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICQuZXh0ZW5kKHRydWUsIHRoaXMub3B0aW9ucywgb3B0aW9ucyk7CiAgICB9OwogICAgCiAgICAvLyBjYWxsZWQgd2l0aCBzY29wZSBvZiBhIHBsb3Qgb2JqZWN0CiAgICAkLmpxcGxvdC5DYW52YXNPdmVybGF5LnBvc3RQbG90SW5pdCA9IGZ1bmN0aW9uICh0YXJnZXQsIGRhdGEsIG9wdHMpIHsKICAgICAgICB2YXIgb3B0aW9ucyA9IG9wdHMgfHwge307CiAgICAgICAgLy8gYWRkIGEgY2FudmFzT3ZlcmxheSBhdHRyaWJ1dGUgdG8gdGhlIHBsb3QKICAgICAgICB0aGlzLnBsdWdpbnMuY2FudmFzT3ZlcmxheSA9IG5ldyAkLmpxcGxvdC5DYW52YXNPdmVybGF5KG9wdGlvbnMuY2FudmFzT3ZlcmxheSk7ICAgICAKICAgIH07CgoKICAgIGZ1bmN0aW9uIExpbmVCYXNlKCkgewogICAgICAgIHRoaXMudWlkID0gbnVsbDsKICAgICAgICB0aGlzLnR5cGUgPSBudWxsOwogICAgICAgIHRoaXMuZ3JpZFN0YXJ0ID0gbnVsbDsKICAgICAgICB0aGlzLmdyaWRTdG9wID0gbnVsbDsKICAgICAgICB0aGlzLnRvb2x0aXBXaWR0aEZhY3RvciA9IDA7CiAgICAgICAgdGhpcy5vcHRpb25zID0geyAgICAgICAgICAgCiAgICAgICAgICAgIC8vIHByb3A6IG5hbWUKICAgICAgICAgICAgLy8gT3B0aW9uYWwgbmFtZSBmb3IgdGhlIG92ZXJsYXkgb2JqZWN0LgogICAgICAgICAgICAvLyBDYW4gYmUgbGF0ZXIgdXNlZCB0byByZXRyaWV2ZSB0aGUgb2JqZWN0IGJ5IG5hbWUuCiAgICAgICAgICAgIG5hbWU6IG51bGwsCiAgICAgICAgICAgIC8vIHByb3A6IHNob3cKICAgICAgICAgICAgLy8gdHJ1ZSB0byBzaG93IChkcmF3KSwgZmFsc2UgdG8gbm90IGRyYXcuCiAgICAgICAgICAgIHNob3c6IHRydWUsCiAgICAgICAgICAgIC8vIHByb3A6IGxpbmVXaWR0aAogICAgICAgICAgICAvLyBXaWR0aCBvZiB0aGUgbGluZS4KICAgICAgICAgICAgbGluZVdpZHRoOiAyLAogICAgICAgICAgICAvLyBwcm9wOiBsaW5lQ2FwCiAgICAgICAgICAgIC8vIFR5cGUgb2YgZW5kaW5nIHBsYWNlZCBvbiB0aGUgbGluZSBbJ3JvdW5kJywgJ2J1dHQnLCAnc3F1YXJlJ10KICAgICAgICAgICAgbGluZUNhcDogJ3JvdW5kJywKICAgICAgICAgICAgLy8gcHJvcDogY29sb3IKICAgICAgICAgICAgLy8gY29sb3Igb2YgdGhlIGxpbmUKICAgICAgICAgICAgY29sb3I6ICcjNjY2NjY2JywKICAgICAgICAgICAgLy8gcHJvcDogc2hhZG93CiAgICAgICAgICAgIC8vIHdldGhlciBvciBub3QgdG8gZHJhdyBhIHNoYWRvdyBvbiB0aGUgbGluZQogICAgICAgICAgICBzaGFkb3c6IHRydWUsCiAgICAgICAgICAgIC8vIHByb3A6IHNoYWRvd0FuZ2xlCiAgICAgICAgICAgIC8vIFNoYWRvdyBhbmdsZSBpbiBkZWdyZWVzCiAgICAgICAgICAgIHNoYWRvd0FuZ2xlOiA0NSwKICAgICAgICAgICAgLy8gcHJvcDogc2hhZG93T2Zmc2V0CiAgICAgICAgICAgIC8vIFNoYWRvdyBvZmZzZXQgZnJvbSBsaW5lIGluIHBpeGVscwogICAgICAgICAgICBzaGFkb3dPZmZzZXQ6IDEsCiAgICAgICAgICAgIC8vIHByb3A6IHNoYWRvd0RlcHRoCiAgICAgICAgICAgIC8vIE51bWJlciBvZiB0aW1lcyBzaGFkb3cgaXMgc3Ryb2tlZCwgZWFjaCBzdHJva2Ugb2Zmc2V0IHNoYWRvd09mZnNldCBmcm9tIHRoZSBsYXN0LgogICAgICAgICAgICBzaGFkb3dEZXB0aDogMywKICAgICAgICAgICAgLy8gcHJvcDogc2hhZG93QWxwaGEKICAgICAgICAgICAgLy8gQWxwaGEgY2hhbm5lbCB0cmFuc3BhcmVuY3kgb2Ygc2hhZG93LiAgMCA9IHRyYW5zcGFyZW50LgogICAgICAgICAgICBzaGFkb3dBbHBoYTogJzAuMDcnLAogICAgICAgICAgICAvLyBwcm9wOiB4YXhpcwogICAgICAgICAgICAvLyBYIGF4aXMgdG8gdXNlIGZvciBwb3NpdGlvbmluZy9zY2FsaW5nIHRoZSBsaW5lLgogICAgICAgICAgICB4YXhpczogJ3hheGlzJywKICAgICAgICAgICAgLy8gcHJvcDogeWF4aXMKICAgICAgICAgICAgLy8gWSBheGlzIHRvIHVzZSBmb3IgcG9zaXRpb25pbmcvc2NhbGluZyB0aGUgbGluZS4KICAgICAgICAgICAgeWF4aXM6ICd5YXhpcycsCiAgICAgICAgICAgIC8vIHByb3A6IHNob3dUb29sdGlwCiAgICAgICAgICAgIC8vIFNob3cgYSB0b29sdGlwIHdpdGggZGF0YSBwb2ludCB2YWx1ZXMuCiAgICAgICAgICAgIHNob3dUb29sdGlwOiBmYWxzZSwKICAgICAgICAgICAgLy8gcHJvcDogc2hvd1Rvb2x0aXBQcmVjaXNpb24KICAgICAgICAgICAgLy8gQ29udHJvbHMgaG93IGNsb3NlIHRvIGxpbmUgY3Vyc29yIG11c3QgYmUgdG8gc2hvdyB0b29sdGlwLgogICAgICAgICAgICAvLyBIaWdoZXIgbnVtYmVyID0gY2xvc2VyIHRvIGxpbmUsIGxvd2VyIG51bWJlciA9IGZhcnRoZXIgZnJvbSBsaW5lLgogICAgICAgICAgICAvLyAxLjAgPSBjdXJzb3IgbXVzdCBiZSBvdmVyIGxpbmUuCiAgICAgICAgICAgIHNob3dUb29sdGlwUHJlY2lzaW9uOiAwLjYsCiAgICAgICAgICAgIC8vIHByb3A6IHRvb2x0aXBMb2NhdGlvbgogICAgICAgICAgICAvLyBXaGVyZSB0byBwb3NpdGlvbiB0b29sdGlwLCAnbicsICduZScsICdlJywgJ3NlJywgJ3MnLCAnc3cnLCAndycsICdudycKICAgICAgICAgICAgdG9vbHRpcExvY2F0aW9uOiAnbncnLAogICAgICAgICAgICAvLyBwcm9wOiBmYWRlVG9vbHRpcAogICAgICAgICAgICAvLyB0cnVlID0gZmFkZSBpbi9vdXQgdG9vbHRpcCwgZmxhc2UgPSBzaG93L2hpZGUgdG9vbHRpcAogICAgICAgICAgICBmYWRlVG9vbHRpcDogdHJ1ZSwKICAgICAgICAgICAgLy8gcHJvcDogdG9vbHRpcEZhZGVTcGVlZAogICAgICAgICAgICAvLyAnc2xvdycsICdkZWYnLCAnZmFzdCcsIG9yIG51bWJlciBvZiBtaWxsaXNlY29uZHMuCiAgICAgICAgICAgIHRvb2x0aXBGYWRlU3BlZWQ6ICJmYXN0IiwKICAgICAgICAgICAgLy8gcHJvcDogdG9vbHRpcE9mZnNldAogICAgICAgICAgICAvLyBQaXhlbCBvZmZzZXQgb2YgdG9vbHRpcCBmcm9tIHRoZSBoaWdobGlnaHQuCiAgICAgICAgICAgIHRvb2x0aXBPZmZzZXQ6IDQsCiAgICAgICAgICAgIC8vIHByb3A6IHRvb2x0aXBGb3JtYXRTdHJpbmcKICAgICAgICAgICAgLy8gRm9ybWF0IHN0cmluZyBwYXNzZWQgdGhlIHggYW5kIHkgdmFsdWVzIG9mIHRoZSBjdXJzb3Igb24gdGhlIGxpbmUuCiAgICAgICAgICAgIC8vIGUuZy4sICdEb2dzOiAlLjJmLCBDYXRzOiAlZCcuCiAgICAgICAgICAgIHRvb2x0aXBGb3JtYXRTdHJpbmc6ICclZCwgJWQnCiAgICAgICAgfTsKICAgIH0KCiAgICAvKioKICAgICAqIENsYXNzOiBMaW5lCiAgICAgKiBBIHN0cmFpZ2h0IGxpbmUuCiAgICAgKi8KICAgIGZ1bmN0aW9uIExpbmUob3B0aW9ucykgewogICAgICAgIExpbmVCYXNlLmNhbGwodGhpcyk7CiAgICAgICAgdGhpcy50eXBlID0gJ2xpbmUnOwogICAgICAgIHZhciBvcHRzID0gewogICAgICAgICAgICAvLyBwcm9wOiBzdGFydAogICAgICAgICAgICAvLyBbeCwgeV0gY29vcmRpbmF0ZXMgZm9yIHRoZSBzdGFydCBvZiB0aGUgbGluZS4KICAgICAgICAgICAgc3RhcnQ6IFtdLAogICAgICAgICAgICAvLyBwcm9wOiBzdG9wCiAgICAgICAgICAgIC8vIFt4LCB5XSBjb29yZGluYXRlcyBmb3IgdGhlIGVuZCBvZiB0aGUgbGluZS4KICAgICAgICAgICAgc3RvcDogW10KICAgICAgICB9OwogICAgICAgICQuZXh0ZW5kKHRydWUsIHRoaXMub3B0aW9ucywgb3B0cywgb3B0aW9ucyk7CgogICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc2hvd1Rvb2x0aXBQcmVjaXNpb24gPCAwLjAxKSB7CiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5zaG93VG9vbHRpcFByZWNpc2lvbiA9IDAuMDE7CiAgICAgICAgfQogICAgfQoKICAgIExpbmUucHJvdG90eXBlID0gbmV3IExpbmVCYXNlKCk7CiAgICBMaW5lLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IExpbmU7CgoKICAgIC8qKgogICAgICogQ2xhc3M6IEhvcml6b250YWxMaW5lCiAgICAgKiBBIHN0cmFpZ2h0IGhvcml6b250YWwgbGluZS4KICAgICAqLwogICAgZnVuY3Rpb24gSG9yaXpvbnRhbExpbmUob3B0aW9ucykgewogICAgICAgIExpbmVCYXNlLmNhbGwodGhpcyk7CiAgICAgICAgdGhpcy50eXBlID0gJ2hvcml6b250YWxMaW5lJzsKICAgICAgICB2YXIgb3B0cyA9IHsKICAgICAgICAgICAgLy8gcHJvcDogeQogICAgICAgICAgICAvLyB5IHZhbHVlIHRvIHBvc2l0aW9uIHRoZSBsaW5lCiAgICAgICAgICAgIHk6IG51bGwsCiAgICAgICAgICAgIC8vIHByb3A6IHhtaW4KICAgICAgICAgICAgLy8geCB2YWx1ZSBmb3IgdGhlIHN0YXJ0IG9mIHRoZSBsaW5lLCBudWxsIHRvIHNjYWxlIHRvIGF4aXMgbWluLgogICAgICAgICAgICB4bWluOiBudWxsLAogICAgICAgICAgICAvLyBwcm9wOiB4bWF4CiAgICAgICAgICAgIC8vIHggdmFsdWUgZm9yIHRoZSBlbmQgb2YgdGhlIGxpbmUsIG51bGwgdG8gc2NhbGUgdG8gYXhpcyBtYXguCiAgICAgICAgICAgIHhtYXg6IG51bGwsCiAgICAgICAgICAgIC8vIHByb3AgeE9mZnNldAogICAgICAgICAgICAvLyBvZmZzZXQgZW5kcyBvZiB0aGUgbGluZSBpbnNpZGUgdGhlIGdyaWQuICBOdW1iZXIgCiAgICAgICAgICAgIHhPZmZzZXQ6ICc2cHgnLCAvLyBudW1iZXIgb3Igc3RyaW5nLiAgTnVtYmVyIGludGVycHJldGVkIGFzIHVuaXRzLCBzdHJpbmcgYXMgcGl4ZWxzLgogICAgICAgICAgICB4bWluT2Zmc2V0OiBudWxsLAogICAgICAgICAgICB4bWF4T2Zmc2V0OiBudWxsCiAgICAgICAgfTsKICAgICAgICAkLmV4dGVuZCh0cnVlLCB0aGlzLm9wdGlvbnMsIG9wdHMsIG9wdGlvbnMpOwoKICAgICAgICBpZiAodGhpcy5vcHRpb25zLnNob3dUb29sdGlwUHJlY2lzaW9uIDwgMC4wMSkgewogICAgICAgICAgICB0aGlzLm9wdGlvbnMuc2hvd1Rvb2x0aXBQcmVjaXNpb24gPSAwLjAxOwogICAgICAgIH0KICAgIH0KCiAgICBIb3Jpem9udGFsTGluZS5wcm90b3R5cGUgPSBuZXcgTGluZUJhc2UoKTsKICAgIEhvcml6b250YWxMaW5lLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEhvcml6b250YWxMaW5lOwogICAgCgogICAgLyoqCiAgICAgKiBDbGFzczogRGFzaGVkSG9yaXpvbnRhbExpbmUKICAgICAqIEEgc3RyYWlnaHQgZGFzaGVkIGhvcml6b250YWwgbGluZS4KICAgICAqLwogICAgZnVuY3Rpb24gRGFzaGVkSG9yaXpvbnRhbExpbmUob3B0aW9ucykgewogICAgICAgIExpbmVCYXNlLmNhbGwodGhpcyk7CiAgICAgICAgdGhpcy50eXBlID0gJ2Rhc2hlZEhvcml6b250YWxMaW5lJzsKICAgICAgICB2YXIgb3B0cyA9IHsKICAgICAgICAgICAgeTogbnVsbCwKICAgICAgICAgICAgeG1pbjogbnVsbCwKICAgICAgICAgICAgeG1heDogbnVsbCwKICAgICAgICAgICAgeE9mZnNldDogJzZweCcsIC8vIG51bWJlciBvciBzdHJpbmcuICBOdW1iZXIgaW50ZXJwcmV0ZWQgYXMgdW5pdHMsIHN0cmluZyBhcyBwaXhlbHMuCiAgICAgICAgICAgIHhtaW5PZmZzZXQ6IG51bGwsCiAgICAgICAgICAgIHhtYXhPZmZzZXQ6IG51bGwsCiAgICAgICAgICAgIC8vIHByb3A6IGRhc2hQYXR0ZXJuCiAgICAgICAgICAgIC8vIEFycmF5IG9mIGxpbmUsIHNwYWNlIHNldHRpbmdzIGluIHBpeGVscy4KICAgICAgICAgICAgLy8gRGVmYXVsdCBpcyA4IHBpeGVsIG9mIGxpbmUsIDggcGl4ZWwgb2Ygc3BhY2UuCiAgICAgICAgICAgIC8vIE5vdGUsIGxpbWl0IHRvIGEgMiBlbGVtZW50IGFycmF5IGIvYyBvZiBidWcgd2l0aCBoaWdoZXIgb3JkZXIgYXJyYXlzLgogICAgICAgICAgICBkYXNoUGF0dGVybjogWzgsOF0KICAgICAgICB9OwogICAgICAgICQuZXh0ZW5kKHRydWUsIHRoaXMub3B0aW9ucywgb3B0cywgb3B0aW9ucyk7CgogICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc2hvd1Rvb2x0aXBQcmVjaXNpb24gPCAwLjAxKSB7CiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5zaG93VG9vbHRpcFByZWNpc2lvbiA9IDAuMDE7CiAgICAgICAgfQogICAgfQoKICAgIERhc2hlZEhvcml6b250YWxMaW5lLnByb3RvdHlwZSA9IG5ldyBMaW5lQmFzZSgpOwogICAgRGFzaGVkSG9yaXpvbnRhbExpbmUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gRGFzaGVkSG9yaXpvbnRhbExpbmU7CiAgICAKCiAgICAvKioKICAgICAqIENsYXNzOiBWZXJ0aWNhbExpbmUKICAgICAqIEEgc3RyYWlnaHQgdmVydGljYWwgbGluZS4KICAgICAqLwogICAgZnVuY3Rpb24gVmVydGljYWxMaW5lKG9wdGlvbnMpIHsKICAgICAgICBMaW5lQmFzZS5jYWxsKHRoaXMpOwogICAgICAgIHRoaXMudHlwZSA9ICd2ZXJ0aWNhbExpbmUnOwogICAgICAgIHZhciBvcHRzID0gewogICAgICAgICAgICB4OiBudWxsLAogICAgICAgICAgICB5bWluOiBudWxsLAogICAgICAgICAgICB5bWF4OiBudWxsLAogICAgICAgICAgICB5T2Zmc2V0OiAnNnB4JywgLy8gbnVtYmVyIG9yIHN0cmluZy4gIE51bWJlciBpbnRlcnByZXRlZCBhcyB1bml0cywgc3RyaW5nIGFzIHBpeGVscy4KICAgICAgICAgICAgeW1pbk9mZnNldDogbnVsbCwKICAgICAgICAgICAgeW1heE9mZnNldDogbnVsbAogICAgICAgIH07CiAgICAgICAgJC5leHRlbmQodHJ1ZSwgdGhpcy5vcHRpb25zLCBvcHRzLCBvcHRpb25zKTsKCiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5zaG93VG9vbHRpcFByZWNpc2lvbiA8IDAuMDEpIHsKICAgICAgICAgICAgdGhpcy5vcHRpb25zLnNob3dUb29sdGlwUHJlY2lzaW9uID0gMC4wMTsKICAgICAgICB9CiAgICB9CgogICAgVmVydGljYWxMaW5lLnByb3RvdHlwZSA9IG5ldyBMaW5lQmFzZSgpOwogICAgVmVydGljYWxMaW5lLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFZlcnRpY2FsTGluZTsKICAgIAoKICAgIC8qKgogICAgICogQ2xhc3M6IERhc2hlZFZlcnRpY2FsTGluZQogICAgICogQSBzdHJhaWdodCBkYXNoZWQgdmVydGljYWwgbGluZS4KICAgICAqLwogICAgZnVuY3Rpb24gRGFzaGVkVmVydGljYWxMaW5lKG9wdGlvbnMpIHsKICAgICAgICBMaW5lQmFzZS5jYWxsKHRoaXMpOwogICAgICAgIHRoaXMudHlwZSA9ICdkYXNoZWRWZXJ0aWNhbExpbmUnOwogICAgICAgIHRoaXMuc3RhcnQgPSBudWxsOwogICAgICAgIHRoaXMuc3RvcCA9IG51bGw7CiAgICAgICAgdmFyIG9wdHMgPSB7CiAgICAgICAgICAgIHg6IG51bGwsCiAgICAgICAgICAgIHltaW46IG51bGwsCiAgICAgICAgICAgIHltYXg6IG51bGwsCiAgICAgICAgICAgIHlPZmZzZXQ6ICc2cHgnLCAvLyBudW1iZXIgb3Igc3RyaW5nLiAgTnVtYmVyIGludGVycHJldGVkIGFzIHVuaXRzLCBzdHJpbmcgYXMgcGl4ZWxzLgogICAgICAgICAgICB5bWluT2Zmc2V0OiBudWxsLAogICAgICAgICAgICB5bWF4T2Zmc2V0OiBudWxsLAogICAgICAgICAgICAvLyBwcm9wOiBkYXNoUGF0dGVybgogICAgICAgICAgICAvLyBBcnJheSBvZiBsaW5lLCBzcGFjZSBzZXR0aW5ncyBpbiBwaXhlbHMuCiAgICAgICAgICAgIC8vIERlZmF1bHQgaXMgOCBwaXhlbCBvZiBsaW5lLCA4IHBpeGVsIG9mIHNwYWNlLgogICAgICAgICAgICAvLyBOb3RlLCBsaW1pdCB0byBhIDIgZWxlbWVudCBhcnJheSBiL2Mgb2YgYnVnIHdpdGggaGlnaGVyIG9yZGVyIGFycmF5cy4KICAgICAgICAgICAgZGFzaFBhdHRlcm46IFs4LDhdCiAgICAgICAgfTsKICAgICAgICAkLmV4dGVuZCh0cnVlLCB0aGlzLm9wdGlvbnMsIG9wdHMsIG9wdGlvbnMpOwoKICAgICAgICBpZiAodGhpcy5vcHRpb25zLnNob3dUb29sdGlwUHJlY2lzaW9uIDwgMC4wMSkgewogICAgICAgICAgICB0aGlzLm9wdGlvbnMuc2hvd1Rvb2x0aXBQcmVjaXNpb24gPSAwLjAxOwogICAgICAgIH0KICAgIH0KCiAgICBEYXNoZWRWZXJ0aWNhbExpbmUucHJvdG90eXBlID0gbmV3IExpbmVCYXNlKCk7CiAgICBEYXNoZWRWZXJ0aWNhbExpbmUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gRGFzaGVkVmVydGljYWxMaW5lOwogICAgCiAgICAkLmpxcGxvdC5DYW52YXNPdmVybGF5LnByb3RvdHlwZS5hZGRMaW5lID0gZnVuY3Rpb24ob3B0cykgewogICAgICAgIHZhciBsaW5lID0gbmV3IExpbmUob3B0cyk7CiAgICAgICAgbGluZS51aWQgPSBvYmpDb3VudGVyKys7CiAgICAgICAgdGhpcy5vYmplY3RzLnB1c2gobGluZSk7CiAgICAgICAgdGhpcy5vYmplY3ROYW1lcy5wdXNoKGxpbmUub3B0aW9ucy5uYW1lKTsKICAgIH07CiAgICAKICAgICQuanFwbG90LkNhbnZhc092ZXJsYXkucHJvdG90eXBlLmFkZEhvcml6b250YWxMaW5lID0gZnVuY3Rpb24ob3B0cykgewogICAgICAgIHZhciBsaW5lID0gbmV3IEhvcml6b250YWxMaW5lKG9wdHMpOwogICAgICAgIGxpbmUudWlkID0gb2JqQ291bnRlcisrOwogICAgICAgIHRoaXMub2JqZWN0cy5wdXNoKGxpbmUpOwogICAgICAgIHRoaXMub2JqZWN0TmFtZXMucHVzaChsaW5lLm9wdGlvbnMubmFtZSk7CiAgICB9OwogICAgCiAgICAkLmpxcGxvdC5DYW52YXNPdmVybGF5LnByb3RvdHlwZS5hZGREYXNoZWRIb3Jpem9udGFsTGluZSA9IGZ1bmN0aW9uKG9wdHMpIHsKICAgICAgICB2YXIgbGluZSA9IG5ldyBEYXNoZWRIb3Jpem9udGFsTGluZShvcHRzKTsKICAgICAgICBsaW5lLnVpZCA9IG9iakNvdW50ZXIrKzsKICAgICAgICB0aGlzLm9iamVjdHMucHVzaChsaW5lKTsKICAgICAgICB0aGlzLm9iamVjdE5hbWVzLnB1c2gobGluZS5vcHRpb25zLm5hbWUpOwogICAgfTsKICAgIAogICAgJC5qcXBsb3QuQ2FudmFzT3ZlcmxheS5wcm90b3R5cGUuYWRkVmVydGljYWxMaW5lID0gZnVuY3Rpb24ob3B0cykgewogICAgICAgIHZhciBsaW5lID0gbmV3IFZlcnRpY2FsTGluZShvcHRzKTsKICAgICAgICBsaW5lLnVpZCA9IG9iakNvdW50ZXIrKzsKICAgICAgICB0aGlzLm9iamVjdHMucHVzaChsaW5lKTsKICAgICAgICB0aGlzLm9iamVjdE5hbWVzLnB1c2gobGluZS5vcHRpb25zLm5hbWUpOwogICAgfTsKICAgIAogICAgJC5qcXBsb3QuQ2FudmFzT3ZlcmxheS5wcm90b3R5cGUuYWRkRGFzaGVkVmVydGljYWxMaW5lID0gZnVuY3Rpb24ob3B0cykgewogICAgICAgIHZhciBsaW5lID0gbmV3IERhc2hlZFZlcnRpY2FsTGluZShvcHRzKTsKICAgICAgICBsaW5lLnVpZCA9IG9iakNvdW50ZXIrKzsKICAgICAgICB0aGlzLm9iamVjdHMucHVzaChsaW5lKTsKICAgICAgICB0aGlzLm9iamVjdE5hbWVzLnB1c2gobGluZS5vcHRpb25zLm5hbWUpOwogICAgfTsKICAgIAogICAgJC5qcXBsb3QuQ2FudmFzT3ZlcmxheS5wcm90b3R5cGUucmVtb3ZlT2JqZWN0ID0gZnVuY3Rpb24oaWR4KSB7CiAgICAgICAgLy8gY2hlY2sgaWYgaW50ZWdlciwgcmVtb3ZlIGJ5IGluZGV4CiAgICAgICAgaWYgKCQudHlwZShpZHgpID09ICdudW1iZXInKSB7CiAgICAgICAgICAgIHRoaXMub2JqZWN0cy5zcGxpY2UoaWR4LCAxKTsKICAgICAgICAgICAgdGhpcy5vYmplY3ROYW1lcy5zcGxpY2UoaWR4LCAxKTsKICAgICAgICB9CiAgICAgICAgLy8gaWYgc3RyaW5nLCByZW1vdmUgYnkgbmFtZQogICAgICAgIGVsc2UgewogICAgICAgICAgICB2YXIgaWQgPSAkLmluQXJyYXkoaWR4LCB0aGlzLm9iamVjdE5hbWVzKTsKICAgICAgICAgICAgaWYgKGlkICE9IC0xKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9iamVjdHMuc3BsaWNlKGlkLCAxKTsKICAgICAgICAgICAgICAgIHRoaXMub2JqZWN0TmFtZXMuc3BsaWNlKGlkLCAxKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH07CiAgICAKICAgICQuanFwbG90LkNhbnZhc092ZXJsYXkucHJvdG90eXBlLmdldE9iamVjdCA9IGZ1bmN0aW9uKGlkeCkgewogICAgICAgIC8vIGNoZWNrIGlmIGludGVnZXIsIHJlbW92ZSBieSBpbmRleAogICAgICAgIGlmICgkLnR5cGUoaWR4KSA9PSAnbnVtYmVyJykgewogICAgICAgICAgICByZXR1cm4gdGhpcy5vYmplY3RzW2lkeF07CiAgICAgICAgfQogICAgICAgIC8vIGlmIHN0cmluZywgcmVtb3ZlIGJ5IG5hbWUKICAgICAgICBlbHNlIHsKICAgICAgICAgICAgdmFyIGlkID0gJC5pbkFycmF5KGlkeCwgdGhpcy5vYmplY3ROYW1lcyk7CiAgICAgICAgICAgIGlmIChpZCAhPSAtMSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMub2JqZWN0c1tpZF07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9OwogICAgCiAgICAvLyBTZXQgZ2V0IGFzIGFsaWFzIGZvciBnZXRPYmplY3QuCiAgICAkLmpxcGxvdC5DYW52YXNPdmVybGF5LnByb3RvdHlwZS5nZXQgPSAkLmpxcGxvdC5DYW52YXNPdmVybGF5LnByb3RvdHlwZS5nZXRPYmplY3Q7CiAgICAKICAgICQuanFwbG90LkNhbnZhc092ZXJsYXkucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24ocGxvdCkgewogICAgICAgIHRoaXMuY2FudmFzLl9jdHguY2xlYXJSZWN0KDAsMCx0aGlzLmNhbnZhcy5nZXRXaWR0aCgpLCB0aGlzLmNhbnZhcy5nZXRIZWlnaHQoKSk7CiAgICB9OwogICAgCiAgICAkLmpxcGxvdC5DYW52YXNPdmVybGF5LnByb3RvdHlwZS5kcmF3ID0gZnVuY3Rpb24ocGxvdCkgewogICAgICAgIHZhciBvYmosIAogICAgICAgICAgICBvYmpzID0gdGhpcy5vYmplY3RzLAogICAgICAgICAgICBtciA9IHRoaXMubWFya2VyUmVuZGVyZXIsCiAgICAgICAgICAgIHN0YXJ0LAogICAgICAgICAgICBzdG9wOwogICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc2hvdykgewogICAgICAgICAgICB0aGlzLmNhbnZhcy5fY3R4LmNsZWFyUmVjdCgwLDAsdGhpcy5jYW52YXMuZ2V0V2lkdGgoKSwgdGhpcy5jYW52YXMuZ2V0SGVpZ2h0KCkpOwogICAgICAgICAgICBmb3IgKHZhciBrPTA7IGs8b2Jqcy5sZW5ndGg7IGsrKykgewogICAgICAgICAgICAgICAgb2JqID0gb2Jqc1trXTsKICAgICAgICAgICAgICAgIHZhciBvcHRzID0gJC5leHRlbmQodHJ1ZSwge30sIG9iai5vcHRpb25zKTsKICAgICAgICAgICAgICAgIGlmIChvYmoub3B0aW9ucy5zaG93KSB7CiAgICAgICAgICAgICAgICAgICAgLy8gc3R5bGUgYW5kIHNoYWRvdyBwcm9wZXJ0aWVzIHNob3VsZCBiZSBzZXQgYmVmb3JlCiAgICAgICAgICAgICAgICAgICAgLy8gZXZlcnkgZHJhdyBvZiBtYXJrZXIgcmVuZGVyZXIuCiAgICAgICAgICAgICAgICAgICAgbXIuc2hhZG93ID0gb2JqLm9wdGlvbnMuc2hhZG93OwogICAgICAgICAgICAgICAgICAgIG9iai50b29sdGlwV2lkdGhGYWN0b3IgPSBvYmoub3B0aW9ucy5saW5lV2lkdGggLyBvYmoub3B0aW9ucy5zaG93VG9vbHRpcFByZWNpc2lvbjsKICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG9iai50eXBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2xpbmUnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3R5bGUgYW5kIHNoYWRvdyBwcm9wZXJ0aWVzIHNob3VsZCBiZSBzZXQgYmVmb3JlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBldmVyeSBkcmF3IG9mIG1hcmtlciByZW5kZXJlci4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1yLnN0eWxlID0gJ2xpbmUnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0cy5jbG9zZVBhdGggPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gW3Bsb3QuYXhlc1tvYmoub3B0aW9ucy54YXhpc10uc2VyaWVzX3UycChvYmoub3B0aW9ucy5zdGFydFswXSksIHBsb3QuYXhlc1tvYmoub3B0aW9ucy55YXhpc10uc2VyaWVzX3UycChvYmoub3B0aW9ucy5zdGFydFsxXSldOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcCA9IFtwbG90LmF4ZXNbb2JqLm9wdGlvbnMueGF4aXNdLnNlcmllc191MnAob2JqLm9wdGlvbnMuc3RvcFswXSksIHBsb3QuYXhlc1tvYmoub3B0aW9ucy55YXhpc10uc2VyaWVzX3UycChvYmoub3B0aW9ucy5zdG9wWzFdKV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmouZ3JpZFN0YXJ0ID0gc3RhcnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmouZ3JpZFN0b3AgPSBzdG9wOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbXIuZHJhdyhzdGFydCwgc3RvcCwgdGhpcy5jYW52YXMuX2N0eCwgb3B0cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnaG9yaXpvbnRhbExpbmUnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdHlsZSBhbmQgc2hhZG93IHByb3BlcnRpZXMgc2hvdWxkIGJlIHNldCBiZWZvcmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV2ZXJ5IGRyYXcgb2YgbWFya2VyIHJlbmRlcmVyLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9iai5vcHRpb25zLnkgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1yLnN0eWxlID0gJ2xpbmUnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdHMuY2xvc2VQYXRoID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHhheGlzID0gcGxvdC5heGVzW29iai5vcHRpb25zLnhheGlzXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeHN0YXJ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4c3RvcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IHBsb3QuYXhlc1tvYmoub3B0aW9ucy55YXhpc10uc2VyaWVzX3UycChvYmoub3B0aW9ucy55KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1pbm9mZiA9IG9iai5vcHRpb25zLnhtaW5PZmZzZXQgfHwgb2JqLm9wdGlvbnMueE9mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1heG9mZiA9IG9iai5vcHRpb25zLnhtYXhPZmZzZXQgfHwgb2JqLm9wdGlvbnMueE9mZnNldDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob2JqLm9wdGlvbnMueG1pbiAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhzdGFydCA9IHhheGlzLnNlcmllc191MnAob2JqLm9wdGlvbnMueG1pbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHhtaW5vZmYgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJC50eXBlKHhtaW5vZmYpID09ICJudW1iZXIiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4c3RhcnQgPSB4YXhpcy5zZXJpZXNfdTJwKHhheGlzLm1pbiArIHhtaW5vZmYpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCQudHlwZSh4bWlub2ZmKSA9PSAic3RyaW5nIikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeHN0YXJ0ID0geGF4aXMuc2VyaWVzX3UycCh4YXhpcy5taW4pICsgcGFyc2VGbG9hdCh4bWlub2ZmKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob2JqLm9wdGlvbnMueG1heCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhzdG9wID0geGF4aXMuc2VyaWVzX3UycChvYmoub3B0aW9ucy54bWF4KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoeG1heG9mZiAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkLnR5cGUoeG1heG9mZikgPT0gIm51bWJlciIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhzdG9wID0geGF4aXMuc2VyaWVzX3UycCh4YXhpcy5tYXggLSB4bWF4b2ZmKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICgkLnR5cGUoeG1heG9mZikgPT0gInN0cmluZyIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhzdG9wID0geGF4aXMuc2VyaWVzX3UycCh4YXhpcy5tYXgpIC0gcGFyc2VGbG9hdCh4bWF4b2ZmKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoeHN0b3AgIT0gbnVsbCAmJiB4c3RhcnQgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmouZ3JpZFN0YXJ0ID0gW3hzdGFydCwgeV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iai5ncmlkU3RvcCA9IFt4c3RvcCwgeV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1yLmRyYXcoW3hzdGFydCwgeV0sIFt4c3RvcCwgeV0sIHRoaXMuY2FudmFzLl9jdHgsIG9wdHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnZGFzaGVkSG9yaXpvbnRhbExpbmUnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGFzaFBhdCA9IG9iai5vcHRpb25zLmRhc2hQYXR0ZXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRhc2hQYXRMZW4gPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaT0wOyBpPGRhc2hQYXQubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXNoUGF0TGVuICs9IGRhc2hQYXRbaV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3R5bGUgYW5kIHNoYWRvdyBwcm9wZXJ0aWVzIHNob3VsZCBiZSBzZXQgYmVmb3JlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBldmVyeSBkcmF3IG9mIG1hcmtlciByZW5kZXJlci4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvYmoub3B0aW9ucy55ICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtci5zdHlsZSA9ICdsaW5lJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRzLmNsb3NlUGF0aCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB4YXhpcyA9IHBsb3QuYXhlc1tvYmoub3B0aW9ucy54YXhpc10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhzdGFydCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeHN0b3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBwbG90LmF4ZXNbb2JqLm9wdGlvbnMueWF4aXNdLnNlcmllc191MnAob2JqLm9wdGlvbnMueSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtaW5vZmYgPSBvYmoub3B0aW9ucy54bWluT2Zmc2V0IHx8IG9iai5vcHRpb25zLnhPZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtYXhvZmYgPSBvYmoub3B0aW9ucy54bWF4T2Zmc2V0IHx8IG9iai5vcHRpb25zLnhPZmZzZXQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9iai5vcHRpb25zLnhtaW4gIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4c3RhcnQgPSB4YXhpcy5zZXJpZXNfdTJwKG9iai5vcHRpb25zLnhtaW4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh4bWlub2ZmICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCQudHlwZSh4bWlub2ZmKSA9PSAibnVtYmVyIikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeHN0YXJ0ID0geGF4aXMuc2VyaWVzX3UycCh4YXhpcy5taW4gKyB4bWlub2ZmKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICgkLnR5cGUoeG1pbm9mZikgPT0gInN0cmluZyIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhzdGFydCA9IHhheGlzLnNlcmllc191MnAoeGF4aXMubWluKSArIHBhcnNlRmxvYXQoeG1pbm9mZik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9iai5vcHRpb25zLnhtYXggIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4c3RvcCA9IHhheGlzLnNlcmllc191MnAob2JqLm9wdGlvbnMueG1heCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHhtYXhvZmYgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJC50eXBlKHhtYXhvZmYpID09ICJudW1iZXIiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4c3RvcCA9IHhheGlzLnNlcmllc191MnAoeGF4aXMubWF4IC0geG1heG9mZik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoJC50eXBlKHhtYXhvZmYpID09ICJzdHJpbmciKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4c3RvcCA9IHhheGlzLnNlcmllc191MnAoeGF4aXMubWF4KSAtIHBhcnNlRmxvYXQoeG1heG9mZik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHhzdG9wICE9IG51bGwgJiYgeHN0YXJ0ICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqLmdyaWRTdGFydCA9IFt4c3RhcnQsIHldOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmouZ3JpZFN0b3AgPSBbeHN0b3AsIHldOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbnVtRGFzaCA9IE1hdGguY2VpbCgoeHN0b3AgLSB4c3RhcnQpL2Rhc2hQYXRMZW4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYj14c3RhcnQsIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGk9MDsgaTxudW1EYXNoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGo9MDsgajxkYXNoUGF0Lmxlbmd0aDsgais9MikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPSBiK2Rhc2hQYXRbal07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXIuZHJhdyhbYiwgeV0sIFtlLCB5XSwgdGhpcy5jYW52YXMuX2N0eCwgb3B0cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYiArPSBkYXNoUGF0W2pdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqIDwgZGFzaFBhdC5sZW5ndGgtMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiICs9IGRhc2hQYXRbaisxXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3ZlcnRpY2FsTGluZSc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0eWxlIGFuZCBzaGFkb3cgcHJvcGVydGllcyBzaG91bGQgYmUgc2V0IGJlZm9yZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXZlcnkgZHJhdyBvZiBtYXJrZXIgcmVuZGVyZXIuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob2JqLm9wdGlvbnMueCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXIuc3R5bGUgPSAnbGluZSc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0cy5jbG9zZVBhdGggPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgeWF4aXMgPSBwbG90LmF4ZXNbb2JqLm9wdGlvbnMueWF4aXNdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5c3RhcnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlzdG9wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ID0gcGxvdC5heGVzW29iai5vcHRpb25zLnhheGlzXS5zZXJpZXNfdTJwKG9iai5vcHRpb25zLngpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5bWlub2ZmID0gb2JqLm9wdGlvbnMueW1pbk9mZnNldCB8fCBvYmoub3B0aW9ucy55T2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5bWF4b2ZmID0gb2JqLm9wdGlvbnMueW1heE9mZnNldCB8fCBvYmoub3B0aW9ucy55T2Zmc2V0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvYmoub3B0aW9ucy55bWluICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeXN0YXJ0ID0geWF4aXMuc2VyaWVzX3UycChvYmoub3B0aW9ucy55bWluKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoeW1pbm9mZiAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkLnR5cGUoeW1pbm9mZikgPT0gIm51bWJlciIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlzdGFydCA9IHlheGlzLnNlcmllc191MnAoeWF4aXMubWluIC0geW1pbm9mZik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoJC50eXBlKHltaW5vZmYpID09ICJzdHJpbmciKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5c3RhcnQgPSB5YXhpcy5zZXJpZXNfdTJwKHlheGlzLm1pbikgLSBwYXJzZUZsb2F0KHltaW5vZmYpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvYmoub3B0aW9ucy55bWF4ICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeXN0b3AgPSB5YXhpcy5zZXJpZXNfdTJwKG9iai5vcHRpb25zLnltYXgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh5bWF4b2ZmICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCQudHlwZSh5bWF4b2ZmKSA9PSAibnVtYmVyIikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeXN0b3AgPSB5YXhpcy5zZXJpZXNfdTJwKHlheGlzLm1heCArIHltYXhvZmYpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCQudHlwZSh5bWF4b2ZmKSA9PSAic3RyaW5nIikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeXN0b3AgPSB5YXhpcy5zZXJpZXNfdTJwKHlheGlzLm1heCkgKyBwYXJzZUZsb2F0KHltYXhvZmYpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh5c3RvcCAhPSBudWxsICYmIHlzdGFydCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iai5ncmlkU3RhcnQgPSBbeCwgeXN0YXJ0XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqLmdyaWRTdG9wID0gW3gsIHlzdG9wXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXIuZHJhdyhbeCwgeXN0YXJ0XSwgW3gsIHlzdG9wXSwgdGhpcy5jYW52YXMuX2N0eCwgb3B0cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdkYXNoZWRWZXJ0aWNhbExpbmUnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGFzaFBhdCA9IG9iai5vcHRpb25zLmRhc2hQYXR0ZXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRhc2hQYXRMZW4gPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaT0wOyBpPGRhc2hQYXQubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXNoUGF0TGVuICs9IGRhc2hQYXRbaV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3R5bGUgYW5kIHNoYWRvdyBwcm9wZXJ0aWVzIHNob3VsZCBiZSBzZXQgYmVmb3JlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBldmVyeSBkcmF3IG9mIG1hcmtlciByZW5kZXJlci4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvYmoub3B0aW9ucy54ICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtci5zdHlsZSA9ICdsaW5lJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRzLmNsb3NlUGF0aCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB5YXhpcyA9IHBsb3QuYXhlc1tvYmoub3B0aW9ucy55YXhpc10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlzdGFydCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeXN0b3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHggPSBwbG90LmF4ZXNbb2JqLm9wdGlvbnMueGF4aXNdLnNlcmllc191MnAob2JqLm9wdGlvbnMueCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHltaW5vZmYgPSBvYmoub3B0aW9ucy55bWluT2Zmc2V0IHx8IG9iai5vcHRpb25zLnlPZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHltYXhvZmYgPSBvYmoub3B0aW9ucy55bWF4T2Zmc2V0IHx8IG9iai5vcHRpb25zLnlPZmZzZXQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9iai5vcHRpb25zLnltaW4gIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5c3RhcnQgPSB5YXhpcy5zZXJpZXNfdTJwKG9iai5vcHRpb25zLnltaW4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh5bWlub2ZmICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCQudHlwZSh5bWlub2ZmKSA9PSAibnVtYmVyIikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeXN0YXJ0ID0geWF4aXMuc2VyaWVzX3UycCh5YXhpcy5taW4gLSB5bWlub2ZmKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICgkLnR5cGUoeW1pbm9mZikgPT0gInN0cmluZyIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlzdGFydCA9IHlheGlzLnNlcmllc191MnAoeWF4aXMubWluKSAtIHBhcnNlRmxvYXQoeW1pbm9mZik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9iai5vcHRpb25zLnltYXggIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5c3RvcCA9IHlheGlzLnNlcmllc191MnAob2JqLm9wdGlvbnMueW1heCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHltYXhvZmYgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJC50eXBlKHltYXhvZmYpID09ICJudW1iZXIiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5c3RvcCA9IHlheGlzLnNlcmllc191MnAoeWF4aXMubWF4ICsgeW1heG9mZik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoJC50eXBlKHltYXhvZmYpID09ICJzdHJpbmciKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5c3RvcCA9IHlheGlzLnNlcmllc191MnAoeWF4aXMubWF4KSArIHBhcnNlRmxvYXQoeW1heG9mZik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoeXN0b3AgIT0gbnVsbCAmJiB5c3RhcnQgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmouZ3JpZFN0YXJ0ID0gW3gsIHlzdGFydF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iai5ncmlkU3RvcCA9IFt4LCB5c3RvcF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBudW1EYXNoID0gTWF0aC5jZWlsKCh5c3RhcnQgLSB5c3RvcCkvZGFzaFBhdExlbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmaXJzdERhc2hBZGp1c3QgPSAoKG51bURhc2ggKiBkYXNoUGF0TGVuKSAtICh5c3RhcnQgLSB5c3RvcCkpLzIuMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGI9eXN0YXJ0LCBlLCBicywgZXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGk9MDsgaTxudW1EYXNoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGo9MDsgajxkYXNoUGF0Lmxlbmd0aDsgais9MikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPSBiIC0gZGFzaFBhdFtqXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZSA8IHlzdG9wKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPSB5c3RvcDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGIgPCB5c3RvcCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiID0geXN0b3A7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVzID0gZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiAoaSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIGVzICs9IGZpcnN0RGFzaEFkanVzdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXIuZHJhdyhbeCwgYl0sIFt4LCBlXSwgdGhpcy5jYW52YXMuX2N0eCwgb3B0cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYiAtPSBkYXNoUGF0W2pdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqIDwgZGFzaFBhdC5sZW5ndGgtMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiIC09IGRhc2hQYXRbaisxXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9OwogICAgCiAgICAvLyBjYWxsZWQgd2l0aGluIGNvbnRleHQgb2YgcGxvdAogICAgLy8gY3JlYXRlIGEgY2FudmFzIHdoaWNoIHdlIGNhbiBkcmF3IG9uLgogICAgLy8gaW5zZXJ0IGl0IGJlZm9yZSB0aGUgZXZlbnRDYW52YXMsIHNvIGV2ZW50Q2FudmFzIHdpbGwgc3RpbGwgY2FwdHVyZSBldmVudHMuCiAgICAkLmpxcGxvdC5DYW52YXNPdmVybGF5LnBvc3RQbG90RHJhdyA9IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBjbyA9IHRoaXMucGx1Z2lucy5jYW52YXNPdmVybGF5OwogICAgICAgIC8vIE1lbW9yeSBMZWFrcyBwYXRjaCAgICAKICAgICAgICBpZiAoY28gJiYgY28uaGlnaGxpZ2h0Q2FudmFzKSB7CiAgICAgICAgICAgIGNvLmhpZ2hsaWdodENhbnZhcy5yZXNldENhbnZhcygpOwogICAgICAgICAgICBjby5oaWdobGlnaHRDYW52YXMgPSBudWxsOwogICAgICAgIH0KICAgICAgICBjby5jYW52YXMgPSBuZXcgJC5qcXBsb3QuR2VuZXJpY0NhbnZhcygpOwogICAgICAgIAogICAgICAgIHRoaXMuZXZlbnRDYW52YXMuX2VsZW0uYmVmb3JlKGNvLmNhbnZhcy5jcmVhdGVFbGVtZW50KHRoaXMuX2dyaWRQYWRkaW5nLCAnanFwbG90LW92ZXJsYXlDYW52YXMtY2FudmFzJywgdGhpcy5fcGxvdERpbWVuc2lvbnMsIHRoaXMpKTsKICAgICAgICBjby5jYW52YXMuc2V0Q29udGV4dCgpOwogICAgICAgIGlmICghY28uZGVmZXJEcmF3KSB7CiAgICAgICAgICAgIGNvLmRyYXcodGhpcyk7CiAgICAgICAgfQoKICAgICAgICB2YXIgZWxlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgICAgIGNvLl90b29sdGlwRWxlbSA9ICQoZWxlbSk7CiAgICAgICAgZWxlbSA9IG51bGw7CiAgICAgICAgY28uX3Rvb2x0aXBFbGVtLmFkZENsYXNzKCdqcXBsb3QtY2FudmFzT3ZlcmxheS10b29sdGlwJyk7CiAgICAgICAgY28uX3Rvb2x0aXBFbGVtLmNzcyh7cG9zaXRpb246J2Fic29sdXRlJywgZGlzcGxheTonbm9uZSd9KTsKICAgICAgICAKICAgICAgICB0aGlzLmV2ZW50Q2FudmFzLl9lbGVtLmJlZm9yZShjby5fdG9vbHRpcEVsZW0pOwogICAgICAgIHRoaXMuZXZlbnRDYW52YXMuX2VsZW0uYmluZCgnbW91c2VsZWF2ZScsIHsgZWxlbTogY28uX3Rvb2x0aXBFbGVtIH0sIGZ1bmN0aW9uIChldikgeyBldi5kYXRhLmVsZW0uaGlkZSgpOyB9KTsKCiAgICAgICAgdmFyIGNvID0gbnVsbDsKICAgIH07CgoKICAgIGZ1bmN0aW9uIHNob3dUb29sdGlwKHBsb3QsIG9iaiwgZ3JpZHBvcywgZGF0YXBvcykgewogICAgICAgIHZhciBjbyA9IHBsb3QucGx1Z2lucy5jYW52YXNPdmVybGF5OwogICAgICAgIHZhciBlbGVtID0gY28uX3Rvb2x0aXBFbGVtOwoKICAgICAgICB2YXIgb3B0cyA9IG9iai5vcHRpb25zLCB4LCB5OwoKICAgICAgICBlbGVtLmh0bWwoJC5qcXBsb3Quc3ByaW50ZihvcHRzLnRvb2x0aXBGb3JtYXRTdHJpbmcsIGRhdGFwb3NbMF0sIGRhdGFwb3NbMV0pKTsKICAgICAgICAKICAgICAgICBzd2l0Y2ggKG9wdHMudG9vbHRpcExvY2F0aW9uKSB7CiAgICAgICAgICAgIGNhc2UgJ253JzoKICAgICAgICAgICAgICAgIHggPSBncmlkcG9zWzBdICsgcGxvdC5fZ3JpZFBhZGRpbmcubGVmdCAtIGVsZW0ub3V0ZXJXaWR0aCh0cnVlKSAtIG9wdHMudG9vbHRpcE9mZnNldDsKICAgICAgICAgICAgICAgIHkgPSBncmlkcG9zWzFdICsgcGxvdC5fZ3JpZFBhZGRpbmcudG9wIC0gb3B0cy50b29sdGlwT2Zmc2V0IC0gZWxlbS5vdXRlckhlaWdodCh0cnVlKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICduJzoKICAgICAgICAgICAgICAgIHggPSBncmlkcG9zWzBdICsgcGxvdC5fZ3JpZFBhZGRpbmcubGVmdCAtIGVsZW0ub3V0ZXJXaWR0aCh0cnVlKS8yOwogICAgICAgICAgICAgICAgeSA9IGdyaWRwb3NbMV0gKyBwbG90Ll9ncmlkUGFkZGluZy50b3AgLSBvcHRzLnRvb2x0aXBPZmZzZXQgLSBlbGVtLm91dGVySGVpZ2h0KHRydWUpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ25lJzoKICAgICAgICAgICAgICAgIHggPSBncmlkcG9zWzBdICsgcGxvdC5fZ3JpZFBhZGRpbmcubGVmdCArIG9wdHMudG9vbHRpcE9mZnNldDsKICAgICAgICAgICAgICAgIHkgPSBncmlkcG9zWzFdICsgcGxvdC5fZ3JpZFBhZGRpbmcudG9wIC0gb3B0cy50b29sdGlwT2Zmc2V0IC0gZWxlbS5vdXRlckhlaWdodCh0cnVlKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdlJzoKICAgICAgICAgICAgICAgIHggPSBncmlkcG9zWzBdICsgcGxvdC5fZ3JpZFBhZGRpbmcubGVmdCArIG9wdHMudG9vbHRpcE9mZnNldDsKICAgICAgICAgICAgICAgIHkgPSBncmlkcG9zWzFdICsgcGxvdC5fZ3JpZFBhZGRpbmcudG9wIC0gZWxlbS5vdXRlckhlaWdodCh0cnVlKS8yOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3NlJzoKICAgICAgICAgICAgICAgIHggPSBncmlkcG9zWzBdICsgcGxvdC5fZ3JpZFBhZGRpbmcubGVmdCArIG9wdHMudG9vbHRpcE9mZnNldDsKICAgICAgICAgICAgICAgIHkgPSBncmlkcG9zWzFdICsgcGxvdC5fZ3JpZFBhZGRpbmcudG9wICsgb3B0cy50b29sdGlwT2Zmc2V0OwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3MnOgogICAgICAgICAgICAgICAgeCA9IGdyaWRwb3NbMF0gKyBwbG90Ll9ncmlkUGFkZGluZy5sZWZ0IC0gZWxlbS5vdXRlcldpZHRoKHRydWUpLzI7CiAgICAgICAgICAgICAgICB5ID0gZ3JpZHBvc1sxXSArIHBsb3QuX2dyaWRQYWRkaW5nLnRvcCArIG9wdHMudG9vbHRpcE9mZnNldDsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdzdyc6CiAgICAgICAgICAgICAgICB4ID0gZ3JpZHBvc1swXSArIHBsb3QuX2dyaWRQYWRkaW5nLmxlZnQgLSBlbGVtLm91dGVyV2lkdGgodHJ1ZSkgLSBvcHRzLnRvb2x0aXBPZmZzZXQ7CiAgICAgICAgICAgICAgICB5ID0gZ3JpZHBvc1sxXSArIHBsb3QuX2dyaWRQYWRkaW5nLnRvcCArIG9wdHMudG9vbHRpcE9mZnNldDsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICd3JzoKICAgICAgICAgICAgICAgIHggPSBncmlkcG9zWzBdICsgcGxvdC5fZ3JpZFBhZGRpbmcubGVmdCAtIGVsZW0ub3V0ZXJXaWR0aCh0cnVlKSAtIG9wdHMudG9vbHRpcE9mZnNldDsKICAgICAgICAgICAgICAgIHkgPSBncmlkcG9zWzFdICsgcGxvdC5fZ3JpZFBhZGRpbmcudG9wIC0gZWxlbS5vdXRlckhlaWdodCh0cnVlKS8yOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGRlZmF1bHQ6IC8vIHNhbWUgYXMgJ253JwogICAgICAgICAgICAgICAgeCA9IGdyaWRwb3NbMF0gKyBwbG90Ll9ncmlkUGFkZGluZy5sZWZ0IC0gZWxlbS5vdXRlcldpZHRoKHRydWUpIC0gb3B0cy50b29sdGlwT2Zmc2V0OwogICAgICAgICAgICAgICAgeSA9IGdyaWRwb3NbMV0gKyBwbG90Ll9ncmlkUGFkZGluZy50b3AgLSBvcHRzLnRvb2x0aXBPZmZzZXQgLSBlbGVtLm91dGVySGVpZ2h0KHRydWUpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQoKICAgICAgICBlbGVtLmNzcygnbGVmdCcsIHgpOwogICAgICAgIGVsZW0uY3NzKCd0b3AnLCB5KTsKICAgICAgICBpZiAob3B0cy5mYWRlVG9vbHRpcCkgewogICAgICAgICAgICAvLyBGaXggZm9yIHN0YWNrZWQgdXAgYW5pbWF0aW9ucy4gIFRobmFua3MgVHJldm9yIQogICAgICAgICAgICBlbGVtLnN0b3AodHJ1ZSx0cnVlKS5mYWRlSW4ob3B0cy50b29sdGlwRmFkZVNwZWVkKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGVsZW0uc2hvdygpOwogICAgICAgIH0KICAgICAgICBlbGVtID0gbnVsbDsKICAgIH0KCgogICAgZnVuY3Rpb24gaXNOZWFyTGluZShwb2ludCwgbHN0YXJ0LCBsc3RvcCwgd2lkdGgpIHsKICAgICAgICAvLyByIGlzIHBvaW50IHRvIHRlc3QsIHAgYW5kIHEgYXJlIGVuZCBwb2ludHMuCiAgICAgICAgdmFyIHJ4ID0gcG9pbnRbMF07CiAgICAgICAgdmFyIHJ5ID0gcG9pbnRbMV07CiAgICAgICAgdmFyIHB4ID0gTWF0aC5yb3VuZChsc3RvcFswXSk7CiAgICAgICAgdmFyIHB5ID0gTWF0aC5yb3VuZChsc3RvcFsxXSk7CiAgICAgICAgdmFyIHF4ID0gTWF0aC5yb3VuZChsc3RhcnRbMF0pOwogICAgICAgIHZhciBxeSA9IE1hdGgucm91bmQobHN0YXJ0WzFdKTsKCiAgICAgICAgdmFyIGwgPSBNYXRoLnNxcnQoTWF0aC5wb3cocHgtcXgsIDIpICsgTWF0aC5wb3cocHktcXksIDIpKTsKCiAgICAgICAgLy8gc2NhbGUgZXJyb3IgdGVybSBieSBsZW5ndGggb2YgbGluZS4KICAgICAgICB2YXIgZXBzID0gd2lkdGgqbDsKICAgICAgICB2YXIgcmVzID0gTWF0aC5hYnMoKHF4LXB4KSAqIChyeS1weSkgLSAocXktcHkpICogKHJ4LXB4KSk7CiAgICAgICAgdmFyIHJldCA9IChyZXMgPCBlcHMpID8gdHJ1ZSA6IGZhbHNlOwogICAgICAgIHJldHVybiByZXQ7CiAgICB9CgoKICAgIGZ1bmN0aW9uIGhhbmRsZU1vdmUoZXYsIGdyaWRwb3MsIGRhdGFwb3MsIG5laWdoYm9yLCBwbG90KSB7CiAgICAgICAgdmFyIGNvID0gcGxvdC5wbHVnaW5zLmNhbnZhc092ZXJsYXk7CiAgICAgICAgdmFyIG9ianMgPSBjby5vYmplY3RzOwogICAgICAgIHZhciBsID0gb2Jqcy5sZW5ndGg7CiAgICAgICAgdmFyIG9iaiwgaGF2ZUhpZ2hsaWdodD1mYWxzZTsKICAgICAgICB2YXIgZWxlbTsKICAgICAgICBmb3IgKHZhciBpPTA7IGk8bDsgaSsrKSB7CiAgICAgICAgICAgIG9iaiA9IG9ianNbaV07CiAgICAgICAgICAgIGlmIChvYmoub3B0aW9ucy5zaG93VG9vbHRpcCkgewogICAgICAgICAgICAgICAgdmFyIG4gPSBpc05lYXJMaW5lKFtncmlkcG9zLngsIGdyaWRwb3MueV0sIG9iai5ncmlkU3RhcnQsIG9iai5ncmlkU3RvcCwgb2JqLnRvb2x0aXBXaWR0aEZhY3Rvcik7CiAgICAgICAgICAgICAgICBkYXRhcG9zID0gW3Bsb3QuYXhlc1tvYmoub3B0aW9ucy54YXhpc10uc2VyaWVzX3AydShncmlkcG9zLngpLCBwbG90LmF4ZXNbb2JqLm9wdGlvbnMueWF4aXNdLnNlcmllc19wMnUoZ3JpZHBvcy55KV07CgogICAgICAgICAgICAgICAgLy8gY2FzZXM6CiAgICAgICAgICAgICAgICAvLyAgICBuZWFyIGxpbmUsIG5vIGhpZ2hsaWdodGluZwogICAgICAgICAgICAgICAgLy8gICAgbmVhciBsaW5lLCBoaWdobGl0aW5nIG9uIHRoaXMgbGluZQogICAgICAgICAgICAgICAgLy8gICAgbmVhciBsaW5lLCBoaWdobGlnaHRpbmcgYW5vdGhlciBsaW5lCiAgICAgICAgICAgICAgICAvLyAgICBub3QgbmVhciBhbnkgbGluZSwgaGlnaGxpZ2h0aW5nCiAgICAgICAgICAgICAgICAvLyAgICBub3QgbmVhciBhbnkgbGluZSwgbm8gaGlnaGxpZ2h0aW5nCgogICAgICAgICAgICAgICAgLy8gbmVhciBsaW5lLCBub3QgY3VycmVudGx5IGhpZ2hsaWdodGluZwogICAgICAgICAgICAgICAgaWYgKG4gJiYgY28uaGlnaGxpZ2h0T2JqZWN0SW5kZXggPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIHN3aXRjaCAob2JqLnR5cGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnbGluZSc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93VG9vbHRpcChwbG90LCBvYmosIFtncmlkcG9zLngsIGdyaWRwb3MueV0sIGRhdGFwb3MpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdob3Jpem9udGFsTGluZSc6CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2Rhc2hlZEhvcml6b250YWxMaW5lJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dUb29sdGlwKHBsb3QsIG9iaiwgW2dyaWRwb3MueCwgb2JqLmdyaWRTdGFydFsxXV0sIFtkYXRhcG9zWzBdLCBvYmoub3B0aW9ucy55XSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3ZlcnRpY2FsTGluZSc6CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2Rhc2hlZFZlcnRpY2FsTGluZSc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93VG9vbHRpcChwbG90LCBvYmosIFtvYmouZ3JpZFN0YXJ0WzBdLCBncmlkcG9zLnldLCBbb2JqLm9wdGlvbnMueCwgZGF0YXBvc1sxXV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9IAogICAgICAgICAgICAgICAgICAgIGNvLmhpZ2hsaWdodE9iamVjdEluZGV4ID0gaTsKICAgICAgICAgICAgICAgICAgICBoYXZlSGlnaGxpZ2h0ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBuZWFyIGxpbmUsIGhpZ2hsaWdodGluZyBhbm90aGVyIGxpbmUuCiAgICAgICAgICAgICAgICBlbHNlIGlmIChuICYmIGNvLmhpZ2hsaWdodE9iamVjdEluZGV4ICE9PSBpKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gdHVybiBvZmYgdG9vbHRpcC4KICAgICAgICAgICAgICAgICAgICBlbGVtID0gY28uX3Rvb2x0aXBFbGVtOwogICAgICAgICAgICAgICAgICAgIGlmIChvYmouZmFkZVRvb2x0aXApIHsKICAgICAgICAgICAgICAgICAgICAgICAgZWxlbS5mYWRlT3V0KG9iai50b29sdGlwRmFkZVNwZWVkKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW0uaGlkZSgpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gdHVybiBvbiByaWdodCB0b29sdGlwLgogICAgICAgICAgICAgICAgICAgIHN3aXRjaCAob2JqLnR5cGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnbGluZSc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93VG9vbHRpcChwbG90LCBvYmosIFtncmlkcG9zLngsIGdyaWRwb3MueV0sIGRhdGFwb3MpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdob3Jpem9udGFsTGluZSc6CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2Rhc2hlZEhvcml6b250YWxMaW5lJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dUb29sdGlwKHBsb3QsIG9iaiwgW2dyaWRwb3MueCwgb2JqLmdyaWRTdGFydFsxXV0sIFtkYXRhcG9zWzBdLCBvYmoub3B0aW9ucy55XSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3ZlcnRpY2FsTGluZSc6CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2Rhc2hlZFZlcnRpY2FsTGluZSc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93VG9vbHRpcChwbG90LCBvYmosIFtvYmouZ3JpZFN0YXJ0WzBdLCBncmlkcG9zLnldLCBbb2JqLm9wdGlvbnMueCwgZGF0YXBvc1sxXV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGNvLmhpZ2hsaWdodE9iamVjdEluZGV4ID0gaTsKICAgICAgICAgICAgICAgICAgICBoYXZlSGlnaGxpZ2h0ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBuZWFyIGxpbmUsIGFscmVhZHkgaGlnaGxpZ2h0aW5nIHRoaXMgbGluZSwgdXBkYXRlCiAgICAgICAgICAgICAgICBlbHNlIGlmIChuKSB7CiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChvYmoudHlwZSkgewogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdsaW5lJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dUb29sdGlwKHBsb3QsIG9iaiwgW2dyaWRwb3MueCwgZ3JpZHBvcy55XSwgZGF0YXBvcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2hvcml6b250YWxMaW5lJzoKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnZGFzaGVkSG9yaXpvbnRhbExpbmUnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd1Rvb2x0aXAocGxvdCwgb2JqLCBbZ3JpZHBvcy54LCBvYmouZ3JpZFN0YXJ0WzFdXSwgW2RhdGFwb3NbMF0sIG9iai5vcHRpb25zLnldKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAndmVydGljYWxMaW5lJzoKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnZGFzaGVkVmVydGljYWxMaW5lJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dUb29sdGlwKHBsb3QsIG9iaiwgW29iai5ncmlkU3RhcnRbMF0sIGdyaWRwb3MueV0sIFtvYmoub3B0aW9ucy54LCBkYXRhcG9zWzFdXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaGF2ZUhpZ2hsaWdodCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIGNoZWNrIGlmIHdlIGFyZSBoaWdobGlnaHRpbmcgYW5kIG5vdCBuZWFyIGEgbGluZSwgdHVybiBpdCBvZmYuCiAgICAgICAgaWYgKCFoYXZlSGlnaGxpZ2h0ICYmIGNvLmhpZ2hsaWdodE9iamVjdEluZGV4ICE9PSBudWxsKSB7CiAgICAgICAgICAgIGVsZW0gPSBjby5fdG9vbHRpcEVsZW07CiAgICAgICAgICAgIG9iaiA9IGNvLmdldE9iamVjdChjby5oaWdobGlnaHRPYmplY3RJbmRleCk7CiAgICAgICAgICAgIGlmIChvYmouZmFkZVRvb2x0aXApIHsKICAgICAgICAgICAgICAgIGVsZW0uZmFkZU91dChvYmoudG9vbHRpcEZhZGVTcGVlZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBlbGVtLmhpZGUoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjby5oaWdobGlnaHRPYmplY3RJbmRleCA9IG51bGw7CiAgICAgICAgfQogICAgfQogICAgCiAgICAkLmpxcGxvdC5wb3N0SW5pdEhvb2tzLnB1c2goJC5qcXBsb3QuQ2FudmFzT3ZlcmxheS5wb3N0UGxvdEluaXQpOwogICAgJC5qcXBsb3QucG9zdERyYXdIb29rcy5wdXNoKCQuanFwbG90LkNhbnZhc092ZXJsYXkucG9zdFBsb3REcmF3KTsKICAgICQuanFwbG90LmV2ZW50TGlzdGVuZXJIb29rcy5wdXNoKFsnanFwbG90TW91c2VNb3ZlJywgaGFuZGxlTW92ZV0pOwoKfSkoalF1ZXJ5KTs=]]></data>
	</file>
	<file>
	  <filename>/src/plugins/jqplot.canvasOverlay.min.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqCiAqIGpxUGxvdAogKiBQdXJlIEphdmFTY3JpcHQgcGxvdHRpbmcgcGx1Z2luIHVzaW5nIGpRdWVyeQogKgogKiBWZXJzaW9uOiAxLjAuMGIyX3IxMDEyCiAqCiAqIENvcHlyaWdodCAoYykgMjAwOS0yMDExIENocmlzIExlb25lbGxvCiAqIGpxUGxvdCBpcyBjdXJyZW50bHkgYXZhaWxhYmxlIGZvciB1c2UgaW4gYWxsIHBlcnNvbmFsIG9yIGNvbW1lcmNpYWwgcHJvamVjdHMgCiAqIHVuZGVyIGJvdGggdGhlIE1JVCAoaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHApIGFuZCBHUEwgCiAqIHZlcnNpb24gMi4wIChodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC5odG1sKSBsaWNlbnNlcy4gVGhpcyBtZWFucyB0aGF0IHlvdSBjYW4gCiAqIGNob29zZSB0aGUgbGljZW5zZSB0aGF0IGJlc3Qgc3VpdHMgeW91ciBwcm9qZWN0IGFuZCB1c2UgaXQgYWNjb3JkaW5nbHkuIAogKgogKiBBbHRob3VnaCBub3QgcmVxdWlyZWQsIHRoZSBhdXRob3Igd291bGQgYXBwcmVjaWF0ZSBhbiBlbWFpbCBsZXR0aW5nIGhpbSAKICoga25vdyBvZiBhbnkgc3Vic3RhbnRpYWwgdXNlIG9mIGpxUGxvdC4gIFlvdSBjYW4gcmVhY2ggdGhlIGF1dGhvciBhdDogCiAqIGNocmlzIGF0IGpxcGxvdCBkb3QgY29tIG9yIHNlZSBodHRwOi8vd3d3LmpxcGxvdC5jb20vaW5mby5waHAgLgogKgogKiBJZiB5b3UgYXJlIGZlZWxpbmcga2luZCBhbmQgZ2VuZXJvdXMsIGNvbnNpZGVyIHN1cHBvcnRpbmcgdGhlIHByb2plY3QgYnkKICogbWFraW5nIGEgZG9uYXRpb24gYXQ6IGh0dHA6Ly93d3cuanFwbG90LmNvbS9kb25hdGUucGhwIC4KICoKICogc3ByaW50ZiBmdW5jdGlvbnMgY29udGFpbmVkIGluIGpxcGxvdC5zcHJpbnRmLmpzIGJ5IEFzaCBTZWFybGU6CiAqCiAqICAgICB2ZXJzaW9uIDIwMDcuMDQuMjcKICogICAgIGF1dGhvciBBc2ggU2VhcmxlCiAqICAgICBodHRwOi8vaGV4bWVuLmNvbS9ibG9nLzIwMDcvMDMvcHJpbnRmLXNwcmludGYvCiAqICAgICBodHRwOi8vaGV4bWVuLmNvbS9qcy9zcHJpbnRmLmpzCiAqICAgICBUaGUgYXV0aG9yIChBc2ggU2VhcmxlKSBoYXMgcGxhY2VkIHRoaXMgY29kZSBpbiB0aGUgcHVibGljIGRvbWFpbjoKICogICAgICJUaGlzIGNvZGUgaXMgdW5yZXN0cmljdGVkOiB5b3UgYXJlIGZyZWUgdG8gdXNlIGl0IGhvd2V2ZXIgeW91IGxpa2UuIgogKgogKiBpbmNsdWRlZCBqc0RhdGUgbGlicmFyeSBieSBDaHJpcyBMZW9uZWxsbzoKICoKICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEgQ2hyaXMgTGVvbmVsbG8KICoKICoganNEYXRlIGlzIGN1cnJlbnRseSBhdmFpbGFibGUgZm9yIHVzZSBpbiBhbGwgcGVyc29uYWwgb3IgY29tbWVyY2lhbCBwcm9qZWN0cyAKICogdW5kZXIgYm90aCB0aGUgTUlUIGFuZCBHUEwgdmVyc2lvbiAyLjAgbGljZW5zZXMuIFRoaXMgbWVhbnMgdGhhdCB5b3UgY2FuIAogKiBjaG9vc2UgdGhlIGxpY2Vuc2UgdGhhdCBiZXN0IHN1aXRzIHlvdXIgcHJvamVjdCBhbmQgdXNlIGl0IGFjY29yZGluZ2x5LgogKgogKiBqc0RhdGUgYm9ycm93cyBtYW55IGNvbmNlcHRzIGFuZCBpZGVhcyBmcm9tIHRoZSBEYXRlIEluc3RhbmNlIAogKiBNZXRob2RzIGJ5IEtlbiBTbnlkZXIgYWxvbmcgd2l0aCBzb21lIHBhcnRzIG9mIEtlbidzIGFjdHVhbCBjb2RlLgogKiAKICogS2VuJ3Mgb3JpZ2lhbmwgRGF0ZSBJbnN0YW5jZSBNZXRob2RzIGFuZCBjb3B5cmlnaHQgbm90aWNlOgogKiAKICogS2VuIFNueWRlciAoa2VuIGQgc255ZGVyIGF0IGdtYWlsIGRvdCBjb20pCiAqIDIwMDgtMDktMTAKICogdmVyc2lvbiAyLjAuMiAoaHR0cDovL2tlbmRzbnlkZXIuY29tL3NhbmRib3gvZGF0ZS8pICAgICAKICogQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbiBMaWNlbnNlIDMuMCAoaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnkvMy4wLykKICoKICoganFwbG90VG9JbWFnZSBmdW5jdGlvbiBiYXNlZCBvbiBMYXJyeSBTaWRlbidzIGV4cG9ydC1qcXBsb3QtdG8tcG5nLmpzLgogKiBMYXJyeSBoYXMgZ2VuZXJvdXNseSBnaXZlbiBwZXJtaXNzaW9uIHRvIGFkYXB0IGhpcyBjb2RlIGZvciBpbmNsdXNpb24KICogaW50byBqcVBsb3QuCiAqCiAqIExhcnJ5J3Mgb3JpZ2luYWwgY29kZSBjYW4gYmUgZm91bmQgaGVyZToKICoKICogaHR0cHM6Ly9naXRodWIuY29tL2xzaWRlbi9leHBvcnQtanFwbG90LXRvLXBuZwogKiAKICogCiAqLwooZnVuY3Rpb24oZCl7dmFyIGY9MDtkLmpxcGxvdC5DYW52YXNPdmVybGF5PWZ1bmN0aW9uKG8pe3ZhciBsPW98fHt9O3RoaXMub3B0aW9ucz17c2hvdzpkLmpxcGxvdC5jb25maWcuZW5hYmxlUGx1Z2lucyxkZWZlckRyYXc6ZmFsc2V9O3RoaXMub2JqZWN0cz1bXTt0aGlzLm9iamVjdE5hbWVzPVtdO3RoaXMuY2FudmFzPW51bGw7dGhpcy5tYXJrZXJSZW5kZXJlcj1uZXcgZC5qcXBsb3QuTWFya2VyUmVuZGVyZXIoe3N0eWxlOiJsaW5lIn0pO3RoaXMubWFya2VyUmVuZGVyZXIuaW5pdCgpO3RoaXMuaGlnaGxpZ2h0T2JqZWN0SW5kZXg9bnVsbDtpZihsLm9iamVjdHMpe3ZhciBxPWwub2JqZWN0cyxwO2Zvcih2YXIgbT0wO208cS5sZW5ndGg7bSsrKXtwPXFbbV07Zm9yKHZhciByIGluIHApe3N3aXRjaChyKXtjYXNlImxpbmUiOnRoaXMuYWRkTGluZShwW3JdKTticmVhaztjYXNlImhvcml6b250YWxMaW5lIjp0aGlzLmFkZEhvcml6b250YWxMaW5lKHBbcl0pO2JyZWFrO2Nhc2UiZGFzaGVkSG9yaXpvbnRhbExpbmUiOnRoaXMuYWRkRGFzaGVkSG9yaXpvbnRhbExpbmUocFtyXSk7YnJlYWs7Y2FzZSJ2ZXJ0aWNhbExpbmUiOnRoaXMuYWRkVmVydGljYWxMaW5lKHBbcl0pO2JyZWFrO2Nhc2UiZGFzaGVkVmVydGljYWxMaW5lIjp0aGlzLmFkZERhc2hlZFZlcnRpY2FsTGluZShwW3JdKTticmVhaztkZWZhdWx0OmJyZWFrfX19fWQuZXh0ZW5kKHRydWUsdGhpcy5vcHRpb25zLGwpfTtkLmpxcGxvdC5DYW52YXNPdmVybGF5LnBvc3RQbG90SW5pdD1mdW5jdGlvbihvLG4sbSl7dmFyIGw9bXx8e307dGhpcy5wbHVnaW5zLmNhbnZhc092ZXJsYXk9bmV3IGQuanFwbG90LkNhbnZhc092ZXJsYXkobC5jYW52YXNPdmVybGF5KX07ZnVuY3Rpb24gaCgpe3RoaXMudWlkPW51bGw7dGhpcy50eXBlPW51bGw7dGhpcy5ncmlkU3RhcnQ9bnVsbDt0aGlzLmdyaWRTdG9wPW51bGw7dGhpcy50b29sdGlwV2lkdGhGYWN0b3I9MDt0aGlzLm9wdGlvbnM9e25hbWU6bnVsbCxzaG93OnRydWUsbGluZVdpZHRoOjIsbGluZUNhcDoicm91bmQiLGNvbG9yOiIjNjY2NjY2IixzaGFkb3c6dHJ1ZSxzaGFkb3dBbmdsZTo0NSxzaGFkb3dPZmZzZXQ6MSxzaGFkb3dEZXB0aDozLHNoYWRvd0FscGhhOiIwLjA3Iix4YXhpczoieGF4aXMiLHlheGlzOiJ5YXhpcyIsc2hvd1Rvb2x0aXA6ZmFsc2Usc2hvd1Rvb2x0aXBQcmVjaXNpb246MC42LHRvb2x0aXBMb2NhdGlvbjoibnciLGZhZGVUb29sdGlwOnRydWUsdG9vbHRpcEZhZGVTcGVlZDoiZmFzdCIsdG9vbHRpcE9mZnNldDo0LHRvb2x0aXBGb3JtYXRTdHJpbmc6IiVkLCAlZCJ9fWZ1bmN0aW9uIGIobCl7aC5jYWxsKHRoaXMpO3RoaXMudHlwZT0ibGluZSI7dmFyIG09e3N0YXJ0OltdLHN0b3A6W119O2QuZXh0ZW5kKHRydWUsdGhpcy5vcHRpb25zLG0sbCk7aWYodGhpcy5vcHRpb25zLnNob3dUb29sdGlwUHJlY2lzaW9uPDAuMDEpe3RoaXMub3B0aW9ucy5zaG93VG9vbHRpcFByZWNpc2lvbj0wLjAxfX1iLnByb3RvdHlwZT1uZXcgaCgpO2IucHJvdG90eXBlLmNvbnN0cnVjdG9yPWI7ZnVuY3Rpb24gZShsKXtoLmNhbGwodGhpcyk7dGhpcy50eXBlPSJob3Jpem9udGFsTGluZSI7dmFyIG09e3k6bnVsbCx4bWluOm51bGwseG1heDpudWxsLHhPZmZzZXQ6IjZweCIseG1pbk9mZnNldDpudWxsLHhtYXhPZmZzZXQ6bnVsbH07ZC5leHRlbmQodHJ1ZSx0aGlzLm9wdGlvbnMsbSxsKTtpZih0aGlzLm9wdGlvbnMuc2hvd1Rvb2x0aXBQcmVjaXNpb248MC4wMSl7dGhpcy5vcHRpb25zLnNob3dUb29sdGlwUHJlY2lzaW9uPTAuMDF9fWUucHJvdG90eXBlPW5ldyBoKCk7ZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZTtmdW5jdGlvbiBpKGwpe2guY2FsbCh0aGlzKTt0aGlzLnR5cGU9ImRhc2hlZEhvcml6b250YWxMaW5lIjt2YXIgbT17eTpudWxsLHhtaW46bnVsbCx4bWF4Om51bGwseE9mZnNldDoiNnB4Iix4bWluT2Zmc2V0Om51bGwseG1heE9mZnNldDpudWxsLGRhc2hQYXR0ZXJuOls4LDhdfTtkLmV4dGVuZCh0cnVlLHRoaXMub3B0aW9ucyxtLGwpO2lmKHRoaXMub3B0aW9ucy5zaG93VG9vbHRpcFByZWNpc2lvbjwwLjAxKXt0aGlzLm9wdGlvbnMuc2hvd1Rvb2x0aXBQcmVjaXNpb249MC4wMX19aS5wcm90b3R5cGU9bmV3IGgoKTtpLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1pO2Z1bmN0aW9uIGMobCl7aC5jYWxsKHRoaXMpO3RoaXMudHlwZT0idmVydGljYWxMaW5lIjt2YXIgbT17eDpudWxsLHltaW46bnVsbCx5bWF4Om51bGwseU9mZnNldDoiNnB4Iix5bWluT2Zmc2V0Om51bGwseW1heE9mZnNldDpudWxsfTtkLmV4dGVuZCh0cnVlLHRoaXMub3B0aW9ucyxtLGwpO2lmKHRoaXMub3B0aW9ucy5zaG93VG9vbHRpcFByZWNpc2lvbjwwLjAxKXt0aGlzLm9wdGlvbnMuc2hvd1Rvb2x0aXBQcmVjaXNpb249MC4wMX19Yy5wcm90b3R5cGU9bmV3IGgoKTtjLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1jO2Z1bmN0aW9uIGsobCl7aC5jYWxsKHRoaXMpO3RoaXMudHlwZT0iZGFzaGVkVmVydGljYWxMaW5lIjt0aGlzLnN0YXJ0PW51bGw7dGhpcy5zdG9wPW51bGw7dmFyIG09e3g6bnVsbCx5bWluOm51bGwseW1heDpudWxsLHlPZmZzZXQ6IjZweCIseW1pbk9mZnNldDpudWxsLHltYXhPZmZzZXQ6bnVsbCxkYXNoUGF0dGVybjpbOCw4XX07ZC5leHRlbmQodHJ1ZSx0aGlzLm9wdGlvbnMsbSxsKTtpZih0aGlzLm9wdGlvbnMuc2hvd1Rvb2x0aXBQcmVjaXNpb248MC4wMSl7dGhpcy5vcHRpb25zLnNob3dUb29sdGlwUHJlY2lzaW9uPTAuMDF9fWsucHJvdG90eXBlPW5ldyBoKCk7ay5wcm90b3R5cGUuY29uc3RydWN0b3I9aztkLmpxcGxvdC5DYW52YXNPdmVybGF5LnByb3RvdHlwZS5hZGRMaW5lPWZ1bmN0aW9uKG0pe3ZhciBsPW5ldyBiKG0pO2wudWlkPWYrKzt0aGlzLm9iamVjdHMucHVzaChsKTt0aGlzLm9iamVjdE5hbWVzLnB1c2gobC5vcHRpb25zLm5hbWUpfTtkLmpxcGxvdC5DYW52YXNPdmVybGF5LnByb3RvdHlwZS5hZGRIb3Jpem9udGFsTGluZT1mdW5jdGlvbihtKXt2YXIgbD1uZXcgZShtKTtsLnVpZD1mKys7dGhpcy5vYmplY3RzLnB1c2gobCk7dGhpcy5vYmplY3ROYW1lcy5wdXNoKGwub3B0aW9ucy5uYW1lKX07ZC5qcXBsb3QuQ2FudmFzT3ZlcmxheS5wcm90b3R5cGUuYWRkRGFzaGVkSG9yaXpvbnRhbExpbmU9ZnVuY3Rpb24obSl7dmFyIGw9bmV3IGkobSk7bC51aWQ9ZisrO3RoaXMub2JqZWN0cy5wdXNoKGwpO3RoaXMub2JqZWN0TmFtZXMucHVzaChsLm9wdGlvbnMubmFtZSl9O2QuanFwbG90LkNhbnZhc092ZXJsYXkucHJvdG90eXBlLmFkZFZlcnRpY2FsTGluZT1mdW5jdGlvbihtKXt2YXIgbD1uZXcgYyhtKTtsLnVpZD1mKys7dGhpcy5vYmplY3RzLnB1c2gobCk7dGhpcy5vYmplY3ROYW1lcy5wdXNoKGwub3B0aW9ucy5uYW1lKX07ZC5qcXBsb3QuQ2FudmFzT3ZlcmxheS5wcm90b3R5cGUuYWRkRGFzaGVkVmVydGljYWxMaW5lPWZ1bmN0aW9uKG0pe3ZhciBsPW5ldyBrKG0pO2wudWlkPWYrKzt0aGlzLm9iamVjdHMucHVzaChsKTt0aGlzLm9iamVjdE5hbWVzLnB1c2gobC5vcHRpb25zLm5hbWUpfTtkLmpxcGxvdC5DYW52YXNPdmVybGF5LnByb3RvdHlwZS5yZW1vdmVPYmplY3Q9ZnVuY3Rpb24obCl7aWYoZC50eXBlKGwpPT0ibnVtYmVyIil7dGhpcy5vYmplY3RzLnNwbGljZShsLDEpO3RoaXMub2JqZWN0TmFtZXMuc3BsaWNlKGwsMSl9ZWxzZXt2YXIgbT1kLmluQXJyYXkobCx0aGlzLm9iamVjdE5hbWVzKTtpZihtIT0tMSl7dGhpcy5vYmplY3RzLnNwbGljZShtLDEpO3RoaXMub2JqZWN0TmFtZXMuc3BsaWNlKG0sMSl9fX07ZC5qcXBsb3QuQ2FudmFzT3ZlcmxheS5wcm90b3R5cGUuZ2V0T2JqZWN0PWZ1bmN0aW9uKGwpe2lmKGQudHlwZShsKT09Im51bWJlciIpe3JldHVybiB0aGlzLm9iamVjdHNbbF19ZWxzZXt2YXIgbT1kLmluQXJyYXkobCx0aGlzLm9iamVjdE5hbWVzKTtpZihtIT0tMSl7cmV0dXJuIHRoaXMub2JqZWN0c1ttXX19fTtkLmpxcGxvdC5DYW52YXNPdmVybGF5LnByb3RvdHlwZS5nZXQ9ZC5qcXBsb3QuQ2FudmFzT3ZlcmxheS5wcm90b3R5cGUuZ2V0T2JqZWN0O2QuanFwbG90LkNhbnZhc092ZXJsYXkucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKGwpe3RoaXMuY2FudmFzLl9jdHguY2xlYXJSZWN0KDAsMCx0aGlzLmNhbnZhcy5nZXRXaWR0aCgpLHRoaXMuY2FudmFzLmdldEhlaWdodCgpKX07ZC5qcXBsb3QuQ2FudmFzT3ZlcmxheS5wcm90b3R5cGUuZHJhdz1mdW5jdGlvbihJKXt2YXIgdyx0PXRoaXMub2JqZWN0cyxEPXRoaXMubWFya2VyUmVuZGVyZXIscSxFO2lmKHRoaXMub3B0aW9ucy5zaG93KXt0aGlzLmNhbnZhcy5fY3R4LmNsZWFyUmVjdCgwLDAsdGhpcy5jYW52YXMuZ2V0V2lkdGgoKSx0aGlzLmNhbnZhcy5nZXRIZWlnaHQoKSk7Zm9yKHZhciBGPTA7Rjx0Lmxlbmd0aDtGKyspe3c9dFtGXTt2YXIgej1kLmV4dGVuZCh0cnVlLHt9LHcub3B0aW9ucyk7aWYody5vcHRpb25zLnNob3cpe0Quc2hhZG93PXcub3B0aW9ucy5zaGFkb3c7dy50b29sdGlwV2lkdGhGYWN0b3I9dy5vcHRpb25zLmxpbmVXaWR0aC93Lm9wdGlvbnMuc2hvd1Rvb2x0aXBQcmVjaXNpb247c3dpdGNoKHcudHlwZSl7Y2FzZSJsaW5lIjpELnN0eWxlPSJsaW5lIjt6LmNsb3NlUGF0aD1mYWxzZTtxPVtJLmF4ZXNbdy5vcHRpb25zLnhheGlzXS5zZXJpZXNfdTJwKHcub3B0aW9ucy5zdGFydFswXSksSS5heGVzW3cub3B0aW9ucy55YXhpc10uc2VyaWVzX3UycCh3Lm9wdGlvbnMuc3RhcnRbMV0pXTtFPVtJLmF4ZXNbdy5vcHRpb25zLnhheGlzXS5zZXJpZXNfdTJwKHcub3B0aW9ucy5zdG9wWzBdKSxJLmF4ZXNbdy5vcHRpb25zLnlheGlzXS5zZXJpZXNfdTJwKHcub3B0aW9ucy5zdG9wWzFdKV07dy5ncmlkU3RhcnQ9cTt3LmdyaWRTdG9wPUU7RC5kcmF3KHEsRSx0aGlzLmNhbnZhcy5fY3R4LHopO2JyZWFrO2Nhc2UiaG9yaXpvbnRhbExpbmUiOmlmKHcub3B0aW9ucy55IT1udWxsKXtELnN0eWxlPSJsaW5lIjt6LmNsb3NlUGF0aD1mYWxzZTt2YXIgbj1JLmF4ZXNbdy5vcHRpb25zLnhheGlzXSxRLEosdT1JLmF4ZXNbdy5vcHRpb25zLnlheGlzXS5zZXJpZXNfdTJwKHcub3B0aW9ucy55KSxHPXcub3B0aW9ucy54bWluT2Zmc2V0fHx3Lm9wdGlvbnMueE9mZnNldCxyPXcub3B0aW9ucy54bWF4T2Zmc2V0fHx3Lm9wdGlvbnMueE9mZnNldDtpZih3Lm9wdGlvbnMueG1pbiE9bnVsbCl7UT1uLnNlcmllc191MnAody5vcHRpb25zLnhtaW4pfWVsc2V7aWYoRyE9bnVsbCl7aWYoZC50eXBlKEcpPT0ibnVtYmVyIil7UT1uLnNlcmllc191MnAobi5taW4rRyl9ZWxzZXtpZihkLnR5cGUoRyk9PSJzdHJpbmciKXtRPW4uc2VyaWVzX3UycChuLm1pbikrcGFyc2VGbG9hdChHKX19fX1pZih3Lm9wdGlvbnMueG1heCE9bnVsbCl7Sj1uLnNlcmllc191MnAody5vcHRpb25zLnhtYXgpfWVsc2V7aWYociE9bnVsbCl7aWYoZC50eXBlKHIpPT0ibnVtYmVyIil7Sj1uLnNlcmllc191MnAobi5tYXgtcil9ZWxzZXtpZihkLnR5cGUocik9PSJzdHJpbmciKXtKPW4uc2VyaWVzX3UycChuLm1heCktcGFyc2VGbG9hdChyKX19fX1pZihKIT1udWxsJiZRIT1udWxsKXt3LmdyaWRTdGFydD1bUSx1XTt3LmdyaWRTdG9wPVtKLHVdO0QuZHJhdyhbUSx1XSxbSix1XSx0aGlzLmNhbnZhcy5fY3R4LHopfX1icmVhaztjYXNlImRhc2hlZEhvcml6b250YWxMaW5lIjp2YXIgbT13Lm9wdGlvbnMuZGFzaFBhdHRlcm47dmFyIEM9MDtmb3IodmFyIEs9MDtLPG0ubGVuZ3RoO0srKyl7Qys9bVtLXX1pZih3Lm9wdGlvbnMueSE9bnVsbCl7RC5zdHlsZT0ibGluZSI7ei5jbG9zZVBhdGg9ZmFsc2U7dmFyIG49SS5heGVzW3cub3B0aW9ucy54YXhpc10sUSxKLHU9SS5heGVzW3cub3B0aW9ucy55YXhpc10uc2VyaWVzX3UycCh3Lm9wdGlvbnMueSksRz13Lm9wdGlvbnMueG1pbk9mZnNldHx8dy5vcHRpb25zLnhPZmZzZXQscj13Lm9wdGlvbnMueG1heE9mZnNldHx8dy5vcHRpb25zLnhPZmZzZXQ7aWYody5vcHRpb25zLnhtaW4hPW51bGwpe1E9bi5zZXJpZXNfdTJwKHcub3B0aW9ucy54bWluKX1lbHNle2lmKEchPW51bGwpe2lmKGQudHlwZShHKT09Im51bWJlciIpe1E9bi5zZXJpZXNfdTJwKG4ubWluK0cpfWVsc2V7aWYoZC50eXBlKEcpPT0ic3RyaW5nIil7UT1uLnNlcmllc191MnAobi5taW4pK3BhcnNlRmxvYXQoRyl9fX19aWYody5vcHRpb25zLnhtYXghPW51bGwpe0o9bi5zZXJpZXNfdTJwKHcub3B0aW9ucy54bWF4KX1lbHNle2lmKHIhPW51bGwpe2lmKGQudHlwZShyKT09Im51bWJlciIpe0o9bi5zZXJpZXNfdTJwKG4ubWF4LXIpfWVsc2V7aWYoZC50eXBlKHIpPT0ic3RyaW5nIil7Sj1uLnNlcmllc191MnAobi5tYXgpLXBhcnNlRmxvYXQocil9fX19aWYoSiE9bnVsbCYmUSE9bnVsbCl7dy5ncmlkU3RhcnQ9W1EsdV07dy5ncmlkU3RvcD1bSix1XTt2YXIgcD1NYXRoLmNlaWwoKEotUSkvQyk7dmFyIE89USxNO2Zvcih2YXIgSz0wO0s8cDtLKyspe2Zvcih2YXIgSD0wO0g8bS5sZW5ndGg7SCs9Mil7TT1PK21bSF07RC5kcmF3KFtPLHVdLFtNLHVdLHRoaXMuY2FudmFzLl9jdHgseik7Tys9bVtIXTtpZihIPG0ubGVuZ3RoLTEpe08rPW1bSCsxXX19fX19YnJlYWs7Y2FzZSJ2ZXJ0aWNhbExpbmUiOmlmKHcub3B0aW9ucy54IT1udWxsKXtELnN0eWxlPSJsaW5lIjt6LmNsb3NlUGF0aD1mYWxzZTt2YXIgTD1JLmF4ZXNbdy5vcHRpb25zLnlheGlzXSxsLHMsdj1JLmF4ZXNbdy5vcHRpb25zLnhheGlzXS5zZXJpZXNfdTJwKHcub3B0aW9ucy54KSxCPXcub3B0aW9ucy55bWluT2Zmc2V0fHx3Lm9wdGlvbnMueU9mZnNldCxvPXcub3B0aW9ucy55bWF4T2Zmc2V0fHx3Lm9wdGlvbnMueU9mZnNldDtpZih3Lm9wdGlvbnMueW1pbiE9bnVsbCl7bD1MLnNlcmllc191MnAody5vcHRpb25zLnltaW4pfWVsc2V7aWYoQiE9bnVsbCl7aWYoZC50eXBlKEIpPT0ibnVtYmVyIil7bD1MLnNlcmllc191MnAoTC5taW4tQil9ZWxzZXtpZihkLnR5cGUoQik9PSJzdHJpbmciKXtsPUwuc2VyaWVzX3UycChMLm1pbiktcGFyc2VGbG9hdChCKX19fX1pZih3Lm9wdGlvbnMueW1heCE9bnVsbCl7cz1MLnNlcmllc191MnAody5vcHRpb25zLnltYXgpfWVsc2V7aWYobyE9bnVsbCl7aWYoZC50eXBlKG8pPT0ibnVtYmVyIil7cz1MLnNlcmllc191MnAoTC5tYXgrbyl9ZWxzZXtpZihkLnR5cGUobyk9PSJzdHJpbmciKXtzPUwuc2VyaWVzX3UycChMLm1heCkrcGFyc2VGbG9hdChvKX19fX1pZihzIT1udWxsJiZsIT1udWxsKXt3LmdyaWRTdGFydD1bdixsXTt3LmdyaWRTdG9wPVt2LHNdO0QuZHJhdyhbdixsXSxbdixzXSx0aGlzLmNhbnZhcy5fY3R4LHopfX1icmVhaztjYXNlImRhc2hlZFZlcnRpY2FsTGluZSI6dmFyIG09dy5vcHRpb25zLmRhc2hQYXR0ZXJuO3ZhciBDPTA7Zm9yKHZhciBLPTA7SzxtLmxlbmd0aDtLKyspe0MrPW1bS119aWYody5vcHRpb25zLnghPW51bGwpe0Quc3R5bGU9ImxpbmUiO3ouY2xvc2VQYXRoPWZhbHNlO3ZhciBMPUkuYXhlc1t3Lm9wdGlvbnMueWF4aXNdLGwscyx2PUkuYXhlc1t3Lm9wdGlvbnMueGF4aXNdLnNlcmllc191MnAody5vcHRpb25zLngpLEI9dy5vcHRpb25zLnltaW5PZmZzZXR8fHcub3B0aW9ucy55T2Zmc2V0LG89dy5vcHRpb25zLnltYXhPZmZzZXR8fHcub3B0aW9ucy55T2Zmc2V0O2lmKHcub3B0aW9ucy55bWluIT1udWxsKXtsPUwuc2VyaWVzX3UycCh3Lm9wdGlvbnMueW1pbil9ZWxzZXtpZihCIT1udWxsKXtpZihkLnR5cGUoQik9PSJudW1iZXIiKXtsPUwuc2VyaWVzX3UycChMLm1pbi1CKX1lbHNle2lmKGQudHlwZShCKT09InN0cmluZyIpe2w9TC5zZXJpZXNfdTJwKEwubWluKS1wYXJzZUZsb2F0KEIpfX19fWlmKHcub3B0aW9ucy55bWF4IT1udWxsKXtzPUwuc2VyaWVzX3UycCh3Lm9wdGlvbnMueW1heCl9ZWxzZXtpZihvIT1udWxsKXtpZihkLnR5cGUobyk9PSJudW1iZXIiKXtzPUwuc2VyaWVzX3UycChMLm1heCtvKX1lbHNle2lmKGQudHlwZShvKT09InN0cmluZyIpe3M9TC5zZXJpZXNfdTJwKEwubWF4KStwYXJzZUZsb2F0KG8pfX19fWlmKHMhPW51bGwmJmwhPW51bGwpe3cuZ3JpZFN0YXJ0PVt2LGxdO3cuZ3JpZFN0b3A9W3Ysc107dmFyIHA9TWF0aC5jZWlsKChsLXMpL0MpO3ZhciBBPSgocCpDKS0obC1zKSkvMjt2YXIgTz1sLE0sTixQO2Zvcih2YXIgSz0wO0s8cDtLKyspe2Zvcih2YXIgSD0wO0g8bS5sZW5ndGg7SCs9Mil7TT1PLW1bSF07aWYoTTxzKXtNPXN9aWYoTzxzKXtPPXN9RC5kcmF3KFt2LE9dLFt2LE1dLHRoaXMuY2FudmFzLl9jdHgseik7Ty09bVtIXTtpZihIPG0ubGVuZ3RoLTEpe08tPW1bSCsxXX19fX19YnJlYWs7ZGVmYXVsdDpicmVha319fX19O2QuanFwbG90LkNhbnZhc092ZXJsYXkucG9zdFBsb3REcmF3PWZ1bmN0aW9uKCl7dmFyIG09dGhpcy5wbHVnaW5zLmNhbnZhc092ZXJsYXk7aWYobSYmbS5oaWdobGlnaHRDYW52YXMpe20uaGlnaGxpZ2h0Q2FudmFzLnJlc2V0Q2FudmFzKCk7bS5oaWdobGlnaHRDYW52YXM9bnVsbH1tLmNhbnZhcz1uZXcgZC5qcXBsb3QuR2VuZXJpY0NhbnZhcygpO3RoaXMuZXZlbnRDYW52YXMuX2VsZW0uYmVmb3JlKG0uY2FudmFzLmNyZWF0ZUVsZW1lbnQodGhpcy5fZ3JpZFBhZGRpbmcsImpxcGxvdC1vdmVybGF5Q2FudmFzLWNhbnZhcyIsdGhpcy5fcGxvdERpbWVuc2lvbnMsdGhpcykpO20uY2FudmFzLnNldENvbnRleHQoKTtpZighbS5kZWZlckRyYXcpe20uZHJhdyh0aGlzKX12YXIgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTttLl90b29sdGlwRWxlbT1kKGwpO2w9bnVsbDttLl90b29sdGlwRWxlbS5hZGRDbGFzcygianFwbG90LWNhbnZhc092ZXJsYXktdG9vbHRpcCIpO20uX3Rvb2x0aXBFbGVtLmNzcyh7cG9zaXRpb246ImFic29sdXRlIixkaXNwbGF5OiJub25lIn0pO3RoaXMuZXZlbnRDYW52YXMuX2VsZW0uYmVmb3JlKG0uX3Rvb2x0aXBFbGVtKTt0aGlzLmV2ZW50Q2FudmFzLl9lbGVtLmJpbmQoIm1vdXNlbGVhdmUiLHtlbGVtOm0uX3Rvb2x0aXBFbGVtfSxmdW5jdGlvbihuKXtuLmRhdGEuZWxlbS5oaWRlKCl9KTt2YXIgbT1udWxsfTtmdW5jdGlvbiBqKHEsbyxwLG4pe3ZhciBzPXEucGx1Z2lucy5jYW52YXNPdmVybGF5O3ZhciBtPXMuX3Rvb2x0aXBFbGVtO3ZhciBsPW8ub3B0aW9ucyx0LHI7bS5odG1sKGQuanFwbG90LnNwcmludGYobC50b29sdGlwRm9ybWF0U3RyaW5nLG5bMF0sblsxXSkpO3N3aXRjaChsLnRvb2x0aXBMb2NhdGlvbil7Y2FzZSJudyI6dD1wWzBdK3EuX2dyaWRQYWRkaW5nLmxlZnQtbS5vdXRlcldpZHRoKHRydWUpLWwudG9vbHRpcE9mZnNldDtyPXBbMV0rcS5fZ3JpZFBhZGRpbmcudG9wLWwudG9vbHRpcE9mZnNldC1tLm91dGVySGVpZ2h0KHRydWUpO2JyZWFrO2Nhc2UibiI6dD1wWzBdK3EuX2dyaWRQYWRkaW5nLmxlZnQtbS5vdXRlcldpZHRoKHRydWUpLzI7cj1wWzFdK3EuX2dyaWRQYWRkaW5nLnRvcC1sLnRvb2x0aXBPZmZzZXQtbS5vdXRlckhlaWdodCh0cnVlKTticmVhaztjYXNlIm5lIjp0PXBbMF0rcS5fZ3JpZFBhZGRpbmcubGVmdCtsLnRvb2x0aXBPZmZzZXQ7cj1wWzFdK3EuX2dyaWRQYWRkaW5nLnRvcC1sLnRvb2x0aXBPZmZzZXQtbS5vdXRlckhlaWdodCh0cnVlKTticmVhaztjYXNlImUiOnQ9cFswXStxLl9ncmlkUGFkZGluZy5sZWZ0K2wudG9vbHRpcE9mZnNldDtyPXBbMV0rcS5fZ3JpZFBhZGRpbmcudG9wLW0ub3V0ZXJIZWlnaHQodHJ1ZSkvMjticmVhaztjYXNlInNlIjp0PXBbMF0rcS5fZ3JpZFBhZGRpbmcubGVmdCtsLnRvb2x0aXBPZmZzZXQ7cj1wWzFdK3EuX2dyaWRQYWRkaW5nLnRvcCtsLnRvb2x0aXBPZmZzZXQ7YnJlYWs7Y2FzZSJzIjp0PXBbMF0rcS5fZ3JpZFBhZGRpbmcubGVmdC1tLm91dGVyV2lkdGgodHJ1ZSkvMjtyPXBbMV0rcS5fZ3JpZFBhZGRpbmcudG9wK2wudG9vbHRpcE9mZnNldDticmVhaztjYXNlInN3Ijp0PXBbMF0rcS5fZ3JpZFBhZGRpbmcubGVmdC1tLm91dGVyV2lkdGgodHJ1ZSktbC50b29sdGlwT2Zmc2V0O3I9cFsxXStxLl9ncmlkUGFkZGluZy50b3ArbC50b29sdGlwT2Zmc2V0O2JyZWFrO2Nhc2UidyI6dD1wWzBdK3EuX2dyaWRQYWRkaW5nLmxlZnQtbS5vdXRlcldpZHRoKHRydWUpLWwudG9vbHRpcE9mZnNldDtyPXBbMV0rcS5fZ3JpZFBhZGRpbmcudG9wLW0ub3V0ZXJIZWlnaHQodHJ1ZSkvMjticmVhaztkZWZhdWx0OnQ9cFswXStxLl9ncmlkUGFkZGluZy5sZWZ0LW0ub3V0ZXJXaWR0aCh0cnVlKS1sLnRvb2x0aXBPZmZzZXQ7cj1wWzFdK3EuX2dyaWRQYWRkaW5nLnRvcC1sLnRvb2x0aXBPZmZzZXQtbS5vdXRlckhlaWdodCh0cnVlKTticmVha31tLmNzcygibGVmdCIsdCk7bS5jc3MoInRvcCIscik7aWYobC5mYWRlVG9vbHRpcCl7bS5zdG9wKHRydWUsdHJ1ZSkuZmFkZUluKGwudG9vbHRpcEZhZGVTcGVlZCl9ZWxzZXttLnNob3coKX1tPW51bGx9ZnVuY3Rpb24gZyh5LHAscixvKXt2YXIgbj15WzBdO3ZhciBtPXlbMV07dmFyIHg9TWF0aC5yb3VuZChyWzBdKTt2YXIgdz1NYXRoLnJvdW5kKHJbMV0pO3ZhciB0PU1hdGgucm91bmQocFswXSk7dmFyIHM9TWF0aC5yb3VuZChwWzFdKTt2YXIgcT1NYXRoLnNxcnQoTWF0aC5wb3coeC10LDIpK01hdGgucG93KHctcywyKSk7dmFyIHo9bypxO3ZhciB2PU1hdGguYWJzKCh0LXgpKihtLXcpLShzLXcpKihuLXgpKTt2YXIgdT0odjx6KT90cnVlOmZhbHNlO3JldHVybiB1fWZ1bmN0aW9uIGEoeSx2LHEseix3KXt2YXIgeD13LnBsdWdpbnMuY2FudmFzT3ZlcmxheTt2YXIgdT14Lm9iamVjdHM7dmFyIHI9dS5sZW5ndGg7dmFyIHQsbT1mYWxzZTt2YXIgcDtmb3IodmFyIHM9MDtzPHI7cysrKXt0PXVbc107aWYodC5vcHRpb25zLnNob3dUb29sdGlwKXt2YXIgbz1nKFt2Lngsdi55XSx0LmdyaWRTdGFydCx0LmdyaWRTdG9wLHQudG9vbHRpcFdpZHRoRmFjdG9yKTtxPVt3LmF4ZXNbdC5vcHRpb25zLnhheGlzXS5zZXJpZXNfcDJ1KHYueCksdy5heGVzW3Qub3B0aW9ucy55YXhpc10uc2VyaWVzX3AydSh2LnkpXTtpZihvJiZ4LmhpZ2hsaWdodE9iamVjdEluZGV4PT1udWxsKXtzd2l0Y2godC50eXBlKXtjYXNlImxpbmUiOmoodyx0LFt2Lngsdi55XSxxKTticmVhaztjYXNlImhvcml6b250YWxMaW5lIjpjYXNlImRhc2hlZEhvcml6b250YWxMaW5lIjpqKHcsdCxbdi54LHQuZ3JpZFN0YXJ0WzFdXSxbcVswXSx0Lm9wdGlvbnMueV0pO2JyZWFrO2Nhc2UidmVydGljYWxMaW5lIjpjYXNlImRhc2hlZFZlcnRpY2FsTGluZSI6aih3LHQsW3QuZ3JpZFN0YXJ0WzBdLHYueV0sW3Qub3B0aW9ucy54LHFbMV1dKTticmVhaztkZWZhdWx0OmJyZWFrfXguaGlnaGxpZ2h0T2JqZWN0SW5kZXg9czttPXRydWU7YnJlYWt9ZWxzZXtpZihvJiZ4LmhpZ2hsaWdodE9iamVjdEluZGV4IT09cyl7cD14Ll90b29sdGlwRWxlbTtpZih0LmZhZGVUb29sdGlwKXtwLmZhZGVPdXQodC50b29sdGlwRmFkZVNwZWVkKX1lbHNle3AuaGlkZSgpfXN3aXRjaCh0LnR5cGUpe2Nhc2UibGluZSI6aih3LHQsW3YueCx2LnldLHEpO2JyZWFrO2Nhc2UiaG9yaXpvbnRhbExpbmUiOmNhc2UiZGFzaGVkSG9yaXpvbnRhbExpbmUiOmoodyx0LFt2LngsdC5ncmlkU3RhcnRbMV1dLFtxWzBdLHQub3B0aW9ucy55XSk7YnJlYWs7Y2FzZSJ2ZXJ0aWNhbExpbmUiOmNhc2UiZGFzaGVkVmVydGljYWxMaW5lIjpqKHcsdCxbdC5ncmlkU3RhcnRbMF0sdi55XSxbdC5vcHRpb25zLngscVsxXV0pO2JyZWFrO2RlZmF1bHQ6YnJlYWt9eC5oaWdobGlnaHRPYmplY3RJbmRleD1zO209dHJ1ZTticmVha31lbHNle2lmKG8pe3N3aXRjaCh0LnR5cGUpe2Nhc2UibGluZSI6aih3LHQsW3YueCx2LnldLHEpO2JyZWFrO2Nhc2UiaG9yaXpvbnRhbExpbmUiOmNhc2UiZGFzaGVkSG9yaXpvbnRhbExpbmUiOmoodyx0LFt2LngsdC5ncmlkU3RhcnRbMV1dLFtxWzBdLHQub3B0aW9ucy55XSk7YnJlYWs7Y2FzZSJ2ZXJ0aWNhbExpbmUiOmNhc2UiZGFzaGVkVmVydGljYWxMaW5lIjpqKHcsdCxbdC5ncmlkU3RhcnRbMF0sdi55XSxbdC5vcHRpb25zLngscVsxXV0pO2JyZWFrO2RlZmF1bHQ6YnJlYWt9bT10cnVlO2JyZWFrfX19fX1pZighbSYmeC5oaWdobGlnaHRPYmplY3RJbmRleCE9PW51bGwpe3A9eC5fdG9vbHRpcEVsZW07dD14LmdldE9iamVjdCh4LmhpZ2hsaWdodE9iamVjdEluZGV4KTtpZih0LmZhZGVUb29sdGlwKXtwLmZhZGVPdXQodC50b29sdGlwRmFkZVNwZWVkKX1lbHNle3AuaGlkZSgpfXguaGlnaGxpZ2h0T2JqZWN0SW5kZXg9bnVsbH19ZC5qcXBsb3QucG9zdEluaXRIb29rcy5wdXNoKGQuanFwbG90LkNhbnZhc092ZXJsYXkucG9zdFBsb3RJbml0KTtkLmpxcGxvdC5wb3N0RHJhd0hvb2tzLnB1c2goZC5qcXBsb3QuQ2FudmFzT3ZlcmxheS5wb3N0UGxvdERyYXcpO2QuanFwbG90LmV2ZW50TGlzdGVuZXJIb29rcy5wdXNoKFsianFwbG90TW91c2VNb3ZlIixhXSl9KShqUXVlcnkpOw==]]></data>
	</file>
	<file>
	  <filename>/src/plugins/jqplot.canvasTextRenderer.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqCiAqIGpxUGxvdAogKiBQdXJlIEphdmFTY3JpcHQgcGxvdHRpbmcgcGx1Z2luIHVzaW5nIGpRdWVyeQogKgogKiBWZXJzaW9uOiAxLjAuMGIyX3IxMDEyCiAqCiAqIENvcHlyaWdodCAoYykgMjAwOS0yMDExIENocmlzIExlb25lbGxvCiAqIGpxUGxvdCBpcyBjdXJyZW50bHkgYXZhaWxhYmxlIGZvciB1c2UgaW4gYWxsIHBlcnNvbmFsIG9yIGNvbW1lcmNpYWwgcHJvamVjdHMgCiAqIHVuZGVyIGJvdGggdGhlIE1JVCAoaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHApIGFuZCBHUEwgCiAqIHZlcnNpb24gMi4wIChodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC5odG1sKSBsaWNlbnNlcy4gVGhpcyBtZWFucyB0aGF0IHlvdSBjYW4gCiAqIGNob29zZSB0aGUgbGljZW5zZSB0aGF0IGJlc3Qgc3VpdHMgeW91ciBwcm9qZWN0IGFuZCB1c2UgaXQgYWNjb3JkaW5nbHkuIAogKgogKiBBbHRob3VnaCBub3QgcmVxdWlyZWQsIHRoZSBhdXRob3Igd291bGQgYXBwcmVjaWF0ZSBhbiBlbWFpbCBsZXR0aW5nIGhpbSAKICoga25vdyBvZiBhbnkgc3Vic3RhbnRpYWwgdXNlIG9mIGpxUGxvdC4gIFlvdSBjYW4gcmVhY2ggdGhlIGF1dGhvciBhdDogCiAqIGNocmlzIGF0IGpxcGxvdCBkb3QgY29tIG9yIHNlZSBodHRwOi8vd3d3LmpxcGxvdC5jb20vaW5mby5waHAgLgogKgogKiBJZiB5b3UgYXJlIGZlZWxpbmcga2luZCBhbmQgZ2VuZXJvdXMsIGNvbnNpZGVyIHN1cHBvcnRpbmcgdGhlIHByb2plY3QgYnkKICogbWFraW5nIGEgZG9uYXRpb24gYXQ6IGh0dHA6Ly93d3cuanFwbG90LmNvbS9kb25hdGUucGhwIC4KICoKICogc3ByaW50ZiBmdW5jdGlvbnMgY29udGFpbmVkIGluIGpxcGxvdC5zcHJpbnRmLmpzIGJ5IEFzaCBTZWFybGU6CiAqCiAqICAgICB2ZXJzaW9uIDIwMDcuMDQuMjcKICogICAgIGF1dGhvciBBc2ggU2VhcmxlCiAqICAgICBodHRwOi8vaGV4bWVuLmNvbS9ibG9nLzIwMDcvMDMvcHJpbnRmLXNwcmludGYvCiAqICAgICBodHRwOi8vaGV4bWVuLmNvbS9qcy9zcHJpbnRmLmpzCiAqICAgICBUaGUgYXV0aG9yIChBc2ggU2VhcmxlKSBoYXMgcGxhY2VkIHRoaXMgY29kZSBpbiB0aGUgcHVibGljIGRvbWFpbjoKICogICAgICJUaGlzIGNvZGUgaXMgdW5yZXN0cmljdGVkOiB5b3UgYXJlIGZyZWUgdG8gdXNlIGl0IGhvd2V2ZXIgeW91IGxpa2UuIgogKgogKiBpbmNsdWRlZCBqc0RhdGUgbGlicmFyeSBieSBDaHJpcyBMZW9uZWxsbzoKICoKICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEgQ2hyaXMgTGVvbmVsbG8KICoKICoganNEYXRlIGlzIGN1cnJlbnRseSBhdmFpbGFibGUgZm9yIHVzZSBpbiBhbGwgcGVyc29uYWwgb3IgY29tbWVyY2lhbCBwcm9qZWN0cyAKICogdW5kZXIgYm90aCB0aGUgTUlUIGFuZCBHUEwgdmVyc2lvbiAyLjAgbGljZW5zZXMuIFRoaXMgbWVhbnMgdGhhdCB5b3UgY2FuIAogKiBjaG9vc2UgdGhlIGxpY2Vuc2UgdGhhdCBiZXN0IHN1aXRzIHlvdXIgcHJvamVjdCBhbmQgdXNlIGl0IGFjY29yZGluZ2x5LgogKgogKiBqc0RhdGUgYm9ycm93cyBtYW55IGNvbmNlcHRzIGFuZCBpZGVhcyBmcm9tIHRoZSBEYXRlIEluc3RhbmNlIAogKiBNZXRob2RzIGJ5IEtlbiBTbnlkZXIgYWxvbmcgd2l0aCBzb21lIHBhcnRzIG9mIEtlbidzIGFjdHVhbCBjb2RlLgogKiAKICogS2VuJ3Mgb3JpZ2lhbmwgRGF0ZSBJbnN0YW5jZSBNZXRob2RzIGFuZCBjb3B5cmlnaHQgbm90aWNlOgogKiAKICogS2VuIFNueWRlciAoa2VuIGQgc255ZGVyIGF0IGdtYWlsIGRvdCBjb20pCiAqIDIwMDgtMDktMTAKICogdmVyc2lvbiAyLjAuMiAoaHR0cDovL2tlbmRzbnlkZXIuY29tL3NhbmRib3gvZGF0ZS8pICAgICAKICogQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbiBMaWNlbnNlIDMuMCAoaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnkvMy4wLykKICoKICoganFwbG90VG9JbWFnZSBmdW5jdGlvbiBiYXNlZCBvbiBMYXJyeSBTaWRlbidzIGV4cG9ydC1qcXBsb3QtdG8tcG5nLmpzLgogKiBMYXJyeSBoYXMgZ2VuZXJvdXNseSBnaXZlbiBwZXJtaXNzaW9uIHRvIGFkYXB0IGhpcyBjb2RlIGZvciBpbmNsdXNpb24KICogaW50byBqcVBsb3QuCiAqCiAqIExhcnJ5J3Mgb3JpZ2luYWwgY29kZSBjYW4gYmUgZm91bmQgaGVyZToKICoKICogaHR0cHM6Ly9naXRodWIuY29tL2xzaWRlbi9leHBvcnQtanFwbG90LXRvLXBuZwogKiAKICogCiAqLwoKKGZ1bmN0aW9uKCQpIHsgICAgCiAgICAvLyBUaGlzIGNvZGUgaXMgYSBtb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSBjYW52YXN0ZXh0LmpzIGNvZGUsIGNvcHlyaWdodCBiZWxvdzoKICAgIC8vCiAgICAvLyBUaGlzIGNvZGUgaXMgcmVsZWFzZWQgdG8gdGhlIHB1YmxpYyBkb21haW4gYnkgSmltIFN0dWR0LCAyMDA3LgogICAgLy8gSGUgbWF5IGtlZXAgc29tZSBzb3J0IG9mIHVwIHRvIGRhdGUgY29weSBhdCBodHRwOi8vd3d3LmZlZGVyYXRlZC5jb20vfmppbS9jYW52YXN0ZXh0LwogICAgLy8KICAgICQuanFwbG90LkNhbnZhc1RleHRSZW5kZXJlciA9IGZ1bmN0aW9uKG9wdGlvbnMpewogICAgICAgIHRoaXMuZm9udFN0eWxlID0gJ25vcm1hbCc7ICAvLyBub3JtYWwsIGl0YWxpYywgb2JsaXF1ZSBbbm90IGltcGxlbWVudGVkXQogICAgICAgIHRoaXMuZm9udFZhcmlhbnQgPSAnbm9ybWFsJzsgICAgLy8gbm9ybWFsLCBzbWFsbCBjYXBzIFtub3QgaW1wbGVtZW50ZWRdCiAgICAgICAgdGhpcy5mb250V2VpZ2h0ID0gJ25vcm1hbCc7IC8vIG5vcm1hbCwgYm9sZCwgYm9sZGVyLCBsaWdodGVyLCAxMDAgLSA5MDAKICAgICAgICB0aGlzLmZvbnRTaXplID0gJzEwcHgnOyAKICAgICAgICB0aGlzLmZvbnRGYW1pbHkgPSAnc2Fucy1zZXJpZic7CiAgICAgICAgdGhpcy5mb250U3RyZXRjaCA9IDEuMDsKICAgICAgICB0aGlzLmZpbGxTdHlsZSA9ICcjNjY2NjY2JzsKICAgICAgICB0aGlzLmFuZ2xlID0gMDsKICAgICAgICB0aGlzLnRleHRBbGlnbiA9ICdzdGFydCc7CiAgICAgICAgdGhpcy50ZXh0QmFzZWxpbmUgPSAnYWxwaGFiZXRpYyc7CiAgICAgICAgdGhpcy50ZXh0OwogICAgICAgIHRoaXMud2lkdGg7CiAgICAgICAgdGhpcy5oZWlnaHQ7CiAgICAgICAgdGhpcy5wdDJweCA9IDEuMjg7CgogICAgICAgICQuZXh0ZW5kKHRydWUsIHRoaXMsIG9wdGlvbnMpOwogICAgICAgIHRoaXMubm9ybWFsaXplZEZvbnRTaXplID0gdGhpcy5ub3JtYWxpemVGb250U2l6ZSh0aGlzLmZvbnRTaXplKTsKICAgICAgICB0aGlzLnNldEhlaWdodCgpOwogICAgfTsKICAgIAogICAgJC5qcXBsb3QuQ2FudmFzVGV4dFJlbmRlcmVyLnByb3RvdHlwZS5pbml0ID0gZnVuY3Rpb24ob3B0aW9ucykgewogICAgICAgICQuZXh0ZW5kKHRydWUsIHRoaXMsIG9wdGlvbnMpOwogICAgICAgIHRoaXMubm9ybWFsaXplZEZvbnRTaXplID0gdGhpcy5ub3JtYWxpemVGb250U2l6ZSh0aGlzLmZvbnRTaXplKTsKICAgICAgICB0aGlzLnNldEhlaWdodCgpOwogICAgfTsKICAgIAogICAgLy8gY29udmVydCBjc3Mgc3BlYyBpbnRvIHBvaW50IHNpemUKICAgIC8vIHJldHVybnMgZmxvYXQKICAgICQuanFwbG90LkNhbnZhc1RleHRSZW5kZXJlci5wcm90b3R5cGUubm9ybWFsaXplRm9udFNpemUgPSBmdW5jdGlvbihzeikgewogICAgICAgIHN6ID0gU3RyaW5nKHN6KTsKICAgICAgICB2YXIgbiA9IHBhcnNlRmxvYXQoc3opOwogICAgICAgIGlmIChzei5pbmRleE9mKCdweCcpID4gLTEpIHsKICAgICAgICAgICAgcmV0dXJuIG4vdGhpcy5wdDJweDsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoc3ouaW5kZXhPZigncHQnKSA+IC0xKSB7CiAgICAgICAgICAgIHJldHVybiBuOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChzei5pbmRleE9mKCdlbScpID4gLTEpIHsKICAgICAgICAgICAgcmV0dXJuIG4qMTI7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHN6LmluZGV4T2YoJyUnKSA+IC0xKSB7CiAgICAgICAgICAgIHJldHVybiBuKjEyLzEwMDsKICAgICAgICB9CiAgICAgICAgLy8gZGVmYXVsdCB0byBwaXhlbHM7CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHJldHVybiBuL3RoaXMucHQycHg7CiAgICAgICAgfQogICAgfTsKICAgIAogICAgCiAgICAkLmpxcGxvdC5DYW52YXNUZXh0UmVuZGVyZXIucHJvdG90eXBlLmZvbnRXZWlnaHQyRmxvYXQgPSBmdW5jdGlvbih3KSB7CiAgICAgICAgLy8gdyA9IG5vcm1hbCB8IGJvbGQgfCBib2xkZXIgfCBsaWdodGVyIHwgMTAwIHwgMjAwIHwgMzAwIHwgNDAwIHwgNTAwIHwgNjAwIHwgNzAwIHwgODAwIHwgOTAwCiAgICAgICAgLy8gcmV0dXJuIHZhbHVlcyBhZGp1c3RlZCBmb3IgSGVyc2hleSBmb250LgogICAgICAgIGlmIChOdW1iZXIodykpIHsKICAgICAgICAgICAgcmV0dXJuIHcvNDAwOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgc3dpdGNoICh3KSB7CiAgICAgICAgICAgICAgICBjYXNlICdub3JtYWwnOgogICAgICAgICAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAnYm9sZCc6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDEuNzU7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICdib2xkZXInOgogICAgICAgICAgICAgICAgICAgIHJldHVybiAyLjI1OwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAnbGlnaHRlcic6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDAuNzU7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfSAgIAogICAgICAgIH0KICAgIH07CiAgICAKICAgICQuanFwbG90LkNhbnZhc1RleHRSZW5kZXJlci5wcm90b3R5cGUuZ2V0VGV4dCA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLnRleHQ7CiAgICB9OwogICAgCiAgICAkLmpxcGxvdC5DYW52YXNUZXh0UmVuZGVyZXIucHJvdG90eXBlLnNldFRleHQgPSBmdW5jdGlvbih0LCBjdHgpIHsKICAgICAgICB0aGlzLnRleHQgPSB0OwogICAgICAgIHRoaXMuc2V0V2lkdGgoY3R4KTsKICAgICAgICByZXR1cm4gdGhpczsKICAgIH07CiAgICAKICAgICQuanFwbG90LkNhbnZhc1RleHRSZW5kZXJlci5wcm90b3R5cGUuZ2V0V2lkdGggPSBmdW5jdGlvbihjdHgpIHsKICAgICAgICByZXR1cm4gdGhpcy53aWR0aDsKICAgIH07CiAgICAKICAgICQuanFwbG90LkNhbnZhc1RleHRSZW5kZXJlci5wcm90b3R5cGUuc2V0V2lkdGggPSBmdW5jdGlvbihjdHgsIHcpIHsKICAgICAgICBpZiAoIXcpIHsKICAgICAgICAgICAgdGhpcy53aWR0aCA9IHRoaXMubWVhc3VyZShjdHgsIHRoaXMudGV4dCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICB0aGlzLndpZHRoID0gdzsgICAKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICB9OwogICAgCiAgICAvLyByZXR1cm4gaGVpZ2h0IGluIHBpeGVscy4KICAgICQuanFwbG90LkNhbnZhc1RleHRSZW5kZXJlci5wcm90b3R5cGUuZ2V0SGVpZ2h0ID0gZnVuY3Rpb24oY3R4KSB7CiAgICAgICAgcmV0dXJuIHRoaXMuaGVpZ2h0OwogICAgfTsKICAgIAogICAgLy8gdyAtIGhlaWdodCBpbiBwdAogICAgLy8gc2V0IGhlaWdoIGluIHB4CiAgICAkLmpxcGxvdC5DYW52YXNUZXh0UmVuZGVyZXIucHJvdG90eXBlLnNldEhlaWdodCA9IGZ1bmN0aW9uKHcpIHsKICAgICAgICBpZiAoIXcpIHsKICAgICAgICAgICAgLy9oZWlnaHQgPSB0aGlzLmZvbnRTaXplIC8wLjc1OwogICAgICAgICAgICB0aGlzLmhlaWdodCA9IHRoaXMubm9ybWFsaXplZEZvbnRTaXplICogdGhpcy5wdDJweDsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHRoaXMuaGVpZ2h0ID0gdzsgICAKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICB9OwoKICAgICQuanFwbG90LkNhbnZhc1RleHRSZW5kZXJlci5wcm90b3R5cGUubGV0dGVyID0gZnVuY3Rpb24gKGNoKQogICAgewogICAgICAgIHJldHVybiB0aGlzLmxldHRlcnNbY2hdOwogICAgfTsKCiAgICAkLmpxcGxvdC5DYW52YXNUZXh0UmVuZGVyZXIucHJvdG90eXBlLmFzY2VudCA9IGZ1bmN0aW9uKCkKICAgIHsKICAgICAgICByZXR1cm4gdGhpcy5ub3JtYWxpemVkRm9udFNpemU7CiAgICB9OwoKICAgICQuanFwbG90LkNhbnZhc1RleHRSZW5kZXJlci5wcm90b3R5cGUuZGVzY2VudCA9IGZ1bmN0aW9uKCkKICAgIHsKICAgICAgICByZXR1cm4gNy4wKnRoaXMubm9ybWFsaXplZEZvbnRTaXplLzI1LjA7CiAgICB9OwoKICAgICQuanFwbG90LkNhbnZhc1RleHRSZW5kZXJlci5wcm90b3R5cGUubWVhc3VyZSA9IGZ1bmN0aW9uKGN0eCwgc3RyKQogICAgewogICAgICAgIHZhciB0b3RhbCA9IDA7CiAgICAgICAgdmFyIGxlbiA9IHN0ci5sZW5ndGg7CiAKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgICAgIHZhciBjID0gdGhpcy5sZXR0ZXIoc3RyLmNoYXJBdChpKSk7CiAgICAgICAgICAgIGlmIChjKSB7CiAgICAgICAgICAgICAgICB0b3RhbCArPSBjLndpZHRoICogdGhpcy5ub3JtYWxpemVkRm9udFNpemUgLyAyNS4wICogdGhpcy5mb250U3RyZXRjaDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gdG90YWw7CiAgICB9OwoKICAgICQuanFwbG90LkNhbnZhc1RleHRSZW5kZXJlci5wcm90b3R5cGUuZHJhdyA9IGZ1bmN0aW9uKGN0eCxzdHIpCiAgICB7CiAgICAgICAgdmFyIHggPSAwOwogICAgICAgIC8vIGxlYXZlIHJvb20gYXQgYm90dG9tIGZvciBkZXNjZW5kZXJzLgogICAgICAgIHZhciB5ID0gdGhpcy5oZWlnaHQqMC43MjsKICAgICAgICAgdmFyIHRvdGFsID0gMDsKICAgICAgICAgdmFyIGxlbiA9IHN0ci5sZW5ndGg7CiAgICAgICAgIHZhciBtYWcgPSB0aGlzLm5vcm1hbGl6ZWRGb250U2l6ZSAvIDI1LjA7CgogICAgICAgICBjdHguc2F2ZSgpOwogICAgICAgICB2YXIgdHgsIHR5OwogICAgICAgICAKICAgICAgICAgLy8gMXN0IHF1YWRyYW50CiAgICAgICAgIGlmICgoLU1hdGguUEkvMiA8PSB0aGlzLmFuZ2xlICYmIHRoaXMuYW5nbGUgPD0gMCkgfHwgKE1hdGguUEkqMy8yIDw9IHRoaXMuYW5nbGUgJiYgdGhpcy5hbmdsZSA8PSBNYXRoLlBJKjIpKSB7CiAgICAgICAgICAgICB0eCA9IDA7CiAgICAgICAgICAgICB0eSA9IC1NYXRoLnNpbih0aGlzLmFuZ2xlKSAqIHRoaXMud2lkdGg7CiAgICAgICAgIH0KICAgICAgICAgLy8gNHRoIHF1YWRyYW50CiAgICAgICAgIGVsc2UgaWYgKCgwIDwgdGhpcy5hbmdsZSAmJiB0aGlzLmFuZ2xlIDw9IE1hdGguUEkvMikgfHwgKC1NYXRoLlBJKjIgPD0gdGhpcy5hbmdsZSAmJiB0aGlzLmFuZ2xlIDw9IC1NYXRoLlBJKjMvMikpIHsKICAgICAgICAgICAgIHR4ID0gTWF0aC5zaW4odGhpcy5hbmdsZSkgKiB0aGlzLmhlaWdodDsKICAgICAgICAgICAgIHR5ID0gMDsKICAgICAgICAgfQogICAgICAgICAvLyAybmQgcXVhZHJhbnQKICAgICAgICAgZWxzZSBpZiAoKC1NYXRoLlBJIDwgdGhpcy5hbmdsZSAmJiB0aGlzLmFuZ2xlIDwgLU1hdGguUEkvMikgfHwgKE1hdGguUEkgPD0gdGhpcy5hbmdsZSAmJiB0aGlzLmFuZ2xlIDw9IE1hdGguUEkqMy8yKSkgewogICAgICAgICAgICAgdHggPSAtTWF0aC5jb3ModGhpcy5hbmdsZSkgKiB0aGlzLndpZHRoOwogICAgICAgICAgICAgdHkgPSAtTWF0aC5zaW4odGhpcy5hbmdsZSkgKiB0aGlzLndpZHRoIC0gTWF0aC5jb3ModGhpcy5hbmdsZSkgKiB0aGlzLmhlaWdodDsKICAgICAgICAgfQogICAgICAgICAvLyAzcmQgcXVhZHJhbnQKICAgICAgICAgZWxzZSBpZiAoKC1NYXRoLlBJKjMvMiA8IHRoaXMuYW5nbGUgJiYgdGhpcy5hbmdsZSA8IE1hdGguUEkpIHx8IChNYXRoLlBJLzIgPCB0aGlzLmFuZ2xlICYmIHRoaXMuYW5nbGUgPCBNYXRoLlBJKSkgewogICAgICAgICAgICAgdHggPSBNYXRoLnNpbih0aGlzLmFuZ2xlKSAqIHRoaXMuaGVpZ2h0IC0gTWF0aC5jb3ModGhpcy5hbmdsZSkqdGhpcy53aWR0aDsKICAgICAgICAgICAgIHR5ID0gLU1hdGguY29zKHRoaXMuYW5nbGUpICogdGhpcy5oZWlnaHQ7CiAgICAgICAgIH0KICAgICAgICAgCiAgICAgICAgIGN0eC5zdHJva2VTdHlsZSA9IHRoaXMuZmlsbFN0eWxlOwogICAgICAgICBjdHguZmlsbFN0eWxlID0gdGhpcy5maWxsU3R5bGU7CiAgICAgICAgIGN0eC50cmFuc2xhdGUodHgsIHR5KTsKICAgICAgICAgY3R4LnJvdGF0ZSh0aGlzLmFuZ2xlKTsKICAgICAgICAgY3R4LmxpbmVDYXAgPSAicm91bmQiOwogICAgICAgICAvLyBtdWx0aXBsaWVyIHdhcyAyLjAKICAgICAgICAgdmFyIGZhY3QgPSAodGhpcy5ub3JtYWxpemVkRm9udFNpemUgPiAzMCkgPyAyLjAgOiAyICsgKDMwIC0gdGhpcy5ub3JtYWxpemVkRm9udFNpemUpLzIwOwogICAgICAgICBjdHgubGluZVdpZHRoID0gZmFjdCAqIG1hZyAqIHRoaXMuZm9udFdlaWdodDJGbG9hdCh0aGlzLmZvbnRXZWlnaHQpOwogICAgICAgICAKICAgICAgICAgZm9yICggdmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKICAgICAgICAgICAgdmFyIGMgPSB0aGlzLmxldHRlciggc3RyLmNoYXJBdChpKSk7CiAgICAgICAgICAgIGlmICggIWMpIHsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBjdHguYmVnaW5QYXRoKCk7CgogICAgICAgICAgICB2YXIgcGVuVXAgPSAxOwogICAgICAgICAgICB2YXIgbmVlZFN0cm9rZSA9IDA7CiAgICAgICAgICAgIGZvciAoIHZhciBqID0gMDsgaiA8IGMucG9pbnRzLmxlbmd0aDsgaisrKSB7CiAgICAgICAgICAgICAgdmFyIGEgPSBjLnBvaW50c1tqXTsKICAgICAgICAgICAgICBpZiAoIGFbMF0gPT0gLTEgJiYgYVsxXSA9PSAtMSkgewogICAgICAgICAgICAgICAgICBwZW5VcCA9IDE7CiAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAoIHBlblVwKSB7CiAgICAgICAgICAgICAgICAgIGN0eC5tb3ZlVG8oIHggKyBhWzBdKm1hZyp0aGlzLmZvbnRTdHJldGNoLCB5IC0gYVsxXSptYWcpOwogICAgICAgICAgICAgICAgICBwZW5VcCA9IGZhbHNlOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIGN0eC5saW5lVG8oIHggKyBhWzBdKm1hZyp0aGlzLmZvbnRTdHJldGNoLCB5IC0gYVsxXSptYWcpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBjdHguc3Ryb2tlKCk7CiAgICAgICAgICAgIHggKz0gYy53aWR0aCptYWcqdGhpcy5mb250U3RyZXRjaDsKICAgICAgICAgfQogICAgICAgICBjdHgucmVzdG9yZSgpOwogICAgICAgICByZXR1cm4gdG90YWw7CiAgICB9OwoKICAgICQuanFwbG90LkNhbnZhc1RleHRSZW5kZXJlci5wcm90b3R5cGUubGV0dGVycyA9IHsKICAgICAgICAgJyAnOiB7IHdpZHRoOiAxNiwgcG9pbnRzOiBbXSB9LAogICAgICAgICAnISc6IHsgd2lkdGg6IDEwLCBwb2ludHM6IFtbNSwyMV0sWzUsN10sWy0xLC0xXSxbNSwyXSxbNCwxXSxbNSwwXSxbNiwxXSxbNSwyXV0gfSwKICAgICAgICAgJyInOiB7IHdpZHRoOiAxNiwgcG9pbnRzOiBbWzQsMjFdLFs0LDE0XSxbLTEsLTFdLFsxMiwyMV0sWzEyLDE0XV0gfSwKICAgICAgICAgJyMnOiB7IHdpZHRoOiAyMSwgcG9pbnRzOiBbWzExLDI1XSxbNCwtN10sWy0xLC0xXSxbMTcsMjVdLFsxMCwtN10sWy0xLC0xXSxbNCwxMl0sWzE4LDEyXSxbLTEsLTFdLFszLDZdLFsxNyw2XV0gfSwKICAgICAgICAgJyQnOiB7IHdpZHRoOiAyMCwgcG9pbnRzOiBbWzgsMjVdLFs4LC00XSxbLTEsLTFdLFsxMiwyNV0sWzEyLC00XSxbLTEsLTFdLFsxNywxOF0sWzE1LDIwXSxbMTIsMjFdLFs4LDIxXSxbNSwyMF0sWzMsMThdLFszLDE2XSxbNCwxNF0sWzUsMTNdLFs3LDEyXSxbMTMsMTBdLFsxNSw5XSxbMTYsOF0sWzE3LDZdLFsxNywzXSxbMTUsMV0sWzEyLDBdLFs4LDBdLFs1LDFdLFszLDNdXSB9LAogICAgICAgICAnJSc6IHsgd2lkdGg6IDI0LCBwb2ludHM6IFtbMjEsMjFdLFszLDBdLFstMSwtMV0sWzgsMjFdLFsxMCwxOV0sWzEwLDE3XSxbOSwxNV0sWzcsMTRdLFs1LDE0XSxbMywxNl0sWzMsMThdLFs0LDIwXSxbNiwyMV0sWzgsMjFdLFsxMCwyMF0sWzEzLDE5XSxbMTYsMTldLFsxOSwyMF0sWzIxLDIxXSxbLTEsLTFdLFsxNyw3XSxbMTUsNl0sWzE0LDRdLFsxNCwyXSxbMTYsMF0sWzE4LDBdLFsyMCwxXSxbMjEsM10sWzIxLDVdLFsxOSw3XSxbMTcsN11dIH0sCiAgICAgICAgICcmJzogeyB3aWR0aDogMjYsIHBvaW50czogW1syMywxMl0sWzIzLDEzXSxbMjIsMTRdLFsyMSwxNF0sWzIwLDEzXSxbMTksMTFdLFsxNyw2XSxbMTUsM10sWzEzLDFdLFsxMSwwXSxbNywwXSxbNSwxXSxbNCwyXSxbMyw0XSxbMyw2XSxbNCw4XSxbNSw5XSxbMTIsMTNdLFsxMywxNF0sWzE0LDE2XSxbMTQsMThdLFsxMywyMF0sWzExLDIxXSxbOSwyMF0sWzgsMThdLFs4LDE2XSxbOSwxM10sWzExLDEwXSxbMTYsM10sWzE4LDFdLFsyMCwwXSxbMjIsMF0sWzIzLDFdLFsyMywyXV0gfSwKICAgICAgICAgJ1wnJzogeyB3aWR0aDogMTAsIHBvaW50czogW1s1LDE5XSxbNCwyMF0sWzUsMjFdLFs2LDIwXSxbNiwxOF0sWzUsMTZdLFs0LDE1XV0gfSwKICAgICAgICAgJygnOiB7IHdpZHRoOiAxNCwgcG9pbnRzOiBbWzExLDI1XSxbOSwyM10sWzcsMjBdLFs1LDE2XSxbNCwxMV0sWzQsN10sWzUsMl0sWzcsLTJdLFs5LC01XSxbMTEsLTddXSB9LAogICAgICAgICAnKSc6IHsgd2lkdGg6IDE0LCBwb2ludHM6IFtbMywyNV0sWzUsMjNdLFs3LDIwXSxbOSwxNl0sWzEwLDExXSxbMTAsN10sWzksMl0sWzcsLTJdLFs1LC01XSxbMywtN11dIH0sCiAgICAgICAgICcqJzogeyB3aWR0aDogMTYsIHBvaW50czogW1s4LDIxXSxbOCw5XSxbLTEsLTFdLFszLDE4XSxbMTMsMTJdLFstMSwtMV0sWzEzLDE4XSxbMywxMl1dIH0sCiAgICAgICAgICcrJzogeyB3aWR0aDogMjYsIHBvaW50czogW1sxMywxOF0sWzEzLDBdLFstMSwtMV0sWzQsOV0sWzIyLDldXSB9LAogICAgICAgICAnLCc6IHsgd2lkdGg6IDEwLCBwb2ludHM6IFtbNiwxXSxbNSwwXSxbNCwxXSxbNSwyXSxbNiwxXSxbNiwtMV0sWzUsLTNdLFs0LC00XV0gfSwKICAgICAgICAgJy0nOiB7IHdpZHRoOiAxOCwgcG9pbnRzOiBbWzYsOV0sWzEyLDldXSB9LAogICAgICAgICAnLic6IHsgd2lkdGg6IDEwLCBwb2ludHM6IFtbNSwyXSxbNCwxXSxbNSwwXSxbNiwxXSxbNSwyXV0gfSwKICAgICAgICAgJy8nOiB7IHdpZHRoOiAyMiwgcG9pbnRzOiBbWzIwLDI1XSxbMiwtN11dIH0sCiAgICAgICAgICcwJzogeyB3aWR0aDogMjAsIHBvaW50czogW1s5LDIxXSxbNiwyMF0sWzQsMTddLFszLDEyXSxbMyw5XSxbNCw0XSxbNiwxXSxbOSwwXSxbMTEsMF0sWzE0LDFdLFsxNiw0XSxbMTcsOV0sWzE3LDEyXSxbMTYsMTddLFsxNCwyMF0sWzExLDIxXSxbOSwyMV1dIH0sCiAgICAgICAgICcxJzogeyB3aWR0aDogMjAsIHBvaW50czogW1s2LDE3XSxbOCwxOF0sWzExLDIxXSxbMTEsMF1dIH0sCiAgICAgICAgICcyJzogeyB3aWR0aDogMjAsIHBvaW50czogW1s0LDE2XSxbNCwxN10sWzUsMTldLFs2LDIwXSxbOCwyMV0sWzEyLDIxXSxbMTQsMjBdLFsxNSwxOV0sWzE2LDE3XSxbMTYsMTVdLFsxNSwxM10sWzEzLDEwXSxbMywwXSxbMTcsMF1dIH0sCiAgICAgICAgICczJzogeyB3aWR0aDogMjAsIHBvaW50czogW1s1LDIxXSxbMTYsMjFdLFsxMCwxM10sWzEzLDEzXSxbMTUsMTJdLFsxNiwxMV0sWzE3LDhdLFsxNyw2XSxbMTYsM10sWzE0LDFdLFsxMSwwXSxbOCwwXSxbNSwxXSxbNCwyXSxbMyw0XV0gfSwKICAgICAgICAgJzQnOiB7IHdpZHRoOiAyMCwgcG9pbnRzOiBbWzEzLDIxXSxbMyw3XSxbMTgsN10sWy0xLC0xXSxbMTMsMjFdLFsxMywwXV0gfSwKICAgICAgICAgJzUnOiB7IHdpZHRoOiAyMCwgcG9pbnRzOiBbWzE1LDIxXSxbNSwyMV0sWzQsMTJdLFs1LDEzXSxbOCwxNF0sWzExLDE0XSxbMTQsMTNdLFsxNiwxMV0sWzE3LDhdLFsxNyw2XSxbMTYsM10sWzE0LDFdLFsxMSwwXSxbOCwwXSxbNSwxXSxbNCwyXSxbMyw0XV0gfSwKICAgICAgICAgJzYnOiB7IHdpZHRoOiAyMCwgcG9pbnRzOiBbWzE2LDE4XSxbMTUsMjBdLFsxMiwyMV0sWzEwLDIxXSxbNywyMF0sWzUsMTddLFs0LDEyXSxbNCw3XSxbNSwzXSxbNywxXSxbMTAsMF0sWzExLDBdLFsxNCwxXSxbMTYsM10sWzE3LDZdLFsxNyw3XSxbMTYsMTBdLFsxNCwxMl0sWzExLDEzXSxbMTAsMTNdLFs3LDEyXSxbNSwxMF0sWzQsN11dIH0sCiAgICAgICAgICc3JzogeyB3aWR0aDogMjAsIHBvaW50czogW1sxNywyMV0sWzcsMF0sWy0xLC0xXSxbMywyMV0sWzE3LDIxXV0gfSwKICAgICAgICAgJzgnOiB7IHdpZHRoOiAyMCwgcG9pbnRzOiBbWzgsMjFdLFs1LDIwXSxbNCwxOF0sWzQsMTZdLFs1LDE0XSxbNywxM10sWzExLDEyXSxbMTQsMTFdLFsxNiw5XSxbMTcsN10sWzE3LDRdLFsxNiwyXSxbMTUsMV0sWzEyLDBdLFs4LDBdLFs1LDFdLFs0LDJdLFszLDRdLFszLDddLFs0LDldLFs2LDExXSxbOSwxMl0sWzEzLDEzXSxbMTUsMTRdLFsxNiwxNl0sWzE2LDE4XSxbMTUsMjBdLFsxMiwyMV0sWzgsMjFdXSB9LAogICAgICAgICAnOSc6IHsgd2lkdGg6IDIwLCBwb2ludHM6IFtbMTYsMTRdLFsxNSwxMV0sWzEzLDldLFsxMCw4XSxbOSw4XSxbNiw5XSxbNCwxMV0sWzMsMTRdLFszLDE1XSxbNCwxOF0sWzYsMjBdLFs5LDIxXSxbMTAsMjFdLFsxMywyMF0sWzE1LDE4XSxbMTYsMTRdLFsxNiw5XSxbMTUsNF0sWzEzLDFdLFsxMCwwXSxbOCwwXSxbNSwxXSxbNCwzXV0gfSwKICAgICAgICAgJzonOiB7IHdpZHRoOiAxMCwgcG9pbnRzOiBbWzUsMTRdLFs0LDEzXSxbNSwxMl0sWzYsMTNdLFs1LDE0XSxbLTEsLTFdLFs1LDJdLFs0LDFdLFs1LDBdLFs2LDFdLFs1LDJdXSB9LAogICAgICAgICAnOyc6IHsgd2lkdGg6IDEwLCBwb2ludHM6IFtbNSwxNF0sWzQsMTNdLFs1LDEyXSxbNiwxM10sWzUsMTRdLFstMSwtMV0sWzYsMV0sWzUsMF0sWzQsMV0sWzUsMl0sWzYsMV0sWzYsLTFdLFs1LC0zXSxbNCwtNF1dIH0sCiAgICAgICAgICc8JzogeyB3aWR0aDogMjQsIHBvaW50czogW1syMCwxOF0sWzQsOV0sWzIwLDBdXSB9LAogICAgICAgICAnPSc6IHsgd2lkdGg6IDI2LCBwb2ludHM6IFtbNCwxMl0sWzIyLDEyXSxbLTEsLTFdLFs0LDZdLFsyMiw2XV0gfSwKICAgICAgICAgJz4nOiB7IHdpZHRoOiAyNCwgcG9pbnRzOiBbWzQsMThdLFsyMCw5XSxbNCwwXV0gfSwKICAgICAgICAgJz8nOiB7IHdpZHRoOiAxOCwgcG9pbnRzOiBbWzMsMTZdLFszLDE3XSxbNCwxOV0sWzUsMjBdLFs3LDIxXSxbMTEsMjFdLFsxMywyMF0sWzE0LDE5XSxbMTUsMTddLFsxNSwxNV0sWzE0LDEzXSxbMTMsMTJdLFs5LDEwXSxbOSw3XSxbLTEsLTFdLFs5LDJdLFs4LDFdLFs5LDBdLFsxMCwxXSxbOSwyXV0gfSwKICAgICAgICAgJ0AnOiB7IHdpZHRoOiAyNywgcG9pbnRzOiBbWzE4LDEzXSxbMTcsMTVdLFsxNSwxNl0sWzEyLDE2XSxbMTAsMTVdLFs5LDE0XSxbOCwxMV0sWzgsOF0sWzksNl0sWzExLDVdLFsxNCw1XSxbMTYsNl0sWzE3LDhdLFstMSwtMV0sWzEyLDE2XSxbMTAsMTRdLFs5LDExXSxbOSw4XSxbMTAsNl0sWzExLDVdLFstMSwtMV0sWzE4LDE2XSxbMTcsOF0sWzE3LDZdLFsxOSw1XSxbMjEsNV0sWzIzLDddLFsyNCwxMF0sWzI0LDEyXSxbMjMsMTVdLFsyMiwxN10sWzIwLDE5XSxbMTgsMjBdLFsxNSwyMV0sWzEyLDIxXSxbOSwyMF0sWzcsMTldLFs1LDE3XSxbNCwxNV0sWzMsMTJdLFszLDldLFs0LDZdLFs1LDRdLFs3LDJdLFs5LDFdLFsxMiwwXSxbMTUsMF0sWzE4LDFdLFsyMCwyXSxbMjEsM10sWy0xLC0xXSxbMTksMTZdLFsxOCw4XSxbMTgsNl0sWzE5LDVdXSB9LAogICAgICAgICAnQSc6IHsgd2lkdGg6IDE4LCBwb2ludHM6IFtbOSwyMV0sWzEsMF0sWy0xLC0xXSxbOSwyMV0sWzE3LDBdLFstMSwtMV0sWzQsN10sWzE0LDddXSB9LAogICAgICAgICAnQic6IHsgd2lkdGg6IDIxLCBwb2ludHM6IFtbNCwyMV0sWzQsMF0sWy0xLC0xXSxbNCwyMV0sWzEzLDIxXSxbMTYsMjBdLFsxNywxOV0sWzE4LDE3XSxbMTgsMTVdLFsxNywxM10sWzE2LDEyXSxbMTMsMTFdLFstMSwtMV0sWzQsMTFdLFsxMywxMV0sWzE2LDEwXSxbMTcsOV0sWzE4LDddLFsxOCw0XSxbMTcsMl0sWzE2LDFdLFsxMywwXSxbNCwwXV0gfSwKICAgICAgICAgJ0MnOiB7IHdpZHRoOiAyMSwgcG9pbnRzOiBbWzE4LDE2XSxbMTcsMThdLFsxNSwyMF0sWzEzLDIxXSxbOSwyMV0sWzcsMjBdLFs1LDE4XSxbNCwxNl0sWzMsMTNdLFszLDhdLFs0LDVdLFs1LDNdLFs3LDFdLFs5LDBdLFsxMywwXSxbMTUsMV0sWzE3LDNdLFsxOCw1XV0gfSwKICAgICAgICAgJ0QnOiB7IHdpZHRoOiAyMSwgcG9pbnRzOiBbWzQsMjFdLFs0LDBdLFstMSwtMV0sWzQsMjFdLFsxMSwyMV0sWzE0LDIwXSxbMTYsMThdLFsxNywxNl0sWzE4LDEzXSxbMTgsOF0sWzE3LDVdLFsxNiwzXSxbMTQsMV0sWzExLDBdLFs0LDBdXSB9LAogICAgICAgICAnRSc6IHsgd2lkdGg6IDE5LCBwb2ludHM6IFtbNCwyMV0sWzQsMF0sWy0xLC0xXSxbNCwyMV0sWzE3LDIxXSxbLTEsLTFdLFs0LDExXSxbMTIsMTFdLFstMSwtMV0sWzQsMF0sWzE3LDBdXSB9LAogICAgICAgICAnRic6IHsgd2lkdGg6IDE4LCBwb2ludHM6IFtbNCwyMV0sWzQsMF0sWy0xLC0xXSxbNCwyMV0sWzE3LDIxXSxbLTEsLTFdLFs0LDExXSxbMTIsMTFdXSB9LAogICAgICAgICAnRyc6IHsgd2lkdGg6IDIxLCBwb2ludHM6IFtbMTgsMTZdLFsxNywxOF0sWzE1LDIwXSxbMTMsMjFdLFs5LDIxXSxbNywyMF0sWzUsMThdLFs0LDE2XSxbMywxM10sWzMsOF0sWzQsNV0sWzUsM10sWzcsMV0sWzksMF0sWzEzLDBdLFsxNSwxXSxbMTcsM10sWzE4LDVdLFsxOCw4XSxbLTEsLTFdLFsxMyw4XSxbMTgsOF1dIH0sCiAgICAgICAgICdIJzogeyB3aWR0aDogMjIsIHBvaW50czogW1s0LDIxXSxbNCwwXSxbLTEsLTFdLFsxOCwyMV0sWzE4LDBdLFstMSwtMV0sWzQsMTFdLFsxOCwxMV1dIH0sCiAgICAgICAgICdJJzogeyB3aWR0aDogOCwgcG9pbnRzOiBbWzQsMjFdLFs0LDBdXSB9LAogICAgICAgICAnSic6IHsgd2lkdGg6IDE2LCBwb2ludHM6IFtbMTIsMjFdLFsxMiw1XSxbMTEsMl0sWzEwLDFdLFs4LDBdLFs2LDBdLFs0LDFdLFszLDJdLFsyLDVdLFsyLDddXSB9LAogICAgICAgICAnSyc6IHsgd2lkdGg6IDIxLCBwb2ludHM6IFtbNCwyMV0sWzQsMF0sWy0xLC0xXSxbMTgsMjFdLFs0LDddLFstMSwtMV0sWzksMTJdLFsxOCwwXV0gfSwKICAgICAgICAgJ0wnOiB7IHdpZHRoOiAxNywgcG9pbnRzOiBbWzQsMjFdLFs0LDBdLFstMSwtMV0sWzQsMF0sWzE2LDBdXSB9LAogICAgICAgICAnTSc6IHsgd2lkdGg6IDI0LCBwb2ludHM6IFtbNCwyMV0sWzQsMF0sWy0xLC0xXSxbNCwyMV0sWzEyLDBdLFstMSwtMV0sWzIwLDIxXSxbMTIsMF0sWy0xLC0xXSxbMjAsMjFdLFsyMCwwXV0gfSwKICAgICAgICAgJ04nOiB7IHdpZHRoOiAyMiwgcG9pbnRzOiBbWzQsMjFdLFs0LDBdLFstMSwtMV0sWzQsMjFdLFsxOCwwXSxbLTEsLTFdLFsxOCwyMV0sWzE4LDBdXSB9LAogICAgICAgICAnTyc6IHsgd2lkdGg6IDIyLCBwb2ludHM6IFtbOSwyMV0sWzcsMjBdLFs1LDE4XSxbNCwxNl0sWzMsMTNdLFszLDhdLFs0LDVdLFs1LDNdLFs3LDFdLFs5LDBdLFsxMywwXSxbMTUsMV0sWzE3LDNdLFsxOCw1XSxbMTksOF0sWzE5LDEzXSxbMTgsMTZdLFsxNywxOF0sWzE1LDIwXSxbMTMsMjFdLFs5LDIxXV0gfSwKICAgICAgICAgJ1AnOiB7IHdpZHRoOiAyMSwgcG9pbnRzOiBbWzQsMjFdLFs0LDBdLFstMSwtMV0sWzQsMjFdLFsxMywyMV0sWzE2LDIwXSxbMTcsMTldLFsxOCwxN10sWzE4LDE0XSxbMTcsMTJdLFsxNiwxMV0sWzEzLDEwXSxbNCwxMF1dIH0sCiAgICAgICAgICdRJzogeyB3aWR0aDogMjIsIHBvaW50czogW1s5LDIxXSxbNywyMF0sWzUsMThdLFs0LDE2XSxbMywxM10sWzMsOF0sWzQsNV0sWzUsM10sWzcsMV0sWzksMF0sWzEzLDBdLFsxNSwxXSxbMTcsM10sWzE4LDVdLFsxOSw4XSxbMTksMTNdLFsxOCwxNl0sWzE3LDE4XSxbMTUsMjBdLFsxMywyMV0sWzksMjFdLFstMSwtMV0sWzEyLDRdLFsxOCwtMl1dIH0sCiAgICAgICAgICdSJzogeyB3aWR0aDogMjEsIHBvaW50czogW1s0LDIxXSxbNCwwXSxbLTEsLTFdLFs0LDIxXSxbMTMsMjFdLFsxNiwyMF0sWzE3LDE5XSxbMTgsMTddLFsxOCwxNV0sWzE3LDEzXSxbMTYsMTJdLFsxMywxMV0sWzQsMTFdLFstMSwtMV0sWzExLDExXSxbMTgsMF1dIH0sCiAgICAgICAgICdTJzogeyB3aWR0aDogMjAsIHBvaW50czogW1sxNywxOF0sWzE1LDIwXSxbMTIsMjFdLFs4LDIxXSxbNSwyMF0sWzMsMThdLFszLDE2XSxbNCwxNF0sWzUsMTNdLFs3LDEyXSxbMTMsMTBdLFsxNSw5XSxbMTYsOF0sWzE3LDZdLFsxNywzXSxbMTUsMV0sWzEyLDBdLFs4LDBdLFs1LDFdLFszLDNdXSB9LAogICAgICAgICAnVCc6IHsgd2lkdGg6IDE2LCBwb2ludHM6IFtbOCwyMV0sWzgsMF0sWy0xLC0xXSxbMSwyMV0sWzE1LDIxXV0gfSwKICAgICAgICAgJ1UnOiB7IHdpZHRoOiAyMiwgcG9pbnRzOiBbWzQsMjFdLFs0LDZdLFs1LDNdLFs3LDFdLFsxMCwwXSxbMTIsMF0sWzE1LDFdLFsxNywzXSxbMTgsNl0sWzE4LDIxXV0gfSwKICAgICAgICAgJ1YnOiB7IHdpZHRoOiAxOCwgcG9pbnRzOiBbWzEsMjFdLFs5LDBdLFstMSwtMV0sWzE3LDIxXSxbOSwwXV0gfSwKICAgICAgICAgJ1cnOiB7IHdpZHRoOiAyNCwgcG9pbnRzOiBbWzIsMjFdLFs3LDBdLFstMSwtMV0sWzEyLDIxXSxbNywwXSxbLTEsLTFdLFsxMiwyMV0sWzE3LDBdLFstMSwtMV0sWzIyLDIxXSxbMTcsMF1dIH0sCiAgICAgICAgICdYJzogeyB3aWR0aDogMjAsIHBvaW50czogW1szLDIxXSxbMTcsMF0sWy0xLC0xXSxbMTcsMjFdLFszLDBdXSB9LAogICAgICAgICAnWSc6IHsgd2lkdGg6IDE4LCBwb2ludHM6IFtbMSwyMV0sWzksMTFdLFs5LDBdLFstMSwtMV0sWzE3LDIxXSxbOSwxMV1dIH0sCiAgICAgICAgICdaJzogeyB3aWR0aDogMjAsIHBvaW50czogW1sxNywyMV0sWzMsMF0sWy0xLC0xXSxbMywyMV0sWzE3LDIxXSxbLTEsLTFdLFszLDBdLFsxNywwXV0gfSwKICAgICAgICAgJ1snOiB7IHdpZHRoOiAxNCwgcG9pbnRzOiBbWzQsMjVdLFs0LC03XSxbLTEsLTFdLFs1LDI1XSxbNSwtN10sWy0xLC0xXSxbNCwyNV0sWzExLDI1XSxbLTEsLTFdLFs0LC03XSxbMTEsLTddXSB9LAogICAgICAgICAnXFwnOiB7IHdpZHRoOiAxNCwgcG9pbnRzOiBbWzAsMjFdLFsxNCwtM11dIH0sCiAgICAgICAgICddJzogeyB3aWR0aDogMTQsIHBvaW50czogW1s5LDI1XSxbOSwtN10sWy0xLC0xXSxbMTAsMjVdLFsxMCwtN10sWy0xLC0xXSxbMywyNV0sWzEwLDI1XSxbLTEsLTFdLFszLC03XSxbMTAsLTddXSB9LAogICAgICAgICAnXic6IHsgd2lkdGg6IDE2LCBwb2ludHM6IFtbNiwxNV0sWzgsMThdLFsxMCwxNV0sWy0xLC0xXSxbMywxMl0sWzgsMTddLFsxMywxMl0sWy0xLC0xXSxbOCwxN10sWzgsMF1dIH0sCiAgICAgICAgICdfJzogeyB3aWR0aDogMTYsIHBvaW50czogW1swLC0yXSxbMTYsLTJdXSB9LAogICAgICAgICAnYCc6IHsgd2lkdGg6IDEwLCBwb2ludHM6IFtbNiwyMV0sWzUsMjBdLFs0LDE4XSxbNCwxNl0sWzUsMTVdLFs2LDE2XSxbNSwxN11dIH0sCiAgICAgICAgICdhJzogeyB3aWR0aDogMTksIHBvaW50czogW1sxNSwxNF0sWzE1LDBdLFstMSwtMV0sWzE1LDExXSxbMTMsMTNdLFsxMSwxNF0sWzgsMTRdLFs2LDEzXSxbNCwxMV0sWzMsOF0sWzMsNl0sWzQsM10sWzYsMV0sWzgsMF0sWzExLDBdLFsxMywxXSxbMTUsM11dIH0sCiAgICAgICAgICdiJzogeyB3aWR0aDogMTksIHBvaW50czogW1s0LDIxXSxbNCwwXSxbLTEsLTFdLFs0LDExXSxbNiwxM10sWzgsMTRdLFsxMSwxNF0sWzEzLDEzXSxbMTUsMTFdLFsxNiw4XSxbMTYsNl0sWzE1LDNdLFsxMywxXSxbMTEsMF0sWzgsMF0sWzYsMV0sWzQsM11dIH0sCiAgICAgICAgICdjJzogeyB3aWR0aDogMTgsIHBvaW50czogW1sxNSwxMV0sWzEzLDEzXSxbMTEsMTRdLFs4LDE0XSxbNiwxM10sWzQsMTFdLFszLDhdLFszLDZdLFs0LDNdLFs2LDFdLFs4LDBdLFsxMSwwXSxbMTMsMV0sWzE1LDNdXSB9LAogICAgICAgICAnZCc6IHsgd2lkdGg6IDE5LCBwb2ludHM6IFtbMTUsMjFdLFsxNSwwXSxbLTEsLTFdLFsxNSwxMV0sWzEzLDEzXSxbMTEsMTRdLFs4LDE0XSxbNiwxM10sWzQsMTFdLFszLDhdLFszLDZdLFs0LDNdLFs2LDFdLFs4LDBdLFsxMSwwXSxbMTMsMV0sWzE1LDNdXSB9LAogICAgICAgICAnZSc6IHsgd2lkdGg6IDE4LCBwb2ludHM6IFtbMyw4XSxbMTUsOF0sWzE1LDEwXSxbMTQsMTJdLFsxMywxM10sWzExLDE0XSxbOCwxNF0sWzYsMTNdLFs0LDExXSxbMyw4XSxbMyw2XSxbNCwzXSxbNiwxXSxbOCwwXSxbMTEsMF0sWzEzLDFdLFsxNSwzXV0gfSwKICAgICAgICAgJ2YnOiB7IHdpZHRoOiAxMiwgcG9pbnRzOiBbWzEwLDIxXSxbOCwyMV0sWzYsMjBdLFs1LDE3XSxbNSwwXSxbLTEsLTFdLFsyLDE0XSxbOSwxNF1dIH0sCiAgICAgICAgICdnJzogeyB3aWR0aDogMTksIHBvaW50czogW1sxNSwxNF0sWzE1LC0yXSxbMTQsLTVdLFsxMywtNl0sWzExLC03XSxbOCwtN10sWzYsLTZdLFstMSwtMV0sWzE1LDExXSxbMTMsMTNdLFsxMSwxNF0sWzgsMTRdLFs2LDEzXSxbNCwxMV0sWzMsOF0sWzMsNl0sWzQsM10sWzYsMV0sWzgsMF0sWzExLDBdLFsxMywxXSxbMTUsM11dIH0sCiAgICAgICAgICdoJzogeyB3aWR0aDogMTksIHBvaW50czogW1s0LDIxXSxbNCwwXSxbLTEsLTFdLFs0LDEwXSxbNywxM10sWzksMTRdLFsxMiwxNF0sWzE0LDEzXSxbMTUsMTBdLFsxNSwwXV0gfSwKICAgICAgICAgJ2knOiB7IHdpZHRoOiA4LCBwb2ludHM6IFtbMywyMV0sWzQsMjBdLFs1LDIxXSxbNCwyMl0sWzMsMjFdLFstMSwtMV0sWzQsMTRdLFs0LDBdXSB9LAogICAgICAgICAnaic6IHsgd2lkdGg6IDEwLCBwb2ludHM6IFtbNSwyMV0sWzYsMjBdLFs3LDIxXSxbNiwyMl0sWzUsMjFdLFstMSwtMV0sWzYsMTRdLFs2LC0zXSxbNSwtNl0sWzMsLTddLFsxLC03XV0gfSwKICAgICAgICAgJ2snOiB7IHdpZHRoOiAxNywgcG9pbnRzOiBbWzQsMjFdLFs0LDBdLFstMSwtMV0sWzE0LDE0XSxbNCw0XSxbLTEsLTFdLFs4LDhdLFsxNSwwXV0gfSwKICAgICAgICAgJ2wnOiB7IHdpZHRoOiA4LCBwb2ludHM6IFtbNCwyMV0sWzQsMF1dIH0sCiAgICAgICAgICdtJzogeyB3aWR0aDogMzAsIHBvaW50czogW1s0LDE0XSxbNCwwXSxbLTEsLTFdLFs0LDEwXSxbNywxM10sWzksMTRdLFsxMiwxNF0sWzE0LDEzXSxbMTUsMTBdLFsxNSwwXSxbLTEsLTFdLFsxNSwxMF0sWzE4LDEzXSxbMjAsMTRdLFsyMywxNF0sWzI1LDEzXSxbMjYsMTBdLFsyNiwwXV0gfSwKICAgICAgICAgJ24nOiB7IHdpZHRoOiAxOSwgcG9pbnRzOiBbWzQsMTRdLFs0LDBdLFstMSwtMV0sWzQsMTBdLFs3LDEzXSxbOSwxNF0sWzEyLDE0XSxbMTQsMTNdLFsxNSwxMF0sWzE1LDBdXSB9LAogICAgICAgICAnbyc6IHsgd2lkdGg6IDE5LCBwb2ludHM6IFtbOCwxNF0sWzYsMTNdLFs0LDExXSxbMyw4XSxbMyw2XSxbNCwzXSxbNiwxXSxbOCwwXSxbMTEsMF0sWzEzLDFdLFsxNSwzXSxbMTYsNl0sWzE2LDhdLFsxNSwxMV0sWzEzLDEzXSxbMTEsMTRdLFs4LDE0XV0gfSwKICAgICAgICAgJ3AnOiB7IHdpZHRoOiAxOSwgcG9pbnRzOiBbWzQsMTRdLFs0LC03XSxbLTEsLTFdLFs0LDExXSxbNiwxM10sWzgsMTRdLFsxMSwxNF0sWzEzLDEzXSxbMTUsMTFdLFsxNiw4XSxbMTYsNl0sWzE1LDNdLFsxMywxXSxbMTEsMF0sWzgsMF0sWzYsMV0sWzQsM11dIH0sCiAgICAgICAgICdxJzogeyB3aWR0aDogMTksIHBvaW50czogW1sxNSwxNF0sWzE1LC03XSxbLTEsLTFdLFsxNSwxMV0sWzEzLDEzXSxbMTEsMTRdLFs4LDE0XSxbNiwxM10sWzQsMTFdLFszLDhdLFszLDZdLFs0LDNdLFs2LDFdLFs4LDBdLFsxMSwwXSxbMTMsMV0sWzE1LDNdXSB9LAogICAgICAgICAncic6IHsgd2lkdGg6IDEzLCBwb2ludHM6IFtbNCwxNF0sWzQsMF0sWy0xLC0xXSxbNCw4XSxbNSwxMV0sWzcsMTNdLFs5LDE0XSxbMTIsMTRdXSB9LAogICAgICAgICAncyc6IHsgd2lkdGg6IDE3LCBwb2ludHM6IFtbMTQsMTFdLFsxMywxM10sWzEwLDE0XSxbNywxNF0sWzQsMTNdLFszLDExXSxbNCw5XSxbNiw4XSxbMTEsN10sWzEzLDZdLFsxNCw0XSxbMTQsM10sWzEzLDFdLFsxMCwwXSxbNywwXSxbNCwxXSxbMywzXV0gfSwKICAgICAgICAgJ3QnOiB7IHdpZHRoOiAxMiwgcG9pbnRzOiBbWzUsMjFdLFs1LDRdLFs2LDFdLFs4LDBdLFsxMCwwXSxbLTEsLTFdLFsyLDE0XSxbOSwxNF1dIH0sCiAgICAgICAgICd1JzogeyB3aWR0aDogMTksIHBvaW50czogW1s0LDE0XSxbNCw0XSxbNSwxXSxbNywwXSxbMTAsMF0sWzEyLDFdLFsxNSw0XSxbLTEsLTFdLFsxNSwxNF0sWzE1LDBdXSB9LAogICAgICAgICAndic6IHsgd2lkdGg6IDE2LCBwb2ludHM6IFtbMiwxNF0sWzgsMF0sWy0xLC0xXSxbMTQsMTRdLFs4LDBdXSB9LAogICAgICAgICAndyc6IHsgd2lkdGg6IDIyLCBwb2ludHM6IFtbMywxNF0sWzcsMF0sWy0xLC0xXSxbMTEsMTRdLFs3LDBdLFstMSwtMV0sWzExLDE0XSxbMTUsMF0sWy0xLC0xXSxbMTksMTRdLFsxNSwwXV0gfSwKICAgICAgICAgJ3gnOiB7IHdpZHRoOiAxNywgcG9pbnRzOiBbWzMsMTRdLFsxNCwwXSxbLTEsLTFdLFsxNCwxNF0sWzMsMF1dIH0sCiAgICAgICAgICd5JzogeyB3aWR0aDogMTYsIHBvaW50czogW1syLDE0XSxbOCwwXSxbLTEsLTFdLFsxNCwxNF0sWzgsMF0sWzYsLTRdLFs0LC02XSxbMiwtN10sWzEsLTddXSB9LAogICAgICAgICAneic6IHsgd2lkdGg6IDE3LCBwb2ludHM6IFtbMTQsMTRdLFszLDBdLFstMSwtMV0sWzMsMTRdLFsxNCwxNF0sWy0xLC0xXSxbMywwXSxbMTQsMF1dIH0sCiAgICAgICAgICd7JzogeyB3aWR0aDogMTQsIHBvaW50czogW1s5LDI1XSxbNywyNF0sWzYsMjNdLFs1LDIxXSxbNSwxOV0sWzYsMTddLFs3LDE2XSxbOCwxNF0sWzgsMTJdLFs2LDEwXSxbLTEsLTFdLFs3LDI0XSxbNiwyMl0sWzYsMjBdLFs3LDE4XSxbOCwxN10sWzksMTVdLFs5LDEzXSxbOCwxMV0sWzQsOV0sWzgsN10sWzksNV0sWzksM10sWzgsMV0sWzcsMF0sWzYsLTJdLFs2LC00XSxbNywtNl0sWy0xLC0xXSxbNiw4XSxbOCw2XSxbOCw0XSxbNywyXSxbNiwxXSxbNSwtMV0sWzUsLTNdLFs2LC01XSxbNywtNl0sWzksLTddXSB9LAogICAgICAgICAnfCc6IHsgd2lkdGg6IDgsIHBvaW50czogW1s0LDI1XSxbNCwtN11dIH0sCiAgICAgICAgICd9JzogeyB3aWR0aDogMTQsIHBvaW50czogW1s1LDI1XSxbNywyNF0sWzgsMjNdLFs5LDIxXSxbOSwxOV0sWzgsMTddLFs3LDE2XSxbNiwxNF0sWzYsMTJdLFs4LDEwXSxbLTEsLTFdLFs3LDI0XSxbOCwyMl0sWzgsMjBdLFs3LDE4XSxbNiwxN10sWzUsMTVdLFs1LDEzXSxbNiwxMV0sWzEwLDldLFs2LDddLFs1LDVdLFs1LDNdLFs2LDFdLFs3LDBdLFs4LC0yXSxbOCwtNF0sWzcsLTZdLFstMSwtMV0sWzgsOF0sWzYsNl0sWzYsNF0sWzcsMl0sWzgsMV0sWzksLTFdLFs5LC0zXSxbOCwtNV0sWzcsLTZdLFs1LC03XV0gfSwKICAgICAgICAgJ34nOiB7IHdpZHRoOiAyNCwgcG9pbnRzOiBbWzMsNl0sWzMsOF0sWzQsMTFdLFs2LDEyXSxbOCwxMl0sWzEwLDExXSxbMTQsOF0sWzE2LDddLFsxOCw3XSxbMjAsOF0sWzIxLDEwXSxbLTEsLTFdLFszLDhdLFs0LDEwXSxbNiwxMV0sWzgsMTFdLFsxMCwxMF0sWzE0LDddLFsxNiw2XSxbMTgsNl0sWzIwLDddLFsyMSwxMF0sWzIxLDEyXV0gfQogICAgIH07CiAgICAgCiAgICAkLmpxcGxvdC5DYW52YXNGb250UmVuZGVyZXIgPSBmdW5jdGlvbihvcHRpb25zKSB7CiAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307CiAgICAgICAgaWYgKCFvcHRpb25zLnB0MnB4KSB7CiAgICAgICAgICAgIG9wdGlvbnMucHQycHggPSAxLjU7CiAgICAgICAgfQogICAgICAgICQuanFwbG90LkNhbnZhc1RleHRSZW5kZXJlci5jYWxsKHRoaXMsIG9wdGlvbnMpOwogICAgfTsKICAgIAogICAgJC5qcXBsb3QuQ2FudmFzRm9udFJlbmRlcmVyLnByb3RvdHlwZSA9IG5ldyAkLmpxcGxvdC5DYW52YXNUZXh0UmVuZGVyZXIoe30pOwogICAgJC5qcXBsb3QuQ2FudmFzRm9udFJlbmRlcmVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9ICQuanFwbG90LkNhbnZhc0ZvbnRSZW5kZXJlcjsKCiAgICAkLmpxcGxvdC5DYW52YXNGb250UmVuZGVyZXIucHJvdG90eXBlLm1lYXN1cmUgPSBmdW5jdGlvbihjdHgsIHN0cikKICAgIHsKICAgICAgICAvLyB2YXIgZnN0eWxlID0gdGhpcy5mb250U3R5bGUrJyAnK3RoaXMuZm9udFZhcmlhbnQrJyAnK3RoaXMuZm9udFdlaWdodCsnICcrdGhpcy5mb250U2l6ZSsnICcrdGhpcy5mb250RmFtaWx5OwogICAgICAgIHZhciBmc3R5bGUgPSB0aGlzLmZvbnRTaXplKycgJyt0aGlzLmZvbnRGYW1pbHk7CiAgICAgICAgY3R4LnNhdmUoKTsKICAgICAgICBjdHguZm9udCA9IGZzdHlsZTsKICAgICAgICB2YXIgdyA9IGN0eC5tZWFzdXJlVGV4dChzdHIpLndpZHRoOwogICAgICAgIGN0eC5yZXN0b3JlKCk7CiAgICAgICAgcmV0dXJuIHc7CiAgICB9OwoKICAgICQuanFwbG90LkNhbnZhc0ZvbnRSZW5kZXJlci5wcm90b3R5cGUuZHJhdyA9IGZ1bmN0aW9uKGN0eCwgc3RyKQogICAgewogICAgICAgIHZhciB4ID0gMDsKICAgICAgICAvLyBsZWF2ZSByb29tIGF0IGJvdHRvbSBmb3IgZGVzY2VuZGVycy4KICAgICAgICB2YXIgeSA9IHRoaXMuaGVpZ2h0KjAuNzI7CiAgICAgICAgLy92YXIgeSA9IDEyOwoKICAgICAgICAgY3R4LnNhdmUoKTsKICAgICAgICAgdmFyIHR4LCB0eTsKICAgICAgICAgCiAgICAgICAgIC8vIDFzdCBxdWFkcmFudAogICAgICAgICBpZiAoKC1NYXRoLlBJLzIgPD0gdGhpcy5hbmdsZSAmJiB0aGlzLmFuZ2xlIDw9IDApIHx8IChNYXRoLlBJKjMvMiA8PSB0aGlzLmFuZ2xlICYmIHRoaXMuYW5nbGUgPD0gTWF0aC5QSSoyKSkgewogICAgICAgICAgICAgdHggPSAwOwogICAgICAgICAgICAgdHkgPSAtTWF0aC5zaW4odGhpcy5hbmdsZSkgKiB0aGlzLndpZHRoOwogICAgICAgICB9CiAgICAgICAgIC8vIDR0aCBxdWFkcmFudAogICAgICAgICBlbHNlIGlmICgoMCA8IHRoaXMuYW5nbGUgJiYgdGhpcy5hbmdsZSA8PSBNYXRoLlBJLzIpIHx8ICgtTWF0aC5QSSoyIDw9IHRoaXMuYW5nbGUgJiYgdGhpcy5hbmdsZSA8PSAtTWF0aC5QSSozLzIpKSB7CiAgICAgICAgICAgICB0eCA9IE1hdGguc2luKHRoaXMuYW5nbGUpICogdGhpcy5oZWlnaHQ7CiAgICAgICAgICAgICB0eSA9IDA7CiAgICAgICAgIH0KICAgICAgICAgLy8gMm5kIHF1YWRyYW50CiAgICAgICAgIGVsc2UgaWYgKCgtTWF0aC5QSSA8IHRoaXMuYW5nbGUgJiYgdGhpcy5hbmdsZSA8IC1NYXRoLlBJLzIpIHx8IChNYXRoLlBJIDw9IHRoaXMuYW5nbGUgJiYgdGhpcy5hbmdsZSA8PSBNYXRoLlBJKjMvMikpIHsKICAgICAgICAgICAgIHR4ID0gLU1hdGguY29zKHRoaXMuYW5nbGUpICogdGhpcy53aWR0aDsKICAgICAgICAgICAgIHR5ID0gLU1hdGguc2luKHRoaXMuYW5nbGUpICogdGhpcy53aWR0aCAtIE1hdGguY29zKHRoaXMuYW5nbGUpICogdGhpcy5oZWlnaHQ7CiAgICAgICAgIH0KICAgICAgICAgLy8gM3JkIHF1YWRyYW50CiAgICAgICAgIGVsc2UgaWYgKCgtTWF0aC5QSSozLzIgPCB0aGlzLmFuZ2xlICYmIHRoaXMuYW5nbGUgPCBNYXRoLlBJKSB8fCAoTWF0aC5QSS8yIDwgdGhpcy5hbmdsZSAmJiB0aGlzLmFuZ2xlIDwgTWF0aC5QSSkpIHsKICAgICAgICAgICAgIHR4ID0gTWF0aC5zaW4odGhpcy5hbmdsZSkgKiB0aGlzLmhlaWdodCAtIE1hdGguY29zKHRoaXMuYW5nbGUpKnRoaXMud2lkdGg7CiAgICAgICAgICAgICB0eSA9IC1NYXRoLmNvcyh0aGlzLmFuZ2xlKSAqIHRoaXMuaGVpZ2h0OwogICAgICAgICB9CiAgICAgICAgIGN0eC5zdHJva2VTdHlsZSA9IHRoaXMuZmlsbFN0eWxlOwogICAgICAgICBjdHguZmlsbFN0eWxlID0gdGhpcy5maWxsU3R5bGU7CiAgICAgICAgLy8gdmFyIGZzdHlsZSA9IHRoaXMuZm9udFN0eWxlKycgJyt0aGlzLmZvbnRWYXJpYW50KycgJyt0aGlzLmZvbnRXZWlnaHQrJyAnK3RoaXMuZm9udFNpemUrJyAnK3RoaXMuZm9udEZhbWlseTsKICAgICAgICB2YXIgZnN0eWxlID0gdGhpcy5mb250U2l6ZSsnICcrdGhpcy5mb250RmFtaWx5OwogICAgICAgICBjdHguZm9udCA9IGZzdHlsZTsKICAgICAgICAgY3R4LnRyYW5zbGF0ZSh0eCwgdHkpOwogICAgICAgICBjdHgucm90YXRlKHRoaXMuYW5nbGUpOwogICAgICAgICBjdHguZmlsbFRleHQoc3RyLCB4LCB5KTsKICAgICAgICAgLy8gY3R4LnN0cm9rZVRleHQoc3RyLCB4LCB5KTsKCiAgICAgICAgIGN0eC5yZXN0b3JlKCk7CiAgICB9OwogICAgCn0pKGpRdWVyeSk7]]></data>
	</file>
	<file>
	  <filename>/src/plugins/jqplot.canvasTextRenderer.min.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqCiAqIGpxUGxvdAogKiBQdXJlIEphdmFTY3JpcHQgcGxvdHRpbmcgcGx1Z2luIHVzaW5nIGpRdWVyeQogKgogKiBWZXJzaW9uOiAxLjAuMGIyX3IxMDEyCiAqCiAqIENvcHlyaWdodCAoYykgMjAwOS0yMDExIENocmlzIExlb25lbGxvCiAqIGpxUGxvdCBpcyBjdXJyZW50bHkgYXZhaWxhYmxlIGZvciB1c2UgaW4gYWxsIHBlcnNvbmFsIG9yIGNvbW1lcmNpYWwgcHJvamVjdHMgCiAqIHVuZGVyIGJvdGggdGhlIE1JVCAoaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHApIGFuZCBHUEwgCiAqIHZlcnNpb24gMi4wIChodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC5odG1sKSBsaWNlbnNlcy4gVGhpcyBtZWFucyB0aGF0IHlvdSBjYW4gCiAqIGNob29zZSB0aGUgbGljZW5zZSB0aGF0IGJlc3Qgc3VpdHMgeW91ciBwcm9qZWN0IGFuZCB1c2UgaXQgYWNjb3JkaW5nbHkuIAogKgogKiBBbHRob3VnaCBub3QgcmVxdWlyZWQsIHRoZSBhdXRob3Igd291bGQgYXBwcmVjaWF0ZSBhbiBlbWFpbCBsZXR0aW5nIGhpbSAKICoga25vdyBvZiBhbnkgc3Vic3RhbnRpYWwgdXNlIG9mIGpxUGxvdC4gIFlvdSBjYW4gcmVhY2ggdGhlIGF1dGhvciBhdDogCiAqIGNocmlzIGF0IGpxcGxvdCBkb3QgY29tIG9yIHNlZSBodHRwOi8vd3d3LmpxcGxvdC5jb20vaW5mby5waHAgLgogKgogKiBJZiB5b3UgYXJlIGZlZWxpbmcga2luZCBhbmQgZ2VuZXJvdXMsIGNvbnNpZGVyIHN1cHBvcnRpbmcgdGhlIHByb2plY3QgYnkKICogbWFraW5nIGEgZG9uYXRpb24gYXQ6IGh0dHA6Ly93d3cuanFwbG90LmNvbS9kb25hdGUucGhwIC4KICoKICogc3ByaW50ZiBmdW5jdGlvbnMgY29udGFpbmVkIGluIGpxcGxvdC5zcHJpbnRmLmpzIGJ5IEFzaCBTZWFybGU6CiAqCiAqICAgICB2ZXJzaW9uIDIwMDcuMDQuMjcKICogICAgIGF1dGhvciBBc2ggU2VhcmxlCiAqICAgICBodHRwOi8vaGV4bWVuLmNvbS9ibG9nLzIwMDcvMDMvcHJpbnRmLXNwcmludGYvCiAqICAgICBodHRwOi8vaGV4bWVuLmNvbS9qcy9zcHJpbnRmLmpzCiAqICAgICBUaGUgYXV0aG9yIChBc2ggU2VhcmxlKSBoYXMgcGxhY2VkIHRoaXMgY29kZSBpbiB0aGUgcHVibGljIGRvbWFpbjoKICogICAgICJUaGlzIGNvZGUgaXMgdW5yZXN0cmljdGVkOiB5b3UgYXJlIGZyZWUgdG8gdXNlIGl0IGhvd2V2ZXIgeW91IGxpa2UuIgogKgogKiBpbmNsdWRlZCBqc0RhdGUgbGlicmFyeSBieSBDaHJpcyBMZW9uZWxsbzoKICoKICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEgQ2hyaXMgTGVvbmVsbG8KICoKICoganNEYXRlIGlzIGN1cnJlbnRseSBhdmFpbGFibGUgZm9yIHVzZSBpbiBhbGwgcGVyc29uYWwgb3IgY29tbWVyY2lhbCBwcm9qZWN0cyAKICogdW5kZXIgYm90aCB0aGUgTUlUIGFuZCBHUEwgdmVyc2lvbiAyLjAgbGljZW5zZXMuIFRoaXMgbWVhbnMgdGhhdCB5b3UgY2FuIAogKiBjaG9vc2UgdGhlIGxpY2Vuc2UgdGhhdCBiZXN0IHN1aXRzIHlvdXIgcHJvamVjdCBhbmQgdXNlIGl0IGFjY29yZGluZ2x5LgogKgogKiBqc0RhdGUgYm9ycm93cyBtYW55IGNvbmNlcHRzIGFuZCBpZGVhcyBmcm9tIHRoZSBEYXRlIEluc3RhbmNlIAogKiBNZXRob2RzIGJ5IEtlbiBTbnlkZXIgYWxvbmcgd2l0aCBzb21lIHBhcnRzIG9mIEtlbidzIGFjdHVhbCBjb2RlLgogKiAKICogS2VuJ3Mgb3JpZ2lhbmwgRGF0ZSBJbnN0YW5jZSBNZXRob2RzIGFuZCBjb3B5cmlnaHQgbm90aWNlOgogKiAKICogS2VuIFNueWRlciAoa2VuIGQgc255ZGVyIGF0IGdtYWlsIGRvdCBjb20pCiAqIDIwMDgtMDktMTAKICogdmVyc2lvbiAyLjAuMiAoaHR0cDovL2tlbmRzbnlkZXIuY29tL3NhbmRib3gvZGF0ZS8pICAgICAKICogQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbiBMaWNlbnNlIDMuMCAoaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnkvMy4wLykKICoKICoganFwbG90VG9JbWFnZSBmdW5jdGlvbiBiYXNlZCBvbiBMYXJyeSBTaWRlbidzIGV4cG9ydC1qcXBsb3QtdG8tcG5nLmpzLgogKiBMYXJyeSBoYXMgZ2VuZXJvdXNseSBnaXZlbiBwZXJtaXNzaW9uIHRvIGFkYXB0IGhpcyBjb2RlIGZvciBpbmNsdXNpb24KICogaW50byBqcVBsb3QuCiAqCiAqIExhcnJ5J3Mgb3JpZ2luYWwgY29kZSBjYW4gYmUgZm91bmQgaGVyZToKICoKICogaHR0cHM6Ly9naXRodWIuY29tL2xzaWRlbi9leHBvcnQtanFwbG90LXRvLXBuZwogKiAKICogCiAqLwooZnVuY3Rpb24oYSl7YS5qcXBsb3QuQ2FudmFzVGV4dFJlbmRlcmVyPWZ1bmN0aW9uKGIpe3RoaXMuZm9udFN0eWxlPSJub3JtYWwiO3RoaXMuZm9udFZhcmlhbnQ9Im5vcm1hbCI7dGhpcy5mb250V2VpZ2h0PSJub3JtYWwiO3RoaXMuZm9udFNpemU9IjEwcHgiO3RoaXMuZm9udEZhbWlseT0ic2Fucy1zZXJpZiI7dGhpcy5mb250U3RyZXRjaD0xO3RoaXMuZmlsbFN0eWxlPSIjNjY2NjY2Ijt0aGlzLmFuZ2xlPTA7dGhpcy50ZXh0QWxpZ249InN0YXJ0Ijt0aGlzLnRleHRCYXNlbGluZT0iYWxwaGFiZXRpYyI7dGhpcy50ZXh0O3RoaXMud2lkdGg7dGhpcy5oZWlnaHQ7dGhpcy5wdDJweD0xLjI4O2EuZXh0ZW5kKHRydWUsdGhpcyxiKTt0aGlzLm5vcm1hbGl6ZWRGb250U2l6ZT10aGlzLm5vcm1hbGl6ZUZvbnRTaXplKHRoaXMuZm9udFNpemUpO3RoaXMuc2V0SGVpZ2h0KCl9O2EuanFwbG90LkNhbnZhc1RleHRSZW5kZXJlci5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbihiKXthLmV4dGVuZCh0cnVlLHRoaXMsYik7dGhpcy5ub3JtYWxpemVkRm9udFNpemU9dGhpcy5ub3JtYWxpemVGb250U2l6ZSh0aGlzLmZvbnRTaXplKTt0aGlzLnNldEhlaWdodCgpfTthLmpxcGxvdC5DYW52YXNUZXh0UmVuZGVyZXIucHJvdG90eXBlLm5vcm1hbGl6ZUZvbnRTaXplPWZ1bmN0aW9uKGIpe2I9U3RyaW5nKGIpO3ZhciBjPXBhcnNlRmxvYXQoYik7aWYoYi5pbmRleE9mKCJweCIpPi0xKXtyZXR1cm4gYy90aGlzLnB0MnB4fWVsc2V7aWYoYi5pbmRleE9mKCJwdCIpPi0xKXtyZXR1cm4gY31lbHNle2lmKGIuaW5kZXhPZigiZW0iKT4tMSl7cmV0dXJuIGMqMTJ9ZWxzZXtpZihiLmluZGV4T2YoIiUiKT4tMSl7cmV0dXJuIGMqMTIvMTAwfWVsc2V7cmV0dXJuIGMvdGhpcy5wdDJweH19fX19O2EuanFwbG90LkNhbnZhc1RleHRSZW5kZXJlci5wcm90b3R5cGUuZm9udFdlaWdodDJGbG9hdD1mdW5jdGlvbihiKXtpZihOdW1iZXIoYikpe3JldHVybiBiLzQwMH1lbHNle3N3aXRjaChiKXtjYXNlIm5vcm1hbCI6cmV0dXJuIDE7YnJlYWs7Y2FzZSJib2xkIjpyZXR1cm4gMS43NTticmVhaztjYXNlImJvbGRlciI6cmV0dXJuIDIuMjU7YnJlYWs7Y2FzZSJsaWdodGVyIjpyZXR1cm4gMC43NTticmVhaztkZWZhdWx0OnJldHVybiAxO2JyZWFrfX19O2EuanFwbG90LkNhbnZhc1RleHRSZW5kZXJlci5wcm90b3R5cGUuZ2V0VGV4dD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnRleHR9O2EuanFwbG90LkNhbnZhc1RleHRSZW5kZXJlci5wcm90b3R5cGUuc2V0VGV4dD1mdW5jdGlvbihjLGIpe3RoaXMudGV4dD1jO3RoaXMuc2V0V2lkdGgoYik7cmV0dXJuIHRoaXN9O2EuanFwbG90LkNhbnZhc1RleHRSZW5kZXJlci5wcm90b3R5cGUuZ2V0V2lkdGg9ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMud2lkdGh9O2EuanFwbG90LkNhbnZhc1RleHRSZW5kZXJlci5wcm90b3R5cGUuc2V0V2lkdGg9ZnVuY3Rpb24oYyxiKXtpZighYil7dGhpcy53aWR0aD10aGlzLm1lYXN1cmUoYyx0aGlzLnRleHQpfWVsc2V7dGhpcy53aWR0aD1ifXJldHVybiB0aGlzfTthLmpxcGxvdC5DYW52YXNUZXh0UmVuZGVyZXIucHJvdG90eXBlLmdldEhlaWdodD1mdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5oZWlnaHR9O2EuanFwbG90LkNhbnZhc1RleHRSZW5kZXJlci5wcm90b3R5cGUuc2V0SGVpZ2h0PWZ1bmN0aW9uKGIpe2lmKCFiKXt0aGlzLmhlaWdodD10aGlzLm5vcm1hbGl6ZWRGb250U2l6ZSp0aGlzLnB0MnB4fWVsc2V7dGhpcy5oZWlnaHQ9Yn1yZXR1cm4gdGhpc307YS5qcXBsb3QuQ2FudmFzVGV4dFJlbmRlcmVyLnByb3RvdHlwZS5sZXR0ZXI9ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMubGV0dGVyc1tiXX07YS5qcXBsb3QuQ2FudmFzVGV4dFJlbmRlcmVyLnByb3RvdHlwZS5hc2NlbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub3JtYWxpemVkRm9udFNpemV9O2EuanFwbG90LkNhbnZhc1RleHRSZW5kZXJlci5wcm90b3R5cGUuZGVzY2VudD1mdW5jdGlvbigpe3JldHVybiA3KnRoaXMubm9ybWFsaXplZEZvbnRTaXplLzI1fTthLmpxcGxvdC5DYW52YXNUZXh0UmVuZGVyZXIucHJvdG90eXBlLm1lYXN1cmU9ZnVuY3Rpb24oZCxnKXt2YXIgZj0wO3ZhciBiPWcubGVuZ3RoO2Zvcih2YXIgZT0wO2U8YjtlKyspe3ZhciBoPXRoaXMubGV0dGVyKGcuY2hhckF0KGUpKTtpZihoKXtmKz1oLndpZHRoKnRoaXMubm9ybWFsaXplZEZvbnRTaXplLzI1KnRoaXMuZm9udFN0cmV0Y2h9fXJldHVybiBmfTthLmpxcGxvdC5DYW52YXNUZXh0UmVuZGVyZXIucHJvdG90eXBlLmRyYXc9ZnVuY3Rpb24ocyxuKXt2YXIgcj0wO3ZhciBvPXRoaXMuaGVpZ2h0KjAuNzI7dmFyIHA9MDt2YXIgbD1uLmxlbmd0aDt2YXIgaz10aGlzLm5vcm1hbGl6ZWRGb250U2l6ZS8yNTtzLnNhdmUoKTt2YXIgaCxmO2lmKCgtTWF0aC5QSS8yPD10aGlzLmFuZ2xlJiZ0aGlzLmFuZ2xlPD0wKXx8KE1hdGguUEkqMy8yPD10aGlzLmFuZ2xlJiZ0aGlzLmFuZ2xlPD1NYXRoLlBJKjIpKXtoPTA7Zj0tTWF0aC5zaW4odGhpcy5hbmdsZSkqdGhpcy53aWR0aH1lbHNle2lmKCgwPHRoaXMuYW5nbGUmJnRoaXMuYW5nbGU8PU1hdGguUEkvMil8fCgtTWF0aC5QSSoyPD10aGlzLmFuZ2xlJiZ0aGlzLmFuZ2xlPD0tTWF0aC5QSSozLzIpKXtoPU1hdGguc2luKHRoaXMuYW5nbGUpKnRoaXMuaGVpZ2h0O2Y9MH1lbHNle2lmKCgtTWF0aC5QSTx0aGlzLmFuZ2xlJiZ0aGlzLmFuZ2xlPC1NYXRoLlBJLzIpfHwoTWF0aC5QSTw9dGhpcy5hbmdsZSYmdGhpcy5hbmdsZTw9TWF0aC5QSSozLzIpKXtoPS1NYXRoLmNvcyh0aGlzLmFuZ2xlKSp0aGlzLndpZHRoO2Y9LU1hdGguc2luKHRoaXMuYW5nbGUpKnRoaXMud2lkdGgtTWF0aC5jb3ModGhpcy5hbmdsZSkqdGhpcy5oZWlnaHR9ZWxzZXtpZigoLU1hdGguUEkqMy8yPHRoaXMuYW5nbGUmJnRoaXMuYW5nbGU8TWF0aC5QSSl8fChNYXRoLlBJLzI8dGhpcy5hbmdsZSYmdGhpcy5hbmdsZTxNYXRoLlBJKSl7aD1NYXRoLnNpbih0aGlzLmFuZ2xlKSp0aGlzLmhlaWdodC1NYXRoLmNvcyh0aGlzLmFuZ2xlKSp0aGlzLndpZHRoO2Y9LU1hdGguY29zKHRoaXMuYW5nbGUpKnRoaXMuaGVpZ2h0fX19fXMuc3Ryb2tlU3R5bGU9dGhpcy5maWxsU3R5bGU7cy5maWxsU3R5bGU9dGhpcy5maWxsU3R5bGU7cy50cmFuc2xhdGUoaCxmKTtzLnJvdGF0ZSh0aGlzLmFuZ2xlKTtzLmxpbmVDYXA9InJvdW5kIjt2YXIgdD0odGhpcy5ub3JtYWxpemVkRm9udFNpemU+MzApPzI6MisoMzAtdGhpcy5ub3JtYWxpemVkRm9udFNpemUpLzIwO3MubGluZVdpZHRoPXQqayp0aGlzLmZvbnRXZWlnaHQyRmxvYXQodGhpcy5mb250V2VpZ2h0KTtmb3IodmFyIGc9MDtnPGw7ZysrKXt2YXIgbT10aGlzLmxldHRlcihuLmNoYXJBdChnKSk7aWYoIW0pe2NvbnRpbnVlfXMuYmVnaW5QYXRoKCk7dmFyIGU9MTt2YXIgYj0wO2Zvcih2YXIgZD0wO2Q8bS5wb2ludHMubGVuZ3RoO2QrKyl7dmFyIHE9bS5wb2ludHNbZF07aWYocVswXT09LTEmJnFbMV09PS0xKXtlPTE7Y29udGludWV9aWYoZSl7cy5tb3ZlVG8ocitxWzBdKmsqdGhpcy5mb250U3RyZXRjaCxvLXFbMV0qayk7ZT1mYWxzZX1lbHNle3MubGluZVRvKHIrcVswXSprKnRoaXMuZm9udFN0cmV0Y2gsby1xWzFdKmspfX1zLnN0cm9rZSgpO3IrPW0ud2lkdGgqayp0aGlzLmZvbnRTdHJldGNofXMucmVzdG9yZSgpO3JldHVybiBwfTthLmpxcGxvdC5DYW52YXNUZXh0UmVuZGVyZXIucHJvdG90eXBlLmxldHRlcnM9eyIgIjp7d2lkdGg6MTYscG9pbnRzOltdfSwiISI6e3dpZHRoOjEwLHBvaW50czpbWzUsMjFdLFs1LDddLFstMSwtMV0sWzUsMl0sWzQsMV0sWzUsMF0sWzYsMV0sWzUsMl1dfSwnIic6e3dpZHRoOjE2LHBvaW50czpbWzQsMjFdLFs0LDE0XSxbLTEsLTFdLFsxMiwyMV0sWzEyLDE0XV19LCIjIjp7d2lkdGg6MjEscG9pbnRzOltbMTEsMjVdLFs0LC03XSxbLTEsLTFdLFsxNywyNV0sWzEwLC03XSxbLTEsLTFdLFs0LDEyXSxbMTgsMTJdLFstMSwtMV0sWzMsNl0sWzE3LDZdXX0sIiQiOnt3aWR0aDoyMCxwb2ludHM6W1s4LDI1XSxbOCwtNF0sWy0xLC0xXSxbMTIsMjVdLFsxMiwtNF0sWy0xLC0xXSxbMTcsMThdLFsxNSwyMF0sWzEyLDIxXSxbOCwyMV0sWzUsMjBdLFszLDE4XSxbMywxNl0sWzQsMTRdLFs1LDEzXSxbNywxMl0sWzEzLDEwXSxbMTUsOV0sWzE2LDhdLFsxNyw2XSxbMTcsM10sWzE1LDFdLFsxMiwwXSxbOCwwXSxbNSwxXSxbMywzXV19LCIlIjp7d2lkdGg6MjQscG9pbnRzOltbMjEsMjFdLFszLDBdLFstMSwtMV0sWzgsMjFdLFsxMCwxOV0sWzEwLDE3XSxbOSwxNV0sWzcsMTRdLFs1LDE0XSxbMywxNl0sWzMsMThdLFs0LDIwXSxbNiwyMV0sWzgsMjFdLFsxMCwyMF0sWzEzLDE5XSxbMTYsMTldLFsxOSwyMF0sWzIxLDIxXSxbLTEsLTFdLFsxNyw3XSxbMTUsNl0sWzE0LDRdLFsxNCwyXSxbMTYsMF0sWzE4LDBdLFsyMCwxXSxbMjEsM10sWzIxLDVdLFsxOSw3XSxbMTcsN11dfSwiJiI6e3dpZHRoOjI2LHBvaW50czpbWzIzLDEyXSxbMjMsMTNdLFsyMiwxNF0sWzIxLDE0XSxbMjAsMTNdLFsxOSwxMV0sWzE3LDZdLFsxNSwzXSxbMTMsMV0sWzExLDBdLFs3LDBdLFs1LDFdLFs0LDJdLFszLDRdLFszLDZdLFs0LDhdLFs1LDldLFsxMiwxM10sWzEzLDE0XSxbMTQsMTZdLFsxNCwxOF0sWzEzLDIwXSxbMTEsMjFdLFs5LDIwXSxbOCwxOF0sWzgsMTZdLFs5LDEzXSxbMTEsMTBdLFsxNiwzXSxbMTgsMV0sWzIwLDBdLFsyMiwwXSxbMjMsMV0sWzIzLDJdXX0sIiciOnt3aWR0aDoxMCxwb2ludHM6W1s1LDE5XSxbNCwyMF0sWzUsMjFdLFs2LDIwXSxbNiwxOF0sWzUsMTZdLFs0LDE1XV19LCIoIjp7d2lkdGg6MTQscG9pbnRzOltbMTEsMjVdLFs5LDIzXSxbNywyMF0sWzUsMTZdLFs0LDExXSxbNCw3XSxbNSwyXSxbNywtMl0sWzksLTVdLFsxMSwtN11dfSwiKSI6e3dpZHRoOjE0LHBvaW50czpbWzMsMjVdLFs1LDIzXSxbNywyMF0sWzksMTZdLFsxMCwxMV0sWzEwLDddLFs5LDJdLFs3LC0yXSxbNSwtNV0sWzMsLTddXX0sIioiOnt3aWR0aDoxNixwb2ludHM6W1s4LDIxXSxbOCw5XSxbLTEsLTFdLFszLDE4XSxbMTMsMTJdLFstMSwtMV0sWzEzLDE4XSxbMywxMl1dfSwiKyI6e3dpZHRoOjI2LHBvaW50czpbWzEzLDE4XSxbMTMsMF0sWy0xLC0xXSxbNCw5XSxbMjIsOV1dfSwiLCI6e3dpZHRoOjEwLHBvaW50czpbWzYsMV0sWzUsMF0sWzQsMV0sWzUsMl0sWzYsMV0sWzYsLTFdLFs1LC0zXSxbNCwtNF1dfSwiLSI6e3dpZHRoOjE4LHBvaW50czpbWzYsOV0sWzEyLDldXX0sIi4iOnt3aWR0aDoxMCxwb2ludHM6W1s1LDJdLFs0LDFdLFs1LDBdLFs2LDFdLFs1LDJdXX0sIi8iOnt3aWR0aDoyMixwb2ludHM6W1syMCwyNV0sWzIsLTddXX0sIjAiOnt3aWR0aDoyMCxwb2ludHM6W1s5LDIxXSxbNiwyMF0sWzQsMTddLFszLDEyXSxbMyw5XSxbNCw0XSxbNiwxXSxbOSwwXSxbMTEsMF0sWzE0LDFdLFsxNiw0XSxbMTcsOV0sWzE3LDEyXSxbMTYsMTddLFsxNCwyMF0sWzExLDIxXSxbOSwyMV1dfSwiMSI6e3dpZHRoOjIwLHBvaW50czpbWzYsMTddLFs4LDE4XSxbMTEsMjFdLFsxMSwwXV19LCIyIjp7d2lkdGg6MjAscG9pbnRzOltbNCwxNl0sWzQsMTddLFs1LDE5XSxbNiwyMF0sWzgsMjFdLFsxMiwyMV0sWzE0LDIwXSxbMTUsMTldLFsxNiwxN10sWzE2LDE1XSxbMTUsMTNdLFsxMywxMF0sWzMsMF0sWzE3LDBdXX0sIjMiOnt3aWR0aDoyMCxwb2ludHM6W1s1LDIxXSxbMTYsMjFdLFsxMCwxM10sWzEzLDEzXSxbMTUsMTJdLFsxNiwxMV0sWzE3LDhdLFsxNyw2XSxbMTYsM10sWzE0LDFdLFsxMSwwXSxbOCwwXSxbNSwxXSxbNCwyXSxbMyw0XV19LCI0Ijp7d2lkdGg6MjAscG9pbnRzOltbMTMsMjFdLFszLDddLFsxOCw3XSxbLTEsLTFdLFsxMywyMV0sWzEzLDBdXX0sIjUiOnt3aWR0aDoyMCxwb2ludHM6W1sxNSwyMV0sWzUsMjFdLFs0LDEyXSxbNSwxM10sWzgsMTRdLFsxMSwxNF0sWzE0LDEzXSxbMTYsMTFdLFsxNyw4XSxbMTcsNl0sWzE2LDNdLFsxNCwxXSxbMTEsMF0sWzgsMF0sWzUsMV0sWzQsMl0sWzMsNF1dfSwiNiI6e3dpZHRoOjIwLHBvaW50czpbWzE2LDE4XSxbMTUsMjBdLFsxMiwyMV0sWzEwLDIxXSxbNywyMF0sWzUsMTddLFs0LDEyXSxbNCw3XSxbNSwzXSxbNywxXSxbMTAsMF0sWzExLDBdLFsxNCwxXSxbMTYsM10sWzE3LDZdLFsxNyw3XSxbMTYsMTBdLFsxNCwxMl0sWzExLDEzXSxbMTAsMTNdLFs3LDEyXSxbNSwxMF0sWzQsN11dfSwiNyI6e3dpZHRoOjIwLHBvaW50czpbWzE3LDIxXSxbNywwXSxbLTEsLTFdLFszLDIxXSxbMTcsMjFdXX0sIjgiOnt3aWR0aDoyMCxwb2ludHM6W1s4LDIxXSxbNSwyMF0sWzQsMThdLFs0LDE2XSxbNSwxNF0sWzcsMTNdLFsxMSwxMl0sWzE0LDExXSxbMTYsOV0sWzE3LDddLFsxNyw0XSxbMTYsMl0sWzE1LDFdLFsxMiwwXSxbOCwwXSxbNSwxXSxbNCwyXSxbMyw0XSxbMyw3XSxbNCw5XSxbNiwxMV0sWzksMTJdLFsxMywxM10sWzE1LDE0XSxbMTYsMTZdLFsxNiwxOF0sWzE1LDIwXSxbMTIsMjFdLFs4LDIxXV19LCI5Ijp7d2lkdGg6MjAscG9pbnRzOltbMTYsMTRdLFsxNSwxMV0sWzEzLDldLFsxMCw4XSxbOSw4XSxbNiw5XSxbNCwxMV0sWzMsMTRdLFszLDE1XSxbNCwxOF0sWzYsMjBdLFs5LDIxXSxbMTAsMjFdLFsxMywyMF0sWzE1LDE4XSxbMTYsMTRdLFsxNiw5XSxbMTUsNF0sWzEzLDFdLFsxMCwwXSxbOCwwXSxbNSwxXSxbNCwzXV19LCI6Ijp7d2lkdGg6MTAscG9pbnRzOltbNSwxNF0sWzQsMTNdLFs1LDEyXSxbNiwxM10sWzUsMTRdLFstMSwtMV0sWzUsMl0sWzQsMV0sWzUsMF0sWzYsMV0sWzUsMl1dfSwiOyI6e3dpZHRoOjEwLHBvaW50czpbWzUsMTRdLFs0LDEzXSxbNSwxMl0sWzYsMTNdLFs1LDE0XSxbLTEsLTFdLFs2LDFdLFs1LDBdLFs0LDFdLFs1LDJdLFs2LDFdLFs2LC0xXSxbNSwtM10sWzQsLTRdXX0sIjwiOnt3aWR0aDoyNCxwb2ludHM6W1syMCwxOF0sWzQsOV0sWzIwLDBdXX0sIj0iOnt3aWR0aDoyNixwb2ludHM6W1s0LDEyXSxbMjIsMTJdLFstMSwtMV0sWzQsNl0sWzIyLDZdXX0sIj4iOnt3aWR0aDoyNCxwb2ludHM6W1s0LDE4XSxbMjAsOV0sWzQsMF1dfSwiPyI6e3dpZHRoOjE4LHBvaW50czpbWzMsMTZdLFszLDE3XSxbNCwxOV0sWzUsMjBdLFs3LDIxXSxbMTEsMjFdLFsxMywyMF0sWzE0LDE5XSxbMTUsMTddLFsxNSwxNV0sWzE0LDEzXSxbMTMsMTJdLFs5LDEwXSxbOSw3XSxbLTEsLTFdLFs5LDJdLFs4LDFdLFs5LDBdLFsxMCwxXSxbOSwyXV19LCJAIjp7d2lkdGg6MjcscG9pbnRzOltbMTgsMTNdLFsxNywxNV0sWzE1LDE2XSxbMTIsMTZdLFsxMCwxNV0sWzksMTRdLFs4LDExXSxbOCw4XSxbOSw2XSxbMTEsNV0sWzE0LDVdLFsxNiw2XSxbMTcsOF0sWy0xLC0xXSxbMTIsMTZdLFsxMCwxNF0sWzksMTFdLFs5LDhdLFsxMCw2XSxbMTEsNV0sWy0xLC0xXSxbMTgsMTZdLFsxNyw4XSxbMTcsNl0sWzE5LDVdLFsyMSw1XSxbMjMsN10sWzI0LDEwXSxbMjQsMTJdLFsyMywxNV0sWzIyLDE3XSxbMjAsMTldLFsxOCwyMF0sWzE1LDIxXSxbMTIsMjFdLFs5LDIwXSxbNywxOV0sWzUsMTddLFs0LDE1XSxbMywxMl0sWzMsOV0sWzQsNl0sWzUsNF0sWzcsMl0sWzksMV0sWzEyLDBdLFsxNSwwXSxbMTgsMV0sWzIwLDJdLFsyMSwzXSxbLTEsLTFdLFsxOSwxNl0sWzE4LDhdLFsxOCw2XSxbMTksNV1dfSxBOnt3aWR0aDoxOCxwb2ludHM6W1s5LDIxXSxbMSwwXSxbLTEsLTFdLFs5LDIxXSxbMTcsMF0sWy0xLC0xXSxbNCw3XSxbMTQsN11dfSxCOnt3aWR0aDoyMSxwb2ludHM6W1s0LDIxXSxbNCwwXSxbLTEsLTFdLFs0LDIxXSxbMTMsMjFdLFsxNiwyMF0sWzE3LDE5XSxbMTgsMTddLFsxOCwxNV0sWzE3LDEzXSxbMTYsMTJdLFsxMywxMV0sWy0xLC0xXSxbNCwxMV0sWzEzLDExXSxbMTYsMTBdLFsxNyw5XSxbMTgsN10sWzE4LDRdLFsxNywyXSxbMTYsMV0sWzEzLDBdLFs0LDBdXX0sQzp7d2lkdGg6MjEscG9pbnRzOltbMTgsMTZdLFsxNywxOF0sWzE1LDIwXSxbMTMsMjFdLFs5LDIxXSxbNywyMF0sWzUsMThdLFs0LDE2XSxbMywxM10sWzMsOF0sWzQsNV0sWzUsM10sWzcsMV0sWzksMF0sWzEzLDBdLFsxNSwxXSxbMTcsM10sWzE4LDVdXX0sRDp7d2lkdGg6MjEscG9pbnRzOltbNCwyMV0sWzQsMF0sWy0xLC0xXSxbNCwyMV0sWzExLDIxXSxbMTQsMjBdLFsxNiwxOF0sWzE3LDE2XSxbMTgsMTNdLFsxOCw4XSxbMTcsNV0sWzE2LDNdLFsxNCwxXSxbMTEsMF0sWzQsMF1dfSxFOnt3aWR0aDoxOSxwb2ludHM6W1s0LDIxXSxbNCwwXSxbLTEsLTFdLFs0LDIxXSxbMTcsMjFdLFstMSwtMV0sWzQsMTFdLFsxMiwxMV0sWy0xLC0xXSxbNCwwXSxbMTcsMF1dfSxGOnt3aWR0aDoxOCxwb2ludHM6W1s0LDIxXSxbNCwwXSxbLTEsLTFdLFs0LDIxXSxbMTcsMjFdLFstMSwtMV0sWzQsMTFdLFsxMiwxMV1dfSxHOnt3aWR0aDoyMSxwb2ludHM6W1sxOCwxNl0sWzE3LDE4XSxbMTUsMjBdLFsxMywyMV0sWzksMjFdLFs3LDIwXSxbNSwxOF0sWzQsMTZdLFszLDEzXSxbMyw4XSxbNCw1XSxbNSwzXSxbNywxXSxbOSwwXSxbMTMsMF0sWzE1LDFdLFsxNywzXSxbMTgsNV0sWzE4LDhdLFstMSwtMV0sWzEzLDhdLFsxOCw4XV19LEg6e3dpZHRoOjIyLHBvaW50czpbWzQsMjFdLFs0LDBdLFstMSwtMV0sWzE4LDIxXSxbMTgsMF0sWy0xLC0xXSxbNCwxMV0sWzE4LDExXV19LEk6e3dpZHRoOjgscG9pbnRzOltbNCwyMV0sWzQsMF1dfSxKOnt3aWR0aDoxNixwb2ludHM6W1sxMiwyMV0sWzEyLDVdLFsxMSwyXSxbMTAsMV0sWzgsMF0sWzYsMF0sWzQsMV0sWzMsMl0sWzIsNV0sWzIsN11dfSxLOnt3aWR0aDoyMSxwb2ludHM6W1s0LDIxXSxbNCwwXSxbLTEsLTFdLFsxOCwyMV0sWzQsN10sWy0xLC0xXSxbOSwxMl0sWzE4LDBdXX0sTDp7d2lkdGg6MTcscG9pbnRzOltbNCwyMV0sWzQsMF0sWy0xLC0xXSxbNCwwXSxbMTYsMF1dfSxNOnt3aWR0aDoyNCxwb2ludHM6W1s0LDIxXSxbNCwwXSxbLTEsLTFdLFs0LDIxXSxbMTIsMF0sWy0xLC0xXSxbMjAsMjFdLFsxMiwwXSxbLTEsLTFdLFsyMCwyMV0sWzIwLDBdXX0sTjp7d2lkdGg6MjIscG9pbnRzOltbNCwyMV0sWzQsMF0sWy0xLC0xXSxbNCwyMV0sWzE4LDBdLFstMSwtMV0sWzE4LDIxXSxbMTgsMF1dfSxPOnt3aWR0aDoyMixwb2ludHM6W1s5LDIxXSxbNywyMF0sWzUsMThdLFs0LDE2XSxbMywxM10sWzMsOF0sWzQsNV0sWzUsM10sWzcsMV0sWzksMF0sWzEzLDBdLFsxNSwxXSxbMTcsM10sWzE4LDVdLFsxOSw4XSxbMTksMTNdLFsxOCwxNl0sWzE3LDE4XSxbMTUsMjBdLFsxMywyMV0sWzksMjFdXX0sUDp7d2lkdGg6MjEscG9pbnRzOltbNCwyMV0sWzQsMF0sWy0xLC0xXSxbNCwyMV0sWzEzLDIxXSxbMTYsMjBdLFsxNywxOV0sWzE4LDE3XSxbMTgsMTRdLFsxNywxMl0sWzE2LDExXSxbMTMsMTBdLFs0LDEwXV19LFE6e3dpZHRoOjIyLHBvaW50czpbWzksMjFdLFs3LDIwXSxbNSwxOF0sWzQsMTZdLFszLDEzXSxbMyw4XSxbNCw1XSxbNSwzXSxbNywxXSxbOSwwXSxbMTMsMF0sWzE1LDFdLFsxNywzXSxbMTgsNV0sWzE5LDhdLFsxOSwxM10sWzE4LDE2XSxbMTcsMThdLFsxNSwyMF0sWzEzLDIxXSxbOSwyMV0sWy0xLC0xXSxbMTIsNF0sWzE4LC0yXV19LFI6e3dpZHRoOjIxLHBvaW50czpbWzQsMjFdLFs0LDBdLFstMSwtMV0sWzQsMjFdLFsxMywyMV0sWzE2LDIwXSxbMTcsMTldLFsxOCwxN10sWzE4LDE1XSxbMTcsMTNdLFsxNiwxMl0sWzEzLDExXSxbNCwxMV0sWy0xLC0xXSxbMTEsMTFdLFsxOCwwXV19LFM6e3dpZHRoOjIwLHBvaW50czpbWzE3LDE4XSxbMTUsMjBdLFsxMiwyMV0sWzgsMjFdLFs1LDIwXSxbMywxOF0sWzMsMTZdLFs0LDE0XSxbNSwxM10sWzcsMTJdLFsxMywxMF0sWzE1LDldLFsxNiw4XSxbMTcsNl0sWzE3LDNdLFsxNSwxXSxbMTIsMF0sWzgsMF0sWzUsMV0sWzMsM11dfSxUOnt3aWR0aDoxNixwb2ludHM6W1s4LDIxXSxbOCwwXSxbLTEsLTFdLFsxLDIxXSxbMTUsMjFdXX0sVTp7d2lkdGg6MjIscG9pbnRzOltbNCwyMV0sWzQsNl0sWzUsM10sWzcsMV0sWzEwLDBdLFsxMiwwXSxbMTUsMV0sWzE3LDNdLFsxOCw2XSxbMTgsMjFdXX0sVjp7d2lkdGg6MTgscG9pbnRzOltbMSwyMV0sWzksMF0sWy0xLC0xXSxbMTcsMjFdLFs5LDBdXX0sVzp7d2lkdGg6MjQscG9pbnRzOltbMiwyMV0sWzcsMF0sWy0xLC0xXSxbMTIsMjFdLFs3LDBdLFstMSwtMV0sWzEyLDIxXSxbMTcsMF0sWy0xLC0xXSxbMjIsMjFdLFsxNywwXV19LFg6e3dpZHRoOjIwLHBvaW50czpbWzMsMjFdLFsxNywwXSxbLTEsLTFdLFsxNywyMV0sWzMsMF1dfSxZOnt3aWR0aDoxOCxwb2ludHM6W1sxLDIxXSxbOSwxMV0sWzksMF0sWy0xLC0xXSxbMTcsMjFdLFs5LDExXV19LFo6e3dpZHRoOjIwLHBvaW50czpbWzE3LDIxXSxbMywwXSxbLTEsLTFdLFszLDIxXSxbMTcsMjFdLFstMSwtMV0sWzMsMF0sWzE3LDBdXX0sIlsiOnt3aWR0aDoxNCxwb2ludHM6W1s0LDI1XSxbNCwtN10sWy0xLC0xXSxbNSwyNV0sWzUsLTddLFstMSwtMV0sWzQsMjVdLFsxMSwyNV0sWy0xLC0xXSxbNCwtN10sWzExLC03XV19LCJcXCI6e3dpZHRoOjE0LHBvaW50czpbWzAsMjFdLFsxNCwtM11dfSwiXSI6e3dpZHRoOjE0LHBvaW50czpbWzksMjVdLFs5LC03XSxbLTEsLTFdLFsxMCwyNV0sWzEwLC03XSxbLTEsLTFdLFszLDI1XSxbMTAsMjVdLFstMSwtMV0sWzMsLTddLFsxMCwtN11dfSwiXiI6e3dpZHRoOjE2LHBvaW50czpbWzYsMTVdLFs4LDE4XSxbMTAsMTVdLFstMSwtMV0sWzMsMTJdLFs4LDE3XSxbMTMsMTJdLFstMSwtMV0sWzgsMTddLFs4LDBdXX0sXzp7d2lkdGg6MTYscG9pbnRzOltbMCwtMl0sWzE2LC0yXV19LCJgIjp7d2lkdGg6MTAscG9pbnRzOltbNiwyMV0sWzUsMjBdLFs0LDE4XSxbNCwxNl0sWzUsMTVdLFs2LDE2XSxbNSwxN11dfSxhOnt3aWR0aDoxOSxwb2ludHM6W1sxNSwxNF0sWzE1LDBdLFstMSwtMV0sWzE1LDExXSxbMTMsMTNdLFsxMSwxNF0sWzgsMTRdLFs2LDEzXSxbNCwxMV0sWzMsOF0sWzMsNl0sWzQsM10sWzYsMV0sWzgsMF0sWzExLDBdLFsxMywxXSxbMTUsM11dfSxiOnt3aWR0aDoxOSxwb2ludHM6W1s0LDIxXSxbNCwwXSxbLTEsLTFdLFs0LDExXSxbNiwxM10sWzgsMTRdLFsxMSwxNF0sWzEzLDEzXSxbMTUsMTFdLFsxNiw4XSxbMTYsNl0sWzE1LDNdLFsxMywxXSxbMTEsMF0sWzgsMF0sWzYsMV0sWzQsM11dfSxjOnt3aWR0aDoxOCxwb2ludHM6W1sxNSwxMV0sWzEzLDEzXSxbMTEsMTRdLFs4LDE0XSxbNiwxM10sWzQsMTFdLFszLDhdLFszLDZdLFs0LDNdLFs2LDFdLFs4LDBdLFsxMSwwXSxbMTMsMV0sWzE1LDNdXX0sZDp7d2lkdGg6MTkscG9pbnRzOltbMTUsMjFdLFsxNSwwXSxbLTEsLTFdLFsxNSwxMV0sWzEzLDEzXSxbMTEsMTRdLFs4LDE0XSxbNiwxM10sWzQsMTFdLFszLDhdLFszLDZdLFs0LDNdLFs2LDFdLFs4LDBdLFsxMSwwXSxbMTMsMV0sWzE1LDNdXX0sZTp7d2lkdGg6MTgscG9pbnRzOltbMyw4XSxbMTUsOF0sWzE1LDEwXSxbMTQsMTJdLFsxMywxM10sWzExLDE0XSxbOCwxNF0sWzYsMTNdLFs0LDExXSxbMyw4XSxbMyw2XSxbNCwzXSxbNiwxXSxbOCwwXSxbMTEsMF0sWzEzLDFdLFsxNSwzXV19LGY6e3dpZHRoOjEyLHBvaW50czpbWzEwLDIxXSxbOCwyMV0sWzYsMjBdLFs1LDE3XSxbNSwwXSxbLTEsLTFdLFsyLDE0XSxbOSwxNF1dfSxnOnt3aWR0aDoxOSxwb2ludHM6W1sxNSwxNF0sWzE1LC0yXSxbMTQsLTVdLFsxMywtNl0sWzExLC03XSxbOCwtN10sWzYsLTZdLFstMSwtMV0sWzE1LDExXSxbMTMsMTNdLFsxMSwxNF0sWzgsMTRdLFs2LDEzXSxbNCwxMV0sWzMsOF0sWzMsNl0sWzQsM10sWzYsMV0sWzgsMF0sWzExLDBdLFsxMywxXSxbMTUsM11dfSxoOnt3aWR0aDoxOSxwb2ludHM6W1s0LDIxXSxbNCwwXSxbLTEsLTFdLFs0LDEwXSxbNywxM10sWzksMTRdLFsxMiwxNF0sWzE0LDEzXSxbMTUsMTBdLFsxNSwwXV19LGk6e3dpZHRoOjgscG9pbnRzOltbMywyMV0sWzQsMjBdLFs1LDIxXSxbNCwyMl0sWzMsMjFdLFstMSwtMV0sWzQsMTRdLFs0LDBdXX0sajp7d2lkdGg6MTAscG9pbnRzOltbNSwyMV0sWzYsMjBdLFs3LDIxXSxbNiwyMl0sWzUsMjFdLFstMSwtMV0sWzYsMTRdLFs2LC0zXSxbNSwtNl0sWzMsLTddLFsxLC03XV19LGs6e3dpZHRoOjE3LHBvaW50czpbWzQsMjFdLFs0LDBdLFstMSwtMV0sWzE0LDE0XSxbNCw0XSxbLTEsLTFdLFs4LDhdLFsxNSwwXV19LGw6e3dpZHRoOjgscG9pbnRzOltbNCwyMV0sWzQsMF1dfSxtOnt3aWR0aDozMCxwb2ludHM6W1s0LDE0XSxbNCwwXSxbLTEsLTFdLFs0LDEwXSxbNywxM10sWzksMTRdLFsxMiwxNF0sWzE0LDEzXSxbMTUsMTBdLFsxNSwwXSxbLTEsLTFdLFsxNSwxMF0sWzE4LDEzXSxbMjAsMTRdLFsyMywxNF0sWzI1LDEzXSxbMjYsMTBdLFsyNiwwXV19LG46e3dpZHRoOjE5LHBvaW50czpbWzQsMTRdLFs0LDBdLFstMSwtMV0sWzQsMTBdLFs3LDEzXSxbOSwxNF0sWzEyLDE0XSxbMTQsMTNdLFsxNSwxMF0sWzE1LDBdXX0sbzp7d2lkdGg6MTkscG9pbnRzOltbOCwxNF0sWzYsMTNdLFs0LDExXSxbMyw4XSxbMyw2XSxbNCwzXSxbNiwxXSxbOCwwXSxbMTEsMF0sWzEzLDFdLFsxNSwzXSxbMTYsNl0sWzE2LDhdLFsxNSwxMV0sWzEzLDEzXSxbMTEsMTRdLFs4LDE0XV19LHA6e3dpZHRoOjE5LHBvaW50czpbWzQsMTRdLFs0LC03XSxbLTEsLTFdLFs0LDExXSxbNiwxM10sWzgsMTRdLFsxMSwxNF0sWzEzLDEzXSxbMTUsMTFdLFsxNiw4XSxbMTYsNl0sWzE1LDNdLFsxMywxXSxbMTEsMF0sWzgsMF0sWzYsMV0sWzQsM11dfSxxOnt3aWR0aDoxOSxwb2ludHM6W1sxNSwxNF0sWzE1LC03XSxbLTEsLTFdLFsxNSwxMV0sWzEzLDEzXSxbMTEsMTRdLFs4LDE0XSxbNiwxM10sWzQsMTFdLFszLDhdLFszLDZdLFs0LDNdLFs2LDFdLFs4LDBdLFsxMSwwXSxbMTMsMV0sWzE1LDNdXX0scjp7d2lkdGg6MTMscG9pbnRzOltbNCwxNF0sWzQsMF0sWy0xLC0xXSxbNCw4XSxbNSwxMV0sWzcsMTNdLFs5LDE0XSxbMTIsMTRdXX0sczp7d2lkdGg6MTcscG9pbnRzOltbMTQsMTFdLFsxMywxM10sWzEwLDE0XSxbNywxNF0sWzQsMTNdLFszLDExXSxbNCw5XSxbNiw4XSxbMTEsN10sWzEzLDZdLFsxNCw0XSxbMTQsM10sWzEzLDFdLFsxMCwwXSxbNywwXSxbNCwxXSxbMywzXV19LHQ6e3dpZHRoOjEyLHBvaW50czpbWzUsMjFdLFs1LDRdLFs2LDFdLFs4LDBdLFsxMCwwXSxbLTEsLTFdLFsyLDE0XSxbOSwxNF1dfSx1Ont3aWR0aDoxOSxwb2ludHM6W1s0LDE0XSxbNCw0XSxbNSwxXSxbNywwXSxbMTAsMF0sWzEyLDFdLFsxNSw0XSxbLTEsLTFdLFsxNSwxNF0sWzE1LDBdXX0sdjp7d2lkdGg6MTYscG9pbnRzOltbMiwxNF0sWzgsMF0sWy0xLC0xXSxbMTQsMTRdLFs4LDBdXX0sdzp7d2lkdGg6MjIscG9pbnRzOltbMywxNF0sWzcsMF0sWy0xLC0xXSxbMTEsMTRdLFs3LDBdLFstMSwtMV0sWzExLDE0XSxbMTUsMF0sWy0xLC0xXSxbMTksMTRdLFsxNSwwXV19LHg6e3dpZHRoOjE3LHBvaW50czpbWzMsMTRdLFsxNCwwXSxbLTEsLTFdLFsxNCwxNF0sWzMsMF1dfSx5Ont3aWR0aDoxNixwb2ludHM6W1syLDE0XSxbOCwwXSxbLTEsLTFdLFsxNCwxNF0sWzgsMF0sWzYsLTRdLFs0LC02XSxbMiwtN10sWzEsLTddXX0sejp7d2lkdGg6MTcscG9pbnRzOltbMTQsMTRdLFszLDBdLFstMSwtMV0sWzMsMTRdLFsxNCwxNF0sWy0xLC0xXSxbMywwXSxbMTQsMF1dfSwieyI6e3dpZHRoOjE0LHBvaW50czpbWzksMjVdLFs3LDI0XSxbNiwyM10sWzUsMjFdLFs1LDE5XSxbNiwxN10sWzcsMTZdLFs4LDE0XSxbOCwxMl0sWzYsMTBdLFstMSwtMV0sWzcsMjRdLFs2LDIyXSxbNiwyMF0sWzcsMThdLFs4LDE3XSxbOSwxNV0sWzksMTNdLFs4LDExXSxbNCw5XSxbOCw3XSxbOSw1XSxbOSwzXSxbOCwxXSxbNywwXSxbNiwtMl0sWzYsLTRdLFs3LC02XSxbLTEsLTFdLFs2LDhdLFs4LDZdLFs4LDRdLFs3LDJdLFs2LDFdLFs1LC0xXSxbNSwtM10sWzYsLTVdLFs3LC02XSxbOSwtN11dfSwifCI6e3dpZHRoOjgscG9pbnRzOltbNCwyNV0sWzQsLTddXX0sIn0iOnt3aWR0aDoxNCxwb2ludHM6W1s1LDI1XSxbNywyNF0sWzgsMjNdLFs5LDIxXSxbOSwxOV0sWzgsMTddLFs3LDE2XSxbNiwxNF0sWzYsMTJdLFs4LDEwXSxbLTEsLTFdLFs3LDI0XSxbOCwyMl0sWzgsMjBdLFs3LDE4XSxbNiwxN10sWzUsMTVdLFs1LDEzXSxbNiwxMV0sWzEwLDldLFs2LDddLFs1LDVdLFs1LDNdLFs2LDFdLFs3LDBdLFs4LC0yXSxbOCwtNF0sWzcsLTZdLFstMSwtMV0sWzgsOF0sWzYsNl0sWzYsNF0sWzcsMl0sWzgsMV0sWzksLTFdLFs5LC0zXSxbOCwtNV0sWzcsLTZdLFs1LC03XV19LCJ+Ijp7d2lkdGg6MjQscG9pbnRzOltbMyw2XSxbMyw4XSxbNCwxMV0sWzYsMTJdLFs4LDEyXSxbMTAsMTFdLFsxNCw4XSxbMTYsN10sWzE4LDddLFsyMCw4XSxbMjEsMTBdLFstMSwtMV0sWzMsOF0sWzQsMTBdLFs2LDExXSxbOCwxMV0sWzEwLDEwXSxbMTQsN10sWzE2LDZdLFsxOCw2XSxbMjAsN10sWzIxLDEwXSxbMjEsMTJdXX19O2EuanFwbG90LkNhbnZhc0ZvbnRSZW5kZXJlcj1mdW5jdGlvbihiKXtiPWJ8fHt9O2lmKCFiLnB0MnB4KXtiLnB0MnB4PTEuNX1hLmpxcGxvdC5DYW52YXNUZXh0UmVuZGVyZXIuY2FsbCh0aGlzLGIpfTthLmpxcGxvdC5DYW52YXNGb250UmVuZGVyZXIucHJvdG90eXBlPW5ldyBhLmpxcGxvdC5DYW52YXNUZXh0UmVuZGVyZXIoe30pO2EuanFwbG90LkNhbnZhc0ZvbnRSZW5kZXJlci5wcm90b3R5cGUuY29uc3RydWN0b3I9YS5qcXBsb3QuQ2FudmFzRm9udFJlbmRlcmVyO2EuanFwbG90LkNhbnZhc0ZvbnRSZW5kZXJlci5wcm90b3R5cGUubWVhc3VyZT1mdW5jdGlvbihjLGUpe3ZhciBkPXRoaXMuZm9udFNpemUrIiAiK3RoaXMuZm9udEZhbWlseTtjLnNhdmUoKTtjLmZvbnQ9ZDt2YXIgYj1jLm1lYXN1cmVUZXh0KGUpLndpZHRoO2MucmVzdG9yZSgpO3JldHVybiBifTthLmpxcGxvdC5DYW52YXNGb250UmVuZGVyZXIucHJvdG90eXBlLmRyYXc9ZnVuY3Rpb24oZSxnKXt2YXIgYz0wO3ZhciBoPXRoaXMuaGVpZ2h0KjAuNzI7ZS5zYXZlKCk7dmFyIGQsYjtpZigoLU1hdGguUEkvMjw9dGhpcy5hbmdsZSYmdGhpcy5hbmdsZTw9MCl8fChNYXRoLlBJKjMvMjw9dGhpcy5hbmdsZSYmdGhpcy5hbmdsZTw9TWF0aC5QSSoyKSl7ZD0wO2I9LU1hdGguc2luKHRoaXMuYW5nbGUpKnRoaXMud2lkdGh9ZWxzZXtpZigoMDx0aGlzLmFuZ2xlJiZ0aGlzLmFuZ2xlPD1NYXRoLlBJLzIpfHwoLU1hdGguUEkqMjw9dGhpcy5hbmdsZSYmdGhpcy5hbmdsZTw9LU1hdGguUEkqMy8yKSl7ZD1NYXRoLnNpbih0aGlzLmFuZ2xlKSp0aGlzLmhlaWdodDtiPTB9ZWxzZXtpZigoLU1hdGguUEk8dGhpcy5hbmdsZSYmdGhpcy5hbmdsZTwtTWF0aC5QSS8yKXx8KE1hdGguUEk8PXRoaXMuYW5nbGUmJnRoaXMuYW5nbGU8PU1hdGguUEkqMy8yKSl7ZD0tTWF0aC5jb3ModGhpcy5hbmdsZSkqdGhpcy53aWR0aDtiPS1NYXRoLnNpbih0aGlzLmFuZ2xlKSp0aGlzLndpZHRoLU1hdGguY29zKHRoaXMuYW5nbGUpKnRoaXMuaGVpZ2h0fWVsc2V7aWYoKC1NYXRoLlBJKjMvMjx0aGlzLmFuZ2xlJiZ0aGlzLmFuZ2xlPE1hdGguUEkpfHwoTWF0aC5QSS8yPHRoaXMuYW5nbGUmJnRoaXMuYW5nbGU8TWF0aC5QSSkpe2Q9TWF0aC5zaW4odGhpcy5hbmdsZSkqdGhpcy5oZWlnaHQtTWF0aC5jb3ModGhpcy5hbmdsZSkqdGhpcy53aWR0aDtiPS1NYXRoLmNvcyh0aGlzLmFuZ2xlKSp0aGlzLmhlaWdodH19fX1lLnN0cm9rZVN0eWxlPXRoaXMuZmlsbFN0eWxlO2UuZmlsbFN0eWxlPXRoaXMuZmlsbFN0eWxlO3ZhciBmPXRoaXMuZm9udFNpemUrIiAiK3RoaXMuZm9udEZhbWlseTtlLmZvbnQ9ZjtlLnRyYW5zbGF0ZShkLGIpO2Uucm90YXRlKHRoaXMuYW5nbGUpO2UuZmlsbFRleHQoZyxjLGgpO2UucmVzdG9yZSgpfX0pKGpRdWVyeSk7]]></data>
	</file>
	<file>
	  <filename>/src/plugins/jqplot.categoryAxisRenderer.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqCiAqIGpxUGxvdAogKiBQdXJlIEphdmFTY3JpcHQgcGxvdHRpbmcgcGx1Z2luIHVzaW5nIGpRdWVyeQogKgogKiBWZXJzaW9uOiAxLjAuMGIyX3IxMDEyCiAqCiAqIENvcHlyaWdodCAoYykgMjAwOS0yMDExIENocmlzIExlb25lbGxvCiAqIGpxUGxvdCBpcyBjdXJyZW50bHkgYXZhaWxhYmxlIGZvciB1c2UgaW4gYWxsIHBlcnNvbmFsIG9yIGNvbW1lcmNpYWwgcHJvamVjdHMgCiAqIHVuZGVyIGJvdGggdGhlIE1JVCAoaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHApIGFuZCBHUEwgCiAqIHZlcnNpb24gMi4wIChodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC5odG1sKSBsaWNlbnNlcy4gVGhpcyBtZWFucyB0aGF0IHlvdSBjYW4gCiAqIGNob29zZSB0aGUgbGljZW5zZSB0aGF0IGJlc3Qgc3VpdHMgeW91ciBwcm9qZWN0IGFuZCB1c2UgaXQgYWNjb3JkaW5nbHkuIAogKgogKiBBbHRob3VnaCBub3QgcmVxdWlyZWQsIHRoZSBhdXRob3Igd291bGQgYXBwcmVjaWF0ZSBhbiBlbWFpbCBsZXR0aW5nIGhpbSAKICoga25vdyBvZiBhbnkgc3Vic3RhbnRpYWwgdXNlIG9mIGpxUGxvdC4gIFlvdSBjYW4gcmVhY2ggdGhlIGF1dGhvciBhdDogCiAqIGNocmlzIGF0IGpxcGxvdCBkb3QgY29tIG9yIHNlZSBodHRwOi8vd3d3LmpxcGxvdC5jb20vaW5mby5waHAgLgogKgogKiBJZiB5b3UgYXJlIGZlZWxpbmcga2luZCBhbmQgZ2VuZXJvdXMsIGNvbnNpZGVyIHN1cHBvcnRpbmcgdGhlIHByb2plY3QgYnkKICogbWFraW5nIGEgZG9uYXRpb24gYXQ6IGh0dHA6Ly93d3cuanFwbG90LmNvbS9kb25hdGUucGhwIC4KICoKICogc3ByaW50ZiBmdW5jdGlvbnMgY29udGFpbmVkIGluIGpxcGxvdC5zcHJpbnRmLmpzIGJ5IEFzaCBTZWFybGU6CiAqCiAqICAgICB2ZXJzaW9uIDIwMDcuMDQuMjcKICogICAgIGF1dGhvciBBc2ggU2VhcmxlCiAqICAgICBodHRwOi8vaGV4bWVuLmNvbS9ibG9nLzIwMDcvMDMvcHJpbnRmLXNwcmludGYvCiAqICAgICBodHRwOi8vaGV4bWVuLmNvbS9qcy9zcHJpbnRmLmpzCiAqICAgICBUaGUgYXV0aG9yIChBc2ggU2VhcmxlKSBoYXMgcGxhY2VkIHRoaXMgY29kZSBpbiB0aGUgcHVibGljIGRvbWFpbjoKICogICAgICJUaGlzIGNvZGUgaXMgdW5yZXN0cmljdGVkOiB5b3UgYXJlIGZyZWUgdG8gdXNlIGl0IGhvd2V2ZXIgeW91IGxpa2UuIgogKiAKICovCihmdW5jdGlvbigkKSB7ICAgCiAgICAvKioKICAgICogIGNsYXNzOiAkLmpxcGxvdC5DYXRlZ29yeUF4aXNSZW5kZXJlcgogICAgKiAgQSBwbHVnaW4gZm9yIGpxUGxvdCB0byByZW5kZXIgYSBjYXRlZ29yeSBzdHlsZSBheGlzLCB3aXRoIGVxdWFsIHBpeGVsIHNwYWNpbmcgYmV0d2VlbiB5IGRhdGEgdmFsdWVzIG9mIGEgc2VyaWVzLgogICAgKiAgCiAgICAqICBUbyB1c2UgdGhpcyByZW5kZXJlciwgaW5jbHVkZSB0aGUgcGx1Z2luIGluIHlvdXIgc291cmNlCiAgICAqICA+IDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iamF2YXNjcmlwdCIgc3JjPSJwbHVnaW5zL2pxcGxvdC5jYXRlZ29yeUF4aXNSZW5kZXJlci5qcyI+PC9zY3JpcHQ+CiAgICAqICAKICAgICogIGFuZCBzdXBwbHkgdGhlIGFwcHJvcHJpYXRlIG9wdGlvbnMgdG8geW91ciBwbG90CiAgICAqICAKICAgICogID4ge2F4ZXM6e3hheGlzOntyZW5kZXJlcjokLmpxcGxvdC5DYXRlZ29yeUF4aXNSZW5kZXJlcn19fQogICAgKiovCiAgICAkLmpxcGxvdC5DYXRlZ29yeUF4aXNSZW5kZXJlciA9IGZ1bmN0aW9uKG9wdGlvbnMpIHsKICAgICAgICAkLmpxcGxvdC5MaW5lYXJBeGlzUmVuZGVyZXIuY2FsbCh0aGlzKTsKICAgICAgICAvLyBwcm9wOiBzb3J0TWVyZ2VkTGFiZWxzCiAgICAgICAgLy8gVHJ1ZSB0byBzb3J0IHRpY2sgbGFiZWxzIHdoZW4gbGFiZWxzIGFyZSBjcmVhdGVkIGJ5IG1lcmdpbmcKICAgICAgICAvLyB4IGF4aXMgdmFsdWVzIGZyb20gbXVsdGlwbGUgc2VyaWVzLiAgVGhhdCBpcywgc2F5IHlvdSBoYXZlCiAgICAgICAgLy8gdHdvIHNlcmllcyBsaWtlOgogICAgICAgIC8vID4gbGluZTEgPSBbWzIwMDYsIDRdLCAgICAgICAgICAgIFsyMDA4LCA5XSwgWzIwMDksIDE2XV07CiAgICAgICAgLy8gPiBsaW5lMiA9IFtbMjAwNiwgM10sIFsyMDA3LCA3XSwgWzIwMDgsIDZdXTsKICAgICAgICAvLyBJZiBubyBsYWJlbCBhcnJheSBpcyBzcGVjaWZpZWQsIHRpY2sgbGFiZWxzIHdpbGwgYmUgY29sbGVjdGVkCiAgICAgICAgLy8gZnJvbSB0aGUgeCB2YWx1ZXMgb2YgdGhlIHNlcmllcy4gIFdpdGggc29ydE1lcmdlZExhYmVscwogICAgICAgIC8vIHNldCB0byB0cnVlLCB0aWNrIGxhYmVscyB3aWxsIGJlOgogICAgICAgIC8vID4gWzIwMDYsIDIwMDcsIDIwMDgsIDIwMDldCiAgICAgICAgLy8gV2l0aCBzb3J0TWVyZ2VkTGFiZWxzIHNldCB0byBmYWxzZSwgdGljayBsYWJlbHMgd2lsbCBiZToKICAgICAgICAvLyA+IFsyMDA2LCAyMDA4LCAyMDA5LCAyMDA3XQogICAgICAgIC8vCiAgICAgICAgLy8gTm90ZSwgdGhpcyBwcm9wZXJ0eSBpcyBzcGVjaWZpZWQgb24gdGhlIHJlbmRlck9wdGlvbnMgZm9yIHRoZSAKICAgICAgICAvLyBheGVzIHdoZW4gY3JlYXRpbmcgYSBwbG90OgogICAgICAgIC8vID4gYXhlczp7eGF4aXM6e3JlbmRlcmVyOiQuanFwbG90LkNhdGVnb3J5QXhpc1JlbmRlcmVyLCByZW5kZXJlck9wdGlvbnM6e3NvcnRNZXJnZWRMYWJlbHM6dHJ1ZX19fQogICAgICAgIHRoaXMuc29ydE1lcmdlZExhYmVscyA9IGZhbHNlOwogICAgfTsKICAgIAogICAgJC5qcXBsb3QuQ2F0ZWdvcnlBeGlzUmVuZGVyZXIucHJvdG90eXBlID0gbmV3ICQuanFwbG90LkxpbmVhckF4aXNSZW5kZXJlcigpOwogICAgJC5qcXBsb3QuQ2F0ZWdvcnlBeGlzUmVuZGVyZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gJC5qcXBsb3QuQ2F0ZWdvcnlBeGlzUmVuZGVyZXI7CiAgICAKICAgICQuanFwbG90LkNhdGVnb3J5QXhpc1JlbmRlcmVyLnByb3RvdHlwZS5pbml0ID0gZnVuY3Rpb24ob3B0aW9ucyl7CiAgICAgICAgdGhpcy5ncm91cHMgPSAxOwogICAgICAgIHRoaXMuZ3JvdXBMYWJlbHMgPSBbXTsKICAgICAgICB0aGlzLl9ncm91cExhYmVscyA9IFtdOwogICAgICAgIHRoaXMuX2dyb3VwZWQgPSBmYWxzZTsKICAgICAgICB0aGlzLl9iYXJzUGVyR3JvdXAgPSBudWxsOwogICAgICAgIC8vIHByb3A6IHRpY2tSZW5kZXJlcgogICAgICAgIC8vIEEgY2xhc3Mgb2YgYSByZW5kZXJpbmcgZW5naW5lIGZvciBjcmVhdGluZyB0aGUgdGlja3MgbGFiZWxzIGRpc3BsYXllZCBvbiB0aGUgcGxvdCwgCiAgICAgICAgLy8gU2VlIDwkLmpxcGxvdC5BeGlzVGlja1JlbmRlcmVyPi4KICAgICAgICAvLyB0aGlzLnRpY2tSZW5kZXJlciA9ICQuanFwbG90LkF4aXNUaWNrUmVuZGVyZXI7CiAgICAgICAgLy8gdGhpcy5sYWJlbFJlbmRlcmVyID0gJC5qcXBsb3QuQXhpc0xhYmVsUmVuZGVyZXI7CiAgICAgICAgJC5leHRlbmQodHJ1ZSwgdGhpcywge3RpY2tPcHRpb25zOntmb3JtYXRTdHJpbmc6JyVkJ319LCBvcHRpb25zKTsKICAgICAgICB2YXIgZGIgPSB0aGlzLl9kYXRhQm91bmRzOwogICAgICAgIC8vIEdvIHRocm91Z2ggYWxsIHRoZSBzZXJpZXMgYXR0YWNoZWQgdG8gdGhpcyBheGlzIGFuZCBmaW5kCiAgICAgICAgLy8gdGhlIG1pbi9tYXggYm91bmRzIGZvciB0aGlzIGF4aXMuCiAgICAgICAgZm9yICh2YXIgaT0wOyBpPHRoaXMuX3Nlcmllcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICB2YXIgcyA9IHRoaXMuX3Nlcmllc1tpXTsKICAgICAgICAgICAgaWYgKHMuZ3JvdXBzKSB7CiAgICAgICAgICAgICAgICB0aGlzLmdyb3VwcyA9IHMuZ3JvdXBzOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBkID0gcy5kYXRhOwogICAgICAgICAgICAKICAgICAgICAgICAgZm9yICh2YXIgaj0wOyBqPGQubGVuZ3RoOyBqKyspIHsgCiAgICAgICAgICAgICAgICBpZiAodGhpcy5uYW1lID09ICd4YXhpcycgfHwgdGhpcy5uYW1lID09ICd4MmF4aXMnKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGRbal1bMF0gPCBkYi5taW4gfHwgZGIubWluID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZGIubWluID0gZFtqXVswXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKGRbal1bMF0gPiBkYi5tYXggfHwgZGIubWF4ID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZGIubWF4ID0gZFtqXVswXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIGlmIChkW2pdWzFdIDwgZGIubWluIHx8IGRiLm1pbiA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRiLm1pbiA9IGRbal1bMV07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChkW2pdWzFdID4gZGIubWF4IHx8IGRiLm1heCA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRiLm1heCA9IGRbal1bMV07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYgKHRoaXMuZ3JvdXBMYWJlbHMubGVuZ3RoKSB7CiAgICAgICAgICAgIHRoaXMuZ3JvdXBzID0gdGhpcy5ncm91cExhYmVscy5sZW5ndGg7CiAgICAgICAgfQogICAgfTsKIAoKICAgICQuanFwbG90LkNhdGVnb3J5QXhpc1JlbmRlcmVyLnByb3RvdHlwZS5jcmVhdGVUaWNrcyA9IGZ1bmN0aW9uKCkgewogICAgICAgIC8vIHdlJ3JlIGFyZSBvcGVyYXRpbmcgb24gYW4gYXhpcyBoZXJlCiAgICAgICAgdmFyIHRpY2tzID0gdGhpcy5fdGlja3M7CiAgICAgICAgdmFyIHVzZXJUaWNrcyA9IHRoaXMudGlja3M7CiAgICAgICAgdmFyIG5hbWUgPSB0aGlzLm5hbWU7CiAgICAgICAgLy8gZGF0YWJvdW5kcyB3ZXJlIHNldCBvbiBheGlzIGluaXRpYWxpemF0aW9uLgogICAgICAgIHZhciBkYiA9IHRoaXMuX2RhdGFCb3VuZHM7CiAgICAgICAgdmFyIGRpbSwgaW50ZXJ2YWw7CiAgICAgICAgdmFyIG1pbiwgbWF4OwogICAgICAgIHZhciBwb3MxLCBwb3MyOwogICAgICAgIHZhciB0dCwgaTsKCiAgICAgICAgLy8gaWYgd2UgYWxyZWFkeSBoYXZlIHRpY2tzLCB1c2UgdGhlbS4KICAgICAgICBpZiAodXNlclRpY2tzLmxlbmd0aCkgewogICAgICAgICAgICAvLyBhZGp1c3Qgd2l0aCBibGFua3MgaWYgd2UgaGF2ZSBncm91cHMKICAgICAgICAgICAgaWYgKHRoaXMuZ3JvdXBzID4gMSAmJiAhdGhpcy5fZ3JvdXBlZCkgewogICAgICAgICAgICAgICAgdmFyIGwgPSB1c2VyVGlja3MubGVuZ3RoOwogICAgICAgICAgICAgICAgdmFyIHNraXAgPSBwYXJzZUludChsL3RoaXMuZ3JvdXBzLCAxMCk7CiAgICAgICAgICAgICAgICB2YXIgY291bnQgPSAwOwogICAgICAgICAgICAgICAgZm9yICh2YXIgaT1za2lwOyBpPGw7IGkrPXNraXApIHsKICAgICAgICAgICAgICAgICAgICB1c2VyVGlja3Muc3BsaWNlKGkrY291bnQsIDAsICcgJyk7CiAgICAgICAgICAgICAgICAgICAgY291bnQrKzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRoaXMuX2dyb3VwZWQgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMubWluID0gMC41OwogICAgICAgICAgICB0aGlzLm1heCA9IHVzZXJUaWNrcy5sZW5ndGggKyAwLjU7CiAgICAgICAgICAgIHZhciByYW5nZSA9IHRoaXMubWF4IC0gdGhpcy5taW47CiAgICAgICAgICAgIHRoaXMubnVtYmVyVGlja3MgPSAyKnVzZXJUaWNrcy5sZW5ndGggKyAxOwogICAgICAgICAgICBmb3IgKGk9MDsgaTx1c2VyVGlja3MubGVuZ3RoOyBpKyspewogICAgICAgICAgICAgICAgdHQgPSB0aGlzLm1pbiArIDIgKiBpICogcmFuZ2UgLyAodGhpcy5udW1iZXJUaWNrcy0xKTsKICAgICAgICAgICAgICAgIC8vIG5lZWQgYSBtYXJrZXIgYmVmb3JlIGFuZCBhZnRlciB0aGUgdGljawogICAgICAgICAgICAgICAgdmFyIHQgPSBuZXcgdGhpcy50aWNrUmVuZGVyZXIodGhpcy50aWNrT3B0aW9ucyk7CiAgICAgICAgICAgICAgICB0LnNob3dMYWJlbCA9IGZhbHNlOwogICAgICAgICAgICAgICAgLy8gdC5zaG93TWFyayA9IHRydWU7CiAgICAgICAgICAgICAgICB0LnNldFRpY2sodHQsIHRoaXMubmFtZSk7CiAgICAgICAgICAgICAgICB0aGlzLl90aWNrcy5wdXNoKHQpOwogICAgICAgICAgICAgICAgdmFyIHQgPSBuZXcgdGhpcy50aWNrUmVuZGVyZXIodGhpcy50aWNrT3B0aW9ucyk7CiAgICAgICAgICAgICAgICB0LmxhYmVsID0gdXNlclRpY2tzW2ldOwogICAgICAgICAgICAgICAgLy8gdC5zaG93TGFiZWwgPSB0cnVlOwogICAgICAgICAgICAgICAgdC5zaG93TWFyayA9IGZhbHNlOwogICAgICAgICAgICAgICAgdC5zaG93R3JpZGxpbmUgPSBmYWxzZTsKICAgICAgICAgICAgICAgIHQuc2V0VGljayh0dCswLjUsIHRoaXMubmFtZSk7CiAgICAgICAgICAgICAgICB0aGlzLl90aWNrcy5wdXNoKHQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIG5vdyBhZGQgdGhlIGxhc3QgdGljayBhdCB0aGUgZW5kCiAgICAgICAgICAgIHZhciB0ID0gbmV3IHRoaXMudGlja1JlbmRlcmVyKHRoaXMudGlja09wdGlvbnMpOwogICAgICAgICAgICB0LnNob3dMYWJlbCA9IGZhbHNlOwogICAgICAgICAgICAvLyB0LnNob3dNYXJrID0gdHJ1ZTsKICAgICAgICAgICAgdC5zZXRUaWNrKHR0KzEsIHRoaXMubmFtZSk7CiAgICAgICAgICAgIHRoaXMuX3RpY2tzLnB1c2godCk7CiAgICAgICAgfQoKICAgICAgICAvLyB3ZSBkb24ndCBoYXZlIGFueSB0aWNrcyB5ZXQsIGxldCdzIG1ha2Ugc29tZSEKICAgICAgICBlbHNlIHsKICAgICAgICAgICAgaWYgKG5hbWUgPT0gJ3hheGlzJyB8fCBuYW1lID09ICd4MmF4aXMnKSB7CiAgICAgICAgICAgICAgICBkaW0gPSB0aGlzLl9wbG90RGltZW5zaW9ucy53aWR0aDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGRpbSA9IHRoaXMuX3Bsb3REaW1lbnNpb25zLmhlaWdodDsKICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgLy8gaWYgbWluLCBtYXggYW5kIG51bWJlciBvZiB0aWNrcyBzcGVjaWZpZWQsIHVzZXIgY2FuJ3Qgc3BlY2lmeSBpbnRlcnZhbC4KICAgICAgICAgICAgaWYgKHRoaXMubWluICE9IG51bGwgJiYgdGhpcy5tYXggIT0gbnVsbCAmJiB0aGlzLm51bWJlclRpY2tzICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIHRoaXMudGlja0ludGVydmFsID0gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgLy8gaWYgbWF4LCBtaW4sIGFuZCBpbnRlcnZhbCBzcGVjaWZpZWQgYW5kIGludGVydmFsIHdvbid0IGZpdCwgaWdub3JlIGludGVydmFsLgogICAgICAgICAgICBpZiAodGhpcy5taW4gIT0gbnVsbCAmJiB0aGlzLm1heCAhPSBudWxsICYmIHRoaXMudGlja0ludGVydmFsICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIGlmIChwYXJzZUludCgodGhpcy5tYXgtdGhpcy5taW4pL3RoaXMudGlja0ludGVydmFsLCAxMCkgIT0gKHRoaXMubWF4LXRoaXMubWluKS90aGlzLnRpY2tJbnRlcnZhbCkgewogICAgICAgICAgICAgICAgICAgIHRoaXMudGlja0ludGVydmFsID0gbnVsbDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIAogICAgICAgICAgICAvLyBmaW5kIG91dCBob3cgbWFueSBjYXRlZ29yaWVzIGFyZSBpbiB0aGUgbGluZXMgYW5kIGNvbGxlY3QgbGFiZWxzCiAgICAgICAgICAgIHZhciBsYWJlbHMgPSBbXTsKICAgICAgICAgICAgdmFyIG51bWNhdHMgPSAwOwogICAgICAgICAgICB2YXIgbWluID0gMC41OwogICAgICAgICAgICB2YXIgbWF4LCB2YWw7CiAgICAgICAgICAgIHZhciBpc01lcmdlZCA9IGZhbHNlOwogICAgICAgICAgICBmb3IgKHZhciBpPTA7IGk8dGhpcy5fc2VyaWVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICB2YXIgcyA9IHRoaXMuX3Nlcmllc1tpXTsKICAgICAgICAgICAgICAgIGZvciAodmFyIGo9MDsgajxzLmRhdGEubGVuZ3RoOyBqKyspIHsKICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5uYW1lID09ICd4YXhpcycgfHwgdGhpcy5uYW1lID09ICd4MmF4aXMnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IHMuZGF0YVtqXVswXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IHMuZGF0YVtqXVsxXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCQuaW5BcnJheSh2YWwsIGxhYmVscykgPT0gLTEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaXNNZXJnZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICBudW1jYXRzICs9IDE7ICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscy5wdXNoKHZhbCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICBpZiAoaXNNZXJnZWQgJiYgdGhpcy5zb3J0TWVyZ2VkTGFiZWxzKSB7CiAgICAgICAgICAgICAgICBsYWJlbHMuc29ydChmdW5jdGlvbihhLGIpIHsgcmV0dXJuIGEgLSBiOyB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgLy8ga2VlcCBhIHJlZmVyZW5jZSB0byB0aGVzZSB0aWNrIGxhYmVscyB0byB1c2UgZm9yIHJlZHJhd2luZyBwbG90IChzZWUgYnVnICM1NykKICAgICAgICAgICAgdGhpcy50aWNrcyA9IGxhYmVsczsKICAgICAgICAgICAgCiAgICAgICAgICAgIC8vIG5vdyBiaW4gdGhlIGRhdGEgdmFsdWVzIHRvIHRoZSByaWdodCBsYWJsZXMuCiAgICAgICAgICAgIGZvciAodmFyIGk9MDsgaTx0aGlzLl9zZXJpZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIHZhciBzID0gdGhpcy5fc2VyaWVzW2ldOwogICAgICAgICAgICAgICAgZm9yICh2YXIgaj0wOyBqPHMuZGF0YS5sZW5ndGg7IGorKykgewogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm5hbWUgPT0gJ3hheGlzJyB8fCB0aGlzLm5hbWUgPT0gJ3gyYXhpcycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gcy5kYXRhW2pdWzBdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gcy5kYXRhW2pdWzFdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAvLyBmb3IgY2F0ZWdvcnkgYXhpcywgZm9yY2UgdGhlIHZhbHVlcyBpbnRvIGNhdGVnb3J5IGJpbnMuCiAgICAgICAgICAgICAgICAgICAgLy8gd2Ugc2hvdWxkIGhhdmUgdGhlIHZhbHVlIGluIHRoZSBsYWJlbCBhcnJheSBub3cuCiAgICAgICAgICAgICAgICAgICAgdmFyIGlkeCA9ICQuaW5BcnJheSh2YWwsIGxhYmVscykrMTsKICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5uYW1lID09ICd4YXhpcycgfHwgdGhpcy5uYW1lID09ICd4MmF4aXMnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHMuZGF0YVtqXVswXSA9IGlkeDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHMuZGF0YVtqXVsxXSA9IGlkeDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgICAgIC8vIGFkanVzdCB3aXRoIGJsYW5rcyBpZiB3ZSBoYXZlIGdyb3VwcwogICAgICAgICAgICBpZiAodGhpcy5ncm91cHMgPiAxICYmICF0aGlzLl9ncm91cGVkKSB7CiAgICAgICAgICAgICAgICB2YXIgbCA9IGxhYmVscy5sZW5ndGg7CiAgICAgICAgICAgICAgICB2YXIgc2tpcCA9IHBhcnNlSW50KGwvdGhpcy5ncm91cHMsIDEwKTsKICAgICAgICAgICAgICAgIHZhciBjb3VudCA9IDA7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpPXNraXA7IGk8bDsgaSs9c2tpcCsxKSB7CiAgICAgICAgICAgICAgICAgICAgbGFiZWxzW2ldID0gJyAnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGhpcy5fZ3JvdXBlZCA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAKICAgICAgICAgICAgbWF4ID0gbnVtY2F0cyArIDAuNTsKICAgICAgICAgICAgaWYgKHRoaXMubnVtYmVyVGlja3MgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgdGhpcy5udW1iZXJUaWNrcyA9IDIqbnVtY2F0cyArIDE7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciByYW5nZSA9IG1heCAtIG1pbjsKICAgICAgICAgICAgdGhpcy5taW4gPSBtaW47CiAgICAgICAgICAgIHRoaXMubWF4ID0gbWF4OwogICAgICAgICAgICB2YXIgdHJhY2sgPSAwOwogICAgICAgICAgICAKICAgICAgICAgICAgLy8gdG9kbzogYWRqdXN0IHRoaXMgc28gbW9yZSB0aWNrcyBkaXNwbGF5ZWQuCiAgICAgICAgICAgIHZhciBtYXhWaXNpYmxlVGlja3MgPSBwYXJzZUludCgzK2RpbS8xMCwgMTApOwogICAgICAgICAgICB2YXIgc2tpcCA9IHBhcnNlSW50KG51bWNhdHMvbWF4VmlzaWJsZVRpY2tzLCAxMCk7CgogICAgICAgICAgICBpZiAodGhpcy50aWNrSW50ZXJ2YWwgPT0gbnVsbCkgewoKICAgICAgICAgICAgICAgIHRoaXMudGlja0ludGVydmFsID0gcmFuZ2UgLyAodGhpcy5udW1iZXJUaWNrcy0xKTsKCiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gaWYgdGlja0ludGVydmFsIGlzIHNwZWNpZmllZCwgd2Ugd2lsbCBpZ25vcmUgYW55IGNvbXB1dGVkIG1heGltdW0uCiAgICAgICAgICAgIGZvciAodmFyIGk9MDsgaTx0aGlzLm51bWJlclRpY2tzOyBpKyspewogICAgICAgICAgICAgICAgdHQgPSB0aGlzLm1pbiArIGkgKiB0aGlzLnRpY2tJbnRlcnZhbDsKICAgICAgICAgICAgICAgIHZhciB0ID0gbmV3IHRoaXMudGlja1JlbmRlcmVyKHRoaXMudGlja09wdGlvbnMpOwogICAgICAgICAgICAgICAgLy8gaWYgZXZlbiB0aWNrLCBpdCBpc24ndCBhIGNhdGVnb3J5LCBpdCdzIGEgZGl2aWRlcgogICAgICAgICAgICAgICAgaWYgKGkvMiA9PSBwYXJzZUludChpLzIsIDEwKSkgewogICAgICAgICAgICAgICAgICAgIHQuc2hvd0xhYmVsID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgdC5zaG93TWFyayA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBpZiAoc2tpcD4wICYmIHRyYWNrPHNraXApIHsKICAgICAgICAgICAgICAgICAgICAgICAgdC5zaG93TGFiZWwgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2sgKz0gMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHQuc2hvd0xhYmVsID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2sgPSAwOwogICAgICAgICAgICAgICAgICAgIH0gCiAgICAgICAgICAgICAgICAgICAgdC5sYWJlbCA9IHQuZm9ybWF0dGVyKHQuZm9ybWF0U3RyaW5nLCBsYWJlbHNbKGktMSkvMl0pOwogICAgICAgICAgICAgICAgICAgIHQuc2hvd01hcmsgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB0LnNob3dHcmlkbGluZSA9IGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdC5zZXRUaWNrKHR0LCB0aGlzLm5hbWUpOwogICAgICAgICAgICAgICAgdGhpcy5fdGlja3MucHVzaCh0KTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAKICAgIH07CiAgICAKICAgIC8vIGNhbGxlZCB3aXRoIHNjb3BlIG9mIGF4aXMKICAgICQuanFwbG90LkNhdGVnb3J5QXhpc1JlbmRlcmVyLnByb3RvdHlwZS5kcmF3ID0gZnVuY3Rpb24oY3R4LCBwbG90KSB7CiAgICAgICAgaWYgKHRoaXMuc2hvdykgewogICAgICAgICAgICAvLyBwb3B1bGF0ZSB0aGUgYXhpcyBsYWJlbCBhbmQgdmFsdWUgcHJvcGVydGllcy4KICAgICAgICAgICAgLy8gY3JlYXRlVGlja3MgaXMgYSBtZXRob2Qgb24gdGhlIHJlbmRlcmVyLCBidXQKICAgICAgICAgICAgLy8gY2FsbCBpdCB3aXRoaW4gdGhlIHNjb3BlIG9mIHRoZSBheGlzLgogICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmNyZWF0ZVRpY2tzLmNhbGwodGhpcyk7CiAgICAgICAgICAgIC8vIGZpbGwgYSBkaXYgd2l0aCBheGVzIGxhYmVscyBpbiB0aGUgcmlnaHQgZGlyZWN0aW9uLgogICAgICAgICAgICAvLyBOZWVkIHRvIHByZWdlbmVyYXRlIGVhY2ggYXhpcyB0byBnZXQgaXQncyBib3VuZHMgYW5kCiAgICAgICAgICAgIC8vIHBvc2l0aW9uIGl0IGFuZCB0aGUgbGFiZWxzIGNvcnJlY3RseSBvbiB0aGUgcGxvdC4KICAgICAgICAgICAgdmFyIGRpbT0wOwogICAgICAgICAgICB2YXIgdGVtcDsKICAgICAgICAgICAgLy8gQWRkZWQgZm9yIHRoZW1pbmcuCiAgICAgICAgICAgIGlmICh0aGlzLl9lbGVtKSB7CiAgICAgICAgICAgICAgICAvLyB0aGlzLl9lbGVtLmVtcHR5KCk7CiAgICAgICAgICAgICAgICAvLyBNZW1vcnkgTGVha3MgcGF0Y2gKICAgICAgICAgICAgICAgIHRoaXMuX2VsZW0uZW1wdHlGb3JjZSgpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLl9lbGVtID0gdGhpcy5fZWxlbSB8fCAkKCc8ZGl2IGNsYXNzPSJqcXBsb3QtYXhpcyBqcXBsb3QtJyt0aGlzLm5hbWUrJyIgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlOyI+PC9kaXY+Jyk7CiAgICAgICAgICAgIAogICAgICAgICAgICBpZiAodGhpcy5uYW1lID09ICd4YXhpcycgfHwgdGhpcy5uYW1lID09ICd4MmF4aXMnKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9lbGVtLndpZHRoKHRoaXMuX3Bsb3REaW1lbnNpb25zLndpZHRoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHRoaXMuX2VsZW0uaGVpZ2h0KHRoaXMuX3Bsb3REaW1lbnNpb25zLmhlaWdodCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgICAgIC8vIGNyZWF0ZSBhIF9sYWJlbCBvYmplY3QuCiAgICAgICAgICAgIHRoaXMubGFiZWxPcHRpb25zLmF4aXMgPSB0aGlzLm5hbWU7CiAgICAgICAgICAgIHRoaXMuX2xhYmVsID0gbmV3IHRoaXMubGFiZWxSZW5kZXJlcih0aGlzLmxhYmVsT3B0aW9ucyk7CiAgICAgICAgICAgIGlmICh0aGlzLl9sYWJlbC5zaG93KSB7CiAgICAgICAgICAgICAgICB2YXIgZWxlbSA9IHRoaXMuX2xhYmVsLmRyYXcoY3R4LCBwbG90KTsKICAgICAgICAgICAgICAgIGVsZW0uYXBwZW5kVG8odGhpcy5fZWxlbSk7CiAgICAgICAgICAgIH0KICAgIAogICAgICAgICAgICB2YXIgdCA9IHRoaXMuX3RpY2tzOwogICAgICAgICAgICBmb3IgKHZhciBpPTA7IGk8dC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgdmFyIHRpY2sgPSB0W2ldOwogICAgICAgICAgICAgICAgaWYgKHRpY2suc2hvd0xhYmVsICYmICghdGljay5pc01pbm9yVGljayB8fCB0aGlzLnNob3dNaW5vclRpY2tzKSkgewogICAgICAgICAgICAgICAgICAgIHZhciBlbGVtID0gdGljay5kcmF3KGN0eCwgcGxvdCk7CiAgICAgICAgICAgICAgICAgICAgZWxlbS5hcHBlbmRUbyh0aGlzLl9lbGVtKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIAogICAgICAgICAgICB0aGlzLl9ncm91cExhYmVscyA9IFtdOwogICAgICAgICAgICAvLyBub3cgbWFrZSBncm91cCBsYWJlbHMKICAgICAgICAgICAgZm9yICh2YXIgaT0wOyBpPHRoaXMuZ3JvdXBMYWJlbHMubGVuZ3RoOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZhciBlbGVtID0gJCgnPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7IiBjbGFzcz0ianFwbG90LScrdGhpcy5uYW1lKyctZ3JvdXBMYWJlbCI+PC9kaXY+Jyk7CiAgICAgICAgICAgICAgICBlbGVtLmh0bWwodGhpcy5ncm91cExhYmVsc1tpXSk7CiAgICAgICAgICAgICAgICB0aGlzLl9ncm91cExhYmVscy5wdXNoKGVsZW0pOwogICAgICAgICAgICAgICAgZWxlbS5hcHBlbmRUbyh0aGlzLl9lbGVtKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5fZWxlbTsKICAgIH07CiAgICAKICAgIC8vIGNhbGxlZCB3aXRoIHNjb3BlIG9mIGF4aXMKICAgICQuanFwbG90LkNhdGVnb3J5QXhpc1JlbmRlcmVyLnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbigpIHsgCiAgICAgICAgdmFyIGRpbSA9IDA7CiAgICAgICAgdmFyIHRlbXA7CiAgICAgICAgdmFyIHcgPSAwOwogICAgICAgIHZhciBoID0gMDsKICAgICAgICB2YXIgbHNob3cgPSAodGhpcy5fbGFiZWwgPT0gbnVsbCkgPyBmYWxzZSA6IHRoaXMuX2xhYmVsLnNob3c7CiAgICAgICAgaWYgKHRoaXMuc2hvdykgewogICAgICAgICAgICB2YXIgdCA9IHRoaXMuX3RpY2tzOwogICAgICAgICAgICBmb3IgKHZhciBpPTA7IGk8dC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgdmFyIHRpY2sgPSB0W2ldOwogICAgICAgICAgICAgICAgaWYgKHRpY2suc2hvd0xhYmVsICYmICghdGljay5pc01pbm9yVGljayB8fCB0aGlzLnNob3dNaW5vclRpY2tzKSkgewogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm5hbWUgPT0gJ3hheGlzJyB8fCB0aGlzLm5hbWUgPT0gJ3gyYXhpcycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGVtcCA9IHRpY2suX2VsZW0ub3V0ZXJIZWlnaHQodHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICB0ZW1wID0gdGljay5fZWxlbS5vdXRlcldpZHRoKHRydWUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAodGVtcCA+IGRpbSkgewogICAgICAgICAgICAgICAgICAgICAgICBkaW0gPSB0ZW1wOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIGRpbTIgPSAwOwogICAgICAgICAgICBmb3IgKHZhciBpPTA7IGk8dGhpcy5fZ3JvdXBMYWJlbHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIHZhciBsID0gdGhpcy5fZ3JvdXBMYWJlbHNbaV07CiAgICAgICAgICAgICAgICBpZiAodGhpcy5uYW1lID09ICd4YXhpcycgfHwgdGhpcy5uYW1lID09ICd4MmF4aXMnKSB7CiAgICAgICAgICAgICAgICAgICAgdGVtcCA9IGwub3V0ZXJIZWlnaHQodHJ1ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0ZW1wID0gbC5vdXRlcldpZHRoKHRydWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHRlbXAgPiBkaW0yKSB7CiAgICAgICAgICAgICAgICAgICAgZGltMiA9IHRlbXA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgICAgIGlmIChsc2hvdykgewogICAgICAgICAgICAgICAgdyA9IHRoaXMuX2xhYmVsLl9lbGVtLm91dGVyV2lkdGgodHJ1ZSk7CiAgICAgICAgICAgICAgICBoID0gdGhpcy5fbGFiZWwuX2VsZW0ub3V0ZXJIZWlnaHQodHJ1ZSk7IAogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0aGlzLm5hbWUgPT0gJ3hheGlzJykgewogICAgICAgICAgICAgICAgZGltICs9IGRpbTIgKyBoOwogICAgICAgICAgICAgICAgdGhpcy5fZWxlbS5jc3MoeydoZWlnaHQnOmRpbSsncHgnLCBsZWZ0OicwcHgnLCBib3R0b206JzBweCd9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICh0aGlzLm5hbWUgPT0gJ3gyYXhpcycpIHsKICAgICAgICAgICAgICAgIGRpbSArPSBkaW0yICsgaDsKICAgICAgICAgICAgICAgIHRoaXMuX2VsZW0uY3NzKHsnaGVpZ2h0JzpkaW0rJ3B4JywgbGVmdDonMHB4JywgdG9wOicwcHgnfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5uYW1lID09ICd5YXhpcycpIHsKICAgICAgICAgICAgICAgIGRpbSArPSBkaW0yICsgdzsKICAgICAgICAgICAgICAgIHRoaXMuX2VsZW0uY3NzKHsnd2lkdGgnOmRpbSsncHgnLCBsZWZ0OicwcHgnLCB0b3A6JzBweCd9KTsKICAgICAgICAgICAgICAgIGlmIChsc2hvdyAmJiB0aGlzLl9sYWJlbC5jb25zdHJ1Y3RvciA9PSAkLmpxcGxvdC5BeGlzTGFiZWxSZW5kZXJlcikgewogICAgICAgICAgICAgICAgICAgIHRoaXMuX2xhYmVsLl9lbGVtLmNzcygnd2lkdGgnLCB3KydweCcpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgZGltICs9IGRpbTIgKyB3OwogICAgICAgICAgICAgICAgdGhpcy5fZWxlbS5jc3Moeyd3aWR0aCc6ZGltKydweCcsIHJpZ2h0OicwcHgnLCB0b3A6JzBweCd9KTsKICAgICAgICAgICAgICAgIGlmIChsc2hvdyAmJiB0aGlzLl9sYWJlbC5jb25zdHJ1Y3RvciA9PSAkLmpxcGxvdC5BeGlzTGFiZWxSZW5kZXJlcikgewogICAgICAgICAgICAgICAgICAgIHRoaXMuX2xhYmVsLl9lbGVtLmNzcygnd2lkdGgnLCB3KydweCcpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSAgCiAgICB9OwogICAgCiAgICAvLyBjYWxsZWQgd2l0aCBzY29wZSBvZiBheGlzCiAgICAkLmpxcGxvdC5DYXRlZ29yeUF4aXNSZW5kZXJlci5wcm90b3R5cGUucGFjayA9IGZ1bmN0aW9uKHBvcywgb2Zmc2V0cykgewogICAgICAgIHZhciB0aWNrcyA9IHRoaXMuX3RpY2tzOwogICAgICAgIHZhciBtYXggPSB0aGlzLm1heDsKICAgICAgICB2YXIgbWluID0gdGhpcy5taW47CiAgICAgICAgdmFyIG9mZm1heCA9IG9mZnNldHMubWF4OwogICAgICAgIHZhciBvZmZtaW4gPSBvZmZzZXRzLm1pbjsKICAgICAgICB2YXIgbHNob3cgPSAodGhpcy5fbGFiZWwgPT0gbnVsbCkgPyBmYWxzZSA6IHRoaXMuX2xhYmVsLnNob3c7CiAgICAgICAgdmFyIGk7CgkJCiAgICAgICAgZm9yICh2YXIgcCBpbiBwb3MpIHsKICAgICAgICAgICAgdGhpcy5fZWxlbS5jc3MocCwgcG9zW3BdKTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgdGhpcy5fb2Zmc2V0cyA9IG9mZnNldHM7CiAgICAgICAgLy8gcGl4ZWxsZW5ndGggd2lsbCBiZSArIGZvciB4IGF4ZXMgYW5kIC0gZm9yIHkgYXhlcyBiZWNhc3VlIHBpeGVscyBhbHdheXMgbWVhc3VyZWQgZnJvbSB0b3AgbGVmdC4KICAgICAgICB2YXIgcGl4ZWxsZW5ndGggPSBvZmZtYXggLSBvZmZtaW47CiAgICAgICAgdmFyIHVuaXRsZW5ndGggPSBtYXggLSBtaW47CiAgICAgICAgCiAgICAgICAgLy8gcG9pbnQgdG8gdW5pdCBhbmQgdW5pdCB0byBwb2ludCBjb252ZXJzaW9ucyByZWZlcmVuY2VzIHRvIFBsb3QgRE9NIGVsZW1lbnQgdG9wIGxlZnQgY29ybmVyLgogICAgICAgIHRoaXMucDJ1ID0gZnVuY3Rpb24ocCl7CiAgICAgICAgICAgIHJldHVybiAocCAtIG9mZm1pbikgKiB1bml0bGVuZ3RoIC8gcGl4ZWxsZW5ndGggKyBtaW47CiAgICAgICAgfTsKICAgICAgICAKICAgICAgICB0aGlzLnUycCA9IGZ1bmN0aW9uKHUpewogICAgICAgICAgICByZXR1cm4gKHUgLSBtaW4pICogcGl4ZWxsZW5ndGggLyB1bml0bGVuZ3RoICsgb2ZmbWluOwogICAgICAgIH07CiAgICAgICAgICAgICAgICAKICAgICAgICBpZiAodGhpcy5uYW1lID09ICd4YXhpcycgfHwgdGhpcy5uYW1lID09ICd4MmF4aXMnKXsKICAgICAgICAgICAgdGhpcy5zZXJpZXNfdTJwID0gZnVuY3Rpb24odSl7CiAgICAgICAgICAgICAgICByZXR1cm4gKHUgLSBtaW4pICogcGl4ZWxsZW5ndGggLyB1bml0bGVuZ3RoOwogICAgICAgICAgICB9OwogICAgICAgICAgICB0aGlzLnNlcmllc19wMnUgPSBmdW5jdGlvbihwKXsKICAgICAgICAgICAgICAgIHJldHVybiBwICogdW5pdGxlbmd0aCAvIHBpeGVsbGVuZ3RoICsgbWluOwogICAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICAKICAgICAgICBlbHNlIHsKICAgICAgICAgICAgdGhpcy5zZXJpZXNfdTJwID0gZnVuY3Rpb24odSl7CiAgICAgICAgICAgICAgICByZXR1cm4gKHUgLSBtYXgpICogcGl4ZWxsZW5ndGggLyB1bml0bGVuZ3RoOwogICAgICAgICAgICB9OwogICAgICAgICAgICB0aGlzLnNlcmllc19wMnUgPSBmdW5jdGlvbihwKXsKICAgICAgICAgICAgICAgIHJldHVybiBwICogdW5pdGxlbmd0aCAvIHBpeGVsbGVuZ3RoICsgbWF4OwogICAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZiAodGhpcy5zaG93KSB7CiAgICAgICAgICAgIGlmICh0aGlzLm5hbWUgPT0gJ3hheGlzJyB8fCB0aGlzLm5hbWUgPT0gJ3gyYXhpcycpIHsKICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpPHRpY2tzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB0aWNrc1tpXTsKICAgICAgICAgICAgICAgICAgICBpZiAodC5zaG93ICYmIHQuc2hvd0xhYmVsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzaGltOwogICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQuY29uc3RydWN0b3IgPT0gJC5qcXBsb3QuQ2FudmFzQXhpc1RpY2tSZW5kZXJlciAmJiB0LmFuZ2xlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aWxsIG5lZWQgdG8gYWRqdXN0IGF1dG8gcG9zaXRpb25pbmcgYmFzZWQgb24gd2hpY2ggYXhpcyB0aGlzIGlzLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRlbXAgPSAodGhpcy5uYW1lID09ICd4YXhpcycpID8gMSA6IC0xOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh0LmxhYmVsUG9zaXRpb24pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdhdXRvJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcG9zaXRpb24gYXQgZW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ZW1wICogdC5hbmdsZSA8IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoaW0gPSAtdC5nZXRXaWR0aCgpICsgdC5fdGV4dFJlbmRlcmVyLmhlaWdodCAqIE1hdGguc2luKC10Ll90ZXh0UmVuZGVyZXIuYW5nbGUpIC8gMjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwb3NpdGlvbiBhdCBzdGFydAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoaW0gPSAtdC5fdGV4dFJlbmRlcmVyLmhlaWdodCAqIE1hdGguc2luKHQuX3RleHRSZW5kZXJlci5hbmdsZSkgLyAyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2VuZCc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoaW0gPSAtdC5nZXRXaWR0aCgpICsgdC5fdGV4dFJlbmRlcmVyLmhlaWdodCAqIE1hdGguc2luKC10Ll90ZXh0UmVuZGVyZXIuYW5nbGUpIC8gMjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnc3RhcnQnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGltID0gLXQuX3RleHRSZW5kZXJlci5oZWlnaHQgKiBNYXRoLnNpbih0Ll90ZXh0UmVuZGVyZXIuYW5nbGUpIC8gMjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnbWlkZGxlJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hpbSA9IC10LmdldFdpZHRoKCkvMiArIHQuX3RleHRSZW5kZXJlci5oZWlnaHQgKiBNYXRoLnNpbigtdC5fdGV4dFJlbmRlcmVyLmFuZ2xlKSAvIDI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoaW0gPSAtdC5nZXRXaWR0aCgpLzIgKyB0Ll90ZXh0UmVuZGVyZXIuaGVpZ2h0ICogTWF0aC5zaW4oLXQuX3RleHRSZW5kZXJlci5hbmdsZSkgLyAyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoaW0gPSAtdC5nZXRXaWR0aCgpLzI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZhbCA9IHRoaXMudTJwKHQudmFsdWUpICsgc2hpbSArICdweCc7CiAgICAgICAgICAgICAgICAgICAgICAgIHQuX2VsZW0uY3NzKCdsZWZ0JywgdmFsKTsKICAgICAgICAgICAgICAgICAgICAgICAgdC5wYWNrKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgbGFiZWxlZGdlPVsnYm90dG9tJywgMF07CiAgICAgICAgICAgICAgICBpZiAobHNob3cpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdyA9IHRoaXMuX2xhYmVsLl9lbGVtLm91dGVyV2lkdGgodHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbGFiZWwuX2VsZW0uY3NzKCdsZWZ0Jywgb2ZmbWluICsgcGl4ZWxsZW5ndGgvMiAtIHcvMiArICdweCcpOwogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm5hbWUgPT0gJ3hheGlzJykgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9sYWJlbC5fZWxlbS5jc3MoJ2JvdHRvbScsICcwcHgnKTsKICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxlZGdlID0gWydib3R0b20nLCB0aGlzLl9sYWJlbC5fZWxlbS5vdXRlckhlaWdodCh0cnVlKV07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9sYWJlbC5fZWxlbS5jc3MoJ3RvcCcsICcwcHgnKTsKICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxlZGdlID0gWyd0b3AnLCB0aGlzLl9sYWJlbC5fZWxlbS5vdXRlckhlaWdodCh0cnVlKV07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHRoaXMuX2xhYmVsLnBhY2soKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgLy8gZHJhdyB0aGUgZ3JvdXAgbGFiZWxzCiAgICAgICAgICAgICAgICB2YXIgc3RlcCA9IHBhcnNlSW50KHRoaXMuX3RpY2tzLmxlbmd0aC90aGlzLmdyb3VwcywgMTApOwogICAgICAgICAgICAgICAgZm9yIChpPTA7IGk8dGhpcy5fZ3JvdXBMYWJlbHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICB2YXIgbWlkID0gMDsKICAgICAgICAgICAgICAgICAgICB2YXIgY291bnQgPSAwOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGo9aSpzdGVwOyBqPD0oaSsxKSpzdGVwOyBqKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX3RpY2tzW2pdLl9lbGVtICYmIHRoaXMuX3RpY2tzW2pdLmxhYmVsICE9ICIgIikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB0aGlzLl90aWNrc1tqXS5fZWxlbTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwID0gdC5wb3NpdGlvbigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlkICs9IHAubGVmdCArIHQub3V0ZXJXaWR0aCh0cnVlKS8yOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQrKzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBtaWQgPSBtaWQvY291bnQ7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZ3JvdXBMYWJlbHNbaV0uY3NzKHsnbGVmdCc6KG1pZCAtIHRoaXMuX2dyb3VwTGFiZWxzW2ldLm91dGVyV2lkdGgodHJ1ZSkvMil9KTsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9ncm91cExhYmVsc1tpXS5jc3MobGFiZWxlZGdlWzBdLCBsYWJlbGVkZ2VbMV0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgZm9yIChpPTA7IGk8dGlja3MubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHRpY2tzW2ldOwogICAgICAgICAgICAgICAgICAgIGlmICh0LnNob3cgJiYgdC5zaG93TGFiZWwpIHsgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNoaW07CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0LmNvbnN0cnVjdG9yID09ICQuanFwbG90LkNhbnZhc0F4aXNUaWNrUmVuZGVyZXIgJiYgdC5hbmdsZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2lsbCBuZWVkIHRvIGFkanVzdCBhdXRvIHBvc2l0aW9uaW5nIGJhc2VkIG9uIHdoaWNoIGF4aXMgdGhpcyBpcy4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ZW1wID0gKHRoaXMubmFtZSA9PSAneWF4aXMnKSA/IDEgOiAtMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAodC5sYWJlbFBvc2l0aW9uKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnYXV0byc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBvc2l0aW9uIGF0IGVuZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2VuZCc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ZW1wICogdC5hbmdsZSA8IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoaW0gPSAtdC5fdGV4dFJlbmRlcmVyLmhlaWdodCAqIE1hdGguY29zKC10Ll90ZXh0UmVuZGVyZXIuYW5nbGUpIC8gMjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoaW0gPSAtdC5nZXRIZWlnaHQoKSArIHQuX3RleHRSZW5kZXJlci5oZWlnaHQgKiBNYXRoLmNvcyh0Ll90ZXh0UmVuZGVyZXIuYW5nbGUpIC8gMjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdzdGFydCc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0LmFuZ2xlID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hpbSA9IC10Ll90ZXh0UmVuZGVyZXIuaGVpZ2h0ICogTWF0aC5jb3MoLXQuX3RleHRSZW5kZXJlci5hbmdsZSkgLyAyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hpbSA9IC10LmdldEhlaWdodCgpICsgdC5fdGV4dFJlbmRlcmVyLmhlaWdodCAqIE1hdGguY29zKHQuX3RleHRSZW5kZXJlci5hbmdsZSkgLyAyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ21pZGRsZSc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmICh0LmFuZ2xlID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgc2hpbSA9IC10LmdldEhlaWdodCgpLzIgKyB0Ll90ZXh0UmVuZGVyZXIuaGVpZ2h0ICogTWF0aC5zaW4oLXQuX3RleHRSZW5kZXJlci5hbmdsZSkgLyAyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgc2hpbSA9IC10LmdldEhlaWdodCgpLzIgLSB0Ll90ZXh0UmVuZGVyZXIuaGVpZ2h0ICogTWF0aC5zaW4odC5fdGV4dFJlbmRlcmVyLmFuZ2xlKSAvIDI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hpbSA9IC10LmdldEhlaWdodCgpLzI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoaW0gPSAtdC5nZXRIZWlnaHQoKS8yOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoaW0gPSAtdC5nZXRIZWlnaHQoKS8yOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdmFsID0gdGhpcy51MnAodC52YWx1ZSkgKyBzaGltICsgJ3B4JzsKICAgICAgICAgICAgICAgICAgICAgICAgdC5fZWxlbS5jc3MoJ3RvcCcsIHZhbCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHQucGFjaygpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGxhYmVsZWRnZT1bJ2xlZnQnLCAwXTsKICAgICAgICAgICAgICAgIGlmIChsc2hvdykgewogICAgICAgICAgICAgICAgICAgIHZhciBoID0gdGhpcy5fbGFiZWwuX2VsZW0ub3V0ZXJIZWlnaHQodHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbGFiZWwuX2VsZW0uY3NzKCd0b3AnLCBvZmZtYXggLSBwaXhlbGxlbmd0aC8yIC0gaC8yICsgJ3B4Jyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubmFtZSA9PSAneWF4aXMnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2xhYmVsLl9lbGVtLmNzcygnbGVmdCcsICcwcHgnKTsKICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxlZGdlID0gWydsZWZ0JywgdGhpcy5fbGFiZWwuX2VsZW0ub3V0ZXJXaWR0aCh0cnVlKV07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9sYWJlbC5fZWxlbS5jc3MoJ3JpZ2h0JywgJzBweCcpOwogICAgICAgICAgICAgICAgICAgICAgICBsYWJlbGVkZ2UgPSBbJ3JpZ2h0JywgdGhpcy5fbGFiZWwuX2VsZW0ub3V0ZXJXaWR0aCh0cnVlKV07CiAgICAgICAgICAgICAgICAgICAgfSAgIAogICAgICAgICAgICAgICAgICAgIHRoaXMuX2xhYmVsLnBhY2soKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgLy8gZHJhdyB0aGUgZ3JvdXAgbGFiZWxzLCBwb3NpdGlvbiB0b3AgaGVyZSwgZG8gbGVmdCBhZnRlciBsYWJlbCBwb3NpdGlvbi4KICAgICAgICAgICAgICAgIHZhciBzdGVwID0gcGFyc2VJbnQodGhpcy5fdGlja3MubGVuZ3RoL3RoaXMuZ3JvdXBzLCAxMCk7CiAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaTx0aGlzLl9ncm91cExhYmVscy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgIHZhciBtaWQgPSAwOwogICAgICAgICAgICAgICAgICAgIHZhciBjb3VudCA9IDA7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaj1pKnN0ZXA7IGo8PShpKzEpKnN0ZXA7IGorKykgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fdGlja3Nbal0uX2VsZW0gJiYgdGhpcy5fdGlja3Nbal0ubGFiZWwgIT0gIiAiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHRoaXMuX3RpY2tzW2pdLl9lbGVtOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHAgPSB0LnBvc2l0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaWQgKz0gcC50b3AgKyB0Lm91dGVySGVpZ2h0KCkvMjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50Kys7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgbWlkID0gbWlkL2NvdW50OwogICAgICAgICAgICAgICAgICAgIHRoaXMuX2dyb3VwTGFiZWxzW2ldLmNzcyh7J3RvcCc6bWlkIC0gdGhpcy5fZ3JvdXBMYWJlbHNbaV0ub3V0ZXJIZWlnaHQoKS8yfSk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZ3JvdXBMYWJlbHNbaV0uY3NzKGxhYmVsZWRnZVswXSwgbGFiZWxlZGdlWzFdKTsKICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH07ICAgIAogICAgCiAgICAKfSkoalF1ZXJ5KTs=]]></data>
	</file>
	<file>
	  <filename>/src/plugins/jqplot.categoryAxisRenderer.min.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqCiAqIGpxUGxvdAogKiBQdXJlIEphdmFTY3JpcHQgcGxvdHRpbmcgcGx1Z2luIHVzaW5nIGpRdWVyeQogKgogKiBWZXJzaW9uOiAxLjAuMGIyX3IxMDEyCiAqCiAqIENvcHlyaWdodCAoYykgMjAwOS0yMDExIENocmlzIExlb25lbGxvCiAqIGpxUGxvdCBpcyBjdXJyZW50bHkgYXZhaWxhYmxlIGZvciB1c2UgaW4gYWxsIHBlcnNvbmFsIG9yIGNvbW1lcmNpYWwgcHJvamVjdHMgCiAqIHVuZGVyIGJvdGggdGhlIE1JVCAoaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHApIGFuZCBHUEwgCiAqIHZlcnNpb24gMi4wIChodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC5odG1sKSBsaWNlbnNlcy4gVGhpcyBtZWFucyB0aGF0IHlvdSBjYW4gCiAqIGNob29zZSB0aGUgbGljZW5zZSB0aGF0IGJlc3Qgc3VpdHMgeW91ciBwcm9qZWN0IGFuZCB1c2UgaXQgYWNjb3JkaW5nbHkuIAogKgogKiBBbHRob3VnaCBub3QgcmVxdWlyZWQsIHRoZSBhdXRob3Igd291bGQgYXBwcmVjaWF0ZSBhbiBlbWFpbCBsZXR0aW5nIGhpbSAKICoga25vdyBvZiBhbnkgc3Vic3RhbnRpYWwgdXNlIG9mIGpxUGxvdC4gIFlvdSBjYW4gcmVhY2ggdGhlIGF1dGhvciBhdDogCiAqIGNocmlzIGF0IGpxcGxvdCBkb3QgY29tIG9yIHNlZSBodHRwOi8vd3d3LmpxcGxvdC5jb20vaW5mby5waHAgLgogKgogKiBJZiB5b3UgYXJlIGZlZWxpbmcga2luZCBhbmQgZ2VuZXJvdXMsIGNvbnNpZGVyIHN1cHBvcnRpbmcgdGhlIHByb2plY3QgYnkKICogbWFraW5nIGEgZG9uYXRpb24gYXQ6IGh0dHA6Ly93d3cuanFwbG90LmNvbS9kb25hdGUucGhwIC4KICoKICogc3ByaW50ZiBmdW5jdGlvbnMgY29udGFpbmVkIGluIGpxcGxvdC5zcHJpbnRmLmpzIGJ5IEFzaCBTZWFybGU6CiAqCiAqICAgICB2ZXJzaW9uIDIwMDcuMDQuMjcKICogICAgIGF1dGhvciBBc2ggU2VhcmxlCiAqICAgICBodHRwOi8vaGV4bWVuLmNvbS9ibG9nLzIwMDcvMDMvcHJpbnRmLXNwcmludGYvCiAqICAgICBodHRwOi8vaGV4bWVuLmNvbS9qcy9zcHJpbnRmLmpzCiAqICAgICBUaGUgYXV0aG9yIChBc2ggU2VhcmxlKSBoYXMgcGxhY2VkIHRoaXMgY29kZSBpbiB0aGUgcHVibGljIGRvbWFpbjoKICogICAgICJUaGlzIGNvZGUgaXMgdW5yZXN0cmljdGVkOiB5b3UgYXJlIGZyZWUgdG8gdXNlIGl0IGhvd2V2ZXIgeW91IGxpa2UuIgogKgogKiBpbmNsdWRlZCBqc0RhdGUgbGlicmFyeSBieSBDaHJpcyBMZW9uZWxsbzoKICoKICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEgQ2hyaXMgTGVvbmVsbG8KICoKICoganNEYXRlIGlzIGN1cnJlbnRseSBhdmFpbGFibGUgZm9yIHVzZSBpbiBhbGwgcGVyc29uYWwgb3IgY29tbWVyY2lhbCBwcm9qZWN0cyAKICogdW5kZXIgYm90aCB0aGUgTUlUIGFuZCBHUEwgdmVyc2lvbiAyLjAgbGljZW5zZXMuIFRoaXMgbWVhbnMgdGhhdCB5b3UgY2FuIAogKiBjaG9vc2UgdGhlIGxpY2Vuc2UgdGhhdCBiZXN0IHN1aXRzIHlvdXIgcHJvamVjdCBhbmQgdXNlIGl0IGFjY29yZGluZ2x5LgogKgogKiBqc0RhdGUgYm9ycm93cyBtYW55IGNvbmNlcHRzIGFuZCBpZGVhcyBmcm9tIHRoZSBEYXRlIEluc3RhbmNlIAogKiBNZXRob2RzIGJ5IEtlbiBTbnlkZXIgYWxvbmcgd2l0aCBzb21lIHBhcnRzIG9mIEtlbidzIGFjdHVhbCBjb2RlLgogKiAKICogS2VuJ3Mgb3JpZ2lhbmwgRGF0ZSBJbnN0YW5jZSBNZXRob2RzIGFuZCBjb3B5cmlnaHQgbm90aWNlOgogKiAKICogS2VuIFNueWRlciAoa2VuIGQgc255ZGVyIGF0IGdtYWlsIGRvdCBjb20pCiAqIDIwMDgtMDktMTAKICogdmVyc2lvbiAyLjAuMiAoaHR0cDovL2tlbmRzbnlkZXIuY29tL3NhbmRib3gvZGF0ZS8pICAgICAKICogQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbiBMaWNlbnNlIDMuMCAoaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnkvMy4wLykKICoKICoganFwbG90VG9JbWFnZSBmdW5jdGlvbiBiYXNlZCBvbiBMYXJyeSBTaWRlbidzIGV4cG9ydC1qcXBsb3QtdG8tcG5nLmpzLgogKiBMYXJyeSBoYXMgZ2VuZXJvdXNseSBnaXZlbiBwZXJtaXNzaW9uIHRvIGFkYXB0IGhpcyBjb2RlIGZvciBpbmNsdXNpb24KICogaW50byBqcVBsb3QuCiAqCiAqIExhcnJ5J3Mgb3JpZ2luYWwgY29kZSBjYW4gYmUgZm91bmQgaGVyZToKICoKICogaHR0cHM6Ly9naXRodWIuY29tL2xzaWRlbi9leHBvcnQtanFwbG90LXRvLXBuZwogKiAKICogCiAqLwooZnVuY3Rpb24oYSl7YS5qcXBsb3QuQ2F0ZWdvcnlBeGlzUmVuZGVyZXI9ZnVuY3Rpb24oYil7YS5qcXBsb3QuTGluZWFyQXhpc1JlbmRlcmVyLmNhbGwodGhpcyk7dGhpcy5zb3J0TWVyZ2VkTGFiZWxzPWZhbHNlfTthLmpxcGxvdC5DYXRlZ29yeUF4aXNSZW5kZXJlci5wcm90b3R5cGU9bmV3IGEuanFwbG90LkxpbmVhckF4aXNSZW5kZXJlcigpO2EuanFwbG90LkNhdGVnb3J5QXhpc1JlbmRlcmVyLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1hLmpxcGxvdC5DYXRlZ29yeUF4aXNSZW5kZXJlcjthLmpxcGxvdC5DYXRlZ29yeUF4aXNSZW5kZXJlci5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbihlKXt0aGlzLmdyb3Vwcz0xO3RoaXMuZ3JvdXBMYWJlbHM9W107dGhpcy5fZ3JvdXBMYWJlbHM9W107dGhpcy5fZ3JvdXBlZD1mYWxzZTt0aGlzLl9iYXJzUGVyR3JvdXA9bnVsbDthLmV4dGVuZCh0cnVlLHRoaXMse3RpY2tPcHRpb25zOntmb3JtYXRTdHJpbmc6IiVkIn19LGUpO3ZhciBiPXRoaXMuX2RhdGFCb3VuZHM7Zm9yKHZhciBmPTA7Zjx0aGlzLl9zZXJpZXMubGVuZ3RoO2YrKyl7dmFyIGc9dGhpcy5fc2VyaWVzW2ZdO2lmKGcuZ3JvdXBzKXt0aGlzLmdyb3Vwcz1nLmdyb3Vwc312YXIgaD1nLmRhdGE7Zm9yKHZhciBjPTA7YzxoLmxlbmd0aDtjKyspe2lmKHRoaXMubmFtZT09InhheGlzInx8dGhpcy5uYW1lPT0ieDJheGlzIil7aWYoaFtjXVswXTxiLm1pbnx8Yi5taW49PW51bGwpe2IubWluPWhbY11bMF19aWYoaFtjXVswXT5iLm1heHx8Yi5tYXg9PW51bGwpe2IubWF4PWhbY11bMF19fWVsc2V7aWYoaFtjXVsxXTxiLm1pbnx8Yi5taW49PW51bGwpe2IubWluPWhbY11bMV19aWYoaFtjXVsxXT5iLm1heHx8Yi5tYXg9PW51bGwpe2IubWF4PWhbY11bMV19fX19aWYodGhpcy5ncm91cExhYmVscy5sZW5ndGgpe3RoaXMuZ3JvdXBzPXRoaXMuZ3JvdXBMYWJlbHMubGVuZ3RofX07YS5qcXBsb3QuQ2F0ZWdvcnlBeGlzUmVuZGVyZXIucHJvdG90eXBlLmNyZWF0ZVRpY2tzPWZ1bmN0aW9uKCl7dmFyIEQ9dGhpcy5fdGlja3M7dmFyIHo9dGhpcy50aWNrczt2YXIgRj10aGlzLm5hbWU7dmFyIEM9dGhpcy5fZGF0YUJvdW5kczt2YXIgdixBO3ZhciBxLHc7dmFyIGQsYzt2YXIgYix4O2lmKHoubGVuZ3RoKXtpZih0aGlzLmdyb3Vwcz4xJiYhdGhpcy5fZ3JvdXBlZCl7dmFyIHI9ei5sZW5ndGg7dmFyIHA9cGFyc2VJbnQoci90aGlzLmdyb3VwcywxMCk7dmFyIGU9MDtmb3IodmFyIHg9cDt4PHI7eCs9cCl7ei5zcGxpY2UoeCtlLDAsIiAiKTtlKyt9dGhpcy5fZ3JvdXBlZD10cnVlfXRoaXMubWluPTAuNTt0aGlzLm1heD16Lmxlbmd0aCswLjU7dmFyIG09dGhpcy5tYXgtdGhpcy5taW47dGhpcy5udW1iZXJUaWNrcz0yKnoubGVuZ3RoKzE7Zm9yKHg9MDt4PHoubGVuZ3RoO3grKyl7Yj10aGlzLm1pbisyKngqbS8odGhpcy5udW1iZXJUaWNrcy0xKTt2YXIgaD1uZXcgdGhpcy50aWNrUmVuZGVyZXIodGhpcy50aWNrT3B0aW9ucyk7aC5zaG93TGFiZWw9ZmFsc2U7aC5zZXRUaWNrKGIsdGhpcy5uYW1lKTt0aGlzLl90aWNrcy5wdXNoKGgpO3ZhciBoPW5ldyB0aGlzLnRpY2tSZW5kZXJlcih0aGlzLnRpY2tPcHRpb25zKTtoLmxhYmVsPXpbeF07aC5zaG93TWFyaz1mYWxzZTtoLnNob3dHcmlkbGluZT1mYWxzZTtoLnNldFRpY2soYiswLjUsdGhpcy5uYW1lKTt0aGlzLl90aWNrcy5wdXNoKGgpfXZhciBoPW5ldyB0aGlzLnRpY2tSZW5kZXJlcih0aGlzLnRpY2tPcHRpb25zKTtoLnNob3dMYWJlbD1mYWxzZTtoLnNldFRpY2soYisxLHRoaXMubmFtZSk7dGhpcy5fdGlja3MucHVzaChoKX1lbHNle2lmKEY9PSJ4YXhpcyJ8fEY9PSJ4MmF4aXMiKXt2PXRoaXMuX3Bsb3REaW1lbnNpb25zLndpZHRofWVsc2V7dj10aGlzLl9wbG90RGltZW5zaW9ucy5oZWlnaHR9aWYodGhpcy5taW4hPW51bGwmJnRoaXMubWF4IT1udWxsJiZ0aGlzLm51bWJlclRpY2tzIT1udWxsKXt0aGlzLnRpY2tJbnRlcnZhbD1udWxsfWlmKHRoaXMubWluIT1udWxsJiZ0aGlzLm1heCE9bnVsbCYmdGhpcy50aWNrSW50ZXJ2YWwhPW51bGwpe2lmKHBhcnNlSW50KCh0aGlzLm1heC10aGlzLm1pbikvdGhpcy50aWNrSW50ZXJ2YWwsMTApIT0odGhpcy5tYXgtdGhpcy5taW4pL3RoaXMudGlja0ludGVydmFsKXt0aGlzLnRpY2tJbnRlcnZhbD1udWxsfX12YXIgeT1bXTt2YXIgQj0wO3ZhciBxPTAuNTt2YXIgdyxFO3ZhciBmPWZhbHNlO2Zvcih2YXIgeD0wO3g8dGhpcy5fc2VyaWVzLmxlbmd0aDt4Kyspe3ZhciBrPXRoaXMuX3Nlcmllc1t4XTtmb3IodmFyIHU9MDt1PGsuZGF0YS5sZW5ndGg7dSsrKXtpZih0aGlzLm5hbWU9PSJ4YXhpcyJ8fHRoaXMubmFtZT09IngyYXhpcyIpe0U9ay5kYXRhW3VdWzBdfWVsc2V7RT1rLmRhdGFbdV1bMV19aWYoYS5pbkFycmF5KEUseSk9PS0xKXtmPXRydWU7Qis9MTt5LnB1c2goRSl9fX1pZihmJiZ0aGlzLnNvcnRNZXJnZWRMYWJlbHMpe3kuc29ydChmdW5jdGlvbihqLGkpe3JldHVybiBqLWl9KX10aGlzLnRpY2tzPXk7Zm9yKHZhciB4PTA7eDx0aGlzLl9zZXJpZXMubGVuZ3RoO3grKyl7dmFyIGs9dGhpcy5fc2VyaWVzW3hdO2Zvcih2YXIgdT0wO3U8ay5kYXRhLmxlbmd0aDt1Kyspe2lmKHRoaXMubmFtZT09InhheGlzInx8dGhpcy5uYW1lPT0ieDJheGlzIil7RT1rLmRhdGFbdV1bMF19ZWxzZXtFPWsuZGF0YVt1XVsxXX12YXIgbj1hLmluQXJyYXkoRSx5KSsxO2lmKHRoaXMubmFtZT09InhheGlzInx8dGhpcy5uYW1lPT0ieDJheGlzIil7ay5kYXRhW3VdWzBdPW59ZWxzZXtrLmRhdGFbdV1bMV09bn19fWlmKHRoaXMuZ3JvdXBzPjEmJiF0aGlzLl9ncm91cGVkKXt2YXIgcj15Lmxlbmd0aDt2YXIgcD1wYXJzZUludChyL3RoaXMuZ3JvdXBzLDEwKTt2YXIgZT0wO2Zvcih2YXIgeD1wO3g8cjt4Kz1wKzEpe3lbeF09IiAifXRoaXMuX2dyb3VwZWQ9dHJ1ZX13PUIrMC41O2lmKHRoaXMubnVtYmVyVGlja3M9PW51bGwpe3RoaXMubnVtYmVyVGlja3M9MipCKzF9dmFyIG09dy1xO3RoaXMubWluPXE7dGhpcy5tYXg9dzt2YXIgbz0wO3ZhciBnPXBhcnNlSW50KDMrdi8xMCwxMCk7dmFyIHA9cGFyc2VJbnQoQi9nLDEwKTtpZih0aGlzLnRpY2tJbnRlcnZhbD09bnVsbCl7dGhpcy50aWNrSW50ZXJ2YWw9bS8odGhpcy5udW1iZXJUaWNrcy0xKX1mb3IodmFyIHg9MDt4PHRoaXMubnVtYmVyVGlja3M7eCsrKXtiPXRoaXMubWluK3gqdGhpcy50aWNrSW50ZXJ2YWw7dmFyIGg9bmV3IHRoaXMudGlja1JlbmRlcmVyKHRoaXMudGlja09wdGlvbnMpO2lmKHgvMj09cGFyc2VJbnQoeC8yLDEwKSl7aC5zaG93TGFiZWw9ZmFsc2U7aC5zaG93TWFyaz10cnVlfWVsc2V7aWYocD4wJiZvPHApe2guc2hvd0xhYmVsPWZhbHNlO28rPTF9ZWxzZXtoLnNob3dMYWJlbD10cnVlO289MH1oLmxhYmVsPWguZm9ybWF0dGVyKGguZm9ybWF0U3RyaW5nLHlbKHgtMSkvMl0pO2guc2hvd01hcms9ZmFsc2U7aC5zaG93R3JpZGxpbmU9ZmFsc2V9aC5zZXRUaWNrKGIsdGhpcy5uYW1lKTt0aGlzLl90aWNrcy5wdXNoKGgpfX19O2EuanFwbG90LkNhdGVnb3J5QXhpc1JlbmRlcmVyLnByb3RvdHlwZS5kcmF3PWZ1bmN0aW9uKGIsail7aWYodGhpcy5zaG93KXt0aGlzLnJlbmRlcmVyLmNyZWF0ZVRpY2tzLmNhbGwodGhpcyk7dmFyIGg9MDt2YXIgYztpZih0aGlzLl9lbGVtKXt0aGlzLl9lbGVtLmVtcHR5Rm9yY2UoKX10aGlzLl9lbGVtPXRoaXMuX2VsZW18fGEoJzxkaXYgY2xhc3M9ImpxcGxvdC1heGlzIGpxcGxvdC0nK3RoaXMubmFtZSsnIiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7Ij48L2Rpdj4nKTtpZih0aGlzLm5hbWU9PSJ4YXhpcyJ8fHRoaXMubmFtZT09IngyYXhpcyIpe3RoaXMuX2VsZW0ud2lkdGgodGhpcy5fcGxvdERpbWVuc2lvbnMud2lkdGgpfWVsc2V7dGhpcy5fZWxlbS5oZWlnaHQodGhpcy5fcGxvdERpbWVuc2lvbnMuaGVpZ2h0KX10aGlzLmxhYmVsT3B0aW9ucy5heGlzPXRoaXMubmFtZTt0aGlzLl9sYWJlbD1uZXcgdGhpcy5sYWJlbFJlbmRlcmVyKHRoaXMubGFiZWxPcHRpb25zKTtpZih0aGlzLl9sYWJlbC5zaG93KXt2YXIgZz10aGlzLl9sYWJlbC5kcmF3KGIsaik7Zy5hcHBlbmRUbyh0aGlzLl9lbGVtKX12YXIgZj10aGlzLl90aWNrcztmb3IodmFyIGU9MDtlPGYubGVuZ3RoO2UrKyl7dmFyIGQ9ZltlXTtpZihkLnNob3dMYWJlbCYmKCFkLmlzTWlub3JUaWNrfHx0aGlzLnNob3dNaW5vclRpY2tzKSl7dmFyIGc9ZC5kcmF3KGIsaik7Zy5hcHBlbmRUbyh0aGlzLl9lbGVtKX19dGhpcy5fZ3JvdXBMYWJlbHM9W107Zm9yKHZhciBlPTA7ZTx0aGlzLmdyb3VwTGFiZWxzLmxlbmd0aDtlKyspe3ZhciBnPWEoJzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlOyIgY2xhc3M9ImpxcGxvdC0nK3RoaXMubmFtZSsnLWdyb3VwTGFiZWwiPjwvZGl2PicpO2cuaHRtbCh0aGlzLmdyb3VwTGFiZWxzW2VdKTt0aGlzLl9ncm91cExhYmVscy5wdXNoKGcpO2cuYXBwZW5kVG8odGhpcy5fZWxlbSl9fXJldHVybiB0aGlzLl9lbGVtfTthLmpxcGxvdC5DYXRlZ29yeUF4aXNSZW5kZXJlci5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uKCl7dmFyIGU9MDt2YXIgbTt2YXIgaz0wO3ZhciBmPTA7dmFyIGQ9KHRoaXMuX2xhYmVsPT1udWxsKT9mYWxzZTp0aGlzLl9sYWJlbC5zaG93O2lmKHRoaXMuc2hvdyl7dmFyIG49dGhpcy5fdGlja3M7Zm9yKHZhciBjPTA7YzxuLmxlbmd0aDtjKyspe3ZhciBnPW5bY107aWYoZy5zaG93TGFiZWwmJighZy5pc01pbm9yVGlja3x8dGhpcy5zaG93TWlub3JUaWNrcykpe2lmKHRoaXMubmFtZT09InhheGlzInx8dGhpcy5uYW1lPT0ieDJheGlzIil7bT1nLl9lbGVtLm91dGVySGVpZ2h0KHRydWUpfWVsc2V7bT1nLl9lbGVtLm91dGVyV2lkdGgodHJ1ZSl9aWYobT5lKXtlPW19fX12YXIgaj0wO2Zvcih2YXIgYz0wO2M8dGhpcy5fZ3JvdXBMYWJlbHMubGVuZ3RoO2MrKyl7dmFyIGI9dGhpcy5fZ3JvdXBMYWJlbHNbY107aWYodGhpcy5uYW1lPT0ieGF4aXMifHx0aGlzLm5hbWU9PSJ4MmF4aXMiKXttPWIub3V0ZXJIZWlnaHQodHJ1ZSl9ZWxzZXttPWIub3V0ZXJXaWR0aCh0cnVlKX1pZihtPmope2o9bX19aWYoZCl7az10aGlzLl9sYWJlbC5fZWxlbS5vdXRlcldpZHRoKHRydWUpO2Y9dGhpcy5fbGFiZWwuX2VsZW0ub3V0ZXJIZWlnaHQodHJ1ZSl9aWYodGhpcy5uYW1lPT0ieGF4aXMiKXtlKz1qK2Y7dGhpcy5fZWxlbS5jc3Moe2hlaWdodDplKyJweCIsbGVmdDoiMHB4Iixib3R0b206IjBweCJ9KX1lbHNle2lmKHRoaXMubmFtZT09IngyYXhpcyIpe2UrPWorZjt0aGlzLl9lbGVtLmNzcyh7aGVpZ2h0OmUrInB4IixsZWZ0OiIwcHgiLHRvcDoiMHB4In0pfWVsc2V7aWYodGhpcy5uYW1lPT0ieWF4aXMiKXtlKz1qK2s7dGhpcy5fZWxlbS5jc3Moe3dpZHRoOmUrInB4IixsZWZ0OiIwcHgiLHRvcDoiMHB4In0pO2lmKGQmJnRoaXMuX2xhYmVsLmNvbnN0cnVjdG9yPT1hLmpxcGxvdC5BeGlzTGFiZWxSZW5kZXJlcil7dGhpcy5fbGFiZWwuX2VsZW0uY3NzKCJ3aWR0aCIsaysicHgiKX19ZWxzZXtlKz1qK2s7dGhpcy5fZWxlbS5jc3Moe3dpZHRoOmUrInB4IixyaWdodDoiMHB4Iix0b3A6IjBweCJ9KTtpZihkJiZ0aGlzLl9sYWJlbC5jb25zdHJ1Y3Rvcj09YS5qcXBsb3QuQXhpc0xhYmVsUmVuZGVyZXIpe3RoaXMuX2xhYmVsLl9lbGVtLmNzcygid2lkdGgiLGsrInB4Iil9fX19fX07YS5qcXBsb3QuQ2F0ZWdvcnlBeGlzUmVuZGVyZXIucHJvdG90eXBlLnBhY2s9ZnVuY3Rpb24oZSxjKXt2YXIgQz10aGlzLl90aWNrczt2YXIgdj10aGlzLm1heDt2YXIgcz10aGlzLm1pbjt2YXIgbj1jLm1heDt2YXIgbD1jLm1pbjt2YXIgcT0odGhpcy5fbGFiZWw9PW51bGwpP2ZhbHNlOnRoaXMuX2xhYmVsLnNob3c7dmFyIHg7Zm9yKHZhciByIGluIGUpe3RoaXMuX2VsZW0uY3NzKHIsZVtyXSl9dGhpcy5fb2Zmc2V0cz1jO3ZhciBnPW4tbDt2YXIgaz12LXM7dGhpcy5wMnU9ZnVuY3Rpb24oaCl7cmV0dXJuKGgtbCkqay9nK3N9O3RoaXMudTJwPWZ1bmN0aW9uKGgpe3JldHVybihoLXMpKmcvaytsfTtpZih0aGlzLm5hbWU9PSJ4YXhpcyJ8fHRoaXMubmFtZT09IngyYXhpcyIpe3RoaXMuc2VyaWVzX3UycD1mdW5jdGlvbihoKXtyZXR1cm4oaC1zKSpnL2t9O3RoaXMuc2VyaWVzX3AydT1mdW5jdGlvbihoKXtyZXR1cm4gaCprL2crc319ZWxzZXt0aGlzLnNlcmllc191MnA9ZnVuY3Rpb24oaCl7cmV0dXJuKGgtdikqZy9rfTt0aGlzLnNlcmllc19wMnU9ZnVuY3Rpb24oaCl7cmV0dXJuIGgqay9nK3Z9fWlmKHRoaXMuc2hvdyl7aWYodGhpcy5uYW1lPT0ieGF4aXMifHx0aGlzLm5hbWU9PSJ4MmF4aXMiKXtmb3IoeD0wO3g8Qy5sZW5ndGg7eCsrKXt2YXIgbz1DW3hdO2lmKG8uc2hvdyYmby5zaG93TGFiZWwpe3ZhciBiO2lmKG8uY29uc3RydWN0b3I9PWEuanFwbG90LkNhbnZhc0F4aXNUaWNrUmVuZGVyZXImJm8uYW5nbGUpe3ZhciBBPSh0aGlzLm5hbWU9PSJ4YXhpcyIpPzE6LTE7c3dpdGNoKG8ubGFiZWxQb3NpdGlvbil7Y2FzZSJhdXRvIjppZihBKm8uYW5nbGU8MCl7Yj0tby5nZXRXaWR0aCgpK28uX3RleHRSZW5kZXJlci5oZWlnaHQqTWF0aC5zaW4oLW8uX3RleHRSZW5kZXJlci5hbmdsZSkvMn1lbHNle2I9LW8uX3RleHRSZW5kZXJlci5oZWlnaHQqTWF0aC5zaW4oby5fdGV4dFJlbmRlcmVyLmFuZ2xlKS8yfWJyZWFrO2Nhc2UiZW5kIjpiPS1vLmdldFdpZHRoKCkrby5fdGV4dFJlbmRlcmVyLmhlaWdodCpNYXRoLnNpbigtby5fdGV4dFJlbmRlcmVyLmFuZ2xlKS8yO2JyZWFrO2Nhc2Uic3RhcnQiOmI9LW8uX3RleHRSZW5kZXJlci5oZWlnaHQqTWF0aC5zaW4oby5fdGV4dFJlbmRlcmVyLmFuZ2xlKS8yO2JyZWFrO2Nhc2UibWlkZGxlIjpiPS1vLmdldFdpZHRoKCkvMitvLl90ZXh0UmVuZGVyZXIuaGVpZ2h0Kk1hdGguc2luKC1vLl90ZXh0UmVuZGVyZXIuYW5nbGUpLzI7YnJlYWs7ZGVmYXVsdDpiPS1vLmdldFdpZHRoKCkvMitvLl90ZXh0UmVuZGVyZXIuaGVpZ2h0Kk1hdGguc2luKC1vLl90ZXh0UmVuZGVyZXIuYW5nbGUpLzI7YnJlYWt9fWVsc2V7Yj0tby5nZXRXaWR0aCgpLzJ9dmFyIEQ9dGhpcy51MnAoby52YWx1ZSkrYisicHgiO28uX2VsZW0uY3NzKCJsZWZ0IixEKTtvLnBhY2soKX19dmFyIHo9WyJib3R0b20iLDBdO2lmKHEpe3ZhciBtPXRoaXMuX2xhYmVsLl9lbGVtLm91dGVyV2lkdGgodHJ1ZSk7dGhpcy5fbGFiZWwuX2VsZW0uY3NzKCJsZWZ0IixsK2cvMi1tLzIrInB4Iik7aWYodGhpcy5uYW1lPT0ieGF4aXMiKXt0aGlzLl9sYWJlbC5fZWxlbS5jc3MoImJvdHRvbSIsIjBweCIpO3o9WyJib3R0b20iLHRoaXMuX2xhYmVsLl9lbGVtLm91dGVySGVpZ2h0KHRydWUpXX1lbHNle3RoaXMuX2xhYmVsLl9lbGVtLmNzcygidG9wIiwiMHB4Iik7ej1bInRvcCIsdGhpcy5fbGFiZWwuX2VsZW0ub3V0ZXJIZWlnaHQodHJ1ZSldfXRoaXMuX2xhYmVsLnBhY2soKX12YXIgZD1wYXJzZUludCh0aGlzLl90aWNrcy5sZW5ndGgvdGhpcy5ncm91cHMsMTApO2Zvcih4PTA7eDx0aGlzLl9ncm91cExhYmVscy5sZW5ndGg7eCsrKXt2YXIgQj0wO3ZhciBmPTA7Zm9yKHZhciB1PXgqZDt1PD0oeCsxKSpkO3UrKyl7aWYodGhpcy5fdGlja3NbdV0uX2VsZW0mJnRoaXMuX3RpY2tzW3VdLmxhYmVsIT0iICIpe3ZhciBvPXRoaXMuX3RpY2tzW3VdLl9lbGVtO3ZhciByPW8ucG9zaXRpb24oKTtCKz1yLmxlZnQrby5vdXRlcldpZHRoKHRydWUpLzI7ZisrfX1CPUIvZjt0aGlzLl9ncm91cExhYmVsc1t4XS5jc3Moe2xlZnQ6KEItdGhpcy5fZ3JvdXBMYWJlbHNbeF0ub3V0ZXJXaWR0aCh0cnVlKS8yKX0pO3RoaXMuX2dyb3VwTGFiZWxzW3hdLmNzcyh6WzBdLHpbMV0pfX1lbHNle2Zvcih4PTA7eDxDLmxlbmd0aDt4Kyspe3ZhciBvPUNbeF07aWYoby5zaG93JiZvLnNob3dMYWJlbCl7dmFyIGI7aWYoby5jb25zdHJ1Y3Rvcj09YS5qcXBsb3QuQ2FudmFzQXhpc1RpY2tSZW5kZXJlciYmby5hbmdsZSl7dmFyIEE9KHRoaXMubmFtZT09InlheGlzIik/MTotMTtzd2l0Y2goby5sYWJlbFBvc2l0aW9uKXtjYXNlImF1dG8iOmNhc2UiZW5kIjppZihBKm8uYW5nbGU8MCl7Yj0tby5fdGV4dFJlbmRlcmVyLmhlaWdodCpNYXRoLmNvcygtby5fdGV4dFJlbmRlcmVyLmFuZ2xlKS8yfWVsc2V7Yj0tby5nZXRIZWlnaHQoKStvLl90ZXh0UmVuZGVyZXIuaGVpZ2h0Kk1hdGguY29zKG8uX3RleHRSZW5kZXJlci5hbmdsZSkvMn1icmVhaztjYXNlInN0YXJ0IjppZihvLmFuZ2xlPjApe2I9LW8uX3RleHRSZW5kZXJlci5oZWlnaHQqTWF0aC5jb3MoLW8uX3RleHRSZW5kZXJlci5hbmdsZSkvMn1lbHNle2I9LW8uZ2V0SGVpZ2h0KCkrby5fdGV4dFJlbmRlcmVyLmhlaWdodCpNYXRoLmNvcyhvLl90ZXh0UmVuZGVyZXIuYW5nbGUpLzJ9YnJlYWs7Y2FzZSJtaWRkbGUiOmI9LW8uZ2V0SGVpZ2h0KCkvMjticmVhaztkZWZhdWx0OmI9LW8uZ2V0SGVpZ2h0KCkvMjticmVha319ZWxzZXtiPS1vLmdldEhlaWdodCgpLzJ9dmFyIEQ9dGhpcy51MnAoby52YWx1ZSkrYisicHgiO28uX2VsZW0uY3NzKCJ0b3AiLEQpO28ucGFjaygpfX12YXIgej1bImxlZnQiLDBdO2lmKHEpe3ZhciB5PXRoaXMuX2xhYmVsLl9lbGVtLm91dGVySGVpZ2h0KHRydWUpO3RoaXMuX2xhYmVsLl9lbGVtLmNzcygidG9wIixuLWcvMi15LzIrInB4Iik7aWYodGhpcy5uYW1lPT0ieWF4aXMiKXt0aGlzLl9sYWJlbC5fZWxlbS5jc3MoImxlZnQiLCIwcHgiKTt6PVsibGVmdCIsdGhpcy5fbGFiZWwuX2VsZW0ub3V0ZXJXaWR0aCh0cnVlKV19ZWxzZXt0aGlzLl9sYWJlbC5fZWxlbS5jc3MoInJpZ2h0IiwiMHB4Iik7ej1bInJpZ2h0Iix0aGlzLl9sYWJlbC5fZWxlbS5vdXRlcldpZHRoKHRydWUpXX10aGlzLl9sYWJlbC5wYWNrKCl9dmFyIGQ9cGFyc2VJbnQodGhpcy5fdGlja3MubGVuZ3RoL3RoaXMuZ3JvdXBzLDEwKTtmb3IoeD0wO3g8dGhpcy5fZ3JvdXBMYWJlbHMubGVuZ3RoO3grKyl7dmFyIEI9MDt2YXIgZj0wO2Zvcih2YXIgdT14KmQ7dTw9KHgrMSkqZDt1Kyspe2lmKHRoaXMuX3RpY2tzW3VdLl9lbGVtJiZ0aGlzLl90aWNrc1t1XS5sYWJlbCE9IiAiKXt2YXIgbz10aGlzLl90aWNrc1t1XS5fZWxlbTt2YXIgcj1vLnBvc2l0aW9uKCk7Qis9ci50b3Arby5vdXRlckhlaWdodCgpLzI7ZisrfX1CPUIvZjt0aGlzLl9ncm91cExhYmVsc1t4XS5jc3Moe3RvcDpCLXRoaXMuX2dyb3VwTGFiZWxzW3hdLm91dGVySGVpZ2h0KCkvMn0pO3RoaXMuX2dyb3VwTGFiZWxzW3hdLmNzcyh6WzBdLHpbMV0pfX19fX0pKGpRdWVyeSk7]]></data>
	</file>
	<file>
	  <filename>/src/plugins/jqplot.ciParser.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqCiAqIGpxUGxvdAogKiBQdXJlIEphdmFTY3JpcHQgcGxvdHRpbmcgcGx1Z2luIHVzaW5nIGpRdWVyeQogKgogKiBWZXJzaW9uOiAxLjAuMGIyX3IxMDEyCiAqCiAqIENvcHlyaWdodCAoYykgMjAwOS0yMDExIENocmlzIExlb25lbGxvCiAqIGpxUGxvdCBpcyBjdXJyZW50bHkgYXZhaWxhYmxlIGZvciB1c2UgaW4gYWxsIHBlcnNvbmFsIG9yIGNvbW1lcmNpYWwgcHJvamVjdHMgCiAqIHVuZGVyIGJvdGggdGhlIE1JVCAoaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHApIGFuZCBHUEwgCiAqIHZlcnNpb24gMi4wIChodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC5odG1sKSBsaWNlbnNlcy4gVGhpcyBtZWFucyB0aGF0IHlvdSBjYW4gCiAqIGNob29zZSB0aGUgbGljZW5zZSB0aGF0IGJlc3Qgc3VpdHMgeW91ciBwcm9qZWN0IGFuZCB1c2UgaXQgYWNjb3JkaW5nbHkuIAogKgogKiBBbHRob3VnaCBub3QgcmVxdWlyZWQsIHRoZSBhdXRob3Igd291bGQgYXBwcmVjaWF0ZSBhbiBlbWFpbCBsZXR0aW5nIGhpbSAKICoga25vdyBvZiBhbnkgc3Vic3RhbnRpYWwgdXNlIG9mIGpxUGxvdC4gIFlvdSBjYW4gcmVhY2ggdGhlIGF1dGhvciBhdDogCiAqIGNocmlzIGF0IGpxcGxvdCBkb3QgY29tIG9yIHNlZSBodHRwOi8vd3d3LmpxcGxvdC5jb20vaW5mby5waHAgLgogKgogKiBJZiB5b3UgYXJlIGZlZWxpbmcga2luZCBhbmQgZ2VuZXJvdXMsIGNvbnNpZGVyIHN1cHBvcnRpbmcgdGhlIHByb2plY3QgYnkKICogbWFraW5nIGEgZG9uYXRpb24gYXQ6IGh0dHA6Ly93d3cuanFwbG90LmNvbS9kb25hdGUucGhwIC4KICoKICogc3ByaW50ZiBmdW5jdGlvbnMgY29udGFpbmVkIGluIGpxcGxvdC5zcHJpbnRmLmpzIGJ5IEFzaCBTZWFybGU6CiAqCiAqICAgICB2ZXJzaW9uIDIwMDcuMDQuMjcKICogICAgIGF1dGhvciBBc2ggU2VhcmxlCiAqICAgICBodHRwOi8vaGV4bWVuLmNvbS9ibG9nLzIwMDcvMDMvcHJpbnRmLXNwcmludGYvCiAqICAgICBodHRwOi8vaGV4bWVuLmNvbS9qcy9zcHJpbnRmLmpzCiAqICAgICBUaGUgYXV0aG9yIChBc2ggU2VhcmxlKSBoYXMgcGxhY2VkIHRoaXMgY29kZSBpbiB0aGUgcHVibGljIGRvbWFpbjoKICogICAgICJUaGlzIGNvZGUgaXMgdW5yZXN0cmljdGVkOiB5b3UgYXJlIGZyZWUgdG8gdXNlIGl0IGhvd2V2ZXIgeW91IGxpa2UuIgogKiAKICovCihmdW5jdGlvbigkKSB7CiAgICAvKioKICAgICAqIENsYXNzOiAkLmpxcGxvdC5jaVBhcnNlcgogICAgICogRGF0YSBSZW5kZXJlciBmdW5jdGlvbiB3aGljaCBjb252ZXJ0cyBhIGN1c3RvbSBKU09OIGRhdGEgb2JqZWN0IGludG8ganFQbG90IGRhdGEgZm9ybWF0LgogICAgICogU2V0IHRoaXMgYXMgYSBjYWxsYWJsZSBvbiB0aGUganFwbG90IGRhdGFSZW5kZXJlciBwbG90IG9wdGlvbjoKICAgICAqIAogICAgICogPiBwbG90ID0gJC5qcXBsb3QoJ215Y2hhcnQnLCBbZGF0YV0sIHsgZGF0YVJlbmRlcmVyOiAkLmpxcGxvdC5jaVBhcnNlciwgLi4uIH0pOwogICAgICogCiAgICAgKiBXaGVyZSBkYXRhIGlzIGFuIG9iamVjdCBpbiBKU09OIGZvcm1hdCBvciBhIEpTT04gZW5jb2RlZCBzdHJpbmcgY29uZm9ybWluZyB0byB0aGUKICAgICAqIENpdHkgSW5kZXggQVBJIHNwZWMuCiAgICAgKiAKICAgICAqIE5vdGUgdGhhdCBjYWxsaW5nIHRoZSByZW5kZXJlciBmdW5jdGlvbiBpcyBoYW5kbGVkIGludGVybmFsbHkgYnkganFQbG90LiAgVGhlCiAgICAgKiB1c2VyIGRvZXMgbm90IGhhdmUgdG8gY2FsbCB0aGUgZnVuY3Rpb24uICBUaGUgcGFyYW1ldGVycyBkZXNjcmliZWQgYmVsb3cgd2lsbAogICAgICogYXV0b21hdGljYWxseSBiZSBwYXNzZWQgdG8gdGhlIGNpUGFyc2VyIGZ1bmN0aW9uLgogICAgICogCiAgICAgKiBQYXJhbWV0ZXJzOgogICAgICogZGF0YSAtIEpTT04gZW5jb2RlZCBzdHJpbmcgb3Igb2JqZWN0LgogICAgICogcGxvdCAtIHJlZmVyZW5jZSB0byBqcVBsb3QgUGxvdCBvYmplY3QuCiAgICAgKiAKICAgICAqIFJldHVybnM6CiAgICAgKiBkYXRhIGFycmF5IGluIGpxUGxvdCBmb3JtYXQuCiAgICAgKiAKICAgICAqLwogICAgJC5qcXBsb3QuY2lQYXJzZXIgPSBmdW5jdGlvbiAoZGF0YSwgcGxvdCkgewogICAgICAgIHZhciByZXQgPSBbXSwKICAgICAgICAgICAgbGluZSwKCQkJdGVtcCwKICAgICAgICAgICAgaSwgaiwgaywga2s7CiAgICAKICAgICAgICAgaWYgKHR5cGVvZihkYXRhKSA9PSAic3RyaW5nIikgewogICAgICAgICAgICAgZGF0YSA9ICAkLmpxcGxvdC5KU09OLnBhcnNlKGRhdGEsIGhhbmRsZVN0cmluZ3MpOwogICAgICAgICB9CiAKICAgICAgICAgZWxzZSBpZiAodHlwZW9mKGRhdGEpID09ICJvYmplY3QiKSB7CiAgICAgICAgICAgICBmb3IgKGsgaW4gZGF0YSkgewogICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpPGRhdGFba10ubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgZm9yIChrayBpbiBkYXRhW2tdW2ldKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhW2tdW2ldW2trXSA9IGhhbmRsZVN0cmluZ3Moa2ssIGRhdGFba11baV1ba2tdKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgIH0KIAogICAgICAgICAvLyBmdW5jdGlvbiBoYW5kbGVTdHJpbmdzCiAgICAgICAgIC8vIENoZWNrcyBhbnkgSlNPTiBlbmNvZGVkIHN0cmluZ3MgdG8gc2VlIGlmIHRoZXkgYXJlCiAgICAgICAgIC8vIGVuY29kZWQgZGF0ZXMuICBJZiBzbywgcHVsbCBvdXQgdGhlIHRpbWVzdGFtcC4KICAgICAgICAgLy8gRXhwZWN0cyBkYXRlcyB0byBiZSByZXByZXNlbnRlZCBieSBqcyB0aW1lc3RhbXBzLgogCiAgICAgICAgIGZ1bmN0aW9uIGhhbmRsZVN0cmluZ3Moa2V5LCB2YWx1ZSkgewogICAgICAgICAgICB2YXIgYTsKICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIGlmICh2YWx1ZS50b1N0cmluZygpLmluZGV4T2YoJ0RhdGUnKSA+PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgLy9oZXJlIHdlIHdpbGwgdHJ5IHRvIGV4dHJhY3QgdGhlIHRpY2tzIGZyb20gdGhlIERhdGUgc3RyaW5nIGluIHRoZSAidmFsdWUiIGZpZWxkcyBvZiBKU09OIHJldHVybmVkIGRhdGEKICAgICAgICAgICAgICAgICAgICBhID0gL15cL0RhdGVcKCgtP1swLTldKylcKVwvJC8uZXhlYyh2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlSW50KGFbMV0sIDEwKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgZm9yICh2YXIgcHJvcCBpbiBkYXRhKSB7CiAgICAgICAgICAgIGxpbmUgPSBbXTsKICAgICAgICAgICAgdGVtcCA9IGRhdGFbcHJvcF07CiAgICAgICAgICAgIHN3aXRjaCAocHJvcCkgewogICAgICAgICAgICAgICAgY2FzZSAiUHJpY2VUaWNrcyI6CiAgICAgICAgICAgICAgICAgICAgZm9yIChpPTA7IGk8dGVtcC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICBsaW5lLnB1c2goW3RlbXBbaV1bJ1RpY2tEYXRlJ10sIHRlbXBbaV1bJ1ByaWNlJ11dKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICJQcmljZUJhcnMiOgogICAgICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpPHRlbXAubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgbGluZS5wdXNoKFt0ZW1wW2ldWydCYXJEYXRlJ10sIHRlbXBbaV1bJ09wZW4nXSwgdGVtcFtpXVsnSGlnaCddLCB0ZW1wW2ldWydMb3cnXSwgdGVtcFtpXVsnQ2xvc2UnXV0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXQucHVzaChsaW5lKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJldDsKICAgIH07Cn0pKGpRdWVyeSk7]]></data>
	</file>
	<file>
	  <filename>/src/plugins/jqplot.ciParser.min.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqCiAqIGpxUGxvdAogKiBQdXJlIEphdmFTY3JpcHQgcGxvdHRpbmcgcGx1Z2luIHVzaW5nIGpRdWVyeQogKgogKiBWZXJzaW9uOiAxLjAuMGIyX3IxMDEyCiAqCiAqIENvcHlyaWdodCAoYykgMjAwOS0yMDExIENocmlzIExlb25lbGxvCiAqIGpxUGxvdCBpcyBjdXJyZW50bHkgYXZhaWxhYmxlIGZvciB1c2UgaW4gYWxsIHBlcnNvbmFsIG9yIGNvbW1lcmNpYWwgcHJvamVjdHMgCiAqIHVuZGVyIGJvdGggdGhlIE1JVCAoaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHApIGFuZCBHUEwgCiAqIHZlcnNpb24gMi4wIChodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC5odG1sKSBsaWNlbnNlcy4gVGhpcyBtZWFucyB0aGF0IHlvdSBjYW4gCiAqIGNob29zZSB0aGUgbGljZW5zZSB0aGF0IGJlc3Qgc3VpdHMgeW91ciBwcm9qZWN0IGFuZCB1c2UgaXQgYWNjb3JkaW5nbHkuIAogKgogKiBBbHRob3VnaCBub3QgcmVxdWlyZWQsIHRoZSBhdXRob3Igd291bGQgYXBwcmVjaWF0ZSBhbiBlbWFpbCBsZXR0aW5nIGhpbSAKICoga25vdyBvZiBhbnkgc3Vic3RhbnRpYWwgdXNlIG9mIGpxUGxvdC4gIFlvdSBjYW4gcmVhY2ggdGhlIGF1dGhvciBhdDogCiAqIGNocmlzIGF0IGpxcGxvdCBkb3QgY29tIG9yIHNlZSBodHRwOi8vd3d3LmpxcGxvdC5jb20vaW5mby5waHAgLgogKgogKiBJZiB5b3UgYXJlIGZlZWxpbmcga2luZCBhbmQgZ2VuZXJvdXMsIGNvbnNpZGVyIHN1cHBvcnRpbmcgdGhlIHByb2plY3QgYnkKICogbWFraW5nIGEgZG9uYXRpb24gYXQ6IGh0dHA6Ly93d3cuanFwbG90LmNvbS9kb25hdGUucGhwIC4KICoKICogc3ByaW50ZiBmdW5jdGlvbnMgY29udGFpbmVkIGluIGpxcGxvdC5zcHJpbnRmLmpzIGJ5IEFzaCBTZWFybGU6CiAqCiAqICAgICB2ZXJzaW9uIDIwMDcuMDQuMjcKICogICAgIGF1dGhvciBBc2ggU2VhcmxlCiAqICAgICBodHRwOi8vaGV4bWVuLmNvbS9ibG9nLzIwMDcvMDMvcHJpbnRmLXNwcmludGYvCiAqICAgICBodHRwOi8vaGV4bWVuLmNvbS9qcy9zcHJpbnRmLmpzCiAqICAgICBUaGUgYXV0aG9yIChBc2ggU2VhcmxlKSBoYXMgcGxhY2VkIHRoaXMgY29kZSBpbiB0aGUgcHVibGljIGRvbWFpbjoKICogICAgICJUaGlzIGNvZGUgaXMgdW5yZXN0cmljdGVkOiB5b3UgYXJlIGZyZWUgdG8gdXNlIGl0IGhvd2V2ZXIgeW91IGxpa2UuIgogKgogKiBpbmNsdWRlZCBqc0RhdGUgbGlicmFyeSBieSBDaHJpcyBMZW9uZWxsbzoKICoKICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEgQ2hyaXMgTGVvbmVsbG8KICoKICoganNEYXRlIGlzIGN1cnJlbnRseSBhdmFpbGFibGUgZm9yIHVzZSBpbiBhbGwgcGVyc29uYWwgb3IgY29tbWVyY2lhbCBwcm9qZWN0cyAKICogdW5kZXIgYm90aCB0aGUgTUlUIGFuZCBHUEwgdmVyc2lvbiAyLjAgbGljZW5zZXMuIFRoaXMgbWVhbnMgdGhhdCB5b3UgY2FuIAogKiBjaG9vc2UgdGhlIGxpY2Vuc2UgdGhhdCBiZXN0IHN1aXRzIHlvdXIgcHJvamVjdCBhbmQgdXNlIGl0IGFjY29yZGluZ2x5LgogKgogKiBqc0RhdGUgYm9ycm93cyBtYW55IGNvbmNlcHRzIGFuZCBpZGVhcyBmcm9tIHRoZSBEYXRlIEluc3RhbmNlIAogKiBNZXRob2RzIGJ5IEtlbiBTbnlkZXIgYWxvbmcgd2l0aCBzb21lIHBhcnRzIG9mIEtlbidzIGFjdHVhbCBjb2RlLgogKiAKICogS2VuJ3Mgb3JpZ2lhbmwgRGF0ZSBJbnN0YW5jZSBNZXRob2RzIGFuZCBjb3B5cmlnaHQgbm90aWNlOgogKiAKICogS2VuIFNueWRlciAoa2VuIGQgc255ZGVyIGF0IGdtYWlsIGRvdCBjb20pCiAqIDIwMDgtMDktMTAKICogdmVyc2lvbiAyLjAuMiAoaHR0cDovL2tlbmRzbnlkZXIuY29tL3NhbmRib3gvZGF0ZS8pICAgICAKICogQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbiBMaWNlbnNlIDMuMCAoaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnkvMy4wLykKICoKICoganFwbG90VG9JbWFnZSBmdW5jdGlvbiBiYXNlZCBvbiBMYXJyeSBTaWRlbidzIGV4cG9ydC1qcXBsb3QtdG8tcG5nLmpzLgogKiBMYXJyeSBoYXMgZ2VuZXJvdXNseSBnaXZlbiBwZXJtaXNzaW9uIHRvIGFkYXB0IGhpcyBjb2RlIGZvciBpbmNsdXNpb24KICogaW50byBqcVBsb3QuCiAqCiAqIExhcnJ5J3Mgb3JpZ2luYWwgY29kZSBjYW4gYmUgZm91bmQgaGVyZToKICoKICogaHR0cHM6Ly9naXRodWIuY29tL2xzaWRlbi9leHBvcnQtanFwbG90LXRvLXBuZwogKiAKICogCiAqLwooZnVuY3Rpb24oYSl7YS5qcXBsb3QuY2lQYXJzZXI9ZnVuY3Rpb24oZyxsKXt2YXIgbT1bXSxvLG4saCxmLGUsYztpZih0eXBlb2YoZyk9PSJzdHJpbmciKXtnPWEuanFwbG90LkpTT04ucGFyc2UoZyxkKX1lbHNle2lmKHR5cGVvZihnKT09Im9iamVjdCIpe2ZvcihlIGluIGcpe2ZvcihoPTA7aDxnW2VdLmxlbmd0aDtoKyspe2ZvcihjIGluIGdbZV1baF0pe2dbZV1baF1bY109ZChjLGdbZV1baF1bY10pfX19fWVsc2V7cmV0dXJuIG51bGx9fWZ1bmN0aW9uIGQoaixrKXt2YXIgaTtpZihrIT1udWxsKXtpZihrLnRvU3RyaW5nKCkuaW5kZXhPZigiRGF0ZSIpPj0wKXtpPS9eXC9EYXRlXCgoLT9bMC05XSspXClcLyQvLmV4ZWMoayk7aWYoaSl7cmV0dXJuIHBhcnNlSW50KGlbMV0sMTApfX1yZXR1cm4ga319Zm9yKHZhciBiIGluIGcpe289W107bj1nW2JdO3N3aXRjaChiKXtjYXNlIlByaWNlVGlja3MiOmZvcihoPTA7aDxuLmxlbmd0aDtoKyspe28ucHVzaChbbltoXVsiVGlja0RhdGUiXSxuW2hdWyJQcmljZSJdXSl9YnJlYWs7Y2FzZSJQcmljZUJhcnMiOmZvcihoPTA7aDxuLmxlbmd0aDtoKyspe28ucHVzaChbbltoXVsiQmFyRGF0ZSJdLG5baF1bIk9wZW4iXSxuW2hdWyJIaWdoIl0sbltoXVsiTG93Il0sbltoXVsiQ2xvc2UiXV0pfWJyZWFrfW0ucHVzaChvKX1yZXR1cm4gbX19KShqUXVlcnkpOw==]]></data>
	</file>
	<file>
	  <filename>/src/plugins/jqplot.cursor.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqCiAqIGpxUGxvdAogKiBQdXJlIEphdmFTY3JpcHQgcGxvdHRpbmcgcGx1Z2luIHVzaW5nIGpRdWVyeQogKgogKiBWZXJzaW9uOiAxLjAuMGIyX3IxMDEyCiAqCiAqIENvcHlyaWdodCAoYykgMjAwOS0yMDExIENocmlzIExlb25lbGxvCiAqIGpxUGxvdCBpcyBjdXJyZW50bHkgYXZhaWxhYmxlIGZvciB1c2UgaW4gYWxsIHBlcnNvbmFsIG9yIGNvbW1lcmNpYWwgcHJvamVjdHMgCiAqIHVuZGVyIGJvdGggdGhlIE1JVCAoaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHApIGFuZCBHUEwgCiAqIHZlcnNpb24gMi4wIChodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC5odG1sKSBsaWNlbnNlcy4gVGhpcyBtZWFucyB0aGF0IHlvdSBjYW4gCiAqIGNob29zZSB0aGUgbGljZW5zZSB0aGF0IGJlc3Qgc3VpdHMgeW91ciBwcm9qZWN0IGFuZCB1c2UgaXQgYWNjb3JkaW5nbHkuIAogKgogKiBBbHRob3VnaCBub3QgcmVxdWlyZWQsIHRoZSBhdXRob3Igd291bGQgYXBwcmVjaWF0ZSBhbiBlbWFpbCBsZXR0aW5nIGhpbSAKICoga25vdyBvZiBhbnkgc3Vic3RhbnRpYWwgdXNlIG9mIGpxUGxvdC4gIFlvdSBjYW4gcmVhY2ggdGhlIGF1dGhvciBhdDogCiAqIGNocmlzIGF0IGpxcGxvdCBkb3QgY29tIG9yIHNlZSBodHRwOi8vd3d3LmpxcGxvdC5jb20vaW5mby5waHAgLgogKgogKiBJZiB5b3UgYXJlIGZlZWxpbmcga2luZCBhbmQgZ2VuZXJvdXMsIGNvbnNpZGVyIHN1cHBvcnRpbmcgdGhlIHByb2plY3QgYnkKICogbWFraW5nIGEgZG9uYXRpb24gYXQ6IGh0dHA6Ly93d3cuanFwbG90LmNvbS9kb25hdGUucGhwIC4KICoKICogc3ByaW50ZiBmdW5jdGlvbnMgY29udGFpbmVkIGluIGpxcGxvdC5zcHJpbnRmLmpzIGJ5IEFzaCBTZWFybGU6CiAqCiAqICAgICB2ZXJzaW9uIDIwMDcuMDQuMjcKICogICAgIGF1dGhvciBBc2ggU2VhcmxlCiAqICAgICBodHRwOi8vaGV4bWVuLmNvbS9ibG9nLzIwMDcvMDMvcHJpbnRmLXNwcmludGYvCiAqICAgICBodHRwOi8vaGV4bWVuLmNvbS9qcy9zcHJpbnRmLmpzCiAqICAgICBUaGUgYXV0aG9yIChBc2ggU2VhcmxlKSBoYXMgcGxhY2VkIHRoaXMgY29kZSBpbiB0aGUgcHVibGljIGRvbWFpbjoKICogICAgICJUaGlzIGNvZGUgaXMgdW5yZXN0cmljdGVkOiB5b3UgYXJlIGZyZWUgdG8gdXNlIGl0IGhvd2V2ZXIgeW91IGxpa2UuIgogKiAKICovCihmdW5jdGlvbigkKSB7CiAgICAKICAgIC8qKgogICAgICogQ2xhc3M6ICQuanFwbG90LkN1cnNvcgogICAgICogUGx1Z2luIGNsYXNzIHJlcHJlc2VudGluZyB0aGUgY3Vyc29yIGFzIGRpc3BsYXllZCBvbiB0aGUgcGxvdC4KICAgICAqLwogICAgJC5qcXBsb3QuQ3Vyc29yID0gZnVuY3Rpb24ob3B0aW9ucykgewogICAgICAgIC8vIEdyb3VwOiBQcm9wZXJ0aWVzCiAgICAgICAgLy8KICAgICAgICAvLyBwcm9wOiBzdHlsZQogICAgICAgIC8vIENTUyBzcGVjIGZvciBjdXJzb3Igc3R5bGUKICAgICAgICB0aGlzLnN0eWxlID0gJ2Nyb3NzaGFpcic7CiAgICAgICAgdGhpcy5wcmV2aW91c0N1cnNvciA9ICdhdXRvJzsKICAgICAgICAvLyBwcm9wOiBzaG93CiAgICAgICAgLy8gd2V0aGVyIHRvIHNob3cgdGhlIGN1cnNvciBvciBub3QuCiAgICAgICAgdGhpcy5zaG93ID0gJC5qcXBsb3QuY29uZmlnLmVuYWJsZVBsdWdpbnM7CiAgICAgICAgLy8gcHJvcDogc2hvd1Rvb2x0aXAKICAgICAgICAvLyBzaG93IGEgY3Vyc29yIHBvc2l0aW9uIHRvb2x0aXAuICBMb2NhdGlvbiBvZiB0aGUgdG9vbHRpcAogICAgICAgIC8vIHdpbGwgYmUgY29udHJvbGxlZCBieSBmb2xsb3dNb3VzZSBhbmQgdG9vbHRpcExvY2F0aW9uLgogICAgICAgIHRoaXMuc2hvd1Rvb2x0aXAgPSB0cnVlOwogICAgICAgIC8vIHByb3A6IGZvbGxvd01vdXNlCiAgICAgICAgLy8gVG9vbHRpcCBmb2xsb3dzIHRoZSBtb3VzZSwgaXQgaXMgbm90IGF0IGEgZml4ZWQgbG9jYXRpb24uCiAgICAgICAgLy8gVG9vbHRpcCB3aWxsIHNob3cgb24gdGhlIGdyaWQgYXQgdGhlIGxvY2F0aW9uIGdpdmVuIGJ5CiAgICAgICAgLy8gdG9vbHRpcExvY2F0aW9uLCBvZmZzZXQgZnJvbSB0aGUgZ3JpZCBlZGdlIGJ5IHRvb2x0aXBPZmZzZXQuCiAgICAgICAgdGhpcy5mb2xsb3dNb3VzZSA9IGZhbHNlOwogICAgICAgIC8vIHByb3A6IHRvb2x0aXBMb2NhdGlvbgogICAgICAgIC8vIFdoZXJlIHRvIHBvc2l0aW9uIHRvb2x0aXAuICBJZiBmb2xsb3dNb3VzZSBpcyB0cnVlLCB0aGlzIGlzCiAgICAgICAgLy8gcmVsYXRpdmUgdG8gdGhlIGN1cnNvciwgb3RoZXJ3aXNlLCBpdCBpcyByZWxhdGl2ZSB0byB0aGUgZ3JpZC4KICAgICAgICAvLyBPbmUgb2YgJ24nLCAnbmUnLCAnZScsICdzZScsICdzJywgJ3N3JywgJ3cnLCAnbncnCiAgICAgICAgdGhpcy50b29sdGlwTG9jYXRpb24gPSAnc2UnOwogICAgICAgIC8vIHByb3A6IHRvb2x0aXBPZmZzZXQKICAgICAgICAvLyBQaXhlbCBvZmZzZXQgb2YgdG9vbHRpcCBmcm9tIHRoZSBncmlkIGJvdWRhcmllcyBvciBjdXJzb3IgY2VudGVyLgogICAgICAgIHRoaXMudG9vbHRpcE9mZnNldCA9IDY7CiAgICAgICAgLy8gcHJvcDogc2hvd1Rvb2x0aXBHcmlkUG9zaXRpb24KICAgICAgICAvLyBzaG93IHRoZSBncmlkIHBpeGVsIGNvb3JkaW5hdGVzIG9mIHRoZSBtb3VzZS4KICAgICAgICB0aGlzLnNob3dUb29sdGlwR3JpZFBvc2l0aW9uID0gZmFsc2U7CiAgICAgICAgLy8gcHJvcDogc2hvd1Rvb2x0aXBVbml0UG9zaXRpb24KICAgICAgICAvLyBzaG93IHRoZSB1bml0IChkYXRhKSBjb29yZGluYXRlcyBvZiB0aGUgbW91c2UuCiAgICAgICAgdGhpcy5zaG93VG9vbHRpcFVuaXRQb3NpdGlvbiA9IHRydWU7CiAgICAgICAgLy8gcHJvcDogc2hvd1Rvb2x0aXBEYXRhUG9zaXRpb24KICAgICAgICAvLyBVc2VkIHdpdGggc2hvd1ZlcnRpY2FsTGluZSB0byBzaG93IGludGVyc2VjdGluZyBkYXRhIHBvaW50cyBpbiB0aGUgdG9vbHRpcC4KICAgICAgICB0aGlzLnNob3dUb29sdGlwRGF0YVBvc2l0aW9uID0gZmFsc2U7CiAgICAgICAgLy8gcHJvcDogdG9vbHRpcEZvcm1hdFN0cmluZwogICAgICAgIC8vIHNwcmludGYgZm9ybWF0IHN0cmluZyBmb3IgdGhlIHRvb2x0aXAuCiAgICAgICAgLy8gVXNlcyBBc2ggU2VhcmxlJ3MgamF2YXNjcmlwdCBzcHJpbnRmIGltcGxlbWVudGF0aW9uCiAgICAgICAgLy8gZm91bmQgaGVyZTogaHR0cDovL2hleG1lbi5jb20vYmxvZy8yMDA3LzAzL3ByaW50Zi1zcHJpbnRmLwogICAgICAgIC8vIFNlZSBodHRwOi8vcGVybGRvYy5wZXJsLm9yZy9mdW5jdGlvbnMvc3ByaW50Zi5odG1sIGZvciByZWZlcmVuY2UKICAgICAgICAvLyBOb3RlLCBpZiBzaG93VG9vbHRpcERhdGFQb3NpdGlvbiBpcyB0cnVlLCB0aGUgZGVmYXVsdCB0b29sdGlwRm9ybWF0U3RyaW5nCiAgICAgICAgLy8gd2lsbCBiZSBzZXQgdG8gdGhlIGN1cnNvckxlZ2VuZEZvcm1hdFN0cmluZywgbm90IHRoZSBkZWZhdWx0IGdpdmVuIGhlcmUuCiAgICAgICAgdGhpcy50b29sdGlwRm9ybWF0U3RyaW5nID0gJyUuNFAsICUuNFAnOwogICAgICAgIC8vIHByb3A6IHVzZUF4ZXNGb3JtYXR0ZXJzCiAgICAgICAgLy8gVXNlIHRoZSB4IGFuZCB5IGF4ZXMgZm9ybWF0dGVycyB0byBmb3JtYXQgdGhlIHRleHQgaW4gdGhlIHRvb2x0aXAuCiAgICAgICAgdGhpcy51c2VBeGVzRm9ybWF0dGVycyA9IHRydWU7CiAgICAgICAgLy8gcHJvcDogdG9vbHRpcEF4aXNHcm91cHMKICAgICAgICAvLyBTaG93IHBvc2l0aW9uIGZvciB0aGUgc3BlY2lmaWVkIGF4ZXMuCiAgICAgICAgLy8gVGhpcyBpcyBhbiBhcnJheSBsaWtlIFtbJ3hheGlzJywgJ3lheGlzJ10sIFsneGF4aXMnLCAneTJheGlzJ11dCiAgICAgICAgLy8gRGVmYXVsdCBpcyB0byBjb21wdXRlIGF1dG9tYXRpY2FsbHkgZm9yIGFsbCB2aXNpYmxlIGF4ZXMuCiAgICAgICAgdGhpcy50b29sdGlwQXhpc0dyb3VwcyA9IFtdOwogICAgICAgIC8vIHByb3A6IHpvb20KICAgICAgICAvLyBFbmFibGUgcGxvdCB6b29taW5nLgogICAgICAgIHRoaXMuem9vbSA9IGZhbHNlOwogICAgICAgIC8vIHpvb21Qcm94eSBhbmQgem9vbVRhcmdldCBwcm9wZXJ0aWVzIGFyZSBub3QgZGlyZWN0bHkgc2V0IGJ5IHVzZXIuICAKICAgICAgICAvLyBUaGV5IFdpbGwgYmUgc2V0IHRocm91Z2ggY2FsbCB0byB6b29tUHJveHkgbWV0aG9kLgogICAgICAgIHRoaXMuem9vbVByb3h5ID0gZmFsc2U7CiAgICAgICAgdGhpcy56b29tVGFyZ2V0ID0gZmFsc2U7CiAgICAgICAgLy8gcHJvcDogbG9vc2Vab29tCiAgICAgICAgLy8gV2lsbCBleHBhbmQgem9vbSByYW5nZSB0byBwcm92aWRlIG1vcmUgcm91bmRlZCB0aWNrIHZhbHVlcy4KICAgICAgICAvLyBXb3JrcyBvbmx5IHdpdGggbGluZWFyLCBsb2cgYW5kIGRhdGUgYXhlcy4KICAgICAgICB0aGlzLmxvb3NlWm9vbSA9IHRydWU7CiAgICAgICAgLy8gcHJvcDogY2xpY2tSZXNldAogICAgICAgIC8vIFdpbGwgcmVzZXQgcGxvdCB6b29tIGlmIHNpbmdsZSBjbGljayBvbiBwbG90IHdpdGhvdXQgZHJhZy4KICAgICAgICB0aGlzLmNsaWNrUmVzZXQgPSBmYWxzZTsKICAgICAgICAvLyBwcm9wOiBkYmxDbGlja1Jlc2V0CiAgICAgICAgLy8gV2lsbCByZXNldCBwbG90IHpvb20gaWYgZG91YmxlIGNsaWNrIG9uIHBsb3Qgd2l0aG91dCBkcmFnLgogICAgICAgIHRoaXMuZGJsQ2xpY2tSZXNldCA9IHRydWU7CiAgICAgICAgLy8gcHJvcDogc2hvd1ZlcnRpY2FsTGluZQogICAgICAgIC8vIGRyYXcgYSB2ZXJ0aWNhbCBsaW5lIGFjcm9zcyB0aGUgcGxvdCB3aGljaCBmb2xsb3dzIHRoZSBjdXJzb3IuCiAgICAgICAgLy8gV2hlbiB0aGUgbGluZSBpcyBuZWFyIGEgZGF0YSBwb2ludCwgYSBzcGVjaWFsIGxlZ2VuZCBhbmQvb3IgdG9vbHRpcCBjYW4KICAgICAgICAvLyBiZSB1cGRhdGVkIHdpdGggdGhlIGRhdGEgdmFsdWVzLgogICAgICAgIHRoaXMuc2hvd1ZlcnRpY2FsTGluZSA9IGZhbHNlOwogICAgICAgIC8vIHByb3A6IHNob3dIb3Jpem9udGFsTGluZQogICAgICAgIC8vIGRyYXcgYSBob3Jpem9udGFsIGxpbmUgYWNyb3NzIHRoZSBwbG90IHdoaWNoIGZvbGxvd3MgdGhlIGN1cnNvci4KICAgICAgICB0aGlzLnNob3dIb3Jpem9udGFsTGluZSA9IGZhbHNlOwogICAgICAgIC8vIHByb3A6IGNvbnN0cmFpblpvb21UbwogICAgICAgIC8vICdub25lJywgJ3gnIG9yICd5JwogICAgICAgIHRoaXMuY29uc3RyYWluWm9vbVRvID0gJ25vbmUnOwogICAgICAgIC8vIC8vIHByb3A6IGF1dG9zY2FsZUNvbnN0cmFpbnQKICAgICAgICAvLyAvLyB3aGVuIGEgY29uc3RyYWluZWQgYXhpcyBpcyBzcGVjaWZpZWQsIHRydWUgd2lsbAogICAgICAgIC8vIC8vIGF1YXRvc2NhbGUgdGhlIGFkamFjZW50IGF4aXMuCiAgICAgICAgLy8gdGhpcy5hdXRvc2NhbGVDb25zdHJhaW50ID0gdHJ1ZTsKICAgICAgICB0aGlzLnNoYXBlUmVuZGVyZXIgPSBuZXcgJC5qcXBsb3QuU2hhcGVSZW5kZXJlcigpOwogICAgICAgIHRoaXMuX3pvb20gPSB7c3RhcnQ6W10sIGVuZDpbXSwgc3RhcnRlZDogZmFsc2UsIHpvb21pbmc6ZmFsc2UsIGlzWm9vbWVkOmZhbHNlLCBheGVzOntzdGFydDp7fSwgZW5kOnt9fSwgZ3JpZHBvczp7fSwgZGF0YXBvczp7fX07CiAgICAgICAgdGhpcy5fdG9vbHRpcEVsZW07CiAgICAgICAgdGhpcy56b29tQ2FudmFzOwogICAgICAgIHRoaXMuY3Vyc29yQ2FudmFzOwogICAgICAgIC8vIHByb3A6IGludGVyc2VjdGlvblRocmVzaG9sZAogICAgICAgIC8vIHBpeGVsIGRpc3RhbmNlIGZyb20gZGF0YSBwb2ludCBvciBtYXJrZXIgdG8gY29uc2lkZXIgY3Vyc29yIGxpbmVzIGludGVyc2VjdGluZyB3aXRoIHBvaW50LgogICAgICAgIC8vIElmIGRhdGEgcG9pbnQgbWFya2VycyBhcmUgbm90IHNob3duLCB0aGlzIHNob3VsZCBiZSA+PSAxIG9yIHdpbGwgb2Z0ZW4gbWlzcyBwb2ludCBpbnRlcnNlY3Rpb25zLgogICAgICAgIHRoaXMuaW50ZXJzZWN0aW9uVGhyZXNob2xkID0gMjsKICAgICAgICAvLyBwcm9wOiBzaG93Q3Vyc29yTGVnZW5kCiAgICAgICAgLy8gUmVwbGFjZSB0aGUgcGxvdCBsZWdlbmQgd2l0aCBhbiBlbmhhbmNlZCBsZWdlbmQgZGlzcGxheWluZyBpbnRlcnNlY3Rpb24gaW5mb3JtYXRpb24uCiAgICAgICAgdGhpcy5zaG93Q3Vyc29yTGVnZW5kID0gZmFsc2U7CiAgICAgICAgLy8gcHJvcDogY3Vyc29yTGVnZW5kRm9ybWF0U3RyaW5nCiAgICAgICAgLy8gRm9ybWF0IHN0cmluZyB1c2VkIGluIHRoZSBjdXJzb3IgbGVnZW5kLiAgSWYgc2hvd1Rvb2x0aXBEYXRhUG9zaXRpb24gaXMgdHJ1ZSwKICAgICAgICAvLyB0aGlzIHdpbGwgYWxzbyBiZSB0aGUgZGVmYXVsdCBmb3JtYXQgc3RyaW5nIHVzZWQgYnkgdG9vbHRpcEZvcm1hdFN0cmluZy4KICAgICAgICB0aGlzLmN1cnNvckxlZ2VuZEZvcm1hdFN0cmluZyA9ICQuanFwbG90LkN1cnNvci5jdXJzb3JMZWdlbmRGb3JtYXRTdHJpbmc7CiAgICAgICAgLy8gd2hldGhlciB0aGUgY3Vyc29yIGlzIG92ZXIgdGhlIGdyaWQgb3Igbm90LgogICAgICAgIHRoaXMuX29sZEhhbmRsZXJzID0ge29uc2VsZWN0c3RhcnQ6IG51bGwsIG9uZHJhZzogbnVsbCwgb25tb3VzZWRvd246IG51bGx9OwogICAgICAgIC8vIHByb3A6IGNvbnN0cmFpbk91dHNpZGVab29tCiAgICAgICAgLy8gVHJ1ZSB0byBsaW1pdCBhY3R1YWwgem9vbSBhcmVhIHRvIGVkZ2VzIG9mIGdyaWQsIGV2ZW4gd2hlbiB6b29taW5nCiAgICAgICAgLy8gb3V0c2lkZSBvZiBwbG90IGFyZWEuICBUaGF0IGlzLCBjYW4ndCB6b29tIG91dCBieSBtb3VzaW5nIG91dHNpZGUgcGxvdC4KICAgICAgICB0aGlzLmNvbnN0cmFpbk91dHNpZGVab29tID0gdHJ1ZTsKICAgICAgICAvLyBwcm9wOiBzaG93VG9vbHRpcE91dHNpZGVab29tCiAgICAgICAgLy8gVHJ1ZSB3aWxsIGtlZXAgdXBkYXRpbmcgdGhlIHRvb2x0aXAgd2hlbiB6b29taW5nIG9mIHRoZSBncmlkLgogICAgICAgIHRoaXMuc2hvd1Rvb2x0aXBPdXRzaWRlWm9vbSA9IGZhbHNlOwogICAgICAgIC8vIHRydWUgaWYgbW91c2UgaXMgb3ZlciBncmlkLCBmYWxzZSBpZiBub3QuCiAgICAgICAgdGhpcy5vbkdyaWQgPSBmYWxzZTsKICAgICAgICAkLmV4dGVuZCh0cnVlLCB0aGlzLCBvcHRpb25zKTsKICAgIH07CiAgICAKICAgICQuanFwbG90LkN1cnNvci5jdXJzb3JMZWdlbmRGb3JtYXRTdHJpbmcgPSAnJXMgeDolcywgeTolcyc7CiAgICAKICAgIC8vIGNhbGxlZCB3aXRoIHNjb3BlIG9mIHBsb3QKICAgICQuanFwbG90LkN1cnNvci5pbml0ID0gZnVuY3Rpb24gKHRhcmdldCwgZGF0YSwgb3B0cyl7CiAgICAgICAgLy8gYWRkIGEgY3Vyc29yIGF0dHJpYnV0ZSB0byB0aGUgcGxvdAogICAgICAgIHZhciBvcHRpb25zID0gb3B0cyB8fCB7fTsKICAgICAgICB0aGlzLnBsdWdpbnMuY3Vyc29yID0gbmV3ICQuanFwbG90LkN1cnNvcihvcHRpb25zLmN1cnNvcik7CiAgICAgICAgdmFyIGMgPSB0aGlzLnBsdWdpbnMuY3Vyc29yOwoKICAgICAgICBpZiAoYy5zaG93KSB7CiAgICAgICAgICAgICQuanFwbG90LmV2ZW50TGlzdGVuZXJIb29rcy5wdXNoKFsnanFwbG90TW91c2VFbnRlcicsIGhhbmRsZU1vdXNlRW50ZXJdKTsKICAgICAgICAgICAgJC5qcXBsb3QuZXZlbnRMaXN0ZW5lckhvb2tzLnB1c2goWydqcXBsb3RNb3VzZUxlYXZlJywgaGFuZGxlTW91c2VMZWF2ZV0pOwogICAgICAgICAgICAkLmpxcGxvdC5ldmVudExpc3RlbmVySG9va3MucHVzaChbJ2pxcGxvdE1vdXNlTW92ZScsIGhhbmRsZU1vdXNlTW92ZV0pOwogICAgICAgICAgICAKICAgICAgICAgICAgaWYgKGMuc2hvd0N1cnNvckxlZ2VuZCkgeyAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBvcHRzLmxlZ2VuZCA9IG9wdHMubGVnZW5kIHx8IHt9OwogICAgICAgICAgICAgICAgb3B0cy5sZWdlbmQucmVuZGVyZXIgPSAgJC5qcXBsb3QuQ3Vyc29yTGVnZW5kUmVuZGVyZXI7CiAgICAgICAgICAgICAgICBvcHRzLmxlZ2VuZC5mb3JtYXRTdHJpbmcgPSB0aGlzLnBsdWdpbnMuY3Vyc29yLmN1cnNvckxlZ2VuZEZvcm1hdFN0cmluZzsKICAgICAgICAgICAgICAgIG9wdHMubGVnZW5kLnNob3cgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICBpZiAoYy56b29tKSB7CiAgICAgICAgICAgICAgICAkLmpxcGxvdC5ldmVudExpc3RlbmVySG9va3MucHVzaChbJ2pxcGxvdE1vdXNlRG93bicsIGhhbmRsZU1vdXNlRG93bl0pOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBpZiAoYy5jbGlja1Jlc2V0KSB7CiAgICAgICAgICAgICAgICAgICAgJC5qcXBsb3QuZXZlbnRMaXN0ZW5lckhvb2tzLnB1c2goWydqcXBsb3RDbGljaycsIGhhbmRsZUNsaWNrXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGlmIChjLmRibENsaWNrUmVzZXQpIHsKICAgICAgICAgICAgICAgICAgICAkLmpxcGxvdC5ldmVudExpc3RlbmVySG9va3MucHVzaChbJ2pxcGxvdERibENsaWNrJywgaGFuZGxlRGJsQ2xpY2tdKTsKICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgCiAgICAgICAgICAgIH0KICAgIAogICAgICAgICAgICB0aGlzLnJlc2V0Wm9vbSA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgdmFyIGF4ZXMgPSB0aGlzLmF4ZXM7CiAgICAgICAgICAgICAgICBpZiAoIWMuem9vbVByb3h5KSB7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgYXggaW4gYXhlcykgewogICAgICAgICAgICAgICAgICAgICAgICBheGVzW2F4XS5yZXNldCgpOwogICAgICAgICAgICAgICAgICAgICAgICBheGVzW2F4XS5fdGlja3MgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmFrZSBvdXQgdGljayBjcmVhdGlvbiBhbGdvcml0aG0gdG8gbWFrZSBzdXJlIG9yaWdpbmFsIGF1dG8KICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29tcHV0ZWQgZm9ybWF0IHN0cmluZyBpcyB1c2VkIGlmIF9vdmVycmlkZUZvcm1hdFN0cmluZyBpcyB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjLl96b29tLmF4ZXNbYXhdICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4ZXNbYXhdLl9hdXRvRm9ybWF0U3RyaW5nID0gYy5fem9vbS5heGVzW2F4XS50aWNrRm9ybWF0U3RyaW5nOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHRoaXMucmVkcmF3KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB2YXIgY3R4ID0gdGhpcy5wbHVnaW5zLmN1cnNvci56b29tQ2FudmFzLl9jdHg7CiAgICAgICAgICAgICAgICAgICAgY3R4LmNsZWFyUmVjdCgwLDAsY3R4LmNhbnZhcy53aWR0aCwgY3R4LmNhbnZhcy5oZWlnaHQpOwogICAgICAgICAgICAgICAgICAgIGN0eCA9IG51bGw7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbnMuY3Vyc29yLl96b29tLmlzWm9vbWVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICB0aGlzLnRhcmdldC50cmlnZ2VyKCdqcXBsb3RSZXNldFpvb20nLCBbdGhpcywgdGhpcy5wbHVnaW5zLmN1cnNvcl0pOwogICAgICAgICAgICB9OwogICAgICAgICAgICAKCiAgICAgICAgICAgIGlmIChjLnNob3dUb29sdGlwRGF0YVBvc2l0aW9uKSB7CiAgICAgICAgICAgICAgICBjLnNob3dUb29sdGlwVW5pdFBvc2l0aW9uID0gZmFsc2U7CiAgICAgICAgICAgICAgICBjLnNob3dUb29sdGlwR3JpZFBvc2l0aW9uID0gZmFsc2U7CiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5jdXJzb3IudG9vbHRpcEZvcm1hdFN0cmluZyA9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgICAgICBjLnRvb2x0aXBGb3JtYXRTdHJpbmcgPSAkLmpxcGxvdC5DdXJzb3IuY3Vyc29yTGVnZW5kRm9ybWF0U3RyaW5nOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfTsKICAgIAogICAgLy8gY2FsbGVkIHdpdGggY29udGV4dCBvZiBwbG90CiAgICAkLmpxcGxvdC5DdXJzb3IucG9zdERyYXcgPSBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgYyA9IHRoaXMucGx1Z2lucy5jdXJzb3I7CiAgICAgICAgCiAgICAgICAgLy8gTWVtb3J5IExlYWtzIHBhdGNoCiAgICAgICAgaWYgKGMuem9vbUNhbnZhcykgewogICAgICAgICAgICBjLnpvb21DYW52YXMucmVzZXRDYW52YXMoKTsKICAgICAgICAgICAgYy56b29tQ2FudmFzID0gbnVsbDsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYgKGMuY3Vyc29yQ2FudmFzKSB7CiAgICAgICAgICAgIGMuY3Vyc29yQ2FudmFzLnJlc2V0Q2FudmFzKCk7CiAgICAgICAgICAgIGMuY3Vyc29yQ2FudmFzID0gbnVsbDsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYgKGMuX3Rvb2x0aXBFbGVtKSB7CiAgICAgICAgICAgIGMuX3Rvb2x0aXBFbGVtLmVtcHR5Rm9yY2UoKTsKICAgICAgICAgICAgYy5fdG9vbHRpcEVsZW0gPSBudWxsOwogICAgICAgIH0KCiAgICAgICAgCiAgICAgICAgaWYgKGMuem9vbSkgewogICAgICAgICAgICBjLnpvb21DYW52YXMgPSBuZXcgJC5qcXBsb3QuR2VuZXJpY0NhbnZhcygpOwogICAgICAgICAgICB0aGlzLmV2ZW50Q2FudmFzLl9lbGVtLmJlZm9yZShjLnpvb21DYW52YXMuY3JlYXRlRWxlbWVudCh0aGlzLl9ncmlkUGFkZGluZywgJ2pxcGxvdC16b29tLWNhbnZhcycsIHRoaXMuX3Bsb3REaW1lbnNpb25zLCB0aGlzKSk7CiAgICAgICAgICAgIGMuem9vbUNhbnZhcy5zZXRDb250ZXh0KCk7CiAgICAgICAgfQoKICAgICAgICB2YXIgZWxlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgICAgIGMuX3Rvb2x0aXBFbGVtID0gJChlbGVtKTsKICAgICAgICBlbGVtID0gbnVsbDsKICAgICAgICBjLl90b29sdGlwRWxlbS5hZGRDbGFzcygnanFwbG90LWN1cnNvci10b29sdGlwJyk7CiAgICAgICAgYy5fdG9vbHRpcEVsZW0uY3NzKHtwb3NpdGlvbjonYWJzb2x1dGUnLCBkaXNwbGF5Oidub25lJ30pOwogICAgICAgIAogICAgICAgIAogICAgICAgIGlmIChjLnpvb21DYW52YXMpIHsKICAgICAgICAgICAgYy56b29tQ2FudmFzLl9lbGVtLmJlZm9yZShjLl90b29sdGlwRWxlbSk7CiAgICAgICAgfQoKICAgICAgICBlbHNlIHsKICAgICAgICAgICAgdGhpcy5ldmVudENhbnZhcy5fZWxlbS5iZWZvcmUoYy5fdG9vbHRpcEVsZW0pOwogICAgICAgIH0KCiAgICAgICAgaWYgKGMuc2hvd1ZlcnRpY2FsTGluZSB8fCBjLnNob3dIb3Jpem9udGFsTGluZSkgewogICAgICAgICAgICBjLmN1cnNvckNhbnZhcyA9IG5ldyAkLmpxcGxvdC5HZW5lcmljQ2FudmFzKCk7CiAgICAgICAgICAgIHRoaXMuZXZlbnRDYW52YXMuX2VsZW0uYmVmb3JlKGMuY3Vyc29yQ2FudmFzLmNyZWF0ZUVsZW1lbnQodGhpcy5fZ3JpZFBhZGRpbmcsICdqcXBsb3QtY3Vyc29yLWNhbnZhcycsIHRoaXMuX3Bsb3REaW1lbnNpb25zLCB0aGlzKSk7CiAgICAgICAgICAgIGMuY3Vyc29yQ2FudmFzLnNldENvbnRleHQoKTsKICAgICAgICB9CgogICAgICAgIC8vIGlmIHdlIGFyZSBzaG93aW5nIHRoZSBwb3NpdGlvbnMgaW4gdW5pdCBjb29yZGluYXRlcywgYW5kIG5vIGF4ZXMgZ3JvdXBzCiAgICAgICAgLy8gd2VyZSBzcGVjaWZpZWQsIGNyZWF0ZSBhIGRlZmF1bHQgc2V0LgogICAgICAgIGlmIChjLnNob3dUb29sdGlwVW5pdFBvc2l0aW9uKXsKICAgICAgICAgICAgaWYgKGMudG9vbHRpcEF4aXNHcm91cHMubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgICAgICB2YXIgc2VyaWVzID0gdGhpcy5zZXJpZXM7CiAgICAgICAgICAgICAgICB2YXIgczsKICAgICAgICAgICAgICAgIHZhciB0ZW1wID0gW107CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpPTA7IGk8c2VyaWVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgcyA9IHNlcmllc1tpXTsKICAgICAgICAgICAgICAgICAgICB2YXIgYXggPSBzLnhheGlzKycsJytzLnlheGlzOwogICAgICAgICAgICAgICAgICAgIGlmICgkLmluQXJyYXkoYXgsIHRlbXApID09IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAucHVzaChheCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZm9yICh2YXIgaT0wOyBpPHRlbXAubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICBjLnRvb2x0aXBBeGlzR3JvdXBzLnB1c2godGVtcFtpXS5zcGxpdCgnLCcpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH07CiAgICAKICAgIC8vIEdyb3VwOiBtZXRob2RzCiAgICAvLwogICAgLy8gbWV0aG9kOiAkLmpxcGxvdC5DdXJzb3Iuem9vbVByb3h5CiAgICAvLyBsaW5rcyB0YXJnZXRQbG90IHRvIGNvbnRyb2xsZXJQbG90IHNvIHRoYXQgcGxvdCB6b29taW5nIG9mCiAgICAvLyB0YXJnZXRQbG90IHdpbGwgYmUgY29udHJvbGxlZCBieSB6b29taW5nIG9uIHRoZSBjb250cm9sbGVyUGxvdC4KICAgIC8vIGNvbnRyb2xsZXJQbG90IHdpbGwgbm90IGFjdHVhbGx5IHpvb20sIGJ1dCBhY3RzIGFzIGFuCiAgICAvLyBvdmVydmlldyBwbG90LiAgTm90ZSwgdGhlIHpvb20gb3B0aW9ucyBtdXN0IGJlIHNldCB0byB0cnVlIGZvcgogICAgLy8gem9vbVByb3h5IHRvIHdvcmsuCiAgICAkLmpxcGxvdC5DdXJzb3Iuem9vbVByb3h5ID0gZnVuY3Rpb24odGFyZ2V0UGxvdCwgY29udHJvbGxlclBsb3QpIHsKICAgICAgICB2YXIgdGMgPSB0YXJnZXRQbG90LnBsdWdpbnMuY3Vyc29yOwogICAgICAgIHZhciBjYyA9IGNvbnRyb2xsZXJQbG90LnBsdWdpbnMuY3Vyc29yOwogICAgICAgIHRjLnpvb21UYXJnZXQgPSB0cnVlOwogICAgICAgIHRjLnpvb20gPSB0cnVlOwogICAgICAgIHRjLnN0eWxlID0gJ2F1dG8nOwogICAgICAgIHRjLmRibENsaWNrUmVzZXQgPSBmYWxzZTsKICAgICAgICBjYy56b29tID0gdHJ1ZTsKICAgICAgICBjYy56b29tUHJveHkgPSB0cnVlOwogICAgICAgICAgICAgIAogICAgICAgIGNvbnRyb2xsZXJQbG90LnRhcmdldC5iaW5kKCdqcXBsb3Rab29tJywgcGxvdFpvb20pOwogICAgICAgIGNvbnRyb2xsZXJQbG90LnRhcmdldC5iaW5kKCdqcXBsb3RSZXNldFpvb20nLCBwbG90UmVzZXQpOwoKICAgICAgICBmdW5jdGlvbiBwbG90Wm9vbShldiwgZ3JpZHBvcywgZGF0YXBvcywgcGxvdCwgY3Vyc29yKSB7CiAgICAgICAgICAgIHRjLmRvWm9vbShncmlkcG9zLCBkYXRhcG9zLCB0YXJnZXRQbG90LCBjdXJzb3IpOwogICAgICAgIH0gCgogICAgICAgIGZ1bmN0aW9uIHBsb3RSZXNldChldiwgcGxvdCwgY3Vyc29yKSB7CiAgICAgICAgICAgIHRhcmdldFBsb3QucmVzZXRab29tKCk7CiAgICAgICAgfQogICAgfTsKICAgIAogICAgJC5qcXBsb3QuQ3Vyc29yLnByb3RvdHlwZS5yZXNldFpvb20gPSBmdW5jdGlvbihwbG90LCBjdXJzb3IpIHsKICAgICAgICB2YXIgYXhlcyA9IHBsb3QuYXhlczsKICAgICAgICB2YXIgY2F4ID0gY3Vyc29yLl96b29tLmF4ZXM7CiAgICAgICAgaWYgKCFwbG90LnBsdWdpbnMuY3Vyc29yLnpvb21Qcm94eSAmJiBjdXJzb3IuX3pvb20uaXNab29tZWQpIHsKICAgICAgICAgICAgZm9yICh2YXIgYXggaW4gYXhlcykgewogICAgICAgICAgICAgICAgLy8gYXhlc1theF0uX3RpY2tzID0gW107CiAgICAgICAgICAgICAgICAvLyBheGVzW2F4XS5taW4gPSBjYXhbYXhdLm1pbjsKICAgICAgICAgICAgICAgIC8vIGF4ZXNbYXhdLm1heCA9IGNheFtheF0ubWF4OwogICAgICAgICAgICAgICAgLy8gYXhlc1theF0ubnVtYmVyVGlja3MgPSBjYXhbYXhdLm51bWJlclRpY2tzOyAKICAgICAgICAgICAgICAgIC8vIGF4ZXNbYXhdLnRpY2tJbnRlcnZhbCA9IGNheFtheF0udGlja0ludGVydmFsOwogICAgICAgICAgICAgICAgLy8gLy8gZm9yIGRhdGUgYXhlcwogICAgICAgICAgICAgICAgLy8gYXhlc1theF0uZGFUaWNrSW50ZXJ2YWwgPSBjYXhbYXhdLmRhVGlja0ludGVydmFsOwogICAgICAgICAgICAgICAgYXhlc1theF0ucmVzZXQoKTsKICAgICAgICAgICAgICAgIGF4ZXNbYXhdLl90aWNrcyA9IFtdOwogICAgICAgICAgICAgICAgLy8gZmFrZSBvdXQgdGljayBjcmVhdGlvbiBhbGdvcml0aG0gdG8gbWFrZSBzdXJlIG9yaWdpbmFsIGF1dG8KICAgICAgICAgICAgICAgIC8vIGNvbXB1dGVkIGZvcm1hdCBzdHJpbmcgaXMgdXNlZCBpZiBfb3ZlcnJpZGVGb3JtYXRTdHJpbmcgaXMgdHJ1ZQogICAgICAgICAgICAgICAgYXhlc1theF0uX2F1dG9Gb3JtYXRTdHJpbmcgPSBjYXhbYXhdLnRpY2tGb3JtYXRTdHJpbmc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcGxvdC5yZWRyYXcoKTsKICAgICAgICAgICAgY3Vyc29yLl96b29tLmlzWm9vbWVkID0gZmFsc2U7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICB2YXIgY3R4ID0gY3Vyc29yLnpvb21DYW52YXMuX2N0eDsKICAgICAgICAgICAgY3R4LmNsZWFyUmVjdCgwLDAsY3R4LmNhbnZhcy53aWR0aCwgY3R4LmNhbnZhcy5oZWlnaHQpOwogICAgICAgICAgICBjdHggPSBudWxsOwogICAgICAgIH0KICAgICAgICBwbG90LnRhcmdldC50cmlnZ2VyKCdqcXBsb3RSZXNldFpvb20nLCBbcGxvdCwgY3Vyc29yXSk7CiAgICB9OwogICAgCiAgICAkLmpxcGxvdC5DdXJzb3IucmVzZXRab29tID0gZnVuY3Rpb24ocGxvdCkgewogICAgICAgIHBsb3QucmVzZXRab29tKCk7CiAgICB9OwogICAgCiAgICAkLmpxcGxvdC5DdXJzb3IucHJvdG90eXBlLmRvWm9vbSA9IGZ1bmN0aW9uIChncmlkcG9zLCBkYXRhcG9zLCBwbG90LCBjdXJzb3IpIHsKICAgICAgICB2YXIgYyA9IGN1cnNvcjsKICAgICAgICB2YXIgYXhlcyA9IHBsb3QuYXhlczsKICAgICAgICB2YXIgemF4ZXMgPSBjLl96b29tLmF4ZXM7CiAgICAgICAgdmFyIHN0YXJ0ID0gemF4ZXMuc3RhcnQ7CiAgICAgICAgdmFyIGVuZCA9IHpheGVzLmVuZDsKICAgICAgICB2YXIgbWluLCBtYXgsIGRwLCBzcGFuLAogICAgICAgICAgICBuZXdtaW4sIG5ld21heCwgY3VyYXgsIF9udW1iZXJUaWNrcywgcmV0OwogICAgICAgIHZhciBjdHggPSBwbG90LnBsdWdpbnMuY3Vyc29yLnpvb21DYW52YXMuX2N0eDsKICAgICAgICAvLyBkb24ndCB6b29tIGlmIHpvb20gYXJlYSBpcyB0b28gc21hbGwgKGluIHBpeGVscykKICAgICAgICBpZiAoKGMuY29uc3RyYWluWm9vbVRvID09ICdub25lJyAmJiBNYXRoLmFicyhncmlkcG9zLnggLSBjLl96b29tLnN0YXJ0WzBdKSA+IDYgJiYgTWF0aC5hYnMoZ3JpZHBvcy55IC0gYy5fem9vbS5zdGFydFsxXSkgPiA2KSB8fCAoYy5jb25zdHJhaW5ab29tVG8gPT0gJ3gnICYmIE1hdGguYWJzKGdyaWRwb3MueCAtIGMuX3pvb20uc3RhcnRbMF0pID4gNikgfHwgIChjLmNvbnN0cmFpblpvb21UbyA9PSAneScgJiYgTWF0aC5hYnMoZ3JpZHBvcy55IC0gYy5fem9vbS5zdGFydFsxXSkgPiA2KSkgewogICAgICAgICAgICBpZiAoIXBsb3QucGx1Z2lucy5jdXJzb3Iuem9vbVByb3h5KSB7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBheCBpbiBkYXRhcG9zKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gbWFrZSBhIGNvcHkgb2YgdGhlIG9yaWdpbmFsIGF4ZXMgdG8gcmV2ZXJ0IGJhY2suCiAgICAgICAgICAgICAgICAgICAgaWYgKGMuX3pvb20uYXhlc1theF0gPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGMuX3pvb20uYXhlc1theF0gPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgYy5fem9vbS5heGVzW2F4XS5udW1iZXJUaWNrcyA9IGF4ZXNbYXhdLm51bWJlclRpY2tzOwogICAgICAgICAgICAgICAgICAgICAgICBjLl96b29tLmF4ZXNbYXhdLnRpY2tJbnRlcnZhbCA9IGF4ZXNbYXhdLnRpY2tJbnRlcnZhbDsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIGRhdGUgYXhlcy4uLgogICAgICAgICAgICAgICAgICAgICAgICBjLl96b29tLmF4ZXNbYXhdLmRhVGlja0ludGVydmFsID0gYXhlc1theF0uZGFUaWNrSW50ZXJ2YWw7CiAgICAgICAgICAgICAgICAgICAgICAgIGMuX3pvb20uYXhlc1theF0ubWluID0gYXhlc1theF0ubWluOwogICAgICAgICAgICAgICAgICAgICAgICBjLl96b29tLmF4ZXNbYXhdLm1heCA9IGF4ZXNbYXhdLm1heDsKICAgICAgICAgICAgICAgICAgICAgICAgYy5fem9vbS5heGVzW2F4XS50aWNrRm9ybWF0U3RyaW5nID0gKGF4ZXNbYXhdLnRpY2tPcHRpb25zICE9IG51bGwpID8gYXhlc1theF0udGlja09wdGlvbnMuZm9ybWF0U3RyaW5nIDogICcnOwogICAgICAgICAgICAgICAgICAgIH0KCgogICAgICAgICAgICAgICAgICAgIGlmICgoYy5jb25zdHJhaW5ab29tVG8gPT0gJ25vbmUnKSB8fCAoYy5jb25zdHJhaW5ab29tVG8gPT0gJ3gnICYmIGF4LmNoYXJBdCgwKSA9PSAneCcpIHx8IChjLmNvbnN0cmFpblpvb21UbyA9PSAneScgJiYgYXguY2hhckF0KDApID09ICd5JykpIHsgICAKICAgICAgICAgICAgICAgICAgICAgICAgZHAgPSBkYXRhcG9zW2F4XTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRwICE9IG51bGwpIHsgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRwID4gc3RhcnRbYXhdKSB7IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld21pbiA9IHN0YXJ0W2F4XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdtYXggPSBkcDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYW4gPSBzdGFydFtheF0gLSBkcDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdtaW4gPSBkcDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdtYXggPSBzdGFydFtheF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyYXggPSBheGVzW2F4XTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfbnVtYmVyVGlja3MgPSBudWxsOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIGFsaWduaW5nIHRoaXMgYXhpcywgdXNlIG51bWJlciBvZiB0aWNrcyBmcm9tIHByZXZpb3VzIGF4aXMuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEbyBJIG5lZWQgdG8gcmVzZXQgc29tZWhvdyBpZiBhbGlnblRpY2tzIGlzIGNoYW5nZWQgYW5kIHRoZW4gZ3JhcGggaXMgcmVwbG90dGVkPz8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJheC5hbGlnblRpY2tzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cmF4Lm5hbWUgPT09ICd4MmF4aXMnICYmIHBsb3QuYXhlcy54YXhpcy5zaG93KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9udW1iZXJUaWNrcyA9IHBsb3QuYXhlcy54YXhpcy5udW1iZXJUaWNrczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY3VyYXgubmFtZS5jaGFyQXQoMCkgPT09ICd5JyAmJiBjdXJheC5uYW1lICE9PSAneWF4aXMnICYmIGN1cmF4Lm5hbWUgIT09ICd5TWlkQXhpcycgJiYgcGxvdC5heGVzLnlheGlzLnNob3cpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX251bWJlclRpY2tzID0gcGxvdC5heGVzLnlheGlzLm51bWJlclRpY2tzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubG9vc2Vab29tICYmIChheGVzW2F4XS5yZW5kZXJlci5jb25zdHJ1Y3RvciA9PT0gJC5qcXBsb3QuTGluZWFyQXhpc1JlbmRlcmVyIHx8IGF4ZXNbYXhdLnJlbmRlcmVyLmNvbnN0cnVjdG9yID09PSAkLmpxcGxvdC5Mb2dBeGlzUmVuZGVyZXIgKSkgeyAvL30gfHwgYXhlc1theF0ucmVuZGVyZXIuY29uc3RydWN0b3IgPT09ICQuanFwbG90LkRhdGVBeGlzUmVuZGVyZXIpKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9ICQuanFwbG90LkxpbmVhclRpY2tHZW5lcmF0b3IobmV3bWluLCBuZXdtYXgsIGN1cmF4Ll9zY2FsZWZhY3QsIF9udW1iZXJUaWNrcyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIG5ldyBtaW5pbXVtIGlzIGxlc3MgdGhhbiAidHJ1ZSIgbWluaW11bSBvZiBheGlzIGRpc3BsYXksIGFkanVzdCBpdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChheGVzW2F4XS50aWNrSW5zZXQgJiYgcmV0WzBdIDwgYXhlc1theF0ubWluICsgYXhlc1theF0udGlja0luc2V0ICogYXhlc1theF0udGlja0ludGVydmFsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldFswXSArPSByZXRbNF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldFsyXSAtPSAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgbmV3IG1heGltdW0gaXMgZ3JlYXRlciB0aGFuICJ0cnVlIiBtYXggb2YgYXhpcyBkaXNwbGF5LCBhZGp1c3QgaXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXhlc1theF0udGlja0luc2V0ICYmIHJldFsxXSA+IGF4ZXNbYXhdLm1heCAtIGF4ZXNbYXhdLnRpY2tJbnNldCAqIGF4ZXNbYXhdLnRpY2tJbnRlcnZhbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRbMV0gLT0gcmV0WzRdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRbMl0gLT0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciBsb2cgYXhlcywgZG9uJ3QgZmFsbCBiZWxvdyBjdXJyZW50IG1pbmltdW0sIHRoaXMgd2lsbCBsb29rIGJhZCBhbmQgY2FuJ3QgaGF2ZSAwIGluIHJhbmdlIGFueXdheS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXhlc1theF0ucmVuZGVyZXIuY29uc3RydWN0b3IgPT09ICQuanFwbG90LkxvZ0F4aXNSZW5kZXJlciAmJiByZXRbMF0gPCBheGVzW2F4XS5taW4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIGEgdGljayBhbmQgc2hpZnQgbWluIHVwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldFswXSArPSByZXRbNF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldFsyXSAtPSAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhlc1theF0ubWluID0gcmV0WzBdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4ZXNbYXhdLm1heCA9IHJldFsxXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGVzW2F4XS5fYXV0b0Zvcm1hdFN0cmluZyA9IHJldFszXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGVzW2F4XS5udW1iZXJUaWNrcyA9IHJldFsyXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGVzW2F4XS50aWNrSW50ZXJ2YWwgPSByZXRbNF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIGRhdGUgYXhlcy4uLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4ZXNbYXhdLmRhVGlja0ludGVydmFsID0gW3JldFs0XS8xMDAwLCAnc2Vjb25kcyddOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhlc1theF0ubWluID0gbmV3bWluOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4ZXNbYXhdLm1heCA9IG5ld21heDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGVzW2F4XS50aWNrSW50ZXJ2YWwgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4ZXNbYXhdLm51bWJlclRpY2tzID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3IgZGF0ZSBheGVzLi4uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhlc1theF0uZGFUaWNrSW50ZXJ2YWwgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4ZXNbYXhdLl90aWNrcyA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgLy8gaWYgKChjLmNvbnN0cmFpblpvb21UbyA9PSAneCcgJiYgYXguY2hhckF0KDApID09ICd5JyAmJiBjLmF1dG9zY2FsZUNvbnN0cmFpbnQpIHx8IChjLmNvbnN0cmFpblpvb21UbyA9PSAneScgJiYgYXguY2hhckF0KDApID09ICd4JyAmJiBjLmF1dG9zY2FsZUNvbnN0cmFpbnQpKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gICAgIGRwID0gZGF0YXBvc1theF07CiAgICAgICAgICAgICAgICAgICAgLy8gICAgIGlmIChkcCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICBheGVzW2F4XS5tYXggPT0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgIGF4ZXNbYXhdLm1pbiA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgLy8gICAgIH0KICAgICAgICAgICAgICAgICAgICAvLyB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjdHguY2xlYXJSZWN0KDAsMCxjdHguY2FudmFzLndpZHRoLCBjdHguY2FudmFzLmhlaWdodCk7CiAgICAgICAgICAgICAgICBwbG90LnJlZHJhdygpOwogICAgICAgICAgICAgICAgYy5fem9vbS5pc1pvb21lZCA9IHRydWU7CiAgICAgICAgICAgICAgICBjdHggPSBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHBsb3QudGFyZ2V0LnRyaWdnZXIoJ2pxcGxvdFpvb20nLCBbZ3JpZHBvcywgZGF0YXBvcywgcGxvdCwgY3Vyc29yXSk7CiAgICAgICAgfQogICAgfTsKICAgIAogICAgJC5qcXBsb3QucHJlSW5pdEhvb2tzLnB1c2goJC5qcXBsb3QuQ3Vyc29yLmluaXQpOwogICAgJC5qcXBsb3QucG9zdERyYXdIb29rcy5wdXNoKCQuanFwbG90LkN1cnNvci5wb3N0RHJhdyk7CiAgICAKICAgIGZ1bmN0aW9uIHVwZGF0ZVRvb2x0aXAoZ3JpZHBvcywgZGF0YXBvcywgcGxvdCkgewogICAgICAgIHZhciBjID0gcGxvdC5wbHVnaW5zLmN1cnNvcjsKICAgICAgICB2YXIgcyA9ICcnOwogICAgICAgIHZhciBhZGRiciA9IGZhbHNlOwogICAgICAgIGlmIChjLnNob3dUb29sdGlwR3JpZFBvc2l0aW9uKSB7CiAgICAgICAgICAgIHMgPSBncmlkcG9zLngrJywgJytncmlkcG9zLnk7CiAgICAgICAgICAgIGFkZGJyID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgaWYgKGMuc2hvd1Rvb2x0aXBVbml0UG9zaXRpb24pIHsKICAgICAgICAgICAgdmFyIGc7CiAgICAgICAgICAgIGZvciAodmFyIGk9MDsgaTxjLnRvb2x0aXBBeGlzR3JvdXBzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICBnID0gYy50b29sdGlwQXhpc0dyb3Vwc1tpXTsKICAgICAgICAgICAgICAgIGlmIChhZGRicikgewogICAgICAgICAgICAgICAgICAgIHMgKz0gJzxiciAvPic7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoYy51c2VBeGVzRm9ybWF0dGVycykgewogICAgICAgICAgICAgICAgICAgIHZhciB4ZiA9IHBsb3QuYXhlc1tnWzBdXS5fdGlja3NbMF0uZm9ybWF0dGVyOwogICAgICAgICAgICAgICAgICAgIHZhciB5ZiA9IHBsb3QuYXhlc1tnWzFdXS5fdGlja3NbMF0uZm9ybWF0dGVyOwogICAgICAgICAgICAgICAgICAgIHZhciB4ZnN0ciA9IHBsb3QuYXhlc1tnWzBdXS5fdGlja3NbMF0uZm9ybWF0U3RyaW5nOwogICAgICAgICAgICAgICAgICAgIHZhciB5ZnN0ciA9IHBsb3QuYXhlc1tnWzFdXS5fdGlja3NbMF0uZm9ybWF0U3RyaW5nOwogICAgICAgICAgICAgICAgICAgIHMgKz0geGYoeGZzdHIsIGRhdGFwb3NbZ1swXV0pICsgJywgJysgeWYoeWZzdHIsIGRhdGFwb3NbZ1sxXV0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgcyArPSAkLmpxcGxvdC5zcHJpbnRmKGMudG9vbHRpcEZvcm1hdFN0cmluZywgZGF0YXBvc1tnWzBdXSwgZGF0YXBvc1tnWzFdXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBhZGRiciA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYgKGMuc2hvd1Rvb2x0aXBEYXRhUG9zaXRpb24pIHsKICAgICAgICAgICAgdmFyIHNlcmllcyA9IHBsb3Quc2VyaWVzOyAKICAgICAgICAgICAgdmFyIHJldCA9IGdldEludGVyc2VjdGluZ1BvaW50cyhwbG90LCBncmlkcG9zLngsIGdyaWRwb3MueSk7CiAgICAgICAgICAgIHZhciBhZGRiciA9IGZhbHNlOwogICAgICAgIAogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaTwgc2VyaWVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICBpZiAoc2VyaWVzW2ldLnNob3cpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgaWR4ID0gc2VyaWVzW2ldLmluZGV4OwogICAgICAgICAgICAgICAgICAgIHZhciBsYWJlbCA9IHNlcmllc1tpXS5sYWJlbC50b1N0cmluZygpOwogICAgICAgICAgICAgICAgICAgIHZhciBjZWxsaWQgPSAkLmluQXJyYXkoaWR4LCByZXQuaW5kaWNlcyk7CiAgICAgICAgICAgICAgICAgICAgdmFyIHN4ID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgICAgIHZhciBzeSA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgICAgICBpZiAoY2VsbGlkICE9IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkYXRhID0gcmV0LmRhdGFbY2VsbGlkXS5kYXRhOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYy51c2VBeGVzRm9ybWF0dGVycykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHhmID0gc2VyaWVzW2ldLl94YXhpcy5fdGlja3NbMF0uZm9ybWF0dGVyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHlmID0gc2VyaWVzW2ldLl95YXhpcy5fdGlja3NbMF0uZm9ybWF0dGVyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHhmc3RyID0gc2VyaWVzW2ldLl94YXhpcy5fdGlja3NbMF0uZm9ybWF0U3RyaW5nOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHlmc3RyID0gc2VyaWVzW2ldLl95YXhpcy5fdGlja3NbMF0uZm9ybWF0U3RyaW5nOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ggPSB4Zih4ZnN0ciwgZGF0YVswXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeSA9IHlmKHlmc3RyLCBkYXRhWzFdKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN4ID0gZGF0YVswXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5ID0gZGF0YVsxXTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWRkYnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMgKz0gJzxiciAvPic7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcyArPSAkLmpxcGxvdC5zcHJpbnRmKGMudG9vbHRpcEZvcm1hdFN0cmluZywgbGFiZWwsIHN4LCBzeSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGFkZGJyID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgfQogICAgICAgIGMuX3Rvb2x0aXBFbGVtLmh0bWwocyk7CiAgICB9CiAgICAKICAgIGZ1bmN0aW9uIG1vdmVMaW5lKGdyaWRwb3MsIHBsb3QpIHsKICAgICAgICB2YXIgYyA9IHBsb3QucGx1Z2lucy5jdXJzb3I7CiAgICAgICAgdmFyIGN0eCA9IGMuY3Vyc29yQ2FudmFzLl9jdHg7CiAgICAgICAgY3R4LmNsZWFyUmVjdCgwLDAsY3R4LmNhbnZhcy53aWR0aCwgY3R4LmNhbnZhcy5oZWlnaHQpOwogICAgICAgIGlmIChjLnNob3dWZXJ0aWNhbExpbmUpIHsKICAgICAgICAgICAgYy5zaGFwZVJlbmRlcmVyLmRyYXcoY3R4LCBbW2dyaWRwb3MueCwgMF0sIFtncmlkcG9zLngsIGN0eC5jYW52YXMuaGVpZ2h0XV0pOwogICAgICAgIH0KICAgICAgICBpZiAoYy5zaG93SG9yaXpvbnRhbExpbmUpIHsKICAgICAgICAgICAgYy5zaGFwZVJlbmRlcmVyLmRyYXcoY3R4LCBbWzAsIGdyaWRwb3MueV0sIFtjdHguY2FudmFzLndpZHRoLCBncmlkcG9zLnldXSk7CiAgICAgICAgfQogICAgICAgIHZhciByZXQgPSBnZXRJbnRlcnNlY3RpbmdQb2ludHMocGxvdCwgZ3JpZHBvcy54LCBncmlkcG9zLnkpOwogICAgICAgIGlmIChjLnNob3dDdXJzb3JMZWdlbmQpIHsKICAgICAgICAgICAgdmFyIGNlbGxzID0gJChwbG90LnRhcmdldElkICsgJyB0ZC5qcXBsb3QtY3Vyc29yLWxlZ2VuZC1sYWJlbCcpOwogICAgICAgICAgICBmb3IgKHZhciBpPTA7IGk8Y2VsbHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIHZhciBpZHggPSAkKGNlbGxzW2ldKS5kYXRhKCdzZXJpZXNJbmRleCcpOwogICAgICAgICAgICAgICAgdmFyIHNlcmllcyA9IHBsb3Quc2VyaWVzW2lkeF07CiAgICAgICAgICAgICAgICB2YXIgbGFiZWwgPSBzZXJpZXMubGFiZWwudG9TdHJpbmcoKTsKICAgICAgICAgICAgICAgIHZhciBjZWxsaWQgPSAkLmluQXJyYXkoaWR4LCByZXQuaW5kaWNlcyk7CiAgICAgICAgICAgICAgICB2YXIgc3ggPSB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICB2YXIgc3kgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICBpZiAoY2VsbGlkICE9IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGRhdGEgPSByZXQuZGF0YVtjZWxsaWRdLmRhdGE7CiAgICAgICAgICAgICAgICAgICAgaWYgKGMudXNlQXhlc0Zvcm1hdHRlcnMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHhmID0gc2VyaWVzLl94YXhpcy5fdGlja3NbMF0uZm9ybWF0dGVyOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgeWYgPSBzZXJpZXMuX3lheGlzLl90aWNrc1swXS5mb3JtYXR0ZXI7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB4ZnN0ciA9IHNlcmllcy5feGF4aXMuX3RpY2tzWzBdLmZvcm1hdFN0cmluZzsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHlmc3RyID0gc2VyaWVzLl95YXhpcy5fdGlja3NbMF0uZm9ybWF0U3RyaW5nOwogICAgICAgICAgICAgICAgICAgICAgICBzeCA9IHhmKHhmc3RyLCBkYXRhWzBdKTsKICAgICAgICAgICAgICAgICAgICAgICAgc3kgPSB5Zih5ZnN0ciwgZGF0YVsxXSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBzeCA9IGRhdGFbMF07CiAgICAgICAgICAgICAgICAgICAgICAgIHN5ID0gZGF0YVsxXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAocGxvdC5sZWdlbmQuZXNjYXBlSHRtbCkgewogICAgICAgICAgICAgICAgICAgICQoY2VsbHNbaV0pLnRleHQoJC5qcXBsb3Quc3ByaW50ZihjLmN1cnNvckxlZ2VuZEZvcm1hdFN0cmluZywgbGFiZWwsIHN4LCBzeSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJChjZWxsc1tpXSkuaHRtbCgkLmpxcGxvdC5zcHJpbnRmKGMuY3Vyc29yTGVnZW5kRm9ybWF0U3RyaW5nLCBsYWJlbCwgc3gsIHN5KSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gICAgICAgIAogICAgICAgIH0KICAgICAgICBjdHggPSBudWxsOwogICAgfQogICAgICAgIAogICAgZnVuY3Rpb24gZ2V0SW50ZXJzZWN0aW5nUG9pbnRzKHBsb3QsIHgsIHkpIHsKICAgICAgICB2YXIgcmV0ID0ge2luZGljZXM6W10sIGRhdGE6W119OwogICAgICAgIHZhciBzLCBpLCBkMCwgZCwgaiwgciwgcDsKICAgICAgICB2YXIgdGhyZXNob2xkOwogICAgICAgIHZhciBjID0gcGxvdC5wbHVnaW5zLmN1cnNvcjsKICAgICAgICBmb3IgKHZhciBpPTA7IGk8cGxvdC5zZXJpZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgcyA9IHBsb3Quc2VyaWVzW2ldOwogICAgICAgICAgICByID0gcy5yZW5kZXJlcjsKICAgICAgICAgICAgaWYgKHMuc2hvdykgewogICAgICAgICAgICAgICAgdGhyZXNob2xkID0gYy5pbnRlcnNlY3Rpb25UaHJlc2hvbGQ7CiAgICAgICAgICAgICAgICBpZiAocy5zaG93TWFya2VyKSB7CiAgICAgICAgICAgICAgICAgICAgdGhyZXNob2xkICs9IHMubWFya2VyUmVuZGVyZXIuc2l6ZS8yOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZm9yICh2YXIgaj0wOyBqPHMuZ3JpZERhdGEubGVuZ3RoOyBqKyspIHsKICAgICAgICAgICAgICAgICAgICBwID0gcy5ncmlkRGF0YVtqXTsKICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayB2ZXJ0aWNhbCBsaW5lCiAgICAgICAgICAgICAgICAgICAgaWYgKGMuc2hvd1ZlcnRpY2FsTGluZSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoTWF0aC5hYnMoeC1wWzBdKSA8PSB0aHJlc2hvbGQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldC5pbmRpY2VzLnB1c2goaSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQuZGF0YS5wdXNoKHtzZXJpZXNJbmRleDogaSwgcG9pbnRJbmRleDpqLCBncmlkRGF0YTpwLCBkYXRhOnMuZGF0YVtqXX0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSAKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gcmV0OwogICAgfQogICAgCiAgICBmdW5jdGlvbiBtb3ZlVG9vbHRpcChncmlkcG9zLCBwbG90KSB7CiAgICAgICAgdmFyIGMgPSBwbG90LnBsdWdpbnMuY3Vyc29yOyAgCiAgICAgICAgdmFyIGVsZW0gPSBjLl90b29sdGlwRWxlbTsKICAgICAgICBzd2l0Y2ggKGMudG9vbHRpcExvY2F0aW9uKSB7CiAgICAgICAgICAgIGNhc2UgJ253JzoKICAgICAgICAgICAgICAgIHZhciB4ID0gZ3JpZHBvcy54ICsgcGxvdC5fZ3JpZFBhZGRpbmcubGVmdCAtIGVsZW0ub3V0ZXJXaWR0aCh0cnVlKSAtIGMudG9vbHRpcE9mZnNldDsKICAgICAgICAgICAgICAgIHZhciB5ID0gZ3JpZHBvcy55ICsgcGxvdC5fZ3JpZFBhZGRpbmcudG9wIC0gYy50b29sdGlwT2Zmc2V0IC0gZWxlbS5vdXRlckhlaWdodCh0cnVlKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICduJzoKICAgICAgICAgICAgICAgIHZhciB4ID0gZ3JpZHBvcy54ICsgcGxvdC5fZ3JpZFBhZGRpbmcubGVmdCAtIGVsZW0ub3V0ZXJXaWR0aCh0cnVlKS8yOwogICAgICAgICAgICAgICAgdmFyIHkgPSBncmlkcG9zLnkgKyBwbG90Ll9ncmlkUGFkZGluZy50b3AgLSBjLnRvb2x0aXBPZmZzZXQgLSBlbGVtLm91dGVySGVpZ2h0KHRydWUpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ25lJzoKICAgICAgICAgICAgICAgIHZhciB4ID0gZ3JpZHBvcy54ICsgcGxvdC5fZ3JpZFBhZGRpbmcubGVmdCArIGMudG9vbHRpcE9mZnNldDsKICAgICAgICAgICAgICAgIHZhciB5ID0gZ3JpZHBvcy55ICsgcGxvdC5fZ3JpZFBhZGRpbmcudG9wIC0gYy50b29sdGlwT2Zmc2V0IC0gZWxlbS5vdXRlckhlaWdodCh0cnVlKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdlJzoKICAgICAgICAgICAgICAgIHZhciB4ID0gZ3JpZHBvcy54ICsgcGxvdC5fZ3JpZFBhZGRpbmcubGVmdCArIGMudG9vbHRpcE9mZnNldDsKICAgICAgICAgICAgICAgIHZhciB5ID0gZ3JpZHBvcy55ICsgcGxvdC5fZ3JpZFBhZGRpbmcudG9wIC0gZWxlbS5vdXRlckhlaWdodCh0cnVlKS8yOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3NlJzoKICAgICAgICAgICAgICAgIHZhciB4ID0gZ3JpZHBvcy54ICsgcGxvdC5fZ3JpZFBhZGRpbmcubGVmdCArIGMudG9vbHRpcE9mZnNldDsKICAgICAgICAgICAgICAgIHZhciB5ID0gZ3JpZHBvcy55ICsgcGxvdC5fZ3JpZFBhZGRpbmcudG9wICsgYy50b29sdGlwT2Zmc2V0OwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3MnOgogICAgICAgICAgICAgICAgdmFyIHggPSBncmlkcG9zLnggKyBwbG90Ll9ncmlkUGFkZGluZy5sZWZ0IC0gZWxlbS5vdXRlcldpZHRoKHRydWUpLzI7CiAgICAgICAgICAgICAgICB2YXIgeSA9IGdyaWRwb3MueSArIHBsb3QuX2dyaWRQYWRkaW5nLnRvcCArIGMudG9vbHRpcE9mZnNldDsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdzdyc6CiAgICAgICAgICAgICAgICB2YXIgeCA9IGdyaWRwb3MueCArIHBsb3QuX2dyaWRQYWRkaW5nLmxlZnQgLSBlbGVtLm91dGVyV2lkdGgodHJ1ZSkgLSBjLnRvb2x0aXBPZmZzZXQ7CiAgICAgICAgICAgICAgICB2YXIgeSA9IGdyaWRwb3MueSArIHBsb3QuX2dyaWRQYWRkaW5nLnRvcCArIGMudG9vbHRpcE9mZnNldDsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICd3JzoKICAgICAgICAgICAgICAgIHZhciB4ID0gZ3JpZHBvcy54ICsgcGxvdC5fZ3JpZFBhZGRpbmcubGVmdCAtIGVsZW0ub3V0ZXJXaWR0aCh0cnVlKSAtIGMudG9vbHRpcE9mZnNldDsKICAgICAgICAgICAgICAgIHZhciB5ID0gZ3JpZHBvcy55ICsgcGxvdC5fZ3JpZFBhZGRpbmcudG9wIC0gZWxlbS5vdXRlckhlaWdodCh0cnVlKS8yOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICB2YXIgeCA9IGdyaWRwb3MueCArIHBsb3QuX2dyaWRQYWRkaW5nLmxlZnQgKyBjLnRvb2x0aXBPZmZzZXQ7CiAgICAgICAgICAgICAgICB2YXIgeSA9IGdyaWRwb3MueSArIHBsb3QuX2dyaWRQYWRkaW5nLnRvcCArIGMudG9vbHRpcE9mZnNldDsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgZWxlbS5jc3MoJ2xlZnQnLCB4KTsKICAgICAgICBlbGVtLmNzcygndG9wJywgeSk7CgkgICAgZWxlbSA9IG51bGw7CiAgICB9CiAgICAKICAgIGZ1bmN0aW9uIHBvc2l0aW9uVG9vbHRpcChwbG90KSB7IAogICAgICAgIC8vIGZha2UgYSBncmlkIGZvciBwb3NpdGlvbmluZwogICAgICAgIHZhciBncmlkID0gcGxvdC5fZ3JpZFBhZGRpbmc7IAogICAgICAgIHZhciBjID0gcGxvdC5wbHVnaW5zLmN1cnNvcjsKICAgICAgICB2YXIgZWxlbSA9IGMuX3Rvb2x0aXBFbGVtOyAgCiAgICAgICAgc3dpdGNoIChjLnRvb2x0aXBMb2NhdGlvbikgewogICAgICAgICAgICBjYXNlICdudyc6CiAgICAgICAgICAgICAgICB2YXIgYSA9IGdyaWQubGVmdCArIGMudG9vbHRpcE9mZnNldDsKICAgICAgICAgICAgICAgIHZhciBiID0gZ3JpZC50b3AgKyBjLnRvb2x0aXBPZmZzZXQ7CiAgICAgICAgICAgICAgICBlbGVtLmNzcygnbGVmdCcsIGEpOwogICAgICAgICAgICAgICAgZWxlbS5jc3MoJ3RvcCcsIGIpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ24nOgogICAgICAgICAgICAgICAgdmFyIGEgPSAoZ3JpZC5sZWZ0ICsgKHBsb3QuX3Bsb3REaW1lbnNpb25zLndpZHRoIC0gZ3JpZC5yaWdodCkpLzIgLSBlbGVtLm91dGVyV2lkdGgodHJ1ZSkvMjsKICAgICAgICAgICAgICAgIHZhciBiID0gZ3JpZC50b3AgKyBjLnRvb2x0aXBPZmZzZXQ7CiAgICAgICAgICAgICAgICBlbGVtLmNzcygnbGVmdCcsIGEpOwogICAgICAgICAgICAgICAgZWxlbS5jc3MoJ3RvcCcsIGIpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ25lJzoKICAgICAgICAgICAgICAgIHZhciBhID0gZ3JpZC5yaWdodCArIGMudG9vbHRpcE9mZnNldDsKICAgICAgICAgICAgICAgIHZhciBiID0gZ3JpZC50b3AgKyBjLnRvb2x0aXBPZmZzZXQ7CiAgICAgICAgICAgICAgICBlbGVtLmNzcyh7cmlnaHQ6YSwgdG9wOmJ9KTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdlJzoKICAgICAgICAgICAgICAgIHZhciBhID0gZ3JpZC5yaWdodCArIGMudG9vbHRpcE9mZnNldDsKICAgICAgICAgICAgICAgIHZhciBiID0gKGdyaWQudG9wICsgKHBsb3QuX3Bsb3REaW1lbnNpb25zLmhlaWdodCAtIGdyaWQuYm90dG9tKSkvMiAtIGVsZW0ub3V0ZXJIZWlnaHQodHJ1ZSkvMjsKICAgICAgICAgICAgICAgIGVsZW0uY3NzKHtyaWdodDphLCB0b3A6Yn0pOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3NlJzoKICAgICAgICAgICAgICAgIHZhciBhID0gZ3JpZC5yaWdodCArIGMudG9vbHRpcE9mZnNldDsKICAgICAgICAgICAgICAgIHZhciBiID0gZ3JpZC5ib3R0b20gKyBjLnRvb2x0aXBPZmZzZXQ7CiAgICAgICAgICAgICAgICBlbGVtLmNzcyh7cmlnaHQ6YSwgYm90dG9tOmJ9KTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdzJzoKICAgICAgICAgICAgICAgIHZhciBhID0gKGdyaWQubGVmdCArIChwbG90Ll9wbG90RGltZW5zaW9ucy53aWR0aCAtIGdyaWQucmlnaHQpKS8yIC0gZWxlbS5vdXRlcldpZHRoKHRydWUpLzI7CiAgICAgICAgICAgICAgICB2YXIgYiA9IGdyaWQuYm90dG9tICsgYy50b29sdGlwT2Zmc2V0OwogICAgICAgICAgICAgICAgZWxlbS5jc3Moe2xlZnQ6YSwgYm90dG9tOmJ9KTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdzdyc6CiAgICAgICAgICAgICAgICB2YXIgYSA9IGdyaWQubGVmdCArIGMudG9vbHRpcE9mZnNldDsKICAgICAgICAgICAgICAgIHZhciBiID0gZ3JpZC5ib3R0b20gKyBjLnRvb2x0aXBPZmZzZXQ7CiAgICAgICAgICAgICAgICBlbGVtLmNzcyh7bGVmdDphLCBib3R0b206Yn0pOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3cnOgogICAgICAgICAgICAgICAgdmFyIGEgPSBncmlkLmxlZnQgKyBjLnRvb2x0aXBPZmZzZXQ7CiAgICAgICAgICAgICAgICB2YXIgYiA9IChncmlkLnRvcCArIChwbG90Ll9wbG90RGltZW5zaW9ucy5oZWlnaHQgLSBncmlkLmJvdHRvbSkpLzIgLSBlbGVtLm91dGVySGVpZ2h0KHRydWUpLzI7CiAgICAgICAgICAgICAgICBlbGVtLmNzcyh7bGVmdDphLCB0b3A6Yn0pOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGRlZmF1bHQ6ICAvLyBzYW1lIGFzICdzZScKICAgICAgICAgICAgICAgIHZhciBhID0gZ3JpZC5yaWdodCAtIGMudG9vbHRpcE9mZnNldDsKICAgICAgICAgICAgICAgIHZhciBiID0gZ3JpZC5ib3R0b20gKyBjLnRvb2x0aXBPZmZzZXQ7CiAgICAgICAgICAgICAgICBlbGVtLmNzcyh7cmlnaHQ6YSwgYm90dG9tOmJ9KTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBlbGVtID0gbnVsbDsKICAgIH0KICAgIAogICAgZnVuY3Rpb24gaGFuZGxlQ2xpY2sgKGV2LCBncmlkcG9zLCBkYXRhcG9zLCBuZWlnaGJvciwgcGxvdCkgewogICAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgZXYuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7CiAgICAgICAgdmFyIGMgPSBwbG90LnBsdWdpbnMuY3Vyc29yOwogICAgICAgIGlmIChjLmNsaWNrUmVzZXQpIHsKICAgICAgICAgICAgYy5yZXNldFpvb20ocGxvdCwgYyk7CiAgICAgICAgfQogICAgICAgIHZhciBzZWwgPSB3aW5kb3cuZ2V0U2VsZWN0aW9uOwogICAgICAgIGlmIChkb2N1bWVudC5zZWxlY3Rpb24gJiYgZG9jdW1lbnQuc2VsZWN0aW9uLmVtcHR5KQogICAgICAgIHsKICAgICAgICAgICAgZG9jdW1lbnQuc2VsZWN0aW9uLmVtcHR5KCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHNlbCAmJiAhc2VsKCkuaXNDb2xsYXBzZWQpIHsKICAgICAgICAgICAgc2VsKCkuY29sbGFwc2UoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgCiAgICBmdW5jdGlvbiBoYW5kbGVEYmxDbGljayAoZXYsIGdyaWRwb3MsIGRhdGFwb3MsIG5laWdoYm9yLCBwbG90KSB7CiAgICAgICAgZXYucHJldmVudERlZmF1bHQoKTsKICAgICAgICBldi5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTsKICAgICAgICB2YXIgYyA9IHBsb3QucGx1Z2lucy5jdXJzb3I7CiAgICAgICAgaWYgKGMuZGJsQ2xpY2tSZXNldCkgewogICAgICAgICAgICBjLnJlc2V0Wm9vbShwbG90LCBjKTsKICAgICAgICB9CiAgICAgICAgdmFyIHNlbCA9IHdpbmRvdy5nZXRTZWxlY3Rpb247CiAgICAgICAgaWYgKGRvY3VtZW50LnNlbGVjdGlvbiAmJiBkb2N1bWVudC5zZWxlY3Rpb24uZW1wdHkpCiAgICAgICAgewogICAgICAgICAgICBkb2N1bWVudC5zZWxlY3Rpb24uZW1wdHkoKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoc2VsICYmICFzZWwoKS5pc0NvbGxhcHNlZCkgewogICAgICAgICAgICBzZWwoKS5jb2xsYXBzZSgpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICAKICAgIGZ1bmN0aW9uIGhhbmRsZU1vdXNlTGVhdmUoZXYsIGdyaWRwb3MsIGRhdGFwb3MsIG5laWdoYm9yLCBwbG90KSB7CiAgICAgICAgdmFyIGMgPSBwbG90LnBsdWdpbnMuY3Vyc29yOwogICAgICAgIGMub25HcmlkID0gZmFsc2U7CiAgICAgICAgaWYgKGMuc2hvdykgewogICAgICAgICAgICAkKGV2LnRhcmdldCkuY3NzKCdjdXJzb3InLCBjLnByZXZpb3VzQ3Vyc29yKTsKICAgICAgICAgICAgaWYgKGMuc2hvd1Rvb2x0aXAgJiYgIShjLl96b29tLnpvb21pbmcgJiYgYy5zaG93VG9vbHRpcE91dHNpZGVab29tICYmICFjLmNvbnN0cmFpbk91dHNpZGVab29tKSkgewogICAgICAgICAgICAgICAgYy5fdG9vbHRpcEVsZW0uaGlkZSgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChjLnpvb20pIHsKICAgICAgICAgICAgICAgIGMuX3pvb20uZ3JpZHBvcyA9IGdyaWRwb3M7CiAgICAgICAgICAgICAgICBjLl96b29tLmRhdGFwb3MgPSBkYXRhcG9zOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChjLnNob3dWZXJ0aWNhbExpbmUgfHwgYy5zaG93SG9yaXpvbnRhbExpbmUpIHsKICAgICAgICAgICAgICAgIHZhciBjdHggPSBjLmN1cnNvckNhbnZhcy5fY3R4OwogICAgICAgICAgICAgICAgY3R4LmNsZWFyUmVjdCgwLDAsY3R4LmNhbnZhcy53aWR0aCwgY3R4LmNhbnZhcy5oZWlnaHQpOwogICAgICAgICAgICAgICAgY3R4ID0gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoYy5zaG93Q3Vyc29yTGVnZW5kKSB7CiAgICAgICAgICAgICAgICB2YXIgY2VsbHMgPSAkKHBsb3QudGFyZ2V0SWQgKyAnIHRkLmpxcGxvdC1jdXJzb3ItbGVnZW5kLWxhYmVsJyk7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpPTA7IGk8Y2VsbHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICB2YXIgaWR4ID0gJChjZWxsc1tpXSkuZGF0YSgnc2VyaWVzSW5kZXgnKTsKICAgICAgICAgICAgICAgICAgICB2YXIgc2VyaWVzID0gcGxvdC5zZXJpZXNbaWR4XTsKICAgICAgICAgICAgICAgICAgICB2YXIgbGFiZWwgPSBzZXJpZXMubGFiZWwudG9TdHJpbmcoKTsKICAgICAgICAgICAgICAgICAgICBpZiAocGxvdC5sZWdlbmQuZXNjYXBlSHRtbCkgewogICAgICAgICAgICAgICAgICAgICAgICAkKGNlbGxzW2ldKS50ZXh0KCQuanFwbG90LnNwcmludGYoYy5jdXJzb3JMZWdlbmRGb3JtYXRTdHJpbmcsIGxhYmVsLCB1bmRlZmluZWQsIHVuZGVmaW5lZCkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgJChjZWxsc1tpXSkuaHRtbCgkLmpxcGxvdC5zcHJpbnRmKGMuY3Vyc29yTGVnZW5kRm9ybWF0U3RyaW5nLCBsYWJlbCwgdW5kZWZpbmVkLCB1bmRlZmluZWQpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIH0gICAgICAgIAogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgCiAgICBmdW5jdGlvbiBoYW5kbGVNb3VzZUVudGVyKGV2LCBncmlkcG9zLCBkYXRhcG9zLCBuZWlnaGJvciwgcGxvdCkgewogICAgICAgIHZhciBjID0gcGxvdC5wbHVnaW5zLmN1cnNvcjsKICAgICAgICBjLm9uR3JpZCA9IHRydWU7CiAgICAgICAgaWYgKGMuc2hvdykgewogICAgICAgICAgICBjLnByZXZpb3VzQ3Vyc29yID0gZXYudGFyZ2V0LnN0eWxlLmN1cnNvcjsKICAgICAgICAgICAgZXYudGFyZ2V0LnN0eWxlLmN1cnNvciA9IGMuc3R5bGU7CiAgICAgICAgICAgIGlmIChjLnNob3dUb29sdGlwKSB7CiAgICAgICAgICAgICAgICB1cGRhdGVUb29sdGlwKGdyaWRwb3MsIGRhdGFwb3MsIHBsb3QpOwogICAgICAgICAgICAgICAgaWYgKGMuZm9sbG93TW91c2UpIHsKICAgICAgICAgICAgICAgICAgICBtb3ZlVG9vbHRpcChncmlkcG9zLCBwbG90KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uVG9vbHRpcChwbG90KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGMuX3Rvb2x0aXBFbGVtLnNob3coKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoYy5zaG93VmVydGljYWxMaW5lIHx8IGMuc2hvd0hvcml6b250YWxMaW5lKSB7CiAgICAgICAgICAgICAgICBtb3ZlTGluZShncmlkcG9zLCBwbG90KTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICB9ICAgIAogICAgCiAgICBmdW5jdGlvbiBoYW5kbGVNb3VzZU1vdmUoZXYsIGdyaWRwb3MsIGRhdGFwb3MsIG5laWdoYm9yLCBwbG90KSB7CiAgICAgICAgdmFyIGMgPSBwbG90LnBsdWdpbnMuY3Vyc29yOwogICAgICAgIGlmIChjLnNob3cpIHsKICAgICAgICAgICAgaWYgKGMuc2hvd1Rvb2x0aXApIHsKICAgICAgICAgICAgICAgIHVwZGF0ZVRvb2x0aXAoZ3JpZHBvcywgZGF0YXBvcywgcGxvdCk7CiAgICAgICAgICAgICAgICBpZiAoYy5mb2xsb3dNb3VzZSkgewogICAgICAgICAgICAgICAgICAgIG1vdmVUb29sdGlwKGdyaWRwb3MsIHBsb3QpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChjLnNob3dWZXJ0aWNhbExpbmUgfHwgYy5zaG93SG9yaXpvbnRhbExpbmUpIHsKICAgICAgICAgICAgICAgIG1vdmVMaW5lKGdyaWRwb3MsIHBsb3QpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgICAgICAgICAKICAgIGZ1bmN0aW9uIGdldEV2ZW50UG9zaXRpb24oZXYpIHsKICAgICAgICB2YXIgcGxvdCA9IGV2LmRhdGEucGxvdDsKICAgICAgICB2YXIgZ28gPSBwbG90LmV2ZW50Q2FudmFzLl9lbGVtLm9mZnNldCgpOwogICAgICAgIHZhciBncmlkUG9zID0ge3g6ZXYucGFnZVggLSBnby5sZWZ0LCB5OmV2LnBhZ2VZIC0gZ28udG9wfTsKICAgICAgICAvLy8vLy8KICAgICAgICAvLyBUTyBETzogaGFuZGxlIHlNaWRBeGlzCiAgICAgICAgLy8vLy8vCiAgICAgICAgdmFyIGRhdGFQb3MgPSB7eGF4aXM6bnVsbCwgeWF4aXM6bnVsbCwgeDJheGlzOm51bGwsIHkyYXhpczpudWxsLCB5M2F4aXM6bnVsbCwgeTRheGlzOm51bGwsIHk1YXhpczpudWxsLCB5NmF4aXM6bnVsbCwgeTdheGlzOm51bGwsIHk4YXhpczpudWxsLCB5OWF4aXM6bnVsbCwgeU1pZEF4aXM6bnVsbH07CiAgICAgICAgdmFyIGFuID0gWyd4YXhpcycsICd5YXhpcycsICd4MmF4aXMnLCAneTJheGlzJywgJ3kzYXhpcycsICd5NGF4aXMnLCAneTVheGlzJywgJ3k2YXhpcycsICd5N2F4aXMnLCAneThheGlzJywgJ3k5YXhpcycsICd5TWlkQXhpcyddOwogICAgICAgIHZhciBheCA9IHBsb3QuYXhlczsKICAgICAgICB2YXIgbiwgYXhpczsKICAgICAgICBmb3IgKG49MTE7IG4+MDsgbi0tKSB7CiAgICAgICAgICAgIGF4aXMgPSBhbltuLTFdOwogICAgICAgICAgICBpZiAoYXhbYXhpc10uc2hvdykgewogICAgICAgICAgICAgICAgZGF0YVBvc1theGlzXSA9IGF4W2F4aXNdLnNlcmllc19wMnUoZ3JpZFBvc1theGlzLmNoYXJBdCgwKV0pOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4ge29mZnNldHM6Z28sIGdyaWRQb3M6Z3JpZFBvcywgZGF0YVBvczpkYXRhUG9zfTsKICAgIH0gICAgCiAgICAKICAgIGZ1bmN0aW9uIGhhbmRsZVpvb21Nb3ZlKGV2KSB7CiAgICAgICAgdmFyIHBsb3QgPSBldi5kYXRhLnBsb3Q7CiAgICAgICAgdmFyIGMgPSBwbG90LnBsdWdpbnMuY3Vyc29yOwogICAgICAgIC8vIGRvbid0IGRvIGFueXRoaW5nIGlmIG5vdCBvbiBncmlkLgogICAgICAgIGlmIChjLnNob3cgJiYgYy56b29tICYmIGMuX3pvb20uc3RhcnRlZCAmJiAhYy56b29tVGFyZ2V0KSB7CiAgICAgICAgICAgIHZhciBjdHggPSBjLnpvb21DYW52YXMuX2N0eDsKICAgICAgICAgICAgdmFyIHBvc2l0aW9ucyA9IGdldEV2ZW50UG9zaXRpb24oZXYpOwogICAgICAgICAgICB2YXIgZ3JpZHBvcyA9IHBvc2l0aW9ucy5ncmlkUG9zOwogICAgICAgICAgICB2YXIgZGF0YXBvcyA9IHBvc2l0aW9ucy5kYXRhUG9zOwogICAgICAgICAgICBjLl96b29tLmdyaWRwb3MgPSBncmlkcG9zOwogICAgICAgICAgICBjLl96b29tLmRhdGFwb3MgPSBkYXRhcG9zOwogICAgICAgICAgICBjLl96b29tLnpvb21pbmcgPSB0cnVlOwogICAgICAgICAgICB2YXIgeHBvcyA9IGdyaWRwb3MueDsKICAgICAgICAgICAgdmFyIHlwb3MgPSBncmlkcG9zLnk7CiAgICAgICAgICAgIHZhciBoZWlnaHQgPSBjdHguY2FudmFzLmhlaWdodDsKICAgICAgICAgICAgdmFyIHdpZHRoID0gY3R4LmNhbnZhcy53aWR0aDsKICAgICAgICAgICAgaWYgKGMuc2hvd1Rvb2x0aXAgJiYgIWMub25HcmlkICYmIGMuc2hvd1Rvb2x0aXBPdXRzaWRlWm9vbSkgewogICAgICAgICAgICAgICAgdXBkYXRlVG9vbHRpcChncmlkcG9zLCBkYXRhcG9zLCBwbG90KTsKICAgICAgICAgICAgICAgIGlmIChjLmZvbGxvd01vdXNlKSB7CiAgICAgICAgICAgICAgICAgICAgbW92ZVRvb2x0aXAoZ3JpZHBvcywgcGxvdCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGMuY29uc3RyYWluWm9vbVRvID09ICd4JykgewogICAgICAgICAgICAgICAgYy5fem9vbS5lbmQgPSBbeHBvcywgaGVpZ2h0XTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChjLmNvbnN0cmFpblpvb21UbyA9PSAneScpIHsKICAgICAgICAgICAgICAgIGMuX3pvb20uZW5kID0gW3dpZHRoLCB5cG9zXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGMuX3pvb20uZW5kID0gW3hwb3MsIHlwb3NdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBzZWwgPSB3aW5kb3cuZ2V0U2VsZWN0aW9uOwogICAgICAgICAgICBpZiAoZG9jdW1lbnQuc2VsZWN0aW9uICYmIGRvY3VtZW50LnNlbGVjdGlvbi5lbXB0eSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZG9jdW1lbnQuc2VsZWN0aW9uLmVtcHR5KCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoc2VsICYmICFzZWwoKS5pc0NvbGxhcHNlZCkgewogICAgICAgICAgICAgICAgc2VsKCkuY29sbGFwc2UoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBkcmF3Wm9vbUJveC5jYWxsKGMpOwogICAgICAgICAgICBjdHggPSBudWxsOwogICAgICAgIH0KICAgIH0KICAgIAogICAgZnVuY3Rpb24gaGFuZGxlTW91c2VEb3duKGV2LCBncmlkcG9zLCBkYXRhcG9zLCBuZWlnaGJvciwgcGxvdCkgewogICAgICAgIHZhciBjID0gcGxvdC5wbHVnaW5zLmN1cnNvcjsKICAgICAgICAkKGRvY3VtZW50KS5vbmUoJ21vdXNldXAuanFwbG90X2N1cnNvcicsIHtwbG90OnBsb3R9LCBoYW5kbGVNb3VzZVVwKTsKICAgICAgICB2YXIgYXhlcyA9IHBsb3QuYXhlczsKICAgICAgICBpZiAoZG9jdW1lbnQub25zZWxlY3RzdGFydCAhPSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgYy5fb2xkSGFuZGxlcnMub25zZWxlY3RzdGFydCA9IGRvY3VtZW50Lm9uc2VsZWN0c3RhcnQ7CiAgICAgICAgICAgIGRvY3VtZW50Lm9uc2VsZWN0c3RhcnQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBmYWxzZTsgfTsKICAgICAgICB9CiAgICAgICAgaWYgKGRvY3VtZW50Lm9uZHJhZyAhPSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgYy5fb2xkSGFuZGxlcnMub25kcmFnID0gZG9jdW1lbnQub25kcmFnOwogICAgICAgICAgICBkb2N1bWVudC5vbmRyYWcgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBmYWxzZTsgfTsKICAgICAgICB9CiAgICAgICAgaWYgKGRvY3VtZW50Lm9ubW91c2Vkb3duICE9IHVuZGVmaW5lZCkgewogICAgICAgICAgICBjLl9vbGRIYW5kbGVycy5vbm1vdXNlZG93biA9IGRvY3VtZW50Lm9ubW91c2Vkb3duOwogICAgICAgICAgICBkb2N1bWVudC5vbm1vdXNlZG93biA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGZhbHNlOyB9OwogICAgICAgIH0KICAgICAgICBpZiAoYy56b29tKSB7CiAgICAgICAgICAgIGlmICghYy56b29tUHJveHkpIHsKICAgICAgICAgICAgICAgIHZhciBjdHggPSBjLnpvb21DYW52YXMuX2N0eDsKICAgICAgICAgICAgICAgIGN0eC5jbGVhclJlY3QoMCwwLGN0eC5jYW52YXMud2lkdGgsIGN0eC5jYW52YXMuaGVpZ2h0KTsKICAgICAgICAgICAgICAgIGN0eCA9IG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGMuY29uc3RyYWluWm9vbVRvID09ICd4JykgewogICAgICAgICAgICAgICAgYy5fem9vbS5zdGFydCA9IFtncmlkcG9zLngsIDBdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKGMuY29uc3RyYWluWm9vbVRvID09ICd5JykgewogICAgICAgICAgICAgICAgYy5fem9vbS5zdGFydCA9IFswLCBncmlkcG9zLnldOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgYy5fem9vbS5zdGFydCA9IFtncmlkcG9zLngsIGdyaWRwb3MueV07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYy5fem9vbS5zdGFydGVkID0gdHJ1ZTsKICAgICAgICAgICAgZm9yICh2YXIgYXggaW4gZGF0YXBvcykgewogICAgICAgICAgICAgICAgLy8gZ2V0IHpvb20gc3RhcnRpbmcgcG9zaXRpb24uCiAgICAgICAgICAgICAgICBjLl96b29tLmF4ZXMuc3RhcnRbYXhdID0gZGF0YXBvc1theF07CiAgICAgICAgICAgIH0gIAogICAgICAgICAgICAkKGRvY3VtZW50KS5iaW5kKCdtb3VzZW1vdmUuanFwbG90Q3Vyc29yJywge3Bsb3Q6cGxvdH0sIGhhbmRsZVpvb21Nb3ZlKTsgICAgICAgICAgICAgIAogICAgICAgIH0KICAgIH0KICAgIAogICAgZnVuY3Rpb24gaGFuZGxlTW91c2VVcChldikgewogICAgICAgIHZhciBwbG90ID0gZXYuZGF0YS5wbG90OwogICAgICAgIHZhciBjID0gcGxvdC5wbHVnaW5zLmN1cnNvcjsKICAgICAgICBpZiAoYy56b29tICYmIGMuX3pvb20uem9vbWluZyAmJiAhYy56b29tVGFyZ2V0KSB7CiAgICAgICAgICAgIHZhciB4cG9zID0gYy5fem9vbS5ncmlkcG9zLng7CiAgICAgICAgICAgIHZhciB5cG9zID0gYy5fem9vbS5ncmlkcG9zLnk7CiAgICAgICAgICAgIHZhciBkYXRhcG9zID0gYy5fem9vbS5kYXRhcG9zOwogICAgICAgICAgICB2YXIgaGVpZ2h0ID0gYy56b29tQ2FudmFzLl9jdHguY2FudmFzLmhlaWdodDsKICAgICAgICAgICAgdmFyIHdpZHRoID0gYy56b29tQ2FudmFzLl9jdHguY2FudmFzLndpZHRoOwogICAgICAgICAgICB2YXIgYXhlcyA9IHBsb3QuYXhlczsKICAgICAgICAgICAgCiAgICAgICAgICAgIGlmIChjLmNvbnN0cmFpbk91dHNpZGVab29tICYmICFjLm9uR3JpZCkgewogICAgICAgICAgICAgICAgaWYgKHhwb3MgPCAwKSB7IHhwb3MgPSAwOyB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICh4cG9zID4gd2lkdGgpIHsgeHBvcyA9IHdpZHRoOyB9CiAgICAgICAgICAgICAgICBpZiAoeXBvcyA8IDApIHsgeXBvcyA9IDA7IH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKHlwb3MgPiBoZWlnaHQpIHsgeXBvcyA9IGhlaWdodDsgfQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBmb3IgKHZhciBheGlzIGluIGRhdGFwb3MpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YXBvc1theGlzXSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXhpcy5jaGFyQXQoMCkgPT0gJ3gnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhcG9zW2F4aXNdID0gYXhlc1theGlzXS5zZXJpZXNfcDJ1KHhwb3MpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YXBvc1theGlzXSA9IGF4ZXNbYXhpc10uc2VyaWVzX3AydSh5cG9zKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgaWYgKGMuY29uc3RyYWluWm9vbVRvID09ICd4JykgewogICAgICAgICAgICAgICAgeXBvcyA9IGhlaWdodDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChjLmNvbnN0cmFpblpvb21UbyA9PSAneScpIHsKICAgICAgICAgICAgICAgIHhwb3MgPSB3aWR0aDsKICAgICAgICAgICAgfQogICAgICAgICAgICBjLl96b29tLmVuZCA9IFt4cG9zLCB5cG9zXTsKICAgICAgICAgICAgYy5fem9vbS5ncmlkcG9zID0ge3g6eHBvcywgeTp5cG9zfTsKICAgICAgICAgICAgCiAgICAgICAgICAgIGMuZG9ab29tKGMuX3pvb20uZ3JpZHBvcywgZGF0YXBvcywgcGxvdCwgYyk7CiAgICAgICAgfQogICAgICAgIGMuX3pvb20uc3RhcnRlZCA9IGZhbHNlOwogICAgICAgIGMuX3pvb20uem9vbWluZyA9IGZhbHNlOwogICAgICAgIAogICAgICAgICQoZG9jdW1lbnQpLnVuYmluZCgnbW91c2Vtb3ZlLmpxcGxvdEN1cnNvcicsIGhhbmRsZVpvb21Nb3ZlKTsKICAgICAgICAKICAgICAgICBpZiAoZG9jdW1lbnQub25zZWxlY3RzdGFydCAhPSB1bmRlZmluZWQgJiYgYy5fb2xkSGFuZGxlcnMub25zZWxlY3RzdGFydCAhPSBudWxsKXsKICAgICAgICAgICAgZG9jdW1lbnQub25zZWxlY3RzdGFydCA9IGMuX29sZEhhbmRsZXJzLm9uc2VsZWN0c3RhcnQ7CiAgICAgICAgICAgIGMuX29sZEhhbmRsZXJzLm9uc2VsZWN0c3RhcnQgPSBudWxsOwogICAgICAgIH0KICAgICAgICBpZiAoZG9jdW1lbnQub25kcmFnICE9IHVuZGVmaW5lZCAmJiBjLl9vbGRIYW5kbGVycy5vbmRyYWcgIT0gbnVsbCl7CiAgICAgICAgICAgIGRvY3VtZW50Lm9uZHJhZyA9IGMuX29sZEhhbmRsZXJzLm9uZHJhZzsKICAgICAgICAgICAgYy5fb2xkSGFuZGxlcnMub25kcmFnID0gbnVsbDsKICAgICAgICB9CiAgICAgICAgaWYgKGRvY3VtZW50Lm9ubW91c2Vkb3duICE9IHVuZGVmaW5lZCAmJiBjLl9vbGRIYW5kbGVycy5vbm1vdXNlZG93biAhPSBudWxsKXsKICAgICAgICAgICAgZG9jdW1lbnQub25tb3VzZWRvd24gPSBjLl9vbGRIYW5kbGVycy5vbm1vdXNlZG93bjsKICAgICAgICAgICAgYy5fb2xkSGFuZGxlcnMub25tb3VzZWRvd24gPSBudWxsOwogICAgICAgIH0KCiAgICB9CiAgICAKICAgIGZ1bmN0aW9uIGRyYXdab29tQm94KCkgewogICAgICAgIHZhciBzdGFydCA9IHRoaXMuX3pvb20uc3RhcnQ7CiAgICAgICAgdmFyIGVuZCA9IHRoaXMuX3pvb20uZW5kOwogICAgICAgIHZhciBjdHggPSB0aGlzLnpvb21DYW52YXMuX2N0eDsKICAgICAgICB2YXIgbCwgdCwgaCwgdzsKICAgICAgICBpZiAoZW5kWzBdID4gc3RhcnRbMF0pIHsKICAgICAgICAgICAgbCA9IHN0YXJ0WzBdOwogICAgICAgICAgICB3ID0gZW5kWzBdIC0gc3RhcnRbMF07CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBsID0gZW5kWzBdOwogICAgICAgICAgICB3ID0gc3RhcnRbMF0gLSBlbmRbMF07CiAgICAgICAgfQogICAgICAgIGlmIChlbmRbMV0gPiBzdGFydFsxXSkgewogICAgICAgICAgICB0ID0gc3RhcnRbMV07CiAgICAgICAgICAgIGggPSBlbmRbMV0gLSBzdGFydFsxXTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHQgPSBlbmRbMV07CiAgICAgICAgICAgIGggPSBzdGFydFsxXSAtIGVuZFsxXTsKICAgICAgICB9CiAgICAgICAgY3R4LmZpbGxTdHlsZSA9ICdyZ2JhKDAsMCwwLDAuMiknOwogICAgICAgIGN0eC5zdHJva2VTdHlsZSA9ICcjOTk5OTk5JzsKICAgICAgICBjdHgubGluZVdpZHRoID0gMS4wOwogICAgICAgIGN0eC5jbGVhclJlY3QoMCwwLGN0eC5jYW52YXMud2lkdGgsIGN0eC5jYW52YXMuaGVpZ2h0KTsKICAgICAgICBjdHguZmlsbFJlY3QoMCwwLGN0eC5jYW52YXMud2lkdGgsIGN0eC5jYW52YXMuaGVpZ2h0KTsKICAgICAgICBjdHguY2xlYXJSZWN0KGwsIHQsIHcsIGgpOwogICAgICAgIC8vIElFIHdvbid0IHNob3cgdHJhbnNwYXJlbnQgZmlsbCByZWN0LCBzbyBzdHJva2UgYSByZWN0IGFsc28uCiAgICAgICAgY3R4LnN0cm9rZVJlY3QobCx0LHcsaCk7CiAgICAgICAgY3R4ID0gbnVsbDsKICAgIH0KICAgIAogICAgJC5qcXBsb3QuQ3Vyc29yTGVnZW5kUmVuZGVyZXIgPSBmdW5jdGlvbihvcHRpb25zKSB7CiAgICAgICAgJC5qcXBsb3QuVGFibGVMZWdlbmRSZW5kZXJlci5jYWxsKHRoaXMsIG9wdGlvbnMpOwogICAgICAgIHRoaXMuZm9ybWF0U3RyaW5nID0gJyVzJzsKICAgIH07CiAgICAKICAgICQuanFwbG90LkN1cnNvckxlZ2VuZFJlbmRlcmVyLnByb3RvdHlwZSA9IG5ldyAkLmpxcGxvdC5UYWJsZUxlZ2VuZFJlbmRlcmVyKCk7CiAgICAkLmpxcGxvdC5DdXJzb3JMZWdlbmRSZW5kZXJlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSAkLmpxcGxvdC5DdXJzb3JMZWdlbmRSZW5kZXJlcjsKICAgIAogICAgLy8gY2FsbGVkIGluIGNvbnRleHQgb2YgYSBMZWdlbmQKICAgICQuanFwbG90LkN1cnNvckxlZ2VuZFJlbmRlcmVyLnByb3RvdHlwZS5kcmF3ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgaWYgKHRoaXMuX2VsZW0pIHsKICAgICAgICAgICAgdGhpcy5fZWxlbS5lbXB0eUZvcmNlKCk7CiAgICAgICAgICAgIHRoaXMuX2VsZW0gPSBudWxsOwogICAgICAgIH0KICAgICAgICBpZiAodGhpcy5zaG93KSB7CiAgICAgICAgICAgIHZhciBzZXJpZXMgPSB0aGlzLl9zZXJpZXMsIHM7CiAgICAgICAgICAgIC8vIG1ha2UgYSB0YWJsZS4gIG9uZSBsaW5lIGxhYmVsIHBlciByb3cuCiAgICAgICAgICAgIHZhciBlbGVtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgICAgICAgIHRoaXMuX2VsZW0gPSAkKGVsZW0pOwogICAgICAgICAgICBlbGVtID0gbnVsbDsKICAgICAgICAgICAgdGhpcy5fZWxlbS5hZGRDbGFzcygnanFwbG90LWxlZ2VuZCBqcXBsb3QtY3Vyc29yLWxlZ2VuZCcpOwogICAgICAgICAgICB0aGlzLl9lbGVtLmNzcygncG9zaXRpb24nLCAnYWJzb2x1dGUnKTsKICAgICAgICAKICAgICAgICAgICAgdmFyIHBhZCA9IGZhbHNlOwogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaTwgc2VyaWVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICBzID0gc2VyaWVzW2ldOwogICAgICAgICAgICAgICAgaWYgKHMuc2hvdyAmJiBzLnNob3dMYWJlbCkgewogICAgICAgICAgICAgICAgICAgIHZhciBsdCA9ICQuanFwbG90LnNwcmludGYodGhpcy5mb3JtYXRTdHJpbmcsIHMubGFiZWwudG9TdHJpbmcoKSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGx0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb2xvciA9IHMuY29sb3I7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzLl9zdGFjayAmJiAhcy5maWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvciA9ICcnOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJvdy5jYWxsKHRoaXMsIGx0LCBjb2xvciwgcGFkLCBpKTsKICAgICAgICAgICAgICAgICAgICAgICAgcGFkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLy8gbGV0IHBsdWdpbnMgYWRkIG1vcmUgcm93cyB0byBsZWdlbmQuICBVc2VkIGJ5IHRyZW5kIGxpbmUgcGx1Z2luLgogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGo9MDsgajwkLmpxcGxvdC5hZGRMZWdlbmRSb3dIb29rcy5sZW5ndGg7IGorKykgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaXRlbSA9ICQuanFwbG90LmFkZExlZ2VuZFJvd0hvb2tzW2pdLmNhbGwodGhpcywgcyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpdGVtKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyb3cuY2FsbCh0aGlzLCBpdGVtLmxhYmVsLCBpdGVtLmNvbG9yLCBwYWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfSAKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2VyaWVzID0gcyA9IG51bGw7CiAgICAgICAgICAgIGRlbGV0ZSBzZXJpZXM7CiAgICAgICAgICAgIGRlbGV0ZSBzOwogICAgICAgIH0KICAgICAgICAKICAgICAgICBmdW5jdGlvbiBhZGRyb3cobGFiZWwsIGNvbG9yLCBwYWQsIGlkeCkgewogICAgICAgICAgICB2YXIgcnMgPSAocGFkKSA/IHRoaXMucm93U3BhY2luZyA6ICcwJzsKICAgICAgICAgICAgdmFyIHRyID0gJCgnPHRyIGNsYXNzPSJqcXBsb3QtbGVnZW5kIGpxcGxvdC1jdXJzb3ItbGVnZW5kIj48L3RyPicpLmFwcGVuZFRvKHRoaXMuX2VsZW0pOwogICAgICAgICAgICB0ci5kYXRhKCdzZXJpZXNJbmRleCcsIGlkeCk7CiAgICAgICAgICAgICQoJzx0ZCBjbGFzcz0ianFwbG90LWxlZ2VuZCBqcXBsb3QtY3Vyc29yLWxlZ2VuZC1zd2F0Y2giIHN0eWxlPSJwYWRkaW5nLXRvcDonK3JzKyc7Ij4nKwogICAgICAgICAgICAgICAgJzxkaXYgc3R5bGU9ImJvcmRlcjoxcHggc29saWQgI2NjY2NjYztwYWRkaW5nOjAuMmVtOyI+JysKICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPSJqcXBsb3QtY3Vyc29yLWxlZ2VuZC1zd2F0Y2giIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOicrY29sb3IrJzsiPjwvZGl2PicrCiAgICAgICAgICAgICAgICAnPC9kaXY+PC90ZD4nKS5hcHBlbmRUbyh0cik7CiAgICAgICAgICAgIHZhciB0ZCA9ICQoJzx0ZCBjbGFzcz0ianFwbG90LWxlZ2VuZCBqcXBsb3QtY3Vyc29yLWxlZ2VuZC1sYWJlbCIgc3R5bGU9InZlcnRpY2FsLWFsaWduOm1pZGRsZTtwYWRkaW5nLXRvcDonK3JzKyc7Ij48L3RkPicpOwogICAgICAgICAgICB0ZC5hcHBlbmRUbyh0cik7CiAgICAgICAgICAgIHRkLmRhdGEoJ3Nlcmllc0luZGV4JywgaWR4KTsKICAgICAgICAgICAgaWYgKHRoaXMuZXNjYXBlSHRtbCkgewogICAgICAgICAgICAgICAgdGQudGV4dChsYWJlbCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICB0ZC5odG1sKGxhYmVsKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0ciA9IG51bGw7CiAgICAgICAgICAgIHRkID0gbnVsbDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXMuX2VsZW07CiAgICB9OwogICAgCn0pKGpRdWVyeSk7]]></data>
	</file>
	<file>
	  <filename>/src/plugins/jqplot.cursor.min.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqCiAqIGpxUGxvdAogKiBQdXJlIEphdmFTY3JpcHQgcGxvdHRpbmcgcGx1Z2luIHVzaW5nIGpRdWVyeQogKgogKiBWZXJzaW9uOiAxLjAuMGIyX3IxMDEyCiAqCiAqIENvcHlyaWdodCAoYykgMjAwOS0yMDExIENocmlzIExlb25lbGxvCiAqIGpxUGxvdCBpcyBjdXJyZW50bHkgYXZhaWxhYmxlIGZvciB1c2UgaW4gYWxsIHBlcnNvbmFsIG9yIGNvbW1lcmNpYWwgcHJvamVjdHMgCiAqIHVuZGVyIGJvdGggdGhlIE1JVCAoaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHApIGFuZCBHUEwgCiAqIHZlcnNpb24gMi4wIChodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC5odG1sKSBsaWNlbnNlcy4gVGhpcyBtZWFucyB0aGF0IHlvdSBjYW4gCiAqIGNob29zZSB0aGUgbGljZW5zZSB0aGF0IGJlc3Qgc3VpdHMgeW91ciBwcm9qZWN0IGFuZCB1c2UgaXQgYWNjb3JkaW5nbHkuIAogKgogKiBBbHRob3VnaCBub3QgcmVxdWlyZWQsIHRoZSBhdXRob3Igd291bGQgYXBwcmVjaWF0ZSBhbiBlbWFpbCBsZXR0aW5nIGhpbSAKICoga25vdyBvZiBhbnkgc3Vic3RhbnRpYWwgdXNlIG9mIGpxUGxvdC4gIFlvdSBjYW4gcmVhY2ggdGhlIGF1dGhvciBhdDogCiAqIGNocmlzIGF0IGpxcGxvdCBkb3QgY29tIG9yIHNlZSBodHRwOi8vd3d3LmpxcGxvdC5jb20vaW5mby5waHAgLgogKgogKiBJZiB5b3UgYXJlIGZlZWxpbmcga2luZCBhbmQgZ2VuZXJvdXMsIGNvbnNpZGVyIHN1cHBvcnRpbmcgdGhlIHByb2plY3QgYnkKICogbWFraW5nIGEgZG9uYXRpb24gYXQ6IGh0dHA6Ly93d3cuanFwbG90LmNvbS9kb25hdGUucGhwIC4KICoKICogc3ByaW50ZiBmdW5jdGlvbnMgY29udGFpbmVkIGluIGpxcGxvdC5zcHJpbnRmLmpzIGJ5IEFzaCBTZWFybGU6CiAqCiAqICAgICB2ZXJzaW9uIDIwMDcuMDQuMjcKICogICAgIGF1dGhvciBBc2ggU2VhcmxlCiAqICAgICBodHRwOi8vaGV4bWVuLmNvbS9ibG9nLzIwMDcvMDMvcHJpbnRmLXNwcmludGYvCiAqICAgICBodHRwOi8vaGV4bWVuLmNvbS9qcy9zcHJpbnRmLmpzCiAqICAgICBUaGUgYXV0aG9yIChBc2ggU2VhcmxlKSBoYXMgcGxhY2VkIHRoaXMgY29kZSBpbiB0aGUgcHVibGljIGRvbWFpbjoKICogICAgICJUaGlzIGNvZGUgaXMgdW5yZXN0cmljdGVkOiB5b3UgYXJlIGZyZWUgdG8gdXNlIGl0IGhvd2V2ZXIgeW91IGxpa2UuIgogKgogKiBpbmNsdWRlZCBqc0RhdGUgbGlicmFyeSBieSBDaHJpcyBMZW9uZWxsbzoKICoKICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEgQ2hyaXMgTGVvbmVsbG8KICoKICoganNEYXRlIGlzIGN1cnJlbnRseSBhdmFpbGFibGUgZm9yIHVzZSBpbiBhbGwgcGVyc29uYWwgb3IgY29tbWVyY2lhbCBwcm9qZWN0cyAKICogdW5kZXIgYm90aCB0aGUgTUlUIGFuZCBHUEwgdmVyc2lvbiAyLjAgbGljZW5zZXMuIFRoaXMgbWVhbnMgdGhhdCB5b3UgY2FuIAogKiBjaG9vc2UgdGhlIGxpY2Vuc2UgdGhhdCBiZXN0IHN1aXRzIHlvdXIgcHJvamVjdCBhbmQgdXNlIGl0IGFjY29yZGluZ2x5LgogKgogKiBqc0RhdGUgYm9ycm93cyBtYW55IGNvbmNlcHRzIGFuZCBpZGVhcyBmcm9tIHRoZSBEYXRlIEluc3RhbmNlIAogKiBNZXRob2RzIGJ5IEtlbiBTbnlkZXIgYWxvbmcgd2l0aCBzb21lIHBhcnRzIG9mIEtlbidzIGFjdHVhbCBjb2RlLgogKiAKICogS2VuJ3Mgb3JpZ2lhbmwgRGF0ZSBJbnN0YW5jZSBNZXRob2RzIGFuZCBjb3B5cmlnaHQgbm90aWNlOgogKiAKICogS2VuIFNueWRlciAoa2VuIGQgc255ZGVyIGF0IGdtYWlsIGRvdCBjb20pCiAqIDIwMDgtMDktMTAKICogdmVyc2lvbiAyLjAuMiAoaHR0cDovL2tlbmRzbnlkZXIuY29tL3NhbmRib3gvZGF0ZS8pICAgICAKICogQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbiBMaWNlbnNlIDMuMCAoaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnkvMy4wLykKICoKICoganFwbG90VG9JbWFnZSBmdW5jdGlvbiBiYXNlZCBvbiBMYXJyeSBTaWRlbidzIGV4cG9ydC1qcXBsb3QtdG8tcG5nLmpzLgogKiBMYXJyeSBoYXMgZ2VuZXJvdXNseSBnaXZlbiBwZXJtaXNzaW9uIHRvIGFkYXB0IGhpcyBjb2RlIGZvciBpbmNsdXNpb24KICogaW50byBqcVBsb3QuCiAqCiAqIExhcnJ5J3Mgb3JpZ2luYWwgY29kZSBjYW4gYmUgZm91bmQgaGVyZToKICoKICogaHR0cHM6Ly9naXRodWIuY29tL2xzaWRlbi9leHBvcnQtanFwbG90LXRvLXBuZwogKiAKICogCiAqLwooZnVuY3Rpb24oail7ai5qcXBsb3QuQ3Vyc29yPWZ1bmN0aW9uKHEpe3RoaXMuc3R5bGU9ImNyb3NzaGFpciI7dGhpcy5wcmV2aW91c0N1cnNvcj0iYXV0byI7dGhpcy5zaG93PWouanFwbG90LmNvbmZpZy5lbmFibGVQbHVnaW5zO3RoaXMuc2hvd1Rvb2x0aXA9dHJ1ZTt0aGlzLmZvbGxvd01vdXNlPWZhbHNlO3RoaXMudG9vbHRpcExvY2F0aW9uPSJzZSI7dGhpcy50b29sdGlwT2Zmc2V0PTY7dGhpcy5zaG93VG9vbHRpcEdyaWRQb3NpdGlvbj1mYWxzZTt0aGlzLnNob3dUb29sdGlwVW5pdFBvc2l0aW9uPXRydWU7dGhpcy5zaG93VG9vbHRpcERhdGFQb3NpdGlvbj1mYWxzZTt0aGlzLnRvb2x0aXBGb3JtYXRTdHJpbmc9IiUuNFAsICUuNFAiO3RoaXMudXNlQXhlc0Zvcm1hdHRlcnM9dHJ1ZTt0aGlzLnRvb2x0aXBBeGlzR3JvdXBzPVtdO3RoaXMuem9vbT1mYWxzZTt0aGlzLnpvb21Qcm94eT1mYWxzZTt0aGlzLnpvb21UYXJnZXQ9ZmFsc2U7dGhpcy5sb29zZVpvb209dHJ1ZTt0aGlzLmNsaWNrUmVzZXQ9ZmFsc2U7dGhpcy5kYmxDbGlja1Jlc2V0PXRydWU7dGhpcy5zaG93VmVydGljYWxMaW5lPWZhbHNlO3RoaXMuc2hvd0hvcml6b250YWxMaW5lPWZhbHNlO3RoaXMuY29uc3RyYWluWm9vbVRvPSJub25lIjt0aGlzLnNoYXBlUmVuZGVyZXI9bmV3IGouanFwbG90LlNoYXBlUmVuZGVyZXIoKTt0aGlzLl96b29tPXtzdGFydDpbXSxlbmQ6W10sc3RhcnRlZDpmYWxzZSx6b29taW5nOmZhbHNlLGlzWm9vbWVkOmZhbHNlLGF4ZXM6e3N0YXJ0Ont9LGVuZDp7fX0sZ3JpZHBvczp7fSxkYXRhcG9zOnt9fTt0aGlzLl90b29sdGlwRWxlbTt0aGlzLnpvb21DYW52YXM7dGhpcy5jdXJzb3JDYW52YXM7dGhpcy5pbnRlcnNlY3Rpb25UaHJlc2hvbGQ9Mjt0aGlzLnNob3dDdXJzb3JMZWdlbmQ9ZmFsc2U7dGhpcy5jdXJzb3JMZWdlbmRGb3JtYXRTdHJpbmc9ai5qcXBsb3QuQ3Vyc29yLmN1cnNvckxlZ2VuZEZvcm1hdFN0cmluZzt0aGlzLl9vbGRIYW5kbGVycz17b25zZWxlY3RzdGFydDpudWxsLG9uZHJhZzpudWxsLG9ubW91c2Vkb3duOm51bGx9O3RoaXMuY29uc3RyYWluT3V0c2lkZVpvb209dHJ1ZTt0aGlzLnNob3dUb29sdGlwT3V0c2lkZVpvb209ZmFsc2U7dGhpcy5vbkdyaWQ9ZmFsc2U7ai5leHRlbmQodHJ1ZSx0aGlzLHEpfTtqLmpxcGxvdC5DdXJzb3IuY3Vyc29yTGVnZW5kRm9ybWF0U3RyaW5nPSIlcyB4OiVzLCB5OiVzIjtqLmpxcGxvdC5DdXJzb3IuaW5pdD1mdW5jdGlvbih0LHMscil7dmFyIHE9cnx8e307dGhpcy5wbHVnaW5zLmN1cnNvcj1uZXcgai5qcXBsb3QuQ3Vyc29yKHEuY3Vyc29yKTt2YXIgdT10aGlzLnBsdWdpbnMuY3Vyc29yO2lmKHUuc2hvdyl7ai5qcXBsb3QuZXZlbnRMaXN0ZW5lckhvb2tzLnB1c2goWyJqcXBsb3RNb3VzZUVudGVyIixiXSk7ai5qcXBsb3QuZXZlbnRMaXN0ZW5lckhvb2tzLnB1c2goWyJqcXBsb3RNb3VzZUxlYXZlIixmXSk7ai5qcXBsb3QuZXZlbnRMaXN0ZW5lckhvb2tzLnB1c2goWyJqcXBsb3RNb3VzZU1vdmUiLGldKTtpZih1LnNob3dDdXJzb3JMZWdlbmQpe3IubGVnZW5kPXIubGVnZW5kfHx7fTtyLmxlZ2VuZC5yZW5kZXJlcj1qLmpxcGxvdC5DdXJzb3JMZWdlbmRSZW5kZXJlcjtyLmxlZ2VuZC5mb3JtYXRTdHJpbmc9dGhpcy5wbHVnaW5zLmN1cnNvci5jdXJzb3JMZWdlbmRGb3JtYXRTdHJpbmc7ci5sZWdlbmQuc2hvdz10cnVlfWlmKHUuem9vbSl7ai5qcXBsb3QuZXZlbnRMaXN0ZW5lckhvb2tzLnB1c2goWyJqcXBsb3RNb3VzZURvd24iLGFdKTtpZih1LmNsaWNrUmVzZXQpe2ouanFwbG90LmV2ZW50TGlzdGVuZXJIb29rcy5wdXNoKFsianFwbG90Q2xpY2siLGtdKX1pZih1LmRibENsaWNrUmVzZXQpe2ouanFwbG90LmV2ZW50TGlzdGVuZXJIb29rcy5wdXNoKFsianFwbG90RGJsQ2xpY2siLGNdKX19dGhpcy5yZXNldFpvb209ZnVuY3Rpb24oKXt2YXIgeD10aGlzLmF4ZXM7aWYoIXUuem9vbVByb3h5KXtmb3IodmFyIHcgaW4geCl7eFt3XS5yZXNldCgpO3hbd10uX3RpY2tzPVtdO2lmKHUuX3pvb20uYXhlc1t3XSE9PXVuZGVmaW5lZCl7eFt3XS5fYXV0b0Zvcm1hdFN0cmluZz11Ll96b29tLmF4ZXNbd10udGlja0Zvcm1hdFN0cmluZ319dGhpcy5yZWRyYXcoKX1lbHNle3ZhciB2PXRoaXMucGx1Z2lucy5jdXJzb3Iuem9vbUNhbnZhcy5fY3R4O3YuY2xlYXJSZWN0KDAsMCx2LmNhbnZhcy53aWR0aCx2LmNhbnZhcy5oZWlnaHQpO3Y9bnVsbH10aGlzLnBsdWdpbnMuY3Vyc29yLl96b29tLmlzWm9vbWVkPWZhbHNlO3RoaXMudGFyZ2V0LnRyaWdnZXIoImpxcGxvdFJlc2V0Wm9vbSIsW3RoaXMsdGhpcy5wbHVnaW5zLmN1cnNvcl0pfTtpZih1LnNob3dUb29sdGlwRGF0YVBvc2l0aW9uKXt1LnNob3dUb29sdGlwVW5pdFBvc2l0aW9uPWZhbHNlO3Uuc2hvd1Rvb2x0aXBHcmlkUG9zaXRpb249ZmFsc2U7aWYocS5jdXJzb3IudG9vbHRpcEZvcm1hdFN0cmluZz09dW5kZWZpbmVkKXt1LnRvb2x0aXBGb3JtYXRTdHJpbmc9ai5qcXBsb3QuQ3Vyc29yLmN1cnNvckxlZ2VuZEZvcm1hdFN0cmluZ319fX07ai5qcXBsb3QuQ3Vyc29yLnBvc3REcmF3PWZ1bmN0aW9uKCl7dmFyIHg9dGhpcy5wbHVnaW5zLmN1cnNvcjtpZih4Lnpvb21DYW52YXMpe3guem9vbUNhbnZhcy5yZXNldENhbnZhcygpO3guem9vbUNhbnZhcz1udWxsfWlmKHguY3Vyc29yQ2FudmFzKXt4LmN1cnNvckNhbnZhcy5yZXNldENhbnZhcygpO3guY3Vyc29yQ2FudmFzPW51bGx9aWYoeC5fdG9vbHRpcEVsZW0pe3guX3Rvb2x0aXBFbGVtLmVtcHR5Rm9yY2UoKTt4Ll90b29sdGlwRWxlbT1udWxsfWlmKHguem9vbSl7eC56b29tQ2FudmFzPW5ldyBqLmpxcGxvdC5HZW5lcmljQ2FudmFzKCk7dGhpcy5ldmVudENhbnZhcy5fZWxlbS5iZWZvcmUoeC56b29tQ2FudmFzLmNyZWF0ZUVsZW1lbnQodGhpcy5fZ3JpZFBhZGRpbmcsImpxcGxvdC16b29tLWNhbnZhcyIsdGhpcy5fcGxvdERpbWVuc2lvbnMsdGhpcykpO3guem9vbUNhbnZhcy5zZXRDb250ZXh0KCl9dmFyIHY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7eC5fdG9vbHRpcEVsZW09aih2KTt2PW51bGw7eC5fdG9vbHRpcEVsZW0uYWRkQ2xhc3MoImpxcGxvdC1jdXJzb3ItdG9vbHRpcCIpO3guX3Rvb2x0aXBFbGVtLmNzcyh7cG9zaXRpb246ImFic29sdXRlIixkaXNwbGF5OiJub25lIn0pO2lmKHguem9vbUNhbnZhcyl7eC56b29tQ2FudmFzLl9lbGVtLmJlZm9yZSh4Ll90b29sdGlwRWxlbSl9ZWxzZXt0aGlzLmV2ZW50Q2FudmFzLl9lbGVtLmJlZm9yZSh4Ll90b29sdGlwRWxlbSl9aWYoeC5zaG93VmVydGljYWxMaW5lfHx4LnNob3dIb3Jpem9udGFsTGluZSl7eC5jdXJzb3JDYW52YXM9bmV3IGouanFwbG90LkdlbmVyaWNDYW52YXMoKTt0aGlzLmV2ZW50Q2FudmFzLl9lbGVtLmJlZm9yZSh4LmN1cnNvckNhbnZhcy5jcmVhdGVFbGVtZW50KHRoaXMuX2dyaWRQYWRkaW5nLCJqcXBsb3QtY3Vyc29yLWNhbnZhcyIsdGhpcy5fcGxvdERpbWVuc2lvbnMsdGhpcykpO3guY3Vyc29yQ2FudmFzLnNldENvbnRleHQoKX1pZih4LnNob3dUb29sdGlwVW5pdFBvc2l0aW9uKXtpZih4LnRvb2x0aXBBeGlzR3JvdXBzLmxlbmd0aD09PTApe3ZhciB0PXRoaXMuc2VyaWVzO3ZhciB1O3ZhciBxPVtdO2Zvcih2YXIgcj0wO3I8dC5sZW5ndGg7cisrKXt1PXRbcl07dmFyIHc9dS54YXhpcysiLCIrdS55YXhpcztpZihqLmluQXJyYXkodyxxKT09LTEpe3EucHVzaCh3KX19Zm9yKHZhciByPTA7cjxxLmxlbmd0aDtyKyspe3gudG9vbHRpcEF4aXNHcm91cHMucHVzaChxW3JdLnNwbGl0KCIsIikpfX19fTtqLmpxcGxvdC5DdXJzb3Iuem9vbVByb3h5PWZ1bmN0aW9uKHYscil7dmFyIHE9di5wbHVnaW5zLmN1cnNvcjt2YXIgdT1yLnBsdWdpbnMuY3Vyc29yO3Euem9vbVRhcmdldD10cnVlO3Euem9vbT10cnVlO3Euc3R5bGU9ImF1dG8iO3EuZGJsQ2xpY2tSZXNldD1mYWxzZTt1Lnpvb209dHJ1ZTt1Lnpvb21Qcm94eT10cnVlO3IudGFyZ2V0LmJpbmQoImpxcGxvdFpvb20iLHQpO3IudGFyZ2V0LmJpbmQoImpxcGxvdFJlc2V0Wm9vbSIscyk7ZnVuY3Rpb24gdCh4LHcseix5LEEpe3EuZG9ab29tKHcseix2LEEpfWZ1bmN0aW9uIHModyx4LHkpe3YucmVzZXRab29tKCl9fTtqLmpxcGxvdC5DdXJzb3IucHJvdG90eXBlLnJlc2V0Wm9vbT1mdW5jdGlvbih1LHYpe3ZhciB0PXUuYXhlczt2YXIgcz12Ll96b29tLmF4ZXM7aWYoIXUucGx1Z2lucy5jdXJzb3Iuem9vbVByb3h5JiZ2Ll96b29tLmlzWm9vbWVkKXtmb3IodmFyIHIgaW4gdCl7dFtyXS5yZXNldCgpO3Rbcl0uX3RpY2tzPVtdO3Rbcl0uX2F1dG9Gb3JtYXRTdHJpbmc9c1tyXS50aWNrRm9ybWF0U3RyaW5nfXUucmVkcmF3KCk7di5fem9vbS5pc1pvb21lZD1mYWxzZX1lbHNle3ZhciBxPXYuem9vbUNhbnZhcy5fY3R4O3EuY2xlYXJSZWN0KDAsMCxxLmNhbnZhcy53aWR0aCxxLmNhbnZhcy5oZWlnaHQpO3E9bnVsbH11LnRhcmdldC50cmlnZ2VyKCJqcXBsb3RSZXNldFpvb20iLFt1LHZdKX07ai5qcXBsb3QuQ3Vyc29yLnJlc2V0Wm9vbT1mdW5jdGlvbihxKXtxLnJlc2V0Wm9vbSgpfTtqLmpxcGxvdC5DdXJzb3IucHJvdG90eXBlLmRvWm9vbT1mdW5jdGlvbihHLHQsQyx1KXt2YXIgST11O3ZhciBGPUMuYXhlczt2YXIgcj1JLl96b29tLmF4ZXM7dmFyIHc9ci5zdGFydDt2YXIgcz1yLmVuZDt2YXIgQixFLHosRCx2LHgscSxILEo7dmFyIEE9Qy5wbHVnaW5zLmN1cnNvci56b29tQ2FudmFzLl9jdHg7aWYoKEkuY29uc3RyYWluWm9vbVRvPT0ibm9uZSImJk1hdGguYWJzKEcueC1JLl96b29tLnN0YXJ0WzBdKT42JiZNYXRoLmFicyhHLnktSS5fem9vbS5zdGFydFsxXSk+Nil8fChJLmNvbnN0cmFpblpvb21Ubz09IngiJiZNYXRoLmFicyhHLngtSS5fem9vbS5zdGFydFswXSk+Nil8fChJLmNvbnN0cmFpblpvb21Ubz09InkiJiZNYXRoLmFicyhHLnktSS5fem9vbS5zdGFydFsxXSk+Nikpe2lmKCFDLnBsdWdpbnMuY3Vyc29yLnpvb21Qcm94eSl7Zm9yKHZhciB5IGluIHQpe2lmKEkuX3pvb20uYXhlc1t5XT09dW5kZWZpbmVkKXtJLl96b29tLmF4ZXNbeV09e307SS5fem9vbS5heGVzW3ldLm51bWJlclRpY2tzPUZbeV0ubnVtYmVyVGlja3M7SS5fem9vbS5heGVzW3ldLnRpY2tJbnRlcnZhbD1GW3ldLnRpY2tJbnRlcnZhbDtJLl96b29tLmF4ZXNbeV0uZGFUaWNrSW50ZXJ2YWw9Rlt5XS5kYVRpY2tJbnRlcnZhbDtJLl96b29tLmF4ZXNbeV0ubWluPUZbeV0ubWluO0kuX3pvb20uYXhlc1t5XS5tYXg9Rlt5XS5tYXg7SS5fem9vbS5heGVzW3ldLnRpY2tGb3JtYXRTdHJpbmc9KEZbeV0udGlja09wdGlvbnMhPW51bGwpP0ZbeV0udGlja09wdGlvbnMuZm9ybWF0U3RyaW5nOiIifWlmKChJLmNvbnN0cmFpblpvb21Ubz09Im5vbmUiKXx8KEkuY29uc3RyYWluWm9vbVRvPT0ieCImJnkuY2hhckF0KDApPT0ieCIpfHwoSS5jb25zdHJhaW5ab29tVG89PSJ5IiYmeS5jaGFyQXQoMCk9PSJ5Iikpe3o9dFt5XTtpZih6IT1udWxsKXtpZih6PndbeV0pe3Y9d1t5XTt4PXp9ZWxzZXtEPXdbeV0tejt2PXo7eD13W3ldfXE9Rlt5XTtIPW51bGw7aWYocS5hbGlnblRpY2tzKXtpZihxLm5hbWU9PT0ieDJheGlzIiYmQy5heGVzLnhheGlzLnNob3cpe0g9Qy5heGVzLnhheGlzLm51bWJlclRpY2tzfWVsc2V7aWYocS5uYW1lLmNoYXJBdCgwKT09PSJ5IiYmcS5uYW1lIT09InlheGlzIiYmcS5uYW1lIT09InlNaWRBeGlzIiYmQy5heGVzLnlheGlzLnNob3cpe0g9Qy5heGVzLnlheGlzLm51bWJlclRpY2tzfX19aWYodGhpcy5sb29zZVpvb20mJihGW3ldLnJlbmRlcmVyLmNvbnN0cnVjdG9yPT09ai5qcXBsb3QuTGluZWFyQXhpc1JlbmRlcmVyfHxGW3ldLnJlbmRlcmVyLmNvbnN0cnVjdG9yPT09ai5qcXBsb3QuTG9nQXhpc1JlbmRlcmVyKSl7Sj1qLmpxcGxvdC5MaW5lYXJUaWNrR2VuZXJhdG9yKHYseCxxLl9zY2FsZWZhY3QsSCk7aWYoRlt5XS50aWNrSW5zZXQmJkpbMF08Rlt5XS5taW4rRlt5XS50aWNrSW5zZXQqRlt5XS50aWNrSW50ZXJ2YWwpe0pbMF0rPUpbNF07SlsyXS09MX1pZihGW3ldLnRpY2tJbnNldCYmSlsxXT5GW3ldLm1heC1GW3ldLnRpY2tJbnNldCpGW3ldLnRpY2tJbnRlcnZhbCl7SlsxXS09Sls0XTtKWzJdLT0xfWlmKEZbeV0ucmVuZGVyZXIuY29uc3RydWN0b3I9PT1qLmpxcGxvdC5Mb2dBeGlzUmVuZGVyZXImJkpbMF08Rlt5XS5taW4pe0pbMF0rPUpbNF07SlsyXS09MX1GW3ldLm1pbj1KWzBdO0ZbeV0ubWF4PUpbMV07Rlt5XS5fYXV0b0Zvcm1hdFN0cmluZz1KWzNdO0ZbeV0ubnVtYmVyVGlja3M9SlsyXTtGW3ldLnRpY2tJbnRlcnZhbD1KWzRdO0ZbeV0uZGFUaWNrSW50ZXJ2YWw9W0pbNF0vMTAwMCwic2Vjb25kcyJdfWVsc2V7Rlt5XS5taW49djtGW3ldLm1heD14O0ZbeV0udGlja0ludGVydmFsPW51bGw7Rlt5XS5udW1iZXJUaWNrcz1udWxsO0ZbeV0uZGFUaWNrSW50ZXJ2YWw9bnVsbH1GW3ldLl90aWNrcz1bXX19fUEuY2xlYXJSZWN0KDAsMCxBLmNhbnZhcy53aWR0aCxBLmNhbnZhcy5oZWlnaHQpO0MucmVkcmF3KCk7SS5fem9vbS5pc1pvb21lZD10cnVlO0E9bnVsbH1DLnRhcmdldC50cmlnZ2VyKCJqcXBsb3Rab29tIixbRyx0LEMsdV0pfX07ai5qcXBsb3QucHJlSW5pdEhvb2tzLnB1c2goai5qcXBsb3QuQ3Vyc29yLmluaXQpO2ouanFwbG90LnBvc3REcmF3SG9va3MucHVzaChqLmpxcGxvdC5DdXJzb3IucG9zdERyYXcpO2Z1bmN0aW9uIGUoRSxyLEIpe3ZhciBHPUIucGx1Z2lucy5jdXJzb3I7dmFyIHc9IiI7dmFyIEs9ZmFsc2U7aWYoRy5zaG93VG9vbHRpcEdyaWRQb3NpdGlvbil7dz1FLngrIiwgIitFLnk7Sz10cnVlfWlmKEcuc2hvd1Rvb2x0aXBVbml0UG9zaXRpb24pe3ZhciBEO2Zvcih2YXIgQz0wO0M8Ry50b29sdGlwQXhpc0dyb3Vwcy5sZW5ndGg7QysrKXtEPUcudG9vbHRpcEF4aXNHcm91cHNbQ107aWYoSyl7dys9IjxiciAvPiJ9aWYoRy51c2VBeGVzRm9ybWF0dGVycyl7dmFyIEE9Qi5heGVzW0RbMF1dLl90aWNrc1swXS5mb3JtYXR0ZXI7dmFyIHE9Qi5heGVzW0RbMV1dLl90aWNrc1swXS5mb3JtYXR0ZXI7dmFyIEg9Qi5heGVzW0RbMF1dLl90aWNrc1swXS5mb3JtYXRTdHJpbmc7dmFyIHY9Qi5heGVzW0RbMV1dLl90aWNrc1swXS5mb3JtYXRTdHJpbmc7dys9QShILHJbRFswXV0pKyIsICIrcSh2LHJbRFsxXV0pfWVsc2V7dys9ai5qcXBsb3Quc3ByaW50ZihHLnRvb2x0aXBGb3JtYXRTdHJpbmcscltEWzBdXSxyW0RbMV1dKX1LPXRydWV9fWlmKEcuc2hvd1Rvb2x0aXBEYXRhUG9zaXRpb24pe3ZhciB1PUIuc2VyaWVzO3ZhciBKPWQoQixFLngsRS55KTt2YXIgSz1mYWxzZTtmb3IodmFyIEM9MDtDPHUubGVuZ3RoO0MrKyl7aWYodVtDXS5zaG93KXt2YXIgeT11W0NdLmluZGV4O3ZhciB0PXVbQ10ubGFiZWwudG9TdHJpbmcoKTt2YXIgRj1qLmluQXJyYXkoeSxKLmluZGljZXMpO3ZhciB6PXVuZGVmaW5lZDt2YXIgeD11bmRlZmluZWQ7aWYoRiE9LTEpe3ZhciBJPUouZGF0YVtGXS5kYXRhO2lmKEcudXNlQXhlc0Zvcm1hdHRlcnMpe3ZhciBBPXVbQ10uX3hheGlzLl90aWNrc1swXS5mb3JtYXR0ZXI7dmFyIHE9dVtDXS5feWF4aXMuX3RpY2tzWzBdLmZvcm1hdHRlcjt2YXIgSD11W0NdLl94YXhpcy5fdGlja3NbMF0uZm9ybWF0U3RyaW5nO3ZhciB2PXVbQ10uX3lheGlzLl90aWNrc1swXS5mb3JtYXRTdHJpbmc7ej1BKEgsSVswXSk7eD1xKHYsSVsxXSl9ZWxzZXt6PUlbMF07eD1JWzFdfWlmKEspe3crPSI8YnIgLz4ifXcrPWouanFwbG90LnNwcmludGYoRy50b29sdGlwRm9ybWF0U3RyaW5nLHQseix4KTtLPXRydWV9fX19Ry5fdG9vbHRpcEVsZW0uaHRtbCh3KX1mdW5jdGlvbiBnKEMsQSl7dmFyIEU9QS5wbHVnaW5zLmN1cnNvcjt2YXIgej1FLmN1cnNvckNhbnZhcy5fY3R4O3ouY2xlYXJSZWN0KDAsMCx6LmNhbnZhcy53aWR0aCx6LmNhbnZhcy5oZWlnaHQpO2lmKEUuc2hvd1ZlcnRpY2FsTGluZSl7RS5zaGFwZVJlbmRlcmVyLmRyYXcoeixbW0MueCwwXSxbQy54LHouY2FudmFzLmhlaWdodF1dKX1pZihFLnNob3dIb3Jpem9udGFsTGluZSl7RS5zaGFwZVJlbmRlcmVyLmRyYXcoeixbWzAsQy55XSxbei5jYW52YXMud2lkdGgsQy55XV0pfXZhciBHPWQoQSxDLngsQy55KTtpZihFLnNob3dDdXJzb3JMZWdlbmQpe3ZhciByPWooQS50YXJnZXRJZCsiIHRkLmpxcGxvdC1jdXJzb3ItbGVnZW5kLWxhYmVsIik7Zm9yKHZhciBCPTA7QjxyLmxlbmd0aDtCKyspe3ZhciB2PWoocltCXSkuZGF0YSgic2VyaWVzSW5kZXgiKTt2YXIgdD1BLnNlcmllc1t2XTt2YXIgcz10LmxhYmVsLnRvU3RyaW5nKCk7dmFyIEQ9ai5pbkFycmF5KHYsRy5pbmRpY2VzKTt2YXIgeD11bmRlZmluZWQ7dmFyIHc9dW5kZWZpbmVkO2lmKEQhPS0xKXt2YXIgSD1HLmRhdGFbRF0uZGF0YTtpZihFLnVzZUF4ZXNGb3JtYXR0ZXJzKXt2YXIgeT10Ll94YXhpcy5fdGlja3NbMF0uZm9ybWF0dGVyO3ZhciBxPXQuX3lheGlzLl90aWNrc1swXS5mb3JtYXR0ZXI7dmFyIEY9dC5feGF4aXMuX3RpY2tzWzBdLmZvcm1hdFN0cmluZzt2YXIgdT10Ll95YXhpcy5fdGlja3NbMF0uZm9ybWF0U3RyaW5nO3g9eShGLEhbMF0pO3c9cSh1LEhbMV0pfWVsc2V7eD1IWzBdO3c9SFsxXX19aWYoQS5sZWdlbmQuZXNjYXBlSHRtbCl7aihyW0JdKS50ZXh0KGouanFwbG90LnNwcmludGYoRS5jdXJzb3JMZWdlbmRGb3JtYXRTdHJpbmcscyx4LHcpKX1lbHNle2oocltCXSkuaHRtbChqLmpxcGxvdC5zcHJpbnRmKEUuY3Vyc29yTGVnZW5kRm9ybWF0U3RyaW5nLHMseCx3KSl9fX16PW51bGx9ZnVuY3Rpb24gZChBLEYsRSl7dmFyIEI9e2luZGljZXM6W10sZGF0YTpbXX07dmFyIEcsdyx1LEMsdixxLHQ7dmFyIHo7dmFyIEQ9QS5wbHVnaW5zLmN1cnNvcjtmb3IodmFyIHc9MDt3PEEuc2VyaWVzLmxlbmd0aDt3Kyspe0c9QS5zZXJpZXNbd107cT1HLnJlbmRlcmVyO2lmKEcuc2hvdyl7ej1ELmludGVyc2VjdGlvblRocmVzaG9sZDtpZihHLnNob3dNYXJrZXIpe3orPUcubWFya2VyUmVuZGVyZXIuc2l6ZS8yfWZvcih2YXIgdj0wO3Y8Ry5ncmlkRGF0YS5sZW5ndGg7disrKXt0PUcuZ3JpZERhdGFbdl07aWYoRC5zaG93VmVydGljYWxMaW5lKXtpZihNYXRoLmFicyhGLXRbMF0pPD16KXtCLmluZGljZXMucHVzaCh3KTtCLmRhdGEucHVzaCh7c2VyaWVzSW5kZXg6dyxwb2ludEluZGV4OnYsZ3JpZERhdGE6dCxkYXRhOkcuZGF0YVt2XX0pfX19fX1yZXR1cm4gQn1mdW5jdGlvbiBuKHIsdCl7dmFyIHY9dC5wbHVnaW5zLmN1cnNvcjt2YXIgcz12Ll90b29sdGlwRWxlbTtzd2l0Y2godi50b29sdGlwTG9jYXRpb24pe2Nhc2UibnciOnZhciBxPXIueCt0Ll9ncmlkUGFkZGluZy5sZWZ0LXMub3V0ZXJXaWR0aCh0cnVlKS12LnRvb2x0aXBPZmZzZXQ7dmFyIHU9ci55K3QuX2dyaWRQYWRkaW5nLnRvcC12LnRvb2x0aXBPZmZzZXQtcy5vdXRlckhlaWdodCh0cnVlKTticmVhaztjYXNlIm4iOnZhciBxPXIueCt0Ll9ncmlkUGFkZGluZy5sZWZ0LXMub3V0ZXJXaWR0aCh0cnVlKS8yO3ZhciB1PXIueSt0Ll9ncmlkUGFkZGluZy50b3Atdi50b29sdGlwT2Zmc2V0LXMub3V0ZXJIZWlnaHQodHJ1ZSk7YnJlYWs7Y2FzZSJuZSI6dmFyIHE9ci54K3QuX2dyaWRQYWRkaW5nLmxlZnQrdi50b29sdGlwT2Zmc2V0O3ZhciB1PXIueSt0Ll9ncmlkUGFkZGluZy50b3Atdi50b29sdGlwT2Zmc2V0LXMub3V0ZXJIZWlnaHQodHJ1ZSk7YnJlYWs7Y2FzZSJlIjp2YXIgcT1yLngrdC5fZ3JpZFBhZGRpbmcubGVmdCt2LnRvb2x0aXBPZmZzZXQ7dmFyIHU9ci55K3QuX2dyaWRQYWRkaW5nLnRvcC1zLm91dGVySGVpZ2h0KHRydWUpLzI7YnJlYWs7Y2FzZSJzZSI6dmFyIHE9ci54K3QuX2dyaWRQYWRkaW5nLmxlZnQrdi50b29sdGlwT2Zmc2V0O3ZhciB1PXIueSt0Ll9ncmlkUGFkZGluZy50b3Ardi50b29sdGlwT2Zmc2V0O2JyZWFrO2Nhc2UicyI6dmFyIHE9ci54K3QuX2dyaWRQYWRkaW5nLmxlZnQtcy5vdXRlcldpZHRoKHRydWUpLzI7dmFyIHU9ci55K3QuX2dyaWRQYWRkaW5nLnRvcCt2LnRvb2x0aXBPZmZzZXQ7YnJlYWs7Y2FzZSJzdyI6dmFyIHE9ci54K3QuX2dyaWRQYWRkaW5nLmxlZnQtcy5vdXRlcldpZHRoKHRydWUpLXYudG9vbHRpcE9mZnNldDt2YXIgdT1yLnkrdC5fZ3JpZFBhZGRpbmcudG9wK3YudG9vbHRpcE9mZnNldDticmVhaztjYXNlInciOnZhciBxPXIueCt0Ll9ncmlkUGFkZGluZy5sZWZ0LXMub3V0ZXJXaWR0aCh0cnVlKS12LnRvb2x0aXBPZmZzZXQ7dmFyIHU9ci55K3QuX2dyaWRQYWRkaW5nLnRvcC1zLm91dGVySGVpZ2h0KHRydWUpLzI7YnJlYWs7ZGVmYXVsdDp2YXIgcT1yLngrdC5fZ3JpZFBhZGRpbmcubGVmdCt2LnRvb2x0aXBPZmZzZXQ7dmFyIHU9ci55K3QuX2dyaWRQYWRkaW5nLnRvcCt2LnRvb2x0aXBPZmZzZXQ7YnJlYWt9cy5jc3MoImxlZnQiLHEpO3MuY3NzKCJ0b3AiLHUpO3M9bnVsbH1mdW5jdGlvbiBtKHUpe3ZhciBzPXUuX2dyaWRQYWRkaW5nO3ZhciB2PXUucGx1Z2lucy5jdXJzb3I7dmFyIHQ9di5fdG9vbHRpcEVsZW07c3dpdGNoKHYudG9vbHRpcExvY2F0aW9uKXtjYXNlIm53Ijp2YXIgcj1zLmxlZnQrdi50b29sdGlwT2Zmc2V0O3ZhciBxPXMudG9wK3YudG9vbHRpcE9mZnNldDt0LmNzcygibGVmdCIscik7dC5jc3MoInRvcCIscSk7YnJlYWs7Y2FzZSJuIjp2YXIgcj0ocy5sZWZ0Kyh1Ll9wbG90RGltZW5zaW9ucy53aWR0aC1zLnJpZ2h0KSkvMi10Lm91dGVyV2lkdGgodHJ1ZSkvMjt2YXIgcT1zLnRvcCt2LnRvb2x0aXBPZmZzZXQ7dC5jc3MoImxlZnQiLHIpO3QuY3NzKCJ0b3AiLHEpO2JyZWFrO2Nhc2UibmUiOnZhciByPXMucmlnaHQrdi50b29sdGlwT2Zmc2V0O3ZhciBxPXMudG9wK3YudG9vbHRpcE9mZnNldDt0LmNzcyh7cmlnaHQ6cix0b3A6cX0pO2JyZWFrO2Nhc2UiZSI6dmFyIHI9cy5yaWdodCt2LnRvb2x0aXBPZmZzZXQ7dmFyIHE9KHMudG9wKyh1Ll9wbG90RGltZW5zaW9ucy5oZWlnaHQtcy5ib3R0b20pKS8yLXQub3V0ZXJIZWlnaHQodHJ1ZSkvMjt0LmNzcyh7cmlnaHQ6cix0b3A6cX0pO2JyZWFrO2Nhc2Uic2UiOnZhciByPXMucmlnaHQrdi50b29sdGlwT2Zmc2V0O3ZhciBxPXMuYm90dG9tK3YudG9vbHRpcE9mZnNldDt0LmNzcyh7cmlnaHQ6cixib3R0b206cX0pO2JyZWFrO2Nhc2UicyI6dmFyIHI9KHMubGVmdCsodS5fcGxvdERpbWVuc2lvbnMud2lkdGgtcy5yaWdodCkpLzItdC5vdXRlcldpZHRoKHRydWUpLzI7dmFyIHE9cy5ib3R0b20rdi50b29sdGlwT2Zmc2V0O3QuY3NzKHtsZWZ0OnIsYm90dG9tOnF9KTticmVhaztjYXNlInN3Ijp2YXIgcj1zLmxlZnQrdi50b29sdGlwT2Zmc2V0O3ZhciBxPXMuYm90dG9tK3YudG9vbHRpcE9mZnNldDt0LmNzcyh7bGVmdDpyLGJvdHRvbTpxfSk7YnJlYWs7Y2FzZSJ3Ijp2YXIgcj1zLmxlZnQrdi50b29sdGlwT2Zmc2V0O3ZhciBxPShzLnRvcCsodS5fcGxvdERpbWVuc2lvbnMuaGVpZ2h0LXMuYm90dG9tKSkvMi10Lm91dGVySGVpZ2h0KHRydWUpLzI7dC5jc3Moe2xlZnQ6cix0b3A6cX0pO2JyZWFrO2RlZmF1bHQ6dmFyIHI9cy5yaWdodC12LnRvb2x0aXBPZmZzZXQ7dmFyIHE9cy5ib3R0b20rdi50b29sdGlwT2Zmc2V0O3QuY3NzKHtyaWdodDpyLGJvdHRvbTpxfSk7YnJlYWt9dD1udWxsfWZ1bmN0aW9uIGsocixxLHYsdSx0KXtyLnByZXZlbnREZWZhdWx0KCk7ci5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTt2YXIgdz10LnBsdWdpbnMuY3Vyc29yO2lmKHcuY2xpY2tSZXNldCl7dy5yZXNldFpvb20odCx3KX12YXIgcz13aW5kb3cuZ2V0U2VsZWN0aW9uO2lmKGRvY3VtZW50LnNlbGVjdGlvbiYmZG9jdW1lbnQuc2VsZWN0aW9uLmVtcHR5KXtkb2N1bWVudC5zZWxlY3Rpb24uZW1wdHkoKX1lbHNle2lmKHMmJiFzKCkuaXNDb2xsYXBzZWQpe3MoKS5jb2xsYXBzZSgpfX1yZXR1cm4gZmFsc2V9ZnVuY3Rpb24gYyhyLHEsdix1LHQpe3IucHJldmVudERlZmF1bHQoKTtyLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO3ZhciB3PXQucGx1Z2lucy5jdXJzb3I7aWYody5kYmxDbGlja1Jlc2V0KXt3LnJlc2V0Wm9vbSh0LHcpfXZhciBzPXdpbmRvdy5nZXRTZWxlY3Rpb247aWYoZG9jdW1lbnQuc2VsZWN0aW9uJiZkb2N1bWVudC5zZWxlY3Rpb24uZW1wdHkpe2RvY3VtZW50LnNlbGVjdGlvbi5lbXB0eSgpfWVsc2V7aWYocyYmIXMoKS5pc0NvbGxhcHNlZCl7cygpLmNvbGxhcHNlKCl9fXJldHVybiBmYWxzZX1mdW5jdGlvbiBmKHcsdCxxLHosdSl7dmFyIHY9dS5wbHVnaW5zLmN1cnNvcjt2Lm9uR3JpZD1mYWxzZTtpZih2LnNob3cpe2oody50YXJnZXQpLmNzcygiY3Vyc29yIix2LnByZXZpb3VzQ3Vyc29yKTtpZih2LnNob3dUb29sdGlwJiYhKHYuX3pvb20uem9vbWluZyYmdi5zaG93VG9vbHRpcE91dHNpZGVab29tJiYhdi5jb25zdHJhaW5PdXRzaWRlWm9vbSkpe3YuX3Rvb2x0aXBFbGVtLmhpZGUoKX1pZih2Lnpvb20pe3YuX3pvb20uZ3JpZHBvcz10O3YuX3pvb20uZGF0YXBvcz1xfWlmKHYuc2hvd1ZlcnRpY2FsTGluZXx8di5zaG93SG9yaXpvbnRhbExpbmUpe3ZhciBCPXYuY3Vyc29yQ2FudmFzLl9jdHg7Qi5jbGVhclJlY3QoMCwwLEIuY2FudmFzLndpZHRoLEIuY2FudmFzLmhlaWdodCk7Qj1udWxsfWlmKHYuc2hvd0N1cnNvckxlZ2VuZCl7dmFyIEE9aih1LnRhcmdldElkKyIgdGQuanFwbG90LWN1cnNvci1sZWdlbmQtbGFiZWwiKTtmb3IodmFyIHM9MDtzPEEubGVuZ3RoO3MrKyl7dmFyIHk9aihBW3NdKS5kYXRhKCJzZXJpZXNJbmRleCIpO3ZhciByPXUuc2VyaWVzW3ldO3ZhciB4PXIubGFiZWwudG9TdHJpbmcoKTtpZih1LmxlZ2VuZC5lc2NhcGVIdG1sKXtqKEFbc10pLnRleHQoai5qcXBsb3Quc3ByaW50Zih2LmN1cnNvckxlZ2VuZEZvcm1hdFN0cmluZyx4LHVuZGVmaW5lZCx1bmRlZmluZWQpKX1lbHNle2ooQVtzXSkuaHRtbChqLmpxcGxvdC5zcHJpbnRmKHYuY3Vyc29yTGVnZW5kRm9ybWF0U3RyaW5nLHgsdW5kZWZpbmVkLHVuZGVmaW5lZCkpfX19fX1mdW5jdGlvbiBiKHIscSx1LHQscyl7dmFyIHY9cy5wbHVnaW5zLmN1cnNvcjt2Lm9uR3JpZD10cnVlO2lmKHYuc2hvdyl7di5wcmV2aW91c0N1cnNvcj1yLnRhcmdldC5zdHlsZS5jdXJzb3I7ci50YXJnZXQuc3R5bGUuY3Vyc29yPXYuc3R5bGU7aWYodi5zaG93VG9vbHRpcCl7ZShxLHUscyk7aWYodi5mb2xsb3dNb3VzZSl7bihxLHMpfWVsc2V7bShzKX12Ll90b29sdGlwRWxlbS5zaG93KCl9aWYodi5zaG93VmVydGljYWxMaW5lfHx2LnNob3dIb3Jpem9udGFsTGluZSl7ZyhxLHMpfX19ZnVuY3Rpb24gaShyLHEsdSx0LHMpe3ZhciB2PXMucGx1Z2lucy5jdXJzb3I7aWYodi5zaG93KXtpZih2LnNob3dUb29sdGlwKXtlKHEsdSxzKTtpZih2LmZvbGxvd01vdXNlKXtuKHEscyl9fWlmKHYuc2hvd1ZlcnRpY2FsTGluZXx8di5zaG93SG9yaXpvbnRhbExpbmUpe2cocSxzKX19fWZ1bmN0aW9uIG8oeSl7dmFyIHg9eS5kYXRhLnBsb3Q7dmFyIHQ9eC5ldmVudENhbnZhcy5fZWxlbS5vZmZzZXQoKTt2YXIgdz17eDp5LnBhZ2VYLXQubGVmdCx5OnkucGFnZVktdC50b3B9O3ZhciB1PXt4YXhpczpudWxsLHlheGlzOm51bGwseDJheGlzOm51bGwseTJheGlzOm51bGwseTNheGlzOm51bGwseTRheGlzOm51bGwseTVheGlzOm51bGwseTZheGlzOm51bGwseTdheGlzOm51bGwseThheGlzOm51bGwseTlheGlzOm51bGwseU1pZEF4aXM6bnVsbH07dmFyIHY9WyJ4YXhpcyIsInlheGlzIiwieDJheGlzIiwieTJheGlzIiwieTNheGlzIiwieTRheGlzIiwieTVheGlzIiwieTZheGlzIiwieTdheGlzIiwieThheGlzIiwieTlheGlzIiwieU1pZEF4aXMiXTt2YXIgcT14LmF4ZXM7dmFyIHIscztmb3Iocj0xMTtyPjA7ci0tKXtzPXZbci0xXTtpZihxW3NdLnNob3cpe3Vbc109cVtzXS5zZXJpZXNfcDJ1KHdbcy5jaGFyQXQoMCldKX19cmV0dXJue29mZnNldHM6dCxncmlkUG9zOncsZGF0YVBvczp1fX1mdW5jdGlvbiBoKHope3ZhciB4PXouZGF0YS5wbG90O3ZhciB5PXgucGx1Z2lucy5jdXJzb3I7aWYoeS5zaG93JiZ5Lnpvb20mJnkuX3pvb20uc3RhcnRlZCYmIXkuem9vbVRhcmdldCl7dmFyIEI9eS56b29tQ2FudmFzLl9jdHg7dmFyIHY9byh6KTt2YXIgdz12LmdyaWRQb3M7dmFyIHQ9di5kYXRhUG9zO3kuX3pvb20uZ3JpZHBvcz13O3kuX3pvb20uZGF0YXBvcz10O3kuX3pvb20uem9vbWluZz10cnVlO3ZhciB1PXcueDt2YXIgcz13Lnk7dmFyIEE9Qi5jYW52YXMuaGVpZ2h0O3ZhciBxPUIuY2FudmFzLndpZHRoO2lmKHkuc2hvd1Rvb2x0aXAmJiF5Lm9uR3JpZCYmeS5zaG93VG9vbHRpcE91dHNpZGVab29tKXtlKHcsdCx4KTtpZih5LmZvbGxvd01vdXNlKXtuKHcseCl9fWlmKHkuY29uc3RyYWluWm9vbVRvPT0ieCIpe3kuX3pvb20uZW5kPVt1LEFdfWVsc2V7aWYoeS5jb25zdHJhaW5ab29tVG89PSJ5Iil7eS5fem9vbS5lbmQ9W3Esc119ZWxzZXt5Ll96b29tLmVuZD1bdSxzXX19dmFyIHI9d2luZG93LmdldFNlbGVjdGlvbjtpZihkb2N1bWVudC5zZWxlY3Rpb24mJmRvY3VtZW50LnNlbGVjdGlvbi5lbXB0eSl7ZG9jdW1lbnQuc2VsZWN0aW9uLmVtcHR5KCl9ZWxzZXtpZihyJiYhcigpLmlzQ29sbGFwc2VkKXtyKCkuY29sbGFwc2UoKX19bC5jYWxsKHkpO0I9bnVsbH19ZnVuY3Rpb24gYSh3LHMscix4LHQpe3ZhciB2PXQucGx1Z2lucy5jdXJzb3I7aihkb2N1bWVudCkub25lKCJtb3VzZXVwLmpxcGxvdF9jdXJzb3IiLHtwbG90OnR9LHApO3ZhciB1PXQuYXhlcztpZihkb2N1bWVudC5vbnNlbGVjdHN0YXJ0IT11bmRlZmluZWQpe3YuX29sZEhhbmRsZXJzLm9uc2VsZWN0c3RhcnQ9ZG9jdW1lbnQub25zZWxlY3RzdGFydDtkb2N1bWVudC5vbnNlbGVjdHN0YXJ0PWZ1bmN0aW9uKCl7cmV0dXJuIGZhbHNlfX1pZihkb2N1bWVudC5vbmRyYWchPXVuZGVmaW5lZCl7di5fb2xkSGFuZGxlcnMub25kcmFnPWRvY3VtZW50Lm9uZHJhZztkb2N1bWVudC5vbmRyYWc9ZnVuY3Rpb24oKXtyZXR1cm4gZmFsc2V9fWlmKGRvY3VtZW50Lm9ubW91c2Vkb3duIT11bmRlZmluZWQpe3YuX29sZEhhbmRsZXJzLm9ubW91c2Vkb3duPWRvY3VtZW50Lm9ubW91c2Vkb3duO2RvY3VtZW50Lm9ubW91c2Vkb3duPWZ1bmN0aW9uKCl7cmV0dXJuIGZhbHNlfX1pZih2Lnpvb20pe2lmKCF2Lnpvb21Qcm94eSl7dmFyIHk9di56b29tQ2FudmFzLl9jdHg7eS5jbGVhclJlY3QoMCwwLHkuY2FudmFzLndpZHRoLHkuY2FudmFzLmhlaWdodCk7eT1udWxsfWlmKHYuY29uc3RyYWluWm9vbVRvPT0ieCIpe3YuX3pvb20uc3RhcnQ9W3MueCwwXX1lbHNle2lmKHYuY29uc3RyYWluWm9vbVRvPT0ieSIpe3YuX3pvb20uc3RhcnQ9WzAscy55XX1lbHNle3YuX3pvb20uc3RhcnQ9W3MueCxzLnldfX12Ll96b29tLnN0YXJ0ZWQ9dHJ1ZTtmb3IodmFyIHEgaW4gcil7di5fem9vbS5heGVzLnN0YXJ0W3FdPXJbcV19aihkb2N1bWVudCkuYmluZCgibW91c2Vtb3ZlLmpxcGxvdEN1cnNvciIse3Bsb3Q6dH0saCl9fWZ1bmN0aW9uIHAoeSl7dmFyIHY9eS5kYXRhLnBsb3Q7dmFyIHg9di5wbHVnaW5zLmN1cnNvcjtpZih4Lnpvb20mJnguX3pvb20uem9vbWluZyYmIXguem9vbVRhcmdldCl7dmFyIHU9eC5fem9vbS5ncmlkcG9zLng7dmFyIHI9eC5fem9vbS5ncmlkcG9zLnk7dmFyIHQ9eC5fem9vbS5kYXRhcG9zO3ZhciB6PXguem9vbUNhbnZhcy5fY3R4LmNhbnZhcy5oZWlnaHQ7dmFyIHE9eC56b29tQ2FudmFzLl9jdHguY2FudmFzLndpZHRoO3ZhciB3PXYuYXhlcztpZih4LmNvbnN0cmFpbk91dHNpZGVab29tJiYheC5vbkdyaWQpe2lmKHU8MCl7dT0wfWVsc2V7aWYodT5xKXt1PXF9fWlmKHI8MCl7cj0wfWVsc2V7aWYocj56KXtyPXp9fWZvcih2YXIgcyBpbiB0KXtpZih0W3NdKXtpZihzLmNoYXJBdCgwKT09IngiKXt0W3NdPXdbc10uc2VyaWVzX3AydSh1KX1lbHNle3Rbc109d1tzXS5zZXJpZXNfcDJ1KHIpfX19fWlmKHguY29uc3RyYWluWm9vbVRvPT0ieCIpe3I9en1lbHNle2lmKHguY29uc3RyYWluWm9vbVRvPT0ieSIpe3U9cX19eC5fem9vbS5lbmQ9W3Uscl07eC5fem9vbS5ncmlkcG9zPXt4OnUseTpyfTt4LmRvWm9vbSh4Ll96b29tLmdyaWRwb3MsdCx2LHgpfXguX3pvb20uc3RhcnRlZD1mYWxzZTt4Ll96b29tLnpvb21pbmc9ZmFsc2U7aihkb2N1bWVudCkudW5iaW5kKCJtb3VzZW1vdmUuanFwbG90Q3Vyc29yIixoKTtpZihkb2N1bWVudC5vbnNlbGVjdHN0YXJ0IT11bmRlZmluZWQmJnguX29sZEhhbmRsZXJzLm9uc2VsZWN0c3RhcnQhPW51bGwpe2RvY3VtZW50Lm9uc2VsZWN0c3RhcnQ9eC5fb2xkSGFuZGxlcnMub25zZWxlY3RzdGFydDt4Ll9vbGRIYW5kbGVycy5vbnNlbGVjdHN0YXJ0PW51bGx9aWYoZG9jdW1lbnQub25kcmFnIT11bmRlZmluZWQmJnguX29sZEhhbmRsZXJzLm9uZHJhZyE9bnVsbCl7ZG9jdW1lbnQub25kcmFnPXguX29sZEhhbmRsZXJzLm9uZHJhZzt4Ll9vbGRIYW5kbGVycy5vbmRyYWc9bnVsbH1pZihkb2N1bWVudC5vbm1vdXNlZG93biE9dW5kZWZpbmVkJiZ4Ll9vbGRIYW5kbGVycy5vbm1vdXNlZG93biE9bnVsbCl7ZG9jdW1lbnQub25tb3VzZWRvd249eC5fb2xkSGFuZGxlcnMub25tb3VzZWRvd247eC5fb2xkSGFuZGxlcnMub25tb3VzZWRvd249bnVsbH19ZnVuY3Rpb24gbCgpe3ZhciB5PXRoaXMuX3pvb20uc3RhcnQ7dmFyIHU9dGhpcy5fem9vbS5lbmQ7dmFyIHM9dGhpcy56b29tQ2FudmFzLl9jdHg7dmFyIHIsdix4LHE7aWYodVswXT55WzBdKXtyPXlbMF07cT11WzBdLXlbMF19ZWxzZXtyPXVbMF07cT15WzBdLXVbMF19aWYodVsxXT55WzFdKXt2PXlbMV07eD11WzFdLXlbMV19ZWxzZXt2PXVbMV07eD15WzFdLXVbMV19cy5maWxsU3R5bGU9InJnYmEoMCwwLDAsMC4yKSI7cy5zdHJva2VTdHlsZT0iIzk5OTk5OSI7cy5saW5lV2lkdGg9MTtzLmNsZWFyUmVjdCgwLDAscy5jYW52YXMud2lkdGgscy5jYW52YXMuaGVpZ2h0KTtzLmZpbGxSZWN0KDAsMCxzLmNhbnZhcy53aWR0aCxzLmNhbnZhcy5oZWlnaHQpO3MuY2xlYXJSZWN0KHIsdixxLHgpO3Muc3Ryb2tlUmVjdChyLHYscSx4KTtzPW51bGx9ai5qcXBsb3QuQ3Vyc29yTGVnZW5kUmVuZGVyZXI9ZnVuY3Rpb24ocSl7ai5qcXBsb3QuVGFibGVMZWdlbmRSZW5kZXJlci5jYWxsKHRoaXMscSk7dGhpcy5mb3JtYXRTdHJpbmc9IiVzIn07ai5qcXBsb3QuQ3Vyc29yTGVnZW5kUmVuZGVyZXIucHJvdG90eXBlPW5ldyBqLmpxcGxvdC5UYWJsZUxlZ2VuZFJlbmRlcmVyKCk7ai5qcXBsb3QuQ3Vyc29yTGVnZW5kUmVuZGVyZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yPWouanFwbG90LkN1cnNvckxlZ2VuZFJlbmRlcmVyO2ouanFwbG90LkN1cnNvckxlZ2VuZFJlbmRlcmVyLnByb3RvdHlwZS5kcmF3PWZ1bmN0aW9uKCl7aWYodGhpcy5fZWxlbSl7dGhpcy5fZWxlbS5lbXB0eUZvcmNlKCk7dGhpcy5fZWxlbT1udWxsfWlmKHRoaXMuc2hvdyl7dmFyIHc9dGhpcy5fc2VyaWVzLEE7dmFyIHI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5fZWxlbT1qKHIpO3I9bnVsbDt0aGlzLl9lbGVtLmFkZENsYXNzKCJqcXBsb3QtbGVnZW5kIGpxcGxvdC1jdXJzb3ItbGVnZW5kIik7dGhpcy5fZWxlbS5jc3MoInBvc2l0aW9uIiwiYWJzb2x1dGUiKTt2YXIgcT1mYWxzZTtmb3IodmFyIHg9MDt4PHcubGVuZ3RoO3grKyl7QT13W3hdO2lmKEEuc2hvdyYmQS5zaG93TGFiZWwpe3ZhciB2PWouanFwbG90LnNwcmludGYodGhpcy5mb3JtYXRTdHJpbmcsQS5sYWJlbC50b1N0cmluZygpKTtpZih2KXt2YXIgdD1BLmNvbG9yO2lmKEEuX3N0YWNrJiYhQS5maWxsKXt0PSIifXouY2FsbCh0aGlzLHYsdCxxLHgpO3E9dHJ1ZX1mb3IodmFyIHU9MDt1PGouanFwbG90LmFkZExlZ2VuZFJvd0hvb2tzLmxlbmd0aDt1Kyspe3ZhciB5PWouanFwbG90LmFkZExlZ2VuZFJvd0hvb2tzW3VdLmNhbGwodGhpcyxBKTtpZih5KXt6LmNhbGwodGhpcyx5LmxhYmVsLHkuY29sb3IscSk7cT10cnVlfX19fXc9QT1udWxsO2RlbGV0ZSB3O2RlbGV0ZSBBfWZ1bmN0aW9uIHooRCxDLEYscyl7dmFyIEI9KEYpP3RoaXMucm93U3BhY2luZzoiMCI7dmFyIEU9aignPHRyIGNsYXNzPSJqcXBsb3QtbGVnZW5kIGpxcGxvdC1jdXJzb3ItbGVnZW5kIj48L3RyPicpLmFwcGVuZFRvKHRoaXMuX2VsZW0pO0UuZGF0YSgic2VyaWVzSW5kZXgiLHMpO2ooJzx0ZCBjbGFzcz0ianFwbG90LWxlZ2VuZCBqcXBsb3QtY3Vyc29yLWxlZ2VuZC1zd2F0Y2giIHN0eWxlPSJwYWRkaW5nLXRvcDonK0IrJzsiPjxkaXYgc3R5bGU9ImJvcmRlcjoxcHggc29saWQgI2NjY2NjYztwYWRkaW5nOjAuMmVtOyI+PGRpdiBjbGFzcz0ianFwbG90LWN1cnNvci1sZWdlbmQtc3dhdGNoIiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjonK0MrJzsiPjwvZGl2PjwvZGl2PjwvdGQ+JykuYXBwZW5kVG8oRSk7dmFyIEc9aignPHRkIGNsYXNzPSJqcXBsb3QtbGVnZW5kIGpxcGxvdC1jdXJzb3ItbGVnZW5kLWxhYmVsIiBzdHlsZT0idmVydGljYWwtYWxpZ246bWlkZGxlO3BhZGRpbmctdG9wOicrQisnOyI+PC90ZD4nKTtHLmFwcGVuZFRvKEUpO0cuZGF0YSgic2VyaWVzSW5kZXgiLHMpO2lmKHRoaXMuZXNjYXBlSHRtbCl7Ry50ZXh0KEQpfWVsc2V7Ry5odG1sKEQpfUU9bnVsbDtHPW51bGx9cmV0dXJuIHRoaXMuX2VsZW19fSkoalF1ZXJ5KTs=]]></data>
	</file>
	<file>
	  <filename>/src/plugins/jqplot.dateAxisRenderer.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqCiAqIGpxUGxvdAogKiBQdXJlIEphdmFTY3JpcHQgcGxvdHRpbmcgcGx1Z2luIHVzaW5nIGpRdWVyeQogKgogKiBWZXJzaW9uOiAxLjAuMGIyX3IxMDEyCiAqCiAqIENvcHlyaWdodCAoYykgMjAwOS0yMDExIENocmlzIExlb25lbGxvCiAqIGpxUGxvdCBpcyBjdXJyZW50bHkgYXZhaWxhYmxlIGZvciB1c2UgaW4gYWxsIHBlcnNvbmFsIG9yIGNvbW1lcmNpYWwgcHJvamVjdHMgCiAqIHVuZGVyIGJvdGggdGhlIE1JVCAoaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHApIGFuZCBHUEwgCiAqIHZlcnNpb24gMi4wIChodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC5odG1sKSBsaWNlbnNlcy4gVGhpcyBtZWFucyB0aGF0IHlvdSBjYW4gCiAqIGNob29zZSB0aGUgbGljZW5zZSB0aGF0IGJlc3Qgc3VpdHMgeW91ciBwcm9qZWN0IGFuZCB1c2UgaXQgYWNjb3JkaW5nbHkuIAogKgogKiBBbHRob3VnaCBub3QgcmVxdWlyZWQsIHRoZSBhdXRob3Igd291bGQgYXBwcmVjaWF0ZSBhbiBlbWFpbCBsZXR0aW5nIGhpbSAKICoga25vdyBvZiBhbnkgc3Vic3RhbnRpYWwgdXNlIG9mIGpxUGxvdC4gIFlvdSBjYW4gcmVhY2ggdGhlIGF1dGhvciBhdDogCiAqIGNocmlzIGF0IGpxcGxvdCBkb3QgY29tIG9yIHNlZSBodHRwOi8vd3d3LmpxcGxvdC5jb20vaW5mby5waHAgLgogKgogKiBJZiB5b3UgYXJlIGZlZWxpbmcga2luZCBhbmQgZ2VuZXJvdXMsIGNvbnNpZGVyIHN1cHBvcnRpbmcgdGhlIHByb2plY3QgYnkKICogbWFraW5nIGEgZG9uYXRpb24gYXQ6IGh0dHA6Ly93d3cuanFwbG90LmNvbS9kb25hdGUucGhwIC4KICoKICogc3ByaW50ZiBmdW5jdGlvbnMgY29udGFpbmVkIGluIGpxcGxvdC5zcHJpbnRmLmpzIGJ5IEFzaCBTZWFybGU6CiAqCiAqICAgICB2ZXJzaW9uIDIwMDcuMDQuMjcKICogICAgIGF1dGhvciBBc2ggU2VhcmxlCiAqICAgICBodHRwOi8vaGV4bWVuLmNvbS9ibG9nLzIwMDcvMDMvcHJpbnRmLXNwcmludGYvCiAqICAgICBodHRwOi8vaGV4bWVuLmNvbS9qcy9zcHJpbnRmLmpzCiAqICAgICBUaGUgYXV0aG9yIChBc2ggU2VhcmxlKSBoYXMgcGxhY2VkIHRoaXMgY29kZSBpbiB0aGUgcHVibGljIGRvbWFpbjoKICogICAgICJUaGlzIGNvZGUgaXMgdW5yZXN0cmljdGVkOiB5b3UgYXJlIGZyZWUgdG8gdXNlIGl0IGhvd2V2ZXIgeW91IGxpa2UuIgogKiAKICovCihmdW5jdGlvbigkKSB7ICAKICAgIC8qKgogICAgICogQ2xhc3M6ICQuanFwbG90LkRhdGVBeGlzUmVuZGVyZXIKICAgICAqIEEgcGx1Z2luIGZvciBhIGpxUGxvdCB0byByZW5kZXIgYW4gYXhpcyBhcyBhIHNlcmllcyBvZiBkYXRlIHZhbHVlcy4KICAgICAqIFRoaXMgcmVuZGVyZXIgaGFzIG5vIG9wdGlvbnMgYmV5b25kIHRob3NlIHN1cHBsaWVkIGJ5IHRoZSA8QXhpcz4gY2xhc3MuCiAgICAgKiBJdCBzdXBwbGllcyBpdCdzIG93biB0aWNrIGZvcm1hdHRlciwgc28gdGhlIHRpY2tPcHRpb25zLmZvcm1hdHRlciBvcHRpb24KICAgICAqIHNob3VsZCBub3QgYmUgb3ZlcnJpZGRlbi4KICAgICAqIAogICAgICogVGhhbmtzIHRvIEtlbiBTeW5kZXIgZm9yIGhpcyBlbmhhbmNlZCBEYXRlIGluc3RhbmNlIG1ldGhvZHMgd2hpY2ggYXJlCiAgICAgKiBpbmNsdWRlZCB3aXRoIHRoaXMgY29kZSA8aHR0cDovL2tlbmRzbnlkZXIuY29tL3NhbmRib3gvZGF0ZS8+LgogICAgICogCiAgICAgKiBUbyB1c2UgdGhpcyByZW5kZXJlciwgaW5jbHVkZSB0aGUgcGx1Z2luIGluIHlvdXIgc291cmNlCiAgICAgKiA+IDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iamF2YXNjcmlwdCIgc3JjPSJwbHVnaW5zL2pxcGxvdC5kYXRlQXhpc1JlbmRlcmVyLmpzIj48L3NjcmlwdD4KICAgICAqIAogICAgICogYW5kIHN1cHBseSB0aGUgYXBwcm9wcmlhdGUgb3B0aW9ucyB0byB5b3VyIHBsb3QKICAgICAqIAogICAgICogPiB7YXhlczp7eGF4aXM6e3JlbmRlcmVyOiQuanFwbG90LkRhdGVBeGlzUmVuZGVyZXJ9fX0KICAgICAqIAogICAgICogRGF0ZXMgY2FuIGJlIHBhc3NlZCBpbnRvIHRoZSBheGlzIGluIGFsbW9zdCBhbnkgcmVjb2duaXphYmxlIHZhbHVlIGFuZCAKICAgICAqIHdpbGwgYmUgcGFyc2VkLiAgVGhleSB3aWxsIGJlIHJlbmRlcmVkIG9uIHRoZSBheGlzIGluIHRoZSBmb3JtYXQKICAgICAqIHNwZWNpZmllZCBieSB0aWNrT3B0aW9ucy5mb3JtYXRTdHJpbmcuICBlLmcuIHRpY2tPcHRpb25zLmZvcm1hdFN0cmluZyA9ICclWS0lbS0lZCcuCiAgICAgKiAKICAgICAqIEFjY2VjcHRhYmxlIGZvcm1hdCBjb2RlcyAKICAgICAqIGFyZToKICAgICAqIAogICAgICogPiBDb2RlICAgIFJlc3VsdCAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uCiAgICAgKiA+ICAgICAgICAgICAgID09IFllYXJzID09CiAgICAgKiA+ICVZICAgICAgMjAwOCAgICAgICAgICAgICAgICBGb3VyLWRpZ2l0IHllYXIKICAgICAqID4gJXkgICAgICAwOCAgICAgICAgICAgICAgICAgIFR3by1kaWdpdCB5ZWFyCiAgICAgKiA+ICAgICAgICAgICAgID09IE1vbnRocyA9PQogICAgICogPiAlbSAgICAgIDA5ICAgICAgICAgICAgICAgICAgVHdvLWRpZ2l0IG1vbnRoCiAgICAgKiA+ICUjbSAgICAgOSAgICAgICAgICAgICAgICAgICBPbmUgb3IgdHdvLWRpZ2l0IG1vbnRoCiAgICAgKiA+ICVCICAgICAgU2VwdGVtYmVyICAgICAgICAgICBGdWxsIG1vbnRoIG5hbWUKICAgICAqID4gJWIgICAgICBTZXAgICAgICAgICAgICAgICAgIEFiYnJldmlhdGVkIG1vbnRoIG5hbWUKICAgICAqID4gICAgICAgICAgICAgPT0gRGF5cyA9PQogICAgICogPiAlZCAgICAgIDA1ICAgICAgICAgICAgICAgICAgVHdvLWRpZ2l0IGRheSBvZiBtb250aAogICAgICogPiAlI2QgICAgIDUgICAgICAgICAgICAgICAgICAgT25lIG9yIHR3by1kaWdpdCBkYXkgb2YgbW9udGgKICAgICAqID4gJWUgICAgICA1ICAgICAgICAgICAgICAgICAgIE9uZSBvciB0d28tZGlnaXQgZGF5IG9mIG1vbnRoCiAgICAgKiA+ICVBICAgICAgU3VuZGF5ICAgICAgICAgICAgICBGdWxsIG5hbWUgb2YgdGhlIGRheSBvZiB0aGUgd2VlawogICAgICogPiAlYSAgICAgIFN1biAgICAgICAgICAgICAgICAgQWJicmV2aWF0ZWQgbmFtZSBvZiB0aGUgZGF5IG9mIHRoZSB3ZWVrCiAgICAgKiA+ICV3ICAgICAgMCAgICAgICAgICAgICAgICAgICBOdW1iZXIgb2YgdGhlIGRheSBvZiB0aGUgd2VlayAoMCA9IFN1bmRheSwgNiA9IFNhdHVyZGF5KQogICAgICogPiAlbyAgICAgIHRoICAgICAgICAgICAgICAgICAgVGhlIG9yZGluYWwgc3VmZml4IHN0cmluZyBmb2xsb3dpbmcgdGhlIGRheSBvZiB0aGUgbW9udGgKICAgICAqID4gICAgICAgICAgICAgPT0gSG91cnMgPT0KICAgICAqID4gJUggICAgICAyMyAgICAgICAgICAgICAgICAgIEhvdXJzIGluIDI0LWhvdXIgZm9ybWF0ICh0d28gZGlnaXRzKQogICAgICogPiAlI0ggICAgIDMgICAgICAgICAgICAgICAgICAgSG91cnMgaW4gMjQtaG91ciBpbnRlZ2VyIGZvcm1hdCAob25lIG9yIHR3byBkaWdpdHMpCiAgICAgKiA+ICVJICAgICAgMTEgICAgICAgICAgICAgICAgICBIb3VycyBpbiAxMi1ob3VyIGZvcm1hdCAodHdvIGRpZ2l0cykKICAgICAqID4gJSNJICAgICAzICAgICAgICAgICAgICAgICAgIEhvdXJzIGluIDEyLWhvdXIgaW50ZWdlciBmb3JtYXQgKG9uZSBvciB0d28gZGlnaXRzKQogICAgICogPiAlcCAgICAgIFBNICAgICAgICAgICAgICAgICAgQU0gb3IgUE0KICAgICAqID4gICAgICAgICAgICAgPT0gTWludXRlcyA9PQogICAgICogPiAlTSAgICAgIDA5ICAgICAgICAgICAgICAgICAgTWludXRlcyAodHdvIGRpZ2l0cykKICAgICAqID4gJSNNICAgICA5ICAgICAgICAgICAgICAgICAgIE1pbnV0ZXMgKG9uZSBvciB0d28gZGlnaXRzKQogICAgICogPiAgICAgICAgICAgICA9PSBTZWNvbmRzID09CiAgICAgKiA+ICVTICAgICAgMDIgICAgICAgICAgICAgICAgICBTZWNvbmRzICh0d28gZGlnaXRzKQogICAgICogPiAlI1MgICAgIDIgICAgICAgICAgICAgICAgICAgU2Vjb25kcyAob25lIG9yIHR3byBkaWdpdHMpCiAgICAgKiA+ICVzICAgICAgMTIwNjU2NzYyNTcyMyAgICAgICBVbml4IHRpbWVzdGFtcCAoU2Vjb25kcyBwYXN0IDE5NzAtMDEtMDEgMDA6MDA6MDApCiAgICAgKiA+ICAgICAgICAgICAgID09IE1pbGxpc2Vjb25kcyA9PQogICAgICogPiAlTiAgICAgIDAwOCAgICAgICAgICAgICAgICAgTWlsbGlzZWNvbmRzICh0aHJlZSBkaWdpdHMpCiAgICAgKiA+ICUjTiAgICAgOCAgICAgICAgICAgICAgICAgICBNaWxsaXNlY29uZHMgKG9uZSB0byB0aHJlZSBkaWdpdHMpCiAgICAgKiA+ICAgICAgICAgICAgID09IFRpbWV6b25lID09CiAgICAgKiA+ICVPICAgICAgMzYwICAgICAgICAgICAgICAgICBkaWZmZXJlbmNlIGluIG1pbnV0ZXMgYmV0d2VlbiBsb2NhbCB0aW1lIGFuZCBHTVQKICAgICAqID4gJVogICAgICBNb3VudGFpbiBTdGFuZGFyZCBUaW1lICBOYW1lIG9mIHRpbWV6b25lIGFzIHJlcG9ydGVkIGJ5IGJyb3dzZXIKICAgICAqID4gJUcgICAgICAtMDY6MDAgICAgICAgICAgICAgIEhvdXJzIGFuZCBtaW51dGVzIGJldHdlZW4gR01UCiAgICAgKiA+ICAgICAgICAgICAgID09IFNob3J0Y3V0cyA9PQogICAgICogPiAlRiAgICAgIDIwMDgtMDMtMjYgICAgICAgICAgJVktJW0tJWQKICAgICAqID4gJVQgICAgICAwNTowNjozMCAgICAgICAgICAgICVIOiVNOiVTCiAgICAgKiA+ICVYICAgICAgMDU6MDY6MzAgICAgICAgICAgICAlSDolTTolUwogICAgICogPiAleCAgICAgIDAzLzI2LzA4ICAgICAgICAgICAgJW0vJWQvJXkKICAgICAqID4gJUQgICAgICAwMy8yNi8wOCAgICAgICAgICAgICVtLyVkLyV5CiAgICAgKiA+ICUjYyAgICAgV2VkIE1hciAyNiAxNTozMTowMCAyMDA4ICAlYSAlYiAlZSAlSDolTTolUyAlWQogICAgICogPiAldiAgICAgIDMtU2VwLTIwMDggICAgICAgICAgJWUtJWItJVkKICAgICAqID4gJVIgICAgICAxNTozMSAgICAgICAgICAgICAgICVIOiVNCiAgICAgKiA+ICVyICAgICAgMzozMTowMCBQTSAgICAgICAgICAlSTolTTolUyAlcAogICAgICogPiAgICAgICAgICAgICA9PSBDaGFyYWN0ZXJzID09CiAgICAgKiA+ICVuICAgICAgXG4gICAgICAgICAgICAgICAgICBOZXdsaW5lCiAgICAgKiA+ICV0ICAgICAgXHQgICAgICAgICAgICAgICAgICBUYWIKICAgICAqID4gJSUgICAgICAlICAgICAgICAgICAgICAgICAgIFBlcmNlbnQgU3ltYm9sIAogICAgICovCiAgICAkLmpxcGxvdC5EYXRlQXhpc1JlbmRlcmVyID0gZnVuY3Rpb24oKSB7CiAgICAgICAgJC5qcXBsb3QuTGluZWFyQXhpc1JlbmRlcmVyLmNhbGwodGhpcyk7CiAgICAgICAgdGhpcy5kYXRlID0gbmV3ICQuanNEYXRlKCk7CiAgICB9OwoKICAgIHZhciBzZWNvbmQgPSAxMDAwOwogICAgdmFyIG1pbnV0ZSA9IDYwICogc2Vjb25kOwogICAgdmFyIGhvdXIgPSA2MCAqIG1pbnV0ZTsKICAgIHZhciBkYXkgPSAyNCAqIGhvdXI7CiAgICB2YXIgd2VlayA9IDcgKiBkYXk7CgogICAgLy8gdGhlc2UgYXJlIGxlc3MgZGVmaW5pdGl2ZQogICAgdmFyIG1vbnRoID0gMzAuNDM2ODQ5OSAqIGRheTsKICAgIHZhciB5ZWFyID0gMzY1LjI0MjE5OSAqIGRheTsKCiAgICB2YXIgZGF5c0luTW9udGhzID0gWzMxLDI4LDMxLDMwLDMxLDMwLDMxLDMwLDMxLDMwLDMxLDMwXTsKICAgIC8vIGFycmF5IG9mIGNvbnNpc3RlbnQgbmljZSBpbnRlcnZhbHMuICBMb25nZXIgaW50ZXJ2YWxzCiAgICAvLyB3aWxsIGRlcGVuZCBvbiBkYXlzIGluIG1vbnRoLCBkYXlzIGluIHllYXIsIGV0Yy4KICAgIHZhciBuaWNlRm9ybWF0U3RyaW5ncyA9IFsnJU06JVMuJSNOJywgJyVNOiVTLiUjTicsICclTTolUy4lI04nLCAnJU06JVMnLCAnJU06JVMnLCAnJU06JVMnLCAnJU06JVMnLCAnJUg6JU06JVMnLCAnJUg6JU06JVMnLCAnJUg6JU0nLCAnJUg6JU0nLCAnJUg6JU0nLCAnJUg6JU0nLCAnJUg6JU0nLCAnJUg6JU0nLCAnJWEgJUg6JU0nLCAnJWEgJUg6JU0nLCAnJWIgJWUgJUg6JU0nLCAnJWIgJWUgJUg6JU0nLCAnJWIgJWUgJUg6JU0nLCAnJWIgJWUgJUg6JU0nLCAnJXYnLCAnJXYnLCAnJXYnLCAnJXYnLCAnJXYnLCAnJXYnLCAnJXYnXTsKICAgIHZhciBuaWNlSW50ZXJ2YWxzID0gWzAuMSpzZWNvbmQsIDAuMipzZWNvbmQsIDAuNSpzZWNvbmQsIHNlY29uZCwgMipzZWNvbmQsIDUqc2Vjb25kLCAxMCpzZWNvbmQsIDE1KnNlY29uZCwgMzAqc2Vjb25kLCBtaW51dGUsIDIqbWludXRlLCA1Km1pbnV0ZSwgMTAqbWludXRlLCAxNSptaW51dGUsIDMwKm1pbnV0ZSwgaG91ciwgMipob3VyLCA0KmhvdXIsIDYqaG91ciwgOCpob3VyLCAxMipob3VyLCBkYXksIDIqZGF5LCAzKmRheSwgNCpkYXksIDUqZGF5LCB3ZWVrLCAyKndlZWtdOwoKICAgIHZhciBuaWNlTW9udGhseUludGVydmFscyA9IFtdOwoKICAgIGZ1bmN0aW9uIGJlc3REYXRlSW50ZXJ2YWwobWluLCBtYXgsIHRpdGFyZ2V0KSB7CiAgICAgICAgLy8gaXRlcmF0ZSB0aHJvdWdoIG5pY2VJbnRlcnZhbHMgdG8gZmluZCBvbmUgY2xvc2VzdCB0byB0aXRhcmdldAogICAgICAgIHZhciBiYWRuZXNzID0gTnVtYmVyLk1BWF9WQUxVRTsKICAgICAgICB2YXIgdGVtcCwgYmVzdFRpLCBiZXN0Zm10OwogICAgICAgIGZvciAodmFyIGk9MCwgbD1uaWNlSW50ZXJ2YWxzLmxlbmd0aDsgaSA8IGw7IGkrKykgewogICAgICAgICAgICB0ZW1wID0gTWF0aC5hYnModGl0YXJnZXQgLSBuaWNlSW50ZXJ2YWxzW2ldKTsKICAgICAgICAgICAgaWYgKHRlbXAgPCBiYWRuZXNzKSB7CiAgICAgICAgICAgICAgICBiYWRuZXNzID0gdGVtcDsKICAgICAgICAgICAgICAgIGJlc3RUaSA9IG5pY2VJbnRlcnZhbHNbaV07CiAgICAgICAgICAgICAgICBiZXN0Zm10ID0gbmljZUZvcm1hdFN0cmluZ3NbaV07CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiBbYmVzdFRpLCBiZXN0Zm10XTsKICAgIH0KICAgIAogICAgJC5qcXBsb3QuRGF0ZUF4aXNSZW5kZXJlci5wcm90b3R5cGUgPSBuZXcgJC5qcXBsb3QuTGluZWFyQXhpc1JlbmRlcmVyKCk7CiAgICAkLmpxcGxvdC5EYXRlQXhpc1JlbmRlcmVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9ICQuanFwbG90LkRhdGVBeGlzUmVuZGVyZXI7CiAgICAKICAgICQuanFwbG90LkRhdGVUaWNrRm9ybWF0dGVyID0gZnVuY3Rpb24oZm9ybWF0LCB2YWwpIHsKICAgICAgICBpZiAoIWZvcm1hdCkgewogICAgICAgICAgICBmb3JtYXQgPSAnJVkvJW0vJWQnOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJC5qc0RhdGUuc3RyZnRpbWUodmFsLCBmb3JtYXQpOwogICAgfTsKICAgIAogICAgJC5qcXBsb3QuRGF0ZUF4aXNSZW5kZXJlci5wcm90b3R5cGUuaW5pdCA9IGZ1bmN0aW9uKG9wdGlvbnMpewogICAgICAgIC8vIHByb3A6IHRpY2tSZW5kZXJlcgogICAgICAgIC8vIEEgY2xhc3Mgb2YgYSByZW5kZXJpbmcgZW5naW5lIGZvciBjcmVhdGluZyB0aGUgdGlja3MgbGFiZWxzIGRpc3BsYXllZCBvbiB0aGUgcGxvdCwgCiAgICAgICAgLy8gU2VlIDwkLmpxcGxvdC5BeGlzVGlja1JlbmRlcmVyPi4KICAgICAgICAvLyB0aGlzLnRpY2tSZW5kZXJlciA9ICQuanFwbG90LkF4aXNUaWNrUmVuZGVyZXI7CiAgICAgICAgLy8gdGhpcy5sYWJlbFJlbmRlcmVyID0gJC5qcXBsb3QuQXhpc0xhYmVsUmVuZGVyZXI7CiAgICAgICAgdGhpcy50aWNrT3B0aW9ucy5mb3JtYXR0ZXIgPSAkLmpxcGxvdC5EYXRlVGlja0Zvcm1hdHRlcjsKICAgICAgICAvLyBwcm9wOiB0aWNrSW5zZXQKICAgICAgICAvLyBDb250cm9scyB0aGUgYW1vdW50IHRvIGluc2V0IHRoZSBmaXJzdCBhbmQgbGFzdCB0aWNrcyBmcm9tIAogICAgICAgIC8vIHRoZSBlZGdlcyBvZiB0aGUgZ3JpZCwgaW4gbXVsdGlwbGVzIG9mIHRoZSB0aWNrIGludGVydmFsLgogICAgICAgIC8vIDAgaXMgbm8gaW5zZXQsIDAuNSBpcyBvbmUgaGFsZiBhIHRpY2sgaW50ZXJ2YWwsIDEgaXMgYSBmdWxsCiAgICAgICAgLy8gdGljayBpbnRlcnZhbCwgZXRjLgogICAgICAgIHRoaXMudGlja0luc2V0ID0gMDsKICAgICAgICAvLyBwcm9wOiBkcmF3QmFzZWxpbmUKICAgICAgICAvLyBUcnVlIHRvIGRyYXcgdGhlIGF4aXMgYmFzZWxpbmUuCiAgICAgICAgdGhpcy5kcmF3QmFzZWxpbmUgPSB0cnVlOwogICAgICAgIC8vIHByb3A6IGJhc2VsaW5lV2lkdGgKICAgICAgICAvLyB3aWR0aCBvZiB0aGUgYmFzZWxpbmUgaW4gcGl4ZWxzLgogICAgICAgIHRoaXMuYmFzZWxpbmVXaWR0aCA9IG51bGw7CiAgICAgICAgLy8gcHJvcDogYmFzZWxpbmVDb2xvcgogICAgICAgIC8vIENTUyBjb2xvciBzcGVjIGZvciB0aGUgYmFzZWxpbmUuCiAgICAgICAgdGhpcy5iYXNlbGluZUNvbG9yID0gbnVsbDsKICAgICAgICB0aGlzLmRhVGlja0ludGVydmFsID0gbnVsbDsKICAgICAgICB0aGlzLl9kYVRpY2tJbnRlcnZhbCA9IG51bGw7CiAgICAgICAgCiAgICAgICAgJC5leHRlbmQodHJ1ZSwgdGhpcywgb3B0aW9ucyk7CiAgICAgICAgCiAgICAgICAgdmFyIGRiID0gdGhpcy5fZGF0YUJvdW5kcywKICAgICAgICAgICAgc3RhdHMsIAogICAgICAgICAgICBzdW0sCiAgICAgICAgICAgIHMsCiAgICAgICAgICAgIGQsCiAgICAgICAgICAgIHBkLAogICAgICAgICAgICBzZCwKICAgICAgICAgICAgaW50djsKICAgICAgICAKICAgICAgICAvLyBHbyB0aHJvdWdoIGFsbCB0aGUgc2VyaWVzIGF0dGFjaGVkIHRvIHRoaXMgYXhpcyBhbmQgZmluZAogICAgICAgIC8vIHRoZSBtaW4vbWF4IGJvdW5kcyBmb3IgdGhpcyBheGlzLgogICAgICAgIGZvciAodmFyIGk9MDsgaTx0aGlzLl9zZXJpZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgc3RhdHMgPSB7aW50ZXJ2YWxzOltdLCBmcmVxdWVuY2llczp7fSwgc29ydGVkSW50ZXJ2YWxzOltdLCBtaW46bnVsbCwgbWF4Om51bGwsIG1lYW46bnVsbH07CiAgICAgICAgICAgIHN1bSA9IDA7CiAgICAgICAgICAgIHMgPSB0aGlzLl9zZXJpZXNbaV07CiAgICAgICAgICAgIGQgPSBzLmRhdGE7CiAgICAgICAgICAgIHBkID0gcy5fcGxvdERhdGE7CiAgICAgICAgICAgIHNkID0gcy5fc3RhY2tEYXRhOwogICAgICAgICAgICBpbnR2ID0gMDsKICAgICAgICAgICAgCiAgICAgICAgICAgIGZvciAodmFyIGo9MDsgajxkLmxlbmd0aDsgaisrKSB7IAogICAgICAgICAgICAgICAgaWYgKHRoaXMubmFtZSA9PSAneGF4aXMnIHx8IHRoaXMubmFtZSA9PSAneDJheGlzJykgewogICAgICAgICAgICAgICAgICAgIGRbal1bMF0gPSBuZXcgJC5qc0RhdGUoZFtqXVswXSkuZ2V0VGltZSgpOwogICAgICAgICAgICAgICAgICAgIHBkW2pdWzBdID0gbmV3ICQuanNEYXRlKGRbal1bMF0pLmdldFRpbWUoKTsKICAgICAgICAgICAgICAgICAgICBzZFtqXVswXSA9IG5ldyAkLmpzRGF0ZShkW2pdWzBdKS5nZXRUaW1lKCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKChkW2pdWzBdICE9IG51bGwgJiYgZFtqXVswXSA8IGRiLm1pbikgfHwgZGIubWluID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZGIubWluID0gZFtqXVswXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKChkW2pdWzBdICE9IG51bGwgJiYgZFtqXVswXSA+IGRiLm1heCkgfHwgZGIubWF4ID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZGIubWF4ID0gZFtqXVswXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKGo+MCkgewogICAgICAgICAgICAgICAgICAgICAgICBpbnR2ID0gTWF0aC5hYnMoZFtqXVswXSAtIGRbai0xXVswXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRzLmludGVydmFscy5wdXNoKGludHYpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHMuZnJlcXVlbmNpZXMuaGFzT3duUHJvcGVydHkoaW50dikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRzLmZyZXF1ZW5jaWVzW2ludHZdICs9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0cy5mcmVxdWVuY2llc1tpbnR2XSA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc3VtICs9IGludHY7CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIGRbal1bMV0gPSBuZXcgJC5qc0RhdGUoZFtqXVsxXSkuZ2V0VGltZSgpOwogICAgICAgICAgICAgICAgICAgIHBkW2pdWzFdID0gbmV3ICQuanNEYXRlKGRbal1bMV0pLmdldFRpbWUoKTsKICAgICAgICAgICAgICAgICAgICBzZFtqXVsxXSA9IG5ldyAkLmpzRGF0ZShkW2pdWzFdKS5nZXRUaW1lKCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKChkW2pdWzFdICE9IG51bGwgJiYgZFtqXVsxXSA8IGRiLm1pbikgfHwgZGIubWluID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZGIubWluID0gZFtqXVsxXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKChkW2pdWzFdICE9IG51bGwgJiYgZFtqXVsxXSA+IGRiLm1heCkgfHwgZGIubWF4ID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZGIubWF4ID0gZFtqXVsxXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKGo+MCkgewogICAgICAgICAgICAgICAgICAgICAgICBpbnR2ID0gTWF0aC5hYnMoZFtqXVsxXSAtIGRbai0xXVsxXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRzLmludGVydmFscy5wdXNoKGludHYpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHMuZnJlcXVlbmNpZXMuaGFzT3duUHJvcGVydHkoaW50dikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRzLmZyZXF1ZW5jaWVzW2ludHZdICs9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0cy5mcmVxdWVuY2llc1tpbnR2XSA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBzdW0gKz0gaW50djsgICAgICAgICAgICAgIAogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAocy5yZW5kZXJlci5iYW5kcykgewogICAgICAgICAgICAgICAgaWYgKHMucmVuZGVyZXIuYmFuZHMuaGlEYXRhLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgIHZhciBiZCA9IHMucmVuZGVyZXIuYmFuZHMuaGlEYXRhOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGo9MCwgbD1iZC5sZW5ndGg7IGogPCBsOyBqKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubmFtZSA9PT0gJ3hheGlzJyB8fCB0aGlzLm5hbWUgPT09ICd4MmF4aXMnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZFtqXVswXSA9IG5ldyAkLmpzRGF0ZShiZFtqXVswXSkuZ2V0VGltZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChiZFtqXVswXSAhPSBudWxsICYmIGJkW2pdWzBdID4gZGIubWF4KSB8fCBkYi5tYXggPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRiLm1heCA9IGJkW2pdWzBdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZFtqXVsxXSA9IG5ldyAkLmpzRGF0ZShiZFtqXVsxXSkuZ2V0VGltZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChiZFtqXVsxXSAhPSBudWxsICYmIGJkW2pdWzFdID4gZGIubWF4KSB8fCBkYi5tYXggPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRiLm1heCA9IGJkW2pdWzFdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHMucmVuZGVyZXIuYmFuZHMubG93RGF0YS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgYmQgPSBzLnJlbmRlcmVyLmJhbmRzLmxvd0RhdGE7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaj0wLCBsPWJkLmxlbmd0aDsgaiA8IGw7IGorKykgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5uYW1lID09PSAneGF4aXMnIHx8IHRoaXMubmFtZSA9PT0gJ3gyYXhpcycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJkW2pdWzBdID0gbmV3ICQuanNEYXRlKGJkW2pdWzBdKS5nZXRUaW1lKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGJkW2pdWzBdICE9IG51bGwgJiYgYmRbal1bMF0gPCBkYi5taW4pIHx8IGRiLm1pbiA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGIubWluID0gYmRbal1bMF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmRbal1bMV0gPSBuZXcgJC5qc0RhdGUoYmRbal1bMV0pLmdldFRpbWUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoYmRbal1bMV0gIT0gbnVsbCAmJiBiZFtqXVsxXSA8IGRiLm1pbikgfHwgZGIubWluID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYi5taW4gPSBiZFtqXVsxXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHRlbXBmID0gMCwKICAgICAgICAgICAgICAgIHRlbXBuPTA7CiAgICAgICAgICAgIGZvciAodmFyIG4gaW4gc3RhdHMuZnJlcXVlbmNpZXMpIHsKICAgICAgICAgICAgICAgIHN0YXRzLnNvcnRlZEludGVydmFscy5wdXNoKHtpbnRlcnZhbDpuLCBmcmVxdWVuY3k6c3RhdHMuZnJlcXVlbmNpZXNbbl19KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBzdGF0cy5zb3J0ZWRJbnRlcnZhbHMuc29ydChmdW5jdGlvbihhLCBiKXsKICAgICAgICAgICAgICAgIHJldHVybiBiLmZyZXF1ZW5jeSAtIGEuZnJlcXVlbmN5OwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgCiAgICAgICAgICAgIHN0YXRzLm1pbiA9ICQuanFwbG90LmFycmF5TWluKHN0YXRzLmludGVydmFscyk7CiAgICAgICAgICAgIHN0YXRzLm1heCA9ICQuanFwbG90LmFycmF5TWF4KHN0YXRzLmludGVydmFscyk7CiAgICAgICAgICAgIHN0YXRzLm1lYW4gPSBzdW0vZC5sZW5ndGg7CiAgICAgICAgICAgIHRoaXMuX2ludGVydmFsU3RhdHMucHVzaChzdGF0cyk7CiAgICAgICAgICAgIHN0YXRzID0gc3VtID0gcyA9IGQgPSBwZCA9IHNkID0gbnVsbDsKICAgICAgICB9CiAgICAgICAgZGIgPSBudWxsOwogICAgICAgIAogICAgfTsKICAgIAogICAgLy8gY2FsbGVkIHdpdGggc2NvcGUgb2YgYW4gYXhpcwogICAgJC5qcXBsb3QuRGF0ZUF4aXNSZW5kZXJlci5wcm90b3R5cGUucmVzZXQgPSBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLm1pbiA9IHRoaXMuX29wdGlvbnMubWluOwogICAgICAgIHRoaXMubWF4ID0gdGhpcy5fb3B0aW9ucy5tYXg7CiAgICAgICAgdGhpcy50aWNrSW50ZXJ2YWwgPSB0aGlzLl9vcHRpb25zLnRpY2tJbnRlcnZhbDsKICAgICAgICB0aGlzLm51bWJlclRpY2tzID0gdGhpcy5fb3B0aW9ucy5udW1iZXJUaWNrczsKICAgICAgICB0aGlzLl9hdXRvRm9ybWF0U3RyaW5nID0gJyc7CiAgICAgICAgaWYgKHRoaXMuX292ZXJyaWRlRm9ybWF0U3RyaW5nICYmIHRoaXMudGlja09wdGlvbnMgJiYgdGhpcy50aWNrT3B0aW9ucy5mb3JtYXRTdHJpbmcpIHsKICAgICAgICAgICAgdGhpcy50aWNrT3B0aW9ucy5mb3JtYXRTdHJpbmcgPSAnJzsKICAgICAgICB9CiAgICAgICAgdGhpcy5kYVRpY2tJbnRlcnZhbCA9IHRoaXMuX2RhVGlja0ludGVydmFsOwogICAgICAgIC8vIHRoaXMuX3RpY2tzID0gdGhpcy5fX3RpY2tzOwogICAgfTsKICAgIAogICAgJC5qcXBsb3QuRGF0ZUF4aXNSZW5kZXJlci5wcm90b3R5cGUuY3JlYXRlVGlja3MgPSBmdW5jdGlvbihwbG90KSB7CiAgICAgICAgLy8gd2UncmUgYXJlIG9wZXJhdGluZyBvbiBhbiBheGlzIGhlcmUKICAgICAgICB2YXIgdGlja3MgPSB0aGlzLl90aWNrczsKICAgICAgICB2YXIgdXNlclRpY2tzID0gdGhpcy50aWNrczsKICAgICAgICB2YXIgbmFtZSA9IHRoaXMubmFtZTsKICAgICAgICAvLyBkYXRhYm91bmRzIHdlcmUgc2V0IG9uIGF4aXMgaW5pdGlhbGl6YXRpb24uCiAgICAgICAgdmFyIGRiID0gdGhpcy5fZGF0YUJvdW5kczsKICAgICAgICB2YXIgaXYgPSB0aGlzLl9pbnRlcnZhbFN0YXRzOwogICAgICAgIHZhciBkaW0gPSAodGhpcy5uYW1lLmNoYXJBdCgwKSA9PT0gJ3gnKSA/IHRoaXMuX3Bsb3REaW1lbnNpb25zLndpZHRoIDogdGhpcy5fcGxvdERpbWVuc2lvbnMuaGVpZ2h0OwogICAgICAgIHZhciBpbnRlcnZhbDsKICAgICAgICB2YXIgbWluLCBtYXg7CiAgICAgICAgdmFyIHBvczEsIHBvczI7CiAgICAgICAgdmFyIHR0LCBpOwogICAgICAgIHZhciB0aHJlc2hvbGQgPSAzMDsKICAgICAgICB2YXIgaW5zZXRNdWx0ID0gMTsKCiAgICAgICAgdmFyIHRpY2tJbnRlcnZhbCA9IHRoaXMudGlja0ludGVydmFsOwogICAgICAgIAogICAgICAgIC8vIGlmIHdlIGFscmVhZHkgaGF2ZSB0aWNrcywgdXNlIHRoZW0uCiAgICAgICAgLy8gdGlja3MgbXVzdCBiZSBpbiBvcmRlciBvZiBpbmNyZWFzaW5nIHZhbHVlLgogICAgICAgIAogICAgICAgIG1pbiA9ICgodGhpcy5taW4gIT0gbnVsbCkgPyBuZXcgJC5qc0RhdGUodGhpcy5taW4pLmdldFRpbWUoKSA6IGRiLm1pbik7CiAgICAgICAgbWF4ID0gKCh0aGlzLm1heCAhPSBudWxsKSA/IG5ldyAkLmpzRGF0ZSh0aGlzLm1heCkuZ2V0VGltZSgpIDogZGIubWF4KTsKCiAgICAgICAgLy8gc2VlIGlmIHdlJ3JlIHpvb21pbmcuICBpZiB3ZSBhcmUsIGRvbid0IHVzZSB0aGUgbWluIGFuZCBtYXggd2UncmUgZ2l2ZW4sCiAgICAgICAgLy8gYnV0IGNvbXB1dGUgc29tZSBuaWNlIG9uZXMuICBUaGV5IHdpbGwgYmUgcmVzZXQgbGF0ZXIuCgogICAgICAgIHZhciBjdXJzb3IgPSBwbG90LnBsdWdpbnMuY3Vyc29yOwoKICAgICAgICBpZiAoY3Vyc29yICYmIGN1cnNvci5fem9vbSAmJiBjdXJzb3IuX3pvb20uem9vbWluZykgewogICAgICAgICAgICB0aGlzLm1pbiA9IG51bGw7CiAgICAgICAgICAgIHRoaXMubWF4ID0gbnVsbDsKICAgICAgICB9CgogICAgICAgIHZhciByYW5nZSA9IG1heCAtIG1pbjsKCiAgICAgICAgaWYgKHRoaXMudGlja09wdGlvbnMgPT0gbnVsbCB8fCAhdGhpcy50aWNrT3B0aW9ucy5mb3JtYXRTdHJpbmcpIHsKICAgICAgICAgICAgdGhpcy5fb3ZlcnJpZGVGb3JtYXRTdHJpbmcgPSB0cnVlOwogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZiAodXNlclRpY2tzLmxlbmd0aCkgewogICAgICAgICAgICAvLyB0aWNrcyBjb3VsZCBiZSAxRCBvciAyRCBhcnJheSBvZiBbdmFsLCB2YWwsICwsLF0gb3IgW1t2YWwsIGxhYmVsXSwgW3ZhbCwgbGFiZWxdLCAuLi5dIG9yIG1peGVkCiAgICAgICAgICAgIGZvciAoaT0wOyBpPHVzZXJUaWNrcy5sZW5ndGg7IGkrKyl7CiAgICAgICAgICAgICAgICB2YXIgdXQgPSB1c2VyVGlja3NbaV07CiAgICAgICAgICAgICAgICB2YXIgdCA9IG5ldyB0aGlzLnRpY2tSZW5kZXJlcih0aGlzLnRpY2tPcHRpb25zKTsKICAgICAgICAgICAgICAgIGlmICh1dC5jb25zdHJ1Y3RvciA9PSBBcnJheSkgewogICAgICAgICAgICAgICAgICAgIHQudmFsdWUgPSBuZXcgJC5qc0RhdGUodXRbMF0pLmdldFRpbWUoKTsKICAgICAgICAgICAgICAgICAgICB0LmxhYmVsID0gdXRbMV07CiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLnNob3dUaWNrcykgewogICAgICAgICAgICAgICAgICAgICAgICB0LnNob3dMYWJlbCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICB0LnNob3dNYXJrID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCF0aGlzLnNob3dUaWNrTWFya3MpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdC5zaG93TWFyayA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB0LnNldFRpY2sodC52YWx1ZSwgdGhpcy5uYW1lKTsKICAgICAgICAgICAgICAgICAgICB0aGlzLl90aWNrcy5wdXNoKHQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0LnZhbHVlID0gbmV3ICQuanNEYXRlKHV0KS5nZXRUaW1lKCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLnNob3dUaWNrcykgewogICAgICAgICAgICAgICAgICAgICAgICB0LnNob3dMYWJlbCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICB0LnNob3dNYXJrID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCF0aGlzLnNob3dUaWNrTWFya3MpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdC5zaG93TWFyayA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB0LnNldFRpY2sodC52YWx1ZSwgdGhpcy5uYW1lKTsKICAgICAgICAgICAgICAgICAgICB0aGlzLl90aWNrcy5wdXNoKHQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMubnVtYmVyVGlja3MgPSB1c2VyVGlja3MubGVuZ3RoOwogICAgICAgICAgICB0aGlzLm1pbiA9IHRoaXMuX3RpY2tzWzBdLnZhbHVlOwogICAgICAgICAgICB0aGlzLm1heCA9IHRoaXMuX3RpY2tzW3RoaXMubnVtYmVyVGlja3MtMV0udmFsdWU7CiAgICAgICAgICAgIHRoaXMuZGFUaWNrSW50ZXJ2YWwgPSBbKHRoaXMubWF4IC0gdGhpcy5taW4pIC8gKHRoaXMubnVtYmVyVGlja3MgLSAxKS8xMDAwLCAnc2Vjb25kcyddOwogICAgICAgIH0KCiAgICAgICAgLy8vLy8vLy8KICAgICAgICAvLyBXZSBkb24ndCBoYXZlIGFueSB0aWNrcyB5ZXQsIGxldCdzIG1ha2Ugc29tZSEKICAgICAgICAvLy8vLy8vLwoKICAgICAgICAvLyBpZiB1c2VyIHNwZWNpZmllZCBtaW4gYW5kIG1heCBhcmUgbnVsbCwgd2Ugc2V0IHRob3NlIHRvIG1ha2UgYmVzdCB0aWNrcy4KICAgICAgICBlbHNlIGlmICh0aGlzLm1pbiA9PSBudWxsICYmIHRoaXMubWF4ID09IG51bGwpIHsKICAgICAgICAgICAgdmFyIG9wdHMgPSAkLmV4dGVuZCh0cnVlLCB7fSwgdGhpcy50aWNrT3B0aW9ucywge25hbWU6IHRoaXMubmFtZSwgdmFsdWU6IG51bGx9KTsKICAgICAgICAgICAgLy8gd2FudCB0byBmaW5kIGEgbmljZSBpbnRlcnZhbCAKICAgICAgICAgICAgdmFyIG50dGFyZ2V0LAogICAgICAgICAgICAgICAgdGl0YXJnZXQ7CgogICAgICAgICAgICAvLyBpZiBubyB0aWNrSW50ZXJ2YWwgb3IgbnVtYmVyVGlja3Mgb3B0aW9ucyBzcGVjaWZpZWQsICBtYWtlIGEgZ29vZCBndWVzcy4KICAgICAgICAgICAgaWYgKCF0aGlzLnRpY2tJbnRlcnZhbCAmJiAhdGhpcy5udW1iZXJUaWNrcykgewogICAgICAgICAgICAgICAgdmFyIHRkaW0gPSBNYXRoLm1heChkaW0sIHRocmVzaG9sZCsxKTsKICAgICAgICAgICAgICAgIC8vIGhvdyBtYW55IHRpY2tzIHRvIHB1dCBvbiB0aGUgYXhpcz8KICAgICAgICAgICAgICAgIC8vIGRhdGUgbGFiZWxzIHRlbmQgdG8gYmUgbG9uZy4gIElmIHRpY2tzIG5vdCByb3RhdGVkLAogICAgICAgICAgICAgICAgLy8gZG9uJ3QgdXNlIHRvbyBtYW55IGFuZCBoYXZlIGEgaGlnaCBzcGFjaW5nIGZhY3Rvci4KICAgICAgICAgICAgICAgIC8vIElmIHdlIGFyZSByb3RhdGluZyB0aWNrcywgdXNlIGEgbG93ZXIgZmFjdG9yLgogICAgICAgICAgICAgICAgdmFyIHNwYWNpbmdGYWN0b3IgPSAxMTU7CiAgICAgICAgICAgICAgICBpZiAodGhpcy50aWNrUmVuZGVyZXIgPT09ICQuanFwbG90LkNhbnZhc0F4aXNUaWNrUmVuZGVyZXIgJiYgdGhpcy50aWNrT3B0aW9ucy5hbmdsZSkgewogICAgICAgICAgICAgICAgICAgIHNwYWNpbmdGYWN0b3IgPSAxMTUgLSA0MCAqIE1hdGguYWJzKE1hdGguc2luKHRoaXMudGlja09wdGlvbnMuYW5nbGUvMTgwKk1hdGguUEkpKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBudHRhcmdldCA9ICBNYXRoLmNlaWwoKHRkaW0tdGhyZXNob2xkKS9zcGFjaW5nRmFjdG9yICsgMSk7CiAgICAgICAgICAgICAgICB0aXRhcmdldCA9IChtYXggLSBtaW4pIC8gKG50dGFyZ2V0IC0gMSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIElmIHRpY2tJbnRlcnZhbCBpcyBzcGVjaWZpZWQsIHdlJ2xsIHRyeSB0byBob25vciBpdC4KICAgICAgICAgICAgLy8gTm90IGdhdXJhbnRlZWQgdG8gZ2V0IHRoaXMgaW50ZXJ2YWwsIGJ1dCB3ZSdsbCBnZXQgYXMgY2xvc2UgYXMKICAgICAgICAgICAgLy8gd2UgY2FuLgogICAgICAgICAgICAvLyB0aWNrSW50ZXJ2YWwgd2lsbCBiZSB1c2VkIGJlZm9yZSBudW1iZXJUaWNrcywgdGhhdCBpcyBpZgogICAgICAgICAgICAvLyBib3RoIGFyZSBzcGVjaWZpZWQsIG51bWJlclRpY2tzIHdpbGwgYmUgaWdub3JlZC4KICAgICAgICAgICAgZWxzZSBpZiAodGhpcy50aWNrSW50ZXJ2YWwpIHsKICAgICAgICAgICAgICAgIHRpdGFyZ2V0ID0gdGhpcy50aWNrSW50ZXJ2YWw7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGlmIG51bWJlclRpY2tzIHNwZWNpZmllZCwgdHJ5IHRvIGhvbm9yIGl0LgogICAgICAgICAgICAvLyBOb3QgZ2F1cmFudGVlZCwgYnV0IHdpbGwgdHJ5IHRvIGdldCBjbG9zZS4KICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5udW1iZXJUaWNrcykgewogICAgICAgICAgICAgICAgbnR0YXJnZXQgPSB0aGlzLm51bWJlclRpY2tzOwogICAgICAgICAgICAgICAgdGl0YXJnZXQgPSAobWF4IC0gbWluKSAvIChudHRhcmdldCAtIDEpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBJZiB3ZSBjYW4gdXNlIGFuIGludGVydmFsIG9mIDIgd2Vla3Mgb3IgbGVzcywgcGljayBiZXN0IG9uZQogICAgICAgICAgICBpZiAodGl0YXJnZXQgPD0gMTkqZGF5KSB7CiAgICAgICAgICAgICAgICB2YXIgcmV0ID0gYmVzdERhdGVJbnRlcnZhbChtaW4sIG1heCwgdGl0YXJnZXQpOwogICAgICAgICAgICAgICAgdmFyIHRlbXB0aSA9IHJldFswXTsKICAgICAgICAgICAgICAgIHRoaXMuX2F1dG9Gb3JtYXRTdHJpbmcgPSByZXRbMV07CgogICAgICAgICAgICAgICAgbWluID0gTWF0aC5mbG9vcihtaW4vdGVtcHRpKSAqIHRlbXB0aTsKICAgICAgICAgICAgICAgIG1pbiA9IG5ldyAkLmpzRGF0ZShtaW4pOwogICAgICAgICAgICAgICAgbWluID0gbWluLmdldFRpbWUoKSArIG1pbi5nZXRVdGNPZmZzZXQoKTsKCiAgICAgICAgICAgICAgICBudHRhcmdldCA9IE1hdGguY2VpbCgobWF4IC0gbWluKSAvIHRlbXB0aSkgKyAxOwogICAgICAgICAgICAgICAgdGhpcy5taW4gPSBtaW47CiAgICAgICAgICAgICAgICB0aGlzLm1heCA9IG1pbiArIChudHRhcmdldCAtIDEpICogdGVtcHRpOwoKICAgICAgICAgICAgICAgIC8vIGlmIG1heCBpcyBsZXNzIHRoYW4gbWF4LCBhZGQgYW4gaW50ZXJ2YWwKICAgICAgICAgICAgICAgIGlmICh0aGlzLm1heCA8IG1heCkgewogICAgICAgICAgICAgICAgICAgIHRoaXMubWF4ICs9IHRlbXB0aTsKICAgICAgICAgICAgICAgICAgICBudHRhcmdldCArPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGhpcy50aWNrSW50ZXJ2YWwgPSB0ZW1wdGk7CiAgICAgICAgICAgICAgICB0aGlzLm51bWJlclRpY2tzID0gbnR0YXJnZXQ7CgogICAgICAgICAgICAgICAgZm9yICh2YXIgaT0wOyBpPG50dGFyZ2V0OyBpKyspIHsKICAgICAgICAgICAgICAgICAgICBvcHRzLnZhbHVlID0gdGhpcy5taW4gKyBpICogdGVtcHRpOwogICAgICAgICAgICAgICAgICAgIHQgPSBuZXcgdGhpcy50aWNrUmVuZGVyZXIob3B0cyk7CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX292ZXJyaWRlRm9ybWF0U3RyaW5nICYmIHRoaXMuX2F1dG9Gb3JtYXRTdHJpbmcgIT0gJycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdC5mb3JtYXRTdHJpbmcgPSB0aGlzLl9hdXRvRm9ybWF0U3RyaW5nOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuc2hvd1RpY2tzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHQuc2hvd0xhYmVsID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIHQuc2hvd01hcmsgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIXRoaXMuc2hvd1RpY2tNYXJrcykgewogICAgICAgICAgICAgICAgICAgICAgICB0LnNob3dNYXJrID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHRoaXMuX3RpY2tzLnB1c2godCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaW5zZXRNdWx0ID0gdGhpcy50aWNrSW50ZXJ2YWw7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHNob3VsZCB3ZSB1c2UgYSBtb250aGx5IGludGVydmFsPwogICAgICAgICAgICBlbHNlIGlmICh0aXRhcmdldCA8PSA5ICogbW9udGgpIHsKCiAgICAgICAgICAgICAgICB0aGlzLl9hdXRvRm9ybWF0U3RyaW5nID0gJyV2JzsKCiAgICAgICAgICAgICAgICAvLyBob3cgbWFueSBtb250aHMgaW4gYW4gaW50ZXJ2YWw/CiAgICAgICAgICAgICAgICB2YXIgaW50diA9IE1hdGgucm91bmQodGl0YXJnZXQvbW9udGgpOwogICAgICAgICAgICAgICAgaWYgKGludHYgPCAxKSB7CiAgICAgICAgICAgICAgICAgICAgaW50diA9IDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChpbnR2ID4gNikgewogICAgICAgICAgICAgICAgICAgIGludHYgPSA2OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGZpZ3VyZSBvdXQgdGhlIHN0YXJ0aW5nIG1vbnRoIGFuZCBlbmRpbmcgbW9udGguCiAgICAgICAgICAgICAgICB2YXIgbXN0YXJ0ID0gbmV3ICQuanNEYXRlKG1pbikuc2V0RGF0ZSgxKS5zZXRIb3VycygwLDAsMCwwKTsKCiAgICAgICAgICAgICAgICAvLyBTZWUgaWYgbWF4IGVuZHMgZXhhY3RseSBvbiBhIG1vbnRoCiAgICAgICAgICAgICAgICB2YXIgdGVtcG1lbmQgPSBuZXcgJC5qc0RhdGUobWF4KTsKICAgICAgICAgICAgICAgIHZhciBtZW5kID0gbmV3ICQuanNEYXRlKG1heCkuc2V0RGF0ZSgxKS5zZXRIb3VycygwLDAsMCwwKTsKCiAgICAgICAgICAgICAgICBpZiAodGVtcG1lbmQuZ2V0VGltZSgpICE9PSBtZW5kLmdldFRpbWUoKSkgewogICAgICAgICAgICAgICAgICAgIG1lbmQgPSBtZW5kLmFkZCgxLCAnbW9udGgnKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB2YXIgbm1vbnRocyA9IG1lbmQuZGlmZihtc3RhcnQsICdtb250aCcpOwoKICAgICAgICAgICAgICAgIG50dGFyZ2V0ID0gTWF0aC5jZWlsKG5tb250aHMvaW50dikgKyAxOwoKICAgICAgICAgICAgICAgIHRoaXMubWluID0gbXN0YXJ0LmdldFRpbWUoKTsKICAgICAgICAgICAgICAgIHRoaXMubWF4ID0gbXN0YXJ0LmNsb25lKCkuYWRkKChudHRhcmdldCAtIDEpICogaW50diwgJ21vbnRoJykuZ2V0VGltZSgpOwogICAgICAgICAgICAgICAgdGhpcy5udW1iZXJUaWNrcyA9IG50dGFyZ2V0OwoKICAgICAgICAgICAgICAgIGZvciAodmFyIGk9MDsgaTxudHRhcmdldDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgb3B0cy52YWx1ZSA9IG1zdGFydC5nZXRUaW1lKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBvcHRzLnZhbHVlID0gbXN0YXJ0LmFkZChpbnR2LCAnbW9udGgnKS5nZXRUaW1lKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHQgPSBuZXcgdGhpcy50aWNrUmVuZGVyZXIob3B0cyk7CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX292ZXJyaWRlRm9ybWF0U3RyaW5nICYmIHRoaXMuX2F1dG9Gb3JtYXRTdHJpbmcgIT0gJycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdC5mb3JtYXRTdHJpbmcgPSB0aGlzLl9hdXRvRm9ybWF0U3RyaW5nOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuc2hvd1RpY2tzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHQuc2hvd0xhYmVsID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIHQuc2hvd01hcmsgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIXRoaXMuc2hvd1RpY2tNYXJrcykgewogICAgICAgICAgICAgICAgICAgICAgICB0LnNob3dNYXJrID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHRoaXMuX3RpY2tzLnB1c2godCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaW5zZXRNdWx0ID0gaW50diAqIG1vbnRoOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyB1c2UgeWVhcmx5IGludGVydmFscwogICAgICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICAgICB0aGlzLl9hdXRvRm9ybWF0U3RyaW5nID0gJyV2JzsKCiAgICAgICAgICAgICAgICAvLyBob3cgbWFueSB5ZWFycyBpbiBhbiBpbnRlcnZhbD8KICAgICAgICAgICAgICAgIHZhciBpbnR2ID0gTWF0aC5yb3VuZCh0aXRhcmdldC95ZWFyKTsKICAgICAgICAgICAgICAgIGlmIChpbnR2IDwgMSkgewogICAgICAgICAgICAgICAgICAgIGludHYgPSAxOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIGZpZ3VyZSBvdXQgdGhlIHN0YXJ0aW5nIGFuZCBlbmRpbmcgeWVhcnMuCiAgICAgICAgICAgICAgICB2YXIgbXN0YXJ0ID0gbmV3ICQuanNEYXRlKG1pbikuc2V0TW9udGgoMCwgMSkuc2V0SG91cnMoMCwwLDAsMCk7CiAgICAgICAgICAgICAgICB2YXIgbWVuZCA9IG5ldyAkLmpzRGF0ZShtYXgpLmFkZCgxLCAneWVhcicpLnNldE1vbnRoKDAsIDEpLnNldEhvdXJzKDAsMCwwLDApOwoKICAgICAgICAgICAgICAgIHZhciBueWVhcnMgPSBtZW5kLmRpZmYobXN0YXJ0LCAneWVhcicpOwoKICAgICAgICAgICAgICAgIG50dGFyZ2V0ID0gTWF0aC5jZWlsKG55ZWFycy9pbnR2KSArIDE7CgogICAgICAgICAgICAgICAgdGhpcy5taW4gPSBtc3RhcnQuZ2V0VGltZSgpOwogICAgICAgICAgICAgICAgdGhpcy5tYXggPSBtc3RhcnQuY2xvbmUoKS5hZGQoKG50dGFyZ2V0IC0gMSkgKiBpbnR2LCAneWVhcicpLmdldFRpbWUoKTsKICAgICAgICAgICAgICAgIHRoaXMubnVtYmVyVGlja3MgPSBudHRhcmdldDsKCiAgICAgICAgICAgICAgICBmb3IgKHZhciBpPTA7IGk8bnR0YXJnZXQ7IGkrKykgewogICAgICAgICAgICAgICAgICAgIGlmIChpID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG9wdHMudmFsdWUgPSBtc3RhcnQuZ2V0VGltZSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgb3B0cy52YWx1ZSA9IG1zdGFydC5hZGQoaW50diwgJ3llYXInKS5nZXRUaW1lKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHQgPSBuZXcgdGhpcy50aWNrUmVuZGVyZXIob3B0cyk7CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX292ZXJyaWRlRm9ybWF0U3RyaW5nICYmIHRoaXMuX2F1dG9Gb3JtYXRTdHJpbmcgIT0gJycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdC5mb3JtYXRTdHJpbmcgPSB0aGlzLl9hdXRvRm9ybWF0U3RyaW5nOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuc2hvd1RpY2tzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHQuc2hvd0xhYmVsID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIHQuc2hvd01hcmsgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIXRoaXMuc2hvd1RpY2tNYXJrcykgewogICAgICAgICAgICAgICAgICAgICAgICB0LnNob3dNYXJrID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHRoaXMuX3RpY2tzLnB1c2godCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaW5zZXRNdWx0ID0gaW50diAqIHllYXI7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vLy8vLy8vCiAgICAgICAgLy8gU29tZSBvcHRpb24ocykgc3BlY2lmaWVkLCB3b3JrIGFyb3VuZCB0aGF0LgogICAgICAgIC8vLy8vLy8vCiAgICAgICAgCiAgICAgICAgZWxzZSB7ICAgICAgCiAgICAgICAgICAgIGlmIChuYW1lID09ICd4YXhpcycgfHwgbmFtZSA9PSAneDJheGlzJykgewogICAgICAgICAgICAgICAgZGltID0gdGhpcy5fcGxvdERpbWVuc2lvbnMud2lkdGg7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBkaW0gPSB0aGlzLl9wbG90RGltZW5zaW9ucy5oZWlnaHQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgICAgIC8vIGlmIG1pbiwgbWF4IGFuZCBudW1iZXIgb2YgdGlja3Mgc3BlY2lmaWVkLCB1c2VyIGNhbid0IHNwZWNpZnkgaW50ZXJ2YWwuCiAgICAgICAgICAgIGlmICh0aGlzLm1pbiAhPSBudWxsICYmIHRoaXMubWF4ICE9IG51bGwgJiYgdGhpcy5udW1iZXJUaWNrcyAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICB0aGlzLnRpY2tJbnRlcnZhbCA9IG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgICAgIC8vIGlmIHVzZXIgc3BlY2lmaWVkIGEgdGljayBpbnRlcnZhbCwgY29udmVydCB0byB1c2FibGUuCiAgICAgICAgICAgIGlmICh0aGlzLnRpY2tJbnRlcnZhbCAhPSBudWxsKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBpZiBpbnRlcnZhbCBpcyBhIG51bWJlciBvciBjYW4gYmUgY29udmVydGVkIHRvIG9uZSwgdXNlIGl0LgogICAgICAgICAgICAgICAgLy8gQXNzdW1lIGl0IGlzIGluIFNFQ09ORFMhISEKICAgICAgICAgICAgICAgIGlmIChOdW1iZXIodGhpcy50aWNrSW50ZXJ2YWwpKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYVRpY2tJbnRlcnZhbCA9IFtOdW1iZXIodGhpcy50aWNrSW50ZXJ2YWwpLCAnc2Vjb25kcyddOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gZWxzZSwgcGFyc2Ugb3V0IHNvbWV0aGluZyB3ZSBjYW4gYnVpbGQgZnJvbS4KICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZiB0aGlzLnRpY2tJbnRlcnZhbCA9PSAic3RyaW5nIikgewogICAgICAgICAgICAgICAgICAgIHZhciBwYXJ0cyA9IHRoaXMudGlja0ludGVydmFsLnNwbGl0KCcgJyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnRzLmxlbmd0aCA9PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGFUaWNrSW50ZXJ2YWwgPSBbMSwgcGFydHNbMF1dOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChwYXJ0cy5sZW5ndGggPT0gMikgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhVGlja0ludGVydmFsID0gW3BhcnRzWzBdLCBwYXJ0c1sxXV07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICAvLyBpZiBtaW4gYW5kIG1heCBhcmUgc2FtZSwgc3BhY2UgdGhlbSBvdXQgYSBiaXQKICAgICAgICAgICAgaWYgKG1pbiA9PSBtYXgpIHsKICAgICAgICAgICAgICAgIHZhciBhZGogPSAyNCo2MCo2MCo1MDA7ICAvLyAxLzIgZGF5CiAgICAgICAgICAgICAgICBtaW4gLT0gYWRqOwogICAgICAgICAgICAgICAgbWF4ICs9IGFkajsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmFuZ2UgPSBtYXggLSBtaW47CiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgb3B0TnVtVGlja3MgPSAyICsgcGFyc2VJbnQoTWF0aC5tYXgoMCwgZGltLTEwMCkvMTAwLCAxMCk7CiAgICAgICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHJtaW4sIHJtYXg7CiAgICAgICAgICAgIAogICAgICAgICAgICBybWluID0gKHRoaXMubWluICE9IG51bGwpID8gbmV3ICQuanNEYXRlKHRoaXMubWluKS5nZXRUaW1lKCkgOiBtaW4gLSByYW5nZS8yKih0aGlzLnBhZE1pbiAtIDEpOwogICAgICAgICAgICBybWF4ID0gKHRoaXMubWF4ICE9IG51bGwpID8gbmV3ICQuanNEYXRlKHRoaXMubWF4KS5nZXRUaW1lKCkgOiBtYXggKyByYW5nZS8yKih0aGlzLnBhZE1heCAtIDEpOwogICAgICAgICAgICB0aGlzLm1pbiA9IHJtaW47CiAgICAgICAgICAgIHRoaXMubWF4ID0gcm1heDsKICAgICAgICAgICAgcmFuZ2UgPSB0aGlzLm1heCAtIHRoaXMubWluOwogICAgICAgICAgICAKICAgICAgICAgICAgaWYgKHRoaXMubnVtYmVyVGlja3MgPT0gbnVsbCl7CiAgICAgICAgICAgICAgICAvLyBpZiB0aWNrSW50ZXJ2YWwgaXMgc3BlY2lmaWVkIGJ5IHVzZXIsIHdlIHdpbGwgaWdub3JlIGNvbXB1dGVkIG1heGltdW0uCiAgICAgICAgICAgICAgICAvLyBtYXggd2lsbCBiZSBlcXVhbCBvciBncmVhdGVyIHRvIGZpdCBldmVuICMgb2YgdGlja3MuCiAgICAgICAgICAgICAgICBpZiAodGhpcy5kYVRpY2tJbnRlcnZhbCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG5jID0gbmV3ICQuanNEYXRlKHRoaXMubWF4KS5kaWZmKHRoaXMubWluLCB0aGlzLmRhVGlja0ludGVydmFsWzFdLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICB0aGlzLm51bWJlclRpY2tzID0gTWF0aC5jZWlsKG5jL3RoaXMuZGFUaWNrSW50ZXJ2YWxbMF0pICsxOwogICAgICAgICAgICAgICAgICAgIC8vIHRoaXMubWF4ID0gbmV3ICQuanNEYXRlKHRoaXMubWluKS5hZGQodGhpcy5udW1iZXJUaWNrcy0xLCB0aGlzLmRhVGlja0ludGVydmFsWzFdKS5nZXRUaW1lKCk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXggPSBuZXcgJC5qc0RhdGUodGhpcy5taW4pLmFkZCgodGhpcy5udW1iZXJUaWNrcy0xKSAqIHRoaXMuZGFUaWNrSW50ZXJ2YWxbMF0sIHRoaXMuZGFUaWNrSW50ZXJ2YWxbMV0pLmdldFRpbWUoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKGRpbSA+IDIwMCkgewogICAgICAgICAgICAgICAgICAgIHRoaXMubnVtYmVyVGlja3MgPSBwYXJzZUludCgzKyhkaW0tMjAwKS8xMDAsIDEwKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHRoaXMubnVtYmVyVGlja3MgPSAyOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICBpbnNldE11bHQgPSByYW5nZSAvICh0aGlzLm51bWJlclRpY2tzLTEpLzEwMDA7CgogICAgICAgICAgICBpZiAodGhpcy5kYVRpY2tJbnRlcnZhbCA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICB0aGlzLmRhVGlja0ludGVydmFsID0gW2luc2V0TXVsdCwgJ3NlY29uZHMnXTsKICAgICAgICAgICAgfQoKCiAgICAgICAgICAgIGZvciAodmFyIGk9MDsgaTx0aGlzLm51bWJlclRpY2tzOyBpKyspewogICAgICAgICAgICAgICAgdmFyIG1pbiA9IG5ldyAkLmpzRGF0ZSh0aGlzLm1pbik7CiAgICAgICAgICAgICAgICB0dCA9IG1pbi5hZGQoaSp0aGlzLmRhVGlja0ludGVydmFsWzBdLCB0aGlzLmRhVGlja0ludGVydmFsWzFdKS5nZXRUaW1lKCk7CiAgICAgICAgICAgICAgICB2YXIgdCA9IG5ldyB0aGlzLnRpY2tSZW5kZXJlcih0aGlzLnRpY2tPcHRpb25zKTsKICAgICAgICAgICAgICAgIC8vIHZhciB0ID0gbmV3ICQuanFwbG90LkF4aXNUaWNrUmVuZGVyZXIodGhpcy50aWNrT3B0aW9ucyk7CiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuc2hvd1RpY2tzKSB7CiAgICAgICAgICAgICAgICAgICAgdC5zaG93TGFiZWwgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB0LnNob3dNYXJrID0gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICghdGhpcy5zaG93VGlja01hcmtzKSB7CiAgICAgICAgICAgICAgICAgICAgdC5zaG93TWFyayA9IGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdC5zZXRUaWNrKHR0LCB0aGlzLm5hbWUpOwogICAgICAgICAgICAgICAgdGhpcy5fdGlja3MucHVzaCh0KTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKHRoaXMudGlja0luc2V0KSB7CiAgICAgICAgICAgIHRoaXMubWluID0gdGhpcy5taW4gLSB0aGlzLnRpY2tJbnNldCAqIGluc2V0TXVsdDsKICAgICAgICAgICAgdGhpcy5tYXggPSB0aGlzLm1heCArIHRoaXMudGlja0luc2V0ICogaW5zZXRNdWx0OwogICAgICAgIH0KCiAgICAgICAgaWYgKHRoaXMuX2RhVGlja0ludGVydmFsID09IG51bGwpIHsKICAgICAgICAgICAgdGhpcy5fZGFUaWNrSW50ZXJ2YWwgPSB0aGlzLmRhVGlja0ludGVydmFsOyAgICAKICAgICAgICB9CgogICAgICAgIHRpY2tzID0gbnVsbDsKICAgIH07CiAgIAp9KShqUXVlcnkpOwoK]]></data>
	</file>
	<file>
	  <filename>/src/plugins/jqplot.dateAxisRenderer.min.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqCiAqIGpxUGxvdAogKiBQdXJlIEphdmFTY3JpcHQgcGxvdHRpbmcgcGx1Z2luIHVzaW5nIGpRdWVyeQogKgogKiBWZXJzaW9uOiAxLjAuMGIyX3IxMDEyCiAqCiAqIENvcHlyaWdodCAoYykgMjAwOS0yMDExIENocmlzIExlb25lbGxvCiAqIGpxUGxvdCBpcyBjdXJyZW50bHkgYXZhaWxhYmxlIGZvciB1c2UgaW4gYWxsIHBlcnNvbmFsIG9yIGNvbW1lcmNpYWwgcHJvamVjdHMgCiAqIHVuZGVyIGJvdGggdGhlIE1JVCAoaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHApIGFuZCBHUEwgCiAqIHZlcnNpb24gMi4wIChodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC5odG1sKSBsaWNlbnNlcy4gVGhpcyBtZWFucyB0aGF0IHlvdSBjYW4gCiAqIGNob29zZSB0aGUgbGljZW5zZSB0aGF0IGJlc3Qgc3VpdHMgeW91ciBwcm9qZWN0IGFuZCB1c2UgaXQgYWNjb3JkaW5nbHkuIAogKgogKiBBbHRob3VnaCBub3QgcmVxdWlyZWQsIHRoZSBhdXRob3Igd291bGQgYXBwcmVjaWF0ZSBhbiBlbWFpbCBsZXR0aW5nIGhpbSAKICoga25vdyBvZiBhbnkgc3Vic3RhbnRpYWwgdXNlIG9mIGpxUGxvdC4gIFlvdSBjYW4gcmVhY2ggdGhlIGF1dGhvciBhdDogCiAqIGNocmlzIGF0IGpxcGxvdCBkb3QgY29tIG9yIHNlZSBodHRwOi8vd3d3LmpxcGxvdC5jb20vaW5mby5waHAgLgogKgogKiBJZiB5b3UgYXJlIGZlZWxpbmcga2luZCBhbmQgZ2VuZXJvdXMsIGNvbnNpZGVyIHN1cHBvcnRpbmcgdGhlIHByb2plY3QgYnkKICogbWFraW5nIGEgZG9uYXRpb24gYXQ6IGh0dHA6Ly93d3cuanFwbG90LmNvbS9kb25hdGUucGhwIC4KICoKICogc3ByaW50ZiBmdW5jdGlvbnMgY29udGFpbmVkIGluIGpxcGxvdC5zcHJpbnRmLmpzIGJ5IEFzaCBTZWFybGU6CiAqCiAqICAgICB2ZXJzaW9uIDIwMDcuMDQuMjcKICogICAgIGF1dGhvciBBc2ggU2VhcmxlCiAqICAgICBodHRwOi8vaGV4bWVuLmNvbS9ibG9nLzIwMDcvMDMvcHJpbnRmLXNwcmludGYvCiAqICAgICBodHRwOi8vaGV4bWVuLmNvbS9qcy9zcHJpbnRmLmpzCiAqICAgICBUaGUgYXV0aG9yIChBc2ggU2VhcmxlKSBoYXMgcGxhY2VkIHRoaXMgY29kZSBpbiB0aGUgcHVibGljIGRvbWFpbjoKICogICAgICJUaGlzIGNvZGUgaXMgdW5yZXN0cmljdGVkOiB5b3UgYXJlIGZyZWUgdG8gdXNlIGl0IGhvd2V2ZXIgeW91IGxpa2UuIgogKgogKiBpbmNsdWRlZCBqc0RhdGUgbGlicmFyeSBieSBDaHJpcyBMZW9uZWxsbzoKICoKICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEgQ2hyaXMgTGVvbmVsbG8KICoKICoganNEYXRlIGlzIGN1cnJlbnRseSBhdmFpbGFibGUgZm9yIHVzZSBpbiBhbGwgcGVyc29uYWwgb3IgY29tbWVyY2lhbCBwcm9qZWN0cyAKICogdW5kZXIgYm90aCB0aGUgTUlUIGFuZCBHUEwgdmVyc2lvbiAyLjAgbGljZW5zZXMuIFRoaXMgbWVhbnMgdGhhdCB5b3UgY2FuIAogKiBjaG9vc2UgdGhlIGxpY2Vuc2UgdGhhdCBiZXN0IHN1aXRzIHlvdXIgcHJvamVjdCBhbmQgdXNlIGl0IGFjY29yZGluZ2x5LgogKgogKiBqc0RhdGUgYm9ycm93cyBtYW55IGNvbmNlcHRzIGFuZCBpZGVhcyBmcm9tIHRoZSBEYXRlIEluc3RhbmNlIAogKiBNZXRob2RzIGJ5IEtlbiBTbnlkZXIgYWxvbmcgd2l0aCBzb21lIHBhcnRzIG9mIEtlbidzIGFjdHVhbCBjb2RlLgogKiAKICogS2VuJ3Mgb3JpZ2lhbmwgRGF0ZSBJbnN0YW5jZSBNZXRob2RzIGFuZCBjb3B5cmlnaHQgbm90aWNlOgogKiAKICogS2VuIFNueWRlciAoa2VuIGQgc255ZGVyIGF0IGdtYWlsIGRvdCBjb20pCiAqIDIwMDgtMDktMTAKICogdmVyc2lvbiAyLjAuMiAoaHR0cDovL2tlbmRzbnlkZXIuY29tL3NhbmRib3gvZGF0ZS8pICAgICAKICogQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbiBMaWNlbnNlIDMuMCAoaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnkvMy4wLykKICoKICoganFwbG90VG9JbWFnZSBmdW5jdGlvbiBiYXNlZCBvbiBMYXJyeSBTaWRlbidzIGV4cG9ydC1qcXBsb3QtdG8tcG5nLmpzLgogKiBMYXJyeSBoYXMgZ2VuZXJvdXNseSBnaXZlbiBwZXJtaXNzaW9uIHRvIGFkYXB0IGhpcyBjb2RlIGZvciBpbmNsdXNpb24KICogaW50byBqcVBsb3QuCiAqCiAqIExhcnJ5J3Mgb3JpZ2luYWwgY29kZSBjYW4gYmUgZm91bmQgaGVyZToKICoKICogaHR0cHM6Ly9naXRodWIuY29tL2xzaWRlbi9leHBvcnQtanFwbG90LXRvLXBuZwogKiAKICogCiAqLwooZnVuY3Rpb24oaCl7aC5qcXBsb3QuRGF0ZUF4aXNSZW5kZXJlcj1mdW5jdGlvbigpe2guanFwbG90LkxpbmVhckF4aXNSZW5kZXJlci5jYWxsKHRoaXMpO3RoaXMuZGF0ZT1uZXcgaC5qc0RhdGUoKX07dmFyIGM9MTAwMDt2YXIgZT02MCpjO3ZhciBmPTYwKmU7dmFyIGw9MjQqZjt2YXIgYj03Kmw7dmFyIGo9MzAuNDM2ODQ5OSpsO3ZhciBrPTM2NS4yNDIxOTkqbDt2YXIgZz1bMzEsMjgsMzEsMzAsMzEsMzAsMzEsMzAsMzEsMzAsMzEsMzBdO3ZhciBpPVsiJU06JVMuJSNOIiwiJU06JVMuJSNOIiwiJU06JVMuJSNOIiwiJU06JVMiLCIlTTolUyIsIiVNOiVTIiwiJU06JVMiLCIlSDolTTolUyIsIiVIOiVNOiVTIiwiJUg6JU0iLCIlSDolTSIsIiVIOiVNIiwiJUg6JU0iLCIlSDolTSIsIiVIOiVNIiwiJWEgJUg6JU0iLCIlYSAlSDolTSIsIiViICVlICVIOiVNIiwiJWIgJWUgJUg6JU0iLCIlYiAlZSAlSDolTSIsIiViICVlICVIOiVNIiwiJXYiLCIldiIsIiV2IiwiJXYiLCIldiIsIiV2IiwiJXYiXTt2YXIgbT1bMC4xKmMsMC4yKmMsMC41KmMsYywyKmMsNSpjLDEwKmMsMTUqYywzMCpjLGUsMiplLDUqZSwxMCplLDE1KmUsMzAqZSxmLDIqZiw0KmYsNipmLDgqZiwxMipmLGwsMipsLDMqbCw0KmwsNSpsLGIsMipiXTt2YXIgZD1bXTtmdW5jdGlvbiBhKHAscyx0KXt2YXIgbz1OdW1iZXIuTUFYX1ZBTFVFO3ZhciB1LHIsdjtmb3IodmFyIHE9MCxuPW0ubGVuZ3RoO3E8bjtxKyspe3U9TWF0aC5hYnModC1tW3FdKTtpZih1PG8pe289dTtyPW1bcV07dj1pW3FdfX1yZXR1cm5bcix2XX1oLmpxcGxvdC5EYXRlQXhpc1JlbmRlcmVyLnByb3RvdHlwZT1uZXcgaC5qcXBsb3QuTGluZWFyQXhpc1JlbmRlcmVyKCk7aC5qcXBsb3QuRGF0ZUF4aXNSZW5kZXJlci5wcm90b3R5cGUuY29uc3RydWN0b3I9aC5qcXBsb3QuRGF0ZUF4aXNSZW5kZXJlcjtoLmpxcGxvdC5EYXRlVGlja0Zvcm1hdHRlcj1mdW5jdGlvbihuLG8pe2lmKCFuKXtuPSIlWS8lbS8lZCJ9cmV0dXJuIGguanNEYXRlLnN0cmZ0aW1lKG8sbil9O2guanFwbG90LkRhdGVBeGlzUmVuZGVyZXIucHJvdG90eXBlLmluaXQ9ZnVuY3Rpb24oRSl7dGhpcy50aWNrT3B0aW9ucy5mb3JtYXR0ZXI9aC5qcXBsb3QuRGF0ZVRpY2tGb3JtYXR0ZXI7dGhpcy50aWNrSW5zZXQ9MDt0aGlzLmRyYXdCYXNlbGluZT10cnVlO3RoaXMuYmFzZWxpbmVXaWR0aD1udWxsO3RoaXMuYmFzZWxpbmVDb2xvcj1udWxsO3RoaXMuZGFUaWNrSW50ZXJ2YWw9bnVsbDt0aGlzLl9kYVRpY2tJbnRlcnZhbD1udWxsO2guZXh0ZW5kKHRydWUsdGhpcyxFKTt2YXIgQz10aGlzLl9kYXRhQm91bmRzLHUseCxELHksQSx6LG87Zm9yKHZhciB0PTA7dDx0aGlzLl9zZXJpZXMubGVuZ3RoO3QrKyl7dT17aW50ZXJ2YWxzOltdLGZyZXF1ZW5jaWVzOnt9LHNvcnRlZEludGVydmFsczpbXSxtaW46bnVsbCxtYXg6bnVsbCxtZWFuOm51bGx9O3g9MDtEPXRoaXMuX3Nlcmllc1t0XTt5PUQuZGF0YTtBPUQuX3Bsb3REYXRhO3o9RC5fc3RhY2tEYXRhO289MDtmb3IodmFyIHI9MDtyPHkubGVuZ3RoO3IrKyl7aWYodGhpcy5uYW1lPT0ieGF4aXMifHx0aGlzLm5hbWU9PSJ4MmF4aXMiKXt5W3JdWzBdPW5ldyBoLmpzRGF0ZSh5W3JdWzBdKS5nZXRUaW1lKCk7QVtyXVswXT1uZXcgaC5qc0RhdGUoeVtyXVswXSkuZ2V0VGltZSgpO3pbcl1bMF09bmV3IGguanNEYXRlKHlbcl1bMF0pLmdldFRpbWUoKTtpZigoeVtyXVswXSE9bnVsbCYmeVtyXVswXTxDLm1pbil8fEMubWluPT1udWxsKXtDLm1pbj15W3JdWzBdfWlmKCh5W3JdWzBdIT1udWxsJiZ5W3JdWzBdPkMubWF4KXx8Qy5tYXg9PW51bGwpe0MubWF4PXlbcl1bMF19aWYocj4wKXtvPU1hdGguYWJzKHlbcl1bMF0teVtyLTFdWzBdKTt1LmludGVydmFscy5wdXNoKG8pO2lmKHUuZnJlcXVlbmNpZXMuaGFzT3duUHJvcGVydHkobykpe3UuZnJlcXVlbmNpZXNbb10rPTF9ZWxzZXt1LmZyZXF1ZW5jaWVzW29dPTF9fXgrPW99ZWxzZXt5W3JdWzFdPW5ldyBoLmpzRGF0ZSh5W3JdWzFdKS5nZXRUaW1lKCk7QVtyXVsxXT1uZXcgaC5qc0RhdGUoeVtyXVsxXSkuZ2V0VGltZSgpO3pbcl1bMV09bmV3IGguanNEYXRlKHlbcl1bMV0pLmdldFRpbWUoKTtpZigoeVtyXVsxXSE9bnVsbCYmeVtyXVsxXTxDLm1pbil8fEMubWluPT1udWxsKXtDLm1pbj15W3JdWzFdfWlmKCh5W3JdWzFdIT1udWxsJiZ5W3JdWzFdPkMubWF4KXx8Qy5tYXg9PW51bGwpe0MubWF4PXlbcl1bMV19aWYocj4wKXtvPU1hdGguYWJzKHlbcl1bMV0teVtyLTFdWzFdKTt1LmludGVydmFscy5wdXNoKG8pO2lmKHUuZnJlcXVlbmNpZXMuaGFzT3duUHJvcGVydHkobykpe3UuZnJlcXVlbmNpZXNbb10rPTF9ZWxzZXt1LmZyZXF1ZW5jaWVzW29dPTF9fX14Kz1vfWlmKEQucmVuZGVyZXIuYmFuZHMpe2lmKEQucmVuZGVyZXIuYmFuZHMuaGlEYXRhLmxlbmd0aCl7dmFyIHc9RC5yZW5kZXJlci5iYW5kcy5oaURhdGE7Zm9yKHZhciByPTAscT13Lmxlbmd0aDtyPHE7cisrKXtpZih0aGlzLm5hbWU9PT0ieGF4aXMifHx0aGlzLm5hbWU9PT0ieDJheGlzIil7d1tyXVswXT1uZXcgaC5qc0RhdGUod1tyXVswXSkuZ2V0VGltZSgpO2lmKCh3W3JdWzBdIT1udWxsJiZ3W3JdWzBdPkMubWF4KXx8Qy5tYXg9PW51bGwpe0MubWF4PXdbcl1bMF19fWVsc2V7d1tyXVsxXT1uZXcgaC5qc0RhdGUod1tyXVsxXSkuZ2V0VGltZSgpO2lmKCh3W3JdWzFdIT1udWxsJiZ3W3JdWzFdPkMubWF4KXx8Qy5tYXg9PW51bGwpe0MubWF4PXdbcl1bMV19fX19aWYoRC5yZW5kZXJlci5iYW5kcy5sb3dEYXRhLmxlbmd0aCl7dmFyIHc9RC5yZW5kZXJlci5iYW5kcy5sb3dEYXRhO2Zvcih2YXIgcj0wLHE9dy5sZW5ndGg7cjxxO3IrKyl7aWYodGhpcy5uYW1lPT09InhheGlzInx8dGhpcy5uYW1lPT09IngyYXhpcyIpe3dbcl1bMF09bmV3IGguanNEYXRlKHdbcl1bMF0pLmdldFRpbWUoKTtpZigod1tyXVswXSE9bnVsbCYmd1tyXVswXTxDLm1pbil8fEMubWluPT1udWxsKXtDLm1pbj13W3JdWzBdfX1lbHNle3dbcl1bMV09bmV3IGguanNEYXRlKHdbcl1bMV0pLmdldFRpbWUoKTtpZigod1tyXVsxXSE9bnVsbCYmd1tyXVsxXTxDLm1pbil8fEMubWluPT1udWxsKXtDLm1pbj13W3JdWzFdfX19fX12YXIgQj0wLHY9MDtmb3IodmFyIHAgaW4gdS5mcmVxdWVuY2llcyl7dS5zb3J0ZWRJbnRlcnZhbHMucHVzaCh7aW50ZXJ2YWw6cCxmcmVxdWVuY3k6dS5mcmVxdWVuY2llc1twXX0pfXUuc29ydGVkSW50ZXJ2YWxzLnNvcnQoZnVuY3Rpb24ocyxuKXtyZXR1cm4gbi5mcmVxdWVuY3ktcy5mcmVxdWVuY3l9KTt1Lm1pbj1oLmpxcGxvdC5hcnJheU1pbih1LmludGVydmFscyk7dS5tYXg9aC5qcXBsb3QuYXJyYXlNYXgodS5pbnRlcnZhbHMpO3UubWVhbj14L3kubGVuZ3RoO3RoaXMuX2ludGVydmFsU3RhdHMucHVzaCh1KTt1PXg9RD15PUE9ej1udWxsfUM9bnVsbH07aC5qcXBsb3QuRGF0ZUF4aXNSZW5kZXJlci5wcm90b3R5cGUucmVzZXQ9ZnVuY3Rpb24oKXt0aGlzLm1pbj10aGlzLl9vcHRpb25zLm1pbjt0aGlzLm1heD10aGlzLl9vcHRpb25zLm1heDt0aGlzLnRpY2tJbnRlcnZhbD10aGlzLl9vcHRpb25zLnRpY2tJbnRlcnZhbDt0aGlzLm51bWJlclRpY2tzPXRoaXMuX29wdGlvbnMubnVtYmVyVGlja3M7dGhpcy5fYXV0b0Zvcm1hdFN0cmluZz0iIjtpZih0aGlzLl9vdmVycmlkZUZvcm1hdFN0cmluZyYmdGhpcy50aWNrT3B0aW9ucyYmdGhpcy50aWNrT3B0aW9ucy5mb3JtYXRTdHJpbmcpe3RoaXMudGlja09wdGlvbnMuZm9ybWF0U3RyaW5nPSIifXRoaXMuZGFUaWNrSW50ZXJ2YWw9dGhpcy5fZGFUaWNrSW50ZXJ2YWx9O2guanFwbG90LkRhdGVBeGlzUmVuZGVyZXIucHJvdG90eXBlLmNyZWF0ZVRpY2tzPWZ1bmN0aW9uKHApe3ZhciBVPXRoaXMuX3RpY2tzO3ZhciBKPXRoaXMudGlja3M7dmFyIEU9dGhpcy5uYW1lO3ZhciBHPXRoaXMuX2RhdGFCb3VuZHM7dmFyIEw9dGhpcy5faW50ZXJ2YWxTdGF0czt2YXIgbj0odGhpcy5uYW1lLmNoYXJBdCgwKT09PSJ4Iik/dGhpcy5fcGxvdERpbWVuc2lvbnMud2lkdGg6dGhpcy5fcGxvdERpbWVuc2lvbnMuaGVpZ2h0O3ZhciB3O3ZhciBhYixJO3ZhciB5LHg7dmFyIGFhLFg7dmFyIHM9MzA7dmFyIE49MTt2YXIgdj10aGlzLnRpY2tJbnRlcnZhbDthYj0oKHRoaXMubWluIT1udWxsKT9uZXcgaC5qc0RhdGUodGhpcy5taW4pLmdldFRpbWUoKTpHLm1pbik7ST0oKHRoaXMubWF4IT1udWxsKT9uZXcgaC5qc0RhdGUodGhpcy5tYXgpLmdldFRpbWUoKTpHLm1heCk7dmFyIEE9cC5wbHVnaW5zLmN1cnNvcjtpZihBJiZBLl96b29tJiZBLl96b29tLnpvb21pbmcpe3RoaXMubWluPW51bGw7dGhpcy5tYXg9bnVsbH12YXIgQj1JLWFiO2lmKHRoaXMudGlja09wdGlvbnM9PW51bGx8fCF0aGlzLnRpY2tPcHRpb25zLmZvcm1hdFN0cmluZyl7dGhpcy5fb3ZlcnJpZGVGb3JtYXRTdHJpbmc9dHJ1ZX1pZihKLmxlbmd0aCl7Zm9yKFg9MDtYPEoubGVuZ3RoO1grKyl7dmFyIE89SltYXTt2YXIgVj1uZXcgdGhpcy50aWNrUmVuZGVyZXIodGhpcy50aWNrT3B0aW9ucyk7aWYoTy5jb25zdHJ1Y3Rvcj09QXJyYXkpe1YudmFsdWU9bmV3IGguanNEYXRlKE9bMF0pLmdldFRpbWUoKTtWLmxhYmVsPU9bMV07aWYoIXRoaXMuc2hvd1RpY2tzKXtWLnNob3dMYWJlbD1mYWxzZTtWLnNob3dNYXJrPWZhbHNlfWVsc2V7aWYoIXRoaXMuc2hvd1RpY2tNYXJrcyl7Vi5zaG93TWFyaz1mYWxzZX19Vi5zZXRUaWNrKFYudmFsdWUsdGhpcy5uYW1lKTt0aGlzLl90aWNrcy5wdXNoKFYpfWVsc2V7Vi52YWx1ZT1uZXcgaC5qc0RhdGUoTykuZ2V0VGltZSgpO2lmKCF0aGlzLnNob3dUaWNrcyl7Vi5zaG93TGFiZWw9ZmFsc2U7Vi5zaG93TWFyaz1mYWxzZX1lbHNle2lmKCF0aGlzLnNob3dUaWNrTWFya3Mpe1Yuc2hvd01hcms9ZmFsc2V9fVYuc2V0VGljayhWLnZhbHVlLHRoaXMubmFtZSk7dGhpcy5fdGlja3MucHVzaChWKX19dGhpcy5udW1iZXJUaWNrcz1KLmxlbmd0aDt0aGlzLm1pbj10aGlzLl90aWNrc1swXS52YWx1ZTt0aGlzLm1heD10aGlzLl90aWNrc1t0aGlzLm51bWJlclRpY2tzLTFdLnZhbHVlO3RoaXMuZGFUaWNrSW50ZXJ2YWw9Wyh0aGlzLm1heC10aGlzLm1pbikvKHRoaXMubnVtYmVyVGlja3MtMSkvMTAwMCwic2Vjb25kcyJdfWVsc2V7aWYodGhpcy5taW49PW51bGwmJnRoaXMubWF4PT1udWxsKXt2YXIgTT1oLmV4dGVuZCh0cnVlLHt9LHRoaXMudGlja09wdGlvbnMse25hbWU6dGhpcy5uYW1lLHZhbHVlOm51bGx9KTt2YXIgWSxIO2lmKCF0aGlzLnRpY2tJbnRlcnZhbCYmIXRoaXMubnVtYmVyVGlja3Mpe3ZhciBRPU1hdGgubWF4KG4scysxKTt2YXIgVz0xMTU7aWYodGhpcy50aWNrUmVuZGVyZXI9PT1oLmpxcGxvdC5DYW52YXNBeGlzVGlja1JlbmRlcmVyJiZ0aGlzLnRpY2tPcHRpb25zLmFuZ2xlKXtXPTExNS00MCpNYXRoLmFicyhNYXRoLnNpbih0aGlzLnRpY2tPcHRpb25zLmFuZ2xlLzE4MCpNYXRoLlBJKSl9WT1NYXRoLmNlaWwoKFEtcykvVysxKTtIPShJLWFiKS8oWS0xKX1lbHNle2lmKHRoaXMudGlja0ludGVydmFsKXtIPXRoaXMudGlja0ludGVydmFsfWVsc2V7aWYodGhpcy5udW1iZXJUaWNrcyl7WT10aGlzLm51bWJlclRpY2tzO0g9KEktYWIpLyhZLTEpfX19aWYoSDw9MTkqbCl7dmFyIFA9YShhYixJLEgpO3ZhciByPVBbMF07dGhpcy5fYXV0b0Zvcm1hdFN0cmluZz1QWzFdO2FiPU1hdGguZmxvb3IoYWIvcikqcjthYj1uZXcgaC5qc0RhdGUoYWIpO2FiPWFiLmdldFRpbWUoKSthYi5nZXRVdGNPZmZzZXQoKTtZPU1hdGguY2VpbCgoSS1hYikvcikrMTt0aGlzLm1pbj1hYjt0aGlzLm1heD1hYisoWS0xKSpyO2lmKHRoaXMubWF4PEkpe3RoaXMubWF4Kz1yO1krPTF9dGhpcy50aWNrSW50ZXJ2YWw9cjt0aGlzLm51bWJlclRpY2tzPVk7Zm9yKHZhciBYPTA7WDxZO1grKyl7TS52YWx1ZT10aGlzLm1pbitYKnI7Vj1uZXcgdGhpcy50aWNrUmVuZGVyZXIoTSk7aWYodGhpcy5fb3ZlcnJpZGVGb3JtYXRTdHJpbmcmJnRoaXMuX2F1dG9Gb3JtYXRTdHJpbmchPSIiKXtWLmZvcm1hdFN0cmluZz10aGlzLl9hdXRvRm9ybWF0U3RyaW5nfWlmKCF0aGlzLnNob3dUaWNrcyl7Vi5zaG93TGFiZWw9ZmFsc2U7Vi5zaG93TWFyaz1mYWxzZX1lbHNle2lmKCF0aGlzLnNob3dUaWNrTWFya3Mpe1Yuc2hvd01hcms9ZmFsc2V9fXRoaXMuX3RpY2tzLnB1c2goVil9Tj10aGlzLnRpY2tJbnRlcnZhbH1lbHNle2lmKEg8PTkqail7dGhpcy5fYXV0b0Zvcm1hdFN0cmluZz0iJXYiO3ZhciBEPU1hdGgucm91bmQoSC9qKTtpZihEPDEpe0Q9MX1lbHNle2lmKEQ+Nil7RD02fX12YXIgUz1uZXcgaC5qc0RhdGUoYWIpLnNldERhdGUoMSkuc2V0SG91cnMoMCwwLDAsMCk7dmFyIHE9bmV3IGguanNEYXRlKEkpO3ZhciB6PW5ldyBoLmpzRGF0ZShJKS5zZXREYXRlKDEpLnNldEhvdXJzKDAsMCwwLDApO2lmKHEuZ2V0VGltZSgpIT09ei5nZXRUaW1lKCkpe3o9ei5hZGQoMSwibW9udGgiKX12YXIgUj16LmRpZmYoUywibW9udGgiKTtZPU1hdGguY2VpbChSL0QpKzE7dGhpcy5taW49Uy5nZXRUaW1lKCk7dGhpcy5tYXg9Uy5jbG9uZSgpLmFkZCgoWS0xKSpELCJtb250aCIpLmdldFRpbWUoKTt0aGlzLm51bWJlclRpY2tzPVk7Zm9yKHZhciBYPTA7WDxZO1grKyl7aWYoWD09PTApe00udmFsdWU9Uy5nZXRUaW1lKCl9ZWxzZXtNLnZhbHVlPVMuYWRkKEQsIm1vbnRoIikuZ2V0VGltZSgpfVY9bmV3IHRoaXMudGlja1JlbmRlcmVyKE0pO2lmKHRoaXMuX292ZXJyaWRlRm9ybWF0U3RyaW5nJiZ0aGlzLl9hdXRvRm9ybWF0U3RyaW5nIT0iIil7Vi5mb3JtYXRTdHJpbmc9dGhpcy5fYXV0b0Zvcm1hdFN0cmluZ31pZighdGhpcy5zaG93VGlja3Mpe1Yuc2hvd0xhYmVsPWZhbHNlO1Yuc2hvd01hcms9ZmFsc2V9ZWxzZXtpZighdGhpcy5zaG93VGlja01hcmtzKXtWLnNob3dNYXJrPWZhbHNlfX10aGlzLl90aWNrcy5wdXNoKFYpfU49RCpqfWVsc2V7dGhpcy5fYXV0b0Zvcm1hdFN0cmluZz0iJXYiO3ZhciBEPU1hdGgucm91bmQoSC9rKTtpZihEPDEpe0Q9MX12YXIgUz1uZXcgaC5qc0RhdGUoYWIpLnNldE1vbnRoKDAsMSkuc2V0SG91cnMoMCwwLDAsMCk7dmFyIHo9bmV3IGguanNEYXRlKEkpLmFkZCgxLCJ5ZWFyIikuc2V0TW9udGgoMCwxKS5zZXRIb3VycygwLDAsMCwwKTt2YXIgSz16LmRpZmYoUywieWVhciIpO1k9TWF0aC5jZWlsKEsvRCkrMTt0aGlzLm1pbj1TLmdldFRpbWUoKTt0aGlzLm1heD1TLmNsb25lKCkuYWRkKChZLTEpKkQsInllYXIiKS5nZXRUaW1lKCk7dGhpcy5udW1iZXJUaWNrcz1ZO2Zvcih2YXIgWD0wO1g8WTtYKyspe2lmKFg9PT0wKXtNLnZhbHVlPVMuZ2V0VGltZSgpfWVsc2V7TS52YWx1ZT1TLmFkZChELCJ5ZWFyIikuZ2V0VGltZSgpfVY9bmV3IHRoaXMudGlja1JlbmRlcmVyKE0pO2lmKHRoaXMuX292ZXJyaWRlRm9ybWF0U3RyaW5nJiZ0aGlzLl9hdXRvRm9ybWF0U3RyaW5nIT0iIil7Vi5mb3JtYXRTdHJpbmc9dGhpcy5fYXV0b0Zvcm1hdFN0cmluZ31pZighdGhpcy5zaG93VGlja3Mpe1Yuc2hvd0xhYmVsPWZhbHNlO1Yuc2hvd01hcms9ZmFsc2V9ZWxzZXtpZighdGhpcy5zaG93VGlja01hcmtzKXtWLnNob3dNYXJrPWZhbHNlfX10aGlzLl90aWNrcy5wdXNoKFYpfU49RCprfX19ZWxzZXtpZihFPT0ieGF4aXMifHxFPT0ieDJheGlzIil7bj10aGlzLl9wbG90RGltZW5zaW9ucy53aWR0aH1lbHNle249dGhpcy5fcGxvdERpbWVuc2lvbnMuaGVpZ2h0fWlmKHRoaXMubWluIT1udWxsJiZ0aGlzLm1heCE9bnVsbCYmdGhpcy5udW1iZXJUaWNrcyE9bnVsbCl7dGhpcy50aWNrSW50ZXJ2YWw9bnVsbH1pZih0aGlzLnRpY2tJbnRlcnZhbCE9bnVsbCl7aWYoTnVtYmVyKHRoaXMudGlja0ludGVydmFsKSl7dGhpcy5kYVRpY2tJbnRlcnZhbD1bTnVtYmVyKHRoaXMudGlja0ludGVydmFsKSwic2Vjb25kcyJdfWVsc2V7aWYodHlwZW9mIHRoaXMudGlja0ludGVydmFsPT0ic3RyaW5nIil7dmFyIFo9dGhpcy50aWNrSW50ZXJ2YWwuc3BsaXQoIiAiKTtpZihaLmxlbmd0aD09MSl7dGhpcy5kYVRpY2tJbnRlcnZhbD1bMSxaWzBdXX1lbHNle2lmKFoubGVuZ3RoPT0yKXt0aGlzLmRhVGlja0ludGVydmFsPVtaWzBdLFpbMV1dfX19fX1pZihhYj09SSl7dmFyIG89MjQqNjAqNjAqNTAwO2FiLT1vO0krPW99Qj1JLWFiO3ZhciBGPTIrcGFyc2VJbnQoTWF0aC5tYXgoMCxuLTEwMCkvMTAwLDEwKTt2YXIgVCxDO1Q9KHRoaXMubWluIT1udWxsKT9uZXcgaC5qc0RhdGUodGhpcy5taW4pLmdldFRpbWUoKTphYi1CLzIqKHRoaXMucGFkTWluLTEpO0M9KHRoaXMubWF4IT1udWxsKT9uZXcgaC5qc0RhdGUodGhpcy5tYXgpLmdldFRpbWUoKTpJK0IvMioodGhpcy5wYWRNYXgtMSk7dGhpcy5taW49VDt0aGlzLm1heD1DO0I9dGhpcy5tYXgtdGhpcy5taW47aWYodGhpcy5udW1iZXJUaWNrcz09bnVsbCl7aWYodGhpcy5kYVRpY2tJbnRlcnZhbCE9bnVsbCl7dmFyIHU9bmV3IGguanNEYXRlKHRoaXMubWF4KS5kaWZmKHRoaXMubWluLHRoaXMuZGFUaWNrSW50ZXJ2YWxbMV0sdHJ1ZSk7dGhpcy5udW1iZXJUaWNrcz1NYXRoLmNlaWwodS90aGlzLmRhVGlja0ludGVydmFsWzBdKSsxO3RoaXMubWF4PW5ldyBoLmpzRGF0ZSh0aGlzLm1pbikuYWRkKCh0aGlzLm51bWJlclRpY2tzLTEpKnRoaXMuZGFUaWNrSW50ZXJ2YWxbMF0sdGhpcy5kYVRpY2tJbnRlcnZhbFsxXSkuZ2V0VGltZSgpfWVsc2V7aWYobj4yMDApe3RoaXMubnVtYmVyVGlja3M9cGFyc2VJbnQoMysobi0yMDApLzEwMCwxMCl9ZWxzZXt0aGlzLm51bWJlclRpY2tzPTJ9fX1OPUIvKHRoaXMubnVtYmVyVGlja3MtMSkvMTAwMDtpZih0aGlzLmRhVGlja0ludGVydmFsPT1udWxsKXt0aGlzLmRhVGlja0ludGVydmFsPVtOLCJzZWNvbmRzIl19Zm9yKHZhciBYPTA7WDx0aGlzLm51bWJlclRpY2tzO1grKyl7dmFyIGFiPW5ldyBoLmpzRGF0ZSh0aGlzLm1pbik7YWE9YWIuYWRkKFgqdGhpcy5kYVRpY2tJbnRlcnZhbFswXSx0aGlzLmRhVGlja0ludGVydmFsWzFdKS5nZXRUaW1lKCk7dmFyIFY9bmV3IHRoaXMudGlja1JlbmRlcmVyKHRoaXMudGlja09wdGlvbnMpO2lmKCF0aGlzLnNob3dUaWNrcyl7Vi5zaG93TGFiZWw9ZmFsc2U7Vi5zaG93TWFyaz1mYWxzZX1lbHNle2lmKCF0aGlzLnNob3dUaWNrTWFya3Mpe1Yuc2hvd01hcms9ZmFsc2V9fVYuc2V0VGljayhhYSx0aGlzLm5hbWUpO3RoaXMuX3RpY2tzLnB1c2goVil9fX1pZih0aGlzLnRpY2tJbnNldCl7dGhpcy5taW49dGhpcy5taW4tdGhpcy50aWNrSW5zZXQqTjt0aGlzLm1heD10aGlzLm1heCt0aGlzLnRpY2tJbnNldCpOfWlmKHRoaXMuX2RhVGlja0ludGVydmFsPT1udWxsKXt0aGlzLl9kYVRpY2tJbnRlcnZhbD10aGlzLmRhVGlja0ludGVydmFsfVU9bnVsbH19KShqUXVlcnkpOw==]]></data>
	</file>
	<file>
	  <filename>/src/plugins/jqplot.donutRenderer.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqCiAqIGpxUGxvdAogKiBQdXJlIEphdmFTY3JpcHQgcGxvdHRpbmcgcGx1Z2luIHVzaW5nIGpRdWVyeQogKgogKiBWZXJzaW9uOiAxLjAuMGIyX3IxMDEyCiAqCiAqIENvcHlyaWdodCAoYykgMjAwOS0yMDExIENocmlzIExlb25lbGxvCiAqIGpxUGxvdCBpcyBjdXJyZW50bHkgYXZhaWxhYmxlIGZvciB1c2UgaW4gYWxsIHBlcnNvbmFsIG9yIGNvbW1lcmNpYWwgcHJvamVjdHMgCiAqIHVuZGVyIGJvdGggdGhlIE1JVCAoaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHApIGFuZCBHUEwgCiAqIHZlcnNpb24gMi4wIChodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC5odG1sKSBsaWNlbnNlcy4gVGhpcyBtZWFucyB0aGF0IHlvdSBjYW4gCiAqIGNob29zZSB0aGUgbGljZW5zZSB0aGF0IGJlc3Qgc3VpdHMgeW91ciBwcm9qZWN0IGFuZCB1c2UgaXQgYWNjb3JkaW5nbHkuIAogKgogKiBBbHRob3VnaCBub3QgcmVxdWlyZWQsIHRoZSBhdXRob3Igd291bGQgYXBwcmVjaWF0ZSBhbiBlbWFpbCBsZXR0aW5nIGhpbSAKICoga25vdyBvZiBhbnkgc3Vic3RhbnRpYWwgdXNlIG9mIGpxUGxvdC4gIFlvdSBjYW4gcmVhY2ggdGhlIGF1dGhvciBhdDogCiAqIGNocmlzIGF0IGpxcGxvdCBkb3QgY29tIG9yIHNlZSBodHRwOi8vd3d3LmpxcGxvdC5jb20vaW5mby5waHAgLgogKgogKiBJZiB5b3UgYXJlIGZlZWxpbmcga2luZCBhbmQgZ2VuZXJvdXMsIGNvbnNpZGVyIHN1cHBvcnRpbmcgdGhlIHByb2plY3QgYnkKICogbWFraW5nIGEgZG9uYXRpb24gYXQ6IGh0dHA6Ly93d3cuanFwbG90LmNvbS9kb25hdGUucGhwIC4KICoKICogc3ByaW50ZiBmdW5jdGlvbnMgY29udGFpbmVkIGluIGpxcGxvdC5zcHJpbnRmLmpzIGJ5IEFzaCBTZWFybGU6CiAqCiAqICAgICB2ZXJzaW9uIDIwMDcuMDQuMjcKICogICAgIGF1dGhvciBBc2ggU2VhcmxlCiAqICAgICBodHRwOi8vaGV4bWVuLmNvbS9ibG9nLzIwMDcvMDMvcHJpbnRmLXNwcmludGYvCiAqICAgICBodHRwOi8vaGV4bWVuLmNvbS9qcy9zcHJpbnRmLmpzCiAqICAgICBUaGUgYXV0aG9yIChBc2ggU2VhcmxlKSBoYXMgcGxhY2VkIHRoaXMgY29kZSBpbiB0aGUgcHVibGljIGRvbWFpbjoKICogICAgICJUaGlzIGNvZGUgaXMgdW5yZXN0cmljdGVkOiB5b3UgYXJlIGZyZWUgdG8gdXNlIGl0IGhvd2V2ZXIgeW91IGxpa2UuIgogKiAKICovCihmdW5jdGlvbigkKSB7CiAgICAvKioKICAgICAqIENsYXNzOiAkLmpxcGxvdC5Eb251dFJlbmRlcmVyCiAgICAgKiBQbHVnaW4gcmVuZGVyZXIgdG8gZHJhdyBhIGRvbnV0IGNoYXJ0LgogICAgICogeCB2YWx1ZXMsIGlmIHByZXNlbnQsIHdpbGwgYmUgdXNlZCBhcyBzbGljZSBsYWJlbHMuCiAgICAgKiB5IHZhbHVlcyBnaXZlIHNsaWNlIHNpemUuCiAgICAgKiAKICAgICAqIFRvIHVzZSB0aGlzIHJlbmRlcmVyLCB5b3UgbmVlZCB0byBpbmNsdWRlIHRoZSAKICAgICAqIGRvbnV0IHJlbmRlcmVyIHBsdWdpbiwgZm9yIGV4YW1wbGU6CiAgICAgKiAKICAgICAqID4gPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0icGx1Z2lucy9qcXBsb3QuZG9udXRSZW5kZXJlci5qcyI+PC9zY3JpcHQ+CiAgICAgKiAKICAgICAqIFByb3BlcnRpZXMgZGVzY3JpYmVkIGhlcmUgYXJlIHBhc3NlZCBpbnRvIHRoZSAkLmpxcGxvdCBmdW5jdGlvbgogICAgICogYXMgb3B0aW9ucyBvbiB0aGUgc2VyaWVzIHJlbmRlcmVyLiAgRm9yIGV4YW1wbGU6CiAgICAgKiAKICAgICAqID4gcGxvdDIgPSAkLmpxcGxvdCgnY2hhcnQyJywgW3MxLCBzMl0sIHsKICAgICAqID4gICAgIHNlcmllc0RlZmF1bHRzOiB7CiAgICAgKiA+ICAgICAgICAgcmVuZGVyZXI6JC5qcXBsb3QuRG9udXRSZW5kZXJlciwKICAgICAqID4gICAgICAgICByZW5kZXJlck9wdGlvbnM6ewogICAgICogPiAgICAgICAgICAgICAgc2xpY2VNYXJnaW46IDIsCiAgICAgKiA+ICAgICAgICAgICAgICBpbm5lckRpYW1ldGVyOiAxMTAsCiAgICAgKiA+ICAgICAgICAgICAgICBzdGFydEFuZ2xlOiAtOTAKICAgICAqID4gICAgICAgICAgfQogICAgICogPiAgICAgIH0KICAgICAqID4gfSk7CiAgICAgKiAKICAgICAqIEEgZG9udXQgcGxvdCB3aWxsIHRyaWdnZXIgZXZlbnRzIG9uIHRoZSBwbG90IHRhcmdldAogICAgICogYWNjb3JkaW5nIHRvIHVzZXIgaW50ZXJhY3Rpb24uICBBbGwgZXZlbnRzIHJldHVybiB0aGUgZXZlbnQgb2JqZWN0LAogICAgICogdGhlIHNlcmllcyBpbmRleCwgdGhlIHBvaW50IChzbGljZSkgaW5kZXgsIGFuZCB0aGUgcG9pbnQgZGF0YSBmb3IgCiAgICAgKiB0aGUgYXBwcm9wcmlhdGUgc2xpY2UuCiAgICAgKiAKICAgICAqICdqcXBsb3REYXRhTW91c2VPdmVyJyAtIHRyaWdnZXJlZCB3aGVuIHVzZXIgbW91c2Vpbmcgb3ZlciBhIHNsaWNlLgogICAgICogJ2pxcGxvdERhdGFIaWdobGlnaHQnIC0gdHJpZ2dlcmVkIHRoZSBmaXJzdCB0aW1lIHVzZXIgbW91c2VzIG92ZXIgYSBzbGljZSwKICAgICAqIGlmIGhpZ2hsaWdodGluZyBpcyBlbmFibGVkLgogICAgICogJ2pxcGxvdERhdGFVbmhpZ2hsaWdodCcgLSB0cmlnZ2VyZWQgd2hlbiBhIHVzZXIgbW92ZXMgdGhlIG1vdXNlIG91dCBvZgogICAgICogYSBoaWdobGlnaHRlZCBzbGljZS4KICAgICAqICdqcXBsb3REYXRhQ2xpY2snIC0gdHJpZ2dlcmVkIHdoZW4gdGhlIHVzZXIgY2xpY2tzIG9uIGEgc2xpY2UuCiAgICAgKiAnanFwbG90RGF0YVJpZ2h0Q2xpY2snIC0gdGlnZ2VyZWQgd2hlbiB0aGUgdXNlciByaWdodCBjbGlja3Mgb24gYSBzbGljZSBpZgogICAgICogdGhlICJjYXB0dXJlUmlnaHRDbGljayIgb3B0aW9uIGlzIHNldCB0byB0cnVlIG9uIHRoZSBwbG90LgogICAgICovCiAgICAkLmpxcGxvdC5Eb251dFJlbmRlcmVyID0gZnVuY3Rpb24oKXsKICAgICAgICAkLmpxcGxvdC5MaW5lUmVuZGVyZXIuY2FsbCh0aGlzKTsKICAgIH07CiAgICAKICAgICQuanFwbG90LkRvbnV0UmVuZGVyZXIucHJvdG90eXBlID0gbmV3ICQuanFwbG90LkxpbmVSZW5kZXJlcigpOwogICAgJC5qcXBsb3QuRG9udXRSZW5kZXJlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSAkLmpxcGxvdC5Eb251dFJlbmRlcmVyOwogICAgCiAgICAvLyBjYWxsZWQgd2l0aCBzY29wZSBvZiBhIHNlcmllcwogICAgJC5qcXBsb3QuRG9udXRSZW5kZXJlci5wcm90b3R5cGUuaW5pdCA9IGZ1bmN0aW9uKG9wdGlvbnMsIHBsb3QpIHsKICAgICAgICAvLyBHcm91cDogUHJvcGVydGllcwogICAgICAgIC8vCiAgICAgICAgLy8gcHJvcDogZGlhbWV0ZXIKICAgICAgICAvLyBPdXRlciBkaWFtZXRlciBvZiB0aGUgZG9udXQsIGF1dG8gY29tcHV0ZWQgYnkgZGVmYXVsdAogICAgICAgIHRoaXMuZGlhbWV0ZXIgPSBudWxsOwogICAgICAgIC8vIHByb3A6IGlubmVyRGlhbWV0ZXIKICAgICAgICAvLyBJbm5lciBkaWFtZXRlciBvZiB0aGUgZG9udXQsIGF1dG8gY2FsY3VsYXRlZCBieSBkZWZhdWx0LgogICAgICAgIC8vIElmIHNwZWNpZmllZCB3aWxsIG92ZXJyaWRlIHRoaWNrbmVzcyB2YWx1ZS4KICAgICAgICB0aGlzLmlubmVyRGlhbWV0ZXIgPSBudWxsOwogICAgICAgIC8vIHByb3A6IHRoaWNrbmVzcwogICAgICAgIC8vIHRoaWNrbmVzcyBvZiB0aGUgZG9udXQsIGF1dG8gY29tcHV0ZWQgYnkgZGVmYXVsdAogICAgICAgIC8vIE92ZXJyaWRkZW4gYnkgaWYgaW5uZXJEaWFtZXRlciBpcyBzcGVjaWZpZWQuCiAgICAgICAgdGhpcy50aGlja25lc3MgPSBudWxsOwogICAgICAgIC8vIHByb3A6IHBhZGRpbmcKICAgICAgICAvLyBwYWRkaW5nIGJldHdlZW4gdGhlIGRvbnV0IGFuZCBwbG90IGVkZ2VzLCBsZWdlbmQsIGV0Yy4KICAgICAgICB0aGlzLnBhZGRpbmcgPSAyMDsKICAgICAgICAvLyBwcm9wOiBzbGljZU1hcmdpbgogICAgICAgIC8vIGFuZ3VsYXIgc3BhY2luZyBiZXR3ZWVuIGRvbnV0IHNsaWNlcyBpbiBkZWdyZWVzLgogICAgICAgIHRoaXMuc2xpY2VNYXJnaW4gPSAwOwogICAgICAgIC8vIHByb3A6IHJpbmdNYXJnaW4KICAgICAgICAvLyBwaXhlbCBkaXN0YW5jZSBiZXR3ZWVuIHJpbmdzLCBvciBtdWx0aXBsZSBzZXJpZXMgaW4gYSBkb251dCBwbG90LgogICAgICAgIC8vIG51bGwgd2lsbCBjb21wdXRlIHJpbmdNYXJnaW4gYmFzZWQgb24gc2xpY2VNYXJnaW4uCiAgICAgICAgdGhpcy5yaW5nTWFyZ2luID0gbnVsbDsKICAgICAgICAvLyBwcm9wOiBmaWxsCiAgICAgICAgLy8gdHJ1ZSBvciBmYWxzZSwgd2V0aGVyIHRvIGZpbCB0aGUgc2xpY2VzLgogICAgICAgIHRoaXMuZmlsbCA9IHRydWU7CiAgICAgICAgLy8gcHJvcDogc2hhZG93T2Zmc2V0CiAgICAgICAgLy8gb2Zmc2V0IG9mIHRoZSBzaGFkb3cgZnJvbSB0aGUgc2xpY2UgYW5kIG9mZnNldCBvZiAKICAgICAgICAvLyBlYWNoIHN1Y2Nlc2l2ZSBzdHJva2Ugb2YgdGhlIHNoYWRvdyBmcm9tIHRoZSBsYXN0LgogICAgICAgIHRoaXMuc2hhZG93T2Zmc2V0ID0gMjsKICAgICAgICAvLyBwcm9wOiBzaGFkb3dBbHBoYQogICAgICAgIC8vIHRyYW5zcGFyZW5jeSBvZiB0aGUgc2hhZG93ICgwID0gdHJhbnNwYXJlbnQsIDEgPSBvcGFxdWUpCiAgICAgICAgdGhpcy5zaGFkb3dBbHBoYSA9IDAuMDc7CiAgICAgICAgLy8gcHJvcDogc2hhZG93RGVwdGgKICAgICAgICAvLyBudW1iZXIgb2Ygc3Ryb2tlcyB0byBhcHBseSB0byB0aGUgc2hhZG93LCAKICAgICAgICAvLyBlYWNoIHN0cm9rZSBvZmZzZXQgc2hhZG93T2Zmc2V0IGZyb20gdGhlIGxhc3QuCiAgICAgICAgdGhpcy5zaGFkb3dEZXB0aCA9IDU7CiAgICAgICAgLy8gcHJvcDogaGlnaGxpZ2h0TW91c2VPdmVyCiAgICAgICAgLy8gVHJ1ZSB0byBoaWdobGlnaHQgc2xpY2Ugd2hlbiBtb3VzZWQgb3Zlci4KICAgICAgICAvLyBUaGlzIG11c3QgYmUgZmFsc2UgdG8gZW5hYmxlIGhpZ2hsaWdodE1vdXNlRG93biB0byBoaWdobGlnaHQgd2hlbiBjbGlja2luZyBvbiBhIHNsaWNlLgogICAgICAgIHRoaXMuaGlnaGxpZ2h0TW91c2VPdmVyID0gdHJ1ZTsKICAgICAgICAvLyBwcm9wOiBoaWdobGlnaHRNb3VzZURvd24KICAgICAgICAvLyBUcnVlIHRvIGhpZ2hsaWdodCB3aGVuIGEgbW91c2UgYnV0dG9uIGlzIHByZXNzZWQgb3ZlciBhIHNsaWNlLgogICAgICAgIC8vIFRoaXMgd2lsbCBiZSBkaXNhYmxlZCBpZiBoaWdobGlnaHRNb3VzZU92ZXIgaXMgdHJ1ZS4KICAgICAgICB0aGlzLmhpZ2hsaWdodE1vdXNlRG93biA9IGZhbHNlOwogICAgICAgIC8vIHByb3A6IGhpZ2hsaWdodENvbG9ycwogICAgICAgIC8vIGFuIGFycmF5IG9mIGNvbG9ycyB0byB1c2Ugd2hlbiBoaWdobGlnaHRpbmcgYSBzbGljZS4KICAgICAgICB0aGlzLmhpZ2hsaWdodENvbG9ycyA9IFtdOwogICAgICAgIC8vIHByb3A6IGRhdGFMYWJlbHMKICAgICAgICAvLyBFaXRoZXIgJ2xhYmVsJywgJ3ZhbHVlJywgJ3BlcmNlbnQnIG9yIGFuIGFycmF5IG9mIGxhYmVscyB0byBwbGFjZSBvbiB0aGUgcGllIHNsaWNlcy4KICAgICAgICAvLyBEZWZhdWx0cyB0byBwZXJjZW50YWdlIG9mIGVhY2ggcGllIHNsaWNlLgogICAgICAgIHRoaXMuZGF0YUxhYmVscyA9ICdwZXJjZW50JzsKICAgICAgICAvLyBwcm9wOiBzaG93RGF0YUxhYmVscwogICAgICAgIC8vIHRydWUgdG8gc2hvdyBkYXRhIGxhYmVscyBvbiBzbGljZXMuCiAgICAgICAgdGhpcy5zaG93RGF0YUxhYmVscyA9IGZhbHNlOwogICAgICAgIC8vIHByb3A6IGRhdGFMYWJlbEZvcm1hdFN0cmluZwogICAgICAgIC8vIEZvcm1hdCBzdHJpbmcgZm9yIGRhdGEgbGFiZWxzLiAgSWYgbm9uZSwgJyVzJyBpcyB1c2VkIGZvciAibGFiZWwiIGFuZCBmb3IgYXJyYXlzLCAnJWQnIGZvciB2YWx1ZSBhbmQgJyVkJSUnIGZvciBwZXJjZW50YWdlLgogICAgICAgIHRoaXMuZGF0YUxhYmVsRm9ybWF0U3RyaW5nID0gbnVsbDsKICAgICAgICAvLyBwcm9wOiBkYXRhTGFiZWxUaHJlc2hvbGQKICAgICAgICAvLyBUaHJlc2hob2xkIGluIHBlcmNlbnRhZ2UgKDAgLSAxMDApIG9mIHBpZSBhcmVhLCBiZWxvdyB3aGljaCBubyBsYWJlbCB3aWxsIGJlIGRpc3BsYXllZC4KICAgICAgICAvLyBUaGlzIGFwcGxpZXMgdG8gYWxsIGxhYmVsIHR5cGVzLCBub3QganVzdCB0byBwZXJjZW50YWdlIGxhYmVscy4KICAgICAgICB0aGlzLmRhdGFMYWJlbFRocmVzaG9sZCA9IDM7CiAgICAgICAgLy8gcHJvcDogZGF0YUxhYmVsUG9zaXRpb25GYWN0b3IKICAgICAgICAvLyBBIE11bHRpcGxpZXIgKDAtMSkgb2YgdGhlIHBpZSByYWRpdXMgd2hpY2ggY29udHJvbHMgcG9zaXRpb24gb2YgbGFiZWwgb24gc2xpY2UuCiAgICAgICAgLy8gSW5jcmVhc2luZyB3aWxsIHNsaWRlIGxhYmVsIHRvd2FyZCBlZGdlIG9mIHBpZSwgZGVjcmVhc2luZyB3aWxsIHNsaWRlIGxhYmVsIHRvd2FyZCBjZW50ZXIgb2YgcGllLgogICAgICAgIHRoaXMuZGF0YUxhYmVsUG9zaXRpb25GYWN0b3IgPSAwLjQ7CiAgICAgICAgLy8gcHJvcDogZGF0YUxhYmVsTnVkZ2UKICAgICAgICAvLyBOdW1iZXIgb2YgcGl4ZWxzIHRvIHNsaWRlIHRoZSBsYWJlbCBhd2F5IGZyb20gKCspIG9yIHRvd2FyZCAoLSkgdGhlIGNlbnRlciBvZiB0aGUgcGllLgogICAgICAgIHRoaXMuZGF0YUxhYmVsTnVkZ2UgPSAwOwogICAgICAgIC8vIHByb3A6IHN0YXJ0QW5nbGUKICAgICAgICAvLyBBbmdsZSB0byBzdGFydCBkcmF3aW5nIGRvbnV0IGluIGRlZ3JlZXMuICAKICAgICAgICAvLyBBY2NvcmRpbmcgdG8gb3JpZW50YXRpb24gb2YgY2FudmFzIGNvb3JkaW5hdGUgc3lzdGVtOgogICAgICAgIC8vIDAgPSBvbiB0aGUgcG9zaXRpdmUgeCBheGlzCiAgICAgICAgLy8gLTkwID0gb24gdGhlIHBvc2l0aXZlIHkgYXhpcy4KICAgICAgICAvLyA5MCA9IG9uIHRoZSBuZWdhaXZlIHkgYXhpcy4KICAgICAgICAvLyAxODAgb3IgLSAxODAgPSBvbiB0aGUgbmVnYXRpdmUgeCBheGlzLgogICAgICAgIHRoaXMuc3RhcnRBbmdsZSA9IDA7CiAgICAgICAgdGhpcy50aWNrUmVuZGVyZXIgPSAkLmpxcGxvdC5Eb251dFRpY2tSZW5kZXJlcjsKICAgICAgICAvLyBVc2VkIGFzIGNoZWNrIGZvciBjb25kaXRpb25zIHdoZXJlIGRvbnV0IHNob3VsZG4ndCBiZSBkcmF3bi4KICAgICAgICB0aGlzLl9kcmF3RGF0YSA9IHRydWU7CiAgICAgICAgdGhpcy5fdHlwZSA9ICdkb251dCc7CiAgICAgICAgCiAgICAgICAgLy8gaWYgdXNlciBoYXMgcGFzc2VkIGluIGhpZ2hsaWdodE1vdXNlRG93biBvcHRpb24gYW5kIG5vdCBzZXQgaGlnaGxpZ2h0TW91c2VPdmVyLCBkaXNhYmxlIGhpZ2hsaWdodE1vdXNlT3ZlcgogICAgICAgIGlmIChvcHRpb25zLmhpZ2hsaWdodE1vdXNlRG93biAmJiBvcHRpb25zLmhpZ2hsaWdodE1vdXNlT3ZlciA9PSBudWxsKSB7CiAgICAgICAgICAgIG9wdGlvbnMuaGlnaGxpZ2h0TW91c2VPdmVyID0gZmFsc2U7CiAgICAgICAgfQogICAgICAgIAogICAgICAgICQuZXh0ZW5kKHRydWUsIHRoaXMsIG9wdGlvbnMpOwogICAgICAgIGlmICh0aGlzLmRpYW1ldGVyICE9IG51bGwpIHsKICAgICAgICAgICAgdGhpcy5kaWFtZXRlciA9IHRoaXMuZGlhbWV0ZXIgLSB0aGlzLnNsaWNlTWFyZ2luOwogICAgICAgIH0KICAgICAgICB0aGlzLl9kaWFtZXRlciA9IG51bGw7CiAgICAgICAgdGhpcy5faW5uZXJEaWFtZXRlciA9IG51bGw7CiAgICAgICAgdGhpcy5fcmFkaXVzID0gbnVsbDsKICAgICAgICB0aGlzLl9pbm5lclJhZGl1cyA9IG51bGw7CiAgICAgICAgdGhpcy5fdGhpY2tuZXNzID0gbnVsbDsKICAgICAgICAvLyByZWZlcmVuY2VzIHRvIHRoZSBwcmV2aW91cyBzZXJpZXMgaW4gdGhlIHBsb3QgdG8gcHJvcGVybHkgY2FsY3VsYXRlIGRpYW1ldGVycwogICAgICAgIC8vIGFuZCB0aGlja25lc3NlcyBvZiBuZXN0ZWQgcmluZ3MuCiAgICAgICAgdGhpcy5fcHJldmlvdXNTZXJpZXMgPSBbXTsKICAgICAgICB0aGlzLl9udW1iZXJTZXJpZXMgPSAxOwogICAgICAgIC8vIGFycmF5IG9mIFtzdGFydCxlbmRdIGFuZ2xlcyBhcnJheXMsIG9uZSBmb3IgZWFjaCBzbGljZS4gIEluIHJhZGlhbnMuCiAgICAgICAgdGhpcy5fc2xpY2VBbmdsZXMgPSBbXTsKICAgICAgICAvLyBpbmRleCBvZiB0aGUgY3VycmVudHkgaGlnaGxpZ2h0ZWQgcG9pbnQsIGlmIGFueQogICAgICAgIHRoaXMuX2hpZ2hsaWdodGVkUG9pbnQgPSBudWxsOwogICAgICAgIAogICAgICAgIC8vIHNldCBoaWdobGlnaHQgY29sb3JzIGlmIG5vbmUgcHJvdmlkZWQKICAgICAgICBpZiAodGhpcy5oaWdobGlnaHRDb2xvcnMubGVuZ3RoID09IDApIHsKICAgICAgICAgICAgZm9yICh2YXIgaT0wOyBpPHRoaXMuc2VyaWVzQ29sb3JzLmxlbmd0aDsgaSsrKXsKICAgICAgICAgICAgICAgIHZhciByZ2JhID0gJC5qcXBsb3QuZ2V0Q29sb3JDb21wb25lbnRzKHRoaXMuc2VyaWVzQ29sb3JzW2ldKTsKICAgICAgICAgICAgICAgIHZhciBuZXdyZ2IgPSBbcmdiYVswXSwgcmdiYVsxXSwgcmdiYVsyXV07CiAgICAgICAgICAgICAgICB2YXIgc3VtID0gbmV3cmdiWzBdICsgbmV3cmdiWzFdICsgbmV3cmdiWzJdOwogICAgICAgICAgICAgICAgZm9yICh2YXIgaj0wOyBqPDM7IGorKykgewogICAgICAgICAgICAgICAgICAgIC8vIHdoZW4gZGFya2VuaW5nLCBsb3dlc3QgY29sb3IgY29tcG9uZW50IGNhbiBiZSBpcyA2MC4KICAgICAgICAgICAgICAgICAgICBuZXdyZ2Jbal0gPSAoc3VtID4gNTcwKSA/ICBuZXdyZ2Jbal0gKiAwLjggOiBuZXdyZ2Jbal0gKyAwLjMgKiAoMjU1IC0gbmV3cmdiW2pdKTsKICAgICAgICAgICAgICAgICAgICBuZXdyZ2Jbal0gPSBwYXJzZUludChuZXdyZ2Jbal0sIDEwKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRoaXMuaGlnaGxpZ2h0Q29sb3JzLnB1c2goJ3JnYignK25ld3JnYlswXSsnLCcrbmV3cmdiWzFdKycsJytuZXdyZ2JbMl0rJyknKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAKICAgICAgICBwbG90LnBvc3RQYXJzZU9wdGlvbnNIb29rcy5hZGRPbmNlKHBvc3RQYXJzZU9wdGlvbnMpOwogICAgICAgIHBsb3QucG9zdEluaXRIb29rcy5hZGRPbmNlKHBvc3RJbml0KTsKICAgICAgICBwbG90LmV2ZW50TGlzdGVuZXJIb29rcy5hZGRPbmNlKCdqcXBsb3RNb3VzZU1vdmUnLCBoYW5kbGVNb3ZlKTsKICAgICAgICBwbG90LmV2ZW50TGlzdGVuZXJIb29rcy5hZGRPbmNlKCdqcXBsb3RNb3VzZURvd24nLCBoYW5kbGVNb3VzZURvd24pOwogICAgICAgIHBsb3QuZXZlbnRMaXN0ZW5lckhvb2tzLmFkZE9uY2UoJ2pxcGxvdE1vdXNlVXAnLCBoYW5kbGVNb3VzZVVwKTsKICAgICAgICBwbG90LmV2ZW50TGlzdGVuZXJIb29rcy5hZGRPbmNlKCdqcXBsb3RDbGljaycsIGhhbmRsZUNsaWNrKTsKICAgICAgICBwbG90LmV2ZW50TGlzdGVuZXJIb29rcy5hZGRPbmNlKCdqcXBsb3RSaWdodENsaWNrJywgaGFuZGxlUmlnaHRDbGljayk7CiAgICAgICAgcGxvdC5wb3N0RHJhd0hvb2tzLmFkZE9uY2UocG9zdFBsb3REcmF3KTsKICAgICAgICAKICAgICAgICAKICAgIH07CiAgICAKICAgICQuanFwbG90LkRvbnV0UmVuZGVyZXIucHJvdG90eXBlLnNldEdyaWREYXRhID0gZnVuY3Rpb24ocGxvdCkgewogICAgICAgIC8vIHNldCBncmlkRGF0YSBwcm9wZXJ0eS4gIFRoaXMgd2lsbCBob2xkIGFuZ2xlIGluIHJhZGlhbnMgb2YgZWFjaCBkYXRhIHBvaW50LgogICAgICAgIHZhciBzdGFjayA9IFtdOwogICAgICAgIHZhciB0ZCA9IFtdOwogICAgICAgIHZhciBzYSA9IHRoaXMuc3RhcnRBbmdsZS8xODAqTWF0aC5QSTsKICAgICAgICB2YXIgdG90ID0gMDsKICAgICAgICAvLyBkb24ndCBrbm93IGlmIHdlIGhhdmUgYW55IHZhbGlkIGRhdGEgeWV0LCBzbyBzZXQgcGxvdCB0byBub3QgZHJhdy4KICAgICAgICB0aGlzLl9kcmF3RGF0YSA9IGZhbHNlOwogICAgICAgIGZvciAodmFyIGk9MDsgaTx0aGlzLmRhdGEubGVuZ3RoOyBpKyspewogICAgICAgICAgICBpZiAodGhpcy5kYXRhW2ldWzFdICE9IDApIHsKICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgZGF0YSwgTy5LLiB0byBkcmF3LgogICAgICAgICAgICAgICAgdGhpcy5fZHJhd0RhdGEgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHN0YWNrLnB1c2godGhpcy5kYXRhW2ldWzFdKTsKICAgICAgICAgICAgdGQucHVzaChbdGhpcy5kYXRhW2ldWzBdXSk7CiAgICAgICAgICAgIGlmIChpPjApIHsKICAgICAgICAgICAgICAgIHN0YWNrW2ldICs9IHN0YWNrW2ktMV07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdG90ICs9IHRoaXMuZGF0YVtpXVsxXTsKICAgICAgICB9CiAgICAgICAgdmFyIGZhY3QgPSBNYXRoLlBJKjIvc3RhY2tbc3RhY2subGVuZ3RoIC0gMV07CiAgICAgICAgCiAgICAgICAgZm9yICh2YXIgaT0wOyBpPHN0YWNrLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIHRkW2ldWzFdID0gc3RhY2tbaV0gKiBmYWN0OwogICAgICAgICAgICB0ZFtpXVsyXSA9IHRoaXMuZGF0YVtpXVsxXS90b3Q7CiAgICAgICAgfQogICAgICAgIHRoaXMuZ3JpZERhdGEgPSB0ZDsKICAgIH07CiAgICAKICAgICQuanFwbG90LkRvbnV0UmVuZGVyZXIucHJvdG90eXBlLm1ha2VHcmlkRGF0YSA9IGZ1bmN0aW9uKGRhdGEsIHBsb3QpIHsKICAgICAgICB2YXIgc3RhY2sgPSBbXTsKICAgICAgICB2YXIgdGQgPSBbXTsKICAgICAgICB2YXIgdG90ID0gMDsKICAgICAgICB2YXIgc2EgPSB0aGlzLnN0YXJ0QW5nbGUvMTgwKk1hdGguUEk7CiAgICAgICAgLy8gZG9uJ3Qga25vdyBpZiB3ZSBoYXZlIGFueSB2YWxpZCBkYXRhIHlldCwgc28gc2V0IHBsb3QgdG8gbm90IGRyYXcuCiAgICAgICAgdGhpcy5fZHJhd0RhdGEgPSBmYWxzZTsKICAgICAgICBmb3IgKHZhciBpPTA7IGk8ZGF0YS5sZW5ndGg7IGkrKyl7CiAgICAgICAgICAgIGlmICh0aGlzLmRhdGFbaV1bMV0gIT0gMCkgewogICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSBkYXRhLCBPLksuIHRvIGRyYXcuCiAgICAgICAgICAgICAgICB0aGlzLl9kcmF3RGF0YSA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3RhY2sucHVzaChkYXRhW2ldWzFdKTsKICAgICAgICAgICAgdGQucHVzaChbZGF0YVtpXVswXV0pOwogICAgICAgICAgICBpZiAoaT4wKSB7CiAgICAgICAgICAgICAgICBzdGFja1tpXSArPSBzdGFja1tpLTFdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRvdCArPSBkYXRhW2ldWzFdOwogICAgICAgIH0KICAgICAgICB2YXIgZmFjdCA9IE1hdGguUEkqMi9zdGFja1tzdGFjay5sZW5ndGggLSAxXTsKICAgICAgICAKICAgICAgICBmb3IgKHZhciBpPTA7IGk8c3RhY2subGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgdGRbaV1bMV0gPSBzdGFja1tpXSAqIGZhY3Q7CiAgICAgICAgICAgIHRkW2ldWzJdID0gZGF0YVtpXVsxXS90b3Q7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0ZDsKICAgIH07CiAgICAKICAgICQuanFwbG90LkRvbnV0UmVuZGVyZXIucHJvdG90eXBlLmRyYXdTbGljZSA9IGZ1bmN0aW9uIChjdHgsIGFuZzEsIGFuZzIsIGNvbG9yLCBpc1NoYWRvdykgewogICAgICAgIHZhciByID0gdGhpcy5fZGlhbWV0ZXIgLyAyOwogICAgICAgIHZhciByaSA9IHIgLSB0aGlzLl90aGlja25lc3M7CiAgICAgICAgdmFyIGZpbGwgPSB0aGlzLmZpbGw7CiAgICAgICAgLy8gdmFyIGxpbmVXaWR0aCA9IHRoaXMubGluZVdpZHRoOwogICAgICAgIGN0eC5zYXZlKCk7CiAgICAgICAgY3R4LnRyYW5zbGF0ZSh0aGlzLl9jZW50ZXJbMF0sIHRoaXMuX2NlbnRlclsxXSk7CiAgICAgICAgLy8gY3R4LnRyYW5zbGF0ZSh0aGlzLnNsaWNlTWFyZ2luKk1hdGguY29zKChhbmcxK2FuZzIpLzIpLCB0aGlzLnNsaWNlTWFyZ2luKk1hdGguc2luKChhbmcxK2FuZzIpLzIpKTsKICAgICAgICAKICAgICAgICBpZiAoaXNTaGFkb3cpIHsKICAgICAgICAgICAgZm9yICh2YXIgaT0wOyBpPHRoaXMuc2hhZG93RGVwdGg7IGkrKykgewogICAgICAgICAgICAgICAgY3R4LnNhdmUoKTsKICAgICAgICAgICAgICAgIGN0eC50cmFuc2xhdGUodGhpcy5zaGFkb3dPZmZzZXQqTWF0aC5jb3ModGhpcy5zaGFkb3dBbmdsZS8xODAqTWF0aC5QSSksIHRoaXMuc2hhZG93T2Zmc2V0Kk1hdGguc2luKHRoaXMuc2hhZG93QW5nbGUvMTgwKk1hdGguUEkpKTsKICAgICAgICAgICAgICAgIGRvRHJhdygpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGVsc2UgewogICAgICAgICAgICBkb0RyYXcoKTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgZnVuY3Rpb24gZG9EcmF3ICgpIHsKICAgICAgICAgICAgLy8gRml4IGZvciBJRSBhbmQgQ2hyb21lIHRoYXQgY2FuJ3Qgc2VlbSB0byBkcmF3IGNpcmNsZXMgY29ycmVjdGx5LgogICAgICAgICAgICAvLyBhbmcyIHNob3VsZCBhbHdheXMgYmUgPD0gMiBwaSBzaW5jZSB0aGF0IGlzIHRoZSB3YXkgdGhlIGRhdGEgaXMgY29udmVydGVkLgogICAgICAgICAgICAgaWYgKGFuZzIgPiA2LjI4MiArIHRoaXMuc3RhcnRBbmdsZSkgewogICAgICAgICAgICAgICAgYW5nMiA9IDYuMjgyICsgdGhpcy5zdGFydEFuZ2xlOwogICAgICAgICAgICAgICAgaWYgKGFuZzEgPiBhbmcyKSB7CiAgICAgICAgICAgICAgICAgICAgYW5nMSA9IDYuMjgxICsgdGhpcy5zdGFydEFuZ2xlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIEZpeCBmb3IgSUUsIHdoZXJlIGl0IGNhbid0IHNlZW0gdG8gaGFuZGxlIDAgZGVncmVlIGFuZ2xlcy4gIEFsc28gYXZvaWRzCiAgICAgICAgICAgIC8vIHVnbHkgbGluZSBvbiB1bmZpbGxlZCBkb251dHMuCiAgICAgICAgICAgIGlmIChhbmcxID49IGFuZzIpIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBjdHguYmVnaW5QYXRoKCk7ICAKICAgICAgICAgICAgY3R4LmZpbGxTdHlsZSA9IGNvbG9yOwogICAgICAgICAgICBjdHguc3Ryb2tlU3R5bGUgPSBjb2xvcjsKICAgICAgICAgICAgLy8gY3R4LmxpbmVXaWR0aCA9IGxpbmVXaWR0aDsKICAgICAgICAgICAgY3R4LmFyYygwLCAwLCByLCBhbmcxLCBhbmcyLCBmYWxzZSk7CiAgICAgICAgICAgIGN0eC5saW5lVG8ocmkqTWF0aC5jb3MoYW5nMiksIHJpKk1hdGguc2luKGFuZzIpKTsKICAgICAgICAgICAgY3R4LmFyYygwLDAsIHJpLCBhbmcyLCBhbmcxLCB0cnVlKTsKICAgICAgICAgICAgY3R4LmNsb3NlUGF0aCgpOwogICAgICAgICAgICBpZiAoZmlsbCkgewogICAgICAgICAgICAgICAgY3R4LmZpbGwoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGN0eC5zdHJva2UoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZiAoaXNTaGFkb3cpIHsKICAgICAgICAgICAgZm9yICh2YXIgaT0wOyBpPHRoaXMuc2hhZG93RGVwdGg7IGkrKykgewogICAgICAgICAgICAgICAgY3R4LnJlc3RvcmUoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAKICAgICAgICBjdHgucmVzdG9yZSgpOwogICAgfTsKICAgIAogICAgLy8gY2FsbGVkIHdpdGggc2NvcGUgb2Ygc2VyaWVzCiAgICAkLmpxcGxvdC5Eb251dFJlbmRlcmVyLnByb3RvdHlwZS5kcmF3ID0gZnVuY3Rpb24gKGN0eCwgZ2QsIG9wdGlvbnMsIHBsb3QpIHsKICAgICAgICB2YXIgaTsKICAgICAgICB2YXIgb3B0cyA9IChvcHRpb25zICE9IHVuZGVmaW5lZCkgPyBvcHRpb25zIDoge307CiAgICAgICAgLy8gb2Zmc2V0IGFuZCBkaXJlY3Rpb24gb2Ygb2Zmc2V0IGR1ZSB0byBsZWdlbmQgcGxhY2VtZW50CiAgICAgICAgdmFyIG9mZnggPSAwOwogICAgICAgIHZhciBvZmZ5ID0gMDsKICAgICAgICB2YXIgdHJhbnMgPSAxOwogICAgICAgIC8vIHZhciBjb2xvckdlbmVyYXRvciA9IG5ldyB0aGlzLmNvbG9yR2VuZXJhdG9yKHRoaXMuc2VyaWVzQ29sb3JzKTsKICAgICAgICBpZiAob3B0aW9ucy5sZWdlbmRJbmZvICYmIG9wdGlvbnMubGVnZW5kSW5mby5wbGFjZW1lbnQgPT0gJ2luc2lkZUdyaWQnKSB7CiAgICAgICAgICAgIHZhciBsaSA9IG9wdGlvbnMubGVnZW5kSW5mbzsKICAgICAgICAgICAgc3dpdGNoIChsaS5sb2NhdGlvbikgewogICAgICAgICAgICAgICAgY2FzZSAnbncnOgogICAgICAgICAgICAgICAgICAgIG9mZnggPSBsaS53aWR0aCArIGxpLnhvZmZzZXQ7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICd3JzoKICAgICAgICAgICAgICAgICAgICBvZmZ4ID0gbGkud2lkdGggKyBsaS54b2Zmc2V0OwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAnc3cnOgogICAgICAgICAgICAgICAgICAgIG9mZnggPSBsaS53aWR0aCArIGxpLnhvZmZzZXQ7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICduZSc6CiAgICAgICAgICAgICAgICAgICAgb2ZmeCA9IGxpLndpZHRoICsgbGkueG9mZnNldDsKICAgICAgICAgICAgICAgICAgICB0cmFucyA9IC0xOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAnZSc6CiAgICAgICAgICAgICAgICAgICAgb2ZmeCA9IGxpLndpZHRoICsgbGkueG9mZnNldDsKICAgICAgICAgICAgICAgICAgICB0cmFucyA9IC0xOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAnc2UnOgogICAgICAgICAgICAgICAgICAgIG9mZnggPSBsaS53aWR0aCArIGxpLnhvZmZzZXQ7CiAgICAgICAgICAgICAgICAgICAgdHJhbnMgPSAtMTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJ24nOgogICAgICAgICAgICAgICAgICAgIG9mZnkgPSBsaS5oZWlnaHQgKyBsaS55b2Zmc2V0OwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAncyc6CiAgICAgICAgICAgICAgICAgICAgb2ZmeSA9IGxpLmhlaWdodCArIGxpLnlvZmZzZXQ7CiAgICAgICAgICAgICAgICAgICAgdHJhbnMgPSAtMTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgdmFyIHNoYWRvdyA9IChvcHRzLnNoYWRvdyAhPSB1bmRlZmluZWQpID8gb3B0cy5zaGFkb3cgOiB0aGlzLnNoYWRvdzsKICAgICAgICB2YXIgc2hvd0xpbmUgPSAob3B0cy5zaG93TGluZSAhPSB1bmRlZmluZWQpID8gb3B0cy5zaG93TGluZSA6IHRoaXMuc2hvd0xpbmU7CiAgICAgICAgdmFyIGZpbGwgPSAob3B0cy5maWxsICE9IHVuZGVmaW5lZCkgPyBvcHRzLmZpbGwgOiB0aGlzLmZpbGw7CiAgICAgICAgdmFyIGN3ID0gY3R4LmNhbnZhcy53aWR0aDsKICAgICAgICB2YXIgY2ggPSBjdHguY2FudmFzLmhlaWdodDsKICAgICAgICB2YXIgdyA9IGN3IC0gb2ZmeCAtIDIgKiB0aGlzLnBhZGRpbmc7CiAgICAgICAgdmFyIGggPSBjaCAtIG9mZnkgLSAyICogdGhpcy5wYWRkaW5nOwogICAgICAgIHZhciBtaW5kaW0gPSBNYXRoLm1pbih3LGgpOwogICAgICAgIHZhciBkID0gbWluZGltOwogICAgICAgIHZhciByaW5nbWFyZ2luID0gICh0aGlzLnJpbmdNYXJnaW4gPT0gbnVsbCkgPyB0aGlzLnNsaWNlTWFyZ2luICogMi4wIDogdGhpcy5yaW5nTWFyZ2luOwogICAgICAgIAogICAgICAgIGZvciAodmFyIGk9MDsgaTx0aGlzLl9wcmV2aW91c1Nlcmllcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICBkIC09IDIuMCAqIHRoaXMuX3ByZXZpb3VzU2VyaWVzW2ldLl90aGlja25lc3MgKyAyLjAgKiByaW5nbWFyZ2luOwogICAgICAgIH0KICAgICAgICB0aGlzLl9kaWFtZXRlciA9IHRoaXMuZGlhbWV0ZXIgfHwgZDsKICAgICAgICBpZiAodGhpcy5pbm5lckRpYW1ldGVyICE9IG51bGwpIHsKICAgICAgICAgICAgdmFyIG9kID0gKHRoaXMuX251bWJlclNlcmllcyA+IDEgJiYgdGhpcy5pbmRleCA+IDApID8gdGhpcy5fcHJldmlvdXNTZXJpZXNbMF0uX2RpYW1ldGVyIDogdGhpcy5fZGlhbWV0ZXI7CiAgICAgICAgICAgIHRoaXMuX3RoaWNrbmVzcyA9IHRoaXMudGhpY2tuZXNzIHx8IChvZCAtIHRoaXMuaW5uZXJEaWFtZXRlciAtIDIuMCpyaW5nbWFyZ2luKnRoaXMuX251bWJlclNlcmllcykgLyB0aGlzLl9udW1iZXJTZXJpZXMvMi4wOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgdGhpcy5fdGhpY2tuZXNzID0gdGhpcy50aGlja25lc3MgfHwgbWluZGltIC8gMiAvICh0aGlzLl9udW1iZXJTZXJpZXMgKyAxKSAqIDAuODU7CiAgICAgICAgfQoKICAgICAgICB2YXIgciA9IHRoaXMuX3JhZGl1cyA9IHRoaXMuX2RpYW1ldGVyLzI7CiAgICAgICAgdGhpcy5faW5uZXJSYWRpdXMgPSB0aGlzLl9yYWRpdXMgLSB0aGlzLl90aGlja25lc3M7CiAgICAgICAgdmFyIHNhID0gdGhpcy5zdGFydEFuZ2xlIC8gMTgwICogTWF0aC5QSTsKICAgICAgICB0aGlzLl9jZW50ZXIgPSBbKGN3IC0gdHJhbnMgKiBvZmZ4KS8yICsgdHJhbnMgKiBvZmZ4LCAoY2ggLSB0cmFucypvZmZ5KS8yICsgdHJhbnMgKiBvZmZ5XTsKICAgICAgICAKICAgICAgICBpZiAodGhpcy5zaGFkb3cpIHsKICAgICAgICAgICAgdmFyIHNoYWRvd0NvbG9yID0gJ3JnYmEoMCwwLDAsJyt0aGlzLnNoYWRvd0FscGhhKycpJzsKICAgICAgICAgICAgZm9yICh2YXIgaT0wOyBpPGdkLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICB2YXIgYW5nMSA9IChpID09IDApID8gc2EgOiBnZFtpLTFdWzFdICsgc2E7CiAgICAgICAgICAgICAgICAvLyBBZGp1c3QgYW5nMSBhbmQgYW5nMiBmb3Igc2xpY2VNYXJnaW4KICAgICAgICAgICAgICAgIGFuZzEgKz0gdGhpcy5zbGljZU1hcmdpbi8xODAqTWF0aC5QSTsKICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuZHJhd1NsaWNlLmNhbGwgKHRoaXMsIGN0eCwgYW5nMSwgZ2RbaV1bMV0rc2EsIHNoYWRvd0NvbG9yLCB0cnVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICB9CiAgICAgICAgZm9yICh2YXIgaT0wOyBpPGdkLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIHZhciBhbmcxID0gKGkgPT0gMCkgPyBzYSA6IGdkW2ktMV1bMV0gKyBzYTsKICAgICAgICAgICAgLy8gQWRqdXN0IGFuZzEgYW5kIGFuZzIgZm9yIHNsaWNlTWFyZ2luCiAgICAgICAgICAgIGFuZzEgKz0gdGhpcy5zbGljZU1hcmdpbi8xODAqTWF0aC5QSTsKICAgICAgICAgICAgdmFyIGFuZzIgPSBnZFtpXVsxXSArIHNhOwogICAgICAgICAgICB0aGlzLl9zbGljZUFuZ2xlcy5wdXNoKFthbmcxLCBhbmcyXSk7CiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuZHJhd1NsaWNlLmNhbGwgKHRoaXMsIGN0eCwgYW5nMSwgYW5nMiwgdGhpcy5zZXJpZXNDb2xvcnNbaV0sIGZhbHNlKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIGlmICh0aGlzLnNob3dEYXRhTGFiZWxzICYmIGdkW2ldWzJdKjEwMCA+PSB0aGlzLmRhdGFMYWJlbFRocmVzaG9sZCkgewogICAgICAgICAgICAgICAgdmFyIGZzdHIsIGF2Z2FuZyA9IChhbmcxK2FuZzIpLzIsIGxhYmVsOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBpZiAodGhpcy5kYXRhTGFiZWxzID09ICdsYWJlbCcpIHsKICAgICAgICAgICAgICAgICAgICBmc3RyID0gdGhpcy5kYXRhTGFiZWxGb3JtYXRTdHJpbmcgfHwgJyVzJzsKICAgICAgICAgICAgICAgICAgICBsYWJlbCA9ICQuanFwbG90LnNwcmludGYoZnN0ciwgZ2RbaV1bMF0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5kYXRhTGFiZWxzID09ICd2YWx1ZScpIHsKICAgICAgICAgICAgICAgICAgICBmc3RyID0gdGhpcy5kYXRhTGFiZWxGb3JtYXRTdHJpbmcgfHwgJyVkJzsKICAgICAgICAgICAgICAgICAgICBsYWJlbCA9ICQuanFwbG90LnNwcmludGYoZnN0ciwgdGhpcy5kYXRhW2ldWzFdKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuZGF0YUxhYmVscyA9PSAncGVyY2VudCcpIHsKICAgICAgICAgICAgICAgICAgICBmc3RyID0gdGhpcy5kYXRhTGFiZWxGb3JtYXRTdHJpbmcgfHwgJyVkJSUnOwogICAgICAgICAgICAgICAgICAgIGxhYmVsID0gJC5qcXBsb3Quc3ByaW50Zihmc3RyLCBnZFtpXVsyXSoxMDApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5kYXRhTGFiZWxzLmNvbnN0cnVjdG9yID09IEFycmF5KSB7CiAgICAgICAgICAgICAgICAgICAgZnN0ciA9IHRoaXMuZGF0YUxhYmVsRm9ybWF0U3RyaW5nIHx8ICclcyc7CiAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSAkLmpxcGxvdC5zcHJpbnRmKGZzdHIsIHRoaXMuZGF0YUxhYmVsc1tpXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBmYWN0ID0gdGhpcy5faW5uZXJSYWRpdXMgKyB0aGlzLl90aGlja25lc3MgKiB0aGlzLmRhdGFMYWJlbFBvc2l0aW9uRmFjdG9yICsgdGhpcy5zbGljZU1hcmdpbiArIHRoaXMuZGF0YUxhYmVsTnVkZ2U7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciB4ID0gdGhpcy5fY2VudGVyWzBdICsgTWF0aC5jb3MoYXZnYW5nKSAqIGZhY3QgKyB0aGlzLmNhbnZhcy5fb2Zmc2V0cy5sZWZ0OwogICAgICAgICAgICAgICAgdmFyIHkgPSB0aGlzLl9jZW50ZXJbMV0gKyBNYXRoLnNpbihhdmdhbmcpICogZmFjdCArIHRoaXMuY2FudmFzLl9vZmZzZXRzLnRvcDsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGxhYmVsZWxlbSA9ICQoJzxzcGFuIGNsYXNzPSJqcXBsb3QtZG9udXQtc2VyaWVzIGpxcGxvdC1kYXRhLWxhYmVsIiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7Ij4nICsgbGFiZWwgKyAnPC9zcGFuPicpLmluc2VydEJlZm9yZShwbG90LmV2ZW50Q2FudmFzLl9lbGVtKTsKICAgICAgICAgICAgICAgIHggLT0gbGFiZWxlbGVtLndpZHRoKCkvMjsKICAgICAgICAgICAgICAgIHkgLT0gbGFiZWxlbGVtLmhlaWdodCgpLzI7CiAgICAgICAgICAgICAgICB4ID0gTWF0aC5yb3VuZCh4KTsKICAgICAgICAgICAgICAgIHkgPSBNYXRoLnJvdW5kKHkpOwogICAgICAgICAgICAgICAgbGFiZWxlbGVtLmNzcyh7bGVmdDogeCwgdG9wOiB5fSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgICAgICAgIAogICAgfTsKICAgIAogICAgJC5qcXBsb3QuRG9udXRBeGlzUmVuZGVyZXIgPSBmdW5jdGlvbigpIHsKICAgICAgICAkLmpxcGxvdC5MaW5lYXJBeGlzUmVuZGVyZXIuY2FsbCh0aGlzKTsKICAgIH07CiAgICAKICAgICQuanFwbG90LkRvbnV0QXhpc1JlbmRlcmVyLnByb3RvdHlwZSA9IG5ldyAkLmpxcGxvdC5MaW5lYXJBeGlzUmVuZGVyZXIoKTsKICAgICQuanFwbG90LkRvbnV0QXhpc1JlbmRlcmVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9ICQuanFwbG90LkRvbnV0QXhpc1JlbmRlcmVyOwogICAgICAgIAogICAgCiAgICAvLyBUaGVyZSBhcmUgbm8gdHJhZGl0aW9uYWwgYXhlcyBvbiBhIGRvbnV0IGNoYXJ0LiAgV2UganVzdCBuZWVkIHRvIHByb3ZpZGUKICAgIC8vIGR1bW15IG9iamVjdHMgd2l0aCBwcm9wZXJ0aWVzIHNvIHRoZSBwbG90IHdpbGwgcmVuZGVyLgogICAgLy8gY2FsbGVkIHdpdGggc2NvcGUgb2YgYXhpcyBvYmplY3QuCiAgICAkLmpxcGxvdC5Eb251dEF4aXNSZW5kZXJlci5wcm90b3R5cGUuaW5pdCA9IGZ1bmN0aW9uKG9wdGlvbnMpewogICAgICAgIC8vCiAgICAgICAgdGhpcy50aWNrUmVuZGVyZXIgPSAkLmpxcGxvdC5Eb251dFRpY2tSZW5kZXJlcjsKICAgICAgICAkLmV4dGVuZCh0cnVlLCB0aGlzLCBvcHRpb25zKTsKICAgICAgICAvLyBJIGRvbid0IHRoaW5rIEknbSBnb2luZyB0byBuZWVkIF9kYXRhQm91bmRzIGhlcmUuCiAgICAgICAgLy8gaGF2ZSB0byBnbyBBeGlzIHNjYWxpbmcgaW4gYSB3YXkgdG8gZml0IGNoYXJ0IG9udG8gcGxvdCBhcmVhCiAgICAgICAgLy8gYW5kIHByb3ZpZGUgdTJwIGFuZCBwMnUgZnVuY3Rpb25hbGl0eSBmb3IgbW91c2UgY3Vyc29yLCBldGMuCiAgICAgICAgLy8gZm9yIGNvbnZpZW5lbmNlIHNldCBfZGF0YUJvdW5kcyB0byAwIGFuZCAxMDAgYW5kCiAgICAgICAgLy8gc2V0IG1pbi9tYXggdG8gMCBhbmQgMTAwLgogICAgICAgIHRoaXMuX2RhdGFCb3VuZHMgPSB7bWluOjAsIG1heDoxMDB9OwogICAgICAgIHRoaXMubWluID0gMDsKICAgICAgICB0aGlzLm1heCA9IDEwMDsKICAgICAgICB0aGlzLnNob3dUaWNrcyA9IGZhbHNlOwogICAgICAgIHRoaXMudGlja3MgPSBbXTsKICAgICAgICB0aGlzLnNob3dNYXJrID0gZmFsc2U7CiAgICAgICAgdGhpcy5zaG93ID0gZmFsc2U7IAogICAgfTsKICAgIAogICAgCiAgICAKICAgIAogICAgJC5qcXBsb3QuRG9udXRMZWdlbmRSZW5kZXJlciA9IGZ1bmN0aW9uKCl7CiAgICAgICAgJC5qcXBsb3QuVGFibGVMZWdlbmRSZW5kZXJlci5jYWxsKHRoaXMpOwogICAgfTsKICAgIAogICAgJC5qcXBsb3QuRG9udXRMZWdlbmRSZW5kZXJlci5wcm90b3R5cGUgPSBuZXcgJC5qcXBsb3QuVGFibGVMZWdlbmRSZW5kZXJlcigpOwogICAgJC5qcXBsb3QuRG9udXRMZWdlbmRSZW5kZXJlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSAkLmpxcGxvdC5Eb251dExlZ2VuZFJlbmRlcmVyOwogICAgCiAgICAvKioKICAgICAqIENsYXNzOiAkLmpxcGxvdC5Eb251dExlZ2VuZFJlbmRlcmVyCiAgICAgKiBMZWdlbmQgUmVuZGVyZXIgc3BlY2lmaWMgdG8gZG9udXQgcGxvdHMuICBTZXQgYnkgZGVmYXVsdAogICAgICogd2hlbiB1c2VyIGNyZWF0ZXMgYSBkb251dCBwbG90LgogICAgICovCiAgICAkLmpxcGxvdC5Eb251dExlZ2VuZFJlbmRlcmVyLnByb3RvdHlwZS5pbml0ID0gZnVuY3Rpb24ob3B0aW9ucykgewogICAgICAgIC8vIEdyb3VwOiBQcm9wZXJ0aWVzCiAgICAgICAgLy8KICAgICAgICAvLyBwcm9wOiBudW1iZXJSb3dzCiAgICAgICAgLy8gTWF4aW11bSBudW1iZXIgb2Ygcm93cyBpbiB0aGUgbGVnZW5kLiAgMCBvciBudWxsIGZvciB1bmxpbWl0ZWQuCiAgICAgICAgdGhpcy5udW1iZXJSb3dzID0gbnVsbDsKICAgICAgICAvLyBwcm9wOiBudW1iZXJDb2x1bW5zCiAgICAgICAgLy8gTWF4aW11bSBudW1iZXIgb2YgY29sdW1ucyBpbiB0aGUgbGVnZW5kLiAgMCBvciBudWxsIGZvciB1bmxpbWl0ZWQuCiAgICAgICAgdGhpcy5udW1iZXJDb2x1bW5zID0gbnVsbDsKICAgICAgICAkLmV4dGVuZCh0cnVlLCB0aGlzLCBvcHRpb25zKTsKICAgIH07CiAgICAKICAgIC8vIGNhbGxlZCB3aXRoIGNvbnRleHQgb2YgbGVnZW5kCiAgICAkLmpxcGxvdC5Eb251dExlZ2VuZFJlbmRlcmVyLnByb3RvdHlwZS5kcmF3ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIGxlZ2VuZCA9IHRoaXM7CiAgICAgICAgaWYgKHRoaXMuc2hvdykgewogICAgICAgICAgICB2YXIgc2VyaWVzID0gdGhpcy5fc2VyaWVzOwogICAgICAgICAgICB2YXIgc3MgPSAncG9zaXRpb246YWJzb2x1dGU7JzsKICAgICAgICAgICAgc3MgKz0gKHRoaXMuYmFja2dyb3VuZCkgPyAnYmFja2dyb3VuZDonK3RoaXMuYmFja2dyb3VuZCsnOycgOiAnJzsKICAgICAgICAgICAgc3MgKz0gKHRoaXMuYm9yZGVyKSA/ICdib3JkZXI6Jyt0aGlzLmJvcmRlcisnOycgOiAnJzsKICAgICAgICAgICAgc3MgKz0gKHRoaXMuZm9udFNpemUpID8gJ2ZvbnQtc2l6ZTonK3RoaXMuZm9udFNpemUrJzsnIDogJyc7CiAgICAgICAgICAgIHNzICs9ICh0aGlzLmZvbnRGYW1pbHkpID8gJ2ZvbnQtZmFtaWx5OicrdGhpcy5mb250RmFtaWx5Kyc7JyA6ICcnOwogICAgICAgICAgICBzcyArPSAodGhpcy50ZXh0Q29sb3IpID8gJ2NvbG9yOicrdGhpcy50ZXh0Q29sb3IrJzsnIDogJyc7CiAgICAgICAgICAgIHNzICs9ICh0aGlzLm1hcmdpblRvcCAhPSBudWxsKSA/ICdtYXJnaW4tdG9wOicrdGhpcy5tYXJnaW5Ub3ArJzsnIDogJyc7CiAgICAgICAgICAgIHNzICs9ICh0aGlzLm1hcmdpbkJvdHRvbSAhPSBudWxsKSA/ICdtYXJnaW4tYm90dG9tOicrdGhpcy5tYXJnaW5Cb3R0b20rJzsnIDogJyc7CiAgICAgICAgICAgIHNzICs9ICh0aGlzLm1hcmdpbkxlZnQgIT0gbnVsbCkgPyAnbWFyZ2luLWxlZnQ6Jyt0aGlzLm1hcmdpbkxlZnQrJzsnIDogJyc7CiAgICAgICAgICAgIHNzICs9ICh0aGlzLm1hcmdpblJpZ2h0ICE9IG51bGwpID8gJ21hcmdpbi1yaWdodDonK3RoaXMubWFyZ2luUmlnaHQrJzsnIDogJyc7CiAgICAgICAgICAgIHRoaXMuX2VsZW0gPSAkKCc8dGFibGUgY2xhc3M9ImpxcGxvdC10YWJsZS1sZWdlbmQiIHN0eWxlPSInK3NzKyciPjwvdGFibGU+Jyk7CiAgICAgICAgICAgIC8vIERvbnV0IGNoYXJ0cyBsZWdlbmRzIGRvbid0IGdvIGJ5IG51bWJlciBvZiBzZXJpZXMsIGJ1dCBieSBudW1iZXIgb2YgZGF0YSBwb2ludHMKICAgICAgICAgICAgLy8gaW4gdGhlIHNlcmllcy4gIFJlZmFjdG9yIHRoaW5ncyBoZXJlIGZvciB0aGF0LgogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBhZCA9IGZhbHNlLCAKICAgICAgICAgICAgICAgIHJldmVyc2UgPSBmYWxzZSwKICAgICAgICAgICAgICAgIG5yLCBuYzsKICAgICAgICAgICAgdmFyIHMgPSBzZXJpZXNbMF07CiAgICAgICAgICAgIHZhciBjb2xvckdlbmVyYXRvciA9IG5ldyAkLmpxcGxvdC5Db2xvckdlbmVyYXRvcihzLnNlcmllc0NvbG9ycyk7CiAgICAgICAgICAgIAogICAgICAgICAgICBpZiAocy5zaG93KSB7CiAgICAgICAgICAgICAgICB2YXIgcGQgPSBzLmRhdGE7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5udW1iZXJSb3dzKSB7CiAgICAgICAgICAgICAgICAgICAgbnIgPSB0aGlzLm51bWJlclJvd3M7CiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLm51bWJlckNvbHVtbnMpewogICAgICAgICAgICAgICAgICAgICAgICBuYyA9IE1hdGguY2VpbChwZC5sZW5ndGgvbnIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlewogICAgICAgICAgICAgICAgICAgICAgICBuYyA9IHRoaXMubnVtYmVyQ29sdW1uczsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICh0aGlzLm51bWJlckNvbHVtbnMpIHsKICAgICAgICAgICAgICAgICAgICBuYyA9IHRoaXMubnVtYmVyQ29sdW1uczsKICAgICAgICAgICAgICAgICAgICBuciA9IE1hdGguY2VpbChwZC5sZW5ndGgvdGhpcy5udW1iZXJDb2x1bW5zKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIG5yID0gcGQubGVuZ3RoOwogICAgICAgICAgICAgICAgICAgIG5jID0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGksIGosIHRyLCB0ZDEsIHRkMiwgbHQsIHJzLCBjb2xvcjsKICAgICAgICAgICAgICAgIHZhciBpZHggPSAwOyAgICAKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgZm9yIChpPTA7IGk8bnI7IGkrKykgewogICAgICAgICAgICAgICAgICAgIGlmIChyZXZlcnNlKXsKICAgICAgICAgICAgICAgICAgICAgICAgdHIgPSAkKCc8dHIgY2xhc3M9ImpxcGxvdC10YWJsZS1sZWdlbmQiPjwvdHI+JykucHJlcGVuZFRvKHRoaXMuX2VsZW0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlewogICAgICAgICAgICAgICAgICAgICAgICB0ciA9ICQoJzx0ciBjbGFzcz0ianFwbG90LXRhYmxlLWxlZ2VuZCI+PC90cj4nKS5hcHBlbmRUbyh0aGlzLl9lbGVtKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZm9yIChqPTA7IGo8bmM7IGorKykgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaWR4IDwgcGQubGVuZ3RoKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx0ID0gdGhpcy5sYWJlbHNbaWR4XSB8fCBwZFtpZHhdWzBdLnRvU3RyaW5nKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvciA9IGNvbG9yR2VuZXJhdG9yLm5leHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmV2ZXJzZSl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGk+MCl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2V7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2V7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT0gbnIgLTEpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBycyA9IChwYWQpID8gdGhpcy5yb3dTcGFjaW5nIDogJzAnOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZDEgPSAkKCc8dGQgY2xhc3M9ImpxcGxvdC10YWJsZS1sZWdlbmQiIHN0eWxlPSJ0ZXh0LWFsaWduOmNlbnRlcjtwYWRkaW5nLXRvcDonK3JzKyc7Ij4nKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8ZGl2PjxkaXYgY2xhc3M9ImpxcGxvdC10YWJsZS1sZWdlbmQtc3dhdGNoIiBzdHlsZT0iYm9yZGVyLWNvbG9yOicrY29sb3IrJzsiPjwvZGl2PicrCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzwvZGl2PjwvdGQ+Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZDIgPSAkKCc8dGQgY2xhc3M9ImpxcGxvdC10YWJsZS1sZWdlbmQiIHN0eWxlPSJwYWRkaW5nLXRvcDonK3JzKyc7Ij48L3RkPicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZXNjYXBlSHRtbCl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGQyLnRleHQobHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGQyLmh0bWwobHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldmVyc2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZDIucHJlcGVuZFRvKHRyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZDEucHJlcGVuZFRvKHRyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRkMS5hcHBlbmRUbyh0cik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGQyLmFwcGVuZFRvKHRyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWR4Kys7CiAgICAgICAgICAgICAgICAgICAgfSAgIAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzLl9lbGVtOyAgICAgICAgICAgICAgICAKICAgIH07CiAgICAKICAgIC8vIHNldHVwIGRlZmF1bHQgcmVuZGVyZXJzIGZvciBheGVzIGFuZCBsZWdlbmQgc28gdXNlciBkb2Vzbid0IGhhdmUgdG8KICAgIC8vIGNhbGxlZCB3aXRoIHNjb3BlIG9mIHBsb3QKICAgIGZ1bmN0aW9uIHByZUluaXQodGFyZ2V0LCBkYXRhLCBvcHRpb25zKSB7CiAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307CiAgICAgICAgb3B0aW9ucy5heGVzRGVmYXVsdHMgPSBvcHRpb25zLmF4ZXNEZWZhdWx0cyB8fCB7fTsKICAgICAgICBvcHRpb25zLmxlZ2VuZCA9IG9wdGlvbnMubGVnZW5kIHx8IHt9OwogICAgICAgIG9wdGlvbnMuc2VyaWVzRGVmYXVsdHMgPSBvcHRpb25zLnNlcmllc0RlZmF1bHRzIHx8IHt9OwogICAgICAgIC8vIG9ubHkgc2V0IHRoZXNlIGlmIHRoZXJlIGlzIGEgZG9udXQgc2VyaWVzCiAgICAgICAgdmFyIHNldG9wdHMgPSBmYWxzZTsKICAgICAgICBpZiAob3B0aW9ucy5zZXJpZXNEZWZhdWx0cy5yZW5kZXJlciA9PSAkLmpxcGxvdC5Eb251dFJlbmRlcmVyKSB7CiAgICAgICAgICAgIHNldG9wdHMgPSB0cnVlOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChvcHRpb25zLnNlcmllcykgewogICAgICAgICAgICBmb3IgKHZhciBpPTA7IGkgPCBvcHRpb25zLnNlcmllcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuc2VyaWVzW2ldLnJlbmRlcmVyID09ICQuanFwbG90LkRvbnV0UmVuZGVyZXIpIHsKICAgICAgICAgICAgICAgICAgICBzZXRvcHRzID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZiAoc2V0b3B0cykgewogICAgICAgICAgICBvcHRpb25zLmF4ZXNEZWZhdWx0cy5yZW5kZXJlciA9ICQuanFwbG90LkRvbnV0QXhpc1JlbmRlcmVyOwogICAgICAgICAgICBvcHRpb25zLmxlZ2VuZC5yZW5kZXJlciA9ICQuanFwbG90LkRvbnV0TGVnZW5kUmVuZGVyZXI7CiAgICAgICAgICAgIG9wdGlvbnMubGVnZW5kLnByZURyYXcgPSB0cnVlOwogICAgICAgICAgICBvcHRpb25zLnNlcmllc0RlZmF1bHRzLnBvaW50TGFiZWxzID0ge3Nob3c6IGZhbHNlfTsKICAgICAgICB9CiAgICB9CiAgICAKICAgIC8vIGNhbGxlZCB3aXRoIHNjb3BlIG9mIHBsb3QuCiAgICBmdW5jdGlvbiBwb3N0SW5pdCh0YXJnZXQsIGRhdGEsIG9wdGlvbnMpIHsKICAgICAgICAvLyBpZiBtdWx0aXBsZSBzZXJpZXMsIGFkZCBhIHJlZmVyZW5jZSB0byB0aGUgcHJldmlvdXMgb25lIHNvIHRoYXQKICAgICAgICAvLyBkb251dCByaW5ncyBjYW4gbmVzdC4KICAgICAgICBmb3IgKHZhciBpPTE7IGk8dGhpcy5zZXJpZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgaWYgKCF0aGlzLnNlcmllc1tpXS5fcHJldmlvdXNTZXJpZXMubGVuZ3RoKXsKICAgICAgICAgICAgICAgIGZvciAodmFyIGo9MDsgajxpOyBqKyspIHsKICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zZXJpZXNbaV0ucmVuZGVyZXIuY29uc3RydWN0b3IgPT0gJC5qcXBsb3QuRG9udXRSZW5kZXJlciAmJiB0aGlzLnNlcmllc1tqXS5yZW5kZXJlci5jb25zdHJ1Y3RvciA9PSAkLmpxcGxvdC5Eb251dFJlbmRlcmVyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VyaWVzW2ldLl9wcmV2aW91c1Nlcmllcy5wdXNoKHRoaXMuc2VyaWVzW2pdKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZm9yIChpPTA7IGk8dGhpcy5zZXJpZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgaWYgKHRoaXMuc2VyaWVzW2ldLnJlbmRlcmVyLmNvbnN0cnVjdG9yID09ICQuanFwbG90LkRvbnV0UmVuZGVyZXIpIHsKICAgICAgICAgICAgICAgIHRoaXMuc2VyaWVzW2ldLl9udW1iZXJTZXJpZXMgPSB0aGlzLnNlcmllcy5sZW5ndGg7CiAgICAgICAgICAgICAgICAvLyBkb24ndCBhbGxvdyBtb3VzZW92ZXIgYW5kIG1vdXNlZG93biBhdCBzYW1lIHRpbWUuCiAgICAgICAgICAgICAgICBpZiAodGhpcy5zZXJpZXNbaV0uaGlnaGxpZ2h0TW91c2VPdmVyKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXJpZXNbaV0uaGlnaGxpZ2h0TW91c2VEb3duID0gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAKICAgIHZhciBwb3N0UGFyc2VPcHRpb25zUnVuID0gZmFsc2U7CiAgICAvLyBjYWxsZWQgd2l0aCBzY29wZSBvZiBwbG90CiAgICBmdW5jdGlvbiBwb3N0UGFyc2VPcHRpb25zKG9wdGlvbnMpIHsKICAgICAgICBmb3IgKHZhciBpPTA7IGk8dGhpcy5zZXJpZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgdGhpcy5zZXJpZXNbaV0uc2VyaWVzQ29sb3JzID0gdGhpcy5zZXJpZXNDb2xvcnM7CiAgICAgICAgICAgIHRoaXMuc2VyaWVzW2ldLmNvbG9yR2VuZXJhdG9yID0gJC5qcXBsb3QuY29sb3JHZW5lcmF0b3I7CiAgICAgICAgfQogICAgfQogICAgCiAgICBmdW5jdGlvbiBoaWdobGlnaHQgKHBsb3QsIHNpZHgsIHBpZHgpIHsKICAgICAgICB2YXIgcyA9IHBsb3Quc2VyaWVzW3NpZHhdOwogICAgICAgIHZhciBjYW52YXMgPSBwbG90LnBsdWdpbnMuZG9udXRSZW5kZXJlci5oaWdobGlnaHRDYW52YXM7CiAgICAgICAgY2FudmFzLl9jdHguY2xlYXJSZWN0KDAsMCxjYW52YXMuX2N0eC5jYW52YXMud2lkdGgsIGNhbnZhcy5fY3R4LmNhbnZhcy5oZWlnaHQpOwogICAgICAgIHMuX2hpZ2hsaWdodGVkUG9pbnQgPSBwaWR4OwogICAgICAgIHBsb3QucGx1Z2lucy5kb251dFJlbmRlcmVyLmhpZ2hsaWdodGVkU2VyaWVzSW5kZXggPSBzaWR4OwogICAgICAgIHMucmVuZGVyZXIuZHJhd1NsaWNlLmNhbGwocywgY2FudmFzLl9jdHgsIHMuX3NsaWNlQW5nbGVzW3BpZHhdWzBdLCBzLl9zbGljZUFuZ2xlc1twaWR4XVsxXSwgcy5oaWdobGlnaHRDb2xvcnNbcGlkeF0sIGZhbHNlKTsKICAgIH0KICAgIAogICAgZnVuY3Rpb24gdW5oaWdobGlnaHQgKHBsb3QpIHsKICAgICAgICB2YXIgY2FudmFzID0gcGxvdC5wbHVnaW5zLmRvbnV0UmVuZGVyZXIuaGlnaGxpZ2h0Q2FudmFzOwogICAgICAgIGNhbnZhcy5fY3R4LmNsZWFyUmVjdCgwLDAsIGNhbnZhcy5fY3R4LmNhbnZhcy53aWR0aCwgY2FudmFzLl9jdHguY2FudmFzLmhlaWdodCk7CiAgICAgICAgZm9yICh2YXIgaT0wOyBpPHBsb3Quc2VyaWVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIHBsb3Quc2VyaWVzW2ldLl9oaWdobGlnaHRlZFBvaW50ID0gbnVsbDsKICAgICAgICB9CiAgICAgICAgcGxvdC5wbHVnaW5zLmRvbnV0UmVuZGVyZXIuaGlnaGxpZ2h0ZWRTZXJpZXNJbmRleCA9IG51bGw7CiAgICAgICAgcGxvdC50YXJnZXQudHJpZ2dlcignanFwbG90RGF0YVVuaGlnaGxpZ2h0Jyk7CiAgICB9CiAKICAgIGZ1bmN0aW9uIGhhbmRsZU1vdmUoZXYsIGdyaWRwb3MsIGRhdGFwb3MsIG5laWdoYm9yLCBwbG90KSB7CiAgICAgICAgaWYgKG5laWdoYm9yKSB7CiAgICAgICAgICAgIHZhciBpbnMgPSBbbmVpZ2hib3Iuc2VyaWVzSW5kZXgsIG5laWdoYm9yLnBvaW50SW5kZXgsIG5laWdoYm9yLmRhdGFdOwogICAgICAgICAgICB2YXIgZXZ0MSA9IGpRdWVyeS5FdmVudCgnanFwbG90RGF0YU1vdXNlT3ZlcicpOwogICAgICAgICAgICBldnQxLnBhZ2VYID0gZXYucGFnZVg7CiAgICAgICAgICAgIGV2dDEucGFnZVkgPSBldi5wYWdlWTsKICAgICAgICAgICAgcGxvdC50YXJnZXQudHJpZ2dlcihldnQxLCBpbnMpOwogICAgICAgICAgICBpZiAocGxvdC5zZXJpZXNbaW5zWzBdXS5oaWdobGlnaHRNb3VzZU92ZXIgJiYgIShpbnNbMF0gPT0gcGxvdC5wbHVnaW5zLmRvbnV0UmVuZGVyZXIuaGlnaGxpZ2h0ZWRTZXJpZXNJbmRleCAmJiBpbnNbMV0gPT0gcGxvdC5zZXJpZXNbaW5zWzBdXS5faGlnaGxpZ2h0ZWRQb2ludCkpIHsKICAgICAgICAgICAgICAgIHZhciBldnQgPSBqUXVlcnkuRXZlbnQoJ2pxcGxvdERhdGFIaWdobGlnaHQnKTsKICAgICAgICAgICAgICAgIGV2dC5wYWdlWCA9IGV2LnBhZ2VYOwogICAgICAgICAgICAgICAgZXZ0LnBhZ2VZID0gZXYucGFnZVk7CiAgICAgICAgICAgICAgICBwbG90LnRhcmdldC50cmlnZ2VyKGV2dCwgaW5zKTsKICAgICAgICAgICAgICAgIGhpZ2hsaWdodCAocGxvdCwgaW5zWzBdLCBpbnNbMV0pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKG5laWdoYm9yID09IG51bGwpIHsKICAgICAgICAgICAgdW5oaWdobGlnaHQgKHBsb3QpOwogICAgICAgIH0KICAgIH0gCiAgICAKICAgIGZ1bmN0aW9uIGhhbmRsZU1vdXNlRG93bihldiwgZ3JpZHBvcywgZGF0YXBvcywgbmVpZ2hib3IsIHBsb3QpIHsKICAgICAgICBpZiAobmVpZ2hib3IpIHsKICAgICAgICAgICAgdmFyIGlucyA9IFtuZWlnaGJvci5zZXJpZXNJbmRleCwgbmVpZ2hib3IucG9pbnRJbmRleCwgbmVpZ2hib3IuZGF0YV07CiAgICAgICAgICAgIGlmIChwbG90LnNlcmllc1tpbnNbMF1dLmhpZ2hsaWdodE1vdXNlRG93biAmJiAhKGluc1swXSA9PSBwbG90LnBsdWdpbnMuZG9udXRSZW5kZXJlci5oaWdobGlnaHRlZFNlcmllc0luZGV4ICYmIGluc1sxXSA9PSBwbG90LnNlcmllc1tpbnNbMF1dLl9oaWdobGlnaHRlZFBvaW50KSkgewogICAgICAgICAgICAgICAgdmFyIGV2dCA9IGpRdWVyeS5FdmVudCgnanFwbG90RGF0YUhpZ2hsaWdodCcpOwogICAgICAgICAgICAgICAgZXZ0LnBhZ2VYID0gZXYucGFnZVg7CiAgICAgICAgICAgICAgICBldnQucGFnZVkgPSBldi5wYWdlWTsKICAgICAgICAgICAgICAgIHBsb3QudGFyZ2V0LnRyaWdnZXIoZXZ0LCBpbnMpOwogICAgICAgICAgICAgICAgaGlnaGxpZ2h0IChwbG90LCBpbnNbMF0sIGluc1sxXSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAobmVpZ2hib3IgPT0gbnVsbCkgewogICAgICAgICAgICB1bmhpZ2hsaWdodCAocGxvdCk7CiAgICAgICAgfQogICAgfQogICAgCiAgICBmdW5jdGlvbiBoYW5kbGVNb3VzZVVwKGV2LCBncmlkcG9zLCBkYXRhcG9zLCBuZWlnaGJvciwgcGxvdCkgewogICAgICAgIHZhciBpZHggPSBwbG90LnBsdWdpbnMuZG9udXRSZW5kZXJlci5oaWdobGlnaHRlZFNlcmllc0luZGV4OwogICAgICAgIGlmIChpZHggIT0gbnVsbCAmJiBwbG90LnNlcmllc1tpZHhdLmhpZ2hsaWdodE1vdXNlRG93bikgewogICAgICAgICAgICB1bmhpZ2hsaWdodChwbG90KTsKICAgICAgICB9CiAgICB9CiAgICAKICAgIGZ1bmN0aW9uIGhhbmRsZUNsaWNrKGV2LCBncmlkcG9zLCBkYXRhcG9zLCBuZWlnaGJvciwgcGxvdCkgewogICAgICAgIGlmIChuZWlnaGJvcikgewogICAgICAgICAgICB2YXIgaW5zID0gW25laWdoYm9yLnNlcmllc0luZGV4LCBuZWlnaGJvci5wb2ludEluZGV4LCBuZWlnaGJvci5kYXRhXTsKICAgICAgICAgICAgdmFyIGV2dCA9IGpRdWVyeS5FdmVudCgnanFwbG90RGF0YUNsaWNrJyk7CiAgICAgICAgICAgIGV2dC5wYWdlWCA9IGV2LnBhZ2VYOwogICAgICAgICAgICBldnQucGFnZVkgPSBldi5wYWdlWTsKICAgICAgICAgICAgcGxvdC50YXJnZXQudHJpZ2dlcihldnQsIGlucyk7CiAgICAgICAgfQogICAgfQogICAgCiAgICBmdW5jdGlvbiBoYW5kbGVSaWdodENsaWNrKGV2LCBncmlkcG9zLCBkYXRhcG9zLCBuZWlnaGJvciwgcGxvdCkgewogICAgICAgIGlmIChuZWlnaGJvcikgewogICAgICAgICAgICB2YXIgaW5zID0gW25laWdoYm9yLnNlcmllc0luZGV4LCBuZWlnaGJvci5wb2ludEluZGV4LCBuZWlnaGJvci5kYXRhXTsKICAgICAgICAgICAgdmFyIGlkeCA9IHBsb3QucGx1Z2lucy5kb251dFJlbmRlcmVyLmhpZ2hsaWdodGVkU2VyaWVzSW5kZXg7CiAgICAgICAgICAgIGlmIChpZHggIT0gbnVsbCAmJiBwbG90LnNlcmllc1tpZHhdLmhpZ2hsaWdodE1vdXNlRG93bikgewogICAgICAgICAgICAgICAgdW5oaWdobGlnaHQocGxvdCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIGV2dCA9IGpRdWVyeS5FdmVudCgnanFwbG90RGF0YVJpZ2h0Q2xpY2snKTsKICAgICAgICAgICAgZXZ0LnBhZ2VYID0gZXYucGFnZVg7CiAgICAgICAgICAgIGV2dC5wYWdlWSA9IGV2LnBhZ2VZOwogICAgICAgICAgICBwbG90LnRhcmdldC50cmlnZ2VyKGV2dCwgaW5zKTsKICAgICAgICB9CiAgICB9ICAgIAogICAgCiAgICAvLyBjYWxsZWQgd2l0aGluIGNvbnRleHQgb2YgcGxvdAogICAgLy8gY3JlYXRlIGEgY2FudmFzIHdoaWNoIHdlIGNhbiBkcmF3IG9uLgogICAgLy8gaW5zZXJ0IGl0IGJlZm9yZSB0aGUgZXZlbnRDYW52YXMsIHNvIGV2ZW50Q2FudmFzIHdpbGwgc3RpbGwgY2FwdHVyZSBldmVudHMuCiAgICBmdW5jdGlvbiBwb3N0UGxvdERyYXcoKSB7CiAgICAgICAgLy8gTWVtb3J5IExlYWtzIHBhdGNoICAgIAogICAgICAgIGlmICh0aGlzLnBsdWdpbnMuZG9udXRSZW5kZXJlciAmJiB0aGlzLnBsdWdpbnMuZG9udXRSZW5kZXJlci5oaWdobGlnaHRDYW52YXMpIHsKICAgICAgICAgICAgdGhpcy5wbHVnaW5zLmRvbnV0UmVuZGVyZXIuaGlnaGxpZ2h0Q2FudmFzLnJlc2V0Q2FudmFzKCk7CiAgICAgICAgICAgIHRoaXMucGx1Z2lucy5kb251dFJlbmRlcmVyLmhpZ2hsaWdodENhbnZhcyA9IG51bGw7CiAgICAgICAgfQoKICAgICAgICB0aGlzLnBsdWdpbnMuZG9udXRSZW5kZXJlciA9IHtoaWdobGlnaHRlZFNlcmllc0luZGV4Om51bGx9OwogICAgICAgIHRoaXMucGx1Z2lucy5kb251dFJlbmRlcmVyLmhpZ2hsaWdodENhbnZhcyA9IG5ldyAkLmpxcGxvdC5HZW5lcmljQ2FudmFzKCk7CiAgICAgICAgLy8gZG8gd2UgaGF2ZSBhbnkgZGF0YSBsYWJlbHM/ICBpZiBzbywgcHV0IGhpZ2hsaWdodCBjYW52YXMgYmVmb3JlIHRob3NlCiAgICAgICAgLy8gRml4IGZvciBicm9rZW4ganF1ZXJ5IDpmaXJzdCBzZWxlY3RvciB3aXRoIGNhbnZhcyAoVk1MKSBlbGVtZW50cy4KICAgICAgICB2YXIgbGFiZWxzID0gJCh0aGlzLnRhcmdldElkKycgLmpxcGxvdC1kYXRhLWxhYmVsJyk7CiAgICAgICAgaWYgKGxhYmVscy5sZW5ndGgpIHsKICAgICAgICAgICAgJChsYWJlbHNbMF0pLmJlZm9yZSh0aGlzLnBsdWdpbnMuZG9udXRSZW5kZXJlci5oaWdobGlnaHRDYW52YXMuY3JlYXRlRWxlbWVudCh0aGlzLl9ncmlkUGFkZGluZywgJ2pxcGxvdC1kb251dFJlbmRlcmVyLWhpZ2hsaWdodC1jYW52YXMnLCB0aGlzLl9wbG90RGltZW5zaW9ucywgdGhpcykpOwogICAgICAgIH0KICAgICAgICAvLyBlbHNlIHB1dCBoaWdobGlnaHQgY2FudmFzIGJlZm9yZSBldmVudCBjYW52YXMuCiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHRoaXMuZXZlbnRDYW52YXMuX2VsZW0uYmVmb3JlKHRoaXMucGx1Z2lucy5kb251dFJlbmRlcmVyLmhpZ2hsaWdodENhbnZhcy5jcmVhdGVFbGVtZW50KHRoaXMuX2dyaWRQYWRkaW5nLCAnanFwbG90LWRvbnV0UmVuZGVyZXItaGlnaGxpZ2h0LWNhbnZhcycsIHRoaXMuX3Bsb3REaW1lbnNpb25zLCB0aGlzKSk7CiAgICAgICAgfQogICAgICAgIHZhciBoY3R4ID0gdGhpcy5wbHVnaW5zLmRvbnV0UmVuZGVyZXIuaGlnaGxpZ2h0Q2FudmFzLnNldENvbnRleHQoKTsKICAgICAgICB0aGlzLmV2ZW50Q2FudmFzLl9lbGVtLmJpbmQoJ21vdXNlbGVhdmUnLCB7cGxvdDp0aGlzfSwgZnVuY3Rpb24gKGV2KSB7IHVuaGlnaGxpZ2h0KGV2LmRhdGEucGxvdCk7IH0pOwogICAgfQogICAgCiAgICAkLmpxcGxvdC5wcmVJbml0SG9va3MucHVzaChwcmVJbml0KTsKICAgIAogICAgJC5qcXBsb3QuRG9udXRUaWNrUmVuZGVyZXIgPSBmdW5jdGlvbigpIHsKICAgICAgICAkLmpxcGxvdC5BeGlzVGlja1JlbmRlcmVyLmNhbGwodGhpcyk7CiAgICB9OwogICAgCiAgICAkLmpxcGxvdC5Eb251dFRpY2tSZW5kZXJlci5wcm90b3R5cGUgPSBuZXcgJC5qcXBsb3QuQXhpc1RpY2tSZW5kZXJlcigpOwogICAgJC5qcXBsb3QuRG9udXRUaWNrUmVuZGVyZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gJC5qcXBsb3QuRG9udXRUaWNrUmVuZGVyZXI7CiAgICAKfSkoalF1ZXJ5KTsKICAgIAogICAg]]></data>
	</file>
	<file>
	  <filename>/src/plugins/jqplot.donutRenderer.min.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqCiAqIGpxUGxvdAogKiBQdXJlIEphdmFTY3JpcHQgcGxvdHRpbmcgcGx1Z2luIHVzaW5nIGpRdWVyeQogKgogKiBWZXJzaW9uOiAxLjAuMGIyX3IxMDEyCiAqCiAqIENvcHlyaWdodCAoYykgMjAwOS0yMDExIENocmlzIExlb25lbGxvCiAqIGpxUGxvdCBpcyBjdXJyZW50bHkgYXZhaWxhYmxlIGZvciB1c2UgaW4gYWxsIHBlcnNvbmFsIG9yIGNvbW1lcmNpYWwgcHJvamVjdHMgCiAqIHVuZGVyIGJvdGggdGhlIE1JVCAoaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHApIGFuZCBHUEwgCiAqIHZlcnNpb24gMi4wIChodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC5odG1sKSBsaWNlbnNlcy4gVGhpcyBtZWFucyB0aGF0IHlvdSBjYW4gCiAqIGNob29zZSB0aGUgbGljZW5zZSB0aGF0IGJlc3Qgc3VpdHMgeW91ciBwcm9qZWN0IGFuZCB1c2UgaXQgYWNjb3JkaW5nbHkuIAogKgogKiBBbHRob3VnaCBub3QgcmVxdWlyZWQsIHRoZSBhdXRob3Igd291bGQgYXBwcmVjaWF0ZSBhbiBlbWFpbCBsZXR0aW5nIGhpbSAKICoga25vdyBvZiBhbnkgc3Vic3RhbnRpYWwgdXNlIG9mIGpxUGxvdC4gIFlvdSBjYW4gcmVhY2ggdGhlIGF1dGhvciBhdDogCiAqIGNocmlzIGF0IGpxcGxvdCBkb3QgY29tIG9yIHNlZSBodHRwOi8vd3d3LmpxcGxvdC5jb20vaW5mby5waHAgLgogKgogKiBJZiB5b3UgYXJlIGZlZWxpbmcga2luZCBhbmQgZ2VuZXJvdXMsIGNvbnNpZGVyIHN1cHBvcnRpbmcgdGhlIHByb2plY3QgYnkKICogbWFraW5nIGEgZG9uYXRpb24gYXQ6IGh0dHA6Ly93d3cuanFwbG90LmNvbS9kb25hdGUucGhwIC4KICoKICogc3ByaW50ZiBmdW5jdGlvbnMgY29udGFpbmVkIGluIGpxcGxvdC5zcHJpbnRmLmpzIGJ5IEFzaCBTZWFybGU6CiAqCiAqICAgICB2ZXJzaW9uIDIwMDcuMDQuMjcKICogICAgIGF1dGhvciBBc2ggU2VhcmxlCiAqICAgICBodHRwOi8vaGV4bWVuLmNvbS9ibG9nLzIwMDcvMDMvcHJpbnRmLXNwcmludGYvCiAqICAgICBodHRwOi8vaGV4bWVuLmNvbS9qcy9zcHJpbnRmLmpzCiAqICAgICBUaGUgYXV0aG9yIChBc2ggU2VhcmxlKSBoYXMgcGxhY2VkIHRoaXMgY29kZSBpbiB0aGUgcHVibGljIGRvbWFpbjoKICogICAgICJUaGlzIGNvZGUgaXMgdW5yZXN0cmljdGVkOiB5b3UgYXJlIGZyZWUgdG8gdXNlIGl0IGhvd2V2ZXIgeW91IGxpa2UuIgogKgogKiBpbmNsdWRlZCBqc0RhdGUgbGlicmFyeSBieSBDaHJpcyBMZW9uZWxsbzoKICoKICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEgQ2hyaXMgTGVvbmVsbG8KICoKICoganNEYXRlIGlzIGN1cnJlbnRseSBhdmFpbGFibGUgZm9yIHVzZSBpbiBhbGwgcGVyc29uYWwgb3IgY29tbWVyY2lhbCBwcm9qZWN0cyAKICogdW5kZXIgYm90aCB0aGUgTUlUIGFuZCBHUEwgdmVyc2lvbiAyLjAgbGljZW5zZXMuIFRoaXMgbWVhbnMgdGhhdCB5b3UgY2FuIAogKiBjaG9vc2UgdGhlIGxpY2Vuc2UgdGhhdCBiZXN0IHN1aXRzIHlvdXIgcHJvamVjdCBhbmQgdXNlIGl0IGFjY29yZGluZ2x5LgogKgogKiBqc0RhdGUgYm9ycm93cyBtYW55IGNvbmNlcHRzIGFuZCBpZGVhcyBmcm9tIHRoZSBEYXRlIEluc3RhbmNlIAogKiBNZXRob2RzIGJ5IEtlbiBTbnlkZXIgYWxvbmcgd2l0aCBzb21lIHBhcnRzIG9mIEtlbidzIGFjdHVhbCBjb2RlLgogKiAKICogS2VuJ3Mgb3JpZ2lhbmwgRGF0ZSBJbnN0YW5jZSBNZXRob2RzIGFuZCBjb3B5cmlnaHQgbm90aWNlOgogKiAKICogS2VuIFNueWRlciAoa2VuIGQgc255ZGVyIGF0IGdtYWlsIGRvdCBjb20pCiAqIDIwMDgtMDktMTAKICogdmVyc2lvbiAyLjAuMiAoaHR0cDovL2tlbmRzbnlkZXIuY29tL3NhbmRib3gvZGF0ZS8pICAgICAKICogQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbiBMaWNlbnNlIDMuMCAoaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnkvMy4wLykKICoKICoganFwbG90VG9JbWFnZSBmdW5jdGlvbiBiYXNlZCBvbiBMYXJyeSBTaWRlbidzIGV4cG9ydC1qcXBsb3QtdG8tcG5nLmpzLgogKiBMYXJyeSBoYXMgZ2VuZXJvdXNseSBnaXZlbiBwZXJtaXNzaW9uIHRvIGFkYXB0IGhpcyBjb2RlIGZvciBpbmNsdXNpb24KICogaW50byBqcVBsb3QuCiAqCiAqIExhcnJ5J3Mgb3JpZ2luYWwgY29kZSBjYW4gYmUgZm91bmQgaGVyZToKICoKICogaHR0cHM6Ly9naXRodWIuY29tL2xzaWRlbi9leHBvcnQtanFwbG90LXRvLXBuZwogKiAKICogCiAqLwooZnVuY3Rpb24oZSl7ZS5qcXBsb3QuRG9udXRSZW5kZXJlcj1mdW5jdGlvbigpe2UuanFwbG90LkxpbmVSZW5kZXJlci5jYWxsKHRoaXMpfTtlLmpxcGxvdC5Eb251dFJlbmRlcmVyLnByb3RvdHlwZT1uZXcgZS5qcXBsb3QuTGluZVJlbmRlcmVyKCk7ZS5qcXBsb3QuRG9udXRSZW5kZXJlci5wcm90b3R5cGUuY29uc3RydWN0b3I9ZS5qcXBsb3QuRG9udXRSZW5kZXJlcjtlLmpxcGxvdC5Eb251dFJlbmRlcmVyLnByb3RvdHlwZS5pbml0PWZ1bmN0aW9uKHAsdCl7dGhpcy5kaWFtZXRlcj1udWxsO3RoaXMuaW5uZXJEaWFtZXRlcj1udWxsO3RoaXMudGhpY2tuZXNzPW51bGw7dGhpcy5wYWRkaW5nPTIwO3RoaXMuc2xpY2VNYXJnaW49MDt0aGlzLnJpbmdNYXJnaW49bnVsbDt0aGlzLmZpbGw9dHJ1ZTt0aGlzLnNoYWRvd09mZnNldD0yO3RoaXMuc2hhZG93QWxwaGE9MC4wNzt0aGlzLnNoYWRvd0RlcHRoPTU7dGhpcy5oaWdobGlnaHRNb3VzZU92ZXI9dHJ1ZTt0aGlzLmhpZ2hsaWdodE1vdXNlRG93bj1mYWxzZTt0aGlzLmhpZ2hsaWdodENvbG9ycz1bXTt0aGlzLmRhdGFMYWJlbHM9InBlcmNlbnQiO3RoaXMuc2hvd0RhdGFMYWJlbHM9ZmFsc2U7dGhpcy5kYXRhTGFiZWxGb3JtYXRTdHJpbmc9bnVsbDt0aGlzLmRhdGFMYWJlbFRocmVzaG9sZD0zO3RoaXMuZGF0YUxhYmVsUG9zaXRpb25GYWN0b3I9MC40O3RoaXMuZGF0YUxhYmVsTnVkZ2U9MDt0aGlzLnN0YXJ0QW5nbGU9MDt0aGlzLnRpY2tSZW5kZXJlcj1lLmpxcGxvdC5Eb251dFRpY2tSZW5kZXJlcjt0aGlzLl9kcmF3RGF0YT10cnVlO3RoaXMuX3R5cGU9ImRvbnV0IjtpZihwLmhpZ2hsaWdodE1vdXNlRG93biYmcC5oaWdobGlnaHRNb3VzZU92ZXI9PW51bGwpe3AuaGlnaGxpZ2h0TW91c2VPdmVyPWZhbHNlfWUuZXh0ZW5kKHRydWUsdGhpcyxwKTtpZih0aGlzLmRpYW1ldGVyIT1udWxsKXt0aGlzLmRpYW1ldGVyPXRoaXMuZGlhbWV0ZXItdGhpcy5zbGljZU1hcmdpbn10aGlzLl9kaWFtZXRlcj1udWxsO3RoaXMuX2lubmVyRGlhbWV0ZXI9bnVsbDt0aGlzLl9yYWRpdXM9bnVsbDt0aGlzLl9pbm5lclJhZGl1cz1udWxsO3RoaXMuX3RoaWNrbmVzcz1udWxsO3RoaXMuX3ByZXZpb3VzU2VyaWVzPVtdO3RoaXMuX251bWJlclNlcmllcz0xO3RoaXMuX3NsaWNlQW5nbGVzPVtdO3RoaXMuX2hpZ2hsaWdodGVkUG9pbnQ9bnVsbDtpZih0aGlzLmhpZ2hsaWdodENvbG9ycy5sZW5ndGg9PTApe2Zvcih2YXIgcj0wO3I8dGhpcy5zZXJpZXNDb2xvcnMubGVuZ3RoO3IrKyl7dmFyIHE9ZS5qcXBsb3QuZ2V0Q29sb3JDb21wb25lbnRzKHRoaXMuc2VyaWVzQ29sb3JzW3JdKTt2YXIgbj1bcVswXSxxWzFdLHFbMl1dO3ZhciBzPW5bMF0rblsxXStuWzJdO2Zvcih2YXIgbz0wO288MztvKyspe25bb109KHM+NTcwKT9uW29dKjAuODpuW29dKzAuMyooMjU1LW5bb10pO25bb109cGFyc2VJbnQobltvXSwxMCl9dGhpcy5oaWdobGlnaHRDb2xvcnMucHVzaCgicmdiKCIrblswXSsiLCIrblsxXSsiLCIrblsyXSsiKSIpfX10LnBvc3RQYXJzZU9wdGlvbnNIb29rcy5hZGRPbmNlKGwpO3QucG9zdEluaXRIb29rcy5hZGRPbmNlKGcpO3QuZXZlbnRMaXN0ZW5lckhvb2tzLmFkZE9uY2UoImpxcGxvdE1vdXNlTW92ZSIsYik7dC5ldmVudExpc3RlbmVySG9va3MuYWRkT25jZSgianFwbG90TW91c2VEb3duIixhKTt0LmV2ZW50TGlzdGVuZXJIb29rcy5hZGRPbmNlKCJqcXBsb3RNb3VzZVVwIixqKTt0LmV2ZW50TGlzdGVuZXJIb29rcy5hZGRPbmNlKCJqcXBsb3RDbGljayIsZik7dC5ldmVudExpc3RlbmVySG9va3MuYWRkT25jZSgianFwbG90UmlnaHRDbGljayIsbSk7dC5wb3N0RHJhd0hvb2tzLmFkZE9uY2UoaCl9O2UuanFwbG90LkRvbnV0UmVuZGVyZXIucHJvdG90eXBlLnNldEdyaWREYXRhPWZ1bmN0aW9uKHMpe3ZhciBvPVtdO3ZhciB0PVtdO3ZhciBuPXRoaXMuc3RhcnRBbmdsZS8xODAqTWF0aC5QSTt2YXIgcj0wO3RoaXMuX2RyYXdEYXRhPWZhbHNlO2Zvcih2YXIgcT0wO3E8dGhpcy5kYXRhLmxlbmd0aDtxKyspe2lmKHRoaXMuZGF0YVtxXVsxXSE9MCl7dGhpcy5fZHJhd0RhdGE9dHJ1ZX1vLnB1c2godGhpcy5kYXRhW3FdWzFdKTt0LnB1c2goW3RoaXMuZGF0YVtxXVswXV0pO2lmKHE+MCl7b1txXSs9b1txLTFdfXIrPXRoaXMuZGF0YVtxXVsxXX12YXIgcD1NYXRoLlBJKjIvb1tvLmxlbmd0aC0xXTtmb3IodmFyIHE9MDtxPG8ubGVuZ3RoO3ErKyl7dFtxXVsxXT1vW3FdKnA7dFtxXVsyXT10aGlzLmRhdGFbcV1bMV0vcn10aGlzLmdyaWREYXRhPXR9O2UuanFwbG90LkRvbnV0UmVuZGVyZXIucHJvdG90eXBlLm1ha2VHcmlkRGF0YT1mdW5jdGlvbihzLHQpe3ZhciBvPVtdO3ZhciB1PVtdO3ZhciByPTA7dmFyIG49dGhpcy5zdGFydEFuZ2xlLzE4MCpNYXRoLlBJO3RoaXMuX2RyYXdEYXRhPWZhbHNlO2Zvcih2YXIgcT0wO3E8cy5sZW5ndGg7cSsrKXtpZih0aGlzLmRhdGFbcV1bMV0hPTApe3RoaXMuX2RyYXdEYXRhPXRydWV9by5wdXNoKHNbcV1bMV0pO3UucHVzaChbc1txXVswXV0pO2lmKHE+MCl7b1txXSs9b1txLTFdfXIrPXNbcV1bMV19dmFyIHA9TWF0aC5QSSoyL29bby5sZW5ndGgtMV07Zm9yKHZhciBxPTA7cTxvLmxlbmd0aDtxKyspe3VbcV1bMV09b1txXSpwO3VbcV1bMl09c1txXVsxXS9yfXJldHVybiB1fTtlLmpxcGxvdC5Eb251dFJlbmRlcmVyLnByb3RvdHlwZS5kcmF3U2xpY2U9ZnVuY3Rpb24oeCx1LHQscCxzKXt2YXIgbj10aGlzLl9kaWFtZXRlci8yO3ZhciB2PW4tdGhpcy5fdGhpY2tuZXNzO3ZhciB3PXRoaXMuZmlsbDt4LnNhdmUoKTt4LnRyYW5zbGF0ZSh0aGlzLl9jZW50ZXJbMF0sdGhpcy5fY2VudGVyWzFdKTtpZihzKXtmb3IodmFyIHE9MDtxPHRoaXMuc2hhZG93RGVwdGg7cSsrKXt4LnNhdmUoKTt4LnRyYW5zbGF0ZSh0aGlzLnNoYWRvd09mZnNldCpNYXRoLmNvcyh0aGlzLnNoYWRvd0FuZ2xlLzE4MCpNYXRoLlBJKSx0aGlzLnNoYWRvd09mZnNldCpNYXRoLnNpbih0aGlzLnNoYWRvd0FuZ2xlLzE4MCpNYXRoLlBJKSk7bygpfX1lbHNle28oKX1mdW5jdGlvbiBvKCl7aWYodD42LjI4Mit0aGlzLnN0YXJ0QW5nbGUpe3Q9Ni4yODIrdGhpcy5zdGFydEFuZ2xlO2lmKHU+dCl7dT02LjI4MSt0aGlzLnN0YXJ0QW5nbGV9fWlmKHU+PXQpe3JldHVybn14LmJlZ2luUGF0aCgpO3guZmlsbFN0eWxlPXA7eC5zdHJva2VTdHlsZT1wO3guYXJjKDAsMCxuLHUsdCxmYWxzZSk7eC5saW5lVG8odipNYXRoLmNvcyh0KSx2Kk1hdGguc2luKHQpKTt4LmFyYygwLDAsdix0LHUsdHJ1ZSk7eC5jbG9zZVBhdGgoKTtpZih3KXt4LmZpbGwoKX1lbHNle3guc3Ryb2tlKCl9fWlmKHMpe2Zvcih2YXIgcT0wO3E8dGhpcy5zaGFkb3dEZXB0aDtxKyspe3gucmVzdG9yZSgpfX14LnJlc3RvcmUoKX07ZS5qcXBsb3QuRG9udXRSZW5kZXJlci5wcm90b3R5cGUuZHJhdz1mdW5jdGlvbihOLFYsdCxQKXt2YXIgUTt2YXIgSj0odCE9dW5kZWZpbmVkKT90Ont9O3ZhciBxPTA7dmFyIHA9MDt2YXIgdT0xO2lmKHQubGVnZW5kSW5mbyYmdC5sZWdlbmRJbmZvLnBsYWNlbWVudD09Imluc2lkZUdyaWQiKXt2YXIgST10LmxlZ2VuZEluZm87c3dpdGNoKEkubG9jYXRpb24pe2Nhc2UibnciOnE9SS53aWR0aCtJLnhvZmZzZXQ7YnJlYWs7Y2FzZSJ3IjpxPUkud2lkdGgrSS54b2Zmc2V0O2JyZWFrO2Nhc2Uic3ciOnE9SS53aWR0aCtJLnhvZmZzZXQ7YnJlYWs7Y2FzZSJuZSI6cT1JLndpZHRoK0kueG9mZnNldDt1PS0xO2JyZWFrO2Nhc2UiZSI6cT1JLndpZHRoK0kueG9mZnNldDt1PS0xO2JyZWFrO2Nhc2Uic2UiOnE9SS53aWR0aCtJLnhvZmZzZXQ7dT0tMTticmVhaztjYXNlIm4iOnA9SS5oZWlnaHQrSS55b2Zmc2V0O2JyZWFrO2Nhc2UicyI6cD1JLmhlaWdodCtJLnlvZmZzZXQ7dT0tMTticmVhaztkZWZhdWx0OmJyZWFrfX12YXIgQj0oSi5zaGFkb3chPXVuZGVmaW5lZCk/Si5zaGFkb3c6dGhpcy5zaGFkb3c7dmFyIFc9KEouc2hvd0xpbmUhPXVuZGVmaW5lZCk/Si5zaG93TGluZTp0aGlzLnNob3dMaW5lO3ZhciBPPShKLmZpbGwhPXVuZGVmaW5lZCk/Si5maWxsOnRoaXMuZmlsbDt2YXIgcz1OLmNhbnZhcy53aWR0aDt2YXIgSD1OLmNhbnZhcy5oZWlnaHQ7dmFyIEc9cy1xLTIqdGhpcy5wYWRkaW5nO3ZhciBSPUgtcC0yKnRoaXMucGFkZGluZzt2YXIgdj1NYXRoLm1pbihHLFIpO3ZhciBUPXY7dmFyIFg9KHRoaXMucmluZ01hcmdpbj09bnVsbCk/dGhpcy5zbGljZU1hcmdpbioyOnRoaXMucmluZ01hcmdpbjtmb3IodmFyIFE9MDtRPHRoaXMuX3ByZXZpb3VzU2VyaWVzLmxlbmd0aDtRKyspe1QtPTIqdGhpcy5fcHJldmlvdXNTZXJpZXNbUV0uX3RoaWNrbmVzcysyKlh9dGhpcy5fZGlhbWV0ZXI9dGhpcy5kaWFtZXRlcnx8VDtpZih0aGlzLmlubmVyRGlhbWV0ZXIhPW51bGwpe3ZhciBNPSh0aGlzLl9udW1iZXJTZXJpZXM+MSYmdGhpcy5pbmRleD4wKT90aGlzLl9wcmV2aW91c1Nlcmllc1swXS5fZGlhbWV0ZXI6dGhpcy5fZGlhbWV0ZXI7dGhpcy5fdGhpY2tuZXNzPXRoaXMudGhpY2tuZXNzfHwoTS10aGlzLmlubmVyRGlhbWV0ZXItMipYKnRoaXMuX251bWJlclNlcmllcykvdGhpcy5fbnVtYmVyU2VyaWVzLzJ9ZWxzZXt0aGlzLl90aGlja25lc3M9dGhpcy50aGlja25lc3N8fHYvMi8odGhpcy5fbnVtYmVyU2VyaWVzKzEpKjAuODV9dmFyIEs9dGhpcy5fcmFkaXVzPXRoaXMuX2RpYW1ldGVyLzI7dGhpcy5faW5uZXJSYWRpdXM9dGhpcy5fcmFkaXVzLXRoaXMuX3RoaWNrbmVzczt2YXIgbz10aGlzLnN0YXJ0QW5nbGUvMTgwKk1hdGguUEk7dGhpcy5fY2VudGVyPVsocy11KnEpLzIrdSpxLChILXUqcCkvMit1KnBdO2lmKHRoaXMuc2hhZG93KXt2YXIgTD0icmdiYSgwLDAsMCwiK3RoaXMuc2hhZG93QWxwaGErIikiO2Zvcih2YXIgUT0wO1E8Vi5sZW5ndGg7USsrKXt2YXIgQT0oUT09MCk/bzpWW1EtMV1bMV0rbztBKz10aGlzLnNsaWNlTWFyZ2luLzE4MCpNYXRoLlBJO3RoaXMucmVuZGVyZXIuZHJhd1NsaWNlLmNhbGwodGhpcyxOLEEsVltRXVsxXStvLEwsdHJ1ZSl9fWZvcih2YXIgUT0wO1E8Vi5sZW5ndGg7USsrKXt2YXIgQT0oUT09MCk/bzpWW1EtMV1bMV0rbztBKz10aGlzLnNsaWNlTWFyZ2luLzE4MCpNYXRoLlBJO3ZhciB6PVZbUV1bMV0rbzt0aGlzLl9zbGljZUFuZ2xlcy5wdXNoKFtBLHpdKTt0aGlzLnJlbmRlcmVyLmRyYXdTbGljZS5jYWxsKHRoaXMsTixBLHosdGhpcy5zZXJpZXNDb2xvcnNbUV0sZmFsc2UpO2lmKHRoaXMuc2hvd0RhdGFMYWJlbHMmJlZbUV1bMl0qMTAwPj10aGlzLmRhdGFMYWJlbFRocmVzaG9sZCl7dmFyIFMsVT0oQSt6KS8yLEM7aWYodGhpcy5kYXRhTGFiZWxzPT0ibGFiZWwiKXtTPXRoaXMuZGF0YUxhYmVsRm9ybWF0U3RyaW5nfHwiJXMiO0M9ZS5qcXBsb3Quc3ByaW50ZihTLFZbUV1bMF0pfWVsc2V7aWYodGhpcy5kYXRhTGFiZWxzPT0idmFsdWUiKXtTPXRoaXMuZGF0YUxhYmVsRm9ybWF0U3RyaW5nfHwiJWQiO0M9ZS5qcXBsb3Quc3ByaW50ZihTLHRoaXMuZGF0YVtRXVsxXSl9ZWxzZXtpZih0aGlzLmRhdGFMYWJlbHM9PSJwZXJjZW50Iil7Uz10aGlzLmRhdGFMYWJlbEZvcm1hdFN0cmluZ3x8IiVkJSUiO0M9ZS5qcXBsb3Quc3ByaW50ZihTLFZbUV1bMl0qMTAwKX1lbHNle2lmKHRoaXMuZGF0YUxhYmVscy5jb25zdHJ1Y3Rvcj09QXJyYXkpe1M9dGhpcy5kYXRhTGFiZWxGb3JtYXRTdHJpbmd8fCIlcyI7Qz1lLmpxcGxvdC5zcHJpbnRmKFMsdGhpcy5kYXRhTGFiZWxzW1FdKX19fX12YXIgbj10aGlzLl9pbm5lclJhZGl1cyt0aGlzLl90aGlja25lc3MqdGhpcy5kYXRhTGFiZWxQb3NpdGlvbkZhY3Rvcit0aGlzLnNsaWNlTWFyZ2luK3RoaXMuZGF0YUxhYmVsTnVkZ2U7dmFyIEY9dGhpcy5fY2VudGVyWzBdK01hdGguY29zKFUpKm4rdGhpcy5jYW52YXMuX29mZnNldHMubGVmdDt2YXIgRT10aGlzLl9jZW50ZXJbMV0rTWF0aC5zaW4oVSkqbit0aGlzLmNhbnZhcy5fb2Zmc2V0cy50b3A7dmFyIEQ9ZSgnPHNwYW4gY2xhc3M9ImpxcGxvdC1kb251dC1zZXJpZXMganFwbG90LWRhdGEtbGFiZWwiIHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTsiPicrQysiPC9zcGFuPiIpLmluc2VydEJlZm9yZShQLmV2ZW50Q2FudmFzLl9lbGVtKTtGLT1ELndpZHRoKCkvMjtFLT1ELmhlaWdodCgpLzI7Rj1NYXRoLnJvdW5kKEYpO0U9TWF0aC5yb3VuZChFKTtELmNzcyh7bGVmdDpGLHRvcDpFfSl9fX07ZS5qcXBsb3QuRG9udXRBeGlzUmVuZGVyZXI9ZnVuY3Rpb24oKXtlLmpxcGxvdC5MaW5lYXJBeGlzUmVuZGVyZXIuY2FsbCh0aGlzKX07ZS5qcXBsb3QuRG9udXRBeGlzUmVuZGVyZXIucHJvdG90eXBlPW5ldyBlLmpxcGxvdC5MaW5lYXJBeGlzUmVuZGVyZXIoKTtlLmpxcGxvdC5Eb251dEF4aXNSZW5kZXJlci5wcm90b3R5cGUuY29uc3RydWN0b3I9ZS5qcXBsb3QuRG9udXRBeGlzUmVuZGVyZXI7ZS5qcXBsb3QuRG9udXRBeGlzUmVuZGVyZXIucHJvdG90eXBlLmluaXQ9ZnVuY3Rpb24obil7dGhpcy50aWNrUmVuZGVyZXI9ZS5qcXBsb3QuRG9udXRUaWNrUmVuZGVyZXI7ZS5leHRlbmQodHJ1ZSx0aGlzLG4pO3RoaXMuX2RhdGFCb3VuZHM9e21pbjowLG1heDoxMDB9O3RoaXMubWluPTA7dGhpcy5tYXg9MTAwO3RoaXMuc2hvd1RpY2tzPWZhbHNlO3RoaXMudGlja3M9W107dGhpcy5zaG93TWFyaz1mYWxzZTt0aGlzLnNob3c9ZmFsc2V9O2UuanFwbG90LkRvbnV0TGVnZW5kUmVuZGVyZXI9ZnVuY3Rpb24oKXtlLmpxcGxvdC5UYWJsZUxlZ2VuZFJlbmRlcmVyLmNhbGwodGhpcyl9O2UuanFwbG90LkRvbnV0TGVnZW5kUmVuZGVyZXIucHJvdG90eXBlPW5ldyBlLmpxcGxvdC5UYWJsZUxlZ2VuZFJlbmRlcmVyKCk7ZS5qcXBsb3QuRG9udXRMZWdlbmRSZW5kZXJlci5wcm90b3R5cGUuY29uc3RydWN0b3I9ZS5qcXBsb3QuRG9udXRMZWdlbmRSZW5kZXJlcjtlLmpxcGxvdC5Eb251dExlZ2VuZFJlbmRlcmVyLnByb3RvdHlwZS5pbml0PWZ1bmN0aW9uKG4pe3RoaXMubnVtYmVyUm93cz1udWxsO3RoaXMubnVtYmVyQ29sdW1ucz1udWxsO2UuZXh0ZW5kKHRydWUsdGhpcyxuKX07ZS5qcXBsb3QuRG9udXRMZWdlbmRSZW5kZXJlci5wcm90b3R5cGUuZHJhdz1mdW5jdGlvbigpe3ZhciBxPXRoaXM7aWYodGhpcy5zaG93KXt2YXIgeT10aGlzLl9zZXJpZXM7dmFyIEI9InBvc2l0aW9uOmFic29sdXRlOyI7Qis9KHRoaXMuYmFja2dyb3VuZCk/ImJhY2tncm91bmQ6Iit0aGlzLmJhY2tncm91bmQrIjsiOiIiO0IrPSh0aGlzLmJvcmRlcik/ImJvcmRlcjoiK3RoaXMuYm9yZGVyKyI7IjoiIjtCKz0odGhpcy5mb250U2l6ZSk/ImZvbnQtc2l6ZToiK3RoaXMuZm9udFNpemUrIjsiOiIiO0IrPSh0aGlzLmZvbnRGYW1pbHkpPyJmb250LWZhbWlseToiK3RoaXMuZm9udEZhbWlseSsiOyI6IiI7Qis9KHRoaXMudGV4dENvbG9yKT8iY29sb3I6Iit0aGlzLnRleHRDb2xvcisiOyI6IiI7Qis9KHRoaXMubWFyZ2luVG9wIT1udWxsKT8ibWFyZ2luLXRvcDoiK3RoaXMubWFyZ2luVG9wKyI7IjoiIjtCKz0odGhpcy5tYXJnaW5Cb3R0b20hPW51bGwpPyJtYXJnaW4tYm90dG9tOiIrdGhpcy5tYXJnaW5Cb3R0b20rIjsiOiIiO0IrPSh0aGlzLm1hcmdpbkxlZnQhPW51bGwpPyJtYXJnaW4tbGVmdDoiK3RoaXMubWFyZ2luTGVmdCsiOyI6IiI7Qis9KHRoaXMubWFyZ2luUmlnaHQhPW51bGwpPyJtYXJnaW4tcmlnaHQ6Iit0aGlzLm1hcmdpblJpZ2h0KyI7IjoiIjt0aGlzLl9lbGVtPWUoJzx0YWJsZSBjbGFzcz0ianFwbG90LXRhYmxlLWxlZ2VuZCIgc3R5bGU9IicrQisnIj48L3RhYmxlPicpO3ZhciBGPWZhbHNlLHg9ZmFsc2Usbix2O3ZhciB6PXlbMF07dmFyIG89bmV3IGUuanFwbG90LkNvbG9yR2VuZXJhdG9yKHouc2VyaWVzQ29sb3JzKTtpZih6LnNob3cpe3ZhciBHPXouZGF0YTtpZih0aGlzLm51bWJlclJvd3Mpe249dGhpcy5udW1iZXJSb3dzO2lmKCF0aGlzLm51bWJlckNvbHVtbnMpe3Y9TWF0aC5jZWlsKEcubGVuZ3RoL24pfWVsc2V7dj10aGlzLm51bWJlckNvbHVtbnN9fWVsc2V7aWYodGhpcy5udW1iZXJDb2x1bW5zKXt2PXRoaXMubnVtYmVyQ29sdW1ucztuPU1hdGguY2VpbChHLmxlbmd0aC90aGlzLm51bWJlckNvbHVtbnMpfWVsc2V7bj1HLmxlbmd0aDt2PTF9fXZhciBFLEQscCx0LHIsdSx3LEM7dmFyIEE9MDtmb3IoRT0wO0U8bjtFKyspe2lmKHgpe3A9ZSgnPHRyIGNsYXNzPSJqcXBsb3QtdGFibGUtbGVnZW5kIj48L3RyPicpLnByZXBlbmRUbyh0aGlzLl9lbGVtKX1lbHNle3A9ZSgnPHRyIGNsYXNzPSJqcXBsb3QtdGFibGUtbGVnZW5kIj48L3RyPicpLmFwcGVuZFRvKHRoaXMuX2VsZW0pfWZvcihEPTA7RDx2O0QrKyl7aWYoQTxHLmxlbmd0aCl7dT10aGlzLmxhYmVsc1tBXXx8R1tBXVswXS50b1N0cmluZygpO0M9by5uZXh0KCk7aWYoIXgpe2lmKEU+MCl7Rj10cnVlfWVsc2V7Rj1mYWxzZX19ZWxzZXtpZihFPT1uLTEpe0Y9ZmFsc2V9ZWxzZXtGPXRydWV9fXc9KEYpP3RoaXMucm93U3BhY2luZzoiMCI7dD1lKCc8dGQgY2xhc3M9ImpxcGxvdC10YWJsZS1sZWdlbmQiIHN0eWxlPSJ0ZXh0LWFsaWduOmNlbnRlcjtwYWRkaW5nLXRvcDonK3crJzsiPjxkaXY+PGRpdiBjbGFzcz0ianFwbG90LXRhYmxlLWxlZ2VuZC1zd2F0Y2giIHN0eWxlPSJib3JkZXItY29sb3I6JytDKyc7Ij48L2Rpdj48L2Rpdj48L3RkPicpO3I9ZSgnPHRkIGNsYXNzPSJqcXBsb3QtdGFibGUtbGVnZW5kIiBzdHlsZT0icGFkZGluZy10b3A6Jyt3Kyc7Ij48L3RkPicpO2lmKHRoaXMuZXNjYXBlSHRtbCl7ci50ZXh0KHUpfWVsc2V7ci5odG1sKHUpfWlmKHgpe3IucHJlcGVuZFRvKHApO3QucHJlcGVuZFRvKHApfWVsc2V7dC5hcHBlbmRUbyhwKTtyLmFwcGVuZFRvKHApfUY9dHJ1ZX1BKyt9fX19cmV0dXJuIHRoaXMuX2VsZW19O2Z1bmN0aW9uIGMocixxLG8pe289b3x8e307by5heGVzRGVmYXVsdHM9by5heGVzRGVmYXVsdHN8fHt9O28ubGVnZW5kPW8ubGVnZW5kfHx7fTtvLnNlcmllc0RlZmF1bHRzPW8uc2VyaWVzRGVmYXVsdHN8fHt9O3ZhciBuPWZhbHNlO2lmKG8uc2VyaWVzRGVmYXVsdHMucmVuZGVyZXI9PWUuanFwbG90LkRvbnV0UmVuZGVyZXIpe249dHJ1ZX1lbHNle2lmKG8uc2VyaWVzKXtmb3IodmFyIHA9MDtwPG8uc2VyaWVzLmxlbmd0aDtwKyspe2lmKG8uc2VyaWVzW3BdLnJlbmRlcmVyPT1lLmpxcGxvdC5Eb251dFJlbmRlcmVyKXtuPXRydWV9fX19aWYobil7by5heGVzRGVmYXVsdHMucmVuZGVyZXI9ZS5qcXBsb3QuRG9udXRBeGlzUmVuZGVyZXI7by5sZWdlbmQucmVuZGVyZXI9ZS5qcXBsb3QuRG9udXRMZWdlbmRSZW5kZXJlcjtvLmxlZ2VuZC5wcmVEcmF3PXRydWU7by5zZXJpZXNEZWZhdWx0cy5wb2ludExhYmVscz17c2hvdzpmYWxzZX19fWZ1bmN0aW9uIGcocixxLG8pe2Zvcih2YXIgcD0xO3A8dGhpcy5zZXJpZXMubGVuZ3RoO3ArKyl7aWYoIXRoaXMuc2VyaWVzW3BdLl9wcmV2aW91c1Nlcmllcy5sZW5ndGgpe2Zvcih2YXIgbj0wO248cDtuKyspe2lmKHRoaXMuc2VyaWVzW3BdLnJlbmRlcmVyLmNvbnN0cnVjdG9yPT1lLmpxcGxvdC5Eb251dFJlbmRlcmVyJiZ0aGlzLnNlcmllc1tuXS5yZW5kZXJlci5jb25zdHJ1Y3Rvcj09ZS5qcXBsb3QuRG9udXRSZW5kZXJlcil7dGhpcy5zZXJpZXNbcF0uX3ByZXZpb3VzU2VyaWVzLnB1c2godGhpcy5zZXJpZXNbbl0pfX19fWZvcihwPTA7cDx0aGlzLnNlcmllcy5sZW5ndGg7cCsrKXtpZih0aGlzLnNlcmllc1twXS5yZW5kZXJlci5jb25zdHJ1Y3Rvcj09ZS5qcXBsb3QuRG9udXRSZW5kZXJlcil7dGhpcy5zZXJpZXNbcF0uX251bWJlclNlcmllcz10aGlzLnNlcmllcy5sZW5ndGg7aWYodGhpcy5zZXJpZXNbcF0uaGlnaGxpZ2h0TW91c2VPdmVyKXt0aGlzLnNlcmllc1twXS5oaWdobGlnaHRNb3VzZURvd249ZmFsc2V9fX19dmFyIGs9ZmFsc2U7ZnVuY3Rpb24gbChuKXtmb3IodmFyIG89MDtvPHRoaXMuc2VyaWVzLmxlbmd0aDtvKyspe3RoaXMuc2VyaWVzW29dLnNlcmllc0NvbG9ycz10aGlzLnNlcmllc0NvbG9yczt0aGlzLnNlcmllc1tvXS5jb2xvckdlbmVyYXRvcj1lLmpxcGxvdC5jb2xvckdlbmVyYXRvcn19ZnVuY3Rpb24gZChyLHEscCl7dmFyIG89ci5zZXJpZXNbcV07dmFyIG49ci5wbHVnaW5zLmRvbnV0UmVuZGVyZXIuaGlnaGxpZ2h0Q2FudmFzO24uX2N0eC5jbGVhclJlY3QoMCwwLG4uX2N0eC5jYW52YXMud2lkdGgsbi5fY3R4LmNhbnZhcy5oZWlnaHQpO28uX2hpZ2hsaWdodGVkUG9pbnQ9cDtyLnBsdWdpbnMuZG9udXRSZW5kZXJlci5oaWdobGlnaHRlZFNlcmllc0luZGV4PXE7by5yZW5kZXJlci5kcmF3U2xpY2UuY2FsbChvLG4uX2N0eCxvLl9zbGljZUFuZ2xlc1twXVswXSxvLl9zbGljZUFuZ2xlc1twXVsxXSxvLmhpZ2hsaWdodENvbG9yc1twXSxmYWxzZSl9ZnVuY3Rpb24gaShwKXt2YXIgbj1wLnBsdWdpbnMuZG9udXRSZW5kZXJlci5oaWdobGlnaHRDYW52YXM7bi5fY3R4LmNsZWFyUmVjdCgwLDAsbi5fY3R4LmNhbnZhcy53aWR0aCxuLl9jdHguY2FudmFzLmhlaWdodCk7Zm9yKHZhciBvPTA7bzxwLnNlcmllcy5sZW5ndGg7bysrKXtwLnNlcmllc1tvXS5faGlnaGxpZ2h0ZWRQb2ludD1udWxsfXAucGx1Z2lucy5kb251dFJlbmRlcmVyLmhpZ2hsaWdodGVkU2VyaWVzSW5kZXg9bnVsbDtwLnRhcmdldC50cmlnZ2VyKCJqcXBsb3REYXRhVW5oaWdobGlnaHQiKX1mdW5jdGlvbiBiKHIscSx1LHQscyl7aWYodCl7dmFyIHA9W3Quc2VyaWVzSW5kZXgsdC5wb2ludEluZGV4LHQuZGF0YV07dmFyIG89alF1ZXJ5LkV2ZW50KCJqcXBsb3REYXRhTW91c2VPdmVyIik7by5wYWdlWD1yLnBhZ2VYO28ucGFnZVk9ci5wYWdlWTtzLnRhcmdldC50cmlnZ2VyKG8scCk7aWYocy5zZXJpZXNbcFswXV0uaGlnaGxpZ2h0TW91c2VPdmVyJiYhKHBbMF09PXMucGx1Z2lucy5kb251dFJlbmRlcmVyLmhpZ2hsaWdodGVkU2VyaWVzSW5kZXgmJnBbMV09PXMuc2VyaWVzW3BbMF1dLl9oaWdobGlnaHRlZFBvaW50KSl7dmFyIG49alF1ZXJ5LkV2ZW50KCJqcXBsb3REYXRhSGlnaGxpZ2h0Iik7bi5wYWdlWD1yLnBhZ2VYO24ucGFnZVk9ci5wYWdlWTtzLnRhcmdldC50cmlnZ2VyKG4scCk7ZChzLHBbMF0scFsxXSl9fWVsc2V7aWYodD09bnVsbCl7aShzKX19fWZ1bmN0aW9uIGEocSxwLHQscyxyKXtpZihzKXt2YXIgbz1bcy5zZXJpZXNJbmRleCxzLnBvaW50SW5kZXgscy5kYXRhXTtpZihyLnNlcmllc1tvWzBdXS5oaWdobGlnaHRNb3VzZURvd24mJiEob1swXT09ci5wbHVnaW5zLmRvbnV0UmVuZGVyZXIuaGlnaGxpZ2h0ZWRTZXJpZXNJbmRleCYmb1sxXT09ci5zZXJpZXNbb1swXV0uX2hpZ2hsaWdodGVkUG9pbnQpKXt2YXIgbj1qUXVlcnkuRXZlbnQoImpxcGxvdERhdGFIaWdobGlnaHQiKTtuLnBhZ2VYPXEucGFnZVg7bi5wYWdlWT1xLnBhZ2VZO3IudGFyZ2V0LnRyaWdnZXIobixvKTtkKHIsb1swXSxvWzFdKX19ZWxzZXtpZihzPT1udWxsKXtpKHIpfX19ZnVuY3Rpb24gaihwLG8scyxyLHEpe3ZhciBuPXEucGx1Z2lucy5kb251dFJlbmRlcmVyLmhpZ2hsaWdodGVkU2VyaWVzSW5kZXg7aWYobiE9bnVsbCYmcS5zZXJpZXNbbl0uaGlnaGxpZ2h0TW91c2VEb3duKXtpKHEpfX1mdW5jdGlvbiBmKHEscCx0LHMscil7aWYocyl7dmFyIG89W3Muc2VyaWVzSW5kZXgscy5wb2ludEluZGV4LHMuZGF0YV07dmFyIG49alF1ZXJ5LkV2ZW50KCJqcXBsb3REYXRhQ2xpY2siKTtuLnBhZ2VYPXEucGFnZVg7bi5wYWdlWT1xLnBhZ2VZO3IudGFyZ2V0LnRyaWdnZXIobixvKX19ZnVuY3Rpb24gbShyLHEsdSx0LHMpe2lmKHQpe3ZhciBwPVt0LnNlcmllc0luZGV4LHQucG9pbnRJbmRleCx0LmRhdGFdO3ZhciBuPXMucGx1Z2lucy5kb251dFJlbmRlcmVyLmhpZ2hsaWdodGVkU2VyaWVzSW5kZXg7aWYobiE9bnVsbCYmcy5zZXJpZXNbbl0uaGlnaGxpZ2h0TW91c2VEb3duKXtpKHMpfXZhciBvPWpRdWVyeS5FdmVudCgianFwbG90RGF0YVJpZ2h0Q2xpY2siKTtvLnBhZ2VYPXIucGFnZVg7by5wYWdlWT1yLnBhZ2VZO3MudGFyZ2V0LnRyaWdnZXIobyxwKX19ZnVuY3Rpb24gaCgpe2lmKHRoaXMucGx1Z2lucy5kb251dFJlbmRlcmVyJiZ0aGlzLnBsdWdpbnMuZG9udXRSZW5kZXJlci5oaWdobGlnaHRDYW52YXMpe3RoaXMucGx1Z2lucy5kb251dFJlbmRlcmVyLmhpZ2hsaWdodENhbnZhcy5yZXNldENhbnZhcygpO3RoaXMucGx1Z2lucy5kb251dFJlbmRlcmVyLmhpZ2hsaWdodENhbnZhcz1udWxsfXRoaXMucGx1Z2lucy5kb251dFJlbmRlcmVyPXtoaWdobGlnaHRlZFNlcmllc0luZGV4Om51bGx9O3RoaXMucGx1Z2lucy5kb251dFJlbmRlcmVyLmhpZ2hsaWdodENhbnZhcz1uZXcgZS5qcXBsb3QuR2VuZXJpY0NhbnZhcygpO3ZhciBvPWUodGhpcy50YXJnZXRJZCsiIC5qcXBsb3QtZGF0YS1sYWJlbCIpO2lmKG8ubGVuZ3RoKXtlKG9bMF0pLmJlZm9yZSh0aGlzLnBsdWdpbnMuZG9udXRSZW5kZXJlci5oaWdobGlnaHRDYW52YXMuY3JlYXRlRWxlbWVudCh0aGlzLl9ncmlkUGFkZGluZywianFwbG90LWRvbnV0UmVuZGVyZXItaGlnaGxpZ2h0LWNhbnZhcyIsdGhpcy5fcGxvdERpbWVuc2lvbnMsdGhpcykpfWVsc2V7dGhpcy5ldmVudENhbnZhcy5fZWxlbS5iZWZvcmUodGhpcy5wbHVnaW5zLmRvbnV0UmVuZGVyZXIuaGlnaGxpZ2h0Q2FudmFzLmNyZWF0ZUVsZW1lbnQodGhpcy5fZ3JpZFBhZGRpbmcsImpxcGxvdC1kb251dFJlbmRlcmVyLWhpZ2hsaWdodC1jYW52YXMiLHRoaXMuX3Bsb3REaW1lbnNpb25zLHRoaXMpKX12YXIgbj10aGlzLnBsdWdpbnMuZG9udXRSZW5kZXJlci5oaWdobGlnaHRDYW52YXMuc2V0Q29udGV4dCgpO3RoaXMuZXZlbnRDYW52YXMuX2VsZW0uYmluZCgibW91c2VsZWF2ZSIse3Bsb3Q6dGhpc30sZnVuY3Rpb24ocCl7aShwLmRhdGEucGxvdCl9KX1lLmpxcGxvdC5wcmVJbml0SG9va3MucHVzaChjKTtlLmpxcGxvdC5Eb251dFRpY2tSZW5kZXJlcj1mdW5jdGlvbigpe2UuanFwbG90LkF4aXNUaWNrUmVuZGVyZXIuY2FsbCh0aGlzKX07ZS5qcXBsb3QuRG9udXRUaWNrUmVuZGVyZXIucHJvdG90eXBlPW5ldyBlLmpxcGxvdC5BeGlzVGlja1JlbmRlcmVyKCk7ZS5qcXBsb3QuRG9udXRUaWNrUmVuZGVyZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUuanFwbG90LkRvbnV0VGlja1JlbmRlcmVyfSkoalF1ZXJ5KTs=]]></data>
	</file>
	<file>
	  <filename>/src/plugins/jqplot.dragable.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqCiAqIGpxUGxvdAogKiBQdXJlIEphdmFTY3JpcHQgcGxvdHRpbmcgcGx1Z2luIHVzaW5nIGpRdWVyeQogKgogKiBWZXJzaW9uOiAxLjAuMGIyX3IxMDEyCiAqCiAqIENvcHlyaWdodCAoYykgMjAwOS0yMDExIENocmlzIExlb25lbGxvCiAqIGpxUGxvdCBpcyBjdXJyZW50bHkgYXZhaWxhYmxlIGZvciB1c2UgaW4gYWxsIHBlcnNvbmFsIG9yIGNvbW1lcmNpYWwgcHJvamVjdHMgCiAqIHVuZGVyIGJvdGggdGhlIE1JVCAoaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHApIGFuZCBHUEwgCiAqIHZlcnNpb24gMi4wIChodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC5odG1sKSBsaWNlbnNlcy4gVGhpcyBtZWFucyB0aGF0IHlvdSBjYW4gCiAqIGNob29zZSB0aGUgbGljZW5zZSB0aGF0IGJlc3Qgc3VpdHMgeW91ciBwcm9qZWN0IGFuZCB1c2UgaXQgYWNjb3JkaW5nbHkuIAogKgogKiBBbHRob3VnaCBub3QgcmVxdWlyZWQsIHRoZSBhdXRob3Igd291bGQgYXBwcmVjaWF0ZSBhbiBlbWFpbCBsZXR0aW5nIGhpbSAKICoga25vdyBvZiBhbnkgc3Vic3RhbnRpYWwgdXNlIG9mIGpxUGxvdC4gIFlvdSBjYW4gcmVhY2ggdGhlIGF1dGhvciBhdDogCiAqIGNocmlzIGF0IGpxcGxvdCBkb3QgY29tIG9yIHNlZSBodHRwOi8vd3d3LmpxcGxvdC5jb20vaW5mby5waHAgLgogKgogKiBJZiB5b3UgYXJlIGZlZWxpbmcga2luZCBhbmQgZ2VuZXJvdXMsIGNvbnNpZGVyIHN1cHBvcnRpbmcgdGhlIHByb2plY3QgYnkKICogbWFraW5nIGEgZG9uYXRpb24gYXQ6IGh0dHA6Ly93d3cuanFwbG90LmNvbS9kb25hdGUucGhwIC4KICoKICogc3ByaW50ZiBmdW5jdGlvbnMgY29udGFpbmVkIGluIGpxcGxvdC5zcHJpbnRmLmpzIGJ5IEFzaCBTZWFybGU6CiAqCiAqICAgICB2ZXJzaW9uIDIwMDcuMDQuMjcKICogICAgIGF1dGhvciBBc2ggU2VhcmxlCiAqICAgICBodHRwOi8vaGV4bWVuLmNvbS9ibG9nLzIwMDcvMDMvcHJpbnRmLXNwcmludGYvCiAqICAgICBodHRwOi8vaGV4bWVuLmNvbS9qcy9zcHJpbnRmLmpzCiAqICAgICBUaGUgYXV0aG9yIChBc2ggU2VhcmxlKSBoYXMgcGxhY2VkIHRoaXMgY29kZSBpbiB0aGUgcHVibGljIGRvbWFpbjoKICogICAgICJUaGlzIGNvZGUgaXMgdW5yZXN0cmljdGVkOiB5b3UgYXJlIGZyZWUgdG8gdXNlIGl0IGhvd2V2ZXIgeW91IGxpa2UuIgogKiAKICovCihmdW5jdGlvbigkKSB7CiAgICAKICAgIC8qKgogICAgICogQ2xhc3M6ICQuanFwbG90LkRyYWdhYmxlCiAgICAgKiBQbHVnaW4gdG8gbWFrZSBwbG90dGVkIHBvaW50cyBkcmFnYWJsZSBieSB0aGUgdXNlci4KICAgICAqLwogICAgJC5qcXBsb3QuRHJhZ2FibGUgPSBmdW5jdGlvbihvcHRpb25zKSB7CiAgICAgICAgLy8gR3JvdXA6IFByb3BlcnRpZXMKICAgICAgICB0aGlzLm1hcmtlclJlbmRlcmVyID0gbmV3ICQuanFwbG90Lk1hcmtlclJlbmRlcmVyKHtzaGFkb3c6ZmFsc2V9KTsKICAgICAgICB0aGlzLnNoYXBlUmVuZGVyZXIgPSBuZXcgJC5qcXBsb3QuU2hhcGVSZW5kZXJlcigpOwogICAgICAgIHRoaXMuaXNEcmFnZ2luZyA9IGZhbHNlOwogICAgICAgIHRoaXMuaXNPdmVyID0gZmFsc2U7CiAgICAgICAgdGhpcy5fY3R4OwogICAgICAgIHRoaXMuX2VsZW07CiAgICAgICAgdGhpcy5fcG9pbnQ7CiAgICAgICAgdGhpcy5fZ3JpZERhdGE7CiAgICAgICAgLy8gcHJvcDogY29sb3IKICAgICAgICAvLyBDU1MgY29sb3Igc3BlYyBmb3IgdGhlIGRyYWdnZWQgcG9pbnQgKGFuZCBhZGphY2VudCBsaW5lIHNlZ21lbnQgb3IgYmFyKS4KICAgICAgICB0aGlzLmNvbG9yOwogICAgICAgIC8vIHByb3A6IGNvbnN0cmFpblRvCiAgICAgICAgLy8gQ29uc3RyYWluIGRyYWdnaW5nIG1vdGlvbiB0byBhbiBheGlzIG9yIHRvIG5vbmUuCiAgICAgICAgLy8gQWxsb3dhYmxlIHZhbHVlcyBhcmUgJ25vbmUnLCAneCcsICd5JwogICAgICAgIHRoaXMuY29uc3RyYWluVG8gPSAnbm9uZSc7ICAvLyAneCcsICd5Jywgb3IgJ25vbmUnOwogICAgICAgICQuZXh0ZW5kKHRydWUsIHRoaXMsIG9wdGlvbnMpOwogICAgfTsKICAgIAogICAgZnVuY3Rpb24gRHJhZ0NhbnZhcygpIHsKICAgICAgICAkLmpxcGxvdC5HZW5lcmljQ2FudmFzLmNhbGwodGhpcyk7CiAgICAgICAgdGhpcy5pc0RyYWdnaW5nID0gZmFsc2U7CiAgICAgICAgdGhpcy5pc092ZXIgPSBmYWxzZTsKICAgICAgICB0aGlzLl9uZWlnaGJvcjsKICAgICAgICB0aGlzLl9jdXJzb3JzID0gW107CiAgICB9CiAgICAKICAgIERyYWdDYW52YXMucHJvdG90eXBlID0gbmV3ICQuanFwbG90LkdlbmVyaWNDYW52YXMoKTsKICAgIERyYWdDYW52YXMucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gRHJhZ0NhbnZhczsKICAgIAogICAgCiAgICAvLyBjYWxsZWQgd2l0aGluIHNjb3BlIG9mIHNlcmllcwogICAgJC5qcXBsb3QuRHJhZ2FibGUucGFyc2VPcHRpb25zID0gZnVuY3Rpb24gKGRlZmF1bHRzLCBvcHRzKSB7CiAgICAgICAgdmFyIG9wdGlvbnMgPSBvcHRzIHx8IHt9OwogICAgICAgIHRoaXMucGx1Z2lucy5kcmFnYWJsZSA9IG5ldyAkLmpxcGxvdC5EcmFnYWJsZShvcHRpb25zLmRyYWdhYmxlKTsKICAgICAgICAvLyBzaW5jZSB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBiZWZvcmUgc2VyaWVzIG9wdGlvbnMgYXJlIHBhcnNlZCwKICAgICAgICAvLyB3ZSBjYW4gc2V0IHRoaXMgaGVyZSBhbmQgaXQgd2lsbCBiZSBvdmVycmlkZGVuIGlmIG5lZWRlZC4KICAgICAgICB0aGlzLmlzRHJhZ2FibGUgPSAkLmpxcGxvdC5jb25maWcuZW5hYmxlUGx1Z2luczsKICAgIH07CiAgICAKICAgIC8vIGNhbGxlZCB3aXRoaW4gY29udGV4dCBvZiBwbG90CiAgICAvLyBjcmVhdGUgYSBjYW52YXMgd2hpY2ggd2UgY2FuIGRyYXcgb24uCiAgICAvLyBpbnNlcnQgaXQgYmVmb3JlIHRoZSBldmVudENhbnZhcywgc28gZXZlbnRDYW52YXMgd2lsbCBzdGlsbCBjYXB0dXJlIGV2ZW50cy4KICAgIC8vIGFkZCBhIG5ldyBEcmFnQ2FudmFzIG9iamVjdCB0byB0aGUgcGxvdCBwbHVnaW5zIHRvIGhhbmRsZSBkcmF3aW5nIG9uIHRoaXMgbmV3IGNhbnZhcy4KICAgICQuanFwbG90LkRyYWdhYmxlLnBvc3RQbG90RHJhdyA9IGZ1bmN0aW9uKCkgewogICAgICAgIC8vIE1lbW9yeSBMZWFrcyBwYXRjaCAgICAKICAgICAgICBpZiAodGhpcy5wbHVnaW5zLmRyYWdhYmxlICYmIHRoaXMucGx1Z2lucy5kcmFnYWJsZS5oaWdobGlnaHRDYW52YXMpIHsKICAgICAgICAgICAgdGhpcy5wbHVnaW5zLmRyYWdhYmxlLmhpZ2hsaWdodENhbnZhcy5yZXNldENhbnZhcygpOwogICAgICAgICAgICB0aGlzLnBsdWdpbnMuZHJhZ2FibGUuaGlnaGxpZ2h0Q2FudmFzID0gbnVsbDsKICAgICAgICB9CgogICAgICAgIHRoaXMucGx1Z2lucy5kcmFnYWJsZSA9IHtwcmV2aW91c0N1cnNvcjonYXV0bycsIGlzT3ZlcjpmYWxzZX07CiAgICAgICAgdGhpcy5wbHVnaW5zLmRyYWdhYmxlLmRyYWdDYW52YXMgPSBuZXcgRHJhZ0NhbnZhcygpOwogICAgICAgIAogICAgICAgIHRoaXMuZXZlbnRDYW52YXMuX2VsZW0uYmVmb3JlKHRoaXMucGx1Z2lucy5kcmFnYWJsZS5kcmFnQ2FudmFzLmNyZWF0ZUVsZW1lbnQodGhpcy5fZ3JpZFBhZGRpbmcsICdqcXBsb3QtZHJhZ2FibGUtY2FudmFzJywgdGhpcy5fcGxvdERpbWVuc2lvbnMsIHRoaXMpKTsKICAgICAgICB2YXIgZGN0eCA9IHRoaXMucGx1Z2lucy5kcmFnYWJsZS5kcmFnQ2FudmFzLnNldENvbnRleHQoKTsKICAgIH07CiAgICAKICAgIC8vJC5qcXBsb3QucHJlSW5pdEhvb2tzLnB1c2goJC5qcXBsb3QuRHJhZ2FibGUuaW5pdCk7CiAgICAkLmpxcGxvdC5wcmVQYXJzZVNlcmllc09wdGlvbnNIb29rcy5wdXNoKCQuanFwbG90LkRyYWdhYmxlLnBhcnNlT3B0aW9ucyk7CiAgICAkLmpxcGxvdC5wb3N0RHJhd0hvb2tzLnB1c2goJC5qcXBsb3QuRHJhZ2FibGUucG9zdFBsb3REcmF3KTsKICAgICQuanFwbG90LmV2ZW50TGlzdGVuZXJIb29rcy5wdXNoKFsnanFwbG90TW91c2VNb3ZlJywgaGFuZGxlTW92ZV0pOwogICAgJC5qcXBsb3QuZXZlbnRMaXN0ZW5lckhvb2tzLnB1c2goWydqcXBsb3RNb3VzZURvd24nLCBoYW5kbGVEb3duXSk7CiAgICAkLmpxcGxvdC5ldmVudExpc3RlbmVySG9va3MucHVzaChbJ2pxcGxvdE1vdXNlVXAnLCBoYW5kbGVVcF0pOwoKICAgIAogICAgZnVuY3Rpb24gaW5pdERyYWdQb2ludChwbG90LCBuZWlnaGJvcikgewogICAgICAgIHZhciBzID0gcGxvdC5zZXJpZXNbbmVpZ2hib3Iuc2VyaWVzSW5kZXhdOwogICAgICAgIHZhciBkcmFnID0gcy5wbHVnaW5zLmRyYWdhYmxlOwogICAgICAgIAogICAgICAgIC8vIGZpcnN0LCBpbml0IHRoZSBtYXJrIHJlbmRlcmVyIGZvciB0aGUgZHJhZ2dlZCBwb2ludAogICAgICAgIHZhciBzbXIgPSBzLm1hcmtlclJlbmRlcmVyOwogICAgICAgIHZhciBtciA9IGRyYWcubWFya2VyUmVuZGVyZXI7CiAgICAgICAgbXIuc3R5bGUgPSBzbXIuc3R5bGU7CiAgICAgICAgbXIubGluZVdpZHRoID0gc21yLmxpbmVXaWR0aCArIDIuNTsKICAgICAgICBtci5zaXplID0gc21yLnNpemUgKyA1OwogICAgICAgIGlmICghZHJhZy5jb2xvcikgewogICAgICAgICAgICB2YXIgcmdiYSA9ICQuanFwbG90LmdldENvbG9yQ29tcG9uZW50cyhzbXIuY29sb3IpOwogICAgICAgICAgICB2YXIgbmV3cmdiID0gW3JnYmFbMF0sIHJnYmFbMV0sIHJnYmFbMl1dOwogICAgICAgICAgICB2YXIgYWxwaGEgPSAocmdiYVszXSA+PSAwLjYpID8gcmdiYVszXSowLjYgOiByZ2JhWzNdKigyLXJnYmFbM10pOwogICAgICAgICAgICBkcmFnLmNvbG9yID0gJ3JnYmEoJytuZXdyZ2JbMF0rJywnK25ld3JnYlsxXSsnLCcrbmV3cmdiWzJdKycsJythbHBoYSsnKSc7CiAgICAgICAgfQogICAgICAgIG1yLmNvbG9yID0gZHJhZy5jb2xvcjsKICAgICAgICBtci5pbml0KCk7CgogICAgICAgIHZhciBzdGFydCA9IChuZWlnaGJvci5wb2ludEluZGV4ID4gMCkgPyBuZWlnaGJvci5wb2ludEluZGV4IC0gMSA6IDA7CiAgICAgICAgdmFyIGVuZCA9IG5laWdoYm9yLnBvaW50SW5kZXgrMjsKICAgICAgICBkcmFnLl9ncmlkRGF0YSA9IHMuZ3JpZERhdGEuc2xpY2Uoc3RhcnQsIGVuZCk7CiAgICB9CiAgICAKICAgIGZ1bmN0aW9uIGhhbmRsZU1vdmUoZXYsIGdyaWRwb3MsIGRhdGFwb3MsIG5laWdoYm9yLCBwbG90KSB7CiAgICAgICAgaWYgKHBsb3QucGx1Z2lucy5kcmFnYWJsZS5kcmFnQ2FudmFzLmlzRHJhZ2dpbmcpIHsKICAgICAgICAgICAgdmFyIGRjID0gcGxvdC5wbHVnaW5zLmRyYWdhYmxlLmRyYWdDYW52YXM7CiAgICAgICAgICAgIHZhciBkcCA9IGRjLl9uZWlnaGJvcjsKICAgICAgICAgICAgdmFyIHMgPSBwbG90LnNlcmllc1tkcC5zZXJpZXNJbmRleF07CiAgICAgICAgICAgIHZhciBkcmFnID0gcy5wbHVnaW5zLmRyYWdhYmxlOwogICAgICAgICAgICB2YXIgZ2QgPSBzLmdyaWREYXRhOwogICAgICAgICAgICAKICAgICAgICAgICAgLy8gY29tcHV0ZSB0aGUgbmV3IGdyaWQgcG9zaXRpb24gd2l0aCBhbnkgY29uc3RyYWludHMuCiAgICAgICAgICAgIHZhciB4ID0gKGRyYWcuY29uc3RyYWluVG8gPT0gJ3knKSA/IGRwLmdyaWREYXRhWzBdIDogZ3JpZHBvcy54OwogICAgICAgICAgICB2YXIgeSA9IChkcmFnLmNvbnN0cmFpblRvID09ICd4JykgPyBkcC5ncmlkRGF0YVsxXSA6IGdyaWRwb3MueTsKICAgICAgICAgICAgCiAgICAgICAgICAgIC8vIGNvbXB1dGUgZGF0YSB2YWx1ZXMgZm9yIGFueSBsaXN0ZW5lcnMuCiAgICAgICAgICAgIHZhciB4dSA9IHMuX3hheGlzLnNlcmllc19wMnUoeCk7CiAgICAgICAgICAgIHZhciB5dSA9IHMuX3lheGlzLnNlcmllc19wMnUoeSk7CiAgICAgICAgICAgIAogICAgICAgICAgICAvLyBjbGVhciB0aGUgY2FudmFzIHRoZW4gcmVkcmF3IGVmZmVjdCBhdCBuZXcgcG9zaXRpb24uCiAgICAgICAgICAgIHZhciBjdHggPSBkYy5fY3R4OwogICAgICAgICAgICBjdHguY2xlYXJSZWN0KDAsIDAsIGN0eC5jYW52YXMud2lkdGgsIGN0eC5jYW52YXMuaGVpZ2h0KTsKICAgICAgICAgICAgCiAgICAgICAgICAgIC8vIGFkanVzdCBvdXIgZ3JpZERhdGEgZm9yIHRoZSBuZXcgbW91c2UgcG9zaXRpb24KICAgICAgICAgICAgaWYgKGRwLnBvaW50SW5kZXggPiAwKSB7CiAgICAgICAgICAgICAgICBkcmFnLl9ncmlkRGF0YVsxXSA9IFt4LCB5XTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGRyYWcuX2dyaWREYXRhWzBdID0gW3gsIHldOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHBsb3Quc2VyaWVzW2RwLnNlcmllc0luZGV4XS5kcmF3KGRjLl9jdHgsIHtncmlkRGF0YTpkcmFnLl9ncmlkRGF0YSwgc2hhZG93OmZhbHNlLCBwcmV2ZW50SnFQbG90U2VyaWVzRHJhd1RyaWdnZXI6dHJ1ZSwgY29sb3I6ZHJhZy5jb2xvciwgbWFya2VyT3B0aW9uczp7Y29sb3I6ZHJhZy5jb2xvciwgc2hhZG93OmZhbHNlfSwgdHJlbmRsaW5lOntzaG93OmZhbHNlfX0pOwogICAgICAgICAgICBwbG90LnRhcmdldC50cmlnZ2VyKCdqcXBsb3RTZXJpZXNQb2ludENoYW5nZScsIFtkcC5zZXJpZXNJbmRleCwgZHAucG9pbnRJbmRleCwgW3h1LHl1XSwgW3gseV1dKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAobmVpZ2hib3IgIT0gbnVsbCkgewogICAgICAgICAgICB2YXIgc2VyaWVzID0gcGxvdC5zZXJpZXNbbmVpZ2hib3Iuc2VyaWVzSW5kZXhdOwogICAgICAgICAgICBpZiAoc2VyaWVzLmlzRHJhZ2FibGUpIHsKICAgICAgICAgICAgICAgIHZhciBkYyA9IHBsb3QucGx1Z2lucy5kcmFnYWJsZS5kcmFnQ2FudmFzOwogICAgICAgICAgICAgICAgaWYgKCFkYy5pc092ZXIpIHsKICAgICAgICAgICAgICAgICAgICBkYy5fY3Vyc29ycy5wdXNoKGV2LnRhcmdldC5zdHlsZS5jdXJzb3IpOwogICAgICAgICAgICAgICAgICAgIGV2LnRhcmdldC5zdHlsZS5jdXJzb3IgPSAicG9pbnRlciI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBkYy5pc092ZXIgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKG5laWdoYm9yID09IG51bGwpIHsKICAgICAgICAgICAgdmFyIGRjID0gcGxvdC5wbHVnaW5zLmRyYWdhYmxlLmRyYWdDYW52YXM7CiAgICAgICAgICAgIGlmIChkYy5pc092ZXIpIHsKICAgICAgICAgICAgICAgIGV2LnRhcmdldC5zdHlsZS5jdXJzb3IgPSBkYy5fY3Vyc29ycy5wb3AoKTsKICAgICAgICAgICAgICAgIGRjLmlzT3ZlciA9IGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgCiAgICBmdW5jdGlvbiBoYW5kbGVEb3duKGV2LCBncmlkcG9zLCBkYXRhcG9zLCBuZWlnaGJvciwgcGxvdCkgewogICAgICAgIHZhciBkYyA9IHBsb3QucGx1Z2lucy5kcmFnYWJsZS5kcmFnQ2FudmFzOwogICAgICAgIGRjLl9jdXJzb3JzLnB1c2goZXYudGFyZ2V0LnN0eWxlLmN1cnNvcik7CiAgICAgICAgaWYgKG5laWdoYm9yICE9IG51bGwpIHsKICAgICAgICAgICAgdmFyIHMgPSBwbG90LnNlcmllc1tuZWlnaGJvci5zZXJpZXNJbmRleF07CiAgICAgICAgICAgIHZhciBkcmFnID0gcy5wbHVnaW5zLmRyYWdhYmxlOwogICAgICAgICAgICBpZiAocy5pc0RyYWdhYmxlICYmICFkYy5pc0RyYWdnaW5nKSB7CiAgICAgICAgICAgICAgICBkYy5fbmVpZ2hib3IgPSBuZWlnaGJvcjsKICAgICAgICAgICAgICAgIGRjLmlzRHJhZ2dpbmcgPSB0cnVlOwogICAgICAgICAgICAgICAgaW5pdERyYWdQb2ludChwbG90LCBuZWlnaGJvcik7CiAgICAgICAgICAgICAgICBkcmFnLm1hcmtlclJlbmRlcmVyLmRyYXcocy5ncmlkRGF0YVtuZWlnaGJvci5wb2ludEluZGV4XVswXSwgcy5ncmlkRGF0YVtuZWlnaGJvci5wb2ludEluZGV4XVsxXSwgZGMuX2N0eCk7CiAgICAgICAgICAgICAgICBldi50YXJnZXQuc3R5bGUuY3Vyc29yID0gIm1vdmUiOwogICAgICAgICAgICAgICAgcGxvdC50YXJnZXQudHJpZ2dlcignanFwbG90RHJhZ1N0YXJ0JywgW25laWdoYm9yLnNlcmllc0luZGV4LCBuZWlnaGJvci5wb2ludEluZGV4LCBncmlkcG9zLCBkYXRhcG9zXSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLy8gSnVzdCBpbiBjYXNlIG9mIGEgaGlja3VwLCB3ZSdsbCBjbGVhciB0aGUgZHJhZyBjYW52YXMgYW5kIHJlc2V0LgogICAgICAgIGVsc2UgewogICAgICAgICAgIHZhciBjdHggPSBkYy5fY3R4OwogICAgICAgICAgIGN0eC5jbGVhclJlY3QoMCwgMCwgY3R4LmNhbnZhcy53aWR0aCwgY3R4LmNhbnZhcy5oZWlnaHQpOwogICAgICAgICAgIGRjLmlzRHJhZ2dpbmcgPSBmYWxzZTsKICAgICAgICB9CiAgICB9CiAgICAKICAgIGZ1bmN0aW9uIGhhbmRsZVVwKGV2LCBncmlkcG9zLCBkYXRhcG9zLCBuZWlnaGJvciwgcGxvdCkgewogICAgICAgIGlmIChwbG90LnBsdWdpbnMuZHJhZ2FibGUuZHJhZ0NhbnZhcy5pc0RyYWdnaW5nKSB7CiAgICAgICAgICAgIHZhciBkYyA9IHBsb3QucGx1Z2lucy5kcmFnYWJsZS5kcmFnQ2FudmFzOwogICAgICAgICAgICAvLyBjbGVhciB0aGUgY2FudmFzCiAgICAgICAgICAgIHZhciBjdHggPSBkYy5fY3R4OwogICAgICAgICAgICBjdHguY2xlYXJSZWN0KDAsIDAsIGN0eC5jYW52YXMud2lkdGgsIGN0eC5jYW52YXMuaGVpZ2h0KTsKICAgICAgICAgICAgZGMuaXNEcmFnZ2luZyA9IGZhbHNlOwogICAgICAgICAgICAvLyByZWRyYXcgdGhlIHNlcmllcyBjYW52YXMgYXQgdGhlIG5ldyBwb2ludC4KICAgICAgICAgICAgdmFyIGRwID0gZGMuX25laWdoYm9yOwogICAgICAgICAgICB2YXIgcyA9IHBsb3Quc2VyaWVzW2RwLnNlcmllc0luZGV4XTsKICAgICAgICAgICAgdmFyIGRyYWcgPSBzLnBsdWdpbnMuZHJhZ2FibGU7CiAgICAgICAgICAgIC8vIGNvbXB1dGUgdGhlIG5ldyBncmlkIHBvc2l0aW9uIHdpdGggYW55IGNvbnN0cmFpbnRzLgogICAgICAgICAgICB2YXIgeCA9IChkcmFnLmNvbnN0cmFpblRvID09ICd5JykgPyBkcC5kYXRhWzBdIDogZGF0YXBvc1tzLnhheGlzXTsKICAgICAgICAgICAgdmFyIHkgPSAoZHJhZy5jb25zdHJhaW5UbyA9PSAneCcpID8gZHAuZGF0YVsxXSA6IGRhdGFwb3Nbcy55YXhpc107CiAgICAgICAgICAgIC8vIHZhciB4ID0gZGF0YXBvc1tzLnhheGlzXTsKICAgICAgICAgICAgLy8gdmFyIHkgPSBkYXRhcG9zW3MueWF4aXNdOwogICAgICAgICAgICBzLmRhdGFbZHAucG9pbnRJbmRleF1bMF0gPSB4OwogICAgICAgICAgICBzLmRhdGFbZHAucG9pbnRJbmRleF1bMV0gPSB5OwogICAgICAgICAgICBwbG90LmRyYXdTZXJpZXMoe3ByZXZlbnRKcVBsb3RTZXJpZXNEcmF3VHJpZ2dlcjp0cnVlfSwgZHAuc2VyaWVzSW5kZXgpOwogICAgICAgICAgICBkYy5fbmVpZ2hib3IgPSBudWxsOwogICAgICAgICAgICBldi50YXJnZXQuc3R5bGUuY3Vyc29yID0gZGMuX2N1cnNvcnMucG9wKCk7CiAgICAgICAgICAgIHBsb3QudGFyZ2V0LnRyaWdnZXIoJ2pxcGxvdERyYWdTdG9wJywgW2dyaWRwb3MsIGRhdGFwb3NdKTsKICAgICAgICB9CiAgICB9Cn0pKGpRdWVyeSk7]]></data>
	</file>
	<file>
	  <filename>/src/plugins/jqplot.dragable.min.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqCiAqIGpxUGxvdAogKiBQdXJlIEphdmFTY3JpcHQgcGxvdHRpbmcgcGx1Z2luIHVzaW5nIGpRdWVyeQogKgogKiBWZXJzaW9uOiAxLjAuMGIyX3IxMDEyCiAqCiAqIENvcHlyaWdodCAoYykgMjAwOS0yMDExIENocmlzIExlb25lbGxvCiAqIGpxUGxvdCBpcyBjdXJyZW50bHkgYXZhaWxhYmxlIGZvciB1c2UgaW4gYWxsIHBlcnNvbmFsIG9yIGNvbW1lcmNpYWwgcHJvamVjdHMgCiAqIHVuZGVyIGJvdGggdGhlIE1JVCAoaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHApIGFuZCBHUEwgCiAqIHZlcnNpb24gMi4wIChodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC5odG1sKSBsaWNlbnNlcy4gVGhpcyBtZWFucyB0aGF0IHlvdSBjYW4gCiAqIGNob29zZSB0aGUgbGljZW5zZSB0aGF0IGJlc3Qgc3VpdHMgeW91ciBwcm9qZWN0IGFuZCB1c2UgaXQgYWNjb3JkaW5nbHkuIAogKgogKiBBbHRob3VnaCBub3QgcmVxdWlyZWQsIHRoZSBhdXRob3Igd291bGQgYXBwcmVjaWF0ZSBhbiBlbWFpbCBsZXR0aW5nIGhpbSAKICoga25vdyBvZiBhbnkgc3Vic3RhbnRpYWwgdXNlIG9mIGpxUGxvdC4gIFlvdSBjYW4gcmVhY2ggdGhlIGF1dGhvciBhdDogCiAqIGNocmlzIGF0IGpxcGxvdCBkb3QgY29tIG9yIHNlZSBodHRwOi8vd3d3LmpxcGxvdC5jb20vaW5mby5waHAgLgogKgogKiBJZiB5b3UgYXJlIGZlZWxpbmcga2luZCBhbmQgZ2VuZXJvdXMsIGNvbnNpZGVyIHN1cHBvcnRpbmcgdGhlIHByb2plY3QgYnkKICogbWFraW5nIGEgZG9uYXRpb24gYXQ6IGh0dHA6Ly93d3cuanFwbG90LmNvbS9kb25hdGUucGhwIC4KICoKICogc3ByaW50ZiBmdW5jdGlvbnMgY29udGFpbmVkIGluIGpxcGxvdC5zcHJpbnRmLmpzIGJ5IEFzaCBTZWFybGU6CiAqCiAqICAgICB2ZXJzaW9uIDIwMDcuMDQuMjcKICogICAgIGF1dGhvciBBc2ggU2VhcmxlCiAqICAgICBodHRwOi8vaGV4bWVuLmNvbS9ibG9nLzIwMDcvMDMvcHJpbnRmLXNwcmludGYvCiAqICAgICBodHRwOi8vaGV4bWVuLmNvbS9qcy9zcHJpbnRmLmpzCiAqICAgICBUaGUgYXV0aG9yIChBc2ggU2VhcmxlKSBoYXMgcGxhY2VkIHRoaXMgY29kZSBpbiB0aGUgcHVibGljIGRvbWFpbjoKICogICAgICJUaGlzIGNvZGUgaXMgdW5yZXN0cmljdGVkOiB5b3UgYXJlIGZyZWUgdG8gdXNlIGl0IGhvd2V2ZXIgeW91IGxpa2UuIgogKgogKiBpbmNsdWRlZCBqc0RhdGUgbGlicmFyeSBieSBDaHJpcyBMZW9uZWxsbzoKICoKICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEgQ2hyaXMgTGVvbmVsbG8KICoKICoganNEYXRlIGlzIGN1cnJlbnRseSBhdmFpbGFibGUgZm9yIHVzZSBpbiBhbGwgcGVyc29uYWwgb3IgY29tbWVyY2lhbCBwcm9qZWN0cyAKICogdW5kZXIgYm90aCB0aGUgTUlUIGFuZCBHUEwgdmVyc2lvbiAyLjAgbGljZW5zZXMuIFRoaXMgbWVhbnMgdGhhdCB5b3UgY2FuIAogKiBjaG9vc2UgdGhlIGxpY2Vuc2UgdGhhdCBiZXN0IHN1aXRzIHlvdXIgcHJvamVjdCBhbmQgdXNlIGl0IGFjY29yZGluZ2x5LgogKgogKiBqc0RhdGUgYm9ycm93cyBtYW55IGNvbmNlcHRzIGFuZCBpZGVhcyBmcm9tIHRoZSBEYXRlIEluc3RhbmNlIAogKiBNZXRob2RzIGJ5IEtlbiBTbnlkZXIgYWxvbmcgd2l0aCBzb21lIHBhcnRzIG9mIEtlbidzIGFjdHVhbCBjb2RlLgogKiAKICogS2VuJ3Mgb3JpZ2lhbmwgRGF0ZSBJbnN0YW5jZSBNZXRob2RzIGFuZCBjb3B5cmlnaHQgbm90aWNlOgogKiAKICogS2VuIFNueWRlciAoa2VuIGQgc255ZGVyIGF0IGdtYWlsIGRvdCBjb20pCiAqIDIwMDgtMDktMTAKICogdmVyc2lvbiAyLjAuMiAoaHR0cDovL2tlbmRzbnlkZXIuY29tL3NhbmRib3gvZGF0ZS8pICAgICAKICogQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbiBMaWNlbnNlIDMuMCAoaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnkvMy4wLykKICoKICoganFwbG90VG9JbWFnZSBmdW5jdGlvbiBiYXNlZCBvbiBMYXJyeSBTaWRlbidzIGV4cG9ydC1qcXBsb3QtdG8tcG5nLmpzLgogKiBMYXJyeSBoYXMgZ2VuZXJvdXNseSBnaXZlbiBwZXJtaXNzaW9uIHRvIGFkYXB0IGhpcyBjb2RlIGZvciBpbmNsdXNpb24KICogaW50byBqcVBsb3QuCiAqCiAqIExhcnJ5J3Mgb3JpZ2luYWwgY29kZSBjYW4gYmUgZm91bmQgaGVyZToKICoKICogaHR0cHM6Ly9naXRodWIuY29tL2xzaWRlbi9leHBvcnQtanFwbG90LXRvLXBuZwogKiAKICogCiAqLwooZnVuY3Rpb24oZCl7ZC5qcXBsb3QuRHJhZ2FibGU9ZnVuY3Rpb24oZyl7dGhpcy5tYXJrZXJSZW5kZXJlcj1uZXcgZC5qcXBsb3QuTWFya2VyUmVuZGVyZXIoe3NoYWRvdzpmYWxzZX0pO3RoaXMuc2hhcGVSZW5kZXJlcj1uZXcgZC5qcXBsb3QuU2hhcGVSZW5kZXJlcigpO3RoaXMuaXNEcmFnZ2luZz1mYWxzZTt0aGlzLmlzT3Zlcj1mYWxzZTt0aGlzLl9jdHg7dGhpcy5fZWxlbTt0aGlzLl9wb2ludDt0aGlzLl9ncmlkRGF0YTt0aGlzLmNvbG9yO3RoaXMuY29uc3RyYWluVG89Im5vbmUiO2QuZXh0ZW5kKHRydWUsdGhpcyxnKX07ZnVuY3Rpb24gYigpe2QuanFwbG90LkdlbmVyaWNDYW52YXMuY2FsbCh0aGlzKTt0aGlzLmlzRHJhZ2dpbmc9ZmFsc2U7dGhpcy5pc092ZXI9ZmFsc2U7dGhpcy5fbmVpZ2hib3I7dGhpcy5fY3Vyc29ycz1bXX1iLnByb3RvdHlwZT1uZXcgZC5qcXBsb3QuR2VuZXJpY0NhbnZhcygpO2IucHJvdG90eXBlLmNvbnN0cnVjdG9yPWI7ZC5qcXBsb3QuRHJhZ2FibGUucGFyc2VPcHRpb25zPWZ1bmN0aW9uKGksaCl7dmFyIGc9aHx8e307dGhpcy5wbHVnaW5zLmRyYWdhYmxlPW5ldyBkLmpxcGxvdC5EcmFnYWJsZShnLmRyYWdhYmxlKTt0aGlzLmlzRHJhZ2FibGU9ZC5qcXBsb3QuY29uZmlnLmVuYWJsZVBsdWdpbnN9O2QuanFwbG90LkRyYWdhYmxlLnBvc3RQbG90RHJhdz1mdW5jdGlvbigpe2lmKHRoaXMucGx1Z2lucy5kcmFnYWJsZSYmdGhpcy5wbHVnaW5zLmRyYWdhYmxlLmhpZ2hsaWdodENhbnZhcyl7dGhpcy5wbHVnaW5zLmRyYWdhYmxlLmhpZ2hsaWdodENhbnZhcy5yZXNldENhbnZhcygpO3RoaXMucGx1Z2lucy5kcmFnYWJsZS5oaWdobGlnaHRDYW52YXM9bnVsbH10aGlzLnBsdWdpbnMuZHJhZ2FibGU9e3ByZXZpb3VzQ3Vyc29yOiJhdXRvIixpc092ZXI6ZmFsc2V9O3RoaXMucGx1Z2lucy5kcmFnYWJsZS5kcmFnQ2FudmFzPW5ldyBiKCk7dGhpcy5ldmVudENhbnZhcy5fZWxlbS5iZWZvcmUodGhpcy5wbHVnaW5zLmRyYWdhYmxlLmRyYWdDYW52YXMuY3JlYXRlRWxlbWVudCh0aGlzLl9ncmlkUGFkZGluZywianFwbG90LWRyYWdhYmxlLWNhbnZhcyIsdGhpcy5fcGxvdERpbWVuc2lvbnMsdGhpcykpO3ZhciBnPXRoaXMucGx1Z2lucy5kcmFnYWJsZS5kcmFnQ2FudmFzLnNldENvbnRleHQoKX07ZC5qcXBsb3QucHJlUGFyc2VTZXJpZXNPcHRpb25zSG9va3MucHVzaChkLmpxcGxvdC5EcmFnYWJsZS5wYXJzZU9wdGlvbnMpO2QuanFwbG90LnBvc3REcmF3SG9va3MucHVzaChkLmpxcGxvdC5EcmFnYWJsZS5wb3N0UGxvdERyYXcpO2QuanFwbG90LmV2ZW50TGlzdGVuZXJIb29rcy5wdXNoKFsianFwbG90TW91c2VNb3ZlIixlXSk7ZC5qcXBsb3QuZXZlbnRMaXN0ZW5lckhvb2tzLnB1c2goWyJqcXBsb3RNb3VzZURvd24iLGNdKTtkLmpxcGxvdC5ldmVudExpc3RlbmVySG9va3MucHVzaChbImpxcGxvdE1vdXNlVXAiLGFdKTtmdW5jdGlvbiBmKG4scCl7dmFyIHE9bi5zZXJpZXNbcC5zZXJpZXNJbmRleF07dmFyIG09cS5wbHVnaW5zLmRyYWdhYmxlO3ZhciBoPXEubWFya2VyUmVuZGVyZXI7dmFyIGk9bS5tYXJrZXJSZW5kZXJlcjtpLnN0eWxlPWguc3R5bGU7aS5saW5lV2lkdGg9aC5saW5lV2lkdGgrMi41O2kuc2l6ZT1oLnNpemUrNTtpZighbS5jb2xvcil7dmFyIGw9ZC5qcXBsb3QuZ2V0Q29sb3JDb21wb25lbnRzKGguY29sb3IpO3ZhciBvPVtsWzBdLGxbMV0sbFsyXV07dmFyIGs9KGxbM10+PTAuNik/bFszXSowLjY6bFszXSooMi1sWzNdKTttLmNvbG9yPSJyZ2JhKCIrb1swXSsiLCIrb1sxXSsiLCIrb1syXSsiLCIraysiKSJ9aS5jb2xvcj1tLmNvbG9yO2kuaW5pdCgpO3ZhciBnPShwLnBvaW50SW5kZXg+MCk/cC5wb2ludEluZGV4LTE6MDt2YXIgaj1wLnBvaW50SW5kZXgrMjttLl9ncmlkRGF0YT1xLmdyaWREYXRhLnNsaWNlKGcsail9ZnVuY3Rpb24gZShvLGwsaCx0LG0pe2lmKG0ucGx1Z2lucy5kcmFnYWJsZS5kcmFnQ2FudmFzLmlzRHJhZ2dpbmcpe3ZhciB1PW0ucGx1Z2lucy5kcmFnYWJsZS5kcmFnQ2FudmFzO3ZhciBpPXUuX25laWdoYm9yO3ZhciB3PW0uc2VyaWVzW2kuc2VyaWVzSW5kZXhdO3ZhciBrPXcucGx1Z2lucy5kcmFnYWJsZTt2YXIgcj13LmdyaWREYXRhO3ZhciBwPShrLmNvbnN0cmFpblRvPT0ieSIpP2kuZ3JpZERhdGFbMF06bC54O3ZhciBuPShrLmNvbnN0cmFpblRvPT0ieCIpP2kuZ3JpZERhdGFbMV06bC55O3ZhciBnPXcuX3hheGlzLnNlcmllc19wMnUocCk7dmFyIHE9dy5feWF4aXMuc2VyaWVzX3AydShuKTt2YXIgdj11Ll9jdHg7di5jbGVhclJlY3QoMCwwLHYuY2FudmFzLndpZHRoLHYuY2FudmFzLmhlaWdodCk7aWYoaS5wb2ludEluZGV4PjApe2suX2dyaWREYXRhWzFdPVtwLG5dfWVsc2V7ay5fZ3JpZERhdGFbMF09W3Asbl19bS5zZXJpZXNbaS5zZXJpZXNJbmRleF0uZHJhdyh1Ll9jdHgse2dyaWREYXRhOmsuX2dyaWREYXRhLHNoYWRvdzpmYWxzZSxwcmV2ZW50SnFQbG90U2VyaWVzRHJhd1RyaWdnZXI6dHJ1ZSxjb2xvcjprLmNvbG9yLG1hcmtlck9wdGlvbnM6e2NvbG9yOmsuY29sb3Isc2hhZG93OmZhbHNlfSx0cmVuZGxpbmU6e3Nob3c6ZmFsc2V9fSk7bS50YXJnZXQudHJpZ2dlcigianFwbG90U2VyaWVzUG9pbnRDaGFuZ2UiLFtpLnNlcmllc0luZGV4LGkucG9pbnRJbmRleCxbZyxxXSxbcCxuXV0pfWVsc2V7aWYodCE9bnVsbCl7dmFyIGo9bS5zZXJpZXNbdC5zZXJpZXNJbmRleF07aWYoai5pc0RyYWdhYmxlKXt2YXIgdT1tLnBsdWdpbnMuZHJhZ2FibGUuZHJhZ0NhbnZhcztpZighdS5pc092ZXIpe3UuX2N1cnNvcnMucHVzaChvLnRhcmdldC5zdHlsZS5jdXJzb3IpO28udGFyZ2V0LnN0eWxlLmN1cnNvcj0icG9pbnRlciJ9dS5pc092ZXI9dHJ1ZX19ZWxzZXtpZih0PT1udWxsKXt2YXIgdT1tLnBsdWdpbnMuZHJhZ2FibGUuZHJhZ0NhbnZhcztpZih1LmlzT3Zlcil7by50YXJnZXQuc3R5bGUuY3Vyc29yPXUuX2N1cnNvcnMucG9wKCk7dS5pc092ZXI9ZmFsc2V9fX19fWZ1bmN0aW9uIGMoayxpLGcsbCxqKXt2YXIgbT1qLnBsdWdpbnMuZHJhZ2FibGUuZHJhZ0NhbnZhczttLl9jdXJzb3JzLnB1c2goay50YXJnZXQuc3R5bGUuY3Vyc29yKTtpZihsIT1udWxsKXt2YXIgbz1qLnNlcmllc1tsLnNlcmllc0luZGV4XTt2YXIgaD1vLnBsdWdpbnMuZHJhZ2FibGU7aWYoby5pc0RyYWdhYmxlJiYhbS5pc0RyYWdnaW5nKXttLl9uZWlnaGJvcj1sO20uaXNEcmFnZ2luZz10cnVlO2YoaixsKTtoLm1hcmtlclJlbmRlcmVyLmRyYXcoby5ncmlkRGF0YVtsLnBvaW50SW5kZXhdWzBdLG8uZ3JpZERhdGFbbC5wb2ludEluZGV4XVsxXSxtLl9jdHgpO2sudGFyZ2V0LnN0eWxlLmN1cnNvcj0ibW92ZSI7ai50YXJnZXQudHJpZ2dlcigianFwbG90RHJhZ1N0YXJ0IixbbC5zZXJpZXNJbmRleCxsLnBvaW50SW5kZXgsaSxnXSl9fWVsc2V7dmFyIG49bS5fY3R4O24uY2xlYXJSZWN0KDAsMCxuLmNhbnZhcy53aWR0aCxuLmNhbnZhcy5oZWlnaHQpO20uaXNEcmFnZ2luZz1mYWxzZX19ZnVuY3Rpb24gYShtLGosZyxvLGspe2lmKGsucGx1Z2lucy5kcmFnYWJsZS5kcmFnQ2FudmFzLmlzRHJhZ2dpbmcpe3ZhciBwPWsucGx1Z2lucy5kcmFnYWJsZS5kcmFnQ2FudmFzO3ZhciBxPXAuX2N0eDtxLmNsZWFyUmVjdCgwLDAscS5jYW52YXMud2lkdGgscS5jYW52YXMuaGVpZ2h0KTtwLmlzRHJhZ2dpbmc9ZmFsc2U7dmFyIGg9cC5fbmVpZ2hib3I7dmFyIHI9ay5zZXJpZXNbaC5zZXJpZXNJbmRleF07dmFyIGk9ci5wbHVnaW5zLmRyYWdhYmxlO3ZhciBuPShpLmNvbnN0cmFpblRvPT0ieSIpP2guZGF0YVswXTpnW3IueGF4aXNdO3ZhciBsPShpLmNvbnN0cmFpblRvPT0ieCIpP2guZGF0YVsxXTpnW3IueWF4aXNdO3IuZGF0YVtoLnBvaW50SW5kZXhdWzBdPW47ci5kYXRhW2gucG9pbnRJbmRleF1bMV09bDtrLmRyYXdTZXJpZXMoe3ByZXZlbnRKcVBsb3RTZXJpZXNEcmF3VHJpZ2dlcjp0cnVlfSxoLnNlcmllc0luZGV4KTtwLl9uZWlnaGJvcj1udWxsO20udGFyZ2V0LnN0eWxlLmN1cnNvcj1wLl9jdXJzb3JzLnBvcCgpO2sudGFyZ2V0LnRyaWdnZXIoImpxcGxvdERyYWdTdG9wIixbaixnXSl9fX0pKGpRdWVyeSk7]]></data>
	</file>
	<file>
	  <filename>/src/plugins/jqplot.enhancedLegendRenderer.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqCiAqIGpxUGxvdAogKiBQdXJlIEphdmFTY3JpcHQgcGxvdHRpbmcgcGx1Z2luIHVzaW5nIGpRdWVyeQogKgogKiBWZXJzaW9uOiAxLjAuMGIyX3IxMDEyCiAqCiAqIENvcHlyaWdodCAoYykgMjAwOS0yMDExIENocmlzIExlb25lbGxvCiAqIGpxUGxvdCBpcyBjdXJyZW50bHkgYXZhaWxhYmxlIGZvciB1c2UgaW4gYWxsIHBlcnNvbmFsIG9yIGNvbW1lcmNpYWwgcHJvamVjdHMgCiAqIHVuZGVyIGJvdGggdGhlIE1JVCAoaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHApIGFuZCBHUEwgCiAqIHZlcnNpb24gMi4wIChodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC5odG1sKSBsaWNlbnNlcy4gVGhpcyBtZWFucyB0aGF0IHlvdSBjYW4gCiAqIGNob29zZSB0aGUgbGljZW5zZSB0aGF0IGJlc3Qgc3VpdHMgeW91ciBwcm9qZWN0IGFuZCB1c2UgaXQgYWNjb3JkaW5nbHkuIAogKgogKiBBbHRob3VnaCBub3QgcmVxdWlyZWQsIHRoZSBhdXRob3Igd291bGQgYXBwcmVjaWF0ZSBhbiBlbWFpbCBsZXR0aW5nIGhpbSAKICoga25vdyBvZiBhbnkgc3Vic3RhbnRpYWwgdXNlIG9mIGpxUGxvdC4gIFlvdSBjYW4gcmVhY2ggdGhlIGF1dGhvciBhdDogCiAqIGNocmlzIGF0IGpxcGxvdCBkb3QgY29tIG9yIHNlZSBodHRwOi8vd3d3LmpxcGxvdC5jb20vaW5mby5waHAgLgogKgogKiBJZiB5b3UgYXJlIGZlZWxpbmcga2luZCBhbmQgZ2VuZXJvdXMsIGNvbnNpZGVyIHN1cHBvcnRpbmcgdGhlIHByb2plY3QgYnkKICogbWFraW5nIGEgZG9uYXRpb24gYXQ6IGh0dHA6Ly93d3cuanFwbG90LmNvbS9kb25hdGUucGhwIC4KICoKICogc3ByaW50ZiBmdW5jdGlvbnMgY29udGFpbmVkIGluIGpxcGxvdC5zcHJpbnRmLmpzIGJ5IEFzaCBTZWFybGU6CiAqCiAqICAgICB2ZXJzaW9uIDIwMDcuMDQuMjcKICogICAgIGF1dGhvciBBc2ggU2VhcmxlCiAqICAgICBodHRwOi8vaGV4bWVuLmNvbS9ibG9nLzIwMDcvMDMvcHJpbnRmLXNwcmludGYvCiAqICAgICBodHRwOi8vaGV4bWVuLmNvbS9qcy9zcHJpbnRmLmpzCiAqICAgICBUaGUgYXV0aG9yIChBc2ggU2VhcmxlKSBoYXMgcGxhY2VkIHRoaXMgY29kZSBpbiB0aGUgcHVibGljIGRvbWFpbjoKICogICAgICJUaGlzIGNvZGUgaXMgdW5yZXN0cmljdGVkOiB5b3UgYXJlIGZyZWUgdG8gdXNlIGl0IGhvd2V2ZXIgeW91IGxpa2UuIgogKiAKICovCihmdW5jdGlvbigkKSB7CiAgICAvLyBjbGFzcyAkLmpxcGxvdC5FbmhhbmNlZExlZ2VuZFJlbmRlcmVyCiAgICAvLyBMZWdlbmQgcmVuZGVyZXIgd2hpY2ggY2FuIHNwZWNpZnkgdGhlIG51bWJlciBvZiByb3dzIGFuZC9vciBjb2x1bW5zIGluIHRoZSBsZWdlbmQuCiAgICAkLmpxcGxvdC5FbmhhbmNlZExlZ2VuZFJlbmRlcmVyID0gZnVuY3Rpb24oKXsKICAgICAgICAkLmpxcGxvdC5UYWJsZUxlZ2VuZFJlbmRlcmVyLmNhbGwodGhpcyk7CiAgICB9OwogICAgCiAgICAkLmpxcGxvdC5FbmhhbmNlZExlZ2VuZFJlbmRlcmVyLnByb3RvdHlwZSA9IG5ldyAkLmpxcGxvdC5UYWJsZUxlZ2VuZFJlbmRlcmVyKCk7CiAgICAkLmpxcGxvdC5FbmhhbmNlZExlZ2VuZFJlbmRlcmVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9ICQuanFwbG90LkVuaGFuY2VkTGVnZW5kUmVuZGVyZXI7CiAgICAKICAgIC8vIGNhbGxlZCB3aXRoIHNjb3BlIG9mIGxlZ2VuZC4KICAgICQuanFwbG90LkVuaGFuY2VkTGVnZW5kUmVuZGVyZXIucHJvdG90eXBlLmluaXQgPSBmdW5jdGlvbihvcHRpb25zKSB7CiAgICAgICAgLy8gcHJvcDogbnVtYmVyUm93cwogICAgICAgIC8vIE1heGltdW0gbnVtYmVyIG9mIHJvd3MgaW4gdGhlIGxlZ2VuZC4gIDAgb3IgbnVsbCBmb3IgdW5saW1pdGVkLgogICAgICAgIHRoaXMubnVtYmVyUm93cyA9IG51bGw7CiAgICAgICAgLy8gcHJvcDogbnVtYmVyQ29sdW1ucwogICAgICAgIC8vIE1heGltdW0gbnVtYmVyIG9mIGNvbHVtbnMgaW4gdGhlIGxlZ2VuZC4gIDAgb3IgbnVsbCBmb3IgdW5saW1pdGVkLgogICAgICAgIHRoaXMubnVtYmVyQ29sdW1ucyA9IG51bGw7CiAgICAgICAgLy8gcHJvcDogc2VyaWVzVG9nZ2xlCiAgICAgICAgLy8gZmFsc2UgdG8gbm90IGVuYWJsZSBzZXJpZXMgb24vb2ZmIHRvZ2dsaW5nIG9uIHRoZSBsZWdlbmQuCiAgICAgICAgLy8gdHJ1ZSBvciBhIGZhZGVpbi9mYWRlb3V0IHNwZWVkIChudW1iZXIgb2YgbWlsbGlzZWNvbmRzIG9yICdmYXN0JywgJ25vcm1hbCcsICdzbG93JykgCiAgICAgICAgLy8gdG8gZW5hYmxlIHNob3cvaGlkZSBvZiBzZXJpZXMgb24gY2xpY2sgb2YgbGVnZW5kIGl0ZW0uCiAgICAgICAgdGhpcy5zZXJpZXNUb2dnbGUgPSAnbm9ybWFsJzsKICAgICAgICAvLyBwcm9wOiBkaXNhYmxlSUVGYWRpbmcKICAgICAgICAvLyB0cnVlIHRvIHRvZ2dsZSBzZXJpZXMgd2l0aCBhIHNob3cvaGlkZSBtZXRob2Qgb25seSBhbmQgbm90IGFsbG93IGZhZGluZyBpbi9vdXQuICAKICAgICAgICAvLyBUaGlzIGlzIHRvIG92ZXJjb21lIHBvb3IgcGVyZm9ybWFuY2Ugb2YgZmFkZSBpbiBzb21lIHZlcnNpb25zIG9mIElFLgogICAgICAgIHRoaXMuZGlzYWJsZUlFRmFkaW5nID0gdHJ1ZTsKICAgICAgICAkLmV4dGVuZCh0cnVlLCB0aGlzLCBvcHRpb25zKTsKICAgICAgICAKICAgICAgICBpZiAodGhpcy5zZXJpZXNUb2dnbGUpIHsKICAgICAgICAgICAgJC5qcXBsb3QucG9zdERyYXdIb29rcy5wdXNoKHBvc3REcmF3KTsKICAgICAgICB9CiAgICB9OwogICAgCiAgICAvLyBjYWxsZWQgd2l0aCBzY29wZSBvZiBsZWdlbmQKICAgICQuanFwbG90LkVuaGFuY2VkTGVnZW5kUmVuZGVyZXIucHJvdG90eXBlLmRyYXcgPSBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgbGVnZW5kID0gdGhpczsKICAgICAgICBpZiAodGhpcy5zaG93KSB7CiAgICAgICAgICAgIHZhciBzZXJpZXMgPSB0aGlzLl9zZXJpZXM7CgkJCXZhciBzOwogICAgICAgICAgICB2YXIgc3MgPSAncG9zaXRpb246YWJzb2x1dGU7JzsKICAgICAgICAgICAgc3MgKz0gKHRoaXMuYmFja2dyb3VuZCkgPyAnYmFja2dyb3VuZDonK3RoaXMuYmFja2dyb3VuZCsnOycgOiAnJzsKICAgICAgICAgICAgc3MgKz0gKHRoaXMuYm9yZGVyKSA/ICdib3JkZXI6Jyt0aGlzLmJvcmRlcisnOycgOiAnJzsKICAgICAgICAgICAgc3MgKz0gKHRoaXMuZm9udFNpemUpID8gJ2ZvbnQtc2l6ZTonK3RoaXMuZm9udFNpemUrJzsnIDogJyc7CiAgICAgICAgICAgIHNzICs9ICh0aGlzLmZvbnRGYW1pbHkpID8gJ2ZvbnQtZmFtaWx5OicrdGhpcy5mb250RmFtaWx5Kyc7JyA6ICcnOwogICAgICAgICAgICBzcyArPSAodGhpcy50ZXh0Q29sb3IpID8gJ2NvbG9yOicrdGhpcy50ZXh0Q29sb3IrJzsnIDogJyc7CiAgICAgICAgICAgIHNzICs9ICh0aGlzLm1hcmdpblRvcCAhPSBudWxsKSA/ICdtYXJnaW4tdG9wOicrdGhpcy5tYXJnaW5Ub3ArJzsnIDogJyc7CiAgICAgICAgICAgIHNzICs9ICh0aGlzLm1hcmdpbkJvdHRvbSAhPSBudWxsKSA/ICdtYXJnaW4tYm90dG9tOicrdGhpcy5tYXJnaW5Cb3R0b20rJzsnIDogJyc7CiAgICAgICAgICAgIHNzICs9ICh0aGlzLm1hcmdpbkxlZnQgIT0gbnVsbCkgPyAnbWFyZ2luLWxlZnQ6Jyt0aGlzLm1hcmdpbkxlZnQrJzsnIDogJyc7CiAgICAgICAgICAgIHNzICs9ICh0aGlzLm1hcmdpblJpZ2h0ICE9IG51bGwpID8gJ21hcmdpbi1yaWdodDonK3RoaXMubWFyZ2luUmlnaHQrJzsnIDogJyc7CiAgICAgICAgICAgIHRoaXMuX2VsZW0gPSAkKCc8dGFibGUgY2xhc3M9ImpxcGxvdC10YWJsZS1sZWdlbmQiIHN0eWxlPSInK3NzKyciPjwvdGFibGU+Jyk7CiAgICAgICAgICAgIGlmICh0aGlzLnNlcmllc1RvZ2dsZSkgewogICAgICAgICAgICAgICAgdGhpcy5fZWxlbS5jc3MoJ3otaW5kZXgnLCAnMycpOwogICAgICAgICAgICB9CiAgICAgICAgCiAgICAgICAgICAgIHZhciBwYWQgPSBmYWxzZSwgCiAgICAgICAgICAgICAgICByZXZlcnNlID0gZmFsc2UsCiAgICAgICAgICAgICAgICBuciwgbmM7CiAgICAgICAgICAgIGlmICh0aGlzLm51bWJlclJvd3MpIHsKICAgICAgICAgICAgICAgIG5yID0gdGhpcy5udW1iZXJSb3dzOwogICAgICAgICAgICAgICAgaWYgKCF0aGlzLm51bWJlckNvbHVtbnMpewogICAgICAgICAgICAgICAgICAgIG5jID0gTWF0aC5jZWlsKHNlcmllcy5sZW5ndGgvbnIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZXsKICAgICAgICAgICAgICAgICAgICBuYyA9IHRoaXMubnVtYmVyQ29sdW1uczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICh0aGlzLm51bWJlckNvbHVtbnMpIHsKICAgICAgICAgICAgICAgIG5jID0gdGhpcy5udW1iZXJDb2x1bW5zOwogICAgICAgICAgICAgICAgbnIgPSBNYXRoLmNlaWwoc2VyaWVzLmxlbmd0aC90aGlzLm51bWJlckNvbHVtbnMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgbnIgPSBzZXJpZXMubGVuZ3RoOwogICAgICAgICAgICAgICAgbmMgPSAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgdmFyIGksIGosIHRyLCB0ZDEsIHRkMiwgbHQsIHJzLCBkaXYsIGRpdjAsIGRpdjE7CiAgICAgICAgICAgIHZhciBpZHggPSAwOwogICAgICAgICAgICAvLyBjaGVjayB0byBzZWUgaWYgd2UgbmVlZCB0byByZXZlcnNlCiAgICAgICAgICAgIGZvciAoaT1zZXJpZXMubGVuZ3RoLTE7IGk+PTA7IGktLSkgewogICAgICAgICAgICAgICAgaWYgKG5jID09IDEgJiYgc2VyaWVzW2ldLl9zdGFjayB8fCBzZXJpZXNbaV0ucmVuZGVyZXIuY29uc3RydWN0b3IgPT0gJC5qcXBsb3QuQmV6aWVyQ3VydmVSZW5kZXJlcil7CiAgICAgICAgICAgICAgICAgICAgcmV2ZXJzZSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gICAgCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgZm9yIChpPTA7IGk8bnI7IGkrKykgewogICAgICAgICAgICAgICAgdHIgPSAkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJykpOwogICAgICAgICAgICAgICAgdHIuYWRkQ2xhc3MoJ2pxcGxvdC10YWJsZS1sZWdlbmQnKTsKICAgICAgICAgICAgICAgIGlmIChyZXZlcnNlKXsKICAgICAgICAgICAgICAgICAgICB0ci5wcmVwZW5kVG8odGhpcy5fZWxlbSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlewogICAgICAgICAgICAgICAgICAgIHRyLmFwcGVuZFRvKHRoaXMuX2VsZW0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZm9yIChqPTA7IGo8bmM7IGorKykgewogICAgICAgICAgICAgICAgICAgIGlmIChpZHggPCBzZXJpZXMubGVuZ3RoICYmIHNlcmllc1tpZHhdLnNob3cgJiYgc2VyaWVzW2lkeF0uc2hvd0xhYmVsKXsKICAgICAgICAgICAgICAgICAgICAgICAgcyA9IHNlcmllc1tpZHhdOwogICAgICAgICAgICAgICAgICAgICAgICBsdCA9IHRoaXMubGFiZWxzW2lkeF0gfHwgcy5sYWJlbC50b1N0cmluZygpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAobHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb2xvciA9IHMuY29sb3I7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJldmVyc2UpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpPjApewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpID09IG5yIC0xKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2V7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcnMgPSAocGFkKSA/IHRoaXMucm93U3BhY2luZyA6ICcwJzsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZDEgPSAkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RkJykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGQxLmFkZENsYXNzKCdqcXBsb3QtdGFibGUtbGVnZW5kIGpxcGxvdC10YWJsZS1sZWdlbmQtc3dhdGNoJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZDEuY3NzKHt0ZXh0QWxpZ246ICdjZW50ZXInLCBwYWRkaW5nVG9wOiByc30pOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpdjAgPSAkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpdjAuYWRkQ2xhc3MoJ2pxcGxvdC10YWJsZS1sZWdlbmQtc3dhdGNoLW91dGxpbmUnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpdjEgPSAkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpdjEuYWRkQ2xhc3MoJ2pxcGxvdC10YWJsZS1sZWdlbmQtc3dhdGNoJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXYxLmNzcyh7YmFja2dyb3VuZENvbG9yOiBjb2xvciwgYm9yZGVyQ29sb3I6IGNvbG9yfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGQxLmFwcGVuZChkaXYwLmFwcGVuZChkaXYxKSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGQyID0gJChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRkMi5hZGRDbGFzcygnanFwbG90LXRhYmxlLWxlZ2VuZCBqcXBsb3QtdGFibGUtbGVnZW5kLWxhYmVsJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZDIuY3NzKCdwYWRkaW5nVG9wJywgcnMpOwogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGQxID0gJCgnPHRkIGNsYXNzPSJqcXBsb3QtdGFibGUtbGVnZW5kIiBzdHlsZT0idGV4dC1hbGlnbjpjZW50ZXI7cGFkZGluZy10b3A6JytycysnOyI+JysKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAnPGRpdj48ZGl2IGNsYXNzPSJqcXBsb3QtdGFibGUtbGVnZW5kLXN3YXRjaCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6Jytjb2xvcisnO2JvcmRlci1jb2xvcjonK2NvbG9yKyc7Ij48L2Rpdj4nKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICc8L2Rpdj48L3RkPicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGQyID0gJCgnPHRkIGNsYXNzPSJqcXBsb3QtdGFibGUtbGVnZW5kIiBzdHlsZT0icGFkZGluZy10b3A6JytycysnOyI+PC90ZD4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmVzY2FwZUh0bWwpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRkMi50ZXh0KGx0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRkMi5odG1sKGx0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXZlcnNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2hvd0xhYmVscykge3RkMi5wcmVwZW5kVG8odHIpO30KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zaG93U3dhdGNoZXMpIHt0ZDEucHJlcGVuZFRvKHRyKTt9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zaG93U3dhdGNoZXMpIHt0ZDEuYXBwZW5kVG8odHIpO30KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zaG93TGFiZWxzKSB7dGQyLmFwcGVuZFRvKHRyKTt9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNlcmllc1RvZ2dsZSkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhZGQgYW4gb3ZlcmxheSBmb3IgY2xpY2tpbmcgc2VyaWVzIG9uL29mZgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRpdjAgPSAkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkaXYwLmFkZENsYXNzKCdqcXBsb3QtdGFibGUtbGVnZW5kLW92ZXJsYXknKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkaXYwLmNzcyh7cG9zaXRpb246J3JlbGF0aXZlJywgbGVmdDowLCB0b3A6MCwgaGVpZ2h0OicxMDAlJywgd2lkdGg6JzEwMCUnfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHIuYXBwZW5kKGRpdjApOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc3BlZWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLnNlcmllc1RvZ2dsZSkgPT0gJ3N0cmluZycgfHwgdHlwZW9mKHRoaXMuc2VyaWVzVG9nZ2xlKSA9PSAnbnVtYmVyJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISQuanFwbG90LnVzZV9leGNhbnZhcyB8fCAhdGhpcy5kaXNhYmxlSUVGYWRpbmcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWVkID0gdGhpcy5zZXJpZXNUb2dnbGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNob3dTd2F0Y2hlcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZDEuYmluZCgnY2xpY2snLCB7c2VyaWVzOnMsIHNwZWVkOnNwZWVkfSwgaGFuZGxlVG9nZ2xlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGQxLmFkZENsYXNzKCdqcXBsb3Qtc2VyaWVzVG9nZ2xlJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNob3dMYWJlbHMpICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRkMi5iaW5kKCdjbGljaycsIHtzZXJpZXM6cywgc3BlZWQ6c3BlZWR9LCBoYW5kbGVUb2dnbGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZDIuYWRkQ2xhc3MoJ2pxcGxvdC1zZXJpZXNUb2dnbGUnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWR4Kys7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIHRkMSA9IHRkMiA9IGRpdjAgPSBkaXYxID0gbnVsbDsgICAKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5fZWxlbTsKICAgIH07CgogICAgdmFyIGhhbmRsZVRvZ2dsZSA9IGZ1bmN0aW9uIChldikgewogICAgICAgIGV2LmRhdGEuc2VyaWVzLnRvZ2dsZURpc3BsYXkoZXYpOwogICAgICAgIGlmIChldi5kYXRhLnNlcmllcy5jYW52YXMuX2VsZW0uaGFzQ2xhc3MoJ2pxcGxvdC1zZXJpZXMtaGlkZGVuJykpIHsKICAgICAgICAgICAgJCh0aGlzKS5hZGRDbGFzcygnanFwbG90LXNlcmllcy1oaWRkZW4nKTsKICAgICAgICAgICAgJCh0aGlzKS5uZXh0KCcuanFwbG90LXRhYmxlLWxlZ2VuZC1sYWJlbCcpLmFkZENsYXNzKCdqcXBsb3Qtc2VyaWVzLWhpZGRlbicpOwogICAgICAgICAgICAkKHRoaXMpLnByZXYoJy5qcXBsb3QtdGFibGUtbGVnZW5kLXN3YXRjaCcpLmFkZENsYXNzKCdqcXBsb3Qtc2VyaWVzLWhpZGRlbicpOwoKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICQodGhpcykucmVtb3ZlQ2xhc3MoJ2pxcGxvdC1zZXJpZXMtaGlkZGVuJyk7CiAgICAgICAgICAgICQodGhpcykubmV4dCgnLmpxcGxvdC10YWJsZS1sZWdlbmQtbGFiZWwnKS5yZW1vdmVDbGFzcygnanFwbG90LXNlcmllcy1oaWRkZW4nKTsKICAgICAgICAgICAgJCh0aGlzKS5wcmV2KCcuanFwbG90LXRhYmxlLWxlZ2VuZC1zd2F0Y2gnKS5yZW1vdmVDbGFzcygnanFwbG90LXNlcmllcy1oaWRkZW4nKTsKICAgICAgICB9CiAgICB9OwogICAgCiAgICAvLyBjYWxsZWQgd2l0aCBzY29wZSBvZiBwbG90LgogICAgdmFyIHBvc3REcmF3ID0gZnVuY3Rpb24gKCkgewogICAgICAgIGlmICh0aGlzLmxlZ2VuZC5yZW5kZXJlci5jb25zdHJ1Y3RvciA9PSAkLmpxcGxvdC5FbmhhbmNlZExlZ2VuZFJlbmRlcmVyICYmIHRoaXMubGVnZW5kLnNlcmllc1RvZ2dsZSl7CiAgICAgICAgICAgIHZhciBlID0gdGhpcy5sZWdlbmQuX2VsZW0uZGV0YWNoKCk7CiAgICAgICAgICAgIHRoaXMuZXZlbnRDYW52YXMuX2VsZW0uYWZ0ZXIoZSk7CiAgICAgICAgfQogICAgfTsKfSkoalF1ZXJ5KTs=]]></data>
	</file>
	<file>
	  <filename>/src/plugins/jqplot.enhancedLegendRenderer.min.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqCiAqIGpxUGxvdAogKiBQdXJlIEphdmFTY3JpcHQgcGxvdHRpbmcgcGx1Z2luIHVzaW5nIGpRdWVyeQogKgogKiBWZXJzaW9uOiAxLjAuMGIyX3IxMDEyCiAqCiAqIENvcHlyaWdodCAoYykgMjAwOS0yMDExIENocmlzIExlb25lbGxvCiAqIGpxUGxvdCBpcyBjdXJyZW50bHkgYXZhaWxhYmxlIGZvciB1c2UgaW4gYWxsIHBlcnNvbmFsIG9yIGNvbW1lcmNpYWwgcHJvamVjdHMgCiAqIHVuZGVyIGJvdGggdGhlIE1JVCAoaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHApIGFuZCBHUEwgCiAqIHZlcnNpb24gMi4wIChodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC5odG1sKSBsaWNlbnNlcy4gVGhpcyBtZWFucyB0aGF0IHlvdSBjYW4gCiAqIGNob29zZSB0aGUgbGljZW5zZSB0aGF0IGJlc3Qgc3VpdHMgeW91ciBwcm9qZWN0IGFuZCB1c2UgaXQgYWNjb3JkaW5nbHkuIAogKgogKiBBbHRob3VnaCBub3QgcmVxdWlyZWQsIHRoZSBhdXRob3Igd291bGQgYXBwcmVjaWF0ZSBhbiBlbWFpbCBsZXR0aW5nIGhpbSAKICoga25vdyBvZiBhbnkgc3Vic3RhbnRpYWwgdXNlIG9mIGpxUGxvdC4gIFlvdSBjYW4gcmVhY2ggdGhlIGF1dGhvciBhdDogCiAqIGNocmlzIGF0IGpxcGxvdCBkb3QgY29tIG9yIHNlZSBodHRwOi8vd3d3LmpxcGxvdC5jb20vaW5mby5waHAgLgogKgogKiBJZiB5b3UgYXJlIGZlZWxpbmcga2luZCBhbmQgZ2VuZXJvdXMsIGNvbnNpZGVyIHN1cHBvcnRpbmcgdGhlIHByb2plY3QgYnkKICogbWFraW5nIGEgZG9uYXRpb24gYXQ6IGh0dHA6Ly93d3cuanFwbG90LmNvbS9kb25hdGUucGhwIC4KICoKICogc3ByaW50ZiBmdW5jdGlvbnMgY29udGFpbmVkIGluIGpxcGxvdC5zcHJpbnRmLmpzIGJ5IEFzaCBTZWFybGU6CiAqCiAqICAgICB2ZXJzaW9uIDIwMDcuMDQuMjcKICogICAgIGF1dGhvciBBc2ggU2VhcmxlCiAqICAgICBodHRwOi8vaGV4bWVuLmNvbS9ibG9nLzIwMDcvMDMvcHJpbnRmLXNwcmludGYvCiAqICAgICBodHRwOi8vaGV4bWVuLmNvbS9qcy9zcHJpbnRmLmpzCiAqICAgICBUaGUgYXV0aG9yIChBc2ggU2VhcmxlKSBoYXMgcGxhY2VkIHRoaXMgY29kZSBpbiB0aGUgcHVibGljIGRvbWFpbjoKICogICAgICJUaGlzIGNvZGUgaXMgdW5yZXN0cmljdGVkOiB5b3UgYXJlIGZyZWUgdG8gdXNlIGl0IGhvd2V2ZXIgeW91IGxpa2UuIgogKgogKiBpbmNsdWRlZCBqc0RhdGUgbGlicmFyeSBieSBDaHJpcyBMZW9uZWxsbzoKICoKICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEgQ2hyaXMgTGVvbmVsbG8KICoKICoganNEYXRlIGlzIGN1cnJlbnRseSBhdmFpbGFibGUgZm9yIHVzZSBpbiBhbGwgcGVyc29uYWwgb3IgY29tbWVyY2lhbCBwcm9qZWN0cyAKICogdW5kZXIgYm90aCB0aGUgTUlUIGFuZCBHUEwgdmVyc2lvbiAyLjAgbGljZW5zZXMuIFRoaXMgbWVhbnMgdGhhdCB5b3UgY2FuIAogKiBjaG9vc2UgdGhlIGxpY2Vuc2UgdGhhdCBiZXN0IHN1aXRzIHlvdXIgcHJvamVjdCBhbmQgdXNlIGl0IGFjY29yZGluZ2x5LgogKgogKiBqc0RhdGUgYm9ycm93cyBtYW55IGNvbmNlcHRzIGFuZCBpZGVhcyBmcm9tIHRoZSBEYXRlIEluc3RhbmNlIAogKiBNZXRob2RzIGJ5IEtlbiBTbnlkZXIgYWxvbmcgd2l0aCBzb21lIHBhcnRzIG9mIEtlbidzIGFjdHVhbCBjb2RlLgogKiAKICogS2VuJ3Mgb3JpZ2lhbmwgRGF0ZSBJbnN0YW5jZSBNZXRob2RzIGFuZCBjb3B5cmlnaHQgbm90aWNlOgogKiAKICogS2VuIFNueWRlciAoa2VuIGQgc255ZGVyIGF0IGdtYWlsIGRvdCBjb20pCiAqIDIwMDgtMDktMTAKICogdmVyc2lvbiAyLjAuMiAoaHR0cDovL2tlbmRzbnlkZXIuY29tL3NhbmRib3gvZGF0ZS8pICAgICAKICogQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbiBMaWNlbnNlIDMuMCAoaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnkvMy4wLykKICoKICoganFwbG90VG9JbWFnZSBmdW5jdGlvbiBiYXNlZCBvbiBMYXJyeSBTaWRlbidzIGV4cG9ydC1qcXBsb3QtdG8tcG5nLmpzLgogKiBMYXJyeSBoYXMgZ2VuZXJvdXNseSBnaXZlbiBwZXJtaXNzaW9uIHRvIGFkYXB0IGhpcyBjb2RlIGZvciBpbmNsdXNpb24KICogaW50byBqcVBsb3QuCiAqCiAqIExhcnJ5J3Mgb3JpZ2luYWwgY29kZSBjYW4gYmUgZm91bmQgaGVyZToKICoKICogaHR0cHM6Ly9naXRodWIuY29tL2xzaWRlbi9leHBvcnQtanFwbG90LXRvLXBuZwogKiAKICogCiAqLwooZnVuY3Rpb24oYyl7Yy5qcXBsb3QuRW5oYW5jZWRMZWdlbmRSZW5kZXJlcj1mdW5jdGlvbigpe2MuanFwbG90LlRhYmxlTGVnZW5kUmVuZGVyZXIuY2FsbCh0aGlzKX07Yy5qcXBsb3QuRW5oYW5jZWRMZWdlbmRSZW5kZXJlci5wcm90b3R5cGU9bmV3IGMuanFwbG90LlRhYmxlTGVnZW5kUmVuZGVyZXIoKTtjLmpxcGxvdC5FbmhhbmNlZExlZ2VuZFJlbmRlcmVyLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1jLmpxcGxvdC5FbmhhbmNlZExlZ2VuZFJlbmRlcmVyO2MuanFwbG90LkVuaGFuY2VkTGVnZW5kUmVuZGVyZXIucHJvdG90eXBlLmluaXQ9ZnVuY3Rpb24oZCl7dGhpcy5udW1iZXJSb3dzPW51bGw7dGhpcy5udW1iZXJDb2x1bW5zPW51bGw7dGhpcy5zZXJpZXNUb2dnbGU9Im5vcm1hbCI7dGhpcy5kaXNhYmxlSUVGYWRpbmc9dHJ1ZTtjLmV4dGVuZCh0cnVlLHRoaXMsZCk7aWYodGhpcy5zZXJpZXNUb2dnbGUpe2MuanFwbG90LnBvc3REcmF3SG9va3MucHVzaChiKX19O2MuanFwbG90LkVuaGFuY2VkTGVnZW5kUmVuZGVyZXIucHJvdG90eXBlLmRyYXc9ZnVuY3Rpb24oKXt2YXIgZj10aGlzO2lmKHRoaXMuc2hvdyl7dmFyIHE9dGhpcy5fc2VyaWVzO3ZhciByO3ZhciB2PSJwb3NpdGlvbjphYnNvbHV0ZTsiO3YrPSh0aGlzLmJhY2tncm91bmQpPyJiYWNrZ3JvdW5kOiIrdGhpcy5iYWNrZ3JvdW5kKyI7IjoiIjt2Kz0odGhpcy5ib3JkZXIpPyJib3JkZXI6Iit0aGlzLmJvcmRlcisiOyI6IiI7dis9KHRoaXMuZm9udFNpemUpPyJmb250LXNpemU6Iit0aGlzLmZvbnRTaXplKyI7IjoiIjt2Kz0odGhpcy5mb250RmFtaWx5KT8iZm9udC1mYW1pbHk6Iit0aGlzLmZvbnRGYW1pbHkrIjsiOiIiO3YrPSh0aGlzLnRleHRDb2xvcik/ImNvbG9yOiIrdGhpcy50ZXh0Q29sb3IrIjsiOiIiO3YrPSh0aGlzLm1hcmdpblRvcCE9bnVsbCk/Im1hcmdpbi10b3A6Iit0aGlzLm1hcmdpblRvcCsiOyI6IiI7dis9KHRoaXMubWFyZ2luQm90dG9tIT1udWxsKT8ibWFyZ2luLWJvdHRvbToiK3RoaXMubWFyZ2luQm90dG9tKyI7IjoiIjt2Kz0odGhpcy5tYXJnaW5MZWZ0IT1udWxsKT8ibWFyZ2luLWxlZnQ6Iit0aGlzLm1hcmdpbkxlZnQrIjsiOiIiO3YrPSh0aGlzLm1hcmdpblJpZ2h0IT1udWxsKT8ibWFyZ2luLXJpZ2h0OiIrdGhpcy5tYXJnaW5SaWdodCsiOyI6IiI7dGhpcy5fZWxlbT1jKCc8dGFibGUgY2xhc3M9ImpxcGxvdC10YWJsZS1sZWdlbmQiIHN0eWxlPSInK3YrJyI+PC90YWJsZT4nKTtpZih0aGlzLnNlcmllc1RvZ2dsZSl7dGhpcy5fZWxlbS5jc3MoInotaW5kZXgiLCIzIil9dmFyIEE9ZmFsc2UscD1mYWxzZSxkLG47aWYodGhpcy5udW1iZXJSb3dzKXtkPXRoaXMubnVtYmVyUm93cztpZighdGhpcy5udW1iZXJDb2x1bW5zKXtuPU1hdGguY2VpbChxLmxlbmd0aC9kKX1lbHNle249dGhpcy5udW1iZXJDb2x1bW5zfX1lbHNle2lmKHRoaXMubnVtYmVyQ29sdW1ucyl7bj10aGlzLm51bWJlckNvbHVtbnM7ZD1NYXRoLmNlaWwocS5sZW5ndGgvdGhpcy5udW1iZXJDb2x1bW5zKX1lbHNle2Q9cS5sZW5ndGg7bj0xfX12YXIgeix4LGUsbCxrLG0sbyx0LGgsZzt2YXIgdT0wO2Zvcih6PXEubGVuZ3RoLTE7ej49MDt6LS0pe2lmKG49PTEmJnFbel0uX3N0YWNrfHxxW3pdLnJlbmRlcmVyLmNvbnN0cnVjdG9yPT1jLmpxcGxvdC5CZXppZXJDdXJ2ZVJlbmRlcmVyKXtwPXRydWV9fWZvcih6PTA7ejxkO3orKyl7ZT1jKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRyIikpO2UuYWRkQ2xhc3MoImpxcGxvdC10YWJsZS1sZWdlbmQiKTtpZihwKXtlLnByZXBlbmRUbyh0aGlzLl9lbGVtKX1lbHNle2UuYXBwZW5kVG8odGhpcy5fZWxlbSl9Zm9yKHg9MDt4PG47eCsrKXtpZih1PHEubGVuZ3RoJiZxW3VdLnNob3cmJnFbdV0uc2hvd0xhYmVsKXtyPXFbdV07bT10aGlzLmxhYmVsc1t1XXx8ci5sYWJlbC50b1N0cmluZygpO2lmKG0pe3ZhciB3PXIuY29sb3I7aWYoIXApe2lmKHo+MCl7QT10cnVlfWVsc2V7QT1mYWxzZX19ZWxzZXtpZih6PT1kLTEpe0E9ZmFsc2V9ZWxzZXtBPXRydWV9fW89KEEpP3RoaXMucm93U3BhY2luZzoiMCI7bD1jKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRkIikpO2wuYWRkQ2xhc3MoImpxcGxvdC10YWJsZS1sZWdlbmQganFwbG90LXRhYmxlLWxlZ2VuZC1zd2F0Y2giKTtsLmNzcyh7dGV4dEFsaWduOiJjZW50ZXIiLHBhZGRpbmdUb3A6b30pO2g9Yyhkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSk7aC5hZGRDbGFzcygianFwbG90LXRhYmxlLWxlZ2VuZC1zd2F0Y2gtb3V0bGluZSIpO2c9Yyhkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSk7Zy5hZGRDbGFzcygianFwbG90LXRhYmxlLWxlZ2VuZC1zd2F0Y2giKTtnLmNzcyh7YmFja2dyb3VuZENvbG9yOncsYm9yZGVyQ29sb3I6d30pO2wuYXBwZW5kKGguYXBwZW5kKGcpKTtrPWMoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGQiKSk7ay5hZGRDbGFzcygianFwbG90LXRhYmxlLWxlZ2VuZCBqcXBsb3QtdGFibGUtbGVnZW5kLWxhYmVsIik7ay5jc3MoInBhZGRpbmdUb3AiLG8pO2lmKHRoaXMuZXNjYXBlSHRtbCl7ay50ZXh0KG0pfWVsc2V7ay5odG1sKG0pfWlmKHApe2lmKHRoaXMuc2hvd0xhYmVscyl7ay5wcmVwZW5kVG8oZSl9aWYodGhpcy5zaG93U3dhdGNoZXMpe2wucHJlcGVuZFRvKGUpfX1lbHNle2lmKHRoaXMuc2hvd1N3YXRjaGVzKXtsLmFwcGVuZFRvKGUpfWlmKHRoaXMuc2hvd0xhYmVscyl7ay5hcHBlbmRUbyhlKX19aWYodGhpcy5zZXJpZXNUb2dnbGUpe3ZhciB5O2lmKHR5cGVvZih0aGlzLnNlcmllc1RvZ2dsZSk9PSJzdHJpbmcifHx0eXBlb2YodGhpcy5zZXJpZXNUb2dnbGUpPT0ibnVtYmVyIil7aWYoIWMuanFwbG90LnVzZV9leGNhbnZhc3x8IXRoaXMuZGlzYWJsZUlFRmFkaW5nKXt5PXRoaXMuc2VyaWVzVG9nZ2xlfX1pZih0aGlzLnNob3dTd2F0Y2hlcyl7bC5iaW5kKCJjbGljayIse3NlcmllczpyLHNwZWVkOnl9LGEpO2wuYWRkQ2xhc3MoImpxcGxvdC1zZXJpZXNUb2dnbGUiKX1pZih0aGlzLnNob3dMYWJlbHMpe2suYmluZCgiY2xpY2siLHtzZXJpZXM6cixzcGVlZDp5fSxhKTtrLmFkZENsYXNzKCJqcXBsb3Qtc2VyaWVzVG9nZ2xlIil9fUE9dHJ1ZX19dSsrfWw9az1oPWc9bnVsbH19cmV0dXJuIHRoaXMuX2VsZW19O3ZhciBhPWZ1bmN0aW9uKGQpe2QuZGF0YS5zZXJpZXMudG9nZ2xlRGlzcGxheShkKTtpZihkLmRhdGEuc2VyaWVzLmNhbnZhcy5fZWxlbS5oYXNDbGFzcygianFwbG90LXNlcmllcy1oaWRkZW4iKSl7Yyh0aGlzKS5hZGRDbGFzcygianFwbG90LXNlcmllcy1oaWRkZW4iKTtjKHRoaXMpLm5leHQoIi5qcXBsb3QtdGFibGUtbGVnZW5kLWxhYmVsIikuYWRkQ2xhc3MoImpxcGxvdC1zZXJpZXMtaGlkZGVuIik7Yyh0aGlzKS5wcmV2KCIuanFwbG90LXRhYmxlLWxlZ2VuZC1zd2F0Y2giKS5hZGRDbGFzcygianFwbG90LXNlcmllcy1oaWRkZW4iKX1lbHNle2ModGhpcykucmVtb3ZlQ2xhc3MoImpxcGxvdC1zZXJpZXMtaGlkZGVuIik7Yyh0aGlzKS5uZXh0KCIuanFwbG90LXRhYmxlLWxlZ2VuZC1sYWJlbCIpLnJlbW92ZUNsYXNzKCJqcXBsb3Qtc2VyaWVzLWhpZGRlbiIpO2ModGhpcykucHJldigiLmpxcGxvdC10YWJsZS1sZWdlbmQtc3dhdGNoIikucmVtb3ZlQ2xhc3MoImpxcGxvdC1zZXJpZXMtaGlkZGVuIil9fTt2YXIgYj1mdW5jdGlvbigpe2lmKHRoaXMubGVnZW5kLnJlbmRlcmVyLmNvbnN0cnVjdG9yPT1jLmpxcGxvdC5FbmhhbmNlZExlZ2VuZFJlbmRlcmVyJiZ0aGlzLmxlZ2VuZC5zZXJpZXNUb2dnbGUpe3ZhciBkPXRoaXMubGVnZW5kLl9lbGVtLmRldGFjaCgpO3RoaXMuZXZlbnRDYW52YXMuX2VsZW0uYWZ0ZXIoZCl9fX0pKGpRdWVyeSk7]]></data>
	</file>
	<file>
	  <filename>/src/plugins/jqplot.funnelRenderer.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqCiAqIGpxUGxvdAogKiBQdXJlIEphdmFTY3JpcHQgcGxvdHRpbmcgcGx1Z2luIHVzaW5nIGpRdWVyeQogKgogKiBWZXJzaW9uOiAxLjAuMGIyX3IxMDEyCiAqCiAqIENvcHlyaWdodCAoYykgMjAwOS0yMDExIENocmlzIExlb25lbGxvCiAqIGpxUGxvdCBpcyBjdXJyZW50bHkgYXZhaWxhYmxlIGZvciB1c2UgaW4gYWxsIHBlcnNvbmFsIG9yIGNvbW1lcmNpYWwgcHJvamVjdHMgCiAqIHVuZGVyIGJvdGggdGhlIE1JVCAoaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHApIGFuZCBHUEwgCiAqIHZlcnNpb24gMi4wIChodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC5odG1sKSBsaWNlbnNlcy4gVGhpcyBtZWFucyB0aGF0IHlvdSBjYW4gCiAqIGNob29zZSB0aGUgbGljZW5zZSB0aGF0IGJlc3Qgc3VpdHMgeW91ciBwcm9qZWN0IGFuZCB1c2UgaXQgYWNjb3JkaW5nbHkuIAogKgogKiBBbHRob3VnaCBub3QgcmVxdWlyZWQsIHRoZSBhdXRob3Igd291bGQgYXBwcmVjaWF0ZSBhbiBlbWFpbCBsZXR0aW5nIGhpbSAKICoga25vdyBvZiBhbnkgc3Vic3RhbnRpYWwgdXNlIG9mIGpxUGxvdC4gIFlvdSBjYW4gcmVhY2ggdGhlIGF1dGhvciBhdDogCiAqIGNocmlzIGF0IGpxcGxvdCBkb3QgY29tIG9yIHNlZSBodHRwOi8vd3d3LmpxcGxvdC5jb20vaW5mby5waHAgLgogKgogKiBJZiB5b3UgYXJlIGZlZWxpbmcga2luZCBhbmQgZ2VuZXJvdXMsIGNvbnNpZGVyIHN1cHBvcnRpbmcgdGhlIHByb2plY3QgYnkKICogbWFraW5nIGEgZG9uYXRpb24gYXQ6IGh0dHA6Ly93d3cuanFwbG90LmNvbS9kb25hdGUucGhwIC4KICoKICogc3ByaW50ZiBmdW5jdGlvbnMgY29udGFpbmVkIGluIGpxcGxvdC5zcHJpbnRmLmpzIGJ5IEFzaCBTZWFybGU6CiAqCiAqICAgICB2ZXJzaW9uIDIwMDcuMDQuMjcKICogICAgIGF1dGhvciBBc2ggU2VhcmxlCiAqICAgICBodHRwOi8vaGV4bWVuLmNvbS9ibG9nLzIwMDcvMDMvcHJpbnRmLXNwcmludGYvCiAqICAgICBodHRwOi8vaGV4bWVuLmNvbS9qcy9zcHJpbnRmLmpzCiAqICAgICBUaGUgYXV0aG9yIChBc2ggU2VhcmxlKSBoYXMgcGxhY2VkIHRoaXMgY29kZSBpbiB0aGUgcHVibGljIGRvbWFpbjoKICogICAgICJUaGlzIGNvZGUgaXMgdW5yZXN0cmljdGVkOiB5b3UgYXJlIGZyZWUgdG8gdXNlIGl0IGhvd2V2ZXIgeW91IGxpa2UuIgogKiAKICovCihmdW5jdGlvbigkKSB7CiAgICAvKioKICAgICAqIENsYXNzOiAkLmpxcGxvdC5GdW5uZWxSZW5kZXJlcgogICAgICogUGx1Z2luIHJlbmRlcmVyIHRvIGRyYXcgYSBmdW5uZWwgY2hhcnQuCiAgICAgKiB4IHZhbHVlcywgaWYgcHJlc2VudCwgd2lsbCBiZSB1c2VkIGFzIGxhYmVscy4KICAgICAqIHkgdmFsdWVzIGdpdmUgYXJlYSBzaXplLgogICAgICogCiAgICAgKiBGdW5uZWwgY2hhcnRzIHdpbGwgZHJhdyBhIHNpbmdsZSBzZXJpZXMKICAgICAqIG9ubHkuCiAgICAgKiAKICAgICAqIFRvIHVzZSB0aGlzIHJlbmRlcmVyLCB5b3UgbmVlZCB0byBpbmNsdWRlIHRoZSAKICAgICAqIGZ1bm5lbCByZW5kZXJlciBwbHVnaW4sIGZvciBleGFtcGxlOgogICAgICogCiAgICAgKiA+IDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InBsdWdpbnMvanFwbG90LmZ1bm5lbFJlbmRlcmVyLmpzIj48L3NjcmlwdD4KICAgICAqIAogICAgICogUHJvcGVydGllcyBkZXNjcmliZWQgaGVyZSBhcmUgcGFzc2VkIGludG8gdGhlICQuanFwbG90IGZ1bmN0aW9uCiAgICAgKiBhcyBvcHRpb25zIG9uIHRoZSBzZXJpZXMgcmVuZGVyZXIuICBGb3IgZXhhbXBsZToKICAgICAqIAogICAgICogPiBwbG90MiA9ICQuanFwbG90KCdjaGFydDInLCBbczEsIHMyXSwgewogICAgICogPiAgICAgc2VyaWVzRGVmYXVsdHM6IHsKICAgICAqID4gICAgICAgICByZW5kZXJlcjokLmpxcGxvdC5GdW5uZWxSZW5kZXJlciwKICAgICAqID4gICAgICAgICByZW5kZXJlck9wdGlvbnM6ewogICAgICogPiAgICAgICAgICAgICAgc2VjdGlvbk1hcmdpbjogMTIsCiAgICAgKiA+ICAgICAgICAgICAgICB3aWR0aFJhdGlvOiAwLjMKICAgICAqID4gICAgICAgICAgfQogICAgICogPiAgICAgIH0KICAgICAqID4gfSk7CiAgICAgKiAKICAgICAqIElNUE9SVEFOVAogICAgICogCiAgICAgKiAqVGhlIGZ1bm5lbCByZW5kZXJlciB3aWxsIHJlb3JkZXIgZGF0YSBpbiBkZXNjZW5kaW5nIG9yZGVyKiBzbyB0aGUgbGFyZ2VzdCB2YWx1ZSBpbgogICAgICogdGhlIGRhdGEgc2V0IGlzIGZpcnN0IGFuZCBkaXNwbGF5ZWQgb24gdG9wIG9mIHRoZSBmdW5uZWwuICBEYXRhIHdpbGwgdGhlbgogICAgICogYmUgZGlzcGxheWVkIGluIGRlc2NlbmRpbmcgb3JkZXIgZG93biB0aGUgZnVubmVsLiAgVGhlIGFyZWEgb2YgZWFjaCBmdW5uZWwKICAgICAqIHNlY3Rpb24gd2lsbCBjb3JyZXNwb25kIHRvIHRoZSB2YWx1ZSBvZiBlYWNoIGRhdGEgcG9pbnQgcmVsYXRpdmUgdG8gdGhlIHN1bQogICAgICogb2YgYWxsIHZhbHVlcy4gIFRoYXQgaXMgc2VjdGlvbiBhcmVhIGlzIHByb3BvcnRpb25hbCB0byBzZWN0aW9uIHZhbHVlIGRpdmlkZWQgYnkgCiAgICAgKiBzdW0gb2YgYWxsIHNlY3Rpb24gdmFsdWVzLgogICAgICogCiAgICAgKiBJZiB5b3VyIGRhdGEgaXMgbm90IGluIGRlc2NlbmRpbmcgb3JkZXIgd2hlbiBwYXNzZWQgaW50byB0aGUgcGxvdCwgKml0IHdpbGwgYmUKICAgICAqIHJlb3JkZXJlZCogd2hlbiBzdG9yZWQgaW4gdGhlIHNlcmllcy5kYXRhIHByb3BlcnR5LiAgQSBjb3B5IG9mIHRoZSB1bm9yZGVyZWQKICAgICAqIGRhdGEgaXMga2VwdCBpbiB0aGUgc2VyaWVzLl91bm9yZGVyZWREYXRhIHByb3BlcnR5LgogICAgICogCiAgICAgKiBBIGZ1bm5lbCBwbG90IHdpbGwgdHJpZ2dlciBldmVudHMgb24gdGhlIHBsb3QgdGFyZ2V0CiAgICAgKiBhY2NvcmRpbmcgdG8gdXNlciBpbnRlcmFjdGlvbi4gIEFsbCBldmVudHMgcmV0dXJuIHRoZSBldmVudCBvYmplY3QsCiAgICAgKiB0aGUgc2VyaWVzIGluZGV4LCB0aGUgcG9pbnQgKHNlY3Rpb24pIGluZGV4LCBhbmQgdGhlIHBvaW50IGRhdGEgZm9yIAogICAgICogdGhlIGFwcHJvcHJpYXRlIHNlY3Rpb24uICpOb3RlKiB0aGUgcG9pbnQgaW5kZXggd2lsbCByZWZlcnIgdG8gdGhlIG9yZGVyZWQKICAgICAqIGRhdGEsIG5vdCB0aGUgb3JpZ2luYWwgdW5vcmRlcmVkIGRhdGEuCiAgICAgKiAKICAgICAqICdqcXBsb3REYXRhTW91c2VPdmVyJyAtIHRyaWdnZXJlZCB3aGVuIG1vdXNpbmcgb3ZlciBhIHNlY3Rpb24uCiAgICAgKiAnanFwbG90RGF0YUhpZ2hsaWdodCcgLSB0cmlnZ2VyZWQgdGhlIGZpcnN0IHRpbWUgdXNlciBtb3VzZXMgb3ZlciBhIHNlY3Rpb24sCiAgICAgKiBpZiBoaWdobGlnaHRpbmcgaXMgZW5hYmxlZC4KICAgICAqICdqcXBsb3REYXRhVW5oaWdobGlnaHQnIC0gdHJpZ2dlcmVkIHdoZW4gYSB1c2VyIG1vdmVzIHRoZSBtb3VzZSBvdXQgb2YKICAgICAqIGEgaGlnaGxpZ2h0ZWQgc2VjdGlvbi4KICAgICAqICdqcXBsb3REYXRhQ2xpY2snIC0gdHJpZ2dlcmVkIHdoZW4gdGhlIHVzZXIgY2xpY2tzIG9uIGEgc2VjdGlvbi4KICAgICAqICdqcXBsb3REYXRhUmlnaHRDbGljaycgLSB0aWdnZXJlZCB3aGVuIHRoZSB1c2VyIHJpZ2h0IGNsaWNrcyBvbiBhIHNlY3Rpb24gaWYKICAgICAqIHRoZSAiY2FwdHVyZVJpZ2h0Q2xpY2siIG9wdGlvbiBpcyBzZXQgdG8gdHJ1ZSBvbiB0aGUgcGxvdC4KICAgICAqLwogICAgJC5qcXBsb3QuRnVubmVsUmVuZGVyZXIgPSBmdW5jdGlvbigpewogICAgICAgICQuanFwbG90LkxpbmVSZW5kZXJlci5jYWxsKHRoaXMpOwogICAgfTsKICAgIAogICAgJC5qcXBsb3QuRnVubmVsUmVuZGVyZXIucHJvdG90eXBlID0gbmV3ICQuanFwbG90LkxpbmVSZW5kZXJlcigpOwogICAgJC5qcXBsb3QuRnVubmVsUmVuZGVyZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gJC5qcXBsb3QuRnVubmVsUmVuZGVyZXI7CiAgICAKICAgIC8vIGNhbGxlZCB3aXRoIHNjb3BlIG9mIGEgc2VyaWVzCiAgICAkLmpxcGxvdC5GdW5uZWxSZW5kZXJlci5wcm90b3R5cGUuaW5pdCA9IGZ1bmN0aW9uKG9wdGlvbnMsIHBsb3QpIHsKICAgICAgICAvLyBHcm91cDogUHJvcGVydGllcwogICAgICAgIC8vCiAgICAgICAgLy8gcHJvcDogcGFkZGluZwogICAgICAgIC8vIHBhZGRpbmcgYmV0d2VlbiB0aGUgZnVubmVsIGFuZCBwbG90IGVkZ2VzLCBsZWdlbmQsIGV0Yy4KICAgICAgICB0aGlzLnBhZGRpbmcgPSB7dG9wOiAyMCwgcmlnaHQ6IDIwLCBib3R0b206IDIwLCBsZWZ0OiAyMH07CiAgICAgICAgLy8gcHJvcDogc2VjdGlvbk1hcmdpbgogICAgICAgIC8vIHNwYWNpbmcgYmV0d2VlbiBmdW5uZWwgc2VjdGlvbnMgaW4gcGl4ZWxzLgogICAgICAgIHRoaXMuc2VjdGlvbk1hcmdpbiA9IDY7CiAgICAgICAgLy8gcHJvcDogZmlsbAogICAgICAgIC8vIHRydWUgb3IgZmFsc2UsIHdldGhlciB0byBmaWxsIHRoZSBhcmVhcy4KICAgICAgICB0aGlzLmZpbGwgPSB0cnVlOwogICAgICAgIC8vIHByb3A6IHNoYWRvd09mZnNldAogICAgICAgIC8vIG9mZnNldCBvZiB0aGUgc2hhZG93IGZyb20gdGhlIGFyZWEgYW5kIG9mZnNldCBvZiAKICAgICAgICAvLyBlYWNoIHN1Y2Nlc2l2ZSBzdHJva2Ugb2YgdGhlIHNoYWRvdyBmcm9tIHRoZSBsYXN0LgogICAgICAgIHRoaXMuc2hhZG93T2Zmc2V0ID0gMjsKICAgICAgICAvLyBwcm9wOiBzaGFkb3dBbHBoYQogICAgICAgIC8vIHRyYW5zcGFyZW5jeSBvZiB0aGUgc2hhZG93ICgwID0gdHJhbnNwYXJlbnQsIDEgPSBvcGFxdWUpCiAgICAgICAgdGhpcy5zaGFkb3dBbHBoYSA9IDAuMDc7CiAgICAgICAgLy8gcHJvcDogc2hhZG93RGVwdGgKICAgICAgICAvLyBudW1iZXIgb2Ygc3Ryb2tlcyB0byBhcHBseSB0byB0aGUgc2hhZG93LCAKICAgICAgICAvLyBlYWNoIHN0cm9rZSBvZmZzZXQgc2hhZG93T2Zmc2V0IGZyb20gdGhlIGxhc3QuCiAgICAgICAgdGhpcy5zaGFkb3dEZXB0aCA9IDU7CiAgICAgICAgLy8gcHJvcDogaGlnaGxpZ2h0TW91c2VPdmVyCiAgICAgICAgLy8gVHJ1ZSB0byBoaWdobGlnaHQgYXJlYSB3aGVuIG1vdXNlZCBvdmVyLgogICAgICAgIC8vIFRoaXMgbXVzdCBiZSBmYWxzZSB0byBlbmFibGUgaGlnaGxpZ2h0TW91c2VEb3duIHRvIGhpZ2hsaWdodCB3aGVuIGNsaWNraW5nIG9uIGEgYXJlYS4KICAgICAgICB0aGlzLmhpZ2hsaWdodE1vdXNlT3ZlciA9IHRydWU7CiAgICAgICAgLy8gcHJvcDogaGlnaGxpZ2h0TW91c2VEb3duCiAgICAgICAgLy8gVHJ1ZSB0byBoaWdobGlnaHQgd2hlbiBhIG1vdXNlIGJ1dHRvbiBpcyBwcmVzc2VkIG92ZXIgYSBhcmVhLgogICAgICAgIC8vIFRoaXMgd2lsbCBiZSBkaXNhYmxlZCBpZiBoaWdobGlnaHRNb3VzZU92ZXIgaXMgdHJ1ZS4KICAgICAgICB0aGlzLmhpZ2hsaWdodE1vdXNlRG93biA9IGZhbHNlOwogICAgICAgIC8vIHByb3A6IGhpZ2hsaWdodENvbG9ycwogICAgICAgIC8vIGFycmF5IG9mIGNvbG9ycyB0byB1c2Ugd2hlbiBoaWdobGlnaHRpbmcgYW4gYXJlYS4KICAgICAgICB0aGlzLmhpZ2hsaWdodENvbG9ycyA9IFtdOwogICAgICAgIC8vIHByb3A6IHdpZHRoUmF0aW8KICAgICAgICAvLyBUaGUgcmF0aW8gb2YgdGhlIHdpZHRoIG9mIHRoZSB0b3Agb2YgdGhlIGZ1bm5lbCB0byB0aGUgYm90dG9tLgogICAgICAgIC8vIGEgcmF0aW8gb2YgMCB3aWxsIG1ha2UgYW4gdXBzaWRlIGRvd24gcHlyYW1pZC4gCiAgICAgICAgdGhpcy53aWR0aFJhdGlvID0gMC4yOwogICAgICAgIC8vIHByb3A6IGxpbmVXaWR0aAogICAgICAgIC8vIHdpZHRoIG9mIGxpbmUgaWYgYXJlYXMgYXJlIHN0cm9rZWQgYW5kIG5vdCBmaWxsZWQuCiAgICAgICAgdGhpcy5saW5lV2lkdGggPSAyOwogICAgICAgIC8vIHByb3A6IGRhdGFMYWJlbHMKICAgICAgICAvLyBFaXRoZXIgJ2xhYmVsJywgJ3ZhbHVlJywgJ3BlcmNlbnQnIG9yIGFuIGFycmF5IG9mIGxhYmVscyB0byBwbGFjZSBvbiB0aGUgcGllIHNsaWNlcy4KICAgICAgICAvLyBEZWZhdWx0cyB0byBwZXJjZW50YWdlIG9mIGVhY2ggcGllIHNsaWNlLgogICAgICAgIHRoaXMuZGF0YUxhYmVscyA9ICdwZXJjZW50JzsKICAgICAgICAvLyBwcm9wOiBzaG93RGF0YUxhYmVscwogICAgICAgIC8vIHRydWUgdG8gc2hvdyBkYXRhIGxhYmVscyBvbiBzbGljZXMuCiAgICAgICAgdGhpcy5zaG93RGF0YUxhYmVscyA9IGZhbHNlOwogICAgICAgIC8vIHByb3A6IGRhdGFMYWJlbEZvcm1hdFN0cmluZwogICAgICAgIC8vIEZvcm1hdCBzdHJpbmcgZm9yIGRhdGEgbGFiZWxzLiAgSWYgbm9uZSwgJyVzJyBpcyB1c2VkIGZvciAibGFiZWwiIGFuZCBmb3IgYXJyYXlzLCAnJWQnIGZvciB2YWx1ZSBhbmQgJyVkJSUnIGZvciBwZXJjZW50YWdlLgogICAgICAgIHRoaXMuZGF0YUxhYmVsRm9ybWF0U3RyaW5nID0gbnVsbDsKICAgICAgICAvLyBwcm9wOiBkYXRhTGFiZWxUaHJlc2hvbGQKICAgICAgICAvLyBUaHJlc2hob2xkIGluIHBlcmNlbnRhZ2UgKDAgLSAxMDApIG9mIHBpZSBhcmVhLCBiZWxvdyB3aGljaCBubyBsYWJlbCB3aWxsIGJlIGRpc3BsYXllZC4KICAgICAgICAvLyBUaGlzIGFwcGxpZXMgdG8gYWxsIGxhYmVsIHR5cGVzLCBub3QganVzdCB0byBwZXJjZW50YWdlIGxhYmVscy4KICAgICAgICB0aGlzLmRhdGFMYWJlbFRocmVzaG9sZCA9IDM7CiAgICAgICAgdGhpcy5fdHlwZSA9ICdmdW5uZWwnOwogICAgICAgIAogICAgICAgIHRoaXMudGlja1JlbmRlcmVyID0gJC5qcXBsb3QuRnVubmVsVGlja1JlbmRlcmVyOwogICAgICAgIAogICAgICAgIC8vIGlmIHVzZXIgaGFzIHBhc3NlZCBpbiBoaWdobGlnaHRNb3VzZURvd24gb3B0aW9uIGFuZCBub3Qgc2V0IGhpZ2hsaWdodE1vdXNlT3ZlciwgZGlzYWJsZSBoaWdobGlnaHRNb3VzZU92ZXIKICAgICAgICBpZiAob3B0aW9ucy5oaWdobGlnaHRNb3VzZURvd24gJiYgb3B0aW9ucy5oaWdobGlnaHRNb3VzZU92ZXIgPT0gbnVsbCkgewogICAgICAgICAgICBvcHRpb25zLmhpZ2hsaWdodE1vdXNlT3ZlciA9IGZhbHNlOwogICAgICAgIH0KICAgICAgICAKICAgICAgICAkLmV4dGVuZCh0cnVlLCB0aGlzLCBvcHRpb25zKTsKICAgICAgICAKICAgICAgICAvLyBpbmRleCBvZiB0aGUgY3VycmVudHkgaGlnaGxpZ2h0ZWQgcG9pbnQsIGlmIGFueQogICAgICAgIHRoaXMuX2hpZ2hsaWdodGVkUG9pbnQgPSBudWxsOwogICAgICAgIAogICAgICAgIC8vIGxlbmd0aHMgb2YgYmFzZXMsIG9yIGhvcml6b250YWwgc2lkZXMgb2YgYXJlYXMgb2YgdHJhcGV6b2lkLgogICAgICAgIHRoaXMuX2Jhc2VzID0gW107CiAgICAgICAgLy8gdG90YWwgYXJlYQogICAgICAgIHRoaXMuX2F0b3Q7CiAgICAgICAgLy8gYXJlYXMgb2Ygc2VnbWVudHMuCiAgICAgICAgdGhpcy5fYXJlYXMgPSBbXTsKICAgICAgICAvLyB2ZXJ0aWNhbCBsZW5ndGhzIG9mIHNlZ21lbnRzLgogICAgICAgIHRoaXMuX2xlbmd0aHMgPSBbXTsKICAgICAgICAvLyBhbmdsZSBvZiB0aGUgZnVubmVsIHRvIHZlcnRpY2FsLgogICAgICAgIHRoaXMuX2FuZ2xlOwogICAgICAgIHRoaXMuX2RhdGFJbmRpY2VzID0gW107CiAgICAgICAgCiAgICAgICAgLy8gc29ydCBkYXRhCiAgICAgICAgdGhpcy5fdW5vcmRlcmVkRGF0YSA9ICQuZXh0ZW5kKHRydWUsIFtdLCB0aGlzLmRhdGEpOwogICAgICAgIHZhciBpZHhzID0gJC5leHRlbmQodHJ1ZSwgW10sIHRoaXMuZGF0YSk7CiAgICAgICAgZm9yICh2YXIgaT0wOyBpPGlkeHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgaWR4c1tpXS5wdXNoKGkpOwogICAgICAgIH0KICAgICAgICB0aGlzLmRhdGEuc29ydCggZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIGJbMV0gLSBhWzFdOyB9ICk7CiAgICAgICAgaWR4cy5zb3J0KCBmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gYlsxXSAtIGFbMV07IH0pOwogICAgICAgIGZvciAodmFyIGk9MDsgaTxpZHhzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIHRoaXMuX2RhdGFJbmRpY2VzLnB1c2goaWR4c1tpXVsyXSk7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC8vIHNldCBoaWdobGlnaHQgY29sb3JzIGlmIG5vbmUgcHJvdmlkZWQKICAgICAgICBpZiAodGhpcy5oaWdobGlnaHRDb2xvcnMubGVuZ3RoID09IDApIHsKICAgICAgICAgICAgZm9yICh2YXIgaT0wOyBpPHRoaXMuc2VyaWVzQ29sb3JzLmxlbmd0aDsgaSsrKXsKICAgICAgICAgICAgICAgIHZhciByZ2JhID0gJC5qcXBsb3QuZ2V0Q29sb3JDb21wb25lbnRzKHRoaXMuc2VyaWVzQ29sb3JzW2ldKTsKICAgICAgICAgICAgICAgIHZhciBuZXdyZ2IgPSBbcmdiYVswXSwgcmdiYVsxXSwgcmdiYVsyXV07CiAgICAgICAgICAgICAgICB2YXIgc3VtID0gbmV3cmdiWzBdICsgbmV3cmdiWzFdICsgbmV3cmdiWzJdOwogICAgICAgICAgICAgICAgZm9yICh2YXIgaj0wOyBqPDM7IGorKykgewogICAgICAgICAgICAgICAgICAgIC8vIHdoZW4gZGFya2VuaW5nLCBsb3dlc3QgY29sb3IgY29tcG9uZW50IGNhbiBiZSBpcyA2MC4KICAgICAgICAgICAgICAgICAgICBuZXdyZ2Jbal0gPSAoc3VtID4gNTcwKSA/ICBuZXdyZ2Jbal0gKiAwLjggOiBuZXdyZ2Jbal0gKyAwLjQgKiAoMjU1IC0gbmV3cmdiW2pdKTsKICAgICAgICAgICAgICAgICAgICBuZXdyZ2Jbal0gPSBwYXJzZUludChuZXdyZ2Jbal0sIDEwKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRoaXMuaGlnaGxpZ2h0Q29sb3JzLnB1c2goJ3JnYignK25ld3JnYlswXSsnLCcrbmV3cmdiWzFdKycsJytuZXdyZ2JbMl0rJyknKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcGxvdC5wb3N0UGFyc2VPcHRpb25zSG9va3MuYWRkT25jZShwb3N0UGFyc2VPcHRpb25zKTsKICAgICAgICBwbG90LnBvc3RJbml0SG9va3MuYWRkT25jZShwb3N0SW5pdCk7CiAgICAgICAgcGxvdC5ldmVudExpc3RlbmVySG9va3MuYWRkT25jZSgnanFwbG90TW91c2VNb3ZlJywgaGFuZGxlTW92ZSk7CiAgICAgICAgcGxvdC5ldmVudExpc3RlbmVySG9va3MuYWRkT25jZSgnanFwbG90TW91c2VEb3duJywgaGFuZGxlTW91c2VEb3duKTsKICAgICAgICBwbG90LmV2ZW50TGlzdGVuZXJIb29rcy5hZGRPbmNlKCdqcXBsb3RNb3VzZVVwJywgaGFuZGxlTW91c2VVcCk7CiAgICAgICAgcGxvdC5ldmVudExpc3RlbmVySG9va3MuYWRkT25jZSgnanFwbG90Q2xpY2snLCBoYW5kbGVDbGljayk7CiAgICAgICAgcGxvdC5ldmVudExpc3RlbmVySG9va3MuYWRkT25jZSgnanFwbG90UmlnaHRDbGljaycsIGhhbmRsZVJpZ2h0Q2xpY2spOwogICAgICAgIHBsb3QucG9zdERyYXdIb29rcy5hZGRPbmNlKHBvc3RQbG90RHJhdyk7ICAgICAgICAKICAgICAgICAKICAgIH07CiAgICAKICAgIC8vIGdyaWREYXRhIHdpbGwgYmUgb2YgZm9ybSBbbGFiZWwsIHBlcmNlbnRhZ2Ugb2YgdG90YWxdCiAgICAkLmpxcGxvdC5GdW5uZWxSZW5kZXJlci5wcm90b3R5cGUuc2V0R3JpZERhdGEgPSBmdW5jdGlvbihwbG90KSB7CiAgICAgICAgLy8gc2V0IGdyaWREYXRhIHByb3BlcnR5LiAgVGhpcyB3aWxsIGhvbGQgYW5nbGUgaW4gcmFkaWFucyBvZiBlYWNoIGRhdGEgcG9pbnQuCiAgICAgICAgdmFyIHN1bSA9IDA7CiAgICAgICAgdmFyIHRkID0gW107CiAgICAgICAgZm9yICh2YXIgaT0wOyBpPHRoaXMuZGF0YS5sZW5ndGg7IGkrKyl7CiAgICAgICAgICAgIHN1bSArPSB0aGlzLmRhdGFbaV1bMV07CiAgICAgICAgICAgIHRkLnB1c2goW3RoaXMuZGF0YVtpXVswXSwgdGhpcy5kYXRhW2ldWzFdXSk7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC8vIG5vcm1hbGl6ZSB5IHZhbHVlcywgc28gYXJlYXMgYXJlIHByb3BvcnRpb25hbC4KICAgICAgICBmb3IgKHZhciBpPTA7IGk8dGQubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgdGRbaV1bMV0gPSB0ZFtpXVsxXS9zdW07CiAgICAgICAgfQogICAgICAgIAogICAgICAgIHRoaXMuX2Jhc2VzID0gbmV3IEFycmF5KHRkLmxlbmd0aCArIDEpOwogICAgICAgIHRoaXMuX2xlbmd0aHMgPSBuZXcgQXJyYXkodGQubGVuZ3RoKTsKICAgICAgICAKICAgICAgICB0aGlzLmdyaWREYXRhID0gdGQ7CiAgICB9OwogICAgCiAgICAkLmpxcGxvdC5GdW5uZWxSZW5kZXJlci5wcm90b3R5cGUubWFrZUdyaWREYXRhID0gZnVuY3Rpb24oZGF0YSwgcGxvdCkgewogICAgICAgIC8vIHNldCBncmlkRGF0YSBwcm9wZXJ0eS4gIFRoaXMgd2lsbCBob2xkIGFuZ2xlIGluIHJhZGlhbnMgb2YgZWFjaCBkYXRhIHBvaW50LgogICAgICAgIHZhciBzdW0gPSAwOwogICAgICAgIHZhciB0ZCA9IFtdOwogICAgICAgIGZvciAodmFyIGk9MDsgaTx0aGlzLmRhdGEubGVuZ3RoOyBpKyspewogICAgICAgICAgICBzdW0gKz0gdGhpcy5kYXRhW2ldWzFdOwogICAgICAgICAgICB0ZC5wdXNoKFt0aGlzLmRhdGFbaV1bMF0sIHRoaXMuZGF0YVtpXVsxXV0pOwogICAgICAgIH0KICAgICAgICAKICAgICAgICAvLyBub3JtYWxpemUgeSB2YWx1ZXMsIHNvIGFyZWFzIGFyZSBwcm9wb3J0aW9uYWwuCiAgICAgICAgZm9yICh2YXIgaT0wOyBpPHRkLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIHRkW2ldWzFdID0gdGRbaV1bMV0vc3VtOwogICAgICAgIH0KICAgICAgICAKICAgICAgICB0aGlzLl9iYXNlcyA9IG5ldyBBcnJheSh0ZC5sZW5ndGggKyAxKTsKICAgICAgICB0aGlzLl9sZW5ndGhzID0gbmV3IEFycmF5KHRkLmxlbmd0aCk7CiAgICAgICAgCiAgICAgICAgcmV0dXJuIHRkOwogICAgfTsKICAgIAogICAgJC5qcXBsb3QuRnVubmVsUmVuZGVyZXIucHJvdG90eXBlLmRyYXdTZWN0aW9uID0gZnVuY3Rpb24gKGN0eCwgdmVydGljZXMsIGNvbG9yLCBpc1NoYWRvdykgewogICAgICAgIHZhciBmaWxsID0gdGhpcy5maWxsOwogICAgICAgIHZhciBsaW5lV2lkdGggPSB0aGlzLmxpbmVXaWR0aDsKICAgICAgICBjdHguc2F2ZSgpOwogICAgICAgIAogICAgICAgIGlmIChpc1NoYWRvdykgewogICAgICAgICAgICBmb3IgKHZhciBpPTA7IGk8dGhpcy5zaGFkb3dEZXB0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICBjdHguc2F2ZSgpOwogICAgICAgICAgICAgICAgY3R4LnRyYW5zbGF0ZSh0aGlzLnNoYWRvd09mZnNldCpNYXRoLmNvcyh0aGlzLnNoYWRvd0FuZ2xlLzE4MCpNYXRoLlBJKSwgdGhpcy5zaGFkb3dPZmZzZXQqTWF0aC5zaW4odGhpcy5zaGFkb3dBbmdsZS8xODAqTWF0aC5QSSkpOwogICAgICAgICAgICAgICAgZG9EcmF3KCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGRvRHJhdygpOwogICAgICAgIH0KICAgICAgICAKICAgICAgICBmdW5jdGlvbiBkb0RyYXcgKCkgewogICAgICAgICAgICBjdHguYmVnaW5QYXRoKCk7ICAKICAgICAgICAgICAgY3R4LmZpbGxTdHlsZSA9IGNvbG9yOwogICAgICAgICAgICBjdHguc3Ryb2tlU3R5bGUgPSBjb2xvcjsKICAgICAgICAgICAgY3R4LmxpbmVXaWR0aCA9IGxpbmVXaWR0aDsKICAgICAgICAgICAgY3R4Lm1vdmVUbyh2ZXJ0aWNlc1swXVswXSwgdmVydGljZXNbMF1bMV0pOwogICAgICAgICAgICBmb3IgKHZhciBpPTE7IGk8NDsgaSsrKSB7CiAgICAgICAgICAgICAgICBjdHgubGluZVRvKHZlcnRpY2VzW2ldWzBdLCB2ZXJ0aWNlc1tpXVsxXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY3R4LmNsb3NlUGF0aCgpOwogICAgICAgICAgICBpZiAoZmlsbCkgewogICAgICAgICAgICAgICAgY3R4LmZpbGwoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGN0eC5zdHJva2UoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZiAoaXNTaGFkb3cpIHsKICAgICAgICAgICAgZm9yICh2YXIgaT0wOyBpPHRoaXMuc2hhZG93RGVwdGg7IGkrKykgewogICAgICAgICAgICAgICAgY3R4LnJlc3RvcmUoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAKICAgICAgICBjdHgucmVzdG9yZSgpOwogICAgfTsKICAgIAogICAgLy8gY2FsbGVkIHdpdGggc2NvcGUgb2Ygc2VyaWVzCiAgICAkLmpxcGxvdC5GdW5uZWxSZW5kZXJlci5wcm90b3R5cGUuZHJhdyA9IGZ1bmN0aW9uIChjdHgsIGdkLCBvcHRpb25zLCBwbG90KSB7CiAgICAgICAgdmFyIGk7CiAgICAgICAgdmFyIG9wdHMgPSAob3B0aW9ucyAhPSB1bmRlZmluZWQpID8gb3B0aW9ucyA6IHt9OwogICAgICAgIC8vIG9mZnNldCBhbmQgZGlyZWN0aW9uIG9mIG9mZnNldCBkdWUgdG8gbGVnZW5kIHBsYWNlbWVudAogICAgICAgIHZhciBvZmZ4ID0gMDsKICAgICAgICB2YXIgb2ZmeSA9IDA7CiAgICAgICAgdmFyIHRyYW5zID0gMTsKICAgICAgICB0aGlzLl9hcmVhcyA9IFtdOwogICAgICAgIC8vIHZhciBjb2xvckdlbmVyYXRvciA9IG5ldyB0aGlzLmNvbG9yR2VuZXJhdG9yKHRoaXMuc2VyaWVzQ29sb3JzKTsKICAgICAgICBpZiAob3B0aW9ucy5sZWdlbmRJbmZvICYmIG9wdGlvbnMubGVnZW5kSW5mby5wbGFjZW1lbnQgPT0gJ2luc2lkZUdyaWQnKSB7CiAgICAgICAgICAgIHZhciBsaSA9IG9wdGlvbnMubGVnZW5kSW5mbzsKICAgICAgICAgICAgc3dpdGNoIChsaS5sb2NhdGlvbikgewogICAgICAgICAgICAgICAgY2FzZSAnbncnOgogICAgICAgICAgICAgICAgICAgIG9mZnggPSBsaS53aWR0aCArIGxpLnhvZmZzZXQ7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICd3JzoKICAgICAgICAgICAgICAgICAgICBvZmZ4ID0gbGkud2lkdGggKyBsaS54b2Zmc2V0OwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAnc3cnOgogICAgICAgICAgICAgICAgICAgIG9mZnggPSBsaS53aWR0aCArIGxpLnhvZmZzZXQ7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICduZSc6CiAgICAgICAgICAgICAgICAgICAgb2ZmeCA9IGxpLndpZHRoICsgbGkueG9mZnNldDsKICAgICAgICAgICAgICAgICAgICB0cmFucyA9IC0xOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAnZSc6CiAgICAgICAgICAgICAgICAgICAgb2ZmeCA9IGxpLndpZHRoICsgbGkueG9mZnNldDsKICAgICAgICAgICAgICAgICAgICB0cmFucyA9IC0xOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAnc2UnOgogICAgICAgICAgICAgICAgICAgIG9mZnggPSBsaS53aWR0aCArIGxpLnhvZmZzZXQ7CiAgICAgICAgICAgICAgICAgICAgdHJhbnMgPSAtMTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJ24nOgogICAgICAgICAgICAgICAgICAgIG9mZnkgPSBsaS5oZWlnaHQgKyBsaS55b2Zmc2V0OwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAncyc6CiAgICAgICAgICAgICAgICAgICAgb2ZmeSA9IGxpLmhlaWdodCArIGxpLnlvZmZzZXQ7CiAgICAgICAgICAgICAgICAgICAgdHJhbnMgPSAtMTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgdmFyIGxvZmYgPSAodHJhbnM9PTEpID8gdGhpcy5wYWRkaW5nLmxlZnQgKyBvZmZ4IDogdGhpcy5wYWRkaW5nLmxlZnQ7CiAgICAgICAgdmFyIHRvZmYgPSAodHJhbnM9PTEpID8gdGhpcy5wYWRkaW5nLnRvcCArIG9mZnkgOiB0aGlzLnBhZGRpbmcudG9wOwogICAgICAgIHZhciByb2ZmID0gKHRyYW5zPT0tMSkgPyB0aGlzLnBhZGRpbmcucmlnaHQgKyBvZmZ4IDogdGhpcy5wYWRkaW5nLnJpZ2h0OwogICAgICAgIHZhciBib2ZmID0gKHRyYW5zPT0tMSkgPyB0aGlzLnBhZGRpbmcuYm90dG9tICsgb2ZmeSA6IHRoaXMucGFkZGluZy5ib3R0b207CiAgICAgICAgCiAgICAgICAgdmFyIHNoYWRvdyA9IChvcHRzLnNoYWRvdyAhPSB1bmRlZmluZWQpID8gb3B0cy5zaGFkb3cgOiB0aGlzLnNoYWRvdzsKICAgICAgICB2YXIgc2hvd0xpbmUgPSAob3B0cy5zaG93TGluZSAhPSB1bmRlZmluZWQpID8gb3B0cy5zaG93TGluZSA6IHRoaXMuc2hvd0xpbmU7CiAgICAgICAgdmFyIGZpbGwgPSAob3B0cy5maWxsICE9IHVuZGVmaW5lZCkgPyBvcHRzLmZpbGwgOiB0aGlzLmZpbGw7CiAgICAgICAgdmFyIGN3ID0gY3R4LmNhbnZhcy53aWR0aDsKICAgICAgICB2YXIgY2ggPSBjdHguY2FudmFzLmhlaWdodDsKICAgICAgICB0aGlzLl9iYXNlc1swXSA9IGN3IC0gbG9mZiAtIHJvZmY7CiAgICAgICAgdmFyIGx0b3QgPSB0aGlzLl9sZW5ndGggPSBjaCAtIHRvZmYgLSBib2ZmOwoKICAgICAgICB2YXIgaGVuZCA9IHRoaXMuX2Jhc2VzWzBdKnRoaXMud2lkdGhSYXRpbzsKICAgICAgICB0aGlzLl9hdG90ID0gbHRvdC8yICogKHRoaXMuX2Jhc2VzWzBdICsgdGhpcy5fYmFzZXNbMF0qdGhpcy53aWR0aFJhdGlvKTsKCiAgICAgICAgdGhpcy5fYW5nbGUgPSBNYXRoLmF0YW4oKHRoaXMuX2Jhc2VzWzBdIC0gaGVuZCkvMi9sdG90KTsKCiAgICAgICAgZm9yIChpPTA7IGk8Z2QubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgdGhpcy5fYXJlYXMucHVzaChnZFtpXVsxXSAqIHRoaXMuX2F0b3QpOwogICAgICAgIH0KCiAgICAgICAgCiAgICAgICAgdmFyIGd1ZXNzLCBlcnIsIGNvdW50LCBsc3VtPTA7CiAgICAgICAgdmFyIHRvbGVyYW5jZSA9IDAuMDAwMTsKCiAgICAgICAgZm9yIChpPTA7IGk8dGhpcy5fYXJlYXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgZ3Vlc3MgPSB0aGlzLl9hcmVhc1tpXS90aGlzLl9iYXNlc1tpXTsKICAgICAgICAgICAgZXJyID0gOTk5OTk5OwogICAgICAgICAgICB0aGlzLl9sZW5ndGhzW2ldID0gZ3Vlc3M7CiAgICAgICAgICAgIGNvdW50ID0gMDsKICAgICAgICAgICAgd2hpbGUgKGVyciA+IHRoaXMuX2xlbmd0aHNbaV0qdG9sZXJhbmNlICYmIGNvdW50IDwgMTAwKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9sZW5ndGhzW2ldID0gdGhpcy5fYXJlYXNbaV0vKHRoaXMuX2Jhc2VzW2ldIC0gdGhpcy5fbGVuZ3Roc1tpXSAqIE1hdGgudGFuKHRoaXMuX2FuZ2xlKSk7CiAgICAgICAgICAgICAgICBlcnIgPSBNYXRoLmFicyh0aGlzLl9sZW5ndGhzW2ldIC0gZ3Vlc3MpOwogICAgICAgICAgICAgICAgdGhpcy5fYmFzZXNbaSsxXSA9IHRoaXMuX2Jhc2VzW2ldIC0gKDIqdGhpcy5fbGVuZ3Roc1tpXSpNYXRoLnRhbih0aGlzLl9hbmdsZSkpOwogICAgICAgICAgICAgICAgZ3Vlc3MgPSB0aGlzLl9sZW5ndGhzW2ldOwogICAgICAgICAgICAgICAgY291bnQrKzsKICAgICAgICAgICAgfQogICAgICAgICAgICBsc3VtICs9IHRoaXMuX2xlbmd0aHNbaV07CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC8vIGZpZ3VyZSBvdXQgdmVydGljZXMgb2YgZWFjaCBzZWN0aW9uCiAgICAgICAgdGhpcy5fdmVydGljZXMgPSBuZXcgQXJyYXkoZ2QubGVuZ3RoKTsKICAgICAgICAKICAgICAgICAvLyB0aGVzZSBhcmUgNCBjb25lcnMgb2YgZW50aXJlIHRyYXBlem9pZAogICAgICAgIHZhciBwMCA9IFtsb2ZmLCB0b2ZmXSwKICAgICAgICAgICAgcDEgPSBbbG9mZit0aGlzLl9iYXNlc1swXSwgdG9mZl0sCiAgICAgICAgICAgIHAyID0gW2xvZmYgKyAodGhpcy5fYmFzZXNbMF0gLSB0aGlzLl9iYXNlc1t0aGlzLl9iYXNlcy5sZW5ndGgtMV0pLzIsIHRvZmYgKyB0aGlzLl9sZW5ndGhdLAogICAgICAgICAgICBwMyA9IFtwMlswXSArIHRoaXMuX2Jhc2VzW3RoaXMuX2Jhc2VzLmxlbmd0aC0xXSwgcDJbMV1dOwogICAgICAgICAgICAKICAgICAgICAvLyBlcXVhdGlvbnMgb2YgcmlnaHQgYW5kIGxlZnQgc2lkZXMsIHJldHVybnMgeCwgeSB2YWx1ZXMgZ2l2ZW4gaGVpZ2h0IG9mIHNlY3Rpb24gKHkgdmFsdWUpCiAgICAgICAgZnVuY3Rpb24gZmluZGxlZnQgKGwpIHsKICAgICAgICAgICAgdmFyIG0gPSAocDBbMV0gLSBwMlsxXSkvKHAwWzBdIC0gcDJbMF0pOwogICAgICAgICAgICB2YXIgYiA9IHAwWzFdIC0gbSpwMFswXTsKICAgICAgICAgICAgdmFyIHkgPSBsICsgcDBbMV07CiAgICAgICAgICAgIAogICAgICAgICAgICByZXR1cm4gWyh5IC0gYikvbSwgeV07CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGZ1bmN0aW9uIGZpbmRyaWdodCAobCkgewogICAgICAgICAgICB2YXIgbSA9IChwMVsxXSAtIHAzWzFdKS8ocDFbMF0gLSBwM1swXSk7CiAgICAgICAgICAgIHZhciBiID0gcDFbMV0gLSBtKnAxWzBdOwogICAgICAgICAgICB2YXIgeSA9IGwgKyBwMVsxXTsKICAgICAgICAgICAgCiAgICAgICAgICAgIHJldHVybiBbKHkgLSBiKS9tLCB5XTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgdmFyIHggPSBvZmZ4LCB5ID0gb2ZmeTsKICAgICAgICB2YXIgaD0wLCBhZGo9MDsKICAgICAgICAKICAgICAgICBmb3IgKGk9MDsgaTxnZC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICB0aGlzLl92ZXJ0aWNlc1tpXSA9IG5ldyBBcnJheSgpOwogICAgICAgICAgICB2YXIgdiA9IHRoaXMuX3ZlcnRpY2VzW2ldOwogICAgICAgICAgICB2YXIgc20gPSB0aGlzLnNlY3Rpb25NYXJnaW47CiAgICAgICAgICAgIGlmIChpID09IDApIHsKICAgICAgICAgICAgICAgIGFkaiA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGkgPT0gMSkgewogICAgICAgICAgICAgICAgYWRqID0gc20vMzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChpID4gMCAmJiBpIDwgZ2QubGVuZ3RoLTEpIHsKICAgICAgICAgICAgICAgIGFkaiA9IHNtLzI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoaSA9PSBnZC5sZW5ndGggLTEpIHsKICAgICAgICAgICAgICAgIGFkaiA9IDIqc20vMzsKICAgICAgICAgICAgfQogICAgICAgICAgICB2LnB1c2goZmluZGxlZnQoaCthZGopKTsKICAgICAgICAgICAgdi5wdXNoKGZpbmRyaWdodChoK2FkaikpOwogICAgICAgICAgICBoICs9IHRoaXMuX2xlbmd0aHNbaV07CiAgICAgICAgICAgIGlmIChpID09IDApIHsKICAgICAgICAgICAgICAgIGFkaiA9IC0yKnNtLzM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoaSA+IDAgJiYgaSA8IGdkLmxlbmd0aC0xKSB7CiAgICAgICAgICAgICAgICBhZGogPSAtc20vMjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChpID09IGdkLmxlbmd0aCAtIDEpIHsKICAgICAgICAgICAgICAgIGFkaiA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdi5wdXNoKGZpbmRyaWdodChoK2FkaikpOwogICAgICAgICAgICB2LnB1c2goZmluZGxlZnQoaCthZGopKTsKICAgICAgICAgICAgCiAgICAgICAgfQoKICAgICAgICBpZiAodGhpcy5zaGFkb3cpIHsKICAgICAgICAgICAgdmFyIHNoYWRvd0NvbG9yID0gJ3JnYmEoMCwwLDAsJyt0aGlzLnNoYWRvd0FscGhhKycpJzsKICAgICAgICAgICAgZm9yICh2YXIgaT0wOyBpPGdkLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmRyYXdTZWN0aW9uLmNhbGwgKHRoaXMsIGN0eCwgdGhpcy5fdmVydGljZXNbaV0sIHNoYWRvd0NvbG9yLCB0cnVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICB9CiAgICAgICAgZm9yICh2YXIgaT0wOyBpPGdkLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIHZhciB2ID0gdGhpcy5fdmVydGljZXNbaV07CiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuZHJhd1NlY3Rpb24uY2FsbCAodGhpcywgY3R4LCB2LCB0aGlzLnNlcmllc0NvbG9yc1tpXSk7CiAgICAgICAgICAgIAogICAgICAgICAgICBpZiAodGhpcy5zaG93RGF0YUxhYmVscyAmJiBnZFtpXVsxXSoxMDAgPj0gdGhpcy5kYXRhTGFiZWxUaHJlc2hvbGQpIHsKICAgICAgICAgICAgICAgIHZhciBmc3RyLCBsYWJlbDsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgaWYgKHRoaXMuZGF0YUxhYmVscyA9PSAnbGFiZWwnKSB7CiAgICAgICAgICAgICAgICAgICAgZnN0ciA9IHRoaXMuZGF0YUxhYmVsRm9ybWF0U3RyaW5nIHx8ICclcyc7CiAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSAkLmpxcGxvdC5zcHJpbnRmKGZzdHIsIGdkW2ldWzBdKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuZGF0YUxhYmVscyA9PSAndmFsdWUnKSB7CiAgICAgICAgICAgICAgICAgICAgZnN0ciA9IHRoaXMuZGF0YUxhYmVsRm9ybWF0U3RyaW5nIHx8ICclZCc7CiAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSAkLmpxcGxvdC5zcHJpbnRmKGZzdHIsIHRoaXMuZGF0YVtpXVsxXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICh0aGlzLmRhdGFMYWJlbHMgPT0gJ3BlcmNlbnQnKSB7CiAgICAgICAgICAgICAgICAgICAgZnN0ciA9IHRoaXMuZGF0YUxhYmVsRm9ybWF0U3RyaW5nIHx8ICclZCUlJzsKICAgICAgICAgICAgICAgICAgICBsYWJlbCA9ICQuanFwbG90LnNwcmludGYoZnN0ciwgZ2RbaV1bMV0qMTAwKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuZGF0YUxhYmVscy5jb25zdHJ1Y3RvciA9PSBBcnJheSkgewogICAgICAgICAgICAgICAgICAgIGZzdHIgPSB0aGlzLmRhdGFMYWJlbEZvcm1hdFN0cmluZyB8fCAnJXMnOwogICAgICAgICAgICAgICAgICAgIGxhYmVsID0gJC5qcXBsb3Quc3ByaW50Zihmc3RyLCB0aGlzLmRhdGFMYWJlbHNbdGhpcy5fZGF0YUluZGljZXNbaV1dKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGZhY3QgPSAodGhpcy5fcmFkaXVzICkgKiB0aGlzLmRhdGFMYWJlbFBvc2l0aW9uRmFjdG9yICsgdGhpcy5zbGljZU1hcmdpbiArIHRoaXMuZGF0YUxhYmVsTnVkZ2U7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciB4ID0gKHZbMF1bMF0gKyB2WzFdWzBdKS8yICsgdGhpcy5jYW52YXMuX29mZnNldHMubGVmdDsKICAgICAgICAgICAgICAgIHZhciB5ID0gKHZbMV1bMV0gKyB2WzJdWzFdKS8yICsgdGhpcy5jYW52YXMuX29mZnNldHMudG9wOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgbGFiZWxlbGVtID0gJCgnPHNwYW4gY2xhc3M9ImpxcGxvdC1mdW5uZWwtc2VyaWVzIGpxcGxvdC1kYXRhLWxhYmVsIiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7Ij4nICsgbGFiZWwgKyAnPC9zcGFuPicpLmluc2VydEJlZm9yZShwbG90LmV2ZW50Q2FudmFzLl9lbGVtKTsKICAgICAgICAgICAgICAgIHggLT0gbGFiZWxlbGVtLndpZHRoKCkvMjsKICAgICAgICAgICAgICAgIHkgLT0gbGFiZWxlbGVtLmhlaWdodCgpLzI7CiAgICAgICAgICAgICAgICB4ID0gTWF0aC5yb3VuZCh4KTsKICAgICAgICAgICAgICAgIHkgPSBNYXRoLnJvdW5kKHkpOwogICAgICAgICAgICAgICAgbGFiZWxlbGVtLmNzcyh7bGVmdDogeCwgdG9wOiB5fSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgfQogICAgICAgICAgICAgICAKICAgIH07CiAgICAKICAgICQuanFwbG90LkZ1bm5lbEF4aXNSZW5kZXJlciA9IGZ1bmN0aW9uKCkgewogICAgICAgICQuanFwbG90LkxpbmVhckF4aXNSZW5kZXJlci5jYWxsKHRoaXMpOwogICAgfTsKICAgIAogICAgJC5qcXBsb3QuRnVubmVsQXhpc1JlbmRlcmVyLnByb3RvdHlwZSA9IG5ldyAkLmpxcGxvdC5MaW5lYXJBeGlzUmVuZGVyZXIoKTsKICAgICQuanFwbG90LkZ1bm5lbEF4aXNSZW5kZXJlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSAkLmpxcGxvdC5GdW5uZWxBeGlzUmVuZGVyZXI7CiAgICAgICAgCiAgICAKICAgIC8vIFRoZXJlIGFyZSBubyB0cmFkaXRpb25hbCBheGVzIG9uIGEgZnVubmVsIGNoYXJ0LiAgV2UganVzdCBuZWVkIHRvIHByb3ZpZGUKICAgIC8vIGR1bW15IG9iamVjdHMgd2l0aCBwcm9wZXJ0aWVzIHNvIHRoZSBwbG90IHdpbGwgcmVuZGVyLgogICAgLy8gY2FsbGVkIHdpdGggc2NvcGUgb2YgYXhpcyBvYmplY3QuCiAgICAkLmpxcGxvdC5GdW5uZWxBeGlzUmVuZGVyZXIucHJvdG90eXBlLmluaXQgPSBmdW5jdGlvbihvcHRpb25zKXsKICAgICAgICAvLwogICAgICAgIHRoaXMudGlja1JlbmRlcmVyID0gJC5qcXBsb3QuRnVubmVsVGlja1JlbmRlcmVyOwogICAgICAgICQuZXh0ZW5kKHRydWUsIHRoaXMsIG9wdGlvbnMpOwogICAgICAgIC8vIEkgZG9uJ3QgdGhpbmsgSSdtIGdvaW5nIHRvIG5lZWQgX2RhdGFCb3VuZHMgaGVyZS4KICAgICAgICAvLyBoYXZlIHRvIGdvIEF4aXMgc2NhbGluZyBpbiBhIHdheSB0byBmaXQgY2hhcnQgb250byBwbG90IGFyZWEKICAgICAgICAvLyBhbmQgcHJvdmlkZSB1MnAgYW5kIHAydSBmdW5jdGlvbmFsaXR5IGZvciBtb3VzZSBjdXJzb3IsIGV0Yy4KICAgICAgICAvLyBmb3IgY29udmllbmVuY2Ugc2V0IF9kYXRhQm91bmRzIHRvIDAgYW5kIDEwMCBhbmQKICAgICAgICAvLyBzZXQgbWluL21heCB0byAwIGFuZCAxMDAuCiAgICAgICAgdGhpcy5fZGF0YUJvdW5kcyA9IHttaW46MCwgbWF4OjEwMH07CiAgICAgICAgdGhpcy5taW4gPSAwOwogICAgICAgIHRoaXMubWF4ID0gMTAwOwogICAgICAgIHRoaXMuc2hvd1RpY2tzID0gZmFsc2U7CiAgICAgICAgdGhpcy50aWNrcyA9IFtdOwogICAgICAgIHRoaXMuc2hvd01hcmsgPSBmYWxzZTsKICAgICAgICB0aGlzLnNob3cgPSBmYWxzZTsgCiAgICB9OwogICAgCiAgICAKICAgIAogICAgLyoqCiAgICAgKiBDbGFzczogJC5qcXBsb3QuRnVubmVsTGVnZW5kUmVuZGVyZXIKICAgICAqIExlZ2VuZCBSZW5kZXJlciBzcGVjaWZpYyB0byBmdW5uZWwgcGxvdHMuICBTZXQgYnkgZGVmYXVsdAogICAgICogd2hlbiB0aGUgdXNlciBjcmVhdGVzIGEgZnVubmVsIHBsb3QuCiAgICAgKi8KICAgICQuanFwbG90LkZ1bm5lbExlZ2VuZFJlbmRlcmVyID0gZnVuY3Rpb24oKXsKICAgICAgICAkLmpxcGxvdC5UYWJsZUxlZ2VuZFJlbmRlcmVyLmNhbGwodGhpcyk7CiAgICB9OwogICAgCiAgICAkLmpxcGxvdC5GdW5uZWxMZWdlbmRSZW5kZXJlci5wcm90b3R5cGUgPSBuZXcgJC5qcXBsb3QuVGFibGVMZWdlbmRSZW5kZXJlcigpOwogICAgJC5qcXBsb3QuRnVubmVsTGVnZW5kUmVuZGVyZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gJC5qcXBsb3QuRnVubmVsTGVnZW5kUmVuZGVyZXI7CiAgICAKICAgICQuanFwbG90LkZ1bm5lbExlZ2VuZFJlbmRlcmVyLnByb3RvdHlwZS5pbml0ID0gZnVuY3Rpb24ob3B0aW9ucykgewogICAgICAgIC8vIEdyb3VwOiBQcm9wZXJ0aWVzCiAgICAgICAgLy8KICAgICAgICAvLyBwcm9wOiBudW1iZXJSb3dzCiAgICAgICAgLy8gTWF4aW11bSBudW1iZXIgb2Ygcm93cyBpbiB0aGUgbGVnZW5kLiAgMCBvciBudWxsIGZvciB1bmxpbWl0ZWQuCiAgICAgICAgdGhpcy5udW1iZXJSb3dzID0gbnVsbDsKICAgICAgICAvLyBwcm9wOiBudW1iZXJDb2x1bW5zCiAgICAgICAgLy8gTWF4aW11bSBudW1iZXIgb2YgY29sdW1ucyBpbiB0aGUgbGVnZW5kLiAgMCBvciBudWxsIGZvciB1bmxpbWl0ZWQuCiAgICAgICAgdGhpcy5udW1iZXJDb2x1bW5zID0gbnVsbDsKICAgICAgICAkLmV4dGVuZCh0cnVlLCB0aGlzLCBvcHRpb25zKTsKICAgIH07CiAgICAKICAgIC8vIGNhbGxlZCB3aXRoIGNvbnRleHQgb2YgbGVnZW5kCiAgICAkLmpxcGxvdC5GdW5uZWxMZWdlbmRSZW5kZXJlci5wcm90b3R5cGUuZHJhdyA9IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBsZWdlbmQgPSB0aGlzOwogICAgICAgIGlmICh0aGlzLnNob3cpIHsKICAgICAgICAgICAgdmFyIHNlcmllcyA9IHRoaXMuX3NlcmllczsKICAgICAgICAgICAgdmFyIHNzID0gJ3Bvc2l0aW9uOmFic29sdXRlOyc7CiAgICAgICAgICAgIHNzICs9ICh0aGlzLmJhY2tncm91bmQpID8gJ2JhY2tncm91bmQ6Jyt0aGlzLmJhY2tncm91bmQrJzsnIDogJyc7CiAgICAgICAgICAgIHNzICs9ICh0aGlzLmJvcmRlcikgPyAnYm9yZGVyOicrdGhpcy5ib3JkZXIrJzsnIDogJyc7CiAgICAgICAgICAgIHNzICs9ICh0aGlzLmZvbnRTaXplKSA/ICdmb250LXNpemU6Jyt0aGlzLmZvbnRTaXplKyc7JyA6ICcnOwogICAgICAgICAgICBzcyArPSAodGhpcy5mb250RmFtaWx5KSA/ICdmb250LWZhbWlseTonK3RoaXMuZm9udEZhbWlseSsnOycgOiAnJzsKICAgICAgICAgICAgc3MgKz0gKHRoaXMudGV4dENvbG9yKSA/ICdjb2xvcjonK3RoaXMudGV4dENvbG9yKyc7JyA6ICcnOwogICAgICAgICAgICBzcyArPSAodGhpcy5tYXJnaW5Ub3AgIT0gbnVsbCkgPyAnbWFyZ2luLXRvcDonK3RoaXMubWFyZ2luVG9wKyc7JyA6ICcnOwogICAgICAgICAgICBzcyArPSAodGhpcy5tYXJnaW5Cb3R0b20gIT0gbnVsbCkgPyAnbWFyZ2luLWJvdHRvbTonK3RoaXMubWFyZ2luQm90dG9tKyc7JyA6ICcnOwogICAgICAgICAgICBzcyArPSAodGhpcy5tYXJnaW5MZWZ0ICE9IG51bGwpID8gJ21hcmdpbi1sZWZ0OicrdGhpcy5tYXJnaW5MZWZ0Kyc7JyA6ICcnOwogICAgICAgICAgICBzcyArPSAodGhpcy5tYXJnaW5SaWdodCAhPSBudWxsKSA/ICdtYXJnaW4tcmlnaHQ6Jyt0aGlzLm1hcmdpblJpZ2h0Kyc7JyA6ICcnOwogICAgICAgICAgICB0aGlzLl9lbGVtID0gJCgnPHRhYmxlIGNsYXNzPSJqcXBsb3QtdGFibGUtbGVnZW5kIiBzdHlsZT0iJytzcysnIj48L3RhYmxlPicpOwogICAgICAgICAgICAvLyBGdW5uZWwgY2hhcnRzIGxlZ2VuZHMgZG9uJ3QgZ28gYnkgbnVtYmVyIG9mIHNlcmllcywgYnV0IGJ5IG51bWJlciBvZiBkYXRhIHBvaW50cwogICAgICAgICAgICAvLyBpbiB0aGUgc2VyaWVzLiAgUmVmYWN0b3IgdGhpbmdzIGhlcmUgZm9yIHRoYXQuCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcGFkID0gZmFsc2UsIAogICAgICAgICAgICAgICAgcmV2ZXJzZSA9IGZhbHNlLAogICAgICAgICAgICAgICAgbnIsIG5jOwogICAgICAgICAgICB2YXIgcyA9IHNlcmllc1swXTsKICAgICAgICAgICAgdmFyIGNvbG9yR2VuZXJhdG9yID0gbmV3ICQuanFwbG90LkNvbG9yR2VuZXJhdG9yKHMuc2VyaWVzQ29sb3JzKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIGlmIChzLnNob3cpIHsKICAgICAgICAgICAgICAgIHZhciBwZCA9IHMuZGF0YTsKICAgICAgICAgICAgICAgIGlmICh0aGlzLm51bWJlclJvd3MpIHsKICAgICAgICAgICAgICAgICAgICBuciA9IHRoaXMubnVtYmVyUm93czsKICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMubnVtYmVyQ29sdW1ucyl7CiAgICAgICAgICAgICAgICAgICAgICAgIG5jID0gTWF0aC5jZWlsKHBkLmxlbmd0aC9ucik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2V7CiAgICAgICAgICAgICAgICAgICAgICAgIG5jID0gdGhpcy5udW1iZXJDb2x1bW5zOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMubnVtYmVyQ29sdW1ucykgewogICAgICAgICAgICAgICAgICAgIG5jID0gdGhpcy5udW1iZXJDb2x1bW5zOwogICAgICAgICAgICAgICAgICAgIG5yID0gTWF0aC5jZWlsKHBkLmxlbmd0aC90aGlzLm51bWJlckNvbHVtbnMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgbnIgPSBwZC5sZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgbmMgPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaSwgaiwgdHIsIHRkMSwgdGQyLCBsdCwgcnMsIGNvbG9yOwogICAgICAgICAgICAgICAgdmFyIGlkeCA9IDA7ICAgIAogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaTxucjsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHJldmVyc2UpewogICAgICAgICAgICAgICAgICAgICAgICB0ciA9ICQoJzx0ciBjbGFzcz0ianFwbG90LXRhYmxlLWxlZ2VuZCI+PC90cj4nKS5wcmVwZW5kVG8odGhpcy5fZWxlbSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2V7CiAgICAgICAgICAgICAgICAgICAgICAgIHRyID0gJCgnPHRyIGNsYXNzPSJqcXBsb3QtdGFibGUtbGVnZW5kIj48L3RyPicpLmFwcGVuZFRvKHRoaXMuX2VsZW0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmb3IgKGo9MDsgajxuYzsgaisrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpZHggPCBwZC5sZW5ndGgpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbHQgPSB0aGlzLmxhYmVsc1tpZHhdIHx8IHBkW2lkeF1bMF0udG9TdHJpbmcoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yID0gY29sb3JHZW5lcmF0b3IubmV4dCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXZlcnNlKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaT4wKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PSBuciAtMSl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJzID0gKHBhZCkgPyB0aGlzLnJvd1NwYWNpbmcgOiAnMCc7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRkMSA9ICQoJzx0ZCBjbGFzcz0ianFwbG90LXRhYmxlLWxlZ2VuZCIgc3R5bGU9InRleHQtYWxpZ246Y2VudGVyO3BhZGRpbmctdG9wOicrcnMrJzsiPicrCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxkaXY+PGRpdiBjbGFzcz0ianFwbG90LXRhYmxlLWxlZ2VuZC1zd2F0Y2giIHN0eWxlPSJib3JkZXItY29sb3I6Jytjb2xvcisnOyI+PC9kaXY+JysKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPC9kaXY+PC90ZD4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRkMiA9ICQoJzx0ZCBjbGFzcz0ianFwbG90LXRhYmxlLWxlZ2VuZCIgc3R5bGU9InBhZGRpbmctdG9wOicrcnMrJzsiPjwvdGQ+Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5lc2NhcGVIdG1sKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZDIudGV4dChsdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZDIuaHRtbChsdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV2ZXJzZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRkMi5wcmVwZW5kVG8odHIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRkMS5wcmVwZW5kVG8odHIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGQxLmFwcGVuZFRvKHRyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZDIuYXBwZW5kVG8odHIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZHgrKzsKICAgICAgICAgICAgICAgICAgICB9ICAgCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXMuX2VsZW07ICAgICAgICAgICAgICAgIAogICAgfTsKICAgIAogICAgLy8gJC5qcXBsb3QuRnVubmVsTGVnZW5kUmVuZGVyZXIucHJvdG90eXBlLnBhY2sgPSBmdW5jdGlvbihvZmZzZXRzKSB7CiAgICAvLyAgICAgaWYgKHRoaXMuc2hvdykgewogICAgLy8gICAgICAgICAvLyBmYWtlIGEgZ3JpZCBmb3IgcG9zaXRpb25pbmcKICAgIC8vICAgICAgICAgdmFyIGdyaWQgPSB7X3RvcDpvZmZzZXRzLnRvcCwgX2xlZnQ6b2Zmc2V0cy5sZWZ0LCBfcmlnaHQ6b2Zmc2V0cy5yaWdodCwgX2JvdHRvbTp0aGlzLl9wbG90RGltZW5zaW9ucy5oZWlnaHQgLSBvZmZzZXRzLmJvdHRvbX07ICAgICAgICAKICAgIC8vICAgICAgICAgaWYgKHRoaXMucGxhY2VtZW50ID09ICdpbnNpZGVHcmlkJykgewogICAgLy8gICAgICAgICAgICAgc3dpdGNoICh0aGlzLmxvY2F0aW9uKSB7CiAgICAvLyAgICAgICAgICAgICAgICAgY2FzZSAnbncnOgogICAgLy8gICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IGdyaWQuX2xlZnQgKyB0aGlzLnhvZmZzZXQ7CiAgICAvLyAgICAgICAgICAgICAgICAgICAgIHZhciBiID0gZ3JpZC5fdG9wICsgdGhpcy55b2Zmc2V0OwogICAgLy8gICAgICAgICAgICAgICAgICAgICB0aGlzLl9lbGVtLmNzcygnbGVmdCcsIGEpOwogICAgLy8gICAgICAgICAgICAgICAgICAgICB0aGlzLl9lbGVtLmNzcygndG9wJywgYik7CiAgICAvLyAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgLy8gICAgICAgICAgICAgICAgIGNhc2UgJ24nOgogICAgLy8gICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IChvZmZzZXRzLmxlZnQgKyAodGhpcy5fcGxvdERpbWVuc2lvbnMud2lkdGggLSBvZmZzZXRzLnJpZ2h0KSkvMiAtIHRoaXMuZ2V0V2lkdGgoKS8yOwogICAgLy8gICAgICAgICAgICAgICAgICAgICB2YXIgYiA9IGdyaWQuX3RvcCArIHRoaXMueW9mZnNldDsKICAgIC8vICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZWxlbS5jc3MoJ2xlZnQnLCBhKTsKICAgIC8vICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZWxlbS5jc3MoJ3RvcCcsIGIpOwogICAgLy8gICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgIC8vICAgICAgICAgICAgICAgICBjYXNlICduZSc6CiAgICAvLyAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gb2Zmc2V0cy5yaWdodCArIHRoaXMueG9mZnNldDsKICAgIC8vICAgICAgICAgICAgICAgICAgICAgdmFyIGIgPSBncmlkLl90b3AgKyB0aGlzLnlvZmZzZXQ7CiAgICAvLyAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2VsZW0uY3NzKHtyaWdodDphLCB0b3A6Yn0pOwogICAgLy8gICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgIC8vICAgICAgICAgICAgICAgICBjYXNlICdlJzoKICAgIC8vICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSBvZmZzZXRzLnJpZ2h0ICsgdGhpcy54b2Zmc2V0OwogICAgLy8gICAgICAgICAgICAgICAgICAgICB2YXIgYiA9IChvZmZzZXRzLnRvcCArICh0aGlzLl9wbG90RGltZW5zaW9ucy5oZWlnaHQgLSBvZmZzZXRzLmJvdHRvbSkpLzIgLSB0aGlzLmdldEhlaWdodCgpLzI7CiAgICAvLyAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2VsZW0uY3NzKHtyaWdodDphLCB0b3A6Yn0pOwogICAgLy8gICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgIC8vICAgICAgICAgICAgICAgICBjYXNlICdzZSc6CiAgICAvLyAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gb2Zmc2V0cy5yaWdodCArIHRoaXMueG9mZnNldDsKICAgIC8vICAgICAgICAgICAgICAgICAgICAgdmFyIGIgPSBvZmZzZXRzLmJvdHRvbSArIHRoaXMueW9mZnNldDsKICAgIC8vICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZWxlbS5jc3Moe3JpZ2h0OmEsIGJvdHRvbTpifSk7CiAgICAvLyAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgLy8gICAgICAgICAgICAgICAgIGNhc2UgJ3MnOgogICAgLy8gICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IChvZmZzZXRzLmxlZnQgKyAodGhpcy5fcGxvdERpbWVuc2lvbnMud2lkdGggLSBvZmZzZXRzLnJpZ2h0KSkvMiAtIHRoaXMuZ2V0V2lkdGgoKS8yOwogICAgLy8gICAgICAgICAgICAgICAgICAgICB2YXIgYiA9IG9mZnNldHMuYm90dG9tICsgdGhpcy55b2Zmc2V0OwogICAgLy8gICAgICAgICAgICAgICAgICAgICB0aGlzLl9lbGVtLmNzcyh7bGVmdDphLCBib3R0b206Yn0pOwogICAgLy8gICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgIC8vICAgICAgICAgICAgICAgICBjYXNlICdzdyc6CiAgICAvLyAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gZ3JpZC5fbGVmdCArIHRoaXMueG9mZnNldDsKICAgIC8vICAgICAgICAgICAgICAgICAgICAgdmFyIGIgPSBvZmZzZXRzLmJvdHRvbSArIHRoaXMueW9mZnNldDsKICAgIC8vICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZWxlbS5jc3Moe2xlZnQ6YSwgYm90dG9tOmJ9KTsKICAgIC8vICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAvLyAgICAgICAgICAgICAgICAgY2FzZSAndyc6CiAgICAvLyAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gZ3JpZC5fbGVmdCArIHRoaXMueG9mZnNldDsKICAgIC8vICAgICAgICAgICAgICAgICAgICAgdmFyIGIgPSAob2Zmc2V0cy50b3AgKyAodGhpcy5fcGxvdERpbWVuc2lvbnMuaGVpZ2h0IC0gb2Zmc2V0cy5ib3R0b20pKS8yIC0gdGhpcy5nZXRIZWlnaHQoKS8yOwogICAgLy8gICAgICAgICAgICAgICAgICAgICB0aGlzLl9lbGVtLmNzcyh7bGVmdDphLCB0b3A6Yn0pOwogICAgLy8gICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgIC8vICAgICAgICAgICAgICAgICBkZWZhdWx0OiAgLy8gc2FtZSBhcyAnc2UnCiAgICAvLyAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gZ3JpZC5fcmlnaHQgLSB0aGlzLnhvZmZzZXQ7CiAgICAvLyAgICAgICAgICAgICAgICAgICAgIHZhciBiID0gZ3JpZC5fYm90dG9tICsgdGhpcy55b2Zmc2V0OwogICAgLy8gICAgICAgICAgICAgICAgICAgICB0aGlzLl9lbGVtLmNzcyh7cmlnaHQ6YSwgYm90dG9tOmJ9KTsKICAgIC8vICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAvLyAgICAgICAgICAgICB9CiAgICAvLyAgICAgICAgICAgICAKICAgIC8vICAgICAgICAgfQogICAgLy8gICAgICAgICBlbHNlIHsKICAgIC8vICAgICAgICAgICAgIHN3aXRjaCAodGhpcy5sb2NhdGlvbikgewogICAgLy8gICAgICAgICAgICAgICAgIGNhc2UgJ253JzoKICAgIC8vICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSB0aGlzLl9wbG90RGltZW5zaW9ucy53aWR0aCAtIGdyaWQuX2xlZnQgKyB0aGlzLnhvZmZzZXQ7CiAgICAvLyAgICAgICAgICAgICAgICAgICAgIHZhciBiID0gZ3JpZC5fdG9wICsgdGhpcy55b2Zmc2V0OwogICAgLy8gICAgICAgICAgICAgICAgICAgICB0aGlzLl9lbGVtLmNzcygncmlnaHQnLCBhKTsKICAgIC8vICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZWxlbS5jc3MoJ3RvcCcsIGIpOwogICAgLy8gICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgIC8vICAgICAgICAgICAgICAgICBjYXNlICduJzoKICAgIC8vICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSAob2Zmc2V0cy5sZWZ0ICsgKHRoaXMuX3Bsb3REaW1lbnNpb25zLndpZHRoIC0gb2Zmc2V0cy5yaWdodCkpLzIgLSB0aGlzLmdldFdpZHRoKCkvMjsKICAgIC8vICAgICAgICAgICAgICAgICAgICAgdmFyIGIgPSB0aGlzLl9wbG90RGltZW5zaW9ucy5oZWlnaHQgLSBncmlkLl90b3AgKyB0aGlzLnlvZmZzZXQ7CiAgICAvLyAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2VsZW0uY3NzKCdsZWZ0JywgYSk7CiAgICAvLyAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2VsZW0uY3NzKCdib3R0b20nLCBiKTsKICAgIC8vICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAvLyAgICAgICAgICAgICAgICAgY2FzZSAnbmUnOgogICAgLy8gICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IHRoaXMuX3Bsb3REaW1lbnNpb25zLndpZHRoIC0gb2Zmc2V0cy5yaWdodCArIHRoaXMueG9mZnNldDsKICAgIC8vICAgICAgICAgICAgICAgICAgICAgdmFyIGIgPSBncmlkLl90b3AgKyB0aGlzLnlvZmZzZXQ7CiAgICAvLyAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2VsZW0uY3NzKHtsZWZ0OmEsIHRvcDpifSk7CiAgICAvLyAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgLy8gICAgICAgICAgICAgICAgIGNhc2UgJ2UnOgogICAgLy8gICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IHRoaXMuX3Bsb3REaW1lbnNpb25zLndpZHRoIC0gb2Zmc2V0cy5yaWdodCArIHRoaXMueG9mZnNldDsKICAgIC8vICAgICAgICAgICAgICAgICAgICAgdmFyIGIgPSAob2Zmc2V0cy50b3AgKyAodGhpcy5fcGxvdERpbWVuc2lvbnMuaGVpZ2h0IC0gb2Zmc2V0cy5ib3R0b20pKS8yIC0gdGhpcy5nZXRIZWlnaHQoKS8yOwogICAgLy8gICAgICAgICAgICAgICAgICAgICB0aGlzLl9lbGVtLmNzcyh7bGVmdDphLCB0b3A6Yn0pOwogICAgLy8gICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgIC8vICAgICAgICAgICAgICAgICBjYXNlICdzZSc6CiAgICAvLyAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gdGhpcy5fcGxvdERpbWVuc2lvbnMud2lkdGggLSBvZmZzZXRzLnJpZ2h0ICsgdGhpcy54b2Zmc2V0OwogICAgLy8gICAgICAgICAgICAgICAgICAgICB2YXIgYiA9IG9mZnNldHMuYm90dG9tICsgdGhpcy55b2Zmc2V0OwogICAgLy8gICAgICAgICAgICAgICAgICAgICB0aGlzLl9lbGVtLmNzcyh7bGVmdDphLCBib3R0b206Yn0pOwogICAgLy8gICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgIC8vICAgICAgICAgICAgICAgICBjYXNlICdzJzoKICAgIC8vICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSAob2Zmc2V0cy5sZWZ0ICsgKHRoaXMuX3Bsb3REaW1lbnNpb25zLndpZHRoIC0gb2Zmc2V0cy5yaWdodCkpLzIgLSB0aGlzLmdldFdpZHRoKCkvMjsKICAgIC8vICAgICAgICAgICAgICAgICAgICAgdmFyIGIgPSB0aGlzLl9wbG90RGltZW5zaW9ucy5oZWlnaHQgLSBvZmZzZXRzLmJvdHRvbSArIHRoaXMueW9mZnNldDsKICAgIC8vICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZWxlbS5jc3Moe2xlZnQ6YSwgdG9wOmJ9KTsKICAgIC8vICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAvLyAgICAgICAgICAgICAgICAgY2FzZSAnc3cnOgogICAgLy8gICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IHRoaXMuX3Bsb3REaW1lbnNpb25zLndpZHRoIC0gZ3JpZC5fbGVmdCArIHRoaXMueG9mZnNldDsKICAgIC8vICAgICAgICAgICAgICAgICAgICAgdmFyIGIgPSBvZmZzZXRzLmJvdHRvbSArIHRoaXMueW9mZnNldDsKICAgIC8vICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZWxlbS5jc3Moe3JpZ2h0OmEsIGJvdHRvbTpifSk7CiAgICAvLyAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgLy8gICAgICAgICAgICAgICAgIGNhc2UgJ3cnOgogICAgLy8gICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IHRoaXMuX3Bsb3REaW1lbnNpb25zLndpZHRoIC0gZ3JpZC5fbGVmdCArIHRoaXMueG9mZnNldDsKICAgIC8vICAgICAgICAgICAgICAgICAgICAgdmFyIGIgPSAob2Zmc2V0cy50b3AgKyAodGhpcy5fcGxvdERpbWVuc2lvbnMuaGVpZ2h0IC0gb2Zmc2V0cy5ib3R0b20pKS8yIC0gdGhpcy5nZXRIZWlnaHQoKS8yOwogICAgLy8gICAgICAgICAgICAgICAgICAgICB0aGlzLl9lbGVtLmNzcyh7cmlnaHQ6YSwgdG9wOmJ9KTsKICAgIC8vICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAvLyAgICAgICAgICAgICAgICAgZGVmYXVsdDogIC8vIHNhbWUgYXMgJ3NlJwogICAgLy8gICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IGdyaWQuX3JpZ2h0IC0gdGhpcy54b2Zmc2V0OwogICAgLy8gICAgICAgICAgICAgICAgICAgICB2YXIgYiA9IGdyaWQuX2JvdHRvbSArIHRoaXMueW9mZnNldDsKICAgIC8vICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZWxlbS5jc3Moe3JpZ2h0OmEsIGJvdHRvbTpifSk7CiAgICAvLyAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgLy8gICAgICAgICAgICAgfQogICAgLy8gICAgICAgICB9CiAgICAvLyAgICAgfSAKICAgIC8vIH07CiAgICAKICAgIC8vIHNldHVwIGRlZmF1bHQgcmVuZGVyZXJzIGZvciBheGVzIGFuZCBsZWdlbmQgc28gdXNlciBkb2Vzbid0IGhhdmUgdG8KICAgIC8vIGNhbGxlZCB3aXRoIHNjb3BlIG9mIHBsb3QKICAgIGZ1bmN0aW9uIHByZUluaXQodGFyZ2V0LCBkYXRhLCBvcHRpb25zKSB7CiAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307CiAgICAgICAgb3B0aW9ucy5heGVzRGVmYXVsdHMgPSBvcHRpb25zLmF4ZXNEZWZhdWx0cyB8fCB7fTsKICAgICAgICBvcHRpb25zLmxlZ2VuZCA9IG9wdGlvbnMubGVnZW5kIHx8IHt9OwogICAgICAgIG9wdGlvbnMuc2VyaWVzRGVmYXVsdHMgPSBvcHRpb25zLnNlcmllc0RlZmF1bHRzIHx8IHt9OwogICAgICAgIC8vIG9ubHkgc2V0IHRoZXNlIGlmIHRoZXJlIGlzIGEgZnVubmVsIHNlcmllcwogICAgICAgIHZhciBzZXRvcHRzID0gZmFsc2U7CiAgICAgICAgaWYgKG9wdGlvbnMuc2VyaWVzRGVmYXVsdHMucmVuZGVyZXIgPT0gJC5qcXBsb3QuRnVubmVsUmVuZGVyZXIpIHsKICAgICAgICAgICAgc2V0b3B0cyA9IHRydWU7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKG9wdGlvbnMuc2VyaWVzKSB7CiAgICAgICAgICAgIGZvciAodmFyIGk9MDsgaSA8IG9wdGlvbnMuc2VyaWVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5zZXJpZXNbaV0ucmVuZGVyZXIgPT0gJC5qcXBsb3QuRnVubmVsUmVuZGVyZXIpIHsKICAgICAgICAgICAgICAgICAgICBzZXRvcHRzID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZiAoc2V0b3B0cykgewogICAgICAgICAgICBvcHRpb25zLmF4ZXNEZWZhdWx0cy5yZW5kZXJlciA9ICQuanFwbG90LkZ1bm5lbEF4aXNSZW5kZXJlcjsKICAgICAgICAgICAgb3B0aW9ucy5sZWdlbmQucmVuZGVyZXIgPSAkLmpxcGxvdC5GdW5uZWxMZWdlbmRSZW5kZXJlcjsKICAgICAgICAgICAgb3B0aW9ucy5sZWdlbmQucHJlRHJhdyA9IHRydWU7CiAgICAgICAgICAgIG9wdGlvbnMuc29ydERhdGEgPSBmYWxzZTsKICAgICAgICAgICAgb3B0aW9ucy5zZXJpZXNEZWZhdWx0cy5wb2ludExhYmVscyA9IHtzaG93OiBmYWxzZX07CiAgICAgICAgfQogICAgfQogICAgCiAgICBmdW5jdGlvbiBwb3N0SW5pdCh0YXJnZXQsIGRhdGEsIG9wdGlvbnMpIHsKICAgICAgICAvLyBpZiBtdWx0aXBsZSBzZXJpZXMsIGFkZCBhIHJlZmVyZW5jZSB0byB0aGUgcHJldmlvdXMgb25lIHNvIHRoYXQKICAgICAgICAvLyBmdW5uZWwgcmluZ3MgY2FuIG5lc3QuCiAgICAgICAgZm9yICh2YXIgaT0wOyBpPHRoaXMuc2VyaWVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIGlmICh0aGlzLnNlcmllc1tpXS5yZW5kZXJlci5jb25zdHJ1Y3RvciA9PSAkLmpxcGxvdC5GdW5uZWxSZW5kZXJlcikgewogICAgICAgICAgICAgICAgLy8gZG9uJ3QgYWxsb3cgbW91c2VvdmVyIGFuZCBtb3VzZWRvd24gYXQgc2FtZSB0aW1lLgogICAgICAgICAgICAgICAgaWYgKHRoaXMuc2VyaWVzW2ldLmhpZ2hsaWdodE1vdXNlT3ZlcikgewogICAgICAgICAgICAgICAgICAgIHRoaXMuc2VyaWVzW2ldLmhpZ2hsaWdodE1vdXNlRG93biA9IGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgCiAgICAvLyBjYWxsZWQgd2l0aCBzY29wZSBvZiBwbG90CiAgICBmdW5jdGlvbiBwb3N0UGFyc2VPcHRpb25zKG9wdGlvbnMpIHsKICAgICAgICBmb3IgKHZhciBpPTA7IGk8dGhpcy5zZXJpZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgdGhpcy5zZXJpZXNbaV0uc2VyaWVzQ29sb3JzID0gdGhpcy5zZXJpZXNDb2xvcnM7CiAgICAgICAgICAgIHRoaXMuc2VyaWVzW2ldLmNvbG9yR2VuZXJhdG9yID0gJC5qcXBsb3QuY29sb3JHZW5lcmF0b3I7CiAgICAgICAgfQogICAgfQogICAgCiAgICBmdW5jdGlvbiBoaWdobGlnaHQgKHBsb3QsIHNpZHgsIHBpZHgpIHsKICAgICAgICB2YXIgcyA9IHBsb3Quc2VyaWVzW3NpZHhdOwogICAgICAgIHZhciBjYW52YXMgPSBwbG90LnBsdWdpbnMuZnVubmVsUmVuZGVyZXIuaGlnaGxpZ2h0Q2FudmFzOwogICAgICAgIGNhbnZhcy5fY3R4LmNsZWFyUmVjdCgwLDAsY2FudmFzLl9jdHguY2FudmFzLndpZHRoLCBjYW52YXMuX2N0eC5jYW52YXMuaGVpZ2h0KTsKICAgICAgICBzLl9oaWdobGlnaHRlZFBvaW50ID0gcGlkeDsKICAgICAgICBwbG90LnBsdWdpbnMuZnVubmVsUmVuZGVyZXIuaGlnaGxpZ2h0ZWRTZXJpZXNJbmRleCA9IHNpZHg7CiAgICAgICAgcy5yZW5kZXJlci5kcmF3U2VjdGlvbi5jYWxsKHMsIGNhbnZhcy5fY3R4LCBzLl92ZXJ0aWNlc1twaWR4XSwgcy5oaWdobGlnaHRDb2xvcnNbcGlkeF0sIGZhbHNlKTsKICAgIH0KICAgIAogICAgZnVuY3Rpb24gdW5oaWdobGlnaHQgKHBsb3QpIHsKICAgICAgICB2YXIgY2FudmFzID0gcGxvdC5wbHVnaW5zLmZ1bm5lbFJlbmRlcmVyLmhpZ2hsaWdodENhbnZhczsKICAgICAgICBjYW52YXMuX2N0eC5jbGVhclJlY3QoMCwwLCBjYW52YXMuX2N0eC5jYW52YXMud2lkdGgsIGNhbnZhcy5fY3R4LmNhbnZhcy5oZWlnaHQpOwogICAgICAgIGZvciAodmFyIGk9MDsgaTxwbG90LnNlcmllcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICBwbG90LnNlcmllc1tpXS5faGlnaGxpZ2h0ZWRQb2ludCA9IG51bGw7CiAgICAgICAgfQogICAgICAgIHBsb3QucGx1Z2lucy5mdW5uZWxSZW5kZXJlci5oaWdobGlnaHRlZFNlcmllc0luZGV4ID0gbnVsbDsKICAgICAgICBwbG90LnRhcmdldC50cmlnZ2VyKCdqcXBsb3REYXRhVW5oaWdobGlnaHQnKTsKICAgIH0KICAgIAogICAgZnVuY3Rpb24gaGFuZGxlTW92ZShldiwgZ3JpZHBvcywgZGF0YXBvcywgbmVpZ2hib3IsIHBsb3QpIHsKICAgICAgICBpZiAobmVpZ2hib3IpIHsKICAgICAgICAgICAgdmFyIGlucyA9IFtuZWlnaGJvci5zZXJpZXNJbmRleCwgbmVpZ2hib3IucG9pbnRJbmRleCwgbmVpZ2hib3IuZGF0YV07CiAgICAgICAgICAgIHZhciBldnQxID0galF1ZXJ5LkV2ZW50KCdqcXBsb3REYXRhTW91c2VPdmVyJyk7CiAgICAgICAgICAgIGV2dDEucGFnZVggPSBldi5wYWdlWDsKICAgICAgICAgICAgZXZ0MS5wYWdlWSA9IGV2LnBhZ2VZOwogICAgICAgICAgICBwbG90LnRhcmdldC50cmlnZ2VyKGV2dDEsIGlucyk7CiAgICAgICAgICAgIGlmIChwbG90LnNlcmllc1tpbnNbMF1dLmhpZ2hsaWdodE1vdXNlT3ZlciAmJiAhKGluc1swXSA9PSBwbG90LnBsdWdpbnMuZnVubmVsUmVuZGVyZXIuaGlnaGxpZ2h0ZWRTZXJpZXNJbmRleCAmJiBpbnNbMV0gPT0gcGxvdC5zZXJpZXNbaW5zWzBdXS5faGlnaGxpZ2h0ZWRQb2ludCkpIHsKICAgICAgICAgICAgICAgIHZhciBldnQgPSBqUXVlcnkuRXZlbnQoJ2pxcGxvdERhdGFIaWdobGlnaHQnKTsKICAgICAgICAgICAgICAgIGV2dC5wYWdlWCA9IGV2LnBhZ2VYOwogICAgICAgICAgICAgICAgZXZ0LnBhZ2VZID0gZXYucGFnZVk7CiAgICAgICAgICAgICAgICBwbG90LnRhcmdldC50cmlnZ2VyKGV2dCwgaW5zKTsKICAgICAgICAgICAgICAgIGhpZ2hsaWdodCAocGxvdCwgaW5zWzBdLCBpbnNbMV0pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKG5laWdoYm9yID09IG51bGwpIHsKICAgICAgICAgICAgdW5oaWdobGlnaHQgKHBsb3QpOwogICAgICAgIH0KICAgIH0KICAgIAogICAgZnVuY3Rpb24gaGFuZGxlTW91c2VEb3duKGV2LCBncmlkcG9zLCBkYXRhcG9zLCBuZWlnaGJvciwgcGxvdCkgewogICAgICAgIGlmIChuZWlnaGJvcikgewogICAgICAgICAgICB2YXIgaW5zID0gW25laWdoYm9yLnNlcmllc0luZGV4LCBuZWlnaGJvci5wb2ludEluZGV4LCBuZWlnaGJvci5kYXRhXTsKICAgICAgICAgICAgaWYgKHBsb3Quc2VyaWVzW2luc1swXV0uaGlnaGxpZ2h0TW91c2VEb3duICYmICEoaW5zWzBdID09IHBsb3QucGx1Z2lucy5mdW5uZWxSZW5kZXJlci5oaWdobGlnaHRlZFNlcmllc0luZGV4ICYmIGluc1sxXSA9PSBwbG90LnNlcmllc1tpbnNbMF1dLl9oaWdobGlnaHRlZFBvaW50KSkgewogICAgICAgICAgICAgICAgdmFyIGV2dCA9IGpRdWVyeS5FdmVudCgnanFwbG90RGF0YUhpZ2hsaWdodCcpOwogICAgICAgICAgICAgICAgZXZ0LnBhZ2VYID0gZXYucGFnZVg7CiAgICAgICAgICAgICAgICBldnQucGFnZVkgPSBldi5wYWdlWTsKICAgICAgICAgICAgICAgIHBsb3QudGFyZ2V0LnRyaWdnZXIoZXZ0LCBpbnMpOwogICAgICAgICAgICAgICAgaGlnaGxpZ2h0IChwbG90LCBpbnNbMF0sIGluc1sxXSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAobmVpZ2hib3IgPT0gbnVsbCkgewogICAgICAgICAgICB1bmhpZ2hsaWdodCAocGxvdCk7CiAgICAgICAgfQogICAgfQogICAgCiAgICBmdW5jdGlvbiBoYW5kbGVNb3VzZVVwKGV2LCBncmlkcG9zLCBkYXRhcG9zLCBuZWlnaGJvciwgcGxvdCkgewogICAgICAgIHZhciBpZHggPSBwbG90LnBsdWdpbnMuZnVubmVsUmVuZGVyZXIuaGlnaGxpZ2h0ZWRTZXJpZXNJbmRleDsKICAgICAgICBpZiAoaWR4ICE9IG51bGwgJiYgcGxvdC5zZXJpZXNbaWR4XS5oaWdobGlnaHRNb3VzZURvd24pIHsKICAgICAgICAgICAgdW5oaWdobGlnaHQocGxvdCk7CiAgICAgICAgfQogICAgfQogICAgCiAgICBmdW5jdGlvbiBoYW5kbGVDbGljayhldiwgZ3JpZHBvcywgZGF0YXBvcywgbmVpZ2hib3IsIHBsb3QpIHsKICAgICAgICBpZiAobmVpZ2hib3IpIHsKICAgICAgICAgICAgdmFyIGlucyA9IFtuZWlnaGJvci5zZXJpZXNJbmRleCwgbmVpZ2hib3IucG9pbnRJbmRleCwgbmVpZ2hib3IuZGF0YV07CiAgICAgICAgICAgIHZhciBldnQgPSBqUXVlcnkuRXZlbnQoJ2pxcGxvdERhdGFDbGljaycpOwogICAgICAgICAgICBldnQucGFnZVggPSBldi5wYWdlWDsKICAgICAgICAgICAgZXZ0LnBhZ2VZID0gZXYucGFnZVk7CiAgICAgICAgICAgIHBsb3QudGFyZ2V0LnRyaWdnZXIoZXZ0LCBpbnMpOwogICAgICAgIH0KICAgIH0KICAgIAogICAgZnVuY3Rpb24gaGFuZGxlUmlnaHRDbGljayhldiwgZ3JpZHBvcywgZGF0YXBvcywgbmVpZ2hib3IsIHBsb3QpIHsKICAgICAgICBpZiAobmVpZ2hib3IpIHsKICAgICAgICAgICAgdmFyIGlucyA9IFtuZWlnaGJvci5zZXJpZXNJbmRleCwgbmVpZ2hib3IucG9pbnRJbmRleCwgbmVpZ2hib3IuZGF0YV07CiAgICAgICAgICAgIHZhciBpZHggPSBwbG90LnBsdWdpbnMuZnVubmVsUmVuZGVyZXIuaGlnaGxpZ2h0ZWRTZXJpZXNJbmRleDsKICAgICAgICAgICAgaWYgKGlkeCAhPSBudWxsICYmIHBsb3Quc2VyaWVzW2lkeF0uaGlnaGxpZ2h0TW91c2VEb3duKSB7CiAgICAgICAgICAgICAgICB1bmhpZ2hsaWdodChwbG90KTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgZXZ0ID0galF1ZXJ5LkV2ZW50KCdqcXBsb3REYXRhUmlnaHRDbGljaycpOwogICAgICAgICAgICBldnQucGFnZVggPSBldi5wYWdlWDsKICAgICAgICAgICAgZXZ0LnBhZ2VZID0gZXYucGFnZVk7CiAgICAgICAgICAgIHBsb3QudGFyZ2V0LnRyaWdnZXIoZXZ0LCBpbnMpOwogICAgICAgIH0KICAgIH0KICAgIAogICAgLy8gY2FsbGVkIHdpdGhpbiBjb250ZXh0IG9mIHBsb3QKICAgIC8vIGNyZWF0ZSBhIGNhbnZhcyB3aGljaCB3ZSBjYW4gZHJhdyBvbi4KICAgIC8vIGluc2VydCBpdCBiZWZvcmUgdGhlIGV2ZW50Q2FudmFzLCBzbyBldmVudENhbnZhcyB3aWxsIHN0aWxsIGNhcHR1cmUgZXZlbnRzLgogICAgZnVuY3Rpb24gcG9zdFBsb3REcmF3KCkgewogICAgICAgIC8vIE1lbW9yeSBMZWFrcyBwYXRjaCAgICAKICAgICAgICBpZiAodGhpcy5wbHVnaW5zLmZ1bm5lbFJlbmRlcmVyICYmIHRoaXMucGx1Z2lucy5mdW5uZWxSZW5kZXJlci5oaWdobGlnaHRDYW52YXMpIHsKICAgICAgICAgICAgdGhpcy5wbHVnaW5zLmZ1bm5lbFJlbmRlcmVyLmhpZ2hsaWdodENhbnZhcy5yZXNldENhbnZhcygpOwogICAgICAgICAgICB0aGlzLnBsdWdpbnMuZnVubmVsUmVuZGVyZXIuaGlnaGxpZ2h0Q2FudmFzID0gbnVsbDsKICAgICAgICB9CgogICAgICAgIHRoaXMucGx1Z2lucy5mdW5uZWxSZW5kZXJlciA9IHt9OwogICAgICAgIHRoaXMucGx1Z2lucy5mdW5uZWxSZW5kZXJlci5oaWdobGlnaHRDYW52YXMgPSBuZXcgJC5qcXBsb3QuR2VuZXJpY0NhbnZhcygpOwogICAgICAgIAogICAgICAgIC8vIGRvIHdlIGhhdmUgYW55IGRhdGEgbGFiZWxzPyAgaWYgc28sIHB1dCBoaWdobGlnaHQgY2FudmFzIGJlZm9yZSB0aG9zZQogICAgICAgIHZhciBsYWJlbHMgPSAkKHRoaXMudGFyZ2V0SWQrJyAuanFwbG90LWRhdGEtbGFiZWwnKTsKICAgICAgICBpZiAobGFiZWxzLmxlbmd0aCkgewogICAgICAgICAgICAkKGxhYmVsc1swXSkuYmVmb3JlKHRoaXMucGx1Z2lucy5mdW5uZWxSZW5kZXJlci5oaWdobGlnaHRDYW52YXMuY3JlYXRlRWxlbWVudCh0aGlzLl9ncmlkUGFkZGluZywgJ2pxcGxvdC1mdW5uZWxSZW5kZXJlci1oaWdobGlnaHQtY2FudmFzJywgdGhpcy5fcGxvdERpbWVuc2lvbnMsIHRoaXMpKTsKICAgICAgICB9CiAgICAgICAgLy8gZWxzZSBwdXQgaGlnaGxpZ2h0IGNhbnZhcyBiZWZvcmUgZXZlbnQgY2FudmFzLgogICAgICAgIGVsc2UgewogICAgICAgICAgICB0aGlzLmV2ZW50Q2FudmFzLl9lbGVtLmJlZm9yZSh0aGlzLnBsdWdpbnMuZnVubmVsUmVuZGVyZXIuaGlnaGxpZ2h0Q2FudmFzLmNyZWF0ZUVsZW1lbnQodGhpcy5fZ3JpZFBhZGRpbmcsICdqcXBsb3QtZnVubmVsUmVuZGVyZXItaGlnaGxpZ2h0LWNhbnZhcycsIHRoaXMuX3Bsb3REaW1lbnNpb25zLCB0aGlzKSk7CiAgICAgICAgfQogICAgICAgIHZhciBoY3R4ID0gdGhpcy5wbHVnaW5zLmZ1bm5lbFJlbmRlcmVyLmhpZ2hsaWdodENhbnZhcy5zZXRDb250ZXh0KCk7CiAgICAgICAgdGhpcy5ldmVudENhbnZhcy5fZWxlbS5iaW5kKCdtb3VzZWxlYXZlJywge3Bsb3Q6dGhpc30sIGZ1bmN0aW9uIChldikgeyB1bmhpZ2hsaWdodChldi5kYXRhLnBsb3QpOyB9KTsKICAgIH0KICAgIAogICAgJC5qcXBsb3QucHJlSW5pdEhvb2tzLnB1c2gocHJlSW5pdCk7CiAgICAKICAgICQuanFwbG90LkZ1bm5lbFRpY2tSZW5kZXJlciA9IGZ1bmN0aW9uKCkgewogICAgICAgICQuanFwbG90LkF4aXNUaWNrUmVuZGVyZXIuY2FsbCh0aGlzKTsKICAgIH07CiAgICAKICAgICQuanFwbG90LkZ1bm5lbFRpY2tSZW5kZXJlci5wcm90b3R5cGUgPSBuZXcgJC5qcXBsb3QuQXhpc1RpY2tSZW5kZXJlcigpOwogICAgJC5qcXBsb3QuRnVubmVsVGlja1JlbmRlcmVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9ICQuanFwbG90LkZ1bm5lbFRpY2tSZW5kZXJlcjsKICAgIAp9KShqUXVlcnkpOwogICAgCiAgICA=]]></data>
	</file>
	<file>
	  <filename>/src/plugins/jqplot.funnelRenderer.min.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqCiAqIGpxUGxvdAogKiBQdXJlIEphdmFTY3JpcHQgcGxvdHRpbmcgcGx1Z2luIHVzaW5nIGpRdWVyeQogKgogKiBWZXJzaW9uOiAxLjAuMGIyX3IxMDEyCiAqCiAqIENvcHlyaWdodCAoYykgMjAwOS0yMDExIENocmlzIExlb25lbGxvCiAqIGpxUGxvdCBpcyBjdXJyZW50bHkgYXZhaWxhYmxlIGZvciB1c2UgaW4gYWxsIHBlcnNvbmFsIG9yIGNvbW1lcmNpYWwgcHJvamVjdHMgCiAqIHVuZGVyIGJvdGggdGhlIE1JVCAoaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHApIGFuZCBHUEwgCiAqIHZlcnNpb24gMi4wIChodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC5odG1sKSBsaWNlbnNlcy4gVGhpcyBtZWFucyB0aGF0IHlvdSBjYW4gCiAqIGNob29zZSB0aGUgbGljZW5zZSB0aGF0IGJlc3Qgc3VpdHMgeW91ciBwcm9qZWN0IGFuZCB1c2UgaXQgYWNjb3JkaW5nbHkuIAogKgogKiBBbHRob3VnaCBub3QgcmVxdWlyZWQsIHRoZSBhdXRob3Igd291bGQgYXBwcmVjaWF0ZSBhbiBlbWFpbCBsZXR0aW5nIGhpbSAKICoga25vdyBvZiBhbnkgc3Vic3RhbnRpYWwgdXNlIG9mIGpxUGxvdC4gIFlvdSBjYW4gcmVhY2ggdGhlIGF1dGhvciBhdDogCiAqIGNocmlzIGF0IGpxcGxvdCBkb3QgY29tIG9yIHNlZSBodHRwOi8vd3d3LmpxcGxvdC5jb20vaW5mby5waHAgLgogKgogKiBJZiB5b3UgYXJlIGZlZWxpbmcga2luZCBhbmQgZ2VuZXJvdXMsIGNvbnNpZGVyIHN1cHBvcnRpbmcgdGhlIHByb2plY3QgYnkKICogbWFraW5nIGEgZG9uYXRpb24gYXQ6IGh0dHA6Ly93d3cuanFwbG90LmNvbS9kb25hdGUucGhwIC4KICoKICogc3ByaW50ZiBmdW5jdGlvbnMgY29udGFpbmVkIGluIGpxcGxvdC5zcHJpbnRmLmpzIGJ5IEFzaCBTZWFybGU6CiAqCiAqICAgICB2ZXJzaW9uIDIwMDcuMDQuMjcKICogICAgIGF1dGhvciBBc2ggU2VhcmxlCiAqICAgICBodHRwOi8vaGV4bWVuLmNvbS9ibG9nLzIwMDcvMDMvcHJpbnRmLXNwcmludGYvCiAqICAgICBodHRwOi8vaGV4bWVuLmNvbS9qcy9zcHJpbnRmLmpzCiAqICAgICBUaGUgYXV0aG9yIChBc2ggU2VhcmxlKSBoYXMgcGxhY2VkIHRoaXMgY29kZSBpbiB0aGUgcHVibGljIGRvbWFpbjoKICogICAgICJUaGlzIGNvZGUgaXMgdW5yZXN0cmljdGVkOiB5b3UgYXJlIGZyZWUgdG8gdXNlIGl0IGhvd2V2ZXIgeW91IGxpa2UuIgogKgogKiBpbmNsdWRlZCBqc0RhdGUgbGlicmFyeSBieSBDaHJpcyBMZW9uZWxsbzoKICoKICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEgQ2hyaXMgTGVvbmVsbG8KICoKICoganNEYXRlIGlzIGN1cnJlbnRseSBhdmFpbGFibGUgZm9yIHVzZSBpbiBhbGwgcGVyc29uYWwgb3IgY29tbWVyY2lhbCBwcm9qZWN0cyAKICogdW5kZXIgYm90aCB0aGUgTUlUIGFuZCBHUEwgdmVyc2lvbiAyLjAgbGljZW5zZXMuIFRoaXMgbWVhbnMgdGhhdCB5b3UgY2FuIAogKiBjaG9vc2UgdGhlIGxpY2Vuc2UgdGhhdCBiZXN0IHN1aXRzIHlvdXIgcHJvamVjdCBhbmQgdXNlIGl0IGFjY29yZGluZ2x5LgogKgogKiBqc0RhdGUgYm9ycm93cyBtYW55IGNvbmNlcHRzIGFuZCBpZGVhcyBmcm9tIHRoZSBEYXRlIEluc3RhbmNlIAogKiBNZXRob2RzIGJ5IEtlbiBTbnlkZXIgYWxvbmcgd2l0aCBzb21lIHBhcnRzIG9mIEtlbidzIGFjdHVhbCBjb2RlLgogKiAKICogS2VuJ3Mgb3JpZ2lhbmwgRGF0ZSBJbnN0YW5jZSBNZXRob2RzIGFuZCBjb3B5cmlnaHQgbm90aWNlOgogKiAKICogS2VuIFNueWRlciAoa2VuIGQgc255ZGVyIGF0IGdtYWlsIGRvdCBjb20pCiAqIDIwMDgtMDktMTAKICogdmVyc2lvbiAyLjAuMiAoaHR0cDovL2tlbmRzbnlkZXIuY29tL3NhbmRib3gvZGF0ZS8pICAgICAKICogQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbiBMaWNlbnNlIDMuMCAoaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnkvMy4wLykKICoKICoganFwbG90VG9JbWFnZSBmdW5jdGlvbiBiYXNlZCBvbiBMYXJyeSBTaWRlbidzIGV4cG9ydC1qcXBsb3QtdG8tcG5nLmpzLgogKiBMYXJyeSBoYXMgZ2VuZXJvdXNseSBnaXZlbiBwZXJtaXNzaW9uIHRvIGFkYXB0IGhpcyBjb2RlIGZvciBpbmNsdXNpb24KICogaW50byBqcVBsb3QuCiAqCiAqIExhcnJ5J3Mgb3JpZ2luYWwgY29kZSBjYW4gYmUgZm91bmQgaGVyZToKICoKICogaHR0cHM6Ly9naXRodWIuY29tL2xzaWRlbi9leHBvcnQtanFwbG90LXRvLXBuZwogKiAKICogCiAqLwooZnVuY3Rpb24oZSl7ZS5qcXBsb3QuRnVubmVsUmVuZGVyZXI9ZnVuY3Rpb24oKXtlLmpxcGxvdC5MaW5lUmVuZGVyZXIuY2FsbCh0aGlzKX07ZS5qcXBsb3QuRnVubmVsUmVuZGVyZXIucHJvdG90eXBlPW5ldyBlLmpxcGxvdC5MaW5lUmVuZGVyZXIoKTtlLmpxcGxvdC5GdW5uZWxSZW5kZXJlci5wcm90b3R5cGUuY29uc3RydWN0b3I9ZS5qcXBsb3QuRnVubmVsUmVuZGVyZXI7ZS5qcXBsb3QuRnVubmVsUmVuZGVyZXIucHJvdG90eXBlLmluaXQ9ZnVuY3Rpb24ocCx0KXt0aGlzLnBhZGRpbmc9e3RvcDoyMCxyaWdodDoyMCxib3R0b206MjAsbGVmdDoyMH07dGhpcy5zZWN0aW9uTWFyZ2luPTY7dGhpcy5maWxsPXRydWU7dGhpcy5zaGFkb3dPZmZzZXQ9Mjt0aGlzLnNoYWRvd0FscGhhPTAuMDc7dGhpcy5zaGFkb3dEZXB0aD01O3RoaXMuaGlnaGxpZ2h0TW91c2VPdmVyPXRydWU7dGhpcy5oaWdobGlnaHRNb3VzZURvd249ZmFsc2U7dGhpcy5oaWdobGlnaHRDb2xvcnM9W107dGhpcy53aWR0aFJhdGlvPTAuMjt0aGlzLmxpbmVXaWR0aD0yO3RoaXMuZGF0YUxhYmVscz0icGVyY2VudCI7dGhpcy5zaG93RGF0YUxhYmVscz1mYWxzZTt0aGlzLmRhdGFMYWJlbEZvcm1hdFN0cmluZz1udWxsO3RoaXMuZGF0YUxhYmVsVGhyZXNob2xkPTM7dGhpcy5fdHlwZT0iZnVubmVsIjt0aGlzLnRpY2tSZW5kZXJlcj1lLmpxcGxvdC5GdW5uZWxUaWNrUmVuZGVyZXI7aWYocC5oaWdobGlnaHRNb3VzZURvd24mJnAuaGlnaGxpZ2h0TW91c2VPdmVyPT1udWxsKXtwLmhpZ2hsaWdodE1vdXNlT3Zlcj1mYWxzZX1lLmV4dGVuZCh0cnVlLHRoaXMscCk7dGhpcy5faGlnaGxpZ2h0ZWRQb2ludD1udWxsO3RoaXMuX2Jhc2VzPVtdO3RoaXMuX2F0b3Q7dGhpcy5fYXJlYXM9W107dGhpcy5fbGVuZ3Rocz1bXTt0aGlzLl9hbmdsZTt0aGlzLl9kYXRhSW5kaWNlcz1bXTt0aGlzLl91bm9yZGVyZWREYXRhPWUuZXh0ZW5kKHRydWUsW10sdGhpcy5kYXRhKTt2YXIgbz1lLmV4dGVuZCh0cnVlLFtdLHRoaXMuZGF0YSk7Zm9yKHZhciByPTA7cjxvLmxlbmd0aDtyKyspe29bcl0ucHVzaChyKX10aGlzLmRhdGEuc29ydChmdW5jdGlvbih2LHUpe3JldHVybiB1WzFdLXZbMV19KTtvLnNvcnQoZnVuY3Rpb24odix1KXtyZXR1cm4gdVsxXS12WzFdfSk7Zm9yKHZhciByPTA7cjxvLmxlbmd0aDtyKyspe3RoaXMuX2RhdGFJbmRpY2VzLnB1c2gob1tyXVsyXSl9aWYodGhpcy5oaWdobGlnaHRDb2xvcnMubGVuZ3RoPT0wKXtmb3IodmFyIHI9MDtyPHRoaXMuc2VyaWVzQ29sb3JzLmxlbmd0aDtyKyspe3ZhciBxPWUuanFwbG90LmdldENvbG9yQ29tcG9uZW50cyh0aGlzLnNlcmllc0NvbG9yc1tyXSk7dmFyIG09W3FbMF0scVsxXSxxWzJdXTt2YXIgcz1tWzBdK21bMV0rbVsyXTtmb3IodmFyIG49MDtuPDM7bisrKXttW25dPShzPjU3MCk/bVtuXSowLjg6bVtuXSswLjQqKDI1NS1tW25dKTttW25dPXBhcnNlSW50KG1bbl0sMTApfXRoaXMuaGlnaGxpZ2h0Q29sb3JzLnB1c2goInJnYigiK21bMF0rIiwiK21bMV0rIiwiK21bMl0rIikiKX19dC5wb3N0UGFyc2VPcHRpb25zSG9va3MuYWRkT25jZShrKTt0LnBvc3RJbml0SG9va3MuYWRkT25jZShnKTt0LmV2ZW50TGlzdGVuZXJIb29rcy5hZGRPbmNlKCJqcXBsb3RNb3VzZU1vdmUiLGEpO3QuZXZlbnRMaXN0ZW5lckhvb2tzLmFkZE9uY2UoImpxcGxvdE1vdXNlRG93biIsYik7dC5ldmVudExpc3RlbmVySG9va3MuYWRkT25jZSgianFwbG90TW91c2VVcCIsaik7dC5ldmVudExpc3RlbmVySG9va3MuYWRkT25jZSgianFwbG90Q2xpY2siLGYpO3QuZXZlbnRMaXN0ZW5lckhvb2tzLmFkZE9uY2UoImpxcGxvdFJpZ2h0Q2xpY2siLGwpO3QucG9zdERyYXdIb29rcy5hZGRPbmNlKGgpfTtlLmpxcGxvdC5GdW5uZWxSZW5kZXJlci5wcm90b3R5cGUuc2V0R3JpZERhdGE9ZnVuY3Rpb24obyl7dmFyIG49MDt2YXIgcD1bXTtmb3IodmFyIG09MDttPHRoaXMuZGF0YS5sZW5ndGg7bSsrKXtuKz10aGlzLmRhdGFbbV1bMV07cC5wdXNoKFt0aGlzLmRhdGFbbV1bMF0sdGhpcy5kYXRhW21dWzFdXSl9Zm9yKHZhciBtPTA7bTxwLmxlbmd0aDttKyspe3BbbV1bMV09cFttXVsxXS9ufXRoaXMuX2Jhc2VzPW5ldyBBcnJheShwLmxlbmd0aCsxKTt0aGlzLl9sZW5ndGhzPW5ldyBBcnJheShwLmxlbmd0aCk7dGhpcy5ncmlkRGF0YT1wfTtlLmpxcGxvdC5GdW5uZWxSZW5kZXJlci5wcm90b3R5cGUubWFrZUdyaWREYXRhPWZ1bmN0aW9uKG8scCl7dmFyIG49MDt2YXIgcT1bXTtmb3IodmFyIG09MDttPHRoaXMuZGF0YS5sZW5ndGg7bSsrKXtuKz10aGlzLmRhdGFbbV1bMV07cS5wdXNoKFt0aGlzLmRhdGFbbV1bMF0sdGhpcy5kYXRhW21dWzFdXSl9Zm9yKHZhciBtPTA7bTxxLmxlbmd0aDttKyspe3FbbV1bMV09cVttXVsxXS9ufXRoaXMuX2Jhc2VzPW5ldyBBcnJheShxLmxlbmd0aCsxKTt0aGlzLl9sZW5ndGhzPW5ldyBBcnJheShxLmxlbmd0aCk7cmV0dXJuIHF9O2UuanFwbG90LkZ1bm5lbFJlbmRlcmVyLnByb3RvdHlwZS5kcmF3U2VjdGlvbj1mdW5jdGlvbihuLHAsbyxzKXt2YXIgdD10aGlzLmZpbGw7dmFyIG09dGhpcy5saW5lV2lkdGg7bi5zYXZlKCk7aWYocyl7Zm9yKHZhciByPTA7cjx0aGlzLnNoYWRvd0RlcHRoO3IrKyl7bi5zYXZlKCk7bi50cmFuc2xhdGUodGhpcy5zaGFkb3dPZmZzZXQqTWF0aC5jb3ModGhpcy5zaGFkb3dBbmdsZS8xODAqTWF0aC5QSSksdGhpcy5zaGFkb3dPZmZzZXQqTWF0aC5zaW4odGhpcy5zaGFkb3dBbmdsZS8xODAqTWF0aC5QSSkpO3EoKX19ZWxzZXtxKCl9ZnVuY3Rpb24gcSgpe24uYmVnaW5QYXRoKCk7bi5maWxsU3R5bGU9bztuLnN0cm9rZVN0eWxlPW87bi5saW5lV2lkdGg9bTtuLm1vdmVUbyhwWzBdWzBdLHBbMF1bMV0pO2Zvcih2YXIgdT0xO3U8NDt1Kyspe24ubGluZVRvKHBbdV1bMF0scFt1XVsxXSl9bi5jbG9zZVBhdGgoKTtpZih0KXtuLmZpbGwoKX1lbHNle24uc3Ryb2tlKCl9fWlmKHMpe2Zvcih2YXIgcj0wO3I8dGhpcy5zaGFkb3dEZXB0aDtyKyspe24ucmVzdG9yZSgpfX1uLnJlc3RvcmUoKX07ZS5qcXBsb3QuRnVubmVsUmVuZGVyZXIucHJvdG90eXBlLmRyYXc9ZnVuY3Rpb24oRyxCLEoscCl7dmFyIFk7dmFyIEw9KEohPXVuZGVmaW5lZCk/Sjp7fTt2YXIgdz0wO3ZhciB1PTA7dmFyIFI9MTt0aGlzLl9hcmVhcz1bXTtpZihKLmxlZ2VuZEluZm8mJkoubGVnZW5kSW5mby5wbGFjZW1lbnQ9PSJpbnNpZGVHcmlkIil7dmFyIE89Si5sZWdlbmRJbmZvO3N3aXRjaChPLmxvY2F0aW9uKXtjYXNlIm53Ijp3PU8ud2lkdGgrTy54b2Zmc2V0O2JyZWFrO2Nhc2UidyI6dz1PLndpZHRoK08ueG9mZnNldDticmVhaztjYXNlInN3Ijp3PU8ud2lkdGgrTy54b2Zmc2V0O2JyZWFrO2Nhc2UibmUiOnc9Ty53aWR0aCtPLnhvZmZzZXQ7Uj0tMTticmVhaztjYXNlImUiOnc9Ty53aWR0aCtPLnhvZmZzZXQ7Uj0tMTticmVhaztjYXNlInNlIjp3PU8ud2lkdGgrTy54b2Zmc2V0O1I9LTE7YnJlYWs7Y2FzZSJuIjp1PU8uaGVpZ2h0K08ueW9mZnNldDticmVhaztjYXNlInMiOnU9Ty5oZWlnaHQrTy55b2Zmc2V0O1I9LTE7YnJlYWs7ZGVmYXVsdDpicmVha319dmFyIHQ9KFI9PTEpP3RoaXMucGFkZGluZy5sZWZ0K3c6dGhpcy5wYWRkaW5nLmxlZnQ7dmFyIEY9KFI9PTEpP3RoaXMucGFkZGluZy50b3ArdTp0aGlzLnBhZGRpbmcudG9wO3ZhciBNPShSPT0tMSk/dGhpcy5wYWRkaW5nLnJpZ2h0K3c6dGhpcy5wYWRkaW5nLnJpZ2h0O3ZhciBvPShSPT0tMSk/dGhpcy5wYWRkaW5nLmJvdHRvbSt1OnRoaXMucGFkZGluZy5ib3R0b207dmFyIFA9KEwuc2hhZG93IT11bmRlZmluZWQpP0wuc2hhZG93OnRoaXMuc2hhZG93O3ZhciBxPShMLnNob3dMaW5lIT11bmRlZmluZWQpP0wuc2hvd0xpbmU6dGhpcy5zaG93TGluZTt2YXIgQz0oTC5maWxsIT11bmRlZmluZWQpP0wuZmlsbDp0aGlzLmZpbGw7dmFyIEg9Ry5jYW52YXMud2lkdGg7dmFyIE49Ry5jYW52YXMuaGVpZ2h0O3RoaXMuX2Jhc2VzWzBdPUgtdC1NO3ZhciBJPXRoaXMuX2xlbmd0aD1OLUYtbzt2YXIgcj10aGlzLl9iYXNlc1swXSp0aGlzLndpZHRoUmF0aW87dGhpcy5fYXRvdD1JLzIqKHRoaXMuX2Jhc2VzWzBdK3RoaXMuX2Jhc2VzWzBdKnRoaXMud2lkdGhSYXRpbyk7dGhpcy5fYW5nbGU9TWF0aC5hdGFuKCh0aGlzLl9iYXNlc1swXS1yKS8yL0kpO2ZvcihZPTA7WTxCLmxlbmd0aDtZKyspe3RoaXMuX2FyZWFzLnB1c2goQltZXVsxXSp0aGlzLl9hdG90KX12YXIgRSxhYSxXLFE9MDt2YXIgbj0wLjAwMDE7Zm9yKFk9MDtZPHRoaXMuX2FyZWFzLmxlbmd0aDtZKyspe0U9dGhpcy5fYXJlYXNbWV0vdGhpcy5fYmFzZXNbWV07YWE9OTk5OTk5O3RoaXMuX2xlbmd0aHNbWV09RTtXPTA7d2hpbGUoYWE+dGhpcy5fbGVuZ3Roc1tZXSpuJiZXPDEwMCl7dGhpcy5fbGVuZ3Roc1tZXT10aGlzLl9hcmVhc1tZXS8odGhpcy5fYmFzZXNbWV0tdGhpcy5fbGVuZ3Roc1tZXSpNYXRoLnRhbih0aGlzLl9hbmdsZSkpO2FhPU1hdGguYWJzKHRoaXMuX2xlbmd0aHNbWV0tRSk7dGhpcy5fYmFzZXNbWSsxXT10aGlzLl9iYXNlc1tZXS0oMip0aGlzLl9sZW5ndGhzW1ldKk1hdGgudGFuKHRoaXMuX2FuZ2xlKSk7RT10aGlzLl9sZW5ndGhzW1ldO1crK31RKz10aGlzLl9sZW5ndGhzW1ldfXRoaXMuX3ZlcnRpY2VzPW5ldyBBcnJheShCLmxlbmd0aCk7dmFyIGFlPVt0LEZdLGFkPVt0K3RoaXMuX2Jhc2VzWzBdLEZdLGFjPVt0Kyh0aGlzLl9iYXNlc1swXS10aGlzLl9iYXNlc1t0aGlzLl9iYXNlcy5sZW5ndGgtMV0pLzIsRit0aGlzLl9sZW5ndGhdLGFiPVthY1swXSt0aGlzLl9iYXNlc1t0aGlzLl9iYXNlcy5sZW5ndGgtMV0sYWNbMV1dO2Z1bmN0aW9uIFYoYWcpe3ZhciB4PShhZVsxXS1hY1sxXSkvKGFlWzBdLWFjWzBdKTt2YXIgdj1hZVsxXS14KmFlWzBdO3ZhciBhaD1hZythZVsxXTtyZXR1cm5bKGFoLXYpL3gsYWhdfWZ1bmN0aW9uIEQoYWcpe3ZhciB4PShhZFsxXS1hYlsxXSkvKGFkWzBdLWFiWzBdKTt2YXIgdj1hZFsxXS14KmFkWzBdO3ZhciBhaD1hZythZFsxXTtyZXR1cm5bKGFoLXYpL3gsYWhdfXZhciBUPXcsUz11O3ZhciBaPTAsbT0wO2ZvcihZPTA7WTxCLmxlbmd0aDtZKyspe3RoaXMuX3ZlcnRpY2VzW1ldPW5ldyBBcnJheSgpO3ZhciBVPXRoaXMuX3ZlcnRpY2VzW1ldO3ZhciBBPXRoaXMuc2VjdGlvbk1hcmdpbjtpZihZPT0wKXttPTB9aWYoWT09MSl7bT1BLzN9ZWxzZXtpZihZPjAmJlk8Qi5sZW5ndGgtMSl7bT1BLzJ9ZWxzZXtpZihZPT1CLmxlbmd0aC0xKXttPTIqQS8zfX19VS5wdXNoKFYoWittKSk7VS5wdXNoKEQoWittKSk7Wis9dGhpcy5fbGVuZ3Roc1tZXTtpZihZPT0wKXttPS0yKkEvM31lbHNle2lmKFk+MCYmWTxCLmxlbmd0aC0xKXttPS1BLzJ9ZWxzZXtpZihZPT1CLmxlbmd0aC0xKXttPTB9fX1VLnB1c2goRChaK20pKTtVLnB1c2goVihaK20pKX1pZih0aGlzLnNoYWRvdyl7dmFyIGFmPSJyZ2JhKDAsMCwwLCIrdGhpcy5zaGFkb3dBbHBoYSsiKSI7Zm9yKHZhciBZPTA7WTxCLmxlbmd0aDtZKyspe3RoaXMucmVuZGVyZXIuZHJhd1NlY3Rpb24uY2FsbCh0aGlzLEcsdGhpcy5fdmVydGljZXNbWV0sYWYsdHJ1ZSl9fWZvcih2YXIgWT0wO1k8Qi5sZW5ndGg7WSsrKXt2YXIgVT10aGlzLl92ZXJ0aWNlc1tZXTt0aGlzLnJlbmRlcmVyLmRyYXdTZWN0aW9uLmNhbGwodGhpcyxHLFUsdGhpcy5zZXJpZXNDb2xvcnNbWV0pO2lmKHRoaXMuc2hvd0RhdGFMYWJlbHMmJkJbWV1bMV0qMTAwPj10aGlzLmRhdGFMYWJlbFRocmVzaG9sZCl7dmFyIEssWDtpZih0aGlzLmRhdGFMYWJlbHM9PSJsYWJlbCIpe0s9dGhpcy5kYXRhTGFiZWxGb3JtYXRTdHJpbmd8fCIlcyI7WD1lLmpxcGxvdC5zcHJpbnRmKEssQltZXVswXSl9ZWxzZXtpZih0aGlzLmRhdGFMYWJlbHM9PSJ2YWx1ZSIpe0s9dGhpcy5kYXRhTGFiZWxGb3JtYXRTdHJpbmd8fCIlZCI7WD1lLmpxcGxvdC5zcHJpbnRmKEssdGhpcy5kYXRhW1ldWzFdKX1lbHNle2lmKHRoaXMuZGF0YUxhYmVscz09InBlcmNlbnQiKXtLPXRoaXMuZGF0YUxhYmVsRm9ybWF0U3RyaW5nfHwiJWQlJSI7WD1lLmpxcGxvdC5zcHJpbnRmKEssQltZXVsxXSoxMDApfWVsc2V7aWYodGhpcy5kYXRhTGFiZWxzLmNvbnN0cnVjdG9yPT1BcnJheSl7Sz10aGlzLmRhdGFMYWJlbEZvcm1hdFN0cmluZ3x8IiVzIjtYPWUuanFwbG90LnNwcmludGYoSyx0aGlzLmRhdGFMYWJlbHNbdGhpcy5fZGF0YUluZGljZXNbWV1dKX19fX12YXIgcz0odGhpcy5fcmFkaXVzKSp0aGlzLmRhdGFMYWJlbFBvc2l0aW9uRmFjdG9yK3RoaXMuc2xpY2VNYXJnaW4rdGhpcy5kYXRhTGFiZWxOdWRnZTt2YXIgVD0oVVswXVswXStVWzFdWzBdKS8yK3RoaXMuY2FudmFzLl9vZmZzZXRzLmxlZnQ7dmFyIFM9KFVbMV1bMV0rVVsyXVsxXSkvMit0aGlzLmNhbnZhcy5fb2Zmc2V0cy50b3A7dmFyIHo9ZSgnPHNwYW4gY2xhc3M9ImpxcGxvdC1mdW5uZWwtc2VyaWVzIGpxcGxvdC1kYXRhLWxhYmVsIiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7Ij4nK1grIjwvc3Bhbj4iKS5pbnNlcnRCZWZvcmUocC5ldmVudENhbnZhcy5fZWxlbSk7VC09ei53aWR0aCgpLzI7Uy09ei5oZWlnaHQoKS8yO1Q9TWF0aC5yb3VuZChUKTtTPU1hdGgucm91bmQoUyk7ei5jc3Moe2xlZnQ6VCx0b3A6U30pfX19O2UuanFwbG90LkZ1bm5lbEF4aXNSZW5kZXJlcj1mdW5jdGlvbigpe2UuanFwbG90LkxpbmVhckF4aXNSZW5kZXJlci5jYWxsKHRoaXMpfTtlLmpxcGxvdC5GdW5uZWxBeGlzUmVuZGVyZXIucHJvdG90eXBlPW5ldyBlLmpxcGxvdC5MaW5lYXJBeGlzUmVuZGVyZXIoKTtlLmpxcGxvdC5GdW5uZWxBeGlzUmVuZGVyZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUuanFwbG90LkZ1bm5lbEF4aXNSZW5kZXJlcjtlLmpxcGxvdC5GdW5uZWxBeGlzUmVuZGVyZXIucHJvdG90eXBlLmluaXQ9ZnVuY3Rpb24obSl7dGhpcy50aWNrUmVuZGVyZXI9ZS5qcXBsb3QuRnVubmVsVGlja1JlbmRlcmVyO2UuZXh0ZW5kKHRydWUsdGhpcyxtKTt0aGlzLl9kYXRhQm91bmRzPXttaW46MCxtYXg6MTAwfTt0aGlzLm1pbj0wO3RoaXMubWF4PTEwMDt0aGlzLnNob3dUaWNrcz1mYWxzZTt0aGlzLnRpY2tzPVtdO3RoaXMuc2hvd01hcms9ZmFsc2U7dGhpcy5zaG93PWZhbHNlfTtlLmpxcGxvdC5GdW5uZWxMZWdlbmRSZW5kZXJlcj1mdW5jdGlvbigpe2UuanFwbG90LlRhYmxlTGVnZW5kUmVuZGVyZXIuY2FsbCh0aGlzKX07ZS5qcXBsb3QuRnVubmVsTGVnZW5kUmVuZGVyZXIucHJvdG90eXBlPW5ldyBlLmpxcGxvdC5UYWJsZUxlZ2VuZFJlbmRlcmVyKCk7ZS5qcXBsb3QuRnVubmVsTGVnZW5kUmVuZGVyZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUuanFwbG90LkZ1bm5lbExlZ2VuZFJlbmRlcmVyO2UuanFwbG90LkZ1bm5lbExlZ2VuZFJlbmRlcmVyLnByb3RvdHlwZS5pbml0PWZ1bmN0aW9uKG0pe3RoaXMubnVtYmVyUm93cz1udWxsO3RoaXMubnVtYmVyQ29sdW1ucz1udWxsO2UuZXh0ZW5kKHRydWUsdGhpcyxtKX07ZS5qcXBsb3QuRnVubmVsTGVnZW5kUmVuZGVyZXIucHJvdG90eXBlLmRyYXc9ZnVuY3Rpb24oKXt2YXIgcD10aGlzO2lmKHRoaXMuc2hvdyl7dmFyIHg9dGhpcy5fc2VyaWVzO3ZhciBBPSJwb3NpdGlvbjphYnNvbHV0ZTsiO0ErPSh0aGlzLmJhY2tncm91bmQpPyJiYWNrZ3JvdW5kOiIrdGhpcy5iYWNrZ3JvdW5kKyI7IjoiIjtBKz0odGhpcy5ib3JkZXIpPyJib3JkZXI6Iit0aGlzLmJvcmRlcisiOyI6IiI7QSs9KHRoaXMuZm9udFNpemUpPyJmb250LXNpemU6Iit0aGlzLmZvbnRTaXplKyI7IjoiIjtBKz0odGhpcy5mb250RmFtaWx5KT8iZm9udC1mYW1pbHk6Iit0aGlzLmZvbnRGYW1pbHkrIjsiOiIiO0ErPSh0aGlzLnRleHRDb2xvcik/ImNvbG9yOiIrdGhpcy50ZXh0Q29sb3IrIjsiOiIiO0ErPSh0aGlzLm1hcmdpblRvcCE9bnVsbCk/Im1hcmdpbi10b3A6Iit0aGlzLm1hcmdpblRvcCsiOyI6IiI7QSs9KHRoaXMubWFyZ2luQm90dG9tIT1udWxsKT8ibWFyZ2luLWJvdHRvbToiK3RoaXMubWFyZ2luQm90dG9tKyI7IjoiIjtBKz0odGhpcy5tYXJnaW5MZWZ0IT1udWxsKT8ibWFyZ2luLWxlZnQ6Iit0aGlzLm1hcmdpbkxlZnQrIjsiOiIiO0ErPSh0aGlzLm1hcmdpblJpZ2h0IT1udWxsKT8ibWFyZ2luLXJpZ2h0OiIrdGhpcy5tYXJnaW5SaWdodCsiOyI6IiI7dGhpcy5fZWxlbT1lKCc8dGFibGUgY2xhc3M9ImpxcGxvdC10YWJsZS1sZWdlbmQiIHN0eWxlPSInK0ErJyI+PC90YWJsZT4nKTt2YXIgRT1mYWxzZSx3PWZhbHNlLG0sdTt2YXIgeT14WzBdO3ZhciBuPW5ldyBlLmpxcGxvdC5Db2xvckdlbmVyYXRvcih5LnNlcmllc0NvbG9ycyk7aWYoeS5zaG93KXt2YXIgRj15LmRhdGE7aWYodGhpcy5udW1iZXJSb3dzKXttPXRoaXMubnVtYmVyUm93cztpZighdGhpcy5udW1iZXJDb2x1bW5zKXt1PU1hdGguY2VpbChGLmxlbmd0aC9tKX1lbHNle3U9dGhpcy5udW1iZXJDb2x1bW5zfX1lbHNle2lmKHRoaXMubnVtYmVyQ29sdW1ucyl7dT10aGlzLm51bWJlckNvbHVtbnM7bT1NYXRoLmNlaWwoRi5sZW5ndGgvdGhpcy5udW1iZXJDb2x1bW5zKX1lbHNle209Ri5sZW5ndGg7dT0xfX12YXIgRCxDLG8scixxLHQsdixCO3ZhciB6PTA7Zm9yKEQ9MDtEPG07RCsrKXtpZih3KXtvPWUoJzx0ciBjbGFzcz0ianFwbG90LXRhYmxlLWxlZ2VuZCI+PC90cj4nKS5wcmVwZW5kVG8odGhpcy5fZWxlbSl9ZWxzZXtvPWUoJzx0ciBjbGFzcz0ianFwbG90LXRhYmxlLWxlZ2VuZCI+PC90cj4nKS5hcHBlbmRUbyh0aGlzLl9lbGVtKX1mb3IoQz0wO0M8dTtDKyspe2lmKHo8Ri5sZW5ndGgpe3Q9dGhpcy5sYWJlbHNbel18fEZbel1bMF0udG9TdHJpbmcoKTtCPW4ubmV4dCgpO2lmKCF3KXtpZihEPjApe0U9dHJ1ZX1lbHNle0U9ZmFsc2V9fWVsc2V7aWYoRD09bS0xKXtFPWZhbHNlfWVsc2V7RT10cnVlfX12PShFKT90aGlzLnJvd1NwYWNpbmc6IjAiO3I9ZSgnPHRkIGNsYXNzPSJqcXBsb3QtdGFibGUtbGVnZW5kIiBzdHlsZT0idGV4dC1hbGlnbjpjZW50ZXI7cGFkZGluZy10b3A6Jyt2Kyc7Ij48ZGl2PjxkaXYgY2xhc3M9ImpxcGxvdC10YWJsZS1sZWdlbmQtc3dhdGNoIiBzdHlsZT0iYm9yZGVyLWNvbG9yOicrQisnOyI+PC9kaXY+PC9kaXY+PC90ZD4nKTtxPWUoJzx0ZCBjbGFzcz0ianFwbG90LXRhYmxlLWxlZ2VuZCIgc3R5bGU9InBhZGRpbmctdG9wOicrdisnOyI+PC90ZD4nKTtpZih0aGlzLmVzY2FwZUh0bWwpe3EudGV4dCh0KX1lbHNle3EuaHRtbCh0KX1pZih3KXtxLnByZXBlbmRUbyhvKTtyLnByZXBlbmRUbyhvKX1lbHNle3IuYXBwZW5kVG8obyk7cS5hcHBlbmRUbyhvKX1FPXRydWV9eisrfX19fXJldHVybiB0aGlzLl9lbGVtfTtmdW5jdGlvbiBjKHEscCxuKXtuPW58fHt9O24uYXhlc0RlZmF1bHRzPW4uYXhlc0RlZmF1bHRzfHx7fTtuLmxlZ2VuZD1uLmxlZ2VuZHx8e307bi5zZXJpZXNEZWZhdWx0cz1uLnNlcmllc0RlZmF1bHRzfHx7fTt2YXIgbT1mYWxzZTtpZihuLnNlcmllc0RlZmF1bHRzLnJlbmRlcmVyPT1lLmpxcGxvdC5GdW5uZWxSZW5kZXJlcil7bT10cnVlfWVsc2V7aWYobi5zZXJpZXMpe2Zvcih2YXIgbz0wO288bi5zZXJpZXMubGVuZ3RoO28rKyl7aWYobi5zZXJpZXNbb10ucmVuZGVyZXI9PWUuanFwbG90LkZ1bm5lbFJlbmRlcmVyKXttPXRydWV9fX19aWYobSl7bi5heGVzRGVmYXVsdHMucmVuZGVyZXI9ZS5qcXBsb3QuRnVubmVsQXhpc1JlbmRlcmVyO24ubGVnZW5kLnJlbmRlcmVyPWUuanFwbG90LkZ1bm5lbExlZ2VuZFJlbmRlcmVyO24ubGVnZW5kLnByZURyYXc9dHJ1ZTtuLnNvcnREYXRhPWZhbHNlO24uc2VyaWVzRGVmYXVsdHMucG9pbnRMYWJlbHM9e3Nob3c6ZmFsc2V9fX1mdW5jdGlvbiBnKHAsbyxtKXtmb3IodmFyIG49MDtuPHRoaXMuc2VyaWVzLmxlbmd0aDtuKyspe2lmKHRoaXMuc2VyaWVzW25dLnJlbmRlcmVyLmNvbnN0cnVjdG9yPT1lLmpxcGxvdC5GdW5uZWxSZW5kZXJlcil7aWYodGhpcy5zZXJpZXNbbl0uaGlnaGxpZ2h0TW91c2VPdmVyKXt0aGlzLnNlcmllc1tuXS5oaWdobGlnaHRNb3VzZURvd249ZmFsc2V9fX19ZnVuY3Rpb24gayhtKXtmb3IodmFyIG49MDtuPHRoaXMuc2VyaWVzLmxlbmd0aDtuKyspe3RoaXMuc2VyaWVzW25dLnNlcmllc0NvbG9ycz10aGlzLnNlcmllc0NvbG9yczt0aGlzLnNlcmllc1tuXS5jb2xvckdlbmVyYXRvcj1lLmpxcGxvdC5jb2xvckdlbmVyYXRvcn19ZnVuY3Rpb24gZChxLHAsbyl7dmFyIG49cS5zZXJpZXNbcF07dmFyIG09cS5wbHVnaW5zLmZ1bm5lbFJlbmRlcmVyLmhpZ2hsaWdodENhbnZhczttLl9jdHguY2xlYXJSZWN0KDAsMCxtLl9jdHguY2FudmFzLndpZHRoLG0uX2N0eC5jYW52YXMuaGVpZ2h0KTtuLl9oaWdobGlnaHRlZFBvaW50PW87cS5wbHVnaW5zLmZ1bm5lbFJlbmRlcmVyLmhpZ2hsaWdodGVkU2VyaWVzSW5kZXg9cDtuLnJlbmRlcmVyLmRyYXdTZWN0aW9uLmNhbGwobixtLl9jdHgsbi5fdmVydGljZXNbb10sbi5oaWdobGlnaHRDb2xvcnNbb10sZmFsc2UpfWZ1bmN0aW9uIGkobyl7dmFyIG09by5wbHVnaW5zLmZ1bm5lbFJlbmRlcmVyLmhpZ2hsaWdodENhbnZhczttLl9jdHguY2xlYXJSZWN0KDAsMCxtLl9jdHguY2FudmFzLndpZHRoLG0uX2N0eC5jYW52YXMuaGVpZ2h0KTtmb3IodmFyIG49MDtuPG8uc2VyaWVzLmxlbmd0aDtuKyspe28uc2VyaWVzW25dLl9oaWdobGlnaHRlZFBvaW50PW51bGx9by5wbHVnaW5zLmZ1bm5lbFJlbmRlcmVyLmhpZ2hsaWdodGVkU2VyaWVzSW5kZXg9bnVsbDtvLnRhcmdldC50cmlnZ2VyKCJqcXBsb3REYXRhVW5oaWdobGlnaHQiKX1mdW5jdGlvbiBhKHEscCx0LHMscil7aWYocyl7dmFyIG89W3Muc2VyaWVzSW5kZXgscy5wb2ludEluZGV4LHMuZGF0YV07dmFyIG49alF1ZXJ5LkV2ZW50KCJqcXBsb3REYXRhTW91c2VPdmVyIik7bi5wYWdlWD1xLnBhZ2VYO24ucGFnZVk9cS5wYWdlWTtyLnRhcmdldC50cmlnZ2VyKG4sbyk7aWYoci5zZXJpZXNbb1swXV0uaGlnaGxpZ2h0TW91c2VPdmVyJiYhKG9bMF09PXIucGx1Z2lucy5mdW5uZWxSZW5kZXJlci5oaWdobGlnaHRlZFNlcmllc0luZGV4JiZvWzFdPT1yLnNlcmllc1tvWzBdXS5faGlnaGxpZ2h0ZWRQb2ludCkpe3ZhciBtPWpRdWVyeS5FdmVudCgianFwbG90RGF0YUhpZ2hsaWdodCIpO20ucGFnZVg9cS5wYWdlWDttLnBhZ2VZPXEucGFnZVk7ci50YXJnZXQudHJpZ2dlcihtLG8pO2QocixvWzBdLG9bMV0pfX1lbHNle2lmKHM9PW51bGwpe2kocil9fX1mdW5jdGlvbiBiKHAsbyxzLHIscSl7aWYocil7dmFyIG49W3Iuc2VyaWVzSW5kZXgsci5wb2ludEluZGV4LHIuZGF0YV07aWYocS5zZXJpZXNbblswXV0uaGlnaGxpZ2h0TW91c2VEb3duJiYhKG5bMF09PXEucGx1Z2lucy5mdW5uZWxSZW5kZXJlci5oaWdobGlnaHRlZFNlcmllc0luZGV4JiZuWzFdPT1xLnNlcmllc1tuWzBdXS5faGlnaGxpZ2h0ZWRQb2ludCkpe3ZhciBtPWpRdWVyeS5FdmVudCgianFwbG90RGF0YUhpZ2hsaWdodCIpO20ucGFnZVg9cC5wYWdlWDttLnBhZ2VZPXAucGFnZVk7cS50YXJnZXQudHJpZ2dlcihtLG4pO2QocSxuWzBdLG5bMV0pfX1lbHNle2lmKHI9PW51bGwpe2kocSl9fX1mdW5jdGlvbiBqKG8sbixyLHEscCl7dmFyIG09cC5wbHVnaW5zLmZ1bm5lbFJlbmRlcmVyLmhpZ2hsaWdodGVkU2VyaWVzSW5kZXg7aWYobSE9bnVsbCYmcC5zZXJpZXNbbV0uaGlnaGxpZ2h0TW91c2VEb3duKXtpKHApfX1mdW5jdGlvbiBmKHAsbyxzLHIscSl7aWYocil7dmFyIG49W3Iuc2VyaWVzSW5kZXgsci5wb2ludEluZGV4LHIuZGF0YV07dmFyIG09alF1ZXJ5LkV2ZW50KCJqcXBsb3REYXRhQ2xpY2siKTttLnBhZ2VYPXAucGFnZVg7bS5wYWdlWT1wLnBhZ2VZO3EudGFyZ2V0LnRyaWdnZXIobSxuKX19ZnVuY3Rpb24gbChxLHAsdCxzLHIpe2lmKHMpe3ZhciBvPVtzLnNlcmllc0luZGV4LHMucG9pbnRJbmRleCxzLmRhdGFdO3ZhciBtPXIucGx1Z2lucy5mdW5uZWxSZW5kZXJlci5oaWdobGlnaHRlZFNlcmllc0luZGV4O2lmKG0hPW51bGwmJnIuc2VyaWVzW21dLmhpZ2hsaWdodE1vdXNlRG93bil7aShyKX12YXIgbj1qUXVlcnkuRXZlbnQoImpxcGxvdERhdGFSaWdodENsaWNrIik7bi5wYWdlWD1xLnBhZ2VYO24ucGFnZVk9cS5wYWdlWTtyLnRhcmdldC50cmlnZ2VyKG4sbyl9fWZ1bmN0aW9uIGgoKXtpZih0aGlzLnBsdWdpbnMuZnVubmVsUmVuZGVyZXImJnRoaXMucGx1Z2lucy5mdW5uZWxSZW5kZXJlci5oaWdobGlnaHRDYW52YXMpe3RoaXMucGx1Z2lucy5mdW5uZWxSZW5kZXJlci5oaWdobGlnaHRDYW52YXMucmVzZXRDYW52YXMoKTt0aGlzLnBsdWdpbnMuZnVubmVsUmVuZGVyZXIuaGlnaGxpZ2h0Q2FudmFzPW51bGx9dGhpcy5wbHVnaW5zLmZ1bm5lbFJlbmRlcmVyPXt9O3RoaXMucGx1Z2lucy5mdW5uZWxSZW5kZXJlci5oaWdobGlnaHRDYW52YXM9bmV3IGUuanFwbG90LkdlbmVyaWNDYW52YXMoKTt2YXIgbj1lKHRoaXMudGFyZ2V0SWQrIiAuanFwbG90LWRhdGEtbGFiZWwiKTtpZihuLmxlbmd0aCl7ZShuWzBdKS5iZWZvcmUodGhpcy5wbHVnaW5zLmZ1bm5lbFJlbmRlcmVyLmhpZ2hsaWdodENhbnZhcy5jcmVhdGVFbGVtZW50KHRoaXMuX2dyaWRQYWRkaW5nLCJqcXBsb3QtZnVubmVsUmVuZGVyZXItaGlnaGxpZ2h0LWNhbnZhcyIsdGhpcy5fcGxvdERpbWVuc2lvbnMsdGhpcykpfWVsc2V7dGhpcy5ldmVudENhbnZhcy5fZWxlbS5iZWZvcmUodGhpcy5wbHVnaW5zLmZ1bm5lbFJlbmRlcmVyLmhpZ2hsaWdodENhbnZhcy5jcmVhdGVFbGVtZW50KHRoaXMuX2dyaWRQYWRkaW5nLCJqcXBsb3QtZnVubmVsUmVuZGVyZXItaGlnaGxpZ2h0LWNhbnZhcyIsdGhpcy5fcGxvdERpbWVuc2lvbnMsdGhpcykpfXZhciBtPXRoaXMucGx1Z2lucy5mdW5uZWxSZW5kZXJlci5oaWdobGlnaHRDYW52YXMuc2V0Q29udGV4dCgpO3RoaXMuZXZlbnRDYW52YXMuX2VsZW0uYmluZCgibW91c2VsZWF2ZSIse3Bsb3Q6dGhpc30sZnVuY3Rpb24obyl7aShvLmRhdGEucGxvdCl9KX1lLmpxcGxvdC5wcmVJbml0SG9va3MucHVzaChjKTtlLmpxcGxvdC5GdW5uZWxUaWNrUmVuZGVyZXI9ZnVuY3Rpb24oKXtlLmpxcGxvdC5BeGlzVGlja1JlbmRlcmVyLmNhbGwodGhpcyl9O2UuanFwbG90LkZ1bm5lbFRpY2tSZW5kZXJlci5wcm90b3R5cGU9bmV3IGUuanFwbG90LkF4aXNUaWNrUmVuZGVyZXIoKTtlLmpxcGxvdC5GdW5uZWxUaWNrUmVuZGVyZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUuanFwbG90LkZ1bm5lbFRpY2tSZW5kZXJlcn0pKGpRdWVyeSk7]]></data>
	</file>
	<file>
	  <filename>/src/plugins/jqplot.highlighter.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqCiAqIGpxUGxvdAogKiBQdXJlIEphdmFTY3JpcHQgcGxvdHRpbmcgcGx1Z2luIHVzaW5nIGpRdWVyeQogKgogKiBWZXJzaW9uOiAxLjAuMGIyX3IxMDEyCiAqCiAqIENvcHlyaWdodCAoYykgMjAwOS0yMDExIENocmlzIExlb25lbGxvCiAqIGpxUGxvdCBpcyBjdXJyZW50bHkgYXZhaWxhYmxlIGZvciB1c2UgaW4gYWxsIHBlcnNvbmFsIG9yIGNvbW1lcmNpYWwgcHJvamVjdHMgCiAqIHVuZGVyIGJvdGggdGhlIE1JVCAoaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHApIGFuZCBHUEwgCiAqIHZlcnNpb24gMi4wIChodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC5odG1sKSBsaWNlbnNlcy4gVGhpcyBtZWFucyB0aGF0IHlvdSBjYW4gCiAqIGNob29zZSB0aGUgbGljZW5zZSB0aGF0IGJlc3Qgc3VpdHMgeW91ciBwcm9qZWN0IGFuZCB1c2UgaXQgYWNjb3JkaW5nbHkuIAogKgogKiBBbHRob3VnaCBub3QgcmVxdWlyZWQsIHRoZSBhdXRob3Igd291bGQgYXBwcmVjaWF0ZSBhbiBlbWFpbCBsZXR0aW5nIGhpbSAKICoga25vdyBvZiBhbnkgc3Vic3RhbnRpYWwgdXNlIG9mIGpxUGxvdC4gIFlvdSBjYW4gcmVhY2ggdGhlIGF1dGhvciBhdDogCiAqIGNocmlzIGF0IGpxcGxvdCBkb3QgY29tIG9yIHNlZSBodHRwOi8vd3d3LmpxcGxvdC5jb20vaW5mby5waHAgLgogKgogKiBJZiB5b3UgYXJlIGZlZWxpbmcga2luZCBhbmQgZ2VuZXJvdXMsIGNvbnNpZGVyIHN1cHBvcnRpbmcgdGhlIHByb2plY3QgYnkKICogbWFraW5nIGEgZG9uYXRpb24gYXQ6IGh0dHA6Ly93d3cuanFwbG90LmNvbS9kb25hdGUucGhwIC4KICoKICogc3ByaW50ZiBmdW5jdGlvbnMgY29udGFpbmVkIGluIGpxcGxvdC5zcHJpbnRmLmpzIGJ5IEFzaCBTZWFybGU6CiAqCiAqICAgICB2ZXJzaW9uIDIwMDcuMDQuMjcKICogICAgIGF1dGhvciBBc2ggU2VhcmxlCiAqICAgICBodHRwOi8vaGV4bWVuLmNvbS9ibG9nLzIwMDcvMDMvcHJpbnRmLXNwcmludGYvCiAqICAgICBodHRwOi8vaGV4bWVuLmNvbS9qcy9zcHJpbnRmLmpzCiAqICAgICBUaGUgYXV0aG9yIChBc2ggU2VhcmxlKSBoYXMgcGxhY2VkIHRoaXMgY29kZSBpbiB0aGUgcHVibGljIGRvbWFpbjoKICogICAgICJUaGlzIGNvZGUgaXMgdW5yZXN0cmljdGVkOiB5b3UgYXJlIGZyZWUgdG8gdXNlIGl0IGhvd2V2ZXIgeW91IGxpa2UuIgogKiAKICovCihmdW5jdGlvbigkKSB7CiAgICAkLmpxcGxvdC5ldmVudExpc3RlbmVySG9va3MucHVzaChbJ2pxcGxvdE1vdXNlTW92ZScsIGhhbmRsZU1vdmVdKTsKICAgIAogICAgLyoqCiAgICAgKiBDbGFzczogJC5qcXBsb3QuSGlnaGxpZ2h0ZXIKICAgICAqIFBsdWdpbiB3aGljaCB3aWxsIGhpZ2hsaWdodCBkYXRhIHBvaW50cyB3aGVuIHRoZXkgYXJlIG1vdXNlZCBvdmVyLgogICAgICogCiAgICAgKiBUbyB1c2UgdGhpcyBwbHVnaW4sIGluY2x1ZGUgdGhlIGpzCiAgICAgKiBmaWxlIGluIHlvdXIgc291cmNlOgogICAgICogCiAgICAgKiA+IDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InBsdWdpbnMvanFwbG90LmhpZ2hsaWdodGVyLmpzIj48L3NjcmlwdD4KICAgICAqIAogICAgICogQSB0b29sdGlwIHByb3ZpZGluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZGF0YSBwb2ludCBpcyBlbmFibGVkIGJ5IGRlZmF1bHQuCiAgICAgKiBUbyBkaXNhYmxlIHRoZSB0b29sdGlwLCBzZXQgInNob3dUb29sdGlwIiB0byBmYWxzZS4KICAgICAqIAogICAgICogWW91IGNhbiBjb250cm9sIHdoYXQgZGF0YSBpcyBkaXNwbGF5ZWQgaW4gdGhlIHRvb2x0aXAgd2l0aCB2YXJpb3VzCiAgICAgKiBvcHRpb25zLiAgVGhlICJ0b29sdGlwQXhlcyIgb3B0aW9uIGNvbnRyb2xzIHdldGhlciB0aGUgeCwgeSBvciBib3RoCiAgICAgKiBkYXRhIHZhbHVlcyBhcmUgZGlzcGxheWVkLgogICAgICogCiAgICAgKiBTb21lIGNoYXJ0IHR5cGVzIChlLmcuIGhpLWxvdy1jbG9zZSkgaGF2ZSBtb3JlIHRoYW4gb25lIHkgdmFsdWUgcGVyCiAgICAgKiBkYXRhIHBvaW50LiBUbyBkaXNwbGF5IHRoZSBhZGRpdGlvbmFsIHZhbHVlcyBpbiB0aGUgdG9vbHRpcCwgc2V0IHRoZQogICAgICogInl2YWx1ZXMiIG9wdGlvbiB0byB0aGUgZGVzaXJlZCBudW1iZXIgb2YgeSB2YWx1ZXMgcHJlc2VudCAoMyBmb3IgYSBobGMgY2hhcnQpLgogICAgICogCiAgICAgKiBCeSBkZWZhdWx0LCBkYXRhIHZhbHVlcyB3aWxsIGJlIGZvcm1hdHRlZCB3aXRoIHRoZSBzYW1lIGZvcm1hdHRpbmcKICAgICAqIHNwZWNpZmllcnMgYXMgdXNlZCB0byBmb3JtYXQgdGhlIGF4aXMgdGlja3MuICBBIGN1c3RvbSBmb3JtYXQgY29kZQogICAgICogY2FuIGJlIHN1cHBsaWVkIHdpdGggdGhlIHRvb2x0aXBGb3JtYXRTdHJpbmcgb3B0aW9uLiAgVGhpcyB3aWxsIGFwcGx5IAogICAgICogdG8gYWxsIHZhbHVlcyBpbiB0aGUgdG9vbHRpcC4gIAogICAgICogCiAgICAgKiBGb3IgbW9yZSBjb21wbGV0ZSBjb250cm9sLCB0aGUgImZvcm1hdFN0cmluZyIgb3B0aW9uIGNhbiBiZSBzZXQuICBUaGlzCiAgICAgKiBBbGxvd3MgY29ucGxldGUgY29udHJvbCBvdmVyIHRvb2x0aXAgZm9ybWF0dGluZy4gIFZhbHVlcyBhcmUgcGFzc2VkIHRvCiAgICAgKiB0aGUgZm9ybWF0IHN0cmluZyBpbiBhbiBvcmRlciBkZXRlcm1pbmVkIGJ5IHRoZSAidG9vbHRpcEF4ZXMiIGFuZCAieXZhbHVlcyIKICAgICAqIG9wdGlvbnMuICBTbywgaWYgeW91IGhhdmUgYSBoaS1sb3ctY2xvc2UgY2hhcnQgYW5kIHlvdSBqdXN0IHdhbnQgdG8gZGlzcGxheSAKICAgICAqIHRoZSBoaS1sb3ctY2xvc2UgdmFsdWVzIGluIHRoZSB0b29sdGlwLCB5b3UgY291bGQgc2V0IGEgZm9ybWF0U3RyaW5nIGxpa2U6CiAgICAgKiAKICAgICAqID4gaGlnaGxpZ2h0ZXI6IHsKICAgICAqID4gICAgIHRvb2x0aXBBeGVzOiAneScsCiAgICAgKiA+ICAgICB5dmFsdWVzOiAzLAogICAgICogPiAgICAgZm9ybWF0U3RyaW5nOic8dGFibGUgY2xhc3M9ImpxcGxvdC1oaWdobGlnaHRlciI+CiAgICAgKiA+ICAgICAgICAgPHRyPjx0ZD5oaTo8L3RkPjx0ZD4lczwvdGQ+PC90cj4KICAgICAqID4gICAgICAgICA8dHI+PHRkPmxvdzo8L3RkPjx0ZD4lczwvdGQ+PC90cj4KICAgICAqID4gICAgICAgICA8dHI+PHRkPmNsb3NlOjwvdGQ+PHRkPiVzPC90ZD48L3RyPjwvdGFibGU+JwogICAgICogPiB9CiAgICAgKiAKICAgICAqLwogICAgJC5qcXBsb3QuSGlnaGxpZ2h0ZXIgPSBmdW5jdGlvbihvcHRpb25zKSB7CiAgICAgICAgLy8gR3JvdXA6IFByb3BlcnRpZXMKICAgICAgICAvLwogICAgICAgIC8vcHJvcDogc2hvdwogICAgICAgIC8vIHRydWUgdG8gc2hvdyB0aGUgaGlnaGxpZ2h0LgogICAgICAgIHRoaXMuc2hvdyA9ICQuanFwbG90LmNvbmZpZy5lbmFibGVQbHVnaW5zOwogICAgICAgIC8vIHByb3A6IG1hcmtlclJlbmRlcmVyCiAgICAgICAgLy8gUmVuZGVyZXIgdXNlZCB0byBkcmF3IHRoZSBtYXJrZXIgb2YgdGhlIGhpZ2hsaWdodGVkIHBvaW50LgogICAgICAgIC8vIFJlbmRlcmVyIHdpbGwgYXNzaW1pbGF0ZSBhdHRyaWJ1dGVzIGZyb20gdGhlIGRhdGEgcG9pbnQgYmVpbmcgaGlnaGxpZ2h0ZWQsCiAgICAgICAgLy8gc28gbm8gYXR0cmlidXRlcyBuZWVkIHNldCBvbiB0aGUgcmVuZGVyZXIgZGlyZWN0bHkuCiAgICAgICAgLy8gRGVmYXVsdCBpcyB0byB0dXJuIG9mZiBzaGFkb3cgZHJhd2luZyBvbiB0aGUgaGlnaGxpZ2h0ZWQgcG9pbnQuCiAgICAgICAgdGhpcy5tYXJrZXJSZW5kZXJlciA9IG5ldyAkLmpxcGxvdC5NYXJrZXJSZW5kZXJlcih7c2hhZG93OmZhbHNlfSk7CiAgICAgICAgLy8gcHJvcDogc2hvd01hcmtlcgogICAgICAgIC8vIHRydWUgdG8gc2hvdyB0aGUgbWFya2VyCiAgICAgICAgdGhpcy5zaG93TWFya2VyICA9IHRydWU7CiAgICAgICAgLy8gcHJvcDogbGluZVdpZHRoQWRqdXN0CiAgICAgICAgLy8gUGl4ZWxzIHRvIGFkZCB0byB0aGUgbGluZVdpZHRoIG9mIHRoZSBoaWdobGlnaHQuCiAgICAgICAgdGhpcy5saW5lV2lkdGhBZGp1c3QgPSAyLjU7CiAgICAgICAgLy8gcHJvcDogc2l6ZUFkanVzdAogICAgICAgIC8vIFBpeGVscyB0byBhZGQgdG8gdGhlIG92ZXJhbGwgc2l6ZSBvZiB0aGUgaGlnaGxpZ2h0LgogICAgICAgIHRoaXMuc2l6ZUFkanVzdCA9IDU7CiAgICAgICAgLy8gcHJvcDogc2hvd1Rvb2x0aXAKICAgICAgICAvLyBTaG93IGEgdG9vbHRpcCB3aXRoIGRhdGEgcG9pbnQgdmFsdWVzLgogICAgICAgIHRoaXMuc2hvd1Rvb2x0aXAgPSB0cnVlOwogICAgICAgIC8vIHByb3A6IHRvb2x0aXBMb2NhdGlvbgogICAgICAgIC8vIFdoZXJlIHRvIHBvc2l0aW9uIHRvb2x0aXAsICduJywgJ25lJywgJ2UnLCAnc2UnLCAncycsICdzdycsICd3JywgJ253JwogICAgICAgIHRoaXMudG9vbHRpcExvY2F0aW9uID0gJ253JzsKICAgICAgICAvLyBwcm9wOiBmYWRlVG9vbHRpcAogICAgICAgIC8vIHRydWUgPSBmYWRlIGluL291dCB0b29sdGlwLCBmbGFzZSA9IHNob3cvaGlkZSB0b29sdGlwCiAgICAgICAgdGhpcy5mYWRlVG9vbHRpcCA9IHRydWU7CiAgICAgICAgLy8gcHJvcDogdG9vbHRpcEZhZGVTcGVlZAogICAgICAgIC8vICdzbG93JywgJ2RlZicsICdmYXN0Jywgb3IgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcy4KICAgICAgICB0aGlzLnRvb2x0aXBGYWRlU3BlZWQgPSAiZmFzdCI7CiAgICAgICAgLy8gcHJvcDogdG9vbHRpcE9mZnNldAogICAgICAgIC8vIFBpeGVsIG9mZnNldCBvZiB0b29sdGlwIGZyb20gdGhlIGhpZ2hsaWdodC4KICAgICAgICB0aGlzLnRvb2x0aXBPZmZzZXQgPSAyOwogICAgICAgIC8vIHByb3A6IHRvb2x0aXBBeGVzCiAgICAgICAgLy8gV2hpY2ggYXhlcyB0byBkaXNwbGF5IGluIHRvb2x0aXAsICd4JywgJ3knIG9yICdib3RoJywgJ3h5JyBvciAneXgnCiAgICAgICAgLy8gJ2JvdGgnIGFuZCAneHknIGFyZSBlcXVpdmFsZW50LCAneXgnIHJldmVyc2VzIG9yZGVyIG9mIGxhYmVscy4KICAgICAgICB0aGlzLnRvb2x0aXBBeGVzID0gJ2JvdGgnOwogICAgICAgIC8vIHByb3A7IHRvb2x0aXBTZXBhcmF0b3IKICAgICAgICAvLyBTdHJpbmcgdG8gdXNlIHRvIHNlcGFyYXRlIHggYW5kIHkgYXhlcyBpbiB0b29sdGlwLgogICAgICAgIHRoaXMudG9vbHRpcFNlcGFyYXRvciA9ICcsICc7CiAgICAgICAgLy8gcHJvcDsgdG9vbHRpcENvbnRlbnRFZGl0b3IKICAgICAgICAvLyBGdW5jdGlvbiB1c2VkIHRvIGVkaXQvYXVnbWVudC9yZXBsYWNlIHRoZSBmb3JtYXR0ZWQgdG9vbHRpcCBjb250ZW50cy4KICAgICAgICAvLyBDYWxsZWQgYXMgc3RyID0gdG9vbHRpcENvbnRlbnRFZGl0b3Ioc3RyLCBzZXJpZXNJbmRleCwgcG9pbnRJbmRleCkKICAgICAgICAvLyB3aGVyZSBzdHIgaXMgdGhlIGdlbmVyYXRlZCB0b29sdGlwIGh0bWwgYW5kIHNlcmllc0luZGV4IGFuZCBwb2ludEluZGV4IGlkZW50aWZ5CiAgICAgICAgLy8gdGhlIGRhdGEgcG9pbnQgYmVpbmcgaGlnaGxpZ2h0ZWQuIFNob3VsZCByZXR1cm4gdGhlIGh0bWwgZm9yIHRoZSB0b29sdGlwIGNvbnRlbnRzLgogICAgICAgIHRoaXMudG9vbHRpcENvbnRlbnRFZGl0b3IgPSBudWxsOwogICAgICAgIC8vIHByb3A6IHVzZUF4ZXNGb3JtYXR0ZXJzCiAgICAgICAgLy8gVXNlIHRoZSB4IGFuZCB5IGF4ZXMgZm9ybWF0dGVycyB0byBmb3JtYXQgdGhlIHRleHQgaW4gdGhlIHRvb2x0aXAuCiAgICAgICAgdGhpcy51c2VBeGVzRm9ybWF0dGVycyA9IHRydWU7CiAgICAgICAgLy8gcHJvcDogdG9vbHRpcEZvcm1hdFN0cmluZwogICAgICAgIC8vIHNwcmludGYgZm9ybWF0IHN0cmluZyBmb3IgdGhlIHRvb2x0aXAuCiAgICAgICAgLy8gVXNlcyBBc2ggU2VhcmxlJ3MgamF2YXNjcmlwdCBzcHJpbnRmIGltcGxlbWVudGF0aW9uCiAgICAgICAgLy8gZm91bmQgaGVyZTogaHR0cDovL2hleG1lbi5jb20vYmxvZy8yMDA3LzAzL3ByaW50Zi1zcHJpbnRmLwogICAgICAgIC8vIFNlZSBodHRwOi8vcGVybGRvYy5wZXJsLm9yZy9mdW5jdGlvbnMvc3ByaW50Zi5odG1sIGZvciByZWZlcmVuY2UuCiAgICAgICAgLy8gQWRkaXRpb25hbCAicCIgYW5kICJQIiBmb3JtYXQgc3BlY2lmaWVycyBhZGRlZCBieSBDaHJpcyBMZW9uZWxsby4KICAgICAgICB0aGlzLnRvb2x0aXBGb3JtYXRTdHJpbmcgPSAnJS41UCc7CiAgICAgICAgLy8gcHJvcDogZm9ybWF0U3RyaW5nCiAgICAgICAgLy8gYWx0ZXJuYXRpdmUgdG8gdG9vbHRpcEZvcm1hdFN0cmluZwogICAgICAgIC8vIHdpbGwgZm9ybWF0IHRoZSB3aG9sZSB0b29sdGlwIHRleHQsIHBvcHVsYXRpbmcgd2l0aCB4LCB5IHZhbHVlcyBhcwogICAgICAgIC8vIGluZGljYXRlZCBieSB0b29sdGlwQXhlcyBvcHRpb24uICBTbywgeW91IGNvdWxkIGhhdmUgYSB0b29sdGlwIGxpa2U6CiAgICAgICAgLy8gJ0RhdGU6ICVzLCBudW1iZXIgb2YgY2F0czogJWQnIHRvIGZvcm1hdCB0aGUgd2hvbGUgdG9vbHRpcCBhdCBvbmUgZ28uCiAgICAgICAgLy8gSWYgdXNlQXhlc0Zvcm1hdHRlcnMgaXMgdHJ1ZSwgdmFsdWVzIHdpbGwgYmUgZm9ybWF0dGVkIGFjY29yZGluZyB0bwogICAgICAgIC8vIEF4ZXMgZm9ybWF0dGVycyBhbmQgeW91IGNhbiBwb3B1bGF0ZSB5b3VyIHRvb2x0aXAgc3RyaW5nIHdpdGggCiAgICAgICAgLy8gJXMgcGxhY2Vob2xkZXJzLgogICAgICAgIHRoaXMuZm9ybWF0U3RyaW5nID0gbnVsbDsKICAgICAgICAvLyBwcm9wOiB5dmFsdWVzCiAgICAgICAgLy8gTnVtYmVyIG9mIHkgdmFsdWVzIHRvIGV4cGVjdCBpbiB0aGUgZGF0YSBwb2ludCBhcnJheS4KICAgICAgICAvLyBUeXBpY2FsbHkgdGhpcyBpcyAxLiAgQ2VydGFpbiBwbG90cywgbGlrZSBPSExDLCB3aWxsCiAgICAgICAgLy8gaGF2ZSBtb3JlIHkgdmFsdWVzIGluIGVhY2ggZGF0YSBwb2ludCBhcnJheS4KICAgICAgICB0aGlzLnl2YWx1ZXMgPSAxOwogICAgICAgIC8vIHByb3A6IGJyaW5nU2VyaWVzVG9Gcm9udAogICAgICAgIC8vIFRoaXMgb3B0aW9uIHJlcXVpcmVzIGpRdWVyeSAxLjQrCiAgICAgICAgLy8gVHJ1ZSB0byBicmluZyB0aGUgc2VyaWVzIG9mIHRoZSBoaWdobGlnaHRlZCBwb2ludCB0byB0aGUgZnJvbnQKICAgICAgICAvLyBvZiBvdGhlciBzZXJpZXMuCiAgICAgICAgdGhpcy5icmluZ1Nlcmllc1RvRnJvbnQgPSBmYWxzZTsKICAgICAgICB0aGlzLl90b29sdGlwRWxlbTsKICAgICAgICB0aGlzLmlzSGlnaGxpZ2h0aW5nID0gZmFsc2U7CiAgICAgICAgdGhpcy5jdXJyZW50TmVpZ2hib3IgPSBudWxsOwoKICAgICAgICAkLmV4dGVuZCh0cnVlLCB0aGlzLCBvcHRpb25zKTsKICAgIH07CiAgICAKICAgIHZhciBsb2NhdGlvbnMgPSBbJ253JywgJ24nLCAnbmUnLCAnZScsICdzZScsICdzJywgJ3N3JywgJ3cnXTsKICAgIHZhciBsb2NhdGlvbkluZGljaWVzID0geydudyc6MCwgJ24nOjEsICduZSc6MiwgJ2UnOjMsICdzZSc6NCwgJ3MnOjUsICdzdyc6NiwgJ3cnOjd9OwogICAgdmFyIG9wcG9zaXRlTG9jYXRpb25zID0gWydzZScsICdzJywgJ3N3JywgJ3cnLCAnbncnLCAnbicsICduZScsICdlJ107CiAgICAKICAgIC8vIGF4aXMucmVuZGVyZXIudGlja3JlbmRlcmVyLmZvcm1hdHRlcgogICAgCiAgICAvLyBjYWxsZWQgd2l0aCBzY29wZSBvZiBwbG90CiAgICAkLmpxcGxvdC5IaWdobGlnaHRlci5pbml0ID0gZnVuY3Rpb24gKHRhcmdldCwgZGF0YSwgb3B0cyl7CiAgICAgICAgdmFyIG9wdGlvbnMgPSBvcHRzIHx8IHt9OwogICAgICAgIC8vIGFkZCBhIGhpZ2hsaWdodGVyIGF0dHJpYnV0ZSB0byB0aGUgcGxvdAogICAgICAgIHRoaXMucGx1Z2lucy5oaWdobGlnaHRlciA9IG5ldyAkLmpxcGxvdC5IaWdobGlnaHRlcihvcHRpb25zLmhpZ2hsaWdodGVyKTsKICAgIH07CiAgICAKICAgIC8vIGNhbGxlZCB3aXRoaW4gc2NvcGUgb2Ygc2VyaWVzCiAgICAkLmpxcGxvdC5IaWdobGlnaHRlci5wYXJzZU9wdGlvbnMgPSBmdW5jdGlvbiAoZGVmYXVsdHMsIG9wdGlvbnMpIHsKICAgICAgICAvLyBBZGQgYSBzaG93SGlnaGxpZ2h0IG9wdGlvbiB0byB0aGUgc2VyaWVzIAogICAgICAgIC8vIGFuZCBzZXQgaXQgdG8gdHJ1ZSBieSBkZWZhdWx0LgogICAgICAgIHRoaXMuc2hvd0hpZ2hsaWdodCA9IHRydWU7CiAgICB9OwogICAgCiAgICAvLyBjYWxsZWQgd2l0aGluIGNvbnRleHQgb2YgcGxvdAogICAgLy8gY3JlYXRlIGEgY2FudmFzIHdoaWNoIHdlIGNhbiBkcmF3IG9uLgogICAgLy8gaW5zZXJ0IGl0IGJlZm9yZSB0aGUgZXZlbnRDYW52YXMsIHNvIGV2ZW50Q2FudmFzIHdpbGwgc3RpbGwgY2FwdHVyZSBldmVudHMuCiAgICAkLmpxcGxvdC5IaWdobGlnaHRlci5wb3N0UGxvdERyYXcgPSBmdW5jdGlvbigpIHsKICAgICAgICAvLyBNZW1vcnkgTGVha3MgcGF0Y2ggICAgCiAgICAgICAgaWYgKHRoaXMucGx1Z2lucy5oaWdobGlnaHRlciAmJiB0aGlzLnBsdWdpbnMuaGlnaGxpZ2h0ZXIuaGlnaGxpZ2h0Q2FudmFzKSB7CiAgICAgICAgICAgIHRoaXMucGx1Z2lucy5oaWdobGlnaHRlci5oaWdobGlnaHRDYW52YXMucmVzZXRDYW52YXMoKTsKICAgICAgICAgICAgdGhpcy5wbHVnaW5zLmhpZ2hsaWdodGVyLmhpZ2hsaWdodENhbnZhcyA9IG51bGw7CiAgICAgICAgfQoKICAgICAgICBpZiAodGhpcy5wbHVnaW5zLmhpZ2hsaWdodGVyICYmIHRoaXMucGx1Z2lucy5oaWdobGlnaHRlci5fdG9vbHRpcEVsZW0pIHsKICAgICAgICAgICAgdGhpcy5wbHVnaW5zLmhpZ2hsaWdodGVyLl90b29sdGlwRWxlbS5lbXB0eUZvcmNlKCk7CiAgICAgICAgICAgIHRoaXMucGx1Z2lucy5oaWdobGlnaHRlci5fdG9vbHRpcEVsZW0gPSBudWxsOwogICAgICAgIH0KCiAgICAgICAgdGhpcy5wbHVnaW5zLmhpZ2hsaWdodGVyLmhpZ2hsaWdodENhbnZhcyA9IG5ldyAkLmpxcGxvdC5HZW5lcmljQ2FudmFzKCk7CiAgICAgICAgCiAgICAgICAgdGhpcy5ldmVudENhbnZhcy5fZWxlbS5iZWZvcmUodGhpcy5wbHVnaW5zLmhpZ2hsaWdodGVyLmhpZ2hsaWdodENhbnZhcy5jcmVhdGVFbGVtZW50KHRoaXMuX2dyaWRQYWRkaW5nLCAnanFwbG90LWhpZ2hsaWdodC1jYW52YXMnLCB0aGlzLl9wbG90RGltZW5zaW9ucywgdGhpcykpOwogICAgICAgIHRoaXMucGx1Z2lucy5oaWdobGlnaHRlci5oaWdobGlnaHRDYW52YXMuc2V0Q29udGV4dCgpOwoKICAgICAgICB2YXIgZWxlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgICAgIHRoaXMucGx1Z2lucy5oaWdobGlnaHRlci5fdG9vbHRpcEVsZW0gPSAkKGVsZW0pOwogICAgICAgIGVsZW0gPSBudWxsOwogICAgICAgIHRoaXMucGx1Z2lucy5oaWdobGlnaHRlci5fdG9vbHRpcEVsZW0uYWRkQ2xhc3MoJ2pxcGxvdC1oaWdobGlnaHRlci10b29sdGlwJyk7CiAgICAgICAgdGhpcy5wbHVnaW5zLmhpZ2hsaWdodGVyLl90b29sdGlwRWxlbS5jc3Moe3Bvc2l0aW9uOidhYnNvbHV0ZScsIGRpc3BsYXk6J25vbmUnfSk7CiAgICAgICAgCiAgICAgICAgdGhpcy5ldmVudENhbnZhcy5fZWxlbS5iZWZvcmUodGhpcy5wbHVnaW5zLmhpZ2hsaWdodGVyLl90b29sdGlwRWxlbSk7CiAgICB9OwogICAgCiAgICAkLmpxcGxvdC5wcmVJbml0SG9va3MucHVzaCgkLmpxcGxvdC5IaWdobGlnaHRlci5pbml0KTsKICAgICQuanFwbG90LnByZVBhcnNlU2VyaWVzT3B0aW9uc0hvb2tzLnB1c2goJC5qcXBsb3QuSGlnaGxpZ2h0ZXIucGFyc2VPcHRpb25zKTsKICAgICQuanFwbG90LnBvc3REcmF3SG9va3MucHVzaCgkLmpxcGxvdC5IaWdobGlnaHRlci5wb3N0UGxvdERyYXcpOwogICAgCiAgICBmdW5jdGlvbiBkcmF3KHBsb3QsIG5laWdoYm9yKSB7CiAgICAgICAgdmFyIGhsID0gcGxvdC5wbHVnaW5zLmhpZ2hsaWdodGVyOwogICAgICAgIHZhciBzID0gcGxvdC5zZXJpZXNbbmVpZ2hib3Iuc2VyaWVzSW5kZXhdOwogICAgICAgIHZhciBzbXIgPSBzLm1hcmtlclJlbmRlcmVyOwogICAgICAgIHZhciBtciA9IGhsLm1hcmtlclJlbmRlcmVyOwogICAgICAgIG1yLnN0eWxlID0gc21yLnN0eWxlOwogICAgICAgIG1yLmxpbmVXaWR0aCA9IHNtci5saW5lV2lkdGggKyBobC5saW5lV2lkdGhBZGp1c3Q7CiAgICAgICAgbXIuc2l6ZSA9IHNtci5zaXplICsgaGwuc2l6ZUFkanVzdDsKICAgICAgICB2YXIgcmdiYSA9ICQuanFwbG90LmdldENvbG9yQ29tcG9uZW50cyhzbXIuY29sb3IpOwogICAgICAgIHZhciBuZXdyZ2IgPSBbcmdiYVswXSwgcmdiYVsxXSwgcmdiYVsyXV07CiAgICAgICAgdmFyIGFscGhhID0gKHJnYmFbM10gPj0gMC42KSA/IHJnYmFbM10qMC42IDogcmdiYVszXSooMi1yZ2JhWzNdKTsKICAgICAgICBtci5jb2xvciA9ICdyZ2JhKCcrbmV3cmdiWzBdKycsJytuZXdyZ2JbMV0rJywnK25ld3JnYlsyXSsnLCcrYWxwaGErJyknOwogICAgICAgIG1yLmluaXQoKTsKICAgICAgICBtci5kcmF3KHMuZ3JpZERhdGFbbmVpZ2hib3IucG9pbnRJbmRleF1bMF0sIHMuZ3JpZERhdGFbbmVpZ2hib3IucG9pbnRJbmRleF1bMV0sIGhsLmhpZ2hsaWdodENhbnZhcy5fY3R4KTsKICAgIH0KICAgIAogICAgZnVuY3Rpb24gc2hvd1Rvb2x0aXAocGxvdCwgc2VyaWVzLCBuZWlnaGJvcikgewogICAgICAgIC8vIG5laWdoYm9yIGxvb2tzIGxpa2U6IHtzZXJpZXNJbmRleDogaSwgcG9pbnRJbmRleDpqLCBncmlkRGF0YTpwLCBkYXRhOnMuZGF0YVtqXX0KICAgICAgICAvLyBncmlkRGF0YSBzaG91bGQgYmUgeCx5IHBpeGVsIGNvb3JkcyBvbiB0aGUgZ3JpZC4KICAgICAgICAvLyBhZGQgdGhlIHBsb3QuX2dyaWRQYWRkaW5nIHRvIHRoYXQgdG8gZ2V0IHgseSBpbiB0aGUgdGFyZ2V0LgogICAgICAgIHZhciBobCA9IHBsb3QucGx1Z2lucy5oaWdobGlnaHRlcjsKICAgICAgICB2YXIgZWxlbSA9IGhsLl90b29sdGlwRWxlbTsKICAgICAgICB2YXIgc2VyaWVzaGwgPSBzZXJpZXMuaGlnaGxpZ2h0ZXIgfHwge307CgogICAgICAgIHZhciBvcHRzID0gJC5leHRlbmQodHJ1ZSwge30sIGhsLCBzZXJpZXNobCk7CgogICAgICAgIGlmIChvcHRzLnVzZUF4ZXNGb3JtYXR0ZXJzKSB7CiAgICAgICAgICAgIHZhciB4ZiA9IHNlcmllcy5feGF4aXMuX3RpY2tzWzBdLmZvcm1hdHRlcjsKICAgICAgICAgICAgdmFyIHlmID0gc2VyaWVzLl95YXhpcy5fdGlja3NbMF0uZm9ybWF0dGVyOwogICAgICAgICAgICB2YXIgeGZzdHIgPSBzZXJpZXMuX3hheGlzLl90aWNrc1swXS5mb3JtYXRTdHJpbmc7CiAgICAgICAgICAgIHZhciB5ZnN0ciA9IHNlcmllcy5feWF4aXMuX3RpY2tzWzBdLmZvcm1hdFN0cmluZzsKICAgICAgICAgICAgdmFyIHN0cjsKICAgICAgICAgICAgdmFyIHhzdHIgPSB4Zih4ZnN0ciwgbmVpZ2hib3IuZGF0YVswXSk7CiAgICAgICAgICAgIHZhciB5c3RycyA9IFtdOwogICAgICAgICAgICBmb3IgKHZhciBpPTE7IGk8b3B0cy55dmFsdWVzKzE7IGkrKykgewogICAgICAgICAgICAgICAgeXN0cnMucHVzaCh5Zih5ZnN0ciwgbmVpZ2hib3IuZGF0YVtpXSkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0eXBlb2Ygb3B0cy5mb3JtYXRTdHJpbmcgPT09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgICAgICBzd2l0Y2ggKG9wdHMudG9vbHRpcEF4ZXMpIHsKICAgICAgICAgICAgICAgICAgICBjYXNlICdib3RoJzoKICAgICAgICAgICAgICAgICAgICBjYXNlICd4eSc6CiAgICAgICAgICAgICAgICAgICAgICAgIHlzdHJzLnVuc2hpZnQoeHN0cik7CiAgICAgICAgICAgICAgICAgICAgICAgIHlzdHJzLnVuc2hpZnQob3B0cy5mb3JtYXRTdHJpbmcpOwogICAgICAgICAgICAgICAgICAgICAgICBzdHIgPSAkLmpxcGxvdC5zcHJpbnRmLmFwcGx5KCQuanFwbG90LnNwcmludGYsIHlzdHJzKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAneXgnOgogICAgICAgICAgICAgICAgICAgICAgICB5c3Rycy5wdXNoKHhzdHIpOwogICAgICAgICAgICAgICAgICAgICAgICB5c3Rycy51bnNoaWZ0KG9wdHMuZm9ybWF0U3RyaW5nKTsKICAgICAgICAgICAgICAgICAgICAgICAgc3RyID0gJC5qcXBsb3Quc3ByaW50Zi5hcHBseSgkLmpxcGxvdC5zcHJpbnRmLCB5c3Rycyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgJ3gnOgogICAgICAgICAgICAgICAgICAgICAgICBzdHIgPSAkLmpxcGxvdC5zcHJpbnRmLmFwcGx5KCQuanFwbG90LnNwcmludGYsIFtvcHRzLmZvcm1hdFN0cmluZywgeHN0cl0pOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlICd5JzoKICAgICAgICAgICAgICAgICAgICAgICAgeXN0cnMudW5zaGlmdChvcHRzLmZvcm1hdFN0cmluZyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0ciA9ICQuanFwbG90LnNwcmludGYuYXBwbHkoJC5qcXBsb3Quc3ByaW50ZiwgeXN0cnMpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiAvLyBzYW1lIGFzIHh5CiAgICAgICAgICAgICAgICAgICAgICAgIHlzdHJzLnVuc2hpZnQoeHN0cik7CiAgICAgICAgICAgICAgICAgICAgICAgIHlzdHJzLnVuc2hpZnQob3B0cy5mb3JtYXRTdHJpbmcpOwogICAgICAgICAgICAgICAgICAgICAgICBzdHIgPSAkLmpxcGxvdC5zcHJpbnRmLmFwcGx5KCQuanFwbG90LnNwcmludGYsIHlzdHJzKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9IAogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgc3dpdGNoIChvcHRzLnRvb2x0aXBBeGVzKSB7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAnYm90aCc6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAneHknOgogICAgICAgICAgICAgICAgICAgICAgICBzdHIgPSB4c3RyOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpPTA7IGk8eXN0cnMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSBvcHRzLnRvb2x0aXBTZXBhcmF0b3IgKyB5c3Ryc1tpXTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlICd5eCc6CiAgICAgICAgICAgICAgICAgICAgICAgIHN0ciA9ICcnOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpPTA7IGk8eXN0cnMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSB5c3Ryc1tpXSArIG9wdHMudG9vbHRpcFNlcGFyYXRvcjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBzdHIgKz0geHN0cjsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAneCc6CiAgICAgICAgICAgICAgICAgICAgICAgIHN0ciA9IHhzdHI7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgJ3knOgogICAgICAgICAgICAgICAgICAgICAgICBzdHIgPSB5c3Rycy5qb2luKG9wdHMudG9vbHRpcFNlcGFyYXRvcik7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IC8vIHNhbWUgYXMgJ3h5JwogICAgICAgICAgICAgICAgICAgICAgICBzdHIgPSB4c3RyOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpPTA7IGk8eXN0cnMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSBvcHRzLnRvb2x0aXBTZXBhcmF0b3IgKyB5c3Ryc1tpXTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHZhciBzdHI7CiAgICAgICAgICAgIGlmICh0eXBlb2Ygb3B0cy5mb3JtYXRTdHJpbmcgPT09ICAnc3RyaW5nJykgewogICAgICAgICAgICAgICAgc3RyID0gJC5qcXBsb3Quc3ByaW50Zi5hcHBseSgkLmpxcGxvdC5zcHJpbnRmLCBbb3B0cy5mb3JtYXRTdHJpbmddLmNvbmNhdChuZWlnaGJvci5kYXRhKSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgaWYgKG9wdHMudG9vbHRpcEF4ZXMgPT0gJ2JvdGgnIHx8IG9wdHMudG9vbHRpcEF4ZXMgPT0gJ3h5JykgewogICAgICAgICAgICAgICAgICAgIHN0ciA9ICQuanFwbG90LnNwcmludGYob3B0cy50b29sdGlwRm9ybWF0U3RyaW5nLCBuZWlnaGJvci5kYXRhWzBdKSArIG9wdHMudG9vbHRpcFNlcGFyYXRvciArICQuanFwbG90LnNwcmludGYob3B0cy50b29sdGlwRm9ybWF0U3RyaW5nLCBuZWlnaGJvci5kYXRhWzFdKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKG9wdHMudG9vbHRpcEF4ZXMgPT0gJ3l4JykgewogICAgICAgICAgICAgICAgICAgIHN0ciA9ICQuanFwbG90LnNwcmludGYob3B0cy50b29sdGlwRm9ybWF0U3RyaW5nLCBuZWlnaGJvci5kYXRhWzFdKSArIG9wdHMudG9vbHRpcFNlcGFyYXRvciArICQuanFwbG90LnNwcmludGYob3B0cy50b29sdGlwRm9ybWF0U3RyaW5nLCBuZWlnaGJvci5kYXRhWzBdKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKG9wdHMudG9vbHRpcEF4ZXMgPT0gJ3gnKSB7CiAgICAgICAgICAgICAgICAgICAgc3RyID0gJC5qcXBsb3Quc3ByaW50ZihvcHRzLnRvb2x0aXBGb3JtYXRTdHJpbmcsIG5laWdoYm9yLmRhdGFbMF0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAob3B0cy50b29sdGlwQXhlcyA9PSAneScpIHsKICAgICAgICAgICAgICAgICAgICBzdHIgPSAkLmpxcGxvdC5zcHJpbnRmKG9wdHMudG9vbHRpcEZvcm1hdFN0cmluZywgbmVpZ2hib3IuZGF0YVsxXSk7CiAgICAgICAgICAgICAgICB9IAogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICgkLmlzRnVuY3Rpb24ob3B0cy50b29sdGlwQ29udGVudEVkaXRvcikpIHsKICAgICAgICAgICAgLy8gYXJncyBzdHIsIHNlcmllc0luZGV4LCBwb2ludEluZGV4IGFyZSBlc3NlbnRpYWwgc28gdGhlIGhvb2sgY2FuIGxvb2sgdXAKICAgICAgICAgICAgLy8gZXh0cmEgZGF0YSBmb3IgdGhlIHBvaW50LgogICAgICAgICAgICBzdHIgPSBvcHRzLnRvb2x0aXBDb250ZW50RWRpdG9yKHN0ciwgbmVpZ2hib3Iuc2VyaWVzSW5kZXgsIG5laWdoYm9yLnBvaW50SW5kZXgsIHBsb3QpOwogICAgICAgIH0KICAgICAgICBlbGVtLmh0bWwoc3RyKTsKICAgICAgICB2YXIgZ3JpZHBvcyA9IHt4Om5laWdoYm9yLmdyaWREYXRhWzBdLCB5Om5laWdoYm9yLmdyaWREYXRhWzFdfTsKICAgICAgICB2YXIgbXMgPSAwOwogICAgICAgIHZhciBmYWN0ID0gMC43MDc7CiAgICAgICAgaWYgKHNlcmllcy5tYXJrZXJSZW5kZXJlci5zaG93ID09IHRydWUpIHsgCiAgICAgICAgICAgIG1zID0gKHNlcmllcy5tYXJrZXJSZW5kZXJlci5zaXplICsgb3B0cy5zaXplQWRqdXN0KS8yOwogICAgICAgIH0KCQkKCQl2YXIgbG9jID0gbG9jYXRpb25zOwoJCWlmIChzZXJpZXMuZmlsbFRvWmVybyAmJiBzZXJpZXMuZmlsbCAmJiBuZWlnaGJvci5kYXRhWzFdIDwgMCkgewoJCQlsb2MgPSBvcHBvc2l0ZUxvY2F0aW9uczsKCQl9CgkJCiAgICAgICAgc3dpdGNoIChsb2NbbG9jYXRpb25JbmRpY2llc1tvcHRzLnRvb2x0aXBMb2NhdGlvbl1dKSB7CiAgICAgICAgICAgIGNhc2UgJ253JzoKICAgICAgICAgICAgICAgIHZhciB4ID0gZ3JpZHBvcy54ICsgcGxvdC5fZ3JpZFBhZGRpbmcubGVmdCAtIGVsZW0ub3V0ZXJXaWR0aCh0cnVlKSAtIG9wdHMudG9vbHRpcE9mZnNldCAtIGZhY3QgKiBtczsKICAgICAgICAgICAgICAgIHZhciB5ID0gZ3JpZHBvcy55ICsgcGxvdC5fZ3JpZFBhZGRpbmcudG9wIC0gb3B0cy50b29sdGlwT2Zmc2V0IC0gZWxlbS5vdXRlckhlaWdodCh0cnVlKSAtIGZhY3QgKiBtczsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICduJzoKICAgICAgICAgICAgICAgIHZhciB4ID0gZ3JpZHBvcy54ICsgcGxvdC5fZ3JpZFBhZGRpbmcubGVmdCAtIGVsZW0ub3V0ZXJXaWR0aCh0cnVlKS8yOwogICAgICAgICAgICAgICAgdmFyIHkgPSBncmlkcG9zLnkgKyBwbG90Ll9ncmlkUGFkZGluZy50b3AgLSBvcHRzLnRvb2x0aXBPZmZzZXQgLSBlbGVtLm91dGVySGVpZ2h0KHRydWUpIC0gbXM7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnbmUnOgogICAgICAgICAgICAgICAgdmFyIHggPSBncmlkcG9zLnggKyBwbG90Ll9ncmlkUGFkZGluZy5sZWZ0ICsgb3B0cy50b29sdGlwT2Zmc2V0ICsgZmFjdCAqIG1zOwogICAgICAgICAgICAgICAgdmFyIHkgPSBncmlkcG9zLnkgKyBwbG90Ll9ncmlkUGFkZGluZy50b3AgLSBvcHRzLnRvb2x0aXBPZmZzZXQgLSBlbGVtLm91dGVySGVpZ2h0KHRydWUpIC0gZmFjdCAqIG1zOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ2UnOgogICAgICAgICAgICAgICAgdmFyIHggPSBncmlkcG9zLnggKyBwbG90Ll9ncmlkUGFkZGluZy5sZWZ0ICsgb3B0cy50b29sdGlwT2Zmc2V0ICsgbXM7CiAgICAgICAgICAgICAgICB2YXIgeSA9IGdyaWRwb3MueSArIHBsb3QuX2dyaWRQYWRkaW5nLnRvcCAtIGVsZW0ub3V0ZXJIZWlnaHQodHJ1ZSkvMjsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdzZSc6CiAgICAgICAgICAgICAgICB2YXIgeCA9IGdyaWRwb3MueCArIHBsb3QuX2dyaWRQYWRkaW5nLmxlZnQgKyBvcHRzLnRvb2x0aXBPZmZzZXQgKyBmYWN0ICogbXM7CiAgICAgICAgICAgICAgICB2YXIgeSA9IGdyaWRwb3MueSArIHBsb3QuX2dyaWRQYWRkaW5nLnRvcCArIG9wdHMudG9vbHRpcE9mZnNldCArIGZhY3QgKiBtczsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdzJzoKICAgICAgICAgICAgICAgIHZhciB4ID0gZ3JpZHBvcy54ICsgcGxvdC5fZ3JpZFBhZGRpbmcubGVmdCAtIGVsZW0ub3V0ZXJXaWR0aCh0cnVlKS8yOwogICAgICAgICAgICAgICAgdmFyIHkgPSBncmlkcG9zLnkgKyBwbG90Ll9ncmlkUGFkZGluZy50b3AgKyBvcHRzLnRvb2x0aXBPZmZzZXQgKyBtczsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdzdyc6CiAgICAgICAgICAgICAgICB2YXIgeCA9IGdyaWRwb3MueCArIHBsb3QuX2dyaWRQYWRkaW5nLmxlZnQgLSBlbGVtLm91dGVyV2lkdGgodHJ1ZSkgLSBvcHRzLnRvb2x0aXBPZmZzZXQgLSBmYWN0ICogbXM7CiAgICAgICAgICAgICAgICB2YXIgeSA9IGdyaWRwb3MueSArIHBsb3QuX2dyaWRQYWRkaW5nLnRvcCArIG9wdHMudG9vbHRpcE9mZnNldCArIGZhY3QgKiBtczsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICd3JzoKICAgICAgICAgICAgICAgIHZhciB4ID0gZ3JpZHBvcy54ICsgcGxvdC5fZ3JpZFBhZGRpbmcubGVmdCAtIGVsZW0ub3V0ZXJXaWR0aCh0cnVlKSAtIG9wdHMudG9vbHRpcE9mZnNldCAtIG1zOwogICAgICAgICAgICAgICAgdmFyIHkgPSBncmlkcG9zLnkgKyBwbG90Ll9ncmlkUGFkZGluZy50b3AgLSBlbGVtLm91dGVySGVpZ2h0KHRydWUpLzI7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgZGVmYXVsdDogLy8gc2FtZSBhcyAnbncnCiAgICAgICAgICAgICAgICB2YXIgeCA9IGdyaWRwb3MueCArIHBsb3QuX2dyaWRQYWRkaW5nLmxlZnQgLSBlbGVtLm91dGVyV2lkdGgodHJ1ZSkgLSBvcHRzLnRvb2x0aXBPZmZzZXQgLSBmYWN0ICogbXM7CiAgICAgICAgICAgICAgICB2YXIgeSA9IGdyaWRwb3MueSArIHBsb3QuX2dyaWRQYWRkaW5nLnRvcCAtIG9wdHMudG9vbHRpcE9mZnNldCAtIGVsZW0ub3V0ZXJIZWlnaHQodHJ1ZSkgLSBmYWN0ICogbXM7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgZWxlbS5jc3MoJ2xlZnQnLCB4KTsKICAgICAgICBlbGVtLmNzcygndG9wJywgeSk7CiAgICAgICAgaWYgKG9wdHMuZmFkZVRvb2x0aXApIHsKICAgICAgICAgICAgLy8gRml4IGZvciBzdGFja2VkIHVwIGFuaW1hdGlvbnMuICBUaG5hbmtzIFRyZXZvciEKICAgICAgICAgICAgZWxlbS5zdG9wKHRydWUsdHJ1ZSkuZmFkZUluKG9wdHMudG9vbHRpcEZhZGVTcGVlZCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBlbGVtLnNob3coKTsKICAgICAgICB9CiAgICAgICAgZWxlbSA9IG51bGw7CiAgICAgICAgCiAgICB9CiAgICAKICAgIGZ1bmN0aW9uIGhhbmRsZU1vdmUoZXYsIGdyaWRwb3MsIGRhdGFwb3MsIG5laWdoYm9yLCBwbG90KSB7CiAgICAgICAgdmFyIGhsID0gcGxvdC5wbHVnaW5zLmhpZ2hsaWdodGVyOwogICAgICAgIHZhciBjID0gcGxvdC5wbHVnaW5zLmN1cnNvcjsKICAgICAgICBpZiAoaGwuc2hvdykgewogICAgICAgICAgICBpZiAobmVpZ2hib3IgPT0gbnVsbCAmJiBobC5pc0hpZ2hsaWdodGluZykgewogICAgICAgICAgICAgICAgdmFyIGN0eCA9IGhsLmhpZ2hsaWdodENhbnZhcy5fY3R4OwogICAgICAgICAgICAgICAgY3R4LmNsZWFyUmVjdCgwLCAwLCBjdHguY2FudmFzLndpZHRoLCBjdHguY2FudmFzLmhlaWdodCk7CiAgICAgICAgICAgICAgICBpZiAoaGwuZmFkZVRvb2x0aXApIHsKICAgICAgICAgICAgICAgICAgICBobC5fdG9vbHRpcEVsZW0uZmFkZU91dChobC50b29sdGlwRmFkZVNwZWVkKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIGhsLl90b29sdGlwRWxlbS5oaWRlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoaGwuYnJpbmdTZXJpZXNUb0Zyb250KSB7CiAgICAgICAgICAgICAgICAgICAgcGxvdC5yZXN0b3JlUHJldmlvdXNTZXJpZXNPcmRlcigpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaGwuaXNIaWdobGlnaHRpbmcgPSBmYWxzZTsKICAgICAgICAgICAgICAgIGhsLmN1cnJlbnROZWlnaGJvciA9IG51bGw7CiAgICAgICAgICAgICAgICBjdHggPSBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKG5laWdoYm9yICE9IG51bGwgJiYgcGxvdC5zZXJpZXNbbmVpZ2hib3Iuc2VyaWVzSW5kZXhdLnNob3dIaWdobGlnaHQgJiYgIWhsLmlzSGlnaGxpZ2h0aW5nKSB7CiAgICAgICAgICAgICAgICBobC5pc0hpZ2hsaWdodGluZyA9IHRydWU7CiAgICAgICAgICAgICAgICBobC5jdXJyZW50TmVpZ2hib3IgPSBuZWlnaGJvcjsKICAgICAgICAgICAgICAgIGlmIChobC5zaG93TWFya2VyKSB7CiAgICAgICAgICAgICAgICAgICAgZHJhdyhwbG90LCBuZWlnaGJvcik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoaGwuc2hvd1Rvb2x0aXAgJiYgKCFjIHx8ICFjLl96b29tLnN0YXJ0ZWQpKSB7CiAgICAgICAgICAgICAgICAgICAgc2hvd1Rvb2x0aXAocGxvdCwgcGxvdC5zZXJpZXNbbmVpZ2hib3Iuc2VyaWVzSW5kZXhdLCBuZWlnaGJvcik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoaGwuYnJpbmdTZXJpZXNUb0Zyb250KSB7CiAgICAgICAgICAgICAgICAgICAgcGxvdC5tb3ZlU2VyaWVzVG9Gcm9udChuZWlnaGJvci5zZXJpZXNJbmRleCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gY2hlY2sgdG8gc2VlIGlmIHdlJ3JlIGhpZ2hsaWdodGluZyB0aGUgd3JvbmcgcG9pbnQuCiAgICAgICAgICAgIGVsc2UgaWYgKG5laWdoYm9yICE9IG51bGwgJiYgaGwuaXNIaWdobGlnaHRpbmcgJiYgaGwuY3VycmVudE5laWdoYm9yICE9IG5laWdoYm9yKSB7CiAgICAgICAgICAgICAgICAvLyBoaWdobGlnaHRpbmcgdGhlIHdyb25nIHBvaW50LgoKICAgICAgICAgICAgICAgIC8vIGlmIG5ldyBzZXJpZXMgYWxsb3dzIGhpZ2hsaWdodGluZywgaGlnaGxpZ2h0IG5ldyBwb2ludC4KICAgICAgICAgICAgICAgIGlmIChwbG90LnNlcmllc1tuZWlnaGJvci5zZXJpZXNJbmRleF0uc2hvd0hpZ2hsaWdodCkgewogICAgICAgICAgICAgICAgICAgIHZhciBjdHggPSBobC5oaWdobGlnaHRDYW52YXMuX2N0eDsKICAgICAgICAgICAgICAgICAgICBjdHguY2xlYXJSZWN0KDAsIDAsIGN0eC5jYW52YXMud2lkdGgsIGN0eC5jYW52YXMuaGVpZ2h0KTsKICAgICAgICAgICAgICAgICAgICBobC5pc0hpZ2hsaWdodGluZyA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgaGwuY3VycmVudE5laWdoYm9yID0gbmVpZ2hib3I7CiAgICAgICAgICAgICAgICAgICAgaWYgKGhsLnNob3dNYXJrZXIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZHJhdyhwbG90LCBuZWlnaGJvcik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChobC5zaG93VG9vbHRpcCAmJiAoIWMgfHwgIWMuX3pvb20uc3RhcnRlZCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2hvd1Rvb2x0aXAocGxvdCwgcGxvdC5zZXJpZXNbbmVpZ2hib3Iuc2VyaWVzSW5kZXhdLCBuZWlnaGJvcik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChobC5icmluZ1Nlcmllc1RvRnJvbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcGxvdC5tb3ZlU2VyaWVzVG9Gcm9udChuZWlnaGJvci5zZXJpZXNJbmRleCk7CiAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgIAogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9KShqUXVlcnkpOw==]]></data>
	</file>
	<file>
	  <filename>/src/plugins/jqplot.highlighter.min.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqCiAqIGpxUGxvdAogKiBQdXJlIEphdmFTY3JpcHQgcGxvdHRpbmcgcGx1Z2luIHVzaW5nIGpRdWVyeQogKgogKiBWZXJzaW9uOiAxLjAuMGIyX3IxMDEyCiAqCiAqIENvcHlyaWdodCAoYykgMjAwOS0yMDExIENocmlzIExlb25lbGxvCiAqIGpxUGxvdCBpcyBjdXJyZW50bHkgYXZhaWxhYmxlIGZvciB1c2UgaW4gYWxsIHBlcnNvbmFsIG9yIGNvbW1lcmNpYWwgcHJvamVjdHMgCiAqIHVuZGVyIGJvdGggdGhlIE1JVCAoaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHApIGFuZCBHUEwgCiAqIHZlcnNpb24gMi4wIChodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC5odG1sKSBsaWNlbnNlcy4gVGhpcyBtZWFucyB0aGF0IHlvdSBjYW4gCiAqIGNob29zZSB0aGUgbGljZW5zZSB0aGF0IGJlc3Qgc3VpdHMgeW91ciBwcm9qZWN0IGFuZCB1c2UgaXQgYWNjb3JkaW5nbHkuIAogKgogKiBBbHRob3VnaCBub3QgcmVxdWlyZWQsIHRoZSBhdXRob3Igd291bGQgYXBwcmVjaWF0ZSBhbiBlbWFpbCBsZXR0aW5nIGhpbSAKICoga25vdyBvZiBhbnkgc3Vic3RhbnRpYWwgdXNlIG9mIGpxUGxvdC4gIFlvdSBjYW4gcmVhY2ggdGhlIGF1dGhvciBhdDogCiAqIGNocmlzIGF0IGpxcGxvdCBkb3QgY29tIG9yIHNlZSBodHRwOi8vd3d3LmpxcGxvdC5jb20vaW5mby5waHAgLgogKgogKiBJZiB5b3UgYXJlIGZlZWxpbmcga2luZCBhbmQgZ2VuZXJvdXMsIGNvbnNpZGVyIHN1cHBvcnRpbmcgdGhlIHByb2plY3QgYnkKICogbWFraW5nIGEgZG9uYXRpb24gYXQ6IGh0dHA6Ly93d3cuanFwbG90LmNvbS9kb25hdGUucGhwIC4KICoKICogc3ByaW50ZiBmdW5jdGlvbnMgY29udGFpbmVkIGluIGpxcGxvdC5zcHJpbnRmLmpzIGJ5IEFzaCBTZWFybGU6CiAqCiAqICAgICB2ZXJzaW9uIDIwMDcuMDQuMjcKICogICAgIGF1dGhvciBBc2ggU2VhcmxlCiAqICAgICBodHRwOi8vaGV4bWVuLmNvbS9ibG9nLzIwMDcvMDMvcHJpbnRmLXNwcmludGYvCiAqICAgICBodHRwOi8vaGV4bWVuLmNvbS9qcy9zcHJpbnRmLmpzCiAqICAgICBUaGUgYXV0aG9yIChBc2ggU2VhcmxlKSBoYXMgcGxhY2VkIHRoaXMgY29kZSBpbiB0aGUgcHVibGljIGRvbWFpbjoKICogICAgICJUaGlzIGNvZGUgaXMgdW5yZXN0cmljdGVkOiB5b3UgYXJlIGZyZWUgdG8gdXNlIGl0IGhvd2V2ZXIgeW91IGxpa2UuIgogKgogKiBpbmNsdWRlZCBqc0RhdGUgbGlicmFyeSBieSBDaHJpcyBMZW9uZWxsbzoKICoKICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEgQ2hyaXMgTGVvbmVsbG8KICoKICoganNEYXRlIGlzIGN1cnJlbnRseSBhdmFpbGFibGUgZm9yIHVzZSBpbiBhbGwgcGVyc29uYWwgb3IgY29tbWVyY2lhbCBwcm9qZWN0cyAKICogdW5kZXIgYm90aCB0aGUgTUlUIGFuZCBHUEwgdmVyc2lvbiAyLjAgbGljZW5zZXMuIFRoaXMgbWVhbnMgdGhhdCB5b3UgY2FuIAogKiBjaG9vc2UgdGhlIGxpY2Vuc2UgdGhhdCBiZXN0IHN1aXRzIHlvdXIgcHJvamVjdCBhbmQgdXNlIGl0IGFjY29yZGluZ2x5LgogKgogKiBqc0RhdGUgYm9ycm93cyBtYW55IGNvbmNlcHRzIGFuZCBpZGVhcyBmcm9tIHRoZSBEYXRlIEluc3RhbmNlIAogKiBNZXRob2RzIGJ5IEtlbiBTbnlkZXIgYWxvbmcgd2l0aCBzb21lIHBhcnRzIG9mIEtlbidzIGFjdHVhbCBjb2RlLgogKiAKICogS2VuJ3Mgb3JpZ2lhbmwgRGF0ZSBJbnN0YW5jZSBNZXRob2RzIGFuZCBjb3B5cmlnaHQgbm90aWNlOgogKiAKICogS2VuIFNueWRlciAoa2VuIGQgc255ZGVyIGF0IGdtYWlsIGRvdCBjb20pCiAqIDIwMDgtMDktMTAKICogdmVyc2lvbiAyLjAuMiAoaHR0cDovL2tlbmRzbnlkZXIuY29tL3NhbmRib3gvZGF0ZS8pICAgICAKICogQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbiBMaWNlbnNlIDMuMCAoaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnkvMy4wLykKICoKICoganFwbG90VG9JbWFnZSBmdW5jdGlvbiBiYXNlZCBvbiBMYXJyeSBTaWRlbidzIGV4cG9ydC1qcXBsb3QtdG8tcG5nLmpzLgogKiBMYXJyeSBoYXMgZ2VuZXJvdXNseSBnaXZlbiBwZXJtaXNzaW9uIHRvIGFkYXB0IGhpcyBjb2RlIGZvciBpbmNsdXNpb24KICogaW50byBqcVBsb3QuCiAqCiAqIExhcnJ5J3Mgb3JpZ2luYWwgY29kZSBjYW4gYmUgZm91bmQgaGVyZToKICoKICogaHR0cHM6Ly9naXRodWIuY29tL2xzaWRlbi9leHBvcnQtanFwbG90LXRvLXBuZwogKiAKICogCiAqLwooZnVuY3Rpb24oZCl7ZC5qcXBsb3QuZXZlbnRMaXN0ZW5lckhvb2tzLnB1c2goWyJqcXBsb3RNb3VzZU1vdmUiLGZdKTtkLmpxcGxvdC5IaWdobGlnaHRlcj1mdW5jdGlvbihoKXt0aGlzLnNob3c9ZC5qcXBsb3QuY29uZmlnLmVuYWJsZVBsdWdpbnM7dGhpcy5tYXJrZXJSZW5kZXJlcj1uZXcgZC5qcXBsb3QuTWFya2VyUmVuZGVyZXIoe3NoYWRvdzpmYWxzZX0pO3RoaXMuc2hvd01hcmtlcj10cnVlO3RoaXMubGluZVdpZHRoQWRqdXN0PTIuNTt0aGlzLnNpemVBZGp1c3Q9NTt0aGlzLnNob3dUb29sdGlwPXRydWU7dGhpcy50b29sdGlwTG9jYXRpb249Im53Ijt0aGlzLmZhZGVUb29sdGlwPXRydWU7dGhpcy50b29sdGlwRmFkZVNwZWVkPSJmYXN0Ijt0aGlzLnRvb2x0aXBPZmZzZXQ9Mjt0aGlzLnRvb2x0aXBBeGVzPSJib3RoIjt0aGlzLnRvb2x0aXBTZXBhcmF0b3I9IiwgIjt0aGlzLnRvb2x0aXBDb250ZW50RWRpdG9yPW51bGw7dGhpcy51c2VBeGVzRm9ybWF0dGVycz10cnVlO3RoaXMudG9vbHRpcEZvcm1hdFN0cmluZz0iJS41UCI7dGhpcy5mb3JtYXRTdHJpbmc9bnVsbDt0aGlzLnl2YWx1ZXM9MTt0aGlzLmJyaW5nU2VyaWVzVG9Gcm9udD1mYWxzZTt0aGlzLl90b29sdGlwRWxlbTt0aGlzLmlzSGlnaGxpZ2h0aW5nPWZhbHNlO3RoaXMuY3VycmVudE5laWdoYm9yPW51bGw7ZC5leHRlbmQodHJ1ZSx0aGlzLGgpfTt2YXIgYj1bIm53IiwibiIsIm5lIiwiZSIsInNlIiwicyIsInN3IiwidyJdO3ZhciBlPXtudzowLG46MSxuZToyLGU6MyxzZTo0LHM6NSxzdzo2LHc6N307dmFyIGM9WyJzZSIsInMiLCJzdyIsInciLCJudyIsIm4iLCJuZSIsImUiXTtkLmpxcGxvdC5IaWdobGlnaHRlci5pbml0PWZ1bmN0aW9uKGssaixpKXt2YXIgaD1pfHx7fTt0aGlzLnBsdWdpbnMuaGlnaGxpZ2h0ZXI9bmV3IGQuanFwbG90LkhpZ2hsaWdodGVyKGguaGlnaGxpZ2h0ZXIpfTtkLmpxcGxvdC5IaWdobGlnaHRlci5wYXJzZU9wdGlvbnM9ZnVuY3Rpb24oaSxoKXt0aGlzLnNob3dIaWdobGlnaHQ9dHJ1ZX07ZC5qcXBsb3QuSGlnaGxpZ2h0ZXIucG9zdFBsb3REcmF3PWZ1bmN0aW9uKCl7aWYodGhpcy5wbHVnaW5zLmhpZ2hsaWdodGVyJiZ0aGlzLnBsdWdpbnMuaGlnaGxpZ2h0ZXIuaGlnaGxpZ2h0Q2FudmFzKXt0aGlzLnBsdWdpbnMuaGlnaGxpZ2h0ZXIuaGlnaGxpZ2h0Q2FudmFzLnJlc2V0Q2FudmFzKCk7dGhpcy5wbHVnaW5zLmhpZ2hsaWdodGVyLmhpZ2hsaWdodENhbnZhcz1udWxsfWlmKHRoaXMucGx1Z2lucy5oaWdobGlnaHRlciYmdGhpcy5wbHVnaW5zLmhpZ2hsaWdodGVyLl90b29sdGlwRWxlbSl7dGhpcy5wbHVnaW5zLmhpZ2hsaWdodGVyLl90b29sdGlwRWxlbS5lbXB0eUZvcmNlKCk7dGhpcy5wbHVnaW5zLmhpZ2hsaWdodGVyLl90b29sdGlwRWxlbT1udWxsfXRoaXMucGx1Z2lucy5oaWdobGlnaHRlci5oaWdobGlnaHRDYW52YXM9bmV3IGQuanFwbG90LkdlbmVyaWNDYW52YXMoKTt0aGlzLmV2ZW50Q2FudmFzLl9lbGVtLmJlZm9yZSh0aGlzLnBsdWdpbnMuaGlnaGxpZ2h0ZXIuaGlnaGxpZ2h0Q2FudmFzLmNyZWF0ZUVsZW1lbnQodGhpcy5fZ3JpZFBhZGRpbmcsImpxcGxvdC1oaWdobGlnaHQtY2FudmFzIix0aGlzLl9wbG90RGltZW5zaW9ucyx0aGlzKSk7dGhpcy5wbHVnaW5zLmhpZ2hsaWdodGVyLmhpZ2hsaWdodENhbnZhcy5zZXRDb250ZXh0KCk7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5wbHVnaW5zLmhpZ2hsaWdodGVyLl90b29sdGlwRWxlbT1kKGgpO2g9bnVsbDt0aGlzLnBsdWdpbnMuaGlnaGxpZ2h0ZXIuX3Rvb2x0aXBFbGVtLmFkZENsYXNzKCJqcXBsb3QtaGlnaGxpZ2h0ZXItdG9vbHRpcCIpO3RoaXMucGx1Z2lucy5oaWdobGlnaHRlci5fdG9vbHRpcEVsZW0uY3NzKHtwb3NpdGlvbjoiYWJzb2x1dGUiLGRpc3BsYXk6Im5vbmUifSk7dGhpcy5ldmVudENhbnZhcy5fZWxlbS5iZWZvcmUodGhpcy5wbHVnaW5zLmhpZ2hsaWdodGVyLl90b29sdGlwRWxlbSl9O2QuanFwbG90LnByZUluaXRIb29rcy5wdXNoKGQuanFwbG90LkhpZ2hsaWdodGVyLmluaXQpO2QuanFwbG90LnByZVBhcnNlU2VyaWVzT3B0aW9uc0hvb2tzLnB1c2goZC5qcXBsb3QuSGlnaGxpZ2h0ZXIucGFyc2VPcHRpb25zKTtkLmpxcGxvdC5wb3N0RHJhd0hvb2tzLnB1c2goZC5qcXBsb3QuSGlnaGxpZ2h0ZXIucG9zdFBsb3REcmF3KTtmdW5jdGlvbiBhKG0sbyl7dmFyIGo9bS5wbHVnaW5zLmhpZ2hsaWdodGVyO3ZhciBwPW0uc2VyaWVzW28uc2VyaWVzSW5kZXhdO3ZhciBoPXAubWFya2VyUmVuZGVyZXI7dmFyIGk9ai5tYXJrZXJSZW5kZXJlcjtpLnN0eWxlPWguc3R5bGU7aS5saW5lV2lkdGg9aC5saW5lV2lkdGgrai5saW5lV2lkdGhBZGp1c3Q7aS5zaXplPWguc2l6ZStqLnNpemVBZGp1c3Q7dmFyIGw9ZC5qcXBsb3QuZ2V0Q29sb3JDb21wb25lbnRzKGguY29sb3IpO3ZhciBuPVtsWzBdLGxbMV0sbFsyXV07dmFyIGs9KGxbM10+PTAuNik/bFszXSowLjY6bFszXSooMi1sWzNdKTtpLmNvbG9yPSJyZ2JhKCIrblswXSsiLCIrblsxXSsiLCIrblsyXSsiLCIraysiKSI7aS5pbml0KCk7aS5kcmF3KHAuZ3JpZERhdGFbby5wb2ludEluZGV4XVswXSxwLmdyaWREYXRhW28ucG9pbnRJbmRleF1bMV0sai5oaWdobGlnaHRDYW52YXMuX2N0eCl9ZnVuY3Rpb24gZyhBLHEsbSl7dmFyIGs9QS5wbHVnaW5zLmhpZ2hsaWdodGVyO3ZhciBEPWsuX3Rvb2x0aXBFbGVtO3ZhciByPXEuaGlnaGxpZ2h0ZXJ8fHt9O3ZhciB0PWQuZXh0ZW5kKHRydWUse30sayxyKTtpZih0LnVzZUF4ZXNGb3JtYXR0ZXJzKXt2YXIgdz1xLl94YXhpcy5fdGlja3NbMF0uZm9ybWF0dGVyO3ZhciBoPXEuX3lheGlzLl90aWNrc1swXS5mb3JtYXR0ZXI7dmFyIEU9cS5feGF4aXMuX3RpY2tzWzBdLmZvcm1hdFN0cmluZzt2YXIgcz1xLl95YXhpcy5fdGlja3NbMF0uZm9ybWF0U3RyaW5nO3ZhciB6O3ZhciB1PXcoRSxtLmRhdGFbMF0pO3ZhciBsPVtdO2Zvcih2YXIgQj0xO0I8dC55dmFsdWVzKzE7QisrKXtsLnB1c2goaChzLG0uZGF0YVtCXSkpfWlmKHR5cGVvZiB0LmZvcm1hdFN0cmluZz09PSJzdHJpbmciKXtzd2l0Y2godC50b29sdGlwQXhlcyl7Y2FzZSJib3RoIjpjYXNlInh5IjpsLnVuc2hpZnQodSk7bC51bnNoaWZ0KHQuZm9ybWF0U3RyaW5nKTt6PWQuanFwbG90LnNwcmludGYuYXBwbHkoZC5qcXBsb3Quc3ByaW50ZixsKTticmVhaztjYXNlInl4IjpsLnB1c2godSk7bC51bnNoaWZ0KHQuZm9ybWF0U3RyaW5nKTt6PWQuanFwbG90LnNwcmludGYuYXBwbHkoZC5qcXBsb3Quc3ByaW50ZixsKTticmVhaztjYXNlIngiOno9ZC5qcXBsb3Quc3ByaW50Zi5hcHBseShkLmpxcGxvdC5zcHJpbnRmLFt0LmZvcm1hdFN0cmluZyx1XSk7YnJlYWs7Y2FzZSJ5IjpsLnVuc2hpZnQodC5mb3JtYXRTdHJpbmcpO3o9ZC5qcXBsb3Quc3ByaW50Zi5hcHBseShkLmpxcGxvdC5zcHJpbnRmLGwpO2JyZWFrO2RlZmF1bHQ6bC51bnNoaWZ0KHUpO2wudW5zaGlmdCh0LmZvcm1hdFN0cmluZyk7ej1kLmpxcGxvdC5zcHJpbnRmLmFwcGx5KGQuanFwbG90LnNwcmludGYsbCk7YnJlYWt9fWVsc2V7c3dpdGNoKHQudG9vbHRpcEF4ZXMpe2Nhc2UiYm90aCI6Y2FzZSJ4eSI6ej11O2Zvcih2YXIgQj0wO0I8bC5sZW5ndGg7QisrKXt6Kz10LnRvb2x0aXBTZXBhcmF0b3IrbFtCXX1icmVhaztjYXNlInl4Ijp6PSIiO2Zvcih2YXIgQj0wO0I8bC5sZW5ndGg7QisrKXt6Kz1sW0JdK3QudG9vbHRpcFNlcGFyYXRvcn16Kz11O2JyZWFrO2Nhc2UieCI6ej11O2JyZWFrO2Nhc2UieSI6ej1sLmpvaW4odC50b29sdGlwU2VwYXJhdG9yKTticmVhaztkZWZhdWx0Ono9dTtmb3IodmFyIEI9MDtCPGwubGVuZ3RoO0IrKyl7eis9dC50b29sdGlwU2VwYXJhdG9yK2xbQl19YnJlYWt9fX1lbHNle3ZhciB6O2lmKHR5cGVvZiB0LmZvcm1hdFN0cmluZz09PSJzdHJpbmciKXt6PWQuanFwbG90LnNwcmludGYuYXBwbHkoZC5qcXBsb3Quc3ByaW50ZixbdC5mb3JtYXRTdHJpbmddLmNvbmNhdChtLmRhdGEpKX1lbHNle2lmKHQudG9vbHRpcEF4ZXM9PSJib3RoInx8dC50b29sdGlwQXhlcz09Inh5Iil7ej1kLmpxcGxvdC5zcHJpbnRmKHQudG9vbHRpcEZvcm1hdFN0cmluZyxtLmRhdGFbMF0pK3QudG9vbHRpcFNlcGFyYXRvcitkLmpxcGxvdC5zcHJpbnRmKHQudG9vbHRpcEZvcm1hdFN0cmluZyxtLmRhdGFbMV0pfWVsc2V7aWYodC50b29sdGlwQXhlcz09Inl4Iil7ej1kLmpxcGxvdC5zcHJpbnRmKHQudG9vbHRpcEZvcm1hdFN0cmluZyxtLmRhdGFbMV0pK3QudG9vbHRpcFNlcGFyYXRvcitkLmpxcGxvdC5zcHJpbnRmKHQudG9vbHRpcEZvcm1hdFN0cmluZyxtLmRhdGFbMF0pfWVsc2V7aWYodC50b29sdGlwQXhlcz09IngiKXt6PWQuanFwbG90LnNwcmludGYodC50b29sdGlwRm9ybWF0U3RyaW5nLG0uZGF0YVswXSl9ZWxzZXtpZih0LnRvb2x0aXBBeGVzPT0ieSIpe3o9ZC5qcXBsb3Quc3ByaW50Zih0LnRvb2x0aXBGb3JtYXRTdHJpbmcsbS5kYXRhWzFdKX19fX19fWlmKGQuaXNGdW5jdGlvbih0LnRvb2x0aXBDb250ZW50RWRpdG9yKSl7ej10LnRvb2x0aXBDb250ZW50RWRpdG9yKHosbS5zZXJpZXNJbmRleCxtLnBvaW50SW5kZXgsQSl9RC5odG1sKHopO3ZhciBDPXt4Om0uZ3JpZERhdGFbMF0seTptLmdyaWREYXRhWzFdfTt2YXIgdj0wO3ZhciBqPTAuNzA3O2lmKHEubWFya2VyUmVuZGVyZXIuc2hvdz09dHJ1ZSl7dj0ocS5tYXJrZXJSZW5kZXJlci5zaXplK3Quc2l6ZUFkanVzdCkvMn12YXIgbz1iO2lmKHEuZmlsbFRvWmVybyYmcS5maWxsJiZtLmRhdGFbMV08MCl7bz1jfXN3aXRjaChvW2VbdC50b29sdGlwTG9jYXRpb25dXSl7Y2FzZSJudyI6dmFyIHA9Qy54K0EuX2dyaWRQYWRkaW5nLmxlZnQtRC5vdXRlcldpZHRoKHRydWUpLXQudG9vbHRpcE9mZnNldC1qKnY7dmFyIG49Qy55K0EuX2dyaWRQYWRkaW5nLnRvcC10LnRvb2x0aXBPZmZzZXQtRC5vdXRlckhlaWdodCh0cnVlKS1qKnY7YnJlYWs7Y2FzZSJuIjp2YXIgcD1DLngrQS5fZ3JpZFBhZGRpbmcubGVmdC1ELm91dGVyV2lkdGgodHJ1ZSkvMjt2YXIgbj1DLnkrQS5fZ3JpZFBhZGRpbmcudG9wLXQudG9vbHRpcE9mZnNldC1ELm91dGVySGVpZ2h0KHRydWUpLXY7YnJlYWs7Y2FzZSJuZSI6dmFyIHA9Qy54K0EuX2dyaWRQYWRkaW5nLmxlZnQrdC50b29sdGlwT2Zmc2V0K2oqdjt2YXIgbj1DLnkrQS5fZ3JpZFBhZGRpbmcudG9wLXQudG9vbHRpcE9mZnNldC1ELm91dGVySGVpZ2h0KHRydWUpLWoqdjticmVhaztjYXNlImUiOnZhciBwPUMueCtBLl9ncmlkUGFkZGluZy5sZWZ0K3QudG9vbHRpcE9mZnNldCt2O3ZhciBuPUMueStBLl9ncmlkUGFkZGluZy50b3AtRC5vdXRlckhlaWdodCh0cnVlKS8yO2JyZWFrO2Nhc2Uic2UiOnZhciBwPUMueCtBLl9ncmlkUGFkZGluZy5sZWZ0K3QudG9vbHRpcE9mZnNldCtqKnY7dmFyIG49Qy55K0EuX2dyaWRQYWRkaW5nLnRvcCt0LnRvb2x0aXBPZmZzZXQraip2O2JyZWFrO2Nhc2UicyI6dmFyIHA9Qy54K0EuX2dyaWRQYWRkaW5nLmxlZnQtRC5vdXRlcldpZHRoKHRydWUpLzI7dmFyIG49Qy55K0EuX2dyaWRQYWRkaW5nLnRvcCt0LnRvb2x0aXBPZmZzZXQrdjticmVhaztjYXNlInN3Ijp2YXIgcD1DLngrQS5fZ3JpZFBhZGRpbmcubGVmdC1ELm91dGVyV2lkdGgodHJ1ZSktdC50b29sdGlwT2Zmc2V0LWoqdjt2YXIgbj1DLnkrQS5fZ3JpZFBhZGRpbmcudG9wK3QudG9vbHRpcE9mZnNldCtqKnY7YnJlYWs7Y2FzZSJ3Ijp2YXIgcD1DLngrQS5fZ3JpZFBhZGRpbmcubGVmdC1ELm91dGVyV2lkdGgodHJ1ZSktdC50b29sdGlwT2Zmc2V0LXY7dmFyIG49Qy55K0EuX2dyaWRQYWRkaW5nLnRvcC1ELm91dGVySGVpZ2h0KHRydWUpLzI7YnJlYWs7ZGVmYXVsdDp2YXIgcD1DLngrQS5fZ3JpZFBhZGRpbmcubGVmdC1ELm91dGVyV2lkdGgodHJ1ZSktdC50b29sdGlwT2Zmc2V0LWoqdjt2YXIgbj1DLnkrQS5fZ3JpZFBhZGRpbmcudG9wLXQudG9vbHRpcE9mZnNldC1ELm91dGVySGVpZ2h0KHRydWUpLWoqdjticmVha31ELmNzcygibGVmdCIscCk7RC5jc3MoInRvcCIsbik7aWYodC5mYWRlVG9vbHRpcCl7RC5zdG9wKHRydWUsdHJ1ZSkuZmFkZUluKHQudG9vbHRpcEZhZGVTcGVlZCl9ZWxzZXtELnNob3coKX1EPW51bGx9ZnVuY3Rpb24gZihrLGosbixtLGwpe3ZhciBoPWwucGx1Z2lucy5oaWdobGlnaHRlcjt2YXIgbz1sLnBsdWdpbnMuY3Vyc29yO2lmKGguc2hvdyl7aWYobT09bnVsbCYmaC5pc0hpZ2hsaWdodGluZyl7dmFyIGk9aC5oaWdobGlnaHRDYW52YXMuX2N0eDtpLmNsZWFyUmVjdCgwLDAsaS5jYW52YXMud2lkdGgsaS5jYW52YXMuaGVpZ2h0KTtpZihoLmZhZGVUb29sdGlwKXtoLl90b29sdGlwRWxlbS5mYWRlT3V0KGgudG9vbHRpcEZhZGVTcGVlZCl9ZWxzZXtoLl90b29sdGlwRWxlbS5oaWRlKCl9aWYoaC5icmluZ1Nlcmllc1RvRnJvbnQpe2wucmVzdG9yZVByZXZpb3VzU2VyaWVzT3JkZXIoKX1oLmlzSGlnaGxpZ2h0aW5nPWZhbHNlO2guY3VycmVudE5laWdoYm9yPW51bGw7aT1udWxsfWVsc2V7aWYobSE9bnVsbCYmbC5zZXJpZXNbbS5zZXJpZXNJbmRleF0uc2hvd0hpZ2hsaWdodCYmIWguaXNIaWdobGlnaHRpbmcpe2guaXNIaWdobGlnaHRpbmc9dHJ1ZTtoLmN1cnJlbnROZWlnaGJvcj1tO2lmKGguc2hvd01hcmtlcil7YShsLG0pfWlmKGguc2hvd1Rvb2x0aXAmJighb3x8IW8uX3pvb20uc3RhcnRlZCkpe2cobCxsLnNlcmllc1ttLnNlcmllc0luZGV4XSxtKX1pZihoLmJyaW5nU2VyaWVzVG9Gcm9udCl7bC5tb3ZlU2VyaWVzVG9Gcm9udChtLnNlcmllc0luZGV4KX19ZWxzZXtpZihtIT1udWxsJiZoLmlzSGlnaGxpZ2h0aW5nJiZoLmN1cnJlbnROZWlnaGJvciE9bSl7aWYobC5zZXJpZXNbbS5zZXJpZXNJbmRleF0uc2hvd0hpZ2hsaWdodCl7dmFyIGk9aC5oaWdobGlnaHRDYW52YXMuX2N0eDtpLmNsZWFyUmVjdCgwLDAsaS5jYW52YXMud2lkdGgsaS5jYW52YXMuaGVpZ2h0KTtoLmlzSGlnaGxpZ2h0aW5nPXRydWU7aC5jdXJyZW50TmVpZ2hib3I9bTtpZihoLnNob3dNYXJrZXIpe2EobCxtKX1pZihoLnNob3dUb29sdGlwJiYoIW98fCFvLl96b29tLnN0YXJ0ZWQpKXtnKGwsbC5zZXJpZXNbbS5zZXJpZXNJbmRleF0sbSl9aWYoaC5icmluZ1Nlcmllc1RvRnJvbnQpe2wubW92ZVNlcmllc1RvRnJvbnQobS5zZXJpZXNJbmRleCl9fX19fX19fSkoalF1ZXJ5KTs=]]></data>
	</file>
	<file>
	  <filename>/src/plugins/jqplot.json2.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKICAgIDIwMTAtMTEtMDEgQ2hyaXMgTGVvbmVsbG8KICAgIAogICAgU2xpZ2h0bHkgbW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgb3JpZ2luYWwganNvbjIuanMgdG8gcHV0IEpTT04KICAgIGZ1bmN0aW9ucyB1bmRlciB0aGUgJC5qcXBsb3QgbmFtZXNwYWNlLgogICAgCiAgICBsaWNlbnNpbmcgYW5kIG9yaWduYWwgY29tbWVudHMgZm9sbG93OgogICAgCiAgICBodHRwOi8vd3d3LkpTT04ub3JnL2pzb24yLmpzCiAgICAyMDEwLTA4LTI1CiAgICAKICAgIFB1YmxpYyBEb21haW4uCgogICAgTk8gV0FSUkFOVFkgRVhQUkVTU0VEIE9SIElNUExJRUQuIFVTRSBBVCBZT1VSIE9XTiBSSVNLLgoKICAgIFNlZSBodHRwOi8vd3d3LkpTT04ub3JnL2pzLmh0bWwKCgogICAgVGhpcyBjb2RlIHNob3VsZCBiZSBtaW5pZmllZCBiZWZvcmUgZGVwbG95bWVudC4KICAgIFNlZSBodHRwOi8vamF2YXNjcmlwdC5jcm9ja2ZvcmQuY29tL2pzbWluLmh0bWwKCiAgICBVU0UgWU9VUiBPV04gQ09QWS4gSVQgSVMgRVhUUkVNRUxZIFVOV0lTRSBUTyBMT0FEIENPREUgRlJPTSBTRVJWRVJTIFlPVSBETwogICAgTk9UIENPTlRST0wuCgoKICAgIFRoaXMgZmlsZSBjcmVhdGVzIGEgZ2xvYmFsIEpTT04gb2JqZWN0IGNvbnRhaW5pbmcgdHdvIG1ldGhvZHM6IHN0cmluZ2lmeQogICAgYW5kIHBhcnNlLgoKICAgICAgICAkLmpxcGxvdC5KU09OLnN0cmluZ2lmeSh2YWx1ZSwgcmVwbGFjZXIsIHNwYWNlKQogICAgICAgICAgICB2YWx1ZSAgICAgICBhbnkgSmF2YVNjcmlwdCB2YWx1ZSwgdXN1YWxseSBhbiBvYmplY3Qgb3IgYXJyYXkuCgogICAgICAgICAgICByZXBsYWNlciAgICBhbiBvcHRpb25hbCBwYXJhbWV0ZXIgdGhhdCBkZXRlcm1pbmVzIGhvdyBvYmplY3QKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzIGFyZSBzdHJpbmdpZmllZCBmb3Igb2JqZWN0cy4gSXQgY2FuIGJlIGEKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gb3IgYW4gYXJyYXkgb2Ygc3RyaW5ncy4KCiAgICAgICAgICAgIHNwYWNlICAgICAgIGFuIG9wdGlvbmFsIHBhcmFtZXRlciB0aGF0IHNwZWNpZmllcyB0aGUgaW5kZW50YXRpb24KICAgICAgICAgICAgICAgICAgICAgICAgb2YgbmVzdGVkIHN0cnVjdHVyZXMuIElmIGl0IGlzIG9taXR0ZWQsIHRoZSB0ZXh0IHdpbGwKICAgICAgICAgICAgICAgICAgICAgICAgYmUgcGFja2VkIHdpdGhvdXQgZXh0cmEgd2hpdGVzcGFjZS4gSWYgaXQgaXMgYSBudW1iZXIsCiAgICAgICAgICAgICAgICAgICAgICAgIGl0IHdpbGwgc3BlY2lmeSB0aGUgbnVtYmVyIG9mIHNwYWNlcyB0byBpbmRlbnQgYXQgZWFjaAogICAgICAgICAgICAgICAgICAgICAgICBsZXZlbC4gSWYgaXQgaXMgYSBzdHJpbmcgKHN1Y2ggYXMgJ1x0JyBvciAnJm5ic3A7JyksCiAgICAgICAgICAgICAgICAgICAgICAgIGl0IGNvbnRhaW5zIHRoZSBjaGFyYWN0ZXJzIHVzZWQgdG8gaW5kZW50IGF0IGVhY2ggbGV2ZWwuCgogICAgICAgICAgICBUaGlzIG1ldGhvZCBwcm9kdWNlcyBhIEpTT04gdGV4dCBmcm9tIGEgSmF2YVNjcmlwdCB2YWx1ZS4KCiAgICAgICAgICAgIFdoZW4gYW4gb2JqZWN0IHZhbHVlIGlzIGZvdW5kLCBpZiB0aGUgb2JqZWN0IGNvbnRhaW5zIGEgdG9KU09OCiAgICAgICAgICAgIG1ldGhvZCwgaXRzIHRvSlNPTiBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgYW5kIHRoZSByZXN1bHQgd2lsbCBiZQogICAgICAgICAgICBzdHJpbmdpZmllZC4gQSB0b0pTT04gbWV0aG9kIGRvZXMgbm90IHNlcmlhbGl6ZTogaXQgcmV0dXJucyB0aGUKICAgICAgICAgICAgdmFsdWUgcmVwcmVzZW50ZWQgYnkgdGhlIG5hbWUvdmFsdWUgcGFpciB0aGF0IHNob3VsZCBiZSBzZXJpYWxpemVkLAogICAgICAgICAgICBvciB1bmRlZmluZWQgaWYgbm90aGluZyBzaG91bGQgYmUgc2VyaWFsaXplZC4gVGhlIHRvSlNPTiBtZXRob2QKICAgICAgICAgICAgd2lsbCBiZSBwYXNzZWQgdGhlIGtleSBhc3NvY2lhdGVkIHdpdGggdGhlIHZhbHVlLCBhbmQgdGhpcyB3aWxsIGJlCiAgICAgICAgICAgIGJvdW5kIHRvIHRoZSB2YWx1ZQoKICAgICAgICAgICAgRm9yIGV4YW1wbGUsIHRoaXMgd291bGQgc2VyaWFsaXplIERhdGVzIGFzIElTTyBzdHJpbmdzLgoKICAgICAgICAgICAgICAgIERhdGUucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uIChrZXkpIHsKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBmKG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gRm9ybWF0IGludGVnZXJzIHRvIGhhdmUgYXQgbGVhc3QgdHdvIGRpZ2l0cy4KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4gPCAxMCA/ICcwJyArIG4gOiBuOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VVRDRnVsbFllYXIoKSAgICsgJy0nICsKICAgICAgICAgICAgICAgICAgICAgICAgIGYodGhpcy5nZXRVVENNb250aCgpICsgMSkgKyAnLScgKwogICAgICAgICAgICAgICAgICAgICAgICAgZih0aGlzLmdldFVUQ0RhdGUoKSkgICAgICArICdUJyArCiAgICAgICAgICAgICAgICAgICAgICAgICBmKHRoaXMuZ2V0VVRDSG91cnMoKSkgICAgICsgJzonICsKICAgICAgICAgICAgICAgICAgICAgICAgIGYodGhpcy5nZXRVVENNaW51dGVzKCkpICAgKyAnOicgKwogICAgICAgICAgICAgICAgICAgICAgICAgZih0aGlzLmdldFVUQ1NlY29uZHMoKSkgICArICdaJzsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBZb3UgY2FuIHByb3ZpZGUgYW4gb3B0aW9uYWwgcmVwbGFjZXIgbWV0aG9kLiBJdCB3aWxsIGJlIHBhc3NlZCB0aGUKICAgICAgICAgICAga2V5IGFuZCB2YWx1ZSBvZiBlYWNoIG1lbWJlciwgd2l0aCB0aGlzIGJvdW5kIHRvIHRoZSBjb250YWluaW5nCiAgICAgICAgICAgIG9iamVjdC4gVGhlIHZhbHVlIHRoYXQgaXMgcmV0dXJuZWQgZnJvbSB5b3VyIG1ldGhvZCB3aWxsIGJlCiAgICAgICAgICAgIHNlcmlhbGl6ZWQuIElmIHlvdXIgbWV0aG9kIHJldHVybnMgdW5kZWZpbmVkLCB0aGVuIHRoZSBtZW1iZXIgd2lsbAogICAgICAgICAgICBiZSBleGNsdWRlZCBmcm9tIHRoZSBzZXJpYWxpemF0aW9uLgoKICAgICAgICAgICAgSWYgdGhlIHJlcGxhY2VyIHBhcmFtZXRlciBpcyBhbiBhcnJheSBvZiBzdHJpbmdzLCB0aGVuIGl0IHdpbGwgYmUKICAgICAgICAgICAgdXNlZCB0byBzZWxlY3QgdGhlIG1lbWJlcnMgdG8gYmUgc2VyaWFsaXplZC4gSXQgZmlsdGVycyB0aGUgcmVzdWx0cwogICAgICAgICAgICBzdWNoIHRoYXQgb25seSBtZW1iZXJzIHdpdGgga2V5cyBsaXN0ZWQgaW4gdGhlIHJlcGxhY2VyIGFycmF5IGFyZQogICAgICAgICAgICBzdHJpbmdpZmllZC4KCiAgICAgICAgICAgIFZhbHVlcyB0aGF0IGRvIG5vdCBoYXZlIEpTT04gcmVwcmVzZW50YXRpb25zLCBzdWNoIGFzIHVuZGVmaW5lZCBvcgogICAgICAgICAgICBmdW5jdGlvbnMsIHdpbGwgbm90IGJlIHNlcmlhbGl6ZWQuIFN1Y2ggdmFsdWVzIGluIG9iamVjdHMgd2lsbCBiZQogICAgICAgICAgICBkcm9wcGVkOyBpbiBhcnJheXMgdGhleSB3aWxsIGJlIHJlcGxhY2VkIHdpdGggbnVsbC4gWW91IGNhbiB1c2UKICAgICAgICAgICAgYSByZXBsYWNlciBmdW5jdGlvbiB0byByZXBsYWNlIHRob3NlIHdpdGggSlNPTiB2YWx1ZXMuCiAgICAgICAgICAgICQuanFwbG90LkpTT04uc3RyaW5naWZ5KHVuZGVmaW5lZCkgcmV0dXJucyB1bmRlZmluZWQuCgogICAgICAgICAgICBUaGUgb3B0aW9uYWwgc3BhY2UgcGFyYW1ldGVyIHByb2R1Y2VzIGEgc3RyaW5naWZpY2F0aW9uIG9mIHRoZQogICAgICAgICAgICB2YWx1ZSB0aGF0IGlzIGZpbGxlZCB3aXRoIGxpbmUgYnJlYWtzIGFuZCBpbmRlbnRhdGlvbiB0byBtYWtlIGl0CiAgICAgICAgICAgIGVhc2llciB0byByZWFkLgoKICAgICAgICAgICAgSWYgdGhlIHNwYWNlIHBhcmFtZXRlciBpcyBhIG5vbi1lbXB0eSBzdHJpbmcsIHRoZW4gdGhhdCBzdHJpbmcgd2lsbAogICAgICAgICAgICBiZSB1c2VkIGZvciBpbmRlbnRhdGlvbi4gSWYgdGhlIHNwYWNlIHBhcmFtZXRlciBpcyBhIG51bWJlciwgdGhlbgogICAgICAgICAgICB0aGUgaW5kZW50YXRpb24gd2lsbCBiZSB0aGF0IG1hbnkgc3BhY2VzLgoKICAgICAgICAgICAgRXhhbXBsZToKCiAgICAgICAgICAgIHRleHQgPSAkLmpxcGxvdC5KU09OLnN0cmluZ2lmeShbJ2UnLCB7cGx1cmlidXM6ICd1bnVtJ31dKTsKICAgICAgICAgICAgLy8gdGV4dCBpcyAnWyJlIix7InBsdXJpYnVzIjoidW51bSJ9XScKCgogICAgICAgICAgICB0ZXh0ID0gJC5qcXBsb3QuSlNPTi5zdHJpbmdpZnkoWydlJywge3BsdXJpYnVzOiAndW51bSd9XSwgbnVsbCwgJ1x0Jyk7CiAgICAgICAgICAgIC8vIHRleHQgaXMgJ1tcblx0ImUiLFxuXHR7XG5cdFx0InBsdXJpYnVzIjogInVudW0iXG5cdH1cbl0nCgogICAgICAgICAgICB0ZXh0ID0gJC5qcXBsb3QuSlNPTi5zdHJpbmdpZnkoW25ldyBEYXRlKCldLCBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNba2V5XSBpbnN0YW5jZW9mIERhdGUgPwogICAgICAgICAgICAgICAgICAgICdEYXRlKCcgKyB0aGlzW2tleV0gKyAnKScgOiB2YWx1ZTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIC8vIHRleHQgaXMgJ1siRGF0ZSgtLS1jdXJyZW50IHRpbWUtLS0pIl0nCgoKICAgICAgICAkLmpxcGxvdC5KU09OLnBhcnNlKHRleHQsIHJldml2ZXIpCiAgICAgICAgICAgIFRoaXMgbWV0aG9kIHBhcnNlcyBhIEpTT04gdGV4dCB0byBwcm9kdWNlIGFuIG9iamVjdCBvciBhcnJheS4KICAgICAgICAgICAgSXQgY2FuIHRocm93IGEgU3ludGF4RXJyb3IgZXhjZXB0aW9uLgoKICAgICAgICAgICAgVGhlIG9wdGlvbmFsIHJldml2ZXIgcGFyYW1ldGVyIGlzIGEgZnVuY3Rpb24gdGhhdCBjYW4gZmlsdGVyIGFuZAogICAgICAgICAgICB0cmFuc2Zvcm0gdGhlIHJlc3VsdHMuIEl0IHJlY2VpdmVzIGVhY2ggb2YgdGhlIGtleXMgYW5kIHZhbHVlcywKICAgICAgICAgICAgYW5kIGl0cyByZXR1cm4gdmFsdWUgaXMgdXNlZCBpbnN0ZWFkIG9mIHRoZSBvcmlnaW5hbCB2YWx1ZS4KICAgICAgICAgICAgSWYgaXQgcmV0dXJucyB3aGF0IGl0IHJlY2VpdmVkLCB0aGVuIHRoZSBzdHJ1Y3R1cmUgaXMgbm90IG1vZGlmaWVkLgogICAgICAgICAgICBJZiBpdCByZXR1cm5zIHVuZGVmaW5lZCB0aGVuIHRoZSBtZW1iZXIgaXMgZGVsZXRlZC4KCiAgICAgICAgICAgIEV4YW1wbGU6CgogICAgICAgICAgICAvLyBQYXJzZSB0aGUgdGV4dC4gVmFsdWVzIHRoYXQgbG9vayBsaWtlIElTTyBkYXRlIHN0cmluZ3Mgd2lsbAogICAgICAgICAgICAvLyBiZSBjb252ZXJ0ZWQgdG8gRGF0ZSBvYmplY3RzLgoKICAgICAgICAgICAgbXlEYXRhID0gJC5qcXBsb3QuSlNPTi5wYXJzZSh0ZXh0LCBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkgewogICAgICAgICAgICAgICAgdmFyIGE7CiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykgewogICAgICAgICAgICAgICAgICAgIGEgPQovXihcZHs0fSktKFxkezJ9KS0oXGR7Mn0pVChcZHsyfSk6KFxkezJ9KTooXGR7Mn0oPzpcLlxkKik/KVokLy5leGVjKHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICBpZiAoYSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IERhdGUoRGF0ZS5VVEMoK2FbMV0sICthWzJdIC0gMSwgK2FbM10sICthWzRdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgK2FbNV0sICthWzZdKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIG15RGF0YSA9ICQuanFwbG90LkpTT04ucGFyc2UoJ1siRGF0ZSgwOS8wOS8yMDAxKSJdJywgZnVuY3Rpb24gKGtleSwgdmFsdWUpIHsKICAgICAgICAgICAgICAgIHZhciBkOwogICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUuc2xpY2UoMCwgNSkgPT09ICdEYXRlKCcgJiYKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUuc2xpY2UoLTEpID09PSAnKScpIHsKICAgICAgICAgICAgICAgICAgICBkID0gbmV3IERhdGUodmFsdWUuc2xpY2UoNSwgLTEpKTsKICAgICAgICAgICAgICAgICAgICBpZiAoZCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgICAgICAgIH0pOwoKCiAgICBUaGlzIGlzIGEgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uLiBZb3UgYXJlIGZyZWUgdG8gY29weSwgbW9kaWZ5LCBvcgogICAgcmVkaXN0cmlidXRlLgoqLwoKKGZ1bmN0aW9uKCQpIHsKCiAgICAkLmpxcGxvdC5KU09OID0gd2luZG93LkpTT047CgogICAgaWYgKCF3aW5kb3cuSlNPTikgewogICAgICAgICQuanFwbG90LkpTT04gPSB7fTsKICAgIH0KICAgIAogICAgZnVuY3Rpb24gZihuKSB7CiAgICAgICAgLy8gRm9ybWF0IGludGVnZXJzIHRvIGhhdmUgYXQgbGVhc3QgdHdvIGRpZ2l0cy4KICAgICAgICByZXR1cm4gbiA8IDEwID8gJzAnICsgbiA6IG47CiAgICB9CgogICAgaWYgKHR5cGVvZiBEYXRlLnByb3RvdHlwZS50b0pTT04gIT09ICdmdW5jdGlvbicpIHsKCiAgICAgICAgRGF0ZS5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gKGtleSkgewoKICAgICAgICAgICAgcmV0dXJuIGlzRmluaXRlKHRoaXMudmFsdWVPZigpKSA/CiAgICAgICAgICAgICAgICAgICB0aGlzLmdldFVUQ0Z1bGxZZWFyKCkgICArICctJyArCiAgICAgICAgICAgICAgICAgZih0aGlzLmdldFVUQ01vbnRoKCkgKyAxKSArICctJyArCiAgICAgICAgICAgICAgICAgZih0aGlzLmdldFVUQ0RhdGUoKSkgICAgICArICdUJyArCiAgICAgICAgICAgICAgICAgZih0aGlzLmdldFVUQ0hvdXJzKCkpICAgICArICc6JyArCiAgICAgICAgICAgICAgICAgZih0aGlzLmdldFVUQ01pbnV0ZXMoKSkgICArICc6JyArCiAgICAgICAgICAgICAgICAgZih0aGlzLmdldFVUQ1NlY29uZHMoKSkgICArICdaJyA6IG51bGw7CiAgICAgICAgfTsKCiAgICAgICAgU3RyaW5nLnByb3RvdHlwZS50b0pTT04gPQogICAgICAgIE51bWJlci5wcm90b3R5cGUudG9KU09OID0KICAgICAgICBCb29sZWFuLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiAoa2V5KSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLnZhbHVlT2YoKTsKICAgICAgICB9OwogICAgfQoKICAgIHZhciBjeCA9IC9bXHUwMDAwXHUwMGFkXHUwNjAwLVx1MDYwNFx1MDcwZlx1MTdiNFx1MTdiNVx1MjAwYy1cdTIwMGZcdTIwMjgtXHUyMDJmXHUyMDYwLVx1MjA2Zlx1ZmVmZlx1ZmZmMC1cdWZmZmZdL2csCiAgICAgICAgZXNjYXBhYmxlID0gL1tcXFwiXHgwMC1ceDFmXHg3Zi1ceDlmXHUwMGFkXHUwNjAwLVx1MDYwNFx1MDcwZlx1MTdiNFx1MTdiNVx1MjAwYy1cdTIwMGZcdTIwMjgtXHUyMDJmXHUyMDYwLVx1MjA2Zlx1ZmVmZlx1ZmZmMC1cdWZmZmZdL2csCiAgICAgICAgZ2FwLAogICAgICAgIGluZGVudCwKICAgICAgICBtZXRhID0geyAgICAvLyB0YWJsZSBvZiBjaGFyYWN0ZXIgc3Vic3RpdHV0aW9ucwogICAgICAgICAgICAnXGInOiAnXFxiJywKICAgICAgICAgICAgJ1x0JzogJ1xcdCcsCiAgICAgICAgICAgICdcbic6ICdcXG4nLAogICAgICAgICAgICAnXGYnOiAnXFxmJywKICAgICAgICAgICAgJ1xyJzogJ1xccicsCiAgICAgICAgICAgICciJyA6ICdcXCInLAogICAgICAgICAgICAnXFwnOiAnXFxcXCcKICAgICAgICB9LAogICAgICAgIHJlcDsKCgogICAgZnVuY3Rpb24gcXVvdGUoc3RyaW5nKSB7CgovLyBJZiB0aGUgc3RyaW5nIGNvbnRhaW5zIG5vIGNvbnRyb2wgY2hhcmFjdGVycywgbm8gcXVvdGUgY2hhcmFjdGVycywgYW5kIG5vCi8vIGJhY2tzbGFzaCBjaGFyYWN0ZXJzLCB0aGVuIHdlIGNhbiBzYWZlbHkgc2xhcCBzb21lIHF1b3RlcyBhcm91bmQgaXQuCi8vIE90aGVyd2lzZSB3ZSBtdXN0IGFsc28gcmVwbGFjZSB0aGUgb2ZmZW5kaW5nIGNoYXJhY3RlcnMgd2l0aCBzYWZlIGVzY2FwZQovLyBzZXF1ZW5jZXMuCgogICAgICAgIGVzY2FwYWJsZS5sYXN0SW5kZXggPSAwOwogICAgICAgIHJldHVybiBlc2NhcGFibGUudGVzdChzdHJpbmcpID8KICAgICAgICAgICAgJyInICsgc3RyaW5nLnJlcGxhY2UoZXNjYXBhYmxlLCBmdW5jdGlvbiAoYSkgewogICAgICAgICAgICAgICAgdmFyIGMgPSBtZXRhW2FdOwogICAgICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiBjID09PSAnc3RyaW5nJyA/IGMgOgogICAgICAgICAgICAgICAgICAgICdcXHUnICsgKCcwMDAwJyArIGEuY2hhckNvZGVBdCgwKS50b1N0cmluZygxNikpLnNsaWNlKC00KTsKICAgICAgICAgICAgfSkgKyAnIicgOgogICAgICAgICAgICAnIicgKyBzdHJpbmcgKyAnIic7CiAgICB9CgoKICAgIGZ1bmN0aW9uIHN0cihrZXksIGhvbGRlcikgewoKLy8gUHJvZHVjZSBhIHN0cmluZyBmcm9tIGhvbGRlcltrZXldLgoKICAgICAgICB2YXIgaSwgICAgICAgICAgLy8gVGhlIGxvb3AgY291bnRlci4KICAgICAgICAgICAgaywgICAgICAgICAgLy8gVGhlIG1lbWJlciBrZXkuCiAgICAgICAgICAgIHYsICAgICAgICAgIC8vIFRoZSBtZW1iZXIgdmFsdWUuCiAgICAgICAgICAgIGxlbmd0aCwKICAgICAgICAgICAgbWluZCA9IGdhcCwKICAgICAgICAgICAgcGFydGlhbCwKICAgICAgICAgICAgdmFsdWUgPSBob2xkZXJba2V5XTsKCi8vIElmIHRoZSB2YWx1ZSBoYXMgYSB0b0pTT04gbWV0aG9kLCBjYWxsIGl0IHRvIG9idGFpbiBhIHJlcGxhY2VtZW50IHZhbHVlLgoKICAgICAgICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJgogICAgICAgICAgICAgICAgdHlwZW9mIHZhbHVlLnRvSlNPTiA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnRvSlNPTihrZXkpOwogICAgICAgIH0KCi8vIElmIHdlIHdlcmUgY2FsbGVkIHdpdGggYSByZXBsYWNlciBmdW5jdGlvbiwgdGhlbiBjYWxsIHRoZSByZXBsYWNlciB0bwovLyBvYnRhaW4gYSByZXBsYWNlbWVudCB2YWx1ZS4KCiAgICAgICAgaWYgKHR5cGVvZiByZXAgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgICAgdmFsdWUgPSByZXAuY2FsbChob2xkZXIsIGtleSwgdmFsdWUpOwogICAgICAgIH0KCi8vIFdoYXQgaGFwcGVucyBuZXh0IGRlcGVuZHMgb24gdGhlIHZhbHVlJ3MgdHlwZS4KCiAgICAgICAgc3dpdGNoICh0eXBlb2YgdmFsdWUpIHsKICAgICAgICBjYXNlICdzdHJpbmcnOgogICAgICAgICAgICByZXR1cm4gcXVvdGUodmFsdWUpOwoKICAgICAgICBjYXNlICdudW1iZXInOgoKLy8gSlNPTiBudW1iZXJzIG11c3QgYmUgZmluaXRlLiBFbmNvZGUgbm9uLWZpbml0ZSBudW1iZXJzIGFzIG51bGwuCgogICAgICAgICAgICByZXR1cm4gaXNGaW5pdGUodmFsdWUpID8gU3RyaW5nKHZhbHVlKSA6ICdudWxsJzsKCiAgICAgICAgY2FzZSAnYm9vbGVhbic6CiAgICAgICAgY2FzZSAnbnVsbCc6CgovLyBJZiB0aGUgdmFsdWUgaXMgYSBib29sZWFuIG9yIG51bGwsIGNvbnZlcnQgaXQgdG8gYSBzdHJpbmcuIE5vdGU6Ci8vIHR5cGVvZiBudWxsIGRvZXMgbm90IHByb2R1Y2UgJ251bGwnLiBUaGUgY2FzZSBpcyBpbmNsdWRlZCBoZXJlIGluCi8vIHRoZSByZW1vdGUgY2hhbmNlIHRoYXQgdGhpcyBnZXRzIGZpeGVkIHNvbWVkYXkuCgogICAgICAgICAgICByZXR1cm4gU3RyaW5nKHZhbHVlKTsKCi8vIElmIHRoZSB0eXBlIGlzICdvYmplY3QnLCB3ZSBtaWdodCBiZSBkZWFsaW5nIHdpdGggYW4gb2JqZWN0IG9yIGFuIGFycmF5IG9yCi8vIG51bGwuCgogICAgICAgIGNhc2UgJ29iamVjdCc6CgovLyBEdWUgdG8gYSBzcGVjaWZpY2F0aW9uIGJsdW5kZXIgaW4gRUNNQVNjcmlwdCwgdHlwZW9mIG51bGwgaXMgJ29iamVjdCcsCi8vIHNvIHdhdGNoIG91dCBmb3IgdGhhdCBjYXNlLgoKICAgICAgICAgICAgaWYgKCF2YWx1ZSkgewogICAgICAgICAgICAgICAgcmV0dXJuICdudWxsJzsKICAgICAgICAgICAgfQoKLy8gTWFrZSBhbiBhcnJheSB0byBob2xkIHRoZSBwYXJ0aWFsIHJlc3VsdHMgb2Ygc3RyaW5naWZ5aW5nIHRoaXMgb2JqZWN0IHZhbHVlLgoKICAgICAgICAgICAgZ2FwICs9IGluZGVudDsKICAgICAgICAgICAgcGFydGlhbCA9IFtdOwoKLy8gSXMgdGhlIHZhbHVlIGFuIGFycmF5PwoKICAgICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuYXBwbHkodmFsdWUpID09PSAnW29iamVjdCBBcnJheV0nKSB7CgovLyBUaGUgdmFsdWUgaXMgYW4gYXJyYXkuIFN0cmluZ2lmeSBldmVyeSBlbGVtZW50LiBVc2UgbnVsbCBhcyBhIHBsYWNlaG9sZGVyCi8vIGZvciBub24tSlNPTiB2YWx1ZXMuCgogICAgICAgICAgICAgICAgbGVuZ3RoID0gdmFsdWUubGVuZ3RoOwogICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSArPSAxKSB7CiAgICAgICAgICAgICAgICAgICAgcGFydGlhbFtpXSA9IHN0cihpLCB2YWx1ZSkgfHwgJ251bGwnOwogICAgICAgICAgICAgICAgfQoKLy8gSm9pbiBhbGwgb2YgdGhlIGVsZW1lbnRzIHRvZ2V0aGVyLCBzZXBhcmF0ZWQgd2l0aCBjb21tYXMsIGFuZCB3cmFwIHRoZW0gaW4KLy8gYnJhY2tldHMuCgogICAgICAgICAgICAgICAgdiA9IHBhcnRpYWwubGVuZ3RoID09PSAwID8gJ1tdJyA6CiAgICAgICAgICAgICAgICAgICAgZ2FwID8gJ1tcbicgKyBnYXAgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydGlhbC5qb2luKCcsXG4nICsgZ2FwKSArICdcbicgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbmQgKyAnXScgOgogICAgICAgICAgICAgICAgICAgICAgICAgICdbJyArIHBhcnRpYWwuam9pbignLCcpICsgJ10nOwogICAgICAgICAgICAgICAgZ2FwID0gbWluZDsKICAgICAgICAgICAgICAgIHJldHVybiB2OwogICAgICAgICAgICB9CgovLyBJZiB0aGUgcmVwbGFjZXIgaXMgYW4gYXJyYXksIHVzZSBpdCB0byBzZWxlY3QgdGhlIG1lbWJlcnMgdG8gYmUgc3RyaW5naWZpZWQuCgogICAgICAgICAgICBpZiAocmVwICYmIHR5cGVvZiByZXAgPT09ICdvYmplY3QnKSB7CiAgICAgICAgICAgICAgICBsZW5ndGggPSByZXAubGVuZ3RoOwogICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSArPSAxKSB7CiAgICAgICAgICAgICAgICAgICAgayA9IHJlcFtpXTsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGsgPT09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHYgPSBzdHIoaywgdmFsdWUpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydGlhbC5wdXNoKHF1b3RlKGspICsgKGdhcCA/ICc6ICcgOiAnOicpICsgdik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CgovLyBPdGhlcndpc2UsIGl0ZXJhdGUgdGhyb3VnaCBhbGwgb2YgdGhlIGtleXMgaW4gdGhlIG9iamVjdC4KCiAgICAgICAgICAgICAgICBmb3IgKGsgaW4gdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwodmFsdWUsIGspKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHYgPSBzdHIoaywgdmFsdWUpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydGlhbC5wdXNoKHF1b3RlKGspICsgKGdhcCA/ICc6ICcgOiAnOicpICsgdik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCi8vIEpvaW4gYWxsIG9mIHRoZSBtZW1iZXIgdGV4dHMgdG9nZXRoZXIsIHNlcGFyYXRlZCB3aXRoIGNvbW1hcywKLy8gYW5kIHdyYXAgdGhlbSBpbiBicmFjZXMuCgogICAgICAgICAgICB2ID0gcGFydGlhbC5sZW5ndGggPT09IDAgPyAne30nIDoKICAgICAgICAgICAgICAgIGdhcCA/ICd7XG4nICsgZ2FwICsgcGFydGlhbC5qb2luKCcsXG4nICsgZ2FwKSArICdcbicgKwogICAgICAgICAgICAgICAgICAgICAgICBtaW5kICsgJ30nIDogJ3snICsgcGFydGlhbC5qb2luKCcsJykgKyAnfSc7CiAgICAgICAgICAgIGdhcCA9IG1pbmQ7CiAgICAgICAgICAgIHJldHVybiB2OwogICAgICAgIH0KICAgIH0KCi8vIElmIHRoZSBKU09OIG9iamVjdCBkb2VzIG5vdCB5ZXQgaGF2ZSBhIHN0cmluZ2lmeSBtZXRob2QsIGdpdmUgaXQgb25lLgoKICAgIGlmICh0eXBlb2YgJC5qcXBsb3QuSlNPTi5zdHJpbmdpZnkgIT09ICdmdW5jdGlvbicpIHsKICAgICAgICAkLmpxcGxvdC5KU09OLnN0cmluZ2lmeSA9IGZ1bmN0aW9uICh2YWx1ZSwgcmVwbGFjZXIsIHNwYWNlKSB7CgovLyBUaGUgc3RyaW5naWZ5IG1ldGhvZCB0YWtlcyBhIHZhbHVlIGFuZCBhbiBvcHRpb25hbCByZXBsYWNlciwgYW5kIGFuIG9wdGlvbmFsCi8vIHNwYWNlIHBhcmFtZXRlciwgYW5kIHJldHVybnMgYSBKU09OIHRleHQuIFRoZSByZXBsYWNlciBjYW4gYmUgYSBmdW5jdGlvbgovLyB0aGF0IGNhbiByZXBsYWNlIHZhbHVlcywgb3IgYW4gYXJyYXkgb2Ygc3RyaW5ncyB0aGF0IHdpbGwgc2VsZWN0IHRoZSBrZXlzLgovLyBBIGRlZmF1bHQgcmVwbGFjZXIgbWV0aG9kIGNhbiBiZSBwcm92aWRlZC4gVXNlIG9mIHRoZSBzcGFjZSBwYXJhbWV0ZXIgY2FuCi8vIHByb2R1Y2UgdGV4dCB0aGF0IGlzIG1vcmUgZWFzaWx5IHJlYWRhYmxlLgoKICAgICAgICAgICAgdmFyIGk7CiAgICAgICAgICAgIGdhcCA9ICcnOwogICAgICAgICAgICBpbmRlbnQgPSAnJzsKCi8vIElmIHRoZSBzcGFjZSBwYXJhbWV0ZXIgaXMgYSBudW1iZXIsIG1ha2UgYW4gaW5kZW50IHN0cmluZyBjb250YWluaW5nIHRoYXQKLy8gbWFueSBzcGFjZXMuCgogICAgICAgICAgICBpZiAodHlwZW9mIHNwYWNlID09PSAnbnVtYmVyJykgewogICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHNwYWNlOyBpICs9IDEpIHsKICAgICAgICAgICAgICAgICAgICBpbmRlbnQgKz0gJyAnOwogICAgICAgICAgICAgICAgfQoKLy8gSWYgdGhlIHNwYWNlIHBhcmFtZXRlciBpcyBhIHN0cmluZywgaXQgd2lsbCBiZSB1c2VkIGFzIHRoZSBpbmRlbnQgc3RyaW5nLgoKICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygc3BhY2UgPT09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgICAgICBpbmRlbnQgPSBzcGFjZTsKICAgICAgICAgICAgfQoKLy8gSWYgdGhlcmUgaXMgYSByZXBsYWNlciwgaXQgbXVzdCBiZSBhIGZ1bmN0aW9uIG9yIGFuIGFycmF5LgovLyBPdGhlcndpc2UsIHRocm93IGFuIGVycm9yLgoKICAgICAgICAgICAgcmVwID0gcmVwbGFjZXI7CiAgICAgICAgICAgIGlmIChyZXBsYWNlciAmJiB0eXBlb2YgcmVwbGFjZXIgIT09ICdmdW5jdGlvbicgJiYKICAgICAgICAgICAgICAgICAgICAodHlwZW9mIHJlcGxhY2VyICE9PSAnb2JqZWN0JyB8fAogICAgICAgICAgICAgICAgICAgICB0eXBlb2YgcmVwbGFjZXIubGVuZ3RoICE9PSAnbnVtYmVyJykpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignJC5qcXBsb3QuSlNPTi5zdHJpbmdpZnknKTsKICAgICAgICAgICAgfQoKLy8gTWFrZSBhIGZha2Ugcm9vdCBvYmplY3QgY29udGFpbmluZyBvdXIgdmFsdWUgdW5kZXIgdGhlIGtleSBvZiAnJy4KLy8gUmV0dXJuIHRoZSByZXN1bHQgb2Ygc3RyaW5naWZ5aW5nIHRoZSB2YWx1ZS4KCiAgICAgICAgICAgIHJldHVybiBzdHIoJycsIHsnJzogdmFsdWV9KTsKICAgICAgICB9OwogICAgfQoKCi8vIElmIHRoZSBKU09OIG9iamVjdCBkb2VzIG5vdCB5ZXQgaGF2ZSBhIHBhcnNlIG1ldGhvZCwgZ2l2ZSBpdCBvbmUuCgogICAgaWYgKHR5cGVvZiAkLmpxcGxvdC5KU09OLnBhcnNlICE9PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgJC5qcXBsb3QuSlNPTi5wYXJzZSA9IGZ1bmN0aW9uICh0ZXh0LCByZXZpdmVyKSB7CgovLyBUaGUgcGFyc2UgbWV0aG9kIHRha2VzIGEgdGV4dCBhbmQgYW4gb3B0aW9uYWwgcmV2aXZlciBmdW5jdGlvbiwgYW5kIHJldHVybnMKLy8gYSBKYXZhU2NyaXB0IHZhbHVlIGlmIHRoZSB0ZXh0IGlzIGEgdmFsaWQgSlNPTiB0ZXh0LgoKICAgICAgICAgICAgdmFyIGo7CgogICAgICAgICAgICBmdW5jdGlvbiB3YWxrKGhvbGRlciwga2V5KSB7CgovLyBUaGUgd2FsayBtZXRob2QgaXMgdXNlZCB0byByZWN1cnNpdmVseSB3YWxrIHRoZSByZXN1bHRpbmcgc3RydWN0dXJlIHNvCi8vIHRoYXQgbW9kaWZpY2F0aW9ucyBjYW4gYmUgbWFkZS4KCiAgICAgICAgICAgICAgICB2YXIgaywgdiwgdmFsdWUgPSBob2xkZXJba2V5XTsKICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yIChrIGluIHZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwgaykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYgPSB3YWxrKHZhbHVlLCBrKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2ICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVtrXSA9IHY7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB2YWx1ZVtrXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiByZXZpdmVyLmNhbGwoaG9sZGVyLCBrZXksIHZhbHVlKTsKICAgICAgICAgICAgfQoKCi8vIFBhcnNpbmcgaGFwcGVucyBpbiBmb3VyIHN0YWdlcy4gSW4gdGhlIGZpcnN0IHN0YWdlLCB3ZSByZXBsYWNlIGNlcnRhaW4KLy8gVW5pY29kZSBjaGFyYWN0ZXJzIHdpdGggZXNjYXBlIHNlcXVlbmNlcy4gSmF2YVNjcmlwdCBoYW5kbGVzIG1hbnkgY2hhcmFjdGVycwovLyBpbmNvcnJlY3RseSwgZWl0aGVyIHNpbGVudGx5IGRlbGV0aW5nIHRoZW0sIG9yIHRyZWF0aW5nIHRoZW0gYXMgbGluZSBlbmRpbmdzLgoKICAgICAgICAgICAgdGV4dCA9IFN0cmluZyh0ZXh0KTsKICAgICAgICAgICAgY3gubGFzdEluZGV4ID0gMDsKICAgICAgICAgICAgaWYgKGN4LnRlc3QodGV4dCkpIHsKICAgICAgICAgICAgICAgIHRleHQgPSB0ZXh0LnJlcGxhY2UoY3gsIGZ1bmN0aW9uIChhKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdcXHUnICsKICAgICAgICAgICAgICAgICAgICAgICAgKCcwMDAwJyArIGEuY2hhckNvZGVBdCgwKS50b1N0cmluZygxNikpLnNsaWNlKC00KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CgovLyBJbiB0aGUgc2Vjb25kIHN0YWdlLCB3ZSBydW4gdGhlIHRleHQgYWdhaW5zdCByZWd1bGFyIGV4cHJlc3Npb25zIHRoYXQgbG9vawovLyBmb3Igbm9uLUpTT04gcGF0dGVybnMuIFdlIGFyZSBlc3BlY2lhbGx5IGNvbmNlcm5lZCB3aXRoICcoKScgYW5kICduZXcnCi8vIGJlY2F1c2UgdGhleSBjYW4gY2F1c2UgaW52b2NhdGlvbiwgYW5kICc9JyBiZWNhdXNlIGl0IGNhbiBjYXVzZSBtdXRhdGlvbi4KLy8gQnV0IGp1c3QgdG8gYmUgc2FmZSwgd2Ugd2FudCB0byByZWplY3QgYWxsIHVuZXhwZWN0ZWQgZm9ybXMuCgovLyBXZSBzcGxpdCB0aGUgc2Vjb25kIHN0YWdlIGludG8gNCByZWdleHAgb3BlcmF0aW9ucyBpbiBvcmRlciB0byB3b3JrIGFyb3VuZAovLyBjcmlwcGxpbmcgaW5lZmZpY2llbmNpZXMgaW4gSUUncyBhbmQgU2FmYXJpJ3MgcmVnZXhwIGVuZ2luZXMuIEZpcnN0IHdlCi8vIHJlcGxhY2UgdGhlIEpTT04gYmFja3NsYXNoIHBhaXJzIHdpdGggJ0AnIChhIG5vbi1KU09OIGNoYXJhY3RlcikuIFNlY29uZCwgd2UKLy8gcmVwbGFjZSBhbGwgc2ltcGxlIHZhbHVlIHRva2VucyB3aXRoICddJyBjaGFyYWN0ZXJzLiBUaGlyZCwgd2UgZGVsZXRlIGFsbAovLyBvcGVuIGJyYWNrZXRzIHRoYXQgZm9sbG93IGEgY29sb24gb3IgY29tbWEgb3IgdGhhdCBiZWdpbiB0aGUgdGV4dC4gRmluYWxseSwKLy8gd2UgbG9vayB0byBzZWUgdGhhdCB0aGUgcmVtYWluaW5nIGNoYXJhY3RlcnMgYXJlIG9ubHkgd2hpdGVzcGFjZSBvciAnXScgb3IKLy8gJywnIG9yICc6JyBvciAneycgb3IgJ30nLiBJZiB0aGF0IGlzIHNvLCB0aGVuIHRoZSB0ZXh0IGlzIHNhZmUgZm9yIGV2YWwuCgogICAgICAgICAgICBpZiAoL15bXF0sOnt9XHNdKiQvLnRlc3QodGV4dC5yZXBsYWNlKC9cXCg/OlsiXFxcL2JmbnJ0XXx1WzAtOWEtZkEtRl17NH0pL2csICdAJykucmVwbGFjZSgvIlteIlxcXG5ccl0qInx0cnVlfGZhbHNlfG51bGx8LT9cZCsoPzpcLlxkKik/KD86W2VFXVsrXC1dP1xkKyk/L2csICddJykucmVwbGFjZSgvKD86Xnw6fCwpKD86XHMqXFspKy9nLCAnJykpKSB7CgovLyBJbiB0aGUgdGhpcmQgc3RhZ2Ugd2UgdXNlIHRoZSBldmFsIGZ1bmN0aW9uIHRvIGNvbXBpbGUgdGhlIHRleHQgaW50byBhCi8vIEphdmFTY3JpcHQgc3RydWN0dXJlLiBUaGUgJ3snIG9wZXJhdG9yIGlzIHN1YmplY3QgdG8gYSBzeW50YWN0aWMgYW1iaWd1aXR5Ci8vIGluIEphdmFTY3JpcHQ6IGl0IGNhbiBiZWdpbiBhIGJsb2NrIG9yIGFuIG9iamVjdCBsaXRlcmFsLiBXZSB3cmFwIHRoZSB0ZXh0Ci8vIGluIHBhcmVucyB0byBlbGltaW5hdGUgdGhlIGFtYmlndWl0eS4KCiAgICAgICAgICAgICAgICBqID0gZXZhbCgnKCcgKyB0ZXh0ICsgJyknKTsKCi8vIEluIHRoZSBvcHRpb25hbCBmb3VydGggc3RhZ2UsIHdlIHJlY3Vyc2l2ZWx5IHdhbGsgdGhlIG5ldyBzdHJ1Y3R1cmUsIHBhc3NpbmcKLy8gZWFjaCBuYW1lL3ZhbHVlIHBhaXIgdG8gYSByZXZpdmVyIGZ1bmN0aW9uIGZvciBwb3NzaWJsZSB0cmFuc2Zvcm1hdGlvbi4KCiAgICAgICAgICAgICAgICByZXR1cm4gdHlwZW9mIHJldml2ZXIgPT09ICdmdW5jdGlvbicgPwogICAgICAgICAgICAgICAgICAgIHdhbGsoeycnOiBqfSwgJycpIDogajsKICAgICAgICAgICAgfQoKLy8gSWYgdGhlIHRleHQgaXMgbm90IEpTT04gcGFyc2VhYmxlLCB0aGVuIGEgU3ludGF4RXJyb3IgaXMgdGhyb3duLgoKICAgICAgICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKCckLmpxcGxvdC5KU09OLnBhcnNlJyk7CiAgICAgICAgfTsKICAgIH0KfSkoalF1ZXJ5KTsK]]></data>
	</file>
	<file>
	  <filename>/src/plugins/jqplot.json2.min.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqCiAqIGpxUGxvdAogKiBQdXJlIEphdmFTY3JpcHQgcGxvdHRpbmcgcGx1Z2luIHVzaW5nIGpRdWVyeQogKgogKiBWZXJzaW9uOiAxLjAuMGIyX3IxMDEyCiAqCiAqIENvcHlyaWdodCAoYykgMjAwOS0yMDExIENocmlzIExlb25lbGxvCiAqIGpxUGxvdCBpcyBjdXJyZW50bHkgYXZhaWxhYmxlIGZvciB1c2UgaW4gYWxsIHBlcnNvbmFsIG9yIGNvbW1lcmNpYWwgcHJvamVjdHMgCiAqIHVuZGVyIGJvdGggdGhlIE1JVCAoaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHApIGFuZCBHUEwgCiAqIHZlcnNpb24gMi4wIChodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC5odG1sKSBsaWNlbnNlcy4gVGhpcyBtZWFucyB0aGF0IHlvdSBjYW4gCiAqIGNob29zZSB0aGUgbGljZW5zZSB0aGF0IGJlc3Qgc3VpdHMgeW91ciBwcm9qZWN0IGFuZCB1c2UgaXQgYWNjb3JkaW5nbHkuIAogKgogKiBBbHRob3VnaCBub3QgcmVxdWlyZWQsIHRoZSBhdXRob3Igd291bGQgYXBwcmVjaWF0ZSBhbiBlbWFpbCBsZXR0aW5nIGhpbSAKICoga25vdyBvZiBhbnkgc3Vic3RhbnRpYWwgdXNlIG9mIGpxUGxvdC4gIFlvdSBjYW4gcmVhY2ggdGhlIGF1dGhvciBhdDogCiAqIGNocmlzIGF0IGpxcGxvdCBkb3QgY29tIG9yIHNlZSBodHRwOi8vd3d3LmpxcGxvdC5jb20vaW5mby5waHAgLgogKgogKiBJZiB5b3UgYXJlIGZlZWxpbmcga2luZCBhbmQgZ2VuZXJvdXMsIGNvbnNpZGVyIHN1cHBvcnRpbmcgdGhlIHByb2plY3QgYnkKICogbWFraW5nIGEgZG9uYXRpb24gYXQ6IGh0dHA6Ly93d3cuanFwbG90LmNvbS9kb25hdGUucGhwIC4KICoKICogc3ByaW50ZiBmdW5jdGlvbnMgY29udGFpbmVkIGluIGpxcGxvdC5zcHJpbnRmLmpzIGJ5IEFzaCBTZWFybGU6CiAqCiAqICAgICB2ZXJzaW9uIDIwMDcuMDQuMjcKICogICAgIGF1dGhvciBBc2ggU2VhcmxlCiAqICAgICBodHRwOi8vaGV4bWVuLmNvbS9ibG9nLzIwMDcvMDMvcHJpbnRmLXNwcmludGYvCiAqICAgICBodHRwOi8vaGV4bWVuLmNvbS9qcy9zcHJpbnRmLmpzCiAqICAgICBUaGUgYXV0aG9yIChBc2ggU2VhcmxlKSBoYXMgcGxhY2VkIHRoaXMgY29kZSBpbiB0aGUgcHVibGljIGRvbWFpbjoKICogICAgICJUaGlzIGNvZGUgaXMgdW5yZXN0cmljdGVkOiB5b3UgYXJlIGZyZWUgdG8gdXNlIGl0IGhvd2V2ZXIgeW91IGxpa2UuIgogKgogKiBpbmNsdWRlZCBqc0RhdGUgbGlicmFyeSBieSBDaHJpcyBMZW9uZWxsbzoKICoKICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEgQ2hyaXMgTGVvbmVsbG8KICoKICoganNEYXRlIGlzIGN1cnJlbnRseSBhdmFpbGFibGUgZm9yIHVzZSBpbiBhbGwgcGVyc29uYWwgb3IgY29tbWVyY2lhbCBwcm9qZWN0cyAKICogdW5kZXIgYm90aCB0aGUgTUlUIGFuZCBHUEwgdmVyc2lvbiAyLjAgbGljZW5zZXMuIFRoaXMgbWVhbnMgdGhhdCB5b3UgY2FuIAogKiBjaG9vc2UgdGhlIGxpY2Vuc2UgdGhhdCBiZXN0IHN1aXRzIHlvdXIgcHJvamVjdCBhbmQgdXNlIGl0IGFjY29yZGluZ2x5LgogKgogKiBqc0RhdGUgYm9ycm93cyBtYW55IGNvbmNlcHRzIGFuZCBpZGVhcyBmcm9tIHRoZSBEYXRlIEluc3RhbmNlIAogKiBNZXRob2RzIGJ5IEtlbiBTbnlkZXIgYWxvbmcgd2l0aCBzb21lIHBhcnRzIG9mIEtlbidzIGFjdHVhbCBjb2RlLgogKiAKICogS2VuJ3Mgb3JpZ2lhbmwgRGF0ZSBJbnN0YW5jZSBNZXRob2RzIGFuZCBjb3B5cmlnaHQgbm90aWNlOgogKiAKICogS2VuIFNueWRlciAoa2VuIGQgc255ZGVyIGF0IGdtYWlsIGRvdCBjb20pCiAqIDIwMDgtMDktMTAKICogdmVyc2lvbiAyLjAuMiAoaHR0cDovL2tlbmRzbnlkZXIuY29tL3NhbmRib3gvZGF0ZS8pICAgICAKICogQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbiBMaWNlbnNlIDMuMCAoaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnkvMy4wLykKICoKICoganFwbG90VG9JbWFnZSBmdW5jdGlvbiBiYXNlZCBvbiBMYXJyeSBTaWRlbidzIGV4cG9ydC1qcXBsb3QtdG8tcG5nLmpzLgogKiBMYXJyeSBoYXMgZ2VuZXJvdXNseSBnaXZlbiBwZXJtaXNzaW9uIHRvIGFkYXB0IGhpcyBjb2RlIGZvciBpbmNsdXNpb24KICogaW50byBqcVBsb3QuCiAqCiAqIExhcnJ5J3Mgb3JpZ2luYWwgY29kZSBjYW4gYmUgZm91bmQgaGVyZToKICoKICogaHR0cHM6Ly9naXRodWIuY29tL2xzaWRlbi9leHBvcnQtanFwbG90LXRvLXBuZwogKiAKICogCiAqLwooZnVuY3Rpb24oJCl7JC5qcXBsb3QuSlNPTj13aW5kb3cuSlNPTjtpZighd2luZG93LkpTT04peyQuanFwbG90LkpTT049e319ZnVuY3Rpb24gZihuKXtyZXR1cm4gbjwxMD8iMCIrbjpufWlmKHR5cGVvZiBEYXRlLnByb3RvdHlwZS50b0pTT04hPT0iZnVuY3Rpb24iKXtEYXRlLnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oa2V5KXtyZXR1cm4gaXNGaW5pdGUodGhpcy52YWx1ZU9mKCkpP3RoaXMuZ2V0VVRDRnVsbFllYXIoKSsiLSIrZih0aGlzLmdldFVUQ01vbnRoKCkrMSkrIi0iK2YodGhpcy5nZXRVVENEYXRlKCkpKyJUIitmKHRoaXMuZ2V0VVRDSG91cnMoKSkrIjoiK2YodGhpcy5nZXRVVENNaW51dGVzKCkpKyI6IitmKHRoaXMuZ2V0VVRDU2Vjb25kcygpKSsiWiI6bnVsbH07U3RyaW5nLnByb3RvdHlwZS50b0pTT049TnVtYmVyLnByb3RvdHlwZS50b0pTT049Qm9vbGVhbi5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKGtleSl7cmV0dXJuIHRoaXMudmFsdWVPZigpfX12YXIgY3g9L1tcdTAwMDBcdTAwYWRcdTA2MDAtXHUwNjA0XHUwNzBmXHUxN2I0XHUxN2I1XHUyMDBjLVx1MjAwZlx1MjAyOC1cdTIwMmZcdTIwNjAtXHUyMDZmXHVmZWZmXHVmZmYwLVx1ZmZmZl0vZyxlc2NhcGFibGU9L1tcXFwiXHgwMC1ceDFmXHg3Zi1ceDlmXHUwMGFkXHUwNjAwLVx1MDYwNFx1MDcwZlx1MTdiNFx1MTdiNVx1MjAwYy1cdTIwMGZcdTIwMjgtXHUyMDJmXHUyMDYwLVx1MjA2Zlx1ZmVmZlx1ZmZmMC1cdWZmZmZdL2csZ2FwLGluZGVudCxtZXRhPXsiXGIiOiJcXGIiLCJcdCI6IlxcdCIsIlxuIjoiXFxuIiwiXGYiOiJcXGYiLCJcciI6IlxcciIsJyInOidcXCInLCJcXCI6IlxcXFwifSxyZXA7ZnVuY3Rpb24gcXVvdGUoc3RyaW5nKXtlc2NhcGFibGUubGFzdEluZGV4PTA7cmV0dXJuIGVzY2FwYWJsZS50ZXN0KHN0cmluZyk/JyInK3N0cmluZy5yZXBsYWNlKGVzY2FwYWJsZSxmdW5jdGlvbihhKXt2YXIgYz1tZXRhW2FdO3JldHVybiB0eXBlb2YgYz09PSJzdHJpbmciP2M6IlxcdSIrKCIwMDAwIithLmNoYXJDb2RlQXQoMCkudG9TdHJpbmcoMTYpKS5zbGljZSgtNCl9KSsnIic6JyInK3N0cmluZysnIid9ZnVuY3Rpb24gc3RyKGtleSxob2xkZXIpe3ZhciBpLGssdixsZW5ndGgsbWluZD1nYXAscGFydGlhbCx2YWx1ZT1ob2xkZXJba2V5XTtpZih2YWx1ZSYmdHlwZW9mIHZhbHVlPT09Im9iamVjdCImJnR5cGVvZiB2YWx1ZS50b0pTT049PT0iZnVuY3Rpb24iKXt2YWx1ZT12YWx1ZS50b0pTT04oa2V5KX1pZih0eXBlb2YgcmVwPT09ImZ1bmN0aW9uIil7dmFsdWU9cmVwLmNhbGwoaG9sZGVyLGtleSx2YWx1ZSl9c3dpdGNoKHR5cGVvZiB2YWx1ZSl7Y2FzZSJzdHJpbmciOnJldHVybiBxdW90ZSh2YWx1ZSk7Y2FzZSJudW1iZXIiOnJldHVybiBpc0Zpbml0ZSh2YWx1ZSk/U3RyaW5nKHZhbHVlKToibnVsbCI7Y2FzZSJib29sZWFuIjpjYXNlIm51bGwiOnJldHVybiBTdHJpbmcodmFsdWUpO2Nhc2Uib2JqZWN0IjppZighdmFsdWUpe3JldHVybiJudWxsIn1nYXArPWluZGVudDtwYXJ0aWFsPVtdO2lmKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuYXBwbHkodmFsdWUpPT09IltvYmplY3QgQXJyYXldIil7bGVuZ3RoPXZhbHVlLmxlbmd0aDtmb3IoaT0wO2k8bGVuZ3RoO2krPTEpe3BhcnRpYWxbaV09c3RyKGksdmFsdWUpfHwibnVsbCJ9dj1wYXJ0aWFsLmxlbmd0aD09PTA/IltdIjpnYXA/IltcbiIrZ2FwK3BhcnRpYWwuam9pbigiLFxuIitnYXApKyJcbiIrbWluZCsiXSI6IlsiK3BhcnRpYWwuam9pbigiLCIpKyJdIjtnYXA9bWluZDtyZXR1cm4gdn1pZihyZXAmJnR5cGVvZiByZXA9PT0ib2JqZWN0Iil7bGVuZ3RoPXJlcC5sZW5ndGg7Zm9yKGk9MDtpPGxlbmd0aDtpKz0xKXtrPXJlcFtpXTtpZih0eXBlb2Ygaz09PSJzdHJpbmciKXt2PXN0cihrLHZhbHVlKTtpZih2KXtwYXJ0aWFsLnB1c2gocXVvdGUoaykrKGdhcD8iOiAiOiI6Iikrdil9fX19ZWxzZXtmb3IoayBpbiB2YWx1ZSl7aWYoT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwodmFsdWUsaykpe3Y9c3RyKGssdmFsdWUpO2lmKHYpe3BhcnRpYWwucHVzaChxdW90ZShrKSsoZ2FwPyI6ICI6IjoiKSt2KX19fX12PXBhcnRpYWwubGVuZ3RoPT09MD8ie30iOmdhcD8ie1xuIitnYXArcGFydGlhbC5qb2luKCIsXG4iK2dhcCkrIlxuIittaW5kKyJ9IjoieyIrcGFydGlhbC5qb2luKCIsIikrIn0iO2dhcD1taW5kO3JldHVybiB2fX1pZih0eXBlb2YgJC5qcXBsb3QuSlNPTi5zdHJpbmdpZnkhPT0iZnVuY3Rpb24iKXskLmpxcGxvdC5KU09OLnN0cmluZ2lmeT1mdW5jdGlvbih2YWx1ZSxyZXBsYWNlcixzcGFjZSl7dmFyIGk7Z2FwPSIiO2luZGVudD0iIjtpZih0eXBlb2Ygc3BhY2U9PT0ibnVtYmVyIil7Zm9yKGk9MDtpPHNwYWNlO2krPTEpe2luZGVudCs9IiAifX1lbHNle2lmKHR5cGVvZiBzcGFjZT09PSJzdHJpbmciKXtpbmRlbnQ9c3BhY2V9fXJlcD1yZXBsYWNlcjtpZihyZXBsYWNlciYmdHlwZW9mIHJlcGxhY2VyIT09ImZ1bmN0aW9uIiYmKHR5cGVvZiByZXBsYWNlciE9PSJvYmplY3QifHx0eXBlb2YgcmVwbGFjZXIubGVuZ3RoIT09Im51bWJlciIpKXt0aHJvdyBuZXcgRXJyb3IoIiQuanFwbG90LkpTT04uc3RyaW5naWZ5Iil9cmV0dXJuIHN0cigiIix7IiI6dmFsdWV9KX19aWYodHlwZW9mICQuanFwbG90LkpTT04ucGFyc2UhPT0iZnVuY3Rpb24iKXskLmpxcGxvdC5KU09OLnBhcnNlPWZ1bmN0aW9uKHRleHQscmV2aXZlcil7dmFyIGo7ZnVuY3Rpb24gd2Fsayhob2xkZXIsa2V5KXt2YXIgayx2LHZhbHVlPWhvbGRlcltrZXldO2lmKHZhbHVlJiZ0eXBlb2YgdmFsdWU9PT0ib2JqZWN0Iil7Zm9yKGsgaW4gdmFsdWUpe2lmKE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLGspKXt2PXdhbGsodmFsdWUsayk7aWYodiE9PXVuZGVmaW5lZCl7dmFsdWVba109dn1lbHNle2RlbGV0ZSB2YWx1ZVtrXX19fX1yZXR1cm4gcmV2aXZlci5jYWxsKGhvbGRlcixrZXksdmFsdWUpfXRleHQ9U3RyaW5nKHRleHQpO2N4Lmxhc3RJbmRleD0wO2lmKGN4LnRlc3QodGV4dCkpe3RleHQ9dGV4dC5yZXBsYWNlKGN4LGZ1bmN0aW9uKGEpe3JldHVybiJcXHUiKygiMDAwMCIrYS5jaGFyQ29kZUF0KDApLnRvU3RyaW5nKDE2KSkuc2xpY2UoLTQpfSl9aWYoL15bXF0sOnt9XHNdKiQvLnRlc3QodGV4dC5yZXBsYWNlKC9cXCg/OlsiXFxcL2JmbnJ0XXx1WzAtOWEtZkEtRl17NH0pL2csIkAiKS5yZXBsYWNlKC8iW14iXFxcblxyXSoifHRydWV8ZmFsc2V8bnVsbHwtP1xkKyg/OlwuXGQqKT8oPzpbZUVdWytcLV0/XGQrKT8vZywiXSIpLnJlcGxhY2UoLyg/Ol58OnwsKSg/OlxzKlxbKSsvZywiIikpKXtqPWV2YWwoIigiK3RleHQrIikiKTtyZXR1cm4gdHlwZW9mIHJldml2ZXI9PT0iZnVuY3Rpb24iP3dhbGsoeyIiOmp9LCIiKTpqfXRocm93IG5ldyBTeW50YXhFcnJvcigiJC5qcXBsb3QuSlNPTi5wYXJzZSIpfX19KShqUXVlcnkpOw==]]></data>
	</file>
	<file>
	  <filename>/src/plugins/jqplot.logAxisRenderer.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqCiAqIGpxUGxvdAogKiBQdXJlIEphdmFTY3JpcHQgcGxvdHRpbmcgcGx1Z2luIHVzaW5nIGpRdWVyeQogKgogKiBWZXJzaW9uOiAxLjAuMGIyX3IxMDEyCiAqCiAqIENvcHlyaWdodCAoYykgMjAwOS0yMDExIENocmlzIExlb25lbGxvCiAqIGpxUGxvdCBpcyBjdXJyZW50bHkgYXZhaWxhYmxlIGZvciB1c2UgaW4gYWxsIHBlcnNvbmFsIG9yIGNvbW1lcmNpYWwgcHJvamVjdHMgCiAqIHVuZGVyIGJvdGggdGhlIE1JVCAoaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHApIGFuZCBHUEwgCiAqIHZlcnNpb24gMi4wIChodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC5odG1sKSBsaWNlbnNlcy4gVGhpcyBtZWFucyB0aGF0IHlvdSBjYW4gCiAqIGNob29zZSB0aGUgbGljZW5zZSB0aGF0IGJlc3Qgc3VpdHMgeW91ciBwcm9qZWN0IGFuZCB1c2UgaXQgYWNjb3JkaW5nbHkuIAogKgogKiBBbHRob3VnaCBub3QgcmVxdWlyZWQsIHRoZSBhdXRob3Igd291bGQgYXBwcmVjaWF0ZSBhbiBlbWFpbCBsZXR0aW5nIGhpbSAKICoga25vdyBvZiBhbnkgc3Vic3RhbnRpYWwgdXNlIG9mIGpxUGxvdC4gIFlvdSBjYW4gcmVhY2ggdGhlIGF1dGhvciBhdDogCiAqIGNocmlzIGF0IGpxcGxvdCBkb3QgY29tIG9yIHNlZSBodHRwOi8vd3d3LmpxcGxvdC5jb20vaW5mby5waHAgLgogKgogKiBJZiB5b3UgYXJlIGZlZWxpbmcga2luZCBhbmQgZ2VuZXJvdXMsIGNvbnNpZGVyIHN1cHBvcnRpbmcgdGhlIHByb2plY3QgYnkKICogbWFraW5nIGEgZG9uYXRpb24gYXQ6IGh0dHA6Ly93d3cuanFwbG90LmNvbS9kb25hdGUucGhwIC4KICoKICogc3ByaW50ZiBmdW5jdGlvbnMgY29udGFpbmVkIGluIGpxcGxvdC5zcHJpbnRmLmpzIGJ5IEFzaCBTZWFybGU6CiAqCiAqICAgICB2ZXJzaW9uIDIwMDcuMDQuMjcKICogICAgIGF1dGhvciBBc2ggU2VhcmxlCiAqICAgICBodHRwOi8vaGV4bWVuLmNvbS9ibG9nLzIwMDcvMDMvcHJpbnRmLXNwcmludGYvCiAqICAgICBodHRwOi8vaGV4bWVuLmNvbS9qcy9zcHJpbnRmLmpzCiAqICAgICBUaGUgYXV0aG9yIChBc2ggU2VhcmxlKSBoYXMgcGxhY2VkIHRoaXMgY29kZSBpbiB0aGUgcHVibGljIGRvbWFpbjoKICogICAgICJUaGlzIGNvZGUgaXMgdW5yZXN0cmljdGVkOiB5b3UgYXJlIGZyZWUgdG8gdXNlIGl0IGhvd2V2ZXIgeW91IGxpa2UuIgogKiAKICovCihmdW5jdGlvbigkKSB7CiAgICAvKioKICAgICogIGNsYXNzOiAkLmpxcGxvdC5Mb2dBeGlzUmVuZGVyZXIKICAgICogIEEgcGx1Z2luIGZvciBhIGpxUGxvdCB0byByZW5kZXIgYSBsb2dhcml0aG1pYyBheGlzLgogICAgKiAKICAgICogIFRvIHVzZSB0aGlzIHJlbmRlcmVyLCBpbmNsdWRlIHRoZSBwbHVnaW4gaW4geW91ciBzb3VyY2UKICAgICogID4gPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJqYXZhc2NyaXB0IiBzcmM9InBsdWdpbnMvanFwbG90LmxvZ0F4aXNSZW5kZXJlci5qcyI+PC9zY3JpcHQ+CiAgICAqICAKICAgICogIGFuZCBzdXBwbHkgdGhlIGFwcHJvcHJpYXRlIG9wdGlvbnMgdG8geW91ciBwbG90CiAgICAqICAKICAgICogID4ge2F4ZXM6e3hheGlzOntyZW5kZXJlcjokLmpxcGxvdC5Mb2dBeGlzUmVuZGVyZXJ9fX0KICAgICoqLyAKICAgICQuanFwbG90LkxvZ0F4aXNSZW5kZXJlciA9IGZ1bmN0aW9uKCkgewogICAgICAgICQuanFwbG90LkxpbmVhckF4aXNSZW5kZXJlci5jYWxsKHRoaXMpOwogICAgICAgIC8vIHByb3A6IGF4aXNEZWZhdWx0cwogICAgICAgIC8vIERlZmF1bHQgcHJvcGVydGllcyB3aGljaCB3aWxsIGJlIGFwcGxpZWQgZGlyZWN0bHkgdG8gdGhlIHNlcmllcy4KICAgICAgICAvLwogICAgICAgIC8vIEdyb3VwOiBQcm9wZXJ0aWVzCiAgICAgICAgLy8KICAgICAgICAvLyBQcm9wZXJ0aWVzCiAgICAgICAgLy8KICAgICAgICAvLyBiYXNlIC0gdGhlIGxvZ2FyaXRobWljIGJhc2UsIGNvbW1vbmx5IDIsIDEwIG9yIE1hdGguRQogICAgICAgIC8vIHRpY2tEaXN0cmlidXRpb24gLSBEZXByZWNhdGVkLiAgInBvd2VyIiBkaXN0cmlidXRpb24gb2YgdGlja3MKICAgICAgICAvLyBhbHdheXMgdXNlZC4gIE9wdGlvbiBoYXMgbm8gZWZmZWN0LgogICAgICAgIHRoaXMuYXhpc0RlZmF1bHRzID0gewogICAgICAgICAgICBiYXNlIDogMTAsCiAgICAgICAgICAgIHRpY2tEaXN0cmlidXRpb24gOidwb3dlcicKICAgICAgICB9OwogICAgfTsKICAgIAogICAgJC5qcXBsb3QuTG9nQXhpc1JlbmRlcmVyLnByb3RvdHlwZSA9IG5ldyAkLmpxcGxvdC5MaW5lYXJBeGlzUmVuZGVyZXIoKTsKICAgICQuanFwbG90LkxvZ0F4aXNSZW5kZXJlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSAkLmpxcGxvdC5Mb2dBeGlzUmVuZGVyZXI7CiAgICAKICAgICQuanFwbG90LkxvZ0F4aXNSZW5kZXJlci5wcm90b3R5cGUuaW5pdCA9IGZ1bmN0aW9uKG9wdGlvbnMpIHsKICAgICAgICAvLyBwcm9wOiBkcmF3QmFzZWxpbmUKICAgICAgICAvLyBUcnVlIHRvIGRyYXcgdGhlIGF4aXMgYmFzZWxpbmUuCiAgICAgICAgdGhpcy5kcmF3QmFzZWxpbmUgPSB0cnVlOwogICAgICAgIC8vIHByb3A6IG1pbm9yVGlja3MKICAgICAgICAvLyBOdW1iZXIgb2YgdGlja3MgdG8gYWRkIGJldHdlZW4gIm1ham9yIiB0aWNrcy4KICAgICAgICAvLyBNYWpvciB0aWNrcyBhcmUgdGlja3Mgc3VwcGxpZWQgYnkgdXNlciBvciBhdXRvIGNvbXB1dGVkLgogICAgICAgIC8vIE1pbm9yIHRpY2tzIGNhbm5vdCBiZSBjcmVhdGVkIGJ5IHVzZXIuCiAgICAgICAgdGhpcy5taW5vclRpY2tzID0gJ2F1dG8nOwogICAgICAgIHRoaXMuX3NjYWxlZmFjdCA9IDEuMDsKCiAgICAgICAgJC5leHRlbmQodHJ1ZSwgdGhpcywgb3B0aW9ucyk7CgogICAgICAgIHRoaXMuX2F1dG9Gb3JtYXRTdHJpbmcgPSAnJWQnOwogICAgICAgIHRoaXMuX292ZXJyaWRlRm9ybWF0U3RyaW5nID0gZmFsc2U7CgogICAgICAgIGZvciAodmFyIGQgaW4gdGhpcy5yZW5kZXJlci5heGlzRGVmYXVsdHMpIHsKICAgICAgICAgICAgaWYgKHRoaXNbZF0gPT0gbnVsbCkgewogICAgICAgICAgICAgICAgdGhpc1tkXSA9IHRoaXMucmVuZGVyZXIuYXhpc0RlZmF1bHRzW2RdOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICB0aGlzLnJlc2V0RGF0YUJvdW5kcygpOwogICAgfTsKICAgIAogICAgJC5qcXBsb3QuTG9nQXhpc1JlbmRlcmVyLnByb3RvdHlwZS5jcmVhdGVUaWNrcyA9IGZ1bmN0aW9uKHBsb3QpIHsKICAgICAgICAvLyB3ZSdyZSBhcmUgb3BlcmF0aW5nIG9uIGFuIGF4aXMgaGVyZQogICAgICAgIHZhciB0aWNrcyA9IHRoaXMuX3RpY2tzOwogICAgICAgIHZhciB1c2VyVGlja3MgPSB0aGlzLnRpY2tzOwogICAgICAgIHZhciBuYW1lID0gdGhpcy5uYW1lOwogICAgICAgIHZhciBkYiA9IHRoaXMuX2RhdGFCb3VuZHM7CiAgICAgICAgdmFyIGRpbSA9ICh0aGlzLm5hbWUuY2hhckF0KDApID09PSAneCcpID8gdGhpcy5fcGxvdERpbWVuc2lvbnMud2lkdGggOiB0aGlzLl9wbG90RGltZW5zaW9ucy5oZWlnaHQ7CiAgICAgICAgdmFyIGludGVydmFsOwogICAgICAgIHZhciBtaW4sIG1heDsKICAgICAgICB2YXIgcG9zMSwgcG9zMjsKICAgICAgICB2YXIgdHQsIGk7CgogICAgICAgIHZhciB0aHJlc2hvbGQgPSAzMDsKICAgICAgICAvLyBGb3Igc29tZSByZWFzb24gc2NhbGVmYWN0b3IgaXMgc2NyZXdpbmcgdXAgdGlja3MuCiAgICAgICAgdGhpcy5fc2NhbGVmYWN0ID0gIChNYXRoLm1heChkaW0sIHRocmVzaG9sZCsxKSAtIHRocmVzaG9sZCkvMzAwOwoKICAgICAgICAvLyBpZiB3ZSBhbHJlYWR5IGhhdmUgdGlja3MsIHVzZSB0aGVtLgogICAgICAgIC8vIHRpY2tzIG11c3QgYmUgaW4gb3JkZXIgb2YgaW5jcmVhc2luZyB2YWx1ZS4KICAgICAgICBpZiAodXNlclRpY2tzLmxlbmd0aCkgewogICAgICAgICAgICAvLyB0aWNrcyBjb3VsZCBiZSAxRCBvciAyRCBhcnJheSBvZiBbdmFsLCB2YWwsICwsLF0gb3IgW1t2YWwsIGxhYmVsXSwgW3ZhbCwgbGFiZWxdLCAuLi5dIG9yIG1peGVkCiAgICAgICAgICAgIGZvciAoaT0wOyBpPHVzZXJUaWNrcy5sZW5ndGg7IGkrKyl7CiAgICAgICAgICAgICAgICB2YXIgdXQgPSB1c2VyVGlja3NbaV07CiAgICAgICAgICAgICAgICB2YXIgdCA9IG5ldyB0aGlzLnRpY2tSZW5kZXJlcih0aGlzLnRpY2tPcHRpb25zKTsKICAgICAgICAgICAgICAgIGlmICh1dC5jb25zdHJ1Y3RvciA9PSBBcnJheSkgewogICAgICAgICAgICAgICAgICAgIHQudmFsdWUgPSB1dFswXTsKICAgICAgICAgICAgICAgICAgICB0LmxhYmVsID0gdXRbMV07CiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLnNob3dUaWNrcykgewogICAgICAgICAgICAgICAgICAgICAgICB0LnNob3dMYWJlbCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICB0LnNob3dNYXJrID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCF0aGlzLnNob3dUaWNrTWFya3MpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdC5zaG93TWFyayA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB0LnNldFRpY2sodXRbMF0sIHRoaXMubmFtZSk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGlja3MucHVzaCh0KTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBlbHNlIGlmICgkLmlzUGxhaW5PYmplY3QodXQpKSB7CiAgICAgICAgICAgICAgICAgICAgJC5leHRlbmQodHJ1ZSwgdCwgdXQpOwogICAgICAgICAgICAgICAgICAgIHQuYXhpcyA9IHRoaXMubmFtZTsKICAgICAgICAgICAgICAgICAgICB0aGlzLl90aWNrcy5wdXNoKHQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0LnZhbHVlID0gdXQ7CiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLnNob3dUaWNrcykgewogICAgICAgICAgICAgICAgICAgICAgICB0LnNob3dMYWJlbCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICB0LnNob3dNYXJrID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCF0aGlzLnNob3dUaWNrTWFya3MpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdC5zaG93TWFyayA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB0LnNldFRpY2sodXQsIHRoaXMubmFtZSk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGlja3MucHVzaCh0KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLm51bWJlclRpY2tzID0gdXNlclRpY2tzLmxlbmd0aDsKICAgICAgICAgICAgdGhpcy5taW4gPSB0aGlzLl90aWNrc1swXS52YWx1ZTsKICAgICAgICAgICAgdGhpcy5tYXggPSB0aGlzLl90aWNrc1t0aGlzLm51bWJlclRpY2tzLTFdLnZhbHVlOwogICAgICAgIH0KICAgICAgICAKICAgICAgICAvLyB3ZSBkb24ndCBoYXZlIGFueSB0aWNrcyB5ZXQsIGxldCdzIG1ha2Ugc29tZSEKICAgICAgICBlbHNlIGlmICh0aGlzLm1pbiA9PSBudWxsICYmIHRoaXMubWF4ID09IG51bGwpIHsKICAgICAgICAgICAgbWluID0gZGIubWluICogKDIgLSB0aGlzLnBhZE1pbik7CiAgICAgICAgICAgIG1heCA9IGRiLm1heCAqIHRoaXMucGFkTWF4OwogICAgICAgICAgICAKICAgICAgICAgICAgLy8gaWYgbWluIGFuZCBtYXggYXJlIHNhbWUsIHNwYWNlIHRoZW0gb3V0IGEgYml0CiAgICAgICAgICAgIGlmIChtaW4gPT0gbWF4KSB7CiAgICAgICAgICAgICAgICB2YXIgYWRqID0gMC4wNTsKICAgICAgICAgICAgICAgIG1pbiA9IG1pbiooMS1hZGopOwogICAgICAgICAgICAgICAgbWF4ID0gbWF4KigxK2Fkaik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgICAgIC8vIHBlcmZvcm0gc29tZSBjaGVja3MKICAgICAgICAgICAgaWYgKHRoaXMubWluICE9IG51bGwgJiYgdGhpcy5taW4gPD0gMCkgewogICAgICAgICAgICAgICAgdGhyb3coJ2xvZyBheGlzIG1pbmltdW0gbXVzdCBiZSBncmVhdGVyIHRoYW4gMCcpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0aGlzLm1heCAhPSBudWxsICYmIHRoaXMubWF4IDw9IDApIHsKICAgICAgICAgICAgICAgIHRocm93KCdsb2cgYXhpcyBtYXhpbXVtIG11c3QgYmUgZ3JlYXRlciB0aGFuIDAnKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZnVuY3Rpb24gZmluZENlaWwgKHZhbCkgewogICAgICAgICAgICAgICAgdmFyIG9yZGVyID0gTWF0aC5wb3coMTAsIE1hdGguZmxvb3IoTWF0aC5sb2codmFsKS9NYXRoLkxOMTApKTsKICAgICAgICAgICAgICAgIHJldHVybiBNYXRoLmNlaWwodmFsL29yZGVyKSAqIG9yZGVyOwogICAgICAgICAgICB9CgogICAgICAgICAgICBmdW5jdGlvbiBmaW5kRmxvb3IodmFsKSB7CiAgICAgICAgICAgICAgICB2YXIgb3JkZXIgPSBNYXRoLnBvdygxMCwgTWF0aC5mbG9vcihNYXRoLmxvZyh2YWwpL01hdGguTE4xMCkpOwogICAgICAgICAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IodmFsL29yZGVyKSAqIG9yZGVyOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyB2YXIgcmFuZ2UgPSBtYXggLSBtaW47CiAgICAgICAgICAgIHZhciBybWluLCBybWF4OwoKICAgICAgICAgICAgLy8gZm9yIHBvd2VyIGRpc3RyaWJ1dGlvbiwgb3BlbiB1cCByYW5nZSB0byBnZXQgYSBuaWNlIHBvd2VyIG9mIGF4aXMucmVuZGVyZXIuYmFzZS4KICAgICAgICAgICAgLy8gcG93ZXIgZGlzdHJpYnV0aW9uIHdvbid0IHJlc3BlY3QgdGhlIHVzZXIncyBtaW4vbWF4IHNldHRpbmdzLgogICAgICAgICAgICBybWluID0gTWF0aC5wb3codGhpcy5iYXNlLCBNYXRoLmZsb29yKE1hdGgubG9nKG1pbikvTWF0aC5sb2codGhpcy5iYXNlKSkpOwogICAgICAgICAgICBybWF4ID0gTWF0aC5wb3codGhpcy5iYXNlLCBNYXRoLmNlaWwoTWF0aC5sb2cobWF4KS9NYXRoLmxvZyh0aGlzLmJhc2UpKSk7CgogICAgICAgICAgICAvLyAvLyBpZiBtaW4gYW5kIG1heCBhcmUgc2FtZSwgc3BhY2UgdGhlbSBvdXQgYSBiaXQKICAgICAgICAgICAgLy8gaWYgKHJtaW4gPT09IHJtYXgpIHsKICAgICAgICAgICAgLy8gICAgIHZhciBhZGogPSAwLjA1OwogICAgICAgICAgICAvLyAgICAgcm1pbiA9IHJtaW4qKDEtYWRqKTsKICAgICAgICAgICAgLy8gICAgIHJtYXggPSBybWF4KigxK2Fkaik7CiAgICAgICAgICAgIC8vIH0KCiAgICAgICAgICAgIHZhciBvcmRlciA9IE1hdGgucm91bmQoTWF0aC5sb2cocm1pbikvTWF0aC5MTjEwKTsKCiAgICAgICAgICAgIGlmICh0aGlzLnRpY2tPcHRpb25zID09IG51bGwgfHwgIXRoaXMudGlja09wdGlvbnMuZm9ybWF0U3RyaW5nKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9vdmVycmlkZUZvcm1hdFN0cmluZyA9IHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMubWluID0gcm1pbjsKICAgICAgICAgICAgdGhpcy5tYXggPSBybWF4OwogICAgICAgICAgICB2YXIgcmFuZ2UgPSB0aGlzLm1heCAtIHRoaXMubWluOyAgICAgICAgICAgIAoKICAgICAgICAgICAgdmFyIG1pbm9yVGlja3MgPSAodGhpcy5taW5vclRpY2tzID09PSAnYXV0bycpID8gMCA6IHRoaXMubWlub3JUaWNrczsKICAgICAgICAgICAgdmFyIG51bWJlclRpY2tzOwogICAgICAgICAgICBpZiAodGhpcy5udW1iZXJUaWNrcyA9PSBudWxsKXsKICAgICAgICAgICAgICAgIGlmIChkaW0gPiAxNDApIHsKICAgICAgICAgICAgICAgICAgICBudW1iZXJUaWNrcyA9IE1hdGgucm91bmQoTWF0aC5sb2codGhpcy5tYXgvdGhpcy5taW4pL01hdGgubG9nKHRoaXMuYmFzZSkgKyAxKTsKICAgICAgICAgICAgICAgICAgICBpZiAobnVtYmVyVGlja3MgPCAyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlclRpY2tzID0gMjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKG1pbm9yVGlja3MgPT09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRlbXAgPSBkaW0vKG51bWJlclRpY2tzIC0gMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ZW1wIDwgMTAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5vclRpY2tzID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0ZW1wIDwgMTkwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5vclRpY2tzID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0ZW1wIDwgMjUwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5vclRpY2tzID0gMzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0ZW1wIDwgNjAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5vclRpY2tzID0gNDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbm9yVGlja3MgPSA5OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgbnVtYmVyVGlja3MgPSAyOwogICAgICAgICAgICAgICAgICAgIGlmIChtaW5vclRpY2tzID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1pbm9yVGlja3MgPSAxOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBtaW5vclRpY2tzID0gMDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIG51bWJlclRpY2tzID0gdGhpcy5udW1iZXJUaWNrczsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKG9yZGVyID49IDAgJiYgbWlub3JUaWNrcyAhPT0gMykgewogICAgICAgICAgICAgICAgdGhpcy5fYXV0b0Zvcm1hdFN0cmluZyA9ICclZCc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gQWRqdXN0IGZvcm1hdCBzdHJpbmcgZm9yIGNhc2Ugd2l0aCAzIHRpY2tzIHdoZXJlIHdlJ2xsIGhhdmUgbGlrZSAxLCAyLjUsIDUsIDcuNSwgMTAKICAgICAgICAgICAgZWxzZSBpZiAob3JkZXIgPD0gMCAmJiBtaW5vclRpY2tzID09PSAzKSB7CiAgICAgICAgICAgICAgICB2YXIgdGVtcCA9IC0ob3JkZXIgLSAxKTsKICAgICAgICAgICAgICAgIHRoaXMuX2F1dG9Gb3JtYXRTdHJpbmcgPSAnJS4nKyBNYXRoLmFicyhvcmRlci0xKSArICdmJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gQWRqdXN0IGZvcm1hdCBzdHJpbmcgZm9yIHZhbHVlcyBsZXNzIHRoYW4gMS4KICAgICAgICAgICAgZWxzZSBpZiAob3JkZXIgPCAwKSB7CiAgICAgICAgICAgICAgICB2YXIgdGVtcCA9IC1vcmRlcjsKICAgICAgICAgICAgICAgIHRoaXMuX2F1dG9Gb3JtYXRTdHJpbmcgPSAnJS4nKyBNYXRoLmFicyhvcmRlcikgKyAnZic7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgdGhpcy5fYXV0b0Zvcm1hdFN0cmluZyA9ICclZCc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciB0bywgdCwgdmFsLCB0dDEsIHNwcmVhZCwgaW50ZXJ2YWw7CiAgICAgICAgICAgIGZvciAodmFyIGk9MDsgaTxudW1iZXJUaWNrczsgaSsrKXsKICAgICAgICAgICAgICAgIHR0ID0gTWF0aC5wb3codGhpcy5iYXNlLCBpIC0gbnVtYmVyVGlja3MgKyAxKSAqIHRoaXMubWF4OwoKICAgICAgICAgICAgICAgIHQgPSBuZXcgdGhpcy50aWNrUmVuZGVyZXIodGhpcy50aWNrT3B0aW9ucyk7CiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgaWYgKHRoaXMuX292ZXJyaWRlRm9ybWF0U3RyaW5nKSB7CiAgICAgICAgICAgICAgICAgICAgdC5mb3JtYXRTdHJpbmcgPSB0aGlzLl9hdXRvRm9ybWF0U3RyaW5nOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuc2hvd1RpY2tzKSB7CiAgICAgICAgICAgICAgICAgICAgdC5zaG93TGFiZWwgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB0LnNob3dNYXJrID0gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICghdGhpcy5zaG93VGlja01hcmtzKSB7CiAgICAgICAgICAgICAgICAgICAgdC5zaG93TWFyayA9IGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdC5zZXRUaWNrKHR0LCB0aGlzLm5hbWUpOwogICAgICAgICAgICAgICAgdGhpcy5fdGlja3MucHVzaCh0KTsKCiAgICAgICAgICAgICAgICBpZiAobWlub3JUaWNrcyAmJiBpPG51bWJlclRpY2tzLTEpIHsKICAgICAgICAgICAgICAgICAgICB0dDEgPSBNYXRoLnBvdyh0aGlzLmJhc2UsIGkgLSBudW1iZXJUaWNrcyArIDIpICogdGhpcy5tYXg7CiAgICAgICAgICAgICAgICAgICAgc3ByZWFkID0gdHQxIC0gdHQ7CiAgICAgICAgICAgICAgICAgICAgaW50ZXJ2YWwgPSB0dDEgLyAobWlub3JUaWNrcysxKTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBqPW1pbm9yVGlja3MtMTsgaj49MDsgai0tKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IHR0MS1pbnRlcnZhbCooaisxKTsKICAgICAgICAgICAgICAgICAgICAgICAgdCA9IG5ldyB0aGlzLnRpY2tSZW5kZXJlcih0aGlzLnRpY2tPcHRpb25zKTsKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9vdmVycmlkZUZvcm1hdFN0cmluZyAmJiB0aGlzLl9hdXRvRm9ybWF0U3RyaW5nICE9ICcnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LmZvcm1hdFN0cmluZyA9IHRoaXMuX2F1dG9Gb3JtYXRTdHJpbmc7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLnNob3dUaWNrcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5zaG93TGFiZWwgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuc2hvd01hcmsgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICghdGhpcy5zaG93VGlja01hcmtzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnNob3dNYXJrID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgdC5zZXRUaWNrKHZhbCwgdGhpcy5uYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGlja3MucHVzaCh0KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9ICAgICAgIAogICAgICAgICAgICB9ICAgICAKICAgICAgICB9CgogICAgICAgIC8vIG1pbiBhbmQgbWF4IGFyZSBzZXQgYXMgd291bGQgYmUgdGhlIGNhc2Ugd2l0aCB6b29taW5nCiAgICAgICAgZWxzZSBpZiAodGhpcy5taW4gIT0gbnVsbCAmJiB0aGlzLm1heCAhPSBudWxsKSB7CiAgICAgICAgICAgIHZhciBvcHRzID0gJC5leHRlbmQodHJ1ZSwge30sIHRoaXMudGlja09wdGlvbnMsIHtuYW1lOiB0aGlzLm5hbWUsIHZhbHVlOiBudWxsfSk7CiAgICAgICAgICAgIHZhciBudCwgdGk7CiAgICAgICAgICAgIC8vIGRvbid0IGhhdmUgYW4gaW50ZXJ2YWwgeWV0LCBwaWNrIG9uZSB0aGF0IGdpdmVzIHRoZSBtb3N0CiAgICAgICAgICAgIC8vICJyb3VuZCIgdGlja3Mgd2UgY2FuIGdldC4KICAgICAgICAgICAgaWYgKHRoaXMubnVtYmVyVGlja3MgPT0gbnVsbCAmJiB0aGlzLnRpY2tJbnRlcnZhbCA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAvLyB2YXIgdGhyZXNob2xkID0gMzA7CiAgICAgICAgICAgICAgICB2YXIgdGRpbSA9IE1hdGgubWF4KGRpbSwgdGhyZXNob2xkKzEpOwogICAgICAgICAgICAgICAgdmFyIG50dGFyZ2V0ID0gIE1hdGguY2VpbCgodGRpbS10aHJlc2hvbGQpLzM1ICsgMSk7CgogICAgICAgICAgICAgICAgdmFyIHJldCA9ICQuanFwbG90LkxpbmVhclRpY2tHZW5lcmF0b3IuYmVzdENvbnN0cmFpbmVkSW50ZXJ2YWwodGhpcy5taW4sIHRoaXMubWF4LCBudHRhcmdldCk7CgogICAgICAgICAgICAgICAgdGhpcy5fYXV0b0Zvcm1hdFN0cmluZyA9IHJldFszXTsKICAgICAgICAgICAgICAgIG50ID0gcmV0WzJdOwogICAgICAgICAgICAgICAgdGkgPSByZXRbNF07CgogICAgICAgICAgICAgICAgZm9yICh2YXIgaT0wOyBpPG50OyBpKyspIHsKICAgICAgICAgICAgICAgICAgICBvcHRzLnZhbHVlID0gdGhpcy5taW4gKyBpICogdGk7CiAgICAgICAgICAgICAgICAgICAgdCA9IG5ldyB0aGlzLnRpY2tSZW5kZXJlcihvcHRzKTsKICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fb3ZlcnJpZGVGb3JtYXRTdHJpbmcgJiYgdGhpcy5fYXV0b0Zvcm1hdFN0cmluZyAhPSAnJykgewogICAgICAgICAgICAgICAgICAgICAgICB0LmZvcm1hdFN0cmluZyA9IHRoaXMuX2F1dG9Gb3JtYXRTdHJpbmc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5zaG93VGlja3MpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdC5zaG93TGFiZWwgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgdC5zaG93TWFyayA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICghdGhpcy5zaG93VGlja01hcmtzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHQuc2hvd01hcmsgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGlja3MucHVzaCh0KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gZm9yIGxvb3NlIHpvb20sIG51bWJlciB0aWNrcyBhbmQgaW50ZXJ2YWwgYXJlIGFsc28gc2V0LgogICAgICAgICAgICBlbHNlIGlmICh0aGlzLm51bWJlclRpY2tzICE9IG51bGwgJiYgdGhpcy50aWNrSW50ZXJ2YWwgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgbnQgPSB0aGlzLm51bWJlclRpY2tzOwogICAgICAgICAgICAgICAgZm9yICh2YXIgaT0wOyBpPG50OyBpKyspIHsKICAgICAgICAgICAgICAgICAgICBvcHRzLnZhbHVlID0gdGhpcy5taW4gKyBpICogdGhpcy50aWNrSW50ZXJ2YWw7CiAgICAgICAgICAgICAgICAgICAgdCA9IG5ldyB0aGlzLnRpY2tSZW5kZXJlcihvcHRzKTsKICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fb3ZlcnJpZGVGb3JtYXRTdHJpbmcgJiYgdGhpcy5fYXV0b0Zvcm1hdFN0cmluZyAhPSAnJykgewogICAgICAgICAgICAgICAgICAgICAgICB0LmZvcm1hdFN0cmluZyA9IHRoaXMuX2F1dG9Gb3JtYXRTdHJpbmc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5zaG93VGlja3MpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdC5zaG93TGFiZWwgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgdC5zaG93TWFyayA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICghdGhpcy5zaG93VGlja01hcmtzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHQuc2hvd01hcmsgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGlja3MucHVzaCh0KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH07CiAgICAKICAgICQuanFwbG90LkxvZ0F4aXNSZW5kZXJlci5wcm90b3R5cGUucGFjayA9IGZ1bmN0aW9uKHBvcywgb2Zmc2V0cykgewogICAgICAgIHZhciBsYiA9IHBhcnNlSW50KHRoaXMuYmFzZSwgMTApOwogICAgICAgIHZhciB0aWNrcyA9IHRoaXMuX3RpY2tzOwogICAgICAgIHZhciB0cmFucyA9IGZ1bmN0aW9uICh2KSB7IHJldHVybiBNYXRoLmxvZyh2KS9NYXRoLmxvZyhsYik7IH07CiAgICAgICAgdmFyIGludnRyYW5zID0gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIE1hdGgucG93KE1hdGguRSwgKE1hdGgubG9nKGxiKSp2KSk7IH07CiAgICAgICAgdmFyIG1heCA9IHRyYW5zKHRoaXMubWF4KTsKICAgICAgICB2YXIgbWluID0gdHJhbnModGhpcy5taW4pOwogICAgICAgIHZhciBvZmZtYXggPSBvZmZzZXRzLm1heDsKICAgICAgICB2YXIgb2ZmbWluID0gb2Zmc2V0cy5taW47CiAgICAgICAgdmFyIGxzaG93ID0gKHRoaXMuX2xhYmVsID09IG51bGwpID8gZmFsc2UgOiB0aGlzLl9sYWJlbC5zaG93OwogICAgICAgIAogICAgICAgIGZvciAodmFyIHAgaW4gcG9zKSB7CiAgICAgICAgICAgIHRoaXMuX2VsZW0uY3NzKHAsIHBvc1twXSk7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIHRoaXMuX29mZnNldHMgPSBvZmZzZXRzOwogICAgICAgIC8vIHBpeGVsbGVuZ3RoIHdpbGwgYmUgKyBmb3IgeCBheGVzIGFuZCAtIGZvciB5IGF4ZXMgYmVjYXN1ZSBwaXhlbHMgYWx3YXlzIG1lYXN1cmVkIGZyb20gdG9wIGxlZnQuCiAgICAgICAgdmFyIHBpeGVsbGVuZ3RoID0gb2ZmbWF4IC0gb2ZmbWluOwogICAgICAgIHZhciB1bml0bGVuZ3RoID0gbWF4IC0gbWluOwogICAgICAgIAogICAgICAgIC8vIHBvaW50IHRvIHVuaXQgYW5kIHVuaXQgdG8gcG9pbnQgY29udmVyc2lvbnMgcmVmZXJlbmNlcyB0byBQbG90IERPTSBlbGVtZW50IHRvcCBsZWZ0IGNvcm5lci4KICAgICAgICB0aGlzLnAydSA9IGZ1bmN0aW9uKHApewogICAgICAgICAgICByZXR1cm4gaW52dHJhbnMoKHAgLSBvZmZtaW4pICogdW5pdGxlbmd0aCAvIHBpeGVsbGVuZ3RoICsgbWluKTsKICAgICAgICB9OwogICAgICAgIAogICAgICAgIHRoaXMudTJwID0gZnVuY3Rpb24odSl7CiAgICAgICAgICAgIHJldHVybiAodHJhbnModSkgLSBtaW4pICogcGl4ZWxsZW5ndGggLyB1bml0bGVuZ3RoICsgb2ZmbWluOwogICAgICAgIH07CiAgICAgICAgCiAgICAgICAgaWYgKHRoaXMubmFtZSA9PSAneGF4aXMnIHx8IHRoaXMubmFtZSA9PSAneDJheGlzJyl7CiAgICAgICAgICAgIHRoaXMuc2VyaWVzX3UycCA9IGZ1bmN0aW9uKHUpewogICAgICAgICAgICAgICAgcmV0dXJuICh0cmFucyh1KSAtIG1pbikgKiBwaXhlbGxlbmd0aCAvIHVuaXRsZW5ndGg7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHRoaXMuc2VyaWVzX3AydSA9IGZ1bmN0aW9uKHApewogICAgICAgICAgICAgICAgcmV0dXJuIGludnRyYW5zKHAgKiB1bml0bGVuZ3RoIC8gcGl4ZWxsZW5ndGggKyBtaW4pOwogICAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICAvLyB5YXhpcyBpcyBtYXggYXQgdG9wIG9mIGNhbnZhcy4KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgdGhpcy5zZXJpZXNfdTJwID0gZnVuY3Rpb24odSl7CiAgICAgICAgICAgICAgICByZXR1cm4gKHRyYW5zKHUpIC0gbWF4KSAqIHBpeGVsbGVuZ3RoIC8gdW5pdGxlbmd0aDsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgdGhpcy5zZXJpZXNfcDJ1ID0gZnVuY3Rpb24ocCl7CiAgICAgICAgICAgICAgICByZXR1cm4gaW52dHJhbnMocCAqIHVuaXRsZW5ndGggLyBwaXhlbGxlbmd0aCArIG1heCk7CiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmICh0aGlzLnNob3cpIHsKICAgICAgICAgICAgaWYgKHRoaXMubmFtZSA9PSAneGF4aXMnIHx8IHRoaXMubmFtZSA9PSAneDJheGlzJykgewogICAgICAgICAgICAgICAgZm9yICh2YXIgaT0wOyBpPHRpY2tzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB0aWNrc1tpXTsKICAgICAgICAgICAgICAgICAgICBpZiAodC5zaG93ICYmIHQuc2hvd0xhYmVsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzaGltOwogICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQuY29uc3RydWN0b3IgPT0gJC5qcXBsb3QuQ2FudmFzQXhpc1RpY2tSZW5kZXJlciAmJiB0LmFuZ2xlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHQubGFiZWxQb3NpdGlvbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2F1dG8nOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwb3NpdGlvbiBhdCBlbmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQuYW5nbGUgPCAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGltID0gLXQuZ2V0V2lkdGgoKSArIHQuX3RleHRSZW5kZXJlci5oZWlnaHQgKiBNYXRoLnNpbigtdC5fdGV4dFJlbmRlcmVyLmFuZ2xlKSAvIDI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcG9zaXRpb24gYXQgc3RhcnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGltID0gLXQuX3RleHRSZW5kZXJlci5oZWlnaHQgKiBNYXRoLnNpbih0Ll90ZXh0UmVuZGVyZXIuYW5nbGUpIC8gMjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdlbmQnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGltID0gLXQuZ2V0V2lkdGgoKSArIHQuX3RleHRSZW5kZXJlci5oZWlnaHQgKiBNYXRoLnNpbigtdC5fdGV4dFJlbmRlcmVyLmFuZ2xlKSAvIDI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3N0YXJ0JzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hpbSA9IC10Ll90ZXh0UmVuZGVyZXIuaGVpZ2h0ICogTWF0aC5zaW4odC5fdGV4dFJlbmRlcmVyLmFuZ2xlKSAvIDI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ21pZGRsZSc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoaW0gPSAtdC5nZXRXaWR0aCgpLzIgKyB0Ll90ZXh0UmVuZGVyZXIuaGVpZ2h0ICogTWF0aC5zaW4oLXQuX3RleHRSZW5kZXJlci5hbmdsZSkgLyAyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGltID0gLXQuZ2V0V2lkdGgoKS8yICsgdC5fdGV4dFJlbmRlcmVyLmhlaWdodCAqIE1hdGguc2luKC10Ll90ZXh0UmVuZGVyZXIuYW5nbGUpIC8gMjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGltID0gLXQuZ2V0V2lkdGgoKS8yOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHZhciBzaGltID0gdC5nZXRXaWR0aCgpLzI7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2YWwgPSB0aGlzLnUycCh0LnZhbHVlKSArIHNoaW0gKyAncHgnOwogICAgICAgICAgICAgICAgICAgICAgICB0Ll9lbGVtLmNzcygnbGVmdCcsIHZhbCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHQucGFjaygpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChsc2hvdykgewogICAgICAgICAgICAgICAgICAgIHZhciB3ID0gdGhpcy5fbGFiZWwuX2VsZW0ub3V0ZXJXaWR0aCh0cnVlKTsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9sYWJlbC5fZWxlbS5jc3MoJ2xlZnQnLCBvZmZtaW4gKyBwaXhlbGxlbmd0aC8yIC0gdy8yICsgJ3B4Jyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubmFtZSA9PSAneGF4aXMnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2xhYmVsLl9lbGVtLmNzcygnYm90dG9tJywgJzBweCcpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbGFiZWwuX2VsZW0uY3NzKCd0b3AnLCAnMHB4Jyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHRoaXMuX2xhYmVsLnBhY2soKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIGk9MDsgaTx0aWNrcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgIHZhciB0ID0gdGlja3NbaV07CiAgICAgICAgICAgICAgICAgICAgaWYgKHQuc2hvdyAmJiB0LnNob3dMYWJlbCkgeyAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2hpbTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQuY29uc3RydWN0b3IgPT0gJC5qcXBsb3QuQ2FudmFzQXhpc1RpY2tSZW5kZXJlciAmJiB0LmFuZ2xlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHQubGFiZWxQb3NpdGlvbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2F1dG8nOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwb3NpdGlvbiBhdCBlbmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdlbmQnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodC5hbmdsZSA8IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoaW0gPSAtdC5fdGV4dFJlbmRlcmVyLmhlaWdodCAqIE1hdGguY29zKC10Ll90ZXh0UmVuZGVyZXIuYW5nbGUpIC8gMjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoaW0gPSAtdC5nZXRIZWlnaHQoKSArIHQuX3RleHRSZW5kZXJlci5oZWlnaHQgKiBNYXRoLmNvcyh0Ll90ZXh0UmVuZGVyZXIuYW5nbGUpIC8gMjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdzdGFydCc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0LmFuZ2xlID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hpbSA9IC10Ll90ZXh0UmVuZGVyZXIuaGVpZ2h0ICogTWF0aC5jb3MoLXQuX3RleHRSZW5kZXJlci5hbmdsZSkgLyAyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hpbSA9IC10LmdldEhlaWdodCgpICsgdC5fdGV4dFJlbmRlcmVyLmhlaWdodCAqIE1hdGguY29zKHQuX3RleHRSZW5kZXJlci5hbmdsZSkgLyAyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ21pZGRsZSc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmICh0LmFuZ2xlID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgc2hpbSA9IC10LmdldEhlaWdodCgpLzIgKyB0Ll90ZXh0UmVuZGVyZXIuaGVpZ2h0ICogTWF0aC5zaW4oLXQuX3RleHRSZW5kZXJlci5hbmdsZSkgLyAyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgc2hpbSA9IC10LmdldEhlaWdodCgpLzIgLSB0Ll90ZXh0UmVuZGVyZXIuaGVpZ2h0ICogTWF0aC5zaW4odC5fdGV4dFJlbmRlcmVyLmFuZ2xlKSAvIDI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hpbSA9IC10LmdldEhlaWdodCgpLzI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoaW0gPSAtdC5nZXRIZWlnaHQoKS8yOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoaW0gPSAtdC5nZXRIZWlnaHQoKS8yOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdmFsID0gdGhpcy51MnAodC52YWx1ZSkgKyBzaGltICsgJ3B4JzsKICAgICAgICAgICAgICAgICAgICAgICAgdC5fZWxlbS5jc3MoJ3RvcCcsIHZhbCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHQucGFjaygpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChsc2hvdykgewogICAgICAgICAgICAgICAgICAgIHZhciBoID0gdGhpcy5fbGFiZWwuX2VsZW0ub3V0ZXJIZWlnaHQodHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbGFiZWwuX2VsZW0uY3NzKCd0b3AnLCBvZmZtYXggLSBwaXhlbGxlbmd0aC8yIC0gaC8yICsgJ3B4Jyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubmFtZSA9PSAneWF4aXMnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2xhYmVsLl9lbGVtLmNzcygnbGVmdCcsICcwcHgnKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2xhYmVsLl9lbGVtLmNzcygncmlnaHQnLCAnMHB4Jyk7CiAgICAgICAgICAgICAgICAgICAgfSAgIAogICAgICAgICAgICAgICAgICAgIHRoaXMuX2xhYmVsLnBhY2soKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0gICAgICAgIAogICAgfTsKfSkoalF1ZXJ5KTs=]]></data>
	</file>
	<file>
	  <filename>/src/plugins/jqplot.logAxisRenderer.min.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqCiAqIGpxUGxvdAogKiBQdXJlIEphdmFTY3JpcHQgcGxvdHRpbmcgcGx1Z2luIHVzaW5nIGpRdWVyeQogKgogKiBWZXJzaW9uOiAxLjAuMGIyX3IxMDEyCiAqCiAqIENvcHlyaWdodCAoYykgMjAwOS0yMDExIENocmlzIExlb25lbGxvCiAqIGpxUGxvdCBpcyBjdXJyZW50bHkgYXZhaWxhYmxlIGZvciB1c2UgaW4gYWxsIHBlcnNvbmFsIG9yIGNvbW1lcmNpYWwgcHJvamVjdHMgCiAqIHVuZGVyIGJvdGggdGhlIE1JVCAoaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHApIGFuZCBHUEwgCiAqIHZlcnNpb24gMi4wIChodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC5odG1sKSBsaWNlbnNlcy4gVGhpcyBtZWFucyB0aGF0IHlvdSBjYW4gCiAqIGNob29zZSB0aGUgbGljZW5zZSB0aGF0IGJlc3Qgc3VpdHMgeW91ciBwcm9qZWN0IGFuZCB1c2UgaXQgYWNjb3JkaW5nbHkuIAogKgogKiBBbHRob3VnaCBub3QgcmVxdWlyZWQsIHRoZSBhdXRob3Igd291bGQgYXBwcmVjaWF0ZSBhbiBlbWFpbCBsZXR0aW5nIGhpbSAKICoga25vdyBvZiBhbnkgc3Vic3RhbnRpYWwgdXNlIG9mIGpxUGxvdC4gIFlvdSBjYW4gcmVhY2ggdGhlIGF1dGhvciBhdDogCiAqIGNocmlzIGF0IGpxcGxvdCBkb3QgY29tIG9yIHNlZSBodHRwOi8vd3d3LmpxcGxvdC5jb20vaW5mby5waHAgLgogKgogKiBJZiB5b3UgYXJlIGZlZWxpbmcga2luZCBhbmQgZ2VuZXJvdXMsIGNvbnNpZGVyIHN1cHBvcnRpbmcgdGhlIHByb2plY3QgYnkKICogbWFraW5nIGEgZG9uYXRpb24gYXQ6IGh0dHA6Ly93d3cuanFwbG90LmNvbS9kb25hdGUucGhwIC4KICoKICogc3ByaW50ZiBmdW5jdGlvbnMgY29udGFpbmVkIGluIGpxcGxvdC5zcHJpbnRmLmpzIGJ5IEFzaCBTZWFybGU6CiAqCiAqICAgICB2ZXJzaW9uIDIwMDcuMDQuMjcKICogICAgIGF1dGhvciBBc2ggU2VhcmxlCiAqICAgICBodHRwOi8vaGV4bWVuLmNvbS9ibG9nLzIwMDcvMDMvcHJpbnRmLXNwcmludGYvCiAqICAgICBodHRwOi8vaGV4bWVuLmNvbS9qcy9zcHJpbnRmLmpzCiAqICAgICBUaGUgYXV0aG9yIChBc2ggU2VhcmxlKSBoYXMgcGxhY2VkIHRoaXMgY29kZSBpbiB0aGUgcHVibGljIGRvbWFpbjoKICogICAgICJUaGlzIGNvZGUgaXMgdW5yZXN0cmljdGVkOiB5b3UgYXJlIGZyZWUgdG8gdXNlIGl0IGhvd2V2ZXIgeW91IGxpa2UuIgogKgogKiBpbmNsdWRlZCBqc0RhdGUgbGlicmFyeSBieSBDaHJpcyBMZW9uZWxsbzoKICoKICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEgQ2hyaXMgTGVvbmVsbG8KICoKICoganNEYXRlIGlzIGN1cnJlbnRseSBhdmFpbGFibGUgZm9yIHVzZSBpbiBhbGwgcGVyc29uYWwgb3IgY29tbWVyY2lhbCBwcm9qZWN0cyAKICogdW5kZXIgYm90aCB0aGUgTUlUIGFuZCBHUEwgdmVyc2lvbiAyLjAgbGljZW5zZXMuIFRoaXMgbWVhbnMgdGhhdCB5b3UgY2FuIAogKiBjaG9vc2UgdGhlIGxpY2Vuc2UgdGhhdCBiZXN0IHN1aXRzIHlvdXIgcHJvamVjdCBhbmQgdXNlIGl0IGFjY29yZGluZ2x5LgogKgogKiBqc0RhdGUgYm9ycm93cyBtYW55IGNvbmNlcHRzIGFuZCBpZGVhcyBmcm9tIHRoZSBEYXRlIEluc3RhbmNlIAogKiBNZXRob2RzIGJ5IEtlbiBTbnlkZXIgYWxvbmcgd2l0aCBzb21lIHBhcnRzIG9mIEtlbidzIGFjdHVhbCBjb2RlLgogKiAKICogS2VuJ3Mgb3JpZ2lhbmwgRGF0ZSBJbnN0YW5jZSBNZXRob2RzIGFuZCBjb3B5cmlnaHQgbm90aWNlOgogKiAKICogS2VuIFNueWRlciAoa2VuIGQgc255ZGVyIGF0IGdtYWlsIGRvdCBjb20pCiAqIDIwMDgtMDktMTAKICogdmVyc2lvbiAyLjAuMiAoaHR0cDovL2tlbmRzbnlkZXIuY29tL3NhbmRib3gvZGF0ZS8pICAgICAKICogQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbiBMaWNlbnNlIDMuMCAoaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnkvMy4wLykKICoKICoganFwbG90VG9JbWFnZSBmdW5jdGlvbiBiYXNlZCBvbiBMYXJyeSBTaWRlbidzIGV4cG9ydC1qcXBsb3QtdG8tcG5nLmpzLgogKiBMYXJyeSBoYXMgZ2VuZXJvdXNseSBnaXZlbiBwZXJtaXNzaW9uIHRvIGFkYXB0IGhpcyBjb2RlIGZvciBpbmNsdXNpb24KICogaW50byBqcVBsb3QuCiAqCiAqIExhcnJ5J3Mgb3JpZ2luYWwgY29kZSBjYW4gYmUgZm91bmQgaGVyZToKICoKICogaHR0cHM6Ly9naXRodWIuY29tL2xzaWRlbi9leHBvcnQtanFwbG90LXRvLXBuZwogKiAKICogCiAqLwooZnVuY3Rpb24oYSl7YS5qcXBsb3QuTG9nQXhpc1JlbmRlcmVyPWZ1bmN0aW9uKCl7YS5qcXBsb3QuTGluZWFyQXhpc1JlbmRlcmVyLmNhbGwodGhpcyk7dGhpcy5heGlzRGVmYXVsdHM9e2Jhc2U6MTAsdGlja0Rpc3RyaWJ1dGlvbjoicG93ZXIifX07YS5qcXBsb3QuTG9nQXhpc1JlbmRlcmVyLnByb3RvdHlwZT1uZXcgYS5qcXBsb3QuTGluZWFyQXhpc1JlbmRlcmVyKCk7YS5qcXBsb3QuTG9nQXhpc1JlbmRlcmVyLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1hLmpxcGxvdC5Mb2dBeGlzUmVuZGVyZXI7YS5qcXBsb3QuTG9nQXhpc1JlbmRlcmVyLnByb3RvdHlwZS5pbml0PWZ1bmN0aW9uKGIpe3RoaXMuZHJhd0Jhc2VsaW5lPXRydWU7dGhpcy5taW5vclRpY2tzPSJhdXRvIjt0aGlzLl9zY2FsZWZhY3Q9MTthLmV4dGVuZCh0cnVlLHRoaXMsYik7dGhpcy5fYXV0b0Zvcm1hdFN0cmluZz0iJWQiO3RoaXMuX292ZXJyaWRlRm9ybWF0U3RyaW5nPWZhbHNlO2Zvcih2YXIgYyBpbiB0aGlzLnJlbmRlcmVyLmF4aXNEZWZhdWx0cyl7aWYodGhpc1tjXT09bnVsbCl7dGhpc1tjXT10aGlzLnJlbmRlcmVyLmF4aXNEZWZhdWx0c1tjXX19dGhpcy5yZXNldERhdGFCb3VuZHMoKX07YS5qcXBsb3QuTG9nQXhpc1JlbmRlcmVyLnByb3RvdHlwZS5jcmVhdGVUaWNrcz1mdW5jdGlvbihkKXt2YXIgRz10aGlzLl90aWNrczt2YXIgdz10aGlzLnRpY2tzO3ZhciBzPXRoaXMubmFtZTt2YXIgdT10aGlzLl9kYXRhQm91bmRzO3ZhciBiPSh0aGlzLm5hbWUuY2hhckF0KDApPT09IngiKT90aGlzLl9wbG90RGltZW5zaW9ucy53aWR0aDp0aGlzLl9wbG90RGltZW5zaW9ucy5oZWlnaHQ7dmFyIGs7dmFyIE4sdjt2YXIgbSxsO3ZhciBNLEs7dmFyIGc9MzA7dGhpcy5fc2NhbGVmYWN0PShNYXRoLm1heChiLGcrMSktZykvMzAwO2lmKHcubGVuZ3RoKXtmb3IoSz0wO0s8dy5sZW5ndGg7SysrKXt2YXIgQT13W0tdO3ZhciBIPW5ldyB0aGlzLnRpY2tSZW5kZXJlcih0aGlzLnRpY2tPcHRpb25zKTtpZihBLmNvbnN0cnVjdG9yPT1BcnJheSl7SC52YWx1ZT1BWzBdO0gubGFiZWw9QVsxXTtpZighdGhpcy5zaG93VGlja3Mpe0guc2hvd0xhYmVsPWZhbHNlO0guc2hvd01hcms9ZmFsc2V9ZWxzZXtpZighdGhpcy5zaG93VGlja01hcmtzKXtILnNob3dNYXJrPWZhbHNlfX1ILnNldFRpY2soQVswXSx0aGlzLm5hbWUpO3RoaXMuX3RpY2tzLnB1c2goSCl9ZWxzZXtpZihhLmlzUGxhaW5PYmplY3QoQSkpe2EuZXh0ZW5kKHRydWUsSCxBKTtILmF4aXM9dGhpcy5uYW1lO3RoaXMuX3RpY2tzLnB1c2goSCl9ZWxzZXtILnZhbHVlPUE7aWYoIXRoaXMuc2hvd1RpY2tzKXtILnNob3dMYWJlbD1mYWxzZTtILnNob3dNYXJrPWZhbHNlfWVsc2V7aWYoIXRoaXMuc2hvd1RpY2tNYXJrcyl7SC5zaG93TWFyaz1mYWxzZX19SC5zZXRUaWNrKEEsdGhpcy5uYW1lKTt0aGlzLl90aWNrcy5wdXNoKEgpfX19dGhpcy5udW1iZXJUaWNrcz13Lmxlbmd0aDt0aGlzLm1pbj10aGlzLl90aWNrc1swXS52YWx1ZTt0aGlzLm1heD10aGlzLl90aWNrc1t0aGlzLm51bWJlclRpY2tzLTFdLnZhbHVlfWVsc2V7aWYodGhpcy5taW49PW51bGwmJnRoaXMubWF4PT1udWxsKXtOPXUubWluKigyLXRoaXMucGFkTWluKTt2PXUubWF4KnRoaXMucGFkTWF4O2lmKE49PXYpe3ZhciBjPTAuMDU7Tj1OKigxLWMpO3Y9diooMStjKX1pZih0aGlzLm1pbiE9bnVsbCYmdGhpcy5taW48PTApe3Rocm93ICgibG9nIGF4aXMgbWluaW11bSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwIil9aWYodGhpcy5tYXghPW51bGwmJnRoaXMubWF4PD0wKXt0aHJvdyAoImxvZyBheGlzIG1heGltdW0gbXVzdCBiZSBncmVhdGVyIHRoYW4gMCIpfWZ1bmN0aW9uIGYoail7dmFyIGk9TWF0aC5wb3coMTAsTWF0aC5mbG9vcihNYXRoLmxvZyhqKS9NYXRoLkxOMTApKTtyZXR1cm4gTWF0aC5jZWlsKGovaSkqaX1mdW5jdGlvbiB4KGope3ZhciBpPU1hdGgucG93KDEwLE1hdGguZmxvb3IoTWF0aC5sb2coaikvTWF0aC5MTjEwKSk7cmV0dXJuIE1hdGguZmxvb3Ioai9pKSppfXZhciBGLHI7Rj1NYXRoLnBvdyh0aGlzLmJhc2UsTWF0aC5mbG9vcihNYXRoLmxvZyhOKS9NYXRoLmxvZyh0aGlzLmJhc2UpKSk7cj1NYXRoLnBvdyh0aGlzLmJhc2UsTWF0aC5jZWlsKE1hdGgubG9nKHYpL01hdGgubG9nKHRoaXMuYmFzZSkpKTt2YXIgRT1NYXRoLnJvdW5kKE1hdGgubG9nKEYpL01hdGguTE4xMCk7aWYodGhpcy50aWNrT3B0aW9ucz09bnVsbHx8IXRoaXMudGlja09wdGlvbnMuZm9ybWF0U3RyaW5nKXt0aGlzLl9vdmVycmlkZUZvcm1hdFN0cmluZz10cnVlfXRoaXMubWluPUY7dGhpcy5tYXg9cjt2YXIgcT10aGlzLm1heC10aGlzLm1pbjt2YXIgQz0odGhpcy5taW5vclRpY2tzPT09ImF1dG8iKT8wOnRoaXMubWlub3JUaWNrczt2YXIgaDtpZih0aGlzLm51bWJlclRpY2tzPT1udWxsKXtpZihiPjE0MCl7aD1NYXRoLnJvdW5kKE1hdGgubG9nKHRoaXMubWF4L3RoaXMubWluKS9NYXRoLmxvZyh0aGlzLmJhc2UpKzEpO2lmKGg8Mil7aD0yfWlmKEM9PT0wKXt2YXIgbz1iLyhoLTEpO2lmKG88MTAwKXtDPTB9ZWxzZXtpZihvPDE5MCl7Qz0xfWVsc2V7aWYobzwyNTApe0M9M31lbHNle2lmKG88NjAwKXtDPTR9ZWxzZXtDPTl9fX19fX1lbHNle2g9MjtpZihDPT09MCl7Qz0xfUM9MH19ZWxzZXtoPXRoaXMubnVtYmVyVGlja3N9aWYoRT49MCYmQyE9PTMpe3RoaXMuX2F1dG9Gb3JtYXRTdHJpbmc9IiVkIn1lbHNle2lmKEU8PTAmJkM9PT0zKXt2YXIgbz0tKEUtMSk7dGhpcy5fYXV0b0Zvcm1hdFN0cmluZz0iJS4iK01hdGguYWJzKEUtMSkrImYifWVsc2V7aWYoRTwwKXt2YXIgbz0tRTt0aGlzLl9hdXRvRm9ybWF0U3RyaW5nPSIlLiIrTWF0aC5hYnMoRSkrImYifWVsc2V7dGhpcy5fYXV0b0Zvcm1hdFN0cmluZz0iJWQifX19dmFyIE8sSCx6LHAsbixrO2Zvcih2YXIgSz0wO0s8aDtLKyspe009TWF0aC5wb3codGhpcy5iYXNlLEstaCsxKSp0aGlzLm1heDtIPW5ldyB0aGlzLnRpY2tSZW5kZXJlcih0aGlzLnRpY2tPcHRpb25zKTtpZih0aGlzLl9vdmVycmlkZUZvcm1hdFN0cmluZyl7SC5mb3JtYXRTdHJpbmc9dGhpcy5fYXV0b0Zvcm1hdFN0cmluZ31pZighdGhpcy5zaG93VGlja3Mpe0guc2hvd0xhYmVsPWZhbHNlO0guc2hvd01hcms9ZmFsc2V9ZWxzZXtpZighdGhpcy5zaG93VGlja01hcmtzKXtILnNob3dNYXJrPWZhbHNlfX1ILnNldFRpY2soTSx0aGlzLm5hbWUpO3RoaXMuX3RpY2tzLnB1c2goSCk7aWYoQyYmSzxoLTEpe3A9TWF0aC5wb3codGhpcy5iYXNlLEstaCsyKSp0aGlzLm1heDtuPXAtTTtrPXAvKEMrMSk7Zm9yKHZhciBKPUMtMTtKPj0wO0otLSl7ej1wLWsqKEorMSk7SD1uZXcgdGhpcy50aWNrUmVuZGVyZXIodGhpcy50aWNrT3B0aW9ucyk7aWYodGhpcy5fb3ZlcnJpZGVGb3JtYXRTdHJpbmcmJnRoaXMuX2F1dG9Gb3JtYXRTdHJpbmchPSIiKXtILmZvcm1hdFN0cmluZz10aGlzLl9hdXRvRm9ybWF0U3RyaW5nfWlmKCF0aGlzLnNob3dUaWNrcyl7SC5zaG93TGFiZWw9ZmFsc2U7SC5zaG93TWFyaz1mYWxzZX1lbHNle2lmKCF0aGlzLnNob3dUaWNrTWFya3Mpe0guc2hvd01hcms9ZmFsc2V9fUguc2V0VGljayh6LHRoaXMubmFtZSk7dGhpcy5fdGlja3MucHVzaChIKX19fX1lbHNle2lmKHRoaXMubWluIT1udWxsJiZ0aGlzLm1heCE9bnVsbCl7dmFyIHk9YS5leHRlbmQodHJ1ZSx7fSx0aGlzLnRpY2tPcHRpb25zLHtuYW1lOnRoaXMubmFtZSx2YWx1ZTpudWxsfSk7dmFyIEksZTtpZih0aGlzLm51bWJlclRpY2tzPT1udWxsJiZ0aGlzLnRpY2tJbnRlcnZhbD09bnVsbCl7dmFyIEQ9TWF0aC5tYXgoYixnKzEpO3ZhciBMPU1hdGguY2VpbCgoRC1nKS8zNSsxKTt2YXIgQj1hLmpxcGxvdC5MaW5lYXJUaWNrR2VuZXJhdG9yLmJlc3RDb25zdHJhaW5lZEludGVydmFsKHRoaXMubWluLHRoaXMubWF4LEwpO3RoaXMuX2F1dG9Gb3JtYXRTdHJpbmc9QlszXTtJPUJbMl07ZT1CWzRdO2Zvcih2YXIgSz0wO0s8STtLKyspe3kudmFsdWU9dGhpcy5taW4rSyplO0g9bmV3IHRoaXMudGlja1JlbmRlcmVyKHkpO2lmKHRoaXMuX292ZXJyaWRlRm9ybWF0U3RyaW5nJiZ0aGlzLl9hdXRvRm9ybWF0U3RyaW5nIT0iIil7SC5mb3JtYXRTdHJpbmc9dGhpcy5fYXV0b0Zvcm1hdFN0cmluZ31pZighdGhpcy5zaG93VGlja3Mpe0guc2hvd0xhYmVsPWZhbHNlO0guc2hvd01hcms9ZmFsc2V9ZWxzZXtpZighdGhpcy5zaG93VGlja01hcmtzKXtILnNob3dNYXJrPWZhbHNlfX10aGlzLl90aWNrcy5wdXNoKEgpfX1lbHNle2lmKHRoaXMubnVtYmVyVGlja3MhPW51bGwmJnRoaXMudGlja0ludGVydmFsIT1udWxsKXtJPXRoaXMubnVtYmVyVGlja3M7Zm9yKHZhciBLPTA7SzxJO0srKyl7eS52YWx1ZT10aGlzLm1pbitLKnRoaXMudGlja0ludGVydmFsO0g9bmV3IHRoaXMudGlja1JlbmRlcmVyKHkpO2lmKHRoaXMuX292ZXJyaWRlRm9ybWF0U3RyaW5nJiZ0aGlzLl9hdXRvRm9ybWF0U3RyaW5nIT0iIil7SC5mb3JtYXRTdHJpbmc9dGhpcy5fYXV0b0Zvcm1hdFN0cmluZ31pZighdGhpcy5zaG93VGlja3Mpe0guc2hvd0xhYmVsPWZhbHNlO0guc2hvd01hcms9ZmFsc2V9ZWxzZXtpZighdGhpcy5zaG93VGlja01hcmtzKXtILnNob3dNYXJrPWZhbHNlfX10aGlzLl90aWNrcy5wdXNoKEgpfX19fX19fTthLmpxcGxvdC5Mb2dBeGlzUmVuZGVyZXIucHJvdG90eXBlLnBhY2s9ZnVuY3Rpb24oZixlKXt2YXIgcj1wYXJzZUludCh0aGlzLmJhc2UsMTApO3ZhciB5PXRoaXMuX3RpY2tzO3ZhciBkPWZ1bmN0aW9uKGgpe3JldHVybiBNYXRoLmxvZyhoKS9NYXRoLmxvZyhyKX07dmFyIGI9ZnVuY3Rpb24oaCl7cmV0dXJuIE1hdGgucG93KE1hdGguRSwoTWF0aC5sb2cocikqaCkpfTt2YXIgdT1kKHRoaXMubWF4KTt2YXIgcz1kKHRoaXMubWluKTt2YXIgbT1lLm1heDt2YXIgaz1lLm1pbjt2YXIgbz0odGhpcy5fbGFiZWw9PW51bGwpP2ZhbHNlOnRoaXMuX2xhYmVsLnNob3c7Zm9yKHZhciBxIGluIGYpe3RoaXMuX2VsZW0uY3NzKHEsZltxXSl9dGhpcy5fb2Zmc2V0cz1lO3ZhciBnPW0tazt2YXIgaj11LXM7dGhpcy5wMnU9ZnVuY3Rpb24oaCl7cmV0dXJuIGIoKGgtaykqai9nK3MpfTt0aGlzLnUycD1mdW5jdGlvbihoKXtyZXR1cm4oZChoKS1zKSpnL2ora307aWYodGhpcy5uYW1lPT0ieGF4aXMifHx0aGlzLm5hbWU9PSJ4MmF4aXMiKXt0aGlzLnNlcmllc191MnA9ZnVuY3Rpb24oaCl7cmV0dXJuKGQoaCktcykqZy9qfTt0aGlzLnNlcmllc19wMnU9ZnVuY3Rpb24oaCl7cmV0dXJuIGIoaCpqL2crcyl9fWVsc2V7dGhpcy5zZXJpZXNfdTJwPWZ1bmN0aW9uKGgpe3JldHVybihkKGgpLXUpKmcvan07dGhpcy5zZXJpZXNfcDJ1PWZ1bmN0aW9uKGgpe3JldHVybiBiKGgqai9nK3UpfX1pZih0aGlzLnNob3cpe2lmKHRoaXMubmFtZT09InhheGlzInx8dGhpcy5uYW1lPT0ieDJheGlzIil7Zm9yKHZhciB2PTA7djx5Lmxlbmd0aDt2Kyspe3ZhciBuPXlbdl07aWYobi5zaG93JiZuLnNob3dMYWJlbCl7dmFyIGM7aWYobi5jb25zdHJ1Y3Rvcj09YS5qcXBsb3QuQ2FudmFzQXhpc1RpY2tSZW5kZXJlciYmbi5hbmdsZSl7c3dpdGNoKG4ubGFiZWxQb3NpdGlvbil7Y2FzZSJhdXRvIjppZihuLmFuZ2xlPDApe2M9LW4uZ2V0V2lkdGgoKStuLl90ZXh0UmVuZGVyZXIuaGVpZ2h0Kk1hdGguc2luKC1uLl90ZXh0UmVuZGVyZXIuYW5nbGUpLzJ9ZWxzZXtjPS1uLl90ZXh0UmVuZGVyZXIuaGVpZ2h0Kk1hdGguc2luKG4uX3RleHRSZW5kZXJlci5hbmdsZSkvMn1icmVhaztjYXNlImVuZCI6Yz0tbi5nZXRXaWR0aCgpK24uX3RleHRSZW5kZXJlci5oZWlnaHQqTWF0aC5zaW4oLW4uX3RleHRSZW5kZXJlci5hbmdsZSkvMjticmVhaztjYXNlInN0YXJ0IjpjPS1uLl90ZXh0UmVuZGVyZXIuaGVpZ2h0Kk1hdGguc2luKG4uX3RleHRSZW5kZXJlci5hbmdsZSkvMjticmVhaztjYXNlIm1pZGRsZSI6Yz0tbi5nZXRXaWR0aCgpLzIrbi5fdGV4dFJlbmRlcmVyLmhlaWdodCpNYXRoLnNpbigtbi5fdGV4dFJlbmRlcmVyLmFuZ2xlKS8yO2JyZWFrO2RlZmF1bHQ6Yz0tbi5nZXRXaWR0aCgpLzIrbi5fdGV4dFJlbmRlcmVyLmhlaWdodCpNYXRoLnNpbigtbi5fdGV4dFJlbmRlcmVyLmFuZ2xlKS8yO2JyZWFrfX1lbHNle2M9LW4uZ2V0V2lkdGgoKS8yfXZhciB6PXRoaXMudTJwKG4udmFsdWUpK2MrInB4IjtuLl9lbGVtLmNzcygibGVmdCIseik7bi5wYWNrKCl9fWlmKG8pe3ZhciBsPXRoaXMuX2xhYmVsLl9lbGVtLm91dGVyV2lkdGgodHJ1ZSk7dGhpcy5fbGFiZWwuX2VsZW0uY3NzKCJsZWZ0IixrK2cvMi1sLzIrInB4Iik7aWYodGhpcy5uYW1lPT0ieGF4aXMiKXt0aGlzLl9sYWJlbC5fZWxlbS5jc3MoImJvdHRvbSIsIjBweCIpfWVsc2V7dGhpcy5fbGFiZWwuX2VsZW0uY3NzKCJ0b3AiLCIwcHgiKX10aGlzLl9sYWJlbC5wYWNrKCl9fWVsc2V7Zm9yKHZhciB2PTA7djx5Lmxlbmd0aDt2Kyspe3ZhciBuPXlbdl07aWYobi5zaG93JiZuLnNob3dMYWJlbCl7dmFyIGM7aWYobi5jb25zdHJ1Y3Rvcj09YS5qcXBsb3QuQ2FudmFzQXhpc1RpY2tSZW5kZXJlciYmbi5hbmdsZSl7c3dpdGNoKG4ubGFiZWxQb3NpdGlvbil7Y2FzZSJhdXRvIjpjYXNlImVuZCI6aWYobi5hbmdsZTwwKXtjPS1uLl90ZXh0UmVuZGVyZXIuaGVpZ2h0Kk1hdGguY29zKC1uLl90ZXh0UmVuZGVyZXIuYW5nbGUpLzJ9ZWxzZXtjPS1uLmdldEhlaWdodCgpK24uX3RleHRSZW5kZXJlci5oZWlnaHQqTWF0aC5jb3Mobi5fdGV4dFJlbmRlcmVyLmFuZ2xlKS8yfWJyZWFrO2Nhc2Uic3RhcnQiOmlmKG4uYW5nbGU+MCl7Yz0tbi5fdGV4dFJlbmRlcmVyLmhlaWdodCpNYXRoLmNvcygtbi5fdGV4dFJlbmRlcmVyLmFuZ2xlKS8yfWVsc2V7Yz0tbi5nZXRIZWlnaHQoKStuLl90ZXh0UmVuZGVyZXIuaGVpZ2h0Kk1hdGguY29zKG4uX3RleHRSZW5kZXJlci5hbmdsZSkvMn1icmVhaztjYXNlIm1pZGRsZSI6Yz0tbi5nZXRIZWlnaHQoKS8yO2JyZWFrO2RlZmF1bHQ6Yz0tbi5nZXRIZWlnaHQoKS8yO2JyZWFrfX1lbHNle2M9LW4uZ2V0SGVpZ2h0KCkvMn12YXIgej10aGlzLnUycChuLnZhbHVlKStjKyJweCI7bi5fZWxlbS5jc3MoInRvcCIseik7bi5wYWNrKCl9fWlmKG8pe3ZhciB4PXRoaXMuX2xhYmVsLl9lbGVtLm91dGVySGVpZ2h0KHRydWUpO3RoaXMuX2xhYmVsLl9lbGVtLmNzcygidG9wIixtLWcvMi14LzIrInB4Iik7aWYodGhpcy5uYW1lPT0ieWF4aXMiKXt0aGlzLl9sYWJlbC5fZWxlbS5jc3MoImxlZnQiLCIwcHgiKX1lbHNle3RoaXMuX2xhYmVsLl9lbGVtLmNzcygicmlnaHQiLCIwcHgiKX10aGlzLl9sYWJlbC5wYWNrKCl9fX19fSkoalF1ZXJ5KTs=]]></data>
	</file>
	<file>
	  <filename>/src/plugins/jqplot.mekkoAxisRenderer.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqCiAqIGpxUGxvdAogKiBQdXJlIEphdmFTY3JpcHQgcGxvdHRpbmcgcGx1Z2luIHVzaW5nIGpRdWVyeQogKgogKiBWZXJzaW9uOiAxLjAuMGIyX3IxMDEyCiAqCiAqIENvcHlyaWdodCAoYykgMjAwOS0yMDExIENocmlzIExlb25lbGxvCiAqIGpxUGxvdCBpcyBjdXJyZW50bHkgYXZhaWxhYmxlIGZvciB1c2UgaW4gYWxsIHBlcnNvbmFsIG9yIGNvbW1lcmNpYWwgcHJvamVjdHMgCiAqIHVuZGVyIGJvdGggdGhlIE1JVCAoaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHApIGFuZCBHUEwgCiAqIHZlcnNpb24gMi4wIChodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC5odG1sKSBsaWNlbnNlcy4gVGhpcyBtZWFucyB0aGF0IHlvdSBjYW4gCiAqIGNob29zZSB0aGUgbGljZW5zZSB0aGF0IGJlc3Qgc3VpdHMgeW91ciBwcm9qZWN0IGFuZCB1c2UgaXQgYWNjb3JkaW5nbHkuIAogKgogKiBBbHRob3VnaCBub3QgcmVxdWlyZWQsIHRoZSBhdXRob3Igd291bGQgYXBwcmVjaWF0ZSBhbiBlbWFpbCBsZXR0aW5nIGhpbSAKICoga25vdyBvZiBhbnkgc3Vic3RhbnRpYWwgdXNlIG9mIGpxUGxvdC4gIFlvdSBjYW4gcmVhY2ggdGhlIGF1dGhvciBhdDogCiAqIGNocmlzIGF0IGpxcGxvdCBkb3QgY29tIG9yIHNlZSBodHRwOi8vd3d3LmpxcGxvdC5jb20vaW5mby5waHAgLgogKgogKiBJZiB5b3UgYXJlIGZlZWxpbmcga2luZCBhbmQgZ2VuZXJvdXMsIGNvbnNpZGVyIHN1cHBvcnRpbmcgdGhlIHByb2plY3QgYnkKICogbWFraW5nIGEgZG9uYXRpb24gYXQ6IGh0dHA6Ly93d3cuanFwbG90LmNvbS9kb25hdGUucGhwIC4KICoKICogc3ByaW50ZiBmdW5jdGlvbnMgY29udGFpbmVkIGluIGpxcGxvdC5zcHJpbnRmLmpzIGJ5IEFzaCBTZWFybGU6CiAqCiAqICAgICB2ZXJzaW9uIDIwMDcuMDQuMjcKICogICAgIGF1dGhvciBBc2ggU2VhcmxlCiAqICAgICBodHRwOi8vaGV4bWVuLmNvbS9ibG9nLzIwMDcvMDMvcHJpbnRmLXNwcmludGYvCiAqICAgICBodHRwOi8vaGV4bWVuLmNvbS9qcy9zcHJpbnRmLmpzCiAqICAgICBUaGUgYXV0aG9yIChBc2ggU2VhcmxlKSBoYXMgcGxhY2VkIHRoaXMgY29kZSBpbiB0aGUgcHVibGljIGRvbWFpbjoKICogICAgICJUaGlzIGNvZGUgaXMgdW5yZXN0cmljdGVkOiB5b3UgYXJlIGZyZWUgdG8gdXNlIGl0IGhvd2V2ZXIgeW91IGxpa2UuIgogKiAKICovCihmdW5jdGlvbigkKSB7CiAgICAvLyBjbGFzczogJC5qcXBsb3QuTWVra29BeGlzUmVuZGVyZXIKICAgIC8vIEFuIGF4aXMgcmVuZGVyZXIgZm9yIGEgTWVra28gY2hhcnQuCiAgICAvLyBTaG91bGQgYmUgdXNlZCB3aXRoIGEgTWVra28gY2hhcnQgd2hlcmUgdGhlIG1la2tvUmVuZGVyZXIgaXMgdXNlZCBvbiB0aGUgc2VyaWVzLgogICAgLy8gRGlzcGxheXMgdGhlIFkgYXhpcyBhcyBhIHJhbmdlIGZyb20gMCB0byAxICgwIHRvIDEwMCUpIGFuZCB0aGUgeCBheGlzIHdpdGggYSB0aWNrCiAgICAvLyBmb3IgZWFjaCBzZXJpZXMgc2NhbGVkIHRvIHRoZSBzdW0gb2YgYWxsIHRoZSB5IHZhbHVlcy4KICAgICQuanFwbG90Lk1la2tvQXhpc1JlbmRlcmVyID0gZnVuY3Rpb24oKSB7CiAgICB9OwogICAgCiAgICAvLyBjYWxsZWQgd2l0aCBzY29wZSBvZiBheGlzIG9iamVjdC4KICAgICQuanFwbG90Lk1la2tvQXhpc1JlbmRlcmVyLnByb3RvdHlwZS5pbml0ID0gZnVuY3Rpb24ob3B0aW9ucyl7CiAgICAgICAgLy8gcHJvcDogdGlja01vZGUKICAgICAgICAvLyBIb3cgdG8gc3BhY2UgdGhlIHRpY2tzIG9uIHRoZSBheGlzLgogICAgICAgIC8vICdiYXInIHdpbGwgcGxhY2UgYSB0aWNrIGF0IHRoZSB3aWR0aCBvZiBlYWNoIGJhci4gIAogICAgICAgIC8vIFRoaXMgaXMgdGhlIGRlZmF1bHQgZm9yIHRoZSB4IGF4aXMuCiAgICAgICAgLy8gJ2V2ZW4nIHdpbGwgcGxhY2UgdGlja3MgYXQgZXZlbiBpbnRlcnZhbHMuICBUaGlzIGlzCiAgICAgICAgLy8gdGhlIGRlZmF1bHQgZm9yIHgyIGF4aXMgYW5kIHkgYXhpcy4gIHkgYXhpcyBjYW5ub3QgYmUgY2hhbmdlZC4KICAgICAgICB0aGlzLnRpY2tNb2RlOwogICAgICAgIC8vIHByb3A6IGJhckxhYmVsUmVuZGVyZXIKICAgICAgICAvLyByZW5kZXJlciB0byB1c2UgdG8gZHJhdyBsYWJlbHMgdW5kZXIgZWFjaCBiYXIuCiAgICAgICAgdGhpcy5iYXJMYWJlbFJlbmRlcmVyID0gJC5qcXBsb3QuQXhpc0xhYmVsUmVuZGVyZXI7CiAgICAgICAgLy8gcHJvcDogYmFyTGFiZWxzCiAgICAgICAgLy8gYXJyYXkgb2YgbGFiZWxzIHRvIHB1dCB1bmRlciBlYWNoIGJhci4KICAgICAgICB0aGlzLmJhckxhYmVscyA9IHRoaXMuYmFyTGFiZWxzIHx8IFtdOwogICAgICAgIC8vIHByb3A6IGJhckxhYmVsT3B0aW9ucwogICAgICAgIC8vIG9wdGlvbnMgb2JqZWN0IHRvIHBhc3MgdG8gdGhlIGJhciBsYWJlbCByZW5kZXJlci4KICAgICAgICB0aGlzLmJhckxhYmVsT3B0aW9ucyA9IHt9OwogICAgICAgIHRoaXMudGlja09wdGlvbnMgPSAkLmV4dGVuZCh0cnVlLCB7c2hvd0dyaWRsaW5lOmZhbHNlfSwgdGhpcy50aWNrT3B0aW9ucyk7CiAgICAgICAgdGhpcy5fYmFyTGFiZWxzID0gW107CiAgICAgICAgJC5leHRlbmQodHJ1ZSwgdGhpcywgb3B0aW9ucyk7CiAgICAgICAgaWYgKHRoaXMubmFtZSA9PSAneWF4aXMnKSB7CiAgICAgICAgICAgIHRoaXMudGlja09wdGlvbnMuZm9ybWF0U3RyaW5nID0gdGhpcy50aWNrT3B0aW9ucy5mb3JtYXRTdHJpbmcgfHwgIiVkXCUiOwogICAgICAgIH0KICAgICAgICB2YXIgZGIgPSB0aGlzLl9kYXRhQm91bmRzOwogICAgICAgIGRiLm1pbiA9IDA7CiAgICAgICAgLy8gZm9yIHkgYXhlcywgc2NhbGUgYWx3YXlzIGdvIGZyb20gMCB0byAxICgwIHRvIDEwMCUpCiAgICAgICAgaWYgKHRoaXMubmFtZSA9PSAneWF4aXMnIHx8IHRoaXMubmFtZSA9PSAneTJheGlzJykgewogICAgICAgICAgICBkYi5tYXggPSAxMDA7CiAgICAgICAgICAgIHRoaXMudGlja01vZGUgPSAnZXZlbic7CiAgICAgICAgfQogICAgICAgIC8vIEZvciB4IGF4ZXMsIHNjYWxlIGdvZXMgZnJvbSAwIHRvIHN1bSBvZiBhbGwgeSB2YWx1ZXMuCiAgICAgICAgZWxzZSBpZiAodGhpcy5uYW1lID09ICd4YXhpcycpewogICAgICAgICAgICB0aGlzLnRpY2tNb2RlID0gKHRoaXMudGlja01vZGUgPT0gbnVsbCkgPyAnYmFyJyA6IHRoaXMudGlja01vZGU7CiAgICAgICAgICAgIGZvciAodmFyIGk9MDsgaTx0aGlzLl9zZXJpZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIGRiLm1heCArPSB0aGlzLl9zZXJpZXNbaV0uX3N1bXk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAodGhpcy5uYW1lID09ICd4MmF4aXMnKXsKICAgICAgICAgICAgdGhpcy50aWNrTW9kZSA9ICh0aGlzLnRpY2tNb2RlID09IG51bGwpID8gJ2V2ZW4nIDogdGhpcy50aWNrTW9kZTsKICAgICAgICAgICAgZm9yICh2YXIgaT0wOyBpPHRoaXMuX3Nlcmllcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgZGIubWF4ICs9IHRoaXMuX3Nlcmllc1tpXS5fc3VteTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH07CiAgICAKICAgIC8vIGNhbGxlZCB3aXRoIHNjb3BlIG9mIGF4aXMKICAgICQuanFwbG90Lk1la2tvQXhpc1JlbmRlcmVyLnByb3RvdHlwZS5kcmF3ID0gZnVuY3Rpb24oY3R4LCBwbG90KSB7CiAgICAgICAgaWYgKHRoaXMuc2hvdykgewogICAgICAgICAgICAvLyBwb3B1bGF0ZSB0aGUgYXhpcyBsYWJlbCBhbmQgdmFsdWUgcHJvcGVydGllcy4KICAgICAgICAgICAgLy8gY3JlYXRlVGlja3MgaXMgYSBtZXRob2Qgb24gdGhlIHJlbmRlcmVyLCBidXQKICAgICAgICAgICAgLy8gY2FsbCBpdCB3aXRoaW4gdGhlIHNjb3BlIG9mIHRoZSBheGlzLgogICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmNyZWF0ZVRpY2tzLmNhbGwodGhpcyk7CiAgICAgICAgICAgIC8vIGZpbGwgYSBkaXYgd2l0aCBheGVzIGxhYmVscyBpbiB0aGUgcmlnaHQgZGlyZWN0aW9uLgogICAgICAgICAgICAvLyBOZWVkIHRvIHByZWdlbmVyYXRlIGVhY2ggYXhpcyB0byBnZXQgaXQncyBib3VuZHMgYW5kCiAgICAgICAgICAgIC8vIHBvc2l0aW9uIGl0IGFuZCB0aGUgbGFiZWxzIGNvcnJlY3RseSBvbiB0aGUgcGxvdC4KICAgICAgICAgICAgdmFyIGRpbT0wOwogICAgICAgICAgICB2YXIgdGVtcDsKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBlbGVtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgICAgICAgIHRoaXMuX2VsZW0gPSAkKGVsZW0pOwogICAgICAgICAgICB0aGlzLl9lbGVtLmFkZENsYXNzKCdqcXBsb3QtYXhpcyBqcXBsb3QtJyt0aGlzLm5hbWUpOwogICAgICAgICAgICB0aGlzLl9lbGVtLmNzcygncG9zaXRpb24nLCAnYWJzb2x1dGUnKTsKICAgICAgICAgICAgZWxlbSA9IG51bGw7CiAgICAgICAgICAgIAogICAgICAgICAgICBpZiAodGhpcy5uYW1lID09ICd4YXhpcycgfHwgdGhpcy5uYW1lID09ICd4MmF4aXMnKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9lbGVtLndpZHRoKHRoaXMuX3Bsb3REaW1lbnNpb25zLndpZHRoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHRoaXMuX2VsZW0uaGVpZ2h0KHRoaXMuX3Bsb3REaW1lbnNpb25zLmhlaWdodCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgICAgIC8vIGRyYXcgdGhlIGF4aXMgbGFiZWwKICAgICAgICAgICAgLy8gY3JlYXRlIGEgX2xhYmVsIG9iamVjdC4KICAgICAgICAgICAgdGhpcy5sYWJlbE9wdGlvbnMuYXhpcyA9IHRoaXMubmFtZTsKICAgICAgICAgICAgdGhpcy5fbGFiZWwgPSBuZXcgdGhpcy5sYWJlbFJlbmRlcmVyKHRoaXMubGFiZWxPcHRpb25zKTsKICAgICAgICAgICAgaWYgKHRoaXMuX2xhYmVsLnNob3cpIHsKICAgICAgICAgICAgICAgIHRoaXMuX2VsZW0uYXBwZW5kKHRoaXMuX2xhYmVsLmRyYXcoY3R4KSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciB0LCB0aWNrLCBlbGVtOwogICAgICAgICAgICBpZiAodGhpcy5zaG93VGlja3MpIHsKICAgICAgICAgICAgICAgIHQgPSB0aGlzLl90aWNrczsKICAgICAgICAgICAgICAgIGZvciAodmFyIGk9MDsgaTx0Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgdGljayA9IHRbaV07CiAgICAgICAgICAgICAgICAgICAgaWYgKHRpY2suc2hvd0xhYmVsICYmICghdGljay5pc01pbm9yVGljayB8fCB0aGlzLnNob3dNaW5vclRpY2tzKSkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9lbGVtLmFwcGVuZCh0aWNrLmRyYXcoY3R4KSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICAvLyBkcmF3IHRoZSBzZXJpZXMgbGFiZWxzCiAgICAgICAgICAgIGZvciAoaT0wOyBpPHRoaXMuYmFyTGFiZWxzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICB0aGlzLmJhckxhYmVsT3B0aW9ucy5heGlzID0gdGhpcy5uYW1lOwogICAgICAgICAgICAgICAgdGhpcy5iYXJMYWJlbE9wdGlvbnMubGFiZWwgPSB0aGlzLmJhckxhYmVsc1tpXTsKICAgICAgICAgICAgICAgIHRoaXMuX2JhckxhYmVscy5wdXNoKG5ldyB0aGlzLmJhckxhYmVsUmVuZGVyZXIodGhpcy5iYXJMYWJlbE9wdGlvbnMpKTsKICAgICAgICAgICAgICAgIGlmICh0aGlzLnRpY2tNb2RlICE9ICdiYXInKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fYmFyTGFiZWxzW2ldLnNob3cgPSBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh0aGlzLl9iYXJMYWJlbHNbaV0uc2hvdykgewogICAgICAgICAgICAgICAgICAgIHZhciBlbGVtID0gdGhpcy5fYmFyTGFiZWxzW2ldLmRyYXcoY3R4LCBwbG90KTsKICAgICAgICAgICAgICAgICAgICBlbGVtLnJlbW92ZUNsYXNzKCdqcXBsb3QtJyt0aGlzLm5hbWUrJy1sYWJlbCcpOwogICAgICAgICAgICAgICAgICAgIGVsZW0uYWRkQ2xhc3MoJ2pxcGxvdC0nK3RoaXMubmFtZSsnLXRpY2snKTsKICAgICAgICAgICAgICAgICAgICBlbGVtLmFkZENsYXNzKCdqcXBsb3QtbWVra28tYmFyTGFiZWwnKTsKICAgICAgICAgICAgICAgICAgICBlbGVtLmFwcGVuZFRvKHRoaXMuX2VsZW0pOwogICAgICAgICAgICAgICAgICAgIGVsZW0gPSBudWxsOwogICAgICAgICAgICAgICAgfSAgIAogICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5fZWxlbTsKICAgIH07CiAgICAKICAgIC8vIGNhbGxlZCB3aXRoIHNjb3BlIG9mIGFuIGF4aXMKICAgICQuanFwbG90Lk1la2tvQXhpc1JlbmRlcmVyLnByb3RvdHlwZS5yZXNldCA9IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMubWluID0gdGhpcy5fbWluOwogICAgICAgIHRoaXMubWF4ID0gdGhpcy5fbWF4OwogICAgICAgIHRoaXMudGlja0ludGVydmFsID0gdGhpcy5fdGlja0ludGVydmFsOwogICAgICAgIHRoaXMubnVtYmVyVGlja3MgPSB0aGlzLl9udW1iZXJUaWNrczsKICAgICAgICAvLyB0aGlzLl90aWNrcyA9IHRoaXMuX190aWNrczsKICAgIH07CiAgICAKICAgIC8vIGNhbGxlZCB3aXRoIHNjb3BlIG9mIGF4aXMKICAgICQuanFwbG90Lk1la2tvQXhpc1JlbmRlcmVyLnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbigpIHsgCiAgICAgICAgdmFyIGRpbSA9IDA7CiAgICAgICAgdmFyIHRlbXA7CiAgICAgICAgdmFyIHcgPSAwOwogICAgICAgIHZhciBoID0gMDsKICAgICAgICB2YXIgbHNob3cgPSAodGhpcy5fbGFiZWwgPT0gbnVsbCkgPyBmYWxzZSA6IHRoaXMuX2xhYmVsLnNob3c7CiAgICAgICAgaWYgKHRoaXMuc2hvdyAmJiB0aGlzLnNob3dUaWNrcykgewogICAgICAgICAgICB2YXIgdCA9IHRoaXMuX3RpY2tzOwogICAgICAgICAgICBmb3IgKHZhciBpPTA7IGk8dC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgdmFyIHRpY2sgPSB0W2ldOwogICAgICAgICAgICAgICAgaWYgKHRpY2suc2hvd0xhYmVsICYmICghdGljay5pc01pbm9yVGljayB8fCB0aGlzLnNob3dNaW5vclRpY2tzKSkgewogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm5hbWUgPT0gJ3hheGlzJyB8fCB0aGlzLm5hbWUgPT0gJ3gyYXhpcycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGVtcCA9IHRpY2suX2VsZW0ub3V0ZXJIZWlnaHQodHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICB0ZW1wID0gdGljay5fZWxlbS5vdXRlcldpZHRoKHRydWUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAodGVtcCA+IGRpbSkgewogICAgICAgICAgICAgICAgICAgICAgICBkaW0gPSB0ZW1wOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgaWYgKGxzaG93KSB7CiAgICAgICAgICAgICAgICB3ID0gdGhpcy5fbGFiZWwuX2VsZW0ub3V0ZXJXaWR0aCh0cnVlKTsKICAgICAgICAgICAgICAgIGggPSB0aGlzLl9sYWJlbC5fZWxlbS5vdXRlckhlaWdodCh0cnVlKTsgCiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRoaXMubmFtZSA9PSAneGF4aXMnKSB7CiAgICAgICAgICAgICAgICBkaW0gPSBkaW0gKyBoOwogICAgICAgICAgICAgICAgdGhpcy5fZWxlbS5jc3MoeydoZWlnaHQnOmRpbSsncHgnLCBsZWZ0OicwcHgnLCBib3R0b206JzBweCd9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICh0aGlzLm5hbWUgPT0gJ3gyYXhpcycpIHsKICAgICAgICAgICAgICAgIGRpbSA9IGRpbSArIGg7CiAgICAgICAgICAgICAgICB0aGlzLl9lbGVtLmNzcyh7J2hlaWdodCc6ZGltKydweCcsIGxlZnQ6JzBweCcsIHRvcDonMHB4J30pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMubmFtZSA9PSAneWF4aXMnKSB7CiAgICAgICAgICAgICAgICBkaW0gPSBkaW0gKyB3OwogICAgICAgICAgICAgICAgdGhpcy5fZWxlbS5jc3Moeyd3aWR0aCc6ZGltKydweCcsIGxlZnQ6JzBweCcsIHRvcDonMHB4J30pOwogICAgICAgICAgICAgICAgaWYgKGxzaG93ICYmIHRoaXMuX2xhYmVsLmNvbnN0cnVjdG9yID09ICQuanFwbG90LkF4aXNMYWJlbFJlbmRlcmVyKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbGFiZWwuX2VsZW0uY3NzKCd3aWR0aCcsIHcrJ3B4Jyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBkaW0gPSBkaW0gKyB3OwogICAgICAgICAgICAgICAgdGhpcy5fZWxlbS5jc3Moeyd3aWR0aCc6ZGltKydweCcsIHJpZ2h0OicwcHgnLCB0b3A6JzBweCd9KTsKICAgICAgICAgICAgICAgIGlmIChsc2hvdyAmJiB0aGlzLl9sYWJlbC5jb25zdHJ1Y3RvciA9PSAkLmpxcGxvdC5BeGlzTGFiZWxSZW5kZXJlcikgewogICAgICAgICAgICAgICAgICAgIHRoaXMuX2xhYmVsLl9lbGVtLmNzcygnd2lkdGgnLCB3KydweCcpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSAgCiAgICB9OyAgICAKICAgIAogICAgLy8gY2FsbGVkIHdpdGggc2NvcGUgb2YgYXhpcwogICAgJC5qcXBsb3QuTWVra29BeGlzUmVuZGVyZXIucHJvdG90eXBlLmNyZWF0ZVRpY2tzID0gZnVuY3Rpb24oKSB7CiAgICAgICAgLy8gd2UncmUgYXJlIG9wZXJhdGluZyBvbiBhbiBheGlzIGhlcmUKICAgICAgICB2YXIgdGlja3MgPSB0aGlzLl90aWNrczsKICAgICAgICB2YXIgdXNlclRpY2tzID0gdGhpcy50aWNrczsKICAgICAgICB2YXIgbmFtZSA9IHRoaXMubmFtZTsKICAgICAgICAvLyBkYXRhYm91bmRzIHdlcmUgc2V0IG9uIGF4aXMgaW5pdGlhbGl6YXRpb24uCiAgICAgICAgdmFyIGRiID0gdGhpcy5fZGF0YUJvdW5kczsKICAgICAgICB2YXIgZGltLCBpbnRlcnZhbDsKICAgICAgICB2YXIgbWluLCBtYXg7CiAgICAgICAgdmFyIHBvczEsIHBvczI7CiAgICAgICAgdmFyIHQsIHR0LCBpLCBqOwogICAgICAgIAogICAgICAgIC8vIGlmIHdlIGFscmVhZHkgaGF2ZSB0aWNrcywgdXNlIHRoZW0uCiAgICAgICAgLy8gdGlja3MgbXVzdCBiZSBpbiBvcmRlciBvZiBpbmNyZWFzaW5nIHZhbHVlLgogICAgICAgIAogICAgICAgIGlmICh1c2VyVGlja3MubGVuZ3RoKSB7CiAgICAgICAgICAgIC8vIHRpY2tzIGNvdWxkIGJlIDFEIG9yIDJEIGFycmF5IG9mIFt2YWwsIHZhbCwgLCwsXSBvciBbW3ZhbCwgbGFiZWxdLCBbdmFsLCBsYWJlbF0sIC4uLl0gb3IgbWl4ZWQKICAgICAgICAgICAgZm9yIChpPTA7IGk8dXNlclRpY2tzLmxlbmd0aDsgaSsrKXsKICAgICAgICAgICAgICAgIHZhciB1dCA9IHVzZXJUaWNrc1tpXTsKICAgICAgICAgICAgICAgIHZhciB0ID0gbmV3IHRoaXMudGlja1JlbmRlcmVyKHRoaXMudGlja09wdGlvbnMpOwogICAgICAgICAgICAgICAgaWYgKHV0LmNvbnN0cnVjdG9yID09IEFycmF5KSB7CiAgICAgICAgICAgICAgICAgICAgdC52YWx1ZSA9IHV0WzBdOwogICAgICAgICAgICAgICAgICAgIHQubGFiZWwgPSB1dFsxXTsKICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuc2hvd1RpY2tzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHQuc2hvd0xhYmVsID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIHQuc2hvd01hcmsgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIXRoaXMuc2hvd1RpY2tNYXJrcykgewogICAgICAgICAgICAgICAgICAgICAgICB0LnNob3dNYXJrID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHQuc2V0VGljayh1dFswXSwgdGhpcy5uYW1lKTsKICAgICAgICAgICAgICAgICAgICB0aGlzLl90aWNrcy5wdXNoKHQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0LnZhbHVlID0gdXQ7CiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLnNob3dUaWNrcykgewogICAgICAgICAgICAgICAgICAgICAgICB0LnNob3dMYWJlbCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICB0LnNob3dNYXJrID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCF0aGlzLnNob3dUaWNrTWFya3MpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdC5zaG93TWFyayA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB0LnNldFRpY2sodXQsIHRoaXMubmFtZSk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGlja3MucHVzaCh0KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLm51bWJlclRpY2tzID0gdXNlclRpY2tzLmxlbmd0aDsKICAgICAgICAgICAgdGhpcy5taW4gPSB0aGlzLl90aWNrc1swXS52YWx1ZTsKICAgICAgICAgICAgdGhpcy5tYXggPSB0aGlzLl90aWNrc1t0aGlzLm51bWJlclRpY2tzLTFdLnZhbHVlOwogICAgICAgICAgICB0aGlzLnRpY2tJbnRlcnZhbCA9ICh0aGlzLm1heCAtIHRoaXMubWluKSAvICh0aGlzLm51bWJlclRpY2tzIC0gMSk7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC8vIHdlIGRvbid0IGhhdmUgYW55IHRpY2tzIHlldCwgbGV0J3MgbWFrZSBzb21lIQogICAgICAgIGVsc2UgewogICAgICAgICAgICBpZiAobmFtZSA9PSAneGF4aXMnIHx8IG5hbWUgPT0gJ3gyYXhpcycpIHsKICAgICAgICAgICAgICAgIGRpbSA9IHRoaXMuX3Bsb3REaW1lbnNpb25zLndpZHRoOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgZGltID0gdGhpcy5fcGxvdERpbWVuc2lvbnMuaGVpZ2h0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICAvLyBpZiBtaW4sIG1heCBhbmQgbnVtYmVyIG9mIHRpY2tzIHNwZWNpZmllZCwgdXNlciBjYW4ndCBzcGVjaWZ5IGludGVydmFsLgogICAgICAgICAgICBpZiAodGhpcy5taW4gIT0gbnVsbCAmJiB0aGlzLm1heCAhPSBudWxsICYmIHRoaXMubnVtYmVyVGlja3MgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgdGhpcy50aWNrSW50ZXJ2YWwgPSBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgCiAgICAgICAgICAgIG1pbiA9ICh0aGlzLm1pbiAhPSBudWxsKSA/IHRoaXMubWluIDogZGIubWluOwogICAgICAgICAgICBtYXggPSAodGhpcy5tYXggIT0gbnVsbCkgPyB0aGlzLm1heCA6IGRiLm1heDsKICAgICAgICAgICAgCiAgICAgICAgICAgIC8vIGlmIG1pbiBhbmQgbWF4IGFyZSBzYW1lLCBzcGFjZSB0aGVtIG91dCBhIGJpdC4rCiAgICAgICAgICAgIGlmIChtaW4gPT0gbWF4KSB7CiAgICAgICAgICAgICAgICB2YXIgYWRqID0gMC4wNTsKICAgICAgICAgICAgICAgIGlmIChtaW4gPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgYWRqID0gTWF0aC5tYXgoTWF0aC5sb2cobWluKS9NYXRoLkxOMTAsIDAuMDUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbWluIC09IGFkajsKICAgICAgICAgICAgICAgIG1heCArPSBhZGo7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciByYW5nZSA9IG1heCAtIG1pbjsKICAgICAgICAgICAgdmFyIHJtaW4sIHJtYXg7CiAgICAgICAgICAgIHZhciB0ZW1wLCBwcmV2LCBjdXJyOwogICAgICAgICAgICB2YXIgeW51bXRpY2tzID0gWzMsNSw2LDExLDIxXTsKICAgICAgICAgICAgCiAgICAgICAgICAgIC8vIHlheGlzIGRpdmlkZSB0aWNrcyBpbiBuaWNlIGludGVydmFscyBmcm9tIDAgdG8gMS4KICAgICAgICAgICAgaWYgKHRoaXMubmFtZSA9PSAneWF4aXMnIHx8IHRoaXMubmFtZSA9PSAneTJheGlzJykgeyAKICAgICAgICAgICAgICAgIHRoaXMubWluID0gMDsKICAgICAgICAgICAgICAgIHRoaXMubWF4ID0gMTAwOyAKICAgICAgICAgICAgICAgIC8vIHVzZXIgZGlkbid0IHNwZWNpZnkgbnVtYmVyIG9mIHRpY2tzLgogICAgICAgICAgICAgICAgaWYgKCF0aGlzLm51bWJlclRpY2tzKXsKICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy50aWNrSW50ZXJ2YWwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5udW1iZXJUaWNrcyA9IDMgKyBNYXRoLmNlaWwocmFuZ2UgLyB0aGlzLnRpY2tJbnRlcnZhbCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICB0ZW1wID0gMiArIE1hdGguY2VpbCgoZGltLSh0aGlzLnRpY2tTcGFjaW5nLTEpKS90aGlzLnRpY2tTcGFjaW5nKTsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpPTA7IGk8eW51bXRpY2tzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyID0gdGVtcC95bnVtdGlja3NbaV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VyciA9PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5udW1iZXJUaWNrcyA9IHludW10aWNrc1tpXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGN1cnIgPiAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldiA9IGN1cnI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjdXJyIDwgMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdhcyBwcmV2IG9yIGlzIGN1cnIgY2xvc2VyIHRvIG9uZT8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoTWF0aC5hYnMocHJldiAtIDEpIDwgTWF0aC5hYnMoY3VyciAtIDEpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubnVtYmVyVGlja3MgPSB5bnVtdGlja3NbaS0xXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm51bWJlclRpY2tzID0geW51bXRpY2tzW2ldOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpID09IHludW10aWNrcy5sZW5ndGggLTEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm51bWJlclRpY2tzID0geW51bXRpY2tzW2ldOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGlja0ludGVydmFsID0gcmFuZ2UgLyAodGhpcy5udW1iZXJUaWNrcyAtIDEpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgLy8gdXNlciBkaWQgc3BlY2lmeSBudW1iZXIgb2YgdGlja3MuCiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLnRpY2tJbnRlcnZhbCA9IHJhbmdlIC8gKHRoaXMubnVtYmVyVGlja3MgLSAxKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBmb3IgKHZhciBpPTA7IGk8dGhpcy5udW1iZXJUaWNrczsgaSsrKXsKICAgICAgICAgICAgICAgICAgICB0dCA9IHRoaXMubWluICsgaSAqIHRoaXMudGlja0ludGVydmFsOwogICAgICAgICAgICAgICAgICAgIHQgPSBuZXcgdGhpcy50aWNrUmVuZGVyZXIodGhpcy50aWNrT3B0aW9ucyk7CiAgICAgICAgICAgICAgICAgICAgLy8gdmFyIHQgPSBuZXcgJC5qcXBsb3QuQXhpc1RpY2tSZW5kZXJlcih0aGlzLnRpY2tPcHRpb25zKTsKICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuc2hvd1RpY2tzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHQuc2hvd0xhYmVsID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIHQuc2hvd01hcmsgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIXRoaXMuc2hvd1RpY2tNYXJrcykgewogICAgICAgICAgICAgICAgICAgICAgICB0LnNob3dNYXJrID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHQuc2V0VGljayh0dCwgdGhpcy5uYW1lKTsKICAgICAgICAgICAgICAgICAgICB0aGlzLl90aWNrcy5wdXNoKHQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICAvLyBmb3IgeCBheGVzLCBoYXZlIG51bWJlciBvdCB0aWNrcyBlcXVhbCB0byBudW1iZXIgb2Ygc2VyaWVzIGFuZCB0aWNrcyBwbGFjZWQKICAgICAgICAgICAgLy8gYXQgc3VtIG9mIHkgdmFsdWVzIGZvciBlYWNoIHNlcmllcy4KICAgICAgICAgICAgZWxzZSBpZiAodGhpcy50aWNrTW9kZSA9PSAnYmFyJykgewogICAgICAgICAgICAgICAgdGhpcy5taW4gPSAwOwogICAgICAgICAgICAgICAgdGhpcy5udW1iZXJUaWNrcyA9IHRoaXMuX3Nlcmllcy5sZW5ndGggKyAxOwogICAgICAgICAgICAgICAgdCA9IG5ldyB0aGlzLnRpY2tSZW5kZXJlcih0aGlzLnRpY2tPcHRpb25zKTsKICAgICAgICAgICAgICAgIGlmICghdGhpcy5zaG93VGlja3MpIHsKICAgICAgICAgICAgICAgICAgICB0LnNob3dMYWJlbCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgIHQuc2hvd01hcmsgPSBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKCF0aGlzLnNob3dUaWNrTWFya3MpIHsKICAgICAgICAgICAgICAgICAgICB0LnNob3dNYXJrID0gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0LnNldFRpY2soMCwgdGhpcy5uYW1lKTsKICAgICAgICAgICAgICAgIHRoaXMuX3RpY2tzLnB1c2godCk7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIHRlbXAgPSAwOwoKICAgICAgICAgICAgICAgIGZvciAoaT0xOyBpPHRoaXMubnVtYmVyVGlja3M7IGkrKyl7CiAgICAgICAgICAgICAgICAgICAgdGVtcCArPSB0aGlzLl9zZXJpZXNbaS0xXS5fc3VteTsKICAgICAgICAgICAgICAgICAgICB0ID0gbmV3IHRoaXMudGlja1JlbmRlcmVyKHRoaXMudGlja09wdGlvbnMpOwogICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5zaG93VGlja3MpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdC5zaG93TGFiZWwgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgdC5zaG93TWFyayA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICghdGhpcy5zaG93VGlja01hcmtzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHQuc2hvd01hcmsgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdC5zZXRUaWNrKHRlbXAsIHRoaXMubmFtZSk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGlja3MucHVzaCh0KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRoaXMubWF4ID0gdGhpcy5tYXggfHwgdGVtcDsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgLy8gaWYgdXNlciBzcGVjaWZpZWQgYSBtYXggYW5kIGl0IGlzIGdyZWF0ZXIgdGhhbiBzdW0sIGFkZCBhIHRpY2sKICAgICAgICAgICAgICAgIGlmICh0aGlzLm1heCA+IHRlbXApIHsKICAgICAgICAgICAgICAgICAgICAgdCA9IG5ldyB0aGlzLnRpY2tSZW5kZXJlcih0aGlzLnRpY2tPcHRpb25zKTsKICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuc2hvd1RpY2tzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHQuc2hvd0xhYmVsID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIHQuc2hvd01hcmsgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIXRoaXMuc2hvd1RpY2tNYXJrcykgewogICAgICAgICAgICAgICAgICAgICAgICB0LnNob3dNYXJrID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHQuc2V0VGljayh0aGlzLm1heCwgdGhpcy5uYW1lKTsKICAgICAgICAgICAgICAgICAgICB0aGlzLl90aWNrcy5wdXNoKHQpOwogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICBlbHNlIGlmICh0aGlzLnRpY2tNb2RlID09ICdldmVuJykgewogICAgICAgICAgICAgICAgdGhpcy5taW4gPSAwOwogICAgICAgICAgICAgICAgdGhpcy5tYXggPSB0aGlzLm1heCB8fCBkYi5tYXg7CiAgICAgICAgICAgICAgICAvLyBnZXQgYSBkZXNpcmVkIG51bWJlciBvZiB0aWNrcwogICAgICAgICAgICAgICAgdmFyIG50ID0gMiArIE1hdGguY2VpbCgoZGltLSh0aGlzLnRpY2tTcGFjaW5nLTEpKS90aGlzLnRpY2tTcGFjaW5nKTsKICAgICAgICAgICAgICAgIHJhbmdlID0gdGhpcy5tYXggLSB0aGlzLm1pbjsKICAgICAgICAgICAgICAgIHRoaXMubnVtYmVyVGlja3MgPSBudDsKICAgICAgICAgICAgICAgIHRoaXMudGlja0ludGVydmFsID0gcmFuZ2UgLyAodGhpcy5udW1iZXJUaWNrcyAtIDEpOwoKICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpPHRoaXMubnVtYmVyVGlja3M7IGkrKyl7CiAgICAgICAgICAgICAgICAgICAgdHQgPSB0aGlzLm1pbiArIGkgKiB0aGlzLnRpY2tJbnRlcnZhbDsKICAgICAgICAgICAgICAgICAgICB0ID0gbmV3IHRoaXMudGlja1JlbmRlcmVyKHRoaXMudGlja09wdGlvbnMpOwogICAgICAgICAgICAgICAgICAgIC8vIHZhciB0ID0gbmV3ICQuanFwbG90LkF4aXNUaWNrUmVuZGVyZXIodGhpcy50aWNrT3B0aW9ucyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLnNob3dUaWNrcykgewogICAgICAgICAgICAgICAgICAgICAgICB0LnNob3dMYWJlbCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICB0LnNob3dNYXJrID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCF0aGlzLnNob3dUaWNrTWFya3MpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdC5zaG93TWFyayA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB0LnNldFRpY2sodHQsIHRoaXMubmFtZSk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGlja3MucHVzaCh0KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIAogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfTsKICAgIAogICAgLy8gY2FsbGVkIHdpdGggc2NvcGUgb2YgYXhpcwogICAgJC5qcXBsb3QuTWVra29BeGlzUmVuZGVyZXIucHJvdG90eXBlLnBhY2sgPSBmdW5jdGlvbihwb3MsIG9mZnNldHMpIHsKICAgICAgICB2YXIgdGlja3MgPSB0aGlzLl90aWNrczsKICAgICAgICB2YXIgbWF4ID0gdGhpcy5tYXg7CiAgICAgICAgdmFyIG1pbiA9IHRoaXMubWluOwogICAgICAgIHZhciBvZmZtYXggPSBvZmZzZXRzLm1heDsKICAgICAgICB2YXIgb2ZmbWluID0gb2Zmc2V0cy5taW47CiAgICAgICAgdmFyIGxzaG93ID0gKHRoaXMuX2xhYmVsID09IG51bGwpID8gZmFsc2UgOiB0aGlzLl9sYWJlbC5zaG93OwogICAgICAgIAogICAgICAgIGZvciAodmFyIHAgaW4gcG9zKSB7CiAgICAgICAgICAgIHRoaXMuX2VsZW0uY3NzKHAsIHBvc1twXSk7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIHRoaXMuX29mZnNldHMgPSBvZmZzZXRzOwogICAgICAgIC8vIHBpeGVsbGVuZ3RoIHdpbGwgYmUgKyBmb3IgeCBheGVzIGFuZCAtIGZvciB5IGF4ZXMgYmVjYXN1ZSBwaXhlbHMgYWx3YXlzIG1lYXN1cmVkIGZyb20gdG9wIGxlZnQuCiAgICAgICAgdmFyIHBpeGVsbGVuZ3RoID0gb2ZmbWF4IC0gb2ZmbWluOwogICAgICAgIHZhciB1bml0bGVuZ3RoID0gbWF4IC0gbWluOwogICAgICAgIAogICAgICAgIC8vIHBvaW50IHRvIHVuaXQgYW5kIHVuaXQgdG8gcG9pbnQgY29udmVyc2lvbnMgcmVmZXJlbmNlcyB0byBQbG90IERPTSBlbGVtZW50IHRvcCBsZWZ0IGNvcm5lci4KICAgICAgICB0aGlzLnAydSA9IGZ1bmN0aW9uKHApewogICAgICAgICAgICByZXR1cm4gKHAgLSBvZmZtaW4pICogdW5pdGxlbmd0aCAvIHBpeGVsbGVuZ3RoICsgbWluOwogICAgICAgIH07CiAgICAgICAgCiAgICAgICAgdGhpcy51MnAgPSBmdW5jdGlvbih1KXsKICAgICAgICAgICAgcmV0dXJuICh1IC0gbWluKSAqIHBpeGVsbGVuZ3RoIC8gdW5pdGxlbmd0aCArIG9mZm1pbjsKICAgICAgICB9OwogICAgICAgICAgICAgICAgCiAgICAgICAgaWYgKHRoaXMubmFtZSA9PSAneGF4aXMnIHx8IHRoaXMubmFtZSA9PSAneDJheGlzJyl7CiAgICAgICAgICAgIHRoaXMuc2VyaWVzX3UycCA9IGZ1bmN0aW9uKHUpewogICAgICAgICAgICAgICAgcmV0dXJuICh1IC0gbWluKSAqIHBpeGVsbGVuZ3RoIC8gdW5pdGxlbmd0aDsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgdGhpcy5zZXJpZXNfcDJ1ID0gZnVuY3Rpb24ocCl7CiAgICAgICAgICAgICAgICByZXR1cm4gcCAqIHVuaXRsZW5ndGggLyBwaXhlbGxlbmd0aCArIG1pbjsKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHRoaXMuc2VyaWVzX3UycCA9IGZ1bmN0aW9uKHUpewogICAgICAgICAgICAgICAgcmV0dXJuICh1IC0gbWF4KSAqIHBpeGVsbGVuZ3RoIC8gdW5pdGxlbmd0aDsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgdGhpcy5zZXJpZXNfcDJ1ID0gZnVuY3Rpb24ocCl7CiAgICAgICAgICAgICAgICByZXR1cm4gcCAqIHVuaXRsZW5ndGggLyBwaXhlbGxlbmd0aCArIG1heDsKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYgKHRoaXMuc2hvdykgewogICAgICAgICAgICBpZiAodGhpcy5uYW1lID09ICd4YXhpcycgfHwgdGhpcy5uYW1lID09ICd4MmF4aXMnKSB7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpPTA7IGk8dGlja3MubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHRpY2tzW2ldOwogICAgICAgICAgICAgICAgICAgIGlmICh0LnNob3cgJiYgdC5zaG93TGFiZWwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNoaW07CiAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICBpZiAodC5jb25zdHJ1Y3RvciA9PSAkLmpxcGxvdC5DYW52YXNBeGlzVGlja1JlbmRlcmVyICYmIHQuYW5nbGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdpbGwgbmVlZCB0byBhZGp1c3QgYXV0byBwb3NpdGlvbmluZyBiYXNlZCBvbiB3aGljaCBheGlzIHRoaXMgaXMuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGVtcCA9ICh0aGlzLm5hbWUgPT0gJ3hheGlzJykgPyAxIDogLTE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHQubGFiZWxQb3NpdGlvbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2F1dG8nOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwb3NpdGlvbiBhdCBlbmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRlbXAgKiB0LmFuZ2xlIDwgMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hpbSA9IC10LmdldFdpZHRoKCkgKyB0Ll90ZXh0UmVuZGVyZXIuaGVpZ2h0ICogTWF0aC5zaW4oLXQuX3RleHRSZW5kZXJlci5hbmdsZSkgLyAyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBvc2l0aW9uIGF0IHN0YXJ0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hpbSA9IC10Ll90ZXh0UmVuZGVyZXIuaGVpZ2h0ICogTWF0aC5zaW4odC5fdGV4dFJlbmRlcmVyLmFuZ2xlKSAvIDI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnZW5kJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hpbSA9IC10LmdldFdpZHRoKCkgKyB0Ll90ZXh0UmVuZGVyZXIuaGVpZ2h0ICogTWF0aC5zaW4oLXQuX3RleHRSZW5kZXJlci5hbmdsZSkgLyAyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdzdGFydCc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoaW0gPSAtdC5fdGV4dFJlbmRlcmVyLmhlaWdodCAqIE1hdGguc2luKHQuX3RleHRSZW5kZXJlci5hbmdsZSkgLyAyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdtaWRkbGUnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGltID0gLXQuZ2V0V2lkdGgoKS8yICsgdC5fdGV4dFJlbmRlcmVyLmhlaWdodCAqIE1hdGguc2luKC10Ll90ZXh0UmVuZGVyZXIuYW5nbGUpIC8gMjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hpbSA9IC10LmdldFdpZHRoKCkvMiArIHQuX3RleHRSZW5kZXJlci5oZWlnaHQgKiBNYXRoLnNpbigtdC5fdGV4dFJlbmRlcmVyLmFuZ2xlKSAvIDI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hpbSA9IC10LmdldFdpZHRoKCkvMjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdmFsID0gdGhpcy51MnAodC52YWx1ZSkgKyBzaGltICsgJ3B4JzsKICAgICAgICAgICAgICAgICAgICAgICAgdC5fZWxlbS5jc3MoJ2xlZnQnLCB2YWwpOwogICAgICAgICAgICAgICAgICAgICAgICB0LnBhY2soKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgdzsKICAgICAgICAgICAgICAgIGlmIChsc2hvdykgewogICAgICAgICAgICAgICAgICAgIHcgPSB0aGlzLl9sYWJlbC5fZWxlbS5vdXRlcldpZHRoKHRydWUpOwogICAgICAgICAgICAgICAgICAgIHRoaXMuX2xhYmVsLl9lbGVtLmNzcygnbGVmdCcsIG9mZm1pbiArIHBpeGVsbGVuZ3RoLzIgLSB3LzIgKyAncHgnKTsKICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5uYW1lID09ICd4YXhpcycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbGFiZWwuX2VsZW0uY3NzKCdib3R0b20nLCAnMHB4Jyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9sYWJlbC5fZWxlbS5jc3MoJ3RvcCcsICcwcHgnKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbGFiZWwucGFjaygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gbm93IHNob3cgdGhlIGxhYmVscyB1bmRlciB0aGUgYmFycy4KICAgICAgICAgICAgICAgIHZhciBiLCBsLCByOwogICAgICAgICAgICAgICAgZm9yICh2YXIgaT0wOyBpPHRoaXMuYmFyTGFiZWxzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgYiA9IHRoaXMuX2JhckxhYmVsc1tpXTsKICAgICAgICAgICAgICAgICAgICBpZiAoYi5zaG93KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHcgPSBiLmdldFdpZHRoKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGwgPSB0aGlzLl90aWNrc1tpXS5nZXRMZWZ0KCkgKyB0aGlzLl90aWNrc1tpXS5nZXRXaWR0aCgpOwogICAgICAgICAgICAgICAgICAgICAgICByID0gdGhpcy5fdGlja3NbaSsxXS5nZXRMZWZ0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGIuX2VsZW0uY3NzKCdsZWZ0JywgKHIrbC13KS8yKydweCcpOwogICAgICAgICAgICAgICAgICAgICAgICBiLl9lbGVtLmNzcygndG9wJywgdGhpcy5fdGlja3NbaV0uX2VsZW0uY3NzKCd0b3AnKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGIucGFjaygpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIGk9MDsgaTx0aWNrcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgIHZhciB0ID0gdGlja3NbaV07CiAgICAgICAgICAgICAgICAgICAgaWYgKHQuc2hvdyAmJiB0LnNob3dMYWJlbCkgeyAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2hpbTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQuY29uc3RydWN0b3IgPT0gJC5qcXBsb3QuQ2FudmFzQXhpc1RpY2tSZW5kZXJlciAmJiB0LmFuZ2xlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aWxsIG5lZWQgdG8gYWRqdXN0IGF1dG8gcG9zaXRpb25pbmcgYmFzZWQgb24gd2hpY2ggYXhpcyB0aGlzIGlzLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRlbXAgPSAodGhpcy5uYW1lID09ICd5YXhpcycpID8gMSA6IC0xOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh0LmxhYmVsUG9zaXRpb24pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdhdXRvJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcG9zaXRpb24gYXQgZW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnZW5kJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRlbXAgKiB0LmFuZ2xlIDwgMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hpbSA9IC10Ll90ZXh0UmVuZGVyZXIuaGVpZ2h0ICogTWF0aC5jb3MoLXQuX3RleHRSZW5kZXJlci5hbmdsZSkgLyAyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hpbSA9IC10LmdldEhlaWdodCgpICsgdC5fdGV4dFJlbmRlcmVyLmhlaWdodCAqIE1hdGguY29zKHQuX3RleHRSZW5kZXJlci5hbmdsZSkgLyAyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3N0YXJ0JzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQuYW5nbGUgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGltID0gLXQuX3RleHRSZW5kZXJlci5oZWlnaHQgKiBNYXRoLmNvcygtdC5fdGV4dFJlbmRlcmVyLmFuZ2xlKSAvIDI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGltID0gLXQuZ2V0SGVpZ2h0KCkgKyB0Ll90ZXh0UmVuZGVyZXIuaGVpZ2h0ICogTWF0aC5jb3ModC5fdGV4dFJlbmRlcmVyLmFuZ2xlKSAvIDI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnbWlkZGxlJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hpbSA9IC10LmdldEhlaWdodCgpLzI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoaW0gPSAtdC5nZXRIZWlnaHQoKS8yOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoaW0gPSAtdC5nZXRIZWlnaHQoKS8yOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdmFsID0gdGhpcy51MnAodC52YWx1ZSkgKyBzaGltICsgJ3B4JzsKICAgICAgICAgICAgICAgICAgICAgICAgdC5fZWxlbS5jc3MoJ3RvcCcsIHZhbCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHQucGFjaygpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChsc2hvdykgewogICAgICAgICAgICAgICAgICAgIHZhciBoID0gdGhpcy5fbGFiZWwuX2VsZW0ub3V0ZXJIZWlnaHQodHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbGFiZWwuX2VsZW0uY3NzKCd0b3AnLCBvZmZtYXggLSBwaXhlbGxlbmd0aC8yIC0gaC8yICsgJ3B4Jyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubmFtZSA9PSAneWF4aXMnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2xhYmVsLl9lbGVtLmNzcygnbGVmdCcsICcwcHgnKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2xhYmVsLl9lbGVtLmNzcygncmlnaHQnLCAnMHB4Jyk7CiAgICAgICAgICAgICAgICAgICAgfSAgIAogICAgICAgICAgICAgICAgICAgIHRoaXMuX2xhYmVsLnBhY2soKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH07Cn0pKGpRdWVyeSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/src/plugins/jqplot.mekkoAxisRenderer.min.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqCiAqIGpxUGxvdAogKiBQdXJlIEphdmFTY3JpcHQgcGxvdHRpbmcgcGx1Z2luIHVzaW5nIGpRdWVyeQogKgogKiBWZXJzaW9uOiAxLjAuMGIyX3IxMDEyCiAqCiAqIENvcHlyaWdodCAoYykgMjAwOS0yMDExIENocmlzIExlb25lbGxvCiAqIGpxUGxvdCBpcyBjdXJyZW50bHkgYXZhaWxhYmxlIGZvciB1c2UgaW4gYWxsIHBlcnNvbmFsIG9yIGNvbW1lcmNpYWwgcHJvamVjdHMgCiAqIHVuZGVyIGJvdGggdGhlIE1JVCAoaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHApIGFuZCBHUEwgCiAqIHZlcnNpb24gMi4wIChodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC5odG1sKSBsaWNlbnNlcy4gVGhpcyBtZWFucyB0aGF0IHlvdSBjYW4gCiAqIGNob29zZSB0aGUgbGljZW5zZSB0aGF0IGJlc3Qgc3VpdHMgeW91ciBwcm9qZWN0IGFuZCB1c2UgaXQgYWNjb3JkaW5nbHkuIAogKgogKiBBbHRob3VnaCBub3QgcmVxdWlyZWQsIHRoZSBhdXRob3Igd291bGQgYXBwcmVjaWF0ZSBhbiBlbWFpbCBsZXR0aW5nIGhpbSAKICoga25vdyBvZiBhbnkgc3Vic3RhbnRpYWwgdXNlIG9mIGpxUGxvdC4gIFlvdSBjYW4gcmVhY2ggdGhlIGF1dGhvciBhdDogCiAqIGNocmlzIGF0IGpxcGxvdCBkb3QgY29tIG9yIHNlZSBodHRwOi8vd3d3LmpxcGxvdC5jb20vaW5mby5waHAgLgogKgogKiBJZiB5b3UgYXJlIGZlZWxpbmcga2luZCBhbmQgZ2VuZXJvdXMsIGNvbnNpZGVyIHN1cHBvcnRpbmcgdGhlIHByb2plY3QgYnkKICogbWFraW5nIGEgZG9uYXRpb24gYXQ6IGh0dHA6Ly93d3cuanFwbG90LmNvbS9kb25hdGUucGhwIC4KICoKICogc3ByaW50ZiBmdW5jdGlvbnMgY29udGFpbmVkIGluIGpxcGxvdC5zcHJpbnRmLmpzIGJ5IEFzaCBTZWFybGU6CiAqCiAqICAgICB2ZXJzaW9uIDIwMDcuMDQuMjcKICogICAgIGF1dGhvciBBc2ggU2VhcmxlCiAqICAgICBodHRwOi8vaGV4bWVuLmNvbS9ibG9nLzIwMDcvMDMvcHJpbnRmLXNwcmludGYvCiAqICAgICBodHRwOi8vaGV4bWVuLmNvbS9qcy9zcHJpbnRmLmpzCiAqICAgICBUaGUgYXV0aG9yIChBc2ggU2VhcmxlKSBoYXMgcGxhY2VkIHRoaXMgY29kZSBpbiB0aGUgcHVibGljIGRvbWFpbjoKICogICAgICJUaGlzIGNvZGUgaXMgdW5yZXN0cmljdGVkOiB5b3UgYXJlIGZyZWUgdG8gdXNlIGl0IGhvd2V2ZXIgeW91IGxpa2UuIgogKgogKiBpbmNsdWRlZCBqc0RhdGUgbGlicmFyeSBieSBDaHJpcyBMZW9uZWxsbzoKICoKICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEgQ2hyaXMgTGVvbmVsbG8KICoKICoganNEYXRlIGlzIGN1cnJlbnRseSBhdmFpbGFibGUgZm9yIHVzZSBpbiBhbGwgcGVyc29uYWwgb3IgY29tbWVyY2lhbCBwcm9qZWN0cyAKICogdW5kZXIgYm90aCB0aGUgTUlUIGFuZCBHUEwgdmVyc2lvbiAyLjAgbGljZW5zZXMuIFRoaXMgbWVhbnMgdGhhdCB5b3UgY2FuIAogKiBjaG9vc2UgdGhlIGxpY2Vuc2UgdGhhdCBiZXN0IHN1aXRzIHlvdXIgcHJvamVjdCBhbmQgdXNlIGl0IGFjY29yZGluZ2x5LgogKgogKiBqc0RhdGUgYm9ycm93cyBtYW55IGNvbmNlcHRzIGFuZCBpZGVhcyBmcm9tIHRoZSBEYXRlIEluc3RhbmNlIAogKiBNZXRob2RzIGJ5IEtlbiBTbnlkZXIgYWxvbmcgd2l0aCBzb21lIHBhcnRzIG9mIEtlbidzIGFjdHVhbCBjb2RlLgogKiAKICogS2VuJ3Mgb3JpZ2lhbmwgRGF0ZSBJbnN0YW5jZSBNZXRob2RzIGFuZCBjb3B5cmlnaHQgbm90aWNlOgogKiAKICogS2VuIFNueWRlciAoa2VuIGQgc255ZGVyIGF0IGdtYWlsIGRvdCBjb20pCiAqIDIwMDgtMDktMTAKICogdmVyc2lvbiAyLjAuMiAoaHR0cDovL2tlbmRzbnlkZXIuY29tL3NhbmRib3gvZGF0ZS8pICAgICAKICogQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbiBMaWNlbnNlIDMuMCAoaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnkvMy4wLykKICoKICoganFwbG90VG9JbWFnZSBmdW5jdGlvbiBiYXNlZCBvbiBMYXJyeSBTaWRlbidzIGV4cG9ydC1qcXBsb3QtdG8tcG5nLmpzLgogKiBMYXJyeSBoYXMgZ2VuZXJvdXNseSBnaXZlbiBwZXJtaXNzaW9uIHRvIGFkYXB0IGhpcyBjb2RlIGZvciBpbmNsdXNpb24KICogaW50byBqcVBsb3QuCiAqCiAqIExhcnJ5J3Mgb3JpZ2luYWwgY29kZSBjYW4gYmUgZm91bmQgaGVyZToKICoKICogaHR0cHM6Ly9naXRodWIuY29tL2xzaWRlbi9leHBvcnQtanFwbG90LXRvLXBuZwogKiAKICogCiAqLwooZnVuY3Rpb24oYSl7YS5qcXBsb3QuTWVra29BeGlzUmVuZGVyZXI9ZnVuY3Rpb24oKXt9O2EuanFwbG90Lk1la2tvQXhpc1JlbmRlcmVyLnByb3RvdHlwZS5pbml0PWZ1bmN0aW9uKGMpe3RoaXMudGlja01vZGU7dGhpcy5iYXJMYWJlbFJlbmRlcmVyPWEuanFwbG90LkF4aXNMYWJlbFJlbmRlcmVyO3RoaXMuYmFyTGFiZWxzPXRoaXMuYmFyTGFiZWxzfHxbXTt0aGlzLmJhckxhYmVsT3B0aW9ucz17fTt0aGlzLnRpY2tPcHRpb25zPWEuZXh0ZW5kKHRydWUse3Nob3dHcmlkbGluZTpmYWxzZX0sdGhpcy50aWNrT3B0aW9ucyk7dGhpcy5fYmFyTGFiZWxzPVtdO2EuZXh0ZW5kKHRydWUsdGhpcyxjKTtpZih0aGlzLm5hbWU9PSJ5YXhpcyIpe3RoaXMudGlja09wdGlvbnMuZm9ybWF0U3RyaW5nPXRoaXMudGlja09wdGlvbnMuZm9ybWF0U3RyaW5nfHwiJWQlIn12YXIgYj10aGlzLl9kYXRhQm91bmRzO2IubWluPTA7aWYodGhpcy5uYW1lPT0ieWF4aXMifHx0aGlzLm5hbWU9PSJ5MmF4aXMiKXtiLm1heD0xMDA7dGhpcy50aWNrTW9kZT0iZXZlbiJ9ZWxzZXtpZih0aGlzLm5hbWU9PSJ4YXhpcyIpe3RoaXMudGlja01vZGU9KHRoaXMudGlja01vZGU9PW51bGwpPyJiYXIiOnRoaXMudGlja01vZGU7Zm9yKHZhciBkPTA7ZDx0aGlzLl9zZXJpZXMubGVuZ3RoO2QrKyl7Yi5tYXgrPXRoaXMuX3Nlcmllc1tkXS5fc3VteX19ZWxzZXtpZih0aGlzLm5hbWU9PSJ4MmF4aXMiKXt0aGlzLnRpY2tNb2RlPSh0aGlzLnRpY2tNb2RlPT1udWxsKT8iZXZlbiI6dGhpcy50aWNrTW9kZTtmb3IodmFyIGQ9MDtkPHRoaXMuX3Nlcmllcy5sZW5ndGg7ZCsrKXtiLm1heCs9dGhpcy5fc2VyaWVzW2RdLl9zdW15fX19fX07YS5qcXBsb3QuTWVra29BeGlzUmVuZGVyZXIucHJvdG90eXBlLmRyYXc9ZnVuY3Rpb24oYixqKXtpZih0aGlzLnNob3cpe3RoaXMucmVuZGVyZXIuY3JlYXRlVGlja3MuY2FsbCh0aGlzKTt2YXIgaD0wO3ZhciBjO3ZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuX2VsZW09YShnKTt0aGlzLl9lbGVtLmFkZENsYXNzKCJqcXBsb3QtYXhpcyBqcXBsb3QtIit0aGlzLm5hbWUpO3RoaXMuX2VsZW0uY3NzKCJwb3NpdGlvbiIsImFic29sdXRlIik7Zz1udWxsO2lmKHRoaXMubmFtZT09InhheGlzInx8dGhpcy5uYW1lPT0ieDJheGlzIil7dGhpcy5fZWxlbS53aWR0aCh0aGlzLl9wbG90RGltZW5zaW9ucy53aWR0aCl9ZWxzZXt0aGlzLl9lbGVtLmhlaWdodCh0aGlzLl9wbG90RGltZW5zaW9ucy5oZWlnaHQpfXRoaXMubGFiZWxPcHRpb25zLmF4aXM9dGhpcy5uYW1lO3RoaXMuX2xhYmVsPW5ldyB0aGlzLmxhYmVsUmVuZGVyZXIodGhpcy5sYWJlbE9wdGlvbnMpO2lmKHRoaXMuX2xhYmVsLnNob3cpe3RoaXMuX2VsZW0uYXBwZW5kKHRoaXMuX2xhYmVsLmRyYXcoYikpfXZhciBmLGUsZztpZih0aGlzLnNob3dUaWNrcyl7Zj10aGlzLl90aWNrcztmb3IodmFyIGQ9MDtkPGYubGVuZ3RoO2QrKyl7ZT1mW2RdO2lmKGUuc2hvd0xhYmVsJiYoIWUuaXNNaW5vclRpY2t8fHRoaXMuc2hvd01pbm9yVGlja3MpKXt0aGlzLl9lbGVtLmFwcGVuZChlLmRyYXcoYikpfX19Zm9yKGQ9MDtkPHRoaXMuYmFyTGFiZWxzLmxlbmd0aDtkKyspe3RoaXMuYmFyTGFiZWxPcHRpb25zLmF4aXM9dGhpcy5uYW1lO3RoaXMuYmFyTGFiZWxPcHRpb25zLmxhYmVsPXRoaXMuYmFyTGFiZWxzW2RdO3RoaXMuX2JhckxhYmVscy5wdXNoKG5ldyB0aGlzLmJhckxhYmVsUmVuZGVyZXIodGhpcy5iYXJMYWJlbE9wdGlvbnMpKTtpZih0aGlzLnRpY2tNb2RlIT0iYmFyIil7dGhpcy5fYmFyTGFiZWxzW2RdLnNob3c9ZmFsc2V9aWYodGhpcy5fYmFyTGFiZWxzW2RdLnNob3cpe3ZhciBnPXRoaXMuX2JhckxhYmVsc1tkXS5kcmF3KGIsaik7Zy5yZW1vdmVDbGFzcygianFwbG90LSIrdGhpcy5uYW1lKyItbGFiZWwiKTtnLmFkZENsYXNzKCJqcXBsb3QtIit0aGlzLm5hbWUrIi10aWNrIik7Zy5hZGRDbGFzcygianFwbG90LW1la2tvLWJhckxhYmVsIik7Zy5hcHBlbmRUbyh0aGlzLl9lbGVtKTtnPW51bGx9fX1yZXR1cm4gdGhpcy5fZWxlbX07YS5qcXBsb3QuTWVra29BeGlzUmVuZGVyZXIucHJvdG90eXBlLnJlc2V0PWZ1bmN0aW9uKCl7dGhpcy5taW49dGhpcy5fbWluO3RoaXMubWF4PXRoaXMuX21heDt0aGlzLnRpY2tJbnRlcnZhbD10aGlzLl90aWNrSW50ZXJ2YWw7dGhpcy5udW1iZXJUaWNrcz10aGlzLl9udW1iZXJUaWNrc307YS5qcXBsb3QuTWVra29BeGlzUmVuZGVyZXIucHJvdG90eXBlLnNldD1mdW5jdGlvbigpe3ZhciBrPTA7dmFyIGQ7dmFyIGM9MDt2YXIgaj0wO3ZhciBiPSh0aGlzLl9sYWJlbD09bnVsbCk/ZmFsc2U6dGhpcy5fbGFiZWwuc2hvdztpZih0aGlzLnNob3cmJnRoaXMuc2hvd1RpY2tzKXt2YXIgZz10aGlzLl90aWNrcztmb3IodmFyIGY9MDtmPGcubGVuZ3RoO2YrKyl7dmFyIGU9Z1tmXTtpZihlLnNob3dMYWJlbCYmKCFlLmlzTWlub3JUaWNrfHx0aGlzLnNob3dNaW5vclRpY2tzKSl7aWYodGhpcy5uYW1lPT0ieGF4aXMifHx0aGlzLm5hbWU9PSJ4MmF4aXMiKXtkPWUuX2VsZW0ub3V0ZXJIZWlnaHQodHJ1ZSl9ZWxzZXtkPWUuX2VsZW0ub3V0ZXJXaWR0aCh0cnVlKX1pZihkPmspe2s9ZH19fWlmKGIpe2M9dGhpcy5fbGFiZWwuX2VsZW0ub3V0ZXJXaWR0aCh0cnVlKTtqPXRoaXMuX2xhYmVsLl9lbGVtLm91dGVySGVpZ2h0KHRydWUpfWlmKHRoaXMubmFtZT09InhheGlzIil7az1rK2o7dGhpcy5fZWxlbS5jc3Moe2hlaWdodDprKyJweCIsbGVmdDoiMHB4Iixib3R0b206IjBweCJ9KX1lbHNle2lmKHRoaXMubmFtZT09IngyYXhpcyIpe2s9aytqO3RoaXMuX2VsZW0uY3NzKHtoZWlnaHQ6aysicHgiLGxlZnQ6IjBweCIsdG9wOiIwcHgifSl9ZWxzZXtpZih0aGlzLm5hbWU9PSJ5YXhpcyIpe2s9aytjO3RoaXMuX2VsZW0uY3NzKHt3aWR0aDprKyJweCIsbGVmdDoiMHB4Iix0b3A6IjBweCJ9KTtpZihiJiZ0aGlzLl9sYWJlbC5jb25zdHJ1Y3Rvcj09YS5qcXBsb3QuQXhpc0xhYmVsUmVuZGVyZXIpe3RoaXMuX2xhYmVsLl9lbGVtLmNzcygid2lkdGgiLGMrInB4Iil9fWVsc2V7az1rK2M7dGhpcy5fZWxlbS5jc3Moe3dpZHRoOmsrInB4IixyaWdodDoiMHB4Iix0b3A6IjBweCJ9KTtpZihiJiZ0aGlzLl9sYWJlbC5jb25zdHJ1Y3Rvcj09YS5qcXBsb3QuQXhpc0xhYmVsUmVuZGVyZXIpe3RoaXMuX2xhYmVsLl9lbGVtLmNzcygid2lkdGgiLGMrInB4Iil9fX19fX07YS5qcXBsb3QuTWVra29BeGlzUmVuZGVyZXIucHJvdG90eXBlLmNyZWF0ZVRpY2tzPWZ1bmN0aW9uKCl7dmFyIHo9dGhpcy5fdGlja3M7dmFyIHc9dGhpcy50aWNrczt2YXIgQj10aGlzLm5hbWU7dmFyIHk9dGhpcy5fZGF0YUJvdW5kczt2YXIgcCx4O3ZhciBuLHI7dmFyIGQsYzt2YXIgaCxiLHMscTtpZih3Lmxlbmd0aCl7Zm9yKHM9MDtzPHcubGVuZ3RoO3MrKyl7dmFyIGU9d1tzXTt2YXIgaD1uZXcgdGhpcy50aWNrUmVuZGVyZXIodGhpcy50aWNrT3B0aW9ucyk7aWYoZS5jb25zdHJ1Y3Rvcj09QXJyYXkpe2gudmFsdWU9ZVswXTtoLmxhYmVsPWVbMV07aWYoIXRoaXMuc2hvd1RpY2tzKXtoLnNob3dMYWJlbD1mYWxzZTtoLnNob3dNYXJrPWZhbHNlfWVsc2V7aWYoIXRoaXMuc2hvd1RpY2tNYXJrcyl7aC5zaG93TWFyaz1mYWxzZX19aC5zZXRUaWNrKGVbMF0sdGhpcy5uYW1lKTt0aGlzLl90aWNrcy5wdXNoKGgpfWVsc2V7aC52YWx1ZT1lO2lmKCF0aGlzLnNob3dUaWNrcyl7aC5zaG93TGFiZWw9ZmFsc2U7aC5zaG93TWFyaz1mYWxzZX1lbHNle2lmKCF0aGlzLnNob3dUaWNrTWFya3Mpe2guc2hvd01hcms9ZmFsc2V9fWguc2V0VGljayhlLHRoaXMubmFtZSk7dGhpcy5fdGlja3MucHVzaChoKX19dGhpcy5udW1iZXJUaWNrcz13Lmxlbmd0aDt0aGlzLm1pbj10aGlzLl90aWNrc1swXS52YWx1ZTt0aGlzLm1heD10aGlzLl90aWNrc1t0aGlzLm51bWJlclRpY2tzLTFdLnZhbHVlO3RoaXMudGlja0ludGVydmFsPSh0aGlzLm1heC10aGlzLm1pbikvKHRoaXMubnVtYmVyVGlja3MtMSl9ZWxzZXtpZihCPT0ieGF4aXMifHxCPT0ieDJheGlzIil7cD10aGlzLl9wbG90RGltZW5zaW9ucy53aWR0aH1lbHNle3A9dGhpcy5fcGxvdERpbWVuc2lvbnMuaGVpZ2h0fWlmKHRoaXMubWluIT1udWxsJiZ0aGlzLm1heCE9bnVsbCYmdGhpcy5udW1iZXJUaWNrcyE9bnVsbCl7dGhpcy50aWNrSW50ZXJ2YWw9bnVsbH1uPSh0aGlzLm1pbiE9bnVsbCk/dGhpcy5taW46eS5taW47cj0odGhpcy5tYXghPW51bGwpP3RoaXMubWF4OnkubWF4O2lmKG49PXIpe3ZhciBnPTAuMDU7aWYobj4wKXtnPU1hdGgubWF4KE1hdGgubG9nKG4pL01hdGguTE4xMCwwLjA1KX1uLT1nO3IrPWd9dmFyIGs9ci1uO3ZhciBtLG87dmFyIHYsbCx1O3ZhciBmPVszLDUsNiwxMSwyMV07aWYodGhpcy5uYW1lPT0ieWF4aXMifHx0aGlzLm5hbWU9PSJ5MmF4aXMiKXt0aGlzLm1pbj0wO3RoaXMubWF4PTEwMDtpZighdGhpcy5udW1iZXJUaWNrcyl7aWYodGhpcy50aWNrSW50ZXJ2YWwpe3RoaXMubnVtYmVyVGlja3M9MytNYXRoLmNlaWwoay90aGlzLnRpY2tJbnRlcnZhbCl9ZWxzZXt2PTIrTWF0aC5jZWlsKChwLSh0aGlzLnRpY2tTcGFjaW5nLTEpKS90aGlzLnRpY2tTcGFjaW5nKTtmb3Iocz0wO3M8Zi5sZW5ndGg7cysrKXt1PXYvZltzXTtpZih1PT0xKXt0aGlzLm51bWJlclRpY2tzPWZbc107YnJlYWt9ZWxzZXtpZih1PjEpe2w9dTtjb250aW51ZX1lbHNle2lmKHU8MSl7aWYoTWF0aC5hYnMobC0xKTxNYXRoLmFicyh1LTEpKXt0aGlzLm51bWJlclRpY2tzPWZbcy0xXTticmVha31lbHNle3RoaXMubnVtYmVyVGlja3M9ZltzXTticmVha319ZWxzZXtpZihzPT1mLmxlbmd0aC0xKXt0aGlzLm51bWJlclRpY2tzPWZbc119fX19fXRoaXMudGlja0ludGVydmFsPWsvKHRoaXMubnVtYmVyVGlja3MtMSl9fWVsc2V7dGhpcy50aWNrSW50ZXJ2YWw9ay8odGhpcy5udW1iZXJUaWNrcy0xKX1mb3IodmFyIHM9MDtzPHRoaXMubnVtYmVyVGlja3M7cysrKXtiPXRoaXMubWluK3MqdGhpcy50aWNrSW50ZXJ2YWw7aD1uZXcgdGhpcy50aWNrUmVuZGVyZXIodGhpcy50aWNrT3B0aW9ucyk7aWYoIXRoaXMuc2hvd1RpY2tzKXtoLnNob3dMYWJlbD1mYWxzZTtoLnNob3dNYXJrPWZhbHNlfWVsc2V7aWYoIXRoaXMuc2hvd1RpY2tNYXJrcyl7aC5zaG93TWFyaz1mYWxzZX19aC5zZXRUaWNrKGIsdGhpcy5uYW1lKTt0aGlzLl90aWNrcy5wdXNoKGgpfX1lbHNle2lmKHRoaXMudGlja01vZGU9PSJiYXIiKXt0aGlzLm1pbj0wO3RoaXMubnVtYmVyVGlja3M9dGhpcy5fc2VyaWVzLmxlbmd0aCsxO2g9bmV3IHRoaXMudGlja1JlbmRlcmVyKHRoaXMudGlja09wdGlvbnMpO2lmKCF0aGlzLnNob3dUaWNrcyl7aC5zaG93TGFiZWw9ZmFsc2U7aC5zaG93TWFyaz1mYWxzZX1lbHNle2lmKCF0aGlzLnNob3dUaWNrTWFya3Mpe2guc2hvd01hcms9ZmFsc2V9fWguc2V0VGljaygwLHRoaXMubmFtZSk7dGhpcy5fdGlja3MucHVzaChoKTt2PTA7Zm9yKHM9MTtzPHRoaXMubnVtYmVyVGlja3M7cysrKXt2Kz10aGlzLl9zZXJpZXNbcy0xXS5fc3VteTtoPW5ldyB0aGlzLnRpY2tSZW5kZXJlcih0aGlzLnRpY2tPcHRpb25zKTtpZighdGhpcy5zaG93VGlja3Mpe2guc2hvd0xhYmVsPWZhbHNlO2guc2hvd01hcms9ZmFsc2V9ZWxzZXtpZighdGhpcy5zaG93VGlja01hcmtzKXtoLnNob3dNYXJrPWZhbHNlfX1oLnNldFRpY2sodix0aGlzLm5hbWUpO3RoaXMuX3RpY2tzLnB1c2goaCl9dGhpcy5tYXg9dGhpcy5tYXh8fHY7aWYodGhpcy5tYXg+dil7aD1uZXcgdGhpcy50aWNrUmVuZGVyZXIodGhpcy50aWNrT3B0aW9ucyk7aWYoIXRoaXMuc2hvd1RpY2tzKXtoLnNob3dMYWJlbD1mYWxzZTtoLnNob3dNYXJrPWZhbHNlfWVsc2V7aWYoIXRoaXMuc2hvd1RpY2tNYXJrcyl7aC5zaG93TWFyaz1mYWxzZX19aC5zZXRUaWNrKHRoaXMubWF4LHRoaXMubmFtZSk7dGhpcy5fdGlja3MucHVzaChoKX19ZWxzZXtpZih0aGlzLnRpY2tNb2RlPT0iZXZlbiIpe3RoaXMubWluPTA7dGhpcy5tYXg9dGhpcy5tYXh8fHkubWF4O3ZhciBBPTIrTWF0aC5jZWlsKChwLSh0aGlzLnRpY2tTcGFjaW5nLTEpKS90aGlzLnRpY2tTcGFjaW5nKTtrPXRoaXMubWF4LXRoaXMubWluO3RoaXMubnVtYmVyVGlja3M9QTt0aGlzLnRpY2tJbnRlcnZhbD1rLyh0aGlzLm51bWJlclRpY2tzLTEpO2ZvcihzPTA7czx0aGlzLm51bWJlclRpY2tzO3MrKyl7Yj10aGlzLm1pbitzKnRoaXMudGlja0ludGVydmFsO2g9bmV3IHRoaXMudGlja1JlbmRlcmVyKHRoaXMudGlja09wdGlvbnMpO2lmKCF0aGlzLnNob3dUaWNrcyl7aC5zaG93TGFiZWw9ZmFsc2U7aC5zaG93TWFyaz1mYWxzZX1lbHNle2lmKCF0aGlzLnNob3dUaWNrTWFya3Mpe2guc2hvd01hcms9ZmFsc2V9fWguc2V0VGljayhiLHRoaXMubmFtZSk7dGhpcy5fdGlja3MucHVzaChoKX19fX19fTthLmpxcGxvdC5NZWtrb0F4aXNSZW5kZXJlci5wcm90b3R5cGUucGFjaz1mdW5jdGlvbihlLGQpe3ZhciBDPXRoaXMuX3RpY2tzO3ZhciB4PXRoaXMubWF4O3ZhciB2PXRoaXMubWluO3ZhciBtPWQubWF4O3ZhciBqPWQubWluO3ZhciBvPSh0aGlzLl9sYWJlbD09bnVsbCk/ZmFsc2U6dGhpcy5fbGFiZWwuc2hvdztmb3IodmFyIHMgaW4gZSl7dGhpcy5fZWxlbS5jc3MocyxlW3NdKX10aGlzLl9vZmZzZXRzPWQ7dmFyIGY9bS1qO3ZhciBnPXgtdjt0aGlzLnAydT1mdW5jdGlvbihiKXtyZXR1cm4oYi1qKSpnL2Yrdn07dGhpcy51MnA9ZnVuY3Rpb24oYil7cmV0dXJuKGItdikqZi9nK2p9O2lmKHRoaXMubmFtZT09InhheGlzInx8dGhpcy5uYW1lPT0ieDJheGlzIil7dGhpcy5zZXJpZXNfdTJwPWZ1bmN0aW9uKGIpe3JldHVybihiLXYpKmYvZ307dGhpcy5zZXJpZXNfcDJ1PWZ1bmN0aW9uKGIpe3JldHVybiBiKmcvZit2fX1lbHNle3RoaXMuc2VyaWVzX3UycD1mdW5jdGlvbihiKXtyZXR1cm4oYi14KSpmL2d9O3RoaXMuc2VyaWVzX3AydT1mdW5jdGlvbihiKXtyZXR1cm4gYipnL2YreH19aWYodGhpcy5zaG93KXtpZih0aGlzLm5hbWU9PSJ4YXhpcyJ8fHRoaXMubmFtZT09IngyYXhpcyIpe2Zvcih2YXIgeT0wO3k8Qy5sZW5ndGg7eSsrKXt2YXIgbj1DW3ldO2lmKG4uc2hvdyYmbi5zaG93TGFiZWwpe3ZhciBjO2lmKG4uY29uc3RydWN0b3I9PWEuanFwbG90LkNhbnZhc0F4aXNUaWNrUmVuZGVyZXImJm4uYW5nbGUpe3ZhciBBPSh0aGlzLm5hbWU9PSJ4YXhpcyIpPzE6LTE7c3dpdGNoKG4ubGFiZWxQb3NpdGlvbil7Y2FzZSJhdXRvIjppZihBKm4uYW5nbGU8MCl7Yz0tbi5nZXRXaWR0aCgpK24uX3RleHRSZW5kZXJlci5oZWlnaHQqTWF0aC5zaW4oLW4uX3RleHRSZW5kZXJlci5hbmdsZSkvMn1lbHNle2M9LW4uX3RleHRSZW5kZXJlci5oZWlnaHQqTWF0aC5zaW4obi5fdGV4dFJlbmRlcmVyLmFuZ2xlKS8yfWJyZWFrO2Nhc2UiZW5kIjpjPS1uLmdldFdpZHRoKCkrbi5fdGV4dFJlbmRlcmVyLmhlaWdodCpNYXRoLnNpbigtbi5fdGV4dFJlbmRlcmVyLmFuZ2xlKS8yO2JyZWFrO2Nhc2Uic3RhcnQiOmM9LW4uX3RleHRSZW5kZXJlci5oZWlnaHQqTWF0aC5zaW4obi5fdGV4dFJlbmRlcmVyLmFuZ2xlKS8yO2JyZWFrO2Nhc2UibWlkZGxlIjpjPS1uLmdldFdpZHRoKCkvMituLl90ZXh0UmVuZGVyZXIuaGVpZ2h0Kk1hdGguc2luKC1uLl90ZXh0UmVuZGVyZXIuYW5nbGUpLzI7YnJlYWs7ZGVmYXVsdDpjPS1uLmdldFdpZHRoKCkvMituLl90ZXh0UmVuZGVyZXIuaGVpZ2h0Kk1hdGguc2luKC1uLl90ZXh0UmVuZGVyZXIuYW5nbGUpLzI7YnJlYWt9fWVsc2V7Yz0tbi5nZXRXaWR0aCgpLzJ9dmFyIEQ9dGhpcy51MnAobi52YWx1ZSkrYysicHgiO24uX2VsZW0uY3NzKCJsZWZ0IixEKTtuLnBhY2soKX19dmFyIGs7aWYobyl7az10aGlzLl9sYWJlbC5fZWxlbS5vdXRlcldpZHRoKHRydWUpO3RoaXMuX2xhYmVsLl9lbGVtLmNzcygibGVmdCIsaitmLzItay8yKyJweCIpO2lmKHRoaXMubmFtZT09InhheGlzIil7dGhpcy5fbGFiZWwuX2VsZW0uY3NzKCJib3R0b20iLCIwcHgiKX1lbHNle3RoaXMuX2xhYmVsLl9lbGVtLmNzcygidG9wIiwiMHB4Iil9dGhpcy5fbGFiZWwucGFjaygpfXZhciBCLHUscTtmb3IodmFyIHk9MDt5PHRoaXMuYmFyTGFiZWxzLmxlbmd0aDt5Kyspe0I9dGhpcy5fYmFyTGFiZWxzW3ldO2lmKEIuc2hvdyl7az1CLmdldFdpZHRoKCk7dT10aGlzLl90aWNrc1t5XS5nZXRMZWZ0KCkrdGhpcy5fdGlja3NbeV0uZ2V0V2lkdGgoKTtxPXRoaXMuX3RpY2tzW3krMV0uZ2V0TGVmdCgpO0IuX2VsZW0uY3NzKCJsZWZ0IiwocSt1LWspLzIrInB4Iik7Qi5fZWxlbS5jc3MoInRvcCIsdGhpcy5fdGlja3NbeV0uX2VsZW0uY3NzKCJ0b3AiKSk7Qi5wYWNrKCl9fX1lbHNle2Zvcih2YXIgeT0wO3k8Qy5sZW5ndGg7eSsrKXt2YXIgbj1DW3ldO2lmKG4uc2hvdyYmbi5zaG93TGFiZWwpe3ZhciBjO2lmKG4uY29uc3RydWN0b3I9PWEuanFwbG90LkNhbnZhc0F4aXNUaWNrUmVuZGVyZXImJm4uYW5nbGUpe3ZhciBBPSh0aGlzLm5hbWU9PSJ5YXhpcyIpPzE6LTE7c3dpdGNoKG4ubGFiZWxQb3NpdGlvbil7Y2FzZSJhdXRvIjpjYXNlImVuZCI6aWYoQSpuLmFuZ2xlPDApe2M9LW4uX3RleHRSZW5kZXJlci5oZWlnaHQqTWF0aC5jb3MoLW4uX3RleHRSZW5kZXJlci5hbmdsZSkvMn1lbHNle2M9LW4uZ2V0SGVpZ2h0KCkrbi5fdGV4dFJlbmRlcmVyLmhlaWdodCpNYXRoLmNvcyhuLl90ZXh0UmVuZGVyZXIuYW5nbGUpLzJ9YnJlYWs7Y2FzZSJzdGFydCI6aWYobi5hbmdsZT4wKXtjPS1uLl90ZXh0UmVuZGVyZXIuaGVpZ2h0Kk1hdGguY29zKC1uLl90ZXh0UmVuZGVyZXIuYW5nbGUpLzJ9ZWxzZXtjPS1uLmdldEhlaWdodCgpK24uX3RleHRSZW5kZXJlci5oZWlnaHQqTWF0aC5jb3Mobi5fdGV4dFJlbmRlcmVyLmFuZ2xlKS8yfWJyZWFrO2Nhc2UibWlkZGxlIjpjPS1uLmdldEhlaWdodCgpLzI7YnJlYWs7ZGVmYXVsdDpjPS1uLmdldEhlaWdodCgpLzI7YnJlYWt9fWVsc2V7Yz0tbi5nZXRIZWlnaHQoKS8yfXZhciBEPXRoaXMudTJwKG4udmFsdWUpK2MrInB4IjtuLl9lbGVtLmNzcygidG9wIixEKTtuLnBhY2soKX19aWYobyl7dmFyIHo9dGhpcy5fbGFiZWwuX2VsZW0ub3V0ZXJIZWlnaHQodHJ1ZSk7dGhpcy5fbGFiZWwuX2VsZW0uY3NzKCJ0b3AiLG0tZi8yLXovMisicHgiKTtpZih0aGlzLm5hbWU9PSJ5YXhpcyIpe3RoaXMuX2xhYmVsLl9lbGVtLmNzcygibGVmdCIsIjBweCIpfWVsc2V7dGhpcy5fbGFiZWwuX2VsZW0uY3NzKCJyaWdodCIsIjBweCIpfXRoaXMuX2xhYmVsLnBhY2soKX19fX19KShqUXVlcnkpOw==]]></data>
	</file>
	<file>
	  <filename>/src/plugins/jqplot.mekkoRenderer.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqCiAqIGpxUGxvdAogKiBQdXJlIEphdmFTY3JpcHQgcGxvdHRpbmcgcGx1Z2luIHVzaW5nIGpRdWVyeQogKgogKiBWZXJzaW9uOiAxLjAuMGIyX3IxMDEyCiAqCiAqIENvcHlyaWdodCAoYykgMjAwOS0yMDExIENocmlzIExlb25lbGxvCiAqIGpxUGxvdCBpcyBjdXJyZW50bHkgYXZhaWxhYmxlIGZvciB1c2UgaW4gYWxsIHBlcnNvbmFsIG9yIGNvbW1lcmNpYWwgcHJvamVjdHMgCiAqIHVuZGVyIGJvdGggdGhlIE1JVCAoaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHApIGFuZCBHUEwgCiAqIHZlcnNpb24gMi4wIChodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC5odG1sKSBsaWNlbnNlcy4gVGhpcyBtZWFucyB0aGF0IHlvdSBjYW4gCiAqIGNob29zZSB0aGUgbGljZW5zZSB0aGF0IGJlc3Qgc3VpdHMgeW91ciBwcm9qZWN0IGFuZCB1c2UgaXQgYWNjb3JkaW5nbHkuIAogKgogKiBBbHRob3VnaCBub3QgcmVxdWlyZWQsIHRoZSBhdXRob3Igd291bGQgYXBwcmVjaWF0ZSBhbiBlbWFpbCBsZXR0aW5nIGhpbSAKICoga25vdyBvZiBhbnkgc3Vic3RhbnRpYWwgdXNlIG9mIGpxUGxvdC4gIFlvdSBjYW4gcmVhY2ggdGhlIGF1dGhvciBhdDogCiAqIGNocmlzIGF0IGpxcGxvdCBkb3QgY29tIG9yIHNlZSBodHRwOi8vd3d3LmpxcGxvdC5jb20vaW5mby5waHAgLgogKgogKiBJZiB5b3UgYXJlIGZlZWxpbmcga2luZCBhbmQgZ2VuZXJvdXMsIGNvbnNpZGVyIHN1cHBvcnRpbmcgdGhlIHByb2plY3QgYnkKICogbWFraW5nIGEgZG9uYXRpb24gYXQ6IGh0dHA6Ly93d3cuanFwbG90LmNvbS9kb25hdGUucGhwIC4KICoKICogc3ByaW50ZiBmdW5jdGlvbnMgY29udGFpbmVkIGluIGpxcGxvdC5zcHJpbnRmLmpzIGJ5IEFzaCBTZWFybGU6CiAqCiAqICAgICB2ZXJzaW9uIDIwMDcuMDQuMjcKICogICAgIGF1dGhvciBBc2ggU2VhcmxlCiAqICAgICBodHRwOi8vaGV4bWVuLmNvbS9ibG9nLzIwMDcvMDMvcHJpbnRmLXNwcmludGYvCiAqICAgICBodHRwOi8vaGV4bWVuLmNvbS9qcy9zcHJpbnRmLmpzCiAqICAgICBUaGUgYXV0aG9yIChBc2ggU2VhcmxlKSBoYXMgcGxhY2VkIHRoaXMgY29kZSBpbiB0aGUgcHVibGljIGRvbWFpbjoKICogICAgICJUaGlzIGNvZGUgaXMgdW5yZXN0cmljdGVkOiB5b3UgYXJlIGZyZWUgdG8gdXNlIGl0IGhvd2V2ZXIgeW91IGxpa2UuIgogKiAKICovCihmdW5jdGlvbigkKSB7CiAgICAvKioKICAgICAqIENsYXNzOiAkLmpxcGxvdC5NZWtrb1JlbmRlcmVyCiAgICAgKiBEcmF3cyBhIE1la2tvIHN0eWxlIGNoYXJ0IHdoaWNoIHNob3dzIDMgZGltZW5zaW9uYWwgZGF0YSBvbiBhIDIgZGltZW5zaW9uYWwgZ3JhcGguCiAgICAgKiB0aGUgPCQuanFwbG90Lk1la2tvQXhpc1JlbmRlcmVyPiBzaG91bGQgYmUgdXNlZCB3aXRoIG1la2tvIGNoYXJ0cy4gIFRoZSBtZWtrbyByZW5kZXJlcgogICAgICogb3ZlcnJpZGVzIHRoZSBkZWZhdWx0IGxlZ2VuZCByZW5kZXJlciB3aXRoIGl0J3Mgb3duICQuanFwbG90Lk1la2tvTGVnZW5kUmVuZGVyZXIKICAgICAqIHdoaWNoIGFsbG93cyBtb3JlIGZsZXhpYmlsaXR5IHRvIHNwZWNpZnkgbnVtYmVyIG9mIHJvd3MgYW5kIGNvbHVtbnMgaW4gdGhlIGxlZ2VuZC4KICAgICAqIAogICAgICogRGF0YSBpcyBzcGVjaWZpZWQgcGVyIGJhciBpbiB0aGUgY2hhcnQuICBZb3UgY2FuIHNwZWNpZnkgZGF0YSBhcyBhbiBhcnJheSBvZiB5IHZhbHVlcywgb3IgYXMgCiAgICAgKiBhbiBhcnJheSBvZiBbbGFiZWwsIHZhbHVlXSBwYWlycy4gIE5vdGUgdGhhdCBsYWJlbHMgYXJlIHVzZWQgb25seSBvbiB0aGUgZmlyc3Qgc2VyaWVzLiAgCiAgICAgKiBMYWJlbHMgb24gc3Vic2VxdWVudCBzZXJpZXMgYXJlIGlnbm9yZWQ6CiAgICAgKiAKICAgICAqID4gYmFyMSA9IFtbJ3NoaXJ0cycsIDhdLFsnaGF0cycsIDE0XSxbJ3Nob2VzJywgNl0sWydnbG92ZXMnLCAxNl0sWydkb2xscycsIDEyXV07CiAgICAgKiA+IGJhcjIgPSBbMTUsNiw5LDEzLDZdOwogICAgICogPiBiYXIzID0gW1snZ3J1bXB5Jyw0XSxbJ3NuZWV6eScsMl0sWydoYXBweScsN10sWydzbGVlcHknLDldLFsnZG9jJyw3XV07CiAgICAgKiAKICAgICAqIElmIHlvdSB3YW50IHRvIHBsYWNlIGxhYmVscyBmb3IgZWFjaCBiYXIgdW5kZXIgdGhlIGF4aXMsIHlvdSB1c2UgdGhlIGJhckxhYmVscyBvcHRpb24gb24gCiAgICAgKiB0aGUgYXhlcy4gIFRoZSBiYXIgbGFiZWxzIGNhbiBiZSBzdHlsZWQgd2l0aCB0aGUgIi5qcXBsb3QtbWVra28tYmFyTGFiZWwiIGNzcyBjbGFzcy4KICAgICAqIAogICAgICogPiBiYXJMYWJlbHMgPSBbJ01pY2tleSBNb3VzZScsICdEb25hbGQgRHVjaycsICdHb29meSddOwogICAgICogPiBheGVzOnt4YXhpczp7YmFyTGFiZWxzOmJhckxhYmVsc319CiAgICAgKiAKICAgICAqLwogICAgCiAgICAKICAgICQuanFwbG90Lk1la2tvUmVuZGVyZXIgPSBmdW5jdGlvbigpewogICAgICAgIHRoaXMuc2hhcGVSZW5kZXJlciA9IG5ldyAkLmpxcGxvdC5TaGFwZVJlbmRlcmVyKCk7CiAgICAgICAgLy8gcHJvcDogYm9yZGVyQ29sb3IKICAgICAgICAvLyBjb2xvciBvZiB0aGUgYm9yZGVycyBiZXR3ZWVuIGFyZWFzIG9uIHRoZSBjaGFydAogICAgICAgIHRoaXMuYm9yZGVyQ29sb3IgPSBudWxsOwogICAgICAgIC8vIHByb3A6IHNob3dCb3JkZXJzCiAgICAgICAgLy8gVHJ1ZSB0byBkcmF3IGJvcmRlcnMgbGluZXMgYmV0d2VlbiBhcmVhcyBvbiB0aGUgY2hhcnQuCiAgICAgICAgLy8gRmFsc2Ugd2lsbCBkcmF3IGJvcmRlcnMgbGluZXMgd2l0aCB0aGUgc2FtZSBjb2xvciBhcyB0aGUgYXJlYS4KICAgICAgICB0aGlzLnNob3dCb3JkZXJzID0gdHJ1ZTsKICAgIH07CiAgICAKICAgIC8vIGNhbGxlZCB3aXRoIHNjb3BlIG9mIHNlcmllcy4KICAgICQuanFwbG90Lk1la2tvUmVuZGVyZXIucHJvdG90eXBlLmluaXQgPSBmdW5jdGlvbihvcHRpb25zLCBwbG90KSB7CiAgICAgICAgdGhpcy5maWxsID0gZmFsc2U7CiAgICAgICAgdGhpcy5maWxsUmVjdCA9IHRydWU7CiAgICAgICAgdGhpcy5zdHJva2VSZWN0ID0gdHJ1ZTsKICAgICAgICB0aGlzLnNoYWRvdyA9IGZhbHNlOwogICAgICAgIC8vIHdpZHRoIG9mIGJhciBvbiB4IGF4aXMuCiAgICAgICAgdGhpcy5feHdpZHRoID0gMDsKICAgICAgICB0aGlzLl94c3RhcnQgPSAwOwogICAgICAgICQuZXh0ZW5kKHRydWUsIHRoaXMucmVuZGVyZXIsIG9wdGlvbnMpOwogICAgICAgIC8vIHNldCB0aGUgc2hhcGUgcmVuZGVyZXIgb3B0aW9ucwogICAgICAgIHZhciBvcHRzID0ge2xpbmVKb2luOidtaXRlcicsIGxpbmVDYXA6J2J1dHQnLCBpc2FyYzpmYWxzZSwgZmlsbFJlY3Q6dGhpcy5maWxsUmVjdCwgc3Ryb2tlUmVjdDp0aGlzLnN0cm9rZVJlY3R9OwogICAgICAgIHRoaXMucmVuZGVyZXIuc2hhcGVSZW5kZXJlci5pbml0KG9wdHMpOwogICAgICAgIHBsb3QuYXhlcy54MmF4aXMuX3Nlcmllcy5wdXNoKHRoaXMpOwogICAgICAgIHRoaXMuX3R5cGUgPSAnbWVra28nOwogICAgfTsKICAgIAogICAgLy8gTWV0aG9kOiBzZXRHcmlkRGF0YQogICAgLy8gY29udmVydHMgdGhlIHVzZXIgZGF0YSB2YWx1ZXMgdG8gZ3JpZCBjb29yZGluYXRlcyBhbmQgc3RvcmVzIHRoZW0KICAgIC8vIGluIHRoZSBncmlkRGF0YSBhcnJheS4gIFdpbGwgY29udmVydCB1c2VyIGRhdGEgaW50byBhcHByb3ByaWF0ZQogICAgLy8gcmVjdGFuZ2xlcy4KICAgIC8vIENhbGxlZCB3aXRoIHNjb3BlIG9mIGEgc2VyaWVzLgogICAgJC5qcXBsb3QuTWVra29SZW5kZXJlci5wcm90b3R5cGUuc2V0R3JpZERhdGEgPSBmdW5jdGlvbihwbG90KSB7CiAgICAgICAgLy8gcmVjYWxjdWxhdGUgdGhlIGdyaWQgZGF0YQogICAgICAgIHZhciB4cCA9IHRoaXMuX3hheGlzLnNlcmllc191MnA7CiAgICAgICAgdmFyIHlwID0gdGhpcy5feWF4aXMuc2VyaWVzX3UycDsKICAgICAgICB2YXIgZGF0YSA9IHRoaXMuX3Bsb3REYXRhOwogICAgICAgIHRoaXMuZ3JpZERhdGEgPSBbXTsKICAgICAgICAvLyBmaWd1cmUgb3V0IHdpZHRoIG9uIHggYXhpcy4KICAgICAgICAvLyB0aGlzLl94d2lkdGggPSB0aGlzLl9zdW15IC8gcGxvdC5fc3VteSAqIHRoaXMuY2FudmFzLmdldFdpZHRoKCk7CiAgICAgICAgdGhpcy5feHdpZHRoID0geHAodGhpcy5fc3VteSkgLSB4cCgwKTsKICAgICAgICBpZiAodGhpcy5pbmRleD4wKSB7CiAgICAgICAgICAgIHRoaXMuX3hzdGFydCA9IHBsb3Quc2VyaWVzW3RoaXMuaW5kZXgtMV0uX3hzdGFydCArIHBsb3Quc2VyaWVzW3RoaXMuaW5kZXgtMV0uX3h3aWR0aDsKICAgICAgICB9CiAgICAgICAgdmFyIHRvdGhlaWdodCA9IHRoaXMuY2FudmFzLmdldEhlaWdodCgpOwogICAgICAgIHZhciBzdW15ID0gMDsKICAgICAgICB2YXIgY3VyeTsKICAgICAgICB2YXIgY3VyaGVpZ2h0OwogICAgICAgIGZvciAodmFyIGk9MDsgaTxkYXRhLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIGlmIChkYXRhW2ldICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIHN1bXkgKz0gZGF0YVtpXVsxXTsKICAgICAgICAgICAgICAgIGN1cnkgPSB0b3RoZWlnaHQgLSAoc3VteSAvIHRoaXMuX3N1bXkgKiB0b3RoZWlnaHQpOwogICAgICAgICAgICAgICAgY3VyaGVpZ2h0ID0gZGF0YVtpXVsxXSAvIHRoaXMuX3N1bXkgKiB0b3RoZWlnaHQ7CiAgICAgICAgICAgICAgICB0aGlzLmdyaWREYXRhLnB1c2goW3RoaXMuX3hzdGFydCwgY3VyeSwgdGhpcy5feHdpZHRoLCBjdXJoZWlnaHRdKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH07CiAgICAKICAgIC8vIE1ldGhvZDogbWFrZUdyaWREYXRhCiAgICAvLyBjb252ZXJ0cyBhbnkgYXJiaXRyYXJ5IGRhdGEgdmFsdWVzIHRvIGdyaWQgY29vcmRpbmF0ZXMgYW5kCiAgICAvLyByZXR1cm5zIHRoZW0uICBUaGlzIG1ldGhvZCBleGlzdHMgc28gdGhhdCBwbHVnaW5zIGNhbiB1c2UgYSBzZXJpZXMnCiAgICAvLyBsaW5lcmVuZGVyZXIgdG8gZ2VuZXJhdGUgZ3JpZCBkYXRhIHBvaW50cyB3aXRob3V0IG92ZXJ3cml0aW5nIHRoZQogICAgLy8gZ3JpZCBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGF0IHNlcmllcy4KICAgIC8vIENhbGxlZCB3aXRoIHNjb3BlIG9mIGEgc2VyaWVzLgogICAgJC5qcXBsb3QuTWVra29SZW5kZXJlci5wcm90b3R5cGUubWFrZUdyaWREYXRhID0gZnVuY3Rpb24oZGF0YSwgcGxvdCkgewogICAgICAgIC8vIHJlY2FsY3VsYXRlIHRoZSBncmlkIGRhdGEKICAgICAgICAvLyBmaWd1cmUgb3V0IHdpZHRoIG9uIHggYXhpcy4KICAgICAgICB2YXIgeHAgPSB0aGlzLl94YXhpcy5zZXJpZXNfdTJwOwogICAgICAgIHZhciB0b3RoZWlnaHQgPSB0aGlzLmNhbnZhcy5nZXRIZWlnaHQoKTsKICAgICAgICB2YXIgc3VteSA9IDA7CiAgICAgICAgdmFyIGN1cnk7CiAgICAgICAgdmFyIGN1cmhlaWdodDsKICAgICAgICB2YXIgZ2QgPSBbXTsKICAgICAgICBmb3IgKHZhciBpPTA7IGk8ZGF0YS5sZW5ndGg7IGkrKykgewogICAgICAgICAgICBpZiAoZGF0YVtpXSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICBzdW15ICs9IGRhdGFbaV1bMV07CiAgICAgICAgICAgICAgICBjdXJ5ID0gdG90aGVpZ2h0IC0gKHN1bXkgLyB0aGlzLl9zdW15ICogdG90aGVpZ2h0KTsKICAgICAgICAgICAgICAgIGN1cmhlaWdodCA9IGRhdGFbaV1bMV0gLyB0aGlzLl9zdW15ICogdG90aGVpZ2h0OwogICAgICAgICAgICAgICAgZ2QucHVzaChbdGhpcy5feHN0YXJ0LCBjdXJ5LCB0aGlzLl94d2lkdGgsIGN1cmhlaWdodF0pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBnZDsKICAgIH07CiAgICAKCiAgICAvLyBjYWxsZWQgd2l0aGluIHNjb3BlIG9mIHNlcmllcy4KICAgICQuanFwbG90Lk1la2tvUmVuZGVyZXIucHJvdG90eXBlLmRyYXcgPSBmdW5jdGlvbihjdHgsIGdkLCBvcHRpb25zKSB7CiAgICAgICAgdmFyIGk7CiAgICAgICAgdmFyIG9wdHMgPSAob3B0aW9ucyAhPSB1bmRlZmluZWQpID8gb3B0aW9ucyA6IHt9OwogICAgICAgIHZhciBzaG93TGluZSA9IChvcHRzLnNob3dMaW5lICE9IHVuZGVmaW5lZCkgPyBvcHRzLnNob3dMaW5lIDogdGhpcy5zaG93TGluZTsKICAgICAgICB2YXIgY29sb3JHZW5lcmF0b3IgPSBuZXcgJC5qcXBsb3QuQ29sb3JHZW5lcmF0b3IodGhpcy5zZXJpZXNDb2xvcnMpOwogICAgICAgIGN0eC5zYXZlKCk7CiAgICAgICAgaWYgKGdkLmxlbmd0aCkgewogICAgICAgICAgICBpZiAoc2hvd0xpbmUpIHsKICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpPGdkLmxlbmd0aDsgaSsrKXsKICAgICAgICAgICAgICAgICAgICBvcHRzLmZpbGxTdHlsZSA9IGNvbG9yR2VuZXJhdG9yLm5leHQoKTsKICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5yZW5kZXJlci5zaG93Qm9yZGVycykgewogICAgICAgICAgICAgICAgICAgICAgICBvcHRzLnN0cm9rZVN0eWxlID0gdGhpcy5yZW5kZXJlci5ib3JkZXJDb2xvcjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG9wdHMuc3Ryb2tlU3R5bGUgPSBvcHRzLmZpbGxTdHlsZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zaGFwZVJlbmRlcmVyLmRyYXcoY3R4LCBnZFtpXSwgb3B0cyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgY3R4LnJlc3RvcmUoKTsKICAgIH07ICAKICAgIAogICAgJC5qcXBsb3QuTWVra29SZW5kZXJlci5wcm90b3R5cGUuZHJhd1NoYWRvdyA9IGZ1bmN0aW9uKGN0eCwgZ2QsIG9wdGlvbnMpIHsKICAgICAgICAvLyBUaGlzIGlzIGEgbm8tb3AsIG5vIHNoYWRvd3Mgb24gbWVra28gY2hhcnRzLgogICAgfTsKICAgIAogICAgLyoqCiAgICAgKiBDbGFzczogJC5qcXBsb3QuTWVra29MZWdlbmRSZW5kZXJlcgogICAgICogTGVnZW5kIHJlbmRlcmVyIHVzZWQgYnkgbWVra28gY2hhcnRzIHdpdGggb3B0aW9ucyBmb3IgCiAgICAgKiBjb250cm9sbGluZyBudW1iZXIgb3Igcm93cyBhbmQgY29sdW1ucyBhcyB3ZWxsIGFzIHBsYWNlbWVudAogICAgICogb3V0c2lkZSBvZiBwbG90IGFyZWEuCiAgICAgKiAKICAgICAqLwogICAgJC5qcXBsb3QuTWVra29MZWdlbmRSZW5kZXJlciA9IGZ1bmN0aW9uKCl7CiAgICAgICAgLy8KICAgIH07CiAgICAKICAgICQuanFwbG90Lk1la2tvTGVnZW5kUmVuZGVyZXIucHJvdG90eXBlLmluaXQgPSBmdW5jdGlvbihvcHRpb25zKSB7CiAgICAgICAgLy8gcHJvcDogbnVtYmVyUm93cwogICAgICAgIC8vIE1heGltdW0gbnVtYmVyIG9mIHJvd3MgaW4gdGhlIGxlZ2VuZC4gIDAgb3IgbnVsbCBmb3IgdW5saW1pdGVkLgogICAgICAgIHRoaXMubnVtYmVyUm93cyA9IG51bGw7CiAgICAgICAgLy8gcHJvcDogbnVtYmVyQ29sdW1ucwogICAgICAgIC8vIE1heGltdW0gbnVtYmVyIG9mIGNvbHVtbnMgaW4gdGhlIGxlZ2VuZC4gIDAgb3IgbnVsbCBmb3IgdW5saW1pdGVkLgogICAgICAgIHRoaXMubnVtYmVyQ29sdW1ucyA9IG51bGw7CiAgICAgICAgLy8gdGhpcyB3aWxsIG92ZXJyaWRlIHRoZSBwbGFjZW1lbnQgb3B0aW9uIG9uIHRoZSBMZWdlbmQgb2JqZWN0CiAgICAgICAgdGhpcy5wbGFjZW1lbnQgPSAib3V0c2lkZSI7CiAgICAgICAgJC5leHRlbmQodHJ1ZSwgdGhpcywgb3B0aW9ucyk7CiAgICB9OwogICAgCiAgICAvLyBjYWxsZWQgd2l0aCBzY29wZSBvZiBsZWdlbmQKICAgICQuanFwbG90Lk1la2tvTGVnZW5kUmVuZGVyZXIucHJvdG90eXBlLmRyYXcgPSBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgbGVnZW5kID0gdGhpczsKICAgICAgICBpZiAodGhpcy5zaG93KSB7CiAgICAgICAgICAgIHZhciBzZXJpZXMgPSB0aGlzLl9zZXJpZXM7CiAgICAgICAgICAgIHZhciBzcyA9ICdwb3NpdGlvbjphYnNvbHV0ZTsnOwogICAgICAgICAgICBzcyArPSAodGhpcy5iYWNrZ3JvdW5kKSA/ICdiYWNrZ3JvdW5kOicrdGhpcy5iYWNrZ3JvdW5kKyc7JyA6ICcnOwogICAgICAgICAgICBzcyArPSAodGhpcy5ib3JkZXIpID8gJ2JvcmRlcjonK3RoaXMuYm9yZGVyKyc7JyA6ICcnOwogICAgICAgICAgICBzcyArPSAodGhpcy5mb250U2l6ZSkgPyAnZm9udC1zaXplOicrdGhpcy5mb250U2l6ZSsnOycgOiAnJzsKICAgICAgICAgICAgc3MgKz0gKHRoaXMuZm9udEZhbWlseSkgPyAnZm9udC1mYW1pbHk6Jyt0aGlzLmZvbnRGYW1pbHkrJzsnIDogJyc7CiAgICAgICAgICAgIHNzICs9ICh0aGlzLnRleHRDb2xvcikgPyAnY29sb3I6Jyt0aGlzLnRleHRDb2xvcisnOycgOiAnJzsKICAgICAgICAgICAgdGhpcy5fZWxlbSA9ICQoJzx0YWJsZSBjbGFzcz0ianFwbG90LXRhYmxlLWxlZ2VuZCIgc3R5bGU9Iicrc3MrJyI+PC90YWJsZT4nKTsKICAgICAgICAgICAgLy8gTWVra28gY2hhcnRzICBsZWdlbmRzIGRvbid0IGdvIGJ5IG51bWJlciBvZiBzZXJpZXMsIGJ1dCBieSBudW1iZXIgb2YgZGF0YSBwb2ludHMKICAgICAgICAgICAgLy8gaW4gdGhlIHNlcmllcy4gIFJlZmFjdG9yIHRoaW5ncyBoZXJlIGZvciB0aGF0LgogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIHBhZCA9IGZhbHNlLCAKICAgICAgICAgICAgICAgIHJldmVyc2UgPSB0cnVlLCAgICAvLyBtZWtrbyBjaGFydHMgYXJlIGFsd2F5cyBzdGFja2VkLCBzbyByZXZlcnNlCiAgICAgICAgICAgICAgICBuciwgbmM7CiAgICAgICAgICAgIHZhciBzID0gc2VyaWVzWzBdOwogICAgICAgICAgICB2YXIgY29sb3JHZW5lcmF0b3IgPSBuZXcgJC5qcXBsb3QuQ29sb3JHZW5lcmF0b3Iocy5zZXJpZXNDb2xvcnMpOwogICAgICAgICAgICAKICAgICAgICAgICAgaWYgKHMuc2hvdykgewogICAgICAgICAgICAgICAgdmFyIHBkID0gcy5kYXRhOwogICAgICAgICAgICAgICAgaWYgKHRoaXMubnVtYmVyUm93cykgewogICAgICAgICAgICAgICAgICAgIG5yID0gdGhpcy5udW1iZXJSb3dzOwogICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5udW1iZXJDb2x1bW5zKXsKICAgICAgICAgICAgICAgICAgICAgICAgbmMgPSBNYXRoLmNlaWwocGQubGVuZ3RoL25yKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZXsKICAgICAgICAgICAgICAgICAgICAgICAgbmMgPSB0aGlzLm51bWJlckNvbHVtbnM7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5udW1iZXJDb2x1bW5zKSB7CiAgICAgICAgICAgICAgICAgICAgbmMgPSB0aGlzLm51bWJlckNvbHVtbnM7CiAgICAgICAgICAgICAgICAgICAgbnIgPSBNYXRoLmNlaWwocGQubGVuZ3RoL3RoaXMubnVtYmVyQ29sdW1ucyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBuciA9IHBkLmxlbmd0aDsKICAgICAgICAgICAgICAgICAgICBuYyA9IDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBpLCBqLCB0ciwgdGQxLCB0ZDIsIGx0LCBycywgY29sb3I7CiAgICAgICAgICAgICAgICB2YXIgaWR4ID0gMDsgICAgCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpPG5yOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICBpZiAocmV2ZXJzZSl7CiAgICAgICAgICAgICAgICAgICAgICAgIHRyID0gJCgnPHRyIGNsYXNzPSJqcXBsb3QtdGFibGUtbGVnZW5kIj48L3RyPicpLnByZXBlbmRUbyh0aGlzLl9lbGVtKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZXsKICAgICAgICAgICAgICAgICAgICAgICAgdHIgPSAkKCc8dHIgY2xhc3M9ImpxcGxvdC10YWJsZS1sZWdlbmQiPjwvdHI+JykuYXBwZW5kVG8odGhpcy5fZWxlbSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZvciAoaj0wOyBqPG5jOyBqKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlkeCA8IHBkLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbHQgPSB0aGlzLmxhYmVsc1tpZHhdIHx8IHBkW2lkeF1bMF0udG9TdHJpbmcoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yID0gY29sb3JHZW5lcmF0b3IubmV4dCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXZlcnNlKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaT4wKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PSBuciAtMSl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJzID0gKHBhZCkgPyB0aGlzLnJvd1NwYWNpbmcgOiAnMCc7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRkMSA9ICQoJzx0ZCBjbGFzcz0ianFwbG90LXRhYmxlLWxlZ2VuZCIgc3R5bGU9InRleHQtYWxpZ246Y2VudGVyO3BhZGRpbmctdG9wOicrcnMrJzsiPicrCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxkaXY+PGRpdiBjbGFzcz0ianFwbG90LXRhYmxlLWxlZ2VuZC1zd2F0Y2giIHN0eWxlPSJib3JkZXItY29sb3I6Jytjb2xvcisnOyI+PC9kaXY+JysKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPC9kaXY+PC90ZD4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRkMiA9ICQoJzx0ZCBjbGFzcz0ianFwbG90LXRhYmxlLWxlZ2VuZCIgc3R5bGU9InBhZGRpbmctdG9wOicrcnMrJzsiPjwvdGQ+Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5lc2NhcGVIdG1sKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZDIudGV4dChsdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZDIuaHRtbChsdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV2ZXJzZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRkMi5wcmVwZW5kVG8odHIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRkMS5wcmVwZW5kVG8odHIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGQxLmFwcGVuZFRvKHRyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZDIuYXBwZW5kVG8odHIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZHgrKzsKICAgICAgICAgICAgICAgICAgICB9ICAgCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdHIgPSBudWxsOwogICAgICAgICAgICAgICAgdGQxID0gbnVsbDsKICAgICAgICAgICAgICAgIHRkMiA9IG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXMuX2VsZW07CiAgICB9OwogICAgCiAgICAkLmpxcGxvdC5NZWtrb0xlZ2VuZFJlbmRlcmVyLnByb3RvdHlwZS5wYWNrID0gZnVuY3Rpb24ob2Zmc2V0cykgewogICAgICAgIGlmICh0aGlzLnNob3cpIHsKICAgICAgICAgICAgLy8gZmFrZSBhIGdyaWQgZm9yIHBvc2l0aW9uaW5nCiAgICAgICAgICAgIHZhciBncmlkID0ge190b3A6b2Zmc2V0cy50b3AsIF9sZWZ0Om9mZnNldHMubGVmdCwgX3JpZ2h0Om9mZnNldHMucmlnaHQsIF9ib3R0b206dGhpcy5fcGxvdERpbWVuc2lvbnMuaGVpZ2h0IC0gb2Zmc2V0cy5ib3R0b219OyAgICAgICAgCiAgICAgICAgICAgIGlmICh0aGlzLnBsYWNlbWVudCA9PSAnaW5zaWRlR3JpZCcpIHsKICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpcy5sb2NhdGlvbikgewogICAgICAgICAgICAgICAgICAgIGNhc2UgJ253JzoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSBncmlkLl9sZWZ0ICsgdGhpcy54b2Zmc2V0OwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYiA9IGdyaWQuX3RvcCArIHRoaXMueW9mZnNldDsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZWxlbS5jc3MoJ2xlZnQnLCBhKTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZWxlbS5jc3MoJ3RvcCcsIGIpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlICduJzoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSAob2Zmc2V0cy5sZWZ0ICsgKHRoaXMuX3Bsb3REaW1lbnNpb25zLndpZHRoIC0gb2Zmc2V0cy5yaWdodCkpLzIgLSB0aGlzLmdldFdpZHRoKCkvMjsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGIgPSBncmlkLl90b3AgKyB0aGlzLnlvZmZzZXQ7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2VsZW0uY3NzKCdsZWZ0JywgYSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2VsZW0uY3NzKCd0b3AnLCBiKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAnbmUnOgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IG9mZnNldHMucmlnaHQgKyB0aGlzLnhvZmZzZXQ7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBiID0gZ3JpZC5fdG9wICsgdGhpcy55b2Zmc2V0OwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9lbGVtLmNzcyh7cmlnaHQ6YSwgdG9wOmJ9KTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAnZSc6CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gb2Zmc2V0cy5yaWdodCArIHRoaXMueG9mZnNldDsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGIgPSAob2Zmc2V0cy50b3AgKyAodGhpcy5fcGxvdERpbWVuc2lvbnMuaGVpZ2h0IC0gb2Zmc2V0cy5ib3R0b20pKS8yIC0gdGhpcy5nZXRIZWlnaHQoKS8yOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9lbGVtLmNzcyh7cmlnaHQ6YSwgdG9wOmJ9KTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAnc2UnOgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IG9mZnNldHMucmlnaHQgKyB0aGlzLnhvZmZzZXQ7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBiID0gb2Zmc2V0cy5ib3R0b20gKyB0aGlzLnlvZmZzZXQ7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2VsZW0uY3NzKHtyaWdodDphLCBib3R0b206Yn0pOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlICdzJzoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSAob2Zmc2V0cy5sZWZ0ICsgKHRoaXMuX3Bsb3REaW1lbnNpb25zLndpZHRoIC0gb2Zmc2V0cy5yaWdodCkpLzIgLSB0aGlzLmdldFdpZHRoKCkvMjsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGIgPSBvZmZzZXRzLmJvdHRvbSArIHRoaXMueW9mZnNldDsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZWxlbS5jc3Moe2xlZnQ6YSwgYm90dG9tOmJ9KTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAnc3cnOgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IGdyaWQuX2xlZnQgKyB0aGlzLnhvZmZzZXQ7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBiID0gb2Zmc2V0cy5ib3R0b20gKyB0aGlzLnlvZmZzZXQ7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2VsZW0uY3NzKHtsZWZ0OmEsIGJvdHRvbTpifSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgJ3cnOgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IGdyaWQuX2xlZnQgKyB0aGlzLnhvZmZzZXQ7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBiID0gKG9mZnNldHMudG9wICsgKHRoaXMuX3Bsb3REaW1lbnNpb25zLmhlaWdodCAtIG9mZnNldHMuYm90dG9tKSkvMiAtIHRoaXMuZ2V0SGVpZ2h0KCkvMjsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZWxlbS5jc3Moe2xlZnQ6YSwgdG9wOmJ9KTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogIC8vIHNhbWUgYXMgJ3NlJwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IGdyaWQuX3JpZ2h0IC0gdGhpcy54b2Zmc2V0OwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYiA9IGdyaWQuX2JvdHRvbSArIHRoaXMueW9mZnNldDsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZWxlbS5jc3Moe3JpZ2h0OmEsIGJvdHRvbTpifSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBzd2l0Y2ggKHRoaXMubG9jYXRpb24pIHsKICAgICAgICAgICAgICAgICAgICBjYXNlICdudyc6CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gdGhpcy5fcGxvdERpbWVuc2lvbnMud2lkdGggLSBncmlkLl9sZWZ0ICsgdGhpcy54b2Zmc2V0OwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYiA9IGdyaWQuX3RvcCArIHRoaXMueW9mZnNldDsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZWxlbS5jc3MoJ3JpZ2h0JywgYSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2VsZW0uY3NzKCd0b3AnLCBiKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAnbic6CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gKG9mZnNldHMubGVmdCArICh0aGlzLl9wbG90RGltZW5zaW9ucy53aWR0aCAtIG9mZnNldHMucmlnaHQpKS8yIC0gdGhpcy5nZXRXaWR0aCgpLzI7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBiID0gdGhpcy5fcGxvdERpbWVuc2lvbnMuaGVpZ2h0IC0gZ3JpZC5fdG9wICsgdGhpcy55b2Zmc2V0OwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9lbGVtLmNzcygnbGVmdCcsIGEpOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9lbGVtLmNzcygnYm90dG9tJywgYik7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgJ25lJzoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSB0aGlzLl9wbG90RGltZW5zaW9ucy53aWR0aCAtIG9mZnNldHMucmlnaHQgKyB0aGlzLnhvZmZzZXQ7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBiID0gZ3JpZC5fdG9wICsgdGhpcy55b2Zmc2V0OwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9lbGVtLmNzcyh7bGVmdDphLCB0b3A6Yn0pOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlICdlJzoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSB0aGlzLl9wbG90RGltZW5zaW9ucy53aWR0aCAtIG9mZnNldHMucmlnaHQgKyB0aGlzLnhvZmZzZXQ7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBiID0gKG9mZnNldHMudG9wICsgKHRoaXMuX3Bsb3REaW1lbnNpb25zLmhlaWdodCAtIG9mZnNldHMuYm90dG9tKSkvMiAtIHRoaXMuZ2V0SGVpZ2h0KCkvMjsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZWxlbS5jc3Moe2xlZnQ6YSwgdG9wOmJ9KTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAnc2UnOgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IHRoaXMuX3Bsb3REaW1lbnNpb25zLndpZHRoIC0gb2Zmc2V0cy5yaWdodCArIHRoaXMueG9mZnNldDsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGIgPSBvZmZzZXRzLmJvdHRvbSArIHRoaXMueW9mZnNldDsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZWxlbS5jc3Moe2xlZnQ6YSwgYm90dG9tOmJ9KTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAncyc6CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gKG9mZnNldHMubGVmdCArICh0aGlzLl9wbG90RGltZW5zaW9ucy53aWR0aCAtIG9mZnNldHMucmlnaHQpKS8yIC0gdGhpcy5nZXRXaWR0aCgpLzI7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBiID0gdGhpcy5fcGxvdERpbWVuc2lvbnMuaGVpZ2h0IC0gb2Zmc2V0cy5ib3R0b20gKyB0aGlzLnlvZmZzZXQ7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2VsZW0uY3NzKHtsZWZ0OmEsIHRvcDpifSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgJ3N3JzoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSB0aGlzLl9wbG90RGltZW5zaW9ucy53aWR0aCAtIGdyaWQuX2xlZnQgKyB0aGlzLnhvZmZzZXQ7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBiID0gb2Zmc2V0cy5ib3R0b20gKyB0aGlzLnlvZmZzZXQ7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2VsZW0uY3NzKHtyaWdodDphLCBib3R0b206Yn0pOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlICd3JzoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSB0aGlzLl9wbG90RGltZW5zaW9ucy53aWR0aCAtIGdyaWQuX2xlZnQgKyB0aGlzLnhvZmZzZXQ7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBiID0gKG9mZnNldHMudG9wICsgKHRoaXMuX3Bsb3REaW1lbnNpb25zLmhlaWdodCAtIG9mZnNldHMuYm90dG9tKSkvMiAtIHRoaXMuZ2V0SGVpZ2h0KCkvMjsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZWxlbS5jc3Moe3JpZ2h0OmEsIHRvcDpifSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6ICAvLyBzYW1lIGFzICdzZScKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSBncmlkLl9yaWdodCAtIHRoaXMueG9mZnNldDsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGIgPSBncmlkLl9ib3R0b20gKyB0aGlzLnlvZmZzZXQ7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2VsZW0uY3NzKHtyaWdodDphLCBib3R0b206Yn0pOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0gCiAgICB9OwogICAgCiAgICAvLyBzZXR1cCBkZWZhdWx0IHJlbmRlcmVycyBmb3IgYXhlcyBhbmQgbGVnZW5kIHNvIHVzZXIgZG9lc24ndCBoYXZlIHRvCiAgICAvLyBjYWxsZWQgd2l0aCBzY29wZSBvZiBwbG90CiAgICBmdW5jdGlvbiBwcmVJbml0KHRhcmdldCwgZGF0YSwgb3B0aW9ucykgewogICAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OwogICAgICAgIG9wdGlvbnMuYXhlc0RlZmF1bHRzID0gb3B0aW9ucy5heGVzRGVmYXVsdHMgfHwge307CiAgICAgICAgb3B0aW9ucy5sZWdlbmQgPSBvcHRpb25zLmxlZ2VuZCB8fCB7fTsKICAgICAgICBvcHRpb25zLnNlcmllc0RlZmF1bHRzID0gb3B0aW9ucy5zZXJpZXNEZWZhdWx0cyB8fCB7fTsKICAgICAgICB2YXIgc2V0b3B0cyA9IGZhbHNlOwogICAgICAgIGlmIChvcHRpb25zLnNlcmllc0RlZmF1bHRzLnJlbmRlcmVyID09ICQuanFwbG90Lk1la2tvUmVuZGVyZXIpIHsKICAgICAgICAgICAgc2V0b3B0cyA9IHRydWU7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKG9wdGlvbnMuc2VyaWVzKSB7CiAgICAgICAgICAgIGZvciAodmFyIGk9MDsgaSA8IG9wdGlvbnMuc2VyaWVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5zZXJpZXNbaV0ucmVuZGVyZXIgPT0gJC5qcXBsb3QuTWVra29SZW5kZXJlcikgewogICAgICAgICAgICAgICAgICAgIHNldG9wdHMgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmIChzZXRvcHRzKSB7CiAgICAgICAgICAgIG9wdGlvbnMuYXhlc0RlZmF1bHRzLnJlbmRlcmVyID0gJC5qcXBsb3QuTWVra29BeGlzUmVuZGVyZXI7CiAgICAgICAgICAgIG9wdGlvbnMubGVnZW5kLnJlbmRlcmVyID0gJC5qcXBsb3QuTWVra29MZWdlbmRSZW5kZXJlcjsKICAgICAgICAgICAgb3B0aW9ucy5sZWdlbmQucHJlRHJhdyA9IHRydWU7CiAgICAgICAgfQogICAgfQogICAgCiAgICAkLmpxcGxvdC5wcmVJbml0SG9va3MucHVzaChwcmVJbml0KTsKICAgIAp9KShqUXVlcnkpOyAgICA=]]></data>
	</file>
	<file>
	  <filename>/src/plugins/jqplot.mekkoRenderer.min.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqCiAqIGpxUGxvdAogKiBQdXJlIEphdmFTY3JpcHQgcGxvdHRpbmcgcGx1Z2luIHVzaW5nIGpRdWVyeQogKgogKiBWZXJzaW9uOiAxLjAuMGIyX3IxMDEyCiAqCiAqIENvcHlyaWdodCAoYykgMjAwOS0yMDExIENocmlzIExlb25lbGxvCiAqIGpxUGxvdCBpcyBjdXJyZW50bHkgYXZhaWxhYmxlIGZvciB1c2UgaW4gYWxsIHBlcnNvbmFsIG9yIGNvbW1lcmNpYWwgcHJvamVjdHMgCiAqIHVuZGVyIGJvdGggdGhlIE1JVCAoaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHApIGFuZCBHUEwgCiAqIHZlcnNpb24gMi4wIChodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC5odG1sKSBsaWNlbnNlcy4gVGhpcyBtZWFucyB0aGF0IHlvdSBjYW4gCiAqIGNob29zZSB0aGUgbGljZW5zZSB0aGF0IGJlc3Qgc3VpdHMgeW91ciBwcm9qZWN0IGFuZCB1c2UgaXQgYWNjb3JkaW5nbHkuIAogKgogKiBBbHRob3VnaCBub3QgcmVxdWlyZWQsIHRoZSBhdXRob3Igd291bGQgYXBwcmVjaWF0ZSBhbiBlbWFpbCBsZXR0aW5nIGhpbSAKICoga25vdyBvZiBhbnkgc3Vic3RhbnRpYWwgdXNlIG9mIGpxUGxvdC4gIFlvdSBjYW4gcmVhY2ggdGhlIGF1dGhvciBhdDogCiAqIGNocmlzIGF0IGpxcGxvdCBkb3QgY29tIG9yIHNlZSBodHRwOi8vd3d3LmpxcGxvdC5jb20vaW5mby5waHAgLgogKgogKiBJZiB5b3UgYXJlIGZlZWxpbmcga2luZCBhbmQgZ2VuZXJvdXMsIGNvbnNpZGVyIHN1cHBvcnRpbmcgdGhlIHByb2plY3QgYnkKICogbWFraW5nIGEgZG9uYXRpb24gYXQ6IGh0dHA6Ly93d3cuanFwbG90LmNvbS9kb25hdGUucGhwIC4KICoKICogc3ByaW50ZiBmdW5jdGlvbnMgY29udGFpbmVkIGluIGpxcGxvdC5zcHJpbnRmLmpzIGJ5IEFzaCBTZWFybGU6CiAqCiAqICAgICB2ZXJzaW9uIDIwMDcuMDQuMjcKICogICAgIGF1dGhvciBBc2ggU2VhcmxlCiAqICAgICBodHRwOi8vaGV4bWVuLmNvbS9ibG9nLzIwMDcvMDMvcHJpbnRmLXNwcmludGYvCiAqICAgICBodHRwOi8vaGV4bWVuLmNvbS9qcy9zcHJpbnRmLmpzCiAqICAgICBUaGUgYXV0aG9yIChBc2ggU2VhcmxlKSBoYXMgcGxhY2VkIHRoaXMgY29kZSBpbiB0aGUgcHVibGljIGRvbWFpbjoKICogICAgICJUaGlzIGNvZGUgaXMgdW5yZXN0cmljdGVkOiB5b3UgYXJlIGZyZWUgdG8gdXNlIGl0IGhvd2V2ZXIgeW91IGxpa2UuIgogKgogKiBpbmNsdWRlZCBqc0RhdGUgbGlicmFyeSBieSBDaHJpcyBMZW9uZWxsbzoKICoKICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEgQ2hyaXMgTGVvbmVsbG8KICoKICoganNEYXRlIGlzIGN1cnJlbnRseSBhdmFpbGFibGUgZm9yIHVzZSBpbiBhbGwgcGVyc29uYWwgb3IgY29tbWVyY2lhbCBwcm9qZWN0cyAKICogdW5kZXIgYm90aCB0aGUgTUlUIGFuZCBHUEwgdmVyc2lvbiAyLjAgbGljZW5zZXMuIFRoaXMgbWVhbnMgdGhhdCB5b3UgY2FuIAogKiBjaG9vc2UgdGhlIGxpY2Vuc2UgdGhhdCBiZXN0IHN1aXRzIHlvdXIgcHJvamVjdCBhbmQgdXNlIGl0IGFjY29yZGluZ2x5LgogKgogKiBqc0RhdGUgYm9ycm93cyBtYW55IGNvbmNlcHRzIGFuZCBpZGVhcyBmcm9tIHRoZSBEYXRlIEluc3RhbmNlIAogKiBNZXRob2RzIGJ5IEtlbiBTbnlkZXIgYWxvbmcgd2l0aCBzb21lIHBhcnRzIG9mIEtlbidzIGFjdHVhbCBjb2RlLgogKiAKICogS2VuJ3Mgb3JpZ2lhbmwgRGF0ZSBJbnN0YW5jZSBNZXRob2RzIGFuZCBjb3B5cmlnaHQgbm90aWNlOgogKiAKICogS2VuIFNueWRlciAoa2VuIGQgc255ZGVyIGF0IGdtYWlsIGRvdCBjb20pCiAqIDIwMDgtMDktMTAKICogdmVyc2lvbiAyLjAuMiAoaHR0cDovL2tlbmRzbnlkZXIuY29tL3NhbmRib3gvZGF0ZS8pICAgICAKICogQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbiBMaWNlbnNlIDMuMCAoaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnkvMy4wLykKICoKICoganFwbG90VG9JbWFnZSBmdW5jdGlvbiBiYXNlZCBvbiBMYXJyeSBTaWRlbidzIGV4cG9ydC1qcXBsb3QtdG8tcG5nLmpzLgogKiBMYXJyeSBoYXMgZ2VuZXJvdXNseSBnaXZlbiBwZXJtaXNzaW9uIHRvIGFkYXB0IGhpcyBjb2RlIGZvciBpbmNsdXNpb24KICogaW50byBqcVBsb3QuCiAqCiAqIExhcnJ5J3Mgb3JpZ2luYWwgY29kZSBjYW4gYmUgZm91bmQgaGVyZToKICoKICogaHR0cHM6Ly9naXRodWIuY29tL2xzaWRlbi9leHBvcnQtanFwbG90LXRvLXBuZwogKiAKICogCiAqLwooZnVuY3Rpb24oYil7Yi5qcXBsb3QuTWVra29SZW5kZXJlcj1mdW5jdGlvbigpe3RoaXMuc2hhcGVSZW5kZXJlcj1uZXcgYi5qcXBsb3QuU2hhcGVSZW5kZXJlcigpO3RoaXMuYm9yZGVyQ29sb3I9bnVsbDt0aGlzLnNob3dCb3JkZXJzPXRydWV9O2IuanFwbG90Lk1la2tvUmVuZGVyZXIucHJvdG90eXBlLmluaXQ9ZnVuY3Rpb24oYyxlKXt0aGlzLmZpbGw9ZmFsc2U7dGhpcy5maWxsUmVjdD10cnVlO3RoaXMuc3Ryb2tlUmVjdD10cnVlO3RoaXMuc2hhZG93PWZhbHNlO3RoaXMuX3h3aWR0aD0wO3RoaXMuX3hzdGFydD0wO2IuZXh0ZW5kKHRydWUsdGhpcy5yZW5kZXJlcixjKTt2YXIgZD17bGluZUpvaW46Im1pdGVyIixsaW5lQ2FwOiJidXR0Iixpc2FyYzpmYWxzZSxmaWxsUmVjdDp0aGlzLmZpbGxSZWN0LHN0cm9rZVJlY3Q6dGhpcy5zdHJva2VSZWN0fTt0aGlzLnJlbmRlcmVyLnNoYXBlUmVuZGVyZXIuaW5pdChkKTtlLmF4ZXMueDJheGlzLl9zZXJpZXMucHVzaCh0aGlzKTt0aGlzLl90eXBlPSJtZWtrbyJ9O2IuanFwbG90Lk1la2tvUmVuZGVyZXIucHJvdG90eXBlLnNldEdyaWREYXRhPWZ1bmN0aW9uKGgpe3ZhciBlPXRoaXMuX3hheGlzLnNlcmllc191MnA7dmFyIGM9dGhpcy5feWF4aXMuc2VyaWVzX3UycDt2YXIgZz10aGlzLl9wbG90RGF0YTt0aGlzLmdyaWREYXRhPVtdO3RoaXMuX3h3aWR0aD1lKHRoaXMuX3N1bXkpLWUoMCk7aWYodGhpcy5pbmRleD4wKXt0aGlzLl94c3RhcnQ9aC5zZXJpZXNbdGhpcy5pbmRleC0xXS5feHN0YXJ0K2guc2VyaWVzW3RoaXMuaW5kZXgtMV0uX3h3aWR0aH12YXIgbD10aGlzLmNhbnZhcy5nZXRIZWlnaHQoKTt2YXIgZD0wO3ZhciBrO3ZhciBqO2Zvcih2YXIgZj0wO2Y8Zy5sZW5ndGg7ZisrKXtpZihnW2ZdIT1udWxsKXtkKz1nW2ZdWzFdO2s9bC0oZC90aGlzLl9zdW15KmwpO2o9Z1tmXVsxXS90aGlzLl9zdW15Kmw7dGhpcy5ncmlkRGF0YS5wdXNoKFt0aGlzLl94c3RhcnQsayx0aGlzLl94d2lkdGgsal0pfX19O2IuanFwbG90Lk1la2tvUmVuZGVyZXIucHJvdG90eXBlLm1ha2VHcmlkRGF0YT1mdW5jdGlvbihmLGcpe3ZhciBkPXRoaXMuX3hheGlzLnNlcmllc191MnA7dmFyIGw9dGhpcy5jYW52YXMuZ2V0SGVpZ2h0KCk7dmFyIGM9MDt2YXIgajt2YXIgaDt2YXIgaz1bXTtmb3IodmFyIGU9MDtlPGYubGVuZ3RoO2UrKyl7aWYoZltlXSE9bnVsbCl7Yys9ZltlXVsxXTtqPWwtKGMvdGhpcy5fc3VteSpsKTtoPWZbZV1bMV0vdGhpcy5fc3VteSpsO2sucHVzaChbdGhpcy5feHN0YXJ0LGosdGhpcy5feHdpZHRoLGhdKX19cmV0dXJuIGt9O2IuanFwbG90Lk1la2tvUmVuZGVyZXIucHJvdG90eXBlLmRyYXc9ZnVuY3Rpb24oYyxoLGQpe3ZhciBlO3ZhciBnPShkIT11bmRlZmluZWQpP2Q6e307dmFyIGY9KGcuc2hvd0xpbmUhPXVuZGVmaW5lZCk/Zy5zaG93TGluZTp0aGlzLnNob3dMaW5lO3ZhciBqPW5ldyBiLmpxcGxvdC5Db2xvckdlbmVyYXRvcih0aGlzLnNlcmllc0NvbG9ycyk7Yy5zYXZlKCk7aWYoaC5sZW5ndGgpe2lmKGYpe2ZvcihlPTA7ZTxoLmxlbmd0aDtlKyspe2cuZmlsbFN0eWxlPWoubmV4dCgpO2lmKHRoaXMucmVuZGVyZXIuc2hvd0JvcmRlcnMpe2cuc3Ryb2tlU3R5bGU9dGhpcy5yZW5kZXJlci5ib3JkZXJDb2xvcn1lbHNle2cuc3Ryb2tlU3R5bGU9Zy5maWxsU3R5bGV9dGhpcy5yZW5kZXJlci5zaGFwZVJlbmRlcmVyLmRyYXcoYyxoW2VdLGcpfX19Yy5yZXN0b3JlKCl9O2IuanFwbG90Lk1la2tvUmVuZGVyZXIucHJvdG90eXBlLmRyYXdTaGFkb3c9ZnVuY3Rpb24oYyxlLGQpe307Yi5qcXBsb3QuTWVra29MZWdlbmRSZW5kZXJlcj1mdW5jdGlvbigpe307Yi5qcXBsb3QuTWVra29MZWdlbmRSZW5kZXJlci5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbihjKXt0aGlzLm51bWJlclJvd3M9bnVsbDt0aGlzLm51bWJlckNvbHVtbnM9bnVsbDt0aGlzLnBsYWNlbWVudD0ib3V0c2lkZSI7Yi5leHRlbmQodHJ1ZSx0aGlzLGMpfTtiLmpxcGxvdC5NZWtrb0xlZ2VuZFJlbmRlcmVyLnByb3RvdHlwZS5kcmF3PWZ1bmN0aW9uKCl7dmFyIGY9dGhpcztpZih0aGlzLnNob3cpe3ZhciBvPXRoaXMuX3Nlcmllczt2YXIgcj0icG9zaXRpb246YWJzb2x1dGU7IjtyKz0odGhpcy5iYWNrZ3JvdW5kKT8iYmFja2dyb3VuZDoiK3RoaXMuYmFja2dyb3VuZCsiOyI6IiI7cis9KHRoaXMuYm9yZGVyKT8iYm9yZGVyOiIrdGhpcy5ib3JkZXIrIjsiOiIiO3IrPSh0aGlzLmZvbnRTaXplKT8iZm9udC1zaXplOiIrdGhpcy5mb250U2l6ZSsiOyI6IiI7cis9KHRoaXMuZm9udEZhbWlseSk/ImZvbnQtZmFtaWx5OiIrdGhpcy5mb250RmFtaWx5KyI7IjoiIjtyKz0odGhpcy50ZXh0Q29sb3IpPyJjb2xvcjoiK3RoaXMudGV4dENvbG9yKyI7IjoiIjt0aGlzLl9lbGVtPWIoJzx0YWJsZSBjbGFzcz0ianFwbG90LXRhYmxlLWxlZ2VuZCIgc3R5bGU9IicrcisnIj48L3RhYmxlPicpO3ZhciB3PWZhbHNlLG49dHJ1ZSxjLGw7dmFyIHA9b1swXTt2YXIgZD1uZXcgYi5qcXBsb3QuQ29sb3JHZW5lcmF0b3IocC5zZXJpZXNDb2xvcnMpO2lmKHAuc2hvdyl7dmFyIHg9cC5kYXRhO2lmKHRoaXMubnVtYmVyUm93cyl7Yz10aGlzLm51bWJlclJvd3M7aWYoIXRoaXMubnVtYmVyQ29sdW1ucyl7bD1NYXRoLmNlaWwoeC5sZW5ndGgvYyl9ZWxzZXtsPXRoaXMubnVtYmVyQ29sdW1uc319ZWxzZXtpZih0aGlzLm51bWJlckNvbHVtbnMpe2w9dGhpcy5udW1iZXJDb2x1bW5zO2M9TWF0aC5jZWlsKHgubGVuZ3RoL3RoaXMubnVtYmVyQ29sdW1ucyl9ZWxzZXtjPXgubGVuZ3RoO2w9MX19dmFyIHYsdSxlLGgsZyxrLG0sdDt2YXIgcT0wO2Zvcih2PTA7djxjO3YrKyl7aWYobil7ZT1iKCc8dHIgY2xhc3M9ImpxcGxvdC10YWJsZS1sZWdlbmQiPjwvdHI+JykucHJlcGVuZFRvKHRoaXMuX2VsZW0pfWVsc2V7ZT1iKCc8dHIgY2xhc3M9ImpxcGxvdC10YWJsZS1sZWdlbmQiPjwvdHI+JykuYXBwZW5kVG8odGhpcy5fZWxlbSl9Zm9yKHU9MDt1PGw7dSsrKXtpZihxPHgubGVuZ3RoKXtrPXRoaXMubGFiZWxzW3FdfHx4W3FdWzBdLnRvU3RyaW5nKCk7dD1kLm5leHQoKTtpZighbil7aWYodj4wKXt3PXRydWV9ZWxzZXt3PWZhbHNlfX1lbHNle2lmKHY9PWMtMSl7dz1mYWxzZX1lbHNle3c9dHJ1ZX19bT0odyk/dGhpcy5yb3dTcGFjaW5nOiIwIjtoPWIoJzx0ZCBjbGFzcz0ianFwbG90LXRhYmxlLWxlZ2VuZCIgc3R5bGU9InRleHQtYWxpZ246Y2VudGVyO3BhZGRpbmctdG9wOicrbSsnOyI+PGRpdj48ZGl2IGNsYXNzPSJqcXBsb3QtdGFibGUtbGVnZW5kLXN3YXRjaCIgc3R5bGU9ImJvcmRlci1jb2xvcjonK3QrJzsiPjwvZGl2PjwvZGl2PjwvdGQ+Jyk7Zz1iKCc8dGQgY2xhc3M9ImpxcGxvdC10YWJsZS1sZWdlbmQiIHN0eWxlPSJwYWRkaW5nLXRvcDonK20rJzsiPjwvdGQ+Jyk7aWYodGhpcy5lc2NhcGVIdG1sKXtnLnRleHQoayl9ZWxzZXtnLmh0bWwoayl9aWYobil7Zy5wcmVwZW5kVG8oZSk7aC5wcmVwZW5kVG8oZSl9ZWxzZXtoLmFwcGVuZFRvKGUpO2cuYXBwZW5kVG8oZSl9dz10cnVlfXErK319ZT1udWxsO2g9bnVsbDtnPW51bGx9fXJldHVybiB0aGlzLl9lbGVtfTtiLmpxcGxvdC5NZWtrb0xlZ2VuZFJlbmRlcmVyLnByb3RvdHlwZS5wYWNrPWZ1bmN0aW9uKGYpe2lmKHRoaXMuc2hvdyl7dmFyIGU9e190b3A6Zi50b3AsX2xlZnQ6Zi5sZWZ0LF9yaWdodDpmLnJpZ2h0LF9ib3R0b206dGhpcy5fcGxvdERpbWVuc2lvbnMuaGVpZ2h0LWYuYm90dG9tfTtpZih0aGlzLnBsYWNlbWVudD09Imluc2lkZUdyaWQiKXtzd2l0Y2godGhpcy5sb2NhdGlvbil7Y2FzZSJudyI6dmFyIGQ9ZS5fbGVmdCt0aGlzLnhvZmZzZXQ7dmFyIGM9ZS5fdG9wK3RoaXMueW9mZnNldDt0aGlzLl9lbGVtLmNzcygibGVmdCIsZCk7dGhpcy5fZWxlbS5jc3MoInRvcCIsYyk7YnJlYWs7Y2FzZSJuIjp2YXIgZD0oZi5sZWZ0Kyh0aGlzLl9wbG90RGltZW5zaW9ucy53aWR0aC1mLnJpZ2h0KSkvMi10aGlzLmdldFdpZHRoKCkvMjt2YXIgYz1lLl90b3ArdGhpcy55b2Zmc2V0O3RoaXMuX2VsZW0uY3NzKCJsZWZ0IixkKTt0aGlzLl9lbGVtLmNzcygidG9wIixjKTticmVhaztjYXNlIm5lIjp2YXIgZD1mLnJpZ2h0K3RoaXMueG9mZnNldDt2YXIgYz1lLl90b3ArdGhpcy55b2Zmc2V0O3RoaXMuX2VsZW0uY3NzKHtyaWdodDpkLHRvcDpjfSk7YnJlYWs7Y2FzZSJlIjp2YXIgZD1mLnJpZ2h0K3RoaXMueG9mZnNldDt2YXIgYz0oZi50b3ArKHRoaXMuX3Bsb3REaW1lbnNpb25zLmhlaWdodC1mLmJvdHRvbSkpLzItdGhpcy5nZXRIZWlnaHQoKS8yO3RoaXMuX2VsZW0uY3NzKHtyaWdodDpkLHRvcDpjfSk7YnJlYWs7Y2FzZSJzZSI6dmFyIGQ9Zi5yaWdodCt0aGlzLnhvZmZzZXQ7dmFyIGM9Zi5ib3R0b20rdGhpcy55b2Zmc2V0O3RoaXMuX2VsZW0uY3NzKHtyaWdodDpkLGJvdHRvbTpjfSk7YnJlYWs7Y2FzZSJzIjp2YXIgZD0oZi5sZWZ0Kyh0aGlzLl9wbG90RGltZW5zaW9ucy53aWR0aC1mLnJpZ2h0KSkvMi10aGlzLmdldFdpZHRoKCkvMjt2YXIgYz1mLmJvdHRvbSt0aGlzLnlvZmZzZXQ7dGhpcy5fZWxlbS5jc3Moe2xlZnQ6ZCxib3R0b206Y30pO2JyZWFrO2Nhc2Uic3ciOnZhciBkPWUuX2xlZnQrdGhpcy54b2Zmc2V0O3ZhciBjPWYuYm90dG9tK3RoaXMueW9mZnNldDt0aGlzLl9lbGVtLmNzcyh7bGVmdDpkLGJvdHRvbTpjfSk7YnJlYWs7Y2FzZSJ3Ijp2YXIgZD1lLl9sZWZ0K3RoaXMueG9mZnNldDt2YXIgYz0oZi50b3ArKHRoaXMuX3Bsb3REaW1lbnNpb25zLmhlaWdodC1mLmJvdHRvbSkpLzItdGhpcy5nZXRIZWlnaHQoKS8yO3RoaXMuX2VsZW0uY3NzKHtsZWZ0OmQsdG9wOmN9KTticmVhaztkZWZhdWx0OnZhciBkPWUuX3JpZ2h0LXRoaXMueG9mZnNldDt2YXIgYz1lLl9ib3R0b20rdGhpcy55b2Zmc2V0O3RoaXMuX2VsZW0uY3NzKHtyaWdodDpkLGJvdHRvbTpjfSk7YnJlYWt9fWVsc2V7c3dpdGNoKHRoaXMubG9jYXRpb24pe2Nhc2UibnciOnZhciBkPXRoaXMuX3Bsb3REaW1lbnNpb25zLndpZHRoLWUuX2xlZnQrdGhpcy54b2Zmc2V0O3ZhciBjPWUuX3RvcCt0aGlzLnlvZmZzZXQ7dGhpcy5fZWxlbS5jc3MoInJpZ2h0IixkKTt0aGlzLl9lbGVtLmNzcygidG9wIixjKTticmVhaztjYXNlIm4iOnZhciBkPShmLmxlZnQrKHRoaXMuX3Bsb3REaW1lbnNpb25zLndpZHRoLWYucmlnaHQpKS8yLXRoaXMuZ2V0V2lkdGgoKS8yO3ZhciBjPXRoaXMuX3Bsb3REaW1lbnNpb25zLmhlaWdodC1lLl90b3ArdGhpcy55b2Zmc2V0O3RoaXMuX2VsZW0uY3NzKCJsZWZ0IixkKTt0aGlzLl9lbGVtLmNzcygiYm90dG9tIixjKTticmVhaztjYXNlIm5lIjp2YXIgZD10aGlzLl9wbG90RGltZW5zaW9ucy53aWR0aC1mLnJpZ2h0K3RoaXMueG9mZnNldDt2YXIgYz1lLl90b3ArdGhpcy55b2Zmc2V0O3RoaXMuX2VsZW0uY3NzKHtsZWZ0OmQsdG9wOmN9KTticmVhaztjYXNlImUiOnZhciBkPXRoaXMuX3Bsb3REaW1lbnNpb25zLndpZHRoLWYucmlnaHQrdGhpcy54b2Zmc2V0O3ZhciBjPShmLnRvcCsodGhpcy5fcGxvdERpbWVuc2lvbnMuaGVpZ2h0LWYuYm90dG9tKSkvMi10aGlzLmdldEhlaWdodCgpLzI7dGhpcy5fZWxlbS5jc3Moe2xlZnQ6ZCx0b3A6Y30pO2JyZWFrO2Nhc2Uic2UiOnZhciBkPXRoaXMuX3Bsb3REaW1lbnNpb25zLndpZHRoLWYucmlnaHQrdGhpcy54b2Zmc2V0O3ZhciBjPWYuYm90dG9tK3RoaXMueW9mZnNldDt0aGlzLl9lbGVtLmNzcyh7bGVmdDpkLGJvdHRvbTpjfSk7YnJlYWs7Y2FzZSJzIjp2YXIgZD0oZi5sZWZ0Kyh0aGlzLl9wbG90RGltZW5zaW9ucy53aWR0aC1mLnJpZ2h0KSkvMi10aGlzLmdldFdpZHRoKCkvMjt2YXIgYz10aGlzLl9wbG90RGltZW5zaW9ucy5oZWlnaHQtZi5ib3R0b20rdGhpcy55b2Zmc2V0O3RoaXMuX2VsZW0uY3NzKHtsZWZ0OmQsdG9wOmN9KTticmVhaztjYXNlInN3Ijp2YXIgZD10aGlzLl9wbG90RGltZW5zaW9ucy53aWR0aC1lLl9sZWZ0K3RoaXMueG9mZnNldDt2YXIgYz1mLmJvdHRvbSt0aGlzLnlvZmZzZXQ7dGhpcy5fZWxlbS5jc3Moe3JpZ2h0OmQsYm90dG9tOmN9KTticmVhaztjYXNlInciOnZhciBkPXRoaXMuX3Bsb3REaW1lbnNpb25zLndpZHRoLWUuX2xlZnQrdGhpcy54b2Zmc2V0O3ZhciBjPShmLnRvcCsodGhpcy5fcGxvdERpbWVuc2lvbnMuaGVpZ2h0LWYuYm90dG9tKSkvMi10aGlzLmdldEhlaWdodCgpLzI7dGhpcy5fZWxlbS5jc3Moe3JpZ2h0OmQsdG9wOmN9KTticmVhaztkZWZhdWx0OnZhciBkPWUuX3JpZ2h0LXRoaXMueG9mZnNldDt2YXIgYz1lLl9ib3R0b20rdGhpcy55b2Zmc2V0O3RoaXMuX2VsZW0uY3NzKHtyaWdodDpkLGJvdHRvbTpjfSk7YnJlYWt9fX19O2Z1bmN0aW9uIGEoZyxmLGQpe2Q9ZHx8e307ZC5heGVzRGVmYXVsdHM9ZC5heGVzRGVmYXVsdHN8fHt9O2QubGVnZW5kPWQubGVnZW5kfHx7fTtkLnNlcmllc0RlZmF1bHRzPWQuc2VyaWVzRGVmYXVsdHN8fHt9O3ZhciBjPWZhbHNlO2lmKGQuc2VyaWVzRGVmYXVsdHMucmVuZGVyZXI9PWIuanFwbG90Lk1la2tvUmVuZGVyZXIpe2M9dHJ1ZX1lbHNle2lmKGQuc2VyaWVzKXtmb3IodmFyIGU9MDtlPGQuc2VyaWVzLmxlbmd0aDtlKyspe2lmKGQuc2VyaWVzW2VdLnJlbmRlcmVyPT1iLmpxcGxvdC5NZWtrb1JlbmRlcmVyKXtjPXRydWV9fX19aWYoYyl7ZC5heGVzRGVmYXVsdHMucmVuZGVyZXI9Yi5qcXBsb3QuTWVra29BeGlzUmVuZGVyZXI7ZC5sZWdlbmQucmVuZGVyZXI9Yi5qcXBsb3QuTWVra29MZWdlbmRSZW5kZXJlcjtkLmxlZ2VuZC5wcmVEcmF3PXRydWV9fWIuanFwbG90LnByZUluaXRIb29rcy5wdXNoKGEpfSkoalF1ZXJ5KTs=]]></data>
	</file>
	<file>
	  <filename>/src/plugins/jqplot.meterGaugeRenderer.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqCiAqIGpxUGxvdAogKiBQdXJlIEphdmFTY3JpcHQgcGxvdHRpbmcgcGx1Z2luIHVzaW5nIGpRdWVyeQogKgogKiBWZXJzaW9uOiAxLjAuMGIyX3IxMDEyCiAqCiAqIENvcHlyaWdodCAoYykgMjAwOS0yMDExIENocmlzIExlb25lbGxvCiAqIGpxUGxvdCBpcyBjdXJyZW50bHkgYXZhaWxhYmxlIGZvciB1c2UgaW4gYWxsIHBlcnNvbmFsIG9yIGNvbW1lcmNpYWwgcHJvamVjdHMgCiAqIHVuZGVyIGJvdGggdGhlIE1JVCAoaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHApIGFuZCBHUEwgCiAqIHZlcnNpb24gMi4wIChodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC5odG1sKSBsaWNlbnNlcy4gVGhpcyBtZWFucyB0aGF0IHlvdSBjYW4gCiAqIGNob29zZSB0aGUgbGljZW5zZSB0aGF0IGJlc3Qgc3VpdHMgeW91ciBwcm9qZWN0IGFuZCB1c2UgaXQgYWNjb3JkaW5nbHkuIAogKgogKiBBbHRob3VnaCBub3QgcmVxdWlyZWQsIHRoZSBhdXRob3Igd291bGQgYXBwcmVjaWF0ZSBhbiBlbWFpbCBsZXR0aW5nIGhpbSAKICoga25vdyBvZiBhbnkgc3Vic3RhbnRpYWwgdXNlIG9mIGpxUGxvdC4gIFlvdSBjYW4gcmVhY2ggdGhlIGF1dGhvciBhdDogCiAqIGNocmlzIGF0IGpxcGxvdCBkb3QgY29tIG9yIHNlZSBodHRwOi8vd3d3LmpxcGxvdC5jb20vaW5mby5waHAgLgogKgogKiBJZiB5b3UgYXJlIGZlZWxpbmcga2luZCBhbmQgZ2VuZXJvdXMsIGNvbnNpZGVyIHN1cHBvcnRpbmcgdGhlIHByb2plY3QgYnkKICogbWFraW5nIGEgZG9uYXRpb24gYXQ6IGh0dHA6Ly93d3cuanFwbG90LmNvbS9kb25hdGUucGhwIC4KICoKICogc3ByaW50ZiBmdW5jdGlvbnMgY29udGFpbmVkIGluIGpxcGxvdC5zcHJpbnRmLmpzIGJ5IEFzaCBTZWFybGU6CiAqCiAqICAgICB2ZXJzaW9uIDIwMDcuMDQuMjcKICogICAgIGF1dGhvciBBc2ggU2VhcmxlCiAqICAgICBodHRwOi8vaGV4bWVuLmNvbS9ibG9nLzIwMDcvMDMvcHJpbnRmLXNwcmludGYvCiAqICAgICBodHRwOi8vaGV4bWVuLmNvbS9qcy9zcHJpbnRmLmpzCiAqICAgICBUaGUgYXV0aG9yIChBc2ggU2VhcmxlKSBoYXMgcGxhY2VkIHRoaXMgY29kZSBpbiB0aGUgcHVibGljIGRvbWFpbjoKICogICAgICJUaGlzIGNvZGUgaXMgdW5yZXN0cmljdGVkOiB5b3UgYXJlIGZyZWUgdG8gdXNlIGl0IGhvd2V2ZXIgeW91IGxpa2UuIgogKiAKICovCihmdW5jdGlvbigkKSB7CiAgICAvKioKICAgICAqIENsYXNzOiAkLmpxcGxvdC5NZXRlckdhdWdlUmVuZGVyZXIKICAgICAqIFBsdWdpbiByZW5kZXJlciB0byBkcmF3IGEgbWV0ZXIgZ2F1Z2UgY2hhcnQuCiAgICAgKiAKICAgICAqIERhdGEgY29uc2lzdHMgb2YgYSBzaW5nbGUgc2VyaWVzIHdpdGggMSBkYXRhIHBvaW50IHRvIHBvc2l0aW9uIHRoZSBnYXVnZSBuZWVkbGUuCiAgICAgKiAKICAgICAqIFRvIHVzZSB0aGlzIHJlbmRlcmVyLCB5b3UgbmVlZCB0byBpbmNsdWRlIHRoZSAKICAgICAqIG1ldGVyIGdhdWdlIHJlbmRlcmVyIHBsdWdpbiwgZm9yIGV4YW1wbGU6CiAgICAgKiAKICAgICAqID4gPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0icGx1Z2lucy9qcXBsb3QubWV0ZXJHYXVnZVJlbmRlcmVyLmpzIj48L3NjcmlwdD4KICAgICAqIAogICAgICogUHJvcGVydGllcyBkZXNjcmliZWQgaGVyZSBhcmUgcGFzc2VkIGludG8gdGhlICQuanFwbG90IGZ1bmN0aW9uCiAgICAgKiBhcyBvcHRpb25zIG9uIHRoZSBzZXJpZXMgcmVuZGVyZXIuICBGb3IgZXhhbXBsZToKICAgICAqIAogICAgICogPiBwbG90MCA9ICQuanFwbG90KCdjaGFydDAnLFtbMThdXSx7CiAgICAgKiA+ICAgICB0aXRsZTogJ05ldHdvcmsgU3BlZWQnLAogICAgICogPiAgICAgc2VyaWVzRGVmYXVsdHM6IHsKICAgICAqID4gICAgICAgICByZW5kZXJlcjogJC5qcXBsb3QuTWV0ZXJHYXVnZVJlbmRlcmVyLAogICAgICogPiAgICAgICAgIHJlbmRlcmVyT3B0aW9uczogewogICAgICogPiAgICAgICAgICAgICBsYWJlbDogJ01CL3MnCiAgICAgKiA+ICAgICAgICAgfQogICAgICogPiAgICAgfQogICAgICogPiB9KTsKICAgICAqIAogICAgICogQSBtZXRlckdhdWdlIHBsb3QgZG9lcyBub3Qgc3VwcG9ydCBldmVudHMuCiAgICAgKi8KICAgICQuanFwbG90Lk1ldGVyR2F1Z2VSZW5kZXJlciA9IGZ1bmN0aW9uKCl7CiAgICAgICAgJC5qcXBsb3QuTGluZVJlbmRlcmVyLmNhbGwodGhpcyk7CiAgICB9OwogICAgCiAgICAkLmpxcGxvdC5NZXRlckdhdWdlUmVuZGVyZXIucHJvdG90eXBlID0gbmV3ICQuanFwbG90LkxpbmVSZW5kZXJlcigpOwogICAgJC5qcXBsb3QuTWV0ZXJHYXVnZVJlbmRlcmVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9ICQuanFwbG90Lk1ldGVyR2F1Z2VSZW5kZXJlcjsKICAgIAogICAgLy8gY2FsbGVkIHdpdGggc2NvcGUgb2YgYSBzZXJpZXMKICAgICQuanFwbG90Lk1ldGVyR2F1Z2VSZW5kZXJlci5wcm90b3R5cGUuaW5pdCA9IGZ1bmN0aW9uKG9wdGlvbnMpIHsKICAgICAgICAvLyBHcm91cDogUHJvcGVydGllcwogICAgICAgIC8vCiAgICAgICAgLy8gcHJvcDogZGlhbWV0ZXIKICAgICAgICAvLyBPdXRlciBkaWFtZXRlciBvZiB0aGUgbWV0ZXJHYXVnZSwgYXV0byBjb21wdXRlZCBieSBkZWZhdWx0CiAgICAgICAgdGhpcy5kaWFtZXRlciA9IG51bGw7CiAgICAgICAgLy8gcHJvcDogcGFkZGluZwogICAgICAgIC8vIHBhZGRpbmcgYmV0d2VlbiB0aGUgbWV0ZXJHYXVnZSBhbmQgcGxvdCBlZGdlcywgYXV0bwogICAgICAgIC8vIGNhbGN1bGF0ZWQgYnkgZGVmYXVsdC4KICAgICAgICB0aGlzLnBhZGRpbmcgPSBudWxsOwogICAgICAgIC8vIHByb3A6IHNoYWRvd09mZnNldAogICAgICAgIC8vIG9mZnNldCBvZiB0aGUgc2hhZG93IGZyb20gdGhlIGdhdWdlIHJpbmcgYW5kIG9mZnNldCBvZiAKICAgICAgICAvLyBlYWNoIHN1Y2Nlc2l2ZSBzdHJva2Ugb2YgdGhlIHNoYWRvdyBmcm9tIHRoZSBsYXN0LgogICAgICAgIHRoaXMuc2hhZG93T2Zmc2V0ID0gMjsKICAgICAgICAvLyBwcm9wOiBzaGFkb3dBbHBoYQogICAgICAgIC8vIHRyYW5zcGFyZW5jeSBvZiB0aGUgc2hhZG93ICgwID0gdHJhbnNwYXJlbnQsIDEgPSBvcGFxdWUpCiAgICAgICAgdGhpcy5zaGFkb3dBbHBoYSA9IDAuMDc7CiAgICAgICAgLy8gcHJvcDogc2hhZG93RGVwdGgKICAgICAgICAvLyBudW1iZXIgb2Ygc3Ryb2tlcyB0byBhcHBseSB0byB0aGUgc2hhZG93LCAKICAgICAgICAvLyBlYWNoIHN0cm9rZSBvZmZzZXQgc2hhZG93T2Zmc2V0IGZyb20gdGhlIGxhc3QuCiAgICAgICAgdGhpcy5zaGFkb3dEZXB0aCA9IDQ7CiAgICAgICAgLy8gcHJvcDogYmFja2dyb3VuZAogICAgICAgIC8vIGJhY2tncm91bmQgY29sb3Igb2YgdGhlIGluc2lkZSBvZiB0aGUgZ2F1Z2UuCiAgICAgICAgdGhpcy5iYWNrZ3JvdW5kID0gIiNlZmVmZWYiOwogICAgICAgIC8vIHByb3A6IHJpbmdDb2xvcgogICAgICAgIC8vIGNvbG9yIG9mIHRoZSBvdXRlciByaW5nLCBodWIsIGFuZCBuZWVkbGUgb2YgdGhlIGdhdWdlLgogICAgICAgIHRoaXMucmluZ0NvbG9yID0gIiNCQkM2RDAiOwogICAgICAgIC8vIG5lZWRsZSBjb2xvciBub3QgaW1wbGVtZW50ZWQgeWV0LgogICAgICAgIHRoaXMubmVlZGxlQ29sb3IgPSAiI0MzRDNFNSI7CiAgICAgICAgLy8gcHJvcDogdGlja0NvbG9yCiAgICAgICAgLy8gY29sb3Igb2YgdGhlIHRpY2sgbWFya3MgYXJvdW5kIHRoZSBnYXVnZS4KICAgICAgICB0aGlzLnRpY2tDb2xvciA9ICI5ODk4OTgiOwogICAgICAgIC8vIHByb3A6IHJpbmdXaWR0aAogICAgICAgIC8vIHdpZHRoIG9mIHRoZSByaW5nIGFyb3VuZCB0aGUgZ2F1Z2UuICBBdXRvIGNvbXB1dGVkIGJ5IGRlZmF1bHQuCiAgICAgICAgdGhpcy5yaW5nV2lkdGggPSBudWxsOwogICAgICAgIC8vIHByb3A6IG1pbgogICAgICAgIC8vIE1pbmltdW0gdmFsdWUgb24gdGhlIGdhdWdlLiAgQXV0byBjb21wdXRlZCBieSBkZWZhdWx0CiAgICAgICAgdGhpcy5taW47CiAgICAgICAgLy8gcHJvcDogbWF4CiAgICAgICAgLy8gTWF4aW11bSB2YWx1ZSBvbiB0aGUgZ2F1Z2UuIEF1dG8gY29tcHV0ZWQgYnkgZGVmYXVsdAogICAgICAgIHRoaXMubWF4OwogICAgICAgIC8vIHByb3A6IHRpY2tzCiAgICAgICAgLy8gQXJyYXkgb2YgdGljayB2YWx1ZXMuIEF1dG8gY29tcHV0ZWQgYnkgZGVmYXVsdC4KICAgICAgICB0aGlzLnRpY2tzID0gW107CiAgICAgICAgLy8gcHJvcDogc2hvd1RpY2tzCiAgICAgICAgLy8gdHJ1ZSB0byBzaG93IHRpY2tzIGFyb3VuZCBnYXVnZS4KICAgICAgICB0aGlzLnNob3dUaWNrcyA9IHRydWU7CiAgICAgICAgLy8gcHJvcDogc2hvd1RpY2tMYWJlbHMKICAgICAgICAvLyB0cnVlIHRvIHNob3cgdGljayBsYWJlbHMgbmV4dCB0byB0aWNrcy4KICAgICAgICB0aGlzLnNob3dUaWNrTGFiZWxzID0gdHJ1ZTsKICAgICAgICAvLyBwcm9wOiBsYWJlbAogICAgICAgIC8vIEEgZ2F1Z2UgbGFiZWwgbGlrZSAna3BoJyBvciAnVm9sdHMnCiAgICAgICAgdGhpcy5sYWJlbCA9IG51bGw7CiAgICAgICAgLy8gcHJvcDogbGFiZWxIZWlnaHRBZGp1c3QKICAgICAgICAvLyBOdW1iZXIgb2YgUGl4ZWxzIHRvIG9mZnNldCB0aGUgbGFiZWwgdXAgKC0pIG9yIGRvd24gKCspIGZyb20gaXRzIGRlZmF1bHQgcG9zaXRpb24uCiAgICAgICAgdGhpcy5sYWJlbEhlaWdodEFkanVzdCA9IDA7CiAgICAgICAgLy8gcHJvcDogbGFiZWxQb3NpdGlvbgogICAgICAgIC8vIFdoZXJlIHRvIHBvc2l0aW9uIHRoZSBsYWJlbCwgZWl0aGVyICdpbnNpZGUnIG9yICdib3R0b20nLgogICAgICAgIHRoaXMubGFiZWxQb3NpdGlvbiA9ICdpbnNpZGUnOwogICAgICAgIC8vIHByb3A6IGludGVydmFscwogICAgICAgIC8vIEFycmF5IG9mIHJhbmdlcyB0byBiZSBkcmF3biBhcm91bmQgdGhlIGdhdWdlLgogICAgICAgIC8vIEFycmF5IG9mIGZvcm06CiAgICAgICAgLy8gPiBbdmFsdWUxLCB2YWx1ZTIsIC4uLl0KICAgICAgICAvLyBpbmRpY2F0aW5nIHRoZSB2YWx1ZXMgZm9yIHRoZSBmaXJzdCwgc2Vjb25kLCAuLi4gaW50ZXJ2YWxzLgogICAgICAgIHRoaXMuaW50ZXJ2YWxzID0gW107CiAgICAgICAgLy8gcHJvcDogaW50ZXJ2YWxDb2xvcnMKICAgICAgICAvLyBBcnJheSBvZiBjb2xvcnMgdG8gdXNlIGZvciB0aGUgaW50ZXJ2YWxzLgogICAgICAgIHRoaXMuaW50ZXJ2YWxDb2xvcnMgPSBbICIjNGJiMmM1IiwgIiNFQUEyMjgiLCAiI2M1YjQ3ZiIsICIjNTc5NTc1IiwgIiM4Mzk1NTciLCAiIzk1OGMxMiIsICIjOTUzNTc5IiwgIiM0YjVkZTQiLCAiI2Q4YjgzZiIsICIjZmY1ODAwIiwgIiMwMDg1Y2MiLCAiI2M3NDdhMyIsICIjY2RkZjU0IiwgIiNGQkQxNzgiLCAiIzI2QjRFMyIsICIjYmQ3MGM3Il07CiAgICAgICAgLy8gcHJvcDogaW50ZXJ2YWxJbm5lclJhZGl1cwogICAgICAgIC8vIFJhZGl1cyBvZiB0aGUgaW5uZXIgY2lyY2xlIG9mIHRoZSBpbnRlcnZhbCByaW5nLgogICAgICAgIHRoaXMuaW50ZXJ2YWxJbm5lclJhZGl1cyA9ICBudWxsOwogICAgICAgIC8vIHByb3A6IGludGVydmFsT3V0ZXJSYWRpdXMKICAgICAgICAvLyBSYWRpdXMgb2YgdGhlIG91dGVyIGNpcmNsZSBvZiB0aGUgaW50ZXJ2YWwgcmluZy4KICAgICAgICB0aGlzLmludGVydmFsT3V0ZXJSYWRpdXMgPSBudWxsOwogICAgICAgIHRoaXMudGlja1JlbmRlcmVyID0gJC5qcXBsb3QuTWV0ZXJHYXVnZVRpY2tSZW5kZXJlcjsKICAgICAgICAvLyB0aWNrcyBzcGFjZWQgZXZlcnkgMSwgMiwgMi41LCA1LCAxMCwgMjAsIC4xLCAuMiwgLjI1LCAuNSwgZXRjLgogICAgICAgIHRoaXMudGlja1Bvc2l0aW9ucyA9IFsxLCAyLCAyLjUsIDUsIDEwXTsKICAgICAgICAvLyBwcm9wOiB0aWNrU3BhY2luZwogICAgICAgIC8vIERlZ3JlZXMgYmV0d2VlbiB0aWNrcy4gIFRoaXMgaXMgYSB0YXJnZXQgbnVtYmVyLCBpZiAKICAgICAgICAvLyBpbmNvbXBhdGlibGUgc3BhbiBhbmQgdGlja3MgYXJlIHN1cHBsaWVkLCBhIHN1aXRhYmxlCiAgICAgICAgLy8gc3BhY2luZyBjbG9zZSB0byB0aGlzIHZhbHVlIHdpbGwgYmUgY29tcHV0ZWQuCiAgICAgICAgdGhpcy50aWNrU3BhY2luZyA9IDMwOwogICAgICAgIHRoaXMubnVtYmVyTWlub3JUaWNrcyA9IG51bGw7CiAgICAgICAgLy8gcHJvcDogaHViUmFkaXVzCiAgICAgICAgLy8gUmFkaXVzIG9mIHRoZSBodWIgYXQgdGhlIGJvdHRvbSBjZW50ZXIgb2YgZ2F1Z2Ugd2hpY2ggdGhlIG5lZWRsZSBhdHRhY2hlcyB0by4KICAgICAgICAvLyBBdXRvIGNvbXB1dGVkIGJ5IGRlZmF1bHQKICAgICAgICB0aGlzLmh1YlJhZGl1cyA9IG51bGw7CiAgICAgICAgLy8gcHJvcDogdGlja1BhZGRpbmcKICAgICAgICAvLyBwYWRkaW5nIG9mIHRoZSB0aWNrIG1hcmtzIHRvIHRoZSBvdXRlciByaW5nIGFuZCB0aGUgdGljayBsYWJlbHMgdG8gbWFya3MuCiAgICAgICAgLy8gQXV0byBjb21wdXRlZCBieSBkZWZhdWx0LgogICAgICAgIHRoaXMudGlja1BhZGRpbmcgPSBudWxsOwogICAgICAgIC8vIHByb3A6IG5lZWRsZVRoaWNrbmVzcwogICAgICAgIC8vIE1heGltdW0gdGhpY2tuZXNzIHRoZSBuZWVkbGUuICBBdXRvIGNvbXB1dGVkIGJ5IGRlZmF1bHQuCiAgICAgICAgdGhpcy5uZWVkbGVUaGlja25lc3MgPSBudWxsOwogICAgICAgIC8vIHByb3A6IG5lZWRsZVBhZAogICAgICAgIC8vIFBhZGRpbmcgYmV0d2VlbiBuZWVkbGUgYW5kIGlubmVyIGVkZ2Ugb2YgdGhlIHJpbmcgd2hlbiB0aGUgbmVlZGxlIGlzIGF0IHRoZSBtaW4gb3IgbWF4IGdhdWdlIHZhbHVlLgogICAgICAgIHRoaXMubmVlZGxlUGFkID0gNjsKICAgICAgICAvLyBwcm9wOiBwZWdOZWVkbGUKICAgICAgICAvLyBUcnVlIHdpbGwgc3RvcCBuZWVkbGUganVzdCBiZWxvdy9hYm92ZSB0aGUgIG1pbi9tYXggdmFsdWVzIGlmIGRhdGEgaXMgYmVsb3cvYWJvdmUgbWluL21heCwKICAgICAgICAvLyBhcyBpZiB0aGUgbWV0ZXIgaXMgInBlZ2dlZCIuCiAgICAgICAgdGhpcy5wZWdOZWVkbGUgPSB0cnVlOwogICAgICAgIHRoaXMuX3R5cGUgPSAnbWV0ZXJHYXVnZSc7CiAgICAgICAgCiAgICAgICAgJC5leHRlbmQodHJ1ZSwgdGhpcywgb3B0aW9ucyk7CiAgICAgICAgdGhpcy50eXBlID0gbnVsbDsKICAgICAgICB0aGlzLm51bWJlclRpY2tzID0gbnVsbDsKICAgICAgICB0aGlzLnRpY2tJbnRlcnZhbCA9IG51bGw7CiAgICAgICAgLy8gc3BhbiwgdGhlIHN3ZWVwIChpbiBkZWdyZWVzKSBmcm9tIG1pbiB0byBtYXguICBUaGlzIGdhdWdlIGlzIAogICAgICAgIC8vIGEgc2VtaS1jaXJjbGUuCiAgICAgICAgdGhpcy5zcGFuID0gMTgwOwogICAgICAgIC8vIGdldCByaWQgb2YgdGhpcyBub25zZW5zZQogICAgICAgIC8vIHRoaXMuaW5uZXJTcGFuID0gdGhpcy5zcGFuOwogICAgICAgIGlmICh0aGlzLnR5cGUgPT0gJ2NpcmN1bGFyJykgewogICAgICAgICAgICB0aGlzLnNlbWlDaXJjdWxhciA9IGZhbHNlOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmICh0aGlzLnR5cGUgIT0gJ2NpcmN1bGFyJykgewogICAgICAgICAgICB0aGlzLnNlbWlDaXJjdWxhciA9IHRydWU7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICB0aGlzLnNlbWlDaXJjdWxhciA9ICh0aGlzLnNwYW4gPD0gMTgwKSA/IHRydWUgOiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgdGhpcy5fdGlja1BvaW50cyA9IFtdOwogICAgICAgIC8vIHJlZmVyZW5jZSB0byBsYWJlbCBlbGVtZW50LgogICAgICAgIHRoaXMuX2xhYmVsRWxlbSA9IG51bGw7CiAgICAgICAgCiAgICAgICAgLy8gc3RhcnQgdGhlIGdhdWdlIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHNwYW4KICAgICAgICB0aGlzLnN0YXJ0QW5nbGUgPSAoOTAgKyAoMzYwIC0gdGhpcy5zcGFuKS8yKSAqIE1hdGguUEkvMTgwOwogICAgICAgIHRoaXMuZW5kQW5nbGUgPSAoOTAgLSAoMzYwIC0gdGhpcy5zcGFuKS8yKSAqIE1hdGguUEkvMTgwOwogICAgICAgIAogICAgICAgIHRoaXMuc2V0bWluID0gISEodGhpcy5taW4gPT0gbnVsbCk7CiAgICAgICAgdGhpcy5zZXRtYXggPSAhISh0aGlzLm1heCA9PSBudWxsKTsKICAgICAgICAKICAgICAgICAvLyBpZiBnaXZlbiBpbnRlcnZhbHMgYW5kIGlzIGFuIGFycmF5IG9mIHZhbHVlcywgY3JlYXRlIGxhYmVscyBhbmQgY29sb3JzLgogICAgICAgIGlmICh0aGlzLmludGVydmFscy5sZW5ndGgpIHsKICAgICAgICAgICAgaWYgKHRoaXMuaW50ZXJ2YWxzWzBdLmxlbmd0aCA9PSBudWxsIHx8IHRoaXMuaW50ZXJ2YWxzLmxlbmd0aCA9PSAxKSB7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpPTA7IGk8dGhpcy5pbnRlcnZhbHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmludGVydmFsc1tpXSA9IFt0aGlzLmludGVydmFsc1tpXSwgdGhpcy5pbnRlcnZhbHNbaV0sIHRoaXMuaW50ZXJ2YWxDb2xvcnNbaV1dOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuaW50ZXJ2YWxzWzBdLmxlbmd0aCA9PSAyKSB7CiAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaTx0aGlzLmludGVydmFscy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgIHRoaXMuaW50ZXJ2YWxzW2ldID0gW3RoaXMuaW50ZXJ2YWxzW2ldWzBdLCB0aGlzLmludGVydmFsc1tpXVsxXSwgdGhpcy5pbnRlcnZhbENvbG9yc1tpXV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLy8gY29tcHV0ZSBtaW4sIG1heCBhbmQgdGlja3MgaWYgbm90IHN1cHBsaWVkOgogICAgICAgIGlmICh0aGlzLnRpY2tzLmxlbmd0aCkgewogICAgICAgICAgICBpZiAodGhpcy50aWNrc1swXS5sZW5ndGggPT0gbnVsbCB8fCB0aGlzLnRpY2tzWzBdLmxlbmd0aCA9PSAxKSB7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpPTA7IGk8dGhpcy50aWNrcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgIHRoaXMudGlja3NbaV0gPSBbdGhpcy50aWNrc1tpXSwgdGhpcy50aWNrc1tpXV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5taW4gPSAodGhpcy5taW4gPT0gbnVsbCkgPyB0aGlzLnRpY2tzWzBdWzBdIDogdGhpcy5taW47CiAgICAgICAgICAgIHRoaXMubWF4ID0gKHRoaXMubWF4ID09IG51bGwpID8gdGhpcy50aWNrc1t0aGlzLnRpY2tzLmxlbmd0aC0xXVswXSA6IHRoaXMubWF4OwogICAgICAgICAgICB0aGlzLnNldG1pbiA9IGZhbHNlOwogICAgICAgICAgICB0aGlzLnNldG1heCA9IGZhbHNlOwogICAgICAgICAgICB0aGlzLm51bWJlclRpY2tzID0gdGhpcy50aWNrcy5sZW5ndGg7CiAgICAgICAgICAgIHRoaXMudGlja0ludGVydmFsID0gdGhpcy50aWNrc1sxXVswXSAtIHRoaXMudGlja3NbMF1bMF07CiAgICAgICAgICAgIHRoaXMudGlja0ZhY3RvciA9IE1hdGguZmxvb3IocGFyc2VGbG9hdCgoTWF0aC5sb2codGhpcy50aWNrSW50ZXJ2YWwpL01hdGgubG9nKDEwKSkudG9GaXhlZCgxMSkpKTsKICAgICAgICAgICAgLy8gdXNlIHRoZSBmaXJzdCBpbnRlcmFsIHRvIGNhbGN1bGF0ZSBtaW5vciB0aWNrczsKICAgICAgICAgICAgdGhpcy5udW1iZXJNaW5vclRpY2tzID0gZ2V0bm10KHRoaXMudGlja1Bvc2l0aW9ucywgdGhpcy50aWNrSW50ZXJ2YWwsIHRoaXMudGlja0ZhY3Rvcik7CiAgICAgICAgICAgIGlmICghdGhpcy5udW1iZXJNaW5vclRpY2tzKSB7CiAgICAgICAgICAgICAgICB0aGlzLm51bWJlck1pbm9yVGlja3MgPSBnZXRubXQodGhpcy50aWNrUG9zaXRpb25zLCB0aGlzLnRpY2tJbnRlcnZhbCwgdGhpcy50aWNrRmFjdG9yLTEpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghdGhpcy5udW1iZXJNaW5vclRpY2tzKSB7CiAgICAgICAgICAgICAgICB0aGlzLm51bWJlck1pbm9yVGlja3MgPSAxOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGVsc2UgaWYgKHRoaXMuaW50ZXJ2YWxzLmxlbmd0aCkgewogICAgICAgICAgICB0aGlzLm1pbiA9ICh0aGlzLm1pbiA9PSBudWxsKSA/IDAgOiB0aGlzLm1pbjsKICAgICAgICAgICAgdGhpcy5zZXRtaW4gPSBmYWxzZTsKICAgICAgICAgICAgaWYgKHRoaXMubWF4ID09IG51bGwpIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLmludGVydmFsc1t0aGlzLmludGVydmFscy5sZW5ndGgtMV1bMF0gPj0gdGhpcy5kYXRhWzBdWzFdKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXggPSB0aGlzLmludGVydmFsc1t0aGlzLmludGVydmFscy5sZW5ndGgtMV1bMF07CiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRtYXggPSBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHRoaXMuc2V0bWF4ID0gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIC8vIG5vIHRpY2tzIGFuZCBubyBpbnRlcnZhbHMgc3VwcGxpZWQsIHB1dCBuZWVkbGUgaW4gbWlkZGxlCiAgICAgICAgICAgIHRoaXMubWluID0gKHRoaXMubWluID09IG51bGwpID8gMCA6IHRoaXMubWluOwogICAgICAgICAgICB0aGlzLnNldG1pbiA9IGZhbHNlOwogICAgICAgICAgICBpZiAodGhpcy5tYXggPT0gbnVsbCkgewogICAgICAgICAgICAgICAgdGhpcy5tYXggPSB0aGlzLmRhdGFbMF1bMV0gKiAxLjI1OwogICAgICAgICAgICAgICAgdGhpcy5zZXRtYXggPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgdGhpcy5zZXRtYXggPSBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH07CiAgICAKICAgICQuanFwbG90Lk1ldGVyR2F1Z2VSZW5kZXJlci5wcm90b3R5cGUuc2V0R3JpZERhdGEgPSBmdW5jdGlvbihwbG90KSB7CiAgICAgICAgLy8gc2V0IGdyaWREYXRhIHByb3BlcnR5LiAgVGhpcyB3aWxsIGhvbGQgYW5nbGUgaW4gcmFkaWFucyBvZiBlYWNoIGRhdGEgcG9pbnQuCiAgICAgICAgdmFyIHN0YWNrID0gW107CiAgICAgICAgdmFyIHRkID0gW107CiAgICAgICAgdmFyIHNhID0gdGhpcy5zdGFydEFuZ2xlOwogICAgICAgIGZvciAodmFyIGk9MDsgaTx0aGlzLmRhdGEubGVuZ3RoOyBpKyspewogICAgICAgICAgICBzdGFjay5wdXNoKHRoaXMuZGF0YVtpXVsxXSk7CiAgICAgICAgICAgIHRkLnB1c2goW3RoaXMuZGF0YVtpXVswXV0pOwogICAgICAgICAgICBpZiAoaT4wKSB7CiAgICAgICAgICAgICAgICBzdGFja1tpXSArPSBzdGFja1tpLTFdOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHZhciBmYWN0ID0gTWF0aC5QSSoyL3N0YWNrW3N0YWNrLmxlbmd0aCAtIDFdOwogICAgICAgIAogICAgICAgIGZvciAodmFyIGk9MDsgaTxzdGFjay5sZW5ndGg7IGkrKykgewogICAgICAgICAgICB0ZFtpXVsxXSA9IHN0YWNrW2ldICogZmFjdDsKICAgICAgICB9CiAgICAgICAgdGhpcy5ncmlkRGF0YSA9IHRkOwogICAgfTsKICAgIAogICAgJC5qcXBsb3QuTWV0ZXJHYXVnZVJlbmRlcmVyLnByb3RvdHlwZS5tYWtlR3JpZERhdGEgPSBmdW5jdGlvbihkYXRhLCBwbG90KSB7CiAgICAgICAgdmFyIHN0YWNrID0gW107CiAgICAgICAgdmFyIHRkID0gW107CiAgICAgICAgdmFyIHNhID0gdGhpcy5zdGFydEFuZ2xlOwogICAgICAgIGZvciAodmFyIGk9MDsgaTxkYXRhLmxlbmd0aDsgaSsrKXsKICAgICAgICAgICAgc3RhY2sucHVzaChkYXRhW2ldWzFdKTsKICAgICAgICAgICAgdGQucHVzaChbZGF0YVtpXVswXV0pOwogICAgICAgICAgICBpZiAoaT4wKSB7CiAgICAgICAgICAgICAgICBzdGFja1tpXSArPSBzdGFja1tpLTFdOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHZhciBmYWN0ID0gTWF0aC5QSSoyL3N0YWNrW3N0YWNrLmxlbmd0aCAtIDFdOwogICAgICAgIAogICAgICAgIGZvciAodmFyIGk9MDsgaTxzdGFjay5sZW5ndGg7IGkrKykgewogICAgICAgICAgICB0ZFtpXVsxXSA9IHN0YWNrW2ldICogZmFjdDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRkOwogICAgfTsKCiAgICAgICAgCiAgICBmdW5jdGlvbiBnZXRubXQocG9zLCBpbnRlcnZhbCwgZmFjdCkgewogICAgICAgIHZhciB0ZW1wOwogICAgICAgIGZvciAodmFyIGk9cG9zLmxlbmd0aC0xOyBpPj0wOyBpLS0pIHsKICAgICAgICAgICAgdGVtcCA9IGludGVydmFsLyhwb3NbaV0gKiBNYXRoLnBvdygxMCwgZmFjdCkpOwogICAgICAgICAgICBpZiAodGVtcCA9PSA0IHx8IHRlbXAgPT0gNSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRlbXAgLSAxOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgCiAgICAvLyBjYWxsZWQgd2l0aCBzY29wZSBvZiBzZXJpZXMKICAgICQuanFwbG90Lk1ldGVyR2F1Z2VSZW5kZXJlci5wcm90b3R5cGUuZHJhdyA9IGZ1bmN0aW9uIChjdHgsIGdkLCBvcHRpb25zKSB7CiAgICAgICAgdmFyIGk7CiAgICAgICAgdmFyIG9wdHMgPSAob3B0aW9ucyAhPSB1bmRlZmluZWQpID8gb3B0aW9ucyA6IHt9OwogICAgICAgIC8vIG9mZnNldCBhbmQgZGlyZWN0aW9uIG9mIG9mZnNldCBkdWUgdG8gbGVnZW5kIHBsYWNlbWVudAogICAgICAgIHZhciBvZmZ4ID0gMDsKICAgICAgICB2YXIgb2ZmeSA9IDA7CiAgICAgICAgdmFyIHRyYW5zID0gMTsKICAgICAgICBpZiAob3B0aW9ucy5sZWdlbmRJbmZvICYmIG9wdGlvbnMubGVnZW5kSW5mby5wbGFjZW1lbnQgPT0gJ2luc2lkZScpIHsKICAgICAgICAgICAgdmFyIGxpID0gb3B0aW9ucy5sZWdlbmRJbmZvOwogICAgICAgICAgICBzd2l0Y2ggKGxpLmxvY2F0aW9uKSB7CiAgICAgICAgICAgICAgICBjYXNlICdudyc6CiAgICAgICAgICAgICAgICAgICAgb2ZmeCA9IGxpLndpZHRoICsgbGkueG9mZnNldDsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJ3cnOgogICAgICAgICAgICAgICAgICAgIG9mZnggPSBsaS53aWR0aCArIGxpLnhvZmZzZXQ7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICdzdyc6CiAgICAgICAgICAgICAgICAgICAgb2ZmeCA9IGxpLndpZHRoICsgbGkueG9mZnNldDsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJ25lJzoKICAgICAgICAgICAgICAgICAgICBvZmZ4ID0gbGkud2lkdGggKyBsaS54b2Zmc2V0OwogICAgICAgICAgICAgICAgICAgIHRyYW5zID0gLTE7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICdlJzoKICAgICAgICAgICAgICAgICAgICBvZmZ4ID0gbGkud2lkdGggKyBsaS54b2Zmc2V0OwogICAgICAgICAgICAgICAgICAgIHRyYW5zID0gLTE7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICdzZSc6CiAgICAgICAgICAgICAgICAgICAgb2ZmeCA9IGxpLndpZHRoICsgbGkueG9mZnNldDsKICAgICAgICAgICAgICAgICAgICB0cmFucyA9IC0xOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAnbic6CiAgICAgICAgICAgICAgICAgICAgb2ZmeSA9IGxpLmhlaWdodCArIGxpLnlvZmZzZXQ7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICdzJzoKICAgICAgICAgICAgICAgICAgICBvZmZ5ID0gbGkuaGVpZ2h0ICsgbGkueW9mZnNldDsKICAgICAgICAgICAgICAgICAgICB0cmFucyA9IC0xOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAKICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgLy8gcHJlLWRyYXcgc28gY2FuIGdldCBpdCdzIGRpbWVuc2lvbnMuCiAgICAgICAgaWYgKHRoaXMubGFiZWwpIHsKICAgICAgICAgICAgdGhpcy5fbGFiZWxFbGVtID0gJCgnPGRpdiBjbGFzcz0ianFwbG90LW1ldGVyR2F1Z2UtbGFiZWwiIHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTsiPicrdGhpcy5sYWJlbCsnPC9kaXY+Jyk7CiAgICAgICAgICAgIHRoaXMuY2FudmFzLl9lbGVtLmFmdGVyKHRoaXMuX2xhYmVsRWxlbSk7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIHZhciBzaGFkb3cgPSAob3B0cy5zaGFkb3cgIT0gdW5kZWZpbmVkKSA/IG9wdHMuc2hhZG93IDogdGhpcy5zaGFkb3c7CiAgICAgICAgdmFyIHNob3dMaW5lID0gKG9wdHMuc2hvd0xpbmUgIT0gdW5kZWZpbmVkKSA/IG9wdHMuc2hvd0xpbmUgOiB0aGlzLnNob3dMaW5lOwogICAgICAgIHZhciBmaWxsID0gKG9wdHMuZmlsbCAhPSB1bmRlZmluZWQpID8gb3B0cy5maWxsIDogdGhpcy5maWxsOwogICAgICAgIHZhciBjdyA9IGN0eC5jYW52YXMud2lkdGg7CiAgICAgICAgdmFyIGNoID0gY3R4LmNhbnZhcy5oZWlnaHQ7CiAgICAgICAgaWYgKHRoaXMucGFkZGluZyA9PSBudWxsKSB7CiAgICAgICAgICAgIHRoaXMucGFkZGluZyA9IE1hdGgucm91bmQoTWF0aC5taW4oY3csIGNoKS8zMCk7CiAgICAgICAgfQogICAgICAgIHZhciB3ID0gY3cgLSBvZmZ4IC0gMiAqIHRoaXMucGFkZGluZzsKICAgICAgICB2YXIgaCA9IGNoIC0gb2ZmeSAtIDIgKiB0aGlzLnBhZGRpbmc7CiAgICAgICAgaWYgKHRoaXMubGFiZWxQb3NpdGlvbiA9PSAnYm90dG9tJyAmJiB0aGlzLmxhYmVsKSB7CiAgICAgICAgICAgIGggLT0gdGhpcy5fbGFiZWxFbGVtLm91dGVySGVpZ2h0KHRydWUpOwogICAgICAgIH0KICAgICAgICB2YXIgbWluZGltID0gTWF0aC5taW4odyxoKTsKICAgICAgICB2YXIgZCA9IG1pbmRpbTsKICAgICAgICAgICAgCiAgICAgICAgaWYgKCF0aGlzLmRpYW1ldGVyKSB7CiAgICAgICAgICAgIGlmICh0aGlzLnNlbWlDaXJjdWxhcikgewogICAgICAgICAgICAgICAgaWYgKCB3ID49IDIqaCkgewogICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5yaW5nV2lkdGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yaW5nV2lkdGggPSAyKmgvMzU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHRoaXMubmVlZGxlVGhpY2tuZXNzID0gdGhpcy5uZWVkbGVUaGlja25lc3MgfHwgMitNYXRoLnBvdyh0aGlzLnJpbmdXaWR0aCwgMC44KTsKICAgICAgICAgICAgICAgICAgICB0aGlzLmlubmVyUGFkID0gdGhpcy5yaW5nV2lkdGgvMiArIHRoaXMubmVlZGxlVGhpY2tuZXNzLzIgKyB0aGlzLm5lZWRsZVBhZDsKICAgICAgICAgICAgICAgICAgICB0aGlzLmRpYW1ldGVyID0gMiAqIChoIC0gMip0aGlzLmlubmVyUGFkKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5yaW5nV2lkdGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yaW5nV2lkdGggPSB3LzM1OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB0aGlzLm5lZWRsZVRoaWNrbmVzcyA9IHRoaXMubmVlZGxlVGhpY2tuZXNzIHx8IDIrTWF0aC5wb3codGhpcy5yaW5nV2lkdGgsIDAuOCk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbm5lclBhZCA9IHRoaXMucmluZ1dpZHRoLzIgKyB0aGlzLm5lZWRsZVRoaWNrbmVzcy8yICsgdGhpcy5uZWVkbGVQYWQ7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5kaWFtZXRlciA9IHcgLSAyKnRoaXMuaW5uZXJQYWQgLSB0aGlzLnJpbmdXaWR0aCAtIHRoaXMucGFkZGluZzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIGNlbnRlciB0YWtpbmcgaW50byBhY2NvdW50IGxlZ2VuZCBhbmQgb3ZlciBkcmF3IGZvciBnYXVnZSBib3R0b20gYmVsb3cgaHViLgogICAgICAgICAgICAgICAgLy8gdGhpcyB3aWxsIGJlIGNlbnRlciBvZiBodWIuCiAgICAgICAgICAgICAgICB0aGlzLl9jZW50ZXIgPSBbKGN3IC0gdHJhbnMgKiBvZmZ4KS8yICsgdHJhbnMgKiBvZmZ4LCAgKGNoICsgdHJhbnMqb2ZmeSAtIHRoaXMucGFkZGluZyAtIHRoaXMucmluZ1dpZHRoIC0gdGhpcy5pbm5lclBhZCldOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgaWYgKCF0aGlzLnJpbmdXaWR0aCkgewogICAgICAgICAgICAgICAgICAgIHRoaXMucmluZ1dpZHRoID0gZC8zNTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRoaXMubmVlZGxlVGhpY2tuZXNzID0gdGhpcy5uZWVkbGVUaGlja25lc3MgfHwgMitNYXRoLnBvdyh0aGlzLnJpbmdXaWR0aCwgMC44KTsKICAgICAgICAgICAgICAgIHRoaXMuaW5uZXJQYWQgPSAwOwogICAgICAgICAgICAgICAgdGhpcy5kaWFtZXRlciA9IGQgLSB0aGlzLnJpbmdXaWR0aDsKICAgICAgICAgICAgICAgIC8vIGNlbnRlciBpbiBtaWRkbGUgb2YgY2FudmFzIHRha2luZyBpbnRvIGFjY291bnQgbGVnZW5kLgogICAgICAgICAgICAgICAgLy8gd2lsbCBiZSBjZW50ZXIgb2YgaHViLgogICAgICAgICAgICAgICAgdGhpcy5fY2VudGVyID0gWyhjdy10cmFucypvZmZ4KS8yICsgdHJhbnMgKiBvZmZ4LCAoY2gtdHJhbnMqb2ZmeSkvMiArIHRyYW5zICogb2ZmeV07CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIAogICAgICAgIGlmICh0aGlzLl9sYWJlbEVsZW0gJiYgdGhpcy5sYWJlbFBvc2l0aW9uID09ICdib3R0b20nKSB7CiAgICAgICAgICAgIHRoaXMuX2NlbnRlclsxXSAtPSB0aGlzLl9sYWJlbEVsZW0ub3V0ZXJIZWlnaHQodHJ1ZSk7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIHRoaXMuX3JhZGl1cyA9IHRoaXMuZGlhbWV0ZXIvMjsKICAgICAgICAKICAgICAgICB0aGlzLnRpY2tTcGFjaW5nID0gNjAwMC90aGlzLmRpYW1ldGVyOwogICAgICAgIAogICAgICAgIGlmICghdGhpcy5odWJSYWRpdXMpIHsKICAgICAgICAgICAgdGhpcy5odWJSYWRpdXMgPSB0aGlzLmRpYW1ldGVyLzE4OwogICAgICAgIH0KICAgICAgICAKICAgICAgICB0aGlzLnNoYWRvd09mZnNldCA9IDAuNSArIHRoaXMucmluZ1dpZHRoLzk7CiAgICAgICAgdGhpcy5zaGFkb3dXaWR0aCA9IHRoaXMucmluZ1dpZHRoKjE7CiAgICAgICAgCiAgICAgICAgdGhpcy50aWNrUGFkZGluZyA9IDMgKyBNYXRoLnBvdyh0aGlzLmRpYW1ldGVyLzIwLCAwLjcpOwogICAgICAgIHRoaXMudGlja091dGVyUmFkaXVzID0gdGhpcy5fcmFkaXVzIC0gdGhpcy5yaW5nV2lkdGgvMiAtIHRoaXMudGlja1BhZGRpbmc7CiAgICAgICAgdGhpcy50aWNrTGVuZ3RoID0gKHRoaXMuc2hvd1RpY2tzKSA/IHRoaXMuX3JhZGl1cy8xMyA6IDA7CiAgICAgICAgCiAgICAgICAgaWYgKHRoaXMudGlja3MubGVuZ3RoID09IDApIHsKICAgICAgICAgICAgLy8gbm8gdGlja3MsIGxldHMgbWFrZSBzb21lLgogICAgICAgICAgICB2YXIgbWF4ID0gdGhpcy5tYXgsCiAgICAgICAgICAgICAgICBtaW4gPSB0aGlzLm1pbiwKICAgICAgICAgICAgICAgIHNldG1heCA9IHRoaXMuc2V0bWF4LAogICAgICAgICAgICAgICAgc2V0bWluID0gdGhpcy5zZXRtaW4sCiAgICAgICAgICAgICAgICB0aSA9IChtYXggLSBtaW4pICogdGhpcy50aWNrU3BhY2luZyAvIHRoaXMuc3BhbjsKICAgICAgICAgICAgdmFyIHRmID0gTWF0aC5mbG9vcihwYXJzZUZsb2F0KChNYXRoLmxvZyh0aSkvTWF0aC5sb2coMTApKS50b0ZpeGVkKDExKSkpOwogICAgICAgICAgICB2YXIgdHAgPSAodGkvTWF0aC5wb3coMTAsIHRmKSk7CiAgICAgICAgICAgICh0cCA+IDIgJiYgdHAgPD0gMi41KSA/IHRwID0gMi41IDogdHAgPSBNYXRoLmNlaWwodHApOwogICAgICAgICAgICB2YXIgdCA9IHRoaXMudGlja1Bvc2l0aW9uczsKICAgICAgICAgICAgdmFyIHRwaW5kZXgsIG50OwogICAgCiAgICAgICAgICAgIGZvciAoaT0wOyBpPHQubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIGlmICh0cCA9PSB0W2ldIHx8IGkgJiYgdFtpLTFdIDwgdHAgJiYgdHAgPCB0W2ldKSB7IAogICAgICAgICAgICAgICAgICAgIHRpID0gdFtpXSpNYXRoLnBvdygxMCwgdGYpOwogICAgICAgICAgICAgICAgICAgIHRwaW5kZXggPSBpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgCiAgICAgICAgICAgIGZvciAoaT0wOyBpPHQubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIGlmICh0cCA9PSB0W2ldIHx8IGkgJiYgdFtpLTFdIDwgdHAgJiYgdHAgPCB0W2ldKSB7IAogICAgICAgICAgICAgICAgICAgIHRpID0gdFtpXSpNYXRoLnBvdygxMCwgdGYpOwogICAgICAgICAgICAgICAgICAgIG50ID0gTWF0aC5jZWlsKChtYXggLSBtaW4pIC8gdGkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgCiAgICAgICAgICAgIC8vIGJvdGggbWF4IGFuZCBtaW4gYXJlIGZyZWUKICAgICAgICAgICAgaWYgKHNldG1heCAmJiBzZXRtaW4pIHsKICAgICAgICAgICAgICAgIHZhciB0bWluID0gKG1pbiA+IDApID8gbWluIC0gbWluICUgdGkgOiBtaW4gLSBtaW4gJSB0aSAtIHRpOwogICAgICAgICAgICAgICAgaWYgKCF0aGlzLmZvcmNlWmVybykgewogICAgICAgICAgICAgICAgICAgIHZhciBkaWZmID0gTWF0aC5taW4obWluIC0gdG1pbiwgMC44KnRpKTsKICAgICAgICAgICAgICAgICAgICB2YXIgbnRwID0gTWF0aC5mbG9vcihkaWZmL3RbdHBpbmRleF0pOwogICAgICAgICAgICAgICAgICAgIGlmIChudHAgPiAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRtaW4gPSB0bWluICsgdFt0cGluZGV4XSAqIChudHAtMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJzZUludCh0bWluLCAxMCkgIT0gdG1pbiAmJiBwYXJzZUludCh0bWluLXRbdHBpbmRleF0sIDEwKSA9PSB0bWluLXRbdHBpbmRleF0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtaW4gPSB0bWluIC0gdFt0cGluZGV4XTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChtaW4gPT0gdG1pbikgewogICAgICAgICAgICAgICAgICAgIG1pbiAtPSB0aTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIC8vIHRtaW4gc2hvdWxkIGFsd2F5cyBiZSBsb3dlciB0aGFuIGRhdGFNaW4KICAgICAgICAgICAgICAgICAgICBpZiAobWluIC0gdG1pbiA+IDAuMjMqdGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWluID0gdG1pbjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1pbiA9IHRtaW4gLXRpOwogICAgICAgICAgICAgICAgICAgICAgICBudCArPSAxOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG50ICs9IDE7CiAgICAgICAgICAgICAgICB2YXIgdG1heCA9IG1pbiArIChudCAtIDEpICogdGk7CiAgICAgICAgICAgICAgICBpZiAobWF4ID49IHRtYXgpIHsgCiAgICAgICAgICAgICAgICAgICAgdG1heCArPSB0aTsKICAgICAgICAgICAgICAgICAgICBudCArPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gbm93IHRtYXggc2hvdWxkIGFsd2F5cyBiZSBtcm9lIHRoYW4gZGF0YU1heAogICAgICAgICAgICAgICAgaWYgKHRtYXggLSBtYXggPCAwLjIzKnRpKSB7IAogICAgICAgICAgICAgICAgICAgIHRtYXggKz0gdGk7CiAgICAgICAgICAgICAgICAgICAgbnQgKz0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRoaXMubWF4ID0gbWF4ID0gdG1heDsKICAgICAgICAgICAgICAgIHRoaXMubWluID0gbWluOyAgICAKCiAgICAgICAgICAgICAgICB0aGlzLnRpY2tJbnRlcnZhbCA9IHRpOwogICAgICAgICAgICAgICAgdGhpcy5udW1iZXJUaWNrcyA9IG50OwogICAgICAgICAgICAgICAgdmFyIGl0OwogICAgICAgICAgICAgICAgZm9yIChpPTA7IGk8bnQ7IGkrKykgewogICAgICAgICAgICAgICAgICAgIGl0ID0gcGFyc2VGbG9hdCgobWluK2kqdGkpLnRvRml4ZWQoMTEpKTsKICAgICAgICAgICAgICAgICAgICB0aGlzLnRpY2tzLnB1c2goW2l0LCBpdF0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGhpcy5tYXggPSB0aGlzLnRpY2tzW250LTFdWzFdOwogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHRoaXMudGlja0ZhY3RvciA9IHRmOyAgICAgIAogICAgICAgICAgICAgICAgLy8gZGV0ZXJtaW5lIG51bWJlciBvZiBtaW5vciB0aWNrcwoKICAgICAgICAgICAgICAgIHRoaXMubnVtYmVyTWlub3JUaWNrcyA9IGdldG5tdCh0aGlzLnRpY2tQb3NpdGlvbnMsIHRoaXMudGlja0ludGVydmFsLCB0aGlzLnRpY2tGYWN0b3IpOyAgICAgCiAgICAgICAgCiAgICAgICAgICAgICAgICBpZiAoIXRoaXMubnVtYmVyTWlub3JUaWNrcykgewogICAgICAgICAgICAgICAgICAgIHRoaXMubnVtYmVyTWlub3JUaWNrcyA9IGdldG5tdCh0aGlzLnRpY2tQb3NpdGlvbnMsIHRoaXMudGlja0ludGVydmFsLCB0aGlzLnRpY2tGYWN0b3ItMSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gbWF4IGlzIGZyZWUsIG1pbiBpcyBmaXhlZAogICAgICAgICAgICBlbHNlIGlmIChzZXRtYXgpIHsKICAgICAgICAgICAgICAgIHZhciB0bWF4ID0gbWluICsgKG50IC0gMSkgKiB0aTsKICAgICAgICAgICAgICAgIGlmIChtYXggPj0gdG1heCkgewogICAgICAgICAgICAgICAgICAgIG1heCA9IHRtYXggKyB0aTsKICAgICAgICAgICAgICAgICAgICBudCArPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgbWF4ID0gdG1heDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB0aGlzLnRpY2tJbnRlcnZhbCA9IHRoaXMudGlja0ludGVydmFsIHx8IHRpOwogICAgICAgICAgICAgICAgdGhpcy5udW1iZXJUaWNrcyA9IHRoaXMubnVtYmVyVGlja3MgfHwgbnQ7CiAgICAgICAgICAgICAgICB2YXIgaXQ7CiAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaTx0aGlzLm51bWJlclRpY2tzOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICBpdCA9IHBhcnNlRmxvYXQoKG1pbitpKnRoaXMudGlja0ludGVydmFsKS50b0ZpeGVkKDExKSk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy50aWNrcy5wdXNoKFtpdCwgaXRdKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRoaXMubWF4ID0gdGhpcy50aWNrc1t0aGlzLm51bWJlclRpY2tzLTFdWzFdOwogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHRoaXMudGlja0ZhY3RvciA9IHRmOwogICAgICAgICAgICAgICAgLy8gZGV0ZXJtaW5lIG51bWJlciBvZiBtaW5vciB0aWNrcwogICAgICAgICAgICAgICAgdGhpcy5udW1iZXJNaW5vclRpY2tzID0gZ2V0bm10KHRoaXMudGlja1Bvc2l0aW9ucywgdGhpcy50aWNrSW50ZXJ2YWwsIHRoaXMudGlja0ZhY3Rvcik7CiAgICAgICAgCiAgICAgICAgICAgICAgICBpZiAoIXRoaXMubnVtYmVyTWlub3JUaWNrcykgewogICAgICAgICAgICAgICAgICAgIHRoaXMubnVtYmVyTWlub3JUaWNrcyA9IGdldG5tdCh0aGlzLnRpY2tQb3NpdGlvbnMsIHRoaXMudGlja0ludGVydmFsLCB0aGlzLnRpY2tGYWN0b3ItMSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgICAgIC8vIG5vdCBzZXR0aW5nIG1heCBvciBtaW4KICAgICAgICAgICAgaWYgKCFzZXRtYXggJiYgIXNldG1pbikgewogICAgICAgICAgICAgICAgdmFyIHJhbmdlID0gdGhpcy5tYXggLSB0aGlzLm1pbjsKICAgICAgICAgICAgICAgIHRmID0gTWF0aC5mbG9vcihwYXJzZUZsb2F0KChNYXRoLmxvZyhyYW5nZSkvTWF0aC5sb2coMTApKS50b0ZpeGVkKDExKSkpIC0gMTsKICAgICAgICAgICAgICAgIHZhciBudGlja3MgPSBbNSw2LDQsNywzLDgsOSwxMCwyXSwgcmVzLCBudW10aWNrcywgbm9uU2lnRGlnaXRzPTAsIHNpZ1JhbmdlOwogICAgICAgICAgICAgICAgLy8gY2hlY2sgdG8gc2VlIGhvdyBtYW55IHplcm9zIGFyZSBhdCB0aGUgZW5kIG9mIHRoZSByYW5nZQogICAgICAgICAgICAgICAgaWYgKHJhbmdlID4gMSkgewogICAgICAgICAgICAgICAgICAgIHZhciByc3RyID0gU3RyaW5nKHJhbmdlKTsKICAgICAgICAgICAgICAgICAgICBpZiAocnN0ci5zZWFyY2goL1wuLykgPT0gLTEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwb3MgPSByc3RyLnNlYXJjaCgvMCskLyk7CiAgICAgICAgICAgICAgICAgICAgICAgICBub25TaWdEaWdpdHMgPSAocG9zID4gMCkgPyByc3RyLmxlbmd0aCAtIHBvcyAtIDEgOiAwOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHNpZ1JhbmdlID0gcmFuZ2UvTWF0aC5wb3coMTAsIG5vblNpZ0RpZ2l0cyk7CiAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaTxudGlja3MubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICByZXMgPSBzaWdSYW5nZS8obnRpY2tzW2ldLTEpOwogICAgICAgICAgICAgICAgICAgIGlmIChyZXMgPT0gcGFyc2VJbnQocmVzLCAxMCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5udW1iZXJUaWNrcyA9IG50aWNrc1tpXTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50aWNrSW50ZXJ2YWwgPSByYW5nZS8odGhpcy5udW1iZXJUaWNrcy0xKTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50aWNrRmFjdG9yID0gdGYrMTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIGl0OwogICAgICAgICAgICAgICAgZm9yIChpPTA7IGk8dGhpcy5udW1iZXJUaWNrczsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgaXQgPSBwYXJzZUZsb2F0KCh0aGlzLm1pbitpKnRoaXMudGlja0ludGVydmFsKS50b0ZpeGVkKDExKSk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy50aWNrcy5wdXNoKFtpdCwgaXRdKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIGRldGVybWluZSBudW1iZXIgb2YgbWlub3IgdGlja3MKICAgICAgICAgICAgICAgIHRoaXMubnVtYmVyTWlub3JUaWNrcyA9IGdldG5tdCh0aGlzLnRpY2tQb3NpdGlvbnMsIHRoaXMudGlja0ludGVydmFsLCB0aGlzLnRpY2tGYWN0b3IpOwogICAgICAgIAogICAgICAgICAgICAgICAgaWYgKCF0aGlzLm51bWJlck1pbm9yVGlja3MpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm51bWJlck1pbm9yVGlja3MgPSBnZXRubXQodGhpcy50aWNrUG9zaXRpb25zLCB0aGlzLnRpY2tJbnRlcnZhbCwgdGhpcy50aWNrRmFjdG9yLTEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBpZiAoIXRoaXMubnVtYmVyTWlub3JUaWNrcykgewogICAgICAgICAgICAgICAgICAgIHRoaXMubnVtYmVyTWlub3JUaWNrcyA9IDE7CiAgICAgICAgICAgICAgICAgICAgdmFyIG51bXMgPSBbNCwgNSwgMywgNiwgMl07CiAgICAgICAgICAgICAgICAgICAgZm9yIChpPTA7IGk8NTsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ZW1wID0gdGhpcy50aWNrSW50ZXJ2YWwvbnVtc1tpXTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRlbXAgPT0gcGFyc2VJbnQodGVtcCwgMTApKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm51bWJlck1pbm9yVGlja3MgPSBudW1zW2ldLTE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAKCiAgICAgICAgdmFyIHIgPSB0aGlzLl9yYWRpdXMsCiAgICAgICAgICAgIHNhID0gdGhpcy5zdGFydEFuZ2xlLAogICAgICAgICAgICBlYSA9IHRoaXMuZW5kQW5nbGUsICAgICAgIAogICAgICAgICAgICBwaSA9IE1hdGguUEksCiAgICAgICAgICAgIGhwaSA9IE1hdGguUEkvMjsKICAgICAgICAgICAgCiAgICAgICAgaWYgKHRoaXMuc2VtaUNpcmN1bGFyKSB7CiAgICAgICAgICAgIHZhciBvdmVyQW5nbGUgPSBNYXRoLmF0YW4odGhpcy5pbm5lclBhZC9yKSwKICAgICAgICAgICAgICAgIG91dGVyc2EgPSB0aGlzLm91dGVyU3RhcnRBbmdsZSA9IHNhIC0gb3ZlckFuZ2xlLAogICAgICAgICAgICAgICAgb3V0ZXJlYSA9IHRoaXMub3V0ZXJFbmRBbmdsZSA9IGVhICsgb3ZlckFuZ2xlLAogICAgICAgICAgICAgICAgaHVic2EgPSB0aGlzLmh1YlN0YXJ0QW5nbGUgPSBzYSAtIE1hdGguYXRhbih0aGlzLmlubmVyUGFkL3RoaXMuaHViUmFkaXVzKjIpLAogICAgICAgICAgICAgICAgaHViZWEgPSB0aGlzLmh1YkVuZEFuZ2xlID0gZWEgKyBNYXRoLmF0YW4odGhpcy5pbm5lclBhZC90aGlzLmh1YlJhZGl1cyoyKTsKCiAgICAgICAgICAgIGN0eC5zYXZlKCk7ICAgICAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICBjdHgudHJhbnNsYXRlKHRoaXMuX2NlbnRlclswXSwgdGhpcy5fY2VudGVyWzFdKTsKICAgICAgICAgICAgY3R4LmxpbmVKb2luID0gInJvdW5kIjsKICAgICAgICAgICAgY3R4LmxpbmVDYXAgPSAicm91bmQiOwogICAgICAgICAgICAKICAgICAgICAgICAgLy8gZHJhdyB0aGUgaW5uZXJiYWNrZ3JvdW5kCiAgICAgICAgICAgIGN0eC5zYXZlKCk7CiAgICAgICAgICAgIGN0eC5iZWdpblBhdGgoKTsgIAogICAgICAgICAgICBjdHguZmlsbFN0eWxlID0gdGhpcy5iYWNrZ3JvdW5kOwogICAgICAgICAgICBjdHguYXJjKDAsIDAsIHIsIG91dGVyc2EsIG91dGVyZWEsIGZhbHNlKTsKICAgICAgICAgICAgY3R4LmNsb3NlUGF0aCgpOwogICAgICAgICAgICBjdHguZmlsbCgpOwogICAgICAgICAgICBjdHgucmVzdG9yZSgpOwogICAgICAgICAgICAKICAgICAgICAgICAgLy8gZHJhdyB0aGUgc2hhZG93CiAgICAgICAgICAgIC8vIHRoZSBvdXRlciByaW5nLgogICAgICAgICAgICB2YXIgc2hhZG93Q29sb3IgPSAncmdiYSgwLDAsMCwnK3RoaXMuc2hhZG93QWxwaGErJyknOwogICAgICAgICAgICBjdHguc2F2ZSgpOwogICAgICAgICAgICBmb3IgKHZhciBpPTA7IGk8dGhpcy5zaGFkb3dEZXB0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICBjdHgudHJhbnNsYXRlKHRoaXMuc2hhZG93T2Zmc2V0Kk1hdGguY29zKHRoaXMuc2hhZG93QW5nbGUvMTgwKk1hdGguUEkpLCB0aGlzLnNoYWRvd09mZnNldCpNYXRoLnNpbih0aGlzLnNoYWRvd0FuZ2xlLzE4MCpNYXRoLlBJKSk7CiAgICAgICAgICAgICAgICBjdHguYmVnaW5QYXRoKCk7ICAKICAgICAgICAgICAgICAgIGN0eC5zdHJva2VTdHlsZSA9IHNoYWRvd0NvbG9yOwogICAgICAgICAgICAgICAgY3R4LmxpbmVXaWR0aCA9IHRoaXMuc2hhZG93V2lkdGg7CiAgICAgICAgICAgICAgICBjdHguYXJjKDAgLDAsIHIsIG91dGVyc2EsIG91dGVyZWEsIGZhbHNlKTsKICAgICAgICAgICAgICAgIGN0eC5jbG9zZVBhdGgoKTsKICAgICAgICAgICAgICAgIGN0eC5zdHJva2UoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjdHgucmVzdG9yZSgpOwogICAgICAgICAgICAKICAgICAgICAgICAgLy8gdGhlIGlubmVyIGh1Yi4KICAgICAgICAgICAgY3R4LnNhdmUoKTsKICAgICAgICAgICAgdmFyIHRlbXBkID0gcGFyc2VJbnQoKHRoaXMuc2hhZG93RGVwdGgrMSkvMiwgMTApOwogICAgICAgICAgICBmb3IgKHZhciBpPTA7IGk8dGVtcGQ7IGkrKykgewogICAgICAgICAgICAgICAgY3R4LnRyYW5zbGF0ZSh0aGlzLnNoYWRvd09mZnNldCpNYXRoLmNvcyh0aGlzLnNoYWRvd0FuZ2xlLzE4MCpNYXRoLlBJKSwgdGhpcy5zaGFkb3dPZmZzZXQqTWF0aC5zaW4odGhpcy5zaGFkb3dBbmdsZS8xODAqTWF0aC5QSSkpOwogICAgICAgICAgICAgICAgY3R4LmJlZ2luUGF0aCgpOyAgCiAgICAgICAgICAgICAgICBjdHguZmlsbFN0eWxlID0gc2hhZG93Q29sb3I7CiAgICAgICAgICAgICAgICBjdHguYXJjKDAgLDAsIHRoaXMuaHViUmFkaXVzLCBodWJzYSwgaHViZWEsIGZhbHNlKTsKICAgICAgICAgICAgICAgIGN0eC5jbG9zZVBhdGgoKTsKICAgICAgICAgICAgICAgIGN0eC5maWxsKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY3R4LnJlc3RvcmUoKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIC8vIGRyYXcgdGhlIG91dGVyIHJpbmcuCiAgICAgICAgICAgIGN0eC5zYXZlKCk7CiAgICAgICAgICAgIGN0eC5iZWdpblBhdGgoKTsgIAogICAgICAgICAgICBjdHguc3Ryb2tlU3R5bGUgPSB0aGlzLnJpbmdDb2xvcjsKICAgICAgICAgICAgY3R4LmxpbmVXaWR0aCA9IHRoaXMucmluZ1dpZHRoOwogICAgICAgICAgICBjdHguYXJjKDAgLDAsIHIsIG91dGVyc2EsIG91dGVyZWEsIGZhbHNlKTsKICAgICAgICAgICAgY3R4LmNsb3NlUGF0aCgpOwogICAgICAgICAgICBjdHguc3Ryb2tlKCk7CiAgICAgICAgICAgIGN0eC5yZXN0b3JlKCk7CiAgICAgICAgICAgIAogICAgICAgICAgICAvLyBkcmF3IHRoZSBodWIKICAgICAgICAgICAgCiAgICAgICAgICAgIGN0eC5zYXZlKCk7CiAgICAgICAgICAgIGN0eC5iZWdpblBhdGgoKTsgIAogICAgICAgICAgICBjdHguZmlsbFN0eWxlID0gdGhpcy5yaW5nQ29sb3I7CiAgICAgICAgICAgIGN0eC5hcmMoMCAsMCwgdGhpcy5odWJSYWRpdXMsaHVic2EsIGh1YmVhLCBmYWxzZSk7CiAgICAgICAgICAgIGN0eC5jbG9zZVBhdGgoKTsKICAgICAgICAgICAgY3R4LmZpbGwoKTsKICAgICAgICAgICAgY3R4LnJlc3RvcmUoKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIC8vIGRyYXcgdGhlIHRpY2tzCiAgICAgICAgICAgIGlmICh0aGlzLnNob3dUaWNrcykgewogICAgICAgICAgICAgICAgY3R4LnNhdmUoKTsKICAgICAgICAgICAgICAgIHZhciBvcmFkID0gdGhpcy50aWNrT3V0ZXJSYWRpdXMsCiAgICAgICAgICAgICAgICAgICAgdGwgPSB0aGlzLnRpY2tMZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgbXRsID0gdGwvMiwKICAgICAgICAgICAgICAgICAgICBubXQgPSB0aGlzLm51bWJlck1pbm9yVGlja3MsCiAgICAgICAgICAgICAgICAgICAgdHMgPSB0aGlzLnNwYW4gKiBNYXRoLlBJIC8gMTgwIC8gKHRoaXMudGlja3MubGVuZ3RoLTEpLAogICAgICAgICAgICAgICAgICAgIG10cyA9IHRzLyhubXQgKyAxKTsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaTx0aGlzLnRpY2tzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgY3R4LmJlZ2luUGF0aCgpOwogICAgICAgICAgICAgICAgICAgIGN0eC5saW5lV2lkdGggPSAxLjUgKyB0aGlzLmRpYW1ldGVyLzM2MDsKICAgICAgICAgICAgICAgICAgICBjdHguc3Ryb2tlU3R5bGUgPSB0aGlzLnJpbmdDb2xvcjsKICAgICAgICAgICAgICAgICAgICB2YXIgd3BzID0gdHMqaStzYTsKICAgICAgICAgICAgICAgICAgICBjdHgubW92ZVRvKC1vcmFkICogTWF0aC5jb3ModHMqaStzYSksIG9yYWQgKiBNYXRoLnNpbih0cyppK3NhKSk7CiAgICAgICAgICAgICAgICAgICAgY3R4LmxpbmVUbygtKG9yYWQtdGwpICogTWF0aC5jb3ModHMqaStzYSksIChvcmFkIC0gdGwpICogTWF0aC5zaW4odHMqaStzYSkpOwogICAgICAgICAgICAgICAgICAgIHRoaXMuX3RpY2tQb2ludHMucHVzaChbKG9yYWQtdGwpICogTWF0aC5jb3ModHMqaStzYSkgKyB0aGlzLl9jZW50ZXJbMF0gKyB0aGlzLmNhbnZhcy5fb2Zmc2V0cy5sZWZ0LCAob3JhZCAtIHRsKSAqIE1hdGguc2luKHRzKmkrc2EpICsgdGhpcy5fY2VudGVyWzFdICsgdGhpcy5jYW52YXMuX29mZnNldHMudG9wLCB0cyppK3NhXSk7CiAgICAgICAgICAgICAgICAgICAgY3R4LnN0cm9rZSgpOwogICAgICAgICAgICAgICAgICAgIGN0eC5saW5lV2lkdGggPSAxLjAgKyB0aGlzLmRpYW1ldGVyLzQ0MDsKICAgICAgICAgICAgICAgICAgICBpZiAoaTx0aGlzLnRpY2tzLmxlbmd0aC0xKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGo9MTsgajw9bm10OyBqKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC5iZWdpblBhdGgoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC5tb3ZlVG8oLW9yYWQgKiBNYXRoLmNvcyh0cyppK210cypqK3NhKSwgb3JhZCAqIE1hdGguc2luKHRzKmkrbXRzKmorc2EpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC5saW5lVG8oLShvcmFkLW10bCkgKiBNYXRoLmNvcyh0cyppK210cypqK3NhKSwgKG9yYWQtbXRsKSAqIE1hdGguc2luKHRzKmkrbXRzKmorc2EpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC5zdHJva2UoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSAgIAogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGN0eC5yZXN0b3JlKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgICAgIC8vIGRyYXcgdGhlIHRpY2sgbGFiZWxzCiAgICAgICAgICAgIGlmICh0aGlzLnNob3dUaWNrTGFiZWxzKSB7CiAgICAgICAgICAgICAgICB2YXIgZWxlbSwgbCwgdCwgZXcsIGVoLCBkaW0sIG1heGRpbT0wOwogICAgICAgICAgICAgICAgdmFyIHRwID0gdGhpcy50aWNrUGFkZGluZyAqICgxIC0gMS8odGhpcy5kaWFtZXRlci84MCsxKSk7CiAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaTx0aGlzLnRpY2tzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgZWxlbSA9ICQoJzxkaXYgY2xhc3M9ImpxcGxvdC1tZXRlckdhdWdlLXRpY2siIHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTsiPicrdGhpcy50aWNrc1tpXVsxXSsnPC9kaXY+Jyk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYW52YXMuX2VsZW0uYWZ0ZXIoZWxlbSk7CiAgICAgICAgICAgICAgICAgICAgZXcgPSBlbGVtLm91dGVyV2lkdGgodHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgZWggPSBlbGVtLm91dGVySGVpZ2h0KHRydWUpOwogICAgICAgICAgICAgICAgICAgIGwgPSB0aGlzLl90aWNrUG9pbnRzW2ldWzBdIC0gZXcgKiAodGhpcy5fdGlja1BvaW50c1tpXVsyXS1NYXRoLlBJKS9NYXRoLlBJIC0gdHAgKiBNYXRoLmNvcyh0aGlzLl90aWNrUG9pbnRzW2ldWzJdKTsKICAgICAgICAgICAgICAgICAgICB0ID0gdGhpcy5fdGlja1BvaW50c1tpXVsxXSAtIGVoLzIgKyBlaC8yICogTWF0aC5wb3coTWF0aC5hYnMoKE1hdGguc2luKHRoaXMuX3RpY2tQb2ludHNbaV1bMl0pKSksIDAuNSkgKyB0cC8zICogTWF0aC5wb3coTWF0aC5hYnMoKE1hdGguc2luKHRoaXMuX3RpY2tQb2ludHNbaV1bMl0pKSksIDAuNSkgOwogICAgICAgICAgICAgICAgICAgIC8vIHQgPSB0aGlzLl90aWNrUG9pbnRzW2ldWzFdIC0gZWgvMiAtIGVoLzIgKiBNYXRoLnNpbih0aGlzLl90aWNrUG9pbnRzW2ldWzJdKSAtIHRwLzIgKiBNYXRoLnNpbih0aGlzLl90aWNrUG9pbnRzW2ldWzJdKTsKICAgICAgICAgICAgICAgICAgICBlbGVtLmNzcyh7bGVmdDpsLCB0b3A6dH0pOwogICAgICAgICAgICAgICAgICAgIGRpbSAgPSBldypNYXRoLmNvcyh0aGlzLl90aWNrUG9pbnRzW2ldWzJdKSArIGVoKk1hdGguc2luKE1hdGguUEkvMit0aGlzLl90aWNrUG9pbnRzW2ldWzJdLzIpOwogICAgICAgICAgICAgICAgICAgIG1heGRpbSA9IChkaW0gPiBtYXhkaW0pID8gZGltIDogbWF4ZGltOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICAvLyBkcmF3IHRoZSBnYXVnZSBsYWJlbAogICAgICAgICAgICBpZiAodGhpcy5sYWJlbCAmJiB0aGlzLmxhYmVsUG9zaXRpb24gPT0gJ2luc2lkZScpIHsKICAgICAgICAgICAgICAgIHZhciBsID0gdGhpcy5fY2VudGVyWzBdICsgdGhpcy5jYW52YXMuX29mZnNldHMubGVmdDsKICAgICAgICAgICAgICAgIHZhciB0cCA9IHRoaXMudGlja1BhZGRpbmcgKiAoMSAtIDEvKHRoaXMuZGlhbWV0ZXIvODArMSkpOwogICAgICAgICAgICAgICAgdmFyIHQgPSAwLjUqKHRoaXMuX2NlbnRlclsxXSArIHRoaXMuY2FudmFzLl9vZmZzZXRzLnRvcCAtIHRoaXMuaHViUmFkaXVzKSArIDAuNSoodGhpcy5fY2VudGVyWzFdICsgdGhpcy5jYW52YXMuX29mZnNldHMudG9wIC0gdGhpcy50aWNrT3V0ZXJSYWRpdXMgKyB0aGlzLnRpY2tMZW5ndGggKyB0cCkgKyB0aGlzLmxhYmVsSGVpZ2h0QWRqdXN0OwogICAgICAgICAgICAgICAgLy8gdGhpcy5fbGFiZWxFbGVtID0gJCgnPGRpdiBjbGFzcz0ianFwbG90LW1ldGVyR2F1Z2UtbGFiZWwiIHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTsiPicrdGhpcy5sYWJlbCsnPC9kaXY+Jyk7CiAgICAgICAgICAgICAgICAvLyB0aGlzLmNhbnZhcy5fZWxlbS5hZnRlcih0aGlzLl9sYWJlbEVsZW0pOwogICAgICAgICAgICAgICAgbCAtPSB0aGlzLl9sYWJlbEVsZW0ub3V0ZXJXaWR0aCh0cnVlKS8yOwogICAgICAgICAgICAgICAgdCAtPSB0aGlzLl9sYWJlbEVsZW0ub3V0ZXJIZWlnaHQodHJ1ZSkvMjsKICAgICAgICAgICAgICAgIHRoaXMuX2xhYmVsRWxlbS5jc3Moe2xlZnQ6bCwgdG9wOnR9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5sYWJlbCAmJiB0aGlzLmxhYmVsUG9zaXRpb24gPT0gJ2JvdHRvbScpIHsKICAgICAgICAgICAgICAgIHZhciBsID0gdGhpcy5fY2VudGVyWzBdICsgdGhpcy5jYW52YXMuX29mZnNldHMubGVmdCAtIHRoaXMuX2xhYmVsRWxlbS5vdXRlcldpZHRoKHRydWUpLzI7CiAgICAgICAgICAgICAgICB2YXIgdCA9IHRoaXMuX2NlbnRlclsxXSArIHRoaXMuY2FudmFzLl9vZmZzZXRzLnRvcCArIHRoaXMuaW5uZXJQYWQgKyArIHRoaXMucmluZ1dpZHRoICsgdGhpcy5wYWRkaW5nICsgdGhpcy5sYWJlbEhlaWdodEFkanVzdDsKICAgICAgICAgICAgICAgIHRoaXMuX2xhYmVsRWxlbS5jc3Moe2xlZnQ6bCwgdG9wOnR9KTsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICAvLyBkcmF3IHRoZSBpbnRlcnZhbHMKICAgICAgICAgICAgCiAgICAgICAgICAgIGN0eC5zYXZlKCk7CiAgICAgICAgICAgIHZhciBpbm5lciA9IHRoaXMuaW50ZXJ2YWxJbm5lclJhZGl1cyB8fCB0aGlzLmh1YlJhZGl1cyAqIDEuNTsKICAgICAgICAgICAgaWYgKHRoaXMuaW50ZXJ2YWxPdXRlclJhZGl1cyA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5zaG93VGlja0xhYmVscykgewogICAgICAgICAgICAgICAgICAgIHZhciBvdXRlciA9ICh0aGlzLnRpY2tPdXRlclJhZGl1cyAtIHRoaXMudGlja0xlbmd0aCAtIHRoaXMudGlja1BhZGRpbmcgLSB0aGlzLmRpYW1ldGVyLzgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG91dGVyID0gKHRoaXMudGlja091dGVyUmFkaXVzIC0gdGhpcy50aWNrTGVuZ3RoIC0gdGhpcy5kaWFtZXRlci8xNik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICB2YXIgb3V0ZXIgPSB0aGlzLmludGVydmFsT3V0ZXJSYWRpdXM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHJhbmdlID0gdGhpcy5tYXggLSB0aGlzLm1pbjsKICAgICAgICAgICAgdmFyIGludHJhbmdlID0gdGhpcy5pbnRlcnZhbHNbdGhpcy5pbnRlcnZhbHMubGVuZ3RoLTFdIC0gdGhpcy5taW47CiAgICAgICAgICAgIHZhciBzdGFydCwgZW5kLCBzcGFuID0gdGhpcy5zcGFuKk1hdGguUEkvMTgwOwogICAgICAgICAgICBmb3IgKGk9MDsgaTx0aGlzLmludGVydmFscy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgc3RhcnQgPSAoaSA9PSAwKSA/IHNhIDogc2EgKyAodGhpcy5pbnRlcnZhbHNbaS0xXVswXSAtIHRoaXMubWluKSpzcGFuL3JhbmdlOwogICAgICAgICAgICAgICAgaWYgKHN0YXJ0IDwgMCkgewogICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gMDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVuZCA9IHNhICsgKHRoaXMuaW50ZXJ2YWxzW2ldWzBdIC0gdGhpcy5taW4pKnNwYW4vcmFuZ2U7CiAgICAgICAgICAgICAgICBpZiAoZW5kIDwgMCkgewogICAgICAgICAgICAgICAgICAgIGVuZCA9IDA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjdHguYmVnaW5QYXRoKCk7CiAgICAgICAgICAgICAgICBjdHguZmlsbFN0eWxlID0gdGhpcy5pbnRlcnZhbHNbaV1bMl07CiAgICAgICAgICAgICAgICBjdHguYXJjKDAsIDAsIGlubmVyLCBzdGFydCwgZW5kLCBmYWxzZSk7CiAgICAgICAgICAgICAgICBjdHgubGluZVRvKG91dGVyKk1hdGguY29zKGVuZCksIG91dGVyKk1hdGguc2luKGVuZCkpOwogICAgICAgICAgICAgICAgY3R4LmFyYygwLCAwLCBvdXRlciwgZW5kLCBzdGFydCwgdHJ1ZSk7CiAgICAgICAgICAgICAgICBjdHgubGluZVRvKGlubmVyKk1hdGguY29zKHN0YXJ0KSwgaW5uZXIqTWF0aC5zaW4oc3RhcnQpKTsKICAgICAgICAgICAgICAgIGN0eC5jbG9zZVBhdGgoKTsKICAgICAgICAgICAgICAgIGN0eC5maWxsKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY3R4LnJlc3RvcmUoKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIC8vIGRyYXcgdGhlIG5lZWRsZQogICAgICAgICAgICB2YXIgZGF0YXBvaW50ID0gdGhpcy5kYXRhWzBdWzFdOwogICAgICAgICAgICB2YXIgZGF0YXNwYW4gPSB0aGlzLm1heCAtIHRoaXMubWluOwogICAgICAgICAgICBpZiAodGhpcy5wZWdOZWVkbGUpIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLmRhdGFbMF1bMV0gPiB0aGlzLm1heCArIGRhdGFzcGFuKjMvdGhpcy5zcGFuKSB7CiAgICAgICAgICAgICAgICAgICAgZGF0YXBvaW50ID0gdGhpcy5tYXggKyBkYXRhc3BhbiozL3RoaXMuc3BhbjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh0aGlzLmRhdGFbMF1bMV0gPCB0aGlzLm1pbiAtIGRhdGFzcGFuKjMvdGhpcy5zcGFuKSB7CiAgICAgICAgICAgICAgICAgICAgZGF0YXBvaW50ID0gdGhpcy5taW4gLSBkYXRhc3BhbiozL3RoaXMuc3BhbjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgZGF0YWFuZyA9IChkYXRhcG9pbnQgLSB0aGlzLm1pbikvZGF0YXNwYW4gKiB0aGlzLnNwYW4gKiBNYXRoLlBJLzE4MCArIHRoaXMuc3RhcnRBbmdsZTsKICAgICAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICBjdHguc2F2ZSgpOwogICAgICAgICAgICBjdHguYmVnaW5QYXRoKCk7CiAgICAgICAgICAgIGN0eC5maWxsU3R5bGUgPSB0aGlzLnJpbmdDb2xvcjsKICAgICAgICAgICAgY3R4LnN0cm9rZVN0eWxlID0gdGhpcy5yaW5nQ29sb3I7CiAgICAgICAgICAgIHRoaXMubmVlZGxlTGVuZ3RoID0gKHRoaXMudGlja091dGVyUmFkaXVzIC0gdGhpcy50aWNrTGVuZ3RoKSAqIDAuODU7CiAgICAgICAgICAgIHRoaXMubmVlZGxlVGhpY2tuZXNzID0gKHRoaXMubmVlZGxlVGhpY2tuZXNzIDwgMikgPyAyIDogdGhpcy5uZWVkbGVUaGlja25lc3M7CiAgICAgICAgICAgIHZhciBlbmR3aWR0aCA9IHRoaXMubmVlZGxlVGhpY2tuZXNzICogMC40OwoKICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBkbCA9IHRoaXMubmVlZGxlTGVuZ3RoLzEwOwogICAgICAgICAgICB2YXIgZHQgPSAodGhpcy5uZWVkbGVUaGlja25lc3MgLSBlbmR3aWR0aCkvMTA7CiAgICAgICAgICAgIHZhciB0ZW1wbDsKICAgICAgICAgICAgZm9yICh2YXIgaT0wOyBpPDEwOyBpKyspIHsKICAgICAgICAgICAgICAgIHRlbXBsID0gdGhpcy5uZWVkbGVUaGlja25lc3MgLSBpKmR0OwogICAgICAgICAgICAgICAgY3R4Lm1vdmVUbyhkbCppKk1hdGguY29zKGRhdGFhbmcpLCBkbCppKk1hdGguc2luKGRhdGFhbmcpKTsKICAgICAgICAgICAgICAgIGN0eC5saW5lV2lkdGggPSB0ZW1wbDsKICAgICAgICAgICAgICAgIGN0eC5saW5lVG8oZGwqKGkrMSkqTWF0aC5jb3MoZGF0YWFuZyksIGRsKihpKzEpKk1hdGguc2luKGRhdGFhbmcpKTsKICAgICAgICAgICAgICAgIGN0eC5zdHJva2UoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgY3R4LnJlc3RvcmUoKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHRoaXMuX2NlbnRlciA9IFsoY3cgLSB0cmFucyAqIG9mZngpLzIgKyB0cmFucyAqIG9mZngsIChjaCAtIHRyYW5zKm9mZnkpLzIgKyB0cmFucyAqIG9mZnldOwogICAgICAgIH0gICAgICAgICAgICAgICAKICAgIH07CiAgICAKICAgICQuanFwbG90Lk1ldGVyR2F1Z2VBeGlzUmVuZGVyZXIgPSBmdW5jdGlvbigpIHsKICAgICAgICAkLmpxcGxvdC5MaW5lYXJBeGlzUmVuZGVyZXIuY2FsbCh0aGlzKTsKICAgIH07CiAgICAKICAgICQuanFwbG90Lk1ldGVyR2F1Z2VBeGlzUmVuZGVyZXIucHJvdG90eXBlID0gbmV3ICQuanFwbG90LkxpbmVhckF4aXNSZW5kZXJlcigpOwogICAgJC5qcXBsb3QuTWV0ZXJHYXVnZUF4aXNSZW5kZXJlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSAkLmpxcGxvdC5NZXRlckdhdWdlQXhpc1JlbmRlcmVyOwogICAgICAgIAogICAgCiAgICAvLyBUaGVyZSBhcmUgbm8gdHJhZGl0aW9uYWwgYXhlcyBvbiBhIGdhdWdlIGNoYXJ0LiAgV2UganVzdCBuZWVkIHRvIHByb3ZpZGUKICAgIC8vIGR1bW15IG9iamVjdHMgd2l0aCBwcm9wZXJ0aWVzIHNvIHRoZSBwbG90IHdpbGwgcmVuZGVyLgogICAgLy8gY2FsbGVkIHdpdGggc2NvcGUgb2YgYXhpcyBvYmplY3QuCiAgICAkLmpxcGxvdC5NZXRlckdhdWdlQXhpc1JlbmRlcmVyLnByb3RvdHlwZS5pbml0ID0gZnVuY3Rpb24ob3B0aW9ucyl7CiAgICAgICAgLy8KICAgICAgICB0aGlzLnRpY2tSZW5kZXJlciA9ICQuanFwbG90Lk1ldGVyR2F1Z2VUaWNrUmVuZGVyZXI7CiAgICAgICAgJC5leHRlbmQodHJ1ZSwgdGhpcywgb3B0aW9ucyk7CiAgICAgICAgLy8gSSBkb24ndCB0aGluayBJJ20gZ29pbmcgdG8gbmVlZCBfZGF0YUJvdW5kcyBoZXJlLgogICAgICAgIC8vIGhhdmUgdG8gZ28gQXhpcyBzY2FsaW5nIGluIGEgd2F5IHRvIGZpdCBjaGFydCBvbnRvIHBsb3QgYXJlYQogICAgICAgIC8vIGFuZCBwcm92aWRlIHUycCBhbmQgcDJ1IGZ1bmN0aW9uYWxpdHkgZm9yIG1vdXNlIGN1cnNvciwgZXRjLgogICAgICAgIC8vIGZvciBjb252aWVuZW5jZSBzZXQgX2RhdGFCb3VuZHMgdG8gMCBhbmQgMTAwIGFuZAogICAgICAgIC8vIHNldCBtaW4vbWF4IHRvIDAgYW5kIDEwMC4KICAgICAgICB0aGlzLl9kYXRhQm91bmRzID0ge21pbjowLCBtYXg6MTAwfTsKICAgICAgICB0aGlzLm1pbiA9IDA7CiAgICAgICAgdGhpcy5tYXggPSAxMDA7CiAgICAgICAgdGhpcy5zaG93VGlja3MgPSBmYWxzZTsKICAgICAgICB0aGlzLnRpY2tzID0gW107CiAgICAgICAgdGhpcy5zaG93TWFyayA9IGZhbHNlOwogICAgICAgIHRoaXMuc2hvdyA9IGZhbHNlOyAKICAgIH07CiAgICAKICAgICQuanFwbG90Lk1ldGVyR2F1Z2VMZWdlbmRSZW5kZXJlciA9IGZ1bmN0aW9uKCl7CiAgICAgICAgJC5qcXBsb3QuVGFibGVMZWdlbmRSZW5kZXJlci5jYWxsKHRoaXMpOwogICAgfTsKICAgIAogICAgJC5qcXBsb3QuTWV0ZXJHYXVnZUxlZ2VuZFJlbmRlcmVyLnByb3RvdHlwZSA9IG5ldyAkLmpxcGxvdC5UYWJsZUxlZ2VuZFJlbmRlcmVyKCk7CiAgICAkLmpxcGxvdC5NZXRlckdhdWdlTGVnZW5kUmVuZGVyZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gJC5qcXBsb3QuTWV0ZXJHYXVnZUxlZ2VuZFJlbmRlcmVyOwogICAgCiAgICAvKioKICAgICAqIENsYXNzOiAkLmpxcGxvdC5NZXRlckdhdWdlTGVnZW5kUmVuZGVyZXIKICAgICAqTWV0ZXIgZ2F1Z2VzIGRvbid0IHR5cGljYWxseSBoYXZlIGEgbGVnZW5kLCB0aGlzIG92ZXJyaWRlcyB0aGUgZGVmYXVsdCBsZWdlbmQgcmVuZGVyZXIuCiAgICAgKi8KICAgICQuanFwbG90Lk1ldGVyR2F1Z2VMZWdlbmRSZW5kZXJlci5wcm90b3R5cGUuaW5pdCA9IGZ1bmN0aW9uKG9wdGlvbnMpIHsKICAgICAgICAvLyBNYXhpbXVtIG51bWJlciBvZiByb3dzIGluIHRoZSBsZWdlbmQuICAwIG9yIG51bGwgZm9yIHVubGltaXRlZC4KICAgICAgICB0aGlzLm51bWJlclJvd3MgPSBudWxsOwogICAgICAgIC8vIE1heGltdW0gbnVtYmVyIG9mIGNvbHVtbnMgaW4gdGhlIGxlZ2VuZC4gIDAgb3IgbnVsbCBmb3IgdW5saW1pdGVkLgogICAgICAgIHRoaXMubnVtYmVyQ29sdW1ucyA9IG51bGw7CiAgICAgICAgJC5leHRlbmQodHJ1ZSwgdGhpcywgb3B0aW9ucyk7CiAgICB9OwogICAgCiAgICAvLyBjYWxsZWQgd2l0aCBjb250ZXh0IG9mIGxlZ2VuZAogICAgJC5qcXBsb3QuTWV0ZXJHYXVnZUxlZ2VuZFJlbmRlcmVyLnByb3RvdHlwZS5kcmF3ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgaWYgKHRoaXMuc2hvdykgewogICAgICAgICAgICB2YXIgc2VyaWVzID0gdGhpcy5fc2VyaWVzOwogICAgICAgICAgICB2YXIgc3MgPSAncG9zaXRpb246YWJzb2x1dGU7JzsKICAgICAgICAgICAgc3MgKz0gKHRoaXMuYmFja2dyb3VuZCkgPyAnYmFja2dyb3VuZDonK3RoaXMuYmFja2dyb3VuZCsnOycgOiAnJzsKICAgICAgICAgICAgc3MgKz0gKHRoaXMuYm9yZGVyKSA/ICdib3JkZXI6Jyt0aGlzLmJvcmRlcisnOycgOiAnJzsKICAgICAgICAgICAgc3MgKz0gKHRoaXMuZm9udFNpemUpID8gJ2ZvbnQtc2l6ZTonK3RoaXMuZm9udFNpemUrJzsnIDogJyc7CiAgICAgICAgICAgIHNzICs9ICh0aGlzLmZvbnRGYW1pbHkpID8gJ2ZvbnQtZmFtaWx5OicrdGhpcy5mb250RmFtaWx5Kyc7JyA6ICcnOwogICAgICAgICAgICBzcyArPSAodGhpcy50ZXh0Q29sb3IpID8gJ2NvbG9yOicrdGhpcy50ZXh0Q29sb3IrJzsnIDogJyc7CiAgICAgICAgICAgIHNzICs9ICh0aGlzLm1hcmdpblRvcCAhPSBudWxsKSA/ICdtYXJnaW4tdG9wOicrdGhpcy5tYXJnaW5Ub3ArJzsnIDogJyc7CiAgICAgICAgICAgIHNzICs9ICh0aGlzLm1hcmdpbkJvdHRvbSAhPSBudWxsKSA/ICdtYXJnaW4tYm90dG9tOicrdGhpcy5tYXJnaW5Cb3R0b20rJzsnIDogJyc7CiAgICAgICAgICAgIHNzICs9ICh0aGlzLm1hcmdpbkxlZnQgIT0gbnVsbCkgPyAnbWFyZ2luLWxlZnQ6Jyt0aGlzLm1hcmdpbkxlZnQrJzsnIDogJyc7CiAgICAgICAgICAgIHNzICs9ICh0aGlzLm1hcmdpblJpZ2h0ICE9IG51bGwpID8gJ21hcmdpbi1yaWdodDonK3RoaXMubWFyZ2luUmlnaHQrJzsnIDogJyc7CiAgICAgICAgICAgIHRoaXMuX2VsZW0gPSAkKCc8dGFibGUgY2xhc3M9ImpxcGxvdC10YWJsZS1sZWdlbmQiIHN0eWxlPSInK3NzKyciPjwvdGFibGU+Jyk7CiAgICAgICAgICAgIC8vIE1ldGVyR2F1Z2UgY2hhcnRzIGxlZ2VuZHMgZG9uJ3QgZ28gYnkgbnVtYmVyIG9mIHNlcmllcywgYnV0IGJ5IG51bWJlciBvZiBkYXRhIHBvaW50cwogICAgICAgICAgICAvLyBpbiB0aGUgc2VyaWVzLiAgUmVmYWN0b3IgdGhpbmdzIGhlcmUgZm9yIHRoYXQuCiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcGFkID0gZmFsc2UsIAogICAgICAgICAgICAgICAgcmV2ZXJzZSA9IGZhbHNlLAogICAgICAgICAgICAgICAgbnIsIG5jOwogICAgICAgICAgICB2YXIgcyA9IHNlcmllc1swXTsKICAgICAgICAgICAgCiAgICAgICAgICAgIGlmIChzLnNob3cpIHsKICAgICAgICAgICAgICAgIHZhciBwZCA9IHMuZGF0YTsKICAgICAgICAgICAgICAgIGlmICh0aGlzLm51bWJlclJvd3MpIHsKICAgICAgICAgICAgICAgICAgICBuciA9IHRoaXMubnVtYmVyUm93czsKICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMubnVtYmVyQ29sdW1ucyl7CiAgICAgICAgICAgICAgICAgICAgICAgIG5jID0gTWF0aC5jZWlsKHBkLmxlbmd0aC9ucik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2V7CiAgICAgICAgICAgICAgICAgICAgICAgIG5jID0gdGhpcy5udW1iZXJDb2x1bW5zOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMubnVtYmVyQ29sdW1ucykgewogICAgICAgICAgICAgICAgICAgIG5jID0gdGhpcy5udW1iZXJDb2x1bW5zOwogICAgICAgICAgICAgICAgICAgIG5yID0gTWF0aC5jZWlsKHBkLmxlbmd0aC90aGlzLm51bWJlckNvbHVtbnMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgbnIgPSBwZC5sZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgbmMgPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaSwgaiwgdHIsIHRkMSwgdGQyLCBsdCwgcnMsIGNvbG9yOwogICAgICAgICAgICAgICAgdmFyIGlkeCA9IDA7ICAgIAogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaTxucjsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHJldmVyc2UpewogICAgICAgICAgICAgICAgICAgICAgICB0ciA9ICQoJzx0ciBjbGFzcz0ianFwbG90LXRhYmxlLWxlZ2VuZCI+PC90cj4nKS5wcmVwZW5kVG8odGhpcy5fZWxlbSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2V7CiAgICAgICAgICAgICAgICAgICAgICAgIHRyID0gJCgnPHRyIGNsYXNzPSJqcXBsb3QtdGFibGUtbGVnZW5kIj48L3RyPicpLmFwcGVuZFRvKHRoaXMuX2VsZW0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmb3IgKGo9MDsgajxuYzsgaisrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpZHggPCBwZC5sZW5ndGgpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVidWdnZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx0ID0gdGhpcy5sYWJlbHNbaWR4XSB8fCBwZFtpZHhdWzBdLnRvU3RyaW5nKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvciA9IHMuY29sb3I7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJldmVyc2UpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpPjApewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpID09IG5yIC0xKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2V7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcnMgPSAocGFkKSA/IHRoaXMucm93U3BhY2luZyA6ICcwJzsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGQxID0gJCgnPHRkIGNsYXNzPSJqcXBsb3QtdGFibGUtbGVnZW5kIiBzdHlsZT0idGV4dC1hbGlnbjpjZW50ZXI7cGFkZGluZy10b3A6JytycysnOyI+JysKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPGRpdj48ZGl2IGNsYXNzPSJqcXBsb3QtdGFibGUtbGVnZW5kLXN3YXRjaCIgc3R5bGU9ImJvcmRlci1jb2xvcjonK2NvbG9yKyc7Ij48L2Rpdj4nKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8L2Rpdj48L3RkPicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGQyID0gJCgnPHRkIGNsYXNzPSJqcXBsb3QtdGFibGUtbGVnZW5kIiBzdHlsZT0icGFkZGluZy10b3A6JytycysnOyI+PC90ZD4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmVzY2FwZUh0bWwpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRkMi50ZXh0KGx0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRkMi5odG1sKGx0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXZlcnNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGQyLnByZXBlbmRUbyh0cik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGQxLnByZXBlbmRUbyh0cik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZDEuYXBwZW5kVG8odHIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRkMi5hcHBlbmRUbyh0cik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlkeCsrOwogICAgICAgICAgICAgICAgICAgIH0gICAKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5fZWxlbTsgICAgICAgICAgICAgICAgCiAgICB9OwogICAgCiAgICAKICAgIC8vIHNldHVwIGRlZmF1bHQgcmVuZGVyZXJzIGZvciBheGVzIGFuZCBsZWdlbmQgc28gdXNlciBkb2Vzbid0IGhhdmUgdG8KICAgIC8vIGNhbGxlZCB3aXRoIHNjb3BlIG9mIHBsb3QKICAgIGZ1bmN0aW9uIHByZUluaXQodGFyZ2V0LCBkYXRhLCBvcHRpb25zKSB7CiAgICAgICAgLy8gZGVidWdnZXIKICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKICAgICAgICBvcHRpb25zLmF4ZXNEZWZhdWx0cyA9IG9wdGlvbnMuYXhlc0RlZmF1bHRzIHx8IHt9OwogICAgICAgIG9wdGlvbnMubGVnZW5kID0gb3B0aW9ucy5sZWdlbmQgfHwge307CiAgICAgICAgb3B0aW9ucy5zZXJpZXNEZWZhdWx0cyA9IG9wdGlvbnMuc2VyaWVzRGVmYXVsdHMgfHwge307CiAgICAgICAgb3B0aW9ucy5ncmlkID0gb3B0aW9ucy5ncmlkIHx8IHt9OwogICAgICAgICAgIAogICAgICAgIC8vIG9ubHkgc2V0IHRoZXNlIGlmIHRoZXJlIGlzIGEgZ2F1Z2Ugc2VyaWVzCiAgICAgICAgdmFyIHNldG9wdHMgPSBmYWxzZTsKICAgICAgICBpZiAob3B0aW9ucy5zZXJpZXNEZWZhdWx0cy5yZW5kZXJlciA9PSAkLmpxcGxvdC5NZXRlckdhdWdlUmVuZGVyZXIpIHsKICAgICAgICAgICAgc2V0b3B0cyA9IHRydWU7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKG9wdGlvbnMuc2VyaWVzKSB7CiAgICAgICAgICAgIGZvciAodmFyIGk9MDsgaSA8IG9wdGlvbnMuc2VyaWVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5zZXJpZXNbaV0ucmVuZGVyZXIgPT0gJC5qcXBsb3QuTWV0ZXJHYXVnZVJlbmRlcmVyKSB7CiAgICAgICAgICAgICAgICAgICAgc2V0b3B0cyA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYgKHNldG9wdHMpIHsKICAgICAgICAgICAgb3B0aW9ucy5heGVzRGVmYXVsdHMucmVuZGVyZXIgPSAkLmpxcGxvdC5NZXRlckdhdWdlQXhpc1JlbmRlcmVyOwogICAgICAgICAgICBvcHRpb25zLmxlZ2VuZC5yZW5kZXJlciA9ICQuanFwbG90Lk1ldGVyR2F1Z2VMZWdlbmRSZW5kZXJlcjsKICAgICAgICAgICAgb3B0aW9ucy5sZWdlbmQucHJlRHJhdyA9IHRydWU7CiAgICAgICAgICAgIG9wdGlvbnMuZ3JpZC5iYWNrZ3JvdW5kID0gb3B0aW9ucy5ncmlkLmJhY2tncm91bmQgfHwgJ3doaXRlJzsKICAgICAgICAgICAgb3B0aW9ucy5ncmlkLmRyYXdHcmlkbGluZXMgPSBmYWxzZTsKICAgICAgICAgICAgb3B0aW9ucy5ncmlkLmJvcmRlcldpZHRoID0gKG9wdGlvbnMuZ3JpZC5ib3JkZXJXaWR0aCAhPSBudWxsKSA/IG9wdGlvbnMuZ3JpZC5ib3JkZXJXaWR0aCA6IDA7CiAgICAgICAgICAgIG9wdGlvbnMuZ3JpZC5zaGFkb3cgPSAob3B0aW9ucy5ncmlkLnNoYWRvdyAhPSBudWxsKSA/IG9wdGlvbnMuZ3JpZC5zaGFkb3cgOiBmYWxzZTsKICAgICAgICB9CiAgICB9CiAgICAKICAgIC8vIGNhbGxlZCB3aXRoIHNjb3BlIG9mIHBsb3QKICAgIGZ1bmN0aW9uIHBvc3RQYXJzZU9wdGlvbnMob3B0aW9ucykgewogICAgICAgIC8vCiAgICB9CiAgICAKICAgICQuanFwbG90LnByZUluaXRIb29rcy5wdXNoKHByZUluaXQpOwogICAgJC5qcXBsb3QucG9zdFBhcnNlT3B0aW9uc0hvb2tzLnB1c2gocG9zdFBhcnNlT3B0aW9ucyk7CiAgICAKICAgICQuanFwbG90Lk1ldGVyR2F1Z2VUaWNrUmVuZGVyZXIgPSBmdW5jdGlvbigpIHsKICAgICAgICAkLmpxcGxvdC5BeGlzVGlja1JlbmRlcmVyLmNhbGwodGhpcyk7CiAgICB9OwogICAgCiAgICAkLmpxcGxvdC5NZXRlckdhdWdlVGlja1JlbmRlcmVyLnByb3RvdHlwZSA9IG5ldyAkLmpxcGxvdC5BeGlzVGlja1JlbmRlcmVyKCk7CiAgICAkLmpxcGxvdC5NZXRlckdhdWdlVGlja1JlbmRlcmVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9ICQuanFwbG90Lk1ldGVyR2F1Z2VUaWNrUmVuZGVyZXI7CiAgICAKfSkoalF1ZXJ5KTsKICAgIAogICAg]]></data>
	</file>
	<file>
	  <filename>/src/plugins/jqplot.meterGaugeRenderer.min.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqCiAqIGpxUGxvdAogKiBQdXJlIEphdmFTY3JpcHQgcGxvdHRpbmcgcGx1Z2luIHVzaW5nIGpRdWVyeQogKgogKiBWZXJzaW9uOiAxLjAuMGIyX3IxMDEyCiAqCiAqIENvcHlyaWdodCAoYykgMjAwOS0yMDExIENocmlzIExlb25lbGxvCiAqIGpxUGxvdCBpcyBjdXJyZW50bHkgYXZhaWxhYmxlIGZvciB1c2UgaW4gYWxsIHBlcnNvbmFsIG9yIGNvbW1lcmNpYWwgcHJvamVjdHMgCiAqIHVuZGVyIGJvdGggdGhlIE1JVCAoaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHApIGFuZCBHUEwgCiAqIHZlcnNpb24gMi4wIChodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC5odG1sKSBsaWNlbnNlcy4gVGhpcyBtZWFucyB0aGF0IHlvdSBjYW4gCiAqIGNob29zZSB0aGUgbGljZW5zZSB0aGF0IGJlc3Qgc3VpdHMgeW91ciBwcm9qZWN0IGFuZCB1c2UgaXQgYWNjb3JkaW5nbHkuIAogKgogKiBBbHRob3VnaCBub3QgcmVxdWlyZWQsIHRoZSBhdXRob3Igd291bGQgYXBwcmVjaWF0ZSBhbiBlbWFpbCBsZXR0aW5nIGhpbSAKICoga25vdyBvZiBhbnkgc3Vic3RhbnRpYWwgdXNlIG9mIGpxUGxvdC4gIFlvdSBjYW4gcmVhY2ggdGhlIGF1dGhvciBhdDogCiAqIGNocmlzIGF0IGpxcGxvdCBkb3QgY29tIG9yIHNlZSBodHRwOi8vd3d3LmpxcGxvdC5jb20vaW5mby5waHAgLgogKgogKiBJZiB5b3UgYXJlIGZlZWxpbmcga2luZCBhbmQgZ2VuZXJvdXMsIGNvbnNpZGVyIHN1cHBvcnRpbmcgdGhlIHByb2plY3QgYnkKICogbWFraW5nIGEgZG9uYXRpb24gYXQ6IGh0dHA6Ly93d3cuanFwbG90LmNvbS9kb25hdGUucGhwIC4KICoKICogc3ByaW50ZiBmdW5jdGlvbnMgY29udGFpbmVkIGluIGpxcGxvdC5zcHJpbnRmLmpzIGJ5IEFzaCBTZWFybGU6CiAqCiAqICAgICB2ZXJzaW9uIDIwMDcuMDQuMjcKICogICAgIGF1dGhvciBBc2ggU2VhcmxlCiAqICAgICBodHRwOi8vaGV4bWVuLmNvbS9ibG9nLzIwMDcvMDMvcHJpbnRmLXNwcmludGYvCiAqICAgICBodHRwOi8vaGV4bWVuLmNvbS9qcy9zcHJpbnRmLmpzCiAqICAgICBUaGUgYXV0aG9yIChBc2ggU2VhcmxlKSBoYXMgcGxhY2VkIHRoaXMgY29kZSBpbiB0aGUgcHVibGljIGRvbWFpbjoKICogICAgICJUaGlzIGNvZGUgaXMgdW5yZXN0cmljdGVkOiB5b3UgYXJlIGZyZWUgdG8gdXNlIGl0IGhvd2V2ZXIgeW91IGxpa2UuIgogKgogKiBpbmNsdWRlZCBqc0RhdGUgbGlicmFyeSBieSBDaHJpcyBMZW9uZWxsbzoKICoKICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEgQ2hyaXMgTGVvbmVsbG8KICoKICoganNEYXRlIGlzIGN1cnJlbnRseSBhdmFpbGFibGUgZm9yIHVzZSBpbiBhbGwgcGVyc29uYWwgb3IgY29tbWVyY2lhbCBwcm9qZWN0cyAKICogdW5kZXIgYm90aCB0aGUgTUlUIGFuZCBHUEwgdmVyc2lvbiAyLjAgbGljZW5zZXMuIFRoaXMgbWVhbnMgdGhhdCB5b3UgY2FuIAogKiBjaG9vc2UgdGhlIGxpY2Vuc2UgdGhhdCBiZXN0IHN1aXRzIHlvdXIgcHJvamVjdCBhbmQgdXNlIGl0IGFjY29yZGluZ2x5LgogKgogKiBqc0RhdGUgYm9ycm93cyBtYW55IGNvbmNlcHRzIGFuZCBpZGVhcyBmcm9tIHRoZSBEYXRlIEluc3RhbmNlIAogKiBNZXRob2RzIGJ5IEtlbiBTbnlkZXIgYWxvbmcgd2l0aCBzb21lIHBhcnRzIG9mIEtlbidzIGFjdHVhbCBjb2RlLgogKiAKICogS2VuJ3Mgb3JpZ2lhbmwgRGF0ZSBJbnN0YW5jZSBNZXRob2RzIGFuZCBjb3B5cmlnaHQgbm90aWNlOgogKiAKICogS2VuIFNueWRlciAoa2VuIGQgc255ZGVyIGF0IGdtYWlsIGRvdCBjb20pCiAqIDIwMDgtMDktMTAKICogdmVyc2lvbiAyLjAuMiAoaHR0cDovL2tlbmRzbnlkZXIuY29tL3NhbmRib3gvZGF0ZS8pICAgICAKICogQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbiBMaWNlbnNlIDMuMCAoaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnkvMy4wLykKICoKICoganFwbG90VG9JbWFnZSBmdW5jdGlvbiBiYXNlZCBvbiBMYXJyeSBTaWRlbidzIGV4cG9ydC1qcXBsb3QtdG8tcG5nLmpzLgogKiBMYXJyeSBoYXMgZ2VuZXJvdXNseSBnaXZlbiBwZXJtaXNzaW9uIHRvIGFkYXB0IGhpcyBjb2RlIGZvciBpbmNsdXNpb24KICogaW50byBqcVBsb3QuCiAqCiAqIExhcnJ5J3Mgb3JpZ2luYWwgY29kZSBjYW4gYmUgZm91bmQgaGVyZToKICoKICogaHR0cHM6Ly9naXRodWIuY29tL2xzaWRlbi9leHBvcnQtanFwbG90LXRvLXBuZwogKiAKICogCiAqLwooZnVuY3Rpb24oYyl7Yy5qcXBsb3QuTWV0ZXJHYXVnZVJlbmRlcmVyPWZ1bmN0aW9uKCl7Yy5qcXBsb3QuTGluZVJlbmRlcmVyLmNhbGwodGhpcyl9O2MuanFwbG90Lk1ldGVyR2F1Z2VSZW5kZXJlci5wcm90b3R5cGU9bmV3IGMuanFwbG90LkxpbmVSZW5kZXJlcigpO2MuanFwbG90Lk1ldGVyR2F1Z2VSZW5kZXJlci5wcm90b3R5cGUuY29uc3RydWN0b3I9Yy5qcXBsb3QuTWV0ZXJHYXVnZVJlbmRlcmVyO2MuanFwbG90Lk1ldGVyR2F1Z2VSZW5kZXJlci5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbihlKXt0aGlzLmRpYW1ldGVyPW51bGw7dGhpcy5wYWRkaW5nPW51bGw7dGhpcy5zaGFkb3dPZmZzZXQ9Mjt0aGlzLnNoYWRvd0FscGhhPTAuMDc7dGhpcy5zaGFkb3dEZXB0aD00O3RoaXMuYmFja2dyb3VuZD0iI2VmZWZlZiI7dGhpcy5yaW5nQ29sb3I9IiNCQkM2RDAiO3RoaXMubmVlZGxlQ29sb3I9IiNDM0QzRTUiO3RoaXMudGlja0NvbG9yPSI5ODk4OTgiO3RoaXMucmluZ1dpZHRoPW51bGw7dGhpcy5taW47dGhpcy5tYXg7dGhpcy50aWNrcz1bXTt0aGlzLnNob3dUaWNrcz10cnVlO3RoaXMuc2hvd1RpY2tMYWJlbHM9dHJ1ZTt0aGlzLmxhYmVsPW51bGw7dGhpcy5sYWJlbEhlaWdodEFkanVzdD0wO3RoaXMubGFiZWxQb3NpdGlvbj0iaW5zaWRlIjt0aGlzLmludGVydmFscz1bXTt0aGlzLmludGVydmFsQ29sb3JzPVsiIzRiYjJjNSIsIiNFQUEyMjgiLCIjYzViNDdmIiwiIzU3OTU3NSIsIiM4Mzk1NTciLCIjOTU4YzEyIiwiIzk1MzU3OSIsIiM0YjVkZTQiLCIjZDhiODNmIiwiI2ZmNTgwMCIsIiMwMDg1Y2MiLCIjYzc0N2EzIiwiI2NkZGY1NCIsIiNGQkQxNzgiLCIjMjZCNEUzIiwiI2JkNzBjNyJdO3RoaXMuaW50ZXJ2YWxJbm5lclJhZGl1cz1udWxsO3RoaXMuaW50ZXJ2YWxPdXRlclJhZGl1cz1udWxsO3RoaXMudGlja1JlbmRlcmVyPWMuanFwbG90Lk1ldGVyR2F1Z2VUaWNrUmVuZGVyZXI7dGhpcy50aWNrUG9zaXRpb25zPVsxLDIsMi41LDUsMTBdO3RoaXMudGlja1NwYWNpbmc9MzA7dGhpcy5udW1iZXJNaW5vclRpY2tzPW51bGw7dGhpcy5odWJSYWRpdXM9bnVsbDt0aGlzLnRpY2tQYWRkaW5nPW51bGw7dGhpcy5uZWVkbGVUaGlja25lc3M9bnVsbDt0aGlzLm5lZWRsZVBhZD02O3RoaXMucGVnTmVlZGxlPXRydWU7dGhpcy5fdHlwZT0ibWV0ZXJHYXVnZSI7Yy5leHRlbmQodHJ1ZSx0aGlzLGUpO3RoaXMudHlwZT1udWxsO3RoaXMubnVtYmVyVGlja3M9bnVsbDt0aGlzLnRpY2tJbnRlcnZhbD1udWxsO3RoaXMuc3Bhbj0xODA7aWYodGhpcy50eXBlPT0iY2lyY3VsYXIiKXt0aGlzLnNlbWlDaXJjdWxhcj1mYWxzZX1lbHNle2lmKHRoaXMudHlwZSE9ImNpcmN1bGFyIil7dGhpcy5zZW1pQ2lyY3VsYXI9dHJ1ZX1lbHNle3RoaXMuc2VtaUNpcmN1bGFyPSh0aGlzLnNwYW48PTE4MCk/dHJ1ZTpmYWxzZX19dGhpcy5fdGlja1BvaW50cz1bXTt0aGlzLl9sYWJlbEVsZW09bnVsbDt0aGlzLnN0YXJ0QW5nbGU9KDkwKygzNjAtdGhpcy5zcGFuKS8yKSpNYXRoLlBJLzE4MDt0aGlzLmVuZEFuZ2xlPSg5MC0oMzYwLXRoaXMuc3BhbikvMikqTWF0aC5QSS8xODA7dGhpcy5zZXRtaW49ISEodGhpcy5taW49PW51bGwpO3RoaXMuc2V0bWF4PSEhKHRoaXMubWF4PT1udWxsKTtpZih0aGlzLmludGVydmFscy5sZW5ndGgpe2lmKHRoaXMuaW50ZXJ2YWxzWzBdLmxlbmd0aD09bnVsbHx8dGhpcy5pbnRlcnZhbHMubGVuZ3RoPT0xKXtmb3IodmFyIGY9MDtmPHRoaXMuaW50ZXJ2YWxzLmxlbmd0aDtmKyspe3RoaXMuaW50ZXJ2YWxzW2ZdPVt0aGlzLmludGVydmFsc1tmXSx0aGlzLmludGVydmFsc1tmXSx0aGlzLmludGVydmFsQ29sb3JzW2ZdXX19ZWxzZXtpZih0aGlzLmludGVydmFsc1swXS5sZW5ndGg9PTIpe2ZvcihmPTA7Zjx0aGlzLmludGVydmFscy5sZW5ndGg7ZisrKXt0aGlzLmludGVydmFsc1tmXT1bdGhpcy5pbnRlcnZhbHNbZl1bMF0sdGhpcy5pbnRlcnZhbHNbZl1bMV0sdGhpcy5pbnRlcnZhbENvbG9yc1tmXV19fX19aWYodGhpcy50aWNrcy5sZW5ndGgpe2lmKHRoaXMudGlja3NbMF0ubGVuZ3RoPT1udWxsfHx0aGlzLnRpY2tzWzBdLmxlbmd0aD09MSl7Zm9yKHZhciBmPTA7Zjx0aGlzLnRpY2tzLmxlbmd0aDtmKyspe3RoaXMudGlja3NbZl09W3RoaXMudGlja3NbZl0sdGhpcy50aWNrc1tmXV19fXRoaXMubWluPSh0aGlzLm1pbj09bnVsbCk/dGhpcy50aWNrc1swXVswXTp0aGlzLm1pbjt0aGlzLm1heD0odGhpcy5tYXg9PW51bGwpP3RoaXMudGlja3NbdGhpcy50aWNrcy5sZW5ndGgtMV1bMF06dGhpcy5tYXg7dGhpcy5zZXRtaW49ZmFsc2U7dGhpcy5zZXRtYXg9ZmFsc2U7dGhpcy5udW1iZXJUaWNrcz10aGlzLnRpY2tzLmxlbmd0aDt0aGlzLnRpY2tJbnRlcnZhbD10aGlzLnRpY2tzWzFdWzBdLXRoaXMudGlja3NbMF1bMF07dGhpcy50aWNrRmFjdG9yPU1hdGguZmxvb3IocGFyc2VGbG9hdCgoTWF0aC5sb2codGhpcy50aWNrSW50ZXJ2YWwpL01hdGgubG9nKDEwKSkudG9GaXhlZCgxMSkpKTt0aGlzLm51bWJlck1pbm9yVGlja3M9Yih0aGlzLnRpY2tQb3NpdGlvbnMsdGhpcy50aWNrSW50ZXJ2YWwsdGhpcy50aWNrRmFjdG9yKTtpZighdGhpcy5udW1iZXJNaW5vclRpY2tzKXt0aGlzLm51bWJlck1pbm9yVGlja3M9Yih0aGlzLnRpY2tQb3NpdGlvbnMsdGhpcy50aWNrSW50ZXJ2YWwsdGhpcy50aWNrRmFjdG9yLTEpfWlmKCF0aGlzLm51bWJlck1pbm9yVGlja3Mpe3RoaXMubnVtYmVyTWlub3JUaWNrcz0xfX1lbHNle2lmKHRoaXMuaW50ZXJ2YWxzLmxlbmd0aCl7dGhpcy5taW49KHRoaXMubWluPT1udWxsKT8wOnRoaXMubWluO3RoaXMuc2V0bWluPWZhbHNlO2lmKHRoaXMubWF4PT1udWxsKXtpZih0aGlzLmludGVydmFsc1t0aGlzLmludGVydmFscy5sZW5ndGgtMV1bMF0+PXRoaXMuZGF0YVswXVsxXSl7dGhpcy5tYXg9dGhpcy5pbnRlcnZhbHNbdGhpcy5pbnRlcnZhbHMubGVuZ3RoLTFdWzBdO3RoaXMuc2V0bWF4PWZhbHNlfX1lbHNle3RoaXMuc2V0bWF4PWZhbHNlfX1lbHNle3RoaXMubWluPSh0aGlzLm1pbj09bnVsbCk/MDp0aGlzLm1pbjt0aGlzLnNldG1pbj1mYWxzZTtpZih0aGlzLm1heD09bnVsbCl7dGhpcy5tYXg9dGhpcy5kYXRhWzBdWzFdKjEuMjU7dGhpcy5zZXRtYXg9dHJ1ZX1lbHNle3RoaXMuc2V0bWF4PWZhbHNlfX19fTtjLmpxcGxvdC5NZXRlckdhdWdlUmVuZGVyZXIucHJvdG90eXBlLnNldEdyaWREYXRhPWZ1bmN0aW9uKGope3ZhciBmPVtdO3ZhciBrPVtdO3ZhciBlPXRoaXMuc3RhcnRBbmdsZTtmb3IodmFyIGg9MDtoPHRoaXMuZGF0YS5sZW5ndGg7aCsrKXtmLnB1c2godGhpcy5kYXRhW2hdWzFdKTtrLnB1c2goW3RoaXMuZGF0YVtoXVswXV0pO2lmKGg+MCl7ZltoXSs9ZltoLTFdfX12YXIgZz1NYXRoLlBJKjIvZltmLmxlbmd0aC0xXTtmb3IodmFyIGg9MDtoPGYubGVuZ3RoO2grKyl7a1toXVsxXT1mW2hdKmd9dGhpcy5ncmlkRGF0YT1rfTtjLmpxcGxvdC5NZXRlckdhdWdlUmVuZGVyZXIucHJvdG90eXBlLm1ha2VHcmlkRGF0YT1mdW5jdGlvbihqLGspe3ZhciBmPVtdO3ZhciBsPVtdO3ZhciBlPXRoaXMuc3RhcnRBbmdsZTtmb3IodmFyIGg9MDtoPGoubGVuZ3RoO2grKyl7Zi5wdXNoKGpbaF1bMV0pO2wucHVzaChbaltoXVswXV0pO2lmKGg+MCl7ZltoXSs9ZltoLTFdfX12YXIgZz1NYXRoLlBJKjIvZltmLmxlbmd0aC0xXTtmb3IodmFyIGg9MDtoPGYubGVuZ3RoO2grKyl7bFtoXVsxXT1mW2hdKmd9cmV0dXJuIGx9O2Z1bmN0aW9uIGIoaixmLGcpe3ZhciBlO2Zvcih2YXIgaD1qLmxlbmd0aC0xO2g+PTA7aC0tKXtlPWYvKGpbaF0qTWF0aC5wb3coMTAsZykpO2lmKGU9PTR8fGU9PTUpe3JldHVybiBlLTF9fXJldHVybiBudWxsfWMuanFwbG90Lk1ldGVyR2F1Z2VSZW5kZXJlci5wcm90b3R5cGUuZHJhdz1mdW5jdGlvbihYLGFDLGFwKXt2YXIgYWE7dmFyIGFNPShhcCE9dW5kZWZpbmVkKT9hcDp7fTt2YXIgYWk9MDt2YXIgYWg9MDt2YXIgYXQ9MTtpZihhcC5sZWdlbmRJbmZvJiZhcC5sZWdlbmRJbmZvLnBsYWNlbWVudD09Imluc2lkZSIpe3ZhciBhST1hcC5sZWdlbmRJbmZvO3N3aXRjaChhSS5sb2NhdGlvbil7Y2FzZSJudyI6YWk9YUkud2lkdGgrYUkueG9mZnNldDticmVhaztjYXNlInciOmFpPWFJLndpZHRoK2FJLnhvZmZzZXQ7YnJlYWs7Y2FzZSJzdyI6YWk9YUkud2lkdGgrYUkueG9mZnNldDticmVhaztjYXNlIm5lIjphaT1hSS53aWR0aCthSS54b2Zmc2V0O2F0PS0xO2JyZWFrO2Nhc2UiZSI6YWk9YUkud2lkdGgrYUkueG9mZnNldDthdD0tMTticmVhaztjYXNlInNlIjphaT1hSS53aWR0aCthSS54b2Zmc2V0O2F0PS0xO2JyZWFrO2Nhc2UibiI6YWg9YUkuaGVpZ2h0K2FJLnlvZmZzZXQ7YnJlYWs7Y2FzZSJzIjphaD1hSS5oZWlnaHQrYUkueW9mZnNldDthdD0tMTticmVhaztkZWZhdWx0OmJyZWFrfX1pZih0aGlzLmxhYmVsKXt0aGlzLl9sYWJlbEVsZW09YygnPGRpdiBjbGFzcz0ianFwbG90LW1ldGVyR2F1Z2UtbGFiZWwiIHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTsiPicrdGhpcy5sYWJlbCsiPC9kaXY+Iik7dGhpcy5jYW52YXMuX2VsZW0uYWZ0ZXIodGhpcy5fbGFiZWxFbGVtKX12YXIgbT0oYU0uc2hhZG93IT11bmRlZmluZWQpP2FNLnNoYWRvdzp0aGlzLnNoYWRvdzt2YXIgTj0oYU0uc2hvd0xpbmUhPXVuZGVmaW5lZCk/YU0uc2hvd0xpbmU6dGhpcy5zaG93TGluZTt2YXIgST0oYU0uZmlsbCE9dW5kZWZpbmVkKT9hTS5maWxsOnRoaXMuZmlsbDt2YXIgSz1YLmNhbnZhcy53aWR0aDt2YXIgUz1YLmNhbnZhcy5oZWlnaHQ7aWYodGhpcy5wYWRkaW5nPT1udWxsKXt0aGlzLnBhZGRpbmc9TWF0aC5yb3VuZChNYXRoLm1pbihLLFMpLzMwKX12YXIgUT1LLWFpLTIqdGhpcy5wYWRkaW5nO3ZhciBhYj1TLWFoLTIqdGhpcy5wYWRkaW5nO2lmKHRoaXMubGFiZWxQb3NpdGlvbj09ImJvdHRvbSImJnRoaXMubGFiZWwpe2FiLT10aGlzLl9sYWJlbEVsZW0ub3V0ZXJIZWlnaHQodHJ1ZSl9dmFyIEw9TWF0aC5taW4oUSxhYik7dmFyIGFkPUw7aWYoIXRoaXMuZGlhbWV0ZXIpe2lmKHRoaXMuc2VtaUNpcmN1bGFyKXtpZihRPj0yKmFiKXtpZighdGhpcy5yaW5nV2lkdGgpe3RoaXMucmluZ1dpZHRoPTIqYWIvMzV9dGhpcy5uZWVkbGVUaGlja25lc3M9dGhpcy5uZWVkbGVUaGlja25lc3N8fDIrTWF0aC5wb3codGhpcy5yaW5nV2lkdGgsMC44KTt0aGlzLmlubmVyUGFkPXRoaXMucmluZ1dpZHRoLzIrdGhpcy5uZWVkbGVUaGlja25lc3MvMit0aGlzLm5lZWRsZVBhZDt0aGlzLmRpYW1ldGVyPTIqKGFiLTIqdGhpcy5pbm5lclBhZCl9ZWxzZXtpZighdGhpcy5yaW5nV2lkdGgpe3RoaXMucmluZ1dpZHRoPVEvMzV9dGhpcy5uZWVkbGVUaGlja25lc3M9dGhpcy5uZWVkbGVUaGlja25lc3N8fDIrTWF0aC5wb3codGhpcy5yaW5nV2lkdGgsMC44KTt0aGlzLmlubmVyUGFkPXRoaXMucmluZ1dpZHRoLzIrdGhpcy5uZWVkbGVUaGlja25lc3MvMit0aGlzLm5lZWRsZVBhZDt0aGlzLmRpYW1ldGVyPVEtMip0aGlzLmlubmVyUGFkLXRoaXMucmluZ1dpZHRoLXRoaXMucGFkZGluZ310aGlzLl9jZW50ZXI9WyhLLWF0KmFpKS8yK2F0KmFpLChTK2F0KmFoLXRoaXMucGFkZGluZy10aGlzLnJpbmdXaWR0aC10aGlzLmlubmVyUGFkKV19ZWxzZXtpZighdGhpcy5yaW5nV2lkdGgpe3RoaXMucmluZ1dpZHRoPWFkLzM1fXRoaXMubmVlZGxlVGhpY2tuZXNzPXRoaXMubmVlZGxlVGhpY2tuZXNzfHwyK01hdGgucG93KHRoaXMucmluZ1dpZHRoLDAuOCk7dGhpcy5pbm5lclBhZD0wO3RoaXMuZGlhbWV0ZXI9YWQtdGhpcy5yaW5nV2lkdGg7dGhpcy5fY2VudGVyPVsoSy1hdCphaSkvMithdCphaSwoUy1hdCphaCkvMithdCphaF19fWlmKHRoaXMuX2xhYmVsRWxlbSYmdGhpcy5sYWJlbFBvc2l0aW9uPT0iYm90dG9tIil7dGhpcy5fY2VudGVyWzFdLT10aGlzLl9sYWJlbEVsZW0ub3V0ZXJIZWlnaHQodHJ1ZSl9dGhpcy5fcmFkaXVzPXRoaXMuZGlhbWV0ZXIvMjt0aGlzLnRpY2tTcGFjaW5nPTYwMDAvdGhpcy5kaWFtZXRlcjtpZighdGhpcy5odWJSYWRpdXMpe3RoaXMuaHViUmFkaXVzPXRoaXMuZGlhbWV0ZXIvMTh9dGhpcy5zaGFkb3dPZmZzZXQ9MC41K3RoaXMucmluZ1dpZHRoLzk7dGhpcy5zaGFkb3dXaWR0aD10aGlzLnJpbmdXaWR0aCoxO3RoaXMudGlja1BhZGRpbmc9MytNYXRoLnBvdyh0aGlzLmRpYW1ldGVyLzIwLDAuNyk7dGhpcy50aWNrT3V0ZXJSYWRpdXM9dGhpcy5fcmFkaXVzLXRoaXMucmluZ1dpZHRoLzItdGhpcy50aWNrUGFkZGluZzt0aGlzLnRpY2tMZW5ndGg9KHRoaXMuc2hvd1RpY2tzKT90aGlzLl9yYWRpdXMvMTM6MDtpZih0aGlzLnRpY2tzLmxlbmd0aD09MCl7dmFyIEE9dGhpcy5tYXgsYUw9dGhpcy5taW4scT10aGlzLnNldG1heCxhRz10aGlzLnNldG1pbixhdT0oQS1hTCkqdGhpcy50aWNrU3BhY2luZy90aGlzLnNwYW47dmFyIGF3PU1hdGguZmxvb3IocGFyc2VGbG9hdCgoTWF0aC5sb2coYXUpL01hdGgubG9nKDEwKSkudG9GaXhlZCgxMSkpKTt2YXIgYW49KGF1L01hdGgucG93KDEwLGF3KSk7KGFuPjImJmFuPD0yLjUpP2FuPTIuNTphbj1NYXRoLmNlaWwoYW4pO3ZhciBUPXRoaXMudGlja1Bvc2l0aW9uczt2YXIgYUEsYWs7Zm9yKGFhPTA7YWE8VC5sZW5ndGg7YWErKyl7aWYoYW49PVRbYWFdfHxhYSYmVFthYS0xXTxhbiYmYW48VFthYV0pe2F1PVRbYWFdKk1hdGgucG93KDEwLGF3KTthQT1hYX19Zm9yKGFhPTA7YWE8VC5sZW5ndGg7YWErKyl7aWYoYW49PVRbYWFdfHxhYSYmVFthYS0xXTxhbiYmYW48VFthYV0pe2F1PVRbYWFdKk1hdGgucG93KDEwLGF3KTthaz1NYXRoLmNlaWwoKEEtYUwpL2F1KX19aWYocSYmYUcpe3ZhciBhUD0oYUw+MCk/YUwtYUwlYXU6YUwtYUwlYXUtYXU7aWYoIXRoaXMuZm9yY2VaZXJvKXt2YXIgRD1NYXRoLm1pbihhTC1hUCwwLjgqYXUpO3ZhciBvPU1hdGguZmxvb3IoRC9UW2FBXSk7aWYobz4xKXthUD1hUCtUW2FBXSooby0xKTtpZihwYXJzZUludChhUCwxMCkhPWFQJiZwYXJzZUludChhUC1UW2FBXSwxMCk9PWFQLVRbYUFdKXthUD1hUC1UW2FBXX19fWlmKGFMPT1hUCl7YUwtPWF1fWVsc2V7aWYoYUwtYVA+MC4yMyphdSl7YUw9YVB9ZWxzZXthTD1hUC1hdTthays9MX19YWsrPTE7dmFyIEU9YUwrKGFrLTEpKmF1O2lmKEE+PUUpe0UrPWF1O2FrKz0xfWlmKEUtQTwwLjIzKmF1KXtFKz1hdTthays9MX10aGlzLm1heD1BPUU7dGhpcy5taW49YUw7dGhpcy50aWNrSW50ZXJ2YWw9YXU7dGhpcy5udW1iZXJUaWNrcz1hazt2YXIgTztmb3IoYWE9MDthYTxhazthYSsrKXtPPXBhcnNlRmxvYXQoKGFMK2FhKmF1KS50b0ZpeGVkKDExKSk7dGhpcy50aWNrcy5wdXNoKFtPLE9dKX10aGlzLm1heD10aGlzLnRpY2tzW2FrLTFdWzFdO3RoaXMudGlja0ZhY3Rvcj1hdzt0aGlzLm51bWJlck1pbm9yVGlja3M9Yih0aGlzLnRpY2tQb3NpdGlvbnMsdGhpcy50aWNrSW50ZXJ2YWwsdGhpcy50aWNrRmFjdG9yKTtpZighdGhpcy5udW1iZXJNaW5vclRpY2tzKXt0aGlzLm51bWJlck1pbm9yVGlja3M9Yih0aGlzLnRpY2tQb3NpdGlvbnMsdGhpcy50aWNrSW50ZXJ2YWwsdGhpcy50aWNrRmFjdG9yLTEpfX1lbHNle2lmKHEpe3ZhciBFPWFMKyhhay0xKSphdTtpZihBPj1FKXtBPUUrYXU7YWsrPTF9ZWxzZXtBPUV9dGhpcy50aWNrSW50ZXJ2YWw9dGhpcy50aWNrSW50ZXJ2YWx8fGF1O3RoaXMubnVtYmVyVGlja3M9dGhpcy5udW1iZXJUaWNrc3x8YWs7dmFyIE87Zm9yKGFhPTA7YWE8dGhpcy5udW1iZXJUaWNrczthYSsrKXtPPXBhcnNlRmxvYXQoKGFMK2FhKnRoaXMudGlja0ludGVydmFsKS50b0ZpeGVkKDExKSk7dGhpcy50aWNrcy5wdXNoKFtPLE9dKX10aGlzLm1heD10aGlzLnRpY2tzW3RoaXMubnVtYmVyVGlja3MtMV1bMV07dGhpcy50aWNrRmFjdG9yPWF3O3RoaXMubnVtYmVyTWlub3JUaWNrcz1iKHRoaXMudGlja1Bvc2l0aW9ucyx0aGlzLnRpY2tJbnRlcnZhbCx0aGlzLnRpY2tGYWN0b3IpO2lmKCF0aGlzLm51bWJlck1pbm9yVGlja3Mpe3RoaXMubnVtYmVyTWlub3JUaWNrcz1iKHRoaXMudGlja1Bvc2l0aW9ucyx0aGlzLnRpY2tJbnRlcnZhbCx0aGlzLnRpY2tGYWN0b3ItMSl9fX1pZighcSYmIWFHKXt2YXIgUD10aGlzLm1heC10aGlzLm1pbjthdz1NYXRoLmZsb29yKHBhcnNlRmxvYXQoKE1hdGgubG9nKFApL01hdGgubG9nKDEwKSkudG9GaXhlZCgxMSkpKS0xO3ZhciBhTj1bNSw2LDQsNywzLDgsOSwxMCwyXSxWLEMsYXY9MCxNO2lmKFA+MSl7dmFyIGFKPVN0cmluZyhQKTtpZihhSi5zZWFyY2goL1wuLyk9PS0xKXt2YXIgYUY9YUouc2VhcmNoKC8wKyQvKTthdj0oYUY+MCk/YUoubGVuZ3RoLWFGLTE6MH19TT1QL01hdGgucG93KDEwLGF2KTtmb3IoYWE9MDthYTxhTi5sZW5ndGg7YWErKyl7Vj1NLyhhTlthYV0tMSk7aWYoVj09cGFyc2VJbnQoViwxMCkpe3RoaXMubnVtYmVyVGlja3M9YU5bYWFdO3RoaXMudGlja0ludGVydmFsPVAvKHRoaXMubnVtYmVyVGlja3MtMSk7dGhpcy50aWNrRmFjdG9yPWF3KzE7YnJlYWt9fXZhciBPO2ZvcihhYT0wO2FhPHRoaXMubnVtYmVyVGlja3M7YWErKyl7Tz1wYXJzZUZsb2F0KCh0aGlzLm1pbithYSp0aGlzLnRpY2tJbnRlcnZhbCkudG9GaXhlZCgxMSkpO3RoaXMudGlja3MucHVzaChbTyxPXSl9dGhpcy5udW1iZXJNaW5vclRpY2tzPWIodGhpcy50aWNrUG9zaXRpb25zLHRoaXMudGlja0ludGVydmFsLHRoaXMudGlja0ZhY3Rvcik7aWYoIXRoaXMubnVtYmVyTWlub3JUaWNrcyl7dGhpcy5udW1iZXJNaW5vclRpY2tzPWIodGhpcy50aWNrUG9zaXRpb25zLHRoaXMudGlja0ludGVydmFsLHRoaXMudGlja0ZhY3Rvci0xKX1pZighdGhpcy5udW1iZXJNaW5vclRpY2tzKXt0aGlzLm51bWJlck1pbm9yVGlja3M9MTt2YXIgYUg9WzQsNSwzLDYsMl07Zm9yKGFhPTA7YWE8NTthYSsrKXt2YXIgYW89dGhpcy50aWNrSW50ZXJ2YWwvYUhbYWFdO2lmKGFvPT1wYXJzZUludChhbywxMCkpe3RoaXMubnVtYmVyTWlub3JUaWNrcz1hSFthYV0tMTticmVha319fX19dmFyIFU9dGhpcy5fcmFkaXVzLGFFPXRoaXMuc3RhcnRBbmdsZSxrPXRoaXMuZW5kQW5nbGUsSD1NYXRoLlBJLGU9TWF0aC5QSS8yO2lmKHRoaXMuc2VtaUNpcmN1bGFyKXt2YXIgej1NYXRoLmF0YW4odGhpcy5pbm5lclBhZC9VKSxhYz10aGlzLm91dGVyU3RhcnRBbmdsZT1hRS16LGFCPXRoaXMub3V0ZXJFbmRBbmdsZT1rK3osQj10aGlzLmh1YlN0YXJ0QW5nbGU9YUUtTWF0aC5hdGFuKHRoaXMuaW5uZXJQYWQvdGhpcy5odWJSYWRpdXMqMiksYWY9dGhpcy5odWJFbmRBbmdsZT1rK01hdGguYXRhbih0aGlzLmlubmVyUGFkL3RoaXMuaHViUmFkaXVzKjIpO1guc2F2ZSgpO1gudHJhbnNsYXRlKHRoaXMuX2NlbnRlclswXSx0aGlzLl9jZW50ZXJbMV0pO1gubGluZUpvaW49InJvdW5kIjtYLmxpbmVDYXA9InJvdW5kIjtYLnNhdmUoKTtYLmJlZ2luUGF0aCgpO1guZmlsbFN0eWxlPXRoaXMuYmFja2dyb3VuZDtYLmFyYygwLDAsVSxhYyxhQixmYWxzZSk7WC5jbG9zZVBhdGgoKTtYLmZpbGwoKTtYLnJlc3RvcmUoKTt2YXIgYWo9InJnYmEoMCwwLDAsIit0aGlzLnNoYWRvd0FscGhhKyIpIjtYLnNhdmUoKTtmb3IodmFyIGFhPTA7YWE8dGhpcy5zaGFkb3dEZXB0aDthYSsrKXtYLnRyYW5zbGF0ZSh0aGlzLnNoYWRvd09mZnNldCpNYXRoLmNvcyh0aGlzLnNoYWRvd0FuZ2xlLzE4MCpNYXRoLlBJKSx0aGlzLnNoYWRvd09mZnNldCpNYXRoLnNpbih0aGlzLnNoYWRvd0FuZ2xlLzE4MCpNYXRoLlBJKSk7WC5iZWdpblBhdGgoKTtYLnN0cm9rZVN0eWxlPWFqO1gubGluZVdpZHRoPXRoaXMuc2hhZG93V2lkdGg7WC5hcmMoMCwwLFUsYWMsYUIsZmFsc2UpO1guY2xvc2VQYXRoKCk7WC5zdHJva2UoKX1YLnJlc3RvcmUoKTtYLnNhdmUoKTt2YXIgYXo9cGFyc2VJbnQoKHRoaXMuc2hhZG93RGVwdGgrMSkvMiwxMCk7Zm9yKHZhciBhYT0wO2FhPGF6O2FhKyspe1gudHJhbnNsYXRlKHRoaXMuc2hhZG93T2Zmc2V0Kk1hdGguY29zKHRoaXMuc2hhZG93QW5nbGUvMTgwKk1hdGguUEkpLHRoaXMuc2hhZG93T2Zmc2V0Kk1hdGguc2luKHRoaXMuc2hhZG93QW5nbGUvMTgwKk1hdGguUEkpKTtYLmJlZ2luUGF0aCgpO1guZmlsbFN0eWxlPWFqO1guYXJjKDAsMCx0aGlzLmh1YlJhZGl1cyxCLGFmLGZhbHNlKTtYLmNsb3NlUGF0aCgpO1guZmlsbCgpfVgucmVzdG9yZSgpO1guc2F2ZSgpO1guYmVnaW5QYXRoKCk7WC5zdHJva2VTdHlsZT10aGlzLnJpbmdDb2xvcjtYLmxpbmVXaWR0aD10aGlzLnJpbmdXaWR0aDtYLmFyYygwLDAsVSxhYyxhQixmYWxzZSk7WC5jbG9zZVBhdGgoKTtYLnN0cm9rZSgpO1gucmVzdG9yZSgpO1guc2F2ZSgpO1guYmVnaW5QYXRoKCk7WC5maWxsU3R5bGU9dGhpcy5yaW5nQ29sb3I7WC5hcmMoMCwwLHRoaXMuaHViUmFkaXVzLEIsYWYsZmFsc2UpO1guY2xvc2VQYXRoKCk7WC5maWxsKCk7WC5yZXN0b3JlKCk7aWYodGhpcy5zaG93VGlja3Mpe1guc2F2ZSgpO3ZhciBmPXRoaXMudGlja091dGVyUmFkaXVzLGFxPXRoaXMudGlja0xlbmd0aCx2PWFxLzIsRj10aGlzLm51bWJlck1pbm9yVGlja3MsYW09dGhpcy5zcGFuKk1hdGguUEkvMTgwLyh0aGlzLnRpY2tzLmxlbmd0aC0xKSxwPWFtLyhGKzEpO2ZvcihhYT0wO2FhPHRoaXMudGlja3MubGVuZ3RoO2FhKyspe1guYmVnaW5QYXRoKCk7WC5saW5lV2lkdGg9MS41K3RoaXMuZGlhbWV0ZXIvMzYwO1guc3Ryb2tlU3R5bGU9dGhpcy5yaW5nQ29sb3I7dmFyIGFlPWFtKmFhK2FFO1gubW92ZVRvKC1mKk1hdGguY29zKGFtKmFhK2FFKSxmKk1hdGguc2luKGFtKmFhK2FFKSk7WC5saW5lVG8oLShmLWFxKSpNYXRoLmNvcyhhbSphYSthRSksKGYtYXEpKk1hdGguc2luKGFtKmFhK2FFKSk7dGhpcy5fdGlja1BvaW50cy5wdXNoKFsoZi1hcSkqTWF0aC5jb3MoYW0qYWErYUUpK3RoaXMuX2NlbnRlclswXSt0aGlzLmNhbnZhcy5fb2Zmc2V0cy5sZWZ0LChmLWFxKSpNYXRoLnNpbihhbSphYSthRSkrdGhpcy5fY2VudGVyWzFdK3RoaXMuY2FudmFzLl9vZmZzZXRzLnRvcCxhbSphYSthRV0pO1guc3Ryb2tlKCk7WC5saW5lV2lkdGg9MSt0aGlzLmRpYW1ldGVyLzQ0MDtpZihhYTx0aGlzLnRpY2tzLmxlbmd0aC0xKXtmb3IodmFyIFk9MTtZPD1GO1krKyl7WC5iZWdpblBhdGgoKTtYLm1vdmVUbygtZipNYXRoLmNvcyhhbSphYStwKlkrYUUpLGYqTWF0aC5zaW4oYW0qYWErcCpZK2FFKSk7WC5saW5lVG8oLShmLXYpKk1hdGguY29zKGFtKmFhK3AqWSthRSksKGYtdikqTWF0aC5zaW4oYW0qYWErcCpZK2FFKSk7WC5zdHJva2UoKX19fVgucmVzdG9yZSgpfWlmKHRoaXMuc2hvd1RpY2tMYWJlbHMpe3ZhciBKLFcsVCxhTyxnLEcsbj0wO3ZhciBhbj10aGlzLnRpY2tQYWRkaW5nKigxLTEvKHRoaXMuZGlhbWV0ZXIvODArMSkpO2ZvcihhYT0wO2FhPHRoaXMudGlja3MubGVuZ3RoO2FhKyspe0o9YygnPGRpdiBjbGFzcz0ianFwbG90LW1ldGVyR2F1Z2UtdGljayIgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlOyI+Jyt0aGlzLnRpY2tzW2FhXVsxXSsiPC9kaXY+Iik7dGhpcy5jYW52YXMuX2VsZW0uYWZ0ZXIoSik7YU89Si5vdXRlcldpZHRoKHRydWUpO2c9Si5vdXRlckhlaWdodCh0cnVlKTtXPXRoaXMuX3RpY2tQb2ludHNbYWFdWzBdLWFPKih0aGlzLl90aWNrUG9pbnRzW2FhXVsyXS1NYXRoLlBJKS9NYXRoLlBJLWFuKk1hdGguY29zKHRoaXMuX3RpY2tQb2ludHNbYWFdWzJdKTtUPXRoaXMuX3RpY2tQb2ludHNbYWFdWzFdLWcvMitnLzIqTWF0aC5wb3coTWF0aC5hYnMoKE1hdGguc2luKHRoaXMuX3RpY2tQb2ludHNbYWFdWzJdKSkpLDAuNSkrYW4vMypNYXRoLnBvdyhNYXRoLmFicygoTWF0aC5zaW4odGhpcy5fdGlja1BvaW50c1thYV1bMl0pKSksMC41KTtKLmNzcyh7bGVmdDpXLHRvcDpUfSk7Rz1hTypNYXRoLmNvcyh0aGlzLl90aWNrUG9pbnRzW2FhXVsyXSkrZypNYXRoLnNpbihNYXRoLlBJLzIrdGhpcy5fdGlja1BvaW50c1thYV1bMl0vMik7bj0oRz5uKT9HOm59fWlmKHRoaXMubGFiZWwmJnRoaXMubGFiZWxQb3NpdGlvbj09Imluc2lkZSIpe3ZhciBXPXRoaXMuX2NlbnRlclswXSt0aGlzLmNhbnZhcy5fb2Zmc2V0cy5sZWZ0O3ZhciBhbj10aGlzLnRpY2tQYWRkaW5nKigxLTEvKHRoaXMuZGlhbWV0ZXIvODArMSkpO3ZhciBUPTAuNSoodGhpcy5fY2VudGVyWzFdK3RoaXMuY2FudmFzLl9vZmZzZXRzLnRvcC10aGlzLmh1YlJhZGl1cykrMC41Kih0aGlzLl9jZW50ZXJbMV0rdGhpcy5jYW52YXMuX29mZnNldHMudG9wLXRoaXMudGlja091dGVyUmFkaXVzK3RoaXMudGlja0xlbmd0aCthbikrdGhpcy5sYWJlbEhlaWdodEFkanVzdDtXLT10aGlzLl9sYWJlbEVsZW0ub3V0ZXJXaWR0aCh0cnVlKS8yO1QtPXRoaXMuX2xhYmVsRWxlbS5vdXRlckhlaWdodCh0cnVlKS8yO3RoaXMuX2xhYmVsRWxlbS5jc3Moe2xlZnQ6Vyx0b3A6VH0pfWVsc2V7aWYodGhpcy5sYWJlbCYmdGhpcy5sYWJlbFBvc2l0aW9uPT0iYm90dG9tIil7dmFyIFc9dGhpcy5fY2VudGVyWzBdK3RoaXMuY2FudmFzLl9vZmZzZXRzLmxlZnQtdGhpcy5fbGFiZWxFbGVtLm91dGVyV2lkdGgodHJ1ZSkvMjt2YXIgVD10aGlzLl9jZW50ZXJbMV0rdGhpcy5jYW52YXMuX29mZnNldHMudG9wK3RoaXMuaW5uZXJQYWQrICt0aGlzLnJpbmdXaWR0aCt0aGlzLnBhZGRpbmcrdGhpcy5sYWJlbEhlaWdodEFkanVzdDt0aGlzLl9sYWJlbEVsZW0uY3NzKHtsZWZ0OlcsdG9wOlR9KX19WC5zYXZlKCk7dmFyIGF4PXRoaXMuaW50ZXJ2YWxJbm5lclJhZGl1c3x8dGhpcy5odWJSYWRpdXMqMS41O2lmKHRoaXMuaW50ZXJ2YWxPdXRlclJhZGl1cz09bnVsbCl7aWYodGhpcy5zaG93VGlja0xhYmVscyl7dmFyIGFnPSh0aGlzLnRpY2tPdXRlclJhZGl1cy10aGlzLnRpY2tMZW5ndGgtdGhpcy50aWNrUGFkZGluZy10aGlzLmRpYW1ldGVyLzgpfWVsc2V7dmFyIGFnPSh0aGlzLnRpY2tPdXRlclJhZGl1cy10aGlzLnRpY2tMZW5ndGgtdGhpcy5kaWFtZXRlci8xNil9fWVsc2V7dmFyIGFnPXRoaXMuaW50ZXJ2YWxPdXRlclJhZGl1c312YXIgUD10aGlzLm1heC10aGlzLm1pbjt2YXIgYUQ9dGhpcy5pbnRlcnZhbHNbdGhpcy5pbnRlcnZhbHMubGVuZ3RoLTFdLXRoaXMubWluO3ZhciB5LFosdT10aGlzLnNwYW4qTWF0aC5QSS8xODA7Zm9yKGFhPTA7YWE8dGhpcy5pbnRlcnZhbHMubGVuZ3RoO2FhKyspe3k9KGFhPT0wKT9hRTphRSsodGhpcy5pbnRlcnZhbHNbYWEtMV1bMF0tdGhpcy5taW4pKnUvUDtpZih5PDApe3k9MH1aPWFFKyh0aGlzLmludGVydmFsc1thYV1bMF0tdGhpcy5taW4pKnUvUDtpZihaPDApe1o9MH1YLmJlZ2luUGF0aCgpO1guZmlsbFN0eWxlPXRoaXMuaW50ZXJ2YWxzW2FhXVsyXTtYLmFyYygwLDAsYXgseSxaLGZhbHNlKTtYLmxpbmVUbyhhZypNYXRoLmNvcyhaKSxhZypNYXRoLnNpbihaKSk7WC5hcmMoMCwwLGFnLFoseSx0cnVlKTtYLmxpbmVUbyhheCpNYXRoLmNvcyh5KSxheCpNYXRoLnNpbih5KSk7WC5jbG9zZVBhdGgoKTtYLmZpbGwoKX1YLnJlc3RvcmUoKTt2YXIgYXk9dGhpcy5kYXRhWzBdWzFdO3ZhciBSPXRoaXMubWF4LXRoaXMubWluO2lmKHRoaXMucGVnTmVlZGxlKXtpZih0aGlzLmRhdGFbMF1bMV0+dGhpcy5tYXgrUiozL3RoaXMuc3Bhbil7YXk9dGhpcy5tYXgrUiozL3RoaXMuc3Bhbn1pZih0aGlzLmRhdGFbMF1bMV08dGhpcy5taW4tUiozL3RoaXMuc3Bhbil7YXk9dGhpcy5taW4tUiozL3RoaXMuc3Bhbn19dmFyIGFsPShheS10aGlzLm1pbikvUip0aGlzLnNwYW4qTWF0aC5QSS8xODArdGhpcy5zdGFydEFuZ2xlO1guc2F2ZSgpO1guYmVnaW5QYXRoKCk7WC5maWxsU3R5bGU9dGhpcy5yaW5nQ29sb3I7WC5zdHJva2VTdHlsZT10aGlzLnJpbmdDb2xvcjt0aGlzLm5lZWRsZUxlbmd0aD0odGhpcy50aWNrT3V0ZXJSYWRpdXMtdGhpcy50aWNrTGVuZ3RoKSowLjg1O3RoaXMubmVlZGxlVGhpY2tuZXNzPSh0aGlzLm5lZWRsZVRoaWNrbmVzczwyKT8yOnRoaXMubmVlZGxlVGhpY2tuZXNzO3ZhciBhSz10aGlzLm5lZWRsZVRoaWNrbmVzcyowLjQ7dmFyIHg9dGhpcy5uZWVkbGVMZW5ndGgvMTA7dmFyIHM9KHRoaXMubmVlZGxlVGhpY2tuZXNzLWFLKS8xMDt2YXIgYXI7Zm9yKHZhciBhYT0wO2FhPDEwO2FhKyspe2FyPXRoaXMubmVlZGxlVGhpY2tuZXNzLWFhKnM7WC5tb3ZlVG8oeCphYSpNYXRoLmNvcyhhbCkseCphYSpNYXRoLnNpbihhbCkpO1gubGluZVdpZHRoPWFyO1gubGluZVRvKHgqKGFhKzEpKk1hdGguY29zKGFsKSx4KihhYSsxKSpNYXRoLnNpbihhbCkpO1guc3Ryb2tlKCl9WC5yZXN0b3JlKCl9ZWxzZXt0aGlzLl9jZW50ZXI9WyhLLWF0KmFpKS8yK2F0KmFpLChTLWF0KmFoKS8yK2F0KmFoXX19O2MuanFwbG90Lk1ldGVyR2F1Z2VBeGlzUmVuZGVyZXI9ZnVuY3Rpb24oKXtjLmpxcGxvdC5MaW5lYXJBeGlzUmVuZGVyZXIuY2FsbCh0aGlzKX07Yy5qcXBsb3QuTWV0ZXJHYXVnZUF4aXNSZW5kZXJlci5wcm90b3R5cGU9bmV3IGMuanFwbG90LkxpbmVhckF4aXNSZW5kZXJlcigpO2MuanFwbG90Lk1ldGVyR2F1Z2VBeGlzUmVuZGVyZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yPWMuanFwbG90Lk1ldGVyR2F1Z2VBeGlzUmVuZGVyZXI7Yy5qcXBsb3QuTWV0ZXJHYXVnZUF4aXNSZW5kZXJlci5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbihlKXt0aGlzLnRpY2tSZW5kZXJlcj1jLmpxcGxvdC5NZXRlckdhdWdlVGlja1JlbmRlcmVyO2MuZXh0ZW5kKHRydWUsdGhpcyxlKTt0aGlzLl9kYXRhQm91bmRzPXttaW46MCxtYXg6MTAwfTt0aGlzLm1pbj0wO3RoaXMubWF4PTEwMDt0aGlzLnNob3dUaWNrcz1mYWxzZTt0aGlzLnRpY2tzPVtdO3RoaXMuc2hvd01hcms9ZmFsc2U7dGhpcy5zaG93PWZhbHNlfTtjLmpxcGxvdC5NZXRlckdhdWdlTGVnZW5kUmVuZGVyZXI9ZnVuY3Rpb24oKXtjLmpxcGxvdC5UYWJsZUxlZ2VuZFJlbmRlcmVyLmNhbGwodGhpcyl9O2MuanFwbG90Lk1ldGVyR2F1Z2VMZWdlbmRSZW5kZXJlci5wcm90b3R5cGU9bmV3IGMuanFwbG90LlRhYmxlTGVnZW5kUmVuZGVyZXIoKTtjLmpxcGxvdC5NZXRlckdhdWdlTGVnZW5kUmVuZGVyZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yPWMuanFwbG90Lk1ldGVyR2F1Z2VMZWdlbmRSZW5kZXJlcjtjLmpxcGxvdC5NZXRlckdhdWdlTGVnZW5kUmVuZGVyZXIucHJvdG90eXBlLmluaXQ9ZnVuY3Rpb24oZSl7dGhpcy5udW1iZXJSb3dzPW51bGw7dGhpcy5udW1iZXJDb2x1bW5zPW51bGw7Yy5leHRlbmQodHJ1ZSx0aGlzLGUpfTtjLmpxcGxvdC5NZXRlckdhdWdlTGVnZW5kUmVuZGVyZXIucHJvdG90eXBlLmRyYXc9ZnVuY3Rpb24oKXtpZih0aGlzLnNob3cpe3ZhciBwPXRoaXMuX3Nlcmllczt2YXIgeD0icG9zaXRpb246YWJzb2x1dGU7Ijt4Kz0odGhpcy5iYWNrZ3JvdW5kKT8iYmFja2dyb3VuZDoiK3RoaXMuYmFja2dyb3VuZCsiOyI6IiI7eCs9KHRoaXMuYm9yZGVyKT8iYm9yZGVyOiIrdGhpcy5ib3JkZXIrIjsiOiIiO3grPSh0aGlzLmZvbnRTaXplKT8iZm9udC1zaXplOiIrdGhpcy5mb250U2l6ZSsiOyI6IiI7eCs9KHRoaXMuZm9udEZhbWlseSk/ImZvbnQtZmFtaWx5OiIrdGhpcy5mb250RmFtaWx5KyI7IjoiIjt4Kz0odGhpcy50ZXh0Q29sb3IpPyJjb2xvcjoiK3RoaXMudGV4dENvbG9yKyI7IjoiIjt4Kz0odGhpcy5tYXJnaW5Ub3AhPW51bGwpPyJtYXJnaW4tdG9wOiIrdGhpcy5tYXJnaW5Ub3ArIjsiOiIiO3grPSh0aGlzLm1hcmdpbkJvdHRvbSE9bnVsbCk/Im1hcmdpbi1ib3R0b206Iit0aGlzLm1hcmdpbkJvdHRvbSsiOyI6IiI7eCs9KHRoaXMubWFyZ2luTGVmdCE9bnVsbCk/Im1hcmdpbi1sZWZ0OiIrdGhpcy5tYXJnaW5MZWZ0KyI7IjoiIjt4Kz0odGhpcy5tYXJnaW5SaWdodCE9bnVsbCk/Im1hcmdpbi1yaWdodDoiK3RoaXMubWFyZ2luUmlnaHQrIjsiOiIiO3RoaXMuX2VsZW09YygnPHRhYmxlIGNsYXNzPSJqcXBsb3QtdGFibGUtbGVnZW5kIiBzdHlsZT0iJyt4KyciPjwvdGFibGU+Jyk7dmFyIGY9ZmFsc2UscT1mYWxzZSx1LG87dmFyIHc9cFswXTtpZih3LnNob3cpe3ZhciB0PXcuZGF0YTtpZih0aGlzLm51bWJlclJvd3Mpe3U9dGhpcy5udW1iZXJSb3dzO2lmKCF0aGlzLm51bWJlckNvbHVtbnMpe289TWF0aC5jZWlsKHQubGVuZ3RoL3UpfWVsc2V7bz10aGlzLm51bWJlckNvbHVtbnN9fWVsc2V7aWYodGhpcy5udW1iZXJDb2x1bW5zKXtvPXRoaXMubnVtYmVyQ29sdW1uczt1PU1hdGguY2VpbCh0Lmxlbmd0aC90aGlzLm51bWJlckNvbHVtbnMpfWVsc2V7dT10Lmxlbmd0aDtvPTF9fXZhciBuLG0scixnLGUsbCxrLGg7dmFyIHY9MDtmb3Iobj0wO248dTtuKyspe2lmKHEpe3I9YygnPHRyIGNsYXNzPSJqcXBsb3QtdGFibGUtbGVnZW5kIj48L3RyPicpLnByZXBlbmRUbyh0aGlzLl9lbGVtKX1lbHNle3I9YygnPHRyIGNsYXNzPSJqcXBsb3QtdGFibGUtbGVnZW5kIj48L3RyPicpLmFwcGVuZFRvKHRoaXMuX2VsZW0pfWZvcihtPTA7bTxvO20rKyl7aWYodjx0Lmxlbmd0aCl7bD10aGlzLmxhYmVsc1t2XXx8dFt2XVswXS50b1N0cmluZygpO2g9dy5jb2xvcjtpZighcSl7aWYobj4wKXtmPXRydWV9ZWxzZXtmPWZhbHNlfX1lbHNle2lmKG49PXUtMSl7Zj1mYWxzZX1lbHNle2Y9dHJ1ZX19az0oZik/dGhpcy5yb3dTcGFjaW5nOiIwIjtnPWMoJzx0ZCBjbGFzcz0ianFwbG90LXRhYmxlLWxlZ2VuZCIgc3R5bGU9InRleHQtYWxpZ246Y2VudGVyO3BhZGRpbmctdG9wOicraysnOyI+PGRpdj48ZGl2IGNsYXNzPSJqcXBsb3QtdGFibGUtbGVnZW5kLXN3YXRjaCIgc3R5bGU9ImJvcmRlci1jb2xvcjonK2grJzsiPjwvZGl2PjwvZGl2PjwvdGQ+Jyk7ZT1jKCc8dGQgY2xhc3M9ImpxcGxvdC10YWJsZS1sZWdlbmQiIHN0eWxlPSJwYWRkaW5nLXRvcDonK2srJzsiPjwvdGQ+Jyk7aWYodGhpcy5lc2NhcGVIdG1sKXtlLnRleHQobCl9ZWxzZXtlLmh0bWwobCl9aWYocSl7ZS5wcmVwZW5kVG8ocik7Zy5wcmVwZW5kVG8ocil9ZWxzZXtnLmFwcGVuZFRvKHIpO2UuYXBwZW5kVG8ocil9Zj10cnVlfXYrK319fX1yZXR1cm4gdGhpcy5fZWxlbX07ZnVuY3Rpb24gYShqLGgsZil7Zj1mfHx7fTtmLmF4ZXNEZWZhdWx0cz1mLmF4ZXNEZWZhdWx0c3x8e307Zi5sZWdlbmQ9Zi5sZWdlbmR8fHt9O2Yuc2VyaWVzRGVmYXVsdHM9Zi5zZXJpZXNEZWZhdWx0c3x8e307Zi5ncmlkPWYuZ3JpZHx8e307dmFyIGU9ZmFsc2U7aWYoZi5zZXJpZXNEZWZhdWx0cy5yZW5kZXJlcj09Yy5qcXBsb3QuTWV0ZXJHYXVnZVJlbmRlcmVyKXtlPXRydWV9ZWxzZXtpZihmLnNlcmllcyl7Zm9yKHZhciBnPTA7ZzxmLnNlcmllcy5sZW5ndGg7ZysrKXtpZihmLnNlcmllc1tnXS5yZW5kZXJlcj09Yy5qcXBsb3QuTWV0ZXJHYXVnZVJlbmRlcmVyKXtlPXRydWV9fX19aWYoZSl7Zi5heGVzRGVmYXVsdHMucmVuZGVyZXI9Yy5qcXBsb3QuTWV0ZXJHYXVnZUF4aXNSZW5kZXJlcjtmLmxlZ2VuZC5yZW5kZXJlcj1jLmpxcGxvdC5NZXRlckdhdWdlTGVnZW5kUmVuZGVyZXI7Zi5sZWdlbmQucHJlRHJhdz10cnVlO2YuZ3JpZC5iYWNrZ3JvdW5kPWYuZ3JpZC5iYWNrZ3JvdW5kfHwid2hpdGUiO2YuZ3JpZC5kcmF3R3JpZGxpbmVzPWZhbHNlO2YuZ3JpZC5ib3JkZXJXaWR0aD0oZi5ncmlkLmJvcmRlcldpZHRoIT1udWxsKT9mLmdyaWQuYm9yZGVyV2lkdGg6MDtmLmdyaWQuc2hhZG93PShmLmdyaWQuc2hhZG93IT1udWxsKT9mLmdyaWQuc2hhZG93OmZhbHNlfX1mdW5jdGlvbiBkKGUpe31jLmpxcGxvdC5wcmVJbml0SG9va3MucHVzaChhKTtjLmpxcGxvdC5wb3N0UGFyc2VPcHRpb25zSG9va3MucHVzaChkKTtjLmpxcGxvdC5NZXRlckdhdWdlVGlja1JlbmRlcmVyPWZ1bmN0aW9uKCl7Yy5qcXBsb3QuQXhpc1RpY2tSZW5kZXJlci5jYWxsKHRoaXMpfTtjLmpxcGxvdC5NZXRlckdhdWdlVGlja1JlbmRlcmVyLnByb3RvdHlwZT1uZXcgYy5qcXBsb3QuQXhpc1RpY2tSZW5kZXJlcigpO2MuanFwbG90Lk1ldGVyR2F1Z2VUaWNrUmVuZGVyZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yPWMuanFwbG90Lk1ldGVyR2F1Z2VUaWNrUmVuZGVyZXJ9KShqUXVlcnkpOw==]]></data>
	</file>
	<file>
	  <filename>/src/plugins/jqplot.ohlcRenderer.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqCiAqIGpxUGxvdAogKiBQdXJlIEphdmFTY3JpcHQgcGxvdHRpbmcgcGx1Z2luIHVzaW5nIGpRdWVyeQogKgogKiBWZXJzaW9uOiAxLjAuMGIyX3IxMDEyCiAqCiAqIENvcHlyaWdodCAoYykgMjAwOS0yMDExIENocmlzIExlb25lbGxvCiAqIGpxUGxvdCBpcyBjdXJyZW50bHkgYXZhaWxhYmxlIGZvciB1c2UgaW4gYWxsIHBlcnNvbmFsIG9yIGNvbW1lcmNpYWwgcHJvamVjdHMgCiAqIHVuZGVyIGJvdGggdGhlIE1JVCAoaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHApIGFuZCBHUEwgCiAqIHZlcnNpb24gMi4wIChodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC5odG1sKSBsaWNlbnNlcy4gVGhpcyBtZWFucyB0aGF0IHlvdSBjYW4gCiAqIGNob29zZSB0aGUgbGljZW5zZSB0aGF0IGJlc3Qgc3VpdHMgeW91ciBwcm9qZWN0IGFuZCB1c2UgaXQgYWNjb3JkaW5nbHkuIAogKgogKiBBbHRob3VnaCBub3QgcmVxdWlyZWQsIHRoZSBhdXRob3Igd291bGQgYXBwcmVjaWF0ZSBhbiBlbWFpbCBsZXR0aW5nIGhpbSAKICoga25vdyBvZiBhbnkgc3Vic3RhbnRpYWwgdXNlIG9mIGpxUGxvdC4gIFlvdSBjYW4gcmVhY2ggdGhlIGF1dGhvciBhdDogCiAqIGNocmlzIGF0IGpxcGxvdCBkb3QgY29tIG9yIHNlZSBodHRwOi8vd3d3LmpxcGxvdC5jb20vaW5mby5waHAgLgogKgogKiBJZiB5b3UgYXJlIGZlZWxpbmcga2luZCBhbmQgZ2VuZXJvdXMsIGNvbnNpZGVyIHN1cHBvcnRpbmcgdGhlIHByb2plY3QgYnkKICogbWFraW5nIGEgZG9uYXRpb24gYXQ6IGh0dHA6Ly93d3cuanFwbG90LmNvbS9kb25hdGUucGhwIC4KICoKICogc3ByaW50ZiBmdW5jdGlvbnMgY29udGFpbmVkIGluIGpxcGxvdC5zcHJpbnRmLmpzIGJ5IEFzaCBTZWFybGU6CiAqCiAqICAgICB2ZXJzaW9uIDIwMDcuMDQuMjcKICogICAgIGF1dGhvciBBc2ggU2VhcmxlCiAqICAgICBodHRwOi8vaGV4bWVuLmNvbS9ibG9nLzIwMDcvMDMvcHJpbnRmLXNwcmludGYvCiAqICAgICBodHRwOi8vaGV4bWVuLmNvbS9qcy9zcHJpbnRmLmpzCiAqICAgICBUaGUgYXV0aG9yIChBc2ggU2VhcmxlKSBoYXMgcGxhY2VkIHRoaXMgY29kZSBpbiB0aGUgcHVibGljIGRvbWFpbjoKICogICAgICJUaGlzIGNvZGUgaXMgdW5yZXN0cmljdGVkOiB5b3UgYXJlIGZyZWUgdG8gdXNlIGl0IGhvd2V2ZXIgeW91IGxpa2UuIgogKiAKICovCihmdW5jdGlvbigkKSB7CiAgICAvKioKICAgICAqIENsYXNzOiAkLmpxcGxvdC5PSExDUmVuZGVyZXIKICAgICAqIGpxUGxvdCBQbHVnaW4gdG8gZHJhdyBPcGVuIEhpIExvdyBDbG9zZSwgQ2FuZGxlc3RpY2sgYW5kIEhpIExvdyBDbG9zZSBjaGFydHMuCiAgICAgKiAKICAgICAqIFRvIHVzZSB0aGlzIHBsdWdpbiwgaW5jbHVkZSB0aGUgcmVuZGVyZXIganMgZmlsZSBpbiAKICAgICAqIHlvdXIgc291cmNlOgogICAgICogCiAgICAgKiA+IDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InBsdWdpbnMvanFwbG90Lm9obGNSZW5kZXJlci5qcyI+PC9zY3JpcHQ+CiAgICAgKiAKICAgICAqIFlvdSB3aWxsIG1vc3QgbGlrZWx5IHdhbnQgdG8gdXNlIGEgZGF0ZSBheGlzIHJlbmRlcmVyCiAgICAgKiBmb3IgdGhlIHggYXhpcyBhbHNvLCBzbyBpbmNsdWRlIHRoZSBkYXRlIGF4aXMgcmVuZGVyIGpzIGZpbGUgYWxzbzoKICAgICAqIAogICAgICogPiA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJwbHVnaW5zL2pxcGxvdC5kYXRlQXhpc1JlbmRlcmVyLmpzIj48L3NjcmlwdD4KICAgICAqIAogICAgICogVGhlbiB5b3Ugc2V0IHRoZSByZW5kZXJlciBpbiB0aGUgc2VyaWVzIG9wdGlvbnMgb24geW91ciBwbG90OgogICAgICogCiAgICAgKiA+IHNlcmllczogW3tyZW5kZXJlcjokLmpxcGxvdC5PSExDUmVuZGVyZXJ9XQogICAgICogCiAgICAgKiBGb3IgT0hMQyBhbmQgY2FuZGxlc3RpY2sgY2hhcnRzLCBkYXRhIHNob3VsZCBiZSBzcGVjaWZpZWQKICAgICAqIGxpa2Ugc286CiAgICAgKiAKICAgICAqID4gZGF0ID0gW1snMDcvMDYvMjAwOScsMTM4LjcsMTM5LjY4LDEzNS4xOCwxMzUuNF0sIFsnMDYvMjkvMjAwOScsMTQzLjQ2LDE0NC42NiwxMzkuNzksMTQwLjAyXSwgLi4uXQogICAgICogCiAgICAgKiBJZiB0aGUgZGF0YSBhcnJheSBoYXMgb25seSA0IHZhbHVlcyBwZXIgcG9pbnQgaW5zdGVhZCBvZiA1LAogICAgICogdGhlIHJlbmRlcmVyIHdpbGwgY3JlYXRlIGEgSGkgTG93IENsb3NlIGNoYXJ0IGluc3RlYWQuICBJbiB0aGF0IGNhc2UsCiAgICAgKiBkYXRhIHNob3VsZCBiZSBzdXBwbGllZCBsaWtlOgogICAgICogCiAgICAgKiA+IGRhdCA9IFtbJzA3LzA2LzIwMDknLDEzOS42OCwxMzUuMTgsMTM1LjRdLCBbJzA2LzI5LzIwMDknLDE0NC42NiwxMzkuNzksMTQwLjAyXSwgLi4uXQogICAgICogCiAgICAgKiBUbyBnZW5lcmF0ZSBhIGNhbmRsZXN0aWNrIGNoYXJ0IGluc3RlYWQgb2YgYW4gT0hMQyBjaGFydCwKICAgICAqIHNldCB0aGUgImNhbmRsZXN0aWNrIiBvcHRpb24gdG8gdHJ1ZToKICAgICAqIAogICAgICogPiBzZXJpZXM6IFt7cmVuZGVyZXI6JC5qcXBsb3QuT0hMQ1JlbmRlcmVyLCByZW5kZXJlck9wdGlvbnM6e2NhbmRsZVN0aWNrOnRydWV9fV0sCiAgICAgKiAKICAgICAqLwogICAgJC5qcXBsb3QuT0hMQ1JlbmRlcmVyID0gZnVuY3Rpb24oKXsKICAgICAgICAvLyBzdWJjbGFzcyBsaW5lIHJlbmRlcmVyIHRvIG1ha2UgdXNlIG9mIHNvbWUgb2YgaXQncyBtZXRob2RzLgogICAgICAgICQuanFwbG90LkxpbmVSZW5kZXJlci5jYWxsKHRoaXMpOwogICAgICAgIC8vIHByb3A6IGNhbmRsZVN0aWNrCiAgICAgICAgLy8gdHJ1ZSB0byByZW5kZXIgY2hhcnQgYXMgY2FuZGxlU3RpY2suCiAgICAgICAgLy8gTXVzdCBoYXZlIGFuIG9wZW4gcHJpY2UsIGNhbm5vdCBiZSBhIGhsYyBjaGFydC4KICAgICAgICB0aGlzLmNhbmRsZVN0aWNrID0gZmFsc2U7CiAgICAgICAgLy8gcHJvcDogdGlja0xlbmd0aAogICAgICAgIC8vIGxlbmd0aCBvZiB0aGUgbGluZSBpbiBwaXhlbHMgaW5kaWNhdGluZyBvcGVuIGFuZCBjbG9zZSBwcmljZS4KICAgICAgICAvLyBEZWZhdWx0IHdpbGwgYXV0byBjYWxjdWxhdGUgYmFzZWQgb24gcGxvdCB3aWR0aCBhbmQgCiAgICAgICAgLy8gbnVtYmVyIG9mIHBvaW50cyBkaXNwbGF5ZWQuCiAgICAgICAgdGhpcy50aWNrTGVuZ3RoID0gJ2F1dG8nOwogICAgICAgIC8vIHByb3A6IGJvZHlXaWR0aAogICAgICAgIC8vIHdpZHRoIG9mIHRoZSBjYW5kbGVzdGljayBib2R5IGluIHBpeGVscy4gIERlZmF1bHQgd2lsbCBhdXRvIGNhbGN1bGF0ZQogICAgICAgIC8vIGJhc2VkIG9uIHBsb3Qgd2lkdGggYW5kIG51bWJlciBvZiBjYW5kbGVzdGlja3MgZGlzcGxheWVkLgogICAgICAgIHRoaXMuYm9keVdpZHRoID0gJ2F1dG8nOwogICAgICAgIC8vIHByb3A6IG9wZW5Db2xvcgogICAgICAgIC8vIGNvbG9yIG9mIHRoZSBvcGVuIHByaWNlIHRpY2sgbWFyay4gIERlZmF1bHQgaXMgc2VyaWVzIGNvbG9yLgogICAgICAgIHRoaXMub3BlbkNvbG9yID0gbnVsbDsKICAgICAgICAvLyBwcm9wOiBjbG9zZUNvbG9yCiAgICAgICAgLy8gY29sb3Igb2YgdGhlIGNsb3NlIHByaWNlIHRpY2sgbWFyay4gIERlZmF1bHQgaXMgc2VyaWVzIGNvbG9yLgogICAgICAgIHRoaXMuY2xvc2VDb2xvciA9IG51bGw7CiAgICAgICAgLy8gcHJvcDogd2lja0NvbG9yCiAgICAgICAgLy8gY29sb3Igb2YgdGhlIGhpLWxvIGxpbmUgdGhvcnVnaCB0aGUgY2FuZGxlc3RpY2sgYm9keS4KICAgICAgICAvLyBEZWZhdWx0IGlzIHRoZSBzZXJpZXMgY29sb3IuCiAgICAgICAgdGhpcy53aWNrQ29sb3IgPSBudWxsOwogICAgICAgIC8vIHByb3A6IGZpbGxVcEJvZHkKICAgICAgICAvLyB0cnVlIHRvIHJlbmRlciBhbiAidXAiIGRheSAoY2xvc2UgcHJpY2UgZ3JlYXRlciB0aGFuIG9wZW4gcHJpY2UpCiAgICAgICAgLy8gd2l0aCBhIGZpbGxlZCBjYW5kbGVzdGljayBib2R5LgogICAgICAgIHRoaXMuZmlsbFVwQm9keSA9IGZhbHNlOwogICAgICAgIC8vIHByb3A6IGZpbGxEb3duQm9keQogICAgICAgIC8vIHRydWUgdG8gcmVuZGVyIGEgImRvd24iIGRheSAoY2xvc2UgcHJpY2UgbG93ZXIgdGhhbiBvcGVuIHByaWNlKQogICAgICAgIC8vIHdpdGggYSBmaWxsZWQgY2FuZGxlc3RpY2sgYm9keS4KICAgICAgICB0aGlzLmZpbGxEb3duQm9keSA9IHRydWU7CiAgICAgICAgLy8gcHJvcDogdXBCb2R5Q29sb3IKICAgICAgICAvLyBDb2xvciBvZiBjYW5kbGVzdGljayBib2R5IG9mIGFuICJ1cCIgZGF5LiAgRGVmYXVsdCBpcyBzZXJpZXMgY29sb3IuCiAgICAgICAgdGhpcy51cEJvZHlDb2xvciA9IG51bGw7CiAgICAgICAgLy8gcHJvcDogZG93bkJvZHlDb2xvcgogICAgICAgIC8vIENvbG9yIG9mIGNhbmRsZXN0aWNrIGJvZHkgb24gYSAiZG93biIgZGF5LiAgRGVmYXVsdCBpcyBzZXJpZXMgY29sb3IuCiAgICAgICAgdGhpcy5kb3duQm9keUNvbG9yID0gbnVsbDsKICAgICAgICAvLyBwcm9wOiBobGMKICAgICAgICAvLyB0cnVlIGlmIGlzIGEgaGktbG93LWNsb3NlIGNoYXJ0IChubyBvcGVuIHByaWNlKS4KICAgICAgICAvLyBUaGlzIGlzIGRldGVybWluZWQgYXV0b21hdGljYWxseSBmcm9tIHRoZSBzZXJpZXMgZGF0YS4KICAgICAgICB0aGlzLmhsYyA9IGZhbHNlOwogICAgICAgIC8vIHByb3A6IGxpbmVXaWR0aAogICAgICAgIC8vIFdpZHRoIG9mIHRoZSBoaS1sb3cgbGluZSBhbmQgb3Blbi9jbG9zZSB0aWNrcy4KICAgICAgICAvLyBNdXN0IGJlIHNldCBpbiB0aGUgcmVuZGVyZXJPcHRpb25zIGZvciB0aGUgc2VyaWVzLgogICAgICAgIHRoaXMubGluZVdpZHRoID0gMS41OwogICAgICAgIHRoaXMuX3RpY2tMZW5ndGg7CiAgICAgICAgdGhpcy5fYm9keVdpZHRoOwogICAgfTsKICAgIAogICAgJC5qcXBsb3QuT0hMQ1JlbmRlcmVyLnByb3RvdHlwZSA9IG5ldyAkLmpxcGxvdC5MaW5lUmVuZGVyZXIoKTsKICAgICQuanFwbG90Lk9ITENSZW5kZXJlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSAkLmpxcGxvdC5PSExDUmVuZGVyZXI7CiAgICAKICAgIC8vIGNhbGxlZCB3aXRoIHNjb3BlIG9mIHNlcmllcy4KICAgICQuanFwbG90Lk9ITENSZW5kZXJlci5wcm90b3R5cGUuaW5pdCA9IGZ1bmN0aW9uKG9wdGlvbnMpIHsKICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKICAgICAgICAvLyBsaW5lV2lkdGggaGFzIHRvIGJlIHNldCBvbiB0aGUgc2VyaWVzLCBjaGFuZ2VzIGluIHJlbmRlcmVyCiAgICAgICAgLy8gY29uc3RydWN0b3IgaGF2ZSBubyBlZmZlY3QuICBzZXQgdGhlIGRlZmF1bHQgaGVyZQogICAgICAgIC8vIGlmIG5vIHJlbmRlcmVyIG9wdGlvbiBmb3IgbGluZVdpZHRoIGlzIHNwZWNpZmllZC4KICAgICAgICB0aGlzLmxpbmVXaWR0aCA9IG9wdGlvbnMubGluZVdpZHRoIHx8IDEuNTsKICAgICAgICAkLmpxcGxvdC5MaW5lUmVuZGVyZXIucHJvdG90eXBlLmluaXQuY2FsbCh0aGlzLCBvcHRpb25zKTsKICAgICAgICB0aGlzLl90eXBlID0gJ29obGMnOwogICAgICAgIC8vIHNldCB0aGUgeWF4aXMgZGF0YSBib3VuZHMgaGVyZSB0byBhY2NvdW50IGZvciBoaSBhbmQgbG93IHZhbHVlcwogICAgICAgIHZhciBkYiA9IHRoaXMuX3lheGlzLl9kYXRhQm91bmRzOwogICAgICAgIHZhciBkID0gdGhpcy5fcGxvdERhdGE7CiAgICAgICAgLy8gaWYgZGF0YSBwb2ludHMgaGF2ZSBsZXNzIHRoYW4gNSB2YWx1ZXMsIGZvcmNlIGEgaGxjIGNoYXJ0LgogICAgICAgIGlmIChkWzBdLmxlbmd0aCA8IDUpIHsKICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5obGMgPSB0cnVlOwoKICAgICAgICAgICAgZm9yICh2YXIgaj0wOyBqPGQubGVuZ3RoOyBqKyspIHsgCiAgICAgICAgICAgICAgICBpZiAoZFtqXVsyXSA8IGRiLm1pbiB8fCBkYi5taW4gPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIGRiLm1pbiA9IGRbal1bMl07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoZFtqXVsxXSA+IGRiLm1heCB8fCBkYi5tYXggPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIGRiLm1heCA9IGRbal1bMV07CiAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgIAogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBmb3IgKHZhciBqPTA7IGo8ZC5sZW5ndGg7IGorKykgeyAKICAgICAgICAgICAgICAgIGlmIChkW2pdWzNdIDwgZGIubWluIHx8IGRiLm1pbiA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgZGIubWluID0gZFtqXVszXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChkW2pdWzJdID4gZGIubWF4IHx8IGRiLm1heCA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgZGIubWF4ID0gZFtqXVsyXTsKICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgCiAgICB9OwogICAgCiAgICAvLyBjYWxsZWQgd2l0aGluIHNjb3BlIG9mIHNlcmllcy4KICAgICQuanFwbG90Lk9ITENSZW5kZXJlci5wcm90b3R5cGUuZHJhdyA9IGZ1bmN0aW9uKGN0eCwgZ2QsIG9wdGlvbnMpIHsKICAgICAgICB2YXIgZCA9IHRoaXMuZGF0YTsKICAgICAgICB2YXIgeG1pbiA9IHRoaXMuX3hheGlzLm1pbjsKICAgICAgICB2YXIgeG1heCA9IHRoaXMuX3hheGlzLm1heDsKICAgICAgICAvLyBpbmRleCBvZiBsYXN0IHZhbHVlIGJlbG93IHJhbmdlIG9mIHBsb3QuCiAgICAgICAgdmFyIHhtaW5pZHggPSAwOwogICAgICAgIC8vIGluZGV4IG9mIGZpcnN0IHZhbHVlIGFib3ZlIHJhbmdlIG9mIHBsb3QuCiAgICAgICAgdmFyIHhtYXhpZHggPSBkLmxlbmd0aDsKICAgICAgICB2YXIgeHAgPSB0aGlzLl94YXhpcy5zZXJpZXNfdTJwOwogICAgICAgIHZhciB5cCA9IHRoaXMuX3lheGlzLnNlcmllc191MnA7CiAgICAgICAgdmFyIGksIHByZXZDb2xvciwgb3BzLCBiLCBoLCB3LCBhLCBwb2ludHM7CiAgICAgICAgdmFyIG87CiAgICAgICAgdmFyIHIgPSB0aGlzLnJlbmRlcmVyOwogICAgICAgIHZhciBvcHRzID0gKG9wdGlvbnMgIT0gdW5kZWZpbmVkKSA/IG9wdGlvbnMgOiB7fTsKICAgICAgICB2YXIgc2hhZG93ID0gKG9wdHMuc2hhZG93ICE9IHVuZGVmaW5lZCkgPyBvcHRzLnNoYWRvdyA6IHRoaXMuc2hhZG93OwogICAgICAgIHZhciBmaWxsID0gKG9wdHMuZmlsbCAhPSB1bmRlZmluZWQpID8gb3B0cy5maWxsIDogdGhpcy5maWxsOwogICAgICAgIHZhciBmaWxsQW5kU3Ryb2tlID0gKG9wdHMuZmlsbEFuZFN0cm9rZSAhPSB1bmRlZmluZWQpID8gb3B0cy5maWxsQW5kU3Ryb2tlIDogdGhpcy5maWxsQW5kU3Ryb2tlOwogICAgICAgIHIuYm9keVdpZHRoID0gKG9wdHMuYm9keVdpZHRoICE9IHVuZGVmaW5lZCkgPyBvcHRzLmJvZHlXaWR0aCA6IHIuYm9keVdpZHRoOwogICAgICAgIHIudGlja0xlbmd0aCA9IChvcHRzLnRpY2tMZW5ndGggIT0gdW5kZWZpbmVkKSA/IG9wdHMudGlja0xlbmd0aCA6IHIudGlja0xlbmd0aDsKICAgICAgICBjdHguc2F2ZSgpOwogICAgICAgIGlmICh0aGlzLnNob3cpIHsKICAgICAgICAgICAgdmFyIHgsIG9wZW4sIGhpLCBsb3csIGNsb3NlOwogICAgICAgICAgICAvLyBuZWVkIHRvIGdldCB3aWR0aHMgYmFzZWQgb24gbnVtYmVyIG9mIHBvaW50cyBzaG93biwKICAgICAgICAgICAgLy8gbm90IG9uIHRvdGFsIG51bWJlciBvZiBwb2ludHMuICBVc2UgdGhlIHJlc3VsdHMgCiAgICAgICAgICAgIC8vIHRvIHNwZWVkIHVwIGRyYXdpbmcgaW4gbmV4dCBzdGVwLgogICAgICAgICAgICBmb3IgKHZhciBpPTA7IGk8ZC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgaWYgKGRbaV1bMF0gPCB4bWluKSB7CiAgICAgICAgICAgICAgICAgICAgeG1pbmlkeCA9IGk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChkW2ldWzBdIDwgeG1heCkgewogICAgICAgICAgICAgICAgICAgIHhtYXhpZHggPSBpKzE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBkd2lkdGggPSB0aGlzLmdyaWREYXRhW3htYXhpZHgtMV1bMF0gLSB0aGlzLmdyaWREYXRhW3htaW5pZHhdWzBdOwogICAgICAgICAgICB2YXIgbnZpc2libGVQb2ludHMgPSB4bWF4aWR4IC0geG1pbmlkeDsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIHZhciBkaW50ZXJ2YWwgPSBNYXRoLmFicyh0aGlzLl94YXhpcy5zZXJpZXNfdTJwKHBhcnNlSW50KHRoaXMuX3hheGlzLl9pbnRlcnZhbFN0YXRzWzBdLnNvcnRlZEludGVydmFsc1swXS5pbnRlcnZhbCwgMTApKSAtIHRoaXMuX3hheGlzLnNlcmllc191MnAoMCkpOyAKICAgICAgICAgICAgfQoKICAgICAgICAgICAgY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgIHZhciBkaW50ZXJ2YWwgPSBkd2lkdGggLyBudmlzaWJsZVBvaW50czsKICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgaWYgKHIuY2FuZGxlU3RpY2spIHsKICAgICAgICAgICAgICAgIGlmICh0eXBlb2Yoci5ib2R5V2lkdGgpID09ICdudW1iZXInKSB7CiAgICAgICAgICAgICAgICAgICAgci5fYm9keVdpZHRoID0gci5ib2R5V2lkdGg7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICByLl9ib2R5V2lkdGggPSBNYXRoLm1pbigyMCwgZGludGVydmFsLzEuNjUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgaWYgKHR5cGVvZihyLnRpY2tMZW5ndGgpID09ICdudW1iZXInKSB7CiAgICAgICAgICAgICAgICAgICAgci5fdGlja0xlbmd0aCA9IHIudGlja0xlbmd0aDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHIuX3RpY2tMZW5ndGggPSBNYXRoLm1pbigxMCwgZGludGVydmFsLzMuNSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgICAgIGZvciAodmFyIGk9eG1pbmlkeDsgaTx4bWF4aWR4OyBpKyspIHsKICAgICAgICAgICAgICAgIHggPSB4cChkW2ldWzBdKTsKICAgICAgICAgICAgICAgIGlmIChyLmhsYykgewogICAgICAgICAgICAgICAgICAgIG9wZW4gPSBudWxsOwogICAgICAgICAgICAgICAgICAgIGhpID0geXAoZFtpXVsxXSk7CiAgICAgICAgICAgICAgICAgICAgbG93ID0geXAoZFtpXVsyXSk7CiAgICAgICAgICAgICAgICAgICAgY2xvc2UgPSB5cChkW2ldWzNdKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIG9wZW4gPSB5cChkW2ldWzFdKTsKICAgICAgICAgICAgICAgICAgICBoaSA9IHlwKGRbaV1bMl0pOwogICAgICAgICAgICAgICAgICAgIGxvdyA9IHlwKGRbaV1bM10pOwogICAgICAgICAgICAgICAgICAgIGNsb3NlID0geXAoZFtpXVs0XSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBvID0ge307CiAgICAgICAgICAgICAgICBpZiAoci5jYW5kbGVTdGljayAmJiAhci5obGMpIHsKICAgICAgICAgICAgICAgICAgICB3ID0gci5fYm9keVdpZHRoOwogICAgICAgICAgICAgICAgICAgIGEgPSB4IC0gdy8yOwogICAgICAgICAgICAgICAgICAgIC8vIGRyYXcgY2FuZGxlCiAgICAgICAgICAgICAgICAgICAgLy8gZGV0ZXJtaW5lIGlmIGNhbmRsZSB1cCBvciBkb3duCiAgICAgICAgICAgICAgICAgICAgLy8gdXAsIHJlbWVtYmVyIGdyaWQgY29vcmRpbmF0ZXMgaW5jcmVhc2UgZG93bndhcmQKICAgICAgICAgICAgICAgICAgICBpZiAoY2xvc2UgPCBvcGVuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRyYXcgd2ljawogICAgICAgICAgICAgICAgICAgICAgICBpZiAoci53aWNrQ29sb3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8uY29sb3IgPSByLndpY2tDb2xvcjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChyLmRvd25Cb2R5Q29sb3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8uY29sb3IgPSByLnVwQm9keUNvbG9yOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIG9wcyA9ICQuZXh0ZW5kKHRydWUsIHt9LCBvcHRzLCBvKTsKICAgICAgICAgICAgICAgICAgICAgICAgci5zaGFwZVJlbmRlcmVyLmRyYXcoY3R4LCBbW3gsIGhpXSwgW3gsIGNsb3NlXV0sIG9wcyk7IAogICAgICAgICAgICAgICAgICAgICAgICByLnNoYXBlUmVuZGVyZXIuZHJhdyhjdHgsIFtbeCwgb3Blbl0sIFt4LCBsb3ddXSwgb3BzKTsgCiAgICAgICAgICAgICAgICAgICAgICAgIG8gPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgYiA9IGNsb3NlOwogICAgICAgICAgICAgICAgICAgICAgICBoID0gb3BlbiAtIGNsb3NlOwogICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBjb2xvciBzcGVjaWZpZWQsIHVzZSBpdAogICAgICAgICAgICAgICAgICAgICAgICBpZiAoci5maWxsVXBCb2R5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvLmZpbGxSZWN0ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8uc3Ryb2tlUmVjdCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ID0gdyAtIHRoaXMubGluZVdpZHRoOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYSA9IHggLSB3LzI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHIudXBCb2R5Q29sb3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8uY29sb3IgPSByLnVwQm9keUNvbG9yOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgby5maWxsU3R5bGUgPSByLnVwQm9keUNvbG9yOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50cyA9IFthLCBiLCB3LCBoXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLy8gZG93bgogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNsb3NlID4gIG9wZW4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gZHJhdyB3aWNrCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyLndpY2tDb2xvcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgby5jb2xvciA9IHIud2lja0NvbG9yOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHIuZG93bkJvZHlDb2xvcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgby5jb2xvciA9IHIuZG93bkJvZHlDb2xvcjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBvcHMgPSAkLmV4dGVuZCh0cnVlLCB7fSwgb3B0cywgbyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHIuc2hhcGVSZW5kZXJlci5kcmF3KGN0eCwgW1t4LCBoaV0sIFt4LCBvcGVuXV0sIG9wcyk7IAogICAgICAgICAgICAgICAgICAgICAgICByLnNoYXBlUmVuZGVyZXIuZHJhdyhjdHgsIFtbeCwgY2xvc2VdLCBbeCwgbG93XV0sIG9wcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgbyA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgYiA9IG9wZW47CiAgICAgICAgICAgICAgICAgICAgICAgIGggPSBjbG9zZSAtIG9wZW47CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIGNvbG9yIHNwZWNpZmllZCwgdXNlIGl0CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyLmZpbGxEb3duQm9keSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgby5maWxsUmVjdCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvLnN0cm9rZVJlY3QgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdyA9IHcgLSB0aGlzLmxpbmVXaWR0aDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgPSB4IC0gdy8yOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyLmRvd25Cb2R5Q29sb3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8uY29sb3IgPSByLmRvd25Cb2R5Q29sb3I7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvLmZpbGxTdHlsZSA9IHIuZG93bkJvZHlDb2xvcjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBwb2ludHMgPSBbYSwgYiwgdywgaF07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC8vIGV2ZW4sIG9wZW4gPSBjbG9zZQogICAgICAgICAgICAgICAgICAgIGVsc2UgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gZHJhdyB3aWNrCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyLndpY2tDb2xvcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgby5jb2xvciA9IHIud2lja0NvbG9yOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIG9wcyA9ICQuZXh0ZW5kKHRydWUsIHt9LCBvcHRzLCBvKTsKICAgICAgICAgICAgICAgICAgICAgICAgci5zaGFwZVJlbmRlcmVyLmRyYXcoY3R4LCBbW3gsIGhpXSwgW3gsIGxvd11dLCBvcHMpOyAKICAgICAgICAgICAgICAgICAgICAgICAgbyA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICBvLmZpbGxSZWN0ID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIG8uc3Ryb2tlUmVjdCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICBhID0gW3ggLSB3LzIsIG9wZW5dOwogICAgICAgICAgICAgICAgICAgICAgICBiID0gW3ggKyB3LzIsIGNsb3NlXTsKICAgICAgICAgICAgICAgICAgICAgICAgdyA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgIGggPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICBwb2ludHMgPSBbYSwgYl07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIG9wcyA9ICQuZXh0ZW5kKHRydWUsIHt9LCBvcHRzLCBvKTsKICAgICAgICAgICAgICAgICAgICByLnNoYXBlUmVuZGVyZXIuZHJhdyhjdHgsIHBvaW50cywgb3BzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHByZXZDb2xvciA9IG9wdHMuY29sb3I7CiAgICAgICAgICAgICAgICAgICAgaWYgKHIub3BlbkNvbG9yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG9wdHMuY29sb3IgPSByLm9wZW5Db2xvcjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLy8gZHJhdyBvcGVuIHRpY2sKICAgICAgICAgICAgICAgICAgICBpZiAoIXIuaGxjKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHIuc2hhcGVSZW5kZXJlci5kcmF3KGN0eCwgW1t4LXIuX3RpY2tMZW5ndGgsIG9wZW5dLCBbeCwgb3Blbl1dLCBvcHRzKTsgICAgCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIG9wdHMuY29sb3IgPSBwcmV2Q29sb3I7CiAgICAgICAgICAgICAgICAgICAgLy8gZHJhdyB3aWNrCiAgICAgICAgICAgICAgICAgICAgaWYgKHIud2lja0NvbG9yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG9wdHMuY29sb3IgPSByLndpY2tDb2xvcjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgci5zaGFwZVJlbmRlcmVyLmRyYXcoY3R4LCBbW3gsIGhpXSwgW3gsIGxvd11dLCBvcHRzKTsgCiAgICAgICAgICAgICAgICAgICAgb3B0cy5jb2xvciAgPSBwcmV2Q29sb3I7CiAgICAgICAgICAgICAgICAgICAgLy8gZHJhdyBjbG9zZSB0aWNrCiAgICAgICAgICAgICAgICAgICAgaWYgKHIuY2xvc2VDb2xvcikgewogICAgICAgICAgICAgICAgICAgICAgICBvcHRzLmNvbG9yID0gci5jbG9zZUNvbG9yOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByLnNoYXBlUmVuZGVyZXIuZHJhdyhjdHgsIFtbeCwgY2xvc2VdLCBbeCtyLl90aWNrTGVuZ3RoLCBjbG9zZV1dLCBvcHRzKTsgCiAgICAgICAgICAgICAgICAgICAgb3B0cy5jb2xvciA9IHByZXZDb2xvcjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAKICAgICAgICBjdHgucmVzdG9yZSgpOwogICAgfTsgIAogICAgCiAgICAkLmpxcGxvdC5PSExDUmVuZGVyZXIucHJvdG90eXBlLmRyYXdTaGFkb3cgPSBmdW5jdGlvbihjdHgsIGdkLCBvcHRpb25zKSB7CiAgICAgICAgLy8gVGhpcyBpcyBhIG5vLW9wLCBzaGFkb3dzIGRyYXduIHdpdGggbGluZXMuCiAgICB9OwogICAgCiAgICAvLyBjYWxsZWQgd2l0aCBzY29wZSBvZiBwbG90LgogICAgJC5qcXBsb3QuT0hMQ1JlbmRlcmVyLmNoZWNrT3B0aW9ucyA9IGZ1bmN0aW9uKHRhcmdldCwgZGF0YSwgb3B0aW9ucykgewogICAgICAgIC8vIHByb3ZpZGUgc29tZSBzZW5zaWJsZSBoaWdobGlnaHRlciBvcHRpb25zIGJ5IGRlZmF1bHQKICAgICAgICAvLyBUaGVzZSBhcmVuJ3QgZ29vZCBmb3IgaGxjLCBvbmx5IGZvciBvaGxjIG9yIGNhbmRsZXN0aWNrCiAgICAgICAgaWYgKCFvcHRpb25zLmhpZ2hsaWdodGVyKSB7CiAgICAgICAgICAgIG9wdGlvbnMuaGlnaGxpZ2h0ZXIgPSB7CiAgICAgICAgICAgICAgICBzaG93TWFya2VyOmZhbHNlLAogICAgICAgICAgICAgICAgdG9vbHRpcEF4ZXM6ICd5JywKICAgICAgICAgICAgICAgIHl2YWx1ZXM6IDQsCiAgICAgICAgICAgICAgICBmb3JtYXRTdHJpbmc6Jzx0YWJsZSBjbGFzcz0ianFwbG90LWhpZ2hsaWdodGVyIj48dHI+PHRkPmRhdGU6PC90ZD48dGQ+JXM8L3RkPjwvdHI+PHRyPjx0ZD5vcGVuOjwvdGQ+PHRkPiVzPC90ZD48L3RyPjx0cj48dGQ+aGk6PC90ZD48dGQ+JXM8L3RkPjwvdHI+PHRyPjx0ZD5sb3c6PC90ZD48dGQ+JXM8L3RkPjwvdHI+PHRyPjx0ZD5jbG9zZTo8L3RkPjx0ZD4lczwvdGQ+PC90cj48L3RhYmxlPicKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9OwogICAgCiAgICAvLyQuanFwbG90LnByZUluaXRIb29rcy5wdXNoKCQuanFwbG90Lk9ITENSZW5kZXJlci5jaGVja09wdGlvbnMpOwogICAgCn0pKGpRdWVyeSk7ICAgIA==]]></data>
	</file>
	<file>
	  <filename>/src/plugins/jqplot.ohlcRenderer.min.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqCiAqIGpxUGxvdAogKiBQdXJlIEphdmFTY3JpcHQgcGxvdHRpbmcgcGx1Z2luIHVzaW5nIGpRdWVyeQogKgogKiBWZXJzaW9uOiAxLjAuMGIyX3IxMDEyCiAqCiAqIENvcHlyaWdodCAoYykgMjAwOS0yMDExIENocmlzIExlb25lbGxvCiAqIGpxUGxvdCBpcyBjdXJyZW50bHkgYXZhaWxhYmxlIGZvciB1c2UgaW4gYWxsIHBlcnNvbmFsIG9yIGNvbW1lcmNpYWwgcHJvamVjdHMgCiAqIHVuZGVyIGJvdGggdGhlIE1JVCAoaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHApIGFuZCBHUEwgCiAqIHZlcnNpb24gMi4wIChodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC5odG1sKSBsaWNlbnNlcy4gVGhpcyBtZWFucyB0aGF0IHlvdSBjYW4gCiAqIGNob29zZSB0aGUgbGljZW5zZSB0aGF0IGJlc3Qgc3VpdHMgeW91ciBwcm9qZWN0IGFuZCB1c2UgaXQgYWNjb3JkaW5nbHkuIAogKgogKiBBbHRob3VnaCBub3QgcmVxdWlyZWQsIHRoZSBhdXRob3Igd291bGQgYXBwcmVjaWF0ZSBhbiBlbWFpbCBsZXR0aW5nIGhpbSAKICoga25vdyBvZiBhbnkgc3Vic3RhbnRpYWwgdXNlIG9mIGpxUGxvdC4gIFlvdSBjYW4gcmVhY2ggdGhlIGF1dGhvciBhdDogCiAqIGNocmlzIGF0IGpxcGxvdCBkb3QgY29tIG9yIHNlZSBodHRwOi8vd3d3LmpxcGxvdC5jb20vaW5mby5waHAgLgogKgogKiBJZiB5b3UgYXJlIGZlZWxpbmcga2luZCBhbmQgZ2VuZXJvdXMsIGNvbnNpZGVyIHN1cHBvcnRpbmcgdGhlIHByb2plY3QgYnkKICogbWFraW5nIGEgZG9uYXRpb24gYXQ6IGh0dHA6Ly93d3cuanFwbG90LmNvbS9kb25hdGUucGhwIC4KICoKICogc3ByaW50ZiBmdW5jdGlvbnMgY29udGFpbmVkIGluIGpxcGxvdC5zcHJpbnRmLmpzIGJ5IEFzaCBTZWFybGU6CiAqCiAqICAgICB2ZXJzaW9uIDIwMDcuMDQuMjcKICogICAgIGF1dGhvciBBc2ggU2VhcmxlCiAqICAgICBodHRwOi8vaGV4bWVuLmNvbS9ibG9nLzIwMDcvMDMvcHJpbnRmLXNwcmludGYvCiAqICAgICBodHRwOi8vaGV4bWVuLmNvbS9qcy9zcHJpbnRmLmpzCiAqICAgICBUaGUgYXV0aG9yIChBc2ggU2VhcmxlKSBoYXMgcGxhY2VkIHRoaXMgY29kZSBpbiB0aGUgcHVibGljIGRvbWFpbjoKICogICAgICJUaGlzIGNvZGUgaXMgdW5yZXN0cmljdGVkOiB5b3UgYXJlIGZyZWUgdG8gdXNlIGl0IGhvd2V2ZXIgeW91IGxpa2UuIgogKgogKiBpbmNsdWRlZCBqc0RhdGUgbGlicmFyeSBieSBDaHJpcyBMZW9uZWxsbzoKICoKICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEgQ2hyaXMgTGVvbmVsbG8KICoKICoganNEYXRlIGlzIGN1cnJlbnRseSBhdmFpbGFibGUgZm9yIHVzZSBpbiBhbGwgcGVyc29uYWwgb3IgY29tbWVyY2lhbCBwcm9qZWN0cyAKICogdW5kZXIgYm90aCB0aGUgTUlUIGFuZCBHUEwgdmVyc2lvbiAyLjAgbGljZW5zZXMuIFRoaXMgbWVhbnMgdGhhdCB5b3UgY2FuIAogKiBjaG9vc2UgdGhlIGxpY2Vuc2UgdGhhdCBiZXN0IHN1aXRzIHlvdXIgcHJvamVjdCBhbmQgdXNlIGl0IGFjY29yZGluZ2x5LgogKgogKiBqc0RhdGUgYm9ycm93cyBtYW55IGNvbmNlcHRzIGFuZCBpZGVhcyBmcm9tIHRoZSBEYXRlIEluc3RhbmNlIAogKiBNZXRob2RzIGJ5IEtlbiBTbnlkZXIgYWxvbmcgd2l0aCBzb21lIHBhcnRzIG9mIEtlbidzIGFjdHVhbCBjb2RlLgogKiAKICogS2VuJ3Mgb3JpZ2lhbmwgRGF0ZSBJbnN0YW5jZSBNZXRob2RzIGFuZCBjb3B5cmlnaHQgbm90aWNlOgogKiAKICogS2VuIFNueWRlciAoa2VuIGQgc255ZGVyIGF0IGdtYWlsIGRvdCBjb20pCiAqIDIwMDgtMDktMTAKICogdmVyc2lvbiAyLjAuMiAoaHR0cDovL2tlbmRzbnlkZXIuY29tL3NhbmRib3gvZGF0ZS8pICAgICAKICogQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbiBMaWNlbnNlIDMuMCAoaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnkvMy4wLykKICoKICoganFwbG90VG9JbWFnZSBmdW5jdGlvbiBiYXNlZCBvbiBMYXJyeSBTaWRlbidzIGV4cG9ydC1qcXBsb3QtdG8tcG5nLmpzLgogKiBMYXJyeSBoYXMgZ2VuZXJvdXNseSBnaXZlbiBwZXJtaXNzaW9uIHRvIGFkYXB0IGhpcyBjb2RlIGZvciBpbmNsdXNpb24KICogaW50byBqcVBsb3QuCiAqCiAqIExhcnJ5J3Mgb3JpZ2luYWwgY29kZSBjYW4gYmUgZm91bmQgaGVyZToKICoKICogaHR0cHM6Ly9naXRodWIuY29tL2xzaWRlbi9leHBvcnQtanFwbG90LXRvLXBuZwogKiAKICogCiAqLwooZnVuY3Rpb24oYSl7YS5qcXBsb3QuT0hMQ1JlbmRlcmVyPWZ1bmN0aW9uKCl7YS5qcXBsb3QuTGluZVJlbmRlcmVyLmNhbGwodGhpcyk7dGhpcy5jYW5kbGVTdGljaz1mYWxzZTt0aGlzLnRpY2tMZW5ndGg9ImF1dG8iO3RoaXMuYm9keVdpZHRoPSJhdXRvIjt0aGlzLm9wZW5Db2xvcj1udWxsO3RoaXMuY2xvc2VDb2xvcj1udWxsO3RoaXMud2lja0NvbG9yPW51bGw7dGhpcy5maWxsVXBCb2R5PWZhbHNlO3RoaXMuZmlsbERvd25Cb2R5PXRydWU7dGhpcy51cEJvZHlDb2xvcj1udWxsO3RoaXMuZG93bkJvZHlDb2xvcj1udWxsO3RoaXMuaGxjPWZhbHNlO3RoaXMubGluZVdpZHRoPTEuNTt0aGlzLl90aWNrTGVuZ3RoO3RoaXMuX2JvZHlXaWR0aH07YS5qcXBsb3QuT0hMQ1JlbmRlcmVyLnByb3RvdHlwZT1uZXcgYS5qcXBsb3QuTGluZVJlbmRlcmVyKCk7YS5qcXBsb3QuT0hMQ1JlbmRlcmVyLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1hLmpxcGxvdC5PSExDUmVuZGVyZXI7YS5qcXBsb3QuT0hMQ1JlbmRlcmVyLnByb3RvdHlwZS5pbml0PWZ1bmN0aW9uKGUpe2U9ZXx8e307dGhpcy5saW5lV2lkdGg9ZS5saW5lV2lkdGh8fDEuNTthLmpxcGxvdC5MaW5lUmVuZGVyZXIucHJvdG90eXBlLmluaXQuY2FsbCh0aGlzLGUpO3RoaXMuX3R5cGU9Im9obGMiO3ZhciBiPXRoaXMuX3lheGlzLl9kYXRhQm91bmRzO3ZhciBmPXRoaXMuX3Bsb3REYXRhO2lmKGZbMF0ubGVuZ3RoPDUpe3RoaXMucmVuZGVyZXIuaGxjPXRydWU7Zm9yKHZhciBjPTA7YzxmLmxlbmd0aDtjKyspe2lmKGZbY11bMl08Yi5taW58fGIubWluPT1udWxsKXtiLm1pbj1mW2NdWzJdfWlmKGZbY11bMV0+Yi5tYXh8fGIubWF4PT1udWxsKXtiLm1heD1mW2NdWzFdfX19ZWxzZXtmb3IodmFyIGM9MDtjPGYubGVuZ3RoO2MrKyl7aWYoZltjXVszXTxiLm1pbnx8Yi5taW49PW51bGwpe2IubWluPWZbY11bM119aWYoZltjXVsyXT5iLm1heHx8Yi5tYXg9PW51bGwpe2IubWF4PWZbY11bMl19fX19O2EuanFwbG90Lk9ITENSZW5kZXJlci5wcm90b3R5cGUuZHJhdz1mdW5jdGlvbihBLE4sail7dmFyIEo9dGhpcy5kYXRhO3ZhciB2PXRoaXMuX3hheGlzLm1pbjt2YXIgej10aGlzLl94YXhpcy5tYXg7dmFyIGw9MDt2YXIgSz1KLmxlbmd0aDt2YXIgcD10aGlzLl94YXhpcy5zZXJpZXNfdTJwO3ZhciBHPXRoaXMuX3lheGlzLnNlcmllc191MnA7dmFyIEQsRSxmLE0sRixuLE8sQzt2YXIgeTt2YXIgdT10aGlzLnJlbmRlcmVyO3ZhciBzPShqIT11bmRlZmluZWQpP2o6e307dmFyIGs9KHMuc2hhZG93IT11bmRlZmluZWQpP3Muc2hhZG93OnRoaXMuc2hhZG93O3ZhciBCPShzLmZpbGwhPXVuZGVmaW5lZCk/cy5maWxsOnRoaXMuZmlsbDt2YXIgYz0ocy5maWxsQW5kU3Ryb2tlIT11bmRlZmluZWQpP3MuZmlsbEFuZFN0cm9rZTp0aGlzLmZpbGxBbmRTdHJva2U7dS5ib2R5V2lkdGg9KHMuYm9keVdpZHRoIT11bmRlZmluZWQpP3MuYm9keVdpZHRoOnUuYm9keVdpZHRoO3UudGlja0xlbmd0aD0ocy50aWNrTGVuZ3RoIT11bmRlZmluZWQpP3MudGlja0xlbmd0aDp1LnRpY2tMZW5ndGg7QS5zYXZlKCk7aWYodGhpcy5zaG93KXt2YXIgbSxxLGcsUSx0O2Zvcih2YXIgRD0wO0Q8Si5sZW5ndGg7RCsrKXtpZihKW0RdWzBdPHYpe2w9RH1lbHNle2lmKEpbRF1bMF08eil7Sz1EKzF9fX12YXIgST10aGlzLmdyaWREYXRhW0stMV1bMF0tdGhpcy5ncmlkRGF0YVtsXVswXTt2YXIgTD1LLWw7dHJ5e3ZhciBQPU1hdGguYWJzKHRoaXMuX3hheGlzLnNlcmllc191MnAocGFyc2VJbnQodGhpcy5feGF4aXMuX2ludGVydmFsU3RhdHNbMF0uc29ydGVkSW50ZXJ2YWxzWzBdLmludGVydmFsLDEwKSktdGhpcy5feGF4aXMuc2VyaWVzX3UycCgwKSl9Y2F0Y2goSCl7dmFyIFA9SS9MfWlmKHUuY2FuZGxlU3RpY2spe2lmKHR5cGVvZih1LmJvZHlXaWR0aCk9PSJudW1iZXIiKXt1Ll9ib2R5V2lkdGg9dS5ib2R5V2lkdGh9ZWxzZXt1Ll9ib2R5V2lkdGg9TWF0aC5taW4oMjAsUC8xLjY1KX19ZWxzZXtpZih0eXBlb2YodS50aWNrTGVuZ3RoKT09Im51bWJlciIpe3UuX3RpY2tMZW5ndGg9dS50aWNrTGVuZ3RofWVsc2V7dS5fdGlja0xlbmd0aD1NYXRoLm1pbigxMCxQLzMuNSl9fWZvcih2YXIgRD1sO0Q8SztEKyspe209cChKW0RdWzBdKTtpZih1LmhsYyl7cT1udWxsO2c9RyhKW0RdWzFdKTtRPUcoSltEXVsyXSk7dD1HKEpbRF1bM10pfWVsc2V7cT1HKEpbRF1bMV0pO2c9RyhKW0RdWzJdKTtRPUcoSltEXVszXSk7dD1HKEpbRF1bNF0pfXk9e307aWYodS5jYW5kbGVTdGljayYmIXUuaGxjKXtuPXUuX2JvZHlXaWR0aDtPPW0tbi8yO2lmKHQ8cSl7aWYodS53aWNrQ29sb3Ipe3kuY29sb3I9dS53aWNrQ29sb3J9ZWxzZXtpZih1LmRvd25Cb2R5Q29sb3Ipe3kuY29sb3I9dS51cEJvZHlDb2xvcn19Zj1hLmV4dGVuZCh0cnVlLHt9LHMseSk7dS5zaGFwZVJlbmRlcmVyLmRyYXcoQSxbW20sZ10sW20sdF1dLGYpO3Uuc2hhcGVSZW5kZXJlci5kcmF3KEEsW1ttLHFdLFttLFFdXSxmKTt5PXt9O009dDtGPXEtdDtpZih1LmZpbGxVcEJvZHkpe3kuZmlsbFJlY3Q9dHJ1ZX1lbHNle3kuc3Ryb2tlUmVjdD10cnVlO249bi10aGlzLmxpbmVXaWR0aDtPPW0tbi8yfWlmKHUudXBCb2R5Q29sb3Ipe3kuY29sb3I9dS51cEJvZHlDb2xvcjt5LmZpbGxTdHlsZT11LnVwQm9keUNvbG9yfUM9W08sTSxuLEZdfWVsc2V7aWYodD5xKXtpZih1LndpY2tDb2xvcil7eS5jb2xvcj11LndpY2tDb2xvcn1lbHNle2lmKHUuZG93bkJvZHlDb2xvcil7eS5jb2xvcj11LmRvd25Cb2R5Q29sb3J9fWY9YS5leHRlbmQodHJ1ZSx7fSxzLHkpO3Uuc2hhcGVSZW5kZXJlci5kcmF3KEEsW1ttLGddLFttLHFdXSxmKTt1LnNoYXBlUmVuZGVyZXIuZHJhdyhBLFtbbSx0XSxbbSxRXV0sZik7eT17fTtNPXE7Rj10LXE7aWYodS5maWxsRG93bkJvZHkpe3kuZmlsbFJlY3Q9dHJ1ZX1lbHNle3kuc3Ryb2tlUmVjdD10cnVlO249bi10aGlzLmxpbmVXaWR0aDtPPW0tbi8yfWlmKHUuZG93bkJvZHlDb2xvcil7eS5jb2xvcj11LmRvd25Cb2R5Q29sb3I7eS5maWxsU3R5bGU9dS5kb3duQm9keUNvbG9yfUM9W08sTSxuLEZdfWVsc2V7aWYodS53aWNrQ29sb3Ipe3kuY29sb3I9dS53aWNrQ29sb3J9Zj1hLmV4dGVuZCh0cnVlLHt9LHMseSk7dS5zaGFwZVJlbmRlcmVyLmRyYXcoQSxbW20sZ10sW20sUV1dLGYpO3k9e307eS5maWxsUmVjdD1mYWxzZTt5LnN0cm9rZVJlY3Q9ZmFsc2U7Tz1bbS1uLzIscV07TT1bbStuLzIsdF07bj1udWxsO0Y9bnVsbDtDPVtPLE1dfX1mPWEuZXh0ZW5kKHRydWUse30scyx5KTt1LnNoYXBlUmVuZGVyZXIuZHJhdyhBLEMsZil9ZWxzZXtFPXMuY29sb3I7aWYodS5vcGVuQ29sb3Ipe3MuY29sb3I9dS5vcGVuQ29sb3J9aWYoIXUuaGxjKXt1LnNoYXBlUmVuZGVyZXIuZHJhdyhBLFtbbS11Ll90aWNrTGVuZ3RoLHFdLFttLHFdXSxzKX1zLmNvbG9yPUU7aWYodS53aWNrQ29sb3Ipe3MuY29sb3I9dS53aWNrQ29sb3J9dS5zaGFwZVJlbmRlcmVyLmRyYXcoQSxbW20sZ10sW20sUV1dLHMpO3MuY29sb3I9RTtpZih1LmNsb3NlQ29sb3Ipe3MuY29sb3I9dS5jbG9zZUNvbG9yfXUuc2hhcGVSZW5kZXJlci5kcmF3KEEsW1ttLHRdLFttK3UuX3RpY2tMZW5ndGgsdF1dLHMpO3MuY29sb3I9RX19fUEucmVzdG9yZSgpfTthLmpxcGxvdC5PSExDUmVuZGVyZXIucHJvdG90eXBlLmRyYXdTaGFkb3c9ZnVuY3Rpb24oYixkLGMpe307YS5qcXBsb3QuT0hMQ1JlbmRlcmVyLmNoZWNrT3B0aW9ucz1mdW5jdGlvbihkLGMsYil7aWYoIWIuaGlnaGxpZ2h0ZXIpe2IuaGlnaGxpZ2h0ZXI9e3Nob3dNYXJrZXI6ZmFsc2UsdG9vbHRpcEF4ZXM6InkiLHl2YWx1ZXM6NCxmb3JtYXRTdHJpbmc6Jzx0YWJsZSBjbGFzcz0ianFwbG90LWhpZ2hsaWdodGVyIj48dHI+PHRkPmRhdGU6PC90ZD48dGQ+JXM8L3RkPjwvdHI+PHRyPjx0ZD5vcGVuOjwvdGQ+PHRkPiVzPC90ZD48L3RyPjx0cj48dGQ+aGk6PC90ZD48dGQ+JXM8L3RkPjwvdHI+PHRyPjx0ZD5sb3c6PC90ZD48dGQ+JXM8L3RkPjwvdHI+PHRyPjx0ZD5jbG9zZTo8L3RkPjx0ZD4lczwvdGQ+PC90cj48L3RhYmxlPid9fX19KShqUXVlcnkpOw==]]></data>
	</file>
	<file>
	  <filename>/src/plugins/jqplot.pieRenderer.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqCiAqIGpxUGxvdAogKiBQdXJlIEphdmFTY3JpcHQgcGxvdHRpbmcgcGx1Z2luIHVzaW5nIGpRdWVyeQogKgogKiBWZXJzaW9uOiAxLjAuMGIyX3IxMDEyCiAqCiAqIENvcHlyaWdodCAoYykgMjAwOS0yMDExIENocmlzIExlb25lbGxvCiAqIGpxUGxvdCBpcyBjdXJyZW50bHkgYXZhaWxhYmxlIGZvciB1c2UgaW4gYWxsIHBlcnNvbmFsIG9yIGNvbW1lcmNpYWwgcHJvamVjdHMgCiAqIHVuZGVyIGJvdGggdGhlIE1JVCAoaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHApIGFuZCBHUEwgCiAqIHZlcnNpb24gMi4wIChodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC5odG1sKSBsaWNlbnNlcy4gVGhpcyBtZWFucyB0aGF0IHlvdSBjYW4gCiAqIGNob29zZSB0aGUgbGljZW5zZSB0aGF0IGJlc3Qgc3VpdHMgeW91ciBwcm9qZWN0IGFuZCB1c2UgaXQgYWNjb3JkaW5nbHkuIAogKgogKiBBbHRob3VnaCBub3QgcmVxdWlyZWQsIHRoZSBhdXRob3Igd291bGQgYXBwcmVjaWF0ZSBhbiBlbWFpbCBsZXR0aW5nIGhpbSAKICoga25vdyBvZiBhbnkgc3Vic3RhbnRpYWwgdXNlIG9mIGpxUGxvdC4gIFlvdSBjYW4gcmVhY2ggdGhlIGF1dGhvciBhdDogCiAqIGNocmlzIGF0IGpxcGxvdCBkb3QgY29tIG9yIHNlZSBodHRwOi8vd3d3LmpxcGxvdC5jb20vaW5mby5waHAgLgogKgogKiBJZiB5b3UgYXJlIGZlZWxpbmcga2luZCBhbmQgZ2VuZXJvdXMsIGNvbnNpZGVyIHN1cHBvcnRpbmcgdGhlIHByb2plY3QgYnkKICogbWFraW5nIGEgZG9uYXRpb24gYXQ6IGh0dHA6Ly93d3cuanFwbG90LmNvbS9kb25hdGUucGhwIC4KICoKICogc3ByaW50ZiBmdW5jdGlvbnMgY29udGFpbmVkIGluIGpxcGxvdC5zcHJpbnRmLmpzIGJ5IEFzaCBTZWFybGU6CiAqCiAqICAgICB2ZXJzaW9uIDIwMDcuMDQuMjcKICogICAgIGF1dGhvciBBc2ggU2VhcmxlCiAqICAgICBodHRwOi8vaGV4bWVuLmNvbS9ibG9nLzIwMDcvMDMvcHJpbnRmLXNwcmludGYvCiAqICAgICBodHRwOi8vaGV4bWVuLmNvbS9qcy9zcHJpbnRmLmpzCiAqICAgICBUaGUgYXV0aG9yIChBc2ggU2VhcmxlKSBoYXMgcGxhY2VkIHRoaXMgY29kZSBpbiB0aGUgcHVibGljIGRvbWFpbjoKICogICAgICJUaGlzIGNvZGUgaXMgdW5yZXN0cmljdGVkOiB5b3UgYXJlIGZyZWUgdG8gdXNlIGl0IGhvd2V2ZXIgeW91IGxpa2UuIgogKiAKICovCihmdW5jdGlvbigkKSB7CiAgICAvKioKICAgICAqIENsYXNzOiAkLmpxcGxvdC5QaWVSZW5kZXJlcgogICAgICogUGx1Z2luIHJlbmRlcmVyIHRvIGRyYXcgYSBwaWUgY2hhcnQuCiAgICAgKiB4IHZhbHVlcywgaWYgcHJlc2VudCwgd2lsbCBiZSB1c2VkIGFzIHNsaWNlIGxhYmVscy4KICAgICAqIHkgdmFsdWVzIGdpdmUgc2xpY2Ugc2l6ZS4KICAgICAqIAogICAgICogVG8gdXNlIHRoaXMgcmVuZGVyZXIsIHlvdSBuZWVkIHRvIGluY2x1ZGUgdGhlIAogICAgICogcGllIHJlbmRlcmVyIHBsdWdpbiwgZm9yIGV4YW1wbGU6CiAgICAgKiAKICAgICAqID4gPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0icGx1Z2lucy9qcXBsb3QucGllUmVuZGVyZXIuanMiPjwvc2NyaXB0PgogICAgICogCiAgICAgKiBQcm9wZXJ0aWVzIGRlc2NyaWJlZCBoZXJlIGFyZSBwYXNzZWQgaW50byB0aGUgJC5qcXBsb3QgZnVuY3Rpb24KICAgICAqIGFzIG9wdGlvbnMgb24gdGhlIHNlcmllcyByZW5kZXJlci4gIEZvciBleGFtcGxlOgogICAgICogCiAgICAgKiA+IHBsb3QyID0gJC5qcXBsb3QoJ2NoYXJ0MicsIFtzMSwgczJdLCB7CiAgICAgKiA+ICAgICBzZXJpZXNEZWZhdWx0czogewogICAgICogPiAgICAgICAgIHJlbmRlcmVyOiQuanFwbG90LlBpZVJlbmRlcmVyLAogICAgICogPiAgICAgICAgIHJlbmRlcmVyT3B0aW9uczp7CiAgICAgKiA+ICAgICAgICAgICAgICBzbGljZU1hcmdpbjogMiwKICAgICAqID4gICAgICAgICAgICAgIHN0YXJ0QW5nbGU6IC05MAogICAgICogPiAgICAgICAgICB9CiAgICAgKiA+ICAgICAgfQogICAgICogPiB9KTsKICAgICAqIAogICAgICogQSBwaWUgcGxvdCB3aWxsIHRyaWdnZXIgZXZlbnRzIG9uIHRoZSBwbG90IHRhcmdldAogICAgICogYWNjb3JkaW5nIHRvIHVzZXIgaW50ZXJhY3Rpb24uICBBbGwgZXZlbnRzIHJldHVybiB0aGUgZXZlbnQgb2JqZWN0LAogICAgICogdGhlIHNlcmllcyBpbmRleCwgdGhlIHBvaW50IChzbGljZSkgaW5kZXgsIGFuZCB0aGUgcG9pbnQgZGF0YSBmb3IgCiAgICAgKiB0aGUgYXBwcm9wcmlhdGUgc2xpY2UuCiAgICAgKiAKICAgICAqICdqcXBsb3REYXRhTW91c2VPdmVyJyAtIHRyaWdnZXJlZCB3aGVuIHVzZXIgbW91c2Vpbmcgb3ZlciBhIHNsaWNlLgogICAgICogJ2pxcGxvdERhdGFIaWdobGlnaHQnIC0gdHJpZ2dlcmVkIHRoZSBmaXJzdCB0aW1lIHVzZXIgbW91c2VzIG92ZXIgYSBzbGljZSwKICAgICAqIGlmIGhpZ2hsaWdodGluZyBpcyBlbmFibGVkLgogICAgICogJ2pxcGxvdERhdGFVbmhpZ2hsaWdodCcgLSB0cmlnZ2VyZWQgd2hlbiBhIHVzZXIgbW92ZXMgdGhlIG1vdXNlIG91dCBvZgogICAgICogYSBoaWdobGlnaHRlZCBzbGljZS4KICAgICAqICdqcXBsb3REYXRhQ2xpY2snIC0gdHJpZ2dlcmVkIHdoZW4gdGhlIHVzZXIgY2xpY2tzIG9uIGEgc2xpY2UuCiAgICAgKiAnanFwbG90RGF0YVJpZ2h0Q2xpY2snIC0gdGlnZ2VyZWQgd2hlbiB0aGUgdXNlciByaWdodCBjbGlja3Mgb24gYSBzbGljZSBpZgogICAgICogdGhlICJjYXB0dXJlUmlnaHRDbGljayIgb3B0aW9uIGlzIHNldCB0byB0cnVlIG9uIHRoZSBwbG90LgogICAgICovCiAgICAkLmpxcGxvdC5QaWVSZW5kZXJlciA9IGZ1bmN0aW9uKCl7CiAgICAgICAgJC5qcXBsb3QuTGluZVJlbmRlcmVyLmNhbGwodGhpcyk7CiAgICB9OwogICAgCiAgICAkLmpxcGxvdC5QaWVSZW5kZXJlci5wcm90b3R5cGUgPSBuZXcgJC5qcXBsb3QuTGluZVJlbmRlcmVyKCk7CiAgICAkLmpxcGxvdC5QaWVSZW5kZXJlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSAkLmpxcGxvdC5QaWVSZW5kZXJlcjsKICAgIAogICAgLy8gY2FsbGVkIHdpdGggc2NvcGUgb2YgYSBzZXJpZXMKICAgICQuanFwbG90LlBpZVJlbmRlcmVyLnByb3RvdHlwZS5pbml0ID0gZnVuY3Rpb24ob3B0aW9ucywgcGxvdCkgewogICAgICAgIC8vIEdyb3VwOiBQcm9wZXJ0aWVzCiAgICAgICAgLy8KICAgICAgICAvLyBwcm9wOiBkaWFtZXRlcgogICAgICAgIC8vIE91dGVyIGRpYW1ldGVyIG9mIHRoZSBwaWUsIGF1dG8gY29tcHV0ZWQgYnkgZGVmYXVsdAogICAgICAgIHRoaXMuZGlhbWV0ZXIgPSBudWxsOwogICAgICAgIC8vIHByb3A6IHBhZGRpbmcKICAgICAgICAvLyBwYWRkaW5nIGJldHdlZW4gdGhlIHBpZSBhbmQgcGxvdCBlZGdlcywgbGVnZW5kLCBldGMuCiAgICAgICAgdGhpcy5wYWRkaW5nID0gMjA7CiAgICAgICAgLy8gcHJvcDogc2xpY2VNYXJnaW4KICAgICAgICAvLyBhbmd1bGFyIHNwYWNpbmcgYmV0d2VlbiBwaWUgc2xpY2VzIGluIGRlZ3JlZXMuCiAgICAgICAgdGhpcy5zbGljZU1hcmdpbiA9IDA7CiAgICAgICAgLy8gcHJvcDogZmlsbAogICAgICAgIC8vIHRydWUgb3IgZmFsc2UsIHdldGhlciB0byBmaWwgdGhlIHNsaWNlcy4KICAgICAgICB0aGlzLmZpbGwgPSB0cnVlOwogICAgICAgIC8vIHByb3A6IHNoYWRvd09mZnNldAogICAgICAgIC8vIG9mZnNldCBvZiB0aGUgc2hhZG93IGZyb20gdGhlIHNsaWNlIGFuZCBvZmZzZXQgb2YgCiAgICAgICAgLy8gZWFjaCBzdWNjZXNpdmUgc3Ryb2tlIG9mIHRoZSBzaGFkb3cgZnJvbSB0aGUgbGFzdC4KICAgICAgICB0aGlzLnNoYWRvd09mZnNldCA9IDI7CiAgICAgICAgLy8gcHJvcDogc2hhZG93QWxwaGEKICAgICAgICAvLyB0cmFuc3BhcmVuY3kgb2YgdGhlIHNoYWRvdyAoMCA9IHRyYW5zcGFyZW50LCAxID0gb3BhcXVlKQogICAgICAgIHRoaXMuc2hhZG93QWxwaGEgPSAwLjA3OwogICAgICAgIC8vIHByb3A6IHNoYWRvd0RlcHRoCiAgICAgICAgLy8gbnVtYmVyIG9mIHN0cm9rZXMgdG8gYXBwbHkgdG8gdGhlIHNoYWRvdywgCiAgICAgICAgLy8gZWFjaCBzdHJva2Ugb2Zmc2V0IHNoYWRvd09mZnNldCBmcm9tIHRoZSBsYXN0LgogICAgICAgIHRoaXMuc2hhZG93RGVwdGggPSA1OwogICAgICAgIC8vIHByb3A6IGhpZ2hsaWdodE1vdXNlT3ZlcgogICAgICAgIC8vIFRydWUgdG8gaGlnaGxpZ2h0IHNsaWNlIHdoZW4gbW91c2VkIG92ZXIuCiAgICAgICAgLy8gVGhpcyBtdXN0IGJlIGZhbHNlIHRvIGVuYWJsZSBoaWdobGlnaHRNb3VzZURvd24gdG8gaGlnaGxpZ2h0IHdoZW4gY2xpY2tpbmcgb24gYSBzbGljZS4KICAgICAgICB0aGlzLmhpZ2hsaWdodE1vdXNlT3ZlciA9IHRydWU7CiAgICAgICAgLy8gcHJvcDogaGlnaGxpZ2h0TW91c2VEb3duCiAgICAgICAgLy8gVHJ1ZSB0byBoaWdobGlnaHQgd2hlbiBhIG1vdXNlIGJ1dHRvbiBpcyBwcmVzc2VkIG92ZXIgYSBzbGljZS4KICAgICAgICAvLyBUaGlzIHdpbGwgYmUgZGlzYWJsZWQgaWYgaGlnaGxpZ2h0TW91c2VPdmVyIGlzIHRydWUuCiAgICAgICAgdGhpcy5oaWdobGlnaHRNb3VzZURvd24gPSBmYWxzZTsKICAgICAgICAvLyBwcm9wOiBoaWdobGlnaHRDb2xvcnMKICAgICAgICAvLyBhbiBhcnJheSBvZiBjb2xvcnMgdG8gdXNlIHdoZW4gaGlnaGxpZ2h0aW5nIGEgc2xpY2UuCiAgICAgICAgdGhpcy5oaWdobGlnaHRDb2xvcnMgPSBbXTsKICAgICAgICAvLyBwcm9wOiBkYXRhTGFiZWxzCiAgICAgICAgLy8gRWl0aGVyICdsYWJlbCcsICd2YWx1ZScsICdwZXJjZW50JyBvciBhbiBhcnJheSBvZiBsYWJlbHMgdG8gcGxhY2Ugb24gdGhlIHBpZSBzbGljZXMuCiAgICAgICAgLy8gRGVmYXVsdHMgdG8gcGVyY2VudGFnZSBvZiBlYWNoIHBpZSBzbGljZS4KICAgICAgICB0aGlzLmRhdGFMYWJlbHMgPSAncGVyY2VudCc7CiAgICAgICAgLy8gcHJvcDogc2hvd0RhdGFMYWJlbHMKICAgICAgICAvLyB0cnVlIHRvIHNob3cgZGF0YSBsYWJlbHMgb24gc2xpY2VzLgogICAgICAgIHRoaXMuc2hvd0RhdGFMYWJlbHMgPSBmYWxzZTsKICAgICAgICAvLyBwcm9wOiBkYXRhTGFiZWxGb3JtYXRTdHJpbmcKICAgICAgICAvLyBGb3JtYXQgc3RyaW5nIGZvciBkYXRhIGxhYmVscy4gIElmIG5vbmUsICclcycgaXMgdXNlZCBmb3IgImxhYmVsIiBhbmQgZm9yIGFycmF5cywgJyVkJyBmb3IgdmFsdWUgYW5kICclZCUlJyBmb3IgcGVyY2VudGFnZS4KICAgICAgICB0aGlzLmRhdGFMYWJlbEZvcm1hdFN0cmluZyA9IG51bGw7CiAgICAgICAgLy8gcHJvcDogZGF0YUxhYmVsVGhyZXNob2xkCiAgICAgICAgLy8gVGhyZXNoaG9sZCBpbiBwZXJjZW50YWdlICgwLTEwMCkgb2YgcGllIGFyZWEsIGJlbG93IHdoaWNoIG5vIGxhYmVsIHdpbGwgYmUgZGlzcGxheWVkLgogICAgICAgIC8vIFRoaXMgYXBwbGllcyB0byBhbGwgbGFiZWwgdHlwZXMsIG5vdCBqdXN0IHRvIHBlcmNlbnRhZ2UgbGFiZWxzLgogICAgICAgIHRoaXMuZGF0YUxhYmVsVGhyZXNob2xkID0gMzsKICAgICAgICAvLyBwcm9wOiBkYXRhTGFiZWxQb3NpdGlvbkZhY3RvcgogICAgICAgIC8vIEEgTXVsdGlwbGllciAoMC0xKSBvZiB0aGUgcGllIHJhZGl1cyB3aGljaCBjb250cm9scyBwb3NpdGlvbiBvZiBsYWJlbCBvbiBzbGljZS4KICAgICAgICAvLyBJbmNyZWFzaW5nIHdpbGwgc2xpZGUgbGFiZWwgdG93YXJkIGVkZ2Ugb2YgcGllLCBkZWNyZWFzaW5nIHdpbGwgc2xpZGUgbGFiZWwgdG93YXJkIGNlbnRlciBvZiBwaWUuCiAgICAgICAgdGhpcy5kYXRhTGFiZWxQb3NpdGlvbkZhY3RvciA9IDAuNTI7CiAgICAgICAgLy8gcHJvcDogZGF0YUxhYmVsTnVkZ2UKICAgICAgICAvLyBOdW1iZXIgb2YgcGl4ZWxzIHRvIHNsaWRlIHRoZSBsYWJlbCBhd2F5IGZyb20gKCspIG9yIHRvd2FyZCAoLSkgdGhlIGNlbnRlciBvZiB0aGUgcGllLgogICAgICAgIHRoaXMuZGF0YUxhYmVsTnVkZ2UgPSAyOwogICAgICAgIC8vIHByb3A6IGRhdGFMYWJlbENlbnRlck9uCiAgICAgICAgLy8gVHJ1ZSB0byBjZW50ZXIgdGhlIGRhdGEgbGFiZWwgYXQgaXRzIHBvc2l0aW9uLgogICAgICAgIC8vIEZhbHNlIHRvIHNldCB0aGUgaW5zaWRlIGZhY2luZyBlZGdlIG9mIHRoZSBsYWJlbCBhdCBpdHMgcG9zaXRpb24uCiAgICAgICAgdGhpcy5kYXRhTGFiZWxDZW50ZXJPbiA9IHRydWU7CiAgICAgICAgLy8gcHJvcDogc3RhcnRBbmdsZQogICAgICAgIC8vIEFuZ2xlIHRvIHN0YXJ0IGRyYXdpbmcgcGllIGluIGRlZ3JlZXMuICAKICAgICAgICAvLyBBY2NvcmRpbmcgdG8gb3JpZW50YXRpb24gb2YgY2FudmFzIGNvb3JkaW5hdGUgc3lzdGVtOgogICAgICAgIC8vIDAgPSBvbiB0aGUgcG9zaXRpdmUgeCBheGlzCiAgICAgICAgLy8gLTkwID0gb24gdGhlIHBvc2l0aXZlIHkgYXhpcy4KICAgICAgICAvLyA5MCA9IG9uIHRoZSBuZWdhaXZlIHkgYXhpcy4KICAgICAgICAvLyAxODAgb3IgLSAxODAgPSBvbiB0aGUgbmVnYXRpdmUgeCBheGlzLgogICAgICAgIHRoaXMuc3RhcnRBbmdsZSA9IDA7CiAgICAgICAgdGhpcy50aWNrUmVuZGVyZXIgPSAkLmpxcGxvdC5QaWVUaWNrUmVuZGVyZXI7CiAgICAgICAgLy8gVXNlZCBhcyBjaGVjayBmb3IgY29uZGl0aW9ucyB3aGVyZSBwaWUgc2hvdWxkbid0IGJlIGRyYXduLgogICAgICAgIHRoaXMuX2RyYXdEYXRhID0gdHJ1ZTsKICAgICAgICB0aGlzLl90eXBlID0gJ3BpZSc7CiAgICAgICAgCiAgICAgICAgLy8gaWYgdXNlciBoYXMgcGFzc2VkIGluIGhpZ2hsaWdodE1vdXNlRG93biBvcHRpb24gYW5kIG5vdCBzZXQgaGlnaGxpZ2h0TW91c2VPdmVyLCBkaXNhYmxlIGhpZ2hsaWdodE1vdXNlT3ZlcgogICAgICAgIGlmIChvcHRpb25zLmhpZ2hsaWdodE1vdXNlRG93biAmJiBvcHRpb25zLmhpZ2hsaWdodE1vdXNlT3ZlciA9PSBudWxsKSB7CiAgICAgICAgICAgIG9wdGlvbnMuaGlnaGxpZ2h0TW91c2VPdmVyID0gZmFsc2U7CiAgICAgICAgfQogICAgICAgIAogICAgICAgICQuZXh0ZW5kKHRydWUsIHRoaXMsIG9wdGlvbnMpOwoKICAgICAgICBpZiAodGhpcy5zbGljZU1hcmdpbiA8IDApIHsKICAgICAgICAgICAgdGhpcy5zbGljZU1hcmdpbiA9IDA7CiAgICAgICAgfQoKICAgICAgICB0aGlzLl9kaWFtZXRlciA9IG51bGw7CiAgICAgICAgdGhpcy5fcmFkaXVzID0gbnVsbDsKICAgICAgICAvLyBhcnJheSBvZiBbc3RhcnQsZW5kXSBhbmdsZXMgYXJyYXlzLCBvbmUgZm9yIGVhY2ggc2xpY2UuICBJbiByYWRpYW5zLgogICAgICAgIHRoaXMuX3NsaWNlQW5nbGVzID0gW107CiAgICAgICAgLy8gaW5kZXggb2YgdGhlIGN1cnJlbnR5IGhpZ2hsaWdodGVkIHBvaW50LCBpZiBhbnkKICAgICAgICB0aGlzLl9oaWdobGlnaHRlZFBvaW50ID0gbnVsbDsKICAgICAgICAKICAgICAgICAvLyBzZXQgaGlnaGxpZ2h0IGNvbG9ycyBpZiBub25lIHByb3ZpZGVkCiAgICAgICAgaWYgKHRoaXMuaGlnaGxpZ2h0Q29sb3JzLmxlbmd0aCA9PSAwKSB7CiAgICAgICAgICAgIGZvciAodmFyIGk9MDsgaTx0aGlzLnNlcmllc0NvbG9ycy5sZW5ndGg7IGkrKyl7CiAgICAgICAgICAgICAgICB2YXIgcmdiYSA9ICQuanFwbG90LmdldENvbG9yQ29tcG9uZW50cyh0aGlzLnNlcmllc0NvbG9yc1tpXSk7CiAgICAgICAgICAgICAgICB2YXIgbmV3cmdiID0gW3JnYmFbMF0sIHJnYmFbMV0sIHJnYmFbMl1dOwogICAgICAgICAgICAgICAgdmFyIHN1bSA9IG5ld3JnYlswXSArIG5ld3JnYlsxXSArIG5ld3JnYlsyXTsKICAgICAgICAgICAgICAgIGZvciAodmFyIGo9MDsgajwzOyBqKyspIHsKICAgICAgICAgICAgICAgICAgICAvLyB3aGVuIGRhcmtlbmluZywgbG93ZXN0IGNvbG9yIGNvbXBvbmVudCBjYW4gYmUgaXMgNjAuCiAgICAgICAgICAgICAgICAgICAgbmV3cmdiW2pdID0gKHN1bSA+IDU3MCkgPyAgbmV3cmdiW2pdICogMC44IDogbmV3cmdiW2pdICsgMC4zICogKDI1NSAtIG5ld3JnYltqXSk7CiAgICAgICAgICAgICAgICAgICAgbmV3cmdiW2pdID0gcGFyc2VJbnQobmV3cmdiW2pdLCAxMCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aGlzLmhpZ2hsaWdodENvbG9ycy5wdXNoKCdyZ2IoJytuZXdyZ2JbMF0rJywnK25ld3JnYlsxXSsnLCcrbmV3cmdiWzJdKycpJyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgdGhpcy5oaWdobGlnaHRDb2xvckdlbmVyYXRvciA9IG5ldyAkLmpxcGxvdC5Db2xvckdlbmVyYXRvcih0aGlzLmhpZ2hsaWdodENvbG9ycyk7CiAgICAgICAgCiAgICAgICAgcGxvdC5wb3N0UGFyc2VPcHRpb25zSG9va3MuYWRkT25jZShwb3N0UGFyc2VPcHRpb25zKTsKICAgICAgICBwbG90LnBvc3RJbml0SG9va3MuYWRkT25jZShwb3N0SW5pdCk7CiAgICAgICAgcGxvdC5ldmVudExpc3RlbmVySG9va3MuYWRkT25jZSgnanFwbG90TW91c2VNb3ZlJywgaGFuZGxlTW92ZSk7CiAgICAgICAgcGxvdC5ldmVudExpc3RlbmVySG9va3MuYWRkT25jZSgnanFwbG90TW91c2VEb3duJywgaGFuZGxlTW91c2VEb3duKTsKICAgICAgICBwbG90LmV2ZW50TGlzdGVuZXJIb29rcy5hZGRPbmNlKCdqcXBsb3RNb3VzZVVwJywgaGFuZGxlTW91c2VVcCk7CiAgICAgICAgcGxvdC5ldmVudExpc3RlbmVySG9va3MuYWRkT25jZSgnanFwbG90Q2xpY2snLCBoYW5kbGVDbGljayk7CiAgICAgICAgcGxvdC5ldmVudExpc3RlbmVySG9va3MuYWRkT25jZSgnanFwbG90UmlnaHRDbGljaycsIGhhbmRsZVJpZ2h0Q2xpY2spOwogICAgICAgIHBsb3QucG9zdERyYXdIb29rcy5hZGRPbmNlKHBvc3RQbG90RHJhdyk7CiAgICB9OwogICAgCiAgICAkLmpxcGxvdC5QaWVSZW5kZXJlci5wcm90b3R5cGUuc2V0R3JpZERhdGEgPSBmdW5jdGlvbihwbG90KSB7CiAgICAgICAgLy8gc2V0IGdyaWREYXRhIHByb3BlcnR5LiAgVGhpcyB3aWxsIGhvbGQgYW5nbGUgaW4gcmFkaWFucyBvZiBlYWNoIGRhdGEgcG9pbnQuCiAgICAgICAgdmFyIHN0YWNrID0gW107CiAgICAgICAgdmFyIHRkID0gW107CiAgICAgICAgdmFyIHNhID0gdGhpcy5zdGFydEFuZ2xlLzE4MCpNYXRoLlBJOwogICAgICAgIHZhciB0b3QgPSAwOwogICAgICAgIC8vIGRvbid0IGtub3cgaWYgd2UgaGF2ZSBhbnkgdmFsaWQgZGF0YSB5ZXQsIHNvIHNldCBwbG90IHRvIG5vdCBkcmF3LgogICAgICAgIHRoaXMuX2RyYXdEYXRhID0gZmFsc2U7CiAgICAgICAgZm9yICh2YXIgaT0wOyBpPHRoaXMuZGF0YS5sZW5ndGg7IGkrKyl7CiAgICAgICAgICAgIGlmICh0aGlzLmRhdGFbaV1bMV0gIT0gMCkgewogICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSBkYXRhLCBPLksuIHRvIGRyYXcuCiAgICAgICAgICAgICAgICB0aGlzLl9kcmF3RGF0YSA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3RhY2sucHVzaCh0aGlzLmRhdGFbaV1bMV0pOwogICAgICAgICAgICB0ZC5wdXNoKFt0aGlzLmRhdGFbaV1bMF1dKTsKICAgICAgICAgICAgaWYgKGk+MCkgewogICAgICAgICAgICAgICAgc3RhY2tbaV0gKz0gc3RhY2tbaS0xXTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0b3QgKz0gdGhpcy5kYXRhW2ldWzFdOwogICAgICAgIH0KICAgICAgICB2YXIgZmFjdCA9IE1hdGguUEkqMi9zdGFja1tzdGFjay5sZW5ndGggLSAxXTsKICAgICAgICAKICAgICAgICBmb3IgKHZhciBpPTA7IGk8c3RhY2subGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgdGRbaV1bMV0gPSBzdGFja1tpXSAqIGZhY3Q7CiAgICAgICAgICAgIHRkW2ldWzJdID0gdGhpcy5kYXRhW2ldWzFdL3RvdDsKICAgICAgICB9CiAgICAgICAgdGhpcy5ncmlkRGF0YSA9IHRkOwogICAgfTsKICAgIAogICAgJC5qcXBsb3QuUGllUmVuZGVyZXIucHJvdG90eXBlLm1ha2VHcmlkRGF0YSA9IGZ1bmN0aW9uKGRhdGEsIHBsb3QpIHsKICAgICAgICB2YXIgc3RhY2sgPSBbXTsKICAgICAgICB2YXIgdGQgPSBbXTsKICAgICAgICB2YXIgdG90ID0gMDsKICAgICAgICB2YXIgc2EgPSB0aGlzLnN0YXJ0QW5nbGUvMTgwKk1hdGguUEk7CiAgICAgICAgLy8gZG9uJ3Qga25vdyBpZiB3ZSBoYXZlIGFueSB2YWxpZCBkYXRhIHlldCwgc28gc2V0IHBsb3QgdG8gbm90IGRyYXcuCiAgICAgICAgdGhpcy5fZHJhd0RhdGEgPSBmYWxzZTsKICAgICAgICBmb3IgKHZhciBpPTA7IGk8ZGF0YS5sZW5ndGg7IGkrKyl7CiAgICAgICAgICAgIGlmICh0aGlzLmRhdGFbaV1bMV0gIT0gMCkgewogICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSBkYXRhLCBPLksuIHRvIGRyYXcuCiAgICAgICAgICAgICAgICB0aGlzLl9kcmF3RGF0YSA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3RhY2sucHVzaChkYXRhW2ldWzFdKTsKICAgICAgICAgICAgdGQucHVzaChbZGF0YVtpXVswXV0pOwogICAgICAgICAgICBpZiAoaT4wKSB7CiAgICAgICAgICAgICAgICBzdGFja1tpXSArPSBzdGFja1tpLTFdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRvdCArPSBkYXRhW2ldWzFdOwogICAgICAgIH0KICAgICAgICB2YXIgZmFjdCA9IE1hdGguUEkqMi9zdGFja1tzdGFjay5sZW5ndGggLSAxXTsKICAgICAgICAKICAgICAgICBmb3IgKHZhciBpPTA7IGk8c3RhY2subGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgdGRbaV1bMV0gPSBzdGFja1tpXSAqIGZhY3Q7CiAgICAgICAgICAgIHRkW2ldWzJdID0gZGF0YVtpXVsxXS90b3Q7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0ZDsKICAgIH07CgogICAgZnVuY3Rpb24gY2FsY1JhZGl1c0FkanVzdG1lbnQoYW5nKSB7CiAgICAgICAgcmV0dXJuIE1hdGguc2luKChhbmcgLSAoYW5nLU1hdGguUEkpIC8gOCAvIE1hdGguUEkgKS8yLjApOwogICAgfQoKICAgIGZ1bmN0aW9uIGNhbGNSUHJpbWUoYW5nMSwgYW5nMiwgc2xpY2VNYXJnaW4sIGZpbGwsIGxpbmVXaWR0aCkgewogICAgICAgIHZhciBycHJpbWUgPSAwOwogICAgICAgIHZhciBhbmcgPSBhbmcyIC0gYW5nMTsKICAgICAgICB2YXIgYWJzYW5nID0gTWF0aC5hYnMoYW5nKTsKICAgICAgICB2YXIgc20gPSBzbGljZU1hcmdpbjsKICAgICAgICBpZiAoZmlsbCA9PSBmYWxzZSkgewogICAgICAgICAgICBzbSArPSBsaW5lV2lkdGg7CiAgICAgICAgfQoKICAgICAgICBpZiAoc20gPiAwICYmIGFic2FuZyA+IDAuMDEgJiYgYWJzYW5nIDwgNi4yODIpIHsKICAgICAgICAgICAgcnByaW1lID0gcGFyc2VGbG9hdChzbSkgLyAyLjAgLyBjYWxjUmFkaXVzQWRqdXN0bWVudChhbmcpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHJwcmltZTsKICAgIH0KICAgIAogICAgJC5qcXBsb3QuUGllUmVuZGVyZXIucHJvdG90eXBlLmRyYXdTbGljZSA9IGZ1bmN0aW9uIChjdHgsIGFuZzEsIGFuZzIsIGNvbG9yLCBpc1NoYWRvdykgewogICAgICAgIGlmICh0aGlzLl9kcmF3RGF0YSkgewogICAgICAgICAgICB2YXIgciA9IHRoaXMuX3JhZGl1czsKICAgICAgICAgICAgdmFyIGZpbGwgPSB0aGlzLmZpbGw7CiAgICAgICAgICAgIHZhciBsaW5lV2lkdGggPSB0aGlzLmxpbmVXaWR0aDsKICAgICAgICAgICAgdmFyIHNtID0gdGhpcy5zbGljZU1hcmdpbjsKICAgICAgICAgICAgaWYgKHRoaXMuZmlsbCA9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgc20gKz0gdGhpcy5saW5lV2lkdGg7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY3R4LnNhdmUoKTsKICAgICAgICAgICAgY3R4LnRyYW5zbGF0ZSh0aGlzLl9jZW50ZXJbMF0sIHRoaXMuX2NlbnRlclsxXSk7CiAgICAgICAgICAgIAogICAgICAgICAgICB2YXIgcnByaW1lID0gY2FsY1JQcmltZShhbmcxLCBhbmcyLCB0aGlzLnNsaWNlTWFyZ2luLCB0aGlzLmZpbGwsIHRoaXMubGluZVdpZHRoKTsKCiAgICAgICAgICAgIHZhciB0cmFuc3ggPSBycHJpbWUgKiBNYXRoLmNvcygoYW5nMSArIGFuZzIpIC8gMi4wKTsKICAgICAgICAgICAgdmFyIHRyYW5zeSA9IHJwcmltZSAqIE1hdGguc2luKChhbmcxICsgYW5nMikgLyAyLjApOwoKICAgICAgICAgICAgaWYgKChhbmcyIC0gYW5nMSkgPD0gTWF0aC5QSSkgewogICAgICAgICAgICAgICAgciAtPSBycHJpbWU7ICAKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHIgKz0gcnByaW1lOwogICAgICAgICAgICB9CgogICAgICAgICAgICBjdHgudHJhbnNsYXRlKHRyYW5zeCwgdHJhbnN5KTsKICAgICAgICAgICAgCiAgICAgICAgICAgIGlmIChpc1NoYWRvdykgewogICAgICAgICAgICAgICAgZm9yICh2YXIgaT0wLCBsPXRoaXMuc2hhZG93RGVwdGg7IGk8bDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgY3R4LnNhdmUoKTsKICAgICAgICAgICAgICAgICAgICBjdHgudHJhbnNsYXRlKHRoaXMuc2hhZG93T2Zmc2V0Kk1hdGguY29zKHRoaXMuc2hhZG93QW5nbGUvMTgwKk1hdGguUEkpLCB0aGlzLnNoYWRvd09mZnNldCpNYXRoLnNpbih0aGlzLnNoYWRvd0FuZ2xlLzE4MCpNYXRoLlBJKSk7CiAgICAgICAgICAgICAgICAgICAgZG9EcmF3KHIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZm9yICh2YXIgaT0wLCBsPXRoaXMuc2hhZG93RGVwdGg7IGk8bDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgY3R4LnJlc3RvcmUoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgCiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgZG9EcmF3KHIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGN0eC5yZXN0b3JlKCk7CiAgICAgICAgfQogICAgCiAgICAgICAgZnVuY3Rpb24gZG9EcmF3IChyYWQpIHsKICAgICAgICAgICAgLy8gRml4IGZvciBJRSBhbmQgQ2hyb21lIHRoYXQgY2FuJ3Qgc2VlbSB0byBkcmF3IGNpcmNsZXMgY29ycmVjdGx5LgogICAgICAgICAgICAvLyBhbmcyIHNob3VsZCBhbHdheXMgYmUgPD0gMiBwaSBzaW5jZSB0aGF0IGlzIHRoZSB3YXkgdGhlIGRhdGEgaXMgY29udmVydGVkLgogICAgICAgICAgICAvLyAyUGkgPSA2LjI4MzE4NTMsIFBpID0gMy4xNDE1OTI3CiAgICAgICAgICAgICBpZiAoYW5nMiA+IDYuMjgyICsgdGhpcy5zdGFydEFuZ2xlKSB7CiAgICAgICAgICAgICAgICBhbmcyID0gNi4yODIgKyB0aGlzLnN0YXJ0QW5nbGU7CiAgICAgICAgICAgICAgICBpZiAoYW5nMSA+IGFuZzIpIHsKICAgICAgICAgICAgICAgICAgICBhbmcxID0gNi4yODEgKyB0aGlzLnN0YXJ0QW5nbGU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gRml4IGZvciBJRSwgd2hlcmUgaXQgY2FuJ3Qgc2VlbSB0byBoYW5kbGUgMCBkZWdyZWUgYW5nbGVzLiAgQWxzbyBhdm9pZHMKICAgICAgICAgICAgLy8gdWdseSBsaW5lIG9uIHVuZmlsbGVkIHBpZXMuCiAgICAgICAgICAgIGlmIChhbmcxID49IGFuZzIpIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfSAgICAgICAgICAgIAogICAgICAgIAogICAgICAgICAgICBjdHguYmVnaW5QYXRoKCk7ICAKICAgICAgICAgICAgY3R4LmZpbGxTdHlsZSA9IGNvbG9yOwogICAgICAgICAgICBjdHguc3Ryb2tlU3R5bGUgPSBjb2xvcjsKICAgICAgICAgICAgY3R4LmxpbmVXaWR0aCA9IGxpbmVXaWR0aDsKICAgICAgICAgICAgY3R4LmFyYygwLCAwLCByYWQsIGFuZzEsIGFuZzIsIGZhbHNlKTsKICAgICAgICAgICAgY3R4LmxpbmVUbygwLDApOwogICAgICAgICAgICBjdHguY2xvc2VQYXRoKCk7CiAgICAgICAgCiAgICAgICAgICAgIGlmIChmaWxsKSB7CiAgICAgICAgICAgICAgICBjdHguZmlsbCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgY3R4LnN0cm9rZSgpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfTsKICAgIAogICAgLy8gY2FsbGVkIHdpdGggc2NvcGUgb2Ygc2VyaWVzCiAgICAkLmpxcGxvdC5QaWVSZW5kZXJlci5wcm90b3R5cGUuZHJhdyA9IGZ1bmN0aW9uIChjdHgsIGdkLCBvcHRpb25zLCBwbG90KSB7CiAgICAgICAgdmFyIGk7CiAgICAgICAgdmFyIG9wdHMgPSAob3B0aW9ucyAhPSB1bmRlZmluZWQpID8gb3B0aW9ucyA6IHt9OwogICAgICAgIC8vIG9mZnNldCBhbmQgZGlyZWN0aW9uIG9mIG9mZnNldCBkdWUgdG8gbGVnZW5kIHBsYWNlbWVudAogICAgICAgIHZhciBvZmZ4ID0gMDsKICAgICAgICB2YXIgb2ZmeSA9IDA7CiAgICAgICAgdmFyIHRyYW5zID0gMTsKICAgICAgICB2YXIgY29sb3JHZW5lcmF0b3IgPSBuZXcgJC5qcXBsb3QuQ29sb3JHZW5lcmF0b3IodGhpcy5zZXJpZXNDb2xvcnMpOwogICAgICAgIGlmIChvcHRpb25zLmxlZ2VuZEluZm8gJiYgb3B0aW9ucy5sZWdlbmRJbmZvLnBsYWNlbWVudCA9PSAnaW5zaWRlR3JpZCcpIHsKICAgICAgICAgICAgdmFyIGxpID0gb3B0aW9ucy5sZWdlbmRJbmZvOwogICAgICAgICAgICBzd2l0Y2ggKGxpLmxvY2F0aW9uKSB7CiAgICAgICAgICAgICAgICBjYXNlICdudyc6CiAgICAgICAgICAgICAgICAgICAgb2ZmeCA9IGxpLndpZHRoICsgbGkueG9mZnNldDsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJ3cnOgogICAgICAgICAgICAgICAgICAgIG9mZnggPSBsaS53aWR0aCArIGxpLnhvZmZzZXQ7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICdzdyc6CiAgICAgICAgICAgICAgICAgICAgb2ZmeCA9IGxpLndpZHRoICsgbGkueG9mZnNldDsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJ25lJzoKICAgICAgICAgICAgICAgICAgICBvZmZ4ID0gbGkud2lkdGggKyBsaS54b2Zmc2V0OwogICAgICAgICAgICAgICAgICAgIHRyYW5zID0gLTE7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICdlJzoKICAgICAgICAgICAgICAgICAgICBvZmZ4ID0gbGkud2lkdGggKyBsaS54b2Zmc2V0OwogICAgICAgICAgICAgICAgICAgIHRyYW5zID0gLTE7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICdzZSc6CiAgICAgICAgICAgICAgICAgICAgb2ZmeCA9IGxpLndpZHRoICsgbGkueG9mZnNldDsKICAgICAgICAgICAgICAgICAgICB0cmFucyA9IC0xOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAnbic6CiAgICAgICAgICAgICAgICAgICAgb2ZmeSA9IGxpLmhlaWdodCArIGxpLnlvZmZzZXQ7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICdzJzoKICAgICAgICAgICAgICAgICAgICBvZmZ5ID0gbGkuaGVpZ2h0ICsgbGkueW9mZnNldDsKICAgICAgICAgICAgICAgICAgICB0cmFucyA9IC0xOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAKICAgICAgICB2YXIgc2hhZG93ID0gKG9wdHMuc2hhZG93ICE9IHVuZGVmaW5lZCkgPyBvcHRzLnNoYWRvdyA6IHRoaXMuc2hhZG93OwogICAgICAgIHZhciBmaWxsID0gKG9wdHMuZmlsbCAhPSB1bmRlZmluZWQpID8gb3B0cy5maWxsIDogdGhpcy5maWxsOwogICAgICAgIHZhciBjdyA9IGN0eC5jYW52YXMud2lkdGg7CiAgICAgICAgdmFyIGNoID0gY3R4LmNhbnZhcy5oZWlnaHQ7CiAgICAgICAgdmFyIHcgPSBjdyAtIG9mZnggLSAyICogdGhpcy5wYWRkaW5nOwogICAgICAgIHZhciBoID0gY2ggLSBvZmZ5IC0gMiAqIHRoaXMucGFkZGluZzsKICAgICAgICB2YXIgbWluZGltID0gTWF0aC5taW4odyxoKTsKICAgICAgICB2YXIgZCA9IG1pbmRpbTsKICAgICAgICAKICAgICAgICAvLyBGaXhlcyBpc3N1ZSAjMjcyLiAgVGhhbmtzIGh1Z3dpanN0IQogICAgICAgIC8vIHJlc2V0IHNsaWNlIGFuZ2xlcyBhcnJheS4KICAgICAgICB0aGlzLl9zbGljZUFuZ2xlcyA9IFtdOwoKICAgICAgICB2YXIgc20gPSB0aGlzLnNsaWNlTWFyZ2luOwogICAgICAgIGlmICh0aGlzLmZpbGwgPT0gZmFsc2UpIHsKICAgICAgICAgICAgc20gKz0gdGhpcy5saW5lV2lkdGg7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIHZhciBycHJpbWU7CiAgICAgICAgdmFyIG1heHJwcmltZSA9IDA7CgogICAgICAgIHZhciBhbmcsIGFuZzEsIGFuZzIsIHNoYWRvd0NvbG9yOwogICAgICAgIHZhciBzYSA9IHRoaXMuc3RhcnRBbmdsZSAvIDE4MCAqIE1hdGguUEk7CgogICAgICAgIC8vIGhhdmUgdG8gcHJlLWRyYXcgc2hhZG93cywgc28gbG9vcCB0aHJvZ2ggaGVyZSBhbmQgY2FsY3VsYXRlIHNvbWUgdmFsdWVzIGFsc28uCiAgICAgICAgZm9yICh2YXIgaT0wLCBsPWdkLmxlbmd0aDsgaTxsOyBpKyspIHsKICAgICAgICAgICAgYW5nMSA9IChpID09IDApID8gc2EgOiBnZFtpLTFdWzFdICsgc2E7CiAgICAgICAgICAgIGFuZzIgPSBnZFtpXVsxXSArIHNhOwoKICAgICAgICAgICAgdGhpcy5fc2xpY2VBbmdsZXMucHVzaChbYW5nMSwgYW5nMl0pOwoKICAgICAgICAgICAgcnByaW1lID0gY2FsY1JQcmltZShhbmcxLCBhbmcyLCB0aGlzLnNsaWNlTWFyZ2luLCB0aGlzLmZpbGwsIHRoaXMubGluZVdpZHRoKTsKCiAgICAgICAgICAgIGlmIChNYXRoLmFicyhhbmcyLWFuZzEpID4gTWF0aC5QSSkgewogICAgICAgICAgICAgICAgbWF4cnByaW1lID0gTWF0aC5tYXgocnByaW1lLCBtYXhycHJpbWUpOyAgCiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICh0aGlzLmRpYW1ldGVyICE9IG51bGwgJiYgdGhpcy5kaWFtZXRlciA+IDApIHsKICAgICAgICAgICAgdGhpcy5fZGlhbWV0ZXIgPSB0aGlzLmRpYW1ldGVyIC0gMiptYXhycHJpbWU7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICB0aGlzLl9kaWFtZXRlciA9IGQgLSAyKm1heHJwcmltZTsKICAgICAgICB9CgogICAgICAgIC8vIE5lZWQgdG8gY2hlY2sgZm9yIHVuZGVyc2l6ZWQgcGllLiAgVGhpcyBjYW4gaGFwcGVuIGlmCiAgICAgICAgLy8gcGxvdCBhcmVhIHRvbyBzbWFsbCBhbmQgbGVnZW5kIGlzIHRvbyBiaWcuCiAgICAgICAgaWYgKHRoaXMuX2RpYW1ldGVyIDwgNikgewogICAgICAgICAgICAkLmpxcGxvdC5sb2coJ0RpYW1ldGVyIG9mIHBpZSB0b28gc21hbGwsIG5vdCByZW5kZXJpbmcuJyk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIHZhciByID0gdGhpcy5fcmFkaXVzID0gdGhpcy5fZGlhbWV0ZXIvMjsKCiAgICAgICAgdGhpcy5fY2VudGVyID0gWyhjdyAtIHRyYW5zICogb2ZmeCkvMiArIHRyYW5zICogb2ZmeCArIG1heHJwcmltZSAqIE1hdGguY29zKHNhKSwgKGNoIC0gdHJhbnMqb2ZmeSkvMiArIHRyYW5zICogb2ZmeSArIG1heHJwcmltZSAqIE1hdGguc2luKHNhKV07CgogICAgICAgIGlmICh0aGlzLnNoYWRvdykgewogICAgICAgICAgICBmb3IgKHZhciBpPTAsIGw9Z2QubGVuZ3RoOyBpPGw7IGkrKykgewogICAgICAgICAgICAgICAgc2hhZG93Q29sb3IgPSAncmdiYSgwLDAsMCwnK3RoaXMuc2hhZG93QWxwaGErJyknOwogICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5kcmF3U2xpY2UuY2FsbCAodGhpcywgY3R4LCB0aGlzLl9zbGljZUFuZ2xlc1tpXVswXSwgdGhpcy5fc2xpY2VBbmdsZXNbaV1bMV0sIHNoYWRvd0NvbG9yLCB0cnVlKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAKICAgICAgICBmb3IgKHZhciBpPTA7IGk8Z2QubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmRyYXdTbGljZS5jYWxsICh0aGlzLCBjdHgsIHRoaXMuX3NsaWNlQW5nbGVzW2ldWzBdLCB0aGlzLl9zbGljZUFuZ2xlc1tpXVsxXSwgY29sb3JHZW5lcmF0b3IubmV4dCgpLCBmYWxzZSk7CiAgICAgICAgCiAgICAgICAgICAgIGlmICh0aGlzLnNob3dEYXRhTGFiZWxzICYmIGdkW2ldWzJdKjEwMCA+PSB0aGlzLmRhdGFMYWJlbFRocmVzaG9sZCkgewogICAgICAgICAgICAgICAgdmFyIGZzdHIsIGF2Z2FuZyA9ICh0aGlzLl9zbGljZUFuZ2xlc1tpXVswXSArIHRoaXMuX3NsaWNlQW5nbGVzW2ldWzFdKS8yLCBsYWJlbDsKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBpZiAodGhpcy5kYXRhTGFiZWxzID09ICdsYWJlbCcpIHsKICAgICAgICAgICAgICAgICAgICBmc3RyID0gdGhpcy5kYXRhTGFiZWxGb3JtYXRTdHJpbmcgfHwgJyVzJzsKICAgICAgICAgICAgICAgICAgICBsYWJlbCA9ICQuanFwbG90LnNwcmludGYoZnN0ciwgZ2RbaV1bMF0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5kYXRhTGFiZWxzID09ICd2YWx1ZScpIHsKICAgICAgICAgICAgICAgICAgICBmc3RyID0gdGhpcy5kYXRhTGFiZWxGb3JtYXRTdHJpbmcgfHwgJyVkJzsKICAgICAgICAgICAgICAgICAgICBsYWJlbCA9ICQuanFwbG90LnNwcmludGYoZnN0ciwgdGhpcy5kYXRhW2ldWzFdKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuZGF0YUxhYmVscyA9PSAncGVyY2VudCcpIHsKICAgICAgICAgICAgICAgICAgICBmc3RyID0gdGhpcy5kYXRhTGFiZWxGb3JtYXRTdHJpbmcgfHwgJyVkJSUnOwogICAgICAgICAgICAgICAgICAgIGxhYmVsID0gJC5qcXBsb3Quc3ByaW50Zihmc3RyLCBnZFtpXVsyXSoxMDApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5kYXRhTGFiZWxzLmNvbnN0cnVjdG9yID09IEFycmF5KSB7CiAgICAgICAgICAgICAgICAgICAgZnN0ciA9IHRoaXMuZGF0YUxhYmVsRm9ybWF0U3RyaW5nIHx8ICclcyc7CiAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSAkLmpxcGxvdC5zcHJpbnRmKGZzdHIsIHRoaXMuZGF0YUxhYmVsc1tpXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGZhY3QgPSAodGhpcy5fcmFkaXVzICkgKiB0aGlzLmRhdGFMYWJlbFBvc2l0aW9uRmFjdG9yICsgdGhpcy5zbGljZU1hcmdpbiArIHRoaXMuZGF0YUxhYmVsTnVkZ2U7CiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIHggPSB0aGlzLl9jZW50ZXJbMF0gKyBNYXRoLmNvcyhhdmdhbmcpICogZmFjdCArIHRoaXMuY2FudmFzLl9vZmZzZXRzLmxlZnQ7CiAgICAgICAgICAgICAgICB2YXIgeSA9IHRoaXMuX2NlbnRlclsxXSArIE1hdGguc2luKGF2Z2FuZykgKiBmYWN0ICsgdGhpcy5jYW52YXMuX29mZnNldHMudG9wOwogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBsYWJlbGVsZW0gPSAkKCc8ZGl2IGNsYXNzPSJqcXBsb3QtcGllLXNlcmllcyBqcXBsb3QtZGF0YS1sYWJlbCIgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlOyI+JyArIGxhYmVsICsgJzwvZGl2PicpLmluc2VydEJlZm9yZShwbG90LmV2ZW50Q2FudmFzLl9lbGVtKTsKICAgICAgICAgICAgICAgIGlmICh0aGlzLmRhdGFMYWJlbENlbnRlck9uKSB7CiAgICAgICAgICAgICAgICAgICAgeCAtPSBsYWJlbGVsZW0ud2lkdGgoKS8yOwogICAgICAgICAgICAgICAgICAgIHkgLT0gbGFiZWxlbGVtLmhlaWdodCgpLzI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB4IC09IGxhYmVsZWxlbS53aWR0aCgpICogTWF0aC5zaW4oYXZnYW5nLzIpOwogICAgICAgICAgICAgICAgICAgIHkgLT0gbGFiZWxlbGVtLmhlaWdodCgpLzI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB4ID0gTWF0aC5yb3VuZCh4KTsKICAgICAgICAgICAgICAgIHkgPSBNYXRoLnJvdW5kKHkpOwogICAgICAgICAgICAgICAgbGFiZWxlbGVtLmNzcyh7bGVmdDogeCwgdG9wOiB5fSk7CiAgICAgICAgICAgIH0KICAgICAgICB9ICAgICAgICAgICAgCiAgICB9OwogICAgCiAgICAkLmpxcGxvdC5QaWVBeGlzUmVuZGVyZXIgPSBmdW5jdGlvbigpIHsKICAgICAgICAkLmpxcGxvdC5MaW5lYXJBeGlzUmVuZGVyZXIuY2FsbCh0aGlzKTsKICAgIH07CiAgICAKICAgICQuanFwbG90LlBpZUF4aXNSZW5kZXJlci5wcm90b3R5cGUgPSBuZXcgJC5qcXBsb3QuTGluZWFyQXhpc1JlbmRlcmVyKCk7CiAgICAkLmpxcGxvdC5QaWVBeGlzUmVuZGVyZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gJC5qcXBsb3QuUGllQXhpc1JlbmRlcmVyOwogICAgICAgIAogICAgCiAgICAvLyBUaGVyZSBhcmUgbm8gdHJhZGl0aW9uYWwgYXhlcyBvbiBhIHBpZSBjaGFydC4gIFdlIGp1c3QgbmVlZCB0byBwcm92aWRlCiAgICAvLyBkdW1teSBvYmplY3RzIHdpdGggcHJvcGVydGllcyBzbyB0aGUgcGxvdCB3aWxsIHJlbmRlci4KICAgIC8vIGNhbGxlZCB3aXRoIHNjb3BlIG9mIGF4aXMgb2JqZWN0LgogICAgJC5qcXBsb3QuUGllQXhpc1JlbmRlcmVyLnByb3RvdHlwZS5pbml0ID0gZnVuY3Rpb24ob3B0aW9ucyl7CiAgICAgICAgLy8KICAgICAgICB0aGlzLnRpY2tSZW5kZXJlciA9ICQuanFwbG90LlBpZVRpY2tSZW5kZXJlcjsKICAgICAgICAkLmV4dGVuZCh0cnVlLCB0aGlzLCBvcHRpb25zKTsKICAgICAgICAvLyBJIGRvbid0IHRoaW5rIEknbSBnb2luZyB0byBuZWVkIF9kYXRhQm91bmRzIGhlcmUuCiAgICAgICAgLy8gaGF2ZSB0byBnbyBBeGlzIHNjYWxpbmcgaW4gYSB3YXkgdG8gZml0IGNoYXJ0IG9udG8gcGxvdCBhcmVhCiAgICAgICAgLy8gYW5kIHByb3ZpZGUgdTJwIGFuZCBwMnUgZnVuY3Rpb25hbGl0eSBmb3IgbW91c2UgY3Vyc29yLCBldGMuCiAgICAgICAgLy8gZm9yIGNvbnZpZW5lbmNlIHNldCBfZGF0YUJvdW5kcyB0byAwIGFuZCAxMDAgYW5kCiAgICAgICAgLy8gc2V0IG1pbi9tYXggdG8gMCBhbmQgMTAwLgogICAgICAgIHRoaXMuX2RhdGFCb3VuZHMgPSB7bWluOjAsIG1heDoxMDB9OwogICAgICAgIHRoaXMubWluID0gMDsKICAgICAgICB0aGlzLm1heCA9IDEwMDsKICAgICAgICB0aGlzLnNob3dUaWNrcyA9IGZhbHNlOwogICAgICAgIHRoaXMudGlja3MgPSBbXTsKICAgICAgICB0aGlzLnNob3dNYXJrID0gZmFsc2U7CiAgICAgICAgdGhpcy5zaG93ID0gZmFsc2U7IAogICAgfTsKICAgIAogICAgCiAgICAKICAgIAogICAgJC5qcXBsb3QuUGllTGVnZW5kUmVuZGVyZXIgPSBmdW5jdGlvbigpewogICAgICAgICQuanFwbG90LlRhYmxlTGVnZW5kUmVuZGVyZXIuY2FsbCh0aGlzKTsKICAgIH07CiAgICAKICAgICQuanFwbG90LlBpZUxlZ2VuZFJlbmRlcmVyLnByb3RvdHlwZSA9IG5ldyAkLmpxcGxvdC5UYWJsZUxlZ2VuZFJlbmRlcmVyKCk7CiAgICAkLmpxcGxvdC5QaWVMZWdlbmRSZW5kZXJlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSAkLmpxcGxvdC5QaWVMZWdlbmRSZW5kZXJlcjsKICAgIAogICAgLyoqCiAgICAgKiBDbGFzczogJC5qcXBsb3QuUGllTGVnZW5kUmVuZGVyZXIKICAgICAqIExlZ2VuZCBSZW5kZXJlciBzcGVjaWZpYyB0byBwaWUgcGxvdHMuICBTZXQgYnkgZGVmYXVsdAogICAgICogd2hlbiB1c2VyIGNyZWF0ZXMgYSBwaWUgcGxvdC4KICAgICAqLwogICAgJC5qcXBsb3QuUGllTGVnZW5kUmVuZGVyZXIucHJvdG90eXBlLmluaXQgPSBmdW5jdGlvbihvcHRpb25zKSB7CiAgICAgICAgLy8gR3JvdXA6IFByb3BlcnRpZXMKICAgICAgICAvLwogICAgICAgIC8vIHByb3A6IG51bWJlclJvd3MKICAgICAgICAvLyBNYXhpbXVtIG51bWJlciBvZiByb3dzIGluIHRoZSBsZWdlbmQuICAwIG9yIG51bGwgZm9yIHVubGltaXRlZC4KICAgICAgICB0aGlzLm51bWJlclJvd3MgPSBudWxsOwogICAgICAgIC8vIHByb3A6IG51bWJlckNvbHVtbnMKICAgICAgICAvLyBNYXhpbXVtIG51bWJlciBvZiBjb2x1bW5zIGluIHRoZSBsZWdlbmQuICAwIG9yIG51bGwgZm9yIHVubGltaXRlZC4KICAgICAgICB0aGlzLm51bWJlckNvbHVtbnMgPSBudWxsOwogICAgICAgICQuZXh0ZW5kKHRydWUsIHRoaXMsIG9wdGlvbnMpOwogICAgfTsKICAgIAogICAgLy8gY2FsbGVkIHdpdGggY29udGV4dCBvZiBsZWdlbmQKICAgICQuanFwbG90LlBpZUxlZ2VuZFJlbmRlcmVyLnByb3RvdHlwZS5kcmF3ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIGxlZ2VuZCA9IHRoaXM7CiAgICAgICAgaWYgKHRoaXMuc2hvdykgewogICAgICAgICAgICB2YXIgc2VyaWVzID0gdGhpcy5fc2VyaWVzOwoKCiAgICAgICAgICAgIHRoaXMuX2VsZW0gPSAkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RhYmxlJykpOwogICAgICAgICAgICB0aGlzLl9lbGVtLmFkZENsYXNzKCdqcXBsb3QtdGFibGUtbGVnZW5kJyk7CgogICAgICAgICAgICB2YXIgc3MgPSB7cG9zaXRpb246J2Fic29sdXRlJ307CiAgICAgICAgICAgIGlmICh0aGlzLmJhY2tncm91bmQpIHsKICAgICAgICAgICAgICAgIHNzWydiYWNrZ3JvdW5kJ10gPSB0aGlzLmJhY2tncm91bmQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRoaXMuYm9yZGVyKSB7CiAgICAgICAgICAgICAgICBzc1snYm9yZGVyJ10gPSB0aGlzLmJvcmRlcjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGhpcy5mb250U2l6ZSkgewogICAgICAgICAgICAgICAgc3NbJ2ZvbnRTaXplJ10gPSB0aGlzLmZvbnRTaXplOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0aGlzLmZvbnRGYW1pbHkpIHsKICAgICAgICAgICAgICAgIHNzWydmb250RmFtaWx5J10gPSB0aGlzLmZvbnRGYW1pbHk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRoaXMudGV4dENvbG9yKSB7CiAgICAgICAgICAgICAgICBzc1sndGV4dENvbG9yJ10gPSB0aGlzLnRleHRDb2xvcjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGhpcy5tYXJnaW5Ub3AgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgc3NbJ21hcmdpblRvcCddID0gdGhpcy5tYXJnaW5Ub3A7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRoaXMubWFyZ2luQm90dG9tICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIHNzWydtYXJnaW5Cb3R0b20nXSA9IHRoaXMubWFyZ2luQm90dG9tOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0aGlzLm1hcmdpbkxlZnQgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgc3NbJ21hcmdpbkxlZnQnXSA9IHRoaXMubWFyZ2luTGVmdDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGhpcy5tYXJnaW5SaWdodCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICBzc1snbWFyZ2luUmlnaHQnXSA9IHRoaXMubWFyZ2luUmlnaHQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuX2VsZW0uY3NzKHNzKTsKCiAgICAgICAgICAgIC8vIFBpZSBjaGFydHMgbGVnZW5kcyBkb24ndCBnbyBieSBudW1iZXIgb2Ygc2VyaWVzLCBidXQgYnkgbnVtYmVyIG9mIGRhdGEgcG9pbnRzCiAgICAgICAgICAgIC8vIGluIHRoZSBzZXJpZXMuICBSZWZhY3RvciB0aGluZ3MgaGVyZSBmb3IgdGhhdC4KICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBwYWQgPSBmYWxzZSwgCiAgICAgICAgICAgICAgICByZXZlcnNlID0gZmFsc2UsCiAgICAgICAgICAgICAgICBuciwgCiAgICAgICAgICAgICAgICBuYzsKICAgICAgICAgICAgdmFyIHMgPSBzZXJpZXNbMF07CiAgICAgICAgICAgIHZhciBjb2xvckdlbmVyYXRvciA9IG5ldyAkLmpxcGxvdC5Db2xvckdlbmVyYXRvcihzLnNlcmllc0NvbG9ycyk7CiAgICAgICAgICAgIAogICAgICAgICAgICBpZiAocy5zaG93KSB7CiAgICAgICAgICAgICAgICB2YXIgcGQgPSBzLmRhdGE7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5udW1iZXJSb3dzKSB7CiAgICAgICAgICAgICAgICAgICAgbnIgPSB0aGlzLm51bWJlclJvd3M7CiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLm51bWJlckNvbHVtbnMpewogICAgICAgICAgICAgICAgICAgICAgICBuYyA9IE1hdGguY2VpbChwZC5sZW5ndGgvbnIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlewogICAgICAgICAgICAgICAgICAgICAgICBuYyA9IHRoaXMubnVtYmVyQ29sdW1uczsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICh0aGlzLm51bWJlckNvbHVtbnMpIHsKICAgICAgICAgICAgICAgICAgICBuYyA9IHRoaXMubnVtYmVyQ29sdW1uczsKICAgICAgICAgICAgICAgICAgICBuciA9IE1hdGguY2VpbChwZC5sZW5ndGgvdGhpcy5udW1iZXJDb2x1bW5zKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIG5yID0gcGQubGVuZ3RoOwogICAgICAgICAgICAgICAgICAgIG5jID0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGksIGo7CiAgICAgICAgICAgICAgICB2YXIgdHIsIHRkMSwgdGQyOyAKICAgICAgICAgICAgICAgIHZhciBsdCwgcnMsIGNvbG9yOwogICAgICAgICAgICAgICAgdmFyIGlkeCA9IDA7IAogICAgICAgICAgICAgICAgdmFyIGRpdjAsIGRpdjE7ICAgCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpPG5yOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICB0ciA9ICQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKSk7CiAgICAgICAgICAgICAgICAgICAgdHIuYWRkQ2xhc3MoJ2pxcGxvdC10YWJsZS1sZWdlbmQnKTsKICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICBpZiAocmV2ZXJzZSl7CiAgICAgICAgICAgICAgICAgICAgICAgIHRyLnByZXBlbmRUbyh0aGlzLl9lbGVtKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgZWxzZXsKICAgICAgICAgICAgICAgICAgICAgICAgdHIuYXBwZW5kVG8odGhpcy5fZWxlbSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIGZvciAoaj0wOyBqPG5jOyBqKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlkeCA8IHBkLmxlbmd0aCl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsdCA9IHRoaXMubGFiZWxzW2lkeF0gfHwgcGRbaWR4XVswXS50b1N0cmluZygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSBjb2xvckdlbmVyYXRvci5uZXh0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJldmVyc2UpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpPjApewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpID09IG5yIC0xKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2V7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcnMgPSAocGFkKSA/IHRoaXMucm93U3BhY2luZyA6ICcwJzsKCgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRkMSA9ICQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZDEuYWRkQ2xhc3MoJ2pxcGxvdC10YWJsZS1sZWdlbmQganFwbG90LXRhYmxlLWxlZ2VuZC1zd2F0Y2gnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRkMS5jc3Moe3RleHRBbGlnbjogJ2NlbnRlcicsIHBhZGRpbmdUb3A6IHJzfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGl2MCA9ICQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGl2MC5hZGRDbGFzcygnanFwbG90LXRhYmxlLWxlZ2VuZC1zd2F0Y2gtb3V0bGluZScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGl2MSA9ICQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGl2MS5hZGRDbGFzcygnanFwbG90LXRhYmxlLWxlZ2VuZC1zd2F0Y2gnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpdjEuY3NzKHtiYWNrZ3JvdW5kQ29sb3I6IGNvbG9yLCBib3JkZXJDb2xvcjogY29sb3J9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRkMS5hcHBlbmQoZGl2MC5hcHBlbmQoZGl2MSkpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRkMiA9ICQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZDIuYWRkQ2xhc3MoJ2pxcGxvdC10YWJsZS1sZWdlbmQganFwbG90LXRhYmxlLWxlZ2VuZC1sYWJlbCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGQyLmNzcygncGFkZGluZ1RvcCcsIHJzKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5lc2NhcGVIdG1sKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZDIudGV4dChsdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZDIuaHRtbChsdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV2ZXJzZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRkMi5wcmVwZW5kVG8odHIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRkMS5wcmVwZW5kVG8odHIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGQxLmFwcGVuZFRvKHRyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZDIuYXBwZW5kVG8odHIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZHgrKzsKICAgICAgICAgICAgICAgICAgICB9ICAgCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXMuX2VsZW07ICAgICAgICAgICAgICAgIAogICAgfTsKICAgIAogICAgJC5qcXBsb3QuUGllUmVuZGVyZXIucHJvdG90eXBlLmhhbmRsZU1vdmUgPSBmdW5jdGlvbihldiwgZ3JpZHBvcywgZGF0YXBvcywgbmVpZ2hib3IsIHBsb3QpIHsKICAgICAgICBpZiAobmVpZ2hib3IpIHsKICAgICAgICAgICAgdmFyIGlucyA9IFtuZWlnaGJvci5zZXJpZXNJbmRleCwgbmVpZ2hib3IucG9pbnRJbmRleCwgbmVpZ2hib3IuZGF0YV07CiAgICAgICAgICAgIHBsb3QudGFyZ2V0LnRyaWdnZXIoJ2pxcGxvdERhdGFNb3VzZU92ZXInLCBpbnMpOwogICAgICAgICAgICBpZiAocGxvdC5zZXJpZXNbaW5zWzBdXS5oaWdobGlnaHRNb3VzZU92ZXIgJiYgIShpbnNbMF0gPT0gcGxvdC5wbHVnaW5zLnBpZVJlbmRlcmVyLmhpZ2hsaWdodGVkU2VyaWVzSW5kZXggJiYgaW5zWzFdID09IHBsb3Quc2VyaWVzW2luc1swXV0uX2hpZ2hsaWdodGVkUG9pbnQpKSB7CiAgICAgICAgICAgICAgICBwbG90LnRhcmdldC50cmlnZ2VyKCdqcXBsb3REYXRhSGlnaGxpZ2h0JywgaW5zKTsKICAgICAgICAgICAgICAgIGhpZ2hsaWdodCAocGxvdCwgaW5zWzBdLCBpbnNbMV0pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKG5laWdoYm9yID09IG51bGwpIHsKICAgICAgICAgICAgdW5oaWdobGlnaHQgKHBsb3QpOwogICAgICAgIH0KICAgIH07CiAgICAKICAgIAogICAgLy8gdGhpcy5ldmVudENhbnZhcy5fZWxlbS5iaW5kKCQuanFwbG90LmV2ZW50TGlzdGVuZXJIb29rc1tpXVswXSwge3Bsb3Q6dGhpc30sICQuanFwbG90LmV2ZW50TGlzdGVuZXJIb29rc1tpXVsxXSk7CiAgICAKICAgIC8vIHNldHVwIGRlZmF1bHQgcmVuZGVyZXJzIGZvciBheGVzIGFuZCBsZWdlbmQgc28gdXNlciBkb2Vzbid0IGhhdmUgdG8KICAgIC8vIGNhbGxlZCB3aXRoIHNjb3BlIG9mIHBsb3QKICAgIGZ1bmN0aW9uIHByZUluaXQodGFyZ2V0LCBkYXRhLCBvcHRpb25zKSB7CiAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307CiAgICAgICAgb3B0aW9ucy5heGVzRGVmYXVsdHMgPSBvcHRpb25zLmF4ZXNEZWZhdWx0cyB8fCB7fTsKICAgICAgICBvcHRpb25zLmxlZ2VuZCA9IG9wdGlvbnMubGVnZW5kIHx8IHt9OwogICAgICAgIG9wdGlvbnMuc2VyaWVzRGVmYXVsdHMgPSBvcHRpb25zLnNlcmllc0RlZmF1bHRzIHx8IHt9OwogICAgICAgIC8vIG9ubHkgc2V0IHRoZXNlIGlmIHRoZXJlIGlzIGEgcGllIHNlcmllcwogICAgICAgIHZhciBzZXRvcHRzID0gZmFsc2U7CiAgICAgICAgaWYgKG9wdGlvbnMuc2VyaWVzRGVmYXVsdHMucmVuZGVyZXIgPT0gJC5qcXBsb3QuUGllUmVuZGVyZXIpIHsKICAgICAgICAgICAgc2V0b3B0cyA9IHRydWU7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKG9wdGlvbnMuc2VyaWVzKSB7CiAgICAgICAgICAgIGZvciAodmFyIGk9MDsgaSA8IG9wdGlvbnMuc2VyaWVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5zZXJpZXNbaV0ucmVuZGVyZXIgPT0gJC5qcXBsb3QuUGllUmVuZGVyZXIpIHsKICAgICAgICAgICAgICAgICAgICBzZXRvcHRzID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZiAoc2V0b3B0cykgewogICAgICAgICAgICBvcHRpb25zLmF4ZXNEZWZhdWx0cy5yZW5kZXJlciA9ICQuanFwbG90LlBpZUF4aXNSZW5kZXJlcjsKICAgICAgICAgICAgb3B0aW9ucy5sZWdlbmQucmVuZGVyZXIgPSAkLmpxcGxvdC5QaWVMZWdlbmRSZW5kZXJlcjsKICAgICAgICAgICAgb3B0aW9ucy5sZWdlbmQucHJlRHJhdyA9IHRydWU7CiAgICAgICAgICAgIG9wdGlvbnMuc2VyaWVzRGVmYXVsdHMucG9pbnRMYWJlbHMgPSB7c2hvdzogZmFsc2V9OwogICAgICAgIH0KICAgIH0KICAgIAogICAgZnVuY3Rpb24gcG9zdEluaXQodGFyZ2V0LCBkYXRhLCBvcHRpb25zKSB7CiAgICAgICAgZm9yICh2YXIgaT0wOyBpPHRoaXMuc2VyaWVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIGlmICh0aGlzLnNlcmllc1tpXS5yZW5kZXJlci5jb25zdHJ1Y3RvciA9PSAkLmpxcGxvdC5QaWVSZW5kZXJlcikgewogICAgICAgICAgICAgICAgLy8gZG9uJ3QgYWxsb3cgbW91c2VvdmVyIGFuZCBtb3VzZWRvd24gYXQgc2FtZSB0aW1lLgogICAgICAgICAgICAgICAgaWYgKHRoaXMuc2VyaWVzW2ldLmhpZ2hsaWdodE1vdXNlT3ZlcikgewogICAgICAgICAgICAgICAgICAgIHRoaXMuc2VyaWVzW2ldLmhpZ2hsaWdodE1vdXNlRG93biA9IGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgCiAgICAvLyBjYWxsZWQgd2l0aCBzY29wZSBvZiBwbG90CiAgICBmdW5jdGlvbiBwb3N0UGFyc2VPcHRpb25zKG9wdGlvbnMpIHsKICAgICAgICBmb3IgKHZhciBpPTA7IGk8dGhpcy5zZXJpZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgdGhpcy5zZXJpZXNbaV0uc2VyaWVzQ29sb3JzID0gdGhpcy5zZXJpZXNDb2xvcnM7CiAgICAgICAgICAgIHRoaXMuc2VyaWVzW2ldLmNvbG9yR2VuZXJhdG9yID0gJC5qcXBsb3QuY29sb3JHZW5lcmF0b3I7CiAgICAgICAgfQogICAgfQogICAgCiAgICBmdW5jdGlvbiBoaWdobGlnaHQgKHBsb3QsIHNpZHgsIHBpZHgpIHsKICAgICAgICB2YXIgcyA9IHBsb3Quc2VyaWVzW3NpZHhdOwogICAgICAgIHZhciBjYW52YXMgPSBwbG90LnBsdWdpbnMucGllUmVuZGVyZXIuaGlnaGxpZ2h0Q2FudmFzOwogICAgICAgIGNhbnZhcy5fY3R4LmNsZWFyUmVjdCgwLDAsY2FudmFzLl9jdHguY2FudmFzLndpZHRoLCBjYW52YXMuX2N0eC5jYW52YXMuaGVpZ2h0KTsKICAgICAgICBzLl9oaWdobGlnaHRlZFBvaW50ID0gcGlkeDsKICAgICAgICBwbG90LnBsdWdpbnMucGllUmVuZGVyZXIuaGlnaGxpZ2h0ZWRTZXJpZXNJbmRleCA9IHNpZHg7CiAgICAgICAgcy5yZW5kZXJlci5kcmF3U2xpY2UuY2FsbChzLCBjYW52YXMuX2N0eCwgcy5fc2xpY2VBbmdsZXNbcGlkeF1bMF0sIHMuX3NsaWNlQW5nbGVzW3BpZHhdWzFdLCBzLmhpZ2hsaWdodENvbG9yR2VuZXJhdG9yLmdldChwaWR4KSwgZmFsc2UpOwogICAgfQogICAgCiAgICBmdW5jdGlvbiB1bmhpZ2hsaWdodCAocGxvdCkgewogICAgICAgIHZhciBjYW52YXMgPSBwbG90LnBsdWdpbnMucGllUmVuZGVyZXIuaGlnaGxpZ2h0Q2FudmFzOwogICAgICAgIGNhbnZhcy5fY3R4LmNsZWFyUmVjdCgwLDAsIGNhbnZhcy5fY3R4LmNhbnZhcy53aWR0aCwgY2FudmFzLl9jdHguY2FudmFzLmhlaWdodCk7CiAgICAgICAgZm9yICh2YXIgaT0wOyBpPHBsb3Quc2VyaWVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIHBsb3Quc2VyaWVzW2ldLl9oaWdobGlnaHRlZFBvaW50ID0gbnVsbDsKICAgICAgICB9CiAgICAgICAgcGxvdC5wbHVnaW5zLnBpZVJlbmRlcmVyLmhpZ2hsaWdodGVkU2VyaWVzSW5kZXggPSBudWxsOwogICAgICAgIHBsb3QudGFyZ2V0LnRyaWdnZXIoJ2pxcGxvdERhdGFVbmhpZ2hsaWdodCcpOwogICAgfQogCiAgICBmdW5jdGlvbiBoYW5kbGVNb3ZlKGV2LCBncmlkcG9zLCBkYXRhcG9zLCBuZWlnaGJvciwgcGxvdCkgewogICAgICAgIGlmIChuZWlnaGJvcikgewogICAgICAgICAgICB2YXIgaW5zID0gW25laWdoYm9yLnNlcmllc0luZGV4LCBuZWlnaGJvci5wb2ludEluZGV4LCBuZWlnaGJvci5kYXRhXTsKICAgICAgICAgICAgdmFyIGV2dDEgPSBqUXVlcnkuRXZlbnQoJ2pxcGxvdERhdGFNb3VzZU92ZXInKTsKICAgICAgICAgICAgZXZ0MS5wYWdlWCA9IGV2LnBhZ2VYOwogICAgICAgICAgICBldnQxLnBhZ2VZID0gZXYucGFnZVk7CiAgICAgICAgICAgIHBsb3QudGFyZ2V0LnRyaWdnZXIoZXZ0MSwgaW5zKTsKICAgICAgICAgICAgaWYgKHBsb3Quc2VyaWVzW2luc1swXV0uaGlnaGxpZ2h0TW91c2VPdmVyICYmICEoaW5zWzBdID09IHBsb3QucGx1Z2lucy5waWVSZW5kZXJlci5oaWdobGlnaHRlZFNlcmllc0luZGV4ICYmIGluc1sxXSA9PSBwbG90LnNlcmllc1tpbnNbMF1dLl9oaWdobGlnaHRlZFBvaW50KSkgewogICAgICAgICAgICAgICAgdmFyIGV2dCA9IGpRdWVyeS5FdmVudCgnanFwbG90RGF0YUhpZ2hsaWdodCcpOwogICAgICAgICAgICAgICAgZXZ0LnBhZ2VYID0gZXYucGFnZVg7CiAgICAgICAgICAgICAgICBldnQucGFnZVkgPSBldi5wYWdlWTsKICAgICAgICAgICAgICAgIHBsb3QudGFyZ2V0LnRyaWdnZXIoZXZ0LCBpbnMpOwogICAgICAgICAgICAgICAgaGlnaGxpZ2h0IChwbG90LCBpbnNbMF0sIGluc1sxXSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAobmVpZ2hib3IgPT0gbnVsbCkgewogICAgICAgICAgICB1bmhpZ2hsaWdodCAocGxvdCk7CiAgICAgICAgfQogICAgfSAKICAgIAogICAgZnVuY3Rpb24gaGFuZGxlTW91c2VEb3duKGV2LCBncmlkcG9zLCBkYXRhcG9zLCBuZWlnaGJvciwgcGxvdCkgewogICAgICAgIGlmIChuZWlnaGJvcikgewogICAgICAgICAgICB2YXIgaW5zID0gW25laWdoYm9yLnNlcmllc0luZGV4LCBuZWlnaGJvci5wb2ludEluZGV4LCBuZWlnaGJvci5kYXRhXTsKICAgICAgICAgICAgaWYgKHBsb3Quc2VyaWVzW2luc1swXV0uaGlnaGxpZ2h0TW91c2VEb3duICYmICEoaW5zWzBdID09IHBsb3QucGx1Z2lucy5waWVSZW5kZXJlci5oaWdobGlnaHRlZFNlcmllc0luZGV4ICYmIGluc1sxXSA9PSBwbG90LnNlcmllc1tpbnNbMF1dLl9oaWdobGlnaHRlZFBvaW50KSkgewogICAgICAgICAgICAgICAgdmFyIGV2dCA9IGpRdWVyeS5FdmVudCgnanFwbG90RGF0YUhpZ2hsaWdodCcpOwogICAgICAgICAgICAgICAgZXZ0LnBhZ2VYID0gZXYucGFnZVg7CiAgICAgICAgICAgICAgICBldnQucGFnZVkgPSBldi5wYWdlWTsKICAgICAgICAgICAgICAgIHBsb3QudGFyZ2V0LnRyaWdnZXIoZXZ0LCBpbnMpOwogICAgICAgICAgICAgICAgaGlnaGxpZ2h0IChwbG90LCBpbnNbMF0sIGluc1sxXSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAobmVpZ2hib3IgPT0gbnVsbCkgewogICAgICAgICAgICB1bmhpZ2hsaWdodCAocGxvdCk7CiAgICAgICAgfQogICAgfQogICAgCiAgICBmdW5jdGlvbiBoYW5kbGVNb3VzZVVwKGV2LCBncmlkcG9zLCBkYXRhcG9zLCBuZWlnaGJvciwgcGxvdCkgewogICAgICAgIHZhciBpZHggPSBwbG90LnBsdWdpbnMucGllUmVuZGVyZXIuaGlnaGxpZ2h0ZWRTZXJpZXNJbmRleDsKICAgICAgICBpZiAoaWR4ICE9IG51bGwgJiYgcGxvdC5zZXJpZXNbaWR4XS5oaWdobGlnaHRNb3VzZURvd24pIHsKICAgICAgICAgICAgdW5oaWdobGlnaHQocGxvdCk7CiAgICAgICAgfQogICAgfQogICAgCiAgICBmdW5jdGlvbiBoYW5kbGVDbGljayhldiwgZ3JpZHBvcywgZGF0YXBvcywgbmVpZ2hib3IsIHBsb3QpIHsKICAgICAgICBpZiAobmVpZ2hib3IpIHsKICAgICAgICAgICAgdmFyIGlucyA9IFtuZWlnaGJvci5zZXJpZXNJbmRleCwgbmVpZ2hib3IucG9pbnRJbmRleCwgbmVpZ2hib3IuZGF0YV07CiAgICAgICAgICAgIHZhciBldnQgPSBqUXVlcnkuRXZlbnQoJ2pxcGxvdERhdGFDbGljaycpOwogICAgICAgICAgICBldnQucGFnZVggPSBldi5wYWdlWDsKICAgICAgICAgICAgZXZ0LnBhZ2VZID0gZXYucGFnZVk7CiAgICAgICAgICAgIHBsb3QudGFyZ2V0LnRyaWdnZXIoZXZ0LCBpbnMpOwogICAgICAgIH0KICAgIH0KICAgIAogICAgZnVuY3Rpb24gaGFuZGxlUmlnaHRDbGljayhldiwgZ3JpZHBvcywgZGF0YXBvcywgbmVpZ2hib3IsIHBsb3QpIHsKICAgICAgICBpZiAobmVpZ2hib3IpIHsKICAgICAgICAgICAgdmFyIGlucyA9IFtuZWlnaGJvci5zZXJpZXNJbmRleCwgbmVpZ2hib3IucG9pbnRJbmRleCwgbmVpZ2hib3IuZGF0YV07CiAgICAgICAgICAgIHZhciBpZHggPSBwbG90LnBsdWdpbnMucGllUmVuZGVyZXIuaGlnaGxpZ2h0ZWRTZXJpZXNJbmRleDsKICAgICAgICAgICAgaWYgKGlkeCAhPSBudWxsICYmIHBsb3Quc2VyaWVzW2lkeF0uaGlnaGxpZ2h0TW91c2VEb3duKSB7CiAgICAgICAgICAgICAgICB1bmhpZ2hsaWdodChwbG90KTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgZXZ0ID0galF1ZXJ5LkV2ZW50KCdqcXBsb3REYXRhUmlnaHRDbGljaycpOwogICAgICAgICAgICBldnQucGFnZVggPSBldi5wYWdlWDsKICAgICAgICAgICAgZXZ0LnBhZ2VZID0gZXYucGFnZVk7CiAgICAgICAgICAgIHBsb3QudGFyZ2V0LnRyaWdnZXIoZXZ0LCBpbnMpOwogICAgICAgIH0KICAgIH0gICAgCiAgICAKICAgIC8vIGNhbGxlZCB3aXRoaW4gY29udGV4dCBvZiBwbG90CiAgICAvLyBjcmVhdGUgYSBjYW52YXMgd2hpY2ggd2UgY2FuIGRyYXcgb24uCiAgICAvLyBpbnNlcnQgaXQgYmVmb3JlIHRoZSBldmVudENhbnZhcywgc28gZXZlbnRDYW52YXMgd2lsbCBzdGlsbCBjYXB0dXJlIGV2ZW50cy4KICAgIGZ1bmN0aW9uIHBvc3RQbG90RHJhdygpIHsKICAgICAgICAvLyBNZW1vcnkgTGVha3MgcGF0Y2ggICAgCiAgICAgICAgaWYgKHRoaXMucGx1Z2lucy5waWVSZW5kZXJlciAmJiB0aGlzLnBsdWdpbnMucGllUmVuZGVyZXIuaGlnaGxpZ2h0Q2FudmFzKSB7CiAgICAgICAgICAgIHRoaXMucGx1Z2lucy5waWVSZW5kZXJlci5oaWdobGlnaHRDYW52YXMucmVzZXRDYW52YXMoKTsKICAgICAgICAgICAgdGhpcy5wbHVnaW5zLnBpZVJlbmRlcmVyLmhpZ2hsaWdodENhbnZhcyA9IG51bGw7CiAgICAgICAgfQoKICAgICAgICB0aGlzLnBsdWdpbnMucGllUmVuZGVyZXIgPSB7aGlnaGxpZ2h0ZWRTZXJpZXNJbmRleDpudWxsfTsKICAgICAgICB0aGlzLnBsdWdpbnMucGllUmVuZGVyZXIuaGlnaGxpZ2h0Q2FudmFzID0gbmV3ICQuanFwbG90LkdlbmVyaWNDYW52YXMoKTsKICAgICAgICAKICAgICAgICAvLyBkbyB3ZSBoYXZlIGFueSBkYXRhIGxhYmVscz8gIGlmIHNvLCBwdXQgaGlnaGxpZ2h0IGNhbnZhcyBiZWZvcmUgdGhvc2UKICAgICAgICB2YXIgbGFiZWxzID0gJCh0aGlzLnRhcmdldElkKycgLmpxcGxvdC1kYXRhLWxhYmVsJyk7CiAgICAgICAgaWYgKGxhYmVscy5sZW5ndGgpIHsKICAgICAgICAgICAgJChsYWJlbHNbMF0pLmJlZm9yZSh0aGlzLnBsdWdpbnMucGllUmVuZGVyZXIuaGlnaGxpZ2h0Q2FudmFzLmNyZWF0ZUVsZW1lbnQodGhpcy5fZ3JpZFBhZGRpbmcsICdqcXBsb3QtcGllUmVuZGVyZXItaGlnaGxpZ2h0LWNhbnZhcycsIHRoaXMuX3Bsb3REaW1lbnNpb25zLCB0aGlzKSk7CiAgICAgICAgfQogICAgICAgIC8vIGVsc2UgcHV0IGhpZ2hsaWdodCBjYW52YXMgYmVmb3JlIGV2ZW50IGNhbnZhcy4KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgdGhpcy5ldmVudENhbnZhcy5fZWxlbS5iZWZvcmUodGhpcy5wbHVnaW5zLnBpZVJlbmRlcmVyLmhpZ2hsaWdodENhbnZhcy5jcmVhdGVFbGVtZW50KHRoaXMuX2dyaWRQYWRkaW5nLCAnanFwbG90LXBpZVJlbmRlcmVyLWhpZ2hsaWdodC1jYW52YXMnLCB0aGlzLl9wbG90RGltZW5zaW9ucywgdGhpcykpOwogICAgICAgIH0KICAgICAgICAKICAgICAgICB2YXIgaGN0eCA9IHRoaXMucGx1Z2lucy5waWVSZW5kZXJlci5oaWdobGlnaHRDYW52YXMuc2V0Q29udGV4dCgpOwogICAgICAgIHRoaXMuZXZlbnRDYW52YXMuX2VsZW0uYmluZCgnbW91c2VsZWF2ZScsIHtwbG90OnRoaXN9LCBmdW5jdGlvbiAoZXYpIHsgdW5oaWdobGlnaHQoZXYuZGF0YS5wbG90KTsgfSk7CiAgICB9CiAgICAKICAgICQuanFwbG90LnByZUluaXRIb29rcy5wdXNoKHByZUluaXQpOwogICAgCiAgICAkLmpxcGxvdC5QaWVUaWNrUmVuZGVyZXIgPSBmdW5jdGlvbigpIHsKICAgICAgICAkLmpxcGxvdC5BeGlzVGlja1JlbmRlcmVyLmNhbGwodGhpcyk7CiAgICB9OwogICAgCiAgICAkLmpxcGxvdC5QaWVUaWNrUmVuZGVyZXIucHJvdG90eXBlID0gbmV3ICQuanFwbG90LkF4aXNUaWNrUmVuZGVyZXIoKTsKICAgICQuanFwbG90LlBpZVRpY2tSZW5kZXJlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSAkLmpxcGxvdC5QaWVUaWNrUmVuZGVyZXI7CiAgICAKfSkoalF1ZXJ5KTsKICAgIAogICAg]]></data>
	</file>
	<file>
	  <filename>/src/plugins/jqplot.pieRenderer.min.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqCiAqIGpxUGxvdAogKiBQdXJlIEphdmFTY3JpcHQgcGxvdHRpbmcgcGx1Z2luIHVzaW5nIGpRdWVyeQogKgogKiBWZXJzaW9uOiAxLjAuMGIyX3IxMDEyCiAqCiAqIENvcHlyaWdodCAoYykgMjAwOS0yMDExIENocmlzIExlb25lbGxvCiAqIGpxUGxvdCBpcyBjdXJyZW50bHkgYXZhaWxhYmxlIGZvciB1c2UgaW4gYWxsIHBlcnNvbmFsIG9yIGNvbW1lcmNpYWwgcHJvamVjdHMgCiAqIHVuZGVyIGJvdGggdGhlIE1JVCAoaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHApIGFuZCBHUEwgCiAqIHZlcnNpb24gMi4wIChodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC5odG1sKSBsaWNlbnNlcy4gVGhpcyBtZWFucyB0aGF0IHlvdSBjYW4gCiAqIGNob29zZSB0aGUgbGljZW5zZSB0aGF0IGJlc3Qgc3VpdHMgeW91ciBwcm9qZWN0IGFuZCB1c2UgaXQgYWNjb3JkaW5nbHkuIAogKgogKiBBbHRob3VnaCBub3QgcmVxdWlyZWQsIHRoZSBhdXRob3Igd291bGQgYXBwcmVjaWF0ZSBhbiBlbWFpbCBsZXR0aW5nIGhpbSAKICoga25vdyBvZiBhbnkgc3Vic3RhbnRpYWwgdXNlIG9mIGpxUGxvdC4gIFlvdSBjYW4gcmVhY2ggdGhlIGF1dGhvciBhdDogCiAqIGNocmlzIGF0IGpxcGxvdCBkb3QgY29tIG9yIHNlZSBodHRwOi8vd3d3LmpxcGxvdC5jb20vaW5mby5waHAgLgogKgogKiBJZiB5b3UgYXJlIGZlZWxpbmcga2luZCBhbmQgZ2VuZXJvdXMsIGNvbnNpZGVyIHN1cHBvcnRpbmcgdGhlIHByb2plY3QgYnkKICogbWFraW5nIGEgZG9uYXRpb24gYXQ6IGh0dHA6Ly93d3cuanFwbG90LmNvbS9kb25hdGUucGhwIC4KICoKICogc3ByaW50ZiBmdW5jdGlvbnMgY29udGFpbmVkIGluIGpxcGxvdC5zcHJpbnRmLmpzIGJ5IEFzaCBTZWFybGU6CiAqCiAqICAgICB2ZXJzaW9uIDIwMDcuMDQuMjcKICogICAgIGF1dGhvciBBc2ggU2VhcmxlCiAqICAgICBodHRwOi8vaGV4bWVuLmNvbS9ibG9nLzIwMDcvMDMvcHJpbnRmLXNwcmludGYvCiAqICAgICBodHRwOi8vaGV4bWVuLmNvbS9qcy9zcHJpbnRmLmpzCiAqICAgICBUaGUgYXV0aG9yIChBc2ggU2VhcmxlKSBoYXMgcGxhY2VkIHRoaXMgY29kZSBpbiB0aGUgcHVibGljIGRvbWFpbjoKICogICAgICJUaGlzIGNvZGUgaXMgdW5yZXN0cmljdGVkOiB5b3UgYXJlIGZyZWUgdG8gdXNlIGl0IGhvd2V2ZXIgeW91IGxpa2UuIgogKgogKiBpbmNsdWRlZCBqc0RhdGUgbGlicmFyeSBieSBDaHJpcyBMZW9uZWxsbzoKICoKICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEgQ2hyaXMgTGVvbmVsbG8KICoKICoganNEYXRlIGlzIGN1cnJlbnRseSBhdmFpbGFibGUgZm9yIHVzZSBpbiBhbGwgcGVyc29uYWwgb3IgY29tbWVyY2lhbCBwcm9qZWN0cyAKICogdW5kZXIgYm90aCB0aGUgTUlUIGFuZCBHUEwgdmVyc2lvbiAyLjAgbGljZW5zZXMuIFRoaXMgbWVhbnMgdGhhdCB5b3UgY2FuIAogKiBjaG9vc2UgdGhlIGxpY2Vuc2UgdGhhdCBiZXN0IHN1aXRzIHlvdXIgcHJvamVjdCBhbmQgdXNlIGl0IGFjY29yZGluZ2x5LgogKgogKiBqc0RhdGUgYm9ycm93cyBtYW55IGNvbmNlcHRzIGFuZCBpZGVhcyBmcm9tIHRoZSBEYXRlIEluc3RhbmNlIAogKiBNZXRob2RzIGJ5IEtlbiBTbnlkZXIgYWxvbmcgd2l0aCBzb21lIHBhcnRzIG9mIEtlbidzIGFjdHVhbCBjb2RlLgogKiAKICogS2VuJ3Mgb3JpZ2lhbmwgRGF0ZSBJbnN0YW5jZSBNZXRob2RzIGFuZCBjb3B5cmlnaHQgbm90aWNlOgogKiAKICogS2VuIFNueWRlciAoa2VuIGQgc255ZGVyIGF0IGdtYWlsIGRvdCBjb20pCiAqIDIwMDgtMDktMTAKICogdmVyc2lvbiAyLjAuMiAoaHR0cDovL2tlbmRzbnlkZXIuY29tL3NhbmRib3gvZGF0ZS8pICAgICAKICogQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbiBMaWNlbnNlIDMuMCAoaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnkvMy4wLykKICoKICoganFwbG90VG9JbWFnZSBmdW5jdGlvbiBiYXNlZCBvbiBMYXJyeSBTaWRlbidzIGV4cG9ydC1qcXBsb3QtdG8tcG5nLmpzLgogKiBMYXJyeSBoYXMgZ2VuZXJvdXNseSBnaXZlbiBwZXJtaXNzaW9uIHRvIGFkYXB0IGhpcyBjb2RlIGZvciBpbmNsdXNpb24KICogaW50byBqcVBsb3QuCiAqCiAqIExhcnJ5J3Mgb3JpZ2luYWwgY29kZSBjYW4gYmUgZm91bmQgaGVyZToKICoKICogaHR0cHM6Ly9naXRodWIuY29tL2xzaWRlbi9leHBvcnQtanFwbG90LXRvLXBuZwogKiAKICogCiAqLwooZnVuY3Rpb24oZSl7ZS5qcXBsb3QuUGllUmVuZGVyZXI9ZnVuY3Rpb24oKXtlLmpxcGxvdC5MaW5lUmVuZGVyZXIuY2FsbCh0aGlzKX07ZS5qcXBsb3QuUGllUmVuZGVyZXIucHJvdG90eXBlPW5ldyBlLmpxcGxvdC5MaW5lUmVuZGVyZXIoKTtlLmpxcGxvdC5QaWVSZW5kZXJlci5wcm90b3R5cGUuY29uc3RydWN0b3I9ZS5qcXBsb3QuUGllUmVuZGVyZXI7ZS5qcXBsb3QuUGllUmVuZGVyZXIucHJvdG90eXBlLmluaXQ9ZnVuY3Rpb24ocSx1KXt0aGlzLmRpYW1ldGVyPW51bGw7dGhpcy5wYWRkaW5nPTIwO3RoaXMuc2xpY2VNYXJnaW49MDt0aGlzLmZpbGw9dHJ1ZTt0aGlzLnNoYWRvd09mZnNldD0yO3RoaXMuc2hhZG93QWxwaGE9MC4wNzt0aGlzLnNoYWRvd0RlcHRoPTU7dGhpcy5oaWdobGlnaHRNb3VzZU92ZXI9dHJ1ZTt0aGlzLmhpZ2hsaWdodE1vdXNlRG93bj1mYWxzZTt0aGlzLmhpZ2hsaWdodENvbG9ycz1bXTt0aGlzLmRhdGFMYWJlbHM9InBlcmNlbnQiO3RoaXMuc2hvd0RhdGFMYWJlbHM9ZmFsc2U7dGhpcy5kYXRhTGFiZWxGb3JtYXRTdHJpbmc9bnVsbDt0aGlzLmRhdGFMYWJlbFRocmVzaG9sZD0zO3RoaXMuZGF0YUxhYmVsUG9zaXRpb25GYWN0b3I9MC41Mjt0aGlzLmRhdGFMYWJlbE51ZGdlPTI7dGhpcy5kYXRhTGFiZWxDZW50ZXJPbj10cnVlO3RoaXMuc3RhcnRBbmdsZT0wO3RoaXMudGlja1JlbmRlcmVyPWUuanFwbG90LlBpZVRpY2tSZW5kZXJlcjt0aGlzLl9kcmF3RGF0YT10cnVlO3RoaXMuX3R5cGU9InBpZSI7aWYocS5oaWdobGlnaHRNb3VzZURvd24mJnEuaGlnaGxpZ2h0TW91c2VPdmVyPT1udWxsKXtxLmhpZ2hsaWdodE1vdXNlT3Zlcj1mYWxzZX1lLmV4dGVuZCh0cnVlLHRoaXMscSk7aWYodGhpcy5zbGljZU1hcmdpbjwwKXt0aGlzLnNsaWNlTWFyZ2luPTB9dGhpcy5fZGlhbWV0ZXI9bnVsbDt0aGlzLl9yYWRpdXM9bnVsbDt0aGlzLl9zbGljZUFuZ2xlcz1bXTt0aGlzLl9oaWdobGlnaHRlZFBvaW50PW51bGw7aWYodGhpcy5oaWdobGlnaHRDb2xvcnMubGVuZ3RoPT0wKXtmb3IodmFyIHM9MDtzPHRoaXMuc2VyaWVzQ29sb3JzLmxlbmd0aDtzKyspe3ZhciByPWUuanFwbG90LmdldENvbG9yQ29tcG9uZW50cyh0aGlzLnNlcmllc0NvbG9yc1tzXSk7dmFyIG89W3JbMF0sclsxXSxyWzJdXTt2YXIgdD1vWzBdK29bMV0rb1syXTtmb3IodmFyIHA9MDtwPDM7cCsrKXtvW3BdPSh0PjU3MCk/b1twXSowLjg6b1twXSswLjMqKDI1NS1vW3BdKTtvW3BdPXBhcnNlSW50KG9bcF0sMTApfXRoaXMuaGlnaGxpZ2h0Q29sb3JzLnB1c2goInJnYigiK29bMF0rIiwiK29bMV0rIiwiK29bMl0rIikiKX19dGhpcy5oaWdobGlnaHRDb2xvckdlbmVyYXRvcj1uZXcgZS5qcXBsb3QuQ29sb3JHZW5lcmF0b3IodGhpcy5oaWdobGlnaHRDb2xvcnMpO3UucG9zdFBhcnNlT3B0aW9uc0hvb2tzLmFkZE9uY2UobSk7dS5wb3N0SW5pdEhvb2tzLmFkZE9uY2UoZyk7dS5ldmVudExpc3RlbmVySG9va3MuYWRkT25jZSgianFwbG90TW91c2VNb3ZlIixiKTt1LmV2ZW50TGlzdGVuZXJIb29rcy5hZGRPbmNlKCJqcXBsb3RNb3VzZURvd24iLGEpO3UuZXZlbnRMaXN0ZW5lckhvb2tzLmFkZE9uY2UoImpxcGxvdE1vdXNlVXAiLGwpO3UuZXZlbnRMaXN0ZW5lckhvb2tzLmFkZE9uY2UoImpxcGxvdENsaWNrIixmKTt1LmV2ZW50TGlzdGVuZXJIb29rcy5hZGRPbmNlKCJqcXBsb3RSaWdodENsaWNrIixuKTt1LnBvc3REcmF3SG9va3MuYWRkT25jZShpKX07ZS5qcXBsb3QuUGllUmVuZGVyZXIucHJvdG90eXBlLnNldEdyaWREYXRhPWZ1bmN0aW9uKHQpe3ZhciBwPVtdO3ZhciB1PVtdO3ZhciBvPXRoaXMuc3RhcnRBbmdsZS8xODAqTWF0aC5QSTt2YXIgcz0wO3RoaXMuX2RyYXdEYXRhPWZhbHNlO2Zvcih2YXIgcj0wO3I8dGhpcy5kYXRhLmxlbmd0aDtyKyspe2lmKHRoaXMuZGF0YVtyXVsxXSE9MCl7dGhpcy5fZHJhd0RhdGE9dHJ1ZX1wLnB1c2godGhpcy5kYXRhW3JdWzFdKTt1LnB1c2goW3RoaXMuZGF0YVtyXVswXV0pO2lmKHI+MCl7cFtyXSs9cFtyLTFdfXMrPXRoaXMuZGF0YVtyXVsxXX12YXIgcT1NYXRoLlBJKjIvcFtwLmxlbmd0aC0xXTtmb3IodmFyIHI9MDtyPHAubGVuZ3RoO3IrKyl7dVtyXVsxXT1wW3JdKnE7dVtyXVsyXT10aGlzLmRhdGFbcl1bMV0vc310aGlzLmdyaWREYXRhPXV9O2UuanFwbG90LlBpZVJlbmRlcmVyLnByb3RvdHlwZS5tYWtlR3JpZERhdGE9ZnVuY3Rpb24odCx1KXt2YXIgcD1bXTt2YXIgdj1bXTt2YXIgcz0wO3ZhciBvPXRoaXMuc3RhcnRBbmdsZS8xODAqTWF0aC5QSTt0aGlzLl9kcmF3RGF0YT1mYWxzZTtmb3IodmFyIHI9MDtyPHQubGVuZ3RoO3IrKyl7aWYodGhpcy5kYXRhW3JdWzFdIT0wKXt0aGlzLl9kcmF3RGF0YT10cnVlfXAucHVzaCh0W3JdWzFdKTt2LnB1c2goW3Rbcl1bMF1dKTtpZihyPjApe3Bbcl0rPXBbci0xXX1zKz10W3JdWzFdfXZhciBxPU1hdGguUEkqMi9wW3AubGVuZ3RoLTFdO2Zvcih2YXIgcj0wO3I8cC5sZW5ndGg7cisrKXt2W3JdWzFdPXBbcl0qcTt2W3JdWzJdPXRbcl1bMV0vc31yZXR1cm4gdn07ZnVuY3Rpb24gaChvKXtyZXR1cm4gTWF0aC5zaW4oKG8tKG8tTWF0aC5QSSkvOC9NYXRoLlBJKS8yKX1mdW5jdGlvbiBqKHUsdCxvLHYscil7dmFyIHc9MDt2YXIgcT10LXU7dmFyIHM9TWF0aC5hYnMocSk7dmFyIHA9bztpZih2PT1mYWxzZSl7cCs9cn1pZihwPjAmJnM+MC4wMSYmczw2LjI4Mil7dz1wYXJzZUZsb2F0KHApLzIvaChxKX1yZXR1cm4gd31lLmpxcGxvdC5QaWVSZW5kZXJlci5wcm90b3R5cGUuZHJhd1NsaWNlPWZ1bmN0aW9uKEIseix5LHUsdyl7aWYodGhpcy5fZHJhd0RhdGEpe3ZhciBwPXRoaXMuX3JhZGl1czt2YXIgQT10aGlzLmZpbGw7dmFyIHg9dGhpcy5saW5lV2lkdGg7dmFyIHM9dGhpcy5zbGljZU1hcmdpbjtpZih0aGlzLmZpbGw9PWZhbHNlKXtzKz10aGlzLmxpbmVXaWR0aH1CLnNhdmUoKTtCLnRyYW5zbGF0ZSh0aGlzLl9jZW50ZXJbMF0sdGhpcy5fY2VudGVyWzFdKTt2YXIgRD1qKHoseSx0aGlzLnNsaWNlTWFyZ2luLHRoaXMuZmlsbCx0aGlzLmxpbmVXaWR0aCk7dmFyIG89RCpNYXRoLmNvcygoeit5KS8yKTt2YXIgQz1EKk1hdGguc2luKCh6K3kpLzIpO2lmKCh5LXopPD1NYXRoLlBJKXtwLT1EfWVsc2V7cCs9RH1CLnRyYW5zbGF0ZShvLEMpO2lmKHcpe2Zvcih2YXIgdj0wLHQ9dGhpcy5zaGFkb3dEZXB0aDt2PHQ7disrKXtCLnNhdmUoKTtCLnRyYW5zbGF0ZSh0aGlzLnNoYWRvd09mZnNldCpNYXRoLmNvcyh0aGlzLnNoYWRvd0FuZ2xlLzE4MCpNYXRoLlBJKSx0aGlzLnNoYWRvd09mZnNldCpNYXRoLnNpbih0aGlzLnNoYWRvd0FuZ2xlLzE4MCpNYXRoLlBJKSk7cShwKX1mb3IodmFyIHY9MCx0PXRoaXMuc2hhZG93RGVwdGg7djx0O3YrKyl7Qi5yZXN0b3JlKCl9fWVsc2V7cShwKX1CLnJlc3RvcmUoKX1mdW5jdGlvbiBxKHIpe2lmKHk+Ni4yODIrdGhpcy5zdGFydEFuZ2xlKXt5PTYuMjgyK3RoaXMuc3RhcnRBbmdsZTtpZih6Pnkpe3o9Ni4yODErdGhpcy5zdGFydEFuZ2xlfX1pZih6Pj15KXtyZXR1cm59Qi5iZWdpblBhdGgoKTtCLmZpbGxTdHlsZT11O0Iuc3Ryb2tlU3R5bGU9dTtCLmxpbmVXaWR0aD14O0IuYXJjKDAsMCxyLHoseSxmYWxzZSk7Qi5saW5lVG8oMCwwKTtCLmNsb3NlUGF0aCgpO2lmKEEpe0IuZmlsbCgpfWVsc2V7Qi5zdHJva2UoKX19fTtlLmpxcGxvdC5QaWVSZW5kZXJlci5wcm90b3R5cGUuZHJhdz1mdW5jdGlvbihCLHosRSxvKXt2YXIgVzt2YXIgSD0oRSE9dW5kZWZpbmVkKT9FOnt9O3ZhciB0PTA7dmFyIHM9MDt2YXIgTj0xO3ZhciBMPW5ldyBlLmpxcGxvdC5Db2xvckdlbmVyYXRvcih0aGlzLnNlcmllc0NvbG9ycyk7aWYoRS5sZWdlbmRJbmZvJiZFLmxlZ2VuZEluZm8ucGxhY2VtZW50PT0iaW5zaWRlR3JpZCIpe3ZhciBKPUUubGVnZW5kSW5mbztzd2l0Y2goSi5sb2NhdGlvbil7Y2FzZSJudyI6dD1KLndpZHRoK0oueG9mZnNldDticmVhaztjYXNlInciOnQ9Si53aWR0aCtKLnhvZmZzZXQ7YnJlYWs7Y2FzZSJzdyI6dD1KLndpZHRoK0oueG9mZnNldDticmVhaztjYXNlIm5lIjp0PUoud2lkdGgrSi54b2Zmc2V0O049LTE7YnJlYWs7Y2FzZSJlIjp0PUoud2lkdGgrSi54b2Zmc2V0O049LTE7YnJlYWs7Y2FzZSJzZSI6dD1KLndpZHRoK0oueG9mZnNldDtOPS0xO2JyZWFrO2Nhc2UibiI6cz1KLmhlaWdodCtKLnlvZmZzZXQ7YnJlYWs7Y2FzZSJzIjpzPUouaGVpZ2h0K0oueW9mZnNldDtOPS0xO2JyZWFrO2RlZmF1bHQ6YnJlYWt9fXZhciBLPShILnNoYWRvdyE9dW5kZWZpbmVkKT9ILnNoYWRvdzp0aGlzLnNoYWRvdzt2YXIgQT0oSC5maWxsIT11bmRlZmluZWQpP0guZmlsbDp0aGlzLmZpbGw7dmFyIEM9Qi5jYW52YXMud2lkdGg7dmFyIEk9Qi5jYW52YXMuaGVpZ2h0O3ZhciBRPUMtdC0yKnRoaXMucGFkZGluZzt2YXIgWD1JLXMtMip0aGlzLnBhZGRpbmc7dmFyIE09TWF0aC5taW4oUSxYKTt2YXIgWT1NO3RoaXMuX3NsaWNlQW5nbGVzPVtdO3ZhciB2PXRoaXMuc2xpY2VNYXJnaW47aWYodGhpcy5maWxsPT1mYWxzZSl7dis9dGhpcy5saW5lV2lkdGh9dmFyIHE7dmFyIEc9MDt2YXIgUixhYSxaLGFiO3ZhciBEPXRoaXMuc3RhcnRBbmdsZS8xODAqTWF0aC5QSTtmb3IodmFyIFc9MCxWPXoubGVuZ3RoO1c8VjtXKyspe2FhPShXPT0wKT9EOnpbVy0xXVsxXStEO1o9eltXXVsxXStEO3RoaXMuX3NsaWNlQW5nbGVzLnB1c2goW2FhLFpdKTtxPWooYWEsWix0aGlzLnNsaWNlTWFyZ2luLHRoaXMuZmlsbCx0aGlzLmxpbmVXaWR0aCk7aWYoTWF0aC5hYnMoWi1hYSk+TWF0aC5QSSl7Rz1NYXRoLm1heChxLEcpfX1pZih0aGlzLmRpYW1ldGVyIT1udWxsJiZ0aGlzLmRpYW1ldGVyPjApe3RoaXMuX2RpYW1ldGVyPXRoaXMuZGlhbWV0ZXItMipHfWVsc2V7dGhpcy5fZGlhbWV0ZXI9WS0yKkd9aWYodGhpcy5fZGlhbWV0ZXI8Nil7ZS5qcXBsb3QubG9nKCJEaWFtZXRlciBvZiBwaWUgdG9vIHNtYWxsLCBub3QgcmVuZGVyaW5nLiIpO3JldHVybn12YXIgUz10aGlzLl9yYWRpdXM9dGhpcy5fZGlhbWV0ZXIvMjt0aGlzLl9jZW50ZXI9WyhDLU4qdCkvMitOKnQrRypNYXRoLmNvcyhEKSwoSS1OKnMpLzIrTipzK0cqTWF0aC5zaW4oRCldO2lmKHRoaXMuc2hhZG93KXtmb3IodmFyIFc9MCxWPXoubGVuZ3RoO1c8VjtXKyspe2FiPSJyZ2JhKDAsMCwwLCIrdGhpcy5zaGFkb3dBbHBoYSsiKSI7dGhpcy5yZW5kZXJlci5kcmF3U2xpY2UuY2FsbCh0aGlzLEIsdGhpcy5fc2xpY2VBbmdsZXNbV11bMF0sdGhpcy5fc2xpY2VBbmdsZXNbV11bMV0sYWIsdHJ1ZSl9fWZvcih2YXIgVz0wO1c8ei5sZW5ndGg7VysrKXt0aGlzLnJlbmRlcmVyLmRyYXdTbGljZS5jYWxsKHRoaXMsQix0aGlzLl9zbGljZUFuZ2xlc1tXXVswXSx0aGlzLl9zbGljZUFuZ2xlc1tXXVsxXSxMLm5leHQoKSxmYWxzZSk7aWYodGhpcy5zaG93RGF0YUxhYmVscyYmeltXXVsyXSoxMDA+PXRoaXMuZGF0YUxhYmVsVGhyZXNob2xkKXt2YXIgRixVPSh0aGlzLl9zbGljZUFuZ2xlc1tXXVswXSt0aGlzLl9zbGljZUFuZ2xlc1tXXVsxXSkvMixUO2lmKHRoaXMuZGF0YUxhYmVscz09ImxhYmVsIil7Rj10aGlzLmRhdGFMYWJlbEZvcm1hdFN0cmluZ3x8IiVzIjtUPWUuanFwbG90LnNwcmludGYoRix6W1ddWzBdKX1lbHNle2lmKHRoaXMuZGF0YUxhYmVscz09InZhbHVlIil7Rj10aGlzLmRhdGFMYWJlbEZvcm1hdFN0cmluZ3x8IiVkIjtUPWUuanFwbG90LnNwcmludGYoRix0aGlzLmRhdGFbV11bMV0pfWVsc2V7aWYodGhpcy5kYXRhTGFiZWxzPT0icGVyY2VudCIpe0Y9dGhpcy5kYXRhTGFiZWxGb3JtYXRTdHJpbmd8fCIlZCUlIjtUPWUuanFwbG90LnNwcmludGYoRix6W1ddWzJdKjEwMCl9ZWxzZXtpZih0aGlzLmRhdGFMYWJlbHMuY29uc3RydWN0b3I9PUFycmF5KXtGPXRoaXMuZGF0YUxhYmVsRm9ybWF0U3RyaW5nfHwiJXMiO1Q9ZS5qcXBsb3Quc3ByaW50ZihGLHRoaXMuZGF0YUxhYmVsc1tXXSl9fX19dmFyIHA9KHRoaXMuX3JhZGl1cykqdGhpcy5kYXRhTGFiZWxQb3NpdGlvbkZhY3Rvcit0aGlzLnNsaWNlTWFyZ2luK3RoaXMuZGF0YUxhYmVsTnVkZ2U7dmFyIFA9dGhpcy5fY2VudGVyWzBdK01hdGguY29zKFUpKnArdGhpcy5jYW52YXMuX29mZnNldHMubGVmdDt2YXIgTz10aGlzLl9jZW50ZXJbMV0rTWF0aC5zaW4oVSkqcCt0aGlzLmNhbnZhcy5fb2Zmc2V0cy50b3A7dmFyIHU9ZSgnPGRpdiBjbGFzcz0ianFwbG90LXBpZS1zZXJpZXMganFwbG90LWRhdGEtbGFiZWwiIHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTsiPicrVCsiPC9kaXY+IikuaW5zZXJ0QmVmb3JlKG8uZXZlbnRDYW52YXMuX2VsZW0pO2lmKHRoaXMuZGF0YUxhYmVsQ2VudGVyT24pe1AtPXUud2lkdGgoKS8yO08tPXUuaGVpZ2h0KCkvMn1lbHNle1AtPXUud2lkdGgoKSpNYXRoLnNpbihVLzIpO08tPXUuaGVpZ2h0KCkvMn1QPU1hdGgucm91bmQoUCk7Tz1NYXRoLnJvdW5kKE8pO3UuY3NzKHtsZWZ0OlAsdG9wOk99KX19fTtlLmpxcGxvdC5QaWVBeGlzUmVuZGVyZXI9ZnVuY3Rpb24oKXtlLmpxcGxvdC5MaW5lYXJBeGlzUmVuZGVyZXIuY2FsbCh0aGlzKX07ZS5qcXBsb3QuUGllQXhpc1JlbmRlcmVyLnByb3RvdHlwZT1uZXcgZS5qcXBsb3QuTGluZWFyQXhpc1JlbmRlcmVyKCk7ZS5qcXBsb3QuUGllQXhpc1JlbmRlcmVyLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLmpxcGxvdC5QaWVBeGlzUmVuZGVyZXI7ZS5qcXBsb3QuUGllQXhpc1JlbmRlcmVyLnByb3RvdHlwZS5pbml0PWZ1bmN0aW9uKG8pe3RoaXMudGlja1JlbmRlcmVyPWUuanFwbG90LlBpZVRpY2tSZW5kZXJlcjtlLmV4dGVuZCh0cnVlLHRoaXMsbyk7dGhpcy5fZGF0YUJvdW5kcz17bWluOjAsbWF4OjEwMH07dGhpcy5taW49MDt0aGlzLm1heD0xMDA7dGhpcy5zaG93VGlja3M9ZmFsc2U7dGhpcy50aWNrcz1bXTt0aGlzLnNob3dNYXJrPWZhbHNlO3RoaXMuc2hvdz1mYWxzZX07ZS5qcXBsb3QuUGllTGVnZW5kUmVuZGVyZXI9ZnVuY3Rpb24oKXtlLmpxcGxvdC5UYWJsZUxlZ2VuZFJlbmRlcmVyLmNhbGwodGhpcyl9O2UuanFwbG90LlBpZUxlZ2VuZFJlbmRlcmVyLnByb3RvdHlwZT1uZXcgZS5qcXBsb3QuVGFibGVMZWdlbmRSZW5kZXJlcigpO2UuanFwbG90LlBpZUxlZ2VuZFJlbmRlcmVyLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLmpxcGxvdC5QaWVMZWdlbmRSZW5kZXJlcjtlLmpxcGxvdC5QaWVMZWdlbmRSZW5kZXJlci5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbihvKXt0aGlzLm51bWJlclJvd3M9bnVsbDt0aGlzLm51bWJlckNvbHVtbnM9bnVsbDtlLmV4dGVuZCh0cnVlLHRoaXMsbyl9O2UuanFwbG90LlBpZUxlZ2VuZFJlbmRlcmVyLnByb3RvdHlwZS5kcmF3PWZ1bmN0aW9uKCl7dmFyIHI9dGhpcztpZih0aGlzLnNob3cpe3ZhciBCPXRoaXMuX3Nlcmllczt0aGlzLl9lbGVtPWUoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGFibGUiKSk7dGhpcy5fZWxlbS5hZGRDbGFzcygianFwbG90LXRhYmxlLWxlZ2VuZCIpO3ZhciBFPXtwb3NpdGlvbjoiYWJzb2x1dGUifTtpZih0aGlzLmJhY2tncm91bmQpe0UuYmFja2dyb3VuZD10aGlzLmJhY2tncm91bmR9aWYodGhpcy5ib3JkZXIpe0UuYm9yZGVyPXRoaXMuYm9yZGVyfWlmKHRoaXMuZm9udFNpemUpe0UuZm9udFNpemU9dGhpcy5mb250U2l6ZX1pZih0aGlzLmZvbnRGYW1pbHkpe0UuZm9udEZhbWlseT10aGlzLmZvbnRGYW1pbHl9aWYodGhpcy50ZXh0Q29sb3Ipe0UudGV4dENvbG9yPXRoaXMudGV4dENvbG9yfWlmKHRoaXMubWFyZ2luVG9wIT1udWxsKXtFLm1hcmdpblRvcD10aGlzLm1hcmdpblRvcH1pZih0aGlzLm1hcmdpbkJvdHRvbSE9bnVsbCl7RS5tYXJnaW5Cb3R0b209dGhpcy5tYXJnaW5Cb3R0b219aWYodGhpcy5tYXJnaW5MZWZ0IT1udWxsKXtFLm1hcmdpbkxlZnQ9dGhpcy5tYXJnaW5MZWZ0fWlmKHRoaXMubWFyZ2luUmlnaHQhPW51bGwpe0UubWFyZ2luUmlnaHQ9dGhpcy5tYXJnaW5SaWdodH10aGlzLl9lbGVtLmNzcyhFKTt2YXIgST1mYWxzZSxBPWZhbHNlLG8seTt2YXIgQz1CWzBdO3ZhciBwPW5ldyBlLmpxcGxvdC5Db2xvckdlbmVyYXRvcihDLnNlcmllc0NvbG9ycyk7aWYoQy5zaG93KXt2YXIgSj1DLmRhdGE7aWYodGhpcy5udW1iZXJSb3dzKXtvPXRoaXMubnVtYmVyUm93cztpZighdGhpcy5udW1iZXJDb2x1bW5zKXt5PU1hdGguY2VpbChKLmxlbmd0aC9vKX1lbHNle3k9dGhpcy5udW1iZXJDb2x1bW5zfX1lbHNle2lmKHRoaXMubnVtYmVyQ29sdW1ucyl7eT10aGlzLm51bWJlckNvbHVtbnM7bz1NYXRoLmNlaWwoSi5sZW5ndGgvdGhpcy5udW1iZXJDb2x1bW5zKX1lbHNle289Si5sZW5ndGg7eT0xfX12YXIgSCxHO3ZhciBxLHcsdjt2YXIgeCx6LEY7dmFyIEQ9MDt2YXIgdSx0O2ZvcihIPTA7SDxvO0grKyl7cT1lKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRyIikpO3EuYWRkQ2xhc3MoImpxcGxvdC10YWJsZS1sZWdlbmQiKTtpZihBKXtxLnByZXBlbmRUbyh0aGlzLl9lbGVtKX1lbHNle3EuYXBwZW5kVG8odGhpcy5fZWxlbSl9Zm9yKEc9MDtHPHk7RysrKXtpZihEPEoubGVuZ3RoKXt4PXRoaXMubGFiZWxzW0RdfHxKW0RdWzBdLnRvU3RyaW5nKCk7Rj1wLm5leHQoKTtpZighQSl7aWYoSD4wKXtJPXRydWV9ZWxzZXtJPWZhbHNlfX1lbHNle2lmKEg9PW8tMSl7ST1mYWxzZX1lbHNle0k9dHJ1ZX19ej0oSSk/dGhpcy5yb3dTcGFjaW5nOiIwIjt3PWUoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGQiKSk7dy5hZGRDbGFzcygianFwbG90LXRhYmxlLWxlZ2VuZCBqcXBsb3QtdGFibGUtbGVnZW5kLXN3YXRjaCIpO3cuY3NzKHt0ZXh0QWxpZ246ImNlbnRlciIscGFkZGluZ1RvcDp6fSk7dT1lKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpKTt1LmFkZENsYXNzKCJqcXBsb3QtdGFibGUtbGVnZW5kLXN3YXRjaC1vdXRsaW5lIik7dD1lKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpKTt0LmFkZENsYXNzKCJqcXBsb3QtdGFibGUtbGVnZW5kLXN3YXRjaCIpO3QuY3NzKHtiYWNrZ3JvdW5kQ29sb3I6Rixib3JkZXJDb2xvcjpGfSk7dy5hcHBlbmQodS5hcHBlbmQodCkpO3Y9ZShkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZCIpKTt2LmFkZENsYXNzKCJqcXBsb3QtdGFibGUtbGVnZW5kIGpxcGxvdC10YWJsZS1sZWdlbmQtbGFiZWwiKTt2LmNzcygicGFkZGluZ1RvcCIseik7aWYodGhpcy5lc2NhcGVIdG1sKXt2LnRleHQoeCl9ZWxzZXt2Lmh0bWwoeCl9aWYoQSl7di5wcmVwZW5kVG8ocSk7dy5wcmVwZW5kVG8ocSl9ZWxzZXt3LmFwcGVuZFRvKHEpO3YuYXBwZW5kVG8ocSl9ST10cnVlfUQrK319fX1yZXR1cm4gdGhpcy5fZWxlbX07ZS5qcXBsb3QuUGllUmVuZGVyZXIucHJvdG90eXBlLmhhbmRsZU1vdmU9ZnVuY3Rpb24ocSxwLHQscyxyKXtpZihzKXt2YXIgbz1bcy5zZXJpZXNJbmRleCxzLnBvaW50SW5kZXgscy5kYXRhXTtyLnRhcmdldC50cmlnZ2VyKCJqcXBsb3REYXRhTW91c2VPdmVyIixvKTtpZihyLnNlcmllc1tvWzBdXS5oaWdobGlnaHRNb3VzZU92ZXImJiEob1swXT09ci5wbHVnaW5zLnBpZVJlbmRlcmVyLmhpZ2hsaWdodGVkU2VyaWVzSW5kZXgmJm9bMV09PXIuc2VyaWVzW29bMF1dLl9oaWdobGlnaHRlZFBvaW50KSl7ci50YXJnZXQudHJpZ2dlcigianFwbG90RGF0YUhpZ2hsaWdodCIsbyk7ZChyLG9bMF0sb1sxXSl9fWVsc2V7aWYocz09bnVsbCl7ayhyKX19fTtmdW5jdGlvbiBjKHMscixwKXtwPXB8fHt9O3AuYXhlc0RlZmF1bHRzPXAuYXhlc0RlZmF1bHRzfHx7fTtwLmxlZ2VuZD1wLmxlZ2VuZHx8e307cC5zZXJpZXNEZWZhdWx0cz1wLnNlcmllc0RlZmF1bHRzfHx7fTt2YXIgbz1mYWxzZTtpZihwLnNlcmllc0RlZmF1bHRzLnJlbmRlcmVyPT1lLmpxcGxvdC5QaWVSZW5kZXJlcil7bz10cnVlfWVsc2V7aWYocC5zZXJpZXMpe2Zvcih2YXIgcT0wO3E8cC5zZXJpZXMubGVuZ3RoO3ErKyl7aWYocC5zZXJpZXNbcV0ucmVuZGVyZXI9PWUuanFwbG90LlBpZVJlbmRlcmVyKXtvPXRydWV9fX19aWYobyl7cC5heGVzRGVmYXVsdHMucmVuZGVyZXI9ZS5qcXBsb3QuUGllQXhpc1JlbmRlcmVyO3AubGVnZW5kLnJlbmRlcmVyPWUuanFwbG90LlBpZUxlZ2VuZFJlbmRlcmVyO3AubGVnZW5kLnByZURyYXc9dHJ1ZTtwLnNlcmllc0RlZmF1bHRzLnBvaW50TGFiZWxzPXtzaG93OmZhbHNlfX19ZnVuY3Rpb24gZyhyLHEsbyl7Zm9yKHZhciBwPTA7cDx0aGlzLnNlcmllcy5sZW5ndGg7cCsrKXtpZih0aGlzLnNlcmllc1twXS5yZW5kZXJlci5jb25zdHJ1Y3Rvcj09ZS5qcXBsb3QuUGllUmVuZGVyZXIpe2lmKHRoaXMuc2VyaWVzW3BdLmhpZ2hsaWdodE1vdXNlT3Zlcil7dGhpcy5zZXJpZXNbcF0uaGlnaGxpZ2h0TW91c2VEb3duPWZhbHNlfX19fWZ1bmN0aW9uIG0obyl7Zm9yKHZhciBwPTA7cDx0aGlzLnNlcmllcy5sZW5ndGg7cCsrKXt0aGlzLnNlcmllc1twXS5zZXJpZXNDb2xvcnM9dGhpcy5zZXJpZXNDb2xvcnM7dGhpcy5zZXJpZXNbcF0uY29sb3JHZW5lcmF0b3I9ZS5qcXBsb3QuY29sb3JHZW5lcmF0b3J9fWZ1bmN0aW9uIGQodCxyLHEpe3ZhciBwPXQuc2VyaWVzW3JdO3ZhciBvPXQucGx1Z2lucy5waWVSZW5kZXJlci5oaWdobGlnaHRDYW52YXM7by5fY3R4LmNsZWFyUmVjdCgwLDAsby5fY3R4LmNhbnZhcy53aWR0aCxvLl9jdHguY2FudmFzLmhlaWdodCk7cC5faGlnaGxpZ2h0ZWRQb2ludD1xO3QucGx1Z2lucy5waWVSZW5kZXJlci5oaWdobGlnaHRlZFNlcmllc0luZGV4PXI7cC5yZW5kZXJlci5kcmF3U2xpY2UuY2FsbChwLG8uX2N0eCxwLl9zbGljZUFuZ2xlc1txXVswXSxwLl9zbGljZUFuZ2xlc1txXVsxXSxwLmhpZ2hsaWdodENvbG9yR2VuZXJhdG9yLmdldChxKSxmYWxzZSl9ZnVuY3Rpb24gayhxKXt2YXIgbz1xLnBsdWdpbnMucGllUmVuZGVyZXIuaGlnaGxpZ2h0Q2FudmFzO28uX2N0eC5jbGVhclJlY3QoMCwwLG8uX2N0eC5jYW52YXMud2lkdGgsby5fY3R4LmNhbnZhcy5oZWlnaHQpO2Zvcih2YXIgcD0wO3A8cS5zZXJpZXMubGVuZ3RoO3ArKyl7cS5zZXJpZXNbcF0uX2hpZ2hsaWdodGVkUG9pbnQ9bnVsbH1xLnBsdWdpbnMucGllUmVuZGVyZXIuaGlnaGxpZ2h0ZWRTZXJpZXNJbmRleD1udWxsO3EudGFyZ2V0LnRyaWdnZXIoImpxcGxvdERhdGFVbmhpZ2hsaWdodCIpfWZ1bmN0aW9uIGIocyxyLHYsdSx0KXtpZih1KXt2YXIgcT1bdS5zZXJpZXNJbmRleCx1LnBvaW50SW5kZXgsdS5kYXRhXTt2YXIgcD1qUXVlcnkuRXZlbnQoImpxcGxvdERhdGFNb3VzZU92ZXIiKTtwLnBhZ2VYPXMucGFnZVg7cC5wYWdlWT1zLnBhZ2VZO3QudGFyZ2V0LnRyaWdnZXIocCxxKTtpZih0LnNlcmllc1txWzBdXS5oaWdobGlnaHRNb3VzZU92ZXImJiEocVswXT09dC5wbHVnaW5zLnBpZVJlbmRlcmVyLmhpZ2hsaWdodGVkU2VyaWVzSW5kZXgmJnFbMV09PXQuc2VyaWVzW3FbMF1dLl9oaWdobGlnaHRlZFBvaW50KSl7dmFyIG89alF1ZXJ5LkV2ZW50KCJqcXBsb3REYXRhSGlnaGxpZ2h0Iik7by5wYWdlWD1zLnBhZ2VYO28ucGFnZVk9cy5wYWdlWTt0LnRhcmdldC50cmlnZ2VyKG8scSk7ZCh0LHFbMF0scVsxXSl9fWVsc2V7aWYodT09bnVsbCl7ayh0KX19fWZ1bmN0aW9uIGEocixxLHUsdCxzKXtpZih0KXt2YXIgcD1bdC5zZXJpZXNJbmRleCx0LnBvaW50SW5kZXgsdC5kYXRhXTtpZihzLnNlcmllc1twWzBdXS5oaWdobGlnaHRNb3VzZURvd24mJiEocFswXT09cy5wbHVnaW5zLnBpZVJlbmRlcmVyLmhpZ2hsaWdodGVkU2VyaWVzSW5kZXgmJnBbMV09PXMuc2VyaWVzW3BbMF1dLl9oaWdobGlnaHRlZFBvaW50KSl7dmFyIG89alF1ZXJ5LkV2ZW50KCJqcXBsb3REYXRhSGlnaGxpZ2h0Iik7by5wYWdlWD1yLnBhZ2VYO28ucGFnZVk9ci5wYWdlWTtzLnRhcmdldC50cmlnZ2VyKG8scCk7ZChzLHBbMF0scFsxXSl9fWVsc2V7aWYodD09bnVsbCl7ayhzKX19fWZ1bmN0aW9uIGwocSxwLHQscyxyKXt2YXIgbz1yLnBsdWdpbnMucGllUmVuZGVyZXIuaGlnaGxpZ2h0ZWRTZXJpZXNJbmRleDtpZihvIT1udWxsJiZyLnNlcmllc1tvXS5oaWdobGlnaHRNb3VzZURvd24pe2socil9fWZ1bmN0aW9uIGYocixxLHUsdCxzKXtpZih0KXt2YXIgcD1bdC5zZXJpZXNJbmRleCx0LnBvaW50SW5kZXgsdC5kYXRhXTt2YXIgbz1qUXVlcnkuRXZlbnQoImpxcGxvdERhdGFDbGljayIpO28ucGFnZVg9ci5wYWdlWDtvLnBhZ2VZPXIucGFnZVk7cy50YXJnZXQudHJpZ2dlcihvLHApfX1mdW5jdGlvbiBuKHMscix2LHUsdCl7aWYodSl7dmFyIHE9W3Uuc2VyaWVzSW5kZXgsdS5wb2ludEluZGV4LHUuZGF0YV07dmFyIG89dC5wbHVnaW5zLnBpZVJlbmRlcmVyLmhpZ2hsaWdodGVkU2VyaWVzSW5kZXg7aWYobyE9bnVsbCYmdC5zZXJpZXNbb10uaGlnaGxpZ2h0TW91c2VEb3duKXtrKHQpfXZhciBwPWpRdWVyeS5FdmVudCgianFwbG90RGF0YVJpZ2h0Q2xpY2siKTtwLnBhZ2VYPXMucGFnZVg7cC5wYWdlWT1zLnBhZ2VZO3QudGFyZ2V0LnRyaWdnZXIocCxxKX19ZnVuY3Rpb24gaSgpe2lmKHRoaXMucGx1Z2lucy5waWVSZW5kZXJlciYmdGhpcy5wbHVnaW5zLnBpZVJlbmRlcmVyLmhpZ2hsaWdodENhbnZhcyl7dGhpcy5wbHVnaW5zLnBpZVJlbmRlcmVyLmhpZ2hsaWdodENhbnZhcy5yZXNldENhbnZhcygpO3RoaXMucGx1Z2lucy5waWVSZW5kZXJlci5oaWdobGlnaHRDYW52YXM9bnVsbH10aGlzLnBsdWdpbnMucGllUmVuZGVyZXI9e2hpZ2hsaWdodGVkU2VyaWVzSW5kZXg6bnVsbH07dGhpcy5wbHVnaW5zLnBpZVJlbmRlcmVyLmhpZ2hsaWdodENhbnZhcz1uZXcgZS5qcXBsb3QuR2VuZXJpY0NhbnZhcygpO3ZhciBwPWUodGhpcy50YXJnZXRJZCsiIC5qcXBsb3QtZGF0YS1sYWJlbCIpO2lmKHAubGVuZ3RoKXtlKHBbMF0pLmJlZm9yZSh0aGlzLnBsdWdpbnMucGllUmVuZGVyZXIuaGlnaGxpZ2h0Q2FudmFzLmNyZWF0ZUVsZW1lbnQodGhpcy5fZ3JpZFBhZGRpbmcsImpxcGxvdC1waWVSZW5kZXJlci1oaWdobGlnaHQtY2FudmFzIix0aGlzLl9wbG90RGltZW5zaW9ucyx0aGlzKSl9ZWxzZXt0aGlzLmV2ZW50Q2FudmFzLl9lbGVtLmJlZm9yZSh0aGlzLnBsdWdpbnMucGllUmVuZGVyZXIuaGlnaGxpZ2h0Q2FudmFzLmNyZWF0ZUVsZW1lbnQodGhpcy5fZ3JpZFBhZGRpbmcsImpxcGxvdC1waWVSZW5kZXJlci1oaWdobGlnaHQtY2FudmFzIix0aGlzLl9wbG90RGltZW5zaW9ucyx0aGlzKSl9dmFyIG89dGhpcy5wbHVnaW5zLnBpZVJlbmRlcmVyLmhpZ2hsaWdodENhbnZhcy5zZXRDb250ZXh0KCk7dGhpcy5ldmVudENhbnZhcy5fZWxlbS5iaW5kKCJtb3VzZWxlYXZlIix7cGxvdDp0aGlzfSxmdW5jdGlvbihxKXtrKHEuZGF0YS5wbG90KX0pfWUuanFwbG90LnByZUluaXRIb29rcy5wdXNoKGMpO2UuanFwbG90LlBpZVRpY2tSZW5kZXJlcj1mdW5jdGlvbigpe2UuanFwbG90LkF4aXNUaWNrUmVuZGVyZXIuY2FsbCh0aGlzKX07ZS5qcXBsb3QuUGllVGlja1JlbmRlcmVyLnByb3RvdHlwZT1uZXcgZS5qcXBsb3QuQXhpc1RpY2tSZW5kZXJlcigpO2UuanFwbG90LlBpZVRpY2tSZW5kZXJlci5wcm90b3R5cGUuY29uc3RydWN0b3I9ZS5qcXBsb3QuUGllVGlja1JlbmRlcmVyfSkoalF1ZXJ5KTs=]]></data>
	</file>
	<file>
	  <filename>/src/plugins/jqplot.pointLabels.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqCiAqIGpxUGxvdAogKiBQdXJlIEphdmFTY3JpcHQgcGxvdHRpbmcgcGx1Z2luIHVzaW5nIGpRdWVyeQogKgogKiBWZXJzaW9uOiAxLjAuMGIyX3IxMDEyCiAqCiAqIENvcHlyaWdodCAoYykgMjAwOS0yMDExIENocmlzIExlb25lbGxvCiAqIGpxUGxvdCBpcyBjdXJyZW50bHkgYXZhaWxhYmxlIGZvciB1c2UgaW4gYWxsIHBlcnNvbmFsIG9yIGNvbW1lcmNpYWwgcHJvamVjdHMgCiAqIHVuZGVyIGJvdGggdGhlIE1JVCAoaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHApIGFuZCBHUEwgCiAqIHZlcnNpb24gMi4wIChodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC5odG1sKSBsaWNlbnNlcy4gVGhpcyBtZWFucyB0aGF0IHlvdSBjYW4gCiAqIGNob29zZSB0aGUgbGljZW5zZSB0aGF0IGJlc3Qgc3VpdHMgeW91ciBwcm9qZWN0IGFuZCB1c2UgaXQgYWNjb3JkaW5nbHkuIAogKgogKiBBbHRob3VnaCBub3QgcmVxdWlyZWQsIHRoZSBhdXRob3Igd291bGQgYXBwcmVjaWF0ZSBhbiBlbWFpbCBsZXR0aW5nIGhpbSAKICoga25vdyBvZiBhbnkgc3Vic3RhbnRpYWwgdXNlIG9mIGpxUGxvdC4gIFlvdSBjYW4gcmVhY2ggdGhlIGF1dGhvciBhdDogCiAqIGNocmlzIGF0IGpxcGxvdCBkb3QgY29tIG9yIHNlZSBodHRwOi8vd3d3LmpxcGxvdC5jb20vaW5mby5waHAgLgogKgogKiBJZiB5b3UgYXJlIGZlZWxpbmcga2luZCBhbmQgZ2VuZXJvdXMsIGNvbnNpZGVyIHN1cHBvcnRpbmcgdGhlIHByb2plY3QgYnkKICogbWFraW5nIGEgZG9uYXRpb24gYXQ6IGh0dHA6Ly93d3cuanFwbG90LmNvbS9kb25hdGUucGhwIC4KICoKICogc3ByaW50ZiBmdW5jdGlvbnMgY29udGFpbmVkIGluIGpxcGxvdC5zcHJpbnRmLmpzIGJ5IEFzaCBTZWFybGU6CiAqCiAqICAgICB2ZXJzaW9uIDIwMDcuMDQuMjcKICogICAgIGF1dGhvciBBc2ggU2VhcmxlCiAqICAgICBodHRwOi8vaGV4bWVuLmNvbS9ibG9nLzIwMDcvMDMvcHJpbnRmLXNwcmludGYvCiAqICAgICBodHRwOi8vaGV4bWVuLmNvbS9qcy9zcHJpbnRmLmpzCiAqICAgICBUaGUgYXV0aG9yIChBc2ggU2VhcmxlKSBoYXMgcGxhY2VkIHRoaXMgY29kZSBpbiB0aGUgcHVibGljIGRvbWFpbjoKICogICAgICJUaGlzIGNvZGUgaXMgdW5yZXN0cmljdGVkOiB5b3UgYXJlIGZyZWUgdG8gdXNlIGl0IGhvd2V2ZXIgeW91IGxpa2UuIgogKiAKICovCihmdW5jdGlvbigkKSB7CiAgICAKICAgIC8qKgogICAgICogQ2xhc3M6ICQuanFwbG90LlBvaW50TGFiZWxzCiAgICAgKiBQbHVnaW4gZm9yIHB1dHRpbmcgbGFiZWxzIGF0IHRoZSBkYXRhIHBvaW50cy4KICAgICAqIAogICAgICogVG8gdXNlIHRoaXMgcGx1Z2luLCBpbmNsdWRlIHRoZSBqcwogICAgICogZmlsZSBpbiB5b3VyIHNvdXJjZToKICAgICAqIAogICAgICogPiA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJwbHVnaW5zL2pxcGxvdC5wb2ludExhYmVscy5qcyI+PC9zY3JpcHQ+CiAgICAgKiAKICAgICAqIEJ5IGRlZmF1bHQsIHRoZSBsYXN0IHZhbHVlIGluIHRoZSBkYXRhIHBvbml0IGFycmF5IGluIHRoZSBkYXRhIHNlcmllcyBpcyB1c2VkCiAgICAgKiBmb3IgdGhlIGxhYmVsLiAgRm9yIG1vc3Qgc2VyaWVzIHJlbmRlcmVycywgZXh0cmEgZGF0YSBjYW4gYmUgYWRkZWQgdG8gdGhlIAogICAgICogZGF0YSBwb2ludCBhcnJheXMgYW5kIHRoZSBsYXN0IHZhbHVlIHdpbGwgYmUgdXNlZCBhcyB0aGUgbGFiZWwuCiAgICAgKiAKICAgICAqIEZvciBpbnN0YW5jZSwgCiAgICAgKiB0aGlzIHNlcmllczoKICAgICAqIAogICAgICogPiBbWzEsNF0sIFszLDVdLCBbNywyXV0KICAgICAqIAogICAgICogV291bGQsIGJ5IGRlZmF1bHQsIHVzZSB0aGUgeSB2YWx1ZXMgaW4gdGhlIGxhYmVscy4KICAgICAqIEV4dHJhIGRhdGEgY2FuIGJlIGFkZGVkIHRvIHRoZSBzZXJpZXMgbGlrZSBzbzoKICAgICAqIAogICAgICogPiBbWzEsNCwnbWlkJ10sIFszIDUsJ2hpJ10sIFs3LDIsJ2xvdyddXQogICAgICogCiAgICAgKiBBbmQgbm93IHRoZSBwb2ludCBsYWJlbHMgd291bGQgYmUgJ21pZCcsICdsb3cnLCBhbmQgJ2hpJy4KICAgICAqIAogICAgICogT3B0aW9ucyB0byB0aGUgcG9pbnQgbGFiZWxzIGFuZCBhIGN1c3RvbSBsYWJlbHMgYXJyYXkgY2FuIGJlIHBhc3NlZCBpbnRvIHRoZQogICAgICogInBvaW50TGFiZWxzIiBvcHRpb24gb24gdGhlIHNlcmllcyBvcHRpb24gbGlrZSBzbzoKICAgICAqIAogICAgICogPiBzZXJpZXM6W3twb2ludExhYmVsczp7CiAgICAgKiA+ICAgIGxhYmVsczpbJ21pZCcsICdoaScsICdsb3cnXSwKICAgICAqID4gICAgbG9jYXRpb246J3NlJywKICAgICAqID4gICAgeXBhZGRpbmc6IDEyCiAgICAgKiA+ICAgIH0KICAgICAqID4gfV0KICAgICAqIAogICAgICogQSBjdXN0b20gbGFiZWxzIGFycmF5IGluIHRoZSBvcHRpb25zIHRha2VzIHByZWNlbmRlbmNlIG92ZXIgYW55IGxhYmVscwogICAgICogaW4gdGhlIHNlcmllcyBkYXRhLiAgSWYgeW91IGhhdmUgYSBjdXN0b20gbGFiZWxzIGFycmF5IGluIHRoZSBvcHRpb25zLAogICAgICogYnV0IHN0aWxsIHdhbnQgdG8gdXNlIHZhbHVlcyBmcm9tIHRoZSBzZXJpZXMgYXJyYXkgYXMgbGFiZWxzLCBzZXQgdGhlCiAgICAgKiAibGFiZWxzRnJvbVNlcmllcyIgb3B0aW9uIHRvIHRydWUuCiAgICAgKiAKICAgICAqIEJ5IGRlZmF1bHQsIGh0bWwgZW50aXRpZXMgKDwsID4sIGV0Yy4pIGFyZSBlc2NhcGVkIGluIHBvaW50IGxhYmVscy4gIAogICAgICogSWYgeW91IHdhbnQgdG8gaW5jbHVkZSBhY3R1YWwgaHRtbCBtYXJrdXAgaW4gdGhlIGxhYmVscywgCiAgICAgKiBzZXQgdGhlICJlc2NhcGVIVE1MIiBvcHRpb24gdG8gZmFsc2UuCiAgICAgKiAKICAgICAqLwogICAgJC5qcXBsb3QuUG9pbnRMYWJlbHMgPSBmdW5jdGlvbihvcHRpb25zKSB7CiAgICAgICAgLy8gR3JvdXA6IFByb3BlcnRpZXMKICAgICAgICAvLwogICAgICAgIC8vIHByb3A6IHNob3cKICAgICAgICAvLyBzaG93IHRoZSBsYWJlbHMgb3Igbm90LgogICAgICAgIHRoaXMuc2hvdyA9ICQuanFwbG90LmNvbmZpZy5lbmFibGVQbHVnaW5zOwogICAgICAgIC8vIHByb3A6IGxvY2F0aW9uCiAgICAgICAgLy8gY29tcGFzcyBsb2NhdGlvbiB3aGVyZSB0byBwb3NpdGlvbiB0aGUgbGFiZWwgYXJvdW5kIHRoZSBwb2ludC4KICAgICAgICAvLyAnbicsICduZScsICdlJywgJ3NlJywgJ3MnLCAnc3cnLCAndycsICdudycKICAgICAgICB0aGlzLmxvY2F0aW9uID0gJ24nOwogICAgICAgIC8vIHByb3A6IGxhYmVsc0Zyb21TZXJpZXMKICAgICAgICAvLyB0cnVlIHRvIHVzZSBsYWJlbHMgd2l0aGluIGRhdGEgcG9pbnQgYXJyYXlzLgogICAgICAgIHRoaXMubGFiZWxzRnJvbVNlcmllcyA9IGZhbHNlOwogICAgICAgIC8vIHByb3A6IHNlcmllc0xhYmVsSW5kZXgKICAgICAgICAvLyBhcnJheSBpbmRleCBmb3IgbG9jYXRpb24gb2YgbGFiZWxzIHdpdGhpbiBkYXRhIHBvaW50IGFycmF5cy4KICAgICAgICAvLyBpZiBudWxsLCB3aWxsIHVzZSB0aGUgbGFzdCBlbGVtZW50IG9mIHRoZSBkYXRhIHBvaW50IGFycmF5LgogICAgICAgIHRoaXMuc2VyaWVzTGFiZWxJbmRleCA9IG51bGw7CiAgICAgICAgLy8gcHJvcDogbGFiZWxzCiAgICAgICAgLy8gYXJyYXkgb2YgYXJyYXlzIG9mIGxhYmVscywgb25lIGFycmF5IGZvciBlYWNoIHNlcmllcy4KICAgICAgICB0aGlzLmxhYmVscyA9IFtdOwogICAgICAgIC8vIGFjdHVhbCBsYWJlbHMgdGhhdCB3aWxsIGdldCBkaXNwbGF5ZWQuCiAgICAgICAgLy8gbmVlZGVkIHRvIHByZXNlcnZlIHVzZXIgc3BlY2lmaWVkIGxhYmVscyBpbiBsYWJlbHMgYXJyYXkuCiAgICAgICAgdGhpcy5fbGFiZWxzID0gW107CiAgICAgICAgLy8gcHJvcDogc3RhY2tlZFZhbHVlCiAgICAgICAgLy8gdHJ1ZSB0byBkaXNwbGF5IHZhbHVlIGFzIHN0YWNrZWQgaW4gYSBzdGFja2VkIHBsb3QuCiAgICAgICAgLy8gbm8gZWZmZWN0IGlmIGxhYmVscyBpcyBzcGVjaWZpZWQuCiAgICAgICAgdGhpcy5zdGFja2VkVmFsdWUgPSBmYWxzZTsKICAgICAgICAvLyBwcm9wOiB5cGFkZGluZwogICAgICAgIC8vIHZlcnRpY2FsIHBhZGRpbmcgaW4gcGl4ZWxzIGJldHdlZW4gcG9pbnQgYW5kIGxhYmVsCiAgICAgICAgdGhpcy55cGFkZGluZyA9IDY7CiAgICAgICAgLy8gcHJvcDogeHBhZGRpbmcKICAgICAgICAvLyBob3Jpem9udGFsIHBhZGRpbmcgaW4gcGl4ZWxzIGJldHdlZW4gcG9pbnQgYW5kIGxhYmVsCiAgICAgICAgdGhpcy54cGFkZGluZyA9IDY7CiAgICAgICAgLy8gcHJvcDogZXNjYXBlSFRNTAogICAgICAgIC8vIHRydWUgdG8gZXNjYXBlIGh0bWwgZW50aXRpZXMgaW4gdGhlIGxhYmVscy4KICAgICAgICAvLyBJZiB5b3Ugd2FudCB0byBpbmNsdWRlIG1hcmt1cCBpbiB0aGUgbGFiZWxzLCBzZXQgdG8gZmFsc2UuCiAgICAgICAgdGhpcy5lc2NhcGVIVE1MID0gdHJ1ZTsKICAgICAgICAvLyBwcm9wOiBlZGdlVG9sZXJhbmNlCiAgICAgICAgLy8gTnVtYmVyIG9mIHBpeGVscyB0aGF0IHRoZSBsYWJlbCBtdXN0IGJlIGF3YXkgZnJvbSBhbiBheGlzCiAgICAgICAgLy8gYm91bmRhcnkgaW4gb3JkZXIgdG8gYmUgZHJhd24uICBOZWdhdGl2ZSB2YWx1ZXMgd2lsbCBhbGxvdyBvdmVybGFwCiAgICAgICAgLy8gd2l0aCB0aGUgZ3JpZCBib3VuZGFyaWVzLgogICAgICAgIHRoaXMuZWRnZVRvbGVyYW5jZSA9IC01OwogICAgICAgIC8vIHByb3A6IGZvcm1hdHRlcgogICAgICAgIC8vIEEgY2xhc3Mgb2YgYSBmb3JtYXR0ZXIgZm9yIHRoZSB0aWNrIHRleHQuICBzcHJpbnRmIGJ5IGRlZmF1bHQuCiAgICAgICAgdGhpcy5mb3JtYXR0ZXIgPSAkLmpxcGxvdC5EZWZhdWx0VGlja0Zvcm1hdHRlcjsKICAgICAgICAvLyBwcm9wOiBmb3JtYXRTdHJpbmcKICAgICAgICAvLyBzdHJpbmcgcGFzc2VkIHRvIHRoZSBmb3JtYXR0ZXIuCiAgICAgICAgdGhpcy5mb3JtYXRTdHJpbmcgPSAnJzsKICAgICAgICAvLyBwcm9wOiBoaWRlWmVyb3MKICAgICAgICAvLyB0cnVlIHRvIG5vdCBzaG93IGEgbGFiZWwgZm9yIGEgdmFsdWUgd2hpY2ggaXMgMC4KICAgICAgICB0aGlzLmhpZGVaZXJvcyA9IGZhbHNlOwogICAgICAgIHRoaXMuX2VsZW1zID0gW107CiAgICAgICAgCiAgICAgICAgJC5leHRlbmQodHJ1ZSwgdGhpcywgb3B0aW9ucyk7CiAgICB9OwogICAgCiAgICB2YXIgbG9jYXRpb25zID0gWydudycsICduJywgJ25lJywgJ2UnLCAnc2UnLCAncycsICdzdycsICd3J107CiAgICB2YXIgbG9jYXRpb25JbmRpY2llcyA9IHsnbncnOjAsICduJzoxLCAnbmUnOjIsICdlJzozLCAnc2UnOjQsICdzJzo1LCAnc3cnOjYsICd3Jzo3fTsKICAgIHZhciBvcHBvc2l0ZUxvY2F0aW9ucyA9IFsnc2UnLCAncycsICdzdycsICd3JywgJ253JywgJ24nLCAnbmUnLCAnZSddOwogICAgCiAgICAvLyBjYWxsZWQgd2l0aCBzY29wZSBvZiBhIHNlcmllcwogICAgJC5qcXBsb3QuUG9pbnRMYWJlbHMuaW5pdCA9IGZ1bmN0aW9uICh0YXJnZXQsIGRhdGEsIHNlcmllc0RlZmF1bHRzLCBvcHRzLCBwbG90KXsKICAgICAgICB2YXIgb3B0aW9ucyA9ICQuZXh0ZW5kKHRydWUsIHt9LCBzZXJpZXNEZWZhdWx0cywgb3B0cyk7CiAgICAgICAgb3B0aW9ucy5wb2ludExhYmVscyA9IG9wdGlvbnMucG9pbnRMYWJlbHMgfHwge307CiAgICAgICAgaWYgKHRoaXMucmVuZGVyZXIuY29uc3RydWN0b3IgPT09ICQuanFwbG90LkJhclJlbmRlcmVyICYmIHRoaXMuYmFyRGlyZWN0aW9uID09PSAnaG9yaXpvbnRhbCcgJiYgIW9wdGlvbnMucG9pbnRMYWJlbHMubG9jYXRpb24pIHsKICAgICAgICAgICAgb3B0aW9ucy5wb2ludExhYmVscy5sb2NhdGlvbiA9ICdlJzsKICAgICAgICB9CiAgICAgICAgLy8gYWRkIGEgcG9pbnRMYWJlbHMgYXR0cmlidXRlIHRvIHRoZSBzZXJpZXMgcGx1Z2lucwogICAgICAgIHRoaXMucGx1Z2lucy5wb2ludExhYmVscyA9IG5ldyAkLmpxcGxvdC5Qb2ludExhYmVscyhvcHRpb25zLnBvaW50TGFiZWxzKTsKICAgICAgICB0aGlzLnBsdWdpbnMucG9pbnRMYWJlbHMuc2V0TGFiZWxzLmNhbGwodGhpcyk7CiAgICB9OwogICAgCiAgICAvLyBjYWxsZWQgd2l0aCBzY29wZSBvZiBzZXJpZXMKICAgICQuanFwbG90LlBvaW50TGFiZWxzLnByb3RvdHlwZS5zZXRMYWJlbHMgPSBmdW5jdGlvbigpIHsgICAKICAgICAgICB2YXIgcCA9IHRoaXMucGx1Z2lucy5wb2ludExhYmVsczsgCiAgICAgICAgdmFyIGxhYmVsSWR4OwogICAgICAgIGlmIChwLnNlcmllc0xhYmVsSW5kZXggIT0gbnVsbCkgewogICAgICAgICAgICBsYWJlbElkeCA9IHAuc2VyaWVzTGFiZWxJbmRleDsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAodGhpcy5yZW5kZXJlci5jb25zdHJ1Y3RvciA9PT0gJC5qcXBsb3QuQmFyUmVuZGVyZXIgJiYgdGhpcy5iYXJEaXJlY3Rpb24gPT09ICdob3Jpem9udGFsJykgewogICAgICAgICAgICBsYWJlbElkeCA9IDA7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBsYWJlbElkeCA9ICh0aGlzLl9wbG90RGF0YS5sZW5ndGggPT09IDApID8gMCA6IHRoaXMuX3Bsb3REYXRhWzBdLmxlbmd0aCAtMTsKICAgICAgICB9CiAgICAgICAgcC5fbGFiZWxzID0gW107CiAgICAgICAgaWYgKHAubGFiZWxzLmxlbmd0aCA9PT0gMCB8fCBwLmxhYmVsc0Zyb21TZXJpZXMpIHsgICAgCiAgICAgICAgICAgIGlmIChwLnN0YWNrZWRWYWx1ZSkgewogICAgICAgICAgICAgICAgaWYgKHRoaXMuX3Bsb3REYXRhLmxlbmd0aCAmJiB0aGlzLl9wbG90RGF0YVswXS5sZW5ndGgpewogICAgICAgICAgICAgICAgICAgIC8vIHZhciBpZHggPSBwLnNlcmllc0xhYmVsSW5kZXggfHwgdGhpcy5fcGxvdERhdGFbMF0ubGVuZ3RoIC0xOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGk9MDsgaTx0aGlzLl9wbG90RGF0YS5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICBwLl9sYWJlbHMucHVzaCh0aGlzLl9wbG90RGF0YVtpXVtsYWJlbElkeF0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHZhciBkID0gdGhpcy5fcGxvdERhdGE7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5yZW5kZXJlci5jb25zdHJ1Y3RvciA9PT0gJC5qcXBsb3QuQmFyUmVuZGVyZXIgJiYgdGhpcy53YXRlcmZhbGwpIHsKICAgICAgICAgICAgICAgICAgICBkID0gdGhpcy5fZGF0YTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChkLmxlbmd0aCAmJiBkWzBdLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgIC8vIHZhciBpZHggPSBwLnNlcmllc0xhYmVsSW5kZXggfHwgZFswXS5sZW5ndGggLTE7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaT0wOyBpPGQubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgcC5fbGFiZWxzLnB1c2goZFtpXVtsYWJlbElkeF0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGQgPSBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHAubGFiZWxzLmxlbmd0aCl7CiAgICAgICAgICAgIHAuX2xhYmVscyA9IHAubGFiZWxzOwogICAgICAgIH0KICAgIH07CiAgICAKICAgICQuanFwbG90LlBvaW50TGFiZWxzLnByb3RvdHlwZS54T2Zmc2V0ID0gZnVuY3Rpb24oZWxlbSwgbG9jYXRpb24sIHBhZGRpbmcpIHsKICAgICAgICBsb2NhdGlvbiA9IGxvY2F0aW9uIHx8IHRoaXMubG9jYXRpb247CiAgICAgICAgcGFkZGluZyA9IHBhZGRpbmcgfHwgdGhpcy54cGFkZGluZzsKICAgICAgICB2YXIgb2Zmc2V0OwogICAgICAgIAogICAgICAgIHN3aXRjaCAobG9jYXRpb24pIHsKICAgICAgICAgICAgY2FzZSAnbncnOgogICAgICAgICAgICAgICAgb2Zmc2V0ID0gLWVsZW0ub3V0ZXJXaWR0aCh0cnVlKSAtIHRoaXMueHBhZGRpbmc7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnbic6CiAgICAgICAgICAgICAgICBvZmZzZXQgPSAtZWxlbS5vdXRlcldpZHRoKHRydWUpLzI7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnbmUnOgogICAgICAgICAgICAgICAgb2Zmc2V0ID0gIHRoaXMueHBhZGRpbmc7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnZSc6CiAgICAgICAgICAgICAgICBvZmZzZXQgPSB0aGlzLnhwYWRkaW5nOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3NlJzoKICAgICAgICAgICAgICAgIG9mZnNldCA9IHRoaXMueHBhZGRpbmc7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAncyc6CiAgICAgICAgICAgICAgICBvZmZzZXQgPSAtZWxlbS5vdXRlcldpZHRoKHRydWUpLzI7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnc3cnOgogICAgICAgICAgICAgICAgb2Zmc2V0ID0gLWVsZW0ub3V0ZXJXaWR0aCh0cnVlKSAtIHRoaXMueHBhZGRpbmc7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAndyc6CiAgICAgICAgICAgICAgICBvZmZzZXQgPSAtZWxlbS5vdXRlcldpZHRoKHRydWUpIC0gdGhpcy54cGFkZGluZzsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBkZWZhdWx0OiAvLyBzYW1lIGFzICdudycKICAgICAgICAgICAgICAgIG9mZnNldCA9IC1lbGVtLm91dGVyV2lkdGgodHJ1ZSkgLSB0aGlzLnhwYWRkaW5nOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIHJldHVybiBvZmZzZXQ7IAogICAgfTsKICAgIAogICAgJC5qcXBsb3QuUG9pbnRMYWJlbHMucHJvdG90eXBlLnlPZmZzZXQgPSBmdW5jdGlvbihlbGVtLCBsb2NhdGlvbiwgcGFkZGluZykgewogICAgICAgIGxvY2F0aW9uID0gbG9jYXRpb24gfHwgdGhpcy5sb2NhdGlvbjsKICAgICAgICBwYWRkaW5nID0gcGFkZGluZyB8fCB0aGlzLnhwYWRkaW5nOwogICAgICAgIHZhciBvZmZzZXQ7CiAgICAgICAgCiAgICAgICAgc3dpdGNoIChsb2NhdGlvbikgewogICAgICAgICAgICBjYXNlICdudyc6CiAgICAgICAgICAgICAgICBvZmZzZXQgPSAtZWxlbS5vdXRlckhlaWdodCh0cnVlKSAtIHRoaXMueXBhZGRpbmc7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnbic6CiAgICAgICAgICAgICAgICBvZmZzZXQgPSAtZWxlbS5vdXRlckhlaWdodCh0cnVlKSAtIHRoaXMueXBhZGRpbmc7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnbmUnOgogICAgICAgICAgICAgICAgb2Zmc2V0ID0gLWVsZW0ub3V0ZXJIZWlnaHQodHJ1ZSkgLSB0aGlzLnlwYWRkaW5nOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ2UnOgogICAgICAgICAgICAgICAgb2Zmc2V0ID0gLWVsZW0ub3V0ZXJIZWlnaHQodHJ1ZSkvMjsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdzZSc6CiAgICAgICAgICAgICAgICBvZmZzZXQgPSB0aGlzLnlwYWRkaW5nOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3MnOgogICAgICAgICAgICAgICAgb2Zmc2V0ID0gdGhpcy55cGFkZGluZzsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdzdyc6CiAgICAgICAgICAgICAgICBvZmZzZXQgPSB0aGlzLnlwYWRkaW5nOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3cnOgogICAgICAgICAgICAgICAgb2Zmc2V0ID0gLWVsZW0ub3V0ZXJIZWlnaHQodHJ1ZSkvMjsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBkZWZhdWx0OiAvLyBzYW1lIGFzICdudycKICAgICAgICAgICAgICAgIG9mZnNldCA9IC1lbGVtLm91dGVySGVpZ2h0KHRydWUpIC0gdGhpcy55cGFkZGluZzsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICByZXR1cm4gb2Zmc2V0OyAKICAgIH07CiAgICAKICAgIC8vIGNhbGxlZCB3aXRoIHNjb3BlIG9mIHNlcmllcwogICAgJC5qcXBsb3QuUG9pbnRMYWJlbHMuZHJhdyA9IGZ1bmN0aW9uIChzY3R4LCBvcHRpb25zLCBwbG90KSB7CiAgICAgICAgdmFyIHAgPSB0aGlzLnBsdWdpbnMucG9pbnRMYWJlbHM7CiAgICAgICAgLy8gc2V0IGxhYmVscyBhZ2FpbiBpbiBjYXNlIHRoZXkgaGF2ZSBjaGFuZ2VkLgogICAgICAgIHAuc2V0TGFiZWxzLmNhbGwodGhpcyk7CiAgICAgICAgLy8gcmVtb3ZlIGFueSBwcmV2aW91cyBsYWJlbHMKICAgICAgICBmb3IgKHZhciBpPTA7IGk8cC5fZWxlbXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgLy8gTWVtb3J5IExlYWtzIHBhdGNoCiAgICAgICAgICAgIC8vIHAuX2VsZW1zW2ldLnJlbW92ZSgpOwogICAgICAgICAgICBwLl9lbGVtc1tpXS5lbXB0eUZvcmNlKCk7CiAgICAgICAgfQogICAgICAgIHAuX2VsZW1zLnNwbGljZSgwLCBwLl9lbGVtcy5sZW5ndGgpOwoKICAgICAgICBpZiAocC5zaG93KSB7CiAgICAgICAgICAgIHZhciBheCA9ICdfJyt0aGlzLl9zdGFja0F4aXMrJ2F4aXMnOwogICAgICAgIAogICAgICAgICAgICBpZiAoIXAuZm9ybWF0U3RyaW5nKSB7CiAgICAgICAgICAgICAgICBwLmZvcm1hdFN0cmluZyA9IHRoaXNbYXhdLl90aWNrc1swXS5mb3JtYXRTdHJpbmc7CiAgICAgICAgICAgICAgICBwLmZvcm1hdHRlciA9IHRoaXNbYXhdLl90aWNrc1swXS5mb3JtYXR0ZXI7CiAgICAgICAgICAgIH0KICAgICAgICAKICAgICAgICAgICAgdmFyIHBkID0gdGhpcy5fcGxvdERhdGE7CiAgICAgICAgICAgIHZhciB4YXggPSB0aGlzLl94YXhpczsKICAgICAgICAgICAgdmFyIHlheCA9IHRoaXMuX3lheGlzOwogICAgICAgICAgICB2YXIgZWxlbSwgaGVsZW07CgogICAgICAgICAgICBmb3IgKHZhciBpPTAsIGw9cC5fbGFiZWxzLmxlbmd0aDsgaSA8IGw7IGkrKykgewogICAgICAgICAgICAgICAgdmFyIGxhYmVsID0gcC5fbGFiZWxzW2ldOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBpZiAocC5oaWRlWmVyb3MgJiYgcGFyc2VJbnQocC5fbGFiZWxzW2ldLCAxMCkgPT0gMCkgewogICAgICAgICAgICAgICAgICAgIGxhYmVsID0gJyc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGlmIChsYWJlbCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSBwLmZvcm1hdHRlcihwLmZvcm1hdFN0cmluZywgbGFiZWwpOwogICAgICAgICAgICAgICAgfSAKCiAgICAgICAgICAgICAgICBoZWxlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgICAgICAgICAgICAgcC5fZWxlbXNbaV0gPSAkKGhlbGVtKTsKCiAgICAgICAgICAgICAgICBlbGVtID0gcC5fZWxlbXNbaV07CgoKICAgICAgICAgICAgICAgIGVsZW0uYWRkQ2xhc3MoJ2pxcGxvdC1wb2ludC1sYWJlbCBqcXBsb3Qtc2VyaWVzLScrdGhpcy5pbmRleCsnIGpxcGxvdC1wb2ludC0nK2kpOwogICAgICAgICAgICAgICAgZWxlbS5jc3MoJ3Bvc2l0aW9uJywgJ2Fic29sdXRlJyk7CiAgICAgICAgICAgICAgICBlbGVtLmluc2VydEFmdGVyKHNjdHguY2FudmFzKTsKCiAgICAgICAgICAgICAgICBpZiAocC5lc2NhcGVIVE1MKSB7CiAgICAgICAgICAgICAgICAgICAgZWxlbS50ZXh0KGxhYmVsKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIGVsZW0uaHRtbChsYWJlbCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgbG9jYXRpb24gPSBwLmxvY2F0aW9uOwogICAgICAgICAgICAgICAgaWYgKCh0aGlzLmZpbGxUb1plcm8gJiYgcGRbaV1bMV0gPCAwKSB8fCAodGhpcy5maWxsVG9aZXJvICYmIHRoaXMuX3R5cGUgPT09ICdiYXInICYmIHRoaXMuYmFyRGlyZWN0aW9uID09PSAnaG9yaXpvbnRhbCcgJiYgcGRbaV1bMF0gPCAwKSB8fCAodGhpcy53YXRlcmZhbGwgJiYgcGFyc2VJbnQobGFiZWwsIDEwKSkgPCAwKSB7CiAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24gPSBvcHBvc2l0ZUxvY2F0aW9uc1tsb2NhdGlvbkluZGljaWVzW2xvY2F0aW9uXV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgZWxsID0geGF4LnUycChwZFtpXVswXSkgKyBwLnhPZmZzZXQoZWxlbSwgbG9jYXRpb24pOwogICAgICAgICAgICAgICAgdmFyIGVsdCA9IHlheC51MnAocGRbaV1bMV0pICsgcC55T2Zmc2V0KGVsZW0sIGxvY2F0aW9uKTsKICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlbmRlcmVyLmNvbnN0cnVjdG9yID09ICQuanFwbG90LkJhclJlbmRlcmVyKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuYmFyRGlyZWN0aW9uID09ICJ2ZXJ0aWNhbCIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZWxsICs9IHRoaXMuX2Jhck51ZGdlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgZWx0IC09IHRoaXMuX2Jhck51ZGdlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsZW0uY3NzKCdsZWZ0JywgZWxsKTsKICAgICAgICAgICAgICAgIGVsZW0uY3NzKCd0b3AnLCBlbHQpOwogICAgICAgICAgICAgICAgdmFyIGVsciA9IGVsbCArIGVsZW0ud2lkdGgoKTsKICAgICAgICAgICAgICAgIHZhciBlbGIgPSBlbHQgKyBlbGVtLmhlaWdodCgpOwogICAgICAgICAgICAgICAgdmFyIGV0ID0gcC5lZGdlVG9sZXJhbmNlOwogICAgICAgICAgICAgICAgdmFyIHNjbCA9ICQoc2N0eC5jYW52YXMpLnBvc2l0aW9uKCkubGVmdDsKICAgICAgICAgICAgICAgIHZhciBzY3QgPSAkKHNjdHguY2FudmFzKS5wb3NpdGlvbigpLnRvcDsKICAgICAgICAgICAgICAgIHZhciBzY3IgPSBzY3R4LmNhbnZhcy53aWR0aCArIHNjbDsKICAgICAgICAgICAgICAgIHZhciBzY2IgPSBzY3R4LmNhbnZhcy5oZWlnaHQgKyBzY3Q7CiAgICAgICAgICAgICAgICAvLyBpZiBsYWJlbCBpcyBvdXRzaWRlIG9mIGFsbG93ZWQgYXJlYSwgcmVtb3ZlIGl0CiAgICAgICAgICAgICAgICBpZiAoZWxsIC0gZXQgPCBzY2wgfHwgZWx0IC0gZXQgPCBzY3QgfHwgZWxyICsgZXQgPiBzY3IgfHwgZWxiICsgZXQgPiBzY2IpIHsKICAgICAgICAgICAgICAgICAgICBlbGVtLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGVsZW0gPSBudWxsOwogICAgICAgICAgICAgICAgaGVsZW0gPSBudWxsOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBmaW5hbGx5LCBhbmltYXRlIHRoZW0gaWYgdGhlIHNlcmllcyBpcyBhbmltYXRlZAogICAgICAgICAgICAvLyBpZiAodGhpcy5yZW5kZXJlci5hbmltYXRpb24gJiYgdGhpcy5yZW5kZXJlci5hbmltYXRpb24uX3N1cHBvcnRlZCAmJiB0aGlzLnJlbmRlcmVyLmFuaW1hdGlvbi5zaG93ICYmIHBsb3QuX2RyYXdDb3VudCA8IDIpIHsKICAgICAgICAgICAgLy8gICAgIHZhciBzZWwgPSAnLmpxcGxvdC1wb2ludC1sYWJlbC5qcXBsb3Qtc2VyaWVzLScrdGhpcy5pbmRleDsKICAgICAgICAgICAgLy8gICAgICQoc2VsKS5oaWRlKCk7CiAgICAgICAgICAgIC8vICAgICAkKHNlbCkuZmFkZUluKDEwMDApOwogICAgICAgICAgICAvLyB9CgogICAgICAgIH0KICAgIH07CiAgICAKICAgICQuanFwbG90LnBvc3RTZXJpZXNJbml0SG9va3MucHVzaCgkLmpxcGxvdC5Qb2ludExhYmVscy5pbml0KTsKICAgICQuanFwbG90LnBvc3REcmF3U2VyaWVzSG9va3MucHVzaCgkLmpxcGxvdC5Qb2ludExhYmVscy5kcmF3KTsKfSkoalF1ZXJ5KTs=]]></data>
	</file>
	<file>
	  <filename>/src/plugins/jqplot.pointLabels.min.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqCiAqIGpxUGxvdAogKiBQdXJlIEphdmFTY3JpcHQgcGxvdHRpbmcgcGx1Z2luIHVzaW5nIGpRdWVyeQogKgogKiBWZXJzaW9uOiAxLjAuMGIyX3IxMDEyCiAqCiAqIENvcHlyaWdodCAoYykgMjAwOS0yMDExIENocmlzIExlb25lbGxvCiAqIGpxUGxvdCBpcyBjdXJyZW50bHkgYXZhaWxhYmxlIGZvciB1c2UgaW4gYWxsIHBlcnNvbmFsIG9yIGNvbW1lcmNpYWwgcHJvamVjdHMgCiAqIHVuZGVyIGJvdGggdGhlIE1JVCAoaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHApIGFuZCBHUEwgCiAqIHZlcnNpb24gMi4wIChodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC5odG1sKSBsaWNlbnNlcy4gVGhpcyBtZWFucyB0aGF0IHlvdSBjYW4gCiAqIGNob29zZSB0aGUgbGljZW5zZSB0aGF0IGJlc3Qgc3VpdHMgeW91ciBwcm9qZWN0IGFuZCB1c2UgaXQgYWNjb3JkaW5nbHkuIAogKgogKiBBbHRob3VnaCBub3QgcmVxdWlyZWQsIHRoZSBhdXRob3Igd291bGQgYXBwcmVjaWF0ZSBhbiBlbWFpbCBsZXR0aW5nIGhpbSAKICoga25vdyBvZiBhbnkgc3Vic3RhbnRpYWwgdXNlIG9mIGpxUGxvdC4gIFlvdSBjYW4gcmVhY2ggdGhlIGF1dGhvciBhdDogCiAqIGNocmlzIGF0IGpxcGxvdCBkb3QgY29tIG9yIHNlZSBodHRwOi8vd3d3LmpxcGxvdC5jb20vaW5mby5waHAgLgogKgogKiBJZiB5b3UgYXJlIGZlZWxpbmcga2luZCBhbmQgZ2VuZXJvdXMsIGNvbnNpZGVyIHN1cHBvcnRpbmcgdGhlIHByb2plY3QgYnkKICogbWFraW5nIGEgZG9uYXRpb24gYXQ6IGh0dHA6Ly93d3cuanFwbG90LmNvbS9kb25hdGUucGhwIC4KICoKICogc3ByaW50ZiBmdW5jdGlvbnMgY29udGFpbmVkIGluIGpxcGxvdC5zcHJpbnRmLmpzIGJ5IEFzaCBTZWFybGU6CiAqCiAqICAgICB2ZXJzaW9uIDIwMDcuMDQuMjcKICogICAgIGF1dGhvciBBc2ggU2VhcmxlCiAqICAgICBodHRwOi8vaGV4bWVuLmNvbS9ibG9nLzIwMDcvMDMvcHJpbnRmLXNwcmludGYvCiAqICAgICBodHRwOi8vaGV4bWVuLmNvbS9qcy9zcHJpbnRmLmpzCiAqICAgICBUaGUgYXV0aG9yIChBc2ggU2VhcmxlKSBoYXMgcGxhY2VkIHRoaXMgY29kZSBpbiB0aGUgcHVibGljIGRvbWFpbjoKICogICAgICJUaGlzIGNvZGUgaXMgdW5yZXN0cmljdGVkOiB5b3UgYXJlIGZyZWUgdG8gdXNlIGl0IGhvd2V2ZXIgeW91IGxpa2UuIgogKgogKiBpbmNsdWRlZCBqc0RhdGUgbGlicmFyeSBieSBDaHJpcyBMZW9uZWxsbzoKICoKICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEgQ2hyaXMgTGVvbmVsbG8KICoKICoganNEYXRlIGlzIGN1cnJlbnRseSBhdmFpbGFibGUgZm9yIHVzZSBpbiBhbGwgcGVyc29uYWwgb3IgY29tbWVyY2lhbCBwcm9qZWN0cyAKICogdW5kZXIgYm90aCB0aGUgTUlUIGFuZCBHUEwgdmVyc2lvbiAyLjAgbGljZW5zZXMuIFRoaXMgbWVhbnMgdGhhdCB5b3UgY2FuIAogKiBjaG9vc2UgdGhlIGxpY2Vuc2UgdGhhdCBiZXN0IHN1aXRzIHlvdXIgcHJvamVjdCBhbmQgdXNlIGl0IGFjY29yZGluZ2x5LgogKgogKiBqc0RhdGUgYm9ycm93cyBtYW55IGNvbmNlcHRzIGFuZCBpZGVhcyBmcm9tIHRoZSBEYXRlIEluc3RhbmNlIAogKiBNZXRob2RzIGJ5IEtlbiBTbnlkZXIgYWxvbmcgd2l0aCBzb21lIHBhcnRzIG9mIEtlbidzIGFjdHVhbCBjb2RlLgogKiAKICogS2VuJ3Mgb3JpZ2lhbmwgRGF0ZSBJbnN0YW5jZSBNZXRob2RzIGFuZCBjb3B5cmlnaHQgbm90aWNlOgogKiAKICogS2VuIFNueWRlciAoa2VuIGQgc255ZGVyIGF0IGdtYWlsIGRvdCBjb20pCiAqIDIwMDgtMDktMTAKICogdmVyc2lvbiAyLjAuMiAoaHR0cDovL2tlbmRzbnlkZXIuY29tL3NhbmRib3gvZGF0ZS8pICAgICAKICogQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbiBMaWNlbnNlIDMuMCAoaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnkvMy4wLykKICoKICoganFwbG90VG9JbWFnZSBmdW5jdGlvbiBiYXNlZCBvbiBMYXJyeSBTaWRlbidzIGV4cG9ydC1qcXBsb3QtdG8tcG5nLmpzLgogKiBMYXJyeSBoYXMgZ2VuZXJvdXNseSBnaXZlbiBwZXJtaXNzaW9uIHRvIGFkYXB0IGhpcyBjb2RlIGZvciBpbmNsdXNpb24KICogaW50byBqcVBsb3QuCiAqCiAqIExhcnJ5J3Mgb3JpZ2luYWwgY29kZSBjYW4gYmUgZm91bmQgaGVyZToKICoKICogaHR0cHM6Ly9naXRodWIuY29tL2xzaWRlbi9leHBvcnQtanFwbG90LXRvLXBuZwogKiAKICogCiAqLwooZnVuY3Rpb24oYyl7Yy5qcXBsb3QuUG9pbnRMYWJlbHM9ZnVuY3Rpb24oZSl7dGhpcy5zaG93PWMuanFwbG90LmNvbmZpZy5lbmFibGVQbHVnaW5zO3RoaXMubG9jYXRpb249Im4iO3RoaXMubGFiZWxzRnJvbVNlcmllcz1mYWxzZTt0aGlzLnNlcmllc0xhYmVsSW5kZXg9bnVsbDt0aGlzLmxhYmVscz1bXTt0aGlzLl9sYWJlbHM9W107dGhpcy5zdGFja2VkVmFsdWU9ZmFsc2U7dGhpcy55cGFkZGluZz02O3RoaXMueHBhZGRpbmc9Njt0aGlzLmVzY2FwZUhUTUw9dHJ1ZTt0aGlzLmVkZ2VUb2xlcmFuY2U9LTU7dGhpcy5mb3JtYXR0ZXI9Yy5qcXBsb3QuRGVmYXVsdFRpY2tGb3JtYXR0ZXI7dGhpcy5mb3JtYXRTdHJpbmc9IiI7dGhpcy5oaWRlWmVyb3M9ZmFsc2U7dGhpcy5fZWxlbXM9W107Yy5leHRlbmQodHJ1ZSx0aGlzLGUpfTt2YXIgYT1bIm53IiwibiIsIm5lIiwiZSIsInNlIiwicyIsInN3IiwidyJdO3ZhciBkPXtudzowLG46MSxuZToyLGU6MyxzZTo0LHM6NSxzdzo2LHc6N307dmFyIGI9WyJzZSIsInMiLCJzdyIsInciLCJudyIsIm4iLCJuZSIsImUiXTtjLmpxcGxvdC5Qb2ludExhYmVscy5pbml0PWZ1bmN0aW9uKGosaCxmLGcsaSl7dmFyIGU9Yy5leHRlbmQodHJ1ZSx7fSxmLGcpO2UucG9pbnRMYWJlbHM9ZS5wb2ludExhYmVsc3x8e307aWYodGhpcy5yZW5kZXJlci5jb25zdHJ1Y3Rvcj09PWMuanFwbG90LkJhclJlbmRlcmVyJiZ0aGlzLmJhckRpcmVjdGlvbj09PSJob3Jpem9udGFsIiYmIWUucG9pbnRMYWJlbHMubG9jYXRpb24pe2UucG9pbnRMYWJlbHMubG9jYXRpb249ImUifXRoaXMucGx1Z2lucy5wb2ludExhYmVscz1uZXcgYy5qcXBsb3QuUG9pbnRMYWJlbHMoZS5wb2ludExhYmVscyk7dGhpcy5wbHVnaW5zLnBvaW50TGFiZWxzLnNldExhYmVscy5jYWxsKHRoaXMpfTtjLmpxcGxvdC5Qb2ludExhYmVscy5wcm90b3R5cGUuc2V0TGFiZWxzPWZ1bmN0aW9uKCl7dmFyIGY9dGhpcy5wbHVnaW5zLnBvaW50TGFiZWxzO3ZhciBoO2lmKGYuc2VyaWVzTGFiZWxJbmRleCE9bnVsbCl7aD1mLnNlcmllc0xhYmVsSW5kZXh9ZWxzZXtpZih0aGlzLnJlbmRlcmVyLmNvbnN0cnVjdG9yPT09Yy5qcXBsb3QuQmFyUmVuZGVyZXImJnRoaXMuYmFyRGlyZWN0aW9uPT09Imhvcml6b250YWwiKXtoPTB9ZWxzZXtoPSh0aGlzLl9wbG90RGF0YS5sZW5ndGg9PT0wKT8wOnRoaXMuX3Bsb3REYXRhWzBdLmxlbmd0aC0xfX1mLl9sYWJlbHM9W107aWYoZi5sYWJlbHMubGVuZ3RoPT09MHx8Zi5sYWJlbHNGcm9tU2VyaWVzKXtpZihmLnN0YWNrZWRWYWx1ZSl7aWYodGhpcy5fcGxvdERhdGEubGVuZ3RoJiZ0aGlzLl9wbG90RGF0YVswXS5sZW5ndGgpe2Zvcih2YXIgZT0wO2U8dGhpcy5fcGxvdERhdGEubGVuZ3RoO2UrKyl7Zi5fbGFiZWxzLnB1c2godGhpcy5fcGxvdERhdGFbZV1baF0pfX19ZWxzZXt2YXIgZz10aGlzLl9wbG90RGF0YTtpZih0aGlzLnJlbmRlcmVyLmNvbnN0cnVjdG9yPT09Yy5qcXBsb3QuQmFyUmVuZGVyZXImJnRoaXMud2F0ZXJmYWxsKXtnPXRoaXMuX2RhdGF9aWYoZy5sZW5ndGgmJmdbMF0ubGVuZ3RoKXtmb3IodmFyIGU9MDtlPGcubGVuZ3RoO2UrKyl7Zi5fbGFiZWxzLnB1c2goZ1tlXVtoXSl9fWc9bnVsbH19ZWxzZXtpZihmLmxhYmVscy5sZW5ndGgpe2YuX2xhYmVscz1mLmxhYmVsc319fTtjLmpxcGxvdC5Qb2ludExhYmVscy5wcm90b3R5cGUueE9mZnNldD1mdW5jdGlvbihmLGUsZyl7ZT1lfHx0aGlzLmxvY2F0aW9uO2c9Z3x8dGhpcy54cGFkZGluZzt2YXIgaDtzd2l0Y2goZSl7Y2FzZSJudyI6aD0tZi5vdXRlcldpZHRoKHRydWUpLXRoaXMueHBhZGRpbmc7YnJlYWs7Y2FzZSJuIjpoPS1mLm91dGVyV2lkdGgodHJ1ZSkvMjticmVhaztjYXNlIm5lIjpoPXRoaXMueHBhZGRpbmc7YnJlYWs7Y2FzZSJlIjpoPXRoaXMueHBhZGRpbmc7YnJlYWs7Y2FzZSJzZSI6aD10aGlzLnhwYWRkaW5nO2JyZWFrO2Nhc2UicyI6aD0tZi5vdXRlcldpZHRoKHRydWUpLzI7YnJlYWs7Y2FzZSJzdyI6aD0tZi5vdXRlcldpZHRoKHRydWUpLXRoaXMueHBhZGRpbmc7YnJlYWs7Y2FzZSJ3IjpoPS1mLm91dGVyV2lkdGgodHJ1ZSktdGhpcy54cGFkZGluZzticmVhaztkZWZhdWx0Omg9LWYub3V0ZXJXaWR0aCh0cnVlKS10aGlzLnhwYWRkaW5nO2JyZWFrfXJldHVybiBofTtjLmpxcGxvdC5Qb2ludExhYmVscy5wcm90b3R5cGUueU9mZnNldD1mdW5jdGlvbihmLGUsZyl7ZT1lfHx0aGlzLmxvY2F0aW9uO2c9Z3x8dGhpcy54cGFkZGluZzt2YXIgaDtzd2l0Y2goZSl7Y2FzZSJudyI6aD0tZi5vdXRlckhlaWdodCh0cnVlKS10aGlzLnlwYWRkaW5nO2JyZWFrO2Nhc2UibiI6aD0tZi5vdXRlckhlaWdodCh0cnVlKS10aGlzLnlwYWRkaW5nO2JyZWFrO2Nhc2UibmUiOmg9LWYub3V0ZXJIZWlnaHQodHJ1ZSktdGhpcy55cGFkZGluZzticmVhaztjYXNlImUiOmg9LWYub3V0ZXJIZWlnaHQodHJ1ZSkvMjticmVhaztjYXNlInNlIjpoPXRoaXMueXBhZGRpbmc7YnJlYWs7Y2FzZSJzIjpoPXRoaXMueXBhZGRpbmc7YnJlYWs7Y2FzZSJzdyI6aD10aGlzLnlwYWRkaW5nO2JyZWFrO2Nhc2UidyI6aD0tZi5vdXRlckhlaWdodCh0cnVlKS8yO2JyZWFrO2RlZmF1bHQ6aD0tZi5vdXRlckhlaWdodCh0cnVlKS10aGlzLnlwYWRkaW5nO2JyZWFrfXJldHVybiBofTtjLmpxcGxvdC5Qb2ludExhYmVscy5kcmF3PWZ1bmN0aW9uKHgsaix2KXt2YXIgdD10aGlzLnBsdWdpbnMucG9pbnRMYWJlbHM7dC5zZXRMYWJlbHMuY2FsbCh0aGlzKTtmb3IodmFyIHc9MDt3PHQuX2VsZW1zLmxlbmd0aDt3Kyspe3QuX2VsZW1zW3ddLmVtcHR5Rm9yY2UoKX10Ll9lbGVtcy5zcGxpY2UoMCx0Ll9lbGVtcy5sZW5ndGgpO2lmKHQuc2hvdyl7dmFyIHI9Il8iK3RoaXMuX3N0YWNrQXhpcysiYXhpcyI7aWYoIXQuZm9ybWF0U3RyaW5nKXt0LmZvcm1hdFN0cmluZz10aGlzW3JdLl90aWNrc1swXS5mb3JtYXRTdHJpbmc7dC5mb3JtYXR0ZXI9dGhpc1tyXS5fdGlja3NbMF0uZm9ybWF0dGVyfXZhciBEPXRoaXMuX3Bsb3REYXRhO3ZhciBBPXRoaXMuX3hheGlzO3ZhciBxPXRoaXMuX3lheGlzO3ZhciB6LGY7Zm9yKHZhciB3PTAsdT10Ll9sYWJlbHMubGVuZ3RoO3c8dTt3Kyspe3ZhciBvPXQuX2xhYmVsc1t3XTtpZih0LmhpZGVaZXJvcyYmcGFyc2VJbnQodC5fbGFiZWxzW3ddLDEwKT09MCl7bz0iIn1pZihvIT1udWxsKXtvPXQuZm9ybWF0dGVyKHQuZm9ybWF0U3RyaW5nLG8pfWY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dC5fZWxlbXNbd109YyhmKTt6PXQuX2VsZW1zW3ddO3ouYWRkQ2xhc3MoImpxcGxvdC1wb2ludC1sYWJlbCBqcXBsb3Qtc2VyaWVzLSIrdGhpcy5pbmRleCsiIGpxcGxvdC1wb2ludC0iK3cpO3ouY3NzKCJwb3NpdGlvbiIsImFic29sdXRlIik7ei5pbnNlcnRBZnRlcih4LmNhbnZhcyk7aWYodC5lc2NhcGVIVE1MKXt6LnRleHQobyl9ZWxzZXt6Lmh0bWwobyl9dmFyIGc9dC5sb2NhdGlvbjtpZigodGhpcy5maWxsVG9aZXJvJiZEW3ddWzFdPDApfHwodGhpcy5maWxsVG9aZXJvJiZ0aGlzLl90eXBlPT09ImJhciImJnRoaXMuYmFyRGlyZWN0aW9uPT09Imhvcml6b250YWwiJiZEW3ddWzBdPDApfHwodGhpcy53YXRlcmZhbGwmJnBhcnNlSW50KG8sMTApKTwwKXtnPWJbZFtnXV19dmFyIG49QS51MnAoRFt3XVswXSkrdC54T2Zmc2V0KHosZyk7dmFyIGg9cS51MnAoRFt3XVsxXSkrdC55T2Zmc2V0KHosZyk7aWYodGhpcy5yZW5kZXJlci5jb25zdHJ1Y3Rvcj09Yy5qcXBsb3QuQmFyUmVuZGVyZXIpe2lmKHRoaXMuYmFyRGlyZWN0aW9uPT0idmVydGljYWwiKXtuKz10aGlzLl9iYXJOdWRnZX1lbHNle2gtPXRoaXMuX2Jhck51ZGdlfX16LmNzcygibGVmdCIsbik7ei5jc3MoInRvcCIsaCk7dmFyIGs9bit6LndpZHRoKCk7dmFyIHM9aCt6LmhlaWdodCgpO3ZhciBDPXQuZWRnZVRvbGVyYW5jZTt2YXIgZT1jKHguY2FudmFzKS5wb3NpdGlvbigpLmxlZnQ7dmFyIHk9Yyh4LmNhbnZhcykucG9zaXRpb24oKS50b3A7dmFyIEI9eC5jYW52YXMud2lkdGgrZTt2YXIgbT14LmNhbnZhcy5oZWlnaHQreTtpZihuLUM8ZXx8aC1DPHl8fGsrQz5CfHxzK0M+bSl7ei5yZW1vdmUoKX16PW51bGw7Zj1udWxsfX19O2MuanFwbG90LnBvc3RTZXJpZXNJbml0SG9va3MucHVzaChjLmpxcGxvdC5Qb2ludExhYmVscy5pbml0KTtjLmpxcGxvdC5wb3N0RHJhd1Nlcmllc0hvb2tzLnB1c2goYy5qcXBsb3QuUG9pbnRMYWJlbHMuZHJhdyl9KShqUXVlcnkpOw==]]></data>
	</file>
	<file>
	  <filename>/src/plugins/jqplot.pyramidAxisRenderer.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqCiAqIGpxUGxvdAogKiBQdXJlIEphdmFTY3JpcHQgcGxvdHRpbmcgcGx1Z2luIHVzaW5nIGpRdWVyeQogKgogKiBWZXJzaW9uOiAxLjAuMGIyX3IxMDEyCiAqCiAqIENvcHlyaWdodCAoYykgMjAwOS0yMDExIENocmlzIExlb25lbGxvCiAqIGpxUGxvdCBpcyBjdXJyZW50bHkgYXZhaWxhYmxlIGZvciB1c2UgaW4gYWxsIHBlcnNvbmFsIG9yIGNvbW1lcmNpYWwgcHJvamVjdHMgCiAqIHVuZGVyIGJvdGggdGhlIE1JVCAoaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHApIGFuZCBHUEwgCiAqIHZlcnNpb24gMi4wIChodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC5odG1sKSBsaWNlbnNlcy4gVGhpcyBtZWFucyB0aGF0IHlvdSBjYW4gCiAqIGNob29zZSB0aGUgbGljZW5zZSB0aGF0IGJlc3Qgc3VpdHMgeW91ciBwcm9qZWN0IGFuZCB1c2UgaXQgYWNjb3JkaW5nbHkuIAogKgogKiBBbHRob3VnaCBub3QgcmVxdWlyZWQsIHRoZSBhdXRob3Igd291bGQgYXBwcmVjaWF0ZSBhbiBlbWFpbCBsZXR0aW5nIGhpbSAKICoga25vdyBvZiBhbnkgc3Vic3RhbnRpYWwgdXNlIG9mIGpxUGxvdC4gIFlvdSBjYW4gcmVhY2ggdGhlIGF1dGhvciBhdDogCiAqIGNocmlzIGF0IGpxcGxvdCBkb3QgY29tIG9yIHNlZSBodHRwOi8vd3d3LmpxcGxvdC5jb20vaW5mby5waHAgLgogKgogKiBJZiB5b3UgYXJlIGZlZWxpbmcga2luZCBhbmQgZ2VuZXJvdXMsIGNvbnNpZGVyIHN1cHBvcnRpbmcgdGhlIHByb2plY3QgYnkKICogbWFraW5nIGEgZG9uYXRpb24gYXQ6IGh0dHA6Ly93d3cuanFwbG90LmNvbS9kb25hdGUucGhwIC4KICoKICogc3ByaW50ZiBmdW5jdGlvbnMgY29udGFpbmVkIGluIGpxcGxvdC5zcHJpbnRmLmpzIGJ5IEFzaCBTZWFybGU6CiAqCiAqICAgICB2ZXJzaW9uIDIwMDcuMDQuMjcKICogICAgIGF1dGhvciBBc2ggU2VhcmxlCiAqICAgICBodHRwOi8vaGV4bWVuLmNvbS9ibG9nLzIwMDcvMDMvcHJpbnRmLXNwcmludGYvCiAqICAgICBodHRwOi8vaGV4bWVuLmNvbS9qcy9zcHJpbnRmLmpzCiAqICAgICBUaGUgYXV0aG9yIChBc2ggU2VhcmxlKSBoYXMgcGxhY2VkIHRoaXMgY29kZSBpbiB0aGUgcHVibGljIGRvbWFpbjoKICogICAgICJUaGlzIGNvZGUgaXMgdW5yZXN0cmljdGVkOiB5b3UgYXJlIGZyZWUgdG8gdXNlIGl0IGhvd2V2ZXIgeW91IGxpa2UuIgogKiAKICovCihmdW5jdGlvbigkKSB7CiAgICAkLmpxcGxvdC5QeXJhbWlkQXhpc1JlbmRlcmVyID0gZnVuY3Rpb24oKSB7CiAgICAgICAgJC5qcXBsb3QuTGluZWFyQXhpc1JlbmRlcmVyLmNhbGwodGhpcyk7CiAgICB9OwogICAgCiAgICAkLmpxcGxvdC5QeXJhbWlkQXhpc1JlbmRlcmVyLnByb3RvdHlwZSA9IG5ldyAkLmpxcGxvdC5MaW5lYXJBeGlzUmVuZGVyZXIoKTsKICAgICQuanFwbG90LlB5cmFtaWRBeGlzUmVuZGVyZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gJC5qcXBsb3QuUHlyYW1pZEF4aXNSZW5kZXJlcjsKICAgICAgICAKICAgIC8vIGNhbGxlZCB3aXRoIHNjb3BlIG9mIGF4aXMKICAgICQuanFwbG90LlB5cmFtaWRBeGlzUmVuZGVyZXIucHJvdG90eXBlLmluaXQgPSBmdW5jdGlvbihvcHRpb25zKXsKICAgICAgICAvLyBHcm91cDogUHJvcGVydGllcwogICAgICAgIC8vCiAgICAgICAgLy8gcHJvcDogcG9zaXRpb24KICAgICAgICAvLyBQb3NpdGlvbiBvZiBheGlzLiAgVmFsdWVzIGFyZTogdG9wLCBib3R0b20gLCBsZWZ0LCBjZW50ZXIsIHJpZ2h0LgogICAgICAgIC8vIEJ5IGRlZmF1bHQsIHggYW5kIHgyIGF4ZXMgYXJlIGJvdHRvbSwgeSBheGlzIGlzIGNlbnRlci4KICAgICAgICB0aGlzLnBvc2l0aW9uID0gbnVsbDsKICAgICAgICAvLyBwcm9wOiBkcmF3QmFzZWxpbmUKICAgICAgICAvLyBUcnVlIHRvIGRyYXcgdGhlIGF4aXMgYmFzZWxpbmUuCiAgICAgICAgdGhpcy5kcmF3QmFzZWxpbmUgPSB0cnVlOwogICAgICAgIC8vIHByb3A6IGJhc2VsaW5lV2lkdGgKICAgICAgICAvLyB3aWR0aCBvZiB0aGUgYmFzZWxpbmUgaW4gcGl4ZWxzLgogICAgICAgIHRoaXMuYmFzZWxpbmVXaWR0aCA9IG51bGw7CiAgICAgICAgLy8gcHJvcDogYmFzZWxpbmVDb2xvcgogICAgICAgIC8vIENTUyBjb2xvciBzcGVjIGZvciB0aGUgYmFzZWxpbmUuCiAgICAgICAgdGhpcy5iYXNlbGluZUNvbG9yID0gbnVsbDsKICAgICAgICB0aGlzLnRpY2tTcGFjaW5nRmFjdG9yID0gMjU7CiAgICAgICAgdGhpcy5fdHlwZSA9ICdweXJhbWlkJzsKICAgICAgICB0aGlzLl9zcGxpdEF4aXMgPSBmYWxzZTsKICAgICAgICB0aGlzLl9zcGxpdExlbmd0aCA9IG51bGw7CiAgICAgICAgdGhpcy5jYXRlZ29yeSA9IGZhbHNlOwogICAgICAgIHRoaXMuX2F1dG9Gb3JtYXRTdHJpbmcgPSAnJzsKICAgICAgICB0aGlzLl9vdmVycmlkZUZvcm1hdFN0cmluZyA9IGZhbHNlOwogICAgICAgIAogICAgICAgICQuZXh0ZW5kKHRydWUsIHRoaXMsIG9wdGlvbnMpOwogICAgICAgIHRoaXMucmVuZGVyZXIub3B0aW9ucyA9IG9wdGlvbnM7CgogICAgICAgIHRoaXMucmVzZXREYXRhQm91bmRzID0gdGhpcy5yZW5kZXJlci5yZXNldERhdGFCb3VuZHM7CiAgICAgICAgdGhpcy5yZXNldERhdGFCb3VuZHMoKTsKCiAgICB9OwoKICAgICQuanFwbG90LlB5cmFtaWRBeGlzUmVuZGVyZXIucHJvdG90eXBlLnJlc2V0RGF0YUJvdW5kcyA9IGZ1bmN0aW9uKCkgewogICAgICAgIC8vIEdvIHRocm91Z2ggYWxsIHRoZSBzZXJpZXMgYXR0YWNoZWQgdG8gdGhpcyBheGlzIGFuZCBmaW5kCiAgICAgICAgLy8gdGhlIG1pbi9tYXggYm91bmRzIGZvciB0aGlzIGF4aXMuCiAgICAgICAgdmFyIGRiID0gdGhpcy5fZGF0YUJvdW5kczsKICAgICAgICBkYi5taW4gPSBudWxsOwogICAgICAgIGRiLm1heCA9IG51bGw7CiAgICAgICAgdmFyIHRlbXA7CiAgICAgICAgZm9yICh2YXIgaT0wOyBpPHRoaXMuX3Nlcmllcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICB2YXIgcyA9IHRoaXMuX3Nlcmllc1tpXTsKICAgICAgICAgICAgdmFyIGQgPSBzLl9wbG90RGF0YTsKICAgICAgICAgICAgCiAgICAgICAgICAgIGZvciAodmFyIGo9MCwgbD1kLmxlbmd0aDsgajxsOyBqKyspIHsgCiAgICAgICAgICAgICAgICBpZiAodGhpcy5uYW1lLmNoYXJBdCgwKSA9PT0gJ3gnKSB7CiAgICAgICAgICAgICAgICAgICAgdGVtcCA9IGRbal1bMV07CiAgICAgICAgICAgICAgICAgICAgaWYgKCh0ZW1wICE9PSBudWxsICYmIHRlbXAgPCBkYi5taW4pIHx8IGRiLm1pbiA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICBkYi5taW4gPSB0ZW1wOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoKHRlbXAgIT09IG51bGwgJiYgdGVtcCA+IGRiLm1heCkgfHwgZGIubWF4ID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRiLm1heCA9IHRlbXA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0ZW1wID0gZFtqXVswXTsKICAgICAgICAgICAgICAgICAgICBpZiAoKHRlbXAgIT09IG51bGwgJiYgdGVtcCA8IGRiLm1pbikgfHwgZGIubWluID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRiLm1pbiA9IHRlbXA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICgodGVtcCAhPT0gbnVsbCAmJiB0ZW1wID4gZGIubWF4KSB8fCBkYi5tYXggPT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZGIubWF4ID0gdGVtcDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH07CiAgICAKICAgIC8vIGNhbGxlZCB3aXRoIHNjb3BlIG9mIGF4aXMKICAgICQuanFwbG90LlB5cmFtaWRBeGlzUmVuZGVyZXIucHJvdG90eXBlLmRyYXcgPSBmdW5jdGlvbihjdHgsIHBsb3QpIHsKICAgICAgICBpZiAodGhpcy5zaG93KSB7CiAgICAgICAgICAgIC8vIHBvcHVsYXRlIHRoZSBheGlzIGxhYmVsIGFuZCB2YWx1ZSBwcm9wZXJ0aWVzLgogICAgICAgICAgICAvLyBjcmVhdGVUaWNrcyBpcyBhIG1ldGhvZCBvbiB0aGUgcmVuZGVyZXIsIGJ1dAogICAgICAgICAgICAvLyBjYWxsIGl0IHdpdGhpbiB0aGUgc2NvcGUgb2YgdGhlIGF4aXMuCiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuY3JlYXRlVGlja3MuY2FsbCh0aGlzLCBwbG90KTsKICAgICAgICAgICAgLy8gZmlsbCBhIGRpdiB3aXRoIGF4ZXMgbGFiZWxzIGluIHRoZSByaWdodCBkaXJlY3Rpb24uCiAgICAgICAgICAgIC8vIE5lZWQgdG8gcHJlZ2VuZXJhdGUgZWFjaCBheGlzIHRvIGdldCBpdCdzIGJvdW5kcyBhbmQKICAgICAgICAgICAgLy8gcG9zaXRpb24gaXQgYW5kIHRoZSBsYWJlbHMgY29ycmVjdGx5IG9uIHRoZSBwbG90LgogICAgICAgICAgICB2YXIgZGltPTA7CiAgICAgICAgICAgIHZhciB0ZW1wOwogICAgICAgICAgICAvLyBBZGRlZCBmb3IgdGhlbWluZy4KICAgICAgICAgICAgaWYgKHRoaXMuX2VsZW0pIHsKICAgICAgICAgICAgICAgIC8vIE1lbW9yeSBMZWFrcyBwYXRjaAogICAgICAgICAgICAgICAgLy90aGlzLl9lbGVtLmVtcHR5KCk7CiAgICAgICAgICAgICAgICB0aGlzLl9lbGVtLmVtcHR5Rm9yY2UoKTsKICAgICAgICAgICAgICAgIHRoaXMuX2VsZW0gPSBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICB0aGlzLl9lbGVtID0gJChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSk7CiAgICAgICAgICAgIHRoaXMuX2VsZW0uYWRkQ2xhc3MoJ2pxcGxvdC1heGlzIGpxcGxvdC0nK3RoaXMubmFtZSk7CiAgICAgICAgICAgIHRoaXMuX2VsZW0uY3NzKCdwb3NpdGlvbicsICdhYnNvbHV0ZScpOwoKICAgICAgICAgICAgCiAgICAgICAgICAgIGlmICh0aGlzLm5hbWUgPT0gJ3hheGlzJyB8fCB0aGlzLm5hbWUgPT0gJ3gyYXhpcycpIHsKICAgICAgICAgICAgICAgIHRoaXMuX2VsZW0ud2lkdGgodGhpcy5fcGxvdERpbWVuc2lvbnMud2lkdGgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgdGhpcy5fZWxlbS5oZWlnaHQodGhpcy5fcGxvdERpbWVuc2lvbnMuaGVpZ2h0KTsKICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgLy8gY3JlYXRlIGEgX2xhYmVsIG9iamVjdC4KICAgICAgICAgICAgdGhpcy5sYWJlbE9wdGlvbnMuYXhpcyA9IHRoaXMubmFtZTsKICAgICAgICAgICAgdGhpcy5fbGFiZWwgPSBuZXcgdGhpcy5sYWJlbFJlbmRlcmVyKHRoaXMubGFiZWxPcHRpb25zKTsKICAgICAgICAgICAgaWYgKHRoaXMuX2xhYmVsLnNob3cpIHsKICAgICAgICAgICAgICAgIHZhciBlbGVtID0gdGhpcy5fbGFiZWwuZHJhdyhjdHgsIHBsb3QpOwogICAgICAgICAgICAgICAgZWxlbS5hcHBlbmRUbyh0aGlzLl9lbGVtKTsKICAgICAgICAgICAgICAgIGVsZW0gPSBudWxsOwogICAgICAgICAgICB9CiAgICAKICAgICAgICAgICAgdmFyIHQgPSB0aGlzLl90aWNrczsKICAgICAgICAgICAgdmFyIHRpY2s7CiAgICAgICAgICAgIGZvciAodmFyIGk9MDsgaTx0Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICB0aWNrID0gdFtpXTsKICAgICAgICAgICAgICAgIGlmICh0aWNrLnNob3cgJiYgdGljay5zaG93TGFiZWwgJiYgKCF0aWNrLmlzTWlub3JUaWNrKSkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuX2VsZW0uYXBwZW5kKHRpY2suZHJhdyhjdHgsIHBsb3QpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICB0aWNrID0gbnVsbDsKICAgICAgICAgICAgdCA9IG51bGw7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzLl9lbGVtOwogICAgfTsgICAKCiAgICAvLyBOb3RlLCBwcmltZXMgY2FuIGJlIGZvdW5kIG9uIGh0dHA6Ly9wcmltZXMudXRtLmVkdS8KICAgIHZhciBfcHJpbWVzID0gWzIsIDMsIDUsIDcsIDExLCAxMywgMTcsIDE5LCAyMywgMjksIDMxLCAzNywgNDEsIDQzLCA0NywgNTMsIDU5LCA2MSwgNjcsIDcxLCA3MywgNzksIDgzLCA4OSwgOTcsIDEwMSwgMTAzLCAxMDcsIDEwOSwgMTEzLCAxMjcsIDEzMSwgMTM3LCAxMzksIDE0OSwgMTUxLCAxNTcsIDE2MywgMTY3LCAxNzMsIDE3OSwgMTgxLCAxOTEsIDE5MywgMTk3LCAxOTksIDIxMSwgMjIzLCAyMjcsIDIyOSwgMjMzLCAyMzksIDI0MSwgMjUxLCAyNTcsIDI2MywgMjY5LCAyNzEsIDI3NywgMjgxLCAyODMsIDI5MywgMzA3LCAzMTEsIDMxMywgMzE3LCAzMzEsIDMzNywgMzQ3LCAzNDksIDM1MywgMzU5LCAzNjcsIDM3MywgMzc5LCAzODMsIDM4OSwgMzk3LCA0MDEsIDQwOSwgNDE5LCA0MjEsIDQzMSwgNDMzLCA0MzksIDQ0MywgNDQ5LCA0NTcsIDQ2MSwgNDYzLCA0NjcsIDQ3OSwgNDg3LCA0OTEsIDQ5OSwgNTAzLCA1MDksIDUyMSwgNTIzLCA1NDEsIDU0NywgNTU3LCA1NjMsIDU2OSwgNTcxLCA1NzcsIDU4NywgNTkzLCA1OTksIDYwMSwgNjA3LCA2MTMsIDYxNywgNjE5LCA2MzEsIDY0MSwgNjQzLCA2NDcsIDY1MywgNjU5LCA2NjEsIDY3MywgNjc3LCA2ODMsIDY5MSwgNzAxLCA3MDksIDcxOSwgNzI3LCA3MzMsIDczOSwgNzQzLCA3NTEsIDc1NywgNzYxLCA3NjksIDc3MywgNzg3LCA3OTcsIDgwOSwgODExLCA4MjEsIDgyMywgODI3LCA4MjksIDgzOSwgODUzLCA4NTcsIDg1OSwgODYzLCA4NzcsIDg4MSwgODgzLCA4ODcsIDkwNywgOTExLCA5MTksIDkyOSwgOTM3LCA5NDEsIDk0NywgOTUzLCA5NjcsIDk3MSwgOTc3LCA5ODMsIDk5MSwgOTk3XTsKCgogICAgdmFyIF9wcmltZXNIYXNoID0ge307CgogICAgZm9yICh2YXIgaSA9MCwgbCA9IF9wcmltZXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CiAgICAgICAgX3ByaW1lc0hhc2hbX3ByaW1lc1tpXV0gPSBfcHJpbWVzW2ldOwogICAgfQoKICAgIC8vIGNhbGxlZCB3aXRoIHNjb3BlIG9mIGF4aXMKICAgICQuanFwbG90LlB5cmFtaWRBeGlzUmVuZGVyZXIucHJvdG90eXBlLmNyZWF0ZVRpY2tzID0gZnVuY3Rpb24ocGxvdCkgewogICAgICAgIC8vIHdlJ3JlIGFyZSBvcGVyYXRpbmcgb24gYW4gYXhpcyBoZXJlCiAgICAgICAgdmFyIHVzZXJUaWNrcyA9IHRoaXMudGlja3M7CiAgICAgICAgLy8gZGF0YWJvdW5kcyB3ZXJlIHNldCBvbiBheGlzIGluaXRpYWxpemF0aW9uLgogICAgICAgIHZhciBkYiA9IHRoaXMuX2RhdGFCb3VuZHM7CiAgICAgICAgdmFyIGRpbTsKICAgICAgICB2YXIgaW50ZXJ2YWw7CiAgICAgICAgdmFyIG1pbjsKICAgICAgICB2YXIgbWF4OwogICAgICAgIHZhciByYW5nZTsKICAgICAgICB2YXIgcG9zMTsKICAgICAgICB2YXIgcG9zMjsKICAgICAgICB2YXIgdHQ7CiAgICAgICAgdmFyIGk7CiAgICAgICAgdmFyIGw7CiAgICAgICAgdmFyIHM7CiAgICAgICAgLy8gZ2V0IGEgY29weSBvZiB1c2VyJ3Mgc2V0dGluZ3MgZm9yIG1pbi9tYXguCiAgICAgICAgdmFyIHVzZXJNaW4gPSB0aGlzLm1pbjsKICAgICAgICB2YXIgdXNlck1heCA9IHRoaXMubWF4OwogICAgICAgIHZhciB1dDsKICAgICAgICB2YXIgdDsKICAgICAgICB2YXIgdGhyZXNob2xkOwogICAgICAgIHZhciB0ZGltOwogICAgICAgIHZhciBzY2FsZWZhY3Q7CiAgICAgICAgdmFyIHJldDsKICAgICAgICB2YXIgdHVtaW47CiAgICAgICAgdmFyIHR1bWF4OwogICAgICAgIHZhciBtYXhWaXNpYmxlVGlja3M7CiAgICAgICAgdmFyIHZhbDsKICAgICAgICB2YXIgc2tpcCA9IG51bGw7CiAgICAgICAgdmFyIHRlbXA7CiAgICAgICAgCiAgICAgICAgLy8gaWYgd2UgYWxyZWFkeSBoYXZlIHRpY2tzLCB1c2UgdGhlbS4KICAgICAgICAvLyB0aWNrcyBtdXN0IGJlIGluIG9yZGVyIG9mIGluY3JlYXNpbmcgdmFsdWUuCgogICAgICAgIGlmICh1c2VyVGlja3MubGVuZ3RoKSB7CiAgICAgICAgICAgIC8vIHRpY2tzIGNvdWxkIGJlIDFEIG9yIDJEIGFycmF5IG9mIFt2YWwsIHZhbCwgLCwsXSBvciBbW3ZhbCwgbGFiZWxdLCBbdmFsLCBsYWJlbF0sIC4uLl0gb3IgbWl4ZWQKICAgICAgICAgICAgZm9yIChpPTAsIGw9dXNlclRpY2tzLmxlbmd0aDsgaTxsOyBpKyspewogICAgICAgICAgICAgICAgdXQgPSB1c2VyVGlja3NbaV07CiAgICAgICAgICAgICAgICB0ID0gbmV3IHRoaXMudGlja1JlbmRlcmVyKHRoaXMudGlja09wdGlvbnMpOwogICAgICAgICAgICAgICAgaWYgKCQuaXNBcnJheSh1dCkpIHsKICAgICAgICAgICAgICAgICAgICB0LnZhbHVlID0gdXRbMF07CiAgICAgICAgICAgICAgICAgICAgdC5sYWJlbCA9IHV0WzFdOwogICAgICAgICAgICAgICAgICAgIHQuc2V0VGljayh1dFswXSwgdGhpcy5uYW1lKTsKICAgICAgICAgICAgICAgICAgICB0aGlzLl90aWNrcy5wdXNoKHQpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGVsc2UgaWYgKCQuaXNQbGFpbk9iamVjdCh1dCkpIHsKICAgICAgICAgICAgICAgICAgICAkLmV4dGVuZCh0cnVlLCB0LCB1dCk7CiAgICAgICAgICAgICAgICAgICAgdC5heGlzID0gdGhpcy5uYW1lOwogICAgICAgICAgICAgICAgICAgIHRoaXMuX3RpY2tzLnB1c2godCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdXQgPT09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IGkgKyBwbG90LmRlZmF1bHRBeGlzU3RhcnQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSB1dDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdC52YWx1ZSA9IHZhbDsKICAgICAgICAgICAgICAgICAgICB0LmxhYmVsID0gdXQ7CiAgICAgICAgICAgICAgICAgICAgdC5heGlzID0gdGhpcy5uYW1lOwogICAgICAgICAgICAgICAgICAgIHRoaXMuX3RpY2tzLnB1c2godCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5udW1iZXJUaWNrcyA9IHVzZXJUaWNrcy5sZW5ndGg7CiAgICAgICAgICAgIHRoaXMubWluID0gdGhpcy5fdGlja3NbMF0udmFsdWU7CiAgICAgICAgICAgIHRoaXMubWF4ID0gdGhpcy5fdGlja3NbdGhpcy5udW1iZXJUaWNrcy0xXS52YWx1ZTsKICAgICAgICAgICAgdGhpcy50aWNrSW50ZXJ2YWwgPSAodGhpcy5tYXggLSB0aGlzLm1pbikgLyAodGhpcy5udW1iZXJUaWNrcyAtIDEpOwoKICAgICAgICAgICAgLy8gdXNlIHVzZXIgc3BlY2lmaWVkIHRpY2tJbnRlcnZhbCBpZiB0aGVyZSBpcyBvbmUKICAgICAgICAgICAgaWYgKHRoaXMuX29wdGlvbnMudGlja0ludGVydmFsKSB7CiAgICAgICAgICAgICAgICAvLyBoaWRlIGV2ZXJ5IHRpY2sgZXhjZXB0IGZvciB0aWNrcyBvbiBpbnRlcnZhbAogICAgICAgICAgICAgICAgdmFyIHRpID0gdGhpcy5fb3B0aW9ucy50aWNrSW50ZXJ2YWw7CiAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaTx0aGlzLm51bWJlclRpY2tzOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICBpZiAoaSV0aSAhPT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLl90aWNrc1tpXS5zaG93ID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3RpY2tzW2ldLmlzTWlub3JUaWNrID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgLy8gY2hlY2sgaWYgd2UgaGF2ZSB0b28gbWFueSB0aWNrcwogICAgICAgICAgICAgICAgZGltID0gKHRoaXMubmFtZS5jaGFyQXQoMCkgPT09ICd4JykgPyB0aGlzLl9wbG90RGltZW5zaW9ucy53aWR0aCA6IHRoaXMuX3Bsb3REaW1lbnNpb25zLmhlaWdodDsKICAgICAgICAgICAgICAgIG1heFZpc2libGVUaWNrcyA9IE1hdGgucm91bmQoMi4wICsgZGltL3RoaXMudGlja1NwYWNpbmdGYWN0b3IpOwoKICAgICAgICAgICAgICAgIGlmICh0aGlzLm51bWJlclRpY2tzID4gbWF4VmlzaWJsZVRpY2tzKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgZm9yIG51bWJlciBvZiB0aWNrcyB3ZSBjYW4gc2tpcAogICAgICAgICAgICAgICAgICAgIHRlbXAgPSB0aGlzLm51bWJlclRpY2tzIC0gMTsKICAgICAgICAgICAgICAgICAgICBmb3IgKGk9MjsgaTx0ZW1wOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRlbXAgJSBpID09PSAwICYmIHRlbXAvaSA8IG1heFZpc2libGVUaWNrcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpcCA9IGktMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBpZiAoc2tpcCAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgY291bnQgPSAxOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGk9MSwgbD10aGlzLl90aWNrcy5sZW5ndGg7IGk8bDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY291bnQgPD0gc2tpcCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3RpY2tzW2ldLnNob3cgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQgPSAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBpZiBjYXRlZ29yeSBzdHlsZSwgYWRkIG1pbm9yIHRpY2tzIGluIGJldHdlZW4KICAgICAgICAgICAgdGVtcCA9IFtdOwogICAgICAgICAgICBpZiAodGhpcy5jYXRlZ29yeSkgewogICAgICAgICAgICAgICAgLy8gdHVybiBvZmYgZ3JpZGxpbmUgYW5kIG1hcmsgb24gZmlyc3QgdGljawogICAgICAgICAgICAgICAgdGhpcy5fdGlja3NbMF0uc2hvd0dyaWRsaW5lID0gZmFsc2U7CiAgICAgICAgICAgICAgICB0aGlzLl90aWNrc1swXS5zaG93TWFyayA9IGZhbHNlOwoKICAgICAgICAgICAgICAgIGZvciAoaT10aGlzLl90aWNrcy5sZW5ndGgtMTsgaT4wOyBpLS0pIHsKICAgICAgICAgICAgICAgICAgICB0ID0gbmV3IHRoaXMudGlja1JlbmRlcmVyKHRoaXMudGlja09wdGlvbnMpOwogICAgICAgICAgICAgICAgICAgIHQudmFsdWUgPSB0aGlzLl90aWNrc1tpLTFdLnZhbHVlICsgdGhpcy50aWNrSW50ZXJ2YWwvMi4wOwogICAgICAgICAgICAgICAgICAgIHQubGFiZWwgPSAnJzsKICAgICAgICAgICAgICAgICAgICB0LnNob3dMYWJlbCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgIHQuYXhpcyA9IHRoaXMubmFtZTsKICAgICAgICAgICAgICAgICAgICB0aGlzLl90aWNrc1tpXS5zaG93R3JpZGxpbmUgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB0aGlzLl90aWNrc1tpXS5zaG93TWFyayA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgIHRoaXMuX3RpY2tzLnNwbGljZShpLCAwLCB0KTsKICAgICAgICAgICAgICAgICAgICAvLyB0ZW1wLnB1c2godCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gbWVyZ2UgaW4gdGhlIG5ldyB0aWNrcwogICAgICAgICAgICAgICAgLy8gZm9yIChpPTEsIGw9dGVtcC5sZW5ndGg7IGk8bDsgaSsrKSB7CiAgICAgICAgICAgICAgICAvLyAgICAgdGhpcy5fdGlja3Muc3BsaWNlKGksIDAsIHRlbXBbaV0pOwogICAgICAgICAgICAgICAgLy8gfQoKICAgICAgICAgICAgICAgIC8vIG5vdyBhZGQgYSB0aWNrIGF0IGJlZ2lubmluZyBhbmQgZW5kCiAgICAgICAgICAgICAgICB0ID0gbmV3IHRoaXMudGlja1JlbmRlcmVyKHRoaXMudGlja09wdGlvbnMpOwogICAgICAgICAgICAgICAgdC52YWx1ZSA9IHRoaXMuX3RpY2tzWzBdLnZhbHVlIC0gdGhpcy50aWNrSW50ZXJ2YWwvMi4wOwogICAgICAgICAgICAgICAgdC5sYWJlbCA9ICcnOwogICAgICAgICAgICAgICAgdC5zaG93TGFiZWwgPSBmYWxzZTsKICAgICAgICAgICAgICAgIHQuYXhpcyA9IHRoaXMubmFtZTsKICAgICAgICAgICAgICAgIHRoaXMuX3RpY2tzLnVuc2hpZnQodCk7CgogICAgICAgICAgICAgICAgdCA9IG5ldyB0aGlzLnRpY2tSZW5kZXJlcih0aGlzLnRpY2tPcHRpb25zKTsKICAgICAgICAgICAgICAgIHQudmFsdWUgPSB0aGlzLl90aWNrc1t0aGlzLl90aWNrcy5sZW5ndGgtMV0udmFsdWUgKyB0aGlzLnRpY2tJbnRlcnZhbC8yLjA7CiAgICAgICAgICAgICAgICB0LmxhYmVsID0gJyc7CiAgICAgICAgICAgICAgICB0LnNob3dMYWJlbCA9IGZhbHNlOwogICAgICAgICAgICAgICAgdC5heGlzID0gdGhpcy5uYW1lOwogICAgICAgICAgICAgICAgdGhpcy5fdGlja3MucHVzaCh0KTsKCiAgICAgICAgICAgICAgICB0aGlzLnRpY2tJbnRlcnZhbCA9IHRoaXMudGlja0ludGVydmFsIC8gMi4wOwogICAgICAgICAgICAgICAgdGhpcy5udW1iZXJUaWNrcyA9IHRoaXMuX3RpY2tzLmxlbmd0aDsKICAgICAgICAgICAgICAgIHRoaXMubWluID0gdGhpcy5fdGlja3NbMF0udmFsdWU7CiAgICAgICAgICAgICAgICB0aGlzLm1heCA9IHRoaXMuX3RpY2tzW3RoaXMuX3RpY2tzLmxlbmd0aC0xXS52YWx1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gd2UgZG9uJ3QgaGF2ZSBhbnkgdGlja3MgeWV0LCBsZXQncyBtYWtlIHNvbWUhCiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGlmICh0aGlzLm5hbWUuY2hhckF0KDApID09PSAneCcpIHsKICAgICAgICAgICAgICAgIGRpbSA9IHRoaXMuX3Bsb3REaW1lbnNpb25zLndpZHRoOwogICAgICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHggYXhpcyBpcyBzeW1ldHJpYyBhYm91dCAwLgogICAgICAgICAgICAgICAgdmFyIHRlbXBtYXggPSBNYXRoLm1heChkYi5tYXgsIE1hdGguYWJzKGRiLm1pbikpOwogICAgICAgICAgICAgICAgdmFyIHRlbXBtaW4gPSBNYXRoLm1pbihkYi5taW4sIC10ZW1wbWF4KTsKICAgICAgICAgICAgICAgIC8vIG1pbiA9ICgodGhpcy5taW4gIT0gbnVsbCkgPyB0aGlzLm1pbiA6IHRlbXBtaW4pOwogICAgICAgICAgICAgICAgLy8gbWF4ID0gKCh0aGlzLm1heCAhPSBudWxsKSA/IHRoaXMubWF4IDogdGVtcG1heCk7CiAgICAgICAgICAgICAgICBtaW4gPSB0ZW1wbWluOwogICAgICAgICAgICAgICAgbWF4ID0gdGVtcG1heDsKICAgICAgICAgICAgICAgIHJhbmdlID0gbWF4IC0gbWluOwoKICAgICAgICAgICAgICAgIGlmICh0aGlzLnRpY2tPcHRpb25zID09IG51bGwgfHwgIXRoaXMudGlja09wdGlvbnMuZm9ybWF0U3RyaW5nKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fb3ZlcnJpZGVGb3JtYXRTdHJpbmcgPSB0cnVlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHRocmVzaG9sZCA9IDMwOwogICAgICAgICAgICAgICAgdGRpbSA9IE1hdGgubWF4KGRpbSwgdGhyZXNob2xkKzEpOwogICAgICAgICAgICAgICAgc2NhbGVmYWN0ID0gICh0ZGltLXRocmVzaG9sZCkvMzAwLjA7CiAgICAgICAgICAgICAgICByZXQgPSAkLmpxcGxvdC5MaW5lYXJUaWNrR2VuZXJhdG9yKG1pbiwgbWF4LCBzY2FsZWZhY3QpOyAKICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKG1pbiwgbWF4LCBzY2FsZWZhY3QsIHJldCk7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhyZXRbMF0udG9TdHJpbmcoKSwgcmV0WzFdLnRvU3RyaW5nKCkpOwogICAgICAgICAgICAgICAgLy8gY2FsY3VsYXRlIGEgcGFkZGVkIG1heCBhbmQgbWluLCBwb2ludHMgc2hvdWxkIGJlIGxlc3MgdGhhbiB0aGVzZQogICAgICAgICAgICAgICAgLy8gc28gdGhhdCB0aGV5IGFyZW4ndCB0b28gY2xvc2UgdG8gdGhlIGVkZ2VzIG9mIHRoZSBwbG90LgogICAgICAgICAgICAgICAgLy8gVXNlciBjYW4gYWRqdXN0IGhvdyBtdWNoIHBhZGRpbmcgaXMgYWxsb3dlZCB3aXRoIHBhZCwgcGFkTWluIGFuZCBQYWRNYXggb3B0aW9ucy4gCiAgICAgICAgICAgICAgICB0dW1pbiA9IG1pbiArIHJhbmdlKih0aGlzLnBhZE1pbiAtIDEpOwogICAgICAgICAgICAgICAgdHVtYXggPSBtYXggLSByYW5nZSoodGhpcy5wYWRNYXggLSAxKTsKCiAgICAgICAgICAgICAgICBpZiAobWluIDwgdHVtaW4gfHwgbWF4ID4gdHVtYXgpIHsKICAgICAgICAgICAgICAgICAgICB0dW1pbiA9IG1pbiAtIHJhbmdlKih0aGlzLnBhZE1pbiAtIDEpOwogICAgICAgICAgICAgICAgICAgIHR1bWF4ID0gbWF4ICsgcmFuZ2UqKHRoaXMucGFkTWF4IC0gMSk7CiAgICAgICAgICAgICAgICAgICAgcmV0ID0gJC5qcXBsb3QuTGluZWFyVGlja0dlbmVyYXRvcih0dW1pbiwgdHVtYXgsIHNjYWxlZmFjdCk7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyh0dW1pbiwgdHVtYXgsIHNjYWxlZmFjdCwgcmV0KTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB0aGlzLm1pbiA9IHJldFswXTsKICAgICAgICAgICAgICAgIHRoaXMubWF4ID0gcmV0WzFdOwogICAgICAgICAgICAgICAgdGhpcy5udW1iZXJUaWNrcyA9IHJldFsyXTsKICAgICAgICAgICAgICAgIHRoaXMuX2F1dG9Gb3JtYXRTdHJpbmcgPSByZXRbM107CiAgICAgICAgICAgICAgICB0aGlzLnRpY2tJbnRlcnZhbCA9IHJldFs0XTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGRpbSA9IHRoaXMuX3Bsb3REaW1lbnNpb25zLmhlaWdodDsKCiAgICAgICAgICAgICAgICAvLyB0aWNrcyB3aWxsIGJlIG9uIHdob2xlIGludGVnZXJzIGxpa2UgMSwgMiwgMywgLi4uIG9yIDEsIDQsIDcsIC4uLgogICAgICAgICAgICAgICAgbWluID0gZGIubWluOwogICAgICAgICAgICAgICAgbWF4ID0gZGIubWF4OwogICAgICAgICAgICAgICAgcyA9IHRoaXMuX3Nlcmllc1swXTsKICAgICAgICAgICAgICAgIHRoaXMuX3RpY2tzID0gW107CgogICAgICAgICAgICAgICAgcmFuZ2UgPSBtYXggLSBtaW47CgogICAgICAgICAgICAgICAgLy8gaWYgcmFuZ2UgaXMgYSBwcmltZSwgd2lsbCBnZXQgb25seSAyIHRpY2tzLCBleHBhbmQgcmFuZ2UgaW4gdGhhdCBjYXNlLgogICAgICAgICAgICAgICAgaWYgKF9wcmltZXNIYXNoW3JhbmdlXSkgewogICAgICAgICAgICAgICAgICAgIHJhbmdlICs9IDE7CiAgICAgICAgICAgICAgICAgICAgbWF4ICs9IDE7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdGhpcy5tYXggPSBtYXg7CiAgICAgICAgICAgICAgICB0aGlzLm1pbiA9IG1pbjsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgbWF4VmlzaWJsZVRpY2tzID0gTWF0aC5yb3VuZCgyLjAgKyBkaW0vdGhpcy50aWNrU3BhY2luZ0ZhY3Rvcik7CgogICAgICAgICAgICAgICAgaWYgKHJhbmdlICsgMSA8PSBtYXhWaXNpYmxlVGlja3MpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm51bWJlclRpY2tzID0gcmFuZ2UgKyAxOwogICAgICAgICAgICAgICAgICAgIHRoaXMudGlja0ludGVydmFsID0gMS4wOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIC8vIGZpZ3VyZSBvdXQgYSByb3VuZCBudW1iZXIgb2YgdGlja3MgdG8gc2tpcCBpbiBldmVyeSBpbnRlcnZhbAogICAgICAgICAgICAgICAgICAgIC8vIHJhbmdlIC8gdGkgKyAxID0gbnQKICAgICAgICAgICAgICAgICAgICAvLyB0aSA9IHJhbmdlIC8gKG50IC0gMSkKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpPW1heFZpc2libGVUaWNrczsgaT4xOyBpLS0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJhbmdlLyhpIC0gMSkgPT09IE1hdGgucm91bmQocmFuZ2UvKGkgLSAxKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubnVtYmVyVGlja3MgPSBpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50aWNrSW50ZXJ2YWwgPSByYW5nZS8oaSAtIDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICBpZiAodGhpcy5fb3ZlcnJpZGVGb3JtYXRTdHJpbmcgJiYgdGhpcy5fYXV0b0Zvcm1hdFN0cmluZyAhPSAnJykgewogICAgICAgICAgICAgICAgdGhpcy50aWNrT3B0aW9ucyA9IHRoaXMudGlja09wdGlvbnMgfHwge307CiAgICAgICAgICAgICAgICB0aGlzLnRpY2tPcHRpb25zLmZvcm1hdFN0cmluZyA9IHRoaXMuX2F1dG9Gb3JtYXRTdHJpbmc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBsYWJlbHZhbDsKICAgICAgICAgICAgZm9yIChpPTA7IGk8dGhpcy5udW1iZXJUaWNrczsgaSsrKSB7CiAgICAgICAgICAgICAgICB0aGlzLnRpY2tPcHRpb25zLmF4aXMgPSB0aGlzLm5hbWU7CiAgICAgICAgICAgICAgICBsYWJlbHZhbCA9IHRoaXMubWluICsgdGhpcy50aWNrSW50ZXJ2YWwgKiBpOwogICAgICAgICAgICAgICAgaWYgKHRoaXMubmFtZS5jaGFyQXQoMCkgPT09ICd4JykgewogICAgICAgICAgICAgICAgICAgIGxhYmVsdmFsID0gTWF0aC5hYnMobGFiZWx2YWwpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gdGhpcy50aWNrT3B0aW9ucy5sYWJlbCA9IFN0cmluZyAobGFiZWx2YWwpOwogICAgICAgICAgICAgICAgdGhpcy50aWNrT3B0aW9ucy52YWx1ZSA9IHRoaXMubWluICsgdGhpcy50aWNrSW50ZXJ2YWwgKiBpOwogICAgICAgICAgICAgICAgdCA9IG5ldyB0aGlzLnRpY2tSZW5kZXJlcih0aGlzLnRpY2tPcHRpb25zKTsKCiAgICAgICAgICAgICAgICB0LmxhYmVsID0gdC5wcmVmaXggKyB0LmZvcm1hdHRlcih0LmZvcm1hdFN0cmluZywgbGFiZWx2YWwpOwoKICAgICAgICAgICAgICAgIHRoaXMuX3RpY2tzLnB1c2godCk7CiAgICAgICAgICAgICAgICAvLyBmb3IgeCBheGlzLCBpZiB5IGF4aXMgaXMgaW4gbWlkZGxlLCBhZGQgYSBzeW1ldHJpY2FsIDAgdGljawogICAgICAgICAgICAgICAgaWYgKHRoaXMubmFtZS5jaGFyQXQoMCkgPT09ICd4JyAmJiBwbG90LmF4ZXMueU1pZEF4aXMuc2hvdyAmJiB0aGlzLnRpY2tPcHRpb25zLnZhbHVlID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc3BsaXRBeGlzID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9zcGxpdExlbmd0aCA9IHBsb3QuYXhlcy55TWlkQXhpcy5nZXRXaWR0aCgpOwogICAgICAgICAgICAgICAgICAgIC8vIHQudmFsdWUgPSAtdGhpcy5tYXgvMjAwMC4wOwogICAgICAgICAgICAgICAgICAgIHQgPSBuZXcgdGhpcy50aWNrUmVuZGVyZXIodGhpcy50aWNrT3B0aW9ucyk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGlja3MucHVzaCh0KTsKICAgICAgICAgICAgICAgICAgICB0LnZhbHVlID0gdGhpcy5tYXgvMjAwMC4wOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHQgPSBudWxsOwogICAgICAgIH0KICAgIH07CiAgICAKICAgIC8vIGNhbGxlZCB3aXRoIHNjb3BlIG9mIGF4aXMKICAgICQuanFwbG90LlB5cmFtaWRBeGlzUmVuZGVyZXIucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uKCkgeyAKICAgICAgICB2YXIgZGltID0gMDsKICAgICAgICB2YXIgdGVtcDsKICAgICAgICB2YXIgdyA9IDA7CiAgICAgICAgdmFyIGggPSAwOwogICAgICAgIHZhciBpOwogICAgICAgIHZhciB0OwogICAgICAgIHZhciB0aWNrOwogICAgICAgIHZhciBsc2hvdyA9ICh0aGlzLl9sYWJlbCA9PSBudWxsKSA/IGZhbHNlIDogdGhpcy5fbGFiZWwuc2hvdzsKICAgICAgICBpZiAodGhpcy5zaG93KSB7CiAgICAgICAgICAgIHQgPSB0aGlzLl90aWNrczsKICAgICAgICAgICAgbCA9IHQubGVuZ3RoOwogICAgICAgICAgICBmb3IgKGk9MDsgaTxsOyBpKyspIHsKICAgICAgICAgICAgICAgIHRpY2sgPSB0W2ldOwogICAgICAgICAgICAgICAgaWYgKCF0aWNrLl9icmVha1RpY2sgJiYgdGljay5zaG93ICYmIHRpY2suc2hvd0xhYmVsICYmICF0aWNrLmlzTWlub3JUaWNrKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubmFtZS5jaGFyQXQoMCkgPT09ICd4JykgewogICAgICAgICAgICAgICAgICAgICAgICB0ZW1wID0gdGljay5fZWxlbS5vdXRlckhlaWdodCh0cnVlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAgPSB0aWNrLl9lbGVtLm91dGVyV2lkdGgodHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICh0ZW1wID4gZGltKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRpbSA9IHRlbXA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodGhpcy5uYW1lID09PSAneU1pZEF4aXMnKSB7CiAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaTxsOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICB0aWNrID0gdFtpXTsKICAgICAgICAgICAgICAgICAgICBpZiAodGljay5fZWxlbSkgewogICAgICAgICAgICAgICAgICAgICAgICB0ZW1wID0gKGRpbSAtIHRpY2suX2VsZW0ub3V0ZXJXaWR0aCh0cnVlKSkvMi4wOwogICAgICAgICAgICAgICAgICAgICAgICB0aWNrLl9lbGVtLmNzcygnbGVmdCcsIHRlbXApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICB0aWNrID0gbnVsbDsKICAgICAgICAgICAgdCA9IG51bGw7CiAgICAgICAgICAgIAogICAgICAgICAgICBpZiAobHNob3cpIHsKICAgICAgICAgICAgICAgIHcgPSB0aGlzLl9sYWJlbC5fZWxlbS5vdXRlcldpZHRoKHRydWUpOwogICAgICAgICAgICAgICAgaCA9IHRoaXMuX2xhYmVsLl9lbGVtLm91dGVySGVpZ2h0KHRydWUpOyAKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGhpcy5uYW1lID09PSAneGF4aXMnKSB7CiAgICAgICAgICAgICAgICBkaW0gPSBkaW0gKyBoOwogICAgICAgICAgICAgICAgdGhpcy5fZWxlbS5jc3MoeydoZWlnaHQnOmRpbSsncHgnLCBsZWZ0OicwcHgnLCBib3R0b206JzBweCd9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICh0aGlzLm5hbWUgPT09ICd4MmF4aXMnKSB7CiAgICAgICAgICAgICAgICBkaW0gPSBkaW0gKyBoOwogICAgICAgICAgICAgICAgdGhpcy5fZWxlbS5jc3MoeydoZWlnaHQnOmRpbSsncHgnLCBsZWZ0OicwcHgnLCB0b3A6JzBweCd9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICh0aGlzLm5hbWUgPT09ICd5YXhpcycpIHsKICAgICAgICAgICAgICAgIGRpbSA9IGRpbSArIHc7CiAgICAgICAgICAgICAgICB0aGlzLl9lbGVtLmNzcyh7J3dpZHRoJzpkaW0rJ3B4JywgbGVmdDonMHB4JywgdG9wOicwcHgnfSk7CiAgICAgICAgICAgICAgICBpZiAobHNob3cgJiYgdGhpcy5fbGFiZWwuY29uc3RydWN0b3IgPT0gJC5qcXBsb3QuQXhpc0xhYmVsUmVuZGVyZXIpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9sYWJlbC5fZWxlbS5jc3MoJ3dpZHRoJywgdysncHgnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICh0aGlzLm5hbWUgPT09ICd5TWlkQXhpcycpIHsKICAgICAgICAgICAgICAgIC8vIGRvbid0IGluY2x1ZGUgd2lkdGggb2YgbGFiZWwgYXQgYWxsIGluIHdpZHRoIG9mIGF4aXM/CiAgICAgICAgICAgICAgICAvLyBkaW0gPSAoZGltID4gdykgPyBkaW0gOiB3OwogICAgICAgICAgICAgICAgdmFyIHRlbXAgPSBkaW0vMi4wIC0gdy8yLjA7CiAgICAgICAgICAgICAgICB0aGlzLl9lbGVtLmNzcyh7J3dpZHRoJzpkaW0rJ3B4JywgdG9wOicwcHgnfSk7CiAgICAgICAgICAgICAgICBpZiAobHNob3cgJiYgdGhpcy5fbGFiZWwuY29uc3RydWN0b3IgPT0gJC5qcXBsb3QuQXhpc0xhYmVsUmVuZGVyZXIpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9sYWJlbC5fZWxlbS5jc3Moe3dpZHRoOiB3LCBsZWZ0OiB0ZW1wLCB0b3A6IDB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGRpbSA9IGRpbSArIHc7CiAgICAgICAgICAgICAgICB0aGlzLl9lbGVtLmNzcyh7J3dpZHRoJzpkaW0rJ3B4JywgcmlnaHQ6JzBweCcsIHRvcDonMHB4J30pOwogICAgICAgICAgICAgICAgaWYgKGxzaG93ICYmIHRoaXMuX2xhYmVsLmNvbnN0cnVjdG9yID09ICQuanFwbG90LkF4aXNMYWJlbFJlbmRlcmVyKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbGFiZWwuX2VsZW0uY3NzKCd3aWR0aCcsIHcrJ3B4Jyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9ICAKICAgIH07CiAgICAKICAgICQuanFwbG90LlB5cmFtaWRBeGlzUmVuZGVyZXIucHJvdG90eXBlLnBhY2sgPSBmdW5jdGlvbihwb3MsIG9mZnNldHMpIHsgCiAgICAgICAgLy8gQWRkIGRlZmF1bHRzIGZvciByZXBhY2tpbmcgZnJvbSByZXNldFRpY2tWYWx1ZXMgZnVuY3Rpb24uCiAgICAgICAgcG9zID0gcG9zIHx8IHt9OwogICAgICAgIG9mZnNldHMgPSBvZmZzZXRzIHx8IHRoaXMuX29mZnNldHM7CiAgICAgICAgCiAgICAgICAgdmFyIHRpY2tzID0gdGhpcy5fdGlja3M7CiAgICAgICAgdmFyIG1heCA9IHRoaXMubWF4OwogICAgICAgIHZhciBtaW4gPSB0aGlzLm1pbjsKICAgICAgICB2YXIgb2ZmbWF4ID0gb2Zmc2V0cy5tYXg7CiAgICAgICAgdmFyIG9mZm1pbiA9IG9mZnNldHMubWluOwogICAgICAgIHZhciBsc2hvdyA9ICh0aGlzLl9sYWJlbCA9PSBudWxsKSA/IGZhbHNlIDogdGhpcy5fbGFiZWwuc2hvdzsKICAgICAgICAKICAgICAgICBmb3IgKHZhciBwIGluIHBvcykgewogICAgICAgICAgICB0aGlzLl9lbGVtLmNzcyhwLCBwb3NbcF0pOwogICAgICAgIH0KICAgICAgICAKICAgICAgICB0aGlzLl9vZmZzZXRzID0gb2Zmc2V0czsKICAgICAgICAvLyBwaXhlbGxlbmd0aCB3aWxsIGJlICsgZm9yIHggYXhlcyBhbmQgLSBmb3IgeSBheGVzIGJlY2FzdWUgcGl4ZWxzIGFsd2F5cyBtZWFzdXJlZCBmcm9tIHRvcCBsZWZ0LgogICAgICAgIHZhciBwaXhlbGxlbmd0aCA9IG9mZm1heCAtIG9mZm1pbjsKICAgICAgICB2YXIgdW5pdGxlbmd0aCA9IG1heCAtIG1pbjsKICAgICAgICB2YXIgc2wgPSB0aGlzLl9zcGxpdExlbmd0aDsKICAgICAgICAKICAgICAgICAvLyBwb2ludCB0byB1bml0IGFuZCB1bml0IHRvIHBvaW50IGNvbnZlcnNpb25zIHJlZmVyZW5jZXMgdG8gUGxvdCBET00gZWxlbWVudCB0b3AgbGVmdCBjb3JuZXIuCiAgICAgICAgaWYgKHRoaXMuX3NwbGl0QXhpcykgewogICAgICAgICAgICBwaXhlbGxlbmd0aCAtPSB0aGlzLl9zcGxpdExlbmd0aDsKICAgICAgICAgICAgCiAgICAgICAgICAgIC8vIGRvbid0IGtub3cgdGhhdCB0aGlzIG9uZSBpcyBjb3JyZWN0LgogICAgICAgICAgICB0aGlzLnAydSA9IGZ1bmN0aW9uKHApewogICAgICAgICAgICAgICAgcmV0dXJuIChwIC0gb2ZmbWluKSAqIHVuaXRsZW5ndGggLyBwaXhlbGxlbmd0aCArIG1pbjsKICAgICAgICAgICAgfTsKICAgICAgICAKICAgICAgICAgICAgdGhpcy51MnAgPSBmdW5jdGlvbih1KXsKICAgICAgICAgICAgICAgIGlmICh1IDw9IDApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHUgLSBtaW4pICogcGl4ZWxsZW5ndGggLyB1bml0bGVuZ3RoICsgb2ZmbWluOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh1IC0gbWluKSAqIHBpeGVsbGVuZ3RoIC8gdW5pdGxlbmd0aCArIG9mZm1pbiArIHNsOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgIHRoaXMuc2VyaWVzX3UycCA9IGZ1bmN0aW9uKHUpewogICAgICAgICAgICAgICAgaWYgKHUgPD0gMCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAodSAtIG1pbikgKiBwaXhlbGxlbmd0aCAvIHVuaXRsZW5ndGg7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHUgLSBtaW4pICogcGl4ZWxsZW5ndGggLyB1bml0bGVuZ3RoICsgc2w7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CgogICAgICAgICAgICAvLyBkb24ndCBrbm93IHRoYXQgdGhpcyBvbmUgaXMgY29ycmVjdC4KICAgICAgICAgICAgdGhpcy5zZXJpZXNfcDJ1ID0gZnVuY3Rpb24ocCl7CiAgICAgICAgICAgICAgICByZXR1cm4gcCAqIHVuaXRsZW5ndGggLyBwaXhlbGxlbmd0aCArIG1pbjsKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHRoaXMucDJ1ID0gZnVuY3Rpb24ocCl7CiAgICAgICAgICAgICAgICByZXR1cm4gKHAgLSBvZmZtaW4pICogdW5pdGxlbmd0aCAvIHBpeGVsbGVuZ3RoICsgbWluOwogICAgICAgICAgICB9OwogICAgICAgIAogICAgICAgICAgICB0aGlzLnUycCA9IGZ1bmN0aW9uKHUpewogICAgICAgICAgICAgICAgcmV0dXJuICh1IC0gbWluKSAqIHBpeGVsbGVuZ3RoIC8gdW5pdGxlbmd0aCArIG9mZm1pbjsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICBpZiAodGhpcy5uYW1lLmNoYXJBdCgwKSA9PT0gJ3gnKXsKICAgICAgICAgICAgICAgIHRoaXMuc2VyaWVzX3UycCA9IGZ1bmN0aW9uKHUpewogICAgICAgICAgICAgICAgICAgIHJldHVybiAodSAtIG1pbikgKiBwaXhlbGxlbmd0aCAvIHVuaXRsZW5ndGg7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgdGhpcy5zZXJpZXNfcDJ1ID0gZnVuY3Rpb24ocCl7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHAgKiB1bml0bGVuZ3RoIC8gcGl4ZWxsZW5ndGggKyBtaW47CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgCiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgdGhpcy5zZXJpZXNfdTJwID0gZnVuY3Rpb24odSl7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh1IC0gbWF4KSAqIHBpeGVsbGVuZ3RoIC8gdW5pdGxlbmd0aDsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB0aGlzLnNlcmllc19wMnUgPSBmdW5jdGlvbihwKXsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcCAqIHVuaXRsZW5ndGggLyBwaXhlbGxlbmd0aCArIG1heDsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYgKHRoaXMuc2hvdykgewogICAgICAgICAgICBpZiAodGhpcy5uYW1lLmNoYXJBdCgwKSA9PT0gJ3gnKSB7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpPTA7IGk8dGlja3MubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHRpY2tzW2ldOwogICAgICAgICAgICAgICAgICAgIGlmICh0LnNob3cgJiYgdC5zaG93TGFiZWwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNoaW07CiAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICBpZiAodC5jb25zdHJ1Y3RvciA9PSAkLmpxcGxvdC5DYW52YXNBeGlzVGlja1JlbmRlcmVyICYmIHQuYW5nbGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdpbGwgbmVlZCB0byBhZGp1c3QgYXV0byBwb3NpdGlvbmluZyBiYXNlZCBvbiB3aGljaCBheGlzIHRoaXMgaXMuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGVtcCA9ICh0aGlzLm5hbWUgPT0gJ3hheGlzJykgPyAxIDogLTE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHQubGFiZWxQb3NpdGlvbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2F1dG8nOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwb3NpdGlvbiBhdCBlbmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRlbXAgKiB0LmFuZ2xlIDwgMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hpbSA9IC10LmdldFdpZHRoKCkgKyB0Ll90ZXh0UmVuZGVyZXIuaGVpZ2h0ICogTWF0aC5zaW4oLXQuX3RleHRSZW5kZXJlci5hbmdsZSkgLyAyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBvc2l0aW9uIGF0IHN0YXJ0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hpbSA9IC10Ll90ZXh0UmVuZGVyZXIuaGVpZ2h0ICogTWF0aC5zaW4odC5fdGV4dFJlbmRlcmVyLmFuZ2xlKSAvIDI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnZW5kJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hpbSA9IC10LmdldFdpZHRoKCkgKyB0Ll90ZXh0UmVuZGVyZXIuaGVpZ2h0ICogTWF0aC5zaW4oLXQuX3RleHRSZW5kZXJlci5hbmdsZSkgLyAyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdzdGFydCc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoaW0gPSAtdC5fdGV4dFJlbmRlcmVyLmhlaWdodCAqIE1hdGguc2luKHQuX3RleHRSZW5kZXJlci5hbmdsZSkgLyAyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdtaWRkbGUnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGltID0gLXQuZ2V0V2lkdGgoKS8yICsgdC5fdGV4dFJlbmRlcmVyLmhlaWdodCAqIE1hdGguc2luKC10Ll90ZXh0UmVuZGVyZXIuYW5nbGUpIC8gMjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hpbSA9IC10LmdldFdpZHRoKCkvMiArIHQuX3RleHRSZW5kZXJlci5oZWlnaHQgKiBNYXRoLnNpbigtdC5fdGV4dFJlbmRlcmVyLmFuZ2xlKSAvIDI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hpbSA9IC10LmdldFdpZHRoKCkvMjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdmFsID0gdGhpcy51MnAodC52YWx1ZSkgKyBzaGltICsgJ3B4JzsKICAgICAgICAgICAgICAgICAgICAgICAgdC5fZWxlbS5jc3MoJ2xlZnQnLCB2YWwpOwogICAgICAgICAgICAgICAgICAgICAgICB0LnBhY2soKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAobHNob3cpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdyA9IHRoaXMuX2xhYmVsLl9lbGVtLm91dGVyV2lkdGgodHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbGFiZWwuX2VsZW0uY3NzKCdsZWZ0Jywgb2ZmbWluICsgcGl4ZWxsZW5ndGgvMiAtIHcvMiArICdweCcpOwogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm5hbWUgPT0gJ3hheGlzJykgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9sYWJlbC5fZWxlbS5jc3MoJ2JvdHRvbScsICcwcHgnKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2xhYmVsLl9lbGVtLmNzcygndG9wJywgJzBweCcpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB0aGlzLl9sYWJlbC5wYWNrKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpPTA7IGk8dGlja3MubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHRpY2tzW2ldOwogICAgICAgICAgICAgICAgICAgIGlmICh0LnNob3cgJiYgdC5zaG93TGFiZWwgJiYgIXQuaXNNaW5vclRpY2spIHsgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNoaW07CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0LmNvbnN0cnVjdG9yID09ICQuanFwbG90LkNhbnZhc0F4aXNUaWNrUmVuZGVyZXIgJiYgdC5hbmdsZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2lsbCBuZWVkIHRvIGFkanVzdCBhdXRvIHBvc2l0aW9uaW5nIGJhc2VkIG9uIHdoaWNoIGF4aXMgdGhpcyBpcy4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ZW1wID0gKHRoaXMubmFtZSA9PSAneWF4aXMnKSA/IDEgOiAtMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAodC5sYWJlbFBvc2l0aW9uKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnYXV0byc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBvc2l0aW9uIGF0IGVuZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2VuZCc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ZW1wICogdC5hbmdsZSA8IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoaW0gPSAtdC5fdGV4dFJlbmRlcmVyLmhlaWdodCAqIE1hdGguY29zKC10Ll90ZXh0UmVuZGVyZXIuYW5nbGUpIC8gMjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoaW0gPSAtdC5nZXRIZWlnaHQoKSArIHQuX3RleHRSZW5kZXJlci5oZWlnaHQgKiBNYXRoLmNvcyh0Ll90ZXh0UmVuZGVyZXIuYW5nbGUpIC8gMjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdzdGFydCc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0LmFuZ2xlID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hpbSA9IC10Ll90ZXh0UmVuZGVyZXIuaGVpZ2h0ICogTWF0aC5jb3MoLXQuX3RleHRSZW5kZXJlci5hbmdsZSkgLyAyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hpbSA9IC10LmdldEhlaWdodCgpICsgdC5fdGV4dFJlbmRlcmVyLmhlaWdodCAqIE1hdGguY29zKHQuX3RleHRSZW5kZXJlci5hbmdsZSkgLyAyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ21pZGRsZSc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmICh0LmFuZ2xlID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgc2hpbSA9IC10LmdldEhlaWdodCgpLzIgKyB0Ll90ZXh0UmVuZGVyZXIuaGVpZ2h0ICogTWF0aC5zaW4oLXQuX3RleHRSZW5kZXJlci5hbmdsZSkgLyAyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgc2hpbSA9IC10LmdldEhlaWdodCgpLzIgLSB0Ll90ZXh0UmVuZGVyZXIuaGVpZ2h0ICogTWF0aC5zaW4odC5fdGV4dFJlbmRlcmVyLmFuZ2xlKSAvIDI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hpbSA9IC10LmdldEhlaWdodCgpLzI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoaW0gPSAtdC5nZXRIZWlnaHQoKS8yOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoaW0gPSAtdC5nZXRIZWlnaHQoKS8yOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdmFsID0gdGhpcy51MnAodC52YWx1ZSkgKyBzaGltICsgJ3B4JzsKICAgICAgICAgICAgICAgICAgICAgICAgdC5fZWxlbS5jc3MoJ3RvcCcsIHZhbCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHQucGFjaygpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChsc2hvdykgewogICAgICAgICAgICAgICAgICAgIHZhciBoID0gdGhpcy5fbGFiZWwuX2VsZW0ub3V0ZXJIZWlnaHQodHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubmFtZSAhPT0gJ3lNaWRBeGlzJykgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9sYWJlbC5fZWxlbS5jc3MoJ3RvcCcsIG9mZm1heCAtIHBpeGVsbGVuZ3RoLzIgLSBoLzIgKyAncHgnKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubmFtZSA9PSAneWF4aXMnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2xhYmVsLl9lbGVtLmNzcygnbGVmdCcsICcwcHgnKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5uYW1lICE9PSAneU1pZEF4aXMnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2xhYmVsLl9lbGVtLmNzcygncmlnaHQnLCAnMHB4Jyk7CiAgICAgICAgICAgICAgICAgICAgfSAgIAogICAgICAgICAgICAgICAgICAgIHRoaXMuX2xhYmVsLnBhY2soKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgdGlja3MgPSBudWxsOwogICAgfTsKfSkoalF1ZXJ5KTs=]]></data>
	</file>
	<file>
	  <filename>/src/plugins/jqplot.pyramidAxisRenderer.min.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqCiAqIGpxUGxvdAogKiBQdXJlIEphdmFTY3JpcHQgcGxvdHRpbmcgcGx1Z2luIHVzaW5nIGpRdWVyeQogKgogKiBWZXJzaW9uOiAxLjAuMGIyX3IxMDEyCiAqCiAqIENvcHlyaWdodCAoYykgMjAwOS0yMDExIENocmlzIExlb25lbGxvCiAqIGpxUGxvdCBpcyBjdXJyZW50bHkgYXZhaWxhYmxlIGZvciB1c2UgaW4gYWxsIHBlcnNvbmFsIG9yIGNvbW1lcmNpYWwgcHJvamVjdHMgCiAqIHVuZGVyIGJvdGggdGhlIE1JVCAoaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHApIGFuZCBHUEwgCiAqIHZlcnNpb24gMi4wIChodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC5odG1sKSBsaWNlbnNlcy4gVGhpcyBtZWFucyB0aGF0IHlvdSBjYW4gCiAqIGNob29zZSB0aGUgbGljZW5zZSB0aGF0IGJlc3Qgc3VpdHMgeW91ciBwcm9qZWN0IGFuZCB1c2UgaXQgYWNjb3JkaW5nbHkuIAogKgogKiBBbHRob3VnaCBub3QgcmVxdWlyZWQsIHRoZSBhdXRob3Igd291bGQgYXBwcmVjaWF0ZSBhbiBlbWFpbCBsZXR0aW5nIGhpbSAKICoga25vdyBvZiBhbnkgc3Vic3RhbnRpYWwgdXNlIG9mIGpxUGxvdC4gIFlvdSBjYW4gcmVhY2ggdGhlIGF1dGhvciBhdDogCiAqIGNocmlzIGF0IGpxcGxvdCBkb3QgY29tIG9yIHNlZSBodHRwOi8vd3d3LmpxcGxvdC5jb20vaW5mby5waHAgLgogKgogKiBJZiB5b3UgYXJlIGZlZWxpbmcga2luZCBhbmQgZ2VuZXJvdXMsIGNvbnNpZGVyIHN1cHBvcnRpbmcgdGhlIHByb2plY3QgYnkKICogbWFraW5nIGEgZG9uYXRpb24gYXQ6IGh0dHA6Ly93d3cuanFwbG90LmNvbS9kb25hdGUucGhwIC4KICoKICogc3ByaW50ZiBmdW5jdGlvbnMgY29udGFpbmVkIGluIGpxcGxvdC5zcHJpbnRmLmpzIGJ5IEFzaCBTZWFybGU6CiAqCiAqICAgICB2ZXJzaW9uIDIwMDcuMDQuMjcKICogICAgIGF1dGhvciBBc2ggU2VhcmxlCiAqICAgICBodHRwOi8vaGV4bWVuLmNvbS9ibG9nLzIwMDcvMDMvcHJpbnRmLXNwcmludGYvCiAqICAgICBodHRwOi8vaGV4bWVuLmNvbS9qcy9zcHJpbnRmLmpzCiAqICAgICBUaGUgYXV0aG9yIChBc2ggU2VhcmxlKSBoYXMgcGxhY2VkIHRoaXMgY29kZSBpbiB0aGUgcHVibGljIGRvbWFpbjoKICogICAgICJUaGlzIGNvZGUgaXMgdW5yZXN0cmljdGVkOiB5b3UgYXJlIGZyZWUgdG8gdXNlIGl0IGhvd2V2ZXIgeW91IGxpa2UuIgogKgogKiBpbmNsdWRlZCBqc0RhdGUgbGlicmFyeSBieSBDaHJpcyBMZW9uZWxsbzoKICoKICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEgQ2hyaXMgTGVvbmVsbG8KICoKICoganNEYXRlIGlzIGN1cnJlbnRseSBhdmFpbGFibGUgZm9yIHVzZSBpbiBhbGwgcGVyc29uYWwgb3IgY29tbWVyY2lhbCBwcm9qZWN0cyAKICogdW5kZXIgYm90aCB0aGUgTUlUIGFuZCBHUEwgdmVyc2lvbiAyLjAgbGljZW5zZXMuIFRoaXMgbWVhbnMgdGhhdCB5b3UgY2FuIAogKiBjaG9vc2UgdGhlIGxpY2Vuc2UgdGhhdCBiZXN0IHN1aXRzIHlvdXIgcHJvamVjdCBhbmQgdXNlIGl0IGFjY29yZGluZ2x5LgogKgogKiBqc0RhdGUgYm9ycm93cyBtYW55IGNvbmNlcHRzIGFuZCBpZGVhcyBmcm9tIHRoZSBEYXRlIEluc3RhbmNlIAogKiBNZXRob2RzIGJ5IEtlbiBTbnlkZXIgYWxvbmcgd2l0aCBzb21lIHBhcnRzIG9mIEtlbidzIGFjdHVhbCBjb2RlLgogKiAKICogS2VuJ3Mgb3JpZ2lhbmwgRGF0ZSBJbnN0YW5jZSBNZXRob2RzIGFuZCBjb3B5cmlnaHQgbm90aWNlOgogKiAKICogS2VuIFNueWRlciAoa2VuIGQgc255ZGVyIGF0IGdtYWlsIGRvdCBjb20pCiAqIDIwMDgtMDktMTAKICogdmVyc2lvbiAyLjAuMiAoaHR0cDovL2tlbmRzbnlkZXIuY29tL3NhbmRib3gvZGF0ZS8pICAgICAKICogQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbiBMaWNlbnNlIDMuMCAoaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnkvMy4wLykKICoKICoganFwbG90VG9JbWFnZSBmdW5jdGlvbiBiYXNlZCBvbiBMYXJyeSBTaWRlbidzIGV4cG9ydC1qcXBsb3QtdG8tcG5nLmpzLgogKiBMYXJyeSBoYXMgZ2VuZXJvdXNseSBnaXZlbiBwZXJtaXNzaW9uIHRvIGFkYXB0IGhpcyBjb2RlIGZvciBpbmNsdXNpb24KICogaW50byBqcVBsb3QuCiAqCiAqIExhcnJ5J3Mgb3JpZ2luYWwgY29kZSBjYW4gYmUgZm91bmQgaGVyZToKICoKICogaHR0cHM6Ly9naXRodWIuY29tL2xzaWRlbi9leHBvcnQtanFwbG90LXRvLXBuZwogKiAKICogCiAqLwooZnVuY3Rpb24oZSl7ZS5qcXBsb3QuUHlyYW1pZEF4aXNSZW5kZXJlcj1mdW5jdGlvbigpe2UuanFwbG90LkxpbmVhckF4aXNSZW5kZXJlci5jYWxsKHRoaXMpfTtlLmpxcGxvdC5QeXJhbWlkQXhpc1JlbmRlcmVyLnByb3RvdHlwZT1uZXcgZS5qcXBsb3QuTGluZWFyQXhpc1JlbmRlcmVyKCk7ZS5qcXBsb3QuUHlyYW1pZEF4aXNSZW5kZXJlci5wcm90b3R5cGUuY29uc3RydWN0b3I9ZS5qcXBsb3QuUHlyYW1pZEF4aXNSZW5kZXJlcjtlLmpxcGxvdC5QeXJhbWlkQXhpc1JlbmRlcmVyLnByb3RvdHlwZS5pbml0PWZ1bmN0aW9uKGYpe3RoaXMucG9zaXRpb249bnVsbDt0aGlzLmRyYXdCYXNlbGluZT10cnVlO3RoaXMuYmFzZWxpbmVXaWR0aD1udWxsO3RoaXMuYmFzZWxpbmVDb2xvcj1udWxsO3RoaXMudGlja1NwYWNpbmdGYWN0b3I9MjU7dGhpcy5fdHlwZT0icHlyYW1pZCI7dGhpcy5fc3BsaXRBeGlzPWZhbHNlO3RoaXMuX3NwbGl0TGVuZ3RoPW51bGw7dGhpcy5jYXRlZ29yeT1mYWxzZTt0aGlzLl9hdXRvRm9ybWF0U3RyaW5nPSIiO3RoaXMuX292ZXJyaWRlRm9ybWF0U3RyaW5nPWZhbHNlO2UuZXh0ZW5kKHRydWUsdGhpcyxmKTt0aGlzLnJlbmRlcmVyLm9wdGlvbnM9Zjt0aGlzLnJlc2V0RGF0YUJvdW5kcz10aGlzLnJlbmRlcmVyLnJlc2V0RGF0YUJvdW5kczt0aGlzLnJlc2V0RGF0YUJvdW5kcygpfTtlLmpxcGxvdC5QeXJhbWlkQXhpc1JlbmRlcmVyLnByb3RvdHlwZS5yZXNldERhdGFCb3VuZHM9ZnVuY3Rpb24oKXt2YXIgaD10aGlzLl9kYXRhQm91bmRzO2gubWluPW51bGw7aC5tYXg9bnVsbDt2YXIgZztmb3IodmFyIG09MDttPHRoaXMuX3Nlcmllcy5sZW5ndGg7bSsrKXt2YXIgbj10aGlzLl9zZXJpZXNbbV07dmFyIG89bi5fcGxvdERhdGE7Zm9yKHZhciBrPTAsZj1vLmxlbmd0aDtrPGY7aysrKXtpZih0aGlzLm5hbWUuY2hhckF0KDApPT09IngiKXtnPW9ba11bMV07aWYoKGchPT1udWxsJiZnPGgubWluKXx8aC5taW49PT1udWxsKXtoLm1pbj1nfWlmKChnIT09bnVsbCYmZz5oLm1heCl8fGgubWF4PT09bnVsbCl7aC5tYXg9Z319ZWxzZXtnPW9ba11bMF07aWYoKGchPT1udWxsJiZnPGgubWluKXx8aC5taW49PT1udWxsKXtoLm1pbj1nfWlmKChnIT09bnVsbCYmZz5oLm1heCl8fGgubWF4PT09bnVsbCl7aC5tYXg9Z319fX19O2UuanFwbG90LlB5cmFtaWRBeGlzUmVuZGVyZXIucHJvdG90eXBlLmRyYXc9ZnVuY3Rpb24oZixuKXtpZih0aGlzLnNob3cpe3RoaXMucmVuZGVyZXIuY3JlYXRlVGlja3MuY2FsbCh0aGlzLG4pO3ZhciBtPTA7dmFyIGc7aWYodGhpcy5fZWxlbSl7dGhpcy5fZWxlbS5lbXB0eUZvcmNlKCk7dGhpcy5fZWxlbT1udWxsfXRoaXMuX2VsZW09ZShkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSk7dGhpcy5fZWxlbS5hZGRDbGFzcygianFwbG90LWF4aXMganFwbG90LSIrdGhpcy5uYW1lKTt0aGlzLl9lbGVtLmNzcygicG9zaXRpb24iLCJhYnNvbHV0ZSIpO2lmKHRoaXMubmFtZT09InhheGlzInx8dGhpcy5uYW1lPT0ieDJheGlzIil7dGhpcy5fZWxlbS53aWR0aCh0aGlzLl9wbG90RGltZW5zaW9ucy53aWR0aCl9ZWxzZXt0aGlzLl9lbGVtLmhlaWdodCh0aGlzLl9wbG90RGltZW5zaW9ucy5oZWlnaHQpfXRoaXMubGFiZWxPcHRpb25zLmF4aXM9dGhpcy5uYW1lO3RoaXMuX2xhYmVsPW5ldyB0aGlzLmxhYmVsUmVuZGVyZXIodGhpcy5sYWJlbE9wdGlvbnMpO2lmKHRoaXMuX2xhYmVsLnNob3cpe3ZhciBsPXRoaXMuX2xhYmVsLmRyYXcoZixuKTtsLmFwcGVuZFRvKHRoaXMuX2VsZW0pO2w9bnVsbH12YXIgaz10aGlzLl90aWNrczt2YXIgajtmb3IodmFyIGg9MDtoPGsubGVuZ3RoO2grKyl7aj1rW2hdO2lmKGouc2hvdyYmai5zaG93TGFiZWwmJighai5pc01pbm9yVGljaykpe3RoaXMuX2VsZW0uYXBwZW5kKGouZHJhdyhmLG4pKX19aj1udWxsO2s9bnVsbH1yZXR1cm4gdGhpcy5fZWxlbX07dmFyIGI9WzIsMyw1LDcsMTEsMTMsMTcsMTksMjMsMjksMzEsMzcsNDEsNDMsNDcsNTMsNTksNjEsNjcsNzEsNzMsNzksODMsODksOTcsMTAxLDEwMywxMDcsMTA5LDExMywxMjcsMTMxLDEzNywxMzksMTQ5LDE1MSwxNTcsMTYzLDE2NywxNzMsMTc5LDE4MSwxOTEsMTkzLDE5NywxOTksMjExLDIyMywyMjcsMjI5LDIzMywyMzksMjQxLDI1MSwyNTcsMjYzLDI2OSwyNzEsMjc3LDI4MSwyODMsMjkzLDMwNywzMTEsMzEzLDMxNywzMzEsMzM3LDM0NywzNDksMzUzLDM1OSwzNjcsMzczLDM3OSwzODMsMzg5LDM5Nyw0MDEsNDA5LDQxOSw0MjEsNDMxLDQzMyw0MzksNDQzLDQ0OSw0NTcsNDYxLDQ2Myw0NjcsNDc5LDQ4Nyw0OTEsNDk5LDUwMyw1MDksNTIxLDUyMyw1NDEsNTQ3LDU1Nyw1NjMsNTY5LDU3MSw1NzcsNTg3LDU5Myw1OTksNjAxLDYwNyw2MTMsNjE3LDYxOSw2MzEsNjQxLDY0Myw2NDcsNjUzLDY1OSw2NjEsNjczLDY3Nyw2ODMsNjkxLDcwMSw3MDksNzE5LDcyNyw3MzMsNzM5LDc0Myw3NTEsNzU3LDc2MSw3NjksNzczLDc4Nyw3OTcsODA5LDgxMSw4MjEsODIzLDgyNyw4MjksODM5LDg1Myw4NTcsODU5LDg2Myw4NzcsODgxLDg4Myw4ODcsOTA3LDkxMSw5MTksOTI5LDkzNyw5NDEsOTQ3LDk1Myw5NjcsOTcxLDk3Nyw5ODMsOTkxLDk5N107dmFyIGQ9e307Zm9yKHZhciBjPTAsYT1iLmxlbmd0aDtjPGE7YysrKXtkW2JbY11dPWJbY119ZS5qcXBsb3QuUHlyYW1pZEF4aXNSZW5kZXJlci5wcm90b3R5cGUuY3JlYXRlVGlja3M9ZnVuY3Rpb24oRCl7dmFyIEo9dGhpcy50aWNrczt2YXIgTT10aGlzLl9kYXRhQm91bmRzO3ZhciBFO3ZhciBLO3ZhciBCO3ZhciBHO3ZhciB5O3ZhciBuO3ZhciBrO3ZhciBoO3ZhciBIO3ZhciBDO3ZhciB4O3ZhciBMPXRoaXMubWluO3ZhciBOPXRoaXMubWF4O3ZhciBxO3ZhciB2O3ZhciBtO3ZhciBnO3ZhciBqO3ZhciBPO3ZhciBBO3ZhciBGO3ZhciByO3ZhciBQO3ZhciB6PW51bGw7dmFyIEk7aWYoSi5sZW5ndGgpe2ZvcihIPTAsQz1KLmxlbmd0aDtIPEM7SCsrKXtxPUpbSF07dj1uZXcgdGhpcy50aWNrUmVuZGVyZXIodGhpcy50aWNrT3B0aW9ucyk7aWYoZS5pc0FycmF5KHEpKXt2LnZhbHVlPXFbMF07di5sYWJlbD1xWzFdO3Yuc2V0VGljayhxWzBdLHRoaXMubmFtZSk7dGhpcy5fdGlja3MucHVzaCh2KX1lbHNle2lmKGUuaXNQbGFpbk9iamVjdChxKSl7ZS5leHRlbmQodHJ1ZSx2LHEpO3YuYXhpcz10aGlzLm5hbWU7dGhpcy5fdGlja3MucHVzaCh2KX1lbHNle2lmKHR5cGVvZiBxPT09InN0cmluZyIpe1A9SCtELmRlZmF1bHRBeGlzU3RhcnR9ZWxzZXtQPXF9di52YWx1ZT1QO3YubGFiZWw9cTt2LmF4aXM9dGhpcy5uYW1lO3RoaXMuX3RpY2tzLnB1c2godil9fX10aGlzLm51bWJlclRpY2tzPUoubGVuZ3RoO3RoaXMubWluPXRoaXMuX3RpY2tzWzBdLnZhbHVlO3RoaXMubWF4PXRoaXMuX3RpY2tzW3RoaXMubnVtYmVyVGlja3MtMV0udmFsdWU7dGhpcy50aWNrSW50ZXJ2YWw9KHRoaXMubWF4LXRoaXMubWluKS8odGhpcy5udW1iZXJUaWNrcy0xKTtpZih0aGlzLl9vcHRpb25zLnRpY2tJbnRlcnZhbCl7dmFyIG89dGhpcy5fb3B0aW9ucy50aWNrSW50ZXJ2YWw7Zm9yKEg9MDtIPHRoaXMubnVtYmVyVGlja3M7SCsrKXtpZihIJW8hPT0wKXt0aGlzLl90aWNrc1tIXS5pc01pbm9yVGljaz10cnVlfX19ZWxzZXtFPSh0aGlzLm5hbWUuY2hhckF0KDApPT09IngiKT90aGlzLl9wbG90RGltZW5zaW9ucy53aWR0aDp0aGlzLl9wbG90RGltZW5zaW9ucy5oZWlnaHQ7cj1NYXRoLnJvdW5kKDIrRS90aGlzLnRpY2tTcGFjaW5nRmFjdG9yKTtpZih0aGlzLm51bWJlclRpY2tzPnIpe0k9dGhpcy5udW1iZXJUaWNrcy0xO2ZvcihIPTI7SDxJO0grKyl7aWYoSSVIPT09MCYmSS9IPHIpe3o9SC0xO2JyZWFrfX1pZih6IT09bnVsbCl7dmFyIHA9MTtmb3IoSD0xLEM9dGhpcy5fdGlja3MubGVuZ3RoO0g8QztIKyspe2lmKHA8PXope3RoaXMuX3RpY2tzW0hdLnNob3c9ZmFsc2U7cCs9MX1lbHNle3A9MX19fX19ST1bXTtpZih0aGlzLmNhdGVnb3J5KXt0aGlzLl90aWNrc1swXS5zaG93R3JpZGxpbmU9ZmFsc2U7dGhpcy5fdGlja3NbMF0uc2hvd01hcms9ZmFsc2U7Zm9yKEg9dGhpcy5fdGlja3MubGVuZ3RoLTE7SD4wO0gtLSl7dj1uZXcgdGhpcy50aWNrUmVuZGVyZXIodGhpcy50aWNrT3B0aW9ucyk7di52YWx1ZT10aGlzLl90aWNrc1tILTFdLnZhbHVlK3RoaXMudGlja0ludGVydmFsLzI7di5sYWJlbD0iIjt2LnNob3dMYWJlbD1mYWxzZTt2LmF4aXM9dGhpcy5uYW1lO3RoaXMuX3RpY2tzW0hdLnNob3dHcmlkbGluZT1mYWxzZTt0aGlzLl90aWNrc1tIXS5zaG93TWFyaz1mYWxzZTt0aGlzLl90aWNrcy5zcGxpY2UoSCwwLHYpfXY9bmV3IHRoaXMudGlja1JlbmRlcmVyKHRoaXMudGlja09wdGlvbnMpO3YudmFsdWU9dGhpcy5fdGlja3NbMF0udmFsdWUtdGhpcy50aWNrSW50ZXJ2YWwvMjt2LmxhYmVsPSIiO3Yuc2hvd0xhYmVsPWZhbHNlO3YuYXhpcz10aGlzLm5hbWU7dGhpcy5fdGlja3MudW5zaGlmdCh2KTt2PW5ldyB0aGlzLnRpY2tSZW5kZXJlcih0aGlzLnRpY2tPcHRpb25zKTt2LnZhbHVlPXRoaXMuX3RpY2tzW3RoaXMuX3RpY2tzLmxlbmd0aC0xXS52YWx1ZSt0aGlzLnRpY2tJbnRlcnZhbC8yO3YubGFiZWw9IiI7di5zaG93TGFiZWw9ZmFsc2U7di5heGlzPXRoaXMubmFtZTt0aGlzLl90aWNrcy5wdXNoKHYpO3RoaXMudGlja0ludGVydmFsPXRoaXMudGlja0ludGVydmFsLzI7dGhpcy5udW1iZXJUaWNrcz10aGlzLl90aWNrcy5sZW5ndGg7dGhpcy5taW49dGhpcy5fdGlja3NbMF0udmFsdWU7dGhpcy5tYXg9dGhpcy5fdGlja3NbdGhpcy5fdGlja3MubGVuZ3RoLTFdLnZhbHVlfX1lbHNle2lmKHRoaXMubmFtZS5jaGFyQXQoMCk9PT0ieCIpe0U9dGhpcy5fcGxvdERpbWVuc2lvbnMud2lkdGg7dmFyIHc9TWF0aC5tYXgoTS5tYXgsTWF0aC5hYnMoTS5taW4pKTt2YXIgdT1NYXRoLm1pbihNLm1pbiwtdyk7Qj11O0c9dzt5PUctQjtpZih0aGlzLnRpY2tPcHRpb25zPT1udWxsfHwhdGhpcy50aWNrT3B0aW9ucy5mb3JtYXRTdHJpbmcpe3RoaXMuX292ZXJyaWRlRm9ybWF0U3RyaW5nPXRydWV9bT0zMDtnPU1hdGgubWF4KEUsbSsxKTtqPShnLW0pLzMwMDtPPWUuanFwbG90LkxpbmVhclRpY2tHZW5lcmF0b3IoQixHLGopO2NvbnNvbGUubG9nKEIsRyxqLE8pO2NvbnNvbGUubG9nKE9bMF0udG9TdHJpbmcoKSxPWzFdLnRvU3RyaW5nKCkpO0E9Qit5Kih0aGlzLnBhZE1pbi0xKTtGPUcteSoodGhpcy5wYWRNYXgtMSk7aWYoQjxBfHxHPkYpe0E9Qi15Kih0aGlzLnBhZE1pbi0xKTtGPUcreSoodGhpcy5wYWRNYXgtMSk7Tz1lLmpxcGxvdC5MaW5lYXJUaWNrR2VuZXJhdG9yKEEsRixqKTtjb25zb2xlLmxvZyhBLEYsaixPKX10aGlzLm1pbj1PWzBdO3RoaXMubWF4PU9bMV07dGhpcy5udW1iZXJUaWNrcz1PWzJdO3RoaXMuX2F1dG9Gb3JtYXRTdHJpbmc9T1szXTt0aGlzLnRpY2tJbnRlcnZhbD1PWzRdfWVsc2V7RT10aGlzLl9wbG90RGltZW5zaW9ucy5oZWlnaHQ7Qj1NLm1pbjtHPU0ubWF4O3g9dGhpcy5fc2VyaWVzWzBdO3RoaXMuX3RpY2tzPVtdO3k9Ry1CO2lmKGRbeV0pe3krPTE7Rys9MX10aGlzLm1heD1HO3RoaXMubWluPUI7cj1NYXRoLnJvdW5kKDIrRS90aGlzLnRpY2tTcGFjaW5nRmFjdG9yKTtpZih5KzE8PXIpe3RoaXMubnVtYmVyVGlja3M9eSsxO3RoaXMudGlja0ludGVydmFsPTF9ZWxzZXtmb3IodmFyIEg9cjtIPjE7SC0tKXtpZih5LyhILTEpPT09TWF0aC5yb3VuZCh5LyhILTEpKSl7dGhpcy5udW1iZXJUaWNrcz1IO3RoaXMudGlja0ludGVydmFsPXkvKEgtMSk7YnJlYWt9fX19aWYodGhpcy5fb3ZlcnJpZGVGb3JtYXRTdHJpbmcmJnRoaXMuX2F1dG9Gb3JtYXRTdHJpbmchPSIiKXt0aGlzLnRpY2tPcHRpb25zPXRoaXMudGlja09wdGlvbnN8fHt9O3RoaXMudGlja09wdGlvbnMuZm9ybWF0U3RyaW5nPXRoaXMuX2F1dG9Gb3JtYXRTdHJpbmd9dmFyIGY7Zm9yKEg9MDtIPHRoaXMubnVtYmVyVGlja3M7SCsrKXt0aGlzLnRpY2tPcHRpb25zLmF4aXM9dGhpcy5uYW1lO2Y9dGhpcy5taW4rdGhpcy50aWNrSW50ZXJ2YWwqSDtpZih0aGlzLm5hbWUuY2hhckF0KDApPT09IngiKXtmPU1hdGguYWJzKGYpfXRoaXMudGlja09wdGlvbnMudmFsdWU9dGhpcy5taW4rdGhpcy50aWNrSW50ZXJ2YWwqSDt2PW5ldyB0aGlzLnRpY2tSZW5kZXJlcih0aGlzLnRpY2tPcHRpb25zKTt2LmxhYmVsPXYucHJlZml4K3YuZm9ybWF0dGVyKHYuZm9ybWF0U3RyaW5nLGYpO3RoaXMuX3RpY2tzLnB1c2godik7aWYodGhpcy5uYW1lLmNoYXJBdCgwKT09PSJ4IiYmRC5heGVzLnlNaWRBeGlzLnNob3cmJnRoaXMudGlja09wdGlvbnMudmFsdWU9PT0wKXt0aGlzLl9zcGxpdEF4aXM9dHJ1ZTt0aGlzLl9zcGxpdExlbmd0aD1ELmF4ZXMueU1pZEF4aXMuZ2V0V2lkdGgoKTt2PW5ldyB0aGlzLnRpY2tSZW5kZXJlcih0aGlzLnRpY2tPcHRpb25zKTt0aGlzLl90aWNrcy5wdXNoKHYpO3YudmFsdWU9dGhpcy5tYXgvMjAwMH19dj1udWxsfX07ZS5qcXBsb3QuUHlyYW1pZEF4aXNSZW5kZXJlci5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uKCl7dmFyIG89MDt2YXIgajt2YXIgZz0wO3ZhciBuPTA7dmFyIG07dmFyIGw7dmFyIGs7dmFyIGY9KHRoaXMuX2xhYmVsPT1udWxsKT9mYWxzZTp0aGlzLl9sYWJlbC5zaG93O2lmKHRoaXMuc2hvdyl7bD10aGlzLl90aWNrczthPWwubGVuZ3RoO2ZvcihtPTA7bTxhO20rKyl7az1sW21dO2lmKCFrLl9icmVha1RpY2smJmsuc2hvdyYmay5zaG93TGFiZWwmJiFrLmlzTWlub3JUaWNrKXtpZih0aGlzLm5hbWUuY2hhckF0KDApPT09IngiKXtqPWsuX2VsZW0ub3V0ZXJIZWlnaHQodHJ1ZSl9ZWxzZXtqPWsuX2VsZW0ub3V0ZXJXaWR0aCh0cnVlKX1pZihqPm8pe289an19fWlmKHRoaXMubmFtZT09PSJ5TWlkQXhpcyIpe2ZvcihtPTA7bTxhO20rKyl7az1sW21dO2lmKGsuX2VsZW0pe2o9KG8tay5fZWxlbS5vdXRlcldpZHRoKHRydWUpKS8yO2suX2VsZW0uY3NzKCJsZWZ0IixqKX19fWs9bnVsbDtsPW51bGw7aWYoZil7Zz10aGlzLl9sYWJlbC5fZWxlbS5vdXRlcldpZHRoKHRydWUpO249dGhpcy5fbGFiZWwuX2VsZW0ub3V0ZXJIZWlnaHQodHJ1ZSl9aWYodGhpcy5uYW1lPT09InhheGlzIil7bz1vK247dGhpcy5fZWxlbS5jc3Moe2hlaWdodDpvKyJweCIsbGVmdDoiMHB4Iixib3R0b206IjBweCJ9KX1lbHNle2lmKHRoaXMubmFtZT09PSJ4MmF4aXMiKXtvPW8rbjt0aGlzLl9lbGVtLmNzcyh7aGVpZ2h0Om8rInB4IixsZWZ0OiIwcHgiLHRvcDoiMHB4In0pfWVsc2V7aWYodGhpcy5uYW1lPT09InlheGlzIil7bz1vK2c7dGhpcy5fZWxlbS5jc3Moe3dpZHRoOm8rInB4IixsZWZ0OiIwcHgiLHRvcDoiMHB4In0pO2lmKGYmJnRoaXMuX2xhYmVsLmNvbnN0cnVjdG9yPT1lLmpxcGxvdC5BeGlzTGFiZWxSZW5kZXJlcil7dGhpcy5fbGFiZWwuX2VsZW0uY3NzKCJ3aWR0aCIsZysicHgiKX19ZWxzZXtpZih0aGlzLm5hbWU9PT0ieU1pZEF4aXMiKXt2YXIgaj1vLzItZy8yO3RoaXMuX2VsZW0uY3NzKHt3aWR0aDpvKyJweCIsdG9wOiIwcHgifSk7aWYoZiYmdGhpcy5fbGFiZWwuY29uc3RydWN0b3I9PWUuanFwbG90LkF4aXNMYWJlbFJlbmRlcmVyKXt0aGlzLl9sYWJlbC5fZWxlbS5jc3Moe3dpZHRoOmcsbGVmdDpqLHRvcDowfSl9fWVsc2V7bz1vK2c7dGhpcy5fZWxlbS5jc3Moe3dpZHRoOm8rInB4IixyaWdodDoiMHB4Iix0b3A6IjBweCJ9KTtpZihmJiZ0aGlzLl9sYWJlbC5jb25zdHJ1Y3Rvcj09ZS5qcXBsb3QuQXhpc0xhYmVsUmVuZGVyZXIpe3RoaXMuX2xhYmVsLl9lbGVtLmNzcygid2lkdGgiLGcrInB4Iil9fX19fX19O2UuanFwbG90LlB5cmFtaWRBeGlzUmVuZGVyZXIucHJvdG90eXBlLnBhY2s9ZnVuY3Rpb24oaixnKXtqPWp8fHt9O2c9Z3x8dGhpcy5fb2Zmc2V0czt2YXIgQj10aGlzLl90aWNrczt2YXIgdj10aGlzLm1heDt2YXIgdT10aGlzLm1pbjt2YXIgbz1nLm1heDt2YXIgbT1nLm1pbjt2YXIgcj0odGhpcy5fbGFiZWw9PW51bGwpP2ZhbHNlOnRoaXMuX2xhYmVsLnNob3c7Zm9yKHZhciBzIGluIGope3RoaXMuX2VsZW0uY3NzKHMsaltzXSl9dGhpcy5fb2Zmc2V0cz1nO3ZhciBrPW8tbTt2YXIgbD12LXU7dmFyIHo9dGhpcy5fc3BsaXRMZW5ndGg7aWYodGhpcy5fc3BsaXRBeGlzKXtrLT10aGlzLl9zcGxpdExlbmd0aDt0aGlzLnAydT1mdW5jdGlvbihoKXtyZXR1cm4oaC1tKSpsL2srdX07dGhpcy51MnA9ZnVuY3Rpb24oaCl7aWYoaDw9MCl7cmV0dXJuKGgtdSkqay9sK219ZWxzZXtyZXR1cm4oaC11KSprL2wrbSt6fX07dGhpcy5zZXJpZXNfdTJwPWZ1bmN0aW9uKGgpe2lmKGg8PTApe3JldHVybihoLXUpKmsvbH1lbHNle3JldHVybihoLXUpKmsvbCt6fX07dGhpcy5zZXJpZXNfcDJ1PWZ1bmN0aW9uKGgpe3JldHVybiBoKmwvayt1fX1lbHNle3RoaXMucDJ1PWZ1bmN0aW9uKGgpe3JldHVybihoLW0pKmwvayt1fTt0aGlzLnUycD1mdW5jdGlvbihoKXtyZXR1cm4oaC11KSprL2wrbX07aWYodGhpcy5uYW1lLmNoYXJBdCgwKT09PSJ4Iil7dGhpcy5zZXJpZXNfdTJwPWZ1bmN0aW9uKGgpe3JldHVybihoLXUpKmsvbH07dGhpcy5zZXJpZXNfcDJ1PWZ1bmN0aW9uKGgpe3JldHVybiBoKmwvayt1fX1lbHNle3RoaXMuc2VyaWVzX3UycD1mdW5jdGlvbihoKXtyZXR1cm4oaC12KSprL2x9O3RoaXMuc2VyaWVzX3AydT1mdW5jdGlvbihoKXtyZXR1cm4gaCpsL2srdn19fWlmKHRoaXMuc2hvdyl7aWYodGhpcy5uYW1lLmNoYXJBdCgwKT09PSJ4Iil7Zm9yKHZhciB4PTA7eDxCLmxlbmd0aDt4Kyspe3ZhciBxPUJbeF07aWYocS5zaG93JiZxLnNob3dMYWJlbCl7dmFyIGY7aWYocS5jb25zdHJ1Y3Rvcj09ZS5qcXBsb3QuQ2FudmFzQXhpc1RpY2tSZW5kZXJlciYmcS5hbmdsZSl7dmFyIEE9KHRoaXMubmFtZT09InhheGlzIik/MTotMTtzd2l0Y2gocS5sYWJlbFBvc2l0aW9uKXtjYXNlImF1dG8iOmlmKEEqcS5hbmdsZTwwKXtmPS1xLmdldFdpZHRoKCkrcS5fdGV4dFJlbmRlcmVyLmhlaWdodCpNYXRoLnNpbigtcS5fdGV4dFJlbmRlcmVyLmFuZ2xlKS8yfWVsc2V7Zj0tcS5fdGV4dFJlbmRlcmVyLmhlaWdodCpNYXRoLnNpbihxLl90ZXh0UmVuZGVyZXIuYW5nbGUpLzJ9YnJlYWs7Y2FzZSJlbmQiOmY9LXEuZ2V0V2lkdGgoKStxLl90ZXh0UmVuZGVyZXIuaGVpZ2h0Kk1hdGguc2luKC1xLl90ZXh0UmVuZGVyZXIuYW5nbGUpLzI7YnJlYWs7Y2FzZSJzdGFydCI6Zj0tcS5fdGV4dFJlbmRlcmVyLmhlaWdodCpNYXRoLnNpbihxLl90ZXh0UmVuZGVyZXIuYW5nbGUpLzI7YnJlYWs7Y2FzZSJtaWRkbGUiOmY9LXEuZ2V0V2lkdGgoKS8yK3EuX3RleHRSZW5kZXJlci5oZWlnaHQqTWF0aC5zaW4oLXEuX3RleHRSZW5kZXJlci5hbmdsZSkvMjticmVhaztkZWZhdWx0OmY9LXEuZ2V0V2lkdGgoKS8yK3EuX3RleHRSZW5kZXJlci5oZWlnaHQqTWF0aC5zaW4oLXEuX3RleHRSZW5kZXJlci5hbmdsZSkvMjticmVha319ZWxzZXtmPS1xLmdldFdpZHRoKCkvMn12YXIgQz10aGlzLnUycChxLnZhbHVlKStmKyJweCI7cS5fZWxlbS5jc3MoImxlZnQiLEMpO3EucGFjaygpfX1pZihyKXt2YXIgbj10aGlzLl9sYWJlbC5fZWxlbS5vdXRlcldpZHRoKHRydWUpO3RoaXMuX2xhYmVsLl9lbGVtLmNzcygibGVmdCIsbStrLzItbi8yKyJweCIpO2lmKHRoaXMubmFtZT09InhheGlzIil7dGhpcy5fbGFiZWwuX2VsZW0uY3NzKCJib3R0b20iLCIwcHgiKX1lbHNle3RoaXMuX2xhYmVsLl9lbGVtLmNzcygidG9wIiwiMHB4Iil9dGhpcy5fbGFiZWwucGFjaygpfX1lbHNle2Zvcih2YXIgeD0wO3g8Qi5sZW5ndGg7eCsrKXt2YXIgcT1CW3hdO2lmKHEuc2hvdyYmcS5zaG93TGFiZWwmJiFxLmlzTWlub3JUaWNrKXt2YXIgZjtpZihxLmNvbnN0cnVjdG9yPT1lLmpxcGxvdC5DYW52YXNBeGlzVGlja1JlbmRlcmVyJiZxLmFuZ2xlKXt2YXIgQT0odGhpcy5uYW1lPT0ieWF4aXMiKT8xOi0xO3N3aXRjaChxLmxhYmVsUG9zaXRpb24pe2Nhc2UiYXV0byI6Y2FzZSJlbmQiOmlmKEEqcS5hbmdsZTwwKXtmPS1xLl90ZXh0UmVuZGVyZXIuaGVpZ2h0Kk1hdGguY29zKC1xLl90ZXh0UmVuZGVyZXIuYW5nbGUpLzJ9ZWxzZXtmPS1xLmdldEhlaWdodCgpK3EuX3RleHRSZW5kZXJlci5oZWlnaHQqTWF0aC5jb3MocS5fdGV4dFJlbmRlcmVyLmFuZ2xlKS8yfWJyZWFrO2Nhc2Uic3RhcnQiOmlmKHEuYW5nbGU+MCl7Zj0tcS5fdGV4dFJlbmRlcmVyLmhlaWdodCpNYXRoLmNvcygtcS5fdGV4dFJlbmRlcmVyLmFuZ2xlKS8yfWVsc2V7Zj0tcS5nZXRIZWlnaHQoKStxLl90ZXh0UmVuZGVyZXIuaGVpZ2h0Kk1hdGguY29zKHEuX3RleHRSZW5kZXJlci5hbmdsZSkvMn1icmVhaztjYXNlIm1pZGRsZSI6Zj0tcS5nZXRIZWlnaHQoKS8yO2JyZWFrO2RlZmF1bHQ6Zj0tcS5nZXRIZWlnaHQoKS8yO2JyZWFrfX1lbHNle2Y9LXEuZ2V0SGVpZ2h0KCkvMn12YXIgQz10aGlzLnUycChxLnZhbHVlKStmKyJweCI7cS5fZWxlbS5jc3MoInRvcCIsQyk7cS5wYWNrKCl9fWlmKHIpe3ZhciB5PXRoaXMuX2xhYmVsLl9lbGVtLm91dGVySGVpZ2h0KHRydWUpO2lmKHRoaXMubmFtZSE9PSJ5TWlkQXhpcyIpe3RoaXMuX2xhYmVsLl9lbGVtLmNzcygidG9wIixvLWsvMi15LzIrInB4Iil9aWYodGhpcy5uYW1lPT0ieWF4aXMiKXt0aGlzLl9sYWJlbC5fZWxlbS5jc3MoImxlZnQiLCIwcHgiKX1lbHNle2lmKHRoaXMubmFtZSE9PSJ5TWlkQXhpcyIpe3RoaXMuX2xhYmVsLl9lbGVtLmNzcygicmlnaHQiLCIwcHgiKX19dGhpcy5fbGFiZWwucGFjaygpfX19Qj1udWxsfX0pKGpRdWVyeSk7]]></data>
	</file>
	<file>
	  <filename>/src/plugins/jqplot.pyramidGridRenderer.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqCiAqIGpxUGxvdAogKiBQdXJlIEphdmFTY3JpcHQgcGxvdHRpbmcgcGx1Z2luIHVzaW5nIGpRdWVyeQogKgogKiBWZXJzaW9uOiAxLjAuMGIyX3IxMDEyCiAqCiAqIENvcHlyaWdodCAoYykgMjAwOS0yMDExIENocmlzIExlb25lbGxvCiAqIGpxUGxvdCBpcyBjdXJyZW50bHkgYXZhaWxhYmxlIGZvciB1c2UgaW4gYWxsIHBlcnNvbmFsIG9yIGNvbW1lcmNpYWwgcHJvamVjdHMgCiAqIHVuZGVyIGJvdGggdGhlIE1JVCAoaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHApIGFuZCBHUEwgCiAqIHZlcnNpb24gMi4wIChodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC5odG1sKSBsaWNlbnNlcy4gVGhpcyBtZWFucyB0aGF0IHlvdSBjYW4gCiAqIGNob29zZSB0aGUgbGljZW5zZSB0aGF0IGJlc3Qgc3VpdHMgeW91ciBwcm9qZWN0IGFuZCB1c2UgaXQgYWNjb3JkaW5nbHkuIAogKgogKiBBbHRob3VnaCBub3QgcmVxdWlyZWQsIHRoZSBhdXRob3Igd291bGQgYXBwcmVjaWF0ZSBhbiBlbWFpbCBsZXR0aW5nIGhpbSAKICoga25vdyBvZiBhbnkgc3Vic3RhbnRpYWwgdXNlIG9mIGpxUGxvdC4gIFlvdSBjYW4gcmVhY2ggdGhlIGF1dGhvciBhdDogCiAqIGNocmlzIGF0IGpxcGxvdCBkb3QgY29tIG9yIHNlZSBodHRwOi8vd3d3LmpxcGxvdC5jb20vaW5mby5waHAgLgogKgogKiBJZiB5b3UgYXJlIGZlZWxpbmcga2luZCBhbmQgZ2VuZXJvdXMsIGNvbnNpZGVyIHN1cHBvcnRpbmcgdGhlIHByb2plY3QgYnkKICogbWFraW5nIGEgZG9uYXRpb24gYXQ6IGh0dHA6Ly93d3cuanFwbG90LmNvbS9kb25hdGUucGhwIC4KICoKICogc3ByaW50ZiBmdW5jdGlvbnMgY29udGFpbmVkIGluIGpxcGxvdC5zcHJpbnRmLmpzIGJ5IEFzaCBTZWFybGU6CiAqCiAqICAgICB2ZXJzaW9uIDIwMDcuMDQuMjcKICogICAgIGF1dGhvciBBc2ggU2VhcmxlCiAqICAgICBodHRwOi8vaGV4bWVuLmNvbS9ibG9nLzIwMDcvMDMvcHJpbnRmLXNwcmludGYvCiAqICAgICBodHRwOi8vaGV4bWVuLmNvbS9qcy9zcHJpbnRmLmpzCiAqICAgICBUaGUgYXV0aG9yIChBc2ggU2VhcmxlKSBoYXMgcGxhY2VkIHRoaXMgY29kZSBpbiB0aGUgcHVibGljIGRvbWFpbjoKICogICAgICJUaGlzIGNvZGUgaXMgdW5yZXN0cmljdGVkOiB5b3UgYXJlIGZyZWUgdG8gdXNlIGl0IGhvd2V2ZXIgeW91IGxpa2UuIgogKiAKICovCihmdW5jdGlvbigkKSB7ICAgICAKICAgIC8vIENsYXNzOiAkLmpxcGxvdC5DYW52YXNHcmlkUmVuZGVyZXIKICAgIC8vIFRoZSBkZWZhdWx0IGpxUGxvdCBncmlkIHJlbmRlcmVyLCBjcmVhdGluZyBhIGdyaWQgb24gYSBjYW52YXMgZWxlbWVudC4KICAgIC8vIFRoZSByZW5kZXJlciBoYXMgbm8gYWRkaXRpb25hbCBvcHRpb25zIGJleW9uZCB0aGUgPEdyaWQ+IGNsYXNzLgogICAgJC5qcXBsb3QuUHlyYW1pZEdyaWRSZW5kZXJlciA9IGZ1bmN0aW9uKCl7CiAgICAgICAgJC5qcXBsb3QuQ2FudmFzR3JpZFJlbmRlcmVyLmNhbGwodGhpcyk7CiAgICB9OwoKICAgICQuanFwbG90LlB5cmFtaWRHcmlkUmVuZGVyZXIucHJvdG90eXBlID0gbmV3ICQuanFwbG90LkNhbnZhc0dyaWRSZW5kZXJlcigpOwogICAgJC5qcXBsb3QuUHlyYW1pZEdyaWRSZW5kZXJlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSAkLmpxcGxvdC5QeXJhbWlkR3JpZFJlbmRlcmVyOwogICAgCiAgICAvLyBjYWxsZWQgd2l0aCBjb250ZXh0IG9mIEdyaWQgb2JqZWN0CiAgICAkLmpxcGxvdC5DYW52YXNHcmlkUmVuZGVyZXIucHJvdG90eXBlLmluaXQgPSBmdW5jdGlvbihvcHRpb25zKSB7CiAgICAgICAgdGhpcy5fY3R4OwogICAgICAgIHRoaXMucGxvdEJhbmRzID0gewogICAgICAgICAgICBzaG93OiBmYWxzZSwKICAgICAgICAgICAgY29sb3I6ICdyZ2IoMjMwLCAyMTksIDE3OSknLAogICAgICAgICAgICBheGlzOiAneScsCiAgICAgICAgICAgIHN0YXJ0OiBudWxsLAogICAgICAgICAgICBpbnRlcnZhbDogMTAKICAgICAgICB9OwogICAgICAgICQuZXh0ZW5kKHRydWUsIHRoaXMsIG9wdGlvbnMpOwogICAgICAgIC8vIHNldCB0aGUgc2hhZG93IHJlbmRlcmVyIG9wdGlvbnMKICAgICAgICB2YXIgc29wdHMgPSB7bGluZUpvaW46J21pdGVyJywgbGluZUNhcDoncm91bmQnLCBmaWxsOmZhbHNlLCBpc2FyYzpmYWxzZSwgYW5nbGU6dGhpcy5zaGFkb3dBbmdsZSwgb2Zmc2V0OnRoaXMuc2hhZG93T2Zmc2V0LCBhbHBoYTp0aGlzLnNoYWRvd0FscGhhLCBkZXB0aDp0aGlzLnNoYWRvd0RlcHRoLCBsaW5lV2lkdGg6dGhpcy5zaGFkb3dXaWR0aCwgY2xvc2VQYXRoOmZhbHNlLCBzdHJva2VTdHlsZTp0aGlzLnNoYWRvd0NvbG9yfTsKICAgICAgICB0aGlzLnJlbmRlcmVyLnNoYWRvd1JlbmRlcmVyLmluaXQoc29wdHMpOwogICAgfTsKICAgIAogICAgJC5qcXBsb3QuUHlyYW1pZEdyaWRSZW5kZXJlci5wcm90b3R5cGUuZHJhdyA9IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuX2N0eCA9IHRoaXMuX2VsZW0uZ2V0KDApLmdldENvbnRleHQoIjJkIik7CiAgICAgICAgdmFyIGN0eCA9IHRoaXMuX2N0eDsKICAgICAgICB2YXIgYXhlcyA9IHRoaXMuX2F4ZXM7CiAgICAgICAgdmFyIHhwID0gYXhlcy54YXhpcy51MnA7CiAgICAgICAgdmFyIHlwID0gYXhlcy55TWlkQXhpcy51MnA7CiAgICAgICAgdmFyIHhudWRnZSA9IGF4ZXMueGF4aXMubWF4LzEwMDAuMDsKICAgICAgICB2YXIgeHAwID0geHAoMCk7CiAgICAgICAgdmFyIHhwbiA9IHhwKHhudWRnZSk7CiAgICAgICAgdmFyIGF4ID0gWyd4YXhpcycsICd5YXhpcycsICd4MmF4aXMnLCAneTJheGlzJywneU1pZEF4aXMnXTsKICAgICAgICAvLyBBZGQgdGhlIGdyaWQgb250byB0aGUgZ3JpZCBjYW52YXMuICBUaGlzIGlzIHRoZSBib3R0b20gbW9zdCBsYXllci4KICAgICAgICBjdHguc2F2ZSgpOwogICAgICAgIGN0eC5jbGVhclJlY3QoMCwgMCwgdGhpcy5fcGxvdERpbWVuc2lvbnMud2lkdGgsIHRoaXMuX3Bsb3REaW1lbnNpb25zLmhlaWdodCk7CiAgICAgICAgY3R4LmZpbGxTdHlsZSA9IHRoaXMuYmFja2dyb3VuZENvbG9yIHx8IHRoaXMuYmFja2dyb3VuZDsKCiAgICAgICAgY3R4LmZpbGxSZWN0KHRoaXMuX2xlZnQsIHRoaXMuX3RvcCwgdGhpcy5fd2lkdGgsIHRoaXMuX2hlaWdodCk7CgogICAgICAgIGlmICh0aGlzLnBsb3RCYW5kcy5zaG93KSB7CiAgICAgICAgICAgIGN0eC5zYXZlKCk7CiAgICAgICAgICAgIHZhciBwYiA9IHRoaXMucGxvdEJhbmRzOwogICAgICAgICAgICBjdHguZmlsbFN0eWxlID0gcGIuY29sb3I7CiAgICAgICAgICAgIHZhciBheGlzOwogICAgICAgICAgICB2YXIgeCwgeSwgdywgaDsKICAgICAgICAgICAgLy8gZmluZCBheGlzIHRvIHdvcmsgd2l0aAogICAgICAgICAgICBpZiAocGIuYXhpcy5jaGFyQXQoMCkgPT09ICd4JykgewogICAgICAgICAgICAgICAgaWYgKGF4ZXMueGF4aXMuc2hvdykgewogICAgICAgICAgICAgICAgICAgIGF4aXMgPSBheGVzLnhheGlzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKHBiLmF4aXMuY2hhckF0KDApID09PSAneScpIHsKICAgICAgICAgICAgICAgIGlmIChheGVzLnlheGlzLnNob3cpIHsKICAgICAgICAgICAgICAgICAgICBheGlzID0gYXhlcy55YXhpczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKGF4ZXMueTJheGlzLnNob3cpIHsKICAgICAgICAgICAgICAgICAgICBheGlzID0gYXhlcy55MmF4aXM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChheGVzLnlNaWRBeGlzLnNob3cpIHsKICAgICAgICAgICAgICAgICAgICBheGlzID0gYXhlcy55TWlkQXhpczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGF4aXMgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgLy8gZHJhdyBzb21lIHJlY3RhbmdsZXMKICAgICAgICAgICAgICAgIHZhciBzdGFydCA9IHBiLnN0YXJ0OwogICAgICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSBheGlzLm1pbjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGF4aXMubWF4OyBpICs9IDIgKiBwYi5pbnRlcnZhbCkgewogICAgICAgICAgICAgICAgICAgIGlmIChheGlzLm5hbWUuY2hhckF0KDApID09PSAneScpIHsKICAgICAgICAgICAgICAgICAgICAgICAgeCA9IHRoaXMuX2xlZnQ7CiAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBheGlzLnNlcmllc191MnAoaSArIHBiLmludGVydmFsKSArIHRoaXMuX3RvcDsKICAgICAgICAgICAgICAgICAgICAgICAgdyA9IHRoaXMuX3JpZ2h0IC0gdGhpcy5fbGVmdDsKICAgICAgICAgICAgICAgICAgICAgICAgaCA9IGF4aXMuc2VyaWVzX3UycChzdGFydCkgLSBheGlzLnNlcmllc191MnAoc3RhcnQgKyBwYi5pbnRlcnZhbCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGN0eC5maWxsUmVjdCh4LCB5LCB3LCBoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLy8gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgLy8gICAgIHkgPSAwOwogICAgICAgICAgICAgICAgICAgIC8vICAgICB4ID0gYXhpcy5zZXJpZXNfdTJwKGkpOwogICAgICAgICAgICAgICAgICAgIC8vICAgICBoID0gdGhpcy5faGVpZ2h0OwogICAgICAgICAgICAgICAgICAgIC8vICAgICB3ID0gYXhpcy5zZXJpZXNfdTJwKHN0YXJ0ICsgcGIuaW50ZXJ2YWwpIC0gYXhpcy5zZXJpZXNfdTJwKHN0YXJ0KTsKICAgICAgICAgICAgICAgICAgICAvLyB9CgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGN0eC5yZXN0b3JlKCk7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGN0eC5zYXZlKCk7CiAgICAgICAgY3R4LmxpbmVKb2luID0gJ21pdGVyJzsKICAgICAgICBjdHgubGluZUNhcCA9ICdidXR0JzsKICAgICAgICBjdHgubGluZVdpZHRoID0gdGhpcy5ncmlkTGluZVdpZHRoOwogICAgICAgIGN0eC5zdHJva2VTdHlsZSA9IHRoaXMuZ3JpZExpbmVDb2xvcjsKICAgICAgICB2YXIgYiwgZSwgcywgbTsKICAgICAgICBmb3IgKHZhciBpPTU7IGk+MDsgaS0tKSB7CiAgICAgICAgICAgIHZhciBuYW1lID0gYXhbaS0xXTsKICAgICAgICAgICAgdmFyIGF4aXMgPSBheGVzW25hbWVdOwogICAgICAgICAgICB2YXIgdGlja3MgPSBheGlzLl90aWNrczsKICAgICAgICAgICAgdmFyIG51bXRpY2tzID0gdGlja3MubGVuZ3RoOwogICAgICAgICAgICBpZiAoYXhpcy5zaG93KSB7CiAgICAgICAgICAgICAgICBpZiAoYXhpcy5kcmF3QmFzZWxpbmUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgYm9wdHMgPSB7fTsKICAgICAgICAgICAgICAgICAgICBpZiAoYXhpcy5iYXNlbGluZVdpZHRoICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJvcHRzLmxpbmVXaWR0aCA9IGF4aXMuYmFzZWxpbmVXaWR0aDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKGF4aXMuYmFzZWxpbmVDb2xvciAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICBib3B0cy5zdHJva2VTdHlsZSA9IGF4aXMuYmFzZWxpbmVDb2xvcjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChuYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3hheGlzJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChheGVzLnlNaWRBeGlzLnNob3cpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmF3TGluZSAodGhpcy5fbGVmdCwgdGhpcy5fYm90dG9tLCB4cDAsIHRoaXMuX2JvdHRvbSwgYm9wdHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyYXdMaW5lICh4cG4sIHRoaXMuX2JvdHRvbSwgdGhpcy5fcmlnaHQsIHRoaXMuX2JvdHRvbSwgYm9wdHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJhd0xpbmUgKHRoaXMuX2xlZnQsIHRoaXMuX2JvdHRvbSwgdGhpcy5fcmlnaHQsIHRoaXMuX2JvdHRvbSwgYm9wdHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3lheGlzJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyYXdMaW5lICh0aGlzLl9sZWZ0LCB0aGlzLl9ib3R0b20sIHRoaXMuX2xlZnQsIHRoaXMuX3RvcCwgYm9wdHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3lNaWRBeGlzJzogICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyYXdMaW5lKHhwMCwgdGhpcy5fYm90dG9tLCB4cDAsIHRoaXMuX3RvcCwgYm9wdHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJhd0xpbmUoeHBuLCB0aGlzLl9ib3R0b20sIHhwbiwgdGhpcy5fdG9wLCBib3B0cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAneDJheGlzJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChheGVzLnlNaWRBeGlzLnNob3cpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmF3TGluZSAodGhpcy5fbGVmdCwgdGhpcy5fdG9wLCB4cDAsIHRoaXMuX3RvcCwgYm9wdHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyYXdMaW5lICh4cG4sIHRoaXMuX3RvcCwgdGhpcy5fcmlnaHQsIHRoaXMuX3RvcCwgYm9wdHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJhd0xpbmUgKHRoaXMuX2xlZnQsIHRoaXMuX2JvdHRvbSwgdGhpcy5fcmlnaHQsIHRoaXMuX2JvdHRvbSwgYm9wdHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3kyYXhpcyc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmF3TGluZSAodGhpcy5fcmlnaHQsIHRoaXMuX2JvdHRvbSwgdGhpcy5fcmlnaHQsIHRoaXMuX3RvcCwgYm9wdHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZvciAodmFyIGo9bnVtdGlja3M7IGo+MDsgai0tKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB0aWNrc1tqLTFdOwogICAgICAgICAgICAgICAgICAgIGlmICh0LnNob3cpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBvcyA9IE1hdGgucm91bmQoYXhpcy51MnAodC52YWx1ZSkpICsgMC41OwogICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG5hbWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3hheGlzJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkcmF3IHRoZSBncmlkIGxpbmUgaWYgd2Ugc2hvdWxkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQuc2hvd0dyaWRsaW5lICYmIHRoaXMuZHJhd0dyaWRsaW5lcyAmJiAoIXQuaXNNaW5vclRpY2sgfHwgYXhpcy5zaG93TWlub3JUaWNrcykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJhd0xpbmUocG9zLCB0aGlzLl90b3AsIHBvcywgdGhpcy5fYm90dG9tKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZHJhdyB0aGUgbWFyawogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0LnNob3dNYXJrICYmIHQubWFyayAmJiAoIXQuaXNNaW5vclRpY2sgfHwgYXhpcy5zaG93TWlub3JUaWNrcykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcyA9IHQubWFya1NpemU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0gPSB0Lm1hcms7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwb3MgPSBNYXRoLnJvdW5kKGF4aXMudTJwKHQudmFsdWUpKSArIDAuNTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdvdXRzaWRlJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiID0gdGhpcy5fYm90dG9tOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPSB0aGlzLl9ib3R0b20rczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2luc2lkZSc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYiA9IHRoaXMuX2JvdHRvbS1zOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPSB0aGlzLl9ib3R0b207CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdjcm9zcyc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYiA9IHRoaXMuX2JvdHRvbS1zOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPSB0aGlzLl9ib3R0b20rczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYiA9IHRoaXMuX2JvdHRvbTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0gdGhpcy5fYm90dG9tK3M7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZHJhdyB0aGUgc2hhZG93CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNoYWRvdykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zaGFkb3dSZW5kZXJlci5kcmF3KGN0eCwgW1twb3MsYl0sW3BvcyxlXV0sIHtsaW5lQ2FwOididXR0JywgbGluZVdpZHRoOnRoaXMuZ3JpZExpbmVXaWR0aCwgb2Zmc2V0OnRoaXMuZ3JpZExpbmVXaWR0aCowLjc1LCBkZXB0aDoyLCBmaWxsOmZhbHNlLCBjbG9zZVBhdGg6ZmFsc2V9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkcmF3IHRoZSBsaW5lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyYXdMaW5lKHBvcywgYiwgcG9zLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd5YXhpcyc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZHJhdyB0aGUgZ3JpZCBsaW5lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQuc2hvd0dyaWRsaW5lICYmIHRoaXMuZHJhd0dyaWRsaW5lcyAmJiAoIXQuaXNNaW5vclRpY2sgfHwgYXhpcy5zaG93TWlub3JUaWNrcykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJhd0xpbmUodGhpcy5fcmlnaHQsIHBvcywgdGhpcy5fbGVmdCwgcG9zKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRyYXcgdGhlIG1hcmsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodC5zaG93TWFyayAmJiB0Lm1hcmsgJiYgKCF0LmlzTWlub3JUaWNrIHx8IGF4aXMuc2hvd01pbm9yVGlja3MpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSB0Lm1hcmtTaXplOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtID0gdC5tYXJrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcG9zID0gTWF0aC5yb3VuZChheGlzLnUycCh0LnZhbHVlKSkgKyAwLjU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnb3V0c2lkZSc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYiA9IHRoaXMuX2xlZnQtczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0gdGhpcy5fbGVmdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2luc2lkZSc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYiA9IHRoaXMuX2xlZnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9IHRoaXMuX2xlZnQrczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2Nyb3NzJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiID0gdGhpcy5fbGVmdC1zOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPSB0aGlzLl9sZWZ0K3M7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIgPSB0aGlzLl9sZWZ0LXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9IHRoaXMuX2xlZnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkcmF3IHRoZSBzaGFkb3cKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2hhZG93KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNoYWRvd1JlbmRlcmVyLmRyYXcoY3R4LCBbW2IsIHBvc10sIFtlLCBwb3NdXSwge2xpbmVDYXA6J2J1dHQnLCBsaW5lV2lkdGg6dGhpcy5ncmlkTGluZVdpZHRoKjEuNSwgb2Zmc2V0OnRoaXMuZ3JpZExpbmVXaWR0aCowLjc1LCBmaWxsOmZhbHNlLCBjbG9zZVBhdGg6ZmFsc2V9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmF3TGluZShiLCBwb3MsIGUsIHBvcywge3N0cm9rZVN0eWxlOmF4aXMuYm9yZGVyQ29sb3J9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd5TWlkQXhpcyc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZHJhdyB0aGUgZ3JpZCBsaW5lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQuc2hvd0dyaWRsaW5lICYmIHRoaXMuZHJhd0dyaWRsaW5lcyAmJiAoIXQuaXNNaW5vclRpY2sgfHwgYXhpcy5zaG93TWlub3JUaWNrcykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJhd0xpbmUodGhpcy5fbGVmdCwgcG9zLCB4cDAsIHBvcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyYXdMaW5lKHhwbiwgcG9zLCB0aGlzLl9yaWdodCwgcG9zKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZHJhdyB0aGUgbWFyawogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0LnNob3dNYXJrICYmIHQubWFyayAmJiAoIXQuaXNNaW5vclRpY2sgfHwgYXhpcy5zaG93TWlub3JUaWNrcykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcyA9IHQubWFya1NpemU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0gPSB0Lm1hcms7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwb3MgPSBNYXRoLnJvdW5kKGF4aXMudTJwKHQudmFsdWUpKSArIDAuNTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIgPSB4cDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPSB4cDAgKyBzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkcmF3IHRoZSBzaGFkb3cKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2hhZG93KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNoYWRvd1JlbmRlcmVyLmRyYXcoY3R4LCBbW2IsIHBvc10sIFtlLCBwb3NdXSwge2xpbmVDYXA6J2J1dHQnLCBsaW5lV2lkdGg6dGhpcy5ncmlkTGluZVdpZHRoKjEuNSwgb2Zmc2V0OnRoaXMuZ3JpZExpbmVXaWR0aCowLjc1LCBmaWxsOmZhbHNlLCBjbG9zZVBhdGg6ZmFsc2V9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmF3TGluZShiLCBwb3MsIGUsIHBvcywge3N0cm9rZVN0eWxlOmF4aXMuYm9yZGVyQ29sb3J9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIgPSB4cG4gLSBzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0geHBuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkcmF3IHRoZSBzaGFkb3cKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2hhZG93KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNoYWRvd1JlbmRlcmVyLmRyYXcoY3R4LCBbW2IsIHBvc10sIFtlLCBwb3NdXSwge2xpbmVDYXA6J2J1dHQnLCBsaW5lV2lkdGg6dGhpcy5ncmlkTGluZVdpZHRoKjEuNSwgb2Zmc2V0OnRoaXMuZ3JpZExpbmVXaWR0aCowLjc1LCBmaWxsOmZhbHNlLCBjbG9zZVBhdGg6ZmFsc2V9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmF3TGluZShiLCBwb3MsIGUsIHBvcywge3N0cm9rZVN0eWxlOmF4aXMuYm9yZGVyQ29sb3J9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd4MmF4aXMnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRyYXcgdGhlIGdyaWQgbGluZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0LnNob3dHcmlkbGluZSAmJiB0aGlzLmRyYXdHcmlkbGluZXMgJiYgKCF0LmlzTWlub3JUaWNrIHx8IGF4aXMuc2hvd01pbm9yVGlja3MpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyYXdMaW5lKHBvcywgdGhpcy5fYm90dG9tLCBwb3MsIHRoaXMuX3RvcCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkcmF3IHRoZSBtYXJrCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQuc2hvd01hcmsgJiYgdC5tYXJrICYmICghdC5pc01pbm9yVGljayB8fCBheGlzLnNob3dNaW5vclRpY2tzKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzID0gdC5tYXJrU2l6ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbSA9IHQubWFyazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBvcyA9IE1hdGgucm91bmQoYXhpcy51MnAodC52YWx1ZSkpICsgMC41OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ291dHNpZGUnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIgPSB0aGlzLl90b3AtczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0gdGhpcy5fdG9wOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnaW5zaWRlJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiID0gdGhpcy5fdG9wOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPSB0aGlzLl90b3ArczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2Nyb3NzJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiID0gdGhpcy5fdG9wLXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9IHRoaXMuX3RvcCtzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiID0gdGhpcy5fdG9wLXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9IHRoaXMuX3RvcDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRyYXcgdGhlIHNoYWRvdwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zaGFkb3cpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2hhZG93UmVuZGVyZXIuZHJhdyhjdHgsIFtbcG9zLGJdLFtwb3MsZV1dLCB7bGluZUNhcDonYnV0dCcsIGxpbmVXaWR0aDp0aGlzLmdyaWRMaW5lV2lkdGgsIG9mZnNldDp0aGlzLmdyaWRMaW5lV2lkdGgqMC43NSwgZGVwdGg6MiwgZmlsbDpmYWxzZSwgY2xvc2VQYXRoOmZhbHNlfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJhd0xpbmUocG9zLCBiLCBwb3MsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3kyYXhpcyc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZHJhdyB0aGUgZ3JpZCBsaW5lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQuc2hvd0dyaWRsaW5lICYmIHRoaXMuZHJhd0dyaWRsaW5lcyAmJiAoIXQuaXNNaW5vclRpY2sgfHwgYXhpcy5zaG93TWlub3JUaWNrcykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJhd0xpbmUodGhpcy5fbGVmdCwgcG9zLCB0aGlzLl9yaWdodCwgcG9zKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRyYXcgdGhlIG1hcmsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodC5zaG93TWFyayAmJiB0Lm1hcmsgJiYgKCF0LmlzTWlub3JUaWNrIHx8IGF4aXMuc2hvd01pbm9yVGlja3MpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSB0Lm1hcmtTaXplOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtID0gdC5tYXJrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcG9zID0gTWF0aC5yb3VuZChheGlzLnUycCh0LnZhbHVlKSkgKyAwLjU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnb3V0c2lkZSc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYiA9IHRoaXMuX3JpZ2h0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPSB0aGlzLl9yaWdodCtzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnaW5zaWRlJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiID0gdGhpcy5fcmlnaHQtczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0gdGhpcy5fcmlnaHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdjcm9zcyc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYiA9IHRoaXMuX3JpZ2h0LXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9IHRoaXMuX3JpZ2h0K3M7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIgPSB0aGlzLl9yaWdodDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0gdGhpcy5fcmlnaHQrczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRyYXcgdGhlIHNoYWRvdwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zaGFkb3cpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2hhZG93UmVuZGVyZXIuZHJhdyhjdHgsIFtbYiwgcG9zXSwgW2UsIHBvc11dLCB7bGluZUNhcDonYnV0dCcsIGxpbmVXaWR0aDp0aGlzLmdyaWRMaW5lV2lkdGgqMS41LCBvZmZzZXQ6dGhpcy5ncmlkTGluZVdpZHRoKjAuNzUsIGZpbGw6ZmFsc2UsIGNsb3NlUGF0aDpmYWxzZX0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyYXdMaW5lKGIsIHBvcywgZSwgcG9zLCB7c3Ryb2tlU3R5bGU6YXhpcy5ib3JkZXJDb2xvcn0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0ID0gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgICBheGlzID0gbnVsbDsKICAgICAgICAgICAgdGlja3MgPSBudWxsOwogICAgICAgIH0KICAgICAgICAKICAgICAgICBjdHgucmVzdG9yZSgpOwogICAgICAgIAogICAgICAgIGZ1bmN0aW9uIGRyYXdMaW5lKGJ4LCBieSwgZXgsIGV5LCBvcHRzKSB7CiAgICAgICAgICAgIGN0eC5zYXZlKCk7CiAgICAgICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9OwogICAgICAgICAgICBpZiAob3B0cy5saW5lV2lkdGggPT0gbnVsbCB8fCBvcHRzLmxpbmVXaWR0aCAhPSAwKXsKICAgICAgICAgICAgICAgICQuZXh0ZW5kKHRydWUsIGN0eCwgb3B0cyk7CiAgICAgICAgICAgICAgICBjdHguYmVnaW5QYXRoKCk7CiAgICAgICAgICAgICAgICBjdHgubW92ZVRvKGJ4LCBieSk7CiAgICAgICAgICAgICAgICBjdHgubGluZVRvKGV4LCBleSk7CiAgICAgICAgICAgICAgICBjdHguc3Ryb2tlKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY3R4LnJlc3RvcmUoKTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYgKHRoaXMuc2hhZG93KSB7CiAgICAgICAgICAgIGlmIChheGVzLnlNaWRBeGlzLnNob3cpIHsKICAgICAgICAgICAgICAgIHZhciBwb2ludHMgPSBbW3RoaXMuX2xlZnQsIHRoaXMuX2JvdHRvbV0sIFt4cDAsIHRoaXMuX2JvdHRvbV1dOwogICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zaGFkb3dSZW5kZXJlci5kcmF3KGN0eCwgcG9pbnRzKTsKICAgICAgICAgICAgICAgIHZhciBwb2ludHMgPSBbW3hwbiwgdGhpcy5fYm90dG9tXSwgW3RoaXMuX3JpZ2h0LCB0aGlzLl9ib3R0b21dLCBbdGhpcy5fcmlnaHQsIHRoaXMuX3RvcF1dOwogICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zaGFkb3dSZW5kZXJlci5kcmF3KGN0eCwgcG9pbnRzKTsKICAgICAgICAgICAgICAgIHZhciBwb2ludHMgPSBbW3hwMCwgdGhpcy5fYm90dG9tXSwgW3hwMCwgdGhpcy5fdG9wXV07CiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNoYWRvd1JlbmRlcmVyLmRyYXcoY3R4LCBwb2ludHMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgdmFyIHBvaW50cyA9IFtbdGhpcy5fbGVmdCwgdGhpcy5fYm90dG9tXSwgW3RoaXMuX3JpZ2h0LCB0aGlzLl9ib3R0b21dLCBbdGhpcy5fcmlnaHQsIHRoaXMuX3RvcF1dOwogICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zaGFkb3dSZW5kZXJlci5kcmF3KGN0eCwgcG9pbnRzKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvLyBOb3cgZHJhdyBib3JkZXIgYXJvdW5kIGdyaWQuICBVc2UgYXhpcyBib3JkZXIgZGVmaW5pdGlvbnMuIHN0YXJ0IGF0CiAgICAgICAgLy8gdXBwZXIgbGVmdCBhbmQgZ28gY2xvY2t3aXNlLgogICAgICAgIGlmICh0aGlzLmJvcmRlcldpZHRoICE9IDAgJiYgdGhpcy5kcmF3Qm9yZGVyKSB7CiAgICAgICAgICAgIGlmIChheGVzLnlNaWRBeGlzLnNob3cpIHsKICAgICAgICAgICAgICAgIGRyYXdMaW5lICh0aGlzLl9sZWZ0LCB0aGlzLl90b3AsIHhwMCwgdGhpcy5fdG9wLCB7bGluZUNhcDoncm91bmQnLCBzdHJva2VTdHlsZTpheGVzLngyYXhpcy5ib3JkZXJDb2xvciwgbGluZVdpZHRoOmF4ZXMueDJheGlzLmJvcmRlcldpZHRofSk7CiAgICAgICAgICAgICAgICBkcmF3TGluZSAoeHBuLCB0aGlzLl90b3AsIHRoaXMuX3JpZ2h0LCB0aGlzLl90b3AsIHtsaW5lQ2FwOidyb3VuZCcsIHN0cm9rZVN0eWxlOmF4ZXMueDJheGlzLmJvcmRlckNvbG9yLCBsaW5lV2lkdGg6YXhlcy54MmF4aXMuYm9yZGVyV2lkdGh9KTsKICAgICAgICAgICAgICAgIGRyYXdMaW5lICh0aGlzLl9yaWdodCwgdGhpcy5fdG9wLCB0aGlzLl9yaWdodCwgdGhpcy5fYm90dG9tLCB7bGluZUNhcDoncm91bmQnLCBzdHJva2VTdHlsZTpheGVzLnkyYXhpcy5ib3JkZXJDb2xvciwgbGluZVdpZHRoOmF4ZXMueTJheGlzLmJvcmRlcldpZHRofSk7CiAgICAgICAgICAgICAgICBkcmF3TGluZSAodGhpcy5fcmlnaHQsIHRoaXMuX2JvdHRvbSwgeHBuLCB0aGlzLl9ib3R0b20sIHtsaW5lQ2FwOidyb3VuZCcsIHN0cm9rZVN0eWxlOmF4ZXMueGF4aXMuYm9yZGVyQ29sb3IsIGxpbmVXaWR0aDpheGVzLnhheGlzLmJvcmRlcldpZHRofSk7CiAgICAgICAgICAgICAgICBkcmF3TGluZSAoeHAwLCB0aGlzLl9ib3R0b20sIHRoaXMuX2xlZnQsIHRoaXMuX2JvdHRvbSwge2xpbmVDYXA6J3JvdW5kJywgc3Ryb2tlU3R5bGU6YXhlcy54YXhpcy5ib3JkZXJDb2xvciwgbGluZVdpZHRoOmF4ZXMueGF4aXMuYm9yZGVyV2lkdGh9KTsKICAgICAgICAgICAgICAgIGRyYXdMaW5lICh0aGlzLl9sZWZ0LCB0aGlzLl9ib3R0b20sIHRoaXMuX2xlZnQsIHRoaXMuX3RvcCwge2xpbmVDYXA6J3JvdW5kJywgc3Ryb2tlU3R5bGU6YXhlcy55YXhpcy5ib3JkZXJDb2xvciwgbGluZVdpZHRoOmF4ZXMueWF4aXMuYm9yZGVyV2lkdGh9KTsKICAgICAgICAgICAgICAgIGRyYXdMaW5lICh4cDAsIHRoaXMuX2JvdHRvbSwgeHAwLCB0aGlzLl90b3AsIHtsaW5lQ2FwOidyb3VuZCcsIHN0cm9rZVN0eWxlOmF4ZXMueWF4aXMuYm9yZGVyQ29sb3IsIGxpbmVXaWR0aDpheGVzLnlheGlzLmJvcmRlcldpZHRofSk7CiAgICAgICAgICAgICAgICBkcmF3TGluZSAoeHBuLCB0aGlzLl9ib3R0b20sIHhwbiwgdGhpcy5fdG9wLCB7bGluZUNhcDoncm91bmQnLCBzdHJva2VTdHlsZTpheGVzLnlheGlzLmJvcmRlckNvbG9yLCBsaW5lV2lkdGg6YXhlcy55YXhpcy5ib3JkZXJXaWR0aH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgZHJhd0xpbmUgKHRoaXMuX2xlZnQsIHRoaXMuX3RvcCwgdGhpcy5fcmlnaHQsIHRoaXMuX3RvcCwge2xpbmVDYXA6J3JvdW5kJywgc3Ryb2tlU3R5bGU6YXhlcy54MmF4aXMuYm9yZGVyQ29sb3IsIGxpbmVXaWR0aDpheGVzLngyYXhpcy5ib3JkZXJXaWR0aH0pOwogICAgICAgICAgICAgICAgZHJhd0xpbmUgKHRoaXMuX3JpZ2h0LCB0aGlzLl90b3AsIHRoaXMuX3JpZ2h0LCB0aGlzLl9ib3R0b20sIHtsaW5lQ2FwOidyb3VuZCcsIHN0cm9rZVN0eWxlOmF4ZXMueTJheGlzLmJvcmRlckNvbG9yLCBsaW5lV2lkdGg6YXhlcy55MmF4aXMuYm9yZGVyV2lkdGh9KTsKICAgICAgICAgICAgICAgIGRyYXdMaW5lICh0aGlzLl9yaWdodCwgdGhpcy5fYm90dG9tLCB0aGlzLl9sZWZ0LCB0aGlzLl9ib3R0b20sIHtsaW5lQ2FwOidyb3VuZCcsIHN0cm9rZVN0eWxlOmF4ZXMueGF4aXMuYm9yZGVyQ29sb3IsIGxpbmVXaWR0aDpheGVzLnhheGlzLmJvcmRlcldpZHRofSk7CiAgICAgICAgICAgICAgICBkcmF3TGluZSAodGhpcy5fbGVmdCwgdGhpcy5fYm90dG9tLCB0aGlzLl9sZWZ0LCB0aGlzLl90b3AsIHtsaW5lQ2FwOidyb3VuZCcsIHN0cm9rZVN0eWxlOmF4ZXMueWF4aXMuYm9yZGVyQ29sb3IsIGxpbmVXaWR0aDpheGVzLnlheGlzLmJvcmRlcldpZHRofSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLy8gY3R4LmxpbmVXaWR0aCA9IHRoaXMuYm9yZGVyV2lkdGg7CiAgICAgICAgLy8gY3R4LnN0cm9rZVN0eWxlID0gdGhpcy5ib3JkZXJDb2xvcjsKICAgICAgICAvLyBjdHguc3Ryb2tlUmVjdCh0aGlzLl9sZWZ0LCB0aGlzLl90b3AsIHRoaXMuX3dpZHRoLCB0aGlzLl9oZWlnaHQpOwogICAgICAgIAogICAgICAgIGN0eC5yZXN0b3JlKCk7CiAgICAgICAgY3R4ID0gIG51bGw7CiAgICAgICAgYXhlcyA9IG51bGw7CiAgICB9Owp9KShqUXVlcnkpOyA=]]></data>
	</file>
	<file>
	  <filename>/src/plugins/jqplot.pyramidGridRenderer.min.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqCiAqIGpxUGxvdAogKiBQdXJlIEphdmFTY3JpcHQgcGxvdHRpbmcgcGx1Z2luIHVzaW5nIGpRdWVyeQogKgogKiBWZXJzaW9uOiAxLjAuMGIyX3IxMDEyCiAqCiAqIENvcHlyaWdodCAoYykgMjAwOS0yMDExIENocmlzIExlb25lbGxvCiAqIGpxUGxvdCBpcyBjdXJyZW50bHkgYXZhaWxhYmxlIGZvciB1c2UgaW4gYWxsIHBlcnNvbmFsIG9yIGNvbW1lcmNpYWwgcHJvamVjdHMgCiAqIHVuZGVyIGJvdGggdGhlIE1JVCAoaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHApIGFuZCBHUEwgCiAqIHZlcnNpb24gMi4wIChodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC5odG1sKSBsaWNlbnNlcy4gVGhpcyBtZWFucyB0aGF0IHlvdSBjYW4gCiAqIGNob29zZSB0aGUgbGljZW5zZSB0aGF0IGJlc3Qgc3VpdHMgeW91ciBwcm9qZWN0IGFuZCB1c2UgaXQgYWNjb3JkaW5nbHkuIAogKgogKiBBbHRob3VnaCBub3QgcmVxdWlyZWQsIHRoZSBhdXRob3Igd291bGQgYXBwcmVjaWF0ZSBhbiBlbWFpbCBsZXR0aW5nIGhpbSAKICoga25vdyBvZiBhbnkgc3Vic3RhbnRpYWwgdXNlIG9mIGpxUGxvdC4gIFlvdSBjYW4gcmVhY2ggdGhlIGF1dGhvciBhdDogCiAqIGNocmlzIGF0IGpxcGxvdCBkb3QgY29tIG9yIHNlZSBodHRwOi8vd3d3LmpxcGxvdC5jb20vaW5mby5waHAgLgogKgogKiBJZiB5b3UgYXJlIGZlZWxpbmcga2luZCBhbmQgZ2VuZXJvdXMsIGNvbnNpZGVyIHN1cHBvcnRpbmcgdGhlIHByb2plY3QgYnkKICogbWFraW5nIGEgZG9uYXRpb24gYXQ6IGh0dHA6Ly93d3cuanFwbG90LmNvbS9kb25hdGUucGhwIC4KICoKICogc3ByaW50ZiBmdW5jdGlvbnMgY29udGFpbmVkIGluIGpxcGxvdC5zcHJpbnRmLmpzIGJ5IEFzaCBTZWFybGU6CiAqCiAqICAgICB2ZXJzaW9uIDIwMDcuMDQuMjcKICogICAgIGF1dGhvciBBc2ggU2VhcmxlCiAqICAgICBodHRwOi8vaGV4bWVuLmNvbS9ibG9nLzIwMDcvMDMvcHJpbnRmLXNwcmludGYvCiAqICAgICBodHRwOi8vaGV4bWVuLmNvbS9qcy9zcHJpbnRmLmpzCiAqICAgICBUaGUgYXV0aG9yIChBc2ggU2VhcmxlKSBoYXMgcGxhY2VkIHRoaXMgY29kZSBpbiB0aGUgcHVibGljIGRvbWFpbjoKICogICAgICJUaGlzIGNvZGUgaXMgdW5yZXN0cmljdGVkOiB5b3UgYXJlIGZyZWUgdG8gdXNlIGl0IGhvd2V2ZXIgeW91IGxpa2UuIgogKgogKiBpbmNsdWRlZCBqc0RhdGUgbGlicmFyeSBieSBDaHJpcyBMZW9uZWxsbzoKICoKICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEgQ2hyaXMgTGVvbmVsbG8KICoKICoganNEYXRlIGlzIGN1cnJlbnRseSBhdmFpbGFibGUgZm9yIHVzZSBpbiBhbGwgcGVyc29uYWwgb3IgY29tbWVyY2lhbCBwcm9qZWN0cyAKICogdW5kZXIgYm90aCB0aGUgTUlUIGFuZCBHUEwgdmVyc2lvbiAyLjAgbGljZW5zZXMuIFRoaXMgbWVhbnMgdGhhdCB5b3UgY2FuIAogKiBjaG9vc2UgdGhlIGxpY2Vuc2UgdGhhdCBiZXN0IHN1aXRzIHlvdXIgcHJvamVjdCBhbmQgdXNlIGl0IGFjY29yZGluZ2x5LgogKgogKiBqc0RhdGUgYm9ycm93cyBtYW55IGNvbmNlcHRzIGFuZCBpZGVhcyBmcm9tIHRoZSBEYXRlIEluc3RhbmNlIAogKiBNZXRob2RzIGJ5IEtlbiBTbnlkZXIgYWxvbmcgd2l0aCBzb21lIHBhcnRzIG9mIEtlbidzIGFjdHVhbCBjb2RlLgogKiAKICogS2VuJ3Mgb3JpZ2lhbmwgRGF0ZSBJbnN0YW5jZSBNZXRob2RzIGFuZCBjb3B5cmlnaHQgbm90aWNlOgogKiAKICogS2VuIFNueWRlciAoa2VuIGQgc255ZGVyIGF0IGdtYWlsIGRvdCBjb20pCiAqIDIwMDgtMDktMTAKICogdmVyc2lvbiAyLjAuMiAoaHR0cDovL2tlbmRzbnlkZXIuY29tL3NhbmRib3gvZGF0ZS8pICAgICAKICogQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbiBMaWNlbnNlIDMuMCAoaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnkvMy4wLykKICoKICoganFwbG90VG9JbWFnZSBmdW5jdGlvbiBiYXNlZCBvbiBMYXJyeSBTaWRlbidzIGV4cG9ydC1qcXBsb3QtdG8tcG5nLmpzLgogKiBMYXJyeSBoYXMgZ2VuZXJvdXNseSBnaXZlbiBwZXJtaXNzaW9uIHRvIGFkYXB0IGhpcyBjb2RlIGZvciBpbmNsdXNpb24KICogaW50byBqcVBsb3QuCiAqCiAqIExhcnJ5J3Mgb3JpZ2luYWwgY29kZSBjYW4gYmUgZm91bmQgaGVyZToKICoKICogaHR0cHM6Ly9naXRodWIuY29tL2xzaWRlbi9leHBvcnQtanFwbG90LXRvLXBuZwogKiAKICogCiAqLwooZnVuY3Rpb24oYSl7YS5qcXBsb3QuUHlyYW1pZEdyaWRSZW5kZXJlcj1mdW5jdGlvbigpe2EuanFwbG90LkNhbnZhc0dyaWRSZW5kZXJlci5jYWxsKHRoaXMpfTthLmpxcGxvdC5QeXJhbWlkR3JpZFJlbmRlcmVyLnByb3RvdHlwZT1uZXcgYS5qcXBsb3QuQ2FudmFzR3JpZFJlbmRlcmVyKCk7YS5qcXBsb3QuUHlyYW1pZEdyaWRSZW5kZXJlci5wcm90b3R5cGUuY29uc3RydWN0b3I9YS5qcXBsb3QuUHlyYW1pZEdyaWRSZW5kZXJlcjthLmpxcGxvdC5DYW52YXNHcmlkUmVuZGVyZXIucHJvdG90eXBlLmluaXQ9ZnVuY3Rpb24oYyl7dGhpcy5fY3R4O3RoaXMucGxvdEJhbmRzPXtzaG93OmZhbHNlLGNvbG9yOiJyZ2IoMjMwLCAyMTksIDE3OSkiLGF4aXM6InkiLHN0YXJ0Om51bGwsaW50ZXJ2YWw6MTB9O2EuZXh0ZW5kKHRydWUsdGhpcyxjKTt2YXIgYj17bGluZUpvaW46Im1pdGVyIixsaW5lQ2FwOiJyb3VuZCIsZmlsbDpmYWxzZSxpc2FyYzpmYWxzZSxhbmdsZTp0aGlzLnNoYWRvd0FuZ2xlLG9mZnNldDp0aGlzLnNoYWRvd09mZnNldCxhbHBoYTp0aGlzLnNoYWRvd0FscGhhLGRlcHRoOnRoaXMuc2hhZG93RGVwdGgsbGluZVdpZHRoOnRoaXMuc2hhZG93V2lkdGgsY2xvc2VQYXRoOmZhbHNlLHN0cm9rZVN0eWxlOnRoaXMuc2hhZG93Q29sb3J9O3RoaXMucmVuZGVyZXIuc2hhZG93UmVuZGVyZXIuaW5pdChiKX07YS5qcXBsb3QuUHlyYW1pZEdyaWRSZW5kZXJlci5wcm90b3R5cGUuZHJhdz1mdW5jdGlvbigpe3RoaXMuX2N0eD10aGlzLl9lbGVtLmdldCgwKS5nZXRDb250ZXh0KCIyZCIpO3ZhciBEPXRoaXMuX2N0eDt2YXIgRz10aGlzLl9heGVzO3ZhciBxPUcueGF4aXMudTJwO3ZhciBKPUcueU1pZEF4aXMudTJwO3ZhciBsPUcueGF4aXMubWF4LzEwMDA7dmFyIHU9cSgwKTt2YXIgZj1xKGwpO3ZhciByPVsieGF4aXMiLCJ5YXhpcyIsIngyYXhpcyIsInkyYXhpcyIsInlNaWRBeGlzIl07RC5zYXZlKCk7RC5jbGVhclJlY3QoMCwwLHRoaXMuX3Bsb3REaW1lbnNpb25zLndpZHRoLHRoaXMuX3Bsb3REaW1lbnNpb25zLmhlaWdodCk7RC5maWxsU3R5bGU9dGhpcy5iYWNrZ3JvdW5kQ29sb3J8fHRoaXMuYmFja2dyb3VuZDtELmZpbGxSZWN0KHRoaXMuX2xlZnQsdGhpcy5fdG9wLHRoaXMuX3dpZHRoLHRoaXMuX2hlaWdodCk7aWYodGhpcy5wbG90QmFuZHMuc2hvdyl7RC5zYXZlKCk7dmFyIGM9dGhpcy5wbG90QmFuZHM7RC5maWxsU3R5bGU9Yy5jb2xvcjt2YXIgZDt2YXIgbyxuLHAsSTtpZihjLmF4aXMuY2hhckF0KDApPT09IngiKXtpZihHLnhheGlzLnNob3cpe2Q9Ry54YXhpc319ZWxzZXtpZihjLmF4aXMuY2hhckF0KDApPT09InkiKXtpZihHLnlheGlzLnNob3cpe2Q9Ry55YXhpc31lbHNle2lmKEcueTJheGlzLnNob3cpe2Q9Ry55MmF4aXN9ZWxzZXtpZihHLnlNaWRBeGlzLnNob3cpe2Q9Ry55TWlkQXhpc319fX19aWYoZCE9PXVuZGVmaW5lZCl7dmFyIGc9Yy5zdGFydDtpZihnPT09bnVsbCl7Zz1kLm1pbn1mb3IodmFyIEg9ZztIPGQubWF4O0grPTIqYy5pbnRlcnZhbCl7aWYoZC5uYW1lLmNoYXJBdCgwKT09PSJ5Iil7bz10aGlzLl9sZWZ0O249ZC5zZXJpZXNfdTJwKEgrYy5pbnRlcnZhbCkrdGhpcy5fdG9wO3A9dGhpcy5fcmlnaHQtdGhpcy5fbGVmdDtJPWQuc2VyaWVzX3UycChnKS1kLnNlcmllc191MnAoZytjLmludGVydmFsKTtELmZpbGxSZWN0KG8sbixwLEkpfX19RC5yZXN0b3JlKCl9RC5zYXZlKCk7RC5saW5lSm9pbj0ibWl0ZXIiO0QubGluZUNhcD0iYnV0dCI7RC5saW5lV2lkdGg9dGhpcy5ncmlkTGluZVdpZHRoO0Quc3Ryb2tlU3R5bGU9dGhpcy5ncmlkTGluZUNvbG9yO3ZhciBMLEssQSxDO2Zvcih2YXIgSD01O0g+MDtILS0pe3ZhciBPPXJbSC0xXTt2YXIgZD1HW09dO3ZhciBNPWQuX3RpY2tzO3ZhciBCPU0ubGVuZ3RoO2lmKGQuc2hvdyl7aWYoZC5kcmF3QmFzZWxpbmUpe3ZhciBOPXt9O2lmKGQuYmFzZWxpbmVXaWR0aCE9PW51bGwpe04ubGluZVdpZHRoPWQuYmFzZWxpbmVXaWR0aH1pZihkLmJhc2VsaW5lQ29sb3IhPT1udWxsKXtOLnN0cm9rZVN0eWxlPWQuYmFzZWxpbmVDb2xvcn1zd2l0Y2goTyl7Y2FzZSJ4YXhpcyI6aWYoRy55TWlkQXhpcy5zaG93KXt6KHRoaXMuX2xlZnQsdGhpcy5fYm90dG9tLHUsdGhpcy5fYm90dG9tLE4pO3ooZix0aGlzLl9ib3R0b20sdGhpcy5fcmlnaHQsdGhpcy5fYm90dG9tLE4pfWVsc2V7eih0aGlzLl9sZWZ0LHRoaXMuX2JvdHRvbSx0aGlzLl9yaWdodCx0aGlzLl9ib3R0b20sTil9YnJlYWs7Y2FzZSJ5YXhpcyI6eih0aGlzLl9sZWZ0LHRoaXMuX2JvdHRvbSx0aGlzLl9sZWZ0LHRoaXMuX3RvcCxOKTticmVhaztjYXNlInlNaWRBeGlzIjp6KHUsdGhpcy5fYm90dG9tLHUsdGhpcy5fdG9wLE4pO3ooZix0aGlzLl9ib3R0b20sZix0aGlzLl90b3AsTik7YnJlYWs7Y2FzZSJ4MmF4aXMiOmlmKEcueU1pZEF4aXMuc2hvdyl7eih0aGlzLl9sZWZ0LHRoaXMuX3RvcCx1LHRoaXMuX3RvcCxOKTt6KGYsdGhpcy5fdG9wLHRoaXMuX3JpZ2h0LHRoaXMuX3RvcCxOKX1lbHNle3oodGhpcy5fbGVmdCx0aGlzLl9ib3R0b20sdGhpcy5fcmlnaHQsdGhpcy5fYm90dG9tLE4pfWJyZWFrO2Nhc2UieTJheGlzIjp6KHRoaXMuX3JpZ2h0LHRoaXMuX2JvdHRvbSx0aGlzLl9yaWdodCx0aGlzLl90b3AsTik7YnJlYWt9fWZvcih2YXIgRT1CO0U+MDtFLS0pe3ZhciB2PU1bRS0xXTtpZih2LnNob3cpe3ZhciBrPU1hdGgucm91bmQoZC51MnAodi52YWx1ZSkpKzAuNTtzd2l0Y2goTyl7Y2FzZSJ4YXhpcyI6aWYodi5zaG93R3JpZGxpbmUmJnRoaXMuZHJhd0dyaWRsaW5lcyYmKCF2LmlzTWlub3JUaWNrfHxkLnNob3dNaW5vclRpY2tzKSl7eihrLHRoaXMuX3RvcCxrLHRoaXMuX2JvdHRvbSl9aWYodi5zaG93TWFyayYmdi5tYXJrJiYoIXYuaXNNaW5vclRpY2t8fGQuc2hvd01pbm9yVGlja3MpKXtBPXYubWFya1NpemU7Qz12Lm1hcms7dmFyIGs9TWF0aC5yb3VuZChkLnUycCh2LnZhbHVlKSkrMC41O3N3aXRjaChDKXtjYXNlIm91dHNpZGUiOkw9dGhpcy5fYm90dG9tO0s9dGhpcy5fYm90dG9tK0E7YnJlYWs7Y2FzZSJpbnNpZGUiOkw9dGhpcy5fYm90dG9tLUE7Sz10aGlzLl9ib3R0b207YnJlYWs7Y2FzZSJjcm9zcyI6TD10aGlzLl9ib3R0b20tQTtLPXRoaXMuX2JvdHRvbStBO2JyZWFrO2RlZmF1bHQ6TD10aGlzLl9ib3R0b207Sz10aGlzLl9ib3R0b20rQTticmVha31pZih0aGlzLnNoYWRvdyl7dGhpcy5yZW5kZXJlci5zaGFkb3dSZW5kZXJlci5kcmF3KEQsW1trLExdLFtrLEtdXSx7bGluZUNhcDoiYnV0dCIsbGluZVdpZHRoOnRoaXMuZ3JpZExpbmVXaWR0aCxvZmZzZXQ6dGhpcy5ncmlkTGluZVdpZHRoKjAuNzUsZGVwdGg6MixmaWxsOmZhbHNlLGNsb3NlUGF0aDpmYWxzZX0pfXooayxMLGssSyl9YnJlYWs7Y2FzZSJ5YXhpcyI6aWYodi5zaG93R3JpZGxpbmUmJnRoaXMuZHJhd0dyaWRsaW5lcyYmKCF2LmlzTWlub3JUaWNrfHxkLnNob3dNaW5vclRpY2tzKSl7eih0aGlzLl9yaWdodCxrLHRoaXMuX2xlZnQsayl9aWYodi5zaG93TWFyayYmdi5tYXJrJiYoIXYuaXNNaW5vclRpY2t8fGQuc2hvd01pbm9yVGlja3MpKXtBPXYubWFya1NpemU7Qz12Lm1hcms7dmFyIGs9TWF0aC5yb3VuZChkLnUycCh2LnZhbHVlKSkrMC41O3N3aXRjaChDKXtjYXNlIm91dHNpZGUiOkw9dGhpcy5fbGVmdC1BO0s9dGhpcy5fbGVmdDticmVhaztjYXNlImluc2lkZSI6TD10aGlzLl9sZWZ0O0s9dGhpcy5fbGVmdCtBO2JyZWFrO2Nhc2UiY3Jvc3MiOkw9dGhpcy5fbGVmdC1BO0s9dGhpcy5fbGVmdCtBO2JyZWFrO2RlZmF1bHQ6TD10aGlzLl9sZWZ0LUE7Sz10aGlzLl9sZWZ0O2JyZWFrfWlmKHRoaXMuc2hhZG93KXt0aGlzLnJlbmRlcmVyLnNoYWRvd1JlbmRlcmVyLmRyYXcoRCxbW0wsa10sW0ssa11dLHtsaW5lQ2FwOiJidXR0IixsaW5lV2lkdGg6dGhpcy5ncmlkTGluZVdpZHRoKjEuNSxvZmZzZXQ6dGhpcy5ncmlkTGluZVdpZHRoKjAuNzUsZmlsbDpmYWxzZSxjbG9zZVBhdGg6ZmFsc2V9KX16KEwsayxLLGsse3N0cm9rZVN0eWxlOmQuYm9yZGVyQ29sb3J9KX1icmVhaztjYXNlInlNaWRBeGlzIjppZih2LnNob3dHcmlkbGluZSYmdGhpcy5kcmF3R3JpZGxpbmVzJiYoIXYuaXNNaW5vclRpY2t8fGQuc2hvd01pbm9yVGlja3MpKXt6KHRoaXMuX2xlZnQsayx1LGspO3ooZixrLHRoaXMuX3JpZ2h0LGspfWlmKHYuc2hvd01hcmsmJnYubWFyayYmKCF2LmlzTWlub3JUaWNrfHxkLnNob3dNaW5vclRpY2tzKSl7QT12Lm1hcmtTaXplO0M9di5tYXJrO3ZhciBrPU1hdGgucm91bmQoZC51MnAodi52YWx1ZSkpKzAuNTtMPXU7Sz11K0E7aWYodGhpcy5zaGFkb3cpe3RoaXMucmVuZGVyZXIuc2hhZG93UmVuZGVyZXIuZHJhdyhELFtbTCxrXSxbSyxrXV0se2xpbmVDYXA6ImJ1dHQiLGxpbmVXaWR0aDp0aGlzLmdyaWRMaW5lV2lkdGgqMS41LG9mZnNldDp0aGlzLmdyaWRMaW5lV2lkdGgqMC43NSxmaWxsOmZhbHNlLGNsb3NlUGF0aDpmYWxzZX0pfXooTCxrLEssayx7c3Ryb2tlU3R5bGU6ZC5ib3JkZXJDb2xvcn0pO0w9Zi1BO0s9ZjtpZih0aGlzLnNoYWRvdyl7dGhpcy5yZW5kZXJlci5zaGFkb3dSZW5kZXJlci5kcmF3KEQsW1tMLGtdLFtLLGtdXSx7bGluZUNhcDoiYnV0dCIsbGluZVdpZHRoOnRoaXMuZ3JpZExpbmVXaWR0aCoxLjUsb2Zmc2V0OnRoaXMuZ3JpZExpbmVXaWR0aCowLjc1LGZpbGw6ZmFsc2UsY2xvc2VQYXRoOmZhbHNlfSl9eihMLGssSyxrLHtzdHJva2VTdHlsZTpkLmJvcmRlckNvbG9yfSl9YnJlYWs7Y2FzZSJ4MmF4aXMiOmlmKHYuc2hvd0dyaWRsaW5lJiZ0aGlzLmRyYXdHcmlkbGluZXMmJighdi5pc01pbm9yVGlja3x8ZC5zaG93TWlub3JUaWNrcykpe3ooayx0aGlzLl9ib3R0b20sayx0aGlzLl90b3ApfWlmKHYuc2hvd01hcmsmJnYubWFyayYmKCF2LmlzTWlub3JUaWNrfHxkLnNob3dNaW5vclRpY2tzKSl7QT12Lm1hcmtTaXplO0M9di5tYXJrO3ZhciBrPU1hdGgucm91bmQoZC51MnAodi52YWx1ZSkpKzAuNTtzd2l0Y2goQyl7Y2FzZSJvdXRzaWRlIjpMPXRoaXMuX3RvcC1BO0s9dGhpcy5fdG9wO2JyZWFrO2Nhc2UiaW5zaWRlIjpMPXRoaXMuX3RvcDtLPXRoaXMuX3RvcCtBO2JyZWFrO2Nhc2UiY3Jvc3MiOkw9dGhpcy5fdG9wLUE7Sz10aGlzLl90b3ArQTticmVhaztkZWZhdWx0Okw9dGhpcy5fdG9wLUE7Sz10aGlzLl90b3A7YnJlYWt9aWYodGhpcy5zaGFkb3cpe3RoaXMucmVuZGVyZXIuc2hhZG93UmVuZGVyZXIuZHJhdyhELFtbayxMXSxbayxLXV0se2xpbmVDYXA6ImJ1dHQiLGxpbmVXaWR0aDp0aGlzLmdyaWRMaW5lV2lkdGgsb2Zmc2V0OnRoaXMuZ3JpZExpbmVXaWR0aCowLjc1LGRlcHRoOjIsZmlsbDpmYWxzZSxjbG9zZVBhdGg6ZmFsc2V9KX16KGssTCxrLEspfWJyZWFrO2Nhc2UieTJheGlzIjppZih2LnNob3dHcmlkbGluZSYmdGhpcy5kcmF3R3JpZGxpbmVzJiYoIXYuaXNNaW5vclRpY2t8fGQuc2hvd01pbm9yVGlja3MpKXt6KHRoaXMuX2xlZnQsayx0aGlzLl9yaWdodCxrKX1pZih2LnNob3dNYXJrJiZ2Lm1hcmsmJighdi5pc01pbm9yVGlja3x8ZC5zaG93TWlub3JUaWNrcykpe0E9di5tYXJrU2l6ZTtDPXYubWFyazt2YXIgaz1NYXRoLnJvdW5kKGQudTJwKHYudmFsdWUpKSswLjU7c3dpdGNoKEMpe2Nhc2Uib3V0c2lkZSI6TD10aGlzLl9yaWdodDtLPXRoaXMuX3JpZ2h0K0E7YnJlYWs7Y2FzZSJpbnNpZGUiOkw9dGhpcy5fcmlnaHQtQTtLPXRoaXMuX3JpZ2h0O2JyZWFrO2Nhc2UiY3Jvc3MiOkw9dGhpcy5fcmlnaHQtQTtLPXRoaXMuX3JpZ2h0K0E7YnJlYWs7ZGVmYXVsdDpMPXRoaXMuX3JpZ2h0O0s9dGhpcy5fcmlnaHQrQTticmVha31pZih0aGlzLnNoYWRvdyl7dGhpcy5yZW5kZXJlci5zaGFkb3dSZW5kZXJlci5kcmF3KEQsW1tMLGtdLFtLLGtdXSx7bGluZUNhcDoiYnV0dCIsbGluZVdpZHRoOnRoaXMuZ3JpZExpbmVXaWR0aCoxLjUsb2Zmc2V0OnRoaXMuZ3JpZExpbmVXaWR0aCowLjc1LGZpbGw6ZmFsc2UsY2xvc2VQYXRoOmZhbHNlfSl9eihMLGssSyxrLHtzdHJva2VTdHlsZTpkLmJvcmRlckNvbG9yfSl9YnJlYWs7ZGVmYXVsdDpicmVha319fXY9bnVsbH1kPW51bGw7TT1udWxsfUQucmVzdG9yZSgpO2Z1bmN0aW9uIHooaixpLGUsYixoKXtELnNhdmUoKTtoPWh8fHt9O2lmKGgubGluZVdpZHRoPT1udWxsfHxoLmxpbmVXaWR0aCE9MCl7YS5leHRlbmQodHJ1ZSxELGgpO0QuYmVnaW5QYXRoKCk7RC5tb3ZlVG8oaixpKTtELmxpbmVUbyhlLGIpO0Quc3Ryb2tlKCl9RC5yZXN0b3JlKCl9aWYodGhpcy5zaGFkb3cpe2lmKEcueU1pZEF4aXMuc2hvdyl7dmFyIEY9W1t0aGlzLl9sZWZ0LHRoaXMuX2JvdHRvbV0sW3UsdGhpcy5fYm90dG9tXV07dGhpcy5yZW5kZXJlci5zaGFkb3dSZW5kZXJlci5kcmF3KEQsRik7dmFyIEY9W1tmLHRoaXMuX2JvdHRvbV0sW3RoaXMuX3JpZ2h0LHRoaXMuX2JvdHRvbV0sW3RoaXMuX3JpZ2h0LHRoaXMuX3RvcF1dO3RoaXMucmVuZGVyZXIuc2hhZG93UmVuZGVyZXIuZHJhdyhELEYpO3ZhciBGPVtbdSx0aGlzLl9ib3R0b21dLFt1LHRoaXMuX3RvcF1dO3RoaXMucmVuZGVyZXIuc2hhZG93UmVuZGVyZXIuZHJhdyhELEYpfWVsc2V7dmFyIEY9W1t0aGlzLl9sZWZ0LHRoaXMuX2JvdHRvbV0sW3RoaXMuX3JpZ2h0LHRoaXMuX2JvdHRvbV0sW3RoaXMuX3JpZ2h0LHRoaXMuX3RvcF1dO3RoaXMucmVuZGVyZXIuc2hhZG93UmVuZGVyZXIuZHJhdyhELEYpfX1pZih0aGlzLmJvcmRlcldpZHRoIT0wJiZ0aGlzLmRyYXdCb3JkZXIpe2lmKEcueU1pZEF4aXMuc2hvdyl7eih0aGlzLl9sZWZ0LHRoaXMuX3RvcCx1LHRoaXMuX3RvcCx7bGluZUNhcDoicm91bmQiLHN0cm9rZVN0eWxlOkcueDJheGlzLmJvcmRlckNvbG9yLGxpbmVXaWR0aDpHLngyYXhpcy5ib3JkZXJXaWR0aH0pO3ooZix0aGlzLl90b3AsdGhpcy5fcmlnaHQsdGhpcy5fdG9wLHtsaW5lQ2FwOiJyb3VuZCIsc3Ryb2tlU3R5bGU6Ry54MmF4aXMuYm9yZGVyQ29sb3IsbGluZVdpZHRoOkcueDJheGlzLmJvcmRlcldpZHRofSk7eih0aGlzLl9yaWdodCx0aGlzLl90b3AsdGhpcy5fcmlnaHQsdGhpcy5fYm90dG9tLHtsaW5lQ2FwOiJyb3VuZCIsc3Ryb2tlU3R5bGU6Ry55MmF4aXMuYm9yZGVyQ29sb3IsbGluZVdpZHRoOkcueTJheGlzLmJvcmRlcldpZHRofSk7eih0aGlzLl9yaWdodCx0aGlzLl9ib3R0b20sZix0aGlzLl9ib3R0b20se2xpbmVDYXA6InJvdW5kIixzdHJva2VTdHlsZTpHLnhheGlzLmJvcmRlckNvbG9yLGxpbmVXaWR0aDpHLnhheGlzLmJvcmRlcldpZHRofSk7eih1LHRoaXMuX2JvdHRvbSx0aGlzLl9sZWZ0LHRoaXMuX2JvdHRvbSx7bGluZUNhcDoicm91bmQiLHN0cm9rZVN0eWxlOkcueGF4aXMuYm9yZGVyQ29sb3IsbGluZVdpZHRoOkcueGF4aXMuYm9yZGVyV2lkdGh9KTt6KHRoaXMuX2xlZnQsdGhpcy5fYm90dG9tLHRoaXMuX2xlZnQsdGhpcy5fdG9wLHtsaW5lQ2FwOiJyb3VuZCIsc3Ryb2tlU3R5bGU6Ry55YXhpcy5ib3JkZXJDb2xvcixsaW5lV2lkdGg6Ry55YXhpcy5ib3JkZXJXaWR0aH0pO3oodSx0aGlzLl9ib3R0b20sdSx0aGlzLl90b3Ase2xpbmVDYXA6InJvdW5kIixzdHJva2VTdHlsZTpHLnlheGlzLmJvcmRlckNvbG9yLGxpbmVXaWR0aDpHLnlheGlzLmJvcmRlcldpZHRofSk7eihmLHRoaXMuX2JvdHRvbSxmLHRoaXMuX3RvcCx7bGluZUNhcDoicm91bmQiLHN0cm9rZVN0eWxlOkcueWF4aXMuYm9yZGVyQ29sb3IsbGluZVdpZHRoOkcueWF4aXMuYm9yZGVyV2lkdGh9KX1lbHNle3oodGhpcy5fbGVmdCx0aGlzLl90b3AsdGhpcy5fcmlnaHQsdGhpcy5fdG9wLHtsaW5lQ2FwOiJyb3VuZCIsc3Ryb2tlU3R5bGU6Ry54MmF4aXMuYm9yZGVyQ29sb3IsbGluZVdpZHRoOkcueDJheGlzLmJvcmRlcldpZHRofSk7eih0aGlzLl9yaWdodCx0aGlzLl90b3AsdGhpcy5fcmlnaHQsdGhpcy5fYm90dG9tLHtsaW5lQ2FwOiJyb3VuZCIsc3Ryb2tlU3R5bGU6Ry55MmF4aXMuYm9yZGVyQ29sb3IsbGluZVdpZHRoOkcueTJheGlzLmJvcmRlcldpZHRofSk7eih0aGlzLl9yaWdodCx0aGlzLl9ib3R0b20sdGhpcy5fbGVmdCx0aGlzLl9ib3R0b20se2xpbmVDYXA6InJvdW5kIixzdHJva2VTdHlsZTpHLnhheGlzLmJvcmRlckNvbG9yLGxpbmVXaWR0aDpHLnhheGlzLmJvcmRlcldpZHRofSk7eih0aGlzLl9sZWZ0LHRoaXMuX2JvdHRvbSx0aGlzLl9sZWZ0LHRoaXMuX3RvcCx7bGluZUNhcDoicm91bmQiLHN0cm9rZVN0eWxlOkcueWF4aXMuYm9yZGVyQ29sb3IsbGluZVdpZHRoOkcueWF4aXMuYm9yZGVyV2lkdGh9KX19RC5yZXN0b3JlKCk7RD1udWxsO0c9bnVsbH19KShqUXVlcnkpOw==]]></data>
	</file>
	<file>
	  <filename>/src/plugins/jqplot.pyramidRenderer.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqCiAqIGpxUGxvdAogKiBQdXJlIEphdmFTY3JpcHQgcGxvdHRpbmcgcGx1Z2luIHVzaW5nIGpRdWVyeQogKgogKiBWZXJzaW9uOiAxLjAuMGIyX3IxMDEyCiAqCiAqIENvcHlyaWdodCAoYykgMjAwOS0yMDExIENocmlzIExlb25lbGxvCiAqIGpxUGxvdCBpcyBjdXJyZW50bHkgYXZhaWxhYmxlIGZvciB1c2UgaW4gYWxsIHBlcnNvbmFsIG9yIGNvbW1lcmNpYWwgcHJvamVjdHMgCiAqIHVuZGVyIGJvdGggdGhlIE1JVCAoaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHApIGFuZCBHUEwgCiAqIHZlcnNpb24gMi4wIChodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC5odG1sKSBsaWNlbnNlcy4gVGhpcyBtZWFucyB0aGF0IHlvdSBjYW4gCiAqIGNob29zZSB0aGUgbGljZW5zZSB0aGF0IGJlc3Qgc3VpdHMgeW91ciBwcm9qZWN0IGFuZCB1c2UgaXQgYWNjb3JkaW5nbHkuIAogKgogKiBBbHRob3VnaCBub3QgcmVxdWlyZWQsIHRoZSBhdXRob3Igd291bGQgYXBwcmVjaWF0ZSBhbiBlbWFpbCBsZXR0aW5nIGhpbSAKICoga25vdyBvZiBhbnkgc3Vic3RhbnRpYWwgdXNlIG9mIGpxUGxvdC4gIFlvdSBjYW4gcmVhY2ggdGhlIGF1dGhvciBhdDogCiAqIGNocmlzIGF0IGpxcGxvdCBkb3QgY29tIG9yIHNlZSBodHRwOi8vd3d3LmpxcGxvdC5jb20vaW5mby5waHAgLgogKgogKiBJZiB5b3UgYXJlIGZlZWxpbmcga2luZCBhbmQgZ2VuZXJvdXMsIGNvbnNpZGVyIHN1cHBvcnRpbmcgdGhlIHByb2plY3QgYnkKICogbWFraW5nIGEgZG9uYXRpb24gYXQ6IGh0dHA6Ly93d3cuanFwbG90LmNvbS9kb25hdGUucGhwIC4KICoKICogc3ByaW50ZiBmdW5jdGlvbnMgY29udGFpbmVkIGluIGpxcGxvdC5zcHJpbnRmLmpzIGJ5IEFzaCBTZWFybGU6CiAqCiAqICAgICB2ZXJzaW9uIDIwMDcuMDQuMjcKICogICAgIGF1dGhvciBBc2ggU2VhcmxlCiAqICAgICBodHRwOi8vaGV4bWVuLmNvbS9ibG9nLzIwMDcvMDMvcHJpbnRmLXNwcmludGYvCiAqICAgICBodHRwOi8vaGV4bWVuLmNvbS9qcy9zcHJpbnRmLmpzCiAqICAgICBUaGUgYXV0aG9yIChBc2ggU2VhcmxlKSBoYXMgcGxhY2VkIHRoaXMgY29kZSBpbiB0aGUgcHVibGljIGRvbWFpbjoKICogICAgICJUaGlzIGNvZGUgaXMgdW5yZXN0cmljdGVkOiB5b3UgYXJlIGZyZWUgdG8gdXNlIGl0IGhvd2V2ZXIgeW91IGxpa2UuIgogKiAKICovCihmdW5jdGlvbigkKSB7CgogICAgLy8gTmVlZCB0byBlbnN1cmUgcHlyYW1pZCBheGlzIGFuZCBncmlkIHJlbmRlcmVycyBhcmUgbG9hZGVkLgogICAgLy8gWW91IHNob3VsZCBsb2FkIHRoZXNlIHdpdGggc2NyaXB0IHRhZ3MgaW4gdGhlIGh0bWwgaGVhZCwgdGhhdCBpcyBtb3JlIGVmZmljaWVudAogICAgLy8gYXMgdGhlIGJyb3dzZXIgd2lsbCBjYWNoZSB0aGUgcmVxdWVzdC4KICAgIC8vIE5vdGUsIGhhdmUgdG8gYmxvY2sgd2l0aCBzeW5jaHJvbm91cyByZXF1ZXN0IGluIG9yZGVyIHRvIGV4ZWN1dGUgYmFyIHJlbmRlcmVyIGNvZGUuCiAgICBpZiAoJC5qcXBsb3QuUHlyYW1pZEF4aXNSZW5kZXJlciA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgJC5hamF4KHsKICAgICAgICAgICAgdXJsOiAkLmpxcGxvdC5wbHVnaW5Mb2NhdGlvbiArICdqcXBsb3QucHlyYW1pZEF4aXNSZW5kZXJlci5qcycsCiAgICAgICAgICAgIGRhdGFUeXBlOiAic2NyaXB0IiwKICAgICAgICAgICAgYXN5bmM6IGZhbHNlCiAgICAgICAgfSk7CiAgICB9CiAgICAKICAgIGlmICgkLmpxcGxvdC5QeXJhbWlkR3JpZFJlbmRlcmVyID09PSB1bmRlZmluZWQpIHsKICAgICAgICAkLmFqYXgoewogICAgICAgICAgICB1cmw6ICQuanFwbG90LnBsdWdpbkxvY2F0aW9uICsgJ2pxcGxvdC5weXJhbWlkR3JpZFJlbmRlcmVyLmpzJywKICAgICAgICAgICAgZGF0YVR5cGU6ICJzY3JpcHQiLAogICAgICAgICAgICBhc3luYzogZmFsc2UKICAgICAgICB9KTsKICAgIH0KCiAgICAkLmpxcGxvdC5QeXJhbWlkUmVuZGVyZXIgPSBmdW5jdGlvbigpewogICAgICAgICQuanFwbG90LkxpbmVSZW5kZXJlci5jYWxsKHRoaXMpOwogICAgfTsKICAgIAogICAgJC5qcXBsb3QuUHlyYW1pZFJlbmRlcmVyLnByb3RvdHlwZSA9IG5ldyAkLmpxcGxvdC5MaW5lUmVuZGVyZXIoKTsKICAgICQuanFwbG90LlB5cmFtaWRSZW5kZXJlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSAkLmpxcGxvdC5QeXJhbWlkUmVuZGVyZXI7CiAgICAKICAgIC8vIGNhbGxlZCB3aXRoIHNjb3BlIG9mIGEgc2VyaWVzCiAgICAkLmpxcGxvdC5QeXJhbWlkUmVuZGVyZXIucHJvdG90eXBlLmluaXQgPSBmdW5jdGlvbihvcHRpb25zLCBwbG90KSB7CiAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307CiAgICAgICAgdGhpcy5fdHlwZSA9ICdweXJhbWlkJzsKICAgICAgICAvLyBHcm91cDogUHJvcGVydGllcwogICAgICAgIC8vCiAgICAgICAgLy8gcHJvcDogYmFyUGFkZGluZwogICAgICAgIHRoaXMuYmFyUGFkZGluZyA9IDEwOwogICAgICAgIHRoaXMuYmFyV2lkdGggPSBudWxsOwogICAgICAgIC8vIHByb3A6IGZpbGwKICAgICAgICAvLyBUcnVlIHRvIGZpbGwgdGhlIGJhcnMuCiAgICAgICAgdGhpcy5maWxsID0gdHJ1ZTsKICAgICAgICAvLyBwcm9wOiBoaWdobGlnaHRNb3VzZU92ZXIKICAgICAgICAvLyBUcnVlIHRvIGhpZ2hsaWdodCBzbGljZSB3aGVuIG1vdXNlZCBvdmVyLgogICAgICAgIC8vIFRoaXMgbXVzdCBiZSBmYWxzZSB0byBlbmFibGUgaGlnaGxpZ2h0TW91c2VEb3duIHRvIGhpZ2hsaWdodCB3aGVuIGNsaWNraW5nIG9uIGEgc2xpY2UuCiAgICAgICAgdGhpcy5oaWdobGlnaHRNb3VzZU92ZXIgPSB0cnVlOwogICAgICAgIC8vIHByb3A6IGhpZ2hsaWdodE1vdXNlRG93bgogICAgICAgIC8vIFRydWUgdG8gaGlnaGxpZ2h0IHdoZW4gYSBtb3VzZSBidXR0b24gaXMgcHJlc3NlZCBvdmVyIGEgc2xpY2UuCiAgICAgICAgLy8gVGhpcyB3aWxsIGJlIGRpc2FibGVkIGlmIGhpZ2hsaWdodE1vdXNlT3ZlciBpcyB0cnVlLgogICAgICAgIHRoaXMuaGlnaGxpZ2h0TW91c2VEb3duID0gZmFsc2U7CiAgICAgICAgLy8gcHJvcDogaGlnaGxpZ2h0Q29sb3JzCiAgICAgICAgLy8gYW4gYXJyYXkgb2YgY29sb3JzIHRvIHVzZSB3aGVuIGhpZ2hsaWdodGluZyBhIHNsaWNlLgogICAgICAgIHRoaXMuaGlnaGxpZ2h0Q29sb3JzID0gW107CiAgICAgICAgLy8gcHJvcDogb2Zmc2V0QmFycwogICAgICAgIC8vIEZhbHNlIHdpbGwgY2VudGVyIGJhcnMgb24gdGhlaXIgeSB2YWx1ZS4KICAgICAgICAvLyBUcnVlIHdpbGwgcHVzaCBiYXJzIHVwIGJ5IDEvMiBiYXIgd2lkdGggdG8gZmlsbCBiZXR3ZWVuIHRoZWlyIHkgdmFsdWVzLgogICAgICAgIC8vIElmIHRydWUsIHRoZXJlIG5lZWRzIHRvIGJlIDEgbW9yZSB0aWNrIHRoYW4gdGhlcmUgYXJlIGJhcnMuCiAgICAgICAgdGhpcy5vZmZzZXRCYXJzID0gZmFsc2U7CiAgICAgICAgCiAgICAgICAgLy8gaWYgdXNlciBoYXMgcGFzc2VkIGluIGhpZ2hsaWdodE1vdXNlRG93biBvcHRpb24gYW5kIG5vdCBzZXQgaGlnaGxpZ2h0TW91c2VPdmVyLCBkaXNhYmxlIGhpZ2hsaWdodE1vdXNlT3ZlcgogICAgICAgIGlmIChvcHRpb25zLmhpZ2hsaWdodE1vdXNlRG93biAmJiBvcHRpb25zLmhpZ2hsaWdodE1vdXNlT3ZlciA9PSBudWxsKSB7CiAgICAgICAgICAgIG9wdGlvbnMuaGlnaGxpZ2h0TW91c2VPdmVyID0gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICB0aGlzLnNpZGUgPSAncmlnaHQnOwogICAgICAgIAogICAgICAgICQuZXh0ZW5kKHRydWUsIHRoaXMsIG9wdGlvbnMpOwoKICAgICAgICAvLyBpZiAodGhpcy5maWxsID09PSBmYWxzZSkgewogICAgICAgIC8vICAgICB0aGlzLnNoYWRvdyA9IGZhbHNlOwogICAgICAgIC8vIH0KICAgICAgICAKICAgICAgICB0aGlzLnJlbmRlcmVyLm9wdGlvbnMgPSBvcHRpb25zOwogICAgICAgIC8vIGluZGV4IG9mIHRoZSBjdXJyZW50eSBoaWdobGlnaHRlZCBwb2ludCwgaWYgYW55CiAgICAgICAgdGhpcy5faGlnaGxpZ2h0ZWRQb2ludCA9IG51bGw7CiAgICAgICAgLy8gQXJyYXkgb2YgYWN0dWFsIGRhdGEgY29sb3JzIHVzZWQgZm9yIGVhY2ggZGF0YSBwb2ludC4KICAgICAgICB0aGlzLl9kYXRhQ29sb3JzID0gW107CiAgICAgICAgdGhpcy5fYmFyUG9pbnRzID0gW107CiAgICAgICAgdGhpcy5maWxsQXhpcyA9ICd5JzsKICAgICAgICB0aGlzLl9wcmltYXJ5QXhpcyA9ICdfeWF4aXMnOwogICAgICAgIHRoaXMuX3hudWRnZSA9IDA7CiAgICAgICAgCiAgICAgICAgLy8gc2V0IHRoZSBzaGFwZSByZW5kZXJlciBvcHRpb25zCiAgICAgICAgdmFyIG9wdHMgPSB7bGluZUpvaW46J21pdGVyJywgbGluZUNhcDonYnV0dCcsIGZpbGw6dGhpcy5maWxsLCBmaWxsUmVjdDp0aGlzLmZpbGwsIGlzYXJjOmZhbHNlLCBzdHJva2VTdHlsZTp0aGlzLmNvbG9yLCBmaWxsU3R5bGU6dGhpcy5jb2xvciwgY2xvc2VQYXRoOnRoaXMuZmlsbCwgbGluZVdpZHRoOiB0aGlzLmxpbmVXaWR0aH07CiAgICAgICAgdGhpcy5yZW5kZXJlci5zaGFwZVJlbmRlcmVyLmluaXQob3B0cyk7CiAgICAgICAgLy8gc2V0IHRoZSBzaGFkb3cgcmVuZGVyZXIgb3B0aW9ucwogICAgICAgIHZhciBzaGFkb3dfb2Zmc2V0ID0gb3B0aW9ucy5zaGFkb3dPZmZzZXQ7CiAgICAgICAgLy8gc2V0IHRoZSBzaGFkb3cgcmVuZGVyZXIgb3B0aW9ucwogICAgICAgIGlmIChzaGFkb3dfb2Zmc2V0ID09IG51bGwpIHsKICAgICAgICAgICAgLy8gc2NhbGUgdGhlIHNoYWRvd09mZnNldCB0byB0aGUgd2lkdGggb2YgdGhlIGxpbmUuCiAgICAgICAgICAgIGlmICh0aGlzLmxpbmVXaWR0aCA+IDIuNSkgewogICAgICAgICAgICAgICAgc2hhZG93X29mZnNldCA9IDEuMjUgKiAoMSArIChNYXRoLmF0YW4oKHRoaXMubGluZVdpZHRoLzIuNSkpLzAuNzg1Mzk4MTYzIC0gMSkqMC42KTsKICAgICAgICAgICAgICAgIC8vIHZhciBzaGFkb3dfb2Zmc2V0ID0gdGhpcy5zaGFkb3dPZmZzZXQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gZm9yIHNraW5ueSBsaW5lcywgZG9uJ3QgbWFrZSBzdWNoIGEgYmlnIHNoYWRvdy4KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBzaGFkb3dfb2Zmc2V0ID0gMS4yNSAqIE1hdGguYXRhbigodGhpcy5saW5lV2lkdGgvMi41KSkvMC43ODUzOTgxNjM7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdmFyIHNvcHRzID0ge2xpbmVKb2luOidtaXRlcicsIGxpbmVDYXA6J2J1dHQnLCBmaWxsOnRoaXMuZmlsbCwgZmlsbFJlY3Q6dGhpcy5maWxsLCBpc2FyYzpmYWxzZSwgYW5nbGU6dGhpcy5zaGFkb3dBbmdsZSwgb2Zmc2V0OnNoYWRvd19vZmZzZXQsIGFscGhhOnRoaXMuc2hhZG93QWxwaGEsIGRlcHRoOnRoaXMuc2hhZG93RGVwdGgsIGNsb3NlUGF0aDp0aGlzLmZpbGwsIGxpbmVXaWR0aDogdGhpcy5saW5lV2lkdGh9OwogICAgICAgIHRoaXMucmVuZGVyZXIuc2hhZG93UmVuZGVyZXIuaW5pdChzb3B0cyk7CgogICAgICAgIHBsb3QucG9zdERyYXdIb29rcy5hZGRPbmNlKHBvc3RQbG90RHJhdyk7CiAgICAgICAgcGxvdC5ldmVudExpc3RlbmVySG9va3MuYWRkT25jZSgnanFwbG90TW91c2VNb3ZlJywgaGFuZGxlTW92ZSk7CgogICAgICAgIC8vIGlmIHRoaXMgaXMgdGhlIGxlZnQgc2lkZSBvZiBweXJhbWlkLCBzZXQgeSB2YWx1ZXMgdG8gbmVnYXRpdmUuCiAgICAgICAgaWYgKHRoaXMuc2lkZSA9PT0gJ2xlZnQnKSB7CiAgICAgICAgICAgIGZvciAodmFyIGk9MCwgbD10aGlzLmRhdGEubGVuZ3RoOyBpPGw7IGkrKykgewogICAgICAgICAgICAgICAgdGhpcy5kYXRhW2ldWzFdID0gLU1hdGguYWJzKHRoaXMuZGF0YVtpXVsxXSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9OwogICAgCiAgICAvLyBzZXRHcmlkRGF0YQogICAgLy8gY29udmVydHMgdGhlIHVzZXIgZGF0YSB2YWx1ZXMgdG8gZ3JpZCBjb29yZGluYXRlcyBhbmQgc3RvcmVzIHRoZW0KICAgIC8vIGluIHRoZSBncmlkRGF0YSBhcnJheS4KICAgIC8vIENhbGxlZCB3aXRoIHNjb3BlIG9mIGEgc2VyaWVzLgogICAgJC5qcXBsb3QuUHlyYW1pZFJlbmRlcmVyLnByb3RvdHlwZS5zZXRHcmlkRGF0YSA9IGZ1bmN0aW9uKHBsb3QpIHsKICAgICAgICAvLyByZWNhbGN1bGF0ZSB0aGUgZ3JpZCBkYXRhCiAgICAgICAgdmFyIHhwID0gdGhpcy5feGF4aXMuc2VyaWVzX3UycDsKICAgICAgICB2YXIgeXAgPSB0aGlzLl95YXhpcy5zZXJpZXNfdTJwOwogICAgICAgIHZhciBkYXRhID0gdGhpcy5fcGxvdERhdGE7CiAgICAgICAgdmFyIHBkYXRhID0gdGhpcy5fcHJldlBsb3REYXRhOwogICAgICAgIHRoaXMuZ3JpZERhdGEgPSBbXTsKICAgICAgICB0aGlzLl9wcmV2R3JpZERhdGEgPSBbXTsKICAgICAgICB2YXIgbCA9IGRhdGEubGVuZ3RoOwogICAgICAgIHZhciBhZGp1c3QgPSBmYWxzZTsKICAgICAgICB2YXIgaTsKCiAgICAgICAgLy8gaWYgYW55IGRhdGEgdmFsdWVzIGFyZSA8IDAsICBjb25zaWRlciB0aGlzIGEgbmVnYXRpdmUgc2VyaWVzCiAgICAgICAgZm9yIChpID0gMDsgaSA8IGw7IGkrKykgewogICAgICAgICAgICBpZiAoZGF0YVtpXVsxXSA8IDApIHsKICAgICAgICAgICAgICAgIHRoaXMuc2lkZSA9ICdsZWZ0JzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKHRoaXMuX3lheGlzLm5hbWUgPT09ICd5TWlkQXhpcycgJiYgdGhpcy5zaWRlID09PSAncmlnaHQnKSB7CiAgICAgICAgICAgIHRoaXMuX3hudWRnZSA9IHRoaXMuX3hheGlzLm1heC8yMDAwLjA7CiAgICAgICAgICAgIGFkanVzdCA9IHRydWU7CiAgICAgICAgfQoKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbDsgaSsrKSB7CiAgICAgICAgICAgIC8vIGlmIG5vdCBhIGxpbmUgc2VyaWVzIG9yIGlmIG5vIG51bGxzIGluIGRhdGEsIHB1c2ggdGhlIGNvbnZlcnRlZCBwb2ludCBvbnRvIHRoZSBhcnJheS4KICAgICAgICAgICAgaWYgKGRhdGFbaV1bMF0gIT0gbnVsbCAmJiBkYXRhW2ldWzFdICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIHRoaXMuZ3JpZERhdGEucHVzaChbeHAoZGF0YVtpXVsxXSksIHlwKGRhdGFbaV1bMF0pXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gZWxzZSBpZiB0aGVyZSBpcyBhIG51bGwsIHByZXNlcnZlIGl0LgogICAgICAgICAgICBlbHNlIGlmIChkYXRhW2ldWzBdID09IG51bGwpIHsKICAgICAgICAgICAgICAgIHRoaXMuZ3JpZERhdGEucHVzaChbeHAoZGF0YVtpXVsxXSksIG51bGxdKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChkYXRhW2ldWzFdID09IG51bGwpIHsKICAgICAgICAgICAgICAgIHRoaXMuZ3JpZERhdGEucHVzaChudWxsLCBbeXAoZGF0YVtpXVswXSldKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBmaW5hbGx5LCBhZGp1c3QgeCBncmlkIGRhdGEgaWYgaGF2ZSB0bwogICAgICAgICAgICBpZiAoZGF0YVtpXVsxXSA9PT0gMCAmJiBhZGp1c3QpIHsKICAgICAgICAgICAgICAgIHRoaXMuZ3JpZERhdGFbaV1bMF0gPSB4cCh0aGlzLl94bnVkZ2UpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfTsKICAgIAogICAgLy8gbWFrZUdyaWREYXRhCiAgICAvLyBjb252ZXJ0cyBhbnkgYXJiaXRyYXJ5IGRhdGEgdmFsdWVzIHRvIGdyaWQgY29vcmRpbmF0ZXMgYW5kCiAgICAvLyByZXR1cm5zIHRoZW0uICBUaGlzIG1ldGhvZCBleGlzdHMgc28gdGhhdCBwbHVnaW5zIGNhbiB1c2UgYSBzZXJpZXMnCiAgICAvLyBsaW5lcmVuZGVyZXIgdG8gZ2VuZXJhdGUgZ3JpZCBkYXRhIHBvaW50cyB3aXRob3V0IG92ZXJ3cml0aW5nIHRoZQogICAgLy8gZ3JpZCBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGF0IHNlcmllcy4KICAgIC8vIENhbGxlZCB3aXRoIHNjb3BlIG9mIGEgc2VyaWVzLgogICAgJC5qcXBsb3QuUHlyYW1pZFJlbmRlcmVyLnByb3RvdHlwZS5tYWtlR3JpZERhdGEgPSBmdW5jdGlvbihkYXRhLCBwbG90KSB7CiAgICAgICAgLy8gcmVjYWxjdWxhdGUgdGhlIGdyaWQgZGF0YQogICAgICAgIHZhciB4cCA9IHRoaXMuX3hheGlzLnNlcmllc191MnA7CiAgICAgICAgdmFyIHlwID0gdGhpcy5feWF4aXMuc2VyaWVzX3UycDsKICAgICAgICB2YXIgZ2QgPSBbXTsKICAgICAgICB2YXIgbCA9IGRhdGEubGVuZ3RoOwogICAgICAgIHZhciBhZGp1c3QgPSBmYWxzZTsKICAgICAgICB2YXIgaTsKCiAgICAgICAgLy8gaWYgYW55IGRhdGEgdmFsdWVzIGFyZSA8IDAsICBjb25zaWRlciB0aGlzIGEgbmVnYXRpdmUgc2VyaWVzCiAgICAgICAgZm9yIChpID0gMDsgaSA8IGw7IGkrKykgewogICAgICAgICAgICBpZiAoZGF0YVtpXVsxXSA8IDApIHsKICAgICAgICAgICAgICAgIHRoaXMuc2lkZSA9ICdsZWZ0JzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKHRoaXMuX3lheGlzLm5hbWUgPT09ICd5TWlkQXhpcycgJiYgdGhpcy5zaWRlID09PSAncmlnaHQnKSB7CiAgICAgICAgICAgIHRoaXMuX3hudWRnZSA9IHRoaXMuX3hheGlzLm1heC8yMDAwLjA7CiAgICAgICAgICAgIGFkanVzdCA9IHRydWU7CiAgICAgICAgfQoKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbDsgaSsrKSB7CiAgICAgICAgICAgIC8vIGlmIG5vdCBhIGxpbmUgc2VyaWVzIG9yIGlmIG5vIG51bGxzIGluIGRhdGEsIHB1c2ggdGhlIGNvbnZlcnRlZCBwb2ludCBvbnRvIHRoZSBhcnJheS4KICAgICAgICAgICAgaWYgKGRhdGFbaV1bMF0gIT0gbnVsbCAmJiBkYXRhW2ldWzFdICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIGdkLnB1c2goW3hwKGRhdGFbaV1bMV0pLCB5cChkYXRhW2ldWzBdKV0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIGVsc2UgaWYgdGhlcmUgaXMgYSBudWxsLCBwcmVzZXJ2ZSBpdC4KICAgICAgICAgICAgZWxzZSBpZiAoZGF0YVtpXVswXSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICBnZC5wdXNoKFt4cChkYXRhW2ldWzFdKSwgbnVsbF0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKGRhdGFbaV1bMV0gPT0gbnVsbCkgewogICAgICAgICAgICAgICAgZ2QucHVzaChbbnVsbCwgeXAoZGF0YVtpXVswXSldKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBmaW5hbGx5LCBhZGp1c3QgeCBncmlkIGRhdGEgaWYgaGF2ZSB0bwogICAgICAgICAgICBpZiAoZGF0YVtpXVsxXSA9PT0gMCAmJiBhZGp1c3QpIHsKICAgICAgICAgICAgICAgIGdkW2ldWzBdID0geHAodGhpcy5feG51ZGdlKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGdkOwogICAgfTsKCiAgICAkLmpxcGxvdC5QeXJhbWlkUmVuZGVyZXIucHJvdG90eXBlLnNldEJhcldpZHRoID0gZnVuY3Rpb24oKSB7CiAgICAgICAgLy8gbmVlZCB0byBrbm93IGhvdyBtYW55IGRhdGEgdmFsdWVzIHdlIGhhdmUgb24gdGhlIGFwcHJvcHJhdGUgYXhpcyBhbmQgZmlndXJlIGl0IG91dC4KICAgICAgICB2YXIgaTsKICAgICAgICB2YXIgbnZhbHMgPSAwOwogICAgICAgIHZhciBuc2VyaWVzID0gMDsKICAgICAgICB2YXIgcGF4aXMgPSB0aGlzW3RoaXMuX3ByaW1hcnlBeGlzXTsKICAgICAgICB2YXIgcywgc2VyaWVzLCBwb3M7CiAgICAgICAgbnZhbHMgPSBwYXhpcy5tYXggLSBwYXhpcy5taW47CiAgICAgICAgdmFyIG50aWNrcyA9IHBheGlzLm51bWJlclRpY2tzOwogICAgICAgIHZhciBuYmlucyA9IChudGlja3MtMSkvMjsKICAgICAgICAvLyBzbywgbm93IHdlIGhhdmUgdG90YWwgbnVtYmVyIG9mIGF4aXMgdmFsdWVzLgogICAgICAgIHZhciB0ZW1wID0gKHRoaXMuYmFyUGFkZGluZyA9PT0gMCkgPyAxLjAgOiAwOwogICAgICAgIGlmIChwYXhpcy5uYW1lID09ICd4YXhpcycgfHwgcGF4aXMubmFtZSA9PSAneDJheGlzJykgewogICAgICAgICAgICB0aGlzLmJhcldpZHRoID0gKHBheGlzLl9vZmZzZXRzLm1heCAtIHBheGlzLl9vZmZzZXRzLm1pbikgLyBudmFscyAtIHRoaXMuYmFyUGFkZGluZyArIHRlbXA7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBpZiAodGhpcy5maWxsKSB7CiAgICAgICAgICAgICAgICB0aGlzLmJhcldpZHRoID0gKHBheGlzLl9vZmZzZXRzLm1pbiAtIHBheGlzLl9vZmZzZXRzLm1heCkgLyBudmFscyAtIHRoaXMuYmFyUGFkZGluZyArIHRlbXA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICB0aGlzLmJhcldpZHRoID0gKHBheGlzLl9vZmZzZXRzLm1pbiAtIHBheGlzLl9vZmZzZXRzLm1heCkgLyBudmFsczsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH07CiAgICAKICAgICQuanFwbG90LlB5cmFtaWRSZW5kZXJlci5wcm90b3R5cGUuZHJhdyA9IGZ1bmN0aW9uKGN0eCwgZ3JpZERhdGEsIG9wdGlvbnMpIHsKICAgICAgICB2YXIgaTsKICAgICAgICAvLyBVZ2hoaCwgaGF2ZSB0byBtYWtlIGEgY29weSBvZiBvcHRpb25zIGIvYyBpdCBtYXkgYmUgbW9kaWZpZWQgbGF0ZXIuCiAgICAgICAgdmFyIG9wdHMgPSAkLmV4dGVuZCh7fSwgb3B0aW9ucyk7CiAgICAgICAgdmFyIHNoYWRvdyA9IChvcHRzLnNoYWRvdyAhPSB1bmRlZmluZWQpID8gb3B0cy5zaGFkb3cgOiB0aGlzLnNoYWRvdzsKICAgICAgICB2YXIgc2hvd0xpbmUgPSAob3B0cy5zaG93TGluZSAhPSB1bmRlZmluZWQpID8gb3B0cy5zaG93TGluZSA6IHRoaXMuc2hvd0xpbmU7CiAgICAgICAgdmFyIGZpbGwgPSAob3B0cy5maWxsICE9IHVuZGVmaW5lZCkgPyBvcHRzLmZpbGwgOiB0aGlzLmZpbGw7CiAgICAgICAgdmFyIHhwID0gdGhpcy5feGF4aXMuc2VyaWVzX3UycDsKICAgICAgICB2YXIgeXAgPSB0aGlzLl95YXhpcy5zZXJpZXNfdTJwOwogICAgICAgIHZhciBwb2ludHgsIHBvaW50eTsKICAgICAgICAvLyBjbGVhciBvdXQgZGF0YSBjb2xvcnMuCiAgICAgICAgdGhpcy5fZGF0YUNvbG9ycyA9IFtdOwogICAgICAgIHRoaXMuX2JhclBvaW50cyA9IFtdOwogICAgICAgIAogICAgICAgIGlmICh0aGlzLnJlbmRlcmVyLm9wdGlvbnMuYmFyV2lkdGggPT0gbnVsbCkgewogICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldEJhcldpZHRoLmNhbGwodGhpcyk7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC8vIHZhciB0ZW1wID0gdGhpcy5fcGxvdFNlcmllc0luZm8gPSB0aGlzLnJlbmRlcmVyLmNhbGNTZXJpZXNOdW1iZXJzLmNhbGwodGhpcyk7CiAgICAgICAgLy8gdmFyIG52YWxzID0gdGVtcFswXTsKICAgICAgICAvLyB2YXIgbnNlcmllcyA9IHRlbXBbMV07CiAgICAgICAgLy8gdmFyIHBvcyA9IHRlbXBbMl07CiAgICAgICAgdmFyIHBvaW50cyA9IFtdLAogICAgICAgICAgICB3LAogICAgICAgICAgICBoOwogICAgICAgIAogICAgICAgIC8vIHRoaXMuX2Jhck51ZGdlID0gMDsKCiAgICAgICAgaWYgKHNob3dMaW5lKSB7CiAgICAgICAgICAgIHZhciBuZWdhdGl2ZUNvbG9ycyA9IG5ldyAkLmpxcGxvdC5Db2xvckdlbmVyYXRvcih0aGlzLm5lZ2F0aXZlU2VyaWVzQ29sb3JzKTsKICAgICAgICAgICAgdmFyIHBvc2l0aXZlQ29sb3JzID0gbmV3ICQuanFwbG90LkNvbG9yR2VuZXJhdG9yKHRoaXMuc2VyaWVzQ29sb3JzKTsKICAgICAgICAgICAgdmFyIG5lZ2F0aXZlQ29sb3IgPSBuZWdhdGl2ZUNvbG9ycy5nZXQodGhpcy5pbmRleCk7CiAgICAgICAgICAgIGlmICghIHRoaXMudXNlTmVnYXRpdmVDb2xvcnMpIHsKICAgICAgICAgICAgICAgIG5lZ2F0aXZlQ29sb3IgPSBvcHRzLmZpbGxTdHlsZTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgcG9zaXRpdmVDb2xvciA9IG9wdHMuZmlsbFN0eWxlOwogICAgICAgICAgICB2YXIgYmFzZTsKICAgICAgICAgICAgdmFyIHhzdGFydCA9IHRoaXMuX3hheGlzLnNlcmllc191MnAodGhpcy5feG51ZGdlKTsKICAgICAgICAgICAgdmFyIHlzdGFydCA9IHRoaXMuX3lheGlzLnNlcmllc191MnAodGhpcy5feWF4aXMubWluKTsKICAgICAgICAgICAgdmFyIHllbmQgPSB0aGlzLl95YXhpcy5zZXJpZXNfdTJwKHRoaXMuX3lheGlzLm1heCk7CiAgICAgICAgICAgIHZhciBidyA9IHRoaXMuYmFyV2lkdGg7CiAgICAgICAgICAgIHZhciBidzIgPSBidy8yLjA7CiAgICAgICAgICAgIHZhciBwb2ludHMgPSBbXTsKICAgICAgICAgICAgdmFyIHlhZGogPSB0aGlzLm9mZnNldEJhcnMgPyBidzIgOiAwOwogICAgICAgICAgICAKICAgICAgICAgICAgZm9yICh2YXIgaT0wLCBsPWdyaWREYXRhLmxlbmd0aDsgaTxsOyBpKyspIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLmRhdGFbaV1bMF0gPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYmFzZSA9IGdyaWREYXRhW2ldWzFdOwogICAgICAgICAgICAgICAgLy8gbm90IHN0YWNrZWQgYW5kIGZpcnN0IHNlcmllcyBpbiBzdGFjawoKICAgICAgICAgICAgICAgIGlmICh0aGlzLl9wbG90RGF0YVtpXVsxXSA8IDApIHsKICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy52YXJ5QmFyQ29sb3IgJiYgIXRoaXMuX3N0YWNrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnVzZU5lZ2F0aXZlQ29sb3JzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRzLmZpbGxTdHlsZSA9IG5lZ2F0aXZlQ29sb3JzLm5leHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdHMuZmlsbFN0eWxlID0gcG9zaXRpdmVDb2xvcnMubmV4dCgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudmFyeUJhckNvbG9yICYmICF0aGlzLl9zdGFjaykgewogICAgICAgICAgICAgICAgICAgICAgICBvcHRzLmZpbGxTdHlsZSA9IHBvc2l0aXZlQ29sb3JzLm5leHQoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG9wdHMuZmlsbFN0eWxlID0gcG9zaXRpdmVDb2xvcjsKICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgaWYgKHRoaXMuZmlsbCkgewoKICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fcGxvdERhdGFbaV1bMV0gPj0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyB4c3RhcnQgPSB0aGlzLl94YXhpcy5zZXJpZXNfdTJwKHRoaXMuX3hudWRnZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHcgPSBncmlkRGF0YVtpXVswXSAtIHhzdGFydDsKICAgICAgICAgICAgICAgICAgICAgICAgaCA9IHRoaXMuYmFyV2lkdGg7CiAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50cyA9IFt4c3RhcnQsIGJhc2UgLSBidzIgLSB5YWRqLCB3LCBoXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHhzdGFydCA9IHRoaXMuX3hheGlzLnNlcmllc191MnAoMCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHcgPSB4c3RhcnQgLSBncmlkRGF0YVtpXVswXTsKICAgICAgICAgICAgICAgICAgICAgICAgaCA9IHRoaXMuYmFyV2lkdGg7CiAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50cyA9IFtncmlkRGF0YVtpXVswXSwgYmFzZSAtIGJ3MiAtIHlhZGosIHcsIGhdOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgdGhpcy5fYmFyUG9pbnRzLnB1c2goW1twb2ludHNbMF0sIHBvaW50c1sxXSArIGhdLCBbcG9pbnRzWzBdLCBwb2ludHNbMV1dLCBbcG9pbnRzWzBdICsgdywgcG9pbnRzWzFdXSwgW3BvaW50c1swXSArIHcsIHBvaW50c1sxXSArIGhdXSk7CgogICAgICAgICAgICAgICAgICAgIGlmIChzaGFkb3cpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zaGFkb3dSZW5kZXJlci5kcmF3KGN0eCwgcG9pbnRzKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdmFyIGNsciA9IG9wdHMuZmlsbFN0eWxlIHx8IHRoaXMuY29sb3I7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGF0YUNvbG9ycy5wdXNoKGNscik7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zaGFwZVJlbmRlcmVyLmRyYXcoY3R4LCBwb2ludHMsIG9wdHMpOyAKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICBwb2ludHMgPVtbeHN0YXJ0LCB5c3RhcnRdLCBbZ3JpZERhdGFbaV1bMF0sIHlzdGFydF0sIFtncmlkRGF0YVtpXVswXSwgZ3JpZERhdGFbaV1bMV0gLSBidzIgLSB5YWRqXV07CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpIDwgbC0xKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50cyA9IHBvaW50cy5jb25jYXQoW1tncmlkRGF0YVtpLTFdWzBdLCBncmlkRGF0YVtpLTFdWzFdIC0gYncyIC0geWFkal0sIFtncmlkRGF0YVtpXVswXSwgZ3JpZERhdGFbaV1bMV0gKyBidzIgLSB5YWRqXSwgW2dyaWREYXRhW2ldWzBdLCBncmlkRGF0YVtpXVsxXSAtIGJ3MiAtIHlhZGpdXSk7CiAgICAgICAgICAgICAgICAgICAgfSAKCiAgICAgICAgICAgICAgICAgICAgLy8gZmluYWxseSwgZHJhdyB0aGUgbGluZQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBwb2ludHMgPSBwb2ludHMuY29uY2F0KFtbZ3JpZERhdGFbaS0xXVswXSwgZ3JpZERhdGFbaS0xXVsxXSAtIGJ3MiAtIHlhZGpdLCBbZ3JpZERhdGFbaV1bMF0sIGdyaWREYXRhW2ldWzFdICsgYncyIC0geWFkal0sIFtncmlkRGF0YVtpXVswXSwgeWVuZF0sIFt4c3RhcnQsIHllbmRdXSk7CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaGFkb3cpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2hhZG93UmVuZGVyZXIuZHJhdyhjdHgsIHBvaW50cyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNsciA9IG9wdHMuZmlsbFN0eWxlIHx8IHRoaXMuY29sb3I7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2RhdGFDb2xvcnMucHVzaChjbHIpOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNoYXBlUmVuZGVyZXIuZHJhdyhjdHgsIHBvaW50cywgb3B0cyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9ICAKICAgICAgICB9ICAgICAgICAKICAgICAgICAKICAgICAgICBpZiAodGhpcy5oaWdobGlnaHRDb2xvcnMubGVuZ3RoID09IDApIHsKICAgICAgICAgICAgdGhpcy5oaWdobGlnaHRDb2xvcnMgPSAkLmpxcGxvdC5jb21wdXRlSGlnaGxpZ2h0Q29sb3JzKHRoaXMuX2RhdGFDb2xvcnMpOwogICAgICAgIH0KICAgICAgICAKICAgICAgICBlbHNlIGlmICh0eXBlb2YodGhpcy5oaWdobGlnaHRDb2xvcnMpID09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgIHRoaXMuaGlnaGxpZ2h0Q29sb3JzID0gW107CiAgICAgICAgICAgIGZvciAodmFyIGk9MDsgaTx0aGlzLl9kYXRhQ29sb3JzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICB0aGlzLmhpZ2hsaWdodENvbG9ycy5wdXNoKHRoaXMuaGlnaGxpZ2h0Q29sb3JzKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAKICAgIH07CgogICAgICAgIAogICAgLy8gc2V0dXAgZGVmYXVsdCByZW5kZXJlcnMgZm9yIGF4ZXMgYW5kIGxlZ2VuZCBzbyB1c2VyIGRvZXNuJ3QgaGF2ZSB0bwogICAgLy8gY2FsbGVkIHdpdGggc2NvcGUgb2YgcGxvdAogICAgZnVuY3Rpb24gcHJlSW5pdCh0YXJnZXQsIGRhdGEsIG9wdGlvbnMpIHsKICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKICAgICAgICBvcHRpb25zLmF4ZXNEZWZhdWx0cyA9IG9wdGlvbnMuYXhlc0RlZmF1bHRzIHx8IHt9OwogICAgICAgIG9wdGlvbnMuZ3JpZCA9IG9wdGlvbnMuZ3JpZCB8fCB7fTsKICAgICAgICBvcHRpb25zLmxlZ2VuZCA9IG9wdGlvbnMubGVnZW5kIHx8IHt9OwogICAgICAgIG9wdGlvbnMuc2VyaWVzRGVmYXVsdHMgPSBvcHRpb25zLnNlcmllc0RlZmF1bHRzIHx8IHt9OwogICAgICAgIC8vIG9ubHkgc2V0IHRoZXNlIGlmIHRoZXJlIGlzIGEgcGllIHNlcmllcwogICAgICAgIHZhciBzZXRvcHRzID0gZmFsc2U7CiAgICAgICAgaWYgKG9wdGlvbnMuc2VyaWVzRGVmYXVsdHMucmVuZGVyZXIgPT09ICQuanFwbG90LlB5cmFtaWRSZW5kZXJlcikgewogICAgICAgICAgICBzZXRvcHRzID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAob3B0aW9ucy5zZXJpZXMpIHsKICAgICAgICAgICAgZm9yICh2YXIgaT0wOyBpIDwgb3B0aW9ucy5zZXJpZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnNlcmllc1tpXS5yZW5kZXJlciA9PT0gJC5qcXBsb3QuUHlyYW1pZFJlbmRlcmVyKSB7CiAgICAgICAgICAgICAgICAgICAgc2V0b3B0cyA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYgKHNldG9wdHMpIHsKICAgICAgICAgICAgb3B0aW9ucy5heGVzRGVmYXVsdHMucmVuZGVyZXIgPSAkLmpxcGxvdC5QeXJhbWlkQXhpc1JlbmRlcmVyOwogICAgICAgICAgICBvcHRpb25zLmdyaWQucmVuZGVyZXIgPSAkLmpxcGxvdC5QeXJhbWlkR3JpZFJlbmRlcmVyOwogICAgICAgICAgICBvcHRpb25zLnNlcmllc0RlZmF1bHRzLnBvaW50TGFiZWxzID0ge3Nob3c6IGZhbHNlfTsKICAgICAgICB9CiAgICB9CiAgICAKICAgIC8vIGNhbGxlZCB3aXRoaW4gY29udGV4dCBvZiBwbG90CiAgICAvLyBjcmVhdGUgYSBjYW52YXMgd2hpY2ggd2UgY2FuIGRyYXcgb24uCiAgICAvLyBpbnNlcnQgaXQgYmVmb3JlIHRoZSBldmVudENhbnZhcywgc28gZXZlbnRDYW52YXMgd2lsbCBzdGlsbCBjYXB0dXJlIGV2ZW50cy4KICAgIGZ1bmN0aW9uIHBvc3RQbG90RHJhdygpIHsKICAgICAgICAvLyBNZW1vcnkgTGVha3MgcGF0Y2ggICAgCiAgICAgICAgaWYgKHRoaXMucGx1Z2lucy5weXJhbWlkUmVuZGVyZXIgJiYgdGhpcy5wbHVnaW5zLnB5cmFtaWRSZW5kZXJlci5oaWdobGlnaHRDYW52YXMpIHsKCiAgICAgICAgICAgIHRoaXMucGx1Z2lucy5weXJhbWlkUmVuZGVyZXIuaGlnaGxpZ2h0Q2FudmFzLnJlc2V0Q2FudmFzKCk7CiAgICAgICAgICAgIHRoaXMucGx1Z2lucy5weXJhbWlkUmVuZGVyZXIuaGlnaGxpZ2h0Q2FudmFzID0gbnVsbDsKICAgICAgICB9CiAgICAgICAgIAogICAgICAgIHRoaXMucGx1Z2lucy5weXJhbWlkUmVuZGVyZXIgPSB7aGlnaGxpZ2h0ZWRTZXJpZXNJbmRleDpudWxsfTsKICAgICAgICB0aGlzLnBsdWdpbnMucHlyYW1pZFJlbmRlcmVyLmhpZ2hsaWdodENhbnZhcyA9IG5ldyAkLmpxcGxvdC5HZW5lcmljQ2FudmFzKCk7CiAgICAgICAgCiAgICAgICAgdGhpcy5ldmVudENhbnZhcy5fZWxlbS5iZWZvcmUodGhpcy5wbHVnaW5zLnB5cmFtaWRSZW5kZXJlci5oaWdobGlnaHRDYW52YXMuY3JlYXRlRWxlbWVudCh0aGlzLl9ncmlkUGFkZGluZywgJ2pxcGxvdC1weXJhbWlkUmVuZGVyZXItaGlnaGxpZ2h0LWNhbnZhcycsIHRoaXMuX3Bsb3REaW1lbnNpb25zLCB0aGlzKSk7CiAgICAgICAgdGhpcy5wbHVnaW5zLnB5cmFtaWRSZW5kZXJlci5oaWdobGlnaHRDYW52YXMuc2V0Q29udGV4dCgpOwogICAgICAgIHRoaXMuZXZlbnRDYW52YXMuX2VsZW0uYmluZCgnbW91c2VsZWF2ZScsIHtwbG90OnRoaXN9LCBmdW5jdGlvbiAoZXYpIHsgdW5oaWdobGlnaHQoZXYuZGF0YS5wbG90KTsgfSk7CiAgICB9ICAKICAgIAogICAgZnVuY3Rpb24gaGlnaGxpZ2h0IChwbG90LCBzaWR4LCBwaWR4LCBwb2ludHMpIHsKICAgICAgICB2YXIgcyA9IHBsb3Quc2VyaWVzW3NpZHhdOwogICAgICAgIHZhciBjYW52YXMgPSBwbG90LnBsdWdpbnMucHlyYW1pZFJlbmRlcmVyLmhpZ2hsaWdodENhbnZhczsKICAgICAgICBjYW52YXMuX2N0eC5jbGVhclJlY3QoMCwwLGNhbnZhcy5fY3R4LmNhbnZhcy53aWR0aCwgY2FudmFzLl9jdHguY2FudmFzLmhlaWdodCk7CiAgICAgICAgcy5faGlnaGxpZ2h0ZWRQb2ludCA9IHBpZHg7CiAgICAgICAgcGxvdC5wbHVnaW5zLnB5cmFtaWRSZW5kZXJlci5oaWdobGlnaHRlZFNlcmllc0luZGV4ID0gc2lkeDsKICAgICAgICB2YXIgb3B0cyA9IHtmaWxsU3R5bGU6IHMuaGlnaGxpZ2h0Q29sb3JzW3BpZHhdLCBmaWxsUmVjdDogZmFsc2V9OwogICAgICAgIHMucmVuZGVyZXIuc2hhcGVSZW5kZXJlci5kcmF3KGNhbnZhcy5fY3R4LCBwb2ludHMsIG9wdHMpOwogICAgICAgIGNhbnZhcyA9IG51bGw7CiAgICB9CiAgICAKICAgIGZ1bmN0aW9uIHVuaGlnaGxpZ2h0IChwbG90KSB7CiAgICAgICAgdmFyIGNhbnZhcyA9IHBsb3QucGx1Z2lucy5weXJhbWlkUmVuZGVyZXIuaGlnaGxpZ2h0Q2FudmFzOwogICAgICAgIGNhbnZhcy5fY3R4LmNsZWFyUmVjdCgwLDAsIGNhbnZhcy5fY3R4LmNhbnZhcy53aWR0aCwgY2FudmFzLl9jdHguY2FudmFzLmhlaWdodCk7CiAgICAgICAgZm9yICh2YXIgaT0wOyBpPHBsb3Quc2VyaWVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIHBsb3Quc2VyaWVzW2ldLl9oaWdobGlnaHRlZFBvaW50ID0gbnVsbDsKICAgICAgICB9CiAgICAgICAgcGxvdC5wbHVnaW5zLnB5cmFtaWRSZW5kZXJlci5oaWdobGlnaHRlZFNlcmllc0luZGV4ID0gbnVsbDsKICAgICAgICBwbG90LnRhcmdldC50cmlnZ2VyKCdqcXBsb3REYXRhVW5oaWdobGlnaHQnKTsKICAgICAgICBjYW52YXMgPSAgbnVsbDsKICAgIH0KICAgIAogICAgCiAgICBmdW5jdGlvbiBoYW5kbGVNb3ZlKGV2LCBncmlkcG9zLCBkYXRhcG9zLCBuZWlnaGJvciwgcGxvdCkgewogICAgICAgIGlmIChuZWlnaGJvcikgewogICAgICAgICAgICB2YXIgaW5zID0gW25laWdoYm9yLnNlcmllc0luZGV4LCBuZWlnaGJvci5wb2ludEluZGV4LCBuZWlnaGJvci5kYXRhXTsKICAgICAgICAgICAgdmFyIGV2dDEgPSBqUXVlcnkuRXZlbnQoJ2pxcGxvdERhdGFNb3VzZU92ZXInKTsKICAgICAgICAgICAgZXZ0MS5wYWdlWCA9IGV2LnBhZ2VYOwogICAgICAgICAgICBldnQxLnBhZ2VZID0gZXYucGFnZVk7CiAgICAgICAgICAgIHBsb3QudGFyZ2V0LnRyaWdnZXIoZXZ0MSwgaW5zKTsKICAgICAgICAgICAgaWYgKHBsb3Quc2VyaWVzW2luc1swXV0uaGlnaGxpZ2h0TW91c2VPdmVyICYmICEoaW5zWzBdID09IHBsb3QucGx1Z2lucy5weXJhbWlkUmVuZGVyZXIuaGlnaGxpZ2h0ZWRTZXJpZXNJbmRleCAmJiBpbnNbMV0gPT0gcGxvdC5zZXJpZXNbaW5zWzBdXS5faGlnaGxpZ2h0ZWRQb2ludCkpIHsKICAgICAgICAgICAgICAgIHZhciBldnQgPSBqUXVlcnkuRXZlbnQoJ2pxcGxvdERhdGFIaWdobGlnaHQnKTsKICAgICAgICAgICAgICAgIGV2dC5wYWdlWCA9IGV2LnBhZ2VYOwogICAgICAgICAgICAgICAgZXZ0LnBhZ2VZID0gZXYucGFnZVk7CiAgICAgICAgICAgICAgICBwbG90LnRhcmdldC50cmlnZ2VyKGV2dCwgaW5zKTsKICAgICAgICAgICAgICAgIGhpZ2hsaWdodCAocGxvdCwgbmVpZ2hib3Iuc2VyaWVzSW5kZXgsIG5laWdoYm9yLnBvaW50SW5kZXgsIG5laWdoYm9yLnBvaW50cyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAobmVpZ2hib3IgPT0gbnVsbCkgewogICAgICAgICAgICB1bmhpZ2hsaWdodCAocGxvdCk7CiAgICAgICAgfQogICAgfQoKICAgIC8vIEhhdmUgdG8gYWRkIGhvb2sgaGVyZSwgYmVjdWFzZSBpdCBuZWVkcyBjYWxsZWQgYmVmb3JlIHNlcmllcyBpcyBpbml0ZWQuCiAgICAkLmpxcGxvdC5wcmVJbml0SG9va3MucHVzaChwcmVJbml0KTsKICAgIAoKfSkoalF1ZXJ5KTs=]]></data>
	</file>
	<file>
	  <filename>/src/plugins/jqplot.pyramidRenderer.min.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqCiAqIGpxUGxvdAogKiBQdXJlIEphdmFTY3JpcHQgcGxvdHRpbmcgcGx1Z2luIHVzaW5nIGpRdWVyeQogKgogKiBWZXJzaW9uOiAxLjAuMGIyX3IxMDEyCiAqCiAqIENvcHlyaWdodCAoYykgMjAwOS0yMDExIENocmlzIExlb25lbGxvCiAqIGpxUGxvdCBpcyBjdXJyZW50bHkgYXZhaWxhYmxlIGZvciB1c2UgaW4gYWxsIHBlcnNvbmFsIG9yIGNvbW1lcmNpYWwgcHJvamVjdHMgCiAqIHVuZGVyIGJvdGggdGhlIE1JVCAoaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHApIGFuZCBHUEwgCiAqIHZlcnNpb24gMi4wIChodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC5odG1sKSBsaWNlbnNlcy4gVGhpcyBtZWFucyB0aGF0IHlvdSBjYW4gCiAqIGNob29zZSB0aGUgbGljZW5zZSB0aGF0IGJlc3Qgc3VpdHMgeW91ciBwcm9qZWN0IGFuZCB1c2UgaXQgYWNjb3JkaW5nbHkuIAogKgogKiBBbHRob3VnaCBub3QgcmVxdWlyZWQsIHRoZSBhdXRob3Igd291bGQgYXBwcmVjaWF0ZSBhbiBlbWFpbCBsZXR0aW5nIGhpbSAKICoga25vdyBvZiBhbnkgc3Vic3RhbnRpYWwgdXNlIG9mIGpxUGxvdC4gIFlvdSBjYW4gcmVhY2ggdGhlIGF1dGhvciBhdDogCiAqIGNocmlzIGF0IGpxcGxvdCBkb3QgY29tIG9yIHNlZSBodHRwOi8vd3d3LmpxcGxvdC5jb20vaW5mby5waHAgLgogKgogKiBJZiB5b3UgYXJlIGZlZWxpbmcga2luZCBhbmQgZ2VuZXJvdXMsIGNvbnNpZGVyIHN1cHBvcnRpbmcgdGhlIHByb2plY3QgYnkKICogbWFraW5nIGEgZG9uYXRpb24gYXQ6IGh0dHA6Ly93d3cuanFwbG90LmNvbS9kb25hdGUucGhwIC4KICoKICogc3ByaW50ZiBmdW5jdGlvbnMgY29udGFpbmVkIGluIGpxcGxvdC5zcHJpbnRmLmpzIGJ5IEFzaCBTZWFybGU6CiAqCiAqICAgICB2ZXJzaW9uIDIwMDcuMDQuMjcKICogICAgIGF1dGhvciBBc2ggU2VhcmxlCiAqICAgICBodHRwOi8vaGV4bWVuLmNvbS9ibG9nLzIwMDcvMDMvcHJpbnRmLXNwcmludGYvCiAqICAgICBodHRwOi8vaGV4bWVuLmNvbS9qcy9zcHJpbnRmLmpzCiAqICAgICBUaGUgYXV0aG9yIChBc2ggU2VhcmxlKSBoYXMgcGxhY2VkIHRoaXMgY29kZSBpbiB0aGUgcHVibGljIGRvbWFpbjoKICogICAgICJUaGlzIGNvZGUgaXMgdW5yZXN0cmljdGVkOiB5b3UgYXJlIGZyZWUgdG8gdXNlIGl0IGhvd2V2ZXIgeW91IGxpa2UuIgogKgogKiBpbmNsdWRlZCBqc0RhdGUgbGlicmFyeSBieSBDaHJpcyBMZW9uZWxsbzoKICoKICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEgQ2hyaXMgTGVvbmVsbG8KICoKICoganNEYXRlIGlzIGN1cnJlbnRseSBhdmFpbGFibGUgZm9yIHVzZSBpbiBhbGwgcGVyc29uYWwgb3IgY29tbWVyY2lhbCBwcm9qZWN0cyAKICogdW5kZXIgYm90aCB0aGUgTUlUIGFuZCBHUEwgdmVyc2lvbiAyLjAgbGljZW5zZXMuIFRoaXMgbWVhbnMgdGhhdCB5b3UgY2FuIAogKiBjaG9vc2UgdGhlIGxpY2Vuc2UgdGhhdCBiZXN0IHN1aXRzIHlvdXIgcHJvamVjdCBhbmQgdXNlIGl0IGFjY29yZGluZ2x5LgogKgogKiBqc0RhdGUgYm9ycm93cyBtYW55IGNvbmNlcHRzIGFuZCBpZGVhcyBmcm9tIHRoZSBEYXRlIEluc3RhbmNlIAogKiBNZXRob2RzIGJ5IEtlbiBTbnlkZXIgYWxvbmcgd2l0aCBzb21lIHBhcnRzIG9mIEtlbidzIGFjdHVhbCBjb2RlLgogKiAKICogS2VuJ3Mgb3JpZ2lhbmwgRGF0ZSBJbnN0YW5jZSBNZXRob2RzIGFuZCBjb3B5cmlnaHQgbm90aWNlOgogKiAKICogS2VuIFNueWRlciAoa2VuIGQgc255ZGVyIGF0IGdtYWlsIGRvdCBjb20pCiAqIDIwMDgtMDktMTAKICogdmVyc2lvbiAyLjAuMiAoaHR0cDovL2tlbmRzbnlkZXIuY29tL3NhbmRib3gvZGF0ZS8pICAgICAKICogQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbiBMaWNlbnNlIDMuMCAoaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnkvMy4wLykKICoKICoganFwbG90VG9JbWFnZSBmdW5jdGlvbiBiYXNlZCBvbiBMYXJyeSBTaWRlbidzIGV4cG9ydC1qcXBsb3QtdG8tcG5nLmpzLgogKiBMYXJyeSBoYXMgZ2VuZXJvdXNseSBnaXZlbiBwZXJtaXNzaW9uIHRvIGFkYXB0IGhpcyBjb2RlIGZvciBpbmNsdXNpb24KICogaW50byBqcVBsb3QuCiAqCiAqIExhcnJ5J3Mgb3JpZ2luYWwgY29kZSBjYW4gYmUgZm91bmQgaGVyZToKICoKICogaHR0cHM6Ly9naXRodWIuY29tL2xzaWRlbi9leHBvcnQtanFwbG90LXRvLXBuZwogKiAKICogCiAqLwooZnVuY3Rpb24oYyl7aWYoYy5qcXBsb3QuUHlyYW1pZEF4aXNSZW5kZXJlcj09PXVuZGVmaW5lZCl7Yy5hamF4KHt1cmw6Yy5qcXBsb3QucGx1Z2luTG9jYXRpb24rImpxcGxvdC5weXJhbWlkQXhpc1JlbmRlcmVyLmpzIixkYXRhVHlwZToic2NyaXB0Iixhc3luYzpmYWxzZX0pfWlmKGMuanFwbG90LlB5cmFtaWRHcmlkUmVuZGVyZXI9PT11bmRlZmluZWQpe2MuYWpheCh7dXJsOmMuanFwbG90LnBsdWdpbkxvY2F0aW9uKyJqcXBsb3QucHlyYW1pZEdyaWRSZW5kZXJlci5qcyIsZGF0YVR5cGU6InNjcmlwdCIsYXN5bmM6ZmFsc2V9KX1jLmpxcGxvdC5QeXJhbWlkUmVuZGVyZXI9ZnVuY3Rpb24oKXtjLmpxcGxvdC5MaW5lUmVuZGVyZXIuY2FsbCh0aGlzKX07Yy5qcXBsb3QuUHlyYW1pZFJlbmRlcmVyLnByb3RvdHlwZT1uZXcgYy5qcXBsb3QuTGluZVJlbmRlcmVyKCk7Yy5qcXBsb3QuUHlyYW1pZFJlbmRlcmVyLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1jLmpxcGxvdC5QeXJhbWlkUmVuZGVyZXI7Yy5qcXBsb3QuUHlyYW1pZFJlbmRlcmVyLnByb3RvdHlwZS5pbml0PWZ1bmN0aW9uKGosbyl7aj1qfHx7fTt0aGlzLl90eXBlPSJweXJhbWlkIjt0aGlzLmJhclBhZGRpbmc9MTA7dGhpcy5iYXJXaWR0aD1udWxsO3RoaXMuZmlsbD10cnVlO3RoaXMuaGlnaGxpZ2h0TW91c2VPdmVyPXRydWU7dGhpcy5oaWdobGlnaHRNb3VzZURvd249ZmFsc2U7dGhpcy5oaWdobGlnaHRDb2xvcnM9W107dGhpcy5vZmZzZXRCYXJzPWZhbHNlO2lmKGouaGlnaGxpZ2h0TW91c2VEb3duJiZqLmhpZ2hsaWdodE1vdXNlT3Zlcj09bnVsbCl7ai5oaWdobGlnaHRNb3VzZU92ZXI9ZmFsc2V9dGhpcy5zaWRlPSJyaWdodCI7Yy5leHRlbmQodHJ1ZSx0aGlzLGopO3RoaXMucmVuZGVyZXIub3B0aW9ucz1qO3RoaXMuX2hpZ2hsaWdodGVkUG9pbnQ9bnVsbDt0aGlzLl9kYXRhQ29sb3JzPVtdO3RoaXMuX2JhclBvaW50cz1bXTt0aGlzLmZpbGxBeGlzPSJ5Ijt0aGlzLl9wcmltYXJ5QXhpcz0iX3lheGlzIjt0aGlzLl94bnVkZ2U9MDt2YXIgbj17bGluZUpvaW46Im1pdGVyIixsaW5lQ2FwOiJidXR0IixmaWxsOnRoaXMuZmlsbCxmaWxsUmVjdDp0aGlzLmZpbGwsaXNhcmM6ZmFsc2Usc3Ryb2tlU3R5bGU6dGhpcy5jb2xvcixmaWxsU3R5bGU6dGhpcy5jb2xvcixjbG9zZVBhdGg6dGhpcy5maWxsLGxpbmVXaWR0aDp0aGlzLmxpbmVXaWR0aH07dGhpcy5yZW5kZXJlci5zaGFwZVJlbmRlcmVyLmluaXQobik7dmFyIG09ai5zaGFkb3dPZmZzZXQ7aWYobT09bnVsbCl7aWYodGhpcy5saW5lV2lkdGg+Mi41KXttPTEuMjUqKDErKE1hdGguYXRhbigodGhpcy5saW5lV2lkdGgvMi41KSkvMC43ODUzOTgxNjMtMSkqMC42KX1lbHNle209MS4yNSpNYXRoLmF0YW4oKHRoaXMubGluZVdpZHRoLzIuNSkpLzAuNzg1Mzk4MTYzfX12YXIgaD17bGluZUpvaW46Im1pdGVyIixsaW5lQ2FwOiJidXR0IixmaWxsOnRoaXMuZmlsbCxmaWxsUmVjdDp0aGlzLmZpbGwsaXNhcmM6ZmFsc2UsYW5nbGU6dGhpcy5zaGFkb3dBbmdsZSxvZmZzZXQ6bSxhbHBoYTp0aGlzLnNoYWRvd0FscGhhLGRlcHRoOnRoaXMuc2hhZG93RGVwdGgsY2xvc2VQYXRoOnRoaXMuZmlsbCxsaW5lV2lkdGg6dGhpcy5saW5lV2lkdGh9O3RoaXMucmVuZGVyZXIuc2hhZG93UmVuZGVyZXIuaW5pdChoKTtvLnBvc3REcmF3SG9va3MuYWRkT25jZShmKTtvLmV2ZW50TGlzdGVuZXJIb29rcy5hZGRPbmNlKCJqcXBsb3RNb3VzZU1vdmUiLGUpO2lmKHRoaXMuc2lkZT09PSJsZWZ0Iil7Zm9yKHZhciBrPTAsZz10aGlzLmRhdGEubGVuZ3RoO2s8ZztrKyspe3RoaXMuZGF0YVtrXVsxXT0tTWF0aC5hYnModGhpcy5kYXRhW2tdWzFdKX19fTtjLmpxcGxvdC5QeXJhbWlkUmVuZGVyZXIucHJvdG90eXBlLnNldEdyaWREYXRhPWZ1bmN0aW9uKHApe3ZhciBqPXRoaXMuX3hheGlzLnNlcmllc191MnA7dmFyIG89dGhpcy5feWF4aXMuc2VyaWVzX3UycDt2YXIgaz10aGlzLl9wbG90RGF0YTt2YXIgbj10aGlzLl9wcmV2UGxvdERhdGE7dGhpcy5ncmlkRGF0YT1bXTt0aGlzLl9wcmV2R3JpZERhdGE9W107dmFyIGc9ay5sZW5ndGg7dmFyIG09ZmFsc2U7dmFyIGg7Zm9yKGg9MDtoPGc7aCsrKXtpZihrW2hdWzFdPDApe3RoaXMuc2lkZT0ibGVmdCJ9fWlmKHRoaXMuX3lheGlzLm5hbWU9PT0ieU1pZEF4aXMiJiZ0aGlzLnNpZGU9PT0icmlnaHQiKXt0aGlzLl94bnVkZ2U9dGhpcy5feGF4aXMubWF4LzIwMDA7bT10cnVlfWZvcihoPTA7aDxnO2grKyl7aWYoa1toXVswXSE9bnVsbCYma1toXVsxXSE9bnVsbCl7dGhpcy5ncmlkRGF0YS5wdXNoKFtqKGtbaF1bMV0pLG8oa1toXVswXSldKX1lbHNle2lmKGtbaF1bMF09PW51bGwpe3RoaXMuZ3JpZERhdGEucHVzaChbaihrW2hdWzFdKSxudWxsXSl9ZWxzZXtpZihrW2hdWzFdPT1udWxsKXt0aGlzLmdyaWREYXRhLnB1c2gobnVsbCxbbyhrW2hdWzBdKV0pfX19aWYoa1toXVsxXT09PTAmJm0pe3RoaXMuZ3JpZERhdGFbaF1bMF09aih0aGlzLl94bnVkZ2UpfX19O2MuanFwbG90LlB5cmFtaWRSZW5kZXJlci5wcm90b3R5cGUubWFrZUdyaWREYXRhPWZ1bmN0aW9uKG0scCl7dmFyIGs9dGhpcy5feGF4aXMuc2VyaWVzX3UycDt2YXIgbz10aGlzLl95YXhpcy5zZXJpZXNfdTJwO3ZhciBqPVtdO3ZhciBnPW0ubGVuZ3RoO3ZhciBuPWZhbHNlO3ZhciBoO2ZvcihoPTA7aDxnO2grKyl7aWYobVtoXVsxXTwwKXt0aGlzLnNpZGU9ImxlZnQifX1pZih0aGlzLl95YXhpcy5uYW1lPT09InlNaWRBeGlzIiYmdGhpcy5zaWRlPT09InJpZ2h0Iil7dGhpcy5feG51ZGdlPXRoaXMuX3hheGlzLm1heC8yMDAwO249dHJ1ZX1mb3IoaD0wO2g8ZztoKyspe2lmKG1baF1bMF0hPW51bGwmJm1baF1bMV0hPW51bGwpe2oucHVzaChbayhtW2hdWzFdKSxvKG1baF1bMF0pXSl9ZWxzZXtpZihtW2hdWzBdPT1udWxsKXtqLnB1c2goW2sobVtoXVsxXSksbnVsbF0pfWVsc2V7aWYobVtoXVsxXT09bnVsbCl7ai5wdXNoKFtudWxsLG8obVtoXVswXSldKX19fWlmKG1baF1bMV09PT0wJiZuKXtqW2hdWzBdPWsodGhpcy5feG51ZGdlKX19cmV0dXJuIGp9O2MuanFwbG90LlB5cmFtaWRSZW5kZXJlci5wcm90b3R5cGUuc2V0QmFyV2lkdGg9ZnVuY3Rpb24oKXt2YXIgazt2YXIgZz0wO3ZhciBoPTA7dmFyIG09dGhpc1t0aGlzLl9wcmltYXJ5QXhpc107dmFyIHEsbCxvO2c9bS5tYXgtbS5taW47dmFyIG49bS5udW1iZXJUaWNrczt2YXIgaj0obi0xKS8yO3ZhciBwPSh0aGlzLmJhclBhZGRpbmc9PT0wKT8xOjA7aWYobS5uYW1lPT0ieGF4aXMifHxtLm5hbWU9PSJ4MmF4aXMiKXt0aGlzLmJhcldpZHRoPShtLl9vZmZzZXRzLm1heC1tLl9vZmZzZXRzLm1pbikvZy10aGlzLmJhclBhZGRpbmcrcH1lbHNle2lmKHRoaXMuZmlsbCl7dGhpcy5iYXJXaWR0aD0obS5fb2Zmc2V0cy5taW4tbS5fb2Zmc2V0cy5tYXgpL2ctdGhpcy5iYXJQYWRkaW5nK3B9ZWxzZXt0aGlzLmJhcldpZHRoPShtLl9vZmZzZXRzLm1pbi1tLl9vZmZzZXRzLm1heCkvZ319fTtjLmpxcGxvdC5QeXJhbWlkUmVuZGVyZXIucHJvdG90eXBlLmRyYXc9ZnVuY3Rpb24oQixJLGspe3ZhciBFO3ZhciB1PWMuZXh0ZW5kKHt9LGspO3ZhciBwPSh1LnNoYWRvdyE9dW5kZWZpbmVkKT91LnNoYWRvdzp0aGlzLnNoYWRvdzt2YXIgSz0odS5zaG93TGluZSE9dW5kZWZpbmVkKT91LnNob3dMaW5lOnRoaXMuc2hvd0xpbmU7dmFyIEM9KHUuZmlsbCE9dW5kZWZpbmVkKT91LmZpbGw6dGhpcy5maWxsO3ZhciB0PXRoaXMuX3hheGlzLnNlcmllc191MnA7dmFyIEc9dGhpcy5feWF4aXMuc2VyaWVzX3UycDt2YXIgeix4O3RoaXMuX2RhdGFDb2xvcnM9W107dGhpcy5fYmFyUG9pbnRzPVtdO2lmKHRoaXMucmVuZGVyZXIub3B0aW9ucy5iYXJXaWR0aD09bnVsbCl7dGhpcy5yZW5kZXJlci5zZXRCYXJXaWR0aC5jYWxsKHRoaXMpfXZhciBEPVtdLHMsRjtpZihLKXt2YXIgcT1uZXcgYy5qcXBsb3QuQ29sb3JHZW5lcmF0b3IodGhpcy5uZWdhdGl2ZVNlcmllc0NvbG9ycyk7dmFyIHY9bmV3IGMuanFwbG90LkNvbG9yR2VuZXJhdG9yKHRoaXMuc2VyaWVzQ29sb3JzKTt2YXIgSj1xLmdldCh0aGlzLmluZGV4KTtpZighdGhpcy51c2VOZWdhdGl2ZUNvbG9ycyl7Sj11LmZpbGxTdHlsZX12YXIgbz11LmZpbGxTdHlsZTt2YXIgbjt2YXIgTD10aGlzLl94YXhpcy5zZXJpZXNfdTJwKHRoaXMuX3hudWRnZSk7dmFyIGo9dGhpcy5feWF4aXMuc2VyaWVzX3UycCh0aGlzLl95YXhpcy5taW4pO3ZhciBtPXRoaXMuX3lheGlzLnNlcmllc191MnAodGhpcy5feWF4aXMubWF4KTt2YXIgSD10aGlzLmJhcldpZHRoO3ZhciB5PUgvMjt2YXIgRD1bXTt2YXIgcj10aGlzLm9mZnNldEJhcnM/eTowO2Zvcih2YXIgRT0wLEE9SS5sZW5ndGg7RTxBO0UrKyl7aWYodGhpcy5kYXRhW0VdWzBdPT1udWxsKXtjb250aW51ZX1uPUlbRV1bMV07aWYodGhpcy5fcGxvdERhdGFbRV1bMV08MCl7aWYodGhpcy52YXJ5QmFyQ29sb3ImJiF0aGlzLl9zdGFjayl7aWYodGhpcy51c2VOZWdhdGl2ZUNvbG9ycyl7dS5maWxsU3R5bGU9cS5uZXh0KCl9ZWxzZXt1LmZpbGxTdHlsZT12Lm5leHQoKX19fWVsc2V7aWYodGhpcy52YXJ5QmFyQ29sb3ImJiF0aGlzLl9zdGFjayl7dS5maWxsU3R5bGU9di5uZXh0KCl9ZWxzZXt1LmZpbGxTdHlsZT1vfX1pZih0aGlzLmZpbGwpe2lmKHRoaXMuX3Bsb3REYXRhW0VdWzFdPj0wKXtzPUlbRV1bMF0tTDtGPXRoaXMuYmFyV2lkdGg7RD1bTCxuLXktcixzLEZdfWVsc2V7cz1MLUlbRV1bMF07Rj10aGlzLmJhcldpZHRoO0Q9W0lbRV1bMF0sbi15LXIscyxGXX10aGlzLl9iYXJQb2ludHMucHVzaChbW0RbMF0sRFsxXStGXSxbRFswXSxEWzFdXSxbRFswXStzLERbMV1dLFtEWzBdK3MsRFsxXStGXV0pO2lmKHApe3RoaXMucmVuZGVyZXIuc2hhZG93UmVuZGVyZXIuZHJhdyhCLEQpfXZhciBnPXUuZmlsbFN0eWxlfHx0aGlzLmNvbG9yO3RoaXMuX2RhdGFDb2xvcnMucHVzaChnKTt0aGlzLnJlbmRlcmVyLnNoYXBlUmVuZGVyZXIuZHJhdyhCLEQsdSl9ZWxzZXtpZihFPT09MCl7RD1bW0wsal0sW0lbRV1bMF0sal0sW0lbRV1bMF0sSVtFXVsxXS15LXJdXX1lbHNle2lmKEU8QS0xKXtEPUQuY29uY2F0KFtbSVtFLTFdWzBdLElbRS0xXVsxXS15LXJdLFtJW0VdWzBdLElbRV1bMV0reS1yXSxbSVtFXVswXSxJW0VdWzFdLXktcl1dKX1lbHNle0Q9RC5jb25jYXQoW1tJW0UtMV1bMF0sSVtFLTFdWzFdLXktcl0sW0lbRV1bMF0sSVtFXVsxXSt5LXJdLFtJW0VdWzBdLG1dLFtMLG1dXSk7aWYocCl7dGhpcy5yZW5kZXJlci5zaGFkb3dSZW5kZXJlci5kcmF3KEIsRCl9dmFyIGc9dS5maWxsU3R5bGV8fHRoaXMuY29sb3I7dGhpcy5fZGF0YUNvbG9ycy5wdXNoKGcpO3RoaXMucmVuZGVyZXIuc2hhcGVSZW5kZXJlci5kcmF3KEIsRCx1KX19fX19aWYodGhpcy5oaWdobGlnaHRDb2xvcnMubGVuZ3RoPT0wKXt0aGlzLmhpZ2hsaWdodENvbG9ycz1jLmpxcGxvdC5jb21wdXRlSGlnaGxpZ2h0Q29sb3JzKHRoaXMuX2RhdGFDb2xvcnMpfWVsc2V7aWYodHlwZW9mKHRoaXMuaGlnaGxpZ2h0Q29sb3JzKT09InN0cmluZyIpe3RoaXMuaGlnaGxpZ2h0Q29sb3JzPVtdO2Zvcih2YXIgRT0wO0U8dGhpcy5fZGF0YUNvbG9ycy5sZW5ndGg7RSsrKXt0aGlzLmhpZ2hsaWdodENvbG9ycy5wdXNoKHRoaXMuaGlnaGxpZ2h0Q29sb3JzKX19fX07ZnVuY3Rpb24gYihsLGssaCl7aD1ofHx7fTtoLmF4ZXNEZWZhdWx0cz1oLmF4ZXNEZWZhdWx0c3x8e307aC5ncmlkPWguZ3JpZHx8e307aC5sZWdlbmQ9aC5sZWdlbmR8fHt9O2guc2VyaWVzRGVmYXVsdHM9aC5zZXJpZXNEZWZhdWx0c3x8e307dmFyIGc9ZmFsc2U7aWYoaC5zZXJpZXNEZWZhdWx0cy5yZW5kZXJlcj09PWMuanFwbG90LlB5cmFtaWRSZW5kZXJlcil7Zz10cnVlfWVsc2V7aWYoaC5zZXJpZXMpe2Zvcih2YXIgaj0wO2o8aC5zZXJpZXMubGVuZ3RoO2orKyl7aWYoaC5zZXJpZXNbal0ucmVuZGVyZXI9PT1jLmpxcGxvdC5QeXJhbWlkUmVuZGVyZXIpe2c9dHJ1ZX19fX1pZihnKXtoLmF4ZXNEZWZhdWx0cy5yZW5kZXJlcj1jLmpxcGxvdC5QeXJhbWlkQXhpc1JlbmRlcmVyO2guZ3JpZC5yZW5kZXJlcj1jLmpxcGxvdC5QeXJhbWlkR3JpZFJlbmRlcmVyO2guc2VyaWVzRGVmYXVsdHMucG9pbnRMYWJlbHM9e3Nob3c6ZmFsc2V9fX1mdW5jdGlvbiBmKCl7aWYodGhpcy5wbHVnaW5zLnB5cmFtaWRSZW5kZXJlciYmdGhpcy5wbHVnaW5zLnB5cmFtaWRSZW5kZXJlci5oaWdobGlnaHRDYW52YXMpe3RoaXMucGx1Z2lucy5weXJhbWlkUmVuZGVyZXIuaGlnaGxpZ2h0Q2FudmFzLnJlc2V0Q2FudmFzKCk7dGhpcy5wbHVnaW5zLnB5cmFtaWRSZW5kZXJlci5oaWdobGlnaHRDYW52YXM9bnVsbH10aGlzLnBsdWdpbnMucHlyYW1pZFJlbmRlcmVyPXtoaWdobGlnaHRlZFNlcmllc0luZGV4Om51bGx9O3RoaXMucGx1Z2lucy5weXJhbWlkUmVuZGVyZXIuaGlnaGxpZ2h0Q2FudmFzPW5ldyBjLmpxcGxvdC5HZW5lcmljQ2FudmFzKCk7dGhpcy5ldmVudENhbnZhcy5fZWxlbS5iZWZvcmUodGhpcy5wbHVnaW5zLnB5cmFtaWRSZW5kZXJlci5oaWdobGlnaHRDYW52YXMuY3JlYXRlRWxlbWVudCh0aGlzLl9ncmlkUGFkZGluZywianFwbG90LXB5cmFtaWRSZW5kZXJlci1oaWdobGlnaHQtY2FudmFzIix0aGlzLl9wbG90RGltZW5zaW9ucyx0aGlzKSk7dGhpcy5wbHVnaW5zLnB5cmFtaWRSZW5kZXJlci5oaWdobGlnaHRDYW52YXMuc2V0Q29udGV4dCgpO3RoaXMuZXZlbnRDYW52YXMuX2VsZW0uYmluZCgibW91c2VsZWF2ZSIse3Bsb3Q6dGhpc30sZnVuY3Rpb24oZyl7ZChnLmRhdGEucGxvdCl9KX1mdW5jdGlvbiBhKG0sbCxqLGkpe3ZhciBoPW0uc2VyaWVzW2xdO3ZhciBnPW0ucGx1Z2lucy5weXJhbWlkUmVuZGVyZXIuaGlnaGxpZ2h0Q2FudmFzO2cuX2N0eC5jbGVhclJlY3QoMCwwLGcuX2N0eC5jYW52YXMud2lkdGgsZy5fY3R4LmNhbnZhcy5oZWlnaHQpO2guX2hpZ2hsaWdodGVkUG9pbnQ9ajttLnBsdWdpbnMucHlyYW1pZFJlbmRlcmVyLmhpZ2hsaWdodGVkU2VyaWVzSW5kZXg9bDt2YXIgaz17ZmlsbFN0eWxlOmguaGlnaGxpZ2h0Q29sb3JzW2pdLGZpbGxSZWN0OmZhbHNlfTtoLnJlbmRlcmVyLnNoYXBlUmVuZGVyZXIuZHJhdyhnLl9jdHgsaSxrKTtnPW51bGx9ZnVuY3Rpb24gZChqKXt2YXIgZz1qLnBsdWdpbnMucHlyYW1pZFJlbmRlcmVyLmhpZ2hsaWdodENhbnZhcztnLl9jdHguY2xlYXJSZWN0KDAsMCxnLl9jdHguY2FudmFzLndpZHRoLGcuX2N0eC5jYW52YXMuaGVpZ2h0KTtmb3IodmFyIGg9MDtoPGouc2VyaWVzLmxlbmd0aDtoKyspe2ouc2VyaWVzW2hdLl9oaWdobGlnaHRlZFBvaW50PW51bGx9ai5wbHVnaW5zLnB5cmFtaWRSZW5kZXJlci5oaWdobGlnaHRlZFNlcmllc0luZGV4PW51bGw7ai50YXJnZXQudHJpZ2dlcigianFwbG90RGF0YVVuaGlnaGxpZ2h0Iik7Zz1udWxsfWZ1bmN0aW9uIGUoayxqLG4sbSxsKXtpZihtKXt2YXIgaT1bbS5zZXJpZXNJbmRleCxtLnBvaW50SW5kZXgsbS5kYXRhXTt2YXIgaD1qUXVlcnkuRXZlbnQoImpxcGxvdERhdGFNb3VzZU92ZXIiKTtoLnBhZ2VYPWsucGFnZVg7aC5wYWdlWT1rLnBhZ2VZO2wudGFyZ2V0LnRyaWdnZXIoaCxpKTtpZihsLnNlcmllc1tpWzBdXS5oaWdobGlnaHRNb3VzZU92ZXImJiEoaVswXT09bC5wbHVnaW5zLnB5cmFtaWRSZW5kZXJlci5oaWdobGlnaHRlZFNlcmllc0luZGV4JiZpWzFdPT1sLnNlcmllc1tpWzBdXS5faGlnaGxpZ2h0ZWRQb2ludCkpe3ZhciBnPWpRdWVyeS5FdmVudCgianFwbG90RGF0YUhpZ2hsaWdodCIpO2cucGFnZVg9ay5wYWdlWDtnLnBhZ2VZPWsucGFnZVk7bC50YXJnZXQudHJpZ2dlcihnLGkpO2EobCxtLnNlcmllc0luZGV4LG0ucG9pbnRJbmRleCxtLnBvaW50cyl9fWVsc2V7aWYobT09bnVsbCl7ZChsKX19fWMuanFwbG90LnByZUluaXRIb29rcy5wdXNoKGIpfSkoalF1ZXJ5KTs=]]></data>
	</file>
	<file>
	  <filename>/src/plugins/jqplot.trendline.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqCiAqIGpxUGxvdAogKiBQdXJlIEphdmFTY3JpcHQgcGxvdHRpbmcgcGx1Z2luIHVzaW5nIGpRdWVyeQogKgogKiBWZXJzaW9uOiAxLjAuMGIyX3IxMDEyCiAqCiAqIENvcHlyaWdodCAoYykgMjAwOS0yMDExIENocmlzIExlb25lbGxvCiAqIGpxUGxvdCBpcyBjdXJyZW50bHkgYXZhaWxhYmxlIGZvciB1c2UgaW4gYWxsIHBlcnNvbmFsIG9yIGNvbW1lcmNpYWwgcHJvamVjdHMgCiAqIHVuZGVyIGJvdGggdGhlIE1JVCAoaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHApIGFuZCBHUEwgCiAqIHZlcnNpb24gMi4wIChodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC5odG1sKSBsaWNlbnNlcy4gVGhpcyBtZWFucyB0aGF0IHlvdSBjYW4gCiAqIGNob29zZSB0aGUgbGljZW5zZSB0aGF0IGJlc3Qgc3VpdHMgeW91ciBwcm9qZWN0IGFuZCB1c2UgaXQgYWNjb3JkaW5nbHkuIAogKgogKiBBbHRob3VnaCBub3QgcmVxdWlyZWQsIHRoZSBhdXRob3Igd291bGQgYXBwcmVjaWF0ZSBhbiBlbWFpbCBsZXR0aW5nIGhpbSAKICoga25vdyBvZiBhbnkgc3Vic3RhbnRpYWwgdXNlIG9mIGpxUGxvdC4gIFlvdSBjYW4gcmVhY2ggdGhlIGF1dGhvciBhdDogCiAqIGNocmlzIGF0IGpxcGxvdCBkb3QgY29tIG9yIHNlZSBodHRwOi8vd3d3LmpxcGxvdC5jb20vaW5mby5waHAgLgogKgogKiBJZiB5b3UgYXJlIGZlZWxpbmcga2luZCBhbmQgZ2VuZXJvdXMsIGNvbnNpZGVyIHN1cHBvcnRpbmcgdGhlIHByb2plY3QgYnkKICogbWFraW5nIGEgZG9uYXRpb24gYXQ6IGh0dHA6Ly93d3cuanFwbG90LmNvbS9kb25hdGUucGhwIC4KICoKICogc3ByaW50ZiBmdW5jdGlvbnMgY29udGFpbmVkIGluIGpxcGxvdC5zcHJpbnRmLmpzIGJ5IEFzaCBTZWFybGU6CiAqCiAqICAgICB2ZXJzaW9uIDIwMDcuMDQuMjcKICogICAgIGF1dGhvciBBc2ggU2VhcmxlCiAqICAgICBodHRwOi8vaGV4bWVuLmNvbS9ibG9nLzIwMDcvMDMvcHJpbnRmLXNwcmludGYvCiAqICAgICBodHRwOi8vaGV4bWVuLmNvbS9qcy9zcHJpbnRmLmpzCiAqICAgICBUaGUgYXV0aG9yIChBc2ggU2VhcmxlKSBoYXMgcGxhY2VkIHRoaXMgY29kZSBpbiB0aGUgcHVibGljIGRvbWFpbjoKICogICAgICJUaGlzIGNvZGUgaXMgdW5yZXN0cmljdGVkOiB5b3UgYXJlIGZyZWUgdG8gdXNlIGl0IGhvd2V2ZXIgeW91IGxpa2UuIgogKiAKICovCihmdW5jdGlvbigkKSB7CiAgICAKICAgIC8qKgogICAgICogQ2xhc3M6ICQuanFwbG90LlRyZW5kbGluZQogICAgICogUGx1Z2luIHdoaWNoIHdpbGwgYXV0b21hdGljYWxseSBjb21wdXRlIGFuZCBkcmF3IHRyZW5kbGluZXMgZm9yIHBsb3R0ZWQgZGF0YS4KICAgICAqLwogICAgJC5qcXBsb3QuVHJlbmRsaW5lID0gZnVuY3Rpb24oKSB7CiAgICAgICAgLy8gR3JvdXA6IFByb3BlcnRpZXMKICAgICAgICAKICAgICAgICAvLyBwcm9wOiBzaG93CiAgICAgICAgLy8gV2V0aGVyIG9yIG5vdCB0byBzaG93IHRoZSB0cmVuZCBsaW5lLgogICAgICAgIHRoaXMuc2hvdyA9ICQuanFwbG90LmNvbmZpZy5lbmFibGVQbHVnaW5zOwogICAgICAgIC8vIHByb3A6IGNvbG9yCiAgICAgICAgLy8gQ1NTIGNvbG9yIHNwZWMgZm9yIHRoZSB0cmVuZCBsaW5lLgogICAgICAgIC8vIEJ5IGRlZmF1bHQgdGhpcyB3aWwgYmUgdGhlIHNhbWUgY29sb3IgYXMgdGhlIHByaW1hcnkgbGluZS4KICAgICAgICB0aGlzLmNvbG9yID0gJyM2NjY2NjYnOwogICAgICAgIC8vIHByb3A6IHJlbmRlcmVyCiAgICAgICAgLy8gUmVuZGVyZXIgdG8gdXNlIHRvIGRyYXcgdGhlIHRyZW5kIGxpbmUuCiAgICAgICAgLy8gVGhlIGRhdGEgc2VyaWVzIHRoYXQgaXMgcGxvdHRlZCBtYXkgbm90IGJlIHJlbmRlcmVkIGFzIGEgbGluZS4KICAgICAgICAvLyBUaGVyZWZvcmUsIHdlIHVzZSBvdXIgb3duIGxpbmUgcmVuZGVyZXIgaGVyZSB0byBkcmF3IGEgdHJlbmQgbGluZS4KICAgICAgICB0aGlzLnJlbmRlcmVyID0gbmV3ICQuanFwbG90LkxpbmVSZW5kZXJlcigpOwogICAgICAgIC8vIHByb3A6IHJlbmRlcmVyT3B0aW9ucwogICAgICAgIC8vIE9wdGlvbnMgdG8gcGFzcyB0byB0aGUgbGluZSByZW5kZXJlci4KICAgICAgICAvLyBCeSBkZWZhdWx0LCBtYXJrZXJzIGFyZSBub3Qgc2hvd24gb24gdHJlbmQgbGluZXMuCiAgICAgICAgdGhpcy5yZW5kZXJlck9wdGlvbnMgPSB7bWFya2VyOntzaG93OmZhbHNlfX07CiAgICAgICAgLy8gcHJvcDogbGFiZWwKICAgICAgICAvLyBMYWJlbCBmb3IgdGhlIHRyZW5kIGxpbmUgdG8gdXNlIGluIHRoZSBsZWdlbmQuCiAgICAgICAgdGhpcy5sYWJlbCA9ICcnOwogICAgICAgIC8vIHByb3A6IHR5cGUKICAgICAgICAvLyBFaXRoZXIgJ2V4cG9uZW50aWFsJywgJ2V4cCcsIG9yICdsaW5lYXInLgogICAgICAgIHRoaXMudHlwZSA9ICdsaW5lYXInOwogICAgICAgIC8vIHByb3A6IHNoYWRvdwogICAgICAgIC8vIHRydWUgb3IgZmFsc2UsIHdldGhlciBvciBub3QgdG8gc2hvdyB0aGUgc2hhZG93LgogICAgICAgIHRoaXMuc2hhZG93ID0gdHJ1ZTsKICAgICAgICAvLyBwcm9wOiBtYXJrZXJSZW5kZXJlcgogICAgICAgIC8vIFJlbmRlcmVyIHRvIHVzZSB0byBkcmF3IG1hcmtlcnMgb24gdGhlIGxpbmUuCiAgICAgICAgLy8gSSB0aGluayB0aGlzIGlzIHdyb25nLgogICAgICAgIHRoaXMubWFya2VyUmVuZGVyZXIgPSB7c2hvdzpmYWxzZX07CiAgICAgICAgLy8gcHJvcDogbGluZVdpZHRoCiAgICAgICAgLy8gV2lkdGggb2YgdGhlIHRyZW5kIGxpbmUuCiAgICAgICAgdGhpcy5saW5lV2lkdGggPSAxLjU7CiAgICAgICAgLy8gcHJvcDogc2hhZG93QW5nbGUKICAgICAgICAvLyBBbmdsZSBvZiB0aGUgc2hhZG93IG9uIHRoZSB0cmVuZCBsaW5lLgogICAgICAgIHRoaXMuc2hhZG93QW5nbGUgPSA0NTsKICAgICAgICAvLyBwcm9wOiBzaGFkb3dPZmZzZXQKICAgICAgICAvLyBwaXhlbCBvZmZzZXQgZm9yIGVhY2ggc3Ryb2tlIG9mIHRoZSBzaGFkb3cuCiAgICAgICAgdGhpcy5zaGFkb3dPZmZzZXQgPSAxLjA7CiAgICAgICAgLy8gcHJvcDogc2hhZG93QWxwaGEKICAgICAgICAvLyBBbHBoYSB0cmFuc3BhcmVuY3kgb2YgdGhlIHNoYWRvdy4KICAgICAgICB0aGlzLnNoYWRvd0FscGhhID0gMC4wNzsKICAgICAgICAvLyBwcm9wOiBzaGFkb3dEZXB0aAogICAgICAgIC8vIG51bWJlciBvZiBzdHJva2VzIHRvIG1ha2Ugb2YgdGhlIHNoYWRvdy4KICAgICAgICB0aGlzLnNoYWRvd0RlcHRoID0gMzsKICAgICAgICB0aGlzLmlzVHJlbmRsaW5lID0gdHJ1ZTsKICAgICAgICAKICAgIH07CiAgICAKICAgICQuanFwbG90LnBvc3RTZXJpZXNJbml0SG9va3MucHVzaChwYXJzZVRyZW5kTGluZU9wdGlvbnMpOwogICAgJC5qcXBsb3QucG9zdERyYXdTZXJpZXNIb29rcy5wdXNoKGRyYXdUcmVuZGxpbmUpOwogICAgJC5qcXBsb3QuYWRkTGVnZW5kUm93SG9va3MucHVzaChhZGRUcmVuZGxpbmVMZWdlbmQpOwogICAgCiAgICAvLyBjYWxsZWQgd2l0aW4gc2NvcGUgb2YgdGhlIGxlZ2VuZCBvYmplY3QKICAgIC8vIGN1cnJlbnQgc2VyaWVzIHBhc3NlZCBpbgogICAgLy8gbXVzdCByZXR1cm4gbnVsbCBvciBhbiBvYmplY3Qge2xhYmVsOmxhYmVsLCBjb2xvcjpjb2xvcn0KICAgIGZ1bmN0aW9uIGFkZFRyZW5kbGluZUxlZ2VuZChzZXJpZXMpIHsKICAgICAgICB2YXIgcmV0ID0gbnVsbDsKICAgICAgICBpZiAoc2VyaWVzLnRyZW5kbGluZSAmJiBzZXJpZXMudHJlbmRsaW5lLnNob3cpIHsKICAgICAgICAgICAgdmFyIGx0ID0gc2VyaWVzLnRyZW5kbGluZS5sYWJlbC50b1N0cmluZygpOwogICAgICAgICAgICBpZiAobHQpIHsKICAgICAgICAgICAgICAgIHJldCA9IHtsYWJlbDpsdCwgY29sb3I6c2VyaWVzLnRyZW5kbGluZS5jb2xvcn07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJldDsKICAgIH0KCiAgICAvLyBjYWxsZWQgd2l0aGluIHNjb3BlIG9mIGEgc2VyaWVzCiAgICBmdW5jdGlvbiBwYXJzZVRyZW5kTGluZU9wdGlvbnMgKHRhcmdldCwgZGF0YSwgc2VyaWVzRGVmYXVsdHMsIG9wdGlvbnMsIHBsb3QpIHsKICAgICAgICBpZiAodGhpcy5fdHlwZSAmJiAodGhpcy5fdHlwZSA9PT0gJ2xpbmUnIHx8IHRoaXMuX3R5cGUgPT0gJ2JhcicpKSB7CiAgICAgICAgICAgIHRoaXMudHJlbmRsaW5lID0gbmV3ICQuanFwbG90LlRyZW5kbGluZSgpOwogICAgICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKICAgICAgICAgICAgJC5leHRlbmQodHJ1ZSwgdGhpcy50cmVuZGxpbmUsIHtjb2xvcjp0aGlzLmNvbG9yfSwgc2VyaWVzRGVmYXVsdHMudHJlbmRsaW5lLCBvcHRpb25zLnRyZW5kbGluZSk7CiAgICAgICAgICAgIHRoaXMudHJlbmRsaW5lLnJlbmRlcmVyLmluaXQuY2FsbCh0aGlzLnRyZW5kbGluZSwgbnVsbCk7CiAgICAgICAgfQogICAgfQogICAgCiAgICAvLyBjYWxsZWQgd2l0aGluIHNjb3BlIG9mIHNlcmllcyBvYmplY3QKICAgIGZ1bmN0aW9uIGRyYXdUcmVuZGxpbmUoc2N0eCwgb3B0aW9ucykgewogICAgICAgIC8vIGlmIHdlIGhhdmUgb3B0aW9ucywgbWVyZ2UgdHJlbmRsaW5lIG9wdGlvbnMgaW4gd2l0aCBwcmVjZWRlbmNlCiAgICAgICAgb3B0aW9ucyA9ICQuZXh0ZW5kKHRydWUsIHt9LCB0aGlzLnRyZW5kbGluZSwgb3B0aW9ucyk7CgogICAgICAgIGlmICh0aGlzLnRyZW5kbGluZSAmJiBvcHRpb25zLnNob3cpIHsKICAgICAgICAgICAgdmFyIGZpdDsKICAgICAgICAgICAgLy8gdGhpcy5yZW5kZXJlci5zZXRHcmlkRGF0YS5jYWxsKHRoaXMpOwogICAgICAgICAgICB2YXIgZGF0YSA9IG9wdGlvbnMuZGF0YSB8fCB0aGlzLmRhdGE7CiAgICAgICAgICAgIGZpdCA9IGZpdERhdGEoZGF0YSwgdGhpcy50cmVuZGxpbmUudHlwZSk7CiAgICAgICAgICAgIHZhciBncmlkRGF0YSA9IG9wdGlvbnMuZ3JpZERhdGEgfHwgdGhpcy5yZW5kZXJlci5tYWtlR3JpZERhdGEuY2FsbCh0aGlzLCBmaXQuZGF0YSk7CiAgICAgICAgICAgIHRoaXMudHJlbmRsaW5lLnJlbmRlcmVyLmRyYXcuY2FsbCh0aGlzLnRyZW5kbGluZSwgc2N0eCwgZ3JpZERhdGEsIHtzaG93TGluZTp0cnVlLCBzaGFkb3c6dGhpcy50cmVuZGxpbmUuc2hhZG93fSk7CiAgICAgICAgfQogICAgfQogICAgCiAgICBmdW5jdGlvbiByZWdyZXNzaW9uKHgsIHksIHR5cCkgIHsKICAgICAgICB2YXIgdHlwZSA9ICh0eXAgPT0gbnVsbCkgPyAnbGluZWFyJyA6IHR5cDsKICAgICAgICB2YXIgTiA9IHgubGVuZ3RoOwogICAgICAgIHZhciBzbG9wZTsKICAgICAgICB2YXIgaW50ZXJjZXB0OyAgCiAgICAgICAgdmFyIFNYID0gMDsKICAgICAgICB2YXIgU1kgPSAwOwogICAgICAgIHZhciBTWFggPSAwOwogICAgICAgIHZhciBTWFkgPSAwOwogICAgICAgIHZhciBTWVkgPSAwOwogICAgICAgIHZhciBZID0gW107CiAgICAgICAgdmFyIFggPSBbXTsKICAgIAogICAgICAgIGlmICh0eXBlID09ICdsaW5lYXInKSB7CiAgICAgICAgICAgIFggPSB4OwogICAgICAgICAgICBZID0geTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAodHlwZSA9PSAnZXhwJyB8fCB0eXBlID09ICdleHBvbmVudGlhbCcpIHsKICAgICAgICAgICAgZm9yICggdmFyIGk9MDsgaTx5Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAvLyBpZ25vcmUgcG9pbnRzIDw9IDAsIGxvZyB1bmRlZmluZWQuCiAgICAgICAgICAgICAgICBpZiAoeVtpXSA8PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgTi0tOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgWC5wdXNoKHhbaV0pOwogICAgICAgICAgICAgICAgICAgIFkucHVzaChNYXRoLmxvZyh5W2ldKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGZvciAoIHZhciBpID0gMDsgaSA8IE47IGkrKykgewogICAgICAgICAgICBTWCA9IFNYICsgWFtpXTsKICAgICAgICAgICAgU1kgPSBTWSArIFlbaV07CiAgICAgICAgICAgIFNYWSA9IFNYWSArIFhbaV0qIFlbaV07CiAgICAgICAgICAgIFNYWCA9IFNYWCArIFhbaV0qIFhbaV07CiAgICAgICAgICAgIFNZWSA9IFNZWSArIFlbaV0qIFlbaV07CiAgICAgICAgfQoKICAgICAgICBzbG9wZSA9IChOKlNYWSAtIFNYKlNZKS8oTipTWFggLSBTWCpTWCk7CiAgICAgICAgaW50ZXJjZXB0ID0gKFNZIC0gc2xvcGUqU1gpL047CgogICAgICAgIHJldHVybiBbc2xvcGUsIGludGVyY2VwdF07CiAgICB9CgogICAgZnVuY3Rpb24gbGluZWFyUmVncmVzc2lvbihYLFkpIHsKICAgICAgICB2YXIgcmV0OwogICAgICAgIHJldCA9IHJlZ3Jlc3Npb24oWCxZLCdsaW5lYXInKTsKICAgICAgICByZXR1cm4gW3JldFswXSxyZXRbMV1dOwogICAgfQoKICAgIGZ1bmN0aW9uIGV4cFJlZ3Jlc3Npb24oWCxZKSB7CiAgICAgICAgdmFyIHJldDsKICAgICAgICB2YXIgeCA9IFg7CiAgICAgICAgdmFyIHkgPSBZOwogICAgICAgIHJldCA9IHJlZ3Jlc3Npb24oeCwgeSwnZXhwJyk7CiAgICAgICAgdmFyIGJhc2UgPSBNYXRoLmV4cChyZXRbMF0pOwogICAgICAgIHZhciBjb2VmZiA9IE1hdGguZXhwKHJldFsxXSk7CiAgICAgICAgcmV0dXJuIFtiYXNlLCBjb2VmZl07CiAgICB9CgogICAgZnVuY3Rpb24gZml0RGF0YShkYXRhLCB0eXApIHsKICAgICAgICB2YXIgdHlwZSA9ICh0eXAgPT0gbnVsbCkgPyAgJ2xpbmVhcicgOiB0eXA7CiAgICAgICAgdmFyIHJldDsKICAgICAgICB2YXIgcmVzOwogICAgICAgIHZhciB4ID0gW107CiAgICAgICAgdmFyIHkgPSBbXTsKICAgICAgICB2YXIgeXByZWQgPSBbXTsKICAgICAgICAKICAgICAgICBmb3IgKGk9MDsgaTxkYXRhLmxlbmd0aDsgaSsrKXsKICAgICAgICAgICAgaWYgKGRhdGFbaV0gIT0gbnVsbCAmJiBkYXRhW2ldWzBdICE9IG51bGwgJiYgZGF0YVtpXVsxXSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICB4LnB1c2goZGF0YVtpXVswXSk7CiAgICAgICAgICAgICAgICB5LnB1c2goZGF0YVtpXVsxXSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYgKHR5cGUgPT0gJ2xpbmVhcicpIHsKICAgICAgICAgICAgcmV0ID0gbGluZWFyUmVncmVzc2lvbih4LHkpOwogICAgICAgICAgICBmb3IgKCB2YXIgaT0wOyBpPHgubGVuZ3RoOyBpKyspewogICAgICAgICAgICAgICAgcmVzID0gcmV0WzBdKnhbaV0gKyByZXRbMV07CiAgICAgICAgICAgICAgICB5cHJlZC5wdXNoKFt4W2ldLCByZXNdKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIGlmICh0eXBlID09ICdleHAnIHx8IHR5cGUgPT0gJ2V4cG9uZW50aWFsJykgewogICAgICAgICAgICByZXQgPSBleHBSZWdyZXNzaW9uKHgseSk7CiAgICAgICAgICAgIGZvciAoIHZhciBpPTA7IGk8eC5sZW5ndGg7IGkrKyl7CiAgICAgICAgICAgICAgICByZXMgPSByZXRbMV0qTWF0aC5wb3cocmV0WzBdLHhbaV0pOwogICAgICAgICAgICAgICAgeXByZWQucHVzaChbeFtpXSwgcmVzXSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHtkYXRhOiB5cHJlZCwgc2xvcGU6IHJldFswXSwgaW50ZXJjZXB0OiByZXRbMV19OwogICAgfSAKCn0pKGpRdWVyeSk7]]></data>
	</file>
	<file>
	  <filename>/src/plugins/jqplot.trendline.min.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqCiAqIGpxUGxvdAogKiBQdXJlIEphdmFTY3JpcHQgcGxvdHRpbmcgcGx1Z2luIHVzaW5nIGpRdWVyeQogKgogKiBWZXJzaW9uOiAxLjAuMGIyX3IxMDEyCiAqCiAqIENvcHlyaWdodCAoYykgMjAwOS0yMDExIENocmlzIExlb25lbGxvCiAqIGpxUGxvdCBpcyBjdXJyZW50bHkgYXZhaWxhYmxlIGZvciB1c2UgaW4gYWxsIHBlcnNvbmFsIG9yIGNvbW1lcmNpYWwgcHJvamVjdHMgCiAqIHVuZGVyIGJvdGggdGhlIE1JVCAoaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHApIGFuZCBHUEwgCiAqIHZlcnNpb24gMi4wIChodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC5odG1sKSBsaWNlbnNlcy4gVGhpcyBtZWFucyB0aGF0IHlvdSBjYW4gCiAqIGNob29zZSB0aGUgbGljZW5zZSB0aGF0IGJlc3Qgc3VpdHMgeW91ciBwcm9qZWN0IGFuZCB1c2UgaXQgYWNjb3JkaW5nbHkuIAogKgogKiBBbHRob3VnaCBub3QgcmVxdWlyZWQsIHRoZSBhdXRob3Igd291bGQgYXBwcmVjaWF0ZSBhbiBlbWFpbCBsZXR0aW5nIGhpbSAKICoga25vdyBvZiBhbnkgc3Vic3RhbnRpYWwgdXNlIG9mIGpxUGxvdC4gIFlvdSBjYW4gcmVhY2ggdGhlIGF1dGhvciBhdDogCiAqIGNocmlzIGF0IGpxcGxvdCBkb3QgY29tIG9yIHNlZSBodHRwOi8vd3d3LmpxcGxvdC5jb20vaW5mby5waHAgLgogKgogKiBJZiB5b3UgYXJlIGZlZWxpbmcga2luZCBhbmQgZ2VuZXJvdXMsIGNvbnNpZGVyIHN1cHBvcnRpbmcgdGhlIHByb2plY3QgYnkKICogbWFraW5nIGEgZG9uYXRpb24gYXQ6IGh0dHA6Ly93d3cuanFwbG90LmNvbS9kb25hdGUucGhwIC4KICoKICogc3ByaW50ZiBmdW5jdGlvbnMgY29udGFpbmVkIGluIGpxcGxvdC5zcHJpbnRmLmpzIGJ5IEFzaCBTZWFybGU6CiAqCiAqICAgICB2ZXJzaW9uIDIwMDcuMDQuMjcKICogICAgIGF1dGhvciBBc2ggU2VhcmxlCiAqICAgICBodHRwOi8vaGV4bWVuLmNvbS9ibG9nLzIwMDcvMDMvcHJpbnRmLXNwcmludGYvCiAqICAgICBodHRwOi8vaGV4bWVuLmNvbS9qcy9zcHJpbnRmLmpzCiAqICAgICBUaGUgYXV0aG9yIChBc2ggU2VhcmxlKSBoYXMgcGxhY2VkIHRoaXMgY29kZSBpbiB0aGUgcHVibGljIGRvbWFpbjoKICogICAgICJUaGlzIGNvZGUgaXMgdW5yZXN0cmljdGVkOiB5b3UgYXJlIGZyZWUgdG8gdXNlIGl0IGhvd2V2ZXIgeW91IGxpa2UuIgogKgogKiBpbmNsdWRlZCBqc0RhdGUgbGlicmFyeSBieSBDaHJpcyBMZW9uZWxsbzoKICoKICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEgQ2hyaXMgTGVvbmVsbG8KICoKICoganNEYXRlIGlzIGN1cnJlbnRseSBhdmFpbGFibGUgZm9yIHVzZSBpbiBhbGwgcGVyc29uYWwgb3IgY29tbWVyY2lhbCBwcm9qZWN0cyAKICogdW5kZXIgYm90aCB0aGUgTUlUIGFuZCBHUEwgdmVyc2lvbiAyLjAgbGljZW5zZXMuIFRoaXMgbWVhbnMgdGhhdCB5b3UgY2FuIAogKiBjaG9vc2UgdGhlIGxpY2Vuc2UgdGhhdCBiZXN0IHN1aXRzIHlvdXIgcHJvamVjdCBhbmQgdXNlIGl0IGFjY29yZGluZ2x5LgogKgogKiBqc0RhdGUgYm9ycm93cyBtYW55IGNvbmNlcHRzIGFuZCBpZGVhcyBmcm9tIHRoZSBEYXRlIEluc3RhbmNlIAogKiBNZXRob2RzIGJ5IEtlbiBTbnlkZXIgYWxvbmcgd2l0aCBzb21lIHBhcnRzIG9mIEtlbidzIGFjdHVhbCBjb2RlLgogKiAKICogS2VuJ3Mgb3JpZ2lhbmwgRGF0ZSBJbnN0YW5jZSBNZXRob2RzIGFuZCBjb3B5cmlnaHQgbm90aWNlOgogKiAKICogS2VuIFNueWRlciAoa2VuIGQgc255ZGVyIGF0IGdtYWlsIGRvdCBjb20pCiAqIDIwMDgtMDktMTAKICogdmVyc2lvbiAyLjAuMiAoaHR0cDovL2tlbmRzbnlkZXIuY29tL3NhbmRib3gvZGF0ZS8pICAgICAKICogQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbiBMaWNlbnNlIDMuMCAoaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnkvMy4wLykKICoKICoganFwbG90VG9JbWFnZSBmdW5jdGlvbiBiYXNlZCBvbiBMYXJyeSBTaWRlbidzIGV4cG9ydC1qcXBsb3QtdG8tcG5nLmpzLgogKiBMYXJyeSBoYXMgZ2VuZXJvdXNseSBnaXZlbiBwZXJtaXNzaW9uIHRvIGFkYXB0IGhpcyBjb2RlIGZvciBpbmNsdXNpb24KICogaW50byBqcVBsb3QuCiAqCiAqIExhcnJ5J3Mgb3JpZ2luYWwgY29kZSBjYW4gYmUgZm91bmQgaGVyZToKICoKICogaHR0cHM6Ly9naXRodWIuY29tL2xzaWRlbi9leHBvcnQtanFwbG90LXRvLXBuZwogKiAKICogCiAqLwooZnVuY3Rpb24oZil7Zi5qcXBsb3QuVHJlbmRsaW5lPWZ1bmN0aW9uKCl7dGhpcy5zaG93PWYuanFwbG90LmNvbmZpZy5lbmFibGVQbHVnaW5zO3RoaXMuY29sb3I9IiM2NjY2NjYiO3RoaXMucmVuZGVyZXI9bmV3IGYuanFwbG90LkxpbmVSZW5kZXJlcigpO3RoaXMucmVuZGVyZXJPcHRpb25zPXttYXJrZXI6e3Nob3c6ZmFsc2V9fTt0aGlzLmxhYmVsPSIiO3RoaXMudHlwZT0ibGluZWFyIjt0aGlzLnNoYWRvdz10cnVlO3RoaXMubWFya2VyUmVuZGVyZXI9e3Nob3c6ZmFsc2V9O3RoaXMubGluZVdpZHRoPTEuNTt0aGlzLnNoYWRvd0FuZ2xlPTQ1O3RoaXMuc2hhZG93T2Zmc2V0PTE7dGhpcy5zaGFkb3dBbHBoYT0wLjA3O3RoaXMuc2hhZG93RGVwdGg9Mzt0aGlzLmlzVHJlbmRsaW5lPXRydWV9O2YuanFwbG90LnBvc3RTZXJpZXNJbml0SG9va3MucHVzaChlKTtmLmpxcGxvdC5wb3N0RHJhd1Nlcmllc0hvb2tzLnB1c2goZyk7Zi5qcXBsb3QuYWRkTGVnZW5kUm93SG9va3MucHVzaChhKTtmdW5jdGlvbiBhKGspe3ZhciBqPW51bGw7aWYoay50cmVuZGxpbmUmJmsudHJlbmRsaW5lLnNob3cpe3ZhciBpPWsudHJlbmRsaW5lLmxhYmVsLnRvU3RyaW5nKCk7aWYoaSl7aj17bGFiZWw6aSxjb2xvcjprLnRyZW5kbGluZS5jb2xvcn19fXJldHVybiBqfWZ1bmN0aW9uIGUobSxrLGosaSxsKXtpZih0aGlzLl90eXBlJiYodGhpcy5fdHlwZT09PSJsaW5lInx8dGhpcy5fdHlwZT09ImJhciIpKXt0aGlzLnRyZW5kbGluZT1uZXcgZi5qcXBsb3QuVHJlbmRsaW5lKCk7aT1pfHx7fTtmLmV4dGVuZCh0cnVlLHRoaXMudHJlbmRsaW5lLHtjb2xvcjp0aGlzLmNvbG9yfSxqLnRyZW5kbGluZSxpLnRyZW5kbGluZSk7dGhpcy50cmVuZGxpbmUucmVuZGVyZXIuaW5pdC5jYWxsKHRoaXMudHJlbmRsaW5lLG51bGwpfX1mdW5jdGlvbiBnKG0saSl7aT1mLmV4dGVuZCh0cnVlLHt9LHRoaXMudHJlbmRsaW5lLGkpO2lmKHRoaXMudHJlbmRsaW5lJiZpLnNob3cpe3ZhciBrO3ZhciBsPWkuZGF0YXx8dGhpcy5kYXRhO2s9YyhsLHRoaXMudHJlbmRsaW5lLnR5cGUpO3ZhciBqPWkuZ3JpZERhdGF8fHRoaXMucmVuZGVyZXIubWFrZUdyaWREYXRhLmNhbGwodGhpcyxrLmRhdGEpO3RoaXMudHJlbmRsaW5lLnJlbmRlcmVyLmRyYXcuY2FsbCh0aGlzLnRyZW5kbGluZSxtLGose3Nob3dMaW5lOnRydWUsc2hhZG93OnRoaXMudHJlbmRsaW5lLnNoYWRvd30pfX1mdW5jdGlvbiBiKHcsdixuKXt2YXIgdT0obj09bnVsbCk/ImxpbmVhciI6bjt2YXIgcz13Lmxlbmd0aDt2YXIgdDt2YXIgejt2YXIgbz0wO3ZhciBtPTA7dmFyIHI9MDt2YXIgcT0wO3ZhciBsPTA7dmFyIGo9W107dmFyIGs9W107aWYodT09ImxpbmVhciIpe2s9dztqPXZ9ZWxzZXtpZih1PT0iZXhwInx8dT09ImV4cG9uZW50aWFsIil7Zm9yKHZhciBwPTA7cDx2Lmxlbmd0aDtwKyspe2lmKHZbcF08PTApe3MtLX1lbHNle2sucHVzaCh3W3BdKTtqLnB1c2goTWF0aC5sb2codltwXSkpfX19fWZvcih2YXIgcD0wO3A8cztwKyspe289bytrW3BdO209bStqW3BdO3E9cStrW3BdKmpbcF07cj1yK2tbcF0qa1twXTtsPWwraltwXSpqW3BdfXQ9KHMqcS1vKm0pLyhzKnItbypvKTt6PShtLXQqbykvcztyZXR1cm5bdCx6XX1mdW5jdGlvbiBoKGssail7dmFyIGk7aT1iKGssaiwibGluZWFyIik7cmV0dXJuW2lbMF0saVsxXV19ZnVuY3Rpb24gZChvLG0pe3ZhciBrO3ZhciBpPW87dmFyIG49bTtrPWIoaSxuLCJleHAiKTt2YXIgbD1NYXRoLmV4cChrWzBdKTt2YXIgaj1NYXRoLmV4cChrWzFdKTtyZXR1cm5bbCxqXX1mdW5jdGlvbiBjKGwsail7dmFyIHA9KGo9PW51bGwpPyJsaW5lYXIiOmo7dmFyIG47dmFyIG87dmFyIHI9W107dmFyIHE9W107dmFyIG09W107Zm9yKGs9MDtrPGwubGVuZ3RoO2srKyl7aWYobFtrXSE9bnVsbCYmbFtrXVswXSE9bnVsbCYmbFtrXVsxXSE9bnVsbCl7ci5wdXNoKGxba11bMF0pO3EucHVzaChsW2tdWzFdKX19aWYocD09ImxpbmVhciIpe249aChyLHEpO2Zvcih2YXIgaz0wO2s8ci5sZW5ndGg7aysrKXtvPW5bMF0qcltrXStuWzFdO20ucHVzaChbcltrXSxvXSl9fWVsc2V7aWYocD09ImV4cCJ8fHA9PSJleHBvbmVudGlhbCIpe249ZChyLHEpO2Zvcih2YXIgaz0wO2s8ci5sZW5ndGg7aysrKXtvPW5bMV0qTWF0aC5wb3coblswXSxyW2tdKTttLnB1c2goW3Jba10sb10pfX19cmV0dXJue2RhdGE6bSxzbG9wZTpuWzBdLGludGVyY2VwdDpuWzFdfX19KShqUXVlcnkpOw==]]></data>
	</file>
	<file>
	  <filename>/templates/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/templates/listoptions.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[eyRzdGFydGZvcm19Cgk8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgoJICAgICAgICA8cCBjbGFzcz0icGFnZXRleHQiPnskdGl0bGVfbWF4d2lkdGhwaXhlbHN9OjwvcD4KCSAgICAgICAgPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRpbnB1dF9tYXh3aWR0aHBpeGVsc308L3A+Cgk8L2Rpdj4KCTxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CgkgICAgICAgIDxwIGNsYXNzPSJwYWdldGV4dCI+eyR0aXRsZV9jaGFydG1heGhlaWdodH06PC9wPgoJICAgICAgICA8cCBjbGFzcz0icGFnZWlucHV0Ij57JGlucHV0X2NoYXJ0bWF4aGVpZ2h0fTwvcD4KCTwvZGl2PgoJPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KCSAgICAgICAgPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JHRpdGxlX2NoYXJ0cmVzaXplaGVpZ2h0fTwvcD4KCSAgICAgICAgPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRpbnB1dF9jaGFydHJlc2l6ZWhlaWdodH08L3A+Cgk8L2Rpdj4KCTxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CgkgICAgICAgIDxwIGNsYXNzPSJwYWdldGV4dCI+eyR0aXRsZV9udW1iZXJvZmNvbHVtbnN9OjwvcD4KCSAgICAgICAgPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRpbnB1dF9udW1iZXJvZmNvbHVtbnN9PC9wPgoJPC9kaXY+Cgk8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgoJICAgICAgICA8cCBjbGFzcz0icGFnZXRleHQiPnskdGl0bGVfZGVmYXVsdHN0eWxlc2hlZXR9OjwvcD4KCSAgICAgICAgPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRpbnB1dF9kZWZhdWx0c3R5bGVzaGVldH08L3A+Cgk8L2Rpdj4KCTxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CgkJPHAgY2xhc3M9InBhZ2V0ZXh0Ij4mbmJzcDs8L3A+CgkJPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRzdWJtaXR9PC9wPgoJPC9kaXY+CnskZW5kZm9ybX0=]]></data>
	</file>
</module>
