<?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>sbFlickrPortefolio</name>
	<version>0.1</version>
  <mincmsversion>1.10.3</mincmsversion>
	<help><![CDATA[KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKjxiciAvPgoqIFVzYWdlPGJyIC8+CioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKio8YnIgLz4KPGJyIC8+CjEuIEdldCBhbiBBUEkga2V5IGZyb20gZmxpY2tyPGJyIC8+CjIuIEZpbmQgeW91ciBmbGlja3IgdXNlcm5hbWU8YnIgLz4KMy4gYWRkIHRoZSB0YWcge3NiRmxpY2tyUG9ydGVmb2xpb30gdG8gYSBjb250ZW50IHBhZ2UgYW5kIGZpbGwgdGhlIHBhcmFtZXRlcnM8YnIgLz4KNC4gYWRkIHRoZSBzdHlsZXMgdG8geW91ciBtYWluIHN0eWxlc2hlZXQgZmVsb3dpbmcgdGhlIGV4ZW1wbGVzIGJlbGxvdzxiciAvPgo8YnIgLz4KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKjxiciAvPgoqIENTUyBleGVtcGxlczxiciAvPgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqPGJyIC8+CjxiciAvPgpIb3Jpem9udGFsIHNjcm9sbDo8YnIgLz4KLS0tLS0tLS0tLS0tLS0tLS0tPGJyIC8+CjxiciAvPgouc2JGbGlja3JQb3J0ZWZvbGlvIHs8YnIgLz4KCXdpZHRoOiAxMDAlOzxiciAvPgoJb3ZlcmZsb3c6IGF1dG87PGJyIC8+Cglwb3NpdGlvbjogYWJzb2x1dGU7PGJyIC8+Cgl3aGl0ZS1zcGFjZTogbm93cmFwOzxiciAvPgp9PGJyIC8+CjxiciAvPgouc2JGbGlja3JQb3J0ZWZvbGlvIC5jZWxsIHs8YnIgLz4KCXBhZGRpbmc6IDE2cHg7PGJyIC8+CglkaXNwbGF5OiB0YWJsZS1jZWxsOzxiciAvPgoJdmVydGljYWwtYWxpZ246IG1pZGRsZTs8YnIgLz4KCXRleHQtYWxpZ246IGNlbnRlcjs8YnIgLz4KfTxiciAvPgo8YnIgLz4KLnNiRmxpY2tyUG9ydGVmb2xpbyAuYm94IHs8YnIgLz4KCXBhZGRpbmc6IDhweDs8YnIgLz4KCWJvcmRlcjogMXB4IGdyYXkgc29saWQ7PGJyIC8+Cn08YnIgLz4KPGJyIC8+ClZlcnRpY2FsIHNjcm9sbDo8YnIgLz4KLS0tLS0tLS0tLS0tLS0tLTxiciAvPgo8YnIgLz4Kc2FtZSBhcyAiSG9yaXpvbnRhbCBzY3JvbGwiLCBidXQgcmVtb3ZlICJkaXNwbGF5OiB0YWJsZS1jZWxsOyIgZnJvbSAiLmNlbGwiPGJyIC8+CjxiciAvPgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqPGJyIC8+CiogSW1hZ2Ugc2l6ZXM8YnIgLz4KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKjxiciAvPgo8YnIgLz4KcwlwZXRpdCBjYXJyw6kgNzV4NzU8YnIgLz4KcQlsYXJnZSBzcXVhcmUgMTUweDE1MDxiciAvPgp0CW1pbmlhdHVyZSwgY8O0dMOpIGxlIHBsdXMgbG9uZyBkZSAxMDA8YnIgLz4KbQlwZXRpdCwgY8O0dMOpIGxlIHBsdXMgbG9uZyBkZSAyNDA8YnIgLz4KbglzbWFsbCwgMzIwIG9uIGxvbmdlc3Qgc2lkZTxiciAvPgotCW1veWVuLCBjw7R0w6kgbGUgcGx1cyBsb25nIGRlIDUwMDxiciAvPgp6CU1veWVuIDY0MCwgY8O0dMOpIGxlIHBsdXMgbG9uZyBkZSA2NDA8YnIgLz4KYwltZWRpdW0gODAwLCA4MDAgb24gbG9uZ2VzdCBzaWRl4oCgPGJyIC8+CmIJZ3JhbmQsIGPDtHTDqSBsZSBwbHVzIGxvbmcgZGUgMSAwMjQqPGJyIC8+CjxiciAvPgrigKAgTWVkaXVtIDgwMCBwaG90b3Mgb25seSBleGlzdCBhZnRlciBNYXJjaCAxc3QgMjAxMi48aDM+UGFyYW1ldGVyczwvaDM+PHVsPjxsaT48ZW0+KG9wdGlvbmFsKTwvZW0+IGxhbmc9ImVuX1VTIiAtIFBhcmFtZXRlciBpcyB1c2VkIHRvIHNwZWNpZnkgd2hhdCBsYW5ndWFnZSB0byB1c2UgZm9yIGRpc3BsYXkgb24gdGhlIGZyb250ZW5kLiBOb3QgYWxsIG1vZHVsZXMgc3VwcG9ydCBvciBuZWVkIHRoaXMuPC9saT48bGk+YXBpX2tleT0iIiAtIEZsaWNrciBBUEkga2V5PC9saT48bGk+dXNlcl9pZD0iIiAtIEZsaWNrciBVc2VyIElELCBhbHNvIGNhbGxlZCBOU0lELiBGaW5kIHlvdXJzIDxhIGhyZWY9Imh0dHA6Ly9waXBlcy55YWhvby5jb20vcGlwZXMvcGlwZS5pbmZvP19pZD1wTTBBelBtbjNCR1NTNTNyQngyeVhRIiB0YXJnZXQ9Il9ibGFuayI+aGVyZTwvYT48L2xpPjxsaT50YWdzPSIiIC0gY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgdGFncyB0byBzZWFyY2guIGV4OiBwb3J0ZWZvbGlvLHBvcnRyYWl0PC9saT48bGk+c2l6ZT0ibSIgLSBpbWFnZSBzaXplLiBzZWUgZmxpY2tyIGRvY3VtZW50YXRpb248L2xpPjwvdWw+]]></help>
	<about><![CDATA[PGJyIC8+QXV0aG9yOiBTdMOpcGhhbmUgQsOpcnViw6kgJmx0O3NpcmJlckBkZXRyaXR1cy5xYy5jYSZndDs8YnIgLz48YnIgLz5WZXJzaW9uOiAwLjE8YnIgLz4=]]></about>
	<file>
	  <filename>/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lang/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lang/en_US.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbImhlbHAiXSA9ICcqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogVXNhZ2UKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKMS4gR2V0IGFuIEFQSSBrZXkgZnJvbSBmbGlja3IKMi4gRmluZCB5b3VyIGZsaWNrciB1c2VybmFtZQozLiBhZGQgdGhlIHRhZyB7c2JGbGlja3JQb3J0ZWZvbGlvfSB0byBhIGNvbnRlbnQgcGFnZSBhbmQgZmlsbCB0aGUgcGFyYW1ldGVycwo0LiBhZGQgdGhlIHN0eWxlcyB0byB5b3VyIG1haW4gc3R5bGVzaGVldCBmZWxvd2luZyB0aGUgZXhlbXBsZXMgYmVsbG93CgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogQ1NTIGV4ZW1wbGVzCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCkhvcml6b250YWwgc2Nyb2xsOgotLS0tLS0tLS0tLS0tLS0tLS0KCi5zYkZsaWNrclBvcnRlZm9saW8gewoJd2lkdGg6IDEwMCU7CglvdmVyZmxvdzogYXV0bzsKCXBvc2l0aW9uOiBhYnNvbHV0ZTsKCXdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KCi5zYkZsaWNrclBvcnRlZm9saW8gLmNlbGwgewoJcGFkZGluZzogMTZweDsKCWRpc3BsYXk6IHRhYmxlLWNlbGw7Cgl2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwoJdGV4dC1hbGlnbjogY2VudGVyOwp9Cgouc2JGbGlja3JQb3J0ZWZvbGlvIC5ib3ggewoJcGFkZGluZzogOHB4OwoJYm9yZGVyOiAxcHggZ3JheSBzb2xpZDsKfQoKVmVydGljYWwgc2Nyb2xsOgotLS0tLS0tLS0tLS0tLS0tCgpzYW1lIGFzICJIb3Jpem9udGFsIHNjcm9sbCIsIGJ1dCByZW1vdmUgImRpc3BsYXk6IHRhYmxlLWNlbGw7IiBmcm9tICIuY2VsbCIKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBJbWFnZSBzaXplcwoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgpzCXBldGl0IGNhcnLDqSA3NXg3NQpxCWxhcmdlIHNxdWFyZSAxNTB4MTUwCnQJbWluaWF0dXJlLCBjw7R0w6kgbGUgcGx1cyBsb25nIGRlIDEwMAptCXBldGl0LCBjw7R0w6kgbGUgcGx1cyBsb25nIGRlIDI0MApuCXNtYWxsLCAzMjAgb24gbG9uZ2VzdCBzaWRlCi0JbW95ZW4sIGPDtHTDqSBsZSBwbHVzIGxvbmcgZGUgNTAwCnoJTW95ZW4gNjQwLCBjw7R0w6kgbGUgcGx1cyBsb25nIGRlIDY0MApjCW1lZGl1bSA4MDAsIDgwMCBvbiBsb25nZXN0IHNpZGXigKAKYglncmFuZCwgY8O0dMOpIGxlIHBsdXMgbG9uZyBkZSAxIDAyNCoKCuKAoCBNZWRpdW0gODAwIHBob3RvcyBvbmx5IGV4aXN0IGFmdGVyIE1hcmNoIDFzdCAyMDEyLic7]]></data>
	</file>
	<file>
	  <filename>/phpFlickr/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/phpFlickr/auth.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKICAgIC8qIExhc3QgdXBkYXRlZCB3aXRoIHBocEZsaWNrciAyLjMuMgogICAgICoKICAgICAqIEVkaXQgdGhlc2UgdmFyaWFibGVzIHRvIHJlZmxlY3QgdGhlIHZhbHVlcyB5b3UgbmVlZC4gJGRlZmF1bHRfcmVkaXJlY3QgCiAgICAgKiBhbmQgJHBlcm1pc3Npb25zIGFyZSBvbmx5IGltcG9ydGFudCBpZiB5b3UgYXJlIGxpbmtpbmcgaGVyZSBpbnN0ZWFkIG9mCiAgICAgKiB1c2luZyBwaHBGbGlja3I6OmF1dGgoKSBmcm9tIGFub3RoZXIgcGFnZSBvciBpZiB5b3Ugc2V0IHRoZSByZW1lbWJlcl91cmkKICAgICAqIGFyZ3VtZW50IHRvIGZhbHNlLgogICAgICovCiAgICAkYXBpX2tleSAgICAgICAgICAgICAgICAgPSAiW3lvdXIgYXBpIGtleV0iOwogICAgJGFwaV9zZWNyZXQgICAgICAgICAgICAgID0gIlt5b3VyIGFwaSBzZWNyZXRdIjsKICAgICRkZWZhdWx0X3JlZGlyZWN0ICAgICAgICA9ICIvIjsKICAgICRwZXJtaXNzaW9ucyAgICAgICAgICAgICA9ICJyZWFkIjsKICAgICRwYXRoX3RvX3BocEZsaWNrcl9jbGFzcyA9ICIuLyI7CgogICAgb2Jfc3RhcnQoKTsKICAgIHJlcXVpcmVfb25jZSgkcGF0aF90b19waHBGbGlja3JfY2xhc3MgLiAicGhwRmxpY2tyLnBocCIpOwogICAgQHVuc2V0KCRfU0VTU0lPTlsncGhwRmxpY2tyX2F1dGhfdG9rZW4nXSk7CiAgICAgCglpZiAoIGlzc2V0KCRfU0VTU0lPTlsncGhwRmxpY2tyX2F1dGhfcmVkaXJlY3QnXSkgJiYgIWVtcHR5KCRfU0VTU0lPTlsncGhwRmxpY2tyX2F1dGhfcmVkaXJlY3QnXSkgKSB7CgkJJHJlZGlyZWN0ID0gJF9TRVNTSU9OWydwaHBGbGlja3JfYXV0aF9yZWRpcmVjdCddOwoJCXVuc2V0KCRfU0VTU0lPTlsncGhwRmxpY2tyX2F1dGhfcmVkaXJlY3QnXSk7Cgl9CiAgICAKICAgICRmID0gbmV3IHBocEZsaWNrcigkYXBpX2tleSwgJGFwaV9zZWNyZXQpOwogCiAgICBpZiAoZW1wdHkoJF9HRVRbJ2Zyb2InXSkpIHsKICAgICAgICAkZi0+YXV0aCgkcGVybWlzc2lvbnMsIGZhbHNlKTsKICAgIH0gZWxzZSB7CiAgICAgICAgJGYtPmF1dGhfZ2V0VG9rZW4oJF9HRVRbJ2Zyb2InXSk7Cgl9CiAgICAKICAgIGlmIChlbXB0eSgkcmVkaXJlY3QpKSB7CgkJaGVhZGVyKCJMb2NhdGlvbjogIiAuICRkZWZhdWx0X3JlZGlyZWN0KTsKICAgIH0gZWxzZSB7CgkJaGVhZGVyKCJMb2NhdGlvbjogIiAuICRyZWRpcmVjdCk7CiAgICB9CiAKPz4=]]></data>
	</file>
	<file>
	  <filename>/phpFlickr/example.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyogTGFzdCB1cGRhdGVkIHdpdGggcGhwRmxpY2tyIDEuMy4yCiAqCiAqIFRoaXMgZXhhbXBsZSBmaWxlIHNob3dzIHlvdSBob3cgdG8gY2FsbCB0aGUgMTAwIG1vc3QgcmVjZW50IHB1YmxpYwogKiBwaG90b3MuICBJdCBwYXJzZXMgdGhyb3VnaCB0aGVtIGFuZCBwcmludHMgb3V0IGEgbGluayB0byBlYWNoIG9mIHRoZW0KICogYWxvbmcgd2l0aCB0aGUgb3duZXIncyBuYW1lLgogKgogKiBNb3N0IG9mIHRoZSBwcm9jZXNzaW5nIHRpbWUgaW4gdGhpcyBmaWxlIGNvbWVzIGZyb20gdGhlIDEwMCBjYWxscyB0bwogKiBmbGlja3IucGVvcGxlLmdldEluZm8uICBFbmFibGluZyBjYWNoaW5nIHdpbGwgaGVscCBhIHdob2xlIGxvdCB3aXRoCiAqIHRoaXMgYXMgdGhlcmUgYXJlIG1hbnkgcGVvcGxlIHdobyBwb3N0IG11bHRpcGxlIHBob3RvcyBhdCBvbmNlLgogKgogKiBPYnZpb3VzbHksIHlvdSdsbCB3YW50IHRvIHJlcGxhY2UgdGhlICI8YXBpIGtleT4iIHdpdGggb25lIHByb3ZpZGVkIAogKiBieSBGbGlja3I6IGh0dHA6Ly93d3cuZmxpY2tyLmNvbS9zZXJ2aWNlcy9hcGkva2V5LmduZQogKi8KCnJlcXVpcmVfb25jZSgicGhwRmxpY2tyLnBocCIpOwokZiA9IG5ldyBwaHBGbGlja3IoIjxhcGkga2V5PiIpOwoKJHJlY2VudCA9ICRmLT5waG90b3NfZ2V0UmVjZW50KCk7Cgpmb3JlYWNoICgkcmVjZW50WydwaG90byddIGFzICRwaG90bykgewogICAgJG93bmVyID0gJGYtPnBlb3BsZV9nZXRJbmZvKCRwaG90b1snb3duZXInXSk7CiAgICBlY2hvICI8YSBocmVmPSdodHRwOi8vd3d3LmZsaWNrci5jb20vcGhvdG9zLyIgLiAkcGhvdG9bJ293bmVyJ10gLiAiLyIgLiAkcGhvdG9bJ2lkJ10gLiAiLyc+IjsKICAgIGVjaG8gJHBob3RvWyd0aXRsZSddOwogICAgZWNobyAiPC9hPiBPd25lcjogIjsKICAgIGVjaG8gIjxhIGhyZWY9J2h0dHA6Ly93d3cuZmxpY2tyLmNvbS9wZW9wbGUvIiAuICRwaG90b1snb3duZXInXSAuICIvJz4iOwogICAgZWNobyAkb3duZXJbJ3VzZXJuYW1lJ107CiAgICBlY2hvICI8L2E+PGJyPiI7Cn0KPz4K]]></data>
	</file>
	<file>
	  <filename>/phpFlickr/getToken.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKICAgIC8qIExhc3QgdXBkYXRlZCB3aXRoIHBocEZsaWNrciAxLjQKICAgICAqCiAgICAgKiBJZiB5b3UgbmVlZCB5b3VyIGFwcCB0byBhbHdheXMgbG9naW4gd2l0aCB0aGUgc2FtZSB1c2VyICh0byBzZWUgeW91ciBwcml2YXRlCiAgICAgKiBwaG90b3Mgb3IgcGhvdG9zZXRzLCBmb3IgZXhhbXBsZSksIHlvdSBjYW4gdXNlIHRoaXMgZmlsZSB0byBsb2dpbiBhbmQgZ2V0IGEKICAgICAqIHRva2VuIGFzc2lnbmVkIHNvIHRoYXQgeW91IGNhbiBoYXJkIGNvZGUgdGhlIHRva2VuIHRvIGJlIHVzZWQuICBUbyB1c2UgdGhpcwogICAgICogdXNlIHRoZSBwaHBGbGlja3I6OnNldFRva2VuKCkgZnVuY3Rpb24gd2hlbmV2ZXIgeW91IGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiAKICAgICAqIHRoZSBjbGFzcy4KICAgICAqLwoKICAgIHJlcXVpcmVfb25jZSgicGhwRmxpY2tyLnBocCIpOwogICAgJGYgPSBuZXcgcGhwRmxpY2tyKCI8YXBpIGtleT4iLCAiPHNlY3JldD4iKTsKICAgIAogICAgLy9jaGFuZ2UgdGhpcyB0byB0aGUgcGVybWlzc2lvbnMgeW91IHdpbGwgbmVlZAogICAgJGYtPmF1dGgoInJlYWQiKTsKICAgIAogICAgZWNobyAiQ29weSB0aGlzIHRva2VuIGludG8geW91ciBjb2RlOiAiIC4gJF9TRVNTSU9OWydwaHBGbGlja3JfYXV0aF90b2tlbiddOwogICAgCj8+]]></data>
	</file>
	<file>
	  <filename>/phpFlickr/phpFlickr.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyogcGhwRmxpY2tyIENsYXNzIDMuMQogKiBXcml0dGVuIGJ5IERhbiBDb3VsdGVyIChkYW5AZGFuY291bHRlci5jb20pCiAqIFByb2plY3QgSG9tZSBQYWdlOiBodHRwOi8vcGhwZmxpY2tyLmNvbS8KICogUmVsZWFzZWQgdW5kZXIgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChodHRwOi8vd3d3LmdudS5vcmcvY29weWxlZnQvbGdwbC5odG1sKQogKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY2xhc3MgYW5kIHVwY29taW5nIHRvb2xzIGFuZCB0b3lzIHVzaW5nIGl0LAogKiB2aXNpdCBodHRwOi8vd3d3LnBocGZsaWNrci5jb20vCiAqCiAqCSBGb3IgaW5zdGFsbGF0aW9uIGluc3RydWN0aW9ucywgb3BlbiB0aGUgUkVBRE1FLnR4dCBmaWxlIHBhY2thZ2VkIHdpdGggdGhpcwogKgkgY2xhc3MuIElmIHlvdSBkb24ndCBoYXZlIGEgY29weSwgeW91IGNhbiBzZWUgaXQgYXQ6CiAqCSBodHRwOi8vd3d3LnBocGZsaWNrci5jb20vUkVBRE1FLnR4dAogKgogKgkgUGxlYXNlIHN1Ym1pdCBhbGwgcHJvYmxlbXMgb3IgcXVlc3Rpb25zIHRvIHRoZSBIZWxwIEZvcnVtIG9uIG15IEdvb2dsZSBDb2RlIHByb2plY3QgcGFnZToKICoJCSBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcGhwZmxpY2tyL2lzc3Vlcy9saXN0CiAqCiAqLyAKaWYgKCAhY2xhc3NfZXhpc3RzKCdwaHBGbGlja3InKSApIHsKCWlmIChzZXNzaW9uX2lkKCkgPT0gIiIpIHsKCQlAc2Vzc2lvbl9zdGFydCgpOwoJfQoKCWNsYXNzIHBocEZsaWNrciB7CgkJdmFyICRhcGlfa2V5OwoJCXZhciAkc2VjcmV0OwoJCQoJCXZhciAkcmVzdF9lbmRwb2ludCA9ICdodHRwOi8vYXBpLmZsaWNrci5jb20vc2VydmljZXMvcmVzdC8nOwoJCXZhciAkdXBsb2FkX2VuZHBvaW50ID0gJ2h0dHA6Ly9hcGkuZmxpY2tyLmNvbS9zZXJ2aWNlcy91cGxvYWQvJzsKCQl2YXIgJHJlcGxhY2VfZW5kcG9pbnQgPSAnaHR0cDovL2FwaS5mbGlja3IuY29tL3NlcnZpY2VzL3JlcGxhY2UvJzsKCQl2YXIgJHJlcTsKCQl2YXIgJHJlc3BvbnNlOwoJCXZhciAkcGFyc2VkX3Jlc3BvbnNlOwoJCXZhciAkY2FjaGUgPSBmYWxzZTsKCQl2YXIgJGNhY2hlX2RiID0gbnVsbDsKCQl2YXIgJGNhY2hlX3RhYmxlID0gbnVsbDsKCQl2YXIgJGNhY2hlX2RpciA9IG51bGw7CgkJdmFyICRjYWNoZV9leHBpcmUgPSBudWxsOwoJCXZhciAkY2FjaGVfa2V5ID0gbnVsbDsKCQl2YXIgJGxhc3RfcmVxdWVzdCA9IG51bGw7CgkJdmFyICRkaWVfb25fZXJyb3I7CgkJdmFyICRlcnJvcl9jb2RlOwoJCVZhciAkZXJyb3JfbXNnOwoJCXZhciAkdG9rZW47CgkJdmFyICRwaHBfdmVyc2lvbjsKCQl2YXIgJGN1c3RvbV9wb3N0ID0gbnVsbCwgJGN1c3RvbV9jYWNoZV9nZXQgPSBudWxsLCAkY3VzdG9tX2NhY2hlX3NldCA9IG51bGw7CgoJCS8qCgkJICogV2hlbiB5b3VyIGRhdGFiYXNlIGNhY2hlIHRhYmxlIGhpdHMgdGhpcyBtYW55IHJvd3MsIGEgY2xlYW51cAoJCSAqIHdpbGwgb2NjdXIgdG8gZ2V0IHJpZCBvZiBhbGwgb2YgdGhlIG9sZCByb3dzIGFuZCBjbGVhbnVwIHRoZQoJCSAqIGdhcmJhZ2UgaW4gdGhlIHRhYmxlLiAgRm9yIG1vc3QgcGVyc29uYWwgYXBwcywgMTAwMCByb3dzIHNob3VsZAoJCSAqIGJlIG1vcmUgdGhhbiBlbm91Z2guICBJZiB5b3VyIHNpdGUgZ2V0cyBoaXQgYnkgYSBsb3Qgb2YgdHJhZmZpYwoJCSAqIG9yIHlvdSBoYXZlIGEgbG90IG9mIGRpc2sgc3BhY2UgdG8gc3BhcmUsIGJ1bXAgdGhpcyBudW1iZXIgdXAuCgkJICogWW91IHNob3VsZCB0cnkgdG8gc2V0IGl0IGhpZ2ggZW5vdWdoIHRoYXQgdGhlIGNsZWFudXAgb25seQoJCSAqIGhhcHBlbnMgZXZlcnkgb25jZSBpbiBhIHdoaWxlLCBzbyB0aGlzIHdpbGwgZGVwZW5kIG9uIHRoZSBncm93dGgKCQkgKiBvZiB5b3VyIHRhYmxlLgoJCSAqLwoJCXZhciAkbWF4X2NhY2hlX3Jvd3MgPSAxMDAwOwoKCQlmdW5jdGlvbiBwaHBGbGlja3IgKCRhcGlfa2V5LCAkc2VjcmV0ID0gTlVMTCwgJGRpZV9vbl9lcnJvciA9IGZhbHNlKSB7CgkJCS8vVGhlIEFQSSBLZXkgbXVzdCBiZSBzZXQgYmVmb3JlIGFueSBjYWxscyBjYW4gYmUgbWFkZS4gIFlvdSBjYW4KCQkJLy9nZXQgeW91ciBvd24gYXQgaHR0cDovL3d3dy5mbGlja3IuY29tL3NlcnZpY2VzL2FwaS9taXNjLmFwaV9rZXlzLmh0bWwKCQkJJHRoaXMtPmFwaV9rZXkgPSAkYXBpX2tleTsKCQkJJHRoaXMtPnNlY3JldCA9ICRzZWNyZXQ7CgkJCSR0aGlzLT5kaWVfb25fZXJyb3IgPSAkZGllX29uX2Vycm9yOwoJCQkkdGhpcy0+c2VydmljZSA9ICJmbGlja3IiOwoKCQkJLy9GaW5kIHRoZSBQSFAgdmVyc2lvbiBhbmQgc3RvcmUgaXQgZm9yIGZ1dHVyZSByZWZlcmVuY2UKCQkJJHRoaXMtPnBocF92ZXJzaW9uID0gZXhwbG9kZSgiLSIsIHBocHZlcnNpb24oKSk7CgkJCSR0aGlzLT5waHBfdmVyc2lvbiA9IGV4cGxvZGUoIi4iLCAkdGhpcy0+cGhwX3ZlcnNpb25bMF0pOwoJCX0KCgkJZnVuY3Rpb24gZW5hYmxlQ2FjaGUgKCR0eXBlLCAkY29ubmVjdGlvbiwgJGNhY2hlX2V4cGlyZSA9IDYwMCwgJHRhYmxlID0gJ2ZsaWNrcl9jYWNoZScpIHsKCQkJLy8gVHVybnMgb24gY2FjaGluZy4gICR0eXBlIG11c3QgYmUgZWl0aGVyICJkYiIgKGZvciBkYXRhYmFzZSBjYWNoaW5nKSBvciAiZnMiIChmb3IgZmlsZXN5c3RlbSkuCgkJCS8vIFdoZW4gdXNpbmcgZGIsICRjb25uZWN0aW9uIG11c3QgYmUgYSBQRUFSOjpEQiBjb25uZWN0aW9uIHN0cmluZy4gRXhhbXBsZToKCQkJLy8JICAibXlzcWw6Ly91c2VyOnBhc3N3b3JkQHNlcnZlci9kYXRhYmFzZSIKCQkJLy8gSWYgdGhlICR0YWJsZSwgZG9lc24ndCBleGlzdCwgaXQgd2lsbCBhdHRlbXB0IHRvIGNyZWF0ZSBpdC4KCQkJLy8gV2hlbiB1c2luZyBmaWxlIHN5c3RlbSwgY2FjaGluZywgdGhlICRjb25uZWN0aW9uIGlzIHRoZSBmb2xkZXIgdGhhdCB0aGUgd2ViIHNlcnZlciBoYXMgd3JpdGUKCQkJLy8gYWNjZXNzIHRvLiBVc2UgYWJzb2x1dGUgcGF0aHMgZm9yIGJlc3QgcmVzdWx0cy4gIFJlbGF0aXZlIHBhdGhzIG1heSBoYXZlIHVuZXhwZWN0ZWQgYmVoYXZpb3IKCQkJLy8gd2hlbiB5b3UgaW5jbHVkZSB0aGlzLiAgVGhleSdsbCB1c3VhbGx5IHdvcmssIHlvdSdsbCBqdXN0IHdhbnQgdG8gdGVzdCB0aGVtLgoJCQlpZiAoJHR5cGUgPT0gJ2RiJykgewoJCQkJaWYgKCBwcmVnX21hdGNoKCd8bXlzcWw6Ly8oW146XSopOihbXkBdKilAKFteL10qKS8oLiopfCcsICRjb25uZWN0aW9uLCAkbWF0Y2hlcykgKSB7CgkJCQkJLy9BcnJheSAoIFswXSA9PiBteXNxbDovL3VzZXI6cGFzc3dvcmRAc2VydmVyL2RhdGFiYXNlIFsxXSA9PiB1c2VyIFsyXSA9PiBwYXNzd29yZCBbM10gPT4gc2VydmVyIFs0XSA9PiBkYXRhYmFzZSApIAoJCQkJCSRkYiA9IG15c3FsX2Nvbm5lY3QoJG1hdGNoZXNbM10sICRtYXRjaGVzWzFdLCAkbWF0Y2hlc1syXSk7CgkJCQkJbXlzcWxfc2VsZWN0X2RiKCRtYXRjaGVzWzRdLCAkZGIpOwoJCQkJCQoJCQkJCS8qCgkJCQkJICogSWYgaGlnaCBwZXJmb3JtYW5jZSBpcyBjcnVjaWFsLCB5b3UgY2FuIGVhc2lseSBjb21tZW50CgkJCQkJICogb3V0IHRoaXMgcXVlcnkgb25jZSB5b3UndmUgY3JlYXRlZCB5b3VyIGRhdGFiYXNlIHRhYmxlLgoJCQkJCSAqLwoJCQkJCW15c3FsX3F1ZXJ5KCIKCQkJCQkJQ1JFQVRFIFRBQkxFIElGIE5PVCBFWElTVFMgYCR0YWJsZWAgKAoJCQkJCQkJYHJlcXVlc3RgIENIQVIoIDM1ICkgTk9UIE5VTEwgLAoJCQkJCQkJYHJlc3BvbnNlYCBNRURJVU1URVhUIE5PVCBOVUxMICwKCQkJCQkJCWBleHBpcmF0aW9uYCBEQVRFVElNRSBOT1QgTlVMTCAsCgkJCQkJCQlJTkRFWCAoIGByZXF1ZXN0YCApCgkJCQkJCSkgVFlQRSA9IE1ZSVNBTQoJCQkJCSIsICRkYik7CgkJCQkJCgkJCQkJJHJlc3VsdCA9IG15c3FsX3F1ZXJ5KCJTRUxFQ1QgQ09VTlQoKikgRlJPTSAkdGFibGUiLCAkZGIpOwoJCQkJCSRyZXN1bHQgPSBteXNxbF9mZXRjaF9yb3coJHJlc3VsdCk7CgkJCQkJaWYgKCAkcmVzdWx0WzBdID4gJHRoaXMtPm1heF9jYWNoZV9yb3dzICkgewoJCQkJCQlteXNxbF9xdWVyeSgiREVMRVRFIEZST00gJHRhYmxlIFdIRVJFIGV4cGlyYXRpb24gPCBEQVRFX1NVQihOT1coKSwgSU5URVJWQUwgJGNhY2hlX2V4cGlyZSBzZWNvbmQpIiwgJGRiKTsKCQkJCQkJbXlzcWxfcXVlcnkoJ09QVElNSVpFIFRBQkxFICcgLiAkdGhpcy0+Y2FjaGVfdGFibGUsICRkYik7CgkJCQkJfQoJCQkJCSR0aGlzLT5jYWNoZSA9ICdkYic7CgkJCQkJJHRoaXMtPmNhY2hlX2RiID0gJGRiOwoJCQkJCSR0aGlzLT5jYWNoZV90YWJsZSA9ICR0YWJsZTsKCQkJCX0KCQkJfSBlbHNlaWYgKCR0eXBlID09ICdmcycpIHsKCQkJCSR0aGlzLT5jYWNoZSA9ICdmcyc7CgkJCQkkY29ubmVjdGlvbiA9IHJlYWxwYXRoKCRjb25uZWN0aW9uKTsKCQkJCSR0aGlzLT5jYWNoZV9kaXIgPSAkY29ubmVjdGlvbjsKCQkJCWlmICgkZGlyID0gb3BlbmRpcigkdGhpcy0+Y2FjaGVfZGlyKSkgewoJCQkJCXdoaWxlICgkZmlsZSA9IHJlYWRkaXIoJGRpcikpIHsKCQkJCQkJaWYgKHN1YnN0cigkZmlsZSwgLTYpID09ICcuY2FjaGUnICYmICgoZmlsZW10aW1lKCR0aGlzLT5jYWNoZV9kaXIgLiAnLycgLiAkZmlsZSkgKyAkY2FjaGVfZXhwaXJlKSA8IHRpbWUoKSkgKSB7CgkJCQkJCQl1bmxpbmsoJHRoaXMtPmNhY2hlX2RpciAuICcvJyAuICRmaWxlKTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJfSBlbHNlaWYgKCAkdHlwZSA9PSAnY3VzdG9tJyApIHsKCQkJCSR0aGlzLT5jYWNoZSA9ICJjdXN0b20iOwoJCQkJJHRoaXMtPmN1c3RvbV9jYWNoZV9nZXQgPSAkY29ubmVjdGlvblswXTsKCQkJCSR0aGlzLT5jdXN0b21fY2FjaGVfc2V0ID0gJGNvbm5lY3Rpb25bMV07CgkJCX0KCQkJJHRoaXMtPmNhY2hlX2V4cGlyZSA9ICRjYWNoZV9leHBpcmU7CgkJfQoKCQlmdW5jdGlvbiBnZXRDYWNoZWQgKCRyZXF1ZXN0KQoJCXsKCQkJLy9DaGVja3MgdGhlIGRhdGFiYXNlIG9yIGZpbGVzeXN0ZW0gZm9yIGEgY2FjaGVkIHJlc3VsdCB0byB0aGUgcmVxdWVzdC4KCQkJLy9JZiB0aGVyZSBpcyBubyBjYWNoZSByZXN1bHQsIGl0IHJldHVybnMgYSB2YWx1ZSBvZiBmYWxzZS4gSWYgaXQgZmluZHMgb25lLAoJCQkvL2l0IHJldHVybnMgdGhlIHVucGFyc2VkIFhNTC4KCQkJZm9yZWFjaCAoICRyZXF1ZXN0IGFzICRrZXkgPT4gJHZhbHVlICkgewoJCQkJaWYgKCBlbXB0eSgkdmFsdWUpICkgdW5zZXQoJHJlcXVlc3RbJGtleV0pOwoJCQkJZWxzZSAkcmVxdWVzdFska2V5XSA9IChzdHJpbmcpICRyZXF1ZXN0WyRrZXldOwoJCQl9CgkJCS8vaWYgKCBpc191c2VyX2xvZ2dlZF9pbigpICkgcHJpbnRfcigkcmVxdWVzdCk7CgkJCSRyZXFoYXNoID0gbWQ1KHNlcmlhbGl6ZSgkcmVxdWVzdCkpOwoJCQkkdGhpcy0+Y2FjaGVfa2V5ID0gJHJlcWhhc2g7CgkJCSR0aGlzLT5jYWNoZV9yZXF1ZXN0ID0gJHJlcXVlc3Q7CgkJCWlmICgkdGhpcy0+Y2FjaGUgPT0gJ2RiJykgewoJCQkJJHJlc3VsdCA9IG15c3FsX3F1ZXJ5KCJTRUxFQ1QgcmVzcG9uc2UgRlJPTSAiIC4gJHRoaXMtPmNhY2hlX3RhYmxlIC4gIiBXSEVSRSByZXF1ZXN0ID0gJyIgLiAkcmVxaGFzaCAuICInIEFORCBEQVRFX1NVQihOT1coKSwgSU5URVJWQUwgIiAuIChpbnQpICR0aGlzLT5jYWNoZV9leHBpcmUgLiAiIFNFQ09ORCkgPCBleHBpcmF0aW9uIiwgJHRoaXMtPmNhY2hlX2RiKTsKCQkJCWlmICggbXlzcWxfbnVtX3Jvd3MoJHJlc3VsdCkgKSB7CgkJCQkJJHJlc3VsdCA9IG15c3FsX2ZldGNoX2Fzc29jKCRyZXN1bHQpOwoJCQkJCXJldHVybiAkcmVzdWx0WydyZXNwb25zZSddOwoJCQkJfSBlbHNlIHsKCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQl9CgkJCX0gZWxzZWlmICgkdGhpcy0+Y2FjaGUgPT0gJ2ZzJykgewoJCQkJJGZpbGUgPSAkdGhpcy0+Y2FjaGVfZGlyIC4gJy8nIC4gJHJlcWhhc2ggLiAnLmNhY2hlJzsKCQkJCWlmIChmaWxlX2V4aXN0cygkZmlsZSkpIHsKCQkJCQlpZiAoJHRoaXMtPnBocF92ZXJzaW9uWzBdID4gNCB8fCAoJHRoaXMtPnBocF92ZXJzaW9uWzBdID09IDQgJiYgJHRoaXMtPnBocF92ZXJzaW9uWzFdID49IDMpKSB7CgkJCQkJCXJldHVybiBmaWxlX2dldF9jb250ZW50cygkZmlsZSk7CgkJCQkJfSBlbHNlIHsKCQkJCQkJcmV0dXJuIGltcGxvZGUoJycsIGZpbGUoJGZpbGUpKTsKCQkJCQl9CgkJCQl9CgkJCX0gZWxzZWlmICggJHRoaXMtPmNhY2hlID09ICdjdXN0b20nICkgewoJCQkJcmV0dXJuIGNhbGxfdXNlcl9mdW5jX2FycmF5KCR0aGlzLT5jdXN0b21fY2FjaGVfZ2V0LCBhcnJheSgkcmVxaGFzaCkpOwoJCQl9CgkJCXJldHVybiBmYWxzZTsKCQl9CgoJCWZ1bmN0aW9uIGNhY2hlICgkcmVxdWVzdCwgJHJlc3BvbnNlKQoJCXsKCQkJLy9DYWNoZXMgdGhlIHVucGFyc2VkIHJlc3BvbnNlIG9mIGEgcmVxdWVzdC4KCQkJdW5zZXQoJHJlcXVlc3RbJ2FwaV9zaWcnXSk7CgkJCWZvcmVhY2ggKCAkcmVxdWVzdCBhcyAka2V5ID0+ICR2YWx1ZSApIHsKCQkJCWlmICggZW1wdHkoJHZhbHVlKSApIHVuc2V0KCRyZXF1ZXN0WyRrZXldKTsKCQkJCWVsc2UgJHJlcXVlc3RbJGtleV0gPSAoc3RyaW5nKSAkcmVxdWVzdFska2V5XTsKCQkJfQoJCQkkcmVxaGFzaCA9IG1kNShzZXJpYWxpemUoJHJlcXVlc3QpKTsKCQkJaWYgKCR0aGlzLT5jYWNoZSA9PSAnZGInKSB7CgkJCQkvLyR0aGlzLT5jYWNoZV9kYi0+cXVlcnkoIkRFTEVURSBGUk9NICR0aGlzLT5jYWNoZV90YWJsZSBXSEVSRSByZXF1ZXN0ID0gJyRyZXFoYXNoJyIpOwoJCQkJJHJlc3VsdCA9IG15c3FsX3F1ZXJ5KCJTRUxFQ1QgQ09VTlQoKikgRlJPTSAiIC4gJHRoaXMtPmNhY2hlX3RhYmxlIC4gIiBXSEVSRSByZXF1ZXN0ID0gJyIgLiAkcmVxaGFzaCAuICInIiwgJHRoaXMtPmNhY2hlX2RiKTsKCQkJCSRyZXN1bHQgPSBteXNxbF9mZXRjaF9yb3coJHJlc3VsdCk7CgkJCQlpZiAoICRyZXN1bHRbMF0gKSB7CgkJCQkJJHNxbCA9ICJVUERBVEUgIiAuICR0aGlzLT5jYWNoZV90YWJsZSAuICIgU0VUIHJlc3BvbnNlID0gJyIgLiBzdHJfcmVwbGFjZSgiJyIsICInJyIsICRyZXNwb25zZSkgLiAiJywgZXhwaXJhdGlvbiA9ICciIC4gc3RyZnRpbWUoIiVZLSVtLSVkICVIOiVNOiVTIikgLiAiJyBXSEVSRSByZXF1ZXN0ID0gJyIgLiAkcmVxaGFzaCAuICInIjsKCQkJCQlteXNxbF9xdWVyeSgkc3FsLCAkdGhpcy0+Y2FjaGVfZGIpOwoJCQkJfSBlbHNlIHsKCQkJCQkkc3FsID0gIklOU0VSVCBJTlRPICIgLiAkdGhpcy0+Y2FjaGVfdGFibGUgLiAiIChyZXF1ZXN0LCByZXNwb25zZSwgZXhwaXJhdGlvbikgVkFMVUVTICgnJHJlcWhhc2gnLCAnIiAuIHN0cl9yZXBsYWNlKCInIiwgIicnIiwgJHJlc3BvbnNlKSAuICInLCAnIiAuIHN0cmZ0aW1lKCIlWS0lbS0lZCAlSDolTTolUyIpIC4gIicpIjsKCQkJCQlteXNxbF9xdWVyeSgkc3FsLCAkdGhpcy0+Y2FjaGVfZGIpOwoJCQkJfQoJCQl9IGVsc2VpZiAoJHRoaXMtPmNhY2hlID09ICJmcyIpIHsKCQkJCSRmaWxlID0gJHRoaXMtPmNhY2hlX2RpciAuICIvIiAuICRyZXFoYXNoIC4gIi5jYWNoZSI7CgkJCQkkZnN0cmVhbSA9IGZvcGVuKCRmaWxlLCAidyIpOwoJCQkJJHJlc3VsdCA9IGZ3cml0ZSgkZnN0cmVhbSwkcmVzcG9uc2UpOwoJCQkJZmNsb3NlKCRmc3RyZWFtKTsKCQkJCXJldHVybiAkcmVzdWx0OwoJCQl9IGVsc2VpZiAoICR0aGlzLT5jYWNoZSA9PSAiY3VzdG9tIiApIHsKCQkJCXJldHVybiBjYWxsX3VzZXJfZnVuY19hcnJheSgkdGhpcy0+Y3VzdG9tX2NhY2hlX3NldCwgYXJyYXkoJHJlcWhhc2gsICRyZXNwb25zZSwgJHRoaXMtPmNhY2hlX2V4cGlyZSkpOwoJCQl9CgkJCXJldHVybiBmYWxzZTsKCQl9CgkJCgkJZnVuY3Rpb24gc2V0Q3VzdG9tUG9zdCAoICRmdW5jdGlvbiApIHsKCQkJJHRoaXMtPmN1c3RvbV9wb3N0ID0gJGZ1bmN0aW9uOwoJCX0KCQkKCQlmdW5jdGlvbiBwb3N0ICgkZGF0YSwgJHR5cGUgPSBudWxsKSB7CgkJCWlmICggaXNfbnVsbCgkdHlwZSkgKSB7CgkJCQkkdXJsID0gJHRoaXMtPnJlc3RfZW5kcG9pbnQ7CgkJCX0KCQkJCgkJCWlmICggIWlzX251bGwoJHRoaXMtPmN1c3RvbV9wb3N0KSApIHsKCQkJCXJldHVybiBjYWxsX3VzZXJfZnVuYygkdGhpcy0+Y3VzdG9tX3Bvc3QsICR1cmwsICRkYXRhKTsKCQkJfQoJCQkKCQkJaWYgKCAhcHJlZ19tYXRjaCgifGh0dHA6Ly8oLio/KSgvLiopfCIsICR1cmwsICRtYXRjaGVzKSApIHsKCQkJCWRpZSgnVGhlcmUgd2FzIHNvbWUgcHJvYmxlbSBmaWd1cmluZyBvdXQgeW91ciBlbmRwb2ludCcpOwoJCQl9CgkJCQoJCQlpZiAoIGZ1bmN0aW9uX2V4aXN0cygnY3VybF9pbml0JykgKSB7CgkJCQkvLyBIYXMgY3VybC4gVXNlIGl0IQoJCQkJJGN1cmwgPSBjdXJsX2luaXQoJHRoaXMtPnJlc3RfZW5kcG9pbnQpOwoJCQkJY3VybF9zZXRvcHQoJGN1cmwsIENVUkxPUFRfUE9TVCwgdHJ1ZSk7CgkJCQljdXJsX3NldG9wdCgkY3VybCwgQ1VSTE9QVF9QT1NURklFTERTLCAkZGF0YSk7CgkJCQljdXJsX3NldG9wdCgkY3VybCwgQ1VSTE9QVF9SRVRVUk5UUkFOU0ZFUiwgdHJ1ZSk7CgkJCQkkcmVzcG9uc2UgPSBjdXJsX2V4ZWMoJGN1cmwpOwoJCQkJY3VybF9jbG9zZSgkY3VybCk7CgkJCX0gZWxzZSB7CgkJCQkvLyBVc2Ugc29ja2V0cy4KCQkJCWZvcmVhY2ggKCAkZGF0YSBhcyAka2V5ID0+ICR2YWx1ZSApIHsKCQkJCQkkZGF0YVska2V5XSA9ICRrZXkgLiAnPScgLiB1cmxlbmNvZGUoJHZhbHVlKTsKCQkJCX0KCQkJCSRkYXRhID0gaW1wbG9kZSgnJicsICRkYXRhKTsKCQkJCgkJCQkkZnAgPSBAcGZzb2Nrb3BlbigkbWF0Y2hlc1sxXSwgODApOwoJCQkJaWYgKCEkZnApIHsKCQkJCQlkaWUoJ0NvdWxkIG5vdCBjb25uZWN0IHRvIHRoZSB3ZWIgc2VydmljZScpOwoJCQkJfQoJCQkJZnB1dHMgKCRmcCwnUE9TVCAnIC4gJG1hdGNoZXNbMl0gLiAiIEhUVFAvMS4xXG4iKTsKCQkJCWZwdXRzICgkZnAsJ0hvc3Q6ICcgLiAkbWF0Y2hlc1sxXSAuICJcbiIpOwoJCQkJZnB1dHMgKCRmcCwiQ29udGVudC10eXBlOiBhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWRcbiIpOwoJCQkJZnB1dHMgKCRmcCwiQ29udGVudC1sZW5ndGg6ICIuc3RybGVuKCRkYXRhKS4iXG4iKTsKCQkJCWZwdXRzICgkZnAsIkNvbm5lY3Rpb246IGNsb3NlXHJcblxyXG4iKTsKCQkJCWZwdXRzICgkZnAsJGRhdGEgLiAiXG5cbiIpOwoJCQkJJHJlc3BvbnNlID0gIiI7CgkJCQl3aGlsZSghZmVvZigkZnApKSB7CgkJCQkJJHJlc3BvbnNlIC49IGZnZXRzKCRmcCwgMTAyNCk7CgkJCQl9CgkJCQlmY2xvc2UgKCRmcCk7CgkJCQkkY2h1bmtlZCA9IGZhbHNlOwoJCQkJJGh0dHBfc3RhdHVzID0gdHJpbShzdWJzdHIoJHJlc3BvbnNlLCAwLCBzdHJwb3MoJHJlc3BvbnNlLCAiXG4iKSkpOwoJCQkJaWYgKCAkaHR0cF9zdGF0dXMgIT0gJ0hUVFAvMS4xIDIwMCBPSycgKSB7CgkJCQkJZGllKCdUaGUgd2ViIHNlcnZpY2UgZW5kcG9pbnQgcmV0dXJuZWQgYSAiJyAuICRodHRwX3N0YXR1cyAuICciIHJlc3BvbnNlJyk7CgkJCQl9CgkJCQlpZiAoIHN0cnBvcygkcmVzcG9uc2UsICdUcmFuc2Zlci1FbmNvZGluZzogY2h1bmtlZCcpICE9PSBmYWxzZSApIHsKCQkJCQkkdGVtcCA9IHRyaW0oc3Ryc3RyKCRyZXNwb25zZSwgIlxyXG5cclxuIikpOwoJCQkJCSRyZXNwb25zZSA9ICcnOwoJCQkJCSRsZW5ndGggPSB0cmltKHN1YnN0cigkdGVtcCwgMCwgc3RycG9zKCR0ZW1wLCAiXHIiKSkpOwoJCQkJCXdoaWxlICggdHJpbSgkdGVtcCkgIT0gIjAiICYmICgkbGVuZ3RoID0gdHJpbShzdWJzdHIoJHRlbXAsIDAsIHN0cnBvcygkdGVtcCwgIlxyIikpKSkgIT0gIjAiICkgewoJCQkJCQkkcmVzcG9uc2UgLj0gdHJpbShzdWJzdHIoJHRlbXAsIHN0cmxlbigkbGVuZ3RoKSsyLCBoZXhkZWMoJGxlbmd0aCkpKTsKCQkJCQkJJHRlbXAgPSB0cmltKHN1YnN0cigkdGVtcCwgc3RybGVuKCRsZW5ndGgpICsgMiArIGhleGRlYygkbGVuZ3RoKSkpOwoJCQkJCX0KCQkJCX0gZWxzZWlmICggc3RycG9zKCRyZXNwb25zZSwgJ0hUVFAvMS4xIDIwMCBPSycpICE9PSBmYWxzZSApIHsKCQkJCQkkcmVzcG9uc2UgPSB0cmltKHN0cnN0cigkcmVzcG9uc2UsICJcclxuXHJcbiIpKTsKCQkJCX0KCQkJfQoJCQlyZXR1cm4gJHJlc3BvbnNlOwoJCX0KCQkKCQlmdW5jdGlvbiByZXF1ZXN0ICgkY29tbWFuZCwgJGFyZ3MgPSBhcnJheSgpLCAkbm9jYWNoZSA9IGZhbHNlKQoJCXsKCQkJLy9TZW5kcyBhIHJlcXVlc3QgdG8gRmxpY2tyJ3MgUkVTVCBlbmRwb2ludCB2aWEgUE9TVC4KCQkJaWYgKHN1YnN0cigkY29tbWFuZCwwLDcpICE9ICJmbGlja3IuIikgewoJCQkJJGNvbW1hbmQgPSAiZmxpY2tyLiIgLiAkY29tbWFuZDsKCQkJfQoKCQkJLy9Qcm9jZXNzIGFyZ3VtZW50cywgaW5jbHVkaW5nIG1ldGhvZCBhbmQgbG9naW4gZGF0YS4KCQkJJGFyZ3MgPSBhcnJheV9tZXJnZShhcnJheSgibWV0aG9kIiA9PiAkY29tbWFuZCwgImZvcm1hdCIgPT4gInBocF9zZXJpYWwiLCAiYXBpX2tleSIgPT4gJHRoaXMtPmFwaV9rZXkpLCAkYXJncyk7CgkJCWlmICghZW1wdHkoJHRoaXMtPnRva2VuKSkgewoJCQkJJGFyZ3MgPSBhcnJheV9tZXJnZSgkYXJncywgYXJyYXkoImF1dGhfdG9rZW4iID0+ICR0aGlzLT50b2tlbikpOwoJCQl9IGVsc2VpZiAoIWVtcHR5KCRfU0VTU0lPTlsncGhwRmxpY2tyX2F1dGhfdG9rZW4nXSkpIHsKCQkJCSRhcmdzID0gYXJyYXlfbWVyZ2UoJGFyZ3MsIGFycmF5KCJhdXRoX3Rva2VuIiA9PiAkX1NFU1NJT05bJ3BocEZsaWNrcl9hdXRoX3Rva2VuJ10pKTsKCQkJfQoJCQlrc29ydCgkYXJncyk7CgkJCSRhdXRoX3NpZyA9ICIiOwoJCQkkdGhpcy0+bGFzdF9yZXF1ZXN0ID0gJGFyZ3M7CgkJCWlmICghKCR0aGlzLT5yZXNwb25zZSA9ICR0aGlzLT5nZXRDYWNoZWQoJGFyZ3MpKSB8fCAkbm9jYWNoZSkgewoJCQkJZm9yZWFjaCAoJGFyZ3MgYXMgJGtleSA9PiAkZGF0YSkgewoJCQkJCWlmICggaXNfbnVsbCgkZGF0YSkgKSB7CgkJCQkJCXVuc2V0KCRhcmdzWyRrZXldKTsKCQkJCQkJY29udGludWU7CgkJCQkJfQoJCQkJCSRhdXRoX3NpZyAuPSAka2V5IC4gJGRhdGE7CgkJCQl9CgkJCQlpZiAoIWVtcHR5KCR0aGlzLT5zZWNyZXQpKSB7CgkJCQkJJGFwaV9zaWcgPSBtZDUoJHRoaXMtPnNlY3JldCAuICRhdXRoX3NpZyk7CgkJCQkJJGFyZ3NbJ2FwaV9zaWcnXSA9ICRhcGlfc2lnOwoJCQkJfQoJCQkJJHRoaXMtPnJlc3BvbnNlID0gJHRoaXMtPnBvc3QoJGFyZ3MpOwoJCQkJJHRoaXMtPmNhY2hlKCRhcmdzLCAkdGhpcy0+cmVzcG9uc2UpOwoJCQl9CgkJCQoJCQkvKgoJCQkgKiBVbmNvbW1lbnQgdGhpcyBsaW5lIChhbmQgY29tbWVudCBvdXQgdGhlIG5leHQgb25lKSBpZiB5b3UncmUgZG9pbmcgbGFyZ2UgcXVlcmllcwoJCQkgKiBhbmQgeW91J3JlIGNvbmNlcm5lZCBhYm91dCB0aW1lLiAgVGhpcyB3aWxsLCBob3dldmVyLCBjaGFuZ2UgdGhlIHN0cnVjdHVyZSBvZgoJCQkgKiB0aGUgcmVzdWx0LCBzbyBiZSBzdXJlIHRoYXQgeW91IGxvb2sgYXQgdGhlIHJlc3VsdHMuCgkJCSAqLwoJCQkvLyR0aGlzLT5wYXJzZWRfcmVzcG9uc2UgPSB1bnNlcmlhbGl6ZSgkdGhpcy0+cmVzcG9uc2UpOwoJCQkkdGhpcy0+cGFyc2VkX3Jlc3BvbnNlID0gJHRoaXMtPmNsZWFuX3RleHRfbm9kZXModW5zZXJpYWxpemUoJHRoaXMtPnJlc3BvbnNlKSk7CgkJCWlmICgkdGhpcy0+cGFyc2VkX3Jlc3BvbnNlWydzdGF0J10gPT0gJ2ZhaWwnKSB7CgkJCQlpZiAoJHRoaXMtPmRpZV9vbl9lcnJvcikgZGllKCJUaGUgRmxpY2tyIEFQSSByZXR1cm5lZCB0aGUgZm9sbG93aW5nIGVycm9yOiAjeyR0aGlzLT5wYXJzZWRfcmVzcG9uc2VbJ2NvZGUnXX0gLSB7JHRoaXMtPnBhcnNlZF9yZXNwb25zZVsnbWVzc2FnZSddfSIpOwoJCQkJZWxzZSB7CgkJCQkJJHRoaXMtPmVycm9yX2NvZGUgPSAkdGhpcy0+cGFyc2VkX3Jlc3BvbnNlWydjb2RlJ107CgkJCQkJJHRoaXMtPmVycm9yX21zZyA9ICR0aGlzLT5wYXJzZWRfcmVzcG9uc2VbJ21lc3NhZ2UnXTsKCQkJCQkkdGhpcy0+cGFyc2VkX3Jlc3BvbnNlID0gZmFsc2U7CgkJCQl9CgkJCX0gZWxzZSB7CgkJCQkkdGhpcy0+ZXJyb3JfY29kZSA9IGZhbHNlOwoJCQkJJHRoaXMtPmVycm9yX21zZyA9IGZhbHNlOwoJCQl9CgkJCXJldHVybiAkdGhpcy0+cmVzcG9uc2U7CgkJfQoKCQlmdW5jdGlvbiBjbGVhbl90ZXh0X25vZGVzICgkYXJyKSB7CgkJCWlmICghaXNfYXJyYXkoJGFycikpIHsKCQkJCXJldHVybiAkYXJyOwoJCQl9IGVsc2VpZiAoY291bnQoJGFycikgPT0gMCkgewoJCQkJcmV0dXJuICRhcnI7CgkJCX0gZWxzZWlmIChjb3VudCgkYXJyKSA9PSAxICYmIGFycmF5X2tleV9leGlzdHMoJ19jb250ZW50JywgJGFycikpIHsKCQkJCXJldHVybiAkYXJyWydfY29udGVudCddOwoJCQl9IGVsc2UgewoJCQkJZm9yZWFjaCAoJGFyciBhcyAka2V5ID0+ICRlbGVtZW50KSB7CgkJCQkJJGFyclska2V5XSA9ICR0aGlzLT5jbGVhbl90ZXh0X25vZGVzKCRlbGVtZW50KTsKCQkJCX0KCQkJCXJldHVybigkYXJyKTsKCQkJfQoJCX0KCgkJZnVuY3Rpb24gc2V0VG9rZW4gKCR0b2tlbikgewoJCQkvLyBTZXRzIGFuIGF1dGhlbnRpY2F0aW9uIHRva2VuIHRvIHVzZSBpbnN0ZWFkIG9mIHRoZSBzZXNzaW9uIHZhcmlhYmxlCgkJCSR0aGlzLT50b2tlbiA9ICR0b2tlbjsKCQl9CgoJCWZ1bmN0aW9uIHNldFByb3h5ICgkc2VydmVyLCAkcG9ydCkgewoJCQkvLyBTZXRzIHRoZSBwcm94eSBmb3IgYWxsIHBocEZsaWNrciBjYWxscy4KCQkJJHRoaXMtPnJlcS0+c2V0UHJveHkoJHNlcnZlciwgJHBvcnQpOwoJCX0KCgkJZnVuY3Rpb24gZ2V0RXJyb3JDb2RlICgpIHsKCQkJLy8gUmV0dXJucyB0aGUgZXJyb3IgY29kZSBvZiB0aGUgbGFzdCBjYWxsLiAgSWYgdGhlIGxhc3QgY2FsbCBkaWQgbm90CgkJCS8vIHJldHVybiBhbiBlcnJvci4gVGhpcyB3aWxsIHJldHVybiBhIGZhbHNlIGJvb2xlYW4uCgkJCXJldHVybiAkdGhpcy0+ZXJyb3JfY29kZTsKCQl9CgoJCWZ1bmN0aW9uIGdldEVycm9yTXNnICgpIHsKCQkJLy8gUmV0dXJucyB0aGUgZXJyb3IgbWVzc2FnZSBvZiB0aGUgbGFzdCBjYWxsLiAgSWYgdGhlIGxhc3QgY2FsbCBkaWQgbm90CgkJCS8vIHJldHVybiBhbiBlcnJvci4gVGhpcyB3aWxsIHJldHVybiBhIGZhbHNlIGJvb2xlYW4uCgkJCXJldHVybiAkdGhpcy0+ZXJyb3JfbXNnOwoJCX0KCgkJLyogVGhlc2UgZnVuY3Rpb25zIGFyZSBmcm9udCBlbmRzIGZvciB0aGUgZmxpY2tyIGNhbGxzICovCgoJCWZ1bmN0aW9uIGJ1aWxkUGhvdG9VUkwgKCRwaG90bywgJHNpemUgPSAiTWVkaXVtIikgewoJCQkvL3JlY2VpdmVzIGFuIGFycmF5IChjYW4gdXNlIHRoZSBpbmRpdmlkdWFsIHBob3RvIGRhdGEgcmV0dXJuZWQKCQkJLy9mcm9tIGFuIEFQSSBjYWxsKSBhbmQgcmV0dXJucyBhIFVSTCAoZG9lc24ndCBtZWFuIHRoYXQgdGhlCgkJCS8vZmlsZSBzaXplIGV4aXN0cykKCQkJJHNpemVzID0gYXJyYXkoCgkJCQkic3F1YXJlIiA9PiAiX3MiLAoJCQkJInRodW1ibmFpbCIgPT4gIl90IiwKCQkJCSJzbWFsbCIgPT4gIl9tIiwKCQkJCSJtZWRpdW0iID0+ICIiLAoJCQkJIm1lZGl1bV82NDAiID0+ICJfeiIsCgkJCQkibGFyZ2UiID0+ICJfYiIsCgkJCQkib3JpZ2luYWwiID0+ICJfbyIKCQkJKTsKCQkJCgkJCSRzaXplID0gc3RydG9sb3dlcigkc2l6ZSk7CgkJCWlmICghYXJyYXlfa2V5X2V4aXN0cygkc2l6ZSwgJHNpemVzKSkgewoJCQkJJHNpemUgPSAibWVkaXVtIjsKCQkJfQoJCQkKCQkJaWYgKCRzaXplID09ICJvcmlnaW5hbCIpIHsKCQkJCSR1cmwgPSAiaHR0cDovL2Zhcm0iIC4gJHBob3RvWydmYXJtJ10gLiAiLnN0YXRpYy5mbGlja3IuY29tLyIgLiAkcGhvdG9bJ3NlcnZlciddIC4gIi8iIC4gJHBob3RvWydpZCddIC4gIl8iIC4gJHBob3RvWydvcmlnaW5hbHNlY3JldCddIC4gIl9vIiAuICIuIiAuICRwaG90b1snb3JpZ2luYWxmb3JtYXQnXTsKCQkJfSBlbHNlIHsKCQkJCSR1cmwgPSAiaHR0cDovL2Zhcm0iIC4gJHBob3RvWydmYXJtJ10gLiAiLnN0YXRpYy5mbGlja3IuY29tLyIgLiAkcGhvdG9bJ3NlcnZlciddIC4gIi8iIC4gJHBob3RvWydpZCddIC4gIl8iIC4gJHBob3RvWydzZWNyZXQnXSAuICRzaXplc1skc2l6ZV0gLiAiLmpwZyI7CgkJCX0KCQkJcmV0dXJuICR1cmw7CgkJfQoKCQlmdW5jdGlvbiBnZXRGcmllbmRseUdlb2RhdGEgKCRsYXQsICRsb24pIHsKCQkJLyogSSd2ZSBhZGRlZCB0aGlzIG1ldGhvZCB0byBnZXQgdGhlIGZyaWVuZGx5IGdlb2RhdGEgKGkuZS4gJ2luIE5ldyBZb3JrLCBOWScpIHRoYXQgdGhlCgkJCSAqIHdlYnNpdGUgcHJvdmlkZXMsIGJ1dCBpc24ndCBhdmFpbGFibGUgaW4gdGhlIEFQSS4gSSdtIHByb3ZpZGluZyB0aGlzIHNlcnZpY2UgYXMgbG9uZwoJCQkgKiBhcyBpdCBkb2Vzbid0IGZsb29kIG15IHNlcnZlciB3aXRoIHJlcXVlc3RzIGFuZCBjcmFzaCBpdCBhbGwgdGhlIHRpbWUuCgkJCSAqLwoJCQlyZXR1cm4gdW5zZXJpYWxpemUoZmlsZV9nZXRfY29udGVudHMoJ2h0dHA6Ly9waHBmbGlja3IuY29tL2dlb2RhdGEvP2Zvcm1hdD1waHAmbGF0PScgLiAkbGF0IC4gJyZsb249JyAuICRsb24pKTsKCQl9CgoJCWZ1bmN0aW9uIHN5bmNfdXBsb2FkICgkcGhvdG8sICR0aXRsZSA9IG51bGwsICRkZXNjcmlwdGlvbiA9IG51bGwsICR0YWdzID0gbnVsbCwgJGlzX3B1YmxpYyA9IG51bGwsICRpc19mcmllbmQgPSBudWxsLCAkaXNfZmFtaWx5ID0gbnVsbCkgewoJCQlpZiAoIGZ1bmN0aW9uX2V4aXN0cygnY3VybF9pbml0JykgKSB7CgkJCQkvLyBIYXMgY3VybC4gVXNlIGl0IQoKCQkJCS8vUHJvY2VzcyBhcmd1bWVudHMsIGluY2x1ZGluZyBtZXRob2QgYW5kIGxvZ2luIGRhdGEuCgkJCQkkYXJncyA9IGFycmF5KCJhcGlfa2V5IiA9PiAkdGhpcy0+YXBpX2tleSwgInRpdGxlIiA9PiAkdGl0bGUsICJkZXNjcmlwdGlvbiIgPT4gJGRlc2NyaXB0aW9uLCAidGFncyIgPT4gJHRhZ3MsICJpc19wdWJsaWMiID0+ICRpc19wdWJsaWMsICJpc19mcmllbmQiID0+ICRpc19mcmllbmQsICJpc19mYW1pbHkiID0+ICRpc19mYW1pbHkpOwoJCQkJaWYgKCFlbXB0eSgkdGhpcy0+dG9rZW4pKSB7CgkJCQkJJGFyZ3MgPSBhcnJheV9tZXJnZSgkYXJncywgYXJyYXkoImF1dGhfdG9rZW4iID0+ICR0aGlzLT50b2tlbikpOwoJCQkJfSBlbHNlaWYgKCFlbXB0eSgkX1NFU1NJT05bJ3BocEZsaWNrcl9hdXRoX3Rva2VuJ10pKSB7CgkJCQkJJGFyZ3MgPSBhcnJheV9tZXJnZSgkYXJncywgYXJyYXkoImF1dGhfdG9rZW4iID0+ICRfU0VTU0lPTlsncGhwRmxpY2tyX2F1dGhfdG9rZW4nXSkpOwoJCQkJfQoKCQkJCWtzb3J0KCRhcmdzKTsKCQkJCSRhdXRoX3NpZyA9ICIiOwoJCQkJZm9yZWFjaCAoJGFyZ3MgYXMgJGtleSA9PiAkZGF0YSkgewoJCQkJCWlmICggaXNfbnVsbCgkZGF0YSkgKSB7CgkJCQkJCXVuc2V0KCRhcmdzWyRrZXldKTsKCQkJCQl9IGVsc2UgewoJCQkJCQkkYXV0aF9zaWcgLj0gJGtleSAuICRkYXRhOwoJCQkJCX0KCQkJCX0KCQkJCWlmICghZW1wdHkoJHRoaXMtPnNlY3JldCkpIHsKCQkJCQkkYXBpX3NpZyA9IG1kNSgkdGhpcy0+c2VjcmV0IC4gJGF1dGhfc2lnKTsKCQkJCQkkYXJnc1siYXBpX3NpZyJdID0gJGFwaV9zaWc7CgkJCQl9CgoJCQkJJHBob3RvID0gcmVhbHBhdGgoJHBob3RvKTsKCQkJCSRhcmdzWydwaG90byddID0gJ0AnIC4gJHBob3RvOwoJCQkJCgoJCQkJJGN1cmwgPSBjdXJsX2luaXQoJHRoaXMtPnVwbG9hZF9lbmRwb2ludCk7CgkJCQljdXJsX3NldG9wdCgkY3VybCwgQ1VSTE9QVF9QT1NULCB0cnVlKTsKCQkJCWN1cmxfc2V0b3B0KCRjdXJsLCBDVVJMT1BUX1BPU1RGSUVMRFMsICRhcmdzKTsKCQkJCWN1cmxfc2V0b3B0KCRjdXJsLCBDVVJMT1BUX1JFVFVSTlRSQU5TRkVSLCB0cnVlKTsKCQkJCSRyZXNwb25zZSA9IGN1cmxfZXhlYygkY3VybCk7CgkJCQkkdGhpcy0+cmVzcG9uc2UgPSAkcmVzcG9uc2U7CgkJCQljdXJsX2Nsb3NlKCRjdXJsKTsKCQkJCQoJCQkJJHJzcCA9IGV4cGxvZGUoIlxuIiwgJHJlc3BvbnNlKTsKCQkJCWZvcmVhY2ggKCRyc3AgYXMgJGxpbmUpIHsKCQkJCQlpZiAocHJlZ19tYXRjaCgnfDxlcnIgY29kZT0iKFswLTldKykiIG1zZz0iKC4qKSJ8JywgJGxpbmUsICRtYXRjaCkpIHsKCQkJCQkJaWYgKCR0aGlzLT5kaWVfb25fZXJyb3IpCgkJCQkJCQlkaWUoIlRoZSBGbGlja3IgQVBJIHJldHVybmVkIHRoZSBmb2xsb3dpbmcgZXJyb3I6ICN7JG1hdGNoWzFdfSAtIHskbWF0Y2hbMl19Iik7CgkJCQkJCWVsc2UgewoJCQkJCQkJJHRoaXMtPmVycm9yX2NvZGUgPSAkbWF0Y2hbMV07CgkJCQkJCQkkdGhpcy0+ZXJyb3JfbXNnID0gJG1hdGNoWzJdOwoJCQkJCQkJJHRoaXMtPnBhcnNlZF9yZXNwb25zZSA9IGZhbHNlOwoJCQkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJCQl9CgkJCQkJfSBlbHNlaWYgKHByZWdfbWF0Y2goInw8cGhvdG9pZD4oLiopPC9waG90b2lkPnwiLCAkbGluZSwgJG1hdGNoKSkgewoJCQkJCQkkdGhpcy0+ZXJyb3JfY29kZSA9IGZhbHNlOwoJCQkJCQkkdGhpcy0+ZXJyb3JfbXNnID0gZmFsc2U7CgkJCQkJCXJldHVybiAkbWF0Y2hbMV07CgkJCQkJfQoJCQkJfQoKCQkJfSBlbHNlIHsKCQkJCWRpZSgiU29ycnksIHlvdXIgc2VydmVyIG11c3Qgc3VwcG9ydCBDVVJMIGluIG9yZGVyIHRvIHVwbG9hZCBmaWxlcyIpOwoJCQl9CgoJCX0KCgkJZnVuY3Rpb24gYXN5bmNfdXBsb2FkICgkcGhvdG8sICR0aXRsZSA9IG51bGwsICRkZXNjcmlwdGlvbiA9IG51bGwsICR0YWdzID0gbnVsbCwgJGlzX3B1YmxpYyA9IG51bGwsICRpc19mcmllbmQgPSBudWxsLCAkaXNfZmFtaWx5ID0gbnVsbCkgewoJCQlpZiAoIGZ1bmN0aW9uX2V4aXN0cygnY3VybF9pbml0JykgKSB7CgkJCQkvLyBIYXMgY3VybC4gVXNlIGl0IQoKCQkJCS8vUHJvY2VzcyBhcmd1bWVudHMsIGluY2x1ZGluZyBtZXRob2QgYW5kIGxvZ2luIGRhdGEuCgkJCQkkYXJncyA9IGFycmF5KCJhc3luYyIgPT4gMSwgImFwaV9rZXkiID0+ICR0aGlzLT5hcGlfa2V5LCAidGl0bGUiID0+ICR0aXRsZSwgImRlc2NyaXB0aW9uIiA9PiAkZGVzY3JpcHRpb24sICJ0YWdzIiA9PiAkdGFncywgImlzX3B1YmxpYyIgPT4gJGlzX3B1YmxpYywgImlzX2ZyaWVuZCIgPT4gJGlzX2ZyaWVuZCwgImlzX2ZhbWlseSIgPT4gJGlzX2ZhbWlseSk7CgkJCQlpZiAoIWVtcHR5KCR0aGlzLT50b2tlbikpIHsKCQkJCQkkYXJncyA9IGFycmF5X21lcmdlKCRhcmdzLCBhcnJheSgiYXV0aF90b2tlbiIgPT4gJHRoaXMtPnRva2VuKSk7CgkJCQl9IGVsc2VpZiAoIWVtcHR5KCRfU0VTU0lPTlsncGhwRmxpY2tyX2F1dGhfdG9rZW4nXSkpIHsKCQkJCQkkYXJncyA9IGFycmF5X21lcmdlKCRhcmdzLCBhcnJheSgiYXV0aF90b2tlbiIgPT4gJF9TRVNTSU9OWydwaHBGbGlja3JfYXV0aF90b2tlbiddKSk7CgkJCQl9CgoJCQkJa3NvcnQoJGFyZ3MpOwoJCQkJJGF1dGhfc2lnID0gIiI7CgkJCQlmb3JlYWNoICgkYXJncyBhcyAka2V5ID0+ICRkYXRhKSB7CgkJCQkJaWYgKCBpc19udWxsKCRkYXRhKSApIHsKCQkJCQkJdW5zZXQoJGFyZ3NbJGtleV0pOwoJCQkJCX0gZWxzZSB7CgkJCQkJCSRhdXRoX3NpZyAuPSAka2V5IC4gJGRhdGE7CgkJCQkJfQoJCQkJfQoJCQkJaWYgKCFlbXB0eSgkdGhpcy0+c2VjcmV0KSkgewoJCQkJCSRhcGlfc2lnID0gbWQ1KCR0aGlzLT5zZWNyZXQgLiAkYXV0aF9zaWcpOwoJCQkJCSRhcmdzWyJhcGlfc2lnIl0gPSAkYXBpX3NpZzsKCQkJCX0KCgkJCQkkcGhvdG8gPSByZWFscGF0aCgkcGhvdG8pOwoJCQkJJGFyZ3NbJ3Bob3RvJ10gPSAnQCcgLiAkcGhvdG87CgkJCQkKCgkJCQkkY3VybCA9IGN1cmxfaW5pdCgkdGhpcy0+dXBsb2FkX2VuZHBvaW50KTsKCQkJCWN1cmxfc2V0b3B0KCRjdXJsLCBDVVJMT1BUX1BPU1QsIHRydWUpOwoJCQkJY3VybF9zZXRvcHQoJGN1cmwsIENVUkxPUFRfUE9TVEZJRUxEUywgJGFyZ3MpOwoJCQkJY3VybF9zZXRvcHQoJGN1cmwsIENVUkxPUFRfUkVUVVJOVFJBTlNGRVIsIHRydWUpOwoJCQkJJHJlc3BvbnNlID0gY3VybF9leGVjKCRjdXJsKTsKCQkJCSR0aGlzLT5yZXNwb25zZSA9ICRyZXNwb25zZTsKCQkJCWN1cmxfY2xvc2UoJGN1cmwpOwoJCQkJCgkJCQkkcnNwID0gZXhwbG9kZSgiXG4iLCAkcmVzcG9uc2UpOwoJCQkJZm9yZWFjaCAoJHJzcCBhcyAkbGluZSkgewoJCQkJCWlmIChlcmVnKCc8ZXJyIGNvZGU9IihbMC05XSspIiBtc2c9IiguKikiJywgJGxpbmUsICRtYXRjaCkpIHsKCQkJCQkJaWYgKCR0aGlzLT5kaWVfb25fZXJyb3IpCgkJCQkJCQlkaWUoIlRoZSBGbGlja3IgQVBJIHJldHVybmVkIHRoZSBmb2xsb3dpbmcgZXJyb3I6ICN7JG1hdGNoWzFdfSAtIHskbWF0Y2hbMl19Iik7CgkJCQkJCWVsc2UgewoJCQkJCQkJJHRoaXMtPmVycm9yX2NvZGUgPSAkbWF0Y2hbMV07CgkJCQkJCQkkdGhpcy0+ZXJyb3JfbXNnID0gJG1hdGNoWzJdOwoJCQkJCQkJJHRoaXMtPnBhcnNlZF9yZXNwb25zZSA9IGZhbHNlOwoJCQkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJCQl9CgkJCQkJfSBlbHNlaWYgKGVyZWcoIjx0aWNrZXRpZD4oLiopPC8iLCAkbGluZSwgJG1hdGNoKSkgewoJCQkJCQkkdGhpcy0+ZXJyb3JfY29kZSA9IGZhbHNlOwoJCQkJCQkkdGhpcy0+ZXJyb3JfbXNnID0gZmFsc2U7CgkJCQkJCXJldHVybiAkbWF0Y2hbMV07CgkJCQkJfQoJCQkJfQoJCQl9IGVsc2UgewoJCQkJZGllKCJTb3JyeSwgeW91ciBzZXJ2ZXIgbXVzdCBzdXBwb3J0IENVUkwgaW4gb3JkZXIgdG8gdXBsb2FkIGZpbGVzIik7CgkJCX0KCQl9CgoJCS8vIEludGVyZmFjZSBmb3IgbmV3IHJlcGxhY2UgQVBJIG1ldGhvZC4KCQlmdW5jdGlvbiByZXBsYWNlICgkcGhvdG8sICRwaG90b19pZCwgJGFzeW5jID0gbnVsbCkgewoJCQlpZiAoIGZ1bmN0aW9uX2V4aXN0cygnY3VybF9pbml0JykgKSB7CgkJCQkvLyBIYXMgY3VybC4gVXNlIGl0IQoKCQkJCS8vUHJvY2VzcyBhcmd1bWVudHMsIGluY2x1ZGluZyBtZXRob2QgYW5kIGxvZ2luIGRhdGEuCgkJCQkkYXJncyA9IGFycmF5KCJhcGlfa2V5IiA9PiAkdGhpcy0+YXBpX2tleSwgInBob3RvX2lkIiA9PiAkcGhvdG9faWQsICJhc3luYyIgPT4gJGFzeW5jKTsKCQkJCWlmICghZW1wdHkoJHRoaXMtPnRva2VuKSkgewoJCQkJCSRhcmdzID0gYXJyYXlfbWVyZ2UoJGFyZ3MsIGFycmF5KCJhdXRoX3Rva2VuIiA9PiAkdGhpcy0+dG9rZW4pKTsKCQkJCX0gZWxzZWlmICghZW1wdHkoJF9TRVNTSU9OWydwaHBGbGlja3JfYXV0aF90b2tlbiddKSkgewoJCQkJCSRhcmdzID0gYXJyYXlfbWVyZ2UoJGFyZ3MsIGFycmF5KCJhdXRoX3Rva2VuIiA9PiAkX1NFU1NJT05bJ3BocEZsaWNrcl9hdXRoX3Rva2VuJ10pKTsKCQkJCX0KCgkJCQlrc29ydCgkYXJncyk7CgkJCQkkYXV0aF9zaWcgPSAiIjsKCQkJCWZvcmVhY2ggKCRhcmdzIGFzICRrZXkgPT4gJGRhdGEpIHsKCQkJCQlpZiAoIGlzX251bGwoJGRhdGEpICkgewoJCQkJCQl1bnNldCgkYXJnc1ska2V5XSk7CgkJCQkJfSBlbHNlIHsKCQkJCQkJJGF1dGhfc2lnIC49ICRrZXkgLiAkZGF0YTsKCQkJCQl9CgkJCQl9CgkJCQlpZiAoIWVtcHR5KCR0aGlzLT5zZWNyZXQpKSB7CgkJCQkJJGFwaV9zaWcgPSBtZDUoJHRoaXMtPnNlY3JldCAuICRhdXRoX3NpZyk7CgkJCQkJJGFyZ3NbImFwaV9zaWciXSA9ICRhcGlfc2lnOwoJCQkJfQoKCQkJCSRwaG90byA9IHJlYWxwYXRoKCRwaG90byk7CgkJCQkkYXJnc1sncGhvdG8nXSA9ICdAJyAuICRwaG90bzsKCQkJCQoKCQkJCSRjdXJsID0gY3VybF9pbml0KCR0aGlzLT5yZXBsYWNlX2VuZHBvaW50KTsKCQkJCWN1cmxfc2V0b3B0KCRjdXJsLCBDVVJMT1BUX1BPU1QsIHRydWUpOwoJCQkJY3VybF9zZXRvcHQoJGN1cmwsIENVUkxPUFRfUE9TVEZJRUxEUywgJGFyZ3MpOwoJCQkJY3VybF9zZXRvcHQoJGN1cmwsIENVUkxPUFRfUkVUVVJOVFJBTlNGRVIsIHRydWUpOwoJCQkJJHJlc3BvbnNlID0gY3VybF9leGVjKCRjdXJsKTsKCQkJCSR0aGlzLT5yZXNwb25zZSA9ICRyZXNwb25zZTsKCQkJCWN1cmxfY2xvc2UoJGN1cmwpOwoJCQkJCgkJCQlpZiAoJGFzeW5jID09IDEpCgkJCQkJJGZpbmQgPSAndGlja2V0aWQnOwoJCQkJIGVsc2UKCQkJCQkkZmluZCA9ICdwaG90b2lkJzsKCgkJCQkkcnNwID0gZXhwbG9kZSgiXG4iLCAkcmVzcG9uc2UpOwoJCQkJZm9yZWFjaCAoJHJzcCBhcyAkbGluZSkgewoJCQkJCWlmIChwcmVnX21hdGNoKCd8PGVyciBjb2RlPSIoWzAtOV0rKSIgbXNnPSIoLiopInwnLCAkbGluZSwgJG1hdGNoKSkgewoJCQkJCQlpZiAoJHRoaXMtPmRpZV9vbl9lcnJvcikKCQkJCQkJCWRpZSgiVGhlIEZsaWNrciBBUEkgcmV0dXJuZWQgdGhlIGZvbGxvd2luZyBlcnJvcjogI3skbWF0Y2hbMV19IC0geyRtYXRjaFsyXX0iKTsKCQkJCQkJZWxzZSB7CgkJCQkJCQkkdGhpcy0+ZXJyb3JfY29kZSA9ICRtYXRjaFsxXTsKCQkJCQkJCSR0aGlzLT5lcnJvcl9tc2cgPSAkbWF0Y2hbMl07CgkJCQkJCQkkdGhpcy0+cGFyc2VkX3Jlc3BvbnNlID0gZmFsc2U7CgkJCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQkJCX0KCQkJCQl9IGVsc2VpZiAocHJlZ19tYXRjaCgifDwiIC4gJGZpbmQgLiAiPiguKik8L3wiLCAkbGluZSwgJG1hdGNoKSkgewoJCQkJCQkkdGhpcy0+ZXJyb3JfY29kZSA9IGZhbHNlOwoJCQkJCQkkdGhpcy0+ZXJyb3JfbXNnID0gZmFsc2U7CgkJCQkJCXJldHVybiAkbWF0Y2hbMV07CgkJCQkJfQoJCQkJfQoJCQl9IGVsc2UgewoJCQkJZGllKCJTb3JyeSwgeW91ciBzZXJ2ZXIgbXVzdCBzdXBwb3J0IENVUkwgaW4gb3JkZXIgdG8gdXBsb2FkIGZpbGVzIik7CgkJCX0KCQl9CgoJCWZ1bmN0aW9uIGF1dGggKCRwZXJtcyA9ICJyZWFkIiwgJHJlbWVtYmVyX3VyaSA9IHRydWUpIHsKCQkJLy8gUmVkaXJlY3RzIHRvIEZsaWNrcidzIGF1dGhlbnRpY2F0aW9uIHBpZWNlIGlmIHRoZXJlIGlzIG5vIHZhbGlkIHRva2VuLgoJCQkvLyBJZiByZW1lbWJlcl91cmkgaXMgc2V0IHRvIGZhbHNlLCB0aGUgY2FsbGJhY2sgc2NyaXB0IChpbmNsdWRlZCkgd2lsbAoJCQkvLyByZWRpcmVjdCB0byBpdHMgZGVmYXVsdCBwYWdlLgoKCQkJaWYgKGVtcHR5KCRfU0VTU0lPTlsncGhwRmxpY2tyX2F1dGhfdG9rZW4nXSkgJiYgZW1wdHkoJHRoaXMtPnRva2VuKSkgewoJCQkJaWYgKCAkcmVtZW1iZXJfdXJpID09PSB0cnVlICkgewoJCQkJCSRfU0VTU0lPTlsncGhwRmxpY2tyX2F1dGhfcmVkaXJlY3QnXSA9ICRfU0VSVkVSWydSRVFVRVNUX1VSSSddOwoJCQkJfSBlbHNlaWYgKCAkcmVtZW1iZXJfdXJpICE9PSBmYWxzZSApIHsKCQkJCQkkX1NFU1NJT05bJ3BocEZsaWNrcl9hdXRoX3JlZGlyZWN0J10gPSAkcmVtZW1iZXJfdXJpOwoJCQkJfQoJCQkJJGFwaV9zaWcgPSBtZDUoJHRoaXMtPnNlY3JldCAuICJhcGlfa2V5IiAuICR0aGlzLT5hcGlfa2V5IC4gInBlcm1zIiAuICRwZXJtcyk7CgkJCQkKCQkJCWlmICgkdGhpcy0+c2VydmljZSA9PSAiMjMiKSB7CgkJCQkJaGVhZGVyKCJMb2NhdGlvbjogaHR0cDovL3d3dy4yM2hxLmNvbS9zZXJ2aWNlcy9hdXRoLz9hcGlfa2V5PSIgLiAkdGhpcy0+YXBpX2tleSAuICImcGVybXM9IiAuICRwZXJtcyAuICImYXBpX3NpZz0iLiAkYXBpX3NpZyk7CgkJCQl9IGVsc2UgewoJCQkJCWhlYWRlcigiTG9jYXRpb246IGh0dHA6Ly93d3cuZmxpY2tyLmNvbS9zZXJ2aWNlcy9hdXRoLz9hcGlfa2V5PSIgLiAkdGhpcy0+YXBpX2tleSAuICImcGVybXM9IiAuICRwZXJtcyAuICImYXBpX3NpZz0iLiAkYXBpX3NpZyk7CgkJCQl9CgkJCQlleGl0OwoJCQl9IGVsc2UgewoJCQkJJHRtcCA9ICR0aGlzLT5kaWVfb25fZXJyb3I7CgkJCQkkdGhpcy0+ZGllX29uX2Vycm9yID0gZmFsc2U7CgkJCQkkcnNwID0gJHRoaXMtPmF1dGhfY2hlY2tUb2tlbigpOwoJCQkJaWYgKCR0aGlzLT5lcnJvcl9jb2RlICE9PSBmYWxzZSkgewoJCQkJCXVuc2V0KCRfU0VTU0lPTlsncGhwRmxpY2tyX2F1dGhfdG9rZW4nXSk7CgkJCQkJJHRoaXMtPmF1dGgoJHBlcm1zLCAkcmVtZW1iZXJfdXJpKTsKCQkJCX0KCQkJCSR0aGlzLT5kaWVfb25fZXJyb3IgPSAkdG1wOwoJCQkJcmV0dXJuICRyc3BbJ3Blcm1zJ107CgkJCX0KCQl9CgoJCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgoJCVRvIHVzZSB0aGUgcGhwRmxpY2tyOjpjYWxsIG1ldGhvZCwgcGFzcyBhIHN0cmluZyBjb250YWluaW5nIHRoZSBBUEkgbWV0aG9kIHlvdSB3YW50CgkJdG8gdXNlIGFuZCBhbiBhc3NvY2lhdGl2ZSBhcnJheSBvZiBhcmd1bWVudHMuICBGb3IgZXhhbXBsZToKCQkJJHJlc3VsdCA9ICRmLT5jYWxsKCJmbGlja3IucGhvdG9zLmNvbW1lbnRzLmdldExpc3QiLCBhcnJheSgicGhvdG9faWQiPT4nMzQ5NTI2MTInKSk7CgkJVGhpcyBtZXRob2Qgd2lsbCBhbGxvdyB5b3UgdG8gbWFrZSBjYWxscyB0byBhcmJpdHJhcnkgbWV0aG9kcyB0aGF0IGhhdmVuJ3QgYmVlbgoJCWltcGxlbWVudGVkIGluIHBocEZsaWNrciB5ZXQuCgoJCSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgoJCWZ1bmN0aW9uIGNhbGwgKCRtZXRob2QsICRhcmd1bWVudHMpIHsKCQkJZm9yZWFjaCAoICRhcmd1bWVudHMgYXMgJGtleSA9PiAkdmFsdWUgKSB7CgkJCQlpZiAoIGlzX251bGwoJHZhbHVlKSApIHVuc2V0KCRhcmd1bWVudHNbJGtleV0pOwoJCQl9CgkJCSR0aGlzLT5yZXF1ZXN0KCRtZXRob2QsICRhcmd1bWVudHMpOwoJCQlyZXR1cm4gJHRoaXMtPnBhcnNlZF9yZXNwb25zZSA/ICR0aGlzLT5wYXJzZWRfcmVzcG9uc2UgOiBmYWxzZTsKCQl9CgoJCS8qCgkJCVRoZXNlIGZ1bmN0aW9ucyBhcmUgdGhlIGRpcmVjdCBpbXBsZW1lbnRhdGlvbnMgb2YgZmxpY2tyIGNhbGxzLgoJCQlGb3IgbWV0aG9kIGRvY3VtZW50YXRpb24sIGluY2x1ZGluZyBhcmd1bWVudHMsIHZpc2l0IHRoZSBhZGRyZXNzCgkJCWluY2x1ZGVkIGluIGEgY29tbWVudCBpbiB0aGUgZnVuY3Rpb24uCgkJKi8KCgkJLyogQWN0aXZpdHkgbWV0aG9kcyAqLwoJCWZ1bmN0aW9uIGFjdGl2aXR5X3VzZXJDb21tZW50cyAoJHBlcl9wYWdlID0gTlVMTCwgJHBhZ2UgPSBOVUxMKSB7CgkJCS8qIGh0dHA6Ly93d3cuZmxpY2tyLmNvbS9zZXJ2aWNlcy9hcGkvZmxpY2tyLmFjdGl2aXR5LnVzZXJDb21tZW50cy5odG1sICovCgkJCSR0aGlzLT5yZXF1ZXN0KCdmbGlja3IuYWN0aXZpdHkudXNlckNvbW1lbnRzJywgYXJyYXkoInBlcl9wYWdlIiA9PiAkcGVyX3BhZ2UsICJwYWdlIiA9PiAkcGFnZSkpOwoJCQlyZXR1cm4gJHRoaXMtPnBhcnNlZF9yZXNwb25zZSA/ICR0aGlzLT5wYXJzZWRfcmVzcG9uc2VbJ2l0ZW1zJ11bJ2l0ZW0nXSA6IGZhbHNlOwoJCX0KCgkJZnVuY3Rpb24gYWN0aXZpdHlfdXNlclBob3RvcyAoJHRpbWVmcmFtZSA9IE5VTEwsICRwZXJfcGFnZSA9IE5VTEwsICRwYWdlID0gTlVMTCkgewoJCQkvKiBodHRwOi8vd3d3LmZsaWNrci5jb20vc2VydmljZXMvYXBpL2ZsaWNrci5hY3Rpdml0eS51c2VyUGhvdG9zLmh0bWwgKi8KCQkJJHRoaXMtPnJlcXVlc3QoJ2ZsaWNrci5hY3Rpdml0eS51c2VyUGhvdG9zJywgYXJyYXkoInRpbWVmcmFtZSIgPT4gJHRpbWVmcmFtZSwgInBlcl9wYWdlIiA9PiAkcGVyX3BhZ2UsICJwYWdlIiA9PiAkcGFnZSkpOwoJCQlyZXR1cm4gJHRoaXMtPnBhcnNlZF9yZXNwb25zZSA/ICR0aGlzLT5wYXJzZWRfcmVzcG9uc2VbJ2l0ZW1zJ11bJ2l0ZW0nXSA6IGZhbHNlOwoJCX0KCgkJLyogQXV0aGVudGljYXRpb24gbWV0aG9kcyAqLwoJCWZ1bmN0aW9uIGF1dGhfY2hlY2tUb2tlbiAoKSB7CgkJCS8qIGh0dHA6Ly93d3cuZmxpY2tyLmNvbS9zZXJ2aWNlcy9hcGkvZmxpY2tyLmF1dGguY2hlY2tUb2tlbi5odG1sICovCgkJCSR0aGlzLT5yZXF1ZXN0KCdmbGlja3IuYXV0aC5jaGVja1Rva2VuJyk7CgkJCXJldHVybiAkdGhpcy0+cGFyc2VkX3Jlc3BvbnNlID8gJHRoaXMtPnBhcnNlZF9yZXNwb25zZVsnYXV0aCddIDogZmFsc2U7CgkJfQoKCQlmdW5jdGlvbiBhdXRoX2dldEZyb2IgKCkgewoJCQkvKiBodHRwOi8vd3d3LmZsaWNrci5jb20vc2VydmljZXMvYXBpL2ZsaWNrci5hdXRoLmdldEZyb2IuaHRtbCAqLwoJCQkkdGhpcy0+cmVxdWVzdCgnZmxpY2tyLmF1dGguZ2V0RnJvYicpOwoJCQlyZXR1cm4gJHRoaXMtPnBhcnNlZF9yZXNwb25zZSA/ICR0aGlzLT5wYXJzZWRfcmVzcG9uc2VbJ2Zyb2InXSA6IGZhbHNlOwoJCX0KCgkJZnVuY3Rpb24gYXV0aF9nZXRGdWxsVG9rZW4gKCRtaW5pX3Rva2VuKSB7CgkJCS8qIGh0dHA6Ly93d3cuZmxpY2tyLmNvbS9zZXJ2aWNlcy9hcGkvZmxpY2tyLmF1dGguZ2V0RnVsbFRva2VuLmh0bWwgKi8KCQkJJHRoaXMtPnJlcXVlc3QoJ2ZsaWNrci5hdXRoLmdldEZ1bGxUb2tlbicsIGFycmF5KCdtaW5pX3Rva2VuJz0+JG1pbmlfdG9rZW4pKTsKCQkJcmV0dXJuICR0aGlzLT5wYXJzZWRfcmVzcG9uc2UgPyAkdGhpcy0+cGFyc2VkX3Jlc3BvbnNlWydhdXRoJ10gOiBmYWxzZTsKCQl9CgoJCWZ1bmN0aW9uIGF1dGhfZ2V0VG9rZW4gKCRmcm9iKSB7CgkJCS8qIGh0dHA6Ly93d3cuZmxpY2tyLmNvbS9zZXJ2aWNlcy9hcGkvZmxpY2tyLmF1dGguZ2V0VG9rZW4uaHRtbCAqLwoJCQkkdGhpcy0+cmVxdWVzdCgnZmxpY2tyLmF1dGguZ2V0VG9rZW4nLCBhcnJheSgnZnJvYic9PiRmcm9iKSk7CgkJCSRfU0VTU0lPTlsncGhwRmxpY2tyX2F1dGhfdG9rZW4nXSA9ICR0aGlzLT5wYXJzZWRfcmVzcG9uc2VbJ2F1dGgnXVsndG9rZW4nXTsKCQkJcmV0dXJuICR0aGlzLT5wYXJzZWRfcmVzcG9uc2UgPyAkdGhpcy0+cGFyc2VkX3Jlc3BvbnNlWydhdXRoJ10gOiBmYWxzZTsKCQl9CgoJCS8qIEJsb2dzIG1ldGhvZHMgKi8KCQlmdW5jdGlvbiBibG9nc19nZXRMaXN0ICgkc2VydmljZSA9IE5VTEwpIHsKCQkJLyogaHR0cDovL3d3dy5mbGlja3IuY29tL3NlcnZpY2VzL2FwaS9mbGlja3IuYmxvZ3MuZ2V0TGlzdC5odG1sICovCgkJCSRyc3AgPSAkdGhpcy0+Y2FsbCgnZmxpY2tyLmJsb2dzLmdldExpc3QnLCBhcnJheSgnc2VydmljZScgPT4gJHNlcnZpY2UpKTsKCQkJcmV0dXJuICRyc3BbJ2Jsb2dzJ11bJ2Jsb2cnXTsKCQl9CgkJCgkJZnVuY3Rpb24gYmxvZ3NfZ2V0U2VydmljZXMgKCkgewoJCQkvKiBodHRwOi8vd3d3LmZsaWNrci5jb20vc2VydmljZXMvYXBpL2ZsaWNrci5ibG9ncy5nZXRTZXJ2aWNlcy5odG1sICovCgkJCXJldHVybiAkdGhpcy0+Y2FsbCgnZmxpY2tyLmJsb2dzLmdldFNlcnZpY2VzJywgYXJyYXkoKSk7CgkJfQoKCQlmdW5jdGlvbiBibG9nc19wb3N0UGhvdG8gKCRibG9nX2lkID0gTlVMTCwgJHBob3RvX2lkLCAkdGl0bGUsICRkZXNjcmlwdGlvbiwgJGJsb2dfcGFzc3dvcmQgPSBOVUxMLCAkc2VydmljZSA9IE5VTEwpIHsKCQkJLyogaHR0cDovL3d3dy5mbGlja3IuY29tL3NlcnZpY2VzL2FwaS9mbGlja3IuYmxvZ3MucG9zdFBob3RvLmh0bWwgKi8KCQkJcmV0dXJuICR0aGlzLT5jYWxsKCdmbGlja3IuYmxvZ3MucG9zdFBob3RvJywgYXJyYXkoJ2Jsb2dfaWQnID0+ICRibG9nX2lkLCAncGhvdG9faWQnID0+ICRwaG90b19pZCwgJ3RpdGxlJyA9PiAkdGl0bGUsICdkZXNjcmlwdGlvbicgPT4gJGRlc2NyaXB0aW9uLCAnYmxvZ19wYXNzd29yZCcgPT4gJGJsb2dfcGFzc3dvcmQsICdzZXJ2aWNlJyA9PiAkc2VydmljZSkpOwoJCX0KCgkJLyogQ29sbGVjdGlvbnMgTWV0aG9kcyAqLwoJCWZ1bmN0aW9uIGNvbGxlY3Rpb25zX2dldEluZm8gKCRjb2xsZWN0aW9uX2lkKSB7CgkJCS8qIGh0dHA6Ly93d3cuZmxpY2tyLmNvbS9zZXJ2aWNlcy9hcGkvZmxpY2tyLmNvbGxlY3Rpb25zLmdldEluZm8uaHRtbCAqLwoJCQlyZXR1cm4gJHRoaXMtPmNhbGwoJ2ZsaWNrci5jb2xsZWN0aW9ucy5nZXRJbmZvJywgYXJyYXkoJ2NvbGxlY3Rpb25faWQnID0+ICRjb2xsZWN0aW9uX2lkKSk7CgkJfQoKCQlmdW5jdGlvbiBjb2xsZWN0aW9uc19nZXRUcmVlICgkY29sbGVjdGlvbl9pZCA9IE5VTEwsICR1c2VyX2lkID0gTlVMTCkgewoJCQkvKiBodHRwOi8vd3d3LmZsaWNrci5jb20vc2VydmljZXMvYXBpL2ZsaWNrci5jb2xsZWN0aW9ucy5nZXRUcmVlLmh0bWwgKi8KCQkJcmV0dXJuICR0aGlzLT5jYWxsKCdmbGlja3IuY29sbGVjdGlvbnMuZ2V0VHJlZScsIGFycmF5KCdjb2xsZWN0aW9uX2lkJyA9PiAkY29sbGVjdGlvbl9pZCwgJ3VzZXJfaWQnID0+ICR1c2VyX2lkKSk7CgkJfQoJCQoJCS8qIENvbW1vbnMgTWV0aG9kcyAqLwoJCWZ1bmN0aW9uIGNvbW1vbnNfZ2V0SW5zdGl0dXRpb25zICgpIHsKCQkJLyogaHR0cDovL3d3dy5mbGlja3IuY29tL3NlcnZpY2VzL2FwaS9mbGlja3IuY29tbW9ucy5nZXRJbnN0aXR1dGlvbnMuaHRtbCAqLwoJCQlyZXR1cm4gJHRoaXMtPmNhbGwoJ2ZsaWNrci5jb21tb25zLmdldEluc3RpdHV0aW9ucycsIGFycmF5KCkpOwoJCX0KCQkKCQkvKiBDb250YWN0cyBNZXRob2RzICovCgkJZnVuY3Rpb24gY29udGFjdHNfZ2V0TGlzdCAoJGZpbHRlciA9IE5VTEwsICRwYWdlID0gTlVMTCwgJHBlcl9wYWdlID0gTlVMTCkgewoJCQkvKiBodHRwOi8vd3d3LmZsaWNrci5jb20vc2VydmljZXMvYXBpL2ZsaWNrci5jb250YWN0cy5nZXRMaXN0Lmh0bWwgKi8KCQkJJHRoaXMtPnJlcXVlc3QoJ2ZsaWNrci5jb250YWN0cy5nZXRMaXN0JywgYXJyYXkoJ2ZpbHRlcic9PiRmaWx0ZXIsICdwYWdlJz0+JHBhZ2UsICdwZXJfcGFnZSc9PiRwZXJfcGFnZSkpOwoJCQlyZXR1cm4gJHRoaXMtPnBhcnNlZF9yZXNwb25zZSA/ICR0aGlzLT5wYXJzZWRfcmVzcG9uc2VbJ2NvbnRhY3RzJ10gOiBmYWxzZTsKCQl9CgoJCWZ1bmN0aW9uIGNvbnRhY3RzX2dldFB1YmxpY0xpc3QgKCR1c2VyX2lkLCAkcGFnZSA9IE5VTEwsICRwZXJfcGFnZSA9IE5VTEwpIHsKCQkJLyogaHR0cDovL3d3dy5mbGlja3IuY29tL3NlcnZpY2VzL2FwaS9mbGlja3IuY29udGFjdHMuZ2V0UHVibGljTGlzdC5odG1sICovCgkJCSR0aGlzLT5yZXF1ZXN0KCdmbGlja3IuY29udGFjdHMuZ2V0UHVibGljTGlzdCcsIGFycmF5KCd1c2VyX2lkJz0+JHVzZXJfaWQsICdwYWdlJz0+JHBhZ2UsICdwZXJfcGFnZSc9PiRwZXJfcGFnZSkpOwoJCQlyZXR1cm4gJHRoaXMtPnBhcnNlZF9yZXNwb25zZSA/ICR0aGlzLT5wYXJzZWRfcmVzcG9uc2VbJ2NvbnRhY3RzJ10gOiBmYWxzZTsKCQl9CgkJCgkJZnVuY3Rpb24gY29udGFjdHNfZ2V0TGlzdFJlY2VudGx5VXBsb2FkZWQgKCRkYXRlX2xhc3R1cGxvYWQgPSBOVUxMLCAkZmlsdGVyID0gTlVMTCkgewoJCQkvKiBodHRwOi8vd3d3LmZsaWNrci5jb20vc2VydmljZXMvYXBpL2ZsaWNrci5jb250YWN0cy5nZXRMaXN0UmVjZW50bHlVcGxvYWRlZC5odG1sICovCgkJCXJldHVybiAkdGhpcy0+Y2FsbCgnZmxpY2tyLmNvbnRhY3RzLmdldExpc3RSZWNlbnRseVVwbG9hZGVkJywgYXJyYXkoJ2RhdGVfbGFzdHVwbG9hZCcgPT4gJGRhdGVfbGFzdHVwbG9hZCwgJ2ZpbHRlcicgPT4gJGZpbHRlcikpOwoJCX0KCgkJLyogRmF2b3JpdGVzIE1ldGhvZHMgKi8KCQlmdW5jdGlvbiBmYXZvcml0ZXNfYWRkICgkcGhvdG9faWQpIHsKCQkJLyogaHR0cDovL3d3dy5mbGlja3IuY29tL3NlcnZpY2VzL2FwaS9mbGlja3IuZmF2b3JpdGVzLmFkZC5odG1sICovCgkJCSR0aGlzLT5yZXF1ZXN0KCdmbGlja3IuZmF2b3JpdGVzLmFkZCcsIGFycmF5KCdwaG90b19pZCc9PiRwaG90b19pZCksIFRSVUUpOwoJCQlyZXR1cm4gJHRoaXMtPnBhcnNlZF9yZXNwb25zZSA/IHRydWUgOiBmYWxzZTsKCQl9CgoJCWZ1bmN0aW9uIGZhdm9yaXRlc19nZXRMaXN0ICgkdXNlcl9pZCA9IE5VTEwsICRqdW1wX3RvID0gTlVMTCwgJG1pbl9mYXZlX2RhdGUgPSBOVUxMLCAkbWF4X2ZhdmVfZGF0ZSA9IE5VTEwsICRleHRyYXMgPSBOVUxMLCAkcGVyX3BhZ2UgPSBOVUxMLCAkcGFnZSA9IE5VTEwpIHsKCQkJLyogaHR0cDovL3d3dy5mbGlja3IuY29tL3NlcnZpY2VzL2FwaS9mbGlja3IuZmF2b3JpdGVzLmdldExpc3QuaHRtbCAqLwoJCQlyZXR1cm4gJHRoaXMtPmNhbGwoJ2ZsaWNrci5mYXZvcml0ZXMuZ2V0TGlzdCcsIGFycmF5KCd1c2VyX2lkJyA9PiAkdXNlcl9pZCwgJ2p1bXBfdG8nID0+ICRqdW1wX3RvLCAnbWluX2ZhdmVfZGF0ZScgPT4gJG1pbl9mYXZlX2RhdGUsICdtYXhfZmF2ZV9kYXRlJyA9PiAkbWF4X2ZhdmVfZGF0ZSwgJ2V4dHJhcycgPT4gJGV4dHJhcywgJ3Blcl9wYWdlJyA9PiAkcGVyX3BhZ2UsICdwYWdlJyA9PiAkcGFnZSkpOwoJCX0KCQkKCQlmdW5jdGlvbiBmYXZvcml0ZXNfZ2V0UHVibGljTGlzdCAoJHVzZXJfaWQsICRqdW1wX3RvID0gTlVMTCwgJG1pbl9mYXZlX2RhdGUgPSBOVUxMLCAkbWF4X2ZhdmVfZGF0ZSA9IE5VTEwsICRleHRyYXMgPSBOVUxMLCAkcGVyX3BhZ2UgPSBOVUxMLCAkcGFnZSA9IE5VTEwpIHsKCQkJLyogaHR0cDovL3d3dy5mbGlja3IuY29tL3NlcnZpY2VzL2FwaS9mbGlja3IuZmF2b3JpdGVzLmdldFB1YmxpY0xpc3QuaHRtbCAqLwoJCQlyZXR1cm4gJHRoaXMtPmNhbGwoJ2ZsaWNrci5mYXZvcml0ZXMuZ2V0UHVibGljTGlzdCcsIGFycmF5KCd1c2VyX2lkJyA9PiAkdXNlcl9pZCwgJ2p1bXBfdG8nID0+ICRqdW1wX3RvLCAnbWluX2ZhdmVfZGF0ZScgPT4gJG1pbl9mYXZlX2RhdGUsICdtYXhfZmF2ZV9kYXRlJyA9PiAkbWF4X2ZhdmVfZGF0ZSwgJ2V4dHJhcycgPT4gJGV4dHJhcywgJ3Blcl9wYWdlJyA9PiAkcGVyX3BhZ2UsICdwYWdlJyA9PiAkcGFnZSkpOwoJCX0KCQkKCQlmdW5jdGlvbiBmYXZvcml0ZXNfcmVtb3ZlICgkcGhvdG9faWQsICR1c2VyX2lkID0gTlVMTCkgewoJCQkvKiBodHRwOi8vd3d3LmZsaWNrci5jb20vc2VydmljZXMvYXBpL2ZsaWNrci5mYXZvcml0ZXMucmVtb3ZlLmh0bWwgKi8KCQkJJHRoaXMtPnJlcXVlc3QoImZsaWNrci5mYXZvcml0ZXMucmVtb3ZlIiwgYXJyYXkoJ3Bob3RvX2lkJyA9PiAkcGhvdG9faWQsICd1c2VyX2lkJyA9PiAkdXNlcl9pZCksIFRSVUUpOwoJCQlyZXR1cm4gJHRoaXMtPnBhcnNlZF9yZXNwb25zZSA/IHRydWUgOiBmYWxzZTsKCQl9CgoJCS8qIEdhbGxlcmllcyBNZXRob2RzICovCgkJZnVuY3Rpb24gZ2FsbGVyaWVzX2FkZFBob3RvICgkZ2FsbGVyeV9pZCwgJHBob3RvX2lkLCAkY29tbWVudCA9IE5VTEwpIHsKCQkJLyogaHR0cDovL3d3dy5mbGlja3IuY29tL3NlcnZpY2VzL2FwaS9mbGlja3IuZ2FsbGVyaWVzLmFkZFBob3RvLmh0bWwgKi8KCQkJcmV0dXJuICR0aGlzLT5jYWxsKCdmbGlja3IuZ2FsbGVyaWVzLmFkZFBob3RvJywgYXJyYXkoJ2dhbGxlcnlfaWQnID0+ICRnYWxsZXJ5X2lkLCAncGhvdG9faWQnID0+ICRwaG90b19pZCwgJ2NvbW1lbnQnID0+ICRjb21tZW50KSk7CgkJfQoJCQoJCWZ1bmN0aW9uIGdhbGxlcmllc19jcmVhdGUgKCR0aXRsZSwgJGRlc2NyaXB0aW9uLCAkcHJpbWFyeV9waG90b19pZCA9IE5VTEwpIHsKCQkJLyogaHR0cDovL3d3dy5mbGlja3IuY29tL3NlcnZpY2VzL2FwaS9mbGlja3IuZ2FsbGVyaWVzLmNyZWF0ZS5odG1sICovCgkJCXJldHVybiAkdGhpcy0+Y2FsbCgnZmxpY2tyLmdhbGxlcmllcy5jcmVhdGUnLCBhcnJheSgndGl0bGUnID0+ICR0aXRsZSwgJ2Rlc2NyaXB0aW9uJyA9PiAkZGVzY3JpcHRpb24sICdwcmltYXJ5X3Bob3RvX2lkJyA9PiAkcHJpbWFyeV9waG90b19pZCkpOwoJCX0KCgkJZnVuY3Rpb24gZ2FsbGVyaWVzX2VkaXRNZXRhICgkZ2FsbGVyeV9pZCwgJHRpdGxlLCAkZGVzY3JpcHRpb24gPSBOVUxMKSB7CgkJCS8qIGh0dHA6Ly93d3cuZmxpY2tyLmNvbS9zZXJ2aWNlcy9hcGkvZmxpY2tyLmdhbGxlcmllcy5lZGl0TWV0YS5odG1sICovCgkJCXJldHVybiAkdGhpcy0+Y2FsbCgnZmxpY2tyLmdhbGxlcmllcy5lZGl0TWV0YScsIGFycmF5KCdnYWxsZXJ5X2lkJyA9PiAkZ2FsbGVyeV9pZCwgJ3RpdGxlJyA9PiAkdGl0bGUsICdkZXNjcmlwdGlvbicgPT4gJGRlc2NyaXB0aW9uKSk7CgkJfQoKCQlmdW5jdGlvbiBnYWxsZXJpZXNfZWRpdFBob3RvICgkZ2FsbGVyeV9pZCwgJHBob3RvX2lkLCAkY29tbWVudCkgewoJCQkvKiBodHRwOi8vd3d3LmZsaWNrci5jb20vc2VydmljZXMvYXBpL2ZsaWNrci5nYWxsZXJpZXMuZWRpdFBob3RvLmh0bWwgKi8KCQkJcmV0dXJuICR0aGlzLT5jYWxsKCdmbGlja3IuZ2FsbGVyaWVzLmVkaXRQaG90bycsIGFycmF5KCdnYWxsZXJ5X2lkJyA9PiAkZ2FsbGVyeV9pZCwgJ3Bob3RvX2lkJyA9PiAkcGhvdG9faWQsICdjb21tZW50JyA9PiAkY29tbWVudCkpOwoJCX0KCgkJZnVuY3Rpb24gZ2FsbGVyaWVzX2VkaXRQaG90b3MgKCRnYWxsZXJ5X2lkLCAkcHJpbWFyeV9waG90b19pZCwgJHBob3RvX2lkcykgewoJCQkvKiBodHRwOi8vd3d3LmZsaWNrci5jb20vc2VydmljZXMvYXBpL2ZsaWNrci5nYWxsZXJpZXMuZWRpdFBob3Rvcy5odG1sICovCgkJCXJldHVybiAkdGhpcy0+Y2FsbCgnZmxpY2tyLmdhbGxlcmllcy5lZGl0UGhvdG9zJywgYXJyYXkoJ2dhbGxlcnlfaWQnID0+ICRnYWxsZXJ5X2lkLCAncHJpbWFyeV9waG90b19pZCcgPT4gJHByaW1hcnlfcGhvdG9faWQsICdwaG90b19pZHMnID0+ICRwaG90b19pZHMpKTsKCQl9CgoJCWZ1bmN0aW9uIGdhbGxlcmllc19nZXRJbmZvICgkZ2FsbGVyeV9pZCkgewoJCQkvKiBodHRwOi8vd3d3LmZsaWNrci5jb20vc2VydmljZXMvYXBpL2ZsaWNrci5nYWxsZXJpZXMuZ2V0SW5mby5odG1sICovCgkJCXJldHVybiAkdGhpcy0+Y2FsbCgnZmxpY2tyLmdhbGxlcmllcy5nZXRJbmZvJywgYXJyYXkoJ2dhbGxlcnlfaWQnID0+ICRnYWxsZXJ5X2lkKSk7CgkJfQoKCQlmdW5jdGlvbiBnYWxsZXJpZXNfZ2V0TGlzdCAoJHVzZXJfaWQsICRwZXJfcGFnZSA9IE5VTEwsICRwYWdlID0gTlVMTCkgewoJCQkvKiBodHRwOi8vd3d3LmZsaWNrci5jb20vc2VydmljZXMvYXBpL2ZsaWNrci5nYWxsZXJpZXMuZ2V0TGlzdC5odG1sICovCgkJCXJldHVybiAkdGhpcy0+Y2FsbCgnZmxpY2tyLmdhbGxlcmllcy5nZXRMaXN0JywgYXJyYXkoJ3VzZXJfaWQnID0+ICR1c2VyX2lkLCAncGVyX3BhZ2UnID0+ICRwZXJfcGFnZSwgJ3BhZ2UnID0+ICRwYWdlKSk7CgkJfQoKCQlmdW5jdGlvbiBnYWxsZXJpZXNfZ2V0TGlzdEZvclBob3RvICgkcGhvdG9faWQsICRwZXJfcGFnZSA9IE5VTEwsICRwYWdlID0gTlVMTCkgewoJCQkvKiBodHRwOi8vd3d3LmZsaWNrci5jb20vc2VydmljZXMvYXBpL2ZsaWNrci5nYWxsZXJpZXMuZ2V0TGlzdEZvclBob3RvLmh0bWwgKi8KCQkJcmV0dXJuICR0aGlzLT5jYWxsKCdmbGlja3IuZ2FsbGVyaWVzLmdldExpc3RGb3JQaG90bycsIGFycmF5KCdwaG90b19pZCcgPT4gJHBob3RvX2lkLCAncGVyX3BhZ2UnID0+ICRwZXJfcGFnZSwgJ3BhZ2UnID0+ICRwYWdlKSk7CgkJfQoJCQkKCQlmdW5jdGlvbiBnYWxsZXJpZXNfZ2V0UGhvdG9zICgkZ2FsbGVyeV9pZCwgJGV4dHJhcyA9IE5VTEwsICRwZXJfcGFnZSA9IE5VTEwsICRwYWdlID0gTlVMTCkgewoJCQkvKiBodHRwOi8vd3d3LmZsaWNrci5jb20vc2VydmljZXMvYXBpL2ZsaWNrci5nYWxsZXJpZXMuZ2V0UGhvdG9zLmh0bWwgKi8KCQkJcmV0dXJuICR0aGlzLT5jYWxsKCdmbGlja3IuZ2FsbGVyaWVzLmdldFBob3RvcycsIGFycmF5KCdnYWxsZXJ5X2lkJyA9PiAkZ2FsbGVyeV9pZCwgJ2V4dHJhcycgPT4gJGV4dHJhcywgJ3Blcl9wYWdlJyA9PiAkcGVyX3BhZ2UsICdwYWdlJyA9PiAkcGFnZSkpOwoJCX0KCgkJLyogR3JvdXBzIE1ldGhvZHMgKi8KCQlmdW5jdGlvbiBncm91cHNfYnJvd3NlICgkY2F0X2lkID0gTlVMTCkgewoJCQkvKiBodHRwOi8vd3d3LmZsaWNrci5jb20vc2VydmljZXMvYXBpL2ZsaWNrci5ncm91cHMuYnJvd3NlLmh0bWwgKi8KCQkJJHRoaXMtPnJlcXVlc3QoImZsaWNrci5ncm91cHMuYnJvd3NlIiwgYXJyYXkoImNhdF9pZCI9PiRjYXRfaWQpKTsKCQkJcmV0dXJuICR0aGlzLT5wYXJzZWRfcmVzcG9uc2UgPyAkdGhpcy0+cGFyc2VkX3Jlc3BvbnNlWydjYXRlZ29yeSddIDogZmFsc2U7CgkJfQoKCQlmdW5jdGlvbiBncm91cHNfZ2V0SW5mbyAoJGdyb3VwX2lkLCAkbGFuZyA9IE5VTEwpIHsKCQkJLyogaHR0cDovL3d3dy5mbGlja3IuY29tL3NlcnZpY2VzL2FwaS9mbGlja3IuZ3JvdXBzLmdldEluZm8uaHRtbCAqLwoJCQlyZXR1cm4gJHRoaXMtPmNhbGwoJ2ZsaWNrci5ncm91cHMuZ2V0SW5mbycsIGFycmF5KCdncm91cF9pZCcgPT4gJGdyb3VwX2lkLCAnbGFuZycgPT4gJGxhbmcpKTsKCQl9CgoJCWZ1bmN0aW9uIGdyb3Vwc19zZWFyY2ggKCR0ZXh0LCAkcGVyX3BhZ2UgPSBOVUxMLCAkcGFnZSA9IE5VTEwpIHsKCQkJLyogaHR0cDovL3d3dy5mbGlja3IuY29tL3NlcnZpY2VzL2FwaS9mbGlja3IuZ3JvdXBzLnNlYXJjaC5odG1sICovCgkJCSR0aGlzLT5yZXF1ZXN0KCJmbGlja3IuZ3JvdXBzLnNlYXJjaCIsIGFycmF5KCJ0ZXh0Ij0+JHRleHQsInBlcl9wYWdlIj0+JHBlcl9wYWdlLCJwYWdlIj0+JHBhZ2UpKTsKCQkJcmV0dXJuICR0aGlzLT5wYXJzZWRfcmVzcG9uc2UgPyAkdGhpcy0+cGFyc2VkX3Jlc3BvbnNlWydncm91cHMnXSA6IGZhbHNlOwoJCX0KCgkJLyogR3JvdXBzIE1lbWJlcnMgTWV0aG9kcyAqLwoJCWZ1bmN0aW9uIGdyb3Vwc19tZW1iZXJzX2dldExpc3QgKCRncm91cF9pZCwgJG1lbWJlcnR5cGVzID0gTlVMTCwgJHBlcl9wYWdlID0gTlVMTCwgJHBhZ2UgPSBOVUxMKSB7CgkJCS8qIGh0dHA6Ly93d3cuZmxpY2tyLmNvbS9zZXJ2aWNlcy9hcGkvZmxpY2tyLmdyb3Vwcy5tZW1iZXJzLmdldExpc3QuaHRtbCAqLwoJCQlyZXR1cm4gJHRoaXMtPmNhbGwoJ2ZsaWNrci5ncm91cHMubWVtYmVycy5nZXRMaXN0JywgYXJyYXkoJ2dyb3VwX2lkJyA9PiAkZ3JvdXBfaWQsICdtZW1iZXJ0eXBlcycgPT4gJG1lbWJlcnR5cGVzLCAncGVyX3BhZ2UnID0+ICRwZXJfcGFnZSwgJ3BhZ2UnID0+ICRwYWdlKSk7CgkJfQoJCQoJCS8qIEdyb3VwcyBQb29scyBNZXRob2RzICovCgkJZnVuY3Rpb24gZ3JvdXBzX3Bvb2xzX2FkZCAoJHBob3RvX2lkLCAkZ3JvdXBfaWQpIHsKCQkJLyogaHR0cDovL3d3dy5mbGlja3IuY29tL3NlcnZpY2VzL2FwaS9mbGlja3IuZ3JvdXBzLnBvb2xzLmFkZC5odG1sICovCgkJCSR0aGlzLT5yZXF1ZXN0KCJmbGlja3IuZ3JvdXBzLnBvb2xzLmFkZCIsIGFycmF5KCJwaG90b19pZCI9PiRwaG90b19pZCwgImdyb3VwX2lkIj0+JGdyb3VwX2lkKSwgVFJVRSk7CgkJCXJldHVybiAkdGhpcy0+cGFyc2VkX3Jlc3BvbnNlID8gdHJ1ZSA6IGZhbHNlOwoJCX0KCgkJZnVuY3Rpb24gZ3JvdXBzX3Bvb2xzX2dldENvbnRleHQgKCRwaG90b19pZCwgJGdyb3VwX2lkLCAkbnVtX3ByZXYgPSBOVUxMLCAkbnVtX25leHQgPSBOVUxMKSB7CgkJCS8qIGh0dHA6Ly93d3cuZmxpY2tyLmNvbS9zZXJ2aWNlcy9hcGkvZmxpY2tyLmdyb3Vwcy5wb29scy5nZXRDb250ZXh0Lmh0bWwgKi8KCQkJcmV0dXJuICR0aGlzLT5jYWxsKCdmbGlja3IuZ3JvdXBzLnBvb2xzLmdldENvbnRleHQnLCBhcnJheSgncGhvdG9faWQnID0+ICRwaG90b19pZCwgJ2dyb3VwX2lkJyA9PiAkZ3JvdXBfaWQsICdudW1fcHJldicgPT4gJG51bV9wcmV2LCAnbnVtX25leHQnID0+ICRudW1fbmV4dCkpOwoJCX0KCQkKCQlmdW5jdGlvbiBncm91cHNfcG9vbHNfZ2V0R3JvdXBzICgkcGFnZSA9IE5VTEwsICRwZXJfcGFnZSA9IE5VTEwpIHsKCQkJLyogaHR0cDovL3d3dy5mbGlja3IuY29tL3NlcnZpY2VzL2FwaS9mbGlja3IuZ3JvdXBzLnBvb2xzLmdldEdyb3Vwcy5odG1sICovCgkJCSR0aGlzLT5yZXF1ZXN0KCJmbGlja3IuZ3JvdXBzLnBvb2xzLmdldEdyb3VwcyIsIGFycmF5KCdwYWdlJz0+JHBhZ2UsICdwZXJfcGFnZSc9PiRwZXJfcGFnZSkpOwoJCQlyZXR1cm4gJHRoaXMtPnBhcnNlZF9yZXNwb25zZSA/ICR0aGlzLT5wYXJzZWRfcmVzcG9uc2VbJ2dyb3VwcyddIDogZmFsc2U7CgkJfQoKCQlmdW5jdGlvbiBncm91cHNfcG9vbHNfZ2V0UGhvdG9zICgkZ3JvdXBfaWQsICR0YWdzID0gTlVMTCwgJHVzZXJfaWQgPSBOVUxMLCAkanVtcF90byA9IE5VTEwsICRleHRyYXMgPSBOVUxMLCAkcGVyX3BhZ2UgPSBOVUxMLCAkcGFnZSA9IE5VTEwpIHsKCQkJLyogaHR0cDovL3d3dy5mbGlja3IuY29tL3NlcnZpY2VzL2FwaS9mbGlja3IuZ3JvdXBzLnBvb2xzLmdldFBob3Rvcy5odG1sICovCgkJCWlmIChpc19hcnJheSgkZXh0cmFzKSkgewoJCQkJJGV4dHJhcyA9IGltcGxvZGUoIiwiLCAkZXh0cmFzKTsKCQkJfQoJCQlyZXR1cm4gJHRoaXMtPmNhbGwoJ2ZsaWNrci5ncm91cHMucG9vbHMuZ2V0UGhvdG9zJywgYXJyYXkoJ2dyb3VwX2lkJyA9PiAkZ3JvdXBfaWQsICd0YWdzJyA9PiAkdGFncywgJ3VzZXJfaWQnID0+ICR1c2VyX2lkLCAnanVtcF90bycgPT4gJGp1bXBfdG8sICdleHRyYXMnID0+ICRleHRyYXMsICdwZXJfcGFnZScgPT4gJHBlcl9wYWdlLCAncGFnZScgPT4gJHBhZ2UpKTsKCQl9CgoJCWZ1bmN0aW9uIGdyb3Vwc19wb29sc19yZW1vdmUgKCRwaG90b19pZCwgJGdyb3VwX2lkKSB7CgkJCS8qIGh0dHA6Ly93d3cuZmxpY2tyLmNvbS9zZXJ2aWNlcy9hcGkvZmxpY2tyLmdyb3Vwcy5wb29scy5yZW1vdmUuaHRtbCAqLwoJCQkkdGhpcy0+cmVxdWVzdCgiZmxpY2tyLmdyb3Vwcy5wb29scy5yZW1vdmUiLCBhcnJheSgicGhvdG9faWQiPT4kcGhvdG9faWQsICJncm91cF9pZCI9PiRncm91cF9pZCksIFRSVUUpOwoJCQlyZXR1cm4gJHRoaXMtPnBhcnNlZF9yZXNwb25zZSA/IHRydWUgOiBmYWxzZTsKCQl9CgoJCS8qIEludGVyZXN0aW5nbmVzcyBtZXRob2RzICovCgkJZnVuY3Rpb24gaW50ZXJlc3RpbmduZXNzX2dldExpc3QgKCRkYXRlID0gTlVMTCwgJHVzZV9wYW5kYSA9IE5VTEwsICRleHRyYXMgPSBOVUxMLCAkcGVyX3BhZ2UgPSBOVUxMLCAkcGFnZSA9IE5VTEwpIHsKCQkJLyogaHR0cDovL3d3dy5mbGlja3IuY29tL3NlcnZpY2VzL2FwaS9mbGlja3IuaW50ZXJlc3RpbmduZXNzLmdldExpc3QuaHRtbCAqLwoJCQlpZiAoaXNfYXJyYXkoJGV4dHJhcykpIHsKCQkJCSRleHRyYXMgPSBpbXBsb2RlKCIsIiwgJGV4dHJhcyk7CgkJCX0KCgkJCXJldHVybiAkdGhpcy0+Y2FsbCgnZmxpY2tyLmludGVyZXN0aW5nbmVzcy5nZXRMaXN0JywgYXJyYXkoJ2RhdGUnID0+ICRkYXRlLCAndXNlX3BhbmRhJyA9PiAkdXNlX3BhbmRhLCAnZXh0cmFzJyA9PiAkZXh0cmFzLCAncGVyX3BhZ2UnID0+ICRwZXJfcGFnZSwgJ3BhZ2UnID0+ICRwYWdlKSk7CgkJfQoKCQkvKiBNYWNoaW5lIFRhZyBtZXRob2RzICovCgkJZnVuY3Rpb24gbWFjaGluZXRhZ3NfZ2V0TmFtZXNwYWNlcyAoJHByZWRpY2F0ZSA9IE5VTEwsICRwZXJfcGFnZSA9IE5VTEwsICRwYWdlID0gTlVMTCkgewoJCQkvKiBodHRwOi8vd3d3LmZsaWNrci5jb20vc2VydmljZXMvYXBpL2ZsaWNrci5tYWNoaW5ldGFncy5nZXROYW1lc3BhY2VzLmh0bWwgKi8KCQkJcmV0dXJuICR0aGlzLT5jYWxsKCdmbGlja3IubWFjaGluZXRhZ3MuZ2V0TmFtZXNwYWNlcycsIGFycmF5KCdwcmVkaWNhdGUnID0+ICRwcmVkaWNhdGUsICdwZXJfcGFnZScgPT4gJHBlcl9wYWdlLCAncGFnZScgPT4gJHBhZ2UpKTsKCQl9CgoJCWZ1bmN0aW9uIG1hY2hpbmV0YWdzX2dldFBhaXJzICgkbmFtZXNwYWNlID0gTlVMTCwgJHByZWRpY2F0ZSA9IE5VTEwsICRwZXJfcGFnZSA9IE5VTEwsICRwYWdlID0gTlVMTCkgewoJCQkvKiBodHRwOi8vd3d3LmZsaWNrci5jb20vc2VydmljZXMvYXBpL2ZsaWNrci5tYWNoaW5ldGFncy5nZXRQYWlycy5odG1sICovCgkJCXJldHVybiAkdGhpcy0+Y2FsbCgnZmxpY2tyLm1hY2hpbmV0YWdzLmdldFBhaXJzJywgYXJyYXkoJ25hbWVzcGFjZScgPT4gJG5hbWVzcGFjZSwgJ3ByZWRpY2F0ZScgPT4gJHByZWRpY2F0ZSwgJ3Blcl9wYWdlJyA9PiAkcGVyX3BhZ2UsICdwYWdlJyA9PiAkcGFnZSkpOwoJCX0KCgkJZnVuY3Rpb24gbWFjaGluZXRhZ3NfZ2V0UHJlZGljYXRlcyAoJG5hbWVzcGFjZSA9IE5VTEwsICRwZXJfcGFnZSA9IE5VTEwsICRwYWdlID0gTlVMTCkgewoJCQkvKiBodHRwOi8vd3d3LmZsaWNrci5jb20vc2VydmljZXMvYXBpL2ZsaWNrci5tYWNoaW5ldGFncy5nZXRQcmVkaWNhdGVzLmh0bWwgKi8KCQkJcmV0dXJuICR0aGlzLT5jYWxsKCdmbGlja3IubWFjaGluZXRhZ3MuZ2V0UHJlZGljYXRlcycsIGFycmF5KCduYW1lc3BhY2UnID0+ICRuYW1lc3BhY2UsICdwZXJfcGFnZScgPT4gJHBlcl9wYWdlLCAncGFnZScgPT4gJHBhZ2UpKTsKCQl9CgkJCgkJZnVuY3Rpb24gbWFjaGluZXRhZ3NfZ2V0UmVjZW50VmFsdWVzICgkbmFtZXNwYWNlID0gTlVMTCwgJHByZWRpY2F0ZSA9IE5VTEwsICRhZGRlZF9zaW5jZSA9IE5VTEwpIHsKCQkJLyogaHR0cDovL3d3dy5mbGlja3IuY29tL3NlcnZpY2VzL2FwaS9mbGlja3IubWFjaGluZXRhZ3MuZ2V0UmVjZW50VmFsdWVzLmh0bWwgKi8KCQkJcmV0dXJuICR0aGlzLT5jYWxsKCdmbGlja3IubWFjaGluZXRhZ3MuZ2V0UmVjZW50VmFsdWVzJywgYXJyYXkoJ25hbWVzcGFjZScgPT4gJG5hbWVzcGFjZSwgJ3ByZWRpY2F0ZScgPT4gJHByZWRpY2F0ZSwgJ2FkZGVkX3NpbmNlJyA9PiAkYWRkZWRfc2luY2UpKTsKCQl9CgoJCWZ1bmN0aW9uIG1hY2hpbmV0YWdzX2dldFZhbHVlcyAoJG5hbWVzcGFjZSwgJHByZWRpY2F0ZSwgJHBlcl9wYWdlID0gTlVMTCwgJHBhZ2UgPSBOVUxMLCAkdXNhZ2UgPSBOVUxMKSB7CgkJCS8qIGh0dHA6Ly93d3cuZmxpY2tyLmNvbS9zZXJ2aWNlcy9hcGkvZmxpY2tyLm1hY2hpbmV0YWdzLmdldFZhbHVlcy5odG1sICovCgkJCXJldHVybiAkdGhpcy0+Y2FsbCgnZmxpY2tyLm1hY2hpbmV0YWdzLmdldFZhbHVlcycsIGFycmF5KCduYW1lc3BhY2UnID0+ICRuYW1lc3BhY2UsICdwcmVkaWNhdGUnID0+ICRwcmVkaWNhdGUsICdwZXJfcGFnZScgPT4gJHBlcl9wYWdlLCAncGFnZScgPT4gJHBhZ2UsICd1c2FnZScgPT4gJHVzYWdlKSk7CgkJfQoJCQoJCS8qIFBhbmRhIG1ldGhvZHMgKi8KCQlmdW5jdGlvbiBwYW5kYV9nZXRMaXN0ICgpIHsKCQkJLyogaHR0cDovL3d3dy5mbGlja3IuY29tL3NlcnZpY2VzL2FwaS9mbGlja3IucGFuZGEuZ2V0TGlzdC5odG1sICovCgkJCXJldHVybiAkdGhpcy0+Y2FsbCgnZmxpY2tyLnBhbmRhLmdldExpc3QnLCBhcnJheSgpKTsKCQl9CgoJCWZ1bmN0aW9uIHBhbmRhX2dldFBob3RvcyAoJHBhbmRhX25hbWUsICRleHRyYXMgPSBOVUxMLCAkcGVyX3BhZ2UgPSBOVUxMLCAkcGFnZSA9IE5VTEwpIHsKCQkJLyogaHR0cDovL3d3dy5mbGlja3IuY29tL3NlcnZpY2VzL2FwaS9mbGlja3IucGFuZGEuZ2V0UGhvdG9zLmh0bWwgKi8KCQkJcmV0dXJuICR0aGlzLT5jYWxsKCdmbGlja3IucGFuZGEuZ2V0UGhvdG9zJywgYXJyYXkoJ3BhbmRhX25hbWUnID0+ICRwYW5kYV9uYW1lLCAnZXh0cmFzJyA9PiAkZXh0cmFzLCAncGVyX3BhZ2UnID0+ICRwZXJfcGFnZSwgJ3BhZ2UnID0+ICRwYWdlKSk7CgkJfQoKCQkvKiBQZW9wbGUgbWV0aG9kcyAqLwoJCWZ1bmN0aW9uIHBlb3BsZV9maW5kQnlFbWFpbCAoJGZpbmRfZW1haWwpIHsKCQkJLyogaHR0cDovL3d3dy5mbGlja3IuY29tL3NlcnZpY2VzL2FwaS9mbGlja3IucGVvcGxlLmZpbmRCeUVtYWlsLmh0bWwgKi8KCQkJJHRoaXMtPnJlcXVlc3QoImZsaWNrci5wZW9wbGUuZmluZEJ5RW1haWwiLCBhcnJheSgiZmluZF9lbWFpbCI9PiRmaW5kX2VtYWlsKSk7CgkJCXJldHVybiAkdGhpcy0+cGFyc2VkX3Jlc3BvbnNlID8gJHRoaXMtPnBhcnNlZF9yZXNwb25zZVsndXNlciddIDogZmFsc2U7CgkJfQoKCQlmdW5jdGlvbiBwZW9wbGVfZmluZEJ5VXNlcm5hbWUgKCR1c2VybmFtZSkgewoJCQkvKiBodHRwOi8vd3d3LmZsaWNrci5jb20vc2VydmljZXMvYXBpL2ZsaWNrci5wZW9wbGUuZmluZEJ5VXNlcm5hbWUuaHRtbCAqLwoJCQkkdGhpcy0+cmVxdWVzdCgiZmxpY2tyLnBlb3BsZS5maW5kQnlVc2VybmFtZSIsIGFycmF5KCJ1c2VybmFtZSI9PiR1c2VybmFtZSkpOwoJCQlyZXR1cm4gJHRoaXMtPnBhcnNlZF9yZXNwb25zZSA/ICR0aGlzLT5wYXJzZWRfcmVzcG9uc2VbJ3VzZXInXSA6IGZhbHNlOwoJCX0KCgkJZnVuY3Rpb24gcGVvcGxlX2dldEluZm8gKCR1c2VyX2lkKSB7CgkJCS8qIGh0dHA6Ly93d3cuZmxpY2tyLmNvbS9zZXJ2aWNlcy9hcGkvZmxpY2tyLnBlb3BsZS5nZXRJbmZvLmh0bWwgKi8KCQkJJHRoaXMtPnJlcXVlc3QoImZsaWNrci5wZW9wbGUuZ2V0SW5mbyIsIGFycmF5KCJ1c2VyX2lkIj0+JHVzZXJfaWQpKTsKCQkJcmV0dXJuICR0aGlzLT5wYXJzZWRfcmVzcG9uc2UgPyAkdGhpcy0+cGFyc2VkX3Jlc3BvbnNlWydwZXJzb24nXSA6IGZhbHNlOwoJCX0KCgkJZnVuY3Rpb24gcGVvcGxlX2dldFBob3RvcyAoJHVzZXJfaWQsICRhcmdzID0gYXJyYXkoKSkgewoJCQkvKiBUaGlzIGZ1bmN0aW9uIHN0cmF5cyBmcm9tIHRoZSBtZXRob2Qgb2YgYXJndW1lbnRzIHRoYXQgSSd2ZQoJCQkgKiB1c2VkIGluIHRoZSBvdGhlciBmdW5jdGlvbnMgZm9yIHRoZSBmYWN0IHRoYXQgdGhlcmUgYXJlIGp1c3QKCQkJICogc28gbWFueSBhcmd1bWVudHMgdG8gdGhpcyBBUEkgbWV0aG9kLiBXaGF0IHlvdSdsbCBuZWVkIHRvIGRvCgkJCSAqIGlzIHBhc3MgYW4gYXNzb2NpYXRpdmUgYXJyYXkgdG8gdGhlIGZ1bmN0aW9uIGNvbnRhaW5pbmcgdGhlCgkJCSAqIGFyZ3VtZW50cyB5b3Ugd2FudCB0byBwYXNzIHRvIHRoZSBBUEkuICBGb3IgZXhhbXBsZToKCQkJICogICAkcGhvdG9zID0gJGYtPnBob3Rvc19zZWFyY2goYXJyYXkoInRhZ3MiPT4iYnJvd24sY293IiwgInRhZ19tb2RlIj0+ImFueSIpKTsKCQkJICogVGhpcyB3aWxsIHJldHVybiBwaG90b3MgdGFnZ2VkIHdpdGggZWl0aGVyICJicm93biIgb3IgImNvdyIKCQkJICogb3IgYm90aC4gU2VlIHRoZSBBUEkgZG9jdW1lbnRhdGlvbiAobGluayBiZWxvdykgZm9yIGEgZnVsbAoJCQkgKiBsaXN0IG9mIGFyZ3VtZW50cy4KCQkJICovCgoJCQkgLyogaHR0cDovL3d3dy5mbGlja3IuY29tL3NlcnZpY2VzL2FwaS9mbGlja3IucGVvcGxlLmdldFBob3Rvcy5odG1sICovCgkJCXJldHVybiAkdGhpcy0+Y2FsbCgnZmxpY2tyLnBlb3BsZS5nZXRQaG90b3MnLCBhcnJheV9tZXJnZShhcnJheSgndXNlcl9pZCcgPT4gJHVzZXJfaWQpLCAkYXJncykpOwoJCX0KCgkJZnVuY3Rpb24gcGVvcGxlX2dldFBob3Rvc09mICgkdXNlcl9pZCwgJGV4dHJhcyA9IE5VTEwsICRwZXJfcGFnZSA9IE5VTEwsICRwYWdlID0gTlVMTCkgewoJCQkvKiBodHRwOi8vd3d3LmZsaWNrci5jb20vc2VydmljZXMvYXBpL2ZsaWNrci5wZW9wbGUuZ2V0UGhvdG9zT2YuaHRtbCAqLwoJCQlyZXR1cm4gJHRoaXMtPmNhbGwoJ2ZsaWNrci5wZW9wbGUuZ2V0UGhvdG9zT2YnLCBhcnJheSgndXNlcl9pZCcgPT4gJHVzZXJfaWQsICdleHRyYXMnID0+ICRleHRyYXMsICdwZXJfcGFnZScgPT4gJHBlcl9wYWdlLCAncGFnZScgPT4gJHBhZ2UpKTsKCQl9CgkJCgkJZnVuY3Rpb24gcGVvcGxlX2dldFB1YmxpY0dyb3VwcyAoJHVzZXJfaWQpIHsKCQkJLyogaHR0cDovL3d3dy5mbGlja3IuY29tL3NlcnZpY2VzL2FwaS9mbGlja3IucGVvcGxlLmdldFB1YmxpY0dyb3Vwcy5odG1sICovCgkJCSR0aGlzLT5yZXF1ZXN0KCJmbGlja3IucGVvcGxlLmdldFB1YmxpY0dyb3VwcyIsIGFycmF5KCJ1c2VyX2lkIj0+JHVzZXJfaWQpKTsKCQkJcmV0dXJuICR0aGlzLT5wYXJzZWRfcmVzcG9uc2UgPyAkdGhpcy0+cGFyc2VkX3Jlc3BvbnNlWydncm91cHMnXVsnZ3JvdXAnXSA6IGZhbHNlOwoJCX0KCgkJZnVuY3Rpb24gcGVvcGxlX2dldFB1YmxpY1Bob3RvcyAoJHVzZXJfaWQsICRzYWZlX3NlYXJjaCA9IE5VTEwsICRleHRyYXMgPSBOVUxMLCAkcGVyX3BhZ2UgPSBOVUxMLCAkcGFnZSA9IE5VTEwpIHsKCQkJLyogaHR0cDovL3d3dy5mbGlja3IuY29tL3NlcnZpY2VzL2FwaS9mbGlja3IucGVvcGxlLmdldFB1YmxpY1Bob3Rvcy5odG1sICovCgkJCXJldHVybiAkdGhpcy0+Y2FsbCgnZmxpY2tyLnBlb3BsZS5nZXRQdWJsaWNQaG90b3MnLCBhcnJheSgndXNlcl9pZCcgPT4gJHVzZXJfaWQsICdzYWZlX3NlYXJjaCcgPT4gJHNhZmVfc2VhcmNoLCAnZXh0cmFzJyA9PiAkZXh0cmFzLCAncGVyX3BhZ2UnID0+ICRwZXJfcGFnZSwgJ3BhZ2UnID0+ICRwYWdlKSk7CgkJfQoKCQlmdW5jdGlvbiBwZW9wbGVfZ2V0VXBsb2FkU3RhdHVzICgpIHsKCQkJLyogaHR0cDovL3d3dy5mbGlja3IuY29tL3NlcnZpY2VzL2FwaS9mbGlja3IucGVvcGxlLmdldFVwbG9hZFN0YXR1cy5odG1sICovCgkJCS8qIFJlcXVpcmVzIEF1dGhlbnRpY2F0aW9uICovCgkJCSR0aGlzLT5yZXF1ZXN0KCJmbGlja3IucGVvcGxlLmdldFVwbG9hZFN0YXR1cyIpOwoJCQlyZXR1cm4gJHRoaXMtPnBhcnNlZF9yZXNwb25zZSA/ICR0aGlzLT5wYXJzZWRfcmVzcG9uc2VbJ3VzZXInXSA6IGZhbHNlOwoJCX0KCgoJCS8qIFBob3RvcyBNZXRob2RzICovCgkJZnVuY3Rpb24gcGhvdG9zX2FkZFRhZ3MgKCRwaG90b19pZCwgJHRhZ3MpIHsKCQkJLyogaHR0cDovL3d3dy5mbGlja3IuY29tL3NlcnZpY2VzL2FwaS9mbGlja3IucGhvdG9zLmFkZFRhZ3MuaHRtbCAqLwoJCQkkdGhpcy0+cmVxdWVzdCgiZmxpY2tyLnBob3Rvcy5hZGRUYWdzIiwgYXJyYXkoInBob3RvX2lkIj0+JHBob3RvX2lkLCAidGFncyI9PiR0YWdzKSwgVFJVRSk7CgkJCXJldHVybiAkdGhpcy0+cGFyc2VkX3Jlc3BvbnNlID8gdHJ1ZSA6IGZhbHNlOwoJCX0KCgkJZnVuY3Rpb24gcGhvdG9zX2RlbGV0ZSAoJHBob3RvX2lkKSB7CgkJCS8qIGh0dHA6Ly93d3cuZmxpY2tyLmNvbS9zZXJ2aWNlcy9hcGkvZmxpY2tyLnBob3Rvcy5kZWxldGUuaHRtbCAqLwoJCQkkdGhpcy0+cmVxdWVzdCgiZmxpY2tyLnBob3Rvcy5kZWxldGUiLCBhcnJheSgicGhvdG9faWQiPT4kcGhvdG9faWQpLCBUUlVFKTsKCQkJcmV0dXJuICR0aGlzLT5wYXJzZWRfcmVzcG9uc2UgPyB0cnVlIDogZmFsc2U7CgkJfQoKCQlmdW5jdGlvbiBwaG90b3NfZ2V0QWxsQ29udGV4dHMgKCRwaG90b19pZCkgewoJCQkvKiBodHRwOi8vd3d3LmZsaWNrci5jb20vc2VydmljZXMvYXBpL2ZsaWNrci5waG90b3MuZ2V0QWxsQ29udGV4dHMuaHRtbCAqLwoJCQkkdGhpcy0+cmVxdWVzdCgiZmxpY2tyLnBob3Rvcy5nZXRBbGxDb250ZXh0cyIsIGFycmF5KCJwaG90b19pZCI9PiRwaG90b19pZCkpOwoJCQlyZXR1cm4gJHRoaXMtPnBhcnNlZF9yZXNwb25zZSA/ICR0aGlzLT5wYXJzZWRfcmVzcG9uc2UgOiBmYWxzZTsKCQl9CgoJCWZ1bmN0aW9uIHBob3Rvc19nZXRDb250YWN0c1Bob3RvcyAoJGNvdW50ID0gTlVMTCwgJGp1c3RfZnJpZW5kcyA9IE5VTEwsICRzaW5nbGVfcGhvdG8gPSBOVUxMLCAkaW5jbHVkZV9zZWxmID0gTlVMTCwgJGV4dHJhcyA9IE5VTEwpIHsKCQkJLyogaHR0cDovL3d3dy5mbGlja3IuY29tL3NlcnZpY2VzL2FwaS9mbGlja3IucGhvdG9zLmdldENvbnRhY3RzUGhvdG9zLmh0bWwgKi8KCQkJJHRoaXMtPnJlcXVlc3QoImZsaWNrci5waG90b3MuZ2V0Q29udGFjdHNQaG90b3MiLCBhcnJheSgiY291bnQiPT4kY291bnQsICJqdXN0X2ZyaWVuZHMiPT4kanVzdF9mcmllbmRzLCAic2luZ2xlX3Bob3RvIj0+JHNpbmdsZV9waG90bywgImluY2x1ZGVfc2VsZiI9PiRpbmNsdWRlX3NlbGYsICJleHRyYXMiPT4kZXh0cmFzKSk7CgkJCXJldHVybiAkdGhpcy0+cGFyc2VkX3Jlc3BvbnNlID8gJHRoaXMtPnBhcnNlZF9yZXNwb25zZVsncGhvdG9zJ11bJ3Bob3RvJ10gOiBmYWxzZTsKCQl9CgoJCWZ1bmN0aW9uIHBob3Rvc19nZXRDb250YWN0c1B1YmxpY1Bob3RvcyAoJHVzZXJfaWQsICRjb3VudCA9IE5VTEwsICRqdXN0X2ZyaWVuZHMgPSBOVUxMLCAkc2luZ2xlX3Bob3RvID0gTlVMTCwgJGluY2x1ZGVfc2VsZiA9IE5VTEwsICRleHRyYXMgPSBOVUxMKSB7CgkJCS8qIGh0dHA6Ly93d3cuZmxpY2tyLmNvbS9zZXJ2aWNlcy9hcGkvZmxpY2tyLnBob3Rvcy5nZXRDb250YWN0c1B1YmxpY1Bob3Rvcy5odG1sICovCgkJCSR0aGlzLT5yZXF1ZXN0KCJmbGlja3IucGhvdG9zLmdldENvbnRhY3RzUHVibGljUGhvdG9zIiwgYXJyYXkoInVzZXJfaWQiPT4kdXNlcl9pZCwgImNvdW50Ij0+JGNvdW50LCAianVzdF9mcmllbmRzIj0+JGp1c3RfZnJpZW5kcywgInNpbmdsZV9waG90byI9PiRzaW5nbGVfcGhvdG8sICJpbmNsdWRlX3NlbGYiPT4kaW5jbHVkZV9zZWxmLCAiZXh0cmFzIj0+JGV4dHJhcykpOwoJCQlyZXR1cm4gJHRoaXMtPnBhcnNlZF9yZXNwb25zZSA/ICR0aGlzLT5wYXJzZWRfcmVzcG9uc2VbJ3Bob3RvcyddWydwaG90byddIDogZmFsc2U7CgkJfQoKCQlmdW5jdGlvbiBwaG90b3NfZ2V0Q29udGV4dCAoJHBob3RvX2lkLCAkbnVtX3ByZXYgPSBOVUxMLCAkbnVtX25leHQgPSBOVUxMLCAkZXh0cmFzID0gTlVMTCwgJG9yZGVyX2J5ID0gTlVMTCkgewoJCQkvKiBodHRwOi8vd3d3LmZsaWNrci5jb20vc2VydmljZXMvYXBpL2ZsaWNrci5waG90b3MuZ2V0Q29udGV4dC5odG1sICovCgkJCXJldHVybiAkdGhpcy0+Y2FsbCgnZmxpY2tyLnBob3Rvcy5nZXRDb250ZXh0JywgYXJyYXkoJ3Bob3RvX2lkJyA9PiAkcGhvdG9faWQsICdudW1fcHJldicgPT4gJG51bV9wcmV2LCAnbnVtX25leHQnID0+ICRudW1fbmV4dCwgJ2V4dHJhcycgPT4gJGV4dHJhcywgJ29yZGVyX2J5JyA9PiAkb3JkZXJfYnkpKTsKCQl9CgoJCWZ1bmN0aW9uIHBob3Rvc19nZXRDb3VudHMgKCRkYXRlcyA9IE5VTEwsICR0YWtlbl9kYXRlcyA9IE5VTEwpIHsKCQkJLyogaHR0cDovL3d3dy5mbGlja3IuY29tL3NlcnZpY2VzL2FwaS9mbGlja3IucGhvdG9zLmdldENvdW50cy5odG1sICovCgkJCSR0aGlzLT5yZXF1ZXN0KCJmbGlja3IucGhvdG9zLmdldENvdW50cyIsIGFycmF5KCJkYXRlcyI9PiRkYXRlcywgInRha2VuX2RhdGVzIj0+JHRha2VuX2RhdGVzKSk7CgkJCXJldHVybiAkdGhpcy0+cGFyc2VkX3Jlc3BvbnNlID8gJHRoaXMtPnBhcnNlZF9yZXNwb25zZVsncGhvdG9jb3VudHMnXVsncGhvdG9jb3VudCddIDogZmFsc2U7CgkJfQoKCQlmdW5jdGlvbiBwaG90b3NfZ2V0RXhpZiAoJHBob3RvX2lkLCAkc2VjcmV0ID0gTlVMTCkgewoJCQkvKiBodHRwOi8vd3d3LmZsaWNrci5jb20vc2VydmljZXMvYXBpL2ZsaWNrci5waG90b3MuZ2V0RXhpZi5odG1sICovCgkJCSR0aGlzLT5yZXF1ZXN0KCJmbGlja3IucGhvdG9zLmdldEV4aWYiLCBhcnJheSgicGhvdG9faWQiPT4kcGhvdG9faWQsICJzZWNyZXQiPT4kc2VjcmV0KSk7CgkJCXJldHVybiAkdGhpcy0+cGFyc2VkX3Jlc3BvbnNlID8gJHRoaXMtPnBhcnNlZF9yZXNwb25zZVsncGhvdG8nXSA6IGZhbHNlOwoJCX0KCQkKCQlmdW5jdGlvbiBwaG90b3NfZ2V0RmF2b3JpdGVzICgkcGhvdG9faWQsICRwYWdlID0gTlVMTCwgJHBlcl9wYWdlID0gTlVMTCkgewoJCQkvKiBodHRwOi8vd3d3LmZsaWNrci5jb20vc2VydmljZXMvYXBpL2ZsaWNrci5waG90b3MuZ2V0RmF2b3JpdGVzLmh0bWwgKi8KCQkJJHRoaXMtPnJlcXVlc3QoImZsaWNrci5waG90b3MuZ2V0RmF2b3JpdGVzIiwgYXJyYXkoInBob3RvX2lkIj0+JHBob3RvX2lkLCAicGFnZSI9PiRwYWdlLCAicGVyX3BhZ2UiPT4kcGVyX3BhZ2UpKTsKCQkJcmV0dXJuICR0aGlzLT5wYXJzZWRfcmVzcG9uc2UgPyAkdGhpcy0+cGFyc2VkX3Jlc3BvbnNlWydwaG90byddIDogZmFsc2U7CgkJfQoKCQlmdW5jdGlvbiBwaG90b3NfZ2V0SW5mbyAoJHBob3RvX2lkLCAkc2VjcmV0ID0gTlVMTCwgJGh1bWFuZGF0ZXMgPSBOVUxMLCAkcHJpdmFjeV9maWx0ZXIgPSBOVUxMLCAkZ2V0X2NvbnRleHRzID0gTlVMTCkgewoJCQkvKiBodHRwOi8vd3d3LmZsaWNrci5jb20vc2VydmljZXMvYXBpL2ZsaWNrci5waG90b3MuZ2V0SW5mby5odG1sICovCgkJCXJldHVybiAkdGhpcy0+Y2FsbCgnZmxpY2tyLnBob3Rvcy5nZXRJbmZvJywgYXJyYXkoJ3Bob3RvX2lkJyA9PiAkcGhvdG9faWQsICdzZWNyZXQnID0+ICRzZWNyZXQsICdodW1hbmRhdGVzJyA9PiAkaHVtYW5kYXRlcywgJ3ByaXZhY3lfZmlsdGVyJyA9PiAkcHJpdmFjeV9maWx0ZXIsICdnZXRfY29udGV4dHMnID0+ICRnZXRfY29udGV4dHMpKTsKCQl9CgkJCgkJZnVuY3Rpb24gcGhvdG9zX2dldE5vdEluU2V0ICgkbWF4X3VwbG9hZF9kYXRlID0gTlVMTCwgJG1pbl90YWtlbl9kYXRlID0gTlVMTCwgJG1heF90YWtlbl9kYXRlID0gTlVMTCwgJHByaXZhY3lfZmlsdGVyID0gTlVMTCwgJG1lZGlhID0gTlVMTCwgJG1pbl91cGxvYWRfZGF0ZSA9IE5VTEwsICRleHRyYXMgPSBOVUxMLCAkcGVyX3BhZ2UgPSBOVUxMLCAkcGFnZSA9IE5VTEwpIHsKCQkJLyogaHR0cDovL3d3dy5mbGlja3IuY29tL3NlcnZpY2VzL2FwaS9mbGlja3IucGhvdG9zLmdldE5vdEluU2V0Lmh0bWwgKi8KCQkJcmV0dXJuICR0aGlzLT5jYWxsKCdmbGlja3IucGhvdG9zLmdldE5vdEluU2V0JywgYXJyYXkoJ21heF91cGxvYWRfZGF0ZScgPT4gJG1heF91cGxvYWRfZGF0ZSwgJ21pbl90YWtlbl9kYXRlJyA9PiAkbWluX3Rha2VuX2RhdGUsICdtYXhfdGFrZW5fZGF0ZScgPT4gJG1heF90YWtlbl9kYXRlLCAncHJpdmFjeV9maWx0ZXInID0+ICRwcml2YWN5X2ZpbHRlciwgJ21lZGlhJyA9PiAkbWVkaWEsICdtaW5fdXBsb2FkX2RhdGUnID0+ICRtaW5fdXBsb2FkX2RhdGUsICdleHRyYXMnID0+ICRleHRyYXMsICdwZXJfcGFnZScgPT4gJHBlcl9wYWdlLCAncGFnZScgPT4gJHBhZ2UpKTsKCQl9CgkJCgkJZnVuY3Rpb24gcGhvdG9zX2dldFBlcm1zICgkcGhvdG9faWQpIHsKCQkJLyogaHR0cDovL3d3dy5mbGlja3IuY29tL3NlcnZpY2VzL2FwaS9mbGlja3IucGhvdG9zLmdldFBlcm1zLmh0bWwgKi8KCQkJJHRoaXMtPnJlcXVlc3QoImZsaWNrci5waG90b3MuZ2V0UGVybXMiLCBhcnJheSgicGhvdG9faWQiPT4kcGhvdG9faWQpKTsKCQkJcmV0dXJuICR0aGlzLT5wYXJzZWRfcmVzcG9uc2UgPyAkdGhpcy0+cGFyc2VkX3Jlc3BvbnNlWydwZXJtcyddIDogZmFsc2U7CgkJfQoKCQlmdW5jdGlvbiBwaG90b3NfZ2V0UmVjZW50ICgkanVtcF90byA9IE5VTEwsICRleHRyYXMgPSBOVUxMLCAkcGVyX3BhZ2UgPSBOVUxMLCAkcGFnZSA9IE5VTEwpIHsKCQkJLyogaHR0cDovL3d3dy5mbGlja3IuY29tL3NlcnZpY2VzL2FwaS9mbGlja3IucGhvdG9zLmdldFJlY2VudC5odG1sICovCgkJCWlmIChpc19hcnJheSgkZXh0cmFzKSkgewoJCQkJJGV4dHJhcyA9IGltcGxvZGUoIiwiLCAkZXh0cmFzKTsKCQkJfQoJCQlyZXR1cm4gJHRoaXMtPmNhbGwoJ2ZsaWNrci5waG90b3MuZ2V0UmVjZW50JywgYXJyYXkoJ2p1bXBfdG8nID0+ICRqdW1wX3RvLCAnZXh0cmFzJyA9PiAkZXh0cmFzLCAncGVyX3BhZ2UnID0+ICRwZXJfcGFnZSwgJ3BhZ2UnID0+ICRwYWdlKSk7CgkJfQoKCQlmdW5jdGlvbiBwaG90b3NfZ2V0U2l6ZXMgKCRwaG90b19pZCkgewoJCQkvKiBodHRwOi8vd3d3LmZsaWNrci5jb20vc2VydmljZXMvYXBpL2ZsaWNrci5waG90b3MuZ2V0U2l6ZXMuaHRtbCAqLwoJCQkkdGhpcy0+cmVxdWVzdCgiZmxpY2tyLnBob3Rvcy5nZXRTaXplcyIsIGFycmF5KCJwaG90b19pZCI9PiRwaG90b19pZCkpOwoJCQlyZXR1cm4gJHRoaXMtPnBhcnNlZF9yZXNwb25zZSA/ICR0aGlzLT5wYXJzZWRfcmVzcG9uc2VbJ3NpemVzJ11bJ3NpemUnXSA6IGZhbHNlOwoJCX0KCgkJZnVuY3Rpb24gcGhvdG9zX2dldFVudGFnZ2VkICgkbWluX3VwbG9hZF9kYXRlID0gTlVMTCwgJG1heF91cGxvYWRfZGF0ZSA9IE5VTEwsICRtaW5fdGFrZW5fZGF0ZSA9IE5VTEwsICRtYXhfdGFrZW5fZGF0ZSA9IE5VTEwsICRwcml2YWN5X2ZpbHRlciA9IE5VTEwsICRtZWRpYSA9IE5VTEwsICRleHRyYXMgPSBOVUxMLCAkcGVyX3BhZ2UgPSBOVUxMLCAkcGFnZSA9IE5VTEwpIHsKCQkJLyogaHR0cDovL3d3dy5mbGlja3IuY29tL3NlcnZpY2VzL2FwaS9mbGlja3IucGhvdG9zLmdldFVudGFnZ2VkLmh0bWwgKi8KCQkJcmV0dXJuICR0aGlzLT5jYWxsKCdmbGlja3IucGhvdG9zLmdldFVudGFnZ2VkJywgYXJyYXkoJ21pbl91cGxvYWRfZGF0ZScgPT4gJG1pbl91cGxvYWRfZGF0ZSwgJ21heF91cGxvYWRfZGF0ZScgPT4gJG1heF91cGxvYWRfZGF0ZSwgJ21pbl90YWtlbl9kYXRlJyA9PiAkbWluX3Rha2VuX2RhdGUsICdtYXhfdGFrZW5fZGF0ZScgPT4gJG1heF90YWtlbl9kYXRlLCAncHJpdmFjeV9maWx0ZXInID0+ICRwcml2YWN5X2ZpbHRlciwgJ21lZGlhJyA9PiAkbWVkaWEsICdleHRyYXMnID0+ICRleHRyYXMsICdwZXJfcGFnZScgPT4gJHBlcl9wYWdlLCAncGFnZScgPT4gJHBhZ2UpKTsKCQl9CgoJCWZ1bmN0aW9uIHBob3Rvc19nZXRXaXRoR2VvRGF0YSAoJGFyZ3MgPSBhcnJheSgpKSB7CgkJCS8qIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSBwaG90b3Nfc2VhcmNoKCkgZnVuY3Rpb24uCgkJCSAqIEknbSB1c2luZyB0aGUgc2FtZSBzdHlsZSBvZiBhcmd1bWVudHMgZm9yIHRoaXMgZnVuY3Rpb24uIFRoZSBvbmx5CgkJCSAqIGRpZmZlcmVuY2UgaGVyZSBpcyB0aGF0IHRoaXMgZG9lc24ndCByZXF1aXJlIGFueSBhcmd1bWVudHMuIFRoZQoJCQkgKiBmbGlja3IucGhvdG9zLnNlYXJjaCBtZXRob2QgcmVxdWlyZXMgYXQgbGVhc3Qgb25lIHNlYXJjaCBwYXJhbWV0ZXIuCgkJCSAqLwoJCQkvKiBodHRwOi8vd3d3LmZsaWNrci5jb20vc2VydmljZXMvYXBpL2ZsaWNrci5waG90b3MuZ2V0V2l0aEdlb0RhdGEuaHRtbCAqLwoJCQkkdGhpcy0+cmVxdWVzdCgiZmxpY2tyLnBob3Rvcy5nZXRXaXRoR2VvRGF0YSIsICRhcmdzKTsKCQkJcmV0dXJuICR0aGlzLT5wYXJzZWRfcmVzcG9uc2UgPyAkdGhpcy0+cGFyc2VkX3Jlc3BvbnNlWydwaG90b3MnXSA6IGZhbHNlOwoJCX0KCgkJZnVuY3Rpb24gcGhvdG9zX2dldFdpdGhvdXRHZW9EYXRhICgkYXJncyA9IGFycmF5KCkpIHsKCQkJLyogU2VlIHRoZSBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHBob3Rvc19zZWFyY2goKSBmdW5jdGlvbi4KCQkJICogSSdtIHVzaW5nIHRoZSBzYW1lIHN0eWxlIG9mIGFyZ3VtZW50cyBmb3IgdGhpcyBmdW5jdGlvbi4gVGhlIG9ubHkKCQkJICogZGlmZmVyZW5jZSBoZXJlIGlzIHRoYXQgdGhpcyBkb2Vzbid0IHJlcXVpcmUgYW55IGFyZ3VtZW50cy4gVGhlCgkJCSAqIGZsaWNrci5waG90b3Muc2VhcmNoIG1ldGhvZCByZXF1aXJlcyBhdCBsZWFzdCBvbmUgc2VhcmNoIHBhcmFtZXRlci4KCQkJICovCgkJCS8qIGh0dHA6Ly93d3cuZmxpY2tyLmNvbS9zZXJ2aWNlcy9hcGkvZmxpY2tyLnBob3Rvcy5nZXRXaXRob3V0R2VvRGF0YS5odG1sICovCgkJCSR0aGlzLT5yZXF1ZXN0KCJmbGlja3IucGhvdG9zLmdldFdpdGhvdXRHZW9EYXRhIiwgJGFyZ3MpOwoJCQlyZXR1cm4gJHRoaXMtPnBhcnNlZF9yZXNwb25zZSA/ICR0aGlzLT5wYXJzZWRfcmVzcG9uc2VbJ3Bob3RvcyddIDogZmFsc2U7CgkJfQoKCQlmdW5jdGlvbiBwaG90b3NfcmVjZW50bHlVcGRhdGVkICgkbWluX2RhdGUsICRleHRyYXMgPSBOVUxMLCAkcGVyX3BhZ2UgPSBOVUxMLCAkcGFnZSA9IE5VTEwpIHsKCQkJLyogaHR0cDovL3d3dy5mbGlja3IuY29tL3NlcnZpY2VzL2FwaS9mbGlja3IucGhvdG9zLnJlY2VudGx5VXBkYXRlZC5odG1sICovCgkJCXJldHVybiAkdGhpcy0+Y2FsbCgnZmxpY2tyLnBob3Rvcy5yZWNlbnRseVVwZGF0ZWQnLCBhcnJheSgnbWluX2RhdGUnID0+ICRtaW5fZGF0ZSwgJ2V4dHJhcycgPT4gJGV4dHJhcywgJ3Blcl9wYWdlJyA9PiAkcGVyX3BhZ2UsICdwYWdlJyA9PiAkcGFnZSkpOwoJCX0KCgkJZnVuY3Rpb24gcGhvdG9zX3JlbW92ZVRhZyAoJHRhZ19pZCkgewoJCQkvKiBodHRwOi8vd3d3LmZsaWNrci5jb20vc2VydmljZXMvYXBpL2ZsaWNrci5waG90b3MucmVtb3ZlVGFnLmh0bWwgKi8KCQkJJHRoaXMtPnJlcXVlc3QoImZsaWNrci5waG90b3MucmVtb3ZlVGFnIiwgYXJyYXkoInRhZ19pZCI9PiR0YWdfaWQpLCBUUlVFKTsKCQkJcmV0dXJuICR0aGlzLT5wYXJzZWRfcmVzcG9uc2UgPyB0cnVlIDogZmFsc2U7CgkJfQoKCQlmdW5jdGlvbiBwaG90b3Nfc2VhcmNoICgkYXJncyA9IGFycmF5KCkpIHsKCQkJLyogVGhpcyBmdW5jdGlvbiBzdHJheXMgZnJvbSB0aGUgbWV0aG9kIG9mIGFyZ3VtZW50cyB0aGF0IEkndmUKCQkJICogdXNlZCBpbiB0aGUgb3RoZXIgZnVuY3Rpb25zIGZvciB0aGUgZmFjdCB0aGF0IHRoZXJlIGFyZSBqdXN0CgkJCSAqIHNvIG1hbnkgYXJndW1lbnRzIHRvIHRoaXMgQVBJIG1ldGhvZC4gV2hhdCB5b3UnbGwgbmVlZCB0byBkbwoJCQkgKiBpcyBwYXNzIGFuIGFzc29jaWF0aXZlIGFycmF5IHRvIHRoZSBmdW5jdGlvbiBjb250YWluaW5nIHRoZQoJCQkgKiBhcmd1bWVudHMgeW91IHdhbnQgdG8gcGFzcyB0byB0aGUgQVBJLiAgRm9yIGV4YW1wbGU6CgkJCSAqICAgJHBob3RvcyA9ICRmLT5waG90b3Nfc2VhcmNoKGFycmF5KCJ0YWdzIj0+ImJyb3duLGNvdyIsICJ0YWdfbW9kZSI9PiJhbnkiKSk7CgkJCSAqIFRoaXMgd2lsbCByZXR1cm4gcGhvdG9zIHRhZ2dlZCB3aXRoIGVpdGhlciAiYnJvd24iIG9yICJjb3ciCgkJCSAqIG9yIGJvdGguIFNlZSB0aGUgQVBJIGRvY3VtZW50YXRpb24gKGxpbmsgYmVsb3cpIGZvciBhIGZ1bGwKCQkJICogbGlzdCBvZiBhcmd1bWVudHMuCgkJCSAqLwoKCQkJLyogaHR0cDovL3d3dy5mbGlja3IuY29tL3NlcnZpY2VzL2FwaS9mbGlja3IucGhvdG9zLnNlYXJjaC5odG1sICovCgkJCSR0aGlzLT5yZXF1ZXN0KCJmbGlja3IucGhvdG9zLnNlYXJjaCIsICRhcmdzKTsKCQkJcmV0dXJuICR0aGlzLT5wYXJzZWRfcmVzcG9uc2UgPyAkdGhpcy0+cGFyc2VkX3Jlc3BvbnNlWydwaG90b3MnXSA6IGZhbHNlOwoJCX0KCgkJZnVuY3Rpb24gcGhvdG9zX3NldENvbnRlbnRUeXBlICgkcGhvdG9faWQsICRjb250ZW50X3R5cGUpIHsKCQkJLyogaHR0cDovL3d3dy5mbGlja3IuY29tL3NlcnZpY2VzL2FwaS9mbGlja3IucGhvdG9zLnNldENvbnRlbnRUeXBlLmh0bWwgKi8KCQkJcmV0dXJuICR0aGlzLT5jYWxsKCdmbGlja3IucGhvdG9zLnNldENvbnRlbnRUeXBlJywgYXJyYXkoJ3Bob3RvX2lkJyA9PiAkcGhvdG9faWQsICdjb250ZW50X3R5cGUnID0+ICRjb250ZW50X3R5cGUpKTsKCQl9CgkJCgkJZnVuY3Rpb24gcGhvdG9zX3NldERhdGVzICgkcGhvdG9faWQsICRkYXRlX3Bvc3RlZCA9IE5VTEwsICRkYXRlX3Rha2VuID0gTlVMTCwgJGRhdGVfdGFrZW5fZ3JhbnVsYXJpdHkgPSBOVUxMKSB7CgkJCS8qIGh0dHA6Ly93d3cuZmxpY2tyLmNvbS9zZXJ2aWNlcy9hcGkvZmxpY2tyLnBob3Rvcy5zZXREYXRlcy5odG1sICovCgkJCSR0aGlzLT5yZXF1ZXN0KCJmbGlja3IucGhvdG9zLnNldERhdGVzIiwgYXJyYXkoInBob3RvX2lkIj0+JHBob3RvX2lkLCAiZGF0ZV9wb3N0ZWQiPT4kZGF0ZV9wb3N0ZWQsICJkYXRlX3Rha2VuIj0+JGRhdGVfdGFrZW4sICJkYXRlX3Rha2VuX2dyYW51bGFyaXR5Ij0+JGRhdGVfdGFrZW5fZ3JhbnVsYXJpdHkpLCBUUlVFKTsKCQkJcmV0dXJuICR0aGlzLT5wYXJzZWRfcmVzcG9uc2UgPyB0cnVlIDogZmFsc2U7CgkJfQoKCQlmdW5jdGlvbiBwaG90b3Nfc2V0TWV0YSAoJHBob3RvX2lkLCAkdGl0bGUsICRkZXNjcmlwdGlvbikgewoJCQkvKiBodHRwOi8vd3d3LmZsaWNrci5jb20vc2VydmljZXMvYXBpL2ZsaWNrci5waG90b3Muc2V0TWV0YS5odG1sICovCgkJCSR0aGlzLT5yZXF1ZXN0KCJmbGlja3IucGhvdG9zLnNldE1ldGEiLCBhcnJheSgicGhvdG9faWQiPT4kcGhvdG9faWQsICJ0aXRsZSI9PiR0aXRsZSwgImRlc2NyaXB0aW9uIj0+JGRlc2NyaXB0aW9uKSwgVFJVRSk7CgkJCXJldHVybiAkdGhpcy0+cGFyc2VkX3Jlc3BvbnNlID8gdHJ1ZSA6IGZhbHNlOwoJCX0KCgkJZnVuY3Rpb24gcGhvdG9zX3NldFBlcm1zICgkcGhvdG9faWQsICRpc19wdWJsaWMsICRpc19mcmllbmQsICRpc19mYW1pbHksICRwZXJtX2NvbW1lbnQsICRwZXJtX2FkZG1ldGEpIHsKCQkJLyogaHR0cDovL3d3dy5mbGlja3IuY29tL3NlcnZpY2VzL2FwaS9mbGlja3IucGhvdG9zLnNldFBlcm1zLmh0bWwgKi8KCQkJJHRoaXMtPnJlcXVlc3QoImZsaWNrci5waG90b3Muc2V0UGVybXMiLCBhcnJheSgicGhvdG9faWQiPT4kcGhvdG9faWQsICJpc19wdWJsaWMiPT4kaXNfcHVibGljLCAiaXNfZnJpZW5kIj0+JGlzX2ZyaWVuZCwgImlzX2ZhbWlseSI9PiRpc19mYW1pbHksICJwZXJtX2NvbW1lbnQiPT4kcGVybV9jb21tZW50LCAicGVybV9hZGRtZXRhIj0+JHBlcm1fYWRkbWV0YSksIFRSVUUpOwoJCQlyZXR1cm4gJHRoaXMtPnBhcnNlZF9yZXNwb25zZSA/IHRydWUgOiBmYWxzZTsKCQl9CgoJCWZ1bmN0aW9uIHBob3Rvc19zZXRTYWZldHlMZXZlbCAoJHBob3RvX2lkLCAkc2FmZXR5X2xldmVsID0gTlVMTCwgJGhpZGRlbiA9IE5VTEwpIHsKCQkJLyogaHR0cDovL3d3dy5mbGlja3IuY29tL3NlcnZpY2VzL2FwaS9mbGlja3IucGhvdG9zLnNldFNhZmV0eUxldmVsLmh0bWwgKi8KCQkJcmV0dXJuICR0aGlzLT5jYWxsKCdmbGlja3IucGhvdG9zLnNldFNhZmV0eUxldmVsJywgYXJyYXkoJ3Bob3RvX2lkJyA9PiAkcGhvdG9faWQsICdzYWZldHlfbGV2ZWwnID0+ICRzYWZldHlfbGV2ZWwsICdoaWRkZW4nID0+ICRoaWRkZW4pKTsKCQl9CgkJCgkJZnVuY3Rpb24gcGhvdG9zX3NldFRhZ3MgKCRwaG90b19pZCwgJHRhZ3MpIHsKCQkJLyogaHR0cDovL3d3dy5mbGlja3IuY29tL3NlcnZpY2VzL2FwaS9mbGlja3IucGhvdG9zLnNldFRhZ3MuaHRtbCAqLwoJCQkkdGhpcy0+cmVxdWVzdCgiZmxpY2tyLnBob3Rvcy5zZXRUYWdzIiwgYXJyYXkoInBob3RvX2lkIj0+JHBob3RvX2lkLCAidGFncyI9PiR0YWdzKSwgVFJVRSk7CgkJCXJldHVybiAkdGhpcy0+cGFyc2VkX3Jlc3BvbnNlID8gdHJ1ZSA6IGZhbHNlOwoJCX0KCgkJLyogUGhvdG9zIC0gQ29tbWVudHMgTWV0aG9kcyAqLwoJCWZ1bmN0aW9uIHBob3Rvc19jb21tZW50c19hZGRDb21tZW50ICgkcGhvdG9faWQsICRjb21tZW50X3RleHQpIHsKCQkJLyogaHR0cDovL3d3dy5mbGlja3IuY29tL3NlcnZpY2VzL2FwaS9mbGlja3IucGhvdG9zLmNvbW1lbnRzLmFkZENvbW1lbnQuaHRtbCAqLwoJCQkkdGhpcy0+cmVxdWVzdCgiZmxpY2tyLnBob3Rvcy5jb21tZW50cy5hZGRDb21tZW50IiwgYXJyYXkoInBob3RvX2lkIiA9PiAkcGhvdG9faWQsICJjb21tZW50X3RleHQiPT4kY29tbWVudF90ZXh0KSwgVFJVRSk7CgkJCXJldHVybiAkdGhpcy0+cGFyc2VkX3Jlc3BvbnNlID8gJHRoaXMtPnBhcnNlZF9yZXNwb25zZVsnY29tbWVudCddIDogZmFsc2U7CgkJfQoKCQlmdW5jdGlvbiBwaG90b3NfY29tbWVudHNfZGVsZXRlQ29tbWVudCAoJGNvbW1lbnRfaWQpIHsKCQkJLyogaHR0cDovL3d3dy5mbGlja3IuY29tL3NlcnZpY2VzL2FwaS9mbGlja3IucGhvdG9zLmNvbW1lbnRzLmRlbGV0ZUNvbW1lbnQuaHRtbCAqLwoJCQkkdGhpcy0+cmVxdWVzdCgiZmxpY2tyLnBob3Rvcy5jb21tZW50cy5kZWxldGVDb21tZW50IiwgYXJyYXkoImNvbW1lbnRfaWQiID0+ICRjb21tZW50X2lkKSwgVFJVRSk7CgkJCXJldHVybiAkdGhpcy0+cGFyc2VkX3Jlc3BvbnNlID8gdHJ1ZSA6IGZhbHNlOwoJCX0KCgkJZnVuY3Rpb24gcGhvdG9zX2NvbW1lbnRzX2VkaXRDb21tZW50ICgkY29tbWVudF9pZCwgJGNvbW1lbnRfdGV4dCkgewoJCQkvKiBodHRwOi8vd3d3LmZsaWNrci5jb20vc2VydmljZXMvYXBpL2ZsaWNrci5waG90b3MuY29tbWVudHMuZWRpdENvbW1lbnQuaHRtbCAqLwoJCQkkdGhpcy0+cmVxdWVzdCgiZmxpY2tyLnBob3Rvcy5jb21tZW50cy5lZGl0Q29tbWVudCIsIGFycmF5KCJjb21tZW50X2lkIiA9PiAkY29tbWVudF9pZCwgImNvbW1lbnRfdGV4dCI9PiRjb21tZW50X3RleHQpLCBUUlVFKTsKCQkJcmV0dXJuICR0aGlzLT5wYXJzZWRfcmVzcG9uc2UgPyB0cnVlIDogZmFsc2U7CgkJfQoKCQlmdW5jdGlvbiBwaG90b3NfY29tbWVudHNfZ2V0TGlzdCAoJHBob3RvX2lkLCAkbWluX2NvbW1lbnRfZGF0ZSA9IE5VTEwsICRtYXhfY29tbWVudF9kYXRlID0gTlVMTCwgJHBhZ2UgPSBOVUxMLCAkcGVyX3BhZ2UgPSBOVUxMLCAkaW5jbHVkZV9mYXZlcyA9IE5VTEwpIHsKCQkJLyogaHR0cDovL3d3dy5mbGlja3IuY29tL3NlcnZpY2VzL2FwaS9mbGlja3IucGhvdG9zLmNvbW1lbnRzLmdldExpc3QuaHRtbCAqLwoJCQlyZXR1cm4gJHRoaXMtPmNhbGwoJ2ZsaWNrci5waG90b3MuY29tbWVudHMuZ2V0TGlzdCcsIGFycmF5KCdwaG90b19pZCcgPT4gJHBob3RvX2lkLCAnbWluX2NvbW1lbnRfZGF0ZScgPT4gJG1pbl9jb21tZW50X2RhdGUsICdtYXhfY29tbWVudF9kYXRlJyA9PiAkbWF4X2NvbW1lbnRfZGF0ZSwgJ3BhZ2UnID0+ICRwYWdlLCAncGVyX3BhZ2UnID0+ICRwZXJfcGFnZSwgJ2luY2x1ZGVfZmF2ZXMnID0+ICRpbmNsdWRlX2ZhdmVzKSk7CgkJfQoJCQoJCWZ1bmN0aW9uIHBob3Rvc19jb21tZW50c19nZXRSZWNlbnRGb3JDb250YWN0cyAoJGRhdGVfbGFzdGNvbW1lbnQgPSBOVUxMLCAkY29udGFjdHNfZmlsdGVyID0gTlVMTCwgJGV4dHJhcyA9IE5VTEwsICRwZXJfcGFnZSA9IE5VTEwsICRwYWdlID0gTlVMTCkgewoJCQkvKiBodHRwOi8vd3d3LmZsaWNrci5jb20vc2VydmljZXMvYXBpL2ZsaWNrci5waG90b3MuY29tbWVudHMuZ2V0UmVjZW50Rm9yQ29udGFjdHMuaHRtbCAqLwoJCQlyZXR1cm4gJHRoaXMtPmNhbGwoJ2ZsaWNrci5waG90b3MuY29tbWVudHMuZ2V0UmVjZW50Rm9yQ29udGFjdHMnLCBhcnJheSgnZGF0ZV9sYXN0Y29tbWVudCcgPT4gJGRhdGVfbGFzdGNvbW1lbnQsICdjb250YWN0c19maWx0ZXInID0+ICRjb250YWN0c19maWx0ZXIsICdleHRyYXMnID0+ICRleHRyYXMsICdwZXJfcGFnZScgPT4gJHBlcl9wYWdlLCAncGFnZScgPT4gJHBhZ2UpKTsKCQl9CgoJCS8qIFBob3RvcyAtIEdlbyBNZXRob2RzICovCgkJZnVuY3Rpb24gcGhvdG9zX2dlb19iYXRjaENvcnJlY3RMb2NhdGlvbiAoJGxhdCwgJGxvbiwgJGFjY3VyYWN5LCAkcGxhY2VfaWQgPSBOVUxMLCAkd29lX2lkID0gTlVMTCkgewoJCQkvKiBodHRwOi8vd3d3LmZsaWNrci5jb20vc2VydmljZXMvYXBpL2ZsaWNrci5waG90b3MuZ2VvLmJhdGNoQ29ycmVjdExvY2F0aW9uLmh0bWwgKi8KCQkJcmV0dXJuICR0aGlzLT5jYWxsKCdmbGlja3IucGhvdG9zLmdlby5iYXRjaENvcnJlY3RMb2NhdGlvbicsIGFycmF5KCdsYXQnID0+ICRsYXQsICdsb24nID0+ICRsb24sICdhY2N1cmFjeScgPT4gJGFjY3VyYWN5LCAncGxhY2VfaWQnID0+ICRwbGFjZV9pZCwgJ3dvZV9pZCcgPT4gJHdvZV9pZCkpOwoJCX0KCgkJZnVuY3Rpb24gcGhvdG9zX2dlb19jb3JyZWN0TG9jYXRpb24gKCRwaG90b19pZCwgJHBsYWNlX2lkID0gTlVMTCwgJHdvZV9pZCA9IE5VTEwpIHsKCQkJLyogaHR0cDovL3d3dy5mbGlja3IuY29tL3NlcnZpY2VzL2FwaS9mbGlja3IucGhvdG9zLmdlby5jb3JyZWN0TG9jYXRpb24uaHRtbCAqLwoJCQlyZXR1cm4gJHRoaXMtPmNhbGwoJ2ZsaWNrci5waG90b3MuZ2VvLmNvcnJlY3RMb2NhdGlvbicsIGFycmF5KCdwaG90b19pZCcgPT4gJHBob3RvX2lkLCAncGxhY2VfaWQnID0+ICRwbGFjZV9pZCwgJ3dvZV9pZCcgPT4gJHdvZV9pZCkpOwoJCX0KCgkJZnVuY3Rpb24gcGhvdG9zX2dlb19nZXRMb2NhdGlvbiAoJHBob3RvX2lkKSB7CgkJCS8qIGh0dHA6Ly93d3cuZmxpY2tyLmNvbS9zZXJ2aWNlcy9hcGkvZmxpY2tyLnBob3Rvcy5nZW8uZ2V0TG9jYXRpb24uaHRtbCAqLwoJCQkkdGhpcy0+cmVxdWVzdCgiZmxpY2tyLnBob3Rvcy5nZW8uZ2V0TG9jYXRpb24iLCBhcnJheSgicGhvdG9faWQiPT4kcGhvdG9faWQpKTsKCQkJcmV0dXJuICR0aGlzLT5wYXJzZWRfcmVzcG9uc2UgPyAkdGhpcy0+cGFyc2VkX3Jlc3BvbnNlWydwaG90byddIDogZmFsc2U7CgkJfQoKCQlmdW5jdGlvbiBwaG90b3NfZ2VvX2dldFBlcm1zICgkcGhvdG9faWQpIHsKCQkJLyogaHR0cDovL3d3dy5mbGlja3IuY29tL3NlcnZpY2VzL2FwaS9mbGlja3IucGhvdG9zLmdlby5nZXRQZXJtcy5odG1sICovCgkJCSR0aGlzLT5yZXF1ZXN0KCJmbGlja3IucGhvdG9zLmdlby5nZXRQZXJtcyIsIGFycmF5KCJwaG90b19pZCI9PiRwaG90b19pZCkpOwoJCQlyZXR1cm4gJHRoaXMtPnBhcnNlZF9yZXNwb25zZSA/ICR0aGlzLT5wYXJzZWRfcmVzcG9uc2VbJ3Blcm1zJ10gOiBmYWxzZTsKCQl9CgkJCgkJZnVuY3Rpb24gcGhvdG9zX2dlb19waG90b3NGb3JMb2NhdGlvbiAoJGxhdCwgJGxvbiwgJGFjY3VyYWN5ID0gTlVMTCwgJGV4dHJhcyA9IE5VTEwsICRwZXJfcGFnZSA9IE5VTEwsICRwYWdlID0gTlVMTCkgewoJCQkvKiBodHRwOi8vd3d3LmZsaWNrci5jb20vc2VydmljZXMvYXBpL2ZsaWNrci5waG90b3MuZ2VvLnBob3Rvc0ZvckxvY2F0aW9uLmh0bWwgKi8KCQkJcmV0dXJuICR0aGlzLT5jYWxsKCdmbGlja3IucGhvdG9zLmdlby5waG90b3NGb3JMb2NhdGlvbicsIGFycmF5KCdsYXQnID0+ICRsYXQsICdsb24nID0+ICRsb24sICdhY2N1cmFjeScgPT4gJGFjY3VyYWN5LCAnZXh0cmFzJyA9PiAkZXh0cmFzLCAncGVyX3BhZ2UnID0+ICRwZXJfcGFnZSwgJ3BhZ2UnID0+ICRwYWdlKSk7CgkJfQoKCQlmdW5jdGlvbiBwaG90b3NfZ2VvX3JlbW92ZUxvY2F0aW9uICgkcGhvdG9faWQpIHsKCQkJLyogaHR0cDovL3d3dy5mbGlja3IuY29tL3NlcnZpY2VzL2FwaS9mbGlja3IucGhvdG9zLmdlby5yZW1vdmVMb2NhdGlvbi5odG1sICovCgkJCSR0aGlzLT5yZXF1ZXN0KCJmbGlja3IucGhvdG9zLmdlby5yZW1vdmVMb2NhdGlvbiIsIGFycmF5KCJwaG90b19pZCI9PiRwaG90b19pZCksIFRSVUUpOwoJCQlyZXR1cm4gJHRoaXMtPnBhcnNlZF9yZXNwb25zZSA/IHRydWUgOiBmYWxzZTsKCQl9CgoJCWZ1bmN0aW9uIHBob3Rvc19nZW9fc2V0Q29udGV4dCAoJHBob3RvX2lkLCAkY29udGV4dCkgewoJCQkvKiBodHRwOi8vd3d3LmZsaWNrci5jb20vc2VydmljZXMvYXBpL2ZsaWNrci5waG90b3MuZ2VvLnNldENvbnRleHQuaHRtbCAqLwoJCQlyZXR1cm4gJHRoaXMtPmNhbGwoJ2ZsaWNrci5waG90b3MuZ2VvLnNldENvbnRleHQnLCBhcnJheSgncGhvdG9faWQnID0+ICRwaG90b19pZCwgJ2NvbnRleHQnID0+ICRjb250ZXh0KSk7CgkJfQoKCQlmdW5jdGlvbiBwaG90b3NfZ2VvX3NldExvY2F0aW9uICgkcGhvdG9faWQsICRsYXQsICRsb24sICRhY2N1cmFjeSA9IE5VTEwsICRjb250ZXh0ID0gTlVMTCwgJGJvb2ttYXJrX2lkID0gTlVMTCkgewoJCQkvKiBodHRwOi8vd3d3LmZsaWNrci5jb20vc2VydmljZXMvYXBpL2ZsaWNrci5waG90b3MuZ2VvLnNldExvY2F0aW9uLmh0bWwgKi8KCQkJcmV0dXJuICR0aGlzLT5jYWxsKCdmbGlja3IucGhvdG9zLmdlby5zZXRMb2NhdGlvbicsIGFycmF5KCdwaG90b19pZCcgPT4gJHBob3RvX2lkLCAnbGF0JyA9PiAkbGF0LCAnbG9uJyA9PiAkbG9uLCAnYWNjdXJhY3knID0+ICRhY2N1cmFjeSwgJ2NvbnRleHQnID0+ICRjb250ZXh0LCAnYm9va21hcmtfaWQnID0+ICRib29rbWFya19pZCkpOwoJCX0KCQkKCQlmdW5jdGlvbiBwaG90b3NfZ2VvX3NldFBlcm1zICgkaXNfcHVibGljLCAkaXNfY29udGFjdCwgJGlzX2ZyaWVuZCwgJGlzX2ZhbWlseSwgJHBob3RvX2lkKSB7CgkJCS8qIGh0dHA6Ly93d3cuZmxpY2tyLmNvbS9zZXJ2aWNlcy9hcGkvZmxpY2tyLnBob3Rvcy5nZW8uc2V0UGVybXMuaHRtbCAqLwoJCQlyZXR1cm4gJHRoaXMtPmNhbGwoJ2ZsaWNrci5waG90b3MuZ2VvLnNldFBlcm1zJywgYXJyYXkoJ2lzX3B1YmxpYycgPT4gJGlzX3B1YmxpYywgJ2lzX2NvbnRhY3QnID0+ICRpc19jb250YWN0LCAnaXNfZnJpZW5kJyA9PiAkaXNfZnJpZW5kLCAnaXNfZmFtaWx5JyA9PiAkaXNfZmFtaWx5LCAncGhvdG9faWQnID0+ICRwaG90b19pZCkpOwoJCX0KCgkJLyogUGhvdG9zIC0gTGljZW5zZXMgTWV0aG9kcyAqLwoJCWZ1bmN0aW9uIHBob3Rvc19saWNlbnNlc19nZXRJbmZvICgpIHsKCQkJLyogaHR0cDovL3d3dy5mbGlja3IuY29tL3NlcnZpY2VzL2FwaS9mbGlja3IucGhvdG9zLmxpY2Vuc2VzLmdldEluZm8uaHRtbCAqLwoJCQkkdGhpcy0+cmVxdWVzdCgiZmxpY2tyLnBob3Rvcy5saWNlbnNlcy5nZXRJbmZvIik7CgkJCXJldHVybiAkdGhpcy0+cGFyc2VkX3Jlc3BvbnNlID8gJHRoaXMtPnBhcnNlZF9yZXNwb25zZVsnbGljZW5zZXMnXVsnbGljZW5zZSddIDogZmFsc2U7CgkJfQoKCQlmdW5jdGlvbiBwaG90b3NfbGljZW5zZXNfc2V0TGljZW5zZSAoJHBob3RvX2lkLCAkbGljZW5zZV9pZCkgewoJCQkvKiBodHRwOi8vd3d3LmZsaWNrci5jb20vc2VydmljZXMvYXBpL2ZsaWNrci5waG90b3MubGljZW5zZXMuc2V0TGljZW5zZS5odG1sICovCgkJCS8qIFJlcXVpcmVzIEF1dGhlbnRpY2F0aW9uICovCgkJCSR0aGlzLT5yZXF1ZXN0KCJmbGlja3IucGhvdG9zLmxpY2Vuc2VzLnNldExpY2Vuc2UiLCBhcnJheSgicGhvdG9faWQiPT4kcGhvdG9faWQsICJsaWNlbnNlX2lkIj0+JGxpY2Vuc2VfaWQpLCBUUlVFKTsKCQkJcmV0dXJuICR0aGlzLT5wYXJzZWRfcmVzcG9uc2UgPyB0cnVlIDogZmFsc2U7CgkJfQoKCQkvKiBQaG90b3MgLSBOb3RlcyBNZXRob2RzICovCgkJZnVuY3Rpb24gcGhvdG9zX25vdGVzX2FkZCAoJHBob3RvX2lkLCAkbm90ZV94LCAkbm90ZV95LCAkbm90ZV93LCAkbm90ZV9oLCAkbm90ZV90ZXh0KSB7CgkJCS8qIGh0dHA6Ly93d3cuZmxpY2tyLmNvbS9zZXJ2aWNlcy9hcGkvZmxpY2tyLnBob3Rvcy5ub3Rlcy5hZGQuaHRtbCAqLwoJCQkkdGhpcy0+cmVxdWVzdCgiZmxpY2tyLnBob3Rvcy5ub3Rlcy5hZGQiLCBhcnJheSgicGhvdG9faWQiID0+ICRwaG90b19pZCwgIm5vdGVfeCIgPT4gJG5vdGVfeCwgIm5vdGVfeSIgPT4gJG5vdGVfeSwgIm5vdGVfdyIgPT4gJG5vdGVfdywgIm5vdGVfaCIgPT4gJG5vdGVfaCwgIm5vdGVfdGV4dCIgPT4gJG5vdGVfdGV4dCksIFRSVUUpOwoJCQlyZXR1cm4gJHRoaXMtPnBhcnNlZF9yZXNwb25zZSA/ICR0aGlzLT5wYXJzZWRfcmVzcG9uc2VbJ25vdGUnXSA6IGZhbHNlOwoJCX0KCgkJZnVuY3Rpb24gcGhvdG9zX25vdGVzX2RlbGV0ZSAoJG5vdGVfaWQpIHsKCQkJLyogaHR0cDovL3d3dy5mbGlja3IuY29tL3NlcnZpY2VzL2FwaS9mbGlja3IucGhvdG9zLm5vdGVzLmRlbGV0ZS5odG1sICovCgkJCSR0aGlzLT5yZXF1ZXN0KCJmbGlja3IucGhvdG9zLm5vdGVzLmRlbGV0ZSIsIGFycmF5KCJub3RlX2lkIiA9PiAkbm90ZV9pZCksIFRSVUUpOwoJCQlyZXR1cm4gJHRoaXMtPnBhcnNlZF9yZXNwb25zZSA/IHRydWUgOiBmYWxzZTsKCQl9CgoJCWZ1bmN0aW9uIHBob3Rvc19ub3Rlc19lZGl0ICgkbm90ZV9pZCwgJG5vdGVfeCwgJG5vdGVfeSwgJG5vdGVfdywgJG5vdGVfaCwgJG5vdGVfdGV4dCkgewoJCQkvKiBodHRwOi8vd3d3LmZsaWNrci5jb20vc2VydmljZXMvYXBpL2ZsaWNrci5waG90b3Mubm90ZXMuZWRpdC5odG1sICovCgkJCSR0aGlzLT5yZXF1ZXN0KCJmbGlja3IucGhvdG9zLm5vdGVzLmVkaXQiLCBhcnJheSgibm90ZV9pZCIgPT4gJG5vdGVfaWQsICJub3RlX3giID0+ICRub3RlX3gsICJub3RlX3kiID0+ICRub3RlX3ksICJub3RlX3ciID0+ICRub3RlX3csICJub3RlX2giID0+ICRub3RlX2gsICJub3RlX3RleHQiID0+ICRub3RlX3RleHQpLCBUUlVFKTsKCQkJcmV0dXJuICR0aGlzLT5wYXJzZWRfcmVzcG9uc2UgPyB0cnVlIDogZmFsc2U7CgkJfQoKCQkvKiBQaG90b3MgLSBUcmFuc2Zvcm0gTWV0aG9kcyAqLwoJCWZ1bmN0aW9uIHBob3Rvc190cmFuc2Zvcm1fcm90YXRlICgkcGhvdG9faWQsICRkZWdyZWVzKSB7CgkJCS8qIGh0dHA6Ly93d3cuZmxpY2tyLmNvbS9zZXJ2aWNlcy9hcGkvZmxpY2tyLnBob3Rvcy50cmFuc2Zvcm0ucm90YXRlLmh0bWwgKi8KCQkJJHRoaXMtPnJlcXVlc3QoImZsaWNrci5waG90b3MudHJhbnNmb3JtLnJvdGF0ZSIsIGFycmF5KCJwaG90b19pZCIgPT4gJHBob3RvX2lkLCAiZGVncmVlcyIgPT4gJGRlZ3JlZXMpLCBUUlVFKTsKCQkJcmV0dXJuICR0aGlzLT5wYXJzZWRfcmVzcG9uc2UgPyB0cnVlIDogZmFsc2U7CgkJfQoKCQkvKiBQaG90b3MgLSBQZW9wbGUgTWV0aG9kcyAqLwoJCWZ1bmN0aW9uIHBob3Rvc19wZW9wbGVfYWRkICgkcGhvdG9faWQsICR1c2VyX2lkLCAkcGVyc29uX3ggPSBOVUxMLCAkcGVyc29uX3kgPSBOVUxMLCAkcGVyc29uX3cgPSBOVUxMLCAkcGVyc29uX2ggPSBOVUxMKSB7CgkJCS8qIGh0dHA6Ly93d3cuZmxpY2tyLmNvbS9zZXJ2aWNlcy9hcGkvZmxpY2tyLnBob3Rvcy5wZW9wbGUuYWRkLmh0bWwgKi8KCQkJcmV0dXJuICR0aGlzLT5jYWxsKCdmbGlja3IucGhvdG9zLnBlb3BsZS5hZGQnLCBhcnJheSgncGhvdG9faWQnID0+ICRwaG90b19pZCwgJ3VzZXJfaWQnID0+ICR1c2VyX2lkLCAncGVyc29uX3gnID0+ICRwZXJzb25feCwgJ3BlcnNvbl95JyA9PiAkcGVyc29uX3ksICdwZXJzb25fdycgPT4gJHBlcnNvbl93LCAncGVyc29uX2gnID0+ICRwZXJzb25faCkpOwoJCX0KCgkJZnVuY3Rpb24gcGhvdG9zX3Blb3BsZV9kZWxldGUgKCRwaG90b19pZCwgJHVzZXJfaWQsICRlbWFpbCA9IE5VTEwpIHsKCQkJLyogaHR0cDovL3d3dy5mbGlja3IuY29tL3NlcnZpY2VzL2FwaS9mbGlja3IucGhvdG9zLnBlb3BsZS5kZWxldGUuaHRtbCAqLwoJCQlyZXR1cm4gJHRoaXMtPmNhbGwoJ2ZsaWNrci5waG90b3MucGVvcGxlLmRlbGV0ZScsIGFycmF5KCdwaG90b19pZCcgPT4gJHBob3RvX2lkLCAndXNlcl9pZCcgPT4gJHVzZXJfaWQsICdlbWFpbCcgPT4gJGVtYWlsKSk7CgkJfQoJCQoJCWZ1bmN0aW9uIHBob3Rvc19wZW9wbGVfZGVsZXRlQ29vcmRzICgkcGhvdG9faWQsICR1c2VyX2lkKSB7CgkJCS8qIGh0dHA6Ly93d3cuZmxpY2tyLmNvbS9zZXJ2aWNlcy9hcGkvZmxpY2tyLnBob3Rvcy5wZW9wbGUuZGVsZXRlQ29vcmRzLmh0bWwgKi8KCQkJcmV0dXJuICR0aGlzLT5jYWxsKCdmbGlja3IucGhvdG9zLnBlb3BsZS5kZWxldGVDb29yZHMnLCBhcnJheSgncGhvdG9faWQnID0+ICRwaG90b19pZCwgJ3VzZXJfaWQnID0+ICR1c2VyX2lkKSk7CgkJfQoKCQlmdW5jdGlvbiBwaG90b3NfcGVvcGxlX2VkaXRDb29yZHMgKCRwaG90b19pZCwgJHVzZXJfaWQsICRwZXJzb25feCwgJHBlcnNvbl95LCAkcGVyc29uX3csICRwZXJzb25faCwgJGVtYWlsID0gTlVMTCkgewoJCQkvKiBodHRwOi8vd3d3LmZsaWNrci5jb20vc2VydmljZXMvYXBpL2ZsaWNrci5waG90b3MucGVvcGxlLmVkaXRDb29yZHMuaHRtbCAqLwoJCQlyZXR1cm4gJHRoaXMtPmNhbGwoJ2ZsaWNrci5waG90b3MucGVvcGxlLmVkaXRDb29yZHMnLCBhcnJheSgncGhvdG9faWQnID0+ICRwaG90b19pZCwgJ3VzZXJfaWQnID0+ICR1c2VyX2lkLCAncGVyc29uX3gnID0+ICRwZXJzb25feCwgJ3BlcnNvbl95JyA9PiAkcGVyc29uX3ksICdwZXJzb25fdycgPT4gJHBlcnNvbl93LCAncGVyc29uX2gnID0+ICRwZXJzb25faCwgJ2VtYWlsJyA9PiAkZW1haWwpKTsKCQl9CgkJCgkJZnVuY3Rpb24gcGhvdG9zX3Blb3BsZV9nZXRMaXN0ICgkcGhvdG9faWQpIHsKCQkJLyogaHR0cDovL3d3dy5mbGlja3IuY29tL3NlcnZpY2VzL2FwaS9mbGlja3IucGhvdG9zLnBlb3BsZS5nZXRMaXN0Lmh0bWwgKi8KCQkJcmV0dXJuICR0aGlzLT5jYWxsKCdmbGlja3IucGhvdG9zLnBlb3BsZS5nZXRMaXN0JywgYXJyYXkoJ3Bob3RvX2lkJyA9PiAkcGhvdG9faWQpKTsKCQl9CgkJCgkJLyogUGhvdG9zIC0gVXBsb2FkIE1ldGhvZHMgKi8KCQlmdW5jdGlvbiBwaG90b3NfdXBsb2FkX2NoZWNrVGlja2V0cyAoJHRpY2tldHMpIHsKCQkJLyogaHR0cDovL3d3dy5mbGlja3IuY29tL3NlcnZpY2VzL2FwaS9mbGlja3IucGhvdG9zLnVwbG9hZC5jaGVja1RpY2tldHMuaHRtbCAqLwoJCQlpZiAoaXNfYXJyYXkoJHRpY2tldHMpKSB7CgkJCQkkdGlja2V0cyA9IGltcGxvZGUoIiwiLCAkdGlja2V0cyk7CgkJCX0KCQkJJHRoaXMtPnJlcXVlc3QoImZsaWNrci5waG90b3MudXBsb2FkLmNoZWNrVGlja2V0cyIsIGFycmF5KCJ0aWNrZXRzIiA9PiAkdGlja2V0cyksIFRSVUUpOwoJCQlyZXR1cm4gJHRoaXMtPnBhcnNlZF9yZXNwb25zZSA/ICR0aGlzLT5wYXJzZWRfcmVzcG9uc2VbJ3VwbG9hZGVyJ11bJ3RpY2tldCddIDogZmFsc2U7CgkJfQoKCQkvKiBQaG90b3NldHMgTWV0aG9kcyAqLwoJCWZ1bmN0aW9uIHBob3Rvc2V0c19hZGRQaG90byAoJHBob3Rvc2V0X2lkLCAkcGhvdG9faWQpIHsKCQkJLyogaHR0cDovL3d3dy5mbGlja3IuY29tL3NlcnZpY2VzL2FwaS9mbGlja3IucGhvdG9zZXRzLmFkZFBob3RvLmh0bWwgKi8KCQkJJHRoaXMtPnJlcXVlc3QoImZsaWNrci5waG90b3NldHMuYWRkUGhvdG8iLCBhcnJheSgicGhvdG9zZXRfaWQiID0+ICRwaG90b3NldF9pZCwgInBob3RvX2lkIiA9PiAkcGhvdG9faWQpLCBUUlVFKTsKCQkJcmV0dXJuICR0aGlzLT5wYXJzZWRfcmVzcG9uc2UgPyB0cnVlIDogZmFsc2U7CgkJfQoKCQlmdW5jdGlvbiBwaG90b3NldHNfY3JlYXRlICgkdGl0bGUsICRkZXNjcmlwdGlvbiwgJHByaW1hcnlfcGhvdG9faWQpIHsKCQkJLyogaHR0cDovL3d3dy5mbGlja3IuY29tL3NlcnZpY2VzL2FwaS9mbGlja3IucGhvdG9zZXRzLmNyZWF0ZS5odG1sICovCgkJCSR0aGlzLT5yZXF1ZXN0KCJmbGlja3IucGhvdG9zZXRzLmNyZWF0ZSIsIGFycmF5KCJ0aXRsZSIgPT4gJHRpdGxlLCAicHJpbWFyeV9waG90b19pZCIgPT4gJHByaW1hcnlfcGhvdG9faWQsICJkZXNjcmlwdGlvbiIgPT4gJGRlc2NyaXB0aW9uKSwgVFJVRSk7CgkJCXJldHVybiAkdGhpcy0+cGFyc2VkX3Jlc3BvbnNlID8gJHRoaXMtPnBhcnNlZF9yZXNwb25zZVsncGhvdG9zZXQnXSA6IGZhbHNlOwoJCX0KCgkJZnVuY3Rpb24gcGhvdG9zZXRzX2RlbGV0ZSAoJHBob3Rvc2V0X2lkKSB7CgkJCS8qIGh0dHA6Ly93d3cuZmxpY2tyLmNvbS9zZXJ2aWNlcy9hcGkvZmxpY2tyLnBob3Rvc2V0cy5kZWxldGUuaHRtbCAqLwoJCQkkdGhpcy0+cmVxdWVzdCgiZmxpY2tyLnBob3Rvc2V0cy5kZWxldGUiLCBhcnJheSgicGhvdG9zZXRfaWQiID0+ICRwaG90b3NldF9pZCksIFRSVUUpOwoJCQlyZXR1cm4gJHRoaXMtPnBhcnNlZF9yZXNwb25zZSA/IHRydWUgOiBmYWxzZTsKCQl9CgoJCWZ1bmN0aW9uIHBob3Rvc2V0c19lZGl0TWV0YSAoJHBob3Rvc2V0X2lkLCAkdGl0bGUsICRkZXNjcmlwdGlvbiA9IE5VTEwpIHsKCQkJLyogaHR0cDovL3d3dy5mbGlja3IuY29tL3NlcnZpY2VzL2FwaS9mbGlja3IucGhvdG9zZXRzLmVkaXRNZXRhLmh0bWwgKi8KCQkJJHRoaXMtPnJlcXVlc3QoImZsaWNrci5waG90b3NldHMuZWRpdE1ldGEiLCBhcnJheSgicGhvdG9zZXRfaWQiID0+ICRwaG90b3NldF9pZCwgInRpdGxlIiA9PiAkdGl0bGUsICJkZXNjcmlwdGlvbiIgPT4gJGRlc2NyaXB0aW9uKSwgVFJVRSk7CgkJCXJldHVybiAkdGhpcy0+cGFyc2VkX3Jlc3BvbnNlID8gdHJ1ZSA6IGZhbHNlOwoJCX0KCgkJZnVuY3Rpb24gcGhvdG9zZXRzX2VkaXRQaG90b3MgKCRwaG90b3NldF9pZCwgJHByaW1hcnlfcGhvdG9faWQsICRwaG90b19pZHMpIHsKCQkJLyogaHR0cDovL3d3dy5mbGlja3IuY29tL3NlcnZpY2VzL2FwaS9mbGlja3IucGhvdG9zZXRzLmVkaXRQaG90b3MuaHRtbCAqLwoJCQkkdGhpcy0+cmVxdWVzdCgiZmxpY2tyLnBob3Rvc2V0cy5lZGl0UGhvdG9zIiwgYXJyYXkoInBob3Rvc2V0X2lkIiA9PiAkcGhvdG9zZXRfaWQsICJwcmltYXJ5X3Bob3RvX2lkIiA9PiAkcHJpbWFyeV9waG90b19pZCwgInBob3RvX2lkcyIgPT4gJHBob3RvX2lkcyksIFRSVUUpOwoJCQlyZXR1cm4gJHRoaXMtPnBhcnNlZF9yZXNwb25zZSA/IHRydWUgOiBmYWxzZTsKCQl9CgoJCWZ1bmN0aW9uIHBob3Rvc2V0c19nZXRDb250ZXh0ICgkcGhvdG9faWQsICRwaG90b3NldF9pZCwgJG51bV9wcmV2ID0gTlVMTCwgJG51bV9uZXh0ID0gTlVMTCkgewoJCQkvKiBodHRwOi8vd3d3LmZsaWNrci5jb20vc2VydmljZXMvYXBpL2ZsaWNrci5waG90b3NldHMuZ2V0Q29udGV4dC5odG1sICovCgkJCXJldHVybiAkdGhpcy0+Y2FsbCgnZmxpY2tyLnBob3Rvc2V0cy5nZXRDb250ZXh0JywgYXJyYXkoJ3Bob3RvX2lkJyA9PiAkcGhvdG9faWQsICdwaG90b3NldF9pZCcgPT4gJHBob3Rvc2V0X2lkLCAnbnVtX3ByZXYnID0+ICRudW1fcHJldiwgJ251bV9uZXh0JyA9PiAkbnVtX25leHQpKTsKCQl9CgkJCgkJZnVuY3Rpb24gcGhvdG9zZXRzX2dldEluZm8gKCRwaG90b3NldF9pZCkgewoJCQkvKiBodHRwOi8vd3d3LmZsaWNrci5jb20vc2VydmljZXMvYXBpL2ZsaWNrci5waG90b3NldHMuZ2V0SW5mby5odG1sICovCgkJCSR0aGlzLT5yZXF1ZXN0KCJmbGlja3IucGhvdG9zZXRzLmdldEluZm8iLCBhcnJheSgicGhvdG9zZXRfaWQiID0+ICRwaG90b3NldF9pZCkpOwoJCQlyZXR1cm4gJHRoaXMtPnBhcnNlZF9yZXNwb25zZSA/ICR0aGlzLT5wYXJzZWRfcmVzcG9uc2VbJ3Bob3Rvc2V0J10gOiBmYWxzZTsKCQl9CgoJCWZ1bmN0aW9uIHBob3Rvc2V0c19nZXRMaXN0ICgkdXNlcl9pZCA9IE5VTEwpIHsKCQkJLyogaHR0cDovL3d3dy5mbGlja3IuY29tL3NlcnZpY2VzL2FwaS9mbGlja3IucGhvdG9zZXRzLmdldExpc3QuaHRtbCAqLwoJCQkkdGhpcy0+cmVxdWVzdCgiZmxpY2tyLnBob3Rvc2V0cy5nZXRMaXN0IiwgYXJyYXkoInVzZXJfaWQiID0+ICR1c2VyX2lkKSk7CgkJCXJldHVybiAkdGhpcy0+cGFyc2VkX3Jlc3BvbnNlID8gJHRoaXMtPnBhcnNlZF9yZXNwb25zZVsncGhvdG9zZXRzJ10gOiBmYWxzZTsKCQl9CgoJCWZ1bmN0aW9uIHBob3Rvc2V0c19nZXRQaG90b3MgKCRwaG90b3NldF9pZCwgJGV4dHJhcyA9IE5VTEwsICRwcml2YWN5X2ZpbHRlciA9IE5VTEwsICRwZXJfcGFnZSA9IE5VTEwsICRwYWdlID0gTlVMTCwgJG1lZGlhID0gTlVMTCkgewoJCQkvKiBodHRwOi8vd3d3LmZsaWNrci5jb20vc2VydmljZXMvYXBpL2ZsaWNrci5waG90b3NldHMuZ2V0UGhvdG9zLmh0bWwgKi8KCQkJcmV0dXJuICR0aGlzLT5jYWxsKCdmbGlja3IucGhvdG9zZXRzLmdldFBob3RvcycsIGFycmF5KCdwaG90b3NldF9pZCcgPT4gJHBob3Rvc2V0X2lkLCAnZXh0cmFzJyA9PiAkZXh0cmFzLCAncHJpdmFjeV9maWx0ZXInID0+ICRwcml2YWN5X2ZpbHRlciwgJ3Blcl9wYWdlJyA9PiAkcGVyX3BhZ2UsICdwYWdlJyA9PiAkcGFnZSwgJ21lZGlhJyA9PiAkbWVkaWEpKTsKCQl9CgoJCWZ1bmN0aW9uIHBob3Rvc2V0c19vcmRlclNldHMgKCRwaG90b3NldF9pZHMpIHsKCQkJLyogaHR0cDovL3d3dy5mbGlja3IuY29tL3NlcnZpY2VzL2FwaS9mbGlja3IucGhvdG9zZXRzLm9yZGVyU2V0cy5odG1sICovCgkJCWlmIChpc19hcnJheSgkcGhvdG9zZXRfaWRzKSkgewoJCQkJJHBob3Rvc2V0X2lkcyA9IGltcGxvZGUoIiwiLCAkcGhvdG9zZXRfaWRzKTsKCQkJfQoJCQkkdGhpcy0+cmVxdWVzdCgiZmxpY2tyLnBob3Rvc2V0cy5vcmRlclNldHMiLCBhcnJheSgicGhvdG9zZXRfaWRzIiA9PiAkcGhvdG9zZXRfaWRzKSwgVFJVRSk7CgkJCXJldHVybiAkdGhpcy0+cGFyc2VkX3Jlc3BvbnNlID8gdHJ1ZSA6IGZhbHNlOwoJCX0KCgkJZnVuY3Rpb24gcGhvdG9zZXRzX3JlbW92ZVBob3RvICgkcGhvdG9zZXRfaWQsICRwaG90b19pZCkgewoJCQkvKiBodHRwOi8vd3d3LmZsaWNrci5jb20vc2VydmljZXMvYXBpL2ZsaWNrci5waG90b3NldHMucmVtb3ZlUGhvdG8uaHRtbCAqLwoJCQkkdGhpcy0+cmVxdWVzdCgiZmxpY2tyLnBob3Rvc2V0cy5yZW1vdmVQaG90byIsIGFycmF5KCJwaG90b3NldF9pZCIgPT4gJHBob3Rvc2V0X2lkLCAicGhvdG9faWQiID0+ICRwaG90b19pZCksIFRSVUUpOwoJCQlyZXR1cm4gJHRoaXMtPnBhcnNlZF9yZXNwb25zZSA/IHRydWUgOiBmYWxzZTsKCQl9CgkJCgkJZnVuY3Rpb24gcGhvdG9zZXRzX3JlbW92ZVBob3RvcyAoJHBob3Rvc2V0X2lkLCAkcGhvdG9faWRzKSB7CgkJCS8qIGh0dHA6Ly93d3cuZmxpY2tyLmNvbS9zZXJ2aWNlcy9hcGkvZmxpY2tyLnBob3Rvc2V0cy5yZW1vdmVQaG90b3MuaHRtbCAqLwoJCQlyZXR1cm4gJHRoaXMtPmNhbGwoJ2ZsaWNrci5waG90b3NldHMucmVtb3ZlUGhvdG9zJywgYXJyYXkoJ3Bob3Rvc2V0X2lkJyA9PiAkcGhvdG9zZXRfaWQsICdwaG90b19pZHMnID0+ICRwaG90b19pZHMpKTsKCQl9CgkJCgkJZnVuY3Rpb24gcGhvdG9zZXRzX3Jlb3JkZXJQaG90b3MgKCRwaG90b3NldF9pZCwgJHBob3RvX2lkcykgewoJCQkvKiBodHRwOi8vd3d3LmZsaWNrci5jb20vc2VydmljZXMvYXBpL2ZsaWNrci5waG90b3NldHMucmVvcmRlclBob3Rvcy5odG1sICovCgkJCXJldHVybiAkdGhpcy0+Y2FsbCgnZmxpY2tyLnBob3Rvc2V0cy5yZW9yZGVyUGhvdG9zJywgYXJyYXkoJ3Bob3Rvc2V0X2lkJyA9PiAkcGhvdG9zZXRfaWQsICdwaG90b19pZHMnID0+ICRwaG90b19pZHMpKTsKCQl9CgkJCgkJZnVuY3Rpb24gcGhvdG9zZXRzX3NldFByaW1hcnlQaG90byAoJHBob3Rvc2V0X2lkLCAkcGhvdG9faWQpIHsKCQkJLyogaHR0cDovL3d3dy5mbGlja3IuY29tL3NlcnZpY2VzL2FwaS9mbGlja3IucGhvdG9zZXRzLnNldFByaW1hcnlQaG90by5odG1sICovCgkJCXJldHVybiAkdGhpcy0+Y2FsbCgnZmxpY2tyLnBob3Rvc2V0cy5zZXRQcmltYXJ5UGhvdG8nLCBhcnJheSgncGhvdG9zZXRfaWQnID0+ICRwaG90b3NldF9pZCwgJ3Bob3RvX2lkJyA9PiAkcGhvdG9faWQpKTsKCQl9CgoJCS8qIFBob3Rvc2V0cyBDb21tZW50cyBNZXRob2RzICovCgkJZnVuY3Rpb24gcGhvdG9zZXRzX2NvbW1lbnRzX2FkZENvbW1lbnQgKCRwaG90b3NldF9pZCwgJGNvbW1lbnRfdGV4dCkgewoJCQkvKiBodHRwOi8vd3d3LmZsaWNrci5jb20vc2VydmljZXMvYXBpL2ZsaWNrci5waG90b3NldHMuY29tbWVudHMuYWRkQ29tbWVudC5odG1sICovCgkJCSR0aGlzLT5yZXF1ZXN0KCJmbGlja3IucGhvdG9zZXRzLmNvbW1lbnRzLmFkZENvbW1lbnQiLCBhcnJheSgicGhvdG9zZXRfaWQiID0+ICRwaG90b3NldF9pZCwgImNvbW1lbnRfdGV4dCI9PiRjb21tZW50X3RleHQpLCBUUlVFKTsKCQkJcmV0dXJuICR0aGlzLT5wYXJzZWRfcmVzcG9uc2UgPyAkdGhpcy0+cGFyc2VkX3Jlc3BvbnNlWydjb21tZW50J10gOiBmYWxzZTsKCQl9CgoJCWZ1bmN0aW9uIHBob3Rvc2V0c19jb21tZW50c19kZWxldGVDb21tZW50ICgkY29tbWVudF9pZCkgewoJCQkvKiBodHRwOi8vd3d3LmZsaWNrci5jb20vc2VydmljZXMvYXBpL2ZsaWNrci5waG90b3NldHMuY29tbWVudHMuZGVsZXRlQ29tbWVudC5odG1sICovCgkJCSR0aGlzLT5yZXF1ZXN0KCJmbGlja3IucGhvdG9zZXRzLmNvbW1lbnRzLmRlbGV0ZUNvbW1lbnQiLCBhcnJheSgiY29tbWVudF9pZCIgPT4gJGNvbW1lbnRfaWQpLCBUUlVFKTsKCQkJcmV0dXJuICR0aGlzLT5wYXJzZWRfcmVzcG9uc2UgPyB0cnVlIDogZmFsc2U7CgkJfQoKCQlmdW5jdGlvbiBwaG90b3NldHNfY29tbWVudHNfZWRpdENvbW1lbnQgKCRjb21tZW50X2lkLCAkY29tbWVudF90ZXh0KSB7CgkJCS8qIGh0dHA6Ly93d3cuZmxpY2tyLmNvbS9zZXJ2aWNlcy9hcGkvZmxpY2tyLnBob3Rvc2V0cy5jb21tZW50cy5lZGl0Q29tbWVudC5odG1sICovCgkJCSR0aGlzLT5yZXF1ZXN0KCJmbGlja3IucGhvdG9zZXRzLmNvbW1lbnRzLmVkaXRDb21tZW50IiwgYXJyYXkoImNvbW1lbnRfaWQiID0+ICRjb21tZW50X2lkLCAiY29tbWVudF90ZXh0Ij0+JGNvbW1lbnRfdGV4dCksIFRSVUUpOwoJCQlyZXR1cm4gJHRoaXMtPnBhcnNlZF9yZXNwb25zZSA/IHRydWUgOiBmYWxzZTsKCQl9CgoJCWZ1bmN0aW9uIHBob3Rvc2V0c19jb21tZW50c19nZXRMaXN0ICgkcGhvdG9zZXRfaWQpIHsKCQkJLyogaHR0cDovL3d3dy5mbGlja3IuY29tL3NlcnZpY2VzL2FwaS9mbGlja3IucGhvdG9zZXRzLmNvbW1lbnRzLmdldExpc3QuaHRtbCAqLwoJCQkkdGhpcy0+cmVxdWVzdCgiZmxpY2tyLnBob3Rvc2V0cy5jb21tZW50cy5nZXRMaXN0IiwgYXJyYXkoInBob3Rvc2V0X2lkIj0+JHBob3Rvc2V0X2lkKSk7CgkJCXJldHVybiAkdGhpcy0+cGFyc2VkX3Jlc3BvbnNlID8gJHRoaXMtPnBhcnNlZF9yZXNwb25zZVsnY29tbWVudHMnXSA6IGZhbHNlOwoJCX0KCQkKCQkvKiBQbGFjZXMgTWV0aG9kcyAqLwoJCWZ1bmN0aW9uIHBsYWNlc19maW5kICgkcXVlcnkpIHsKCQkJLyogaHR0cDovL3d3dy5mbGlja3IuY29tL3NlcnZpY2VzL2FwaS9mbGlja3IucGxhY2VzLmZpbmQuaHRtbCAqLwoJCQlyZXR1cm4gJHRoaXMtPmNhbGwoJ2ZsaWNrci5wbGFjZXMuZmluZCcsIGFycmF5KCdxdWVyeScgPT4gJHF1ZXJ5KSk7CgkJfQoKCQlmdW5jdGlvbiBwbGFjZXNfZmluZEJ5TGF0TG9uICgkbGF0LCAkbG9uLCAkYWNjdXJhY3kgPSBOVUxMKSB7CgkJCS8qIGh0dHA6Ly93d3cuZmxpY2tyLmNvbS9zZXJ2aWNlcy9hcGkvZmxpY2tyLnBsYWNlcy5maW5kQnlMYXRMb24uaHRtbCAqLwoJCQlyZXR1cm4gJHRoaXMtPmNhbGwoJ2ZsaWNrci5wbGFjZXMuZmluZEJ5TGF0TG9uJywgYXJyYXkoJ2xhdCcgPT4gJGxhdCwgJ2xvbicgPT4gJGxvbiwgJ2FjY3VyYWN5JyA9PiAkYWNjdXJhY3kpKTsKCQl9CgoJCWZ1bmN0aW9uIHBsYWNlc19nZXRDaGlsZHJlbldpdGhQaG90b3NQdWJsaWMgKCRwbGFjZV9pZCA9IE5VTEwsICR3b2VfaWQgPSBOVUxMKSB7CgkJCS8qIGh0dHA6Ly93d3cuZmxpY2tyLmNvbS9zZXJ2aWNlcy9hcGkvZmxpY2tyLnBsYWNlcy5nZXRDaGlsZHJlbldpdGhQaG90b3NQdWJsaWMuaHRtbCAqLwoJCQlyZXR1cm4gJHRoaXMtPmNhbGwoJ2ZsaWNrci5wbGFjZXMuZ2V0Q2hpbGRyZW5XaXRoUGhvdG9zUHVibGljJywgYXJyYXkoJ3BsYWNlX2lkJyA9PiAkcGxhY2VfaWQsICd3b2VfaWQnID0+ICR3b2VfaWQpKTsKCQl9CgoJCWZ1bmN0aW9uIHBsYWNlc19nZXRJbmZvICgkcGxhY2VfaWQgPSBOVUxMLCAkd29lX2lkID0gTlVMTCkgewoJCQkvKiBodHRwOi8vd3d3LmZsaWNrci5jb20vc2VydmljZXMvYXBpL2ZsaWNrci5wbGFjZXMuZ2V0SW5mby5odG1sICovCgkJCXJldHVybiAkdGhpcy0+Y2FsbCgnZmxpY2tyLnBsYWNlcy5nZXRJbmZvJywgYXJyYXkoJ3BsYWNlX2lkJyA9PiAkcGxhY2VfaWQsICd3b2VfaWQnID0+ICR3b2VfaWQpKTsKCQl9CgoJCWZ1bmN0aW9uIHBsYWNlc19nZXRJbmZvQnlVcmwgKCR1cmwpIHsKCQkJLyogaHR0cDovL3d3dy5mbGlja3IuY29tL3NlcnZpY2VzL2FwaS9mbGlja3IucGxhY2VzLmdldEluZm9CeVVybC5odG1sICovCgkJCXJldHVybiAkdGhpcy0+Y2FsbCgnZmxpY2tyLnBsYWNlcy5nZXRJbmZvQnlVcmwnLCBhcnJheSgndXJsJyA9PiAkdXJsKSk7CgkJfQoJCQoJCWZ1bmN0aW9uIHBsYWNlc19nZXRQbGFjZVR5cGVzICgpIHsKCQkJLyogaHR0cDovL3d3dy5mbGlja3IuY29tL3NlcnZpY2VzL2FwaS9mbGlja3IucGxhY2VzLmdldFBsYWNlVHlwZXMuaHRtbCAqLwoJCQlyZXR1cm4gJHRoaXMtPmNhbGwoJ2ZsaWNrci5wbGFjZXMuZ2V0UGxhY2VUeXBlcycsIGFycmF5KCkpOwoJCX0KCQkKCQlmdW5jdGlvbiBwbGFjZXNfZ2V0U2hhcGVIaXN0b3J5ICgkcGxhY2VfaWQgPSBOVUxMLCAkd29lX2lkID0gTlVMTCkgewoJCQkvKiBodHRwOi8vd3d3LmZsaWNrci5jb20vc2VydmljZXMvYXBpL2ZsaWNrci5wbGFjZXMuZ2V0U2hhcGVIaXN0b3J5Lmh0bWwgKi8KCQkJcmV0dXJuICR0aGlzLT5jYWxsKCdmbGlja3IucGxhY2VzLmdldFNoYXBlSGlzdG9yeScsIGFycmF5KCdwbGFjZV9pZCcgPT4gJHBsYWNlX2lkLCAnd29lX2lkJyA9PiAkd29lX2lkKSk7CgkJfQoKCQlmdW5jdGlvbiBwbGFjZXNfZ2V0VG9wUGxhY2VzTGlzdCAoJHBsYWNlX3R5cGVfaWQsICRkYXRlID0gTlVMTCwgJHdvZV9pZCA9IE5VTEwsICRwbGFjZV9pZCA9IE5VTEwpIHsKCQkJLyogaHR0cDovL3d3dy5mbGlja3IuY29tL3NlcnZpY2VzL2FwaS9mbGlja3IucGxhY2VzLmdldFRvcFBsYWNlc0xpc3QuaHRtbCAqLwoJCQlyZXR1cm4gJHRoaXMtPmNhbGwoJ2ZsaWNrci5wbGFjZXMuZ2V0VG9wUGxhY2VzTGlzdCcsIGFycmF5KCdwbGFjZV90eXBlX2lkJyA9PiAkcGxhY2VfdHlwZV9pZCwgJ2RhdGUnID0+ICRkYXRlLCAnd29lX2lkJyA9PiAkd29lX2lkLCAncGxhY2VfaWQnID0+ICRwbGFjZV9pZCkpOwoJCX0KCQkKCQlmdW5jdGlvbiBwbGFjZXNfcGxhY2VzRm9yQm91bmRpbmdCb3ggKCRiYm94LCAkcGxhY2VfdHlwZSA9IE5VTEwsICRwbGFjZV90eXBlX2lkID0gTlVMTCwgJHJlY3Vyc2l2ZSA9IE5VTEwpIHsKCQkJLyogaHR0cDovL3d3dy5mbGlja3IuY29tL3NlcnZpY2VzL2FwaS9mbGlja3IucGxhY2VzLnBsYWNlc0ZvckJvdW5kaW5nQm94Lmh0bWwgKi8KCQkJcmV0dXJuICR0aGlzLT5jYWxsKCdmbGlja3IucGxhY2VzLnBsYWNlc0ZvckJvdW5kaW5nQm94JywgYXJyYXkoJ2Jib3gnID0+ICRiYm94LCAncGxhY2VfdHlwZScgPT4gJHBsYWNlX3R5cGUsICdwbGFjZV90eXBlX2lkJyA9PiAkcGxhY2VfdHlwZV9pZCwgJ3JlY3Vyc2l2ZScgPT4gJHJlY3Vyc2l2ZSkpOwoJCX0KCgkJZnVuY3Rpb24gcGxhY2VzX3BsYWNlc0ZvckNvbnRhY3RzICgkcGxhY2VfdHlwZSA9IE5VTEwsICRwbGFjZV90eXBlX2lkID0gTlVMTCwgJHdvZV9pZCA9IE5VTEwsICRwbGFjZV9pZCA9IE5VTEwsICR0aHJlc2hvbGQgPSBOVUxMLCAkY29udGFjdHMgPSBOVUxMLCAkbWluX3VwbG9hZF9kYXRlID0gTlVMTCwgJG1heF91cGxvYWRfZGF0ZSA9IE5VTEwsICRtaW5fdGFrZW5fZGF0ZSA9IE5VTEwsICRtYXhfdGFrZW5fZGF0ZSA9IE5VTEwpIHsKCQkJLyogaHR0cDovL3d3dy5mbGlja3IuY29tL3NlcnZpY2VzL2FwaS9mbGlja3IucGxhY2VzLnBsYWNlc0ZvckNvbnRhY3RzLmh0bWwgKi8KCQkJcmV0dXJuICR0aGlzLT5jYWxsKCdmbGlja3IucGxhY2VzLnBsYWNlc0ZvckNvbnRhY3RzJywgYXJyYXkoJ3BsYWNlX3R5cGUnID0+ICRwbGFjZV90eXBlLCAncGxhY2VfdHlwZV9pZCcgPT4gJHBsYWNlX3R5cGVfaWQsICd3b2VfaWQnID0+ICR3b2VfaWQsICdwbGFjZV9pZCcgPT4gJHBsYWNlX2lkLCAndGhyZXNob2xkJyA9PiAkdGhyZXNob2xkLCAnY29udGFjdHMnID0+ICRjb250YWN0cywgJ21pbl91cGxvYWRfZGF0ZScgPT4gJG1pbl91cGxvYWRfZGF0ZSwgJ21heF91cGxvYWRfZGF0ZScgPT4gJG1heF91cGxvYWRfZGF0ZSwgJ21pbl90YWtlbl9kYXRlJyA9PiAkbWluX3Rha2VuX2RhdGUsICdtYXhfdGFrZW5fZGF0ZScgPT4gJG1heF90YWtlbl9kYXRlKSk7CgkJfQoKCQlmdW5jdGlvbiBwbGFjZXNfcGxhY2VzRm9yVGFncyAoJHBsYWNlX3R5cGVfaWQsICR3b2VfaWQgPSBOVUxMLCAkcGxhY2VfaWQgPSBOVUxMLCAkdGhyZXNob2xkID0gTlVMTCwgJHRhZ3MgPSBOVUxMLCAkdGFnX21vZGUgPSBOVUxMLCAkbWFjaGluZV90YWdzID0gTlVMTCwgJG1hY2hpbmVfdGFnX21vZGUgPSBOVUxMLCAkbWluX3VwbG9hZF9kYXRlID0gTlVMTCwgJG1heF91cGxvYWRfZGF0ZSA9IE5VTEwsICRtaW5fdGFrZW5fZGF0ZSA9IE5VTEwsICRtYXhfdGFrZW5fZGF0ZSA9IE5VTEwpIHsKCQkJLyogaHR0cDovL3d3dy5mbGlja3IuY29tL3NlcnZpY2VzL2FwaS9mbGlja3IucGxhY2VzLnBsYWNlc0ZvclRhZ3MuaHRtbCAqLwoJCQlyZXR1cm4gJHRoaXMtPmNhbGwoJ2ZsaWNrci5wbGFjZXMucGxhY2VzRm9yVGFncycsIGFycmF5KCdwbGFjZV90eXBlX2lkJyA9PiAkcGxhY2VfdHlwZV9pZCwgJ3dvZV9pZCcgPT4gJHdvZV9pZCwgJ3BsYWNlX2lkJyA9PiAkcGxhY2VfaWQsICd0aHJlc2hvbGQnID0+ICR0aHJlc2hvbGQsICd0YWdzJyA9PiAkdGFncywgJ3RhZ19tb2RlJyA9PiAkdGFnX21vZGUsICdtYWNoaW5lX3RhZ3MnID0+ICRtYWNoaW5lX3RhZ3MsICdtYWNoaW5lX3RhZ19tb2RlJyA9PiAkbWFjaGluZV90YWdfbW9kZSwgJ21pbl91cGxvYWRfZGF0ZScgPT4gJG1pbl91cGxvYWRfZGF0ZSwgJ21heF91cGxvYWRfZGF0ZScgPT4gJG1heF91cGxvYWRfZGF0ZSwgJ21pbl90YWtlbl9kYXRlJyA9PiAkbWluX3Rha2VuX2RhdGUsICdtYXhfdGFrZW5fZGF0ZScgPT4gJG1heF90YWtlbl9kYXRlKSk7CgkJfQoKCQlmdW5jdGlvbiBwbGFjZXNfcGxhY2VzRm9yVXNlciAoJHBsYWNlX3R5cGVfaWQgPSBOVUxMLCAkcGxhY2VfdHlwZSA9IE5VTEwsICR3b2VfaWQgPSBOVUxMLCAkcGxhY2VfaWQgPSBOVUxMLCAkdGhyZXNob2xkID0gTlVMTCwgJG1pbl91cGxvYWRfZGF0ZSA9IE5VTEwsICRtYXhfdXBsb2FkX2RhdGUgPSBOVUxMLCAkbWluX3Rha2VuX2RhdGUgPSBOVUxMLCAkbWF4X3Rha2VuX2RhdGUgPSBOVUxMKSB7CgkJCS8qIGh0dHA6Ly93d3cuZmxpY2tyLmNvbS9zZXJ2aWNlcy9hcGkvZmxpY2tyLnBsYWNlcy5wbGFjZXNGb3JVc2VyLmh0bWwgKi8KCQkJcmV0dXJuICR0aGlzLT5jYWxsKCdmbGlja3IucGxhY2VzLnBsYWNlc0ZvclVzZXInLCBhcnJheSgncGxhY2VfdHlwZV9pZCcgPT4gJHBsYWNlX3R5cGVfaWQsICdwbGFjZV90eXBlJyA9PiAkcGxhY2VfdHlwZSwgJ3dvZV9pZCcgPT4gJHdvZV9pZCwgJ3BsYWNlX2lkJyA9PiAkcGxhY2VfaWQsICd0aHJlc2hvbGQnID0+ICR0aHJlc2hvbGQsICdtaW5fdXBsb2FkX2RhdGUnID0+ICRtaW5fdXBsb2FkX2RhdGUsICdtYXhfdXBsb2FkX2RhdGUnID0+ICRtYXhfdXBsb2FkX2RhdGUsICdtaW5fdGFrZW5fZGF0ZScgPT4gJG1pbl90YWtlbl9kYXRlLCAnbWF4X3Rha2VuX2RhdGUnID0+ICRtYXhfdGFrZW5fZGF0ZSkpOwoJCX0KCQkKCQlmdW5jdGlvbiBwbGFjZXNfcmVzb2x2ZVBsYWNlSWQgKCRwbGFjZV9pZCkgewoJCQkvKiBodHRwOi8vd3d3LmZsaWNrci5jb20vc2VydmljZXMvYXBpL2ZsaWNrci5wbGFjZXMucmVzb2x2ZVBsYWNlSWQuaHRtbCAqLwoJCQkkcnNwID0gJHRoaXMtPmNhbGwoJ2ZsaWNrci5wbGFjZXMucmVzb2x2ZVBsYWNlSWQnLCBhcnJheSgncGxhY2VfaWQnID0+ICRwbGFjZV9pZCkpOwoJCQlyZXR1cm4gJHJzcCA/ICRyc3BbJ2xvY2F0aW9uJ10gOiAkcnNwOwoJCX0KCQkKCQlmdW5jdGlvbiBwbGFjZXNfcmVzb2x2ZVBsYWNlVVJMICgkdXJsKSB7CgkJCS8qIGh0dHA6Ly93d3cuZmxpY2tyLmNvbS9zZXJ2aWNlcy9hcGkvZmxpY2tyLnBsYWNlcy5yZXNvbHZlUGxhY2VVUkwuaHRtbCAqLwoJCQkkcnNwID0gJHRoaXMtPmNhbGwoJ2ZsaWNrci5wbGFjZXMucmVzb2x2ZVBsYWNlVVJMJywgYXJyYXkoJ3VybCcgPT4gJHVybCkpOwoJCQlyZXR1cm4gJHJzcCA/ICRyc3BbJ2xvY2F0aW9uJ10gOiAkcnNwOwoJCX0KCQkKCQlmdW5jdGlvbiBwbGFjZXNfdGFnc0ZvclBsYWNlICgkd29lX2lkID0gTlVMTCwgJHBsYWNlX2lkID0gTlVMTCwgJG1pbl91cGxvYWRfZGF0ZSA9IE5VTEwsICRtYXhfdXBsb2FkX2RhdGUgPSBOVUxMLCAkbWluX3Rha2VuX2RhdGUgPSBOVUxMLCAkbWF4X3Rha2VuX2RhdGUgPSBOVUxMKSB7CgkJCS8qIGh0dHA6Ly93d3cuZmxpY2tyLmNvbS9zZXJ2aWNlcy9hcGkvZmxpY2tyLnBsYWNlcy50YWdzRm9yUGxhY2UuaHRtbCAqLwoJCQlyZXR1cm4gJHRoaXMtPmNhbGwoJ2ZsaWNrci5wbGFjZXMudGFnc0ZvclBsYWNlJywgYXJyYXkoJ3dvZV9pZCcgPT4gJHdvZV9pZCwgJ3BsYWNlX2lkJyA9PiAkcGxhY2VfaWQsICdtaW5fdXBsb2FkX2RhdGUnID0+ICRtaW5fdXBsb2FkX2RhdGUsICdtYXhfdXBsb2FkX2RhdGUnID0+ICRtYXhfdXBsb2FkX2RhdGUsICdtaW5fdGFrZW5fZGF0ZScgPT4gJG1pbl90YWtlbl9kYXRlLCAnbWF4X3Rha2VuX2RhdGUnID0+ICRtYXhfdGFrZW5fZGF0ZSkpOwoJCX0KCgkJLyogUHJlZnMgTWV0aG9kcyAqLwoJCWZ1bmN0aW9uIHByZWZzX2dldENvbnRlbnRUeXBlICgpIHsKCQkJLyogaHR0cDovL3d3dy5mbGlja3IuY29tL3NlcnZpY2VzL2FwaS9mbGlja3IucHJlZnMuZ2V0Q29udGVudFR5cGUuaHRtbCAqLwoJCQkkcnNwID0gJHRoaXMtPmNhbGwoJ2ZsaWNrci5wcmVmcy5nZXRDb250ZW50VHlwZScsIGFycmF5KCkpOwoJCQlyZXR1cm4gJHJzcCA/ICRyc3BbJ3BlcnNvbiddIDogJHJzcDsKCQl9CgkJCgkJZnVuY3Rpb24gcHJlZnNfZ2V0R2VvUGVybXMgKCkgewoJCQkvKiBodHRwOi8vd3d3LmZsaWNrci5jb20vc2VydmljZXMvYXBpL2ZsaWNrci5wcmVmcy5nZXRHZW9QZXJtcy5odG1sICovCgkJCXJldHVybiAkdGhpcy0+Y2FsbCgnZmxpY2tyLnByZWZzLmdldEdlb1Blcm1zJywgYXJyYXkoKSk7CgkJfQoJCQoJCWZ1bmN0aW9uIHByZWZzX2dldEhpZGRlbiAoKSB7CgkJCS8qIGh0dHA6Ly93d3cuZmxpY2tyLmNvbS9zZXJ2aWNlcy9hcGkvZmxpY2tyLnByZWZzLmdldEhpZGRlbi5odG1sICovCgkJCSRyc3AgPSAkdGhpcy0+Y2FsbCgnZmxpY2tyLnByZWZzLmdldEhpZGRlbicsIGFycmF5KCkpOwoJCQlyZXR1cm4gJHJzcCA/ICRyc3BbJ3BlcnNvbiddIDogJHJzcDsKCQl9CgkJCgkJZnVuY3Rpb24gcHJlZnNfZ2V0UHJpdmFjeSAoKSB7CgkJCS8qIGh0dHA6Ly93d3cuZmxpY2tyLmNvbS9zZXJ2aWNlcy9hcGkvZmxpY2tyLnByZWZzLmdldFByaXZhY3kuaHRtbCAqLwoJCQkkcnNwID0gJHRoaXMtPmNhbGwoJ2ZsaWNrci5wcmVmcy5nZXRQcml2YWN5JywgYXJyYXkoKSk7CgkJCXJldHVybiAkcnNwID8gJHJzcFsncGVyc29uJ10gOiAkcnNwOwoJCX0KCQkKCQlmdW5jdGlvbiBwcmVmc19nZXRTYWZldHlMZXZlbCAoKSB7CgkJCS8qIGh0dHA6Ly93d3cuZmxpY2tyLmNvbS9zZXJ2aWNlcy9hcGkvZmxpY2tyLnByZWZzLmdldFNhZmV0eUxldmVsLmh0bWwgKi8KCQkJJHJzcCA9ICR0aGlzLT5jYWxsKCdmbGlja3IucHJlZnMuZ2V0U2FmZXR5TGV2ZWwnLCBhcnJheSgpKTsKCQkJcmV0dXJuICRyc3AgPyAkcnNwWydwZXJzb24nXSA6ICRyc3A7CgkJfQoKCQkvKiBSZWZsZWN0aW9uIE1ldGhvZHMgKi8KCQlmdW5jdGlvbiByZWZsZWN0aW9uX2dldE1ldGhvZEluZm8gKCRtZXRob2RfbmFtZSkgewoJCQkvKiBodHRwOi8vd3d3LmZsaWNrci5jb20vc2VydmljZXMvYXBpL2ZsaWNrci5yZWZsZWN0aW9uLmdldE1ldGhvZEluZm8uaHRtbCAqLwoJCQkkdGhpcy0+cmVxdWVzdCgiZmxpY2tyLnJlZmxlY3Rpb24uZ2V0TWV0aG9kSW5mbyIsIGFycmF5KCJtZXRob2RfbmFtZSIgPT4gJG1ldGhvZF9uYW1lKSk7CgkJCXJldHVybiAkdGhpcy0+cGFyc2VkX3Jlc3BvbnNlID8gJHRoaXMtPnBhcnNlZF9yZXNwb25zZSA6IGZhbHNlOwoJCX0KCgkJZnVuY3Rpb24gcmVmbGVjdGlvbl9nZXRNZXRob2RzICgpIHsKCQkJLyogaHR0cDovL3d3dy5mbGlja3IuY29tL3NlcnZpY2VzL2FwaS9mbGlja3IucmVmbGVjdGlvbi5nZXRNZXRob2RzLmh0bWwgKi8KCQkJJHRoaXMtPnJlcXVlc3QoImZsaWNrci5yZWZsZWN0aW9uLmdldE1ldGhvZHMiKTsKCQkJcmV0dXJuICR0aGlzLT5wYXJzZWRfcmVzcG9uc2UgPyAkdGhpcy0+cGFyc2VkX3Jlc3BvbnNlWydtZXRob2RzJ11bJ21ldGhvZCddIDogZmFsc2U7CgkJfQoKCQkvKiBTdGF0cyBNZXRob2RzICovCgkJZnVuY3Rpb24gc3RhdHNfZ2V0Q29sbGVjdGlvbkRvbWFpbnMgKCRkYXRlLCAkY29sbGVjdGlvbl9pZCA9IE5VTEwsICRwZXJfcGFnZSA9IE5VTEwsICRwYWdlID0gTlVMTCkgewoJCQkvKiBodHRwOi8vd3d3LmZsaWNrci5jb20vc2VydmljZXMvYXBpL2ZsaWNrci5zdGF0cy5nZXRDb2xsZWN0aW9uRG9tYWlucy5odG1sICovCgkJCXJldHVybiAkdGhpcy0+Y2FsbCgnZmxpY2tyLnN0YXRzLmdldENvbGxlY3Rpb25Eb21haW5zJywgYXJyYXkoJ2RhdGUnID0+ICRkYXRlLCAnY29sbGVjdGlvbl9pZCcgPT4gJGNvbGxlY3Rpb25faWQsICdwZXJfcGFnZScgPT4gJHBlcl9wYWdlLCAncGFnZScgPT4gJHBhZ2UpKTsKCQl9CgoJCWZ1bmN0aW9uIHN0YXRzX2dldENvbGxlY3Rpb25SZWZlcnJlcnMgKCRkYXRlLCAkZG9tYWluLCAkY29sbGVjdGlvbl9pZCA9IE5VTEwsICRwZXJfcGFnZSA9IE5VTEwsICRwYWdlID0gTlVMTCkgewoJCQkvKiBodHRwOi8vd3d3LmZsaWNrci5jb20vc2VydmljZXMvYXBpL2ZsaWNrci5zdGF0cy5nZXRDb2xsZWN0aW9uUmVmZXJyZXJzLmh0bWwgKi8KCQkJcmV0dXJuICR0aGlzLT5jYWxsKCdmbGlja3Iuc3RhdHMuZ2V0Q29sbGVjdGlvblJlZmVycmVycycsIGFycmF5KCdkYXRlJyA9PiAkZGF0ZSwgJ2RvbWFpbicgPT4gJGRvbWFpbiwgJ2NvbGxlY3Rpb25faWQnID0+ICRjb2xsZWN0aW9uX2lkLCAncGVyX3BhZ2UnID0+ICRwZXJfcGFnZSwgJ3BhZ2UnID0+ICRwYWdlKSk7CgkJfQoKCQlmdW5jdGlvbiBzdGF0c19nZXRDb2xsZWN0aW9uU3RhdHMgKCRkYXRlLCAkY29sbGVjdGlvbl9pZCkgewoJCQkvKiBodHRwOi8vd3d3LmZsaWNrci5jb20vc2VydmljZXMvYXBpL2ZsaWNrci5zdGF0cy5nZXRDb2xsZWN0aW9uU3RhdHMuaHRtbCAqLwoJCQlyZXR1cm4gJHRoaXMtPmNhbGwoJ2ZsaWNrci5zdGF0cy5nZXRDb2xsZWN0aW9uU3RhdHMnLCBhcnJheSgnZGF0ZScgPT4gJGRhdGUsICdjb2xsZWN0aW9uX2lkJyA9PiAkY29sbGVjdGlvbl9pZCkpOwoJCX0KCQkKCQlmdW5jdGlvbiBzdGF0c19nZXRDU1ZGaWxlcyAoKSB7CgkJCS8qIGh0dHA6Ly93d3cuZmxpY2tyLmNvbS9zZXJ2aWNlcy9hcGkvZmxpY2tyLnN0YXRzLmdldENTVkZpbGVzLmh0bWwgKi8KCQkJcmV0dXJuICR0aGlzLT5jYWxsKCdmbGlja3Iuc3RhdHMuZ2V0Q1NWRmlsZXMnLCBhcnJheSgpKTsKCQl9CgoJCWZ1bmN0aW9uIHN0YXRzX2dldFBob3RvRG9tYWlucyAoJGRhdGUsICRwaG90b19pZCA9IE5VTEwsICRwZXJfcGFnZSA9IE5VTEwsICRwYWdlID0gTlVMTCkgewoJCQkvKiBodHRwOi8vd3d3LmZsaWNrci5jb20vc2VydmljZXMvYXBpL2ZsaWNrci5zdGF0cy5nZXRQaG90b0RvbWFpbnMuaHRtbCAqLwoJCQlyZXR1cm4gJHRoaXMtPmNhbGwoJ2ZsaWNrci5zdGF0cy5nZXRQaG90b0RvbWFpbnMnLCBhcnJheSgnZGF0ZScgPT4gJGRhdGUsICdwaG90b19pZCcgPT4gJHBob3RvX2lkLCAncGVyX3BhZ2UnID0+ICRwZXJfcGFnZSwgJ3BhZ2UnID0+ICRwYWdlKSk7CgkJfQoKCQlmdW5jdGlvbiBzdGF0c19nZXRQaG90b1JlZmVycmVycyAoJGRhdGUsICRkb21haW4sICRwaG90b19pZCA9IE5VTEwsICRwZXJfcGFnZSA9IE5VTEwsICRwYWdlID0gTlVMTCkgewoJCQkvKiBodHRwOi8vd3d3LmZsaWNrci5jb20vc2VydmljZXMvYXBpL2ZsaWNrci5zdGF0cy5nZXRQaG90b1JlZmVycmVycy5odG1sICovCgkJCXJldHVybiAkdGhpcy0+Y2FsbCgnZmxpY2tyLnN0YXRzLmdldFBob3RvUmVmZXJyZXJzJywgYXJyYXkoJ2RhdGUnID0+ICRkYXRlLCAnZG9tYWluJyA9PiAkZG9tYWluLCAncGhvdG9faWQnID0+ICRwaG90b19pZCwgJ3Blcl9wYWdlJyA9PiAkcGVyX3BhZ2UsICdwYWdlJyA9PiAkcGFnZSkpOwoJCX0KCgkJZnVuY3Rpb24gc3RhdHNfZ2V0UGhvdG9zZXREb21haW5zICgkZGF0ZSwgJHBob3Rvc2V0X2lkID0gTlVMTCwgJHBlcl9wYWdlID0gTlVMTCwgJHBhZ2UgPSBOVUxMKSB7CgkJCS8qIGh0dHA6Ly93d3cuZmxpY2tyLmNvbS9zZXJ2aWNlcy9hcGkvZmxpY2tyLnN0YXRzLmdldFBob3Rvc2V0RG9tYWlucy5odG1sICovCgkJCXJldHVybiAkdGhpcy0+Y2FsbCgnZmxpY2tyLnN0YXRzLmdldFBob3Rvc2V0RG9tYWlucycsIGFycmF5KCdkYXRlJyA9PiAkZGF0ZSwgJ3Bob3Rvc2V0X2lkJyA9PiAkcGhvdG9zZXRfaWQsICdwZXJfcGFnZScgPT4gJHBlcl9wYWdlLCAncGFnZScgPT4gJHBhZ2UpKTsKCQl9CgoJCWZ1bmN0aW9uIHN0YXRzX2dldFBob3Rvc2V0UmVmZXJyZXJzICgkZGF0ZSwgJGRvbWFpbiwgJHBob3Rvc2V0X2lkID0gTlVMTCwgJHBlcl9wYWdlID0gTlVMTCwgJHBhZ2UgPSBOVUxMKSB7CgkJCS8qIGh0dHA6Ly93d3cuZmxpY2tyLmNvbS9zZXJ2aWNlcy9hcGkvZmxpY2tyLnN0YXRzLmdldFBob3Rvc2V0UmVmZXJyZXJzLmh0bWwgKi8KCQkJcmV0dXJuICR0aGlzLT5jYWxsKCdmbGlja3Iuc3RhdHMuZ2V0UGhvdG9zZXRSZWZlcnJlcnMnLCBhcnJheSgnZGF0ZScgPT4gJGRhdGUsICdkb21haW4nID0+ICRkb21haW4sICdwaG90b3NldF9pZCcgPT4gJHBob3Rvc2V0X2lkLCAncGVyX3BhZ2UnID0+ICRwZXJfcGFnZSwgJ3BhZ2UnID0+ICRwYWdlKSk7CgkJfQoKCQlmdW5jdGlvbiBzdGF0c19nZXRQaG90b3NldFN0YXRzICgkZGF0ZSwgJHBob3Rvc2V0X2lkKSB7CgkJCS8qIGh0dHA6Ly93d3cuZmxpY2tyLmNvbS9zZXJ2aWNlcy9hcGkvZmxpY2tyLnN0YXRzLmdldFBob3Rvc2V0U3RhdHMuaHRtbCAqLwoJCQlyZXR1cm4gJHRoaXMtPmNhbGwoJ2ZsaWNrci5zdGF0cy5nZXRQaG90b3NldFN0YXRzJywgYXJyYXkoJ2RhdGUnID0+ICRkYXRlLCAncGhvdG9zZXRfaWQnID0+ICRwaG90b3NldF9pZCkpOwoJCX0KCgkJZnVuY3Rpb24gc3RhdHNfZ2V0UGhvdG9TdGF0cyAoJGRhdGUsICRwaG90b19pZCkgewoJCQkvKiBodHRwOi8vd3d3LmZsaWNrci5jb20vc2VydmljZXMvYXBpL2ZsaWNrci5zdGF0cy5nZXRQaG90b1N0YXRzLmh0bWwgKi8KCQkJcmV0dXJuICR0aGlzLT5jYWxsKCdmbGlja3Iuc3RhdHMuZ2V0UGhvdG9TdGF0cycsIGFycmF5KCdkYXRlJyA9PiAkZGF0ZSwgJ3Bob3RvX2lkJyA9PiAkcGhvdG9faWQpKTsKCQl9CgoJCWZ1bmN0aW9uIHN0YXRzX2dldFBob3Rvc3RyZWFtRG9tYWlucyAoJGRhdGUsICRwZXJfcGFnZSA9IE5VTEwsICRwYWdlID0gTlVMTCkgewoJCQkvKiBodHRwOi8vd3d3LmZsaWNrci5jb20vc2VydmljZXMvYXBpL2ZsaWNrci5zdGF0cy5nZXRQaG90b3N0cmVhbURvbWFpbnMuaHRtbCAqLwoJCQlyZXR1cm4gJHRoaXMtPmNhbGwoJ2ZsaWNrci5zdGF0cy5nZXRQaG90b3N0cmVhbURvbWFpbnMnLCBhcnJheSgnZGF0ZScgPT4gJGRhdGUsICdwZXJfcGFnZScgPT4gJHBlcl9wYWdlLCAncGFnZScgPT4gJHBhZ2UpKTsKCQl9CgoJCWZ1bmN0aW9uIHN0YXRzX2dldFBob3Rvc3RyZWFtUmVmZXJyZXJzICgkZGF0ZSwgJGRvbWFpbiwgJHBlcl9wYWdlID0gTlVMTCwgJHBhZ2UgPSBOVUxMKSB7CgkJCS8qIGh0dHA6Ly93d3cuZmxpY2tyLmNvbS9zZXJ2aWNlcy9hcGkvZmxpY2tyLnN0YXRzLmdldFBob3Rvc3RyZWFtUmVmZXJyZXJzLmh0bWwgKi8KCQkJcmV0dXJuICR0aGlzLT5jYWxsKCdmbGlja3Iuc3RhdHMuZ2V0UGhvdG9zdHJlYW1SZWZlcnJlcnMnLCBhcnJheSgnZGF0ZScgPT4gJGRhdGUsICdkb21haW4nID0+ICRkb21haW4sICdwZXJfcGFnZScgPT4gJHBlcl9wYWdlLCAncGFnZScgPT4gJHBhZ2UpKTsKCQl9CgoJCWZ1bmN0aW9uIHN0YXRzX2dldFBob3Rvc3RyZWFtU3RhdHMgKCRkYXRlKSB7CgkJCS8qIGh0dHA6Ly93d3cuZmxpY2tyLmNvbS9zZXJ2aWNlcy9hcGkvZmxpY2tyLnN0YXRzLmdldFBob3Rvc3RyZWFtU3RhdHMuaHRtbCAqLwoJCQlyZXR1cm4gJHRoaXMtPmNhbGwoJ2ZsaWNrci5zdGF0cy5nZXRQaG90b3N0cmVhbVN0YXRzJywgYXJyYXkoJ2RhdGUnID0+ICRkYXRlKSk7CgkJfQoKCQlmdW5jdGlvbiBzdGF0c19nZXRQb3B1bGFyUGhvdG9zICgkZGF0ZSA9IE5VTEwsICRzb3J0ID0gTlVMTCwgJHBlcl9wYWdlID0gTlVMTCwgJHBhZ2UgPSBOVUxMKSB7CgkJCS8qIGh0dHA6Ly93d3cuZmxpY2tyLmNvbS9zZXJ2aWNlcy9hcGkvZmxpY2tyLnN0YXRzLmdldFBvcHVsYXJQaG90b3MuaHRtbCAqLwoJCQlyZXR1cm4gJHRoaXMtPmNhbGwoJ2ZsaWNrci5zdGF0cy5nZXRQb3B1bGFyUGhvdG9zJywgYXJyYXkoJ2RhdGUnID0+ICRkYXRlLCAnc29ydCcgPT4gJHNvcnQsICdwZXJfcGFnZScgPT4gJHBlcl9wYWdlLCAncGFnZScgPT4gJHBhZ2UpKTsKCQl9CgoJCWZ1bmN0aW9uIHN0YXRzX2dldFRvdGFsVmlld3MgKCRkYXRlID0gTlVMTCkgewoJCQkvKiBodHRwOi8vd3d3LmZsaWNrci5jb20vc2VydmljZXMvYXBpL2ZsaWNrci5zdGF0cy5nZXRUb3RhbFZpZXdzLmh0bWwgKi8KCQkJcmV0dXJuICR0aGlzLT5jYWxsKCdmbGlja3Iuc3RhdHMuZ2V0VG90YWxWaWV3cycsIGFycmF5KCdkYXRlJyA9PiAkZGF0ZSkpOwoJCX0KCQkKCQkvKiBUYWdzIE1ldGhvZHMgKi8KCQlmdW5jdGlvbiB0YWdzX2dldENsdXN0ZXJQaG90b3MgKCR0YWcsICRjbHVzdGVyX2lkKSB7CgkJCS8qIGh0dHA6Ly93d3cuZmxpY2tyLmNvbS9zZXJ2aWNlcy9hcGkvZmxpY2tyLnRhZ3MuZ2V0Q2x1c3RlclBob3Rvcy5odG1sICovCgkJCXJldHVybiAkdGhpcy0+Y2FsbCgnZmxpY2tyLnRhZ3MuZ2V0Q2x1c3RlclBob3RvcycsIGFycmF5KCd0YWcnID0+ICR0YWcsICdjbHVzdGVyX2lkJyA9PiAkY2x1c3Rlcl9pZCkpOwoJCX0KCgkJZnVuY3Rpb24gdGFnc19nZXRDbHVzdGVycyAoJHRhZykgewoJCQkvKiBodHRwOi8vd3d3LmZsaWNrci5jb20vc2VydmljZXMvYXBpL2ZsaWNrci50YWdzLmdldENsdXN0ZXJzLmh0bWwgKi8KCQkJcmV0dXJuICR0aGlzLT5jYWxsKCdmbGlja3IudGFncy5nZXRDbHVzdGVycycsIGFycmF5KCd0YWcnID0+ICR0YWcpKTsKCQl9CgoJCWZ1bmN0aW9uIHRhZ3NfZ2V0SG90TGlzdCAoJHBlcmlvZCA9IE5VTEwsICRjb3VudCA9IE5VTEwpIHsKCQkJLyogaHR0cDovL3d3dy5mbGlja3IuY29tL3NlcnZpY2VzL2FwaS9mbGlja3IudGFncy5nZXRIb3RMaXN0Lmh0bWwgKi8KCQkJJHRoaXMtPnJlcXVlc3QoImZsaWNrci50YWdzLmdldEhvdExpc3QiLCBhcnJheSgicGVyaW9kIiA9PiAkcGVyaW9kLCAiY291bnQiID0+ICRjb3VudCkpOwoJCQlyZXR1cm4gJHRoaXMtPnBhcnNlZF9yZXNwb25zZSA/ICR0aGlzLT5wYXJzZWRfcmVzcG9uc2VbJ2hvdHRhZ3MnXSA6IGZhbHNlOwoJCX0KCgkJZnVuY3Rpb24gdGFnc19nZXRMaXN0UGhvdG8gKCRwaG90b19pZCkgewoJCQkvKiBodHRwOi8vd3d3LmZsaWNrci5jb20vc2VydmljZXMvYXBpL2ZsaWNrci50YWdzLmdldExpc3RQaG90by5odG1sICovCgkJCSR0aGlzLT5yZXF1ZXN0KCJmbGlja3IudGFncy5nZXRMaXN0UGhvdG8iLCBhcnJheSgicGhvdG9faWQiID0+ICRwaG90b19pZCkpOwoJCQlyZXR1cm4gJHRoaXMtPnBhcnNlZF9yZXNwb25zZSA/ICR0aGlzLT5wYXJzZWRfcmVzcG9uc2VbJ3Bob3RvJ11bJ3RhZ3MnXVsndGFnJ10gOiBmYWxzZTsKCQl9CgoJCWZ1bmN0aW9uIHRhZ3NfZ2V0TGlzdFVzZXIgKCR1c2VyX2lkID0gTlVMTCkgewoJCQkvKiBodHRwOi8vd3d3LmZsaWNrci5jb20vc2VydmljZXMvYXBpL2ZsaWNrci50YWdzLmdldExpc3RVc2VyLmh0bWwgKi8KCQkJJHRoaXMtPnJlcXVlc3QoImZsaWNrci50YWdzLmdldExpc3RVc2VyIiwgYXJyYXkoInVzZXJfaWQiID0+ICR1c2VyX2lkKSk7CgkJCXJldHVybiAkdGhpcy0+cGFyc2VkX3Jlc3BvbnNlID8gJHRoaXMtPnBhcnNlZF9yZXNwb25zZVsnd2hvJ11bJ3RhZ3MnXVsndGFnJ10gOiBmYWxzZTsKCQl9CgoJCWZ1bmN0aW9uIHRhZ3NfZ2V0TGlzdFVzZXJQb3B1bGFyICgkdXNlcl9pZCA9IE5VTEwsICRjb3VudCA9IE5VTEwpIHsKCQkJLyogaHR0cDovL3d3dy5mbGlja3IuY29tL3NlcnZpY2VzL2FwaS9mbGlja3IudGFncy5nZXRMaXN0VXNlclBvcHVsYXIuaHRtbCAqLwoJCQkkdGhpcy0+cmVxdWVzdCgiZmxpY2tyLnRhZ3MuZ2V0TGlzdFVzZXJQb3B1bGFyIiwgYXJyYXkoInVzZXJfaWQiID0+ICR1c2VyX2lkLCAiY291bnQiID0+ICRjb3VudCkpOwoJCQlyZXR1cm4gJHRoaXMtPnBhcnNlZF9yZXNwb25zZSA/ICR0aGlzLT5wYXJzZWRfcmVzcG9uc2VbJ3dobyddWyd0YWdzJ11bJ3RhZyddIDogZmFsc2U7CgkJfQoKCQlmdW5jdGlvbiB0YWdzX2dldExpc3RVc2VyUmF3ICgkdGFnID0gTlVMTCkgewoJCQkvKiBodHRwOi8vd3d3LmZsaWNrci5jb20vc2VydmljZXMvYXBpL2ZsaWNrci50YWdzLmdldExpc3RVc2VyUmF3Lmh0bWwgKi8KCQkJcmV0dXJuICR0aGlzLT5jYWxsKCdmbGlja3IudGFncy5nZXRMaXN0VXNlclJhdycsIGFycmF5KCd0YWcnID0+ICR0YWcpKTsKCQl9CgkJCgkJZnVuY3Rpb24gdGFnc19nZXRSZWxhdGVkICgkdGFnKSB7CgkJCS8qIGh0dHA6Ly93d3cuZmxpY2tyLmNvbS9zZXJ2aWNlcy9hcGkvZmxpY2tyLnRhZ3MuZ2V0UmVsYXRlZC5odG1sICovCgkJCSR0aGlzLT5yZXF1ZXN0KCJmbGlja3IudGFncy5nZXRSZWxhdGVkIiwgYXJyYXkoInRhZyIgPT4gJHRhZykpOwoJCQlyZXR1cm4gJHRoaXMtPnBhcnNlZF9yZXNwb25zZSA/ICR0aGlzLT5wYXJzZWRfcmVzcG9uc2VbJ3RhZ3MnXSA6IGZhbHNlOwoJCX0KCgkJZnVuY3Rpb24gdGVzdF9lY2hvICgkYXJncyA9IGFycmF5KCkpIHsKCQkJLyogaHR0cDovL3d3dy5mbGlja3IuY29tL3NlcnZpY2VzL2FwaS9mbGlja3IudGVzdC5lY2hvLmh0bWwgKi8KCQkJJHRoaXMtPnJlcXVlc3QoImZsaWNrci50ZXN0LmVjaG8iLCAkYXJncyk7CgkJCXJldHVybiAkdGhpcy0+cGFyc2VkX3Jlc3BvbnNlID8gJHRoaXMtPnBhcnNlZF9yZXNwb25zZSA6IGZhbHNlOwoJCX0KCgkJZnVuY3Rpb24gdGVzdF9sb2dpbiAoKSB7CgkJCS8qIGh0dHA6Ly93d3cuZmxpY2tyLmNvbS9zZXJ2aWNlcy9hcGkvZmxpY2tyLnRlc3QubG9naW4uaHRtbCAqLwoJCQkkdGhpcy0+cmVxdWVzdCgiZmxpY2tyLnRlc3QubG9naW4iKTsKCQkJcmV0dXJuICR0aGlzLT5wYXJzZWRfcmVzcG9uc2UgPyAkdGhpcy0+cGFyc2VkX3Jlc3BvbnNlWyd1c2VyJ10gOiBmYWxzZTsKCQl9CgoJCWZ1bmN0aW9uIHVybHNfZ2V0R3JvdXAgKCRncm91cF9pZCkgewoJCQkvKiBodHRwOi8vd3d3LmZsaWNrci5jb20vc2VydmljZXMvYXBpL2ZsaWNrci51cmxzLmdldEdyb3VwLmh0bWwgKi8KCQkJJHRoaXMtPnJlcXVlc3QoImZsaWNrci51cmxzLmdldEdyb3VwIiwgYXJyYXkoImdyb3VwX2lkIj0+JGdyb3VwX2lkKSk7CgkJCXJldHVybiAkdGhpcy0+cGFyc2VkX3Jlc3BvbnNlID8gJHRoaXMtPnBhcnNlZF9yZXNwb25zZVsnZ3JvdXAnXVsndXJsJ10gOiBmYWxzZTsKCQl9CgoJCWZ1bmN0aW9uIHVybHNfZ2V0VXNlclBob3RvcyAoJHVzZXJfaWQgPSBOVUxMKSB7CgkJCS8qIGh0dHA6Ly93d3cuZmxpY2tyLmNvbS9zZXJ2aWNlcy9hcGkvZmxpY2tyLnVybHMuZ2V0VXNlclBob3Rvcy5odG1sICovCgkJCSR0aGlzLT5yZXF1ZXN0KCJmbGlja3IudXJscy5nZXRVc2VyUGhvdG9zIiwgYXJyYXkoInVzZXJfaWQiPT4kdXNlcl9pZCkpOwoJCQlyZXR1cm4gJHRoaXMtPnBhcnNlZF9yZXNwb25zZSA/ICR0aGlzLT5wYXJzZWRfcmVzcG9uc2VbJ3VzZXInXVsndXJsJ10gOiBmYWxzZTsKCQl9CgoJCWZ1bmN0aW9uIHVybHNfZ2V0VXNlclByb2ZpbGUgKCR1c2VyX2lkID0gTlVMTCkgewoJCQkvKiBodHRwOi8vd3d3LmZsaWNrci5jb20vc2VydmljZXMvYXBpL2ZsaWNrci51cmxzLmdldFVzZXJQcm9maWxlLmh0bWwgKi8KCQkJJHRoaXMtPnJlcXVlc3QoImZsaWNrci51cmxzLmdldFVzZXJQcm9maWxlIiwgYXJyYXkoInVzZXJfaWQiPT4kdXNlcl9pZCkpOwoJCQlyZXR1cm4gJHRoaXMtPnBhcnNlZF9yZXNwb25zZSA/ICR0aGlzLT5wYXJzZWRfcmVzcG9uc2VbJ3VzZXInXVsndXJsJ10gOiBmYWxzZTsKCQl9CgkJCgkJZnVuY3Rpb24gdXJsc19sb29rdXBHYWxsZXJ5ICgkdXJsKSB7CgkJCS8qIGh0dHA6Ly93d3cuZmxpY2tyLmNvbS9zZXJ2aWNlcy9hcGkvZmxpY2tyLnVybHMubG9va3VwR2FsbGVyeS5odG1sICovCgkJCXJldHVybiAkdGhpcy0+Y2FsbCgnZmxpY2tyLnVybHMubG9va3VwR2FsbGVyeScsIGFycmF5KCd1cmwnID0+ICR1cmwpKTsKCQl9CgoJCWZ1bmN0aW9uIHVybHNfbG9va3VwR3JvdXAgKCR1cmwpIHsKCQkJLyogaHR0cDovL3d3dy5mbGlja3IuY29tL3NlcnZpY2VzL2FwaS9mbGlja3IudXJscy5sb29rdXBHcm91cC5odG1sICovCgkJCSR0aGlzLT5yZXF1ZXN0KCJmbGlja3IudXJscy5sb29rdXBHcm91cCIsIGFycmF5KCJ1cmwiPT4kdXJsKSk7CgkJCXJldHVybiAkdGhpcy0+cGFyc2VkX3Jlc3BvbnNlID8gJHRoaXMtPnBhcnNlZF9yZXNwb25zZVsnZ3JvdXAnXSA6IGZhbHNlOwoJCX0KCgkJZnVuY3Rpb24gdXJsc19sb29rdXBVc2VyICgkdXJsKSB7CgkJCS8qIGh0dHA6Ly93d3cuZmxpY2tyLmNvbS9zZXJ2aWNlcy9hcGkvZmxpY2tyLnBob3Rvcy5ub3Rlcy5lZGl0Lmh0bWwgKi8KCQkJJHRoaXMtPnJlcXVlc3QoImZsaWNrci51cmxzLmxvb2t1cFVzZXIiLCBhcnJheSgidXJsIj0+JHVybCkpOwoJCQlyZXR1cm4gJHRoaXMtPnBhcnNlZF9yZXNwb25zZSA/ICR0aGlzLT5wYXJzZWRfcmVzcG9uc2VbJ3VzZXInXSA6IGZhbHNlOwoJCX0KCX0KfQoKaWYgKCAhY2xhc3NfZXhpc3RzKCdwaHBGbGlja3JfcGFnZXInKSApIHsKCWNsYXNzIHBocEZsaWNrcl9wYWdlciB7CgkJdmFyICRwaHBGbGlja3IsICRwZXJfcGFnZSwgJG1ldGhvZCwgJGFyZ3MsICRyZXN1bHRzLCAkZ2xvYmFsX3BocEZsaWNrcjsKCQl2YXIgJHRvdGFsID0gbnVsbCwgJHBhZ2UgPSAwLCAkcGFnZXMgPSBudWxsLCAkcGhvdG9zLCAkX2V4dHJhID0gbnVsbDsKCQkKCQkKCQlmdW5jdGlvbiBwaHBGbGlja3JfcGFnZXIoJHBocEZsaWNrciwgJG1ldGhvZCA9IG51bGwsICRhcmdzID0gbnVsbCwgJHBlcl9wYWdlID0gMzApIHsKCQkJJHRoaXMtPnBlcl9wYWdlID0gJHBlcl9wYWdlOwoJCQkkdGhpcy0+bWV0aG9kID0gJG1ldGhvZDsKCQkJJHRoaXMtPmFyZ3MgPSAkYXJnczsKCQkJJHRoaXMtPnNldF9waHBGbGlja3IoJHBocEZsaWNrcik7CgkJfQoJCQoJCWZ1bmN0aW9uIHNldF9waHBGbGlja3IoJHBocEZsaWNrcikgewoJCQlpZiAoIGlzX2EoJHBocEZsaWNrciwgJ3BocEZsaWNrcicpICkgewoJCQkJJHRoaXMtPnBocEZsaWNrciA9ICRwaHBGbGlja3I7CgkJCQlpZiAoICR0aGlzLT5waHBGbGlja3ItPmNhY2hlICkgewoJCQkJCSR0aGlzLT5hcmdzWydwZXJfcGFnZSddID0gNTAwOwoJCQkJfSBlbHNlIHsKCQkJCQkkdGhpcy0+YXJnc1sncGVyX3BhZ2UnXSA9IChpbnQpICR0aGlzLT5wZXJfcGFnZTsKCQkJCX0KCQkJfQoJCX0KCQkKCQlmdW5jdGlvbiBfX3NsZWVwKCkgewoJCQlyZXR1cm4gYXJyYXkoCgkJCQknbWV0aG9kJywKCQkJCSdhcmdzJywKCQkJCSdwZXJfcGFnZScsCgkJCQkncGFnZScsCgkJCQknX2V4dHJhJywKCQkJKTsKCQl9CgkJCgkJZnVuY3Rpb24gbG9hZCgkcGFnZSkgewoJCQkkYWxsb3dlZF9tZXRob2RzID0gYXJyYXkoCgkJCQknZmxpY2tyLnBob3Rvcy5zZWFyY2gnID0+ICdwaG90b3MnLAoJCQkJJ2ZsaWNrci5waG90b3NldHMuZ2V0UGhvdG9zJyA9PiAncGhvdG9zZXQnLAoJCQkpOwoJCQlpZiAoICFpbl9hcnJheSgkdGhpcy0+bWV0aG9kLCBhcnJheV9rZXlzKCRhbGxvd2VkX21ldGhvZHMpKSApIHJldHVybiBmYWxzZTsKCQkJCgkJCWlmICggJHRoaXMtPnBocEZsaWNrci0+Y2FjaGUgKSB7CgkJCQkkbWluID0gKCRwYWdlIC0gMSkgKiAkdGhpcy0+cGVyX3BhZ2U7CgkJCQkkbWF4ID0gJHBhZ2UgKiAkdGhpcy0+cGVyX3BhZ2UgLSAxOwoJCQkJaWYgKCBmbG9vcigkbWluLzUwMCkgPT0gZmxvb3IoJG1heC81MDApICkgewoJCQkJCSR0aGlzLT5hcmdzWydwYWdlJ10gPSBmbG9vcigkbWluLzUwMCkgKyAxOwoJCQkJCSR0aGlzLT5yZXN1bHRzID0gJHRoaXMtPnBocEZsaWNrci0+Y2FsbCgkdGhpcy0+bWV0aG9kLCAkdGhpcy0+YXJncyk7CgkJCQkJaWYgKCAkdGhpcy0+cmVzdWx0cyApIHsKCQkJCQkJJHRoaXMtPnJlc3VsdHMgPSAkdGhpcy0+cmVzdWx0c1skYWxsb3dlZF9tZXRob2RzWyR0aGlzLT5tZXRob2RdXTsKCQkJCQkJJHRoaXMtPnBob3RvcyA9IGFycmF5X3NsaWNlKCR0aGlzLT5yZXN1bHRzWydwaG90byddLCAkbWluICUgNTAwLCAkdGhpcy0+cGVyX3BhZ2UpOwoJCQkJCQkkdGhpcy0+dG90YWwgPSAkdGhpcy0+cmVzdWx0c1sndG90YWwnXTsKCQkJCQkJJHRoaXMtPnBhZ2VzID0gY2VpbCgkdGhpcy0+cmVzdWx0c1sndG90YWwnXSAvICR0aGlzLT5wZXJfcGFnZSk7CgkJCQkJCXJldHVybiB0cnVlOwoJCQkJCX0gZWxzZSB7CgkJCQkJCXJldHVybiBmYWxzZTsKCQkJCQl9CgkJCQl9IGVsc2UgewoJCQkJCSR0aGlzLT5hcmdzWydwYWdlJ10gPSBmbG9vcigkbWluLzUwMCkgKyAxOwoJCQkJCSR0aGlzLT5yZXN1bHRzID0gJHRoaXMtPnBocEZsaWNrci0+Y2FsbCgkdGhpcy0+bWV0aG9kLCAkdGhpcy0+YXJncyk7CgkJCQkJaWYgKCAkdGhpcy0+cmVzdWx0cyApIHsKCQkJCQkJJHRoaXMtPnJlc3VsdHMgPSAkdGhpcy0+cmVzdWx0c1skYWxsb3dlZF9tZXRob2RzWyR0aGlzLT5tZXRob2RdXTsKCgkJCQkJCSR0aGlzLT5waG90b3MgPSBhcnJheV9zbGljZSgkdGhpcy0+cmVzdWx0c1sncGhvdG8nXSwgJG1pbiAlIDUwMCk7CgkJCQkJCSR0aGlzLT50b3RhbCA9ICR0aGlzLT5yZXN1bHRzWyd0b3RhbCddOwoJCQkJCQkkdGhpcy0+cGFnZXMgPSBjZWlsKCR0aGlzLT5yZXN1bHRzWyd0b3RhbCddIC8gJHRoaXMtPnBlcl9wYWdlKTsKCQkJCQkJCgkJCQkJCSR0aGlzLT5hcmdzWydwYWdlJ10gPSBmbG9vcigkbWluLzUwMCkgKyAyOwoJCQkJCQkkdGhpcy0+cmVzdWx0cyA9ICR0aGlzLT5waHBGbGlja3ItPmNhbGwoJHRoaXMtPm1ldGhvZCwgJHRoaXMtPmFyZ3MpOwoJCQkJCQlpZiAoICR0aGlzLT5yZXN1bHRzICkgewoJCQkJCQkJJHRoaXMtPnJlc3VsdHMgPSAkdGhpcy0+cmVzdWx0c1skYWxsb3dlZF9tZXRob2RzWyR0aGlzLT5tZXRob2RdXTsKCQkJCQkJCSR0aGlzLT5waG90b3MgPSBhcnJheV9tZXJnZSgkdGhpcy0+cGhvdG9zLCBhcnJheV9zbGljZSgkdGhpcy0+cmVzdWx0c1sncGhvdG8nXSwgMCwgJG1heCAlIDUwMCArIDEpKTsKCQkJCQkJfQoJCQkJCQlyZXR1cm4gdHJ1ZTsKCQkJCQl9IGVsc2UgewoJCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQkJfQoKCQkJCX0KCQkJfSBlbHNlIHsKCQkJCSR0aGlzLT5hcmdzWydwYWdlJ10gPSAkcGFnZTsKCQkJCSR0aGlzLT5yZXN1bHRzID0gJHRoaXMtPnBocEZsaWNrci0+Y2FsbCgkdGhpcy0+bWV0aG9kLCAkdGhpcy0+YXJncyk7CgkJCQlpZiAoICR0aGlzLT5yZXN1bHRzICkgewoJCQkJCSR0aGlzLT5yZXN1bHRzID0gJHRoaXMtPnJlc3VsdHNbJGFsbG93ZWRfbWV0aG9kc1skdGhpcy0+bWV0aG9kXV07CgkJCQkJCgkJCQkJJHRoaXMtPnBob3RvcyA9ICR0aGlzLT5yZXN1bHRzWydwaG90byddOwoJCQkJCSR0aGlzLT50b3RhbCA9ICR0aGlzLT5yZXN1bHRzWyd0b3RhbCddOwoJCQkJCSR0aGlzLT5wYWdlcyA9ICR0aGlzLT5yZXN1bHRzWydwYWdlcyddOwoJCQkJCXJldHVybiB0cnVlOwoJCQkJfSBlbHNlIHsKCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQl9CgkJCX0KCQl9CgkJCgkJZnVuY3Rpb24gZ2V0KCRwYWdlID0gbnVsbCkgewoJCQlpZiAoIGlzX251bGwoJHBhZ2UpICkgewoJCQkJJHBhZ2UgPSAkdGhpcy0+cGFnZTsKCQkJfSBlbHNlIHsKCQkJCSR0aGlzLT5wYWdlID0gJHBhZ2U7CgkJCX0KCQkJaWYgKCAkdGhpcy0+bG9hZCgkcGFnZSkgKSB7CgkJCQlyZXR1cm4gJHRoaXMtPnBob3RvczsKCQkJfQoJCQkkdGhpcy0+dG90YWwgPSAwOwoJCQkkdGhpcy0+cGFnZXMgPSAwOwoJCQlyZXR1cm4gYXJyYXkoKTsKCQl9CgkJCgkJZnVuY3Rpb24gbmV4dCgpIHsKCQkJJHRoaXMtPnBhZ2UrKzsKCQkJaWYgKCAkdGhpcy0+bG9hZCgkdGhpcy0+cGFnZSkgKSB7CgkJCQlyZXR1cm4gJHRoaXMtPnBob3RvczsKCQkJfQoJCQkkdGhpcy0+dG90YWwgPSAwOwoJCQkkdGhpcy0+cGFnZXMgPSAwOwoJCQlyZXR1cm4gYXJyYXkoKTsKCQl9CgkJCgl9Cn0KCj8+Cg==]]></data>
	</file>
	<file>
	  <filename>/phpFlickr/README.txt</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[cGhwRmxpY2tyIENsYXNzIDMuMApXcml0dGVuIGJ5IERhbiBDb3VsdGVyIChkYW5jb3VsdGVyQHVzZXJzLnNvdXJjZWZvcmdlLm5ldCkKUHJvamVjdCBIb21lcGFnZTogaHR0cDovL3d3dy5waHBmbGlja3IuY29tLwpHb29nbGUgQ29kZSBQcm9qZWN0IFBhZ2U6IGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9waHBmbGlja3IvClJlbGVhc2VkIHVuZGVyIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoaHR0cDovL3d3dy5nbnUub3JnL2NvcHlsZWZ0L2xncGwuaHRtbCkKRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNsYXNzIGFuZCB1cGNvbWluZyB0b29scyBhbmQgYXBwbGljYXRpb25zIHVzaW5nIGl0LAp2aXNpdCBodHRwOi8vd3d3LnBocGZsaWNrci5jb20vIG9yIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9waHBmbGlja3IvCgpJZiB5b3UgYXJlIGludGVyZXN0ZWQgaW4gaGlyaW5nIG1lIGZvciBhIHByb2plY3QgKGludm9sdmluZyBwaHBGbGlja3IKb3Igbm90KSwgZmVlbCBmcmVlIHRvIGVtYWlsIG1lLgoKSW5zdGFsbGF0aW9uIGluc3RydWN0aW9uczoKMS4gIENvcHkgdGhlIGZpbGVzIGZyb20gdGhlIGluc3RhbGxhdGlvbiBwYWNrYWdlIGludG8gYSBmb2xkZXIgb24geW91cgogICAgc2VydmVyLiAgVGhleSBuZWVkIHRvIGJlIHJlYWRpYmxlIGJ5IHlvdXIgd2ViIHNlcnZlci4gIFlvdSBjYW4gcHV0IAogICAgdGhlbSBpbnRvIGFuIGluY2x1ZGUgZm9sZGVyIGRlZmluZWQgaW4geW91ciBwaHAuaW5pIGZpbGUsIGlmIHlvdSAKICAgIGxpa2UsIHRob3VnaCBpdCdzIG5vdCByZXF1aXJlZC4gCiAgICAKMi4gIEFsbCB5b3UgaGF2ZSB0byBkbyBub3cgaXMgaW5jbHVkZSB0aGUgZmlsZSBpbiB5b3VyIFBIUCBzY3JpcHRzIGFuZCAKICAgIGNyZWF0ZSBhbiBpbnN0YW5jZS4gIEZvciBleGFtcGxlOgogICAgJGYgPSBuZXcgcGhwRmxpY2tyKCk7CgogICAgVGhlIGNvbnN0cnVjdG9yIGhhcyB0aHJlZSBhcmd1bWVudHM6CiAgICBBLiAgJGFwaV9rZXkgLSBUaGlzIGlzIHRoZSBBUEkga2V5IGdpdmVuIHRvIHlvdSBieSBmbGlja3IuY29tLiBUaGlzIAogICAgICAgIGFyZ3VtZW50IGlzIHJlcXVpcmVkIGFuZCB5b3UgY2FuIGdldCBhbiBBUEkgS2V5IGF0OgogICAgICAgIGh0dHA6Ly93d3cuZmxpY2tyLmNvbS9zZXJ2aWNlcy9hcGkva2V5LmduZQogICAgICAgIAogICAgQi4gICRzZWNyZXQgLSBUaGUgInNlY3JldCIgaXMgb3B0aW9uYWwgYmVjYXVzZSBpcyBub3QgcmVxdWlyZWQgdG8gCiAgICAgICAgbWFrZSB1bmF1dGhlbnRpY2F0ZWQgY2FsbHMsIGJ1dCBpcyBhYnNvbHV0ZWx5IHJlcXVpcmVkIGZvciB0aGUgCiAgICAgICAgbmV3IGF1dGhlbnRpY2F0aW9uIEFQSSAoc2VlIEF1dGhlbnRpY2F0aW9uIHNlY3Rpb24gYmVsb3cpLiAgWW91IAogICAgICAgIHdpbGwgZ2V0IG9uZSBhc3NpZ25lZCBhbG9uZ3NpZGUgeW91ciBhcGkga2V5LgogICAgCiAgICBDLiAgJGRpZV9vbl9lcnJvciAtIFRoaXMgdGFrZXMgYSBib29sZWFuIHZhbHVlIGFuZCBkZXRlcm1pbmVzIAogICAgICAgIHdoZXRoZXIgdGhlIGNsYXNzIHdpbGwgZGllIChha2EgY2Vhc2Ugb3BlcmF0aW9uKSBpZiB0aGUgQVBJIAogICAgICAgIHJldHVybnMgYW4gZXJyb3Igc3RhdGVtZW50LiAgSXQgZGVmYXVsdHMgdG8gZmFsc2UuICBFdmVyeSBtZXRob2QgCiAgICAgICAgd2lsbCByZXR1cm4gZmFsc2UgaWYgdGhlIEFQSSByZXR1cm5zIGFuIGVycm9yLiAgWW91IGNhbiBhY2Nlc3MgCiAgICAgICAgZXJyb3IgbWVzc2FnZXMgdXNpbmcgdGhlIGdldEVycm9yQ29kZSgpIGFuZCBnZXRFcnJvck1zZygpIAogICAgICAgIG1ldGhvZHMuCiAgICAgICAgCjMuICBBbGwgb2YgdGhlIEFQSSBtZXRob2RzIGhhdmUgYmVlbiBpbXBsZW1lbnRlZCBpbiBteSBjbGFzcy4gIFlvdSBjYW4gCiAgICBzZWUgYSBmdWxsIGxpc3QgYW5kIGRvY3VtZW50YXRpb24gaGVyZTogCiAgICAgICAgaHR0cDovL3d3dy5mbGlja3IuY29tL3NlcnZpY2VzL2FwaS8KICAgIFRvIGNhbGwgYSBtZXRob2QsIHJlbW92ZSB0aGUgImZsaWNrci4iIHBhcnQgb2YgdGhlIG5hbWUgYW5kIHJlcGxhY2UgCiAgICBhbnkgcGVyaW9kcyB3aXRoIHVuZGVyc2NvcmVzLiBGb3IgZXhhbXBsZSwgaW5zdGVhZCBvZiAKICAgIGZsaWNrci5waG90b3Muc2VhcmNoLCB5b3Ugd291bGQgY2FsbCAkZi0+cGhvdG9zX3NlYXJjaCgpIG9yIGluc3RlYWQgCiAgICBvZiBmbGlja3IucGhvdG9zLmxpY2Vuc2VzLmdldEluZm8sIHlvdSB3b3VsZCBjYWxsIAogICAgJGYtPnBob3Rvc19saWNlbnNlc19nZXRJbmZvKCkgKHllcywgaXQgaXMgY2FzZSBzZW5zaXRpdmUpLgogICAgCiAgICBBbGwgZnVuY3Rpb25zIGhhdmUgdGhlaXIgYXJndW1lbnRzIGltcGxlbWVudGVkIGluIHRoZSBsaXN0IG9yZGVyIG9uIAogICAgdGhlaXIgZG9jdW1lbnRhdGlvbiBwYWdlIChhIGxpbmsgdG8gd2hpY2ggaXMgaW5jbHVkZWQgd2l0aCBlYWNoIAogICAgbWV0aG9kIGluIHRoZSBwaHBGbGlja3IgY2xhc1MpLiBUaGUgb25seSBleGNlcHRpb25zIHRvIHRoaXMgYXJlIAogICAgcGhvdG9zX3NlYXJjaCgpLCBwaG90b3NfZ2V0V2l0aG91dEdlb2RhdGEoKSBhbmQgCiAgICBwaG90b3NfZ2V0V2l0aG91dEdlb2RhdGEoKSB3aGljaCBoYXZlIHNvIG1hbnkgb3B0aW9uYWwgYXJndW1lbnRzCiAgICB0aGF0IGl0J3MgZWFzaWVyIGZvciBldmVyeW9uZSBpZiB5b3UganVzdCBoYXZlIHRvIHBhc3MgYW4gCiAgICBhc3NvY2lhdGl2ZSBhcnJheSBvZiBhcmd1bWVudHMuICBTZWUgdGhlIGNvbW1lbnQgaW4gdGhlIAogICAgcGhvdG9zX3NlYXJjaCgpIGRlZmluaXRpb24gaW4gcGhwRmxpY2tyLnBocCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KICAgIAoKICAgIApBdXRoZW50aWNhdGlvbjoKICAgIEFzIG9mIHRoaXMgcmVsZWFzZSBvZiB0aGUgcGhwRmxpY2tyIGNsYXNzIHRoZXJlIGlzIG9ubHkgb25lIGF1dGhlbnRpY2F0aW9uIG1ldGhvZAogICAgYXZhaWxhYmxlIHRvIHRoZSBBUEkuICBUaGlzIG1ldGhvZCBpcyBzb21ld2hhdCBjb21wbGV4LCBidXQgaXMgZmFyIG1vcmUgc2VjdXJlIGFuZAogICAgYWxsb3dzIHlvdXIgdXNlcnMgdG8gZmVlbCBhIGxpdHRsZSBzYWZlciBhdXRoZW50aWNhdGluZyB0byB5b3VyIGFwcGxpY2F0aW9uLiAgWW91J2xsCiAgICBubyBsb25nZXIgaGF2ZSB0byBhc2sgZm9yIHRoZWlyIHVzZXJuYW1lIGFuZCBwYXNzd29yZC4KICAgIAogICAgQXV0aGVudGljYXRpb24gQVBJIC0gaHR0cDovL3d3dy5mbGlja3IuY29tL3NlcnZpY2VzL2FwaS9hdXRoLnNwZWMuaHRtbAogICAgICAgIAogICAgICAgIEkga25vdyBob3cgY29tcGxpY2F0ZWQgdGhpcyBBUEkgbG9va3MgYXQgZmlyc3QgZ2xhbmNlLCBzbyBJJ3ZlIHRyaWVkIHRvCiAgICAgICAgbWFrZSB0aGlzIGFzIHRyYW5zcGFyZW50IHRvIHRoZSBjb2RpbmcgcHJvY2Vzcy4gIEknbGwgZ28gdGhyb3VnaCB0aGUgc3RlcHMKICAgICAgICB5b3UnbGwgbmVlZCB0byB1c2UgdGhpcy4gIEJvdGggdGhlIGF1dGgucGhwIGFuZCBnZXRUb2tlbi5waHAgZmlsZSB3aWxsCiAgICAgICAgbmVlZCB5b3VyIEFQSSBLZXkgYW5kIFNlY3JldCBlbnRlcmVkIGJlZm9yZSB5b3UgY2FuIHVzZSB0aGVtLgogICAgICAgIAogICAgICAgIFRvIGhhdmUgZW5kIHVzZXJzIGF1dGhlbnRpY2F0ZSB0aGVpciBhY2NvdW50czoKICAgICAgICAgICAgRmlyc3QsIHNldHVwIGEgY2FsbGJhY2sgc2NyaXB0LiAgSSd2ZSBpbmNsdWRlZCBhIGNhbGxiYWNrIHNjcmlwdCB0aGF0IAogICAgICAgICAgICBpcyBwcmV0dHkgZmxleGlibGUuICBZb3UnbGwgZmluZCBpdCBpbiB0aGUgcGFja2FnZSBlbnRpdGxlZCAiYXV0aC5waHAiLiAgCiAgICAgICAgICAgIFlvdSdsbCBuZWVkIHRvIGdvIHRvIGZsaWNrciBhbmQgcG9pbnQgeW91ciBhcGkga2V5IHRvIHRoaXMgZmlsZSBhcyB0aGUgCiAgICAgICAgICAgIGNhbGxiYWNrIHNjcmlwdC4gIE9uY2UgeW91J3ZlIGRvbmUgdGhpcywgb24gYW55IHBhZ2UgdGhhdCB5b3Ugd2FudCB0byAKICAgICAgICAgICAgcmVxdWlyZSB0aGUgZW5kIHVzZXIgZW5kIHVzZXIgdG8gYXV0aGVudGljYXRlIHRoZWlyIGZsaWNrciBhY2NvdW50IHRvIAogICAgICAgICAgICB5b3VyIGFwcCwganVzdCBjYWxsIHRoZSBwaHBGbGlja3I6OmF1dGgoKSBmdW5jdGlvbiB3aXRoIHdoYXRldmVyIAogICAgICAgICAgICBwZXJtaXNzaW9uIHlvdSBuZWVkIHRvIHVzZS4KICAgICAgICAgICAgRm9yIGV4YW1wbGU6CiAgICAgICAgICAgICAgICAkZi0+YXV0aCgid3JpdGUiKTsKICAgICAgICAgICAgVGhlIHRocmVlIHBlcm1pc3Npb25zIGFyZSAicmVhZCIsICJ3cml0ZSIgYW5kICJkZWxldGUiLiAgVGhlIGZ1bmN0aW9uCiAgICAgICAgICAgIGRlZmF1bHRzIHRvICJyZWFkIiwgaWYgeW91IGxlYXZlIGl0IGJsYW5rLiAgCiAgICAgICAgICAgIAogICAgICAgICAgICBDYWxsaW5nIHRoaXMgZnVuY3Rpb24gd2lsbCBzZW5kIHRoZSB1c2VyJ3MgYnJvd3NlciB0byBGbGlja3IncyBwYWdlIHRvIAogICAgICAgICAgICBhdXRoZW50aWNhdGUgdG8geW91ciBhcHAuICBPbmNlIHRoZXkgaGF2ZSBsb2dnZWQgaW4sIGl0IHdpbGwgYm91bmNlCiAgICAgICAgICAgIHRoZW0gYmFjayB0byB5b3VyIGNhbGxiYWNrIHNjcmlwdCB3aGljaCB3aWxsIHJlZGlyZWN0IGJhY2sgdG8gdGhlCiAgICAgICAgICAgIG9yaWdpbmFsIHBhZ2UgdGhhdCB5b3UgY2FsbGVkIHRoZSBhdXRoKCkgZnVuY3Rpb24gZnJvbSBhZnRlciBzZXR0aW5nCiAgICAgICAgICAgIGEgc2Vzc2lvbiB2YXJpYWJsZSB0byBzYXZlIHRoZWlyIGF1dGhlbnRpY2F0aW9uIHRva2VuLiAgSWYgdGhhdCBzZXNzaW9uCiAgICAgICAgICAgIHZhcmlhYmxlIGV4aXN0cywgY2FsbGluZyB0aGUgYXV0aCgpIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIHRoZSBwZXJtaXNzaW9ucwogICAgICAgICAgICB0aGF0IHRoZSB1c2VyIGdyYW50ZWQgeW91ciBhcHAgb24gdGhlIEZsaWNrciBwYWdlIGluc3RlYWQgb2YgcmVkaXJlY3RpbmcKICAgICAgICAgICAgdG8gYW4gZXh0ZXJuYWwgcGFnZS4KICAgICAgICAKICAgICAgICBUbyBhdXRoZW50aWNhdGUgdGhlIGFwcCB0byB5b3VyIGFjY291bnQgdG8gc2hvdyB5b3VyIHByaXZhdGUgcGljdHVyZXMgKGZvciBleGFtcGxlKQogICAgICAgICAgICBUaGlzIG1ldGhvZCB3aWxsIGFsbG93IHlvdSB0byBoYXZlIHRoZSBhcHAgYXV0aGVudGljYXRlIHRvIG9uZSBzcGVjaWZpYwogICAgICAgICAgICBhY2NvdW50LCBubyBtYXR0ZXIgd2hvIHZpZXdzIHlvdXIgd2Vic2l0ZS4gIFRoaXMgaXMgdXNlZnVsIHRvIGRpc3BsYXkKICAgICAgICAgICAgcHJpdmF0ZSBwaG90b3Mgb3IgcGhvdG9zZXRzIChhbW9uZyBvdGhlciB0aGluZ3MpLgogICAgICAgICAgICAKICAgICAgICAgICAgKk5vdGUqOiBUaGUgbWV0aG9kIGJlbG93IGlzIGEgbGl0dGxlIGhhcmQgdG8gdW5kZXJzdGFuZCwgc28gSSd2ZSBzZXR1cCBhIHRvb2wKICAgICAgICAgICAgdG8gaGVscCB5b3UgdGhyb3VnaCB0aGlzOiBodHRwOi8vd3d3LnBocGZsaWNrci5jb20vdG9vbHMvYXV0aC8uCiAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICBGaXJzdCwgeW91J2xsIGhhdmUgdG8gc2V0dXAgYSBjYWxsYmFjayBzY3JpcHQgd2l0aCBGbGlja3IuICBPbmNlIHlvdSd2ZQogICAgICAgICAgICBkb25lIHRoYXQsIGVkaXQgbGluZSAxMiBvZiB0aGUgaW5jbHVkZWQgZ2V0VG9rZW4ucGhwIGZpbGUgdG8gcmVmbGVjdCAKICAgICAgICAgICAgd2hpY2ggcGVybWlzc2lvbnMgeW91J2xsIG5lZWQgZm9yIHRoZSBhcHAuICBUaGVuIGJyb3dzZSB0byB0aGUgcGFnZS4KICAgICAgICAgICAgT25jZSB5b3UndmUgYXV0aG9yaXplZCB0aGUgYXBwIHdpdGggRmxpY2tyLCBpdCdsbCBzZW5kIHlvdSBiYWNrIHRvIHRoYXQKICAgICAgICAgICAgcGFnZSB3aGljaCB3aWxsIGdpdmUgeW91IGEgdG9rZW4gd2hpY2ggd2lsbCBsb29rIHNvbWV0aGluZyBsaWtlIHRoaXM6CiAgICAgICAgICAgICAgICAxMjM0LTU2Nzg5MGFiY2RlZjEyMzQKICAgICAgICAgICAgR28gdG8gdGhlIGZpbGUgd2hlcmUgeW91IGFyZSBjcmVhdGluZyBhbiBpbnN0YW5jZSBvZiBwaHBGbGlja3IgKEkgc3VnZ2VzdAogICAgICAgICAgICBhbiBpbmNsdWRlIGZpbGUpIGFuZCBhZnRlciB5b3UndmUgY3JlYXRlZCBpdCBzZXQgdGhlIHRva2VuIHRvIHVzZToKICAgICAgICAgICAgICAgICRmLT5zZXRUb2tlbigiPHRva2VuIHN0cmluZz4iKTsKICAgICAgICAgICAgVGhpcyB0b2tlbiBuZXZlciBleHBpcmVzLCBzbyB5b3UgZG9uJ3QgaGF2ZSB0byB3b3JyeSBhYm91dCBoYXZpbmcgdG8KICAgICAgICAgICAgbG9naW4gcGVyaW9kaWNhbGx5LgogICAgICAgICAgICAKClVzaW5nIENhY2hpbmc6CiAgICBDYWNoaW5nIGNhbiBiZSB2ZXJ5IGltcG9ydGFudCB0byBhIHByb2plY3QuICBKdXN0IGEgZmV3IGNhbGxzIHRvIHRoZSBGbGlja3IgQVBJCiAgICBjYW4gdGFrZSBsb25nIGVub3VnaCB0byBib3JlIHlvdXIgYXZlcmFnZSB3ZWIgdXNlciAoZGVwZW5kaW5nIG9uIHRoZSBjYWxscyB5b3UKICAgIGFyZSBtYWtpbmcpLiAgSSd2ZSBidWlsdCBpbiBjYWNoaW5nIHRoYXQgd2lsbCBhY2Nlc3MgZWl0aGVyIGEgZGF0YWJhc2Ugb3IgZmlsZXMKICAgIGluIHlvdXIgZmlsZXN5c3RlbS4gIFRvIGVuYWJsZSBjYWNoaW5nLCB1c2UgdGhlIHBocEZsaWNrcjo6ZW5hYmxlQ2FjaGUoKSBmdW5jdGlvbi4KICAgIFRoaXMgZnVuY3Rpb24gcmVxdWlyZXMgYXQgbGVhc3QgdHdvIGFyZ3VtZW50cy4gVGhlIGZpcnN0IHdpbGwgYmUgdGhlIHR5cGUgb2YKICAgIGNhY2hlIHlvdSdyZSB1c2luZyAoZWl0aGVyICJkYiIgb3IgImZzIikKICAgIAogICAgMS4gIElmIHlvdSdyZSB1c2luZyBkYXRhYmFzZSBjYWNoaW5nLCB5b3UnbGwgbmVlZCB0byBzdXBwbHkgYSBQRUFSOjpEQiBjb25uZWN0aW9uCiAgICAgICAgc3RyaW5nLiBGb3IgZXhhbXBsZTogCiAgICAgICAgJGZsaWNrci0+ZW5hYmxlQ2FjaGUoImRiIiwgIm15c3FsOi8vdXNlcjpwYXNzd29yZEBzZXJ2ZXIvZGF0YWJhc2UiKTsKICAgICAgICBUaGUgdGhpcmQgKG9wdGlvbmFsKSBhcmd1bWVudCBpcyBleHBpcmF0aW9uIG9mIHRoZSBjYWNoZSBpbiBzZWNvbmRzIChkZWZhdWx0cyAKICAgICAgICB0byA2MDApLiAgVGhlIGZvdXJ0aCAob3B0aW9uYWwpIGFyZ3VtZW50IGlzIHRoZSB0YWJsZSB3aGVyZSB5b3Ugd2FudCB0byBzdG9yZQogICAgICAgIHRoZSBjYWNoZS4gIFRoaXMgZGVmYXVsdHMgdG8gZmxpY2tyX2NhY2hlIGFuZCB3aWxsIGF0dGVtcHQgdG8gY3JlYXRlIHRoZSB0YWJsZQogICAgICAgIGlmIGl0IGRvZXMgbm90IGFscmVhZHkgZXhpc3QuCiAgICAKICAgIDIuICBJZiB5b3UncmUgdXNpbmcgZmlsZXN5c3RlbSBjYWNoaW5nLCB5b3UnbGwgbmVlZCB0byBzdXBwbHkgYSBmb2xkZXIgd2hlcmUgdGhlCiAgICAgICAgd2ViIHNlcnZlciBoYXMgd3JpdGUgYWNjZXNzLiBGb3IgZXhhbXBsZTogCiAgICAgICAgJGZsaWNrci0+ZW5hYmxlQ2FjaGUoImZzIiwgIi92YXIvd3d3L3BocEZsaWNrckNhY2hlIik7CiAgICAgICAgVGhlIHRoaXJkIChvcHRpb25hbCkgYXJndW1lbnQgaXMsIHRoZSBzYW1lIGFzIGluIHRoZSBEYXRhYmFzZSBjYWNoaW5nLCBhbgogICAgICAgIGV4cGlyYXRpb24gaW4gc2Vjb25kcyBmb3IgdGhlIGNhY2hlLgogICAgICAgIE5vdGU6IGZpbGVzeXN0ZW0gY2FjaGluZyB3aWxsIHByb2JhYmx5IGJlIHNsb3dlciB0aGFuIGRhdGFiYXNlIGNhY2hpbmcuIEkKICAgICAgICBoYXZlbid0IGRvbmUgYW55IHRlc3RzIG9mIHRoaXMsIGJ1dCBpZiB5b3UgZ2V0IGxhcmdlIGFtb3VudHMgb2YgY2FsbHMsIHRoZQogICAgICAgIHByb2Nlc3Mgb2YgY2xlYW5pbmcgb3V0IG9sZCBjYWxscyBtYXkgZ2V0IGhhcmQgb24geW91ciBzZXJ2ZXIuCiAgICAgICAgCiAgICAgICAgWW91IG1heSBub3Qgd2FudCB0byBhbGxvdyB0aGUgd29ybGQgdG8gdmlldyB0aGUgZmlsZXMgdGhhdCBhcmUgY3JlYXRlZCBkdXJpbmcKICAgICAgICBjYWNoaW5nLiAgSWYgeW91IHdhbnQgdG8gaGlkZSB0aGlzIGluZm9ybWF0aW9uLCBlaXRoZXIgbWFrZSBzdXJlIHRoYXQgeW91cgogICAgICAgIHBlcm1pc3Npb25zIGFyZSBzZXQgY29ycmVjdGx5LCBvciBkaXNhYmxlIHRoZSB3ZWJzZXJ2ZXIgZnJvbSBkaXNwbGF5aW5nIAogICAgICAgICouY2FjaGUgZmlsZXMuICBJbiBBcGFjaGUsIHlvdSBjYW4gc3BlY2lmeSB0aGlzIGluIHRoZSBjb25maWd1cmF0aW9uIGZpbGVzCiAgICAgICAgb3IgaW4gYSAuaHRhY2Nlc3MgZmlsZSB3aXRoIHRoZSBmb2xsb3dpbmcgZGlyZWN0aXZlczoKICAgICAgICAKICAgICAgICA8RmlsZXNNYXRjaCAiXC5jYWNoZSQiPgogICAgICAgICAgICBEZW55IGZyb20gYWxsCiAgICAgICAgPC9GaWxlc01hdGNoPgogICAgICAgIAogICAgICAgIEFsdGVybmF0aXZlbHksIHlvdSBjYW4gc3BlY2lmeSBhIGRpcmVjdG9yeSB0aGF0IGlzIG91dHNpZGUgb2YgdGhlIHdlYiBzZXJ2ZXIncwogICAgICAgIGRvY3VtZW50IHJvb3QuCiAgICAgICAgClVwbG9hZGluZwogICAgVXBsb2FkaW5nIGlzIHByZXR0eSBzaW1wbGUuIEFzaWRlIGZyb20gYmVpbmcgYXV0aGVudGljYXRlZCAoc2VlIEF1dGhlbnRpY2F0aW9uIAogICAgc2VjdGlvbikgdGhlIHZlcnkgbWluaW11bSB0aGF0IHlvdSdsbCBoYXZlIHRvIHBhc3MgaXMgYSBwYXRoIHRvIGFuIGltYWdlIGZpbGUgb24gCiAgICB5b3VyIHBocCBzZXJ2ZXIuIFlvdSBjYW4gZG8gZWl0aGVyIHN5bmNocm9ub3VzIG9yIGFzeW5jaHJvbm91cyB1cGxvYWRpbmcgYXMgZm9sbG93czoKICAgICAgICBzeW5jaHJvbm91czogICAgc3luY191cGxvYWQoInBob3RvLmpwZyIpOwogICAgICAgIGFzeW5jaHJvbm91czogICBhc3luY191cGxvYWQoInBob3RvLmpwZyIpOwogICAgCiAgICBUaGUgYmFzaWMgZGlmZmVyZW5jZSBpcyB0aGF0IHN5bmNocm9ub3VzIHVwbG9hZGluZyB3YWl0cyBhcm91bmQgdW50aWwgRmxpY2tyCiAgICBwcm9jZXNzZXMgdGhlIHBob3RvIGFuZCByZXR1cm5zIGEgUGhvdG9JRC4gIEFzeW5jaHJvbm91cyBqdXN0IHVwbG9hZHMgdGhlCiAgICBwaWN0dXJlIGFuZCBnZXRzIGEgInRpY2tldGlkIiB0aGF0IHlvdSBjYW4gdXNlIHRvIGNoZWNrIG9uIHRoZSBzdGF0dXMgb2YgeW91ciAKICAgIHVwbG9hZC4gQXN5bmNocm9ub3VzIGlzIG11Y2ggZmFzdGVyLCB0aG91Z2ggdGhlIHBob3RvaWQgd29uJ3QgYmUgaW5zdGFudGx5CiAgICBhdmFpbGFibGUgZm9yIHlvdS4gWW91IGNhbiByZWFkIG1vcmUgYWJvdXQgYXN5bmNocm9ub3VzIHVwbG9hZGluZyBoZXJlOgogICAgICAgIGh0dHA6Ly93d3cuZmxpY2tyLmNvbS9zZXJ2aWNlcy9hcGkvdXBsb2FkLmFzeW5jLmh0bWwKICAgICAgICAKICAgIEJvdGggb2YgdGhlIGZ1bmN0aW9ucyB0YWtlIHRoZSBzYW1lIGFyZ3VtZW50cyB3aGljaCBhcmU6CiAgICAgICAgUGhvdG86IFRoZSBwYXRoIG9mIHRoZSBmaWxlIHRvIHVwbG9hZC4KICAgICAgICBUaXRsZTogVGhlIHRpdGxlIG9mIHRoZSBwaG90by4KICAgICAgICBEZXNjcmlwdGlvbjogQSBkZXNjcmlwdGlvbiBvZiB0aGUgcGhvdG8uIE1heSBjb250YWluIHNvbWUgbGltaXRlZCBIVE1MLgogICAgICAgIFRhZ3M6IEEgc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgdGFncyB0byBhcHBseSB0byB0aGUgcGhvdG8uCiAgICAgICAgaXNfcHVibGljOiBTZXQgdG8gMCBmb3Igbm8sIDEgZm9yIHllcy4KICAgICAgICBpc19mcmllbmQ6IFNldCB0byAwIGZvciBubywgMSBmb3IgeWVzLgogICAgICAgIGlzX2ZhbWlseTogU2V0IHRvIDAgZm9yIG5vLCAxIGZvciB5ZXMuCiAgICAgICAgClJlcGxhY2luZyBQaG90b3MKICAgIEZsaWNrciBoYXMgcmVsZWFzZWQgQVBJIHN1cHBvcnQgZm9yIHVwbG9hZGluZyBhIHJlcGxhY2VtZW50IHBob3RvLiAgVG8gdXNlIHRoaXMKICAgIG5ldyBtZXRob2QsIGp1c3QgdXNlIHRoZSAicmVwbGFjZSIgZnVuY3Rpb24gaW4gcGhwRmxpY2tyLiAgWW91J2xsIGJlIHJlcXVpcmVkCiAgICB0byBwYXNzIHRoZSBmaWxlIG5hbWUgYW5kIEZsaWNrcidzIHBob3RvIElELiAgWW91IG5lZWQgdG8gYXV0aGVudGljYXRlIHlvdXIgc2NyaXB0CiAgICB3aXRoICJ3cml0ZSIgcGVybWlzc2lvbnMgYmVmb3JlIHlvdSBjYW4gcmVwbGFjZSBhIHBob3RvLiAgVGhlIGFyZ3VtZW50cyBhcmU6CiAgICAgICAgUGhvdG86IFRoZSBwYXRoIG9mIHRoZSBmaWxlIHRvIHVwbG9hZC4KICAgICAgICBQaG90byBJRDogVGhlIG51bWVyaWMgRmxpY2tyIElEIG9mIHRoZSBwaG90byB5b3Ugd2FudCB0byByZXBsYWNlLgogICAgICAgIEFzeW5jIChvcHRpb25hbCk6IFNldCB0byAwIGZvciBhIHN5bmNocm9ub3VzIGNhbGwsIDEgZm9yIGFzeW5jaHJvbm91cy4KICAgIElmIHlvdSB1c2UgdGhlIGFzeW5jaHJvbm91cyBjYWxsLCBpdCB3aWxsIHJldHVybiBhIHRpY2tldGlkIGluc3RlYWQKICAgIG9mIHBob3RvaWQuCgpPdGhlciBOb3RlczoKICAgIDEuICBNYW55IG9mIHRoZSBtZXRob2RzIGhhdmUgb3B0aW9uYWwgYXJndW1lbnRzLiAgRm9yIHRoZXNlLCBJIGhhdmUgaW1wbGVtZW50ZWQgCiAgICAgICAgdGhlbSBpbiB0aGUgc2FtZSBvcmRlciB0aGF0IHRoZSBGbGlja3IgQVBJIGRvY3VtZW50YXRpb24gbGlzdHMgdGhlbS4gUEhQCiAgICAgICAgYWxsb3dzIGZvciBvcHRpb25hbCBhcmd1bWVudHMgaW4gZnVuY3Rpb24gY2FsbHMsIGJ1dCBpZiB5b3Ugd2FudCB0byB1c2UgdGhlCiAgICAgICAgdGhpcmQgb3B0aW9uYWwgYXJndW1lbnQsIHlvdSBoYXZlIHRvIGZpbGwgaW4gdGhlIG90aGVycyB0byB0aGUgbGVmdCBmaXJzdC4KICAgICAgICBZb3UgY2FuIHVzZSB0aGUgIk5VTEwiIHZhbHVlICh3aXRob3V0IHF1b3RlcykgaW4gdGhlIHBsYWNlIG9mIGFuIGFjdHVhbAogICAgICAgIGFyZ3VtZW50LiAgRm9yIGV4YW1wbGU6CiAgICAgICAgJGYtPmdyb3Vwc19wb29sc19nZXRQaG90b3MoJGdyb3VwX2lkLCBOVUxMLCBOVUxMLCAxMCk7CiAgICAgICAgVGhpcyB3aWxsIGdldCB0aGUgZmlyc3QgdGVuIHBob3RvcyBmcm9tIGEgc3BlY2lmaWMgZ3JvdXAncyBwb29sLiAgSWYgeW91IGxvb2sKICAgICAgICBhdCB0aGUgZG9jdW1lbnRhdGlvbiwgeW91IHdpbGwgc2VlIHRoYXQgdGhlcmUgaXMgYW5vdGhlciBhcmd1bWVudCwgInBhZ2UiLiBJJ3ZlCiAgICAgICAgbGVmdCBpdCBvZmYgYmVjYXVzZSBpdCBhcHBlYXJzIGFmdGVyICJwZXJfcGFnZSIuCiAgICAyLiAgU29tZSBwZW9wbGUgd2lsbCBuZWVkIHRvIHVlcyBwaHBGbGlja3IgZnJvbSBiZWhpbmQgYSBwcm94eSBzZXJ2ZXIuICBJJ3ZlCiAgICAgICAgaW1wbGVtZW50ZWQgYSBtZXRob2QgdGhhdCB3aWxsIGFsbG93IHlvdSB0byB1c2UgYW4gSFRUUCBwcm94eSBmb3IgYWxsIG9mIHlvdXIKICAgICAgICB0cmFmZmljLiAgTGV0J3Mgc2F5IHRoYXQgeW91IGhhdmUgYSBwcm94eSBzZXJ2ZXIgb24geW91ciBsb2NhbCBzZXJ2ZXIgcnVubmluZwogICAgICAgIGF0IHBvcnQgODE4MS4gIFRoaXMgaXMgdGhlIGNvZGUgeW91IHdvdWxkIHVzZToKICAgICAgICAgICAgJGYgPSBuZXcgcGhwRmxpY2tyKCJbYXBpIGtleV0iKTsKICAgICAgICAgICAgJGYtPnNldFByb3h5KCJsb2NhbGhvc3QiLCAiODE4MSIpOwogICAgICAgIEFmdGVyIHRoYXQsIGFsbCBvZiB5b3VyIGNhbGxzIHdpbGwgYmUgYXV0b21hdGljYWxseSBtYWRlIHRocm91Z2ggeW91ciBwcm94eSBzZXJ2ZXIuCiAgICAgICAgICAgIAoKVGhhdCdzIGl0ISBFbmpveSB0aGUgY2xhc3MuICBDaGVjayBvdXQgdGhlIHByb2plY3QgcGFnZSAobGlzdGVkIGFib3ZlKSBmb3IgdXBkYXRlcwphbmQgbmV3cy4gIEkgcGxhbiB0byBpbXBsZW1lbnQgZmlsZSB1cGxvYWRzIGFuZCBmdW5jdGlvbnMgdG8gYWdncmVnYXRlIGRhdGEgZnJvbQpzZXZlcmFsIGRpZmZlcmVudCBtZXRob2RzIGZvciBlYXNpZXIgdXNlIGluIGEgd2ViIGFwcGxpY2F0aW9uLiAgVGhhbmtzIGZvciB5b3VyCmludGVyZXN0IGluIHRoaXMgcHJvamVjdCEKCiAgICBQbGVhc2UgZW1haWwgbWUgaWYgeW91IGhhdmUgYW55IHF1ZXN0aW9ucyBvciBwcm9ibGVtcy4gWW91J2xsIGZpbmQgbXkgZW1haWwKCWF0IHRoZSB0b3Agb2YgdGhpcyBmaWxlLgoKIAo=]]></data>
	</file>
	<file>
	  <filename>/sbFlickrPortefolio.module.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKY2xhc3Mgc2JGbGlja3JQb3J0ZWZvbGlvIGV4dGVuZHMgQ01TTW9kdWxlIHsKCXByaXZhdGUgJGFUYWJsZXMgPSBhcnJheSgpOwoJcHJpdmF0ZSAkc1ZlcnNpb24gPSAiMC4xIjsKCQoJZnVuY3Rpb24gR2V0TmFtZSgpIHsgcmV0dXJuIGdldF9jbGFzcygkdGhpcyk7CX0KCWZ1bmN0aW9uIEdldEF1dGhvcigpIHsgcmV0dXJuICdTdMOpcGhhbmUgQsOpcnViw6knOyB9CiAgZnVuY3Rpb24gR2V0QXV0aG9yRW1haWwoKSB7IHJldHVybiAnc2lyYmVyQGRldHJpdHVzLnFjLmNhJzsgfQoJZnVuY3Rpb24gR2V0VmVyc2lvbigpCXsgcmV0dXJuICR0aGlzLT5zVmVyc2lvbjsgfQoJZnVuY3Rpb24gSXNQbHVnaW5Nb2R1bGUoKQl7CXJldHVybiB0cnVlOyB9CgoJZnVuY3Rpb24gU2V0UGFyYW1ldGVycygpIHsKCQkkdGhpcy0+UmVnaXN0ZXJNb2R1bGVQbHVnaW4oKTsgLy8gdG8gYmUgYWJsZSB0byB1c2Uge3NiRmxpY2tyUG9ydGVmb2xpb30gaW5zdGVhZCBvZiB7Y21zX21vZHVsZSBzYkNhcnJpZXJlfQoJCQoJCSR0aGlzLT5DcmVhdGVQYXJhbWV0ZXIoJ2FwaV9rZXknLCAnJywgJ0ZsaWNrciBBUEkga2V5JywgZmFsc2UpOwoJCSR0aGlzLT5DcmVhdGVQYXJhbWV0ZXIoJ3VzZXJfaWQnLCAnJywgJ0ZsaWNrciBVc2VyIElELCBhbHNvIGNhbGxlZCBOU0lELiBGaW5kIHlvdXJzIDxhIGhyZWY9Imh0dHA6Ly9waXBlcy55YWhvby5jb20vcGlwZXMvcGlwZS5pbmZvP19pZD1wTTBBelBtbjNCR1NTNTNyQngyeVhRIiB0YXJnZXQ9Il9ibGFuayI+aGVyZTwvYT4nLCBmYWxzZSk7CgkJJHRoaXMtPkNyZWF0ZVBhcmFtZXRlcigndGFncycsICcnLCAnY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgdGFncyB0byBzZWFyY2guIGV4OiBwb3J0ZWZvbGlvLHBvcnRyYWl0JywgZmFsc2UpOwoJCSR0aGlzLT5DcmVhdGVQYXJhbWV0ZXIoJ3NpemUnLCAnbScsICdpbWFnZSBzaXplLiBzZWUgZmxpY2tyIGRvY3VtZW50YXRpb24nLCBmYWxzZSk7Cgl9CgkKCWZ1bmN0aW9uIEdldEhlbHAoJGxhbmc9J2VuX1VTJykgewoJCXJldHVybiBubDJicigkdGhpcy0+bGFuZygiaGVscCIpKTsKCX0KCQoJZnVuY3Rpb24gRG9BY3Rpb24oJG5hbWUsICRpZCwgJHBhcmFtcywgJHJldHVybmlkID0gbnVsbCkgewoJCXN3aXRjaCAoJG5hbWUpIHsKCQkJY2FzZSAnZGVmYXVsdCc6CgkJCQlyZXF1aXJlICgicGhwRmxpY2tyL3BocEZsaWNrci5waHAiKTsKCQkJCQoJCQkJJGYgPSBuZXcgcGhwRmxpY2tyKCRwYXJhbXNbImFwaV9rZXkiXSk7CgkJCQkkYVBob3RvcyA9ICRmLT5waG90b3Nfc2VhcmNoKGFycmF5KCJ0YWdzIj0+JHBhcmFtc1sidGFncyJdLCAidXNlcl9pZCI9PiRwYXJhbXNbInVzZXJfaWQiXSkpOwoJCQkJJGFQaG90b3NIVE1MID0gYXJyYXkoKTsKCQkJCWZvcmVhY2ggKCRhUGhvdG9zWyJwaG90byJdIGFzICRhUGhvdG8pIHsKCQkJCQkkc0hUTUwgPSAnPGEgdGl0bGU9ImNsaWNrIHRvIHZpZXcgb24gZmxpY2tyIiBhbHQ9IicuICRhUGhvdG9bInRpdGxlIl0gLiciIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vd3d3LmZsaWNrci5jb20vcGhvdG9zLycgLiAkYVBob3RvWyJvd25lciJdIC4gJy8nIC4gJGFQaG90b1siaWQiXSAuICciPic7CgkJCQkJJHNIVE1MIC49ICc8aW1nIGJvcmRlcj0iMCIgc3JjPSJodHRwOi8vZmFybScgLiAkYVBob3RvWyJmYXJtIl0gLiAnLnN0YXRpY2ZsaWNrci5jb20vJyAuICRhUGhvdG9bInNlcnZlciJdIC4gJy8nIC4gJGFQaG90b1siaWQiXSAgLiAnXycgLiAkYVBob3RvWyJzZWNyZXQiXSAuICdfJyAuICRwYXJhbXNbInNpemUiXSAuICcuanBnIj4nOwoJCQkJCSRzSFRNTCAuPSAnPGJyPjxzcGFuPicgLiAkYVBob3RvWyJ0aXRsZSJdIC4gJzwvc3Bhbj4nOwoJCQkJCSRzSFRNTCAuPSAnPC9hPic7CgkJCQkJCgkJCQkJJGFQaG90b3NIVE1MW10gPSAkc0hUTUw7CgkJCQl9CgkJCQkJCgkJCQkkdGhpcy0+c21hcnR5LT5hc3NpZ24oInBob3RvcyIsICRhUGhvdG9zSFRNTCk7CgkJCQllY2hvICR0aGlzLT5Qcm9jZXNzVGVtcGxhdGUoJ3BvcnRlZm9saW8udHBsJyk7CgkJCQlicmVhazsKCQl9CQkKCX0KfQ==]]></data>
	</file>
	<file>
	  <filename>/templates/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/templates/portefolio.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGRpdiBjbGFzcz0ic2JGbGlja3JQb3J0ZWZvbGlvIj4KCXtmb3JlYWNoIGZyb209JHBob3RvcyBpdGVtPXBob3RvfQoJCTxkaXYgY2xhc3M9J2NlbGwnPjxkaXYgY2xhc3M9J2JveCc+eyRwaG90b308L2Rpdj48L2Rpdj4KCXsvZm9yZWFjaH0KPC9kaXY+]]></data>
	</file>
</module>
