<?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>OpenID</name>
	<version>1.0.0</version>
  <mincmsversion>1.0</mincmsversion>
	<help><![CDATA[PGgzPldoYXQgRG9lcyBUaGlzIERvPzwvaDM+CjxwPlRoZSBPcGVuSUQgbW9kdWxlIHByb3ZpZGVzIGZ1bmN0aW9uYWxpdHkgdG8gYWRkIGFuIE9wZW5JRCBvciBGYWNlYm9vayBhY2NvdW50IHRvIGEgcmVnaXN0ZXJlZCBmcm9udGVuZCB1c2VyLiBUaGF0IHVzZXIgY2FuIHRoZW4gbG9nIGluIHVzaW5nIHRoYXQgaWRlbnRpdHkgaW5zdGVhZCBvZiB0aGUgb3JkaW5hcnkgZnJvbnRlbmQgYWNjb3VudC48L3A+CjxoMz5Ib3cgRG8gSSBVc2UgSXQ8L2gzPgo8cD48b2w+CiAgICA8bGk+TWFrZSBzdXJlIHRoYXQgRnJvbnRFbmRVc2VycyBpcyBpbnN0YWxsZWQ8L2xpPgogICAgPGxpPkluc3RhbGwgdGhlIE9wZW5JRCBtb2R1bGU8L2xpPgogICAgPGxpPkNoZWNrIG91dCB0aGUgc2V0dGluZ3MgcGFnZSBpZiB5b3Ugd2FudCB0byB1c2UgRmFjZWJvb2sgYXMgYSBwcm92aWRlcjwvbGk+CiAgICA8bGk+QWRkIHRoZSB0YWcgPGk+e09wZW5JRH08L2k+IHRvIGEgbmV3IG9yIGFuIGV4aXN0aW5nIHBhZ2U8L2xpPgogICAgPGxpPkxvZyBpbiBhcyBhbiBhbHJlYWR5IHJlZ2lzdGVyZWQgZnJvbnRlbmQgdXNlcjwvbGk+CiAgICA8bGk+VmlzaXQgdGhlIHBhZ2Ugd2l0aCB0aGUgT3BlbklEIHRhZyBhbmQgcmVnaXN0ZXIgYSBwcm92aWRlcjwvbGk+CiAgICA8bGk+TG9nb3V0PC9saT4KICAgIDxsaT5SZXZpc2l0IHRoZSBwYWdlIHdpdGggdGhlIE9wZW5JRCB0YWcsIHNlbGVjdCB0aGUgc2FtZSBwcm92aWRlciB5b3UganVzdCByZWdpc3RlcmVkLCBhdXRoZW50aWNhdGUgYW5kIGJlaG9sZDogWW91IGFyZSBub3cgbG9nZ2VkIGluPC9saT4KPC9vbD48L3A+CjxoMz5TdXBwb3J0PC9oMz4KPHA+R2V0dGluZyBPcGVuSUQgdG8gd29yayBwcm9wZXJseSBjYW4gYmUgYSBiaXQgb2YgYSBzdHJ1Z2dsZSBpZiB5b3UgYXJlIG5vdApmb3J0dW5hdGUgZW5vdWdoIHRvIGhhdmUgYW4gZW52aXJvbm1lbnQgdGhhdCBhbHJlYWR5IGhhcyBhbGwgdGhlIGJpdHMgYW5kIHBpZWNlcyBpbiBwbGFjZS4KPGJyLz5Tb21lIHBsYWNlcyB0byBjaGVjayBiZWZvcmUgYXNraW5nIGZvciBoZWxwOjxici8+Cjx1bD4KICAgIDxsaT5UaGUgamFucmFpbiBSRUFETUUgZmlsZSBpbiB0aGUgL21vZHVsZXMvT3BlbklEL29wZW5pZC1waHAtb3BlbmlkLSp2ZXJzaW9uKiBkaXJlY3Rvcnk8L2xpPgogICAgPGxpPlJ1biB0aGUgZGV0ZWN0LnBocCBmaWxlIGluIC9tb2R1bGVzL09wZW5JRC9vcGVuaWQtcGhwLW9wZW5pZC0qdmVyc2lvbiovZXhhbXBsZXMvPC9saT4KICAgIDxsaT5UcnkgZGlmZmVyZW50IE9wZW5JRCBwcm92aWRlcnMgaW4gb3JkZXIgdG8gZGV0ZXJtaW5lIGlmIGFsbCBhcmUgYnJva2VuIG9yIGp1c3Qgc29tZS4KICAgIEEgcnVsZSBvZiB0aHVtYiBpcyB0aGF0IEZhY2Vib29rIGlzIGEgc2VwYXJhdGUgdGhpbmcgY29tcGFyZWQgdG8gdGhlIE9wZW5JRCBwcm92aWRlcnMuCiAgICBQcm92aWRlcnMgdGhhdCB1c2UgZGlzY292ZXJ5IChsaWtlIEdvb2dsZSkgaXMgZGlmZmVyZW50IGZyb20gdGhlIHNpbXBsZXIgb25lcyBsaWtlIG15T3BlbklEPC9saT4KICAgIDxsaT5DaGVjayB5b3VyIHBocCBlcnJvciBsb2dzIGZvciBhbnkgZXhjZXB0aW9ucyBvciBlcnJvciBtZXNzYWdlcy4gR29vZ2xlIGFueSBvdXRwdXQgZm9yIGNsdWVzIGFib3V0IGhvdyB0byBzb2x2ZSB0aGVtPC9saT4KICAgIDxsaT5TZXQgb3BlbmlkLmRlYnVnIHRvIHRydWUgaW4geW91ciBjb25maWcucGhwLiBUaGlzIHdpbGwgb3V0cHV0IGEgdG9uIG9mIG1lc3NhZ2VzIHRvIHRoZSBwaHAgZXJyb3IgbG9nPC9saT4KPC91bD4KPC9wPgo8aDM+Q3JlZGl0czwvaDM+CjxwPlRoZSBPcGVuSUQgbGlicmFyeSBpcyBzdGFuZGluZyBvbiB0aGUgc2hvdWxkZXJzIG9mIGdpYW50cywgbmFtZWx5Ogo8dWw+CiAgICA8bGk+PGEgaHJlZj0iaHR0cDovL2dpdGh1Yi5jb20vb3BlbmlkL3BocC1vcGVuaWQvIiB0YXJnZXQ9Il9ibGFuayI+UEhQIE9wZW5JRCBsaWJyYXJ5IGJ5IEphblJhaW4sIEluYy48L2E+PC9saT4KICAgIDxsaT48YSBocmVmPSJodHRwOi8vanZhbmNlLmNvbS9wYWdlcy9KUXVlcnlPcGVuSURQbHVnaW4ueGh0bWwiIHRhcmdldD0iX2JsYW5rIj5PcGVuSUQgalF1ZXJ5IHBsdWdpbiBieSBKYXJyZXQgVmFuY2U8L2E+PC9saT4KICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcGhwLXNkay8iIHRhcmdldD0iX2JsYW5rIj5GYWNlYm9vayBQSFAgU0RLPC9hPjwvbGk+CiAgICA8bGk+PGEgaHJlZj0iaHR0cDovL3d3dy5qcXVlcnkuY29tIiB0YXJnZXQ9Il9ibGFuayI+alF1ZXJ5PC9hPjwvbGk+CjwvdWw+CjwvcD4KCjxoMz5Db3B5cmlnaHQgYW5kIExpY2Vuc2U8L2gzPgo8cD5Db3B5cmlnaHQgJmNvcHk7IDIwMTAsIDxhIGhyZWY9Im1haWx0bzpvcGVuaWRAbGVubmFydHNzb25zLm5ldCI+SGVucmlrIExlbm5hcnRzc29uPC9hPi4gQWxsIFJpZ2h0cyBBcmUgUmVzZXJ2ZWQuPC9wPgo8cD5UaGlzIG1vZHVsZSBoYXMgYmVlbiByZWxlYXNlZCB1bmRlciB0aGUgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wLmh0bWwiPkFwYWNoZSBMaWNlbnNlIFZlcnNpb24gMi4wPC9hPi4gWW91IG11c3QgYWdyZWUgdG8gdGhpcyBsaWNlbnNlIGJlZm9yZSB1c2luZyB0aGUgbW9kdWxlLjwvcD4KPGgzPlBhcmFtZXRyYXI8L2gzPjx1bD48bGk+PGVtPihvcHRpb25hbCk8L2VtPiBsYW5nPSJlbl9VUyIgLSBQYXJhbWV0ZXIgc29tIGFudiZhdW1sO25kcyBmJm91bWw7ciBhdHQgc3BlY2lmaWNlcmEgdmlsa2V0IHNwciZhcmluZztrIHNvbSBza2EgYW52JmF1bWw7bmRhcyAmcXVvdDtmcm9udGVuZCZxdW90OywgYWxsdHMmYXJpbmc7IHNqJmF1bWw7bHZhIHNpZG9ybmEgc29tIGJlcyZvdW1sO2thcmUgdGlsbCBkaW4gd2ViYnBsYXRzIHNlci4gQWxsYSBtb2R1bGVyIHN0Jm91bWw7ZGplciBpbnRlIGVsbGVyIGJlaCZvdW1sO3ZlciBpbnRlIGRldHRhLjwvbGk+PC91bD4=]]></help>
	<about><![CDATA[PGJyIC8+RiZvdW1sO3JmYXR0YXJlOiBIZW5yaWsgTGVubmFydHNzb24gJmx0O29wZW5pZEBsZW5uYXJ0c3NvbnMubmV0Jmd0OzxiciAvPjxiciAvPlZlcnNpb24gOiAxLjAuMDxiciAvPjxiciAvPiZBdW1sO25kcmluZ3NoaXN0b3JpYTo8YnIgLz48dWw+CjxsaT5WZXJzaW9uIDEuMC4wIEZpcnN0IHB1YmxpYyByZWxlYXNlIHdpdGggc3VwcG9ydCBmb3IgT3BlbklEIGFuZCBGYWNlYm9vayBhdXRoZW50aWNhdGlvbjwvbGk+CjwvdWw+PGJyIC8+]]></about>
	<description><![CDATA[This module adds OpenID login capabilities to CMS Made Simple and FrontEndUsers.]]></description>
	<file>
	  <filename>/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/action.admin_updateproviders.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qCiAqICAgICAgQ29weXJpZ2h0IDIwMTAgSGVucmlrIExlbm5hcnRzc29uCiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKgogKiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICoKICovCgoKaWYoICFpc3NldCgkZ0NtcykgKSBleGl0OwoKZ2xvYmFsICRnQ21zOwokZGIgPSYgJGdDbXMtPkdldERCKCk7CgokdGhpcy0+U2V0UHJlZmVyZW5jZSgnZW5hYmxlX3Byb3ZpZGVyX2dvb2dsZScsIChpbnQpICRfUE9TVFsnaW5wdXRfcHJvdmlkZXJfZ29vZ2xlJ10pOwokdGhpcy0+U2V0UHJlZmVyZW5jZSgnZW5hYmxlX3Byb3ZpZGVyX3lhaG9vJywgKGludCkgJF9QT1NUWydpbnB1dF9wcm92aWRlcl95YWhvbyddKTsKJHRoaXMtPlNldFByZWZlcmVuY2UoJ2VuYWJsZV9wcm92aWRlcl9hb2wnLCAoaW50KSAkX1BPU1RbJ2lucHV0X3Byb3ZpZGVyX2FvbCddKTsKJHRoaXMtPlNldFByZWZlcmVuY2UoJ2VuYWJsZV9wcm92aWRlcl9teW9wZW5pZCcsIChpbnQpICRfUE9TVFsnaW5wdXRfcHJvdmlkZXJfbXlvcGVuaWQnXSk7CiR0aGlzLT5TZXRQcmVmZXJlbmNlKCdlbmFibGVfcHJvdmlkZXJfbXlzcGFjZScsIChpbnQpICRfUE9TVFsnaW5wdXRfcHJvdmlkZXJfbXlzcGFjZSddKTsKJHRoaXMtPlNldFByZWZlcmVuY2UoJ2VuYWJsZV9wcm92aWRlcl9mbGlja3InLCAoaW50KSAkX1BPU1RbJ2lucHV0X3Byb3ZpZGVyX2ZsaWNrciddKTsKJHRoaXMtPlNldFByZWZlcmVuY2UoJ2VuYWJsZV9wcm92aWRlcl9mYWNlYm9vaycsIChpbnQpICRfUE9TVFsnaW5wdXRfcHJvdmlkZXJfZmFjZWJvb2snXSk7CiR0aGlzLT5TZXRQcmVmZXJlbmNlKCdlbmFibGVfcHJvdmlkZXJfdGVjaG5vcmF0aScsIChpbnQpICRfUE9TVFsnaW5wdXRfcHJvdmlkZXJfdGVjaG5vcmF0aSddKTsKJHRoaXMtPlNldFByZWZlcmVuY2UoJ2VuYWJsZV9wcm92aWRlcl93b3JkcHJlc3MnLCAoaW50KSAkX1BPU1RbJ2lucHV0X3Byb3ZpZGVyX3dvcmRwcmVzcyddKTsKJHRoaXMtPlNldFByZWZlcmVuY2UoJ2VuYWJsZV9wcm92aWRlcl9ibG9nZ2VyJywgKGludCkgJF9QT1NUWydpbnB1dF9wcm92aWRlcl9ibG9nZ2VyJ10pOwokdGhpcy0+U2V0UHJlZmVyZW5jZSgnZW5hYmxlX3Byb3ZpZGVyX2xpdmVqb3VybmFsJywgKGludCkgJF9QT1NUWydpbnB1dF9wcm92aWRlcl9saXZlam91cm5hbCddKTsKJHRoaXMtPlNldFByZWZlcmVuY2UoJ2VuYWJsZV9wcm92aWRlcl9jbGFpbWlkJywgKGludCkgJF9QT1NUWydpbnB1dF9wcm92aWRlcl9jbGFpbWlkJ10pOwokdGhpcy0+U2V0UHJlZmVyZW5jZSgnZW5hYmxlX3Byb3ZpZGVyX3ZpZG9vcCcsIChpbnQpICRfUE9TVFsnaW5wdXRfcHJvdmlkZXJfdmlkb29wJ10pOwokdGhpcy0+U2V0UHJlZmVyZW5jZSgnZW5hYmxlX3Byb3ZpZGVyX3ZlcmlzaWduJywgKGludCkgJF9QT1NUWydpbnB1dF9wcm92aWRlcl92ZXJpc2lnbiddKTsKaW5jbHVkZShkaXJuYW1lKF9fRklMRV9fKSAuICcvYWN0aW9uLmRlZmF1bHRhZG1pbi5waHAnKTsKCj8+]]></data>
	</file>
	<file>
	  <filename>/action.admin_updatesettings.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qCiAqICAgICAgQ29weXJpZ2h0IDIwMTAgSGVucmlrIExlbm5hcnRzc29uCiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKgogKiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICoKICovCgoKaWYoICFpc3NldCgkZ0NtcykgKSBleGl0OwoKZ2xvYmFsICRnQ21zOwokZGIgPSYgJGdDbXMtPkdldERCKCk7CgokdGhpcy0+U2V0UHJlZmVyZW5jZSgnYnVnZ3lfZ21wJywgKGludCkgJHBhcmFtc1snaW5wdXRfYnVnZ3lfZ21wJ10pOwokdGhpcy0+U2V0UHJlZmVyZW5jZSgndXNlX2luc2VjdXJlX3JhbmQnLCAoaW50KSAkcGFyYW1zWydpbnB1dF9pbnNlY3VyZV9yYW5kJ10pOwokdGhpcy0+U2V0UHJlZmVyZW5jZSgnY2FfZmlsZV9vdmVycmlkZScsIChpbnQpICRwYXJhbXNbJ2lucHV0X2NhX2ZpbGVfb3ZlcnJpZGUnXSk7CiR0aGlzLT5TZXRQcmVmZXJlbmNlKCdlbmFibGVfZGVidWdnaW5nJywgKGludCkgJHBhcmFtc1snaW5wdXRfZGVidWdnaW5nJ10pOwokdGhpcy0+U2V0UHJlZmVyZW5jZSgnZmFjZWJvb2tfYXBwX2lkJywgKHN0cmluZykgJHBhcmFtc1snaW5wdXRfZmFjZWJvb2tfYXBwX2lkJ10pOwokdGhpcy0+U2V0UHJlZmVyZW5jZSgnZmFjZWJvb2tfYXBwX3NlY3JldCcsIChzdHJpbmcpICRwYXJhbXNbJ2lucHV0X2ZhY2Vib29rX2FwcF9zZWNyZXQnXSk7CgppbmNsdWRlKGRpcm5hbWUoX19GSUxFX18pIC4gJy9hY3Rpb24uZGVmYXVsdGFkbWluLnBocCcpOwoKPz4=]]></data>
	</file>
	<file>
	  <filename>/action.authenticate.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qCiAqICAgICAgQ29weXJpZ2h0IDIwMTAgSGVucmlrIExlbm5hcnRzc29uCiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKgogKiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICoKICovCgovKiBAdmFyICR0aGlzIE9wZW5JRCAqLwoKaWYgKCFpc3NldCgkZ0NtcykpIGV4aXQ7Cmdsb2JhbCAkcGFyYW1zOwpnbG9iYWwgJGdDbXM7CiRzbWFydHkgPSYgJGdDbXMtPkdldFNtYXJ0eSgpOzsKCiR0aGlzLT5Mb2coIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIik7CiR0aGlzLT5Mb2coIiAqKiogU1RFUCAyICoqKiBhY3Rpb24uYXV0aGVudGljYXRlLnBocCIpOwoKICAgICRjb25zdW1lciA9ICR0aGlzLT5HZXRDb25zdW1lcigpOwoKICAgIC8vIENyZWF0ZSBjb25zdW1lciBhbmQgY29tcGxldGUgYXV0aGVudGljYXRpb24gcHJvY2VzcwogICAgJHRoaXMtPkxvZygiYmVmb3JlIHBhZ2UiKTsKICAgICRyZXR1cm5QYWdlSWQgPSAkcGFyYW1zWydwYWdlJ107CiAgICAkdGhpcy0+TG9nKCJwYWdlID0gIi4kcmV0dXJuUGFnZUlkKTsKICAgICRyZXR1cm5VcmwgPSAkdGhpcy0+Q3JlYXRlTGluaygkaWQsICdhdXRoZW50aWNhdGUnLCAkcmV0dXJuUGFnZUlkLCAnJywgJHBhcmFtcywgJycsIHRydWUsIHRydWUpOwogICAgJHJlc3BvbnNlID0gJGNvbnN1bWVyLT5jb21wbGV0ZSgkcmV0dXJuVXJsKTsKICAgICR0aGlzLT5Mb2coIlJlc3BvbnNlIGlkZW50aXkgVVJMIDogIi4kcmVzcG9uc2UtPmlkZW50aXR5X3VybCk7CgovLyBDaGVjayB0aGUgcmVzcG9uc2Ugc3RhdHVzLgogICAgaWYgKCRyZXNwb25zZS0+c3RhdHVzID09IEF1dGhfT3BlbklEX0NBTkNFTCkgewogICAgICAgIC8vIFRoaXMgbWVhbnMgdGhlIGF1dGhlbnRpY2F0aW9uIHdhcyBjYW5jZWxsZWQuCiAgICAgICAgcHJpbnQgJ1ZlcmlmaWNhdGlvbiBjYW5jZWxsZWQuJzsKICAgIH0gZWxzZSBpZiAoJHJlc3BvbnNlLT5zdGF0dXMgPT0gQXV0aF9PcGVuSURfRkFJTFVSRSkgewogICAgICAgIC8vIEF1dGhlbnRpY2F0aW9uIGZhaWxlZDsgZGlzcGxheSB0aGUgZXJyb3IgbWVzc2FnZS4KICAgICAgICBwcmludCAiT3BlbklEIGF1dGhlbnRpY2F0aW9uIGZhaWxlZDogIiAuICRyZXNwb25zZS0+bWVzc2FnZTsKICAgIH0gZWxzZSBpZiAoJHJlc3BvbnNlLT5zdGF0dXMgPT0gQXV0aF9PcGVuSURfU1VDQ0VTUykgewoKICAgICAgICAvKiBAdmFyICRheHJlc3BvbnNlIEF1dGhfT3BlbklEX0FYX0ZldGNoUmVzcG9uc2UgKi8KICAgICAgICAkYXhyZXNwb25zZSA9IEF1dGhfT3BlbklEX0FYX0ZldGNoUmVzcG9uc2U6OmZyb21TdWNjZXNzUmVzcG9uc2UoJHJlc3BvbnNlKTsKICAgICAgICBpZiAoJGF4cmVzcG9uc2UpIHsKICAgICAgICAgICAgJGVtYWlsID0gJGF4cmVzcG9uc2UtPmdldFNpbmdsZSgnaHR0cDovL2F4c2NoZW1hLm9yZy9jb250YWN0L2VtYWlsJyk7CiAgICAgICAgICAgICR0aGlzLT5Mb2coJ0dvdCB1c2VyIGVtYWlsICcuJGVtYWlsLicgdXNpbmcgYXR0cmlidXRlIGV4Y2hhbmdlJyk7CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICRzcmVnX3Jlc3AgPSBBdXRoX09wZW5JRF9TUmVnUmVzcG9uc2U6OmZyb21TdWNjZXNzUmVzcG9uc2UoJHJlc3BvbnNlKTsKICAgICAgICAgICAgJHNyZWcgPSAkc3JlZ19yZXNwLT5jb250ZW50cygpOwogICAgICAgICAgICBpZiAoQCRzcmVnWydlbWFpbCddKSB7CiAgICAgICAgICAgICAgICAkc3VjY2VzcyAuPSAiICBZb3UgYWxzbyByZXR1cm5lZCAnIi5odG1sZW50aXRpZXMoJHNyZWdbJ2VtYWlsJ10pLgogICAgICAgICAgICAgICAgICAgICInIGFzIHlvdXIgZW1haWwuIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoQCRzcmVnWyduaWNrbmFtZSddKSB7CiAgICAgICAgICAgICAgICAkc3VjY2VzcyAuPSAiICBZb3VyIG5pY2tuYW1lIGlzICciLmh0bWxlbnRpdGllcygkc3JlZ1snbmlja25hbWUnXSkuCiAgICAgICAgICAgICAgICAgICAgIicuIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoQCRzcmVnWydmdWxsbmFtZSddKSB7CiAgICAgICAgICAgICAgICAkc3VjY2VzcyAuPSAiICBZb3VyIGZ1bGxuYW1lIGlzICciLmh0bWxlbnRpdGllcygkc3JlZ1snZnVsbG5hbWUnXSkuCiAgICAgICAgICAgICAgICAgICAgIicuIjsKICAgICAgICAgICAgfQogICAgICAgICAgICAqLwogICAgICAgIH0KICAgICAgICAvKiBAdmFyICRmZXUgRnJvbnRFbmRVc2VycyAqLwogICAgICAgICRmZXUgPSAkdGhpcy0+R2V0TW9kdWxlSW5zdGFuY2UoJ0Zyb250RW5kVXNlcnMnKTsKICAgICAgICBpZiAoJGZldS0+TG9nZ2VkSW4oKSkgewogICAgICAgICAgICAkdGhpcy0+TG9nKCJSZWdpc3RlcmluZyB1c2VyICIuJHJlc3BvbnNlLT5pZGVudGl0eV91cmwuIiBhcyBPcGVuSUQtaWRlbnRpdHkiKTsKICAgICAgICAgICAgLy8gVXNlciBpcyBsb2dnZWQgaW46IEFkZCBPcGVuSUQgaWRlbnRpZmVyIGFuZCBwcm92aWRlciBhcyB1c2VyIGlkZW50aXR5CiAgICAgICAgICAgICR0aGlzLT5SZWdpc3Rlck9wZW5JRCgkZmV1LT5Mb2dnZWRJbklkKCksICRyZXNwb25zZS0+aWRlbnRpdHlfdXJsLCAkZW1haWwpOwoKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkdGhpcy0+TG9nKCJMb2dnaW5nIGluIHVzZXIgIi4kcmVzcG9uc2UtPmlkZW50aXR5X3VybCk7CiAgICAgICAgICAgIC8vIFVzZXIgaXMgbm90IGxvZ2dlZCBpbjogVHJ5IHRvIGxvZ2luIHVzZXIKICAgICAgICAgICAgJG9wZW5pZCA9ICRyZXNwb25zZS0+Z2V0RGlzcGxheUlkZW50aWZpZXIoKTsKICAgICAgICAgICAgJGVzY19pZGVudGl0eSA9IGh0bWxlbnRpdGllcygkb3BlbmlkKTsKICAgICAgICAgICAgJHVpZCA9ICR0aGlzLT5HZXRVc2VySWQoJHJlc3BvbnNlLT5pZGVudGl0eV91cmwpOwogICAgICAgICAgICAkdGhpcy0+TG9nKCJVSUQgPSAiLiR1aWQpOwogICAgICAgICAgICAkdXNlcmluZm8gPSAkZmV1LT5HZXRVc2VySW5mbygkdWlkKTsKICAgICAgICAgICAgaWYgKCR1c2VyaW5mb1swXSkgewogICAgICAgICAgICAgICAgJHVzZXJuYW1lID0gJHVzZXJpbmZvWzFdWyd1c2VybmFtZSddOwogICAgICAgICAgICAgICAgJHBhc3N3b3JkID0gJHVzZXJpbmZvWzFdWydwYXNzd29yZCddOwogICAgICAgICAgICAgICAgJHRoaXMtPkxvZygidXNlcm5hbWUvcGFzc3dvcmQgOiAiLiR1c2VybmFtZS4iICIuJHBhc3N3b3JkKTsKICAgICAgICAgICAgICAgICRyZXN1bHQgPSAkZmV1LT5Mb2dpbigkdXNlcm5hbWUsICRwYXNzd29yZCwgJycsIHRydWUsIHRydWUpOwogICAgICAgICAgICAgICAgJHRoaXMtPkxvZygnTG9naW4gbWVzc2FnZSA6ICcuJHJlc3VsdFsxXSk7CiAgICAgICAgICAgICAgICBpZiAoISRyZXN1bHQpIHsKICAgICAgICAgICAgICAgICAgICBwcmludCAkdGhpcy0+TGFuZygnb3BlbmlkLmZhaWwnLCAkZXNjX2lkZW50aXR5LCAkZXNjX2lkZW50aXR5KTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgcHJpbnQgJHRoaXMtPkxhbmcoJ29wZW5pZC5zdWNjZXNzJywgJGVzY19pZGVudGl0eSwgJGVzY19pZGVudGl0eSwgJHVzZXJuYW1lKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICR0aGlzLT5Mb2coIkVycm9yIHdoaWxlIGZldGNoaW5nIHVzZXJpbmZvIGZvciAiLiR1aWQuIiA6ICIuJHVzZXJpbmZvWzFdKTsKICAgICAgICAgICAgICAgIHByaW50ICR0aGlzLT5MYW5nKCdvcGVuaWQudW5rbm93bicsICRlc2NfaWRlbnRpdHksICRlc2NfaWRlbnRpdHkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgIH0KCiAgICB9Cgo/Pg==]]></data>
	</file>
	<file>
	  <filename>/action.default.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qCiAqICAgICAgQ29weXJpZ2h0IDIwMTAgSGVucmlrIExlbm5hcnRzc29uCiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKgogKiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICoKICovCgppZiAoIWlzc2V0KCRnQ21zKSkgZXhpdDsKLyogQHZhciAkdGhpcyBPcGVuSUQgKi8KLyogQHZhciAkZ0NtcyBDbXNPYmplY3QgKi8KZ2xvYmFsICRnQ21zOwoKJHNtYXJ0eSA9JiAkZ0Ntcy0+R2V0U21hcnR5KCk7CiRzdGFydGZvcm0gPSAkdGhpcy0+Q3JlYXRlRm9ybVN0YXJ0KCRpZCwgJ2xvZ2luJywgJHJldHVybmlkLCAncG9zdCcpOwokc3RhcnRmb3JtID0gc3RyX3JlcGxhY2UoJ2NsYXNzPSInLCAnY2xhc3M9Im9wZW5pZCAnLCAkc3RhcnRmb3JtKTsKJHNtYXJ0eS0+YXNzaWduKCdzdGFydGZvcm0nLCAkc3RhcnRmb3JtKTsKCiRzbWFydHktPmFzc2lnbignZmFjZWJvb2tMb2dpblVybCcsICR0aGlzLT5GYWNlYm9va0xvZ2luVXJsKCRpZCwgJ2ZhY2Vib29rJywgJHJldHVybmlkKSk7CiRjb25maWcgPSAkZ0Ntcy0+R2V0Q29uZmlnKCk7CiRzbWFydHktPmFzc2lnbigncm9vdF9wYXRoJywgJGNvbmZpZ1sncm9vdF9wYXRoJ10pOwoKLyogQHZhciAkZmV1IEZyb250RW5kVXNlcnMgKi8KJGZldSA9ICR0aGlzLT5HZXRNb2R1bGVJbnN0YW5jZSgnRnJvbnRFbmRVc2VycycpOwppZiAoISRmZXUtPkxvZ2dlZEluKCkpIHsKICAgIGVjaG8gJHRoaXMtPlByb2Nlc3NUZW1wbGF0ZSgnbG9naW5fZm9ybS50cGwnKTsKfSBlbHNlIHsKICAgICRyZWdpc3RlcmVkT3BlbklEcyA9ICR0aGlzLT5HZXRSZWdpc3RlcmVkT3BlbklEcygpOwogICAgaWYgKGVtcHR5KCRyZWdpc3RlcmVkT3BlbklEcykpIHsKICAgICAgICBlY2hvICR0aGlzLT5Qcm9jZXNzVGVtcGxhdGUoJ3JlZ2lzdGVyX3Byb3ZpZGVyLnRwbCcpOwogICAgfSBlbHNlIHsKICAgICAgICBlY2hvICR0aGlzLT5Qcm9jZXNzVGVtcGxhdGUoJ2xpc3RfcHJvdmlkZXJzLnRwbCcpOwogICAgfQp9Cgo/Pg==]]></data>
	</file>
	<file>
	  <filename>/action.defaultadmin.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qCiAqICAgICAgQ29weXJpZ2h0IDIwMTAgSGVucmlrIExlbm5hcnRzc29uCiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKgogKiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICoKICovCgovKiBAdmFyICR0aGlzIE9wZW5JRCAqLwovKiBAdmFyICRnQ21zIENtc09iamVjdCAqLwoKaWYgKCFpc3NldCgkZ0NtcykpCiAgICBleGl0OwoKZWNobyAkdGhpcy0+U3RhcnRUYWJIZWFkZXJzKCk7CmVjaG8gJHRoaXMtPlNldFRhYkhlYWRlcigncHJvdmlkZXJzJywgJHRoaXMtPkxhbmcoJ29wZW5pZF9wcm92aWRlcnMnKSk7CmVjaG8gJHRoaXMtPlNldFRhYkhlYWRlcignc2V0dGluZ3MnLCAkdGhpcy0+TGFuZygnc2V0dGluZ3MnKSk7Ci8vZWNobyAkdGhpcy0+U2V0VGFiSGVhZGVyKCd1c2VycycsICR0aGlzLT5MYW5nKCd1c2VycycpKTsKZWNobyAkdGhpcy0+RW5kVGFiSGVhZGVycygpOwoKLy8gVGhlY29udGVudCBvZiB0aGUgdGFicwplY2hvICR0aGlzLT5TdGFydFRhYkNvbnRlbnQoKTsKZWNobyAkdGhpcy0+U3RhcnRUYWIoJ3Byb3ZpZGVycycsICRwYXJhbXMpOwppbmNsdWRlKGRpcm5hbWUoX19GSUxFX18pIC4gJy9mdW5jdGlvbi5hZG1pbl90YWJfcHJvdmlkZXJzLnBocCcpOwplY2hvICR0aGlzLT5FbmRUYWIoKTsKCmVjaG8gJHRoaXMtPlN0YXJ0VGFiKCdzZXR0aW5ncycsICRwYXJhbXMpOwppbmNsdWRlKGRpcm5hbWUoX19GSUxFX18pIC4gJy9mdW5jdGlvbi5hZG1pbl90YWJfc2V0dGluZ3MucGhwJyk7CmVjaG8gJHRoaXMtPkVuZFRhYigpOwoKCi8qZWNobyAkdGhpcy0+U3RhcnRUYWIoJ3VzZXJzJywgJHBhcmFtcyk7CmluY2x1ZGUoZGlybmFtZShfX0ZJTEVfXykgLiAnL2Z1bmN0aW9uLmFkbWluX3RhYl91c2Vycy5waHAnKTsKZWNobyAkdGhpcy0+RW5kVGFiKCk7CiovCmVjaG8gJHRoaXMtPkVuZFRhYkNvbnRlbnQoKTsKPz4K]]></data>
	</file>
	<file>
	  <filename>/action.facebook.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qCiAqICAgICAgQ29weXJpZ2h0IDIwMTAgSGVucmlrIExlbm5hcnRzc29uCiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKgogKiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICoKICovCgovKiBAdmFyICR0aGlzIE9wZW5JRCAqLwppZiAoIWlzc2V0KCRnQ21zKSkgZXhpdDsKZ2xvYmFsICRwYXJhbXM7CiR0aGlzLT5Mb2coIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIik7CiR0aGlzLT5Mb2coIiAqKiogYWN0aW9uLmZhY2Vib29rLnBocCIpOwoKCmdsb2JhbCAkZ0NtczsKJHNtYXJ0eSA9JiAkZ0Ntcy0+R2V0U21hcnR5KCk7OwoKcmVxdWlyZV9vbmNlIGRpcm5hbWUoX19GSUxFX18pLiIvZmFjZWJvb2tfMl8xXzIvZmFjZWJvb2sucGhwIjsKCi8qIEB2YXIgZmFjZWJvb2sgRmFjZWJvb2sgKi8KJGZhY2Vib29rID0gbmV3IEZhY2Vib29rKGFycmF5KAogICdhcHBJZCcgID0+ICR0aGlzLT5HZXRQcmVmZXJlbmNlKCdmYWNlYm9va19hcHBfaWQnLCcnKSwKICAnc2VjcmV0JyA9PiAkdGhpcy0+R2V0UHJlZmVyZW5jZSgnZmFjZWJvb2tfYXBwX3NlY3JldCcsJycpLAogICdjb29raWUnID0+IHRydWUsCikpOwoKJHNlc3Npb24gPSAkZmFjZWJvb2stPmdldFNlc3Npb24oKTsKCiRtZSA9IG51bGw7CgppZiAoJHNlc3Npb24pIHsKICB0cnkgewogICAgJGZhY2Vib29rVWlkID0gJGZhY2Vib29rLT5nZXRVc2VyKCk7CiAgICAkbWUgPSAkZmFjZWJvb2stPmFwaSgnL21lJyk7CiAgICAkdXJsID0gJG1lWydsaW5rJ107CgogICAgLyogQHZhciAkZmV1IEZyb250RW5kVXNlcnMgKi8KICAgICRmZXUgPSAkdGhpcy0+R2V0TW9kdWxlSW5zdGFuY2UoJ0Zyb250RW5kVXNlcnMnKTsKICAgIGlmICgkZmV1LT5Mb2dnZWRJbigpKSB7CiAgICAgICAgJHRoaXMtPkxvZygiUmVnaXN0ZXJpbmcgdXNlciAiLiRmYWNlYm9va1VpZC4iIGFzIEZhY2Vib29rLWlkZW50aXR5Iik7CiAgICAgICAgLy8gVXNlciBpcyBsb2dnZWQgaW46IEFkZCBGYWNlYm9vayBpZGVudGlmZXIgYXMgdXNlciBpZGVudGl0eQogICAgICAgICR0aGlzLT5SZWdpc3Rlck9wZW5JRCgkZmV1LT5Mb2dnZWRJbklkKCksICdmYWNlYm9vazonLiRmYWNlYm9va1VpZCwgJHVybCk7CgogICAgfSBlbHNlIHsKICAgICAgICAkdGhpcy0+TG9nKCJMb2dnaW5nIGluIGZhY2Vib29rIHVzZXIgIi4kZmFjZWJvb2tVaWQpOwogICAgICAgIC8vIFVzZXIgaXMgbm90IGxvZ2dlZCBpbjogVHJ5IHRvIGxvZ2luIHVzZXIKICAgICAgICAkdWlkID0gJHRoaXMtPkdldFVzZXJJZCgnZmFjZWJvb2s6Jy4kZmFjZWJvb2tVaWQpOwogICAgICAgICR0aGlzLT5Mb2coIlVJRCA9ICIuJHVpZCk7CiAgICAgICAgJHVzZXJpbmZvID0gJGZldS0+R2V0VXNlckluZm8oJHVpZCk7CiAgICAgICAgaWYgKCR1c2VyaW5mb1swXSkgewogICAgICAgICAgICAkdXNlcm5hbWUgPSAkdXNlcmluZm9bMV1bJ3VzZXJuYW1lJ107CiAgICAgICAgICAgICRwYXNzd29yZCA9ICR1c2VyaW5mb1sxXVsncGFzc3dvcmQnXTsKICAgICAgICAgICAgJHRoaXMtPkxvZygidXNlcm5hbWUvcGFzc3dvcmQgOiAiLiR1c2VybmFtZS4iICIuJHBhc3N3b3JkKTsKICAgICAgICAgICAgJHJlc3VsdCA9ICRmZXUtPkxvZ2luKCR1c2VybmFtZSwgJHBhc3N3b3JkLCAnJywgdHJ1ZSwgdHJ1ZSk7CiAgICAgICAgICAgICR0aGlzLT5Mb2coJ0xvZ2luIG1lc3NhZ2UgOiAnLiRyZXN1bHRbMV0pOwogICAgICAgICAgICBpZiAoISRyZXN1bHQpIHsKICAgICAgICAgICAgICAgIHByaW50ICR0aGlzLT5MYW5nKCdvcGVuaWQuZmFpbCcsICR1cmwsICR1cmwpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgcHJpbnQgJHRoaXMtPkxhbmcoJ29wZW5pZC5zdWNjZXNzJywgJHVybCwgJHVybCwgJHVzZXJuYW1lKTsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICR0aGlzLT5Mb2coIkVycm9yIHdoaWxlIGZldGNoaW5nIHVzZXJpbmZvIGZvciAiLiR1aWQuIiA6ICIuJHVzZXJpbmZvWzFdKTsKICAgICAgICAgICAgcHJpbnQgJHRoaXMtPkxhbmcoJ29wZW5pZC51bmtub3duJywgJHVybCwgJHVybCk7CiAgICAgICAgfQoKICAgIH0KCiAgfSBjYXRjaCAoRmFjZWJvb2tBcGlFeGNlcHRpb24gJGUpIHsKICAgIGVycm9yX2xvZygkZSk7CiAgfQp9Cgo/Pg==]]></data>
	</file>
	<file>
	  <filename>/action.login.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qCiAqICAgICAgQ29weXJpZ2h0IDIwMTAgSGVucmlrIExlbm5hcnRzc29uCiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKgogKiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICoKICovCgovKiBAdmFyICR0aGlzIE9wZW5JRCAqLwppZiAoIWlzc2V0KCRnQ21zKSkgZXhpdDsKZ2xvYmFsICRwYXJhbXM7CiR0aGlzLT5Mb2coIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIik7CiR0aGlzLT5Mb2coIiAqKiogU1RFUCAxICoqKiBhY3Rpb24ubG9naW4ucGhwIik7CiR0aGlzLT5Mb2coIm9wZW5pZC1pZGVudGlmaWVyIDogIi4kcGFyYW1zWydvcGVuaWRfaWRlbnRpZmllciddKTsKJHRoaXMtPkxvZygib3BlbmlkX3VzZXJuYW1lIDogIi4kcGFyYW1zWydvcGVuaWRfdXNlcm5hbWUnXSk7Cmdsb2JhbCAkZ0NtczsKJHNtYXJ0eSA9JiAkZ0Ntcy0+R2V0U21hcnR5KCk7OwoKZnVuY3Rpb24gZ2V0T3BlbklEVVJMKCkgewogICAgZ2xvYmFsICRwYXJhbXM7CiAgICAvLyBSZW5kZXIgYSBkZWZhdWx0IHBhZ2UgaWYgd2UgZ290IGEgc3VibWlzc2lvbiB3aXRob3V0IGFuIG9wZW5pZAogICAgLy8gdmFsdWUuCiAgICBpZiAoZW1wdHkoJHBhcmFtc1snb3BlbmlkX2lkZW50aWZpZXInXSkpIHsKICAgICAgICAkZXJyb3IgPSAiRXhwZWN0ZWQgYW4gT3BlbklEIFVSTC4iOwogICAgICAgICR0aGlzLT5Mb2coJGVycm9yKTsKICAgICAgICBleGl0KDApOwogICAgfQoKICAgIHJldHVybiAkcGFyYW1zWydvcGVuaWRfaWRlbnRpZmllciddOwp9CgoKICAgICRvcGVuaWQgPSBnZXRPcGVuSURVUkwoKTsKICAgICRjb25zdW1lciA9ICR0aGlzLT5HZXRDb25zdW1lcigpOwoKICAgIC8vIEJlZ2luIHRoZSBPcGVuSUQgYXV0aGVudGljYXRpb24gcHJvY2Vzcy4KICAgICRhdXRoX3JlcXVlc3QgPSAkY29uc3VtZXItPmJlZ2luKCRvcGVuaWQpOwoKICAgIC8vIE5vIGF1dGggcmVxdWVzdCBtZWFucyB3ZSBjYW4ndCBiZWdpbiBPcGVuSUQuCiAgICBpZiAoISRhdXRoX3JlcXVlc3QpIHsKICAgICAgICBwcmludCAiQXV0aGVudGljYXRpb24gZXJyb3I7IG5vdCBhIHZhbGlkIE9wZW5JRC4iOwogICAgfQoKICAgIC8vIFNpbXBsZSBSZWdpc3RyYXRpb24gcHJvdG9jb2wgbWVzc2FnZXMuCiAgICAkc3JlZ19yZXF1ZXN0ID0gQXV0aF9PcGVuSURfU1JlZ1JlcXVlc3Q6OmJ1aWxkKGFycmF5KCdlbWFpbCcpLGFycmF5KCdmdWxsbmFtZScsICduaWNrbmFtZScpKTsKICAgIGlmICghJHNyZWdfcmVxdWVzdCkgewogICAgICAgIGRpZSgic3JlZyBmYWlsZWQiKTsKICAgIH0KICAgIGlmICgkc3JlZ19yZXF1ZXN0KSB7CiAgICAgICAgJGF1dGhfcmVxdWVzdC0+YWRkRXh0ZW5zaW9uKCRzcmVnX3JlcXVlc3QpOwogICAgfQoKICAgIC8vIEF0dHJpYnV0ZSBleGNoYW5nZQogICAgJGF4X3JlcXVlc3QgPSBuZXcgQXV0aF9PcGVuSURfQVhfRmV0Y2hSZXF1ZXN0KCk7CiAgICAkYXhfcmVxdWVzdC0+YWRkKEF1dGhfT3BlbklEX0FYX0F0dHJJbmZvOjptYWtlKCdodHRwOi8vYXhzY2hlbWEub3JnL2NvbnRhY3QvZW1haWwnLCAxLCBUUlVFKSk7CiAgICAvLyRheF9yZXF1ZXN0LT5hZGQoJ2ZpcnN0bmFtZScpOwogICAgLy8kYXhfcmVxdWVzdC0+YWRkKCdsYXN0bmFtZScpOwogICAgJGF1dGhfcmVxdWVzdC0+YWRkRXh0ZW5zaW9uKCRheF9yZXF1ZXN0KTsKCiAgICAkcG9saWN5X3VyaXMgPSAkX0dFVFsncG9saWNpZXMnXTsKICAgIC8qCiAgICAkcGFwZV9yZXF1ZXN0ID0gbmV3IEF1dGhfT3BlbklEX1BBUEVfUmVxdWVzdCgkcG9saWN5X3VyaXMpOwogICAgaWYgKCRwYXBlX3JlcXVlc3QpIHsKICAgICAgICAvLyRhdXRoX3JlcXVlc3QtPmFkZEV4dGVuc2lvbigkcGFwZV9yZXF1ZXN0KTsKICAgIH0qLwoKICAgIC8vIFJlZGlyZWN0IHRoZSB1c2VyIHRvIHRoZSBPcGVuSUQgc2VydmVyIGZvciBhdXRoZW50aWNhdGlvbi4KICAgIC8vIFN0b3JlIHRoZSB0b2tlbiBmb3IgdGhpcyBhdXRoZW50aWNhdGlvbiBzbyB3ZSBjYW4gdmVyaWZ5IHRoZQogICAgLy8gcmVzcG9uc2UuCgogICAgLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgJHJldHVyblBhZ2VJZCA9IENvbnRlbnRNYW5hZ2VyOjpHZXRQYWdlSURGcm9tQWxpYXMoICdvcGVuaWQnICk7CiAgICAkcmV0dXJuVXJsID0gJHRoaXMtPkNyZWF0ZUxpbmsoJGlkLCAnYXV0aGVudGljYXRlJywgJHJldHVyblBhZ2VJZCwgJycsICRwYXJhbXMsICcnLCB0cnVlLCB0cnVlKTsKICAgICR0cnVzdFJvb3QgPSAkZ0Ntcy0+Y29uZmlnWydyb290X3VybCddOwogICAgJHRoaXMtPkxvZygnUmV0dXJuIFVSTCA6ICcuJHJldHVyblVybCk7CiAgICAkcmVkaXJlY3RfdXJsID0gJGF1dGhfcmVxdWVzdC0+cmVkaXJlY3RVUkwoJHRydXN0Um9vdCwgJHJldHVyblVybCk7CiAgICAkdGhpcy0+TG9nKCdSZWRpcmVjdCBVUkwgOiAnLiRyZWRpcmVjdF91cmwpOwogICAgJHBhcnRzID0gZXhwbG9kZSgiJiIsICRyZWRpcmVjdF91cmwpOwogICAgJHRoaXMtPkxvZygicmVxdWVzdCB0cnlfYXV0aCA6Iik7CiAgICBmb3JlYWNoICgkcGFydHMgYXMgJHBhcnQpIHsKICAgICAgICAkdGhpcy0+TG9nKHVybGRlY29kZSgkcGFydCkpOwogICAgfQoKICAgIC8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiAgICAvLyBGb3IgT3BlbklEIDEsIHNlbmQgYSByZWRpcmVjdC4gIEZvciBPcGVuSUQgMiwgdXNlIGEgSmF2YXNjcmlwdAogICAgLy8gZm9ybSB0byBzZW5kIGEgUE9TVCByZXF1ZXN0IHRvIHRoZSBzZXJ2ZXIuCiAgICBpZiAoJGF1dGhfcmVxdWVzdC0+c2hvdWxkU2VuZFJlZGlyZWN0KCkpIHsKICAgICAgICAkcmVkaXJlY3RfdXJsID0gJGF1dGhfcmVxdWVzdC0+cmVkaXJlY3RVUkwoJHRydXN0Um9vdCwgJHJldHVyblVybCk7CgogICAgICAgIC8vIElmIHRoZSByZWRpcmVjdCBVUkwgY2FuJ3QgYmUgYnVpbHQsIGRpc3BsYXkgYW4gZXJyb3IKICAgICAgICAvLyBtZXNzYWdlLgogICAgICAgIGlmIChBdXRoX09wZW5JRDo6aXNGYWlsdXJlKCRyZWRpcmVjdF91cmwpKSB7CiAgICAgICAgICAgIHByaW50ICJDb3VsZCBub3QgcmVkaXJlY3QgdG8gc2VydmVyOiAiIC4gJHJlZGlyZWN0X3VybC0+bWVzc2FnZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvLyBTZW5kIHJlZGlyZWN0LgogICAgICAgICAgICBoZWFkZXIoIkxvY2F0aW9uOiAiLiRyZWRpcmVjdF91cmwpOwogICAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgICAgLy8gR2VuZXJhdGUgZm9ybSBtYXJrdXAgYW5kIHJlbmRlciBpdC4KICAgICAgICAkZm9ybV9pZCA9ICdvcGVuaWRfbWVzc2FnZSc7CiAgICAgICAgLyoKICAgICAgICAkZm9ybV9odG1sID0gJGF1dGhfcmVxdWVzdC0+aHRtbE1hcmt1cCgkdHJ1c3RSb290LCAkcmV0dXJuVXJsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBhcnJheSgnaWQnID0+ICRmb3JtX2lkKSk7CiAgICAgICAgICoKICAgICAgICAgKi8KICAgICAgICAkZm9ybV9odG1sID0gJGF1dGhfcmVxdWVzdC0+Zm9ybU1hcmt1cCgkdHJ1c3RSb290LCAkcmV0dXJuVXJsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBhcnJheSgnaWQnID0+ICRmb3JtX2lkKSk7CiAgICAgICAgLy8gRGlzcGxheSBhbiBlcnJvciBpZiB0aGUgZm9ybSBtYXJrdXAgY291bGRuJ3QgYmUgZ2VuZXJhdGVkOwogICAgICAgIC8vIG90aGVyd2lzZSwgcmVuZGVyIHRoZSBIVE1MLgogICAgICAgIGlmIChBdXRoX09wZW5JRDo6aXNGYWlsdXJlKCRmb3JtX2h0bWwpKSB7CiAgICAgICAgICAgIHByaW50ICJDb3VsZCBub3QgcmVkaXJlY3QgdG8gc2VydmVyOiAiIC4gJGZvcm1faHRtbC0+bWVzc2FnZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBwcmludCAnPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0ibW9kdWxlcy9PcGVuSUQvc2NyaXB0cy9qcXVlcnkubWluLmpzIj48L3NjcmlwdD4nOwogICAgICAgICAgICBwcmludCAnPGltZyBzcmM9IicuJGdDbXMtPmNvbmZpZ1sncm9vdF91cmwnXS4nL21vZHVsZXMvT3BlbklEL2ltYWdlcy9hamF4LWxvYWRlci5naWYiPiZuYnNwOyZuYnNwOyc7CiAgICAgICAgICAgIHByaW50ICR0aGlzLT5MYW5nKCdvcGVuaWQucmVkaXJlY3RpbmcnKTsKICAgICAgICAgICAgcHJpbnQgJzxkaXYgaWQ9Ik9wZW5JZEZvcm0iPicuJGZvcm1faHRtbC4nPC9kaXY+JzsKICAgICAgICAgICAgcHJpbnQgJzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4nOwogICAgICAgICAgICBwcmludCAnICAkKGZ1bmN0aW9uKCkgeyc7CiAgICAgICAgICAgIHByaW50ICcgICAgJCgiaW5wdXRbdHlwZT1zdWJtaXRdIiwgJCgiI09wZW5JZEZvcm0iKSkuY2xpY2soKTsnOwogICAgICAgICAgICBwcmludCAnICAgICQoImlucHV0W3R5cGU9c3VibWl0XSIsICQoIiNPcGVuSWRGb3JtIikpLmhpZGUoKTsnOwogICAgICAgICAgICBwcmludCAnICB9KTsnOwogICAgICAgICAgICBwcmludCAnPC9zY3JpcHQ+JzsKICAgICAgICB9CiAgICB9Cgo/Pg==]]></data>
	</file>
	<file>
	  <filename>/facebook_2_1_2/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/facebook_2_1_2/facebook.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCmlmICghZnVuY3Rpb25fZXhpc3RzKCdjdXJsX2luaXQnKSkgewogIHRocm93IG5ldyBFeGNlcHRpb24oJ0ZhY2Vib29rIG5lZWRzIHRoZSBDVVJMIFBIUCBleHRlbnNpb24uJyk7Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2pzb25fZGVjb2RlJykpIHsKICB0aHJvdyBuZXcgRXhjZXB0aW9uKCdGYWNlYm9vayBuZWVkcyB0aGUgSlNPTiBQSFAgZXh0ZW5zaW9uLicpOwp9CgovKioKICogVGhyb3duIHdoZW4gYW4gQVBJIGNhbGwgcmV0dXJucyBhbiBleGNlcHRpb24uCiAqCiAqIEBhdXRob3IgTmFpdGlrIFNoYWggPG5haXRpa0BmYWNlYm9vay5jb20+CiAqLwpjbGFzcyBGYWNlYm9va0FwaUV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbgp7CiAgLyoqCiAgICogVGhlIHJlc3VsdCBmcm9tIHRoZSBBUEkgc2VydmVyIHRoYXQgcmVwcmVzZW50cyB0aGUgZXhjZXB0aW9uIGluZm9ybWF0aW9uLgogICAqLwogIHByb3RlY3RlZCAkcmVzdWx0OwoKICAvKioKICAgKiBNYWtlIGEgbmV3IEFQSSBFeGNlcHRpb24gd2l0aCB0aGUgZ2l2ZW4gcmVzdWx0LgogICAqCiAgICogQHBhcmFtIEFycmF5ICRyZXN1bHQgdGhlIHJlc3VsdCBmcm9tIHRoZSBBUEkgc2VydmVyCiAgICovCiAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRyZXN1bHQpIHsKICAgICR0aGlzLT5yZXN1bHQgPSAkcmVzdWx0OwoKICAgICRjb2RlID0gaXNzZXQoJHJlc3VsdFsnZXJyb3JfY29kZSddKSA/ICRyZXN1bHRbJ2Vycm9yX2NvZGUnXSA6IDA7CgogICAgaWYgKGlzc2V0KCRyZXN1bHRbJ2Vycm9yX2Rlc2NyaXB0aW9uJ10pKSB7CiAgICAgIC8vIE9BdXRoIDIuMCBEcmFmdCAxMCBzdHlsZQogICAgICAkbXNnID0gJHJlc3VsdFsnZXJyb3JfZGVzY3JpcHRpb24nXTsKICAgIH0gZWxzZSBpZiAoaXNzZXQoJHJlc3VsdFsnZXJyb3InXSkgJiYgaXNfYXJyYXkoJHJlc3VsdFsnZXJyb3InXSkpIHsKICAgICAgLy8gT0F1dGggMi4wIERyYWZ0IDAwIHN0eWxlCiAgICAgICRtc2cgPSAkcmVzdWx0WydlcnJvciddWydtZXNzYWdlJ107CiAgICB9IGVsc2UgaWYgKGlzc2V0KCRyZXN1bHRbJ2Vycm9yX21zZyddKSkgewogICAgICAvLyBSZXN0IHNlcnZlciBzdHlsZQogICAgICAkbXNnID0gJHJlc3VsdFsnZXJyb3JfbXNnJ107CiAgICB9IGVsc2UgewogICAgICAkbXNnID0gJ1Vua25vd24gRXJyb3IuIENoZWNrIGdldFJlc3VsdCgpJzsKICAgIH0KCiAgICBwYXJlbnQ6Ol9fY29uc3RydWN0KCRtc2csICRjb2RlKTsKICB9CgogIC8qKgogICAqIFJldHVybiB0aGUgYXNzb2NpYXRlZCByZXN1bHQgb2JqZWN0IHJldHVybmVkIGJ5IHRoZSBBUEkgc2VydmVyLgogICAqCiAgICogQHJldHVybnMgQXJyYXkgdGhlIHJlc3VsdCBmcm9tIHRoZSBBUEkgc2VydmVyCiAgICovCiAgcHVibGljIGZ1bmN0aW9uIGdldFJlc3VsdCgpIHsKICAgIHJldHVybiAkdGhpcy0+cmVzdWx0OwogIH0KCiAgLyoqCiAgICogUmV0dXJucyB0aGUgYXNzb2NpYXRlZCB0eXBlIGZvciB0aGUgZXJyb3IuIFRoaXMgd2lsbCBkZWZhdWx0IHRvCiAgICogJ0V4Y2VwdGlvbicgd2hlbiBhIHR5cGUgaXMgbm90IGF2YWlsYWJsZS4KICAgKgogICAqIEByZXR1cm4gU3RyaW5nCiAgICovCiAgcHVibGljIGZ1bmN0aW9uIGdldFR5cGUoKSB7CiAgICBpZiAoaXNzZXQoJHRoaXMtPnJlc3VsdFsnZXJyb3InXSkpIHsKICAgICAgJGVycm9yID0gJHRoaXMtPnJlc3VsdFsnZXJyb3InXTsKICAgICAgaWYgKGlzX3N0cmluZygkZXJyb3IpKSB7CiAgICAgICAgLy8gT0F1dGggMi4wIERyYWZ0IDEwIHN0eWxlCiAgICAgICAgcmV0dXJuICRlcnJvcjsKICAgICAgfSBlbHNlIGlmIChpc19hcnJheSgkZXJyb3IpKSB7CiAgICAgICAgLy8gT0F1dGggMi4wIERyYWZ0IDAwIHN0eWxlCiAgICAgICAgaWYgKGlzc2V0KCRlcnJvclsndHlwZSddKSkgewogICAgICAgICAgcmV0dXJuICRlcnJvclsndHlwZSddOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuICdFeGNlcHRpb24nOwogIH0KCiAgLyoqCiAgICogVG8gbWFrZSBkZWJ1Z2dpbmcgZWFzaWVyLgogICAqCiAgICogQHJldHVybnMgU3RyaW5nIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGVycm9yCiAgICovCiAgcHVibGljIGZ1bmN0aW9uIF9fdG9TdHJpbmcoKSB7CiAgICAkc3RyID0gJHRoaXMtPmdldFR5cGUoKSAuICc6ICc7CiAgICBpZiAoJHRoaXMtPmNvZGUgIT0gMCkgewogICAgICAkc3RyIC49ICR0aGlzLT5jb2RlIC4gJzogJzsKICAgIH0KICAgIHJldHVybiAkc3RyIC4gJHRoaXMtPm1lc3NhZ2U7CiAgfQp9CgovKioKICogUHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBGYWNlYm9vayBQbGF0Zm9ybS4KICoKICogQGF1dGhvciBOYWl0aWsgU2hhaCA8bmFpdGlrQGZhY2Vib29rLmNvbT4KICovCmNsYXNzIEZhY2Vib29rCnsKICAvKioKICAgKiBWZXJzaW9uLgogICAqLwogIGNvbnN0IFZFUlNJT04gPSAnMi4xLjInOwoKICAvKioKICAgKiBEZWZhdWx0IG9wdGlvbnMgZm9yIGN1cmwuCiAgICovCiAgcHVibGljIHN0YXRpYyAkQ1VSTF9PUFRTID0gYXJyYXkoCiAgICBDVVJMT1BUX0NPTk5FQ1RUSU1FT1VUID0+IDEwLAogICAgQ1VSTE9QVF9SRVRVUk5UUkFOU0ZFUiA9PiB0cnVlLAogICAgQ1VSTE9QVF9USU1FT1VUICAgICAgICA9PiA2MCwKICAgIENVUkxPUFRfVVNFUkFHRU5UICAgICAgPT4gJ2ZhY2Vib29rLXBocC0yLjAnLAogICk7CgogIC8qKgogICAqIExpc3Qgb2YgcXVlcnkgcGFyYW1ldGVycyB0aGF0IGdldCBhdXRvbWF0aWNhbGx5IGRyb3BwZWQgd2hlbiByZWJ1aWxkaW5nCiAgICogdGhlIGN1cnJlbnQgVVJMLgogICAqLwogIHByb3RlY3RlZCBzdGF0aWMgJERST1BfUVVFUllfUEFSQU1TID0gYXJyYXkoCiAgICAnc2Vzc2lvbicsCiAgICAnc2lnbmVkX3JlcXVlc3QnLAogICk7CgogIC8qKgogICAqIE1hcHMgYWxpYXNlcyB0byBGYWNlYm9vayBkb21haW5zLgogICAqLwogIHB1YmxpYyBzdGF0aWMgJERPTUFJTl9NQVAgPSBhcnJheSgKICAgICdhcGknICAgICAgPT4gJ2h0dHBzOi8vYXBpLmZhY2Vib29rLmNvbS8nLAogICAgJ2FwaV9yZWFkJyA9PiAnaHR0cHM6Ly9hcGktcmVhZC5mYWNlYm9vay5jb20vJywKICAgICdncmFwaCcgICAgPT4gJ2h0dHBzOi8vZ3JhcGguZmFjZWJvb2suY29tLycsCiAgICAnd3d3JyAgICAgID0+ICdodHRwczovL3d3dy5mYWNlYm9vay5jb20vJywKICApOwoKICAvKioKICAgKiBUaGUgQXBwbGljYXRpb24gSUQuCiAgICovCiAgcHJvdGVjdGVkICRhcHBJZDsKCiAgLyoqCiAgICogVGhlIEFwcGxpY2F0aW9uIEFQSSBTZWNyZXQuCiAgICovCiAgcHJvdGVjdGVkICRhcGlTZWNyZXQ7CgogIC8qKgogICAqIFRoZSBhY3RpdmUgdXNlciBzZXNzaW9uLCBpZiBvbmUgaXMgYXZhaWxhYmxlLgogICAqLwogIHByb3RlY3RlZCAkc2Vzc2lvbjsKCiAgLyoqCiAgICogVGhlIGRhdGEgZnJvbSB0aGUgc2lnbmVkX3JlcXVlc3QgdG9rZW4uCiAgICovCiAgcHJvdGVjdGVkICRzaWduZWRSZXF1ZXN0OwoKICAvKioKICAgKiBJbmRpY2F0ZXMgdGhhdCB3ZSBhbHJlYWR5IGxvYWRlZCB0aGUgc2Vzc2lvbiBhcyBiZXN0IGFzIHdlIGNvdWxkLgogICAqLwogIHByb3RlY3RlZCAkc2Vzc2lvbkxvYWRlZCA9IGZhbHNlOwoKICAvKioKICAgKiBJbmRpY2F0ZXMgaWYgQ29va2llIHN1cHBvcnQgc2hvdWxkIGJlIGVuYWJsZWQuCiAgICovCiAgcHJvdGVjdGVkICRjb29raWVTdXBwb3J0ID0gZmFsc2U7CgogIC8qKgogICAqIEJhc2UgZG9tYWluIGZvciB0aGUgQ29va2llLgogICAqLwogIHByb3RlY3RlZCAkYmFzZURvbWFpbiA9ICcnOwoKICAvKioKICAgKiBJbmRpY2F0ZXMgaWYgdGhlIENVUkwgYmFzZWQgQCBzeW50YXggZm9yIGZpbGUgdXBsb2FkcyBpcyBlbmFibGVkLgogICAqLwogIHByb3RlY3RlZCAkZmlsZVVwbG9hZFN1cHBvcnQgPSBmYWxzZTsKCiAgLyoqCiAgICogSW5pdGlhbGl6ZSBhIEZhY2Vib29rIEFwcGxpY2F0aW9uLgogICAqCiAgICogVGhlIGNvbmZpZ3VyYXRpb246CiAgICogLSBhcHBJZDogdGhlIGFwcGxpY2F0aW9uIElECiAgICogLSBzZWNyZXQ6IHRoZSBhcHBsaWNhdGlvbiBzZWNyZXQKICAgKiAtIGNvb2tpZTogKG9wdGlvbmFsKSBib29sZWFuIHRydWUgdG8gZW5hYmxlIGNvb2tpZSBzdXBwb3J0CiAgICogLSBkb21haW46IChvcHRpb25hbCkgZG9tYWluIGZvciB0aGUgY29va2llCiAgICogLSBmaWxlVXBsb2FkOiAob3B0aW9uYWwpIGJvb2xlYW4gaW5kaWNhdGluZyBpZiBmaWxlIHVwbG9hZHMgYXJlIGVuYWJsZWQKICAgKgogICAqIEBwYXJhbSBBcnJheSAkY29uZmlnIHRoZSBhcHBsaWNhdGlvbiBjb25maWd1cmF0aW9uCiAgICovCiAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRjb25maWcpIHsKICAgICR0aGlzLT5zZXRBcHBJZCgkY29uZmlnWydhcHBJZCddKTsKICAgICR0aGlzLT5zZXRBcGlTZWNyZXQoJGNvbmZpZ1snc2VjcmV0J10pOwogICAgaWYgKGlzc2V0KCRjb25maWdbJ2Nvb2tpZSddKSkgewogICAgICAkdGhpcy0+c2V0Q29va2llU3VwcG9ydCgkY29uZmlnWydjb29raWUnXSk7CiAgICB9CiAgICBpZiAoaXNzZXQoJGNvbmZpZ1snZG9tYWluJ10pKSB7CiAgICAgICR0aGlzLT5zZXRCYXNlRG9tYWluKCRjb25maWdbJ2RvbWFpbiddKTsKICAgIH0KICAgIGlmIChpc3NldCgkY29uZmlnWydmaWxlVXBsb2FkJ10pKSB7CiAgICAgICR0aGlzLT5zZXRGaWxlVXBsb2FkU3VwcG9ydCgkY29uZmlnWydmaWxlVXBsb2FkJ10pOwogICAgfQogIH0KCiAgLyoqCiAgICogU2V0IHRoZSBBcHBsaWNhdGlvbiBJRC4KICAgKgogICAqIEBwYXJhbSBTdHJpbmcgJGFwcElkIHRoZSBBcHBsaWNhdGlvbiBJRAogICAqLwogIHB1YmxpYyBmdW5jdGlvbiBzZXRBcHBJZCgkYXBwSWQpIHsKICAgICR0aGlzLT5hcHBJZCA9ICRhcHBJZDsKICAgIHJldHVybiAkdGhpczsKICB9CgogIC8qKgogICAqIEdldCB0aGUgQXBwbGljYXRpb24gSUQuCiAgICoKICAgKiBAcmV0dXJuIFN0cmluZyB0aGUgQXBwbGljYXRpb24gSUQKICAgKi8KICBwdWJsaWMgZnVuY3Rpb24gZ2V0QXBwSWQoKSB7CiAgICByZXR1cm4gJHRoaXMtPmFwcElkOwogIH0KCiAgLyoqCiAgICogU2V0IHRoZSBBUEkgU2VjcmV0LgogICAqCiAgICogQHBhcmFtIFN0cmluZyAkYXBwSWQgdGhlIEFQSSBTZWNyZXQKICAgKi8KICBwdWJsaWMgZnVuY3Rpb24gc2V0QXBpU2VjcmV0KCRhcGlTZWNyZXQpIHsKICAgICR0aGlzLT5hcGlTZWNyZXQgPSAkYXBpU2VjcmV0OwogICAgcmV0dXJuICR0aGlzOwogIH0KCiAgLyoqCiAgICogR2V0IHRoZSBBUEkgU2VjcmV0LgogICAqCiAgICogQHJldHVybiBTdHJpbmcgdGhlIEFQSSBTZWNyZXQKICAgKi8KICBwdWJsaWMgZnVuY3Rpb24gZ2V0QXBpU2VjcmV0KCkgewogICAgcmV0dXJuICR0aGlzLT5hcGlTZWNyZXQ7CiAgfQoKICAvKioKICAgKiBTZXQgdGhlIENvb2tpZSBTdXBwb3J0IHN0YXR1cy4KICAgKgogICAqIEBwYXJhbSBCb29sZWFuICRjb29raWVTdXBwb3J0IHRoZSBDb29raWUgU3VwcG9ydCBzdGF0dXMKICAgKi8KICBwdWJsaWMgZnVuY3Rpb24gc2V0Q29va2llU3VwcG9ydCgkY29va2llU3VwcG9ydCkgewogICAgJHRoaXMtPmNvb2tpZVN1cHBvcnQgPSAkY29va2llU3VwcG9ydDsKICAgIHJldHVybiAkdGhpczsKICB9CgogIC8qKgogICAqIEdldCB0aGUgQ29va2llIFN1cHBvcnQgc3RhdHVzLgogICAqCiAgICogQHJldHVybiBCb29sZWFuIHRoZSBDb29raWUgU3VwcG9ydCBzdGF0dXMKICAgKi8KICBwdWJsaWMgZnVuY3Rpb24gdXNlQ29va2llU3VwcG9ydCgpIHsKICAgIHJldHVybiAkdGhpcy0+Y29va2llU3VwcG9ydDsKICB9CgogIC8qKgogICAqIFNldCB0aGUgYmFzZSBkb21haW4gZm9yIHRoZSBDb29raWUuCiAgICoKICAgKiBAcGFyYW0gU3RyaW5nICRkb21haW4gdGhlIGJhc2UgZG9tYWluCiAgICovCiAgcHVibGljIGZ1bmN0aW9uIHNldEJhc2VEb21haW4oJGRvbWFpbikgewogICAgJHRoaXMtPmJhc2VEb21haW4gPSAkZG9tYWluOwogICAgcmV0dXJuICR0aGlzOwogIH0KCiAgLyoqCiAgICogR2V0IHRoZSBiYXNlIGRvbWFpbiBmb3IgdGhlIENvb2tpZS4KICAgKgogICAqIEByZXR1cm4gU3RyaW5nIHRoZSBiYXNlIGRvbWFpbgogICAqLwogIHB1YmxpYyBmdW5jdGlvbiBnZXRCYXNlRG9tYWluKCkgewogICAgcmV0dXJuICR0aGlzLT5iYXNlRG9tYWluOwogIH0KCiAgLyoqCiAgICogU2V0IHRoZSBmaWxlIHVwbG9hZCBzdXBwb3J0IHN0YXR1cy4KICAgKgogICAqIEBwYXJhbSBTdHJpbmcgJGRvbWFpbiB0aGUgYmFzZSBkb21haW4KICAgKi8KICBwdWJsaWMgZnVuY3Rpb24gc2V0RmlsZVVwbG9hZFN1cHBvcnQoJGZpbGVVcGxvYWRTdXBwb3J0KSB7CiAgICAkdGhpcy0+ZmlsZVVwbG9hZFN1cHBvcnQgPSAkZmlsZVVwbG9hZFN1cHBvcnQ7CiAgICByZXR1cm4gJHRoaXM7CiAgfQoKICAvKioKICAgKiBHZXQgdGhlIGZpbGUgdXBsb2FkIHN1cHBvcnQgc3RhdHVzLgogICAqCiAgICogQHJldHVybiBTdHJpbmcgdGhlIGJhc2UgZG9tYWluCiAgICovCiAgcHVibGljIGZ1bmN0aW9uIHVzZUZpbGVVcGxvYWRTdXBwb3J0KCkgewogICAgcmV0dXJuICR0aGlzLT5maWxlVXBsb2FkU3VwcG9ydDsKICB9CgogIC8qKgogICAqIEdldCB0aGUgZGF0YSBmcm9tIGEgc2lnbmVkX3JlcXVlc3QgdG9rZW4KICAgKgogICAqIEByZXR1cm4gU3RyaW5nIHRoZSBiYXNlIGRvbWFpbgogICAqLwogIHB1YmxpYyBmdW5jdGlvbiBnZXRTaWduZWRSZXF1ZXN0KCkgewogICAgaWYgKCEkdGhpcy0+c2lnbmVkUmVxdWVzdCkgewogICAgICBpZiAoaXNzZXQoJF9SRVFVRVNUWydzaWduZWRfcmVxdWVzdCddKSkgewogICAgICAgICR0aGlzLT5zaWduZWRSZXF1ZXN0ID0gJHRoaXMtPnBhcnNlU2lnbmVkUmVxdWVzdCgKICAgICAgICAgICRfUkVRVUVTVFsnc2lnbmVkX3JlcXVlc3QnXSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiAkdGhpcy0+c2lnbmVkUmVxdWVzdDsKICB9CgogIC8qKgogICAqIFNldCB0aGUgU2Vzc2lvbi4KICAgKgogICAqIEBwYXJhbSBBcnJheSAkc2Vzc2lvbiB0aGUgc2Vzc2lvbgogICAqIEBwYXJhbSBCb29sZWFuICR3cml0ZV9jb29raWUgaW5kaWNhdGUgaWYgYSBjb29raWUgc2hvdWxkIGJlIHdyaXR0ZW4uIHRoaXMKICAgKiB2YWx1ZSBpcyBpZ25vcmVkIGlmIGNvb2tpZSBzdXBwb3J0IGhhcyBiZWVuIGRpc2FibGVkLgogICAqLwogIHB1YmxpYyBmdW5jdGlvbiBzZXRTZXNzaW9uKCRzZXNzaW9uPW51bGwsICR3cml0ZV9jb29raWU9dHJ1ZSkgewogICAgJHNlc3Npb24gPSAkdGhpcy0+dmFsaWRhdGVTZXNzaW9uT2JqZWN0KCRzZXNzaW9uKTsKICAgICR0aGlzLT5zZXNzaW9uTG9hZGVkID0gdHJ1ZTsKICAgICR0aGlzLT5zZXNzaW9uID0gJHNlc3Npb247CiAgICBpZiAoJHdyaXRlX2Nvb2tpZSkgewogICAgICAkdGhpcy0+c2V0Q29va2llRnJvbVNlc3Npb24oJHNlc3Npb24pOwogICAgfQogICAgcmV0dXJuICR0aGlzOwogIH0KCiAgLyoqCiAgICogR2V0IHRoZSBzZXNzaW9uIG9iamVjdC4gVGhpcyB3aWxsIGF1dG9tYXRpY2FsbHkgbG9vayBmb3IgYSBzaWduZWQgc2Vzc2lvbgogICAqIHNlbnQgdmlhIHRoZSBzaWduZWRfcmVxdWVzdCwgQ29va2llIG9yIFF1ZXJ5IFBhcmFtZXRlcnMgaWYgbmVlZGVkLgogICAqCiAgICogQHJldHVybiBBcnJheSB0aGUgc2Vzc2lvbgogICAqLwogIHB1YmxpYyBmdW5jdGlvbiBnZXRTZXNzaW9uKCkgewogICAgaWYgKCEkdGhpcy0+c2Vzc2lvbkxvYWRlZCkgewogICAgICAkc2Vzc2lvbiA9IG51bGw7CiAgICAgICR3cml0ZV9jb29raWUgPSB0cnVlOwoKICAgICAgLy8gdHJ5IGxvYWRpbmcgc2Vzc2lvbiBmcm9tIHNpZ25lZF9yZXF1ZXN0IGluICRfUkVRVUVTVAogICAgICAkc2lnbmVkUmVxdWVzdCA9ICR0aGlzLT5nZXRTaWduZWRSZXF1ZXN0KCk7CiAgICAgIGlmICgkc2lnbmVkUmVxdWVzdCkgewogICAgICAgIC8vIHNpZyBpcyBnb29kLCB1c2UgdGhlIHNpZ25lZFJlcXVlc3QKICAgICAgICAkc2Vzc2lvbiA9ICR0aGlzLT5jcmVhdGVTZXNzaW9uRnJvbVNpZ25lZFJlcXVlc3QoJHNpZ25lZFJlcXVlc3QpOwogICAgICB9CgogICAgICAvLyB0cnkgbG9hZGluZyBzZXNzaW9uIGZyb20gJF9SRVFVRVNUCiAgICAgIGlmICghJHNlc3Npb24gJiYgaXNzZXQoJF9SRVFVRVNUWydzZXNzaW9uJ10pKSB7CiAgICAgICAgJHNlc3Npb24gPSBqc29uX2RlY29kZSgKICAgICAgICAgIGdldF9tYWdpY19xdW90ZXNfZ3BjKCkKICAgICAgICAgICAgPyBzdHJpcHNsYXNoZXMoJF9SRVFVRVNUWydzZXNzaW9uJ10pCiAgICAgICAgICAgIDogJF9SRVFVRVNUWydzZXNzaW9uJ10sCiAgICAgICAgICB0cnVlCiAgICAgICAgKTsKICAgICAgICAkc2Vzc2lvbiA9ICR0aGlzLT52YWxpZGF0ZVNlc3Npb25PYmplY3QoJHNlc3Npb24pOwogICAgICB9CgogICAgICAvLyB0cnkgbG9hZGluZyBzZXNzaW9uIGZyb20gY29va2llIGlmIG5lY2Vzc2FyeQogICAgICBpZiAoISRzZXNzaW9uICYmICR0aGlzLT51c2VDb29raWVTdXBwb3J0KCkpIHsKICAgICAgICAkY29va2llTmFtZSA9ICR0aGlzLT5nZXRTZXNzaW9uQ29va2llTmFtZSgpOwogICAgICAgIGlmIChpc3NldCgkX0NPT0tJRVskY29va2llTmFtZV0pKSB7CiAgICAgICAgICAkc2Vzc2lvbiA9IGFycmF5KCk7CiAgICAgICAgICBwYXJzZV9zdHIodHJpbSgKICAgICAgICAgICAgZ2V0X21hZ2ljX3F1b3Rlc19ncGMoKQogICAgICAgICAgICAgID8gc3RyaXBzbGFzaGVzKCRfQ09PS0lFWyRjb29raWVOYW1lXSkKICAgICAgICAgICAgICA6ICRfQ09PS0lFWyRjb29raWVOYW1lXSwKICAgICAgICAgICAgJyInCiAgICAgICAgICApLCAkc2Vzc2lvbik7CiAgICAgICAgICAkc2Vzc2lvbiA9ICR0aGlzLT52YWxpZGF0ZVNlc3Npb25PYmplY3QoJHNlc3Npb24pOwogICAgICAgICAgLy8gd3JpdGUgb25seSBpZiB3ZSBuZWVkIHRvIGRlbGV0ZSBhIGludmFsaWQgc2Vzc2lvbiBjb29raWUKICAgICAgICAgICR3cml0ZV9jb29raWUgPSBlbXB0eSgkc2Vzc2lvbik7CiAgICAgICAgfQogICAgICB9CgogICAgICAkdGhpcy0+c2V0U2Vzc2lvbigkc2Vzc2lvbiwgJHdyaXRlX2Nvb2tpZSk7CiAgICB9CgogICAgcmV0dXJuICR0aGlzLT5zZXNzaW9uOwogIH0KCiAgLyoqCiAgICogR2V0IHRoZSBVSUQgZnJvbSB0aGUgc2Vzc2lvbi4KICAgKgogICAqIEByZXR1cm4gU3RyaW5nIHRoZSBVSUQgaWYgYXZhaWxhYmxlCiAgICovCiAgcHVibGljIGZ1bmN0aW9uIGdldFVzZXIoKSB7CiAgICAkc2Vzc2lvbiA9ICR0aGlzLT5nZXRTZXNzaW9uKCk7CiAgICByZXR1cm4gJHNlc3Npb24gPyAkc2Vzc2lvblsndWlkJ10gOiBudWxsOwogIH0KCiAgLyoqCiAgICogR2V0cyBhIE9BdXRoIGFjY2VzcyB0b2tlbi4KICAgKgogICAqIEByZXR1cm4gU3RyaW5nIHRoZSBhY2Nlc3MgdG9rZW4KICAgKi8KICBwdWJsaWMgZnVuY3Rpb24gZ2V0QWNjZXNzVG9rZW4oKSB7CiAgICAkc2Vzc2lvbiA9ICR0aGlzLT5nZXRTZXNzaW9uKCk7CiAgICAvLyBlaXRoZXIgdXNlciBzZXNzaW9uIHNpZ25lZCwgb3IgYXBwIHNpZ25lZAogICAgaWYgKCRzZXNzaW9uKSB7CiAgICAgIHJldHVybiAkc2Vzc2lvblsnYWNjZXNzX3Rva2VuJ107CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gJHRoaXMtPmdldEFwcElkKCkgLid8Jy4gJHRoaXMtPmdldEFwaVNlY3JldCgpOwogICAgfQogIH0KCiAgLyoqCiAgICogR2V0IGEgTG9naW4gVVJMIGZvciB1c2Ugd2l0aCByZWRpcmVjdHMuIEJ5IGRlZmF1bHQsIGZ1bGwgcGFnZSByZWRpcmVjdCBpcwogICAqIGFzc3VtZWQuIElmIHlvdSBhcmUgdXNpbmcgdGhlIGdlbmVyYXRlZCBVUkwgd2l0aCBhIHdpbmRvdy5vcGVuKCkgY2FsbCBpbgogICAqIEphdmFTY3JpcHQsIHlvdSBjYW4gcGFzcyBpbiBkaXNwbGF5PXBvcHVwIGFzIHBhcnQgb2YgdGhlICRwYXJhbXMuCiAgICoKICAgKiBUaGUgcGFyYW1ldGVyczoKICAgKiAtIG5leHQ6IHRoZSB1cmwgdG8gZ28gdG8gYWZ0ZXIgYSBzdWNjZXNzZnVsIGxvZ2luCiAgICogLSBjYW5jZWxfdXJsOiB0aGUgdXJsIHRvIGdvIHRvIGFmdGVyIHRoZSB1c2VyIGNhbmNlbHMKICAgKiAtIHJlcV9wZXJtczogY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgcmVxdWVzdGVkIGV4dGVuZGVkIHBlcm1zCiAgICogLSBkaXNwbGF5OiBjYW4gYmUgInBhZ2UiIChkZWZhdWx0LCBmdWxsIHBhZ2UpIG9yICJwb3B1cCIKICAgKgogICAqIEBwYXJhbSBBcnJheSAkcGFyYW1zIHByb3ZpZGUgY3VzdG9tIHBhcmFtZXRlcnMKICAgKiBAcmV0dXJuIFN0cmluZyB0aGUgVVJMIGZvciB0aGUgbG9naW4gZmxvdwogICAqLwogIHB1YmxpYyBmdW5jdGlvbiBnZXRMb2dpblVybCgkcGFyYW1zPWFycmF5KCkpIHsKICAgICRjdXJyZW50VXJsID0gJHRoaXMtPmdldEN1cnJlbnRVcmwoKTsKICAgIHJldHVybiAkdGhpcy0+Z2V0VXJsKAogICAgICAnd3d3JywKICAgICAgJ2xvZ2luLnBocCcsCiAgICAgIGFycmF5X21lcmdlKGFycmF5KAogICAgICAgICdhcGlfa2V5JyAgICAgICAgID0+ICR0aGlzLT5nZXRBcHBJZCgpLAogICAgICAgICdjYW5jZWxfdXJsJyAgICAgID0+ICRjdXJyZW50VXJsLAogICAgICAgICdkaXNwbGF5JyAgICAgICAgID0+ICdwYWdlJywKICAgICAgICAnZmJjb25uZWN0JyAgICAgICA9PiAxLAogICAgICAgICduZXh0JyAgICAgICAgICAgID0+ICRjdXJyZW50VXJsLAogICAgICAgICdyZXR1cm5fc2Vzc2lvbicgID0+IDEsCiAgICAgICAgJ3Nlc3Npb25fdmVyc2lvbicgPT4gMywKICAgICAgICAndicgICAgICAgICAgICAgICA9PiAnMS4wJywKICAgICAgKSwgJHBhcmFtcykKICAgICk7CiAgfQoKICAvKioKICAgKiBHZXQgYSBMb2dvdXQgVVJMIHN1aXRhYmxlIGZvciB1c2Ugd2l0aCByZWRpcmVjdHMuCiAgICoKICAgKiBUaGUgcGFyYW1ldGVyczoKICAgKiAtIG5leHQ6IHRoZSB1cmwgdG8gZ28gdG8gYWZ0ZXIgYSBzdWNjZXNzZnVsIGxvZ291dAogICAqCiAgICogQHBhcmFtIEFycmF5ICRwYXJhbXMgcHJvdmlkZSBjdXN0b20gcGFyYW1ldGVycwogICAqIEByZXR1cm4gU3RyaW5nIHRoZSBVUkwgZm9yIHRoZSBsb2dvdXQgZmxvdwogICAqLwogIHB1YmxpYyBmdW5jdGlvbiBnZXRMb2dvdXRVcmwoJHBhcmFtcz1hcnJheSgpKSB7CiAgICByZXR1cm4gJHRoaXMtPmdldFVybCgKICAgICAgJ3d3dycsCiAgICAgICdsb2dvdXQucGhwJywKICAgICAgYXJyYXlfbWVyZ2UoYXJyYXkoCiAgICAgICAgJ25leHQnICAgICAgICAgPT4gJHRoaXMtPmdldEN1cnJlbnRVcmwoKSwKICAgICAgICAnYWNjZXNzX3Rva2VuJyA9PiAkdGhpcy0+Z2V0QWNjZXNzVG9rZW4oKSwKICAgICAgKSwgJHBhcmFtcykKICAgICk7CiAgfQoKICAvKioKICAgKiBHZXQgYSBsb2dpbiBzdGF0dXMgVVJMIHRvIGZldGNoIHRoZSBzdGF0dXMgZnJvbSBmYWNlYm9vay4KICAgKgogICAqIFRoZSBwYXJhbWV0ZXJzOgogICAqIC0gb2tfc2Vzc2lvbjogdGhlIFVSTCB0byBnbyB0byBpZiBhIHNlc3Npb24gaXMgZm91bmQKICAgKiAtIG5vX3Nlc3Npb246IHRoZSBVUkwgdG8gZ28gdG8gaWYgdGhlIHVzZXIgaXMgbm90IGNvbm5lY3RlZAogICAqIC0gbm9fdXNlcjogdGhlIFVSTCB0byBnbyB0byBpZiB0aGUgdXNlciBpcyBub3Qgc2lnbmVkIGludG8gZmFjZWJvb2sKICAgKgogICAqIEBwYXJhbSBBcnJheSAkcGFyYW1zIHByb3ZpZGUgY3VzdG9tIHBhcmFtZXRlcnMKICAgKiBAcmV0dXJuIFN0cmluZyB0aGUgVVJMIGZvciB0aGUgbG9nb3V0IGZsb3cKICAgKi8KICBwdWJsaWMgZnVuY3Rpb24gZ2V0TG9naW5TdGF0dXNVcmwoJHBhcmFtcz1hcnJheSgpKSB7CiAgICByZXR1cm4gJHRoaXMtPmdldFVybCgKICAgICAgJ3d3dycsCiAgICAgICdleHRlcm4vbG9naW5fc3RhdHVzLnBocCcsCiAgICAgIGFycmF5X21lcmdlKGFycmF5KAogICAgICAgICdhcGlfa2V5JyAgICAgICAgID0+ICR0aGlzLT5nZXRBcHBJZCgpLAogICAgICAgICdub19zZXNzaW9uJyAgICAgID0+ICR0aGlzLT5nZXRDdXJyZW50VXJsKCksCiAgICAgICAgJ25vX3VzZXInICAgICAgICAgPT4gJHRoaXMtPmdldEN1cnJlbnRVcmwoKSwKICAgICAgICAnb2tfc2Vzc2lvbicgICAgICA9PiAkdGhpcy0+Z2V0Q3VycmVudFVybCgpLAogICAgICAgICdzZXNzaW9uX3ZlcnNpb24nID0+IDMsCiAgICAgICksICRwYXJhbXMpCiAgICApOwogIH0KCiAgLyoqCiAgICogTWFrZSBhbiBBUEkgY2FsbC4KICAgKgogICAqIEBwYXJhbSBBcnJheSAkcGFyYW1zIHRoZSBBUEkgY2FsbCBwYXJhbWV0ZXJzCiAgICogQHJldHVybiB0aGUgZGVjb2RlZCByZXNwb25zZQogICAqLwogIHB1YmxpYyBmdW5jdGlvbiBhcGkoLyogcG9seW1vcnBoaWMgKi8pIHsKICAgICRhcmdzID0gZnVuY19nZXRfYXJncygpOwogICAgaWYgKGlzX2FycmF5KCRhcmdzWzBdKSkgewogICAgICByZXR1cm4gJHRoaXMtPl9yZXN0c2VydmVyKCRhcmdzWzBdKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBjYWxsX3VzZXJfZnVuY19hcnJheShhcnJheSgkdGhpcywgJ19ncmFwaCcpLCAkYXJncyk7CiAgICB9CiAgfQoKICAvKioKICAgKiBJbnZva2UgdGhlIG9sZCByZXN0c2VydmVyLnBocCBlbmRwb2ludC4KICAgKgogICAqIEBwYXJhbSBBcnJheSAkcGFyYW1zIG1ldGhvZCBjYWxsIG9iamVjdAogICAqIEByZXR1cm4gdGhlIGRlY29kZWQgcmVzcG9uc2Ugb2JqZWN0CiAgICogQHRocm93cyBGYWNlYm9va0FwaUV4Y2VwdGlvbgogICAqLwogIHByb3RlY3RlZCBmdW5jdGlvbiBfcmVzdHNlcnZlcigkcGFyYW1zKSB7CiAgICAvLyBnZW5lcmljIGFwcGxpY2F0aW9uIGxldmVsIHBhcmFtZXRlcnMKICAgICRwYXJhbXNbJ2FwaV9rZXknXSA9ICR0aGlzLT5nZXRBcHBJZCgpOwogICAgJHBhcmFtc1snZm9ybWF0J10gPSAnanNvbi1zdHJpbmdzJzsKCiAgICAkcmVzdWx0ID0ganNvbl9kZWNvZGUoJHRoaXMtPl9vYXV0aFJlcXVlc3QoCiAgICAgICR0aGlzLT5nZXRBcGlVcmwoJHBhcmFtc1snbWV0aG9kJ10pLAogICAgICAkcGFyYW1zCiAgICApLCB0cnVlKTsKCiAgICAvLyByZXN1bHRzIGFyZSByZXR1cm5lZCwgZXJyb3JzIGFyZSB0aHJvd24KICAgIGlmIChpc19hcnJheSgkcmVzdWx0KSAmJiBpc3NldCgkcmVzdWx0WydlcnJvcl9jb2RlJ10pKSB7CiAgICAgIHRocm93IG5ldyBGYWNlYm9va0FwaUV4Y2VwdGlvbigkcmVzdWx0KTsKICAgIH0KICAgIHJldHVybiAkcmVzdWx0OwogIH0KCiAgLyoqCiAgICogSW52b2tlIHRoZSBHcmFwaCBBUEkuCiAgICoKICAgKiBAcGFyYW0gU3RyaW5nICRwYXRoIHRoZSBwYXRoIChyZXF1aXJlZCkKICAgKiBAcGFyYW0gU3RyaW5nICRtZXRob2QgdGhlIGh0dHAgbWV0aG9kIChkZWZhdWx0ICdHRVQnKQogICAqIEBwYXJhbSBBcnJheSAkcGFyYW1zIHRoZSBxdWVyeS9wb3N0IGRhdGEKICAgKiBAcmV0dXJuIHRoZSBkZWNvZGVkIHJlc3BvbnNlIG9iamVjdAogICAqIEB0aHJvd3MgRmFjZWJvb2tBcGlFeGNlcHRpb24KICAgKi8KICBwcm90ZWN0ZWQgZnVuY3Rpb24gX2dyYXBoKCRwYXRoLCAkbWV0aG9kPSdHRVQnLCAkcGFyYW1zPWFycmF5KCkpIHsKICAgIGlmIChpc19hcnJheSgkbWV0aG9kKSAmJiBlbXB0eSgkcGFyYW1zKSkgewogICAgICAkcGFyYW1zID0gJG1ldGhvZDsKICAgICAgJG1ldGhvZCA9ICdHRVQnOwogICAgfQogICAgJHBhcmFtc1snbWV0aG9kJ10gPSAkbWV0aG9kOyAvLyBtZXRob2Qgb3ZlcnJpZGUgYXMgd2UgYWx3YXlzIGRvIGEgUE9TVAoKICAgICRyZXN1bHQgPSBqc29uX2RlY29kZSgkdGhpcy0+X29hdXRoUmVxdWVzdCgKICAgICAgJHRoaXMtPmdldFVybCgnZ3JhcGgnLCAkcGF0aCksCiAgICAgICRwYXJhbXMKICAgICksIHRydWUpOwoKICAgIC8vIHJlc3VsdHMgYXJlIHJldHVybmVkLCBlcnJvcnMgYXJlIHRocm93bgogICAgaWYgKGlzX2FycmF5KCRyZXN1bHQpICYmIGlzc2V0KCRyZXN1bHRbJ2Vycm9yJ10pKSB7CiAgICAgICRlID0gbmV3IEZhY2Vib29rQXBpRXhjZXB0aW9uKCRyZXN1bHQpOwogICAgICBzd2l0Y2ggKCRlLT5nZXRUeXBlKCkpIHsKICAgICAgICAvLyBPQXV0aCAyLjAgRHJhZnQgMDAgc3R5bGUKICAgICAgICBjYXNlICdPQXV0aEV4Y2VwdGlvbic6CiAgICAgICAgLy8gT0F1dGggMi4wIERyYWZ0IDEwIHN0eWxlCiAgICAgICAgY2FzZSAnaW52YWxpZF90b2tlbic6CiAgICAgICAgICAkdGhpcy0+c2V0U2Vzc2lvbihudWxsKTsKICAgICAgfQogICAgICB0aHJvdyAkZTsKICAgIH0KICAgIHJldHVybiAkcmVzdWx0OwogIH0KCiAgLyoqCiAgICogTWFrZSBhIE9BdXRoIFJlcXVlc3QKICAgKgogICAqIEBwYXJhbSBTdHJpbmcgJHBhdGggdGhlIHBhdGggKHJlcXVpcmVkKQogICAqIEBwYXJhbSBBcnJheSAkcGFyYW1zIHRoZSBxdWVyeS9wb3N0IGRhdGEKICAgKiBAcmV0dXJuIHRoZSBkZWNvZGVkIHJlc3BvbnNlIG9iamVjdAogICAqIEB0aHJvd3MgRmFjZWJvb2tBcGlFeGNlcHRpb24KICAgKi8KICBwcm90ZWN0ZWQgZnVuY3Rpb24gX29hdXRoUmVxdWVzdCgkdXJsLCAkcGFyYW1zKSB7CiAgICBpZiAoIWlzc2V0KCRwYXJhbXNbJ2FjY2Vzc190b2tlbiddKSkgewogICAgICAkcGFyYW1zWydhY2Nlc3NfdG9rZW4nXSA9ICR0aGlzLT5nZXRBY2Nlc3NUb2tlbigpOwogICAgfQoKICAgIC8vIGpzb25fZW5jb2RlIGFsbCBwYXJhbXMgdmFsdWVzIHRoYXQgYXJlIG5vdCBzdHJpbmdzCiAgICBmb3JlYWNoICgkcGFyYW1zIGFzICRrZXkgPT4gJHZhbHVlKSB7CiAgICAgIGlmICghaXNfc3RyaW5nKCR2YWx1ZSkpIHsKICAgICAgICAkcGFyYW1zWyRrZXldID0ganNvbl9lbmNvZGUoJHZhbHVlKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuICR0aGlzLT5tYWtlUmVxdWVzdCgkdXJsLCAkcGFyYW1zKTsKICB9CgogIC8qKgogICAqIE1ha2VzIGFuIEhUVFAgcmVxdWVzdC4gVGhpcyBtZXRob2QgY2FuIGJlIG92ZXJyaWRlbiBieSBzdWJjbGFzc2VzIGlmCiAgICogZGV2ZWxvcGVycyB3YW50IHRvIGRvIGZhbmNpZXIgdGhpbmdzIG9yIHVzZSBzb21ldGhpbmcgb3RoZXIgdGhhbiBjdXJsIHRvCiAgICogbWFrZSB0aGUgcmVxdWVzdC4KICAgKgogICAqIEBwYXJhbSBTdHJpbmcgJHVybCB0aGUgVVJMIHRvIG1ha2UgdGhlIHJlcXVlc3QgdG8KICAgKiBAcGFyYW0gQXJyYXkgJHBhcmFtcyB0aGUgcGFyYW1ldGVycyB0byB1c2UgZm9yIHRoZSBQT1NUIGJvZHkKICAgKiBAcGFyYW0gQ3VybEhhbmRsZXIgJGNoIG9wdGlvbmFsIGluaXRpYWxpemVkIGN1cmwgaGFuZGxlCiAgICogQHJldHVybiBTdHJpbmcgdGhlIHJlc3BvbnNlIHRleHQKICAgKi8KICBwcm90ZWN0ZWQgZnVuY3Rpb24gbWFrZVJlcXVlc3QoJHVybCwgJHBhcmFtcywgJGNoPW51bGwpIHsKICAgIGlmICghJGNoKSB7CiAgICAgICRjaCA9IGN1cmxfaW5pdCgpOwogICAgfQoKICAgICRvcHRzID0gc2VsZjo6JENVUkxfT1BUUzsKICAgIGlmICgkdGhpcy0+dXNlRmlsZVVwbG9hZFN1cHBvcnQoKSkgewogICAgICAkb3B0c1tDVVJMT1BUX1BPU1RGSUVMRFNdID0gJHBhcmFtczsKICAgIH0gZWxzZSB7CiAgICAgICRvcHRzW0NVUkxPUFRfUE9TVEZJRUxEU10gPSBodHRwX2J1aWxkX3F1ZXJ5KCRwYXJhbXMsIG51bGwsICcmJyk7CiAgICB9CiAgICAkb3B0c1tDVVJMT1BUX1VSTF0gPSAkdXJsOwoKICAgIC8vIGRpc2FibGUgdGhlICdFeHBlY3Q6IDEwMC1jb250aW51ZScgYmVoYXZpb3VyLiBUaGlzIGNhdXNlcyBDVVJMIHRvIHdhaXQKICAgIC8vIGZvciAyIHNlY29uZHMgaWYgdGhlIHNlcnZlciBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgaGVhZGVyLgogICAgaWYgKGlzc2V0KCRvcHRzW0NVUkxPUFRfSFRUUEhFQURFUl0pKSB7CiAgICAgICRleGlzdGluZ19oZWFkZXJzID0gJG9wdHNbQ1VSTE9QVF9IVFRQSEVBREVSXTsKICAgICAgJGV4aXN0aW5nX2hlYWRlcnNbXSA9ICdFeHBlY3Q6JzsKICAgICAgJG9wdHNbQ1VSTE9QVF9IVFRQSEVBREVSXSA9ICRleGlzdGluZ19oZWFkZXJzOwogICAgfSBlbHNlIHsKICAgICAgJG9wdHNbQ1VSTE9QVF9IVFRQSEVBREVSXSA9IGFycmF5KCdFeHBlY3Q6Jyk7CiAgICB9CgogICAgY3VybF9zZXRvcHRfYXJyYXkoJGNoLCAkb3B0cyk7CiAgICAkcmVzdWx0ID0gY3VybF9leGVjKCRjaCk7CiAgICBpZiAoJHJlc3VsdCA9PT0gZmFsc2UpIHsKICAgICAgJGUgPSBuZXcgRmFjZWJvb2tBcGlFeGNlcHRpb24oYXJyYXkoCiAgICAgICAgJ2Vycm9yX2NvZGUnID0+IGN1cmxfZXJybm8oJGNoKSwKICAgICAgICAnZXJyb3InICAgICAgPT4gYXJyYXkoCiAgICAgICAgICAnbWVzc2FnZScgPT4gY3VybF9lcnJvcigkY2gpLAogICAgICAgICAgJ3R5cGUnICAgID0+ICdDdXJsRXhjZXB0aW9uJywKICAgICAgICApLAogICAgICApKTsKICAgICAgY3VybF9jbG9zZSgkY2gpOwogICAgICB0aHJvdyAkZTsKICAgIH0KICAgIGN1cmxfY2xvc2UoJGNoKTsKICAgIHJldHVybiAkcmVzdWx0OwogIH0KCiAgLyoqCiAgICogVGhlIG5hbWUgb2YgdGhlIENvb2tpZSB0aGF0IGNvbnRhaW5zIHRoZSBzZXNzaW9uLgogICAqCiAgICogQHJldHVybiBTdHJpbmcgdGhlIGNvb2tpZSBuYW1lCiAgICovCiAgcHJvdGVjdGVkIGZ1bmN0aW9uIGdldFNlc3Npb25Db29raWVOYW1lKCkgewogICAgcmV0dXJuICdmYnNfJyAuICR0aGlzLT5nZXRBcHBJZCgpOwogIH0KCiAgLyoqCiAgICogU2V0IGEgSlMgQ29va2llIGJhc2VkIG9uIHRoZSBfcGFzc2VkIGluXyBzZXNzaW9uLiBJdCBkb2VzIG5vdCB1c2UgdGhlCiAgICogY3VycmVudGx5IHN0b3JlZCBzZXNzaW9uIC0tIHlvdSBuZWVkIHRvIGV4cGxpY2l0bHkgcGFzcyBpdCBpbi4KICAgKgogICAqIEBwYXJhbSBBcnJheSAkc2Vzc2lvbiB0aGUgc2Vzc2lvbiB0byB1c2UgZm9yIHNldHRpbmcgdGhlIGNvb2tpZQogICAqLwogIHByb3RlY3RlZCBmdW5jdGlvbiBzZXRDb29raWVGcm9tU2Vzc2lvbigkc2Vzc2lvbj1udWxsKSB7CiAgICBpZiAoISR0aGlzLT51c2VDb29raWVTdXBwb3J0KCkpIHsKICAgICAgcmV0dXJuOwogICAgfQoKICAgICRjb29raWVOYW1lID0gJHRoaXMtPmdldFNlc3Npb25Db29raWVOYW1lKCk7CiAgICAkdmFsdWUgPSAnZGVsZXRlZCc7CiAgICAkZXhwaXJlcyA9IHRpbWUoKSAtIDM2MDA7CiAgICAkZG9tYWluID0gJHRoaXMtPmdldEJhc2VEb21haW4oKTsKICAgIGlmICgkc2Vzc2lvbikgewogICAgICAkdmFsdWUgPSAnIicgLiBodHRwX2J1aWxkX3F1ZXJ5KCRzZXNzaW9uLCBudWxsLCAnJicpIC4gJyInOwogICAgICBpZiAoaXNzZXQoJHNlc3Npb25bJ2Jhc2VfZG9tYWluJ10pKSB7CiAgICAgICAgJGRvbWFpbiA9ICRzZXNzaW9uWydiYXNlX2RvbWFpbiddOwogICAgICB9CiAgICAgICRleHBpcmVzID0gJHNlc3Npb25bJ2V4cGlyZXMnXTsKICAgIH0KCiAgICAvLyBwcmVwZW5kIGRvdCBpZiBhIGRvbWFpbiBpcyBmb3VuZAogICAgaWYgKCRkb21haW4pIHsKICAgICAgJGRvbWFpbiA9ICcuJyAuICRkb21haW47CiAgICB9CgogICAgLy8gaWYgYW4gZXhpc3RpbmcgY29va2llIGlzIG5vdCBzZXQsIHdlIGRvbnQgbmVlZCB0byBkZWxldGUgaXQKICAgIGlmICgkdmFsdWUgPT0gJ2RlbGV0ZWQnICYmIGVtcHR5KCRfQ09PS0lFWyRjb29raWVOYW1lXSkpIHsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIGlmIChoZWFkZXJzX3NlbnQoKSkgewogICAgICBzZWxmOjplcnJvckxvZygnQ291bGQgbm90IHNldCBjb29raWUuIEhlYWRlcnMgYWxyZWFkeSBzZW50LicpOwoKICAgIC8vIGlnbm9yZSBmb3IgY29kZSBjb3ZlcmFnZSBhcyB3ZSB3aWxsIG5ldmVyIGJlIGFibGUgdG8gc2V0Y29va2llIGluIGEgQ0xJCiAgICAvLyBlbnZpcm9ubWVudAogICAgLy8gQGNvZGVDb3ZlcmFnZUlnbm9yZVN0YXJ0CiAgICB9IGVsc2UgewogICAgICBzZXRjb29raWUoJGNvb2tpZU5hbWUsICR2YWx1ZSwgJGV4cGlyZXMsICcvJywgJGRvbWFpbik7CiAgICB9CiAgICAvLyBAY29kZUNvdmVyYWdlSWdub3JlRW5kCiAgfQoKICAvKioKICAgKiBWYWxpZGF0ZXMgYSBzZXNzaW9uX3ZlcnNpb249MyBzdHlsZSBzZXNzaW9uIG9iamVjdC4KICAgKgogICAqIEBwYXJhbSBBcnJheSAkc2Vzc2lvbiB0aGUgc2Vzc2lvbiBvYmplY3QKICAgKiBAcmV0dXJuIEFycmF5IHRoZSBzZXNzaW9uIG9iamVjdCBpZiBpdCB2YWxpZGF0ZXMsIG51bGwgb3RoZXJ3aXNlCiAgICovCiAgcHJvdGVjdGVkIGZ1bmN0aW9uIHZhbGlkYXRlU2Vzc2lvbk9iamVjdCgkc2Vzc2lvbikgewogICAgLy8gbWFrZSBzdXJlIHNvbWUgZXNzZW50aWFsIGZpZWxkcyBleGlzdAogICAgaWYgKGlzX2FycmF5KCRzZXNzaW9uKSAmJgogICAgICAgIGlzc2V0KCRzZXNzaW9uWyd1aWQnXSkgJiYKICAgICAgICBpc3NldCgkc2Vzc2lvblsnYWNjZXNzX3Rva2VuJ10pICYmCiAgICAgICAgaXNzZXQoJHNlc3Npb25bJ3NpZyddKSkgewogICAgICAvLyB2YWxpZGF0ZSB0aGUgc2lnbmF0dXJlCiAgICAgICRzZXNzaW9uX3dpdGhvdXRfc2lnID0gJHNlc3Npb247CiAgICAgIHVuc2V0KCRzZXNzaW9uX3dpdGhvdXRfc2lnWydzaWcnXSk7CiAgICAgICRleHBlY3RlZF9zaWcgPSBzZWxmOjpnZW5lcmF0ZVNpZ25hdHVyZSgKICAgICAgICAkc2Vzc2lvbl93aXRob3V0X3NpZywKICAgICAgICAkdGhpcy0+Z2V0QXBpU2VjcmV0KCkKICAgICAgKTsKICAgICAgaWYgKCRzZXNzaW9uWydzaWcnXSAhPSAkZXhwZWN0ZWRfc2lnKSB7CiAgICAgICAgc2VsZjo6ZXJyb3JMb2coJ0dvdCBpbnZhbGlkIHNlc3Npb24gc2lnbmF0dXJlIGluIGNvb2tpZS4nKTsKICAgICAgICAkc2Vzc2lvbiA9IG51bGw7CiAgICAgIH0KICAgICAgLy8gY2hlY2sgZXhwaXJ5IHRpbWUKICAgIH0gZWxzZSB7CiAgICAgICRzZXNzaW9uID0gbnVsbDsKICAgIH0KICAgIHJldHVybiAkc2Vzc2lvbjsKICB9CgogIC8qKgogICAqIFJldHVybnMgc29tZXRoaW5nIHRoYXQgbG9va3MgbGlrZSBvdXIgSlMgc2Vzc2lvbiBvYmplY3QgZnJvbSB0aGUKICAgKiBzaWduZWQgdG9rZW4ncyBkYXRhCiAgICoKICAgKiBUT0RPOiBOdWtlIHRoaXMgb25jZSB0aGUgbG9naW4gZmxvdyB1c2VzIE9BdXRoMgogICAqCiAgICogQHBhcmFtIEFycmF5IHRoZSBvdXRwdXQgb2YgZ2V0U2lnbmVkUmVxdWVzdAogICAqIEByZXR1cm4gQXJyYXkgU29tZXRoaW5nIHRoYXQgd2lsbCB3b3JrIGFzIGEgc2Vzc2lvbgogICAqLwogIHByb3RlY3RlZCBmdW5jdGlvbiBjcmVhdGVTZXNzaW9uRnJvbVNpZ25lZFJlcXVlc3QoJGRhdGEpIHsKICAgIGlmICghaXNzZXQoJGRhdGFbJ29hdXRoX3Rva2VuJ10pKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgICRzZXNzaW9uID0gYXJyYXkoCiAgICAgICd1aWQnICAgICAgICAgID0+ICRkYXRhWyd1c2VyX2lkJ10sCiAgICAgICdhY2Nlc3NfdG9rZW4nID0+ICRkYXRhWydvYXV0aF90b2tlbiddLAogICAgICAnZXhwaXJlcycgICAgICA9PiAkZGF0YVsnZXhwaXJlcyddLAogICAgKTsKCiAgICAvLyBwdXQgYSByZWFsIHNpZywgc28gdGhhdCB2YWxpZGF0ZVNpZ25hdHVyZSB3b3JrcwogICAgJHNlc3Npb25bJ3NpZyddID0gc2VsZjo6Z2VuZXJhdGVTaWduYXR1cmUoCiAgICAgICRzZXNzaW9uLAogICAgICAkdGhpcy0+Z2V0QXBpU2VjcmV0KCkKICAgICk7CgogICAgcmV0dXJuICRzZXNzaW9uOwogIH0KCiAgLyoqCiAgICogUGFyc2VzIGEgc2lnbmVkX3JlcXVlc3QgYW5kIHZhbGlkYXRlcyB0aGUgc2lnbmF0dXJlLgogICAqIFRoZW4gc2F2ZXMgaXQgaW4gJHRoaXMtPnNpZ25lZF9kYXRhCiAgICoKICAgKiBAcGFyYW0gU3RyaW5nIEEgc2lnbmVkIHRva2VuCiAgICogQHBhcmFtIEJvb2xlYW4gU2hvdWxkIHdlIHJlbW92ZSB0aGUgcGFydHMgb2YgdGhlIHBheWxvYWQgdGhhdAogICAqICAgICAgICAgICAgICAgIGFyZSB1c2VkIGJ5IHRoZSBhbGdvcml0aG0/CiAgICogQHJldHVybiBBcnJheSB0aGUgcGF5bG9hZCBpbnNpZGUgaXQgb3IgbnVsbCBpZiB0aGUgc2lnIGlzIHdyb25nCiAgICovCiAgcHJvdGVjdGVkIGZ1bmN0aW9uIHBhcnNlU2lnbmVkUmVxdWVzdCgkc2lnbmVkX3JlcXVlc3QpIHsKICAgIGxpc3QoJGVuY29kZWRfc2lnLCAkcGF5bG9hZCkgPSBleHBsb2RlKCcuJywgJHNpZ25lZF9yZXF1ZXN0LCAyKTsKCiAgICAvLyBkZWNvZGUgdGhlIGRhdGEKICAgICRzaWcgPSBzZWxmOjpiYXNlNjRVcmxEZWNvZGUoJGVuY29kZWRfc2lnKTsKICAgICRkYXRhID0ganNvbl9kZWNvZGUoc2VsZjo6YmFzZTY0VXJsRGVjb2RlKCRwYXlsb2FkKSwgdHJ1ZSk7CgogICAgaWYgKHN0cnRvdXBwZXIoJGRhdGFbJ2FsZ29yaXRobSddKSAhPT0gJ0hNQUMtU0hBMjU2JykgewogICAgICBzZWxmOjplcnJvckxvZygnVW5rbm93biBhbGdvcml0aG0uIEV4cGVjdGVkIEhNQUMtU0hBMjU2Jyk7CiAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgIC8vIGNoZWNrIHNpZwogICAgJGV4cGVjdGVkX3NpZyA9IGhhc2hfaG1hYygnc2hhMjU2JywgJHBheWxvYWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5nZXRBcGlTZWNyZXQoKSwgJHJhdyA9IHRydWUpOwogICAgaWYgKCRzaWcgIT09ICRleHBlY3RlZF9zaWcpIHsKICAgICAgc2VsZjo6ZXJyb3JMb2coJ0JhZCBTaWduZWQgSlNPTiBzaWduYXR1cmUhJyk7CiAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgIHJldHVybiAkZGF0YTsKICB9CgogIC8qKgogICAqIEJ1aWxkIHRoZSBVUkwgZm9yIGFwaSBnaXZlbiBwYXJhbWV0ZXJzLgogICAqCiAgICogQHBhcmFtICRtZXRob2QgU3RyaW5nIHRoZSBtZXRob2QgbmFtZS4KICAgKiBAcmV0dXJuIFN0cmluZyB0aGUgVVJMIGZvciB0aGUgZ2l2ZW4gcGFyYW1ldGVycwogICAqLwogIHByb3RlY3RlZCBmdW5jdGlvbiBnZXRBcGlVcmwoJG1ldGhvZCkgewogICAgc3RhdGljICRSRUFEX09OTFlfQ0FMTFMgPQogICAgICBhcnJheSgnYWRtaW4uZ2V0YWxsb2NhdGlvbicgPT4gMSwKICAgICAgICAgICAgJ2FkbWluLmdldGFwcHByb3BlcnRpZXMnID0+IDEsCiAgICAgICAgICAgICdhZG1pbi5nZXRiYW5uZWR1c2VycycgPT4gMSwKICAgICAgICAgICAgJ2FkbWluLmdldGxpdmVzdHJlYW12aWFsaW5rJyA9PiAxLAogICAgICAgICAgICAnYWRtaW4uZ2V0bWV0cmljcycgPT4gMSwKICAgICAgICAgICAgJ2FkbWluLmdldHJlc3RyaWN0aW9uaW5mbycgPT4gMSwKICAgICAgICAgICAgJ2FwcGxpY2F0aW9uLmdldHB1YmxpY2luZm8nID0+IDEsCiAgICAgICAgICAgICdhdXRoLmdldGFwcHB1YmxpY2tleScgPT4gMSwKICAgICAgICAgICAgJ2F1dGguZ2V0c2Vzc2lvbicgPT4gMSwKICAgICAgICAgICAgJ2F1dGguZ2V0c2lnbmVkcHVibGljc2Vzc2lvbmRhdGEnID0+IDEsCiAgICAgICAgICAgICdjb21tZW50cy5nZXQnID0+IDEsCiAgICAgICAgICAgICdjb25uZWN0LmdldHVuY29ubmVjdGVkZnJpZW5kc2NvdW50JyA9PiAxLAogICAgICAgICAgICAnZGFzaGJvYXJkLmdldGFjdGl2aXR5JyA9PiAxLAogICAgICAgICAgICAnZGFzaGJvYXJkLmdldGNvdW50JyA9PiAxLAogICAgICAgICAgICAnZGFzaGJvYXJkLmdldGdsb2JhbG5ld3MnID0+IDEsCiAgICAgICAgICAgICdkYXNoYm9hcmQuZ2V0bmV3cycgPT4gMSwKICAgICAgICAgICAgJ2Rhc2hib2FyZC5tdWx0aWdldGNvdW50JyA9PiAxLAogICAgICAgICAgICAnZGFzaGJvYXJkLm11bHRpZ2V0bmV3cycgPT4gMSwKICAgICAgICAgICAgJ2RhdGEuZ2V0Y29va2llcycgPT4gMSwKICAgICAgICAgICAgJ2V2ZW50cy5nZXQnID0+IDEsCiAgICAgICAgICAgICdldmVudHMuZ2V0bWVtYmVycycgPT4gMSwKICAgICAgICAgICAgJ2ZibWwuZ2V0Y3VzdG9tdGFncycgPT4gMSwKICAgICAgICAgICAgJ2ZlZWQuZ2V0YXBwZnJpZW5kc3RvcmllcycgPT4gMSwKICAgICAgICAgICAgJ2ZlZWQuZ2V0cmVnaXN0ZXJlZHRlbXBsYXRlYnVuZGxlYnlpZCcgPT4gMSwKICAgICAgICAgICAgJ2ZlZWQuZ2V0cmVnaXN0ZXJlZHRlbXBsYXRlYnVuZGxlcycgPT4gMSwKICAgICAgICAgICAgJ2ZxbC5tdWx0aXF1ZXJ5JyA9PiAxLAogICAgICAgICAgICAnZnFsLnF1ZXJ5JyA9PiAxLAogICAgICAgICAgICAnZnJpZW5kcy5hcmVmcmllbmRzJyA9PiAxLAogICAgICAgICAgICAnZnJpZW5kcy5nZXQnID0+IDEsCiAgICAgICAgICAgICdmcmllbmRzLmdldGFwcHVzZXJzJyA9PiAxLAogICAgICAgICAgICAnZnJpZW5kcy5nZXRsaXN0cycgPT4gMSwKICAgICAgICAgICAgJ2ZyaWVuZHMuZ2V0bXV0dWFsZnJpZW5kcycgPT4gMSwKICAgICAgICAgICAgJ2dpZnRzLmdldCcgPT4gMSwKICAgICAgICAgICAgJ2dyb3Vwcy5nZXQnID0+IDEsCiAgICAgICAgICAgICdncm91cHMuZ2V0bWVtYmVycycgPT4gMSwKICAgICAgICAgICAgJ2ludGwuZ2V0dHJhbnNsYXRpb25zJyA9PiAxLAogICAgICAgICAgICAnbGlua3MuZ2V0JyA9PiAxLAogICAgICAgICAgICAnbm90ZXMuZ2V0JyA9PiAxLAogICAgICAgICAgICAnbm90aWZpY2F0aW9ucy5nZXQnID0+IDEsCiAgICAgICAgICAgICdwYWdlcy5nZXRpbmZvJyA9PiAxLAogICAgICAgICAgICAncGFnZXMuaXNhZG1pbicgPT4gMSwKICAgICAgICAgICAgJ3BhZ2VzLmlzYXBwYWRkZWQnID0+IDEsCiAgICAgICAgICAgICdwYWdlcy5pc2ZhbicgPT4gMSwKICAgICAgICAgICAgJ3Blcm1pc3Npb25zLmNoZWNrYXZhaWxhYmxlYXBpYWNjZXNzJyA9PiAxLAogICAgICAgICAgICAncGVybWlzc2lvbnMuY2hlY2tncmFudGVkYXBpYWNjZXNzJyA9PiAxLAogICAgICAgICAgICAncGhvdG9zLmdldCcgPT4gMSwKICAgICAgICAgICAgJ3Bob3Rvcy5nZXRhbGJ1bXMnID0+IDEsCiAgICAgICAgICAgICdwaG90b3MuZ2V0dGFncycgPT4gMSwKICAgICAgICAgICAgJ3Byb2ZpbGUuZ2V0aW5mbycgPT4gMSwKICAgICAgICAgICAgJ3Byb2ZpbGUuZ2V0aW5mb29wdGlvbnMnID0+IDEsCiAgICAgICAgICAgICdzdHJlYW0uZ2V0JyA9PiAxLAogICAgICAgICAgICAnc3RyZWFtLmdldGNvbW1lbnRzJyA9PiAxLAogICAgICAgICAgICAnc3RyZWFtLmdldGZpbHRlcnMnID0+IDEsCiAgICAgICAgICAgICd1c2Vycy5nZXRpbmZvJyA9PiAxLAogICAgICAgICAgICAndXNlcnMuZ2V0bG9nZ2VkaW51c2VyJyA9PiAxLAogICAgICAgICAgICAndXNlcnMuZ2V0c3RhbmRhcmRpbmZvJyA9PiAxLAogICAgICAgICAgICAndXNlcnMuaGFzYXBwcGVybWlzc2lvbicgPT4gMSwKICAgICAgICAgICAgJ3VzZXJzLmlzYXBwdXNlcicgPT4gMSwKICAgICAgICAgICAgJ3VzZXJzLmlzdmVyaWZpZWQnID0+IDEsCiAgICAgICAgICAgICd2aWRlby5nZXR1cGxvYWRsaW1pdHMnID0+IDEpOwogICAgJG5hbWUgPSAnYXBpJzsKICAgIGlmIChpc3NldCgkUkVBRF9PTkxZX0NBTExTW3N0cnRvbG93ZXIoJG1ldGhvZCldKSkgewogICAgICAkbmFtZSA9ICdhcGlfcmVhZCc7CiAgICB9CiAgICByZXR1cm4gc2VsZjo6Z2V0VXJsKCRuYW1lLCAncmVzdHNlcnZlci5waHAnKTsKICB9CgogIC8qKgogICAqIEJ1aWxkIHRoZSBVUkwgZm9yIGdpdmVuIGRvbWFpbiBhbGlhcywgcGF0aCBhbmQgcGFyYW1ldGVycy4KICAgKgogICAqIEBwYXJhbSAkbmFtZSBTdHJpbmcgdGhlIG5hbWUgb2YgdGhlIGRvbWFpbgogICAqIEBwYXJhbSAkcGF0aCBTdHJpbmcgb3B0aW9uYWwgcGF0aCAod2l0aG91dCBhIGxlYWRpbmcgc2xhc2gpCiAgICogQHBhcmFtICRwYXJhbXMgQXJyYXkgb3B0aW9uYWwgcXVlcnkgcGFyYW1ldGVycwogICAqIEByZXR1cm4gU3RyaW5nIHRoZSBVUkwgZm9yIHRoZSBnaXZlbiBwYXJhbWV0ZXJzCiAgICovCiAgcHJvdGVjdGVkIGZ1bmN0aW9uIGdldFVybCgkbmFtZSwgJHBhdGg9JycsICRwYXJhbXM9YXJyYXkoKSkgewogICAgJHVybCA9IHNlbGY6OiRET01BSU5fTUFQWyRuYW1lXTsKICAgIGlmICgkcGF0aCkgewogICAgICBpZiAoJHBhdGhbMF0gPT09ICcvJykgewogICAgICAgICRwYXRoID0gc3Vic3RyKCRwYXRoLCAxKTsKICAgICAgfQogICAgICAkdXJsIC49ICRwYXRoOwogICAgfQogICAgaWYgKCRwYXJhbXMpIHsKICAgICAgJHVybCAuPSAnPycgLiBodHRwX2J1aWxkX3F1ZXJ5KCRwYXJhbXMsIG51bGwsICcmJyk7CiAgICB9CiAgICByZXR1cm4gJHVybDsKICB9CgogIC8qKgogICAqIFJldHVybnMgdGhlIEN1cnJlbnQgVVJMLCBzdHJpcHBpbmcgaXQgb2Yga25vd24gRkIgcGFyYW1ldGVycyB0aGF0IHNob3VsZAogICAqIG5vdCBwZXJzaXN0LgogICAqCiAgICogQHJldHVybiBTdHJpbmcgdGhlIGN1cnJlbnQgVVJMCiAgICovCiAgcHJvdGVjdGVkIGZ1bmN0aW9uIGdldEN1cnJlbnRVcmwoKSB7CiAgICAkcHJvdG9jb2wgPSBpc3NldCgkX1NFUlZFUlsnSFRUUFMnXSkgJiYgJF9TRVJWRVJbJ0hUVFBTJ10gPT0gJ29uJwogICAgICA/ICdodHRwczovLycKICAgICAgOiAnaHR0cDovLyc7CiAgICAkY3VycmVudFVybCA9ICRwcm90b2NvbCAuICRfU0VSVkVSWydIVFRQX0hPU1QnXSAuICRfU0VSVkVSWydSRVFVRVNUX1VSSSddOwogICAgJHBhcnRzID0gcGFyc2VfdXJsKCRjdXJyZW50VXJsKTsKCiAgICAvLyBkcm9wIGtub3duIGZiIHBhcmFtcwogICAgJHF1ZXJ5ID0gJyc7CiAgICBpZiAoIWVtcHR5KCRwYXJ0c1sncXVlcnknXSkpIHsKICAgICAgJHBhcmFtcyA9IGFycmF5KCk7CiAgICAgIHBhcnNlX3N0cigkcGFydHNbJ3F1ZXJ5J10sICRwYXJhbXMpOwogICAgICBmb3JlYWNoKHNlbGY6OiREUk9QX1FVRVJZX1BBUkFNUyBhcyAka2V5KSB7CiAgICAgICAgdW5zZXQoJHBhcmFtc1ska2V5XSk7CiAgICAgIH0KICAgICAgaWYgKCFlbXB0eSgkcGFyYW1zKSkgewogICAgICAgICRxdWVyeSA9ICc/JyAuIGh0dHBfYnVpbGRfcXVlcnkoJHBhcmFtcywgbnVsbCwgJyYnKTsKICAgICAgfQogICAgfQoKICAgIC8vIHVzZSBwb3J0IGlmIG5vbiBkZWZhdWx0CiAgICAkcG9ydCA9CiAgICAgIGlzc2V0KCRwYXJ0c1sncG9ydCddKSAmJgogICAgICAoKCRwcm90b2NvbCA9PT0gJ2h0dHA6Ly8nICYmICRwYXJ0c1sncG9ydCddICE9PSA4MCkgfHwKICAgICAgICgkcHJvdG9jb2wgPT09ICdodHRwczovLycgJiYgJHBhcnRzWydwb3J0J10gIT09IDQ0MykpCiAgICAgID8gJzonIC4gJHBhcnRzWydwb3J0J10gOiAnJzsKCiAgICAvLyByZWJ1aWxkCiAgICByZXR1cm4gJHByb3RvY29sIC4gJHBhcnRzWydob3N0J10gLiAkcG9ydCAuICRwYXJ0c1sncGF0aCddIC4gJHF1ZXJ5OwogIH0KCiAgLyoqCiAgICogR2VuZXJhdGUgYSBzaWduYXR1cmUgZm9yIHRoZSBnaXZlbiBwYXJhbXMgYW5kIHNlY3JldC4KICAgKgogICAqIEBwYXJhbSBBcnJheSAkcGFyYW1zIHRoZSBwYXJhbWV0ZXJzIHRvIHNpZ24KICAgKiBAcGFyYW0gU3RyaW5nICRzZWNyZXQgdGhlIHNlY3JldCB0byBzaWduIHdpdGgKICAgKiBAcmV0dXJuIFN0cmluZyB0aGUgZ2VuZXJhdGVkIHNpZ25hdHVyZQogICAqLwogIHByb3RlY3RlZCBzdGF0aWMgZnVuY3Rpb24gZ2VuZXJhdGVTaWduYXR1cmUoJHBhcmFtcywgJHNlY3JldCkgewogICAgLy8gd29yayB3aXRoIHNvcnRlZCBkYXRhCiAgICBrc29ydCgkcGFyYW1zKTsKCiAgICAvLyBnZW5lcmF0ZSB0aGUgYmFzZSBzdHJpbmcKICAgICRiYXNlX3N0cmluZyA9ICcnOwogICAgZm9yZWFjaCgkcGFyYW1zIGFzICRrZXkgPT4gJHZhbHVlKSB7CiAgICAgICRiYXNlX3N0cmluZyAuPSAka2V5IC4gJz0nIC4gJHZhbHVlOwogICAgfQogICAgJGJhc2Vfc3RyaW5nIC49ICRzZWNyZXQ7CgogICAgcmV0dXJuIG1kNSgkYmFzZV9zdHJpbmcpOwogIH0KCiAgLyoqCiAgICogUHJpbnRzIHRvIHRoZSBlcnJvciBsb2cgaWYgeW91IGFyZW4ndCBpbiBjb21tYW5kIGxpbmUgbW9kZS4KICAgKgogICAqIEBwYXJhbSBTdHJpbmcgbG9nIG1lc3NhZ2UKICAgKi8KICBwcm90ZWN0ZWQgc3RhdGljIGZ1bmN0aW9uIGVycm9yTG9nKCRtc2cpIHsKICAgIC8vIGRpc2FibGUgZXJyb3IgbG9nIGlmIHdlIGFyZSBydW5uaW5nIGluIGEgQ0xJIGVudmlyb25tZW50CiAgICAvLyBAY29kZUNvdmVyYWdlSWdub3JlU3RhcnQKICAgIGlmIChwaHBfc2FwaV9uYW1lKCkgIT0gJ2NsaScpIHsKICAgICAgZXJyb3JfbG9nKCRtc2cpOwogICAgfQogICAgLy8gdW5jb21tZW50IHRoaXMgaWYgeW91IHdhbnQgdG8gc2VlIHRoZSBlcnJvcnMgb24gdGhlIHBhZ2UKICAgIC8vIHByaW50ICdlcnJvcl9sb2c6ICcuJG1zZy4iXG4iOwogICAgLy8gQGNvZGVDb3ZlcmFnZUlnbm9yZUVuZAogIH0KCiAgLyoqCiAgICogQmFzZTY0IGVuY29kaW5nIHRoYXQgZG9lc24ndCBuZWVkIHRvIGJlIHVybGVuY29kZSgpZWQuCiAgICogRXhhY3RseSB0aGUgc2FtZSBhcyBiYXNlNjRfZW5jb2RlIGV4Y2VwdCBpdCB1c2VzCiAgICogICAtIGluc3RlYWQgb2YgKwogICAqICAgXyBpbnN0ZWFkIG9mIC8KICAgKgogICAqIEBwYXJhbSBTdHJpbmcgYmFzZTY0VXJsRW5jb2RlZGVkIHN0cmluZwogICAqLwogIHByb3RlY3RlZCBzdGF0aWMgZnVuY3Rpb24gYmFzZTY0VXJsRGVjb2RlKCRpbnB1dCkgewogICAgcmV0dXJuIGJhc2U2NF9kZWNvZGUoc3RydHIoJGlucHV0LCAnLV8nLCAnKy8nKSk7CiAgfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/function.admin_tab_providers.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qCiAqICAgICAgQ29weXJpZ2h0IDIwMTAgSGVucmlrIExlbm5hcnRzc29uCiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKgogKiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICoKICovCgoKLyogQHZhciAkdGhpcyBPcGVuSUQgKi8KLyogQHZhciAkZ0NtcyBDbXNPYmplY3QgKi8KCmZ1bmN0aW9uIENyZWF0ZVByb3ZpZGVySW5wdXQoJHByb3ZpZGVyLCAkbW9kdWxlKSB7CiAgICBnbG9iYWwgJHNtYXJ0eTsKICAgICRzbWFydHktPmFzc2lnbignaW5wdXRfJy4kcHJvdmlkZXIsCgkJUlJVdGlsczo6bXlDcmVhdGVJbnB1dENoZWNrYm94KCRpZCwgJ2lucHV0X3Byb3ZpZGVyXycuJHByb3ZpZGVyLCAxLAoJCQkJCSAgICAgICAkbW9kdWxlLT5HZXRQcmVmZXJlbmNlKCdlbmFibGVfcHJvdmlkZXJfJy4kcHJvdmlkZXIsMSkpKTsKfQoKJHNtYXJ0eS0+YXNzaWduKCdzdGFydGZvcm0nLAoJCSR0aGlzLT5DcmVhdGVGb3JtU3RhcnQoICRpZCwgJ2FkbWluX3VwZGF0ZXByb3ZpZGVycycpKTsKJHNtYXJ0eS0+YXNzaWduKCdlbmRmb3JtJywgJHRoaXMtPkNyZWF0ZUZvcm1FbmQoKSk7CgpDcmVhdGVQcm92aWRlcklucHV0KCdnb29nbGUnLCAkdGhpcyk7CkNyZWF0ZVByb3ZpZGVySW5wdXQoJ3lhaG9vJywgJHRoaXMpOwpDcmVhdGVQcm92aWRlcklucHV0KCdhb2wnLCAkdGhpcyk7CkNyZWF0ZVByb3ZpZGVySW5wdXQoJ215b3BlbmlkJywgJHRoaXMpOwpDcmVhdGVQcm92aWRlcklucHV0KCdteXNwYWNlJywgJHRoaXMpOwpDcmVhdGVQcm92aWRlcklucHV0KCdmbGlja3InLCAkdGhpcyk7CkNyZWF0ZVByb3ZpZGVySW5wdXQoJ2ZhY2Vib29rJywgJHRoaXMpOwpDcmVhdGVQcm92aWRlcklucHV0KCd0ZWNobm9yYXRpJywgJHRoaXMpOwpDcmVhdGVQcm92aWRlcklucHV0KCd3b3JkcHJlc3MnLCAkdGhpcyk7CkNyZWF0ZVByb3ZpZGVySW5wdXQoJ2Jsb2dnZXInLCAkdGhpcyk7CkNyZWF0ZVByb3ZpZGVySW5wdXQoJ2xpdmVqb3VybmFsJywgJHRoaXMpOwpDcmVhdGVQcm92aWRlcklucHV0KCdjbGFpbWlkJywgJHRoaXMpOwpDcmVhdGVQcm92aWRlcklucHV0KCd2aWRvb3AnLCAkdGhpcyk7CkNyZWF0ZVByb3ZpZGVySW5wdXQoJ3ZlcmlzaWduJywgJHRoaXMpOwoKJHNtYXJ0eS0+YXNzaWduKCdzdWJtaXQnLAoJCSR0aGlzLT5DcmVhdGVJbnB1dFN1Ym1pdCAoJGlkLCAnc3VibWl0JywKCQkJCQkgICR0aGlzLT5MYW5nKCdzdWJtaXQnKSwnJywnJykpOwokc21hcnR5LT5hc3NpZ24gKCdjYW5jZWwnLAoJCSAkdGhpcy0+Q3JlYXRlSW5wdXRTdWJtaXQgKCRpZCwgJ2NhbmNlbCcsCgkJCQkJICAgJHRoaXMtPkxhbmcoJ2NhbmNlbCcpKSk7CgplY2hvICR0aGlzLT5Qcm9jZXNzVGVtcGxhdGUoJ2FkbWluX3RhYl9wcm92aWRlcnMudHBsJyk7Cj8+Cg==]]></data>
	</file>
	<file>
	  <filename>/function.admin_tab_settings.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qCiAqICAgICAgQ29weXJpZ2h0IDIwMTAgSGVucmlrIExlbm5hcnRzc29uCiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKgogKiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICoKICovCgovKiBAdmFyICR0aGlzIE9wZW5JRCAqLwovKiBAdmFyICRnQ21zIENtc09iamVjdCAqLwoKJHNtYXJ0eS0+YXNzaWduKCdzdGFydGZvcm0nLAoJCSR0aGlzLT5DcmVhdGVGb3JtU3RhcnQoICRpZCwgJ2FkbWluX3VwZGF0ZXNldHRpbmdzJykpOwokc21hcnR5LT5hc3NpZ24oJ2VuZGZvcm0nLCAkdGhpcy0+Q3JlYXRlRm9ybUVuZCgpKTsKCmdsb2JhbCAkZ0NtczsKJGNvbmZpZyA9ICRnQ21zLT5HZXRDb25maWcoKTsKCiRzbWFydHktPmFzc2lnbignYnVnZ3lfZ21wX3N0YXR1cycsIE9wZW5JRDo6R2V0Q29uZmlnQm9vbCgnb3BlbmlkLmJ1Z2d5LmdtcCcpID8gJ0VuYWJsZWQnIDogJ0Rpc2FibGVkJyk7Cgokc21hcnR5LT5hc3NpZ24oJ2luc2VjdXJlX3JhbmRfc3RhdHVzJywgT3BlbklEOjpHZXRDb25maWdCb29sKCdvcGVuaWQuaW5zZWN1cmUucmFuZCcpID8gJ0VuYWJsZWQnIDogJ0Rpc2FibGVkJyk7Cgokc21hcnR5LT5hc3NpZ24oJ2NhX2ZpbGVfb3ZlcnJpZGVfc3RhdHVzJywgT3BlbklEOjpHZXRDb25maWdCb29sKCdvcGVuaWQuY2Eub3ZlcnJpZGUnKSA/ICdFbmFibGVkJyA6ICdEaXNhYmxlZCcpOwoKJHNtYXJ0eS0+YXNzaWduKCdpbnB1dF9mYWNlYm9va19hcHBfaWQnLAogICAgICAgICR0aGlzLT5DcmVhdGVJbnB1dFRleHQoJGlkLCdpbnB1dF9mYWNlYm9va19hcHBfaWQnLCAkdGhpcy0+R2V0UHJlZmVyZW5jZSgnZmFjZWJvb2tfYXBwX2lkJyksIDMwKSk7Cgokc21hcnR5LT5hc3NpZ24oJ2lucHV0X2ZhY2Vib29rX2FwcF9zZWNyZXQnLAogICAgICAgICR0aGlzLT5DcmVhdGVJbnB1dFRleHQoJGlkLCdpbnB1dF9mYWNlYm9va19hcHBfc2VjcmV0JywgJHRoaXMtPkdldFByZWZlcmVuY2UoJ2ZhY2Vib29rX2FwcF9zZWNyZXQnKSwgNTApKTsKCgokc21hcnR5LT5hc3NpZ24oJ2RlYnVnX3N0YXR1cycsIE9wZW5JRDo6R2V0Q29uZmlnQm9vbCgnb3BlbmlkLmRlYnVnJykgPyAnRW5hYmxlZCcgOiAnRGlzYWJsZWQnKTsKCiRzbWFydHktPmFzc2lnbignc3VibWl0JywKCQkkdGhpcy0+Q3JlYXRlSW5wdXRTdWJtaXQgKCRpZCwgJ3N1Ym1pdCcsCgkJCQkJICAkdGhpcy0+TGFuZygnc3VibWl0JyksJycsJycpKTsKJHNtYXJ0eS0+YXNzaWduICgnY2FuY2VsJywKCQkgJHRoaXMtPkNyZWF0ZUlucHV0U3VibWl0ICgkaWQsICdjYW5jZWwnLAoJCQkJCSAgICR0aGlzLT5MYW5nKCdjYW5jZWwnKSkpOwoKZWNobyAkdGhpcy0+UHJvY2Vzc1RlbXBsYXRlKCdhZG1pbl90YWJfc2V0dGluZ3MudHBsJyk7Cj8+Cg==]]></data>
	</file>
	<file>
	  <filename>/function.admin_tab_users.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qCiAqICAgICAgQ29weXJpZ2h0IDIwMTAgSGVucmlrIExlbm5hcnRzc29uCiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKgogKiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICoKICovCgovKiBAdmFyICR0aGlzIE9wZW5JRCAqLwovKiBAdmFyICRnQ21zIENtc09iamVjdCAqLwoKZWNobyAkdGhpcy0+UHJvY2Vzc1RlbXBsYXRlKCdhZG1pbl90YWJfdXNlcnMudHBsJyk7Cj8+Cg==]]></data>
	</file>
	<file>
	  <filename>/images/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/images/ajax-loader.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhEAAQAPIAAP///wAAAMLCwkJCQgAAAGJiYoKCgpKSkiH/C05FVFNDQVBFMi4wAwEAAAAh/hpDcmVhdGVkIHdpdGggYWpheGxvYWQuaW5mbwAh+QQJCgAAACwAAAAAEAAQAAADMwi63P4wyklrE2MIOggZnAdOmGYJRbExwroUmcG2LmDEwnHQLVsYOd2mBzkYDAdKa+dIAAAh+QQJCgAAACwAAAAAEAAQAAADNAi63P5OjCEgG4QMu7DmikRxQlFUYDEZIGBMRVsaqHwctXXf7WEYB4Ag1xjihkMZsiUkKhIAIfkECQoAAAAsAAAAABAAEAAAAzYIujIjK8pByJDMlFYvBoVjHA70GU7xSUJhmKtwHPAKzLO9HMaoKwJZ7Rf8AYPDDzKpZBqfvwQAIfkECQoAAAAsAAAAABAAEAAAAzMIumIlK8oyhpHsnFZfhYumCYUhDAQxRIdhHBGqRoKw0R8DYlJd8z0fMDgsGo/IpHI5TAAAIfkECQoAAAAsAAAAABAAEAAAAzIIunInK0rnZBTwGPNMgQwmdsNgXGJUlIWEuR5oWUIpz8pAEAMe6TwfwyYsGo/IpFKSAAAh+QQJCgAAACwAAAAAEAAQAAADMwi6IMKQORfjdOe82p4wGccc4CEuQradylesojEMBgsUc2G7sDX3lQGBMLAJibufbSlKAAAh+QQJCgAAACwAAAAAEAAQAAADMgi63P7wCRHZnFVdmgHu2nFwlWCI3WGc3TSWhUFGxTAUkGCbtgENBMJAEJsxgMLWzpEAACH5BAkKAAAALAAAAAAQABAAAAMyCLrc/jDKSatlQtScKdceCAjDII7HcQ4EMTCpyrCuUBjCYRgHVtqlAiB1YhiCnlsRkAAAOwAAAAAAAAAAAA==]]></data>
	</file>
	<file>
	  <filename>/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[]]></data>
	</file>
	<file>
	  <filename>/jQueryOpenIdPlugin/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/jQueryOpenIdPlugin/images/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/jQueryOpenIdPlugin/images/aolB.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAHgAAAAgCAYAAADZubxIAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjM2qefiJQAACbVJREFUaEPtm3lwU9cVh5v/mjZpQtJMpm3aNGnppMs0adymTKaZNE1oGjppO9OGphQoOykpCQ2bgQQCTggpUMCYxYVQoDE2CGO8CHnFi2xZeLeMBLYsL7JlC2vzIksm2P713Gu95ydLwpZrIXvqx1ys5S7nnu+ec8897+muz3lfM4S3c+bMiZg1a9YDI76ffju5NHCXWq226fX6cipSyRwBxSSwj+/ZsycWgH1wcNA2XSavDogRu+wOh6Nsx44dr82cOVM00JGA+ResEqvMWtHf6TJFdOB2uznpMrqYgfq1XgaX6hj60TcNdoqAHWmEHsNkkCO8ILMPGFy2EqYt19dz2ex2lOvbYDRbJ71+BMhe7tqz50564cO1+JLU9divuIYSgxU6oxU3rPZJrSsGmXlkbsWC9Trdk1vocMFl48YoarD0X8XYlXIVJ/LqkVbRgkqDGTb75IxTPJ64jFvxn+cvWOGJxMKyKq3jUFJzuwXZVU1IK22AStsCi230xaltNKPa0DauOR6Qa/C7f+Zj0VEVlsQWY+XxK1j7aTn2pmlRVd8+rj5DvWAZ04iIiJcY4I3hiprlBOibb1+E2WIbk5JkRXq88GEWvrD4LD6/KEEsD62UYcnRQlK2f4Dxylrc7al/QF4zprGkABjgF3dm4+Vdl/Hqnjz84UAB5h8uxJazFdidooGioinoPu8AYIQd8Csf53BIh9K1t1VQe4cNr0fne0GVAhZe37f8HI5k+Pa19vQVse38mIKgYexL0+DJTXJEbFHgNwRYptKDyRRqSP9L/8xofQCzfVgoPS47QllK6ltEpf8wMhXdvf7H63TaMGf30EIQCrPG765PxbPb0vG1Ny/4gD+cpfWSfV2cBPCh/KDntTetCo+tSSbLzYPR0sHbM3mvm9pRSvOobzcHlD+UOgzUN1sYowKWwg7F68WxhV5gkkr14uKSjrfzYqVXvVf35KC6ySTW7SZls7Yz1yaL9e5dehYVja1infUSwAsO5/sd53Zz3J1aiVnbFGizd/C2ebomrDqhxoYzFfiEgi55ZSvSq1tpzDax7wxNI70fljMUOgwKMBOARV9CcbldCFVpMDvwpWXnvMDN/ijbZ7wbjm489MZ5sd7c6AI4Xb1+5WJ9Prbmolj3TweVYr31cWXi5wto7wx2XmyflVc083YXSxt5wBWVVIPUilay4k6YHS6Y7L3Iv2ZGntbE6zl6nDwQY+DZPIIdcyz1pbykrxlLHwseCThQ44n4fDMFJ/720Ct1Zq9FdipfL9Z7YIUMrZYur+9HyvKfgnqJFZ+DpbOH198QVy5+vpAABzuH4tp2uFxuGDs68cIHmXj7dBk/LuXpzNA021Fv7obR6kRtWxfOFjdBbxoylpN5em7ll8jC69oc6Hb2Bj12sLKy+mEFbOt04iurhvbNe8iVRsYPw154uMhLAatPlohgXqPIdbTJdvX04n4KtITFk61pnRDAwrj75FfxzHvpWHFcjd1pOnxa2MDdc/61G1DrLVDVdSC5rAXn1Y18XHWtGfNiCvn5OaPaRC7bCkO7Y9R5jDbP0b73C3jgZh+kpb/PjVCUmHSdCGAeuVEHWZnghhnwZnK1wrh/JKgCrC0JFWOS56nINLFNgrKet4k8M2zBfyELHu+8lsWq8ON3FZh3qBCRCZXYK9fheK4e8apGJJYYeTmeW499ci0fw2Cy4bd782i/LiGXrsFppQEp5S2oMnSMW4axyD4mwCOBT8T7z2hVs+hXgFZA+xXrd82pYUvdRBYtjDUvRinW3UiQxiLD9zcOA5apDLzNJgngReQlxtKPvzqLjhTiiXWp+BWdhxdQP8xVb5VVk4VqeSozOuM6tidq8H5iNR/jOqU1Z3+Ug7nRSiw8ouKWv5gSJUrPvMcrh9AuEOywAb5ArkuA+5P3FOj3eA1dsxV3Lx46Bj3810R0dTuHwMQPW97LFISNphCrowdfXDKcBCkhFzmRgPem1uDBlec55Fl0RGNJj/kEevkxNVafLMVbp0o5yP2XtHzclJImPPt+Bl7amcNBs8CvSDe0qENdfIKsUA/I+v/5B1ki4K/S+TViyyVent4i9wJzUKHjClCUG8X6LHt1tclyW8V8nFIj1n94VSL6XK4JAdxE+2Z/Xx/aLJ348hsy3Lv0HB75WxJ+tPkSfrY9E89HZWE2QXzxw2w8tyMTNY0dfNxVn6i5x3puewbiabtgHuxO6JmN4QOY3Qf2KoP0fgKLSt8+aiZKsO4n1qWgr9+NvltuspYUL6u39PT4lUtZa/IKsNbFlYr1IhMke/DRoqDnlUtWp2218nZxlC5l3ub+5TI8sjoJj1Kq9RtvJeFxOqJ9+51kHMzU8XoaYwdPw0ZdqEKnyxn0mEHpfiQ7ej86YD+NfBbBWOvQhF+X7Kff+nsypf7SfIr0zCsraeAL7mL5sFtnC+A7a1NwUlmH9i46Mt1yQddmxbuyCtwnOVc/Sgq/0d0tLtjIs8OAn6Gt4QClM6OpSP9mXW0ZguBnTmdU9RQ81cHBQNH3Co0RT22W4x7aDpg1s7G/tyEVCcUGsT0D3WCx++1v3HoMZIThBmygiQp7I8sXS5UvneyJgjrRWp8ndy4ofPuF6jFb/4N046GIvIW0Xylgf+dv4bNSuuPkT/n/LqjlgdPR7FpYneRBSKG3Bt24arIgo8aI8iYz9zgTBi4Iwwm0KO+oBSvr2kRAy46pAlpKz81efJ3cHlP4TLJUUXiyrNjL13mAcztAT5JVVTTf8FH01kTvdGegPpR1Jr+QYi9fw69359LZV0sRcw0U1UZ09Q1Zc1iLsIWOYsHsfrDPNYiJ+zcwOIBjl/XYfK4Klm53wJ4HBgdRTsmAdyjzdIWenvCWYAAmRy+2ndcggs6i7MzMQDG3/so/cnGywEB7dr/fvltsTnLj1dgYXxmwnKakBZPT36wPZdbyYOr3+wuwic6/rCyl4w6LnN+kZMwZVQMGA7SdOC369uSPm7DgpBbsF7C/xpPps/6BAbg/I6C0KEJ9HcyoxU+3pnMrZpBZVu0XFDGznHQxZa/CdTGYIy8J4KEb/sIjO+ESciqMG51+HU/TkeiXu3IoF53Fj0VxRRQEDpBV3YEFNk4dGfgjO+w/9jztODv5v2gmu9LM71T9gCJllqnq7L056efNHqQUH531PBM9dI9p+vLRwABZqoJuFjR09EwV7Rh8HoAXfq4yVWYwLWdADRjER2YlT7/PYJcHsmFaeVNDAyODLOE3SoF+eMZ+nzSD0Wd78p3KmU6PM/4bD+y+sCfvbJD8LolzvC1kZs1RUVFzp8vk1gF53FXMID0uWQDrBfe/mbF3xJm3XgsAAAAASUVORK5CYII=]]></data>
	</file>
	<file>
	  <filename>/jQueryOpenIdPlugin/images/aolW.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAADwAAAAQCAYAAABKkhw/AAAFIElEQVR42tVXa2yTVRjeHxNQDD9Ag/GaqPH+Q/2lGoISjYlECQGJBuXuEFAiARIhYZQgc3UXBoNt1jIGrEBpd2m7rTe6rt1Ku62M3mm/Xtf72H3ughs8nu8EanBJ1+4P+CVP8vY97+057+n7fSfn3pOXl/cIwVI+n79fIpGcVSqV8geNM80mRmO8bleqVIpsfQmH89XV1RzC6ROCeXdppsguKSsrO2A2m7uCwaAlEom44vF4rKenZ+xBYkNFO3gtDKSdgds2JjSRjW8gEIhFo1G3xWKxlpeXs8SfS3WWJcswjJcY6MLh8BiR8TDg03w11pTqsO5UO7bxTeAprLDf8GQVw+12/+31eiM8Hq+AcH2MJbyMdLaTdFRHdgXZwOxgcE5tmaH3+QM4LjVjdZEaKwqU2Fvdji47k1pXdTjxVYkaJpsnbfx39jdi+a8qnLtig4vxU91c4Pf7b9vtdv/Ro0dX5VRVVR0kx/haIpFgjwKywe4z7XhtTwOCoX91Hl8QyzhyzNtwEY9vvoTFuSIqL9kugvSqi9oUiDuo7qzakjb+27/I0GZhYLAyOCazoEbnQZsjDJc3RNf1Fl/GtZKTOykUCk/lyGQyYTKZvEGOM7KBNxjGUztEoIVfsaf023ltVPd9pZ61oTqB1oHF20R4YVc9fKEwfq/rojbnNba0OcqbrhPCPmyoMEBgCMATH0ZscBwaexQuXw/qrroh0DPwhmavl8ylO3K5vDGHnWi9vb3D5EgjG3DrzXc7J8bSw3Kqi8bieIIQe2uflMix++wPXeqk9mfUNhTe9RW0OGbNs7WyDVv/NILf4oXSGoPJexM6VxINJh+YYARbeEaIOkKw+hPoicTSxmK5UsJ9fX3jhDQyRSKZxKt7JHj/YDPyxbR4qK754PBHqPzdSd0MH6nRQ9c4wk4US7qpfLHVNWuuZYcVWFncin2CayhpcoGv9dLJfaLZQde/JGs7qjpQILGj3uhNGytFuL+/f4IAmeJ8q4sWnCfswpVuPxaQ/+raUi1iyZtUXn5EOcOnUmGnPqfkNpTILFQW6t2z5lp7TIuXfm7AR0fU+OZkO3L5JtrxY4022HxRvJenoNO8UGJBON6bNlaK8ODg4OjQ0BAyxVKOgi34Pjy68RJs/jhWFmownz2uOnfKngn34vW9UizcIoQnnERpo5X6iAxM2jx6RwQGZ5gMvst4ZmcdXtkjxRv7ZPjgkAKuYAKHLpux9Y92OAKJjOqmhMnQEg8MDHhHR0eRCVrtYVrsT1VGSDv9LOj0nL/xInaf7YAjmMTzu+oo6Y+PqLCqWIsnfxDR32VyB41xopl2G0/vrMXLuxso1pe3zch1WGyBN9qHDncM357U40OOHLk8A80xODxCNyTTukdGRqBQKJpyLly4wCVj2zA+Pn6HALOh25fE6hItojeH7tMfFHajQuWisjc2gE2VBjz7Yx0W5V6mxKVdwZSt1h7BCm4LgSYFjuj6jFxfFLaguNEJlSWM3sERqpsrxsbG7ojF4tM5HA7nc/JSdpJduHrr1i08RKD/zzWlemw7bcJnv2mQ32BF3/Bfc4pFmhrjcrnr2C+tBeTCwPX5fC6yC8bp6Wk8LHj3QBMdVpvJabGG+ucUY2pqip3QiZqamgrCddG97+kXyc2i1Ol03iAvaM3k5GT/xMTE5IPG8WbHdK0pMEWOZNa+5GEHcYh0NioQCFiyb/73xrQwPz//69ra2nMqlYpesf7vqK+vrykqKtqU6ix5/gE0XHGoPyVgYQAAAABJRU5ErkJggg==]]></data>
	</file>
	<file>
	  <filename>/jQueryOpenIdPlugin/images/blogger.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAADAFBMVEUAAAC+RQe3cFrFUAHuYwfufQPwdSLDlYzWsLL4roL4wZ/qzLn11sP328f03s/y4dbz5t309+79+fj///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANTh2lAAABAHRSTlP///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAAAGRJREFUeNplj0EOgCAMBFkLVURB2P+/Fb1ASpxbJ2m767osdCc+GLw4Cd4QhlBVK/Qk2w6ZIjEfbBuGUN5AZIRMUXN5WAtgRLkqAbPi9abAHD0zE2S8Tfz45iWYmmA2+q/cr/4LSnQJ/wFqhNMAAAAASUVORK5CYII=]]></data>
	</file>
	<file>
	  <filename>/jQueryOpenIdPlugin/images/claimid.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAADAFBMVEUAAACaxCel1CKwyzu+4F/O6Ifp3ZfR7NLx+Nz09+78//j///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD3zwCtAAABAHRSTlP///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAAAF1JREFUeNptjkEOwCAIBKGAovz/vVTSVLDpHDxMJivgeOCAJAVCwOvgR9B6SbpQFWpmSikohEkKHiE4hcwUWQz+jLb6S4+gHMar0H0YS4uJ2d6NlT+MUIjgXTcd0W/7pQguXrQqAAAAAABJRU5ErkJggg==]]></data>
	</file>
	<file>
	  <filename>/jQueryOpenIdPlugin/images/facebookB.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAHgAAAAgCAYAAADZubxIAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjM2qefiJQAACPhJREFUaEPtW3lXU9cWf/0Ivo/QtfwE/OMfb+h7tbbQcb231FZFpRatKIgPCVBwABSVKQhiQSmjZYYwBYKMiWQAMgEBhBDmeQiTBBzKfuccck+mG8UCKdhc1uZm7/M7++yzf2eCe/PBXyyvfYzq5ubmcuDAgb9alTvV3ZWBD2Qy2ZxWq1UgMY9s3m6YiNgPo6OjkwFAv76+PueU3ZsDxBG+9PPz8/KwsLDD+/fvpxPUmmBSgEEYjGuhu1P2SA5WV1cJ03J04QnKOnsxuQijew1rTmL3CLHWk9A4MTHJLhYkYwMmF48E58zd2ysXQ7LFcm3cc53k7tGZyzaT8YpMZjEze5+v6p0EvycEG1diOZnFx0+4nzWexHacYE3PMIjlvUTwZ+d2sHPbAebUxcXlICY4YKdPzf1DE+ARVAh/O5ZM5Xp8tUMJrhZ1QjBXAO6cfIhLFzms7fxKJXCiKuHbyzmQU65wWLuYU4cRHJFcD38/kWIhNxJqHNZZvFKYxxCV0uiwtr1vltF+Z5W0OqxdVoLxPszIskEP2yWng4rgH+6pRAJjBVBSr4bmDu22+d9MnHdTGmgMMelCh7V96XY5bTebL3dIu3hAv5Vgc7K3+vmoXwH881QGkfqWbjqItur3XepHpgppDLEZIofF4HunkrabU6nY1nbtDWxWgnGy8OmLEcOqAbYquuFp4It64BvvAvjodBaR+9nNxKbsGgGmHOtYaiRa6NROwIphxabtjt5xyK3qgJQiBWSWqaFa3AsDo7MUNzW3AFVPeyCVpySC/U3OzNPyqFQxjeFGYiOUNXRDarES0ngqqJVqYXFp2aLNiel5qGh8Rnyll6hIe7P6RZu4Rif1G76MOOxrbn6J4i7frabt5la1U3uttI/EiAX37ffk2pwv88+YS5sZbE2wvcrvYufVdsO/vs9mlbisZkRUG2uZR0gFDI/PkcGmX1iGgNh6Vpx/TB3BNLb0g5tXvg3G9Xwe1Ij7CCY6TWo3FhzjmWt8mF9cJtjimm44dDbXBv/FhQLSFpOD7IoO+MQzxwb3tXchSNVDBPe/yFpanlelIbaG5n5q+/RcLvQNzVhMrnfJMRvWYQSX1D2Df/+Qxyq/ouTce9xqtzzikYR0OjazxS6GE9sAM3NL8MXFIor5yrsIvvIx6a5ehTA5vQAxGc12/TAxVoq00K2bgoOe7DFjnJvRn6pr7I3+vvYphjn9EvhF11NcvqCT2A5fKaW2jNK2bSUX54yV4N9erIG5vF5bha3KNFrmVJpROHKlHD72LCCSw9cQGy4bGp4hn7FIlUNw+5GU4tx/qoSXBgN86c0z1a3QwOjYHAyPzIK8fQRkqiEQotnA+D4RxAfD8nNYW1kBj6tV1F6LZjEXDRQG53u3Drp7J6CvfwpOonYYe0qhCtKK1VQ/c00AvYjwju5xOOxXRu1Vwl5IzJZT3etmDfQNTJN+fHOphNqFzQPgH9NA9aLqLojPaqX6D9cFJNat5tm6/qYItiZ8K7p7sAAOnismIlMNWwwkc79KzRjFHfHnw+zMItVx3SW0XFvHwW/UUsx3gZVoX20nYt5mcc0ziMuSU1xijpL6iUprofakPBXEpLda6Ex7N36WUPvjcg2EJZn0rDIN9ceJFVEcD7XL4Zr0iEcy+OTHjTwcQvfOngm7udhMvu0NDIcTfDK4GnWshIhMNUI6hWfnw8J2OBYkALcLpUQ+8yqluKOcKpicnKc6rmtYXmEhuM8Cw7RjfufV9KDtQEFxiTkq6icmQ07tyfltaCk36Ul5aooLS8LkbPThcXknhFvpDCEc7lOK49X2QICZbh7TtfuSLZH7tgFgc8h6W4WtlJ+6WguHvMqJyNSjpGMltVpqY8rM798GPoGpqQULDCvBQh3FHA2sBm6W0kZUmnGI/1VFcQ9y20wEZyqpPbmgHe35ljrT7/DkFop7XNEF4Q8tdQYXECemONzHwHsmnRPXRMs+9+Gj7Ua/YyTbEIyfA1vIOtK3SU5dr4dPL/CJyDpGid+IVDm1RaGkjqI9ubZlkNq+C6oBw4sVcL24UQ+LFu295jGtvjRAg2KIlnuE1sOL1+jsYBY31rHE56op7gEiEmNe/bYKvjFN1J5V2Q24jGnvFooR416i+t6RT6m9uEEL0WggMThutorgcDueNxupXSAdgMAEKdV5qF5woozqIQ9k25Nja+6Q/naCWSrZDIJNYk6HNsJn3gIiss4xMpC42W3U5hMthrKnOgj5uYXajgXXE9yVe1Jq+49/DfhxpeAbK4HjVxsIfmYRnaJ9qynm5PVG8L8ng8sIcyZcCF9efgIDk3MQn9dOMSeMdc/eElEbjk2KzgAi9YiF7fydJuKHiR/fe9Hf39XNgxa2i5Fi+D7MhHP1EcAIGrRBic0UxxP2wfC0nsTE+GtqQwN+k3m0Own/aII9QkXg6vOEiKxznHRIgQ4YjI3tfjykkeCeoZP2fzl1rNiQpFaCKajre6OvAfTPiIT8jjdiAhJa4CWa0ViCH7TaxcblotmP2lx7bQC/OJld3ENeF8H9lGjyVYK2E2zLrOyh9U6FCmEFrVS/i2RmpfqjCebmdMDVZAWRbvRHPdMZoWoUrsS3wLnbYghJkkNZ0wBgrD9KdvgvaNkzBj42uwBJKGGXYmXgGSEGr7sSuPFICVWyQYpR9EzCncw2UoYxP96RQMD9VkSsBvTPl9HsHIeY7HbgJLSSMow5j7ChKUqoEA/C6isD9YWXWr5kEK49VBAs9onjaVCOwKt1tAUY48J1SkX9JHaCi5TCrTQ1NLVvrFJY0vk9tO8SFAO2GdDWEpGuNtk7TPh3InqTBOPnwTbXOjh/dnsG2HhjBoj5HsxKMFtlp213ZQCTaX2ZEbzxwJ95ZWd3he6MZhsyoCOv7OBf+H3abXDodLGLMoBfpKSvzhrfid54xuS83ocM6GxegGe+rvI+9O5P3gcdfWXW7O33ffgykqz7kydoz3Tf+pDFfEfJ3hfP8PeT9mH28Z68lf89O+taPnrdqXzgZ7/YN7p0Zt9LIjy+kWQ8m8PDw484ZXfnAK24XnhCGpdkhlgLcv8Pudf9V18Rd8wAAAAASUVORK5CYII=]]></data>
	</file>
	<file>
	  <filename>/jQueryOpenIdPlugin/images/facebookW.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAADwAAAAQCAYAAABKkhw/AAAFyklEQVR42t1XSU9bVxhlU6lSK3XRTVfddNu/0EGt0qQNHZJ0SCIaNWMTGjKVpiIJIZQWEhIytJkd4jCDiW0G22AbmzEGg+cRPGCD8YAxmNEQKdXpfZ+Ea5M0G1b0SUf3fOf77nfvue/p2S9j9SooKHiF4f3y8vIzLS0tlQqFon0jg3morqioKGSeNjG8SiZTzL518+bNs3q9Xuf3+82hUGgsHA6HxsfHlzYwEsFgcMRsNlvu3LnDGX87eWc5s26328OM9gcCgSXGsQp5lx7XypW4wlPAZHGQtl6YrU60qXWw2YfX3cvhHIG61wjNoOU/a9hNjPF4vEvM62uc4Q/ZnR2KRCL9Pp8PqejTWvHBngd4L4uAAb2d9PUi83Al68fDoMGx7l5nr0qp1/26npfWuVyuQHFx8fYMPp9/np2AgRnmHgOkolLUzwzzcTBfjE6NFd5RP+nrxRfZNdRXZxpZd6/86+3U64HgyUvr2OP9t0AguJ0hkUgE0Wh0jAlIhcnmRdFtFT7cW4XsIgmaO0yw2L3cSJD3WOH2jiXrbcOjEMgMqG4eQluXFf6xAAKBCci7raQ1K03w+mhhfJnTQH3rWnWUa2I5n59yNE+iNpMu7bRgjMWra2gNLtSyOQKpntsLaQV/dVAvvlDLxbQe7dVB+TS0t7dLM7g3GjOcYC8ppKKmRY+P9telghkypsWf/9QIs30Uyl4HNv/YkJbTGt04cVGepu3MFcMzOo5tx4XP9c69rMCoP4Dv85rT9H3nWjE2HgRPoE3TNx2qZwdrQ+GtToorxENQ9NqJ7zgpol5rPXFeyXAsFksw00iFye5Hwa1ufHywEUeK5BC0mWFx+tEgM7NTNmH/+TbK8cUGHC1WEC/jayDrdrDDMkKlGSHtm5+bobOMMvMdFDewPttPNhG/Wz8IvkhPfMsRIRrbLcT35svQorIhK09CcWunHZlHRcQrmwy4XP6E47Ru0d1e4uWP9dj1aytxWZeDPKxF0vD09PQyA9aiXmbFpsNiFN3TUOzxhZlmQ0WzGccuqinHe2zE7rw24mZnIDm3T+clbWtOMw79psT2UxKKHzWZ8HUucTjdEwiGo8Q/OUI54pf5Wurx+30NxWw9GhlIH7L4if+QL8cfPKrBt6elNObd6KGaFyFpOB6PL8/OzmItGuVObM5uZU21YDXYc05J8VcnpcjMkRB/KLYg64yCuG0kmJyrMY5xGjPXhquVuiT69D62uXbKuUYjiExOc5yhBVWtNuJllTrqUfJgkOJqCekcSDfYA8T3XVChpJxqcKBQRWN2cSdmZuJ4kR8yzF5awpmZmeDCwgLWQtjhwpYcGUoe6hGbnsXmozKKHZ5JXLg3yHgbHrU4kHtNQ3pZlRHSXi+qpU7obEGq356rgFjlhrTHixqZE8Ojk9iZp6T6RqUL94VW6vMd01gN8QNFXWjp8mDP+U6qU2n92PGLgnKVrQ5cqTQSz72uwaVHeuL17cM4XNxNXKx240V+5HK5LKOurq6UvbY1iUQCa8AmevHZcQVKK0wUn76h5WJC5gkljVWSEejsYWzLVVG8Cod3Cn/WW4mn4okxiN1nO5/THyvdiM8uIKdUk6afujqAuflFiNQebP1XZ+t1QGsNMfNmioUdHpiGI/j0mIIdnhqTsbnn/AiFwocZhYWFW202m4OdgPbp06dIRSg6D51jEp7xOMXziwn0GUMYsEQQnppHPxv9oVnKxeKLlFMPBWEemcJSYpl099gMpxGMw1Hq4QvO0lzV4AR6DCFMROaSayaWV6iO+rimsMzi1VyA1XXrg+gzhTE1s0iaNxCnPbK9Umx1xyiOxBbSvYRC0dLS0izun9br7IOh1Ov1OpeWlgaePXuG/xvYr1C8pqbmLvP65ur/6XfYl8UNh8MxPDExoV5ZWVlcZke7kcGuhbm5uUl2RWtrazmz7679YnqjpKRkl0gkqlIqlfSJtdHR1NRUU1ZWti95Z9n1DzTm97k/pSk2AAAAAElFTkSuQmCC]]></data>
	</file>
	<file>
	  <filename>/jQueryOpenIdPlugin/images/fadegrey.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAABAAAADACAAAAAAoprySAAAFK0lEQVQYGQWA0ZHrNhYFu++PBUjg5B/bJrGPoAC67OFx+b8OQK6PRKi+AsBxBYFKvyGYcaFQ0raCjBlIAW0JkDGjJdAXBvlcWEHSN4A1TkoA+oqEfM46RUO70ehRxwUxtgVGis+MAfoOhiJjBoHXTUxFj0sA2xZLwphgoC1SAPlMUOjLAijHBIB+1wYCxyQgr+pbhIwJBIq2AWBcKJa+NgB8ZiCV8F4icFyRQp+2CcKYUERoWxHGRWGU9woE3lddAMl7g+hRnwtQ+gYwxZhooG0gFowLEuwboMDPTAnpN6QIfi5iSLu1lDhOkeK1LaRgXEJSbdVOQhwnIryqbaFgzEBi0bfGeFwRU6SvEML4ApSk3aBhTK1CeN0CZpxQRGyLGDgmhQh9g5IxawKQdgPIqDEBirYDSDEuMNBu4LHwMwlI+1tMEcYlBv9aYgGOKRHbIlUaPjOl0LeVgI6L50Hedy0xME5NyKveWwgeFwoUfYnEMRWppC+QZJwYStK3II7TsrDoKwIcMylA2iagn9MCgPcWCcesM0TS7wLwqJ9vjNB2EFIZVwRoW8Qy40IDfQMUMiYItAWWwLgCQN9SAfxcKtC+KRQYZyLw3nUHgHEZMa3ajrEYU0QqbUce+ZwkUNrvUMSfU7AMbScqxzQUQrsJiWNqBbBtgTBmSkT6UoAxaxKDfQXAnxoX4pO+FUgxLgTtmwIKx6kE+36EInzOx4LndYuF1PjyEG1LSoTPNKB9pwjgcVkmvO5aFYRxBo293ksQxozKU2k3BhzfBKvwrxsBPxeQgmorCowLKCF9C8iYsQLQFhXg+KaAim2lQD7fuiBSfQHAqDEBnupfCFKMKfDw2SopOaaCaUtiRY4JEvo3UgbGRCz6DZXiyfgGYvqmDBSfqT6m37VFZJxJAa36UoDjIgKVvjElY6pQ8toY5JiRlNi2CTBmpADaooIZF1VR6DdAOWZKAPpGQj6zTpTQNho56meGCH1HkcqYiNBuAAvGRIT2BVLomBik31gFMK5Hgn0nJRSfiUjem0KQYyLkaXfdAZNjEqx61WsTqBwXAJZtk4oZEyGFbYuBMUks8L1A4phKEZ62iabGKQVqW2LFMfErAderSOCqKyD0G1CPGhcitAUqlTEBsG8DlIwJAG1LKGBMAGkbKYAxgUjbUCqOiUbatgDDuAhgW7UN6jElYq/XV2L4TCCh6LcV43GpUtLWA5AxgxSh3UHCcRmKCu1vQplxapmStjWBccbbxLhfGOCqK4h5bVUc9T5DLPt+UCh/rphAuyGxYFwo8rqposRxEaFeX0IBjlMC9A0FwDFRsG2KiIwTIvRd2xD4ORGwVdsEyDEBQtm3CBxTxSJtA5pxEqlg2wBwnEUKtS2DZpxYEOiLgI5T/3mK4H4BJlf9kUDaRoJH/cygpO0gpnJMAavdIpQck5BUW2AVME4pYlsJJea4TIjthgL0MynBtuI/Esx5yIOu2kHwZ5Iq06rtJMAxhWjZN0WSz0mAgr6hgOOPQgF9EdGfCRSQvkDCOKEA6RsAjhP/BcDVTIRZEwDaDgJHjYkY2gKAYlwYtC+F+BuuI0HYL6Einz+xIG1BSvG4eBLzXlpE+EwR7Av/1Uc8B0HYtYmYYyKGVu8FhoxJoVT6NgjHTIDCtsogx9Tgr/htCGEexofotwOQOeA3z2+eK89v8jz///VXH8zu+FT846/Rp/g2Y7TEAPStKD7EaGR1IKUlBngtCBVAIqF9HygSBGLlfWuheSgg9fSFgQgASbH/A44fS0GZIGgIAAAAAElFTkSuQmCC]]></data>
	</file>
	<file>
	  <filename>/jQueryOpenIdPlugin/images/flickerB.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAHgAAAAgCAYAAADZubxIAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjM2qefiJQAABtpJREFUaEPtm2tsFFUUgCkRSYQY23/80aghmmgE08TUBOUHhVoSExOBP+oP0RSVh4miJSCUtNTwaGmNPDWIhiIansUiSOVRoKS4WylCCu122y4tfezu7LO7W9jdOd4zu3M7985s2dLusltmmtN27vPM+e459955ZExgj0z5dP78+dk5OTlZXL5+mloWyGhoaBBMJlMjEaVmzphqErDPlZWV7QYAhyiKgi6pawPCCA+H0+k0FhcXL5w+fTp1UB6wlIGFsDDWIn91SRMbBAIBibSRHOigmt6LcEkZcwgGdbBpApZ3wqhjIuRsBjImIFwcCbrnpnfkkiEz4To65+pw09RztTwZI7LkxbL3DgQcOuBxAjgaiY2SF7/3/gcF0ZVYygAWHA6wCw5wkL/6lPFgUwYyzc7OzkXAhamwakaom2t6Yca6Dnji0zaY+LEJsla0QbXBKkH+8tdumL2xk4qh1U7hn7pqgzUHe6icvzGUF+8AcTic8HZlF20/d4slrQcYMk0pwCuq7sCEj0wq+bMxAnjulk4m79x1GwVcdLiHyas42Ttiz0fAWSvMtJ3JS9rGH2Cch2Xx+h2QLOkWBJj8SRsD6cU17TCzqAOaOm2SHvPKWcAXblmpfuuPsYC/O907Yt09PocKsMcnjLidZNlsuH7QITQ9WAk4mf+f+q+fgZtb1gkeAlWpAw/4YouV5l9qscHWv3qpGNptTN14rgUNxnuw1y+MuJ14+hqrMrEgawLGTnH1JYs/4IdkyW8NAgO48GCfqu+88ttMmUstrlHp5/Oz1+fz+1SAMW1UNhht/fswUPJS/o8sVR7MA45VeSzTS6r7AcG9up4Nv8+vapfSUepb3NKgyyvvYgDL6ZhXVS/Q8ljnmNHJDFYsY7EOwNoj/fBaiQWeWmYmCzkTPL2yHRZsvwPXLV7wE+C8B2Ma1hXcfnh3ezfTh9HskfKCq2ohlFcVkYI/IOAegOBXp0GcVgHilE0Q3HpZpctY2lCrrZQBvIAYTWthpUw73hiBNRzg4mor0873tTbGqEcMTshcPrSA4vvEATEc4GX7epn2F+/poe2HcqsAJmyQJPzSLgh9WE3PMe1eeX1qAA7fHQSlhAYDkGhZGAfgE/86JT3yt7IefKXVTfXbwAHeQQDLul++5YbHyYqYh/rkUjNMKoikG0xuCJJwyHswpp297pK2bHL9l9eS9YHHT9sX5w4BFqduBphYygAO7zEm3I48J00P5gEn49zrJeHP5YfKUzYGwMoDfVI6yqA/IA08HvA/Jg8dkKXHWQ/e8bed5s3eyM7dr6zrhMY2j2R0bPtkkwsEZwQYD9hFQvOzhR1Utylkf36DhHOlbZSAZU8W3/wZwj8aIbyvCcI3+5jyY2nXWA6YMoDli9191s4AXnOoX2WUBwHcY/Mx3vdYgQlauwc0Da4FeMkvbGjeWyeo6vKAxVkErs+fMKjxDhDVIiveiokolyjAF5rdzMCZWdQZ0/A84AwSujMUoTmn9Lbk5fz184DD+689dLioowowPgdmRCTnSZJddZwHk9Uu33d+BTcHd5AwG9VvQw0Xos/ZpbzzZAWunHuziy0xrykYVofoWYrwjvNwbbNLVV+cNzQHY4gOXSUDIUl2o/3w7Mj5/QFrVFINgjEqowJ8lADm2s4n94mVsK4g4GgZTcAk77aTDdGTSIi+2edVtY3tBEU14Hqzm/HiZ75uB4FsnZS6iWR7JM+9EuDmO5rtJ8R28kB6VAEHiQFe/9bCDIwXVnfABbJqvkc8FqGa7QPQ2k/2rhqAMW3RTvYe+eK9PaTsULTTAcfh5YnyYPSaOrKdwsUVv03KXN4GWWRvjPPszvP2mIBbCHz0fLk+lj/WRLZu0etKB8D4PFh1iJC8nx/qXAyAb47aVb3nV7KeZOgI0DKlNeytzp3nnEz93w0emLpUvReWoVXWOiEshlXbJExDK3x+gJ3jp33RDlZvMNJH3n4mRIvN1qRZToubPPCUc7AmYK3KiUqruTYAc8q6qfx00a3qavVhG1PmVu9dWmZ/g4fJO37Vq6rf5bgHqw7ZYEaRRfG82QxvbOqCM80+IK8Hwzvbemg7b1V0S2l4WD0hmFs+pB/quu1M5IkNFJ4BmLOPimhxJcpMqnYRJn8oAEce+Muv7CRNqxToKBwWIUREBpgCKiVCBbP0yg7+wvdpE9GD3ubDswC+SElfnY2+Ex15xqQf48ECZtUL8PLnKuPh6h7xazDTV2YVb79n4hGFbH7EDZQ2l88vsuRvlGJ9eIbfJ2UifZyTE3HPWW+TfSQ7Wnvgc/LofWez4rskieOwkNGbS0pKFumS2jYgEfczdMhoSJbBMnD/B/A1g40ZQkVjAAAAAElFTkSuQmCC]]></data>
	</file>
	<file>
	  <filename>/jQueryOpenIdPlugin/images/flickr.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAIVBMVEUAAAAAAAAAAACCgoLv7+8Fbda51OXi0d78//j/AIT////9UfVSAAAABXRSTlMAIjNVzLtjHUcAAABJSURBVHjahY9BDgAhCMRgFJX5/4MVD7saTexteiBURLGgY6fMj5xUEPs3EHDjKoqZFbK6e53CAtKDt7jfWHmLhuP1La6NuCO/A8ioByc+DEj8AAAAAElFTkSuQmCC]]></data>
	</file>
	<file>
	  <filename>/jQueryOpenIdPlugin/images/flickrW.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAADwAAAAQCAYAAABKkhw/AAAEpklEQVR42t2Xf0icdRzHb62iahAUVBEMaMAo/DtwGytWEbQiKAiCgHIzt8aYVIy2SnGpNp0sh/n7VF3qdqnYqXrqprZpOvU09Tydzz3367l77od3nueld6br3ff7ffArBsKdCGAPvOB5f76f79d7Pd/Hh+dRrR+pqamPEI6q1eqLWq22urOzU7ebIQ6/VFVVpRGntwiPKZYbss/n5+d/q9frR6xW67gsyzaXyyXb7falXcyy0+m8Pz4+PlFYWEjF9/OdpbKCIJiI6IAkSUvkHNFgmBZQ3G5Cer2Apj4BYwYBN3pMDOOM0jM0acK9CROmWN6anhFlbuuAieYdhWyir7S09DJxfZIKv052dtjtdg9YLBZEiyBaEPedCaoTAiOhRET9HTPPwwYz69v3hdJzrYXlLfmsWJkbf8lE844zOzsrZWZmfqCqqKhIIVdglAjT2wDRUt9n43I5Witu621o7Lfy2ui0jfV9eM2Cd3LNaOhneUsSSixs3qEfRJp3HHJ7P9BoNAWqlpYWjdfrtZECoqV/UsL3GkXuidMm6EYkDBkdaBqwc+Hx+w7W26WX2PiUiWWGXXKieVBCoc4OzV07LDYnTpQq6x1ON7Meg+Cg8yhk3AHPXSO8ugm4pszw9k5hvrgPspmJRI1Op2tV0ScaEV4mDylEyxuX+a3L+bTYAu2gg+dJwUl7+S1d2CGx3DfpxMEL4qa5V1slnCyzbQjLLrx6yczy21cskEleiS8DVOkIf3QT/+zNYOceoxWx/G7qyoR9Pt8ykUa0lNxy4r2ryo48mmTChZsSbvTJaBmWucSU2U17uXBRlxMutwcHLyqyzyWLSKl34HydhHa9C4lqO6sfybAgo0m5cC98KWLG6qHrEGE1k8SeDKy+XIDI+7XwyuxvRA0X9vv9YQJioaCTyVEhXmvXu7nwjG2O1rhwyW0Xeie9fLx+wL1pvc/LJVZ/6bzI/k32nBTw29BGz9+HFOG1Vwrgd7O1Y4YLBwKB8MLCAmKh6JZ7XZjXOsbmuJAgzdMaFy7r8aB5ZGN8TPRvWi+pUtnV/V+LeDhRwENEuH10jo+vHi5nwpEkLc3bgQnTh1bD/Py8MxQKIRZKur3rwrzWNeHnQmZ5gda4cPnvXohyEHsTlfHEcicCwUUsLi7C41/EqSonqx/NsiFBrZwf+MZMx9g6a0cqmPDK2Taat0VHR0ebqq6uLps8tv9YXl5GLJT1+taFea3bEODCVk+I1rhw5R0fy+dqXLzn6bMink0WkdXsxelqpf7aj3aYXCE8fkrpOXNdpvOIcCUTXj3XTvO2aGhoKFelpaUdNxgMRnIF7q2srCBa2v5cwLEcO97Nc/DamCVEawxPIMxqx39ysNwxEWQ5HImgsNuP+AwbXvxKRFyKFb8OBZDX6WN9yXVu1pfTPsfym1ckiO4lrJ3T4cGxaqz+PETHY0aWZW92dvYn9E1rH/lgyBZFcXppaWlwbW0N/zd8Pl+gpqamiLg+s/4+fYB8WeQZjcYZh8PRHYlE/gqHw5HdDDlCwWDQQw5vbW0tlY377xfTU1lZWR83NjZe7+rqop9Yu56mpqaa3NzcBL6z5PgXE3NWDmDLxtEAAAAASUVORK5CYII=]]></data>
	</file>
	<file>
	  <filename>/jQueryOpenIdPlugin/images/googleB.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAHgAAAAgCAYAAADZubxIAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjM2qefiJQAACJdJREFUaEPtWwtsU1UYvpVgBIzIKw4hwZAQRqImsGROMYEYIWQaXxHDSwQDZLwEBQRdAjrQMZjIeIg4FMMAxytAkcfcxkRhDx6DscEGa8GNMVYY2xjQrmPb7/n+9dbb9t6t6zrWYs9y1t57/3POf/7v/I/zn1ud5Fi6yZfh4eEhYWFh3Z2eBy59SwK6zMzM24WFhWdEVXJWqcmmALZ/bGzsRiKqaGhouB2ovisDgRFKRWVl5emoqKjRAwYMsCuoM8D8AEQgRivxGah+IgOLxcJInxYFCqqqvQBX0BjrqCYArJ8A66yENsUEyCEOIOMGwMVKCGiuf1suGWQHc23zuQFw/VRz1TQZFpm1WNbee5aKAMCPCMA2S3yatXj8hA+n2SKxdgO4tp7IXGOluvqGduPBHddksVromOEYrTm1mialfES9vu5JBSUFPskzMA0JCXkdAC9sj6gZgK7Zc5nCF2bT8MkHuQa/d5gGf5xFM1cV0MHMUo4M3RH8w6KxNjwgk9lEq/5exeBOXTzVp/hTygGyazeAU7OvU9CI/RTxZSLlG0rsQNbWWkmfmkO9X0kg6YWzpHtuA6VnG3xOiJtyN5Futo5ifozxOd5kkFUBhh+W611zBbVFhWZKwTtIf+Rkk/0/P/RTQq2obBs+WjM3JcCt6aet2gLkZgFWgu2t79BWXdhRilqZYF9IWn2nncghaLS3xvZmP/DB0ODNOza3K39aC0QVYAgA0ZdczRYzebuOi7lIUs9FYnFZW9W31XKfSvfvoLJ10VwNv+8m3NPi9151GVUZVttrQfZ+Xjxa9Lfu3KfsgirKKzSS8cpV/tyVauB7aAOApWkSA+zcR9mfyXa+8F1+fuhICinrP0XX+Lo1MlbipfwOLF002Blgrcae3jcWXafO4Xk0/K1Ih4XU0v4uZaXTkdBBdCImii4mJ/HnXz10dHFQD8ras9Ol78snY+hU4nACqKgnD8ylG4c6U1VyD75Wjl9ba6Ev4gtoypJj9Hn0Qeb3qTGlHC/gurjsHtMvz/qGAd6+L/E/hbhbTafGvUF7P4mgnN27+DOvi8S8YsGgHQCVP2WwWzp/d+jbBWBoAMzzpBkrPAb48rkztPdpifCpnCi0LONxiVJ0EqUfPmx/BnCTVzxB1gfkQH/VcJ5KtktcM9JP8DMUWJj3p2+206JfKTiJgz18l8d0BrhOtJXBVfJ1ft339Jsk0eI3w10AVgLuDmgtoVEFuN5aQ8paV2Mhb9b5CXdYWADYk36rzWYqfHsoLX9piGp7aHJeB4kWBT3Dz0tKi1hT927bqEoPTa7VS/RtRD9+jsgeC/BsTo4DfVR8Jkl9MtjyyHx/lbmEpEmNGox7MMUA0nS70k5jKjEy6LP69SX9hh88mrMnckIbtwB2Bry11zB90osZHBl70lfxrnjKe7YjxU6aqNq+xHCZTeICIeiiklvsb7PXS3T0j32q9NBiAPzdeIkjdV6AXRNYo5X8wbVIA49Tl/7z7PcZYGGidwrfD9riyOkU20FH5eXlDPa5OZNJP2E0WxNP5upuG60F0C4AY38rDc7nIAtBj9Yk4K+yLph4fwzh4jsKhAgzDHOn1hY08MMRHTuwYKsvTmHzfGBvgio9Z8/SOjHA+RdyaebaGwzk/Mj1DvTwy1KfHazB8riyBssAm8aOoLXCeqRu20r5W34hLDZ3QWorOpcgq60Gkvu9Uy00RCQvICxsk9TGQxCDLNbYefs5w4UgJ3jkT0wLrYAJhsnT4hUmHABfys1lgKHBv8ZN1aSvOh5M8995jMpvlnJCReqaxAsQvMpj8P0Os9gHy/eWpDeaaBlgmGK9sBxwB20tR3f7dwEY58AOtUFce7kiOoU/Q9ByxVDg2r/IRctjsu/rfYg1CvewFcoXQoQpxLZFjbes0IE0RtDgGQIsu4/VmMc1fXcGWO4LkTLA7DVkJadK4ZeRPsWeXDkeA2yLonEfwRR4W9ZX+H/FHLwtP83+nLET180DrNLIZRG0kMYsthKchhTA9Xj5CPtKrT6Rp0bGiwG2jXPo3VGsKdHhI13aVZSbGHwOaAR99f0a1mDZTDuPgyBoy1wdpSWJQEkxj5smE+06cMZuQWBtnNsiikaiAxqMZ9B4RPCo8L1qc4LAWys/TSX0FYDB4PWym2wGEdDA52H7pDZxDsqENnHUbZsAImmAiAqtUbbDftMZeOxzASIqAJXpIWwAD/OtJfTorYUcM4SEO44DepwkwUQjFy23h/+FH8YChCUpzc3iZ1VnTzOv9VZxWtZChWiWXrZMvgQwmIY/GzU2lqROn5H0ZDybwSnROQShrt5ZTAvizrLvBQ2bR8UE0BZAIlqGtmB7BM1GYgGnPc5CgYbGzg5ikLE1khMf+K4lQGg/AywsDfwyTrr4OFPwgQzYsOhhFDQqiEInhlJcYpx9XFgPxADgDYsQgP/82qsMcrNgeQK+mwDjPNilNFDb/8Gs7tGncdCFk6Xo9Sm0ZU8mBzwoTXGArQ0yWag15jvNcgsNhkZDs2BSXfoWiwNuAWAiyAMv4AvbI8QNWHANgkbZDjzijFh5D0kPBHnIuCGabkspquGmtFLycaEqwGqNH9V7ZvM9zmIBRMQFygKfzHGDsDRrf9rtUyIAmM5FAXDjgb/8yo5Pcf6QmYnXC3MsArrCwkuqIyNDhZgB8YAfFSO/soN/eJ/Wjxj3OqvYc0NDsXXTKtja+ZoGNyUIvEhpf3XW9k504xnT/7Dw/lwEUwjq1AoifeyNcczpJ8Xo8gK8/HMVP5mAV9lEOhLbIUlaxqYa2TSYbVRE9wi8kGf2k2K0vzKrePu9G4oNZKOfTMTrbGJLNieycXuGY0NktpBD99XiHGTJv1HS+uEZfp/UDejDJ7ub8wzQOR6zPkx54IwY44liVPwuiXFsEmRo89KlSz8IVN+WgbC4M6CQNpMsA+sA7r+ia/UAHMI+DAAAAABJRU5ErkJggg==]]></data>
	</file>
	<file>
	  <filename>/jQueryOpenIdPlugin/images/googleW.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAADwAAAAQCAYAAABKkhw/AAAGqklEQVR42tVXC2xTZRReEo3vqDGqQcQYY3xrDIZoREWjujjFRJCI4hAUQI2AKsQny1CHm4yBDAaDvWDdxubmNrqxFwMYaUdZ17Udve36Xtvb29e2dmvXlcHnf26yEsEWSIKJN/ly//ufc/7/fOec/9x7U6aujIyMqxleKCoq+r6xsXFvW1tby/8ZjEN5WVlZJuP0KsO1UzynyN6Vn5//g1Kp7LHZbGqn08m53W5+cHAwfD4EwRNVnPLEGo9YY21yV8zGD8Vo/kqix9UbK9WXx3Lac2PegDcmCEL0YjZWq5V3uVwGtVqtKSgoIOIz4pklskaj0cQUjjkcjjAb43w4HE5IZR58uUWJwv0K1B5UIXvPcTy3Qo531+ug0DhI74rAH/RjQecipG9aDOOAEV6v95JtDQZDzGQyOXfv3p3NuN5AhOewzJ5kGT3GooJEKGoLYPXPddDpOHHDoaEhES5eQOonpWhoPorx8XHSvSKY174QS7I/hp7jaN/LsrVYLGf6+/stWVlZ76SUlJSsZ2Xcy8qESgH/BsVACLMXV6Bb3o1AIHCB3O0JgFUGWNDicx6PByMjwxfonpMLBBpfEua2zMeK3E9hMhrPrSEItM+l2JN/0erq6h0pUqm0mhnpWTkjETbV+jFvRT6cjJTP57tAThkniGPeBXfpDjiKt8K0YR2sH82FoJDH7YJ+BTzcerhPbYZDPh9C32r4fQ6SiTpNMgFlrW6s2+XE8k0G7KzRwhcYQeqBt/BF3ipYzGb47DbwBZvgLtoGy5K3YfntRwyxRCTjwPrS2ZaWlqYU6mjM2SBlJxHeyxzAsm92IhQK0XNSeHIzIC8vEaM6PDwMXeZaHHjgVvAGDtGIE+rmmTCbOHJClBvansWRylcQHAmiqiuA7ZITou1fnWZMe6MBVXUdIpmXGl4XCVstFrjYHlatGjZWrj69DjX3XI+jlRKqvqS+EVeRsN/vj1CGEuHxJWosXF2KsbExJNMb0/aiY84TUHR1IRwOi3OhQRt6Hr0dVWtWIsz/iP35z0F3SofR0VGIcscOdBRcBYWsFR/9ZkDezhpyXJS9/rUWK78rZkdjJE6YiMreeRkauQzOfbtgyc+BpqMVihMKBPz+pP7FCbMNxhmQCKlrOTw0t4wZ+f4xb3ePYh8rP2l3AHulRoS7DqH+yek4caiNCMf1Bj9Mw7Z334SvbwHKfp8Ji8kcl0WGZJDvvQb1+/Pw8ioV0tdWUVMSZUuzepGZUwKe588Rlh1D1+xH0L6nAILVDDeTeT0eqj4xMMl4xAmz0hol5UTYI3VjWloT8sq6KTPxeSsfgpaz47M8K5Z9J4Fw/DDa770OzZuziXBcz7RsPravXQ6n8gs05F2D/r4+6uiibHxUhYbNt+CgtEYs44ffLoOk2YAGWQCZ24+hV6mkPc8R1nPoe/peNP60jkhQ1cV9uhiIKzWtWhZRExklQmg0jLQ1RzA9rRF1nXYiQ/N0F/FTqRfpa3ZBcLvRzZpI3TMPYsjLizoTNjP+fON5dHUeQsjPoVtyBw7XpMfXGLHloqrwEyh7ehCNRuF0Cdgs0eGpD5qgVp+i80u6/zjDxl++ReN9N4GrLhcDF2HykN+HZByoAlpbW5tTKisrc1iTkEUikbMMSASPdxjL1jdhRqoEizcoUXPYgyOqYXb3Yv43Lfjh50IIggBWKuj4aiUOvD8XusI/oNuSBY3yJHPUKjrn4zVoLkrF8frP4dTmQq/YBuPAABET93H7o5C0+3B3Wj1eXN4Kq8MP/2gAC0s+xILs9yBVNCEyMozOL1dA8vCdkL42C6oN3yLo9WJiYiKR/xS0s7W1tcUpmZmZaeylrGNRkJNBMoTHwtBoOZRUNCO/uBnVB+RQaQz0cqfXBS0s6o1HxuF0OGG328XzN8zOZCwWIxndxTIctNsZBsG7eASDQYTGYsgqt2CrRIMTKjMOHu7DrPQmzFlaQ9khW+rspE/O07PYiDgdB71eT8FO6jtLKp+Tk7OIvrRuZD8MOWazmWMLdU9OTuIioNKLlzONT58+/a96Z86ciY8vJq+VjWHp93Xo12rpvIlO2t0hzHitGOq+vmRrJNuHfKPACBKJZCfjetvU9/T97M9iq06n07MXdCcjEWDlF/0v8Ws5j9npFTCZrJia8wxNTC5aVwtVby8FdvJy1mMXNWI7y6yroqKCyD52/h/TzRs3blxYV1e3r729/T//netScKZ5X0nx5qoWZBRqA1sqNIHtNQbo9BbxeKhUKsXlrllfXy/Jzc1dOpVZuv4Gq8VxvSSDAaEAAAAASUVORK5CYII=]]></data>
	</file>
	<file>
	  <filename>/jQueryOpenIdPlugin/images/livejournal.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAA8AAAAQCAMAAAD+iNU2AAAAPFBMVEVKSkqCgoISM2YZQplEWpJOl8dUf7RancpdfKBhhrJrpM9xlsKAsNWCgoKDnsyMjIym0ObDlYzp3Zf4wZ83KKCZAAAAAnRSTlMiVcogLmMAAABiSURBVHjaVcnREoAgCERRQioRVNP//9eUsWG6b2cXgFsjJN4BSVuDqFUgXZcNUVYKyQdz8MFMNqgKopnjGqg+eVsJ0517H5+Fwln7cAthHvPH7TXM3JbbMxdnmRZVT+DgXy+J8Akzz5cMswAAAABJRU5ErkJggg==]]></data>
	</file>
	<file>
	  <filename>/jQueryOpenIdPlugin/images/myopenid.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAFVBMVEUAAADMzMyCgoKMjIyZmZnMzMzW1NZEVavIAAAAAnRSTlMAzORBQ6MAAABOSURBVHjaZc9BDsAgCAVRnS+9/5ErSrGGWaC+hQmtdfvV5/u56s3WidC62AZQSIDwoYCoAnygGT5GAA7DLUAIdMOWhPzkAIiEKyvLlfVfd8QEkZ65rL0AAAAASUVORK5CYII=]]></data>
	</file>
	<file>
	  <filename>/jQueryOpenIdPlugin/images/myopenidB.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAHgAAAAgCAYAAADZubxIAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjM2qefiJQAAC1tJREFUaEPtm3lclWUWx6d/ZrJyypxm2mY+1WTbp6aFFsdm0sYpPy4joaEpZqW5RC5oDbikJjhaI06jucumoAIqIDsi4ZKAAsoiKMJFCIj9sl5AQH5zzrn3vd4N4TbheCdeP4+877Oec77POc/zLveWnxkfg5TLMWPG2A0dOvRuk/L+y5vLArekpKTU5ufnp1MylKyuWzEJ7COenp47AKi7urpq+9PNawNixIe6rq4uzd3d3XHIkCF6BzUFLAVciStzK/rbn2zEBq2trUI6jQ52UIvey3CpjqoTbf1gbQSsqRPqHJMh2xlB5gyGyzOh33NtO3IpkI3CtW7N7Ydro55ryZM5IosXK97b3Kq2WcC1tWqo1bYr/48dNXWROE282Gnau7N1OzGbAVxDQI+fK8TiHScwblUkXv0kBK/9PRRvr4nBav9k5KjKbEaXHxuu0h8ztbOz+ysDdrOlXXNq7ncYtzISAxy8cOtbuuSw69o55d35tg/mbzmGku+rfrKgmanNAQ47eRH3Oe0RmHdM3oZH3VZj2MaFGOUzC2N9Z2L4Vwvw+CIP3D5xh9R5aeEBZOWX/iQhWwTM67CSmlrUuJnSiWwVBr/jJ+DunfclXvWbg9EHp+OtECdMCnsH0yIcMSN6AubG2mOy/7u4b8a/pO4riw6ipKrihuuibqzB1sh0HDqVI2PHpefh6/A0fBGcgjX7k7E2KBlbqPxUbiFqGqp/VPk4TPcI2BD2//qcDWC34IAWrss6DN03C68Hf4Cxh96HQ+g0E8BvYf6RcZgb7oAHZmyQNh9v/UY/cW+ULuXqStwzxQ9jV0UQvFq85hoiy8qQD/fh+fnBeMY5CL+iCXsb5Q1dfBDhKReknjXydeeAFgFzx7z7UlJLawtuluQdd15ADZy2Gc/u+QjDAmdi3WkvFDeU4XJ9EdYmrTXwYC3gxUdH44OgyRKu757si+zCihuqT6W6Ab+esps2gVHQtGgw3DUM99LyUlXXIHI0aZqRX1qDXTHZeGTGXtzp6IN9iRetktGQl+E5szTzYFPA3TXubb66oQllVfVoaWkxmjicV1PXZJTXU58jl4YL4Ac9PsPz+2ZjTOgiNLW36B7FApXNlRSenXQh+hpgt2/exHNuK6St+94zZmM2NDWjuJyWomZNt/KwvKqyWjM9DGVmXUsq64zqVKkbdYCjJX+462Hc/64/NBpje3A/mQUV+O17AXhwur/YrCd79FTeJ4AvFlfjhfkHEZd6GS7bT4rAPINHLY/ApZIanMsvx1+WhEseK+rmnSSgx6+OxqjPIlFbbww9MDFP+gs8lodf0q54wISdeMxnngC2P/wpOq526gFr2jWYFTPdIuAJ22cI4LHkSZEpKukzObdUxn/og70SRod8uB8bDp01AnQ88zvwxLqHwujgyX54ccFBRJ8uFOPHko52dB2Xdhnztp7Q6zrsk1AknS+VOtYA5vr/2J8qcm6PzOobwFevtMEwdba1wppUUl4rAj73cbDcl3pT6Fmw9Thun+CNETR7n5gdSPetJ+ETc17Kue7W8Ey4ep2S8/BT+UbjcWi7y9EXJzKKpfz2qVvxRMBHAvjPQbNxpChZANPbLoTmhVgM0ezBH4fZ4+fjvfEsyRV7WiV9vexyCC8RIJbFN/Y8Xph3QNZHz+B0kSGVJgCHU3uafAkE8SilN5dFaEM9eVtkUoH08/is/RhJk5b7+dw/ReTlcFtZXU87d60H/+3zaHRQSGYbPEATu5282ZJdz+SUiq3mbjpmld0t9WXRg00BW3vNCrHST84JRE1tg0wWHnzimljJZ5B8zfnlFIbYK9ij2WC3OXhj6hfx+glWWqEmz9oNpy/jkXGpXHtb5LRFD/iPtAaPPDATixM94JKwBJMPT+kWsEvUWAH89EdBBLhQ+uJzNcmr6Mjnj8zYh/un7UEFwRlPUJ4iPVgnpY4ik/PXxxCjmyjssa0ajb7Oav/T0n9AfC7qKSIxYO6L9R7hpgXcQd5qybY5qkqJVA7uMRbLLbXpzgH7FPC8LceNBFyz74wonZBepM9nJf/0aagYlYUcuzJKjPs9rWOsiDd5hLbNZQHB3jXAcQee8HcWDx4W+CEWH1uPSFUCwvKj4HJ0UbeAnXY74Rf2XvSkK0wP+CsKx6YG86A1mscMoo3OwIk+eM/zKE6TVxkmDuUMKppCPdf9d8g5o36Ss0skn0FbCzgrv0LGfd8zodeAr+eEZpssaz3WtL7iwbz+Gpatp7DHSieR8ko+Q2XvfZjWQM47QOss1/GKzhbgo1dESiRopk0Ql//BOVjKH9rgKoBXJu1CZ9e1Nbi5vRmuiS4W1+Dha12kLU88xYN5ApnK76fbqa/ak6LdsZOxB03yNUsvLzyIqGQt4G0RmUb9cDTi/GW+SVYDjkzWhv1/BqX1DWB+D2yUuujaiqRu1oZol50njdqtP6QFfOpCiT6/4yoBpg3Mw7Re8Rg1TY14lO4P36ANWWFFjYTnFfRMWRl/+Z5k6eNuZ08CPAfnqi7pN1jKSVRBmBlgl9hxGOz0NW6jte1oRhFi07Uh2iuOJpKJbttjsqRsU/g5+bt0dxLK6+rNUnVjA6LTdICjMo36ySrSAaa2dRoK0VNpDaZ1nPUdsUS3BnfS3sZkbC53XBcnkSo1v8wqu0tfpuzo2syDLVWyJk+tMQBsMOD6EAPAuvyOLgPAujxXn1PiLSsDUnDHRG/k0XNkZfyiqlqBfis9c/79uqXIrC4wB6w6bAR4UfwY2C1fJrBGLAlDC+20Y89qAS/ceQIsg9I/n493j5J70dSCMvzu/QCMXBaOtk7aEFkwXnS6DnA0ATYozyo2ANyiA+xOgKl/PWCCadiGy/wSckRnx3WxuNLNmBZZKBPFFgBn0uznTQY/jhzzeZSZoluiMgTOAHpwkXC+0Azw3hw/PWDnGHu8vMpN6v+GvOgMewUZQQHMu+Hgb/MEelNbMzZFZIj3OK2Pl3rLKGKw1y/xS0IZPfZjCHwrlllUjuYrGvxQwPfRPqO6qQENrfSMQF0nUW3O5kQMJL1fop19Kb0ls8ap9JHAFgDzzB21IkKgBJ64aKYoly/2+lY2TAGJ5iF6Z8ZmTD00BaO3zcWDs9dLPzxZgugFhWI0BTCHQzb2M7S2Pzk3UOry2FUUfrkuA5i58RvxKt75vkjr7lNUj68Zyg8FLPsI2nc8RrdXfBvG10Po3I0mUmWDdmyrUi89mN8Hmx1dsO5fe2cnQpIKkVFYbdQyr7RO8msaW43yj2WXISatWJ/X1t6B15dG4GkyemPLFYuj8xgbD2fBL/6imbzTN0Zg4KRtYjROT84NQmJWqVE/cWe/kzKf+Au4VFaHbdE52BCSSWtqMVppfEONO69eRVpBFbZTna/CMuEddwEpeRVgOcvrNKKTqrzeqE29pk3ys4tqwLJGnC7Ct7nlUudkzvcyMXfG5mJXXC6CTxZIf9zGOktfq22JmzJBDNdgi4AtNe6rPH5YselwtoRFnyPm8EzHvdJxbQetlL2xPBJ30Rr+yqJQbI44L5PE9DhyVnsb42thgvSVbn3ZL8M0PQwAa1/4K5/s9KUg1+tb3dSGVQGpEv7s3WPJQ8zh9Ua2sppmeu3WivaOq91W/38D3INdVPLJDv/H39P2xoh9UYe9ib3KYU0cahvNZ6TF5YM83vDgCNCbI548mB8HWgrxvWlvS3X4Q0r9p7O6b6K175hu8FFV34LETNrldnbveT2J1FvAHTQGh+7reXlPY9lIucrsA3jl5yo2okC/mN1bQKX/ZNbg6/dBfOggq/qtZxsWMN1kKb9R6u6HZ/z7pEFMn9fk//bZdH9749evfWEPfo/M/dKhMvhdknC8LmT2Zg8Pj0n96ea2AUVcZ3ZIXUhWwBrB/Q9ig7qoCyU4ewAAAABJRU5ErkJggg==]]></data>
	</file>
	<file>
	  <filename>/jQueryOpenIdPlugin/images/myopenidW.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAADwAAAAQCAYAAABKkhw/AAAG70lEQVR42tWXe2xT1x3H8880Vqq1W9WuRWs3qVVXylqGpm3sUTaJbWxDEKBrsvBqR2lJl1LBAhRSCARoEJHSqV1IMvI0ifNwYiczTmInBGICeZDEwbPjxPH77TiJjZPYJpDsu985k+9kxDapqJV6pK/u75zzu7/z+5xz7rn3JsXL8ePHv0RaU1ZWliWXyy+0t7crv8gihmqRSJRDTL8iLYlzxmGfLCgo+GBoaGjQbrdrvV6vw+fzeZ1OZ+TTymSxRdp7R2JNXdqYenA0arc7WPvnqajH4zFqtdp/FBUVMfBnhJVlsCaTyUygvS6XK0I2Pq0Mo0YcKLqEZdtE+HJyKb6yuQRL6Pqd3WKck/ZgfHyc+X2uokWcKikpOUusSxnwL2hlB/x+f6/NZsODyGiyYO37MjycUowVp47gN9W7kCJLw6vi1/H97CN4aMt5ZBZ1wmq1Mv8HFY/Tf3MMFosVGv04ejSjuE7S6Iz3+rKJduXm5m5JqqioyKYZ0BAw2wZ4EP258DKWphZj1fm92NC0Bztb0rFVnoo3W7fgXdUGJBe/RdAlqFZqmP8Dy2i24au/L8eQ3oRl2y/gx/sbsC6rGSv21OKVTClar+kEX9reixKJpDBJoVBIAoGAgxpwr+xOl2C7XG44SWTfV2NmOx7/QyWeOXUUaxv3wjc3iTuLd5Dbe1IAPtD5W6w6chRrDsjgdrsTxhHq/xkvPn6CKAfWx22zzYmlW8owbLDg8bRKDOrNgs9Hkj4+CQM63salVCpbktiJRsBROqTAJL2iw/6iK9iUo8Bzb4rxzieXUKW6iVXvSrAivQ4Nl3W8r0mtR/ye10634v0SNZbQ87q8MgPJ8kNY+OciWBHpyhKA0yp24GspFTjXNIDM4itIO9OG5W/X4me0IteGTTzeX2UDWL2vAasy6lkulKwXaw8340NxD1b+qR4vvVOHRsrT6nBzYO2YjQNrDFZ2v6DkEwqWl1BnrBx4amoqStBgauzS4+upFei4YYTe5MTTO6uw+WQLHG4f8iX9eJkGPFx6FSkftnH/fp0V39xRhfyGG3go5W94sTodq+t2I6enACJ9Dd5o2Z4AnC7bjCWbynBa3ItHXivH37sN8PsncPC8Gj94rwGqvjF8L0MCs90Dt9dP21SK+k4dntwmosnv5G1/abyB53fXwOHycmDduBNPELDW6GA5CTpS1s0WQ6gLwNPT0zESmJq7R/HTTBni9XUfyFEk13B7xOzGo7Q6OpOLBhDB4vThVHUv0j/uxMXrY3yFX6jIwDrZPqjs1zDg0+Bw14EE4NTynXxCP2ocwK8pdnwch9uPR2kC/pjfgZ8fakJW+TUuyoUn/tS2C+jT2biv1eWj078UJgcHhsHiZvlQXm7WL+hgyVUWT6gLwKFQKHbr1i0wya8b8crBJsTrvzumQGmrltvjdj/bjtzeeKIFhfJh/HBfI7qGrfD4p/CNrSI8nXMMFSOtiJfx4FgC8MuHsvHLLDmPueF4izCOPzDNY6fmKrH1rAr1VwyCBkddHJiu3NczMQUO7PRzYKPdhydobIPVK8QLBkM8t+KLN4U2DkyHljQYDHpmZ2fBpOg1Yc3BZsTr67MVKFfquG12BVhS3G5Uj2Elbb3V+2UIh2d424mqPiylbV3W1y0Am0PjAvD6gnRKsBSt/WYe81uvV8PmmeT3lrXp8BI9LhXU/qN9UngDQdbOY8/MzOApOoA0Rg9v80+GOLDVPcmACTzAgY2OCd7vnQjivUI1jxOYDgksKpWqNam2tjaPju2eaDQKJtWAlbbaRcTrr55WouqSgdt27zSW7ajidig8i2+/IcYnzTcF3/DMHPfPrh4QgAe9GiRX7sLKrGP8lXRWMoRIJILK9hF6Vhv45K47qsALb9dBrXVidm4OewuvYvmeOmzMaaVVksJG4z67qwY6i5+PMxWawWOplXD6g/ywon46a6rxk8wmHu/F9HpknFPDRf3kL0gqlZYn5eTkrNfr9Qaagf75+XnMRWKYDs+BbCZuz0ai3I7FbmMiOMvtQaMPz79Vi0CI1wVFojEMmwMCcE2Xia0CT/xir1Xwu3BpFMkn2xCejcLiCbJrQhz/9AxsvpCQCxsnGotx+/Ztnodwpby4v3OCtvtkmBi4X4LoKzKQl5e3nX1pPUw/DHkWi2WUZr5vYWEB/0+qISee212Lhm7zffsXFxcF4MlwFI6JMO7evZvgU9VpxKZTSmZ/5qK3UEgsFhcT62Px7+ln6c/iY4PBMEYfAJdp5uZiNG3/TRK18U7bDeud/+Wz8O+ySPb8/fpHbIH5lj4Lj/FZiMpsOByeoBKoqalhsN+994/pkTNnzqTJZLKqjo4O9ov1hVdzc7M4Pz9/l7CyVP4FU0jsuMljUgoAAAAASUVORK5CYII=]]></data>
	</file>
	<file>
	  <filename>/jQueryOpenIdPlugin/images/myspaceB.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAHgAAAAgCAYAAADZubxIAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjM2qefiJQAADp9JREFUaEPtWwlYVWUaZs2SaiLnsb2mzMkUyEQFRHArUXOyckvNMctMa0obK8sZQzRTEBFQUHa47DtuiJdFRRBkF1DZLqjs3MtlFdzf+f7fey9cuCA4+qSPHJ/Xc89//v19/+/7/nMO6mrKh678ctasWYbGxsbPdrk/cPlgzYB6ampqfXFxcSahc88aeuwmEfuGra2tCwDprVu36gfw4M4BccQOaUNDQ8bmzZvnDx8+XLFAuxLMb7BMLDMrRecBPCRz0N7ezpnOoIMtUJWrl5FLeUQ3cGWA2IeE2K6LULYwGcmGSiSzBEYuU8LAyn24LZecZCVzLfO5951ciUSC7LNlyMgrQ11d3X1v71EVKyOZWWS+iuWrt7Vdes8mvLa2FmKxWKm+I4n5GPVpEDTMAqBOeGVOIAQHsu9Zm48qmarGLbPEGXwVL/ls6UpZJNbvyWYrMu98x2qsqq7B0o1HoDvVHS9/IMBOn2RIpVKknRHhyWl+UDftDH9om/sjXJjX73YHyLyzG2GcGhoavscIXn83UXNtbR3MvwyGprEHDOb7oPRCFdZsPwJ1Yy8ZvKFp4ono43n4fONhqJv4qIAAE5YH90hwXHI+oo+duS2SnGJ4hiYhMvYMamvFPC01uwSeYZQWl4fqmjqeFhWfj7jkc93qDD+ag8S08zyPqOwS/A6kw84/AwGHMlFYclGRPyuvGIEHU1FfX09jKof/wQwI9qfhXFFHHiYwiaSe6iuEa2gKdgacgf+hLJwrvsTrlwuQ1ZGaUwq3sFQ4B51C/KmzVE6i1Dc2j9GJ5+EYmA6vyDTknhMp1XG3Ymac/l8ER8enQ32cmwzu8AhLwah5tELHuxM8FPhxx1G8s5DSjTxVwAt/mSroNmg2KGbmn33fB9qmXvhsw35oTmACEXCMXRaJlb8LoWlKaRN8OUYtDEJ2fgm0zQR4+j0/IqdCMZHpOUV4zFwAgyXhRFYG3WfWww8vzA6AppkfHp8SgM2uyTz/5JXBUDcPxFqbIxgyg9yJeRDH49OCsdUtkecpEpXD6ItwqE8K6cDkEAyaFoLdQRk8T9mlKlisjYHGlDCoKxCOdz+PRDrFICzPsbRSDFsQCvWpEQo89n4Y/mWToHJO+kO2SoKZH5ajpU2K3lBQWoanTF2gbugCrfEuSMoqhMVqmoyxlDbWVQEH/2RMX0WTphADEwWJQIbXPvBG8+X6bm1V15VDx4zykTBGL/JH3ClaJQdPQcuExENW4vmZvoiIzUBITBoeMyXxGHtjb0gqxn4WyC2FfUCqos7vd8SRCARYuzMeL83254JIOJ2HxhYxYlPyMcTCHy/M9IG0sRZGS0k0E/2JdH84BmfgfHEBdvklQXuSPzTJpRxJysUvu+MpjgjEMqsYiC5dRK20Dlaux7kQXpwTwscz99doug7GmM/DIaQ2krPyMe/XQ1wQpl+Fo6KmHM9/GAINEsYWj5OoFtcgNbcAwxZGckE4BKb0Ov+9ccOEcEeCO5Pd0++TmWex3j4eh09kc2Ekpp+F7kQnqI3ZyzF+kQ9q66vhGXGKhLCvE24Lg2G9XYxCVJ3bqRWX40lTEgoJwzU0medpahXjpRlEAFkJS+cERbmR80lYZDX+cIuDW3gKF8W4fwbx+/VNdXh+uie0Jnght7AY+gtoxZMYTL4Ig2PASZymSS0oLcXZ4mKe33gpuRiyEl9vjVbq19z1RJipL5EqRE5hCawFKWhopmBSWoX402exbmcMF8agyQFUF1kSEoT6xACk5N6ul0HaLKbyR/Gr0wl4k4tggnhzXhBqJRUQ11fxurZ7nyQRBMN8daTKeenLIlRJMCvIoi852trb0Bsk5F92uB/Dio0H4BaUhOaWFp7/YkU1PMIzaWXlo7G5iae1Xm7FCkvyw2OI/HedOdQJs1YHsudsKtupE9dBZ8JeLoqYZJGinldopTEr4RZ6WlFOfwERTELY5pqAhsZGvPC+BzTGu9F2rJR8bBYXxOzvwnj+vMJLmP19JB43JUtAQtAw8sArMz3h6Ecion4aLSGCjbzgFJSm1K8NTiRSEobFt1GorBFj7Y546C0MgPZEbwye5IOR85llEGCQuS9ijmdyK/GUuQv1R/X4rNyJYBKEBkF7EtUjg5Z5AAZNEuDLLcJe55+NpTNfnX8zLrut4K4E91RYnr7yt/1Q07dXYNu+eBSUVGCddQxmfB2CuWvCcDKtqEMwbW0Q0lbpR5sYrPnjMEKis9FCouipHbbN0jHeQ2JwgvBUGc93+fJlvDLDi6yDM/n8dEVZ/XnkK8fswzaXBJ5m6UTmkqzDv23iSUTkHkgQ++Ny+b3T2YUQXahERbWYgrN8rNgUDS0jd2iMc0WEMBdGi4l4ch8/7zyq1LfllkJuJRaR6Z31DdVJ4vgHCSUxvRh14npk5hZx1zFoog9SMgugQb81TLxwsbxaqR5732Rs3JNAvpqJQIBRJM6ScqkSzhUU8SDvThzcV4L1PiByR+1U4NUpDtA1toOaXgeeMXZE2cUq3lFG/h7fFKzfcQS/2MbALSQNVdV1PQ6CRZs64x2h9s5uIri0g+Dp7lAbvQceoWmKsnpz/SjNSUHwBQpwnjByhq6ZM7TG7cXbczzQ2trKo9PBxs5460MPlFfW8vIsfdwiCgJJEO5kFYwWUYxAgnhmkjviks6ikSwC2wk8aUouhkTgezAXz5g5cYvhfyBDUccP1rSDIEuhTbuKsouVGPEJuQISxHKycA2NTVyc3hGniXhPDJnqgcLSagw2v73TiJSJr40WwX7aEQyd7o0vLKPvLcE3r15BZ9y40o7eoD/DGmpv2yhj5A6oKcEWNi7HsM05HoNG2yoJgoljiIkdjh4/q7KdFjLdTxk5cAuRmFrC81wnszRshivUDBzgF5WpKGdIflXNwBF2nicUaZ//GsXFwbDTI1GRvsqSLA8JZOhkchGrAjB6HkXmZCX0P3KFRCyF0UIXbiGmLXOFpqETdMnMahiSS6GYYsG6/bhKZny1Fbkbch1Pm+7FzFWhGPERrcSPPfHce7T6KcAMPnwGyRki/JWeBzBRDJnihpctyEqQ2xhsSsKIOs374xuVjsdNXKFFohi/NBQGC/ygSS5j6HueyMgR9Tr/vXGj0kR3JfhO1wYW26H21jYZ2G8ZRtB5BJEvw7BpDtB4m/J1FQO/3oHnTe3QJG1SEpe8bZ+w07ByIFNJplyeFhWTjZ93xKKxXqpIi0/MxY/WsaipqlWkhR3O4uJ4xtgekjqJIp1NTHzSOay3jcVKy0P4fqsQ3rRyW8lXsjaMF1CASKI4LEzF8VPn8RO19YO1EPvJfLOyLM/VtssQRKbj601H8O3WWATTXrq9pRnpOWVYu02Ii5fqeD4x7dedyLevJn+6anMMbDxSUFZWpTTWElEltrklYxXl+WZrHJz9UyCu6xhbbzz0RPI9IXjU+0Ti8N9l2EpnGf5OZ44/lKEQQ3dRHD2Wp5LgO4lMldVpIzG0NjVi8lJvbjG+s4rsV93G8ykIJGEcPprar3L97ev9zt8tyOpvgyOnEcHDrGTYTGcZ3qTzm1u6QC4E1YIIpNXQ3/ZV5Y+Oy4LGSGtojSRxkYV40cwBlRUdq7ovbUxavI+EYYeExJw+96lJ2oic3BLkn7ugZG1Ye/UUgBWVVNKqrFfU19zQiKoqMbcI5eW1qCDIXdCFi7WoruqwOH3ps6o83Qhm74GVcIuue8GZ/HykpGdxpGZkwSfkGNRet4TaGwybukAuhM7nDkH4MZ90h/b6cr++UUqBXCJ+s4/Bbt+TqKyjSexnvUmZhVQ2CW1XWvtU1iXoJJ6l4FLTwA4a+nZ402I3EjOK0NrWjBX/jcQTY3ZB8x17DHrXDsvWB6PlchNWbwrHUPPd+Pi7QGiP3gWt0Q603YzAtOVe0KTf2mMcsWmPsE/t8/F15Y6u70ywikKqKpKnZeaXQe1vG7vgN7omvN4ZJAAmBDlIEL4RKSo72Vt7D8K9MwWl0NKzwYwVAtQ3iiEqr8DI2S6YvMQF/7UXUsBpi51eJyCR1sAlKBHqerZYt/0AFq/z51biP/axKCkrxvCZZDX0dmGjo5CeeRfhOfM9PABtv9bS+7zIxfvnEdyVcNXXPvTC4EEgrL99sPM6yYPMg/FZiv5X0/autLIahp+44jlOElkCIuDazTa8MdUOIyzssPgH2tZRgFlYVs7vzf7KjYuhSizh1yZL/KAz+ndcvtL04BB8hl4b6rz1SzcMGr5BxcpWJto7lLYx/bQYD0J+R5/jPLgMOkQuRtb/xPQC7BEkwGiuK54du51Iaub3rlxvxUumNtCbaY/Fa334rqNKIuX35nxNe3vadUiabhM6YZEvdAys7hnB7H1wt+MW+vfvxs0b/FFfV+yjsL+76e5CcEhyP1vrX9/uZe52Coy+/CkIAVFpKL5QAx29LRhpsQcJ9GozSpiDF022Y/zHTtjtTTEJBZtrNkXQq85S/PTHQb7j2OoUiyXfC7gwaiQtfNwfrSSCadchbWrj1xM+9YGOviVYW731XRVvcqF19sEqCVZV+G7SvEJpP9rNNysT7BWcdDdV/yllxJIGvDjOCmt+C+btC0/kwXC2A558ewN0DTZhzpceuHCJIvebN2HrEovXJlpj8IgNeM3MGlb2R3H9+nVssjuEVyf8Ts/v23gd67ZE4A2zbfTs+Sq/Xv5TIPQtbHje3g5GZtejE8G3X/jLP9m5X7PVF4I9AhLvV/P3pd5r165xAuUHfTvOHytevXoV7Hfn48aNG/weO8sPVpbV0dM1y3sncvswMBH/ZIf9x76n7UOBu8rSF4Ld/U/cVd0DhXqeAfYhpeLTWdk30bffMd3jI+Z4AcwXuPeKg8Lse9zqI1+dqNsH8PI/V3nkp+bhnwCR4pPZTl+/67JDRrLo4R/jozGCrkEWfcnB/0appz88Y3+fpMsyMJ98t89AB8opv3a9n/PBgjdWPx2iTn+XxHnslWS2mrds2bJgAA/2HJDF/YYtSNmqlROrRO7/AN0HzDlFQyuhAAAAAElFTkSuQmCC]]></data>
	</file>
	<file>
	  <filename>/jQueryOpenIdPlugin/images/myspaceW.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAADwAAAAQCAYAAABKkhw/AAAGd0lEQVR42tWXf1CTdRzHB1jWqWdX11XXVZlpXVHHHRl1mplmkZalXZLlVZlm11mZlhklBsomwFATJrBfjIHA2gZuwNjm2C8HNNgGMAbj929AxZ+HgprvPvtekGeV//RHPHev2/M838/3eb7vz689X87EsXv37luIxWKxOFqj0WQbDIayqQxpyJHJZLGkaTlxGxN5ndh7U1NTf3C5XDVdXV11fX19TYODgwM9PT2jU5XOzs6B/v5+f11dXf3hw4cDwh+cjGxAbGtraxsZ2Hp7e0fpHDfiqWtEXIYNPJEN3sYmdm8q4Pf7L7e1tfUJhcIE0jojIHgJRbaaImojr8Dh9EKocMDr8yNySyEiPiqArcqL8A+UCFqYw3hliwYdHR0g+ykBrfU3r9fbweVy13CkUmkMpbF7aGgokApYuYWELRBh6z4dgp4VM9bvVCMoQvIHUoQ8J0F7RyfIfspAmTumUCgEnOLiYsXw8HAzpTMCaI7VYgf/GKprmzFnhRh3Ls6E1lSLh16TIig8gxEWlQOqc0zM0VnqcdToQUGpG9xMC6o8LSi1NCA+0wy93QdLlQ9yjWvSvkDnhrnSh1JrPWIENiTLHKhtbENLWycOyO3wNLQgQWKHSF2Dru4esHfYvIjNPI6fMh0otTWye909vcjWerBLYIWk8E/bXz1+cKWViJdUwFnrZ/dovdfKyspKOIGOduLEiXOU0mxg8Xop7l70M9S6asQLyhGXZiLv9KGixo8Po49i4y4tLagVZD/J2h0azHqRMiG6GKFR+Zi9NBtLP1Njyacq3PZCFrbzjbjjZTllRcDbfbh3RS7ei9ZixktyJNDC1u4sxYNv5qHI4ETwolws2FCIr1MsuH9VAdbsKEGO1oU7IvOx45ADm7hmhCzJh6miCW9/b8ADq5X4ItmC+esK8erWEujIGTNfVWJzghUbuRbMilTBXOVj6wxoZYJPnTp1kUQzYSFPcsF5Ihm3Pp3EfjlP8rEn1YhPooswPzIdoauE2C+xgOwnWftNIea/lQ3KFGpqDkyLEKK5tRMlFh8rCXVZNWa/JIUg34mswmrcuUwGVZkbMxZLsOJLDfaJ7Cgpd0N7zIWg52XQWRvYcwUKF0IWZsPubGLzRCoXNu4xIHihHLHpdnJODrI1bmbb0NyD5Oxf8X6MEQ+t/gWiQg+Eag/ueV2Bbw7YmM2k4JGRkUsEBgYGEPJYLDjzuWA8xmNMD90HzuMBEhjBTyTA3dAOmsOI2q5G+Lp8dp5EEZsekY7+gUFKZz+VQDqO2RvwBU+PFzcoEPm5Ep/v1aGjqw+l5lokZ1Vi6SYlZr0ghCDHTA4SobyikT1LTAKDqW/sTNHj7uUyxAuPQ6X3YNrzYkQfNJFzsqA21DLb7t5BpFBpREUb8MjqAgh+qWfsl1eipr6N2UwKPnPmzIWzZ8/i5MlTWLNJiNWbxJi3NAWcuXF/8uieP9gLzry90JkbQHMY725XIjwql53zA4KfOYQhirbR0QJO2CEmoLaxE9MXpGJaeBrc3k5IqT7vW5YBeVENksR23PKMAGnycnLQYTy3Xg6e0Ia5b8iwjMpiQ4wOc1ZmQamvx+a4UoQ8m4E9GccR8YECYe8eQVqek+yUeOqdHBSZGnH7Igk5pwJCpRvz3sqB7KibrY0JpqalOn36dNuFCxdwPdvitOA8vIuIAWfOjexGGQmesC0x+yBTO9l5na8b8elWnD9/Hv2DJ/HjARMGhk6ysbC3JXhtc15gjJGndeMrnhHfJpvIKc0wWOsQHHYQBhs1zpRyJFB5DA6PoLd/GDFpVmxLLIfxeBPk2joUm5vYc/mUIVt4JuwTV6Gnb5i9x+pswbf7rdiaZEah0Tv5Pr1eX8rJy8tLpLZdcfHixWsEJhDlObDqYyEjdHkKE389JHjC9qZIlU589J0KIaFJMNqb/tHO5PAi5Ck+Kwe6/k8ZHR29plKpJJzY2NiV9KfsI89Ujo+P4+9IEdn/Ilhv8YKN3xyqoS4IC5yocHX8q93Zc+epmTVgbGyMXf+XUFAHEhMT1we+tGbShiGxvb29ibxQdfXqVdzIAbHjL4INJJjG/vdcuXIl0KGHcnNz00nrXRPf03NpZ3HQ5/M10x90OXl45NKlS2MTdHSfGDc5Wi5fz9Dw6XE2/j+FjkAj7qbI9h85ciQgNvTGHdNsHo+3Tq1Wy41GI9tiTXWKiopy+Xz+hsnI0vE7LpW1EzeIAiIAAAAASUVORK5CYII=]]></data>
	</file>
	<file>
	  <filename>/jQueryOpenIdPlugin/images/openidB.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAHgAAAAgCAYAAADZubxIAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjM2qefiJQAACnlJREFUaEPtm/lXVEcWxyd/gvPrJCoqrhiMmIhBiFtixvlhTFzGHPfMjFHHiXuMczTuoo7OjMsx6kmMiYKMikNcEdyQVUF2EGgaEFm66W666ZX9O/cWdNuvNxoEooaXU5Guvq/q1v3Uvbeq3us3fiO9+lk/zpgxIyAwMPC3Dt/3fXy5LPBGSkqKRiaTPaZir5nWrZoEdtDBgwdPAqhtbW3V9JWX1wbEiK9arVabtnPnzjm+vr42B3UELL5gIRbmu+jfvvKK2MBisQjSaXSxg7r0XoZLMvJm1PeBfUXAOjphu2My5AAJZK5guDwTesNzdeU5MESvh7aioFf6640xvSx9WCFLwnV7zu1xY+vKs2G4vgrmYz6wHO0P3bPcHu/zZTF8b+rBkDkiCy+2eq/RUtvjxma4DNZa+gD3zDqnPRKnCS+ev2DhsvaVWB/gVzT3uooOzDQgIGAaA97UW6vmPg/uGY91AxivHWC1SoXU1FRcvXIVUZcvIyE+HpUVlT0emTrKrxUVFcjPy0dVVRVqa2shLy5Gfn6+pJSUlECtVnebruy0ToA5D1uLwVyL7i6maGkONihpNd0N/ehNGqQ9foh5c+Zi5NBhGDLQB74+gzB00GBMCg5GeNhZ6I2abumrK/qe+PY4/P38cPFCBHQGNRYvWIgxfqPhP8rPVsaNeQczpk/HvtC9qKwueyFdecJ1CNgedlf+1hlUkJcWIpUMf+fObej0NXAEbKzJQU5eJhISHyA3LwuKmme2CeZtnwazBvfuxQpDBQVOwNmzZ1Aoy0NZeTFiYm9iwWfzMJiA/3P/ftQZ1Z1u31s9PMkdOfwfDOo/AGE00eqMKsz5dBYY6Pnwc7gceVGUMz+cxsrly+E3bDgmB4eQPTI71NXdZHMJmBXk1Ze1mC1mdKVwCEpPT8e1a9dw5coVW6nT18EcvVqyijbXFCEjM0Mid+/+PZSUloDls7KyUP6s3KMeWp0WUz+YhAnvvofs7GwnWU2tBn9eshTDh/gi/sEDl22ZzCZw8TReb2T4flftHDl8WAAODwuDwWgQgIMnvA+VWiXp02gy4lZ0NIYNHoKF8+eDx+ZJJ3te9n8zSycPdgTs7mZ39WazGU+ePHECy6CTk5NhNBphcQBsqZGhtLQUt2/flkDmiXH16lVRV1RUJJl4jv3/j3Ktz1v9cerkSbAOrvTLy83F6BEjsfyvy8T3p7/7Dv/Y9DWSE5Pwl6WfY+qkyfjDx7/Hvr17oVQqn09yaq9YJsNmkp0+7UN8OGUqNqxdJ+q4L41GI9r5OSoKrMdcAsdtcaqIIVBWfY7aAIcLO1gBc8511JfvWbd6jUgvmZmZHsfea4BNJhMePnwogXTjxg0UFBTAYDA8V9IFYKuS1dXViI2NdQKdS3A8TbbVq/4uwnMBTS53cnq9HvPnfYax/v5CHzag3/ARIkwy9GNHjmDNl19iFNXN+uNMKBQK0VY2RZCg8YGYPnUahfgD2L1rFyZSGggJmoiiwkIoSS7k/SAxOSaSR+7cth3/OngIH02ZgmEUMXIoonA7nQHM8pcvRWLA795E+Lmw7gPc0lAP+9Jcb4G3JStDGmY5FJrqdE7319+ShugmlUzIGCgUJSUmOsFlD85If+xeD9KZvSEkKAi1qhq3ck3Ux+aNG8Xiq7K8HOsJMIfMQwcOoJ5CJuvQSCH6YkQE1Q/EyePfis9LFy0WnltV/tTWdkFeHsaPexebNmyEmgETbJ5ghVRvtVdGWhpGUS49deKkqLMCjggLRwOFYasH12nULnVOIVv4vPkWTh0/7jUDe1YuQ7QjYG8/a2qUEjB379wRg3B1f8OtNZIc3KwutsmZKedWUr7Ny8lBYkICrl+/LtpNofDuVpfGBsz+ZCatlEOgI2O5k2umibDl680C8LOyMgGYodQoqiX3NFIO5bY4xJZT6uCV+P7QUCiqKqGobCvVVNavXSu8X0n1DPhvy1dI2lFUViCQ1gT79oaK+mPtIZoB88SxAtbT+sCVzg+TkgTg706ccD92atedA3YrYEfvrSJI7gztCbCrCKKlRQgby9NkW7HsC4x92x9l8ueTxVG+gYz6+ZIlGD1yJIx1dQLwpInBYPCOsksXLcKUkA+QEBcnwiQvztgb7QsvgoYM8IGssECE6G+2bHUCzIs+zuldARx16ZLoOyoy0uPYPdnFaZHlrcc6yiUmxEs8mL2gOwB7q8+Z06cxmMJt1GX3xqiisPze2AD8afYcAZUB85bKla7zSOYjWkylU5gdSF60e8cOxN+/77IoyZt7AjCvB4bSJOJ04K0dHOWcAPNzYElppc9elMSkBAlgSwPlNDf31cdKQ3STrtirPjzpoVIrEOA/Bh9TrlQoq5zaa2gyYdvWLRg8YCCtzH8W369f27ZKzchIlcjXalUidK9Ytgx6gw7j3hmLzV99hcZms02uqcWCC5SrQ/fsgVrTtshiD7bXUaGsENs2PrTg+qNH2rZJEecpB5M+thys10ju437iaJvIqWHR/AUwWfTe2ceRHX3uGLCLm5wmAcnk5edIAJc+JWhu7nUCXOde1l0bjvVNrWTw/54Xe8e5s2bjUWoynVppyTgGyEuKsGP7Ngwhg/FqWxiMdGPAbPBZMz8RByzmegOqqp9hw7p1wnNu3rwGbjd07x4RmiMiwumghg5JzHWIi7sr8u/mTZug1iqfA7YbswQw1UsAN7cBDqSFGuuak5uB7JwMOuyJw57du8QJF0+OrKwMt3a02cDqSD0J2GDSSva+0bT/01OdK0A9AZj7aaCZH3nxggjDw32HikOEyZRH2RsZ/LatW1GrU9l0YsDjx40Te+C3R44SsuytLMunTvXkZdyuhgCuWrlS1PN2ifP2CDoK5UVYlaJCfM99fbNli2S8DJgBhlIO5nZ4Fc179YjzYaSriRaGn4qIwvmd9eV/2Wt5MvGhTEFhnphgHU7y3gDMSshLZRIvjom5BRWFL0cFewqwtR+tTi3C8L8PHcKBffsQdu4nFMsLnYzFgDm0Whpo//4oWRwTng8PR5GswEm2kUJyRmYazv70I344/T0SE+NhaaQ0ROOubzQiJSWB7nsiGau5QY+k5HgUlxSK+jKKavfjbtMZc7loP51Sw/24O7by4MFdqntEIV9J3zukSk+R1EvA/DzY6WpF5/6TFUsh8xaH3gEDHxVaW2qIXSfZJrXUPe1kL53TyZ30BtrmBBPg5pbmX6T/7hlFqytstolmn4NdAnZ5dweVNTU1Lo8dY2JiBOzqyC8cAJd3pZsXvof3sQy4paXlhdv6JRvg6OB4WaOZ7YG/9ZWd7lKUjVZGhwlxtI+0f9jAfxf+uLgN8JkJaMo6g9bmxu7qtlPt8KH/zu07XnnAHQxaLl7Z4f/x+7SdspCXwnywzg8T+OlSPD18L7m2G81PLqG1pcnLFvrEumoBfpHS9ups+zvRbc+Y+q7XwQJypxfgrT9XeR1G9ysfg9z2yqzd2+/9+GqHLP+VG+iVGb7jIsv6GyV3Pzzj3yf1Y/qck7t6Btp3n/MDjJ6yCT875rbpktv9Lklw9AiZvXnXrl1z+8rLbQOKuCvZIdtDshWsBO7/Ac9UKewwfwfLAAAAAElFTkSuQmCC]]></data>
	</file>
	<file>
	  <filename>/jQueryOpenIdPlugin/images/openidico.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAABkAAAAZCAMAAADzN3VRAAABFFBMVEUAAACysrKysrKysrL3kx73kx6ysrKysrKysrKysrKysrKysrKysrKysrKysrKysrL3kx6ysrKysrL3kx73kx73kx6ysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrL3kx6ysrKysrKysrKysrL3kx6ysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrL3kx6ysrKysrKysrL3kx6ysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrLWomWysrKysrLjnEiysrKysrKysrL3kx6ysrKysrKysrKysrKysrKysrKysrKysrKysrL3kx6ysrKysrKysrLZoV/3kx6lBKZuAAAAWXRSTlMAAQMEBAUGBwkMDg8QFxgcHB4gICIjJC00ODk6REdJTU9XWF1jZGhpa3BzenyAhomPkpSVl5ibn5+nqKqwsri7vb7CxsvLzdPT1Njb4OPk6e3y9Pb3+fv9/tFOeXgAAADQSURBVHjaxdHHVgJBFATQhwqSg5JzziI5M0oGAUGRUMz//wc9sxDOmV6wo5Z1F13vNN0Ye9XK7R3NvfjKlaYo3k90kfrUIEteyLkuva3yC8AoSxHAKGp8D7Jeld0C2Ha1skS/wLJDkuixA2CT0f+/411I9kZUAjAwXxZYBEipkfsIzHXX20zhwucPelRmHlKsfnAFqM/kmXvPh7SXKwUmca7Y/oD1C08oBWDl4wllD8Ch5eEI+eWjv9szhZAmMZHsJC7TasXfOJON4Tj2RLfkDHZLQJjZ3VMqAAAAAElFTkSuQmCC]]></data>
	</file>
	<file>
	  <filename>/jQueryOpenIdPlugin/images/openidW.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAADwAAAAQCAYAAABKkhw/AAAFS0lEQVR42tVXe0ibVxQXYDDYYMAA9lcRBC0wtAJUFRwKSK3DtxWnQ7tZFNsKUER1lokC6oSqYzrfcepU0WrVOfFVtZoYNbU1Naa+otrEV9RqtSaRuZ6dc+Bm0miBUop+8CP3nu/ee+7v/s45342VeFJTUz9BfFNeXv5TW1tbVXd3d+dJ6Ovt6p3pLlBT+ywDOfxZWVmZhpw8EZ8KnoLsV/n5+Snj4+OPl5aWlKurq8tra2urL168ODgOvbrPZKjyeHNQfvkN9c84DCsrKzNKpfJZYWEhEb9gVpbIzs3NzSNRuVarPcA2nITt4WIw/nYBkDD1zw1QxK3S0tJfkOtnRNgdlVWsr6/LFxcX4V3YGSkBJiy5TP1zhdnZWW1GRkagVUVFxc94Ak+QMIUBnAYMANgdKzcT1mgWcKGlU8cvLCzAvXv3IDg4GMLCwqCmpgaWl5fp3QfB3bt32UdHRwfExsYybt++zT5nZmYsxmN4/9vQ0PC7VXt7e4Ner19GA7yNeY0GxhTj0Nc/CL0PB2Bb/r/CIyMKtg1J5aCaUosD4HmYFnDt2jW4fv069PT0QGtrK7i5uUFKSgq9/yCwtbVlwpiO4O3tDY2NjVBdXU0+yRepajGns7PzbyuqaEjYgEUKBFBtUCpV8LDvEZN9NqlidfYUEiZskDjxArOoulQ6TMQZKpWa52OFBFdXV8CaINbkU7e2tsYxKsjKyoKCggIICQmB5ORkXlvMCw0NhfDwcBgYGGBbZmYmlJWVQWBgIKs4Pz9PdiJMucnrREVFCT/s09PTE7BCC5sZxJUJb21tGZA0CExNPWcCg0My0CExYd9/XCEIUx8XX4OxsXHoHxji8RPKSbanp6fDnTt3xDwB2ggr4evrCxEREaxCfHw8k1YoFHDp0iX+HRoaAkdHRybn4+MDN27cAKy2EBkZCZiHvJadnR1HElZgen/cD0dSYmKihX8z4e3tbSMCCEjeTGBhcYltAq/H/xCEhU0AFV8FrW6F22lpaeTQYsyVK1egqakJ/Pz8iBTbJicnwcnJCfLy8sDZ2RkSEhIYFy9ehJaWFj6c3t5eHltSUgI3b96kNhFmNYuLiyE6Ovq4HyaclJRk4d9MeGdnx7i7uwsE/eYmhTIT3tDr2SZgeFoJTLjCifqnoqurC9zd3eHly5dmm06nAxsbG/5M+Pv7g1wuJzsTdnFxgdzcXA5lrCkEigQay4czODhIYzm0b926RW0+kI2NDcDPDcTExJj9IBe4evUq3L9/32JfTBgXb8KNrezv7wNhb28fZMMjTHhmdo5tAsaJKkGY+5YQa+xRdaaNcIhKpVLw8vKik+f3AQEBlHd8CHFxcZynExMT4ODgQL8Me3t78+HIZDKeJ5FIqBJTmwhzNOLNkMKe87+5uZnX8/DwIEUt9oVCdFjV1dVlY9keNhgMIIC5ScWKlZ7H6ntwcMB2k7JaEKb+u0CkKQSpCHHuPXjwQKxDBYjCnhXNycmhzbC9v7+fqiyBVCUb5Sh9Q6nNB4f7pTbNJx9kE58lJltUVERkT9oTpZPECid+q8Lyik5HDw8PgWAymWB9Qw9SmZyUZsWnp2dhU1bMhE0VzjTuvREUFASjo6PU/ligfNdnZ2d/TzetzzEssjUazXNUYOTo6AgEaKBWq4MnTyfg0aAUJluywPTXD/CPbpTevzfq6+upwlL7Y4BCfwcvPkXI9Utxn7bB79avarV6GvOqDxV+bTQaTceBIXH4em/30GgwUP/MA5/9V69ebeCjr62tJbJfv/2P6QssHt9h4lfj7Yj+Yp174GetBq+aPwpl6fkP4uE4fZ1ZC58AAAAASUVORK5CYII=]]></data>
	</file>
	<file>
	  <filename>/jQueryOpenIdPlugin/images/technorati.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAALVBMVEVKSko9oAA9oAA+pkBLswBWvAJ8yUCMwmzO6IfR7NLx+Nz09+739/f8//j////pTef3AAAAAnRSTlMizEPzBYMAAABySURBVHjaZc9BDsMgDERRcD02ODD3P26cQiOkfonFvI1FKVWOam5Y5n2QHN1qEQPgk5xjJskXbDBcRT24oLGrAlCNBcGGVVvQGRtigU2G5/SLclzJx7lBgw9d7bMBpIuKqL3giqcX1j7gtxMq7Aj17/s3ZTIF/3Kmz4IAAAAASUVORK5CYII=]]></data>
	</file>
	<file>
	  <filename>/jQueryOpenIdPlugin/images/verisign.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAaVBMVEUAAAAAAAAAAACCgoLv7+/MzMwRERElJSVQFhJyPHOCgoKMjIyZmZm0sqm1T0O3cFq3iYS6c2/CwsLDlYzMzMzWsLLW1Nbb3uHi0d7qzLns6ejv7+/y4dbz5t309+739/f8//j9+fj////0IaR3AAAABnRSTlMAIjNVzO59s5fcAAAAmUlEQVR42mXP0Q6DIBQDUFTEORxyRVRRUPr/HzkimdmyvvWkL2WsKL9SpF5x3OFVwUoO98k8LCMrr74aY53rRtQJQvCktCEtn+GC6JQ5YoztQ8cLYPUBQApNLgP5l8QgJPo1gzq3RrbigLYZaMMkRId7YSzQNgF77zMsasE8IZJGBqxkdm97c+BMwJE2hogsgK3+OXemc3/33zqGE2qkHB83AAAAAElFTkSuQmCC]]></data>
	</file>
	<file>
	  <filename>/jQueryOpenIdPlugin/images/vidoop.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAADAFBMVEUAAAARERElJSVQFhKSFhG/IRQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADoouTWAAABAHRSTlP///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAAAE5JREFUeNqdj1EOwCAIQy1l9z+ya3UmJPyY9aPWJxAZc1T5iiiCWKAo7gAfK9NOAx2ACKAnA0ekqH1XKHKBr8JZE+K0cI3bxj8fa8u19V8IIAW0anvKtgAAAABJRU5ErkJggg==]]></data>
	</file>
	<file>
	  <filename>/jQueryOpenIdPlugin/images/wordpress.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAADAFBMVEUAAAAkbY0lg60/kcZOl8dancprpM+AsNWawt2m0Oa51OXb3uHe6e/v7+/39/f///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABxNCfDAAABAHRSTlP///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAAAGpJREFUeNptz1kKw0AMA9AZWV7GddP7nzYNNC4pqfDXwyA09vmTfUzwEswxiUv4AboKzb4gQaHgsRpiU6lAvvwEL8cqeMYJGgl/kt4fZnVcUKNBM+kHWrdYFmRL7RZILLU0NHT+w23cbf4bHiUHr+ILDogAAAAASUVORK5CYII=]]></data>
	</file>
	<file>
	  <filename>/jQueryOpenIdPlugin/images/yahooB.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAHgAAAAgCAYAAADZubxIAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABh0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjM2qefiJQAACjNJREFUaEPtW/tXVPcRb/4E+yf0HH9rm6Q0rX2cpulJelLzatImpypao42Jb3kqHBAFEcQVFJ8IKIgiCgKKmkUeFuUN8lpgQdxd3rDAvpcFUZnOfHfvzb27d9nNYiqavZ6RvffOzHe+85mZ73zv3n3tJ+JjGXe6cuXKgBUrVvzU6b7/dGl54LX6+npdX1/fAyShZQa3ZiKwP5PJZGkAoJ+fn9f5aen6ADGiQ28wGJpjY2M/X758OZ+gzgCzG8REzCSFf/30kvhgZmaGId2MByWoZPYSuMijegqzfmBfEmCdk9CRmARygAhkukDgUiT4M/flrlwcyKJy7Vhz/eC+pJkrlclUkVkWc9lrndH7AX5FAHZU4maWxWsC125ydGJ+gF8gwL0KFVQU1UBzVQf0dalhUju5KDwI04CAgHcJ4N2+dM2tNZ1QlHkHbl6oEFFRRilcS5NDwZlvgT4XZdh5yGj/+u5+fa8qqYdVPw/iKfD14EX5jDBdFMC3cioh7LNDsOF3ESLDOCM34vXo1SmQ8M1pOL47G5StfS8M4AnMhrERLUyMTzCampwC3ZSOkV7//JcmLY7RUq0AeV4VFJ6VQ/6p23D9fBncv90Ig+phST/Ul7eI/BjyccKi/CUJMK3DHFlsevCGTFYdjA4PweHtZ0UGbvlLDIyPjUjq6G5TQm15I9QhNVW1MGqta4e2ug6eOhoVMDQw4JUNnuy8mFII//51OAS+Ecpo7ZthsC4gHHatPACq3kfPZQzztA6a77dA0rY0NpYwG4WfV/8yGOI2HgdFc6do3JaaNpHMhcMFPttFldIjwEKwvflsNE9C/KaTIiNlO86ikTo+aDg92Un5EPhmqFsnkEOoAvQqelxkOR0E/snIbEgNz4JjYedAtjPdTrvS2XlKcCZMTo7x8kbTBANz/VvhsPoXQaB+SMC62kbXBtQaqCmth9u55XAzpwxKr96FB9WtoNNrJe2ZmByFIzguB+SO9+Mg/3QJdDR2wGB/PyNFkwKzWA5hf09kfGsQaHleBa+vvaFD5I/mey1u5+4pCSUBJiHqvjiyzdjg+5JeZ4A9/zgsMvTmhUpJPUajCdQ9g3Ay4iLPH7PuGJTlV4Oqux8sFsuC45N87Z0WKEd+2Y4MXseZvZeZjvqyVrBYrS46WCa/HgImlBfOz2y2QEl2JYRiaeSAWverMAy0SKC/dG39b3ZDRtxV0E8ZeFmTyQxRq5J5mayEa2A2m93aTjadiy9wgBwCioYextvd0sfrWIvjGQ1i+6SwEOIl/ExYumSwM8DuhD1dH+kfh81/3vudsVgOu5v7RMHD6WivVaLT9rBsLs4og+npacZnm7bB3aI6qLrRALXyFqj59gHcK2lkZDKaXXTJc6v48VRdA5JjkV6L2YrZG8x49ZMGnm98aAIi/mkPzK//FI1NYiloMPisVrs9VosVHnZo4EREDuMJWhkPQ+pRdq8o/Q4/dtLWs2Cz2dyOz82b5hny0UEml7zrHONXtjzi9VDv4snPC93/QQGmgbuaHuIaZ496om3v7YeJsSmR0fdvNbG1avM7ezGKe8XVA5107Yyc3eN0BH+UwK5NO5wunGDZlWqeb/DRiFvnGHRGHuCxQS3jI9C5qhP+6SEXO50deWKPHeTYL08w+ZjAo/zYtaUtXgOTGZfvCKgoDGwb9LareT05smKv9UgBLQnws8ezIKSnszOwGKq8+p3TySEJX52COds0PMFydDX1JnN01L+SYWpYKznODJbMLe/EwNGgc2zikV/ImKyUTf+9Vss7J3P/Fcg+WABZ8fmMMmOvQEZMHpyOvAgpOzN5vnHNGNNVjVWCCyJFdZfHOXfVKRk/NUtGrQ4iPpfx8srGXo/ynP1ZaCPp+fKt3TCHGa3p1PB6mnDpWYzvvQLYGXBfzsmxwg6SgD0adJ5dO7I9AwhEd3pvZ1Wyhsg0oYeQD+3lTNWukuSvKqwTLAmhsOmPUbD9r7EQ/mkS7F2TAge/Og3JuE4fD8vmM3ikb5jpomBgNmLjZRjXubWHs3Oge4AfS92hhrToXP68PO+eR3lOz4EN9oY0DisBXXvUprIHDgY+BY43/nYXBP83gGcRwD2fJYlApkkcD82CJ1iG3U1iGhuMb97eC+ewoSGeotNypiMtKldSRlgtCDiauJRuuk6ZR7o0nf2MJ+dQIW9fX6t0AAl1ddZ280DoR6dArdDgtsu+I6B1lWz3BA5VCgKSbCF9xN/T/JDpCP040aO8J/1036XJ8kbIFx6ajDCLN/4+EmZM7jOXAYprLcmkYsblHrkOpxydNpUz06TexQFluff4MQaUAws6aJ1jj9qLDqWxarBx4+xL2ZXpNji4uVPQEf+BDfbMI7p/vR7WYTNJ16NXpUB/lz14nIlK8d2CGtjw2wjcJoXAnUtVPI8FO/MHFW3QiUuAL352lnEBmL4HFtE8nj8HGhsaEwFM+8CF9BrxyRLtgUM/SYRb+IizsrAGqm83QDg+NSMHlmSV8/JzT2xgwk395WM3+DGqbzVg02KGJ8+whxDYPztrxe3NFNsikZ7ORiW7/3huGpK2pvHyyUGZMNI/IpIlXaODo5CB6zmV8s3YG4wOiHlUSg17cseVe+oZzu67DJeSiyEroQAfBKVjhx5lz9JPErCx7HYZw2d/O2OH554BlhByCQIveLSjWhHAtGdcSM+Fw4WsfKmUahFfjbyJ6QnCp0+Pn9rwkaOWNSjctkdYJQjEb3CrNovg0Vg3ssrY0yshD+01t767D4xGPcyhvrL8exD8YTxffoM+iIc4zNLY9cfZek7jBL4RAqn42JXGlpoDBUJbbSekxeTi+p8IX78dzYKVmsVo7AWyEgugA4Gde4bNopPvkrF67PrgAFxKKV7QP5JJuJQAjsDIlnJOR0MX5B69ztYzcgoBajDoeV4Cdeff4hgA9WUPYNpmhq7mHnxA0Muovb4LFI3d/Lmy9SE8mccsxslbLEYYHxmH4f5hGNKIicDl7CGA1D0aKL1SBTmyQgZUemweXDlRgnvxRlYBfAlyb2QSN59hcyMfeMPPeLgK9SIBJocKM2cTlinO8dxEJrUTsA2ziR7x7RQQK2NovG3GwjL6aKh9yxTiKHFWq8l7Z3hRbbx27A+ga+DRIDTdbWVB6LUdXgJM3we7HPPg+7+S8xWQvv8qpIZmw/b3YkUAU6nbtzYVy99JRtkJhR5HKs4oZw9FhERPv/7zh0iPsr7PYulLSuHGBYdwDZYEWErY22uFZ0rhouwG5B27CQWn5FCcXg7XMyok6X4Je4nTf/jgAQLT+RAAbP/Cn3tlxwf9fpGl7QEVe2WH/qP3aZe2rX7rvq8H6EVK/tVZxzvR9u+Y/Mer4AGVywvw3M9VXoXZ/cjnoOJfmRW8/b6MDgfIqh+5g16a6Ts3WdxvlNz98Ix+n7SM0Kc1+Xk8D/XrcH0e/Tx9Qt8FO75YUAl+l8RwXBBkyua4uLgv/LS0fYAVdwslpKMkc8CKwP0fa8Eqh3FvECQAAAAASUVORK5CYII=]]></data>
	</file>
	<file>
	  <filename>/jQueryOpenIdPlugin/images/yahooW.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAADwAAAAQCAYAAABKkhw/AAAFV0lEQVR42t1XW0yTZxjmZsmSLdnFbna1m9268ynZEmOyLSYz2aY7ONQ52dQ5dVFBLIDhJJRaQQHKedAWaQvFVqwFCkWKwkCBcl6l9ExP0HESAuB0Pnv/L/GPnIzLbsQ/eUL7vYfved735ev/hT18EhMTnyNsLi0tjdPpdOWNjY2GjQzSUCGXy5NJ02eE55nIR8S+IpFI4s1mc7fb7e73+Xy3g8FgYHR0dH6jwuVyBfx+v7W/v3+goKCAE/4q31lOrM1ms5PDDa/XO0+f8azAarX+bbfbfSUlJWdJ6wuc4C3U2S7q6A2qCmwjdvR2DqCva5Ch52Y/Q++tAYwM20A+Ty3q1SZkC6SQnauGw+7g151O5z9DQ0NOoVC4I0wqlSbQGPeMjY1xo4D+riHkxMgQ930GwjedYEiKyIZMXE3CB0A+/wt9nYPQXTRCr2hCnaqZ7feksUO9FlQX16IgoYJxLBVW4XpdB2+vzNMxvpFfCFfF0uQuqdXq/DC9Xq8eHx8fpnHGo6D/Y0jiylmC45+nwuVw8zbR4UJaO4MDH8fjl82nEfPtOdRXmZbFD/ZYUJSsQm6sHDkCGZFUoKd9ALZhB1r07Yj4MAaXywx8XrvVCUNVC1S5OlTlXWU+RJKzsb9FSUrsfTca2adkqK80oUnbCkVWDQ5/ksjxIVFeaErqGN/iFBXW0PPAYDDUhnEnWigUukMjjRVgjqkHJCzJ+cjSZTapqBrHt6Whu7UPbqeHETDp2tF0uQ1Om4v3S/wxG0mEQCCwLD7igxguln2uLqzlCseIGtQtnHASJoXgazFG/rRDmXOFcWisvr6Ko5Xse987BZ3ciJqyBubXfOUPrKWH08oET0xMLJBorIVRtxcntqVyiShhI4KBICSx5RAfLYbX4+N8KNkYLkSW4dCWBBQmKjkfPj71Zwlid2bgGhWiSdsG46VW1KtM+OGtk7jV3IP2xm6Wu/N676q9z1BsfnwFUiJysfedaNAkrskx+isRm8ar5U3Y9XokPM7RNf14wZOTk4sErAdLrxX73hewTeN3ZuL3NDWoSLzd7w0iPvw8ExO9XbQsNm1/Hn7bmgK5WIsqiZ4VrU5pYuPZYTRDmaXDrjciERoPrdo3RyBH2sF8yESXuKIQj5FVPl63j6ZFQEVswVV5E05+KVpXBy94enp6bmZmBo8Bbaphm57afhbkv8xGpDnBJEqDPW9Hwdw6yNtS9uUilUSvzLf/ozi01XdxYHk1RYZldp87wApVW2HCeDAE4cECHNt6BqYrHfA4vPDYvSw25ptzKE6uZJzcNjp0b1rW1cAE06GlmZqass/NzeExYISIGHUsf9m63xNkh9pf4xPse3FSJY23FLYhJ9IPFeLop0k4Qjj7axGG++ywmEdwIUqKYxQjPlKM2702mGo6EPtdBh1+GciKkiGdxAl2iKGXX+P3mZ2dRXuDGbmCclbEtAP5kAovYbBzmPdRUeF1ZcaV3Pn4hoaGujCVSiWmY7t9YWHhAQHrQS2pZYJPh1/g17pbBpCwOwtxNObN2g7cmZmFUd2G3W9God1gxvTkDPN7UsxM3YHPFcTE+CT7/l/RVtuFzmt9a9rm5+cfaDSasrDk5ORt9KNsoSp03L17FytASbqREy2nqhdCdKgIIupU5rFS5MUqVvmG/BOoLTcx6GXNcA172frTAGpqQCwW7+HetF6kC4PY4XDcpircvH//Pp4l3Lt3jzuhxxQKRSFpffnh+/RrdLPItlgsw/QD3by0tDS5uLi4tJFBD3cQe6izfqVSyYndtPLG9FJ6enq4Vqu9aDQa2RVro6OmpkaRmZn5E99Zev4F4dhYuNEmrrMAAAAASUVORK5CYII=]]></data>
	</file>
	<file>
	  <filename>/jQueryOpenIdPlugin/jquery.openid.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly9qUXVlcnkgT3BlbklEIFBsdWdpbiAxLjEgQ29weXJpZ2h0IDIwMDkgSmFycmV0dCBWYW5jZSBodHRwOi8vanZhbmNlLmNvbS9wYWdlcy9qUXVlcnlPcGVuSWRQbHVnaW4ueGh0bWwNCiQuZm4ub3BlbmlkID0gZnVuY3Rpb24oKSB7DQogIHZhciAkdGhpcyA9ICQodGhpcyk7DQogIHZhciAkdXNyID0gJHRoaXMuZmluZCgnaW5wdXRbbmFtZT1vcGVuaWRfdXNlcm5hbWVdJyk7DQogIHZhciAkaWQgPSAkdGhpcy5maW5kKCdpbnB1dFtuYW1lPW9wZW5pZF9pZGVudGlmaWVyXScpOw0KICB2YXIgJGZyb250ID0gJHRoaXMuZmluZCgnZGl2OmhhcyhpbnB1dFtuYW1lPW9wZW5pZF91c2VybmFtZV0pPnNwYW46ZXEoMCknKTsNCiAgdmFyICRlbmQgPSAkdGhpcy5maW5kKCdkaXY6aGFzKGlucHV0W25hbWU9b3BlbmlkX3VzZXJuYW1lXSk+c3BhbjplcSgxKScpOw0KICB2YXIgJHVzcmZzID0gJHRoaXMuZmluZCgnZmllbGRzZXQ6aGFzKGlucHV0W25hbWU9b3BlbmlkX3VzZXJuYW1lXSknKTsNCiAgdmFyICRpZGZzID0gJHRoaXMuZmluZCgnZmllbGRzZXQ6aGFzKGlucHV0W25hbWU9b3BlbmlkX2lkZW50aWZpZXJdKScpOw0KDQogIHZhciBzdWJtaXR1c3IgPSBmdW5jdGlvbigpIHsNCiAgICBpZiAoJHVzci52YWwoKS5sZW5ndGggPCAxKSB7DQogICAgICAkdXNyLmZvY3VzKCk7DQogICAgICByZXR1cm4gZmFsc2U7DQogICAgfQ0KICAgICRpZC52YWwoJGZyb250LnRleHQoKSArICR1c3IudmFsKCkgKyAkZW5kLnRleHQoKSk7DQogICAgcmV0dXJuIHRydWU7DQogIH07DQoNCiAgdmFyIHN1Ym1pdGlkID0gZnVuY3Rpb24oKSB7DQogICAgaWYgKCRpZC52YWwoKS5sZW5ndGggPCAxKSB7DQogICAgICAkaWQuZm9jdXMoKTsNCiAgICAgIHJldHVybiBmYWxzZTsNCiAgICB9DQogICAgcmV0dXJuIHRydWU7DQoNCiAgfTsNCiAgdmFyIGRpcmVjdCA9IGZ1bmN0aW9uKCkgew0KICAgIHZhciAkbGkgPSAkKHRoaXMpOw0KICAgICRsaS5wYXJlbnQoKS5maW5kKCdsaScpLnJlbW92ZUNsYXNzKCdoaWdobGlnaHQnKTsNCiAgICAkbGkuYWRkQ2xhc3MoJ2hpZ2hsaWdodCcpOw0KICAgICR1c3Jmcy5mYWRlT3V0KCk7DQogICAgJGlkZnMuZmFkZU91dCgpOw0KDQogICAgJHRoaXMudW5iaW5kKCdzdWJtaXQnKS5zdWJtaXQoZnVuY3Rpb24oKSB7DQogICAgICAkaWQudmFsKCR0aGlzLmZpbmQoImxpLmhpZ2hsaWdodCBzcGFuIikudGV4dCgpKTsNCiAgICB9KTsNCiAgICAkdGhpcy5zdWJtaXQoKTsNCiAgICByZXR1cm4gZmFsc2U7DQogIH07DQoNCiAgdmFyIG9wZW5pZCA9IGZ1bmN0aW9uKCkgew0KICAgIHZhciAkbGkgPSAkKHRoaXMpOw0KICAgICRsaS5wYXJlbnQoKS5maW5kKCdsaScpLnJlbW92ZUNsYXNzKCdoaWdobGlnaHQnKTsNCiAgICAkbGkuYWRkQ2xhc3MoJ2hpZ2hsaWdodCcpOw0KICAgICR1c3Jmcy5oaWRlKCk7DQogICAgJGlkZnMuc2hvdygpOw0KICAgICRpZC5mb2N1cygpOw0KICAgICR0aGlzLnVuYmluZCgnc3VibWl0Jykuc3VibWl0KHN1Ym1pdGlkKTsNCiAgICByZXR1cm4gZmFsc2U7DQogIH07DQoNCiAgdmFyIHVzZXJuYW1lID0gZnVuY3Rpb24oKSB7DQogICAgdmFyICRsaSA9ICQodGhpcyk7DQogICAgJGxpLnBhcmVudCgpLmZpbmQoJ2xpJykucmVtb3ZlQ2xhc3MoJ2hpZ2hsaWdodCcpOw0KICAgICRsaS5hZGRDbGFzcygnaGlnaGxpZ2h0Jyk7DQogICAgJGlkZnMuaGlkZSgpOw0KICAgICR1c3Jmcy5zaG93KCk7DQogICAgJHRoaXMuZmluZCgnbGFiZWxbZm9yPW9wZW5pZF91c2VybmFtZV0gc3BhbicpLnRleHQoJGxpLmF0dHIoInRpdGxlIikpOw0KICAgICRmcm9udC50ZXh0KCRsaS5maW5kKCJzcGFuIikudGV4dCgpLnNwbGl0KCJ1c2VybmFtZSIpWzBdKTsNCiAgICAkZW5kLnRleHQoIiIpLnRleHQoJGxpLmZpbmQoInNwYW4iKS50ZXh0KCkuc3BsaXQoInVzZXJuYW1lIilbMV0pOw0KICAgICRpZC5mb2N1cygpOw0KICAgICR0aGlzLnVuYmluZCgnc3VibWl0Jykuc3VibWl0KHN1Ym1pdHVzcik7DQogICAgcmV0dXJuIGZhbHNlOw0KICB9Ow0KDQogICR0aGlzLmZpbmQoJ2xpLmRpcmVjdCcpLmNsaWNrKGRpcmVjdCk7DQogICR0aGlzLmZpbmQoJ2xpLm9wZW5pZCcpLmNsaWNrKG9wZW5pZCk7DQogICR0aGlzLmZpbmQoJ2xpLnVzZXJuYW1lJykuY2xpY2sodXNlcm5hbWUpOw0KICAkaWQua2V5cHJlc3MoZnVuY3Rpb24oZSkgew0KICAgIGlmICgoZS53aGljaCAmJiBlLndoaWNoID09IDEzKSB8fCAoZS5rZXlDb2RlICYmIGUua2V5Q29kZSA9PSAxMykpIHsNCiAgICAgIHJldHVybiBzdWJtaXRpZCgpOw0KICAgIH0NCiAgfSk7DQogICR1c3Iua2V5cHJlc3MoZnVuY3Rpb24oZSkgew0KICAgIGlmICgoZS53aGljaCAmJiBlLndoaWNoID09IDEzKSB8fCAoZS5rZXlDb2RlICYmIGUua2V5Q29kZSA9PSAxMykpIHsNCiAgICAgIHJldHVybiBzdWJtaXR1c3IoKTsNCiAgICB9DQogIH0pOw0KICAkdGhpcy5maW5kKCdsaSBzcGFuJykuaGlkZSgpOw0KICAkdGhpcy5maW5kKCdsaScpLmNzcygnbGluZS1oZWlnaHQnLCAwKS5jc3MoJ2N1cnNvcicsICdwb2ludGVyJyk7DQogICR0aGlzLmZpbmQoJ2xpOmVxKDApJykuY2xpY2soKTsNCiAgcmV0dXJuIHRoaXM7DQp9Ow0K]]></data>
	</file>
	<file>
	  <filename>/jQueryOpenIdPlugin/Login.xhtml</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[77u/PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPg0KPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiID4NCjxoZWFkPg0KICAgIDx0aXRsZT5qUXVlcnkgT3BlbklEIFBsdWdpbjwvdGl0bGU+DQogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgbWVkaWE9InNjcmVlbiIgaHJlZj0ib3BlbmlkLmNzcyIgLz4NCiAgICA8IS0tIGpRdWVyeSBPcGVuSUQgUGx1Z2luIDEuMSBDb3B5cmlnaHQgMjAwOSBKYXJyZXR0IFZhbmNlIGh0dHA6Ly9qdmFuY2UuY29tL3BhZ2VzL2pRdWVyeU9wZW5JZFBsdWdpbi54aHRtbCAtLT4NCjwvaGVhZD4NCjxib2R5Pg0KCTxoMT5qUXVlcnkgT3BlbklEIFBsdWdpbjwvaDE+DQo8YWRkcmVzcz5CeSA8YSBocmVmPSJodHRwOi8vanZhbmNlLmNvbSI+SmFycmV0dCBWYW5jZTwvYT48L2FkZHJlc3M+PGJyIC8+DQoNCjxoMj5Mb2dpbiAod2l0aCBqYXZhc2NyaXB0KTwvaDI+DQo8Zm9ybSBjbGFzcz0ib3BlbmlkIiBtZXRob2Q9InBvc3QiIGFjdGlvbj0iL0xvZ2luLnhodG1sP1JldHVyblVybD0iPiANCiAgPGRpdj48dWwgY2xhc3M9InByb3ZpZGVycyI+IA0KICA8bGkgY2xhc3M9Im9wZW5pZCIgdGl0bGU9Ik9wZW5JRCI+PGltZyBzcmM9ImltYWdlcy9vcGVuaWRXLnBuZyIgYWx0PSJpY29uIiAvPiANCiAgPHNwYW4+PHN0cm9uZz5odHRwOi8ve3lvdXItb3BlbmlkLXVybH08L3N0cm9uZz48L3NwYW4+PC9saT4gDQogIDxsaSBjbGFzcz0iZGlyZWN0IiB0aXRsZT0iR29vZ2xlIj4gDQoJCTxpbWcgc3JjPSJpbWFnZXMvZ29vZ2xlVy5wbmciIGFsdD0iaWNvbiIgLz48c3Bhbj5odHRwczovL3d3dy5nb29nbGUuY29tL2FjY291bnRzL284L2lkPC9zcGFuPjwvbGk+IA0KICA8bGkgY2xhc3M9ImRpcmVjdCIgdGl0bGU9IllhaG9vIj4gDQoJCTxpbWcgc3JjPSJpbWFnZXMveWFob29XLnBuZyIgYWx0PSJpY29uIiAvPjxzcGFuPmh0dHA6Ly95YWhvby5jb20vPC9zcGFuPjwvbGk+IA0KICA8bGkgY2xhc3M9InVzZXJuYW1lIiB0aXRsZT0iQU9MIHNjcmVlbiBuYW1lIj4gDQoJCTxpbWcgc3JjPSJpbWFnZXMvYW9sVy5wbmciIGFsdD0iaWNvbiIgLz48c3Bhbj5odHRwOi8vb3BlbmlkLmFvbC5jb20vPHN0cm9uZz51c2VybmFtZTwvc3Ryb25nPjwvc3Bhbj48L2xpPiANCiAgPGxpIGNsYXNzPSJ1c2VybmFtZSIgdGl0bGU9Ik15T3BlbklEIHVzZXIgbmFtZSI+IA0KCQk8aW1nIHNyYz0iaW1hZ2VzL215b3BlbmlkLnBuZyIgYWx0PSJpY29uIiAvPjxzcGFuPmh0dHA6Ly88c3Ryb25nPnVzZXJuYW1lPC9zdHJvbmc+Lm15b3BlbmlkLmNvbS88L3NwYW4+PC9saT4gDQogIDxsaSBjbGFzcz0idXNlcm5hbWUiIHRpdGxlPSJGbGlja3IgdXNlciBuYW1lIj4gDQoJCTxpbWcgc3JjPSJpbWFnZXMvZmxpY2tyLnBuZyIgYWx0PSJpY29uIiAvPjxzcGFuPmh0dHA6Ly9mbGlja3IuY29tLzxzdHJvbmc+dXNlcm5hbWU8L3N0cm9uZz4vPC9zcGFuPjwvbGk+IA0KICA8bGkgY2xhc3M9InVzZXJuYW1lIiB0aXRsZT0iVGVjaG5vcmF0aSB1c2VyIG5hbWUiPiANCgkJPGltZyBzcmM9ImltYWdlcy90ZWNobm9yYXRpLnBuZyIgYWx0PSJpY29uIiAvPjxzcGFuPmh0dHA6Ly90ZWNobm9yYXRpLmNvbS9wZW9wbGUvdGVjaG5vcmF0aS88c3Ryb25nPnVzZXJuYW1lPC9zdHJvbmc+Lzwvc3Bhbj48L2xpPiANCiAgPGxpIGNsYXNzPSJ1c2VybmFtZSIgdGl0bGU9IldvcmRwcmVzcyBibG9nIG5hbWUiPiANCgkJPGltZyBzcmM9ImltYWdlcy93b3JkcHJlc3MucG5nIiBhbHQ9Imljb24iIC8+PHNwYW4+aHR0cDovLzxzdHJvbmc+dXNlcm5hbWU8L3N0cm9uZz4ud29yZHByZXNzLmNvbTwvc3Bhbj48L2xpPiANCiAgPGxpIGNsYXNzPSJ1c2VybmFtZSIgdGl0bGU9IkJsb2dnZXIgYmxvZyBuYW1lIj4gDQoJCTxpbWcgc3JjPSJpbWFnZXMvYmxvZ2dlci5wbmciIGFsdD0iaWNvbiIgLz48c3Bhbj5odHRwOi8vPHN0cm9uZz51c2VybmFtZTwvc3Ryb25nPi5ibG9nc3BvdC5jb20vPC9zcGFuPjwvbGk+IA0KICA8bGkgY2xhc3M9InVzZXJuYW1lIiB0aXRsZT0iTGl2ZUpvdXJuYWwgYmxvZyBuYW1lIj4gDQoJCTxpbWcgc3JjPSJpbWFnZXMvbGl2ZWpvdXJuYWwucG5nIiBhbHQ9Imljb24iIC8+PHNwYW4+aHR0cDovLzxzdHJvbmc+dXNlcm5hbWU8L3N0cm9uZz4ubGl2ZWpvdXJuYWwuY29tPC9zcGFuPjwvbGk+IA0KICA8bGkgY2xhc3M9InVzZXJuYW1lIiB0aXRsZT0iQ2xhaW1JRCB1c2VyIG5hbWUiPiANCgkJPGltZyBzcmM9ImltYWdlcy9jbGFpbWlkLnBuZyIgYWx0PSJpY29uIiAvPjxzcGFuPmh0dHA6Ly9jbGFpbWlkLmNvbS88c3Ryb25nPnVzZXJuYW1lPC9zdHJvbmc+PC9zcGFuPjwvbGk+IA0KICA8bGkgY2xhc3M9InVzZXJuYW1lIiB0aXRsZT0iVmlkb29wIHVzZXIgbmFtZSI+IA0KCQk8aW1nIHNyYz0iaW1hZ2VzL3ZpZG9vcC5wbmciIGFsdD0iaWNvbiIgLz48c3Bhbj5odHRwOi8vPHN0cm9uZz51c2VybmFtZTwvc3Ryb25nPi5teXZpZG9vcC5jb20vPC9zcGFuPjwvbGk+IA0KICA8bGkgY2xhc3M9InVzZXJuYW1lIiB0aXRsZT0iVmVyaXNpZ24gdXNlciBuYW1lIj4gDQoJCTxpbWcgc3JjPSJpbWFnZXMvdmVyaXNpZ24ucG5nIiBhbHQ9Imljb24iIC8+PHNwYW4+aHR0cDovLzxzdHJvbmc+dXNlcm5hbWU8L3N0cm9uZz4ucGlwLnZlcmlzaWdubGFicy5jb20vPC9zcGFuPjwvbGk+IA0KICA8L3VsPjwvZGl2PiANCiAgPGZpZWxkc2V0PiANCiAgPGxhYmVsIGZvcj0ib3BlbmlkX3VzZXJuYW1lIj5FbnRlciB5b3VyIDxzcGFuPlByb3ZpZGVyIHVzZXIgbmFtZTwvc3Bhbj48L2xhYmVsPiANCiAgPGRpdj48c3Bhbj48L3NwYW4+PGlucHV0IHR5cGU9InRleHQiIG5hbWU9Im9wZW5pZF91c2VybmFtZSIgLz48c3Bhbj48L3NwYW4+IA0KICA8aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iTG9naW4iIC8+PC9kaXY+IA0KICA8L2ZpZWxkc2V0PiANCiAgPGZpZWxkc2V0PiANCiAgPGxhYmVsIGZvcj0ib3BlbmlkX2lkZW50aWZpZXIiPkVudGVyIHlvdXIgPGEgY2xhc3M9Im9wZW5pZF9sb2dvIiBocmVmPSJodHRwOi8vb3BlbmlkLm5ldCI+T3BlbklEPC9hPjwvbGFiZWw+IA0KICA8ZGl2PjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJvcGVuaWRfaWRlbnRpZmllciIgLz4gDQogIDxpbnB1dCB0eXBlPSJzdWJtaXQiIHZhbHVlPSJMb2dpbiIgLz48L2Rpdj4gDQogIDwvZmllbGRzZXQ+IA0KPC9mb3JtPg0KPGgyPkxvZ2luICh3aXRob3V0IGphdmFzY3JpcHQpPC9oMj4NCjxmb3JtIGNsYXNzPSJvcGVuaWQiIG1ldGhvZD0icG9zdCIgYWN0aW9uPSIvTG9naW4ueGh0bWw/UmV0dXJuVXJsPSI+IA0KICA8ZGl2Pjx1bCBjbGFzcz0icHJvdmlkZXJzIj4gDQogIDxsaSBjbGFzcz0ib3BlbmlkIiB0aXRsZT0iT3BlbklEIj48aW1nIHNyYz0iaW1hZ2VzL29wZW5pZFcucG5nIiBhbHQ9Imljb24iIC8+IA0KICA8c3Bhbj48c3Ryb25nPmh0dHA6Ly97eW91ci1vcGVuaWQtdXJsfTwvc3Ryb25nPjwvc3Bhbj48L2xpPiANCiAgPGxpIGNsYXNzPSJkaXJlY3QiIHRpdGxlPSJHb29nbGUiPiANCgkJPGltZyBzcmM9ImltYWdlcy9nb29nbGVXLnBuZyIgYWx0PSJpY29uIiAvPjxzcGFuPmh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vYWNjb3VudHMvbzgvaWQ8L3NwYW4+PC9saT4gDQogIDxsaSBjbGFzcz0iZGlyZWN0IiB0aXRsZT0iWWFob28iPiANCgkJPGltZyBzcmM9ImltYWdlcy95YWhvb1cucG5nIiBhbHQ9Imljb24iIC8+PHNwYW4+aHR0cDovL3lhaG9vLmNvbS88L3NwYW4+PC9saT4gDQogIDxsaSBjbGFzcz0idXNlcm5hbWUiIHRpdGxlPSJBT0wgc2NyZWVuIG5hbWUiPiANCgkJPGltZyBzcmM9ImltYWdlcy9hb2xXLnBuZyIgYWx0PSJpY29uIiAvPjxzcGFuPmh0dHA6Ly9vcGVuaWQuYW9sLmNvbS88c3Ryb25nPnVzZXJuYW1lPC9zdHJvbmc+PC9zcGFuPjwvbGk+IA0KICA8bGkgY2xhc3M9InVzZXJuYW1lIiB0aXRsZT0iTXlPcGVuSUQgdXNlciBuYW1lIj4gDQoJCTxpbWcgc3JjPSJpbWFnZXMvbXlvcGVuaWQucG5nIiBhbHQ9Imljb24iIC8+PHNwYW4+aHR0cDovLzxzdHJvbmc+dXNlcm5hbWU8L3N0cm9uZz4ubXlvcGVuaWQuY29tLzwvc3Bhbj48L2xpPiANCiAgPGxpIGNsYXNzPSJ1c2VybmFtZSIgdGl0bGU9IkZsaWNrciB1c2VyIG5hbWUiPiANCgkJPGltZyBzcmM9ImltYWdlcy9mbGlja3IucG5nIiBhbHQ9Imljb24iIC8+PHNwYW4+aHR0cDovL2ZsaWNrci5jb20vPHN0cm9uZz51c2VybmFtZTwvc3Ryb25nPi88L3NwYW4+PC9saT4gDQogIDxsaSBjbGFzcz0idXNlcm5hbWUiIHRpdGxlPSJUZWNobm9yYXRpIHVzZXIgbmFtZSI+IA0KCQk8aW1nIHNyYz0iaW1hZ2VzL3RlY2hub3JhdGkucG5nIiBhbHQ9Imljb24iIC8+PHNwYW4+aHR0cDovL3RlY2hub3JhdGkuY29tL3Blb3BsZS90ZWNobm9yYXRpLzxzdHJvbmc+dXNlcm5hbWU8L3N0cm9uZz4vPC9zcGFuPjwvbGk+IA0KICA8bGkgY2xhc3M9InVzZXJuYW1lIiB0aXRsZT0iV29yZHByZXNzIGJsb2cgbmFtZSI+IA0KCQk8aW1nIHNyYz0iaW1hZ2VzL3dvcmRwcmVzcy5wbmciIGFsdD0iaWNvbiIgLz48c3Bhbj5odHRwOi8vPHN0cm9uZz51c2VybmFtZTwvc3Ryb25nPi53b3JkcHJlc3MuY29tPC9zcGFuPjwvbGk+IA0KICA8bGkgY2xhc3M9InVzZXJuYW1lIiB0aXRsZT0iQmxvZ2dlciBibG9nIG5hbWUiPiANCgkJPGltZyBzcmM9ImltYWdlcy9ibG9nZ2VyLnBuZyIgYWx0PSJpY29uIiAvPjxzcGFuPmh0dHA6Ly88c3Ryb25nPnVzZXJuYW1lPC9zdHJvbmc+LmJsb2dzcG90LmNvbS88L3NwYW4+PC9saT4gDQogIDxsaSBjbGFzcz0idXNlcm5hbWUiIHRpdGxlPSJMaXZlSm91cm5hbCBibG9nIG5hbWUiPiANCgkJPGltZyBzcmM9ImltYWdlcy9saXZlam91cm5hbC5wbmciIGFsdD0iaWNvbiIgLz48c3Bhbj5odHRwOi8vPHN0cm9uZz51c2VybmFtZTwvc3Ryb25nPi5saXZlam91cm5hbC5jb208L3NwYW4+PC9saT4gDQogIDxsaSBjbGFzcz0idXNlcm5hbWUiIHRpdGxlPSJDbGFpbUlEIHVzZXIgbmFtZSI+IA0KCQk8aW1nIHNyYz0iaW1hZ2VzL2NsYWltaWQucG5nIiBhbHQ9Imljb24iIC8+PHNwYW4+aHR0cDovL2NsYWltaWQuY29tLzxzdHJvbmc+dXNlcm5hbWU8L3N0cm9uZz48L3NwYW4+PC9saT4gDQogIDxsaSBjbGFzcz0idXNlcm5hbWUiIHRpdGxlPSJWaWRvb3AgdXNlciBuYW1lIj4gDQoJCTxpbWcgc3JjPSJpbWFnZXMvdmlkb29wLnBuZyIgYWx0PSJpY29uIiAvPjxzcGFuPmh0dHA6Ly88c3Ryb25nPnVzZXJuYW1lPC9zdHJvbmc+Lm15dmlkb29wLmNvbS88L3NwYW4+PC9saT4gDQogIDxsaSBjbGFzcz0idXNlcm5hbWUiIHRpdGxlPSJWZXJpc2lnbiB1c2VyIG5hbWUiPiANCgkJPGltZyBzcmM9ImltYWdlcy92ZXJpc2lnbi5wbmciIGFsdD0iaWNvbiIgLz48c3Bhbj5odHRwOi8vPHN0cm9uZz51c2VybmFtZTwvc3Ryb25nPi5waXAudmVyaXNpZ25sYWJzLmNvbS88L3NwYW4+PC9saT4gDQogIDwvdWw+PC9kaXY+IA0KICA8ZmllbGRzZXQ+IA0KICA8bGFiZWwgZm9yPSJvcGVuaWRfdXNlcm5hbWUiPkVudGVyIHlvdXIgPHNwYW4+UHJvdmlkZXIgdXNlciBuYW1lPC9zcGFuPjwvbGFiZWw+IA0KICA8ZGl2PjxzcGFuPjwvc3Bhbj48aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0ib3BlbmlkX3VzZXJuYW1lIiAvPjxzcGFuPjwvc3Bhbj4gDQogIDxpbnB1dCB0eXBlPSJzdWJtaXQiIHZhbHVlPSJMb2dpbiIgLz48L2Rpdj4gDQogIDwvZmllbGRzZXQ+IA0KICA8ZmllbGRzZXQ+IA0KICA8bGFiZWwgZm9yPSJvcGVuaWRfaWRlbnRpZmllciI+RW50ZXIgeW91ciA8YSBjbGFzcz0ib3BlbmlkX2xvZ28iIGhyZWY9Imh0dHA6Ly9vcGVuaWQubmV0Ij5PcGVuSUQ8L2E+PC9sYWJlbD4gDQogIDxkaXY+PGlucHV0IHR5cGU9InRleHQiIG5hbWU9Im9wZW5pZF9pZGVudGlmaWVyIiAvPiANCiAgPGlucHV0IHR5cGU9InN1Ym1pdCIgdmFsdWU9IkxvZ2luIiAvPjwvZGl2PiANCiAgPC9maWVsZHNldD4gDQo8L2Zvcm0+DQo8YnIgLz4NCjxoMj5BZGRpdGlvbmFsIEltYWdlczwvaDI+DQo8aW1nIHNyYz0iaW1hZ2VzL2ZsaWNrclcucG5nIiBhbHQ9Imljb24iIC8+DQo8aW1nIHNyYz0iaW1hZ2VzL215c3BhY2VXLnBuZyIgYWx0PSJpY29uIiAvPg0KPGltZyBzcmM9ImltYWdlcy9teW9wZW5pZFcucG5nIiBhbHQ9Imljb24iIC8+DQo8aW1nIHNyYz0iaW1hZ2VzL2ZhY2Vib29rVy5wbmciIGFsdD0iaWNvbiIgLz48YnIgLz4NCg0KPHA+VmlzaXQgPGEgaHJlZj0iaHR0cDovL2p2YW5jZS5jb20vcGFnZXMvalF1ZXJ5T3BlbklkUGx1Z2luLnhodG1sIj5qUXVlcnkgT3BlbklEIFBsdWdpbiBIb21lcGFnZTwvYT4gZm9yIHVwZGF0ZXMuPC9wPg0KDQo8cD48YSByZWw9ImxpY2Vuc2UiIGhyZWY9Imh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LXNhLzMuMC8iPjxpbWcgYWx0PSJDcmVhdGl2ZSBDb21tb25zIExpY2Vuc2UiIHN0eWxlPSJib3JkZXItd2lkdGg6MCIgc3JjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9pbWFnZXMvcHVibGljL3NvbWVyaWdodHMyMC5wbmciIC8+PC9hPjxiciAvPlRoaXMgd29yayBpcyBsaWNlbnNlZCB1bmRlciBhIDxhIHJlbD0ibGljZW5zZSIgaHJlZj0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnktc2EvMy4wLyI+Q3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbi1TaGFyZSBBbGlrZSAzLjAgVW5wb3J0ZWQgTGljZW5zZTwvYT4uPC9wPg0KDQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJodHRwOi8vYWpheC5nb29nbGVhcGlzLmNvbS9hamF4L2xpYnMvanF1ZXJ5LzEuMy4xL2pxdWVyeS5taW4uanMiPjwvc2NyaXB0Pg0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0ianF1ZXJ5Lm9wZW5pZC5qcyI+PC9zY3JpcHQ+DQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+ICAkKGZ1bmN0aW9uKCkgeyAkKCJmb3JtLm9wZW5pZDplcSgwKSIpLm9wZW5pZCgpOyB9KTs8L3NjcmlwdD4NCjwvYm9keT4NCjwvaHRtbD4NCg==]]></data>
	</file>
	<file>
	  <filename>/jQueryOpenIdPlugin/openid.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[77u/Ym9keSB7Zm9udC1mYW1pbHk6IEFyaWFsO30NCmZpZWxkc2V0IHtib3JkZXItc3R5bGU6bm9uZTt9DQppbWcge2JvcmRlci1zdHlsZTpub25lO30NCg0KZm9ybS5vcGVuaWQgdWwgeyB0ZXh0LWFsaWduOmNlbnRlcjsgZGlzcGxheTppbmxpbmU7fQ0KZm9ybS5vcGVuaWQgdWwgbGkge2Zsb2F0OmxlZnQ7IHBhZGRpbmc6NHB4ICFpbXBvcnRhbnQ7IGxpc3Qtc3R5bGUtdHlwZTpub25lOyBtYXJnaW46MHB4ICFpbXBvcnRhbnQ7fQ0KZm9ybS5vcGVuaWQgdWwgbGkgc3BhbiB7cGFkZGluZzowIDFlbSAwIDNweH0NCmZvcm0ub3BlbmlkIGZpZWxkc2V0IHtjbGVhcjpib3RoOyBwYWRkaW5nOjFlbSAwfQ0KZm9ybS5vcGVuaWQgZGl2K2ZpZWxkc2V0IHtkaXNwbGF5Om5vbmV9DQpmb3JtLm9wZW5pZCBsYWJlbCB7ZGlzcGxheTpibG9jazsgZm9udC13ZWlnaHQ6Ym9sZDsgZm9udC1zaXplOmxhcmdlcjsgbWFyZ2luLWJvdHRvbTouNWVtfQ0KaW5wdXRbbmFtZT1vcGVuaWRfdXNlcm5hbWVdIHt3aWR0aDo4ZW19DQppbnB1dFtuYW1lPW9wZW5pZF9pZGVudGlmaWVyXSB7d2lkdGg6MThlbX0NCmZvcm0ub3BlbmlkIHVsIGxpLmhpZ2hsaWdodCB7IC1tb3otYm9yZGVyLXJhZGl1czo0cHg7IC13ZWJraXQtYm9yZGVyLXJhZGl1czo0cHg7IGJhY2tncm91bmQtY29sb3I6ICNGRDZ9DQpmb3JtLm9wZW5pZCBmaWVsZHNldCBkaXYge2ZvbnQtZmFtaWx5OmFyaWFsOy1tb3otYm9yZGVyLXJhZGl1czo0cHg7IC13ZWJraXQtYm9yZGVyLXJhZGl1czo0cHg7IA0KICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiAjRENEQ0RDIHVybChpbWFnZXMvZmFkZWdyZXkucG5nKTsgcGFkZGluZzoxMHB4O2Rpc3BsYXk6aW5saW5lLWJsb2NrfQ0KZm9ybS5vcGVuaWQgaW5wdXRbdHlwZT0nc3VibWl0J10ge21hcmdpbi1sZWZ0OjFlbTt9DQoNCi5vcGVuaWRfbG9nb3tjb2xvcjojRjc5MzFFO3BhZGRpbmc6NnB4IDBweCA4cHggMjhweDsgYmFja2dyb3VuZDogdXJsKGltYWdlcy9vcGVuaWRpY28ucG5nKSBuby1yZXBlYXR9DQoNCiNvcGVuaWRfbG9naW57ZmxvYXQ6bGVmdDsgZm9udC1zaXplOmxhcmdlcjsgd2lkdGg6MzAlOyBtYXJnaW46MmVtIDFlbTsgdGV4dC1hbGlnbjpjZW50ZXJ9DQojb3BlbmlkX2xvZ2luIGRpdnttYXJnaW4tdG9wOjAuNWVtfQ0KI29wZW5pZF9sb2dpbiBkaXYrc3Bhbntmb250LXNpemU6c21hbGxlcn0NCg0KDQovKiBPcGVuSUQgbW9kdWxlIHByb3ZpZGVyIGxpc3RpbmcgKi8NCmRpdiNtYWluIGxpLlByb3ZpZGVyIHsgbWFyZ2luLWxlZnQ6IDBweDsgcGFkZGluZy1sZWZ0OiA3MHB4OyBsaXN0LXN0eWxlLXR5cGU6IG5vbmU7IHBhZGRpbmctdG9wOiAwcHg7IG1hcmdpbi1ib3R0b206IDVweDsgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDsgYmFja2dyb3VuZC1wb3NpdGlvbjogbGVmdCB0b3A7fQ0KZGl2I21haW4gbGkuUHJvdmlkZXIuZ29vZ2xlIHsgYmFja2dyb3VuZC1pbWFnZTogdXJsKGltYWdlcy9nb29nbGVXLnBuZyk7IH0NCmRpdiNtYWluIGxpLlByb3ZpZGVyLnlhaG9vIHsgYmFja2dyb3VuZC1pbWFnZTogdXJsKGltYWdlcy95YWhvb1cucG5nKTsgfQ0KZGl2I21haW4gbGkuUHJvdmlkZXIubXlvcGVuaWQgeyBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoaW1hZ2VzL215b3BlbmlkVy5wbmcpOyB9DQpkaXYjbWFpbiBsaS5Qcm92aWRlci5hb2wgeyBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoaW1hZ2VzL2FvbFcucG5nKTsgfQ0KZGl2I21haW4gbGkuUHJvdmlkZXIubXlzcGFjZSB7IGJhY2tncm91bmQtaW1hZ2U6IHVybChpbWFnZXMvbXlzcGFjZVcucG5nKTsgfQ0KZGl2I21haW4gbGkuUHJvdmlkZXIub3BlbmlkIHsgYmFja2dyb3VuZC1pbWFnZTogdXJsKGltYWdlcy9vcGVuaWRXLnBuZyk7IH0NCmRpdiNtYWluIGxpLlByb3ZpZGVyLmZhY2Vib29rIHsgYmFja2dyb3VuZC1pbWFnZTogdXJsKGltYWdlcy9mYWNlYm9va1cucG5nKTsgfQ==]]></data>
	</file>
	<file>
	  <filename>/lang/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lang/en_US.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbJ2ZyaWVuZGx5bmFtZSddID0gJ09wZW5JRCBNb2R1bGUnOwokbGFuZ1sncG9zdGluc3RhbGwnXSA9ICdQb3N0IEluc3RhbGwgTWVzc2FnZSc7CiRsYW5nWydwb3N0dW5pbnN0YWxsJ10gPSAnUG9zdCBVbmluc3RhbGwgTWVzc2FnZSInOwokbGFuZ1sncmVhbGx5X3VuaW5zdGFsbCddID0gJ0FyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byB1bmluc3RhbGwgdGhlIE9wZW5JRCBtb2R1bGU/JzsKJGxhbmdbJ3VuaW5zdGFsbGVkJ10gPSAnTW9kdWxlIFVuaW5zdGFsbGVkLic7CiRsYW5nWydpbnN0YWxsZWQnXSA9ICdNb2R1bGUgdmVyc2lvbiAlcyBpbnN0YWxsZWQuJzsKJGxhbmdbJ3VwZ3JhZGVkJ10gPSAnTW9kdWxlIHVwZ3JhZGVkIHRvIHZlcnNpb24gJXMuJzsKJGxhbmdbJ21vZGRlc2NyaXB0aW9uJ10gPSAnVGhpcyBtb2R1bGUgYWRkcyBPcGVuSUQgbG9naW4gY2FwYWJpbGl0aWVzIHRvIENNUyBNYWRlIFNpbXBsZSBhbmQgRnJvbnRFbmRVc2Vycy4nOwokbGFuZ1snY2hhbmdlbG9nJ10gPSAnPHVsPgo8bGk+VmVyc2lvbiAxLjAuMCBGaXJzdCBwdWJsaWMgcmVsZWFzZSB3aXRoIHN1cHBvcnQgZm9yIE9wZW5JRCBhbmQgRmFjZWJvb2sgYXV0aGVudGljYXRpb248L2xpPgo8L3VsPic7CiRsYW5nWydoZWxwJ10gPSAnPGgzPldoYXQgRG9lcyBUaGlzIERvPzwvaDM+CjxwPlRoZSBPcGVuSUQgbW9kdWxlIHByb3ZpZGVzIGZ1bmN0aW9uYWxpdHkgdG8gYWRkIGFuIE9wZW5JRCBvciBGYWNlYm9vayBhY2NvdW50IHRvIGEgcmVnaXN0ZXJlZCBmcm9udGVuZCB1c2VyLiBUaGF0IHVzZXIgY2FuIHRoZW4gbG9nIGluIHVzaW5nIHRoYXQgaWRlbnRpdHkgaW5zdGVhZCBvZiB0aGUgb3JkaW5hcnkgZnJvbnRlbmQgYWNjb3VudC48L3A+CjxoMz5Ib3cgRG8gSSBVc2UgSXQ8L2gzPgo8cD48b2w+CiAgICA8bGk+TWFrZSBzdXJlIHRoYXQgRnJvbnRFbmRVc2VycyBpcyBpbnN0YWxsZWQ8L2xpPgogICAgPGxpPkluc3RhbGwgdGhlIE9wZW5JRCBtb2R1bGU8L2xpPgogICAgPGxpPkNoZWNrIG91dCB0aGUgc2V0dGluZ3MgcGFnZSBpZiB5b3Ugd2FudCB0byB1c2UgRmFjZWJvb2sgYXMgYSBwcm92aWRlcjwvbGk+CiAgICA8bGk+QWRkIHRoZSB0YWcgPGk+e09wZW5JRH08L2k+IHRvIGEgbmV3IG9yIGFuIGV4aXN0aW5nIHBhZ2U8L2xpPgogICAgPGxpPkxvZyBpbiBhcyBhbiBhbHJlYWR5IHJlZ2lzdGVyZWQgZnJvbnRlbmQgdXNlcjwvbGk+CiAgICA8bGk+VmlzaXQgdGhlIHBhZ2Ugd2l0aCB0aGUgT3BlbklEIHRhZyBhbmQgcmVnaXN0ZXIgYSBwcm92aWRlcjwvbGk+CiAgICA8bGk+TG9nb3V0PC9saT4KICAgIDxsaT5SZXZpc2l0IHRoZSBwYWdlIHdpdGggdGhlIE9wZW5JRCB0YWcsIHNlbGVjdCB0aGUgc2FtZSBwcm92aWRlciB5b3UganVzdCByZWdpc3RlcmVkLCBhdXRoZW50aWNhdGUgYW5kIGJlaG9sZDogWW91IGFyZSBub3cgbG9nZ2VkIGluPC9saT4KPC9vbD48L3A+CjxoMz5TdXBwb3J0PC9oMz4KPHA+R2V0dGluZyBPcGVuSUQgdG8gd29yayBwcm9wZXJseSBjYW4gYmUgYSBiaXQgb2YgYSBzdHJ1Z2dsZSBpZiB5b3UgYXJlIG5vdApmb3J0dW5hdGUgZW5vdWdoIHRvIGhhdmUgYW4gZW52aXJvbm1lbnQgdGhhdCBhbHJlYWR5IGhhcyBhbGwgdGhlIGJpdHMgYW5kIHBpZWNlcyBpbiBwbGFjZS4KPGJyLz5Tb21lIHBsYWNlcyB0byBjaGVjayBiZWZvcmUgYXNraW5nIGZvciBoZWxwOjxici8+Cjx1bD4KICAgIDxsaT5UaGUgamFucmFpbiBSRUFETUUgZmlsZSBpbiB0aGUgL21vZHVsZXMvT3BlbklEL29wZW5pZC1waHAtb3BlbmlkLSp2ZXJzaW9uKiBkaXJlY3Rvcnk8L2xpPgogICAgPGxpPlJ1biB0aGUgZGV0ZWN0LnBocCBmaWxlIGluIC9tb2R1bGVzL09wZW5JRC9vcGVuaWQtcGhwLW9wZW5pZC0qdmVyc2lvbiovZXhhbXBsZXMvPC9saT4KICAgIDxsaT5UcnkgZGlmZmVyZW50IE9wZW5JRCBwcm92aWRlcnMgaW4gb3JkZXIgdG8gZGV0ZXJtaW5lIGlmIGFsbCBhcmUgYnJva2VuIG9yIGp1c3Qgc29tZS4KICAgIEEgcnVsZSBvZiB0aHVtYiBpcyB0aGF0IEZhY2Vib29rIGlzIGEgc2VwYXJhdGUgdGhpbmcgY29tcGFyZWQgdG8gdGhlIE9wZW5JRCBwcm92aWRlcnMuCiAgICBQcm92aWRlcnMgdGhhdCB1c2UgZGlzY292ZXJ5IChsaWtlIEdvb2dsZSkgaXMgZGlmZmVyZW50IGZyb20gdGhlIHNpbXBsZXIgb25lcyBsaWtlIG15T3BlbklEPC9saT4KICAgIDxsaT5DaGVjayB5b3VyIHBocCBlcnJvciBsb2dzIGZvciBhbnkgZXhjZXB0aW9ucyBvciBlcnJvciBtZXNzYWdlcy4gR29vZ2xlIGFueSBvdXRwdXQgZm9yIGNsdWVzIGFib3V0IGhvdyB0byBzb2x2ZSB0aGVtPC9saT4KICAgIDxsaT5TZXQgb3BlbmlkLmRlYnVnIHRvIHRydWUgaW4geW91ciBjb25maWcucGhwLiBUaGlzIHdpbGwgb3V0cHV0IGEgdG9uIG9mIG1lc3NhZ2VzIHRvIHRoZSBwaHAgZXJyb3IgbG9nPC9saT4KPC91bD4KPC9wPgo8aDM+Q3JlZGl0czwvaDM+CjxwPlRoZSBPcGVuSUQgbGlicmFyeSBpcyBzdGFuZGluZyBvbiB0aGUgc2hvdWxkZXJzIG9mIGdpYW50cywgbmFtZWx5Ogo8dWw+CiAgICA8bGk+PGEgaHJlZj0iaHR0cDovL2dpdGh1Yi5jb20vb3BlbmlkL3BocC1vcGVuaWQvIiB0YXJnZXQ9Il9ibGFuayI+UEhQIE9wZW5JRCBsaWJyYXJ5IGJ5IEphblJhaW4sIEluYy48L2E+PC9saT4KICAgIDxsaT48YSBocmVmPSJodHRwOi8vanZhbmNlLmNvbS9wYWdlcy9KUXVlcnlPcGVuSURQbHVnaW4ueGh0bWwiIHRhcmdldD0iX2JsYW5rIj5PcGVuSUQgalF1ZXJ5IHBsdWdpbiBieSBKYXJyZXQgVmFuY2U8L2E+PC9saT4KICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcGhwLXNkay8iIHRhcmdldD0iX2JsYW5rIj5GYWNlYm9vayBQSFAgU0RLPC9hPjwvbGk+CiAgICA8bGk+PGEgaHJlZj0iaHR0cDovL3d3dy5qcXVlcnkuY29tIiB0YXJnZXQ9Il9ibGFuayI+alF1ZXJ5PC9hPjwvbGk+CjwvdWw+CjwvcD4KCjxoMz5Db3B5cmlnaHQgYW5kIExpY2Vuc2U8L2gzPgo8cD5Db3B5cmlnaHQgJmNvcHk7IDIwMTAsIDxhIGhyZWY9Im1haWx0bzpvcGVuaWRAbGVubmFydHNzb25zLm5ldCI+SGVucmlrIExlbm5hcnRzc29uPC9hPi4gQWxsIFJpZ2h0cyBBcmUgUmVzZXJ2ZWQuPC9wPgo8cD5UaGlzIG1vZHVsZSBoYXMgYmVlbiByZWxlYXNlZCB1bmRlciB0aGUgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wLmh0bWwiPkFwYWNoZSBMaWNlbnNlIFZlcnNpb24gMi4wPC9hPi4gWW91IG11c3QgYWdyZWUgdG8gdGhpcyBsaWNlbnNlIGJlZm9yZSB1c2luZyB0aGUgbW9kdWxlLjwvcD4KJzsKJGxhbmdbJ29wZW5pZF9wcm92aWRlcnMnXSA9ICdFbmFibGVkIHByb3ZpZGVycyc7CiRsYW5nWydzZXR0aW5ncyddID0gJ1NldHRpbmdzJzsKJGxhbmdbJ3VzZXJzJ10gPSAnVXNlcnMnOwokbGFuZ1snc3VibWl0J10gPSAnU3VibWl0JzsKJGxhbmdbJ2NhbmNlbCddID0gJ0NhbmNlbCc7CiRsYW5nWydvcGVuaWQuZmFpbCddID0gJ1lvdXIgcHJvdmlkZWQgaWRlbnRpdHkgaXMgPGEgaHJlZj0iJXMiPiVzPC9hPiBidXQgdGhlIGxvZ2luIGZhaWxlZCc7CiRsYW5nWydvcGVuaWQuc3VjY2VzcyddID0gJ1lvdXIgcHJvdmlkZWQgaWRlbnRpdHkgaXMgPGEgaHJlZj0iJXMiPiVzPC9hPiBhbmQgeW91IGhhdmUgYmVlbiBsb2dnZWQgaW4gYXMgdXNlciAlcyc7CiRsYW5nWydvcGVuaWQudW5rbm93biddID0gJ1lvdXIgcHJvdmlkZWQgaWRlbnRpdHkgaXMgPGEgaHJlZj0iJXMiPiVzPC9hPiBidXQgaXMgbm90IHJlZ2lzdGVyZWQgd2l0aCBhbnkgdXNlci4nOwokbGFuZ1snb3BlbmlkLnJlZGlyZWN0aW5nJ10gPSAnUGxlYXNlIHdhaXQsIHJlZGlyZWN0aW5nIHRvIHlvdXIgc2VsZWN0ZWQgT3BlbklEIHByb3ZpZGVyJzsKPz4K]]></data>
	</file>
	<file>
	  <filename>/lib/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/class.CMSMSDatabaseConnection.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qCiAqICAgICAgQ29weXJpZ2h0IDIwMTAgSGVucmlrIExlbm5hcnRzc29uCiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKgogKiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICoKICovCgpyZXF1aXJlX29uY2UgZGlybmFtZShfX0ZJTEVfXykuJy8uLi9PcGVuSUQubW9kdWxlLnBocCc7CnJlcXVpcmVfb25jZSAnQXV0aC9PcGVuSUQvRGF0YWJhc2VDb25uZWN0aW9uLnBocCc7CgpjbGFzcyBDTVNNU0RhdGFiYXNlQ29ubmVjdGlvbiBleHRlbmRzIEF1dGhfT3BlbklEX0RhdGFiYXNlQ29ubmVjdGlvbiB7CgogICAgLyoqCiAgICAgKgogICAgICogQGdsb2JhbCBDbXNPYmplY3QgJGdDbXMKICAgICAqIEByZXR1cm4gQURPQ29ubmVjdGlvbgogICAgICovCiAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBfR2V0RGIoKSB7CiAgICAgICAgZ2xvYmFsICRnQ21zOwogICAgICAgIHJldHVybiAkZ0Ntcy0+R2V0RGIoKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gYXV0b0NvbW1pdCgkbW9kZSkgewogICAgICAgIE9wZW5JRDo6TG9nKCJhdXRvQ29tbWl0IDogIi4kbW9kZSk7CiAgICAgICAgQ01TTVNEYXRhYmFzZUNvbm5lY3Rpb246Ol9HZXREYigpLT5hdXRvQ29tbWl0ID0gJG1vZGU7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGJlZ2luKCkgewogICAgICAgIE9wZW5JRDo6TG9nKCJiZWdpbiB0cmFuc2FjdGlvbiIpOwogICAgICAgIENNU01TRGF0YWJhc2VDb25uZWN0aW9uOjpfR2V0RGIoKS0+QmVnaW5UcmFucygpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBjb21taXQoKSB7CiAgICAgICAgT3BlbklEOjpMb2coImNvbW1pdCB0cmFuc2FjdGlvbiIpOwogICAgICAgIENNU01TRGF0YWJhc2VDb25uZWN0aW9uOjpfR2V0RGIoKS0+Q29tbWl0VHJhbnMoKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0QWxsKCRzcWwsICRwYXJhbXMgPSBhcnJheSgpKSB7CiAgICAgICAgT3BlbklEOjpMb2coImdldEFsbCA6ICIuJHNxbC4iICIucHJpbnRfcigkcGFyYW1zLCBUUlVFKSk7CiAgICAgICAgJGRicmVzdWx0ID0gQ01TTVNEYXRhYmFzZUNvbm5lY3Rpb246Ol9HZXREYigpLT5FeGVjdXRlKCRzcWwsICRwYXJhbXMpOwogICAgICAgICRyZXN1bHQgPSBhcnJheSgpOwogICAgICAgIHdoaWxlICgkZGJyZXN1bHQgJiYgISRkYnJlc3VsdC0+RU9GKSB7CiAgICAgICAgICAgICRmaWVsZHMgPSAmICRkYnJlc3VsdC0+ZmllbGRzOwogICAgICAgICAgICAkcm93ID0gYXJyYXkoKTsKICAgICAgICAgICAgZm9yZWFjaCAoJGZpZWxkcyBhcyAka2V5ID0+ICR2YWx1ZSkgewogICAgICAgICAgICAgICAgJHJvd1ska2V5XSA9ICR2YWx1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkcmVzdWx0W10gPSAkcm93OwogICAgICAgICAgICAkZGJyZXN1bHQtPk1vdmVOZXh0KCk7CiAgICAgICAgfQogICAgICAgIE9wZW5JRDo6TG9nKCJyZXN1bHQgOiAiLnByaW50X3IoJHJlc3VsdCwgVFJVRSkpOwogICAgICAgIHJldHVybiAkcmVzdWx0OwoKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0T25lKCRzcWwsICRwYXJhbXMgPSBhcnJheSgpKSB7CiAgICAgICAgT3BlbklEOjpMb2coImdldE9uZSA6ICIuJHNxbC4iICIucHJpbnRfcigkcGFyYW1zLCBUUlVFKSk7CiAgICAgICAgJHJlc3VsdCA9IENNU01TRGF0YWJhc2VDb25uZWN0aW9uOjpfR2V0RGIoKS0+R2V0T25lKCRzcWwsICRwYXJhbXMpOwogICAgICAgIE9wZW5JRDo6TG9nKCJyZXN1bHQgOiAiLnByaW50X3IoJHJlc3VsdCwgVFJVRSkpOwogICAgICAgIHJldHVybiAkcmVzdWx0OwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRSb3coJHNxbCwgJHBhcmFtcyA9IGFycmF5KCkpIHsKICAgICAgICBPcGVuSUQ6OkxvZygiZ2V0Um93IDogIi4kc3FsLiIgIi5wcmludF9yKCRwYXJhbXMsIFRSVUUpKTsKICAgICAgICAkZGJyZXN1bHQgPSBDTVNNU0RhdGFiYXNlQ29ubmVjdGlvbjo6X0dldERiKCktPkV4ZWN1dGUoJHNxbCwgJHBhcmFtcyk7CiAgICAgICAgJHJlc3VsdCA9IGFycmF5KCk7CiAgICAgICAgaWYgKCRkYnJlc3VsdCAmJiAhJGRicmVzdWx0LT5FT0YpIHsKICAgICAgICAgICAgJGZpZWxkcyA9ICYgJGRicmVzdWx0LT5maWVsZHM7CiAgICAgICAgICAgIGZvcmVhY2ggKCRmaWVsZHMgYXMgJGtleSA9PiAkdmFsdWUpIHsKICAgICAgICAgICAgICAgICRyZXN1bHRbJGtleV0gPSAkdmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgT3BlbklEOjpMb2coInJlc3VsdCA6ICIucHJpbnRfcigkcmVzdWx0LCBUUlVFKSk7CiAgICAgICAgcmV0dXJuICRyZXN1bHQ7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIHF1ZXJ5KCRzcWwsICRwYXJhbXMgPSBhcnJheSgpKSB7CiAgICAgICAgT3BlbklEOjpMb2coInF1ZXJ5IDogIi4kc3FsLiIgIi5wcmludF9yKCRwYXJhbXMsIFRSVUUpKTsKICAgICAgICAkcmVzdWx0ID0mIENNU01TRGF0YWJhc2VDb25uZWN0aW9uOjpfR2V0RGIoKS0+RXhlY3V0ZSgkc3FsLCAkcGFyYW1zKTsKICAgICAgICBPcGVuSUQ6OkxvZygicmVzdWx0IDogIi5wcmludF9yKCRyZXN1bHQsIFRSVUUpKTsKICAgICAgICByZXR1cm4gJHJlc3VsdDsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gcm9sbGJhY2soKSB7CiAgICAgICAgT3BlbklEOjpMb2coInJvbGxiYWNrIHRyYW5zYWN0aW9uIik7CiAgICAgICAgQ01TTVNEYXRhYmFzZUNvbm5lY3Rpb246Ol9HZXREYigpLT5Sb2xsYmFja1RyYW5zKCk7CiAgICB9CgoKfQoKPz4K]]></data>
	</file>
	<file>
	  <filename>/LICENSE</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwoKICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCgogICAxLiBEZWZpbml0aW9ucy4KCiAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCiAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgoKICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgoKICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAogICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCiAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCiAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQogICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgogICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KCiAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KCiAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAogICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCiAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCgogICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAogICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0CiAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgoKICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQogICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KCiAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQogICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCiAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCiAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgogICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCiAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCgogICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwogICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCiAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQogICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCiAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgogICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAogICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwogICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAogICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQogICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCgogICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQogICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCgogICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAogICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQogICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCiAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCgogICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAogICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQogICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCiAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCiAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCiAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawogICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAogICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCiAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQogICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCgogICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQogICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CgogICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgogICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKCiAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAoKICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCiAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCiAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAogICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgogICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAoKICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCiAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0CiAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAogICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCiAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAogICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgogICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCiAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCiAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCiAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQogICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCiAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KCiAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAogICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCiAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCiAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAogICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgoKICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAogICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCiAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgoKICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQogICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCiAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQogICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KCiAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgogICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCiAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQogICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55CiAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KCiAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAogICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAogICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQogICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCiAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCiAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgoKICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwogICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAogICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAogICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwogICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQogICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgogICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCiAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQogICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCiAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgoKICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCgogICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCgogICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZwogICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCiAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCiAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCiAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQogICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCiAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgogICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCgogICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KCiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4K]]></data>
	</file>
	<file>
	  <filename>/method.install.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qCiAqICAgICAgQ29weXJpZ2h0IDIwMTAgSGVucmlrIExlbm5hcnRzc29uCiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKgogKiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICoKICovCgovKiBAdmFyICR0aGlzIE9wZW5JRCAqLwoKaWYoICFpc3NldCgkZ0NtcykgKSBleGl0OwoKICAgIC8vIE9wZW5JRCB0YWJsZXMgZm9yIGphbnJhaW4gbGlicmFyeQogICAgJGRic3RvcmUgPSYgJHRoaXMtPl9HZXRTdG9yZU15c3FsKCk7CiAgICAkZGJzdG9yZS0+Y3JlYXRlVGFibGVzKCk7CgogICAgLy8gVXNlciB0YWJsZSBmb3IgT3BlbklEIG1vZHVsZQogICAgJGRpY3QgPSBOZXdEYXRhRGljdGlvbmFyeSgkZGIpOwogICAgJG9wdGlvbnMgPSBhcnJheSgnbXlzcWwnID0+ICdUWVBFPU15SVNBTScpOwogICAgJHF1ZXJ5ID0gIgogICAgICAgICAgICAgaWQgSSBLRVksCgkgICAgIHByb3ZpZGVyIEMoODApIEtFWSwKICAgICAgICAgICAgIG9wZW5pZF9pZGVudGl0eSBDKDUwMCkgTk9UIE5VTEwsCiAgICAgICAgICAgICBlbWFpbCBDKDUwMCkgTlVMTCI7CiAgICAkc3FsYXJyYXkgPSAkZGljdC0+Q3JlYXRlVGFibGVTUUwoY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfb3BlbmlkX3VzZXJzIiwgJHF1ZXJ5LCAkb3B0aW9ucyApOwogICAgJGRpY3QtPkV4ZWN1dGVTUUxBcnJheSggJHNxbGFycmF5ICk7Cj8+Cg==]]></data>
	</file>
	<file>
	  <filename>/method.uninstall.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qCiAqICAgICAgQ29weXJpZ2h0IDIwMTAgSGVucmlrIExlbm5hcnRzc29uCiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKgogKiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICoKICovCgovKiBAdmFyICR0aGlzIE9wZW5JRCAqLwoKaWYgKCFpc3NldCgkZ0NtcykpCiAgICBleGl0OwokZGIgPSAmICR0aGlzLT5HZXREYigpOwokZGljdCA9IE5ld0RhdGFEaWN0aW9uYXJ5KCRkYik7CiRzcWxhcnJheSA9ICRkaWN0LT5Ecm9wVGFibGVTUUwoJHRoaXMtPl9HZXRBc3NvY2lhdGlvbnNUYWJsZU5hbWUoKSk7CiRkaWN0LT5FeGVjdXRlU1FMQXJyYXkoJHNxbGFycmF5KTsKJHNxbGFycmF5ID0gJGRpY3QtPkRyb3BUYWJsZVNRTCgkdGhpcy0+X0dldE5vbmNlc1RhYmxlTmFtZSgpKTsKJGRpY3QtPkV4ZWN1dGVTUUxBcnJheSgkc3FsYXJyYXkpOwokc3FsYXJyYXkgPSAkZGljdC0+RHJvcFRhYmxlU1FMKGNtc19kYl9wcmVmaXgoKSAuICJtb2R1bGVfb3BlbmlkX3VzZXJzIik7CiRkaWN0LT5FeGVjdXRlU1FMQXJyYXkoJHNxbGFycmF5KTsKCj8+Cg==]]></data>
	</file>
	<file>
	  <filename>/NOTICE</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[DQogICBPcGVuSUQgbW9kdWxlIGZvciBDTVMgTWFkZSBTaW1wbGUNCiAgIENvcHlyaWdodCAyMDEwIEhlbnJpayBMZW5uYXJ0c3NvbiBvcGVuaWRbYXRdbGVubmFydHNzb25zLm5ldA0KDQogICBUaGlzIG1vZHVsZSBpcyBiYXNlZCBvbiB0aGUgUEhQIE9wZW5JRCBsaWJyYXJ5IGJ5IEphblJhaW4sIEluYy4NCiAgIGxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgdjIgbGljZW5zZToNCg0KICAgICAgaHR0cDovL2dpdGh1Yi5jb20vb3BlbmlkL3BocC1vcGVuaWQvDQogICAgICBodHRwOi8vd3d3Lm9wZW5pZGVuYWJsZWQuY29tLw0KDQogICBUaGUgZnJvbnRlbmQgdXNlcyB0aGUgT3BlbklEIGpRdWVyeSBwbHVnaW4gZGV2ZWxvcGVkIGJ5IEphcnJldCBWYW5jZQ0KICAgYW5kIHJlbGVhc2VkIHVuZGVyIHRoZSBDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uIExpY2Vuc2U6DQoNCiAgICAgIGh0dHA6Ly9qdmFuY2UuY29tL3BhZ2VzL0pRdWVyeU9wZW5JRFBsdWdpbi54aHRtbA0KDQogICBqUXVlcnkgaXMgZGV2ZWxvcGVkIGJ5IGFuIGF3ZXNvbWUgYnVuY2ggb2YgcGVvcGxlIGFuZCBkdWFsIGxpY2Vuc2VkDQogICB1bmRlciB0aGUgTUlUIExpY2Vuc2UgYW5kIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDI6DQoNCiAgICAgaHR0cDovL3d3dy5qcXVlcnkuY29tDQoNCiAgIFRoZSBGYWNlYm9vayBpbnRlZ3JhdGlvbiB1c2VzIHRoZSBGYWNlYm9vayBvZmZpY2lhbCBQSFAgbGlicmFyeQ0KICAgbGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbmNlLCBWZXJzaW9uIDIuMA0KDQogICAgIGh0dHA6Ly9kZXZlbG9wZXJzLmZhY2Vib29rLmNvbS8NCiAgICAgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3BocC1zZGsvDQoNCiAgIENNUyBNYWRlIFNpbXBsZSBpcyBhIHJlYWxseSBuaWNlIGNvbnRlbnQgbWFuYWdlbWVudCBzeXN0ZW0gcmVsZWFzZWQgdW5kZXIgdGhlDQogICBHUEwgdjIgbGljZW5zZS4gWW91IHNob3VsZCByZWFsbHkgY2hlY2sgaXQgb3V0IGlmIHlvdSBoYXZlbid0IGFscmVhZHkuDQoNCiAgICAgaHR0cDovL3d3dy5jbXNtYWRlc2ltcGxlLm9yZy8NCg0K]]></data>
	</file>
	<file>
	  <filename>/openid-php-openid-782224d/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/openid-php-openid-782224d/Auth/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/openid-php-openid-782224d/Auth/OpenID.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBUaGlzIGlzIHRoZSBQSFAgT3BlbklEIGxpYnJhcnkgYnkgSmFuUmFpbiwgSW5jLgogKgogKiBUaGlzIG1vZHVsZSBjb250YWlucyBjb3JlIHV0aWxpdHkgZnVuY3Rpb25hbGl0eSB1c2VkIGJ5IHRoZQogKiBsaWJyYXJ5LiAgU2VlIENvbnN1bWVyLnBocCBhbmQgU2VydmVyLnBocCBmb3IgdGhlIGNvbnN1bWVyIGFuZAogKiBzZXJ2ZXIgaW1wbGVtZW50YXRpb25zLgogKgogKiBQSFAgdmVyc2lvbnMgNCBhbmQgNQogKgogKiBMSUNFTlNFOiBTZWUgdGhlIENPUFlJTkcgZmlsZSBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbi4KICoKICogQHBhY2thZ2UgT3BlbklECiAqIEBhdXRob3IgSmFuUmFpbiwgSW5jLiA8b3BlbmlkQGphbnJhaW4uY29tPgogKiBAY29weXJpZ2h0IDIwMDUtMjAwOCBKYW5yYWluLCBJbmMuCiAqIEBsaWNlbnNlIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCBBcGFjaGUKICovCgovKioKICogVGhlIGxpYnJhcnkgdmVyc2lvbiBzdHJpbmcKICovCmRlZmluZSgnQXV0aF9PcGVuSURfVkVSU0lPTicsICcyLjIuMicpOwoKLyoqCiAqIFJlcXVpcmUgdGhlIGZldGNoZXIgY29kZS4KICovCnJlcXVpcmVfb25jZSAiQXV0aC9ZYWRpcy9QbGFpbkhUVFBGZXRjaGVyLnBocCI7CnJlcXVpcmVfb25jZSAiQXV0aC9ZYWRpcy9QYXJhbm9pZEhUVFBGZXRjaGVyLnBocCI7CnJlcXVpcmVfb25jZSAiQXV0aC9PcGVuSUQvQmlnTWF0aC5waHAiOwpyZXF1aXJlX29uY2UgIkF1dGgvT3BlbklEL1VSSU5vcm0ucGhwIjsKCi8qKgogKiBTdGF0dXMgY29kZSByZXR1cm5lZCBieSB0aGUgc2VydmVyIHdoZW4gdGhlIG9ubHkgb3B0aW9uIGlzIHRvIHNob3cKICogYW4gZXJyb3IgcGFnZSwgc2luY2Ugd2UgZG8gbm90IGhhdmUgZW5vdWdoIGluZm9ybWF0aW9uIHRvIHJlZGlyZWN0CiAqIGJhY2sgdG8gdGhlIGNvbnN1bWVyLiBUaGUgYXNzb2NpYXRlZCB2YWx1ZSBpcyBhbiBlcnJvciBtZXNzYWdlIHRoYXQKICogc2hvdWxkIGJlIGRpc3BsYXllZCBvbiBhbiBIVE1MIGVycm9yIHBhZ2UuCiAqCiAqIEBzZWUgQXV0aF9PcGVuSURfU2VydmVyCiAqLwpkZWZpbmUoJ0F1dGhfT3BlbklEX0xPQ0FMX0VSUk9SJywgJ2xvY2FsX2Vycm9yJyk7CgovKioKICogU3RhdHVzIGNvZGUgcmV0dXJuZWQgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciB0byByZXR1cm4gaW4ga2V5LXZhbHVlCiAqIGZvcm0gdG8gdGhlIGNvbnN1bWVyLiBUaGUgY2FsbGVyIHNob3VsZCByZXR1cm4gYSA0MDAgQmFkIFJlcXVlc3QKICogcmVzcG9uc2Ugd2l0aCBjb250ZW50LXR5cGUgdGV4dC9wbGFpbiBhbmQgdGhlIHZhbHVlIGFzIHRoZSBib2R5LgogKgogKiBAc2VlIEF1dGhfT3BlbklEX1NlcnZlcgogKi8KZGVmaW5lKCdBdXRoX09wZW5JRF9SRU1PVEVfRVJST1InLCAncmVtb3RlX2Vycm9yJyk7CgovKioKICogU3RhdHVzIGNvZGUgcmV0dXJuZWQgd2hlbiB0aGVyZSBpcyBhIGtleS12YWx1ZSBmb3JtIE9LIHJlc3BvbnNlIHRvCiAqIHRoZSBjb25zdW1lci4gVGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNvZGUgaXMgdGhlCiAqIHJlc3BvbnNlLiBUaGUgY2FsbGVyIHNob3VsZCByZXR1cm4gYSAyMDAgT0sgcmVzcG9uc2Ugd2l0aAogKiBjb250ZW50LXR5cGUgdGV4dC9wbGFpbiBhbmQgdGhlIHZhbHVlIGFzIHRoZSBib2R5LgogKgogKiBAc2VlIEF1dGhfT3BlbklEX1NlcnZlcgogKi8KZGVmaW5lKCdBdXRoX09wZW5JRF9SRU1PVEVfT0snLCAncmVtb3RlX29rJyk7CgovKioKICogU3RhdHVzIGNvZGUgcmV0dXJuZWQgd2hlbiB0aGVyZSBpcyBhIHJlZGlyZWN0IGJhY2sgdG8gdGhlCiAqIGNvbnN1bWVyLiBUaGUgdmFsdWUgaXMgdGhlIFVSTCB0byByZWRpcmVjdCBiYWNrIHRvLiBUaGUgY2FsbGVyCiAqIHNob3VsZCByZXR1cm4gYSAzMDIgRm91bmQgcmVkaXJlY3Qgd2l0aCBhIExvY2F0aW9uOiBoZWFkZXIKICogY29udGFpbmluZyB0aGUgVVJMLgogKgogKiBAc2VlIEF1dGhfT3BlbklEX1NlcnZlcgogKi8KZGVmaW5lKCdBdXRoX09wZW5JRF9SRURJUkVDVCcsICdyZWRpcmVjdCcpOwoKLyoqCiAqIFN0YXR1cyBjb2RlIHJldHVybmVkIHdoZW4gdGhlIGNhbGxlciBuZWVkcyB0byBhdXRoZW50aWNhdGUgdGhlCiAqIHVzZXIuIFRoZSBhc3NvY2lhdGVkIHZhbHVlIGlzIGEge0BsaW5rIEF1dGhfT3BlbklEX1NlcnZlclJlcXVlc3R9CiAqIG9iamVjdCB0aGF0IGNhbiBiZSB1c2VkIHRvIGNvbXBsZXRlIHRoZSBhdXRoZW50aWNhdGlvbi4gSWYgdGhlIHVzZXIKICogaGFzIHRha2VuIHNvbWUgYXV0aGVudGljYXRpb24gYWN0aW9uLCB1c2UgdGhlIHJldHJ5KCkgbWV0aG9kIG9mIHRoZQogKiB7QGxpbmsgQXV0aF9PcGVuSURfU2VydmVyUmVxdWVzdH0gb2JqZWN0IHRvIGNvbXBsZXRlIHRoZSByZXF1ZXN0LgogKgogKiBAc2VlIEF1dGhfT3BlbklEX1NlcnZlcgogKi8KZGVmaW5lKCdBdXRoX09wZW5JRF9ET19BVVRIJywgJ2RvX2F1dGgnKTsKCi8qKgogKiBTdGF0dXMgY29kZSByZXR1cm5lZCB3aGVuIHRoZXJlIHdlcmUgbm8gT3BlbklEIGFyZ3VtZW50cwogKiBwYXNzZWQuIFRoaXMgY29kZSBpbmRpY2F0ZXMgdGhhdCB0aGUgY2FsbGVyIHNob3VsZCByZXR1cm4gYSAyMDAgT0sKICogcmVzcG9uc2UgYW5kIGRpc3BsYXkgYW4gSFRNTCBwYWdlIHRoYXQgc2F5cyB0aGF0IHRoaXMgaXMgYW4gT3BlbklECiAqIHNlcnZlciBlbmRwb2ludC4KICoKICogQHNlZSBBdXRoX09wZW5JRF9TZXJ2ZXIKICovCmRlZmluZSgnQXV0aF9PcGVuSURfRE9fQUJPVVQnLCAnZG9fYWJvdXQnKTsKCi8qKgogKiBEZWZpbmVzIGZvciByZWdleGVzIGFuZCBmb3JtYXQgY2hlY2tpbmcuCiAqLwpkZWZpbmUoJ0F1dGhfT3BlbklEX2xldHRlcnMnLAogICAgICAgImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVoiKTsKCmRlZmluZSgnQXV0aF9PcGVuSURfZGlnaXRzJywKICAgICAgICIwMTIzNDU2Nzg5Iik7CgpkZWZpbmUoJ0F1dGhfT3BlbklEX3B1bmN0JywKICAgICAgICIhXCIjJCUmJygpKissLS4vOjs8PT4/QFtcXF1eX2B7fH1+Iik7CgpBdXRoX09wZW5JRF9pbmNsdWRlX2luaXQoKTsKCi8qKgogKiBUaGUgT3BlbklEIHV0aWxpdHkgZnVuY3Rpb24gY2xhc3MuCiAqCiAqIEBwYWNrYWdlIE9wZW5JRAogKiBAYWNjZXNzIHByaXZhdGUKICovCmNsYXNzIEF1dGhfT3BlbklEIHsKCiAgICAvKioKICAgICAqIFJldHVybiB0cnVlIGlmICR0aGluZyBpcyBhbiBBdXRoX09wZW5JRF9GYWlsdXJlUmVzcG9uc2Ugb2JqZWN0OwogICAgICogZmFsc2UgaWYgbm90LgogICAgICoKICAgICAqIEBhY2Nlc3MgcHJpdmF0ZQogICAgICovCiAgICBzdGF0aWMgZnVuY3Rpb24gaXNGYWlsdXJlKCR0aGluZykKICAgIHsKICAgICAgICByZXR1cm4gaXNfYSgkdGhpbmcsICdBdXRoX09wZW5JRF9GYWlsdXJlUmVzcG9uc2UnKTsKICAgIH0KCiAgICAvKioKICAgICAqIEdldHMgdGhlIHF1ZXJ5IGRhdGEgZnJvbSB0aGUgc2VydmVyIGVudmlyb25tZW50IGJhc2VkIG9uIHRoZQogICAgICogcmVxdWVzdCBtZXRob2QgdXNlZC4gIElmIEdFVCB3YXMgdXNlZCwgdGhpcyBsb29rcyBhdAogICAgICogJF9TRVJWRVJbJ1FVRVJZX1NUUklORyddIGRpcmVjdGx5LiAgSWYgUE9TVCB3YXMgdXNlZCwgdGhpcwogICAgICogZmV0Y2hlcyBkYXRhIGZyb20gdGhlIHNwZWNpYWwgcGhwOi8vaW5wdXQgZmlsZSBzdHJlYW0uCiAgICAgKgogICAgICogUmV0dXJucyBhbiBhc3NvY2lhdGl2ZSBhcnJheSBvZiB0aGUgcXVlcnkgYXJndW1lbnRzLgogICAgICoKICAgICAqIFNraXBzIGludmFsaWQga2V5L3ZhbHVlIHBhaXJzIChpLmUuIGtleXMgd2l0aCBubyAnPXZhbHVlJwogICAgICogcG9ydGlvbikuCiAgICAgKgogICAgICogUmV0dXJucyBhbiBlbXB0eSBhcnJheSBpZiBuZWl0aGVyIEdFVCBub3IgUE9TVCB3YXMgdXNlZCwgb3IgaWYKICAgICAqIFBPU1Qgd2FzIHVzZWQgYnV0IHBocDovL2lucHV0IGNhbm5vdCBiZSBvcGVuZWQuCiAgICAgKgogICAgICogU2VlIGJhY2tncm91bmQ6CiAgICAgKiBodHRwOi8vbGlzdHMub3BlbmlkZW5hYmxlZC5jb20vcGlwZXJtYWlsL2Rldi8yMDA3LU1hcmNoLzAwMDM5NS5odG1sCiAgICAgKgogICAgICogQGFjY2VzcyBwcml2YXRlCiAgICAgKi8KICAgIHN0YXRpYyBmdW5jdGlvbiBnZXRRdWVyeSgkcXVlcnlfc3RyPW51bGwpCiAgICB7CiAgICAgICAgJGRhdGEgPSBhcnJheSgpOwoKICAgICAgICBpZiAoJHF1ZXJ5X3N0ciAhPT0gbnVsbCkgewogICAgICAgICAgICAkZGF0YSA9IEF1dGhfT3BlbklEOjpwYXJhbXNfZnJvbV9zdHJpbmcoJHF1ZXJ5X3N0cik7CiAgICAgICAgfSBlbHNlIGlmICghYXJyYXlfa2V5X2V4aXN0cygnUkVRVUVTVF9NRVRIT0QnLCAkX1NFUlZFUikpIHsKICAgICAgICAgICAgLy8gRG8gbm90aGluZy4KICAgICAgICB9IGVsc2UgewogICAgICAgICAgLy8gWFhYIEhBQ0sgRklYTUUgSE9SUklCTEUuCiAgICAgICAgICAvLwogICAgICAgICAgLy8gUE9TVGluZyB0byBhIFVSTCB3aXRoIHF1ZXJ5IHBhcmFtZXRlcnMgaXMgYWNjZXB0YWJsZSwgYnV0CiAgICAgICAgICAvLyB3ZSBkb24ndCBoYXZlIGEgY2xlYW4gd2F5IHRvIGRpc3Rpbmd1aXNoIHRob3NlIHBhcmFtZXRlcnMKICAgICAgICAgIC8vIHdoZW4gd2UgbmVlZCB0byBkbyB0aGluZ3MgbGlrZSByZXR1cm5fdG8gdmVyaWZpY2F0aW9uCiAgICAgICAgICAvLyB3aGljaCBvbmx5IHdhbnQgdG8gbG9vayBhdCBvbmUga2luZCBvZiBwYXJhbWV0ZXIuICBXZSdyZQogICAgICAgICAgLy8gZ29pbmcgdG8gZW11bGF0ZSB0aGUgYmVoYXZpb3Igb2Ygc29tZSBvdGhlciBlbnZpcm9ubWVudHMKICAgICAgICAgIC8vIGJ5IGRlZmF1bHRpbmcgdG8gR0VUIGFuZCBvdmVyd3JpdGluZyB3aXRoIFBPU1QgaWYgUE9TVAogICAgICAgICAgLy8gZGF0YSBpcyBhdmFpbGFibGUuCiAgICAgICAgICAkZGF0YSA9IEF1dGhfT3BlbklEOjpwYXJhbXNfZnJvbV9zdHJpbmcoJF9TRVJWRVJbJ1FVRVJZX1NUUklORyddKTsKCiAgICAgICAgICBpZiAoJF9TRVJWRVJbJ1JFUVVFU1RfTUVUSE9EJ10gPT0gJ1BPU1QnKSB7CiAgICAgICAgICAgICRzdHIgPSBmaWxlX2dldF9jb250ZW50cygncGhwOi8vaW5wdXQnKTsKCiAgICAgICAgICAgIGlmICgkc3RyID09PSBmYWxzZSkgewogICAgICAgICAgICAgICRwb3N0ID0gYXJyYXkoKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAkcG9zdCA9IEF1dGhfT3BlbklEOjpwYXJhbXNfZnJvbV9zdHJpbmcoJHN0cik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRkYXRhID0gYXJyYXlfbWVyZ2UoJGRhdGEsICRwb3N0KTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiAkZGF0YTsKICAgIH0KCiAgICBzdGF0aWMgZnVuY3Rpb24gcGFyYW1zX2Zyb21fc3RyaW5nKCRzdHIpCiAgICB7CiAgICAgICAgJGNodW5rcyA9IGV4cGxvZGUoIiYiLCAkc3RyKTsKCiAgICAgICAgJGRhdGEgPSBhcnJheSgpOwogICAgICAgIGZvcmVhY2ggKCRjaHVua3MgYXMgJGNodW5rKSB7CiAgICAgICAgICAgICRwYXJ0cyA9IGV4cGxvZGUoIj0iLCAkY2h1bmssIDIpOwoKICAgICAgICAgICAgaWYgKGNvdW50KCRwYXJ0cykgIT0gMikgewogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxpc3QoJGssICR2KSA9ICRwYXJ0czsKICAgICAgICAgICAgJGRhdGFbdXJsZGVjb2RlKCRrKV0gPSB1cmxkZWNvZGUoJHYpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRkYXRhOwogICAgfQoKICAgIC8qKgogICAgICogQ3JlYXRlIGRpcl9uYW1lIGFzIGEgZGlyZWN0b3J5IGlmIGl0IGRvZXMgbm90IGV4aXN0LiBJZiBpdAogICAgICogZXhpc3RzLCBtYWtlIHN1cmUgdGhhdCBpdCBpcywgaW4gZmFjdCwgYSBkaXJlY3RvcnkuICBSZXR1cm5zCiAgICAgKiB0cnVlIGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZGVkOyBmYWxzZSBpZiBub3QuCiAgICAgKgogICAgICogQGFjY2VzcyBwcml2YXRlCiAgICAgKi8KICAgIHN0YXRpYyBmdW5jdGlvbiBlbnN1cmVEaXIoJGRpcl9uYW1lKQogICAgewogICAgICAgIGlmIChpc19kaXIoJGRpcl9uYW1lKSB8fCBAbWtkaXIoJGRpcl9uYW1lKSkgewogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkcGFyZW50X2RpciA9IGRpcm5hbWUoJGRpcl9uYW1lKTsKCiAgICAgICAgICAgIC8vIFRlcm1pbmFsIGNhc2U7IHRoZXJlIGlzIG5vIHBhcmVudCBkaXJlY3RvcnkgdG8gY3JlYXRlLgogICAgICAgICAgICBpZiAoJHBhcmVudF9kaXIgPT0gJGRpcl9uYW1lKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIChBdXRoX09wZW5JRDo6ZW5zdXJlRGlyKCRwYXJlbnRfZGlyKSAmJiBAbWtkaXIoJGRpcl9uYW1lKSk7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQWRkcyBhIHN0cmluZyBwcmVmaXggdG8gYWxsIHZhbHVlcyBvZiBhbiBhcnJheS4gIFJldHVybnMgYSBuZXcKICAgICAqIGFycmF5IGNvbnRhaW5pbmcgdGhlIHByZWZpeGVkIHZhbHVlcy4KICAgICAqCiAgICAgKiBAYWNjZXNzIHByaXZhdGUKICAgICAqLwogICAgc3RhdGljIGZ1bmN0aW9uIGFkZFByZWZpeCgkdmFsdWVzLCAkcHJlZml4KQogICAgewogICAgICAgICRuZXdfdmFsdWVzID0gYXJyYXkoKTsKICAgICAgICBmb3JlYWNoICgkdmFsdWVzIGFzICRzKSB7CiAgICAgICAgICAgICRuZXdfdmFsdWVzW10gPSAkcHJlZml4IC4gJHM7CiAgICAgICAgfQogICAgICAgIHJldHVybiAkbmV3X3ZhbHVlczsKICAgIH0KCiAgICAvKioKICAgICAqIENvbnZlbmllbmNlIGZ1bmN0aW9uIGZvciBnZXR0aW5nIGFycmF5IHZhbHVlcy4gIEdpdmVuIGFuIGFycmF5CiAgICAgKiAkYXJyIGFuZCBhIGtleSAka2V5LCBnZXQgdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUgZnJvbSB0aGUgYXJyYXkKICAgICAqIG9yIHJldHVybiAkZGVmYXVsdCBpZiB0aGUga2V5IGlzIGFic2VudC4KICAgICAqCiAgICAgKiBAYWNjZXNzIHByaXZhdGUKICAgICAqLwogICAgc3RhdGljIGZ1bmN0aW9uIGFycmF5R2V0KCRhcnIsICRrZXksICRmYWxsYmFjayA9IG51bGwpCiAgICB7CiAgICAgICAgaWYgKGlzX2FycmF5KCRhcnIpKSB7CiAgICAgICAgICAgIGlmIChhcnJheV9rZXlfZXhpc3RzKCRrZXksICRhcnIpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJGFyclska2V5XTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiAkZmFsbGJhY2s7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0cmlnZ2VyX2Vycm9yKCJBdXRoX09wZW5JRDo6YXJyYXlHZXQgKGtleSA9ICIuJGtleS4iKSBleHBlY3RlZCAiIC4KICAgICAgICAgICAgICAgICAgICAgICAgICAiYXJyYXkgYXMgZmlyc3QgcGFyYW1ldGVyLCBnb3QgIiAuCiAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0dHlwZSgkYXJyKSwgRV9VU0VSX1dBUk5JTkcpOwoKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIFJlcGxhY2VtZW50IGZvciBQSFAncyBicm9rZW4gcGFyc2Vfc3RyLgogICAgICovCiAgICBzdGF0aWMgZnVuY3Rpb24gcGFyc2Vfc3RyKCRxdWVyeSkKICAgIHsKICAgICAgICBpZiAoJHF1ZXJ5ID09PSBudWxsKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KCiAgICAgICAgJHBhcnRzID0gZXhwbG9kZSgnJicsICRxdWVyeSk7CgogICAgICAgICRuZXdfcGFydHMgPSBhcnJheSgpOwogICAgICAgIGZvciAoJGkgPSAwOyAkaSA8IGNvdW50KCRwYXJ0cyk7ICRpKyspIHsKICAgICAgICAgICAgJHBhaXIgPSBleHBsb2RlKCc9JywgJHBhcnRzWyRpXSk7CgogICAgICAgICAgICBpZiAoY291bnQoJHBhaXIpICE9IDIpIHsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsaXN0KCRrZXksICR2YWx1ZSkgPSAkcGFpcjsKICAgICAgICAgICAgJG5ld19wYXJ0c1t1cmxkZWNvZGUoJGtleSldID0gdXJsZGVjb2RlKCR2YWx1ZSk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJG5ld19wYXJ0czsKICAgIH0KCiAgICAvKioKICAgICAqIEltcGxlbWVudHMgdGhlIFBIUCA1ICdodHRwX2J1aWxkX3F1ZXJ5JyBmdW5jdGlvbmFsaXR5LgogICAgICoKICAgICAqIEBhY2Nlc3MgcHJpdmF0ZQogICAgICogQHBhcmFtIGFycmF5ICRkYXRhIEVpdGhlciBhbiBhcnJheSBrZXkvdmFsdWUgcGFpcnMgb3IgYW4gYXJyYXkKICAgICAqIG9mIGFycmF5cywgZWFjaCBvZiB3aGljaCBob2xkaW5nIHR3byB2YWx1ZXM6IGEga2V5IGFuZCBhIHZhbHVlLAogICAgICogc2VxdWVudGlhbGx5LgogICAgICogQHJldHVybiBzdHJpbmcgJHJlc3VsdCBUaGUgcmVzdWx0IG9mIHVybC1lbmNvZGluZyB0aGUga2V5L3ZhbHVlCiAgICAgKiBwYWlycyBmcm9tICRkYXRhIGludG8gYSBVUkwgcXVlcnkgc3RyaW5nCiAgICAgKiAoZS5nLiAidXNlcm5hbWU9Ym9iJmlkPTU2IikuCiAgICAgKi8KICAgIHN0YXRpYyBmdW5jdGlvbiBodHRwQnVpbGRRdWVyeSgkZGF0YSkKICAgIHsKICAgICAgICAkcGFpcnMgPSBhcnJheSgpOwogICAgICAgIGZvcmVhY2ggKCRkYXRhIGFzICRrZXkgPT4gJHZhbHVlKSB7CiAgICAgICAgICAgIGlmIChpc19hcnJheSgkdmFsdWUpKSB7CiAgICAgICAgICAgICAgICAkcGFpcnNbXSA9IHVybGVuY29kZSgkdmFsdWVbMF0pLiI9Ii51cmxlbmNvZGUoJHZhbHVlWzFdKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICRwYWlyc1tdID0gdXJsZW5jb2RlKCRrZXkpLiI9Ii51cmxlbmNvZGUoJHZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gaW1wbG9kZSgiJiIsICRwYWlycyk7CiAgICB9CgogICAgLyoqCiAgICAgKiAiQXBwZW5kcyIgcXVlcnkgYXJndW1lbnRzIG9udG8gYSBVUkwuICBUaGUgVVJMIG1heSBvciBtYXkgbm90CiAgICAgKiBhbHJlYWR5IGhhdmUgYXJndW1lbnRzIChmb2xsb3dpbmcgYSBxdWVzdGlvbiBtYXJrKS4KICAgICAqCiAgICAgKiBAYWNjZXNzIHByaXZhdGUKICAgICAqIEBwYXJhbSBzdHJpbmcgJHVybCBBIFVSTCwgd2hpY2ggbWF5IG9yIG1heSBub3QgYWxyZWFkeSBoYXZlCiAgICAgKiBhcmd1bWVudHMuCiAgICAgKiBAcGFyYW0gYXJyYXkgJGFyZ3MgRWl0aGVyIGFuIGFycmF5IGtleS92YWx1ZSBwYWlycyBvciBhbiBhcnJheSBvZgogICAgICogYXJyYXlzLCBlYWNoIG9mIHdoaWNoIGhvbGRpbmcgdHdvIHZhbHVlczogYSBrZXkgYW5kIGEgdmFsdWUsCiAgICAgKiBzZXF1ZW50aWFsbHkuICBJZiAkYXJncyBpcyBhbiBvcmRpbmFyeSBrZXkvdmFsdWUgYXJyYXksIHRoZQogICAgICogcGFyYW1ldGVycyB3aWxsIGJlIGFkZGVkIHRvIHRoZSBVUkwgaW4gc29ydGVkIGFscGhhYmV0aWNhbCBvcmRlcjsKICAgICAqIGlmICRhcmdzIGlzIGFuIGFycmF5IG9mIGFycmF5cywgdGhlaXIgb3JkZXIgd2lsbCBiZSBwcmVzZXJ2ZWQuCiAgICAgKiBAcmV0dXJuIHN0cmluZyAkdXJsIFRoZSBvcmlnaW5hbCBVUkwgd2l0aCB0aGUgbmV3IHBhcmFtZXRlcnMgYWRkZWQuCiAgICAgKgogICAgICovCiAgICBzdGF0aWMgZnVuY3Rpb24gYXBwZW5kQXJncygkdXJsLCAkYXJncykKICAgIHsKICAgICAgICBpZiAoY291bnQoJGFyZ3MpID09IDApIHsKICAgICAgICAgICAgcmV0dXJuICR1cmw7CiAgICAgICAgfQoKICAgICAgICAvLyBOb24tZW1wdHkgYXJyYXk7IGlmIGl0IGlzIGFuIGFycmF5IG9mIGFycmF5cywgdXNlCiAgICAgICAgLy8gbXVsdGlzb3J0OyBvdGhlcndpc2UgdXNlIHNvcnQuCiAgICAgICAgaWYgKGFycmF5X2tleV9leGlzdHMoMCwgJGFyZ3MpICYmCiAgICAgICAgICAgIGlzX2FycmF5KCRhcmdzWzBdKSkgewogICAgICAgICAgICAvLyBEbyBub3RoaW5nIGhlcmUuCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJGtleXMgPSBhcnJheV9rZXlzKCRhcmdzKTsKICAgICAgICAgICAgc29ydCgka2V5cyk7CiAgICAgICAgICAgICRuZXdfYXJncyA9IGFycmF5KCk7CiAgICAgICAgICAgIGZvcmVhY2ggKCRrZXlzIGFzICRrZXkpIHsKICAgICAgICAgICAgICAgICRuZXdfYXJnc1tdID0gYXJyYXkoJGtleSwgJGFyZ3NbJGtleV0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRhcmdzID0gJG5ld19hcmdzOwogICAgICAgIH0KCiAgICAgICAgJHNlcCA9ICc/JzsKICAgICAgICBpZiAoc3RycG9zKCR1cmwsICc/JykgIT09IGZhbHNlKSB7CiAgICAgICAgICAgICRzZXAgPSAnJic7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJHVybCAuICRzZXAgLiBBdXRoX09wZW5JRDo6aHR0cEJ1aWxkUXVlcnkoJGFyZ3MpOwogICAgfQoKICAgIC8qKgogICAgICogSW1wbGVtZW50cyBweXRob24ncyB1cmx1bnBhcnNlLCB3aGljaCBpcyBub3QgYXZhaWxhYmxlIGluIFBIUC4KICAgICAqIEdpdmVuIHRoZSBzcGVjaWZpZWQgY29tcG9uZW50cyBvZiBhIFVSTCwgdGhpcyBmdW5jdGlvbiByZWJ1aWxkcwogICAgICogYW5kIHJldHVybnMgdGhlIFVSTC4KICAgICAqCiAgICAgKiBAYWNjZXNzIHByaXZhdGUKICAgICAqIEBwYXJhbSBzdHJpbmcgJHNjaGVtZSBUaGUgc2NoZW1lIChlLmcuICdodHRwJykuICBEZWZhdWx0cyB0byAnaHR0cCcuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRob3N0IFRoZSBob3N0LiAgUmVxdWlyZWQuCiAgICAgKiBAcGFyYW0gc3RyaW5nICRwb3J0IFRoZSBwb3J0LgogICAgICogQHBhcmFtIHN0cmluZyAkcGF0aCBUaGUgcGF0aC4KICAgICAqIEBwYXJhbSBzdHJpbmcgJHF1ZXJ5IFRoZSBxdWVyeS4KICAgICAqIEBwYXJhbSBzdHJpbmcgJGZyYWdtZW50IFRoZSBmcmFnbWVudC4KICAgICAqIEByZXR1cm4gc3RyaW5nICR1cmwgVGhlIFVSTCByZXN1bHRpbmcgZnJvbSBhc3NlbWJsaW5nIHRoZQogICAgICogc3BlY2lmaWVkIGNvbXBvbmVudHMuCiAgICAgKi8KICAgIHN0YXRpYyBmdW5jdGlvbiB1cmx1bnBhcnNlKCRzY2hlbWUsICRob3N0LCAkcG9ydCA9IG51bGwsICRwYXRoID0gJy8nLAogICAgICAgICAgICAgICAgICAgICAgICAkcXVlcnkgPSAnJywgJGZyYWdtZW50ID0gJycpCiAgICB7CgogICAgICAgIGlmICghJHNjaGVtZSkgewogICAgICAgICAgICAkc2NoZW1lID0gJ2h0dHAnOwogICAgICAgIH0KCiAgICAgICAgaWYgKCEkaG9zdCkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICBpZiAoISRwYXRoKSB7CiAgICAgICAgICAgICRwYXRoID0gJyc7CiAgICAgICAgfQoKICAgICAgICAkcmVzdWx0ID0gJHNjaGVtZSAuICI6Ly8iIC4gJGhvc3Q7CgogICAgICAgIGlmICgkcG9ydCkgewogICAgICAgICAgICAkcmVzdWx0IC49ICI6IiAuICRwb3J0OwogICAgICAgIH0KCiAgICAgICAgJHJlc3VsdCAuPSAkcGF0aDsKCiAgICAgICAgaWYgKCRxdWVyeSkgewogICAgICAgICAgICAkcmVzdWx0IC49ICI/IiAuICRxdWVyeTsKICAgICAgICB9CgogICAgICAgIGlmICgkZnJhZ21lbnQpIHsKICAgICAgICAgICAgJHJlc3VsdCAuPSAiIyIgLiAkZnJhZ21lbnQ7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJHJlc3VsdDsKICAgIH0KCiAgICAvKioKICAgICAqIEdpdmVuIGEgVVJMLCB0aGlzICJub3JtYWxpemVzIiBpdCBieSBhZGRpbmcgYSB0cmFpbGluZyBzbGFzaAogICAgICogYW5kIC8gb3IgYSBsZWFkaW5nIGh0dHA6Ly8gc2NoZW1lIHdoZXJlIG5lY2Vzc2FyeS4gIFJldHVybnMKICAgICAqIG51bGwgaWYgdGhlIG9yaWdpbmFsIFVSTCBpcyBtYWxmb3JtZWQgYW5kIGNhbm5vdCBiZSBub3JtYWxpemVkLgogICAgICoKICAgICAqIEBhY2Nlc3MgcHJpdmF0ZQogICAgICogQHBhcmFtIHN0cmluZyAkdXJsIFRoZSBVUkwgdG8gYmUgbm9ybWFsaXplZC4KICAgICAqIEByZXR1cm4gbWl4ZWQgJG5ld191cmwgVGhlIFVSTCBhZnRlciBub3JtYWxpemF0aW9uLCBvciBudWxsIGlmCiAgICAgKiAkdXJsIHdhcyBtYWxmb3JtZWQuCiAgICAgKi8KICAgIHN0YXRpYyBmdW5jdGlvbiBub3JtYWxpemVVcmwoJHVybCkKICAgIHsKICAgICAgICBAJHBhcnNlZCA9IHBhcnNlX3VybCgkdXJsKTsKCiAgICAgICAgaWYgKCEkcGFyc2VkKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KCiAgICAgICAgaWYgKGlzc2V0KCRwYXJzZWRbJ3NjaGVtZSddKSAmJgogICAgICAgICAgICBpc3NldCgkcGFyc2VkWydob3N0J10pKSB7CiAgICAgICAgICAgICRzY2hlbWUgPSBzdHJ0b2xvd2VyKCRwYXJzZWRbJ3NjaGVtZSddKTsKICAgICAgICAgICAgaWYgKCFpbl9hcnJheSgkc2NoZW1lLCBhcnJheSgnaHR0cCcsICdodHRwcycpKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkdXJsID0gJ2h0dHA6Ly8nIC4gJHVybDsKICAgICAgICB9CgogICAgICAgICRub3JtYWxpemVkID0gQXV0aF9PcGVuSURfdXJpbm9ybSgkdXJsKTsKICAgICAgICBpZiAoJG5vcm1hbGl6ZWQgPT09IG51bGwpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIGxpc3QoJGRlZnJhZ2dlZCwgJGZyYWcpID0gQXV0aF9PcGVuSUQ6OnVybGRlZnJhZygkbm9ybWFsaXplZCk7CiAgICAgICAgcmV0dXJuICRkZWZyYWdnZWQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXBsYWNlbWVudCAod3JhcHBlcikgZm9yIFBIUCdzIGludHZhbCgpIGJlY2F1c2UgaXQncyBicm9rZW4uCiAgICAgKgogICAgICogQGFjY2VzcyBwcml2YXRlCiAgICAgKi8KICAgIHN0YXRpYyBmdW5jdGlvbiBpbnR2YWwoJHZhbHVlKQogICAgewogICAgICAgICRyZSA9ICIvXlxcZCskLyI7CgogICAgICAgIGlmICghcHJlZ19tYXRjaCgkcmUsICR2YWx1ZSkpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGludHZhbCgkdmFsdWUpOwogICAgfQoKICAgIC8qKgogICAgICogQ291bnQgdGhlIG51bWJlciBvZiBieXRlcyBpbiBhIHN0cmluZyBpbmRlcGVuZGVudGx5IG9mCiAgICAgKiBtdWx0aWJ5dGUgc3VwcG9ydCBjb25kaXRpb25zLgogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgJHN0ciBUaGUgc3RyaW5nIG9mIGJ5dGVzIHRvIGNvdW50LgogICAgICogQHJldHVybiBpbnQgVGhlIG51bWJlciBvZiBieXRlcyBpbiAkc3RyLgogICAgICovCiAgICBzdGF0aWMgZnVuY3Rpb24gYnl0ZXMoJHN0cikKICAgIHsKICAgICAgICByZXR1cm4gc3RybGVuKGJpbjJoZXgoJHN0cikpIC8gMjsKICAgIH0KCiAgICAvKioKICAgICAqIEdldCB0aGUgYnl0ZXMgaW4gYSBzdHJpbmcgaW5kZXBlbmRlbnRseSBvZiBtdWx0aWJ5dGUgc3VwcG9ydAogICAgICogY29uZGl0aW9ucy4KICAgICAqLwogICAgc3RhdGljIGZ1bmN0aW9uIHRvQnl0ZXMoJHN0cikKICAgIHsKICAgICAgICAkaGV4ID0gYmluMmhleCgkc3RyKTsKCiAgICAgICAgaWYgKCEkaGV4KSB7CiAgICAgICAgICAgIHJldHVybiBhcnJheSgpOwogICAgICAgIH0KCiAgICAgICAgJGIgPSBhcnJheSgpOwogICAgICAgIGZvciAoJGkgPSAwOyAkaSA8IHN0cmxlbigkaGV4KTsgJGkgKz0gMikgewogICAgICAgICAgICAkYltdID0gY2hyKGJhc2VfY29udmVydChzdWJzdHIoJGhleCwgJGksIDIpLCAxNiwgMTApKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkYjsKICAgIH0KCiAgICBzdGF0aWMgZnVuY3Rpb24gdXJsZGVmcmFnKCR1cmwpCiAgICB7CiAgICAgICAgJHBhcnRzID0gZXhwbG9kZSgiIyIsICR1cmwsIDIpOwoKICAgICAgICBpZiAoY291bnQoJHBhcnRzKSA9PSAxKSB7CiAgICAgICAgICAgIHJldHVybiBhcnJheSgkcGFydHNbMF0sICIiKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gJHBhcnRzOwogICAgICAgIH0KICAgIH0KCiAgICBzdGF0aWMgZnVuY3Rpb24gZmlsdGVyKCRjYWxsYmFjaywgJiRzZXF1ZW5jZSkKICAgIHsKICAgICAgICAkcmVzdWx0ID0gYXJyYXkoKTsKCiAgICAgICAgZm9yZWFjaCAoJHNlcXVlbmNlIGFzICRpdGVtKSB7CiAgICAgICAgICAgIGlmIChjYWxsX3VzZXJfZnVuY19hcnJheSgkY2FsbGJhY2ssIGFycmF5KCRpdGVtKSkpIHsKICAgICAgICAgICAgICAgICRyZXN1bHRbXSA9ICRpdGVtOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJHJlc3VsdDsKICAgIH0KCiAgICBzdGF0aWMgZnVuY3Rpb24gdXBkYXRlKCYkZGVzdCwgJiRzcmMpCiAgICB7CiAgICAgICAgZm9yZWFjaCAoJHNyYyBhcyAkayA9PiAkdikgewogICAgICAgICAgICAkZGVzdFska10gPSAkdjsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBXcmFwIFBIUCdzIHN0YW5kYXJkIGVycm9yX2xvZyBmdW5jdGlvbmFsaXR5LiAgVXNlIHRoaXMgdG8KICAgICAqIHBlcmZvcm0gYWxsIGxvZ2dpbmcuIEl0IHdpbGwgaW50ZXJwb2xhdGUgYW55IGFkZGl0aW9uYWwKICAgICAqIGFyZ3VtZW50cyBpbnRvIHRoZSBmb3JtYXQgc3RyaW5nIGJlZm9yZSBsb2dnaW5nLgogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgJGZvcm1hdF9zdHJpbmcgVGhlIHNwcmludGYgZm9ybWF0IGZvciB0aGUgbWVzc2FnZQogICAgICovCiAgICBzdGF0aWMgZnVuY3Rpb24gbG9nKCRmb3JtYXRfc3RyaW5nKQogICAgewogICAgICAgICRhcmdzID0gZnVuY19nZXRfYXJncygpOwogICAgICAgICRtZXNzYWdlID0gY2FsbF91c2VyX2Z1bmNfYXJyYXkoJ3NwcmludGYnLCAkYXJncyk7CiAgICAgICAgZXJyb3JfbG9nKCRtZXNzYWdlKTsKICAgIH0KCiAgICBzdGF0aWMgZnVuY3Rpb24gYXV0b1N1Ym1pdEhUTUwoJGZvcm0sICR0aXRsZT0iT3BlbklkIHRyYW5zYWN0aW9uIGluIHByb2dyZXNzIikKICAgIHsKICAgICAgICByZXR1cm4oIjxodG1sPiIuCiAgICAgICAgICAgICAgICI8aGVhZD48dGl0bGU+Ii4KICAgICAgICAgICAgICAgJHRpdGxlIC4KICAgICAgICAgICAgICAgIjwvdGl0bGU+PC9oZWFkPiIuCiAgICAgICAgICAgICAgICI8Ym9keSBvbmxvYWQ9J2RvY3VtZW50LmZvcm1zWzBdLnN1Ym1pdCgpOyc+Ii4KICAgICAgICAgICAgICAgJGZvcm0gLgogICAgICAgICAgICAgICAiPHNjcmlwdD4iLgogICAgICAgICAgICAgICAidmFyIGVsZW1lbnRzID0gZG9jdW1lbnQuZm9ybXNbMF0uZWxlbWVudHM7Ii4KICAgICAgICAgICAgICAgImZvciAodmFyIGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsiLgogICAgICAgICAgICAgICAiICBlbGVtZW50c1tpXS5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7Ii4KICAgICAgICAgICAgICAgIn0iLgogICAgICAgICAgICAgICAiPC9zY3JpcHQ+Ii4KICAgICAgICAgICAgICAgIjwvYm9keT4iLgogICAgICAgICAgICAgICAiPC9odG1sPiIpOwogICAgfQp9CgovKgogKiBGdW5jdGlvbiB0byBydW4gd2hlbiB0aGlzIGZpbGUgaXMgaW5jbHVkZWQuCiAqIEFic3RyYWN0ZWQgdG8gYSBmdW5jdGlvbiB0byBtYWtlIGxpZmUgZWFzaWVyCiAqIGZvciBzb21lIFBIUCBvcHRpbWl6ZXJzLgogKi8KZnVuY3Rpb24gQXV0aF9PcGVuSURfaW5jbHVkZV9pbml0KCkgewogIGlmIChBdXRoX09wZW5JRF9nZXRNYXRoTGliKCkgPT09IG51bGwpIHsKICAgIEF1dGhfT3BlbklEX3NldE5vTWF0aFN1cHBvcnQoKTsKICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/openid-php-openid-782224d/Auth/OpenID/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/openid-php-openid-782224d/Auth/OpenID/Association.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBUaGlzIG1vZHVsZSBjb250YWlucyBjb2RlIGZvciBkZWFsaW5nIHdpdGggYXNzb2NpYXRpb25zIGJldHdlZW4KICogY29uc3VtZXJzIGFuZCBzZXJ2ZXJzLgogKgogKiBQSFAgdmVyc2lvbnMgNCBhbmQgNQogKgogKiBMSUNFTlNFOiBTZWUgdGhlIENPUFlJTkcgZmlsZSBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbi4KICoKICogQHBhY2thZ2UgT3BlbklECiAqIEBhdXRob3IgSmFuUmFpbiwgSW5jLiA8b3BlbmlkQGphbnJhaW4uY29tPgogKiBAY29weXJpZ2h0IDIwMDUtMjAwOCBKYW5yYWluLCBJbmMuCiAqIEBsaWNlbnNlIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCBBcGFjaGUKICovCgovKioKICogQGFjY2VzcyBwcml2YXRlCiAqLwpyZXF1aXJlX29uY2UgJ0F1dGgvT3BlbklEL0NyeXB0VXRpbC5waHAnOwoKLyoqCiAqIEBhY2Nlc3MgcHJpdmF0ZQogKi8KcmVxdWlyZV9vbmNlICdBdXRoL09wZW5JRC9LVkZvcm0ucGhwJzsKCi8qKgogKiBAYWNjZXNzIHByaXZhdGUKICovCnJlcXVpcmVfb25jZSAnQXV0aC9PcGVuSUQvSE1BQy5waHAnOwoKLyoqCiAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhbiBhc3NvY2lhdGlvbiBiZXR3ZWVuIGEgc2VydmVyIGFuZCBhCiAqIGNvbnN1bWVyLiAgSW4gZ2VuZXJhbCwgdXNlcnMgb2YgdGhpcyBsaWJyYXJ5IHdpbGwgbmV2ZXIgc2VlCiAqIGluc3RhbmNlcyBvZiB0aGlzIG9iamVjdC4gIFRoZSBvbmx5IGV4Y2VwdGlvbiBpcyBpZiB5b3UgaW1wbGVtZW50IGEKICogY3VzdG9tIHtAbGluayBBdXRoX09wZW5JRF9PcGVuSURTdG9yZX0uCiAqCiAqIElmIHlvdSBkbyBpbXBsZW1lbnQgc3VjaCBhIHN0b3JlLCBpdCB3aWxsIG5lZWQgdG8gc3RvcmUgdGhlIHZhbHVlcwogKiBvZiB0aGUgaGFuZGxlLCBzZWNyZXQsIGlzc3VlZCwgbGlmZXRpbWUsIGFuZCBhc3NvY190eXBlIGluc3RhbmNlCiAqIHZhcmlhYmxlcy4KICoKICogQHBhY2thZ2UgT3BlbklECiAqLwpjbGFzcyBBdXRoX09wZW5JRF9Bc3NvY2lhdGlvbiB7CgogICAgLyoqCiAgICAgKiBUaGlzIGlzIGEgSE1BQy1TSEExIHNwZWNpZmljIHZhbHVlLgogICAgICoKICAgICAqIEBhY2Nlc3MgcHJpdmF0ZQogICAgICovCiAgICB2YXIgJFNJR19MRU5HVEggPSAyMDsKCiAgICAvKioKICAgICAqIFRoZSBvcmRlcmluZyBhbmQgbmFtZSBvZiBrZXlzIGFzIHN0b3JlZCBieSBzZXJpYWxpemUuCiAgICAgKgogICAgICogQGFjY2VzcyBwcml2YXRlCiAgICAgKi8KICAgIHZhciAkYXNzb2Nfa2V5cyA9IGFycmF5KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZlcnNpb24nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2hhbmRsZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2VjcmV0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpc3N1ZWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xpZmV0aW1lJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhc3NvY190eXBlJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKCiAgICB2YXIgJF9tYWNzID0gYXJyYXkoCiAgICAgICAgICAgICAgICAgICAgICAgJ0hNQUMtU0hBMScgPT4gJ0F1dGhfT3BlbklEX0hNQUNTSEExJywKICAgICAgICAgICAgICAgICAgICAgICAnSE1BQy1TSEEyNTYnID0+ICdBdXRoX09wZW5JRF9ITUFDU0hBMjU2JwogICAgICAgICAgICAgICAgICAgICAgICk7CgogICAgLyoqCiAgICAgKiBUaGlzIGlzIGFuIGFsdGVybmF0ZSBjb25zdHJ1Y3RvciAoZmFjdG9yeSBtZXRob2QpIHVzZWQgYnkgdGhlCiAgICAgKiBPcGVuSUQgY29uc3VtZXIgbGlicmFyeSB0byBjcmVhdGUgYXNzb2NpYXRpb25zLiAgT3BlbklEIHN0b3JlCiAgICAgKiBpbXBsZW1lbnRhdGlvbnMgc2hvdWxkbid0IHVzZSB0aGlzIGNvbnN0cnVjdG9yLgogICAgICoKICAgICAqIEBhY2Nlc3MgcHJpdmF0ZQogICAgICoKICAgICAqIEBwYXJhbSBpbnRlZ2VyICRleHBpcmVzX2luIFRoaXMgaXMgdGhlIGFtb3VudCBvZiB0aW1lIHRoaXMKICAgICAqIGFzc29jaWF0aW9uIGlzIGdvb2QgZm9yLCBtZWFzdXJlZCBpbiBzZWNvbmRzIHNpbmNlIHRoZQogICAgICogYXNzb2NpYXRpb24gd2FzIGlzc3VlZC4KICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICRoYW5kbGUgVGhpcyBpcyB0aGUgaGFuZGxlIHRoZSBzZXJ2ZXIgZ2F2ZSB0aGlzCiAgICAgKiBhc3NvY2lhdGlvbi4KICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nIHNlY3JldCBUaGlzIGlzIHRoZSBzaGFyZWQgc2VjcmV0IHRoZSBzZXJ2ZXIKICAgICAqIGdlbmVyYXRlZCBmb3IgdGhpcyBhc3NvY2lhdGlvbi4KICAgICAqCiAgICAgKiBAcGFyYW0gYXNzb2NfdHlwZSBUaGlzIGlzIHRoZSB0eXBlIG9mIGFzc29jaWF0aW9uIHRoaXMKICAgICAqIGluc3RhbmNlIHJlcHJlc2VudHMuICBUaGUgb25seSB2YWxpZCB2YWx1ZXMgb2YgdGhpcyBmaWVsZCBhdAogICAgICogdGhpcyB0aW1lIGlzICdITUFDLVNIQTEnIGFuZCAnSE1BQy1TSEEyNTYnLCBidXQgbmV3IHR5cGVzIG1heQogICAgICogYmUgZGVmaW5lZCBpbiB0aGUgZnV0dXJlLgogICAgICoKICAgICAqIEByZXR1cm4gYXNzb2NpYXRpb24gQW4ge0BsaW5rIEF1dGhfT3BlbklEX0Fzc29jaWF0aW9ufQogICAgICogaW5zdGFuY2UuCiAgICAgKi8KICAgIHN0YXRpYyBmdW5jdGlvbiBmcm9tRXhwaXJlc0luKCRleHBpcmVzX2luLCAkaGFuZGxlLCAkc2VjcmV0LCAkYXNzb2NfdHlwZSkKICAgIHsKICAgICAgICAkaXNzdWVkID0gdGltZSgpOwogICAgICAgICRsaWZldGltZSA9ICRleHBpcmVzX2luOwogICAgICAgIHJldHVybiBuZXcgQXV0aF9PcGVuSURfQXNzb2NpYXRpb24oJGhhbmRsZSwgJHNlY3JldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRpc3N1ZWQsICRsaWZldGltZSwgJGFzc29jX3R5cGUpOwogICAgfQoKICAgIC8qKgogICAgICogVGhpcyBpcyB0aGUgc3RhbmRhcmQgY29uc3RydWN0b3IgZm9yIGNyZWF0aW5nIGFuIGFzc29jaWF0aW9uLgogICAgICogVGhlIGxpYnJhcnkgc2hvdWxkIGNyZWF0ZSBhbGwgb2YgdGhlIG5lY2Vzc2FyeSBhc3NvY2lhdGlvbnMsIHNvCiAgICAgKiB0aGlzIGNvbnN0cnVjdG9yIGlzIG5vdCBwYXJ0IG9mIHRoZSBleHRlcm5hbCBBUEkuCiAgICAgKgogICAgICogQGFjY2VzcyBwcml2YXRlCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkaGFuZGxlIFRoaXMgaXMgdGhlIGhhbmRsZSB0aGUgc2VydmVyIGdhdmUgdGhpcwogICAgICogYXNzb2NpYXRpb24uCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkc2VjcmV0IFRoaXMgaXMgdGhlIHNoYXJlZCBzZWNyZXQgdGhlIHNlcnZlcgogICAgICogZ2VuZXJhdGVkIGZvciB0aGlzIGFzc29jaWF0aW9uLgogICAgICoKICAgICAqIEBwYXJhbSBpbnRlZ2VyICRpc3N1ZWQgVGhpcyBpcyB0aGUgdGltZSB0aGlzIGFzc29jaWF0aW9uIHdhcwogICAgICogaXNzdWVkLCBpbiBzZWNvbmRzIHNpbmNlIDAwOjAwIEdNVCwgSmFudWFyeSAxLCAxOTcwLiAgKGllLCBhCiAgICAgKiB1bml4IHRpbWVzdGFtcCkKICAgICAqCiAgICAgKiBAcGFyYW0gaW50ZWdlciAkbGlmZXRpbWUgVGhpcyBpcyB0aGUgYW1vdW50IG9mIHRpbWUgdGhpcwogICAgICogYXNzb2NpYXRpb24gaXMgZ29vZCBmb3IsIG1lYXN1cmVkIGluIHNlY29uZHMgc2luY2UgdGhlCiAgICAgKiBhc3NvY2lhdGlvbiB3YXMgaXNzdWVkLgogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgJGFzc29jX3R5cGUgVGhpcyBpcyB0aGUgdHlwZSBvZiBhc3NvY2lhdGlvbiB0aGlzCiAgICAgKiBpbnN0YW5jZSByZXByZXNlbnRzLiAgVGhlIG9ubHkgdmFsaWQgdmFsdWVzIG9mIHRoaXMgZmllbGQgYXQKICAgICAqIHRoaXMgdGltZSBpcyAnSE1BQy1TSEExJyBhbmQgJ0hNQUMtU0hBMjU2JywgYnV0IG5ldyB0eXBlcyBtYXkKICAgICAqIGJlIGRlZmluZWQgaW4gdGhlIGZ1dHVyZS4KICAgICAqLwogICAgZnVuY3Rpb24gQXV0aF9PcGVuSURfQXNzb2NpYXRpb24oCiAgICAgICAgJGhhbmRsZSwgJHNlY3JldCwgJGlzc3VlZCwgJGxpZmV0aW1lLCAkYXNzb2NfdHlwZSkKICAgIHsKICAgICAgICBpZiAoIWluX2FycmF5KCRhc3NvY190eXBlLAogICAgICAgICAgICAgICAgICAgICAgQXV0aF9PcGVuSURfZ2V0U3VwcG9ydGVkQXNzb2NpYXRpb25UeXBlcygpLCB0cnVlKSkgewogICAgICAgICAgICAkZm10ID0gJ1Vuc3VwcG9ydGVkIGFzc29jaWF0aW9uIHR5cGUgKCVzKSc7CiAgICAgICAgICAgIHRyaWdnZXJfZXJyb3Ioc3ByaW50ZigkZm10LCAkYXNzb2NfdHlwZSksIEVfVVNFUl9FUlJPUik7CiAgICAgICAgfQoKICAgICAgICAkdGhpcy0+aGFuZGxlID0gJGhhbmRsZTsKICAgICAgICAkdGhpcy0+c2VjcmV0ID0gJHNlY3JldDsKICAgICAgICAkdGhpcy0+aXNzdWVkID0gJGlzc3VlZDsKICAgICAgICAkdGhpcy0+bGlmZXRpbWUgPSAkbGlmZXRpbWU7CiAgICAgICAgJHRoaXMtPmFzc29jX3R5cGUgPSAkYXNzb2NfdHlwZTsKICAgIH0KCiAgICAvKioKICAgICAqIFRoaXMgcmV0dXJucyB0aGUgbnVtYmVyIG9mIHNlY29uZHMgdGhpcyBhc3NvY2lhdGlvbiBpcyBzdGlsbAogICAgICogdmFsaWQgZm9yLCBvciAwIGlmIHRoZSBhc3NvY2lhdGlvbiBpcyBubyBsb25nZXIgdmFsaWQuCiAgICAgKgogICAgICogQHJldHVybiBpbnRlZ2VyICRzZWNvbmRzIFRoZSBudW1iZXIgb2Ygc2Vjb25kcyB0aGlzIGFzc29jaWF0aW9uCiAgICAgKiBpcyBzdGlsbCB2YWxpZCBmb3IsIG9yIDAgaWYgdGhlIGFzc29jaWF0aW9uIGlzIG5vIGxvbmdlciB2YWxpZC4KICAgICAqLwogICAgZnVuY3Rpb24gZ2V0RXhwaXJlc0luKCRub3cgPSBudWxsKQogICAgewogICAgICAgIGlmICgkbm93ID09IG51bGwpIHsKICAgICAgICAgICAgJG5vdyA9IHRpbWUoKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBtYXgoMCwgJHRoaXMtPmlzc3VlZCArICR0aGlzLT5saWZldGltZSAtICRub3cpOwogICAgfQoKICAgIC8qKgogICAgICogVGhpcyBjaGVja3MgdG8gc2VlIGlmIHR3byB7QGxpbmsgQXV0aF9PcGVuSURfQXNzb2NpYXRpb259CiAgICAgKiBpbnN0YW5jZXMgcmVwcmVzZW50IHRoZSBzYW1lIGFzc29jaWF0aW9uLgogICAgICoKICAgICAqIEByZXR1cm4gYm9vbCAkcmVzdWx0IHRydWUgaWYgdGhlIHR3byBpbnN0YW5jZXMgcmVwcmVzZW50IHRoZQogICAgICogc2FtZSBhc3NvY2lhdGlvbiwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICovCiAgICBmdW5jdGlvbiBlcXVhbCgkb3RoZXIpCiAgICB7CiAgICAgICAgcmV0dXJuICgoZ2V0dHlwZSgkdGhpcykgPT0gZ2V0dHlwZSgkb3RoZXIpKQogICAgICAgICAgICAgICAgJiYgKCR0aGlzLT5oYW5kbGUgPT0gJG90aGVyLT5oYW5kbGUpCiAgICAgICAgICAgICAgICAmJiAoJHRoaXMtPnNlY3JldCA9PSAkb3RoZXItPnNlY3JldCkKICAgICAgICAgICAgICAgICYmICgkdGhpcy0+aXNzdWVkID09ICRvdGhlci0+aXNzdWVkKQogICAgICAgICAgICAgICAgJiYgKCR0aGlzLT5saWZldGltZSA9PSAkb3RoZXItPmxpZmV0aW1lKQogICAgICAgICAgICAgICAgJiYgKCR0aGlzLT5hc3NvY190eXBlID09ICRvdGhlci0+YXNzb2NfdHlwZSkpOwogICAgfQoKICAgIC8qKgogICAgICogQ29udmVydCBhbiBhc3NvY2lhdGlvbiB0byBLViBmb3JtLgogICAgICoKICAgICAqIEByZXR1cm4gc3RyaW5nICRyZXN1bHQgU3RyaW5nIGluIEtWIGZvcm0gc3VpdGFibGUgZm9yCiAgICAgKiBkZXNlcmlhbGl6YXRpb24gYnkgZGVzZXJpYWxpemUuCiAgICAgKi8KICAgIGZ1bmN0aW9uIHNlcmlhbGl6ZSgpCiAgICB7CiAgICAgICAgJGRhdGEgPSBhcnJheSgKICAgICAgICAgICAgICAgICAgICAgJ3ZlcnNpb24nID0+ICcyJywKICAgICAgICAgICAgICAgICAgICAgJ2hhbmRsZScgPT4gJHRoaXMtPmhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgJ3NlY3JldCcgPT4gYmFzZTY0X2VuY29kZSgkdGhpcy0+c2VjcmV0KSwKICAgICAgICAgICAgICAgICAgICAgJ2lzc3VlZCcgPT4gc3RydmFsKGludHZhbCgkdGhpcy0+aXNzdWVkKSksCiAgICAgICAgICAgICAgICAgICAgICdsaWZldGltZScgPT4gc3RydmFsKGludHZhbCgkdGhpcy0+bGlmZXRpbWUpKSwKICAgICAgICAgICAgICAgICAgICAgJ2Fzc29jX3R5cGUnID0+ICR0aGlzLT5hc3NvY190eXBlCiAgICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgIGFzc2VydChhcnJheV9rZXlzKCRkYXRhKSA9PSAkdGhpcy0+YXNzb2Nfa2V5cyk7CgogICAgICAgIHJldHVybiBBdXRoX09wZW5JRF9LVkZvcm06OmZyb21BcnJheSgkZGF0YSwgJHN0cmljdCA9IHRydWUpOwogICAgfQoKICAgIC8qKgogICAgICogUGFyc2UgYW4gYXNzb2NpYXRpb24gYXMgc3RvcmVkIGJ5IHNlcmlhbGl6ZSgpLiAgVGhpcyBpcyB0aGUKICAgICAqIGludmVyc2Ugb2Ygc2VyaWFsaXplLgogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgJGFzc29jX3MgQXNzb2NpYXRpb24gYXMgc2VyaWFsaXplZCBieSBzZXJpYWxpemUoKQogICAgICogQHJldHVybiBBdXRoX09wZW5JRF9Bc3NvY2lhdGlvbiAkcmVzdWx0IGluc3RhbmNlIG9mIHRoaXMgY2xhc3MKICAgICAqLwogICAgc3RhdGljIGZ1bmN0aW9uIGRlc2VyaWFsaXplKCRjbGFzc19uYW1lLCAkYXNzb2NfcykKICAgIHsKICAgICAgICAkcGFpcnMgPSBBdXRoX09wZW5JRF9LVkZvcm06OnRvQXJyYXkoJGFzc29jX3MsICRzdHJpY3QgPSB0cnVlKTsKICAgICAgICAka2V5cyA9IGFycmF5KCk7CiAgICAgICAgJHZhbHVlcyA9IGFycmF5KCk7CiAgICAgICAgZm9yZWFjaCAoJHBhaXJzIGFzICRrZXkgPT4gJHZhbHVlKSB7CiAgICAgICAgICAgIGlmIChpc19hcnJheSgkdmFsdWUpKSB7CiAgICAgICAgICAgICAgICBsaXN0KCRrZXksICR2YWx1ZSkgPSAkdmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJGtleXNbXSA9ICRrZXk7CiAgICAgICAgICAgICR2YWx1ZXNbXSA9ICR2YWx1ZTsKICAgICAgICB9CgogICAgICAgICRjbGFzc192YXJzID0gZ2V0X2NsYXNzX3ZhcnMoJGNsYXNzX25hbWUpOwogICAgICAgICRjbGFzc19hc3NvY19rZXlzID0gJGNsYXNzX3ZhcnNbJ2Fzc29jX2tleXMnXTsKCiAgICAgICAgc29ydCgka2V5cyk7CiAgICAgICAgc29ydCgkY2xhc3NfYXNzb2Nfa2V5cyk7CgogICAgICAgIGlmICgka2V5cyAhPSAkY2xhc3NfYXNzb2Nfa2V5cykgewogICAgICAgICAgICB0cmlnZ2VyX2Vycm9yKCdVbmV4cGVjdGVkIGtleSB2YWx1ZXM6ICcgLiB2YXJfZXhwb3J0KCRrZXlzLCB0cnVlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBFX1VTRVJfV0FSTklORyk7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KCiAgICAgICAgJHZlcnNpb24gPSAkcGFpcnNbJ3ZlcnNpb24nXTsKICAgICAgICAkaGFuZGxlID0gJHBhaXJzWydoYW5kbGUnXTsKICAgICAgICAkc2VjcmV0ID0gJHBhaXJzWydzZWNyZXQnXTsKICAgICAgICAkaXNzdWVkID0gJHBhaXJzWydpc3N1ZWQnXTsKICAgICAgICAkbGlmZXRpbWUgPSAkcGFpcnNbJ2xpZmV0aW1lJ107CiAgICAgICAgJGFzc29jX3R5cGUgPSAkcGFpcnNbJ2Fzc29jX3R5cGUnXTsKCiAgICAgICAgaWYgKCR2ZXJzaW9uICE9ICcyJykgewogICAgICAgICAgICB0cmlnZ2VyX2Vycm9yKCdVbmtub3duIHZlcnNpb246ICcgLiAkdmVyc2lvbiwgRV9VU0VSX1dBUk5JTkcpOwogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CgogICAgICAgICRpc3N1ZWQgPSBpbnR2YWwoJGlzc3VlZCk7CiAgICAgICAgJGxpZmV0aW1lID0gaW50dmFsKCRsaWZldGltZSk7CiAgICAgICAgJHNlY3JldCA9IGJhc2U2NF9kZWNvZGUoJHNlY3JldCk7CgogICAgICAgIHJldHVybiBuZXcgJGNsYXNzX25hbWUoCiAgICAgICAgICAgICRoYW5kbGUsICRzZWNyZXQsICRpc3N1ZWQsICRsaWZldGltZSwgJGFzc29jX3R5cGUpOwogICAgfQoKICAgIC8qKgogICAgICogR2VuZXJhdGUgYSBzaWduYXR1cmUgZm9yIGEgc2VxdWVuY2Ugb2YgKGtleSwgdmFsdWUpIHBhaXJzCiAgICAgKgogICAgICogQGFjY2VzcyBwcml2YXRlCiAgICAgKiBAcGFyYW0gYXJyYXkgJHBhaXJzIFRoZSBwYWlycyB0byBzaWduLCBpbiBvcmRlci4gIFRoaXMgaXMgYW4KICAgICAqIGFycmF5IG9mIHR3by10dXBsZXMuCiAgICAgKiBAcmV0dXJuIHN0cmluZyAkc2lnbmF0dXJlIFRoZSBiaW5hcnkgc2lnbmF0dXJlIG9mIHRoaXMgc2VxdWVuY2UKICAgICAqIG9mIHBhaXJzCiAgICAgKi8KICAgIGZ1bmN0aW9uIHNpZ24oJHBhaXJzKQogICAgewogICAgICAgICRrdiA9IEF1dGhfT3BlbklEX0tWRm9ybTo6ZnJvbUFycmF5KCRwYWlycyk7CgogICAgICAgIC8qIEludmFsaWQgYXNzb2NpYXRpb24gdHlwZXMgc2hvdWxkIGJlIGNhdWdodCBhdCBjb25zdHJ1Y3RvciAqLwogICAgICAgICRjYWxsYmFjayA9ICR0aGlzLT5fbWFjc1skdGhpcy0+YXNzb2NfdHlwZV07CgogICAgICAgIHJldHVybiBjYWxsX3VzZXJfZnVuY19hcnJheSgkY2FsbGJhY2ssIGFycmF5KCR0aGlzLT5zZWNyZXQsICRrdikpOwogICAgfQoKICAgIC8qKgogICAgICogR2VuZXJhdGUgYSBzaWduYXR1cmUgZm9yIHNvbWUgZmllbGRzIGluIGEgZGljdGlvbmFyeQogICAgICoKICAgICAqIEBhY2Nlc3MgcHJpdmF0ZQogICAgICogQHBhcmFtIGFycmF5ICRmaWVsZHMgVGhlIGZpZWxkcyB0byBzaWduLCBpbiBvcmRlcjsgdGhpcyBpcyBhbgogICAgICogYXJyYXkgb2Ygc3RyaW5ncy4KICAgICAqIEBwYXJhbSBhcnJheSAkZGF0YSBEaWN0aW9uYXJ5IG9mIHZhbHVlcyB0byBzaWduIChhbiBhcnJheSBvZgogICAgICogc3RyaW5nID0+IHN0cmluZyBwYWlycykuCiAgICAgKiBAcmV0dXJuIHN0cmluZyAkc2lnbmF0dXJlIFRoZSBzaWduYXR1cmUsIGJhc2U2NCBlbmNvZGVkCiAgICAgKi8KICAgIGZ1bmN0aW9uIHNpZ25NZXNzYWdlKCRtZXNzYWdlKQogICAgewogICAgICAgIGlmICgkbWVzc2FnZS0+aGFzS2V5KEF1dGhfT3BlbklEX09QRU5JRF9OUywgJ3NpZycpIHx8CiAgICAgICAgICAgICRtZXNzYWdlLT5oYXNLZXkoQXV0aF9PcGVuSURfT1BFTklEX05TLCAnc2lnbmVkJykpIHsKICAgICAgICAgICAgLy8gQWxyZWFkeSBoYXMgYSBzaWcKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQoKICAgICAgICAkZXh0YW50X2hhbmRsZSA9ICRtZXNzYWdlLT5nZXRBcmcoQXV0aF9PcGVuSURfT1BFTklEX05TLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYXNzb2NfaGFuZGxlJyk7CgogICAgICAgIGlmICgkZXh0YW50X2hhbmRsZSAmJiAoJGV4dGFudF9oYW5kbGUgIT0gJHRoaXMtPmhhbmRsZSkpIHsKICAgICAgICAgICAgLy8gcmFpc2UgVmFsdWVFcnJvcigiTWVzc2FnZSBoYXMgYSBkaWZmZXJlbnQgYXNzb2NpYXRpb24gaGFuZGxlIikKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQoKICAgICAgICAkc2lnbmVkX21lc3NhZ2UgPSAkbWVzc2FnZTsKICAgICAgICAkc2lnbmVkX21lc3NhZ2UtPnNldEFyZyhBdXRoX09wZW5JRF9PUEVOSURfTlMsICdhc3NvY19oYW5kbGUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5oYW5kbGUpOwoKICAgICAgICAkbWVzc2FnZV9rZXlzID0gYXJyYXlfa2V5cygkc2lnbmVkX21lc3NhZ2UtPnRvUG9zdEFyZ3MoKSk7CiAgICAgICAgJHNpZ25lZF9saXN0ID0gYXJyYXkoKTsKICAgICAgICAkc2lnbmVkX3ByZWZpeCA9ICdvcGVuaWQuJzsKCiAgICAgICAgZm9yZWFjaCAoJG1lc3NhZ2Vfa2V5cyBhcyAkaykgewogICAgICAgICAgICBpZiAoc3RycG9zKCRrLCAkc2lnbmVkX3ByZWZpeCkgPT09IDApIHsKICAgICAgICAgICAgICAgICRzaWduZWRfbGlzdFtdID0gc3Vic3RyKCRrLCBzdHJsZW4oJHNpZ25lZF9wcmVmaXgpKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJHNpZ25lZF9saXN0W10gPSAnc2lnbmVkJzsKICAgICAgICBzb3J0KCRzaWduZWRfbGlzdCk7CgogICAgICAgICRzaWduZWRfbWVzc2FnZS0+c2V0QXJnKEF1dGhfT3BlbklEX09QRU5JRF9OUywgJ3NpZ25lZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbG9kZSgnLCcsICRzaWduZWRfbGlzdCkpOwogICAgICAgICRzaWcgPSAkdGhpcy0+Z2V0TWVzc2FnZVNpZ25hdHVyZSgkc2lnbmVkX21lc3NhZ2UpOwogICAgICAgICRzaWduZWRfbWVzc2FnZS0+c2V0QXJnKEF1dGhfT3BlbklEX09QRU5JRF9OUywgJ3NpZycsICRzaWcpOwogICAgICAgIHJldHVybiAkc2lnbmVkX21lc3NhZ2U7CiAgICB9CgogICAgLyoqCiAgICAgKiBHaXZlbiBhIHtAbGluayBBdXRoX09wZW5JRF9NZXNzYWdlfSwgcmV0dXJuIHRoZSBrZXkvdmFsdWUgcGFpcnMKICAgICAqIHRvIGJlIHNpZ25lZCBhY2NvcmRpbmcgdG8gdGhlIHNpZ25lZCBsaXN0IGluIHRoZSBtZXNzYWdlLiAgSWYKICAgICAqIHRoZSBtZXNzYWdlIGxhY2tzIGEgc2lnbmVkIGxpc3QsIHJldHVybiBudWxsLgogICAgICoKICAgICAqIEBhY2Nlc3MgcHJpdmF0ZQogICAgICovCiAgICBmdW5jdGlvbiBfbWFrZVBhaXJzKCRtZXNzYWdlKQogICAgewogICAgICAgICRzaWduZWQgPSAkbWVzc2FnZS0+Z2V0QXJnKEF1dGhfT3BlbklEX09QRU5JRF9OUywgJ3NpZ25lZCcpOwogICAgICAgIGlmICghJHNpZ25lZCB8fCBBdXRoX09wZW5JRDo6aXNGYWlsdXJlKCRzaWduZWQpKSB7CiAgICAgICAgICAgIC8vIHJhaXNlIFZhbHVlRXJyb3IoJ01lc3NhZ2UgaGFzIG5vIHNpZ25lZCBsaXN0OiAlcycgJSAobWVzc2FnZSwpKQogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CgogICAgICAgICRzaWduZWRfbGlzdCA9IGV4cGxvZGUoJywnLCAkc2lnbmVkKTsKICAgICAgICAkcGFpcnMgPSBhcnJheSgpOwogICAgICAgICRkYXRhID0gJG1lc3NhZ2UtPnRvUG9zdEFyZ3MoKTsKICAgICAgICBmb3JlYWNoICgkc2lnbmVkX2xpc3QgYXMgJGZpZWxkKSB7CiAgICAgICAgICAgICRwYWlyc1tdID0gYXJyYXkoJGZpZWxkLCBBdXRoX09wZW5JRDo6YXJyYXlHZXQoJGRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ29wZW5pZC4nIC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZmllbGQsICcnKSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiAkcGFpcnM7CiAgICB9CgogICAgLyoqCiAgICAgKiBHaXZlbiBhbiB7QGxpbmsgQXV0aF9PcGVuSURfTWVzc2FnZX0sIHJldHVybiB0aGUgc2lnbmF0dXJlIGZvcgogICAgICogdGhlIHNpZ25lZCBsaXN0IGluIHRoZSBtZXNzYWdlLgogICAgICoKICAgICAqIEBhY2Nlc3MgcHJpdmF0ZQogICAgICovCiAgICBmdW5jdGlvbiBnZXRNZXNzYWdlU2lnbmF0dXJlKCRtZXNzYWdlKQogICAgewogICAgICAgICRwYWlycyA9ICR0aGlzLT5fbWFrZVBhaXJzKCRtZXNzYWdlKTsKICAgICAgICByZXR1cm4gYmFzZTY0X2VuY29kZSgkdGhpcy0+c2lnbigkcGFpcnMpKTsKICAgIH0KCiAgICAvKioKICAgICAqIENvbmZpcm0gdGhhdCB0aGUgc2lnbmF0dXJlIG9mIHRoZXNlIGZpZWxkcyBtYXRjaGVzIHRoZQogICAgICogc2lnbmF0dXJlIGNvbnRhaW5lZCBpbiB0aGUgZGF0YS4KICAgICAqCiAgICAgKiBAYWNjZXNzIHByaXZhdGUKICAgICAqLwogICAgZnVuY3Rpb24gY2hlY2tNZXNzYWdlU2lnbmF0dXJlKCRtZXNzYWdlKQogICAgewogICAgICAgICRzaWcgPSAkbWVzc2FnZS0+Z2V0QXJnKEF1dGhfT3BlbklEX09QRU5JRF9OUywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2lnJyk7CgogICAgICAgIGlmICghJHNpZyB8fCBBdXRoX09wZW5JRDo6aXNGYWlsdXJlKCRzaWcpKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CgogICAgICAgICRjYWxjdWxhdGVkX3NpZyA9ICR0aGlzLT5nZXRNZXNzYWdlU2lnbmF0dXJlKCRtZXNzYWdlKTsKICAgICAgICByZXR1cm4gJGNhbGN1bGF0ZWRfc2lnID09ICRzaWc7CiAgICB9Cn0KCmZ1bmN0aW9uIEF1dGhfT3BlbklEX2dldFNlY3JldFNpemUoJGFzc29jX3R5cGUpCnsKICAgIGlmICgkYXNzb2NfdHlwZSA9PSAnSE1BQy1TSEExJykgewogICAgICAgIHJldHVybiAyMDsKICAgIH0gZWxzZSBpZiAoJGFzc29jX3R5cGUgPT0gJ0hNQUMtU0hBMjU2JykgewogICAgICAgIHJldHVybiAzMjsKICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9Cn0KCmZ1bmN0aW9uIEF1dGhfT3BlbklEX2dldEFsbEFzc29jaWF0aW9uVHlwZXMoKQp7CiAgICByZXR1cm4gYXJyYXkoJ0hNQUMtU0hBMScsICdITUFDLVNIQTI1NicpOwp9CgpmdW5jdGlvbiBBdXRoX09wZW5JRF9nZXRTdXBwb3J0ZWRBc3NvY2lhdGlvblR5cGVzKCkKewogICAgJGEgPSBhcnJheSgnSE1BQy1TSEExJyk7CgogICAgaWYgKEF1dGhfT3BlbklEX0hNQUNTSEEyNTZfU1VQUE9SVEVEKSB7CiAgICAgICAgJGFbXSA9ICdITUFDLVNIQTI1Nic7CiAgICB9CgogICAgcmV0dXJuICRhOwp9CgpmdW5jdGlvbiBBdXRoX09wZW5JRF9nZXRTZXNzaW9uVHlwZXMoJGFzc29jX3R5cGUpCnsKICAgICRhc3NvY190b19zZXNzaW9uID0gYXJyYXkoCiAgICAgICAnSE1BQy1TSEExJyA9PiBhcnJheSgnREgtU0hBMScsICduby1lbmNyeXB0aW9uJykpOwoKICAgIGlmIChBdXRoX09wZW5JRF9ITUFDU0hBMjU2X1NVUFBPUlRFRCkgewogICAgICAgICRhc3NvY190b19zZXNzaW9uWydITUFDLVNIQTI1NiddID0KICAgICAgICAgICAgYXJyYXkoJ0RILVNIQTI1NicsICduby1lbmNyeXB0aW9uJyk7CiAgICB9CgogICAgcmV0dXJuIEF1dGhfT3BlbklEOjphcnJheUdldCgkYXNzb2NfdG9fc2Vzc2lvbiwgJGFzc29jX3R5cGUsIGFycmF5KCkpOwp9CgpmdW5jdGlvbiBBdXRoX09wZW5JRF9jaGVja1Nlc3Npb25UeXBlKCRhc3NvY190eXBlLCAkc2Vzc2lvbl90eXBlKQp7CiAgICBpZiAoIWluX2FycmF5KCRzZXNzaW9uX3R5cGUsCiAgICAgICAgICAgICAgICAgIEF1dGhfT3BlbklEX2dldFNlc3Npb25UeXBlcygkYXNzb2NfdHlwZSkpKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIHJldHVybiB0cnVlOwp9CgpmdW5jdGlvbiBBdXRoX09wZW5JRF9nZXREZWZhdWx0QXNzb2NpYXRpb25PcmRlcigpCnsKICAgICRvcmRlciA9IGFycmF5KCk7CgogICAgaWYgKCFBdXRoX09wZW5JRF9ub01hdGhTdXBwb3J0KCkpIHsKICAgICAgICAkb3JkZXJbXSA9IGFycmF5KCdITUFDLVNIQTEnLCAnREgtU0hBMScpOwoKICAgICAgICBpZiAoQXV0aF9PcGVuSURfSE1BQ1NIQTI1Nl9TVVBQT1JURUQpIHsKICAgICAgICAgICAgJG9yZGVyW10gPSBhcnJheSgnSE1BQy1TSEEyNTYnLCAnREgtU0hBMjU2Jyk7CiAgICAgICAgfQogICAgfQoKICAgICRvcmRlcltdID0gYXJyYXkoJ0hNQUMtU0hBMScsICduby1lbmNyeXB0aW9uJyk7CgogICAgaWYgKEF1dGhfT3BlbklEX0hNQUNTSEEyNTZfU1VQUE9SVEVEKSB7CiAgICAgICAgJG9yZGVyW10gPSBhcnJheSgnSE1BQy1TSEEyNTYnLCAnbm8tZW5jcnlwdGlvbicpOwogICAgfQoKICAgIHJldHVybiAkb3JkZXI7Cn0KCmZ1bmN0aW9uIEF1dGhfT3BlbklEX2dldE9ubHlFbmNyeXB0ZWRPcmRlcigpCnsKICAgICRyZXN1bHQgPSBhcnJheSgpOwoKICAgIGZvcmVhY2ggKEF1dGhfT3BlbklEX2dldERlZmF1bHRBc3NvY2lhdGlvbk9yZGVyKCkgYXMgJHBhaXIpIHsKICAgICAgICBsaXN0KCRhc3NvYywgJHNlc3Npb24pID0gJHBhaXI7CgogICAgICAgIGlmICgkc2Vzc2lvbiAhPSAnbm8tZW5jcnlwdGlvbicpIHsKICAgICAgICAgICAgaWYgKEF1dGhfT3BlbklEX0hNQUNTSEEyNTZfU1VQUE9SVEVEICYmCiAgICAgICAgICAgICAgICAoJGFzc29jID09ICdITUFDLVNIQTI1NicpKSB7CiAgICAgICAgICAgICAgICAkcmVzdWx0W10gPSAkcGFpcjsKICAgICAgICAgICAgfSBlbHNlIGlmICgkYXNzb2MgIT0gJ0hNQUMtU0hBMjU2JykgewogICAgICAgICAgICAgICAgJHJlc3VsdFtdID0gJHBhaXI7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuICRyZXN1bHQ7Cn0KCmZ1bmN0aW9uIEF1dGhfT3BlbklEX2dldERlZmF1bHROZWdvdGlhdG9yKCkKewogICAgcmV0dXJuIG5ldyBBdXRoX09wZW5JRF9TZXNzaW9uTmVnb3RpYXRvcigKICAgICAgICAgICAgICAgICBBdXRoX09wZW5JRF9nZXREZWZhdWx0QXNzb2NpYXRpb25PcmRlcigpKTsKfQoKZnVuY3Rpb24gQXV0aF9PcGVuSURfZ2V0RW5jcnlwdGVkTmVnb3RpYXRvcigpCnsKICAgIHJldHVybiBuZXcgQXV0aF9PcGVuSURfU2Vzc2lvbk5lZ290aWF0b3IoCiAgICAgICAgICAgICAgICAgQXV0aF9PcGVuSURfZ2V0T25seUVuY3J5cHRlZE9yZGVyKCkpOwp9CgovKioKICogQSBzZXNzaW9uIG5lZ290aWF0b3IgY29udHJvbHMgdGhlIGFsbG93ZWQgYW5kIHByZWZlcnJlZCBhc3NvY2lhdGlvbgogKiB0eXBlcyBhbmQgYXNzb2NpYXRpb24gc2Vzc2lvbiB0eXBlcy4gQm90aCB0aGUge0BsaW5rCiAqIEF1dGhfT3BlbklEX0NvbnN1bWVyfSBhbmQge0BsaW5rIEF1dGhfT3BlbklEX1NlcnZlcn0gdXNlCiAqIG5lZ290aWF0b3JzIHdoZW4gY3JlYXRpbmcgYXNzb2NpYXRpb25zLgogKgogKiBZb3UgY2FuIGNyZWF0ZSBhbmQgdXNlIG5lZ290aWF0b3JzIGlmIHlvdToKCiAqIC0gRG8gbm90IHdhbnQgdG8gZG8gRGlmZmllLUhlbGxtYW4ga2V5IGV4Y2hhbmdlIGJlY2F1c2UgeW91IHVzZQogKiB0cmFuc3BvcnQtbGF5ZXIgZW5jcnlwdGlvbiAoZS5nLiBTU0wpCiAqCiAqIC0gV2FudCB0byB1c2Ugb25seSBTSEEtMjU2IGFzc29jaWF0aW9ucwogKgogKiAtIERvIG5vdCB3YW50IHRvIHN1cHBvcnQgcGxhaW4tdGV4dCBhc3NvY2lhdGlvbnMgb3ZlciBhIG5vbi1zZWN1cmUKICogY2hhbm5lbAogKgogKiBJdCBpcyB1cCB0byB5b3UgdG8gc2V0IGEgcG9saWN5IGZvciB3aGF0IGtpbmRzIG9mIGFzc29jaWF0aW9ucyB0bwogKiBhY2NlcHQuIEJ5IGRlZmF1bHQsIHRoZSBsaWJyYXJ5IHdpbGwgbWFrZSBhbnkga2luZCBvZiBhc3NvY2lhdGlvbgogKiB0aGF0IGlzIGFsbG93ZWQgaW4gdGhlIE9wZW5JRCAyLjAgc3BlY2lmaWNhdGlvbi4KICoKICogVXNlIG9mIG5lZ290aWF0b3JzIGluIHRoZSBsaWJyYXJ5CiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKgogKiBXaGVuIGEgY29uc3VtZXIgbWFrZXMgYW4gYXNzb2NpYXRpb24gcmVxdWVzdCwgaXQgY2FsbHMge0BsaW5rCiAqIGdldEFsbG93ZWRUeXBlfSB0byBnZXQgdGhlIHByZWZlcnJlZCBhc3NvY2lhdGlvbiB0eXBlIGFuZAogKiBhc3NvY2lhdGlvbiBzZXNzaW9uIHR5cGUuCiAqCiAqIFRoZSBzZXJ2ZXIgZ2V0cyBhIHJlcXVlc3QgZm9yIGEgcGFydGljdWxhciBhc3NvY2lhdGlvbi9zZXNzaW9uIHR5cGUKICogYW5kIGNhbGxzIHtAbGluayBpc0FsbG93ZWR9IHRvIGRldGVybWluZSBpZiBpdCBzaG91bGQgY3JlYXRlIGFuCiAqIGFzc29jaWF0aW9uLiBJZiBpdCBpcyBzdXBwb3J0ZWQsIG5lZ290aWF0aW9uIGlzIGNvbXBsZXRlLiBJZiBpdCBpcwogKiBub3QsIHRoZSBzZXJ2ZXIgY2FsbHMge0BsaW5rIGdldEFsbG93ZWRUeXBlfSB0byBnZXQgYW4gYWxsb3dlZAogKiBhc3NvY2lhdGlvbiB0eXBlIHRvIHJldHVybiB0byB0aGUgY29uc3VtZXIuCiAqCiAqIElmIHRoZSBjb25zdW1lciBnZXRzIGFuIGVycm9yIHJlc3BvbnNlIGluZGljYXRpbmcgdGhhdCB0aGUKICogcmVxdWVzdGVkIGFzc29jaWF0aW9uL3Nlc3Npb24gdHlwZSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBzZXJ2ZXIKICogdGhhdCBjb250YWlucyBhbiBhc3NvY2F0aW9uL3Nlc3Npb24gdHlwZSB0byB0cnksIGl0IGNhbGxzIHtAbGluawogKiBpc0FsbG93ZWR9IHRvIGRldGVybWluZSBpZiBpdCBzaG91bGQgdHJ5IGFnYWluIHdpdGggdGhlIGdpdmVuCiAqIGNvbWJpbmF0aW9uIG9mIGFzc29jaWF0aW9uL3Nlc3Npb24gdHlwZS4KICoKICogQHBhY2thZ2UgT3BlbklECiAqLwpjbGFzcyBBdXRoX09wZW5JRF9TZXNzaW9uTmVnb3RpYXRvciB7CiAgICBmdW5jdGlvbiBBdXRoX09wZW5JRF9TZXNzaW9uTmVnb3RpYXRvcigkYWxsb3dlZF90eXBlcykKICAgIHsKICAgICAgICAkdGhpcy0+YWxsb3dlZF90eXBlcyA9IGFycmF5KCk7CiAgICAgICAgJHRoaXMtPnNldEFsbG93ZWRUeXBlcygkYWxsb3dlZF90eXBlcyk7CiAgICB9CgogICAgLyoqCiAgICAgKiBTZXQgdGhlIGFsbG93ZWQgYXNzb2NpYXRpb24gdHlwZXMsIGNoZWNraW5nIHRvIG1ha2Ugc3VyZSBlYWNoCiAgICAgKiBjb21iaW5hdGlvbiBpcyB2YWxpZC4KICAgICAqCiAgICAgKiBAYWNjZXNzIHByaXZhdGUKICAgICAqLwogICAgZnVuY3Rpb24gc2V0QWxsb3dlZFR5cGVzKCRhbGxvd2VkX3R5cGVzKQogICAgewogICAgICAgIGZvcmVhY2ggKCRhbGxvd2VkX3R5cGVzIGFzICRwYWlyKSB7CiAgICAgICAgICAgIGxpc3QoJGFzc29jX3R5cGUsICRzZXNzaW9uX3R5cGUpID0gJHBhaXI7CiAgICAgICAgICAgIGlmICghQXV0aF9PcGVuSURfY2hlY2tTZXNzaW9uVHlwZSgkYXNzb2NfdHlwZSwgJHNlc3Npb25fdHlwZSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJHRoaXMtPmFsbG93ZWRfdHlwZXMgPSAkYWxsb3dlZF90eXBlczsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICAvKioKICAgICAqIEFkZCBhbiBhc3NvY2lhdGlvbiB0eXBlIGFuZCBzZXNzaW9uIHR5cGUgdG8gdGhlIGFsbG93ZWQgdHlwZXMKICAgICAqIGxpc3QuIFRoZSBhc3NvY2F0aW9uL3Nlc3Npb24gcGFpcnMgYXJlIHRyaWVkIGluIHRoZSBvcmRlciB0aGF0CiAgICAgKiB0aGV5IGFyZSBhZGRlZC4KICAgICAqCiAgICAgKiBAYWNjZXNzIHByaXZhdGUKICAgICAqLwogICAgZnVuY3Rpb24gYWRkQWxsb3dlZFR5cGUoJGFzc29jX3R5cGUsICRzZXNzaW9uX3R5cGUgPSBudWxsKQogICAgewogICAgICAgIGlmICgkdGhpcy0+YWxsb3dlZF90eXBlcyA9PT0gbnVsbCkgewogICAgICAgICAgICAkdGhpcy0+YWxsb3dlZF90eXBlcyA9IGFycmF5KCk7CiAgICAgICAgfQoKICAgICAgICBpZiAoJHNlc3Npb25fdHlwZSA9PT0gbnVsbCkgewogICAgICAgICAgICAkYXZhaWxhYmxlID0gQXV0aF9PcGVuSURfZ2V0U2Vzc2lvblR5cGVzKCRhc3NvY190eXBlKTsKCiAgICAgICAgICAgIGlmICghJGF2YWlsYWJsZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBmb3JlYWNoICgkYXZhaWxhYmxlIGFzICRzZXNzaW9uX3R5cGUpIHsKICAgICAgICAgICAgICAgICR0aGlzLT5hZGRBbGxvd2VkVHlwZSgkYXNzb2NfdHlwZSwgJHNlc3Npb25fdHlwZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiAoQXV0aF9PcGVuSURfY2hlY2tTZXNzaW9uVHlwZSgkYXNzb2NfdHlwZSwgJHNlc3Npb25fdHlwZSkpIHsKICAgICAgICAgICAgICAgICR0aGlzLT5hbGxvd2VkX3R5cGVzW10gPSBhcnJheSgkYXNzb2NfdHlwZSwgJHNlc3Npb25fdHlwZSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIC8vIElzIHRoaXMgY29tYmluYXRpb24gb2YgYXNzb2NpYXRpb24gdHlwZSBhbmQgc2Vzc2lvbiB0eXBlIGFsbG93ZWQ/CiAgICBmdW5jdGlvbiBpc0FsbG93ZWQoJGFzc29jX3R5cGUsICRzZXNzaW9uX3R5cGUpCiAgICB7CiAgICAgICAgJGFzc29jX2dvb2QgPSBpbl9hcnJheShhcnJheSgkYXNzb2NfdHlwZSwgJHNlc3Npb25fdHlwZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+YWxsb3dlZF90eXBlcyk7CgogICAgICAgICRtYXRjaGVzID0gaW5fYXJyYXkoJHNlc3Npb25fdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1dGhfT3BlbklEX2dldFNlc3Npb25UeXBlcygkYXNzb2NfdHlwZSkpOwoKICAgICAgICByZXR1cm4gKCRhc3NvY19nb29kICYmICRtYXRjaGVzKTsKICAgIH0KCiAgICAvKioKICAgICAqIEdldCBhIHBhaXIgb2YgYXNzb2NhdGlvbiB0eXBlIGFuZCBzZXNzaW9uIHR5cGUgdGhhdCBhcmUKICAgICAqIHN1cHBvcnRlZC4KICAgICAqLwogICAgZnVuY3Rpb24gZ2V0QWxsb3dlZFR5cGUoKQogICAgewogICAgICAgIGlmICghJHRoaXMtPmFsbG93ZWRfdHlwZXMpIHsKICAgICAgICAgICAgcmV0dXJuIGFycmF5KG51bGwsIG51bGwpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICR0aGlzLT5hbGxvd2VkX3R5cGVzWzBdOwogICAgfQp9Cgo=]]></data>
	</file>
	<file>
	  <filename>/openid-php-openid-782224d/Auth/OpenID/AX.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBJbXBsZW1lbnRzIHRoZSBPcGVuSUQgYXR0cmlidXRlIGV4Y2hhbmdlIHNwZWNpZmljYXRpb24sIHZlcnNpb24gMS4wCiAqIGFzIG9mIHN2biByZXZpc2lvbiAzNzAgZnJvbSBvcGVuaWQubmV0IHN2bi4KICoKICogQHBhY2thZ2UgT3BlbklECiAqLwoKLyoqCiAqIFJlcXVpcmUgdXRpbGl0eSBjbGFzc2VzIGFuZCBmdW5jdGlvbnMgZm9yIHRoZSBjb25zdW1lci4KICovCnJlcXVpcmVfb25jZSAiQXV0aC9PcGVuSUQvRXh0ZW5zaW9uLnBocCI7CnJlcXVpcmVfb25jZSAiQXV0aC9PcGVuSUQvTWVzc2FnZS5waHAiOwpyZXF1aXJlX29uY2UgIkF1dGgvT3BlbklEL1RydXN0Um9vdC5waHAiOwoKZGVmaW5lKCdBdXRoX09wZW5JRF9BWF9OU19VUkknLAogICAgICAgJ2h0dHA6Ly9vcGVuaWQubmV0L3Nydi9heC8xLjAnKTsKCi8vIFVzZSB0aGlzIGFzIHRoZSAnY291bnQnIHZhbHVlIGZvciBhbiBhdHRyaWJ1dGUgaW4gYSBGZXRjaFJlcXVlc3QgdG8KLy8gYXNrIGZvciBhcyBtYW55IHZhbHVlcyBhcyB0aGUgT1AgY2FuIHByb3ZpZGUuCmRlZmluZSgnQXV0aF9PcGVuSURfQVhfVU5MSU1JVEVEX1ZBTFVFUycsICd1bmxpbWl0ZWQnKTsKCi8vIE1pbmltdW0gc3VwcG9ydGVkIGFsaWFzIGxlbmd0aCBpbiBjaGFyYWN0ZXJzLiAgSGVyZSBmb3IKLy8gY29tcGxldGVuZXNzLgpkZWZpbmUoJ0F1dGhfT3BlbklEX0FYX01JTklNVU1fU1VQUE9SVEVEX0FMSUFTX0xFTkdUSCcsIDMyKTsKCi8qKgogKiBBWCB1dGlsaXR5IGNsYXNzLgogKgogKiBAcGFja2FnZSBPcGVuSUQKICovCmNsYXNzIEF1dGhfT3BlbklEX0FYIHsKICAgIC8qKgogICAgICogQHBhcmFtIG1peGVkICR0aGluZyBBbnkgb2JqZWN0IHdoaWNoIG1heSBiZSBhbgogICAgICogQXV0aF9PcGVuSURfQVhfRXJyb3Igb2JqZWN0LgogICAgICoKICAgICAqIEByZXR1cm4gYm9vbCB0cnVlIGlmICR0aGluZyBpcyBhbiBBdXRoX09wZW5JRF9BWF9FcnJvcjsgZmFsc2UKICAgICAqIGlmIG5vdC4KICAgICAqLwogICAgc3RhdGljIGZ1bmN0aW9uIGlzRXJyb3IoJHRoaW5nKQogICAgewogICAgICAgIHJldHVybiBpc19hKCR0aGluZywgJ0F1dGhfT3BlbklEX0FYX0Vycm9yJyk7CiAgICB9Cn0KCi8qKgogKiBDaGVjayBhbiBhbGlhcyBmb3IgaW52YWxpZCBjaGFyYWN0ZXJzOyByYWlzZSBBWEVycm9yIGlmIGFueSBhcmUKICogZm91bmQuICBSZXR1cm4gTm9uZSBpZiB0aGUgYWxpYXMgaXMgdmFsaWQuCiAqLwpmdW5jdGlvbiBBdXRoX09wZW5JRF9BWF9jaGVja0FsaWFzKCRhbGlhcykKewogIGlmIChzdHJwb3MoJGFsaWFzLCAnLCcpICE9PSBmYWxzZSkgewogICAgICByZXR1cm4gbmV3IEF1dGhfT3BlbklEX0FYX0Vycm9yKHNwcmludGYoCiAgICAgICAgICAgICAgICAgICAiQWxpYXMgJXMgbXVzdCBub3QgY29udGFpbiBjb21tYSIsICRhbGlhcykpOwogIH0KICBpZiAoc3RycG9zKCRhbGlhcywgJy4nKSAhPT0gZmFsc2UpIHsKICAgICAgcmV0dXJuIG5ldyBBdXRoX09wZW5JRF9BWF9FcnJvcihzcHJpbnRmKAogICAgICAgICAgICAgICAgICAgIkFsaWFzICVzIG11c3Qgbm90IGNvbnRhaW4gcGVyaW9kIiwgJGFsaWFzKSk7CiAgfQoKICByZXR1cm4gdHJ1ZTsKfQoKLyoqCiAqIFJlc3VsdHMgZnJvbSBkYXRhIHRoYXQgZG9lcyBub3QgbWVldCB0aGUgYXR0cmlidXRlIGV4Y2hhbmdlIDEuMAogKiBzcGVjaWZpY2F0aW9uCiAqCiAqIEBwYWNrYWdlIE9wZW5JRAogKi8KY2xhc3MgQXV0aF9PcGVuSURfQVhfRXJyb3IgewogICAgZnVuY3Rpb24gQXV0aF9PcGVuSURfQVhfRXJyb3IoJG1lc3NhZ2U9bnVsbCkKICAgIHsKICAgICAgICAkdGhpcy0+bWVzc2FnZSA9ICRtZXNzYWdlOwogICAgfQp9CgovKioKICogQWJzdHJhY3QgY2xhc3MgY29udGFpbmluZyBjb21tb24gY29kZSBmb3IgYXR0cmlidXRlIGV4Y2hhbmdlCiAqIG1lc3NhZ2VzLgogKgogKiBAcGFja2FnZSBPcGVuSUQKICovCmNsYXNzIEF1dGhfT3BlbklEX0FYX01lc3NhZ2UgZXh0ZW5kcyBBdXRoX09wZW5JRF9FeHRlbnNpb24gewogICAgLyoqCiAgICAgKiBuc19hbGlhczogVGhlIHByZWZlcnJlZCBuYW1lc3BhY2UgYWxpYXMgZm9yIGF0dHJpYnV0ZSBleGNoYW5nZQogICAgICogbWVzc2FnZXMKICAgICAqLwogICAgdmFyICRuc19hbGlhcyA9ICdheCc7CgogICAgLyoqCiAgICAgKiBtb2RlOiBUaGUgdHlwZSBvZiB0aGlzIGF0dHJpYnV0ZSBleGNoYW5nZSBtZXNzYWdlLiBUaGlzIG11c3QgYmUKICAgICAqIG92ZXJyaWRkZW4gaW4gc3ViY2xhc3Nlcy4KICAgICAqLwogICAgdmFyICRtb2RlID0gbnVsbDsKCiAgICB2YXIgJG5zX3VyaSA9IEF1dGhfT3BlbklEX0FYX05TX1VSSTsKCiAgICAvKioKICAgICAqIFJldHVybiBBdXRoX09wZW5JRF9BWF9FcnJvciBpZiB0aGUgbW9kZSBpbiB0aGUgYXR0cmlidXRlCiAgICAgKiBleGNoYW5nZSBhcmd1bWVudHMgZG9lcyBub3QgbWF0Y2ggd2hhdCBpcyBleHBlY3RlZCBmb3IgdGhpcwogICAgICogY2xhc3M7IHRydWUgb3RoZXJ3aXNlLgogICAgICoKICAgICAqIEBhY2Nlc3MgcHJpdmF0ZQogICAgICovCiAgICBmdW5jdGlvbiBfY2hlY2tNb2RlKCRheF9hcmdzKQogICAgewogICAgICAgICRtb2RlID0gQXV0aF9PcGVuSUQ6OmFycmF5R2V0KCRheF9hcmdzLCAnbW9kZScpOwogICAgICAgIGlmICgkbW9kZSAhPSAkdGhpcy0+bW9kZSkgewogICAgICAgICAgICByZXR1cm4gbmV3IEF1dGhfT3BlbklEX0FYX0Vycm9yKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIG1vZGUgJyVzJzsgZ290ICclcyciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+bW9kZSwgJG1vZGUpKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJuIGEgc2V0IG9mIGF0dHJpYnV0ZSBleGNoYW5nZSBhcmd1bWVudHMgY29udGFpbmluZyB0aGUKICAgICAqIGJhc2ljIGluZm9ybWF0aW9uIHRoYXQgbXVzdCBiZSBpbiBldmVyeSBhdHRyaWJ1dGUgZXhjaGFuZ2UKICAgICAqIG1lc3NhZ2UuCiAgICAgKgogICAgICogQGFjY2VzcyBwcml2YXRlCiAgICAgKi8KICAgIGZ1bmN0aW9uIF9uZXdBcmdzKCkKICAgIHsKICAgICAgICByZXR1cm4gYXJyYXkoJ21vZGUnID0+ICR0aGlzLT5tb2RlKTsKICAgIH0KfQoKLyoqCiAqIFJlcHJlc2VudHMgYSBzaW5nbGUgYXR0cmlidXRlIGluIGFuIGF0dHJpYnV0ZSBleGNoYW5nZQogKiByZXF1ZXN0LiBUaGlzIHNob3VsZCBiZSBhZGRlZCB0byBhbiBBWFJlcXVlc3Qgb2JqZWN0IGluIG9yZGVyIHRvCiAqIHJlcXVlc3QgdGhlIGF0dHJpYnV0ZS4KICoKICogQHBhY2thZ2UgT3BlbklECiAqLwpjbGFzcyBBdXRoX09wZW5JRF9BWF9BdHRySW5mbyB7CiAgICAvKioKICAgICAqIENvbnN0cnVjdCBhbiBhdHRyaWJ1dGUgaW5mb3JtYXRpb24gb2JqZWN0LiAgRG8gbm90IGNhbGwgdGhpcwogICAgICogZGlyZWN0bHk7IGNhbGwgbWFrZSguLi4pIGluc3RlYWQuCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkdHlwZV91cmkgVGhlIHR5cGUgVVJJIGZvciB0aGlzIGF0dHJpYnV0ZS4KICAgICAqCiAgICAgKiBAcGFyYW0gaW50ICRjb3VudCBUaGUgbnVtYmVyIG9mIHZhbHVlcyBvZiB0aGlzIHR5cGUgdG8gcmVxdWVzdC4KICAgICAqCiAgICAgKiBAcGFyYW0gYm9vbCAkcmVxdWlyZWQgV2hldGhlciB0aGUgYXR0cmlidXRlIHdpbGwgYmUgbWFya2VkIGFzCiAgICAgKiByZXF1aXJlZCBpbiB0aGUgcmVxdWVzdC4KICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICRhbGlhcyBUaGUgbmFtZSB0aGF0IHNob3VsZCBiZSBnaXZlbiB0byB0aGlzCiAgICAgKiBhdHRyaWJ1dGUgaW4gdGhlIHJlcXVlc3QuCiAgICAgKi8KICAgIGZ1bmN0aW9uIEF1dGhfT3BlbklEX0FYX0F0dHJJbmZvKCR0eXBlX3VyaSwgJGNvdW50LCAkcmVxdWlyZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYWxpYXMpCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogcmVxdWlyZWQ6IFdoZXRoZXIgdGhlIGF0dHJpYnV0ZSB3aWxsIGJlIG1hcmtlZCBhcyByZXF1aXJlZAogICAgICAgICAqIHdoZW4gcHJlc2VudGVkIHRvIHRoZSBzdWJqZWN0IG9mIHRoZSBhdHRyaWJ1dGUgZXhjaGFuZ2UKICAgICAgICAgKiByZXF1ZXN0LgogICAgICAgICAqLwogICAgICAgICR0aGlzLT5yZXF1aXJlZCA9ICRyZXF1aXJlZDsKCiAgICAgICAgLyoqCiAgICAgICAgICogY291bnQ6IEhvdyBtYW55IHZhbHVlcyBvZiB0aGlzIHR5cGUgdG8gcmVxdWVzdCBmcm9tIHRoZQogICAgICAgICAqIHN1YmplY3QuIERlZmF1bHRzIHRvIG9uZS4KICAgICAgICAgKi8KICAgICAgICAkdGhpcy0+Y291bnQgPSAkY291bnQ7CgogICAgICAgIC8qKgogICAgICAgICAqIHR5cGVfdXJpOiBUaGUgaWRlbnRpZmllciB0aGF0IGRldGVybWluZXMgd2hhdCB0aGUgYXR0cmlidXRlCiAgICAgICAgICogcmVwcmVzZW50cyBhbmQgaG93IGl0IGlzIHNlcmlhbGl6ZWQuIEZvciBleGFtcGxlLCBvbmUgdHlwZQogICAgICAgICAqIFVSSSByZXByZXNlbnRpbmcgZGF0ZXMgY291bGQgcmVwcmVzZW50IGEgVW5peCB0aW1lc3RhbXAgaW4KICAgICAgICAgKiBiYXNlIDEwIGFuZCBhbm90aGVyIGNvdWxkIHJlcHJlc2VudCBhIGh1bWFuLXJlYWRhYmxlCiAgICAgICAgICogc3RyaW5nLgogICAgICAgICAqLwogICAgICAgICR0aGlzLT50eXBlX3VyaSA9ICR0eXBlX3VyaTsKCiAgICAgICAgLyoqCiAgICAgICAgICogYWxpYXM6IFRoZSBuYW1lIHRoYXQgc2hvdWxkIGJlIGdpdmVuIHRvIHRoaXMgYXR0cmlidXRlIGluCiAgICAgICAgICogdGhlIHJlcXVlc3QuIElmIGl0IGlzIG5vdCBzdXBwbGllZCwgYSBnZW5lcmljIG5hbWUgd2lsbCBiZQogICAgICAgICAqIGFzc2lnbmVkLiBGb3IgZXhhbXBsZSwgaWYgeW91IHdhbnQgdG8gY2FsbCBhIFVuaXggdGltZXN0YW1wCiAgICAgICAgICogdmFsdWUgJ3RzdGFtcCcsIHNldCBpdHMgYWxpYXMgdG8gdGhhdCB2YWx1ZS4gSWYgdHdvCiAgICAgICAgICogYXR0cmlidXRlcyBpbiB0aGUgc2FtZSBtZXNzYWdlIHJlcXVlc3QgdG8gdXNlIHRoZSBzYW1lCiAgICAgICAgICogYWxpYXMsIHRoZSByZXF1ZXN0IHdpbGwgZmFpbCB0byBiZSBnZW5lcmF0ZWQuCiAgICAgICAgICovCiAgICAgICAgJHRoaXMtPmFsaWFzID0gJGFsaWFzOwogICAgfQoKICAgIC8qKgogICAgICogQ29uc3RydWN0IGFuIGF0dHJpYnV0ZSBpbmZvcm1hdGlvbiBvYmplY3QuICBGb3IgcGFyYW1ldGVyCiAgICAgKiBkZXRhaWxzLCBzZWUgdGhlIGNvbnN0cnVjdG9yLgogICAgICovCiAgICBzdGF0aWMgZnVuY3Rpb24gbWFrZSgkdHlwZV91cmksICRjb3VudD0xLCAkcmVxdWlyZWQ9ZmFsc2UsCiAgICAgICAgICAgICAgICAgICRhbGlhcz1udWxsKQogICAgewogICAgICAgIGlmICgkYWxpYXMgIT09IG51bGwpIHsKICAgICAgICAgICAgJHJlc3VsdCA9IEF1dGhfT3BlbklEX0FYX2NoZWNrQWxpYXMoJGFsaWFzKTsKCiAgICAgICAgICAgIGlmIChBdXRoX09wZW5JRF9BWDo6aXNFcnJvcigkcmVzdWx0KSkgewogICAgICAgICAgICAgICAgcmV0dXJuICRyZXN1bHQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiBuZXcgQXV0aF9PcGVuSURfQVhfQXR0ckluZm8oJHR5cGVfdXJpLCAkY291bnQsICRyZXF1aXJlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRhbGlhcyk7CiAgICB9CgogICAgLyoqCiAgICAgKiBXaGVuIHByb2Nlc3NpbmcgYSByZXF1ZXN0IGZvciB0aGlzIGF0dHJpYnV0ZSwgdGhlIE9QIHNob3VsZAogICAgICogY2FsbCB0aGlzIG1ldGhvZCB0byBkZXRlcm1pbmUgd2hldGhlciBhbGwgYXZhaWxhYmxlIGF0dHJpYnV0ZQogICAgICogdmFsdWVzIHdlcmUgcmVxdWVzdGVkLiAgSWYgc2VsZi5jb3VudCA9PSBVTkxJTUlURURfVkFMVUVTLCB0aGlzCiAgICAgKiByZXR1cm5zIFRydWUuICBPdGhlcndpc2UgdGhpcyByZXR1cm5zIEZhbHNlLCBpbiB3aGljaCBjYXNlCiAgICAgKiBzZWxmLmNvdW50IGlzIGFuIGludGVnZXIuCiAgICAqLwogICAgZnVuY3Rpb24gd2FudHNVbmxpbWl0ZWRWYWx1ZXMoKQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+Y291bnQgPT09IEF1dGhfT3BlbklEX0FYX1VOTElNSVRFRF9WQUxVRVM7CiAgICB9Cn0KCi8qKgogKiBHaXZlbiBhIG5hbWVzcGFjZSBtYXBwaW5nIGFuZCBhIHN0cmluZyBjb250YWluaW5nIGEgY29tbWEtc2VwYXJhdGVkCiAqIGxpc3Qgb2YgbmFtZXNwYWNlIGFsaWFzZXMsIHJldHVybiBhIGxpc3Qgb2YgdHlwZSBVUklzIHRoYXQKICogY29ycmVzcG9uZCB0byB0aG9zZSBhbGlhc2VzLgogKgogKiBAcGFyYW0gJG5hbWVzcGFjZV9tYXAgVGhlIG1hcHBpbmcgZnJvbSBuYW1lc3BhY2UgVVJJIHRvIGFsaWFzCiAqIEBwYXJhbSAkYWxpYXNfbGlzdF9zIFRoZSBzdHJpbmcgY29udGFpbmluZyB0aGUgY29tbWEtc2VwYXJhdGVkCiAqIGxpc3Qgb2YgYWxpYXNlcy4gTWF5IGFsc28gYmUgTm9uZSBmb3IgY29udmVuaWVuY2UuCiAqCiAqIEByZXR1cm4gJHNlcSBUaGUgbGlzdCBvZiBuYW1lc3BhY2UgVVJJcyB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZQogKiBzdXBwbGllZCBsaXN0IG9mIGFsaWFzZXMuIElmIHRoZSBzdHJpbmcgd2FzIHplcm8tbGVuZ3RoIG9yIE5vbmUsIGFuCiAqIGVtcHR5IGxpc3Qgd2lsbCBiZSByZXR1cm5lZC4KICoKICogcmV0dXJuIG51bGwgSWYgYW4gYWxpYXMgaXMgcHJlc2VudCBpbiB0aGUgbGlzdCBvZiBhbGlhc2VzIGJ1dAogKiBpcyBub3QgcHJlc2VudCBpbiB0aGUgbmFtZXNwYWNlIG1hcC4KICovCmZ1bmN0aW9uIEF1dGhfT3BlbklEX0FYX3RvVHlwZVVSSXMoJG5hbWVzcGFjZV9tYXAsICRhbGlhc19saXN0X3MpCnsKICAgICR1cmlzID0gYXJyYXkoKTsKCiAgICBpZiAoJGFsaWFzX2xpc3RfcykgewogICAgICAgIGZvcmVhY2ggKGV4cGxvZGUoJywnLCAkYWxpYXNfbGlzdF9zKSBhcyAkYWxpYXMpIHsKICAgICAgICAgICAgJHR5cGVfdXJpID0gJG5hbWVzcGFjZV9tYXAtPmdldE5hbWVzcGFjZVVSSSgkYWxpYXMpOwogICAgICAgICAgICBpZiAoJHR5cGVfdXJpID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICAvLyByYWlzZSBLZXlFcnJvcigKICAgICAgICAgICAgICAgIC8vICdObyB0eXBlIGlzIGRlZmluZWQgZm9yIGF0dHJpYnV0ZSBuYW1lICVyJyAlIChhbGlhcywpKQogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBdXRoX09wZW5JRF9BWF9FcnJvcigKICAgICAgICAgICAgICAgICAgc3ByaW50ZignTm8gdHlwZSBpcyBkZWZpbmVkIGZvciBhdHRyaWJ1dGUgbmFtZSAlcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgJGFsaWFzKQogICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJHVyaXNbXSA9ICR0eXBlX3VyaTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gJHVyaXM7Cn0KCi8qKgogKiBBbiBhdHRyaWJ1dGUgZXhjaGFuZ2UgJ2ZldGNoX3JlcXVlc3QnIG1lc3NhZ2UuIFRoaXMgbWVzc2FnZSBpcyBzZW50CiAqIGJ5IGEgcmVseWluZyBwYXJ0eSB3aGVuIGl0IHdpc2hlcyB0byBvYnRhaW4gYXR0cmlidXRlcyBhYm91dCB0aGUKICogc3ViamVjdCBvZiBhbiBPcGVuSUQgYXV0aGVudGljYXRpb24gcmVxdWVzdC4KICoKICogQHBhY2thZ2UgT3BlbklECiAqLwpjbGFzcyBBdXRoX09wZW5JRF9BWF9GZXRjaFJlcXVlc3QgZXh0ZW5kcyBBdXRoX09wZW5JRF9BWF9NZXNzYWdlIHsKCiAgICB2YXIgJG1vZGUgPSAnZmV0Y2hfcmVxdWVzdCc7CgogICAgZnVuY3Rpb24gQXV0aF9PcGVuSURfQVhfRmV0Y2hSZXF1ZXN0KCR1cGRhdGVfdXJsPW51bGwpCiAgICB7CiAgICAgICAgLyoqCiAgICAgICAgICogcmVxdWVzdGVkX2F0dHJpYnV0ZXM6IFRoZSBhdHRyaWJ1dGVzIHRoYXQgaGF2ZSBiZWVuCiAgICAgICAgICogcmVxdWVzdGVkIHRodXMgZmFyLCBpbmRleGVkIGJ5IHRoZSB0eXBlIFVSSS4KICAgICAgICAgKi8KICAgICAgICAkdGhpcy0+cmVxdWVzdGVkX2F0dHJpYnV0ZXMgPSBhcnJheSgpOwoKICAgICAgICAvKioKICAgICAgICAgKiB1cGRhdGVfdXJsOiBBIFVSTCB0aGF0IHdpbGwgYWNjZXB0IHJlc3BvbnNlcyBmb3IgdGhpcwogICAgICAgICAqIGF0dHJpYnV0ZSBleGNoYW5nZSByZXF1ZXN0LCBldmVuIGluIHRoZSBhYnNlbmNlIG9mIHRoZSB1c2VyCiAgICAgICAgICogd2hvIG1hZGUgdGhpcyByZXF1ZXN0LgogICAgICAgICovCiAgICAgICAgJHRoaXMtPnVwZGF0ZV91cmwgPSAkdXBkYXRlX3VybDsKICAgIH0KCiAgICAvKioKICAgICAqIEFkZCBhbiBhdHRyaWJ1dGUgdG8gdGhpcyBhdHRyaWJ1dGUgZXhjaGFuZ2UgcmVxdWVzdC4KICAgICAqCiAgICAgKiBAcGFyYW0gYXR0cmlidXRlOiBUaGUgYXR0cmlidXRlIHRoYXQgaXMgYmVpbmcgcmVxdWVzdGVkCiAgICAgKiBAcmV0dXJuIHRydWUgb24gc3VjY2VzcywgZmFsc2Ugd2hlbiB0aGUgcmVxdWVzdGVkIGF0dHJpYnV0ZSBpcwogICAgICogYWxyZWFkeSBwcmVzZW50IGluIHRoaXMgZmV0Y2ggcmVxdWVzdC4KICAgICAqLwogICAgZnVuY3Rpb24gYWRkKCRhdHRyaWJ1dGUpCiAgICB7CiAgICAgICAgaWYgKCR0aGlzLT5jb250YWlucygkYXR0cmlidXRlLT50eXBlX3VyaSkpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBBdXRoX09wZW5JRF9BWF9FcnJvcigKICAgICAgICAgICAgICBzcHJpbnRmKCJUaGUgYXR0cmlidXRlICVzIGhhcyBhbHJlYWR5IGJlZW4gcmVxdWVzdGVkIiwKICAgICAgICAgICAgICAgICAgICAgICRhdHRyaWJ1dGUtPnR5cGVfdXJpKSk7CiAgICAgICAgfQoKICAgICAgICAkdGhpcy0+cmVxdWVzdGVkX2F0dHJpYnV0ZXNbJGF0dHJpYnV0ZS0+dHlwZV91cmldID0gJGF0dHJpYnV0ZTsKCiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgLyoqCiAgICAgKiBHZXQgdGhlIHNlcmlhbGl6ZWQgZm9ybSBvZiB0aGlzIGF0dHJpYnV0ZSBmZXRjaCByZXF1ZXN0LgogICAgICoKICAgICAqIEByZXR1cm5zIEF1dGhfT3BlbklEX0FYX0ZldGNoUmVxdWVzdCBUaGUgZmV0Y2ggcmVxdWVzdCBtZXNzYWdlIHBhcmFtZXRlcnMKICAgICAqLwogICAgZnVuY3Rpb24gZ2V0RXh0ZW5zaW9uQXJncygpCiAgICB7CiAgICAgICAgJGFsaWFzZXMgPSBuZXcgQXV0aF9PcGVuSURfTmFtZXNwYWNlTWFwKCk7CgogICAgICAgICRyZXF1aXJlZCA9IGFycmF5KCk7CiAgICAgICAgJGlmX2F2YWlsYWJsZSA9IGFycmF5KCk7CgogICAgICAgICRheF9hcmdzID0gJHRoaXMtPl9uZXdBcmdzKCk7CgogICAgICAgIGZvcmVhY2ggKCR0aGlzLT5yZXF1ZXN0ZWRfYXR0cmlidXRlcyBhcyAkdHlwZV91cmkgPT4gJGF0dHJpYnV0ZSkgewogICAgICAgICAgICBpZiAoJGF0dHJpYnV0ZS0+YWxpYXMgPT09IG51bGwpIHsKICAgICAgICAgICAgICAgICRhbGlhcyA9ICRhbGlhc2VzLT5hZGQoJHR5cGVfdXJpKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICRhbGlhcyA9ICRhbGlhc2VzLT5hZGRBbGlhcygkdHlwZV91cmksICRhdHRyaWJ1dGUtPmFsaWFzKTsKCiAgICAgICAgICAgICAgICBpZiAoJGFsaWFzID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBdXRoX09wZW5JRF9BWF9FcnJvcigKICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYoIkNvdWxkIG5vdCBhZGQgYWxpYXMgJXMgZm9yIFVSSSAlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRhdHRyaWJ1dGUtPmFsaWFzLCAkdHlwZV91cmkKICAgICAgICAgICAgICAgICAgICAgICkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoJGF0dHJpYnV0ZS0+cmVxdWlyZWQpIHsKICAgICAgICAgICAgICAgICRyZXF1aXJlZFtdID0gJGFsaWFzOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJGlmX2F2YWlsYWJsZVtdID0gJGFsaWFzOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoJGF0dHJpYnV0ZS0+Y291bnQgIT0gMSkgewogICAgICAgICAgICAgICAgJGF4X2FyZ3NbJ2NvdW50LicgLiAkYWxpYXNdID0gc3RydmFsKCRhdHRyaWJ1dGUtPmNvdW50KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJGF4X2FyZ3NbJ3R5cGUuJyAuICRhbGlhc10gPSAkdHlwZV91cmk7CiAgICAgICAgfQoKICAgICAgICBpZiAoJHJlcXVpcmVkKSB7CiAgICAgICAgICAgICRheF9hcmdzWydyZXF1aXJlZCddID0gaW1wbG9kZSgnLCcsICRyZXF1aXJlZCk7CiAgICAgICAgfQoKICAgICAgICBpZiAoJGlmX2F2YWlsYWJsZSkgewogICAgICAgICAgICAkYXhfYXJnc1snaWZfYXZhaWxhYmxlJ10gPSBpbXBsb2RlKCcsJywgJGlmX2F2YWlsYWJsZSk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJGF4X2FyZ3M7CiAgICB9CgogICAgLyoqCiAgICAgKiBHZXQgdGhlIHR5cGUgVVJJcyBmb3IgYWxsIGF0dHJpYnV0ZXMgdGhhdCBoYXZlIGJlZW4gbWFya2VkIGFzCiAgICAgKiByZXF1aXJlZC4KICAgICAqCiAgICAgKiBAcmV0dXJuIEEgbGlzdCBvZiB0aGUgdHlwZSBVUklzIGZvciBhdHRyaWJ1dGVzIHRoYXQgaGF2ZSBiZWVuCiAgICAgKiBtYXJrZWQgYXMgcmVxdWlyZWQuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldFJlcXVpcmVkQXR0cnMoKQogICAgewogICAgICAgICRyZXF1aXJlZCA9IGFycmF5KCk7CiAgICAgICAgZm9yZWFjaCAoJHRoaXMtPnJlcXVlc3RlZF9hdHRyaWJ1dGVzIGFzICR0eXBlX3VyaSA9PiAkYXR0cmlidXRlKSB7CiAgICAgICAgICAgIGlmICgkYXR0cmlidXRlLT5yZXF1aXJlZCkgewogICAgICAgICAgICAgICAgJHJlcXVpcmVkW10gPSAkdHlwZV91cmk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiAkcmVxdWlyZWQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBFeHRyYWN0IGEgRmV0Y2hSZXF1ZXN0IGZyb20gYW4gT3BlbklEIG1lc3NhZ2UKICAgICAqCiAgICAgKiBAcGFyYW0gcmVxdWVzdDogVGhlIE9wZW5JRCByZXF1ZXN0IGNvbnRhaW5pbmcgdGhlIGF0dHJpYnV0ZQogICAgICogZmV0Y2ggcmVxdWVzdAogICAgICoKICAgICAqIEByZXR1cm5zIG1peGVkIEFuIEF1dGhfT3BlbklEX0FYX0Vycm9yIG9yIHRoZQogICAgICogQXV0aF9PcGVuSURfQVhfRmV0Y2hSZXF1ZXN0IGV4dHJhY3RlZCBmcm9tIHRoZSByZXF1ZXN0IG1lc3NhZ2UgaWYKICAgICAqIHN1Y2Nlc3NmdWwKICAgICAqLwogICAgc3RhdGljIGZ1bmN0aW9uIGZyb21PcGVuSURSZXF1ZXN0KCRyZXF1ZXN0KQogICAgewogICAgICAgICRtID0gJHJlcXVlc3QtPm1lc3NhZ2U7CiAgICAgICAgJG9iaiA9IG5ldyBBdXRoX09wZW5JRF9BWF9GZXRjaFJlcXVlc3QoKTsKICAgICAgICAkYXhfYXJncyA9ICRtLT5nZXRBcmdzKCRvYmotPm5zX3VyaSk7CgogICAgICAgICRyZXN1bHQgPSAkb2JqLT5wYXJzZUV4dGVuc2lvbkFyZ3MoJGF4X2FyZ3MpOwoKICAgICAgICBpZiAoQXV0aF9PcGVuSURfQVg6OmlzRXJyb3IoJHJlc3VsdCkpIHsKICAgICAgICAgICAgcmV0dXJuICRyZXN1bHQ7CiAgICAgICAgfQoKICAgICAgICBpZiAoJG9iai0+dXBkYXRlX3VybCkgewogICAgICAgICAgICAvLyBVcGRhdGUgVVJMIG11c3QgbWF0Y2ggdGhlIG9wZW5pZC5yZWFsbSBvZiB0aGUKICAgICAgICAgICAgLy8gdW5kZXJseWluZyBPcGVuSUQgMiBtZXNzYWdlLgogICAgICAgICAgICAkcmVhbG0gPSAkbS0+Z2V0QXJnKEF1dGhfT3BlbklEX09QRU5JRF9OUywgJ3JlYWxtJywKICAgICAgICAgICAgICAgICAgICAgICAgJG0tPmdldEFyZygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1dGhfT3BlbklEX09QRU5JRF9OUywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyZXR1cm5fdG8nKSk7CgogICAgICAgICAgICBpZiAoISRyZWFsbSkgewogICAgICAgICAgICAgICAgJG9iaiA9IG5ldyBBdXRoX09wZW5JRF9BWF9FcnJvcigKICAgICAgICAgICAgICAgICAgc3ByaW50ZigiQ2Fubm90IHZhbGlkYXRlIHVwZGF0ZV91cmwgJXMgIiAuCiAgICAgICAgICAgICAgICAgICAgICAgICAgImFnYWluc3QgYWJzZW50IHJlYWxtIiwgJG9iai0+dXBkYXRlX3VybCkpOwogICAgICAgICAgICB9IGVsc2UgaWYgKCFBdXRoX09wZW5JRF9UcnVzdFJvb3Q6Om1hdGNoKCRyZWFsbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkb2JqLT51cGRhdGVfdXJsKSkgewogICAgICAgICAgICAgICAgJG9iaiA9IG5ldyBBdXRoX09wZW5JRF9BWF9FcnJvcigKICAgICAgICAgICAgICAgICAgc3ByaW50ZigiVXBkYXRlIFVSTCAlcyBmYWlsZWQgdmFsaWRhdGlvbiBhZ2FpbnN0IHJlYWxtICVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAkb2JqLT51cGRhdGVfdXJsLCAkcmVhbG0pKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRvYmo7CiAgICB9CgogICAgLyoqCiAgICAgKiBHaXZlbiBhdHRyaWJ1dGUgZXhjaGFuZ2UgYXJndW1lbnRzLCBwb3B1bGF0ZSB0aGlzIEZldGNoUmVxdWVzdC4KICAgICAqCiAgICAgKiBAcmV0dXJuICRyZXN1bHQgQXV0aF9PcGVuSURfQVhfRXJyb3IgaWYgdGhlIGRhdGEgdG8gYmUgcGFyc2VkCiAgICAgKiBkb2VzIG5vdCBmb2xsb3cgdGhlIGF0dHJpYnV0ZSBleGNoYW5nZSBzcGVjaWZpY2F0aW9uLiBBdCBsZWFzdAogICAgICogd2hlbiAnaWZfYXZhaWxhYmxlJyBvciAncmVxdWlyZWQnIGlzIG5vdCBzcGVjaWZpZWQgZm9yIGEKICAgICAqIHBhcnRpY3VsYXIgYXR0cmlidXRlIHR5cGUuICBSZXR1cm5zIHRydWUgb3RoZXJ3aXNlLgogICAgKi8KICAgIGZ1bmN0aW9uIHBhcnNlRXh0ZW5zaW9uQXJncygkYXhfYXJncykKICAgIHsKICAgICAgICAkcmVzdWx0ID0gJHRoaXMtPl9jaGVja01vZGUoJGF4X2FyZ3MpOwogICAgICAgIGlmIChBdXRoX09wZW5JRF9BWDo6aXNFcnJvcigkcmVzdWx0KSkgewogICAgICAgICAgICByZXR1cm4gJHJlc3VsdDsKICAgICAgICB9CgogICAgICAgICRhbGlhc2VzID0gbmV3IEF1dGhfT3BlbklEX05hbWVzcGFjZU1hcCgpOwoKICAgICAgICBmb3JlYWNoICgkYXhfYXJncyBhcyAka2V5ID0+ICR2YWx1ZSkgewogICAgICAgICAgICBpZiAoc3RycG9zKCRrZXksICd0eXBlLicpID09PSAwKSB7CiAgICAgICAgICAgICAgICAkYWxpYXMgPSBzdWJzdHIoJGtleSwgNSk7CiAgICAgICAgICAgICAgICAkdHlwZV91cmkgPSAkdmFsdWU7CgogICAgICAgICAgICAgICAgJGFsaWFzID0gJGFsaWFzZXMtPmFkZEFsaWFzKCR0eXBlX3VyaSwgJGFsaWFzKTsKCiAgICAgICAgICAgICAgICBpZiAoJGFsaWFzID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBdXRoX09wZW5JRF9BWF9FcnJvcigKICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYoIkNvdWxkIG5vdCBhZGQgYWxpYXMgJXMgZm9yIFVSSSAlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRhbGlhcywgJHR5cGVfdXJpKQogICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkY291bnRfcyA9IEF1dGhfT3BlbklEOjphcnJheUdldCgkYXhfYXJncywgJ2NvdW50LicgLiAkYWxpYXMpOwogICAgICAgICAgICAgICAgaWYgKCRjb3VudF9zKSB7CiAgICAgICAgICAgICAgICAgICAgJGNvdW50ID0gQXV0aF9PcGVuSUQ6OmludHZhbCgkY291bnRfcyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCgkY291bnQgPT09IGZhbHNlKSAmJgogICAgICAgICAgICAgICAgICAgICAgICAoJGNvdW50X3MgPT09IEF1dGhfT3BlbklEX0FYX1VOTElNSVRFRF9WQUxVRVMpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRjb3VudCA9ICRjb3VudF9zOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJGNvdW50ID0gMTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoJGNvdW50ID09PSBmYWxzZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQXV0aF9PcGVuSURfQVhfRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKCJJbnRlZ2VyIHZhbHVlIGV4cGVjdGVkIGZvciAlcywgZ290ICVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NvdW50LicgLiAkYWxpYXMsICRjb3VudF9zKSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJGF0dHJpbmZvID0gQXV0aF9PcGVuSURfQVhfQXR0ckluZm86Om1ha2UoJHR5cGVfdXJpLCAkY291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgJGFsaWFzKTsKCiAgICAgICAgICAgICAgICBpZiAoQXV0aF9PcGVuSURfQVg6OmlzRXJyb3IoJGF0dHJpbmZvKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkYXR0cmluZm87CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJHRoaXMtPmFkZCgkYXR0cmluZm8pOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkcmVxdWlyZWQgPSBBdXRoX09wZW5JRF9BWF90b1R5cGVVUklzKCRhbGlhc2VzLAogICAgICAgICAgICAgICAgICAgICAgICAgQXV0aF9PcGVuSUQ6OmFycmF5R2V0KCRheF9hcmdzLCAncmVxdWlyZWQnKSk7CgogICAgICAgIGZvcmVhY2ggKCRyZXF1aXJlZCBhcyAkdHlwZV91cmkpIHsKICAgICAgICAgICAgJGF0dHJpYiA9ICR0aGlzLT5yZXF1ZXN0ZWRfYXR0cmlidXRlc1skdHlwZV91cmldOwogICAgICAgICAgICAkYXR0cmliLT5yZXF1aXJlZCA9IHRydWU7CiAgICAgICAgfQoKICAgICAgICAkaWZfYXZhaWxhYmxlID0gQXV0aF9PcGVuSURfQVhfdG9UeXBlVVJJcygkYWxpYXNlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdXRoX09wZW5JRDo6YXJyYXlHZXQoJGF4X2FyZ3MsICdpZl9hdmFpbGFibGUnKSk7CgogICAgICAgICRhbGxfdHlwZV91cmlzID0gYXJyYXlfbWVyZ2UoJHJlcXVpcmVkLCAkaWZfYXZhaWxhYmxlKTsKCiAgICAgICAgZm9yZWFjaCAoJGFsaWFzZXMtPml0ZXJOYW1lc3BhY2VVUklzKCkgYXMgJHR5cGVfdXJpKSB7CiAgICAgICAgICAgIGlmICghaW5fYXJyYXkoJHR5cGVfdXJpLCAkYWxsX3R5cGVfdXJpcykpIHsKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQXV0aF9PcGVuSURfQVhfRXJyb3IoCiAgICAgICAgICAgICAgICAgIHNwcmludGYoJ1R5cGUgVVJJICVzIHdhcyBpbiB0aGUgcmVxdWVzdCBidXQgbm90ICcgLgogICAgICAgICAgICAgICAgICAgICAgICAgICdwcmVzZW50IGluICJyZXF1aXJlZCIgb3IgImlmX2F2YWlsYWJsZSInLAogICAgICAgICAgICAgICAgICAgICAgICAgICR0eXBlX3VyaSkpOwoKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJHRoaXMtPnVwZGF0ZV91cmwgPSBBdXRoX09wZW5JRDo6YXJyYXlHZXQoJGF4X2FyZ3MsICd1cGRhdGVfdXJsJyk7CgogICAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIC8qKgogICAgICogSXRlcmF0ZSBvdmVyIHRoZSBBdHRySW5mbyBvYmplY3RzIHRoYXQgYXJlIGNvbnRhaW5lZCBpbiB0aGlzCiAgICAgKiBmZXRjaF9yZXF1ZXN0LgogICAgICovCiAgICBmdW5jdGlvbiBpdGVyQXR0cnMoKQogICAgewogICAgICAgIHJldHVybiBhcnJheV92YWx1ZXMoJHRoaXMtPnJlcXVlc3RlZF9hdHRyaWJ1dGVzKTsKICAgIH0KCiAgICBmdW5jdGlvbiBpdGVyVHlwZXMoKQogICAgewogICAgICAgIHJldHVybiBhcnJheV9rZXlzKCR0aGlzLT5yZXF1ZXN0ZWRfYXR0cmlidXRlcyk7CiAgICB9CgogICAgLyoqCiAgICAgKiBJcyB0aGUgZ2l2ZW4gdHlwZSBVUkkgcHJlc2VudCBpbiB0aGlzIGZldGNoX3JlcXVlc3Q/CiAgICAgKi8KICAgIGZ1bmN0aW9uIGNvbnRhaW5zKCR0eXBlX3VyaSkKICAgIHsKICAgICAgICByZXR1cm4gaW5fYXJyYXkoJHR5cGVfdXJpLCAkdGhpcy0+aXRlclR5cGVzKCkpOwogICAgfQp9CgovKioKICogQW4gYWJzdHJhY3QgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIGEgbWVzc2FnZSB0aGF0IGhhcyBhdHRyaWJ1dGUga2V5cwogKiBhbmQgdmFsdWVzLiBJdCBjb250YWlucyB0aGUgY29tbW9uIGNvZGUgYmV0d2VlbiBmZXRjaF9yZXNwb25zZSBhbmQKICogc3RvcmVfcmVxdWVzdC4KICoKICogQHBhY2thZ2UgT3BlbklECiAqLwpjbGFzcyBBdXRoX09wZW5JRF9BWF9LZXlWYWx1ZU1lc3NhZ2UgZXh0ZW5kcyBBdXRoX09wZW5JRF9BWF9NZXNzYWdlIHsKCiAgICBmdW5jdGlvbiBBdXRoX09wZW5JRF9BWF9LZXlWYWx1ZU1lc3NhZ2UoKQogICAgewogICAgICAgICR0aGlzLT5kYXRhID0gYXJyYXkoKTsKICAgIH0KCiAgICAvKioKICAgICAqIEFkZCBhIHNpbmdsZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIGF0dHJpYnV0ZSB0eXBlIHRvIHRoZQogICAgICogbWVzc2FnZS4gSWYgdGhlcmUgYXJlIGFscmVhZHkgdmFsdWVzIHNwZWNpZmllZCBmb3IgdGhpcyB0eXBlLAogICAgICogdGhpcyB2YWx1ZSB3aWxsIGJlIHNlbnQgaW4gYWRkaXRpb24gdG8gdGhlIHZhbHVlcyBhbHJlYWR5CiAgICAgKiBzcGVjaWZpZWQuCiAgICAgKgogICAgICogQHBhcmFtIHR5cGVfdXJpOiBUaGUgVVJJIGZvciB0aGUgYXR0cmlidXRlCiAgICAgKiBAcGFyYW0gdmFsdWU6IFRoZSB2YWx1ZSB0byBhZGQgdG8gdGhlIHJlc3BvbnNlIHRvIHRoZSByZWx5aW5nCiAgICAgKiBwYXJ0eSBmb3IgdGhpcyBhdHRyaWJ1dGUKICAgICAqIEByZXR1cm4gbnVsbAogICAgICovCiAgICBmdW5jdGlvbiBhZGRWYWx1ZSgkdHlwZV91cmksICR2YWx1ZSkKICAgIHsKICAgICAgICBpZiAoIWFycmF5X2tleV9leGlzdHMoJHR5cGVfdXJpLCAkdGhpcy0+ZGF0YSkpIHsKICAgICAgICAgICAgJHRoaXMtPmRhdGFbJHR5cGVfdXJpXSA9IGFycmF5KCk7CiAgICAgICAgfQoKICAgICAgICAkdmFsdWVzID0mICR0aGlzLT5kYXRhWyR0eXBlX3VyaV07CiAgICAgICAgJHZhbHVlc1tdID0gJHZhbHVlOwogICAgfQoKICAgIC8qKgogICAgICogU2V0IHRoZSB2YWx1ZXMgZm9yIHRoZSBnaXZlbiBhdHRyaWJ1dGUgdHlwZS4gVGhpcyByZXBsYWNlcyBhbnkKICAgICAqIHZhbHVlcyB0aGF0IGhhdmUgYWxyZWFkeSBiZWVuIHNldCBmb3IgdGhpcyBhdHRyaWJ1dGUuCiAgICAgKgogICAgICogQHBhcmFtIHR5cGVfdXJpOiBUaGUgVVJJIGZvciB0aGUgYXR0cmlidXRlCiAgICAgKiBAcGFyYW0gdmFsdWVzOiBBIGxpc3Qgb2YgdmFsdWVzIHRvIHNlbmQgZm9yIHRoaXMgYXR0cmlidXRlLgogICAgICovCiAgICBmdW5jdGlvbiBzZXRWYWx1ZXMoJHR5cGVfdXJpLCAmJHZhbHVlcykKICAgIHsKICAgICAgICAkdGhpcy0+ZGF0YVskdHlwZV91cmldID0mICR2YWx1ZXM7CiAgICB9CgogICAgLyoqCiAgICAgKiBHZXQgdGhlIGV4dGVuc2lvbiBhcmd1bWVudHMgZm9yIHRoZSBrZXkvdmFsdWUgcGFpcnMgY29udGFpbmVkCiAgICAgKiBpbiB0aGlzIG1lc3NhZ2UuCiAgICAgKgogICAgICogQHBhcmFtIGFsaWFzZXM6IEFuIGFsaWFzIG1hcHBpbmcuIFNldCB0byBOb25lIGlmIHlvdSBkb24ndCBjYXJlCiAgICAgKiBhYm91dCB0aGUgYWxpYXNlcyBmb3IgdGhpcyByZXF1ZXN0LgogICAgICoKICAgICAqIEBhY2Nlc3MgcHJpdmF0ZQogICAgICovCiAgICBmdW5jdGlvbiBfZ2V0RXh0ZW5zaW9uS1ZBcmdzKCRhbGlhc2VzKQogICAgewogICAgICAgIGlmICgkYWxpYXNlcyA9PT0gbnVsbCkgewogICAgICAgICAgICAkYWxpYXNlcyA9IG5ldyBBdXRoX09wZW5JRF9OYW1lc3BhY2VNYXAoKTsKICAgICAgICB9CgogICAgICAgICRheF9hcmdzID0gYXJyYXkoKTsKCiAgICAgICAgZm9yZWFjaCAoJHRoaXMtPmRhdGEgYXMgJHR5cGVfdXJpID0+ICR2YWx1ZXMpIHsKICAgICAgICAgICAgJGFsaWFzID0gJGFsaWFzZXMtPmFkZCgkdHlwZV91cmkpOwoKICAgICAgICAgICAgJGF4X2FyZ3NbJ3R5cGUuJyAuICRhbGlhc10gPSAkdHlwZV91cmk7CiAgICAgICAgICAgICRheF9hcmdzWydjb3VudC4nIC4gJGFsaWFzXSA9IHN0cnZhbChjb3VudCgkdmFsdWVzKSk7CgogICAgICAgICAgICBmb3JlYWNoICgkdmFsdWVzIGFzICRpID0+ICR2YWx1ZSkgewogICAgICAgICAgICAgICRrZXkgPSBzcHJpbnRmKCd2YWx1ZS4lcy4lZCcsICRhbGlhcywgJGkgKyAxKTsKICAgICAgICAgICAgICAkYXhfYXJnc1ska2V5XSA9ICR2YWx1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRheF9hcmdzOwogICAgfQoKICAgIC8qKgogICAgICogUGFyc2UgYXR0cmlidXRlIGV4Y2hhbmdlIGtleS92YWx1ZSBhcmd1bWVudHMgaW50byB0aGlzIG9iamVjdC4KICAgICAqCiAgICAgKiBAcGFyYW0gYXhfYXJnczogVGhlIGF0dHJpYnV0ZSBleGNoYW5nZSBmZXRjaF9yZXNwb25zZQogICAgICogYXJndW1lbnRzLCB3aXRoIG5hbWVzcGFjaW5nIHJlbW92ZWQuCiAgICAgKgogICAgICogQHJldHVybiBBdXRoX09wZW5JRF9BWF9FcnJvciBvciB0cnVlCiAgICAgKi8KICAgIGZ1bmN0aW9uIHBhcnNlRXh0ZW5zaW9uQXJncygkYXhfYXJncykKICAgIHsKICAgICAgICAkcmVzdWx0ID0gJHRoaXMtPl9jaGVja01vZGUoJGF4X2FyZ3MpOwogICAgICAgIGlmIChBdXRoX09wZW5JRF9BWDo6aXNFcnJvcigkcmVzdWx0KSkgewogICAgICAgICAgICByZXR1cm4gJHJlc3VsdDsKICAgICAgICB9CgogICAgICAgICRhbGlhc2VzID0gbmV3IEF1dGhfT3BlbklEX05hbWVzcGFjZU1hcCgpOwoKICAgICAgICBmb3JlYWNoICgkYXhfYXJncyBhcyAka2V5ID0+ICR2YWx1ZSkgewogICAgICAgICAgICBpZiAoc3RycG9zKCRrZXksICd0eXBlLicpID09PSAwKSB7CiAgICAgICAgICAgICAgICAkdHlwZV91cmkgPSAkdmFsdWU7CiAgICAgICAgICAgICAgICAkYWxpYXMgPSBzdWJzdHIoJGtleSwgNSk7CgogICAgICAgICAgICAgICAgJHJlc3VsdCA9IEF1dGhfT3BlbklEX0FYX2NoZWNrQWxpYXMoJGFsaWFzKTsKCiAgICAgICAgICAgICAgICBpZiAoQXV0aF9PcGVuSURfQVg6OmlzRXJyb3IoJHJlc3VsdCkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHJlc3VsdDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkYWxpYXMgPSAkYWxpYXNlcy0+YWRkQWxpYXMoJHR5cGVfdXJpLCAkYWxpYXMpOwoKICAgICAgICAgICAgICAgIGlmICgkYWxpYXMgPT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEF1dGhfT3BlbklEX0FYX0Vycm9yKAogICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZigiQ291bGQgbm90IGFkZCBhbGlhcyAlcyBmb3IgVVJJICVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGFsaWFzLCAkdHlwZV91cmkpCiAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBmb3JlYWNoICgkYWxpYXNlcy0+aXRlcml0ZW1zKCkgYXMgJHBhaXIpIHsKICAgICAgICAgICAgbGlzdCgkdHlwZV91cmksICRhbGlhcykgPSAkcGFpcjsKCiAgICAgICAgICAgIGlmIChhcnJheV9rZXlfZXhpc3RzKCdjb3VudC4nIC4gJGFsaWFzLCAkYXhfYXJncykgJiYgKCRheF9hcmdzWydjb3VudC4nIC4gJGFsaWFzXSAhPT0gQXV0aF9PcGVuSURfQVhfVU5MSU1JVEVEX1ZBTFVFUykpIHsKCiAgICAgICAgICAgICAgICAkY291bnRfa2V5ID0gJ2NvdW50LicgLiAkYWxpYXM7CiAgICAgICAgICAgICAgICAkY291bnRfcyA9ICRheF9hcmdzWyRjb3VudF9rZXldOwoKICAgICAgICAgICAgICAgICRjb3VudCA9IEF1dGhfT3BlbklEOjppbnR2YWwoJGNvdW50X3MpOwoKICAgICAgICAgICAgICAgIGlmICgkY291bnQgPT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBdXRoX09wZW5JRF9BWF9FcnJvcigKICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYoIkludGVnZXIgdmFsdWUgZXhwZWN0ZWQgZm9yICVzLCBnb3QgJXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY291bnQuICVzJyAuICRhbGlhcywgJGNvdW50X3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1dGhfT3BlbklEX0FYX1VOTElNSVRFRF9WQUxVRVMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICR2YWx1ZXMgPSBhcnJheSgpOwogICAgICAgICAgICAgICAgZm9yICgkaSA9IDE7ICRpIDwgJGNvdW50ICsgMTsgJGkrKykgewogICAgICAgICAgICAgICAgICAgICR2YWx1ZV9rZXkgPSBzcHJpbnRmKCd2YWx1ZS4lcy4lZCcsICRhbGlhcywgJGkpOwoKICAgICAgICAgICAgICAgICAgICBpZiAoIWFycmF5X2tleV9leGlzdHMoJHZhbHVlX2tleSwgJGF4X2FyZ3MpKSB7CiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEF1dGhfT3BlbklEX0FYX0Vycm9yKAogICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJObyB2YWx1ZSBmb3VuZCBmb3Iga2V5ICVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdmFsdWVfa2V5KSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAkdmFsdWUgPSAkYXhfYXJnc1skdmFsdWVfa2V5XTsKICAgICAgICAgICAgICAgICAgICAkdmFsdWVzW10gPSAkdmFsdWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAka2V5ID0gJ3ZhbHVlLicgLiAkYWxpYXM7CgogICAgICAgICAgICAgICAgaWYgKCFhcnJheV9rZXlfZXhpc3RzKCRrZXksICRheF9hcmdzKSkgewogICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEF1dGhfT3BlbklEX0FYX0Vycm9yKAogICAgICAgICAgICAgICAgICAgIHNwcmludGYoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTm8gdmFsdWUgZm91bmQgZm9yIGtleSAlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAka2V5KSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJHZhbHVlID0gJGF4X2FyZ3NbJ3ZhbHVlLicgLiAkYWxpYXNdOwoKICAgICAgICAgICAgICAgIGlmICgkdmFsdWUgPT0gJycpIHsKICAgICAgICAgICAgICAgICAgICAkdmFsdWVzID0gYXJyYXkoKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJHZhbHVlcyA9IGFycmF5KCR2YWx1ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICR0aGlzLT5kYXRhWyR0eXBlX3VyaV0gPSAkdmFsdWVzOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgLyoqCiAgICAgKiBHZXQgYSBzaW5nbGUgdmFsdWUgZm9yIGFuIGF0dHJpYnV0ZS4gSWYgbm8gdmFsdWUgd2FzIHNlbnQgZm9yCiAgICAgKiB0aGlzIGF0dHJpYnV0ZSwgdXNlIHRoZSBzdXBwbGllZCBkZWZhdWx0LiBJZiB0aGVyZSBpcyBtb3JlIHRoYW4KICAgICAqIG9uZSB2YWx1ZSBmb3IgdGhpcyBhdHRyaWJ1dGUsIHRoaXMgbWV0aG9kIHdpbGwgZmFpbC4KICAgICAqCiAgICAgKiBAcGFyYW0gdHlwZV91cmk6IFRoZSBVUkkgZm9yIHRoZSBhdHRyaWJ1dGUKICAgICAqIEBwYXJhbSBkZWZhdWx0OiBUaGUgdmFsdWUgdG8gcmV0dXJuIGlmIHRoZSBhdHRyaWJ1dGUgd2FzIG5vdAogICAgICogc2VudCBpbiB0aGUgZmV0Y2hfcmVzcG9uc2UuCiAgICAgKgogICAgICogQHJldHVybiAkdmFsdWUgQXV0aF9PcGVuSURfQVhfRXJyb3Igb24gZmFpbHVyZSBvciB0aGUgdmFsdWUgb2YKICAgICAqIHRoZSBhdHRyaWJ1dGUgaW4gdGhlIGZldGNoX3Jlc3BvbnNlIG1lc3NhZ2UsIG9yIHRoZSBkZWZhdWx0CiAgICAgKiBzdXBwbGllZAogICAgICovCiAgICBmdW5jdGlvbiBnZXRTaW5nbGUoJHR5cGVfdXJpLCAkZGVmYXVsdD1udWxsKQogICAgewogICAgICAgICR2YWx1ZXMgPSBBdXRoX09wZW5JRDo6YXJyYXlHZXQoJHRoaXMtPmRhdGEsICR0eXBlX3VyaSk7CiAgICAgICAgaWYgKCEkdmFsdWVzKSB7CiAgICAgICAgICAgIHJldHVybiAkZGVmYXVsdDsKICAgICAgICB9IGVsc2UgaWYgKGNvdW50KCR2YWx1ZXMpID09IDEpIHsKICAgICAgICAgICAgcmV0dXJuICR2YWx1ZXNbMF07CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBBdXRoX09wZW5JRF9BWF9FcnJvcigKICAgICAgICAgICAgICBzcHJpbnRmKCdNb3JlIHRoYW4gb25lIHZhbHVlIHByZXNlbnQgZm9yICVzJywKICAgICAgICAgICAgICAgICAgICAgICR0eXBlX3VyaSkKICAgICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEdldCB0aGUgbGlzdCBvZiB2YWx1ZXMgZm9yIHRoaXMgYXR0cmlidXRlIGluIHRoZQogICAgICogZmV0Y2hfcmVzcG9uc2UuCiAgICAgKgogICAgICogWFhYOiB3aGF0IHRvIGRvIGlmIHRoZSB2YWx1ZXMgYXJlIG5vdCBwcmVzZW50PyBkZWZhdWx0CiAgICAgKiBwYXJhbWV0ZXI/IHRoaXMgaXMgZnVubnkgYmVjYXVzZSBpdCdzIGFsd2F5cyBzdXBwb3NlZCB0byByZXR1cm4KICAgICAqIGEgbGlzdCwgc28gdGhlIGRlZmF1bHQgbWF5IGJyZWFrIHRoYXQsIHRob3VnaCBpdCdzIHByb3ZpZGVkIGJ5CiAgICAgKiB0aGUgdXNlcidzIGNvZGUsIHNvIGl0IG1pZ2h0IGJlIG9rYXkuIElmIG5vIGRlZmF1bHQgaXMKICAgICAqIHN1cHBsaWVkLCBzaG91bGQgdGhlIHJldHVybiBiZSBOb25lIG9yIFtdPwogICAgICoKICAgICAqIEBwYXJhbSB0eXBlX3VyaTogVGhlIFVSSSBvZiB0aGUgYXR0cmlidXRlCiAgICAgKgogICAgICogQHJldHVybiAkdmFsdWVzIFRoZSBsaXN0IG9mIHZhbHVlcyBmb3IgdGhpcyBhdHRyaWJ1dGUgaW4gdGhlCiAgICAgKiByZXNwb25zZS4gTWF5IGJlIGFuIGVtcHR5IGxpc3QuICBJZiB0aGUgYXR0cmlidXRlIHdhcyBub3Qgc2VudAogICAgICogaW4gdGhlIHJlc3BvbnNlLCByZXR1cm5zIEF1dGhfT3BlbklEX0FYX0Vycm9yLgogICAgICovCiAgICBmdW5jdGlvbiBnZXQoJHR5cGVfdXJpKQogICAgewogICAgICAgIGlmIChhcnJheV9rZXlfZXhpc3RzKCR0eXBlX3VyaSwgJHRoaXMtPmRhdGEpKSB7CiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+ZGF0YVskdHlwZV91cmldOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgQXV0aF9PcGVuSURfQVhfRXJyb3IoCiAgICAgICAgICAgICAgc3ByaW50ZigiVHlwZSBVUkkgJXMgbm90IGZvdW5kIGluIHJlc3BvbnNlIiwKICAgICAgICAgICAgICAgICAgICAgICR0eXBlX3VyaSkKICAgICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEdldCB0aGUgbnVtYmVyIG9mIHJlc3BvbnNlcyBmb3IgYSBwYXJ0aWN1bGFyIGF0dHJpYnV0ZSBpbiB0aGlzCiAgICAgKiBmZXRjaF9yZXNwb25zZSBtZXNzYWdlLgogICAgICoKICAgICAqIEBwYXJhbSB0eXBlX3VyaTogVGhlIFVSSSBvZiB0aGUgYXR0cmlidXRlCiAgICAgKgogICAgICogQHJldHVybnMgaW50IFRoZSBudW1iZXIgb2YgdmFsdWVzIHNlbnQgZm9yIHRoaXMgYXR0cmlidXRlLiAgSWYKICAgICAqIHRoZSBhdHRyaWJ1dGUgd2FzIG5vdCBzZW50IGluIHRoZSByZXNwb25zZSwgcmV0dXJucwogICAgICogQXV0aF9PcGVuSURfQVhfRXJyb3IuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGNvdW50KCR0eXBlX3VyaSkKICAgIHsKICAgICAgICBpZiAoYXJyYXlfa2V5X2V4aXN0cygkdHlwZV91cmksICR0aGlzLT5kYXRhKSkgewogICAgICAgICAgICByZXR1cm4gY291bnQoJHRoaXMtPmdldCgkdHlwZV91cmkpKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gbmV3IEF1dGhfT3BlbklEX0FYX0Vycm9yKAogICAgICAgICAgICAgIHNwcmludGYoIlR5cGUgVVJJICVzIG5vdCBmb3VuZCBpbiByZXNwb25zZSIsCiAgICAgICAgICAgICAgICAgICAgICAkdHlwZV91cmkpCiAgICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9Cn0KCi8qKgogKiBBIGZldGNoX3Jlc3BvbnNlIGF0dHJpYnV0ZSBleGNoYW5nZSBtZXNzYWdlLgogKgogKiBAcGFja2FnZSBPcGVuSUQKICovCmNsYXNzIEF1dGhfT3BlbklEX0FYX0ZldGNoUmVzcG9uc2UgZXh0ZW5kcyBBdXRoX09wZW5JRF9BWF9LZXlWYWx1ZU1lc3NhZ2UgewogICAgdmFyICRtb2RlID0gJ2ZldGNoX3Jlc3BvbnNlJzsKCiAgICBmdW5jdGlvbiBBdXRoX09wZW5JRF9BWF9GZXRjaFJlc3BvbnNlKCR1cGRhdGVfdXJsPW51bGwpCiAgICB7CiAgICAgICAgJHRoaXMtPkF1dGhfT3BlbklEX0FYX0tleVZhbHVlTWVzc2FnZSgpOwogICAgICAgICR0aGlzLT51cGRhdGVfdXJsID0gJHVwZGF0ZV91cmw7CiAgICB9CgogICAgLyoqCiAgICAgKiBTZXJpYWxpemUgdGhpcyBvYmplY3QgaW50byBhcmd1bWVudHMgaW4gdGhlIGF0dHJpYnV0ZSBleGNoYW5nZQogICAgICogbmFtZXNwYWNlCiAgICAgKgogICAgICogQHJldHVybiAkYXJncyBUaGUgZGljdGlvbmFyeSBvZiB1bnF1YWxpZmllZCBhdHRyaWJ1dGUgZXhjaGFuZ2UKICAgICAqIGFyZ3VtZW50cyB0aGF0IHJlcHJlc2VudCB0aGlzIGZldGNoX3Jlc3BvbnNlLCBvcgogICAgICogQXV0aF9PcGVuSURfQVhfRXJyb3Igb24gZXJyb3IuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldEV4dGVuc2lvbkFyZ3MoJHJlcXVlc3Q9bnVsbCkKICAgIHsKICAgICAgICAkYWxpYXNlcyA9IG5ldyBBdXRoX09wZW5JRF9OYW1lc3BhY2VNYXAoKTsKCiAgICAgICAgJHplcm9fdmFsdWVfdHlwZXMgPSBhcnJheSgpOwoKICAgICAgICBpZiAoJHJlcXVlc3QgIT09IG51bGwpIHsKICAgICAgICAgICAgLy8gVmFsaWRhdGUgdGhlIGRhdGEgaW4gdGhlIGNvbnRleHQgb2YgdGhlIHJlcXVlc3QgKHRoZQogICAgICAgICAgICAvLyBzYW1lIGF0dHJpYnV0ZXMgc2hvdWxkIGJlIHByZXNlbnQgaW4gZWFjaCwgYW5kIHRoZQogICAgICAgICAgICAvLyBjb3VudHMgaW4gdGhlIHJlc3BvbnNlIG11c3QgYmUgbm8gbW9yZSB0aGFuIHRoZSBjb3VudHMKICAgICAgICAgICAgLy8gaW4gdGhlIHJlcXVlc3QpCgogICAgICAgICAgICBmb3JlYWNoICgkdGhpcy0+ZGF0YSBhcyAkdHlwZV91cmkgPT4gJHVudXNlZCkgewogICAgICAgICAgICAgICAgaWYgKCEkcmVxdWVzdC0+Y29udGFpbnMoJHR5cGVfdXJpKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQXV0aF9PcGVuSURfQVhfRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKCJSZXNwb25zZSBhdHRyaWJ1dGUgbm90IHByZXNlbnQgaW4gcmVxdWVzdDogJXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdHlwZV91cmkpCiAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBmb3JlYWNoICgkcmVxdWVzdC0+aXRlckF0dHJzKCkgYXMgJGF0dHJfaW5mbykgewogICAgICAgICAgICAgICAgLy8gQ29weSB0aGUgYWxpYXNlcyBmcm9tIHRoZSByZXF1ZXN0IHNvIHRoYXQgcmVhZGluZwogICAgICAgICAgICAgICAgLy8gdGhlIHJlc3BvbnNlIGluIGxpZ2h0IG9mIHRoZSByZXF1ZXN0IGlzIGVhc2llcgogICAgICAgICAgICAgICAgaWYgKCRhdHRyX2luZm8tPmFsaWFzID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgJGFsaWFzZXMtPmFkZCgkYXR0cl9pbmZvLT50eXBlX3VyaSk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICRhbGlhcyA9ICRhbGlhc2VzLT5hZGRBbGlhcygkYXR0cl9pbmZvLT50eXBlX3VyaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGF0dHJfaW5mby0+YWxpYXMpOwoKICAgICAgICAgICAgICAgICAgICBpZiAoJGFsaWFzID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQXV0aF9PcGVuSURfQVhfRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZigiQ291bGQgbm90IGFkZCBhbGlhcyAlcyBmb3IgVVJJICVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRhdHRyX2luZm8tPmFsaWFzLCAkYXR0cl9pbmZvLT50eXBlX3VyaSkKICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoYXJyYXlfa2V5X2V4aXN0cygkYXR0cl9pbmZvLT50eXBlX3VyaSwgJHRoaXMtPmRhdGEpKSB7CiAgICAgICAgICAgICAgICAgICAgJHZhbHVlcyA9ICR0aGlzLT5kYXRhWyRhdHRyX2luZm8tPnR5cGVfdXJpXTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJHZhbHVlcyA9IGFycmF5KCk7CiAgICAgICAgICAgICAgICAgICAgJHplcm9fdmFsdWVfdHlwZXNbXSA9ICRhdHRyX2luZm87CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCgkYXR0cl9pbmZvLT5jb3VudCAhPSBBdXRoX09wZW5JRF9BWF9VTkxJTUlURURfVkFMVUVTKSAmJgogICAgICAgICAgICAgICAgICAgICgkYXR0cl9pbmZvLT5jb3VudCA8IGNvdW50KCR2YWx1ZXMpKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQXV0aF9PcGVuSURfQVhfRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKCJNb3JlIHRoYW4gdGhlIG51bWJlciBvZiByZXF1ZXN0ZWQgdmFsdWVzICIgLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid2VyZSBzcGVjaWZpZWQgZm9yICVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGF0dHJfaW5mby0+dHlwZV91cmkpCiAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAka3ZfYXJncyA9ICR0aGlzLT5fZ2V0RXh0ZW5zaW9uS1ZBcmdzKCRhbGlhc2VzKTsKCiAgICAgICAgLy8gQWRkIHRoZSBLViBhcmdzIGludG8gdGhlIHJlc3BvbnNlIHdpdGggdGhlIGFyZ3MgdGhhdCBhcmUKICAgICAgICAvLyB1bmlxdWUgdG8gdGhlIGZldGNoX3Jlc3BvbnNlCiAgICAgICAgJGF4X2FyZ3MgPSAkdGhpcy0+X25ld0FyZ3MoKTsKCiAgICAgICAgLy8gRm9yIGVhY2ggcmVxdWVzdGVkIGF0dHJpYnV0ZSwgcHV0IGl0cyB0eXBlL2FsaWFzIGFuZCBjb3VudAogICAgICAgIC8vIGludG8gdGhlIHJlc3BvbnNlIGV2ZW4gaWYgbm8gZGF0YSB3ZXJlIHJldHVybmVkLgogICAgICAgIGZvcmVhY2ggKCR6ZXJvX3ZhbHVlX3R5cGVzIGFzICRhdHRyX2luZm8pIHsKICAgICAgICAgICAgJGFsaWFzID0gJGFsaWFzZXMtPmdldEFsaWFzKCRhdHRyX2luZm8tPnR5cGVfdXJpKTsKICAgICAgICAgICAgJGt2X2FyZ3NbJ3R5cGUuJyAuICRhbGlhc10gPSAkYXR0cl9pbmZvLT50eXBlX3VyaTsKICAgICAgICAgICAgJGt2X2FyZ3NbJ2NvdW50LicgLiAkYWxpYXNdID0gJzAnOwogICAgICAgIH0KCiAgICAgICAgJHVwZGF0ZV91cmwgPSBudWxsOwogICAgICAgIGlmICgkcmVxdWVzdCkgewogICAgICAgICAgICAkdXBkYXRlX3VybCA9ICRyZXF1ZXN0LT51cGRhdGVfdXJsOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICR1cGRhdGVfdXJsID0gJHRoaXMtPnVwZGF0ZV91cmw7CiAgICAgICAgfQoKICAgICAgICBpZiAoJHVwZGF0ZV91cmwpIHsKICAgICAgICAgICAgJGF4X2FyZ3NbJ3VwZGF0ZV91cmwnXSA9ICR1cGRhdGVfdXJsOwogICAgICAgIH0KCiAgICAgICAgQXV0aF9PcGVuSUQ6OnVwZGF0ZSgkYXhfYXJncywgJGt2X2FyZ3MpOwoKICAgICAgICByZXR1cm4gJGF4X2FyZ3M7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcmV0dXJuICRyZXN1bHQgQXV0aF9PcGVuSURfQVhfRXJyb3Igb24gZmFpbHVyZSBvciB0cnVlIG9uCiAgICAgKiBzdWNjZXNzLgogICAgICovCiAgICBmdW5jdGlvbiBwYXJzZUV4dGVuc2lvbkFyZ3MoJGF4X2FyZ3MpCiAgICB7CiAgICAgICAgJHJlc3VsdCA9IHBhcmVudDo6cGFyc2VFeHRlbnNpb25BcmdzKCRheF9hcmdzKTsKCiAgICAgICAgaWYgKEF1dGhfT3BlbklEX0FYOjppc0Vycm9yKCRyZXN1bHQpKSB7CiAgICAgICAgICAgIHJldHVybiAkcmVzdWx0OwogICAgICAgIH0KCiAgICAgICAgJHRoaXMtPnVwZGF0ZV91cmwgPSBBdXRoX09wZW5JRDo6YXJyYXlHZXQoJGF4X2FyZ3MsICd1cGRhdGVfdXJsJyk7CgogICAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIC8qKgogICAgICogQ29uc3RydWN0IGEgRmV0Y2hSZXNwb25zZSBvYmplY3QgZnJvbSBhbiBPcGVuSUQgbGlicmFyeQogICAgICogU3VjY2Vzc1Jlc3BvbnNlIG9iamVjdC4KICAgICAqCiAgICAgKiBAcGFyYW0gc3VjY2Vzc19yZXNwb25zZTogQSBzdWNjZXNzZnVsIGlkX3JlcyByZXNwb25zZSBvYmplY3QKICAgICAqCiAgICAgKiBAcGFyYW0gc2lnbmVkOiBXaGV0aGVyIG5vbi1zaWduZWQgYXJncyBzaG91bGQgYmUgcHJvY2Vzc3NlZC4gSWYKICAgICAqIFRydWUgKHRoZSBkZWZhdWx0KSwgb25seSBzaWduZWQgYXJndW1lbnRzIHdpbGwgYmUgcHJvY2Vzc3NlZC4KICAgICAqCiAgICAgKiBAcmV0dXJuICRyZXNwb25zZSBBIEZldGNoUmVzcG9uc2UgY29udGFpbmluZyB0aGUgZGF0YSBmcm9tIHRoZQogICAgICogT3BlbklEIG1lc3NhZ2UKICAgICAqLwogICAgc3RhdGljIGZ1bmN0aW9uIGZyb21TdWNjZXNzUmVzcG9uc2UoJHN1Y2Nlc3NfcmVzcG9uc2UsICRzaWduZWQ9dHJ1ZSkKICAgIHsKICAgICAgICAkb2JqID0gbmV3IEF1dGhfT3BlbklEX0FYX0ZldGNoUmVzcG9uc2UoKTsKICAgICAgICBpZiAoJHNpZ25lZCkgewogICAgICAgICAgICAkYXhfYXJncyA9ICRzdWNjZXNzX3Jlc3BvbnNlLT5nZXRTaWduZWROUygkb2JqLT5uc191cmkpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRheF9hcmdzID0gJHN1Y2Nlc3NfcmVzcG9uc2UtPm1lc3NhZ2UtPmdldEFyZ3MoJG9iai0+bnNfdXJpKTsKICAgICAgICB9CiAgICAgICAgaWYgKCRheF9hcmdzID09PSBudWxsIHx8IEF1dGhfT3BlbklEOjppc0ZhaWx1cmUoJGF4X2FyZ3MpIHx8CiAgICAgICAgICAgICAgc2l6ZW9mKCRheF9hcmdzKSA9PSAwKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KCiAgICAgICAgJHJlc3VsdCA9ICRvYmotPnBhcnNlRXh0ZW5zaW9uQXJncygkYXhfYXJncyk7CiAgICAgICAgaWYgKEF1dGhfT3BlbklEX0FYOjppc0Vycm9yKCRyZXN1bHQpKSB7CiAgICAgICAgICAgICNYWFggbG9nIG1lCiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJG9iajsKICAgIH0KfQoKLyoqCiAqIEEgc3RvcmUgcmVxdWVzdCBhdHRyaWJ1dGUgZXhjaGFuZ2UgbWVzc2FnZSByZXByZXNlbnRhdGlvbi4KICoKICogQHBhY2thZ2UgT3BlbklECiAqLwpjbGFzcyBBdXRoX09wZW5JRF9BWF9TdG9yZVJlcXVlc3QgZXh0ZW5kcyBBdXRoX09wZW5JRF9BWF9LZXlWYWx1ZU1lc3NhZ2UgewogICAgdmFyICRtb2RlID0gJ3N0b3JlX3JlcXVlc3QnOwoKICAgIC8qKgogICAgICogQHBhcmFtIGFycmF5ICRhbGlhc2VzIFRoZSBuYW1lc3BhY2UgYWxpYXNlcyB0byB1c2Ugd2hlbiBtYWtpbmcKICAgICAqIHRoaXMgc3RvcmUgcmVzcG9uc2UuIExlYXZlIGFzIE5vbmUgdG8gdXNlIGRlZmF1bHRzLgogICAgICovCiAgICBmdW5jdGlvbiBnZXRFeHRlbnNpb25BcmdzKCRhbGlhc2VzPW51bGwpCiAgICB7CiAgICAgICAgJGF4X2FyZ3MgPSAkdGhpcy0+X25ld0FyZ3MoKTsKICAgICAgICAka3ZfYXJncyA9ICR0aGlzLT5fZ2V0RXh0ZW5zaW9uS1ZBcmdzKCRhbGlhc2VzKTsKICAgICAgICBBdXRoX09wZW5JRDo6dXBkYXRlKCRheF9hcmdzLCAka3ZfYXJncyk7CiAgICAgICAgcmV0dXJuICRheF9hcmdzOwogICAgfQp9CgovKioKICogQW4gaW5kaWNhdGlvbiB0aGF0IHRoZSBzdG9yZSByZXF1ZXN0IHdhcyBwcm9jZXNzZWQgYWxvbmcgd2l0aCB0aGlzCiAqIE9wZW5JRCB0cmFuc2FjdGlvbi4gIFVzZSBtYWtlKCksIE5PVCB0aGUgY29uc3RydWN0b3IsIHRvIGNyZWF0ZQogKiByZXNwb25zZSBvYmplY3RzLgogKgogKiBAcGFja2FnZSBPcGVuSUQKICovCmNsYXNzIEF1dGhfT3BlbklEX0FYX1N0b3JlUmVzcG9uc2UgZXh0ZW5kcyBBdXRoX09wZW5JRF9BWF9NZXNzYWdlIHsKICAgIHZhciAkU1VDQ0VTU19NT0RFID0gJ3N0b3JlX3Jlc3BvbnNlX3N1Y2Nlc3MnOwogICAgdmFyICRGQUlMVVJFX01PREUgPSAnc3RvcmVfcmVzcG9uc2VfZmFpbHVyZSc7CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIEF1dGhfT3BlbklEX0FYX0Vycm9yIG9uIGVycm9yIG9yIGFuCiAgICAgKiBBdXRoX09wZW5JRF9BWF9TdG9yZVJlc3BvbnNlIG9iamVjdCBvbiBzdWNjZXNzLgogICAgICovCiAgICBmdW5jdGlvbiBtYWtlKCRzdWNjZWVkZWQ9dHJ1ZSwgJGVycm9yX21lc3NhZ2U9bnVsbCkKICAgIHsKICAgICAgICBpZiAoKCRzdWNjZWVkZWQpICYmICgkZXJyb3JfbWVzc2FnZSAhPT0gbnVsbCkpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBBdXRoX09wZW5JRF9BWF9FcnJvcignQW4gZXJyb3IgbWVzc2FnZSBtYXkgb25seSBiZSAnLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaW5jbHVkZWQgaW4gYSBmYWlsaW5nIGZldGNoIHJlc3BvbnNlJyk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gbmV3IEF1dGhfT3BlbklEX0FYX1N0b3JlUmVzcG9uc2UoJHN1Y2NlZWRlZCwgJGVycm9yX21lc3NhZ2UpOwogICAgfQoKICAgIGZ1bmN0aW9uIEF1dGhfT3BlbklEX0FYX1N0b3JlUmVzcG9uc2UoJHN1Y2NlZWRlZD10cnVlLCAkZXJyb3JfbWVzc2FnZT1udWxsKQogICAgewogICAgICAgIGlmICgkc3VjY2VlZGVkKSB7CiAgICAgICAgICAgICR0aGlzLT5tb2RlID0gJHRoaXMtPlNVQ0NFU1NfTU9ERTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkdGhpcy0+bW9kZSA9ICR0aGlzLT5GQUlMVVJFX01PREU7CiAgICAgICAgfQoKICAgICAgICAkdGhpcy0+ZXJyb3JfbWVzc2FnZSA9ICRlcnJvcl9tZXNzYWdlOwogICAgfQoKICAgIC8qKgogICAgICogV2FzIHRoaXMgcmVzcG9uc2UgYSBzdWNjZXNzIHJlc3BvbnNlPwogICAgICovCiAgICBmdW5jdGlvbiBzdWNjZWVkZWQoKQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+bW9kZSA9PSAkdGhpcy0+U1VDQ0VTU19NT0RFOwogICAgfQoKICAgIGZ1bmN0aW9uIGdldEV4dGVuc2lvbkFyZ3MoKQogICAgewogICAgICAgICRheF9hcmdzID0gJHRoaXMtPl9uZXdBcmdzKCk7CiAgICAgICAgaWYgKCghJHRoaXMtPnN1Y2NlZWRlZCgpKSAmJiAkdGhpcy0+ZXJyb3JfbWVzc2FnZSkgewogICAgICAgICAgICAkYXhfYXJnc1snZXJyb3InXSA9ICR0aGlzLT5lcnJvcl9tZXNzYWdlOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRheF9hcmdzOwogICAgfQp9Cgo=]]></data>
	</file>
	<file>
	  <filename>/openid-php-openid-782224d/Auth/OpenID/BigMath.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBCaWdNYXRoOiBBIG1hdGggbGlicmFyeSB3cmFwcGVyIHRoYXQgYWJzdHJhY3RzIG91dCB0aGUgdW5kZXJseWluZwogKiBsb25nIGludGVnZXIgbGlicmFyeS4KICoKICogUEhQIHZlcnNpb25zIDQgYW5kIDUKICoKICogTElDRU5TRTogU2VlIHRoZSBDT1BZSU5HIGZpbGUgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24uCiAqCiAqIEBhY2Nlc3MgcHJpdmF0ZQogKiBAcGFja2FnZSBPcGVuSUQKICogQGF1dGhvciBKYW5SYWluLCBJbmMuIDxvcGVuaWRAamFucmFpbi5jb20+CiAqIEBjb3B5cmlnaHQgMjAwNS0yMDA4IEphbnJhaW4sIEluYy4KICogQGxpY2Vuc2UgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIEFwYWNoZQogKi8KCi8qKgogKiBOZWVkZWQgZm9yIHJhbmRvbSBudW1iZXIgZ2VuZXJhdGlvbgogKi8KcmVxdWlyZV9vbmNlICdBdXRoL09wZW5JRC9DcnlwdFV0aWwucGhwJzsKCi8qKgogKiBOZWVkIEF1dGhfT3BlbklEOjpieXRlcygpLgogKi8KcmVxdWlyZV9vbmNlICdBdXRoL09wZW5JRC5waHAnOwoKLyoqCiAqIFRoZSBzdXBlcmNsYXNzIG9mIGFsbCBiaWctaW50ZWdlciBtYXRoIGltcGxlbWVudGF0aW9ucwogKiBAYWNjZXNzIHByaXZhdGUKICogQHBhY2thZ2UgT3BlbklECiAqLwpjbGFzcyBBdXRoX09wZW5JRF9NYXRoTGlicmFyeSB7CiAgICAvKioKICAgICAqIEdpdmVuIGEgbG9uZyBpbnRlZ2VyLCByZXR1cm5zIHRoZSBudW1iZXIgY29udmVydGVkIHRvIGEgYmluYXJ5CiAgICAgKiBzdHJpbmcuICBUaGlzIGZ1bmN0aW9uIGFjY2VwdHMgbG9uZyBpbnRlZ2VyIHZhbHVlcyBvZiBhcmJpdHJhcnkKICAgICAqIG1hZ25pdHVkZSBhbmQgdXNlcyB0aGUgbG9jYWwgbGFyZ2UtbnVtYmVyIG1hdGggbGlicmFyeSB3aGVuCiAgICAgKiBhdmFpbGFibGUuCiAgICAgKgogICAgICogQHBhcmFtIGludGVnZXIgJGxvbmcgVGhlIGxvbmcgbnVtYmVyIChjYW4gYmUgYSBub3JtYWwgUEhQCiAgICAgKiBpbnRlZ2VyIG9yIGEgbnVtYmVyIGNyZWF0ZWQgYnkgb25lIG9mIHRoZSBhdmFpbGFibGUgbG9uZyBudW1iZXIKICAgICAqIGxpYnJhcmllcykKICAgICAqIEByZXR1cm4gc3RyaW5nICRiaW5hcnkgVGhlIGJpbmFyeSB2ZXJzaW9uIG9mICRsb25nCiAgICAgKi8KICAgIGZ1bmN0aW9uIGxvbmdUb0JpbmFyeSgkbG9uZykKICAgIHsKICAgICAgICAkY21wID0gJHRoaXMtPmNtcCgkbG9uZywgMCk7CiAgICAgICAgaWYgKCRjbXAgPCAwKSB7CiAgICAgICAgICAgICRtc2cgPSBfX0ZVTkNUSU9OX18gLiAiIHRha2VzIG9ubHkgcG9zaXRpdmUgaW50ZWdlcnMuIjsKICAgICAgICAgICAgdHJpZ2dlcl9lcnJvcigkbXNnLCBFX1VTRVJfRVJST1IpOwogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CgogICAgICAgIGlmICgkY21wID09IDApIHsKICAgICAgICAgICAgcmV0dXJuICJceDAwIjsKICAgICAgICB9CgogICAgICAgICRieXRlcyA9IGFycmF5KCk7CgogICAgICAgIHdoaWxlICgkdGhpcy0+Y21wKCRsb25nLCAwKSA+IDApIHsKICAgICAgICAgICAgYXJyYXlfdW5zaGlmdCgkYnl0ZXMsICR0aGlzLT5tb2QoJGxvbmcsIDI1NikpOwogICAgICAgICAgICAkbG9uZyA9ICR0aGlzLT5kaXYoJGxvbmcsIHBvdygyLCA4KSk7CiAgICAgICAgfQoKICAgICAgICBpZiAoJGJ5dGVzICYmICgkYnl0ZXNbMF0gPiAxMjcpKSB7CiAgICAgICAgICAgIGFycmF5X3Vuc2hpZnQoJGJ5dGVzLCAwKTsKICAgICAgICB9CgogICAgICAgICRzdHJpbmcgPSAnJzsKICAgICAgICBmb3JlYWNoICgkYnl0ZXMgYXMgJGJ5dGUpIHsKICAgICAgICAgICAgJHN0cmluZyAuPSBwYWNrKCdDJywgJGJ5dGUpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRzdHJpbmc7CiAgICB9CgogICAgLyoqCiAgICAgKiBHaXZlbiBhIGJpbmFyeSBzdHJpbmcsIHJldHVybnMgdGhlIGJpbmFyeSBzdHJpbmcgY29udmVydGVkIHRvIGEKICAgICAqIGxvbmcgbnVtYmVyLgogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgJGJpbmFyeSBUaGUgYmluYXJ5IHZlcnNpb24gb2YgYSBsb25nIG51bWJlciwKICAgICAqIHByb2JhYmx5IGFzIGEgcmVzdWx0IG9mIGNhbGxpbmcgbG9uZ1RvQmluYXJ5CiAgICAgKiBAcmV0dXJuIGludGVnZXIgJGxvbmcgVGhlIGxvbmcgbnVtYmVyIGVxdWl2YWxlbnQgb2YgdGhlIGJpbmFyeQogICAgICogc3RyaW5nICRzdHIKICAgICAqLwogICAgZnVuY3Rpb24gYmluYXJ5VG9Mb25nKCRzdHIpCiAgICB7CiAgICAgICAgaWYgKCRzdHIgPT09IG51bGwpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQoKICAgICAgICAvLyBVc2UgYXJyYXlfbWVyZ2UgdG8gcmV0dXJuIGEgemVyby1pbmRleGVkIGFycmF5IGluc3RlYWQgb2YgYQogICAgICAgIC8vIG9uZS1pbmRleGVkIGFycmF5LgogICAgICAgICRieXRlcyA9IGFycmF5X21lcmdlKHVucGFjaygnQyonLCAkc3RyKSk7CgogICAgICAgICRuID0gJHRoaXMtPmluaXQoMCk7CgogICAgICAgIGlmICgkYnl0ZXMgJiYgKCRieXRlc1swXSA+IDEyNykpIHsKICAgICAgICAgICAgdHJpZ2dlcl9lcnJvcigiYnl0ZXNUb051bSB3b3JrcyBvbmx5IGZvciBwb3NpdGl2ZSBpbnRlZ2Vycy4iLAogICAgICAgICAgICAgICAgICAgICAgICAgIEVfVVNFUl9XQVJOSU5HKTsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQoKICAgICAgICBmb3JlYWNoICgkYnl0ZXMgYXMgJGJ5dGUpIHsKICAgICAgICAgICAgJG4gPSAkdGhpcy0+bXVsKCRuLCBwb3coMiwgOCkpOwogICAgICAgICAgICAkbiA9ICR0aGlzLT5hZGQoJG4sICRieXRlKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkbjsKICAgIH0KCiAgICBmdW5jdGlvbiBiYXNlNjRUb0xvbmcoJHN0cikKICAgIHsKICAgICAgICAkYjY0ID0gYmFzZTY0X2RlY29kZSgkc3RyKTsKCiAgICAgICAgaWYgKCRiNjQgPT09IGZhbHNlKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkdGhpcy0+YmluYXJ5VG9Mb25nKCRiNjQpOwogICAgfQoKICAgIGZ1bmN0aW9uIGxvbmdUb0Jhc2U2NCgkc3RyKQogICAgewogICAgICAgIHJldHVybiBiYXNlNjRfZW5jb2RlKCR0aGlzLT5sb25nVG9CaW5hcnkoJHN0cikpOwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyBhIHJhbmRvbSBudW1iZXIgaW4gdGhlIHNwZWNpZmllZCByYW5nZS4gIFRoaXMgZnVuY3Rpb24KICAgICAqIGFjY2VwdHMgJHN0YXJ0LCAkc3RvcCwgYW5kICRzdGVwIHZhbHVlcyBvZiBhcmJpdHJhcnkgbWFnbml0dWRlCiAgICAgKiBhbmQgd2lsbCB1dGlsaXplIHRoZSBsb2NhbCBsYXJnZS1udW1iZXIgbWF0aCBsaWJyYXJ5IHdoZW4KICAgICAqIGF2YWlsYWJsZS4KICAgICAqCiAgICAgKiBAcGFyYW0gaW50ZWdlciAkc3RhcnQgVGhlIHN0YXJ0IG9mIHRoZSByYW5nZSwgb3IgdGhlIG1pbmltdW0KICAgICAqIHJhbmRvbSBudW1iZXIgdG8gcmV0dXJuCiAgICAgKiBAcGFyYW0gaW50ZWdlciAkc3RvcCBUaGUgZW5kIG9mIHRoZSByYW5nZSwgb3IgdGhlIG1heGltdW0KICAgICAqIHJhbmRvbSBudW1iZXIgdG8gcmV0dXJuCiAgICAgKiBAcGFyYW0gaW50ZWdlciAkc3RlcCBUaGUgc3RlcCBzaXplLCBzdWNoIHRoYXQgJHJlc3VsdCAtICgkc3RlcAogICAgICogKiBOKSA9ICRzdGFydCBmb3Igc29tZSBOCiAgICAgKiBAcmV0dXJuIGludGVnZXIgJHJlc3VsdCBUaGUgcmVzdWx0aW5nIHJhbmRvbWx5LWdlbmVyYXRlZCBudW1iZXIKICAgICAqLwogICAgZnVuY3Rpb24gcmFuZCgkc3RvcCkKICAgIHsKICAgICAgICBzdGF0aWMgJGR1cGxpY2F0ZV9jYWNoZSA9IGFycmF5KCk7CgogICAgICAgIC8vIFVzZWQgYXMgdGhlIGtleSBmb3IgdGhlIGR1cGxpY2F0ZSBjYWNoZQogICAgICAgICRyYnl0ZXMgPSAkdGhpcy0+bG9uZ1RvQmluYXJ5KCRzdG9wKTsKCiAgICAgICAgaWYgKGFycmF5X2tleV9leGlzdHMoJHJieXRlcywgJGR1cGxpY2F0ZV9jYWNoZSkpIHsKICAgICAgICAgICAgbGlzdCgkZHVwbGljYXRlLCAkbmJ5dGVzKSA9ICRkdXBsaWNhdGVfY2FjaGVbJHJieXRlc107CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKCRyYnl0ZXNbMF0gPT0gIlx4MDAiKSB7CiAgICAgICAgICAgICAgICAkbmJ5dGVzID0gQXV0aF9PcGVuSUQ6OmJ5dGVzKCRyYnl0ZXMpIC0gMTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICRuYnl0ZXMgPSBBdXRoX09wZW5JRDo6Ynl0ZXMoJHJieXRlcyk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRteHJhbmQgPSAkdGhpcy0+cG93KDI1NiwgJG5ieXRlcyk7CgogICAgICAgICAgICAvLyBJZiB3ZSBnZXQgYSBudW1iZXIgbGVzcyB0aGFuIHRoaXMsIHRoZW4gaXQgaXMgaW4gdGhlCiAgICAgICAgICAgIC8vIGR1cGxpY2F0ZWQgcmFuZ2UuCiAgICAgICAgICAgICRkdXBsaWNhdGUgPSAkdGhpcy0+bW9kKCRteHJhbmQsICRzdG9wKTsKCiAgICAgICAgICAgIGlmIChjb3VudCgkZHVwbGljYXRlX2NhY2hlKSA+IDEwKSB7CiAgICAgICAgICAgICAgICAkZHVwbGljYXRlX2NhY2hlID0gYXJyYXkoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJGR1cGxpY2F0ZV9jYWNoZVskcmJ5dGVzXSA9IGFycmF5KCRkdXBsaWNhdGUsICRuYnl0ZXMpOwogICAgICAgIH0KCiAgICAgICAgZG8gewogICAgICAgICAgICAkYnl0ZXMgPSAiXHgwMCIgLiBBdXRoX09wZW5JRF9DcnlwdFV0aWw6OmdldEJ5dGVzKCRuYnl0ZXMpOwogICAgICAgICAgICAkbiA9ICR0aGlzLT5iaW5hcnlUb0xvbmcoJGJ5dGVzKTsKICAgICAgICAgICAgLy8gS2VlcCBsb29waW5nIGlmIHRoaXMgdmFsdWUgaXMgaW4gdGhlIGxvdyBkdXBsaWNhdGVkIHJhbmdlCiAgICAgICAgfSB3aGlsZSAoJHRoaXMtPmNtcCgkbiwgJGR1cGxpY2F0ZSkgPCAwKTsKCiAgICAgICAgcmV0dXJuICR0aGlzLT5tb2QoJG4sICRzdG9wKTsKICAgIH0KfQoKLyoqCiAqIEV4cG9zZXMgQkNtYXRoIG1hdGggbGlicmFyeSBmdW5jdGlvbmFsaXR5LgogKgogKiB7QGxpbmsgQXV0aF9PcGVuSURfQmNNYXRoV3JhcHBlcn0gd3JhcHMgdGhlIGZ1bmN0aW9uYWxpdHkgcHJvdmlkZWQKICogYnkgdGhlIEJDTWF0aCBleHRlbnNpb24uCiAqCiAqIEBhY2Nlc3MgcHJpdmF0ZQogKiBAcGFja2FnZSBPcGVuSUQKICovCmNsYXNzIEF1dGhfT3BlbklEX0JjTWF0aFdyYXBwZXIgZXh0ZW5kcyBBdXRoX09wZW5JRF9NYXRoTGlicmFyeXsKICAgIHZhciAkdHlwZSA9ICdiY21hdGgnOwoKICAgIGZ1bmN0aW9uIGFkZCgkeCwgJHkpCiAgICB7CiAgICAgICAgcmV0dXJuIGJjYWRkKCR4LCAkeSk7CiAgICB9CgogICAgZnVuY3Rpb24gc3ViKCR4LCAkeSkKICAgIHsKICAgICAgICByZXR1cm4gYmNzdWIoJHgsICR5KTsKICAgIH0KCiAgICBmdW5jdGlvbiBwb3coJGJhc2UsICRleHBvbmVudCkKICAgIHsKICAgICAgICByZXR1cm4gYmNwb3coJGJhc2UsICRleHBvbmVudCk7CiAgICB9CgogICAgZnVuY3Rpb24gY21wKCR4LCAkeSkKICAgIHsKICAgICAgICByZXR1cm4gYmNjb21wKCR4LCAkeSk7CiAgICB9CgogICAgZnVuY3Rpb24gaW5pdCgkbnVtYmVyLCAkYmFzZSA9IDEwKQogICAgewogICAgICAgIHJldHVybiAkbnVtYmVyOwogICAgfQoKICAgIGZ1bmN0aW9uIG1vZCgkYmFzZSwgJG1vZHVsdXMpCiAgICB7CiAgICAgICAgcmV0dXJuIGJjbW9kKCRiYXNlLCAkbW9kdWx1cyk7CiAgICB9CgogICAgZnVuY3Rpb24gbXVsKCR4LCAkeSkKICAgIHsKICAgICAgICByZXR1cm4gYmNtdWwoJHgsICR5KTsKICAgIH0KCiAgICBmdW5jdGlvbiBkaXYoJHgsICR5KQogICAgewogICAgICAgIHJldHVybiBiY2RpdigkeCwgJHkpOwogICAgfQoKICAgIC8qKgogICAgICogU2FtZSBhcyBiY3Bvd21vZCB3aGVuIGJjcG93bW9kIGlzIG1pc3NpbmcKICAgICAqCiAgICAgKiBAYWNjZXNzIHByaXZhdGUKICAgICAqLwogICAgZnVuY3Rpb24gX3Bvd21vZCgkYmFzZSwgJGV4cG9uZW50LCAkbW9kdWx1cykKICAgIHsKICAgICAgICAkc3F1YXJlID0gJHRoaXMtPm1vZCgkYmFzZSwgJG1vZHVsdXMpOwogICAgICAgICRyZXN1bHQgPSAxOwogICAgICAgIHdoaWxlKCR0aGlzLT5jbXAoJGV4cG9uZW50LCAwKSA+IDApIHsKICAgICAgICAgICAgaWYgKCR0aGlzLT5tb2QoJGV4cG9uZW50LCAyKSkgewogICAgICAgICAgICAgICAgJHJlc3VsdCA9ICR0aGlzLT5tb2QoJHRoaXMtPm11bCgkcmVzdWx0LCAkc3F1YXJlKSwgJG1vZHVsdXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRzcXVhcmUgPSAkdGhpcy0+bW9kKCR0aGlzLT5tdWwoJHNxdWFyZSwgJHNxdWFyZSksICRtb2R1bHVzKTsKICAgICAgICAgICAgJGV4cG9uZW50ID0gJHRoaXMtPmRpdigkZXhwb25lbnQsIDIpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJHJlc3VsdDsKICAgIH0KCiAgICBmdW5jdGlvbiBwb3dtb2QoJGJhc2UsICRleHBvbmVudCwgJG1vZHVsdXMpCiAgICB7CiAgICAgICAgaWYgKGZ1bmN0aW9uX2V4aXN0cygnYmNwb3dtb2QnKSkgewogICAgICAgICAgICByZXR1cm4gYmNwb3dtb2QoJGJhc2UsICRleHBvbmVudCwgJG1vZHVsdXMpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+X3Bvd21vZCgkYmFzZSwgJGV4cG9uZW50LCAkbW9kdWx1cyk7CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIHRvU3RyaW5nKCRudW0pCiAgICB7CiAgICAgICAgcmV0dXJuICRudW07CiAgICB9Cn0KCi8qKgogKiBFeHBvc2VzIEdNUCBtYXRoIGxpYnJhcnkgZnVuY3Rpb25hbGl0eS4KICoKICoge0BsaW5rIEF1dGhfT3BlbklEX0dtcE1hdGhXcmFwcGVyfSB3cmFwcyB0aGUgZnVuY3Rpb25hbGl0eSBwcm92aWRlZAogKiBieSB0aGUgR01QIGV4dGVuc2lvbi4KICoKICogQGFjY2VzcyBwcml2YXRlCiAqIEBwYWNrYWdlIE9wZW5JRAogKi8KY2xhc3MgQXV0aF9PcGVuSURfR21wTWF0aFdyYXBwZXIgZXh0ZW5kcyBBdXRoX09wZW5JRF9NYXRoTGlicmFyeXsKICAgIHZhciAkdHlwZSA9ICdnbXAnOwoKICAgIGZ1bmN0aW9uIGFkZCgkeCwgJHkpCiAgICB7CiAgICAgICAgcmV0dXJuIGdtcF9hZGQoJHgsICR5KTsKICAgIH0KCiAgICBmdW5jdGlvbiBzdWIoJHgsICR5KQogICAgewogICAgICAgIHJldHVybiBnbXBfc3ViKCR4LCAkeSk7CiAgICB9CgogICAgZnVuY3Rpb24gcG93KCRiYXNlLCAkZXhwb25lbnQpCiAgICB7CiAgICAgICAgcmV0dXJuIGdtcF9wb3coJGJhc2UsICRleHBvbmVudCk7CiAgICB9CgogICAgZnVuY3Rpb24gY21wKCR4LCAkeSkKICAgIHsKICAgICAgICByZXR1cm4gZ21wX2NtcCgkeCwgJHkpOwogICAgfQoKICAgIGZ1bmN0aW9uIGluaXQoJG51bWJlciwgJGJhc2UgPSAxMCkKICAgIHsKICAgICAgICByZXR1cm4gZ21wX2luaXQoJG51bWJlciwgJGJhc2UpOwogICAgfQoKICAgIGZ1bmN0aW9uIG1vZCgkYmFzZSwgJG1vZHVsdXMpCiAgICB7CiAgICAgICAgcmV0dXJuIGdtcF9tb2QoJGJhc2UsICRtb2R1bHVzKTsKICAgIH0KCiAgICBmdW5jdGlvbiBtdWwoJHgsICR5KQogICAgewogICAgICAgIHJldHVybiBnbXBfbXVsKCR4LCAkeSk7CiAgICB9CgogICAgZnVuY3Rpb24gZGl2KCR4LCAkeSkKICAgIHsKICAgICAgICByZXR1cm4gZ21wX2Rpdl9xKCR4LCAkeSk7CiAgICB9CgogICAgZnVuY3Rpb24gcG93bW9kKCRiYXNlLCAkZXhwb25lbnQsICRtb2R1bHVzKQogICAgewogICAgICAgIHJldHVybiBnbXBfcG93bSgkYmFzZSwgJGV4cG9uZW50LCAkbW9kdWx1cyk7CiAgICB9CgogICAgZnVuY3Rpb24gdG9TdHJpbmcoJG51bSkKICAgIHsKICAgICAgICByZXR1cm4gZ21wX3N0cnZhbCgkbnVtKTsKICAgIH0KfQoKLyoqCiAqIERlZmluZSB0aGUgc3VwcG9ydGVkIGV4dGVuc2lvbnMuICBBbiBleHRlbnNpb24gYXJyYXkgaGFzIGtleXMKICogJ21vZHVsZXMnLCAnZXh0ZW5zaW9uJywgYW5kICdjbGFzcycuICAnbW9kdWxlcycgaXMgYW4gYXJyYXkgb2YgUEhQCiAqIG1vZHVsZSBuYW1lcyB3aGljaCB0aGUgbG9hZGluZyBjb2RlIHdpbGwgYXR0ZW1wdCB0byBsb2FkLiAgVGhlc2UKICogdmFsdWVzIHdpbGwgYmUgc3VmZml4ZWQgd2l0aCBhIGxpYnJhcnkgZmlsZSBleHRlbnNpb24gKGUuZy4gIi5zbyIpLgogKiAnZXh0ZW5zaW9uJyBpcyB0aGUgbmFtZSBvZiBhIFBIUCBleHRlbnNpb24gd2hpY2ggd2lsbCBiZSB0ZXN0ZWQKICogYmVmb3JlICdtb2R1bGVzJyBhcmUgbG9hZGVkLiAgJ2NsYXNzJyBpcyB0aGUgc3RyaW5nIG5hbWUgb2YgYQogKiB7QGxpbmsgQXV0aF9PcGVuSURfTWF0aFdyYXBwZXJ9IHN1YmNsYXNzIHdoaWNoIHNob3VsZCBiZQogKiBpbnN0YW50aWF0ZWQgaWYgYSBnaXZlbiBleHRlbnNpb24gaXMgcHJlc2VudC4KICoKICogWW91IGNhbiBkZWZpbmUgbmV3IG1hdGggbGlicmFyeSBpbXBsZW1lbnRhdGlvbnMgYW5kIGFkZCB0aGVtIHRvCiAqIHRoaXMgYXJyYXkuCiAqLwpmdW5jdGlvbiBBdXRoX09wZW5JRF9tYXRoX2V4dGVuc2lvbnMoKQp7CiAgICAkcmVzdWx0ID0gYXJyYXkoKTsKCiAgICBpZiAoIWRlZmluZWQoJ0F1dGhfT3BlbklEX0JVR0dZX0dNUCcpKSB7CiAgICAgICAgJHJlc3VsdFtdID0KICAgICAgICAgICAgYXJyYXkoJ21vZHVsZXMnID0+IGFycmF5KCdnbXAnLCAncGhwX2dtcCcpLAogICAgICAgICAgICAgICAgICAnZXh0ZW5zaW9uJyA9PiAnZ21wJywKICAgICAgICAgICAgICAgICAgJ2NsYXNzJyA9PiAnQXV0aF9PcGVuSURfR21wTWF0aFdyYXBwZXInKTsKICAgIH0KCiAgICAkcmVzdWx0W10gPSBhcnJheSgnbW9kdWxlcycgPT4gYXJyYXkoJ2JjbWF0aCcsICdwaHBfYmNtYXRoJyksCiAgICAgICAgICAgICAgICAgICAgICAnZXh0ZW5zaW9uJyA9PiAnYmNtYXRoJywKICAgICAgICAgICAgICAgICAgICAgICdjbGFzcycgPT4gJ0F1dGhfT3BlbklEX0JjTWF0aFdyYXBwZXInKTsKCiAgICByZXR1cm4gJHJlc3VsdDsKfQoKLyoqCiAqIERldGVjdCB3aGljaCAoaWYgYW55KSBtYXRoIGxpYnJhcnkgaXMgYXZhaWxhYmxlCiAqLwpmdW5jdGlvbiBBdXRoX09wZW5JRF9kZXRlY3RNYXRoTGlicmFyeSgkZXh0cykKewogICAgJGxvYWRlZCA9IGZhbHNlOwoKCSRoYXNEbCA9IGZ1bmN0aW9uX2V4aXN0cygnZGwnKTsKICAgIGZvcmVhY2ggKCRleHRzIGFzICRleHRlbnNpb24pIHsKICAgICAgICBpZiAoZXh0ZW5zaW9uX2xvYWRlZCgkZXh0ZW5zaW9uWydleHRlbnNpb24nXSkpIHsKICAgICAgICAgICAgcmV0dXJuICRleHRlbnNpb247CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiBmYWxzZTsKfQoKLyoqCiAqIHtAbGluayBBdXRoX09wZW5JRF9nZXRNYXRoTGlifSBjaGVja3MgZm9yIHRoZSBwcmVzZW5jZSBvZiBsb25nCiAqIG51bWJlciBleHRlbnNpb24gbW9kdWxlcyBhbmQgcmV0dXJucyBhbiBpbnN0YW5jZSBvZgogKiB7QGxpbmsgQXV0aF9PcGVuSURfTWF0aFdyYXBwZXJ9IHdoaWNoIGV4cG9zZXMgdGhlIG1vZHVsZSdzCiAqIGZ1bmN0aW9uYWxpdHkuCiAqCiAqIENoZWNrcyBmb3IgdGhlIGV4aXN0ZW5jZSBvZiBhbiBleHRlbnNpb24gbW9kdWxlIGRlc2NyaWJlZCBieSB0aGUKICogcmVzdWx0IG9mIHtAbGluayBBdXRoX09wZW5JRF9tYXRoX2V4dGVuc2lvbnMoKX0gYW5kIHJldHVybnMgYW4KICogaW5zdGFuY2Ugb2YgYSB3cmFwcGVyIGZvciB0aGF0IGV4dGVuc2lvbiBtb2R1bGUuICBJZiBubyBleHRlbnNpb24KICogbW9kdWxlIGlzIGZvdW5kLCBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgQXV0aF9PcGVuSURfTWF0aFdyYXBwZXJ9IGlzCiAqIHJldHVybmVkLCB3aGljaCB3cmFwcyB0aGUgbmF0aXZlIFBIUCBpbnRlZ2VyIGltcGxlbWVudGF0aW9uLiAgVGhlCiAqIHByb3BlciBjYWxsaW5nIGNvbnZlbnRpb24gZm9yIHRoaXMgbWV0aG9kIGlzICRsaWIgPQogKiBBdXRoX09wZW5JRF9nZXRNYXRoTGliKCkuCiAqCiAqIFRoaXMgZnVuY3Rpb24gY2hlY2tzIGZvciB0aGUgZXhpc3RlbmNlIG9mIHNwZWNpZmljIGxvbmcgbnVtYmVyCiAqIGltcGxlbWVudGF0aW9ucyBpbiB0aGUgZm9sbG93aW5nIG9yZGVyOiBHTVAgZm9sbG93ZWQgYnkgQkNtYXRoLgogKgogKiBAcmV0dXJuIEF1dGhfT3BlbklEX01hdGhXcmFwcGVyICRpbnN0YW5jZSBBbiBpbnN0YW5jZSBvZgogKiB7QGxpbmsgQXV0aF9PcGVuSURfTWF0aFdyYXBwZXJ9IG9yIG9uZSBvZiBpdHMgc3ViY2xhc3NlcwogKgogKiBAcGFja2FnZSBPcGVuSUQKICovCmZ1bmN0aW9uIEF1dGhfT3BlbklEX2dldE1hdGhMaWIoKQp7CiAgICAvLyBUaGUgaW5zdGFuY2Ugb2YgQXV0aF9PcGVuSURfTWF0aFdyYXBwZXIgdGhhdCB3ZSBjaG9vc2UgdG8KICAgIC8vIHN1cHBseSB3aWxsIGJlIHN0b3JlZCBoZXJlLCBzbyB0aGF0IHN1YnNlcWVudCBjYWxscyB0byB0aGlzCiAgICAvLyBtZXRob2Qgd2lsbCByZXR1cm4gYSByZWZlcmVuY2UgdG8gdGhlIHNhbWUgb2JqZWN0LgogICAgc3RhdGljICRsaWIgPSBudWxsOwoKICAgIGlmIChpc3NldCgkbGliKSkgewogICAgICAgIHJldHVybiAkbGliOwogICAgfQoKICAgIGlmIChBdXRoX09wZW5JRF9ub01hdGhTdXBwb3J0KCkpIHsKICAgICAgICAkbnVsbCA9IG51bGw7CiAgICAgICAgcmV0dXJuICRudWxsOwogICAgfQoKICAgIC8vIElmIHRoaXMgbWV0aG9kIGhhcyBub3QgYmVlbiBjYWxsZWQgYmVmb3JlLCBsb29rIGF0CiAgICAvLyBBdXRoX09wZW5JRF9tYXRoX2V4dGVuc2lvbnMgYW5kIHRyeSB0byBmaW5kIGFuIGV4dGVuc2lvbiB0aGF0CiAgICAvLyB3b3Jrcy4KICAgICRleHQgPSBBdXRoX09wZW5JRF9kZXRlY3RNYXRoTGlicmFyeShBdXRoX09wZW5JRF9tYXRoX2V4dGVuc2lvbnMoKSk7CiAgICBpZiAoJGV4dCA9PT0gZmFsc2UpIHsKICAgICAgICAkdHJpZWQgPSBhcnJheSgpOwogICAgICAgIGZvcmVhY2ggKEF1dGhfT3BlbklEX21hdGhfZXh0ZW5zaW9ucygpIGFzICRleHRpbmZvKSB7CiAgICAgICAgICAgICR0cmllZFtdID0gJGV4dGluZm9bJ2V4dGVuc2lvbiddOwogICAgICAgIH0KICAgICAgICAkdHJpZWRzdHIgPSBpbXBsb2RlKCIsICIsICR0cmllZCk7CgogICAgICAgIEF1dGhfT3BlbklEX3NldE5vTWF0aFN1cHBvcnQoKTsKCiAgICAgICAgJHJlc3VsdCA9IG51bGw7CiAgICAgICAgcmV0dXJuICRyZXN1bHQ7CiAgICB9CgogICAgLy8gSW5zdGFudGlhdGUgYSBuZXcgd3JhcHBlcgogICAgJGNsYXNzID0gJGV4dFsnY2xhc3MnXTsKICAgICRsaWIgPSBuZXcgJGNsYXNzKCk7CgogICAgcmV0dXJuICRsaWI7Cn0KCmZ1bmN0aW9uIEF1dGhfT3BlbklEX3NldE5vTWF0aFN1cHBvcnQoKQp7CiAgICBpZiAoIWRlZmluZWQoJ0F1dGhfT3BlbklEX05PX01BVEhfU1VQUE9SVCcpKSB7CiAgICAgICAgZGVmaW5lKCdBdXRoX09wZW5JRF9OT19NQVRIX1NVUFBPUlQnLCB0cnVlKTsKICAgIH0KfQoKZnVuY3Rpb24gQXV0aF9PcGVuSURfbm9NYXRoU3VwcG9ydCgpCnsKICAgIHJldHVybiBkZWZpbmVkKCdBdXRoX09wZW5JRF9OT19NQVRIX1NVUFBPUlQnKTsKfQoKCg==]]></data>
	</file>
	<file>
	  <filename>/openid-php-openid-782224d/Auth/OpenID/Consumer.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBUaGlzIG1vZHVsZSBkb2N1bWVudHMgdGhlIG1haW4gaW50ZXJmYWNlIHdpdGggdGhlIE9wZW5JRCBjb25zdW1lcgogKiBsaWJyYXJ5LiAgVGhlIG9ubHkgcGFydCBvZiB0aGUgbGlicmFyeSB3aGljaCBoYXMgdG8gYmUgdXNlZCBhbmQKICogaXNuJ3QgZG9jdW1lbnRlZCBpbiBmdWxsIGhlcmUgaXMgdGhlIHN0b3JlIHJlcXVpcmVkIHRvIGNyZWF0ZSBhbgogKiBBdXRoX09wZW5JRF9Db25zdW1lciBpbnN0YW5jZS4gIE1vcmUgb24gdGhlIGFic3RyYWN0IHN0b3JlIHR5cGUgYW5kCiAqIGNvbmNyZXRlIGltcGxlbWVudGF0aW9ucyBvZiBpdCB0aGF0IGFyZSBwcm92aWRlZCBpbiB0aGUKICogZG9jdW1lbnRhdGlvbiBmb3IgdGhlIEF1dGhfT3BlbklEX0NvbnN1bWVyIGNvbnN0cnVjdG9yLgogKgogKiBPVkVSVklFVwogKgogKiBUaGUgT3BlbklEIGlkZW50aXR5IHZlcmlmaWNhdGlvbiBwcm9jZXNzIG1vc3QgY29tbW9ubHkgdXNlcyB0aGUKICogZm9sbG93aW5nIHN0ZXBzLCBhcyB2aXNpYmxlIHRvIHRoZSB1c2VyIG9mIHRoaXMgbGlicmFyeToKICoKICogICAxLiBUaGUgdXNlciBlbnRlcnMgdGhlaXIgT3BlbklEIGludG8gYSBmaWVsZCBvbiB0aGUgY29uc3VtZXIncwogKiAgICAgIHNpdGUsIGFuZCBoaXRzIGEgbG9naW4gYnV0dG9uLgogKiAgIDIuIFRoZSBjb25zdW1lciBzaXRlIGRpc2NvdmVycyB0aGUgdXNlcidzIE9wZW5JRCBzZXJ2ZXIgdXNpbmcgdGhlCiAqICAgICAgWUFESVMgcHJvdG9jb2wuCiAqICAgMy4gVGhlIGNvbnN1bWVyIHNpdGUgc2VuZHMgdGhlIGJyb3dzZXIgYSByZWRpcmVjdCB0byB0aGUgaWRlbnRpdHkKICogICAgICBzZXJ2ZXIuICBUaGlzIGlzIHRoZSBhdXRoZW50aWNhdGlvbiByZXF1ZXN0IGFzIGRlc2NyaWJlZCBpbgogKiAgICAgIHRoZSBPcGVuSUQgc3BlY2lmaWNhdGlvbi4KICogICA0LiBUaGUgaWRlbnRpdHkgc2VydmVyJ3Mgc2l0ZSBzZW5kcyB0aGUgYnJvd3NlciBhIHJlZGlyZWN0IGJhY2sKICogICAgICB0byB0aGUgY29uc3VtZXIgc2l0ZS4gIFRoaXMgcmVkaXJlY3QgY29udGFpbnMgdGhlIHNlcnZlcidzCiAqICAgICAgcmVzcG9uc2UgdG8gdGhlIGF1dGhlbnRpY2F0aW9uIHJlcXVlc3QuCiAqCiAqIFRoZSBtb3N0IGltcG9ydGFudCBwYXJ0IG9mIHRoZSBmbG93IHRvIG5vdGUgaXMgdGhlIGNvbnN1bWVyJ3Mgc2l0ZQogKiBtdXN0IGhhbmRsZSB0d28gc2VwYXJhdGUgSFRUUCByZXF1ZXN0cyBpbiBvcmRlciB0byBwZXJmb3JtIHRoZSBmdWxsCiAqIGlkZW50aXR5IGNoZWNrLgogKgogKiBMSUJSQVJZIERFU0lHTgogKiAKICogVGhpcyBjb25zdW1lciBsaWJyYXJ5IGlzIGRlc2lnbmVkIHdpdGggdGhhdCBmbG93IGluIG1pbmQuICBUaGUgZ29hbAogKiBpcyB0byBtYWtlIGl0IGFzIGVhc3kgYXMgcG9zc2libGUgdG8gcGVyZm9ybSB0aGUgYWJvdmUgc3RlcHMKICogc2VjdXJlbHkuCiAqCiAqIEF0IGEgaGlnaCBsZXZlbCwgdGhlcmUgYXJlIHR3byBpbXBvcnRhbnQgcGFydHMgaW4gdGhlIGNvbnN1bWVyCiAqIGxpYnJhcnkuICBUaGUgZmlyc3QgaW1wb3J0YW50IHBhcnQgaXMgdGhpcyBtb2R1bGUsIHdoaWNoIGNvbnRhaW5zCiAqIHRoZSBpbnRlcmZhY2UgdG8gYWN0dWFsbHkgdXNlIHRoaXMgbGlicmFyeS4gIFRoZSBzZWNvbmQgaXMgdGhlCiAqIEF1dGhfT3BlbklEX0ludGVyZmFjZSBjbGFzcywgd2hpY2ggZGVzY3JpYmVzIHRoZSBpbnRlcmZhY2UgdG8gdXNlCiAqIGlmIHlvdSBuZWVkIHRvIGNyZWF0ZSBhIGN1c3RvbSBtZXRob2QgZm9yIHN0b3JpbmcgdGhlIHN0YXRlIHRoaXMKICogbGlicmFyeSBuZWVkcyB0byBtYWludGFpbiBiZXR3ZWVuIHJlcXVlc3RzLgogKgogKiBJbiBnZW5lcmFsLCB0aGUgc2Vjb25kIHBhcnQgaXMgbGVzcyBpbXBvcnRhbnQgZm9yIHVzZXJzIG9mIHRoZQogKiBsaWJyYXJ5IHRvIGtub3cgYWJvdXQsIGFzIHNldmVyYWwgaW1wbGVtZW50YXRpb25zIGFyZSBwcm92aWRlZAogKiB3aGljaCBjb3ZlciBhIHdpZGUgdmFyaWV0eSBvZiBzaXR1YXRpb25zIGluIHdoaWNoIGNvbnN1bWVycyBtYXkgdXNlCiAqIHRoZSBsaWJyYXJ5LgogKgogKiBUaGlzIG1vZHVsZSBjb250YWlucyBhIGNsYXNzLCBBdXRoX09wZW5JRF9Db25zdW1lciwgd2l0aCBtZXRob2RzCiAqIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGFjdGlvbnMgbmVjZXNzYXJ5IGluIGVhY2ggb2Ygc3RlcHMgMiwgMywgYW5kIDQKICogZGVzY3JpYmVkIGluIHRoZSBvdmVydmlldy4gIFVzZSBvZiB0aGlzIGxpYnJhcnkgc2hvdWxkIGJlIGFzIGVhc3kKICogYXMgY3JlYXRpbmcgYW4gQXV0aF9PcGVuSURfQ29uc3VtZXIgaW5zdGFuY2UgYW5kIGNhbGxpbmcgdGhlCiAqIG1ldGhvZHMgYXBwcm9wcmlhdGUgZm9yIHRoZSBhY3Rpb24gdGhlIHNpdGUgd2FudHMgdG8gdGFrZS4KICoKICogU1RPUkVTIEFORCBEVU1CIE1PREUKICoKICogT3BlbklEIGlzIGEgcHJvdG9jb2wgdGhhdCB3b3JrcyBiZXN0IHdoZW4gdGhlIGNvbnN1bWVyIHNpdGUgaXMgYWJsZQogKiB0byBzdG9yZSBzb21lIHN0YXRlLiAgVGhpcyBpcyB0aGUgbm9ybWFsIG1vZGUgb2Ygb3BlcmF0aW9uIGZvciB0aGUKICogcHJvdG9jb2wsIGFuZCBpcyBzb21ldGltZXMgcmVmZXJyZWQgdG8gYXMgc21hcnQgbW9kZS4gIFRoZXJlIGlzCiAqIGFsc28gYSBmYWxsYmFjayBtb2RlLCBrbm93biBhcyBkdW1iIG1vZGUsIHdoaWNoIGlzIGF2YWlsYWJsZSB3aGVuCiAqIHRoZSBjb25zdW1lciBzaXRlIGlzIG5vdCBhYmxlIHRvIHN0b3JlIHN0YXRlLiAgVGhpcyBtb2RlIHNob3VsZCBiZQogKiBhdm9pZGVkIHdoZW4gcG9zc2libGUsIGFzIGl0IGxlYXZlcyB0aGUgaW1wbGVtZW50YXRpb24gbW9yZQogKiB2dWxuZXJhYmxlIHRvIHJlcGxheSBhdHRhY2tzLgogKgogKiBUaGUgbW9kZSB0aGUgbGlicmFyeSB3b3JrcyBpbiBmb3Igbm9ybWFsIG9wZXJhdGlvbiBpcyBkZXRlcm1pbmVkIGJ5CiAqIHRoZSBzdG9yZSB0aGF0IGl0IGlzIGdpdmVuLiAgVGhlIHN0b3JlIGlzIGFuIGFic3RyYWN0aW9uIHRoYXQKICogaGFuZGxlcyB0aGUgZGF0YSB0aGF0IHRoZSBjb25zdW1lciBuZWVkcyB0byBtYW5hZ2UgYmV0d2VlbiBodHRwCiAqIHJlcXVlc3RzIGluIG9yZGVyIHRvIG9wZXJhdGUgZWZmaWNpZW50bHkgYW5kIHNlY3VyZWx5LgogKgogKiBTZXZlcmFsIHN0b3JlIGltcGxlbWVudGF0aW9uIGFyZSBwcm92aWRlZCwgYW5kIHRoZSBpbnRlcmZhY2UgaXMKICogZnVsbHkgZG9jdW1lbnRlZCBzbyB0aGF0IGN1c3RvbSBzdG9yZXMgY2FuIGJlIHVzZWQgYXMgd2VsbC4gIFNlZQogKiB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIEF1dGhfT3BlbklEX0NvbnN1bWVyIGNsYXNzIGZvciBtb3JlCiAqIGluZm9ybWF0aW9uIG9uIHRoZSBpbnRlcmZhY2UgZm9yIHN0b3Jlcy4gIFRoZSBpbXBsZW1lbnRhdGlvbnMgdGhhdAogKiBhcmUgcHJvdmlkZWQgYWxsb3cgdGhlIGNvbnN1bWVyIHNpdGUgdG8gc3RvcmUgdGhlIG5lY2Vzc2FyeSBkYXRhIGluCiAqIHNldmVyYWwgZGlmZmVyZW50IHdheXMsIGluY2x1ZGluZyBzZXZlcmFsIFNRTCBkYXRhYmFzZXMgYW5kIG5vcm1hbAogKiBmaWxlcyBvbiBkaXNrLgogKgogKiBUaGVyZSBpcyBhbiBhZGRpdGlvbmFsIGNvbmNyZXRlIHN0b3JlIHByb3ZpZGVkIHRoYXQgcHV0cyB0aGUgc3lzdGVtCiAqIGluIGR1bWIgbW9kZS4gIFRoaXMgaXMgbm90IHJlY29tbWVuZGVkLCBhcyBpdCByZW1vdmVzIHRoZSBsaWJyYXJ5J3MKICogYWJpbGl0eSB0byBzdG9wIHJlcGxheSBhdHRhY2tzIHJlbGlhYmx5LiAgSXQgc3RpbGwgdXNlcyB0aW1lLWJhc2VkCiAqIGNoZWNraW5nIHRvIG1ha2UgcmVwbGF5IGF0dGFja3Mgb25seSBwb3NzaWJsZSB3aXRoaW4gYSBzbWFsbAogKiB3aW5kb3csIGJ1dCB0aGV5IHJlbWFpbiBwb3NzaWJsZSB3aXRoaW4gdGhhdCB3aW5kb3cuICBUaGlzIHN0b3JlCiAqIHNob3VsZCBvbmx5IGJlIHVzZWQgaWYgdGhlIGNvbnN1bWVyIHNpdGUgaGFzIG5vIHdheSB0byByZXRhaW4gZGF0YQogKiBiZXR3ZWVuIHJlcXVlc3RzIGF0IGFsbC4KICoKICogSU1NRURJQVRFIE1PREUKICoKICogSW4gdGhlIGZsb3cgZGVzY3JpYmVkIGFib3ZlLCB0aGUgdXNlciBtYXkgbmVlZCB0byBjb25maXJtIHRvIHRoZQogKiBsaWRlbnRpdHkgc2VydmVyIHRoYXQgaXQncyBvayB0byBhdXRob3JpemUgaGlzIG9yIGhlciBpZGVudGl0eS4KICogVGhlIHNlcnZlciBtYXkgZHJhdyBwYWdlcyBhc2tpbmcgZm9yIGluZm9ybWF0aW9uIGZyb20gdGhlIHVzZXIKICogYmVmb3JlIGl0IHJlZGlyZWN0cyB0aGUgYnJvd3NlciBiYWNrIHRvIHRoZSBjb25zdW1lcidzIHNpdGUuICBUaGlzCiAqIGlzIGdlbmVyYWxseSB0cmFuc3BhcmVudCB0byB0aGUgY29uc3VtZXIgc2l0ZSwgc28gaXQgaXMgdHlwaWNhbGx5CiAqIGlnbm9yZWQgYXMgYW4gaW1wbGVtZW50YXRpb24gZGV0YWlsLgogKgogKiBUaGVyZSBjYW4gYmUgdGltZXMsIGhvd2V2ZXIsIHdoZXJlIHRoZSBjb25zdW1lciBzaXRlIHdhbnRzIHRvIGdldCBhCiAqIHJlc3BvbnNlIGltbWVkaWF0ZWx5LiAgV2hlbiB0aGlzIGlzIHRoZSBjYXNlLCB0aGUgY29uc3VtZXIgY2FuIHB1dAogKiB0aGUgbGlicmFyeSBpbiBpbW1lZGlhdGUgbW9kZS4gIEluIGltbWVkaWF0ZSBtb2RlLCB0aGVyZSBpcyBhbgogKiBleHRyYSByZXNwb25zZSBwb3NzaWJsZSBmcm9tIHRoZSBzZXJ2ZXIsIHdoaWNoIGlzIGVzc2VudGlhbGx5IHRoZQogKiBzZXJ2ZXIgcmVwb3J0aW5nIHRoYXQgaXQgZG9lc24ndCBoYXZlIGVub3VnaCBpbmZvcm1hdGlvbiB0byBhbnN3ZXIKICogdGhlIHF1ZXN0aW9uIHlldC4KICoKICogVVNJTkcgVEhJUyBMSUJSQVJZCiAqCiAqIEludGVncmF0aW5nIHRoaXMgbGlicmFyeSBpbnRvIGFuIGFwcGxpY2F0aW9uIGlzIHVzdWFsbHkgYQogKiByZWxhdGl2ZWx5IHN0cmFpZ2h0Zm9yd2FyZCBwcm9jZXNzLiAgVGhlIHByb2Nlc3Mgc2hvdWxkIGJhc2ljYWxseQogKiBmb2xsb3cgdGhpcyBwbGFuOgogKgogKiBBZGQgYW4gT3BlbklEIGxvZ2luIGZpZWxkIHNvbWV3aGVyZSBvbiB5b3VyIHNpdGUuICBXaGVuIGFuIE9wZW5JRAogKiBpcyBlbnRlcmVkIGluIHRoYXQgZmllbGQgYW5kIHRoZSBmb3JtIGlzIHN1Ym1pdHRlZCwgaXQgc2hvdWxkIG1ha2UKICogYSByZXF1ZXN0IHRvIHRoZSB5b3VyIHNpdGUgd2hpY2ggaW5jbHVkZXMgdGhhdCBPcGVuSUQgVVJMLgogKgogKiBGaXJzdCwgdGhlIGFwcGxpY2F0aW9uIHNob3VsZCBpbnN0YW50aWF0ZSB0aGUgQXV0aF9PcGVuSURfQ29uc3VtZXIKICogY2xhc3MgdXNpbmcgdGhlIHN0b3JlIG9mIGNob2ljZSAoQXV0aF9PcGVuSURfRmlsZVN0b3JlIG9yIG9uZSBvZgogKiB0aGUgU1FMLWJhc2VkIHN0b3JlcykuICBJZiB0aGUgYXBwbGljYXRpb24gaGFzIGEgY3VzdG9tCiAqIHNlc3Npb24tbWFuYWdlbWVudCBpbXBsZW1lbnRhdGlvbiwgYW4gb2JqZWN0IGltcGxlbWVudGluZyB0aGUKICoge0BsaW5rIEF1dGhfWWFkaXNfUEhQU2Vzc2lvbn0gaW50ZXJmYWNlIHNob3VsZCBiZSBwYXNzZWQgYXMgdGhlCiAqIHNlY29uZCBwYXJhbWV0ZXIuICBPdGhlcndpc2UsIHRoZSBkZWZhdWx0IHVzZXMgJF9TRVNTSU9OLgogKgogKiBOZXh0LCB0aGUgYXBwbGljYXRpb24gc2hvdWxkIGNhbGwgdGhlIEF1dGhfT3BlbklEX0NvbnN1bWVyIG9iamVjdCdzCiAqICdiZWdpbicgbWV0aG9kLiAgVGhpcyBtZXRob2QgdGFrZXMgdGhlIE9wZW5JRCBVUkwuICBUaGUgJ2JlZ2luJwogKiBtZXRob2QgcmV0dXJucyBhbiBBdXRoX09wZW5JRF9BdXRoUmVxdWVzdCBvYmplY3QuCiAqCiAqIE5leHQsIHRoZSBhcHBsaWNhdGlvbiBzaG91bGQgY2FsbCB0aGUgJ3JlZGlyZWN0VVJMJyBtZXRob2Qgb2YgdGhlCiAqIEF1dGhfT3BlbklEX0F1dGhSZXF1ZXN0IG9iamVjdC4gIFRoZSAncmV0dXJuX3RvJyBVUkwgcGFyYW1ldGVyIGlzCiAqIHRoZSBVUkwgdGhhdCB0aGUgT3BlbklEIHNlcnZlciB3aWxsIHNlbmQgdGhlIHVzZXIgYmFjayB0byBhZnRlcgogKiBhdHRlbXB0aW5nIHRvIHZlcmlmeSBoaXMgb3IgaGVyIGlkZW50aXR5LiAgVGhlICd0cnVzdF9yb290JyBpcyB0aGUKICogVVJMIChvciBVUkwgcGF0dGVybikgdGhhdCBpZGVudGlmaWVzIHlvdXIgd2ViIHNpdGUgdG8gdGhlIHVzZXIgd2hlbgogKiBoZSBvciBzaGUgaXMgYXV0aG9yaXppbmcgaXQuICBTZW5kIGEgcmVkaXJlY3QgdG8gdGhlIHJlc3VsdGluZyBVUkwKICogdG8gdGhlIHVzZXIncyBicm93c2VyLgogKgogKiBUaGF0J3MgdGhlIGZpcnN0IGhhbGYgb2YgdGhlIGF1dGhlbnRpY2F0aW9uIHByb2Nlc3MuICBUaGUgc2Vjb25kCiAqIGhhbGYgb2YgdGhlIHByb2Nlc3MgaXMgZG9uZSBhZnRlciB0aGUgdXNlcidzIElEIHNlcnZlciBzZW5kcyB0aGUKICogdXNlcidzIGJyb3dzZXIgYSByZWRpcmVjdCBiYWNrIHRvIHlvdXIgc2l0ZSB0byBjb21wbGV0ZSB0aGVpcgogKiBsb2dpbi4KICoKICogV2hlbiB0aGF0IGhhcHBlbnMsIHRoZSB1c2VyIHdpbGwgY29udGFjdCB5b3VyIHNpdGUgYXQgdGhlIFVSTCBnaXZlbgogKiBhcyB0aGUgJ3JldHVybl90bycgVVJMIHRvIHRoZSBBdXRoX09wZW5JRF9BdXRoUmVxdWVzdDo6cmVkaXJlY3RVUkwKICogY2FsbCBtYWRlIGFib3ZlLiAgVGhlIHJlcXVlc3Qgd2lsbCBoYXZlIHNldmVyYWwgcXVlcnkgcGFyYW1ldGVycwogKiBhZGRlZCB0byB0aGUgVVJMIGJ5IHRoZSBpZGVudGl0eSBzZXJ2ZXIgYXMgdGhlIGluZm9ybWF0aW9uCiAqIG5lY2Vzc2FyeSB0byBmaW5pc2ggdGhlIHJlcXVlc3QuCiAqCiAqIExhc3RseSwgaW5zdGFudGlhdGUgYW4gQXV0aF9PcGVuSURfQ29uc3VtZXIgaW5zdGFuY2UgYXMgYWJvdmUgYW5kCiAqIGNhbGwgaXRzICdjb21wbGV0ZScgbWV0aG9kLCBwYXNzaW5nIGluIGFsbCB0aGUgcmVjZWl2ZWQgcXVlcnkKICogYXJndW1lbnRzLgogKgogKiBUaGVyZSBhcmUgbXVsdGlwbGUgcG9zc2libGUgcmV0dXJuIHR5cGVzIHBvc3NpYmxlIGZyb20gdGhhdAogKiBtZXRob2QuIFRoZXNlIGluZGljYXRlIHRoZSB3aGV0aGVyIG9yIG5vdCB0aGUgbG9naW4gd2FzIHN1Y2Nlc3NmdWwsCiAqIGFuZCBpbmNsdWRlIGFueSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFwcHJvcHJpYXRlIGZvciB0aGVpciB0eXBlLgogKgogKiBQSFAgdmVyc2lvbnMgNCBhbmQgNQogKgogKiBMSUNFTlNFOiBTZWUgdGhlIENPUFlJTkcgZmlsZSBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbi4KICoKICogQHBhY2thZ2UgT3BlbklECiAqIEBhdXRob3IgSmFuUmFpbiwgSW5jLiA8b3BlbmlkQGphbnJhaW4uY29tPgogKiBAY29weXJpZ2h0IDIwMDUtMjAwOCBKYW5yYWluLCBJbmMuCiAqIEBsaWNlbnNlIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCBBcGFjaGUKICovCgovKioKICogUmVxdWlyZSB1dGlsaXR5IGNsYXNzZXMgYW5kIGZ1bmN0aW9ucyBmb3IgdGhlIGNvbnN1bWVyLgogKi8KcmVxdWlyZV9vbmNlICJBdXRoL09wZW5JRC5waHAiOwpyZXF1aXJlX29uY2UgIkF1dGgvT3BlbklEL01lc3NhZ2UucGhwIjsKcmVxdWlyZV9vbmNlICJBdXRoL09wZW5JRC9ITUFDLnBocCI7CnJlcXVpcmVfb25jZSAiQXV0aC9PcGVuSUQvQXNzb2NpYXRpb24ucGhwIjsKcmVxdWlyZV9vbmNlICJBdXRoL09wZW5JRC9DcnlwdFV0aWwucGhwIjsKcmVxdWlyZV9vbmNlICJBdXRoL09wZW5JRC9EaWZmaWVIZWxsbWFuLnBocCI7CnJlcXVpcmVfb25jZSAiQXV0aC9PcGVuSUQvS1ZGb3JtLnBocCI7CnJlcXVpcmVfb25jZSAiQXV0aC9PcGVuSUQvTm9uY2UucGhwIjsKcmVxdWlyZV9vbmNlICJBdXRoL09wZW5JRC9EaXNjb3Zlci5waHAiOwpyZXF1aXJlX29uY2UgIkF1dGgvT3BlbklEL1VSSU5vcm0ucGhwIjsKcmVxdWlyZV9vbmNlICJBdXRoL1lhZGlzL01hbmFnZXIucGhwIjsKcmVxdWlyZV9vbmNlICJBdXRoL1lhZGlzL1hSSS5waHAiOwoKLyoqCiAqIFRoaXMgaXMgdGhlIHN0YXR1cyBjb2RlIHJldHVybmVkIHdoZW4gdGhlIGNvbXBsZXRlIG1ldGhvZCByZXR1cm5zCiAqIHN1Y2Nlc3NmdWxseS4KICovCmRlZmluZSgnQXV0aF9PcGVuSURfU1VDQ0VTUycsICdzdWNjZXNzJyk7CgovKioKICogU3RhdHVzIHRvIGluZGljYXRlIGNhbmNlbGxhdGlvbiBvZiBPcGVuSUQgYXV0aGVudGljYXRpb24uCiAqLwpkZWZpbmUoJ0F1dGhfT3BlbklEX0NBTkNFTCcsICdjYW5jZWwnKTsKCi8qKgogKiBUaGlzIGlzIHRoZSBzdGF0dXMgY29kZSBjb21wbGV0ZUF1dGggcmV0dXJucyB3aGVuIHRoZSB2YWx1ZSBpdAogKiByZWNlaXZlZCBpbmRpY2F0ZWQgYW4gaW52YWxpZCBsb2dpbi4KICovCmRlZmluZSgnQXV0aF9PcGVuSURfRkFJTFVSRScsICdmYWlsdXJlJyk7CgovKioKICogVGhpcyBpcyB0aGUgc3RhdHVzIGNvZGUgY29tcGxldGVBdXRoIHJldHVybnMgd2hlbiB0aGUKICoge0BsaW5rIEF1dGhfT3BlbklEX0NvbnN1bWVyfSBpbnN0YW5jZSBpcyBpbiBpbW1lZGlhdGUgbW9kZSwgYW5kIHRoZQogKiBpZGVudGl0eSBzZXJ2ZXIgc2VuZHMgYmFjayBhIFVSTCB0byBzZW5kIHRoZSB1c2VyIHRvIHRvIGNvbXBsZXRlIGhpcwogKiBvciBoZXIgbG9naW4uCiAqLwpkZWZpbmUoJ0F1dGhfT3BlbklEX1NFVFVQX05FRURFRCcsICdzZXR1cCBuZWVkZWQnKTsKCi8qKgogKiBUaGlzIGlzIHRoZSBzdGF0dXMgY29kZSBiZWdpbkF1dGggcmV0dXJucyB3aGVuIHRoZSBwYWdlIGZldGNoZWQKICogZnJvbSB0aGUgZW50ZXJlZCBPcGVuSUQgVVJMIGRvZXNuJ3QgY29udGFpbiB0aGUgbmVjZXNzYXJ5IGxpbmsgdGFncwogKiB0byBmdW5jdGlvbiBhcyBhbiBpZGVudGl0eSBwYWdlLgogKi8KZGVmaW5lKCdBdXRoX09wZW5JRF9QQVJTRV9FUlJPUicsICdwYXJzZSBlcnJvcicpOwoKLyoqCiAqIEFuIE9wZW5JRCBjb25zdW1lciBpbXBsZW1lbnRhdGlvbiB0aGF0IHBlcmZvcm1zIGRpc2NvdmVyeSBhbmQgZG9lcwogKiBzZXNzaW9uIG1hbmFnZW1lbnQuICBTZWUgdGhlIENvbnN1bWVyLnBocCBmaWxlIGRvY3VtZW50YXRpb24gZm9yCiAqIG1vcmUgaW5mb3JtYXRpb24uCiAqCiAqIEBwYWNrYWdlIE9wZW5JRAogKi8KY2xhc3MgQXV0aF9PcGVuSURfQ29uc3VtZXIgewoKICAgIC8qKgogICAgICogQGFjY2VzcyBwcml2YXRlCiAgICAgKi8KICAgIHZhciAkZGlzY292ZXJNZXRob2QgPSAnQXV0aF9PcGVuSURfZGlzY292ZXInOwoKICAgIC8qKgogICAgICogQGFjY2VzcyBwcml2YXRlCiAgICAgKi8KICAgIHZhciAkc2Vzc2lvbl9rZXlfcHJlZml4ID0gIl9vcGVuaWRfY29uc3VtZXJfIjsKCiAgICAvKioKICAgICAqIEBhY2Nlc3MgcHJpdmF0ZQogICAgICovCiAgICB2YXIgJF90b2tlbl9zdWZmaXggPSAibGFzdF90b2tlbiI7CgogICAgLyoqCiAgICAgKiBJbml0aWFsaXplIGEgQ29uc3VtZXIgaW5zdGFuY2UuCiAgICAgKgogICAgICogWW91IHNob3VsZCBjcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIENvbnN1bWVyIG9iamVjdCB3aXRoCiAgICAgKiBldmVyeSBIVFRQIHJlcXVlc3QgdGhhdCBoYW5kbGVzIE9wZW5JRCB0cmFuc2FjdGlvbnMuCiAgICAgKgogICAgICogQHBhcmFtIEF1dGhfT3BlbklEX09wZW5JRFN0b3JlICRzdG9yZSBUaGlzIG11c3QgYmUgYW4gb2JqZWN0CiAgICAgKiB0aGF0IGltcGxlbWVudHMgdGhlIGludGVyZmFjZSBpbiB7QGxpbmsKICAgICAqIEF1dGhfT3BlbklEX09wZW5JRFN0b3JlfS4gIFNldmVyYWwgY29uY3JldGUgaW1wbGVtZW50YXRpb25zIGFyZQogICAgICogcHJvdmlkZWQsIHRvIGNvdmVyIG1vc3QgY29tbW9uIHVzZSBjYXNlcy4gIEZvciBzdG9yZXMgYmFja2VkIGJ5CiAgICAgKiBNeVNRTCwgUG9zdGdyZVNRTCwgb3IgU1FMaXRlLCBzZWUgdGhlIHtAbGluawogICAgICogQXV0aF9PcGVuSURfU1FMU3RvcmV9IGNsYXNzIGFuZCBpdHMgc3VibGNhc3Nlcy4gIEZvciBhCiAgICAgKiBmaWxlc3lzdGVtLWJhY2tlZCBzdG9yZSwgc2VlIHRoZSB7QGxpbmsgQXV0aF9PcGVuSURfRmlsZVN0b3JlfQogICAgICogbW9kdWxlLiAgQXMgYSBsYXN0IHJlc29ydCwgaWYgaXQgaXNuJ3QgcG9zc2libGUgZm9yIHRoZSBzZXJ2ZXIKICAgICAqIHRvIHN0b3JlIHN0YXRlIGF0IGFsbCwgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rCiAgICAgKiBBdXRoX09wZW5JRF9EdW1iU3RvcmV9IGNhbiBiZSB1c2VkLgogICAgICoKICAgICAqIEBwYXJhbSBtaXhlZCAkc2Vzc2lvbiBBbiBvYmplY3Qgd2hpY2ggaW1wbGVtZW50cyB0aGUgaW50ZXJmYWNlCiAgICAgKiBvZiB0aGUge0BsaW5rIEF1dGhfWWFkaXNfUEhQU2Vzc2lvbn0gY2xhc3MuICBQYXJ0aWN1bGFybHksIHRoaXMKICAgICAqIG9iamVjdCBpcyBleHBlY3RlZCB0byBoYXZlIHRoZXNlIG1ldGhvZHM6IGdldCgka2V5KSwgc2V0KCRrZXkpLAogICAgICogJHZhbHVlKSwgYW5kIGRlbCgka2V5KS4gIFRoaXMgZGVmYXVsdHMgdG8gYSBzZXNzaW9uIG9iamVjdAogICAgICogd2hpY2ggd3JhcHMgUEhQJ3MgbmF0aXZlIHNlc3Npb24gbWFjaGluZXJ5LiAgWW91IHNob3VsZCBvbmx5CiAgICAgKiBuZWVkIHRvIHBhc3Mgc29tZXRoaW5nIGhlcmUgaWYgeW91IGhhdmUgeW91ciBvd24gc2Vzc2lvbmluZwogICAgICogaW1wbGVtZW50YXRpb24uCiAgICAgKgogICAgICogQHBhcmFtIHN0ciAkY29uc3VtZXJfY2xzIFRoZSBuYW1lIG9mIHRoZSBjbGFzcyB0byBpbnN0YW50aWF0ZQogICAgICogd2hlbiBjcmVhdGluZyB0aGUgaW50ZXJuYWwgY29uc3VtZXIgb2JqZWN0LiAgVGhpcyBpcyB1c2VkIGZvcgogICAgICogdGVzdGluZy4KICAgICAqLwogICAgZnVuY3Rpb24gQXV0aF9PcGVuSURfQ29uc3VtZXIoJHN0b3JlLCAkc2Vzc2lvbiA9IG51bGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkY29uc3VtZXJfY2xzID0gbnVsbCkKICAgIHsKICAgICAgICBpZiAoJHNlc3Npb24gPT09IG51bGwpIHsKICAgICAgICAgICAgJHNlc3Npb24gPSBuZXcgQXV0aF9ZYWRpc19QSFBTZXNzaW9uKCk7CiAgICAgICAgfQoKICAgICAgICAkdGhpcy0+c2Vzc2lvbiA9ICRzZXNzaW9uOwoKICAgICAgICBpZiAoJGNvbnN1bWVyX2NscyAhPT0gbnVsbCkgewogICAgICAgICAgICAkdGhpcy0+Y29uc3VtZXIgPSBuZXcgJGNvbnN1bWVyX2Nscygkc3RvcmUpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICR0aGlzLT5jb25zdW1lciA9IG5ldyBBdXRoX09wZW5JRF9HZW5lcmljQ29uc3VtZXIoJHN0b3JlKTsKICAgICAgICB9CgogICAgICAgICR0aGlzLT5fdG9rZW5fa2V5ID0gJHRoaXMtPnNlc3Npb25fa2V5X3ByZWZpeCAuICR0aGlzLT5fdG9rZW5fc3VmZml4OwogICAgfQoKICAgIC8qKgogICAgICogVXNlZCBpbiB0ZXN0aW5nIHRvIGRlZmluZSB0aGUgZGlzY292ZXJ5IG1lY2hhbmlzbS4KICAgICAqCiAgICAgKiBAYWNjZXNzIHByaXZhdGUKICAgICAqLwogICAgZnVuY3Rpb24gZ2V0RGlzY292ZXJ5T2JqZWN0KCRzZXNzaW9uLCAkb3BlbmlkX3VybCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2Vzc2lvbl9rZXlfcHJlZml4KQogICAgewogICAgICAgIHJldHVybiBuZXcgQXV0aF9ZYWRpc19EaXNjb3ZlcnkoJHNlc3Npb24sICRvcGVuaWRfdXJsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNlc3Npb25fa2V5X3ByZWZpeCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBTdGFydCB0aGUgT3BlbklEIGF1dGhlbnRpY2F0aW9uIHByb2Nlc3MuIFNlZSBzdGVwcyAxLTIgaW4gdGhlCiAgICAgKiBvdmVydmlldyBhdCB0aGUgdG9wIG9mIHRoaXMgZmlsZS4KICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICR1c2VyX3VybCBJZGVudGl0eSBVUkwgZ2l2ZW4gYnkgdGhlIHVzZXIuIFRoaXMKICAgICAqIG1ldGhvZCBwZXJmb3JtcyBhIHRleHR1YWwgdHJhbnNmb3JtYXRpb24gb2YgdGhlIFVSTCB0byB0cnkgYW5kCiAgICAgKiBtYWtlIHN1cmUgaXQgaXMgbm9ybWFsaXplZC4gRm9yIGV4YW1wbGUsIGEgdXNlcl91cmwgb2YKICAgICAqIGV4YW1wbGUuY29tIHdpbGwgYmUgbm9ybWFsaXplZCB0byBodHRwOi8vZXhhbXBsZS5jb20vCiAgICAgKiBub3JtYWxpemluZyBhbmQgcmVzb2x2aW5nIGFueSByZWRpcmVjdHMgdGhlIHNlcnZlciBtaWdodCBpc3N1ZS4KICAgICAqCiAgICAgKiBAcGFyYW0gYm9vbCAkYW5vbnltb3VzIFRydWUgaWYgdGhlIE9wZW5JRCByZXF1ZXN0IGlzIHRvIGJlIHNlbnQKICAgICAqIHRvIHRoZSBzZXJ2ZXIgd2l0aG91dCBhbnkgaWRlbnRpZmllciBpbmZvcm1hdGlvbi4gIFVzZSB0aGlzCiAgICAgKiB3aGVuIHlvdSB3YW50IHRvIHRyYW5zcG9ydCBkYXRhIGJ1dCBkb24ndCB3YW50IHRvIGRvIE9wZW5JRAogICAgICogYXV0aGVudGljYXRpb24gd2l0aCBpZGVudGlmaWVycy4KICAgICAqCiAgICAgKiBAcmV0dXJuIEF1dGhfT3BlbklEX0F1dGhSZXF1ZXN0ICRhdXRoX3JlcXVlc3QgQW4gb2JqZWN0CiAgICAgKiBjb250YWluaW5nIHRoZSBkaXNjb3ZlcmVkIGluZm9ybWF0aW9uIHdpbGwgYmUgcmV0dXJuZWQsIHdpdGggYQogICAgICogbWV0aG9kIGZvciBidWlsZGluZyBhIHJlZGlyZWN0IFVSTCB0byB0aGUgc2VydmVyLCBhcyBkZXNjcmliZWQKICAgICAqIGluIHN0ZXAgMyBvZiB0aGUgb3ZlcnZpZXcuIFRoaXMgb2JqZWN0IG1heSBhbHNvIGJlIHVzZWQgdG8gYWRkCiAgICAgKiBleHRlbnNpb24gYXJndW1lbnRzIHRvIHRoZSByZXF1ZXN0LCB1c2luZyBpdHMgJ2FkZEV4dGVuc2lvbkFyZycKICAgICAqIG1ldGhvZC4KICAgICAqLwogICAgZnVuY3Rpb24gYmVnaW4oJHVzZXJfdXJsLCAkYW5vbnltb3VzPWZhbHNlKQogICAgewogICAgICAgICRvcGVuaWRfdXJsID0gJHVzZXJfdXJsOwoKICAgICAgICAkZGlzY28gPSAkdGhpcy0+Z2V0RGlzY292ZXJ5T2JqZWN0KCR0aGlzLT5zZXNzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJG9wZW5pZF91cmwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+c2Vzc2lvbl9rZXlfcHJlZml4KTsKCiAgICAgICAgLy8gU2V0IHRoZSAnc3RhbGUnIGF0dHJpYnV0ZSBvZiB0aGUgbWFuYWdlci4gIElmIGRpc2NvdmVyeQogICAgICAgIC8vIGZhaWxzIGluIGEgZmF0YWwgd2F5LCB0aGUgc3RhbGUgZmxhZyB3aWxsIGNhdXNlIHRoZSBtYW5hZ2VyCiAgICAgICAgLy8gdG8gYmUgY2xlYW5lZCB1cCBuZXh0IHRpbWUgZGlzY292ZXJ5IGlzIGF0dGVtcHRlZC4KCiAgICAgICAgJG0gPSAkZGlzY28tPmdldE1hbmFnZXIoKTsKICAgICAgICAkbG9hZGVyID0gbmV3IEF1dGhfWWFkaXNfTWFuYWdlckxvYWRlcigpOwoKICAgICAgICBpZiAoJG0pIHsKICAgICAgICAgICAgaWYgKCRtLT5zdGFsZSkgewogICAgICAgICAgICAgICAgJGRpc2NvLT5kZXN0cm95TWFuYWdlcigpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJG0tPnN0YWxlID0gdHJ1ZTsKICAgICAgICAgICAgICAgICRkaXNjby0+c2Vzc2lvbi0+c2V0KCRkaXNjby0+c2Vzc2lvbl9rZXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemUoJGxvYWRlci0+dG9TZXNzaW9uKCRtKSkpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkZW5kcG9pbnQgPSAkZGlzY28tPmdldE5leHRTZXJ2aWNlKCR0aGlzLT5kaXNjb3Zlck1ldGhvZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5jb25zdW1lci0+ZmV0Y2hlcik7CgogICAgICAgIC8vIFJlc2V0IHRoZSAnc3RhbGUnIGF0dHJpYnV0ZSBvZiB0aGUgbWFuYWdlci4KICAgICAgICAkbSA9ICRkaXNjby0+Z2V0TWFuYWdlcigpOwogICAgICAgIGlmICgkbSkgewogICAgICAgICAgICAkbS0+c3RhbGUgPSBmYWxzZTsKICAgICAgICAgICAgJGRpc2NvLT5zZXNzaW9uLT5zZXQoJGRpc2NvLT5zZXNzaW9uX2tleSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplKCRsb2FkZXItPnRvU2Vzc2lvbigkbSkpKTsKICAgICAgICB9CgogICAgICAgIGlmICgkZW5kcG9pbnQgPT09IG51bGwpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5iZWdpbldpdGhvdXREaXNjb3ZlcnkoJGVuZHBvaW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYW5vbnltb3VzKTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBTdGFydCBPcGVuSUQgdmVyaWZpY2F0aW9uIHdpdGhvdXQgZG9pbmcgT3BlbklEIHNlcnZlcgogICAgICogZGlzY292ZXJ5LiBUaGlzIG1ldGhvZCBpcyB1c2VkIGludGVybmFsbHkgYnkgQ29uc3VtZXIuYmVnaW4KICAgICAqIGFmdGVyIGRpc2NvdmVyeSBpcyBwZXJmb3JtZWQsIGFuZCBleGlzdHMgdG8gcHJvdmlkZSBhbgogICAgICogaW50ZXJmYWNlIGZvciBsaWJyYXJ5IHVzZXJzIG5lZWRpbmcgdG8gcGVyZm9ybSB0aGVpciBvd24KICAgICAqIGRpc2NvdmVyeS4KICAgICAqCiAgICAgKiBAcGFyYW0gQXV0aF9PcGVuSURfU2VydmljZUVuZHBvaW50ICRlbmRwb2ludCBhbiBPcGVuSUQgc2VydmljZQogICAgICogZW5kcG9pbnQgZGVzY3JpcHRvci4KICAgICAqCiAgICAgKiBAcGFyYW0gYm9vbCBhbm9ueW1vdXMgU2V0IHRvIHRydWUgaWYgeW91IHdhbnQgdG8gcGVyZm9ybSBPcGVuSUQKICAgICAqIHdpdGhvdXQgaWRlbnRpZmllcnMuCiAgICAgKgogICAgICogQHJldHVybiBBdXRoX09wZW5JRF9BdXRoUmVxdWVzdCAkYXV0aF9yZXF1ZXN0IEFuIE9wZW5JRAogICAgICogYXV0aGVudGljYXRpb24gcmVxdWVzdCBvYmplY3QuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGJlZ2luV2l0aG91dERpc2NvdmVyeSgkZW5kcG9pbnQsICRhbm9ueW1vdXM9ZmFsc2UpCiAgICB7CiAgICAgICAgJGxvYWRlciA9IG5ldyBBdXRoX09wZW5JRF9TZXJ2aWNlRW5kcG9pbnRMb2FkZXIoKTsKICAgICAgICAkYXV0aF9yZXEgPSAkdGhpcy0+Y29uc3VtZXItPmJlZ2luKCRlbmRwb2ludCk7CiAgICAgICAgJHRoaXMtPnNlc3Npb24tPnNldCgkdGhpcy0+X3Rva2VuX2tleSwKICAgICAgICAgICAgICAkbG9hZGVyLT50b1Nlc3Npb24oJGF1dGhfcmVxLT5lbmRwb2ludCkpOwogICAgICAgIGlmICghJGF1dGhfcmVxLT5zZXRBbm9ueW1vdXMoJGFub255bW91cykpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBBdXRoX09wZW5JRF9GYWlsdXJlUmVzcG9uc2UobnVsbCwKICAgICAgICAgICAgICAiT3BlbklEIDEgcmVxdWVzdHMgTVVTVCBpbmNsdWRlIHRoZSBpZGVudGlmaWVyICIgLgogICAgICAgICAgICAgICJpbiB0aGUgcmVxdWVzdC4iKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICRhdXRoX3JlcTsKICAgIH0KCiAgICAvKioKICAgICAqIENhbGxlZCB0byBpbnRlcnByZXQgdGhlIHNlcnZlcidzIHJlc3BvbnNlIHRvIGFuIE9wZW5JRAogICAgICogcmVxdWVzdC4gSXQgaXMgY2FsbGVkIGluIHN0ZXAgNCBvZiB0aGUgZmxvdyBkZXNjcmliZWQgaW4gdGhlCiAgICAgKiBjb25zdW1lciBvdmVydmlldy4KICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICRjdXJyZW50X3VybCBUaGUgVVJMIHVzZWQgdG8gaW52b2tlIHRoZSBhcHBsaWNhdGlvbi4KICAgICAqIEV4dHJhY3QgdGhlIFVSTCBmcm9tIHlvdXIgYXBwbGljYXRpb24ncyB3ZWIKICAgICAqIHJlcXVlc3QgZnJhbWV3b3JrIGFuZCBzcGVjaWZ5IGl0IGhlcmUgdG8gaGF2ZSBpdCBjaGVja2VkCiAgICAgKiBhZ2FpbnN0IHRoZSBvcGVuaWQuY3VycmVudF91cmwgdmFsdWUgaW4gdGhlIHJlc3BvbnNlLiAgSWYKICAgICAqIHRoZSBjdXJyZW50X3VybCBVUkwgY2hlY2sgZmFpbHMsIHRoZSBzdGF0dXMgb2YgdGhlCiAgICAgKiBjb21wbGV0aW9uIHdpbGwgYmUgRkFJTFVSRS4KICAgICAqCiAgICAgKiBAcGFyYW0gYXJyYXkgJHF1ZXJ5IEFuIGFycmF5IG9mIHRoZSBxdWVyeSBwYXJhbWV0ZXJzIChrZXkgPT4KICAgICAqIHZhbHVlIHBhaXJzKSBmb3IgdGhpcyBIVFRQIHJlcXVlc3QuICBEZWZhdWx0cyB0byBudWxsLiAgSWYKICAgICAqIG51bGwsIHRoZSBHRVQgb3IgUE9TVCBkYXRhIGFyZSBhdXRvbWF0aWNhbGx5IGdvdHRlbiBmcm9tIHRoZQogICAgICogUEhQIGVudmlyb25tZW50LiAgSXQgaXMgb25seSB1c2VmdWwgdG8gb3ZlcnJpZGUgJHF1ZXJ5IGZvcgogICAgICogdGVzdGluZy4KICAgICAqCiAgICAgKiBAcmV0dXJuIEF1dGhfT3BlbklEX0NvbnN1bWVyUmVzcG9uc2UgJHJlc3BvbnNlIEEgaW5zdGFuY2Ugb2YgYW4KICAgICAqIEF1dGhfT3BlbklEX0NvbnN1bWVyUmVzcG9uc2Ugc3ViY2xhc3MuIFRoZSB0eXBlIG9mIHJlc3BvbnNlIGlzCiAgICAgKiBpbmRpY2F0ZWQgYnkgdGhlIHN0YXR1cyBhdHRyaWJ1dGUsIHdoaWNoIHdpbGwgYmUgb25lIG9mCiAgICAgKiBTVUNDRVNTLCBDQU5DRUwsIEZBSUxVUkUsIG9yIFNFVFVQX05FRURFRC4KICAgICAqLwogICAgZnVuY3Rpb24gY29tcGxldGUoJGN1cnJlbnRfdXJsLCAkcXVlcnk9bnVsbCkKICAgIHsKICAgICAgICBpZiAoJGN1cnJlbnRfdXJsICYmICFpc19zdHJpbmcoJGN1cnJlbnRfdXJsKSkgewogICAgICAgICAgICAvLyBUaGlzIGlzIHVnbHksIGJ1dCB3ZSBuZWVkIHRvIGNvbXBsYWluIGxvdWRseSB3aGVuCiAgICAgICAgICAgIC8vIHNvbWVvbmUgdXNlcyB0aGUgQVBJIGluY29ycmVjdGx5LgogICAgICAgICAgICB0cmlnZ2VyX2Vycm9yKCJjdXJyZW50X3VybCBtdXN0IGJlIGEgc3RyaW5nOyBzZWUgTkVXUyBmaWxlICIgLgogICAgICAgICAgICAgICAgICAgICAgICAgICJmb3IgdXBncmFkaW5nIG5vdGVzLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgRV9VU0VSX0VSUk9SKTsKICAgICAgICB9CgogICAgICAgIGlmICgkcXVlcnkgPT09IG51bGwpIHsKICAgICAgICAgICAgJHF1ZXJ5ID0gQXV0aF9PcGVuSUQ6OmdldFF1ZXJ5KCk7CiAgICAgICAgfQoKICAgICAgICAkbG9hZGVyID0gbmV3IEF1dGhfT3BlbklEX1NlcnZpY2VFbmRwb2ludExvYWRlcigpOwogICAgICAgICRlbmRwb2ludF9kYXRhID0gJHRoaXMtPnNlc3Npb24tPmdldCgkdGhpcy0+X3Rva2VuX2tleSk7CiAgICAgICAgJGVuZHBvaW50ID0KICAgICAgICAgICAgJGxvYWRlci0+ZnJvbVNlc3Npb24oJGVuZHBvaW50X2RhdGEpOwoKICAgICAgICAkbWVzc2FnZSA9IEF1dGhfT3BlbklEX01lc3NhZ2U6OmZyb21Qb3N0QXJncygkcXVlcnkpOwogICAgICAgICRyZXNwb25zZSA9ICR0aGlzLT5jb25zdW1lci0+Y29tcGxldGUoJG1lc3NhZ2UsICRlbmRwb2ludCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkY3VycmVudF91cmwpOwogICAgICAgICR0aGlzLT5zZXNzaW9uLT5kZWwoJHRoaXMtPl90b2tlbl9rZXkpOwoKICAgICAgICBpZiAoaW5fYXJyYXkoJHJlc3BvbnNlLT5zdGF0dXMsIGFycmF5KEF1dGhfT3BlbklEX1NVQ0NFU1MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdXRoX09wZW5JRF9DQU5DRUwpKSkgewogICAgICAgICAgICBpZiAoJHJlc3BvbnNlLT5pZGVudGl0eV91cmwgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgICRkaXNjbyA9ICR0aGlzLT5nZXREaXNjb3ZlcnlPYmplY3QoJHRoaXMtPnNlc3Npb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRyZXNwb25zZS0+aWRlbnRpdHlfdXJsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+c2Vzc2lvbl9rZXlfcHJlZml4KTsKICAgICAgICAgICAgICAgICRkaXNjby0+Y2xlYW51cCh0cnVlKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRyZXNwb25zZTsKICAgIH0KfQoKLyoqCiAqIEEgY2xhc3MgaW1wbGVtZW50aW5nIEhNQUMvREgtU0hBMSBjb25zdW1lciBzZXNzaW9ucy4KICoKICogQHBhY2thZ2UgT3BlbklECiAqLwpjbGFzcyBBdXRoX09wZW5JRF9EaWZmaWVIZWxsbWFuU0hBMUNvbnN1bWVyU2Vzc2lvbiB7CiAgICB2YXIgJHNlc3Npb25fdHlwZSA9ICdESC1TSEExJzsKICAgIHZhciAkaGFzaF9mdW5jID0gJ0F1dGhfT3BlbklEX1NIQTEnOwogICAgdmFyICRzZWNyZXRfc2l6ZSA9IDIwOwogICAgdmFyICRhbGxvd2VkX2Fzc29jX3R5cGVzID0gYXJyYXkoJ0hNQUMtU0hBMScpOwoKICAgIGZ1bmN0aW9uIEF1dGhfT3BlbklEX0RpZmZpZUhlbGxtYW5TSEExQ29uc3VtZXJTZXNzaW9uKCRkaCA9IG51bGwpCiAgICB7CiAgICAgICAgaWYgKCRkaCA9PT0gbnVsbCkgewogICAgICAgICAgICAkZGggPSBuZXcgQXV0aF9PcGVuSURfRGlmZmllSGVsbG1hbigpOwogICAgICAgIH0KCiAgICAgICAgJHRoaXMtPmRoID0gJGRoOwogICAgfQoKICAgIGZ1bmN0aW9uIGdldFJlcXVlc3QoKQogICAgewogICAgICAgICRtYXRoID0gQXV0aF9PcGVuSURfZ2V0TWF0aExpYigpOwoKICAgICAgICAkY3B1YiA9ICRtYXRoLT5sb25nVG9CYXNlNjQoJHRoaXMtPmRoLT5wdWJsaWMpOwoKICAgICAgICAkYXJncyA9IGFycmF5KCdkaF9jb25zdW1lcl9wdWJsaWMnID0+ICRjcHViKTsKCiAgICAgICAgaWYgKCEkdGhpcy0+ZGgtPnVzaW5nRGVmYXVsdFZhbHVlcygpKSB7CiAgICAgICAgICAgICRhcmdzID0gYXJyYXlfbWVyZ2UoJGFyZ3MsIGFycmF5KAogICAgICAgICAgICAgICAgJ2RoX21vZHVsdXMnID0+CiAgICAgICAgICAgICAgICAgICAgICRtYXRoLT5sb25nVG9CYXNlNjQoJHRoaXMtPmRoLT5tb2QpLAogICAgICAgICAgICAgICAgJ2RoX2dlbicgPT4KICAgICAgICAgICAgICAgICAgICAgJG1hdGgtPmxvbmdUb0Jhc2U2NCgkdGhpcy0+ZGgtPmdlbikpKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkYXJnczsKICAgIH0KCiAgICBmdW5jdGlvbiBleHRyYWN0U2VjcmV0KCRyZXNwb25zZSkKICAgIHsKICAgICAgICBpZiAoISRyZXNwb25zZS0+aGFzS2V5KEF1dGhfT3BlbklEX09QRU5JRF9OUywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkaF9zZXJ2ZXJfcHVibGljJykpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQoKICAgICAgICBpZiAoISRyZXNwb25zZS0+aGFzS2V5KEF1dGhfT3BlbklEX09QRU5JRF9OUywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlbmNfbWFjX2tleScpKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KCiAgICAgICAgJG1hdGggPSBBdXRoX09wZW5JRF9nZXRNYXRoTGliKCk7CgogICAgICAgICRzcHViID0gJG1hdGgtPmJhc2U2NFRvTG9uZygkcmVzcG9uc2UtPmdldEFyZyhBdXRoX09wZW5JRF9PUEVOSURfTlMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkaF9zZXJ2ZXJfcHVibGljJykpOwogICAgICAgICRlbmNfbWFjX2tleSA9IGJhc2U2NF9kZWNvZGUoJHJlc3BvbnNlLT5nZXRBcmcoQXV0aF9PcGVuSURfT1BFTklEX05TLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VuY19tYWNfa2V5JykpOwoKICAgICAgICByZXR1cm4gJHRoaXMtPmRoLT54b3JTZWNyZXQoJHNwdWIsICRlbmNfbWFjX2tleSwgJHRoaXMtPmhhc2hfZnVuYyk7CiAgICB9Cn0KCi8qKgogKiBBIGNsYXNzIGltcGxlbWVudGluZyBITUFDL0RILVNIQTI1NiBjb25zdW1lciBzZXNzaW9ucy4KICoKICogQHBhY2thZ2UgT3BlbklECiAqLwpjbGFzcyBBdXRoX09wZW5JRF9EaWZmaWVIZWxsbWFuU0hBMjU2Q29uc3VtZXJTZXNzaW9uIGV4dGVuZHMKICAgICAgQXV0aF9PcGVuSURfRGlmZmllSGVsbG1hblNIQTFDb25zdW1lclNlc3Npb24gewogICAgdmFyICRzZXNzaW9uX3R5cGUgPSAnREgtU0hBMjU2JzsKICAgIHZhciAkaGFzaF9mdW5jID0gJ0F1dGhfT3BlbklEX1NIQTI1Nic7CiAgICB2YXIgJHNlY3JldF9zaXplID0gMzI7CiAgICB2YXIgJGFsbG93ZWRfYXNzb2NfdHlwZXMgPSBhcnJheSgnSE1BQy1TSEEyNTYnKTsKfQoKLyoqCiAqIEEgY2xhc3MgaW1wbGVtZW50aW5nIHBsYWludGV4dCBjb25zdW1lciBzZXNzaW9ucy4KICoKICogQHBhY2thZ2UgT3BlbklECiAqLwpjbGFzcyBBdXRoX09wZW5JRF9QbGFpblRleHRDb25zdW1lclNlc3Npb24gewogICAgdmFyICRzZXNzaW9uX3R5cGUgPSAnbm8tZW5jcnlwdGlvbic7CiAgICB2YXIgJGFsbG93ZWRfYXNzb2NfdHlwZXMgPSAgYXJyYXkoJ0hNQUMtU0hBMScsICdITUFDLVNIQTI1NicpOwoKICAgIGZ1bmN0aW9uIGdldFJlcXVlc3QoKQogICAgewogICAgICAgIHJldHVybiBhcnJheSgpOwogICAgfQoKICAgIGZ1bmN0aW9uIGV4dHJhY3RTZWNyZXQoJHJlc3BvbnNlKQogICAgewogICAgICAgIGlmICghJHJlc3BvbnNlLT5oYXNLZXkoQXV0aF9PcGVuSURfT1BFTklEX05TLCAnbWFjX2tleScpKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGJhc2U2NF9kZWNvZGUoJHJlc3BvbnNlLT5nZXRBcmcoQXV0aF9PcGVuSURfT1BFTklEX05TLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtYWNfa2V5JykpOwogICAgfQp9CgovKioKICogUmV0dXJucyBhdmFpbGFibGUgc2Vzc2lvbiB0eXBlcy4KICovCmZ1bmN0aW9uIEF1dGhfT3BlbklEX2dldEF2YWlsYWJsZVNlc3Npb25UeXBlcygpCnsKICAgICR0eXBlcyA9IGFycmF5KAogICAgICAnbm8tZW5jcnlwdGlvbicgPT4gJ0F1dGhfT3BlbklEX1BsYWluVGV4dENvbnN1bWVyU2Vzc2lvbicsCiAgICAgICdESC1TSEExJyA9PiAnQXV0aF9PcGVuSURfRGlmZmllSGVsbG1hblNIQTFDb25zdW1lclNlc3Npb24nLAogICAgICAnREgtU0hBMjU2JyA9PiAnQXV0aF9PcGVuSURfRGlmZmllSGVsbG1hblNIQTI1NkNvbnN1bWVyU2Vzc2lvbicpOwoKICAgIHJldHVybiAkdHlwZXM7Cn0KCi8qKgogKiBUaGlzIGNsYXNzIGlzIHRoZSBpbnRlcmZhY2UgdG8gdGhlIE9wZW5JRCBjb25zdW1lciBsb2dpYy4KICogSW5zdGFuY2VzIG9mIGl0IG1haW50YWluIG5vIHBlci1yZXF1ZXN0IHN0YXRlLCBzbyB0aGV5IGNhbiBiZQogKiByZXVzZWQgKG9yIGV2ZW4gdXNlZCBieSBtdWx0aXBsZSB0aHJlYWRzIGNvbmN1cnJlbnRseSkgYXMgbmVlZGVkLgogKgogKiBAcGFja2FnZSBPcGVuSUQKICovCmNsYXNzIEF1dGhfT3BlbklEX0dlbmVyaWNDb25zdW1lciB7CiAgICAvKioKICAgICAqIEBhY2Nlc3MgcHJpdmF0ZQogICAgICovCiAgICB2YXIgJGRpc2NvdmVyTWV0aG9kID0gJ0F1dGhfT3BlbklEX2Rpc2NvdmVyJzsKCiAgICAvKioKICAgICAqIFRoaXMgY29uc3VtZXIncyBzdG9yZSBvYmplY3QuCiAgICAgKi8KICAgIHZhciAkc3RvcmU7CgogICAgLyoqCiAgICAgKiBAYWNjZXNzIHByaXZhdGUKICAgICAqLwogICAgdmFyICRfdXNlX2Fzc29jczsKCiAgICAvKioKICAgICAqIEBhY2Nlc3MgcHJpdmF0ZQogICAgICovCiAgICB2YXIgJG9wZW5pZDFfbm9uY2VfcXVlcnlfYXJnX25hbWUgPSAnamFucmFpbl9ub25jZSc7CgogICAgLyoqCiAgICAgKiBBbm90aGVyIHF1ZXJ5IHBhcmFtZXRlciB0aGF0IGdldHMgYWRkZWQgdG8gdGhlIHJldHVybl90byBmb3IKICAgICAqIE9wZW5JRCAxOyBpZiB0aGUgdXNlcidzIHNlc3Npb24gc3RhdGUgaXMgbG9zdCwgdXNlIHRoaXMgY2xhaW1lZAogICAgICogaWRlbnRpZmllciB0byBkbyBkaXNjb3Zlcnkgd2hlbiB2ZXJpZnlpbmcgdGhlIHJlc3BvbnNlLgogICAgICovCiAgICB2YXIgJG9wZW5pZDFfcmV0dXJuX3RvX2lkZW50aWZpZXJfbmFtZSA9ICdvcGVuaWQxX2NsYWltZWRfaWQnOwoKICAgIC8qKgogICAgICogVGhpcyBtZXRob2QgaW5pdGlhbGl6ZXMgYSBuZXcge0BsaW5rIEF1dGhfT3BlbklEX0NvbnN1bWVyfQogICAgICogaW5zdGFuY2UgdG8gYWNjZXNzIHRoZSBsaWJyYXJ5LgogICAgICoKICAgICAqIEBwYXJhbSBBdXRoX09wZW5JRF9PcGVuSURTdG9yZSAkc3RvcmUgVGhpcyBtdXN0IGJlIGFuIG9iamVjdAogICAgICogdGhhdCBpbXBsZW1lbnRzIHRoZSBpbnRlcmZhY2UgaW4ge0BsaW5rIEF1dGhfT3BlbklEX09wZW5JRFN0b3JlfS4KICAgICAqIFNldmVyYWwgY29uY3JldGUgaW1wbGVtZW50YXRpb25zIGFyZSBwcm92aWRlZCwgdG8gY292ZXIgbW9zdCBjb21tb24gdXNlCiAgICAgKiBjYXNlcy4gIEZvciBzdG9yZXMgYmFja2VkIGJ5IE15U1FMLCBQb3N0Z3JlU1FMLCBvciBTUUxpdGUsIHNlZQogICAgICogdGhlIHtAbGluayBBdXRoX09wZW5JRF9TUUxTdG9yZX0gY2xhc3MgYW5kIGl0cyBzdWJsY2Fzc2VzLiAgRm9yIGEKICAgICAqIGZpbGVzeXN0ZW0tYmFja2VkIHN0b3JlLCBzZWUgdGhlIHtAbGluayBBdXRoX09wZW5JRF9GaWxlU3RvcmV9IG1vZHVsZS4KICAgICAqIEFzIGEgbGFzdCByZXNvcnQsIGlmIGl0IGlzbid0IHBvc3NpYmxlIGZvciB0aGUgc2VydmVyIHRvIHN0b3JlCiAgICAgKiBzdGF0ZSBhdCBhbGwsIGFuIGluc3RhbmNlIG9mIHtAbGluayBBdXRoX09wZW5JRF9EdW1iU3RvcmV9IGNhbiBiZSB1c2VkLgogICAgICoKICAgICAqIEBwYXJhbSBib29sICRpbW1lZGlhdGUgVGhpcyBpcyBhbiBvcHRpb25hbCBib29sZWFuIHZhbHVlLiAgSXQKICAgICAqIGNvbnRyb2xzIHdoZXRoZXIgdGhlIGxpYnJhcnkgdXNlcyBpbW1lZGlhdGUgbW9kZSwgYXMgZXhwbGFpbmVkCiAgICAgKiBpbiB0aGUgbW9kdWxlIGRlc2NyaXB0aW9uLiAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgRmFsc2UsIHdoaWNoCiAgICAgKiBkaXNhYmxlcyBpbW1lZGlhdGUgbW9kZS4KICAgICAqLwogICAgZnVuY3Rpb24gQXV0aF9PcGVuSURfR2VuZXJpY0NvbnN1bWVyKCRzdG9yZSkKICAgIHsKICAgICAgICAkdGhpcy0+c3RvcmUgPSAkc3RvcmU7CiAgICAgICAgJHRoaXMtPm5lZ290aWF0b3IgPSBBdXRoX09wZW5JRF9nZXREZWZhdWx0TmVnb3RpYXRvcigpOwogICAgICAgICR0aGlzLT5fdXNlX2Fzc29jcyA9IChpc19udWxsKCR0aGlzLT5zdG9yZSkgPyBmYWxzZSA6IHRydWUpOwoKICAgICAgICAkdGhpcy0+ZmV0Y2hlciA9IEF1dGhfWWFkaXNfWWFkaXM6OmdldEhUVFBGZXRjaGVyKCk7CgogICAgICAgICR0aGlzLT5zZXNzaW9uX3R5cGVzID0gQXV0aF9PcGVuSURfZ2V0QXZhaWxhYmxlU2Vzc2lvblR5cGVzKCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDYWxsZWQgdG8gYmVnaW4gT3BlbklEIGF1dGhlbnRpY2F0aW9uIHVzaW5nIHRoZSBzcGVjaWZpZWQKICAgICAqIHtAbGluayBBdXRoX09wZW5JRF9TZXJ2aWNlRW5kcG9pbnR9LgogICAgICoKICAgICAqIEBhY2Nlc3MgcHJpdmF0ZQogICAgICovCiAgICBmdW5jdGlvbiBiZWdpbigkc2VydmljZV9lbmRwb2ludCkKICAgIHsKICAgICAgICAkYXNzb2MgPSAkdGhpcy0+X2dldEFzc29jaWF0aW9uKCRzZXJ2aWNlX2VuZHBvaW50KTsKICAgICAgICAkciA9IG5ldyBBdXRoX09wZW5JRF9BdXRoUmVxdWVzdCgkc2VydmljZV9lbmRwb2ludCwgJGFzc29jKTsKICAgICAgICAkci0+cmV0dXJuX3RvX2FyZ3NbJHRoaXMtPm9wZW5pZDFfbm9uY2VfcXVlcnlfYXJnX25hbWVdID0KICAgICAgICAgICAgQXV0aF9PcGVuSURfbWtOb25jZSgpOwoKICAgICAgICBpZiAoJHItPm1lc3NhZ2UtPmlzT3BlbklEMSgpKSB7CiAgICAgICAgICAgICRyLT5yZXR1cm5fdG9fYXJnc1skdGhpcy0+b3BlbmlkMV9yZXR1cm5fdG9faWRlbnRpZmllcl9uYW1lXSA9CiAgICAgICAgICAgICAgICAkci0+ZW5kcG9pbnQtPmNsYWltZWRfaWQ7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJHI7CiAgICB9CgogICAgLyoqCiAgICAgKiBHaXZlbiBhbiB7QGxpbmsgQXV0aF9PcGVuSURfTWVzc2FnZX0sIHtAbGluawogICAgICogQXV0aF9PcGVuSURfU2VydmljZUVuZHBvaW50fSBhbmQgb3B0aW9uYWwgcmV0dXJuX3RvIFVSTCwKICAgICAqIGNvbXBsZXRlIE9wZW5JRCBhdXRoZW50aWNhdGlvbi4KICAgICAqCiAgICAgKiBAYWNjZXNzIHByaXZhdGUKICAgICAqLwogICAgZnVuY3Rpb24gY29tcGxldGUoJG1lc3NhZ2UsICRlbmRwb2ludCwgJHJldHVybl90bykKICAgIHsKICAgICAgICAkbW9kZSA9ICRtZXNzYWdlLT5nZXRBcmcoQXV0aF9PcGVuSURfT1BFTklEX05TLCAnbW9kZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8bm8gbW9kZSBzZXQ+Jyk7CgogICAgICAgICRtb2RlX21ldGhvZHMgPSBhcnJheSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NhbmNlbCcgPT4gJ19jb21wbGV0ZV9jYW5jZWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZXJyb3InID0+ICdfY29tcGxldGVfZXJyb3InLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dXBfbmVlZGVkJyA9PiAnX2NvbXBsZXRlX3NldHVwX25lZWRlZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpZF9yZXMnID0+ICdfY29tcGxldGVfaWRfcmVzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgJG1ldGhvZCA9IEF1dGhfT3BlbklEOjphcnJheUdldCgkbW9kZV9tZXRob2RzLCAkbW9kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdfY29tcGxldGVJbnZhbGlkJyk7CgogICAgICAgIHJldHVybiBjYWxsX3VzZXJfZnVuY19hcnJheShhcnJheSgkdGhpcywgJG1ldGhvZCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5KCRtZXNzYWdlLCAmJGVuZHBvaW50LCAkcmV0dXJuX3RvKSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAYWNjZXNzIHByaXZhdGUKICAgICAqLwogICAgZnVuY3Rpb24gX2NvbXBsZXRlSW52YWxpZCgkbWVzc2FnZSwgJGVuZHBvaW50LCAkdW51c2VkKQogICAgewogICAgICAgICRtb2RlID0gJG1lc3NhZ2UtPmdldEFyZyhBdXRoX09wZW5JRF9PUEVOSURfTlMsICdtb2RlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxObyBtb2RlIHNldD4nKTsKCiAgICAgICAgcmV0dXJuIG5ldyBBdXRoX09wZW5JRF9GYWlsdXJlUmVzcG9uc2UoJGVuZHBvaW50LAogICAgICAgICAgICAgICAgICAgIHNwcmludGYoIkludmFsaWQgb3BlbmlkLm1vZGUgJyVzJyIsICRtb2RlKSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAYWNjZXNzIHByaXZhdGUKICAgICAqLwogICAgZnVuY3Rpb24gX2NvbXBsZXRlX2NhbmNlbCgkbWVzc2FnZSwgJGVuZHBvaW50LCAkdW51c2VkKQogICAgewogICAgICAgIHJldHVybiBuZXcgQXV0aF9PcGVuSURfQ2FuY2VsUmVzcG9uc2UoJGVuZHBvaW50KTsKICAgIH0KCiAgICAvKioKICAgICAqIEBhY2Nlc3MgcHJpdmF0ZQogICAgICovCiAgICBmdW5jdGlvbiBfY29tcGxldGVfZXJyb3IoJG1lc3NhZ2UsICRlbmRwb2ludCwgJHVudXNlZCkKICAgIHsKICAgICAgICAkZXJyb3IgPSAkbWVzc2FnZS0+Z2V0QXJnKEF1dGhfT3BlbklEX09QRU5JRF9OUywgJ2Vycm9yJyk7CiAgICAgICAgJGNvbnRhY3QgPSAkbWVzc2FnZS0+Z2V0QXJnKEF1dGhfT3BlbklEX09QRU5JRF9OUywgJ2NvbnRhY3QnKTsKICAgICAgICAkcmVmZXJlbmNlID0gJG1lc3NhZ2UtPmdldEFyZyhBdXRoX09wZW5JRF9PUEVOSURfTlMsICdyZWZlcmVuY2UnKTsKCiAgICAgICAgcmV0dXJuIG5ldyBBdXRoX09wZW5JRF9GYWlsdXJlUmVzcG9uc2UoJGVuZHBvaW50LCAkZXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGNvbnRhY3QsICRyZWZlcmVuY2UpOwogICAgfQoKICAgIC8qKgogICAgICogQGFjY2VzcyBwcml2YXRlCiAgICAgKi8KICAgIGZ1bmN0aW9uIF9jb21wbGV0ZV9zZXR1cF9uZWVkZWQoJG1lc3NhZ2UsICRlbmRwb2ludCwgJHVudXNlZCkKICAgIHsKICAgICAgICBpZiAoISRtZXNzYWdlLT5pc09wZW5JRDIoKSkgewogICAgICAgICAgICByZXR1cm4gJHRoaXMtPl9jb21wbGV0ZUludmFsaWQoJG1lc3NhZ2UsICRlbmRwb2ludCk7CiAgICAgICAgfQoKICAgICAgICAkdXNlcl9zZXR1cF91cmwgPSAkbWVzc2FnZS0+Z2V0QXJnKEF1dGhfT3BlbklEX09QRU5JRDJfTlMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndXNlcl9zZXR1cF91cmwnKTsKICAgICAgICByZXR1cm4gbmV3IEF1dGhfT3BlbklEX1NldHVwTmVlZGVkUmVzcG9uc2UoJGVuZHBvaW50LCAkdXNlcl9zZXR1cF91cmwpOwogICAgfQoKICAgIC8qKgogICAgICogQGFjY2VzcyBwcml2YXRlCiAgICAgKi8KICAgIGZ1bmN0aW9uIF9jb21wbGV0ZV9pZF9yZXMoJG1lc3NhZ2UsICRlbmRwb2ludCwgJHJldHVybl90bykKICAgIHsKICAgICAgICAkdXNlcl9zZXR1cF91cmwgPSAkbWVzc2FnZS0+Z2V0QXJnKEF1dGhfT3BlbklEX09QRU5JRDFfTlMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndXNlcl9zZXR1cF91cmwnKTsKCiAgICAgICAgaWYgKCR0aGlzLT5fY2hlY2tTZXR1cE5lZWRlZCgkbWVzc2FnZSkpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBBdXRoX09wZW5JRF9TZXR1cE5lZWRlZFJlc3BvbnNlKAogICAgICAgICAgICAgICAgJGVuZHBvaW50LCAkdXNlcl9zZXR1cF91cmwpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+X2RvSWRSZXMoJG1lc3NhZ2UsICRlbmRwb2ludCwgJHJldHVybl90byk7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQGFjY2VzcyBwcml2YXRlCiAgICAgKi8KICAgIGZ1bmN0aW9uIF9jaGVja1NldHVwTmVlZGVkKCRtZXNzYWdlKQogICAgewogICAgICAgIC8vIEluIE9wZW5JRCAxLCB3ZSBjaGVjayB0byBzZWUgaWYgdGhpcyBpcyBhIGNhbmNlbCBmcm9tCiAgICAgICAgLy8gaW1tZWRpYXRlIG1vZGUgYnkgdGhlIHByZXNlbmNlIG9mIHRoZSB1c2VyX3NldHVwX3VybAogICAgICAgIC8vIHBhcmFtZXRlci4KICAgICAgICBpZiAoJG1lc3NhZ2UtPmlzT3BlbklEMSgpKSB7CiAgICAgICAgICAgICR1c2VyX3NldHVwX3VybCA9ICRtZXNzYWdlLT5nZXRBcmcoQXV0aF9PcGVuSURfT1BFTklEMV9OUywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndXNlcl9zZXR1cF91cmwnKTsKICAgICAgICAgICAgaWYgKCR1c2VyX3NldHVwX3VybCAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICAvKioKICAgICAqIEBhY2Nlc3MgcHJpdmF0ZQogICAgICovCiAgICBmdW5jdGlvbiBfZG9JZFJlcygkbWVzc2FnZSwgJGVuZHBvaW50LCAkcmV0dXJuX3RvKQogICAgewogICAgICAgIC8vIENoZWNrcyBmb3IgcHJlc2VuY2Ugb2YgYXBwcm9wcmlhdGUgZmllbGRzIChhbmQgY2hlY2tzCiAgICAgICAgLy8gc2lnbmVkIGxpc3QgZmllbGRzKQogICAgICAgICRyZXN1bHQgPSAkdGhpcy0+X2lkUmVzQ2hlY2tGb3JGaWVsZHMoJG1lc3NhZ2UpOwoKICAgICAgICBpZiAoQXV0aF9PcGVuSUQ6OmlzRmFpbHVyZSgkcmVzdWx0KSkgewogICAgICAgICAgICByZXR1cm4gJHJlc3VsdDsKICAgICAgICB9CgogICAgICAgIGlmICghJHRoaXMtPl9jaGVja1JldHVyblRvKCRtZXNzYWdlLCAkcmV0dXJuX3RvKSkgewogICAgICAgICAgICByZXR1cm4gbmV3IEF1dGhfT3BlbklEX0ZhaWx1cmVSZXNwb25zZShudWxsLAogICAgICAgICAgICBzcHJpbnRmKCJyZXR1cm5fdG8gZG9lcyBub3QgbWF0Y2ggcmV0dXJuIFVSTC4gRXhwZWN0ZWQgJXMsIGdvdCAlcyIsCiAgICAgICAgICAgICAgICAgICAgJHJldHVybl90bywKICAgICAgICAgICAgICAgICAgICAkbWVzc2FnZS0+Z2V0QXJnKEF1dGhfT3BlbklEX09QRU5JRF9OUywgJ3JldHVybl90bycpKSk7CiAgICAgICAgfQoKICAgICAgICAvLyBWZXJpZnkgZGlzY292ZXJ5IGluZm9ybWF0aW9uOgogICAgICAgICRyZXN1bHQgPSAkdGhpcy0+X3ZlcmlmeURpc2NvdmVyeVJlc3VsdHMoJG1lc3NhZ2UsICRlbmRwb2ludCk7CgogICAgICAgIGlmIChBdXRoX09wZW5JRDo6aXNGYWlsdXJlKCRyZXN1bHQpKSB7CiAgICAgICAgICAgIHJldHVybiAkcmVzdWx0OwogICAgICAgIH0KCiAgICAgICAgJGVuZHBvaW50ID0gJHJlc3VsdDsKCiAgICAgICAgJHJlc3VsdCA9ICR0aGlzLT5faWRSZXNDaGVja1NpZ25hdHVyZSgkbWVzc2FnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRlbmRwb2ludC0+c2VydmVyX3VybCk7CgogICAgICAgIGlmIChBdXRoX09wZW5JRDo6aXNGYWlsdXJlKCRyZXN1bHQpKSB7CiAgICAgICAgICAgIHJldHVybiAkcmVzdWx0OwogICAgICAgIH0KCiAgICAgICAgJHJlc3VsdCA9ICR0aGlzLT5faWRSZXNDaGVja05vbmNlKCRtZXNzYWdlLCAkZW5kcG9pbnQpOwoKICAgICAgICBpZiAoQXV0aF9PcGVuSUQ6OmlzRmFpbHVyZSgkcmVzdWx0KSkgewogICAgICAgICAgICByZXR1cm4gJHJlc3VsdDsKICAgICAgICB9CgogICAgICAgICRzaWduZWRfbGlzdF9zdHIgPSAkbWVzc2FnZS0+Z2V0QXJnKEF1dGhfT3BlbklEX09QRU5JRF9OUywgJ3NpZ25lZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXV0aF9PcGVuSURfTk9fREVGQVVMVCk7CiAgICAgICAgaWYgKEF1dGhfT3BlbklEOjppc0ZhaWx1cmUoJHNpZ25lZF9saXN0X3N0cikpIHsKICAgICAgICAgICAgcmV0dXJuICRzaWduZWRfbGlzdF9zdHI7CiAgICAgICAgfQogICAgICAgICRzaWduZWRfbGlzdCA9IGV4cGxvZGUoJywnLCAkc2lnbmVkX2xpc3Rfc3RyKTsKCiAgICAgICAgJHNpZ25lZF9maWVsZHMgPSBBdXRoX09wZW5JRDo6YWRkUHJlZml4KCRzaWduZWRfbGlzdCwgIm9wZW5pZC4iKTsKCiAgICAgICAgcmV0dXJuIG5ldyBBdXRoX09wZW5JRF9TdWNjZXNzUmVzcG9uc2UoJGVuZHBvaW50LCAkbWVzc2FnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2lnbmVkX2ZpZWxkcyk7CgogICAgfQoKICAgIC8qKgogICAgICogQGFjY2VzcyBwcml2YXRlCiAgICAgKi8KICAgIGZ1bmN0aW9uIF9jaGVja1JldHVyblRvKCRtZXNzYWdlLCAkcmV0dXJuX3RvKQogICAgewogICAgICAgIC8vIENoZWNrIGFuIE9wZW5JRCBtZXNzYWdlIGFuZCBpdHMgb3BlbmlkLnJldHVybl90byB2YWx1ZQogICAgICAgIC8vIGFnYWluc3QgYSByZXR1cm5fdG8gVVJMIGZyb20gYW4gYXBwbGljYXRpb24uICBSZXR1cm4gVHJ1ZQogICAgICAgIC8vIG9uIHN1Y2Nlc3MsIEZhbHNlIG9uIGZhaWx1cmUuCgogICAgICAgIC8vIENoZWNrIHRoZSBvcGVuaWQucmV0dXJuX3RvIGFyZ3MgYWdhaW5zdCBhcmdzIGluIHRoZQogICAgICAgIC8vIG9yaWdpbmFsIG1lc3NhZ2UuCiAgICAgICAgJHJlc3VsdCA9IEF1dGhfT3BlbklEX0dlbmVyaWNDb25zdW1lcjo6X3ZlcmlmeVJldHVyblRvQXJncygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRtZXNzYWdlLT50b1Bvc3RBcmdzKCkpOwogICAgICAgIGlmIChBdXRoX09wZW5JRDo6aXNGYWlsdXJlKCRyZXN1bHQpKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CgogICAgICAgIC8vIENoZWNrIHRoZSByZXR1cm5fdG8gYmFzZSBVUkwgYWdhaW5zdCB0aGUgb25lIGluIHRoZQogICAgICAgIC8vIG1lc3NhZ2UuCiAgICAgICAgJG1zZ19yZXR1cm5fdG8gPSAkbWVzc2FnZS0+Z2V0QXJnKEF1dGhfT3BlbklEX09QRU5JRF9OUywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3JldHVybl90bycpOwogICAgICAgIGlmIChBdXRoX09wZW5JRDo6aXNGYWlsdXJlKCRyZXR1cm5fdG8pKSB7CiAgICAgICAgICAgIC8vIFhYWCBsb2cgbWUKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgJHJldHVybl90b19wYXJ0cyA9IHBhcnNlX3VybChBdXRoX09wZW5JRF91cmlub3JtKCRyZXR1cm5fdG8pKTsKICAgICAgICAkbXNnX3JldHVybl90b19wYXJ0cyA9IHBhcnNlX3VybChBdXRoX09wZW5JRF91cmlub3JtKCRtc2dfcmV0dXJuX3RvKSk7CgogICAgICAgIC8vIElmIHBvcnQgaXMgYWJzZW50IGZyb20gYm90aCwgYWRkIGl0IHNvIGl0J3MgZXF1YWwgaW4gdGhlCiAgICAgICAgLy8gY2hlY2sgYmVsb3cuCiAgICAgICAgaWYgKCghYXJyYXlfa2V5X2V4aXN0cygncG9ydCcsICRyZXR1cm5fdG9fcGFydHMpKSAmJgogICAgICAgICAgICAoIWFycmF5X2tleV9leGlzdHMoJ3BvcnQnLCAkbXNnX3JldHVybl90b19wYXJ0cykpKSB7CiAgICAgICAgICAgICRyZXR1cm5fdG9fcGFydHNbJ3BvcnQnXSA9IG51bGw7CiAgICAgICAgICAgICRtc2dfcmV0dXJuX3RvX3BhcnRzWydwb3J0J10gPSBudWxsOwogICAgICAgIH0KCiAgICAgICAgLy8gSWYgcGF0aCBpcyBhYnNlbnQgZnJvbSBib3RoLCBhZGQgaXQgc28gaXQncyBlcXVhbCBpbiB0aGUKICAgICAgICAvLyBjaGVjayBiZWxvdy4KICAgICAgICBpZiAoKCFhcnJheV9rZXlfZXhpc3RzKCdwYXRoJywgJHJldHVybl90b19wYXJ0cykpICYmCiAgICAgICAgICAgICghYXJyYXlfa2V5X2V4aXN0cygncGF0aCcsICRtc2dfcmV0dXJuX3RvX3BhcnRzKSkpIHsKICAgICAgICAgICAgJHJldHVybl90b19wYXJ0c1sncGF0aCddID0gbnVsbDsKICAgICAgICAgICAgJG1zZ19yZXR1cm5fdG9fcGFydHNbJ3BhdGgnXSA9IG51bGw7CiAgICAgICAgfQoKICAgICAgICAvLyBUaGUgVVJMIHNjaGVtZSwgYXV0aG9yaXR5LCBhbmQgcGF0aCBNVVNUIGJlIHRoZSBzYW1lCiAgICAgICAgLy8gYmV0d2VlbiB0aGUgdHdvIFVSTHMuCiAgICAgICAgZm9yZWFjaCAoYXJyYXkoJ3NjaGVtZScsICdob3N0JywgJ3BvcnQnLCAncGF0aCcpIGFzICRjb21wb25lbnQpIHsKICAgICAgICAgICAgLy8gSWYgdGhlIHVybCBjb21wb25lbnQgaXMgYWJzZW50IGluIGVpdGhlciBVUkwsIGZhaWwuCiAgICAgICAgICAgIC8vIFRoZXJlIHNob3VsZCBhbHdheXMgYmUgYSBzY2hlbWUsIGhvc3QsIHBvcnQsIGFuZCBwYXRoLgogICAgICAgICAgICBpZiAoIWFycmF5X2tleV9leGlzdHMoJGNvbXBvbmVudCwgJHJldHVybl90b19wYXJ0cykpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFhcnJheV9rZXlfZXhpc3RzKCRjb21wb25lbnQsICRtc2dfcmV0dXJuX3RvX3BhcnRzKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoQXV0aF9PcGVuSUQ6OmFycmF5R2V0KCRyZXR1cm5fdG9fcGFydHMsICRjb21wb25lbnQpICE9PQogICAgICAgICAgICAgICAgQXV0aF9PcGVuSUQ6OmFycmF5R2V0KCRtc2dfcmV0dXJuX3RvX3BhcnRzLCAkY29tcG9uZW50KSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICAvKioKICAgICAqIEBhY2Nlc3MgcHJpdmF0ZQogICAgICovCiAgICBmdW5jdGlvbiBfdmVyaWZ5UmV0dXJuVG9BcmdzKCRxdWVyeSkKICAgIHsKICAgICAgICAvLyBWZXJpZnkgdGhhdCB0aGUgYXJndW1lbnRzIGluIHRoZSByZXR1cm5fdG8gVVJMIGFyZSBwcmVzZW50IGluIHRoaXMKICAgICAgICAvLyByZXNwb25zZS4KCiAgICAgICAgJG1lc3NhZ2UgPSBBdXRoX09wZW5JRF9NZXNzYWdlOjpmcm9tUG9zdEFyZ3MoJHF1ZXJ5KTsKICAgICAgICAkcmV0dXJuX3RvID0gJG1lc3NhZ2UtPmdldEFyZyhBdXRoX09wZW5JRF9PUEVOSURfTlMsICdyZXR1cm5fdG8nKTsKCiAgICAgICAgaWYgKEF1dGhfT3BlbklEOjppc0ZhaWx1cmUoJHJldHVybl90bykpIHsKICAgICAgICAgICAgcmV0dXJuICRyZXR1cm5fdG87CiAgICAgICAgfQogICAgICAgIC8vIFhYWDogdGhpcyBzaG91bGQgYmUgY2hlY2tlZCBieSBfaWRSZXNDaGVja0ZvckZpZWxkcwogICAgICAgIGlmICghJHJldHVybl90bykgewogICAgICAgICAgICByZXR1cm4gbmV3IEF1dGhfT3BlbklEX0ZhaWx1cmVSZXNwb25zZShudWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiUmVzcG9uc2UgaGFzIG5vIHJldHVybl90byIpOwogICAgICAgIH0KCiAgICAgICAgJHBhcnNlZF91cmwgPSBwYXJzZV91cmwoJHJldHVybl90byk7CgogICAgICAgICRxID0gYXJyYXkoKTsKICAgICAgICBpZiAoYXJyYXlfa2V5X2V4aXN0cygncXVlcnknLCAkcGFyc2VkX3VybCkpIHsKICAgICAgICAgICAgJHJ0X3F1ZXJ5ID0gJHBhcnNlZF91cmxbJ3F1ZXJ5J107CiAgICAgICAgICAgICRxID0gQXV0aF9PcGVuSUQ6OnBhcnNlX3N0cigkcnRfcXVlcnkpOwogICAgICAgIH0KCiAgICAgICAgZm9yZWFjaCAoJHEgYXMgJHJ0X2tleSA9PiAkcnRfdmFsdWUpIHsKICAgICAgICAgICAgaWYgKCFhcnJheV9rZXlfZXhpc3RzKCRydF9rZXksICRxdWVyeSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQXV0aF9PcGVuSURfRmFpbHVyZVJlc3BvbnNlKG51bGwsCiAgICAgICAgICAgICAgICAgIHNwcmludGYoInJldHVybl90byBwYXJhbWV0ZXIgJXMgYWJzZW50IGZyb20gcXVlcnkiLCAkcnRfa2V5KSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkdmFsdWUgPSAkcXVlcnlbJHJ0X2tleV07CiAgICAgICAgICAgICAgICBpZiAoJHJ0X3ZhbHVlICE9ICR2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQXV0aF9PcGVuSURfRmFpbHVyZVJlc3BvbnNlKG51bGwsCiAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKCJwYXJhbWV0ZXIgJXMgdmFsdWUgJXMgZG9lcyBub3QgbWF0Y2ggIiAuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZXR1cm5fdG8gdmFsdWUgJXMiLCAkcnRfa2V5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdmFsdWUsICRydF92YWx1ZSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBNYWtlIHN1cmUgYWxsIG5vbi1PcGVuSUQgYXJndW1lbnRzIGluIHRoZSByZXNwb25zZSBhcmUgYWxzbwogICAgICAgIC8vIGluIHRoZSBzaWduZWQgcmV0dXJuX3RvLgogICAgICAgICRiYXJlX2FyZ3MgPSAkbWVzc2FnZS0+Z2V0QXJncyhBdXRoX09wZW5JRF9CQVJFX05TKTsKICAgICAgICBmb3JlYWNoICgkYmFyZV9hcmdzIGFzICRrZXkgPT4gJHZhbHVlKSB7CiAgICAgICAgICAgIGlmIChBdXRoX09wZW5JRDo6YXJyYXlHZXQoJHEsICRrZXkpICE9ICR2YWx1ZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBdXRoX09wZW5JRF9GYWlsdXJlUmVzcG9uc2UobnVsbCwKICAgICAgICAgICAgICAgICAgc3ByaW50ZigiUGFyYW1ldGVyICVzID0gJXMgbm90IGluIHJldHVybl90byBVUkwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICRrZXksICR2YWx1ZSkpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICAvKioKICAgICAqIEBhY2Nlc3MgcHJpdmF0ZQogICAgICovCiAgICBmdW5jdGlvbiBfaWRSZXNDaGVja1NpZ25hdHVyZSgkbWVzc2FnZSwgJHNlcnZlcl91cmwpCiAgICB7CiAgICAgICAgJGFzc29jX2hhbmRsZSA9ICRtZXNzYWdlLT5nZXRBcmcoQXV0aF9PcGVuSURfT1BFTklEX05TLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhc3NvY19oYW5kbGUnKTsKICAgICAgICBpZiAoQXV0aF9PcGVuSUQ6OmlzRmFpbHVyZSgkYXNzb2NfaGFuZGxlKSkgewogICAgICAgICAgICByZXR1cm4gJGFzc29jX2hhbmRsZTsKICAgICAgICB9CgogICAgICAgICRhc3NvYyA9ICR0aGlzLT5zdG9yZS0+Z2V0QXNzb2NpYXRpb24oJHNlcnZlcl91cmwsICRhc3NvY19oYW5kbGUpOwoKICAgICAgICBpZiAoJGFzc29jKSB7CiAgICAgICAgICAgIGlmICgkYXNzb2MtPmdldEV4cGlyZXNJbigpIDw9IDApIHsKICAgICAgICAgICAgICAgIC8vIFhYWDogSXQgbWlnaHQgYmUgYSBnb29kIGlkZWEgc29tZXRpbWVzIHRvIHJlLXN0YXJ0CiAgICAgICAgICAgICAgICAvLyB0aGUgYXV0aGVudGljYXRpb24gd2l0aCBhIG5ldyBhc3NvY2lhdGlvbi4gRG9pbmcgaXQKICAgICAgICAgICAgICAgIC8vIGF1dG9tYXRpY2FsbHkgb3BlbnMgdGhlIHBvc3NpYmlsaXR5IGZvcgogICAgICAgICAgICAgICAgLy8gZGVuaWFsLW9mLXNlcnZpY2UgYnkgYSBzZXJ2ZXIgdGhhdCBqdXN0IHJldHVybnMKICAgICAgICAgICAgICAgIC8vIGV4cGlyZWQgYXNzb2NpYXRpb25zIChvciByZWFsbHkgc2hvcnQtbGl2ZWQKICAgICAgICAgICAgICAgIC8vIGFzc29jaWF0aW9ucykKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQXV0aF9PcGVuSURfRmFpbHVyZVJlc3BvbnNlKG51bGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0Fzc29jaWF0aW9uIHdpdGggJyAuICRzZXJ2ZXJfdXJsIC4gJyBleHBpcmVkJyk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghJGFzc29jLT5jaGVja01lc3NhZ2VTaWduYXR1cmUoJG1lc3NhZ2UpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEF1dGhfT3BlbklEX0ZhaWx1cmVSZXNwb25zZShudWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJhZCBzaWduYXR1cmUiKTsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vIEl0J3Mgbm90IGFuIGFzc29jaWF0aW9uIHdlIGtub3cgYWJvdXQuICBTdGF0ZWxlc3MgbW9kZQogICAgICAgICAgICAvLyBpcyBvdXIgb25seSBwb3NzaWJsZSBwYXRoIGZvciByZWNvdmVyeS4gIFhYWCAtIGFzeW5jCiAgICAgICAgICAgIC8vIGZyYW1ld29yayB3aWxsIG5vdCB3YW50IHRvIGJsb2NrIG9uIHRoaXMgY2FsbCB0bwogICAgICAgICAgICAvLyBfY2hlY2tBdXRoLgogICAgICAgICAgICBpZiAoISR0aGlzLT5fY2hlY2tBdXRoKCRtZXNzYWdlLCAkc2VydmVyX3VybCkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQXV0aF9PcGVuSURfRmFpbHVyZVJlc3BvbnNlKG51bGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNlcnZlciBkZW5pZWQgY2hlY2tfYXV0aGVudGljYXRpb24iKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9CgogICAgLyoqCiAgICAgKiBAYWNjZXNzIHByaXZhdGUKICAgICAqLwogICAgZnVuY3Rpb24gX3ZlcmlmeURpc2NvdmVyeVJlc3VsdHMoJG1lc3NhZ2UsICRlbmRwb2ludD1udWxsKQogICAgewogICAgICAgIGlmICgkbWVzc2FnZS0+Z2V0T3BlbklETmFtZXNwYWNlKCkgPT0gQXV0aF9PcGVuSURfT1BFTklEMl9OUykgewogICAgICAgICAgICByZXR1cm4gJHRoaXMtPl92ZXJpZnlEaXNjb3ZlcnlSZXN1bHRzT3BlbklEMigkbWVzc2FnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGVuZHBvaW50KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gJHRoaXMtPl92ZXJpZnlEaXNjb3ZlcnlSZXN1bHRzT3BlbklEMSgkbWVzc2FnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGVuZHBvaW50KTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBAYWNjZXNzIHByaXZhdGUKICAgICAqLwogICAgZnVuY3Rpb24gX3ZlcmlmeURpc2NvdmVyeVJlc3VsdHNPcGVuSUQxKCRtZXNzYWdlLCAkZW5kcG9pbnQpCiAgICB7CiAgICAgICAgJGNsYWltZWRfaWQgPSAkbWVzc2FnZS0+Z2V0QXJnKEF1dGhfT3BlbklEX0JBUkVfTlMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPm9wZW5pZDFfcmV0dXJuX3RvX2lkZW50aWZpZXJfbmFtZSk7CgogICAgICAgIGlmICgoJGVuZHBvaW50ID09PSBudWxsKSAmJiAoJGNsYWltZWRfaWQgPT09IG51bGwpKSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgQXV0aF9PcGVuSURfRmFpbHVyZVJlc3BvbnNlKCRlbmRwb2ludCwKICAgICAgICAgICAgICAnV2hlbiB1c2luZyBPcGVuSUQgMSwgdGhlIGNsYWltZWQgSUQgbXVzdCBiZSBzdXBwbGllZCwgJyAuCiAgICAgICAgICAgICAgJ2VpdGhlciBieSBwYXNzaW5nIGl0IHRocm91Z2ggYXMgYSByZXR1cm5fdG8gcGFyYW1ldGVyICcgLgogICAgICAgICAgICAgICdvciBieSB1c2luZyBhIHNlc3Npb24sIGFuZCBzdXBwbGllZCB0byB0aGUgR2VuZXJpY0NvbnN1bWVyICcgLgogICAgICAgICAgICAgICdhcyB0aGUgYXJndW1lbnQgdG8gY29tcGxldGUoKScpOwogICAgICAgIH0gZWxzZSBpZiAoKCRlbmRwb2ludCAhPT0gbnVsbCkgJiYgKCRjbGFpbWVkX2lkID09PSBudWxsKSkgewogICAgICAgICAgICAkY2xhaW1lZF9pZCA9ICRlbmRwb2ludC0+Y2xhaW1lZF9pZDsKICAgICAgICB9CgogICAgICAgICR0b19tYXRjaCA9IG5ldyBBdXRoX09wZW5JRF9TZXJ2aWNlRW5kcG9pbnQoKTsKICAgICAgICAkdG9fbWF0Y2gtPnR5cGVfdXJpcyA9IGFycmF5KEF1dGhfT3BlbklEX1RZUEVfMV8xKTsKICAgICAgICAkdG9fbWF0Y2gtPmxvY2FsX2lkID0gJG1lc3NhZ2UtPmdldEFyZyhBdXRoX09wZW5JRF9PUEVOSUQxX05TLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpZGVudGl0eScpOwoKICAgICAgICAvLyBSZXN0b3JlIGRlbGVnYXRlIGluZm9ybWF0aW9uIGZyb20gdGhlIGluaXRpYXRpb24gcGhhc2UKICAgICAgICAkdG9fbWF0Y2gtPmNsYWltZWRfaWQgPSAkY2xhaW1lZF9pZDsKCiAgICAgICAgaWYgKCR0b19tYXRjaC0+bG9jYWxfaWQgPT09IG51bGwpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBBdXRoX09wZW5JRF9GYWlsdXJlUmVzcG9uc2UoJGVuZHBvaW50LAogICAgICAgICAgICAgICAgICAgICAgICAgIk1pc3NpbmcgcmVxdWlyZWQgZmllbGQgb3BlbmlkLmlkZW50aXR5Iik7CiAgICAgICAgfQoKICAgICAgICAkdG9fbWF0Y2hfMV8wID0gJHRvX21hdGNoLT5jb3B5KCk7CiAgICAgICAgJHRvX21hdGNoXzFfMC0+dHlwZV91cmlzID0gYXJyYXkoQXV0aF9PcGVuSURfVFlQRV8xXzApOwoKICAgICAgICBpZiAoJGVuZHBvaW50ICE9PSBudWxsKSB7CiAgICAgICAgICAgICRyZXN1bHQgPSAkdGhpcy0+X3ZlcmlmeURpc2NvdmVyeVNpbmdsZSgkZW5kcG9pbnQsICR0b19tYXRjaCk7CgogICAgICAgICAgICBpZiAoaXNfYSgkcmVzdWx0LCAnQXV0aF9PcGVuSURfVHlwZVVSSU1pc21hdGNoJykpIHsKICAgICAgICAgICAgICAgICRyZXN1bHQgPSAkdGhpcy0+X3ZlcmlmeURpc2NvdmVyeVNpbmdsZSgkZW5kcG9pbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRvX21hdGNoXzFfMCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChBdXRoX09wZW5JRDo6aXNGYWlsdXJlKCRyZXN1bHQpKSB7CiAgICAgICAgICAgICAgICAvLyBvaWR1dGlsLmxvZygiRXJyb3IgYXR0ZW1wdGluZyB0byB1c2Ugc3RvcmVkCiAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICBkaXNjb3ZlcnkgaW5mb3JtYXRpb246ICIgKyBzdHIoZSkpCiAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICBvaWR1dGlsLmxvZygiQXR0ZW1wdGluZyBkaXNjb3ZlcnkgdG8KICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgIHZlcmlmeSBlbmRwb2ludCIpCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJGVuZHBvaW50OwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBFbmRwb2ludCBpcyBlaXRoZXIgYmFkIChmYWlsZWQgdmVyaWZpY2F0aW9uKSBvciBOb25lCiAgICAgICAgcmV0dXJuICR0aGlzLT5fZGlzY292ZXJBbmRWZXJpZnkoJHRvX21hdGNoLT5jbGFpbWVkX2lkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5KCR0b19tYXRjaCwgJHRvX21hdGNoXzFfMCkpOwogICAgfQoKICAgIC8qKgogICAgICogQGFjY2VzcyBwcml2YXRlCiAgICAgKi8KICAgIGZ1bmN0aW9uIF92ZXJpZnlEaXNjb3ZlcnlTaW5nbGUoJGVuZHBvaW50LCAkdG9fbWF0Y2gpCiAgICB7CiAgICAgICAgLy8gRXZlcnkgdHlwZSBVUkkgdGhhdCdzIGluIHRoZSB0b19tYXRjaCBlbmRwb2ludCBoYXMgdG8gYmUKICAgICAgICAvLyBwcmVzZW50IGluIHRoZSBkaXNjb3ZlcmVkIGVuZHBvaW50LgogICAgICAgIGZvcmVhY2ggKCR0b19tYXRjaC0+dHlwZV91cmlzIGFzICR0eXBlX3VyaSkgewogICAgICAgICAgICBpZiAoISRlbmRwb2ludC0+dXNlc0V4dGVuc2lvbigkdHlwZV91cmkpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEF1dGhfT3BlbklEX1R5cGVVUklNaXNtYXRjaCgkZW5kcG9pbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJlcXVpcmVkIHR5cGUgIi4kdHlwZV91cmkuIiBub3QgcHJlc2VudCIpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBGcmFnbWVudHMgZG8gbm90IGluZmx1ZW5jZSBkaXNjb3ZlcnksIHNvIHdlIGNhbid0IGNvbXBhcmUgYQogICAgICAgIC8vIGNsYWltZWQgaWRlbnRpZmllciB3aXRoIGEgZnJhZ21lbnQgdG8gZGlzY292ZXJlZAogICAgICAgIC8vIGluZm9ybWF0aW9uLgogICAgICAgIGxpc3QoJGRlZnJhZ2dlZF9jbGFpbWVkX2lkLCAkXykgPQogICAgICAgICAgICBBdXRoX09wZW5JRDo6dXJsZGVmcmFnKCR0b19tYXRjaC0+Y2xhaW1lZF9pZCk7CgogICAgICAgIGlmICgkZGVmcmFnZ2VkX2NsYWltZWRfaWQgIT0gJGVuZHBvaW50LT5jbGFpbWVkX2lkKSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgQXV0aF9PcGVuSURfRmFpbHVyZVJlc3BvbnNlKCRlbmRwb2ludCwKICAgICAgICAgICAgICBzcHJpbnRmKCdDbGFpbWVkIElEIGRvZXMgbm90IG1hdGNoIChkaWZmZXJlbnQgc3ViamVjdHMhKSwgJyAuCiAgICAgICAgICAgICAgICAgICAgICAnRXhwZWN0ZWQgJXMsIGdvdCAlcycsICRkZWZyYWdnZWRfY2xhaW1lZF9pZCwKICAgICAgICAgICAgICAgICAgICAgICRlbmRwb2ludC0+Y2xhaW1lZF9pZCkpOwogICAgICAgIH0KCiAgICAgICAgaWYgKCR0b19tYXRjaC0+Z2V0TG9jYWxJRCgpICE9ICRlbmRwb2ludC0+Z2V0TG9jYWxJRCgpKSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgQXV0aF9PcGVuSURfRmFpbHVyZVJlc3BvbnNlKCRlbmRwb2ludCwKICAgICAgICAgICAgICBzcHJpbnRmKCdsb2NhbF9pZCBtaXNtYXRjaC4gRXhwZWN0ZWQgJXMsIGdvdCAlcycsCiAgICAgICAgICAgICAgICAgICAgICAkdG9fbWF0Y2gtPmdldExvY2FsSUQoKSwgJGVuZHBvaW50LT5nZXRMb2NhbElEKCkpKTsKICAgICAgICB9CgogICAgICAgIC8vIElmIHRoZSBzZXJ2ZXIgVVJMIGlzIE5vbmUsIHRoaXMgbXVzdCBiZSBhbiBPcGVuSUQgMQogICAgICAgIC8vIHJlc3BvbnNlLCBiZWNhdXNlIG9wX2VuZHBvaW50IGlzIGEgcmVxdWlyZWQgcGFyYW1ldGVyIGluCiAgICAgICAgLy8gT3BlbklEIDIuIEluIHRoYXQgY2FzZSwgd2UgZG9uJ3QgYWN0dWFsbHkgY2FyZSB3aGF0IHRoZQogICAgICAgIC8vIGRpc2NvdmVyZWQgc2VydmVyX3VybCBpcywgYmVjYXVzZSBzaWduYXR1cmUgY2hlY2tpbmcgb3IKICAgICAgICAvLyBjaGVja19hdXRoIHNob3VsZCB0YWtlIGNhcmUgb2YgdGhhdCBjaGVjayBmb3IgdXMuCiAgICAgICAgaWYgKCR0b19tYXRjaC0+c2VydmVyX3VybCA9PT0gbnVsbCkgewogICAgICAgICAgICBpZiAoJHRvX21hdGNoLT5wcmVmZXJyZWROYW1lc3BhY2UoKSAhPSBBdXRoX09wZW5JRF9PUEVOSUQxX05TKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEF1dGhfT3BlbklEX0ZhaWx1cmVSZXNwb25zZSgkZW5kcG9pbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlByZWZlcnJlZCBuYW1lc3BhY2UgbWlzbWF0Y2ggKGJ1ZykiKTsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoJHRvX21hdGNoLT5zZXJ2ZXJfdXJsICE9ICRlbmRwb2ludC0+c2VydmVyX3VybCkgewogICAgICAgICAgICByZXR1cm4gbmV3IEF1dGhfT3BlbklEX0ZhaWx1cmVSZXNwb25zZSgkZW5kcG9pbnQsCiAgICAgICAgICAgICAgc3ByaW50ZignT1AgRW5kcG9pbnQgbWlzbWF0Y2guIEV4cGVjdGVkICVzLCBnb3QgJXMnLAogICAgICAgICAgICAgICAgICAgICAgJHRvX21hdGNoLT5zZXJ2ZXJfdXJsLCAkZW5kcG9pbnQtPnNlcnZlcl91cmwpKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgIC8qKgogICAgICogQGFjY2VzcyBwcml2YXRlCiAgICAgKi8KICAgIGZ1bmN0aW9uIF92ZXJpZnlEaXNjb3ZlcnlSZXN1bHRzT3BlbklEMigkbWVzc2FnZSwgJGVuZHBvaW50KQogICAgewogICAgICAgICR0b19tYXRjaCA9IG5ldyBBdXRoX09wZW5JRF9TZXJ2aWNlRW5kcG9pbnQoKTsKICAgICAgICAkdG9fbWF0Y2gtPnR5cGVfdXJpcyA9IGFycmF5KEF1dGhfT3BlbklEX1RZUEVfMl8wKTsKICAgICAgICAkdG9fbWF0Y2gtPmNsYWltZWRfaWQgPSAkbWVzc2FnZS0+Z2V0QXJnKEF1dGhfT3BlbklEX09QRU5JRDJfTlMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY2xhaW1lZF9pZCcpOwoKICAgICAgICAkdG9fbWF0Y2gtPmxvY2FsX2lkID0gJG1lc3NhZ2UtPmdldEFyZyhBdXRoX09wZW5JRF9PUEVOSUQyX05TLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaWRlbnRpdHknKTsKCiAgICAgICAgJHRvX21hdGNoLT5zZXJ2ZXJfdXJsID0gJG1lc3NhZ2UtPmdldEFyZyhBdXRoX09wZW5JRF9PUEVOSUQyX05TLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ29wX2VuZHBvaW50Jyk7CgogICAgICAgIGlmICgkdG9fbWF0Y2gtPnNlcnZlcl91cmwgPT09IG51bGwpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBBdXRoX09wZW5JRF9GYWlsdXJlUmVzcG9uc2UoJGVuZHBvaW50LAogICAgICAgICAgICAgICAgICAgICAgICAgIk9QIEVuZHBvaW50IFVSTCBtaXNzaW5nIik7CiAgICAgICAgfQoKICAgICAgICAvLyBjbGFpbWVkX2lkIGFuZCBpZGVudGlmaWVyIG11c3QgYm90aCBiZSBwcmVzZW50IG9yIGJvdGggYmUKICAgICAgICAvLyBhYnNlbnQKICAgICAgICBpZiAoKCR0b19tYXRjaC0+Y2xhaW1lZF9pZCA9PT0gbnVsbCkgJiYKICAgICAgICAgICAgKCR0b19tYXRjaC0+bG9jYWxfaWQgIT09IG51bGwpKSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgQXV0aF9PcGVuSURfRmFpbHVyZVJlc3BvbnNlKCRlbmRwb2ludCwKICAgICAgICAgICAgICAnb3BlbmlkLmlkZW50aXR5IGlzIHByZXNlbnQgd2l0aG91dCBvcGVuaWQuY2xhaW1lZF9pZCcpOwogICAgICAgIH0KCiAgICAgICAgaWYgKCgkdG9fbWF0Y2gtPmNsYWltZWRfaWQgIT09IG51bGwpICYmCiAgICAgICAgICAgICgkdG9fbWF0Y2gtPmxvY2FsX2lkID09PSBudWxsKSkgewogICAgICAgICAgICByZXR1cm4gbmV3IEF1dGhfT3BlbklEX0ZhaWx1cmVSZXNwb25zZSgkZW5kcG9pbnQsCiAgICAgICAgICAgICAgJ29wZW5pZC5jbGFpbWVkX2lkIGlzIHByZXNlbnQgd2l0aG91dCBvcGVuaWQuaWRlbnRpdHknKTsKICAgICAgICB9CgogICAgICAgIGlmICgkdG9fbWF0Y2gtPmNsYWltZWRfaWQgPT09IG51bGwpIHsKICAgICAgICAgICAgLy8gVGhpcyBpcyBhIHJlc3BvbnNlIHdpdGhvdXQgaWRlbnRpZmllcnMsIHNvIHRoZXJlJ3MKICAgICAgICAgICAgLy8gcmVhbGx5IG5vIGNoZWNraW5nIHRoYXQgd2UgY2FuIGRvLCBzbyByZXR1cm4gYW4KICAgICAgICAgICAgLy8gZW5kcG9pbnQgdGhhdCdzIGZvciB0aGUgc3BlY2lmaWVkIGBvcGVuaWQub3BfZW5kcG9pbnQnCiAgICAgICAgICAgIHJldHVybiBBdXRoX09wZW5JRF9TZXJ2aWNlRW5kcG9pbnQ6OmZyb21PUEVuZHBvaW50VVJMKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdG9fbWF0Y2gtPnNlcnZlcl91cmwpOwogICAgICAgIH0KCiAgICAgICAgaWYgKCEkZW5kcG9pbnQpIHsKICAgICAgICAgICAgLy8gVGhlIGNsYWltZWQgSUQgZG9lc24ndCBtYXRjaCwgc28gd2UgaGF2ZSB0byBkbwogICAgICAgICAgICAvLyBkaXNjb3ZlcnkgYWdhaW4uIFRoaXMgY292ZXJzIG5vdCB1c2luZyBzZXNzaW9ucywgT1AKICAgICAgICAgICAgLy8gaWRlbnRpZmllciBlbmRwb2ludHMgYW5kIHJlc3BvbnNlcyB0aGF0IGRpZG4ndCBtYXRjaAogICAgICAgICAgICAvLyB0aGUgb3JpZ2luYWwgcmVxdWVzdC4KICAgICAgICAgICAgLy8gb2lkdXRpbC5sb2coJ05vIHByZS1kaXNjb3ZlcmVkIGluZm9ybWF0aW9uIHN1cHBsaWVkLicpCiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+X2Rpc2NvdmVyQW5kVmVyaWZ5KCR0b19tYXRjaC0+Y2xhaW1lZF9pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXkoJHRvX21hdGNoKSk7CiAgICAgICAgfSBlbHNlIHsKCiAgICAgICAgICAgIC8vIFRoZSBjbGFpbWVkIElEIG1hdGNoZXMsIHNvIHdlIHVzZSB0aGUgZW5kcG9pbnQgdGhhdCB3ZQogICAgICAgICAgICAvLyBkaXNjb3ZlcmVkIGluIGluaXRpYXRpb24uIFRoaXMgc2hvdWxkIGJlIHRoZSBtb3N0CiAgICAgICAgICAgIC8vIGNvbW1vbiBjYXNlLgogICAgICAgICAgICAkcmVzdWx0ID0gJHRoaXMtPl92ZXJpZnlEaXNjb3ZlcnlTaW5nbGUoJGVuZHBvaW50LCAkdG9fbWF0Y2gpOwoKICAgICAgICAgICAgaWYgKEF1dGhfT3BlbklEOjppc0ZhaWx1cmUoJHJlc3VsdCkpIHsKICAgICAgICAgICAgICAgICRlbmRwb2ludCA9ICR0aGlzLT5fZGlzY292ZXJBbmRWZXJpZnkoJHRvX21hdGNoLT5jbGFpbWVkX2lkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheSgkdG9fbWF0Y2gpKTsKICAgICAgICAgICAgICAgIGlmIChBdXRoX09wZW5JRDo6aXNGYWlsdXJlKCRlbmRwb2ludCkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJGVuZHBvaW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBUaGUgZW5kcG9pbnQgd2UgcmV0dXJuIHNob3VsZCBoYXZlIHRoZSBjbGFpbWVkIElEIGZyb20gdGhlCiAgICAgICAgLy8gbWVzc2FnZSB3ZSBqdXN0IHZlcmlmaWVkLCBmcmFnbWVudCBhbmQgYWxsLgogICAgICAgIGlmICgkZW5kcG9pbnQtPmNsYWltZWRfaWQgIT0gJHRvX21hdGNoLT5jbGFpbWVkX2lkKSB7CiAgICAgICAgICAgICRlbmRwb2ludC0+Y2xhaW1lZF9pZCA9ICR0b19tYXRjaC0+Y2xhaW1lZF9pZDsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkZW5kcG9pbnQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBAYWNjZXNzIHByaXZhdGUKICAgICAqLwogICAgZnVuY3Rpb24gX2Rpc2NvdmVyQW5kVmVyaWZ5KCRjbGFpbWVkX2lkLCAkdG9fbWF0Y2hfZW5kcG9pbnRzKQogICAgewogICAgICAgIC8vIG9pZHV0aWwubG9nKCdQZXJmb3JtaW5nIGRpc2NvdmVyeSBvbiAlcycgJSAoY2xhaW1lZF9pZCwpKQogICAgICAgIGxpc3QoJHVudXNlZCwgJHNlcnZpY2VzKSA9IGNhbGxfdXNlcl9mdW5jKCR0aGlzLT5kaXNjb3Zlck1ldGhvZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkY2xhaW1lZF9pZCwKCQkJCQkJCQkJCQkJICAmJHRoaXMtPmZldGNoZXIpOwoKICAgICAgICBpZiAoISRzZXJ2aWNlcykgewogICAgICAgICAgICByZXR1cm4gbmV3IEF1dGhfT3BlbklEX0ZhaWx1cmVSZXNwb25zZShudWxsLAogICAgICAgICAgICAgIHNwcmludGYoIk5vIE9wZW5JRCBpbmZvcm1hdGlvbiBmb3VuZCBhdCAlcyIsCiAgICAgICAgICAgICAgICAgICAgICAkY2xhaW1lZF9pZCkpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICR0aGlzLT5fdmVyaWZ5RGlzY292ZXJ5U2VydmljZXMoJGNsYWltZWRfaWQsICRzZXJ2aWNlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdG9fbWF0Y2hfZW5kcG9pbnRzKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBhY2Nlc3MgcHJpdmF0ZQogICAgICovCiAgICBmdW5jdGlvbiBfdmVyaWZ5RGlzY292ZXJ5U2VydmljZXMoJGNsYWltZWRfaWQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzZXJ2aWNlcywgJHRvX21hdGNoX2VuZHBvaW50cykKICAgIHsKICAgICAgICAvLyBTZWFyY2ggdGhlIHNlcnZpY2VzIHJlc3VsdGluZyBmcm9tIGRpc2NvdmVyeSB0byBmaW5kIG9uZQogICAgICAgIC8vIHRoYXQgbWF0Y2hlcyB0aGUgaW5mb3JtYXRpb24gZnJvbSB0aGUgYXNzZXJ0aW9uCgogICAgICAgIGZvcmVhY2ggKCRzZXJ2aWNlcyBhcyAkZW5kcG9pbnQpIHsKICAgICAgICAgICAgZm9yZWFjaCAoJHRvX21hdGNoX2VuZHBvaW50cyBhcyAkdG9fbWF0Y2hfZW5kcG9pbnQpIHsKICAgICAgICAgICAgICAgICRyZXN1bHQgPSAkdGhpcy0+X3ZlcmlmeURpc2NvdmVyeVNpbmdsZSgkZW5kcG9pbnQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0b19tYXRjaF9lbmRwb2ludCk7CgogICAgICAgICAgICAgICAgaWYgKCFBdXRoX09wZW5JRDo6aXNGYWlsdXJlKCRyZXN1bHQpKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gSXQgbWF0Y2hlcywgc28gZGlzY292ZXIgdmVyaWZpY2F0aW9uIGhhcwogICAgICAgICAgICAgICAgICAgIC8vIHN1Y2NlZWRlZC4gUmV0dXJuIHRoaXMgZW5kcG9pbnQuCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRlbmRwb2ludDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIG5ldyBBdXRoX09wZW5JRF9GYWlsdXJlUmVzcG9uc2UobnVsbCwKICAgICAgICAgIHNwcmludGYoJ05vIG1hdGNoaW5nIGVuZHBvaW50IGZvdW5kIGFmdGVyIGRpc2NvdmVyaW5nICVzOiAlcycsCiAgICAgICAgICAgICAgICAgICRjbGFpbWVkX2lkLCAkcmVzdWx0LT5tZXNzYWdlKSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBFeHRyYWN0IHRoZSBub25jZSBmcm9tIGFuIE9wZW5JRCAxIHJlc3BvbnNlLiAgUmV0dXJuIHRoZSBub25jZQogICAgICogZnJvbSB0aGUgQkFSRV9OUyBzaW5jZSB3ZSBpbmRlcGVuZGVudGx5IGNoZWNrIHRoZSByZXR1cm5fdG8KICAgICAqIGFyZ3VtZW50cyBhcmUgdGhlIHNhbWUgYXMgdGhvc2UgaW4gdGhlIHJlc3BvbnNlIG1lc3NhZ2UuCiAgICAgKgogICAgICogU2VlIHRoZSBvcGVuaWQxX25vbmNlX3F1ZXJ5X2FyZ19uYW1lIGNsYXNzIHZhcmlhYmxlCiAgICAgKgogICAgICogQHJldHVybnMgJG5vbmNlIFRoZSBub25jZSBhcyBhIHN0cmluZyBvciBudWxsCiAgICAgKgogICAgICogQGFjY2VzcyBwcml2YXRlCiAgICAgKi8KICAgIGZ1bmN0aW9uIF9pZFJlc0dldE5vbmNlT3BlbklEMSgkbWVzc2FnZSwgJGVuZHBvaW50KQogICAgewogICAgICAgIHJldHVybiAkbWVzc2FnZS0+Z2V0QXJnKEF1dGhfT3BlbklEX0JBUkVfTlMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPm9wZW5pZDFfbm9uY2VfcXVlcnlfYXJnX25hbWUpOwogICAgfQoKICAgIC8qKgogICAgICogQGFjY2VzcyBwcml2YXRlCiAgICAgKi8KICAgIGZ1bmN0aW9uIF9pZFJlc0NoZWNrTm9uY2UoJG1lc3NhZ2UsICRlbmRwb2ludCkKICAgIHsKICAgICAgICBpZiAoJG1lc3NhZ2UtPmlzT3BlbklEMSgpKSB7CiAgICAgICAgICAgIC8vIFRoaXMgaW5kaWNhdGVzIHRoYXQgdGhlIG5vbmNlIHdhcyBnZW5lcmF0ZWQgYnkgdGhlIGNvbnN1bWVyCiAgICAgICAgICAgICRub25jZSA9ICR0aGlzLT5faWRSZXNHZXROb25jZU9wZW5JRDEoJG1lc3NhZ2UsICRlbmRwb2ludCk7CiAgICAgICAgICAgICRzZXJ2ZXJfdXJsID0gJyc7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJG5vbmNlID0gJG1lc3NhZ2UtPmdldEFyZyhBdXRoX09wZW5JRF9PUEVOSUQyX05TLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyZXNwb25zZV9ub25jZScpOwoKICAgICAgICAgICAgJHNlcnZlcl91cmwgPSAkZW5kcG9pbnQtPnNlcnZlcl91cmw7CiAgICAgICAgfQoKICAgICAgICBpZiAoJG5vbmNlID09PSBudWxsKSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgQXV0aF9PcGVuSURfRmFpbHVyZVJlc3BvbnNlKCRlbmRwb2ludCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOb25jZSBtaXNzaW5nIGZyb20gcmVzcG9uc2UiKTsKICAgICAgICB9CgogICAgICAgICRwYXJ0cyA9IEF1dGhfT3BlbklEX3NwbGl0Tm9uY2UoJG5vbmNlKTsKCiAgICAgICAgaWYgKCRwYXJ0cyA9PT0gbnVsbCkgewogICAgICAgICAgICByZXR1cm4gbmV3IEF1dGhfT3BlbklEX0ZhaWx1cmVSZXNwb25zZSgkZW5kcG9pbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWFsZm9ybWVkIG5vbmNlIGluIHJlc3BvbnNlIik7CiAgICAgICAgfQoKICAgICAgICBsaXN0KCR0aW1lc3RhbXAsICRzYWx0KSA9ICRwYXJ0czsKCiAgICAgICAgaWYgKCEkdGhpcy0+c3RvcmUtPnVzZU5vbmNlKCRzZXJ2ZXJfdXJsLCAkdGltZXN0YW1wLCAkc2FsdCkpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBBdXRoX09wZW5JRF9GYWlsdXJlUmVzcG9uc2UoJGVuZHBvaW50LAogICAgICAgICAgICAgICAgICAgICAgICAgIk5vbmNlIGFscmVhZHkgdXNlZCBvciBvdXQgb2YgcmFuZ2UiKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgIC8qKgogICAgICogQGFjY2VzcyBwcml2YXRlCiAgICAgKi8KICAgIGZ1bmN0aW9uIF9pZFJlc0NoZWNrRm9yRmllbGRzKCRtZXNzYWdlKQogICAgewogICAgICAgICRiYXNpY19maWVsZHMgPSBhcnJheSgncmV0dXJuX3RvJywgJ2Fzc29jX2hhbmRsZScsICdzaWcnLCAnc2lnbmVkJyk7CiAgICAgICAgJGJhc2ljX3NpZ19maWVsZHMgPSBhcnJheSgncmV0dXJuX3RvJywgJ2lkZW50aXR5Jyk7CgogICAgICAgICRyZXF1aXJlX2ZpZWxkcyA9IGFycmF5KAogICAgICAgICAgICBBdXRoX09wZW5JRF9PUEVOSUQyX05TID0+IGFycmF5X21lcmdlKCRiYXNpY19maWVsZHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXkoJ29wX2VuZHBvaW50JykpLAoKICAgICAgICAgICAgQXV0aF9PcGVuSURfT1BFTklEMV9OUyA9PiBhcnJheV9tZXJnZSgkYmFzaWNfZmllbGRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5KCdpZGVudGl0eScpKQogICAgICAgICAgICApOwoKICAgICAgICAkcmVxdWlyZV9zaWdzID0gYXJyYXkoCiAgICAgICAgICAgIEF1dGhfT3BlbklEX09QRU5JRDJfTlMgPT4gYXJyYXlfbWVyZ2UoJGJhc2ljX3NpZ19maWVsZHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXkoJ3Jlc3BvbnNlX25vbmNlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY2xhaW1lZF9pZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Fzc29jX2hhbmRsZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ29wX2VuZHBvaW50JykpLAogICAgICAgICAgICBBdXRoX09wZW5JRF9PUEVOSUQxX05TID0+IGFycmF5X21lcmdlKCRiYXNpY19zaWdfZmllbGRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5KCdub25jZScpKQogICAgICAgICAgICApOwoKICAgICAgICBmb3JlYWNoICgkcmVxdWlyZV9maWVsZHNbJG1lc3NhZ2UtPmdldE9wZW5JRE5hbWVzcGFjZSgpXSBhcyAkZmllbGQpIHsKICAgICAgICAgICAgaWYgKCEkbWVzc2FnZS0+aGFzS2V5KEF1dGhfT3BlbklEX09QRU5JRF9OUywgJGZpZWxkKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBdXRoX09wZW5JRF9GYWlsdXJlUmVzcG9uc2UobnVsbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWlzc2luZyByZXF1aXJlZCBmaWVsZCAnIi4kZmllbGQuIiciKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJHNpZ25lZF9saXN0X3N0ciA9ICRtZXNzYWdlLT5nZXRBcmcoQXV0aF9PcGVuSURfT1BFTklEX05TLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzaWduZWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1dGhfT3BlbklEX05PX0RFRkFVTFQpOwogICAgICAgIGlmIChBdXRoX09wZW5JRDo6aXNGYWlsdXJlKCRzaWduZWRfbGlzdF9zdHIpKSB7CiAgICAgICAgICAgIHJldHVybiAkc2lnbmVkX2xpc3Rfc3RyOwogICAgICAgIH0KICAgICAgICAkc2lnbmVkX2xpc3QgPSBleHBsb2RlKCcsJywgJHNpZ25lZF9saXN0X3N0cik7CgogICAgICAgIGZvcmVhY2ggKCRyZXF1aXJlX3NpZ3NbJG1lc3NhZ2UtPmdldE9wZW5JRE5hbWVzcGFjZSgpXSBhcyAkZmllbGQpIHsKICAgICAgICAgICAgLy8gRmllbGQgaXMgcHJlc2VudCBhbmQgbm90IGluIHNpZ25lZCBsaXN0CiAgICAgICAgICAgIGlmICgkbWVzc2FnZS0+aGFzS2V5KEF1dGhfT3BlbklEX09QRU5JRF9OUywgJGZpZWxkKSAmJgogICAgICAgICAgICAgICAgKCFpbl9hcnJheSgkZmllbGQsICRzaWduZWRfbGlzdCkpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEF1dGhfT3BlbklEX0ZhaWx1cmVSZXNwb25zZShudWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICInIi4kZmllbGQuIicgbm90IHNpZ25lZCIpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KCiAgICAvKioKICAgICAqIEBhY2Nlc3MgcHJpdmF0ZQogICAgICovCiAgICBmdW5jdGlvbiBfY2hlY2tBdXRoKCRtZXNzYWdlLCAkc2VydmVyX3VybCkKICAgIHsKICAgICAgICAkcmVxdWVzdCA9ICR0aGlzLT5fY3JlYXRlQ2hlY2tBdXRoUmVxdWVzdCgkbWVzc2FnZSk7CiAgICAgICAgaWYgKCRyZXF1ZXN0ID09PSBudWxsKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CgogICAgICAgICRyZXNwX21lc3NhZ2UgPSAkdGhpcy0+X21ha2VLVlBvc3QoJHJlcXVlc3QsICRzZXJ2ZXJfdXJsKTsKICAgICAgICBpZiAoKCRyZXNwX21lc3NhZ2UgPT09IG51bGwpIHx8CiAgICAgICAgICAgIChpc19hKCRyZXNwX21lc3NhZ2UsICdBdXRoX09wZW5JRF9TZXJ2ZXJFcnJvckNvbnRhaW5lcicpKSkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJHRoaXMtPl9wcm9jZXNzQ2hlY2tBdXRoUmVzcG9uc2UoJHJlc3BfbWVzc2FnZSwgJHNlcnZlcl91cmwpOwogICAgfQoKICAgIC8qKgogICAgICogQGFjY2VzcyBwcml2YXRlCiAgICAgKi8KICAgIGZ1bmN0aW9uIF9jcmVhdGVDaGVja0F1dGhSZXF1ZXN0KCRtZXNzYWdlKQogICAgewogICAgICAgICRzaWduZWQgPSAkbWVzc2FnZS0+Z2V0QXJnKEF1dGhfT3BlbklEX09QRU5JRF9OUywgJ3NpZ25lZCcpOwogICAgICAgIGlmICgkc2lnbmVkKSB7CiAgICAgICAgICAgIGZvcmVhY2ggKGV4cGxvZGUoJywnLCAkc2lnbmVkKSBhcyAkaykgewogICAgICAgICAgICAgICAgJHZhbHVlID0gJG1lc3NhZ2UtPmdldEFsaWFzZWRBcmcoJGspOwogICAgICAgICAgICAgICAgaWYgKCR2YWx1ZSA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICRjYV9tZXNzYWdlID0gJG1lc3NhZ2UtPmNvcHkoKTsKICAgICAgICAkY2FfbWVzc2FnZS0+c2V0QXJnKEF1dGhfT3BlbklEX09QRU5JRF9OUywgJ21vZGUnLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjaGVja19hdXRoZW50aWNhdGlvbicpOwogICAgICAgIHJldHVybiAkY2FfbWVzc2FnZTsKICAgIH0KCiAgICAvKioKICAgICAqIEBhY2Nlc3MgcHJpdmF0ZQogICAgICovCiAgICBmdW5jdGlvbiBfcHJvY2Vzc0NoZWNrQXV0aFJlc3BvbnNlKCRyZXNwb25zZSwgJHNlcnZlcl91cmwpCiAgICB7CiAgICAgICAgJGlzX3ZhbGlkID0gJHJlc3BvbnNlLT5nZXRBcmcoQXV0aF9PcGVuSURfT1BFTklEX05TLCAnaXNfdmFsaWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmYWxzZScpOwoKICAgICAgICAkaW52YWxpZGF0ZV9oYW5kbGUgPSAkcmVzcG9uc2UtPmdldEFyZyhBdXRoX09wZW5JRF9PUEVOSURfTlMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ludmFsaWRhdGVfaGFuZGxlJyk7CgogICAgICAgIGlmICgkaW52YWxpZGF0ZV9oYW5kbGUgIT09IG51bGwpIHsKICAgICAgICAgICAgJHRoaXMtPnN0b3JlLT5yZW1vdmVBc3NvY2lhdGlvbigkc2VydmVyX3VybCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaW52YWxpZGF0ZV9oYW5kbGUpOwogICAgICAgIH0KCiAgICAgICAgaWYgKCRpc192YWxpZCA9PSAndHJ1ZScpIHsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgLyoqCiAgICAgKiBBZGFwdCBhIFBPU1QgcmVzcG9uc2UgdG8gYSBNZXNzYWdlLgogICAgICoKICAgICAqIEBwYXJhbSAkcmVzcG9uc2UgUmVzdWx0IG9mIGEgUE9TVCB0byBhbiBPcGVuSUQgZW5kcG9pbnQuCiAgICAgKgogICAgICogQGFjY2VzcyBwcml2YXRlCiAgICAgKi8KICAgIHN0YXRpYyBmdW5jdGlvbiBfaHR0cFJlc3BvbnNlVG9NZXNzYWdlKCRyZXNwb25zZSwgJHNlcnZlcl91cmwpCiAgICB7CiAgICAgICAgLy8gU2hvdWxkIHRoaXMgZnVuY3Rpb24gYmUgbmFtZWQgTWVzc2FnZS5mcm9tSFRUUFJlc3BvbnNlIGluc3RlYWQ/CiAgICAgICAgJHJlc3BvbnNlX21lc3NhZ2UgPSBBdXRoX09wZW5JRF9NZXNzYWdlOjpmcm9tS1ZGb3JtKCRyZXNwb25zZS0+Ym9keSk7CgogICAgICAgIGlmICgkcmVzcG9uc2UtPnN0YXR1cyA9PSA0MDApIHsKICAgICAgICAgICAgcmV0dXJuIEF1dGhfT3BlbklEX1NlcnZlckVycm9yQ29udGFpbmVyOjpmcm9tTWVzc2FnZSgKICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3BvbnNlX21lc3NhZ2UpOwogICAgICAgIH0gZWxzZSBpZiAoJHJlc3BvbnNlLT5zdGF0dXMgIT0gMjAwIGFuZCAkcmVzcG9uc2UtPnN0YXR1cyAhPSAyMDYpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJHJlc3BvbnNlX21lc3NhZ2U7CiAgICB9CgogICAgLyoqCiAgICAgKiBAYWNjZXNzIHByaXZhdGUKICAgICAqLwogICAgZnVuY3Rpb24gX21ha2VLVlBvc3QoJG1lc3NhZ2UsICRzZXJ2ZXJfdXJsKQogICAgewogICAgICAgICRib2R5ID0gJG1lc3NhZ2UtPnRvVVJMRW5jb2RlZCgpOwogICAgICAgICRyZXNwID0gJHRoaXMtPmZldGNoZXItPnBvc3QoJHNlcnZlcl91cmwsICRib2R5KTsKCiAgICAgICAgaWYgKCRyZXNwID09PSBudWxsKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICR0aGlzLT5faHR0cFJlc3BvbnNlVG9NZXNzYWdlKCRyZXNwLCAkc2VydmVyX3VybCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAYWNjZXNzIHByaXZhdGUKICAgICAqLwogICAgZnVuY3Rpb24gX2dldEFzc29jaWF0aW9uKCRlbmRwb2ludCkKICAgIHsKICAgICAgICBpZiAoISR0aGlzLT5fdXNlX2Fzc29jcykgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CgogICAgICAgICRhc3NvYyA9ICR0aGlzLT5zdG9yZS0+Z2V0QXNzb2NpYXRpb24oJGVuZHBvaW50LT5zZXJ2ZXJfdXJsKTsKCiAgICAgICAgaWYgKCgkYXNzb2MgPT09IG51bGwpIHx8CiAgICAgICAgICAgICgkYXNzb2MtPmdldEV4cGlyZXNJbigpIDw9IDApKSB7CgogICAgICAgICAgICAkYXNzb2MgPSAkdGhpcy0+X25lZ290aWF0ZUFzc29jaWF0aW9uKCRlbmRwb2ludCk7CgogICAgICAgICAgICBpZiAoJGFzc29jICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAkdGhpcy0+c3RvcmUtPnN0b3JlQXNzb2NpYXRpb24oJGVuZHBvaW50LT5zZXJ2ZXJfdXJsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRhc3NvYyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiAkYXNzb2M7CiAgICB9CgogICAgLyoqCiAgICAgKiBIYW5kbGUgU2VydmVyRXJyb3JzIHJlc3VsdGluZyBmcm9tIGFzc29jaWF0aW9uIHJlcXVlc3RzLgogICAgICoKICAgICAqIEByZXR1cm4gJHJlc3VsdCBJZiBzZXJ2ZXIgcmVwbGllZCB3aXRoIGFuIEN7dW5zdXBwb3J0ZWQtdHlwZX0KICAgICAqIGVycm9yLCByZXR1cm4gYSB0dXBsZSBvZiBzdXBwb3J0ZWQgQ3thc3NvY2lhdGlvbl90eXBlfSwKICAgICAqIEN7c2Vzc2lvbl90eXBlfS4gIE90aGVyd2lzZSBsb2dzIHRoZSBlcnJvciBhbmQgcmV0dXJucyBudWxsLgogICAgICoKICAgICAqIEBhY2Nlc3MgcHJpdmF0ZQogICAgICovCiAgICBmdW5jdGlvbiBfZXh0cmFjdFN1cHBvcnRlZEFzc29jaWF0aW9uVHlwZSgkc2VydmVyX2Vycm9yLCAkZW5kcG9pbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYXNzb2NfdHlwZSkKICAgIHsKICAgICAgICAvLyBBbnkgZXJyb3IgbWVzc2FnZSB3aG9zZSBjb2RlIGlzIG5vdCAndW5zdXBwb3J0ZWQtdHlwZScKICAgICAgICAvLyBzaG91bGQgYmUgY29uc2lkZXJlZCBhIHRvdGFsIGZhaWx1cmUuCiAgICAgICAgaWYgKCgkc2VydmVyX2Vycm9yLT5lcnJvcl9jb2RlICE9ICd1bnN1cHBvcnRlZC10eXBlJykgfHwKICAgICAgICAgICAgKCRzZXJ2ZXJfZXJyb3ItPm1lc3NhZ2UtPmlzT3BlbklEMSgpKSkgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CgogICAgICAgIC8vIFRoZSBzZXJ2ZXIgZGlkbid0IGxpa2UgdGhlIGFzc29jaWF0aW9uL3Nlc3Npb24gdHlwZSB0aGF0IHdlCiAgICAgICAgLy8gc2VudCwgYW5kIGl0IHNlbnQgdXMgYmFjayBhIG1lc3NhZ2UgdGhhdCBtaWdodCB0ZWxsIHVzIGhvdwogICAgICAgIC8vIHRvIGhhbmRsZSBpdC4KCiAgICAgICAgLy8gRXh0cmFjdCB0aGUgc2Vzc2lvbl90eXBlIGFuZCBhc3NvY190eXBlIGZyb20gdGhlIGVycm9yCiAgICAgICAgLy8gbWVzc2FnZQogICAgICAgICRhc3NvY190eXBlID0gJHNlcnZlcl9lcnJvci0+bWVzc2FnZS0+Z2V0QXJnKEF1dGhfT3BlbklEX09QRU5JRF9OUywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYXNzb2NfdHlwZScpOwoKICAgICAgICAkc2Vzc2lvbl90eXBlID0gJHNlcnZlcl9lcnJvci0+bWVzc2FnZS0+Z2V0QXJnKEF1dGhfT3BlbklEX09QRU5JRF9OUywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXNzaW9uX3R5cGUnKTsKCiAgICAgICAgaWYgKCgkYXNzb2NfdHlwZSA9PT0gbnVsbCkgfHwgKCRzZXNzaW9uX3R5cGUgPT09IG51bGwpKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0gZWxzZSBpZiAoISR0aGlzLT5uZWdvdGlhdG9yLT5pc0FsbG93ZWQoJGFzc29jX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2Vzc2lvbl90eXBlKSkgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmV0dXJuIGFycmF5KCRhc3NvY190eXBlLCAkc2Vzc2lvbl90eXBlKTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBAYWNjZXNzIHByaXZhdGUKICAgICAqLwogICAgZnVuY3Rpb24gX25lZ290aWF0ZUFzc29jaWF0aW9uKCRlbmRwb2ludCkKICAgIHsKICAgICAgICAvLyBHZXQgb3VyIHByZWZlcnJlZCBzZXNzaW9uL2Fzc29jaWF0aW9uIHR5cGUgZnJvbSB0aGUgbmVnb3RpYXRpb3IuCiAgICAgICAgbGlzdCgkYXNzb2NfdHlwZSwgJHNlc3Npb25fdHlwZSkgPSAkdGhpcy0+bmVnb3RpYXRvci0+Z2V0QWxsb3dlZFR5cGUoKTsKCiAgICAgICAgJGFzc29jID0gJHRoaXMtPl9yZXF1ZXN0QXNzb2NpYXRpb24oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICRlbmRwb2ludCwgJGFzc29jX3R5cGUsICRzZXNzaW9uX3R5cGUpOwoKICAgICAgICBpZiAoQXV0aF9PcGVuSUQ6OmlzRmFpbHVyZSgkYXNzb2MpKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KCiAgICAgICAgaWYgKGlzX2EoJGFzc29jLCAnQXV0aF9PcGVuSURfU2VydmVyRXJyb3JDb250YWluZXInKSkgewogICAgICAgICAgICAkd2h5ID0gJGFzc29jOwoKICAgICAgICAgICAgJHN1cHBvcnRlZFR5cGVzID0gJHRoaXMtPl9leHRyYWN0U3VwcG9ydGVkQXNzb2NpYXRpb25UeXBlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHdoeSwgJGVuZHBvaW50LCAkYXNzb2NfdHlwZSk7CgogICAgICAgICAgICBpZiAoJHN1cHBvcnRlZFR5cGVzICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICBsaXN0KCRhc3NvY190eXBlLCAkc2Vzc2lvbl90eXBlKSA9ICRzdXBwb3J0ZWRUeXBlczsKCiAgICAgICAgICAgICAgICAvLyBBdHRlbXB0IHRvIGNyZWF0ZSBhbiBhc3NvY2lhdGlvbiBmcm9tIHRoZSBhc3NvY190eXBlCiAgICAgICAgICAgICAgICAvLyBhbmQgc2Vzc2lvbl90eXBlIHRoYXQgdGhlIHNlcnZlciB0b2xkIHVzIGl0CiAgICAgICAgICAgICAgICAvLyBzdXBwb3J0ZWQuCiAgICAgICAgICAgICAgICAkYXNzb2MgPSAkdGhpcy0+X3JlcXVlc3RBc3NvY2lhdGlvbigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZW5kcG9pbnQsICRhc3NvY190eXBlLCAkc2Vzc2lvbl90eXBlKTsKCiAgICAgICAgICAgICAgICBpZiAoaXNfYSgkYXNzb2MsICdBdXRoX09wZW5JRF9TZXJ2ZXJFcnJvckNvbnRhaW5lcicpKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gRG8gbm90IGtlZXAgdHJ5aW5nLCBzaW5jZSBpdCByZWplY3RlZCB0aGUKICAgICAgICAgICAgICAgICAgICAvLyBhc3NvY2lhdGlvbiB0eXBlIHRoYXQgaXQgdG9sZCB1cyB0byB1c2UuCiAgICAgICAgICAgICAgICAgICAgLy8gb2lkdXRpbC5sb2coJ1NlcnZlciAlcyByZWZ1c2VkIGl0cyBzdWdnZXN0ZWQgYXNzb2NpYXRpb24KICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAndHlwZTogc2Vzc2lvbl90eXBlPSVzLCBhc3NvY190eXBlPSVzJwogICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICUgKGVuZHBvaW50LnNlcnZlcl91cmwsIHNlc3Npb25fdHlwZSwKICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICBhc3NvY190eXBlKSkKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRhc3NvYzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuICRhc3NvYzsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBAYWNjZXNzIHByaXZhdGUKICAgICAqLwogICAgZnVuY3Rpb24gX3JlcXVlc3RBc3NvY2lhdGlvbigkZW5kcG9pbnQsICRhc3NvY190eXBlLCAkc2Vzc2lvbl90eXBlKQogICAgewogICAgICAgIGxpc3QoJGFzc29jX3Nlc3Npb24sICRhcmdzKSA9ICR0aGlzLT5fY3JlYXRlQXNzb2NpYXRlUmVxdWVzdCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZW5kcG9pbnQsICRhc3NvY190eXBlLCAkc2Vzc2lvbl90eXBlKTsKCiAgICAgICAgJHJlc3BvbnNlX21lc3NhZ2UgPSAkdGhpcy0+X21ha2VLVlBvc3QoJGFyZ3MsICRlbmRwb2ludC0+c2VydmVyX3VybCk7CgogICAgICAgIGlmICgkcmVzcG9uc2VfbWVzc2FnZSA9PT0gbnVsbCkgewogICAgICAgICAgICAvLyBvaWR1dGlsLmxvZygnb3BlbmlkLmFzc29jaWF0ZSByZXF1ZXN0IGZhaWxlZDogJXMnICUgKHdoeVswXSwpKQogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9IGVsc2UgaWYgKGlzX2EoJHJlc3BvbnNlX21lc3NhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICdBdXRoX09wZW5JRF9TZXJ2ZXJFcnJvckNvbnRhaW5lcicpKSB7CiAgICAgICAgICAgIHJldHVybiAkcmVzcG9uc2VfbWVzc2FnZTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkdGhpcy0+X2V4dHJhY3RBc3NvY2lhdGlvbigkcmVzcG9uc2VfbWVzc2FnZSwgJGFzc29jX3Nlc3Npb24pOwogICAgfQoKICAgIC8qKgogICAgICogQGFjY2VzcyBwcml2YXRlCiAgICAgKi8KICAgIGZ1bmN0aW9uIF9leHRyYWN0QXNzb2NpYXRpb24oJGFzc29jX3Jlc3BvbnNlLCAkYXNzb2Nfc2Vzc2lvbikKICAgIHsKICAgICAgICAvLyBFeHRyYWN0IHRoZSBjb21tb24gZmllbGRzIGZyb20gdGhlIHJlc3BvbnNlLCByYWlzaW5nIGFuCiAgICAgICAgLy8gZXhjZXB0aW9uIGlmIHRoZXkgYXJlIG5vdCBmb3VuZAogICAgICAgICRhc3NvY190eXBlID0gJGFzc29jX3Jlc3BvbnNlLT5nZXRBcmcoCiAgICAgICAgICAgICAgICAgICAgICAgICBBdXRoX09wZW5JRF9PUEVOSURfTlMsICdhc3NvY190eXBlJywKICAgICAgICAgICAgICAgICAgICAgICAgIEF1dGhfT3BlbklEX05PX0RFRkFVTFQpOwoKICAgICAgICBpZiAoQXV0aF9PcGVuSUQ6OmlzRmFpbHVyZSgkYXNzb2NfdHlwZSkpIHsKICAgICAgICAgICAgcmV0dXJuICRhc3NvY190eXBlOwogICAgICAgIH0KCiAgICAgICAgJGFzc29jX2hhbmRsZSA9ICRhc3NvY19yZXNwb25zZS0+Z2V0QXJnKAogICAgICAgICAgICAgICAgICAgICAgICAgICBBdXRoX09wZW5JRF9PUEVOSURfTlMsICdhc3NvY19oYW5kbGUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICBBdXRoX09wZW5JRF9OT19ERUZBVUxUKTsKCiAgICAgICAgaWYgKEF1dGhfT3BlbklEOjppc0ZhaWx1cmUoJGFzc29jX2hhbmRsZSkpIHsKICAgICAgICAgICAgcmV0dXJuICRhc3NvY19oYW5kbGU7CiAgICAgICAgfQoKICAgICAgICAvLyBleHBpcmVzX2luIGlzIGEgYmFzZS0xMCBzdHJpbmcuIFRoZSBQeXRob24gcGFyc2luZyB3aWxsCiAgICAgICAgLy8gYWNjZXB0IGxpdGVyYWxzIHRoYXQgaGF2ZSB3aGl0ZXNwYWNlIGFyb3VuZCB0aGVtIGFuZCB3aWxsCiAgICAgICAgLy8gYWNjZXB0IG5lZ2F0aXZlIHZhbHVlcy4gTmVpdGhlciBvZiB0aGVzZSBhcmUgcmVhbGx5IGluLXNwZWMsCiAgICAgICAgLy8gYnV0IHdlIHRoaW5rIGl0J3MgT0sgdG8gYWNjZXB0IHRoZW0uCiAgICAgICAgJGV4cGlyZXNfaW5fc3RyID0gJGFzc29jX3Jlc3BvbnNlLT5nZXRBcmcoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXV0aF9PcGVuSURfT1BFTklEX05TLCAnZXhwaXJlc19pbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXV0aF9PcGVuSURfTk9fREVGQVVMVCk7CgogICAgICAgIGlmIChBdXRoX09wZW5JRDo6aXNGYWlsdXJlKCRleHBpcmVzX2luX3N0cikpIHsKICAgICAgICAgICAgcmV0dXJuICRleHBpcmVzX2luX3N0cjsKICAgICAgICB9CgogICAgICAgICRleHBpcmVzX2luID0gQXV0aF9PcGVuSUQ6OmludHZhbCgkZXhwaXJlc19pbl9zdHIpOwogICAgICAgIGlmICgkZXhwaXJlc19pbiA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgCiAgICAgICAgICAgICRlcnIgPSBzcHJpbnRmKCJDb3VsZCBub3QgcGFyc2UgZXhwaXJlc19pbiBmcm9tIGFzc29jaWF0aW9uICIuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZXNwb25zZSAlcyIsIHByaW50X3IoJGFzc29jX3Jlc3BvbnNlLCB0cnVlKSk7CiAgICAgICAgICAgIHJldHVybiBuZXcgQXV0aF9PcGVuSURfRmFpbHVyZVJlc3BvbnNlKG51bGwsICRlcnIpOwogICAgICAgIH0KCiAgICAgICAgLy8gT3BlbklEIDEgaGFzIGZ1bm55IGFzc29jaWF0aW9uIHNlc3Npb24gYmVoYXZpb3VyLgogICAgICAgIGlmICgkYXNzb2NfcmVzcG9uc2UtPmlzT3BlbklEMSgpKSB7CiAgICAgICAgICAgICRzZXNzaW9uX3R5cGUgPSAkdGhpcy0+X2dldE9wZW5JRDFTZXNzaW9uVHlwZSgkYXNzb2NfcmVzcG9uc2UpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRzZXNzaW9uX3R5cGUgPSAkYXNzb2NfcmVzcG9uc2UtPmdldEFyZygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1dGhfT3BlbklEX09QRU5JRDJfTlMsICdzZXNzaW9uX3R5cGUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXV0aF9PcGVuSURfTk9fREVGQVVMVCk7CgogICAgICAgICAgICBpZiAoQXV0aF9PcGVuSUQ6OmlzRmFpbHVyZSgkc2Vzc2lvbl90eXBlKSkgewogICAgICAgICAgICAgICAgcmV0dXJuICRzZXNzaW9uX3R5cGU7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIFNlc3Npb24gdHlwZSBtaXNtYXRjaAogICAgICAgIGlmICgkYXNzb2Nfc2Vzc2lvbi0+c2Vzc2lvbl90eXBlICE9ICRzZXNzaW9uX3R5cGUpIHsKICAgICAgICAgICAgaWYgKCRhc3NvY19yZXNwb25zZS0+aXNPcGVuSUQxKCkgJiYKICAgICAgICAgICAgICAgICgkc2Vzc2lvbl90eXBlID09ICduby1lbmNyeXB0aW9uJykpIHsKICAgICAgICAgICAgICAgIC8vIEluIE9wZW5JRCAxLCBhbnkgYXNzb2NpYXRpb24gcmVxdWVzdCBjYW4gcmVzdWx0IGluCiAgICAgICAgICAgICAgICAvLyBhICduby1lbmNyeXB0aW9uJyBhc3NvY2lhdGlvbiByZXNwb25zZS4gU2V0dGluZwogICAgICAgICAgICAgICAgLy8gYXNzb2Nfc2Vzc2lvbiB0byBhIG5ldyBuby1lbmNyeXB0aW9uIHNlc3Npb24gc2hvdWxkCiAgICAgICAgICAgICAgICAvLyBtYWtlIHRoZSByZXN0IG9mIHRoaXMgZnVuY3Rpb24gd29yayBwcm9wZXJseSBmb3IKICAgICAgICAgICAgICAgIC8vIHRoYXQgY2FzZS4KICAgICAgICAgICAgICAgICRhc3NvY19zZXNzaW9uID0gbmV3IEF1dGhfT3BlbklEX1BsYWluVGV4dENvbnN1bWVyU2Vzc2lvbigpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgLy8gQW55IG90aGVyIG1pc21hdGNoLCByZWdhcmRsZXNzIG9mIHByb3RvY29sIHZlcnNpb24KICAgICAgICAgICAgICAgIC8vIHJlc3VsdHMgaW4gdGhlIGZhaWx1cmUgb2YgdGhlIGFzc29jaWF0aW9uIHNlc3Npb24KICAgICAgICAgICAgICAgIC8vIGFsdG9nZXRoZXIuCiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gTWFrZSBzdXJlIGFzc29jX3R5cGUgaXMgdmFsaWQgZm9yIHNlc3Npb25fdHlwZQogICAgICAgIGlmICghaW5fYXJyYXkoJGFzc29jX3R5cGUsICRhc3NvY19zZXNzaW9uLT5hbGxvd2VkX2Fzc29jX3R5cGVzKSkgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CgogICAgICAgIC8vIERlbGVnYXRlIHRvIHRoZSBhc3NvY2lhdGlvbiBzZXNzaW9uIHRvIGV4dHJhY3QgdGhlIHNlY3JldAogICAgICAgIC8vIGZyb20gdGhlIHJlc3BvbnNlLCBob3dldmVyIGlzIGFwcHJvcHJpYXRlIGZvciB0aGF0IHNlc3Npb24KICAgICAgICAvLyB0eXBlLgogICAgICAgICRzZWNyZXQgPSAkYXNzb2Nfc2Vzc2lvbi0+ZXh0cmFjdFNlY3JldCgkYXNzb2NfcmVzcG9uc2UpOwoKICAgICAgICBpZiAoJHNlY3JldCA9PT0gbnVsbCkgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CgogICAgICAgIHJldHVybiBBdXRoX09wZW5JRF9Bc3NvY2lhdGlvbjo6ZnJvbUV4cGlyZXNJbigKICAgICAgICAgICAgICAgICAkZXhwaXJlc19pbiwgJGFzc29jX2hhbmRsZSwgJHNlY3JldCwgJGFzc29jX3R5cGUpOwogICAgfQoKICAgIC8qKgogICAgICogQGFjY2VzcyBwcml2YXRlCiAgICAgKi8KICAgIGZ1bmN0aW9uIF9jcmVhdGVBc3NvY2lhdGVSZXF1ZXN0KCRlbmRwb2ludCwgJGFzc29jX3R5cGUsICRzZXNzaW9uX3R5cGUpCiAgICB7CiAgICAgICAgaWYgKGFycmF5X2tleV9leGlzdHMoJHNlc3Npb25fdHlwZSwgJHRoaXMtPnNlc3Npb25fdHlwZXMpKSB7CiAgICAgICAgICAgICRzZXNzaW9uX3R5cGVfY2xhc3MgPSAkdGhpcy0+c2Vzc2lvbl90eXBlc1skc2Vzc2lvbl90eXBlXTsKCiAgICAgICAgICAgIGlmIChpc19jYWxsYWJsZSgkc2Vzc2lvbl90eXBlX2NsYXNzKSkgewogICAgICAgICAgICAgICAgJGFzc29jX3Nlc3Npb24gPSAkc2Vzc2lvbl90eXBlX2NsYXNzKCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkYXNzb2Nfc2Vzc2lvbiA9IG5ldyAkc2Vzc2lvbl90eXBlX2NsYXNzKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CgogICAgICAgICRhcmdzID0gYXJyYXkoCiAgICAgICAgICAgICdtb2RlJyA9PiAnYXNzb2NpYXRlJywKICAgICAgICAgICAgJ2Fzc29jX3R5cGUnID0+ICRhc3NvY190eXBlKTsKCiAgICAgICAgaWYgKCEkZW5kcG9pbnQtPmNvbXBhdGliaWxpdHlNb2RlKCkpIHsKICAgICAgICAgICAgJGFyZ3NbJ25zJ10gPSBBdXRoX09wZW5JRF9PUEVOSUQyX05TOwogICAgICAgIH0KCiAgICAgICAgLy8gTGVhdmUgb3V0IHRoZSBzZXNzaW9uIHR5cGUgaWYgd2UncmUgaW4gY29tcGF0aWJpbGl0eSBtb2RlCiAgICAgICAgLy8gKmFuZCogaXQncyBuby1lbmNyeXB0aW9uLgogICAgICAgIGlmICgoISRlbmRwb2ludC0+Y29tcGF0aWJpbGl0eU1vZGUoKSkgfHwKICAgICAgICAgICAgKCRhc3NvY19zZXNzaW9uLT5zZXNzaW9uX3R5cGUgIT0gJ25vLWVuY3J5cHRpb24nKSkgewogICAgICAgICAgICAkYXJnc1snc2Vzc2lvbl90eXBlJ10gPSAkYXNzb2Nfc2Vzc2lvbi0+c2Vzc2lvbl90eXBlOwogICAgICAgIH0KCiAgICAgICAgJGFyZ3MgPSBhcnJheV9tZXJnZSgkYXJncywgJGFzc29jX3Nlc3Npb24tPmdldFJlcXVlc3QoKSk7CiAgICAgICAgJG1lc3NhZ2UgPSBBdXRoX09wZW5JRF9NZXNzYWdlOjpmcm9tT3BlbklEQXJncygkYXJncyk7CiAgICAgICAgcmV0dXJuIGFycmF5KCRhc3NvY19zZXNzaW9uLCAkbWVzc2FnZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBHaXZlbiBhbiBhc3NvY2lhdGlvbiByZXNwb25zZSBtZXNzYWdlLCBleHRyYWN0IHRoZSBPcGVuSUQgMS5YCiAgICAgKiBzZXNzaW9uIHR5cGUuCiAgICAgKgogICAgICogVGhpcyBmdW5jdGlvbiBtb3N0bHkgdGFrZXMgY2FyZSBvZiB0aGUgJ25vLWVuY3J5cHRpb24nIGRlZmF1bHQKICAgICAqIGJlaGF2aW9yIGluIE9wZW5JRCAxLgogICAgICoKICAgICAqIElmIHRoZSBhc3NvY2lhdGlvbiB0eXBlIGlzIHBsYWluLXRleHQsIHRoaXMgZnVuY3Rpb24gd2lsbAogICAgICogcmV0dXJuICduby1lbmNyeXB0aW9uJwogICAgICoKICAgICAqIEBhY2Nlc3MgcHJpdmF0ZQogICAgICogQHJldHVybiAkdHlwIFRoZSBhc3NvY2lhdGlvbiB0eXBlIGZvciB0aGlzIG1lc3NhZ2UKICAgICAqLwogICAgZnVuY3Rpb24gX2dldE9wZW5JRDFTZXNzaW9uVHlwZSgkYXNzb2NfcmVzcG9uc2UpCiAgICB7CiAgICAgICAgLy8gSWYgaXQncyBhbiBPcGVuSUQgMSBtZXNzYWdlLCBhbGxvdyBzZXNzaW9uX3R5cGUgdG8gZGVmYXVsdAogICAgICAgIC8vIHRvIE5vbmUgKHdoaWNoIHNpZ25pZmllcyAibm8tZW5jcnlwdGlvbiIpCiAgICAgICAgJHNlc3Npb25fdHlwZSA9ICRhc3NvY19yZXNwb25zZS0+Z2V0QXJnKEF1dGhfT3BlbklEX09QRU5JRDFfTlMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXNzaW9uX3R5cGUnKTsKCiAgICAgICAgLy8gSGFuZGxlIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIG5vLWVuY3J5cHRpb24gYXNzb2NpYXRpb24KICAgICAgICAvLyByZXNwb25lcyBpbiBPcGVuSUQgMSBhbmQgMjoKCiAgICAgICAgLy8gbm8tZW5jcnlwdGlvbiBpcyBub3QgcmVhbGx5IGEgdmFsaWQgc2Vzc2lvbiB0eXBlIGZvciBPcGVuSUQKICAgICAgICAvLyAxLCBidXQgd2UnbGwgYWNjZXB0IGl0IGFueXdheSwgd2hpbGUgaXNzdWluZyBhIHdhcm5pbmcuCiAgICAgICAgaWYgKCRzZXNzaW9uX3R5cGUgPT0gJ25vLWVuY3J5cHRpb24nKSB7CiAgICAgICAgICAgIC8vIG9pZHV0aWwubG9nKCdXQVJOSU5HOiBPcGVuSUQgc2VydmVyIHNlbnQgIm5vLWVuY3J5cHRpb24iJwogICAgICAgICAgICAvLyAgICAgICAgICAgICAnZm9yIE9wZW5JRCAxLlgnKQogICAgICAgIH0gZWxzZSBpZiAoKCRzZXNzaW9uX3R5cGUgPT0gJycpIHx8ICgkc2Vzc2lvbl90eXBlID09PSBudWxsKSkgewogICAgICAgICAgICAvLyBNaXNzaW5nIG9yIGVtcHR5IHNlc3Npb24gdHlwZSBpcyB0aGUgd2F5IHRvIGZsYWcgYQogICAgICAgICAgICAvLyAnbm8tZW5jcnlwdGlvbicgcmVzcG9uc2UuIENoYW5nZSB0aGUgc2Vzc2lvbiB0eXBlIHRvCiAgICAgICAgICAgIC8vICduby1lbmNyeXB0aW9uJyBzbyB0aGF0IGl0IGNhbiBiZSBoYW5kbGVkIGluIHRoZSBzYW1lCiAgICAgICAgICAgIC8vIHdheSBhcyBPcGVuSUQgMiAnbm8tZW5jcnlwdGlvbicgcmVzcG9uZXMuCiAgICAgICAgICAgICRzZXNzaW9uX3R5cGUgPSAnbm8tZW5jcnlwdGlvbic7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJHNlc3Npb25fdHlwZTsKICAgIH0KfQoKLyoqCiAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhbiBhdXRoZW50aWNhdGlvbiByZXF1ZXN0IGZyb20gYSBjb25zdW1lciB0bwogKiBhbiBPcGVuSUQgc2VydmVyLgogKgogKiBAcGFja2FnZSBPcGVuSUQKICovCmNsYXNzIEF1dGhfT3BlbklEX0F1dGhSZXF1ZXN0IHsKCiAgICAvKioKICAgICAqIEluaXRpYWxpemUgYW4gYXV0aGVudGljYXRpb24gcmVxdWVzdCB3aXRoIHRoZSBzcGVjaWZpZWQgdG9rZW4sCiAgICAgKiBhc3NvY2lhdGlvbiwgYW5kIGVuZHBvaW50LgogICAgICoKICAgICAqIFVzZXJzIG9mIHRoaXMgbGlicmFyeSBzaG91bGQgbm90IGNyZWF0ZSBpbnN0YW5jZXMgb2YgdGhpcwogICAgICogY2xhc3MuICBJbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyBhcmUgY3JlYXRlZCBieSB0aGUgbGlicmFyeSB3aGVuCiAgICAgKiBuZWVkZWQuCiAgICAgKi8KICAgIGZ1bmN0aW9uIEF1dGhfT3BlbklEX0F1dGhSZXF1ZXN0KCRlbmRwb2ludCwgJGFzc29jKQogICAgewogICAgICAgICR0aGlzLT5hc3NvYyA9ICRhc3NvYzsKICAgICAgICAkdGhpcy0+ZW5kcG9pbnQgPSAkZW5kcG9pbnQ7CiAgICAgICAgJHRoaXMtPnJldHVybl90b19hcmdzID0gYXJyYXkoKTsKICAgICAgICAkdGhpcy0+bWVzc2FnZSA9IG5ldyBBdXRoX09wZW5JRF9NZXNzYWdlKAogICAgICAgICAgICAkZW5kcG9pbnQtPnByZWZlcnJlZE5hbWVzcGFjZSgpKTsKICAgICAgICAkdGhpcy0+X2Fub255bW91cyA9IGZhbHNlOwogICAgfQoKICAgIC8qKgogICAgICogQWRkIGFuIGV4dGVuc2lvbiB0byB0aGlzIGNoZWNraWQgcmVxdWVzdC4KICAgICAqCiAgICAgKiAkZXh0ZW5zaW9uX3JlcXVlc3Q6IEFuIG9iamVjdCB0aGF0IGltcGxlbWVudHMgdGhlIGV4dGVuc2lvbgogICAgICogcmVxdWVzdCBpbnRlcmZhY2UgZm9yIGFkZGluZyBhcmd1bWVudHMgdG8gYW4gT3BlbklEIG1lc3NhZ2UuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGFkZEV4dGVuc2lvbigkZXh0ZW5zaW9uX3JlcXVlc3QpCiAgICB7CiAgICAgICAgJGV4dGVuc2lvbl9yZXF1ZXN0LT50b01lc3NhZ2UoJHRoaXMtPm1lc3NhZ2UpOwogICAgfQoKICAgIC8qKgogICAgICogQWRkIGFuIGV4dGVuc2lvbiBhcmd1bWVudCB0byB0aGlzIE9wZW5JRCBhdXRoZW50aWNhdGlvbgogICAgICogcmVxdWVzdC4KICAgICAqCiAgICAgKiBVc2UgY2F1dGlvbiB3aGVuIGFkZGluZyBhcmd1bWVudHMsIGJlY2F1c2UgdGhleSB3aWxsIGJlCiAgICAgKiBVUkwtZXNjYXBlZCBhbmQgYXBwZW5kZWQgdG8gdGhlIHJlZGlyZWN0IFVSTCwgd2hpY2ggY2FuIGVhc2lseQogICAgICogZ2V0IHF1aXRlIGxvbmcuCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkbmFtZXNwYWNlIFRoZSBuYW1lc3BhY2UgZm9yIHRoZSBleHRlbnNpb24uIEZvcgogICAgICogZXhhbXBsZSwgdGhlIHNpbXBsZSByZWdpc3RyYXRpb24gZXh0ZW5zaW9uIHVzZXMgdGhlIG5hbWVzcGFjZQogICAgICogJ3NyZWcnLgogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgJGtleSBUaGUga2V5IHdpdGhpbiB0aGUgZXh0ZW5zaW9uIG5hbWVzcGFjZS4gRm9yCiAgICAgKiBleGFtcGxlLCB0aGUgbmlja25hbWUgZmllbGQgaW4gdGhlIHNpbXBsZSByZWdpc3RyYXRpb24KICAgICAqIGV4dGVuc2lvbidzIGtleSBpcyAnbmlja25hbWUnLgogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgJHZhbHVlIFRoZSB2YWx1ZSB0byBwcm92aWRlIHRvIHRoZSBzZXJ2ZXIgZm9yCiAgICAgKiB0aGlzIGFyZ3VtZW50LgogICAgICovCiAgICBmdW5jdGlvbiBhZGRFeHRlbnNpb25BcmcoJG5hbWVzcGFjZSwgJGtleSwgJHZhbHVlKQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+bWVzc2FnZS0+c2V0QXJnKCRuYW1lc3BhY2UsICRrZXksICR2YWx1ZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBTZXQgd2hldGhlciB0aGlzIHJlcXVlc3Qgc2hvdWxkIGJlIG1hZGUgYW5vbnltb3VzbHkuIElmIGEKICAgICAqIHJlcXVlc3QgaXMgYW5vbnltb3VzLCB0aGUgaWRlbnRpZmllciB3aWxsIG5vdCBiZSBzZW50IGluIHRoZQogICAgICogcmVxdWVzdC4gVGhpcyBpcyBvbmx5IHVzZWZ1bCBpZiB5b3UgYXJlIG1ha2luZyBhbm90aGVyIGtpbmQgb2YKICAgICAqIHJlcXVlc3Qgd2l0aCBhbiBleHRlbnNpb24gaW4gdGhpcyByZXF1ZXN0LgogICAgICoKICAgICAqIEFub255bW91cyByZXF1ZXN0cyBhcmUgbm90IGFsbG93ZWQgd2hlbiB0aGUgcmVxdWVzdCBpcyBtYWRlCiAgICAgKiB3aXRoIE9wZW5JRCAxLgogICAgICovCiAgICBmdW5jdGlvbiBzZXRBbm9ueW1vdXMoJGlzX2Fub255bW91cykKICAgIHsKICAgICAgICBpZiAoJGlzX2Fub255bW91cyAmJiAkdGhpcy0+bWVzc2FnZS0+aXNPcGVuSUQxKCkpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICR0aGlzLT5fYW5vbnltb3VzID0gJGlzX2Fub255bW91czsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogUHJvZHVjZSBhIHtAbGluayBBdXRoX09wZW5JRF9NZXNzYWdlfSByZXByZXNlbnRpbmcgdGhpcwogICAgICogcmVxdWVzdC4KICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICRyZWFsbSBUaGUgVVJMIChvciBVUkwgcGF0dGVybikgdGhhdCBpZGVudGlmaWVzCiAgICAgKiB5b3VyIHdlYiBzaXRlIHRvIHRoZSB1c2VyIHdoZW4gc2hlIGlzIGF1dGhvcml6aW5nIGl0LgogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgJHJldHVybl90byBUaGUgVVJMIHRoYXQgdGhlIE9wZW5JRCBwcm92aWRlciB3aWxsCiAgICAgKiBzZW5kIHRoZSB1c2VyIGJhY2sgdG8gYWZ0ZXIgYXR0ZW1wdGluZyB0byB2ZXJpZnkgaGVyIGlkZW50aXR5LgogICAgICoKICAgICAqIE5vdCBzcGVjaWZ5aW5nIGEgcmV0dXJuX3RvIFVSTCBtZWFucyB0aGF0IHRoZSB1c2VyIHdpbGwgbm90IGJlCiAgICAgKiByZXR1cm5lZCB0byB0aGUgc2l0ZSBpc3N1aW5nIHRoZSByZXF1ZXN0IHVwb24gaXRzIGNvbXBsZXRpb24uCiAgICAgKgogICAgICogQHBhcmFtIGJvb2wgJGltbWVkaWF0ZSBJZiB0cnVlLCB0aGUgT3BlbklEIHByb3ZpZGVyIGlzIHRvIHNlbmQKICAgICAqIGJhY2sgYSByZXNwb25zZSBpbW1lZGlhdGVseSwgdXNlZnVsIGZvciBiZWhpbmQtdGhlLXNjZW5lcwogICAgICogYXV0aGVudGljYXRpb24gYXR0ZW1wdHMuICBPdGhlcndpc2UgdGhlIE9wZW5JRCBwcm92aWRlciBtYXkKICAgICAqIGVuZ2FnZSB0aGUgdXNlciBiZWZvcmUgcHJvdmlkaW5nIGEgcmVzcG9uc2UuICBUaGlzIGlzIHRoZQogICAgICogZGVmYXVsdCBjYXNlLCBhcyB0aGUgdXNlciBtYXkgbmVlZCB0byBwcm92aWRlIGNyZWRlbnRpYWxzIG9yCiAgICAgKiBhcHByb3ZlIHRoZSByZXF1ZXN0IGJlZm9yZSBhIHBvc2l0aXZlIHJlc3BvbnNlIGNhbiBiZSBzZW50LgogICAgICovCiAgICBmdW5jdGlvbiBnZXRNZXNzYWdlKCRyZWFsbSwgJHJldHVybl90bz1udWxsLCAkaW1tZWRpYXRlPWZhbHNlKQogICAgewogICAgICAgIGlmICgkcmV0dXJuX3RvKSB7CiAgICAgICAgICAgICRyZXR1cm5fdG8gPSBBdXRoX09wZW5JRDo6YXBwZW5kQXJncygkcmV0dXJuX3RvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnJldHVybl90b19hcmdzKTsKICAgICAgICB9IGVsc2UgaWYgKCRpbW1lZGlhdGUpIHsKICAgICAgICAgICAgLy8gcmFpc2UgVmFsdWVFcnJvcigKICAgICAgICAgICAgLy8gICAgICcicmV0dXJuX3RvIiBpcyBtYW5kYXRvcnkgd2hlbgogICAgICAgICAgICAvL3VzaW5nICJjaGVja2lkX2ltbWVkaWF0ZSInKQogICAgICAgICAgICByZXR1cm4gbmV3IEF1dGhfT3BlbklEX0ZhaWx1cmVSZXNwb25zZShudWxsLAogICAgICAgICAgICAgICIncmV0dXJuX3RvJyBpcyBtYW5kYXRvcnkgd2hlbiB1c2luZyBjaGVja2lkX2ltbWVkaWF0ZSIpOwogICAgICAgIH0gZWxzZSBpZiAoJHRoaXMtPm1lc3NhZ2UtPmlzT3BlbklEMSgpKSB7CiAgICAgICAgICAgIC8vIHJhaXNlIFZhbHVlRXJyb3IoJyJyZXR1cm5fdG8iIGlzCiAgICAgICAgICAgIC8vIG1hbmRhdG9yeSBmb3IgT3BlbklEIDEgcmVxdWVzdHMnKQogICAgICAgICAgICByZXR1cm4gbmV3IEF1dGhfT3BlbklEX0ZhaWx1cmVSZXNwb25zZShudWxsLAogICAgICAgICAgICAgICIncmV0dXJuX3RvJyBpcyBtYW5kYXRvcnkgZm9yIE9wZW5JRCAxIHJlcXVlc3RzIik7CiAgICAgICAgfSBlbHNlIGlmICgkdGhpcy0+cmV0dXJuX3RvX2FyZ3MpIHsKICAgICAgICAgICAgLy8gcmFpc2UgVmFsdWVFcnJvcignZXh0cmEgInJldHVybl90byIgYXJndW1lbnRzCiAgICAgICAgICAgIC8vIHdlcmUgc3BlY2lmaWVkLCBidXQgbm8gcmV0dXJuX3RvIHdhcyBzcGVjaWZpZWQnKQogICAgICAgICAgICByZXR1cm4gbmV3IEF1dGhfT3BlbklEX0ZhaWx1cmVSZXNwb25zZShudWxsLAogICAgICAgICAgICAgICJleHRyYSAncmV0dXJuX3RvJyBhcmd1bWVudHMgd2hlcmUgc3BlY2lmaWVkLCAiIC4KICAgICAgICAgICAgICAiYnV0IG5vIHJldHVybl90byB3YXMgc3BlY2lmaWVkIik7CiAgICAgICAgfQoKICAgICAgICBpZiAoJGltbWVkaWF0ZSkgewogICAgICAgICAgICAkbW9kZSA9ICdjaGVja2lkX2ltbWVkaWF0ZSc7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJG1vZGUgPSAnY2hlY2tpZF9zZXR1cCc7CiAgICAgICAgfQoKICAgICAgICAkbWVzc2FnZSA9ICR0aGlzLT5tZXNzYWdlLT5jb3B5KCk7CiAgICAgICAgaWYgKCRtZXNzYWdlLT5pc09wZW5JRDEoKSkgewogICAgICAgICAgICAkcmVhbG1fa2V5ID0gJ3RydXN0X3Jvb3QnOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRyZWFsbV9rZXkgPSAncmVhbG0nOwogICAgICAgIH0KCiAgICAgICAgJG1lc3NhZ2UtPnVwZGF0ZUFyZ3MoQXV0aF9PcGVuSURfT1BFTklEX05TLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRyZWFsbV9rZXkgPT4gJHJlYWxtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2RlJyA9PiAkbW9kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncmV0dXJuX3RvJyA9PiAkcmV0dXJuX3RvKSk7CgogICAgICAgIGlmICghJHRoaXMtPl9hbm9ueW1vdXMpIHsKICAgICAgICAgICAgaWYgKCR0aGlzLT5lbmRwb2ludC0+aXNPUElkZW50aWZpZXIoKSkgewogICAgICAgICAgICAgICAgLy8gVGhpcyB3aWxsIG5ldmVyIGhhcHBlbiB3aGVuIHdlJ3JlIGluIGNvbXBhdGliaWxpdHkKICAgICAgICAgICAgICAgIC8vIG1vZGUsIGFzIGxvbmcgYXMgaXNPUElkZW50aWZpZXIoKSByZXR1cm5zIEZhbHNlCiAgICAgICAgICAgICAgICAvLyB3aGVuZXZlciBwcmVmZXJyZWROYW1lc3BhY2UoKSByZXR1cm5zIE9QRU5JRDFfTlMuCiAgICAgICAgICAgICAgICAkY2xhaW1lZF9pZCA9ICRyZXF1ZXN0X2lkZW50aXR5ID0KICAgICAgICAgICAgICAgICAgICBBdXRoX09wZW5JRF9JREVOVElGSUVSX1NFTEVDVDsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICRyZXF1ZXN0X2lkZW50aXR5ID0gJHRoaXMtPmVuZHBvaW50LT5nZXRMb2NhbElEKCk7CiAgICAgICAgICAgICAgICAkY2xhaW1lZF9pZCA9ICR0aGlzLT5lbmRwb2ludC0+Y2xhaW1lZF9pZDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gVGhpcyBpcyB0cnVlIGZvciBib3RoIE9wZW5JRCAxIGFuZCAyCiAgICAgICAgICAgICRtZXNzYWdlLT5zZXRBcmcoQXV0aF9PcGVuSURfT1BFTklEX05TLCAnaWRlbnRpdHknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICRyZXF1ZXN0X2lkZW50aXR5KTsKCiAgICAgICAgICAgIGlmICgkbWVzc2FnZS0+aXNPcGVuSUQyKCkpIHsKICAgICAgICAgICAgICAgICRtZXNzYWdlLT5zZXRBcmcoQXV0aF9PcGVuSURfT1BFTklEMl9OUywgJ2NsYWltZWRfaWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkY2xhaW1lZF9pZCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICgkdGhpcy0+YXNzb2MpIHsKICAgICAgICAgICAgJG1lc3NhZ2UtPnNldEFyZyhBdXRoX09wZW5JRF9PUEVOSURfTlMsICdhc3NvY19oYW5kbGUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5hc3NvYy0+aGFuZGxlKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkbWVzc2FnZTsKICAgIH0KCiAgICBmdW5jdGlvbiByZWRpcmVjdFVSTCgkcmVhbG0sICRyZXR1cm5fdG8gPSBudWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgJGltbWVkaWF0ZSA9IGZhbHNlKQogICAgewogICAgICAgICRtZXNzYWdlID0gJHRoaXMtPmdldE1lc3NhZ2UoJHJlYWxtLCAkcmV0dXJuX3RvLCAkaW1tZWRpYXRlKTsKCiAgICAgICAgaWYgKEF1dGhfT3BlbklEOjppc0ZhaWx1cmUoJG1lc3NhZ2UpKSB7CiAgICAgICAgICAgIHJldHVybiAkbWVzc2FnZTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkbWVzc2FnZS0+dG9VUkwoJHRoaXMtPmVuZHBvaW50LT5zZXJ2ZXJfdXJsKTsKICAgIH0KCiAgICAvKioKICAgICAqIEdldCBodG1sIGZvciBhIGZvcm0gdG8gc3VibWl0IHRoaXMgcmVxdWVzdCB0byB0aGUgSURQLgogICAgICoKICAgICAqIGZvcm1fdGFnX2F0dHJzOiBBbiBhcnJheSBvZiBhdHRyaWJ1dGVzIHRvIGJlIGFkZGVkIHRvIHRoZSBmb3JtCiAgICAgKiB0YWcuICdhY2NlcHQtY2hhcnNldCcgYW5kICdlbmN0eXBlJyBoYXZlIGRlZmF1bHRzIHRoYXQgY2FuIGJlCiAgICAgKiBvdmVycmlkZGVuLiBJZiBhIHZhbHVlIGlzIHN1cHBsaWVkIGZvciAnYWN0aW9uJyBvciAnbWV0aG9kJywgaXQKICAgICAqIHdpbGwgYmUgcmVwbGFjZWQuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGZvcm1NYXJrdXAoJHJlYWxtLCAkcmV0dXJuX3RvPW51bGwsICRpbW1lZGlhdGU9ZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICRmb3JtX3RhZ19hdHRycz1udWxsKQogICAgewogICAgICAgICRtZXNzYWdlID0gJHRoaXMtPmdldE1lc3NhZ2UoJHJlYWxtLCAkcmV0dXJuX3RvLCAkaW1tZWRpYXRlKTsKCiAgICAgICAgaWYgKEF1dGhfT3BlbklEOjppc0ZhaWx1cmUoJG1lc3NhZ2UpKSB7CiAgICAgICAgICAgIHJldHVybiAkbWVzc2FnZTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkbWVzc2FnZS0+dG9Gb3JtTWFya3VwKCR0aGlzLT5lbmRwb2ludC0+c2VydmVyX3VybCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZm9ybV90YWdfYXR0cnMpOwogICAgfQoKICAgIC8qKgogICAgICogR2V0IGEgY29tcGxldGUgaHRtbCBkb2N1bWVudCB0aGF0IHdpbGwgYXV0b3N1Ym1pdCB0aGUgcmVxdWVzdAogICAgICogdG8gdGhlIElEUC4KICAgICAqCiAgICAgKiBXcmFwcyBmb3JtTWFya3VwLiAgU2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGF0IGZ1bmN0aW9uLgogICAgICovCiAgICBmdW5jdGlvbiBodG1sTWFya3VwKCRyZWFsbSwgJHJldHVybl90bz1udWxsLCAkaW1tZWRpYXRlPWZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAkZm9ybV90YWdfYXR0cnM9bnVsbCkKICAgIHsKICAgICAgICAkZm9ybSA9ICR0aGlzLT5mb3JtTWFya3VwKCRyZWFsbSwgJHJldHVybl90bywgJGltbWVkaWF0ZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZm9ybV90YWdfYXR0cnMpOwoKICAgICAgICBpZiAoQXV0aF9PcGVuSUQ6OmlzRmFpbHVyZSgkZm9ybSkpIHsKICAgICAgICAgICAgcmV0dXJuICRmb3JtOwogICAgICAgIH0KICAgICAgICByZXR1cm4gQXV0aF9PcGVuSUQ6OmF1dG9TdWJtaXRIVE1MKCRmb3JtKTsKICAgIH0KCiAgICBmdW5jdGlvbiBzaG91bGRTZW5kUmVkaXJlY3QoKQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+ZW5kcG9pbnQtPmNvbXBhdGliaWxpdHlNb2RlKCk7CiAgICB9Cn0KCi8qKgogKiBUaGUgYmFzZSBjbGFzcyBmb3IgcmVzcG9uc2VzIGZyb20gdGhlIEF1dGhfT3BlbklEX0NvbnN1bWVyLgogKgogKiBAcGFja2FnZSBPcGVuSUQKICovCmNsYXNzIEF1dGhfT3BlbklEX0NvbnN1bWVyUmVzcG9uc2UgewogICAgdmFyICRzdGF0dXMgPSBudWxsOwoKICAgIGZ1bmN0aW9uIHNldEVuZHBvaW50KCRlbmRwb2ludCkKICAgIHsKICAgICAgICAkdGhpcy0+ZW5kcG9pbnQgPSAkZW5kcG9pbnQ7CiAgICAgICAgaWYgKCRlbmRwb2ludCA9PT0gbnVsbCkgewogICAgICAgICAgICAkdGhpcy0+aWRlbnRpdHlfdXJsID0gbnVsbDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkdGhpcy0+aWRlbnRpdHlfdXJsID0gJGVuZHBvaW50LT5jbGFpbWVkX2lkOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybiB0aGUgZGlzcGxheSBpZGVudGlmaWVyIGZvciB0aGlzIHJlc3BvbnNlLgogICAgICoKICAgICAqIFRoZSBkaXNwbGF5IGlkZW50aWZpZXIgaXMgcmVsYXRlZCB0byB0aGUgQ2xhaW1lZCBJZGVudGlmaWVyLCBidXQgdGhlCiAgICAgKiB0d28gYXJlIG5vdCBhbHdheXMgaWRlbnRpY2FsLiAgVGhlIGRpc3BsYXkgaWRlbnRpZmllciBpcyBzb21ldGhpbmcgdGhlCiAgICAgKiB1c2VyIHNob3VsZCByZWNvZ25pemUgYXMgd2hhdCB0aGV5IGVudGVyZWQsIHdoZXJlYXMgdGhlIHJlc3BvbnNlJ3MKICAgICAqIGNsYWltZWQgaWRlbnRpZmllciAoaW4gdGhlIGlkZW50aXR5X3VybCBhdHRyaWJ1dGUpIG1heSBoYXZlIGV4dHJhCiAgICAgKiBpbmZvcm1hdGlvbiBmb3IgYmV0dGVyIHBlcnNpc3RlbmNlLgogICAgICoKICAgICAqIFVSTHMgd2lsbCBiZSBzdHJpcHBlZCBvZiB0aGVpciBmcmFnbWVudHMgZm9yIGRpc3BsYXkuICBYUklzIHdpbGwKICAgICAqIGRpc3BsYXkgdGhlIGh1bWFuLXJlYWRhYmxlIGlkZW50aWZpZXIgKGktbmFtZSkgaW5zdGVhZCBvZiB0aGUKICAgICAqIHBlcnNpc3RlbnQgaWRlbnRpZmllciAoaS1udW1iZXIpLgogICAgICoKICAgICAqIFVzZSB0aGUgZGlzcGxheSBpZGVudGlmaWVyIGluIHlvdXIgdXNlciBpbnRlcmZhY2UuICBVc2UKICAgICAqIGlkZW50aXR5X3VybCBmb3IgcXVlcnlpbmcgeW91ciBkYXRhYmFzZSBvciBhdXRob3JpemF0aW9uIHNlcnZlci4KICAgICAqCiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldERpc3BsYXlJZGVudGlmaWVyKCkKICAgIHsKICAgICAgICBpZiAoJHRoaXMtPmVuZHBvaW50ICE9PSBudWxsKSB7CiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+ZW5kcG9pbnQtPmdldERpc3BsYXlJZGVudGlmaWVyKCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBudWxsOwogICAgfQp9CgovKioKICogQSByZXNwb25zZSB3aXRoIGEgc3RhdHVzIG9mIEF1dGhfT3BlbklEX1NVQ0NFU1MuIEluZGljYXRlcyB0aGF0CiAqIHRoaXMgcmVxdWVzdCBpcyBhIHN1Y2Nlc3NmdWwgYWNrbm93bGVkZ2VtZW50IGZyb20gdGhlIE9wZW5JRCBzZXJ2ZXIKICogdGhhdCB0aGUgc3VwcGxpZWQgVVJMIGlzLCBpbmRlZWQgY29udHJvbGxlZCBieSB0aGUgcmVxdWVzdGluZwogKiBhZ2VudC4gIFRoaXMgaGFzIHRocmVlIHJlbGV2YW50IGF0dHJpYnV0ZXM6CiAqCiAqIGNsYWltZWRfaWQgLSBUaGUgaWRlbnRpdHkgVVJMIHRoYXQgaGFzIGJlZW4gYXV0aGVudGljYXRlZAogKgogKiBzaWduZWRfYXJncyAtIFRoZSBhcmd1bWVudHMgaW4gdGhlIHNlcnZlcidzIHJlc3BvbnNlIHRoYXQgd2VyZQogKiBzaWduZWQgYW5kIHZlcmlmaWVkLgogKgogKiBzdGF0dXMgLSBBdXRoX09wZW5JRF9TVUNDRVNTLgogKgogKiBAcGFja2FnZSBPcGVuSUQKICovCmNsYXNzIEF1dGhfT3BlbklEX1N1Y2Nlc3NSZXNwb25zZSBleHRlbmRzIEF1dGhfT3BlbklEX0NvbnN1bWVyUmVzcG9uc2UgewogICAgdmFyICRzdGF0dXMgPSBBdXRoX09wZW5JRF9TVUNDRVNTOwoKICAgIC8qKgogICAgICogQGFjY2VzcyBwcml2YXRlCiAgICAgKi8KICAgIGZ1bmN0aW9uIEF1dGhfT3BlbklEX1N1Y2Nlc3NSZXNwb25zZSgkZW5kcG9pbnQsICRtZXNzYWdlLCAkc2lnbmVkX2FyZ3M9bnVsbCkKICAgIHsKICAgICAgICAkdGhpcy0+ZW5kcG9pbnQgPSAkZW5kcG9pbnQ7CiAgICAgICAgJHRoaXMtPmlkZW50aXR5X3VybCA9ICRlbmRwb2ludC0+Y2xhaW1lZF9pZDsKICAgICAgICAkdGhpcy0+c2lnbmVkX2FyZ3MgPSAkc2lnbmVkX2FyZ3M7CiAgICAgICAgJHRoaXMtPm1lc3NhZ2UgPSAkbWVzc2FnZTsKCiAgICAgICAgaWYgKCR0aGlzLT5zaWduZWRfYXJncyA9PT0gbnVsbCkgewogICAgICAgICAgICAkdGhpcy0+c2lnbmVkX2FyZ3MgPSBhcnJheSgpOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEV4dHJhY3Qgc2lnbmVkIGV4dGVuc2lvbiBkYXRhIGZyb20gdGhlIHNlcnZlcidzIHJlc3BvbnNlLgogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgJHByZWZpeCBUaGUgZXh0ZW5zaW9uIG5hbWVzcGFjZSBmcm9tIHdoaWNoIHRvCiAgICAgKiBleHRyYWN0IHRoZSBleHRlbnNpb24gZGF0YS4KICAgICAqLwogICAgZnVuY3Rpb24gZXh0ZW5zaW9uUmVzcG9uc2UoJG5hbWVzcGFjZV91cmksICRyZXF1aXJlX3NpZ25lZCkKICAgIHsKICAgICAgICBpZiAoJHJlcXVpcmVfc2lnbmVkKSB7CiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+Z2V0U2lnbmVkTlMoJG5hbWVzcGFjZV91cmkpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+bWVzc2FnZS0+Z2V0QXJncygkbmFtZXNwYWNlX3VyaSk7CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGlzT3BlbklEMSgpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5tZXNzYWdlLT5pc09wZW5JRDEoKTsKICAgIH0KCiAgICBmdW5jdGlvbiBpc1NpZ25lZCgkbnNfdXJpLCAkbnNfa2V5KQogICAgewogICAgICAgIC8vIFJldHVybiB3aGV0aGVyIGEgcGFydGljdWxhciBrZXkgaXMgc2lnbmVkLCByZWdhcmRsZXNzIG9mCiAgICAgICAgLy8gaXRzIG5hbWVzcGFjZSBhbGlhcwogICAgICAgIHJldHVybiBpbl9hcnJheSgkdGhpcy0+bWVzc2FnZS0+Z2V0S2V5KCRuc191cmksICRuc19rZXkpLAogICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+c2lnbmVkX2FyZ3MpOwogICAgfQoKICAgIGZ1bmN0aW9uIGdldFNpZ25lZCgkbnNfdXJpLCAkbnNfa2V5LCAkZGVmYXVsdCA9IG51bGwpCiAgICB7CiAgICAgICAgLy8gUmV0dXJuIHRoZSBzcGVjaWZpZWQgc2lnbmVkIGZpZWxkIGlmIGF2YWlsYWJsZSwgb3RoZXJ3aXNlCiAgICAgICAgLy8gcmV0dXJuIGRlZmF1bHQKICAgICAgICBpZiAoJHRoaXMtPmlzU2lnbmVkKCRuc191cmksICRuc19rZXkpKSB7CiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+bWVzc2FnZS0+Z2V0QXJnKCRuc191cmksICRuc19rZXksICRkZWZhdWx0KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gJGRlZmF1bHQ7CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGdldFNpZ25lZE5TKCRuc191cmkpCiAgICB7CiAgICAgICAgJGFyZ3MgPSBhcnJheSgpOwoKICAgICAgICAkbXNnX2FyZ3MgPSAkdGhpcy0+bWVzc2FnZS0+Z2V0QXJncygkbnNfdXJpKTsKICAgICAgICBpZiAoQXV0aF9PcGVuSUQ6OmlzRmFpbHVyZSgkbXNnX2FyZ3MpKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KCiAgICAgICAgZm9yZWFjaCAoJG1zZ19hcmdzIGFzICRrZXkgPT4gJHZhbHVlKSB7CiAgICAgICAgICAgIGlmICghJHRoaXMtPmlzU2lnbmVkKCRuc191cmksICRrZXkpKSB7CiAgICAgICAgICAgICAgICB1bnNldCgkbXNnX2FyZ3NbJGtleV0pOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJG1zZ19hcmdzOwogICAgfQoKICAgIC8qKgogICAgICogR2V0IHRoZSBvcGVuaWQucmV0dXJuX3RvIGFyZ3VtZW50IGZyb20gdGhpcyByZXNwb25zZS4KICAgICAqCiAgICAgKiBUaGlzIGlzIHVzZWZ1bCBmb3IgdmVyaWZ5aW5nIHRoYXQgdGhpcyByZXF1ZXN0IHdhcyBpbml0aWF0ZWQgYnkKICAgICAqIHRoaXMgY29uc3VtZXIuCiAgICAgKgogICAgICogQHJldHVybiBzdHJpbmcgJHJldHVybl90byBUaGUgcmV0dXJuX3RvIFVSTCBzdXBwbGllZCB0byB0aGUKICAgICAqIHNlcnZlciBvbiB0aGUgaW5pdGlhbCByZXF1ZXN0LCBvciBudWxsIGlmIHRoZSByZXNwb25zZSBkaWQgbm90CiAgICAgKiBjb250YWluIGFuICdvcGVuaWQucmV0dXJuX3RvJyBhcmd1bWVudC4KICAgICovCiAgICBmdW5jdGlvbiBnZXRSZXR1cm5UbygpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5nZXRTaWduZWQoQXV0aF9PcGVuSURfT1BFTklEX05TLCAncmV0dXJuX3RvJyk7CiAgICB9Cn0KCi8qKgogKiBBIHJlc3BvbnNlIHdpdGggYSBzdGF0dXMgb2YgQXV0aF9PcGVuSURfRkFJTFVSRS4gSW5kaWNhdGVzIHRoYXQgdGhlCiAqIE9wZW5JRCBwcm90b2NvbCBoYXMgZmFpbGVkLiBUaGlzIGNvdWxkIGJlIGxvY2FsbHkgb3IgcmVtb3RlbHkKICogdHJpZ2dlcmVkLiAgVGhpcyBoYXMgdGhyZWUgcmVsZXZhbnQgYXR0cmlidXRlczoKICoKICogY2xhaW1lZF9pZCAtIFRoZSBpZGVudGl0eSBVUkwgZm9yIHdoaWNoIGF1dGhlbnRpY2F0aW9uIHdhcwogKiBhdHRlbXB0ZWQsIGlmIGl0IGNhbiBiZSBkZXRlcm1pbmVkLiAgT3RoZXJ3aXNlLCBudWxsLgogKgogKiBtZXNzYWdlIC0gQSBtZXNzYWdlIGluZGljYXRpbmcgd2h5IHRoZSByZXF1ZXN0IGZhaWxlZCwgaWYgb25lIGlzCiAqIHN1cHBsaWVkLiAgT3RoZXJ3aXNlLCBudWxsLgogKgogKiBzdGF0dXMgLSBBdXRoX09wZW5JRF9GQUlMVVJFLgogKgogKiBAcGFja2FnZSBPcGVuSUQKICovCmNsYXNzIEF1dGhfT3BlbklEX0ZhaWx1cmVSZXNwb25zZSBleHRlbmRzIEF1dGhfT3BlbklEX0NvbnN1bWVyUmVzcG9uc2UgewogICAgdmFyICRzdGF0dXMgPSBBdXRoX09wZW5JRF9GQUlMVVJFOwoKICAgIGZ1bmN0aW9uIEF1dGhfT3BlbklEX0ZhaWx1cmVSZXNwb25zZSgkZW5kcG9pbnQsICRtZXNzYWdlID0gbnVsbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkY29udGFjdCA9IG51bGwsICRyZWZlcmVuY2UgPSBudWxsKQogICAgewogICAgICAgICR0aGlzLT5zZXRFbmRwb2ludCgkZW5kcG9pbnQpOwogICAgICAgICR0aGlzLT5tZXNzYWdlID0gJG1lc3NhZ2U7CiAgICAgICAgJHRoaXMtPmNvbnRhY3QgPSAkY29udGFjdDsKICAgICAgICAkdGhpcy0+cmVmZXJlbmNlID0gJHJlZmVyZW5jZTsKICAgIH0KfQoKLyoqCiAqIEEgc3BlY2lmaWMsIGludGVybmFsIGZhaWx1cmUgdXNlZCB0byBkZXRlY3QgdHlwZSBVUkkgbWlzbWF0Y2guCiAqCiAqIEBwYWNrYWdlIE9wZW5JRAogKi8KY2xhc3MgQXV0aF9PcGVuSURfVHlwZVVSSU1pc21hdGNoIGV4dGVuZHMgQXV0aF9PcGVuSURfRmFpbHVyZVJlc3BvbnNlIHsKfQoKLyoqCiAqIEV4Y2VwdGlvbiB0aGF0IGlzIHJhaXNlZCB3aGVuIHRoZSBzZXJ2ZXIgcmV0dXJucyBhIDQwMCByZXNwb25zZQogKiBjb2RlIHRvIGEgZGlyZWN0IHJlcXVlc3QuCiAqCiAqIEBwYWNrYWdlIE9wZW5JRAogKi8KY2xhc3MgQXV0aF9PcGVuSURfU2VydmVyRXJyb3JDb250YWluZXIgewogICAgZnVuY3Rpb24gQXV0aF9PcGVuSURfU2VydmVyRXJyb3JDb250YWluZXIoJGVycm9yX3RleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZXJyb3JfY29kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRtZXNzYWdlKQogICAgewogICAgICAgICR0aGlzLT5lcnJvcl90ZXh0ID0gJGVycm9yX3RleHQ7CiAgICAgICAgJHRoaXMtPmVycm9yX2NvZGUgPSAkZXJyb3JfY29kZTsKICAgICAgICAkdGhpcy0+bWVzc2FnZSA9ICRtZXNzYWdlOwogICAgfQoKICAgIC8qKgogICAgICogQGFjY2VzcyBwcml2YXRlCiAgICAgKi8KICAgIHN0YXRpYyBmdW5jdGlvbiBmcm9tTWVzc2FnZSgkbWVzc2FnZSkKICAgIHsKICAgICAgICAkZXJyb3JfdGV4dCA9ICRtZXNzYWdlLT5nZXRBcmcoCiAgICAgICAgICAgQXV0aF9PcGVuSURfT1BFTklEX05TLCAnZXJyb3InLCAnPG5vIGVycm9yIG1lc3NhZ2Ugc3VwcGxpZWQ+Jyk7CiAgICAgICAgJGVycm9yX2NvZGUgPSAkbWVzc2FnZS0+Z2V0QXJnKEF1dGhfT3BlbklEX09QRU5JRF9OUywgJ2Vycm9yX2NvZGUnKTsKICAgICAgICByZXR1cm4gbmV3IEF1dGhfT3BlbklEX1NlcnZlckVycm9yQ29udGFpbmVyKCRlcnJvcl90ZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGVycm9yX2NvZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbWVzc2FnZSk7CiAgICB9Cn0KCi8qKgogKiBBIHJlc3BvbnNlIHdpdGggYSBzdGF0dXMgb2YgQXV0aF9PcGVuSURfQ0FOQ0VMLiBJbmRpY2F0ZXMgdGhhdCB0aGUKICogdXNlciBjYW5jZWxsZWQgdGhlIE9wZW5JRCBhdXRoZW50aWNhdGlvbiByZXF1ZXN0LiAgVGhpcyBoYXMgdHdvCiAqIHJlbGV2YW50IGF0dHJpYnV0ZXM6CiAqCiAqIGNsYWltZWRfaWQgLSBUaGUgaWRlbnRpdHkgVVJMIGZvciB3aGljaCBhdXRoZW50aWNhdGlvbiB3YXMKICogYXR0ZW1wdGVkLCBpZiBpdCBjYW4gYmUgZGV0ZXJtaW5lZC4gIE90aGVyd2lzZSwgbnVsbC4KICoKICogc3RhdHVzIC0gQXV0aF9PcGVuSURfU1VDQ0VTUy4KICoKICogQHBhY2thZ2UgT3BlbklECiAqLwpjbGFzcyBBdXRoX09wZW5JRF9DYW5jZWxSZXNwb25zZSBleHRlbmRzIEF1dGhfT3BlbklEX0NvbnN1bWVyUmVzcG9uc2UgewogICAgdmFyICRzdGF0dXMgPSBBdXRoX09wZW5JRF9DQU5DRUw7CgogICAgZnVuY3Rpb24gQXV0aF9PcGVuSURfQ2FuY2VsUmVzcG9uc2UoJGVuZHBvaW50KQogICAgewogICAgICAgICR0aGlzLT5zZXRFbmRwb2ludCgkZW5kcG9pbnQpOwogICAgfQp9CgovKioKICogQSByZXNwb25zZSB3aXRoIGEgc3RhdHVzIG9mIEF1dGhfT3BlbklEX1NFVFVQX05FRURFRC4gSW5kaWNhdGVzCiAqIHRoYXQgdGhlIHJlcXVlc3Qgd2FzIGluIGltbWVkaWF0ZSBtb2RlLCBhbmQgdGhlIHNlcnZlciBpcyB1bmFibGUgdG8KICogYXV0aGVudGljYXRlIHRoZSB1c2VyIHdpdGhvdXQgZnVydGhlciBpbnRlcmFjdGlvbi4KICoKICogY2xhaW1lZF9pZCAtIFRoZSBpZGVudGl0eSBVUkwgZm9yIHdoaWNoIGF1dGhlbnRpY2F0aW9uIHdhcwogKiBhdHRlbXB0ZWQuCiAqCiAqIHNldHVwX3VybCAtIEEgVVJMIHRoYXQgY2FuIGJlIHVzZWQgdG8gc2VuZCB0aGUgdXNlciB0byB0aGUgc2VydmVyCiAqIHRvIHNldCB1cCBmb3IgYXV0aGVudGljYXRpb24uIFRoZSB1c2VyIHNob3VsZCBiZSByZWRpcmVjdGVkIGluIHRvCiAqIHRoZSBzZXR1cF91cmwsIGVpdGhlciBpbiB0aGUgY3VycmVudCB3aW5kb3cgb3IgaW4gYSBuZXcgYnJvd3NlcgogKiB3aW5kb3cuICBOdWxsIGluIE9wZW5JRCAyLgogKgogKiBzdGF0dXMgLSBBdXRoX09wZW5JRF9TRVRVUF9ORUVERUQuCiAqCiAqIEBwYWNrYWdlIE9wZW5JRAogKi8KY2xhc3MgQXV0aF9PcGVuSURfU2V0dXBOZWVkZWRSZXNwb25zZSBleHRlbmRzIEF1dGhfT3BlbklEX0NvbnN1bWVyUmVzcG9uc2UgewogICAgdmFyICRzdGF0dXMgPSBBdXRoX09wZW5JRF9TRVRVUF9ORUVERUQ7CgogICAgZnVuY3Rpb24gQXV0aF9PcGVuSURfU2V0dXBOZWVkZWRSZXNwb25zZSgkZW5kcG9pbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzZXR1cF91cmwgPSBudWxsKQogICAgewogICAgICAgICR0aGlzLT5zZXRFbmRwb2ludCgkZW5kcG9pbnQpOwogICAgICAgICR0aGlzLT5zZXR1cF91cmwgPSAkc2V0dXBfdXJsOwogICAgfQp9CgoK]]></data>
	</file>
	<file>
	  <filename>/openid-php-openid-782224d/Auth/OpenID/CryptUtil.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBDcnlwdFV0aWw6IEEgc3VpdGUgb2Ygd3JhcHBlciB1dGlsaXR5IGZ1bmN0aW9ucyBmb3IgdGhlIE9wZW5JRAogKiBsaWJyYXJ5LgogKgogKiBQSFAgdmVyc2lvbnMgNCBhbmQgNQogKgogKiBMSUNFTlNFOiBTZWUgdGhlIENPUFlJTkcgZmlsZSBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbi4KICoKICogQGFjY2VzcyBwcml2YXRlCiAqIEBwYWNrYWdlIE9wZW5JRAogKiBAYXV0aG9yIEphblJhaW4sIEluYy4gPG9wZW5pZEBqYW5yYWluLmNvbT4KICogQGNvcHlyaWdodCAyMDA1LTIwMDggSmFucmFpbiwgSW5jLgogKiBAbGljZW5zZSBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgQXBhY2hlCiAqLwoKaWYgKCFkZWZpbmVkKCdBdXRoX09wZW5JRF9SQU5EX1NPVVJDRScpKSB7CiAgICAvKioKICAgICAqIFRoZSBmaWxlbmFtZSBmb3IgYSBzb3VyY2Ugb2YgcmFuZG9tIGJ5dGVzLiBEZWZpbmUgdGhpcyB5b3Vyc2VsZgogICAgICogaWYgeW91IGhhdmUgYSBkaWZmZXJlbnQgc291cmNlIG9mIHJhbmRvbW5lc3MuCiAgICAgKi8KICAgIGRlZmluZSgnQXV0aF9PcGVuSURfUkFORF9TT1VSQ0UnLCAnL2Rldi91cmFuZG9tJyk7Cn0KCmNsYXNzIEF1dGhfT3BlbklEX0NyeXB0VXRpbCB7CiAgICAvKioKICAgICAqIEdldCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiByYW5kb20gYnl0ZXMuCiAgICAgKgogICAgICogQXR0ZW1wdHMgdG8gdXNlIGEgY3J5cHRvZ3JhcGhpY2FsbHkgc2VjdXJlIChub3QgcHJlZGljdGFibGUpCiAgICAgKiBzb3VyY2Ugb2YgcmFuZG9tbmVzcyBpZiBhdmFpbGFibGUuIElmIHRoZXJlIGlzIG5vIGhpZ2gtZW50cm9weQogICAgICogcmFuZG9tbmVzcyBzb3VyY2UgYXZhaWxhYmxlLCBpdCB3aWxsIGZhaWwuIEFzIGEgbGFzdCByZXNvcnQsCiAgICAgKiBmb3Igbm9uLWNyaXRpY2FsIHN5c3RlbXMsIGRlZmluZQogICAgICogPGNvZGU+QXV0aF9PcGVuSURfUkFORF9TT1VSQ0U8L2NvZGU+IGFzIDxjb2RlPm51bGw8L2NvZGU+LCBhbmQKICAgICAqIHRoZSBjb2RlIHdpbGwgZmFsbCBiYWNrIG9uIGEgcHNldWRvLXJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yLgogICAgICoKICAgICAqIEBwYXJhbSBpbnQgJG51bV9ieXRlcyBUaGUgbGVuZ3RoIG9mIHRoZSByZXR1cm4gdmFsdWUKICAgICAqIEByZXR1cm4gc3RyaW5nICRieXRlcyByYW5kb20gYnl0ZXMKICAgICAqLwogICAgc3RhdGljIGZ1bmN0aW9uIGdldEJ5dGVzKCRudW1fYnl0ZXMpCiAgICB7CiAgICAgICAgc3RhdGljICRmID0gbnVsbDsKICAgICAgICAkYnl0ZXMgPSAnJzsKICAgICAgICBpZiAoJGYgPT09IG51bGwpIHsKICAgICAgICAgICAgaWYgKEF1dGhfT3BlbklEX1JBTkRfU09VUkNFID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICAkZiA9IGZhbHNlOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJGYgPSBAZm9wZW4oQXV0aF9PcGVuSURfUkFORF9TT1VSQ0UsICJyIik7CiAgICAgICAgICAgICAgICBpZiAoJGYgPT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAgICAgJG1zZyA9ICdEZWZpbmUgQXV0aF9PcGVuSURfUkFORF9TT1VSQ0UgYXMgbnVsbCB0byAnIC4KICAgICAgICAgICAgICAgICAgICAgICAgJyBjb250aW51ZSB3aXRoIGFuIGluc2VjdXJlIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yLic7CiAgICAgICAgICAgICAgICAgICAgdHJpZ2dlcl9lcnJvcigkbXNnLCBFX1VTRVJfRVJST1IpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICgkZiA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgLy8gcHNldWRvcmFuZG9tIHVzZWQKICAgICAgICAgICAgJGJ5dGVzID0gJyc7CiAgICAgICAgICAgIGZvciAoJGkgPSAwOyAkaSA8ICRudW1fYnl0ZXM7ICRpICs9IDQpIHsKICAgICAgICAgICAgICAgICRieXRlcyAuPSBwYWNrKCdMJywgbXRfcmFuZCgpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkYnl0ZXMgPSBzdWJzdHIoJGJ5dGVzLCAwLCAkbnVtX2J5dGVzKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkYnl0ZXMgPSBmcmVhZCgkZiwgJG51bV9ieXRlcyk7CiAgICAgICAgfQogICAgICAgIHJldHVybiAkYnl0ZXM7CiAgICB9CgogICAgLyoqCiAgICAgKiBQcm9kdWNlIGEgc3RyaW5nIG9mIGxlbmd0aCByYW5kb20gYnl0ZXMsIGNob3NlbiBmcm9tIGNocnMuICBJZgogICAgICogJGNocnMgaXMgbnVsbCwgdGhlIHJlc3VsdGluZyBzdHJpbmcgbWF5IGNvbnRhaW4gYW55IGNoYXJhY3RlcnMuCiAgICAgKgogICAgICogQHBhcmFtIGludGVnZXIgJGxlbmd0aCBUaGUgbGVuZ3RoIG9mIHRoZSByZXN1bHRpbmcKICAgICAqIHJhbmRvbWx5LWdlbmVyYXRlZCBzdHJpbmcKICAgICAqIEBwYXJhbSBzdHJpbmcgJGNocnMgQSBzdHJpbmcgb2YgY2hhcmFjdGVycyBmcm9tIHdoaWNoIHRvIGNob29zZQogICAgICogdG8gYnVpbGQgdGhlIG5ldyBzdHJpbmcKICAgICAqIEByZXR1cm4gc3RyaW5nICRyZXN1bHQgQSBzdHJpbmcgb2YgcmFuZG9tbHktY2hvc2VuIGNoYXJhY3RlcnMKICAgICAqIGZyb20gJGNocnMKICAgICAqLwogICAgc3RhdGljIGZ1bmN0aW9uIHJhbmRvbVN0cmluZygkbGVuZ3RoLCAkcG9wdWxhdGlvbiA9IG51bGwpCiAgICB7CiAgICAgICAgaWYgKCRwb3B1bGF0aW9uID09PSBudWxsKSB7CiAgICAgICAgICAgIHJldHVybiBBdXRoX09wZW5JRF9DcnlwdFV0aWw6OmdldEJ5dGVzKCRsZW5ndGgpOwogICAgICAgIH0KCiAgICAgICAgJHBvcHNpemUgPSBzdHJsZW4oJHBvcHVsYXRpb24pOwoKICAgICAgICBpZiAoJHBvcHNpemUgPiAyNTYpIHsKICAgICAgICAgICAgJG1zZyA9ICdNb3JlIHRoYW4gMjU2IGNoYXJhY3RlcnMgc3VwcGxpZWQgdG8gJyAuIF9fRlVOQ1RJT05fXzsKICAgICAgICAgICAgdHJpZ2dlcl9lcnJvcigkbXNnLCBFX1VTRVJfRVJST1IpOwogICAgICAgIH0KCiAgICAgICAgJGR1cGxpY2F0ZSA9IDI1NiAlICRwb3BzaXplOwoKICAgICAgICAkc3RyID0gIiI7CiAgICAgICAgZm9yICgkaSA9IDA7ICRpIDwgJGxlbmd0aDsgJGkrKykgewogICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICAkbiA9IG9yZChBdXRoX09wZW5JRF9DcnlwdFV0aWw6OmdldEJ5dGVzKDEpKTsKICAgICAgICAgICAgfSB3aGlsZSAoJG4gPCAkZHVwbGljYXRlKTsKCiAgICAgICAgICAgICRuICU9ICRwb3BzaXplOwogICAgICAgICAgICAkc3RyIC49ICRwb3B1bGF0aW9uWyRuXTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkc3RyOwogICAgfQp9Cgo=]]></data>
	</file>
	<file>
	  <filename>/openid-php-openid-782224d/Auth/OpenID/DatabaseConnection.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBUaGUgQXV0aF9PcGVuSURfRGF0YWJhc2VDb25uZWN0aW9uIGNsYXNzLCB3aGljaCBpcyB1c2VkIHRvIGVtdWxhdGUKICogYSBQRUFSIGRhdGFiYXNlIGNvbm5lY3Rpb24uCiAqCiAqIEBwYWNrYWdlIE9wZW5JRAogKiBAYXV0aG9yIEphblJhaW4sIEluYy4gPG9wZW5pZEBqYW5yYWluLmNvbT4KICogQGNvcHlyaWdodCAyMDA1LTIwMDggSmFucmFpbiwgSW5jLgogKiBAbGljZW5zZSBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgQXBhY2hlCiAqLwoKLyoqCiAqIEFuIGVtcHR5IGJhc2UgY2xhc3MgaW50ZW5kZWQgdG8gZW11bGF0ZSBQRUFSIGNvbm5lY3Rpb24KICogZnVuY3Rpb25hbGl0eSBpbiBhcHBsaWNhdGlvbnMgdGhhdCBzdXBwbHkgdGhlaXIgb3duIGRhdGFiYXNlCiAqIGFic3RyYWN0aW9uIG1lY2hhbmlzbXMuICBTZWUge0BsaW5rIEF1dGhfT3BlbklEX1NRTFN0b3JlfSBmb3IgbW9yZQogKiBpbmZvcm1hdGlvbi4gIFlvdSBzaG91bGQgc3ViY2xhc3MgdGhpcyBjbGFzcyBpZiB5b3UgbmVlZCB0byBjcmVhdGUKICogYW4gU1FMIHN0b3JlIHRoYXQgbmVlZHMgdG8gYWNjZXNzIGl0cyBkYXRhYmFzZSB1c2luZyBhbgogKiBhcHBsaWNhdGlvbidzIGRhdGFiYXNlIGFic3RyYWN0aW9uIGxheWVyIGluc3RlYWQgb2YgYSBQRUFSIGRhdGFiYXNlCiAqIGNvbm5lY3Rpb24uICBBbnkgc3ViY2xhc3Mgb2YgQXV0aF9PcGVuSURfRGF0YWJhc2VDb25uZWN0aW9uIE1VU1QKICogYWRoZXJlIHRvIHRoZSBpbnRlcmZhY2Ugc3BlY2lmaWVkIGhlcmUuCiAqCiAqIEBwYWNrYWdlIE9wZW5JRAogKi8KY2xhc3MgQXV0aF9PcGVuSURfRGF0YWJhc2VDb25uZWN0aW9uIHsKICAgIC8qKgogICAgICogU2V0cyBhdXRvLWNvbW1pdCBtb2RlIG9uIHRoaXMgZGF0YWJhc2UgY29ubmVjdGlvbi4KICAgICAqCiAgICAgKiBAcGFyYW0gYm9vbCAkbW9kZSBUcnVlIGlmIGF1dG8tY29tbWl0IGlzIHRvIGJlIHVzZWQ7IGZhbHNlIGlmCiAgICAgKiBub3QuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGF1dG9Db21taXQoJG1vZGUpCiAgICB7CiAgICB9CgogICAgLyoqCiAgICAgKiBSdW4gYW4gU1FMIHF1ZXJ5IHdpdGggdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzLCBpZiBhbnkuCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkc3FsIEFuIFNRTCBzdHJpbmcgd2l0aCBwbGFjZWhvbGRlcnMuICBUaGUKICAgICAqIHBsYWNlaG9sZGVycyBhcmUgYXNzdW1lZCB0byBiZSBzcGVjaWZpYyB0byB0aGUgZGF0YWJhc2UgZW5naW5lCiAgICAgKiBmb3IgdGhpcyBjb25uZWN0aW9uLgogICAgICoKICAgICAqIEBwYXJhbSBhcnJheSAkcGFyYW1zIEFuIGFycmF5IG9mIHBhcmFtZXRlcnMgdG8gaW5zZXJ0IGludG8gdGhlCiAgICAgKiBTUUwgc3RyaW5nIHVzaW5nIHRoaXMgY29ubmVjdGlvbidzIGVzY2FwaW5nIG1lY2hhbmlzbS4KICAgICAqCiAgICAgKiBAcmV0dXJuIG1peGVkICRyZXN1bHQgVGhlIHJlc3VsdCBvZiBjYWxsaW5nIHRoaXMgY29ubmVjdGlvbidzCiAgICAgKiBpbnRlcm5hbCBxdWVyeSBmdW5jdGlvbi4gIFRoZSB0eXBlIG9mIHJlc3VsdCBkZXBlbmRzIG9uIHRoZQogICAgICogdW5kZXJseWluZyBkYXRhYmFzZSBlbmdpbmUuICBUaGlzIG1ldGhvZCBpcyB1c3VhbGx5IHVzZWQgd2hlbgogICAgICogdGhlIHJlc3VsdCBvZiBhIHF1ZXJ5IGlzIG5vdCBpbXBvcnRhbnQsIGxpa2UgYSBEREwgcXVlcnkuCiAgICAgKi8KICAgIGZ1bmN0aW9uIHF1ZXJ5KCRzcWwsICRwYXJhbXMgPSBhcnJheSgpKQogICAgewogICAgfQoKICAgIC8qKgogICAgICogU3RhcnRzIGEgdHJhbnNhY3Rpb24gb24gdGhpcyBjb25uZWN0aW9uLCBpZiBzdXBwb3J0ZWQuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGJlZ2luKCkKICAgIHsKICAgIH0KCiAgICAvKioKICAgICAqIENvbW1pdHMgYSB0cmFuc2FjdGlvbiBvbiB0aGlzIGNvbm5lY3Rpb24sIGlmIHN1cHBvcnRlZC4KICAgICAqLwogICAgZnVuY3Rpb24gY29tbWl0KCkKICAgIHsKICAgIH0KCiAgICAvKioKICAgICAqIFBlcmZvcm1zIGEgcm9sbGJhY2sgb24gdGhpcyBjb25uZWN0aW9uLCBpZiBzdXBwb3J0ZWQuCiAgICAgKi8KICAgIGZ1bmN0aW9uIHJvbGxiYWNrKCkKICAgIHsKICAgIH0KCiAgICAvKioKICAgICAqIFJ1biBhbiBTUUwgcXVlcnkgYW5kIHJldHVybiB0aGUgZmlyc3QgY29sdW1uIG9mIHRoZSBmaXJzdCByb3cKICAgICAqIG9mIHRoZSByZXN1bHQgc2V0LCBpZiBhbnkuCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkc3FsIEFuIFNRTCBzdHJpbmcgd2l0aCBwbGFjZWhvbGRlcnMuICBUaGUKICAgICAqIHBsYWNlaG9sZGVycyBhcmUgYXNzdW1lZCB0byBiZSBzcGVjaWZpYyB0byB0aGUgZGF0YWJhc2UgZW5naW5lCiAgICAgKiBmb3IgdGhpcyBjb25uZWN0aW9uLgogICAgICoKICAgICAqIEBwYXJhbSBhcnJheSAkcGFyYW1zIEFuIGFycmF5IG9mIHBhcmFtZXRlcnMgdG8gaW5zZXJ0IGludG8gdGhlCiAgICAgKiBTUUwgc3RyaW5nIHVzaW5nIHRoaXMgY29ubmVjdGlvbidzIGVzY2FwaW5nIG1lY2hhbmlzbS4KICAgICAqCiAgICAgKiBAcmV0dXJuIG1peGVkICRyZXN1bHQgVGhlIHZhbHVlIG9mIHRoZSBmaXJzdCBjb2x1bW4gb2YgdGhlCiAgICAgKiBmaXJzdCByb3cgb2YgdGhlIHJlc3VsdCBzZXQuICBGYWxzZSBpZiBubyBzdWNoIHJlc3VsdCB3YXMKICAgICAqIGZvdW5kLgogICAgICovCiAgICBmdW5jdGlvbiBnZXRPbmUoJHNxbCwgJHBhcmFtcyA9IGFycmF5KCkpCiAgICB7CiAgICB9CgogICAgLyoqCiAgICAgKiBSdW4gYW4gU1FMIHF1ZXJ5IGFuZCByZXR1cm4gdGhlIGZpcnN0IHJvdyBvZiB0aGUgcmVzdWx0IHNldCwgaWYKICAgICAqIGFueS4KICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICRzcWwgQW4gU1FMIHN0cmluZyB3aXRoIHBsYWNlaG9sZGVycy4gIFRoZQogICAgICogcGxhY2Vob2xkZXJzIGFyZSBhc3N1bWVkIHRvIGJlIHNwZWNpZmljIHRvIHRoZSBkYXRhYmFzZSBlbmdpbmUKICAgICAqIGZvciB0aGlzIGNvbm5lY3Rpb24uCiAgICAgKgogICAgICogQHBhcmFtIGFycmF5ICRwYXJhbXMgQW4gYXJyYXkgb2YgcGFyYW1ldGVycyB0byBpbnNlcnQgaW50byB0aGUKICAgICAqIFNRTCBzdHJpbmcgdXNpbmcgdGhpcyBjb25uZWN0aW9uJ3MgZXNjYXBpbmcgbWVjaGFuaXNtLgogICAgICoKICAgICAqIEByZXR1cm4gYXJyYXkgJHJlc3VsdCBUaGUgZmlyc3Qgcm93IG9mIHRoZSByZXN1bHQgc2V0LCBpZiBhbnksCiAgICAgKiBrZXllZCBvbiBjb2x1bW4gbmFtZS4gIEZhbHNlIGlmIG5vIHN1Y2ggcmVzdWx0IHdhcyBmb3VuZC4KICAgICAqLwogICAgZnVuY3Rpb24gZ2V0Um93KCRzcWwsICRwYXJhbXMgPSBhcnJheSgpKQogICAgewogICAgfQoKICAgIC8qKgogICAgICogUnVuIGFuIFNRTCBxdWVyeSB3aXRoIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycywgaWYgYW55LgogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgJHNxbCBBbiBTUUwgc3RyaW5nIHdpdGggcGxhY2Vob2xkZXJzLiAgVGhlCiAgICAgKiBwbGFjZWhvbGRlcnMgYXJlIGFzc3VtZWQgdG8gYmUgc3BlY2lmaWMgdG8gdGhlIGRhdGFiYXNlIGVuZ2luZQogICAgICogZm9yIHRoaXMgY29ubmVjdGlvbi4KICAgICAqCiAgICAgKiBAcGFyYW0gYXJyYXkgJHBhcmFtcyBBbiBhcnJheSBvZiBwYXJhbWV0ZXJzIHRvIGluc2VydCBpbnRvIHRoZQogICAgICogU1FMIHN0cmluZyB1c2luZyB0aGlzIGNvbm5lY3Rpb24ncyBlc2NhcGluZyBtZWNoYW5pc20uCiAgICAgKgogICAgICogQHJldHVybiBhcnJheSAkcmVzdWx0IEFuIGFycmF5IG9mIGFycmF5cyByZXByZXNlbnRpbmcgdGhlCiAgICAgKiByZXN1bHQgb2YgdGhlIHF1ZXJ5OyBlYWNoIGFycmF5IGlzIGtleWVkIG9uIGNvbHVtbiBuYW1lLgogICAgICovCiAgICBmdW5jdGlvbiBnZXRBbGwoJHNxbCwgJHBhcmFtcyA9IGFycmF5KCkpCiAgICB7CiAgICB9Cn0KCg==]]></data>
	</file>
	<file>
	  <filename>/openid-php-openid-782224d/Auth/OpenID/DiffieHellman.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBUaGUgT3BlbklEIGxpYnJhcnkncyBEaWZmaWUtSGVsbG1hbiBpbXBsZW1lbnRhdGlvbi4KICoKICogUEhQIHZlcnNpb25zIDQgYW5kIDUKICoKICogTElDRU5TRTogU2VlIHRoZSBDT1BZSU5HIGZpbGUgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24uCiAqCiAqIEBhY2Nlc3MgcHJpdmF0ZQogKiBAcGFja2FnZSBPcGVuSUQKICogQGF1dGhvciBKYW5SYWluLCBJbmMuIDxvcGVuaWRAamFucmFpbi5jb20+CiAqIEBjb3B5cmlnaHQgMjAwNS0yMDA4IEphbnJhaW4sIEluYy4KICogQGxpY2Vuc2UgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIEFwYWNoZQogKi8KCnJlcXVpcmVfb25jZSAnQXV0aC9PcGVuSUQucGhwJzsKcmVxdWlyZV9vbmNlICdBdXRoL09wZW5JRC9CaWdNYXRoLnBocCc7CgpmdW5jdGlvbiBBdXRoX09wZW5JRF9nZXREZWZhdWx0TW9kKCkKewogICAgcmV0dXJuICcxNTUxNzI4OTgxODE0NzM2OTc0NzEyMzIyNTc3NjM3MTU1Mzk5MTU3MjQ4MDEnLgogICAgICAgICc5NjY5MTU0MDQ0Nzk3MDc3OTUzMTQwNTc2MjkzNzg1NDE5MTc1ODA2NTEyMjc0MjMnLgogICAgICAgICc2OTgxODg5OTM3Mjc4MTYxNTI2NDY2MzE0Mzg1NjE1OTU4MjU2ODgxODg4ODk5NTEnLgogICAgICAgICcyNzIxNTg4NDI2NzU0MTk5NTAzNDEyNTg3MDY1NTY1NDk4MDM1ODAxMDQ4NzA1MzcnLgogICAgICAgICc2ODE0NzY3MjY1MTMyNTU3NDcwNDA3NjU4NTc0NzkyOTEyOTE1NzIzMzQ1MTA2NDMnLgogICAgICAgICcyNDUwOTQ3MTUwMDcyMjk2MjEwOTQxOTQzNDk3ODM5MjU5ODQ3NjAzNzU1OTQ5ODUnLgogICAgICAgICc4NDgyNTMzNTkzMDU1ODU0Mzk2Mzg0NDMnOwp9CgpmdW5jdGlvbiBBdXRoX09wZW5JRF9nZXREZWZhdWx0R2VuKCkKewogICAgcmV0dXJuICcyJzsKfQoKLyoqCiAqIFRoZSBEaWZmaWUtSGVsbG1hbiBrZXkgZXhjaGFuZ2UgY2xhc3MuICBUaGlzIGNsYXNzIHJlbGllcyBvbgogKiB7QGxpbmsgQXV0aF9PcGVuSURfTWF0aExpYnJhcnl9IHRvIHBlcmZvcm0gbGFyZ2UgbnVtYmVyIG9wZXJhdGlvbnMuCiAqCiAqIEBhY2Nlc3MgcHJpdmF0ZQogKiBAcGFja2FnZSBPcGVuSUQKICovCmNsYXNzIEF1dGhfT3BlbklEX0RpZmZpZUhlbGxtYW4gewoKICAgIHZhciAkbW9kOwogICAgdmFyICRnZW47CiAgICB2YXIgJHByaXZhdGU7CiAgICB2YXIgJGxpYiA9IG51bGw7CgogICAgZnVuY3Rpb24gQXV0aF9PcGVuSURfRGlmZmllSGVsbG1hbigkbW9kID0gbnVsbCwgJGdlbiA9IG51bGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRwcml2YXRlID0gbnVsbCwgJGxpYiA9IG51bGwpCiAgICB7CiAgICAgICAgaWYgKCRsaWIgPT09IG51bGwpIHsKICAgICAgICAgICAgJHRoaXMtPmxpYiA9IEF1dGhfT3BlbklEX2dldE1hdGhMaWIoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkdGhpcy0+bGliID0gJGxpYjsKICAgICAgICB9CgogICAgICAgIGlmICgkbW9kID09PSBudWxsKSB7CiAgICAgICAgICAgICR0aGlzLT5tb2QgPSAkdGhpcy0+bGliLT5pbml0KEF1dGhfT3BlbklEX2dldERlZmF1bHRNb2QoKSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJHRoaXMtPm1vZCA9ICRtb2Q7CiAgICAgICAgfQoKICAgICAgICBpZiAoJGdlbiA9PT0gbnVsbCkgewogICAgICAgICAgICAkdGhpcy0+Z2VuID0gJHRoaXMtPmxpYi0+aW5pdChBdXRoX09wZW5JRF9nZXREZWZhdWx0R2VuKCkpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICR0aGlzLT5nZW4gPSAkZ2VuOwogICAgICAgIH0KCiAgICAgICAgaWYgKCRwcml2YXRlID09PSBudWxsKSB7CiAgICAgICAgICAgICRyID0gJHRoaXMtPmxpYi0+cmFuZCgkdGhpcy0+bW9kKTsKICAgICAgICAgICAgJHRoaXMtPnByaXZhdGUgPSAkdGhpcy0+bGliLT5hZGQoJHIsIDEpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICR0aGlzLT5wcml2YXRlID0gJHByaXZhdGU7CiAgICAgICAgfQoKICAgICAgICAkdGhpcy0+cHVibGljID0gJHRoaXMtPmxpYi0+cG93bW9kKCR0aGlzLT5nZW4sICR0aGlzLT5wcml2YXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPm1vZCk7CiAgICB9CgogICAgZnVuY3Rpb24gZ2V0U2hhcmVkU2VjcmV0KCRjb21wb3NpdGUpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5saWItPnBvd21vZCgkY29tcG9zaXRlLCAkdGhpcy0+cHJpdmF0ZSwgJHRoaXMtPm1vZCk7CiAgICB9CgogICAgZnVuY3Rpb24gZ2V0UHVibGljS2V5KCkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnB1YmxpYzsKICAgIH0KCiAgICBmdW5jdGlvbiB1c2luZ0RlZmF1bHRWYWx1ZXMoKQogICAgewogICAgICAgIHJldHVybiAoJHRoaXMtPm1vZCA9PSBBdXRoX09wZW5JRF9nZXREZWZhdWx0TW9kKCkgJiYKICAgICAgICAgICAgICAgICR0aGlzLT5nZW4gPT0gQXV0aF9PcGVuSURfZ2V0RGVmYXVsdEdlbigpKTsKICAgIH0KCiAgICBmdW5jdGlvbiB4b3JTZWNyZXQoJGNvbXBvc2l0ZSwgJHNlY3JldCwgJGhhc2hfZnVuYykKICAgIHsKICAgICAgICAkZGhfc2hhcmVkID0gJHRoaXMtPmdldFNoYXJlZFNlY3JldCgkY29tcG9zaXRlKTsKICAgICAgICAkZGhfc2hhcmVkX3N0ciA9ICR0aGlzLT5saWItPmxvbmdUb0JpbmFyeSgkZGhfc2hhcmVkKTsKICAgICAgICAkaGFzaF9kaF9zaGFyZWQgPSAkaGFzaF9mdW5jKCRkaF9zaGFyZWRfc3RyKTsKCiAgICAgICAgJHhzZWNyZXQgPSAiIjsKICAgICAgICBmb3IgKCRpID0gMDsgJGkgPCBBdXRoX09wZW5JRDo6Ynl0ZXMoJHNlY3JldCk7ICRpKyspIHsKICAgICAgICAgICAgJHhzZWNyZXQgLj0gY2hyKG9yZCgkc2VjcmV0WyRpXSkgXiBvcmQoJGhhc2hfZGhfc2hhcmVkWyRpXSkpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICR4c2VjcmV0OwogICAgfQp9CgoK]]></data>
	</file>
	<file>
	  <filename>/openid-php-openid-782224d/Auth/OpenID/Discover.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBUaGUgT3BlbklEIGFuZCBZYWRpcyBkaXNjb3ZlcnkgaW1wbGVtZW50YXRpb24gZm9yIE9wZW5JRCAxLjIuCiAqLwoKcmVxdWlyZV9vbmNlICJBdXRoL09wZW5JRC5waHAiOwpyZXF1aXJlX29uY2UgIkF1dGgvT3BlbklEL1BhcnNlLnBocCI7CnJlcXVpcmVfb25jZSAiQXV0aC9PcGVuSUQvTWVzc2FnZS5waHAiOwpyZXF1aXJlX29uY2UgIkF1dGgvWWFkaXMvWFJJUmVzLnBocCI7CnJlcXVpcmVfb25jZSAiQXV0aC9ZYWRpcy9ZYWRpcy5waHAiOwoKLy8gWE1MIG5hbWVzcGFjZSB2YWx1ZQpkZWZpbmUoJ0F1dGhfT3BlbklEX1hNTE5TXzFfMCcsICdodHRwOi8vb3BlbmlkLm5ldC94bWxucy8xLjAnKTsKCi8vIFlhZGlzIHNlcnZpY2UgdHlwZXMKZGVmaW5lKCdBdXRoX09wZW5JRF9UWVBFXzFfMicsICdodHRwOi8vb3BlbmlkLm5ldC9zaWdub24vMS4yJyk7CmRlZmluZSgnQXV0aF9PcGVuSURfVFlQRV8xXzEnLCAnaHR0cDovL29wZW5pZC5uZXQvc2lnbm9uLzEuMScpOwpkZWZpbmUoJ0F1dGhfT3BlbklEX1RZUEVfMV8wJywgJ2h0dHA6Ly9vcGVuaWQubmV0L3NpZ25vbi8xLjAnKTsKZGVmaW5lKCdBdXRoX09wZW5JRF9UWVBFXzJfMF9JRFAnLCAnaHR0cDovL3NwZWNzLm9wZW5pZC5uZXQvYXV0aC8yLjAvc2VydmVyJyk7CmRlZmluZSgnQXV0aF9PcGVuSURfVFlQRV8yXzAnLCAnaHR0cDovL3NwZWNzLm9wZW5pZC5uZXQvYXV0aC8yLjAvc2lnbm9uJyk7CmRlZmluZSgnQXV0aF9PcGVuSURfUlBfUkVUVVJOX1RPX1VSTF9UWVBFJywKICAgICAgICdodHRwOi8vc3BlY3Mub3BlbmlkLm5ldC9hdXRoLzIuMC9yZXR1cm5fdG8nKTsKCmZ1bmN0aW9uIEF1dGhfT3BlbklEX2dldE9wZW5JRFR5cGVVUklzKCkKewogICAgcmV0dXJuIGFycmF5KEF1dGhfT3BlbklEX1RZUEVfMl8wX0lEUCwKICAgICAgICAgICAgICAgICBBdXRoX09wZW5JRF9UWVBFXzJfMCwKICAgICAgICAgICAgICAgICBBdXRoX09wZW5JRF9UWVBFXzFfMiwKICAgICAgICAgICAgICAgICBBdXRoX09wZW5JRF9UWVBFXzFfMSwKICAgICAgICAgICAgICAgICBBdXRoX09wZW5JRF9UWVBFXzFfMCk7Cn0KCmZ1bmN0aW9uIEF1dGhfT3BlbklEX2dldE9wZW5JRENvbnN1bWVyVHlwZVVSSXMoKQp7CiAgICByZXR1cm4gYXJyYXkoQXV0aF9PcGVuSURfUlBfUkVUVVJOX1RPX1VSTF9UWVBFKTsKfQoKCi8qCiAqIFByb3ZpZGVzIGEgdXNlci1yZWFkYWJsZSBpbnRlcnByZXRhdGlvbiBvZiBhIHR5cGUgdXJpLgogKiBVc2VmdWwgZm9yIGVycm9yIG1lc3NhZ2VzLgogKi8KZnVuY3Rpb24gQXV0aF9PcGVuSURfZ2V0T3BlbklEVHlwZU5hbWUoJHR5cGVfdXJpKSB7CiAgICBzd2l0Y2ggKCR0eXBlX3VyaSkgewogICAgY2FzZSBBdXRoX09wZW5JRF9UWVBFXzJfMF9JRFA6CiAgICAgIHJldHVybiAnT3BlbklEIDIuMCBJRFAnOwogICAgY2FzZSBBdXRoX09wZW5JRF9UWVBFXzJfMDoKICAgICAgcmV0dXJuICdPcGVuSUQgMi4wJzsKICAgIGNhc2UgQXV0aF9PcGVuSURfVFlQRV8xXzI6CiAgICAgIHJldHVybiAnT3BlbklEIDEuMic7CiAgICBjYXNlIEF1dGhfT3BlbklEX1RZUEVfMV8xOgogICAgICByZXR1cm4gJ09wZW5JRCAxLjEnOwogICAgY2FzZSBBdXRoX09wZW5JRF9UWVBFXzFfMDoKICAgICAgcmV0dXJuICdPcGVuSUQgMS4wJzsKICAgIGNhc2UgQXV0aF9PcGVuSURfUlBfUkVUVVJOX1RPX1VSTF9UWVBFOgogICAgICByZXR1cm4gJ09wZW5JRCByZWx5aW5nIHBhcnR5JzsKICAgIH0KfQoKLyoqCiAqIE9iamVjdCByZXByZXNlbnRpbmcgYW4gT3BlbklEIHNlcnZpY2UgZW5kcG9pbnQuCiAqLwpjbGFzcyBBdXRoX09wZW5JRF9TZXJ2aWNlRW5kcG9pbnQgewogICAgZnVuY3Rpb24gQXV0aF9PcGVuSURfU2VydmljZUVuZHBvaW50KCkKICAgIHsKICAgICAgICAkdGhpcy0+Y2xhaW1lZF9pZCA9IG51bGw7CiAgICAgICAgJHRoaXMtPnNlcnZlcl91cmwgPSBudWxsOwogICAgICAgICR0aGlzLT50eXBlX3VyaXMgPSBhcnJheSgpOwogICAgICAgICR0aGlzLT5sb2NhbF9pZCA9IG51bGw7CiAgICAgICAgJHRoaXMtPmNhbm9uaWNhbElEID0gbnVsbDsKICAgICAgICAkdGhpcy0+dXNlZF95YWRpcyA9IGZhbHNlOyAvLyB3aGV0aGVyIHRoaXMgY2FtZSBmcm9tIGFuIFhSRFMKICAgICAgICAkdGhpcy0+ZGlzcGxheV9pZGVudGlmaWVyID0gbnVsbDsKICAgIH0KCiAgICBmdW5jdGlvbiBnZXREaXNwbGF5SWRlbnRpZmllcigpCiAgICB7CiAgICAgICAgaWYgKCR0aGlzLT5kaXNwbGF5X2lkZW50aWZpZXIpIHsKICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5kaXNwbGF5X2lkZW50aWZpZXI7CiAgICAgICAgfQogICAgICAgIGlmICghICR0aGlzLT5jbGFpbWVkX2lkKSB7CiAgICAgICAgICByZXR1cm4gJHRoaXMtPmNsYWltZWRfaWQ7CiAgICAgICAgfQogICAgICAgICRwYXJzZWQgPSBwYXJzZV91cmwoJHRoaXMtPmNsYWltZWRfaWQpOwogICAgICAgICRzY2hlbWUgPSAkcGFyc2VkWydzY2hlbWUnXTsKICAgICAgICAkaG9zdCA9ICRwYXJzZWRbJ2hvc3QnXTsKICAgICAgICAkcGF0aCA9ICRwYXJzZWRbJ3BhdGgnXTsKICAgICAgICBpZiAoYXJyYXlfa2V5X2V4aXN0cygncXVlcnknLCAkcGFyc2VkKSkgewogICAgICAgICAgICAkcXVlcnkgPSAkcGFyc2VkWydxdWVyeSddOwogICAgICAgICAgICAkbm9fZnJhZyA9ICIkc2NoZW1lOi8vJGhvc3QkcGF0aD8kcXVlcnkiOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRub19mcmFnID0gIiRzY2hlbWU6Ly8kaG9zdCRwYXRoIjsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICRub19mcmFnOwogICAgfQoKICAgIGZ1bmN0aW9uIHVzZXNFeHRlbnNpb24oJGV4dGVuc2lvbl91cmkpCiAgICB7CiAgICAgICAgcmV0dXJuIGluX2FycmF5KCRleHRlbnNpb25fdXJpLCAkdGhpcy0+dHlwZV91cmlzKTsKICAgIH0KCiAgICBmdW5jdGlvbiBwcmVmZXJyZWROYW1lc3BhY2UoKQogICAgewogICAgICAgIGlmIChpbl9hcnJheShBdXRoX09wZW5JRF9UWVBFXzJfMF9JRFAsICR0aGlzLT50eXBlX3VyaXMpIHx8CiAgICAgICAgICAgIGluX2FycmF5KEF1dGhfT3BlbklEX1RZUEVfMl8wLCAkdGhpcy0+dHlwZV91cmlzKSkgewogICAgICAgICAgICByZXR1cm4gQXV0aF9PcGVuSURfT1BFTklEMl9OUzsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gQXV0aF9PcGVuSURfT1BFTklEMV9OUzsKICAgICAgICB9CiAgICB9CgogICAgLyoKICAgICAqIFF1ZXJ5IHRoaXMgZW5kcG9pbnQgdG8gc2VlIGlmIGl0IGhhcyBhbnkgb2YgdGhlIGdpdmVuIHR5cGUKICAgICAqIFVSSXMuIFRoaXMgaXMgdXNlZnVsIGZvciBpbXBsZW1lbnRpbmcgb3RoZXIgZW5kcG9pbnQgY2xhc3NlcwogICAgICogdGhhdCBlLmcuIG5lZWQgdG8gY2hlY2sgZm9yIHRoZSBwcmVzZW5jZSBvZiBtdWx0aXBsZSB2ZXJzaW9ucwogICAgICogb2YgYSBzaW5nbGUgcHJvdG9jb2wuCiAgICAgKgogICAgICogQHBhcmFtICR0eXBlX3VyaXMgVGhlIFVSSXMgdGhhdCB5b3Ugd2lzaCB0byBjaGVjawogICAgICoKICAgICAqIEByZXR1cm4gYWxsIHR5cGVzIHRoYXQgYXJlIGluIGJvdGggaW4gdHlwZV91cmlzIGFuZAogICAgICogJHRoaXMtPnR5cGVfdXJpcwogICAgICovCiAgICBmdW5jdGlvbiBtYXRjaFR5cGVzKCR0eXBlX3VyaXMpCiAgICB7CiAgICAgICAgJHJlc3VsdCA9IGFycmF5KCk7CiAgICAgICAgZm9yZWFjaCAoJHR5cGVfdXJpcyBhcyAkdGVzdF91cmkpIHsKICAgICAgICAgICAgaWYgKCR0aGlzLT5zdXBwb3J0c1R5cGUoJHRlc3RfdXJpKSkgewogICAgICAgICAgICAgICAgJHJlc3VsdFtdID0gJHRlc3RfdXJpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJHJlc3VsdDsKICAgIH0KCiAgICBmdW5jdGlvbiBzdXBwb3J0c1R5cGUoJHR5cGVfdXJpKQogICAgewogICAgICAgIC8vIERvZXMgdGhpcyBlbmRwb2ludCBzdXBwb3J0IHRoaXMgdHlwZT8KICAgICAgICByZXR1cm4gKChpbl9hcnJheSgkdHlwZV91cmksICR0aGlzLT50eXBlX3VyaXMpKSB8fAogICAgICAgICAgICAgICAgKCgkdHlwZV91cmkgPT0gQXV0aF9PcGVuSURfVFlQRV8yXzApICYmCiAgICAgICAgICAgICAgICAgJHRoaXMtPmlzT1BJZGVudGlmaWVyKCkpKTsKICAgIH0KCiAgICBmdW5jdGlvbiBjb21wYXRpYmlsaXR5TW9kZSgpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5wcmVmZXJyZWROYW1lc3BhY2UoKSAhPSBBdXRoX09wZW5JRF9PUEVOSUQyX05TOwogICAgfQoKICAgIGZ1bmN0aW9uIGlzT1BJZGVudGlmaWVyKCkKICAgIHsKICAgICAgICByZXR1cm4gaW5fYXJyYXkoQXV0aF9PcGVuSURfVFlQRV8yXzBfSURQLCAkdGhpcy0+dHlwZV91cmlzKTsKICAgIH0KCiAgICBzdGF0aWMgZnVuY3Rpb24gZnJvbU9QRW5kcG9pbnRVUkwoJG9wX2VuZHBvaW50X3VybCkKICAgIHsKICAgICAgICAvLyBDb25zdHJ1Y3QgYW4gT1AtSWRlbnRpZmllciBPcGVuSURTZXJ2aWNlRW5kcG9pbnQgb2JqZWN0IGZvcgogICAgICAgIC8vIGEgZ2l2ZW4gT1AgRW5kcG9pbnQgVVJMCiAgICAgICAgJG9iaiA9IG5ldyBBdXRoX09wZW5JRF9TZXJ2aWNlRW5kcG9pbnQoKTsKICAgICAgICAkb2JqLT5zZXJ2ZXJfdXJsID0gJG9wX2VuZHBvaW50X3VybDsKICAgICAgICAkb2JqLT50eXBlX3VyaXMgPSBhcnJheShBdXRoX09wZW5JRF9UWVBFXzJfMF9JRFApOwogICAgICAgIHJldHVybiAkb2JqOwogICAgfQoKICAgIGZ1bmN0aW9uIHBhcnNlU2VydmljZSgkeWFkaXNfdXJsLCAkdXJpLCAkdHlwZV91cmlzLCAkc2VydmljZV9lbGVtZW50KQogICAgewogICAgICAgIC8vIFNldCB0aGUgc3RhdGUgb2YgdGhpcyBvYmplY3QgYmFzZWQgb24gdGhlIGNvbnRlbnRzIG9mIHRoZQogICAgICAgIC8vIHNlcnZpY2UgZWxlbWVudC4gIFJldHVybiB0cnVlIGlmIHN1Y2Nlc3NmdWwsIGZhbHNlIGlmIG5vdAogICAgICAgIC8vIChpZiBmaW5kT1BMb2NhbElkZW50aWZpZXIgcmV0dXJucyBmYWxzZSkuCiAgICAgICAgJHRoaXMtPnR5cGVfdXJpcyA9ICR0eXBlX3VyaXM7CiAgICAgICAgJHRoaXMtPnNlcnZlcl91cmwgPSAkdXJpOwogICAgICAgICR0aGlzLT51c2VkX3lhZGlzID0gdHJ1ZTsKCiAgICAgICAgaWYgKCEkdGhpcy0+aXNPUElkZW50aWZpZXIoKSkgewogICAgICAgICAgICAkdGhpcy0+Y2xhaW1lZF9pZCA9ICR5YWRpc191cmw7CiAgICAgICAgICAgICR0aGlzLT5sb2NhbF9pZCA9IEF1dGhfT3BlbklEX2ZpbmRPUExvY2FsSWRlbnRpZmllcigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzZXJ2aWNlX2VsZW1lbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+dHlwZV91cmlzKTsKICAgICAgICAgICAgaWYgKCR0aGlzLT5sb2NhbF9pZCA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgZnVuY3Rpb24gZ2V0TG9jYWxJRCgpCiAgICB7CiAgICAgICAgLy8gUmV0dXJuIHRoZSBpZGVudGlmaWVyIHRoYXQgc2hvdWxkIGJlIHNlbnQgYXMgdGhlCiAgICAgICAgLy8gb3BlbmlkLmlkZW50aXR5X3VybCBwYXJhbWV0ZXIgdG8gdGhlIHNlcnZlci4KICAgICAgICBpZiAoJHRoaXMtPmxvY2FsX2lkID09PSBudWxsICYmICR0aGlzLT5jYW5vbmljYWxJRCA9PT0gbnVsbCkgewogICAgICAgICAgICByZXR1cm4gJHRoaXMtPmNsYWltZWRfaWQ7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKCR0aGlzLT5sb2NhbF9pZCkgewogICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5sb2NhbF9pZDsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+Y2Fub25pY2FsSUQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgLyoKICAgICAqIFBhcnNlIHRoZSBnaXZlbiBkb2N1bWVudCBhcyBYUkRTIGxvb2tpbmcgZm9yIE9wZW5JRCBjb25zdW1lciBzZXJ2aWNlcy4KICAgICAqCiAgICAgKiBAcmV0dXJuIGFycmF5IG9mIEF1dGhfT3BlbklEX1NlcnZpY2VFbmRwb2ludCBvciBudWxsIGlmIHRoZQogICAgICogZG9jdW1lbnQgY2Fubm90IGJlIHBhcnNlZC4KICAgICAqLwogICAgZnVuY3Rpb24gY29uc3VtZXJGcm9tWFJEUygkdXJpLCAkeHJkc190ZXh0KQogICAgewogICAgICAgICR4cmRzID0mIEF1dGhfWWFkaXNfWFJEUzo6cGFyc2VYUkRTKCR4cmRzX3RleHQpOwoKICAgICAgICBpZiAoJHhyZHMpIHsKICAgICAgICAgICAgJHlhZGlzX3NlcnZpY2VzID0KICAgICAgICAgICAgICAkeHJkcy0+c2VydmljZXMoYXJyYXkoJ2ZpbHRlcl9NYXRjaGVzQW55T3BlbklEQ29uc3VtZXJUeXBlJykpOwogICAgICAgICAgICByZXR1cm4gQXV0aF9PcGVuSURfbWFrZU9wZW5JREVuZHBvaW50cygkdXJpLCAkeWFkaXNfc2VydmljZXMpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9CgogICAgLyoKICAgICAqIFBhcnNlIHRoZSBnaXZlbiBkb2N1bWVudCBhcyBYUkRTIGxvb2tpbmcgZm9yIE9wZW5JRCBzZXJ2aWNlcy4KICAgICAqCiAgICAgKiBAcmV0dXJuIGFycmF5IG9mIEF1dGhfT3BlbklEX1NlcnZpY2VFbmRwb2ludCBvciBudWxsIGlmIHRoZQogICAgICogZG9jdW1lbnQgY2Fubm90IGJlIHBhcnNlZC4KICAgICAqLwogICAgc3RhdGljIGZ1bmN0aW9uIGZyb21YUkRTKCR1cmksICR4cmRzX3RleHQpCiAgICB7CiAgICAgICAgJHhyZHMgPSBBdXRoX1lhZGlzX1hSRFM6OnBhcnNlWFJEUygkeHJkc190ZXh0KTsKCiAgICAgICAgaWYgKCR4cmRzKSB7CiAgICAgICAgICAgICR5YWRpc19zZXJ2aWNlcyA9CiAgICAgICAgICAgICAgJHhyZHMtPnNlcnZpY2VzKGFycmF5KCdmaWx0ZXJfTWF0Y2hlc0FueU9wZW5JRFR5cGUnKSk7CiAgICAgICAgICAgIHJldHVybiBBdXRoX09wZW5JRF9tYWtlT3BlbklERW5kcG9pbnRzKCR1cmksICR5YWRpc19zZXJ2aWNlcyk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KCiAgICAvKgogICAgICogQ3JlYXRlIGVuZHBvaW50cyBmcm9tIGEgRGlzY292ZXJ5UmVzdWx0LgogICAgICoKICAgICAqIEBwYXJhbSBkaXNjb3ZlcnlSZXN1bHQgQXV0aF9ZYWRpc19EaXNjb3ZlcnlSZXN1bHQKICAgICAqIEByZXR1cm4gYXJyYXkgb2YgQXV0aF9PcGVuSURfU2VydmljZUVuZHBvaW50IG9yIG51bGwgaWYKICAgICAqIGVuZHBvaW50cyBjYW5ub3QgYmUgY3JlYXRlZC4KICAgICAqLwogICAgc3RhdGljIGZ1bmN0aW9uIGZyb21EaXNjb3ZlcnlSZXN1bHQoJGRpc2NvdmVyeVJlc3VsdCkKICAgIHsKICAgICAgICBpZiAoJGRpc2NvdmVyeVJlc3VsdC0+aXNYUkRTKCkpIHsKICAgICAgICAgICAgcmV0dXJuIEF1dGhfT3BlbklEX1NlcnZpY2VFbmRwb2ludDo6ZnJvbVhSRFMoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZGlzY292ZXJ5UmVzdWx0LT5ub3JtYWxpemVkX3VyaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRkaXNjb3ZlcnlSZXN1bHQtPnJlc3BvbnNlX3RleHQpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiBBdXRoX09wZW5JRF9TZXJ2aWNlRW5kcG9pbnQ6OmZyb21IVE1MKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGRpc2NvdmVyeVJlc3VsdC0+bm9ybWFsaXplZF91cmksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZGlzY292ZXJ5UmVzdWx0LT5yZXNwb25zZV90ZXh0KTsKICAgICAgICB9CiAgICB9CgogICAgc3RhdGljIGZ1bmN0aW9uIGZyb21IVE1MKCR1cmksICRodG1sKQogICAgewogICAgICAgICRkaXNjb3ZlcnlfdHlwZXMgPSBhcnJheSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXkoQXV0aF9PcGVuSURfVFlQRV8yXzAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvcGVuaWQyLnByb3ZpZGVyJywgJ29wZW5pZDIubG9jYWxfaWQnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXkoQXV0aF9PcGVuSURfVFlQRV8xXzEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvcGVuaWQuc2VydmVyJywgJ29wZW5pZC5kZWxlZ2F0ZScpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICRzZXJ2aWNlcyA9IGFycmF5KCk7CgogICAgICAgIGZvcmVhY2ggKCRkaXNjb3ZlcnlfdHlwZXMgYXMgJHRyaXBsZSkgewogICAgICAgICAgICBsaXN0KCR0eXBlX3VyaSwgJHNlcnZlcl9yZWwsICRkZWxlZ2F0ZV9yZWwpID0gJHRyaXBsZTsKCiAgICAgICAgICAgICR1cmxzID0gQXV0aF9PcGVuSURfbGVnYWN5X2Rpc2NvdmVyKCRodG1sLCAkc2VydmVyX3JlbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGRlbGVnYXRlX3JlbCk7CgogICAgICAgICAgICBpZiAoJHVybHMgPT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGlzdCgkZGVsZWdhdGVfdXJsLCAkc2VydmVyX3VybCkgPSAkdXJsczsKCiAgICAgICAgICAgICRzZXJ2aWNlID0gbmV3IEF1dGhfT3BlbklEX1NlcnZpY2VFbmRwb2ludCgpOwogICAgICAgICAgICAkc2VydmljZS0+Y2xhaW1lZF9pZCA9ICR1cmk7CiAgICAgICAgICAgICRzZXJ2aWNlLT5sb2NhbF9pZCA9ICRkZWxlZ2F0ZV91cmw7CiAgICAgICAgICAgICRzZXJ2aWNlLT5zZXJ2ZXJfdXJsID0gJHNlcnZlcl91cmw7CiAgICAgICAgICAgICRzZXJ2aWNlLT50eXBlX3VyaXMgPSBhcnJheSgkdHlwZV91cmkpOwoKICAgICAgICAgICAgJHNlcnZpY2VzW10gPSAkc2VydmljZTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkc2VydmljZXM7CiAgICB9CgogICAgZnVuY3Rpb24gY29weSgpCiAgICB7CiAgICAgICAgJHggPSBuZXcgQXV0aF9PcGVuSURfU2VydmljZUVuZHBvaW50KCk7CgogICAgICAgICR4LT5jbGFpbWVkX2lkID0gJHRoaXMtPmNsYWltZWRfaWQ7CiAgICAgICAgJHgtPnNlcnZlcl91cmwgPSAkdGhpcy0+c2VydmVyX3VybDsKICAgICAgICAkeC0+dHlwZV91cmlzID0gJHRoaXMtPnR5cGVfdXJpczsKICAgICAgICAkeC0+bG9jYWxfaWQgPSAkdGhpcy0+bG9jYWxfaWQ7CiAgICAgICAgJHgtPmNhbm9uaWNhbElEID0gJHRoaXMtPmNhbm9uaWNhbElEOwogICAgICAgICR4LT51c2VkX3lhZGlzID0gJHRoaXMtPnVzZWRfeWFkaXM7CgogICAgICAgIHJldHVybiAkeDsKICAgIH0KfQoKZnVuY3Rpb24gQXV0aF9PcGVuSURfZmluZE9QTG9jYWxJZGVudGlmaWVyKCRzZXJ2aWNlLCAkdHlwZV91cmlzKQp7CiAgICAvLyBFeHRyYWN0IGEgb3BlbmlkOkRlbGVnYXRlIHZhbHVlIGZyb20gYSBZYWRpcyBTZXJ2aWNlIGVsZW1lbnQuCiAgICAvLyBJZiBubyBkZWxlZ2F0ZSBpcyBmb3VuZCwgcmV0dXJucyBudWxsLiAgUmV0dXJucyBmYWxzZSBvbgogICAgLy8gZGlzY292ZXJ5IGZhaWx1cmUgKHdoZW4gbXVsdGlwbGUgZGVsZWdhdGUvbG9jYWxJRCB0YWdzIGhhdmUKICAgIC8vIGRpZmZlcmVudCB2YWx1ZXMpLgoKICAgICRzZXJ2aWNlLT5wYXJzZXItPnJlZ2lzdGVyTmFtZXNwYWNlKCdvcGVuaWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXV0aF9PcGVuSURfWE1MTlNfMV8wKTsKCiAgICAkc2VydmljZS0+cGFyc2VyLT5yZWdpc3Rlck5hbWVzcGFjZSgneHJkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1dGhfWWFkaXNfWE1MTlNfWFJEXzJfMCk7CgogICAgJHBhcnNlciA9ICRzZXJ2aWNlLT5wYXJzZXI7CgogICAgJHBlcm1pdHRlZF90YWdzID0gYXJyYXkoKTsKCiAgICBpZiAoaW5fYXJyYXkoQXV0aF9PcGVuSURfVFlQRV8xXzEsICR0eXBlX3VyaXMpIHx8CiAgICAgICAgaW5fYXJyYXkoQXV0aF9PcGVuSURfVFlQRV8xXzAsICR0eXBlX3VyaXMpKSB7CiAgICAgICAgJHBlcm1pdHRlZF90YWdzW10gPSAnb3BlbmlkOkRlbGVnYXRlJzsKICAgIH0KCiAgICBpZiAoaW5fYXJyYXkoQXV0aF9PcGVuSURfVFlQRV8yXzAsICR0eXBlX3VyaXMpKSB7CiAgICAgICAgJHBlcm1pdHRlZF90YWdzW10gPSAneHJkOkxvY2FsSUQnOwogICAgfQoKICAgICRsb2NhbF9pZCA9IG51bGw7CgogICAgZm9yZWFjaCAoJHBlcm1pdHRlZF90YWdzIGFzICR0YWdfbmFtZSkgewogICAgICAgICR0YWdzID0gJHNlcnZpY2UtPmdldEVsZW1lbnRzKCR0YWdfbmFtZSk7CgogICAgICAgIGZvcmVhY2ggKCR0YWdzIGFzICR0YWcpIHsKICAgICAgICAgICAgJGNvbnRlbnQgPSAkcGFyc2VyLT5jb250ZW50KCR0YWcpOwoKICAgICAgICAgICAgaWYgKCRsb2NhbF9pZCA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgJGxvY2FsX2lkID0gJGNvbnRlbnQ7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoJGxvY2FsX2lkICE9ICRjb250ZW50KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuICRsb2NhbF9pZDsKfQoKZnVuY3Rpb24gZmlsdGVyX01hdGNoZXNBbnlPcGVuSURUeXBlKCRzZXJ2aWNlKQp7CiAgICAkdXJpcyA9ICRzZXJ2aWNlLT5nZXRUeXBlcygpOwoKICAgIGZvcmVhY2ggKCR1cmlzIGFzICR1cmkpIHsKICAgICAgICBpZiAoaW5fYXJyYXkoJHVyaSwgQXV0aF9PcGVuSURfZ2V0T3BlbklEVHlwZVVSSXMoKSkpIHsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiBmYWxzZTsKfQoKZnVuY3Rpb24gZmlsdGVyX01hdGNoZXNBbnlPcGVuSURDb25zdW1lclR5cGUoJiRzZXJ2aWNlKQp7CiAgICAkdXJpcyA9ICRzZXJ2aWNlLT5nZXRUeXBlcygpOwoKICAgIGZvcmVhY2ggKCR1cmlzIGFzICR1cmkpIHsKICAgICAgICBpZiAoaW5fYXJyYXkoJHVyaSwgQXV0aF9PcGVuSURfZ2V0T3BlbklEQ29uc3VtZXJUeXBlVVJJcygpKSkgewogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIGZhbHNlOwp9CgpmdW5jdGlvbiBBdXRoX09wZW5JRF9iZXN0TWF0Y2hpbmdTZXJ2aWNlKCRzZXJ2aWNlLCAkcHJlZmVycmVkX3R5cGVzKQp7CiAgICAvLyBSZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBtYXRjaGluZyB0eXBlLCBvciBzb21ldGhpbmcKICAgIC8vIGhpZ2hlciBpZiBubyB0eXBlIG1hdGNoZXMuCiAgICAvLwogICAgLy8gVGhpcyBwcm92aWRlcyBhbiBvcmRlcmluZyBpbiB3aGljaCBzZXJ2aWNlIGVsZW1lbnRzIHRoYXQKICAgIC8vIGNvbnRhaW4gYSB0eXBlIHRoYXQgY29tZXMgZWFybGllciBpbiB0aGUgcHJlZmVycmVkIHR5cGVzIGxpc3QKICAgIC8vIGNvbWUgYmVmb3JlIHNlcnZpY2UgZWxlbWVudHMgdGhhdCBjb21lIGxhdGVyLiBJZiBhIHNlcnZpY2UKICAgIC8vIGVsZW1lbnQgaGFzIG1vcmUgdGhhbiBvbmUgdHlwZSwgdGhlIG1vc3QgcHJlZmVycmVkIG9uZSB3aW5zLgoKICAgIGZvcmVhY2ggKCRwcmVmZXJyZWRfdHlwZXMgYXMgJGluZGV4ID0+ICR0eXApIHsKICAgICAgICBpZiAoaW5fYXJyYXkoJHR5cCwgJHNlcnZpY2UtPnR5cGVfdXJpcykpIHsKICAgICAgICAgICAgcmV0dXJuICRpbmRleDsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIGNvdW50KCRwcmVmZXJyZWRfdHlwZXMpOwp9CgpmdW5jdGlvbiBBdXRoX09wZW5JRF9hcnJhbmdlQnlUeXBlKCRzZXJ2aWNlX2xpc3QsICRwcmVmZXJyZWRfdHlwZXMpCnsKICAgIC8vIFJlYXJyYW5nZSBzZXJ2aWNlX2xpc3QgaW4gYSBuZXcgbGlzdCBzbyBzZXJ2aWNlcyBhcmUgb3JkZXJlZCBieQogICAgLy8gdHlwZXMgbGlzdGVkIGluIHByZWZlcnJlZF90eXBlcy4gIFJldHVybiB0aGUgbmV3IGxpc3QuCgogICAgLy8gQnVpbGQgYSBsaXN0IHdpdGggdGhlIHNlcnZpY2UgZWxlbWVudHMgaW4gdHVwbGVzIHdob3NlCiAgICAvLyBjb21wYXJpc29uIHdpbGwgcHJlZmVyIHRoZSBvbmUgd2l0aCB0aGUgYmVzdCBtYXRjaGluZyBzZXJ2aWNlCiAgICAkcHJpb19zZXJ2aWNlcyA9IGFycmF5KCk7CiAgICBmb3JlYWNoICgkc2VydmljZV9saXN0IGFzICRpbmRleCA9PiAkc2VydmljZSkgewogICAgICAgICRwcmlvX3NlcnZpY2VzW10gPSBhcnJheShBdXRoX09wZW5JRF9iZXN0TWF0Y2hpbmdTZXJ2aWNlKCRzZXJ2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRwcmVmZXJyZWRfdHlwZXMpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaW5kZXgsICRzZXJ2aWNlKTsKICAgIH0KCiAgICBzb3J0KCRwcmlvX3NlcnZpY2VzKTsKCiAgICAvLyBOb3cgdGhhdCB0aGUgc2VydmljZXMgYXJlIHNvcnRlZCBieSBwcmlvcml0eSwgcmVtb3ZlIHRoZSBzb3J0CiAgICAvLyBrZXlzIGZyb20gdGhlIGxpc3QuCiAgICBmb3JlYWNoICgkcHJpb19zZXJ2aWNlcyBhcyAkaW5kZXggPT4gJHMpIHsKICAgICAgICAkcHJpb19zZXJ2aWNlc1skaW5kZXhdID0gJHByaW9fc2VydmljZXNbJGluZGV4XVsyXTsKICAgIH0KCiAgICByZXR1cm4gJHByaW9fc2VydmljZXM7Cn0KCi8vIEV4dHJhY3QgT1AgSWRlbnRpZmllciBzZXJ2aWNlcy4gIElmIG5vbmUgZm91bmQsIHJldHVybiB0aGUgcmVzdCwKLy8gc29ydGVkIHdpdGggbW9zdCBwcmVmZXJyZWQgZmlyc3QgYWNjb3JkaW5nIHRvCi8vIE9wZW5JRFNlcnZpY2VFbmRwb2ludC5vcGVuaWRfdHlwZV91cmlzLgovLwovLyBvcGVuaWRfc2VydmljZXMgaXMgYSBsaXN0IG9mIE9wZW5JRFNlcnZpY2VFbmRwb2ludCBvYmplY3RzLgovLwovLyBSZXR1cm5zIGEgbGlzdCBvZiBPcGVuSURTZXJ2aWNlRW5kcG9pbnQgb2JqZWN0cy4iIiIKZnVuY3Rpb24gQXV0aF9PcGVuSURfZ2V0T1BPclVzZXJTZXJ2aWNlcygkb3BlbmlkX3NlcnZpY2VzKQp7CiAgICAkb3Bfc2VydmljZXMgPSBBdXRoX09wZW5JRF9hcnJhbmdlQnlUeXBlKCRvcGVuaWRfc2VydmljZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheShBdXRoX09wZW5JRF9UWVBFXzJfMF9JRFApKTsKCiAgICAkb3BlbmlkX3NlcnZpY2VzID0gQXV0aF9PcGVuSURfYXJyYW5nZUJ5VHlwZSgkb3BlbmlkX3NlcnZpY2VzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXV0aF9PcGVuSURfZ2V0T3BlbklEVHlwZVVSSXMoKSk7CgogICAgaWYgKCRvcF9zZXJ2aWNlcykgewogICAgICAgIHJldHVybiAkb3Bfc2VydmljZXM7CiAgICB9IGVsc2UgewogICAgICAgIHJldHVybiAkb3BlbmlkX3NlcnZpY2VzOwogICAgfQp9CgpmdW5jdGlvbiBBdXRoX09wZW5JRF9tYWtlT3BlbklERW5kcG9pbnRzKCR1cmksICR5YWRpc19zZXJ2aWNlcykKewogICAgJHMgPSBhcnJheSgpOwoKICAgIGlmICghJHlhZGlzX3NlcnZpY2VzKSB7CiAgICAgICAgcmV0dXJuICRzOwogICAgfQoKICAgIGZvcmVhY2ggKCR5YWRpc19zZXJ2aWNlcyBhcyAkc2VydmljZSkgewogICAgICAgICR0eXBlX3VyaXMgPSAkc2VydmljZS0+Z2V0VHlwZXMoKTsKICAgICAgICAkdXJpcyA9ICRzZXJ2aWNlLT5nZXRVUklzKCk7CgogICAgICAgIC8vIElmIGFueSBUeXBlIFVSSXMgbWF0Y2ggYW5kIHRoZXJlIGlzIGFuIGVuZHBvaW50IFVSSQogICAgICAgIC8vIHNwZWNpZmllZCwgdGhlbiB0aGlzIGlzIGFuIE9wZW5JRCBlbmRwb2ludAogICAgICAgIGlmICgkdHlwZV91cmlzICYmCiAgICAgICAgICAgICR1cmlzKSB7CiAgICAgICAgICAgIGZvcmVhY2ggKCR1cmlzIGFzICRzZXJ2aWNlX3VyaSkgewogICAgICAgICAgICAgICAgJG9wZW5pZF9lbmRwb2ludCA9IG5ldyBBdXRoX09wZW5JRF9TZXJ2aWNlRW5kcG9pbnQoKTsKICAgICAgICAgICAgICAgIGlmICgkb3BlbmlkX2VuZHBvaW50LT5wYXJzZVNlcnZpY2UoJHVyaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNlcnZpY2VfdXJpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdHlwZV91cmlzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2VydmljZSkpIHsKICAgICAgICAgICAgICAgICAgICAkc1tdID0gJG9wZW5pZF9lbmRwb2ludDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gJHM7Cn0KCmZ1bmN0aW9uIEF1dGhfT3BlbklEX2Rpc2NvdmVyV2l0aFlhZGlzKCR1cmksICRmZXRjaGVyLAogICAgICAgICAgICAgICRlbmRwb2ludF9maWx0ZXI9J0F1dGhfT3BlbklEX2dldE9QT3JVc2VyU2VydmljZXMnLAogICAgICAgICAgICAgICRkaXNjb3Zlcl9mdW5jdGlvbj1udWxsKQp7CiAgICAvLyBEaXNjb3ZlciBPcGVuSUQgc2VydmljZXMgZm9yIGEgVVJJLiBUcmllcyBZYWRpcyBhbmQgZmFsbHMgYmFjawogICAgLy8gb24gb2xkLXN0eWxlIDxsaW5rIHJlbD0nLi4uJz4gZGlzY292ZXJ5IGlmIFlhZGlzIGZhaWxzLgoKICAgIC8vIE1pZ2h0IHJhaXNlIGEgeWFkaXMuZGlzY292ZXIuRGlzY292ZXJ5RmFpbHVyZSBpZiBubyBkb2N1bWVudAogICAgLy8gY2FtZSBiYWNrIGZvciB0aGF0IFVSSSBhdCBhbGwuICBJIGRvbid0IHRoaW5rIGZhbGxpbmcgYmFjayB0bwogICAgLy8gT3BlbklEIDEuMCBkaXNjb3Zlcnkgb24gdGhlIHNhbWUgVVJMIHdpbGwgaGVscCwgc28gZG9uJ3QgYm90aGVyCiAgICAvLyB0byBjYXRjaCBpdC4KICAgIGlmICgkZGlzY292ZXJfZnVuY3Rpb24gPT09IG51bGwpIHsKICAgICAgICAkZGlzY292ZXJfZnVuY3Rpb24gPSBhcnJheSgnQXV0aF9ZYWRpc19ZYWRpcycsICdkaXNjb3ZlcicpOwogICAgfQoKICAgICRvcGVuaWRfc2VydmljZXMgPSBhcnJheSgpOwoKICAgICRyZXNwb25zZSA9IGNhbGxfdXNlcl9mdW5jX2FycmF5KCRkaXNjb3Zlcl9mdW5jdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5KCR1cmksICRmZXRjaGVyKSk7CgogICAgJHlhZGlzX3VybCA9ICRyZXNwb25zZS0+bm9ybWFsaXplZF91cmk7CiAgICAkeWFkaXNfc2VydmljZXMgPSBhcnJheSgpOwoKICAgIGlmICgkcmVzcG9uc2UtPmlzRmFpbHVyZSgpICYmICEkcmVzcG9uc2UtPmlzWFJEUygpKSB7CiAgICAgICAgcmV0dXJuIGFycmF5KCR1cmksIGFycmF5KCkpOwogICAgfQoKICAgICRvcGVuaWRfc2VydmljZXMgPSBBdXRoX09wZW5JRF9TZXJ2aWNlRW5kcG9pbnQ6OmZyb21YUkRTKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR5YWRpc191cmwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3BvbnNlLT5yZXNwb25zZV90ZXh0KTsKCiAgICBpZiAoISRvcGVuaWRfc2VydmljZXMpIHsKICAgICAgICBpZiAoJHJlc3BvbnNlLT5pc1hSRFMoKSkgewogICAgICAgICAgICByZXR1cm4gQXV0aF9PcGVuSURfZGlzY292ZXJXaXRob3V0WWFkaXMoJHVyaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRmZXRjaGVyKTsKICAgICAgICB9CgogICAgICAgIC8vIFRyeSB0byBwYXJzZSB0aGUgcmVzcG9uc2UgYXMgSFRNTCB0byBnZXQgT3BlbklEIDEuMC8xLjEKICAgICAgICAvLyA8bGluayByZWw9Ii4uLiI+CiAgICAgICAgJG9wZW5pZF9zZXJ2aWNlcyA9IEF1dGhfT3BlbklEX1NlcnZpY2VFbmRwb2ludDo6ZnJvbUhUTUwoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkeWFkaXNfdXJsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3BvbnNlLT5yZXNwb25zZV90ZXh0KTsKICAgIH0KCiAgICAkb3BlbmlkX3NlcnZpY2VzID0gY2FsbF91c2VyX2Z1bmNfYXJyYXkoJGVuZHBvaW50X2ZpbHRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheSgkb3BlbmlkX3NlcnZpY2VzKSk7CgogICAgcmV0dXJuIGFycmF5KCR5YWRpc191cmwsICRvcGVuaWRfc2VydmljZXMpOwp9CgpmdW5jdGlvbiBBdXRoX09wZW5JRF9kaXNjb3ZlclVSSSgkdXJpLCAkZmV0Y2hlcikKewogICAgJHVyaSA9IEF1dGhfT3BlbklEOjpub3JtYWxpemVVcmwoJHVyaSk7CiAgICByZXR1cm4gQXV0aF9PcGVuSURfZGlzY292ZXJXaXRoWWFkaXMoJHVyaSwgJGZldGNoZXIpOwp9CgpmdW5jdGlvbiBBdXRoX09wZW5JRF9kaXNjb3ZlcldpdGhvdXRZYWRpcygkdXJpLCAkZmV0Y2hlcikKewogICAgJGh0dHBfcmVzcCA9IEAkZmV0Y2hlci0+Z2V0KCR1cmkpOwoKICAgIGlmICgkaHR0cF9yZXNwLT5zdGF0dXMgIT0gMjAwIGFuZCAkaHR0cF9yZXNwLT5zdGF0dXMgIT0gMjA2KSB7CiAgICAgICAgcmV0dXJuIGFycmF5KCR1cmksIGFycmF5KCkpOwogICAgfQoKICAgICRpZGVudGl0eV91cmwgPSAkaHR0cF9yZXNwLT5maW5hbF91cmw7CgogICAgLy8gVHJ5IHRvIHBhcnNlIHRoZSByZXNwb25zZSBhcyBIVE1MIHRvIGdldCBPcGVuSUQgMS4wLzEuMSA8bGluawogICAgLy8gcmVsPSIuLi4iPgogICAgJG9wZW5pZF9zZXJ2aWNlcyA9IEF1dGhfT3BlbklEX1NlcnZpY2VFbmRwb2ludDo6ZnJvbUhUTUwoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaWRlbnRpdHlfdXJsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGh0dHBfcmVzcC0+Ym9keSk7CgogICAgcmV0dXJuIGFycmF5KCRpZGVudGl0eV91cmwsICRvcGVuaWRfc2VydmljZXMpOwp9CgpmdW5jdGlvbiBBdXRoX09wZW5JRF9kaXNjb3ZlclhSSSgkaW5hbWUsICRmZXRjaGVyKQp7CiAgICAkcmVzb2x2ZXIgPSBuZXcgQXV0aF9ZYWRpc19Qcm94eVJlc29sdmVyKCRmZXRjaGVyKTsKICAgIGxpc3QoJGNhbm9uaWNhbElELCAkeWFkaXNfc2VydmljZXMpID0KICAgICAgICAkcmVzb2x2ZXItPnF1ZXJ5KCRpbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgIEF1dGhfT3BlbklEX2dldE9wZW5JRFR5cGVVUklzKCksCiAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheSgnZmlsdGVyX01hdGNoZXNBbnlPcGVuSURUeXBlJykpOwoKICAgICRvcGVuaWRfc2VydmljZXMgPSBBdXRoX09wZW5JRF9tYWtlT3BlbklERW5kcG9pbnRzKCRpbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR5YWRpc19zZXJ2aWNlcyk7CgogICAgJG9wZW5pZF9zZXJ2aWNlcyA9IEF1dGhfT3BlbklEX2dldE9QT3JVc2VyU2VydmljZXMoJG9wZW5pZF9zZXJ2aWNlcyk7CgogICAgZm9yICgkaSA9IDA7ICRpIDwgY291bnQoJG9wZW5pZF9zZXJ2aWNlcyk7ICRpKyspIHsKICAgICAgICAkb3BlbmlkX3NlcnZpY2VzWyRpXS0+Y2Fub25pY2FsSUQgPSAkY2Fub25pY2FsSUQ7CiAgICAgICAgJG9wZW5pZF9zZXJ2aWNlc1skaV0tPmNsYWltZWRfaWQgPSAkY2Fub25pY2FsSUQ7CiAgICAgICAgJG9wZW5pZF9zZXJ2aWNlc1skaV0tPmRpc3BsYXlfaWRlbnRpZmllciA9ICRpbmFtZTsKICAgIH0KCiAgICAvLyBGSVhNRTogcmV0dXJuZWQgeHJpIHNob3VsZCBwcm9iYWJseSBiZSBpbiBzb21lIG5vcm1hbCBmb3JtCiAgICByZXR1cm4gYXJyYXkoJGluYW1lLCAkb3BlbmlkX3NlcnZpY2VzKTsKfQoKZnVuY3Rpb24gQXV0aF9PcGVuSURfZGlzY292ZXIoJHVyaSwgJGZldGNoZXIpCnsKICAgIC8vIElmIHRoZSBmZXRjaGVyIChpLmUuLCBQSFApIGRvZXNuJ3Qgc3VwcG9ydCBTU0wsIHdlIGNhbid0IGRvCiAgICAvLyBkaXNjb3Zlcnkgb24gYW4gSFRUUFMgVVJMLgogICAgaWYgKCRmZXRjaGVyLT5pc0hUVFBTKCR1cmkpICYmICEkZmV0Y2hlci0+c3VwcG9ydHNTU0woKSkgewogICAgICAgIHJldHVybiBhcnJheSgkdXJpLCBhcnJheSgpKTsKICAgIH0KCiAgICBpZiAoQXV0aF9ZYWRpc19pZGVudGlmaWVyU2NoZW1lKCR1cmkpID09ICdYUkknKSB7CiAgICAgICAgJHJlc3VsdCA9IEF1dGhfT3BlbklEX2Rpc2NvdmVyWFJJKCR1cmksICRmZXRjaGVyKTsKICAgIH0gZWxzZSB7CiAgICAgICAgJHJlc3VsdCA9IEF1dGhfT3BlbklEX2Rpc2NvdmVyVVJJKCR1cmksICRmZXRjaGVyKTsKICAgIH0KCiAgICAvLyBJZiB0aGUgZmV0Y2hlciBkb2Vzbid0IHN1cHBvcnQgU1NMLCB3ZSBjYW4ndCBpbnRlcmFjdCB3aXRoCiAgICAvLyBIVFRQUyBzZXJ2ZXIgVVJMczsgcmVtb3ZlIHRob3NlIGVuZHBvaW50cyBmcm9tIHRoZSBsaXN0LgogICAgaWYgKCEkZmV0Y2hlci0+c3VwcG9ydHNTU0woKSkgewogICAgICAgICRodHRwX2VuZHBvaW50cyA9IGFycmF5KCk7CiAgICAgICAgbGlzdCgkbmV3X3VyaSwgJGVuZHBvaW50cykgPSAkcmVzdWx0OwoKICAgICAgICBmb3JlYWNoICgkZW5kcG9pbnRzIGFzICRlKSB7CiAgICAgICAgICAgIGlmICghJGZldGNoZXItPmlzSFRUUFMoJGUtPnNlcnZlcl91cmwpKSB7CiAgICAgICAgICAgICAgICAkaHR0cF9lbmRwb2ludHNbXSA9ICRlOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkcmVzdWx0ID0gYXJyYXkoJG5ld191cmksICRodHRwX2VuZHBvaW50cyk7CiAgICB9CgogICAgcmV0dXJuICRyZXN1bHQ7Cn0KCgo=]]></data>
	</file>
	<file>
	  <filename>/openid-php-openid-782224d/Auth/OpenID/DumbStore.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBUaGlzIGZpbGUgc3VwcGxpZXMgYSBkdW1iIHN0b3JlIGJhY2tlbmQgZm9yIE9wZW5JRCBzZXJ2ZXJzIGFuZAogKiBjb25zdW1lcnMuCiAqCiAqIFBIUCB2ZXJzaW9ucyA0IGFuZCA1CiAqCiAqIExJQ0VOU0U6IFNlZSB0aGUgQ09QWUlORyBmaWxlIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uLgogKgogKiBAcGFja2FnZSBPcGVuSUQKICogQGF1dGhvciBKYW5SYWluLCBJbmMuIDxvcGVuaWRAamFucmFpbi5jb20+CiAqIEBjb3B5cmlnaHQgMjAwNS0yMDA4IEphbnJhaW4sIEluYy4KICogQGxpY2Vuc2UgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIEFwYWNoZQogKi8KCi8qKgogKiBJbXBvcnQgdGhlIGludGVyZmFjZSBmb3IgY3JlYXRpbmcgYSBuZXcgc3RvcmUgY2xhc3MuCiAqLwpyZXF1aXJlX29uY2UgJ0F1dGgvT3BlbklEL0ludGVyZmFjZS5waHAnOwpyZXF1aXJlX29uY2UgJ0F1dGgvT3BlbklEL0hNQUMucGhwJzsKCi8qKgogKiBUaGlzIGlzIGEgc3RvcmUgZm9yIHVzZSBpbiB0aGUgd29yc3QgY2FzZSwgd2hlbiB5b3UgaGF2ZSBubyB3YXkgb2YKICogc2F2aW5nIHN0YXRlIG9uIHRoZSBjb25zdW1lciBzaXRlLiBVc2luZyB0aGlzIHN0b3JlIG1ha2VzIHRoZQogKiBjb25zdW1lciB2dWxuZXJhYmxlIHRvIHJlcGxheSBhdHRhY2tzLCBhcyBpdCdzIHVuYWJsZSB0byB1c2UKICogbm9uY2VzLiBBdm9pZCB1c2luZyB0aGlzIHN0b3JlIGlmIGl0IGlzIGF0IGFsbCBwb3NzaWJsZS4KICoKICogTW9zdCBvZiB0aGUgbWV0aG9kcyBvZiB0aGlzIGNsYXNzIGFyZSBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzLgogKiBVc2VycyBvZiB0aGlzIGNsYXNzIG5lZWQgdG8gd29ycnkgb25seSBhYm91dCB0aGUgY29uc3RydWN0b3IuCiAqCiAqIEBwYWNrYWdlIE9wZW5JRAogKi8KY2xhc3MgQXV0aF9PcGVuSURfRHVtYlN0b3JlIGV4dGVuZHMgQXV0aF9PcGVuSURfT3BlbklEU3RvcmUgewoKICAgIC8qKgogICAgICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgQXV0aF9PcGVuSURfRHVtYlN0b3JlfSBpbnN0YW5jZS4gRm9yIHRoZSBzZWN1cml0eQogICAgICogb2YgdGhlIHRva2VucyBnZW5lcmF0ZWQgYnkgdGhlIGxpYnJhcnksIHRoaXMgY2xhc3MgYXR0ZW1wdHMgdG8KICAgICAqIGF0IGxlYXN0IGhhdmUgYSBzZWN1cmUgaW1wbGVtZW50YXRpb24gb2YgZ2V0QXV0aEtleS4KICAgICAqCiAgICAgKiBXaGVuIHlvdSBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcywgcGFzcyBpbiBhIHNlY3JldAogICAgICogcGhyYXNlLiBUaGUgcGhyYXNlIGlzIGhhc2hlZCB3aXRoIHNoYTEgdG8gbWFrZSBpdCB0aGUgY29ycmVjdAogICAgICogbGVuZ3RoIGFuZCBmb3JtIGZvciBhbiBhdXRoIGtleS4gVGhhdCBhbGxvd3MgeW91IHRvIHVzZSBhIGxvbmcKICAgICAqIHN0cmluZyBhcyB0aGUgc2VjcmV0IHBocmFzZSwgd2hpY2ggbWVhbnMgeW91IGNhbiBtYWtlIGl0IHZlcnkKICAgICAqIGRpZmZpY3VsdCB0byBndWVzcy4KICAgICAqCiAgICAgKiBFYWNoIHtAbGluayBBdXRoX09wZW5JRF9EdW1iU3RvcmV9IGluc3RhbmNlIHRoYXQgaXMgY3JlYXRlZCBmb3IgdXNlIGJ5CiAgICAgKiB5b3VyIGNvbnN1bWVyIHNpdGUgbmVlZHMgdG8gdXNlIHRoZSBzYW1lICRzZWNyZXRfcGhyYXNlLgogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgc2VjcmV0X3BocmFzZSBUaGUgcGhyYXNlIHVzZWQgdG8gY3JlYXRlIHRoZSBhdXRoCiAgICAgKiBrZXkgcmV0dXJuZWQgYnkgZ2V0QXV0aEtleQogICAgICovCiAgICBmdW5jdGlvbiBBdXRoX09wZW5JRF9EdW1iU3RvcmUoJHNlY3JldF9waHJhc2UpCiAgICB7CiAgICAgICAgJHRoaXMtPmF1dGhfa2V5ID0gQXV0aF9PcGVuSURfU0hBMSgkc2VjcmV0X3BocmFzZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIGRvZXMgbm90aGluZy4KICAgICAqLwogICAgZnVuY3Rpb24gc3RvcmVBc3NvY2lhdGlvbigkc2VydmVyX3VybCwgJGFzc29jaWF0aW9uKQogICAgewogICAgfQoKICAgIC8qKgogICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiBhbHdheXMgcmV0dXJucyBudWxsLgogICAgICovCiAgICBmdW5jdGlvbiBnZXRBc3NvY2lhdGlvbigkc2VydmVyX3VybCwgJGhhbmRsZSA9IG51bGwpCiAgICB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9CgogICAgLyoqCiAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIGFsd2F5cyByZXR1cm5zIGZhbHNlLgogICAgICovCiAgICBmdW5jdGlvbiByZW1vdmVBc3NvY2lhdGlvbigkc2VydmVyX3VybCwgJGhhbmRsZSkKICAgIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgLyoqCiAgICAgKiBJbiBhIHN5c3RlbSB0cnVseSBsaW1pdGVkIHRvIGR1bWIgbW9kZSwgbm9uY2VzIG11c3QgYWxsIGJlCiAgICAgKiBhY2NlcHRlZC4gVGhpcyB0aGVyZWZvcmUgYWx3YXlzIHJldHVybnMgdHJ1ZSwgd2hpY2ggbWFrZXMKICAgICAqIHJlcGxheSBhdHRhY2tzIGZlYXNpYmxlLgogICAgICovCiAgICBmdW5jdGlvbiB1c2VOb25jZSgkc2VydmVyX3VybCwgJHRpbWVzdGFtcCwgJHNhbHQpCiAgICB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgLyoqCiAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBhdXRoIGtleSBnZW5lcmF0ZWQgYnkgdGhlIGNvbnN0cnVjdG9yLgogICAgICovCiAgICBmdW5jdGlvbiBnZXRBdXRoS2V5KCkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmF1dGhfa2V5OwogICAgfQp9Cgo=]]></data>
	</file>
	<file>
	  <filename>/openid-php-openid-782224d/Auth/OpenID/Extension.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBBbiBpbnRlcmZhY2UgZm9yIE9wZW5JRCBleHRlbnNpb25zLgogKgogKiBAcGFja2FnZSBPcGVuSUQKICovCgovKioKICogUmVxdWlyZSB0aGUgTWVzc2FnZSBpbXBsZW1lbnRhdGlvbi4KICovCnJlcXVpcmVfb25jZSAnQXV0aC9PcGVuSUQvTWVzc2FnZS5waHAnOwoKLyoqCiAqIEEgYmFzZSBjbGFzcyBmb3IgYWNjZXNzaW5nIGV4dGVuc2lvbiByZXF1ZXN0IGFuZCByZXNwb25zZSBkYXRhIGZvcgogKiB0aGUgT3BlbklEIDIgcHJvdG9jb2wuCiAqCiAqIEBwYWNrYWdlIE9wZW5JRAogKi8KY2xhc3MgQXV0aF9PcGVuSURfRXh0ZW5zaW9uIHsKICAgIC8qKgogICAgICogbnNfdXJpOiBUaGUgbmFtZXNwYWNlIHRvIHdoaWNoIHRvIGFkZCB0aGUgYXJndW1lbnRzIGZvciB0aGlzCiAgICAgKiBleHRlbnNpb24KICAgICAqLwogICAgdmFyICRuc191cmkgPSBudWxsOwogICAgdmFyICRuc19hbGlhcyA9IG51bGw7CgogICAgLyoqCiAgICAgKiBHZXQgdGhlIHN0cmluZyBhcmd1bWVudHMgdGhhdCBzaG91bGQgYmUgYWRkZWQgdG8gYW4gT3BlbklECiAgICAgKiBtZXNzYWdlIGZvciB0aGlzIGV4dGVuc2lvbi4KICAgICAqLwogICAgZnVuY3Rpb24gZ2V0RXh0ZW5zaW9uQXJncygpCiAgICB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9CgogICAgLyoqCiAgICAgKiBBZGQgdGhlIGFyZ3VtZW50cyBmcm9tIHRoaXMgZXh0ZW5zaW9uIHRvIHRoZSBwcm92aWRlZCBtZXNzYWdlLgogICAgICoKICAgICAqIFJldHVybnMgdGhlIG1lc3NhZ2Ugd2l0aCB0aGUgZXh0ZW5zaW9uIGFyZ3VtZW50cyBhZGRlZC4KICAgICAqLwogICAgZnVuY3Rpb24gdG9NZXNzYWdlKCRtZXNzYWdlKQogICAgewogICAgICAgICRpbXBsaWNpdCA9ICRtZXNzYWdlLT5pc09wZW5JRDEoKTsKICAgICAgICAkYWRkZWQgPSAkbWVzc2FnZS0+bmFtZXNwYWNlcy0+YWRkQWxpYXMoJHRoaXMtPm5zX3VyaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPm5zX2FsaWFzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaW1wbGljaXQpOwoKICAgICAgICBpZiAoJGFkZGVkID09PSBudWxsKSB7CiAgICAgICAgICAgIGlmICgkbWVzc2FnZS0+bmFtZXNwYWNlcy0+Z2V0QWxpYXMoJHRoaXMtPm5zX3VyaSkgIT0KICAgICAgICAgICAgICAgICR0aGlzLT5uc19hbGlhcykgewogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICRtZXNzYWdlLT51cGRhdGVBcmdzKCR0aGlzLT5uc191cmksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmdldEV4dGVuc2lvbkFyZ3MoKSk7CiAgICAgICAgcmV0dXJuICRtZXNzYWdlOwogICAgfQp9Cgo=]]></data>
	</file>
	<file>
	  <filename>/openid-php-openid-782224d/Auth/OpenID/FileStore.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBUaGlzIGZpbGUgc3VwcGxpZXMgYSBNZW1jYWNoZWQgc3RvcmUgYmFja2VuZCBmb3IgT3BlbklEIHNlcnZlcnMgYW5kCiAqIGNvbnN1bWVycy4KICoKICogUEhQIHZlcnNpb25zIDQgYW5kIDUKICoKICogTElDRU5TRTogU2VlIHRoZSBDT1BZSU5HIGZpbGUgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24uCiAqCiAqIEBwYWNrYWdlIE9wZW5JRAogKiBAYXV0aG9yIEphblJhaW4sIEluYy4gPG9wZW5pZEBqYW5yYWluLmNvbT4KICogQGNvcHlyaWdodCAyMDA1LTIwMDggSmFucmFpbiwgSW5jLgogKiBAbGljZW5zZSBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgQXBhY2hlCiAqLwoKLyoqCiAqIFJlcXVpcmUgYmFzZSBjbGFzcyBmb3IgY3JlYXRpbmcgYSBuZXcgaW50ZXJmYWNlLgogKi8KcmVxdWlyZV9vbmNlICdBdXRoL09wZW5JRC5waHAnOwpyZXF1aXJlX29uY2UgJ0F1dGgvT3BlbklEL0ludGVyZmFjZS5waHAnOwpyZXF1aXJlX29uY2UgJ0F1dGgvT3BlbklEL0hNQUMucGhwJzsKcmVxdWlyZV9vbmNlICdBdXRoL09wZW5JRC9Ob25jZS5waHAnOwoKLyoqCiAqIFRoaXMgaXMgYSBmaWxlc3lzdGVtLWJhc2VkIHN0b3JlIGZvciBPcGVuSUQgYXNzb2NpYXRpb25zIGFuZAogKiBub25jZXMuICBUaGlzIHN0b3JlIHNob3VsZCBiZSBzYWZlIGZvciB1c2UgaW4gY29uY3VycmVudCBzeXN0ZW1zIG9uCiAqIGJvdGggd2luZG93cyBhbmQgdW5peCAoZXhjbHVkaW5nIE5GUyBmaWxlc3lzdGVtcykuICBUaGVyZSBhcmUgYQogKiBjb3VwbGUgcmFjZSBjb25kaXRpb25zIGluIHRoZSBzeXN0ZW0sIGJ1dCB0aG9zZSBmYWlsdXJlIGNhc2VzIGhhdmUKICogYmVlbiBzZXQgdXAgaW4gc3VjaCBhIHdheSB0aGF0IHRoZSB3b3JzdC1jYXNlIGJlaGF2aW9yIGlzIHNvbWVvbmUKICogaGF2aW5nIHRvIHRyeSB0byBsb2cgaW4gYSBzZWNvbmQgdGltZS4KICoKICogTW9zdCBvZiB0aGUgbWV0aG9kcyBvZiB0aGlzIGNsYXNzIGFyZSBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzLgogKiBQZW9wbGUgd2lzaGluZyB0byBqdXN0IHVzZSB0aGlzIHN0b3JlIG5lZWQgb25seSBwYXkgYXR0ZW50aW9uIHRvCiAqIHRoZSBjb25zdHJ1Y3Rvci4KICoKICogQHBhY2thZ2UgT3BlbklECiAqLwpjbGFzcyBBdXRoX09wZW5JRF9GaWxlU3RvcmUgZXh0ZW5kcyBBdXRoX09wZW5JRF9PcGVuSURTdG9yZSB7CgogICAgLyoqCiAgICAgKiBJbml0aWFsaXplcyBhIG5ldyB7QGxpbmsgQXV0aF9PcGVuSURfRmlsZVN0b3JlfS4gIFRoaXMKICAgICAqIGluaXRpYWxpemVzIHRoZSBub25jZSBhbmQgYXNzb2NpYXRpb24gZGlyZWN0b3JpZXMsIHdoaWNoIGFyZQogICAgICogc3ViZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBwYXNzZWQgaW4uCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkZGlyZWN0b3J5IFRoaXMgaXMgdGhlIGRpcmVjdG9yeSB0byBwdXQgdGhlIHN0b3JlCiAgICAgKiBkaXJlY3RvcmllcyBpbi4KICAgICAqLwogICAgZnVuY3Rpb24gQXV0aF9PcGVuSURfRmlsZVN0b3JlKCRkaXJlY3RvcnkpCiAgICB7CiAgICAgICAgaWYgKCFBdXRoX09wZW5JRDo6ZW5zdXJlRGlyKCRkaXJlY3RvcnkpKSB7CiAgICAgICAgICAgIHRyaWdnZXJfZXJyb3IoJ05vdCBhIGRpcmVjdG9yeSBhbmQgZmFpbGVkIHRvIGNyZWF0ZTogJwogICAgICAgICAgICAgICAgICAgICAgICAgIC4gJGRpcmVjdG9yeSwgRV9VU0VSX0VSUk9SKTsKICAgICAgICB9CiAgICAgICAgJGRpcmVjdG9yeSA9IHJlYWxwYXRoKCRkaXJlY3RvcnkpOwoKICAgICAgICAkdGhpcy0+ZGlyZWN0b3J5ID0gJGRpcmVjdG9yeTsKICAgICAgICAkdGhpcy0+YWN0aXZlID0gdHJ1ZTsKCiAgICAgICAgJHRoaXMtPm5vbmNlX2RpciA9ICRkaXJlY3RvcnkgLiBESVJFQ1RPUllfU0VQQVJBVE9SIC4gJ25vbmNlcyc7CgogICAgICAgICR0aGlzLT5hc3NvY2lhdGlvbl9kaXIgPSAkZGlyZWN0b3J5IC4gRElSRUNUT1JZX1NFUEFSQVRPUiAuCiAgICAgICAgICAgICdhc3NvY2lhdGlvbnMnOwoKICAgICAgICAvLyBUZW1wIGRpciBtdXN0IGJlIG9uIHRoZSBzYW1lIGZpbGVzeXN0ZW0gYXMgdGhlIGFzc2NpYXRpb25zCiAgICAgICAgLy8gJGRpcmVjdG9yeS4KICAgICAgICAkdGhpcy0+dGVtcF9kaXIgPSAkZGlyZWN0b3J5IC4gRElSRUNUT1JZX1NFUEFSQVRPUiAuICd0ZW1wJzsKCiAgICAgICAgJHRoaXMtPm1heF9ub25jZV9hZ2UgPSA2ICogNjAgKiA2MDsgLy8gU2l4IGhvdXJzLCBpbiBzZWNvbmRzCgogICAgICAgIGlmICghJHRoaXMtPl9zZXR1cCgpKSB7CiAgICAgICAgICAgIHRyaWdnZXJfZXJyb3IoJ0ZhaWxlZCB0byBpbml0aWFsaXplIE9wZW5JRCBmaWxlIHN0b3JlIGluICcgLgogICAgICAgICAgICAgICAgICAgICAgICAgICRkaXJlY3RvcnksIEVfVVNFUl9FUlJPUik7CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGRlc3Ryb3koKQogICAgewogICAgICAgIEF1dGhfT3BlbklEX0ZpbGVTdG9yZTo6X3JtdHJlZSgkdGhpcy0+ZGlyZWN0b3J5KTsKICAgICAgICAkdGhpcy0+YWN0aXZlID0gZmFsc2U7CiAgICB9CgogICAgLyoqCiAgICAgKiBNYWtlIHN1cmUgdGhhdCB0aGUgZGlyZWN0b3JpZXMgaW4gd2hpY2ggd2Ugc3RvcmUgb3VyIGRhdGEKICAgICAqIGV4aXN0LgogICAgICoKICAgICAqIEBhY2Nlc3MgcHJpdmF0ZQogICAgICovCiAgICBmdW5jdGlvbiBfc2V0dXAoKQogICAgewogICAgICAgIHJldHVybiAoQXV0aF9PcGVuSUQ6OmVuc3VyZURpcigkdGhpcy0+bm9uY2VfZGlyKSAmJgogICAgICAgICAgICAgICAgQXV0aF9PcGVuSUQ6OmVuc3VyZURpcigkdGhpcy0+YXNzb2NpYXRpb25fZGlyKSAmJgogICAgICAgICAgICAgICAgQXV0aF9PcGVuSUQ6OmVuc3VyZURpcigkdGhpcy0+dGVtcF9kaXIpKTsKICAgIH0KCiAgICAvKioKICAgICAqIENyZWF0ZSBhIHRlbXBvcmFyeSBmaWxlIG9uIHRoZSBzYW1lIGZpbGVzeXN0ZW0gYXMKICAgICAqICR0aGlzLT5hc3NvY2lhdGlvbl9kaXIuCiAgICAgKgogICAgICogVGhlIHRlbXBvcmFyeSBkaXJlY3Rvcnkgc2hvdWxkIG5vdCBiZSBjbGVhbmVkIGlmIHRoZXJlIGFyZSBhbnkKICAgICAqIHByb2Nlc3NlcyB1c2luZyB0aGUgc3RvcmUuIElmIHRoZXJlIGlzIG5vIGFjdGl2ZSBwcm9jZXNzIHVzaW5nCiAgICAgKiB0aGUgc3RvcmUsIGl0IGlzIHNhZmUgdG8gcmVtb3ZlIGFsbCBvZiB0aGUgZmlsZXMgaW4gdGhlCiAgICAgKiB0ZW1wb3JhcnkgZGlyZWN0b3J5LgogICAgICoKICAgICAqIEByZXR1cm4gYXJyYXkgKCRmZCwgJGZpbGVuYW1lKQogICAgICogQGFjY2VzcyBwcml2YXRlCiAgICAgKi8KICAgIGZ1bmN0aW9uIF9ta3RlbXAoKQogICAgewogICAgICAgICRuYW1lID0gQXV0aF9PcGVuSURfRmlsZVN0b3JlOjpfbWtzdGVtcCgkZGlyID0gJHRoaXMtPnRlbXBfZGlyKTsKICAgICAgICAkZmlsZV9vYmogPSBAZm9wZW4oJG5hbWUsICd3YicpOwogICAgICAgIGlmICgkZmlsZV9vYmogIT09IGZhbHNlKSB7CiAgICAgICAgICAgIHJldHVybiBhcnJheSgkZmlsZV9vYmosICRuYW1lKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBBdXRoX09wZW5JRF9GaWxlU3RvcmU6Ol9yZW1vdmVJZlByZXNlbnQoJG5hbWUpOwogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBjbGVhbnVwTm9uY2VzKCkKICAgIHsKICAgICAgICBnbG9iYWwgJEF1dGhfT3BlbklEX1NLRVc7CgogICAgICAgICRub25jZXMgPSBBdXRoX09wZW5JRF9GaWxlU3RvcmU6Ol9saXN0ZGlyKCR0aGlzLT5ub25jZV9kaXIpOwogICAgICAgICRub3cgPSB0aW1lKCk7CgogICAgICAgICRyZW1vdmVkID0gMDsKICAgICAgICAvLyBDaGVjayBhbGwgbm9uY2VzIGZvciBleHBpcnkKICAgICAgICBmb3JlYWNoICgkbm9uY2VzIGFzICRub25jZV9mbmFtZSkgewogICAgICAgICAgICAkYmFzZSA9IGJhc2VuYW1lKCRub25jZV9mbmFtZSk7CiAgICAgICAgICAgICRwYXJ0cyA9IGV4cGxvZGUoJy0nLCAkYmFzZSwgMik7CiAgICAgICAgICAgICR0aW1lc3RhbXAgPSAkcGFydHNbMF07CiAgICAgICAgICAgICR0aW1lc3RhbXAgPSBpbnR2YWwoJHRpbWVzdGFtcCwgMTYpOwogICAgICAgICAgICBpZiAoYWJzKCR0aW1lc3RhbXAgLSAkbm93KSA+ICRBdXRoX09wZW5JRF9TS0VXKSB7CiAgICAgICAgICAgICAgICBBdXRoX09wZW5JRF9GaWxlU3RvcmU6Ol9yZW1vdmVJZlByZXNlbnQoJG5vbmNlX2ZuYW1lKTsKICAgICAgICAgICAgICAgICRyZW1vdmVkICs9IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuICRyZW1vdmVkOwogICAgfQoKICAgIC8qKgogICAgICogQ3JlYXRlIGEgdW5pcXVlIGZpbGVuYW1lIGZvciBhIGdpdmVuIHNlcnZlciB1cmwgYW5kCiAgICAgKiBoYW5kbGUuIFRoaXMgaW1wbGVtZW50YXRpb24gZG9lcyBub3QgYXNzdW1lIGFueXRoaW5nIGFib3V0IHRoZQogICAgICogZm9ybWF0IG9mIHRoZSBoYW5kbGUuIFRoZSBmaWxlbmFtZSB0aGF0IGlzIHJldHVybmVkIHdpbGwKICAgICAqIGNvbnRhaW4gdGhlIGRvbWFpbiBuYW1lIGZyb20gdGhlIHNlcnZlciBVUkwgZm9yIGVhc2Ugb2YgaHVtYW4KICAgICAqIGluc3BlY3Rpb24gb2YgdGhlIGRhdGEgZGlyZWN0b3J5LgogICAgICoKICAgICAqIEByZXR1cm4gc3RyaW5nICRmaWxlbmFtZQogICAgICovCiAgICBmdW5jdGlvbiBnZXRBc3NvY2lhdGlvbkZpbGVuYW1lKCRzZXJ2ZXJfdXJsLCAkaGFuZGxlKQogICAgewogICAgICAgIGlmICghJHRoaXMtPmFjdGl2ZSkgewogICAgICAgICAgICB0cmlnZ2VyX2Vycm9yKCJGaWxlU3RvcmUgbm8gbG9uZ2VyIGFjdGl2ZSIsIEVfVVNFUl9FUlJPUik7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KCiAgICAgICAgaWYgKHN0cnBvcygkc2VydmVyX3VybCwgJzovLycpID09PSBmYWxzZSkgewogICAgICAgICAgICB0cmlnZ2VyX2Vycm9yKHNwcmludGYoIkJhZCBzZXJ2ZXIgVVJMOiAlcyIsICRzZXJ2ZXJfdXJsKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBFX1VTRVJfV0FSTklORyk7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KCiAgICAgICAgbGlzdCgkcHJvdG8sICRyZXN0KSA9IGV4cGxvZGUoJzovLycsICRzZXJ2ZXJfdXJsLCAyKTsKICAgICAgICAkcGFydHMgPSBleHBsb2RlKCcvJywgJHJlc3QpOwogICAgICAgICRkb21haW4gPSBBdXRoX09wZW5JRF9GaWxlU3RvcmU6Ol9maWxlbmFtZUVzY2FwZSgkcGFydHNbMF0pOwogICAgICAgICR1cmxfaGFzaCA9IEF1dGhfT3BlbklEX0ZpbGVTdG9yZTo6X3NhZmU2NCgkc2VydmVyX3VybCk7CiAgICAgICAgaWYgKCRoYW5kbGUpIHsKICAgICAgICAgICAgJGhhbmRsZV9oYXNoID0gQXV0aF9PcGVuSURfRmlsZVN0b3JlOjpfc2FmZTY0KCRoYW5kbGUpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRoYW5kbGVfaGFzaCA9ICcnOwogICAgICAgIH0KCiAgICAgICAgJGZpbGVuYW1lID0gc3ByaW50ZignJXMtJXMtJXMtJXMnLCAkcHJvdG8sICRkb21haW4sICR1cmxfaGFzaCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRoYW5kbGVfaGFzaCk7CgogICAgICAgIHJldHVybiAkdGhpcy0+YXNzb2NpYXRpb25fZGlyLiBESVJFQ1RPUllfU0VQQVJBVE9SIC4gJGZpbGVuYW1lOwogICAgfQoKICAgIC8qKgogICAgICogU3RvcmUgYW4gYXNzb2NpYXRpb24gaW4gdGhlIGFzc29jaWF0aW9uIGRpcmVjdG9yeS4KICAgICAqLwogICAgZnVuY3Rpb24gc3RvcmVBc3NvY2lhdGlvbigkc2VydmVyX3VybCwgJGFzc29jaWF0aW9uKQogICAgewogICAgICAgIGlmICghJHRoaXMtPmFjdGl2ZSkgewogICAgICAgICAgICB0cmlnZ2VyX2Vycm9yKCJGaWxlU3RvcmUgbm8gbG9uZ2VyIGFjdGl2ZSIsIEVfVVNFUl9FUlJPUik7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CgogICAgICAgICRhc3NvY2lhdGlvbl9zID0gJGFzc29jaWF0aW9uLT5zZXJpYWxpemUoKTsKICAgICAgICAkZmlsZW5hbWUgPSAkdGhpcy0+Z2V0QXNzb2NpYXRpb25GaWxlbmFtZSgkc2VydmVyX3VybCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYXNzb2NpYXRpb24tPmhhbmRsZSk7CiAgICAgICAgbGlzdCgkdG1wX2ZpbGUsICR0bXApID0gJHRoaXMtPl9ta3RlbXAoKTsKCiAgICAgICAgaWYgKCEkdG1wX2ZpbGUpIHsKICAgICAgICAgICAgdHJpZ2dlcl9lcnJvcigiX21rdGVtcCBkaWRuJ3QgcmV0dXJuIGEgdmFsaWQgZmlsZSBkZXNjcmlwdG9yIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBFX1VTRVJfV0FSTklORyk7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CgogICAgICAgIGZ3cml0ZSgkdG1wX2ZpbGUsICRhc3NvY2lhdGlvbl9zKTsKCiAgICAgICAgZmZsdXNoKCR0bXBfZmlsZSk7CgogICAgICAgIGZjbG9zZSgkdG1wX2ZpbGUpOwoKICAgICAgICBpZiAoQHJlbmFtZSgkdG1wLCAkZmlsZW5hbWUpKSB7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vIEluIGNhc2Ugd2UgYXJlIHJ1bm5pbmcgb24gV2luZG93cywgdHJ5IHVubGlua2luZyB0aGUKICAgICAgICAgICAgLy8gZmlsZSBpbiBjYXNlIGl0IGV4aXN0cy4KICAgICAgICAgICAgQHVubGluaygkZmlsZW5hbWUpOwoKICAgICAgICAgICAgLy8gTm93IHRoZSB0YXJnZXQgc2hvdWxkIG5vdCBleGlzdC4gVHJ5IHJlbmFtaW5nIGFnYWluLAogICAgICAgICAgICAvLyBnaXZpbmcgdXAgaWYgaXQgZmFpbHMuCiAgICAgICAgICAgIGlmIChAcmVuYW1lKCR0bXAsICRmaWxlbmFtZSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBJZiB0aGVyZSB3YXMgYW4gZXJyb3IsIGRvbid0IGxlYXZlIHRoZSB0ZW1wb3JhcnkgZmlsZQogICAgICAgIC8vIGFyb3VuZC4KICAgICAgICBBdXRoX09wZW5JRF9GaWxlU3RvcmU6Ol9yZW1vdmVJZlByZXNlbnQoJHRtcCk7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIC8qKgogICAgICogUmV0cmlldmUgYW4gYXNzb2NpYXRpb24uIElmIG5vIGhhbmRsZSBpcyBzcGVjaWZpZWQsIHJldHVybiB0aGUKICAgICAqIGFzc29jaWF0aW9uIHdpdGggdGhlIG1vc3QgcmVjZW50IGlzc3VlIHRpbWUuCiAgICAgKgogICAgICogQHJldHVybiBtaXhlZCAkYXNzb2NpYXRpb24KICAgICAqLwogICAgZnVuY3Rpb24gZ2V0QXNzb2NpYXRpb24oJHNlcnZlcl91cmwsICRoYW5kbGUgPSBudWxsKQogICAgewogICAgICAgIGlmICghJHRoaXMtPmFjdGl2ZSkgewogICAgICAgICAgICB0cmlnZ2VyX2Vycm9yKCJGaWxlU3RvcmUgbm8gbG9uZ2VyIGFjdGl2ZSIsIEVfVVNFUl9FUlJPUik7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KCiAgICAgICAgaWYgKCRoYW5kbGUgPT09IG51bGwpIHsKICAgICAgICAgICAgJGhhbmRsZSA9ICcnOwogICAgICAgIH0KCiAgICAgICAgLy8gVGhlIGZpbGVuYW1lIHdpdGggdGhlIGVtcHR5IGhhbmRsZSBpcyBhIHByZWZpeCBvZiBhbGwgb3RoZXIKICAgICAgICAvLyBhc3NvY2lhdGlvbnMgZm9yIHRoZSBnaXZlbiBzZXJ2ZXIgVVJMLgogICAgICAgICRmaWxlbmFtZSA9ICR0aGlzLT5nZXRBc3NvY2lhdGlvbkZpbGVuYW1lKCRzZXJ2ZXJfdXJsLCAkaGFuZGxlKTsKCiAgICAgICAgaWYgKCRoYW5kbGUpIHsKICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5fZ2V0QXNzb2NpYXRpb24oJGZpbGVuYW1lKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkYXNzb2NpYXRpb25fZmlsZXMgPQogICAgICAgICAgICAgICAgQXV0aF9PcGVuSURfRmlsZVN0b3JlOjpfbGlzdGRpcigkdGhpcy0+YXNzb2NpYXRpb25fZGlyKTsKICAgICAgICAgICAgJG1hdGNoaW5nX2ZpbGVzID0gYXJyYXkoKTsKCiAgICAgICAgICAgIC8vIHN0cmlwIG9mZiB0aGUgcGF0aCB0byBkbyB0aGUgY29tcGFyaXNvbgogICAgICAgICAgICAkbmFtZSA9IGJhc2VuYW1lKCRmaWxlbmFtZSk7CiAgICAgICAgICAgIGZvcmVhY2ggKCRhc3NvY2lhdGlvbl9maWxlcyBhcyAkYXNzb2NpYXRpb25fZmlsZSkgewogICAgICAgICAgICAgICAgJGJhc2UgPSBiYXNlbmFtZSgkYXNzb2NpYXRpb25fZmlsZSk7CiAgICAgICAgICAgICAgICBpZiAoc3RycG9zKCRiYXNlLCAkbmFtZSkgPT09IDApIHsKICAgICAgICAgICAgICAgICAgICAkbWF0Y2hpbmdfZmlsZXNbXSA9ICRhc3NvY2lhdGlvbl9maWxlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAkbWF0Y2hpbmdfYXNzb2NpYXRpb25zID0gYXJyYXkoKTsKICAgICAgICAgICAgLy8gcmVhZCB0aGUgbWF0Y2hpbmcgZmlsZXMgYW5kIHNvcnQgYnkgdGltZSBpc3N1ZWQKICAgICAgICAgICAgZm9yZWFjaCAoJG1hdGNoaW5nX2ZpbGVzIGFzICRmdWxsX25hbWUpIHsKICAgICAgICAgICAgICAgICRhc3NvY2lhdGlvbiA9ICR0aGlzLT5fZ2V0QXNzb2NpYXRpb24oJGZ1bGxfbmFtZSk7CiAgICAgICAgICAgICAgICBpZiAoJGFzc29jaWF0aW9uICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgJG1hdGNoaW5nX2Fzc29jaWF0aW9uc1tdID0gYXJyYXkoJGFzc29jaWF0aW9uLT5pc3N1ZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGFzc29jaWF0aW9uKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgJGlzc3VlZCA9IGFycmF5KCk7CiAgICAgICAgICAgICRhc3NvY3MgPSBhcnJheSgpOwogICAgICAgICAgICBmb3JlYWNoICgkbWF0Y2hpbmdfYXNzb2NpYXRpb25zIGFzICRrZXkgPT4gJGFzc29jKSB7CiAgICAgICAgICAgICAgICAkaXNzdWVkWyRrZXldID0gJGFzc29jWzBdOwogICAgICAgICAgICAgICAgJGFzc29jc1ska2V5XSA9ICRhc3NvY1sxXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgYXJyYXlfbXVsdGlzb3J0KCRpc3N1ZWQsIFNPUlRfREVTQywgJGFzc29jcywgU09SVF9ERVNDLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJG1hdGNoaW5nX2Fzc29jaWF0aW9ucyk7CgogICAgICAgICAgICAvLyByZXR1cm4gdGhlIG1vc3QgcmVjZW50bHkgaXNzdWVkIG9uZS4KICAgICAgICAgICAgaWYgKCRtYXRjaGluZ19hc3NvY2lhdGlvbnMpIHsKICAgICAgICAgICAgICAgIGxpc3QoJGlzc3VlZCwgJGFzc29jKSA9ICRtYXRjaGluZ19hc3NvY2lhdGlvbnNbMF07CiAgICAgICAgICAgICAgICByZXR1cm4gJGFzc29jOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBAYWNjZXNzIHByaXZhdGUKICAgICAqLwogICAgZnVuY3Rpb24gX2dldEFzc29jaWF0aW9uKCRmaWxlbmFtZSkKICAgIHsKICAgICAgICBpZiAoISR0aGlzLT5hY3RpdmUpIHsKICAgICAgICAgICAgdHJpZ2dlcl9lcnJvcigiRmlsZVN0b3JlIG5vIGxvbmdlciBhY3RpdmUiLCBFX1VTRVJfRVJST1IpOwogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CgogICAgICAgICRhc3NvY19maWxlID0gQGZvcGVuKCRmaWxlbmFtZSwgJ3JiJyk7CgogICAgICAgIGlmICgkYXNzb2NfZmlsZSA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQoKICAgICAgICAkYXNzb2NfcyA9IGZyZWFkKCRhc3NvY19maWxlLCBmaWxlc2l6ZSgkZmlsZW5hbWUpKTsKICAgICAgICBmY2xvc2UoJGFzc29jX2ZpbGUpOwoKICAgICAgICBpZiAoISRhc3NvY19zKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KCiAgICAgICAgJGFzc29jaWF0aW9uID0KICAgICAgICAgICAgQXV0aF9PcGVuSURfQXNzb2NpYXRpb246OmRlc2VyaWFsaXplKCdBdXRoX09wZW5JRF9Bc3NvY2lhdGlvbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRhc3NvY19zKTsKCiAgICAgICAgaWYgKCEkYXNzb2NpYXRpb24pIHsKICAgICAgICAgICAgQXV0aF9PcGVuSURfRmlsZVN0b3JlOjpfcmVtb3ZlSWZQcmVzZW50KCRmaWxlbmFtZSk7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KCiAgICAgICAgaWYgKCRhc3NvY2lhdGlvbi0+Z2V0RXhwaXJlc0luKCkgPT0gMCkgewogICAgICAgICAgICBBdXRoX09wZW5JRF9GaWxlU3RvcmU6Ol9yZW1vdmVJZlByZXNlbnQoJGZpbGVuYW1lKTsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuICRhc3NvY2lhdGlvbjsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBSZW1vdmUgYW4gYXNzb2NpYXRpb24gaWYgaXQgZXhpc3RzLiBEbyBub3RoaW5nIGlmIGl0IGRvZXMgbm90LgogICAgICoKICAgICAqIEByZXR1cm4gYm9vbCAkc3VjY2VzcwogICAgICovCiAgICBmdW5jdGlvbiByZW1vdmVBc3NvY2lhdGlvbigkc2VydmVyX3VybCwgJGhhbmRsZSkKICAgIHsKICAgICAgICBpZiAoISR0aGlzLT5hY3RpdmUpIHsKICAgICAgICAgICAgdHJpZ2dlcl9lcnJvcigiRmlsZVN0b3JlIG5vIGxvbmdlciBhY3RpdmUiLCBFX1VTRVJfRVJST1IpOwogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CgogICAgICAgICRhc3NvYyA9ICR0aGlzLT5nZXRBc3NvY2lhdGlvbigkc2VydmVyX3VybCwgJGhhbmRsZSk7CiAgICAgICAgaWYgKCRhc3NvYyA9PT0gbnVsbCkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJGZpbGVuYW1lID0gJHRoaXMtPmdldEFzc29jaWF0aW9uRmlsZW5hbWUoJHNlcnZlcl91cmwsICRoYW5kbGUpOwogICAgICAgICAgICByZXR1cm4gQXV0aF9PcGVuSURfRmlsZVN0b3JlOjpfcmVtb3ZlSWZQcmVzZW50KCRmaWxlbmFtZSk7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJuIHdoZXRoZXIgdGhpcyBub25jZSBpcyBwcmVzZW50LiBBcyBhIHNpZGUgZWZmZWN0LCBtYXJrIGl0CiAgICAgKiBhcyBubyBsb25nZXIgcHJlc2VudC4KICAgICAqCiAgICAgKiBAcmV0dXJuIGJvb2wgJHByZXNlbnQKICAgICAqLwogICAgZnVuY3Rpb24gdXNlTm9uY2UoJHNlcnZlcl91cmwsICR0aW1lc3RhbXAsICRzYWx0KQogICAgewogICAgICAgIGdsb2JhbCAkQXV0aF9PcGVuSURfU0tFVzsKCiAgICAgICAgaWYgKCEkdGhpcy0+YWN0aXZlKSB7CiAgICAgICAgICAgIHRyaWdnZXJfZXJyb3IoIkZpbGVTdG9yZSBubyBsb25nZXIgYWN0aXZlIiwgRV9VU0VSX0VSUk9SKTsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQoKICAgICAgICBpZiAoIGFicygkdGltZXN0YW1wIC0gdGltZSgpKSA+ICRBdXRoX09wZW5JRF9TS0VXICkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICBpZiAoJHNlcnZlcl91cmwpIHsKICAgICAgICAgICAgbGlzdCgkcHJvdG8sICRyZXN0KSA9IGV4cGxvZGUoJzovLycsICRzZXJ2ZXJfdXJsLCAyKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkcHJvdG8gPSAnJzsKICAgICAgICAgICAgJHJlc3QgPSAnJzsKICAgICAgICB9CgogICAgICAgICRwYXJ0cyA9IGV4cGxvZGUoJy8nLCAkcmVzdCwgMik7CiAgICAgICAgJGRvbWFpbiA9ICR0aGlzLT5fZmlsZW5hbWVFc2NhcGUoJHBhcnRzWzBdKTsKICAgICAgICAkdXJsX2hhc2ggPSAkdGhpcy0+X3NhZmU2NCgkc2VydmVyX3VybCk7CiAgICAgICAgJHNhbHRfaGFzaCA9ICR0aGlzLT5fc2FmZTY0KCRzYWx0KTsKCiAgICAgICAgJGZpbGVuYW1lID0gc3ByaW50ZignJTA4eC0lcy0lcy0lcy0lcycsICR0aW1lc3RhbXAsICRwcm90bywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRkb21haW4sICR1cmxfaGFzaCwgJHNhbHRfaGFzaCk7CiAgICAgICAgJGZpbGVuYW1lID0gJHRoaXMtPm5vbmNlX2RpciAuIERJUkVDVE9SWV9TRVBBUkFUT1IgLiAkZmlsZW5hbWU7CgogICAgICAgICRyZXN1bHQgPSBAZm9wZW4oJGZpbGVuYW1lLCAneCcpOwoKICAgICAgICBpZiAoJHJlc3VsdCA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGZjbG9zZSgkcmVzdWx0KTsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogUmVtb3ZlIGV4cGlyZWQgZW50cmllcyBmcm9tIHRoZSBkYXRhYmFzZS4gVGhpcyBpcyBwb3RlbnRpYWxseQogICAgICogZXhwZW5zaXZlLCBzbyBvbmx5IHJ1biB3aGVuIGl0IGlzIGFjY2VwdGFibGUgdG8gdGFrZSB0aW1lLgogICAgICoKICAgICAqIEBhY2Nlc3MgcHJpdmF0ZQogICAgICovCiAgICBmdW5jdGlvbiBfYWxsQXNzb2NzKCkKICAgIHsKICAgICAgICAkYWxsX2Fzc29jaWF0aW9ucyA9IGFycmF5KCk7CgogICAgICAgICRhc3NvY2lhdGlvbl9maWxlbmFtZXMgPQogICAgICAgICAgICBBdXRoX09wZW5JRF9GaWxlU3RvcmU6Ol9saXN0ZGlyKCR0aGlzLT5hc3NvY2lhdGlvbl9kaXIpOwoKICAgICAgICBmb3JlYWNoICgkYXNzb2NpYXRpb25fZmlsZW5hbWVzIGFzICRhc3NvY2lhdGlvbl9maWxlbmFtZSkgewogICAgICAgICAgICAkYXNzb2NpYXRpb25fZmlsZSA9IGZvcGVuKCRhc3NvY2lhdGlvbl9maWxlbmFtZSwgJ3JiJyk7CgogICAgICAgICAgICBpZiAoJGFzc29jaWF0aW9uX2ZpbGUgIT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAkYXNzb2NfcyA9IGZyZWFkKCRhc3NvY2lhdGlvbl9maWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlc2l6ZSgkYXNzb2NpYXRpb25fZmlsZW5hbWUpKTsKICAgICAgICAgICAgICAgIGZjbG9zZSgkYXNzb2NpYXRpb25fZmlsZSk7CgogICAgICAgICAgICAgICAgLy8gUmVtb3ZlIGV4cGlyZWQgb3IgY29ycnVwdGVkIGFzc29jaWF0aW9ucwogICAgICAgICAgICAgICAgJGFzc29jaWF0aW9uID0KICAgICAgICAgICAgICAgICAgQXV0aF9PcGVuSURfQXNzb2NpYXRpb246OmRlc2VyaWFsaXplKAogICAgICAgICAgICAgICAgICAgICAgICAgJ0F1dGhfT3BlbklEX0Fzc29jaWF0aW9uJywgJGFzc29jX3MpOwoKICAgICAgICAgICAgICAgIGlmICgkYXNzb2NpYXRpb24gPT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICBBdXRoX09wZW5JRF9GaWxlU3RvcmU6Ol9yZW1vdmVJZlByZXNlbnQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYXNzb2NpYXRpb25fZmlsZW5hbWUpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJGFzc29jaWF0aW9uLT5nZXRFeHBpcmVzSW4oKSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRhbGxfYXNzb2NpYXRpb25zW10gPSBhcnJheSgkYXNzb2NpYXRpb25fZmlsZW5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYXNzb2NpYXRpb24pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRhbGxfYXNzb2NpYXRpb25zOwogICAgfQoKICAgIGZ1bmN0aW9uIGNsZWFuKCkKICAgIHsKICAgICAgICBpZiAoISR0aGlzLT5hY3RpdmUpIHsKICAgICAgICAgICAgdHJpZ2dlcl9lcnJvcigiRmlsZVN0b3JlIG5vIGxvbmdlciBhY3RpdmUiLCBFX1VTRVJfRVJST1IpOwogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CgogICAgICAgICRub25jZXMgPSBBdXRoX09wZW5JRF9GaWxlU3RvcmU6Ol9saXN0ZGlyKCR0aGlzLT5ub25jZV9kaXIpOwogICAgICAgICRub3cgPSB0aW1lKCk7CgogICAgICAgIC8vIENoZWNrIGFsbCBub25jZXMgZm9yIGV4cGlyeQogICAgICAgIGZvcmVhY2ggKCRub25jZXMgYXMgJG5vbmNlKSB7CiAgICAgICAgICAgIGlmICghQXV0aF9PcGVuSURfY2hlY2tUaW1lc3RhbXAoJG5vbmNlLCAkbm93KSkgewogICAgICAgICAgICAgICAgJGZpbGVuYW1lID0gJHRoaXMtPm5vbmNlX2RpciAuIERJUkVDVE9SWV9TRVBBUkFUT1IgLiAkbm9uY2U7CiAgICAgICAgICAgICAgICBBdXRoX09wZW5JRF9GaWxlU3RvcmU6Ol9yZW1vdmVJZlByZXNlbnQoJGZpbGVuYW1lKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZm9yZWFjaCAoJHRoaXMtPl9hbGxBc3NvY3MoKSBhcyAkcGFpcikgewogICAgICAgICAgICBsaXN0KCRhc3NvY19maWxlbmFtZSwgJGFzc29jKSA9ICRwYWlyOwogICAgICAgICAgICBpZiAoJGFzc29jLT5nZXRFeHBpcmVzSW4oKSA9PSAwKSB7CiAgICAgICAgICAgICAgICBBdXRoX09wZW5JRF9GaWxlU3RvcmU6Ol9yZW1vdmVJZlByZXNlbnQoJGFzc29jX2ZpbGVuYW1lKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEBhY2Nlc3MgcHJpdmF0ZQogICAgICovCiAgICBmdW5jdGlvbiBfcm10cmVlKCRkaXIpCiAgICB7CiAgICAgICAgaWYgKCRkaXJbc3RybGVuKCRkaXIpIC0gMV0gIT0gRElSRUNUT1JZX1NFUEFSQVRPUikgewogICAgICAgICAgICAkZGlyIC49IERJUkVDVE9SWV9TRVBBUkFUT1I7CiAgICAgICAgfQoKICAgICAgICBpZiAoJGhhbmRsZSA9IG9wZW5kaXIoJGRpcikpIHsKICAgICAgICAgICAgd2hpbGUgKCRpdGVtID0gcmVhZGRpcigkaGFuZGxlKSkgewogICAgICAgICAgICAgICAgaWYgKCFpbl9hcnJheSgkaXRlbSwgYXJyYXkoJy4nLCAnLi4nKSkpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoaXNfZGlyKCRkaXIgLiAkaXRlbSkpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghQXV0aF9PcGVuSURfRmlsZVN0b3JlOjpfcm10cmVlKCRkaXIgLiAkaXRlbSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNfZmlsZSgkZGlyIC4gJGl0ZW0pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdW5saW5rKCRkaXIgLiAkaXRlbSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgY2xvc2VkaXIoJGhhbmRsZSk7CgogICAgICAgICAgICBpZiAoIUBybWRpcigkZGlyKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvLyBDb3VsZG4ndCBvcGVuIGRpcmVjdG9yeS4KICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEBhY2Nlc3MgcHJpdmF0ZQogICAgICovCiAgICBmdW5jdGlvbiBfbWtzdGVtcCgkZGlyKQogICAgewogICAgICAgIGZvcmVhY2ggKHJhbmdlKDAsIDQpIGFzICRpKSB7CiAgICAgICAgICAgICRuYW1lID0gdGVtcG5hbSgkZGlyLCAicGhwX29wZW5pZF9maWxlc3RvcmVfIik7CgogICAgICAgICAgICBpZiAoJG5hbWUgIT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJG5hbWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIC8qKgogICAgICogQGFjY2VzcyBwcml2YXRlCiAgICAgKi8KICAgIHN0YXRpYyBmdW5jdGlvbiBfbWtkdGVtcCgkZGlyKQogICAgewogICAgICAgIGZvcmVhY2ggKHJhbmdlKDAsIDQpIGFzICRpKSB7CiAgICAgICAgICAgICRuYW1lID0gJGRpciAuIHN0cnZhbChESVJFQ1RPUllfU0VQQVJBVE9SKSAuIHN0cnZhbChnZXRteXBpZCgpKSAuCiAgICAgICAgICAgICAgICAiLSIgLiBzdHJ2YWwocmFuZCgxLCB0aW1lKCkpKTsKICAgICAgICAgICAgaWYgKCFta2RpcigkbmFtZSwgMDcwMCkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiAkbmFtZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgLyoqCiAgICAgKiBAYWNjZXNzIHByaXZhdGUKICAgICAqLwogICAgZnVuY3Rpb24gX2xpc3RkaXIoJGRpcikKICAgIHsKICAgICAgICAkaGFuZGxlID0gb3BlbmRpcigkZGlyKTsKICAgICAgICAkZmlsZXMgPSBhcnJheSgpOwogICAgICAgIHdoaWxlIChmYWxzZSAhPT0gKCRmaWxlbmFtZSA9IHJlYWRkaXIoJGhhbmRsZSkpKSB7CiAgICAgICAgICAgIGlmICghaW5fYXJyYXkoJGZpbGVuYW1lLCBhcnJheSgnLicsICcuLicpKSkgewogICAgICAgICAgICAgICAgJGZpbGVzW10gPSAkZGlyIC4gRElSRUNUT1JZX1NFUEFSQVRPUiAuICRmaWxlbmFtZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gJGZpbGVzOwogICAgfQoKICAgIC8qKgogICAgICogQGFjY2VzcyBwcml2YXRlCiAgICAgKi8KICAgIGZ1bmN0aW9uIF9pc0ZpbGVuYW1lU2FmZSgkY2hhcikKICAgIHsKICAgICAgICAkX0F1dGhfT3BlbklEX2ZpbGVuYW1lX2FsbG93ZWQgPSBBdXRoX09wZW5JRF9sZXR0ZXJzIC4KICAgICAgICAgICAgQXV0aF9PcGVuSURfZGlnaXRzIC4gIi4iOwogICAgICAgIHJldHVybiAoc3RycG9zKCRfQXV0aF9PcGVuSURfZmlsZW5hbWVfYWxsb3dlZCwgJGNoYXIpICE9PSBmYWxzZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAYWNjZXNzIHByaXZhdGUKICAgICAqLwogICAgZnVuY3Rpb24gX3NhZmU2NCgkc3RyKQogICAgewogICAgICAgICRoNjQgPSBiYXNlNjRfZW5jb2RlKEF1dGhfT3BlbklEX1NIQTEoJHN0cikpOwogICAgICAgICRoNjQgPSBzdHJfcmVwbGFjZSgnKycsICdfJywgJGg2NCk7CiAgICAgICAgJGg2NCA9IHN0cl9yZXBsYWNlKCcvJywgJy4nLCAkaDY0KTsKICAgICAgICAkaDY0ID0gc3RyX3JlcGxhY2UoJz0nLCAnJywgJGg2NCk7CiAgICAgICAgcmV0dXJuICRoNjQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBAYWNjZXNzIHByaXZhdGUKICAgICAqLwogICAgZnVuY3Rpb24gX2ZpbGVuYW1lRXNjYXBlKCRzdHIpCiAgICB7CiAgICAgICAgJGZpbGVuYW1lID0gIiI7CiAgICAgICAgJGIgPSBBdXRoX09wZW5JRDo6dG9CeXRlcygkc3RyKTsKCiAgICAgICAgZm9yICgkaSA9IDA7ICRpIDwgY291bnQoJGIpOyAkaSsrKSB7CiAgICAgICAgICAgICRjID0gJGJbJGldOwogICAgICAgICAgICBpZiAoQXV0aF9PcGVuSURfRmlsZVN0b3JlOjpfaXNGaWxlbmFtZVNhZmUoJGMpKSB7CiAgICAgICAgICAgICAgICAkZmlsZW5hbWUgLj0gJGM7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkZmlsZW5hbWUgLj0gc3ByaW50ZigiXyUwMlgiLCBvcmQoJGMpKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gJGZpbGVuYW1lOwogICAgfQoKICAgIC8qKgogICAgICogQXR0ZW1wdCB0byByZW1vdmUgYSBmaWxlLCByZXR1cm5pbmcgd2hldGhlciB0aGUgZmlsZSBleGlzdGVkIGF0CiAgICAgKiB0aGUgdGltZSBvZiB0aGUgY2FsbC4KICAgICAqCiAgICAgKiBAYWNjZXNzIHByaXZhdGUKICAgICAqIEByZXR1cm4gYm9vbCAkcmVzdWx0IFRydWUgaWYgdGhlIGZpbGUgd2FzIHByZXNlbnQsIGZhbHNlIGlmIG5vdC4KICAgICAqLwogICAgZnVuY3Rpb24gX3JlbW92ZUlmUHJlc2VudCgkZmlsZW5hbWUpCiAgICB7CiAgICAgICAgcmV0dXJuIEB1bmxpbmsoJGZpbGVuYW1lKTsKICAgIH0KCiAgICBmdW5jdGlvbiBjbGVhbnVwQXNzb2NpYXRpb25zKCkKICAgIHsKICAgICAgICAkcmVtb3ZlZCA9IDA7CiAgICAgICAgZm9yZWFjaCAoJHRoaXMtPl9hbGxBc3NvY3MoKSBhcyAkcGFpcikgewogICAgICAgICAgICBsaXN0KCRhc3NvY19maWxlbmFtZSwgJGFzc29jKSA9ICRwYWlyOwogICAgICAgICAgICBpZiAoJGFzc29jLT5nZXRFeHBpcmVzSW4oKSA9PSAwKSB7CiAgICAgICAgICAgICAgICAkdGhpcy0+X3JlbW92ZUlmUHJlc2VudCgkYXNzb2NfZmlsZW5hbWUpOwogICAgICAgICAgICAgICAgJHJlbW92ZWQgKz0gMTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gJHJlbW92ZWQ7CiAgICB9Cn0KCgo=]]></data>
	</file>
	<file>
	  <filename>/openid-php-openid-782224d/Auth/OpenID/HMAC.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBUaGlzIGlzIHRoZSBITUFDU0hBMSBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIE9wZW5JRCBsaWJyYXJ5LgogKgogKiBQSFAgdmVyc2lvbnMgNCBhbmQgNQogKgogKiBMSUNFTlNFOiBTZWUgdGhlIENPUFlJTkcgZmlsZSBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbi4KICoKICogQGFjY2VzcyBwcml2YXRlCiAqIEBwYWNrYWdlIE9wZW5JRAogKiBAYXV0aG9yIEphblJhaW4sIEluYy4gPG9wZW5pZEBqYW5yYWluLmNvbT4KICogQGNvcHlyaWdodCAyMDA1LTIwMDggSmFucmFpbiwgSW5jLgogKiBAbGljZW5zZSBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgQXBhY2hlCiAqLwoKcmVxdWlyZV9vbmNlICdBdXRoL09wZW5JRC5waHAnOwoKLyoqCiAqIFNIQTFfQkxPQ0tTSVpFIGlzIHRoaXMgbW9kdWxlJ3MgU0hBMSBibG9ja3NpemUgdXNlZCBieSB0aGUgZmFsbGJhY2sKICogaW1wbGVtZW50YXRpb24uCiAqLwpkZWZpbmUoJ0F1dGhfT3BlbklEX1NIQTFfQkxPQ0tTSVpFJywgNjQpOwoKZnVuY3Rpb24gQXV0aF9PcGVuSURfU0hBMSgkdGV4dCkKewogICAgaWYgKGZ1bmN0aW9uX2V4aXN0cygnaGFzaCcpICYmCiAgICAgICAgZnVuY3Rpb25fZXhpc3RzKCdoYXNoX2FsZ29zJykgJiYKICAgICAgICAoaW5fYXJyYXkoJ3NoYTEnLCBoYXNoX2FsZ29zKCkpKSkgewogICAgICAgIC8vIFBIUCA1IGNhc2UgKHNvbWV0aW1lcyk6ICdoYXNoJyBhdmFpbGFibGUgYW5kICdzaGExJyBhbGdvCiAgICAgICAgLy8gc3VwcG9ydGVkLgogICAgICAgIHJldHVybiBoYXNoKCdzaGExJywgJHRleHQsIHRydWUpOwogICAgfSBlbHNlIGlmIChmdW5jdGlvbl9leGlzdHMoJ3NoYTEnKSkgewogICAgICAgIC8vIFBIUCA0IGNhc2U6ICdzaGExJyBhdmFpbGFibGUuCiAgICAgICAgJGhleCA9IHNoYTEoJHRleHQpOwogICAgICAgICRyYXcgPSAnJzsKICAgICAgICBmb3IgKCRpID0gMDsgJGkgPCA0MDsgJGkgKz0gMikgewogICAgICAgICAgICAkaGV4Y29kZSA9IHN1YnN0cigkaGV4LCAkaSwgMik7CiAgICAgICAgICAgICRjaGFyY29kZSA9IChpbnQpYmFzZV9jb252ZXJ0KCRoZXhjb2RlLCAxNiwgMTApOwogICAgICAgICAgICAkcmF3IC49IGNocigkY2hhcmNvZGUpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJHJhdzsKICAgIH0gZWxzZSB7CiAgICAgICAgLy8gRXhwbG9kZS4KICAgICAgICB0cmlnZ2VyX2Vycm9yKCdObyBTSEExIGZ1bmN0aW9uIGZvdW5kJywgRV9VU0VSX0VSUk9SKTsKICAgIH0KfQoKLyoqCiAqIENvbXB1dGUgYW4gSE1BQy9TSEExIGhhc2guCiAqCiAqIEBhY2Nlc3MgcHJpdmF0ZQogKiBAcGFyYW0gc3RyaW5nICRrZXkgVGhlIEhNQUMga2V5CiAqIEBwYXJhbSBzdHJpbmcgJHRleHQgVGhlIG1lc3NhZ2UgdGV4dCB0byBoYXNoCiAqIEByZXR1cm4gc3RyaW5nICRtYWMgVGhlIE1BQwogKi8KZnVuY3Rpb24gQXV0aF9PcGVuSURfSE1BQ1NIQTEoJGtleSwgJHRleHQpCnsKICAgIGlmIChBdXRoX09wZW5JRDo6Ynl0ZXMoJGtleSkgPiBBdXRoX09wZW5JRF9TSEExX0JMT0NLU0laRSkgewogICAgICAgICRrZXkgPSBBdXRoX09wZW5JRF9TSEExKCRrZXksIHRydWUpOwogICAgfQoKICAgICRrZXkgPSBzdHJfcGFkKCRrZXksIEF1dGhfT3BlbklEX1NIQTFfQkxPQ0tTSVpFLCBjaHIoMHgwMCkpOwogICAgJGlwYWQgPSBzdHJfcmVwZWF0KGNocigweDM2KSwgQXV0aF9PcGVuSURfU0hBMV9CTE9DS1NJWkUpOwogICAgJG9wYWQgPSBzdHJfcmVwZWF0KGNocigweDVjKSwgQXV0aF9PcGVuSURfU0hBMV9CTE9DS1NJWkUpOwogICAgJGhhc2gxID0gQXV0aF9PcGVuSURfU0hBMSgoJGtleSBeICRpcGFkKSAuICR0ZXh0LCB0cnVlKTsKICAgICRobWFjID0gQXV0aF9PcGVuSURfU0hBMSgoJGtleSBeICRvcGFkKSAuICRoYXNoMSwgdHJ1ZSk7CiAgICByZXR1cm4gJGhtYWM7Cn0KCmlmIChmdW5jdGlvbl9leGlzdHMoJ2hhc2gnKSAmJgogICAgZnVuY3Rpb25fZXhpc3RzKCdoYXNoX2FsZ29zJykgJiYKICAgIChpbl9hcnJheSgnc2hhMjU2JywgaGFzaF9hbGdvcygpKSkpIHsKICAgIGZ1bmN0aW9uIEF1dGhfT3BlbklEX1NIQTI1NigkdGV4dCkKICAgIHsKICAgICAgICAvLyBQSFAgNSBjYXNlOiAnaGFzaCcgYXZhaWxhYmxlIGFuZCAnc2hhMjU2JyBhbGdvIHN1cHBvcnRlZC4KICAgICAgICByZXR1cm4gaGFzaCgnc2hhMjU2JywgJHRleHQsIHRydWUpOwogICAgfQogICAgZGVmaW5lKCdBdXRoX09wZW5JRF9TSEEyNTZfU1VQUE9SVEVEJywgdHJ1ZSk7Cn0gZWxzZSB7CiAgICBkZWZpbmUoJ0F1dGhfT3BlbklEX1NIQTI1Nl9TVVBQT1JURUQnLCBmYWxzZSk7Cn0KCmlmIChmdW5jdGlvbl9leGlzdHMoJ2hhc2hfaG1hYycpICYmCiAgICBmdW5jdGlvbl9leGlzdHMoJ2hhc2hfYWxnb3MnKSAmJgogICAgKGluX2FycmF5KCdzaGEyNTYnLCBoYXNoX2FsZ29zKCkpKSkgewoKICAgIGZ1bmN0aW9uIEF1dGhfT3BlbklEX0hNQUNTSEEyNTYoJGtleSwgJHRleHQpCiAgICB7CiAgICAgICAgLy8gUmV0dXJuIHJhdyBNQUMgKG5vdCBoZXggc3RyaW5nKS4KICAgICAgICByZXR1cm4gaGFzaF9obWFjKCdzaGEyNTYnLCAkdGV4dCwgJGtleSwgdHJ1ZSk7CiAgICB9CgogICAgZGVmaW5lKCdBdXRoX09wZW5JRF9ITUFDU0hBMjU2X1NVUFBPUlRFRCcsIHRydWUpOwp9IGVsc2UgewogICAgZGVmaW5lKCdBdXRoX09wZW5JRF9ITUFDU0hBMjU2X1NVUFBPUlRFRCcsIGZhbHNlKTsKfQoK]]></data>
	</file>
	<file>
	  <filename>/openid-php-openid-782224d/Auth/OpenID/Interface.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBUaGlzIGZpbGUgc3BlY2lmaWVzIHRoZSBpbnRlcmZhY2UgZm9yIFBIUCBPcGVuSUQgc3RvcmUgaW1wbGVtZW50YXRpb25zLgogKgogKiBQSFAgdmVyc2lvbnMgNCBhbmQgNQogKgogKiBMSUNFTlNFOiBTZWUgdGhlIENPUFlJTkcgZmlsZSBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbi4KICoKICogQHBhY2thZ2UgT3BlbklECiAqIEBhdXRob3IgSmFuUmFpbiwgSW5jLiA8b3BlbmlkQGphbnJhaW4uY29tPgogKiBAY29weXJpZ2h0IDIwMDUtMjAwOCBKYW5yYWluLCBJbmMuCiAqIEBsaWNlbnNlIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCBBcGFjaGUKICovCgovKioKICogVGhpcyBpcyB0aGUgaW50ZXJmYWNlIGZvciB0aGUgc3RvcmUgb2JqZWN0cyB0aGUgT3BlbklEIGxpYnJhcnkKICogdXNlcy4gSXQgaXMgYSBzaW5nbGUgY2xhc3MgdGhhdCBwcm92aWRlcyBhbGwgb2YgdGhlIHBlcnNpc3RlbmNlCiAqIG1lY2hhbmlzbXMgdGhhdCB0aGUgT3BlbklEIGxpYnJhcnkgbmVlZHMsIGZvciBib3RoIHNlcnZlcnMgYW5kCiAqIGNvbnN1bWVycy4gIElmIHlvdSB3YW50IHRvIGNyZWF0ZSBhbiBTUUwtZHJpdmVuIHN0b3JlLCBwbGVhc2Ugc2VlCiAqIHRoZW4ge0BsaW5rIEF1dGhfT3BlbklEX1NRTFN0b3JlfSBjbGFzcy4KICoKICogQ2hhbmdlOiBWZXJzaW9uIDIuMCByZW1vdmVkIHRoZSBzdG9yZU5vbmNlLCBnZXRBdXRoS2V5LCBhbmQgaXNEdW1iCiAqIG1ldGhvZHMsIGFuZCBjaGFuZ2VkIHRoZSBiZWhhdmlvciBvZiB0aGUgdXNlTm9uY2UgbWV0aG9kIHRvIHN1cHBvcnQKICogb25lLXdheSBub25jZXMuCiAqCiAqIEBwYWNrYWdlIE9wZW5JRAogKiBAYXV0aG9yIEphblJhaW4sIEluYy4gPG9wZW5pZEBqYW5yYWluLmNvbT4KICovCmNsYXNzIEF1dGhfT3BlbklEX09wZW5JRFN0b3JlIHsKICAgIC8qKgogICAgICogVGhpcyBtZXRob2QgcHV0cyBhbiBBc3NvY2lhdGlvbiBvYmplY3QgaW50byBzdG9yYWdlLAogICAgICogcmV0cmlldmFibGUgYnkgc2VydmVyIFVSTCBhbmQgaGFuZGxlLgogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgJHNlcnZlcl91cmwgVGhlIFVSTCBvZiB0aGUgaWRlbnRpdHkgc2VydmVyIHRoYXQKICAgICAqIHRoaXMgYXNzb2NpYXRpb24gaXMgd2l0aC4gQmVjYXVzZSBvZiB0aGUgd2F5IHRoZSBzZXJ2ZXIgcG9ydGlvbgogICAgICogb2YgdGhlIGxpYnJhcnkgdXNlcyB0aGlzIGludGVyZmFjZSwgZG9uJ3QgYXNzdW1lIHRoZXJlIGFyZSBhbnkKICAgICAqIGxpbWl0YXRpb25zIG9uIHRoZSBjaGFyYWN0ZXIgc2V0IG9mIHRoZSBpbnB1dCBzdHJpbmcuIEluCiAgICAgKiBwYXJ0aWN1bGFyLCBleHBlY3QgdG8gc2VlIHVuZXNjYXBlZCBub24tdXJsLXNhZmUgY2hhcmFjdGVycyBpbgogICAgICogdGhlIHNlcnZlcl91cmwgZmllbGQuCiAgICAgKgogICAgICogQHBhcmFtIEFzc29jaWF0aW9uICRhc3NvY2lhdGlvbiBUaGUgQXNzb2NpYXRpb24gdG8gc3RvcmUuCiAgICAgKi8KICAgIGZ1bmN0aW9uIHN0b3JlQXNzb2NpYXRpb24oJHNlcnZlcl91cmwsICRhc3NvY2lhdGlvbikKICAgIHsKICAgICAgICB0cmlnZ2VyX2Vycm9yKCJBdXRoX09wZW5JRF9PcGVuSURTdG9yZTo6c3RvcmVBc3NvY2lhdGlvbiAiLgogICAgICAgICAgICAgICAgICAgICAgIm5vdCBpbXBsZW1lbnRlZCIsIEVfVVNFUl9FUlJPUik7CiAgICB9CgogICAgLyoKICAgICAqIFJlbW92ZSBleHBpcmVkIG5vbmNlcyBmcm9tIHRoZSBzdG9yZS4KICAgICAqCiAgICAgKiBEaXNjYXJkcyBhbnkgbm9uY2UgZnJvbSBzdG9yYWdlIHRoYXQgaXMgb2xkIGVub3VnaCB0aGF0IGl0cwogICAgICogdGltZXN0YW1wIHdvdWxkIG5vdCBwYXNzIHVzZU5vbmNlKCkuCiAgICAgKgogICAgICogVGhpcyBtZXRob2QgaXMgbm90IGNhbGxlZCBpbiB0aGUgbm9ybWFsIG9wZXJhdGlvbiBvZiB0aGUKICAgICAqIGxpYnJhcnkuICBJdCBwcm92aWRlcyBhIHdheSBmb3Igc3RvcmUgYWRtaW5zIHRvIGtlZXAgdGhlaXIKICAgICAqIHN0b3JhZ2UgZnJvbSBmaWxsaW5nIHVwIHdpdGggZXhwaXJlZCBkYXRhLgogICAgICoKICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBub25jZXMgZXhwaXJlZAogICAgICovCiAgICBmdW5jdGlvbiBjbGVhbnVwTm9uY2VzKCkKICAgIHsKICAgICAgICB0cmlnZ2VyX2Vycm9yKCJBdXRoX09wZW5JRF9PcGVuSURTdG9yZTo6Y2xlYW51cE5vbmNlcyAiLgogICAgICAgICAgICAgICAgICAgICAgIm5vdCBpbXBsZW1lbnRlZCIsIEVfVVNFUl9FUlJPUik7CiAgICB9CgogICAgLyoKICAgICAqIFJlbW92ZSBleHBpcmVkIGFzc29jaWF0aW9ucyBmcm9tIHRoZSBzdG9yZS4KICAgICAqCiAgICAgKiBUaGlzIG1ldGhvZCBpcyBub3QgY2FsbGVkIGluIHRoZSBub3JtYWwgb3BlcmF0aW9uIG9mIHRoZQogICAgICogbGlicmFyeS4gIEl0IHByb3ZpZGVzIGEgd2F5IGZvciBzdG9yZSBhZG1pbnMgdG8ga2VlcCB0aGVpcgogICAgICogc3RvcmFnZSBmcm9tIGZpbGxpbmcgdXAgd2l0aCBleHBpcmVkIGRhdGEuCiAgICAgKgogICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGFzc29jaWF0aW9ucyBleHBpcmVkLgogICAgICovCiAgICBmdW5jdGlvbiBjbGVhbnVwQXNzb2NpYXRpb25zKCkKICAgIHsKICAgICAgICB0cmlnZ2VyX2Vycm9yKCJBdXRoX09wZW5JRF9PcGVuSURTdG9yZTo6Y2xlYW51cEFzc29jaWF0aW9ucyAiLgogICAgICAgICAgICAgICAgICAgICAgIm5vdCBpbXBsZW1lbnRlZCIsIEVfVVNFUl9FUlJPUik7CiAgICB9CgogICAgLyoKICAgICAqIFNob3J0Y3V0IGZvciBjbGVhbnVwTm9uY2VzKCksIGNsZWFudXBBc3NvY2lhdGlvbnMoKS4KICAgICAqCiAgICAgKiBUaGlzIG1ldGhvZCBpcyBub3QgY2FsbGVkIGluIHRoZSBub3JtYWwgb3BlcmF0aW9uIG9mIHRoZQogICAgICogbGlicmFyeS4gIEl0IHByb3ZpZGVzIGEgd2F5IGZvciBzdG9yZSBhZG1pbnMgdG8ga2VlcCB0aGVpcgogICAgICogc3RvcmFnZSBmcm9tIGZpbGxpbmcgdXAgd2l0aCBleHBpcmVkIGRhdGEuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGNsZWFudXAoKQogICAgewogICAgICAgIHJldHVybiBhcnJheSgkdGhpcy0+Y2xlYW51cE5vbmNlcygpLAogICAgICAgICAgICAgICAgICAgICAkdGhpcy0+Y2xlYW51cEFzc29jaWF0aW9ucygpKTsKICAgIH0KCiAgICAvKioKICAgICAqIFJlcG9ydCB3aGV0aGVyIHRoaXMgc3RvcmFnZSBzdXBwb3J0cyBjbGVhbnVwCiAgICAgKi8KICAgIGZ1bmN0aW9uIHN1cHBvcnRzQ2xlYW51cCgpCiAgICB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgLyoqCiAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIGFuIEFzc29jaWF0aW9uIG9iamVjdCBmcm9tIHN0b3JhZ2UgdGhhdAogICAgICogbWF0Y2hlcyB0aGUgc2VydmVyIFVSTCBhbmQsIGlmIHNwZWNpZmllZCwgaGFuZGxlLiBJdCByZXR1cm5zCiAgICAgKiBudWxsIGlmIG5vIHN1Y2ggYXNzb2NpYXRpb24gaXMgZm91bmQgb3IgaWYgdGhlIG1hdGNoaW5nCiAgICAgKiBhc3NvY2lhdGlvbiBpcyBleHBpcmVkLgogICAgICoKICAgICAqIElmIG5vIGhhbmRsZSBpcyBzcGVjaWZpZWQsIHRoZSBzdG9yZSBtYXkgcmV0dXJuIGFueSBhc3NvY2lhdGlvbgogICAgICogd2hpY2ggbWF0Y2hlcyB0aGUgc2VydmVyIFVSTC4gSWYgbXVsdGlwbGUgYXNzb2NpYXRpb25zIGFyZQogICAgICogdmFsaWQsIHRoZSByZWNvbW1lbmRlZCByZXR1cm4gdmFsdWUgZm9yIHRoaXMgbWV0aG9kIGlzIHRoZSBvbmUKICAgICAqIG1vc3QgcmVjZW50bHkgaXNzdWVkLgogICAgICoKICAgICAqIFRoaXMgbWV0aG9kIGlzIGFsbG93ZWQgKGFuZCBlbmNvdXJhZ2VkKSB0byBnYXJiYWdlIGNvbGxlY3QKICAgICAqIGV4cGlyZWQgYXNzb2NpYXRpb25zIHdoZW4gZm91bmQuIFRoaXMgbWV0aG9kIG11c3Qgbm90IHJldHVybgogICAgICogZXhwaXJlZCBhc3NvY2lhdGlvbnMuCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkc2VydmVyX3VybCBUaGUgVVJMIG9mIHRoZSBpZGVudGl0eSBzZXJ2ZXIgdG8gZ2V0CiAgICAgKiB0aGUgYXNzb2NpYXRpb24gZm9yLiBCZWNhdXNlIG9mIHRoZSB3YXkgdGhlIHNlcnZlciBwb3J0aW9uIG9mCiAgICAgKiB0aGUgbGlicmFyeSB1c2VzIHRoaXMgaW50ZXJmYWNlLCBkb24ndCBhc3N1bWUgdGhlcmUgYXJlIGFueQogICAgICogbGltaXRhdGlvbnMgb24gdGhlIGNoYXJhY3RlciBzZXQgb2YgdGhlIGlucHV0IHN0cmluZy4gIEluCiAgICAgKiBwYXJ0aWN1bGFyLCBleHBlY3QgdG8gc2VlIHVuZXNjYXBlZCBub24tdXJsLXNhZmUgY2hhcmFjdGVycyBpbgogICAgICogdGhlIHNlcnZlcl91cmwgZmllbGQuCiAgICAgKgogICAgICogQHBhcmFtIG1peGVkICRoYW5kbGUgVGhpcyBvcHRpb25hbCBwYXJhbWV0ZXIgaXMgdGhlIGhhbmRsZSBvZgogICAgICogdGhlIHNwZWNpZmljIGFzc29jaWF0aW9uIHRvIGdldC4gSWYgbm8gc3BlY2lmaWMgaGFuZGxlIGlzCiAgICAgKiBwcm92aWRlZCwgYW55IHZhbGlkIGFzc29jaWF0aW9uIG1hdGNoaW5nIHRoZSBzZXJ2ZXIgVVJMIGlzCiAgICAgKiByZXR1cm5lZC4KICAgICAqCiAgICAgKiBAcmV0dXJuIEFzc29jaWF0aW9uIFRoZSBBc3NvY2lhdGlvbiBmb3IgdGhlIGdpdmVuIGlkZW50aXR5CiAgICAgKiBzZXJ2ZXIuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldEFzc29jaWF0aW9uKCRzZXJ2ZXJfdXJsLCAkaGFuZGxlID0gbnVsbCkKICAgIHsKICAgICAgICB0cmlnZ2VyX2Vycm9yKCJBdXRoX09wZW5JRF9PcGVuSURTdG9yZTo6Z2V0QXNzb2NpYXRpb24gIi4KICAgICAgICAgICAgICAgICAgICAgICJub3QgaW1wbGVtZW50ZWQiLCBFX1VTRVJfRVJST1IpOwogICAgfQoKICAgIC8qKgogICAgICogVGhpcyBtZXRob2QgcmVtb3ZlcyB0aGUgbWF0Y2hpbmcgYXNzb2NpYXRpb24gaWYgaXQncyBmb3VuZCwgYW5kCiAgICAgKiByZXR1cm5zIHdoZXRoZXIgdGhlIGFzc29jaWF0aW9uIHdhcyByZW1vdmVkIG9yIG5vdC4KICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICRzZXJ2ZXJfdXJsIFRoZSBVUkwgb2YgdGhlIGlkZW50aXR5IHNlcnZlciB0aGUKICAgICAqIGFzc29jaWF0aW9uIHRvIHJlbW92ZSBiZWxvbmdzIHRvLiBCZWNhdXNlIG9mIHRoZSB3YXkgdGhlIHNlcnZlcgogICAgICogcG9ydGlvbiBvZiB0aGUgbGlicmFyeSB1c2VzIHRoaXMgaW50ZXJmYWNlLCBkb24ndCBhc3N1bWUgdGhlcmUKICAgICAqIGFyZSBhbnkgbGltaXRhdGlvbnMgb24gdGhlIGNoYXJhY3RlciBzZXQgb2YgdGhlIGlucHV0CiAgICAgKiBzdHJpbmcuIEluIHBhcnRpY3VsYXIsIGV4cGVjdCB0byBzZWUgdW5lc2NhcGVkIG5vbi11cmwtc2FmZQogICAgICogY2hhcmFjdGVycyBpbiB0aGUgc2VydmVyX3VybCBmaWVsZC4KICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICRoYW5kbGUgVGhpcyBpcyB0aGUgaGFuZGxlIG9mIHRoZSBhc3NvY2lhdGlvbiB0bwogICAgICogcmVtb3ZlLiBJZiB0aGVyZSBpc24ndCBhbiBhc3NvY2lhdGlvbiBmb3VuZCB0aGF0IG1hdGNoZXMgYm90aAogICAgICogdGhlIGdpdmVuIFVSTCBhbmQgaGFuZGxlLCB0aGVuIHRoZXJlIHdhcyBubyBtYXRjaGluZyBoYW5kbGUKICAgICAqIGZvdW5kLgogICAgICoKICAgICAqIEByZXR1cm4gbWl4ZWQgUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgZ2l2ZW4gYXNzb2NpYXRpb24gZXhpc3RlZC4KICAgICAqLwogICAgZnVuY3Rpb24gcmVtb3ZlQXNzb2NpYXRpb24oJHNlcnZlcl91cmwsICRoYW5kbGUpCiAgICB7CiAgICAgICAgdHJpZ2dlcl9lcnJvcigiQXV0aF9PcGVuSURfT3BlbklEU3RvcmU6OnJlbW92ZUFzc29jaWF0aW9uICIuCiAgICAgICAgICAgICAgICAgICAgICAibm90IGltcGxlbWVudGVkIiwgRV9VU0VSX0VSUk9SKTsKICAgIH0KCiAgICAvKioKICAgICAqIENhbGxlZCB3aGVuIHVzaW5nIGEgbm9uY2UuCiAgICAgKgogICAgICogVGhpcyBtZXRob2Qgc2hvdWxkIHJldHVybiBDe1RydWV9IGlmIHRoZSBub25jZSBoYXMgbm90IGJlZW4KICAgICAqIHVzZWQgYmVmb3JlLCBhbmQgc3RvcmUgaXQgZm9yIGEgd2hpbGUgdG8gbWFrZSBzdXJlIG5vYm9keQogICAgICogdHJpZXMgdG8gdXNlIHRoZSBzYW1lIHZhbHVlIGFnYWluLiAgSWYgdGhlIG5vbmNlIGhhcyBhbHJlYWR5CiAgICAgKiBiZWVuIHVzZWQsIHJldHVybiBDe0ZhbHNlfS4KICAgICAqCiAgICAgKiBDaGFuZ2U6IEluIGVhcmxpZXIgdmVyc2lvbnMsIHJvdW5kLXRyaXAgbm9uY2VzIHdlcmUgdXNlZCBhbmQgYQogICAgICogbm9uY2Ugd2FzIG9ubHkgdmFsaWQgaWYgaXQgaGFkIGJlZW4gcHJldmlvdXNseSBzdG9yZWQgd2l0aAogICAgICogc3RvcmVOb25jZS4gIFZlcnNpb24gMi4wIHVzZXMgb25lLXdheSBub25jZXMsIHJlcXVpcmluZyBhCiAgICAgKiBkaWZmZXJlbnQgaW1wbGVtZW50YXRpb24gaGVyZSB0aGF0IGRvZXMgbm90IGRlcGVuZCBvbiBhCiAgICAgKiBzdG9yZU5vbmNlIGNhbGwuICAoc3RvcmVOb25jZSBpcyBubyBsb25nZXIgcGFydCBvZiB0aGUKICAgICAqIGludGVyZmFjZS4KICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICRub25jZSBUaGUgbm9uY2UgdG8gdXNlLgogICAgICoKICAgICAqIEByZXR1cm4gYm9vbCBXaGV0aGVyIG9yIG5vdCB0aGUgbm9uY2Ugd2FzIHZhbGlkLgogICAgICovCiAgICBmdW5jdGlvbiB1c2VOb25jZSgkc2VydmVyX3VybCwgJHRpbWVzdGFtcCwgJHNhbHQpCiAgICB7CiAgICAgICAgdHJpZ2dlcl9lcnJvcigiQXV0aF9PcGVuSURfT3BlbklEU3RvcmU6OnVzZU5vbmNlICIuCiAgICAgICAgICAgICAgICAgICAgICAibm90IGltcGxlbWVudGVkIiwgRV9VU0VSX0VSUk9SKTsKICAgIH0KCiAgICAvKioKICAgICAqIFJlbW92ZXMgYWxsIGVudHJpZXMgZnJvbSB0aGUgc3RvcmU7IGltcGxlbWVudGF0aW9uIGlzIG9wdGlvbmFsLgogICAgICovCiAgICBmdW5jdGlvbiByZXNldCgpCiAgICB7CiAgICB9Cgp9Cg==]]></data>
	</file>
	<file>
	  <filename>/openid-php-openid-782224d/Auth/OpenID/KVForm.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBPcGVuSUQgcHJvdG9jb2wga2V5LXZhbHVlL2NvbW1hLW5ld2xpbmUgZm9ybWF0IHBhcnNpbmcgYW5kCiAqIHNlcmlhbGl6YXRpb24KICoKICogUEhQIHZlcnNpb25zIDQgYW5kIDUKICoKICogTElDRU5TRTogU2VlIHRoZSBDT1BZSU5HIGZpbGUgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24uCiAqCiAqIEBhY2Nlc3MgcHJpdmF0ZQogKiBAcGFja2FnZSBPcGVuSUQKICogQGF1dGhvciBKYW5SYWluLCBJbmMuIDxvcGVuaWRAamFucmFpbi5jb20+CiAqIEBjb3B5cmlnaHQgMjAwNS0yMDA4IEphbnJhaW4sIEluYy4KICogQGxpY2Vuc2UgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIEFwYWNoZQogKi8KCi8qKgogKiBDb250YWluZXIgZm9yIGtleS12YWx1ZS9jb21tYS1uZXdsaW5lIE9wZW5JRCBmb3JtYXQgYW5kIHBhcnNpbmcKICovCmNsYXNzIEF1dGhfT3BlbklEX0tWRm9ybSB7CiAgICAvKioKICAgICAqIENvbnZlcnQgYW4gT3BlbklEIGNvbG9uL25ld2xpbmUgc2VwYXJhdGVkIHN0cmluZyBpbnRvIGFuCiAgICAgKiBhc3NvY2lhdGl2ZSBhcnJheQogICAgICoKICAgICAqIEBzdGF0aWMKICAgICAqIEBhY2Nlc3MgcHJpdmF0ZQogICAgICovCiAgICBzdGF0aWMgZnVuY3Rpb24gdG9BcnJheSgka3ZzLCAkc3RyaWN0PWZhbHNlKQogICAgewogICAgICAgICRsaW5lcyA9IGV4cGxvZGUoIlxuIiwgJGt2cyk7CgogICAgICAgICRsYXN0ID0gYXJyYXlfcG9wKCRsaW5lcyk7CiAgICAgICAgaWYgKCRsYXN0ICE9PSAnJykgewogICAgICAgICAgICBhcnJheV9wdXNoKCRsaW5lcywgJGxhc3QpOwogICAgICAgICAgICBpZiAoJHN0cmljdCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkdmFsdWVzID0gYXJyYXkoKTsKCiAgICAgICAgZm9yICgkbGluZW5vID0gMDsgJGxpbmVubyA8IGNvdW50KCRsaW5lcyk7ICRsaW5lbm8rKykgewogICAgICAgICAgICAkbGluZSA9ICRsaW5lc1skbGluZW5vXTsKICAgICAgICAgICAgJGt2ID0gZXhwbG9kZSgnOicsICRsaW5lLCAyKTsKICAgICAgICAgICAgaWYgKGNvdW50KCRrdikgIT0gMikgewogICAgICAgICAgICAgICAgaWYgKCRzdHJpY3QpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJGtleSA9ICRrdlswXTsKICAgICAgICAgICAgJHRrZXkgPSB0cmltKCRrZXkpOwogICAgICAgICAgICBpZiAoJHRrZXkgIT0gJGtleSkgewogICAgICAgICAgICAgICAgaWYgKCRzdHJpY3QpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICR2YWx1ZSA9ICRrdlsxXTsKICAgICAgICAgICAgJHR2YWwgPSB0cmltKCR2YWx1ZSk7CiAgICAgICAgICAgIGlmICgkdHZhbCAhPSAkdmFsdWUpIHsKICAgICAgICAgICAgICAgIGlmICgkc3RyaWN0KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAkdmFsdWVzWyR0a2V5XSA9ICR0dmFsOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICR2YWx1ZXM7CiAgICB9CgogICAgLyoqCiAgICAgKiBDb252ZXJ0IGFuIGFycmF5IGludG8gYW4gT3BlbklEIGNvbG9uL25ld2xpbmUgc2VwYXJhdGVkIHN0cmluZwogICAgICoKICAgICAqIEBzdGF0aWMKICAgICAqIEBhY2Nlc3MgcHJpdmF0ZQogICAgICovCiAgICBzdGF0aWMgZnVuY3Rpb24gZnJvbUFycmF5KCR2YWx1ZXMpCiAgICB7CiAgICAgICAgaWYgKCR2YWx1ZXMgPT09IG51bGwpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQoKICAgICAgICBrc29ydCgkdmFsdWVzKTsKCiAgICAgICAgJHNlcmlhbGl6ZWQgPSAnJzsKICAgICAgICBmb3JlYWNoICgkdmFsdWVzIGFzICRrZXkgPT4gJHZhbHVlKSB7CiAgICAgICAgICAgIGlmIChpc19hcnJheSgkdmFsdWUpKSB7CiAgICAgICAgICAgICAgICBsaXN0KCRrZXksICR2YWx1ZSkgPSBhcnJheSgkdmFsdWVbMF0sICR2YWx1ZVsxXSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChzdHJwb3MoJGtleSwgJzonKSAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoc3RycG9zKCRrZXksICJcbiIpICE9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChzdHJwb3MoJHZhbHVlLCAiXG4iKSAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRzZXJpYWxpemVkIC49ICIka2V5OiR2YWx1ZVxuIjsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICRzZXJpYWxpemVkOwogICAgfQp9Cgo=]]></data>
	</file>
	<file>
	  <filename>/openid-php-openid-782224d/Auth/OpenID/MDB2Store.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTUUwtYmFja2VkIE9wZW5JRCBzdG9yZXMgZm9yIHVzZSB3aXRoIFBFQVI6Ok1EQjIuCiAqCiAqIFBIUCB2ZXJzaW9ucyA0IGFuZCA1CiAqCiAqIExJQ0VOU0U6IFNlZSB0aGUgQ09QWUlORyBmaWxlIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uLgogKgogKiBAcGFja2FnZSBPcGVuSUQKICogQGF1dGhvciBKYW5SYWluLCBJbmMuIDxvcGVuaWRAamFucmFpbi5jb20+CiAqIEBjb3B5cmlnaHQgMjAwNSBKYW5yYWluLCBJbmMuCiAqIEBsaWNlbnNlIGh0dHA6Ly93d3cuZ251Lm9yZy9jb3B5bGVmdC9sZXNzZXIuaHRtbCBMR1BMCiAqLwoKcmVxdWlyZV9vbmNlICdNREIyLnBocCc7CgovKioKICogQGFjY2VzcyBwcml2YXRlCiAqLwpyZXF1aXJlX29uY2UgJ0F1dGgvT3BlbklEL0ludGVyZmFjZS5waHAnOwoKLyoqCiAqIEBhY2Nlc3MgcHJpdmF0ZQogKi8KcmVxdWlyZV9vbmNlICdBdXRoL09wZW5JRC5waHAnOwoKLyoqCiAqIEBhY2Nlc3MgcHJpdmF0ZQogKi8KcmVxdWlyZV9vbmNlICdBdXRoL09wZW5JRC9Ob25jZS5waHAnOwoKLyoqCiAqIFRoaXMgc3RvcmUgdXNlcyBhIFBFQVI6Ok1EQjIgY29ubmVjdGlvbiB0byBzdG9yZSBwZXJzaXN0ZW5jZQogKiBpbmZvcm1hdGlvbi4KICoKICogVGhlIHRhYmxlIG5hbWVzIHVzZWQgYXJlIGRldGVybWluZWQgYnkgdGhlIGNsYXNzIHZhcmlhYmxlcwogKiBhc3NvY2lhdGlvbnNfdGFibGVfbmFtZSBhbmQgbm9uY2VzX3RhYmxlX25hbWUuICBUbyBjaGFuZ2UgdGhlIG5hbWUKICogb2YgdGhlIHRhYmxlcyB1c2VkLCBwYXNzIG5ldyB0YWJsZSBuYW1lcyBpbnRvIHRoZSBjb25zdHJ1Y3Rvci4KICoKICogVG8gY3JlYXRlIHRoZSB0YWJsZXMgd2l0aCB0aGUgcHJvcGVyIHNjaGVtYSwgc2VlIHRoZSBjcmVhdGVUYWJsZXMKICogbWV0aG9kLgogKgogKiBAcGFja2FnZSBPcGVuSUQKICovCmNsYXNzIEF1dGhfT3BlbklEX01EQjJTdG9yZSBleHRlbmRzIEF1dGhfT3BlbklEX09wZW5JRFN0b3JlIHsKICAgIC8qKgogICAgICogVGhpcyBjcmVhdGVzIGEgbmV3IE1EQjJTdG9yZSBpbnN0YW5jZS4gIEl0IHJlcXVpcmVzIGFuCiAgICAgKiBlc3RhYmxpc2hlZCBkYXRhYmFzZSBjb25uZWN0aW9uIGJlIGdpdmVuIHRvIGl0LCBhbmQgaXQgYWxsb3dzCiAgICAgKiBvdmVycmlkaW5nIHRoZSBkZWZhdWx0IHRhYmxlIG5hbWVzLgogICAgICoKICAgICAqIEBwYXJhbSBjb25uZWN0aW9uICRjb25uZWN0aW9uIFRoaXMgbXVzdCBiZSBhbiBlc3RhYmxpc2hlZAogICAgICogY29ubmVjdGlvbiB0byBhIGRhdGFiYXNlIG9mIHRoZSBjb3JyZWN0IHR5cGUgZm9yIHRoZSBTUUxTdG9yZQogICAgICogc3ViY2xhc3MgeW91J3JlIHVzaW5nLiAgVGhpcyBtdXN0IGJlIGEgUEVBUjo6TURCMiBjb25uZWN0aW9uCiAgICAgKiBoYW5kbGUuCiAgICAgKgogICAgICogQHBhcmFtIGFzc29jaWF0aW9uc190YWJsZTogVGhpcyBpcyBhbiBvcHRpb25hbCBwYXJhbWV0ZXIgdG8KICAgICAqIHNwZWNpZnkgdGhlIG5hbWUgb2YgdGhlIHRhYmxlIHVzZWQgZm9yIHN0b3JpbmcgYXNzb2NpYXRpb25zLgogICAgICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgJ29pZF9hc3NvY2lhdGlvbnMnLgogICAgICoKICAgICAqIEBwYXJhbSBub25jZXNfdGFibGU6IFRoaXMgaXMgYW4gb3B0aW9uYWwgcGFyYW1ldGVyIHRvIHNwZWNpZnkKICAgICAqIHRoZSBuYW1lIG9mIHRoZSB0YWJsZSB1c2VkIGZvciBzdG9yaW5nIG5vbmNlcy4gIFRoZSBkZWZhdWx0CiAgICAgKiB2YWx1ZSBpcyAnb2lkX25vbmNlcycuCiAgICAgKi8KICAgIGZ1bmN0aW9uIEF1dGhfT3BlbklEX01EQjJTdG9yZSgkY29ubmVjdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRhc3NvY2lhdGlvbnNfdGFibGUgPSBudWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJG5vbmNlc190YWJsZSA9IG51bGwpCiAgICB7CiAgICAgICAgJHRoaXMtPmFzc29jaWF0aW9uc190YWJsZV9uYW1lID0gIm9pZF9hc3NvY2lhdGlvbnMiOwogICAgICAgICR0aGlzLT5ub25jZXNfdGFibGVfbmFtZSA9ICJvaWRfbm9uY2VzIjsKCiAgICAgICAgLy8gQ2hlY2sgdGhlIGNvbm5lY3Rpb24gb2JqZWN0IHR5cGUgdG8gYmUgc3VyZSBpdCdzIGEgUEVBUgogICAgICAgIC8vIGRhdGFiYXNlIGNvbm5lY3Rpb24uCiAgICAgICAgaWYgKCFpc19vYmplY3QoJGNvbm5lY3Rpb24pIHx8CiAgICAgICAgICAgICFpc19zdWJjbGFzc19vZigkY29ubmVjdGlvbiwgJ21kYjJfZHJpdmVyX2NvbW1vbicpKSB7CiAgICAgICAgICAgIHRyaWdnZXJfZXJyb3IoIkF1dGhfT3BlbklEX01EQjJTdG9yZSBleHBlY3RlZCBQRUFSIGNvbm5lY3Rpb24gIiAuCiAgICAgICAgICAgICAgICAgICAgICAgICAgIm9iamVjdCAoZ290ICIuZ2V0X2NsYXNzKCRjb25uZWN0aW9uKS4iKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgRV9VU0VSX0VSUk9SKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgJHRoaXMtPmNvbm5lY3Rpb24gPSAkY29ubmVjdGlvbjsKCiAgICAgICAgLy8gQmUgc3VyZSB0byBzZXQgdGhlIGZldGNoIG1vZGUgc28gdGhlIHJlc3VsdHMgYXJlIGtleWVkIG9uCiAgICAgICAgLy8gY29sdW1uIG5hbWUgaW5zdGVhZCBvZiBjb2x1bW4gaW5kZXguCiAgICAgICAgJHRoaXMtPmNvbm5lY3Rpb24tPnNldEZldGNoTW9kZShNREIyX0ZFVENITU9ERV9BU1NPQyk7CiAgICAgICAgCiAgICAgICAgaWYgKFBFQVI6OmlzRXJyb3IoJHRoaXMtPmNvbm5lY3Rpb24tPmxvYWRNb2R1bGUoJ0V4dGVuZGVkJykpKSB7CiAgICAgICAgICAgIHRyaWdnZXJfZXJyb3IoIlVuYWJsZSB0byBsb2FkIE1EQjJfRXh0ZW5kZWQgbW9kdWxlIiwgRV9VU0VSX0VSUk9SKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgaWYgKCRhc3NvY2lhdGlvbnNfdGFibGUpIHsKICAgICAgICAgICAgJHRoaXMtPmFzc29jaWF0aW9uc190YWJsZV9uYW1lID0gJGFzc29jaWF0aW9uc190YWJsZTsKICAgICAgICB9CgogICAgICAgIGlmICgkbm9uY2VzX3RhYmxlKSB7CiAgICAgICAgICAgICR0aGlzLT5ub25jZXNfdGFibGVfbmFtZSA9ICRub25jZXNfdGFibGU7CiAgICAgICAgfQoKICAgICAgICAkdGhpcy0+bWF4X25vbmNlX2FnZSA9IDYgKiA2MCAqIDYwOwogICAgfQoKICAgIGZ1bmN0aW9uIHRhYmxlRXhpc3RzKCR0YWJsZV9uYW1lKQogICAgewogICAgICAgIHJldHVybiAhUEVBUjo6aXNFcnJvcigkdGhpcy0+Y29ubmVjdGlvbi0+cXVlcnkoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKCJTRUxFQ1QgKiBGUk9NICVzIExJTUlUIDAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGFibGVfbmFtZSkpKTsKICAgIH0KCiAgICBmdW5jdGlvbiBjcmVhdGVUYWJsZXMoKQogICAgewogICAgICAgICRuID0gJHRoaXMtPmNyZWF0ZV9ub25jZV90YWJsZSgpOwogICAgICAgICRhID0gJHRoaXMtPmNyZWF0ZV9hc3NvY190YWJsZSgpOwoKICAgICAgICBpZiAoISRuIHx8ICEkYSkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIGZ1bmN0aW9uIGNyZWF0ZV9ub25jZV90YWJsZSgpCiAgICB7CiAgICAgICAgaWYgKCEkdGhpcy0+dGFibGVFeGlzdHMoJHRoaXMtPm5vbmNlc190YWJsZV9uYW1lKSkgewogICAgICAgICAgICBzd2l0Y2ggKCR0aGlzLT5jb25uZWN0aW9uLT5waHB0eXBlKSB7CiAgICAgICAgICAgICAgICBjYXNlICJteXNxbCI6CiAgICAgICAgICAgICAgICBjYXNlICJteXNxbGkiOgogICAgICAgICAgICAgICAgICAgIC8vIEN1c3RvbSBTUUwgZm9yIE15U1FMIHRvIHVzZSBJbm5vREIgYW5kIHZhcmlhYmxlLQogICAgICAgICAgICAgICAgICAgIC8vIGxlbmd0aCBrZXlzCiAgICAgICAgICAgICAgICAgICAgJHIgPSAkdGhpcy0+Y29ubmVjdGlvbi0+ZXhlYygKICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZigiQ1JFQVRFIFRBQkxFICVzIChcbiIuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgc2VydmVyX3VybCBWQVJDSEFSKDIwNDcpIE5PVCBOVUxMIERFRkFVTFQgJycsXG4iLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIHRpbWVzdGFtcCBJTlRFR0VSIE5PVCBOVUxMLFxuIi4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBzYWx0IENIQVIoNDApIE5PVCBOVUxMLFxuIi4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBVTklRVUUgKHNlcnZlcl91cmwoMjU1KSwgdGltZXN0YW1wLCBzYWx0KVxuIi4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKSBUWVBFPUlubm9EQiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPm5vbmNlc190YWJsZV9uYW1lKSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKFBFQVI6OmlzRXJyb3IoJHIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgIGlmIChQRUFSOjppc0Vycm9yKAogICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+Y29ubmVjdGlvbi0+bG9hZE1vZHVsZSgnTWFuYWdlcicpKSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICRmaWVsZHMgPSBhcnJheSgKICAgICAgICAgICAgICAgICAgICAgICAgInNlcnZlcl91cmwiID0+IGFycmF5KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiID0+ICJ0ZXh0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsZW5ndGgiID0+IDIwNDcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAibm90bnVsbCIgPT4gdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICAgICAidGltZXN0YW1wIiA9PiBhcnJheSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIiA9PiAiaW50ZWdlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAibm90bnVsbCIgPT4gdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICAgICAic2FsdCIgPT4gYXJyYXkoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSIgPT4gInRleHQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImxlbmd0aCIgPT4gNDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZml4ZWQiID0+IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAibm90bnVsbCIgPT4gdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAkY29uc3RyYWludCA9IGFycmF5KAogICAgICAgICAgICAgICAgICAgICAgICAidW5pcXVlIiA9PiAxLAogICAgICAgICAgICAgICAgICAgICAgICAiZmllbGRzIiA9PiBhcnJheSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZXJ2ZXJfdXJsIiA9PiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpbWVzdGFtcCIgPT4gdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzYWx0IiA9PiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICRyID0gJHRoaXMtPmNvbm5lY3Rpb24tPmNyZWF0ZVRhYmxlKCR0aGlzLT5ub25jZXNfdGFibGVfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZmllbGRzKTsKICAgICAgICAgICAgICAgICAgICBpZiAoUEVBUjo6aXNFcnJvcigkcikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAkciA9ICR0aGlzLT5jb25uZWN0aW9uLT5jcmVhdGVDb25zdHJhaW50KAogICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+bm9uY2VzX3RhYmxlX25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5ub25jZXNfdGFibGVfbmFtZSAuICJfY29uc3RyYWludCIsCiAgICAgICAgICAgICAgICAgICAgICAgICRjb25zdHJhaW50KTsKICAgICAgICAgICAgICAgICAgICBpZiAoUEVBUjo6aXNFcnJvcigkcikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICBmdW5jdGlvbiBjcmVhdGVfYXNzb2NfdGFibGUoKQogICAgewogICAgICAgIGlmICghJHRoaXMtPnRhYmxlRXhpc3RzKCR0aGlzLT5hc3NvY2lhdGlvbnNfdGFibGVfbmFtZSkpIHsKICAgICAgICAgICAgc3dpdGNoICgkdGhpcy0+Y29ubmVjdGlvbi0+cGhwdHlwZSkgewogICAgICAgICAgICAgICAgY2FzZSAibXlzcWwiOgogICAgICAgICAgICAgICAgY2FzZSAibXlzcWxpIjoKICAgICAgICAgICAgICAgICAgICAvLyBDdXN0b20gU1FMIGZvciBNeVNRTCB0byB1c2UgSW5ub0RCIGFuZCB2YXJpYWJsZS0KICAgICAgICAgICAgICAgICAgICAvLyBsZW5ndGgga2V5cwogICAgICAgICAgICAgICAgICAgICRyID0gJHRoaXMtPmNvbm5lY3Rpb24tPmV4ZWMoCiAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYoIkNSRUFURSBUQUJMRSAlcyhcbiIuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgc2VydmVyX3VybCBWQVJDSEFSKDIwNDcpIE5PVCBOVUxMIERFRkFVTFQgJycsXG4iLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIGhhbmRsZSBWQVJDSEFSKDI1NSkgTk9UIE5VTEwsXG4iLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIHNlY3JldCBCTE9CIE5PVCBOVUxMLFxuIi4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBpc3N1ZWQgSU5URUdFUiBOT1QgTlVMTCxcbiIuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgbGlmZXRpbWUgSU5URUdFUiBOT1QgTlVMTCxcbiIuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgYXNzb2NfdHlwZSBWQVJDSEFSKDY0KSBOT1QgTlVMTCxcbiIuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgUFJJTUFSWSBLRVkgKHNlcnZlcl91cmwoMjU1KSwgaGFuZGxlKVxuIi4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKSBUWVBFPUlubm9EQiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+YXNzb2NpYXRpb25zX3RhYmxlX25hbWUpKTsKICAgICAgICAgICAgICAgICAgICBpZiAoUEVBUjo6aXNFcnJvcigkcikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgaWYgKFBFQVI6OmlzRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5jb25uZWN0aW9uLT5sb2FkTW9kdWxlKCdNYW5hZ2VyJykpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgJGZpZWxkcyA9IGFycmF5KAogICAgICAgICAgICAgICAgICAgICAgICAic2VydmVyX3VybCIgPT4gYXJyYXkoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSIgPT4gInRleHQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImxlbmd0aCIgPT4gMjA0NywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJub3RudWxsIiA9PiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgICAgICJoYW5kbGUiID0+IGFycmF5KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiID0+ICJ0ZXh0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsZW5ndGgiID0+IDI1NSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJub3RudWxsIiA9PiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgICAgICJzZWNyZXQiID0+IGFycmF5KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiID0+ICJibG9iIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsZW5ndGgiID0+ICIyNTUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vdG51bGwiID0+IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICAgICAgImlzc3VlZCIgPT4gYXJyYXkoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSIgPT4gImludGVnZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vdG51bGwiID0+IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICAgICAgImxpZmV0aW1lIiA9PiBhcnJheSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIiA9PiAiaW50ZWdlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAibm90bnVsbCIgPT4gdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICAgICAiYXNzb2NfdHlwZSIgPT4gYXJyYXkoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSIgPT4gInRleHQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImxlbmd0aCIgPT4gNjQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAibm90bnVsbCIgPT4gdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAkb3B0aW9ucyA9IGFycmF5KAogICAgICAgICAgICAgICAgICAgICAgICAicHJpbWFyeSIgPT4gYXJyYXkoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2VydmVyX3VybCIgPT4gdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJoYW5kbGUiID0+IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgJHIgPSAkdGhpcy0+Y29ubmVjdGlvbi0+Y3JlYXRlVGFibGUoCiAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5hc3NvY2lhdGlvbnNfdGFibGVfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgJGZpZWxkcywKICAgICAgICAgICAgICAgICAgICAgICAgJG9wdGlvbnMpOwogICAgICAgICAgICAgICAgICAgIGlmIChQRUFSOjppc0Vycm9yKCRyKSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIGZ1bmN0aW9uIHN0b3JlQXNzb2NpYXRpb24oJHNlcnZlcl91cmwsICRhc3NvY2lhdGlvbikKICAgIHsKICAgICAgICAkZmllbGRzID0gYXJyYXkoCiAgICAgICAgICAgICJzZXJ2ZXJfdXJsIiA9PiBhcnJheSgKICAgICAgICAgICAgICAgICJ2YWx1ZSIgPT4gJHNlcnZlcl91cmwsCiAgICAgICAgICAgICAgICAia2V5IiA9PiB0cnVlCiAgICAgICAgICAgICksCiAgICAgICAgICAgICJoYW5kbGUiID0+IGFycmF5KAogICAgICAgICAgICAgICAgInZhbHVlIiA9PiAkYXNzb2NpYXRpb24tPmhhbmRsZSwKICAgICAgICAgICAgICAgICJrZXkiID0+IHRydWUKICAgICAgICAgICAgKSwKICAgICAgICAgICAgInNlY3JldCIgPT4gYXJyYXkoCiAgICAgICAgICAgICAgICAidmFsdWUiID0+ICRhc3NvY2lhdGlvbi0+c2VjcmV0LAogICAgICAgICAgICAgICAgInR5cGUiID0+ICJibG9iIgogICAgICAgICAgICApLAogICAgICAgICAgICAiaXNzdWVkIiA9PiBhcnJheSgKICAgICAgICAgICAgICAgICJ2YWx1ZSIgPT4gJGFzc29jaWF0aW9uLT5pc3N1ZWQKICAgICAgICAgICAgKSwKICAgICAgICAgICAgImxpZmV0aW1lIiA9PiBhcnJheSgKICAgICAgICAgICAgICAgICJ2YWx1ZSIgPT4gJGFzc29jaWF0aW9uLT5saWZldGltZQogICAgICAgICAgICApLAogICAgICAgICAgICAiYXNzb2NfdHlwZSIgPT4gYXJyYXkoCiAgICAgICAgICAgICAgICAidmFsdWUiID0+ICRhc3NvY2lhdGlvbi0+YXNzb2NfdHlwZQogICAgICAgICAgICApCiAgICAgICAgKTsKICAgICAgICAKICAgICAgICByZXR1cm4gIVBFQVI6OmlzRXJyb3IoJHRoaXMtPmNvbm5lY3Rpb24tPnJlcGxhY2UoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+YXNzb2NpYXRpb25zX3RhYmxlX25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZmllbGRzKSk7CiAgICB9CgogICAgZnVuY3Rpb24gY2xlYW51cE5vbmNlcygpCiAgICB7CiAgICAgICAgZ2xvYmFsICRBdXRoX09wZW5JRF9TS0VXOwogICAgICAgICR2ID0gdGltZSgpIC0gJEF1dGhfT3BlbklEX1NLRVc7CgogICAgICAgIHJldHVybiAkdGhpcy0+Y29ubmVjdGlvbi0+ZXhlYygKICAgICAgICAgICAgc3ByaW50ZigiREVMRVRFIEZST00gJXMgV0hFUkUgdGltZXN0YW1wIDwgJWQiLAogICAgICAgICAgICAgICAgICAgICR0aGlzLT5ub25jZXNfdGFibGVfbmFtZSwgJHYpKTsKICAgIH0KCiAgICBmdW5jdGlvbiBjbGVhbnVwQXNzb2NpYXRpb25zKCkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmNvbm5lY3Rpb24tPmV4ZWMoCiAgICAgICAgICAgIHNwcmludGYoIkRFTEVURSBGUk9NICVzIFdIRVJFIGlzc3VlZCArIGxpZmV0aW1lIDwgJWQiLAogICAgICAgICAgICAgICAgICAgICR0aGlzLT5hc3NvY2lhdGlvbnNfdGFibGVfbmFtZSwgdGltZSgpKSk7CiAgICB9CgogICAgZnVuY3Rpb24gZ2V0QXNzb2NpYXRpb24oJHNlcnZlcl91cmwsICRoYW5kbGUgPSBudWxsKQogICAgewogICAgICAgICRzcWwgPSAiIjsKICAgICAgICAkcGFyYW1zID0gbnVsbDsKICAgICAgICAkdHlwZXMgPSBhcnJheSgKICAgICAgICAgICAgICAgICAgICAgICAidGV4dCIsCiAgICAgICAgICAgICAgICAgICAgICAgImJsb2IiLAogICAgICAgICAgICAgICAgICAgICAgICJpbnRlZ2VyIiwKICAgICAgICAgICAgICAgICAgICAgICAiaW50ZWdlciIsCiAgICAgICAgICAgICAgICAgICAgICAgInRleHQiCiAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICBpZiAoJGhhbmRsZSAhPT0gbnVsbCkgewogICAgICAgICAgICAkc3FsID0gc3ByaW50ZigiU0VMRUNUIGhhbmRsZSwgc2VjcmV0LCBpc3N1ZWQsIGxpZmV0aW1lLCBhc3NvY190eXBlICIgLgogICAgICAgICAgICAgICAgICAgICAgICAgICAiRlJPTSAlcyBXSEVSRSBzZXJ2ZXJfdXJsID0gPyBBTkQgaGFuZGxlID0gPyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5hc3NvY2lhdGlvbnNfdGFibGVfbmFtZSk7CiAgICAgICAgICAgICRwYXJhbXMgPSBhcnJheSgkc2VydmVyX3VybCwgJGhhbmRsZSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJHNxbCA9IHNwcmludGYoIlNFTEVDVCBoYW5kbGUsIHNlY3JldCwgaXNzdWVkLCBsaWZldGltZSwgYXNzb2NfdHlwZSAiIC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZST00gJXMgV0hFUkUgc2VydmVyX3VybCA9ID8gT1JERVIgQlkgaXNzdWVkIERFU0MiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+YXNzb2NpYXRpb25zX3RhYmxlX25hbWUpOwogICAgICAgICAgICAkcGFyYW1zID0gYXJyYXkoJHNlcnZlcl91cmwpOwogICAgICAgIH0KICAgICAgICAKICAgICAgICAkYXNzb2MgPSAkdGhpcy0+Y29ubmVjdGlvbi0+Z2V0Um93KCRzcWwsICR0eXBlcywgJHBhcmFtcyk7CgogICAgICAgIGlmICghJGFzc29jIHx8IFBFQVI6OmlzRXJyb3IoJGFzc29jKSkgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkYXNzb2NpYXRpb24gPSBuZXcgQXV0aF9PcGVuSURfQXNzb2NpYXRpb24oJGFzc29jWydoYW5kbGUnXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbV9nZXRfY29udGVudHMoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGFzc29jWydzZWNyZXQnXSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYXNzb2NbJ2lzc3VlZCddLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGFzc29jWydsaWZldGltZSddLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGFzc29jWydhc3NvY190eXBlJ10pOwogICAgICAgICAgICBmY2xvc2UoJGFzc29jWydzZWNyZXQnXSk7CiAgICAgICAgICAgIHJldHVybiAkYXNzb2NpYXRpb247CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIHJlbW92ZUFzc29jaWF0aW9uKCRzZXJ2ZXJfdXJsLCAkaGFuZGxlKQogICAgewogICAgICAgICRyID0gJHRoaXMtPmNvbm5lY3Rpb24tPmV4ZWNQYXJhbSgKICAgICAgICAgICAgc3ByaW50ZigiREVMRVRFIEZST00gJXMgV0hFUkUgc2VydmVyX3VybCA9ID8gQU5EIGhhbmRsZSA9ID8iLAogICAgICAgICAgICAgICAgICAgICR0aGlzLT5hc3NvY2lhdGlvbnNfdGFibGVfbmFtZSksCiAgICAgICAgICAgIGFycmF5KCRzZXJ2ZXJfdXJsLCAkaGFuZGxlKSk7CiAgICAgICAgCiAgICAgICAgaWYgKFBFQVI6OmlzRXJyb3IoJHIpIHx8ICRyID09IDApIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICBmdW5jdGlvbiB1c2VOb25jZSgkc2VydmVyX3VybCwgJHRpbWVzdGFtcCwgJHNhbHQpCiAgICB7CiAgICAgICAgZ2xvYmFsICRBdXRoX09wZW5JRF9TS0VXOwoKICAgICAgICBpZiAoYWJzKCR0aW1lc3RhbXAgLSB0aW1lKCkpID4gJEF1dGhfT3BlbklEX1NLRVcgKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgJGZpZWxkcyA9IGFycmF5KAogICAgICAgICAgICAgICAgICAgICAgICAidGltZXN0YW1wIiA9PiAkdGltZXN0YW1wLAogICAgICAgICAgICAgICAgICAgICAgICAic2FsdCIgPT4gJHNhbHQKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAKICAgICAgICBpZiAoIWVtcHR5KCRzZXJ2ZXJfdXJsKSkgewogICAgICAgICAgICAkZmllbGRzWyJzZXJ2ZXJfdXJsIl0gPSAkc2VydmVyX3VybDsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgJHIgPSAkdGhpcy0+Y29ubmVjdGlvbi0+YXV0b0V4ZWN1dGUoCiAgICAgICAgICAgICR0aGlzLT5ub25jZXNfdGFibGVfbmFtZSwKICAgICAgICAgICAgJGZpZWxkcywKICAgICAgICAgICAgTURCMl9BVVRPUVVFUllfSU5TRVJUKTsKICAgICAgICAKICAgICAgICBpZiAoUEVBUjo6aXNFcnJvcigkcikpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICAvKioKICAgICAqIFJlc2V0cyB0aGUgc3RvcmUgYnkgcmVtb3ZpbmcgYWxsIHJlY29yZHMgZnJvbSB0aGUgc3RvcmUncwogICAgICogdGFibGVzLgogICAgICovCiAgICBmdW5jdGlvbiByZXNldCgpCiAgICB7CiAgICAgICAgJHRoaXMtPmNvbm5lY3Rpb24tPnF1ZXJ5KHNwcmludGYoIkRFTEVURSBGUk9NICVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+YXNzb2NpYXRpb25zX3RhYmxlX25hbWUpKTsKCiAgICAgICAgJHRoaXMtPmNvbm5lY3Rpb24tPnF1ZXJ5KHNwcmludGYoIkRFTEVURSBGUk9NICVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+bm9uY2VzX3RhYmxlX25hbWUpKTsKICAgIH0KCn0KCj8+Cg==]]></data>
	</file>
	<file>
	  <filename>/openid-php-openid-782224d/Auth/OpenID/MemcachedStore.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBUaGlzIGZpbGUgc3VwcGxpZXMgYSBtZW1jYWNoZWQgc3RvcmUgYmFja2VuZCBmb3IgT3BlbklEIHNlcnZlcnMgYW5kCiAqIGNvbnN1bWVycy4KICoKICogUEhQIHZlcnNpb25zIDQgYW5kIDUKICoKICogTElDRU5TRTogU2VlIHRoZSBDT1BZSU5HIGZpbGUgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24uCiAqCiAqIEBwYWNrYWdlIE9wZW5JRAogKiBAYXV0aG9yIEFydGVteSBUcmVndWJlbmtvIDxtZUBhcnR5Lm5hbWU+CiAqIEBjb3B5cmlnaHQgMjAwOCBKYW5SYWluLCBJbmMuCiAqIEBsaWNlbnNlIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCBBcGFjaGUKICogQ29udHJpYnV0ZWQgYnkgT3BlbiBXZWIgVGVjaG5vbG9naWVzIDxodHRwOi8vb3BlbndlYnRlY2gucnUvPgogKi8KCi8qKgogKiBJbXBvcnQgdGhlIGludGVyZmFjZSBmb3IgY3JlYXRpbmcgYSBuZXcgc3RvcmUgY2xhc3MuCiAqLwpyZXF1aXJlX29uY2UgJ0F1dGgvT3BlbklEL0ludGVyZmFjZS5waHAnOwoKLyoqCiAqIFRoaXMgaXMgYSBtZW1jYWNoZWQtYmFzZWQgc3RvcmUgZm9yIE9wZW5JRCBhc3NvY2lhdGlvbnMgYW5kCiAqIG5vbmNlcy4gCiAqIAogKiBBcyBtZW1jYWNoZSBoYXMgbGltaXQgb2YgMjUwIGNoYXJzIGZvciBrZXkgbGVuZ3RoLCAKICogc2VydmVyX3VybCwgaGFuZGxlIGFuZCBzYWx0IGFyZSBoYXNoZWQgd2l0aCBzaGExKCkuIAogKgogKiBNb3N0IG9mIHRoZSBtZXRob2RzIG9mIHRoaXMgY2xhc3MgYXJlIGltcGxlbWVudGF0aW9uIGRldGFpbHMuCiAqIFBlb3BsZSB3aXNoaW5nIHRvIGp1c3QgdXNlIHRoaXMgc3RvcmUgbmVlZCBvbmx5IHBheSBhdHRlbnRpb24gdG8KICogdGhlIGNvbnN0cnVjdG9yLgogKgogKiBAcGFja2FnZSBPcGVuSUQKICovCmNsYXNzIEF1dGhfT3BlbklEX01lbWNhY2hlZFN0b3JlIGV4dGVuZHMgQXV0aF9PcGVuSURfT3BlbklEU3RvcmUgewoKICAgIC8qKgogICAgICogSW5pdGlhbGl6ZXMgYSBuZXcge0BsaW5rIEF1dGhfT3BlbklEX01lbWNhY2hlZFN0b3JlfSBpbnN0YW5jZS4KICAgICAqIEp1c3Qgc2F2ZXMgbWVtY2FjaGVkIG9iamVjdCBhcyBwcm9wZXJ0eS4KICAgICAqCiAgICAgKiBAcGFyYW0gcmVzb3VyY2UgY29ubmVjdGlvbiBNZW1jYWNoZSBjb25uZWN0aW9uIHJlc291cnNlCiAgICAgKi8KICAgIGZ1bmN0aW9uIEF1dGhfT3BlbklEX01lbWNhY2hlZFN0b3JlKCRjb25uZWN0aW9uLCAkY29tcHJlc3MgPSBmYWxzZSkKICAgIHsKICAgICAgICAkdGhpcy0+Y29ubmVjdGlvbiA9ICRjb25uZWN0aW9uOwogICAgICAgICR0aGlzLT5jb21wcmVzcyA9ICRjb21wcmVzcyA/IE1FTUNBQ0hFX0NPTVBSRVNTRUQgOiAwOwogICAgfQoKICAgIC8qKgogICAgICogU3RvcmUgYXNzb2NpYXRpb24gdW50aWwgaXRzIGV4cGlyYXRpb24gdGltZSBpbiBtZW1jYWNoZWQuIAogICAgICogT3ZlcndyaXRlcyBhbnkgZXhpc3RpbmcgYXNzb2NpYXRpb24gd2l0aCBzYW1lIHNlcnZlcl91cmwgYW5kIAogICAgICogaGFuZGxlLiBIYW5kbGVzIGxpc3Qgb2YgYXNzb2NpYXRpb25zIGZvciBldmVyeSBzZXJ2ZXIuIAogICAgICovCiAgICBmdW5jdGlvbiBzdG9yZUFzc29jaWF0aW9uKCRzZXJ2ZXJfdXJsLCAkYXNzb2NpYXRpb24pCiAgICB7CiAgICAgICAgLy8gY3JlYXRlIG1lbWNhY2hlZCBrZXlzIGZvciBhc3NvY2lhdGlvbiBpdHNlbGYgCiAgICAgICAgLy8gYW5kIGxpc3Qgb2YgYXNzb2NpYXRpb25zIGZvciB0aGlzIHNlcnZlcgogICAgICAgICRhc3NvY2lhdGlvbktleSA9ICR0aGlzLT5hc3NvY2lhdGlvbktleSgkc2VydmVyX3VybCwgCiAgICAgICAgICAgICRhc3NvY2lhdGlvbi0+aGFuZGxlKTsKICAgICAgICAkc2VydmVyS2V5ID0gJHRoaXMtPmFzc29jaWF0aW9uU2VydmVyS2V5KCRzZXJ2ZXJfdXJsKTsKICAgICAgICAKICAgICAgICAvLyBnZXQgbGlzdCBvZiBhc3NvY2lhdGlvbnMgCiAgICAgICAgJHNlcnZlckFzc29jaWF0aW9ucyA9ICR0aGlzLT5jb25uZWN0aW9uLT5nZXQoJHNlcnZlcktleSk7CiAgICAgICAgCiAgICAgICAgLy8gaWYgbm8gc3VjaCBsaXN0LCBpbml0aWFsaXplIGl0IHdpdGggZW1wdHkgYXJyYXkKICAgICAgICBpZiAoISRzZXJ2ZXJBc3NvY2lhdGlvbnMpIHsKICAgICAgICAgICAgJHNlcnZlckFzc29jaWF0aW9ucyA9IGFycmF5KCk7CiAgICAgICAgfQogICAgICAgIC8vIGFuZCBzdG9yZSBnaXZlbiBhc3NvY2lhdGlvbiBrZXkgaW4gaXQKICAgICAgICAkc2VydmVyQXNzb2NpYXRpb25zWyRhc3NvY2lhdGlvbi0+aXNzdWVkXSA9ICRhc3NvY2lhdGlvbktleTsKICAgICAgICAKICAgICAgICAvLyBzYXZlIGFzc29jaWF0aW9ucycga2V5cyBsaXN0IAogICAgICAgICR0aGlzLT5jb25uZWN0aW9uLT5zZXQoCiAgICAgICAgICAgICRzZXJ2ZXJLZXksCiAgICAgICAgICAgICRzZXJ2ZXJBc3NvY2lhdGlvbnMsCiAgICAgICAgICAgICR0aGlzLT5jb21wcmVzcwogICAgICAgICk7CiAgICAgICAgLy8gc2F2ZSBhc3NvY2lhdGlvbiBpdHNlbGYKICAgICAgICAkdGhpcy0+Y29ubmVjdGlvbi0+c2V0KAogICAgICAgICAgICAkYXNzb2NpYXRpb25LZXksCiAgICAgICAgICAgICRhc3NvY2lhdGlvbiwgCiAgICAgICAgICAgICR0aGlzLT5jb21wcmVzcywgCiAgICAgICAgICAgICRhc3NvY2lhdGlvbi0+aXNzdWVkICsgJGFzc29jaWF0aW9uLT5saWZldGltZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZWFkIGFzc29jaWF0aW9uIGZyb20gbWVtY2FjaGVkLiBJZiBubyBoYW5kbGUgZ2l2ZW4gCiAgICAgKiBhbmQgbXVsdGlwbGUgYXNzb2NpYXRpb25zIGZvdW5kLCByZXR1cm5zIGxhdGVzdCBpc3N1ZWQKICAgICAqLwogICAgZnVuY3Rpb24gZ2V0QXNzb2NpYXRpb24oJHNlcnZlcl91cmwsICRoYW5kbGUgPSBudWxsKQogICAgewogICAgICAgIC8vIHNpbXBsZSBjYXNlOiBoYW5kbGUgZ2l2ZW4KICAgICAgICBpZiAoJGhhbmRsZSAhPT0gbnVsbCkgewogICAgICAgICAgICAvLyBnZXQgYXNzb2NpYXRpb24sIHJldHVybiBudWxsIGlmIGZhaWxlZAogICAgICAgICAgICAkYXNzb2NpYXRpb24gPSAkdGhpcy0+Y29ubmVjdGlvbi0+Z2V0KAogICAgICAgICAgICAgICAgJHRoaXMtPmFzc29jaWF0aW9uS2V5KCRzZXJ2ZXJfdXJsLCAkaGFuZGxlKSk7CiAgICAgICAgICAgIHJldHVybiAkYXNzb2NpYXRpb24gPyAkYXNzb2NpYXRpb24gOiBudWxsOwogICAgICAgIH0KICAgICAgICAKICAgICAgICAvLyBubyBoYW5kbGUgZ2l2ZW4sIHdvcmtpbmcgd2l0aCBsaXN0CiAgICAgICAgLy8gY3JlYXRlIGtleSBmb3IgbGlzdCBvZiBhc3NvY2lhdGlvbnMKICAgICAgICAkc2VydmVyS2V5ID0gJHRoaXMtPmFzc29jaWF0aW9uU2VydmVyS2V5KCRzZXJ2ZXJfdXJsKTsKICAgICAgICAKICAgICAgICAvLyBnZXQgbGlzdCBvZiBhc3NvY2lhdGlvbnMKICAgICAgICAkc2VydmVyQXNzb2NpYXRpb25zID0gJHRoaXMtPmNvbm5lY3Rpb24tPmdldCgkc2VydmVyS2V5KTsKICAgICAgICAvLyByZXR1cm4gbnVsbCBpZiBmYWlsZWQgb3IgZ290IGVtcHR5IGxpc3QKICAgICAgICBpZiAoISRzZXJ2ZXJBc3NvY2lhdGlvbnMpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC8vIGdldCBrZXkgb2YgbW9zdCByZWNlbnRseSBpc3N1ZWQgYXNzb2NpYXRpb24KICAgICAgICAka2V5cyA9IGFycmF5X2tleXMoJHNlcnZlckFzc29jaWF0aW9ucyk7CiAgICAgICAgc29ydCgka2V5cyk7CiAgICAgICAgJGxhc3RLZXkgPSAkc2VydmVyQXNzb2NpYXRpb25zW2FycmF5X3BvcCgka2V5cyldOwogICAgICAgIAogICAgICAgIC8vIGdldCBhc3NvY2lhdGlvbiwgcmV0dXJuIG51bGwgaWYgZmFpbGVkCiAgICAgICAgJGFzc29jaWF0aW9uID0gJHRoaXMtPmNvbm5lY3Rpb24tPmdldCgkbGFzdEtleSk7CiAgICAgICAgcmV0dXJuICRhc3NvY2lhdGlvbiA/ICRhc3NvY2lhdGlvbiA6IG51bGw7CiAgICB9CgogICAgLyoqCiAgICAgKiBJbW1lZGlhdGVseSBkZWxldGUgYXNzb2NpYXRpb24gZnJvbSBtZW1jYWNoZS4KICAgICAqLwogICAgZnVuY3Rpb24gcmVtb3ZlQXNzb2NpYXRpb24oJHNlcnZlcl91cmwsICRoYW5kbGUpCiAgICB7CiAgICAgICAgLy8gY3JlYXRlIG1lbWNhY2hlZCBrZXlzIGZvciBhc3NvY2lhdGlvbiBpdHNlbGYgCiAgICAgICAgLy8gYW5kIGxpc3Qgb2YgYXNzb2NpYXRpb25zIGZvciB0aGlzIHNlcnZlcgogICAgICAgICRzZXJ2ZXJLZXkgPSAkdGhpcy0+YXNzb2NpYXRpb25TZXJ2ZXJLZXkoJHNlcnZlcl91cmwpOwogICAgICAgICRhc3NvY2lhdGlvbktleSA9ICR0aGlzLT5hc3NvY2lhdGlvbktleSgkc2VydmVyX3VybCwgCiAgICAgICAgICAgICRoYW5kbGUpOwogICAgICAgIAogICAgICAgIC8vIGdldCBsaXN0IG9mIGFzc29jaWF0aW9ucwogICAgICAgICRzZXJ2ZXJBc3NvY2lhdGlvbnMgPSAkdGhpcy0+Y29ubmVjdGlvbi0+Z2V0KCRzZXJ2ZXJLZXkpOwogICAgICAgIC8vIHJldHVybiBudWxsIGlmIGZhaWxlZCBvciBnb3QgZW1wdHkgbGlzdAogICAgICAgIGlmICghJHNlcnZlckFzc29jaWF0aW9ucykgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC8vIGVuc3VyZSB0aGF0IGdpdmVuIGFzc29jaWF0aW9uIGtleSBleGlzdHMgaW4gbGlzdAogICAgICAgICRzZXJ2ZXJBc3NvY2lhdGlvbnMgPSBhcnJheV9mbGlwKCRzZXJ2ZXJBc3NvY2lhdGlvbnMpOwogICAgICAgIGlmICghYXJyYXlfa2V5X2V4aXN0cygkYXNzb2NpYXRpb25LZXksICRzZXJ2ZXJBc3NvY2lhdGlvbnMpKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLy8gcmVtb3ZlIGdpdmVuIGFzc29jaWF0aW9uIGtleSBmcm9tIGxpc3QKICAgICAgICB1bnNldCgkc2VydmVyQXNzb2NpYXRpb25zWyRhc3NvY2lhdGlvbktleV0pOwogICAgICAgICRzZXJ2ZXJBc3NvY2lhdGlvbnMgPSBhcnJheV9mbGlwKCRzZXJ2ZXJBc3NvY2lhdGlvbnMpOwogICAgICAgIAogICAgICAgIC8vIHNhdmUgdXBkYXRlZCBsaXN0CiAgICAgICAgJHRoaXMtPmNvbm5lY3Rpb24tPnNldCgKICAgICAgICAgICAgJHNlcnZlcktleSwKICAgICAgICAgICAgJHNlcnZlckFzc29jaWF0aW9ucywKICAgICAgICAgICAgJHRoaXMtPmNvbXByZXNzCiAgICAgICAgKTsKCiAgICAgICAgLy8gZGVsZXRlIGFzc29jaWF0aW9uIAogICAgICAgIHJldHVybiAkdGhpcy0+Y29ubmVjdGlvbi0+ZGVsZXRlKCRhc3NvY2lhdGlvbktleSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDcmVhdGUgbm9uY2UgZm9yIHNlcnZlciBhbmQgc2FsdCwgZXhwaXJpbmcgYWZ0ZXIgCiAgICAgKiAkQXV0aF9PcGVuSURfU0tFVyBzZWNvbmRzLgogICAgICovCiAgICBmdW5jdGlvbiB1c2VOb25jZSgkc2VydmVyX3VybCwgJHRpbWVzdGFtcCwgJHNhbHQpCiAgICB7CiAgICAgICAgZ2xvYmFsICRBdXRoX09wZW5JRF9TS0VXOwogICAgICAgIAogICAgICAgIC8vIHNhdmUgb25lIHJlcXVlc3QgdG8gbWVtY2FjaGUgd2hlbiBub25jZSBvYnZpb3VzbHkgZXhwaXJlZCAKICAgICAgICBpZiAoYWJzKCR0aW1lc3RhbXAgLSB0aW1lKCkpID4gJEF1dGhfT3BlbklEX1NLRVcpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICAKICAgICAgICAvLyByZXR1cm5zIGZhbHNlIHdoZW4gbm9uY2UgYWxyZWFkeSBleGlzdHMKICAgICAgICAvLyBvdGhlcndpc2UgYWRkcyBub25jZQogICAgICAgIHJldHVybiAkdGhpcy0+Y29ubmVjdGlvbi0+YWRkKAogICAgICAgICAgICAnb3BlbmlkX25vbmNlXycgLiBzaGExKCRzZXJ2ZXJfdXJsKSAuICdfJyAuIHNoYTEoJHNhbHQpLCAKICAgICAgICAgICAgMSwgLy8gYW55IHZhbHVlIGhlcmUgCiAgICAgICAgICAgICR0aGlzLT5jb21wcmVzcywgCiAgICAgICAgICAgICRBdXRoX09wZW5JRF9TS0VXKTsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBNZW1jYWNoZSBrZXkgaXMgcHJlZml4ZWQgd2l0aCAnb3BlbmlkX2Fzc29jaWF0aW9uXycgc3RyaW5nLiAKICAgICAqLwogICAgZnVuY3Rpb24gYXNzb2NpYXRpb25LZXkoJHNlcnZlcl91cmwsICRoYW5kbGUgPSBudWxsKSAKICAgIHsKICAgICAgICByZXR1cm4gJ29wZW5pZF9hc3NvY2lhdGlvbl8nIC4gc2hhMSgkc2VydmVyX3VybCkgLiAnXycgLiBzaGExKCRoYW5kbGUpOwogICAgfQogICAgCiAgICAvKioKICAgICAqIE1lbWNhY2hlIGtleSBpcyBwcmVmaXhlZCB3aXRoICdvcGVuaWRfYXNzb2NpYXRpb25fJyBzdHJpbmcuIAogICAgICovCiAgICBmdW5jdGlvbiBhc3NvY2lhdGlvblNlcnZlcktleSgkc2VydmVyX3VybCkgCiAgICB7CiAgICAgICAgcmV0dXJuICdvcGVuaWRfYXNzb2NpYXRpb25fc2VydmVyXycgLiBzaGExKCRzZXJ2ZXJfdXJsKTsKICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBSZXBvcnQgdGhhdCB0aGlzIHN0b3JhZ2UgZG9lc24ndCBzdXBwb3J0IGNsZWFudXAKICAgICAqLwogICAgZnVuY3Rpb24gc3VwcG9ydHNDbGVhbnVwKCkKICAgIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9Cn0KCg==]]></data>
	</file>
	<file>
	  <filename>/openid-php-openid-782224d/Auth/OpenID/Message.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBFeHRlbnNpb24gYXJndW1lbnQgcHJvY2Vzc2luZyBjb2RlCiAqCiAqIEBwYWNrYWdlIE9wZW5JRAogKi8KCi8qKgogKiBJbXBvcnQgdG9vbHMgbmVlZGVkIHRvIGRlYWwgd2l0aCBtZXNzYWdlcy4KICovCnJlcXVpcmVfb25jZSAnQXV0aC9PcGVuSUQucGhwJzsKcmVxdWlyZV9vbmNlICdBdXRoL09wZW5JRC9LVkZvcm0ucGhwJzsKcmVxdWlyZV9vbmNlICdBdXRoL1lhZGlzL1hNTC5waHAnOwpyZXF1aXJlX29uY2UgJ0F1dGgvT3BlbklEL0NvbnN1bWVyLnBocCc7IC8vIEZvciBBdXRoX09wZW5JRF9GYWlsdXJlUmVzcG9uc2UKCi8vIFRoaXMgZG9lc24ndCBSRUFMTFkgYmVsb25nIGhlcmUsIGJ1dCB3aGVyZSBpcyBiZXR0ZXI/CmRlZmluZSgnQXV0aF9PcGVuSURfSURFTlRJRklFUl9TRUxFQ1QnLAogICAgICAgImh0dHA6Ly9zcGVjcy5vcGVuaWQubmV0L2F1dGgvMi4wL2lkZW50aWZpZXJfc2VsZWN0Iik7CgovLyBVUkkgZm9yIFNpbXBsZSBSZWdpc3RyYXRpb24gZXh0ZW5zaW9uLCB0aGUgb25seSBjb21tb25seSBkZXBsb3llZAovLyBPcGVuSUQgMS54IGV4dGVuc2lvbiwgYW5kIHNvIGEgc3BlY2lhbCBjYXNlCmRlZmluZSgnQXV0aF9PcGVuSURfU1JFR19VUkknLCAnaHR0cDovL29wZW5pZC5uZXQvc3JlZy8xLjAnKTsKCi8vIFRoZSBPcGVuSUQgMS5YIG5hbWVzcGFjZSBVUkkKZGVmaW5lKCdBdXRoX09wZW5JRF9PUEVOSUQxX05TJywgJ2h0dHA6Ly9vcGVuaWQubmV0L3NpZ25vbi8xLjAnKTsKZGVmaW5lKCdBdXRoX09wZW5JRF9USEVfT1RIRVJfT1BFTklEMV9OUycsICdodHRwOi8vb3BlbmlkLm5ldC9zaWdub24vMS4xJyk7CgpmdW5jdGlvbiBBdXRoX09wZW5JRF9pc09wZW5JRDEoJG5zKQp7CiAgICByZXR1cm4gKCRucyA9PSBBdXRoX09wZW5JRF9USEVfT1RIRVJfT1BFTklEMV9OUykgfHwKICAgICAgICAoJG5zID09IEF1dGhfT3BlbklEX09QRU5JRDFfTlMpOwp9CgovLyBUaGUgT3BlbklEIDIuMCBuYW1lc3BhY2UgVVJJCmRlZmluZSgnQXV0aF9PcGVuSURfT1BFTklEMl9OUycsICdodHRwOi8vc3BlY3Mub3BlbmlkLm5ldC9hdXRoLzIuMCcpOwoKLy8gVGhlIG5hbWVzcGFjZSBjb25zaXN0aW5nIG9mIHBhaXJzIHdpdGgga2V5cyB0aGF0IGFyZSBwcmVmaXhlZCB3aXRoCi8vICJvcGVuaWQuIiAgYnV0IG5vdCBpbiBhbm90aGVyIG5hbWVzcGFjZS4KZGVmaW5lKCdBdXRoX09wZW5JRF9OVUxMX05BTUVTUEFDRScsICdOdWxsIG5hbWVzcGFjZScpOwoKLy8gVGhlIG51bGwgbmFtZXNwYWNlLCB3aGVuIGl0IGlzIGFuIGFsbG93ZWQgT3BlbklEIG5hbWVzcGFjZQpkZWZpbmUoJ0F1dGhfT3BlbklEX09QRU5JRF9OUycsICdPcGVuSUQgbmFtZXNwYWNlJyk7CgovLyBUaGUgdG9wLWxldmVsIG5hbWVzcGFjZSwgZXhjbHVkaW5nIGFsbCBwYWlycyB3aXRoIGtleXMgdGhhdCBzdGFydAovLyB3aXRoICJvcGVuaWQuIgpkZWZpbmUoJ0F1dGhfT3BlbklEX0JBUkVfTlMnLCAnQmFyZSBuYW1lc3BhY2UnKTsKCi8vIFNlbnRpbmVsIGZvciBNZXNzYWdlIGltcGxlbWVudGF0aW9uIHRvIGluZGljYXRlIHRoYXQgZ2V0QXJnIHNob3VsZAovLyByZXR1cm4gbnVsbCBpbnN0ZWFkIG9mIHJldHVybmluZyBhIGRlZmF1bHQuCmRlZmluZSgnQXV0aF9PcGVuSURfTk9fREVGQVVMVCcsICdOTyBERUZBVUxUIEFMTE9XRUQnKTsKCi8vIExpbWl0LCBpbiBieXRlcywgb2YgaWRlbnRpdHkgcHJvdmlkZXIgYW5kIHJldHVybl90byBVUkxzLCBpbmNsdWRpbmcKLy8gcmVzcG9uc2UgcGF5bG9hZC4gIFNlZSBPcGVuSUQgMS4xIHNwZWNpZmljYXRpb24sIEFwcGVuZGl4IEQuCmRlZmluZSgnQXV0aF9PcGVuSURfT1BFTklEMV9VUkxfTElNSVQnLCAyMDQ3KTsKCi8vIEFsbCBPcGVuSUQgcHJvdG9jb2wgZmllbGRzLiAgVXNlZCB0byBjaGVjayBuYW1lc3BhY2UgYWxpYXNlcy4KZ2xvYmFsICRBdXRoX09wZW5JRF9PUEVOSURfUFJPVE9DT0xfRklFTERTOwokQXV0aF9PcGVuSURfT1BFTklEX1BST1RPQ09MX0ZJRUxEUyA9IGFycmF5KAogICAgJ25zJywgJ21vZGUnLCAnZXJyb3InLCAncmV0dXJuX3RvJywgJ2NvbnRhY3QnLCAncmVmZXJlbmNlJywKICAgICdzaWduZWQnLCAnYXNzb2NfdHlwZScsICdzZXNzaW9uX3R5cGUnLCAnZGhfbW9kdWx1cycsICdkaF9nZW4nLAogICAgJ2RoX2NvbnN1bWVyX3B1YmxpYycsICdjbGFpbWVkX2lkJywgJ2lkZW50aXR5JywgJ3JlYWxtJywKICAgICdpbnZhbGlkYXRlX2hhbmRsZScsICdvcF9lbmRwb2ludCcsICdyZXNwb25zZV9ub25jZScsICdzaWcnLAogICAgJ2Fzc29jX2hhbmRsZScsICd0cnVzdF9yb290JywgJ29wZW5pZCcpOwoKLy8gR2xvYmFsIG5hbWVzcGFjZSAvIGFsaWFzIHJlZ2lzdHJhdGlvbiBtYXAuICBTZWUKLy8gQXV0aF9PcGVuSURfcmVnaXN0ZXJOYW1lc3BhY2VBbGlhcy4KZ2xvYmFsICRBdXRoX09wZW5JRF9yZWdpc3RlcmVkX2FsaWFzZXM7CiRBdXRoX09wZW5JRF9yZWdpc3RlcmVkX2FsaWFzZXMgPSBhcnJheSgpOwoKLyoqCiAqIFJlZ2lzdGVycyBhIChuYW1lc3BhY2UgVVJJLCBhbGlhcykgbWFwcGluZyBpbiBhIGdsb2JhbCBuYW1lc3BhY2UKICogYWxpYXMgbWFwLiAgUmFpc2VzIE5hbWVzcGFjZUFsaWFzUmVnaXN0cmF0aW9uRXJyb3IgaWYgZWl0aGVyIHRoZQogKiBuYW1lc3BhY2UgVVJJIG9yIGFsaWFzIGhhcyBhbHJlYWR5IGJlZW4gcmVnaXN0ZXJlZCB3aXRoIGEgZGlmZmVyZW50CiAqIHZhbHVlLiAgVGhpcyBmdW5jdGlvbiBpcyByZXF1aXJlZCBpZiB5b3Ugd2FudCB0byB1c2UgYSBuYW1lc3BhY2UKICogd2l0aCBhbiBPcGVuSUQgMSBtZXNzYWdlLgogKi8KZnVuY3Rpb24gQXV0aF9PcGVuSURfcmVnaXN0ZXJOYW1lc3BhY2VBbGlhcygkbmFtZXNwYWNlX3VyaSwgJGFsaWFzKQp7CiAgICBnbG9iYWwgJEF1dGhfT3BlbklEX3JlZ2lzdGVyZWRfYWxpYXNlczsKCiAgICBpZiAoQXV0aF9PcGVuSUQ6OmFycmF5R2V0KCRBdXRoX09wZW5JRF9yZWdpc3RlcmVkX2FsaWFzZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRhbGlhcykgPT0gJG5hbWVzcGFjZV91cmkpIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICBpZiAoaW5fYXJyYXkoJG5hbWVzcGFjZV91cmksCiAgICAgICAgICAgICAgICAgYXJyYXlfdmFsdWVzKCRBdXRoX09wZW5JRF9yZWdpc3RlcmVkX2FsaWFzZXMpKSkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICBpZiAoaW5fYXJyYXkoJGFsaWFzLCBhcnJheV9rZXlzKCRBdXRoX09wZW5JRF9yZWdpc3RlcmVkX2FsaWFzZXMpKSkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICAkQXV0aF9PcGVuSURfcmVnaXN0ZXJlZF9hbGlhc2VzWyRhbGlhc10gPSAkbmFtZXNwYWNlX3VyaTsKICAgIHJldHVybiB0cnVlOwp9CgovKioKICogUmVtb3ZlcyBhIChuYW1lc3BhY2VfdXJpLCBhbGlhcykgcmVnaXN0cmF0aW9uIGZyb20gdGhlIGdsb2JhbAogKiBuYW1lc3BhY2UgYWxpYXMgbWFwLiAgUmV0dXJucyB0cnVlIGlmIHRoZSByZW1vdmFsIHN1Y2NlZWRlZDsgZmFsc2UKICogaWYgbm90IChpZiB0aGUgbWFwcGluZyBkaWQgbm90IGV4aXN0KS4KICovCmZ1bmN0aW9uIEF1dGhfT3BlbklEX3JlbW92ZU5hbWVzcGFjZUFsaWFzKCRuYW1lc3BhY2VfdXJpLCAkYWxpYXMpCnsKICAgIGdsb2JhbCAkQXV0aF9PcGVuSURfcmVnaXN0ZXJlZF9hbGlhc2VzOwoKICAgIGlmIChBdXRoX09wZW5JRDo6YXJyYXlHZXQoJEF1dGhfT3BlbklEX3JlZ2lzdGVyZWRfYWxpYXNlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGFsaWFzKSA9PT0gJG5hbWVzcGFjZV91cmkpIHsKICAgICAgICB1bnNldCgkQXV0aF9PcGVuSURfcmVnaXN0ZXJlZF9hbGlhc2VzWyRhbGlhc10pOwogICAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIHJldHVybiBmYWxzZTsKfQoKLyoqCiAqIEFuIEF1dGhfT3BlbklEX01hcHBpbmcgbWFpbnRhaW5zIGEgbWFwcGluZyBmcm9tIGFyYml0cmFyeSBrZXlzIHRvCiAqIGFyYml0cmFyeSB2YWx1ZXMuICAoVGhpcyBpcyB1bmxpa2UgYW4gb3JkaW5hcnkgUEhQIGFycmF5LCB3aG9zZQogKiBrZXlzIG1heSBiZSBvbmx5IHNpbXBsZSBzY2FsYXJzLikKICoKICogQHBhY2thZ2UgT3BlbklECiAqLwpjbGFzcyBBdXRoX09wZW5JRF9NYXBwaW5nIHsKICAgIC8qKgogICAgICogSW5pdGlhbGl6ZSBhIG1hcHBpbmcuICBJZiAkY2xhc3NpY19hcnJheSBpcyBzcGVjaWZpZWQsIGl0cyBrZXlzCiAgICAgKiBhbmQgdmFsdWVzIGFyZSB1c2VkIHRvIHBvcHVsYXRlIHRoZSBtYXBwaW5nLgogICAgICovCiAgICBmdW5jdGlvbiBBdXRoX09wZW5JRF9NYXBwaW5nKCRjbGFzc2ljX2FycmF5ID0gbnVsbCkKICAgIHsKICAgICAgICAkdGhpcy0+a2V5cyA9IGFycmF5KCk7CiAgICAgICAgJHRoaXMtPnZhbHVlcyA9IGFycmF5KCk7CgogICAgICAgIGlmIChpc19hcnJheSgkY2xhc3NpY19hcnJheSkpIHsKICAgICAgICAgICAgZm9yZWFjaCAoJGNsYXNzaWNfYXJyYXkgYXMgJGtleSA9PiAkdmFsdWUpIHsKICAgICAgICAgICAgICAgICR0aGlzLT5zZXQoJGtleSwgJHZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgdHJ1ZSBpZiAkdGhpbmcgaXMgYW4gQXV0aF9PcGVuSURfTWFwcGluZyBvYmplY3Q7IGZhbHNlCiAgICAgKiBpZiBub3QuCiAgICAgKi8KICAgIHN0YXRpYyBmdW5jdGlvbiBpc0EoJHRoaW5nKQogICAgewogICAgICAgIHJldHVybiAoaXNfb2JqZWN0KCR0aGluZykgJiYKICAgICAgICAgICAgICAgIHN0cnRvbG93ZXIoZ2V0X2NsYXNzKCR0aGluZykpID09ICdhdXRoX29wZW5pZF9tYXBwaW5nJyk7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIHRoZSBrZXlzIGluIHRoZSBtYXBwaW5nLgogICAgICovCiAgICBmdW5jdGlvbiBrZXlzKCkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmtleXM7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIHZhbHVlcyBpbiB0aGUgbWFwcGluZy4KICAgICAqLwogICAgZnVuY3Rpb24gdmFsdWVzKCkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnZhbHVlczsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2YgKGtleSwgdmFsdWUpIHBhaXJzIGluIHRoZSBtYXBwaW5nLgogICAgICovCiAgICBmdW5jdGlvbiBpdGVtcygpCiAgICB7CiAgICAgICAgJHRlbXAgPSBhcnJheSgpOwoKICAgICAgICBmb3IgKCRpID0gMDsgJGkgPCBjb3VudCgkdGhpcy0+a2V5cyk7ICRpKyspIHsKICAgICAgICAgICAgJHRlbXBbXSA9IGFycmF5KCR0aGlzLT5rZXlzWyRpXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT52YWx1ZXNbJGldKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICR0ZW1wOwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgImxlbmd0aCIgb2YgdGhlIG1hcHBpbmcsIG9yIHRoZSBudW1iZXIgb2Yga2V5cy4KICAgICAqLwogICAgZnVuY3Rpb24gbGVuKCkKICAgIHsKICAgICAgICByZXR1cm4gY291bnQoJHRoaXMtPmtleXMpOwogICAgfQoKICAgIC8qKgogICAgICogU2V0cyBhIGtleS12YWx1ZSBwYWlyIGluIHRoZSBtYXBwaW5nLiAgSWYgdGhlIGtleSBhbHJlYWR5CiAgICAgKiBleGlzdHMsIGl0cyB2YWx1ZSBpcyByZXBsYWNlZCB3aXRoIHRoZSBuZXcgdmFsdWUuCiAgICAgKi8KICAgIGZ1bmN0aW9uIHNldCgka2V5LCAkdmFsdWUpCiAgICB7CiAgICAgICAgJGluZGV4ID0gYXJyYXlfc2VhcmNoKCRrZXksICR0aGlzLT5rZXlzKTsKCiAgICAgICAgaWYgKCRpbmRleCAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgJHRoaXMtPnZhbHVlc1skaW5kZXhdID0gJHZhbHVlOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICR0aGlzLT5rZXlzW10gPSAka2V5OwogICAgICAgICAgICAkdGhpcy0+dmFsdWVzW10gPSAkdmFsdWU7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogR2V0cyBhIHNwZWNpZmllZCB2YWx1ZSBmcm9tIHRoZSBtYXBwaW5nLCBhc3NvY2lhdGVkIHdpdGggdGhlCiAgICAgKiBzcGVjaWZpZWQga2V5LiAgSWYgdGhlIGtleSBkb2VzIG5vdCBleGlzdCBpbiB0aGUgbWFwcGluZywKICAgICAqICRkZWZhdWx0IGlzIHJldHVybmVkIGluc3RlYWQuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldCgka2V5LCAkZGVmYXVsdCA9IG51bGwpCiAgICB7CiAgICAgICAgJGluZGV4ID0gYXJyYXlfc2VhcmNoKCRrZXksICR0aGlzLT5rZXlzKTsKCiAgICAgICAgaWYgKCRpbmRleCAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgcmV0dXJuICR0aGlzLT52YWx1ZXNbJGluZGV4XTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gJGRlZmF1bHQ7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQGFjY2VzcyBwcml2YXRlCiAgICAgKi8KICAgIGZ1bmN0aW9uIF9yZWZsb3coKQogICAgewogICAgICAgIC8vIFBIUCBpcyBicm9rZW4geWV0IGFnYWluLiAgU29ydCB0aGUgYXJyYXlzIHRvIHJlbW92ZSB0aGUKICAgICAgICAvLyBob2xlIGluIHRoZSBudW1lcmljIGluZGV4ZXMgdGhhdCBtYWtlIHVwIHRoZSBhcnJheS4KICAgICAgICAkb2xkX2tleXMgPSAkdGhpcy0+a2V5czsKICAgICAgICAkb2xkX3ZhbHVlcyA9ICR0aGlzLT52YWx1ZXM7CgogICAgICAgICR0aGlzLT5rZXlzID0gYXJyYXkoKTsKICAgICAgICAkdGhpcy0+dmFsdWVzID0gYXJyYXkoKTsKCiAgICAgICAgZm9yZWFjaCAoJG9sZF9rZXlzIGFzICRrKSB7CiAgICAgICAgICAgICR0aGlzLT5rZXlzW10gPSAkazsKICAgICAgICB9CgogICAgICAgIGZvcmVhY2ggKCRvbGRfdmFsdWVzIGFzICR2KSB7CiAgICAgICAgICAgICR0aGlzLT52YWx1ZXNbXSA9ICR2OwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIERlbGV0ZXMgYSBrZXktdmFsdWUgcGFpciBmcm9tIHRoZSBtYXBwaW5nIHdpdGggdGhlIHNwZWNpZmllZAogICAgICoga2V5LgogICAgICovCiAgICBmdW5jdGlvbiBkZWwoJGtleSkKICAgIHsKICAgICAgICAkaW5kZXggPSBhcnJheV9zZWFyY2goJGtleSwgJHRoaXMtPmtleXMpOwoKICAgICAgICBpZiAoJGluZGV4ICE9PSBmYWxzZSkgewogICAgICAgICAgICB1bnNldCgkdGhpcy0+a2V5c1skaW5kZXhdKTsKICAgICAgICAgICAgdW5zZXQoJHRoaXMtPnZhbHVlc1skaW5kZXhdKTsKICAgICAgICAgICAgJHRoaXMtPl9yZWZsb3coKTsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIHZhbHVlIGhhcyBhIGtleSBpbiB0aGUgbWFwcGluZzsKICAgICAqIGZhbHNlIGlmIG5vdC4KICAgICAqLwogICAgZnVuY3Rpb24gY29udGFpbnMoJHZhbHVlKQogICAgewogICAgICAgIHJldHVybiAoYXJyYXlfc2VhcmNoKCR2YWx1ZSwgJHRoaXMtPmtleXMpICE9PSBmYWxzZSk7CiAgICB9Cn0KCi8qKgogKiBNYWludGFpbnMgYSBiaWplY3RpdmUgbWFwIGJldHdlZW4gbmFtZXNwYWNlIHVyaXMgYW5kIGFsaWFzZXMuCiAqCiAqIEBwYWNrYWdlIE9wZW5JRAogKi8KY2xhc3MgQXV0aF9PcGVuSURfTmFtZXNwYWNlTWFwIHsKICAgIGZ1bmN0aW9uIEF1dGhfT3BlbklEX05hbWVzcGFjZU1hcCgpCiAgICB7CiAgICAgICAgJHRoaXMtPmFsaWFzX3RvX25hbWVzcGFjZSA9IG5ldyBBdXRoX09wZW5JRF9NYXBwaW5nKCk7CiAgICAgICAgJHRoaXMtPm5hbWVzcGFjZV90b19hbGlhcyA9IG5ldyBBdXRoX09wZW5JRF9NYXBwaW5nKCk7CiAgICAgICAgJHRoaXMtPmltcGxpY2l0X25hbWVzcGFjZXMgPSBhcnJheSgpOwogICAgfQoKICAgIGZ1bmN0aW9uIGdldEFsaWFzKCRuYW1lc3BhY2VfdXJpKQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+bmFtZXNwYWNlX3RvX2FsaWFzLT5nZXQoJG5hbWVzcGFjZV91cmkpOwogICAgfQoKICAgIGZ1bmN0aW9uIGdldE5hbWVzcGFjZVVSSSgkYWxpYXMpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5hbGlhc190b19uYW1lc3BhY2UtPmdldCgkYWxpYXMpOwogICAgfQoKICAgIGZ1bmN0aW9uIGl0ZXJOYW1lc3BhY2VVUklzKCkKICAgIHsKICAgICAgICAvLyBSZXR1cm4gYW4gaXRlcmF0b3Igb3ZlciB0aGUgbmFtZXNwYWNlIFVSSXMKICAgICAgICByZXR1cm4gJHRoaXMtPm5hbWVzcGFjZV90b19hbGlhcy0+a2V5cygpOwogICAgfQoKICAgIGZ1bmN0aW9uIGl0ZXJBbGlhc2VzKCkKICAgIHsKICAgICAgICAvLyBSZXR1cm4gYW4gaXRlcmF0b3Igb3ZlciB0aGUgYWxpYXNlcyIiIgogICAgICAgIHJldHVybiAkdGhpcy0+YWxpYXNfdG9fbmFtZXNwYWNlLT5rZXlzKCk7CiAgICB9CgogICAgZnVuY3Rpb24gaXRlcml0ZW1zKCkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPm5hbWVzcGFjZV90b19hbGlhcy0+aXRlbXMoKTsKICAgIH0KCiAgICBmdW5jdGlvbiBpc0ltcGxpY2l0KCRuYW1lc3BhY2VfdXJpKQogICAgewogICAgICAgIHJldHVybiBpbl9hcnJheSgkbmFtZXNwYWNlX3VyaSwgJHRoaXMtPmltcGxpY2l0X25hbWVzcGFjZXMpOwogICAgfQoKICAgIGZ1bmN0aW9uIGFkZEFsaWFzKCRuYW1lc3BhY2VfdXJpLCAkZGVzaXJlZF9hbGlhcywgJGltcGxpY2l0PWZhbHNlKQogICAgewogICAgICAgIC8vIEFkZCBhbiBhbGlhcyBmcm9tIHRoaXMgbmFtZXNwYWNlIFVSSSB0byB0aGUgZGVzaXJlZCBhbGlhcwogICAgICAgIGdsb2JhbCAkQXV0aF9PcGVuSURfT1BFTklEX1BST1RPQ09MX0ZJRUxEUzsKCiAgICAgICAgLy8gQ2hlY2sgdGhhdCBkZXNpcmVkX2FsaWFzIGlzIG5vdCBhbiBvcGVuaWQgcHJvdG9jb2wgZmllbGQgYXMKICAgICAgICAvLyBwZXIgdGhlIHNwZWMuCiAgICAgICAgaWYgKGluX2FycmF5KCRkZXNpcmVkX2FsaWFzLCAkQXV0aF9PcGVuSURfT1BFTklEX1BST1RPQ09MX0ZJRUxEUykpIHsKICAgICAgICAgICAgQXV0aF9PcGVuSUQ6OmxvZygiXCIlc1wiIGlzIG5vdCBhbiBhbGxvd2VkIG5hbWVzcGFjZSBhbGlhcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZGVzaXJlZF9hbGlhcyk7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KCiAgICAgICAgLy8gQ2hlY2sgdGhhdCBkZXNpcmVkX2FsaWFzIGRvZXMgbm90IGNvbnRhaW4gYSBwZXJpb2QgYXMgcGVyCiAgICAgICAgLy8gdGhlIHNwZWMuCiAgICAgICAgaWYgKHN0cnBvcygkZGVzaXJlZF9hbGlhcywgJy4nKSAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgQXV0aF9PcGVuSUQ6OmxvZygnIiVzIiBtdXN0IG5vdCBjb250YWluIGEgZG90JywgJGRlc2lyZWRfYWxpYXMpOwogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CgogICAgICAgIC8vIENoZWNrIHRoYXQgdGhlcmUgaXMgbm90IGEgbmFtZXNwYWNlIGFscmVhZHkgZGVmaW5lZCBmb3IgdGhlCiAgICAgICAgLy8gZGVzaXJlZCBhbGlhcwogICAgICAgICRjdXJyZW50X25hbWVzcGFjZV91cmkgPQogICAgICAgICAgICAkdGhpcy0+YWxpYXNfdG9fbmFtZXNwYWNlLT5nZXQoJGRlc2lyZWRfYWxpYXMpOwoKICAgICAgICBpZiAoKCRjdXJyZW50X25hbWVzcGFjZV91cmkgIT09IG51bGwpICYmCiAgICAgICAgICAgICgkY3VycmVudF9uYW1lc3BhY2VfdXJpICE9ICRuYW1lc3BhY2VfdXJpKSkgewogICAgICAgICAgICBBdXRoX09wZW5JRDo6bG9nKCdDYW5ub3QgbWFwICIlcyIgYmVjYXVzZSBwcmV2aW91cyBtYXBwaW5nIGV4aXN0cycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbmFtZXNwYWNlX3VyaSk7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KCiAgICAgICAgLy8gQ2hlY2sgdGhhdCB0aGVyZSBpcyBub3QgYWxyZWFkeSBhIChkaWZmZXJlbnQpIGFsaWFzIGZvcgogICAgICAgIC8vIHRoaXMgbmFtZXNwYWNlIFVSSQogICAgICAgICRhbGlhcyA9ICR0aGlzLT5uYW1lc3BhY2VfdG9fYWxpYXMtPmdldCgkbmFtZXNwYWNlX3VyaSk7CgogICAgICAgIGlmICgoJGFsaWFzICE9PSBudWxsKSAmJiAoJGFsaWFzICE9ICRkZXNpcmVkX2FsaWFzKSkgewogICAgICAgICAgICBBdXRoX09wZW5JRDo6bG9nKCdDYW5ub3QgbWFwICVzIHRvIGFsaWFzICVzLiAnIC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICdJdCBpcyBhbHJlYWR5IG1hcHBlZCB0byBhbGlhcyAlcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbmFtZXNwYWNlX3VyaSwgJGRlc2lyZWRfYWxpYXMsICRhbGlhcyk7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KCiAgICAgICAgYXNzZXJ0KChBdXRoX09wZW5JRF9OVUxMX05BTUVTUEFDRSA9PT0gJGRlc2lyZWRfYWxpYXMpIHx8CiAgICAgICAgICAgICAgIGlzX3N0cmluZygkZGVzaXJlZF9hbGlhcykpOwoKICAgICAgICAkdGhpcy0+YWxpYXNfdG9fbmFtZXNwYWNlLT5zZXQoJGRlc2lyZWRfYWxpYXMsICRuYW1lc3BhY2VfdXJpKTsKICAgICAgICAkdGhpcy0+bmFtZXNwYWNlX3RvX2FsaWFzLT5zZXQoJG5hbWVzcGFjZV91cmksICRkZXNpcmVkX2FsaWFzKTsKICAgICAgICBpZiAoJGltcGxpY2l0KSB7CiAgICAgICAgICAgIGFycmF5X3B1c2goJHRoaXMtPmltcGxpY2l0X25hbWVzcGFjZXMsICRuYW1lc3BhY2VfdXJpKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkZGVzaXJlZF9hbGlhczsKICAgIH0KCiAgICBmdW5jdGlvbiBhZGQoJG5hbWVzcGFjZV91cmkpCiAgICB7CiAgICAgICAgLy8gQWRkIHRoaXMgbmFtZXNwYWNlIFVSSSB0byB0aGUgbWFwcGluZywgd2l0aG91dCBjYXJpbmcgd2hhdAogICAgICAgIC8vIGFsaWFzIGl0IGVuZHMgdXAgd2l0aAoKICAgICAgICAvLyBTZWUgaWYgdGhpcyBuYW1lc3BhY2UgaXMgYWxyZWFkeSBtYXBwZWQgdG8gYW4gYWxpYXMKICAgICAgICAkYWxpYXMgPSAkdGhpcy0+bmFtZXNwYWNlX3RvX2FsaWFzLT5nZXQoJG5hbWVzcGFjZV91cmkpOwoKICAgICAgICBpZiAoJGFsaWFzICE9PSBudWxsKSB7CiAgICAgICAgICAgIHJldHVybiAkYWxpYXM7CiAgICAgICAgfQoKICAgICAgICAvLyBGYWxsIGJhY2sgdG8gZ2VuZXJhdGluZyBhIG51bWVyaWNhbCBhbGlhcwogICAgICAgICRpID0gMDsKICAgICAgICB3aGlsZSAoMSkgewogICAgICAgICAgICAkYWxpYXMgPSAnZXh0JyAuIHN0cnZhbCgkaSk7CiAgICAgICAgICAgIGlmICgkdGhpcy0+YWRkQWxpYXMoJG5hbWVzcGFjZV91cmksICRhbGlhcykgPT09IG51bGwpIHsKICAgICAgICAgICAgICAgICRpICs9IDE7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJGFsaWFzOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBTaG91bGQgTkVWRVIgYmUgcmVhY2hlZCEKICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KCiAgICBmdW5jdGlvbiBjb250YWlucygkbmFtZXNwYWNlX3VyaSkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmlzRGVmaW5lZCgkbmFtZXNwYWNlX3VyaSk7CiAgICB9CgogICAgZnVuY3Rpb24gaXNEZWZpbmVkKCRuYW1lc3BhY2VfdXJpKQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+bmFtZXNwYWNlX3RvX2FsaWFzLT5jb250YWlucygkbmFtZXNwYWNlX3VyaSk7CiAgICB9Cn0KCi8qKgogKiBJbiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBvYmplY3QsIG51bGwgcmVwcmVzZW50cyB0aGUgZ2xvYmFsCiAqIG5hbWVzcGFjZSBhcyB3ZWxsIGFzIGEgbmFtZXNwYWNlIHdpdGggbm8ga2V5LgogKgogKiBAcGFja2FnZSBPcGVuSUQKICovCmNsYXNzIEF1dGhfT3BlbklEX01lc3NhZ2UgewoKICAgIGZ1bmN0aW9uIEF1dGhfT3BlbklEX01lc3NhZ2UoJG9wZW5pZF9uYW1lc3BhY2UgPSBudWxsKQogICAgewogICAgICAgIC8vIENyZWF0ZSBhbiBlbXB0eSBNZXNzYWdlCiAgICAgICAgJHRoaXMtPmFsbG93ZWRfb3BlbmlkX25hbWVzcGFjZXMgPSBhcnJheSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1dGhfT3BlbklEX09QRU5JRDFfTlMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdXRoX09wZW5JRF9USEVfT1RIRVJfT1BFTklEMV9OUywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1dGhfT3BlbklEX09QRU5JRDJfTlMpOwoKICAgICAgICAkdGhpcy0+YXJncyA9IG5ldyBBdXRoX09wZW5JRF9NYXBwaW5nKCk7CiAgICAgICAgJHRoaXMtPm5hbWVzcGFjZXMgPSBuZXcgQXV0aF9PcGVuSURfTmFtZXNwYWNlTWFwKCk7CiAgICAgICAgaWYgKCRvcGVuaWRfbmFtZXNwYWNlID09PSBudWxsKSB7CiAgICAgICAgICAgICR0aGlzLT5fb3BlbmlkX25zX3VyaSA9IG51bGw7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJGltcGxpY2l0ID0gQXV0aF9PcGVuSURfaXNPcGVuSUQxKCRvcGVuaWRfbmFtZXNwYWNlKTsKICAgICAgICAgICAgJHRoaXMtPnNldE9wZW5JRE5hbWVzcGFjZSgkb3BlbmlkX25hbWVzcGFjZSwgJGltcGxpY2l0KTsKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gaXNPcGVuSUQxKCkKICAgIHsKICAgICAgICByZXR1cm4gQXV0aF9PcGVuSURfaXNPcGVuSUQxKCR0aGlzLT5nZXRPcGVuSUROYW1lc3BhY2UoKSk7CiAgICB9CgogICAgZnVuY3Rpb24gaXNPcGVuSUQyKCkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmdldE9wZW5JRE5hbWVzcGFjZSgpID09IEF1dGhfT3BlbklEX09QRU5JRDJfTlM7CiAgICB9CgogICAgc3RhdGljIGZ1bmN0aW9uIGZyb21Qb3N0QXJncygkYXJncykKICAgIHsKICAgICAgICAvLyBDb25zdHJ1Y3QgYSBNZXNzYWdlIGNvbnRhaW5pbmcgYSBzZXQgb2YgUE9TVCBhcmd1bWVudHMKICAgICAgICAkb2JqID0gbmV3IEF1dGhfT3BlbklEX01lc3NhZ2UoKTsKCiAgICAgICAgLy8gUGFydGl0aW9uIGludG8gIm9wZW5pZC4iIGFyZ3MgYW5kIGJhcmUgYXJncwogICAgICAgICRvcGVuaWRfYXJncyA9IGFycmF5KCk7CiAgICAgICAgZm9yZWFjaCAoJGFyZ3MgYXMgJGtleSA9PiAkdmFsdWUpIHsKCiAgICAgICAgICAgIGlmIChpc19hcnJheSgkdmFsdWUpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHBhcnRzID0gZXhwbG9kZSgnLicsICRrZXksIDIpOwoKICAgICAgICAgICAgaWYgKGNvdW50KCRwYXJ0cykgPT0gMikgewogICAgICAgICAgICAgICAgbGlzdCgkcHJlZml4LCAkcmVzdCkgPSAkcGFydHM7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkcHJlZml4ID0gbnVsbDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCRwcmVmaXggIT0gJ29wZW5pZCcpIHsKICAgICAgICAgICAgICAgICRvYmotPmFyZ3MtPnNldChhcnJheShBdXRoX09wZW5JRF9CQVJFX05TLCAka2V5KSwgJHZhbHVlKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICRvcGVuaWRfYXJnc1skcmVzdF0gPSAkdmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICgkb2JqLT5fZnJvbU9wZW5JREFyZ3MoJG9wZW5pZF9hcmdzKSkgewogICAgICAgICAgICByZXR1cm4gJG9iajsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICB9CgogICAgc3RhdGljIGZ1bmN0aW9uIGZyb21PcGVuSURBcmdzKCRvcGVuaWRfYXJncykKICAgIHsKICAgICAgICAvLyBUYWtlcyBhbiBhcnJheS4KCiAgICAgICAgLy8gQ29uc3RydWN0IGEgTWVzc2FnZSBmcm9tIGEgcGFyc2VkIEtWRm9ybSBtZXNzYWdlCiAgICAgICAgJG9iaiA9IG5ldyBBdXRoX09wZW5JRF9NZXNzYWdlKCk7CiAgICAgICAgaWYgKCRvYmotPl9mcm9tT3BlbklEQXJncygkb3BlbmlkX2FyZ3MpKSB7CiAgICAgICAgICAgIHJldHVybiAkb2JqOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEBhY2Nlc3MgcHJpdmF0ZQogICAgICovCiAgICBmdW5jdGlvbiBfZnJvbU9wZW5JREFyZ3MoJG9wZW5pZF9hcmdzKQogICAgewogICAgICAgIGdsb2JhbCAkQXV0aF9PcGVuSURfcmVnaXN0ZXJlZF9hbGlhc2VzOwoKICAgICAgICAvLyBUYWtlcyBhbiBBdXRoX09wZW5JRF9NYXBwaW5nIGluc3RhbmNlIE9SIGFuIGFycmF5LgoKICAgICAgICBpZiAoIUF1dGhfT3BlbklEX01hcHBpbmc6OmlzQSgkb3BlbmlkX2FyZ3MpKSB7CiAgICAgICAgICAgICRvcGVuaWRfYXJncyA9IG5ldyBBdXRoX09wZW5JRF9NYXBwaW5nKCRvcGVuaWRfYXJncyk7CiAgICAgICAgfQoKICAgICAgICAkbnNfYXJncyA9IGFycmF5KCk7CgogICAgICAgIC8vIFJlc29sdmUgbmFtZXNwYWNlcwogICAgICAgIGZvcmVhY2ggKCRvcGVuaWRfYXJncy0+aXRlbXMoKSBhcyAkcGFpcikgewogICAgICAgICAgICBsaXN0KCRyZXN0LCAkdmFsdWUpID0gJHBhaXI7CgogICAgICAgICAgICAkcGFydHMgPSBleHBsb2RlKCcuJywgJHJlc3QsIDIpOwoKICAgICAgICAgICAgaWYgKGNvdW50KCRwYXJ0cykgPT0gMikgewogICAgICAgICAgICAgICAgbGlzdCgkbnNfYWxpYXMsICRuc19rZXkpID0gJHBhcnRzOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJG5zX2FsaWFzID0gQXV0aF9PcGVuSURfTlVMTF9OQU1FU1BBQ0U7CiAgICAgICAgICAgICAgICAkbnNfa2V5ID0gJHJlc3Q7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICgkbnNfYWxpYXMgPT0gJ25zJykgewogICAgICAgICAgICAgICAgaWYgKCR0aGlzLT5uYW1lc3BhY2VzLT5hZGRBbGlhcygkdmFsdWUsICRuc19rZXkpID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgaWYgKCgkbnNfYWxpYXMgPT0gQXV0aF9PcGVuSURfTlVMTF9OQU1FU1BBQ0UpICYmCiAgICAgICAgICAgICAgICAgICAgICAgKCRuc19rZXkgPT0gJ25zJykpIHsKICAgICAgICAgICAgICAgIC8vIG51bGwgbmFtZXNwYWNlCiAgICAgICAgICAgICAgICBpZiAoJHRoaXMtPnNldE9wZW5JRE5hbWVzcGFjZSgkdmFsdWUsIGZhbHNlKSA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkbnNfYXJnc1tdID0gYXJyYXkoJG5zX2FsaWFzLCAkbnNfa2V5LCAkdmFsdWUpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoISR0aGlzLT5nZXRPcGVuSUROYW1lc3BhY2UoKSkgewogICAgICAgICAgICBpZiAoJHRoaXMtPnNldE9wZW5JRE5hbWVzcGFjZShBdXRoX09wZW5JRF9PUEVOSUQxX05TLCB0cnVlKSA9PT0KICAgICAgICAgICAgICAgIGZhbHNlKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIEFjdHVhbGx5IHB1dCB0aGUgcGFpcnMgaW50byB0aGUgYXBwcm9wcmlhdGUgbmFtZXNwYWNlcwogICAgICAgIGZvcmVhY2ggKCRuc19hcmdzIGFzICR0cmlwbGUpIHsKICAgICAgICAgICAgbGlzdCgkbnNfYWxpYXMsICRuc19rZXksICR2YWx1ZSkgPSAkdHJpcGxlOwogICAgICAgICAgICAkbnNfdXJpID0gJHRoaXMtPm5hbWVzcGFjZXMtPmdldE5hbWVzcGFjZVVSSSgkbnNfYWxpYXMpOwogICAgICAgICAgICBpZiAoJG5zX3VyaSA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgJG5zX3VyaSA9ICR0aGlzLT5fZ2V0RGVmYXVsdE5hbWVzcGFjZSgkbnNfYWxpYXMpOwogICAgICAgICAgICAgICAgaWYgKCRuc191cmkgPT09IG51bGwpIHsKCiAgICAgICAgICAgICAgICAgICAgJG5zX3VyaSA9IEF1dGhfT3BlbklEX09QRU5JRF9OUzsKICAgICAgICAgICAgICAgICAgICAkbnNfa2V5ID0gc3ByaW50ZignJXMuJXMnLCAkbnNfYWxpYXMsICRuc19rZXkpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+bmFtZXNwYWNlcy0+YWRkQWxpYXMoJG5zX3VyaSwgJG5zX2FsaWFzLCB0cnVlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHRoaXMtPnNldEFyZygkbnNfdXJpLCAkbnNfa2V5LCAkdmFsdWUpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgZnVuY3Rpb24gX2dldERlZmF1bHROYW1lc3BhY2UoJG15c3RlcnlfYWxpYXMpCiAgICB7CiAgICAgICAgZ2xvYmFsICRBdXRoX09wZW5JRF9yZWdpc3RlcmVkX2FsaWFzZXM7CiAgICAgICAgaWYgKCR0aGlzLT5pc09wZW5JRDEoKSkgewogICAgICAgICAgICByZXR1cm4gQCRBdXRoX09wZW5JRF9yZWdpc3RlcmVkX2FsaWFzZXNbJG15c3RlcnlfYWxpYXNdOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KCiAgICBmdW5jdGlvbiBzZXRPcGVuSUROYW1lc3BhY2UoJG9wZW5pZF9uc191cmksICRpbXBsaWNpdCkKICAgIHsKICAgICAgICBpZiAoIWluX2FycmF5KCRvcGVuaWRfbnNfdXJpLCAkdGhpcy0+YWxsb3dlZF9vcGVuaWRfbmFtZXNwYWNlcykpIHsKICAgICAgICAgICAgQXV0aF9PcGVuSUQ6OmxvZygnSW52YWxpZCBudWxsIG5hbWVzcGFjZTogIiVzIicsICRvcGVuaWRfbnNfdXJpKTsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgJHN1Y2NlZWRlZCA9ICR0aGlzLT5uYW1lc3BhY2VzLT5hZGRBbGlhcygkb3BlbmlkX25zX3VyaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1dGhfT3BlbklEX05VTExfTkFNRVNQQUNFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGltcGxpY2l0KTsKICAgICAgICBpZiAoJHN1Y2NlZWRlZCA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgJHRoaXMtPl9vcGVuaWRfbnNfdXJpID0gJG9wZW5pZF9uc191cmk7CgogICAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIGZ1bmN0aW9uIGdldE9wZW5JRE5hbWVzcGFjZSgpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5fb3BlbmlkX25zX3VyaTsKICAgIH0KCiAgICBzdGF0aWMgZnVuY3Rpb24gZnJvbUtWRm9ybSgka3Zmb3JtX3N0cmluZykKICAgIHsKICAgICAgICAvLyBDcmVhdGUgYSBNZXNzYWdlIGZyb20gYSBLVkZvcm0gc3RyaW5nCiAgICAgICAgcmV0dXJuIEF1dGhfT3BlbklEX01lc3NhZ2U6OmZyb21PcGVuSURBcmdzKAogICAgICAgICAgICAgICAgICAgICBBdXRoX09wZW5JRF9LVkZvcm06OnRvQXJyYXkoJGt2Zm9ybV9zdHJpbmcpKTsKICAgIH0KCiAgICBmdW5jdGlvbiBjb3B5KCkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXM7CiAgICB9CgogICAgZnVuY3Rpb24gdG9Qb3N0QXJncygpCiAgICB7CiAgICAgICAgLy8gUmV0dXJuIGFsbCBhcmd1bWVudHMgd2l0aCBvcGVuaWQuIGluIGZyb250IG9mIG5hbWVzcGFjZWQKICAgICAgICAvLyBhcmd1bWVudHMuCgogICAgICAgICRhcmdzID0gYXJyYXkoKTsKCiAgICAgICAgLy8gQWRkIG5hbWVzcGFjZSBkZWZpbml0aW9ucyB0byB0aGUgb3V0cHV0CiAgICAgICAgZm9yZWFjaCAoJHRoaXMtPm5hbWVzcGFjZXMtPml0ZXJpdGVtcygpIGFzICRwYWlyKSB7CiAgICAgICAgICAgIGxpc3QoJG5zX3VyaSwgJGFsaWFzKSA9ICRwYWlyOwogICAgICAgICAgICBpZiAoJHRoaXMtPm5hbWVzcGFjZXMtPmlzSW1wbGljaXQoJG5zX3VyaSkpIHsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkYWxpYXMgPT0gQXV0aF9PcGVuSURfTlVMTF9OQU1FU1BBQ0UpIHsKICAgICAgICAgICAgICAgICRuc19rZXkgPSAnb3BlbmlkLm5zJzsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICRuc19rZXkgPSAnb3BlbmlkLm5zLicgLiAkYWxpYXM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJGFyZ3NbJG5zX2tleV0gPSAkbnNfdXJpOwogICAgICAgIH0KCiAgICAgICAgZm9yZWFjaCAoJHRoaXMtPmFyZ3MtPml0ZW1zKCkgYXMgJHBhaXIpIHsKICAgICAgICAgICAgbGlzdCgkbnNfcGFydHMsICR2YWx1ZSkgPSAkcGFpcjsKICAgICAgICAgICAgbGlzdCgkbnNfdXJpLCAkbnNfa2V5KSA9ICRuc19wYXJ0czsKICAgICAgICAgICAgJGtleSA9ICR0aGlzLT5nZXRLZXkoJG5zX3VyaSwgJG5zX2tleSk7CiAgICAgICAgICAgICRhcmdzWyRrZXldID0gJHZhbHVlOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRhcmdzOwogICAgfQoKICAgIGZ1bmN0aW9uIHRvQXJncygpCiAgICB7CiAgICAgICAgLy8gUmV0dXJuIGFsbCBuYW1lc3BhY2VkIGFyZ3VtZW50cywgZmFpbGluZyBpZiBhbnkKICAgICAgICAvLyBub24tbmFtZXNwYWNlZCBhcmd1bWVudHMgZXhpc3QuCiAgICAgICAgJHBvc3RfYXJncyA9ICR0aGlzLT50b1Bvc3RBcmdzKCk7CiAgICAgICAgJGt2YXJncyA9IGFycmF5KCk7CiAgICAgICAgZm9yZWFjaCAoJHBvc3RfYXJncyBhcyAkayA9PiAkdikgewogICAgICAgICAgICBpZiAoc3RycG9zKCRrLCAnb3BlbmlkLicpICE9PSAwKSB7CiAgICAgICAgICAgICAgICAvLyByYWlzZSBWYWx1ZUVycm9yKAogICAgICAgICAgICAgICAgLy8gICAnVGhpcyBtZXNzYWdlIGNhbiBvbmx5IGJlIGVuY29kZWQgYXMgYSBQT1NULCBiZWNhdXNlIGl0ICcKICAgICAgICAgICAgICAgIC8vICAgJ2NvbnRhaW5zIGFyZ3VtZW50cyB0aGF0IGFyZSBub3QgcHJlZml4ZWQgd2l0aCAib3BlbmlkLiInKQogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAka3ZhcmdzW3N1YnN0cigkaywgNyldID0gJHY7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiAka3ZhcmdzOwogICAgfQoKICAgIGZ1bmN0aW9uIHRvRm9ybU1hcmt1cCgkYWN0aW9uX3VybCwgJGZvcm1fdGFnX2F0dHJzID0gbnVsbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAkc3VibWl0X3RleHQgPSAiQ29udGludWUiKQogICAgewogICAgICAgICRmb3JtID0gIjxmb3JtIGFjY2VwdC1jaGFyc2V0PVwiVVRGLThcIiAiLgogICAgICAgICAgICAiZW5jdHlwZT1cImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZFwiIjsKCiAgICAgICAgaWYgKCEkZm9ybV90YWdfYXR0cnMpIHsKICAgICAgICAgICAgJGZvcm1fdGFnX2F0dHJzID0gYXJyYXkoKTsKICAgICAgICB9CgogICAgICAgICRmb3JtX3RhZ19hdHRyc1snYWN0aW9uJ10gPSAkYWN0aW9uX3VybDsKICAgICAgICAkZm9ybV90YWdfYXR0cnNbJ21ldGhvZCddID0gJ3Bvc3QnOwoKICAgICAgICB1bnNldCgkZm9ybV90YWdfYXR0cnNbJ2VuY3R5cGUnXSk7CiAgICAgICAgdW5zZXQoJGZvcm1fdGFnX2F0dHJzWydhY2NlcHQtY2hhcnNldCddKTsKCiAgICAgICAgaWYgKCRmb3JtX3RhZ19hdHRycykgewogICAgICAgICAgICBmb3JlYWNoICgkZm9ybV90YWdfYXR0cnMgYXMgJG5hbWUgPT4gJGF0dHIpIHsKICAgICAgICAgICAgICAgICRmb3JtIC49IHNwcmludGYoIiAlcz1cIiVzXCIiLCAkbmFtZSwgJGF0dHIpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkZm9ybSAuPSAiPlxuIjsKCiAgICAgICAgZm9yZWFjaCAoJHRoaXMtPnRvUG9zdEFyZ3MoKSBhcyAkbmFtZSA9PiAkdmFsdWUpIHsKICAgICAgICAgICAgJGZvcm0gLj0gc3ByaW50ZigKICAgICAgICAgICAgICAgICAgICAgICAgIjxpbnB1dCB0eXBlPVwiaGlkZGVuXCIgbmFtZT1cIiVzXCIgdmFsdWU9XCIlc1wiIC8+XG4iLAogICAgICAgICAgICAgICAgICAgICAgICAkbmFtZSwgJHZhbHVlKTsKICAgICAgICB9CgogICAgICAgICRmb3JtIC49IHNwcmludGYoIjxpbnB1dCB0eXBlPVwic3VibWl0XCIgdmFsdWU9XCIlc1wiIC8+XG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgJHN1Ym1pdF90ZXh0KTsKCiAgICAgICAgJGZvcm0gLj0gIjwvZm9ybT5cbiI7CgogICAgICAgIHJldHVybiAkZm9ybTsKICAgIH0KCiAgICBmdW5jdGlvbiB0b1VSTCgkYmFzZV91cmwpCiAgICB7CiAgICAgICAgLy8gR2VuZXJhdGUgYSBHRVQgVVJMIHdpdGggdGhlIHBhcmFtZXRlcnMgaW4gdGhpcyBtZXNzYWdlCiAgICAgICAgLy8gYXR0YWNoZWQgYXMgcXVlcnkgcGFyYW1ldGVycy4KICAgICAgICByZXR1cm4gQXV0aF9PcGVuSUQ6OmFwcGVuZEFyZ3MoJGJhc2VfdXJsLCAkdGhpcy0+dG9Qb3N0QXJncygpKTsKICAgIH0KCiAgICBmdW5jdGlvbiB0b0tWRm9ybSgpCiAgICB7CiAgICAgICAgLy8gR2VuZXJhdGUgYSBLVkZvcm0gc3RyaW5nIHRoYXQgY29udGFpbnMgdGhlIHBhcmFtZXRlcnMgaW4KICAgICAgICAvLyB0aGlzIG1lc3NhZ2UuIFRoaXMgd2lsbCBmYWlsIGlmIHRoZSBtZXNzYWdlIGNvbnRhaW5zCiAgICAgICAgLy8gYXJndW1lbnRzIG91dHNpZGUgb2YgdGhlICdvcGVuaWQuJyBwcmVmaXguCiAgICAgICAgcmV0dXJuIEF1dGhfT3BlbklEX0tWRm9ybTo6ZnJvbUFycmF5KCR0aGlzLT50b0FyZ3MoKSk7CiAgICB9CgogICAgZnVuY3Rpb24gdG9VUkxFbmNvZGVkKCkKICAgIHsKICAgICAgICAvLyBHZW5lcmF0ZSBhbiB4LXd3dy11cmxlbmNvZGVkIHN0cmluZwogICAgICAgICRhcmdzID0gYXJyYXkoKTsKCiAgICAgICAgZm9yZWFjaCAoJHRoaXMtPnRvUG9zdEFyZ3MoKSBhcyAkayA9PiAkdikgewogICAgICAgICAgICAkYXJnc1tdID0gYXJyYXkoJGssICR2KTsKICAgICAgICB9CgogICAgICAgIHNvcnQoJGFyZ3MpOwogICAgICAgIHJldHVybiBBdXRoX09wZW5JRDo6aHR0cEJ1aWxkUXVlcnkoJGFyZ3MpOwogICAgfQoKICAgIC8qKgogICAgICogQGFjY2VzcyBwcml2YXRlCiAgICAgKi8KICAgIGZ1bmN0aW9uIF9maXhOUygkbmFtZXNwYWNlKQogICAgewogICAgICAgIC8vIENvbnZlcnQgYW4gaW5wdXQgdmFsdWUgaW50byB0aGUgaW50ZXJuYWxseSB1c2VkIHZhbHVlcyBvZgogICAgICAgIC8vIHRoaXMgb2JqZWN0CgogICAgICAgIGlmICgkbmFtZXNwYWNlID09IEF1dGhfT3BlbklEX09QRU5JRF9OUykgewogICAgICAgICAgICBpZiAoJHRoaXMtPl9vcGVuaWRfbnNfdXJpID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEF1dGhfT3BlbklEX0ZhaWx1cmVSZXNwb25zZShudWxsLAogICAgICAgICAgICAgICAgICAgICdPcGVuSUQgbmFtZXNwYWNlIG5vdCBzZXQnKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICRuYW1lc3BhY2UgPSAkdGhpcy0+X29wZW5pZF9uc191cmk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICgoJG5hbWVzcGFjZSAhPSBBdXRoX09wZW5JRF9CQVJFX05TKSAmJgogICAgICAgICAgICAgICghaXNfc3RyaW5nKCRuYW1lc3BhY2UpKSkgewogICAgICAgICAgICAvL1R5cGVFcnJvcgogICAgICAgICAgICAkZXJyX21zZyA9IHNwcmludGYoIk5hbWVzcGFjZSBtdXN0IGJlIEF1dGhfT3BlbklEX0JBUkVfTlMsICIuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBdXRoX09wZW5JRF9PUEVOSURfTlMgb3IgYSBzdHJpbmcuIGdvdCAlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50X3IoJG5hbWVzcGFjZSwgdHJ1ZSkpOwogICAgICAgICAgICByZXR1cm4gbmV3IEF1dGhfT3BlbklEX0ZhaWx1cmVSZXNwb25zZShudWxsLCAkZXJyX21zZyk7CiAgICAgICAgfQoKICAgICAgICBpZiAoKCRuYW1lc3BhY2UgIT0gQXV0aF9PcGVuSURfQkFSRV9OUykgJiYKICAgICAgICAgICAgKHN0cnBvcygkbmFtZXNwYWNlLCAnOicpID09PSBmYWxzZSkpIHsKICAgICAgICAgICAgLy8gZm10ID0gJ09wZW5JRCAyLjAgbmFtZXNwYWNlIGlkZW50aWZpZXJzIFNIT1VMRCBiZSBVUklzLiBHb3QgJXInCiAgICAgICAgICAgIC8vIHdhcm5pbmdzLndhcm4oZm10ICUgKG5hbWVzcGFjZSwpLCBEZXByZWNhdGlvbldhcm5pbmcpCgogICAgICAgICAgICBpZiAoJG5hbWVzcGFjZSA9PSAnc3JlZycpIHsKICAgICAgICAgICAgICAgIC8vIGZtdCA9ICdVc2luZyAlciBpbnN0ZWFkIG9mICJzcmVnIiBhcyBuYW1lc3BhY2UnCiAgICAgICAgICAgICAgICAvLyB3YXJuaW5ncy53YXJuKGZtdCAlIChTUkVHX1VSSSwpLCBEZXByZWNhdGlvbldhcm5pbmcsKQogICAgICAgICAgICAgICAgcmV0dXJuIEF1dGhfT3BlbklEX1NSRUdfVVJJOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJG5hbWVzcGFjZTsKICAgIH0KCiAgICBmdW5jdGlvbiBoYXNLZXkoJG5hbWVzcGFjZSwgJG5zX2tleSkKICAgIHsKICAgICAgICAkbmFtZXNwYWNlID0gJHRoaXMtPl9maXhOUygkbmFtZXNwYWNlKTsKICAgICAgICBpZiAoQXV0aF9PcGVuSUQ6OmlzRmFpbHVyZSgkbmFtZXNwYWNlKSkgewogICAgICAgICAgICAvLyBYWFggbG9nIG1lCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gJHRoaXMtPmFyZ3MtPmNvbnRhaW5zKGFycmF5KCRuYW1lc3BhY2UsICRuc19rZXkpKTsKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gZ2V0S2V5KCRuYW1lc3BhY2UsICRuc19rZXkpCiAgICB7CiAgICAgICAgLy8gR2V0IHRoZSBrZXkgZm9yIGEgcGFydGljdWxhciBuYW1lc3BhY2VkIGFyZ3VtZW50CiAgICAgICAgJG5hbWVzcGFjZSA9ICR0aGlzLT5fZml4TlMoJG5hbWVzcGFjZSk7CiAgICAgICAgaWYgKEF1dGhfT3BlbklEOjppc0ZhaWx1cmUoJG5hbWVzcGFjZSkpIHsKICAgICAgICAgICAgcmV0dXJuICRuYW1lc3BhY2U7CiAgICAgICAgfQogICAgICAgIGlmICgkbmFtZXNwYWNlID09IEF1dGhfT3BlbklEX0JBUkVfTlMpIHsKICAgICAgICAgICAgcmV0dXJuICRuc19rZXk7CiAgICAgICAgfQoKICAgICAgICAkbnNfYWxpYXMgPSAkdGhpcy0+bmFtZXNwYWNlcy0+Z2V0QWxpYXMoJG5hbWVzcGFjZSk7CgogICAgICAgIC8vIE5vIGFsaWFzIGlzIGRlZmluZWQsIHNvIG5vIGtleSBjYW4gZXhpc3QKICAgICAgICBpZiAoJG5zX2FsaWFzID09PSBudWxsKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KCiAgICAgICAgaWYgKCRuc19hbGlhcyA9PSBBdXRoX09wZW5JRF9OVUxMX05BTUVTUEFDRSkgewogICAgICAgICAgICAkdGFpbCA9ICRuc19rZXk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJHRhaWwgPSBzcHJpbnRmKCclcy4lcycsICRuc19hbGlhcywgJG5zX2tleSk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJ29wZW5pZC4nIC4gJHRhaWw7CiAgICB9CgogICAgZnVuY3Rpb24gZ2V0QXJnKCRuYW1lc3BhY2UsICRrZXksICRkZWZhdWx0ID0gbnVsbCkKICAgIHsKICAgICAgICAvLyBHZXQgYSB2YWx1ZSBmb3IgYSBuYW1lc3BhY2VkIGtleS4KICAgICAgICAkbmFtZXNwYWNlID0gJHRoaXMtPl9maXhOUygkbmFtZXNwYWNlKTsKCiAgICAgICAgaWYgKEF1dGhfT3BlbklEOjppc0ZhaWx1cmUoJG5hbWVzcGFjZSkpIHsKICAgICAgICAgICAgcmV0dXJuICRuYW1lc3BhY2U7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKCghJHRoaXMtPmFyZ3MtPmNvbnRhaW5zKGFycmF5KCRuYW1lc3BhY2UsICRrZXkpKSkgJiYKICAgICAgICAgICAgICAoJGRlZmF1bHQgPT0gQXV0aF9PcGVuSURfTk9fREVGQVVMVCkpIHsKICAgICAgICAgICAgICAgICRlcnJfbXNnID0gc3ByaW50ZigiTmFtZXNwYWNlICVzIG1pc3NpbmcgcmVxdWlyZWQgZmllbGQgJXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRuYW1lc3BhY2UsICRrZXkpOwogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBdXRoX09wZW5JRF9GYWlsdXJlUmVzcG9uc2UobnVsbCwgJGVycl9tc2cpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5hcmdzLT5nZXQoYXJyYXkoJG5hbWVzcGFjZSwgJGtleSksICRkZWZhdWx0KTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBnZXRBcmdzKCRuYW1lc3BhY2UpCiAgICB7CiAgICAgICAgLy8gR2V0IHRoZSBhcmd1bWVudHMgdGhhdCBhcmUgZGVmaW5lZCBmb3IgdGhpcyBuYW1lc3BhY2UgVVJJCgogICAgICAgICRuYW1lc3BhY2UgPSAkdGhpcy0+X2ZpeE5TKCRuYW1lc3BhY2UpOwogICAgICAgIGlmIChBdXRoX09wZW5JRDo6aXNGYWlsdXJlKCRuYW1lc3BhY2UpKSB7CiAgICAgICAgICAgIHJldHVybiAkbmFtZXNwYWNlOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRzdHVmZiA9IGFycmF5KCk7CiAgICAgICAgICAgIGZvcmVhY2ggKCR0aGlzLT5hcmdzLT5pdGVtcygpIGFzICRwYWlyKSB7CiAgICAgICAgICAgICAgICBsaXN0KCRrZXksICR2YWx1ZSkgPSAkcGFpcjsKICAgICAgICAgICAgICAgIGxpc3QoJHBhaXJfbnMsICRuc19rZXkpID0gJGtleTsKICAgICAgICAgICAgICAgIGlmICgkcGFpcl9ucyA9PSAkbmFtZXNwYWNlKSB7CiAgICAgICAgICAgICAgICAgICAgJHN0dWZmWyRuc19rZXldID0gJHZhbHVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gJHN0dWZmOwogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiB1cGRhdGVBcmdzKCRuYW1lc3BhY2UsICR1cGRhdGVzKQogICAgewogICAgICAgIC8vIFNldCBtdWx0aXBsZSBrZXkvdmFsdWUgcGFpcnMgaW4gb25lIGNhbGwKCiAgICAgICAgJG5hbWVzcGFjZSA9ICR0aGlzLT5fZml4TlMoJG5hbWVzcGFjZSk7CgogICAgICAgIGlmIChBdXRoX09wZW5JRDo6aXNGYWlsdXJlKCRuYW1lc3BhY2UpKSB7CiAgICAgICAgICAgIHJldHVybiAkbmFtZXNwYWNlOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGZvcmVhY2ggKCR1cGRhdGVzIGFzICRrID0+ICR2KSB7CiAgICAgICAgICAgICAgICAkdGhpcy0+c2V0QXJnKCRuYW1lc3BhY2UsICRrLCAkdik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIHNldEFyZygkbmFtZXNwYWNlLCAka2V5LCAkdmFsdWUpCiAgICB7CiAgICAgICAgLy8gU2V0IGEgc2luZ2xlIGFyZ3VtZW50IGluIHRoaXMgbmFtZXNwYWNlCiAgICAgICAgJG5hbWVzcGFjZSA9ICR0aGlzLT5fZml4TlMoJG5hbWVzcGFjZSk7CgogICAgICAgIGlmIChBdXRoX09wZW5JRDo6aXNGYWlsdXJlKCRuYW1lc3BhY2UpKSB7CiAgICAgICAgICAgIHJldHVybiAkbmFtZXNwYWNlOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICR0aGlzLT5hcmdzLT5zZXQoYXJyYXkoJG5hbWVzcGFjZSwgJGtleSksICR2YWx1ZSk7CiAgICAgICAgICAgIGlmICgkbmFtZXNwYWNlICE9PSBBdXRoX09wZW5JRF9CQVJFX05TKSB7CiAgICAgICAgICAgICAgICAkdGhpcy0+bmFtZXNwYWNlcy0+YWRkKCRuYW1lc3BhY2UpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBkZWxBcmcoJG5hbWVzcGFjZSwgJGtleSkKICAgIHsKICAgICAgICAkbmFtZXNwYWNlID0gJHRoaXMtPl9maXhOUygkbmFtZXNwYWNlKTsKCiAgICAgICAgaWYgKEF1dGhfT3BlbklEOjppc0ZhaWx1cmUoJG5hbWVzcGFjZSkpIHsKICAgICAgICAgICAgcmV0dXJuICRuYW1lc3BhY2U7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5hcmdzLT5kZWwoYXJyYXkoJG5hbWVzcGFjZSwgJGtleSkpOwogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBnZXRBbGlhc2VkQXJnKCRhbGlhc2VkX2tleSwgJGRlZmF1bHQgPSBudWxsKQogICAgewogICAgICAgIGlmICgkYWxpYXNlZF9rZXkgPT0gJ25zJykgewogICAgICAgICAgICAvLyBSZXR1cm4gdGhlIG5hbWVzcGFjZSBVUkkgZm9yIHRoZSBPcGVuSUQgbmFtZXNwYWNlCiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+Z2V0T3BlbklETmFtZXNwYWNlKCk7CiAgICAgICAgfQoKICAgICAgICAkcGFydHMgPSBleHBsb2RlKCcuJywgJGFsaWFzZWRfa2V5LCAyKTsKCiAgICAgICAgaWYgKGNvdW50KCRwYXJ0cykgIT0gMikgewogICAgICAgICAgICAkbnMgPSBudWxsOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGxpc3QoJGFsaWFzLCAka2V5KSA9ICRwYXJ0czsKCiAgICAgICAgICAgIGlmICgkYWxpYXMgPT0gJ25zJykgewogICAgICAgICAgICAgIC8vIFJldHVybiB0aGUgbmFtZXNwYWNlIFVSSSBmb3IgYSBuYW1lc3BhY2UgYWxpYXMKICAgICAgICAgICAgICAvLyBwYXJhbWV0ZXIuCiAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5uYW1lc3BhY2VzLT5nZXROYW1lc3BhY2VVUkkoJGtleSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgJG5zID0gJHRoaXMtPm5hbWVzcGFjZXMtPmdldE5hbWVzcGFjZVVSSSgkYWxpYXMpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoJG5zID09PSBudWxsKSB7CiAgICAgICAgICAgICRrZXkgPSAkYWxpYXNlZF9rZXk7CiAgICAgICAgICAgICRucyA9ICR0aGlzLT5nZXRPcGVuSUROYW1lc3BhY2UoKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkdGhpcy0+Z2V0QXJnKCRucywgJGtleSwgJGRlZmF1bHQpOwogICAgfQp9CgoK]]></data>
	</file>
	<file>
	  <filename>/openid-php-openid-782224d/Auth/OpenID/MySQLStore.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBBIE15U1FMIHN0b3JlLgogKgogKiBAcGFja2FnZSBPcGVuSUQKICovCgovKioKICogUmVxdWlyZSB0aGUgYmFzZSBjbGFzcyBmaWxlLgogKi8KcmVxdWlyZV9vbmNlICJBdXRoL09wZW5JRC9TUUxTdG9yZS5waHAiOwoKLyoqCiAqIEFuIFNRTCBzdG9yZSB0aGF0IHVzZXMgTXlTUUwgYXMgaXRzIGJhY2tlbmQuCiAqCiAqIEBwYWNrYWdlIE9wZW5JRAogKi8KY2xhc3MgQXV0aF9PcGVuSURfTXlTUUxTdG9yZSBleHRlbmRzIEF1dGhfT3BlbklEX1NRTFN0b3JlIHsKICAgIC8qKgogICAgICogQGFjY2VzcyBwcml2YXRlCiAgICAgKi8KICAgIGZ1bmN0aW9uIHNldFNRTCgpCiAgICB7CiAgICAgICAgJHRoaXMtPnNxbFsnbm9uY2VfdGFibGUnXSA9CiAgICAgICAgICAgICJDUkVBVEUgVEFCTEUgJXMgKFxuIi4KICAgICAgICAgICAgIiAgc2VydmVyX3VybCBWQVJDSEFSKDIwNDcpIE5PVCBOVUxMLFxuIi4KICAgICAgICAgICAgIiAgdGltZXN0YW1wIElOVEVHRVIgTk9UIE5VTEwsXG4iLgogICAgICAgICAgICAiICBzYWx0IENIQVIoNDApIE5PVCBOVUxMLFxuIi4KICAgICAgICAgICAgIiAgVU5JUVVFIChzZXJ2ZXJfdXJsKDI1NSksIHRpbWVzdGFtcCwgc2FsdClcbiIuCiAgICAgICAgICAgICIpIEVOR0lORT1Jbm5vREIiOwoKICAgICAgICAkdGhpcy0+c3FsWydhc3NvY190YWJsZSddID0KICAgICAgICAgICAgIkNSRUFURSBUQUJMRSAlcyAoXG4iLgogICAgICAgICAgICAiICBzZXJ2ZXJfdXJsIEJMT0IgTk9UIE5VTEwsXG4iLgogICAgICAgICAgICAiICBoYW5kbGUgVkFSQ0hBUigyNTUpIE5PVCBOVUxMLFxuIi4KICAgICAgICAgICAgIiAgc2VjcmV0IFZBUkNIQVIoMjU1KSBOT1QgTlVMTCxcbiIuCiAgICAgICAgICAgICIgIGlzc3VlZCBJTlRFR0VSIE5PVCBOVUxMLFxuIi4KICAgICAgICAgICAgIiAgbGlmZXRpbWUgSU5URUdFUiBOT1QgTlVMTCxcbiIuCiAgICAgICAgICAgICIgIGFzc29jX3R5cGUgVkFSQ0hBUig2NCkgTk9UIE5VTEwsXG4iLgogICAgICAgICAgICAiICBQUklNQVJZIEtFWSAoc2VydmVyX3VybCgyNTUpLCBoYW5kbGUpXG4iLgogICAgICAgICAgICAiKSBFTkdJTkU9SW5ub0RCIjsKCiAgICAgICAgJHRoaXMtPnNxbFsnc2V0X2Fzc29jJ10gPQogICAgICAgICAgICAiUkVQTEFDRSBJTlRPICVzIChzZXJ2ZXJfdXJsLCBoYW5kbGUsIHNlY3JldCwgaXNzdWVkLFxuIi4KICAgICAgICAgICAgIiAgbGlmZXRpbWUsIGFzc29jX3R5cGUpIFZBTFVFUyAoPywgPywgPywgPywgPywgPykiOwoKICAgICAgICAkdGhpcy0+c3FsWydnZXRfYXNzb2NzJ10gPQogICAgICAgICAgICAiU0VMRUNUIGhhbmRsZSwgc2VjcmV0LCBpc3N1ZWQsIGxpZmV0aW1lLCBhc3NvY190eXBlIEZST00gJXMgIi4KICAgICAgICAgICAgIldIRVJFIHNlcnZlcl91cmwgPSA/IjsKCiAgICAgICAgJHRoaXMtPnNxbFsnZ2V0X2Fzc29jJ10gPQogICAgICAgICAgICAiU0VMRUNUIGhhbmRsZSwgc2VjcmV0LCBpc3N1ZWQsIGxpZmV0aW1lLCBhc3NvY190eXBlIEZST00gJXMgIi4KICAgICAgICAgICAgIldIRVJFIHNlcnZlcl91cmwgPSA/IEFORCBoYW5kbGUgPSA/IjsKCiAgICAgICAgJHRoaXMtPnNxbFsncmVtb3ZlX2Fzc29jJ10gPQogICAgICAgICAgICAiREVMRVRFIEZST00gJXMgV0hFUkUgc2VydmVyX3VybCA9ID8gQU5EIGhhbmRsZSA9ID8iOwoKICAgICAgICAkdGhpcy0+c3FsWydhZGRfbm9uY2UnXSA9CiAgICAgICAgICAgICJJTlNFUlQgSU5UTyAlcyAoc2VydmVyX3VybCwgdGltZXN0YW1wLCBzYWx0KSBWQUxVRVMgKD8sID8sID8pIjsKCiAgICAgICAgJHRoaXMtPnNxbFsnY2xlYW5fbm9uY2UnXSA9CiAgICAgICAgICAgICJERUxFVEUgRlJPTSAlcyBXSEVSRSB0aW1lc3RhbXAgPCA/IjsKCiAgICAgICAgJHRoaXMtPnNxbFsnY2xlYW5fYXNzb2MnXSA9CiAgICAgICAgICAgICJERUxFVEUgRlJPTSAlcyBXSEVSRSBpc3N1ZWQgKyBsaWZldGltZSA8ID8iOwogICAgfQoKICAgIC8qKgogICAgICogQGFjY2VzcyBwcml2YXRlCiAgICAgKi8KICAgIGZ1bmN0aW9uIGJsb2JFbmNvZGUoJGJsb2IpCiAgICB7CiAgICAgICAgcmV0dXJuIGJhc2U2NF9lbmNvZGUoJGJsb2IpOwogICAgfQoKICAgIC8qKgogICAgICogQGFjY2VzcyBwcml2YXRlCiAgICAgKi8KICAgIGZ1bmN0aW9uICBibG9iRGVjb2RlKCRibG9iKSB7CiAgICAgICAgcmV0dXJuIGJhc2U2NF9kZWNvZGUoJGJsb2IpOwogICAgfQp9Cgo=]]></data>
	</file>
	<file>
	  <filename>/openid-php-openid-782224d/Auth/OpenID/Nonce.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBOb25jZS1yZWxhdGVkIGZ1bmN0aW9uYWxpdHkuCiAqCiAqIEBwYWNrYWdlIE9wZW5JRAogKi8KCi8qKgogKiBOZWVkIENyeXB0VXRpbCB0byBnZW5lcmF0ZSByYW5kb20gc3RyaW5ncy4KICovCnJlcXVpcmVfb25jZSAnQXV0aC9PcGVuSUQvQ3J5cHRVdGlsLnBocCc7CgovKioKICogVGhpcyBpcyB0aGUgY2hhcmFjdGVycyB0aGF0IHRoZSBub25jZXMgYXJlIG1hZGUgZnJvbS4KICovCmRlZmluZSgnQXV0aF9PcGVuSURfTm9uY2VfQ0hSUycsImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6IiAuCiAgICAgICAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVowMTIzNDU2Nzg5Iik7CgovLyBLZWVwIG5vbmNlcyBmb3IgZml2ZSBob3VycyAoYWxsb3cgZml2ZSBob3VycyBmb3IgdGhlIGNvbWJpbmF0aW9uIG9mCi8vIHJlcXVlc3QgdGltZSBhbmQgY2xvY2sgc2tldykuIFRoaXMgaXMgcHJvYmFibHkgd2F5IG1vcmUgdGhhbiBpcwovLyBuZWNlc3NhcnksIGJ1dCB0aGVyZSBpcyBub3QgbXVjaCBvdmVyaGVhZCBpbiBzdG9yaW5nIG5vbmNlcy4KZ2xvYmFsICRBdXRoX09wZW5JRF9TS0VXOwokQXV0aF9PcGVuSURfU0tFVyA9IDYwICogNjAgKiA1OwoKZGVmaW5lKCdBdXRoX09wZW5JRF9Ob25jZV9SRUdFWCcsCiAgICAgICAnLyhcZHs0fSktKFxkXGQpLShcZFxkKVQoXGRcZCk6KFxkXGQpOihcZFxkKVooLiopLycpOwoKZGVmaW5lKCdBdXRoX09wZW5JRF9Ob25jZV9USU1FX0ZNVCcsCiAgICAgICAnJVktJW0tJWRUJUg6JU06JVNaJyk7CgpmdW5jdGlvbiBBdXRoX09wZW5JRF9zcGxpdE5vbmNlKCRub25jZV9zdHJpbmcpCnsKICAgIC8vIEV4dHJhY3QgYSB0aW1lc3RhbXAgZnJvbSB0aGUgZ2l2ZW4gbm9uY2Ugc3RyaW5nCiAgICAkcmVzdWx0ID0gcHJlZ19tYXRjaChBdXRoX09wZW5JRF9Ob25jZV9SRUdFWCwgJG5vbmNlX3N0cmluZywgJG1hdGNoZXMpOwogICAgaWYgKCRyZXN1bHQgIT0gMSB8fCBjb3VudCgkbWF0Y2hlcykgIT0gOCkgewogICAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgIGxpc3QoJHVudXNlZCwKICAgICAgICAgJHRtX3llYXIsCiAgICAgICAgICR0bV9tb24sCiAgICAgICAgICR0bV9tZGF5LAogICAgICAgICAkdG1faG91ciwKICAgICAgICAgJHRtX21pbiwKICAgICAgICAgJHRtX3NlYywKICAgICAgICAgJHVuaXF1aWZpZXIpID0gJG1hdGNoZXM7CgogICAgJHRpbWVzdGFtcCA9CiAgICAgICAgQGdtbWt0aW1lKCR0bV9ob3VyLCAkdG1fbWluLCAkdG1fc2VjLCAkdG1fbW9uLCAkdG1fbWRheSwgJHRtX3llYXIpOwoKICAgIGlmICgkdGltZXN0YW1wID09PSBmYWxzZSB8fCAkdGltZXN0YW1wIDwgMCkgewogICAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgIHJldHVybiBhcnJheSgkdGltZXN0YW1wLCAkdW5pcXVpZmllcik7Cn0KCmZ1bmN0aW9uIEF1dGhfT3BlbklEX2NoZWNrVGltZXN0YW1wKCRub25jZV9zdHJpbmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRhbGxvd2VkX3NrZXcgPSBudWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbm93ID0gbnVsbCkKewogICAgLy8gSXMgdGhlIHRpbWVzdGFtcCB0aGF0IGlzIHBhcnQgb2YgdGhlIHNwZWNpZmllZCBub25jZSBzdHJpbmcKICAgIC8vIHdpdGhpbiB0aGUgYWxsb3dlZCBjbG9jay1za2V3IG9mIHRoZSBjdXJyZW50IHRpbWU/CiAgICBnbG9iYWwgJEF1dGhfT3BlbklEX1NLRVc7CgogICAgaWYgKCRhbGxvd2VkX3NrZXcgPT09IG51bGwpIHsKICAgICAgICAkYWxsb3dlZF9za2V3ID0gJEF1dGhfT3BlbklEX1NLRVc7CiAgICB9CgogICAgJHBhcnRzID0gQXV0aF9PcGVuSURfc3BsaXROb25jZSgkbm9uY2Vfc3RyaW5nKTsKICAgIGlmICgkcGFydHMgPT0gbnVsbCkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICBpZiAoJG5vdyA9PT0gbnVsbCkgewogICAgICAgICRub3cgPSB0aW1lKCk7CiAgICB9CgogICAgJHN0YW1wID0gJHBhcnRzWzBdOwoKICAgIC8vIFRpbWUgYWZ0ZXIgd2hpY2ggd2Ugc2hvdWxkIG5vdCB1c2UgdGhlIG5vbmNlCiAgICAkcGFzdCA9ICRub3cgLSAkYWxsb3dlZF9za2V3OwoKICAgIC8vIFRpbWUgdGhhdCBpcyB0b28gZmFyIGluIHRoZSBmdXR1cmUgZm9yIHVzIHRvIGFsbG93CiAgICAkZnV0dXJlID0gJG5vdyArICRhbGxvd2VkX3NrZXc7CgogICAgLy8gdGhlIHN0YW1wIGlzIG5vdCB0b28gZmFyIGluIHRoZSBmdXR1cmUgYW5kIGlzIG5vdCB0b28gZmFyCiAgICAvLyBpbiB0aGUgcGFzdAogICAgcmV0dXJuICgoJHBhc3QgPD0gJHN0YW1wKSAmJiAoJHN0YW1wIDw9ICRmdXR1cmUpKTsKfQoKZnVuY3Rpb24gQXV0aF9PcGVuSURfbWtOb25jZSgkd2hlbiA9IG51bGwpCnsKICAgIC8vIEdlbmVyYXRlIGEgbm9uY2Ugd2l0aCB0aGUgY3VycmVudCB0aW1lc3RhbXAKICAgICRzYWx0ID0gQXV0aF9PcGVuSURfQ3J5cHRVdGlsOjpyYW5kb21TdHJpbmcoCiAgICAgICAgNiwgQXV0aF9PcGVuSURfTm9uY2VfQ0hSUyk7CiAgICBpZiAoJHdoZW4gPT09IG51bGwpIHsKICAgICAgICAvLyBJdCdzIHNhZmUgdG8gY2FsbCB0aW1lKCkgd2l0aCBubyBhcmd1bWVudHM7IGl0IHJldHVybnMgYQogICAgICAgIC8vIEdNVCB1bml4IHRpbWVzdGFtcCBvbiBQSFAgNCBhbmQgUEhQIDUuICBnbW1rdGltZSgpIHdpdGggbm8KICAgICAgICAvLyBhcmdzIHJldHVybnMgYSBsb2NhbCB1bml4IHRpbWVzdGFtcCBvbiBQSFAgNCwgc28gZG9uJ3QgdXNlCiAgICAgICAgLy8gdGhhdC4KICAgICAgICAkd2hlbiA9IHRpbWUoKTsKICAgIH0KICAgICR0aW1lX3N0ciA9IGdtc3RyZnRpbWUoQXV0aF9PcGVuSURfTm9uY2VfVElNRV9GTVQsICR3aGVuKTsKICAgIHJldHVybiAkdGltZV9zdHIgLiAkc2FsdDsKfQoK]]></data>
	</file>
	<file>
	  <filename>/openid-php-openid-782224d/Auth/OpenID/PAPE.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgT3BlbklEIFByb3ZpZGVyIEF1dGhlbnRpY2F0aW9uIFBvbGljeQogKiAgRXh0ZW5zaW9uIDEuMAogKgogKiBTZWU6CiAqIGh0dHA6Ly9vcGVuaWQubmV0L2RldmVsb3BlcnMvc3BlY3MvCiAqLwoKcmVxdWlyZV9vbmNlICJBdXRoL09wZW5JRC9FeHRlbnNpb24ucGhwIjsKCmRlZmluZSgnQXV0aF9PcGVuSURfUEFQRV9OU19VUkknLAogICAgICAgImh0dHA6Ly9zcGVjcy5vcGVuaWQubmV0L2V4dGVuc2lvbnMvcGFwZS8xLjAiKTsKCmRlZmluZSgnUEFQRV9BVVRIX01VTFRJX0ZBQ1RPUl9QSFlTSUNBTCcsCiAgICAgICAnaHR0cDovL3NjaGVtYXMub3BlbmlkLm5ldC9wYXBlL3BvbGljaWVzLzIwMDcvMDYvbXVsdGktZmFjdG9yLXBoeXNpY2FsJyk7CmRlZmluZSgnUEFQRV9BVVRIX01VTFRJX0ZBQ1RPUicsCiAgICAgICAnaHR0cDovL3NjaGVtYXMub3BlbmlkLm5ldC9wYXBlL3BvbGljaWVzLzIwMDcvMDYvbXVsdGktZmFjdG9yJyk7CmRlZmluZSgnUEFQRV9BVVRIX1BISVNISU5HX1JFU0lTVEFOVCcsCiAgICAgICAnaHR0cDovL3NjaGVtYXMub3BlbmlkLm5ldC9wYXBlL3BvbGljaWVzLzIwMDcvMDYvcGhpc2hpbmctcmVzaXN0YW50Jyk7CgpkZWZpbmUoJ1BBUEVfVElNRV9WQUxJREFUT1InLAogICAgICAnL15bMC05XXs0LDR9LVswLTldWzAtOV0tWzAtOV1bMC05XVRbMC05XVswLTldOlswLTldWzAtOV06WzAtOV1bMC05XVokLycpOwovKioKICogQSBQcm92aWRlciBBdXRoZW50aWNhdGlvbiBQb2xpY3kgcmVxdWVzdCwgc2VudCBmcm9tIGEgcmVseWluZyBwYXJ0eQogKiB0byBhIHByb3ZpZGVyCiAqCiAqIHByZWZlcnJlZF9hdXRoX3BvbGljaWVzOiBUaGUgYXV0aGVudGljYXRpb24gcG9saWNpZXMgdGhhdAogKiB0aGUgcmVseWluZyBwYXJ0eSBwcmVmZXJzCiAqCiAqIG1heF9hdXRoX2FnZTogVGhlIG1heGltdW0gdGltZSwgaW4gc2Vjb25kcywgdGhhdCB0aGUgcmVseWluZyBwYXJ0eQogKiB3YW50cyB0byBhbGxvdyB0byBoYXZlIGVsYXBzZWQgYmVmb3JlIHRoZSB1c2VyIG11c3QgcmUtYXV0aGVudGljYXRlCiAqLwpjbGFzcyBBdXRoX09wZW5JRF9QQVBFX1JlcXVlc3QgZXh0ZW5kcyBBdXRoX09wZW5JRF9FeHRlbnNpb24gewoKICAgIHZhciAkbnNfYWxpYXMgPSAncGFwZSc7CiAgICB2YXIgJG5zX3VyaSA9IEF1dGhfT3BlbklEX1BBUEVfTlNfVVJJOwoKICAgIGZ1bmN0aW9uIEF1dGhfT3BlbklEX1BBUEVfUmVxdWVzdCgkcHJlZmVycmVkX2F1dGhfcG9saWNpZXM9bnVsbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbWF4X2F1dGhfYWdlPW51bGwpCiAgICB7CiAgICAgICAgaWYgKCRwcmVmZXJyZWRfYXV0aF9wb2xpY2llcyA9PT0gbnVsbCkgewogICAgICAgICAgICAkcHJlZmVycmVkX2F1dGhfcG9saWNpZXMgPSBhcnJheSgpOwogICAgICAgIH0KCiAgICAgICAgJHRoaXMtPnByZWZlcnJlZF9hdXRoX3BvbGljaWVzID0gJHByZWZlcnJlZF9hdXRoX3BvbGljaWVzOwogICAgICAgICR0aGlzLT5tYXhfYXV0aF9hZ2UgPSAkbWF4X2F1dGhfYWdlOwogICAgfQoKICAgIC8qKgogICAgICogQWRkIGFuIGFjY2VwdGFibGUgYXV0aGVudGljYXRpb24gcG9saWN5IFVSSSB0byB0aGlzIHJlcXVlc3QKICAgICAqCiAgICAgKiBUaGlzIG1ldGhvZCBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIGJ5IHRoZSByZWx5aW5nIHBhcnR5IHRvIGFkZAogICAgICogYWNjZXB0YWJsZSBhdXRoZW50aWNhdGlvbiB0eXBlcyB0byB0aGUgcmVxdWVzdC4KICAgICAqCiAgICAgKiBwb2xpY3lfdXJpOiBUaGUgaWRlbnRpZmllciBmb3IgdGhlIHByZWZlcnJlZCB0eXBlIG9mCiAgICAgKiBhdXRoZW50aWNhdGlvbi4KICAgICAqLwogICAgZnVuY3Rpb24gYWRkUG9saWN5VVJJKCRwb2xpY3lfdXJpKQogICAgewogICAgICAgIGlmICghaW5fYXJyYXkoJHBvbGljeV91cmksICR0aGlzLT5wcmVmZXJyZWRfYXV0aF9wb2xpY2llcykpIHsKICAgICAgICAgICAgJHRoaXMtPnByZWZlcnJlZF9hdXRoX3BvbGljaWVzW10gPSAkcG9saWN5X3VyaTsKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gZ2V0RXh0ZW5zaW9uQXJncygpCiAgICB7CiAgICAgICAgJG5zX2FyZ3MgPSBhcnJheSgKICAgICAgICAgICAgICAgICAgICAgICAgICdwcmVmZXJyZWRfYXV0aF9wb2xpY2llcycgPT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbG9kZSgnICcsICR0aGlzLT5wcmVmZXJyZWRfYXV0aF9wb2xpY2llcykKICAgICAgICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgIGlmICgkdGhpcy0+bWF4X2F1dGhfYWdlICE9PSBudWxsKSB7CiAgICAgICAgICAgICRuc19hcmdzWydtYXhfYXV0aF9hZ2UnXSA9IHN0cnZhbCgkdGhpcy0+bWF4X2F1dGhfYWdlKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkbnNfYXJnczsKICAgIH0KCiAgICAvKioKICAgICAqIEluc3RhbnRpYXRlIGEgUmVxdWVzdCBvYmplY3QgZnJvbSB0aGUgYXJndW1lbnRzIGluIGEgY2hlY2tpZF8qCiAgICAgKiBPcGVuSUQgbWVzc2FnZQogICAgICovCiAgICBzdGF0aWMgZnVuY3Rpb24gZnJvbU9wZW5JRFJlcXVlc3QoJHJlcXVlc3QpCiAgICB7CiAgICAgICAgJG9iaiA9IG5ldyBBdXRoX09wZW5JRF9QQVBFX1JlcXVlc3QoKTsKICAgICAgICAkYXJncyA9ICRyZXF1ZXN0LT5tZXNzYWdlLT5nZXRBcmdzKEF1dGhfT3BlbklEX1BBUEVfTlNfVVJJKTsKCiAgICAgICAgaWYgKCRhcmdzID09PSBudWxsIHx8ICRhcmdzID09PSBhcnJheSgpKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KCiAgICAgICAgJG9iai0+cGFyc2VFeHRlbnNpb25BcmdzKCRhcmdzKTsKICAgICAgICByZXR1cm4gJG9iajsKICAgIH0KCiAgICAvKioKICAgICAqIFNldCB0aGUgc3RhdGUgb2YgdGhpcyByZXF1ZXN0IHRvIGJlIHRoYXQgZXhwcmVzc2VkIGluIHRoZXNlCiAgICAgKiBQQVBFIGFyZ3VtZW50cwogICAgICoKICAgICAqIEBwYXJhbSBhcmdzOiBUaGUgUEFQRSBhcmd1bWVudHMgd2l0aG91dCBhIG5hbWVzcGFjZQogICAgICovCiAgICBmdW5jdGlvbiBwYXJzZUV4dGVuc2lvbkFyZ3MoJGFyZ3MpCiAgICB7CiAgICAgICAgLy8gcHJlZmVycmVkX2F1dGhfcG9saWNpZXMgaXMgYSBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBwb2xpY3kKICAgICAgICAvLyBVUklzCiAgICAgICAgJHRoaXMtPnByZWZlcnJlZF9hdXRoX3BvbGljaWVzID0gYXJyYXkoKTsKCiAgICAgICAgJHBvbGljaWVzX3N0ciA9IEF1dGhfT3BlbklEOjphcnJheUdldCgkYXJncywgJ3ByZWZlcnJlZF9hdXRoX3BvbGljaWVzJyk7CiAgICAgICAgaWYgKCRwb2xpY2llc19zdHIpIHsKICAgICAgICAgICAgZm9yZWFjaCAoZXhwbG9kZSgnICcsICRwb2xpY2llc19zdHIpIGFzICR1cmkpIHsKICAgICAgICAgICAgICAgIGlmICghaW5fYXJyYXkoJHVyaSwgJHRoaXMtPnByZWZlcnJlZF9hdXRoX3BvbGljaWVzKSkgewogICAgICAgICAgICAgICAgICAgICR0aGlzLT5wcmVmZXJyZWRfYXV0aF9wb2xpY2llc1tdID0gJHVyaTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gbWF4X2F1dGhfYWdlIGlzIGJhc2UtMTAgaW50ZWdlciBudW1iZXIgb2Ygc2Vjb25kcwogICAgICAgICRtYXhfYXV0aF9hZ2Vfc3RyID0gQXV0aF9PcGVuSUQ6OmFycmF5R2V0KCRhcmdzLCAnbWF4X2F1dGhfYWdlJyk7CiAgICAgICAgaWYgKCRtYXhfYXV0aF9hZ2Vfc3RyKSB7CiAgICAgICAgICAgICR0aGlzLT5tYXhfYXV0aF9hZ2UgPSBBdXRoX09wZW5JRDo6aW50dmFsKCRtYXhfYXV0aF9hZ2Vfc3RyKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkdGhpcy0+bWF4X2F1dGhfYWdlID0gbnVsbDsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBHaXZlbiBhIGxpc3Qgb2YgYXV0aGVudGljYXRpb24gcG9saWN5IFVSSXMgdGhhdCBhIHByb3ZpZGVyCiAgICAgKiBzdXBwb3J0cywgdGhpcyBtZXRob2QgcmV0dXJucyB0aGUgc3Vic2VxdWVuY2Ugb2YgdGhvc2UgdHlwZXMKICAgICAqIHRoYXQgYXJlIHByZWZlcnJlZCBieSB0aGUgcmVseWluZyBwYXJ0eS4KICAgICAqCiAgICAgKiBAcGFyYW0gc3VwcG9ydGVkX3R5cGVzOiBBIHNlcXVlbmNlIG9mIGF1dGhlbnRpY2F0aW9uIHBvbGljeQogICAgICogdHlwZSBVUklzIHRoYXQgYXJlIHN1cHBvcnRlZCBieSBhIHByb3ZpZGVyCiAgICAgKgogICAgICogQHJldHVybiBhcnJheSBUaGUgc3ViLXNlcXVlbmNlIG9mIHRoZSBzdXBwb3J0ZWQgdHlwZXMgdGhhdCBhcmUKICAgICAqIHByZWZlcnJlZCBieSB0aGUgcmVseWluZyBwYXJ0eS4gVGhpcyBsaXN0IHdpbGwgYmUgb3JkZXJlZCBpbgogICAgICogdGhlIG9yZGVyIHRoYXQgdGhlIHR5cGVzIGFwcGVhciBpbiB0aGUgc3VwcG9ydGVkX3R5cGVzCiAgICAgKiBzZXF1ZW5jZSwgYW5kIG1heSBiZSBlbXB0eSBpZiB0aGUgcHJvdmlkZXIgZG9lcyBub3QgcHJlZmVyIGFueQogICAgICogb2YgdGhlIHN1cHBvcnRlZCBhdXRoZW50aWNhdGlvbiB0eXBlcy4KICAgICAqLwogICAgZnVuY3Rpb24gcHJlZmVycmVkVHlwZXMoJHN1cHBvcnRlZF90eXBlcykKICAgIHsKICAgICAgICAkcmVzdWx0ID0gYXJyYXkoKTsKCiAgICAgICAgZm9yZWFjaCAoJHN1cHBvcnRlZF90eXBlcyBhcyAkc3QpIHsKICAgICAgICAgICAgaWYgKGluX2FycmF5KCRzdCwgJHRoaXMtPnByZWZlcnJlZF9hdXRoX3BvbGljaWVzKSkgewogICAgICAgICAgICAgICAgJHJlc3VsdFtdID0gJHN0OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiAkcmVzdWx0OwogICAgfQp9CgovKioKICogQSBQcm92aWRlciBBdXRoZW50aWNhdGlvbiBQb2xpY3kgcmVzcG9uc2UsIHNlbnQgZnJvbSBhIHByb3ZpZGVyIHRvCiAqIGEgcmVseWluZyBwYXJ0eQogKi8KY2xhc3MgQXV0aF9PcGVuSURfUEFQRV9SZXNwb25zZSBleHRlbmRzIEF1dGhfT3BlbklEX0V4dGVuc2lvbiB7CgogICAgdmFyICRuc19hbGlhcyA9ICdwYXBlJzsKICAgIHZhciAkbnNfdXJpID0gQXV0aF9PcGVuSURfUEFQRV9OU19VUkk7CgogICAgZnVuY3Rpb24gQXV0aF9PcGVuSURfUEFQRV9SZXNwb25zZSgkYXV0aF9wb2xpY2llcz1udWxsLCAkYXV0aF90aW1lPW51bGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRuaXN0X2F1dGhfbGV2ZWw9bnVsbCkKICAgIHsKICAgICAgICBpZiAoJGF1dGhfcG9saWNpZXMpIHsKICAgICAgICAgICAgJHRoaXMtPmF1dGhfcG9saWNpZXMgPSAkYXV0aF9wb2xpY2llczsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkdGhpcy0+YXV0aF9wb2xpY2llcyA9IGFycmF5KCk7CiAgICAgICAgfQoKICAgICAgICAkdGhpcy0+YXV0aF90aW1lID0gJGF1dGhfdGltZTsKICAgICAgICAkdGhpcy0+bmlzdF9hdXRoX2xldmVsID0gJG5pc3RfYXV0aF9sZXZlbDsKICAgIH0KCiAgICAvKioKICAgICAqIEFkZCBhIGF1dGhlbnRpY2F0aW9uIHBvbGljeSB0byB0aGlzIHJlc3BvbnNlCiAgICAgKgogICAgICogVGhpcyBtZXRob2QgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBieSB0aGUgcHJvdmlkZXIgdG8gYWRkIGEKICAgICAqIHBvbGljeSB0aGF0IHRoZSBwcm92aWRlciBjb25mb3JtZWQgdG8gd2hlbiBhdXRoZW50aWNhdGluZyB0aGUKICAgICAqIHVzZXIuCiAgICAgKgogICAgICogQHBhcmFtIHBvbGljeV91cmk6IFRoZSBpZGVudGlmaWVyIGZvciB0aGUgcHJlZmVycmVkIHR5cGUgb2YKICAgICAqIGF1dGhlbnRpY2F0aW9uLgogICAgICovCiAgICBmdW5jdGlvbiBhZGRQb2xpY3lVUkkoJHBvbGljeV91cmkpCiAgICB7CiAgICAgICAgaWYgKCFpbl9hcnJheSgkcG9saWN5X3VyaSwgJHRoaXMtPmF1dGhfcG9saWNpZXMpKSB7CiAgICAgICAgICAgICR0aGlzLT5hdXRoX3BvbGljaWVzW10gPSAkcG9saWN5X3VyaTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBDcmVhdGUgYW4gQXV0aF9PcGVuSURfUEFQRV9SZXNwb25zZSBvYmplY3QgZnJvbSBhIHN1Y2Nlc3NmdWwKICAgICAqIE9wZW5JRCBsaWJyYXJ5IHJlc3BvbnNlLgogICAgICoKICAgICAqIEBwYXJhbSBzdWNjZXNzX3Jlc3BvbnNlICRzdWNjZXNzX3Jlc3BvbnNlIEEgU3VjY2Vzc1Jlc3BvbnNlCiAgICAgKiBmcm9tIEF1dGhfT3BlbklEX0NvbnN1bWVyOjpjb21wbGV0ZSgpCiAgICAgKgogICAgICogQHJldHVybnM6IEEgcHJvdmlkZXIgYXV0aGVudGljYXRpb24gcG9saWN5IHJlc3BvbnNlIGZyb20gdGhlCiAgICAgKiBkYXRhIHRoYXQgd2FzIHN1cHBsaWVkIHdpdGggdGhlIGlkX3JlcyByZXNwb25zZS4KICAgICAqLwogICAgc3RhdGljIGZ1bmN0aW9uIGZyb21TdWNjZXNzUmVzcG9uc2UoJHN1Y2Nlc3NfcmVzcG9uc2UpCiAgICB7CiAgICAgICAgJG9iaiA9IG5ldyBBdXRoX09wZW5JRF9QQVBFX1Jlc3BvbnNlKCk7CgogICAgICAgIC8vIFBBUEUgcmVxdWlyZXMgdGhhdCB0aGUgYXJncyBiZSBzaWduZWQuCiAgICAgICAgJGFyZ3MgPSAkc3VjY2Vzc19yZXNwb25zZS0+Z2V0U2lnbmVkTlMoQXV0aF9PcGVuSURfUEFQRV9OU19VUkkpOwoKICAgICAgICBpZiAoJGFyZ3MgPT09IG51bGwgfHwgJGFyZ3MgPT09IGFycmF5KCkpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQoKICAgICAgICAkcmVzdWx0ID0gJG9iai0+cGFyc2VFeHRlbnNpb25BcmdzKCRhcmdzKTsKCiAgICAgICAgaWYgKCRyZXN1bHQgPT09IGZhbHNlKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiAkb2JqOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIFBhcnNlIHRoZSBwcm92aWRlciBhdXRoZW50aWNhdGlvbiBwb2xpY3kgYXJndW1lbnRzIGludG8gdGhlCiAgICAgKiAgaW50ZXJuYWwgc3RhdGUgb2YgdGhpcyBvYmplY3QKICAgICAqCiAgICAgKiBAcGFyYW0gYXJnczogdW5xdWFsaWZpZWQgcHJvdmlkZXIgYXV0aGVudGljYXRpb24gcG9saWN5CiAgICAgKiBhcmd1bWVudHMKICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaWN0OiBXaGV0aGVyIHRvIHJldHVybiBmYWxzZSB3aGVuIGJhZCBkYXRhIGlzCiAgICAgKiBlbmNvdW50ZXJlZAogICAgICoKICAgICAqIEByZXR1cm4gbnVsbCBUaGUgZGF0YSBpcyBwYXJzZWQgaW50byB0aGUgaW50ZXJuYWwgZmllbGRzIG9mCiAgICAgKiB0aGlzIG9iamVjdC4KICAgICovCiAgICBmdW5jdGlvbiBwYXJzZUV4dGVuc2lvbkFyZ3MoJGFyZ3MsICRzdHJpY3Q9ZmFsc2UpCiAgICB7CiAgICAgICAgJHBvbGljaWVzX3N0ciA9IEF1dGhfT3BlbklEOjphcnJheUdldCgkYXJncywgJ2F1dGhfcG9saWNpZXMnKTsKICAgICAgICBpZiAoJHBvbGljaWVzX3N0ciAmJiAkcG9saWNpZXNfc3RyICE9ICJub25lIikgewogICAgICAgICAgICAkdGhpcy0+YXV0aF9wb2xpY2llcyA9IGV4cGxvZGUoIiAiLCAkcG9saWNpZXNfc3RyKTsKICAgICAgICB9CgogICAgICAgICRuaXN0X2xldmVsX3N0ciA9IEF1dGhfT3BlbklEOjphcnJheUdldCgkYXJncywgJ25pc3RfYXV0aF9sZXZlbCcpOwogICAgICAgIGlmICgkbmlzdF9sZXZlbF9zdHIgIT09IG51bGwpIHsKICAgICAgICAgICAgJG5pc3RfbGV2ZWwgPSBBdXRoX09wZW5JRDo6aW50dmFsKCRuaXN0X2xldmVsX3N0cik7CgogICAgICAgICAgICBpZiAoJG5pc3RfbGV2ZWwgPT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICBpZiAoJHN0cmljdCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJG5pc3RfbGV2ZWwgPSBudWxsOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoMCA8PSAkbmlzdF9sZXZlbCAmJiAkbmlzdF9sZXZlbCA8IDUpIHsKICAgICAgICAgICAgICAgICR0aGlzLT5uaXN0X2F1dGhfbGV2ZWwgPSAkbmlzdF9sZXZlbDsKICAgICAgICAgICAgfSBlbHNlIGlmICgkc3RyaWN0KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICRhdXRoX3RpbWUgPSBBdXRoX09wZW5JRDo6YXJyYXlHZXQoJGFyZ3MsICdhdXRoX3RpbWUnKTsKICAgICAgICBpZiAoJGF1dGhfdGltZSAhPT0gbnVsbCkgewogICAgICAgICAgICBpZiAocHJlZ19tYXRjaChQQVBFX1RJTUVfVkFMSURBVE9SLCAkYXV0aF90aW1lKSkgewogICAgICAgICAgICAgICAgJHRoaXMtPmF1dGhfdGltZSA9ICRhdXRoX3RpbWU7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoJHN0cmljdCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGdldEV4dGVuc2lvbkFyZ3MoKQogICAgewogICAgICAgICRuc19hcmdzID0gYXJyYXkoKTsKICAgICAgICBpZiAoY291bnQoJHRoaXMtPmF1dGhfcG9saWNpZXMpID4gMCkgewogICAgICAgICAgICAkbnNfYXJnc1snYXV0aF9wb2xpY2llcyddID0gaW1wbG9kZSgnICcsICR0aGlzLT5hdXRoX3BvbGljaWVzKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkbnNfYXJnc1snYXV0aF9wb2xpY2llcyddID0gJ25vbmUnOwogICAgICAgIH0KCiAgICAgICAgaWYgKCR0aGlzLT5uaXN0X2F1dGhfbGV2ZWwgIT09IG51bGwpIHsKICAgICAgICAgICAgaWYgKCFpbl9hcnJheSgkdGhpcy0+bmlzdF9hdXRoX2xldmVsLCByYW5nZSgwLCA0KSwgdHJ1ZSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkbnNfYXJnc1snbmlzdF9hdXRoX2xldmVsJ10gPSBzdHJ2YWwoJHRoaXMtPm5pc3RfYXV0aF9sZXZlbCk7CiAgICAgICAgfQoKICAgICAgICBpZiAoJHRoaXMtPmF1dGhfdGltZSAhPT0gbnVsbCkgewogICAgICAgICAgICBpZiAoIXByZWdfbWF0Y2goUEFQRV9USU1FX1ZBTElEQVRPUiwgJHRoaXMtPmF1dGhfdGltZSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJG5zX2FyZ3NbJ2F1dGhfdGltZSddID0gJHRoaXMtPmF1dGhfdGltZTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkbnNfYXJnczsKICAgIH0KfQoK]]></data>
	</file>
	<file>
	  <filename>/openid-php-openid-782224d/Auth/OpenID/Parse.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBUaGlzIG1vZHVsZSBpbXBsZW1lbnRzIGEgVkVSWSBsaW1pdGVkIHBhcnNlciB0aGF0IGZpbmRzIDxsaW5rPiB0YWdzCiAqIGluIHRoZSBoZWFkIG9mIEhUTUwgb3IgWEhUTUwgZG9jdW1lbnRzIGFuZCBwYXJzZXMgb3V0IHRoZWlyCiAqIGF0dHJpYnV0ZXMgYWNjb3JkaW5nIHRvIHRoZSBPcGVuSUQgc3BlYy4gSXQgaXMgYSBsaWJlcmFsIHBhcnNlciwKICogYnV0IGl0IHJlcXVpcmVzIHRoZXNlIHRoaW5ncyBmcm9tIHRoZSBkYXRhIGluIG9yZGVyIHRvIHdvcms6CiAqCiAqIC0gVGhlcmUgbXVzdCBiZSBhbiBvcGVuIDxodG1sPiB0YWcKICoKICogLSBUaGVyZSBtdXN0IGJlIGFuIG9wZW4gPGhlYWQ+IHRhZyBpbnNpZGUgb2YgdGhlIDxodG1sPiB0YWcKICoKICogLSBPbmx5IDxsaW5rPnMgdGhhdCBhcmUgZm91bmQgaW5zaWRlIG9mIHRoZSA8aGVhZD4gdGFnIGFyZSBwYXJzZWQKICogICAodGhpcyBpcyBieSBkZXNpZ24pCiAqCiAqIC0gVGhlIHBhcnNlciBmb2xsb3dzIHRoZSBPcGVuSUQgc3BlY2lmaWNhdGlvbiBpbiByZXNvbHZpbmcgdGhlCiAqICAgYXR0cmlidXRlcyBvZiB0aGUgbGluayB0YWdzLiBUaGlzIG1lYW5zIHRoYXQgdGhlIGF0dHJpYnV0ZXMgRE8KICogICBOT1QgZ2V0IHJlc29sdmVkIGFzIHRoZXkgd291bGQgYnkgYW4gWE1MIG9yIEhUTUwgcGFyc2VyLiBJbgogKiAgIHBhcnRpY3VsYXIsIG9ubHkgY2VydGFpbiBlbnRpdGllcyBnZXQgcmVwbGFjZWQsIGFuZCBocmVmCiAqICAgYXR0cmlidXRlcyBkbyBub3QgZ2V0IHJlc29sdmVkIHJlbGF0aXZlIHRvIGEgYmFzZSBVUkwuCiAqCiAqIEZyb20gaHR0cDovL29wZW5pZC5uZXQvc3BlY3MuYm1sOgogKgogKiAtIFRoZSBvcGVuaWQuc2VydmVyIFVSTCBNVVNUIGJlIGFuIGFic29sdXRlIFVSTC4gT3BlbklEIGNvbnN1bWVycwogKiAgIE1VU1QgTk9UIGF0dGVtcHQgdG8gcmVzb2x2ZSByZWxhdGl2ZSBVUkxzLgogKgogKiAtIFRoZSBvcGVuaWQuc2VydmVyIFVSTCBNVVNUIE5PVCBpbmNsdWRlIGVudGl0aWVzIG90aGVyIHRoYW4gJmFtcDssCiAqICAgJmx0OywgJmd0OywgYW5kICZxdW90Oy4KICoKICogVGhlIHBhcnNlciBpZ25vcmVzIFNHTUwgY29tbWVudHMgYW5kIDwhW0NEQVRBW2Jsb2Nrc11dPi4gQm90aCBraW5kcwogKiBvZiBxdW90aW5nIGFyZSBhbGxvd2VkIGZvciBhdHRyaWJ1dGVzLgogKgogKiBUaGUgcGFyc2VyIGRlYWxzIHdpdGggaW52YWxpZCBtYXJrdXAgaW4gdGhlc2Ugd2F5czoKICoKICogLSBUYWcgbmFtZXMgYXJlIG5vdCBjYXNlLXNlbnNpdGl2ZQogKgogKiAtIFRoZSA8aHRtbD4gdGFnIGlzIGFjY2VwdGVkIGV2ZW4gd2hlbiBpdCBpcyBub3QgYXQgdGhlIHRvcCBsZXZlbAogKgogKiAtIFRoZSA8aGVhZD4gdGFnIGlzIGFjY2VwdGVkIGV2ZW4gd2hlbiBpdCBpcyBub3QgYSBkaXJlY3QgY2hpbGQgb2YKICogICB0aGUgPGh0bWw+IHRhZywgYnV0IGEgPGh0bWw+IHRhZyBtdXN0IGJlIGFuIGFuY2VzdG9yIG9mIHRoZQogKiAgIDxoZWFkPiB0YWcKICoKICogLSA8bGluaz4gdGFncyBhcmUgYWNjZXB0ZWQgZXZlbiB3aGVuIHRoZXkgYXJlIG5vdCBkaXJlY3QgY2hpbGRyZW4KICogICBvZiB0aGUgPGhlYWQ+IHRhZywgYnV0IGEgPGhlYWQ+IHRhZyBtdXN0IGJlIGFuIGFuY2VzdG9yIG9mIHRoZQogKiAgIDxsaW5rPiB0YWcKICoKICogLSBJZiB0aGVyZSBpcyBubyBjbG9zaW5nIHRhZyBmb3IgYW4gb3BlbiA8aHRtbD4gb3IgPGhlYWQ+IHRhZywgdGhlCiAqICAgcmVtYWluZGVyIG9mIHRoZSBkb2N1bWVudCBpcyB2aWV3ZWQgYXMgYmVpbmcgaW5zaWRlIG9mIHRoZQogKiAgIHRhZy4gSWYgdGhlcmUgaXMgbm8gY2xvc2luZyB0YWcgZm9yIGEgPGxpbms+IHRhZywgdGhlIGxpbmsgdGFnIGlzCiAqICAgdHJlYXRlZCBhcyBhIHNob3J0IHRhZy4gRXhjZXB0aW9ucyB0byB0aGlzIHJ1bGUgYXJlIHRoYXQgPGh0bWw+CiAqICAgY2xvc2VzIDxodG1sPiBhbmQgPGJvZHk+IG9yIDxoZWFkPiBjbG9zZXMgPGhlYWQ+CiAqCiAqIC0gQXR0cmlidXRlcyBvZiB0aGUgPGxpbms+IHRhZyBhcmUgbm90IHJlcXVpcmVkIHRvIGJlIHF1b3RlZC4KICoKICogLSBJbiB0aGUgY2FzZSBvZiBkdXBsaWNhdGVkIGF0dHJpYnV0ZSBuYW1lcywgdGhlIGF0dHJpYnV0ZSBjb21pbmcKICogICBsYXN0IGluIHRoZSB0YWcgd2lsbCBiZSB0aGUgdmFsdWUgcmV0dXJuZWQuCiAqCiAqIC0gQW55IHRleHQgdGhhdCBkb2VzIG5vdCBwYXJzZSBhcyBhbiBhdHRyaWJ1dGUgd2l0aGluIGEgbGluayB0YWcKICogICB3aWxsIGJlIGlnbm9yZWQuIChlLmcuIDxsaW5rIHB1bXBraW4gcmVsPSdvcGVuaWQuc2VydmVyJyAvPiB3aWxsCiAqICAgaWdub3JlIHB1bXBraW4pCiAqCiAqIC0gSWYgdGhlcmUgYXJlIG1vcmUgdGhhbiBvbmUgPGh0bWw+IG9yIDxoZWFkPiB0YWcsIHRoZSBwYXJzZXIgb25seQogKiAgIGxvb2tzIGluc2lkZSBvZiB0aGUgZmlyc3Qgb25lLgogKgogKiAtIFRoZSBjb250ZW50cyBvZiA8c2NyaXB0PiB0YWdzIGFyZSBpZ25vcmVkIGVudGlyZWx5LCBleGNlcHQKICogICB1bmNsb3NlZCA8c2NyaXB0PiB0YWdzLiBVbmNsb3NlZCA8c2NyaXB0PiB0YWdzIGFyZSBpZ25vcmVkLgogKgogKiAtIEFueSBvdGhlciBpbnZhbGlkIG1hcmt1cCBpcyBpZ25vcmVkLCBpbmNsdWRpbmcgdW5jbG9zZWQgU0dNTAogKiAgIGNvbW1lbnRzIGFuZCB1bmNsb3NlZCA8IVtDREFUQVtibG9ja3MuCiAqCiAqIFBIUCB2ZXJzaW9ucyA0IGFuZCA1CiAqCiAqIExJQ0VOU0U6IFNlZSB0aGUgQ09QWUlORyBmaWxlIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uLgogKgogKiBAYWNjZXNzIHByaXZhdGUKICogQHBhY2thZ2UgT3BlbklECiAqIEBhdXRob3IgSmFuUmFpbiwgSW5jLiA8b3BlbmlkQGphbnJhaW4uY29tPgogKiBAY29weXJpZ2h0IDIwMDUtMjAwOCBKYW5yYWluLCBJbmMuCiAqIEBsaWNlbnNlIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCBBcGFjaGUKICovCgovKioKICogUmVxdWlyZSBBdXRoX09wZW5JRDo6YXJyYXlHZXQoKS4KICovCnJlcXVpcmVfb25jZSAiQXV0aC9PcGVuSUQucGhwIjsKCmNsYXNzIEF1dGhfT3BlbklEX1BhcnNlIHsKCiAgICAvKioKICAgICAqIFNwZWNpZnkgc29tZSBmbGFncyBmb3IgdXNlIHdpdGggcmVnZXggbWF0Y2hpbmcuCiAgICAgKi8KICAgIHZhciAkX3JlX2ZsYWdzID0gInNpIjsKCiAgICAvKioKICAgICAqIFN0dWZmIHRvIHJlbW92ZSBiZWZvcmUgd2Ugc3RhcnQgbG9va2luZyBmb3IgdGFncwogICAgICovCiAgICB2YXIgJF9yZW1vdmVkX3JlID0KICAgICAgICAgICAiPCEtLS4qPy0tPnw8IVxbQ0RBVEFcWy4qP1xdXF0+fDxzY3JpcHRcYig/ITopW14+XSo+Lio/PFwvc2NyaXB0PiI7CgogICAgLyoqCiAgICAgKiBTdGFydHMgd2l0aCB0aGUgdGFnIG5hbWUgYXQgYSB3b3JkIGJvdW5kYXJ5LCB3aGVyZSB0aGUgdGFnIG5hbWUKICAgICAqIGlzIG5vdCBhIG5hbWVzcGFjZQogICAgICovCiAgICB2YXIgJF90YWdfZXhwciA9ICI8JXNcYig/ITopKFtePl0qPykoPzpcLz58PiguKikoPzo8XC8/JXNccyo+fFxaKSkiOwoKICAgIHZhciAkX2F0dHJfZmluZCA9ICdcYihcdyspPSgiW14iXSoifFwnW15cJ10qXCd8W15cJyJcc1wvPD5dKyknOwoKICAgIHZhciAkX29wZW5fdGFnX2V4cHIgPSAiPCVzXGIiOwogICAgdmFyICRfY2xvc2VfdGFnX2V4cHIgPSAiPCgoXC8lc1xiKXwoJXNbXj5cL10qXC8pKT4iOwoKICAgIGZ1bmN0aW9uIEF1dGhfT3BlbklEX1BhcnNlKCkKICAgIHsKICAgICAgICAkdGhpcy0+X2xpbmtfZmluZCA9IHNwcmludGYoIi88bGlua1xiKD8hOikoW14+XSopKD8hPCk+LyVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPl9yZV9mbGFncyk7CgogICAgICAgICR0aGlzLT5fZW50aXR5X3JlcGxhY2VtZW50cyA9IGFycmF5KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhbXAnID0+ICcmJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbHQnID0+ICc8JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZ3QnID0+ICc+JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncXVvdCcgPT4gJyInCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgJHRoaXMtPl9hdHRyX2ZpbmQgPSBzcHJpbnRmKCIvJXMvJXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+X2F0dHJfZmluZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPl9yZV9mbGFncyk7CgogICAgICAgICR0aGlzLT5fcmVtb3ZlZF9yZSA9IHNwcmludGYoIi8lcy8lcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+X3JlbW92ZWRfcmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+X3JlX2ZsYWdzKTsKCiAgICAgICAgJHRoaXMtPl9lbnRfcmVwbGFjZSA9CiAgICAgICAgICAgIHNwcmludGYoIiYoJXMpOyIsIGltcGxvZGUoInwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5fZW50aXR5X3JlcGxhY2VtZW50cykpOwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyBhIHJlZ3VsYXIgZXhwcmVzc2lvbiB0aGF0IHdpbGwgbWF0Y2ggYSBnaXZlbiB0YWcgaW4gYW4KICAgICAqIFNHTUwgc3RyaW5nLgogICAgICovCiAgICBmdW5jdGlvbiB0YWdNYXRjaGVyKCR0YWdfbmFtZSwgJGNsb3NlX3RhZ3MgPSBudWxsKQogICAgewogICAgICAgICRleHByID0gJHRoaXMtPl90YWdfZXhwcjsKCiAgICAgICAgaWYgKCRjbG9zZV90YWdzKSB7CiAgICAgICAgICAgICRvcHRpb25zID0gaW1wbG9kZSgifCIsIGFycmF5X21lcmdlKGFycmF5KCR0YWdfbmFtZSksICRjbG9zZV90YWdzKSk7CiAgICAgICAgICAgICRjbG9zZXIgPSBzcHJpbnRmKCIoPzolcykiLCAkb3B0aW9ucyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJGNsb3NlciA9ICR0YWdfbmFtZTsKICAgICAgICB9CgogICAgICAgICRleHByID0gc3ByaW50ZigkZXhwciwgJHRhZ19uYW1lLCAkY2xvc2VyKTsKICAgICAgICByZXR1cm4gc3ByaW50ZigiLyVzLyVzIiwgJGV4cHIsICR0aGlzLT5fcmVfZmxhZ3MpOwogICAgfQoKICAgIGZ1bmN0aW9uIG9wZW5UYWcoJHRhZ19uYW1lKQogICAgewogICAgICAgICRleHByID0gc3ByaW50ZigkdGhpcy0+X29wZW5fdGFnX2V4cHIsICR0YWdfbmFtZSk7CiAgICAgICAgcmV0dXJuIHNwcmludGYoIi8lcy8lcyIsICRleHByLCAkdGhpcy0+X3JlX2ZsYWdzKTsKICAgIH0KCiAgICBmdW5jdGlvbiBjbG9zZVRhZygkdGFnX25hbWUpCiAgICB7CiAgICAgICAgJGV4cHIgPSBzcHJpbnRmKCR0aGlzLT5fY2xvc2VfdGFnX2V4cHIsICR0YWdfbmFtZSwgJHRhZ19uYW1lKTsKICAgICAgICByZXR1cm4gc3ByaW50ZigiLyVzLyVzIiwgJGV4cHIsICR0aGlzLT5fcmVfZmxhZ3MpOwogICAgfQoKICAgIGZ1bmN0aW9uIGh0bWxCZWdpbigkcykKICAgIHsKICAgICAgICAkbWF0Y2hlcyA9IGFycmF5KCk7CiAgICAgICAgJHJlc3VsdCA9IHByZWdfbWF0Y2goJHRoaXMtPm9wZW5UYWcoJ2h0bWwnKSwgJHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJG1hdGNoZXMsIFBSRUdfT0ZGU0VUX0NBUFRVUkUpOwogICAgICAgIGlmICgkcmVzdWx0ID09PSBmYWxzZSB8fCAhJG1hdGNoZXMpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICAvLyBSZXR1cm4gdGhlIG9mZnNldCBvZiB0aGUgZmlyc3QgbWF0Y2guCiAgICAgICAgcmV0dXJuICRtYXRjaGVzWzBdWzFdOwogICAgfQoKICAgIGZ1bmN0aW9uIGh0bWxFbmQoJHMpCiAgICB7CiAgICAgICAgJG1hdGNoZXMgPSBhcnJheSgpOwogICAgICAgICRyZXN1bHQgPSBwcmVnX21hdGNoKCR0aGlzLT5jbG9zZVRhZygnaHRtbCcpLCAkcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbWF0Y2hlcywgUFJFR19PRkZTRVRfQ0FQVFVSRSk7CiAgICAgICAgaWYgKCRyZXN1bHQgPT09IGZhbHNlIHx8ICEkbWF0Y2hlcykgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIC8vIFJldHVybiB0aGUgb2Zmc2V0IG9mIHRoZSBmaXJzdCBtYXRjaC4KICAgICAgICByZXR1cm4gJG1hdGNoZXNbY291bnQoJG1hdGNoZXMpIC0gMV1bMV07CiAgICB9CgogICAgZnVuY3Rpb24gaGVhZEZpbmQoKQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+dGFnTWF0Y2hlcignaGVhZCcsIGFycmF5KCdib2R5JywgJ2h0bWwnKSk7CiAgICB9CgogICAgZnVuY3Rpb24gcmVwbGFjZUVudGl0aWVzKCRzdHIpCiAgICB7CiAgICAgICAgZm9yZWFjaCAoJHRoaXMtPl9lbnRpdHlfcmVwbGFjZW1lbnRzIGFzICRvbGQgPT4gJG5ldykgewogICAgICAgICAgICAkc3RyID0gcHJlZ19yZXBsYWNlKHNwcmludGYoIi8mJXM7LyIsICRvbGQpLCAkbmV3LCAkc3RyKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICRzdHI7CiAgICB9CgogICAgZnVuY3Rpb24gcmVtb3ZlUXVvdGVzKCRzdHIpCiAgICB7CiAgICAgICAgJG1hdGNoZXMgPSBhcnJheSgpOwogICAgICAgICRkb3VibGUgPSAnL14iKC4qKSIkLyc7CiAgICAgICAgJHNpbmdsZSA9ICIvXlwnKC4qKVwnJC8iOwoKICAgICAgICBpZiAocHJlZ19tYXRjaCgkZG91YmxlLCAkc3RyLCAkbWF0Y2hlcykpIHsKICAgICAgICAgICAgcmV0dXJuICRtYXRjaGVzWzFdOwogICAgICAgIH0gZWxzZSBpZiAocHJlZ19tYXRjaCgkc2luZ2xlLCAkc3RyLCAkbWF0Y2hlcykpIHsKICAgICAgICAgICAgcmV0dXJuICRtYXRjaGVzWzFdOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiAkc3RyOwogICAgICAgIH0KICAgIH0KICAgIAogICAgZnVuY3Rpb24gbWF0Y2goJHJlZ2V4cCwgJHRleHQsICYkbWF0Y2gpCiAgICB7CiAgICAgICAgaWYgKCFpc19jYWxsYWJsZSgnbWJfZXJlZ19zZWFyY2hfaW5pdCcpKSB7CiAgICAgICAgICAgIHJldHVybiBwcmVnX21hdGNoKCRyZWdleHAsICR0ZXh0LCAkbWF0Y2gpOwogICAgICAgIH0KCiAgICAgICAgJHJlZ2V4cCA9IHN1YnN0cigkcmVnZXhwLCAxLCBzdHJsZW4oJHJlZ2V4cCkgLSAyIC0gc3RybGVuKCR0aGlzLT5fcmVfZmxhZ3MpKTsKICAgICAgICBtYl9lcmVnX3NlYXJjaF9pbml0KCR0ZXh0KTsKICAgICAgICBpZiAoIW1iX2VyZWdfc2VhcmNoKCRyZWdleHApKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgbGlzdCgkbWF0Y2gpID0gbWJfZXJlZ19zZWFyY2hfZ2V0cmVncygpOwogICAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIC8qKgogICAgICogRmluZCBhbGwgbGluayB0YWdzIGluIGEgc3RyaW5nIHJlcHJlc2VudGluZyBhIEhUTUwgZG9jdW1lbnQgYW5kCiAgICAgKiByZXR1cm4gYSBsaXN0IG9mIHRoZWlyIGF0dHJpYnV0ZXMuCiAgICAgKgogICAgICogQHRvZG8gVGhpcyBpcyBxdWl0ZSBpbmVmZmVjdGl2ZSBhbmQgbWF5IGZhaWwgd2l0aCB0aGUgZGVmYXVsdAogICAgICogICAgICAgcGNyZS5iYWNrdHJhY2tfbGltaXQgb2YgMTAwMDAwIGluIFBIUCA1LjIsIGlmICRodG1sIGlzIGJpZy4KICAgICAqICAgICAgIEl0IHNob3VsZCByYXRoZXIgdXNlIHN0cmlwb3MgKGluIFBIUDUpIG9yIHN0cnBvcygpK3N0cnRvdXBwZXIoKQogICAgICogICAgICAgaW4gUEhQNCB0byBtYW5hZ2UgdGhpcy4KICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICRodG1sIFRoZSB0ZXh0IHRvIHBhcnNlCiAgICAgKiBAcmV0dXJuIGFycmF5ICRsaXN0IEFuIGFycmF5IG9mIGFycmF5cyBvZiBhdHRyaWJ1dGVzLCBvbmUgZm9yIGVhY2gKICAgICAqIGxpbmsgdGFnCiAgICAgKi8KICAgIGZ1bmN0aW9uIHBhcnNlTGlua0F0dHJzKCRodG1sKQogICAgewogICAgICAgICRzdHJpcHBlZCA9IHByZWdfcmVwbGFjZSgkdGhpcy0+X3JlbW92ZWRfcmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaHRtbCk7CgogICAgICAgICRodG1sX2JlZ2luID0gJHRoaXMtPmh0bWxCZWdpbigkc3RyaXBwZWQpOwogICAgICAgICRodG1sX2VuZCA9ICR0aGlzLT5odG1sRW5kKCRzdHJpcHBlZCk7CgogICAgICAgIGlmICgkaHRtbF9iZWdpbiA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgcmV0dXJuIGFycmF5KCk7CiAgICAgICAgfQoKICAgICAgICBpZiAoJGh0bWxfZW5kID09PSBmYWxzZSkgewogICAgICAgICAgICAkaHRtbF9lbmQgPSBzdHJsZW4oJHN0cmlwcGVkKTsKICAgICAgICB9CgogICAgICAgICRzdHJpcHBlZCA9IHN1YnN0cigkc3RyaXBwZWQsICRodG1sX2JlZ2luLAogICAgICAgICAgICAgICAgICAgICAgICAgICAkaHRtbF9lbmQgLSAkaHRtbF9iZWdpbik7CgogICAgICAgIC8vIFdvcmthcm91bmQgdG8gcHJldmVudCBQUkVHX0JBQ0tUUkFDS19MSU1JVF9FUlJPUjoKICAgICAgICAkb2xkX2J0bGltaXQgPSBpbmlfc2V0KCAncGNyZS5iYWNrdHJhY2tfbGltaXQnLCAtMSApOwoKICAgICAgICAvLyBUcnkgdG8gZmluZCB0aGUgPEhFQUQ+IHRhZy4KICAgICAgICAkaGVhZF9yZSA9ICR0aGlzLT5oZWFkRmluZCgpOwogICAgICAgICRoZWFkX21hdGNoID0gJyc7CiAgICAgICAgaWYgKCEkdGhpcy0+bWF0Y2goJGhlYWRfcmUsICRzdHJpcHBlZCwgJGhlYWRfbWF0Y2gpKSB7CiAgICAgICAgICAgICAgICAgICAgIGluaV9zZXQoICdwY3JlLmJhY2t0cmFja19saW1pdCcsICRvbGRfYnRsaW1pdCApOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXkoKTsKICAgICAgICB9CgogICAgICAgICRsaW5rX2RhdGEgPSBhcnJheSgpOwogICAgICAgICRsaW5rX21hdGNoZXMgPSBhcnJheSgpOwoKICAgICAgICBpZiAoIXByZWdfbWF0Y2hfYWxsKCR0aGlzLT5fbGlua19maW5kLCAkaGVhZF9tYXRjaCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRsaW5rX21hdGNoZXMpKSB7CiAgICAgICAgICAgIGluaV9zZXQoICdwY3JlLmJhY2t0cmFja19saW1pdCcsICRvbGRfYnRsaW1pdCApOwogICAgICAgICAgICByZXR1cm4gYXJyYXkoKTsKICAgICAgICB9CgogICAgICAgIGZvcmVhY2ggKCRsaW5rX21hdGNoZXNbMF0gYXMgJGxpbmspIHsKICAgICAgICAgICAgJGF0dHJfbWF0Y2hlcyA9IGFycmF5KCk7CiAgICAgICAgICAgIHByZWdfbWF0Y2hfYWxsKCR0aGlzLT5fYXR0cl9maW5kLCAkbGluaywgJGF0dHJfbWF0Y2hlcyk7CiAgICAgICAgICAgICRsaW5rX2F0dHJzID0gYXJyYXkoKTsKICAgICAgICAgICAgZm9yZWFjaCAoJGF0dHJfbWF0Y2hlc1swXSBhcyAkaW5kZXggPT4gJGZ1bGxfbWF0Y2gpIHsKICAgICAgICAgICAgICAgICRuYW1lID0gJGF0dHJfbWF0Y2hlc1sxXVskaW5kZXhdOwogICAgICAgICAgICAgICAgJHZhbHVlID0gJHRoaXMtPnJlcGxhY2VFbnRpdGllcygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnJlbW92ZVF1b3RlcygkYXR0cl9tYXRjaGVzWzJdWyRpbmRleF0pKTsKCiAgICAgICAgICAgICAgICAkbGlua19hdHRyc1tzdHJ0b2xvd2VyKCRuYW1lKV0gPSAkdmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJGxpbmtfZGF0YVtdID0gJGxpbmtfYXR0cnM7CiAgICAgICAgfQoKICAgICAgICBpbmlfc2V0KCAncGNyZS5iYWNrdHJhY2tfbGltaXQnLCAkb2xkX2J0bGltaXQgKTsKICAgICAgICByZXR1cm4gJGxpbmtfZGF0YTsKICAgIH0KCiAgICBmdW5jdGlvbiByZWxNYXRjaGVzKCRyZWxfYXR0ciwgJHRhcmdldF9yZWwpCiAgICB7CiAgICAgICAgLy8gRG9lcyB0aGlzIHRhcmdldF9yZWwgYXBwZWFyIGluIHRoZSByZWxfc3RyPwogICAgICAgIC8vIFhYWDogVEVTVE1FCiAgICAgICAgJHJlbHMgPSBwcmVnX3NwbGl0KCIvXHMrLyIsIHRyaW0oJHJlbF9hdHRyKSk7CiAgICAgICAgZm9yZWFjaCAoJHJlbHMgYXMgJHJlbCkgewogICAgICAgICAgICAkcmVsID0gc3RydG9sb3dlcigkcmVsKTsKICAgICAgICAgICAgaWYgKCRyZWwgPT0gJHRhcmdldF9yZWwpIHsKICAgICAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gMDsKICAgIH0KCiAgICBmdW5jdGlvbiBsaW5rSGFzUmVsKCRsaW5rX2F0dHJzLCAkdGFyZ2V0X3JlbCkKICAgIHsKICAgICAgICAvLyBEb2VzIHRoaXMgbGluayBoYXZlIHRhcmdldF9yZWwgYXMgYSByZWxhdGlvbnNoaXA/CiAgICAgICAgLy8gWFhYOiBURVNUTUUKICAgICAgICAkcmVsX2F0dHIgPSBBdXRoX09wZW5pRDo6YXJyYXlHZXQoJGxpbmtfYXR0cnMsICdyZWwnLCBudWxsKTsKICAgICAgICByZXR1cm4gKCRyZWxfYXR0ciAmJiAkdGhpcy0+cmVsTWF0Y2hlcygkcmVsX2F0dHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRhcmdldF9yZWwpKTsKICAgIH0KCiAgICBmdW5jdGlvbiBmaW5kTGlua3NSZWwoJGxpbmtfYXR0cnNfbGlzdCwgJHRhcmdldF9yZWwpCiAgICB7CiAgICAgICAgLy8gRmlsdGVyIHRoZSBsaXN0IG9mIGxpbmsgYXR0cmlidXRlcyBvbiB3aGV0aGVyIGl0IGhhcwogICAgICAgIC8vIHRhcmdldF9yZWwgYXMgYSByZWxhdGlvbnNoaXAuCiAgICAgICAgLy8gWFhYOiBURVNUTUUKICAgICAgICAkcmVzdWx0ID0gYXJyYXkoKTsKICAgICAgICBmb3JlYWNoICgkbGlua19hdHRyc19saXN0IGFzICRhdHRyKSB7CiAgICAgICAgICAgIGlmICgkdGhpcy0+bGlua0hhc1JlbCgkYXR0ciwgJHRhcmdldF9yZWwpKSB7CiAgICAgICAgICAgICAgICAkcmVzdWx0W10gPSAkYXR0cjsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRyZXN1bHQ7CiAgICB9CgogICAgZnVuY3Rpb24gZmluZEZpcnN0SHJlZigkbGlua19hdHRyc19saXN0LCAkdGFyZ2V0X3JlbCkKICAgIHsKICAgICAgICAvLyBSZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBocmVmIGF0dHJpYnV0ZSBmb3IgdGhlIGZpcnN0IGxpbmsKICAgICAgICAvLyB0YWcgaW4gdGhlIGxpc3QgdGhhdCBoYXMgdGFyZ2V0X3JlbCBhcyBhIHJlbGF0aW9uc2hpcC4KICAgICAgICAvLyBYWFg6IFRFU1RNRQogICAgICAgICRtYXRjaGVzID0gJHRoaXMtPmZpbmRMaW5rc1JlbCgkbGlua19hdHRyc19saXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGFyZ2V0X3JlbCk7CiAgICAgICAgaWYgKCEkbWF0Y2hlcykgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgJGZpcnN0ID0gJG1hdGNoZXNbMF07CiAgICAgICAgcmV0dXJuIEF1dGhfT3BlbklEOjphcnJheUdldCgkZmlyc3QsICdocmVmJywgbnVsbCk7CiAgICB9Cn0KCmZ1bmN0aW9uIEF1dGhfT3BlbklEX2xlZ2FjeV9kaXNjb3ZlcigkaHRtbF90ZXh0LCAkc2VydmVyX3JlbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRkZWxlZ2F0ZV9yZWwpCnsKICAgICRwID0gbmV3IEF1dGhfT3BlbklEX1BhcnNlKCk7CgogICAgJGxpbmtfYXR0cnMgPSAkcC0+cGFyc2VMaW5rQXR0cnMoJGh0bWxfdGV4dCk7CgogICAgJHNlcnZlcl91cmwgPSAkcC0+ZmluZEZpcnN0SHJlZigkbGlua19hdHRycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNlcnZlcl9yZWwpOwoKICAgIGlmICgkc2VydmVyX3VybCA9PT0gbnVsbCkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0gZWxzZSB7CiAgICAgICAgJGRlbGVnYXRlX3VybCA9ICRwLT5maW5kRmlyc3RIcmVmKCRsaW5rX2F0dHJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZGVsZWdhdGVfcmVsKTsKICAgICAgICByZXR1cm4gYXJyYXkoJGRlbGVnYXRlX3VybCwgJHNlcnZlcl91cmwpOwogICAgfQp9Cgo=]]></data>
	</file>
	<file>
	  <filename>/openid-php-openid-782224d/Auth/OpenID/PostgreSQLStore.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBBIFBvc3RncmVTUUwgc3RvcmUuCiAqCiAqIEBwYWNrYWdlIE9wZW5JRAogKi8KCi8qKgogKiBSZXF1aXJlIHRoZSBiYXNlIGNsYXNzIGZpbGUuCiAqLwpyZXF1aXJlX29uY2UgIkF1dGgvT3BlbklEL1NRTFN0b3JlLnBocCI7CgovKioKICogQW4gU1FMIHN0b3JlIHRoYXQgdXNlcyBQb3N0Z3JlU1FMIGFzIGl0cyBiYWNrZW5kLgogKgogKiBAcGFja2FnZSBPcGVuSUQKICovCmNsYXNzIEF1dGhfT3BlbklEX1Bvc3RncmVTUUxTdG9yZSBleHRlbmRzIEF1dGhfT3BlbklEX1NRTFN0b3JlIHsKICAgIC8qKgogICAgICogQGFjY2VzcyBwcml2YXRlCiAgICAgKi8KICAgIGZ1bmN0aW9uIHNldFNRTCgpCiAgICB7CiAgICAgICAgJHRoaXMtPnNxbFsnbm9uY2VfdGFibGUnXSA9CiAgICAgICAgICAgICJDUkVBVEUgVEFCTEUgJXMgKHNlcnZlcl91cmwgVkFSQ0hBUigyMDQ3KSBOT1QgTlVMTCwgIi4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGltZXN0YW1wIElOVEVHRVIgTk9UIE5VTEwsICIuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNhbHQgQ0hBUig0MCkgTk9UIE5VTEwsICIuCiAgICAgICAgICAgICAgICAiVU5JUVVFIChzZXJ2ZXJfdXJsLCB0aW1lc3RhbXAsIHNhbHQpKSI7CgogICAgICAgICR0aGlzLT5zcWxbJ2Fzc29jX3RhYmxlJ10gPQogICAgICAgICAgICAiQ1JFQVRFIFRBQkxFICVzIChzZXJ2ZXJfdXJsIFZBUkNIQVIoMjA0NykgTk9UIE5VTEwsICIuIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJoYW5kbGUgVkFSQ0hBUigyNTUpIE5PVCBOVUxMLCAiLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZWNyZXQgQllURUEgTk9UIE5VTEwsICIuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImlzc3VlZCBJTlRFR0VSIE5PVCBOVUxMLCAiLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsaWZldGltZSBJTlRFR0VSIE5PVCBOVUxMLCAiLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhc3NvY190eXBlIFZBUkNIQVIoNjQpIE5PVCBOVUxMLCAiLgogICAgICAgICAgICAiUFJJTUFSWSBLRVkgKHNlcnZlcl91cmwsIGhhbmRsZSksICIuCiAgICAgICAgICAgICJDT05TVFJBSU5UIHNlY3JldF9sZW5ndGhfY29uc3RyYWludCBDSEVDSyAiLgogICAgICAgICAgICAiKExFTkdUSChzZWNyZXQpIDw9IDEyOCkpIjsKCiAgICAgICAgJHRoaXMtPnNxbFsnc2V0X2Fzc29jJ10gPQogICAgICAgICAgICBhcnJheSgKICAgICAgICAgICAgICAgICAgJ2luc2VydF9hc3NvYycgPT4gIklOU0VSVCBJTlRPICVzIChzZXJ2ZXJfdXJsLCBoYW5kbGUsICIuCiAgICAgICAgICAgICAgICAgICJzZWNyZXQsIGlzc3VlZCwgbGlmZXRpbWUsIGFzc29jX3R5cGUpIFZBTFVFUyAiLgogICAgICAgICAgICAgICAgICAiKD8sID8sICchJywgPywgPywgPykiLAogICAgICAgICAgICAgICAgICAndXBkYXRlX2Fzc29jJyA9PiAiVVBEQVRFICVzIFNFVCBzZWNyZXQgPSAnIScsIGlzc3VlZCA9ID8sICIuCiAgICAgICAgICAgICAgICAgICJsaWZldGltZSA9ID8sIGFzc29jX3R5cGUgPSA/IFdIRVJFIHNlcnZlcl91cmwgPSA/IEFORCAiLgogICAgICAgICAgICAgICAgICAiaGFuZGxlID0gPyIKICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgJHRoaXMtPnNxbFsnZ2V0X2Fzc29jcyddID0KICAgICAgICAgICAgIlNFTEVDVCBoYW5kbGUsIHNlY3JldCwgaXNzdWVkLCBsaWZldGltZSwgYXNzb2NfdHlwZSBGUk9NICVzICIuCiAgICAgICAgICAgICJXSEVSRSBzZXJ2ZXJfdXJsID0gPyI7CgogICAgICAgICR0aGlzLT5zcWxbJ2dldF9hc3NvYyddID0KICAgICAgICAgICAgIlNFTEVDVCBoYW5kbGUsIHNlY3JldCwgaXNzdWVkLCBsaWZldGltZSwgYXNzb2NfdHlwZSBGUk9NICVzICIuCiAgICAgICAgICAgICJXSEVSRSBzZXJ2ZXJfdXJsID0gPyBBTkQgaGFuZGxlID0gPyI7CgogICAgICAgICR0aGlzLT5zcWxbJ3JlbW92ZV9hc3NvYyddID0KICAgICAgICAgICAgIkRFTEVURSBGUk9NICVzIFdIRVJFIHNlcnZlcl91cmwgPSA/IEFORCBoYW5kbGUgPSA/IjsKCiAgICAgICAgJHRoaXMtPnNxbFsnYWRkX25vbmNlJ10gPQogICAgICAgICAgICAgICAgICAiSU5TRVJUIElOVE8gJXMgKHNlcnZlcl91cmwsIHRpbWVzdGFtcCwgc2FsdCkgVkFMVUVTICIuCiAgICAgICAgICAgICAgICAgICIoPywgPywgPykiCiAgICAgICAgICAgICAgICAgIDsKCiAgICAgICAgJHRoaXMtPnNxbFsnY2xlYW5fbm9uY2UnXSA9CiAgICAgICAgICAgICJERUxFVEUgRlJPTSAlcyBXSEVSRSB0aW1lc3RhbXAgPCA/IjsKCiAgICAgICAgJHRoaXMtPnNxbFsnY2xlYW5fYXNzb2MnXSA9CiAgICAgICAgICAgICJERUxFVEUgRlJPTSAlcyBXSEVSRSBpc3N1ZWQgKyBsaWZldGltZSA8ID8iOwogICAgfQoKICAgIC8qKgogICAgICogQGFjY2VzcyBwcml2YXRlCiAgICAgKi8KICAgIGZ1bmN0aW9uIF9zZXRfYXNzb2MoJHNlcnZlcl91cmwsICRoYW5kbGUsICRzZWNyZXQsICRpc3N1ZWQsICRsaWZldGltZSwKICAgICAgICAgICAgICAgICAgICAgICAgJGFzc29jX3R5cGUpCiAgICB7CiAgICAgICAgJHJlc3VsdCA9ICR0aGlzLT5fZ2V0X2Fzc29jKCRzZXJ2ZXJfdXJsLCAkaGFuZGxlKTsKICAgICAgICBpZiAoJHJlc3VsdCkgewogICAgICAgICAgICAvLyBVcGRhdGUgdGhlIHRhYmxlIHNpbmNlIHRoaXMgYXNzb2NpYXRpb25zIGFscmVhZHkgZXhpc3RzLgogICAgICAgICAgICAkdGhpcy0+Y29ubmVjdGlvbi0+cXVlcnkoJHRoaXMtPnNxbFsnc2V0X2Fzc29jJ11bJ3VwZGF0ZV9hc3NvYyddLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXkoJHNlY3JldCwgJGlzc3VlZCwgJGxpZmV0aW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGFzc29jX3R5cGUsICRzZXJ2ZXJfdXJsLCAkaGFuZGxlKSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy8gSW5zZXJ0IGEgbmV3IHJlY29yZCBiZWNhdXNlIHRoaXMgYXNzb2NpYXRpb24gd2Fzbid0CiAgICAgICAgICAgIC8vIGZvdW5kLgogICAgICAgICAgICAkdGhpcy0+Y29ubmVjdGlvbi0+cXVlcnkoJHRoaXMtPnNxbFsnc2V0X2Fzc29jJ11bJ2luc2VydF9hc3NvYyddLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXkoJHNlcnZlcl91cmwsICRoYW5kbGUsICRzZWNyZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaXNzdWVkLCAkbGlmZXRpbWUsICRhc3NvY190eXBlKSk7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQGFjY2VzcyBwcml2YXRlCiAgICAgKi8KICAgIGZ1bmN0aW9uIGJsb2JFbmNvZGUoJGJsb2IpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5fb2N0aWZ5KCRibG9iKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBhY2Nlc3MgcHJpdmF0ZQogICAgICovCiAgICBmdW5jdGlvbiBibG9iRGVjb2RlKCRibG9iKQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+X3Vub2N0aWZ5KCRibG9iKTsKICAgIH0KfQoK]]></data>
	</file>
	<file>
	  <filename>/openid-php-openid-782224d/Auth/OpenID/Server.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBPcGVuSUQgc2VydmVyIHByb3RvY29sIGFuZCBsb2dpYy4KICogCiAqIE92ZXJ2aWV3CiAqCiAqIEFuIE9wZW5JRCBzZXJ2ZXIgbXVzdCBwZXJmb3JtIHRocmVlIHRhc2tzOgogKgogKiAgMS4gRXhhbWluZSB0aGUgaW5jb21pbmcgcmVxdWVzdCB0byBkZXRlcm1pbmUgaXRzIG5hdHVyZSBhbmQgdmFsaWRpdHkuCiAqICAyLiBNYWtlIGEgZGVjaXNpb24gYWJvdXQgaG93IHRvIHJlc3BvbmQgdG8gdGhpcyByZXF1ZXN0LgogKiAgMy4gRm9ybWF0IHRoZSByZXNwb25zZSBhY2NvcmRpbmcgdG8gdGhlIHByb3RvY29sLgogKiAKICogVGhlIGZpcnN0IGFuZCBsYXN0IG9mIHRoZXNlIHRhc2tzIG1heSBwZXJmb3JtZWQgYnkgdGhlIHtAbGluawogKiBBdXRoX09wZW5JRF9TZXJ2ZXI6OmRlY29kZVJlcXVlc3QoKX0gYW5kIHtAbGluawogKiBBdXRoX09wZW5JRF9TZXJ2ZXI6OmVuY29kZVJlc3BvbnNlfSBtZXRob2RzLiAgV2hvIGdldHMgdG8gZG8gdGhlCiAqIGludGVybWVkaWF0ZSB0YXNrIC0tIGRlY2lkaW5nIGhvdyB0byByZXNwb25kIHRvIHRoZSByZXF1ZXN0IC0tIHdpbGwKICogZGVwZW5kIG9uIHdoYXQgdHlwZSBvZiByZXF1ZXN0IGl0IGlzLgogKgogKiBJZiBpdCdzIGEgcmVxdWVzdCB0byBhdXRoZW50aWNhdGUgYSB1c2VyIChhICdjaGVja2lkX3NldHVwJyBvcgogKiAnY2hlY2tpZF9pbW1lZGlhdGUnIHJlcXVlc3QpLCB5b3UgbmVlZCB0byBkZWNpZGUgaWYgeW91IHdpbGwgYXNzZXJ0CiAqIHRoYXQgdGhpcyB1c2VyIG1heSBjbGFpbSB0aGUgaWRlbnRpdHkgaW4gcXVlc3Rpb24uICBFeGFjdGx5IGhvdyB5b3UKICogZG8gdGhhdCBpcyBhIG1hdHRlciBvZiBhcHBsaWNhdGlvbiBwb2xpY3ksIGJ1dCBpdCBnZW5lcmFsbHkKICogaW52b2x2ZXMgbWFraW5nIHN1cmUgdGhlIHVzZXIgaGFzIGFuIGFjY291bnQgd2l0aCB5b3VyIHN5c3RlbSBhbmQKICogaXMgbG9nZ2VkIGluLCBjaGVja2luZyB0byBzZWUgaWYgdGhhdCBpZGVudGl0eSBpcyBoZXJzIHRvIGNsYWltLAogKiBhbmQgdmVyaWZ5aW5nIHdpdGggdGhlIHVzZXIgdGhhdCBzaGUgZG9lcyBjb25zZW50IHRvIHJlbGVhc2luZyB0aGF0CiAqIGluZm9ybWF0aW9uIHRvIHRoZSBwYXJ0eSBtYWtpbmcgdGhlIHJlcXVlc3QuCiAqCiAqIEV4YW1pbmUgdGhlIHByb3BlcnRpZXMgb2YgdGhlIHtAbGluayBBdXRoX09wZW5JRF9DaGVja0lEUmVxdWVzdH0KICogb2JqZWN0LCBhbmQgaWYgYW5kIHdoZW4geW91J3ZlIGNvbWUgdG8gYSBkZWNpc2lvbiwgZm9ybSBhIHJlc3BvbnNlCiAqIGJ5IGNhbGxpbmcge0BsaW5rIEF1dGhfT3BlbklEX0NoZWNrSURSZXF1ZXN0OjphbnN3ZXIoKX0uCiAqCiAqIE90aGVyIHR5cGVzIG9mIHJlcXVlc3RzIHJlbGF0ZSB0byBlc3RhYmxpc2hpbmcgYXNzb2NpYXRpb25zIGJldHdlZW4KICogY2xpZW50IGFuZCBzZXJ2ZXIgYW5kIHZlcmlmaW5nIHRoZSBhdXRoZW50aWNpdHkgb2YgcHJldmlvdXMKICogY29tbXVuaWNhdGlvbnMuICB7QGxpbmsgQXV0aF9PcGVuSURfU2VydmVyfSBjb250YWlucyBhbGwgdGhlIGxvZ2ljCiAqIGFuZCBkYXRhIG5lY2Vzc2FyeSB0byByZXNwb25kIHRvIHN1Y2ggcmVxdWVzdHM7IGp1c3QgcGFzcyBpdCB0bwogKiB7QGxpbmsgQXV0aF9PcGVuSURfU2VydmVyOjpoYW5kbGVSZXF1ZXN0KCl9LgogKgogKiBPcGVuSUQgRXh0ZW5zaW9ucwogKiAKICogRG8geW91IHdhbnQgdG8gcHJvdmlkZSBvdGhlciBpbmZvcm1hdGlvbiBmb3IgeW91ciB1c2VycyBpbiBhZGRpdGlvbgogKiB0byBhdXRoZW50aWNhdGlvbj8gIFZlcnNpb24gMS4yIG9mIHRoZSBPcGVuSUQgcHJvdG9jb2wgYWxsb3dzCiAqIGNvbnN1bWVycyB0byBhZGQgZXh0ZW5zaW9ucyB0byB0aGVpciByZXF1ZXN0cy4gIEZvciBleGFtcGxlLCB3aXRoCiAqIHNpdGVzIHVzaW5nIHRoZSBTaW1wbGUgUmVnaXN0cmF0aW9uCiAqIEV4dGVuc2lvbgogKiAoaHR0cDovL29wZW5pZC5uZXQvc3BlY3Mvb3BlbmlkLXNpbXBsZS1yZWdpc3RyYXRpb24tZXh0ZW5zaW9uLTFfMC5odG1sKSwKICogYSB1c2VyIGNhbiBhZ3JlZSB0byBoYXZlIHRoZWlyIG5pY2tuYW1lIGFuZCBlLW1haWwgYWRkcmVzcyBzZW50IHRvCiAqIGEgc2l0ZSB3aGVuIHRoZXkgc2lnbiB1cC4KICoKICogU2luY2UgZXh0ZW5zaW9ucyBkbyBub3QgY2hhbmdlIHRoZSB3YXkgT3BlbklEIGF1dGhlbnRpY2F0aW9uIHdvcmtzLAogKiBjb2RlIHRvIGhhbmRsZSBleHRlbnNpb24gcmVxdWVzdHMgbWF5IGJlIGNvbXBsZXRlbHkgc2VwYXJhdGUgZnJvbQogKiB0aGUge0BsaW5rIEF1dGhfT3BlbklEX1JlcXVlc3R9IGNsYXNzIGhlcmUuICBCdXQgeW91J2xsIGxpa2VseSB3YW50CiAqIGRhdGEgc2VudCBiYWNrIGJ5IHlvdXIgZXh0ZW5zaW9uIHRvIGJlIHNpZ25lZC4gIHtAbGluawogKiBBdXRoX09wZW5JRF9TZXJ2ZXJSZXNwb25zZX0gcHJvdmlkZXMgbWV0aG9kcyB3aXRoIHdoaWNoIHlvdSBjYW4gYWRkCiAqIGRhdGEgdG8gaXQgd2hpY2ggY2FuIGJlIHNpZ25lZCB3aXRoIHRoZSBvdGhlciBkYXRhIGluIHRoZSBPcGVuSUQKICogc2lnbmF0dXJlLgogKgogKiBGb3IgZXhhbXBsZToKICoKICogPHByZT4gIC8vIHdoZW4gcmVxdWVzdCBpcyBhIGNoZWNraWRfKiByZXF1ZXN0CiAqICAkcmVzcG9uc2UgPSAkcmVxdWVzdC0+YW5zd2VyKHRydWUpOwogKiAgLy8gdGhpcyB3aWxsIGEgc2lnbmVkICdvcGVuaWQuc3JlZy50aW1lem9uZScgcGFyYW1ldGVyIHRvIHRoZSByZXNwb25zZQogKiAgcmVzcG9uc2UuYWRkRmllbGQoJ3NyZWcnLCAndGltZXpvbmUnLCAnQW1lcmljYS9Mb3NfQW5nZWxlcycpPC9wcmU+CiAqCiAqIFN0b3JlcwogKgogKiBUaGUgT3BlbklEIHNlcnZlciBuZWVkcyB0byBtYWludGFpbiBzdGF0ZSBiZXR3ZWVuIHJlcXVlc3RzIGluIG9yZGVyCiAqIHRvIGZ1bmN0aW9uLiAgSXRzIG1lY2hhbmlzbSBmb3IgZG9pbmcgdGhpcyBpcyBjYWxsZWQgYSBzdG9yZS4gIFRoZQogKiBzdG9yZSBpbnRlcmZhY2UgaXMgZGVmaW5lZCBpbiBJbnRlcmZhY2UucGhwLiAgQWRkaXRpb25hbGx5LCBzZXZlcmFsCiAqIGNvbmNyZXRlIHN0b3JlIGltcGxlbWVudGF0aW9ucyBhcmUgcHJvdmlkZWQsIHNvIHRoYXQgbW9zdCBzaXRlcwogKiB3b24ndCBuZWVkIHRvIGltcGxlbWVudCBhIGN1c3RvbSBzdG9yZS4gIEZvciBhIHN0b3JlIGJhY2tlZCBieSBmbGF0CiAqIGZpbGVzIG9uIGRpc2ssIHNlZSB7QGxpbmsgQXV0aF9PcGVuSURfRmlsZVN0b3JlfS4gIEZvciBzdG9yZXMgYmFzZWQKICogb24gTXlTUUwsIFNRTGl0ZSwgb3IgUG9zdGdyZVNRTCwgc2VlIHRoZSB7QGxpbmsKICogQXV0aF9PcGVuSURfU1FMU3RvcmV9IHN1YmNsYXNzZXMuCiAqCiAqIFVwZ3JhZGluZwogKgogKiBUaGUga2V5cyBieSB3aGljaCBhIHNlcnZlciBsb29rcyB1cCBhc3NvY2lhdGlvbnMgaW4gaXRzIHN0b3JlIGhhdmUKICogY2hhbmdlZCBpbiB2ZXJzaW9uIDEuMiBvZiB0aGlzIGxpYnJhcnkuICBJZiB5b3VyIHN0b3JlIGhhcyBlbnRyaWVzCiAqIGNyZWF0ZWQgZnJvbSB2ZXJzaW9uIDEuMCBjb2RlLCB5b3Ugc2hvdWxkIGVtcHR5IGl0LgogKgogKiBQSFAgdmVyc2lvbnMgNCBhbmQgNQogKgogKiBMSUNFTlNFOiBTZWUgdGhlIENPUFlJTkcgZmlsZSBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbi4KICoKICogQHBhY2thZ2UgT3BlbklECiAqIEBhdXRob3IgSmFuUmFpbiwgSW5jLiA8b3BlbmlkQGphbnJhaW4uY29tPgogKiBAY29weXJpZ2h0IDIwMDUtMjAwOCBKYW5yYWluLCBJbmMuCiAqIEBsaWNlbnNlIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCBBcGFjaGUKICovCgovKioKICogUmVxdWlyZWQgaW1wb3J0cwogKi8KcmVxdWlyZV9vbmNlICJBdXRoL09wZW5JRC5waHAiOwpyZXF1aXJlX29uY2UgIkF1dGgvT3BlbklEL0Fzc29jaWF0aW9uLnBocCI7CnJlcXVpcmVfb25jZSAiQXV0aC9PcGVuSUQvQ3J5cHRVdGlsLnBocCI7CnJlcXVpcmVfb25jZSAiQXV0aC9PcGVuSUQvQmlnTWF0aC5waHAiOwpyZXF1aXJlX29uY2UgIkF1dGgvT3BlbklEL0RpZmZpZUhlbGxtYW4ucGhwIjsKcmVxdWlyZV9vbmNlICJBdXRoL09wZW5JRC9LVkZvcm0ucGhwIjsKcmVxdWlyZV9vbmNlICJBdXRoL09wZW5JRC9UcnVzdFJvb3QucGhwIjsKcmVxdWlyZV9vbmNlICJBdXRoL09wZW5JRC9TZXJ2ZXJSZXF1ZXN0LnBocCI7CnJlcXVpcmVfb25jZSAiQXV0aC9PcGVuSUQvTWVzc2FnZS5waHAiOwpyZXF1aXJlX29uY2UgIkF1dGgvT3BlbklEL05vbmNlLnBocCI7CgpkZWZpbmUoJ0FVVEhfT1BFTklEX0hUVFBfT0snLCAyMDApOwpkZWZpbmUoJ0FVVEhfT1BFTklEX0hUVFBfUkVESVJFQ1QnLCAzMDIpOwpkZWZpbmUoJ0FVVEhfT1BFTklEX0hUVFBfRVJST1InLCA0MDApOwoKLyoqCiAqIEBhY2Nlc3MgcHJpdmF0ZQogKi8KZ2xvYmFsICRfQXV0aF9PcGVuSURfUmVxdWVzdF9Nb2RlczsKJF9BdXRoX09wZW5JRF9SZXF1ZXN0X01vZGVzID0gYXJyYXkoJ2NoZWNraWRfc2V0dXAnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY2hlY2tpZF9pbW1lZGlhdGUnKTsKCi8qKgogKiBAYWNjZXNzIHByaXZhdGUKICovCmRlZmluZSgnQXV0aF9PcGVuSURfRU5DT0RFX0tWRk9STScsICdrZnZvcm0nKTsKCi8qKgogKiBAYWNjZXNzIHByaXZhdGUKICovCmRlZmluZSgnQXV0aF9PcGVuSURfRU5DT0RFX1VSTCcsICdVUkwvcmVkaXJlY3QnKTsKCi8qKgogKiBAYWNjZXNzIHByaXZhdGUKICovCmRlZmluZSgnQXV0aF9PcGVuSURfRU5DT0RFX0hUTUxfRk9STScsICdIVE1MIGZvcm0nKTsKCi8qKgogKiBAYWNjZXNzIHByaXZhdGUKICovCmZ1bmN0aW9uIEF1dGhfT3BlbklEX2lzRXJyb3IoJG9iaiwgJGNscyA9ICdBdXRoX09wZW5JRF9TZXJ2ZXJFcnJvcicpCnsKICAgIHJldHVybiBpc19hKCRvYmosICRjbHMpOwp9CgovKioKICogQW4gZXJyb3IgY2xhc3Mgd2hpY2ggZ2V0cyBpbnN0YW50aWF0ZWQgYW5kIHJldHVybmVkIHdoZW5ldmVyIGFuCiAqIE9wZW5JRCBwcm90b2NvbCBlcnJvciBvY2N1cnMuICBCZSBwcmVwYXJlZCB0byB1c2UgdGhpcyBpbiBwbGFjZSBvZgogKiBhbiBvcmRpbmFyeSBzZXJ2ZXIgcmVzcG9uc2UuCiAqCiAqIEBwYWNrYWdlIE9wZW5JRAogKi8KY2xhc3MgQXV0aF9PcGVuSURfU2VydmVyRXJyb3IgewogICAgLyoqCiAgICAgKiBAYWNjZXNzIHByaXZhdGUKICAgICAqLwogICAgZnVuY3Rpb24gQXV0aF9PcGVuSURfU2VydmVyRXJyb3IoJG1lc3NhZ2UgPSBudWxsLCAkdGV4dCA9IG51bGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcmVmZXJlbmNlID0gbnVsbCwgJGNvbnRhY3QgPSBudWxsKQogICAgewogICAgICAgICR0aGlzLT5tZXNzYWdlID0gJG1lc3NhZ2U7CiAgICAgICAgJHRoaXMtPnRleHQgPSAkdGV4dDsKICAgICAgICAkdGhpcy0+Y29udGFjdCA9ICRjb250YWN0OwogICAgICAgICR0aGlzLT5yZWZlcmVuY2UgPSAkcmVmZXJlbmNlOwogICAgfQoKICAgIGZ1bmN0aW9uIGdldFJldHVyblRvKCkKICAgIHsKICAgICAgICBpZiAoJHRoaXMtPm1lc3NhZ2UgJiYKICAgICAgICAgICAgJHRoaXMtPm1lc3NhZ2UtPmhhc0tleShBdXRoX09wZW5JRF9PUEVOSURfTlMsICdyZXR1cm5fdG8nKSkgewogICAgICAgICAgICByZXR1cm4gJHRoaXMtPm1lc3NhZ2UtPmdldEFyZyhBdXRoX09wZW5JRF9PUEVOSURfTlMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyZXR1cm5fdG8nKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSByZXR1cm5fdG8gVVJMIGZvciB0aGUgcmVxdWVzdCB3aGljaCBjYXVzZWQgdGhpcwogICAgICogZXJyb3IuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGhhc1JldHVyblRvKCkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmdldFJldHVyblRvKCkgIT09IG51bGw7CiAgICB9CgogICAgLyoqCiAgICAgKiBFbmNvZGVzIHRoaXMgZXJyb3IncyByZXNwb25zZSBhcyBhIFVSTCBzdWl0YWJsZSBmb3IKICAgICAqIHJlZGlyZWN0aW9uLiAgSWYgdGhlIHJlc3BvbnNlIGhhcyBubyByZXR1cm5fdG8sIGFub3RoZXIKICAgICAqIEF1dGhfT3BlbklEX1NlcnZlckVycm9yIGlzIHJldHVybmVkLgogICAgICovCiAgICBmdW5jdGlvbiBlbmNvZGVUb1VSTCgpCiAgICB7CiAgICAgICAgaWYgKCEkdGhpcy0+bWVzc2FnZSkgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CgogICAgICAgICRtc2cgPSAkdGhpcy0+dG9NZXNzYWdlKCk7CiAgICAgICAgcmV0dXJuICRtc2ctPnRvVVJMKCR0aGlzLT5nZXRSZXR1cm5UbygpKTsKICAgIH0KCiAgICAvKioKICAgICAqIEVuY29kZXMgdGhlIHJlc3BvbnNlIHRvIGtleS12YWx1ZSBmb3JtLiAgVGhpcyBpcyBhCiAgICAgKiBtYWNoaW5lLXJlYWRhYmxlIGZvcm1hdCB1c2VkIHRvIHJlc3BvbmQgdG8gbWVzc2FnZXMgd2hpY2ggY2FtZQogICAgICogZGlyZWN0bHkgZnJvbSB0aGUgY29uc3VtZXIgYW5kIG5vdCB0aHJvdWdoIHRoZSB1c2VyLWFnZW50LiAgU2VlCiAgICAgKiB0aGUgT3BlbklEIHNwZWNpZmljYXRpb24uCiAgICAgKi8KICAgIGZ1bmN0aW9uIGVuY29kZVRvS1ZGb3JtKCkKICAgIHsKICAgICAgICByZXR1cm4gQXV0aF9PcGVuSURfS1ZGb3JtOjpmcm9tQXJyYXkoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXkoJ21vZGUnID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Vycm9yJyA9PiAkdGhpcy0+dG9TdHJpbmcoKSkpOwogICAgfQoKICAgIGZ1bmN0aW9uIHRvRm9ybU1hcmt1cCgkZm9ybV90YWdfYXR0cnM9bnVsbCkKICAgIHsKICAgICAgICAkbXNnID0gJHRoaXMtPnRvTWVzc2FnZSgpOwogICAgICAgIHJldHVybiAkbXNnLT50b0Zvcm1NYXJrdXAoJHRoaXMtPmdldFJldHVyblRvKCksICRmb3JtX3RhZ19hdHRycyk7CiAgICB9CgogICAgZnVuY3Rpb24gdG9IVE1MKCRmb3JtX3RhZ19hdHRycz1udWxsKQogICAgewogICAgICAgIHJldHVybiBBdXRoX09wZW5JRDo6YXV0b1N1Ym1pdEhUTUwoCiAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+dG9Gb3JtTWFya3VwKCRmb3JtX3RhZ19hdHRycykpOwogICAgfQoKICAgIGZ1bmN0aW9uIHRvTWVzc2FnZSgpCiAgICB7CiAgICAgICAgLy8gR2VuZXJhdGUgYSBNZXNzYWdlIG9iamVjdCBmb3Igc2VuZGluZyB0byB0aGUgcmVseWluZyBwYXJ0eSwKICAgICAgICAvLyBhZnRlciBlbmNvZGluZy4KICAgICAgICAkbmFtZXNwYWNlID0gJHRoaXMtPm1lc3NhZ2UtPmdldE9wZW5JRE5hbWVzcGFjZSgpOwogICAgICAgICRyZXBseSA9IG5ldyBBdXRoX09wZW5JRF9NZXNzYWdlKCRuYW1lc3BhY2UpOwogICAgICAgICRyZXBseS0+c2V0QXJnKEF1dGhfT3BlbklEX09QRU5JRF9OUywgJ21vZGUnLCAnZXJyb3InKTsKICAgICAgICAkcmVwbHktPnNldEFyZyhBdXRoX09wZW5JRF9PUEVOSURfTlMsICdlcnJvcicsICR0aGlzLT50b1N0cmluZygpKTsKCiAgICAgICAgaWYgKCR0aGlzLT5jb250YWN0ICE9PSBudWxsKSB7CiAgICAgICAgICAgICRyZXBseS0+c2V0QXJnKEF1dGhfT3BlbklEX09QRU5JRF9OUywgJ2NvbnRhY3QnLCAkdGhpcy0+Y29udGFjdCk7CiAgICAgICAgfQoKICAgICAgICBpZiAoJHRoaXMtPnJlZmVyZW5jZSAhPT0gbnVsbCkgewogICAgICAgICAgICAkcmVwbHktPnNldEFyZyhBdXRoX09wZW5JRF9PUEVOSURfTlMsICdyZWZlcmVuY2UnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+cmVmZXJlbmNlKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkcmVwbHk7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIG9uZSBvZiBBdXRoX09wZW5JRF9FTkNPREVfVVJMLAogICAgICogQXV0aF9PcGVuSURfRU5DT0RFX0tWRk9STSwgb3IgbnVsbCwgZGVwZW5kaW5nIG9uIHRoZSB0eXBlIG9mCiAgICAgKiBlbmNvZGluZyBleHBlY3RlZCBmb3IgdGhpcyBlcnJvcidzIHBheWxvYWQuCiAgICAgKi8KICAgIGZ1bmN0aW9uIHdoaWNoRW5jb2RpbmcoKQogICAgewogICAgICAgIGdsb2JhbCAkX0F1dGhfT3BlbklEX1JlcXVlc3RfTW9kZXM7CgogICAgICAgIGlmICgkdGhpcy0+aGFzUmV0dXJuVG8oKSkgewogICAgICAgICAgICBpZiAoJHRoaXMtPm1lc3NhZ2UtPmlzT3BlbklEMigpICYmCiAgICAgICAgICAgICAgICAoc3RybGVuKCR0aGlzLT5lbmNvZGVUb1VSTCgpKSA+CiAgICAgICAgICAgICAgICAgICBBdXRoX09wZW5JRF9PUEVOSUQxX1VSTF9MSU1JVCkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBBdXRoX09wZW5JRF9FTkNPREVfSFRNTF9GT1JNOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuIEF1dGhfT3BlbklEX0VOQ09ERV9VUkw7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICghJHRoaXMtPm1lc3NhZ2UpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQoKICAgICAgICAkbW9kZSA9ICR0aGlzLT5tZXNzYWdlLT5nZXRBcmcoQXV0aF9PcGVuSURfT1BFTklEX05TLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kZScpOwoKICAgICAgICBpZiAoJG1vZGUpIHsKICAgICAgICAgICAgaWYgKCFpbl9hcnJheSgkbW9kZSwgJF9BdXRoX09wZW5JRF9SZXF1ZXN0X01vZGVzKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIEF1dGhfT3BlbklEX0VOQ09ERV9LVkZPUk07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoaXMgZXJyb3IgbWVzc2FnZS4KICAgICAqLwogICAgZnVuY3Rpb24gdG9TdHJpbmcoKQogICAgewogICAgICAgIGlmICgkdGhpcy0+dGV4dCkgewogICAgICAgICAgICByZXR1cm4gJHRoaXMtPnRleHQ7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIGdldF9jbGFzcygkdGhpcykgLiAiIGVycm9yIjsKICAgICAgICB9CiAgICB9Cn0KCi8qKgogKiBFcnJvciByZXR1cm5lZCBieSB0aGUgc2VydmVyIGNvZGUgd2hlbiBhIHJldHVybl90byBpcyBhYnNlbnQgZnJvbSBhCiAqIHJlcXVlc3QuCiAqCiAqIEBwYWNrYWdlIE9wZW5JRAogKi8KY2xhc3MgQXV0aF9PcGVuSURfTm9SZXR1cm5Ub0Vycm9yIGV4dGVuZHMgQXV0aF9PcGVuSURfU2VydmVyRXJyb3IgewogICAgZnVuY3Rpb24gQXV0aF9PcGVuSURfTm9SZXR1cm5Ub0Vycm9yKCRtZXNzYWdlID0gbnVsbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGV4dCA9ICJObyByZXR1cm5fdG8gVVJMIGF2YWlsYWJsZSIpCiAgICB7CiAgICAgICAgcGFyZW50OjpBdXRoX09wZW5JRF9TZXJ2ZXJFcnJvcigkbWVzc2FnZSwgJHRleHQpOwogICAgfQoKICAgIGZ1bmN0aW9uIHRvU3RyaW5nKCkKICAgIHsKICAgICAgICByZXR1cm4gIk5vIHJldHVybl90byBhdmFpbGFibGUiOwogICAgfQp9CgovKioKICogQW4gZXJyb3IgaW5kaWNhdGluZyB0aGF0IHRoZSByZXR1cm5fdG8gVVJMIGlzIG1hbGZvcm1lZC4KICoKICogQHBhY2thZ2UgT3BlbklECiAqLwpjbGFzcyBBdXRoX09wZW5JRF9NYWxmb3JtZWRSZXR1cm5VUkwgZXh0ZW5kcyBBdXRoX09wZW5JRF9TZXJ2ZXJFcnJvciB7CiAgICBmdW5jdGlvbiBBdXRoX09wZW5JRF9NYWxmb3JtZWRSZXR1cm5VUkwoJG1lc3NhZ2UsICRyZXR1cm5fdG8pCiAgICB7CiAgICAgICAgJHRoaXMtPnJldHVybl90byA9ICRyZXR1cm5fdG87CiAgICAgICAgcGFyZW50OjpBdXRoX09wZW5JRF9TZXJ2ZXJFcnJvcigkbWVzc2FnZSwgIm1hbGZvcm1lZCByZXR1cm5fdG8gVVJMIik7CiAgICB9Cn0KCi8qKgogKiBUaGlzIGVycm9yIGlzIHJldHVybmVkIHdoZW4gdGhlIHRydXN0X3Jvb3QgdmFsdWUgaXMgbWFsZm9ybWVkLgogKgogKiBAcGFja2FnZSBPcGVuSUQKICovCmNsYXNzIEF1dGhfT3BlbklEX01hbGZvcm1lZFRydXN0Um9vdCBleHRlbmRzIEF1dGhfT3BlbklEX1NlcnZlckVycm9yIHsKICAgIGZ1bmN0aW9uIEF1dGhfT3BlbklEX01hbGZvcm1lZFRydXN0Um9vdCgkbWVzc2FnZSA9IG51bGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRleHQgPSAiTWFsZm9ybWVkIHRydXN0IHJvb3QiKQogICAgewogICAgICAgIHBhcmVudDo6QXV0aF9PcGVuSURfU2VydmVyRXJyb3IoJG1lc3NhZ2UsICR0ZXh0KTsKICAgIH0KCiAgICBmdW5jdGlvbiB0b1N0cmluZygpCiAgICB7CiAgICAgICAgcmV0dXJuICJNYWxmb3JtZWQgdHJ1c3Qgcm9vdCI7CiAgICB9Cn0KCi8qKgogKiBUaGUgYmFzZSBjbGFzcyBmb3IgYWxsIHNlcnZlciByZXF1ZXN0IGNsYXNzZXMuCiAqCiAqIEBwYWNrYWdlIE9wZW5JRAogKi8KY2xhc3MgQXV0aF9PcGVuSURfUmVxdWVzdCB7CiAgICB2YXIgJG1vZGUgPSBudWxsOwp9CgovKioKICogQSByZXF1ZXN0IHRvIHZlcmlmeSB0aGUgdmFsaWRpdHkgb2YgYSBwcmV2aW91cyByZXNwb25zZS4KICoKICogQHBhY2thZ2UgT3BlbklECiAqLwpjbGFzcyBBdXRoX09wZW5JRF9DaGVja0F1dGhSZXF1ZXN0IGV4dGVuZHMgQXV0aF9PcGVuSURfUmVxdWVzdCB7CiAgICB2YXIgJG1vZGUgPSAiY2hlY2tfYXV0aGVudGljYXRpb24iOwogICAgdmFyICRpbnZhbGlkYXRlX2hhbmRsZSA9IG51bGw7CgogICAgZnVuY3Rpb24gQXV0aF9PcGVuSURfQ2hlY2tBdXRoUmVxdWVzdCgkYXNzb2NfaGFuZGxlLCAkc2lnbmVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaW52YWxpZGF0ZV9oYW5kbGUgPSBudWxsKQogICAgewogICAgICAgICR0aGlzLT5hc3NvY19oYW5kbGUgPSAkYXNzb2NfaGFuZGxlOwogICAgICAgICR0aGlzLT5zaWduZWQgPSAkc2lnbmVkOwogICAgICAgIGlmICgkaW52YWxpZGF0ZV9oYW5kbGUgIT09IG51bGwpIHsKICAgICAgICAgICAgJHRoaXMtPmludmFsaWRhdGVfaGFuZGxlID0gJGludmFsaWRhdGVfaGFuZGxlOwogICAgICAgIH0KICAgICAgICAkdGhpcy0+bmFtZXNwYWNlID0gQXV0aF9PcGVuSURfT1BFTklEMl9OUzsKICAgICAgICAkdGhpcy0+bWVzc2FnZSA9IG51bGw7CiAgICB9CgogICAgc3RhdGljIGZ1bmN0aW9uIGZyb21NZXNzYWdlKCRtZXNzYWdlLCAkc2VydmVyPW51bGwpCiAgICB7CiAgICAgICAgJHJlcXVpcmVkX2tleXMgPSBhcnJheSgnYXNzb2NfaGFuZGxlJywgJ3NpZycsICdzaWduZWQnKTsKCiAgICAgICAgZm9yZWFjaCAoJHJlcXVpcmVkX2tleXMgYXMgJGspIHsKICAgICAgICAgICAgaWYgKCEkbWVzc2FnZS0+Z2V0QXJnKEF1dGhfT3BlbklEX09QRU5JRF9OUywgJGspKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEF1dGhfT3BlbklEX1NlcnZlckVycm9yKCRtZXNzYWdlLAogICAgICAgICAgICAgICAgICAgIHNwcmludGYoIiVzIHJlcXVlc3QgbWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXIgJXMgZnJvbSBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeSIsICJjaGVja19hdXRoZW50aWNhdGlvbiIsICRrKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICRhc3NvY19oYW5kbGUgPSAkbWVzc2FnZS0+Z2V0QXJnKEF1dGhfT3BlbklEX09QRU5JRF9OUywgJ2Fzc29jX2hhbmRsZScpOwogICAgICAgICRzaWcgPSAkbWVzc2FnZS0+Z2V0QXJnKEF1dGhfT3BlbklEX09QRU5JRF9OUywgJ3NpZycpOwoKICAgICAgICAkc2lnbmVkX2xpc3QgPSAkbWVzc2FnZS0+Z2V0QXJnKEF1dGhfT3BlbklEX09QRU5JRF9OUywgJ3NpZ25lZCcpOwogICAgICAgICRzaWduZWRfbGlzdCA9IGV4cGxvZGUoIiwiLCAkc2lnbmVkX2xpc3QpOwoKICAgICAgICAkc2lnbmVkID0gJG1lc3NhZ2U7CiAgICAgICAgaWYgKCRzaWduZWQtPmhhc0tleShBdXRoX09wZW5JRF9PUEVOSURfTlMsICdtb2RlJykpIHsKICAgICAgICAgICAgJHNpZ25lZC0+c2V0QXJnKEF1dGhfT3BlbklEX09QRU5JRF9OUywgJ21vZGUnLCAnaWRfcmVzJyk7CiAgICAgICAgfQoKICAgICAgICAkcmVzdWx0ID0gbmV3IEF1dGhfT3BlbklEX0NoZWNrQXV0aFJlcXVlc3QoJGFzc29jX2hhbmRsZSwgJHNpZ25lZCk7CiAgICAgICAgJHJlc3VsdC0+bWVzc2FnZSA9ICRtZXNzYWdlOwogICAgICAgICRyZXN1bHQtPnNpZyA9ICRzaWc7CiAgICAgICAgJHJlc3VsdC0+aW52YWxpZGF0ZV9oYW5kbGUgPSAkbWVzc2FnZS0+Z2V0QXJnKEF1dGhfT3BlbklEX09QRU5JRF9OUywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ludmFsaWRhdGVfaGFuZGxlJyk7CiAgICAgICAgcmV0dXJuICRyZXN1bHQ7CiAgICB9CgogICAgZnVuY3Rpb24gYW5zd2VyKCRzaWduYXRvcnkpCiAgICB7CiAgICAgICAgJGlzX3ZhbGlkID0gJHNpZ25hdG9yeS0+dmVyaWZ5KCR0aGlzLT5hc3NvY19oYW5kbGUsICR0aGlzLT5zaWduZWQpOwoKICAgICAgICAvLyBOb3cgaW52YWxpZGF0ZSB0aGF0IGFzc29jX2hhbmRsZSBzbyBpdCB0aGlzIGNoZWNrQXV0aAogICAgICAgIC8vIG1lc3NhZ2UgY2Fubm90IGJlIHJlcGxheWVkLgogICAgICAgICRzaWduYXRvcnktPmludmFsaWRhdGUoJHRoaXMtPmFzc29jX2hhbmRsZSwgdHJ1ZSk7CiAgICAgICAgJHJlc3BvbnNlID0gbmV3IEF1dGhfT3BlbklEX1NlcnZlclJlc3BvbnNlKCR0aGlzKTsKCiAgICAgICAgJHJlc3BvbnNlLT5maWVsZHMtPnNldEFyZyhBdXRoX09wZW5JRF9PUEVOSURfTlMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaXNfdmFsaWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCRpc192YWxpZCA/ICJ0cnVlIiA6ICJmYWxzZSIpKTsKCiAgICAgICAgaWYgKCR0aGlzLT5pbnZhbGlkYXRlX2hhbmRsZSkgewogICAgICAgICAgICAkYXNzb2MgPSAkc2lnbmF0b3J5LT5nZXRBc3NvY2lhdGlvbigkdGhpcy0+aW52YWxpZGF0ZV9oYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKICAgICAgICAgICAgaWYgKCEkYXNzb2MpIHsKICAgICAgICAgICAgICAgICRyZXNwb25zZS0+ZmllbGRzLT5zZXRBcmcoQXV0aF9PcGVuSURfT1BFTklEX05TLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaW52YWxpZGF0ZV9oYW5kbGUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+aW52YWxpZGF0ZV9oYW5kbGUpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiAkcmVzcG9uc2U7CiAgICB9Cn0KCi8qKgogKiBBIGNsYXNzIGltcGxlbWVudGluZyBwbGFpbnRleHQgc2VydmVyIHNlc3Npb25zLgogKgogKiBAcGFja2FnZSBPcGVuSUQKICovCmNsYXNzIEF1dGhfT3BlbklEX1BsYWluVGV4dFNlcnZlclNlc3Npb24gewogICAgLyoqCiAgICAgKiBBbiBvYmplY3QgdGhhdCBrbm93cyBob3cgdG8gaGFuZGxlIGFzc29jaWF0aW9uIHJlcXVlc3RzIHdpdGggbm8KICAgICAqIHNlc3Npb24gdHlwZS4KICAgICAqLwogICAgdmFyICRzZXNzaW9uX3R5cGUgPSAnbm8tZW5jcnlwdGlvbic7CiAgICB2YXIgJG5lZWRzX21hdGggPSBmYWxzZTsKICAgIHZhciAkYWxsb3dlZF9hc3NvY190eXBlcyA9IGFycmF5KCdITUFDLVNIQTEnLCAnSE1BQy1TSEEyNTYnKTsKCiAgICBzdGF0aWMgZnVuY3Rpb24gZnJvbU1lc3NhZ2UoJHVudXNlZF9yZXF1ZXN0KQogICAgewogICAgICAgIHJldHVybiBuZXcgQXV0aF9PcGVuSURfUGxhaW5UZXh0U2VydmVyU2Vzc2lvbigpOwogICAgfQoKICAgIGZ1bmN0aW9uIGFuc3dlcigkc2VjcmV0KQogICAgewogICAgICAgIHJldHVybiBhcnJheSgnbWFjX2tleScgPT4gYmFzZTY0X2VuY29kZSgkc2VjcmV0KSk7CiAgICB9Cn0KCi8qKgogKiBBIGNsYXNzIGltcGxlbWVudGluZyBESC1TSEExIHNlcnZlciBzZXNzaW9ucy4KICoKICogQHBhY2thZ2UgT3BlbklECiAqLwpjbGFzcyBBdXRoX09wZW5JRF9EaWZmaWVIZWxsbWFuU0hBMVNlcnZlclNlc3Npb24gewogICAgLyoqCiAgICAgKiBBbiBvYmplY3QgdGhhdCBrbm93cyBob3cgdG8gaGFuZGxlIGFzc29jaWF0aW9uIHJlcXVlc3RzIHdpdGgKICAgICAqIHRoZSBEaWZmaWUtSGVsbG1hbiBzZXNzaW9uIHR5cGUuCiAgICAgKi8KCiAgICB2YXIgJHNlc3Npb25fdHlwZSA9ICdESC1TSEExJzsKICAgIHZhciAkbmVlZHNfbWF0aCA9IHRydWU7CiAgICB2YXIgJGFsbG93ZWRfYXNzb2NfdHlwZXMgPSBhcnJheSgnSE1BQy1TSEExJyk7CiAgICB2YXIgJGhhc2hfZnVuYyA9ICdBdXRoX09wZW5JRF9TSEExJzsKCiAgICBmdW5jdGlvbiBBdXRoX09wZW5JRF9EaWZmaWVIZWxsbWFuU0hBMVNlcnZlclNlc3Npb24oJGRoLCAkY29uc3VtZXJfcHVia2V5KQogICAgewogICAgICAgICR0aGlzLT5kaCA9ICRkaDsKICAgICAgICAkdGhpcy0+Y29uc3VtZXJfcHVia2V5ID0gJGNvbnN1bWVyX3B1YmtleTsKICAgIH0KCiAgICBzdGF0aWMgZnVuY3Rpb24gZ2V0REgoJG1lc3NhZ2UpCiAgICB7CiAgICAgICAgJGRoX21vZHVsdXMgPSAkbWVzc2FnZS0+Z2V0QXJnKEF1dGhfT3BlbklEX09QRU5JRF9OUywgJ2RoX21vZHVsdXMnKTsKICAgICAgICAkZGhfZ2VuID0gJG1lc3NhZ2UtPmdldEFyZyhBdXRoX09wZW5JRF9PUEVOSURfTlMsICdkaF9nZW4nKTsKCiAgICAgICAgaWYgKCgoJGRoX21vZHVsdXMgPT09IG51bGwpICYmICgkZGhfZ2VuICE9PSBudWxsKSkgfHwKICAgICAgICAgICAgKCgkZGhfZ2VuID09PSBudWxsKSAmJiAoJGRoX21vZHVsdXMgIT09IG51bGwpKSkgewoKICAgICAgICAgICAgaWYgKCRkaF9tb2R1bHVzID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICAkbWlzc2luZyA9ICdtb2R1bHVzJzsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICRtaXNzaW5nID0gJ2dlbmVyYXRvcic7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBuZXcgQXV0aF9PcGVuSURfU2VydmVyRXJyb3IoJG1lc3NhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0lmIG5vbi1kZWZhdWx0IG1vZHVsdXMgb3IgZ2VuZXJhdG9yIGlzICcuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N1cHBsaWVkLCBib3RoIG11c3QgYmUgc3VwcGxpZWQuICBNaXNzaW5nICcuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJG1pc3NpbmcpOwogICAgICAgIH0KCiAgICAgICAgJGxpYiA9IEF1dGhfT3BlbklEX2dldE1hdGhMaWIoKTsKCiAgICAgICAgaWYgKCRkaF9tb2R1bHVzIHx8ICRkaF9nZW4pIHsKICAgICAgICAgICAgJGRoX21vZHVsdXMgPSAkbGliLT5iYXNlNjRUb0xvbmcoJGRoX21vZHVsdXMpOwogICAgICAgICAgICAkZGhfZ2VuID0gJGxpYi0+YmFzZTY0VG9Mb25nKCRkaF9nZW4pOwogICAgICAgICAgICBpZiAoJGxpYi0+Y21wKCRkaF9tb2R1bHVzLCAwKSA9PSAwIHx8CiAgICAgICAgICAgICAgICAkbGliLT5jbXAoJGRoX2dlbiwgMCkgPT0gMCkgewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBdXRoX09wZW5JRF9TZXJ2ZXJFcnJvcigKICAgICAgICAgICAgICAgICAgJG1lc3NhZ2UsICJGYWlsZWQgdG8gcGFyc2UgZGhfbW9kIG9yIGRoX2dlbiIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRkaCA9IG5ldyBBdXRoX09wZW5JRF9EaWZmaWVIZWxsbWFuKCRkaF9tb2R1bHVzLCAkZGhfZ2VuKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkZGggPSBuZXcgQXV0aF9PcGVuSURfRGlmZmllSGVsbG1hbigpOwogICAgICAgIH0KCiAgICAgICAgJGNvbnN1bWVyX3B1YmtleSA9ICRtZXNzYWdlLT5nZXRBcmcoQXV0aF9PcGVuSURfT1BFTklEX05TLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkaF9jb25zdW1lcl9wdWJsaWMnKTsKICAgICAgICBpZiAoJGNvbnN1bWVyX3B1YmtleSA9PT0gbnVsbCkgewogICAgICAgICAgICByZXR1cm4gbmV3IEF1dGhfT3BlbklEX1NlcnZlckVycm9yKCRtZXNzYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1B1YmxpYyBrZXkgZm9yIERILVNIQTEgc2Vzc2lvbiAnLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25vdCBmb3VuZCBpbiBxdWVyeScpOwogICAgICAgIH0KCiAgICAgICAgJGNvbnN1bWVyX3B1YmtleSA9CiAgICAgICAgICAgICRsaWItPmJhc2U2NFRvTG9uZygkY29uc3VtZXJfcHVia2V5KTsKCiAgICAgICAgaWYgKCRjb25zdW1lcl9wdWJrZXkgPT09IGZhbHNlKSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgQXV0aF9PcGVuSURfU2VydmVyRXJyb3IoJG1lc3NhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkaF9jb25zdW1lcl9wdWJsaWMgaXMgbm90IGJhc2U2NCIpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGFycmF5KCRkaCwgJGNvbnN1bWVyX3B1YmtleSk7CiAgICB9CgogICAgc3RhdGljIGZ1bmN0aW9uIGZyb21NZXNzYWdlKCRtZXNzYWdlKQogICAgewogICAgICAgICRyZXN1bHQgPSBBdXRoX09wZW5JRF9EaWZmaWVIZWxsbWFuU0hBMVNlcnZlclNlc3Npb246OmdldERIKCRtZXNzYWdlKTsKCiAgICAgICAgaWYgKGlzX2EoJHJlc3VsdCwgJ0F1dGhfT3BlbklEX1NlcnZlckVycm9yJykpIHsKICAgICAgICAgICAgcmV0dXJuICRyZXN1bHQ7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbGlzdCgkZGgsICRjb25zdW1lcl9wdWJrZXkpID0gJHJlc3VsdDsKICAgICAgICAgICAgcmV0dXJuIG5ldyBBdXRoX09wZW5JRF9EaWZmaWVIZWxsbWFuU0hBMVNlcnZlclNlc3Npb24oJGRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGNvbnN1bWVyX3B1YmtleSk7CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGFuc3dlcigkc2VjcmV0KQogICAgewogICAgICAgICRsaWIgPSBBdXRoX09wZW5JRF9nZXRNYXRoTGliKCk7CiAgICAgICAgJG1hY19rZXkgPSAkdGhpcy0+ZGgtPnhvclNlY3JldCgkdGhpcy0+Y29uc3VtZXJfcHVia2V5LCAkc2VjcmV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmhhc2hfZnVuYyk7CiAgICAgICAgcmV0dXJuIGFycmF5KAogICAgICAgICAgICdkaF9zZXJ2ZXJfcHVibGljJyA9PgogICAgICAgICAgICAgICAgJGxpYi0+bG9uZ1RvQmFzZTY0KCR0aGlzLT5kaC0+cHVibGljKSwKICAgICAgICAgICAnZW5jX21hY19rZXknID0+IGJhc2U2NF9lbmNvZGUoJG1hY19rZXkpKTsKICAgIH0KfQoKLyoqCiAqIEEgY2xhc3MgaW1wbGVtZW50aW5nIERILVNIQTI1NiBzZXJ2ZXIgc2Vzc2lvbnMuCiAqCiAqIEBwYWNrYWdlIE9wZW5JRAogKi8KY2xhc3MgQXV0aF9PcGVuSURfRGlmZmllSGVsbG1hblNIQTI1NlNlcnZlclNlc3Npb24KICAgICAgZXh0ZW5kcyBBdXRoX09wZW5JRF9EaWZmaWVIZWxsbWFuU0hBMVNlcnZlclNlc3Npb24gewoKICAgIHZhciAkc2Vzc2lvbl90eXBlID0gJ0RILVNIQTI1Nic7CiAgICB2YXIgJGhhc2hfZnVuYyA9ICdBdXRoX09wZW5JRF9TSEEyNTYnOwogICAgdmFyICRhbGxvd2VkX2Fzc29jX3R5cGVzID0gYXJyYXkoJ0hNQUMtU0hBMjU2Jyk7CgogICAgc3RhdGljIGZ1bmN0aW9uIGZyb21NZXNzYWdlKCRtZXNzYWdlKQogICAgewogICAgICAgICRyZXN1bHQgPSBBdXRoX09wZW5JRF9EaWZmaWVIZWxsbWFuU0hBMVNlcnZlclNlc3Npb246OmdldERIKCRtZXNzYWdlKTsKCiAgICAgICAgaWYgKGlzX2EoJHJlc3VsdCwgJ0F1dGhfT3BlbklEX1NlcnZlckVycm9yJykpIHsKICAgICAgICAgICAgcmV0dXJuICRyZXN1bHQ7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbGlzdCgkZGgsICRjb25zdW1lcl9wdWJrZXkpID0gJHJlc3VsdDsKICAgICAgICAgICAgcmV0dXJuIG5ldyBBdXRoX09wZW5JRF9EaWZmaWVIZWxsbWFuU0hBMjU2U2VydmVyU2Vzc2lvbigkZGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRjb25zdW1lcl9wdWJrZXkpOwogICAgICAgIH0KICAgIH0KfQoKLyoqCiAqIEEgcmVxdWVzdCB0byBhc3NvY2lhdGUgd2l0aCB0aGUgc2VydmVyLgogKgogKiBAcGFja2FnZSBPcGVuSUQKICovCmNsYXNzIEF1dGhfT3BlbklEX0Fzc29jaWF0ZVJlcXVlc3QgZXh0ZW5kcyBBdXRoX09wZW5JRF9SZXF1ZXN0IHsKICAgIHZhciAkbW9kZSA9ICJhc3NvY2lhdGUiOwoKICAgIHN0YXRpYyBmdW5jdGlvbiBnZXRTZXNzaW9uQ2xhc3NlcygpCiAgICB7CiAgICAgICAgcmV0dXJuIGFycmF5KAogICAgICAgICAgJ25vLWVuY3J5cHRpb24nID0+ICdBdXRoX09wZW5JRF9QbGFpblRleHRTZXJ2ZXJTZXNzaW9uJywKICAgICAgICAgICdESC1TSEExJyA9PiAnQXV0aF9PcGVuSURfRGlmZmllSGVsbG1hblNIQTFTZXJ2ZXJTZXNzaW9uJywKICAgICAgICAgICdESC1TSEEyNTYnID0+ICdBdXRoX09wZW5JRF9EaWZmaWVIZWxsbWFuU0hBMjU2U2VydmVyU2Vzc2lvbicpOwogICAgfQoKICAgIGZ1bmN0aW9uIEF1dGhfT3BlbklEX0Fzc29jaWF0ZVJlcXVlc3QoJHNlc3Npb24sICRhc3NvY190eXBlKQogICAgewogICAgICAgICR0aGlzLT5zZXNzaW9uID0gJHNlc3Npb247CiAgICAgICAgJHRoaXMtPm5hbWVzcGFjZSA9IEF1dGhfT3BlbklEX09QRU5JRDJfTlM7CiAgICAgICAgJHRoaXMtPmFzc29jX3R5cGUgPSAkYXNzb2NfdHlwZTsKICAgIH0KCiAgICBzdGF0aWMgZnVuY3Rpb24gZnJvbU1lc3NhZ2UoJG1lc3NhZ2UsICRzZXJ2ZXI9bnVsbCkKICAgIHsKICAgICAgICBpZiAoJG1lc3NhZ2UtPmlzT3BlbklEMSgpKSB7CiAgICAgICAgICAgICRzZXNzaW9uX3R5cGUgPSAkbWVzc2FnZS0+Z2V0QXJnKEF1dGhfT3BlbklEX09QRU5JRF9OUywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Nlc3Npb25fdHlwZScpOwoKICAgICAgICAgICAgaWYgKCRzZXNzaW9uX3R5cGUgPT0gJ25vLWVuY3J5cHRpb24nKSB7CiAgICAgICAgICAgICAgICAvLyBvaWR1dGlsLmxvZygnUmVjZWl2ZWQgT3BlbklEIDEgcmVxdWVzdCB3aXRoIGEgbm8tZW5jcnlwdGlvbiAnCiAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAnYXNzb2NhaXRpb24gc2Vzc2lvbiB0eXBlLiBDb250aW51aW5nIGFueXdheS4nKQogICAgICAgICAgICB9IGVsc2UgaWYgKCEkc2Vzc2lvbl90eXBlKSB7CiAgICAgICAgICAgICAgICAkc2Vzc2lvbl90eXBlID0gJ25vLWVuY3J5cHRpb24nOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJHNlc3Npb25fdHlwZSA9ICRtZXNzYWdlLT5nZXRBcmcoQXV0aF9PcGVuSURfT1BFTklEX05TLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2Vzc2lvbl90eXBlJyk7CiAgICAgICAgICAgIGlmICgkc2Vzc2lvbl90eXBlID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEF1dGhfT3BlbklEX1NlcnZlckVycm9yKCRtZXNzYWdlLAogICAgICAgICAgICAgICAgICAic2Vzc2lvbl90eXBlIG1pc3NpbmcgZnJvbSByZXF1ZXN0Iik7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICRzZXNzaW9uX2NsYXNzID0gQXV0aF9PcGVuSUQ6OmFycmF5R2V0KAogICAgICAgICAgIEF1dGhfT3BlbklEX0Fzc29jaWF0ZVJlcXVlc3Q6OmdldFNlc3Npb25DbGFzc2VzKCksCiAgICAgICAgICAgJHNlc3Npb25fdHlwZSk7CgogICAgICAgIGlmICgkc2Vzc2lvbl9jbGFzcyA9PT0gbnVsbCkgewogICAgICAgICAgICByZXR1cm4gbmV3IEF1dGhfT3BlbklEX1NlcnZlckVycm9yKCRtZXNzYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVbmtub3duIHNlc3Npb24gdHlwZSAiIC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2Vzc2lvbl90eXBlKTsKICAgICAgICB9CgogICAgICAgICRzZXNzaW9uID0gY2FsbF91c2VyX2Z1bmMoYXJyYXkoJHNlc3Npb25fY2xhc3MsICdmcm9tTWVzc2FnZScpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJG1lc3NhZ2UpOwogICAgICAgIGlmIChpc19hKCRzZXNzaW9uLCAnQXV0aF9PcGVuSURfU2VydmVyRXJyb3InKSkgewogICAgICAgICAgICByZXR1cm4gJHNlc3Npb247CiAgICAgICAgfQoKICAgICAgICAkYXNzb2NfdHlwZSA9ICRtZXNzYWdlLT5nZXRBcmcoQXV0aF9PcGVuSURfT1BFTklEX05TLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYXNzb2NfdHlwZScsICdITUFDLVNIQTEnKTsKCiAgICAgICAgaWYgKCFpbl9hcnJheSgkYXNzb2NfdHlwZSwgJHNlc3Npb24tPmFsbG93ZWRfYXNzb2NfdHlwZXMpKSB7CiAgICAgICAgICAgICRmbXQgPSAiU2Vzc2lvbiB0eXBlICVzIGRvZXMgbm90IHN1cHBvcnQgYXNzb2NpYXRpb24gdHlwZSAlcyI7CiAgICAgICAgICAgIHJldHVybiBuZXcgQXV0aF9PcGVuSURfU2VydmVyRXJyb3IoJG1lc3NhZ2UsCiAgICAgICAgICAgICAgc3ByaW50ZigkZm10LCAkc2Vzc2lvbl90eXBlLCAkYXNzb2NfdHlwZSkpOwogICAgICAgIH0KCiAgICAgICAgJG9iaiA9IG5ldyBBdXRoX09wZW5JRF9Bc3NvY2lhdGVSZXF1ZXN0KCRzZXNzaW9uLCAkYXNzb2NfdHlwZSk7CiAgICAgICAgJG9iai0+bWVzc2FnZSA9ICRtZXNzYWdlOwogICAgICAgICRvYmotPm5hbWVzcGFjZSA9ICRtZXNzYWdlLT5nZXRPcGVuSUROYW1lc3BhY2UoKTsKICAgICAgICByZXR1cm4gJG9iajsKICAgIH0KCiAgICBmdW5jdGlvbiBhbnN3ZXIoJGFzc29jKQogICAgewogICAgICAgICRyZXNwb25zZSA9IG5ldyBBdXRoX09wZW5JRF9TZXJ2ZXJSZXNwb25zZSgkdGhpcyk7CiAgICAgICAgJHJlc3BvbnNlLT5maWVsZHMtPnVwZGF0ZUFyZ3MoQXV0aF9PcGVuSURfT1BFTklEX05TLAogICAgICAgICAgIGFycmF5KAogICAgICAgICAgICAgICAgICdleHBpcmVzX2luJyA9PiBzcHJpbnRmKCclZCcsICRhc3NvYy0+Z2V0RXhwaXJlc0luKCkpLAogICAgICAgICAgICAgICAgICdhc3NvY190eXBlJyA9PiAkdGhpcy0+YXNzb2NfdHlwZSwKICAgICAgICAgICAgICAgICAnYXNzb2NfaGFuZGxlJyA9PiAkYXNzb2MtPmhhbmRsZSkpOwoKICAgICAgICAkcmVzcG9uc2UtPmZpZWxkcy0+dXBkYXRlQXJncyhBdXRoX09wZW5JRF9PUEVOSURfTlMsCiAgICAgICAgICAgJHRoaXMtPnNlc3Npb24tPmFuc3dlcigkYXNzb2MtPnNlY3JldCkpOwoKICAgICAgICBpZiAoISAoJHRoaXMtPnNlc3Npb24tPnNlc3Npb25fdHlwZSA9PSAnbm8tZW5jcnlwdGlvbicgCiAgICAgICAgICAgICAgICYmICR0aGlzLT5tZXNzYWdlLT5pc09wZW5JRDEoKSkpIHsKICAgICAgICAgICAgJHJlc3BvbnNlLT5maWVsZHMtPnNldEFyZyhBdXRoX09wZW5JRF9PUEVOSURfTlMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Nlc3Npb25fdHlwZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnNlc3Npb24tPnNlc3Npb25fdHlwZSk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJHJlc3BvbnNlOwogICAgfQoKICAgIGZ1bmN0aW9uIGFuc3dlclVuc3VwcG9ydGVkKCR0ZXh0X21lc3NhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcHJlZmVycmVkX2Fzc29jaWF0aW9uX3R5cGU9bnVsbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRwcmVmZXJyZWRfc2Vzc2lvbl90eXBlPW51bGwpCiAgICB7CiAgICAgICAgaWYgKCR0aGlzLT5tZXNzYWdlLT5pc09wZW5JRDEoKSkgewogICAgICAgICAgICByZXR1cm4gbmV3IEF1dGhfT3BlbklEX1NlcnZlckVycm9yKCR0aGlzLT5tZXNzYWdlKTsKICAgICAgICB9CgogICAgICAgICRyZXNwb25zZSA9IG5ldyBBdXRoX09wZW5JRF9TZXJ2ZXJSZXNwb25zZSgkdGhpcyk7CiAgICAgICAgJHJlc3BvbnNlLT5maWVsZHMtPnNldEFyZyhBdXRoX09wZW5JRF9PUEVOSURfTlMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZXJyb3JfY29kZScsICd1bnN1cHBvcnRlZC10eXBlJyk7CiAgICAgICAgJHJlc3BvbnNlLT5maWVsZHMtPnNldEFyZyhBdXRoX09wZW5JRF9PUEVOSURfTlMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZXJyb3InLCAkdGV4dF9tZXNzYWdlKTsKCiAgICAgICAgaWYgKCRwcmVmZXJyZWRfYXNzb2NpYXRpb25fdHlwZSkgewogICAgICAgICAgICAkcmVzcG9uc2UtPmZpZWxkcy0+c2V0QXJnKEF1dGhfT3BlbklEX09QRU5JRF9OUywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYXNzb2NfdHlwZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHByZWZlcnJlZF9hc3NvY2lhdGlvbl90eXBlKTsKICAgICAgICB9CgogICAgICAgIGlmICgkcHJlZmVycmVkX3Nlc3Npb25fdHlwZSkgewogICAgICAgICAgICAkcmVzcG9uc2UtPmZpZWxkcy0+c2V0QXJnKEF1dGhfT3BlbklEX09QRU5JRF9OUywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2Vzc2lvbl90eXBlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcHJlZmVycmVkX3Nlc3Npb25fdHlwZSk7CiAgICAgICAgfQogICAgICAgICRyZXNwb25zZS0+Y29kZSA9IEFVVEhfT1BFTklEX0hUVFBfRVJST1I7CiAgICAgICAgcmV0dXJuICRyZXNwb25zZTsKICAgIH0KfQoKLyoqCiAqIEEgcmVxdWVzdCB0byBjb25maXJtIHRoZSBpZGVudGl0eSBvZiBhIHVzZXIuCiAqCiAqIEBwYWNrYWdlIE9wZW5JRAogKi8KY2xhc3MgQXV0aF9PcGVuSURfQ2hlY2tJRFJlcXVlc3QgZXh0ZW5kcyBBdXRoX09wZW5JRF9SZXF1ZXN0IHsKICAgIC8qKgogICAgICogUmV0dXJuLXRvIHZlcmlmaWNhdGlvbiBjYWxsYmFjay4gIERlZmF1bHQgaXMKICAgICAqIEF1dGhfT3BlbklEX3ZlcmlmeVJldHVyblRvIGZyb20gVHJ1c3RSb290LnBocC4KICAgICAqLwogICAgdmFyICR2ZXJpZnlSZXR1cm5UbyA9ICdBdXRoX09wZW5JRF92ZXJpZnlSZXR1cm5Ubyc7CgogICAgLyoqCiAgICAgKiBUaGUgbW9kZSBvZiB0aGlzIHJlcXVlc3QuCiAgICAgKi8KICAgIHZhciAkbW9kZSA9ICJjaGVja2lkX3NldHVwIjsgLy8gb3IgImNoZWNraWRfaW1tZWRpYXRlIgoKICAgIC8qKgogICAgICogV2hldGhlciB0aGlzIHJlcXVlc3QgaXMgZm9yIGltbWVkaWF0ZSBtb2RlLgogICAgICovCiAgICB2YXIgJGltbWVkaWF0ZSA9IGZhbHNlOwoKICAgIC8qKgogICAgICogVGhlIHRydXN0X3Jvb3QgdmFsdWUgZm9yIHRoaXMgcmVxdWVzdC4KICAgICAqLwogICAgdmFyICR0cnVzdF9yb290ID0gbnVsbDsKCiAgICAvKioKICAgICAqIFRoZSBPcGVuSUQgbmFtZXNwYWNlIGZvciB0aGlzIHJlcXVlc3QuCiAgICAgKiBkZXByZWNhdGVkIHNpbmNlIHZlcnNpb24gMi4wLjIKICAgICAqLwogICAgdmFyICRuYW1lc3BhY2U7CiAgICAKICAgIHN0YXRpYyBmdW5jdGlvbiBtYWtlKCRtZXNzYWdlLCAkaWRlbnRpdHksICRyZXR1cm5fdG8sICR0cnVzdF9yb290ID0gbnVsbCwKICAgICAgICAgICAgICAgICAgJGltbWVkaWF0ZSA9IGZhbHNlLCAkYXNzb2NfaGFuZGxlID0gbnVsbCwgJHNlcnZlciA9IG51bGwpCiAgICB7CiAgICAgICAgaWYgKCRzZXJ2ZXIgPT09IG51bGwpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBBdXRoX09wZW5JRF9TZXJ2ZXJFcnJvcigkbWVzc2FnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2VydmVyIG11c3Qgbm90IGJlIG51bGwiKTsKICAgICAgICB9CgogICAgICAgIGlmICgkcmV0dXJuX3RvICYmCiAgICAgICAgICAgICFBdXRoX09wZW5JRF9UcnVzdFJvb3Q6Ol9wYXJzZSgkcmV0dXJuX3RvKSkgewogICAgICAgICAgICByZXR1cm4gbmV3IEF1dGhfT3BlbklEX01hbGZvcm1lZFJldHVyblVSTCgkbWVzc2FnZSwgJHJldHVybl90byk7CiAgICAgICAgfQoKICAgICAgICAkciA9IG5ldyBBdXRoX09wZW5JRF9DaGVja0lEUmVxdWVzdCgkaWRlbnRpdHksICRyZXR1cm5fdG8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRydXN0X3Jvb3QsICRpbW1lZGlhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGFzc29jX2hhbmRsZSwgJHNlcnZlcik7CgogICAgICAgICRyLT5uYW1lc3BhY2UgPSAkbWVzc2FnZS0+Z2V0T3BlbklETmFtZXNwYWNlKCk7CiAgICAgICAgJHItPm1lc3NhZ2UgPSAkbWVzc2FnZTsKCiAgICAgICAgaWYgKCEkci0+dHJ1c3RSb290VmFsaWQoKSkgewogICAgICAgICAgICByZXR1cm4gbmV3IEF1dGhfT3BlbklEX1VudHJ1c3RlZFJldHVyblVSTCgkbWVzc2FnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHJldHVybl90bywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRydXN0X3Jvb3QpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiAkcjsKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gQXV0aF9PcGVuSURfQ2hlY2tJRFJlcXVlc3QoJGlkZW50aXR5LCAkcmV0dXJuX3RvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRydXN0X3Jvb3QgPSBudWxsLCAkaW1tZWRpYXRlID0gZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYXNzb2NfaGFuZGxlID0gbnVsbCwgJHNlcnZlciA9IG51bGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkY2xhaW1lZF9pZCA9IG51bGwpCiAgICB7CiAgICAgICAgJHRoaXMtPm5hbWVzcGFjZSA9IEF1dGhfT3BlbklEX09QRU5JRDJfTlM7CiAgICAgICAgJHRoaXMtPmFzc29jX2hhbmRsZSA9ICRhc3NvY19oYW5kbGU7CiAgICAgICAgJHRoaXMtPmlkZW50aXR5ID0gJGlkZW50aXR5OwogICAgICAgIGlmICgkY2xhaW1lZF9pZCA9PT0gbnVsbCkgewogICAgICAgICAgICAkdGhpcy0+Y2xhaW1lZF9pZCA9ICRpZGVudGl0eTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkdGhpcy0+Y2xhaW1lZF9pZCA9ICRjbGFpbWVkX2lkOwogICAgICAgIH0KICAgICAgICAkdGhpcy0+cmV0dXJuX3RvID0gJHJldHVybl90bzsKICAgICAgICAkdGhpcy0+dHJ1c3Rfcm9vdCA9ICR0cnVzdF9yb290OwogICAgICAgICR0aGlzLT5zZXJ2ZXIgPSAkc2VydmVyOwoKICAgICAgICBpZiAoJGltbWVkaWF0ZSkgewogICAgICAgICAgICAkdGhpcy0+aW1tZWRpYXRlID0gdHJ1ZTsKICAgICAgICAgICAgJHRoaXMtPm1vZGUgPSAiY2hlY2tpZF9pbW1lZGlhdGUiOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICR0aGlzLT5pbW1lZGlhdGUgPSBmYWxzZTsKICAgICAgICAgICAgJHRoaXMtPm1vZGUgPSAiY2hlY2tpZF9zZXR1cCI7CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGVxdWFscygkb3RoZXIpCiAgICB7CiAgICAgICAgcmV0dXJuICgKICAgICAgICAgICAgICAgIChpc19hKCRvdGhlciwgJ0F1dGhfT3BlbklEX0NoZWNrSURSZXF1ZXN0JykpICYmCiAgICAgICAgICAgICAgICAoJHRoaXMtPm5hbWVzcGFjZSA9PSAkb3RoZXItPm5hbWVzcGFjZSkgJiYKICAgICAgICAgICAgICAgICgkdGhpcy0+YXNzb2NfaGFuZGxlID09ICRvdGhlci0+YXNzb2NfaGFuZGxlKSAmJgogICAgICAgICAgICAgICAgKCR0aGlzLT5pZGVudGl0eSA9PSAkb3RoZXItPmlkZW50aXR5KSAmJgogICAgICAgICAgICAgICAgKCR0aGlzLT5jbGFpbWVkX2lkID09ICRvdGhlci0+Y2xhaW1lZF9pZCkgJiYKICAgICAgICAgICAgICAgICgkdGhpcy0+cmV0dXJuX3RvID09ICRvdGhlci0+cmV0dXJuX3RvKSAmJgogICAgICAgICAgICAgICAgKCR0aGlzLT50cnVzdF9yb290ID09ICRvdGhlci0+dHJ1c3Rfcm9vdCkpOwogICAgfQoKICAgIC8qCiAgICAgKiBEb2VzIHRoZSByZWx5aW5nIHBhcnR5IHB1Ymxpc2ggdGhlIHJldHVybl90byBVUkwgZm9yIHRoaXMKICAgICAqIHJlc3BvbnNlIHVuZGVyIHRoZSByZWFsbT8gSXQgaXMgdXAgdG8gdGhlIHByb3ZpZGVyIHRvIHNldCBhCiAgICAgKiBwb2xpY3kgZm9yIHdoYXQga2luZHMgb2YgcmVhbG1zIHNob3VsZCBiZSBhbGxvd2VkLiBUaGlzCiAgICAgKiByZXR1cm5fdG8gVVJMIHZlcmlmaWNhdGlvbiByZWR1Y2VzIHZ1bG5lcmFiaWxpdHkgdG8gZGF0YS10aGVmdAogICAgICogYXR0YWNrcyBiYXNlZCBvbiBvcGVuIHByb3hpZXMsIGNvcnNzLXNpdGUtc2NyaXB0aW5nLCBvciBvcGVuCiAgICAgKiByZWRpcmVjdG9ycy4KICAgICAqCiAgICAgKiBUaGlzIGNoZWNrIHNob3VsZCBvbmx5IGJlIHBlcmZvcm1lZCBhZnRlciBtYWtpbmcgc3VyZSB0aGF0IHRoZQogICAgICogcmV0dXJuX3RvIFVSTCBtYXRjaGVzIHRoZSByZWFsbS4KICAgICAqCiAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHJlYWxtIHB1Ymxpc2hlcyBhIGRvY3VtZW50IHdpdGggdGhlCiAgICAgKiByZXR1cm5fdG8gVVJMIGxpc3RlZCwgZmFsc2UgaWYgbm90IG9yIGlmIGRpc2NvdmVyeSBmYWlscwogICAgICovCiAgICBmdW5jdGlvbiByZXR1cm5Ub1ZlcmlmaWVkKCkKICAgIHsKICAgIAkkZmV0Y2hlciA9IEF1dGhfWWFkaXNfWWFkaXM6OmdldEhUVFBGZXRjaGVyKCk7CiAgICAgICAgcmV0dXJuIGNhbGxfdXNlcl9mdW5jX2FycmF5KCR0aGlzLT52ZXJpZnlSZXR1cm5UbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXkoJHRoaXMtPnRydXN0X3Jvb3QsICR0aGlzLT5yZXR1cm5fdG8sICRmZXRjaGVyKSk7CiAgICB9CiAgICAKICAgIHN0YXRpYyBmdW5jdGlvbiBmcm9tTWVzc2FnZSgkbWVzc2FnZSwgJHNlcnZlcikKICAgIHsKICAgICAgICAkbW9kZSA9ICRtZXNzYWdlLT5nZXRBcmcoQXV0aF9PcGVuSURfT1BFTklEX05TLCAnbW9kZScpOwogICAgICAgICRpbW1lZGlhdGUgPSBudWxsOwoKICAgICAgICBpZiAoJG1vZGUgPT0gImNoZWNraWRfaW1tZWRpYXRlIikgewogICAgICAgICAgICAkaW1tZWRpYXRlID0gdHJ1ZTsKICAgICAgICAgICAgJG1vZGUgPSAiY2hlY2tpZF9pbW1lZGlhdGUiOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRpbW1lZGlhdGUgPSBmYWxzZTsKICAgICAgICAgICAgJG1vZGUgPSAiY2hlY2tpZF9zZXR1cCI7CiAgICAgICAgfQoKICAgICAgICAkcmV0dXJuX3RvID0gJG1lc3NhZ2UtPmdldEFyZyhBdXRoX09wZW5JRF9PUEVOSURfTlMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3JldHVybl90bycpOwoKICAgICAgICBpZiAoKCRtZXNzYWdlLT5pc09wZW5JRDEoKSkgJiYKICAgICAgICAgICAgKCEkcmV0dXJuX3RvKSkgewogICAgICAgICAgICAkZm10ID0gIk1pc3NpbmcgcmVxdWlyZWQgZmllbGQgJ3JldHVybl90bycgZnJvbSBjaGVja2lkIHJlcXVlc3QiOwogICAgICAgICAgICByZXR1cm4gbmV3IEF1dGhfT3BlbklEX1NlcnZlckVycm9yKCRtZXNzYWdlLCAkZm10KTsKICAgICAgICB9CgogICAgICAgICRpZGVudGl0eSA9ICRtZXNzYWdlLT5nZXRBcmcoQXV0aF9PcGVuSURfT1BFTklEX05TLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2lkZW50aXR5Jyk7CiAgICAgICAgJGNsYWltZWRfaWQgPSAkbWVzc2FnZS0+Z2V0QXJnKEF1dGhfT3BlbklEX09QRU5JRF9OUywgJ2NsYWltZWRfaWQnKTsKICAgICAgICBpZiAoJG1lc3NhZ2UtPmlzT3BlbklEMSgpKSB7CiAgICAgICAgICAgIGlmICgkaWRlbnRpdHkgPT09IG51bGwpIHsKICAgICAgICAgICAgICAgICRzID0gIk9wZW5JRCAxIG1lc3NhZ2UgZGlkIG5vdCBjb250YWluIG9wZW5pZC5pZGVudGl0eSI7CiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEF1dGhfT3BlbklEX1NlcnZlckVycm9yKCRtZXNzYWdlLCAkcyk7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiAoJGlkZW50aXR5ICYmICEkY2xhaW1lZF9pZCkgewogICAgICAgICAgICAgICAgJHMgPSAiT3BlbklEIDIuMCBtZXNzYWdlIGNvbnRhaW5lZCBvcGVuaWQuaWRlbnRpdHkgYnV0IG5vdCAiIC4KICAgICAgICAgICAgICAgICAgImNsYWltZWRfaWQiOwogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBdXRoX09wZW5JRF9TZXJ2ZXJFcnJvcigkbWVzc2FnZSwgJHMpOwogICAgICAgICAgICB9IGVsc2UgaWYgKCRjbGFpbWVkX2lkICYmICEkaWRlbnRpdHkpIHsKICAgICAgICAgICAgICAgICRzID0gIk9wZW5JRCAyLjAgbWVzc2FnZSBjb250YWluZWQgb3BlbmlkLmNsYWltZWRfaWQgIiAuCiAgICAgICAgICAgICAgICAgICJidXQgbm90IGlkZW50aXR5IjsKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQXV0aF9PcGVuSURfU2VydmVyRXJyb3IoJG1lc3NhZ2UsICRzKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gVGhlcmUncyBhIGNhc2UgZm9yIG1ha2luZyBzZWxmLnRydXN0X3Jvb3QgYmUgYSBUcnVzdFJvb3QKICAgICAgICAvLyBoZXJlLiAgQnV0IGlmIFRydXN0Um9vdCBpc24ndCBjdXJyZW50bHkgcGFydCBvZiB0aGUKICAgICAgICAvLyAicHVibGljIiBBUEksIEknbSBub3Qgc3VyZSBpdCdzIHdvcnRoIGRvaW5nLgogICAgICAgIGlmICgkbWVzc2FnZS0+aXNPcGVuSUQxKCkpIHsKICAgICAgICAgICAgJHRydXN0X3Jvb3RfcGFyYW0gPSAndHJ1c3Rfcm9vdCc7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJHRydXN0X3Jvb3RfcGFyYW0gPSAncmVhbG0nOwogICAgICAgIH0KICAgICAgICAkdHJ1c3Rfcm9vdCA9ICRtZXNzYWdlLT5nZXRBcmcoQXV0aF9PcGVuSURfT1BFTklEX05TLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRydXN0X3Jvb3RfcGFyYW0pOwogICAgICAgIGlmICghICR0cnVzdF9yb290KSB7CiAgICAgICAgICAgICR0cnVzdF9yb290ID0gJHJldHVybl90bzsKICAgICAgICB9CgogICAgICAgIGlmICghICRtZXNzYWdlLT5pc09wZW5JRDEoKSAmJiAKICAgICAgICAgICAgKCRyZXR1cm5fdG8gPT09IG51bGwpICYmCiAgICAgICAgICAgICgkdHJ1c3Rfcm9vdCA9PT0gbnVsbCkpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBBdXRoX09wZW5JRF9TZXJ2ZXJFcnJvcigkbWVzc2FnZSwKICAgICAgICAgICAgICAib3BlbmlkLnJlYWxtIHJlcXVpcmVkIHdoZW4gb3BlbmlkLnJldHVybl90byBhYnNlbnQiKTsKICAgICAgICB9CgogICAgICAgICRhc3NvY19oYW5kbGUgPSAkbWVzc2FnZS0+Z2V0QXJnKEF1dGhfT3BlbklEX09QRU5JRF9OUywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYXNzb2NfaGFuZGxlJyk7CgogICAgICAgICRvYmogPSBBdXRoX09wZW5JRF9DaGVja0lEUmVxdWVzdDo6bWFrZSgkbWVzc2FnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGlkZW50aXR5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcmV0dXJuX3RvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdHJ1c3Rfcm9vdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGltbWVkaWF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGFzc29jX2hhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNlcnZlcik7CgogICAgICAgIGlmIChpc19hKCRvYmosICdBdXRoX09wZW5JRF9TZXJ2ZXJFcnJvcicpKSB7CiAgICAgICAgICAgIHJldHVybiAkb2JqOwogICAgICAgIH0KCiAgICAgICAgJG9iai0+Y2xhaW1lZF9pZCA9ICRjbGFpbWVkX2lkOwoKICAgICAgICByZXR1cm4gJG9iajsKICAgIH0KCiAgICBmdW5jdGlvbiBpZFNlbGVjdCgpCiAgICB7CiAgICAgICAgLy8gSXMgdGhlIGlkZW50aWZpZXIgdG8gYmUgc2VsZWN0ZWQgYnkgdGhlIElEUD8KICAgICAgICAvLyBTbyBJRFBzIGRvbid0IGhhdmUgdG8gaW1wb3J0IHRoZSBjb25zdGFudAogICAgICAgIHJldHVybiAkdGhpcy0+aWRlbnRpdHkgPT0gQXV0aF9PcGVuSURfSURFTlRJRklFUl9TRUxFQ1Q7CiAgICB9CgogICAgZnVuY3Rpb24gdHJ1c3RSb290VmFsaWQoKQogICAgewogICAgICAgIGlmICghJHRoaXMtPnRydXN0X3Jvb3QpIHsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQoKICAgICAgICAkdHIgPSBBdXRoX09wZW5JRF9UcnVzdFJvb3Q6Ol9wYXJzZSgkdGhpcy0+dHJ1c3Rfcm9vdCk7CiAgICAgICAgaWYgKCR0ciA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBBdXRoX09wZW5JRF9NYWxmb3JtZWRUcnVzdFJvb3QoJHRoaXMtPm1lc3NhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT50cnVzdF9yb290KTsKICAgICAgICB9CgogICAgICAgIGlmICgkdGhpcy0+cmV0dXJuX3RvICE9PSBudWxsKSB7CiAgICAgICAgICAgIHJldHVybiBBdXRoX09wZW5JRF9UcnVzdFJvb3Q6Om1hdGNoKCR0aGlzLT50cnVzdF9yb290LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+cmV0dXJuX3RvKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXNwb25kIHRvIHRoaXMgcmVxdWVzdC4gIFJldHVybiBlaXRoZXIgYW4KICAgICAqIHtAbGluayBBdXRoX09wZW5JRF9TZXJ2ZXJSZXNwb25zZX0gb3IKICAgICAqIHtAbGluayBBdXRoX09wZW5JRF9TZXJ2ZXJFcnJvcn0uCiAgICAgKgogICAgICogQHBhcmFtIGJvb2wgJGFsbG93IEFsbG93IHRoaXMgdXNlciB0byBjbGFpbSB0aGlzIGlkZW50aXR5LCBhbmQKICAgICAqIGFsbG93IHRoZSBjb25zdW1lciB0byBoYXZlIHRoaXMgaW5mb3JtYXRpb24/CiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkc2VydmVyX3VybCBERVBSRUNBVEVELiAgUGFzc2luZyAkb3BfZW5kcG9pbnQgdG8KICAgICAqIHRoZSB7QGxpbmsgQXV0aF9PcGVuSURfU2VydmVyfSBjb25zdHJ1Y3RvciBtYWtlcyB0aGlzIG9wdGlvbmFsLgogICAgICoKICAgICAqIFdoZW4gYW4gT3BlbklEIDEueCBpbW1lZGlhdGUgbW9kZSByZXF1ZXN0IGRvZXMgbm90IHN1Y2NlZWQsIGl0CiAgICAgKiBnZXRzIGJhY2sgYSBVUkwgd2hlcmUgdGhlIHJlcXVlc3QgbWF5IGJlIGNhcnJpZWQgb3V0IGluIGEKICAgICAqIG5vdC1zby1pbW1lZGlhdGUgZmFzaGlvbi4gIFBhc3MgbXkgVVJMIGluIGhlcmUgKHRoZSBmdWxseQogICAgICogcXVhbGlmaWVkIGFkZHJlc3Mgb2YgdGhpcyBzZXJ2ZXIncyBlbmRwb2ludCwgaS5lLgogICAgICogaHR0cDovL2V4YW1wbGUuY29tL3NlcnZlciksIGFuZCBJIHdpbGwgdXNlIGl0IGFzIGEgYmFzZSBmb3IgdGhlCiAgICAgKiBVUkwgZm9yIGEgbmV3IHJlcXVlc3QuCiAgICAgKgogICAgICogT3B0aW9uYWwgZm9yIHJlcXVlc3RzIHdoZXJlIHtAbGluayAkaW1tZWRpYXRlfSBpcyBmYWxzZSBvcgogICAgICogJGFsbG93IGlzIHRydWUuCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkaWRlbnRpdHkgVGhlIE9QLWxvY2FsIGlkZW50aWZpZXIgdG8gYW5zd2VyIHdpdGguCiAgICAgKiBPbmx5IGZvciB1c2Ugd2hlbiB0aGUgcmVseWluZyBwYXJ0eSByZXF1ZXN0ZWQgaWRlbnRpZmllcgogICAgICogc2VsZWN0aW9uLgogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgJGNsYWltZWRfaWQgVGhlIGNsYWltZWQgaWRlbnRpZmllciB0byBhbnN3ZXIKICAgICAqIHdpdGgsIGZvciB1c2Ugd2l0aCBpZGVudGlmaWVyIHNlbGVjdGlvbiBpbiB0aGUgY2FzZSB3aGVyZSB0aGUKICAgICAqIGNsYWltZWQgaWRlbnRpZmllciBhbmQgdGhlIE9QLWxvY2FsIGlkZW50aWZpZXIgZGlmZmVyLAogICAgICogaS5lLiB3aGVuIHRoZSBjbGFpbWVkX2lkIHVzZXMgZGVsZWdhdGlvbi4KICAgICAqCiAgICAgKiBJZiAkaWRlbnRpdHkgaXMgcHJvdmlkZWQgYnV0IHRoaXMgaXMgbm90LCAkY2xhaW1lZF9pZCB3aWxsCiAgICAgKiBkZWZhdWx0IHRvIHRoZSB2YWx1ZSBvZiAkaWRlbnRpdHkuICBXaGVuIGFuc3dlcmluZyByZXF1ZXN0cwogICAgICogdGhhdCBkaWQgbm90IGFzayBmb3IgaWRlbnRpZmllciBzZWxlY3Rpb24sIHRoZSByZXNwb25zZQogICAgICogJGNsYWltZWRfaWQgd2lsbCBkZWZhdWx0IHRvIHRoYXQgb2YgdGhlIHJlcXVlc3QuCiAgICAgKgogICAgICogVGhpcyBwYXJhbWV0ZXIgaXMgbmV3IGluIE9wZW5JRCAyLjAuCiAgICAgKgogICAgICogQHJldHVybiBtaXhlZAogICAgICovCiAgICBmdW5jdGlvbiBhbnN3ZXIoJGFsbG93LCAkc2VydmVyX3VybCA9IG51bGwsICRpZGVudGl0eSA9IG51bGwsCiAgICAgICAgICAgICAgICAgICAgJGNsYWltZWRfaWQgPSBudWxsKQogICAgewogICAgICAgIGlmICghJHRoaXMtPnJldHVybl90bykgewogICAgICAgICAgICByZXR1cm4gbmV3IEF1dGhfT3BlbklEX05vUmV0dXJuVG9FcnJvcigpOwogICAgICAgIH0KCiAgICAgICAgaWYgKCEkc2VydmVyX3VybCkgewogICAgICAgICAgICBpZiAoKCEkdGhpcy0+bWVzc2FnZS0+aXNPcGVuSUQxKCkpICYmCiAgICAgICAgICAgICAgICAoISR0aGlzLT5zZXJ2ZXItPm9wX2VuZHBvaW50KSkgewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBdXRoX09wZW5JRF9TZXJ2ZXJFcnJvcihudWxsLAogICAgICAgICAgICAgICAgICAic2VydmVyIHNob3VsZCBiZSBjb25zdHJ1Y3RlZCB3aXRoIG9wX2VuZHBvaW50IHRvICIgLgogICAgICAgICAgICAgICAgICAicmVzcG9uZCB0byBPcGVuSUQgMi4wIG1lc3NhZ2VzLiIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkc2VydmVyX3VybCA9ICR0aGlzLT5zZXJ2ZXItPm9wX2VuZHBvaW50OwogICAgICAgIH0KCiAgICAgICAgaWYgKCRhbGxvdykgewogICAgICAgICAgICAkbW9kZSA9ICdpZF9yZXMnOwogICAgICAgIH0gZWxzZSBpZiAoJHRoaXMtPm1lc3NhZ2UtPmlzT3BlbklEMSgpKSB7CiAgICAgICAgICAgIGlmICgkdGhpcy0+aW1tZWRpYXRlKSB7CiAgICAgICAgICAgICAgICAkbW9kZSA9ICdpZF9yZXMnOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJG1vZGUgPSAnY2FuY2VsJzsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmICgkdGhpcy0+aW1tZWRpYXRlKSB7CiAgICAgICAgICAgICAgICAkbW9kZSA9ICdzZXR1cF9uZWVkZWQnOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJG1vZGUgPSAnY2FuY2VsJzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCEkdGhpcy0+dHJ1c3RSb290VmFsaWQoKSkgewogICAgICAgICAgICByZXR1cm4gbmV3IEF1dGhfT3BlbklEX1VudHJ1c3RlZFJldHVyblVSTChudWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+cmV0dXJuX3RvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+dHJ1c3Rfcm9vdCk7CiAgICAgICAgfQoKICAgICAgICAkcmVzcG9uc2UgPSBuZXcgQXV0aF9PcGVuSURfU2VydmVyUmVzcG9uc2UoJHRoaXMpOwoKICAgICAgICBpZiAoJGNsYWltZWRfaWQgJiYKICAgICAgICAgICAgKCR0aGlzLT5tZXNzYWdlLT5pc09wZW5JRDEoKSkpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBBdXRoX09wZW5JRF9TZXJ2ZXJFcnJvcihudWxsLAogICAgICAgICAgICAgICJjbGFpbWVkX2lkIGlzIG5ldyBpbiBPcGVuSUQgMi4wIGFuZCBub3QgIiAuCiAgICAgICAgICAgICAgImF2YWlsYWJsZSBmb3IgIi4kdGhpcy0+bmFtZXNwYWNlKTsKICAgICAgICB9CgogICAgICAgIGlmICgkaWRlbnRpdHkgJiYgISRjbGFpbWVkX2lkKSB7CiAgICAgICAgICAgICRjbGFpbWVkX2lkID0gJGlkZW50aXR5OwogICAgICAgIH0KCiAgICAgICAgaWYgKCRhbGxvdykgewoKICAgICAgICAgICAgaWYgKCR0aGlzLT5pZGVudGl0eSA9PSBBdXRoX09wZW5JRF9JREVOVElGSUVSX1NFTEVDVCkgewogICAgICAgICAgICAgICAgaWYgKCEkaWRlbnRpdHkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEF1dGhfT3BlbklEX1NlcnZlckVycm9yKG51bGwsCiAgICAgICAgICAgICAgICAgICAgICAiVGhpcyByZXF1ZXN0IHVzZXMgSWRQLWRyaXZlbiBpZGVudGlmaWVyIHNlbGVjdGlvbi4gICIgLgogICAgICAgICAgICAgICAgICAgICAgIllvdSBtdXN0IHN1cHBseSBhbiBpZGVudGlmaWVyIGluIHRoZSByZXNwb25zZS4iKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkcmVzcG9uc2VfaWRlbnRpdHkgPSAkaWRlbnRpdHk7CiAgICAgICAgICAgICAgICAkcmVzcG9uc2VfY2xhaW1lZF9pZCA9ICRjbGFpbWVkX2lkOwoKICAgICAgICAgICAgfSBlbHNlIGlmICgkdGhpcy0+aWRlbnRpdHkpIHsKICAgICAgICAgICAgICAgIGlmICgkaWRlbnRpdHkgJiYKICAgICAgICAgICAgICAgICAgICAoJHRoaXMtPmlkZW50aXR5ICE9ICRpZGVudGl0eSkpIHsKICAgICAgICAgICAgICAgICAgICAkZm10ID0gIlJlcXVlc3Qgd2FzIGZvciAlcywgY2Fubm90IHJlcGx5IHdpdGggaWRlbnRpdHkgJXMiOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQXV0aF9PcGVuSURfU2VydmVyRXJyb3IobnVsbCwKICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYoJGZtdCwgJHRoaXMtPmlkZW50aXR5LCAkaWRlbnRpdHkpKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkcmVzcG9uc2VfaWRlbnRpdHkgPSAkdGhpcy0+aWRlbnRpdHk7CiAgICAgICAgICAgICAgICAkcmVzcG9uc2VfY2xhaW1lZF9pZCA9ICR0aGlzLT5jbGFpbWVkX2lkOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgaWYgKCRpZGVudGl0eSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQXV0aF9PcGVuSURfU2VydmVyRXJyb3IobnVsbCwKICAgICAgICAgICAgICAgICAgICAgICJUaGlzIHJlcXVlc3Qgc3BlY2lmaWVkIG5vIGlkZW50aXR5IGFuZCAiIC4KICAgICAgICAgICAgICAgICAgICAgICJ5b3Ugc3VwcGxpZWQgIi4kaWRlbnRpdHkpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRyZXNwb25zZV9pZGVudGl0eSA9IG51bGw7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICgoJHRoaXMtPm1lc3NhZ2UtPmlzT3BlbklEMSgpKSAmJgogICAgICAgICAgICAgICAgKCRyZXNwb25zZV9pZGVudGl0eSA9PT0gbnVsbCkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQXV0aF9PcGVuSURfU2VydmVyRXJyb3IobnVsbCwKICAgICAgICAgICAgICAgICAgIlJlcXVlc3Qgd2FzIGFuIE9wZW5JRCAxIHJlcXVlc3QsIHNvIHJlc3BvbnNlIG11c3QgIiAuCiAgICAgICAgICAgICAgICAgICJpbmNsdWRlIGFuIGlkZW50aWZpZXIuIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRyZXNwb25zZS0+ZmllbGRzLT51cGRhdGVBcmdzKEF1dGhfT3BlbklEX09QRU5JRF9OUywKICAgICAgICAgICAgICAgICAgIGFycmF5KCdtb2RlJyA9PiAkbW9kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICdyZXR1cm5fdG8nID0+ICR0aGlzLT5yZXR1cm5fdG8sCiAgICAgICAgICAgICAgICAgICAgICAgICAncmVzcG9uc2Vfbm9uY2UnID0+IEF1dGhfT3BlbklEX21rTm9uY2UoKSkpOwoKICAgICAgICAgICAgaWYgKCEkdGhpcy0+bWVzc2FnZS0+aXNPcGVuSUQxKCkpIHsKICAgICAgICAgICAgICAgICRyZXNwb25zZS0+ZmllbGRzLT5zZXRBcmcoQXV0aF9PcGVuSURfT1BFTklEX05TLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnb3BfZW5kcG9pbnQnLCAkc2VydmVyX3VybCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICgkcmVzcG9uc2VfaWRlbnRpdHkgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgICRyZXNwb25zZS0+ZmllbGRzLT5zZXRBcmcoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1dGhfT3BlbklEX09QRU5JRF9OUywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2lkZW50aXR5JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3BvbnNlX2lkZW50aXR5KTsKICAgICAgICAgICAgICAgIGlmICgkdGhpcy0+bWVzc2FnZS0+aXNPcGVuSUQyKCkpIHsKICAgICAgICAgICAgICAgICAgICAkcmVzcG9uc2UtPmZpZWxkcy0+c2V0QXJnKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXV0aF9PcGVuSURfT1BFTklEX05TLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NsYWltZWRfaWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3BvbnNlX2NsYWltZWRfaWQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRyZXNwb25zZS0+ZmllbGRzLT5zZXRBcmcoQXV0aF9PcGVuSURfT1BFTklEX05TLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2RlJywgJG1vZGUpOwoKICAgICAgICAgICAgaWYgKCR0aGlzLT5pbW1lZGlhdGUpIHsKICAgICAgICAgICAgICAgIGlmICgoJHRoaXMtPm1lc3NhZ2UtPmlzT3BlbklEMSgpKSAmJgogICAgICAgICAgICAgICAgICAgICghJHNlcnZlcl91cmwpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBdXRoX09wZW5JRF9TZXJ2ZXJFcnJvcihudWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dXBfdXJsIGlzIHJlcXVpcmVkIGZvciAkYWxsb3c9ZmFsc2UgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gT3BlbklEIDEueCBpbW1lZGlhdGUgbW9kZS4nKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkc2V0dXBfcmVxdWVzdCA9IG5ldyBBdXRoX09wZW5JRF9DaGVja0lEUmVxdWVzdCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmlkZW50aXR5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+cmV0dXJuX3RvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+dHJ1c3Rfcm9vdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5hc3NvY19oYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5zZXJ2ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5jbGFpbWVkX2lkKTsKICAgICAgICAgICAgICAgICRzZXR1cF9yZXF1ZXN0LT5tZXNzYWdlID0gJHRoaXMtPm1lc3NhZ2U7CgogICAgICAgICAgICAgICAgJHNldHVwX3VybCA9ICRzZXR1cF9yZXF1ZXN0LT5lbmNvZGVUb1VSTCgkc2VydmVyX3VybCk7CgogICAgICAgICAgICAgICAgaWYgKCRzZXR1cF91cmwgPT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEF1dGhfT3BlbklEX05vUmV0dXJuVG9FcnJvcigpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRyZXNwb25zZS0+ZmllbGRzLT5zZXRBcmcoQXV0aF9PcGVuSURfT1BFTklEX05TLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndXNlcl9zZXR1cF91cmwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2V0dXBfdXJsKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRyZXNwb25zZTsKICAgIH0KCiAgICBmdW5jdGlvbiBlbmNvZGVUb1VSTCgkc2VydmVyX3VybCkKICAgIHsKICAgICAgICBpZiAoISR0aGlzLT5yZXR1cm5fdG8pIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBBdXRoX09wZW5JRF9Ob1JldHVyblRvRXJyb3IoKTsKICAgICAgICB9CgogICAgICAgIC8vIEltcG9ydGVkIGZyb20gdGhlIGFsdGVybmF0ZSByZWFsaXR5IHdoZXJlIHRoZXNlIGNsYXNzZXMgYXJlCiAgICAgICAgLy8gdXNlZCBpbiBib3RoIHRoZSBjbGllbnQgYW5kIHNlcnZlciBjb2RlLCBzbyBSZXF1ZXN0cyBhcmUKICAgICAgICAvLyBFbmNvZGFibGUgdG9vLiAgVGhhdCdzIHJpZ2h0LCBjb2RlIGltcG9ydGVkIGZyb20gYWx0ZXJuYXRlCiAgICAgICAgLy8gcmVhbGl0aWVzIGFsbCBmb3IgdGhlIGxvdmUgb2YgeW91LCBpZF9yZXMvdXNlcl9zZXR1cF91cmwuCgogICAgICAgICRxID0gYXJyYXkoJ21vZGUnID0+ICR0aGlzLT5tb2RlLAogICAgICAgICAgICAgICAgICAgJ2lkZW50aXR5JyA9PiAkdGhpcy0+aWRlbnRpdHksCiAgICAgICAgICAgICAgICAgICAnY2xhaW1lZF9pZCcgPT4gJHRoaXMtPmNsYWltZWRfaWQsCiAgICAgICAgICAgICAgICAgICAncmV0dXJuX3RvJyA9PiAkdGhpcy0+cmV0dXJuX3RvKTsKCiAgICAgICAgaWYgKCR0aGlzLT50cnVzdF9yb290KSB7CiAgICAgICAgICAgIGlmICgkdGhpcy0+bWVzc2FnZS0+aXNPcGVuSUQxKCkpIHsKICAgICAgICAgICAgICAgICRxWyd0cnVzdF9yb290J10gPSAkdGhpcy0+dHJ1c3Rfcm9vdDsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICRxWydyZWFsbSddID0gJHRoaXMtPnRydXN0X3Jvb3Q7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICgkdGhpcy0+YXNzb2NfaGFuZGxlKSB7CiAgICAgICAgICAgICRxWydhc3NvY19oYW5kbGUnXSA9ICR0aGlzLT5hc3NvY19oYW5kbGU7CiAgICAgICAgfQoKICAgICAgICAkcmVzcG9uc2UgPSBuZXcgQXV0aF9PcGVuSURfTWVzc2FnZSgKICAgICAgICAgICAgJHRoaXMtPm1lc3NhZ2UtPmdldE9wZW5JRE5hbWVzcGFjZSgpKTsKICAgICAgICAkcmVzcG9uc2UtPnVwZGF0ZUFyZ3MoQXV0aF9PcGVuSURfT1BFTklEX05TLCAkcSk7CiAgICAgICAgcmV0dXJuICRyZXNwb25zZS0+dG9VUkwoJHNlcnZlcl91cmwpOwogICAgfQoKICAgIGZ1bmN0aW9uIGdldENhbmNlbFVSTCgpCiAgICB7CiAgICAgICAgaWYgKCEkdGhpcy0+cmV0dXJuX3RvKSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgQXV0aF9PcGVuSURfTm9SZXR1cm5Ub0Vycm9yKCk7CiAgICAgICAgfQoKICAgICAgICBpZiAoJHRoaXMtPmltbWVkaWF0ZSkgewogICAgICAgICAgICByZXR1cm4gbmV3IEF1dGhfT3BlbklEX1NlcnZlckVycm9yKG51bGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNhbmNlbCBpcyBub3QgYW4gYXBwcm9wcmlhdGUgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlIHRvIGltbWVkaWF0ZSBtb2RlIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0cy4iKTsKICAgICAgICB9CgogICAgICAgICRyZXNwb25zZSA9IG5ldyBBdXRoX09wZW5JRF9NZXNzYWdlKAogICAgICAgICAgICAkdGhpcy0+bWVzc2FnZS0+Z2V0T3BlbklETmFtZXNwYWNlKCkpOwogICAgICAgICRyZXNwb25zZS0+c2V0QXJnKEF1dGhfT3BlbklEX09QRU5JRF9OUywgJ21vZGUnLCAnY2FuY2VsJyk7CiAgICAgICAgcmV0dXJuICRyZXNwb25zZS0+dG9VUkwoJHRoaXMtPnJldHVybl90byk7CiAgICB9Cn0KCi8qKgogKiBUaGlzIGNsYXNzIGVuY2Fwc3VsYXRlcyB0aGUgcmVzcG9uc2UgdG8gYW4gT3BlbklEIHNlcnZlciByZXF1ZXN0LgogKgogKiBAcGFja2FnZSBPcGVuSUQKICovCmNsYXNzIEF1dGhfT3BlbklEX1NlcnZlclJlc3BvbnNlIHsKCiAgICBmdW5jdGlvbiBBdXRoX09wZW5JRF9TZXJ2ZXJSZXNwb25zZSgkcmVxdWVzdCkKICAgIHsKICAgICAgICAkdGhpcy0+cmVxdWVzdCA9ICRyZXF1ZXN0OwogICAgICAgICR0aGlzLT5maWVsZHMgPSBuZXcgQXV0aF9PcGVuSURfTWVzc2FnZSgkdGhpcy0+cmVxdWVzdC0+bmFtZXNwYWNlKTsKICAgIH0KCiAgICBmdW5jdGlvbiB3aGljaEVuY29kaW5nKCkKICAgIHsKICAgICAgZ2xvYmFsICRfQXV0aF9PcGVuSURfUmVxdWVzdF9Nb2RlczsKCiAgICAgICAgaWYgKGluX2FycmF5KCR0aGlzLT5yZXF1ZXN0LT5tb2RlLCAkX0F1dGhfT3BlbklEX1JlcXVlc3RfTW9kZXMpKSB7CiAgICAgICAgICAgIGlmICgkdGhpcy0+ZmllbGRzLT5pc09wZW5JRDIoKSAmJgogICAgICAgICAgICAgICAgKHN0cmxlbigkdGhpcy0+ZW5jb2RlVG9VUkwoKSkgPgogICAgICAgICAgICAgICAgICAgQXV0aF9PcGVuSURfT1BFTklEMV9VUkxfTElNSVQpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gQXV0aF9PcGVuSURfRU5DT0RFX0hUTUxfRk9STTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiBBdXRoX09wZW5JRF9FTkNPREVfVVJMOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIEF1dGhfT3BlbklEX0VOQ09ERV9LVkZPUk07CiAgICAgICAgfQogICAgfQoKICAgIC8qCiAgICAgKiBSZXR1cm5zIHRoZSBmb3JtIG1hcmt1cCBmb3IgdGhpcyByZXNwb25zZS4KICAgICAqCiAgICAgKiBAcmV0dXJuIHN0cgogICAgICovCiAgICBmdW5jdGlvbiB0b0Zvcm1NYXJrdXAoJGZvcm1fdGFnX2F0dHJzPW51bGwpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5maWVsZHMtPnRvRm9ybU1hcmt1cCgkdGhpcy0+cmVxdWVzdC0+cmV0dXJuX3RvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGZvcm1fdGFnX2F0dHJzKTsKICAgIH0KCiAgICAvKgogICAgICogUmV0dXJucyBhbiBIVE1MIGRvY3VtZW50IGNvbnRhaW5pbmcgdGhlIGZvcm0gbWFya3VwIGZvciB0aGlzCiAgICAgKiByZXNwb25zZSB0aGF0IGF1dG9zdWJtaXRzIHdpdGggamF2YXNjcmlwdC4KICAgICAqLwogICAgZnVuY3Rpb24gdG9IVE1MKCkKICAgIHsKICAgICAgICByZXR1cm4gQXV0aF9PcGVuSUQ6OmF1dG9TdWJtaXRIVE1MKCR0aGlzLT50b0Zvcm1NYXJrdXAoKSk7CiAgICB9CgogICAgLyoKICAgICAqIFJldHVybnMgVHJ1ZSBpZiB0aGlzIHJlc3BvbnNlJ3MgZW5jb2RpbmcgaXMgRU5DT0RFX0hUTUxfRk9STS4KICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3Igc2VydmVyIGF1dGhvcnMuCiAgICAgKgogICAgICogQHJldHVybiBib29sCiAgICAgKi8KICAgIGZ1bmN0aW9uIHJlbmRlckFzRm9ybSgpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT53aGljaEVuY29kaW5nKCkgPT0gQXV0aF9PcGVuSURfRU5DT0RFX0hUTUxfRk9STTsKICAgIH0KCgogICAgZnVuY3Rpb24gZW5jb2RlVG9VUkwoKQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+ZmllbGRzLT50b1VSTCgkdGhpcy0+cmVxdWVzdC0+cmV0dXJuX3RvKTsKICAgIH0KCiAgICBmdW5jdGlvbiBhZGRFeHRlbnNpb24oJGV4dGVuc2lvbl9yZXNwb25zZSkKICAgIHsKICAgICAgICAkZXh0ZW5zaW9uX3Jlc3BvbnNlLT50b01lc3NhZ2UoJHRoaXMtPmZpZWxkcyk7CiAgICB9CgogICAgZnVuY3Rpb24gbmVlZHNTaWduaW5nKCkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmZpZWxkcy0+Z2V0QXJnKEF1dGhfT3BlbklEX09QRU5JRF9OUywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2RlJykgPT0gJ2lkX3Jlcyc7CiAgICB9CgogICAgZnVuY3Rpb24gZW5jb2RlVG9LVkZvcm0oKQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+ZmllbGRzLT50b0tWRm9ybSgpOwogICAgfQp9CgovKioKICogQSB3ZWItY2FwYWJsZSByZXNwb25zZSBvYmplY3Qgd2hpY2ggeW91IGNhbiB1c2UgdG8gZ2VuZXJhdGUgYQogKiB1c2VyLWFnZW50IHJlc3BvbnNlLgogKgogKiBAcGFja2FnZSBPcGVuSUQKICovCmNsYXNzIEF1dGhfT3BlbklEX1dlYlJlc3BvbnNlIHsKICAgIHZhciAkY29kZSA9IEFVVEhfT1BFTklEX0hUVFBfT0s7CiAgICB2YXIgJGJvZHkgPSAiIjsKCiAgICBmdW5jdGlvbiBBdXRoX09wZW5JRF9XZWJSZXNwb25zZSgkY29kZSA9IG51bGwsICRoZWFkZXJzID0gbnVsbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRib2R5ID0gbnVsbCkKICAgIHsKICAgICAgICBpZiAoJGNvZGUpIHsKICAgICAgICAgICAgJHRoaXMtPmNvZGUgPSAkY29kZTsKICAgICAgICB9CgogICAgICAgIGlmICgkaGVhZGVycyAhPT0gbnVsbCkgewogICAgICAgICAgICAkdGhpcy0+aGVhZGVycyA9ICRoZWFkZXJzOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICR0aGlzLT5oZWFkZXJzID0gYXJyYXkoKTsKICAgICAgICB9CgogICAgICAgIGlmICgkYm9keSAhPT0gbnVsbCkgewogICAgICAgICAgICAkdGhpcy0+Ym9keSA9ICRib2R5OwogICAgICAgIH0KICAgIH0KfQoKLyoqCiAqIFJlc3BvbnNpYmxlIGZvciB0aGUgc2lnbmF0dXJlIG9mIHF1ZXJ5IGRhdGEgYW5kIHRoZSB2ZXJpZmljYXRpb24gb2YKICogT3BlbklEIHNpZ25hdHVyZSB2YWx1ZXMuCiAqCiAqIEBwYWNrYWdlIE9wZW5JRAogKi8KY2xhc3MgQXV0aF9PcGVuSURfU2lnbmF0b3J5IHsKCiAgICAvLyA9IDE0ICogMjQgKiA2MCAqIDYwOyAjIDE0IGRheXMsIGluIHNlY29uZHMKICAgIHZhciAkU0VDUkVUX0xJRkVUSU1FID0gMTIwOTYwMDsKCiAgICAvLyBrZXlzIGhhdmUgYSBib2d1cyBzZXJ2ZXIgVVJMIGluIHRoZW0gYmVjYXVzZSB0aGUgZmlsZXN0b3JlCiAgICAvLyByZWFsbHkgZG9lcyBleHBlY3QgdGhhdCBrZXkgdG8gYmUgYSBVUkwuICBUaGlzIHNlZW1zIGEgbGl0dGxlCiAgICAvLyBzaWxseSBmb3IgdGhlIHNlcnZlciBzdG9yZSwgc2luY2UgSSBleHBlY3QgdGhlcmUgdG8gYmUgb25seSBvbmUKICAgIC8vIHNlcnZlciBVUkwuCiAgICB2YXIgJG5vcm1hbF9rZXkgPSAnaHR0cDovL2xvY2FsaG9zdC98bm9ybWFsJzsKICAgIHZhciAkZHVtYl9rZXkgPSAnaHR0cDovL2xvY2FsaG9zdC98ZHVtYic7CgogICAgLyoqCiAgICAgKiBDcmVhdGUgYSBuZXcgc2lnbmF0b3J5IHVzaW5nIGEgZ2l2ZW4gc3RvcmUuCiAgICAgKi8KICAgIGZ1bmN0aW9uIEF1dGhfT3BlbklEX1NpZ25hdG9yeSgkc3RvcmUpCiAgICB7CiAgICAgICAgLy8gYXNzZXJ0IHN0b3JlIGlzIG5vdCBOb25lCiAgICAgICAgJHRoaXMtPnN0b3JlID0gJHN0b3JlOwogICAgfQoKICAgIC8qKgogICAgICogVmVyaWZ5LCB1c2luZyBhIGdpdmVuIGFzc29jaWF0aW9uIGhhbmRsZSwgYSBzaWduYXR1cmUgd2l0aAogICAgICogc2lnbmVkIGtleS12YWx1ZSBwYWlycyBmcm9tIGFuIEhUVFAgcmVxdWVzdC4KICAgICAqLwogICAgZnVuY3Rpb24gdmVyaWZ5KCRhc3NvY19oYW5kbGUsICRtZXNzYWdlKQogICAgewogICAgICAgICRhc3NvYyA9ICR0aGlzLT5nZXRBc3NvY2lhdGlvbigkYXNzb2NfaGFuZGxlLCB0cnVlKTsKICAgICAgICBpZiAoISRhc3NvYykgewogICAgICAgICAgICAvLyBvaWR1dGlsLmxvZygiZmFpbGVkIHRvIGdldCBhc3NvYyB3aXRoIGhhbmRsZSAlciB0byB2ZXJpZnkgc2lnICVyIgogICAgICAgICAgICAvLyAgICAgICAgICAgICAlIChhc3NvY19oYW5kbGUsIHNpZykpCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkYXNzb2MtPmNoZWNrTWVzc2FnZVNpZ25hdHVyZSgkbWVzc2FnZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBHaXZlbiBhIHJlc3BvbnNlLCBzaWduIHRoZSBmaWVsZHMgaW4gdGhlIHJlc3BvbnNlJ3MgJ3NpZ25lZCcKICAgICAqIGxpc3QsIGFuZCBpbnNlcnQgdGhlIHNpZ25hdHVyZSBpbnRvIHRoZSByZXNwb25zZS4KICAgICAqLwogICAgZnVuY3Rpb24gc2lnbigkcmVzcG9uc2UpCiAgICB7CiAgICAgICAgJHNpZ25lZF9yZXNwb25zZSA9ICRyZXNwb25zZTsKICAgICAgICAkYXNzb2NfaGFuZGxlID0gJHJlc3BvbnNlLT5yZXF1ZXN0LT5hc3NvY19oYW5kbGU7CgogICAgICAgIGlmICgkYXNzb2NfaGFuZGxlKSB7CiAgICAgICAgICAgIC8vIG5vcm1hbCBtb2RlCiAgICAgICAgICAgICRhc3NvYyA9ICR0aGlzLT5nZXRBc3NvY2lhdGlvbigkYXNzb2NfaGFuZGxlLCBmYWxzZSwgZmFsc2UpOwogICAgICAgICAgICBpZiAoISRhc3NvYyB8fCAoJGFzc29jLT5nZXRFeHBpcmVzSW4oKSA8PSAwKSkgewogICAgICAgICAgICAgICAgLy8gZmFsbCBiYWNrIHRvIGR1bWIgbW9kZQogICAgICAgICAgICAgICAgJHNpZ25lZF9yZXNwb25zZS0+ZmllbGRzLT5zZXRBcmcoQXV0aF9PcGVuSURfT1BFTklEX05TLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpbnZhbGlkYXRlX2hhbmRsZScsICRhc3NvY19oYW5kbGUpOwogICAgICAgICAgICAgICAgJGFzc29jX3R5cGUgPSAoJGFzc29jID8gJGFzc29jLT5hc3NvY190eXBlIDogJ0hNQUMtU0hBMScpOwoKICAgICAgICAgICAgICAgIGlmICgkYXNzb2MgJiYgKCRhc3NvYy0+Z2V0RXhwaXJlc0luKCkgPD0gMCkpIHsKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+aW52YWxpZGF0ZSgkYXNzb2NfaGFuZGxlLCBmYWxzZSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJGFzc29jID0gJHRoaXMtPmNyZWF0ZUFzc29jaWF0aW9uKHRydWUsICRhc3NvY190eXBlKTsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vIGR1bWIgbW9kZS4KICAgICAgICAgICAgJGFzc29jID0gJHRoaXMtPmNyZWF0ZUFzc29jaWF0aW9uKHRydWUpOwogICAgICAgIH0KCiAgICAgICAgJHNpZ25lZF9yZXNwb25zZS0+ZmllbGRzID0gJGFzc29jLT5zaWduTWVzc2FnZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2lnbmVkX3Jlc3BvbnNlLT5maWVsZHMpOwogICAgICAgIHJldHVybiAkc2lnbmVkX3Jlc3BvbnNlOwogICAgfQoKICAgIC8qKgogICAgICogTWFrZSBhIG5ldyBhc3NvY2lhdGlvbi4KICAgICAqLwogICAgZnVuY3Rpb24gY3JlYXRlQXNzb2NpYXRpb24oJGR1bWIgPSB0cnVlLCAkYXNzb2NfdHlwZSA9ICdITUFDLVNIQTEnKQogICAgewogICAgICAgICRzZWNyZXQgPSBBdXRoX09wZW5JRF9DcnlwdFV0aWw6OmdldEJ5dGVzKAogICAgICAgICAgICAgICAgICAgIEF1dGhfT3BlbklEX2dldFNlY3JldFNpemUoJGFzc29jX3R5cGUpKTsKCiAgICAgICAgJHVuaXEgPSBiYXNlNjRfZW5jb2RlKEF1dGhfT3BlbklEX0NyeXB0VXRpbDo6Z2V0Qnl0ZXMoNCkpOwogICAgICAgICRoYW5kbGUgPSBzcHJpbnRmKCd7JXN9eyV4fXslc30nLCAkYXNzb2NfdHlwZSwgaW50dmFsKHRpbWUoKSksICR1bmlxKTsKCiAgICAgICAgJGFzc29jID0gQXV0aF9PcGVuSURfQXNzb2NpYXRpb246OmZyb21FeHBpcmVzSW4oCiAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+U0VDUkVUX0xJRkVUSU1FLCAkaGFuZGxlLCAkc2VjcmV0LCAkYXNzb2NfdHlwZSk7CgogICAgICAgIGlmICgkZHVtYikgewogICAgICAgICAgICAka2V5ID0gJHRoaXMtPmR1bWJfa2V5OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRrZXkgPSAkdGhpcy0+bm9ybWFsX2tleTsKICAgICAgICB9CgogICAgICAgICR0aGlzLT5zdG9yZS0+c3RvcmVBc3NvY2lhdGlvbigka2V5LCAkYXNzb2MpOwogICAgICAgIHJldHVybiAkYXNzb2M7CiAgICB9CgogICAgLyoqCiAgICAgKiBHaXZlbiBhbiBhc3NvY2lhdGlvbiBoYW5kbGUsIGdldCB0aGUgYXNzb2NpYXRpb24gZnJvbSB0aGUKICAgICAqIHN0b3JlLCBvciByZXR1cm4gYSBTZXJ2ZXJFcnJvciBvciBudWxsIGlmIHNvbWV0aGluZyBnb2VzIHdyb25nLgogICAgICovCiAgICBmdW5jdGlvbiBnZXRBc3NvY2lhdGlvbigkYXNzb2NfaGFuZGxlLCAkZHVtYiwgJGNoZWNrX2V4cGlyYXRpb249dHJ1ZSkKICAgIHsKICAgICAgICBpZiAoJGFzc29jX2hhbmRsZSA9PT0gbnVsbCkgewogICAgICAgICAgICByZXR1cm4gbmV3IEF1dGhfT3BlbklEX1NlcnZlckVycm9yKG51bGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXNzb2NfaGFuZGxlIG11c3Qgbm90IGJlIG51bGwiKTsKICAgICAgICB9CgogICAgICAgIGlmICgkZHVtYikgewogICAgICAgICAgICAka2V5ID0gJHRoaXMtPmR1bWJfa2V5OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRrZXkgPSAkdGhpcy0+bm9ybWFsX2tleTsKICAgICAgICB9CgogICAgICAgICRhc3NvYyA9ICR0aGlzLT5zdG9yZS0+Z2V0QXNzb2NpYXRpb24oJGtleSwgJGFzc29jX2hhbmRsZSk7CgogICAgICAgIGlmICgoJGFzc29jICE9PSBudWxsKSAmJiAoJGFzc29jLT5nZXRFeHBpcmVzSW4oKSA8PSAwKSkgewogICAgICAgICAgICBpZiAoJGNoZWNrX2V4cGlyYXRpb24pIHsKICAgICAgICAgICAgICAgICR0aGlzLT5zdG9yZS0+cmVtb3ZlQXNzb2NpYXRpb24oJGtleSwgJGFzc29jX2hhbmRsZSk7CiAgICAgICAgICAgICAgICAkYXNzb2MgPSBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJGFzc29jOwogICAgfQoKICAgIC8qKgogICAgICogSW52YWxpZGF0ZSBhIGdpdmVuIGFzc29jaWF0aW9uIGhhbmRsZS4KICAgICAqLwogICAgZnVuY3Rpb24gaW52YWxpZGF0ZSgkYXNzb2NfaGFuZGxlLCAkZHVtYikKICAgIHsKICAgICAgICBpZiAoJGR1bWIpIHsKICAgICAgICAgICAgJGtleSA9ICR0aGlzLT5kdW1iX2tleTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAka2V5ID0gJHRoaXMtPm5vcm1hbF9rZXk7CiAgICAgICAgfQogICAgICAgICR0aGlzLT5zdG9yZS0+cmVtb3ZlQXNzb2NpYXRpb24oJGtleSwgJGFzc29jX2hhbmRsZSk7CiAgICB9Cn0KCi8qKgogKiBFbmNvZGUgYW4ge0BsaW5rIEF1dGhfT3BlbklEX1NlcnZlclJlc3BvbnNlfSB0byBhbgogKiB7QGxpbmsgQXV0aF9PcGVuSURfV2ViUmVzcG9uc2V9LgogKgogKiBAcGFja2FnZSBPcGVuSUQKICovCmNsYXNzIEF1dGhfT3BlbklEX0VuY29kZXIgewoKICAgIHZhciAkcmVzcG9uc2VGYWN0b3J5ID0gJ0F1dGhfT3BlbklEX1dlYlJlc3BvbnNlJzsKCiAgICAvKioKICAgICAqIEVuY29kZSBhbiB7QGxpbmsgQXV0aF9PcGVuSURfU2VydmVyUmVzcG9uc2V9IGFuZCByZXR1cm4gYW4KICAgICAqIHtAbGluayBBdXRoX09wZW5JRF9XZWJSZXNwb25zZX0uCiAgICAgKi8KICAgIGZ1bmN0aW9uIGVuY29kZSgkcmVzcG9uc2UpCiAgICB7CiAgICAgICAgJGNscyA9ICR0aGlzLT5yZXNwb25zZUZhY3Rvcnk7CgogICAgICAgICRlbmNvZGVfYXMgPSAkcmVzcG9uc2UtPndoaWNoRW5jb2RpbmcoKTsKICAgICAgICBpZiAoJGVuY29kZV9hcyA9PSBBdXRoX09wZW5JRF9FTkNPREVfS1ZGT1JNKSB7CiAgICAgICAgICAgICR3ciA9IG5ldyAkY2xzKG51bGwsIG51bGwsICRyZXNwb25zZS0+ZW5jb2RlVG9LVkZvcm0oKSk7CiAgICAgICAgICAgIGlmIChpc19hKCRyZXNwb25zZSwgJ0F1dGhfT3BlbklEX1NlcnZlckVycm9yJykpIHsKICAgICAgICAgICAgICAgICR3ci0+Y29kZSA9IEFVVEhfT1BFTklEX0hUVFBfRVJST1I7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKCRlbmNvZGVfYXMgPT0gQXV0aF9PcGVuSURfRU5DT0RFX1VSTCkgewogICAgICAgICAgICAkbG9jYXRpb24gPSAkcmVzcG9uc2UtPmVuY29kZVRvVVJMKCk7CiAgICAgICAgICAgICR3ciA9IG5ldyAkY2xzKEFVVEhfT1BFTklEX0hUVFBfUkVESVJFQ1QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5KCdsb2NhdGlvbicgPT4gJGxvY2F0aW9uKSk7CiAgICAgICAgfSBlbHNlIGlmICgkZW5jb2RlX2FzID09IEF1dGhfT3BlbklEX0VOQ09ERV9IVE1MX0ZPUk0pIHsKICAgICAgICAgICR3ciA9IG5ldyAkY2xzKEFVVEhfT1BFTklEX0hUVFBfT0ssIGFycmF5KCksCiAgICAgICAgICAgICAgICAgICAgICAgICAkcmVzcG9uc2UtPnRvSFRNTCgpKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gbmV3IEF1dGhfT3BlbklEX0VuY29kaW5nRXJyb3IoJHJlc3BvbnNlKTsKICAgICAgICB9CiAgICAgICAgLyogQWxsb3cgdGhlIHJlc3BvbnNlIHRvIGNhcnJ5IGEgY3VzdG9tIGVycm9yIGNvZGUgKGV4OiBmb3IgQXNzb2NpYXRpb24gZXJyb3JzKSAqLwogICAgICAgIGlmKGlzc2V0KCRyZXNwb25zZS0+Y29kZSkpIHsKICAgICAgICAgICAgJHdyLT5jb2RlID0gJHJlc3BvbnNlLT5jb2RlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJHdyOwogICAgfQp9CgovKioKICogQW4gZW5jb2RlciB3aGljaCBhbHNvIHRha2VzIGNhcmUgb2Ygc2lnbmluZyBmaWVsZHMgd2hlbiByZXF1aXJlZC4KICoKICogQHBhY2thZ2UgT3BlbklECiAqLwpjbGFzcyBBdXRoX09wZW5JRF9TaWduaW5nRW5jb2RlciBleHRlbmRzIEF1dGhfT3BlbklEX0VuY29kZXIgewoKICAgIGZ1bmN0aW9uIEF1dGhfT3BlbklEX1NpZ25pbmdFbmNvZGVyKCRzaWduYXRvcnkpCiAgICB7CiAgICAgICAgJHRoaXMtPnNpZ25hdG9yeSA9ICRzaWduYXRvcnk7CiAgICB9CgogICAgLyoqCiAgICAgKiBTaWduIGFuIHtAbGluayBBdXRoX09wZW5JRF9TZXJ2ZXJSZXNwb25zZX0gYW5kIHJldHVybiBhbgogICAgICoge0BsaW5rIEF1dGhfT3BlbklEX1dlYlJlc3BvbnNlfS4KICAgICAqLwogICAgZnVuY3Rpb24gZW5jb2RlKCRyZXNwb25zZSkKICAgIHsKICAgICAgICAvLyB0aGUgaXNpbnN0YW5jZSBpcyBhIGJpdCBvZiBhIGtsdWRnZS4uLiBpdCBtZWFucyB0aGVyZSBpc24ndAogICAgICAgIC8vIHJlYWxseSBhbiBhZGFwdGVyIHRvIG1ha2UgdGhlIGludGVyZmFjZXMgcXVpdGUgbWF0Y2guCiAgICAgICAgaWYgKCFpc19hKCRyZXNwb25zZSwgJ0F1dGhfT3BlbklEX1NlcnZlckVycm9yJykgJiYKICAgICAgICAgICAgJHJlc3BvbnNlLT5uZWVkc1NpZ25pbmcoKSkgewoKICAgICAgICAgICAgaWYgKCEkdGhpcy0+c2lnbmF0b3J5KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEF1dGhfT3BlbklEX1NlcnZlckVycm9yKG51bGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNdXN0IGhhdmUgYSBzdG9yZSB0byBzaWduIHJlcXVlc3QiKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCRyZXNwb25zZS0+ZmllbGRzLT5oYXNLZXkoQXV0aF9PcGVuSURfT1BFTklEX05TLCAnc2lnJykpIHsKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQXV0aF9PcGVuSURfQWxyZWFkeVNpZ25lZCgkcmVzcG9uc2UpOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRyZXNwb25zZSA9ICR0aGlzLT5zaWduYXRvcnktPnNpZ24oJHJlc3BvbnNlKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBwYXJlbnQ6OmVuY29kZSgkcmVzcG9uc2UpOwogICAgfQp9CgovKioKICogRGVjb2RlIGFuIGluY29taW5nIHF1ZXJ5IGludG8gYW4gQXV0aF9PcGVuSURfUmVxdWVzdC4KICoKICogQHBhY2thZ2UgT3BlbklECiAqLwpjbGFzcyBBdXRoX09wZW5JRF9EZWNvZGVyIHsKCiAgICBmdW5jdGlvbiBBdXRoX09wZW5JRF9EZWNvZGVyKCRzZXJ2ZXIpCiAgICB7CiAgICAgICAgJHRoaXMtPnNlcnZlciA9ICRzZXJ2ZXI7CgogICAgICAgICR0aGlzLT5oYW5kbGVycyA9IGFycmF5KAogICAgICAgICAgICAnY2hlY2tpZF9zZXR1cCcgPT4gJ0F1dGhfT3BlbklEX0NoZWNrSURSZXF1ZXN0JywKICAgICAgICAgICAgJ2NoZWNraWRfaW1tZWRpYXRlJyA9PiAnQXV0aF9PcGVuSURfQ2hlY2tJRFJlcXVlc3QnLAogICAgICAgICAgICAnY2hlY2tfYXV0aGVudGljYXRpb24nID0+ICdBdXRoX09wZW5JRF9DaGVja0F1dGhSZXF1ZXN0JywKICAgICAgICAgICAgJ2Fzc29jaWF0ZScgPT4gJ0F1dGhfT3BlbklEX0Fzc29jaWF0ZVJlcXVlc3QnCiAgICAgICAgICAgICk7CiAgICB9CgogICAgLyoqCiAgICAgKiBHaXZlbiBhbiBIVFRQIHF1ZXJ5IGluIGFuIGFycmF5IChrZXktdmFsdWUgcGFpcnMpLCBkZWNvZGUgaXQKICAgICAqIGludG8gYW4gQXV0aF9PcGVuSURfUmVxdWVzdCBvYmplY3QuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGRlY29kZSgkcXVlcnkpCiAgICB7CiAgICAgICAgaWYgKCEkcXVlcnkpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQoKICAgICAgICAkbWVzc2FnZSA9IEF1dGhfT3BlbklEX01lc3NhZ2U6OmZyb21Qb3N0QXJncygkcXVlcnkpOwoKICAgICAgICBpZiAoJG1lc3NhZ2UgPT09IG51bGwpIHsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogSXQncyB1c2VmdWwgdG8gaGF2ZSBhIE1lc3NhZ2UgYXR0YWNoZWQgdG8gYQogICAgICAgICAgICAgKiBQcm90b2NvbEVycm9yLCBzbyB3ZSBvdmVycmlkZSB0aGUgYmFkIG5zIHZhbHVlIHRvIGJ1aWxkCiAgICAgICAgICAgICAqIGEgTWVzc2FnZSBvdXQgb2YgaXQuICBLaW5kYSBrbHVkZ3ksIHNpbmNlIGl0J3MgbWFkZSBvZgogICAgICAgICAgICAgKiBsaWVzLCBidXQgdGhlIHBhcnRzIHRoYXQgYXJlbid0IGxpZXMgYXJlIG1vcmUgdXNlZnVsCiAgICAgICAgICAgICAqIHRoYW4gYSAnTm9uZScuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICAkb2xkX25zID0gJHF1ZXJ5WydvcGVuaWQubnMnXTsKCiAgICAgICAgICAgICRxdWVyeVsnb3BlbmlkLm5zJ10gPSBBdXRoX09wZW5JRF9PUEVOSUQyX05TOwogICAgICAgICAgICAkbWVzc2FnZSA9IEF1dGhfT3BlbklEX01lc3NhZ2U6OmZyb21Qb3N0QXJncygkcXVlcnkpOwogICAgICAgICAgICByZXR1cm4gbmV3IEF1dGhfT3BlbklEX1NlcnZlckVycm9yKAogICAgICAgICAgICAgICAgICAkbWVzc2FnZSwKICAgICAgICAgICAgICAgICAgc3ByaW50ZigiSW52YWxpZCBPcGVuSUQgbmFtZXNwYWNlIFVSSTogJXMiLCAkb2xkX25zKSk7CiAgICAgICAgfQoKICAgICAgICAkbW9kZSA9ICRtZXNzYWdlLT5nZXRBcmcoQXV0aF9PcGVuSURfT1BFTklEX05TLCAnbW9kZScpOwogICAgICAgIGlmICghJG1vZGUpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBBdXRoX09wZW5JRF9TZXJ2ZXJFcnJvcigkbWVzc2FnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTm8gbW9kZSB2YWx1ZSBpbiBtZXNzYWdlIik7CiAgICAgICAgfQoKICAgICAgICBpZiAoQXV0aF9PcGVuSUQ6OmlzRmFpbHVyZSgkbW9kZSkpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBBdXRoX09wZW5JRF9TZXJ2ZXJFcnJvcigkbWVzc2FnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbW9kZS0+bWVzc2FnZSk7CiAgICAgICAgfQoKICAgICAgICAkaGFuZGxlckNscyA9IEF1dGhfT3BlbklEOjphcnJheUdldCgkdGhpcy0+aGFuZGxlcnMsICRtb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5kZWZhdWx0RGVjb2RlcigkbWVzc2FnZSkpOwoKICAgICAgICBpZiAoIWlzX2EoJGhhbmRsZXJDbHMsICdBdXRoX09wZW5JRF9TZXJ2ZXJFcnJvcicpKSB7CiAgICAgICAgICAgIHJldHVybiBjYWxsX3VzZXJfZnVuY19hcnJheShhcnJheSgkaGFuZGxlckNscywgJ2Zyb21NZXNzYWdlJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheSgkbWVzc2FnZSwgJHRoaXMtPnNlcnZlcikpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiAkaGFuZGxlckNsczsKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gZGVmYXVsdERlY29kZXIoJG1lc3NhZ2UpCiAgICB7CiAgICAgICAgJG1vZGUgPSAkbWVzc2FnZS0+Z2V0QXJnKEF1dGhfT3BlbklEX09QRU5JRF9OUywgJ21vZGUnKTsKCiAgICAgICAgaWYgKEF1dGhfT3BlbklEOjppc0ZhaWx1cmUoJG1vZGUpKSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgQXV0aF9PcGVuSURfU2VydmVyRXJyb3IoJG1lc3NhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJG1vZGUtPm1lc3NhZ2UpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIG5ldyBBdXRoX09wZW5JRF9TZXJ2ZXJFcnJvcigkbWVzc2FnZSwKICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKCJVbnJlY29nbml6ZWQgT3BlbklEIG1vZGUgJXMiLCAkbW9kZSkpOwogICAgfQp9CgovKioKICogQW4gZXJyb3IgdGhhdCBpbmRpY2F0ZXMgYW4gZW5jb2RpbmcgcHJvYmxlbSBvY2N1cnJlZC4KICoKICogQHBhY2thZ2UgT3BlbklECiAqLwpjbGFzcyBBdXRoX09wZW5JRF9FbmNvZGluZ0Vycm9yIHsKICAgIGZ1bmN0aW9uIEF1dGhfT3BlbklEX0VuY29kaW5nRXJyb3IoJHJlc3BvbnNlKQogICAgewogICAgICAgICR0aGlzLT5yZXNwb25zZSA9ICRyZXNwb25zZTsKICAgIH0KfQoKLyoqCiAqIEFuIGVycm9yIHRoYXQgaW5kaWNhdGVzIHRoYXQgYSByZXNwb25zZSB3YXMgYWxyZWFkeSBzaWduZWQuCiAqCiAqIEBwYWNrYWdlIE9wZW5JRAogKi8KY2xhc3MgQXV0aF9PcGVuSURfQWxyZWFkeVNpZ25lZCBleHRlbmRzIEF1dGhfT3BlbklEX0VuY29kaW5nRXJyb3IgewogICAgLy8gVGhpcyByZXNwb25zZSBpcyBhbHJlYWR5IHNpZ25lZC4KfQoKLyoqCiAqIEFuIGVycm9yIHRoYXQgaW5kaWNhdGVzIHRoYXQgdGhlIGdpdmVuIHJldHVybl90byBpcyBub3QgdW5kZXIgdGhlCiAqIGdpdmVuIHRydXN0X3Jvb3QuCiAqCiAqIEBwYWNrYWdlIE9wZW5JRAogKi8KY2xhc3MgQXV0aF9PcGVuSURfVW50cnVzdGVkUmV0dXJuVVJMIGV4dGVuZHMgQXV0aF9PcGVuSURfU2VydmVyRXJyb3IgewogICAgZnVuY3Rpb24gQXV0aF9PcGVuSURfVW50cnVzdGVkUmV0dXJuVVJMKCRtZXNzYWdlLCAkcmV0dXJuX3RvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0cnVzdF9yb290KQogICAgewogICAgICAgIHBhcmVudDo6QXV0aF9PcGVuSURfU2VydmVyRXJyb3IoJG1lc3NhZ2UsICJVbnRydXN0ZWQgcmV0dXJuX3RvIFVSTCIpOwogICAgICAgICR0aGlzLT5yZXR1cm5fdG8gPSAkcmV0dXJuX3RvOwogICAgICAgICR0aGlzLT50cnVzdF9yb290ID0gJHRydXN0X3Jvb3Q7CiAgICB9CgogICAgZnVuY3Rpb24gdG9TdHJpbmcoKQogICAgewogICAgICAgIHJldHVybiBzcHJpbnRmKCJyZXR1cm5fdG8gJXMgbm90IHVuZGVyIHRydXN0X3Jvb3QgJXMiLAogICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5yZXR1cm5fdG8sICR0aGlzLT50cnVzdF9yb290KTsKICAgIH0KfQoKLyoqCiAqIEkgaGFuZGxlIHJlcXVlc3RzIGZvciBhbiBPcGVuSUQgc2VydmVyLgogKgogKiBTb21lIHR5cGVzIG9mIHJlcXVlc3RzICh0aG9zZSB3aGljaCBhcmUgbm90IGNoZWNraWQgcmVxdWVzdHMpIG1heQogKiBiZSBoYW5kZWQgdG8gbXkge0BsaW5rIGhhbmRsZVJlcXVlc3R9IG1ldGhvZCwgYW5kIEkgd2lsbCB0YWtlIGNhcmUKICogb2YgaXQgYW5kIHJldHVybiBhIHJlc3BvbnNlLgogKgogKiBGb3IgeW91ciBjb252ZW5pZW5jZSwgSSBhbHNvIHByb3ZpZGUgYW4gaW50ZXJmYWNlIHRvIHtAbGluawogKiBBdXRoX09wZW5JRF9EZWNvZGVyOjpkZWNvZGUoKX0gYW5kIHtAbGluawogKiBBdXRoX09wZW5JRF9TaWduaW5nRW5jb2Rlcjo6ZW5jb2RlKCl9IHRocm91Z2ggbXkgbWV0aG9kcyB7QGxpbmsKICogZGVjb2RlUmVxdWVzdH0gYW5kIHtAbGluayBlbmNvZGVSZXNwb25zZX0uCiAqCiAqIEFsbCBteSBzdGF0ZSBpcyBlbmNhcHN1bGF0ZWQgaW4gYW4ge0BsaW5rIEF1dGhfT3BlbklEX09wZW5JRFN0b3JlfS4KICoKICogRXhhbXBsZToKICoKICogPHByZT4gJG9zZXJ2ZXIgPSBuZXcgQXV0aF9PcGVuSURfU2VydmVyKEF1dGhfT3BlbklEX0ZpbGVTdG9yZSgkZGF0YV9wYXRoKSwKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJodHRwOi8vZXhhbXBsZS5jb20vb3AiKTsKICogJHJlcXVlc3QgPSAkb3NlcnZlci0+ZGVjb2RlUmVxdWVzdCgpOwogKiBpZiAoaW5fYXJyYXkoJHJlcXVlc3QtPm1vZGUsIGFycmF5KCdjaGVja2lkX2ltbWVkaWF0ZScsCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NoZWNraWRfc2V0dXAnKSkpIHsKICogICAgIGlmICgkYXBwLT5pc0F1dGhvcml6ZWQoJHJlcXVlc3QtPmlkZW50aXR5LCAkcmVxdWVzdC0+dHJ1c3Rfcm9vdCkpIHsKICogICAgICAgICAkcmVzcG9uc2UgPSAkcmVxdWVzdC0+YW5zd2VyKHRydWUpOwogKiAgICAgfSBlbHNlIGlmICgkcmVxdWVzdC0+aW1tZWRpYXRlKSB7CiAqICAgICAgICAgJHJlc3BvbnNlID0gJHJlcXVlc3QtPmFuc3dlcihmYWxzZSk7CiAqICAgICB9IGVsc2UgewogKiAgICAgICAgICRhcHAtPnNob3dEZWNpZGVQYWdlKCRyZXF1ZXN0KTsKICogICAgICAgICByZXR1cm47CiAqICAgICB9CiAqIH0gZWxzZSB7CiAqICAgICAkcmVzcG9uc2UgPSAkb3NlcnZlci0+aGFuZGxlUmVxdWVzdCgkcmVxdWVzdCk7CiAqIH0KICoKICogJHdlYnJlc3BvbnNlID0gJG9zZXJ2ZXItPmVuY29kZSgkcmVzcG9uc2UpOzwvcHJlPgogKgogKiBAcGFja2FnZSBPcGVuSUQKICovCmNsYXNzIEF1dGhfT3BlbklEX1NlcnZlciB7CiAgICBmdW5jdGlvbiBBdXRoX09wZW5JRF9TZXJ2ZXIoJHN0b3JlLCAkb3BfZW5kcG9pbnQ9bnVsbCkKICAgIHsKICAgICAgICAkdGhpcy0+c3RvcmUgPSAkc3RvcmU7CiAgICAgICAgJHRoaXMtPnNpZ25hdG9yeSA9IG5ldyBBdXRoX09wZW5JRF9TaWduYXRvcnkoJHRoaXMtPnN0b3JlKTsKICAgICAgICAkdGhpcy0+ZW5jb2RlciA9IG5ldyBBdXRoX09wZW5JRF9TaWduaW5nRW5jb2RlcigkdGhpcy0+c2lnbmF0b3J5KTsKICAgICAgICAkdGhpcy0+ZGVjb2RlciA9IG5ldyBBdXRoX09wZW5JRF9EZWNvZGVyKCR0aGlzKTsKICAgICAgICAkdGhpcy0+b3BfZW5kcG9pbnQgPSAkb3BfZW5kcG9pbnQ7CiAgICAgICAgJHRoaXMtPm5lZ290aWF0b3IgPSBBdXRoX09wZW5JRF9nZXREZWZhdWx0TmVnb3RpYXRvcigpOwogICAgfQoKICAgIC8qKgogICAgICogSGFuZGxlIGEgcmVxdWVzdC4gIEdpdmVuIGFuIHtAbGluayBBdXRoX09wZW5JRF9SZXF1ZXN0fSBvYmplY3QsCiAgICAgKiBjYWxsIHRoZSBhcHByb3ByaWF0ZSB7QGxpbmsgQXV0aF9PcGVuSURfU2VydmVyfSBtZXRob2QgdG8KICAgICAqIHByb2Nlc3MgdGhlIHJlcXVlc3QgYW5kIGdlbmVyYXRlIGEgcmVzcG9uc2UuCiAgICAgKgogICAgICogQHBhcmFtIEF1dGhfT3BlbklEX1JlcXVlc3QgJHJlcXVlc3QgQW4ge0BsaW5rIEF1dGhfT3BlbklEX1JlcXVlc3R9CiAgICAgKiByZXR1cm5lZCBieSB7QGxpbmsgQXV0aF9PcGVuSURfU2VydmVyOjpkZWNvZGVSZXF1ZXN0KCl9LgogICAgICoKICAgICAqIEByZXR1cm4gQXV0aF9PcGVuSURfU2VydmVyUmVzcG9uc2UgJHJlc3BvbnNlIEEgcmVzcG9uc2Ugb2JqZWN0CiAgICAgKiBjYXBhYmxlIG9mIGdlbmVyYXRpbmcgYSB1c2VyLWFnZW50IHJlcGx5LgogICAgICovCiAgICBmdW5jdGlvbiBoYW5kbGVSZXF1ZXN0KCRyZXF1ZXN0KQogICAgewogICAgICAgIGlmIChtZXRob2RfZXhpc3RzKCR0aGlzLCAib3BlbmlkXyIgLiAkcmVxdWVzdC0+bW9kZSkpIHsKICAgICAgICAgICAgJGhhbmRsZXIgPSBhcnJheSgkdGhpcywgIm9wZW5pZF8iIC4gJHJlcXVlc3QtPm1vZGUpOwogICAgICAgICAgICByZXR1cm4gY2FsbF91c2VyX2Z1bmMoJGhhbmRsZXIsICYkcmVxdWVzdCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgIC8qKgogICAgICogVGhlIGNhbGxiYWNrIGZvciAnY2hlY2tfYXV0aGVudGljYXRpb24nIG1lc3NhZ2VzLgogICAgICovCiAgICBmdW5jdGlvbiBvcGVuaWRfY2hlY2tfYXV0aGVudGljYXRpb24oJHJlcXVlc3QpCiAgICB7CiAgICAgICAgcmV0dXJuICRyZXF1ZXN0LT5hbnN3ZXIoJHRoaXMtPnNpZ25hdG9yeSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBUaGUgY2FsbGJhY2sgZm9yICdhc3NvY2lhdGUnIG1lc3NhZ2VzLgogICAgICovCiAgICBmdW5jdGlvbiBvcGVuaWRfYXNzb2NpYXRlKCRyZXF1ZXN0KQogICAgewogICAgICAgICRhc3NvY190eXBlID0gJHJlcXVlc3QtPmFzc29jX3R5cGU7CiAgICAgICAgJHNlc3Npb25fdHlwZSA9ICRyZXF1ZXN0LT5zZXNzaW9uLT5zZXNzaW9uX3R5cGU7CiAgICAgICAgaWYgKCR0aGlzLT5uZWdvdGlhdG9yLT5pc0FsbG93ZWQoJGFzc29jX3R5cGUsICRzZXNzaW9uX3R5cGUpKSB7CiAgICAgICAgICAgICRhc3NvYyA9ICR0aGlzLT5zaWduYXRvcnktPmNyZWF0ZUFzc29jaWF0aW9uKGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYXNzb2NfdHlwZSk7CiAgICAgICAgICAgIHJldHVybiAkcmVxdWVzdC0+YW5zd2VyKCRhc3NvYyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJG1lc3NhZ2UgPSBzcHJpbnRmKCdBc3NvY2lhdGlvbiB0eXBlICVzIGlzIG5vdCBzdXBwb3J0ZWQgd2l0aCAnLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Nlc3Npb24gdHlwZSAlcycsICRhc3NvY190eXBlLCAkc2Vzc2lvbl90eXBlKTsKICAgICAgICAgICAgbGlzdCgkcHJlZmVycmVkX2Fzc29jX3R5cGUsICRwcmVmZXJyZWRfc2Vzc2lvbl90eXBlKSA9CiAgICAgICAgICAgICAgICAkdGhpcy0+bmVnb3RpYXRvci0+Z2V0QWxsb3dlZFR5cGUoKTsKICAgICAgICAgICAgcmV0dXJuICRyZXF1ZXN0LT5hbnN3ZXJVbnN1cHBvcnRlZCgkbWVzc2FnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcHJlZmVycmVkX2Fzc29jX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHByZWZlcnJlZF9zZXNzaW9uX3R5cGUpOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEVuY29kZXMgYXMgcmVzcG9uc2UgaW4gdGhlIGFwcHJvcHJpYXRlIGZvcm1hdCBzdWl0YWJsZSBmb3IKICAgICAqIHNlbmRpbmcgdG8gdGhlIHVzZXIgYWdlbnQuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGVuY29kZVJlc3BvbnNlKCRyZXNwb25zZSkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmVuY29kZXItPmVuY29kZSgkcmVzcG9uc2UpOwogICAgfQoKICAgIC8qKgogICAgICogRGVjb2RlcyBhIHF1ZXJ5IGFyZ3MgYXJyYXkgaW50byB0aGUgYXBwcm9wcmlhdGUKICAgICAqIHtAbGluayBBdXRoX09wZW5JRF9SZXF1ZXN0fSBvYmplY3QuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGRlY29kZVJlcXVlc3QoJHF1ZXJ5PW51bGwpCiAgICB7CiAgICAgICAgaWYgKCRxdWVyeSA9PT0gbnVsbCkgewogICAgICAgICAgICAkcXVlcnkgPSBBdXRoX09wZW5JRDo6Z2V0UXVlcnkoKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkdGhpcy0+ZGVjb2Rlci0+ZGVjb2RlKCRxdWVyeSk7CiAgICB9Cn0KCgo=]]></data>
	</file>
	<file>
	  <filename>/openid-php-openid-782224d/Auth/OpenID/ServerRequest.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIE9wZW5JRCBTZXJ2ZXIgUmVxdWVzdAogKgogKiBAc2VlIEF1dGhfT3BlbklEX1NlcnZlcgogKgogKiBQSFAgdmVyc2lvbnMgNCBhbmQgNQogKgogKiBMSUNFTlNFOiBTZWUgdGhlIENPUFlJTkcgZmlsZSBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbi4KICoKICogQHBhY2thZ2UgT3BlbklECiAqIEBhdXRob3IgSmFuUmFpbiwgSW5jLiA8b3BlbmlkQGphbnJhaW4uY29tPgogKiBAY29weXJpZ2h0IDIwMDUtMjAwOCBKYW5yYWluLCBJbmMuCiAqIEBsaWNlbnNlIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCBBcGFjaGUKICovCgovKioKICogSW1wb3J0cwogKi8KcmVxdWlyZV9vbmNlICJBdXRoL09wZW5JRC5waHAiOwoKLyoqCiAqIE9iamVjdCB0aGF0IGhvbGRzIHRoZSBzdGF0ZSBvZiBhIHJlcXVlc3QgdG8gdGhlIE9wZW5JRCBzZXJ2ZXIKICoKICogV2l0aCBhY2Nlc3NvciBmdW5jdGlvbnMgdG8gZ2V0IGF0IHRoZSBpbnRlcm5hbCByZXF1ZXN0IGRhdGEuCiAqCiAqIEBzZWUgQXV0aF9PcGVuSURfU2VydmVyCiAqIEBwYWNrYWdlIE9wZW5JRAogKi8KY2xhc3MgQXV0aF9PcGVuSURfU2VydmVyUmVxdWVzdCB7CiAgICBmdW5jdGlvbiBBdXRoX09wZW5JRF9TZXJ2ZXJSZXF1ZXN0KCkKICAgIHsKICAgICAgICAkdGhpcy0+bW9kZSA9IG51bGw7CiAgICB9Cn0KCg==]]></data>
	</file>
	<file>
	  <filename>/openid-php-openid-782224d/Auth/OpenID/SQLiteStore.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBBbiBTUUxpdGUgc3RvcmUuCiAqCiAqIEBwYWNrYWdlIE9wZW5JRAogKi8KCi8qKgogKiBSZXF1aXJlIHRoZSBiYXNlIGNsYXNzIGZpbGUuCiAqLwpyZXF1aXJlX29uY2UgIkF1dGgvT3BlbklEL1NRTFN0b3JlLnBocCI7CgovKioKICogQW4gU1FMIHN0b3JlIHRoYXQgdXNlcyBTUUxpdGUgYXMgaXRzIGJhY2tlbmQuCiAqCiAqIEBwYWNrYWdlIE9wZW5JRAogKi8KY2xhc3MgQXV0aF9PcGVuSURfU1FMaXRlU3RvcmUgZXh0ZW5kcyBBdXRoX09wZW5JRF9TUUxTdG9yZSB7CiAgICBmdW5jdGlvbiBzZXRTUUwoKQogICAgewogICAgICAgICR0aGlzLT5zcWxbJ25vbmNlX3RhYmxlJ10gPQogICAgICAgICAgICAiQ1JFQVRFIFRBQkxFICVzIChzZXJ2ZXJfdXJsIFZBUkNIQVIoMjA0NyksIHRpbWVzdGFtcCBJTlRFR0VSLCAiLgogICAgICAgICAgICAic2FsdCBDSEFSKDQwKSwgVU5JUVVFIChzZXJ2ZXJfdXJsLCB0aW1lc3RhbXAsIHNhbHQpKSI7CgogICAgICAgICR0aGlzLT5zcWxbJ2Fzc29jX3RhYmxlJ10gPQogICAgICAgICAgICAiQ1JFQVRFIFRBQkxFICVzIChzZXJ2ZXJfdXJsIFZBUkNIQVIoMjA0NyksIGhhbmRsZSBWQVJDSEFSKDI1NSksICIuCiAgICAgICAgICAgICJzZWNyZXQgQkxPQigxMjgpLCBpc3N1ZWQgSU5URUdFUiwgbGlmZXRpbWUgSU5URUdFUiwgIi4KICAgICAgICAgICAgImFzc29jX3R5cGUgVkFSQ0hBUig2NCksIFBSSU1BUlkgS0VZIChzZXJ2ZXJfdXJsLCBoYW5kbGUpKSI7CgogICAgICAgICR0aGlzLT5zcWxbJ3NldF9hc3NvYyddID0KICAgICAgICAgICAgIklOU0VSVCBPUiBSRVBMQUNFIElOVE8gJXMgVkFMVUVTICg/LCA/LCA/LCA/LCA/LCA/KSI7CgogICAgICAgICR0aGlzLT5zcWxbJ2dldF9hc3NvY3MnXSA9CiAgICAgICAgICAgICJTRUxFQ1QgaGFuZGxlLCBzZWNyZXQsIGlzc3VlZCwgbGlmZXRpbWUsIGFzc29jX3R5cGUgRlJPTSAlcyAiLgogICAgICAgICAgICAiV0hFUkUgc2VydmVyX3VybCA9ID8iOwoKICAgICAgICAkdGhpcy0+c3FsWydnZXRfYXNzb2MnXSA9CiAgICAgICAgICAgICJTRUxFQ1QgaGFuZGxlLCBzZWNyZXQsIGlzc3VlZCwgbGlmZXRpbWUsIGFzc29jX3R5cGUgRlJPTSAlcyAiLgogICAgICAgICAgICAiV0hFUkUgc2VydmVyX3VybCA9ID8gQU5EIGhhbmRsZSA9ID8iOwoKICAgICAgICAkdGhpcy0+c3FsWydyZW1vdmVfYXNzb2MnXSA9CiAgICAgICAgICAgICJERUxFVEUgRlJPTSAlcyBXSEVSRSBzZXJ2ZXJfdXJsID0gPyBBTkQgaGFuZGxlID0gPyI7CgogICAgICAgICR0aGlzLT5zcWxbJ2FkZF9ub25jZSddID0KICAgICAgICAgICAgIklOU0VSVCBJTlRPICVzIChzZXJ2ZXJfdXJsLCB0aW1lc3RhbXAsIHNhbHQpIFZBTFVFUyAoPywgPywgPykiOwoKICAgICAgICAkdGhpcy0+c3FsWydjbGVhbl9ub25jZSddID0KICAgICAgICAgICAgIkRFTEVURSBGUk9NICVzIFdIRVJFIHRpbWVzdGFtcCA8ID8iOwoKICAgICAgICAkdGhpcy0+c3FsWydjbGVhbl9hc3NvYyddID0KICAgICAgICAgICAgIkRFTEVURSBGUk9NICVzIFdIRVJFIGlzc3VlZCArIGxpZmV0aW1lIDwgPyI7CiAgICB9CgogICAgLyoqCiAgICAgKiBAYWNjZXNzIHByaXZhdGUKICAgICAqLwogICAgZnVuY3Rpb24gX2FkZF9ub25jZSgkc2VydmVyX3VybCwgJHRpbWVzdGFtcCwgJHNhbHQpCiAgICB7CiAgICAgICAgLy8gUEVDTCBTUUxpdGUgZXh0ZW5zaW9ucyAxLjAuMyBhbmQgb2xkZXIgKDEuMC4zIGlzIHRoZQogICAgICAgIC8vIGN1cnJlbnQgcmVsZWFzZSBhdCB0aGUgdGltZSBvZiB0aGlzIHdyaXRpbmcpIGhhdmUgYSBicm9rZW4KICAgICAgICAvLyBzcWxpdGVfZXNjYXBlX3N0cmluZyBmdW5jdGlvbiB0aGF0IGJyZWFrcyB3aGVuIHBhc3NlZCB0aGUKICAgICAgICAvLyBlbXB0eSBzdHJpbmcuIFByZWZpeGluZyBhbGwgc3RyaW5ncyB3aXRoIG9uZSBjaGFyYWN0ZXIKICAgICAgICAvLyBrZWVwcyB0aGVtIHVuaXF1ZSBhbmQgYXZvaWRzIHRoaXMgYnVnLiBUaGUgbm9uY2UgdGFibGUgaXMKICAgICAgICAvLyB3cml0ZS1vbmx5LCBzbyB3ZSBkb24ndCBoYXZlIHRvIHdvcnJ5IGFib3V0IHVwZGF0aW5nIG90aGVyCiAgICAgICAgLy8gZnVuY3Rpb25zIHdpdGggdGhpcyBzYW1lIGJhZCBoYWNrLgogICAgICAgIHJldHVybiBwYXJlbnQ6Ol9hZGRfbm9uY2UoJ3gnIC4gJHNlcnZlcl91cmwsICR0aW1lc3RhbXAsICRzYWx0KTsKICAgIH0KfQoK]]></data>
	</file>
	<file>
	  <filename>/openid-php-openid-782224d/Auth/OpenID/SQLStore.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTUUwtYmFja2VkIE9wZW5JRCBzdG9yZXMuCiAqCiAqIFBIUCB2ZXJzaW9ucyA0IGFuZCA1CiAqCiAqIExJQ0VOU0U6IFNlZSB0aGUgQ09QWUlORyBmaWxlIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uLgogKgogKiBAcGFja2FnZSBPcGVuSUQKICogQGF1dGhvciBKYW5SYWluLCBJbmMuIDxvcGVuaWRAamFucmFpbi5jb20+CiAqIEBjb3B5cmlnaHQgMjAwNS0yMDA4IEphbnJhaW4sIEluYy4KICogQGxpY2Vuc2UgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIEFwYWNoZQogKi8KCi8qKgogKiBAYWNjZXNzIHByaXZhdGUKICovCnJlcXVpcmVfb25jZSAnQXV0aC9PcGVuSUQvSW50ZXJmYWNlLnBocCc7CnJlcXVpcmVfb25jZSAnQXV0aC9PcGVuSUQvTm9uY2UucGhwJzsKCi8qKgogKiBAYWNjZXNzIHByaXZhdGUKICovCnJlcXVpcmVfb25jZSAnQXV0aC9PcGVuSUQucGhwJzsKCi8qKgogKiBAYWNjZXNzIHByaXZhdGUKICovCnJlcXVpcmVfb25jZSAnQXV0aC9PcGVuSUQvTm9uY2UucGhwJzsKCi8qKgogKiBUaGlzIGlzIHRoZSBwYXJlbnQgY2xhc3MgZm9yIHRoZSBTUUwgc3RvcmVzLCB3aGljaCBjb250YWlucyB0aGUKICogbG9naWMgY29tbW9uIHRvIGFsbCBvZiB0aGUgU1FMIHN0b3Jlcy4KICoKICogVGhlIHRhYmxlIG5hbWVzIHVzZWQgYXJlIGRldGVybWluZWQgYnkgdGhlIGNsYXNzIHZhcmlhYmxlcwogKiBhc3NvY2lhdGlvbnNfdGFibGVfbmFtZSBhbmQgbm9uY2VzX3RhYmxlX25hbWUuICBUbyBjaGFuZ2UgdGhlIG5hbWUKICogb2YgdGhlIHRhYmxlcyB1c2VkLCBwYXNzIG5ldyB0YWJsZSBuYW1lcyBpbnRvIHRoZSBjb25zdHJ1Y3Rvci4KICoKICogVG8gY3JlYXRlIHRoZSB0YWJsZXMgd2l0aCB0aGUgcHJvcGVyIHNjaGVtYSwgc2VlIHRoZSBjcmVhdGVUYWJsZXMKICogbWV0aG9kLgogKgogKiBUaGlzIGNsYXNzIHNob3VsZG4ndCBiZSB1c2VkIGRpcmVjdGx5LiAgVXNlIG9uZSBvZiBpdHMgc3ViY2xhc3NlcwogKiBpbnN0ZWFkLCBhcyB0aG9zZSBjb250YWluIHRoZSBjb2RlIG5lY2Vzc2FyeSB0byB1c2UgYSBzcGVjaWZpYwogKiBkYXRhYmFzZS4gIElmIHlvdSdyZSBhbiBPcGVuSUQgaW50ZWdyYXRvciBhbmQgeW91J2QgbGlrZSB0byBjcmVhdGUKICogYW4gU1FMLWRyaXZlbiBzdG9yZSB0aGF0IHdyYXBzIGFuIGFwcGxpY2F0aW9uJ3MgZGF0YWJhc2UKICogYWJzdHJhY3Rpb24sIGJlIHN1cmUgdG8gY3JlYXRlIGEgc3ViY2xhc3Mgb2YKICoge0BsaW5rIEF1dGhfT3BlbklEX0RhdGFiYXNlQ29ubmVjdGlvbn0gdGhhdCBjYWxscyB0aGUgYXBwbGljYXRpb24ncwogKiBkYXRhYmFzZSBhYnN0cmFjdGlvbiBjYWxscy4gIFRoZW4sIHBhc3MgYW4gaW5zdGFuY2Ugb2YgeW91ciBuZXcKICogZGF0YWJhc2UgY29ubmVjdGlvbiBjbGFzcyB0byB5b3VyIFNRTFN0b3JlIHN1YmNsYXNzIGNvbnN0cnVjdG9yLgogKgogKiBBbGwgbWV0aG9kcyBvdGhlciB0aGFuIHRoZSBjb25zdHJ1Y3RvciBhbmQgY3JlYXRlVGFibGVzIHNob3VsZCBiZQogKiBjb25zaWRlcmVkIGltcGxlbWVudGF0aW9uIGRldGFpbHMuCiAqCiAqIEBwYWNrYWdlIE9wZW5JRAogKi8KY2xhc3MgQXV0aF9PcGVuSURfU1FMU3RvcmUgZXh0ZW5kcyBBdXRoX09wZW5JRF9PcGVuSURTdG9yZSB7CgogICAgLyoqCiAgICAgKiBUaGlzIGNyZWF0ZXMgYSBuZXcgU1FMU3RvcmUgaW5zdGFuY2UuICBJdCByZXF1aXJlcyBhbgogICAgICogZXN0YWJsaXNoZWQgZGF0YWJhc2UgY29ubmVjdGlvbiBiZSBnaXZlbiB0byBpdCwgYW5kIGl0IGFsbG93cwogICAgICogb3ZlcnJpZGluZyB0aGUgZGVmYXVsdCB0YWJsZSBuYW1lcy4KICAgICAqCiAgICAgKiBAcGFyYW0gY29ubmVjdGlvbiAkY29ubmVjdGlvbiBUaGlzIG11c3QgYmUgYW4gZXN0YWJsaXNoZWQKICAgICAqIGNvbm5lY3Rpb24gdG8gYSBkYXRhYmFzZSBvZiB0aGUgY29ycmVjdCB0eXBlIGZvciB0aGUgU1FMU3RvcmUKICAgICAqIHN1YmNsYXNzIHlvdSdyZSB1c2luZy4gIFRoaXMgbXVzdCBlaXRoZXIgYmUgYW4gUEVBUiBEQgogICAgICogY29ubmVjdGlvbiBoYW5kbGUgb3IgYW4gaW5zdGFuY2Ugb2YgYSBzdWJjbGFzcyBvZgogICAgICogQXV0aF9PcGVuSURfRGF0YWJhc2VDb25uZWN0aW9uLgogICAgICoKICAgICAqIEBwYXJhbSBhc3NvY2lhdGlvbnNfdGFibGU6IFRoaXMgaXMgYW4gb3B0aW9uYWwgcGFyYW1ldGVyIHRvCiAgICAgKiBzcGVjaWZ5IHRoZSBuYW1lIG9mIHRoZSB0YWJsZSB1c2VkIGZvciBzdG9yaW5nIGFzc29jaWF0aW9ucy4KICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzICdvaWRfYXNzb2NpYXRpb25zJy4KICAgICAqCiAgICAgKiBAcGFyYW0gbm9uY2VzX3RhYmxlOiBUaGlzIGlzIGFuIG9wdGlvbmFsIHBhcmFtZXRlciB0byBzcGVjaWZ5CiAgICAgKiB0aGUgbmFtZSBvZiB0aGUgdGFibGUgdXNlZCBmb3Igc3RvcmluZyBub25jZXMuICBUaGUgZGVmYXVsdAogICAgICogdmFsdWUgaXMgJ29pZF9ub25jZXMnLgogICAgICovCiAgICBmdW5jdGlvbiBBdXRoX09wZW5JRF9TUUxTdG9yZSgkY29ubmVjdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRhc3NvY2lhdGlvbnNfdGFibGUgPSBudWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJG5vbmNlc190YWJsZSA9IG51bGwpCiAgICB7CiAgICAgICAgJHRoaXMtPmFzc29jaWF0aW9uc190YWJsZV9uYW1lID0gIm9pZF9hc3NvY2lhdGlvbnMiOwogICAgICAgICR0aGlzLT5ub25jZXNfdGFibGVfbmFtZSA9ICJvaWRfbm9uY2VzIjsKCiAgICAgICAgLy8gQ2hlY2sgdGhlIGNvbm5lY3Rpb24gb2JqZWN0IHR5cGUgdG8gYmUgc3VyZSBpdCdzIGEgUEVBUgogICAgICAgIC8vIGRhdGFiYXNlIGNvbm5lY3Rpb24uCiAgICAgICAgaWYgKCEoaXNfb2JqZWN0KCRjb25uZWN0aW9uKSAmJgogICAgICAgICAgICAgIChpc19zdWJjbGFzc19vZigkY29ubmVjdGlvbiwgJ2RiX2NvbW1vbicpIHx8CiAgICAgICAgICAgICAgIGlzX3N1YmNsYXNzX29mKCRjb25uZWN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYXV0aF9vcGVuaWRfZGF0YWJhc2Vjb25uZWN0aW9uJykpKSkgewogICAgICAgICAgICB0cmlnZ2VyX2Vycm9yKCJBdXRoX09wZW5JRF9TUUxTdG9yZSBleHBlY3RlZCBQRUFSIGNvbm5lY3Rpb24gIiAuCiAgICAgICAgICAgICAgICAgICAgICAgICAgIm9iamVjdCAoZ290ICIuZ2V0X2NsYXNzKCRjb25uZWN0aW9uKS4iKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgRV9VU0VSX0VSUk9SKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgJHRoaXMtPmNvbm5lY3Rpb24gPSAkY29ubmVjdGlvbjsKCiAgICAgICAgLy8gQmUgc3VyZSB0byBzZXQgdGhlIGZldGNoIG1vZGUgc28gdGhlIHJlc3VsdHMgYXJlIGtleWVkIG9uCiAgICAgICAgLy8gY29sdW1uIG5hbWUgaW5zdGVhZCBvZiBjb2x1bW4gaW5kZXguICBUaGlzIGlzIGEgUEVBUgogICAgICAgIC8vIGNvbnN0YW50LCBzbyBvbmx5IHRyeSB0byB1c2UgaXQgaWYgUEVBUiBpcyBwcmVzZW50LiAgTm90ZQogICAgICAgIC8vIHRoYXQgQXV0aF9PcGVuaWRfRGF0YWJhc2Vjb25uZWN0aW9uIGluc3RhbmNlcyBuZWVkIG5vdAogICAgICAgIC8vIGltcGxlbWVudCA6OnNldEZldGNoTW9kZSBmb3IgdGhpcyByZWFzb24uCiAgICAgICAgaWYgKGlzX3N1YmNsYXNzX29mKCR0aGlzLT5jb25uZWN0aW9uLCAnZGJfY29tbW9uJykpIHsKICAgICAgICAgICAgJHRoaXMtPmNvbm5lY3Rpb24tPnNldEZldGNoTW9kZShEQl9GRVRDSE1PREVfQVNTT0MpOwogICAgICAgIH0KCiAgICAgICAgaWYgKCRhc3NvY2lhdGlvbnNfdGFibGUpIHsKICAgICAgICAgICAgJHRoaXMtPmFzc29jaWF0aW9uc190YWJsZV9uYW1lID0gJGFzc29jaWF0aW9uc190YWJsZTsKICAgICAgICB9CgogICAgICAgIGlmICgkbm9uY2VzX3RhYmxlKSB7CiAgICAgICAgICAgICR0aGlzLT5ub25jZXNfdGFibGVfbmFtZSA9ICRub25jZXNfdGFibGU7CiAgICAgICAgfQoKICAgICAgICAkdGhpcy0+bWF4X25vbmNlX2FnZSA9IDYgKiA2MCAqIDYwOwoKICAgICAgICAvLyBCZSBzdXJlIHRvIHJ1biB0aGUgZGF0YWJhc2UgcXVlcmllcyB3aXRoIGF1dG8tY29tbWl0IG1vZGUKICAgICAgICAvLyB0dXJuZWQgT0ZGLCBiZWNhdXNlIHdlIHdhbnQgZXZlcnkgZnVuY3Rpb24gdG8gcnVuIGluIGEKICAgICAgICAvLyB0cmFuc2FjdGlvbiwgaW1wbGljaXRseS4gIEFzIGEgcnVsZSwgbWV0aG9kcyBuYW1lZCB3aXRoIGEKICAgICAgICAvLyBsZWFkaW5nIHVuZGVyc2NvcmUgd2lsbCBOT1QgY29udHJvbCB0cmFuc2FjdGlvbiBiZWhhdmlvci4KICAgICAgICAvLyBDYWxsZXJzIG9mIHRoZXNlIG1ldGhvZHMgd2lsbCB3b3JyeSBhYm91dCB0cmFuc2FjdGlvbnMuCiAgICAgICAgJHRoaXMtPmNvbm5lY3Rpb24tPmF1dG9Db21taXQoZmFsc2UpOwoKICAgICAgICAvLyBDcmVhdGUgYW4gZW1wdHkgU1FMIHN0cmluZ3MgYXJyYXkuCiAgICAgICAgJHRoaXMtPnNxbCA9IGFycmF5KCk7CgogICAgICAgIC8vIENhbGwgdGhpcyBtZXRob2QgKHdoaWNoIHNob3VsZCBiZSBvdmVycmlkZGVuIGJ5IHN1YmNsYXNzZXMpCiAgICAgICAgLy8gdG8gcG9wdWxhdGUgdGhlICR0aGlzLT5zcWwgYXJyYXkgd2l0aCBTUUwgc3RyaW5ncy4KICAgICAgICAkdGhpcy0+c2V0U1FMKCk7CgogICAgICAgIC8vIFZlcmlmeSB0aGF0IGFsbCByZXF1aXJlZCBTUUwgc3RhdGVtZW50cyBoYXZlIGJlZW4gc2V0LCBhbmQKICAgICAgICAvLyByYWlzZSBhbiBlcnJvciBpZiBhbnkgZXhwZWN0ZWQgU1FMIHN0cmluZ3Mgd2VyZSBlaXRoZXIKICAgICAgICAvLyBhYnNlbnQgb3IgZW1wdHkuCiAgICAgICAgbGlzdCgkbWlzc2luZywgJGVtcHR5KSA9ICR0aGlzLT5fdmVyaWZ5U1FMKCk7CgogICAgICAgIGlmICgkbWlzc2luZykgewogICAgICAgICAgICB0cmlnZ2VyX2Vycm9yKCJFeHBlY3RlZCBrZXlzIGluIFNRTCBxdWVyeSBsaXN0OiAiIC4KICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsb2RlKCIsICIsICRtaXNzaW5nKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBFX1VTRVJfRVJST1IpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBpZiAoJGVtcHR5KSB7CiAgICAgICAgICAgIHRyaWdnZXJfZXJyb3IoIlNRTCBsaXN0IGtleXMgaGF2ZSBubyBTUUwgc3RyaW5nczogIiAuCiAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbG9kZSgiLCAiLCAkZW1wdHkpLAogICAgICAgICAgICAgICAgICAgICAgICAgIEVfVVNFUl9FUlJPUik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIC8vIEFkZCB0YWJsZSBuYW1lcyB0byBxdWVyaWVzLgogICAgICAgICR0aGlzLT5fZml4U1FMKCk7CiAgICB9CgogICAgZnVuY3Rpb24gdGFibGVFeGlzdHMoJHRhYmxlX25hbWUpCiAgICB7CiAgICAgICAgcmV0dXJuICEkdGhpcy0+aXNFcnJvcigKICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5jb25uZWN0aW9uLT5xdWVyeSgKICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKCJTRUxFQ1QgKiBGUk9NICVzIExJTUlUIDAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRhYmxlX25hbWUpKSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRydWUgaWYgJHZhbHVlIGNvbnN0aXR1dGVzIGEgZGF0YWJhc2UgZXJyb3I7IHJldHVybnMKICAgICAqIGZhbHNlIG90aGVyd2lzZS4KICAgICAqLwogICAgZnVuY3Rpb24gaXNFcnJvcigkdmFsdWUpCiAgICB7CiAgICAgICAgLyogQHZhciAkZ0NtcyBDbXNPYmplY3QgKi8KICAgICAgICBnbG9iYWwgJGdDbXM7CiAgICAgICAgLyogQHZhciAkZGIgcGVhcl9BRE9Db25uZWN0aW9uICovCiAgICAgICAgJGRiID0mICRnQ21zLT5HZXREYigpOwogICAgICAgICRpc0Vycm9yID0gJGRiLT5FcnJvck5vKCkgIT0gMDsKICAgICAgICBPcGVuSUQ6OkxvZygiU1FMU3RvcmU6aXNFcnJvciAiLnByaW50X3IoJHZhbHVlLCBUUlVFKS4iID0gIi4kZGItPkVycm9yTm8oKS4iICIuICBnZXRfY2xhc3MoJGRiKSk7CiAgICAgICAgLy9yZXR1cm4gUEVBUjo6aXNFcnJvcigkdmFsdWUpOwogICAgICAgIC8vIFRPRE8gQ2hlY2sgaWYgUEVBUiBpcyBwcmVzZW50LCBpZiBub3QgcmVxdWlyZSBjbGFzcyB3aXRoIHRoaXMgc3RhdGljIG1ldGhvZCBpbiBpdAogICAgICAgIHJldHVybiAkaXNFcnJvcjsKICAgIH0KCiAgICAvKioKICAgICAqIENvbnZlcnRzIGEgcXVlcnkgcmVzdWx0IHRvIGEgYm9vbGVhbi4gIElmIHRoZSByZXN1bHQgaXMgYQogICAgICogZGF0YWJhc2UgZXJyb3IgYWNjb3JkaW5nIHRvICR0aGlzLT5pc0Vycm9yKCksIHRoaXMgcmV0dXJucwogICAgICogZmFsc2U7IG90aGVyd2lzZSwgdGhpcyByZXR1cm5zIHRydWUuCiAgICAgKi8KICAgIGZ1bmN0aW9uIHJlc3VsdFRvQm9vbCgkb2JqKQogICAgewogICAgICAgIGlmICgkdGhpcy0+aXNFcnJvcigkb2JqKSkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIG92ZXJyaWRkZW4gYnkgc3ViY2xhc3Nlcy4gIFRoaXMgbWV0aG9kIGlzCiAgICAgKiBjYWxsZWQgYnkgdGhlIGNvbnN0cnVjdG9yIHRvIHNldCB2YWx1ZXMgaW4gJHRoaXMtPnNxbCwgd2hpY2ggaXMKICAgICAqIGFuIGFycmF5IGtleWVkIG9uIHNxbCBuYW1lLgogICAgICovCiAgICBmdW5jdGlvbiBzZXRTUUwoKQogICAgewogICAgfQoKICAgIC8qKgogICAgICogUmVzZXRzIHRoZSBzdG9yZSBieSByZW1vdmluZyBhbGwgcmVjb3JkcyBmcm9tIHRoZSBzdG9yZSdzCiAgICAgKiB0YWJsZXMuCiAgICAgKi8KICAgIGZ1bmN0aW9uIHJlc2V0KCkKICAgIHsKICAgICAgICAkdGhpcy0+Y29ubmVjdGlvbi0+cXVlcnkoc3ByaW50ZigiREVMRVRFIEZST00gJXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5hc3NvY2lhdGlvbnNfdGFibGVfbmFtZSkpOwoKICAgICAgICAkdGhpcy0+Y29ubmVjdGlvbi0+cXVlcnkoc3ByaW50ZigiREVMRVRFIEZST00gJXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5ub25jZXNfdGFibGVfbmFtZSkpOwogICAgfQoKICAgIC8qKgogICAgICogQGFjY2VzcyBwcml2YXRlCiAgICAgKi8KICAgIGZ1bmN0aW9uIF92ZXJpZnlTUUwoKQogICAgewogICAgICAgICRtaXNzaW5nID0gYXJyYXkoKTsKICAgICAgICAkZW1wdHkgPSBhcnJheSgpOwoKICAgICAgICAkcmVxdWlyZWRfc3FsX2tleXMgPSBhcnJheSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbm9uY2VfdGFibGUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhc3NvY190YWJsZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldF9hc3NvYycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2dldF9hc3NvYycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2dldF9hc3NvY3MnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyZW1vdmVfYXNzb2MnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgZm9yZWFjaCAoJHJlcXVpcmVkX3NxbF9rZXlzIGFzICRrZXkpIHsKICAgICAgICAgICAgaWYgKCFhcnJheV9rZXlfZXhpc3RzKCRrZXksICR0aGlzLT5zcWwpKSB7CiAgICAgICAgICAgICAgICAkbWlzc2luZ1tdID0gJGtleTsKICAgICAgICAgICAgfSBlbHNlIGlmICghJHRoaXMtPnNxbFska2V5XSkgewogICAgICAgICAgICAgICAgJGVtcHR5W10gPSAka2V5OwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gYXJyYXkoJG1pc3NpbmcsICRlbXB0eSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAYWNjZXNzIHByaXZhdGUKICAgICAqLwogICAgZnVuY3Rpb24gX2ZpeFNRTCgpCiAgICB7CiAgICAgICAgJHJlcGxhY2VtZW50cyA9IGFycmF5KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJyA9PiAkdGhpcy0+bm9uY2VzX3RhYmxlX25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdrZXlzJyA9PiBhcnJheSgnbm9uY2VfdGFibGUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FkZF9ub25jZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY2xlYW5fbm9uY2UnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJyA9PiAkdGhpcy0+YXNzb2NpYXRpb25zX3RhYmxlX25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdrZXlzJyA9PiBhcnJheSgnYXNzb2NfdGFibGUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldF9hc3NvYycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZ2V0X2Fzc29jJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdnZXRfYXNzb2NzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyZW1vdmVfYXNzb2MnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NsZWFuX2Fzc29jJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICBmb3JlYWNoICgkcmVwbGFjZW1lbnRzIGFzICRpdGVtKSB7CiAgICAgICAgICAgICR2YWx1ZSA9ICRpdGVtWyd2YWx1ZSddOwogICAgICAgICAgICAka2V5cyA9ICRpdGVtWydrZXlzJ107CgogICAgICAgICAgICBmb3JlYWNoICgka2V5cyBhcyAkaykgewogICAgICAgICAgICAgICAgaWYgKGlzX2FycmF5KCR0aGlzLT5zcWxbJGtdKSkgewogICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKCR0aGlzLT5zcWxbJGtdIGFzICRwYXJ0X2tleSA9PiAkcGFydF92YWx1ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+c3FsWyRrXVskcGFydF9rZXldID0gc3ByaW50ZigkcGFydF92YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICR0aGlzLT5zcWxbJGtdID0gc3ByaW50ZigkdGhpcy0+c3FsWyRrXSwgJHZhbHVlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBibG9iRGVjb2RlKCRibG9iKQogICAgewogICAgICAgIHJldHVybiAkYmxvYjsKICAgIH0KCiAgICBmdW5jdGlvbiBibG9iRW5jb2RlKCRzdHIpCiAgICB7CiAgICAgICAgcmV0dXJuICRzdHI7CiAgICB9CgogICAgZnVuY3Rpb24gY3JlYXRlVGFibGVzKCkKICAgIHsKICAgICAgICAkdGhpcy0+Y29ubmVjdGlvbi0+YXV0b0NvbW1pdCh0cnVlKTsKICAgICAgICAkbiA9ICR0aGlzLT5jcmVhdGVfbm9uY2VfdGFibGUoKTsKICAgICAgICAkYSA9ICR0aGlzLT5jcmVhdGVfYXNzb2NfdGFibGUoKTsKICAgICAgICAkdGhpcy0+Y29ubmVjdGlvbi0+YXV0b0NvbW1pdChmYWxzZSk7CgogICAgICAgIGlmICgkbiAmJiAkYSkgewogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGNyZWF0ZV9ub25jZV90YWJsZSgpCiAgICB7CiAgICAgICAgaWYgKCEkdGhpcy0+dGFibGVFeGlzdHMoJHRoaXMtPm5vbmNlc190YWJsZV9uYW1lKSkgewogICAgICAgICAgICAkciA9ICR0aGlzLT5jb25uZWN0aW9uLT5xdWVyeSgkdGhpcy0+c3FsWydub25jZV90YWJsZSddKTsKICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5yZXN1bHRUb0Jvb2woJHIpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICBmdW5jdGlvbiBjcmVhdGVfYXNzb2NfdGFibGUoKQogICAgewogICAgICAgIGlmICghJHRoaXMtPnRhYmxlRXhpc3RzKCR0aGlzLT5hc3NvY2lhdGlvbnNfdGFibGVfbmFtZSkpIHsKICAgICAgICAgICAgJHIgPSAkdGhpcy0+Y29ubmVjdGlvbi0+cXVlcnkoJHRoaXMtPnNxbFsnYXNzb2NfdGFibGUnXSk7CiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+cmVzdWx0VG9Cb29sKCRyKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgLyoqCiAgICAgKiBAYWNjZXNzIHByaXZhdGUKICAgICAqLwogICAgZnVuY3Rpb24gX3NldF9hc3NvYygkc2VydmVyX3VybCwgJGhhbmRsZSwgJHNlY3JldCwgJGlzc3VlZCwKICAgICAgICAgICAgICAgICAgICAgICAgJGxpZmV0aW1lLCAkYXNzb2NfdHlwZSkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmNvbm5lY3Rpb24tPnF1ZXJ5KCR0aGlzLT5zcWxbJ3NldF9hc3NvYyddLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXkoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2VydmVyX3VybCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRoYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2VjcmV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGlzc3VlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRsaWZldGltZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRhc3NvY190eXBlKSk7CiAgICB9CgogICAgZnVuY3Rpb24gc3RvcmVBc3NvY2lhdGlvbigkc2VydmVyX3VybCwgJGFzc29jaWF0aW9uKQogICAgewogICAgICAgIGlmICgkdGhpcy0+cmVzdWx0VG9Cb29sKCR0aGlzLT5fc2V0X2Fzc29jKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzZXJ2ZXJfdXJsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRhc3NvY2lhdGlvbi0+aGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5ibG9iRW5jb2RlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRhc3NvY2lhdGlvbi0+c2VjcmV0KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYXNzb2NpYXRpb24tPmlzc3VlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYXNzb2NpYXRpb24tPmxpZmV0aW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRhc3NvY2lhdGlvbi0+YXNzb2NfdHlwZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpKSB7CiAgICAgICAgICAgICR0aGlzLT5jb25uZWN0aW9uLT5jb21taXQoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkdGhpcy0+Y29ubmVjdGlvbi0+cm9sbGJhY2soKTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBAYWNjZXNzIHByaXZhdGUKICAgICAqLwogICAgZnVuY3Rpb24gX2dldF9hc3NvYygkc2VydmVyX3VybCwgJGhhbmRsZSkKICAgIHsKICAgICAgICAkcmVzdWx0ID0gJHRoaXMtPmNvbm5lY3Rpb24tPmdldFJvdygkdGhpcy0+c3FsWydnZXRfYXNzb2MnXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheSgkc2VydmVyX3VybCwgJGhhbmRsZSkpOwogICAgICAgIGlmICgkdGhpcy0+aXNFcnJvcigkcmVzdWx0KSkgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gJHJlc3VsdDsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBAYWNjZXNzIHByaXZhdGUKICAgICAqLwogICAgZnVuY3Rpb24gX2dldF9hc3NvY3MoJHNlcnZlcl91cmwpCiAgICB7CiAgICAgICAgJHJlc3VsdCA9ICR0aGlzLT5jb25uZWN0aW9uLT5nZXRBbGwoJHRoaXMtPnNxbFsnZ2V0X2Fzc29jcyddLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5KCRzZXJ2ZXJfdXJsKSk7CgogICAgICAgIGlmICgkdGhpcy0+aXNFcnJvcigkcmVzdWx0KSkgewogICAgICAgICAgICByZXR1cm4gYXJyYXkoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gJHJlc3VsdDsKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gcmVtb3ZlQXNzb2NpYXRpb24oJHNlcnZlcl91cmwsICRoYW5kbGUpCiAgICB7CiAgICAgICAgaWYgKCR0aGlzLT5fZ2V0X2Fzc29jKCRzZXJ2ZXJfdXJsLCAkaGFuZGxlKSA9PSBudWxsKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CgogICAgICAgIGlmICgkdGhpcy0+cmVzdWx0VG9Cb29sKCR0aGlzLT5jb25uZWN0aW9uLT5xdWVyeSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnNxbFsncmVtb3ZlX2Fzc29jJ10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5KCRzZXJ2ZXJfdXJsLCAkaGFuZGxlKSkpKSB7CiAgICAgICAgICAgICR0aGlzLT5jb25uZWN0aW9uLT5jb21taXQoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkdGhpcy0+Y29ubmVjdGlvbi0+cm9sbGJhY2soKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIGZ1bmN0aW9uIGdldEFzc29jaWF0aW9uKCRzZXJ2ZXJfdXJsLCAkaGFuZGxlID0gbnVsbCkKICAgIHsKICAgICAgICBpZiAoJGhhbmRsZSAhPT0gbnVsbCkgewogICAgICAgICAgICAkYXNzb2MgPSAkdGhpcy0+X2dldF9hc3NvYygkc2VydmVyX3VybCwgJGhhbmRsZSk7CgogICAgICAgICAgICAkYXNzb2NzID0gYXJyYXkoKTsKICAgICAgICAgICAgaWYgKCRhc3NvYykgewogICAgICAgICAgICAgICAgJGFzc29jc1tdID0gJGFzc29jOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJGFzc29jcyA9ICR0aGlzLT5fZ2V0X2Fzc29jcygkc2VydmVyX3VybCk7CiAgICAgICAgfQoKICAgICAgICBpZiAoISRhc3NvY3MgfHwgKGNvdW50KCRhc3NvY3MpID09IDApKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRhc3NvY2lhdGlvbnMgPSBhcnJheSgpOwoKICAgICAgICAgICAgZm9yZWFjaCAoJGFzc29jcyBhcyAkYXNzb2Nfcm93KSB7CiAgICAgICAgICAgICAgICAkYXNzb2MgPSBuZXcgQXV0aF9PcGVuSURfQXNzb2NpYXRpb24oJGFzc29jX3Jvd1snaGFuZGxlJ10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGFzc29jX3Jvd1snc2VjcmV0J10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGFzc29jX3Jvd1snaXNzdWVkJ10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGFzc29jX3Jvd1snbGlmZXRpbWUnXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYXNzb2Nfcm93Wydhc3NvY190eXBlJ10pOwoKICAgICAgICAgICAgICAgICRhc3NvYy0+c2VjcmV0ID0gJHRoaXMtPmJsb2JEZWNvZGUoJGFzc29jLT5zZWNyZXQpOwoKICAgICAgICAgICAgICAgIGlmICgkYXNzb2MtPmdldEV4cGlyZXNJbigpID09IDApIHsKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+cmVtb3ZlQXNzb2NpYXRpb24oJHNlcnZlcl91cmwsICRhc3NvYy0+aGFuZGxlKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJGFzc29jaWF0aW9uc1tdID0gYXJyYXkoJGFzc29jLT5pc3N1ZWQsICRhc3NvYyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICgkYXNzb2NpYXRpb25zKSB7CiAgICAgICAgICAgICAgICAkaXNzdWVkID0gYXJyYXkoKTsKICAgICAgICAgICAgICAgICRhc3NvY3MgPSBhcnJheSgpOwogICAgICAgICAgICAgICAgZm9yZWFjaCAoJGFzc29jaWF0aW9ucyBhcyAka2V5ID0+ICRhc3NvYykgewogICAgICAgICAgICAgICAgICAgICRpc3N1ZWRbJGtleV0gPSAkYXNzb2NbMF07CiAgICAgICAgICAgICAgICAgICAgJGFzc29jc1ska2V5XSA9ICRhc3NvY1sxXTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBhcnJheV9tdWx0aXNvcnQoJGlzc3VlZCwgU09SVF9ERVNDLCAkYXNzb2NzLCBTT1JUX0RFU0MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGFzc29jaWF0aW9ucyk7CgogICAgICAgICAgICAgICAgLy8gcmV0dXJuIHRoZSBtb3N0IHJlY2VudGx5IGlzc3VlZCBvbmUuCiAgICAgICAgICAgICAgICBsaXN0KCRpc3N1ZWQsICRhc3NvYykgPSAkYXNzb2NpYXRpb25zWzBdOwogICAgICAgICAgICAgICAgcmV0dXJuICRhc3NvYzsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQGFjY2VzcyBwcml2YXRlCiAgICAgKi8KICAgIGZ1bmN0aW9uIF9hZGRfbm9uY2UoJHNlcnZlcl91cmwsICR0aW1lc3RhbXAsICRzYWx0KQogICAgewogICAgICAgICRzcWwgPSAkdGhpcy0+c3FsWydhZGRfbm9uY2UnXTsKICAgICAgICAkcmVzdWx0ID0gJHRoaXMtPmNvbm5lY3Rpb24tPnF1ZXJ5KCRzcWwsIGFycmF5KCRzZXJ2ZXJfdXJsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRpbWVzdGFtcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzYWx0KSk7CiAgICAgICAgaWYgKCR0aGlzLT5pc0Vycm9yKCRyZXN1bHQpKSB7CiAgICAgICAgICAgICR0aGlzLT5jb25uZWN0aW9uLT5yb2xsYmFjaygpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICR0aGlzLT5jb25uZWN0aW9uLT5jb21taXQoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICR0aGlzLT5yZXN1bHRUb0Jvb2woJHJlc3VsdCk7CiAgICB9CgogICAgZnVuY3Rpb24gdXNlTm9uY2UoJHNlcnZlcl91cmwsICR0aW1lc3RhbXAsICRzYWx0KQogICAgewogICAgICAgIGdsb2JhbCAkQXV0aF9PcGVuSURfU0tFVzsKCiAgICAgICAgaWYgKCBhYnMoJHRpbWVzdGFtcCAtIHRpbWUoKSkgPiAkQXV0aF9PcGVuSURfU0tFVyApIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICR0aGlzLT5fYWRkX25vbmNlKCRzZXJ2ZXJfdXJsLCAkdGltZXN0YW1wLCAkc2FsdCk7CiAgICB9CgogICAgLyoqCiAgICAgKiAiT2N0aWZpZXMiIGEgYmluYXJ5IHN0cmluZyBieSByZXR1cm5pbmcgYSBzdHJpbmcgd2l0aCBlc2NhcGVkCiAgICAgKiBvY3RhbCBieXRlcy4gIFRoaXMgaXMgdXNlZCBmb3IgcHJlcGFyaW5nIGJpbmFyeSBkYXRhIGZvcgogICAgICogUG9zdGdyZVNRTCBCWVRFQSBmaWVsZHMuCiAgICAgKgogICAgICogQGFjY2VzcyBwcml2YXRlCiAgICAgKi8KICAgIGZ1bmN0aW9uIF9vY3RpZnkoJHN0cikKICAgIHsKICAgICAgICAkcmVzdWx0ID0gIiI7CiAgICAgICAgZm9yICgkaSA9IDA7ICRpIDwgQXV0aF9PcGVuSUQ6OmJ5dGVzKCRzdHIpOyAkaSsrKSB7CiAgICAgICAgICAgICRjaCA9IHN1YnN0cigkc3RyLCAkaSwgMSk7CiAgICAgICAgICAgIGlmICgkY2ggPT0gIlxcIikgewogICAgICAgICAgICAgICAgJHJlc3VsdCAuPSAiXFxcXFxcXFwiOwogICAgICAgICAgICB9IGVsc2UgaWYgKG9yZCgkY2gpID09IDApIHsKICAgICAgICAgICAgICAgICRyZXN1bHQgLj0gIlxcXFwwMDAiOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJHJlc3VsdCAuPSAiXFwiIC4gc3RydmFsKGRlY29jdChvcmQoJGNoKSkpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiAkcmVzdWx0OwogICAgfQoKICAgIC8qKgogICAgICogIlVub2N0aWZpZXMiIG9jdGFsLWVzY2FwZWQgZGF0YSBmcm9tIFBvc3RncmVTUUwgYW5kIHJldHVybnMgdGhlCiAgICAgKiByZXN1bHRpbmcgQVNDSUkgKHBvc3NpYmx5IGJpbmFyeSkgc3RyaW5nLgogICAgICoKICAgICAqIEBhY2Nlc3MgcHJpdmF0ZQogICAgICovCiAgICBmdW5jdGlvbiBfdW5vY3RpZnkoJHN0cikKICAgIHsKICAgICAgICAkcmVzdWx0ID0gIiI7CiAgICAgICAgJGkgPSAwOwogICAgICAgIHdoaWxlICgkaSA8IHN0cmxlbigkc3RyKSkgewogICAgICAgICAgICAkY2hhciA9ICRzdHJbJGldOwogICAgICAgICAgICBpZiAoJGNoYXIgPT0gIlxcIikgewogICAgICAgICAgICAgICAgLy8gTG9vayB0byBzZWUgaWYgdGhlIG5leHQgY2hhciBpcyBhIGJhY2tzbGFzaCBhbmQKICAgICAgICAgICAgICAgIC8vIGFwcGVuZCBpdC4KICAgICAgICAgICAgICAgIGlmICgkc3RyWyRpICsgMV0gIT0gIlxcIikgewogICAgICAgICAgICAgICAgICAgICRvY3RhbF9kaWdpdHMgPSBzdWJzdHIoJHN0ciwgJGkgKyAxLCAzKTsKICAgICAgICAgICAgICAgICAgICAkZGVjID0gb2N0ZGVjKCRvY3RhbF9kaWdpdHMpOwogICAgICAgICAgICAgICAgICAgICRjaGFyID0gY2hyKCRkZWMpOwogICAgICAgICAgICAgICAgICAgICRpICs9IDQ7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICRjaGFyID0gIlxcIjsKICAgICAgICAgICAgICAgICAgICAkaSArPSAyOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJGkgKz0gMTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHJlc3VsdCAuPSAkY2hhcjsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkcmVzdWx0OwogICAgfQoKICAgIGZ1bmN0aW9uIGNsZWFudXBOb25jZXMoKQogICAgewogICAgICAgIGdsb2JhbCAkQXV0aF9PcGVuSURfU0tFVzsKICAgICAgICAkdiA9IHRpbWUoKSAtICRBdXRoX09wZW5JRF9TS0VXOwoKICAgICAgICAkdGhpcy0+Y29ubmVjdGlvbi0+cXVlcnkoJHRoaXMtPnNxbFsnY2xlYW5fbm9uY2UnXSwgYXJyYXkoJHYpKTsKICAgICAgICAkbnVtID0gJHRoaXMtPmNvbm5lY3Rpb24tPmFmZmVjdGVkUm93cygpOwogICAgICAgICR0aGlzLT5jb25uZWN0aW9uLT5jb21taXQoKTsKICAgICAgICByZXR1cm4gJG51bTsKICAgIH0KCiAgICBmdW5jdGlvbiBjbGVhbnVwQXNzb2NpYXRpb25zKCkKICAgIHsKICAgICAgICAkdGhpcy0+Y29ubmVjdGlvbi0+cXVlcnkoJHRoaXMtPnNxbFsnY2xlYW5fYXNzb2MnXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXkodGltZSgpKSk7CiAgICAgICAgJG51bSA9ICR0aGlzLT5jb25uZWN0aW9uLT5hZmZlY3RlZFJvd3MoKTsKICAgICAgICAkdGhpcy0+Y29ubmVjdGlvbi0+Y29tbWl0KCk7CiAgICAgICAgcmV0dXJuICRudW07CiAgICB9Cn0KCgo=]]></data>
	</file>
	<file>
	  <filename>/openid-php-openid-782224d/Auth/OpenID/SReg.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTaW1wbGUgcmVnaXN0cmF0aW9uIHJlcXVlc3QgYW5kIHJlc3BvbnNlIHBhcnNpbmcgYW5kIG9iamVjdAogKiByZXByZXNlbnRhdGlvbi4KICoKICogVGhpcyBtb2R1bGUgY29udGFpbnMgb2JqZWN0cyByZXByZXNlbnRpbmcgc2ltcGxlIHJlZ2lzdHJhdGlvbgogKiByZXF1ZXN0cyBhbmQgcmVzcG9uc2VzIHRoYXQgY2FuIGJlIHVzZWQgd2l0aCBib3RoIE9wZW5JRCByZWx5aW5nCiAqIHBhcnRpZXMgYW5kIE9wZW5JRCBwcm92aWRlcnMuCiAqCiAqIDEuIFRoZSByZWx5aW5nIHBhcnR5IGNyZWF0ZXMgYSByZXF1ZXN0IG9iamVjdCBhbmQgYWRkcyBpdCB0byB0aGUKICoge0BsaW5rIEF1dGhfT3BlbklEX0F1dGhSZXF1ZXN0fSBvYmplY3QgYmVmb3JlIG1ha2luZyB0aGUKICogY2hlY2tpZCByZXF1ZXN0IHRvIHRoZSBPcGVuSUQgcHJvdmlkZXI6CiAqCiAqICAgJHNyZWdfcmVxID0gQXV0aF9PcGVuSURfU1JlZ1JlcXVlc3Q6OmJ1aWxkKGFycmF5KCdlbWFpbCcpKTsKICogICAkYXV0aF9yZXF1ZXN0LT5hZGRFeHRlbnNpb24oJHNyZWdfcmVxKTsKICoKICogMi4gVGhlIE9wZW5JRCBwcm92aWRlciBleHRyYWN0cyB0aGUgc2ltcGxlIHJlZ2lzdHJhdGlvbiByZXF1ZXN0CiAqIGZyb20gdGhlIE9wZW5JRCByZXF1ZXN0IHVzaW5nIHtAbGluawogKiBBdXRoX09wZW5JRF9TUmVnUmVxdWVzdDo6ZnJvbU9wZW5JRFJlcXVlc3R9LCBnZXRzIHRoZSB1c2VyJ3MKICogYXBwcm92YWwgYW5kIGRhdGEsIGNyZWF0ZXMgYW4ge0BsaW5rIEF1dGhfT3BlbklEX1NSZWdSZXNwb25zZX0KICogb2JqZWN0IGFuZCBhZGRzIGl0IHRvIHRoZSBpZF9yZXMgcmVzcG9uc2U6CiAqCiAqICAgJHNyZWdfcmVxID0gQXV0aF9PcGVuSURfU1JlZ1JlcXVlc3Q6OmZyb21PcGVuSURSZXF1ZXN0KAogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkY2hlY2tpZF9yZXF1ZXN0KTsKICogICAvLyBbIGdldCB0aGUgdXNlcidzIGFwcHJvdmFsIGFuZCBkYXRhLCBpbmZvcm1pbmcgdGhlIHVzZXIgdGhhdAogKiAgIC8vICAgdGhlIGZpZWxkcyBpbiBzcmVnX3Jlc3BvbnNlIHdlcmUgcmVxdWVzdGVkIF0KICogICAkc3JlZ19yZXNwID0gQXV0aF9PcGVuSURfU1JlZ1Jlc3BvbnNlOjpleHRyYWN0UmVzcG9uc2UoCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzcmVnX3JlcSwgJHVzZXJfZGF0YSk7CiAqICAgJHNyZWdfcmVzcC0+dG9NZXNzYWdlKCRvcGVuaWRfcmVzcG9uc2UtPmZpZWxkcyk7CiAqCiAqIDMuIFRoZSByZWx5aW5nIHBhcnR5IHVzZXMge0BsaW5rCiAqIEF1dGhfT3BlbklEX1NSZWdSZXNwb25zZTo6ZnJvbVN1Y2Nlc3NSZXNwb25zZX0gdG8gZXh0cmFjdCB0aGUgZGF0YQogKiBmcm9tIHRoZSBPcGVuSUQgcmVzcG9uc2U6CiAqCiAqICAgJHNyZWdfcmVzcCA9IEF1dGhfT3BlbklEX1NSZWdSZXNwb25zZTo6ZnJvbVN1Y2Nlc3NSZXNwb25zZSgKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHN1Y2Nlc3NfcmVzcG9uc2UpOwogKgogKiBAcGFja2FnZSBPcGVuSUQKICovCgovKioKICogSW1wb3J0IG1lc3NhZ2UgYW5kIGV4dGVuc2lvbiBpbnRlcm5hbHMuCiAqLwpyZXF1aXJlX29uY2UgJ0F1dGgvT3BlbklEL01lc3NhZ2UucGhwJzsKcmVxdWlyZV9vbmNlICdBdXRoL09wZW5JRC9FeHRlbnNpb24ucGhwJzsKCi8vIFRoZSBkYXRhIGZpZWxkcyB0aGF0IGFyZSBsaXN0ZWQgaW4gdGhlIHNyZWcgc3BlYwpnbG9iYWwgJEF1dGhfT3BlbklEX3NyZWdfZGF0YV9maWVsZHM7CiRBdXRoX09wZW5JRF9zcmVnX2RhdGFfZmllbGRzID0gYXJyYXkoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Z1bGxuYW1lJyA9PiAnRnVsbCBOYW1lJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmlja25hbWUnID0+ICdOaWNrbmFtZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2RvYicgPT4gJ0RhdGUgb2YgQmlydGgnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlbWFpbCcgPT4gJ0UtbWFpbCBBZGRyZXNzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZ2VuZGVyJyA9PiAnR2VuZGVyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncG9zdGNvZGUnID0+ICdQb3N0YWwgQ29kZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NvdW50cnknID0+ICdDb3VudHJ5JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbGFuZ3VhZ2UnID0+ICdMYW5ndWFnZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RpbWV6b25lJyA9PiAnVGltZSBab25lJyk7CgovKioKICogQ2hlY2sgdG8gc2VlIHRoYXQgdGhlIGdpdmVuIHZhbHVlIGlzIGEgdmFsaWQgc2ltcGxlIHJlZ2lzdHJhdGlvbgogKiBkYXRhIGZpZWxkIG5hbWUuICBSZXR1cm4gdHJ1ZSBpZiBzbywgZmFsc2UgaWYgbm90LgogKi8KZnVuY3Rpb24gQXV0aF9PcGVuSURfY2hlY2tGaWVsZE5hbWUoJGZpZWxkX25hbWUpCnsKICAgIGdsb2JhbCAkQXV0aF9PcGVuSURfc3JlZ19kYXRhX2ZpZWxkczsKCiAgICBpZiAoIWluX2FycmF5KCRmaWVsZF9uYW1lLCBhcnJheV9rZXlzKCRBdXRoX09wZW5JRF9zcmVnX2RhdGFfZmllbGRzKSkpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKfQoKLy8gVVJJIHVzZWQgaW4gdGhlIHdpbGQgZm9yIFlhZGlzIGRvY3VtZW50cyBhZHZlcnRpc2luZyBzaW1wbGUKLy8gcmVnaXN0cmF0aW9uIHN1cHBvcnQKZGVmaW5lKCdBdXRoX09wZW5JRF9TUkVHX05TX1VSSV8xXzAnLCAnaHR0cDovL29wZW5pZC5uZXQvc3JlZy8xLjAnKTsKCi8vIFVSSSBpbiB0aGUgZHJhZnQgc3BlY2lmaWNhdGlvbiBmb3Igc2ltcGxlIHJlZ2lzdHJhdGlvbiAxLjEKLy8gPGh0dHA6Ly9vcGVuaWQubmV0L3NwZWNzL29wZW5pZC1zaW1wbGUtcmVnaXN0cmF0aW9uLWV4dGVuc2lvbi0xXzEtMDEuaHRtbD4KZGVmaW5lKCdBdXRoX09wZW5JRF9TUkVHX05TX1VSSV8xXzEnLCAnaHR0cDovL29wZW5pZC5uZXQvZXh0ZW5zaW9ucy9zcmVnLzEuMScpOwoKLy8gVGhpcyBhdHRyaWJ1dGUgd2lsbCBhbHdheXMgaG9sZCB0aGUgcHJlZmVycmVkIFVSSSB0byB1c2Ugd2hlbgovLyBhZGRpbmcgc3JlZyBzdXBwb3J0IHRvIGFuIFhSRFMgZmlsZSBvciBpbiBhbiBPcGVuSUQgbmFtZXNwYWNlCi8vIGRlY2xhcmF0aW9uLgpkZWZpbmUoJ0F1dGhfT3BlbklEX1NSRUdfTlNfVVJJJywgQXV0aF9PcGVuSURfU1JFR19OU19VUklfMV8xKTsKCkF1dGhfT3BlbklEX3JlZ2lzdGVyTmFtZXNwYWNlQWxpYXMoQXV0aF9PcGVuSURfU1JFR19OU19VUklfMV8xLCAnc3JlZycpOwoKLyoqCiAqIERvZXMgdGhlIGdpdmVuIGVuZHBvaW50IGFkdmVydGlzZSBzdXBwb3J0IGZvciBzaW1wbGUKICogcmVnaXN0cmF0aW9uPwogKgogKiAkZW5kcG9pbnQ6IFRoZSBlbmRwb2ludCBvYmplY3QgYXMgcmV0dXJuZWQgYnkgT3BlbklEIGRpc2NvdmVyeS4KICogcmV0dXJucyB3aGV0aGVyIGFuIHNyZWcgdHlwZSB3YXMgYWR2ZXJ0aXNlZCBieSB0aGUgZW5kcG9pbnQKICovCmZ1bmN0aW9uIEF1dGhfT3BlbklEX3N1cHBvcnRzU1JlZygkZW5kcG9pbnQpCnsKICAgIHJldHVybiAoJGVuZHBvaW50LT51c2VzRXh0ZW5zaW9uKEF1dGhfT3BlbklEX1NSRUdfTlNfVVJJXzFfMSkgfHwKICAgICAgICAgICAgJGVuZHBvaW50LT51c2VzRXh0ZW5zaW9uKEF1dGhfT3BlbklEX1NSRUdfTlNfVVJJXzFfMCkpOwp9CgovKioKICogQSBiYXNlIGNsYXNzIGZvciBjbGFzc2VzIGRlYWxpbmcgd2l0aCBTaW1wbGUgUmVnaXN0cmF0aW9uIHByb3RvY29sCiAqIG1lc3NhZ2VzLgogKgogKiBAcGFja2FnZSBPcGVuSUQKICovCmNsYXNzIEF1dGhfT3BlbklEX1NSZWdCYXNlIGV4dGVuZHMgQXV0aF9PcGVuSURfRXh0ZW5zaW9uIHsKICAgIC8qKgogICAgICogRXh0cmFjdCB0aGUgc2ltcGxlIHJlZ2lzdHJhdGlvbiBuYW1lc3BhY2UgVVJJIGZyb20gdGhlIGdpdmVuCiAgICAgKiBPcGVuSUQgbWVzc2FnZS4gSGFuZGxlcyBPcGVuSUQgMSBhbmQgMiwgYXMgd2VsbCBhcyBib3RoIHNyZWcKICAgICAqIG5hbWVzcGFjZSBVUklzIGZvdW5kIGluIHRoZSB3aWxkLCBhcyB3ZWxsIGFzIG1pc3NpbmcgbmFtZXNwYWNlCiAgICAgKiBkZWZpbml0aW9ucyAoZm9yIE9wZW5JRCAxKQogICAgICoKICAgICAqICRtZXNzYWdlOiBUaGUgT3BlbklEIG1lc3NhZ2UgZnJvbSB3aGljaCB0byBwYXJzZSBzaW1wbGUKICAgICAqIHJlZ2lzdHJhdGlvbiBmaWVsZHMuIFRoaXMgbWF5IGJlIGEgcmVxdWVzdCBvciByZXNwb25zZSBtZXNzYWdlLgogICAgICoKICAgICAqIFJldHVybnMgdGhlIHNyZWcgbmFtZXNwYWNlIFVSSSBmb3IgdGhlIHN1cHBsaWVkIG1lc3NhZ2UuIFRoZQogICAgICogbWVzc2FnZSBtYXkgYmUgbW9kaWZpZWQgdG8gZGVmaW5lIGEgc2ltcGxlIHJlZ2lzdHJhdGlvbgogICAgICogbmFtZXNwYWNlLgogICAgICoKICAgICAqIEBhY2Nlc3MgcHJpdmF0ZQogICAgICovCiAgICBzdGF0aWMgZnVuY3Rpb24gX2dldFNSZWdOUygkbWVzc2FnZSkKICAgIHsKICAgICAgICAkYWxpYXMgPSBudWxsOwogICAgICAgICRmb3VuZF9uc191cmkgPSBudWxsOwoKICAgICAgICAvLyBTZWUgaWYgdGhlcmUgZXhpc3RzIGFuIGFsaWFzIGZvciBvbmUgb2YgdGhlIHR3byBkZWZpbmVkCiAgICAgICAgLy8gc2ltcGxlIHJlZ2lzdHJhdGlvbiB0eXBlcy4KICAgICAgICBmb3JlYWNoIChhcnJheShBdXRoX09wZW5JRF9TUkVHX05TX1VSSV8xXzEsCiAgICAgICAgICAgICAgICAgICAgICAgQXV0aF9PcGVuSURfU1JFR19OU19VUklfMV8wKSBhcyAkc3JlZ19uc191cmkpIHsKICAgICAgICAgICAgJGFsaWFzID0gJG1lc3NhZ2UtPm5hbWVzcGFjZXMtPmdldEFsaWFzKCRzcmVnX25zX3VyaSk7CiAgICAgICAgICAgIGlmICgkYWxpYXMgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgICRmb3VuZF9uc191cmkgPSAkc3JlZ19uc191cmk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCRhbGlhcyA9PT0gbnVsbCkgewogICAgICAgICAgICAvLyBUaGVyZSBpcyBubyBhbGlhcyBmb3IgZWl0aGVyIG9mIHRoZSB0eXBlcywgc28gdHJ5IHRvCiAgICAgICAgICAgIC8vIGFkZCBvbmUuIFdlIGRlZmF1bHQgdG8gdXNpbmcgdGhlIG1vZGVybiB2YWx1ZSAoMS4xKQogICAgICAgICAgICAkZm91bmRfbnNfdXJpID0gQXV0aF9PcGVuSURfU1JFR19OU19VUklfMV8xOwogICAgICAgICAgICBpZiAoJG1lc3NhZ2UtPm5hbWVzcGFjZXMtPmFkZEFsaWFzKEF1dGhfT3BlbklEX1NSRUdfTlNfVVJJXzFfMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JlZycpID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICAvLyBBbiBhbGlhcyBmb3IgdGhlIHN0cmluZyAnc3JlZycgYWxyZWFkeSBleGlzdHMsIGJ1dAogICAgICAgICAgICAgICAgLy8gaXQncyBkZWZpbmVkIGZvciBzb21ldGhpbmcgb3RoZXIgdGhhbiBzaW1wbGUKICAgICAgICAgICAgICAgIC8vIHJlZ2lzdHJhdGlvbgogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiAkZm91bmRfbnNfdXJpOwogICAgfQp9CgovKioKICogQW4gb2JqZWN0IHRvIGhvbGQgdGhlIHN0YXRlIG9mIGEgc2ltcGxlIHJlZ2lzdHJhdGlvbiByZXF1ZXN0LgogKgogKiByZXF1aXJlZDogQSBsaXN0IG9mIHRoZSByZXF1aXJlZCBmaWVsZHMgaW4gdGhpcyBzaW1wbGUgcmVnaXN0cmF0aW9uCiAqIHJlcXVlc3QKICoKICogb3B0aW9uYWw6IEEgbGlzdCBvZiB0aGUgb3B0aW9uYWwgZmllbGRzIGluIHRoaXMgc2ltcGxlIHJlZ2lzdHJhdGlvbgogKiByZXF1ZXN0CiAqCiAqIEBwYWNrYWdlIE9wZW5JRAogKi8KY2xhc3MgQXV0aF9PcGVuSURfU1JlZ1JlcXVlc3QgZXh0ZW5kcyBBdXRoX09wZW5JRF9TUmVnQmFzZSB7CgogICAgdmFyICRuc19hbGlhcyA9ICdzcmVnJzsKCiAgICAvKioKICAgICAqIEluaXRpYWxpemUgYW4gZW1wdHkgc2ltcGxlIHJlZ2lzdHJhdGlvbiByZXF1ZXN0LgogICAgICovCiAgICBzdGF0aWMgZnVuY3Rpb24gYnVpbGQoJHJlcXVpcmVkPW51bGwsICRvcHRpb25hbD1udWxsLAogICAgICAgICAgICAgICAgICAgJHBvbGljeV91cmw9bnVsbCwKICAgICAgICAgICAgICAgICAgICRzcmVnX25zX3VyaT1BdXRoX09wZW5JRF9TUkVHX05TX1VSSSwKICAgICAgICAgICAgICAgICAgICRjbHM9J0F1dGhfT3BlbklEX1NSZWdSZXF1ZXN0JykKICAgIHsKICAgICAgICAkb2JqID0gbmV3ICRjbHMoKTsKCiAgICAgICAgJG9iai0+cmVxdWlyZWQgPSBhcnJheSgpOwogICAgICAgICRvYmotPm9wdGlvbmFsID0gYXJyYXkoKTsKICAgICAgICAkb2JqLT5wb2xpY3lfdXJsID0gJHBvbGljeV91cmw7CiAgICAgICAgJG9iai0+bnNfdXJpID0gJHNyZWdfbnNfdXJpOwoKICAgICAgICBpZiAoJHJlcXVpcmVkKSB7CiAgICAgICAgICAgIGlmICghJG9iai0+cmVxdWVzdEZpZWxkcygkcmVxdWlyZWQsIHRydWUsIHRydWUpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCRvcHRpb25hbCkgewogICAgICAgICAgICBpZiAoISRvYmotPnJlcXVlc3RGaWVsZHMoJG9wdGlvbmFsLCBmYWxzZSwgdHJ1ZSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJG9iajsKICAgIH0KCiAgICAvKioKICAgICAqIENyZWF0ZSBhIHNpbXBsZSByZWdpc3RyYXRpb24gcmVxdWVzdCB0aGF0IGNvbnRhaW5zIHRoZSBmaWVsZHMKICAgICAqIHRoYXQgd2VyZSByZXF1ZXN0ZWQgaW4gdGhlIE9wZW5JRCByZXF1ZXN0IHdpdGggdGhlIGdpdmVuCiAgICAgKiBhcmd1bWVudHMKICAgICAqCiAgICAgKiAkcmVxdWVzdDogVGhlIE9wZW5JRCBhdXRoZW50aWNhdGlvbiByZXF1ZXN0IGZyb20gd2hpY2ggdG8KICAgICAqIGV4dHJhY3QgYW4gc3JlZyByZXF1ZXN0LgogICAgICoKICAgICAqICRjbHM6IG5hbWUgb2YgY2xhc3MgdG8gdXNlIHdoZW4gY3JlYXRpbmcgc3JlZyByZXF1ZXN0IG9iamVjdC4KICAgICAqIFVzZWQgZm9yIHRlc3RpbmcuCiAgICAgKgogICAgICogUmV0dXJucyB0aGUgbmV3bHkgY3JlYXRlZCBzaW1wbGUgcmVnaXN0cmF0aW9uIHJlcXVlc3QKICAgICAqLwogICAgc3RhdGljIGZ1bmN0aW9uIGZyb21PcGVuSURSZXF1ZXN0KCRyZXF1ZXN0LCAkY2xzPSdBdXRoX09wZW5JRF9TUmVnUmVxdWVzdCcpCiAgICB7CgogICAgICAgICRvYmogPSBjYWxsX3VzZXJfZnVuY19hcnJheShhcnJheSgkY2xzLCAnYnVpbGQnKSwKICAgICAgICAgICAgICAgICBhcnJheShudWxsLCBudWxsLCBudWxsLCBBdXRoX09wZW5JRF9TUkVHX05TX1VSSSwgJGNscykpOwoKICAgICAgICAvLyBTaW5jZSB3ZSdyZSBnb2luZyB0byBtZXNzIHdpdGggbmFtZXNwYWNlIFVSSSBtYXBwaW5nLCBkb24ndAogICAgICAgIC8vIG11dGF0ZSB0aGUgb2JqZWN0IHRoYXQgd2FzIHBhc3NlZCBpbi4KICAgICAgICAkbSA9ICRyZXF1ZXN0LT5tZXNzYWdlOwoKICAgICAgICAkb2JqLT5uc191cmkgPSAkb2JqLT5fZ2V0U1JlZ05TKCRtKTsKICAgICAgICAkYXJncyA9ICRtLT5nZXRBcmdzKCRvYmotPm5zX3VyaSk7CgogICAgICAgIGlmICgkYXJncyA9PT0gbnVsbCB8fCBBdXRoX09wZW5JRDo6aXNGYWlsdXJlKCRhcmdzKSkgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CgogICAgICAgICRvYmotPnBhcnNlRXh0ZW5zaW9uQXJncygkYXJncyk7CgogICAgICAgIHJldHVybiAkb2JqOwogICAgfQoKICAgIC8qKgogICAgICogUGFyc2UgdGhlIHVucXVhbGlmaWVkIHNpbXBsZSByZWdpc3RyYXRpb24gcmVxdWVzdCBwYXJhbWV0ZXJzCiAgICAgKiBhbmQgYWRkIHRoZW0gdG8gdGhpcyBvYmplY3QuCiAgICAgKgogICAgICogVGhpcyBtZXRob2QgaXMgZXNzZW50aWFsbHkgdGhlIGludmVyc2Ugb2YKICAgICAqIGdldEV4dGVuc2lvbkFyZ3MuIFRoaXMgbWV0aG9kIHJlc3RvcmVzIHRoZSBzZXJpYWxpemVkIHNpbXBsZQogICAgICogcmVnaXN0cmF0aW9uIHJlcXVlc3QgZmllbGRzLgogICAgICoKICAgICAqIElmIHlvdSBhcmUgZXh0cmFjdGluZyBhcmd1bWVudHMgZnJvbSBhIHN0YW5kYXJkIE9wZW5JRAogICAgICogY2hlY2tpZF8qIHJlcXVlc3QsIHlvdSBwcm9iYWJseSB3YW50IHRvIHVzZSBmcm9tT3BlbklEUmVxdWVzdCwKICAgICAqIHdoaWNoIHdpbGwgZXh0cmFjdCB0aGUgc3JlZyBuYW1lc3BhY2UgYW5kIGFyZ3VtZW50cyBmcm9tIHRoZQogICAgICogT3BlbklEIHJlcXVlc3QuIFRoaXMgbWV0aG9kIGlzIGludGVuZGVkIGZvciBjYXNlcyB3aGVyZSB0aGUKICAgICAqIE9wZW5JRCBzZXJ2ZXIgbmVlZHMgbW9yZSBjb250cm9sIG92ZXIgaG93IHRoZSBhcmd1bWVudHMgYXJlCiAgICAgKiBwYXJzZWQgdGhhbiB0aGF0IG1ldGhvZCBwcm92aWRlcy4KICAgICAqCiAgICAgKiAkYXJncyA9PSAkbWVzc2FnZS0+Z2V0QXJncygkbnNfdXJpKTsKICAgICAqICRyZXF1ZXN0LT5wYXJzZUV4dGVuc2lvbkFyZ3MoJGFyZ3MpOwogICAgICoKICAgICAqICRhcmdzOiBUaGUgdW5xdWFsaWZpZWQgc2ltcGxlIHJlZ2lzdHJhdGlvbiBhcmd1bWVudHMKICAgICAqCiAgICAgKiBzdHJpY3Q6IFdoZXRoZXIgcmVxdWVzdHMgd2l0aCBmaWVsZHMgdGhhdCBhcmUgbm90IGRlZmluZWQgaW4KICAgICAqIHRoZSBzaW1wbGUgcmVnaXN0cmF0aW9uIHNwZWNpZmljYXRpb24gc2hvdWxkIGJlIHRvbGVyYXRlZCAoYW5kCiAgICAgKiBpZ25vcmVkKQogICAgICovCiAgICBmdW5jdGlvbiBwYXJzZUV4dGVuc2lvbkFyZ3MoJGFyZ3MsICRzdHJpY3Q9ZmFsc2UpCiAgICB7CiAgICAgICAgZm9yZWFjaCAoYXJyYXkoJ3JlcXVpcmVkJywgJ29wdGlvbmFsJykgYXMgJGxpc3RfbmFtZSkgewogICAgICAgICAgICAkcmVxdWlyZWQgPSAoJGxpc3RfbmFtZSA9PSAncmVxdWlyZWQnKTsKICAgICAgICAgICAgJGl0ZW1zID0gQXV0aF9PcGVuSUQ6OmFycmF5R2V0KCRhcmdzLCAkbGlzdF9uYW1lKTsKICAgICAgICAgICAgaWYgKCRpdGVtcykgewogICAgICAgICAgICAgICAgZm9yZWFjaCAoZXhwbG9kZSgnLCcsICRpdGVtcykgYXMgJGZpZWxkX25hbWUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoISR0aGlzLT5yZXF1ZXN0RmllbGQoJGZpZWxkX25hbWUsICRyZXF1aXJlZCwgJHN0cmljdCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRzdHJpY3QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJHRoaXMtPnBvbGljeV91cmwgPSBBdXRoX09wZW5JRDo6YXJyYXlHZXQoJGFyZ3MsICdwb2xpY3lfdXJsJyk7CgogICAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIC8qKgogICAgICogQSBsaXN0IG9mIGFsbCBvZiB0aGUgc2ltcGxlIHJlZ2lzdHJhdGlvbiBmaWVsZHMgdGhhdCB3ZXJlCiAgICAgKiByZXF1ZXN0ZWQsIHdoZXRoZXIgdGhleSB3ZXJlIHJlcXVpcmVkIG9yIG9wdGlvbmFsLgogICAgICovCiAgICBmdW5jdGlvbiBhbGxSZXF1ZXN0ZWRGaWVsZHMoKQogICAgewogICAgICAgIHJldHVybiBhcnJheV9tZXJnZSgkdGhpcy0+cmVxdWlyZWQsICR0aGlzLT5vcHRpb25hbCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBIYXZlIGFueSBzaW1wbGUgcmVnaXN0cmF0aW9uIGZpZWxkcyBiZWVuIHJlcXVlc3RlZD8KICAgICAqLwogICAgZnVuY3Rpb24gd2VyZUZpZWxkc1JlcXVlc3RlZCgpCiAgICB7CiAgICAgICAgcmV0dXJuIGNvdW50KCR0aGlzLT5hbGxSZXF1ZXN0ZWRGaWVsZHMoKSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBXYXMgdGhpcyBmaWVsZCBpbiB0aGUgcmVxdWVzdD8KICAgICAqLwogICAgZnVuY3Rpb24gY29udGFpbnMoJGZpZWxkX25hbWUpCiAgICB7CiAgICAgICAgcmV0dXJuIChpbl9hcnJheSgkZmllbGRfbmFtZSwgJHRoaXMtPnJlcXVpcmVkKSB8fAogICAgICAgICAgICAgICAgaW5fYXJyYXkoJGZpZWxkX25hbWUsICR0aGlzLT5vcHRpb25hbCkpOwogICAgfQoKICAgIC8qKgogICAgICogUmVxdWVzdCB0aGUgc3BlY2lmaWVkIGZpZWxkIGZyb20gdGhlIE9wZW5JRCB1c2VyCiAgICAgKgogICAgICogJGZpZWxkX25hbWU6IHRoZSB1bnF1YWxpZmllZCBzaW1wbGUgcmVnaXN0cmF0aW9uIGZpZWxkIG5hbWUKICAgICAqCiAgICAgKiByZXF1aXJlZDogd2hldGhlciB0aGUgZ2l2ZW4gZmllbGQgc2hvdWxkIGJlIHByZXNlbnRlZCB0byB0aGUKICAgICAqIHVzZXIgYXMgYmVpbmcgYSByZXF1aXJlZCB0byBzdWNjZXNzZnVsbHkgY29tcGxldGUgdGhlIHJlcXVlc3QKICAgICAqCiAgICAgKiBzdHJpY3Q6IHdoZXRoZXIgdG8gcmFpc2UgYW4gZXhjZXB0aW9uIHdoZW4gYSBmaWVsZCBpcyBhZGRlZCB0bwogICAgICogYSByZXF1ZXN0IG1vcmUgdGhhbiBvbmNlCiAgICAgKi8KICAgIGZ1bmN0aW9uIHJlcXVlc3RGaWVsZCgkZmllbGRfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAkcmVxdWlyZWQ9ZmFsc2UsICRzdHJpY3Q9ZmFsc2UpCiAgICB7CiAgICAgICAgaWYgKCFBdXRoX09wZW5JRF9jaGVja0ZpZWxkTmFtZSgkZmllbGRfbmFtZSkpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgaWYgKCRzdHJpY3QpIHsKICAgICAgICAgICAgaWYgKCR0aGlzLT5jb250YWlucygkZmllbGRfbmFtZSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmIChpbl9hcnJheSgkZmllbGRfbmFtZSwgJHRoaXMtPnJlcXVpcmVkKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChpbl9hcnJheSgkZmllbGRfbmFtZSwgJHRoaXMtPm9wdGlvbmFsKSkgewogICAgICAgICAgICAgICAgaWYgKCRyZXF1aXJlZCkgewogICAgICAgICAgICAgICAgICAgIHVuc2V0KCR0aGlzLT5vcHRpb25hbFthcnJheV9zZWFyY2goJGZpZWxkX25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+b3B0aW9uYWwpXSk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoJHJlcXVpcmVkKSB7CiAgICAgICAgICAgICR0aGlzLT5yZXF1aXJlZFtdID0gJGZpZWxkX25hbWU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJHRoaXMtPm9wdGlvbmFsW10gPSAkZmllbGRfbmFtZTsKICAgICAgICB9CgogICAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIC8qKgogICAgICogQWRkIHRoZSBnaXZlbiBsaXN0IG9mIGZpZWxkcyB0byB0aGUgcmVxdWVzdAogICAgICoKICAgICAqIGZpZWxkX25hbWVzOiBUaGUgc2ltcGxlIHJlZ2lzdHJhdGlvbiBkYXRhIGZpZWxkcyB0byByZXF1ZXN0CiAgICAgKgogICAgICogcmVxdWlyZWQ6IFdoZXRoZXIgdGhlc2UgdmFsdWVzIHNob3VsZCBiZSBwcmVzZW50ZWQgdG8gdGhlIHVzZXIKICAgICAqIGFzIHJlcXVpcmVkCiAgICAgKgogICAgICogc3RyaWN0OiB3aGV0aGVyIHRvIHJhaXNlIGFuIGV4Y2VwdGlvbiB3aGVuIGEgZmllbGQgaXMgYWRkZWQgdG8KICAgICAqIGEgcmVxdWVzdCBtb3JlIHRoYW4gb25jZQogICAgICovCiAgICBmdW5jdGlvbiByZXF1ZXN0RmllbGRzKCRmaWVsZF9uYW1lcywgJHJlcXVpcmVkPWZhbHNlLCAkc3RyaWN0PWZhbHNlKQogICAgewogICAgICAgIGlmICghaXNfYXJyYXkoJGZpZWxkX25hbWVzKSkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICBmb3JlYWNoICgkZmllbGRfbmFtZXMgYXMgJGZpZWxkX25hbWUpIHsKICAgICAgICAgICAgaWYgKCEkdGhpcy0+cmVxdWVzdEZpZWxkKCRmaWVsZF9uYW1lLCAkcmVxdWlyZWQsICRzdHJpY3Q9JHN0cmljdCkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgLyoqCiAgICAgKiBHZXQgYSBkaWN0aW9uYXJ5IG9mIHVucXVhbGlmaWVkIHNpbXBsZSByZWdpc3RyYXRpb24gYXJndW1lbnRzCiAgICAgKiByZXByZXNlbnRpbmcgdGhpcyByZXF1ZXN0LgogICAgICoKICAgICAqIFRoaXMgbWV0aG9kIGlzIGVzc2VudGlhbGx5IHRoZSBpbnZlcnNlIG9mCiAgICAgKiBDe0x7cGFyc2VFeHRlbnNpb25BcmdzfX0uIFRoaXMgbWV0aG9kIHNlcmlhbGl6ZXMgdGhlIHNpbXBsZQogICAgICogcmVnaXN0cmF0aW9uIHJlcXVlc3QgZmllbGRzLgogICAgICovCiAgICBmdW5jdGlvbiBnZXRFeHRlbnNpb25BcmdzKCkKICAgIHsKICAgICAgICAkYXJncyA9IGFycmF5KCk7CgogICAgICAgIGlmICgkdGhpcy0+cmVxdWlyZWQpIHsKICAgICAgICAgICAgJGFyZ3NbJ3JlcXVpcmVkJ10gPSBpbXBsb2RlKCcsJywgJHRoaXMtPnJlcXVpcmVkKTsKICAgICAgICB9CgogICAgICAgIGlmICgkdGhpcy0+b3B0aW9uYWwpIHsKICAgICAgICAgICAgJGFyZ3NbJ29wdGlvbmFsJ10gPSBpbXBsb2RlKCcsJywgJHRoaXMtPm9wdGlvbmFsKTsKICAgICAgICB9CgogICAgICAgIGlmICgkdGhpcy0+cG9saWN5X3VybCkgewogICAgICAgICAgICAkYXJnc1sncG9saWN5X3VybCddID0gJHRoaXMtPnBvbGljeV91cmw7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJGFyZ3M7CiAgICB9Cn0KCi8qKgogKiBSZXByZXNlbnRzIHRoZSBkYXRhIHJldHVybmVkIGluIGEgc2ltcGxlIHJlZ2lzdHJhdGlvbiByZXNwb25zZQogKiBpbnNpZGUgb2YgYW4gT3BlbklEIEN7aWRfcmVzfSByZXNwb25zZS4gVGhpcyBvYmplY3Qgd2lsbCBiZSBjcmVhdGVkCiAqIGJ5IHRoZSBPcGVuSUQgc2VydmVyLCBhZGRlZCB0byB0aGUgQ3tpZF9yZXN9IHJlc3BvbnNlIG9iamVjdCwgYW5kCiAqIHRoZW4gZXh0cmFjdGVkIGZyb20gdGhlIEN7aWRfcmVzfSBtZXNzYWdlIGJ5IHRoZSBDb25zdW1lci4KICoKICogQHBhY2thZ2UgT3BlbklECiAqLwpjbGFzcyBBdXRoX09wZW5JRF9TUmVnUmVzcG9uc2UgZXh0ZW5kcyBBdXRoX09wZW5JRF9TUmVnQmFzZSB7CgogICAgdmFyICRuc19hbGlhcyA9ICdzcmVnJzsKCiAgICBmdW5jdGlvbiBBdXRoX09wZW5JRF9TUmVnUmVzcG9uc2UoJGRhdGE9bnVsbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc3JlZ19uc191cmk9QXV0aF9PcGVuSURfU1JFR19OU19VUkkpCiAgICB7CiAgICAgICAgaWYgKCRkYXRhID09PSBudWxsKSB7CiAgICAgICAgICAgICR0aGlzLT5kYXRhID0gYXJyYXkoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkdGhpcy0+ZGF0YSA9ICRkYXRhOwogICAgICAgIH0KCiAgICAgICAgJHRoaXMtPm5zX3VyaSA9ICRzcmVnX25zX3VyaTsKICAgIH0KCiAgICAvKioKICAgICAqIFRha2UgYSBDe0x7U1JlZ1JlcXVlc3R9fSBhbmQgYSBkaWN0aW9uYXJ5IG9mIHNpbXBsZQogICAgICogcmVnaXN0cmF0aW9uIHZhbHVlcyBhbmQgY3JlYXRlIGEgQ3tMe1NSZWdSZXNwb25zZX19IG9iamVjdAogICAgICogY29udGFpbmluZyB0aGF0IGRhdGEuCiAgICAgKgogICAgICogcmVxdWVzdDogVGhlIHNpbXBsZSByZWdpc3RyYXRpb24gcmVxdWVzdCBvYmplY3QKICAgICAqCiAgICAgKiBkYXRhOiBUaGUgc2ltcGxlIHJlZ2lzdHJhdGlvbiBkYXRhIGZvciB0aGlzIHJlc3BvbnNlLCBhcyBhCiAgICAgKiBkaWN0aW9uYXJ5IGZyb20gdW5xdWFsaWZpZWQgc2ltcGxlIHJlZ2lzdHJhdGlvbiBmaWVsZCBuYW1lIHRvCiAgICAgKiBzdHJpbmcgKHVuaWNvZGUpIHZhbHVlLiBGb3IgaW5zdGFuY2UsIHRoZSBuaWNrbmFtZSBzaG91bGQgYmUKICAgICAqIHN0b3JlZCB1bmRlciB0aGUga2V5ICduaWNrbmFtZScuCiAgICAgKi8KICAgIHN0YXRpYyBmdW5jdGlvbiBleHRyYWN0UmVzcG9uc2UoJHJlcXVlc3QsICRkYXRhKQogICAgewogICAgICAgICRvYmogPSBuZXcgQXV0aF9PcGVuSURfU1JlZ1Jlc3BvbnNlKCk7CiAgICAgICAgJG9iai0+bnNfdXJpID0gJHJlcXVlc3QtPm5zX3VyaTsKCiAgICAgICAgZm9yZWFjaCAoJHJlcXVlc3QtPmFsbFJlcXVlc3RlZEZpZWxkcygpIGFzICRmaWVsZCkgewogICAgICAgICAgICAkdmFsdWUgPSBBdXRoX09wZW5JRDo6YXJyYXlHZXQoJGRhdGEsICRmaWVsZCk7CiAgICAgICAgICAgIGlmICgkdmFsdWUgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgICRvYmotPmRhdGFbJGZpZWxkXSA9ICR2YWx1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRvYmo7CiAgICB9CgogICAgLyoqCiAgICAgKiBDcmVhdGUgYSBDe0x7U1JlZ1Jlc3BvbnNlfX0gb2JqZWN0IGZyb20gYSBzdWNjZXNzZnVsIE9wZW5JRAogICAgICogbGlicmFyeSByZXNwb25zZQogICAgICogKEN7THtvcGVuaWQuY29uc3VtZXIuY29uc3VtZXIuU3VjY2Vzc1Jlc3BvbnNlfX0pIHJlc3BvbnNlCiAgICAgKiBtZXNzYWdlCiAgICAgKgogICAgICogc3VjY2Vzc19yZXNwb25zZTogQSBTdWNjZXNzUmVzcG9uc2UgZnJvbSBjb25zdW1lci5jb21wbGV0ZSgpCiAgICAgKgogICAgICogc2lnbmVkX29ubHk6IFdoZXRoZXIgdG8gcHJvY2VzcyBvbmx5IGRhdGEgdGhhdCB3YXMKICAgICAqIHNpZ25lZCBpbiB0aGUgaWRfcmVzIG1lc3NhZ2UgZnJvbSB0aGUgc2VydmVyLgogICAgICoKICAgICAqIFJldHVybnMgYSBzaW1wbGUgcmVnaXN0cmF0aW9uIHJlc3BvbnNlIGNvbnRhaW5pbmcgdGhlIGRhdGEgdGhhdAogICAgICogd2FzIHN1cHBsaWVkIHdpdGggdGhlIEN7aWRfcmVzfSByZXNwb25zZS4KICAgICAqLwogICAgc3RhdGljIGZ1bmN0aW9uIGZyb21TdWNjZXNzUmVzcG9uc2UoJHN1Y2Nlc3NfcmVzcG9uc2UsICRzaWduZWRfb25seT10cnVlKQogICAgewogICAgICAgIGdsb2JhbCAkQXV0aF9PcGVuSURfc3JlZ19kYXRhX2ZpZWxkczsKCiAgICAgICAgJG9iaiA9IG5ldyBBdXRoX09wZW5JRF9TUmVnUmVzcG9uc2UoKTsKICAgICAgICAkb2JqLT5uc191cmkgPSAkb2JqLT5fZ2V0U1JlZ05TKCRzdWNjZXNzX3Jlc3BvbnNlLT5tZXNzYWdlKTsKCiAgICAgICAgaWYgKCRzaWduZWRfb25seSkgewogICAgICAgICAgICAkYXJncyA9ICRzdWNjZXNzX3Jlc3BvbnNlLT5nZXRTaWduZWROUygkb2JqLT5uc191cmkpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRhcmdzID0gJHN1Y2Nlc3NfcmVzcG9uc2UtPm1lc3NhZ2UtPmdldEFyZ3MoJG9iai0+bnNfdXJpKTsKICAgICAgICB9CgogICAgICAgIGlmICgkYXJncyA9PT0gbnVsbCB8fCBBdXRoX09wZW5JRDo6aXNGYWlsdXJlKCRhcmdzKSkgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CgogICAgICAgIGZvcmVhY2ggKCRBdXRoX09wZW5JRF9zcmVnX2RhdGFfZmllbGRzIGFzICRmaWVsZF9uYW1lID0+ICRkZXNjKSB7CiAgICAgICAgICAgIGlmIChpbl9hcnJheSgkZmllbGRfbmFtZSwgYXJyYXlfa2V5cygkYXJncykpKSB7CiAgICAgICAgICAgICAgICAkb2JqLT5kYXRhWyRmaWVsZF9uYW1lXSA9ICRhcmdzWyRmaWVsZF9uYW1lXTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRvYmo7CiAgICB9CgogICAgZnVuY3Rpb24gZ2V0RXh0ZW5zaW9uQXJncygpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5kYXRhOwogICAgfQoKICAgIC8vIFJlYWQtb25seSBkaWN0aW9uYXJ5IGludGVyZmFjZQogICAgZnVuY3Rpb24gZ2V0KCRmaWVsZF9uYW1lLCAkZGVmYXVsdD1udWxsKQogICAgewogICAgICAgIGlmICghQXV0aF9PcGVuSURfY2hlY2tGaWVsZE5hbWUoJGZpZWxkX25hbWUpKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIEF1dGhfT3BlbklEOjphcnJheUdldCgkdGhpcy0+ZGF0YSwgJGZpZWxkX25hbWUsICRkZWZhdWx0KTsKICAgIH0KCiAgICBmdW5jdGlvbiBjb250ZW50cygpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5kYXRhOwogICAgfQp9CgoK]]></data>
	</file>
	<file>
	  <filename>/openid-php-openid-782224d/Auth/OpenID/TrustRoot.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIEZ1bmN0aW9ucyBmb3IgZGVhbGluZyB3aXRoIE9wZW5JRCB0cnVzdCByb290cwogKgogKiBQSFAgdmVyc2lvbnMgNCBhbmQgNQogKgogKiBMSUNFTlNFOiBTZWUgdGhlIENPUFlJTkcgZmlsZSBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbi4KICoKICogQHBhY2thZ2UgT3BlbklECiAqIEBhdXRob3IgSmFuUmFpbiwgSW5jLiA8b3BlbmlkQGphbnJhaW4uY29tPgogKiBAY29weXJpZ2h0IDIwMDUtMjAwOCBKYW5yYWluLCBJbmMuCiAqIEBsaWNlbnNlIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCBBcGFjaGUKICovCgpyZXF1aXJlX29uY2UgJ0F1dGgvT3BlbklEL0Rpc2NvdmVyLnBocCc7CgovKioKICogQSByZWd1bGFyIGV4cHJlc3Npb24gdGhhdCBtYXRjaGVzIGEgZG9tYWluIGVuZGluZyBpbiBhIHRvcC1sZXZlbCBkb21haW5zLgogKiBVc2VkIGluIGNoZWNraW5nIHRydXN0IHJvb3RzIGZvciBzYW5pdHkuCiAqCiAqIEBhY2Nlc3MgcHJpdmF0ZQogKi8KZGVmaW5lKCdBdXRoX09wZW5JRF9fX1RMRHMnLAogICAgICAgJy9cLihhY3xhZHxhZXxhZXJvfGFmfGFnfGFpfGFsfGFtfGFufGFvfGFxfGFyfGFycGF8YXN8YXNpYScgLgogICAgICAgJ3xhdHxhdXxhd3xheHxhenxiYXxiYnxiZHxiZXxiZnxiZ3xiaHxiaXxiaXp8Ymp8Ym18Ym58Ym98YnInIC4KICAgICAgICd8YnN8YnR8YnZ8Ynd8Ynl8Ynp8Y2F8Y2F0fGNjfGNkfGNmfGNnfGNofGNpfGNrfGNsfGNtfGNufGNvJyAuCiAgICAgICAnfGNvbXxjb29wfGNyfGN1fGN2fGN4fGN5fGN6fGRlfGRqfGRrfGRtfGRvfGR6fGVjfGVkdXxlZXxlZycgLgogICAgICAgJ3xlcnxlc3xldHxldXxmaXxmanxma3xmbXxmb3xmcnxnYXxnYnxnZHxnZXxnZnxnZ3xnaHxnaXxnbCcgLgogICAgICAgJ3xnbXxnbnxnb3Z8Z3B8Z3F8Z3J8Z3N8Z3R8Z3V8Z3d8Z3l8aGt8aG18aG58aHJ8aHR8aHV8aWR8aWUnIC4KICAgICAgICd8aWx8aW18aW58aW5mb3xpbnR8aW98aXF8aXJ8aXN8aXR8amV8am18am98am9ic3xqcHxrZXxrZ3xraCcgLgogICAgICAgJ3xraXxrbXxrbnxrcHxrcnxrd3xreXxrenxsYXxsYnxsY3xsaXxsa3xscnxsc3xsdHxsdXxsdnxseScgLgogICAgICAgJ3xtYXxtY3xtZHxtZXxtZ3xtaHxtaWx8bWt8bWx8bW18bW58bW98bW9iaXxtcHxtcXxtcnxtc3xtdCcgLgogICAgICAgJ3xtdXxtdXNldW18bXZ8bXd8bXh8bXl8bXp8bmF8bmFtZXxuY3xuZXxuZXR8bmZ8bmd8bml8bmx8bm8nIC4KICAgICAgICd8bnB8bnJ8bnV8bnp8b218b3JnfHBhfHBlfHBmfHBnfHBofHBrfHBsfHBtfHBufHByfHByb3xwc3xwdCcgLgogICAgICAgJ3xwd3xweXxxYXxyZXxyb3xyc3xydXxyd3xzYXxzYnxzY3xzZHxzZXxzZ3xzaHxzaXxzanxza3xzbCcgLgogICAgICAgJ3xzbXxzbnxzb3xzcnxzdHxzdXxzdnxzeXxzenx0Y3x0ZHx0ZWx8dGZ8dGd8dGh8dGp8dGt8dGx8dG0nIC4KICAgICAgICd8dG58dG98dHB8dHJ8dHJhdmVsfHR0fHR2fHR3fHR6fHVhfHVnfHVrfHVzfHV5fHV6fHZhfHZjfHZlJyAuCiAgICAgICAnfHZnfHZpfHZufHZ1fHdmfHdzfHhuLS0wendtNTZkfHhuLS0xMWI1YnMzYTlhajZnJyAuCiAgICAgICAnfHhuLS04MGFraGJ5a25qNGZ8eG4tLTl0NGIxMXlpNWF8eG4tLWRlYmEwYWR8eG4tLWc2dzI1MWQnIC4KICAgICAgICd8eG4tLWhnYms2YWo3ZjUzYmJhfHhuLS1obGNqNmF5YTllc2M3YXx4bi0tanhhbHBkbHAnIC4KICAgICAgICd8eG4tLWtnYmVjaHR2fHhuLS16Y2t6YWh8eWV8eXR8eXV8emF8em18encpXC4/JC8nKTsKCmRlZmluZSgnQXV0aF9PcGVuSURfX19Ib3N0U2VnbWVudFJlJywKICAgICAgICIvXig/OlstYS16QS1aMC05ISQmJ1xcKFxcKVxcKissOz0uX35dfCVbYS16QS1aMC05XXsyfSkqJC8iKTsKCi8qKgogKiBBIHdyYXBwZXIgZm9yIHRydXN0LXJvb3QgcmVsYXRlZCBmdW5jdGlvbnMKICovCmNsYXNzIEF1dGhfT3BlbklEX1RydXN0Um9vdCB7CiAgICAvKgogICAgICogUmV0dXJuIGEgZGlzY292ZXJ5IFVSTCBmb3IgdGhpcyByZWFsbS4KICAgICAqCiAgICAgKiBSZXR1cm4gbnVsbCBpZiB0aGUgcmVhbG0gY291bGQgbm90IGJlIHBhcnNlZCBvciB3YXMgbm90IHZhbGlkLgogICAgICoKICAgICAqIEBwYXJhbSByZXR1cm5fdG8gVGhlIHJlbHlpbmcgcGFydHkgcmV0dXJuIFVSTCBvZiB0aGUgT3BlbklECiAgICAgKiBhdXRoZW50aWNhdGlvbiByZXF1ZXN0CiAgICAgKgogICAgICogQHJldHVybiBUaGUgVVJMIHVwb24gd2hpY2ggcmVseWluZyBwYXJ0eSBkaXNjb3Zlcnkgc2hvdWxkIGJlCiAgICAgKiBydW4gaW4gb3JkZXIgdG8gdmVyaWZ5IHRoZSByZXR1cm5fdG8gVVJMCiAgICAgKi8KICAgIHN0YXRpYyBmdW5jdGlvbiBidWlsZERpc2NvdmVyeVVSTCgkcmVhbG0pCiAgICB7CiAgICAgICAgJHBhcnNlZCA9IEF1dGhfT3BlbklEX1RydXN0Um9vdDo6X3BhcnNlKCRyZWFsbSk7CgogICAgICAgIGlmICgkcGFyc2VkID09PSBmYWxzZSkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICBpZiAoJHBhcnNlZFsnd2lsZGNhcmQnXSkgewogICAgICAgICAgICAvLyBVc2UgInd3dy4iIGluIHBsYWNlIG9mIHRoZSBzdGFyCiAgICAgICAgICAgIGlmICgkcGFyc2VkWydob3N0J11bMF0gIT0gJy4nKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICR3d3dfZG9tYWluID0gJ3d3dycgLiAkcGFyc2VkWydob3N0J107CgogICAgICAgICAgICByZXR1cm4gc3ByaW50ZignJXM6Ly8lcyVzJywgJHBhcnNlZFsnc2NoZW1lJ10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICR3d3dfZG9tYWluLCAkcGFyc2VkWydwYXRoJ10pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiAkcGFyc2VkWyd1bnBhcnNlZCddOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIFBhcnNlIGEgVVJMIGludG8gaXRzIHRydXN0X3Jvb3QgcGFydHMuCiAgICAgKgogICAgICogQHN0YXRpYwogICAgICoKICAgICAqIEBhY2Nlc3MgcHJpdmF0ZQogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgJHRydXN0X3Jvb3QgVGhlIHVybCB0byBwYXJzZQogICAgICoKICAgICAqIEByZXR1cm4gbWl4ZWQgJHBhcnNlZCBFaXRoZXIgYW4gYXNzb2NpYXRpdmUgYXJyYXkgb2YgdHJ1c3Qgcm9vdAogICAgICogcGFydHMgb3IgZmFsc2UgaWYgcGFyc2luZyBmYWlsZWQuCiAgICAgKi8KICAgIHN0YXRpYyBmdW5jdGlvbiBfcGFyc2UoJHRydXN0X3Jvb3QpCiAgICB7CiAgICAgICAgJHRydXN0X3Jvb3QgPSBBdXRoX09wZW5JRF91cmlub3JtKCR0cnVzdF9yb290KTsKICAgICAgICBpZiAoJHRydXN0X3Jvb3QgPT09IG51bGwpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgaWYgKHByZWdfbWF0Y2goIi86XC9cL1teOl0rKDpcZCspezIsfShcL3wkKS8iLCAkdHJ1c3Rfcm9vdCkpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgJHBhcnRzID0gQHBhcnNlX3VybCgkdHJ1c3Rfcm9vdCk7CiAgICAgICAgaWYgKCRwYXJ0cyA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgJHJlcXVpcmVkX3BhcnRzID0gYXJyYXkoJ3NjaGVtZScsICdob3N0Jyk7CiAgICAgICAgJGZvcmJpZGRlbl9wYXJ0cyA9IGFycmF5KCd1c2VyJywgJ3Bhc3MnLCAnZnJhZ21lbnQnKTsKICAgICAgICAka2V5cyA9IGFycmF5X2tleXMoJHBhcnRzKTsKICAgICAgICBpZiAoYXJyYXlfaW50ZXJzZWN0KCRrZXlzLCAkcmVxdWlyZWRfcGFydHMpICE9ICRyZXF1aXJlZF9wYXJ0cykgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICBpZiAoYXJyYXlfaW50ZXJzZWN0KCRrZXlzLCAkZm9yYmlkZGVuX3BhcnRzKSAhPSBhcnJheSgpKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CgogICAgICAgIGlmICghcHJlZ19tYXRjaChBdXRoX09wZW5JRF9fX0hvc3RTZWdtZW50UmUsICRwYXJ0c1snaG9zdCddKSkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICAkc2NoZW1lID0gc3RydG9sb3dlcigkcGFydHNbJ3NjaGVtZSddKTsKICAgICAgICAkYWxsb3dlZF9zY2hlbWVzID0gYXJyYXkoJ2h0dHAnLCAnaHR0cHMnKTsKICAgICAgICBpZiAoIWluX2FycmF5KCRzY2hlbWUsICRhbGxvd2VkX3NjaGVtZXMpKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgJHBhcnRzWydzY2hlbWUnXSA9ICRzY2hlbWU7CgogICAgICAgICRob3N0ID0gc3RydG9sb3dlcigkcGFydHNbJ2hvc3QnXSk7CiAgICAgICAgJGhvc3RwYXJ0cyA9IGV4cGxvZGUoJyonLCAkaG9zdCk7CiAgICAgICAgc3dpdGNoIChjb3VudCgkaG9zdHBhcnRzKSkgewogICAgICAgIGNhc2UgMToKICAgICAgICAgICAgJHBhcnRzWyd3aWxkY2FyZCddID0gZmFsc2U7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgaWYgKCRob3N0cGFydHNbMF0gfHwKICAgICAgICAgICAgICAgICgkaG9zdHBhcnRzWzFdICYmIHN1YnN0cigkaG9zdHBhcnRzWzFdLCAwLCAxKSAhPSAnLicpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJGhvc3QgPSAkaG9zdHBhcnRzWzFdOwogICAgICAgICAgICAkcGFydHNbJ3dpbGRjYXJkJ10gPSB0cnVlOwogICAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIGlmIChzdHJwb3MoJGhvc3QsICc6JykgIT09IGZhbHNlKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CgogICAgICAgICRwYXJ0c1snaG9zdCddID0gJGhvc3Q7CgogICAgICAgIGlmIChpc3NldCgkcGFydHNbJ3BhdGgnXSkpIHsKICAgICAgICAgICAgJHBhdGggPSBzdHJ0b2xvd2VyKCRwYXJ0c1sncGF0aCddKTsKICAgICAgICAgICAgaWYgKHN1YnN0cigkcGF0aCwgMCwgMSkgIT0gJy8nKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkcGF0aCA9ICcvJzsKICAgICAgICB9CgogICAgICAgICRwYXJ0c1sncGF0aCddID0gJHBhdGg7CiAgICAgICAgaWYgKCFpc3NldCgkcGFydHNbJ3BvcnQnXSkpIHsKICAgICAgICAgICAgJHBhcnRzWydwb3J0J10gPSBmYWxzZTsKICAgICAgICB9CgoKICAgICAgICAkcGFydHNbJ3VucGFyc2VkJ10gPSAkdHJ1c3Rfcm9vdDsKCiAgICAgICAgcmV0dXJuICRwYXJ0czsKICAgIH0KCiAgICAvKioKICAgICAqIElzIHRoaXMgdHJ1c3Qgcm9vdCBzYW5lPwogICAgICoKICAgICAqIEEgdHJ1c3Qgcm9vdCBpcyBzYW5lIGlmIGl0IGlzIHN5bnRhY3RpY2FsbHkgdmFsaWQgYW5kIGl0IGhhcyBhCiAgICAgKiByZWFzb25hYmxlIGRvbWFpbiBuYW1lLiBTcGVjaWZpY2FsbHksIHRoZSBkb21haW4gbmFtZSBtdXN0IGJlCiAgICAgKiBtb3JlIHRoYW4gb25lIGxldmVsIGJlbG93IGEgc3RhbmRhcmQgVExEIG9yIG1vcmUgdGhhbiB0d28KICAgICAqIGxldmVscyBiZWxvdyBhIHR3by1sZXR0ZXIgdGxkLgogICAgICoKICAgICAqIEZvciBleGFtcGxlLCAnKi5jb20nIGlzIG5vdCBhIHNhbmUgdHJ1c3Qgcm9vdCwgYnV0ICcqLmZvby5jb20nCiAgICAgKiBpcy4gICcqLmNvLnVrJyBpcyBub3Qgc2FuZSwgYnV0ICcqLmJiYy5jby51aycgaXMuCiAgICAgKgogICAgICogVGhpcyBjaGVjayBpcyBub3QgYWx3YXlzIGNvcnJlY3QsIGJ1dCBpdCBhdHRlbXB0cyB0byBlcnIgb24gdGhlCiAgICAgKiBzaWRlIG9mIG1hcmtpbmcgc2FuZSB0cnVzdCByb290cyBpbnNhbmUgaW5zdGVhZCBvZiBtYXJraW5nCiAgICAgKiBpbnNhbmUgdHJ1c3Qgcm9vdHMgc2FuZS4gRm9yIGV4YW1wbGUsICdraW5rLmZtJyBpcyBtYXJrZWQgYXMKICAgICAqIGluc2FuZSBldmVuIHRob3VnaCBpdCAic2hvdWxkIiAoZm9yIHNvbWUgbWVhbmluZyBvZiBzaG91bGQpIGJlCiAgICAgKiBtYXJrZWQgc2FuZS4KICAgICAqCiAgICAgKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSB1c2VkIHdoZW4gY3JlYXRpbmcgT3BlbklEIHNlcnZlcnMgdG8KICAgICAqIGFsZXJ0IHRoZSB1c2VycyBvZiB0aGUgc2VydmVyIHdoZW4gYSBjb25zdW1lciBhdHRlbXB0cyB0byBnZXQKICAgICAqIHRoZSB1c2VyIHRvIGFjY2VwdCBhIHN1c3BpY2lvdXMgdHJ1c3Qgcm9vdC4KICAgICAqCiAgICAgKiBAc3RhdGljCiAgICAgKiBAcGFyYW0gc3RyaW5nICR0cnVzdF9yb290IFRoZSB0cnVzdCByb290IHRvIGNoZWNrCiAgICAgKiBAcmV0dXJuIGJvb2wgJHNhbml0eSBXaGV0aGVyIHRoZSB0cnVzdCByb290IGxvb2tzIE9LCiAgICAgKi8KICAgIHN0YXRpYyBmdW5jdGlvbiBpc1NhbmUoJHRydXN0X3Jvb3QpCiAgICB7CiAgICAgICAgJHBhcnRzID0gQXV0aF9PcGVuSURfVHJ1c3RSb290OjpfcGFyc2UoJHRydXN0X3Jvb3QpOwogICAgICAgIGlmICgkcGFydHMgPT09IGZhbHNlKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CgogICAgICAgIC8vIExvY2FsaG9zdCBpcyBhIHNwZWNpYWwgY2FzZQogICAgICAgIGlmICgkcGFydHNbJ2hvc3QnXSA9PSAnbG9jYWxob3N0JykgewogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgJGhvc3RfcGFydHMgPSBleHBsb2RlKCcuJywgJHBhcnRzWydob3N0J10pOwogICAgICAgIGlmICgkcGFydHNbJ3dpbGRjYXJkJ10pIHsKICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBlbXB0eSBzdHJpbmcgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBhcnJheQogICAgICAgICAgICBhcnJheV9zaGlmdCgkaG9zdF9wYXJ0cyk7CiAgICAgICAgfQoKICAgICAgICBpZiAoJGhvc3RfcGFydHMgJiYgISRob3N0X3BhcnRzW2NvdW50KCRob3N0X3BhcnRzKSAtIDFdKSB7CiAgICAgICAgICAgIGFycmF5X3BvcCgkaG9zdF9wYXJ0cyk7CiAgICAgICAgfQoKICAgICAgICBpZiAoISRob3N0X3BhcnRzKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CgogICAgICAgIC8vIERvbid0IGFsbG93IGFkamFjZW50IGRvdHMKICAgICAgICBpZiAoaW5fYXJyYXkoJycsICRob3N0X3BhcnRzLCB0cnVlKSkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICAvLyBHZXQgdGhlIHRvcC1sZXZlbCBkb21haW4gb2YgdGhlIGhvc3QuIElmIGl0IGlzIG5vdCBhIHZhbGlkIFRMRCwKICAgICAgICAvLyBpdCdzIG5vdCBzYW5lLgogICAgICAgIHByZWdfbWF0Y2goQXV0aF9PcGVuSURfX19UTERzLCAkcGFydHNbJ2hvc3QnXSwgJG1hdGNoZXMpOwogICAgICAgIGlmICghJG1hdGNoZXMpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICAkdGxkID0gJG1hdGNoZXNbMV07CgogICAgICAgIGlmIChjb3VudCgkaG9zdF9wYXJ0cykgPT0gMSkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICBpZiAoJHBhcnRzWyd3aWxkY2FyZCddKSB7CiAgICAgICAgICAgIC8vIEl0J3MgYSAyLWxldHRlciB0bGQgd2l0aCBhIHNob3J0IHNlY29uZCB0byBsYXN0IHNlZ21lbnQKICAgICAgICAgICAgLy8gc28gdGhlcmUgbmVlZHMgdG8gYmUgbW9yZSB0aGFuIHR3byBzZWdtZW50cyBzcGVjaWZpZWQKICAgICAgICAgICAgLy8gKGUuZy4gKi5jby51ayBpcyBpbnNhbmUpCiAgICAgICAgICAgICRzZWNvbmRfbGV2ZWwgPSAkaG9zdF9wYXJ0c1tjb3VudCgkaG9zdF9wYXJ0cykgLSAyXTsKICAgICAgICAgICAgaWYgKHN0cmxlbigkdGxkKSA9PSAyICYmIHN0cmxlbigkc2Vjb25kX2xldmVsKSA8PSAzKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gY291bnQoJGhvc3RfcGFydHMpID4gMjsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgLyoqCiAgICAgKiBEb2VzIHRoaXMgVVJMIG1hdGNoIHRoZSBnaXZlbiB0cnVzdCByb290PwogICAgICoKICAgICAqIFJldHVybiB3aGV0aGVyIHRoZSBVUkwgZmFsbHMgdW5kZXIgdGhlIGdpdmVuIHRydXN0IHJvb3QuIFRoaXMKICAgICAqIGRvZXMgbm90IGNoZWNrIHdoZXRoZXIgdGhlIHRydXN0IHJvb3QgaXMgc2FuZS4gSWYgdGhlIFVSTCBvcgogICAgICogdHJ1c3Qgcm9vdCBkbyBub3QgcGFyc2UsIHRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gZmFsc2UuCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkdHJ1c3Rfcm9vdCBUaGUgdHJ1c3Qgcm9vdCB0byBtYXRjaCBhZ2FpbnN0CiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkdXJsIFRoZSBVUkwgdG8gY2hlY2sKICAgICAqCiAgICAgKiBAcmV0dXJuIGJvb2wgJG1hdGNoZXMgV2hldGhlciB0aGUgVVJMIG1hdGNoZXMgYWdhaW5zdCB0aGUKICAgICAqIHRydXN0IHJvb3QKICAgICAqLwogICAgc3RhdGljIGZ1bmN0aW9uIG1hdGNoKCR0cnVzdF9yb290LCAkdXJsKQogICAgewogICAgICAgICR0cnVzdF9yb290X3BhcnNlZCA9IEF1dGhfT3BlbklEX1RydXN0Um9vdDo6X3BhcnNlKCR0cnVzdF9yb290KTsKICAgICAgICAkdXJsX3BhcnNlZCA9IEF1dGhfT3BlbklEX1RydXN0Um9vdDo6X3BhcnNlKCR1cmwpOwogICAgICAgIGlmICghJHRydXN0X3Jvb3RfcGFyc2VkIHx8ICEkdXJsX3BhcnNlZCkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICAvLyBDaGVjayBob3N0cyBtYXRjaGluZwogICAgICAgIGlmICgkdXJsX3BhcnNlZFsnd2lsZGNhcmQnXSkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIGlmICgkdHJ1c3Rfcm9vdF9wYXJzZWRbJ3dpbGRjYXJkJ10pIHsKICAgICAgICAgICAgJGhvc3RfdGFpbCA9ICR0cnVzdF9yb290X3BhcnNlZFsnaG9zdCddOwogICAgICAgICAgICAkaG9zdCA9ICR1cmxfcGFyc2VkWydob3N0J107CiAgICAgICAgICAgIGlmICgkaG9zdF90YWlsICYmCiAgICAgICAgICAgICAgICBzdWJzdHIoJGhvc3QsIC0oc3RybGVuKCRob3N0X3RhaWwpKSkgIT0gJGhvc3RfdGFpbCAmJgogICAgICAgICAgICAgICAgc3Vic3RyKCRob3N0X3RhaWwsIDEpICE9ICRob3N0KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiAoJHRydXN0X3Jvb3RfcGFyc2VkWydob3N0J10gIT0gJHVybF9wYXJzZWRbJ2hvc3QnXSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBDaGVjayBwYXRoIGFuZCBxdWVyeSBtYXRjaGluZwogICAgICAgICRiYXNlX3BhdGggPSAkdHJ1c3Rfcm9vdF9wYXJzZWRbJ3BhdGgnXTsKICAgICAgICAkcGF0aCA9ICR1cmxfcGFyc2VkWydwYXRoJ107CiAgICAgICAgaWYgKCFpc3NldCgkdHJ1c3Rfcm9vdF9wYXJzZWRbJ3F1ZXJ5J10pKSB7CiAgICAgICAgICAgIGlmICgkYmFzZV9wYXRoICE9ICRwYXRoKSB7CiAgICAgICAgICAgICAgICBpZiAoc3Vic3RyKCRwYXRoLCAwLCBzdHJsZW4oJGJhc2VfcGF0aCkpICE9ICRiYXNlX3BhdGgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoc3Vic3RyKCRiYXNlX3BhdGgsIHN0cmxlbigkYmFzZV9wYXRoKSAtIDEsIDEpICE9ICcvJyAmJgogICAgICAgICAgICAgICAgICAgIHN1YnN0cigkcGF0aCwgc3RybGVuKCRiYXNlX3BhdGgpLCAxKSAhPSAnLycpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkYmFzZV9xdWVyeSA9ICR0cnVzdF9yb290X3BhcnNlZFsncXVlcnknXTsKICAgICAgICAgICAgJHF1ZXJ5ID0gQCR1cmxfcGFyc2VkWydxdWVyeSddOwogICAgICAgICAgICAkcXBsdXMgPSBzdWJzdHIoJHF1ZXJ5LCAwLCBzdHJsZW4oJGJhc2VfcXVlcnkpICsgMSk7CiAgICAgICAgICAgICRicXBsdXMgPSAkYmFzZV9xdWVyeSAuICcmJzsKICAgICAgICAgICAgaWYgKCRiYXNlX3BhdGggIT0gJHBhdGggfHwKICAgICAgICAgICAgICAgICgkYmFzZV9xdWVyeSAhPSAkcXVlcnkgJiYgJHFwbHVzICE9ICRicXBsdXMpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIFRoZSBwb3J0IGFuZCBzY2hlbWUgbmVlZCB0byBtYXRjaCBleGFjdGx5CiAgICAgICAgcmV0dXJuICgkdHJ1c3Rfcm9vdF9wYXJzZWRbJ3NjaGVtZSddID09ICR1cmxfcGFyc2VkWydzY2hlbWUnXSAmJgogICAgICAgICAgICAgICAgJHVybF9wYXJzZWRbJ3BvcnQnXSA9PT0gJHRydXN0X3Jvb3RfcGFyc2VkWydwb3J0J10pOwogICAgfQp9CgovKgogKiBJZiB0aGUgZW5kcG9pbnQgaXMgYSByZWx5aW5nIHBhcnR5IE9wZW5JRCByZXR1cm5fdG8gZW5kcG9pbnQsCiAqIHJldHVybiB0aGUgZW5kcG9pbnQgVVJMLiBPdGhlcndpc2UsIHJldHVybiBOb25lLgogKgogKiBUaGlzIGZ1bmN0aW9uIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgYXMgYSBmaWx0ZXIgZm9yIHRoZSBZYWRpcwogKiBmaWx0ZXJpbmcgaW50ZXJmYWNlLgogKgogKiBAc2VlOiBDe0x7b3BlbmlkLnlhZGlzLnNlcnZpY2VzfX0KICogQHNlZTogQ3tMe29wZW5pZC55YWRpcy5maWx0ZXJzfX0KICoKICogQHBhcmFtIGVuZHBvaW50OiBBbiBYUkRTIEJhc2ljU2VydmljZUVuZHBvaW50LCBhcyByZXR1cm5lZCBieQogKiBwZXJmb3JtaW5nIFlhZGlzIGRpY292ZXJ5LgogKgogKiBAcmV0dXJuczogVGhlIGVuZHBvaW50IFVSTCBvciBOb25lIGlmIHRoZSBlbmRwb2ludCBpcyBub3QgYQogKiByZWx5aW5nIHBhcnR5IGVuZHBvaW50LgogKi8KZnVuY3Rpb24gZmlsdGVyX2V4dHJhY3RSZXR1cm5VUkwoJGVuZHBvaW50KQp7CiAgICBpZiAoJGVuZHBvaW50LT5tYXRjaFR5cGVzKGFycmF5KEF1dGhfT3BlbklEX1JQX1JFVFVSTl9UT19VUkxfVFlQRSkpKSB7CiAgICAgICAgcmV0dXJuICRlbmRwb2ludDsKICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9Cn0KCmZ1bmN0aW9uICZBdXRoX09wZW5JRF9leHRyYWN0UmV0dXJuVVJMKCYkZW5kcG9pbnRfbGlzdCkKewogICAgJHJlc3VsdCA9IGFycmF5KCk7CgogICAgZm9yZWFjaCAoJGVuZHBvaW50X2xpc3QgYXMgJGVuZHBvaW50KSB7CiAgICAgICAgaWYgKGZpbHRlcl9leHRyYWN0UmV0dXJuVVJMKCRlbmRwb2ludCkpIHsKICAgICAgICAgICAgJHJlc3VsdFtdID0gJGVuZHBvaW50OwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gJHJlc3VsdDsKfQoKLyoKICogSXMgdGhlIHJldHVybl90byBVUkwgdW5kZXIgb25lIG9mIHRoZSBzdXBwbGllZCBhbGxvd2VkIHJldHVybl90bwogKiBVUkxzPwogKi8KZnVuY3Rpb24gQXV0aF9PcGVuSURfcmV0dXJuVG9NYXRjaGVzKCRhbGxvd2VkX3JldHVybl90b191cmxzLCAkcmV0dXJuX3RvKQp7CiAgICBmb3JlYWNoICgkYWxsb3dlZF9yZXR1cm5fdG9fdXJscyBhcyAkYWxsb3dlZF9yZXR1cm5fdG8pIHsKICAgICAgICAvLyBBIHJldHVybl90byBwYXR0ZXJuIHdvcmtzIHRoZSBzYW1lIGFzIGEgcmVhbG0sIGV4Y2VwdCB0aGF0CiAgICAgICAgLy8gaXQncyBub3QgYWxsb3dlZCB0byB1c2UgYSB3aWxkY2FyZC4gV2UnbGwgbW9kZWwgdGhpcyBieQogICAgICAgIC8vIHBhcnNpbmcgaXQgYXMgYSByZWFsbSwgYW5kIG5vdCB0cnlpbmcgdG8gbWF0Y2ggaXQgaWYgaXQgaGFzCiAgICAgICAgLy8gYSB3aWxkY2FyZC4KCiAgICAgICAgJHJldHVybl9yZWFsbSA9IEF1dGhfT3BlbklEX1RydXN0Um9vdDo6X3BhcnNlKCRhbGxvd2VkX3JldHVybl90byk7CiAgICAgICAgaWYgKC8vIFBhcnNlcyBhcyBhIHRydXN0IHJvb3QKICAgICAgICAgICAgKCRyZXR1cm5fcmVhbG0gIT09IGZhbHNlKSAmJgogICAgICAgICAgICAvLyBEb2VzIG5vdCBoYXZlIGEgd2lsZGNhcmQKICAgICAgICAgICAgKCEkcmV0dXJuX3JlYWxtWyd3aWxkY2FyZCddKSAmJgogICAgICAgICAgICAvLyBNYXRjaGVzIHRoZSByZXR1cm5fdG8gdGhhdCB3ZSBwYXNzZWQgaW4gd2l0aCBpdAogICAgICAgICAgICAoQXV0aF9PcGVuSURfVHJ1c3RSb290OjptYXRjaCgkYWxsb3dlZF9yZXR1cm5fdG8sICRyZXR1cm5fdG8pKSkgewogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICB9CgogICAgLy8gTm8gVVJMIGluIHRoZSBsaXN0IG1hdGNoZWQKICAgIHJldHVybiBmYWxzZTsKfQoKLyoKICogR2l2ZW4gYSByZWx5aW5nIHBhcnR5IGRpc2NvdmVyeSBVUkwgcmV0dXJuIGEgbGlzdCBvZiByZXR1cm5fdG8KICogVVJMcy4KICovCmZ1bmN0aW9uIEF1dGhfT3BlbklEX2dldEFsbG93ZWRSZXR1cm5VUkxzKCRyZWx5aW5nX3BhcnR5X3VybCwgJGZldGNoZXIsCiAgICAgICAgICAgICAgJGRpc2NvdmVyX2Z1bmN0aW9uPW51bGwpCnsKICAgIGlmICgkZGlzY292ZXJfZnVuY3Rpb24gPT09IG51bGwpIHsKICAgICAgICAkZGlzY292ZXJfZnVuY3Rpb24gPSBhcnJheSgnQXV0aF9ZYWRpc19ZYWRpcycsICdkaXNjb3ZlcicpOwogICAgfQoKICAgICR4cmRzX3BhcnNlX2NiID0gYXJyYXkoJ0F1dGhfT3BlbklEX1NlcnZpY2VFbmRwb2ludCcsICdjb25zdW1lckZyb21YUkRTJyk7CgogICAgbGlzdCgkcnBfdXJsX2FmdGVyX3JlZGlyZWN0cywgJGVuZHBvaW50cykgPQogICAgICAgIEF1dGhfWWFkaXNfZ2V0U2VydmljZUVuZHBvaW50cygkcmVseWluZ19wYXJ0eV91cmwsICR4cmRzX3BhcnNlX2NiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZGlzY292ZXJfZnVuY3Rpb24sICRmZXRjaGVyKTsKCiAgICBpZiAoJHJwX3VybF9hZnRlcl9yZWRpcmVjdHMgIT0gJHJlbHlpbmdfcGFydHlfdXJsKSB7CiAgICAgICAgLy8gVmVyaWZpY2F0aW9uIGNhdXNlZCBhIHJlZGlyZWN0CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIGNhbGxfdXNlcl9mdW5jX2FycmF5KCRkaXNjb3Zlcl9mdW5jdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5KCRyZWx5aW5nX3BhcnR5X3VybCwgJiRmZXRjaGVyKSk7CgogICAgJHJldHVybl90b191cmxzID0gYXJyYXkoKTsKICAgICRtYXRjaGluZ19lbmRwb2ludHMgPSBBdXRoX09wZW5JRF9leHRyYWN0UmV0dXJuVVJMKCRlbmRwb2ludHMpOwoKICAgIGZvcmVhY2ggKCRtYXRjaGluZ19lbmRwb2ludHMgYXMgJGUpIHsKICAgICAgICAkcmV0dXJuX3RvX3VybHNbXSA9ICRlLT5zZXJ2ZXJfdXJsOwogICAgfQoKICAgIHJldHVybiAkcmV0dXJuX3RvX3VybHM7Cn0KCi8qCiAqIFZlcmlmeSB0aGF0IGEgcmV0dXJuX3RvIFVSTCBpcyB2YWxpZCBmb3IgdGhlIGdpdmVuIHJlYWxtLgogKgogKiBUaGlzIGZ1bmN0aW9uIGJ1aWxkcyBhIGRpc2NvdmVyeSBVUkwsIHBlcmZvcm1zIFlhZGlzIGRpc2NvdmVyeSBvbgogKiBpdCwgbWFrZXMgc3VyZSB0aGF0IHRoZSBVUkwgZG9lcyBub3QgcmVkaXJlY3QsIHBhcnNlcyBvdXQgdGhlCiAqIHJldHVybl90byBVUkxzLCBhbmQgZmluYWxseSBjaGVja3MgdG8gc2VlIGlmIHRoZSBjdXJyZW50IHJldHVybl90bwogKiBVUkwgbWF0Y2hlcyB0aGUgcmV0dXJuX3RvLgogKgogKiBAcmV0dXJuIHRydWUgaWYgdGhlIHJldHVybl90byBVUkwgaXMgdmFsaWQgZm9yIHRoZSByZWFsbQogKi8KZnVuY3Rpb24gQXV0aF9PcGVuSURfdmVyaWZ5UmV0dXJuVG8oJHJlYWxtX3N0ciwgJHJldHVybl90bywgJGZldGNoZXIsCiAgICAgICAgICAgICAgJF92cmZ5PSdBdXRoX09wZW5JRF9nZXRBbGxvd2VkUmV0dXJuVVJMcycpCnsKICAgICRkaXNjb191cmwgPSBBdXRoX09wZW5JRF9UcnVzdFJvb3Q6OmJ1aWxkRGlzY292ZXJ5VVJMKCRyZWFsbV9zdHIpOwoKICAgIGlmICgkZGlzY29fdXJsID09PSBmYWxzZSkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICAkYWxsb3dhYmxlX3VybHMgPSBjYWxsX3VzZXJfZnVuY19hcnJheSgkX3ZyZnksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5KCRkaXNjb191cmwsICRmZXRjaGVyKSk7CgogICAgLy8gVGhlIHJlYWxtX3N0ciBjb3VsZCBub3QgYmUgcGFyc2VkLgogICAgaWYgKCRhbGxvd2FibGVfdXJscyA9PT0gZmFsc2UpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgaWYgKEF1dGhfT3BlbklEX3JldHVyblRvTWF0Y2hlcygkYWxsb3dhYmxlX3VybHMsICRyZXR1cm5fdG8pKSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KfQoK]]></data>
	</file>
	<file>
	  <filename>/openid-php-openid-782224d/Auth/OpenID/URINorm.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBVUkkgbm9ybWFsaXphdGlvbiByb3V0aW5lcy4KICoKICogQHBhY2thZ2UgT3BlbklECiAqIEBhdXRob3IgSmFuUmFpbiwgSW5jLiA8b3BlbmlkQGphbnJhaW4uY29tPgogKiBAY29weXJpZ2h0IDIwMDUtMjAwOCBKYW5yYWluLCBJbmMuCiAqIEBsaWNlbnNlIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCBBcGFjaGUKICovCgpyZXF1aXJlX29uY2UgJ0F1dGgvWWFkaXMvTWlzYy5waHAnOwoKLy8gZnJvbSBhcHBlbmRpeCBCIG9mIHJmYyAzOTg2IChodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmMzOTg2LnR4dCkKZnVuY3Rpb24gQXV0aF9PcGVuSURfZ2V0VVJJUGF0dGVybigpCnsKICAgIHJldHVybiAnJl4oKFteOi8/I10rKTopPygvLyhbXi8/I10qKSk/KFtePyNdKikoXD8oW14jXSopKT8oIyguKikpPyYnOwp9CgpmdW5jdGlvbiBBdXRoX09wZW5JRF9nZXRBdXRob3JpdHlQYXR0ZXJuKCkKewogICAgcmV0dXJuICcvXihbXkBdKkApPyhbXjpdKikoOi4qKT8vJzsKfQoKZnVuY3Rpb24gQXV0aF9PcGVuSURfZ2V0RW5jb2RlZFBhdHRlcm4oKQp7CiAgICByZXR1cm4gJy8lKFswLTlBLUZhLWZdezJ9KS8nOwp9CgojIGdlbi1kZWxpbXMgID0gIjoiIC8gIi8iIC8gIj8iIC8gIiMiIC8gIlsiIC8gIl0iIC8gIkAiCiMKIyBzdWItZGVsaW1zICA9ICIhIiAvICIkIiAvICImIiAvICInIiAvICIoIiAvICIpIgojICAgICAgICAgICAgICAgICAgLyAiKiIgLyAiKyIgLyAiLCIgLyAiOyIgLyAiPSIKIwojIHVucmVzZXJ2ZWQgID0gQUxQSEEgLyBESUdJVCAvICItIiAvICIuIiAvICJfIiAvICJ+IgpmdW5jdGlvbiBBdXRoX09wZW5JRF9nZXRVUkxJbGxlZ2FsQ2hhclJFKCkKewogICAgcmV0dXJuICIvKFteLUEtWmEtejAtOTpcL1w/I1xbXF1AXCFcJCYnXChcKVwqXCssOz1cLl9+XCVdKS8iOwp9CgpmdW5jdGlvbiBBdXRoX09wZW5JRF9nZXRVbnJlc2VydmVkKCkKewogICAgJF91bnJlc2VydmVkID0gYXJyYXkoKTsKICAgIGZvciAoJGkgPSAwOyAkaSA8IDI1NjsgJGkrKykgewogICAgICAgICRfdW5yZXNlcnZlZFskaV0gPSBmYWxzZTsKICAgIH0KCiAgICBmb3IgKCRpID0gb3JkKCdBJyk7ICRpIDw9IG9yZCgnWicpOyAkaSsrKSB7CiAgICAgICAgJF91bnJlc2VydmVkWyRpXSA9IHRydWU7CiAgICB9CgogICAgZm9yICgkaSA9IG9yZCgnMCcpOyAkaSA8PSBvcmQoJzknKTsgJGkrKykgewogICAgICAgICRfdW5yZXNlcnZlZFskaV0gPSB0cnVlOwogICAgfQoKICAgIGZvciAoJGkgPSBvcmQoJ2EnKTsgJGkgPD0gb3JkKCd6Jyk7ICRpKyspIHsKICAgICAgICAkX3VucmVzZXJ2ZWRbJGldID0gdHJ1ZTsKICAgIH0KCiAgICAkX3VucmVzZXJ2ZWRbb3JkKCctJyldID0gdHJ1ZTsKICAgICRfdW5yZXNlcnZlZFtvcmQoJy4nKV0gPSB0cnVlOwogICAgJF91bnJlc2VydmVkW29yZCgnXycpXSA9IHRydWU7CiAgICAkX3VucmVzZXJ2ZWRbb3JkKCd+JyldID0gdHJ1ZTsKCiAgICByZXR1cm4gJF91bnJlc2VydmVkOwp9CgpmdW5jdGlvbiBBdXRoX09wZW5JRF9nZXRFc2NhcGVSRSgpCnsKICAgICRwYXJ0cyA9IGFycmF5KCk7CiAgICBmb3JlYWNoIChhcnJheV9tZXJnZShBdXRoX1lhZGlzX2dldFVDU0NoYXJzKCksCiAgICAgICAgICAgICAgICAgICAgICAgICBBdXRoX1lhZGlzX2dldElQcml2YXRlQ2hhcnMoKSkgYXMgJHBhaXIpIHsKICAgICAgICBsaXN0KCRtLCAkbikgPSAkcGFpcjsKICAgICAgICAkcGFydHNbXSA9IHNwcmludGYoIiVzLSVzIiwgY2hyKCRtKSwgY2hyKCRuKSk7CiAgICB9CgogICAgcmV0dXJuIHNwcmludGYoJ1slc10nLCBpbXBsb2RlKCcnLCAkcGFydHMpKTsKfQoKZnVuY3Rpb24gQXV0aF9PcGVuSURfcGN0X2VuY29kZWRfcmVwbGFjZV91bnJlc2VydmVkKCRtbykKewogICAgJF91bnJlc2VydmVkID0gQXV0aF9PcGVuSURfZ2V0VW5yZXNlcnZlZCgpOwoKICAgICRpID0gaW50dmFsKCRtb1sxXSwgMTYpOwogICAgaWYgKCRfdW5yZXNlcnZlZFskaV0pIHsKICAgICAgICByZXR1cm4gY2hyKCRpKTsKICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIHN0cnRvdXBwZXIoJG1vWzBdKTsKICAgIH0KCiAgICByZXR1cm4gJG1vWzBdOwp9CgpmdW5jdGlvbiBBdXRoX09wZW5JRF9wY3RfZW5jb2RlZF9yZXBsYWNlKCRtbykKewogICAgcmV0dXJuIGNocihpbnR2YWwoJG1vWzFdLCAxNikpOwp9CgpmdW5jdGlvbiBBdXRoX09wZW5JRF9yZW1vdmVfZG90X3NlZ21lbnRzKCRwYXRoKQp7CiAgICAkcmVzdWx0X3NlZ21lbnRzID0gYXJyYXkoKTsKCiAgICB3aGlsZSAoJHBhdGgpIHsKICAgICAgICBpZiAoQXV0aF9ZYWRpc19zdGFydHN3aXRoKCRwYXRoLCAnLi4vJykpIHsKICAgICAgICAgICAgJHBhdGggPSBzdWJzdHIoJHBhdGgsIDMpOwogICAgICAgIH0gZWxzZSBpZiAoQXV0aF9ZYWRpc19zdGFydHN3aXRoKCRwYXRoLCAnLi8nKSkgewogICAgICAgICAgICAkcGF0aCA9IHN1YnN0cigkcGF0aCwgMik7CiAgICAgICAgfSBlbHNlIGlmIChBdXRoX1lhZGlzX3N0YXJ0c3dpdGgoJHBhdGgsICcvLi8nKSkgewogICAgICAgICAgICAkcGF0aCA9IHN1YnN0cigkcGF0aCwgMik7CiAgICAgICAgfSBlbHNlIGlmICgkcGF0aCA9PSAnLy4nKSB7CiAgICAgICAgICAgICRwYXRoID0gJy8nOwogICAgICAgIH0gZWxzZSBpZiAoQXV0aF9ZYWRpc19zdGFydHN3aXRoKCRwYXRoLCAnLy4uLycpKSB7CiAgICAgICAgICAgICRwYXRoID0gc3Vic3RyKCRwYXRoLCAzKTsKICAgICAgICAgICAgaWYgKCRyZXN1bHRfc2VnbWVudHMpIHsKICAgICAgICAgICAgICAgIGFycmF5X3BvcCgkcmVzdWx0X3NlZ21lbnRzKTsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoJHBhdGggPT0gJy8uLicpIHsKICAgICAgICAgICAgJHBhdGggPSAnLyc7CiAgICAgICAgICAgIGlmICgkcmVzdWx0X3NlZ21lbnRzKSB7CiAgICAgICAgICAgICAgICBhcnJheV9wb3AoJHJlc3VsdF9zZWdtZW50cyk7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKCgkcGF0aCA9PSAnLi4nKSB8fAogICAgICAgICAgICAgICAgICAgKCRwYXRoID09ICcuJykpIHsKICAgICAgICAgICAgJHBhdGggPSAnJzsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkaSA9IDA7CiAgICAgICAgICAgIGlmICgkcGF0aFswXSA9PSAnLycpIHsKICAgICAgICAgICAgICAgICRpID0gMTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkaSA9IHN0cnBvcygkcGF0aCwgJy8nLCAkaSk7CiAgICAgICAgICAgIGlmICgkaSA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgICRpID0gc3RybGVuKCRwYXRoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkcmVzdWx0X3NlZ21lbnRzW10gPSBzdWJzdHIoJHBhdGgsIDAsICRpKTsKICAgICAgICAgICAgJHBhdGggPSBzdWJzdHIoJHBhdGgsICRpKTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIGltcGxvZGUoJycsICRyZXN1bHRfc2VnbWVudHMpOwp9CgpmdW5jdGlvbiBBdXRoX09wZW5JRF91cmlub3JtKCR1cmkpCnsKICAgICR1cmlfbWF0Y2hlcyA9IGFycmF5KCk7CiAgICBwcmVnX21hdGNoKEF1dGhfT3BlbklEX2dldFVSSVBhdHRlcm4oKSwgJHVyaSwgJHVyaV9tYXRjaGVzKTsKCiAgICBpZiAoY291bnQoJHVyaV9tYXRjaGVzKSA8IDkpIHsKICAgICAgICBmb3IgKCRpID0gY291bnQoJHVyaV9tYXRjaGVzKTsgJGkgPD0gOTsgJGkrKykgewogICAgICAgICAgICAkdXJpX21hdGNoZXNbXSA9ICcnOwogICAgICAgIH0KICAgIH0KCiAgICAkaWxsZWdhbF9tYXRjaGVzID0gYXJyYXkoKTsKICAgIHByZWdfbWF0Y2goQXV0aF9PcGVuSURfZ2V0VVJMSWxsZWdhbENoYXJSRSgpLAogICAgICAgICAgICAgICAkdXJpLCAkaWxsZWdhbF9tYXRjaGVzKTsKICAgIGlmICgkaWxsZWdhbF9tYXRjaGVzKSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9CgogICAgJHNjaGVtZSA9ICR1cmlfbWF0Y2hlc1syXTsKICAgIGlmICgkc2NoZW1lKSB7CiAgICAgICAgJHNjaGVtZSA9IHN0cnRvbG93ZXIoJHNjaGVtZSk7CiAgICB9CgogICAgJHNjaGVtZSA9ICR1cmlfbWF0Y2hlc1syXTsKICAgIGlmICgkc2NoZW1lID09PSAnJykgewogICAgICAgIC8vIE5vIHNjaGVtZSBzcGVjaWZpZWQKICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KCiAgICAkc2NoZW1lID0gc3RydG9sb3dlcigkc2NoZW1lKTsKICAgIGlmICghaW5fYXJyYXkoJHNjaGVtZSwgYXJyYXkoJ2h0dHAnLCAnaHR0cHMnKSkpIHsKICAgICAgICAvLyBOb3QgYW4gYWJzb2x1dGUgSFRUUCBvciBIVFRQUyBVUkkKICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KCiAgICAkYXV0aG9yaXR5ID0gJHVyaV9tYXRjaGVzWzRdOwogICAgaWYgKCRhdXRob3JpdHkgPT09ICcnKSB7CiAgICAgICAgLy8gTm90IGFuIGFic29sdXRlIFVSSQogICAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgICRhdXRob3JpdHlfbWF0Y2hlcyA9IGFycmF5KCk7CiAgICBwcmVnX21hdGNoKEF1dGhfT3BlbklEX2dldEF1dGhvcml0eVBhdHRlcm4oKSwKICAgICAgICAgICAgICAgJGF1dGhvcml0eSwgJGF1dGhvcml0eV9tYXRjaGVzKTsKICAgIGlmIChjb3VudCgkYXV0aG9yaXR5X21hdGNoZXMpID09PSAwKSB7CiAgICAgICAgLy8gVVJJIGRvZXMgbm90IGhhdmUgYSB2YWxpZCBhdXRob3JpdHkKICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KCiAgICBpZiAoY291bnQoJGF1dGhvcml0eV9tYXRjaGVzKSA8IDQpIHsKICAgICAgICBmb3IgKCRpID0gY291bnQoJGF1dGhvcml0eV9tYXRjaGVzKTsgJGkgPD0gNDsgJGkrKykgewogICAgICAgICAgICAkYXV0aG9yaXR5X21hdGNoZXNbXSA9ICcnOwogICAgICAgIH0KICAgIH0KCiAgICBsaXN0KCRfd2hvbGUsICR1c2VyaW5mbywgJGhvc3QsICRwb3J0KSA9ICRhdXRob3JpdHlfbWF0Y2hlczsKCiAgICBpZiAoJHVzZXJpbmZvID09PSBudWxsKSB7CiAgICAgICAgJHVzZXJpbmZvID0gJyc7CiAgICB9CgogICAgaWYgKHN0cnBvcygkaG9zdCwgJyUnKSAhPT0gLTEpIHsKICAgICAgICAkaG9zdCA9IHN0cnRvbG93ZXIoJGhvc3QpOwogICAgICAgICRob3N0ID0gcHJlZ19yZXBsYWNlX2NhbGxiYWNrKAogICAgICAgICAgICAgICAgICBBdXRoX09wZW5JRF9nZXRFbmNvZGVkUGF0dGVybigpLAogICAgICAgICAgICAgICAgICAnQXV0aF9PcGVuSURfcGN0X2VuY29kZWRfcmVwbGFjZScsICRob3N0KTsKICAgICAgICAvLyBOTyBJRE5BLgogICAgICAgIC8vICRob3N0ID0gdW5pY29kZSgkaG9zdCwgJ3V0Zi04JykuZW5jb2RlKCdpZG5hJyk7CiAgICB9IGVsc2UgewogICAgICAgICRob3N0ID0gc3RydG9sb3dlcigkaG9zdCk7CiAgICB9CgogICAgaWYgKCRwb3J0KSB7CiAgICAgICAgaWYgKCgkcG9ydCA9PSAnOicpIHx8CiAgICAgICAgICAgICgkc2NoZW1lID09ICdodHRwJyAmJiAkcG9ydCA9PSAnOjgwJykgfHwKICAgICAgICAgICAgKCRzY2hlbWUgPT0gJ2h0dHBzJyAmJiAkcG9ydCA9PSAnOjQ0MycpKSB7CiAgICAgICAgICAgICRwb3J0ID0gJyc7CiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICAkcG9ydCA9ICcnOwogICAgfQoKICAgICRhdXRob3JpdHkgPSAkdXNlcmluZm8gLiAkaG9zdCAuICRwb3J0OwoKICAgICRwYXRoID0gJHVyaV9tYXRjaGVzWzVdOwogICAgJHBhdGggPSBwcmVnX3JlcGxhY2VfY2FsbGJhY2soCiAgICAgICAgICAgICAgIEF1dGhfT3BlbklEX2dldEVuY29kZWRQYXR0ZXJuKCksCiAgICAgICAgICAgICAgICdBdXRoX09wZW5JRF9wY3RfZW5jb2RlZF9yZXBsYWNlX3VucmVzZXJ2ZWQnLCAkcGF0aCk7CgogICAgJHBhdGggPSBBdXRoX09wZW5JRF9yZW1vdmVfZG90X3NlZ21lbnRzKCRwYXRoKTsKICAgIGlmICghJHBhdGgpIHsKICAgICAgICAkcGF0aCA9ICcvJzsKICAgIH0KCiAgICAkcXVlcnkgPSAkdXJpX21hdGNoZXNbNl07CiAgICBpZiAoJHF1ZXJ5ID09PSBudWxsKSB7CiAgICAgICAgJHF1ZXJ5ID0gJyc7CiAgICB9CgogICAgJGZyYWdtZW50ID0gJHVyaV9tYXRjaGVzWzhdOwogICAgaWYgKCRmcmFnbWVudCA9PT0gbnVsbCkgewogICAgICAgICRmcmFnbWVudCA9ICcnOwogICAgfQoKICAgIHJldHVybiAkc2NoZW1lIC4gJzovLycgLiAkYXV0aG9yaXR5IC4gJHBhdGggLiAkcXVlcnkgLiAkZnJhZ21lbnQ7Cn0KCgo=]]></data>
	</file>
	<file>
	  <filename>/openid-php-openid-782224d/Auth/Yadis/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/openid-php-openid-782224d/Auth/Yadis/HTTPFetcher.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBUaGlzIG1vZHVsZSBjb250YWlucyB0aGUgSFRUUCBmZXRjaGVyIGludGVyZmFjZQogKgogKiBQSFAgdmVyc2lvbnMgNCBhbmQgNQogKgogKiBMSUNFTlNFOiBTZWUgdGhlIENPUFlJTkcgZmlsZSBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbi4KICoKICogQHBhY2thZ2UgT3BlbklECiAqIEBhdXRob3IgSmFuUmFpbiwgSW5jLiA8b3BlbmlkQGphbnJhaW4uY29tPgogKiBAY29weXJpZ2h0IDIwMDUtMjAwOCBKYW5yYWluLCBJbmMuCiAqIEBsaWNlbnNlIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCBBcGFjaGUKICovCgovKioKICogUmVxdWlyZSBsb2dnaW5nIGZ1bmN0aW9uYWxpdHkKICovCnJlcXVpcmVfb25jZSAiQXV0aC9PcGVuSUQucGhwIjsKCmRlZmluZSgnQXV0aF9PcGVuSURfRkVUQ0hFUl9NQVhfUkVTUE9OU0VfS0InLCAxMDI0KTsKZGVmaW5lKCdBdXRoX09wZW5JRF9VU0VSX0FHRU5UJywgCiAgICAgICAncGhwLW9wZW5pZC8nLkF1dGhfT3BlbklEX1ZFUlNJT04uJyAocGhwLycucGhwdmVyc2lvbigpLicpJyk7CgpjbGFzcyBBdXRoX1lhZGlzX0hUVFBSZXNwb25zZSB7CiAgICBmdW5jdGlvbiBBdXRoX1lhZGlzX0hUVFBSZXNwb25zZSgkZmluYWxfdXJsID0gbnVsbCwgJHN0YXR1cyA9IG51bGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGhlYWRlcnMgPSBudWxsLCAkYm9keSA9IG51bGwpCiAgICB7CiAgICAgICAgJHRoaXMtPmZpbmFsX3VybCA9ICRmaW5hbF91cmw7CiAgICAgICAgJHRoaXMtPnN0YXR1cyA9ICRzdGF0dXM7CiAgICAgICAgJHRoaXMtPmhlYWRlcnMgPSAkaGVhZGVyczsKICAgICAgICAkdGhpcy0+Ym9keSA9ICRib2R5OwogICAgfQp9CgovKioKICogVGhpcyBjbGFzcyBpcyB0aGUgaW50ZXJmYWNlIGZvciBIVFRQIGZldGNoZXJzIHRoZSBZYWRpcyBsaWJyYXJ5CiAqIHVzZXMuICBUaGlzIGludGVyZmFjZSBpcyBvbmx5IGltcG9ydGFudCBpZiB5b3UgbmVlZCB0byB3cml0ZSBhIG5ldwogKiBmZXRjaGVyIGZvciBzb21lIHJlYXNvbi4KICoKICogQGFjY2VzcyBwcml2YXRlCiAqIEBwYWNrYWdlIE9wZW5JRAogKi8KY2xhc3MgQXV0aF9ZYWRpc19IVFRQRmV0Y2hlciB7CgogICAgdmFyICR0aW1lb3V0ID0gMjA7IC8vIHRpbWVvdXQgaW4gc2Vjb25kcy4KCiAgICAvKioKICAgICAqIFJldHVybiB3aGV0aGVyIGEgVVJMIGNhbiBiZSBmZXRjaGVkLiAgUmV0dXJucyBmYWxzZSBpZiB0aGUgVVJMCiAgICAgKiBzY2hlbWUgaXMgbm90IGFsbG93ZWQgb3IgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGZldGNoZXIKICAgICAqIGltcGxlbWVudGF0aW9uOyByZXR1cm5zIHRydWUgb3RoZXJ3aXNlLgogICAgICoKICAgICAqIEByZXR1cm4gYm9vbAogICAgICovCiAgICBmdW5jdGlvbiBjYW5GZXRjaFVSTCgkdXJsKQogICAgewogICAgICAgIGlmICgkdGhpcy0+aXNIVFRQUygkdXJsKSAmJiAhJHRoaXMtPnN1cHBvcnRzU1NMKCkpIHsKICAgICAgICAgICAgQXV0aF9PcGVuSUQ6OmxvZygiSFRUUFMgVVJMIHVuc3VwcG9ydGVkIGZldGNoaW5nICVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdXJsKTsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgaWYgKCEkdGhpcy0+YWxsb3dlZFVSTCgkdXJsKSkgewogICAgICAgICAgICBBdXRoX09wZW5JRDo6bG9nKCJVUkwgZmV0Y2hpbmcgbm90IGFsbG93ZWQgZm9yICclcyciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICR1cmwpOwogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybiB3aGV0aGVyIGEgVVJMIHNob3VsZCBiZSBhbGxvd2VkLiBPdmVycmlkZSB0aGlzIG1ldGhvZCB0bwogICAgICogY29uZm9ybSB0byB5b3VyIGxvY2FsIHBvbGljeS4KICAgICAqCiAgICAgKiBCeSBkZWZhdWx0LCB3aWxsIGF0dGVtcHQgdG8gZmV0Y2ggYW55IGh0dHAgb3IgaHR0cHMgVVJMLgogICAgICovCiAgICBmdW5jdGlvbiBhbGxvd2VkVVJMKCR1cmwpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5VUkxIYXNBbGxvd2VkU2NoZW1lKCR1cmwpOwogICAgfQoKICAgIC8qKgogICAgICogRG9lcyB0aGlzIGZldGNoZXIgaW1wbGVtZW50YXRpb24gKGFuZCBydW50aW1lKSBzdXBwb3J0IGZldGNoaW5nCiAgICAgKiBIVFRQUyBVUkxzPyAgTWF5IGluc3BlY3QgdGhlIHJ1bnRpbWUgZW52aXJvbm1lbnQuCiAgICAgKgogICAgICogQHJldHVybiBib29sICRzdXBwb3J0IFRydWUgaWYgdGhpcyBmZXRjaGVyIHN1cHBvcnRzIEhUVFBTCiAgICAgKiBmZXRjaGluZzsgZmFsc2UgaWYgbm90LgogICAgICovCiAgICBmdW5jdGlvbiBzdXBwb3J0c1NTTCgpCiAgICB7CiAgICAgICAgdHJpZ2dlcl9lcnJvcigibm90IGltcGxlbWVudGVkIiwgRV9VU0VSX0VSUk9SKTsKICAgIH0KCiAgICAvKioKICAgICAqIElzIHRoaXMgYW4gaHR0cHMgVVJMPwogICAgICoKICAgICAqIEBhY2Nlc3MgcHJpdmF0ZQogICAgICovCiAgICBmdW5jdGlvbiBpc0hUVFBTKCR1cmwpCiAgICB7CiAgICAgICAgcmV0dXJuIChib29sKXByZWdfbWF0Y2goJy9eaHR0cHM6XC9cLy9pJywgJHVybCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBJcyB0aGlzIGFuIGh0dHAgb3IgaHR0cHMgVVJMPwogICAgICoKICAgICAqIEBhY2Nlc3MgcHJpdmF0ZQogICAgICovCiAgICBmdW5jdGlvbiBVUkxIYXNBbGxvd2VkU2NoZW1lKCR1cmwpCiAgICB7CiAgICAgICAgcmV0dXJuIChib29sKXByZWdfbWF0Y2goJy9eaHR0cHM/OlwvXC8vaScsICR1cmwpOwogICAgfQoKICAgIC8qKgogICAgICogQGFjY2VzcyBwcml2YXRlCiAgICAgKi8KICAgIGZ1bmN0aW9uIF9maW5kUmVkaXJlY3QoJGhlYWRlcnMsICR1cmwpCiAgICB7CiAgICAgICAgZm9yZWFjaCAoJGhlYWRlcnMgYXMgJGxpbmUpIHsKICAgICAgICAgICAgaWYgKHN0cnBvcyhzdHJ0b2xvd2VyKCRsaW5lKSwgImxvY2F0aW9uOiAiKSA9PT0gMCkgewogICAgICAgICAgICAgICAgJHBhcnRzID0gZXhwbG9kZSgiICIsICRsaW5lLCAyKTsKICAgICAgICAgICAgICAgICRsb2MgPSAkcGFydHNbMV07CiAgICAgICAgICAgICAgICAkcHBvcyA9IHN0cnBvcygkbG9jLCAiOi8vIik7CiAgICAgICAgICAgICAgICBpZiAoJHBwb3MgPT09IGZhbHNlIHx8ICRwcG9zID4gc3RycG9zKCRsb2MsICIvIikpIHsKICAgICAgICAgICAgICAgICAgLyogbm8gaG9zdDsgYWRkIGl0ICovCiAgICAgICAgICAgICAgICAgICRocG9zID0gc3RycG9zKCR1cmwsICI6Ly8iKTsKICAgICAgICAgICAgICAgICAgJHBydCA9IHN1YnN0cigkdXJsLCAwLCAkaHBvcyszKTsKICAgICAgICAgICAgICAgICAgJHVybCA9IHN1YnN0cigkdXJsLCAkaHBvcyszKTsKICAgICAgICAgICAgICAgICAgaWYgKHN1YnN0cigkbG9jLCAwLCAxKSA9PSAiLyIpIHsKICAgICAgICAgICAgICAgICAgICAvKiBhYnNvbHV0ZSBwYXRoICovCiAgICAgICAgICAgICAgICAgICAgJGZzcG9zID0gc3RycG9zKCR1cmwsICIvIik7CiAgICAgICAgICAgICAgICAgICAgaWYgKCRmc3BvcykgJGxvYyA9ICRwcnQuc3Vic3RyKCR1cmwsIDAsICRmc3BvcykuJGxvYzsKICAgICAgICAgICAgICAgICAgICBlbHNlICRsb2MgPSAkcHJ0LiR1cmwuJGxvYzsKICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAvKiByZWxhdGl2ZSBwYXRoICovCiAgICAgICAgICAgICAgICAgICAgJHBwID0gJHBydDsKICAgICAgICAgICAgICAgICAgICB3aGlsZSAoMSkgewogICAgICAgICAgICAgICAgICAgICAgJHhwb3MgPSBzdHJwb3MoJHVybCwgIi8iKTsKICAgICAgICAgICAgICAgICAgICAgIGlmICgkeHBvcyA9PT0gZmFsc2UpIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgJGFwb3MgPSBzdHJwb3MoJHVybCwgIj8iKTsKICAgICAgICAgICAgICAgICAgICAgIGlmICgkYXBvcyAhPT0gZmFsc2UgJiYgJGFwb3MgPCAkeHBvcykgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAkYXBvcyA9IHN0cnBvcygkdXJsLCAiJiIpOwogICAgICAgICAgICAgICAgICAgICAgaWYgKCRhcG9zICE9PSBmYWxzZSAmJiAkYXBvcyA8ICR4cG9zKSBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICRwcCAuPSBzdWJzdHIoJHVybCwgMCwgJHhwb3MrMSk7CiAgICAgICAgICAgICAgICAgICAgICAkdXJsID0gc3Vic3RyKCR1cmwsICR4cG9zKzEpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkbG9jID0gJHBwLiRsb2M7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiAkbG9jOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgIC8qKgogICAgICogRmV0Y2hlcyB0aGUgc3BlY2lmaWVkIFVSTCB1c2luZyBvcHRpb25hbCBleHRyYSBoZWFkZXJzIGFuZAogICAgICogcmV0dXJucyB0aGUgc2VydmVyJ3MgcmVzcG9uc2UuCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkdXJsIFRoZSBVUkwgdG8gYmUgZmV0Y2hlZC4KICAgICAqIEBwYXJhbSBhcnJheSAkZXh0cmFfaGVhZGVycyBBbiBhcnJheSBvZiBoZWFkZXIgc3RyaW5ncwogICAgICogKGUuZy4gIkFjY2VwdDogdGV4dC9odG1sIikuCiAgICAgKiBAcmV0dXJuIG1peGVkICRyZXN1bHQgQW4gYXJyYXkgb2YgKCRjb2RlLCAkdXJsLCAkaGVhZGVycywKICAgICAqICRib2R5KSBpZiB0aGUgVVJMIGNvdWxkIGJlIGZldGNoZWQ7IG51bGwgaWYgdGhlIFVSTCBkb2VzIG5vdAogICAgICogcGFzcyB0aGUgVVJMSGFzQWxsb3dlZFNjaGVtZSBjaGVjayBvciBpZiB0aGUgc2VydmVyJ3MgcmVzcG9uc2UKICAgICAqIGlzIG1hbGZvcm1lZC4KICAgICAqLwogICAgZnVuY3Rpb24gZ2V0KCR1cmwsICRoZWFkZXJzID0gbnVsbCkKICAgIHsKICAgICAgICB0cmlnZ2VyX2Vycm9yKCJub3QgaW1wbGVtZW50ZWQiLCBFX1VTRVJfRVJST1IpOwogICAgfQp9Cgo=]]></data>
	</file>
	<file>
	  <filename>/openid-php-openid-782224d/Auth/Yadis/Manager.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBZYWRpcyBzZXJ2aWNlIG1hbmFnZXIgdG8gYmUgdXNlZCBkdXJpbmcgeWFkaXMtZHJpdmVuIGF1dGhlbnRpY2F0aW9uCiAqIGF0dGVtcHRzLgogKgogKiBAcGFja2FnZSBPcGVuSUQKICovCgovKioKICogVGhlIGJhc2Ugc2Vzc2lvbiBjbGFzcyB1c2VkIGJ5IHRoZSBBdXRoX1lhZGlzX01hbmFnZXIuICBUaGlzCiAqIGNsYXNzIHdyYXBzIHRoZSBkZWZhdWx0IFBIUCBzZXNzaW9uIG1hY2hpbmVyeSBhbmQgc2hvdWxkIGJlCiAqIHN1YmNsYXNzZWQgaWYgeW91ciBhcHBsaWNhdGlvbiBkb2Vzbid0IHVzZSBQSFAgc2Vzc2lvbmluZy4KICoKICogQHBhY2thZ2UgT3BlbklECiAqLwpjbGFzcyBBdXRoX1lhZGlzX1BIUFNlc3Npb24gewogICAgLyoqCiAgICAgKiBTZXQgYSBzZXNzaW9uIGtleS92YWx1ZSBwYWlyLgogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgJG5hbWUgVGhlIG5hbWUgb2YgdGhlIHNlc3Npb24ga2V5IHRvIGFkZC4KICAgICAqIEBwYXJhbSBzdHJpbmcgJHZhbHVlIFRoZSB2YWx1ZSB0byBhZGQgdG8gdGhlIHNlc3Npb24uCiAgICAgKi8KICAgIGZ1bmN0aW9uIHNldCgkbmFtZSwgJHZhbHVlKQogICAgewogICAgICAgICRfU0VTU0lPTlskbmFtZV0gPSAkdmFsdWU7CiAgICB9CgogICAgLyoqCiAgICAgKiBHZXQgYSBrZXkncyB2YWx1ZSBmcm9tIHRoZSBzZXNzaW9uLgogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgJG5hbWUgVGhlIG5hbWUgb2YgdGhlIGtleSB0byByZXRyaWV2ZS4KICAgICAqIEBwYXJhbSBzdHJpbmcgJGRlZmF1bHQgVGhlIG9wdGlvbmFsIHZhbHVlIHRvIHJldHVybiBpZiB0aGUga2V5CiAgICAgKiBpcyBub3QgZm91bmQgaW4gdGhlIHNlc3Npb24uCiAgICAgKiBAcmV0dXJuIHN0cmluZyAkcmVzdWx0IFRoZSBrZXkncyB2YWx1ZSBpbiB0aGUgc2Vzc2lvbiBvcgogICAgICogJGRlZmF1bHQgaWYgaXQgaXNuJ3QgZm91bmQuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldCgkbmFtZSwgJGRlZmF1bHQ9bnVsbCkKICAgIHsKICAgICAgICBpZiAoYXJyYXlfa2V5X2V4aXN0cygkbmFtZSwgJF9TRVNTSU9OKSkgewogICAgICAgICAgICByZXR1cm4gJF9TRVNTSU9OWyRuYW1lXTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gJGRlZmF1bHQ7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogUmVtb3ZlIGEga2V5L3ZhbHVlIHBhaXIgZnJvbSB0aGUgc2Vzc2lvbi4KICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lIFRoZSBuYW1lIG9mIHRoZSBrZXkgdG8gcmVtb3ZlLgogICAgICovCiAgICBmdW5jdGlvbiBkZWwoJG5hbWUpCiAgICB7CiAgICAgICAgdW5zZXQoJF9TRVNTSU9OWyRuYW1lXSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm4gdGhlIGNvbnRlbnRzIG9mIHRoZSBzZXNzaW9uIGluIGFycmF5IGZvcm0uCiAgICAgKi8KICAgIGZ1bmN0aW9uIGNvbnRlbnRzKCkKICAgIHsKICAgICAgICByZXR1cm4gJF9TRVNTSU9OOwogICAgfQp9CgovKioKICogQSBzZXNzaW9uIGhlbHBlciBjbGFzcyBkZXNpZ25lZCB0byB0cmFuc2xhdGUgYmV0d2VlbiBhcnJheXMgYW5kCiAqIG9iamVjdHMuICBOb3RlIHRoYXQgdGhlIGNsYXNzIHVzZWQgbXVzdCBoYXZlIGEgY29uc3RydWN0b3IgdGhhdAogKiB0YWtlcyBubyBwYXJhbWV0ZXJzLiAgVGhpcyBpcyBub3QgYSBnZW5lcmFsIHNvbHV0aW9uLCBidXQgaXQgd29ya3MKICogZm9yIGR1bWIgb2JqZWN0cyB0aGF0IGp1c3QgbmVlZCB0byBoYXZlIGF0dHJpYnV0ZXMgc2V0LiAgVGhlIGlkZWEKICogaXMgdGhhdCB5b3UnbGwgc3ViY2xhc3MgdGhpcyBhbmQgb3ZlcnJpZGUgJHRoaXMtPmNoZWNrKCRkYXRhKSAtPgogKiBib29sIHRvIGltcGxlbWVudCB5b3VyIG93biBzZXNzaW9uIGRhdGEgdmFsaWRhdGlvbi4KICoKICogQHBhY2thZ2UgT3BlbklECiAqLwpjbGFzcyBBdXRoX1lhZGlzX1Nlc3Npb25Mb2FkZXIgewogICAgLyoqCiAgICAgKiBPdmVycmlkZSB0aGlzLgogICAgICoKICAgICAqIEBhY2Nlc3MgcHJpdmF0ZQogICAgICovCiAgICBmdW5jdGlvbiBjaGVjaygkZGF0YSkKICAgIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICAvKioKICAgICAqIEdpdmVuIGEgc2Vzc2lvbiBkYXRhIHZhbHVlIChhbiBhcnJheSksIHRoaXMgY3JlYXRlcyBhbiBvYmplY3QKICAgICAqIChyZXR1cm5lZCBieSAkdGhpcy0+bmV3T2JqZWN0KCkpIHdob3NlIGF0dHJpYnV0ZXMgYW5kIHZhbHVlcwogICAgICogYXJlIHRob3NlIGluICRkYXRhLiAgUmV0dXJucyBudWxsIGlmICRkYXRhIGxhY2tzIGtleXMgZm91bmQgaW4KICAgICAqICR0aGlzLT5yZXF1aXJlZEtleXMoKS4gIFJldHVybnMgbnVsbCBpZiAkdGhpcy0+Y2hlY2soJGRhdGEpCiAgICAgKiBldmFsdWF0ZXMgdG8gZmFsc2UuICBSZXR1cm5zIG51bGwgaWYgJHRoaXMtPm5ld09iamVjdCgpCiAgICAgKiBldmFsdWF0ZXMgdG8gZmFsc2UuCiAgICAgKgogICAgICogQGFjY2VzcyBwcml2YXRlCiAgICAgKi8KICAgIGZ1bmN0aW9uIGZyb21TZXNzaW9uKCRkYXRhKQogICAgewogICAgICAgIGlmICghJGRhdGEpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQoKICAgICAgICAkcmVxdWlyZWQgPSAkdGhpcy0+cmVxdWlyZWRLZXlzKCk7CgogICAgICAgIGZvcmVhY2ggKCRyZXF1aXJlZCBhcyAkaykgewogICAgICAgICAgICBpZiAoIWFycmF5X2tleV9leGlzdHMoJGssICRkYXRhKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICghJHRoaXMtPmNoZWNrKCRkYXRhKSkgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CgogICAgICAgICRkYXRhID0gYXJyYXlfbWVyZ2UoJGRhdGEsICR0aGlzLT5wcmVwYXJlRm9yTG9hZCgkZGF0YSkpOwogICAgICAgICRvYmogPSAkdGhpcy0+bmV3T2JqZWN0KCRkYXRhKTsKCiAgICAgICAgaWYgKCEkb2JqKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KCiAgICAgICAgZm9yZWFjaCAoJHJlcXVpcmVkIGFzICRrKSB7CiAgICAgICAgICAgICRvYmotPiRrID0gJGRhdGFbJGtdOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRvYmo7CiAgICB9CgogICAgLyoqCiAgICAgKiBQcmVwYXJlcyB0aGUgZGF0YSBhcnJheSBieSBtYWtpbmcgYW55IG5lY2Vzc2FyeSBjaGFuZ2VzLgogICAgICogUmV0dXJucyBhbiBhcnJheSB3aG9zZSBrZXlzIGFuZCB2YWx1ZXMgd2lsbCBiZSB1c2VkIHRvIHVwZGF0ZQogICAgICogdGhlIG9yaWdpbmFsIGRhdGEgYXJyYXkgYmVmb3JlIGNhbGxpbmcgJHRoaXMtPm5ld09iamVjdCgkZGF0YSkuCiAgICAgKgogICAgICogQGFjY2VzcyBwcml2YXRlCiAgICAgKi8KICAgIGZ1bmN0aW9uIHByZXBhcmVGb3JMb2FkKCRkYXRhKQogICAgewogICAgICAgIHJldHVybiBhcnJheSgpOwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGxvYWRlcidzIGNsYXNzLCB1c2luZyB0aGUKICAgICAqIHNlc3Npb24gZGF0YSB0byBjb25zdHJ1Y3QgaXQgaWYgbmVjZXNzYXJ5LiAgVGhlIG9iamVjdCBuZWVkCiAgICAgKiBvbmx5IGJlIGNyZWF0ZWQ7ICR0aGlzLT5mcm9tU2Vzc2lvbigpIHdpbGwgdGFrZSBjYXJlIG9mIHNldHRpbmcKICAgICAqIHRoZSBvYmplY3QncyBhdHRyaWJ1dGVzLgogICAgICoKICAgICAqIEBhY2Nlc3MgcHJpdmF0ZQogICAgICovCiAgICBmdW5jdGlvbiBuZXdPYmplY3QoJGRhdGEpCiAgICB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGtleXMgYW5kIHZhbHVlcyBidWlsdCBmcm9tIHRoZSBhdHRyaWJ1dGVzCiAgICAgKiBvZiAkb2JqLiAgSWYgJHRoaXMtPnByZXBhcmVGb3JTYXZlKCRvYmopIHJldHVybnMgYW4gYXJyYXksIGl0cyBrZXlzCiAgICAgKiBhbmQgdmFsdWVzIGFyZSB1c2VkIHRvIHVwZGF0ZSB0aGUgJGRhdGEgYXJyYXkgb2YgYXR0cmlidXRlcwogICAgICogZnJvbSAkb2JqLgogICAgICoKICAgICAqIEBhY2Nlc3MgcHJpdmF0ZQogICAgICovCiAgICBmdW5jdGlvbiB0b1Nlc3Npb24oJG9iaikKICAgIHsKICAgICAgICAkZGF0YSA9IGFycmF5KCk7CiAgICAgICAgZm9yZWFjaCAoJG9iaiBhcyAkayA9PiAkdikgewogICAgICAgICAgICAkZGF0YVska10gPSAkdjsKICAgICAgICB9CgogICAgICAgICRleHRyYSA9ICR0aGlzLT5wcmVwYXJlRm9yU2F2ZSgkb2JqKTsKCiAgICAgICAgaWYgKCRleHRyYSAmJiBpc19hcnJheSgkZXh0cmEpKSB7CiAgICAgICAgICAgIGZvcmVhY2ggKCRleHRyYSBhcyAkayA9PiAkdikgewogICAgICAgICAgICAgICAgJGRhdGFbJGtdID0gJHY7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiAkZGF0YTsKICAgIH0KCiAgICAvKioKICAgICAqIE92ZXJyaWRlIHRoaXMuCiAgICAgKgogICAgICogQGFjY2VzcyBwcml2YXRlCiAgICAgKi8KICAgIGZ1bmN0aW9uIHByZXBhcmVGb3JTYXZlKCRvYmopCiAgICB7CiAgICAgICAgcmV0dXJuIGFycmF5KCk7CiAgICB9Cn0KCi8qKgogKiBBIGNvbmNyZXRlIGxvYWRlciBpbXBsZW1lbnRhdGlvbiBmb3IgQXV0aF9PcGVuSURfU2VydmljZUVuZHBvaW50cy4KICoKICogQHBhY2thZ2UgT3BlbklECiAqLwpjbGFzcyBBdXRoX09wZW5JRF9TZXJ2aWNlRW5kcG9pbnRMb2FkZXIgZXh0ZW5kcyBBdXRoX1lhZGlzX1Nlc3Npb25Mb2FkZXIgewogICAgZnVuY3Rpb24gbmV3T2JqZWN0KCRkYXRhKQogICAgewogICAgICAgIHJldHVybiBuZXcgQXV0aF9PcGVuSURfU2VydmljZUVuZHBvaW50KCk7CiAgICB9CgogICAgZnVuY3Rpb24gcmVxdWlyZWRLZXlzKCkKICAgIHsKICAgICAgICAkb2JqID0gbmV3IEF1dGhfT3BlbklEX1NlcnZpY2VFbmRwb2ludCgpOwogICAgICAgICRkYXRhID0gYXJyYXkoKTsKICAgICAgICBmb3JlYWNoICgkb2JqIGFzICRrID0+ICR2KSB7CiAgICAgICAgICAgICRkYXRhW10gPSAkazsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICRkYXRhOwogICAgfQoKICAgIGZ1bmN0aW9uIGNoZWNrKCRkYXRhKQogICAgewogICAgICAgIHJldHVybiBpc19hcnJheSgkZGF0YVsndHlwZV91cmlzJ10pOwogICAgfQp9CgovKioKICogQSBjb25jcmV0ZSBsb2FkZXIgaW1wbGVtZW50YXRpb24gZm9yIEF1dGhfWWFkaXNfTWFuYWdlcnMuCiAqCiAqIEBwYWNrYWdlIE9wZW5JRAogKi8KY2xhc3MgQXV0aF9ZYWRpc19NYW5hZ2VyTG9hZGVyIGV4dGVuZHMgQXV0aF9ZYWRpc19TZXNzaW9uTG9hZGVyIHsKICAgIGZ1bmN0aW9uIHJlcXVpcmVkS2V5cygpCiAgICB7CiAgICAgICAgcmV0dXJuIGFycmF5KCdzdGFydGluZ191cmwnLAogICAgICAgICAgICAgICAgICAgICAneWFkaXNfdXJsJywKICAgICAgICAgICAgICAgICAgICAgJ3NlcnZpY2VzJywKICAgICAgICAgICAgICAgICAgICAgJ3Nlc3Npb25fa2V5JywKICAgICAgICAgICAgICAgICAgICAgJ19jdXJyZW50JywKICAgICAgICAgICAgICAgICAgICAgJ3N0YWxlJyk7CiAgICB9CgogICAgZnVuY3Rpb24gbmV3T2JqZWN0KCRkYXRhKQogICAgewogICAgICAgIHJldHVybiBuZXcgQXV0aF9ZYWRpc19NYW5hZ2VyKCRkYXRhWydzdGFydGluZ191cmwnXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGRhdGFbJ3lhZGlzX3VybCddLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZGF0YVsnc2VydmljZXMnXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGRhdGFbJ3Nlc3Npb25fa2V5J10pOwogICAgfQoKICAgIGZ1bmN0aW9uIGNoZWNrKCRkYXRhKQogICAgewogICAgICAgIHJldHVybiBpc19hcnJheSgkZGF0YVsnc2VydmljZXMnXSk7CiAgICB9CgogICAgZnVuY3Rpb24gcHJlcGFyZUZvckxvYWQoJGRhdGEpCiAgICB7CiAgICAgICAgJGxvYWRlciA9IG5ldyBBdXRoX09wZW5JRF9TZXJ2aWNlRW5kcG9pbnRMb2FkZXIoKTsKICAgICAgICAkc2VydmljZXMgPSBhcnJheSgpOwogICAgICAgIGZvcmVhY2ggKCRkYXRhWydzZXJ2aWNlcyddIGFzICRzKSB7CiAgICAgICAgICAgICRzZXJ2aWNlc1tdID0gJGxvYWRlci0+ZnJvbVNlc3Npb24oJHMpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gYXJyYXkoJ3NlcnZpY2VzJyA9PiAkc2VydmljZXMpOwogICAgfQoKICAgIGZ1bmN0aW9uIHByZXBhcmVGb3JTYXZlKCRvYmopCiAgICB7CiAgICAgICAgJGxvYWRlciA9IG5ldyBBdXRoX09wZW5JRF9TZXJ2aWNlRW5kcG9pbnRMb2FkZXIoKTsKICAgICAgICAkc2VydmljZXMgPSBhcnJheSgpOwogICAgICAgIGZvcmVhY2ggKCRvYmotPnNlcnZpY2VzIGFzICRzKSB7CiAgICAgICAgICAgICRzZXJ2aWNlc1tdID0gJGxvYWRlci0+dG9TZXNzaW9uKCRzKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGFycmF5KCdzZXJ2aWNlcycgPT4gJHNlcnZpY2VzKTsKICAgIH0KfQoKLyoqCiAqIFRoZSBZYWRpcyBzZXJ2aWNlIG1hbmFnZXIgd2hpY2ggc3RvcmVzIHN0YXRlIGluIGEgc2Vzc2lvbiBhbmQKICogaXRlcmF0ZXMgb3ZlciA8U2VydmljZT4gZWxlbWVudHMgaW4gYSBZYWRpcyBYUkRTIGRvY3VtZW50IGFuZCBsZXRzCiAqIGEgY2FsbGVyIGF0dGVtcHQgdG8gdXNlIGVhY2ggb25lLiAgVGhpcyBpcyB1c2VkIGJ5IHRoZSBZYWRpcwogKiBsaWJyYXJ5IGludGVybmFsbHkuCiAqCiAqIEBwYWNrYWdlIE9wZW5JRAogKi8KY2xhc3MgQXV0aF9ZYWRpc19NYW5hZ2VyIHsKCiAgICAvKioKICAgICAqIEludGlhbGl6ZSBhIG5ldyB5YWRpcyBzZXJ2aWNlIG1hbmFnZXIuCiAgICAgKgogICAgICogQGFjY2VzcyBwcml2YXRlCiAgICAgKi8KICAgIGZ1bmN0aW9uIEF1dGhfWWFkaXNfTWFuYWdlcigkc3RhcnRpbmdfdXJsLCAkeWFkaXNfdXJsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2VydmljZXMsICRzZXNzaW9uX2tleSkKICAgIHsKICAgICAgICAvLyBUaGUgVVJMIHRoYXQgd2FzIHVzZWQgdG8gaW5pdGlhdGUgdGhlIFlhZGlzIHByb3RvY29sCiAgICAgICAgJHRoaXMtPnN0YXJ0aW5nX3VybCA9ICRzdGFydGluZ191cmw7CgogICAgICAgIC8vIFRoZSBVUkwgYWZ0ZXIgZm9sbG93aW5nIHJlZGlyZWN0cyAodGhlIGlkZW50aWZpZXIpCiAgICAgICAgJHRoaXMtPnlhZGlzX3VybCA9ICR5YWRpc191cmw7CgogICAgICAgIC8vIExpc3Qgb2Ygc2VydmljZSBlbGVtZW50cwogICAgICAgICR0aGlzLT5zZXJ2aWNlcyA9ICRzZXJ2aWNlczsKCiAgICAgICAgJHRoaXMtPnNlc3Npb25fa2V5ID0gJHNlc3Npb25fa2V5OwoKICAgICAgICAvLyBSZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgc2VydmljZSBvYmplY3QKICAgICAgICAkdGhpcy0+X2N1cnJlbnQgPSBudWxsOwoKICAgICAgICAvLyBTdGFsZSBmbGFnIGZvciBjbGVhbnVwIGlmIFBIUCBsaWIgaGFzIHRyb3VibGUuCiAgICAgICAgJHRoaXMtPnN0YWxlID0gZmFsc2U7CiAgICB9CgogICAgLyoqCiAgICAgKiBAYWNjZXNzIHByaXZhdGUKICAgICAqLwogICAgZnVuY3Rpb24gbGVuZ3RoKCkKICAgIHsKICAgICAgICAvLyBIb3cgbWFueSB1bnRyaWVkIHNlcnZpY2VzIHJlbWFpbj8KICAgICAgICByZXR1cm4gY291bnQoJHRoaXMtPnNlcnZpY2VzKTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybiB0aGUgbmV4dCBzZXJ2aWNlCiAgICAgKgogICAgICogJHRoaXMtPmN1cnJlbnQoKSB3aWxsIGNvbnRpbnVlIHRvIHJldHVybiB0aGF0IHNlcnZpY2UgdW50aWwgdGhlCiAgICAgKiBuZXh0IGNhbGwgdG8gdGhpcyBtZXRob2QuCiAgICAgKi8KICAgIGZ1bmN0aW9uIG5leHRTZXJ2aWNlKCkKICAgIHsKCiAgICAgICAgaWYgKCR0aGlzLT5zZXJ2aWNlcykgewogICAgICAgICAgICAkdGhpcy0+X2N1cnJlbnQgPSBhcnJheV9zaGlmdCgkdGhpcy0+c2VydmljZXMpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICR0aGlzLT5fY3VycmVudCA9IG51bGw7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJHRoaXMtPl9jdXJyZW50OwogICAgfQoKICAgIC8qKgogICAgICogQGFjY2VzcyBwcml2YXRlCiAgICAgKi8KICAgIGZ1bmN0aW9uIGN1cnJlbnQoKQogICAgewogICAgICAgIC8vIFJldHVybiB0aGUgY3VycmVudCBzZXJ2aWNlLgogICAgICAgIC8vIFJldHVybnMgTm9uZSBpZiB0aGVyZSBhcmUgbm8gc2VydmljZXMgbGVmdC4KICAgICAgICByZXR1cm4gJHRoaXMtPl9jdXJyZW50OwogICAgfQoKICAgIC8qKgogICAgICogQGFjY2VzcyBwcml2YXRlCiAgICAgKi8KICAgIGZ1bmN0aW9uIGZvclVSTCgkdXJsKQogICAgewogICAgICAgIHJldHVybiBpbl9hcnJheSgkdXJsLCBhcnJheSgkdGhpcy0+c3RhcnRpbmdfdXJsLCAkdGhpcy0+eWFkaXNfdXJsKSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAYWNjZXNzIHByaXZhdGUKICAgICAqLwogICAgZnVuY3Rpb24gc3RhcnRlZCgpCiAgICB7CiAgICAgICAgLy8gSGFzIHRoZSBmaXJzdCBzZXJ2aWNlIGJlZW4gcmV0dXJuZWQ/CiAgICAgICAgcmV0dXJuICR0aGlzLT5fY3VycmVudCAhPT0gbnVsbDsKICAgIH0KfQoKLyoqCiAqIFN0YXRlIG1hbmFnZW1lbnQgZm9yIGRpc2NvdmVyeS4KICoKICogSGlnaC1sZXZlbCB1c2FnZSBwYXR0ZXJuIGlzIHRvIGNhbGwgLmdldE5leHRTZXJ2aWNlKGRpc2NvdmVyKSBpbgogKiBvcmRlciB0byBmaW5kIHRoZSBuZXh0IGF2YWlsYWJsZSBzZXJ2aWNlIGZvciB0aGlzIHVzZXIgZm9yIHRoaXMKICogc2Vzc2lvbi4gT25jZSBhIHJlcXVlc3QgY29tcGxldGVzLCBjYWxsIC5jbGVhbnVwKCkgdG8gY2xlYW4gdXAgdGhlCiAqIHNlc3Npb24gc3RhdGUuCiAqCiAqIEBwYWNrYWdlIE9wZW5JRAogKi8KY2xhc3MgQXV0aF9ZYWRpc19EaXNjb3ZlcnkgewoKICAgIC8qKgogICAgICogQGFjY2VzcyBwcml2YXRlCiAgICAgKi8KICAgIHZhciAkREVGQVVMVF9TVUZGSVggPSAnYXV0aCc7CgogICAgLyoqCiAgICAgKiBAYWNjZXNzIHByaXZhdGUKICAgICAqLwogICAgdmFyICRQUkVGSVggPSAnX3lhZGlzX3NlcnZpY2VzXyc7CgogICAgLyoqCiAgICAgKiBJbml0aWFsaXplIGEgZGlzY292ZXJ5IG9iamVjdC4KICAgICAqCiAgICAgKiBAcGFyYW0gQXV0aF9ZYWRpc19QSFBTZXNzaW9uICRzZXNzaW9uIEFuIG9iamVjdCB3aGljaAogICAgICogaW1wbGVtZW50cyB0aGUgQXV0aF9ZYWRpc19QSFBTZXNzaW9uIEFQSS4KICAgICAqIEBwYXJhbSBzdHJpbmcgJHVybCBUaGUgVVJMIG9uIHdoaWNoIHRvIGF0dGVtcHQgZGlzY292ZXJ5LgogICAgICogQHBhcmFtIHN0cmluZyAkc2Vzc2lvbl9rZXlfc3VmZml4IFRoZSBvcHRpb25hbCBzZXNzaW9uIGtleQogICAgICogc3VmZml4IG92ZXJyaWRlLgogICAgICovCiAgICBmdW5jdGlvbiBBdXRoX1lhZGlzX0Rpc2NvdmVyeSgkc2Vzc2lvbiwgJHVybCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2Vzc2lvbl9rZXlfc3VmZml4ID0gbnVsbCkKICAgIHsKICAgICAgICAvLy8gSW5pdGlhbGl6ZSBhIGRpc2NvdmVyeSBvYmplY3QKICAgICAgICAkdGhpcy0+c2Vzc2lvbiA9ICRzZXNzaW9uOwogICAgICAgICR0aGlzLT51cmwgPSAkdXJsOwogICAgICAgIGlmICgkc2Vzc2lvbl9rZXlfc3VmZml4ID09PSBudWxsKSB7CiAgICAgICAgICAgICRzZXNzaW9uX2tleV9zdWZmaXggPSAkdGhpcy0+REVGQVVMVF9TVUZGSVg7CiAgICAgICAgfQoKICAgICAgICAkdGhpcy0+c2Vzc2lvbl9rZXlfc3VmZml4ID0gJHNlc3Npb25fa2V5X3N1ZmZpeDsKICAgICAgICAkdGhpcy0+c2Vzc2lvbl9rZXkgPSAkdGhpcy0+UFJFRklYIC4gJHRoaXMtPnNlc3Npb25fa2V5X3N1ZmZpeDsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybiB0aGUgbmV4dCBhdXRoZW50aWNhdGlvbiBzZXJ2aWNlIGZvciB0aGUgcGFpciBvZgogICAgICogdXNlcl9pbnB1dCBhbmQgc2Vzc2lvbi4gVGhpcyBmdW5jdGlvbiBoYW5kbGVzIGZhbGxiYWNrLgogICAgICovCiAgICBmdW5jdGlvbiBnZXROZXh0U2VydmljZSgkZGlzY292ZXJfY2IsICRmZXRjaGVyKQogICAgewogICAgICAgICRtYW5hZ2VyID0gJHRoaXMtPmdldE1hbmFnZXIoKTsKICAgICAgICBpZiAoISRtYW5hZ2VyIHx8ICghJG1hbmFnZXItPnNlcnZpY2VzKSkgewogICAgICAgICAgICAkdGhpcy0+ZGVzdHJveU1hbmFnZXIoKTsKCiAgICAgICAgICAgIGxpc3QoJHlhZGlzX3VybCwgJHNlcnZpY2VzKSA9IGNhbGxfdXNlcl9mdW5jKCRkaXNjb3Zlcl9jYiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnVybCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiRmZXRjaGVyKTsKCiAgICAgICAgICAgICRtYW5hZ2VyID0gJHRoaXMtPmNyZWF0ZU1hbmFnZXIoJHNlcnZpY2VzLCAkeWFkaXNfdXJsKTsKICAgICAgICB9CgogICAgICAgIGlmICgkbWFuYWdlcikgewogICAgICAgICAgICAkbG9hZGVyID0gbmV3IEF1dGhfWWFkaXNfTWFuYWdlckxvYWRlcigpOwogICAgICAgICAgICAkc2VydmljZSA9ICRtYW5hZ2VyLT5uZXh0U2VydmljZSgpOwogICAgICAgICAgICAkdGhpcy0+c2Vzc2lvbi0+c2V0KCR0aGlzLT5zZXNzaW9uX2tleSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemUoJGxvYWRlci0+dG9TZXNzaW9uKCRtYW5hZ2VyKSkpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRzZXJ2aWNlID0gbnVsbDsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkc2VydmljZTsKICAgIH0KCiAgICAvKioKICAgICAqIENsZWFuIHVwIFlhZGlzLXJlbGF0ZWQgc2VydmljZXMgaW4gdGhlIHNlc3Npb24gYW5kIHJldHVybiB0aGUKICAgICAqIG1vc3QtcmVjZW50bHktYXR0ZW1wdGVkIHNlcnZpY2UgZnJvbSB0aGUgbWFuYWdlciwgaWYgb25lCiAgICAgKiBleGlzdHMuCiAgICAgKgogICAgICogQHBhcmFtICRmb3JjZSBUcnVlIGlmIHRoZSBtYW5hZ2VyIHNob3VsZCBiZSBkZWxldGVkIHJlZ2FyZGxlc3MKICAgICAqIG9mIHdoZXRoZXIgaXQncyBhIG1hbmFnZXIgZm9yICR0aGlzLT51cmwuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGNsZWFudXAoJGZvcmNlPWZhbHNlKQogICAgewogICAgICAgICRtYW5hZ2VyID0gJHRoaXMtPmdldE1hbmFnZXIoJGZvcmNlKTsKICAgICAgICBpZiAoJG1hbmFnZXIpIHsKICAgICAgICAgICAgJHNlcnZpY2UgPSAkbWFuYWdlci0+Y3VycmVudCgpOwogICAgICAgICAgICAkdGhpcy0+ZGVzdHJveU1hbmFnZXIoJGZvcmNlKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkc2VydmljZSA9IG51bGw7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJHNlcnZpY2U7CiAgICB9CgogICAgLyoqCiAgICAgKiBAYWNjZXNzIHByaXZhdGUKICAgICAqLwogICAgZnVuY3Rpb24gZ2V0U2Vzc2lvbktleSgpCiAgICB7CiAgICAgICAgLy8gR2V0IHRoZSBzZXNzaW9uIGtleSBmb3IgdGhpcyBzdGFydGluZyBVUkwgYW5kIHN1ZmZpeAogICAgICAgIHJldHVybiAkdGhpcy0+UFJFRklYIC4gJHRoaXMtPnNlc3Npb25fa2V5X3N1ZmZpeDsKICAgIH0KCiAgICAvKioKICAgICAqIEBhY2Nlc3MgcHJpdmF0ZQogICAgICoKICAgICAqIEBwYXJhbSAkZm9yY2UgVHJ1ZSBpZiB0aGUgbWFuYWdlciBzaG91bGQgYmUgcmV0dXJuZWQgcmVnYXJkbGVzcwogICAgICogb2Ygd2hldGhlciBpdCdzIGEgbWFuYWdlciBmb3IgJHRoaXMtPnVybC4KICAgICAqLwogICAgZnVuY3Rpb24gZ2V0TWFuYWdlcigkZm9yY2U9ZmFsc2UpCiAgICB7CiAgICAgICAgLy8gRXh0cmFjdCB0aGUgWWFkaXNTZXJ2aWNlTWFuYWdlciBmb3IgdGhpcyBvYmplY3QncyBVUkwgYW5kCiAgICAgICAgLy8gc3VmZml4IGZyb20gdGhlIHNlc3Npb24uCgogICAgICAgICRtYW5hZ2VyX3N0ciA9ICR0aGlzLT5zZXNzaW9uLT5nZXQoJHRoaXMtPmdldFNlc3Npb25LZXkoKSk7CiAgICAgICAgJG1hbmFnZXIgPSBudWxsOwoKICAgICAgICBpZiAoJG1hbmFnZXJfc3RyICE9PSBudWxsKSB7CiAgICAgICAgICAgICRsb2FkZXIgPSBuZXcgQXV0aF9ZYWRpc19NYW5hZ2VyTG9hZGVyKCk7CiAgICAgICAgICAgICRtYW5hZ2VyID0gJGxvYWRlci0+ZnJvbVNlc3Npb24odW5zZXJpYWxpemUoJG1hbmFnZXJfc3RyKSk7CiAgICAgICAgfQoKICAgICAgICBpZiAoJG1hbmFnZXIgJiYgKCRtYW5hZ2VyLT5mb3JVUkwoJHRoaXMtPnVybCkgfHwgJGZvcmNlKSkgewogICAgICAgICAgICByZXR1cm4gJG1hbmFnZXI7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQGFjY2VzcyBwcml2YXRlCiAgICAgKi8KICAgIGZ1bmN0aW9uIGNyZWF0ZU1hbmFnZXIoJHNlcnZpY2VzLCAkeWFkaXNfdXJsID0gbnVsbCkKICAgIHsKICAgICAgICAka2V5ID0gJHRoaXMtPmdldFNlc3Npb25LZXkoKTsKICAgICAgICBpZiAoJHRoaXMtPmdldE1hbmFnZXIoKSkgewogICAgICAgICAgICByZXR1cm4gJHRoaXMtPmdldE1hbmFnZXIoKTsKICAgICAgICB9CgogICAgICAgIGlmICgkc2VydmljZXMpIHsKICAgICAgICAgICAgJGxvYWRlciA9IG5ldyBBdXRoX1lhZGlzX01hbmFnZXJMb2FkZXIoKTsKICAgICAgICAgICAgJG1hbmFnZXIgPSBuZXcgQXV0aF9ZYWRpc19NYW5hZ2VyKCR0aGlzLT51cmwsICR5YWRpc191cmwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2VydmljZXMsICRrZXkpOwogICAgICAgICAgICAkdGhpcy0+c2Vzc2lvbi0+c2V0KCR0aGlzLT5zZXNzaW9uX2tleSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemUoJGxvYWRlci0+dG9TZXNzaW9uKCRtYW5hZ2VyKSkpOwogICAgICAgICAgICByZXR1cm4gJG1hbmFnZXI7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQGFjY2VzcyBwcml2YXRlCiAgICAgKgogICAgICogQHBhcmFtICRmb3JjZSBUcnVlIGlmIHRoZSBtYW5hZ2VyIHNob3VsZCBiZSBkZWxldGVkIHJlZ2FyZGxlc3MKICAgICAqIG9mIHdoZXRoZXIgaXQncyBhIG1hbmFnZXIgZm9yICR0aGlzLT51cmwuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGRlc3Ryb3lNYW5hZ2VyKCRmb3JjZT1mYWxzZSkKICAgIHsKICAgICAgICBpZiAoJHRoaXMtPmdldE1hbmFnZXIoJGZvcmNlKSAhPT0gbnVsbCkgewogICAgICAgICAgICAka2V5ID0gJHRoaXMtPmdldFNlc3Npb25LZXkoKTsKICAgICAgICAgICAgJHRoaXMtPnNlc3Npb24tPmRlbCgka2V5KTsKICAgICAgICB9CiAgICB9Cn0KCg==]]></data>
	</file>
	<file>
	  <filename>/openid-php-openid-782224d/Auth/Yadis/Misc.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBNaXNjZWxsYW5lb3VzIHV0aWxpdHkgdmFsdWVzIGFuZCBmdW5jdGlvbnMgZm9yIE9wZW5JRCBhbmQgWWFkaXMuCiAqCiAqIEBwYWNrYWdlIE9wZW5JRAogKiBAYXV0aG9yIEphblJhaW4sIEluYy4gPG9wZW5pZEBqYW5yYWluLmNvbT4KICogQGNvcHlyaWdodCAyMDA1LTIwMDggSmFucmFpbiwgSW5jLgogKiBAbGljZW5zZSBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgQXBhY2hlCiAqLwoKZnVuY3Rpb24gQXV0aF9ZYWRpc19nZXRVQ1NDaGFycygpCnsKICAgIHJldHVybiBhcnJheSgKICAgICAgICAgICAgICAgICBhcnJheSgweEEwLCAweEQ3RkYpLAogICAgICAgICAgICAgICAgIGFycmF5KDB4RjkwMCwgMHhGRENGKSwKICAgICAgICAgICAgICAgICBhcnJheSgweEZERjAsIDB4RkZFRiksCiAgICAgICAgICAgICAgICAgYXJyYXkoMHgxMDAwMCwgMHgxRkZGRCksCiAgICAgICAgICAgICAgICAgYXJyYXkoMHgyMDAwMCwgMHgyRkZGRCksCiAgICAgICAgICAgICAgICAgYXJyYXkoMHgzMDAwMCwgMHgzRkZGRCksCiAgICAgICAgICAgICAgICAgYXJyYXkoMHg0MDAwMCwgMHg0RkZGRCksCiAgICAgICAgICAgICAgICAgYXJyYXkoMHg1MDAwMCwgMHg1RkZGRCksCiAgICAgICAgICAgICAgICAgYXJyYXkoMHg2MDAwMCwgMHg2RkZGRCksCiAgICAgICAgICAgICAgICAgYXJyYXkoMHg3MDAwMCwgMHg3RkZGRCksCiAgICAgICAgICAgICAgICAgYXJyYXkoMHg4MDAwMCwgMHg4RkZGRCksCiAgICAgICAgICAgICAgICAgYXJyYXkoMHg5MDAwMCwgMHg5RkZGRCksCiAgICAgICAgICAgICAgICAgYXJyYXkoMHhBMDAwMCwgMHhBRkZGRCksCiAgICAgICAgICAgICAgICAgYXJyYXkoMHhCMDAwMCwgMHhCRkZGRCksCiAgICAgICAgICAgICAgICAgYXJyYXkoMHhDMDAwMCwgMHhDRkZGRCksCiAgICAgICAgICAgICAgICAgYXJyYXkoMHhEMDAwMCwgMHhERkZGRCksCiAgICAgICAgICAgICAgICAgYXJyYXkoMHhFMTAwMCwgMHhFRkZGRCkKICAgICAgICAgICAgICAgICApOwp9CgpmdW5jdGlvbiBBdXRoX1lhZGlzX2dldElQcml2YXRlQ2hhcnMoKQp7CiAgICByZXR1cm4gYXJyYXkoCiAgICAgICAgICAgICAgICAgYXJyYXkoMHhFMDAwLCAweEY4RkYpLAogICAgICAgICAgICAgICAgIGFycmF5KDB4RjAwMDAsIDB4RkZGRkQpLAogICAgICAgICAgICAgICAgIGFycmF5KDB4MTAwMDAwLCAweDEwRkZGRCkKICAgICAgICAgICAgICAgICApOwp9CgpmdW5jdGlvbiBBdXRoX1lhZGlzX3BjdF9lc2NhcGVfdW5pY29kZSgkY2hhcl9tYXRjaCkKewogICAgJGMgPSAkY2hhcl9tYXRjaFswXTsKICAgICRyZXN1bHQgPSAiIjsKICAgIGZvciAoJGkgPSAwOyAkaSA8IHN0cmxlbigkYyk7ICRpKyspIHsKICAgICAgICAkcmVzdWx0IC49ICIlIi5zcHJpbnRmKCIlWCIsIG9yZCgkY1skaV0pKTsKICAgIH0KICAgIHJldHVybiAkcmVzdWx0Owp9CgpmdW5jdGlvbiBBdXRoX1lhZGlzX3N0YXJ0c3dpdGgoJHMsICRzdHVmZikKewogICAgcmV0dXJuIHN0cnBvcygkcywgJHN0dWZmKSA9PT0gMDsKfQoK]]></data>
	</file>
	<file>
	  <filename>/openid-php-openid-782224d/Auth/Yadis/ParanoidHTTPFetcher.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBUaGlzIG1vZHVsZSBjb250YWlucyB0aGUgQ1VSTC1iYXNlZCBIVFRQIGZldGNoZXIgaW1wbGVtZW50YXRpb24uCiAqCiAqIFBIUCB2ZXJzaW9ucyA0IGFuZCA1CiAqCiAqIExJQ0VOU0U6IFNlZSB0aGUgQ09QWUlORyBmaWxlIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uLgogKgogKiBAcGFja2FnZSBPcGVuSUQKICogQGF1dGhvciBKYW5SYWluLCBJbmMuIDxvcGVuaWRAamFucmFpbi5jb20+CiAqIEBjb3B5cmlnaHQgMjAwNS0yMDA4IEphbnJhaW4sIEluYy4KICogQGxpY2Vuc2UgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIEFwYWNoZQogKi8KCi8qKgogKiBJbnRlcmZhY2UgaW1wb3J0CiAqLwpyZXF1aXJlX29uY2UgIkF1dGgvWWFkaXMvSFRUUEZldGNoZXIucGhwIjsKCnJlcXVpcmVfb25jZSAiQXV0aC9PcGVuSUQucGhwIjsKCi8qKgogKiBBIHBhcmFub2lkIHtAbGluayBBdXRoX1lhZGlzX0hUVFBGZXRjaGVyfSBjbGFzcyB3aGljaCB1c2VzIENVUkwKICogZm9yIGZldGNoaW5nLgogKgogKiBAcGFja2FnZSBPcGVuSUQKICovCmNsYXNzIEF1dGhfWWFkaXNfUGFyYW5vaWRIVFRQRmV0Y2hlciBleHRlbmRzIEF1dGhfWWFkaXNfSFRUUEZldGNoZXIgewogICAgZnVuY3Rpb24gQXV0aF9ZYWRpc19QYXJhbm9pZEhUVFBGZXRjaGVyKCkKICAgIHsKICAgICAgICAkdGhpcy0+cmVzZXQoKTsKICAgIH0KCiAgICBmdW5jdGlvbiByZXNldCgpCiAgICB7CiAgICAgICAgJHRoaXMtPmhlYWRlcnMgPSBhcnJheSgpOwogICAgICAgICR0aGlzLT5kYXRhID0gIiI7CiAgICB9CgogICAgLyoqCiAgICAgKiBAYWNjZXNzIHByaXZhdGUKICAgICAqLwogICAgZnVuY3Rpb24gX3dyaXRlSGVhZGVyKCRjaCwgJGhlYWRlcikKICAgIHsKICAgICAgICBhcnJheV9wdXNoKCR0aGlzLT5oZWFkZXJzLCBydHJpbSgkaGVhZGVyKSk7CiAgICAgICAgcmV0dXJuIHN0cmxlbigkaGVhZGVyKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBhY2Nlc3MgcHJpdmF0ZQogICAgICovCiAgICBmdW5jdGlvbiBfd3JpdGVEYXRhKCRjaCwgJGRhdGEpCiAgICB7CiAgICAgICAgaWYgKHN0cmxlbigkdGhpcy0+ZGF0YSkgPiAxMDI0KkF1dGhfT3BlbklEX0ZFVENIRVJfTUFYX1JFU1BPTlNFX0tCKSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICR0aGlzLT5kYXRhIC49ICRkYXRhOwogICAgICAgICAgICByZXR1cm4gc3RybGVuKCRkYXRhKTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBEb2VzIHRoaXMgZmV0Y2hlciBzdXBwb3J0IFNTTCBVUkxzPwogICAgICovCiAgICBmdW5jdGlvbiBzdXBwb3J0c1NTTCgpCiAgICB7CiAgICAgICAgJHYgPSBjdXJsX3ZlcnNpb24oKTsKICAgICAgICBpZihpc19hcnJheSgkdikpIHsKICAgICAgICAgICAgcmV0dXJuIGluX2FycmF5KCdodHRwcycsICR2Wydwcm90b2NvbHMnXSk7CiAgICAgICAgfSBlbHNlaWYgKGlzX3N0cmluZygkdikpIHsKICAgICAgICAgICAgcmV0dXJuIHByZWdfbWF0Y2goJy9PcGVuU1NML2knLCAkdik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGdldCgkdXJsLCAkZXh0cmFfaGVhZGVycyA9IG51bGwpCiAgICB7CiAgICAgICAgaWYgKCEkdGhpcy0+Y2FuRmV0Y2hVUkwoJHVybCkpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQoKICAgICAgICAkc3RvcCA9IHRpbWUoKSArICR0aGlzLT50aW1lb3V0OwogICAgICAgICRvZmYgPSAkdGhpcy0+dGltZW91dDsKCiAgICAgICAgJHJlZGlyID0gdHJ1ZTsKCiAgICAgICAgd2hpbGUgKCRyZWRpciAmJiAoJG9mZiA+IDApKSB7CiAgICAgICAgICAgICR0aGlzLT5yZXNldCgpOwoKICAgICAgICAgICAgJGMgPSBjdXJsX2luaXQoKTsKCiAgICAgICAgICAgIGlmICgkYyA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgIEF1dGhfT3BlbklEOjpsb2coCiAgICAgICAgICAgICAgICAgICAgImN1cmxfaW5pdCByZXR1cm5lZCBmYWxzZTsgY291bGQgbm90ICIgLgogICAgICAgICAgICAgICAgICAgICJpbml0aWFsaXplIGZvciBVUkwgJyVzJyIsICR1cmwpOwogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChkZWZpbmVkKCdDVVJMT1BUX05PU0lHTkFMJykpIHsKICAgICAgICAgICAgICAgIGN1cmxfc2V0b3B0KCRjLCBDVVJMT1BUX05PU0lHTkFMLCB0cnVlKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCEkdGhpcy0+YWxsb3dlZFVSTCgkdXJsKSkgewogICAgICAgICAgICAgICAgQXV0aF9PcGVuSUQ6OmxvZygiRmV0Y2hpbmcgVVJMIG5vdCBhbGxvd2VkOiAlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR1cmwpOwogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGN1cmxfc2V0b3B0KCRjLCBDVVJMT1BUX1dSSVRFRlVOQ1RJT04sCiAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5KCR0aGlzLCAiX3dyaXRlRGF0YSIpKTsKICAgICAgICAgICAgY3VybF9zZXRvcHQoJGMsIENVUkxPUFRfSEVBREVSRlVOQ1RJT04sCiAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5KCR0aGlzLCAiX3dyaXRlSGVhZGVyIikpOwoKICAgICAgICAgICAgaWYgKCRleHRyYV9oZWFkZXJzKSB7CiAgICAgICAgICAgICAgICBjdXJsX3NldG9wdCgkYywgQ1VSTE9QVF9IVFRQSEVBREVSLCAkZXh0cmFfaGVhZGVycyk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRjdiA9IGN1cmxfdmVyc2lvbigpOwogICAgICAgICAgICBpZihpc19hcnJheSgkY3YpKSB7CiAgICAgICAgICAgICAgJGN1cmxfdXNlcl9hZ2VudCA9ICdjdXJsLycuJGN2Wyd2ZXJzaW9uJ107CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgJGN1cmxfdXNlcl9hZ2VudCA9ICRjdjsKICAgICAgICAgICAgfQogICAgICAgICAgICBjdXJsX3NldG9wdCgkYywgQ1VSTE9QVF9VU0VSQUdFTlQsCiAgICAgICAgICAgICAgICAgICAgICAgIEF1dGhfT3BlbklEX1VTRVJfQUdFTlQuJyAnLiRjdXJsX3VzZXJfYWdlbnQpOwogICAgICAgICAgICBjdXJsX3NldG9wdCgkYywgQ1VSTE9QVF9USU1FT1VULCAkb2ZmKTsKICAgICAgICAgICAgY3VybF9zZXRvcHQoJGMsIENVUkxPUFRfVVJMLCAkdXJsKTsKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBCZWdpbiBtb2RpZmljYXRpb24gQ01TTVMgT3BlbklEIE1vZHVsZQogICAgICAgICAgICAgKiBBbGxvdyBPcGVuSUQgbW9kdWxlIHRvIHNwZWNpZnkgQ0EtaW5mbwogICAgICAgICAgICAgKi8KICAgICAgICAgICAgaWYgKGRlZmluZWQoJ0F1dGhfT3BlbklEX0NVUkxPUFRfQ0FJTkZPJykpIHsKICAgICAgICAgICAgICAgIGN1cmxfc2V0b3B0KCRjLENVUkxPUFRfQ0FJTkZPLEF1dGhfT3BlbklEX0NVUkxPUFRfQ0FJTkZPKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvKiogRW5kIG1vZGlmaWNhdGlvbiAqLwoKICAgICAgICAgICAgaWYgKGRlZmluZWQoJ0F1dGhfT3BlbklEX1ZFUklGWV9IT1NUJykpIHsKICAgICAgICAgICAgICAgIGN1cmxfc2V0b3B0KCRjLCBDVVJMT1BUX1NTTF9WRVJJRllQRUVSLCB0cnVlKTsKICAgICAgICAgICAgICAgIGN1cmxfc2V0b3B0KCRjLCBDVVJMT1BUX1NTTF9WRVJJRllIT1NULCAyKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjdXJsX2V4ZWMoJGMpOwoKICAgICAgICAgICAgJGNvZGUgPSBjdXJsX2dldGluZm8oJGMsIENVUkxJTkZPX0hUVFBfQ09ERSk7CiAgICAgICAgICAgICRib2R5ID0gJHRoaXMtPmRhdGE7CiAgICAgICAgICAgICRoZWFkZXJzID0gJHRoaXMtPmhlYWRlcnM7CgogICAgICAgICAgICBpZiAoISRjb2RlKSB7CiAgICAgICAgICAgICAgICBBdXRoX09wZW5JRDo6bG9nKCJHb3Qgbm8gcmVzcG9uc2UgY29kZSB3aGVuIGZldGNoaW5nICVzIiwgJHVybCk7CiAgICAgICAgICAgICAgICBBdXRoX09wZW5JRDo6bG9nKCJDVVJMIGVycm9yICglcyk6ICVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VybF9lcnJubygkYyksIGN1cmxfZXJyb3IoJGMpKTsKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoaW5fYXJyYXkoJGNvZGUsIGFycmF5KDMwMSwgMzAyLCAzMDMsIDMwNykpKSB7CiAgICAgICAgICAgICAgICAkdXJsID0gJHRoaXMtPl9maW5kUmVkaXJlY3QoJGhlYWRlcnMsICR1cmwpOwogICAgICAgICAgICAgICAgJHJlZGlyID0gdHJ1ZTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICRyZWRpciA9IGZhbHNlOwogICAgICAgICAgICAgICAgY3VybF9jbG9zZSgkYyk7CgogICAgICAgICAgICAgICAgaWYgKGRlZmluZWQoJ0F1dGhfT3BlbklEX1ZFUklGWV9IT1NUJykgJiYKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+aXNIVFRQUygkdXJsKSkgewogICAgICAgICAgICAgICAgICAgIEF1dGhfT3BlbklEOjpsb2coJ09wZW5JRDogVmVyaWZpZWQgU1NMIGhvc3QgJXMgdXNpbmcgJy4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjdXJsL2dldCcsICR1cmwpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJG5ld19oZWFkZXJzID0gYXJyYXkoKTsKCiAgICAgICAgICAgICAgICBmb3JlYWNoICgkaGVhZGVycyBhcyAkaGVhZGVyKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHN0cnBvcygkaGVhZGVyLCAnOiAnKSkgewogICAgICAgICAgICAgICAgICAgICAgICBsaXN0KCRuYW1lLCAkdmFsdWUpID0gZXhwbG9kZSgnOiAnLCAkaGVhZGVyLCAyKTsKICAgICAgICAgICAgICAgICAgICAgICAgJG5ld19oZWFkZXJzWyRuYW1lXSA9ICR2YWx1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgQXV0aF9PcGVuSUQ6OmxvZygKICAgICAgICAgICAgICAgICAgICAiU3VjY2Vzc2Z1bGx5IGZldGNoZWQgJyVzJzogR0VUIHJlc3BvbnNlIGNvZGUgJXMiLAogICAgICAgICAgICAgICAgICAgICR1cmwsICRjb2RlKTsKCiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEF1dGhfWWFkaXNfSFRUUFJlc3BvbnNlKCR1cmwsICRjb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJG5ld19oZWFkZXJzLCAkYm9keSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRvZmYgPSAkc3RvcCAtIHRpbWUoKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgIGZ1bmN0aW9uIHBvc3QoJHVybCwgJGJvZHksICRleHRyYV9oZWFkZXJzID0gbnVsbCkKICAgIHsKICAgICAgICBpZiAoISR0aGlzLT5jYW5GZXRjaFVSTCgkdXJsKSkgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CgogICAgICAgICR0aGlzLT5yZXNldCgpOwoKICAgICAgICAkYyA9IGN1cmxfaW5pdCgpOwoKICAgICAgICBpZiAoZGVmaW5lZCgnQ1VSTE9QVF9OT1NJR05BTCcpKSB7CiAgICAgICAgICAgIGN1cmxfc2V0b3B0KCRjLCBDVVJMT1BUX05PU0lHTkFMLCB0cnVlKTsKICAgICAgICB9CgogICAgICAgIGN1cmxfc2V0b3B0KCRjLCBDVVJMT1BUX1BPU1QsIHRydWUpOwogICAgICAgIGN1cmxfc2V0b3B0KCRjLCBDVVJMT1BUX1BPU1RGSUVMRFMsICRib2R5KTsKICAgICAgICBjdXJsX3NldG9wdCgkYywgQ1VSTE9QVF9USU1FT1VULCAkdGhpcy0+dGltZW91dCk7CiAgICAgICAgY3VybF9zZXRvcHQoJGMsIENVUkxPUFRfVVJMLCAkdXJsKTsKICAgICAgICBjdXJsX3NldG9wdCgkYywgQ1VSTE9QVF9XUklURUZVTkNUSU9OLAogICAgICAgICAgICAgICAgICAgIGFycmF5KCR0aGlzLCAiX3dyaXRlRGF0YSIpKTsKCiAgICAgICAgaWYgKGRlZmluZWQoJ0F1dGhfT3BlbklEX1ZFUklGWV9IT1NUJykpIHsKICAgICAgICAgICAgY3VybF9zZXRvcHQoJGMsIENVUkxPUFRfU1NMX1ZFUklGWVBFRVIsIHRydWUpOwogICAgICAgICAgICBjdXJsX3NldG9wdCgkYywgQ1VSTE9QVF9TU0xfVkVSSUZZSE9TVCwgMik7CiAgICAgICAgfQoKICAgICAgICBjdXJsX2V4ZWMoJGMpOwoKICAgICAgICAkY29kZSA9IGN1cmxfZ2V0aW5mbygkYywgQ1VSTElORk9fSFRUUF9DT0RFKTsKCiAgICAgICAgaWYgKCEkY29kZSkgewogICAgICAgICAgICBBdXRoX09wZW5JRDo6bG9nKCJHb3Qgbm8gcmVzcG9uc2UgY29kZSB3aGVuIGZldGNoaW5nICVzIiwgJHVybCk7CiAgICAgICAgICAgIEF1dGhfT3BlbklEOjpsb2coIkNVUkwgZXJyb3IgKCVzKTogJXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cmxfZXJybm8oJGMpLCBjdXJsX2Vycm9yKCRjKSk7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KCiAgICAgICAgaWYgKGRlZmluZWQoJ0F1dGhfT3BlbklEX1ZFUklGWV9IT1NUJykgJiYgJHRoaXMtPmlzSFRUUFMoJHVybCkpIHsKICAgICAgICAgICAgQXV0aF9PcGVuSUQ6OmxvZygnT3BlbklEOiBWZXJpZmllZCBTU0wgaG9zdCAlcyB1c2luZyAnLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjdXJsL3Bvc3QnLCAkdXJsKTsKICAgICAgICB9CiAgICAgICAgJGJvZHkgPSAkdGhpcy0+ZGF0YTsKCiAgICAgICAgY3VybF9jbG9zZSgkYyk7CgogICAgICAgICRuZXdfaGVhZGVycyA9ICRleHRyYV9oZWFkZXJzOwoKICAgICAgICBmb3JlYWNoICgkdGhpcy0+aGVhZGVycyBhcyAkaGVhZGVyKSB7CiAgICAgICAgICAgIGlmIChzdHJwb3MoJGhlYWRlciwgJzogJykpIHsKICAgICAgICAgICAgICAgIGxpc3QoJG5hbWUsICR2YWx1ZSkgPSBleHBsb2RlKCc6ICcsICRoZWFkZXIsIDIpOwogICAgICAgICAgICAgICAgJG5ld19oZWFkZXJzWyRuYW1lXSA9ICR2YWx1ZTsKICAgICAgICAgICAgfQoKICAgICAgICB9CgogICAgICAgIEF1dGhfT3BlbklEOjpsb2coIlN1Y2Nlc3NmdWxseSBmZXRjaGVkICclcyc6IFBPU1QgcmVzcG9uc2UgY29kZSAlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAkdXJsLCAkY29kZSk7CgogICAgICAgIHJldHVybiBuZXcgQXV0aF9ZYWRpc19IVFRQUmVzcG9uc2UoJHVybCwgJGNvZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbmV3X2hlYWRlcnMsICRib2R5KTsKICAgIH0KfQoK]]></data>
	</file>
	<file>
	  <filename>/openid-php-openid-782224d/Auth/Yadis/ParseHTML.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBUaGlzIGlzIHRoZSBIVE1MIHBzZXVkby1wYXJzZXIgZm9yIHRoZSBZYWRpcyBsaWJyYXJ5LgogKgogKiBQSFAgdmVyc2lvbnMgNCBhbmQgNQogKgogKiBMSUNFTlNFOiBTZWUgdGhlIENPUFlJTkcgZmlsZSBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbi4KICoKICogQHBhY2thZ2UgT3BlbklECiAqIEBhdXRob3IgSmFuUmFpbiwgSW5jLiA8b3BlbmlkQGphbnJhaW4uY29tPgogKiBAY29weXJpZ2h0IDIwMDUtMjAwOCBKYW5yYWluLCBJbmMuCiAqIEBsaWNlbnNlIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCBBcGFjaGUKICovCgovKioKICogVGhpcyBjbGFzcyBpcyByZXNwb25zaWJsZSBmb3Igc2Nhbm5pbmcgYW4gSFRNTCBzdHJpbmcgdG8gZmluZCBNRVRBCiAqIHRhZ3MgYW5kIHRoZWlyIGF0dHJpYnV0ZXMuICBUaGlzIGlzIHVzZWQgYnkgdGhlIFlhZGlzIGRpc2NvdmVyeQogKiBwcm9jZXNzLiAgVGhpcyBjbGFzcyBtdXN0IGJlIGluc3RhbnRpYXRlZCB0byBiZSB1c2VkLgogKgogKiBAcGFja2FnZSBPcGVuSUQKICovCmNsYXNzIEF1dGhfWWFkaXNfUGFyc2VIVE1MIHsKCiAgICAvKioKICAgICAqIEBhY2Nlc3MgcHJpdmF0ZQogICAgICovCiAgICB2YXIgJF9yZV9mbGFncyA9ICJzaSI7CgogICAgLyoqCiAgICAgKiBAYWNjZXNzIHByaXZhdGUKICAgICAqLwogICAgdmFyICRfcmVtb3ZlZF9yZSA9CiAgICAgICAgICAgIjwhLS0uKj8tLT58PCFcW0NEQVRBXFsuKj9cXVxdPnw8c2NyaXB0XGIoPyE6KVtePl0qPi4qPzxcL3NjcmlwdD4iOwoKICAgIC8qKgogICAgICogQGFjY2VzcyBwcml2YXRlCiAgICAgKi8KICAgIHZhciAkX3RhZ19leHByID0gIjwlcyVzKD86XHMuKj8pPyVzPiI7CgogICAgLyoqCiAgICAgKiBAYWNjZXNzIHByaXZhdGUKICAgICAqLwogICAgdmFyICRfYXR0cl9maW5kID0gJ1xiKFstXHddKyk9KCIuKj8ifFwnLio/XCd8Lis/KVtcL1xzPl0nOwoKICAgIGZ1bmN0aW9uIEF1dGhfWWFkaXNfUGFyc2VIVE1MKCkKICAgIHsKICAgICAgICAkdGhpcy0+X2F0dHJfZmluZCA9IHNwcmludGYoIi8lcy8lcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5fYXR0cl9maW5kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+X3JlX2ZsYWdzKTsKCiAgICAgICAgJHRoaXMtPl9yZW1vdmVkX3JlID0gc3ByaW50ZigiLyVzLyVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5fcmVtb3ZlZF9yZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5fcmVfZmxhZ3MpOwoKICAgICAgICAkdGhpcy0+X2VudGl0eV9yZXBsYWNlbWVudHMgPSBhcnJheSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYW1wJyA9PiAnJicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2x0JyA9PiAnPCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2d0JyA9PiAnPicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3F1b3QnID0+ICciJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICR0aGlzLT5fZW50X3JlcGxhY2UgPQogICAgICAgICAgICBzcHJpbnRmKCImKCVzKTsiLCBpbXBsb2RlKCJ8IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+X2VudGl0eV9yZXBsYWNlbWVudHMpKTsKICAgIH0KCiAgICAvKioKICAgICAqIFJlcGxhY2UgSFRNTCBlbnRpdGllcyAoYW1wLCBsdCwgZ3QsIGFuZCBxdW90KSBhcyB3ZWxsIGFzCiAgICAgKiBudW1lcmljIGVudGl0aWVzIChlLmcuICN4OWY7KSB3aXRoIHRoZWlyIGFjdHVhbCB2YWx1ZXMgYW5kCiAgICAgKiByZXR1cm4gdGhlIG5ldyBzdHJpbmcuCiAgICAgKgogICAgICogQGFjY2VzcyBwcml2YXRlCiAgICAgKiBAcGFyYW0gc3RyaW5nICRzdHIgVGhlIHN0cmluZyBpbiB3aGljaCB0byBsb29rIGZvciBlbnRpdGllcwogICAgICogQHJldHVybiBzdHJpbmcgJG5ld19zdHIgVGhlIG5ldyBzdHJpbmcgZW50aXRpZXMgZGVjb2RlZAogICAgICovCiAgICBmdW5jdGlvbiByZXBsYWNlRW50aXRpZXMoJHN0cikKICAgIHsKICAgICAgICBmb3JlYWNoICgkdGhpcy0+X2VudGl0eV9yZXBsYWNlbWVudHMgYXMgJG9sZCA9PiAkbmV3KSB7CiAgICAgICAgICAgICRzdHIgPSBwcmVnX3JlcGxhY2Uoc3ByaW50ZigiLyYlczsvIiwgJG9sZCksICRuZXcsICRzdHIpOwogICAgICAgIH0KCiAgICAgICAgLy8gUmVwbGFjZSBudW1lcmljIGVudGl0aWVzIGJlY2F1c2UgaHRtbF9lbnRpdHlfZGVjb2RlIGRvZXNuJ3QKICAgICAgICAvLyBkbyBpdCBmb3IgdXMuCiAgICAgICAgJHN0ciA9IHByZWdfcmVwbGFjZSgnfiYjeChbMC05YS1mXSspO35laScsICdjaHIoaGV4ZGVjKCJcXDEiKSknLCAkc3RyKTsKICAgICAgICAkc3RyID0gcHJlZ19yZXBsYWNlKCd+JiMoWzAtOV0rKTt+ZScsICdjaHIoXFwxKScsICRzdHIpOwoKICAgICAgICByZXR1cm4gJHN0cjsKICAgIH0KCiAgICAvKioKICAgICAqIFN0cmlwIHNpbmdsZSBhbmQgZG91YmxlIHF1b3RlcyBvZmYgb2YgYSBzdHJpbmcsIGlmIHRoZXkgYXJlCiAgICAgKiBwcmVzZW50LgogICAgICoKICAgICAqIEBhY2Nlc3MgcHJpdmF0ZQogICAgICogQHBhcmFtIHN0cmluZyAkc3RyIFRoZSBvcmlnaW5hbCBzdHJpbmcKICAgICAqIEByZXR1cm4gc3RyaW5nICRuZXdfc3RyIFRoZSBuZXcgc3RyaW5nIHdpdGggbGVhZGluZyBhbmQKICAgICAqIHRyYWlsaW5nIHF1b3RlcyByZW1vdmVkCiAgICAgKi8KICAgIGZ1bmN0aW9uIHJlbW92ZVF1b3Rlcygkc3RyKQogICAgewogICAgICAgICRtYXRjaGVzID0gYXJyYXkoKTsKICAgICAgICAkZG91YmxlID0gJy9eIiguKikiJC8nOwogICAgICAgICRzaW5nbGUgPSAiL15cJyguKilcJyQvIjsKCiAgICAgICAgaWYgKHByZWdfbWF0Y2goJGRvdWJsZSwgJHN0ciwgJG1hdGNoZXMpKSB7CiAgICAgICAgICAgIHJldHVybiAkbWF0Y2hlc1sxXTsKICAgICAgICB9IGVsc2UgaWYgKHByZWdfbWF0Y2goJHNpbmdsZSwgJHN0ciwgJG1hdGNoZXMpKSB7CiAgICAgICAgICAgIHJldHVybiAkbWF0Y2hlc1sxXTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gJHN0cjsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBDcmVhdGUgYSByZWd1bGFyIGV4cHJlc3Npb24gdGhhdCB3aWxsIG1hdGNoIGFuIG9wZW5pbmcgCiAgICAgKiBvciBjbG9zaW5nIHRhZyBmcm9tIGEgc2V0IG9mIG5hbWVzLgogICAgICoKICAgICAqIEBhY2Nlc3MgcHJpdmF0ZQogICAgICogQHBhcmFtIG1peGVkICR0YWdfbmFtZXMgVGFnIG5hbWVzIHRvIG1hdGNoCiAgICAgKiBAcGFyYW0gbWl4ZWQgJGNsb3NlIGZhbHNlLzAgPSBubywgdHJ1ZS8xID0geWVzLCBvdGhlciA9IG1heWJlCiAgICAgKiBAcGFyYW0gbWl4ZWQgJHNlbGZfY2xvc2UgZmFsc2UvMCA9IG5vLCB0cnVlLzEgPSB5ZXMsIG90aGVyID0gbWF5YmUKICAgICAqIEByZXR1cm4gc3RyaW5nICRyZWdleCBBIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdHJpbmcgdG8gYmUgdXNlZAogICAgICogaW4sIHNheSwgcHJlZ19tYXRjaC4KICAgICAqLwogICAgZnVuY3Rpb24gdGFnUGF0dGVybigkdGFnX25hbWVzLCAkY2xvc2UsICRzZWxmX2Nsb3NlKQogICAgewogICAgICAgIGlmIChpc19hcnJheSgkdGFnX25hbWVzKSkgewogICAgICAgICAgICAkdGFnX25hbWVzID0gJyg/OicuaW1wbG9kZSgnfCcsJHRhZ19uYW1lcykuJyknOwogICAgICAgIH0KICAgICAgICBpZiAoJGNsb3NlKSB7CiAgICAgICAgICAgICRjbG9zZSA9ICdcLycgLiAoKCRjbG9zZSA9PSAxKT8gJycgOiAnPycpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRjbG9zZSA9ICcnOwogICAgICAgIH0KICAgICAgICBpZiAoJHNlbGZfY2xvc2UpIHsKICAgICAgICAgICAgJHNlbGZfY2xvc2UgPSAnKD86XC9ccyopJyAuICgoJHNlbGZfY2xvc2UgPT0gMSk/ICcnIDogJz8nKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkc2VsZl9jbG9zZSA9ICcnOwogICAgICAgIH0KICAgICAgICAkZXhwciA9IHNwcmludGYoJHRoaXMtPl90YWdfZXhwciwgJGNsb3NlLCAkdGFnX25hbWVzLCAkc2VsZl9jbG9zZSk7CgogICAgICAgIHJldHVybiBzcHJpbnRmKCIvJXMvJXMiLCAkZXhwciwgJHRoaXMtPl9yZV9mbGFncyk7CiAgICB9CgogICAgLyoqCiAgICAgKiBHaXZlbiBhbiBIVE1MIGRvY3VtZW50IHN0cmluZywgdGhpcyBmaW5kcyBhbGwgdGhlIE1FVEEgdGFncyBpbgogICAgICogdGhlIGRvY3VtZW50LCBwcm92aWRlZCB0aGV5IGFyZSBmb3VuZCBpbiB0aGUKICAgICAqIDxIVE1MPjxIRUFEPi4uLjwvSEVBRD4gc2VjdGlvbiBvZiB0aGUgZG9jdW1lbnQuICBUaGUgPEhUTUw+IHRhZwogICAgICogbWF5IGJlIG1pc3NpbmcuCiAgICAgKgogICAgICogQGFjY2VzcyBwcml2YXRlCiAgICAgKiBAcGFyYW0gc3RyaW5nICRodG1sX3N0cmluZyBBbiBIVE1sIGRvY3VtZW50IHN0cmluZwogICAgICogQHJldHVybiBhcnJheSAkdGFnX2xpc3QgQXJyYXkgb2YgdGFnczsgZWFjaCB0YWcgaXMgYW4gYXJyYXkgb2YKICAgICAqIGF0dHJpYnV0ZSAtPiB2YWx1ZS4KICAgICAqLwogICAgZnVuY3Rpb24gZ2V0TWV0YVRhZ3MoJGh0bWxfc3RyaW5nKQogICAgewogICAgICAgICRodG1sX3N0cmluZyA9IHByZWdfcmVwbGFjZSgkdGhpcy0+X3JlbW92ZWRfcmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaHRtbF9zdHJpbmcpOwoKICAgICAgICAka2V5X3RhZ3MgPSBhcnJheSgkdGhpcy0+dGFnUGF0dGVybignaHRtbCcsIGZhbHNlLCBmYWxzZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnRhZ1BhdHRlcm4oJ2hlYWQnLCBmYWxzZSwgZmFsc2UpLAogICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT50YWdQYXR0ZXJuKCdoZWFkJywgdHJ1ZSwgZmFsc2UpLAogICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT50YWdQYXR0ZXJuKCdodG1sJywgdHJ1ZSwgZmFsc2UpLAogICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT50YWdQYXR0ZXJuKGFycmF5KAogICAgICAgICAgICAgICAgICAgICAgICAgICdib2R5JywgJ2ZyYW1lc2V0JywgJ2ZyYW1lJywgJ3AnLCAnZGl2JywKICAgICAgICAgICAgICAgICAgICAgICAgICAndGFibGUnLCdzcGFuJywnYScpLCAnbWF5YmUnLCAnbWF5YmUnKSk7CiAgICAgICAgJGtleV90YWdzX3BvcyA9IGFycmF5KCk7CiAgICAgICAgZm9yZWFjaCAoJGtleV90YWdzIGFzICRwYXQpIHsKICAgICAgICAgICAgJG1hdGNoZXMgPSBhcnJheSgpOwogICAgICAgICAgICBwcmVnX21hdGNoKCRwYXQsICRodG1sX3N0cmluZywgJG1hdGNoZXMsIFBSRUdfT0ZGU0VUX0NBUFRVUkUpOwogICAgICAgICAgICBpZigkbWF0Y2hlcykgewogICAgICAgICAgICAgICAgJGtleV90YWdzX3Bvc1tdID0gJG1hdGNoZXNbMF1bMV07CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAka2V5X3RhZ3NfcG9zW10gPSBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vIG5vIG9wZW5pbmcgaGVhZCB0YWcKICAgICAgICBpZiAoaXNfbnVsbCgka2V5X3RhZ3NfcG9zWzFdKSkgewogICAgICAgICAgICByZXR1cm4gYXJyYXkoKTsKICAgICAgICB9CiAgICAgICAgLy8gdGhlIGVmZmVjdGl2ZSA8L2hlYWQ+IGlzIHRoZSBtaW4gb2YgdGhlIGZvbGxvd2luZwogICAgICAgIGlmIChpc19udWxsKCRrZXlfdGFnc19wb3NbMl0pKSB7CiAgICAgICAgICAgICRrZXlfdGFnc19wb3NbMl0gPSBzdHJsZW4oJGh0bWxfc3RyaW5nKTsKICAgICAgICB9CiAgICAgICAgZm9yZWFjaCAoYXJyYXkoJGtleV90YWdzX3Bvc1szXSwgJGtleV90YWdzX3Bvc1s0XSkgYXMgJHBvcykgewogICAgICAgICAgICBpZiAoIWlzX251bGwoJHBvcykgJiYgJHBvcyA8ICRrZXlfdGFnc19wb3NbMl0pIHsKICAgICAgICAgICAgICAgICRrZXlfdGFnc19wb3NbMl0gPSAkcG9zOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vIGNsb3NpbmcgaGVhZCB0YWcgY29tZXMgYmVmb3JlIG9wZW5pbmcgaGVhZCB0YWcKICAgICAgICBpZiAoJGtleV90YWdzX3Bvc1sxXSA+ICRrZXlfdGFnc19wb3NbMl0pIHsKICAgICAgICAgICAgcmV0dXJuIGFycmF5KCk7CiAgICAgICAgfQogICAgICAgIC8vIGlmIHRoZXJlIGlzIGFuIG9wZW5pbmcgaHRtbCB0YWcsIG1ha2Ugc3VyZSB0aGUgb3BlbmluZyBoZWFkIHRhZwogICAgICAgIC8vIGNvbWVzIGFmdGVyIGl0CiAgICAgICAgaWYgKCFpc19udWxsKCRrZXlfdGFnc19wb3NbMF0pICYmICRrZXlfdGFnc19wb3NbMV0gPCAka2V5X3RhZ3NfcG9zWzBdKSB7CiAgICAgICAgICAgIHJldHVybiBhcnJheSgpOwogICAgICAgIH0KICAgICAgICAkaHRtbF9zdHJpbmcgPSBzdWJzdHIoJGh0bWxfc3RyaW5nLCAka2V5X3RhZ3NfcG9zWzFdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJGtleV90YWdzX3Bvc1syXS0ka2V5X3RhZ3NfcG9zWzFdKSk7CgogICAgICAgICRsaW5rX2RhdGEgPSBhcnJheSgpOwogICAgICAgICRsaW5rX21hdGNoZXMgPSBhcnJheSgpOwogICAgICAgIAogICAgICAgIGlmICghcHJlZ19tYXRjaF9hbGwoJHRoaXMtPnRhZ1BhdHRlcm4oJ21ldGEnLCBmYWxzZSwgJ21heWJlJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaHRtbF9zdHJpbmcsICRsaW5rX21hdGNoZXMpKSB7CiAgICAgICAgICAgIHJldHVybiBhcnJheSgpOwogICAgICAgIH0KCiAgICAgICAgZm9yZWFjaCAoJGxpbmtfbWF0Y2hlc1swXSBhcyAkbGluaykgewogICAgICAgICAgICAkYXR0cl9tYXRjaGVzID0gYXJyYXkoKTsKICAgICAgICAgICAgcHJlZ19tYXRjaF9hbGwoJHRoaXMtPl9hdHRyX2ZpbmQsICRsaW5rLCAkYXR0cl9tYXRjaGVzKTsKICAgICAgICAgICAgJGxpbmtfYXR0cnMgPSBhcnJheSgpOwogICAgICAgICAgICBmb3JlYWNoICgkYXR0cl9tYXRjaGVzWzBdIGFzICRpbmRleCA9PiAkZnVsbF9tYXRjaCkgewogICAgICAgICAgICAgICAgJG5hbWUgPSAkYXR0cl9tYXRjaGVzWzFdWyRpbmRleF07CiAgICAgICAgICAgICAgICAkdmFsdWUgPSAkdGhpcy0+cmVwbGFjZUVudGl0aWVzKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+cmVtb3ZlUXVvdGVzKCRhdHRyX21hdGNoZXNbMl1bJGluZGV4XSkpOwoKICAgICAgICAgICAgICAgICRsaW5rX2F0dHJzW3N0cnRvbG93ZXIoJG5hbWUpXSA9ICR2YWx1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkbGlua19kYXRhW10gPSAkbGlua19hdHRyczsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkbGlua19kYXRhOwogICAgfQoKICAgIC8qKgogICAgICogTG9va3MgZm9yIGEgTUVUQSB0YWcgd2l0aCBhbiAiaHR0cC1lcXVpdiIgYXR0cmlidXRlIHdob3NlIHZhbHVlCiAgICAgKiBpcyBvbmUgb2YgKCJ4LXhyZHMtbG9jYXRpb24iLCAieC15YWRpcy1sb2NhdGlvbiIpLCBpZ25vcmluZwogICAgICogY2FzZS4gIElmIHN1Y2ggYSBNRVRBIHRhZyBpcyBmb3VuZCwgaXRzICJjb250ZW50IiBhdHRyaWJ1dGUKICAgICAqIHZhbHVlIGlzIHJldHVybmVkLgogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgJGh0bWxfc3RyaW5nIEFuIEhUTUwgZG9jdW1lbnQgaW4gc3RyaW5nIGZvcm1hdAogICAgICogQHJldHVybiBtaXhlZCAkY29udGVudCBUaGUgImNvbnRlbnQiIGF0dHJpYnV0ZSB2YWx1ZSBvZiB0aGUKICAgICAqIE1FVEEgdGFnLCBpZiBmb3VuZCwgb3IgbnVsbCBpZiBubyBzdWNoIHRhZyB3YXMgZm91bmQuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldEhUVFBFcXVpdigkaHRtbF9zdHJpbmcpCiAgICB7CiAgICAgICAgJG1ldGFfdGFncyA9ICR0aGlzLT5nZXRNZXRhVGFncygkaHRtbF9zdHJpbmcpOwoKICAgICAgICBpZiAoJG1ldGFfdGFncykgewogICAgICAgICAgICBmb3JlYWNoICgkbWV0YV90YWdzIGFzICR0YWcpIHsKICAgICAgICAgICAgICAgIGlmIChhcnJheV9rZXlfZXhpc3RzKCdodHRwLWVxdWl2JywgJHRhZykgJiYKICAgICAgICAgICAgICAgICAgICAoaW5fYXJyYXkoc3RydG9sb3dlcigkdGFnWydodHRwLWVxdWl2J10pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheSgneC14cmRzLWxvY2F0aW9uJywgJ3gteWFkaXMtbG9jYXRpb24nKSkpICYmCiAgICAgICAgICAgICAgICAgICAgYXJyYXlfa2V5X2V4aXN0cygnY29udGVudCcsICR0YWcpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICR0YWdbJ2NvbnRlbnQnXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9Cn0KCg==]]></data>
	</file>
	<file>
	  <filename>/openid-php-openid-782224d/Auth/Yadis/PlainHTTPFetcher.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBUaGlzIG1vZHVsZSBjb250YWlucyB0aGUgcGxhaW4gbm9uLWN1cmwgSFRUUCBmZXRjaGVyCiAqIGltcGxlbWVudGF0aW9uLgogKgogKiBQSFAgdmVyc2lvbnMgNCBhbmQgNQogKgogKiBMSUNFTlNFOiBTZWUgdGhlIENPUFlJTkcgZmlsZSBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbi4KICoKICogQHBhY2thZ2UgT3BlbklECiAqIEBhdXRob3IgSmFuUmFpbiwgSW5jLiA8b3BlbmlkQGphbnJhaW4uY29tPgogKiBAY29weXJpZ2h0IDIwMDUtMjAwOCBKYW5yYWluLCBJbmMuCiAqIEBsaWNlbnNlIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCBBcGFjaGUKICovCgovKioKICogSW50ZXJmYWNlIGltcG9ydAogKi8KcmVxdWlyZV9vbmNlICJBdXRoL1lhZGlzL0hUVFBGZXRjaGVyLnBocCI7CgovKioKICogVGhpcyBjbGFzcyBpbXBsZW1lbnRzIGEgcGxhaW4sIGhhbmQtYnVpbHQgc29ja2V0LWJhc2VkIGZldGNoZXIKICogd2hpY2ggd2lsbCBiZSB1c2VkIGluIHRoZSBldmVudCB0aGF0IENVUkwgaXMgdW5hdmFpbGFibGUuCiAqCiAqIEBwYWNrYWdlIE9wZW5JRAogKi8KY2xhc3MgQXV0aF9ZYWRpc19QbGFpbkhUVFBGZXRjaGVyIGV4dGVuZHMgQXV0aF9ZYWRpc19IVFRQRmV0Y2hlciB7CiAgICAvKioKICAgICAqIERvZXMgdGhpcyBmZXRjaGVyIHN1cHBvcnQgU1NMIFVSTHM/CiAgICAgKi8KICAgIGZ1bmN0aW9uIHN1cHBvcnRzU1NMKCkKICAgIHsKICAgICAgICByZXR1cm4gZnVuY3Rpb25fZXhpc3RzKCdvcGVuc3NsX29wZW4nKTsKICAgIH0KCiAgICBmdW5jdGlvbiBnZXQoJHVybCwgJGV4dHJhX2hlYWRlcnMgPSBudWxsKQogICAgewogICAgICAgIGlmICghJHRoaXMtPmNhbkZldGNoVVJMKCR1cmwpKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KCiAgICAgICAgJHJlZGlyID0gdHJ1ZTsKCiAgICAgICAgJHN0b3AgPSB0aW1lKCkgKyAkdGhpcy0+dGltZW91dDsKICAgICAgICAkb2ZmID0gJHRoaXMtPnRpbWVvdXQ7CgogICAgICAgIHdoaWxlICgkcmVkaXIgJiYgKCRvZmYgPiAwKSkgewoKICAgICAgICAgICAgJHBhcnRzID0gcGFyc2VfdXJsKCR1cmwpOwoKICAgICAgICAgICAgJHNwZWNpZnlfcG9ydCA9IHRydWU7CgogICAgICAgICAgICAvLyBTZXQgYSBkZWZhdWx0IHBvcnQuCiAgICAgICAgICAgIGlmICghYXJyYXlfa2V5X2V4aXN0cygncG9ydCcsICRwYXJ0cykpIHsKICAgICAgICAgICAgICAgICRzcGVjaWZ5X3BvcnQgPSBmYWxzZTsKICAgICAgICAgICAgICAgIGlmICgkcGFydHNbJ3NjaGVtZSddID09ICdodHRwJykgewogICAgICAgICAgICAgICAgICAgICRwYXJ0c1sncG9ydCddID0gODA7CiAgICAgICAgICAgICAgICB9IGVsc2VpZiAoJHBhcnRzWydzY2hlbWUnXSA9PSAnaHR0cHMnKSB7CiAgICAgICAgICAgICAgICAgICAgJHBhcnRzWydwb3J0J10gPSA0NDM7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIWFycmF5X2tleV9leGlzdHMoJ3BhdGgnLCAkcGFydHMpKSB7CiAgICAgICAgICAgICAgICAkcGFydHNbJ3BhdGgnXSA9ICcvJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJGhvc3QgPSAkcGFydHNbJ2hvc3QnXTsKCiAgICAgICAgICAgIGlmICgkcGFydHNbJ3NjaGVtZSddID09ICdodHRwcycpIHsKICAgICAgICAgICAgICAgICRob3N0ID0gJ3NzbDovLycgLiAkaG9zdDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHVzZXJfYWdlbnQgPSBBdXRoX09wZW5JRF9VU0VSX0FHRU5UOwoKICAgICAgICAgICAgJGhlYWRlcnMgPSBhcnJheSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR0VUICIuJHBhcnRzWydwYXRoJ10uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFycmF5X2tleV9leGlzdHMoJ3F1ZXJ5JywgJHBhcnRzKSA/CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI/Ii4kcGFydHNbJ3F1ZXJ5J10gOiAiIikuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgSFRUUC8xLjAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVc2VyLUFnZW50OiAkdXNlcl9hZ2VudCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhvc3Q6ICIuJHBhcnRzWydob3N0J10uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCRzcGVjaWZ5X3BvcnQgPyAiOiIuJHBhcnRzWydwb3J0J10gOiAiIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBvcnQ6ICIuJHBhcnRzWydwb3J0J10pOwoKICAgICAgICAgICAgJGVycm5vID0gMDsKICAgICAgICAgICAgJGVycnN0ciA9ICcnOwoKICAgICAgICAgICAgaWYgKCRleHRyYV9oZWFkZXJzKSB7CiAgICAgICAgICAgICAgICBmb3JlYWNoICgkZXh0cmFfaGVhZGVycyBhcyAkaCkgewogICAgICAgICAgICAgICAgICAgICRoZWFkZXJzW10gPSAkaDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgQCRzb2NrID0gZnNvY2tvcGVuKCRob3N0LCAkcGFydHNbJ3BvcnQnXSwgJGVycm5vLCAkZXJyc3RyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnRpbWVvdXQpOwogICAgICAgICAgICBpZiAoJHNvY2sgPT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHN0cmVhbV9zZXRfdGltZW91dCgkc29jaywgJHRoaXMtPnRpbWVvdXQpOwoKICAgICAgICAgICAgZnB1dHMoJHNvY2ssIGltcGxvZGUoIlxyXG4iLCAkaGVhZGVycykgLiAiXHJcblxyXG4iKTsKCiAgICAgICAgICAgICRkYXRhID0gIiI7CiAgICAgICAgICAgICRraWxvYnl0ZXMgPSAwOwogICAgICAgICAgICB3aGlsZSAoIWZlb2YoJHNvY2spICYmCiAgICAgICAgICAgICAgICAgICAka2lsb2J5dGVzIDwgQXV0aF9PcGVuSURfRkVUQ0hFUl9NQVhfUkVTUE9OU0VfS0IgKSB7CiAgICAgICAgICAgICAgICAkZGF0YSAuPSBmZ2V0cygkc29jaywgMTAyNCk7CiAgICAgICAgICAgICAgICAka2lsb2J5dGVzICs9IDE7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGZjbG9zZSgkc29jayk7CgogICAgICAgICAgICAvLyBTcGxpdCByZXNwb25zZSBpbnRvIGhlYWRlciBhbmQgYm9keSBzZWN0aW9ucwogICAgICAgICAgICBsaXN0KCRoZWFkZXJzLCAkYm9keSkgPSBleHBsb2RlKCJcclxuXHJcbiIsICRkYXRhLCAyKTsKICAgICAgICAgICAgJGhlYWRlcnMgPSBleHBsb2RlKCJcclxuIiwgJGhlYWRlcnMpOwoKICAgICAgICAgICAgJGh0dHBfY29kZSA9IGV4cGxvZGUoIiAiLCAkaGVhZGVyc1swXSk7CiAgICAgICAgICAgICRjb2RlID0gJGh0dHBfY29kZVsxXTsKCiAgICAgICAgICAgIGlmIChpbl9hcnJheSgkY29kZSwgYXJyYXkoJzMwMScsICczMDInKSkpIHsKICAgICAgICAgICAgICAgICR1cmwgPSAkdGhpcy0+X2ZpbmRSZWRpcmVjdCgkaGVhZGVycywgJHVybCk7CiAgICAgICAgICAgICAgICAkcmVkaXIgPSB0cnVlOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJHJlZGlyID0gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRvZmYgPSAkc3RvcCAtIHRpbWUoKTsKICAgICAgICB9CgogICAgICAgICRuZXdfaGVhZGVycyA9IGFycmF5KCk7CgogICAgICAgIGZvcmVhY2ggKCRoZWFkZXJzIGFzICRoZWFkZXIpIHsKICAgICAgICAgICAgaWYgKHByZWdfbWF0Y2goIi86LyIsICRoZWFkZXIpKSB7CiAgICAgICAgICAgICAgICAkcGFydHMgPSBleHBsb2RlKCI6ICIsICRoZWFkZXIsIDIpOwoKICAgICAgICAgICAgICAgIGlmIChjb3VudCgkcGFydHMpID09IDIpIHsKICAgICAgICAgICAgICAgICAgICBsaXN0KCRuYW1lLCAkdmFsdWUpID0gJHBhcnRzOwogICAgICAgICAgICAgICAgICAgICRuZXdfaGVhZGVyc1skbmFtZV0gPSAkdmFsdWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgfQoKICAgICAgICByZXR1cm4gbmV3IEF1dGhfWWFkaXNfSFRUUFJlc3BvbnNlKCR1cmwsICRjb2RlLCAkbmV3X2hlYWRlcnMsICRib2R5KTsKICAgIH0KCiAgICBmdW5jdGlvbiBwb3N0KCR1cmwsICRib2R5LCAkZXh0cmFfaGVhZGVycyA9IG51bGwpCiAgICB7CiAgICAgICAgaWYgKCEkdGhpcy0+Y2FuRmV0Y2hVUkwoJHVybCkpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQoKICAgICAgICAkcGFydHMgPSBwYXJzZV91cmwoJHVybCk7CgogICAgICAgICRoZWFkZXJzID0gYXJyYXkoKTsKCiAgICAgICAgJHBvc3RfcGF0aCA9ICRwYXJ0c1sncGF0aCddOwogICAgICAgIGlmIChpc3NldCgkcGFydHNbJ3F1ZXJ5J10pKSB7CiAgICAgICAgICAgICRwb3N0X3BhdGggLj0gJz8nIC4gJHBhcnRzWydxdWVyeSddOwogICAgICAgIH0KCiAgICAgICAgJGhlYWRlcnNbXSA9ICJQT1NUICIuJHBvc3RfcGF0aC4iIEhUVFAvMS4wIjsKICAgICAgICAkaGVhZGVyc1tdID0gIkhvc3Q6ICIgLiAkcGFydHNbJ2hvc3QnXTsKICAgICAgICAkaGVhZGVyc1tdID0gIkNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIjsKICAgICAgICAkaGVhZGVyc1tdID0gIkNvbnRlbnQtbGVuZ3RoOiAiIC4gc3RydmFsKHN0cmxlbigkYm9keSkpOwoKICAgICAgICBpZiAoJGV4dHJhX2hlYWRlcnMgJiYKICAgICAgICAgICAgaXNfYXJyYXkoJGV4dHJhX2hlYWRlcnMpKSB7CiAgICAgICAgICAgICRoZWFkZXJzID0gYXJyYXlfbWVyZ2UoJGhlYWRlcnMsICRleHRyYV9oZWFkZXJzKTsKICAgICAgICB9CgogICAgICAgIC8vIEpvaW4gYWxsIGhlYWRlcnMgdG9nZXRoZXIuCiAgICAgICAgJGFsbF9oZWFkZXJzID0gaW1wbG9kZSgiXHJcbiIsICRoZWFkZXJzKTsKCiAgICAgICAgLy8gQWRkIGhlYWRlcnMsIHR3byBuZXdsaW5lcywgYW5kIHJlcXVlc3QgYm9keS4KICAgICAgICAkcmVxdWVzdCA9ICRhbGxfaGVhZGVycyAuICJcclxuXHJcbiIgLiAkYm9keTsKCiAgICAgICAgLy8gU2V0IGEgZGVmYXVsdCBwb3J0LgogICAgICAgIGlmICghYXJyYXlfa2V5X2V4aXN0cygncG9ydCcsICRwYXJ0cykpIHsKICAgICAgICAgICAgaWYgKCRwYXJ0c1snc2NoZW1lJ10gPT0gJ2h0dHAnKSB7CiAgICAgICAgICAgICAgICAkcGFydHNbJ3BvcnQnXSA9IDgwOwogICAgICAgICAgICB9IGVsc2VpZiAoJHBhcnRzWydzY2hlbWUnXSA9PSAnaHR0cHMnKSB7CiAgICAgICAgICAgICAgICAkcGFydHNbJ3BvcnQnXSA9IDQ0MzsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoJHBhcnRzWydzY2hlbWUnXSA9PSAnaHR0cHMnKSB7CiAgICAgICAgICAgICRwYXJ0c1snaG9zdCddID0gc3ByaW50Zigic3NsOi8vJXMiLCAkcGFydHNbJ2hvc3QnXSk7CiAgICAgICAgfQoKICAgICAgICAvLyBDb25uZWN0IHRvIHRoZSByZW1vdGUgc2VydmVyLgogICAgICAgICRlcnJubyA9IDA7CiAgICAgICAgJGVycnN0ciA9ICcnOwoKICAgICAgICAkc29jayA9IGZzb2Nrb3BlbigkcGFydHNbJ2hvc3QnXSwgJHBhcnRzWydwb3J0J10sICRlcnJubywgJGVycnN0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+dGltZW91dCk7CgogICAgICAgIGlmICgkc29jayA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQoKICAgICAgICBzdHJlYW1fc2V0X3RpbWVvdXQoJHNvY2ssICR0aGlzLT50aW1lb3V0KTsKCiAgICAgICAgLy8gV3JpdGUgdGhlIFBPU1QgcmVxdWVzdC4KICAgICAgICBmcHV0cygkc29jaywgJHJlcXVlc3QpOwoKICAgICAgICAvLyBHZXQgdGhlIHJlc3BvbnNlIGZyb20gdGhlIHNlcnZlci4KICAgICAgICAkcmVzcG9uc2UgPSAiIjsKICAgICAgICB3aGlsZSAoIWZlb2YoJHNvY2spKSB7CiAgICAgICAgICAgIGlmICgkZGF0YSA9IGZnZXRzKCRzb2NrLCAxMjgpKSB7CiAgICAgICAgICAgICAgICAkcmVzcG9uc2UgLj0gJGRhdGE7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gU3BsaXQgdGhlIHJlcXVlc3QgaW50byBoZWFkZXJzIGFuZCBib2R5LgogICAgICAgIGxpc3QoJGhlYWRlcnMsICRyZXNwb25zZV9ib2R5KSA9IGV4cGxvZGUoIlxyXG5cclxuIiwgJHJlc3BvbnNlLCAyKTsKCiAgICAgICAgJGhlYWRlcnMgPSBleHBsb2RlKCJcclxuIiwgJGhlYWRlcnMpOwoKICAgICAgICAvLyBFeHBlY3QgdGhlIGZpcnN0IGxpbmUgb2YgdGhlIGhlYWRlcnMgZGF0YSB0byBiZSBzb21ldGhpbmcKICAgICAgICAvLyBsaWtlIEhUVFAvMS4xIDIwMCBPSy4gIFNwbGl0IHRoZSBsaW5lIG9uIHNwYWNlcyBhbmQgdGFrZQogICAgICAgIC8vIHRoZSBzZWNvbmQgdG9rZW4sIHdoaWNoIHNob3VsZCBiZSB0aGUgcmV0dXJuIGNvZGUuCiAgICAgICAgJGh0dHBfY29kZSA9IGV4cGxvZGUoIiAiLCAkaGVhZGVyc1swXSk7CiAgICAgICAgJGNvZGUgPSAkaHR0cF9jb2RlWzFdOwoKICAgICAgICAkbmV3X2hlYWRlcnMgPSBhcnJheSgpOwoKICAgICAgICBmb3JlYWNoICgkaGVhZGVycyBhcyAkaGVhZGVyKSB7CiAgICAgICAgICAgIGlmIChwcmVnX21hdGNoKCIvOi8iLCAkaGVhZGVyKSkgewogICAgICAgICAgICAgICAgbGlzdCgkbmFtZSwgJHZhbHVlKSA9IGV4cGxvZGUoIjogIiwgJGhlYWRlciwgMik7CiAgICAgICAgICAgICAgICAkbmV3X2hlYWRlcnNbJG5hbWVdID0gJHZhbHVlOwogICAgICAgICAgICB9CgogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIG5ldyBBdXRoX1lhZGlzX0hUVFBSZXNwb25zZSgkdXJsLCAkY29kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRuZXdfaGVhZGVycywgJHJlc3BvbnNlX2JvZHkpOwogICAgfQp9Cgo=]]></data>
	</file>
	<file>
	  <filename>/openid-php-openid-782224d/Auth/Yadis/XML.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBYTUwtcGFyc2luZyBjbGFzc2VzIHRvIHdyYXAgdGhlIGRvbXhtbCBhbmQgRE9NIGV4dGVuc2lvbnMgZm9yIFBIUCA0CiAqIGFuZCA1LCByZXNwZWN0aXZlbHkuCiAqCiAqIEBwYWNrYWdlIE9wZW5JRAogKi8KCi8qKgogKiBUaGUgYmFzZSBjbGFzcyBmb3Igd3JhcHBlcnMgZm9yIGF2YWlsYWJsZSBQSFAgWE1MLXBhcnNpbmcKICogZXh0ZW5zaW9ucy4gIFRvIHdvcmsgd2l0aCB0aGlzIFlhZGlzIGxpYnJhcnksIHN1YmNsYXNzZXMgb2YgdGhpcwogKiBjbGFzcyBNVVNUIGltcGxlbWVudCB0aGUgQVBJIGFzIGRlZmluZWQgaW4gdGhlIHJlbWFya3MgZm9yIHRoaXMKICogY2xhc3MuICBTdWJjbGFzc2VzIG9mIEF1dGhfWWFkaXNfWE1MUGFyc2VyIGFyZSB1c2VkIHRvIHdyYXAKICogcGFydGljdWxhciBQSFAgWE1MIGV4dGVuc2lvbnMgc3VjaCBhcyAnZG9teG1sJy4gIFRoZXNlIGFyZSB1c2VkCiAqIGludGVybmFsbHkgYnkgdGhlIGxpYnJhcnkgZGVwZW5kaW5nIG9uIHRoZSBhdmFpbGFiaWxpdHkgb2YKICogc3VwcG9ydGVkIFBIUCBYTUwgZXh0ZW5zaW9ucy4KICoKICogQHBhY2thZ2UgT3BlbklECiAqLwpjbGFzcyBBdXRoX1lhZGlzX1hNTFBhcnNlciB7CiAgICAvKioKICAgICAqIEluaXRpYWxpemUgYW4gaW5zdGFuY2Ugb2YgQXV0aF9ZYWRpc19YTUxQYXJzZXIgd2l0aCBzb21lCiAgICAgKiBYTUwgYW5kIG5hbWVzcGFjZXMuICBUaGlzIFNIT1VMRCBOT1QgYmUgb3ZlcnJpZGRlbiBieQogICAgICogc3ViY2xhc3Nlcy4KICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICR4bWxfc3RyaW5nIEEgc3RyaW5nIG9mIFhNTCB0byBiZSBwYXJzZWQuCiAgICAgKiBAcGFyYW0gYXJyYXkgJG5hbWVzcGFjZV9tYXAgQW4gYXJyYXkgb2YgKCRuc19uYW1lID0+ICRuc191cmkpCiAgICAgKiB0byBiZSByZWdpc3RlcmVkIHdpdGggdGhlIFhNTCBwYXJzZXIuICBNYXkgYmUgZW1wdHkuCiAgICAgKiBAcmV0dXJuIGJvb2xlYW4gJHJlc3VsdCBUcnVlIGlmIHRoZSBpbml0aWFsaXphdGlvbiBhbmQKICAgICAqIG5hbWVzcGFjZSByZWdpc3RyYXRpb24ocykgc3VjY2VlZGVkOyBmYWxzZSBvdGhlcndpc2UuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGluaXQoJHhtbF9zdHJpbmcsICRuYW1lc3BhY2VfbWFwKQogICAgewogICAgICAgIGlmICghJHRoaXMtPnNldFhNTCgkeG1sX3N0cmluZykpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgZm9yZWFjaCAoJG5hbWVzcGFjZV9tYXAgYXMgJHByZWZpeCA9PiAkdXJpKSB7CiAgICAgICAgICAgIGlmICghJHRoaXMtPnJlZ2lzdGVyTmFtZXNwYWNlKCRwcmVmaXgsICR1cmkpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIC8qKgogICAgICogUmVnaXN0ZXIgYSBuYW1lc3BhY2Ugd2l0aCB0aGUgWE1MIHBhcnNlci4gIFRoaXMgc2hvdWxkIGJlCiAgICAgKiBvdmVycmlkZGVuIGJ5IHN1YmNsYXNzZXMuCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkcHJlZml4IFRoZSBuYW1lc3BhY2UgcHJlZml4IHRvIGFwcGVhciBpbiBYTUwgdGFnCiAgICAgKiBuYW1lcy4KICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICR1cmkgVGhlIG5hbWVzcGFjZSBVUkkgdG8gYmUgdXNlZCB0byBpZGVudGlmeSB0aGUKICAgICAqIG5hbWVzcGFjZSBpbiB0aGUgWE1MLgogICAgICoKICAgICAqIEByZXR1cm4gYm9vbGVhbiAkcmVzdWx0IFRydWUgaWYgdGhlIHJlZ2lzdHJhdGlvbiBzdWNjZWVkZWQ7CiAgICAgKiBmYWxzZSBvdGhlcndpc2UuCiAgICAgKi8KICAgIGZ1bmN0aW9uIHJlZ2lzdGVyTmFtZXNwYWNlKCRwcmVmaXgsICR1cmkpCiAgICB7CiAgICAgICAgLy8gTm90IGltcGxlbWVudGVkLgogICAgfQoKICAgIC8qKgogICAgICogU2V0IHRoaXMgcGFyc2VyIG9iamVjdCdzIFhNTCBwYXlsb2FkLiAgVGhpcyBzaG91bGQgYmUKICAgICAqIG92ZXJyaWRkZW4gYnkgc3ViY2xhc3Nlcy4KICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICR4bWxfc3RyaW5nIFRoZSBYTUwgc3RyaW5nIHRvIHBhc3MgdG8gdGhpcwogICAgICogb2JqZWN0J3MgWE1MIHBhcnNlci4KICAgICAqCiAgICAgKiBAcmV0dXJuIGJvb2xlYW4gJHJlc3VsdCBUcnVlIGlmIHRoZSBpbml0aWFsaXphdGlvbiBzdWNjZWVkZWQ7CiAgICAgKiBmYWxzZSBvdGhlcndpc2UuCiAgICAgKi8KICAgIGZ1bmN0aW9uIHNldFhNTCgkeG1sX3N0cmluZykKICAgIHsKICAgICAgICAvLyBOb3QgaW1wbGVtZW50ZWQuCiAgICB9CgogICAgLyoqCiAgICAgKiBFdmFsdWF0ZSBhbiBYUGF0aCBleHByZXNzaW9uIGFuZCByZXR1cm4gdGhlIHJlc3VsdGluZyBub2RlCiAgICAgKiBsaXN0LiAgVGhpcyBzaG91bGQgYmUgb3ZlcnJpZGRlbiBieSBzdWJjbGFzc2VzLgogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgJHhwYXRoIFRoZSBYUGF0aCBleHByZXNzaW9uIHRvIGJlIGV2YWx1YXRlZC4KICAgICAqCiAgICAgKiBAcGFyYW0gbWl4ZWQgJG5vZGUgQSBub2RlIG9iamVjdCByZXN1bHRpbmcgZnJvbSBhIHByZXZpb3VzCiAgICAgKiBldmFsWFBhdGggY2FsbC4gIFRoaXMgbm9kZSwgaWYgc3BlY2lmaWVkLCBwcm92aWRlcyB0aGUgY29udGV4dAogICAgICogZm9yIHRoZSBldmFsdWF0aW9uIG9mIHRoaXMgeHBhdGggZXhwcmVzc2lvbi4KICAgICAqCiAgICAgKiBAcmV0dXJuIGFycmF5ICRub2RlX2xpc3QgQW4gYXJyYXkgb2YgbWF0Y2hpbmcgb3BhcXVlIG5vZGUKICAgICAqIG9iamVjdHMgdG8gYmUgdXNlZCB3aXRoIG90aGVyIG1ldGhvZHMgb2YgdGhpcyBwYXJzZXIgY2xhc3MuCiAgICAgKi8KICAgIGZ1bmN0aW9uICZldmFsWFBhdGgoJHhwYXRoLCAkbm9kZSA9IG51bGwpCiAgICB7CiAgICAgICAgLy8gTm90IGltcGxlbWVudGVkLgogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJuIHRoZSB0ZXh0dWFsIGNvbnRlbnQgb2YgYSBzcGVjaWZpZWQgbm9kZS4KICAgICAqCiAgICAgKiBAcGFyYW0gbWl4ZWQgJG5vZGUgQSBub2RlIG9iamVjdCBmcm9tIGEgcHJldmlvdXMgY2FsbCB0bwogICAgICogJHRoaXMtPmV2YWxYUGF0aCgpLgogICAgICoKICAgICAqIEByZXR1cm4gc3RyaW5nICRjb250ZW50IFRoZSBjb250ZW50IG9mIHRoaXMgbm9kZS4KICAgICAqLwogICAgZnVuY3Rpb24gY29udGVudCgkbm9kZSkKICAgIHsKICAgICAgICAvLyBOb3QgaW1wbGVtZW50ZWQuCiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm4gdGhlIGF0dHJpYnV0ZXMgb2YgYSBzcGVjaWZpZWQgbm9kZS4KICAgICAqCiAgICAgKiBAcGFyYW0gbWl4ZWQgJG5vZGUgQSBub2RlIG9iamVjdCBmcm9tIGEgcHJldmlvdXMgY2FsbCB0bwogICAgICogJHRoaXMtPmV2YWxYUGF0aCgpLgogICAgICoKICAgICAqIEByZXR1cm4gYXJyYXkgJGF0dHJzIEFuIGFycmF5IG1hcHBpbmcgYXR0cmlidXRlIG5hbWVzIHRvCiAgICAgKiB2YWx1ZXMuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGF0dHJpYnV0ZXMoJG5vZGUpCiAgICB7CiAgICAgICAgLy8gTm90IGltcGxlbWVudGVkLgogICAgfQp9CgovKioKICogVGhpcyBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbiBvZiBBdXRoX1lhZGlzX1hNTFBhcnNlciBpbXBsZW1lbnRzCiAqIHRoZSBhcHByb3ByaWF0ZSBBUEkgZm9yIHRoZSAnZG9teG1sJyBleHRlbnNpb24gd2hpY2ggaXMgdHlwaWNhbGx5CiAqIHBhY2thZ2VkIHdpdGggUEhQIDQuICBUaGlzIGNsYXNzIHdpbGwgYmUgdXNlZCB3aGVuZXZlciB0aGUgJ2RvbXhtbCcKICogZXh0ZW5zaW9uIGlzIGRldGVjdGVkLiAgU2VlIHRoZSBBdXRoX1lhZGlzX1hNTFBhcnNlciBjbGFzcyBmb3IKICogZGV0YWlscyBvbiB0aGlzIGNsYXNzJ3MgbWV0aG9kcy4KICoKICogQHBhY2thZ2UgT3BlbklECiAqLwpjbGFzcyBBdXRoX1lhZGlzX2RvbXhtbCBleHRlbmRzIEF1dGhfWWFkaXNfWE1MUGFyc2VyIHsKICAgIGZ1bmN0aW9uIEF1dGhfWWFkaXNfZG9teG1sKCkKICAgIHsKICAgICAgICAkdGhpcy0+eG1sID0gbnVsbDsKICAgICAgICAkdGhpcy0+ZG9jID0gbnVsbDsKICAgICAgICAkdGhpcy0+eHBhdGggPSBudWxsOwogICAgICAgICR0aGlzLT5lcnJvcnMgPSBhcnJheSgpOwogICAgfQoKICAgIGZ1bmN0aW9uIHNldFhNTCgkeG1sX3N0cmluZykKICAgIHsKICAgICAgICAkdGhpcy0+eG1sID0gJHhtbF9zdHJpbmc7CiAgICAgICAgJHRoaXMtPmRvYyA9IEBkb214bWxfb3Blbl9tZW0oJHhtbF9zdHJpbmcsIERPTVhNTF9MT0FEX1BBUlNJTkcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmVycm9ycyk7CgogICAgICAgIGlmICghJHRoaXMtPmRvYykgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICAkdGhpcy0+eHBhdGggPSAkdGhpcy0+ZG9jLT54cGF0aF9uZXdfY29udGV4dCgpOwoKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICBmdW5jdGlvbiByZWdpc3Rlck5hbWVzcGFjZSgkcHJlZml4LCAkdXJpKQogICAgewogICAgICAgIHJldHVybiB4cGF0aF9yZWdpc3Rlcl9ucygkdGhpcy0+eHBhdGgsICRwcmVmaXgsICR1cmkpOwogICAgfQoKICAgIGZ1bmN0aW9uICZldmFsWFBhdGgoJHhwYXRoLCAkbm9kZSA9IG51bGwpCiAgICB7CiAgICAgICAgaWYgKCRub2RlKSB7CiAgICAgICAgICAgICRyZXN1bHQgPSBAJHRoaXMtPnhwYXRoLT54cGF0aF9ldmFsKCR4cGF0aCwgJG5vZGUpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRyZXN1bHQgPSBAJHRoaXMtPnhwYXRoLT54cGF0aF9ldmFsKCR4cGF0aCk7CiAgICAgICAgfQoKICAgICAgICBpZiAoISRyZXN1bHQpIHsKICAgICAgICAgICAgJG4gPSBhcnJheSgpOwogICAgICAgICAgICByZXR1cm4gJG47CiAgICAgICAgfQoKICAgICAgICBpZiAoISRyZXN1bHQtPm5vZGVzZXQpIHsKICAgICAgICAgICAgJG4gPSBhcnJheSgpOwogICAgICAgICAgICByZXR1cm4gJG47CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJHJlc3VsdC0+bm9kZXNldDsKICAgIH0KCiAgICBmdW5jdGlvbiBjb250ZW50KCRub2RlKQogICAgewogICAgICAgIGlmICgkbm9kZSkgewogICAgICAgICAgICByZXR1cm4gJG5vZGUtPmdldF9jb250ZW50KCk7CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGF0dHJpYnV0ZXMoJG5vZGUpCiAgICB7CiAgICAgICAgaWYgKCRub2RlKSB7CiAgICAgICAgICAgICRhcnIgPSAkbm9kZS0+YXR0cmlidXRlcygpOwogICAgICAgICAgICAkcmVzdWx0ID0gYXJyYXkoKTsKCiAgICAgICAgICAgIGlmICgkYXJyKSB7CiAgICAgICAgICAgICAgICBmb3JlYWNoICgkYXJyIGFzICRhdHRybm9kZSkgewogICAgICAgICAgICAgICAgICAgICRyZXN1bHRbJGF0dHJub2RlLT5uYW1lXSA9ICRhdHRybm9kZS0+dmFsdWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiAkcmVzdWx0OwogICAgICAgIH0KICAgIH0KfQoKLyoqCiAqIFRoaXMgY29uY3JldGUgaW1wbGVtZW50YXRpb24gb2YgQXV0aF9ZYWRpc19YTUxQYXJzZXIgaW1wbGVtZW50cwogKiB0aGUgYXBwcm9wcmlhdGUgQVBJIGZvciB0aGUgJ2RvbScgZXh0ZW5zaW9uIHdoaWNoIGlzIHR5cGljYWxseQogKiBwYWNrYWdlZCB3aXRoIFBIUCA1LiAgVGhpcyBjbGFzcyB3aWxsIGJlIHVzZWQgd2hlbmV2ZXIgdGhlICdkb20nCiAqIGV4dGVuc2lvbiBpcyBkZXRlY3RlZC4gIFNlZSB0aGUgQXV0aF9ZYWRpc19YTUxQYXJzZXIgY2xhc3MgZm9yCiAqIGRldGFpbHMgb24gdGhpcyBjbGFzcydzIG1ldGhvZHMuCiAqCiAqIEBwYWNrYWdlIE9wZW5JRAogKi8KY2xhc3MgQXV0aF9ZYWRpc19kb20gZXh0ZW5kcyBBdXRoX1lhZGlzX1hNTFBhcnNlciB7CiAgICBmdW5jdGlvbiBBdXRoX1lhZGlzX2RvbSgpCiAgICB7CiAgICAgICAgJHRoaXMtPnhtbCA9IG51bGw7CiAgICAgICAgJHRoaXMtPmRvYyA9IG51bGw7CiAgICAgICAgJHRoaXMtPnhwYXRoID0gbnVsbDsKICAgICAgICAkdGhpcy0+ZXJyb3JzID0gYXJyYXkoKTsKICAgIH0KCiAgICBmdW5jdGlvbiBzZXRYTUwoJHhtbF9zdHJpbmcpCiAgICB7CiAgICAgICAgJHRoaXMtPnhtbCA9ICR4bWxfc3RyaW5nOwogICAgICAgICR0aGlzLT5kb2MgPSBuZXcgRE9NRG9jdW1lbnQ7CgogICAgICAgIGlmICghJHRoaXMtPmRvYykgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICBpZiAoIUAkdGhpcy0+ZG9jLT5sb2FkWE1MKCR4bWxfc3RyaW5nKSkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICAkdGhpcy0+eHBhdGggPSBuZXcgRE9NWFBhdGgoJHRoaXMtPmRvYyk7CgogICAgICAgIGlmICgkdGhpcy0+eHBhdGgpIHsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiByZWdpc3Rlck5hbWVzcGFjZSgkcHJlZml4LCAkdXJpKQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+eHBhdGgtPnJlZ2lzdGVyTmFtZXNwYWNlKCRwcmVmaXgsICR1cmkpOwogICAgfQoKICAgIGZ1bmN0aW9uICZldmFsWFBhdGgoJHhwYXRoLCAkbm9kZSA9IG51bGwpCiAgICB7CiAgICAgICAgaWYgKCRub2RlKSB7CiAgICAgICAgICAgICRyZXN1bHQgPSBAJHRoaXMtPnhwYXRoLT5xdWVyeSgkeHBhdGgsICRub2RlKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkcmVzdWx0ID0gQCR0aGlzLT54cGF0aC0+cXVlcnkoJHhwYXRoKTsKICAgICAgICB9CgogICAgICAgICRuID0gYXJyYXkoKTsKCiAgICAgICAgaWYgKCEkcmVzdWx0KSB7CiAgICAgICAgICAgIHJldHVybiAkbjsKICAgICAgICB9CgogICAgICAgIGZvciAoJGkgPSAwOyAkaSA8ICRyZXN1bHQtPmxlbmd0aDsgJGkrKykgewogICAgICAgICAgICAkbltdID0gJHJlc3VsdC0+aXRlbSgkaSk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJG47CiAgICB9CgogICAgZnVuY3Rpb24gY29udGVudCgkbm9kZSkKICAgIHsKICAgICAgICBpZiAoJG5vZGUpIHsKICAgICAgICAgICAgcmV0dXJuICRub2RlLT50ZXh0Q29udGVudDsKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gYXR0cmlidXRlcygkbm9kZSkKICAgIHsKICAgICAgICBpZiAoJG5vZGUpIHsKICAgICAgICAgICAgJGFyciA9ICRub2RlLT5hdHRyaWJ1dGVzOwogICAgICAgICAgICAkcmVzdWx0ID0gYXJyYXkoKTsKCiAgICAgICAgICAgIGlmICgkYXJyKSB7CiAgICAgICAgICAgICAgICBmb3IgKCRpID0gMDsgJGkgPCAkYXJyLT5sZW5ndGg7ICRpKyspIHsKICAgICAgICAgICAgICAgICAgICAkbm9kZSA9ICRhcnItPml0ZW0oJGkpOwogICAgICAgICAgICAgICAgICAgICRyZXN1bHRbJG5vZGUtPm5vZGVOYW1lXSA9ICRub2RlLT5ub2RlVmFsdWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiAkcmVzdWx0OwogICAgICAgIH0KICAgIH0KfQoKZ2xvYmFsICRfX0F1dGhfWWFkaXNfZGVmYXVsdFBhcnNlcjsKJF9fQXV0aF9ZYWRpc19kZWZhdWx0UGFyc2VyID0gbnVsbDsKCi8qKgogKiBTZXQgYSBkZWZhdWx0IHBhcnNlciB0byBvdmVycmlkZSB0aGUgZXh0ZW5zaW9uLWRyaXZlbiBzZWxlY3Rpb24gb2YKICogYXZhaWxhYmxlIHBhcnNlciBjbGFzc2VzLiAgVGhpcyBpcyBoZWxwZnVsIGluIGEgdGVzdCBlbnZpcm9ubWVudCBvcgogKiBvbmUgaW4gd2hpY2ggbXVsdGlwbGUgcGFyc2VycyBjYW4gYmUgdXNlZCBidXQgb25lIGlzIG1vcmUKICogZGVzaXJhYmxlLgogKgogKiBAcGFyYW0gQXV0aF9ZYWRpc19YTUxQYXJzZXIgJHBhcnNlciBBbiBpbnN0YW5jZSBvZiBhCiAqIEF1dGhfWWFkaXNfWE1MUGFyc2VyIHN1YmNsYXNzLgogKi8KZnVuY3Rpb24gQXV0aF9ZYWRpc19zZXREZWZhdWx0UGFyc2VyKCRwYXJzZXIpCnsKICAgIGdsb2JhbCAkX19BdXRoX1lhZGlzX2RlZmF1bHRQYXJzZXI7CiAgICAkX19BdXRoX1lhZGlzX2RlZmF1bHRQYXJzZXIgPSAkcGFyc2VyOwp9CgpmdW5jdGlvbiBBdXRoX1lhZGlzX2dldFN1cHBvcnRlZEV4dGVuc2lvbnMoKQp7CiAgICByZXR1cm4gYXJyYXkoJ2RvbScgICAgPT4gJ0F1dGhfWWFkaXNfZG9tJywKICAgICAgICAgICAgICAgICAnZG9teG1sJyA9PiAnQXV0aF9ZYWRpc19kb214bWwnKTsKfQoKLyoqCiAqIFJldHVybnMgYW4gaW5zdGFuY2Ugb2YgYSBBdXRoX1lhZGlzX1hNTFBhcnNlciBzdWJjbGFzcyBiYXNlZCBvbgogKiB0aGUgYXZhaWxhYmlsaXR5IG9mIFBIUCBleHRlbnNpb25zIGZvciBYTUwgcGFyc2luZy4gIElmCiAqIEF1dGhfWWFkaXNfc2V0RGVmYXVsdFBhcnNlciBoYXMgYmVlbiBjYWxsZWQsIHRoZSBwYXJzZXIgdXNlZCBpbgogKiB0aGF0IGNhbGwgd2lsbCBiZSByZXR1cm5lZCBpbnN0ZWFkLgogKi8KZnVuY3Rpb24gQXV0aF9ZYWRpc19nZXRYTUxQYXJzZXIoKQp7CiAgICBnbG9iYWwgJF9fQXV0aF9ZYWRpc19kZWZhdWx0UGFyc2VyOwogICAgCiAgICBpZiAoaXNzZXQoJF9fQXV0aF9ZYWRpc19kZWZhdWx0UGFyc2VyKSkgewogICAgICAgIHJldHVybiAkX19BdXRoX1lhZGlzX2RlZmF1bHRQYXJzZXI7CiAgICB9CiAgICAKICAgIGZvcmVhY2goQXV0aF9ZYWRpc19nZXRTdXBwb3J0ZWRFeHRlbnNpb25zKCkgYXMgJGV4dGVuc2lvbiA9PiAkY2xhc3NuYW1lKQogICAgewogICAgICBpZiAoZXh0ZW5zaW9uX2xvYWRlZCgkZXh0ZW5zaW9uKSkKICAgICAgewogICAgICAgICRwID0gbmV3ICRjbGFzc25hbWUoKTsKICAgICAgICBBdXRoX1lhZGlzX3NldERlZmF1bHRQYXJzZXIoJHApOwogICAgICAgIHJldHVybiAkcDsKICAgICAgfQogICAgfQogICAgCiAgICByZXR1cm4gZmFsc2U7Cn0KCgo=]]></data>
	</file>
	<file>
	  <filename>/openid-php-openid-782224d/Auth/Yadis/XRDS.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBUaGlzIG1vZHVsZSBjb250YWlucyB0aGUgWFJEUyBwYXJzaW5nIGNvZGUuCiAqCiAqIFBIUCB2ZXJzaW9ucyA0IGFuZCA1CiAqCiAqIExJQ0VOU0U6IFNlZSB0aGUgQ09QWUlORyBmaWxlIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uLgogKgogKiBAcGFja2FnZSBPcGVuSUQKICogQGF1dGhvciBKYW5SYWluLCBJbmMuIDxvcGVuaWRAamFucmFpbi5jb20+CiAqIEBjb3B5cmlnaHQgMjAwNS0yMDA4IEphbnJhaW4sIEluYy4KICogQGxpY2Vuc2UgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIEFwYWNoZQogKi8KCi8qKgogKiBSZXF1aXJlIHRoZSBYUGF0aCBpbXBsZW1lbnRhdGlvbi4KICovCnJlcXVpcmVfb25jZSAnQXV0aC9ZYWRpcy9YTUwucGhwJzsKCi8qKgogKiBUaGlzIG1hdGNoIG1vZGUgbWVhbnMgYSBnaXZlbiBzZXJ2aWNlIG11c3QgbWF0Y2ggQUxMIGZpbHRlcnMgcGFzc2VkCiAqIHRvIHRoZSBBdXRoX1lhZGlzX1hSRFM6OnNlcnZpY2VzKCkgY2FsbC4KICovCmRlZmluZSgnU0VSVklDRVNfWUFESVNfTUFUQ0hfQUxMJywgMTAxKTsKCi8qKgogKiBUaGlzIG1hdGNoIG1vZGUgbWVhbnMgYSBnaXZlbiBzZXJ2aWNlIG11c3QgbWF0Y2ggQU5ZIGZpbHRlcnMgKGF0CiAqIGxlYXN0IG9uZSkgcGFzc2VkIHRvIHRoZSBBdXRoX1lhZGlzX1hSRFM6OnNlcnZpY2VzKCkgY2FsbC4KICovCmRlZmluZSgnU0VSVklDRVNfWUFESVNfTUFUQ0hfQU5ZJywgMTAyKTsKCi8qKgogKiBUaGUgcHJpb3JpdHkgdmFsdWUgdXNlZCBmb3Igc2VydmljZSBlbGVtZW50cyB3aXRoIG5vIHByaW9yaXR5CiAqIHNwZWNpZmllZC4KICovCmRlZmluZSgnU0VSVklDRVNfWUFESVNfTUFYX1BSSU9SSVRZJywgcG93KDIsIDMwKSk7CgovKioKICogWFJEIFhNTCBuYW1lc3BhY2UKICovCmRlZmluZSgnQXV0aF9ZYWRpc19YTUxOU19YUkRfMl8wJywgJ3hyaTovLyR4cmQqKCR2KjIuMCknKTsKCi8qKgogKiBYUkRTIFhNTCBuYW1lc3BhY2UKICovCmRlZmluZSgnQXV0aF9ZYWRpc19YTUxOU19YUkRTJywgJ3hyaTovLyR4cmRzJyk7CgpmdW5jdGlvbiBBdXRoX1lhZGlzX2dldE5TTWFwKCkKewogICAgcmV0dXJuIGFycmF5KCd4cmRzJyA9PiBBdXRoX1lhZGlzX1hNTE5TX1hSRFMsCiAgICAgICAgICAgICAgICAgJ3hyZCcgPT4gQXV0aF9ZYWRpc19YTUxOU19YUkRfMl8wKTsKfQoKLyoqCiAqIEBhY2Nlc3MgcHJpdmF0ZQogKi8KZnVuY3Rpb24gQXV0aF9ZYWRpc19hcnJheV9zY3JhbWJsZSgkYXJyKQp7CiAgICAkcmVzdWx0ID0gYXJyYXkoKTsKCiAgICB3aGlsZSAoY291bnQoJGFycikpIHsKICAgICAgICAkaW5kZXggPSBhcnJheV9yYW5kKCRhcnIsIDEpOwogICAgICAgICRyZXN1bHRbXSA9ICRhcnJbJGluZGV4XTsKICAgICAgICB1bnNldCgkYXJyWyRpbmRleF0pOwogICAgfQoKICAgIHJldHVybiAkcmVzdWx0Owp9CgovKioKICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgPFNlcnZpY2U+IGVsZW1lbnQgaW4gYW4gWFJEUyBkb2N1bWVudC4KICogT2JqZWN0cyBvZiB0aGlzIHR5cGUgYXJlIHJldHVybmVkIGJ5CiAqIEF1dGhfWWFkaXNfWFJEUzo6c2VydmljZXMoKSBhbmQKICogQXV0aF9ZYWRpc19ZYWRpczo6c2VydmljZXMoKS4gIEVhY2ggb2JqZWN0IGNvcnJlc3BvbmRzIGRpcmVjdGx5CiAqIHRvIGEgPFNlcnZpY2U+IGVsZW1lbnQgaW4gdGhlIFhSRFMgYW5kIHN1cHBsaWVzIGEKICogZ2V0RWxlbWVudHMoJG5hbWUpIG1ldGhvZCB3aGljaCB5b3Ugc2hvdWxkIHVzZSB0byBpbnNwZWN0IHRoZQogKiBlbGVtZW50J3MgY29udGVudHMuICBTZWUge0BsaW5rIEF1dGhfWWFkaXNfWWFkaXN9IGZvciBtb3JlCiAqIGluZm9ybWF0aW9uIG9uIHRoZSByb2xlIHRoaXMgY2xhc3MgcGxheXMgaW4gWWFkaXMgZGlzY292ZXJ5LgogKgogKiBAcGFja2FnZSBPcGVuSUQKICovCmNsYXNzIEF1dGhfWWFkaXNfU2VydmljZSB7CgogICAgLyoqCiAgICAgKiBDcmVhdGVzIGFuIGVtcHR5IHNlcnZpY2Ugb2JqZWN0LgogICAgICovCiAgICBmdW5jdGlvbiBBdXRoX1lhZGlzX1NlcnZpY2UoKQogICAgewogICAgICAgICR0aGlzLT5lbGVtZW50ID0gbnVsbDsKICAgICAgICAkdGhpcy0+cGFyc2VyID0gbnVsbDsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybiB0aGUgVVJJcyBpbiB0aGUgIlR5cGUiIGVsZW1lbnRzLCBpZiBhbnksIG9mIHRoaXMgU2VydmljZQogICAgICogZWxlbWVudC4KICAgICAqCiAgICAgKiBAcmV0dXJuIGFycmF5ICR0eXBlX3VyaXMgQW4gYXJyYXkgb2YgVHlwZSBVUkkgc3RyaW5ncy4KICAgICAqLwogICAgZnVuY3Rpb24gZ2V0VHlwZXMoKQogICAgewogICAgICAgICR0ID0gYXJyYXkoKTsKICAgICAgICBmb3JlYWNoICgkdGhpcy0+Z2V0RWxlbWVudHMoJ3hyZDpUeXBlJykgYXMgJGVsZW0pIHsKICAgICAgICAgICAgJGMgPSAkdGhpcy0+cGFyc2VyLT5jb250ZW50KCRlbGVtKTsKICAgICAgICAgICAgaWYgKCRjKSB7CiAgICAgICAgICAgICAgICAkdFtdID0gJGM7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuICR0OwogICAgfQoKICAgIGZ1bmN0aW9uIG1hdGNoVHlwZXMoJHR5cGVfdXJpcykKICAgIHsKICAgICAgICAkcmVzdWx0ID0gYXJyYXkoKTsKCiAgICAgICAgZm9yZWFjaCAoJHRoaXMtPmdldFR5cGVzKCkgYXMgJHR5cCkgewogICAgICAgICAgICBpZiAoaW5fYXJyYXkoJHR5cCwgJHR5cGVfdXJpcykpIHsKICAgICAgICAgICAgICAgICRyZXN1bHRbXSA9ICR0eXA7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiAkcmVzdWx0OwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJuIHRoZSBVUklzIGluIHRoZSAiVVJJIiBlbGVtZW50cywgaWYgYW55LCBvZiB0aGlzIFNlcnZpY2UKICAgICAqIGVsZW1lbnQuICBUaGUgVVJJcyBhcmUgcmV0dXJuZWQgc29ydGVkIGluIHByaW9yaXR5IG9yZGVyLgogICAgICoKICAgICAqIEByZXR1cm4gYXJyYXkgJHVyaXMgQW4gYXJyYXkgb2YgVVJJIHN0cmluZ3MuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldFVSSXMoKQogICAgewogICAgICAgICR1cmlzID0gYXJyYXkoKTsKICAgICAgICAkbGFzdCA9IGFycmF5KCk7CgogICAgICAgIGZvcmVhY2ggKCR0aGlzLT5nZXRFbGVtZW50cygneHJkOlVSSScpIGFzICRlbGVtKSB7CiAgICAgICAgICAgICR1cmlfc3RyaW5nID0gJHRoaXMtPnBhcnNlci0+Y29udGVudCgkZWxlbSk7CiAgICAgICAgICAgICRhdHRycyA9ICR0aGlzLT5wYXJzZXItPmF0dHJpYnV0ZXMoJGVsZW0pOwogICAgICAgICAgICBpZiAoJGF0dHJzICYmCiAgICAgICAgICAgICAgICBhcnJheV9rZXlfZXhpc3RzKCdwcmlvcml0eScsICRhdHRycykpIHsKICAgICAgICAgICAgICAgICRwcmlvcml0eSA9IGludHZhbCgkYXR0cnNbJ3ByaW9yaXR5J10pOwogICAgICAgICAgICAgICAgaWYgKCFhcnJheV9rZXlfZXhpc3RzKCRwcmlvcml0eSwgJHVyaXMpKSB7CiAgICAgICAgICAgICAgICAgICAgJHVyaXNbJHByaW9yaXR5XSA9IGFycmF5KCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJHVyaXNbJHByaW9yaXR5XVtdID0gJHVyaV9zdHJpbmc7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkbGFzdFtdID0gJHVyaV9zdHJpbmc7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICRrZXlzID0gYXJyYXlfa2V5cygkdXJpcyk7CiAgICAgICAgc29ydCgka2V5cyk7CgogICAgICAgIC8vIFJlYnVpbGQgYXJyYXkgb2YgVVJJcy4KICAgICAgICAkcmVzdWx0ID0gYXJyYXkoKTsKICAgICAgICBmb3JlYWNoICgka2V5cyBhcyAkaykgewogICAgICAgICAgICAkbmV3X3VyaXMgPSBBdXRoX1lhZGlzX2FycmF5X3NjcmFtYmxlKCR1cmlzWyRrXSk7CiAgICAgICAgICAgICRyZXN1bHQgPSBhcnJheV9tZXJnZSgkcmVzdWx0LCAkbmV3X3VyaXMpOwogICAgICAgIH0KCiAgICAgICAgJHJlc3VsdCA9IGFycmF5X21lcmdlKCRyZXN1bHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1dGhfWWFkaXNfYXJyYXlfc2NyYW1ibGUoJGxhc3QpKTsKCiAgICAgICAgcmV0dXJuICRyZXN1bHQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSAicHJpb3JpdHkiIGF0dHJpYnV0ZSB2YWx1ZSBvZiB0aGlzIDxTZXJ2aWNlPgogICAgICogZWxlbWVudCwgaWYgdGhlIGF0dHJpYnV0ZSBpcyBwcmVzZW50LiAgUmV0dXJucyBudWxsIGlmIG5vdC4KICAgICAqCiAgICAgKiBAcmV0dXJuIG1peGVkICRyZXN1bHQgTnVsbCBvciBpbnRlZ2VyLCBkZXBlbmRpbmcgb24gd2hldGhlcgogICAgICogdGhpcyBTZXJ2aWNlIGVsZW1lbnQgaGFzIGEgJ3ByaW9yaXR5JyBhdHRyaWJ1dGUuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldFByaW9yaXR5KCkKICAgIHsKICAgICAgICAkYXR0cmlidXRlcyA9ICR0aGlzLT5wYXJzZXItPmF0dHJpYnV0ZXMoJHRoaXMtPmVsZW1lbnQpOwoKICAgICAgICBpZiAoYXJyYXlfa2V5X2V4aXN0cygncHJpb3JpdHknLCAkYXR0cmlidXRlcykpIHsKICAgICAgICAgICAgcmV0dXJuIGludHZhbCgkYXR0cmlidXRlc1sncHJpb3JpdHknXSk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KCiAgICAvKioKICAgICAqIFVzZWQgdG8gZ2V0IFhNTCBlbGVtZW50cyBmcm9tIHRoaXMgb2JqZWN0J3MgPFNlcnZpY2U+IGVsZW1lbnQuCiAgICAgKgogICAgICogVGhpcyBpcyB3aGF0IHlvdSBzaG91bGQgdXNlIHRvIGdldCBhbGwgY3VzdG9tIGluZm9ybWF0aW9uIG91dAogICAgICogb2YgdGhpcyBlbGVtZW50LiBUaGlzIGlzIHVzZWQgYnkgc2VydmljZSBmaWx0ZXIgZnVuY3Rpb25zIHRvCiAgICAgKiBkZXRlcm1pbmUgd2hldGhlciBhIHNlcnZpY2UgZWxlbWVudCBjb250YWlucyBzcGVjaWZpYyB0YWdzLAogICAgICogZXRjLiAgTk9URTogdGhpcyBvbmx5IGNvbnNpZGVycyBlbGVtZW50cyB3aGljaCBhcmUgZGlyZWN0CiAgICAgKiBjaGlsZHJlbiBvZiB0aGUgPFNlcnZpY2U+IGVsZW1lbnQgZm9yIHRoaXMgb2JqZWN0LgogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgJG5hbWUgVGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQgdG8gbG9vayBmb3IKICAgICAqIEByZXR1cm4gYXJyYXkgJGxpc3QgQW4gYXJyYXkgb2YgZWxlbWVudHMgd2l0aCB0aGUgc3BlY2lmaWVkCiAgICAgKiBuYW1lIHdoaWNoIGFyZSBkaXJlY3QgY2hpbGRyZW4gb2YgdGhlIDxTZXJ2aWNlPiBlbGVtZW50LiAgVGhlCiAgICAgKiBub2RlcyByZXR1cm5lZCBieSB0aGlzIGZ1bmN0aW9uIGNhbiBiZSBwYXNzZWQgdG8gJHRoaXMtPnBhcnNlcgogICAgICogbWV0aG9kcyAoc2VlIHtAbGluayBBdXRoX1lhZGlzX1hNTFBhcnNlcn0pLgogICAgICovCiAgICBmdW5jdGlvbiBnZXRFbGVtZW50cygkbmFtZSkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnBhcnNlci0+ZXZhbFhQYXRoKCRuYW1lLCAkdGhpcy0+ZWxlbWVudCk7CiAgICB9Cn0KCi8qCiAqIFJldHVybiB0aGUgZXhwaXJhdGlvbiBkYXRlIG9mIHRoaXMgWFJEIGVsZW1lbnQsIG9yIE5vbmUgaWYgbm8KICogZXhwaXJhdGlvbiB3YXMgc3BlY2lmaWVkLgogKgogKiBAcGFyYW0gJGRlZmF1bHQgVGhlIHZhbHVlIHRvIHVzZSBhcyB0aGUgZXhwaXJhdGlvbiBpZiBubyBleHBpcmF0aW9uCiAqIHdhcyBzcGVjaWZpZWQgaW4gdGhlIFhSRC4KICovCmZ1bmN0aW9uIEF1dGhfWWFkaXNfZ2V0WFJERXhwaXJhdGlvbigkeHJkX2VsZW1lbnQsICRkZWZhdWx0PW51bGwpCnsKICAgICRleHBpcmVzX2VsZW1lbnQgPSAkeHJkX2VsZW1lbnQtPiRwYXJzZXItPmV2YWxYUGF0aCgnL3hyZDpFeHBpcmVzJyk7CiAgICBpZiAoJGV4cGlyZXNfZWxlbWVudCA9PT0gbnVsbCkgewogICAgICAgIHJldHVybiAkZGVmYXVsdDsKICAgIH0gZWxzZSB7CiAgICAgICAgJGV4cGlyZXNfc3RyaW5nID0gJGV4cGlyZXNfZWxlbWVudC0+dGV4dDsKCiAgICAgICAgLy8gV2lsbCByYWlzZSBWYWx1ZUVycm9yIGlmIHRoZSBzdHJpbmcgaXMgbm90IHRoZSBleHBlY3RlZAogICAgICAgIC8vIGZvcm1hdAogICAgICAgICR0ID0gc3RycHRpbWUoJGV4cGlyZXNfc3RyaW5nLCAiJVktJW0tJWRUJUg6JU06JVNaIik7CgogICAgICAgIGlmICgkdCA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgLy8gW2ludCAkaG91ciBbLCBpbnQgJG1pbnV0ZSBbLCBpbnQgJHNlY29uZCBbLAogICAgICAgIC8vICBpbnQgJG1vbnRoIFssIGludCAkZGF5IFssIGludCAkeWVhciBdXV1dXV0KICAgICAgICByZXR1cm4gbWt0aW1lKCR0Wyd0bV9ob3VyJ10sICR0Wyd0bV9taW4nXSwgJHRbJ3RtX3NlYyddLAogICAgICAgICAgICAgICAgICAgICAgJHRbJ3RtX21vbiddLCAkdFsndG1fZGF5J10sICR0Wyd0bV95ZWFyJ10pOwogICAgfQp9CgovKioKICogVGhpcyBjbGFzcyBwZXJmb3JtcyBwYXJzaW5nIG9mIFhSRFMgZG9jdW1lbnRzLgogKgogKiBZb3Ugc2hvdWxkIG5vdCBpbnN0YW50aWF0ZSB0aGlzIGNsYXNzIGRpcmVjdGx5OyByYXRoZXIsIGNhbGwKICogcGFyc2VYUkRTIHN0YXRpY2FsbHk6CiAqCiAqIDxwcmU+ICAkeHJkcyA9IEF1dGhfWWFkaXNfWFJEUzo6cGFyc2VYUkRTKCR4bWxfc3RyaW5nKTs8L3ByZT4KICoKICogSWYgdGhlIFhSRFMgY2FuIGJlIHBhcnNlZCBhbmQgaXMgdmFsaWQsIGFuIGluc3RhbmNlIG9mCiAqIEF1dGhfWWFkaXNfWFJEUyB3aWxsIGJlIHJldHVybmVkLiAgT3RoZXJ3aXNlLCBudWxsIHdpbGwgYmUKICogcmV0dXJuZWQuICBUaGlzIGNsYXNzIGlzIHVzZWQgYnkgdGhlIEF1dGhfWWFkaXNfWWFkaXM6OmRpc2NvdmVyCiAqIG1ldGhvZC4KICoKICogQHBhY2thZ2UgT3BlbklECiAqLwpjbGFzcyBBdXRoX1lhZGlzX1hSRFMgewoKICAgIC8qKgogICAgICogSW5zdGFudGlhdGUgYSBBdXRoX1lhZGlzX1hSRFMgb2JqZWN0LiAgUmVxdWlyZXMgYW4gWFBhdGgKICAgICAqIGluc3RhbmNlIHdoaWNoIGhhcyBiZWVuIHVzZWQgdG8gcGFyc2UgYSB2YWxpZCBYUkRTIGRvY3VtZW50LgogICAgICovCiAgICBmdW5jdGlvbiBBdXRoX1lhZGlzX1hSRFMoJHhtbFBhcnNlciwgJHhyZE5vZGVzKQogICAgewogICAgICAgICR0aGlzLT5wYXJzZXIgPSAkeG1sUGFyc2VyOwogICAgICAgICR0aGlzLT54cmROb2RlID0gJHhyZE5vZGVzW2NvdW50KCR4cmROb2RlcykgLSAxXTsKICAgICAgICAkdGhpcy0+YWxsWHJkTm9kZXMgPSAkeHJkTm9kZXM7CiAgICAgICAgJHRoaXMtPnNlcnZpY2VMaXN0ID0gYXJyYXkoKTsKICAgICAgICAkdGhpcy0+X3BhcnNlKCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBQYXJzZSBhbiBYTUwgc3RyaW5nIChYUkRTIGRvY3VtZW50KSBhbmQgcmV0dXJuIGVpdGhlciBhCiAgICAgKiBBdXRoX1lhZGlzX1hSRFMgb2JqZWN0IG9yIG51bGwsIGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZQogICAgICogWFJEUyBYTUwgaXMgdmFsaWQuCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkeG1sX3N0cmluZyBBbiBYUkRTIFhNTCBzdHJpbmcuCiAgICAgKiBAcmV0dXJuIG1peGVkICR4cmRzIEFuIGluc3RhbmNlIG9mIEF1dGhfWWFkaXNfWFJEUyBvciBudWxsLAogICAgICogZGVwZW5kaW5nIG9uIHRoZSB2YWxpZGl0eSBvZiAkeG1sX3N0cmluZwogICAgICovCiAgICBzdGF0aWMgZnVuY3Rpb24gcGFyc2VYUkRTKCR4bWxfc3RyaW5nLCAkZXh0cmFfbnNfbWFwID0gbnVsbCkKICAgIHsKICAgICAgICAkX251bGwgPSBudWxsOwoKICAgICAgICBpZiAoISR4bWxfc3RyaW5nKSB7CiAgICAgICAgICAgIHJldHVybiAkX251bGw7CiAgICAgICAgfQoKICAgICAgICAkcGFyc2VyID0gQXV0aF9ZYWRpc19nZXRYTUxQYXJzZXIoKTsKCiAgICAgICAgJG5zX21hcCA9IEF1dGhfWWFkaXNfZ2V0TlNNYXAoKTsKCiAgICAgICAgaWYgKCRleHRyYV9uc19tYXAgJiYgaXNfYXJyYXkoJGV4dHJhX25zX21hcCkpIHsKICAgICAgICAgICAgJG5zX21hcCA9IGFycmF5X21lcmdlKCRuc19tYXAsICRleHRyYV9uc19tYXApOwogICAgICAgIH0KCiAgICAgICAgaWYgKCEoJHBhcnNlciAmJiAkcGFyc2VyLT5pbml0KCR4bWxfc3RyaW5nLCAkbnNfbWFwKSkpIHsKICAgICAgICAgICAgcmV0dXJuICRfbnVsbDsKICAgICAgICB9CgogICAgICAgIC8vIFRyeSB0byBnZXQgcm9vdCBlbGVtZW50LgogICAgICAgICRyb290ID0gJHBhcnNlci0+ZXZhbFhQYXRoKCcveHJkczpYUkRTWzFdJyk7CiAgICAgICAgaWYgKCEkcm9vdCkgewogICAgICAgICAgICByZXR1cm4gJF9udWxsOwogICAgICAgIH0KCiAgICAgICAgaWYgKGlzX2FycmF5KCRyb290KSkgewogICAgICAgICAgICAkcm9vdCA9ICRyb290WzBdOwogICAgICAgIH0KCiAgICAgICAgJGF0dHJzID0gJHBhcnNlci0+YXR0cmlidXRlcygkcm9vdCk7CgogICAgICAgIGlmIChhcnJheV9rZXlfZXhpc3RzKCd4bWxuczp4cmQnLCAkYXR0cnMpICYmCiAgICAgICAgICAgICRhdHRyc1sneG1sbnM6eHJkJ10gIT0gQXV0aF9ZYWRpc19YTUxOU19YUkRTKSB7CiAgICAgICAgICAgIHJldHVybiAkX251bGw7CiAgICAgICAgfSBlbHNlIGlmIChhcnJheV9rZXlfZXhpc3RzKCd4bWxucycsICRhdHRycykgJiYKICAgICAgICAgICAgICAgICAgIHByZWdfbWF0Y2goJy94cmkvJywgJGF0dHJzWyd4bWxucyddKSAmJgogICAgICAgICAgICAgICAgICAgJGF0dHJzWyd4bWxucyddICE9IEF1dGhfWWFkaXNfWE1MTlNfWFJEXzJfMCkgewogICAgICAgICAgICByZXR1cm4gJF9udWxsOwogICAgICAgIH0KCiAgICAgICAgLy8gR2V0IHRoZSBsYXN0IFhSRCBub2RlLgogICAgICAgICR4cmRfbm9kZXMgPSAkcGFyc2VyLT5ldmFsWFBhdGgoJy94cmRzOlhSRFNbMV0veHJkOlhSRCcpOwoKICAgICAgICBpZiAoISR4cmRfbm9kZXMpIHsKICAgICAgICAgICAgcmV0dXJuICRfbnVsbDsKICAgICAgICB9CgogICAgICAgICR4cmRzID0gbmV3IEF1dGhfWWFkaXNfWFJEUygkcGFyc2VyLCAkeHJkX25vZGVzKTsKICAgICAgICByZXR1cm4gJHhyZHM7CiAgICB9CgogICAgLyoqCiAgICAgKiBAYWNjZXNzIHByaXZhdGUKICAgICAqLwogICAgZnVuY3Rpb24gX2FkZFNlcnZpY2UoJHByaW9yaXR5LCAkc2VydmljZSkKICAgIHsKICAgICAgICAkcHJpb3JpdHkgPSBpbnR2YWwoJHByaW9yaXR5KTsKCiAgICAgICAgaWYgKCFhcnJheV9rZXlfZXhpc3RzKCRwcmlvcml0eSwgJHRoaXMtPnNlcnZpY2VMaXN0KSkgewogICAgICAgICAgICAkdGhpcy0+c2VydmljZUxpc3RbJHByaW9yaXR5XSA9IGFycmF5KCk7CiAgICAgICAgfQoKICAgICAgICAkdGhpcy0+c2VydmljZUxpc3RbJHByaW9yaXR5XVtdID0gJHNlcnZpY2U7CiAgICB9CgogICAgLyoqCiAgICAgKiBDcmVhdGVzIHRoZSBzZXJ2aWNlIGxpc3QgdXNpbmcgbm9kZXMgZnJvbSB0aGUgWFJEUyBYTUwKICAgICAqIGRvY3VtZW50LgogICAgICoKICAgICAqIEBhY2Nlc3MgcHJpdmF0ZQogICAgICovCiAgICBmdW5jdGlvbiBfcGFyc2UoKQogICAgewogICAgICAgICR0aGlzLT5zZXJ2aWNlTGlzdCA9IGFycmF5KCk7CgogICAgICAgICRzZXJ2aWNlcyA9ICR0aGlzLT5wYXJzZXItPmV2YWxYUGF0aCgneHJkOlNlcnZpY2UnLCAkdGhpcy0+eHJkTm9kZSk7CgogICAgICAgIGZvcmVhY2ggKCRzZXJ2aWNlcyBhcyAkbm9kZSkgewogICAgICAgICAgICAkcyA9IG5ldyBBdXRoX1lhZGlzX1NlcnZpY2UoKTsKICAgICAgICAgICAgJHMtPmVsZW1lbnQgPSAkbm9kZTsKICAgICAgICAgICAgJHMtPnBhcnNlciA9ICR0aGlzLT5wYXJzZXI7CgogICAgICAgICAgICAkcHJpb3JpdHkgPSAkcy0+Z2V0UHJpb3JpdHkoKTsKCiAgICAgICAgICAgIGlmICgkcHJpb3JpdHkgPT09IG51bGwpIHsKICAgICAgICAgICAgICAgICRwcmlvcml0eSA9IFNFUlZJQ0VTX1lBRElTX01BWF9QUklPUklUWTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHRoaXMtPl9hZGRTZXJ2aWNlKCRwcmlvcml0eSwgJHMpOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgYSBsaXN0IG9mIHNlcnZpY2Ugb2JqZWN0cyB3aGljaCBjb3JyZXNwb25kIHRvIDxTZXJ2aWNlPgogICAgICogZWxlbWVudHMgaW4gdGhlIFhSRFMgWE1MIGRvY3VtZW50IGZvciB0aGlzIG9iamVjdC4KICAgICAqCiAgICAgKiBPcHRpb25hbGx5LCBhbiBhcnJheSBvZiBmaWx0ZXIgY2FsbGJhY2tzIG1heSBiZSBnaXZlbiB0byBsaW1pdAogICAgICogdGhlIGxpc3Qgb2YgcmV0dXJuZWQgc2VydmljZSBvYmplY3RzLiAgRnVydGhlcm1vcmUsIHRoZSBkZWZhdWx0CiAgICAgKiBtb2RlIGlzIHRvIHJldHVybiBhbGwgc2VydmljZSBvYmplY3RzIHdoaWNoIG1hdGNoIEFOWSBvZiB0aGUKICAgICAqIHNwZWNpZmllZCBmaWx0ZXJzLCBidXQgJGZpbHRlcl9tb2RlIG1heSBiZQogICAgICogU0VSVklDRVNfWUFESVNfTUFUQ0hfQUxMIGlmIHlvdSB3YW50IHRvIGJlIHN1cmUgdGhhdCB0aGUKICAgICAqIHJldHVybmVkIHNlcnZpY2VzIG1hdGNoIGFsbCB0aGUgZ2l2ZW4gZmlsdGVycy4gIFNlZSB7QGxpbmsKICAgICAqIEF1dGhfWWFkaXNfWWFkaXN9IGZvciBkZXRhaWxlZCB1c2FnZSBpbmZvcm1hdGlvbiBvbiBmaWx0ZXIKICAgICAqIGZ1bmN0aW9ucy4KICAgICAqCiAgICAgKiBAcGFyYW0gbWl4ZWQgJGZpbHRlcnMgQW4gYXJyYXkgb2YgY2FsbGJhY2tzIHRvIGZpbHRlciB0aGUKICAgICAqIHJldHVybmVkIHNlcnZpY2VzLCBvciBudWxsIGlmIGFsbCBzZXJ2aWNlcyBhcmUgdG8gYmUgcmV0dXJuZWQuCiAgICAgKiBAcGFyYW0gaW50ZWdlciAkZmlsdGVyX21vZGUgU0VSVklDRVNfWUFESVNfTUFUQ0hfQUxMIG9yCiAgICAgKiBTRVJWSUNFU19ZQURJU19NQVRDSF9BTlksIGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZSByZXR1cm5lZAogICAgICogc2VydmljZXMgc2hvdWxkIG1hdGNoIEFMTCBvciBBTlkgb2YgdGhlIHNwZWNpZmllZCBmaWx0ZXJzLAogICAgICogcmVzcGVjdGl2ZWx5LgogICAgICogQHJldHVybiBtaXhlZCAkc2VydmljZXMgQW4gYXJyYXkgb2Yge0BsaW5rCiAgICAgKiBBdXRoX1lhZGlzX1NlcnZpY2V9IG9iamVjdHMgaWYgJGZpbHRlcl9tb2RlIGlzIGEgdmFsaWQKICAgICAqIG1vZGU7IG51bGwgaWYgJGZpbHRlcl9tb2RlIGlzIGFuIGludmFsaWQgbW9kZSAoaS5lLiwgbm90CiAgICAgKiBTRVJWSUNFU19ZQURJU19NQVRDSF9BTlkgb3IgU0VSVklDRVNfWUFESVNfTUFUQ0hfQUxMKS4KICAgICAqLwogICAgZnVuY3Rpb24gc2VydmljZXMoJGZpbHRlcnMgPSBudWxsLAogICAgICAgICAgICAgICAgICAgICAgJGZpbHRlcl9tb2RlID0gU0VSVklDRVNfWUFESVNfTUFUQ0hfQU5ZKQogICAgewoKICAgICAgICAkcHJpX2tleXMgPSBhcnJheV9rZXlzKCR0aGlzLT5zZXJ2aWNlTGlzdCk7CiAgICAgICAgc29ydCgkcHJpX2tleXMsIFNPUlRfTlVNRVJJQyk7CgogICAgICAgIC8vIElmIG5vIGZpbHRlcnMgYXJlIHNwZWNpZmllZCwgcmV0dXJuIHRoZSBlbnRpcmUgc2VydmljZQogICAgICAgIC8vIGxpc3QsIG9yZGVyZWQgYnkgcHJpb3JpdHkuCiAgICAgICAgaWYgKCEkZmlsdGVycyB8fAogICAgICAgICAgICAoIWlzX2FycmF5KCRmaWx0ZXJzKSkpIHsKCiAgICAgICAgICAgICRyZXN1bHQgPSBhcnJheSgpOwogICAgICAgICAgICBmb3JlYWNoICgkcHJpX2tleXMgYXMgJHByaSkgewogICAgICAgICAgICAgICAgJHJlc3VsdCA9IGFycmF5X21lcmdlKCRyZXN1bHQsICR0aGlzLT5zZXJ2aWNlTGlzdFskcHJpXSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiAkcmVzdWx0OwogICAgICAgIH0KCiAgICAgICAgLy8gSWYgYSBiYWQgZmlsdGVyIG1vZGUgaXMgc3BlY2lmaWVkLCByZXR1cm4gbnVsbC4KICAgICAgICBpZiAoIWluX2FycmF5KCRmaWx0ZXJfbW9kZSwgYXJyYXkoU0VSVklDRVNfWUFESVNfTUFUQ0hfQU5ZLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRVJWSUNFU19ZQURJU19NQVRDSF9BTEwpKSkgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CgogICAgICAgIC8vIE90aGVyd2lzZSwgdXNlIHRoZSBjYWxsYmFja3MgaW4gdGhlIGZpbHRlciBsaXN0IHRvCiAgICAgICAgLy8gZGV0ZXJtaW5lIHdoaWNoIHNlcnZpY2VzIGFyZSByZXR1cm5lZC4KICAgICAgICAkZmlsdGVyZWQgPSBhcnJheSgpOwoKICAgICAgICBmb3JlYWNoICgkcHJpX2tleXMgYXMgJHByaW9yaXR5X3ZhbHVlKSB7CiAgICAgICAgICAgICRzZXJ2aWNlX29ial9saXN0ID0gJHRoaXMtPnNlcnZpY2VMaXN0WyRwcmlvcml0eV92YWx1ZV07CgogICAgICAgICAgICBmb3JlYWNoICgkc2VydmljZV9vYmpfbGlzdCBhcyAkc2VydmljZSkgewoKICAgICAgICAgICAgICAgICRtYXRjaGVzID0gMDsKCiAgICAgICAgICAgICAgICBmb3JlYWNoICgkZmlsdGVycyBhcyAkZmlsdGVyKSB7CgogICAgICAgICAgICAgICAgICAgIGlmIChjYWxsX3VzZXJfZnVuY19hcnJheSgkZmlsdGVyLCBhcnJheSgmJHNlcnZpY2UpKSkgewogICAgICAgICAgICAgICAgICAgICAgICAkbWF0Y2hlcysrOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRmaWx0ZXJfbW9kZSA9PSBTRVJWSUNFU19ZQURJU19NQVRDSF9BTlkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRwcmkgPSAkc2VydmljZS0+Z2V0UHJpb3JpdHkoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkcHJpID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHByaSA9IFNFUlZJQ0VTX1lBRElTX01BWF9QUklPUklUWTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWFycmF5X2tleV9leGlzdHMoJHByaSwgJGZpbHRlcmVkKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRmaWx0ZXJlZFskcHJpXSA9IGFycmF5KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGZpbHRlcmVkWyRwcmldW10gPSAkc2VydmljZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICgoJGZpbHRlcl9tb2RlID09IFNFUlZJQ0VTX1lBRElTX01BVENIX0FMTCkgJiYKICAgICAgICAgICAgICAgICAgICAoJG1hdGNoZXMgPT0gY291bnQoJGZpbHRlcnMpKSkgewoKICAgICAgICAgICAgICAgICAgICAkcHJpID0gJHNlcnZpY2UtPmdldFByaW9yaXR5KCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCRwcmkgPT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJHByaSA9IFNFUlZJQ0VTX1lBRElTX01BWF9QUklPUklUWTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGlmICghYXJyYXlfa2V5X2V4aXN0cygkcHJpLCAkZmlsdGVyZWQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRmaWx0ZXJlZFskcHJpXSA9IGFycmF5KCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICRmaWx0ZXJlZFskcHJpXVtdID0gJHNlcnZpY2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICRwcmlfa2V5cyA9IGFycmF5X2tleXMoJGZpbHRlcmVkKTsKICAgICAgICBzb3J0KCRwcmlfa2V5cywgU09SVF9OVU1FUklDKTsKCiAgICAgICAgJHJlc3VsdCA9IGFycmF5KCk7CiAgICAgICAgZm9yZWFjaCAoJHByaV9rZXlzIGFzICRwcmkpIHsKICAgICAgICAgICAgJHJlc3VsdCA9IGFycmF5X21lcmdlKCRyZXN1bHQsICRmaWx0ZXJlZFskcHJpXSk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJHJlc3VsdDsKICAgIH0KfQoK]]></data>
	</file>
	<file>
	  <filename>/openid-php-openid-782224d/Auth/Yadis/XRI.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBSb3V0aW5lcyBmb3IgWFJJIHJlc29sdXRpb24uCiAqCiAqIEBwYWNrYWdlIE9wZW5JRAogKiBAYXV0aG9yIEphblJhaW4sIEluYy4gPG9wZW5pZEBqYW5yYWluLmNvbT4KICogQGNvcHlyaWdodCAyMDA1LTIwMDggSmFucmFpbiwgSW5jLgogKiBAbGljZW5zZSBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgQXBhY2hlCiAqLwoKcmVxdWlyZV9vbmNlICdBdXRoL1lhZGlzL01pc2MucGhwJzsKcmVxdWlyZV9vbmNlICdBdXRoL1lhZGlzL1lhZGlzLnBocCc7CnJlcXVpcmVfb25jZSAnQXV0aC9PcGVuSUQucGhwJzsKCmZ1bmN0aW9uIEF1dGhfWWFkaXNfZ2V0RGVmYXVsdFByb3h5KCkKewogICAgcmV0dXJuICdodHRwOi8veHJpLm5ldC8nOwp9CgpmdW5jdGlvbiBBdXRoX1lhZGlzX2dldFhSSUF1dGhvcml0aWVzKCkKewogICAgcmV0dXJuIGFycmF5KCchJywgJz0nLCAnQCcsICcrJywgJyQnLCAnKCcpOwp9CgpmdW5jdGlvbiBBdXRoX1lhZGlzX2dldEVzY2FwZVJFKCkKewogICAgJHBhcnRzID0gYXJyYXkoKTsKICAgIGZvcmVhY2ggKGFycmF5X21lcmdlKEF1dGhfWWFkaXNfZ2V0VUNTQ2hhcnMoKSwKICAgICAgICAgICAgICAgICAgICAgICAgIEF1dGhfWWFkaXNfZ2V0SVByaXZhdGVDaGFycygpKSBhcyAkcGFpcikgewogICAgICAgIGxpc3QoJG0sICRuKSA9ICRwYWlyOwogICAgICAgICRwYXJ0c1tdID0gc3ByaW50ZigiJXMtJXMiLCBjaHIoJG0pLCBjaHIoJG4pKTsKICAgIH0KCiAgICByZXR1cm4gc3ByaW50ZignL1slc10vJywgaW1wbG9kZSgnJywgJHBhcnRzKSk7Cn0KCmZ1bmN0aW9uIEF1dGhfWWFkaXNfZ2V0WHJlZlJFKCkKewogICAgcmV0dXJuICcvXCgoLio/KVwpLyc7Cn0KCmZ1bmN0aW9uIEF1dGhfWWFkaXNfaWRlbnRpZmllclNjaGVtZSgkaWRlbnRpZmllcikKewogICAgaWYgKEF1dGhfWWFkaXNfc3RhcnRzd2l0aCgkaWRlbnRpZmllciwgJ3hyaTovLycpIHx8CiAgICAgICAgKCRpZGVudGlmaWVyICYmCiAgICAgICAgICBpbl9hcnJheSgkaWRlbnRpZmllclswXSwgQXV0aF9ZYWRpc19nZXRYUklBdXRob3JpdGllcygpKSkpIHsKICAgICAgICByZXR1cm4gIlhSSSI7CiAgICB9IGVsc2UgewogICAgICAgIHJldHVybiAiVVJJIjsKICAgIH0KfQoKZnVuY3Rpb24gQXV0aF9ZYWRpc190b0lSSU5vcm1hbCgkeHJpKQp7CiAgICBpZiAoIUF1dGhfWWFkaXNfc3RhcnRzd2l0aCgkeHJpLCAneHJpOi8vJykpIHsKICAgICAgICAkeHJpID0gJ3hyaTovLycgLiAkeHJpOwogICAgfQoKICAgIHJldHVybiBBdXRoX1lhZGlzX2VzY2FwZUZvcklSSSgkeHJpKTsKfQoKZnVuY3Rpb24gX2VzY2FwZV94cmVmKCR4cmVmX21hdGNoKQp7CiAgICAkeHJlZiA9ICR4cmVmX21hdGNoWzBdOwogICAgJHhyZWYgPSBzdHJfcmVwbGFjZSgnLycsICclMkYnLCAkeHJlZik7CiAgICAkeHJlZiA9IHN0cl9yZXBsYWNlKCc/JywgJyUzRicsICR4cmVmKTsKICAgICR4cmVmID0gc3RyX3JlcGxhY2UoJyMnLCAnJTIzJywgJHhyZWYpOwogICAgcmV0dXJuICR4cmVmOwp9CgpmdW5jdGlvbiBBdXRoX1lhZGlzX2VzY2FwZUZvcklSSSgkeHJpKQp7CiAgICAkeHJpID0gc3RyX3JlcGxhY2UoJyUnLCAnJTI1JywgJHhyaSk7CiAgICAkeHJpID0gcHJlZ19yZXBsYWNlX2NhbGxiYWNrKEF1dGhfWWFkaXNfZ2V0WHJlZlJFKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdfZXNjYXBlX3hyZWYnLCAkeHJpKTsKICAgIHJldHVybiAkeHJpOwp9CgpmdW5jdGlvbiBBdXRoX1lhZGlzX3RvVVJJTm9ybWFsKCR4cmkpCnsKICAgIHJldHVybiBBdXRoX1lhZGlzX2lyaVRvVVJJKEF1dGhfWWFkaXNfdG9JUklOb3JtYWwoJHhyaSkpOwp9CgpmdW5jdGlvbiBBdXRoX1lhZGlzX2lyaVRvVVJJKCRpcmkpCnsKICAgIGlmICgxKSB7CiAgICAgICAgcmV0dXJuICRpcmk7CiAgICB9IGVsc2UgewogICAgICAgIC8vIEFjY29yZGluZyB0byBSRkMgMzk4Nywgc2VjdGlvbiAzLjEsICJNYXBwaW5nIG9mIElSSXMgdG8gVVJJcyIKICAgICAgICByZXR1cm4gcHJlZ19yZXBsYWNlX2NhbGxiYWNrKEF1dGhfWWFkaXNfZ2V0RXNjYXBlUkUoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdBdXRoX1lhZGlzX3BjdF9lc2NhcGVfdW5pY29kZScsICRpcmkpOwogICAgfQp9CgoKZnVuY3Rpb24gQXV0aF9ZYWRpc19YUklBcHBlbmRBcmdzKCR1cmwsICRhcmdzKQp7CiAgICAvLyBBcHBlbmQgc29tZSBhcmd1bWVudHMgdG8gYW4gSFRUUCBxdWVyeS4gIFllcywgdGhpcyBpcyBqdXN0IGxpa2UKICAgIC8vIE9wZW5JRCdzIGFwcGVuZEFyZ3MsIGJ1dCB3aXRoIHNwZWNpYWwgc2Vhc29uaW5nIGZvciBYUkkKICAgIC8vIHF1ZXJpZXMuCgogICAgaWYgKGNvdW50KCRhcmdzKSA9PSAwKSB7CiAgICAgICAgcmV0dXJuICR1cmw7CiAgICB9CgogICAgLy8gTm9uLWVtcHR5IGFycmF5OyBpZiBpdCBpcyBhbiBhcnJheSBvZiBhcnJheXMsIHVzZSBtdWx0aXNvcnQ7CiAgICAvLyBvdGhlcndpc2UgdXNlIHNvcnQuCiAgICBpZiAoYXJyYXlfa2V5X2V4aXN0cygwLCAkYXJncykgJiYKICAgICAgICBpc19hcnJheSgkYXJnc1swXSkpIHsKICAgICAgICAvLyBEbyBub3RoaW5nIGhlcmUuCiAgICB9IGVsc2UgewogICAgICAgICRrZXlzID0gYXJyYXlfa2V5cygkYXJncyk7CiAgICAgICAgc29ydCgka2V5cyk7CiAgICAgICAgJG5ld19hcmdzID0gYXJyYXkoKTsKICAgICAgICBmb3JlYWNoICgka2V5cyBhcyAka2V5KSB7CiAgICAgICAgICAgICRuZXdfYXJnc1tdID0gYXJyYXkoJGtleSwgJGFyZ3NbJGtleV0pOwogICAgICAgIH0KICAgICAgICAkYXJncyA9ICRuZXdfYXJnczsKICAgIH0KCiAgICAvLyBBY2NvcmRpbmcgdG8gWFJJIFJlc29sdXRpb24gc2VjdGlvbiAiUVhSSSBxdWVyeSBwYXJhbWV0ZXJzIjoKICAgIC8vCiAgICAvLyAiSWYgdGhlIG9yaWdpbmFsIFFYUkkgaGFkIGEgbnVsbCBxdWVyeSBjb21wb25lbnQgKG9ubHkgYQogICAgLy8gIGxlYWRpbmcgcXVlc3Rpb24gbWFyayksIG9yIGEgcXVlcnkgY29tcG9uZW50IGNvbnNpc3Rpbmcgb2YKICAgIC8vICBvbmx5IHF1ZXN0aW9uIG1hcmtzLCBvbmUgYWRkaXRpb25hbCBsZWFkaW5nIHF1ZXN0aW9uIG1hcmsgTVVTVAogICAgLy8gIGJlIGFkZGVkIHdoZW4gYWRkaW5nIGFueSBYUkkgcmVzb2x1dGlvbiBwYXJhbWV0ZXJzLiIKICAgIGlmIChzdHJwb3MocnRyaW0oJHVybCwgJz8nKSwgJz8nKSAhPT0gZmFsc2UpIHsKICAgICAgICAkc2VwID0gJyYnOwogICAgfSBlbHNlIHsKICAgICAgICAkc2VwID0gJz8nOwogICAgfQoKICAgIHJldHVybiAkdXJsIC4gJHNlcCAuIEF1dGhfT3BlbklEOjpodHRwQnVpbGRRdWVyeSgkYXJncyk7Cn0KCmZ1bmN0aW9uIEF1dGhfWWFkaXNfcHJvdmlkZXJJc0F1dGhvcml0YXRpdmUoJHByb3ZpZGVySUQsICRjYW5vbmljYWxJRCkKewogICAgJGxhc3RiYW5nID0gc3RycnBvcygkY2Fub25pY2FsSUQsICchJyk7CiAgICAkcCA9IHN1YnN0cigkY2Fub25pY2FsSUQsIDAsICRsYXN0YmFuZyk7CiAgICByZXR1cm4gJHAgPT0gJHByb3ZpZGVySUQ7Cn0KCmZ1bmN0aW9uIEF1dGhfWWFkaXNfcm9vdEF1dGhvcml0eSgkeHJpKQp7CiAgICAvLyBSZXR1cm4gdGhlIHJvb3QgYXV0aG9yaXR5IGZvciBhbiBYUkkuCgogICAgJHJvb3QgPSBudWxsOwoKICAgIGlmIChBdXRoX1lhZGlzX3N0YXJ0c3dpdGgoJHhyaSwgJ3hyaTovLycpKSB7CiAgICAgICAgJHhyaSA9IHN1YnN0cigkeHJpLCA2KTsKICAgIH0KCiAgICAkYXV0aG9yaXR5ID0gZXhwbG9kZSgnLycsICR4cmksIDIpOwogICAgJGF1dGhvcml0eSA9ICRhdXRob3JpdHlbMF07CiAgICBpZiAoJGF1dGhvcml0eVswXSA9PSAnKCcpIHsKICAgICAgICAvLyBDcm9zcy1yZWZlcmVuY2UuCiAgICAgICAgLy8gWFhYOiBUaGlzIGlzIGluY29ycmVjdCBpZiBzb21lb25lIG5lc3RzIGNyb3NzLXJlZmVyZW5jZXMgc28KICAgICAgICAvLyAgIHRoZXJlIGlzIGFub3RoZXIgY2xvc2UtcGFyZW4gaW4gdGhlcmUuICBIb3BlZnVsbHkgbm9ib2R5CiAgICAgICAgLy8gICBkb2VzIHRoYXQgYmVmb3JlIHdlIGhhdmUgYSByZWFsIHhyaXBhcnNlIGZ1bmN0aW9uLgogICAgICAgIC8vICAgSG9wZWZ1bGx5IG5vYm9keSBkb2VzIHRoYXQgKmV2ZXIqLgogICAgICAgICRyb290ID0gc3Vic3RyKCRhdXRob3JpdHksIDAsIHN0cnBvcygkYXV0aG9yaXR5LCAnKScpICsgMSk7CiAgICB9IGVsc2UgaWYgKGluX2FycmF5KCRhdXRob3JpdHlbMF0sIEF1dGhfWWFkaXNfZ2V0WFJJQXV0aG9yaXRpZXMoKSkpIHsKICAgICAgICAvLyBPdGhlciBYUkkgcmVmZXJlbmNlLgogICAgICAgICRyb290ID0gJGF1dGhvcml0eVswXTsKICAgIH0gZWxzZSB7CiAgICAgICAgLy8gSVJJIHJlZmVyZW5jZS4KICAgICAgICAkX3NlZ21lbnRzID0gZXhwbG9kZSgiISIsICRhdXRob3JpdHkpOwogICAgICAgICRzZWdtZW50cyA9IGFycmF5KCk7CiAgICAgICAgZm9yZWFjaCAoJF9zZWdtZW50cyBhcyAkcykgewogICAgICAgICAgICAkc2VnbWVudHMgPSBhcnJheV9tZXJnZSgkc2VnbWVudHMsIGV4cGxvZGUoIioiLCAkcykpOwogICAgICAgIH0KICAgICAgICAkcm9vdCA9ICRzZWdtZW50c1swXTsKICAgIH0KCiAgICByZXR1cm4gQXV0aF9ZYWRpc19YUkkoJHJvb3QpOwp9CgpmdW5jdGlvbiBBdXRoX1lhZGlzX1hSSSgkeHJpKQp7CiAgICBpZiAoIUF1dGhfWWFkaXNfc3RhcnRzd2l0aCgkeHJpLCAneHJpOi8vJykpIHsKICAgICAgICAkeHJpID0gJ3hyaTovLycgLiAkeHJpOwogICAgfQogICAgcmV0dXJuICR4cmk7Cn0KCmZ1bmN0aW9uIEF1dGhfWWFkaXNfZ2V0Q2Fub25pY2FsSUQoJGluYW1lLCAkeHJkcykKewogICAgLy8gUmV0dXJucyBmYWxzZSBvciBhIGNhbm9uaWNhbCBJRCB2YWx1ZS4KCiAgICAvLyBOb3cgbm9kZXMgYXJlIGluIHJldmVyc2Ugb3JkZXIuCiAgICAkeHJkX2xpc3QgPSBhcnJheV9yZXZlcnNlKCR4cmRzLT5hbGxYcmROb2Rlcyk7CiAgICAkcGFyc2VyID0gJHhyZHMtPnBhcnNlcjsKICAgICRub2RlID0gJHhyZF9saXN0WzBdOwoKICAgICRjYW5vbmljYWxJRF9ub2RlcyA9ICRwYXJzZXItPmV2YWxYUGF0aCgneHJkOkNhbm9uaWNhbElEJywgJG5vZGUpOwoKICAgIGlmICghJGNhbm9uaWNhbElEX25vZGVzKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgICRjYW5vbmljYWxJRCA9ICRjYW5vbmljYWxJRF9ub2Rlc1swXTsKICAgICRjYW5vbmljYWxJRCA9IEF1dGhfWWFkaXNfWFJJKCRwYXJzZXItPmNvbnRlbnQoJGNhbm9uaWNhbElEKSk7CgogICAgJGNoaWxkSUQgPSAkY2Fub25pY2FsSUQ7CgogICAgZm9yICgkaSA9IDE7ICRpIDwgY291bnQoJHhyZF9saXN0KTsgJGkrKykgewogICAgICAgICR4cmQgPSAkeHJkX2xpc3RbJGldOwoKICAgICAgICAkcGFyZW50X3NvdWdodCA9IHN1YnN0cigkY2hpbGRJRCwgMCwgc3RycnBvcygkY2hpbGRJRCwgJyEnKSk7CiAgICAgICAgJHBhcmVudENJRCA9ICRwYXJzZXItPmV2YWxYUGF0aCgneHJkOkNhbm9uaWNhbElEJywgJHhyZCk7CiAgICAgICAgaWYgKCEkcGFyZW50Q0lEKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgJHBhcmVudENJRCA9IEF1dGhfWWFkaXNfWFJJKCRwYXJzZXItPmNvbnRlbnQoJHBhcmVudENJRFswXSkpOwoKICAgICAgICBpZiAoc3RyY2FzZWNtcCgkcGFyZW50X3NvdWdodCwgJHBhcmVudENJRCkpIHsKICAgICAgICAgICAgLy8gcmFpc2UgWFJEU0ZyYXVkLgogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICAkY2hpbGRJRCA9ICRwYXJlbnRfc291Z2h0OwogICAgfQoKICAgICRyb290ID0gQXV0aF9ZYWRpc19yb290QXV0aG9yaXR5KCRpbmFtZSk7CiAgICBpZiAoIUF1dGhfWWFkaXNfcHJvdmlkZXJJc0F1dGhvcml0YXRpdmUoJHJvb3QsICRjaGlsZElEKSkgewogICAgICAgIC8vIHJhaXNlIFhSRFNGcmF1ZC4KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgcmV0dXJuICRjYW5vbmljYWxJRDsKfQoKCg==]]></data>
	</file>
	<file>
	  <filename>/openid-php-openid-782224d/Auth/Yadis/XRIRes.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBDb2RlIGZvciB1c2luZyBhIHByb3h5IFhSSSByZXNvbHZlci4KICovCgpyZXF1aXJlX29uY2UgJ0F1dGgvWWFkaXMvWFJEUy5waHAnOwpyZXF1aXJlX29uY2UgJ0F1dGgvWWFkaXMvWFJJLnBocCc7CgpjbGFzcyBBdXRoX1lhZGlzX1Byb3h5UmVzb2x2ZXIgewogICAgZnVuY3Rpb24gQXV0aF9ZYWRpc19Qcm94eVJlc29sdmVyKCRmZXRjaGVyLCAkcHJveHlfdXJsID0gbnVsbCkKICAgIHsKICAgICAgICAkdGhpcy0+ZmV0Y2hlciA9ICRmZXRjaGVyOwogICAgICAgICR0aGlzLT5wcm94eV91cmwgPSAkcHJveHlfdXJsOwogICAgICAgIGlmICghJHRoaXMtPnByb3h5X3VybCkgewogICAgICAgICAgICAkdGhpcy0+cHJveHlfdXJsID0gQXV0aF9ZYWRpc19nZXREZWZhdWx0UHJveHkoKTsKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gcXVlcnlVUkwoJHhyaSwgJHNlcnZpY2VfdHlwZSA9IG51bGwpCiAgICB7CiAgICAgICAgLy8gdHJpbSBvZmYgdGhlIHhyaTovLyBwcmVmaXgKICAgICAgICAkcXhyaSA9IHN1YnN0cihBdXRoX1lhZGlzX3RvVVJJTm9ybWFsKCR4cmkpLCA2KTsKICAgICAgICAkaHhyaSA9ICR0aGlzLT5wcm94eV91cmwgLiAkcXhyaTsKICAgICAgICAkYXJncyA9IGFycmF5KAogICAgICAgICAgICAgICAgICAgICAgJ194cmRfcicgPT4gJ2FwcGxpY2F0aW9uL3hyZHMreG1sJwogICAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgaWYgKCRzZXJ2aWNlX3R5cGUpIHsKICAgICAgICAgICAgJGFyZ3NbJ194cmRfdCddID0gJHNlcnZpY2VfdHlwZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvLyBEb24ndCBwZXJmb3JtIHNlcnZpY2UgZW5kcG9pbnQgc2VsZWN0aW9uLgogICAgICAgICAgICAkYXJnc1snX3hyZF9yJ10gLj0gJztzZXA9ZmFsc2UnOwogICAgICAgIH0KCiAgICAgICAgJHF1ZXJ5ID0gQXV0aF9ZYWRpc19YUklBcHBlbmRBcmdzKCRoeHJpLCAkYXJncyk7CiAgICAgICAgcmV0dXJuICRxdWVyeTsKICAgIH0KCiAgICBmdW5jdGlvbiBxdWVyeSgkeHJpLCAkc2VydmljZV90eXBlcywgJGZpbHRlcnMgPSBhcnJheSgpKQogICAgewogICAgICAgICRzZXJ2aWNlcyA9IGFycmF5KCk7CiAgICAgICAgJGNhbm9uaWNhbElEID0gbnVsbDsKICAgICAgICBmb3JlYWNoICgkc2VydmljZV90eXBlcyBhcyAkc2VydmljZV90eXBlKSB7CiAgICAgICAgICAgICR1cmwgPSAkdGhpcy0+cXVlcnlVUkwoJHhyaSwgJHNlcnZpY2VfdHlwZSk7CiAgICAgICAgICAgICRyZXNwb25zZSA9ICR0aGlzLT5mZXRjaGVyLT5nZXQoJHVybCk7CiAgICAgICAgICAgIGlmICgkcmVzcG9uc2UtPnN0YXR1cyAhPSAyMDAgYW5kICRyZXNwb25zZS0+c3RhdHVzICE9IDIwNikgewogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJHhyZHMgPSBBdXRoX1lhZGlzX1hSRFM6OnBhcnNlWFJEUygkcmVzcG9uc2UtPmJvZHkpOwogICAgICAgICAgICBpZiAoISR4cmRzKSB7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkY2Fub25pY2FsSUQgPSBBdXRoX1lhZGlzX2dldENhbm9uaWNhbElEKCR4cmksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR4cmRzKTsKCiAgICAgICAgICAgIGlmICgkY2Fub25pY2FsSUQgPT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHNvbWVfc2VydmljZXMgPSAkeHJkcy0+c2VydmljZXMoJGZpbHRlcnMpOwogICAgICAgICAgICAkc2VydmljZXMgPSBhcnJheV9tZXJnZSgkc2VydmljZXMsICRzb21lX3NlcnZpY2VzKTsKICAgICAgICAgICAgLy8gVE9ETzoKICAgICAgICAgICAgLy8gICogSWYgd2UgZG8gZ2V0IGhpdHMgZm9yIG11bHRpcGxlIHNlcnZpY2VfdHlwZXMsIHdlJ3JlCiAgICAgICAgICAgIC8vICAgIGFsbW9zdCBjZXJ0YWlubHkgZ29pbmcgdG8gaGF2ZSBkdXBsaWNhdGVkIHNlcnZpY2UKICAgICAgICAgICAgLy8gICAgZW50cmllcyBhbmQgYnJva2VuIHByaW9yaXR5IG9yZGVyaW5nLgogICAgICAgIH0KICAgICAgICByZXR1cm4gYXJyYXkoJGNhbm9uaWNhbElELCAkc2VydmljZXMpOwogICAgfQp9CgoK]]></data>
	</file>
	<file>
	  <filename>/openid-php-openid-782224d/Auth/Yadis/Yadis.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBUaGUgY29yZSBQSFAgWWFkaXMgaW1wbGVtZW50YXRpb24uCiAqCiAqIFBIUCB2ZXJzaW9ucyA0IGFuZCA1CiAqCiAqIExJQ0VOU0U6IFNlZSB0aGUgQ09QWUlORyBmaWxlIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uLgogKgogKiBAcGFja2FnZSBPcGVuSUQKICogQGF1dGhvciBKYW5SYWluLCBJbmMuIDxvcGVuaWRAamFucmFpbi5jb20+CiAqIEBjb3B5cmlnaHQgMjAwNS0yMDA4IEphbnJhaW4sIEluYy4KICogQGxpY2Vuc2UgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIEFwYWNoZQogKi8KCi8qKgogKiBOZWVkIGJvdGggZmV0Y2hlciB0eXBlcyBzbyB3ZSBjYW4gdXNlIHRoZSByaWdodCBvbmUgYmFzZWQgb24gdGhlCiAqIHByZXNlbmNlIG9yIGFic2VuY2Ugb2YgQ1VSTC4KICovCnJlcXVpcmVfb25jZSAiQXV0aC9ZYWRpcy9QbGFpbkhUVFBGZXRjaGVyLnBocCI7CnJlcXVpcmVfb25jZSAiQXV0aC9ZYWRpcy9QYXJhbm9pZEhUVFBGZXRjaGVyLnBocCI7CgovKioKICogTmVlZCB0aGlzIGZvciBwYXJzaW5nIEhUTUwgKGxvb2tpbmcgZm9yIE1FVEEgdGFncykuCiAqLwpyZXF1aXJlX29uY2UgIkF1dGgvWWFkaXMvUGFyc2VIVE1MLnBocCI7CgovKioKICogTmVlZCB0aGlzIHRvIHBhcnNlIHRoZSBYUkRTIGRvY3VtZW50IGR1cmluZyBZYWRpcyBkaXNjb3ZlcnkuCiAqLwpyZXF1aXJlX29uY2UgIkF1dGgvWWFkaXMvWFJEUy5waHAiOwoKLyoqCiAqIFhSRFMgKHlhZGlzKSBjb250ZW50IHR5cGUKICovCmRlZmluZSgnQXV0aF9ZYWRpc19DT05URU5UX1RZUEUnLCAnYXBwbGljYXRpb24veHJkcyt4bWwnKTsKCi8qKgogKiBZYWRpcyBoZWFkZXIKICovCmRlZmluZSgnQXV0aF9ZYWRpc19IRUFERVJfTkFNRScsICdYLVhSRFMtTG9jYXRpb24nKTsKCi8qKgogKiBDb250YWlucyB0aGUgcmVzdWx0IG9mIHBlcmZvcm1pbmcgWWFkaXMgZGlzY292ZXJ5IG9uIGEgVVJJLgogKgogKiBAcGFja2FnZSBPcGVuSUQKICovCmNsYXNzIEF1dGhfWWFkaXNfRGlzY292ZXJ5UmVzdWx0IHsKCiAgICAvLyBUaGUgVVJJIHRoYXQgd2FzIHBhc3NlZCB0byB0aGUgZmV0Y2hlcgogICAgdmFyICRyZXF1ZXN0X3VyaSA9IG51bGw7CgogICAgLy8gVGhlIHJlc3VsdCBvZiBmb2xsb3dpbmcgcmVkaXJlY3RzIGZyb20gdGhlIHJlcXVlc3RfdXJpCiAgICB2YXIgJG5vcm1hbGl6ZWRfdXJpID0gbnVsbDsKCiAgICAvLyBUaGUgVVJJIGZyb20gd2hpY2ggdGhlIHJlc3BvbnNlIHRleHQgd2FzIHJldHVybmVkIChzZXQgdG8KICAgIC8vIE5vbmUgaWYgdGhlcmUgd2FzIG5vIFhSRFMgZG9jdW1lbnQgZm91bmQpCiAgICB2YXIgJHhyZHNfdXJpID0gbnVsbDsKCiAgICB2YXIgJHhyZHMgPSBudWxsOwoKICAgIC8vIFRoZSBjb250ZW50LXR5cGUgcmV0dXJuZWQgd2l0aCB0aGUgcmVzcG9uc2VfdGV4dAogICAgdmFyICRjb250ZW50X3R5cGUgPSBudWxsOwoKICAgIC8vIFRoZSBkb2N1bWVudCByZXR1cm5lZCBmcm9tIHRoZSB4cmRzX3VyaQogICAgdmFyICRyZXNwb25zZV90ZXh0ID0gbnVsbDsKCiAgICAvLyBEaWQgdGhlIGRpc2NvdmVyeSBmYWlsIG1pc2VyYWJseT8KICAgIHZhciAkZmFpbGVkID0gZmFsc2U7CgogICAgZnVuY3Rpb24gQXV0aF9ZYWRpc19EaXNjb3ZlcnlSZXN1bHQoJHJlcXVlc3RfdXJpKQogICAgewogICAgICAgIC8vIEluaXRpYWxpemUgdGhlIHN0YXRlIG9mIHRoZSBvYmplY3QKICAgICAgICAvLyBzZXRzIGFsbCBhdHRyaWJ1dGVzIHRvIE5vbmUgZXhjZXB0IHRoZSByZXF1ZXN0X3VyaQogICAgICAgICR0aGlzLT5yZXF1ZXN0X3VyaSA9ICRyZXF1ZXN0X3VyaTsKICAgIH0KCiAgICBmdW5jdGlvbiBmYWlsKCkKICAgIHsKICAgICAgICAkdGhpcy0+ZmFpbGVkID0gdHJ1ZTsKICAgIH0KCiAgICBmdW5jdGlvbiBpc0ZhaWx1cmUoKQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+ZmFpbGVkOwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgbGlzdCBvZiBzZXJ2aWNlIG9iamVjdHMgYXMgZGVzY3JpYmVkIGJ5IHRoZSBYUkRTCiAgICAgKiBkb2N1bWVudCwgaWYgdGhpcyB5YWRpcyBvYmplY3QgcmVwcmVzZW50cyBhIHN1Y2Nlc3NmdWwgWWFkaXMKICAgICAqIGRpc2NvdmVyeS4KICAgICAqCiAgICAgKiBAcmV0dXJuIGFycmF5ICRzZXJ2aWNlcyBBbiBhcnJheSBvZiB7QGxpbmsgQXV0aF9ZYWRpc19TZXJ2aWNlfQogICAgICogb2JqZWN0cwogICAgICovCiAgICBmdW5jdGlvbiBzZXJ2aWNlcygpCiAgICB7CiAgICAgICAgaWYgKCR0aGlzLT54cmRzKSB7CiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+eHJkcy0+c2VydmljZXMoKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgIGZ1bmN0aW9uIHVzZWRZYWRpc0xvY2F0aW9uKCkKICAgIHsKICAgICAgICAvLyBXYXMgdGhlIFlhZGlzIHByb3RvY29sJ3MgaW5kaXJlY3Rpb24gdXNlZD8KICAgICAgICByZXR1cm4gKCR0aGlzLT54cmRzX3VyaSAmJiAkdGhpcy0+bm9ybWFsaXplZF91cmkgIT0gJHRoaXMtPnhyZHNfdXJpKTsKICAgIH0KCiAgICBmdW5jdGlvbiBpc1hSRFMoKQogICAgewogICAgICAgIC8vIElzIHRoZSByZXNwb25zZSB0ZXh0IHN1cHBvc2VkIHRvIGJlIGFuIFhSRFMgZG9jdW1lbnQ/CiAgICAgICAgcmV0dXJuICgkdGhpcy0+dXNlZFlhZGlzTG9jYXRpb24oKSB8fAogICAgICAgICAgICAgICAgJHRoaXMtPmNvbnRlbnRfdHlwZSA9PSBBdXRoX1lhZGlzX0NPTlRFTlRfVFlQRSk7CiAgICB9Cn0KCi8qKgogKgogKiBQZXJmb3JtIHRoZSBZYWRpcyBwcm90b2NvbCBvbiB0aGUgaW5wdXQgVVJMIGFuZCByZXR1cm4gYW4gaXRlcmFibGUKICogb2YgcmVzdWx0aW5nIGVuZHBvaW50IG9iamVjdHMuCiAqCiAqIGlucHV0X3VybDogVGhlIFVSTCBvbiB3aGljaCB0byBwZXJmb3JtIHRoZSBZYWRpcyBwcm90b2NvbAogKgogKiBAcmV0dXJuOiBUaGUgbm9ybWFsaXplZCBpZGVudGl0eSBVUkwgYW5kIGFuIGl0ZXJhYmxlIG9mIGVuZHBvaW50CiAqIG9iamVjdHMgZ2VuZXJhdGVkIGJ5IHRoZSBmaWx0ZXIgZnVuY3Rpb24uCiAqCiAqIHhyZHNfcGFyc2VfZnVuYzogYSBjYWxsYmFjayB3aGljaCB3aWxsIHRha2UgKHVyaSwgeHJkc190ZXh0KSBhbmQKICogcmV0dXJuIGFuIGFycmF5IG9mIHNlcnZpY2UgZW5kcG9pbnQgb2JqZWN0cyBvciBudWxsLiAgVXN1YWxseQogKiBhcnJheSgnQXV0aF9PcGVuSURfU2VydmljZUVuZHBvaW50JywgJ2Zyb21YUkRTJykuCiAqCiAqIGRpc2NvdmVyX2Z1bmM6IGlmIG5vdCBudWxsLCBhIGNhbGxiYWNrIHdoaWNoIHNob3VsZCB0YWtlICh1cmkpIGFuZAogKiByZXR1cm4gYW4gQXV0aF9ZYWRpc19ZYWRpcyBvYmplY3Qgb3IgbnVsbC4KICovCmZ1bmN0aW9uIEF1dGhfWWFkaXNfZ2V0U2VydmljZUVuZHBvaW50cygkaW5wdXRfdXJsLCAkeHJkc19wYXJzZV9mdW5jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGRpc2NvdmVyX2Z1bmM9bnVsbCwgJGZldGNoZXI9bnVsbCkKewogICAgaWYgKCRkaXNjb3Zlcl9mdW5jID09PSBudWxsKSB7CiAgICAgICAgJGRpc2NvdmVyX2Z1bmN0aW9uID0gYXJyYXkoJ0F1dGhfWWFkaXNfWWFkaXMnLCAnZGlzY292ZXInKTsKICAgIH0KCiAgICAkeWFkaXNfcmVzdWx0ID0gY2FsbF91c2VyX2Z1bmNfYXJyYXkoJGRpc2NvdmVyX2Z1bmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXkoJGlucHV0X3VybCwgJiRmZXRjaGVyKSk7CgogICAgaWYgKCR5YWRpc19yZXN1bHQgPT09IG51bGwpIHsKICAgICAgICByZXR1cm4gYXJyYXkoJGlucHV0X3VybCwgYXJyYXkoKSk7CiAgICB9CgogICAgJGVuZHBvaW50cyA9IGNhbGxfdXNlcl9mdW5jX2FycmF5KCR4cmRzX3BhcnNlX2Z1bmMsCiAgICAgICAgICAgICAgICAgICAgICBhcnJheSgkeWFkaXNfcmVzdWx0LT5ub3JtYWxpemVkX3VyaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICR5YWRpc19yZXN1bHQtPnJlc3BvbnNlX3RleHQpKTsKCiAgICBpZiAoJGVuZHBvaW50cyA9PT0gbnVsbCkgewogICAgICAgICRlbmRwb2ludHMgPSBhcnJheSgpOwogICAgfQoKICAgIHJldHVybiBhcnJheSgkeWFkaXNfcmVzdWx0LT5ub3JtYWxpemVkX3VyaSwgJGVuZHBvaW50cyk7Cn0KCi8qKgogKiBUaGlzIGlzIHRoZSBjb3JlIG9mIHRoZSBQSFAgWWFkaXMgbGlicmFyeS4gIFRoaXMgaXMgdGhlIG9ubHkgY2xhc3MKICogYSB1c2VyIG5lZWRzIHRvIHVzZSB0byBwZXJmb3JtIFlhZGlzIGRpc2NvdmVyeS4gIFRoaXMgY2xhc3MKICogcGVyZm9ybXMgdGhlIGRpc2NvdmVyeSBBTkQgc3RvcmVzIHRoZSByZXN1bHQgb2YgdGhlIGRpc2NvdmVyeS4KICoKICogRmlyc3QsIHJlcXVpcmUgdGhpcyBsaWJyYXJ5IGludG8geW91ciBwcm9ncmFtIHNvdXJjZToKICoKICogPHByZT4gIHJlcXVpcmVfb25jZSAiQXV0aC9ZYWRpcy9ZYWRpcy5waHAiOzwvcHJlPgogKgogKiBUbyBwZXJmb3JtIFlhZGlzIGRpc2NvdmVyeSwgZmlyc3QgY2FsbCB0aGUgImRpc2NvdmVyIiBtZXRob2QKICogc3RhdGljYWxseSB3aXRoIGEgVVJJIHBhcmFtZXRlcjoKICoKICogPHByZT4gICRodHRwX3Jlc3BvbnNlID0gYXJyYXkoKTsKICogICRmZXRjaGVyID0gQXV0aF9ZYWRpc19ZYWRpczo6Z2V0SFRUUEZldGNoZXIoKTsKICogICR5YWRpc19vYmplY3QgPSBBdXRoX1lhZGlzX1lhZGlzOjpkaXNjb3ZlcigkdXJpLAogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRodHRwX3Jlc3BvbnNlLCAkZmV0Y2hlcik7PC9wcmU+CiAqCiAqIElmIHRoZSBkaXNjb3Zlcnkgc3VjY2VlZHMsICR5YWRpc19vYmplY3Qgd2lsbCBiZSBhbiBpbnN0YW5jZSBvZgogKiB7QGxpbmsgQXV0aF9ZYWRpc19ZYWRpc30uICBJZiBub3QsIGl0IHdpbGwgYmUgbnVsbC4gIFRoZSBYUkRTCiAqIGRvY3VtZW50IGZvdW5kIGR1cmluZyBkaXNjb3Zlcnkgc2hvdWxkIGhhdmUgc2VydmljZSBkZXNjcmlwdGlvbnMsCiAqIHdoaWNoIGNhbiBiZSBhY2Nlc3NlZCBieSBjYWxsaW5nCiAqCiAqIDxwcmU+ICAkc2VydmljZV9saXN0ID0gJHlhZGlzX29iamVjdC0+c2VydmljZXMoKTs8L3ByZT4KICoKICogd2hpY2ggcmV0dXJucyBhbiBhcnJheSBvZiBvYmplY3RzIHdoaWNoIGRlc2NyaWJlIGVhY2ggc2VydmljZS4KICogVGhlc2Ugb2JqZWN0cyBhcmUgaW5zdGFuY2VzIG9mIEF1dGhfWWFkaXNfU2VydmljZS4gIEVhY2ggb2JqZWN0CiAqIGRlc2NyaWJlcyBleGFjdGx5IG9uZSB3aG9sZSBTZXJ2aWNlIGVsZW1lbnQsIGNvbXBsZXRlIHdpdGggYWxsIG9mCiAqIGl0cyBUeXBlcyBhbmQgVVJJcyAobm8gZXhwYW5zaW9uIGlzIHBlcmZvcm1lZCkuICBUaGUgY29tbW9uIHVzZQogKiBjYXNlIGZvciB1c2luZyB0aGUgc2VydmljZSBvYmplY3RzIHJldHVybmVkIGJ5IHNlcnZpY2VzKCkgaXMgdG8KICogd3JpdGUgb25lIG9yIG1vcmUgZmlsdGVyIGZ1bmN0aW9ucyBhbmQgcGFzcyB0aG9zZSB0byBzZXJ2aWNlcygpOgogKgogKiA8cHJlPiAgJHNlcnZpY2VfbGlzdCA9ICR5YWRpc19vYmplY3QtPnNlcnZpY2VzKAogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheSgiZmlsdGVyQnlVUkkiLAogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmlsdGVyQnlFeHRlbnNpb24iKSk7PC9wcmU+CiAqCiAqIFRoZSBmaWx0ZXIgZnVuY3Rpb25zICh3aG9zZSBuYW1lcyBhcHBlYXIgaW4gdGhlIGFycmF5IHBhc3NlZCB0bwogKiBzZXJ2aWNlcygpKSB0YWtlIHRoZSBmb2xsb3dpbmcgZm9ybToKICoKICogPHByZT4gIGZ1bmN0aW9uIG15RmlsdGVyKCRzZXJ2aWNlKSB7CiAqICAgICAgIC8vIFF1ZXJ5ICRzZXJ2aWNlIG9iamVjdCBoZXJlLiAgUmV0dXJuIHRydWUgaWYgdGhlIHNlcnZpY2UKICogICAgICAgLy8gbWF0Y2hlcyB5b3VyIHF1ZXJ5OyBmYWxzZSBpZiBub3QuCiAqICB9PC9wcmU+CiAqCiAqIFRoaXMgaXMgYW4gZXhhbXBsZSBvZiBhIGZpbHRlciB3aGljaCB1c2VzIGEgcmVndWxhciBleHByZXNzaW9uIHRvCiAqIG1hdGNoIHRoZSBjb250ZW50IG9mIFVSSSB0YWdzIChub3RlIHRoYXQgdGhlIEF1dGhfWWFkaXNfU2VydmljZQogKiBjbGFzcyBwcm92aWRlcyBhIGdldFVSSXMoKSBtZXRob2Qgd2hpY2ggeW91IHNob3VsZCB1c2UgaW5zdGVhZCBvZgogKiB0aGlzIGNvbnRyaXZlZCBleGFtcGxlKToKICoKICogPHByZT4KICogIGZ1bmN0aW9uIFVSSU1hdGNoZXIoJHNlcnZpY2UpIHsKICogICAgICBmb3JlYWNoICgkc2VydmljZS0+Z2V0RWxlbWVudHMoJ3hyZDpVUkknKSBhcyAkdXJpKSB7CiAqICAgICAgICAgIGlmIChwcmVnX21hdGNoKCIvc29tZV9wYXR0ZXJuLyIsCiAqICAgICAgICAgICAgICAgICAgICAgICAgICRzZXJ2aWNlLT5wYXJzZXItPmNvbnRlbnQoJHVyaSkpKSB7CiAqICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICogICAgICAgICAgfQogKiAgICAgIH0KICogICAgICByZXR1cm4gZmFsc2U7CiAqICB9PC9wcmU+CiAqCiAqIFRoZSBmaWx0ZXIgZnVuY3Rpb25zIHlvdSBwYXNzIHdpbGwgYmUgY2FsbGVkIGZvciBlYWNoIHNlcnZpY2UKICogb2JqZWN0IHRvIGRldGVybWluZSB3aGljaCBvbmVzIG1hdGNoIHRoZSBjcml0ZXJpYSB5b3VyIGZpbHRlcnMKICogc3BlY2lmeS4gIFRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzIHRoYXQgaWYgYSBnaXZlbiBzZXJ2aWNlIG9iamVjdAogKiBtYXRjaGVzIEFOWSBvZiB0aGUgZmlsdGVycyBzcGVjaWZpZWQgaW4gdGhlIHNlcnZpY2VzKCkgY2FsbCwgaXQKICogd2lsbCBiZSByZXR1cm5lZC4gIFlvdSBjYW4gc3BlY2lmeSB0aGF0IGEgZ2l2ZW4gc2VydmljZSBvYmplY3Qgd2lsbAogKiBiZSByZXR1cm5lZCBPTkxZIGlmIGl0IG1hdGNoZXMgQUxMIHNwZWNpZmllZCBmaWx0ZXJzIGJ5IGNoYW5naW5nCiAqIHRoZSBtYXRjaCBtb2RlIG9mIHNlcnZpY2VzKCk6CiAqCiAqIDxwcmU+ICAkeWFkaXNfb2JqZWN0LT5zZXJ2aWNlcyhhcnJheSgiZmlsdGVyMSIsICJmaWx0ZXIyIiksCiAqICAgICAgICAgICAgICAgICAgICAgICAgICBTRVJWSUNFU19ZQURJU19NQVRDSF9BTEwpOzwvcHJlPgogKgogKiBTZWUge0BsaW5rIFNFUlZJQ0VTX1lBRElTX01BVENIX0FMTH0gYW5kIHtAbGluawogKiBTRVJWSUNFU19ZQURJU19NQVRDSF9BTll9LgogKgogKiBTZXJ2aWNlcyBkZXNjcmliZWQgaW4gYW4gWFJEUyBzaG91bGQgaGF2ZSBhIGxpYnJhcnkgd2hpY2ggeW91J2xsCiAqIHByb2JhYmx5IGJlIHVzaW5nLiAgVGhvc2UgbGlicmFyaWVzIGFyZSByZXNwb25zaWJsZSBmb3IgZGVmaW5pbmcKICogZmlsdGVycyB0aGF0IGNhbiBiZSB1c2VkIHdpdGggdGhlICJzZXJ2aWNlcygpIiBjYWxsLiAgSWYgeW91IG5lZWQKICogdG8gd3JpdGUgeW91ciBvd24gZmlsdGVyLCBzZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIHtAbGluawogKiBBdXRoX1lhZGlzX1NlcnZpY2V9LgogKgogKiBAcGFja2FnZSBPcGVuSUQKICovCmNsYXNzIEF1dGhfWWFkaXNfWWFkaXMgewoKICAgIC8qKgogICAgICogUmV0dXJucyBhbiBIVFRQIGZldGNoZXIgb2JqZWN0LiAgSWYgdGhlIENVUkwgZXh0ZW5zaW9uIGlzCiAgICAgKiBwcmVzZW50LCBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgQXV0aF9ZYWRpc19QYXJhbm9pZEhUVFBGZXRjaGVyfQogICAgICogaXMgcmV0dXJuZWQuICBJZiBub3QsIGFuIGluc3RhbmNlIG9mCiAgICAgKiB7QGxpbmsgQXV0aF9ZYWRpc19QbGFpbkhUVFBGZXRjaGVyfSBpcyByZXR1cm5lZC4KICAgICAqCiAgICAgKiBJZiBBdXRoX1lhZGlzX0NVUkxfT1ZFUlJJREUgaXMgZGVmaW5lZCwgdGhpcyBtZXRob2Qgd2lsbCBhbHdheXMKICAgICAqIHJldHVybiBhIHtAbGluayBBdXRoX1lhZGlzX1BsYWluSFRUUEZldGNoZXJ9LgogICAgICovCiAgICBzdGF0aWMgZnVuY3Rpb24gZ2V0SFRUUEZldGNoZXIoJHRpbWVvdXQgPSAyMCkKICAgIHsKICAgICAgICBpZiAoQXV0aF9ZYWRpc19ZYWRpczo6Y3VybFByZXNlbnQoKSAmJgogICAgICAgICAgICAoIWRlZmluZWQoJ0F1dGhfWWFkaXNfQ1VSTF9PVkVSUklERScpKSkgewogICAgICAgICAgICAkZmV0Y2hlciA9IG5ldyBBdXRoX1lhZGlzX1BhcmFub2lkSFRUUEZldGNoZXIoJHRpbWVvdXQpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRmZXRjaGVyID0gbmV3IEF1dGhfWWFkaXNfUGxhaW5IVFRQRmV0Y2hlcigkdGltZW91dCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiAkZmV0Y2hlcjsKICAgIH0KCiAgICBzdGF0aWMgZnVuY3Rpb24gY3VybFByZXNlbnQoKQogICAgewogICAgICAgIHJldHVybiBmdW5jdGlvbl9leGlzdHMoJ2N1cmxfaW5pdCcpOwogICAgfQoKICAgIC8qKgogICAgICogQGFjY2VzcyBwcml2YXRlCiAgICAgKi8KICAgc3RhdGljIGZ1bmN0aW9uIF9nZXRIZWFkZXIoJGhlYWRlcl9saXN0LCAkbmFtZXMpCiAgICB7CiAgICAgICAgZm9yZWFjaCAoJGhlYWRlcl9saXN0IGFzICRuYW1lID0+ICR2YWx1ZSkgewogICAgICAgICAgICBmb3JlYWNoICgkbmFtZXMgYXMgJG4pIHsKICAgICAgICAgICAgICAgIGlmIChzdHJ0b2xvd2VyKCRuYW1lKSA9PSBzdHJ0b2xvd2VyKCRuKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkdmFsdWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgIC8qKgogICAgICogQGFjY2VzcyBwcml2YXRlCiAgICAgKi8KICAgIHN0YXRpYyBmdW5jdGlvbiBfZ2V0Q29udGVudFR5cGUoJGNvbnRlbnRfdHlwZV9oZWFkZXIpCiAgICB7CiAgICAgICAgaWYgKCRjb250ZW50X3R5cGVfaGVhZGVyKSB7CiAgICAgICAgICAgICRwYXJ0cyA9IGV4cGxvZGUoIjsiLCAkY29udGVudF90eXBlX2hlYWRlcik7CiAgICAgICAgICAgIHJldHVybiBzdHJ0b2xvd2VyKCRwYXJ0c1swXSk7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogVGhpcyBzaG91bGQgYmUgY2FsbGVkIHN0YXRpY2FsbHkgYW5kIHdpbGwgYnVpbGQgYSBZYWRpcwogICAgICogaW5zdGFuY2UgaWYgdGhlIGRpc2NvdmVyeSBwcm9jZXNzIHN1Y2NlZWRzLiAgVGhpcyBpbXBsZW1lbnRzCiAgICAgKiBZYWRpcyBkaXNjb3ZlcnkgYXMgc3BlY2lmaWVkIGluIHRoZSBZYWRpcyBzcGVjaWZpY2F0aW9uLgogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgJHVyaSBUaGUgVVJJIG9uIHdoaWNoIHRvIHBlcmZvcm0gWWFkaXMgZGlzY292ZXJ5LgogICAgICoKICAgICAqIEBwYXJhbSBhcnJheSAkaHR0cF9yZXNwb25zZSBBbiBhcnJheSByZWZlcmVuY2Ugd2hlcmUgdGhlIEhUVFAKICAgICAqIHJlc3BvbnNlIG9iamVjdCB3aWxsIGJlIHN0b3JlZCAoc2VlIHtAbGluawogICAgICogQXV0aF9ZYWRpc19IVFRQUmVzcG9uc2V9LgogICAgICoKICAgICAqIEBwYXJhbSBBdXRoX1lhZGlzX0hUVFBGZXRjaGVyICRmZXRjaGVyIEFuIGluc3RhbmNlIG9mIGEKICAgICAqIEF1dGhfWWFkaXNfSFRUUEZldGNoZXIgc3ViY2xhc3MuCiAgICAgKgogICAgICogQHBhcmFtIGFycmF5ICRleHRyYV9uc19tYXAgQW4gYXJyYXkgd2hpY2ggbWFwcyBuYW1lc3BhY2UgbmFtZXMKICAgICAqIHRvIG5hbWVzcGFjZSBVUklzIHRvIGJlIHVzZWQgd2hlbiBwYXJzaW5nIHRoZSBZYWRpcyBYUkRTCiAgICAgKiBkb2N1bWVudC4KICAgICAqCiAgICAgKiBAcGFyYW0gaW50ZWdlciAkdGltZW91dCBBbiBvcHRpb25hbCBmZXRjaGVyIHRpbWVvdXQsIGluIHNlY29uZHMuCiAgICAgKgogICAgICogQHJldHVybiBtaXhlZCAkb2JqIEVpdGhlciBudWxsIG9yIGFuIGluc3RhbmNlIG9mCiAgICAgKiBBdXRoX1lhZGlzX1lhZGlzLCBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgZGlzY292ZXJ5CiAgICAgKiBzdWNjZWVkZWQuCiAgICAgKi8KICAgIHN0YXRpYyBmdW5jdGlvbiBkaXNjb3ZlcigkdXJpLCAkZmV0Y2hlciwKICAgICAgICAgICAgICAgICAgICAgICRleHRyYV9uc19tYXAgPSBudWxsLCAkdGltZW91dCA9IDIwKQogICAgewogICAgICAgICRyZXN1bHQgPSBuZXcgQXV0aF9ZYWRpc19EaXNjb3ZlcnlSZXN1bHQoJHVyaSk7CgogICAgICAgICRyZXF1ZXN0X3VyaSA9ICR1cmk7CiAgICAgICAgJGhlYWRlcnMgPSBhcnJheSgiQWNjZXB0OiAiIC4gQXV0aF9ZYWRpc19DT05URU5UX1RZUEUgLgogICAgICAgICAgICAgICAgICAgICAgICAgJywgdGV4dC9odG1sOyBxPTAuMywgYXBwbGljYXRpb24veGh0bWwreG1sOyBxPTAuNScpOwoKICAgICAgICBpZiAoJGZldGNoZXIgPT09IG51bGwpIHsKICAgICAgICAgICAgJGZldGNoZXIgPSBBdXRoX1lhZGlzX1lhZGlzOjpnZXRIVFRQRmV0Y2hlcigkdGltZW91dCk7CiAgICAgICAgfQoKICAgICAgICAkcmVzcG9uc2UgPSAkZmV0Y2hlci0+Z2V0KCR1cmksICRoZWFkZXJzKTsKCiAgICAgICAgaWYgKCEkcmVzcG9uc2UgfHwgKCRyZXNwb25zZS0+c3RhdHVzICE9IDIwMCBhbmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3BvbnNlLT5zdGF0dXMgIT0gMjA2KSkgewogICAgICAgICAgICAkcmVzdWx0LT5mYWlsKCk7CiAgICAgICAgICAgIHJldHVybiAkcmVzdWx0OwogICAgICAgIH0KCiAgICAgICAgJHJlc3VsdC0+bm9ybWFsaXplZF91cmkgPSAkcmVzcG9uc2UtPmZpbmFsX3VybDsKICAgICAgICAkcmVzdWx0LT5jb250ZW50X3R5cGUgPSBBdXRoX1lhZGlzX1lhZGlzOjpfZ2V0SGVhZGVyKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcmVzcG9uc2UtPmhlYWRlcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5KCdjb250ZW50LXR5cGUnKSk7CgogICAgICAgIGlmICgkcmVzdWx0LT5jb250ZW50X3R5cGUgJiYKICAgICAgICAgICAgKEF1dGhfWWFkaXNfWWFkaXM6Ol9nZXRDb250ZW50VHlwZSgkcmVzdWx0LT5jb250ZW50X3R5cGUpID09CiAgICAgICAgICAgICBBdXRoX1lhZGlzX0NPTlRFTlRfVFlQRSkpIHsKICAgICAgICAgICAgJHJlc3VsdC0+eHJkc191cmkgPSAkcmVzdWx0LT5ub3JtYWxpemVkX3VyaTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkeWFkaXNfbG9jYXRpb24gPSBBdXRoX1lhZGlzX1lhZGlzOjpfZ2V0SGVhZGVyKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3BvbnNlLT5oZWFkZXJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXkoQXV0aF9ZYWRpc19IRUFERVJfTkFNRSkpOwoKICAgICAgICAgICAgaWYgKCEkeWFkaXNfbG9jYXRpb24pIHsKICAgICAgICAgICAgICAgICRwYXJzZXIgPSBuZXcgQXV0aF9ZYWRpc19QYXJzZUhUTUwoKTsKICAgICAgICAgICAgICAgICR5YWRpc19sb2NhdGlvbiA9ICRwYXJzZXItPmdldEhUVFBFcXVpdigkcmVzcG9uc2UtPmJvZHkpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoJHlhZGlzX2xvY2F0aW9uKSB7CiAgICAgICAgICAgICAgICAkcmVzdWx0LT54cmRzX3VyaSA9ICR5YWRpc19sb2NhdGlvbjsKCiAgICAgICAgICAgICAgICAkcmVzcG9uc2UgPSAkZmV0Y2hlci0+Z2V0KCR5YWRpc19sb2NhdGlvbik7CgogICAgICAgICAgICAgICAgaWYgKCghJHJlc3BvbnNlKSB8fCAoJHJlc3BvbnNlLT5zdGF0dXMgIT0gMjAwIGFuZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3BvbnNlLT5zdGF0dXMgIT0gMjA2KSkgewogICAgICAgICAgICAgICAgICAgICRyZXN1bHQtPmZhaWwoKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHJlc3VsdDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkcmVzdWx0LT5jb250ZW50X3R5cGUgPSBBdXRoX1lhZGlzX1lhZGlzOjpfZ2V0SGVhZGVyKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcmVzcG9uc2UtPmhlYWRlcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5KCdjb250ZW50LXR5cGUnKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICRyZXN1bHQtPnJlc3BvbnNlX3RleHQgPSAkcmVzcG9uc2UtPmJvZHk7CiAgICAgICAgcmV0dXJuICRyZXN1bHQ7CiAgICB9Cn0KCgo=]]></data>
	</file>
	<file>
	  <filename>/openid-php-openid-782224d/CHANGES-2.1.0</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[KiBBUEkgQ2hhbmdlcwogICogQVg6OkZldGNoUmVzcG9uc2U6OmZyb21TdWNjZXNzUmVzcG9uc2UgLSByZXR1cm4gbnVsbCB3aGVuIEFYCiAgICByZXNwb25zZSBhcmd1bWVudHMgYXJlIGFic2VudAogICogQWx0ZXIgQVggZnJvbU9wZW5JRFJlcXVlc3QoKSB0byB0YWtlIEF1dGhfT3BlbklEX0F1dGhSZXF1ZXN0CiAgICBvYmplY3QgaW5zdGVhZCBvZiBBdXRoX09wZW5JRF9NZXNzYWdlIG9iamVjdCBzbyB0aGF0IGl0IG1hdGNoZXMKICAgIGl0cyBjb3VudGVycGFydCBtZXRob2RzIGluIFNSRUcgYW5kIFBBUEUgZXh0ZW5zaW9ucy4KICAqIFBBUEUgKFByb3ZpZGVyIEF1dGhlbnRpY2F0aW9uIFBvbGljeSBFeHRlbnNpb24pIG1vZHVsZQogICAgICAqIFVwZGF0ZWQgZXh0ZW5zaW9uIGZvciBzcGVjaWZpY2F0aW9uIGRyYWZ0IDIKICAgICAgKiBBdXRoX09wZW5JRF9QQVBFX1JlcXVlc3Q6OmZyb21TdWNjZXNzUmVzcG9uc2UgcmV0dXJucyBOb25lIGlmCiAgICAgICAgUEFQRSByZXNwb25zZSBhcmd1bWVudHMgd2VyZSBub3Qgc2lnbmVkCiAgKiBBZGRlZCBmdW5jdGlvbnMgdG8gZ2VuZXJhdGUgcmVxdWVzdC9yZXNwb25zZSBIVE1MIGZvcm1zIHdpdGgKICAgIGF1dG8tc3VibWlzc2lvbiBqYXZhc2NyaXB0CiAgICAgICogQ29uc3VtZXIgKHJlbHlpbmcgcGFydHkpIEFQSToKICAgICAgICBBdXRoX09wZW5JRF9BdXRoUmVxdWVzdDo6aHRtbE1hcmt1cAogICAgICAqIFNlcnZlciBBUEk6IEF1dGhfT3BlbklEX09wZW5JRFJlc3BvbnNlOjp0b0hUTUwKCiogTmV3IEZlYXR1cmVzCiAgKiBBZGRlZCBleGFtcGxlcy9kaXNjb3Zlci5waHAsIGFuIE9wZW5JRCBzZXJ2aWNlIGRpc2NvdmVyeSB0b29sCiAgKiBBZGQgb3B0aW9uYWwgZm9ybV90YWdfYXR0cnMgYXJndW1lbnQgdG8KICAgIEF1dGhfT3BlbklEX1NlcnZlclJlc3BvbnNlOjp0b0Zvcm1NYXJrdXAgZm9yIHNldHRpbmcgYXJiaXRyYXJ5CiAgICBGT1JNIGVsZW1lbnQgYXR0cmlidXRlcwogICogRmV0Y2hlcnMgbm93IG9ubHkgcmVhZC9yZXF1ZXN0IGZpcnN0IG1lZ2FieXRlIG9mIHJlc3BvbnNlCgoqIEJ1ZyBGaXhlcwogICogTk9UIE5VTEwgY29uc3RyYWludHMgd2VyZSBhZGRlZCB0byBTUUxTdG9yZSB0YWJsZXMgd2hlcmUKICAgIGFwcHJvcHJpYXRlCiAgKiBZYWRpcyBkaXNjb3Zlcnkgbm93IHByb3Blcmx5IGZhbGxzIGJhY2sgdG8gSFRNTC1iYXNlZCBkaXNjb3ZlcnkgaWYKICAgIGl0IGZhaWxzIHRvIGdldCBhbiBYUkRTIGRvY3VtZW50CiAgKiBBdXRoX09wZW5JRF9EZWNvZGVyIG5vdyBiZWhhdmVzIGNvcnJlY3RseSB3aGVuIGdpdmVuIGEgcHJvdG9jb2wKICAgIG1lc3NhZ2Ugd2l0aCBhbiBpbnZhbGlkIE9wZW5JRCBuYW1lc3BhY2Ugb3IgYSBtaXNzaW5nIE9wZW5JRCBtb2RlCiAgKiBBdXRoX09wZW5JRF9PcGVuSURSZXNwb25zZTo6dG9Gb3JtTWFya3VwOiBVc2UgcmV0dXJuX3RvIGZyb20gdGhlCiAgICByZXF1ZXN0LCBub3QgdGhlIHJlc3BvbnNlIGZpZWxkcyAoTm90IGFsbCByZXNwb25zZXMgKGkuZS4gY2FuY2VsLAogICAgc2V0dXBfbmVlZGVkKSBpbmNsdWRlIGEgcmV0dXJuX3RvIGZpZWxkLikKICAqIG5vcm1hbGl6ZSByZXR1cm5fdG8gVVJMIGJlZm9yZSBwZXJmb3JtaW5nIHJldHVybl90byB2ZXJpZmljYXRpb24KICAqIEF1dGhfT3BlbklEX0NvbnN1bWVyOjpfdmVyaWZ5RGlzY292ZXJ5UmVzdWx0czogZmFsbCBiYWNrIHRvIE9wZW5JRAogICAgMS4wIHR5cGUgaWYgMS4xIGVuZHBvaW50IGNhbm5vdCBiZSBmb3VuZAogICogQXV0aF9ZYWRpc19QYXJhbm9pZEhUVFBGZXRjaGVyIG5vdyB3b3JrcyBjb3JyZWN0bHkgd2l0aCBib3RoIGFycmF5CiAgICBhbmQgbm9uLWFycmF5IENVUkwgdmVyc2lvbnMKICAqIENsYXJpZmllZCBsaWNlbnNpbmcgbGFuZ3VhZ2UgaW4gYWxsIHNvdXJjZSBmaWxlcwogICogT3BlbklEIDEgYXNzb2NpYXRpb24gcmVxdWVzdHMgbm8gbG9uZ2VyIGV4cGxpY2l0bHkgc2V0CiAgICBuby1lbmNyeXB0aW9uIHNlc3Npb24gdHlwZQogICogQXV0aF9PcGVuSURfU2VydmljZUVuZHBvaW50OjpnZXREaXNwbGF5SWRlbnRpZmllciBubyBsb25nZXIKICAgIGluY2x1ZGVzIGEgZnJhZ21lbnQsIGlmIHByZXNlbnQsIGluIGRpc3BsYXkgaWRlbnRpZmllcnMKICAqIGNoZWNrX2F1dGhlbnRpY2F0aW9uIHJlcXVlc3RzOiBjb3B5IGVudGlyZSByZXNwb25zZSwgbm90IGp1c3QKICAgIHNpZ25lZCBmaWVsZHMuICBGaXhlcyBtaXNzaW5nIG5hbWVzcGFjZSBpbiBjaGVja19hdXRoZW50aWNhdGlvbgogICAgcmVxdWVzdHMKICAqIFlhZGlzIGRpc2NvdmVyeSBub3cgaW5jbHVkZXMgYXBwbGljYXRpb24veGh0bWwreG1sIGFuZCBxdWFsaXRpZXMKICAgIGluIHRoZSBBY2NlcHQgaGVhZGVyCiAgKiBOb3JtYWxpemUgVVJMcyBjb3JyZWN0bHkgd2l0aCBVUklOb3JtLnBocAogICogQXV0aF9PcGVuSURfTXlTUUxTdG9yZTogVXNlIEVOR0lORSBpbnN0ZWFkIG9mIFRZUEUgd2hlbiBjcmVhdGluZwogICAgdGFibGVzCg==]]></data>
	</file>
	<file>
	  <filename>/openid-php-openid-782224d/COPYING</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwoKICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCgogICAxLiBEZWZpbml0aW9ucy4KCiAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCiAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgoKICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgoKICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAogICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCiAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCiAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQogICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgogICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KCiAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KCiAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAogICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCiAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCgogICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAogICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0CiAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgoKICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQogICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KCiAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQogICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCiAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCiAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgogICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCiAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCgogICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwogICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCiAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQogICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCiAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgogICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAogICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwogICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAogICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQogICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCgogICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQogICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCgogICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAogICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQogICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCiAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCgogICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAogICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQogICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCiAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCiAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCiAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawogICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAogICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCiAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQogICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCgogICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQogICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CgogICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgogICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKCiAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAoKICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCiAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCiAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAogICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgogICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAoKICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCiAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0CiAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAogICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCiAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAogICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgogICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCiAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCiAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCiAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQogICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCiAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KCiAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAogICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCiAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCiAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAogICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgoKICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAogICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCiAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgoKICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQogICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCiAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQogICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KCiAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgogICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCiAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQogICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55CiAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KCiAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAogICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAogICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQogICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCiAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCiAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgoKICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwogICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAogICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAogICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwogICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQogICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgogICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCiAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQogICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCiAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgoKICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCgogICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCgogICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZwogICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCiAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCiAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCiAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQogICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCiAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgogICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCgogICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KCiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4K]]></data>
	</file>
	<file>
	  <filename>/openid-php-openid-782224d/examples/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/openid-php-openid-782224d/examples/detect.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCiRwYXRoX2V4dHJhID0gZGlybmFtZShkaXJuYW1lKF9fRklMRV9fKSk7CiRwYXRoID0gaW5pX2dldCgnaW5jbHVkZV9wYXRoJyk7CiRwYXRoID0gJHBhdGhfZXh0cmEgLiBQQVRIX1NFUEFSQVRPUiAuICRwYXRoOwppbmlfc2V0KCdpbmNsdWRlX3BhdGgnLCAkcGF0aCk7CgpkZWZpbmUoJ0lTX1dJTkRPV1MnLCBzdHJ0b3VwcGVyKHN1YnN0cihQSFBfT1MsIDAsIDMpKSA9PT0gJ1dJTicpOwoKY2xhc3MgUGxhaW5UZXh0IHsKICAgIGZ1bmN0aW9uIHN0YXJ0KCR0aXRsZSkKICAgIHsKICAgICAgICByZXR1cm4gJyc7CiAgICB9CgogICAgZnVuY3Rpb24gdHQoJHRleHQpCiAgICB7CiAgICAgICAgcmV0dXJuICR0ZXh0OwogICAgfQoKICAgIGZ1bmN0aW9uIGxpbmsoJGhyZWYsICR0ZXh0PW51bGwpCiAgICB7CiAgICAgICAgaWYgKCR0ZXh0KSB7CiAgICAgICAgICAgIHJldHVybiAkdGV4dCAuICcgPCcgLiAkaHJlZiAuICc+JzsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gJGhyZWY7CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGIoJHRleHQpCiAgICB7CiAgICAgICAgcmV0dXJuICcqJyAuICR0ZXh0IC4gJyonOwogICAgfQoKICAgIGZ1bmN0aW9uIGNvbnRlbnRUeXBlKCkKICAgIHsKICAgICAgICByZXR1cm4gJ3RleHQvcGxhaW4nOwogICAgfQoKICAgIGZ1bmN0aW9uIHAoJHRleHQpCiAgICB7CiAgICAgICAgcmV0dXJuIHdvcmR3cmFwKCR0ZXh0KSAuICJcblxuIjsKICAgIH0KCiAgICBmdW5jdGlvbiBwcmUoJHRleHQpCiAgICB7CiAgICAgICAgJG91dCA9ICcnOwogICAgICAgICRsaW5lcyA9IGFycmF5X21hcCgndHJpbScsIGV4cGxvZGUoIlxuIiwgJHRleHQpKTsKICAgICAgICBmb3JlYWNoICgkbGluZXMgYXMgJGxpbmUpIHsKICAgICAgICAgICAgJG91dCAuPSAnICAgICcgLiAkbGluZSAuICJcbiI7CiAgICAgICAgfQogICAgICAgICRvdXQgLj0gIlxuIjsKICAgICAgICByZXR1cm4gJG91dDsKICAgIH0KCiAgICBmdW5jdGlvbiBvbCgkaXRlbXMpCiAgICB7CiAgICAgICAgJG91dCA9ICcnOwogICAgICAgICRjID0gMTsKICAgICAgICBmb3JlYWNoICgkaXRlbXMgYXMgJGl0ZW0pIHsKICAgICAgICAgICAgJGl0ZW0gPSB3b3Jkd3JhcCgkaXRlbSwgNzIpOwogICAgICAgICAgICAkbGluZXMgPSBhcnJheV9tYXAoJ3RyaW0nLCBleHBsb2RlKCJcbiIsICRpdGVtKSk7CiAgICAgICAgICAgICRvdXQgLj0gJGMgLiAnLiAnIC4gJGxpbmVzWzBdIC4gIlxuIjsKICAgICAgICAgICAgdW5zZXQoJGxpbmVzWzBdKTsKICAgICAgICAgICAgZm9yZWFjaCAoJGxpbmVzIGFzICRsaW5lKSB7CiAgICAgICAgICAgICAgICAkb3V0IC49ICcgICAnIC4gJGxpbmUgLiAiXG4iOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRvdXQgLj0gIlxuIjsKICAgICAgICAgICAgJGMgKz0gMTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICRvdXQ7CiAgICB9CgogICAgZnVuY3Rpb24gaDIoJHRleHQpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5oKCR0ZXh0LCAyKTsKICAgIH0KCiAgICBmdW5jdGlvbiBoMSgkdGV4dCkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmgoJHRleHQsIDEpOwogICAgfQoKICAgIGZ1bmN0aW9uIGgoJHRleHQsICRuKQogICAgewogICAgICAgICRjaGFycyA9ICcjPSstLic7CiAgICAgICAgJGMgPSAkY2hhcnNbJG4gLSAxXTsKICAgICAgICByZXR1cm4gIlxuIiAuICR0ZXh0IC4gIlxuIiAuIHN0cl9yZXBlYXQoJGMsIHN0cmxlbigkdGV4dCkpIC4gIlxuXG4iOwogICAgfQoKICAgIGZ1bmN0aW9uIGVuZCgpCiAgICB7CiAgICAgICAgcmV0dXJuICcnOwogICAgfQp9CgpjbGFzcyBIVE1MIHsKICAgIGZ1bmN0aW9uIHN0YXJ0KCR0aXRsZSkKICAgIHsKICAgICAgICByZXR1cm4gJzxodG1sPjxoZWFkPjx0aXRsZT4nIC4gJHRpdGxlIC4gJzwvdGl0bGU+JyAuCiAgICAgICAgICAgICR0aGlzLT5zdHlsZXNoZWV0KCkuCiAgICAgICAgICAgICc8L2hlYWQ+PGJvZHk+JyAuICJcbiI7CiAgICB9CgogICAgZnVuY3Rpb24gc3R5bGVzaGVldCgpCiAgICB7CiAgICAgICAgcmV0dXJuICI8c3R5bGUgdHlwZT0ndGV4dC9jc3MnPlxuIi4KICAgICAgICAgICAgInAge1xuIi4KICAgICAgICAgICAgIiAgd2lkdGg6IDUwZW07XG4iLgogICAgICAgICAgICAifVxuIi4KICAgICAgICAgICAgJzwvc3R5bGU+JzsKICAgIH0KCiAgICBmdW5jdGlvbiB0dCgkdGV4dCkKICAgIHsKICAgICAgICByZXR1cm4gJzxjb2RlPicgLiAkdGV4dCAuICc8L2NvZGU+JzsKICAgIH0KCiAgICBmdW5jdGlvbiBjb250ZW50VHlwZSgpCiAgICB7CiAgICAgICAgcmV0dXJuICd0ZXh0L2h0bWwnOwogICAgfQoKICAgIGZ1bmN0aW9uIGIoJHRleHQpCiAgICB7CiAgICAgICAgcmV0dXJuICc8c3Ryb25nPicgLiAkdGV4dCAuICc8L3N0cm9uZz4nOwogICAgfQoKICAgIGZ1bmN0aW9uIHAoJHRleHQpCiAgICB7CiAgICAgICAgcmV0dXJuICc8cD4nIC4gd29yZHdyYXAoJHRleHQpIC4gIjwvcD5cbiI7CiAgICB9CgogICAgZnVuY3Rpb24gcHJlKCR0ZXh0KQogICAgewogICAgICAgIHJldHVybiAnPHByZT4nIC4gJHRleHQgLiAiPC9wcmU+XG4iOwogICAgfQoKICAgIGZ1bmN0aW9uIG9sKCRpdGVtcykKICAgIHsKICAgICAgICAkb3V0ID0gJzxvbD4nOwogICAgICAgIGZvcmVhY2ggKCRpdGVtcyBhcyAkaXRlbSkgewogICAgICAgICAgICAkb3V0IC49ICc8bGk+JyAuIHdvcmR3cmFwKCRpdGVtKSAuICI8L2xpPlxuIjsKICAgICAgICB9CiAgICAgICAgJG91dCAuPSAiPC9vbD5cbiI7CiAgICAgICAgcmV0dXJuICRvdXQ7CiAgICB9CgogICAgZnVuY3Rpb24gaCgkdGV4dCwgJG4pCiAgICB7CiAgICAgICAgcmV0dXJuICI8aCRuPiR0ZXh0PC9oJG4+XG4iOwogICAgfQoKICAgIGZ1bmN0aW9uIGgyKCR0ZXh0KQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+aCgkdGV4dCwgMik7CiAgICB9CgogICAgZnVuY3Rpb24gaDEoJHRleHQpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5oKCR0ZXh0LCAxKTsKICAgIH0KCiAgICBmdW5jdGlvbiBsaW5rKCRocmVmLCAkdGV4dD1udWxsKQogICAgewogICAgICAgIHJldHVybiAnPGEgaHJlZj0iJyAuICRocmVmIC4gJyI+JyAuICgkdGV4dCA/ICR0ZXh0IDogJGhyZWYpIC4gJzwvYT4nOwogICAgfQoKICAgIGZ1bmN0aW9uIGVuZCgpCiAgICB7CiAgICAgICAgcmV0dXJuICI8L2JvZHk+XG48L2h0bWw+XG4iOwogICAgfQp9CgppZiAoaXNzZXQoJF9TRVJWRVJbJ1JFUVVFU1RfTUVUSE9EJ10pKSB7CiAgICAkciA9IG5ldyBIVE1MKCk7Cn0gZWxzZSB7CiAgICAkciA9IG5ldyBQbGFpblRleHQoKTsKfQoKZnVuY3Rpb24gZGV0ZWN0X21hdGgoJHIsICYkb3V0KQp7CiAgICAkb3V0IC49ICRyLT5oMignTWF0aCBzdXBwb3J0Jyk7CiAgICAkZXh0ID0gQXV0aF9PcGVuSURfZGV0ZWN0TWF0aExpYnJhcnkoQXV0aF9PcGVuSURfbWF0aF9leHRlbnNpb25zKCkpOwogICAgaWYgKCFpc3NldCgkZXh0WydleHRlbnNpb24nXSkgfHwgIWlzc2V0KCRleHRbJ2NsYXNzJ10pKSB7CiAgICAgICAgJG91dCAuPSAkci0+cCgKICAgICAgICAgICAgJ1lvdXIgUEhQIGluc3RhbGxhdGlvbiBkb2VzIG5vdCBpbmNsdWRlIGJpZyBpbnRlZ2VyIG1hdGggJyAuCiAgICAgICAgICAgICdzdXBwb3J0LiBUaGlzIHN1cHBvcnQgaXMgcmVxdWlyZWQgaWYgeW91IHdpc2ggdG8gcnVuIGEgJyAuCiAgICAgICAgICAgICdzZWN1cmUgT3BlbklEIHNlcnZlciB3aXRob3V0IHVzaW5nIFNTTC4nKTsKICAgICAgICAkb3V0IC49ICRyLT5wKCdUbyB1c2UgdGhpcyBsaWJyYXJ5LCB5b3UgaGF2ZSBhIGZldyBvcHRpb25zOicpOwoKICAgICAgICAkZ21wX2xuayA9ICRyLT5saW5rKCdodHRwOi8vd3d3LnBocC5uZXQvbWFudWFsL2VuL3JlZi5nbXAucGhwJywgJ0dNUCcpOwogICAgICAgICRiY19sbmsgPSAkci0+bGluaygnaHR0cDovL3d3dy5waHAubmV0L21hbnVhbC9lbi9yZWYuYmMucGhwJywgJ2JjbWF0aCcpOwogICAgICAgICRvdXQgLj0gJHItPm9sKGFycmF5KAogICAgICAgICAgICAnSW5zdGFsbCB0aGUgJyAuICRnbXBfbG5rIC4gJyBQSFAgZXh0ZW5zaW9uJywKICAgICAgICAgICAgJ0luc3RhbGwgdGhlICcgLiAkYmNfbG5rIC4gJyBQSFAgZXh0ZW5zaW9uJywKICAgICAgICAgICAgJ0lmIHlvdXIgc2l0ZSBpcyBsb3ctc2VjdXJpdHksIGNhbGwgJyAuCiAgICAgICAgICAgICdBdXRoX09wZW5JRF9zZXROb01hdGhTdXBwb3J0KCksIGRlZmluZWQgaW4gQXV0aC9PcGVuSUQvQmlnTWF0aC5waHAuICcsCgkgICAgJ1RoZSBsaWJyYXJ5IHdpbGwgZnVuY3Rpb24sIGJ1dCAnIC4KICAgICAgICAgICAgJ3RoZSBzZWN1cml0eSBvZiB5b3VyIE9wZW5JRCBzZXJ2ZXIgd2lsbCBkZXBlbmQgb24gdGhlICcgLgogICAgICAgICAgICAnc2VjdXJpdHkgb2YgdGhlIG5ldHdvcmsgbGlua3MgaW52b2x2ZWQuIElmIHlvdSBhcmUgb25seSAnIC4KICAgICAgICAgICAgJ3VzaW5nIGNvbnN1bWVyIHN1cHBvcnQsIHlvdSBzaG91bGQgc3RpbGwgYmUgYWJsZSB0byBvcGVyYXRlICcgLgogICAgICAgICAgICAnc2VjdXJlbHkgd2hlbiB0aGUgdXNlcnMgYXJlIGNvbW11bmljYXRpbmcgd2l0aCBhICcgLgogICAgICAgICAgICAnd2VsbC1pbXBsZW1lbnRlZCBzZXJ2ZXIuJykpOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0gZWxzZSB7CiAgICAgICAgc3dpdGNoICgkZXh0WydleHRlbnNpb24nXSkgewogICAgICAgIGNhc2UgJ2JjbWF0aCc6CiAgICAgICAgICAgICRvdXQgLj0gJHItPnAoJ1lvdXIgUEhQIGluc3RhbGxhdGlvbiBoYXMgYmNtYXRoIHN1cHBvcnQuIFRoaXMgaXMgJyAuCiAgICAgICAgICAgICAgICAgICdhZGVxdWF0ZSBmb3Igc21hbGwtc2NhbGUgdXNlLCBidXQgY2FuIGJlIENQVS1pbnRlbnNpdmUuICcgLgogICAgICAgICAgICAgICAgICAnWW91IG1heSB3YW50IHRvIGxvb2sgaW50byBpbnN0YWxsaW5nIHRoZSBHTVAgZXh0ZW5zaW9uLicpOwogICAgICAgICAgICAkbG5rID0gJHItPmxpbmsoJ2h0dHA6Ly93d3cucGhwLm5ldC9tYW51YWwvZW4vcmVmLmdtcC5waHAnKTsKICAgICAgICAgICAgJG91dCAuPSAkci0+cCgnU2VlICcgLiAkbG5rIC4nIGZvciBtb3JlIGluZm9ybWF0aW9uICcgLgogICAgICAgICAgICAgICAgICAgICAgICAgICdhYm91dCB0aGUgR01QIGV4dGVuc2lvbi4nKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnZ21wJzoKICAgICAgICAgICAgJG91dCAuPSAkci0+cCgnWW91ciBQSFAgaW5zdGFsbGF0aW9uIGhhcyBnbXAgc3VwcG9ydC4gR29vZC4nKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgJGNsYXNzID0gJGV4dFsnY2xhc3MnXTsKICAgICAgICAgICAgJGxpYiA9IG5ldyAkY2xhc3MoKTsKICAgICAgICAgICAgJG9uZSA9ICRsaWItPmluaXQoMSk7CiAgICAgICAgICAgICR0d28gPSAkbGliLT5hZGQoJG9uZSwgJG9uZSk7CiAgICAgICAgICAgICR0ID0gJGxpYi0+dG9TdHJpbmcoJHR3byk7CiAgICAgICAgICAgICRvdXQgLj0gJHItPnAoJ1VoLW9oLiBJIGRvIG5vdCBrbm93IGFib3V0IHRoZSAnIC4KICAgICAgICAgICAgICAgICAgICAgICAgICAkZXh0WydleHRlbnNpb24nXSAuICcgZXh0ZW5zaW9uIScpOwogICAgICAgICAgICBpZiAoJHQgIT0gJzInKSB7CiAgICAgICAgICAgICAgICAkb3V0IC49ICRyLT5wKCdJdCBsb29rcyBsaWtlIGl0IGlzIGJyb2tlbi4gMSArIDEgPSAnIC4KICAgICAgICAgICAgICAgICAgdmFyX2V4cG9ydCgkdCwgZmFsc2UpKTsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICRvdXQgLj0gJHItPnAoJ0J1dCBpdCBzZWVtcyB0byBiZSBhYmxlIHRvIGFkZCBvbmUgYW5kIG9uZS4nKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gTWF0aCBsaWJyYXJ5IGlzIE9LCiAgICB9Cn0KCmZ1bmN0aW9uIGRldGVjdF9yYW5kb20oJHIsICYkb3V0KQp7CiAgICAkb3V0IC49ICRyLT5oMignQ3J5cHRvZ3JhcGhpYy1xdWFsaXR5IHJhbmRvbW5lc3Mgc291cmNlJyk7CiAgICBpZiAoQXV0aF9PcGVuSURfUkFORF9TT1VSQ0UgPT09IG51bGwpIHsKICAgICAgICAkb3V0IC49ICRyLT5wKCdVc2luZyAoaW5zZWN1cmUpIHBzZXVkb3JhbmRvbSBudW1iZXIgc291cmNlLCBiZWNhdXNlICcgLgogICAgICAgICAgICAgICAgICAgICAgJ0F1dGhfT3BlbklEX1JBTkRfU09VUkNFIGhhcyBiZWVuIGRlZmluZWQgYXMgbnVsbC4nKTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgJG1zZyA9ICdUaGUgbGlicmFyeSB3aWxsIHRyeSB0byBhY2Nlc3MgJyAuIEF1dGhfT3BlbklEX1JBTkRfU09VUkNFCiAgICAgICAgLiAnIGFzIGEgc291cmNlIG9mIHJhbmRvbSBkYXRhLiAnOwoKICAgICRudW1ieXRlcyA9IDY7CgogICAgJGYgPSBAZm9wZW4oQXV0aF9PcGVuSURfUkFORF9TT1VSQ0UsICdyJyk7CiAgICBpZiAoJGYgIT09IGZhbHNlKSB7CiAgICAgICAgJGRhdGEgPSBmcmVhZCgkZiwgJG51bWJ5dGVzKTsKICAgICAgICAkc3RhdCA9IGZzdGF0KCRmKTsKICAgICAgICAkc2l6ZSA9ICRzdGF0WydzaXplJ107CiAgICAgICAgZmNsb3NlKCRmKTsKICAgIH0gZWxzZSB7CiAgICAgICAgJGRhdGEgPSBudWxsOwogICAgICAgICRzaXplID0gdHJ1ZTsKICAgIH0KCiAgICBpZiAoJGYgIT09IGZhbHNlKSB7CiAgICAgICAgJGRhdGFvayA9IChBdXRoX09wZW5JRDo6Ynl0ZXMoJGRhdGEpID09ICRudW1ieXRlcyk7CiAgICAgICAgJG9rID0gJGRhdGFvayAmJiAhJHNpemU7CiAgICAgICAgJG1zZyAuPSAnSXQgc2VlbXMgdG8gZXhpc3QgJzsKICAgICAgICBpZiAoJGRhdGFvaykgewogICAgICAgICAgICAkbXNnIC49ICdhbmQgYmUgcmVhZGFibGUuIEhlcmUgaXMgc29tZSBoZXggZGF0YTogJyAuCiAgICAgICAgICAgICAgICBiaW4yaGV4KCRkYXRhKSAuICcuJzsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkbXNnIC49ICdidXQgcmVhZGluZyBkYXRhIGZhaWxlZC4nOwogICAgICAgIH0KICAgICAgICBpZiAoJHNpemUpIHsKICAgICAgICAgICAgJG1zZyAuPSAnIFRoaXMgaXMgYSAnIC4gJHNpemUgLiAnIGJ5dGUgZmlsZS4gVW5sZXNzIHlvdSBrbm93ICcgLgogICAgICAgICAgICAgICAgJ3doYXQgeW91IGFyZSBkb2luZywgaXQgaXMgbGlrZWx5IHRoYXQgeW91IGFyZSBtYWtpbmcgYSAnIC4KICAgICAgICAgICAgICAgICdtaXN0YWtlIGJ5IHVzaW5nIGEgcmVndWxhciBmaWxlIGFzIGEgcmFuZG9tbmVzcyBzb3VyY2UuJzsKICAgICAgICB9CiAgICB9IGVsc2UgewogICAgICAgICRtc2cgLj0gQXV0aF9PcGVuSURfUkFORF9TT1VSQ0UgLgogICAgICAgICAgICAnIGNvdWxkIG5vdCBiZSBvcGVuZWQuIFRoaXMgY291bGQgYmUgYmVjYXVzZSBvZiByZXN0cmljdGlvbnMgb24nIC4KICAgICAgICAgICAgJyB5b3VyIFBIUCBlbnZpcm9ubWVudCBvciB0aGF0IHJhbmRvbW5lc3Mgc291cmNlIG1heSBub3QgZXhpc3QnIC4KICAgICAgICAgICAgJyBvbiB0aGlzIHBsYXRmb3JtLic7CiAgICAgICAgaWYgKElTX1dJTkRPV1MpIHsKICAgICAgICAgICAgJG1zZyAuPSAnIFlvdSBzZWVtIHRvIGJlIHJ1bm5pbmcgV2luZG93cy4gVGhpcyBsaWJyYXJ5IGRvZXMgbm90JyAuCiAgICAgICAgICAgICAgICAnIGhhdmUgYWNjZXNzIHRvIGEgZ29vZCBzb3VyY2Ugb2YgcmFuZG9tbmVzcyBvbiBXaW5kb3dzLic7CiAgICAgICAgfQogICAgICAgICRvayA9IGZhbHNlOwogICAgfQoKICAgICRvdXQgLj0gJHItPnAoJG1zZyk7CgogICAgaWYgKCEkb2spIHsKICAgICAgICAkb3V0IC49ICRyLT5wKAogICAgICAgICAgICAnVG8gc2V0IGEgc291cmNlIG9mIHJhbmRvbW5lc3MsIGRlZmluZSBBdXRoX09wZW5JRF9SQU5EX1NPVVJDRSAnIC4KICAgICAgICAgICAgJ3RvIHRoZSBwYXRoIHRvIHRoZSByYW5kb21uZXNzIHNvdXJjZS4gSWYgeW91ciBwbGF0Zm9ybSBkb2VzICcgLgogICAgICAgICAgICAnbm90IHByb3ZpZGUgYSBzZWN1cmUgcmFuZG9tbmVzcyBzb3VyY2UsIHRoZSBsaWJyYXJ5IGNhbicgLgogICAgICAgICAgICAnb3BlcmF0ZSBpbiBwc2V1ZG9yYW5kb20gbW9kZSwgYnV0IGl0IGlzIHRoZW4gdnVsbmVyYWJsZSB0byAnIC4KICAgICAgICAgICAgJ3RoZW9yZXRpY2FsIGF0dGFja3MuIElmIHlvdSB3aXNoIHRvIG9wZXJhdGUgaW4gcHNldWRvcmFuZG9tICcgLgogICAgICAgICAgICAnbW9kZSwgZGVmaW5lIEF1dGhfT3BlbklEX1JBTkRfU09VUkNFIHRvIG51bGwuJyk7CiAgICAgICAgJG91dCAuPSAkci0+cCgnWW91IGFyZSBydW5uaW5nIG9uOicpOwogICAgICAgICRvdXQgLj0gJHItPnByZShwaHBfdW5hbWUoKSk7CiAgICAgICAgJG91dCAuPSAkci0+cCgnVGhlcmUgZG9lcyBub3Qgc2VlbSB0byBiZSBhbiBhdmFpbGFibGUgc291cmNlICcgLgogICAgICAgICAgICAgICAgICAgICAgJ29mIHJhbmRvbW5lc3MuIE9uIGEgVW5peC1saWtlIHBsYXRmb3JtICcgLgogICAgICAgICAgICAgICAgICAgICAgJyhpbmNsdWRpbmcgTWFjT1MgWCksIHRyeSAvZGV2L3JhbmRvbSBhbmQgJyAuCiAgICAgICAgICAgICAgICAgICAgICAnL2Rldi91cmFuZG9tLicpOwogICAgfQogICAgcmV0dXJuICRvazsKfQoKZnVuY3Rpb24gZGV0ZWN0X3N0b3JlcygkciwgJiRvdXQpCnsKICAgICRvdXQgLj0gJHItPmgyKCdEYXRhIHN0b3JhZ2UnKTsKCiAgICAkZm91bmQgPSBhcnJheSgpOwogICAgZm9yZWFjaCAoYXJyYXkoJ3NxbGl0ZScsICdteXNxbCcsICdwZ3NxbCcpIGFzICRkYmV4dCkgewogICAgICAgIGlmIChleHRlbnNpb25fbG9hZGVkKCRkYmV4dCkgfHwgQGRsKCRkYmV4dCAuICcuJyAuIFBIUF9TSExJQl9TVUZGSVgpKSB7CiAgICAgICAgICAgICRmb3VuZFtdID0gJGRiZXh0OwogICAgICAgIH0KICAgIH0KICAgIGlmIChjb3VudCgkZm91bmQpID09IDApIHsKICAgICAgICAkdGV4dCA9ICdObyBTUUwgZGF0YWJhc2Ugc3VwcG9ydCB3YXMgZm91bmQgaW4gdGhpcyBQSFAgJyAuCiAgICAgICAgICAgICdpbnN0YWxsYXRpb24uIFNlZSB0aGUgUEhQIG1hbnVhbCBpZiB5b3UgbmVlZCB0byAnIC4KICAgICAgICAgICAgJ3VzZSBhbiBTUUwgZGF0YWJhc2UuJzsKICAgIH0gZWxzZSB7CiAgICAgICAgJHRleHQgPSAnU3VwcG9ydCB3YXMgZm91bmQgZm9yICc7CiAgICAgICAgaWYgKGNvdW50KCRmb3VuZCkgPT0gMSkgewogICAgICAgICAgICAkdGV4dCAuPSAkZm91bmRbMF0gLiAnLic7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJGxhc3QgPSBhcnJheV9wb3AoJGZvdW5kKTsKICAgICAgICAgICAgJHRleHQgLj0gaW1wbG9kZSgnLCAnLCAkZm91bmQpIC4gJyBhbmQgJyAuICRsYXN0IC4gJy4nOwogICAgICAgIH0KCSR0ZXh0ID0gJHItPmIoJHRleHQpOwogICAgfQogICAgJHRleHQgLj0gJyBUaGUgbGlicmFyeSBzdXBwb3J0cyB0aGUgTXlTUUwsIFBvc3RncmVTUUwsIGFuZCBTUUxpdGUgJyAuCiAgICAgICAgJ2RhdGFiYXNlIGVuZ2luZXMsIGFzIHdlbGwgYXMgZmlsZXN5c3RlbS1iYXNlZCBzdG9yYWdlLiAgSW4gJyAuCiAgICAgICAgJ2FkZGl0aW9uLCBQRUFSIERCIGlzIHJlcXVpcmVkIHRvIHVzZSBkYXRhYmFzZXMuJzsKICAgICRvdXQgLj0gJHItPnAoJHRleHQpOwoKICAgIGlmIChmdW5jdGlvbl9leGlzdHMoJ3Bvc2l4X2dldHB3dWlkJykgJiYKICAgICAgICBmdW5jdGlvbl9leGlzdHMoJ3Bvc2l4X2dldGV1aWQnKSkgewogICAgICAgICRwcm9jZXNzVXNlciA9IHBvc2l4X2dldHB3dWlkKHBvc2l4X2dldGV1aWQoKSk7CiAgICAgICAgJHdlYl91c2VyID0gJHItPmIoJHItPnR0KCRwcm9jZXNzVXNlclsnbmFtZSddKSk7CiAgICB9IGVsc2UgewogICAgICAgICR3ZWJfdXNlciA9ICd0aGUgUEhQIHByb2Nlc3MnOwogICAgfQoKICAgIGlmIChpbl9hcnJheSgnc3FsaXRlJywgJGZvdW5kKSkgewogICAgICAgICRvdXQgLj0gJHItPnAoJ0lmIHlvdSBhcmUgdXNpbmcgU1FMaXRlLCB5b3VyIGRhdGFiYXNlIG11c3QgYmUgJyAuCiAgICAgICAgICAgICAgICAgICAgICAnd3JpdGFibGUgYnkgJyAuICR3ZWJfdXNlciAuICcgYW5kIG5vdCBhdmFpbGFibGUgb3ZlcicgLgogICAgICAgICAgICAgICAgICAgICAgJyB0aGUgd2ViLicpOwogICAgfQoKICAgICRiYXNlZGlyX3N0ciA9IGluaV9nZXQoJ29wZW5fYmFzZWRpcicpOwogICAgaWYgKGdldHR5cGUoJGJhc2VkaXJfc3RyKSA9PSAnc3RyaW5nJykgewogICAgICAgICR1cmwgPSAnaHR0cDovL3d3dy5waHAubmV0L21hbnVhbC9lbi9mZWF0dXJlcy5zYWZlLW1vZGUucGhwJyAuCiAgICAgICAgICAgICcjaW5pLm9wZW4tYmFzZWRpcic7CiAgICAgICAgJGxuayA9ICRyLT5saW5rKCR1cmwsICdvcGVuX2Jhc2VkaXInKTsKICAgICAgICAkb3V0IC49ICRyLT5wKCdJZiB5b3UgYXJlIHVzaW5nIGEgZmlsZXN5c3RlbS1iYXNlZCBzdG9yZSBvciBTUUxpdGUsICcgLgogICAgICAgICAgICAgICAgICAgICAgJ2JlIGF3YXJlIHRoYXQgJyAuICRsbmsgLiAnIGlzIGluIGVmZmVjdC4gVGhpcyBtZWFucyAnIC4KICAgICAgICAgICAgICAgICAgICAgICd0aGF0IHlvdXIgZGF0YSB3aWxsIGhhdmUgdG8gYmUgc3RvcmVkIGluIG9uZSBvZiB0aGUgJyAuCiAgICAgICAgICAgICAgICAgICAgICAnZm9sbG93aW5nIGxvY2F0aW9uczonKTsKICAgICAgICAkb3V0IC49ICRyLT5wcmUodmFyX2V4cG9ydCgkYmFzZWRpcl9zdHIsIHRydWUpKTsKICAgIH0gZWxzZSB7CiAgICAgICAgJG91dCAuPSAkci0+cCgnVGhlICcgLiAkci0+Yigkci0+dHQoJ29wZW5fYmFzZWRpcicpKSAuICcgY29uZmlndXJhdGlvbiByZXN0cmljdGlvbiAnIC4KCQkgICAgICAnaXMgbm90IGluIGVmZmVjdC4nKTsKICAgIH0KCiAgICAkb3V0IC49ICRyLT5wKCdJZiB5b3UgYXJlIHVzaW5nIHRoZSBmaWxlc3lzdGVtIHN0b3JlLCB5b3VyICcgLgogICAgICAgICAgICAgICAgICAnZGF0YSBkaXJlY3RvcnkgbXVzdCBiZSByZWFkYWJsZSBhbmQgd3JpdGFibGUgYnkgJyAuCiAgICAgICAgICAgICAgICAgICR3ZWJfdXNlciAuICcgYW5kIG5vdCBhdmFpbGFiZSBvdmVyIHRoZSBXZWIuJyk7CiAgICByZXR1cm4gdHJ1ZTsKfQoKZnVuY3Rpb24gZGV0ZWN0X3htbCgkciwgJiRvdXQpCnsKICAgIGdsb2JhbCAkX19BdXRoX1lhZGlzX3htbF9leHRlbnNpb25zOwoKICAgICRvdXQgLj0gJHItPmgyKCdYTUwgU3VwcG9ydCcpOwoKICAgIC8vIFRyeSB0byBnZXQgYW4gWE1MIGV4dGVuc2lvbi4KICAgICRleHQgPSBBdXRoX1lhZGlzX2dldFhNTFBhcnNlcigpOwoKICAgIGlmICgkZXh0ICE9PSBudWxsKSB7CiAgICAgICAgJG91dCAuPSAkci0+cCgnWE1MIHBhcnNpbmcgc3VwcG9ydCBpcyBwcmVzZW50IHVzaW5nIHRoZSAnLgogICAgICAgICAgICAgICAgICAgICAgJHItPmIoZ2V0X2NsYXNzKCRleHQpKS4nIGludGVyZmFjZS4nKTsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0gZWxzZSB7CiAgICAgICAgJG91dCAuPSAkci0+cCgnWE1MIHBhcnNpbmcgc3VwcG9ydCBpcyBhYnNlbnQ7IHBsZWFzZSBpbnN0YWxsIG9uZSAnLgogICAgICAgICAgICAgICAgICAgICAgJ29mIHRoZSBmb2xsb3dpbmcgUEhQIGV4dGVuc2lvbnM6Jyk7CiAgICAgICAgZm9yZWFjaCAoJF9fQXV0aF9ZYWRpc194bWxfZXh0ZW5zaW9ucyBhcyAkbmFtZSA9PiAkY2xzKSB7CiAgICAgICAgICAgICRvdXQgLj0gIjxsaT4iIC4gJHItPmIoJG5hbWUpIC4gIjwvbGk+IjsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQp9CgpmdW5jdGlvbiBkZXRlY3RfcXVlcnlfY29ycnVwdGlvbigkciwgJiRvdXQpCnsKICAgICRvdXQgLj0gJHItPmgyKCdRdWVyeSBDb3JydXB0aW9uJyk7CiAgICBpZiAoJF9TRVJWRVJbIlFVRVJZX1NUUklORyJdIT0idGVzdF9xdWVyeT1hJTI2YiIpCiAgICB7CiAgICAgICAgJG91dC49JHItPnAoIllvdXIgd2ViIHNlcnZlciBzZWVtcyB0byBjb3JydXB0IHF1ZXJpZXMuICBSZWNlaXZlZCAiLiRfU0VSVkVSWyJRVUVSWV9TVFJJTkciXS4iLCBleHBlY3RlZCBhPSUyNmIuIENoZWNrIGZvciBtb2RfZW5jb2RpbmcuIik7CglyZXR1cm4gZmFsc2U7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgJG91dC49JHItPnAoIllvdXIgd2ViIHNlcnZlciBkb2VzIG5vdCBjb3JydXB0IHF1ZXJpZXMuICBHb29kLiIpOwoJcmV0dXJuIHRydWU7CiAgICB9Cn0KICAgIApmdW5jdGlvbiBkZXRlY3RfZmV0Y2hlcigkciwgJiRvdXQpCnsKICAgICRvdXQgLj0gJHItPmgyKCdIVFRQIEZldGNoaW5nJyk7CgogICAgJHJlc3VsdCA9IEBpbmNsdWRlICdBdXRoL1lhZGlzL1lhZGlzLnBocCc7CgogICAgaWYgKCEkcmVzdWx0KSB7CiAgICAgICAgJG91dCAuPSAkci0+cCgnWWFkaXMgY29kZSB1bmF2YWlsYWJsZTsgY291bGQgbm90IHRlc3QgZmV0Y2hlciBzdXBwb3J0LicpOwoJcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIGlmIChBdXRoX1lhZGlzX1lhZGlzOjpjdXJsUHJlc2VudCgpKSB7CiAgICAgICAgJG91dCAuPSAkci0+cCgnVGhpcyBQSFAgaW5zdGFsbGF0aW9uIGhhcyBzdXBwb3J0IGZvciBsaWJjdXJsLiBHb29kLicpOwogICAgfSBlbHNlIHsKICAgICAgICAkb3V0IC49ICRyLT5wKCdUaGlzIFBIUCBpbnN0YWxsYXRpb24gZG9lcyBub3QgaGF2ZSBzdXBwb3J0IGZvciAnIC4KICAgICAgICAgICAgICAgICAgICAgICdsaWJjdXJsLiBDVVJMIGlzIG5vdCByZXF1aXJlZCBidXQgaXMgcmVjb21tZW5kZWQuICcuCiAgICAgICAgICAgICAgICAgICAgICAnVGhlIE9wZW5JRCBsaWJyYXJ5IHdpbGwgdXNlIGFuIGZzb2Nrb3BlbigpLWJhc2VkIGZldGNoZXIuJyk7CiAgICAgICAgJGxuayA9ICRyLT5saW5rKCdodHRwOi8vdXMzLnBocC5uZXQvbWFudWFsL2VuL3JlZi5jdXJsLnBocCcpOwogICAgICAgICRvdXQgLj0gJHItPnAoJ1NlZSAnIC4gJGxuayAuICcgYWJvdXQgZW5hYmxpbmcgdGhlIGxpYmN1cmwgc3VwcG9ydCAnIC4KICAgICAgICAgICAgICAgICAgICAgICdmb3IgUEhQLicpOwogICAgfQoKICAgICRvayA9IHRydWU7CiAgICAkZmV0Y2hlciA9IEF1dGhfWWFkaXNfWWFkaXM6OmdldEhUVFBGZXRjaGVyKCk7CiAgICAkZmV0Y2hfdXJsID0gJ2h0dHA6Ly93d3cub3BlbmlkZW5hYmxlZC5jb20vcmVzb3VyY2VzL3BocC1mZXRjaC10ZXN0JzsKICAgICRleHBlY3RlZF91cmwgPSAkZmV0Y2hfdXJsIC4gJy50eHQnOwogICAgJHJlc3VsdCA9ICRmZXRjaGVyLT5nZXQoJGZldGNoX3VybCk7CgogICAgaWYgKGlzc2V0KCRyZXN1bHQpKSB7CiAgICAgICAgJHBhcnRzID0gYXJyYXkoJ0FuIEhUVFAgcmVxdWVzdCB3YXMgY29tcGxldGVkLicpOwogICAgICAgIC8vIGxpc3QgKCRjb2RlLCAkdXJsLCAkZGF0YSkgPSAkcmVzdWx0OwogICAgICAgIGlmICgkcmVzdWx0LT5zdGF0dXMgIT0gJzIwMCcgJiYgJHJlc3VsdC0+c3RhdHVzICE9ICcyMDYnKSB7CiAgICAgICAgICAgICRvayA9IGZhbHNlOwogICAgICAgICAgICAkcGFydHNbXSA9ICRyLT5iKAogICAgICAgICAgICAgICAgc3ByaW50ZigKICAgICAgICAgICAgICAgICAgICAnR290ICVzIGluc3RlYWQgb2YgdGhlIGV4cGVjdGVkIEhUVFAgc3RhdHVzICcgLgogICAgICAgICAgICAgICAgICAgICdjb2RlICgyMDAgb3IgMjA2KS4nLCAkcmVzdWx0LT5zdGF0dXMpKTsKICAgICAgICB9CgogICAgICAgICR1cmwgPSAkcmVzdWx0LT5maW5hbF91cmw7CiAgICAgICAgaWYgKCR1cmwgIT0gJGV4cGVjdGVkX3VybCkgewogICAgICAgICAgICAkb2sgPSBmYWxzZTsKICAgICAgICAgICAgaWYgKCR1cmwgPT0gJGZldGNoX3VybCkgewogICAgICAgICAgICAgICAgJG1zZyA9ICdUaGUgcmVkaXJlY3RlZCBVUkwgd2FzIG5vdCByZXR1cm5lZC4nOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJG1zZyA9ICdBbiB1bmV4cGVjdGVkIFVSTCB3YXMgcmV0dXJuZWQ6IDwnIC4gJHVybCAuICc+Lic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJHBhcnRzW10gPSAkci0+YigkbXNnKTsKICAgICAgICB9CgogICAgICAgICRkYXRhID0gJHJlc3VsdC0+Ym9keTsKICAgICAgICBpZiAoJGRhdGEgIT0gJ0hlbGxvIFdvcmxkIScpIHsKICAgICAgICAgICAgJG9rID0gZmFsc2U7CiAgICAgICAgICAgICRwYXJ0c1tdID0gJHItPmIoJ1VuZXhwZWN0ZWQgZGF0YSB3YXMgcmV0dXJuZWQuJyk7CiAgICAgICAgfQogICAgICAgICRvdXQgLj0gJHItPnAoaW1wbG9kZSgnICcsICRwYXJ0cykpOwogICAgfSBlbHNlIHsKICAgICAgICAkb2sgPSBmYWxzZTsKICAgICAgICAkb3V0IC49ICRyLT5wKCdGZXRjaGluZyBVUkwgJyAuICRsbmsgLiAnIGZhaWxlZCEnKTsKICAgIH0KCiAgICBpZiAoJGZldGNoZXItPnN1cHBvcnRzU1NMKCkpIHsKICAgICAgICAkb3V0IC49ICRyLT5wKCdZb3VyIFBIUCBpbnN0YWxsYXRpb24gYXBwZWFycyB0byBzdXBwb3J0IFNTTCwgc28gaXQgJyAuCiAgICAgICAgICAgICAgICAgICAgICAnd2lsbCBiZSBhYmxlIHRvIHByb2Nlc3MgSFRUUFMgaWRlbnRpdHkgVVJMcyBhbmQgc2VydmVyIFVSTHMuJyk7CiAgICB9IGVsc2UgewogICAgICAgICRvdXQgLj0gJHItPnAoJ1lvdXIgUEhQIGluc3RhbGxhdGlvbiBkb2VzIG5vdCBzdXBwb3J0IFNTTCwgc28gaXQgJyAuCiAgICAgICAgICAgICAgICAgICAgICAnd2lsbCBOT1QgYmUgYWJsZSB0byBwcm9jZXNzIEhUVFBTIGlkZW50aXR5IFVSTHMgYW5kIHNlcnZlciBVUkxzLicpOwogICAgfQoKICAgIHJldHVybiAkb2s7Cn0KCmhlYWRlcignQ29udGVudC1UeXBlOiAnIC4gJHItPmNvbnRlbnRUeXBlKCkgLiAnOyBjaGFyc2V0PXVzLWFzY2lpJyk7CmlmICghJF9HRVRbInRlc3RfcXVlcnkiXSkKewogICAgaGVhZGVyKCJMb2NhdGlvbjogIi4kX1NFUlZFUlsnUEhQX1NFTEYnXS4iP3Rlc3RfcXVlcnk9YSUyNmIiKTsKfQogICAgCiAgICAkdGl0bGUgPSAnT3BlbklEIExpYnJhcnkgU3VwcG9ydCBSZXBvcnQnOwokb3V0ID0gJHItPnN0YXJ0KCR0aXRsZSkgLgogICAgJHItPmgxKCR0aXRsZSkgLgogICAgJHItPnAoJ1RoaXMgc2NyaXB0IGNoZWNrcyB5b3VyIFBIUCBpbnN0YWxsYXRpb24gdG8gZGV0ZXJtaW5lIGlmIHlvdSAnIC4KICAgICAgICAgICdhcmUgc2V0IHVwIHRvIHVzZSB0aGUgSmFuUmFpbiBQSFAgT3BlbklEIGxpYnJhcnkuJyk7CgokYm9keSA9ICcnOwoKJF9pbmNsdWRlID0gaW5jbHVkZSAnQXV0aC9PcGVuSUQucGhwJzsKCmlmICghJF9pbmNsdWRlKSB7CiAgICAkcGF0aCA9IGluaV9nZXQoJ2luY2x1ZGVfcGF0aCcpOwogICAgJGJvZHkgLj0gJHItPnAoCiAgICAgICAgJ0Nhbm5vdCBmaW5kIHRoZSBPcGVuSUQgbGlicmFyeS4gSXQgbXVzdCBiZSBpbiB5b3VyIFBIUCBpbmNsdWRlICcgLgogICAgICAgICdwYXRoLiBZb3VyIFBIUCBpbmNsdWRlIHBhdGggaXMgY3VycmVudGx5OicpOwogICAgJGJvZHkgLj0gJHItPnByZSgkcGF0aCk7Cn0gZWxzZSB7CiAgICAkc3RhdHVzID0gYXJyYXkoKTsKCiAgICAkc3RhdHVzW10gPSBkZXRlY3RfbWF0aCgkciwgJGJvZHkpOwogICAgJHN0YXR1c1tdID0gZGV0ZWN0X3JhbmRvbSgkciwgJGJvZHkpOwogICAgJHN0YXR1c1tdID0gZGV0ZWN0X3N0b3JlcygkciwgJGJvZHkpOwogICAgJHN0YXR1c1tdID0gZGV0ZWN0X2ZldGNoZXIoJHIsICRib2R5KTsKICAgICRzdGF0dXNbXSA9IGRldGVjdF94bWwoJHIsICRib2R5KTsKICAgICRzdGF0dXNbXSA9IGRldGVjdF9xdWVyeV9jb3JydXB0aW9uKCRyLCAkYm9keSk7CiAgICAkcmVzdWx0ID0gdHJ1ZTsKCiAgICBmb3JlYWNoICgkc3RhdHVzIGFzICR2KSB7CiAgICAgICAgaWYgKCEkdikgewogICAgICAgICAgICAkcmVzdWx0ID0gZmFsc2U7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoJHJlc3VsdCkgewogICAgICAgICRvdXQgLj0gJHItPmgyKCdTZXR1cCBDb21wbGV0ZSEnKTsKCSRvdXQgLj0gJHItPnAoJ1lvdXIgc3lzdGVtIHNob3VsZCBiZSByZWFkeSB0byBydW4gdGhlIE9wZW5JRCBsaWJyYXJ5LicpOwogICAgfSBlbHNlIHsKICAgICAgICAkb3V0IC49ICRyLT5oMignU2V0dXAgSW5jb21wbGV0ZScpOwoJJG91dCAuPSAkci0+cCgnWW91ciBzeXN0ZW0gbmVlZHMgYSBmZXcgY2hhbmdlcyBiZWZvcmUgaXQgd2lsbCBiZSByZWFkeSB0byBydW4gdGhlIE9wZW5JRCBsaWJyYXJ5LicpOwogICAgfQp9Cgokb3V0IC49ICRib2R5IC4gJHItPmVuZCgpOwpwcmludCAkb3V0Owo/Pgo=]]></data>
	</file>
	<file>
	  <filename>/openid-php-openid-782224d/NEWS</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[V2hhdCdzIE5ldyBpbiBQSFAgT3BlbklEIDIuMAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpUaGlzIGxpYnJhcnkgaW1wbGVtZW50cyBib3RoIHRoZSBPcGVuSUQgMSBhbmQgT3BlbklEIDIgcHJvdG9jb2xzLiAgVGhlCkFQSSBjaGFuZ2VzIGluIHRoaXMgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSBhcmUgbWluaW1hbCBhbmQgbW9zdGx5CmJhY2t3YXJkcy1jb21wYXRpYmxlIHdpdGggY3VycmVudCBSUCBhbmQgU2VydmVyIGltcGxlbWVudGF0aW9ucy4gIElmCnlvdSdyZSBhbHJlYWR5IHVzaW5nIHRoaXMgbGlicmFyeSBmb3IgT3BlbklEIDEsIG9ubHkgYSBmZXcgc21hbGwKY2hhbmdlcyAoc2VlIFN1bW1hcnkgYmVsb3cpIHdpbGwgYmUgbmVlZGVkIG9uY2UgeW91IHVwZ3JhZGUuCgpUaGUgYmlnIG5ld3MgaGVyZSBpcyBjb21wYXRpYmlsaXR5IHdpdGggdmVyc2lvbiAyLjAgb2YgdGhlIE9wZW5JRApwcm90b2NvbC4gIEhpZ2hsaWdodHMgaW5jbHVkZToKCiAqIFNpbXBsZSBSZWdpc3RyYXRpb24gc3VwcG9ydCBpbiBhIG5ldyBtb2R1bGUgQXV0aC9PcGVuSUQvU1JlZy5waHAuCiAgIChUaG9zZSBwcmV2aW91c2x5IHVzaW5nCiAgIEF1dGhfT3BlbklEX1N1Y2Nlc3NSZXNwb25zZTo6ZXh0ZW5zaW9uUmVzcG9uc2UoKSBhcmUgYWR2aXNlZCB0bwogICBsb29rIGhlcmUgYW5kIGF0IHRoZSBleGFtcGxlIGNvbnN1bWVyIGFuZCBzZXJ2ZXIgZm9yIGRldGFpbGVkIHVzYWdlCiAgIGluZm9ybWF0aW9uLikKICogT3BlbklEIHByb3ZpZGVyLWRyaXZlbiBpZGVudGlmaWVyIHNlbGVjdGlvbi4KICogIk5lZ290aWF0b3JzIiBhbGxvdyB5b3UgdG8gZGVmaW5lIHdoaWNoIGFzc29jaWF0aW9uIHR5cGVzIHRvIHVzZS4KICogSW1wcm92ZWQgZXhhbXBsZXMvZGV0ZWN0LnBocCBzY3JpcHQgKGJ1Z3MgZml4ZWQpCiAqIEltcHJvdmVkIGxheW91dCBvZiBleGFtcGxlIGNvbnN1bWVyIChzZWUgZXhhbXBsZXMvY29uc3VtZXIpCiAqIEFuIGltcHJvdmVkIEhUTUwgcGFyc2VyIGltcGxlbWVudGF0aW9uCiAqIExpYnJhcnkgaXMgbm93IGltbXVuZSB0byBiZWluZyBpbmNsdWRlZCBpbnNpZGUgZnVuY3Rpb25zIGFuZAogICBtZXRob2RzCiAqIEZpeGVzIHRvIGF2b2lkIG11bHRpYnl0ZSBvdmVybG9hZGluZyBwcm9ibGVtcwoKSWYgeW91J3ZlIHdyaXR0ZW4geW91ciBvd24gY3VzdG9tIHN0b3JlIG9yIGNvZGUgdGhhdCBpbnRlcmFjdHMKZGlyZWN0bHkgd2l0aCBpdCwgeW91J2xsIG5lZWQgdG8gcmV2aWV3IHRoZSBjaGFuZ2Ugbm90ZXMgZm9yCkF1dGhfT3BlbklEX0ludGVyZmFjZSBpbiBBdXRoL09wZW5JRC9JbnRlcmZhY2UucGhwLgoKClVwZ3JhZGluZyBmcm9tIGVhcmxpZXIgdmVyc2lvbnMgb2YgdGhpcyBsaWJyYXJ5Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpPbmUgb2YgdGhlIGFkZGl0aW9ucyB0byB0aGUgT3BlbklEIHByb3RvY29sIHdhcyBhIHNwZWNpZmllZCBub25jZQpmb3JtYXQgZm9yIG9uZS13YXkgbm9uY2VzLiAgQXMgYSByZXN1bHQsIHRoZSBub25jZSB0YWJsZSBpbiB0aGUKU1FMLWRyaXZlbiBzdG9yZXMgaGFzIGNoYW5nZWQuICBZb3UnbGwgbmVlZCB0byBydW4gdGhlIFB5dGhvbiBzY3JpcHQKY29udHJpYi91cGdyYWRlLXN0b3JlLTEuMS10by0yLjAgdG8gdXBncmFkZSB5b3VyIHN0b3JlLCBvciB5b3UnbGwKZW5jb3VudGVyIGVycm9ycyBhYm91dCB0aGUgd3JvbmcgbnVtYmVyIG9mIGNvbHVtbnMgaW4gdGhlIG9pZF9ub25jZXMKdGFibGUuICBUbyBydW4gdGhlIHNjcmlwdCwgeW91J2xsIG5lZWQgYSBweXRob24gbW9kdWxlIHN1cHBvcnRpbmcgeW91cgpkYXRhYmFzZSB0eXBlOiBweXNxbGl0ZTIsIHBzeWNvcGcsIG9yIE15U1FMZGIuCgpJZiB5b3UgY2Fubm90IHJ1biB0aGUgUHl0aG9uIHNjcmlwdCwgeW91IGNhbiByZS1jcmVhdGUgeW91ciBzdG9yZSBieQpkcm9wcGluZyB0aGUgdGFibGVzIGluIHRoZSBzdG9yZSBhbmQgY2FsbGluZyBjcmVhdGVUYWJsZXMoKSBvbiB0aGUKc3RvcmUgb2JqZWN0LgoKQ29uc3VtZXJzIHNob3VsZCBub3cgcGFzcyB0aGUgY29uc3VtZXIgcmV0dXJuX3RvIFVSTCB0bwpBdXRoX09wZW5JRF9Db25zdW1lcjo6Y29tcGxldGUoKSB0byBkZWZlbmQgYWdhaW5zdCByZXR1cm5fdG8gVVJMCnRhbXBlcmluZy4gIFRoaXMgaGFzIFJFUExBQ0VEIHRoZSBvbGQgcGFyYW1ldGVyLCAkcXVlcnkuICAkcXVlcnkgaXMKbm93IGEgc2Vjb25kIG9wdGlvbmFsIHBhcmFtZXRlci4gIEl0IGlzIFNUUk9OR0xZIFJFQ09NTUVOREVEIHRoYXQgeW91Cm5ldmVyIG92ZXJyaWRlICRxdWVyeSwgc2luY2UgdGhlIE9wZW5JRCBsaWJyYXJ5IHVzZXMgaXRzIG93biBsb2dpYyB0bwpzaWRlc3RlcCBQSFAncyBicm9rZW4gcmVxdWVzdC1wcm9jZXNzaW5nIGNvZGUuCgoKU3VtbWFyeSBvZiBBUEkgQ2hhbmdlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogLSBBdXRoX09wZW5JRDo6Zml4QXJncyBpcyBub3cgbm8gbG9uZ2VyIG5lY2Vzc2FyeSwgYW5kCkF1dGhfT3BlbklEX0NvbnN1bWVyOjpjb21wbGV0ZSBhbmQgQXV0aF9PcGVuSURfU2VydmVyOjpkZWNvZGVSZXF1ZXN0Cm5vIGxvbmdlciB0YWtlIHF1ZXJ5IGFyZ3VtZW50IGFycmF5cy4gICpZb3Ugc2hvdWxkIG5vIGxvbmdlciBwYXNzIGFueQpwYXJhbWV0ZXJzIHRvIHRoZXNlIG1ldGhvZHMuKgoKIC0gQXV0aF9PcGVuSURfU3VjY2Vzc1Jlc3BvbnNlOjpleHRlbnNpb25SZXNwb25zZSgpIGlzIG5vIGxvbmdlciB0aGUKcHJlZmVycmVkIHdheSB0byBleHRyYWN0IGV4dGVuc2lvbiByZXNwb25zZSBwYXJhbWV0ZXJzIGZyb20gdGhlIE9wZW5JRApyZXNwb25zZS4gIEluc3RlYWQsIHNlZSB0aGUgQXV0aC9PcGVuSUQvU1JlZy5waHAgbW9kdWxlIGFuZCB0aGUKZXhhbXBsZSBjb25zdW1lciBhbmQgc2VydmVyIGZvciBkZXRhaWxlZCB1c2FnZSBpbmZvcm1hdGlvbiBvbgpjb25zdHJ1Y3RpbmcgU2ltcGxlIFJlZ2lzdHJhdGlvbiByZXF1ZXN0cyBhbmQgaW5zcGVjdGluZyByZXNwb25zZXMuCmV4dGVuc2lvblJlc3BvbnNlKCkgaXMgc3RpbGwgdmFsaWQsIGJ1dCBub3cgdGFrZXMgYSBzZWNvbmQgcGFyYW1ldGVyCihib29sKSBpbmRpY2F0aW5nIHdoZXRoZXIgZXh0ZW5zaW9uIGFyZ3Mgc2hvdWxkIGJlIHNpZ25lZC4KCiAtIFRoZSBBdXRoX09wZW5JRF9TZXJ2ZXIncyByZXNwb25zZSBhbnN3ZXIoKSBtZXRob2Qgbm93IHRha2VzCmFkZGl0aW9uYWwgcGFyYW1ldGVycyB0byBzdXBwb3J0IHByb3ZpZGVyLWRyaXZlbiBpZGVudGlmaWVyIHNlbGVjdGlvbi4KU2VlIHRoZSBleGFtcGxlIHNlcnZlciBhbmQgdGhlIGRvY3VtZW50YXRpb24gZm9yCkF1dGhfT3BlbklEX0NoZWNrSURSZXF1ZXN0OjphbnN3ZXIuCgogLSBBdXRoX09wZW5JRF9Db25zdW1lcjo6Y29tcGxldGUoKSBub3cgdGFrZXMgdHdvIGFyZ3M6CgogICAtICRyZXR1cm5fdG8sIGEgcmVxdWlyZWQgc3RyaW5nIHRoYXQgaXMgdGhlIHJldHVybiBVUkwgcGFzc2VkIHRvCiAgICAgQXV0aF9PcGVuSURfQXV0aFJlcXVlc3Q6OnJlZGlyZWN0VVJMKCkKCiAgIC0gJHF1ZXJ5LCBhbiBvcHRpb25hbCBhcnJheSAob3IgbnVsbCBpZiBhYnNlbnQpIGRlbm90aW5nIHRoZSBxdWVyeQogICAgIHBhcmFtZXRlcnMgb2YgdGhlIE9wZW5JRCByZXNwb25zZS4gIElmIG51bGwsIHRoZSByZXNwb25zZSBkYXRhCiAgICAgd2lsbCBiZSBleHRyYWN0ZWQgZnJvbSB0aGUgUEhQIHJlcXVlc3QgZW52aXJvbm1lbnQuICBMaWJyYXJ5CiAgICAgdXNlcnMgU0hPVUxEIE5PVCBldmVyIHBhc3MgYW55dGhpbmcgZm9yICRxdWVyeSB1bmxlc3MgdGhleSdyZQogICAgIHRlc3RpbmcgdGhlIGxpYnJhcnku]]></data>
	</file>
	<file>
	  <filename>/openid-php-openid-782224d/README</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ClBIUCBPcGVuSUQKLS0tLS0tLS0tLQoKVGhpcyBpcyB0aGUgUEhQIE9wZW5JRCBsaWJyYXJ5IGJ5IEphblJhaW4sIEluYy4gIFlvdSBjYW4gdmlzaXQgb3VyCndlYnNpdGUgZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBwYWNrYWdlIGFuZCBvdGhlciBPcGVuSUQKaW1wbGVtZW50YXRpb25zIGFuZCB0b29sczoKCiAgaHR0cDovL3d3dy5vcGVuaWRlbmFibGVkLmNvbS8KCkdFVFRJTkcgU1RBUlRFRAo9PT09PT09PT09PT09PT0KCkZpcnN0LCBydW4gdGhlICdleGFtcGxlcy9kZXRlY3QucGhwJyBzY3JpcHQgZWl0aGVyIGZyb20gdGhlIGNvbW1hbmQKbGluZSBvciB2aWEgdGhlIHdlYi4gIEl0IHdpbGwgZ2VuZXJhdGUgYSByZXBvcnQgb2YgYW55IHN5c3RlbQpjb25maWd1cmF0aW9uIGNoYW5nZXMgbmVjZXNzYXJ5IHRvIHJ1biB0aGUgbGlicmFyeS4KCklOU1RBTExBVElPTgo9PT09PT09PT09PT0KCllvdSB3aWxsIG5lZWQgUEhQIDQuMy4wIG9yIGdyZWF0ZXIgdG8gdXNlIHRoaXMgbGlicmFyeS4gIFdlIGhhdmUKdGVzdGVkIHRoZSBsaWJyYXJ5IExpbnV4IG9uIFBIUCA0LjMuMCwgNC40LjEsIDUuMC41LCBhbmQgNS4xLjEuICBXZQpoYXZlIHRlc3RlZCB0aGUgbGlicmFyeSBvbiBXaW5kb3dzIFhQIG9uIFBIUCA0LjQuNC4KCkZvbGxvdyB0aGVzZSBzdGVwczoKCjEuIEluc3RhbGwgZGVwZW5kZW5jaWVzLgoKICAgLSBFbmFibGUgZWl0aGVyIHRoZSBHTVAgZXh0ZW5zaW9uIG9yIEJjbWF0aCBleHRlbnNpb24uIChHTVAgaXMKICAgICBTVFJPTkdMWSByZWNvbW1lbmRlZCBiZWNhdXNlIGl0J3MgTVVDSCBmYXN0ZXIhKSAgVGhpcyBpcwogICAgIHJlcXVpcmVkLgoKICAgLSBFbmFibGUgdGhlIENVUkwgZXh0ZW5zaW9uLgoKICAgLSBJZiB5b3UgcGxhbiB0byB1c2UgU1FMaXRlLCBQb3N0Z3JlU1FMLCBvciBNeVNRTCB0byBzdG9yZSBPcGVuSUQKICAgICBkYXRhLCB5b3UnbGwgbmVlZCBQRUFSIERCLiAgWW91IGNhbiBpbnN0YWxsIHRoaXMgYnkgcnVubmluZyB0aGlzCiAgICAgYXMgcm9vdDoKCiAgICAgIyBwZWFyIGluc3RhbGwgREIKCiAgICAgWW91J2xsIGFsc28gbmVlZCB0byBpbnN0YWxsIGFuZCBlbmFibGUgdGhlIGFwcHJvcHJpYXRlIFBIUAogICAgIGRhdGFiYXNlIGV4dGVuc2lvbi4gIEFsdGVybmF0aXZlbHksIHlvdSBjYW4gc3RvcmUgT3BlbklEIGRhdGEgb24KICAgICB0aGUgZmlsZXN5c3RlbSBpbnN0ZWFkIG9mIHVzaW5nIGEgcmVsYXRpb25hbCBkYXRhYmFzZS4gIE5vdGhpbmcKICAgICBzcGVjaWFsIGlzIHJlcXVpcmVkIGZvciB1c2luZyB0aGUgZmlsZXN5c3RlbSBtZXRob2QuCgogICAtIEluc3RhbGwgZWl0aGVyIHRoZSBET00gb3IgZG9teG1sIFBIUCBYTUwgcHJvY2Vzc2luZyBleHRlbnNpb24sCiAgICAgYnV0IG5vdCBib3RoICh0aGV5IGFyZSBpbmNvbXBhdGlibGUpLgoKMi4gQ29weSB0aGUgQXV0aC8gZGlyZWN0b3J5IGludG8geW91ciBQSFAgaW5jbHVkZSBwYXRoLgoKVEVTVElORyBZT1VSIFNFVFVQCj09PT09PT09PT09PT09PT09PQoKWW91IGNhbiB1c2UgdGhlIGV4YW1wbGUgY29kZSB0byB0ZXN0IHlvdXIgc2V0dXAuICBUbyBydW4gdGhlIGV4YW1wbGUKY29uc3VtZXIgb3Igc2VydmVyLCBmb2xsb3cgdGhlIGluc3RydWN0aW9ucyBpbiB0aGUgZXhhbXBsZXMvUkVBRE1FCmZpbGUuCgpVU0lORyBUSEUgQVBJCj09PT09PT09PT09PT0KClRoZSBiZXN0IHdheSB0byBnZXQgc3RhcnRlZCB1c2luZyB0aGUgQVBJIGlzIHRvIHRha2UgYSBsb29rIGF0IHRoZQpleGFtcGxlIGNvbnN1bWVyIGFuZCBzZXJ2ZXIgaW4gdGhlIGV4YW1wbGVzLyBkaXJlY3RvcnkuICBTZWUgdGhlCmV4YW1wbGVzL1JFQURNRSBmaWxlIGZvciBtb3JlIGRldGFpbHMuCgpUUk9VQkxFU0hPT1RJTkcKPT09PT09PT09PT09PT09CgoqIElmIHlvdSdyZSB1bmFibGUgdG8gdXNlIGFuIE9wZW5JRCBVUkwgd2l0aCB0aGUgbGlicmFyeSwgeW91IG1heSB3YW50CnRvIHRyeSB1c2luZyB0aGUgZGlzY292ZXIgdG9vbCAoZXhhbXBsZXMvZGlzY292ZXIucGhwKS4gIFRoaXMgdG9vbAp3aWxsIHBlcmZvcm0gT3BlbklEIGRpc2NvdmVyeSBvbiB0aGUgaWRlbnRpZmllciBhbmQgZ2l2ZSBhIGxpc3Qgb2YKZGlzY292ZXJlZCBPcGVuSUQgc2VydmljZXMgYW5kIHRoZWlyIHR5cGVzLgoKKiBPbiBzb21lIHN5c3RlbXMsIFBIUCBiYXNlZGlyIHJlc3RyaWN0aW9ucyBwcmV2ZW50IHdlYiBzZXJ2ZXJzIGZyb20Kb3BlbmluZyBhIHNvdXJjZSBvZiByYW5kb21uZXNzLCBzdWNoIGFzIC9kZXYvdXJhbmRvbS4gIElmIHlvdXIgUEhQCk9wZW5JRCBsaWJyYXJ5IGhhcyB0cm91YmxlIGdldHRpbmcgYSBzYXRpc2ZhY3Rvcnkgc291cmNlIG9mCnJhbmRvbW5lc3MsIGNoZWNrIHlvdXIgQXBhY2hlIGFuZCBQSFAgY29uZmlndXJhdGlvbnMgdG8gYmUgc3VyZSB0aGF0CnRoZSByYW5kb21uZXNzIHNvdXJjZSBpcyBpbiB0aGUgbGlzdCBvZiBhbGxvd2VkIHBhdGhzIGZvciB0aGUKIm9wZW5fYmFzZWRpciIgb3B0aW9uLgoKKiBJbiBzb21lIGNhc2VzLCBidWdzIGluIHRoZSBHTVAgbWF0aCBsaWJyYXJ5IHdpbGwgcmVzdWx0IGluIHNpZ25hdHVyZQp2YWxpZGF0aW9uIGVycm9ycyB3aGVuIHVzaW5nIHRoaXMgbGlicmFyeS4gIFNpbmNlIEdNUCBpcyBwcmVmZXJyZWQKb3ZlciBiY21hdGggKGZvciBwZXJmb3JtYW5jZSksIHlvdSB3aWxsIGhhdmUgdG8gZGVmaW5lCkF1dGhfT3BlbklEX0JVR0dZX0dNUCBpbiB5b3VyIGFwcGxpY2F0aW9uICpiZWZvcmUqIGltcG9ydGluZyBhbnkgb2YKdGhlIGxpYnJhcnkgY29kZToKCiAgZGVmaW5lKCdBdXRoX09wZW5JRF9CVUdHWV9HTVAnLCB0cnVlKTsKCiogTm90IGFsbCBQSFAgaW5zdGFsbGF0aW9ucyBzdXBwb3J0IFNTTC4gIFlvdSBjYW4gZmluZCBvdXQgaWYgeW91cnMKc3VwcG9ydHMgU1NMIGJ5IHJlYWRpbmcgdGhlICJIVFRQIEZldGNoaW5nIiBzZWN0aW9uIG9mIHRoZSBvdXRwdXQgb2YKImV4YW1wbGVzL2RldGVjdC5waHAuIiAgSWYgeW91ciBpbnN0YWxsYXRpb24gZG9lcyBub3Qgc3VwcG9ydCBTU0wsCnRoZW4gaHR0cHM6Ly8gaWRlbnRpdHkgVVJMcyBhbmQgc2VydmVyIFVSTHMgd2lsbCBub3QgYmUgc3VwcG9ydGVkIGJ5CnRoZSBsaWJyYXJ5LiAgQW4gYXR0ZW1wdCB0byB1c2Ugc3VjaCBhbiBpZGVudGl0eSBVUkwgd2lsbCBiZQplcXVpdmFsZW50IHRvIHVzaW5nIGFuIGludmFsaWQgT3BlbklELiAgVG8gZW5hYmxlIFNTTCBzdXBwb3J0LApyZWNvbXBpbGUgUEhQIHdpdGggT3BlblNTTCBzdXBwb3J0IG9yIGluc3RhbGwgdGhlIGFwcHJvcHJpYXRlIE9wZW5TU0wKbW9kdWxlIGZvciB5b3VyIHBsYXRmb3JtLiAgSWYgeW91IGFyZSB1c2luZyBDVVJMLCBDVVJMIHdpbGwgbmVlZCB0byBiZQpidWlsdCB3aXRoIE9wZW5TU0wgc3VwcG9ydC4KCkdFVFRJTkcgSEVMUAo9PT09PT09PT09PT0KCklmIHlvdSBoYXZlIGFueSBxdWVzdGlvbnMsIHJlY29tbWVuZGF0aW9ucywgb3IgcGF0Y2hlcywgcGxlYXNlIHRlbGwKdXMhICBTdWJzY3JpYmUgdG8gb3VyIE9wZW5JRCBkZXZlbG9wbWVudCBkaXNjdXNzaW9uIGxpc3QgYXQKCiAgaHR0cDovL29wZW5pZC5uZXQvZGV2ZWxvcGVycy9kZXYtbWFpbGluZy1saXN0cy8KCkRPQ1VNRU5UQVRJT04KPT09PT09PT09PT09PQoKWW91IGNhbiB2aWV3IHRoZSBIVE1MIGxpYnJhcnkgZG9jdW1lbnRhdGlvbiBpbiB0aGUgZG9jLyBkaXJlY3RvcnkuCgpUaGlzIHBhY2thZ2UncyBkb2N1bWVudGF0aW9uIGlzIGluIFBocERvYyBmb3JtYXQuICBUbyBnZW5lcmF0ZSB0aGUKZG9jdW1lbnRhdGlvbiwgaW5zdGFsbCBwaHBkb2MgYW5kIHJ1biB0aGUgYWRtaW4vbWFrZWRvYy5zaCBzY3JpcHQuClBocGRvYyBsaXZlcyBhdDoKCiAgaHR0cDovL3d3dy5waHBkb2Mub3JnLwoKQ09OVFJJQlVUSU5HCj09PT09PT09PT09PQoKSWYgeW91IGhhdmUgYSBidWdmaXggb3IgZmVhdHVyZSB5b3UnZCBsaWtlIHRvIGNvbnRyaWJ1dGUsIGRvbid0Cmhlc2l0YXRlIHRvIHNlbmQgaXQgdG8gdXMuICBQb3N0IHlvdXIgcGF0Y2ggdG8gdGhlIGRldmVsb3BtZW50IGxpc3QgYXQKCiAgaHR0cDovL29wZW5pZC5uZXQvZGV2ZWxvcGVycy9kZXYtbWFpbGluZy1saXN0cy8KCkZvciBtb3JlIGRldGFpbGVkIGluZm9ybWF0aW9uIG9uIGhvdyB0byBjb250cmlidXRlLCBzZWUKCiAgaHR0cDovL29wZW5pZGVuYWJsZWQuY29tL2NvbnRyaWJ1dGUvCgpUbyBydW4gdGhlIHRlc3Qgc3VpdGUgaW5jbHVkZWQgd2l0aCB0aGlzIHBhY2thZ2UsIGluc3RhbGwgUEhQVW5pdCAxLngKYW5kIHJ1bgoKICBwaHAgYWRtaW4vdGV4dHRlc3QucGhwCgpQSFBVbml0IDEueCBjYW4gYmUgZm91bmQgYXQKCiAgaHR0cDovL3BlYXIucGhwdW5pdC5kZS9nZXQvCg==]]></data>
	</file>
	<file>
	  <filename>/openid-php-openid-782224d/README.Debian</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[RGV2ZWxvcG1lbnQgRW52aXJvbm1lbnQgU2V0dXAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCkphbnJhaW4gbm90ZTogWW91J2xsIG5lZWQgdG8gcnVuIHRoZXNlIGNvbW1hbmRzIHRvIGdlbmVyYXRlCmRvY3VtZW50YXRpb24gZm9yIHRoaXMgcHJvamVjdDoKCiAgYXB0LWdldCBpbnN0YWxsIHBocDQtcGVhcgogIHBlYXIgaW5zdGFsbCBQaHBEb2N1bWVudG9yCg==]]></data>
	</file>
	<file>
	  <filename>/openid-php-openid-782224d/README.git</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R2l0SHViIGlzIHRoZSBuZXcgaG9tZSBmb3IgcGhwLW9wZW5pZCBsaWJyYXJ5IGRldmVsb3BtZW50LgoKVGhpcyBsaWJyYXJ5IHdhcyBvcmlnaW5hbGx5IHdyaXR0ZW4gYnkgSmFuUmFpbiBhbmQgbWFuYWdlZCB1c2luZyB0aGUgZGFyY3MgUkNTLiAgVGhpcyBmaWxlIGlzIGhvbWUgdG8gbm90ZXMgcmVnYXJkaW5nIHRoZSBtaWdyYXRpb24gZnJvbSBkYXJjcyB0byBnaXQsIGFuZCB0aGUgbW92ZSBmcm9tIG9wZW5pZGVuYWJsZWQuY29tIHRvIGdpdGh1Yi5jb20uCgpDb250YWN0OgpCcmlhbiBFbGxpbgpicmlhbkBqYW5yYWluLmNvbQo=]]></data>
	</file>
	<file>
	  <filename>/OpenID.module.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoKICogICAgICBDb3B5cmlnaHQgMjAxMCBIZW5yaWsgTGVubmFydHNzb24KICoKICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqCiAqICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKgogKi8KCmdsb2JhbCAkZ0NtczsKJGNvbmZpZyA9ICRnQ21zLT5HZXRDb25maWcoKTsKCmlmIChPcGVuSUQ6OkdldENvbmZpZ0Jvb2woJ29wZW5pZC5idWdneS5nbXAnKSkgewogICAgT3BlbklEOjpMb2coJ09wZW5JRC5tb2R1bGUucGhwIDogQWRhcHRpbmcgdG8gYnVnZ3kgR01QIGltcGxlbWVudGF0aW9uJyk7CiAgICAvLyBTZWUgUkVBRE1FIGZvciBpbmZvLCByZXF1aXJlZCBiZWNhdXNlIG9mIGJ1Z2d5IEdNUAogICAgZGVmaW5lKCdBdXRoX09wZW5JRF9CVUdHWV9HTVAnLCBUUlVFKTsKfQoKaWYgKE9wZW5JRDo6R2V0Q29uZmlnQm9vbCgnb3BlbmlkLmluc2VjdXJlLnJhbmQnKSkgewogICAgT3BlbklEOjpMb2coJ09wZW5JRC5tb2R1bGUucGhwIDogVXNpbmcgaW5zZWN1cmUgcmFuZCBmdW5jdGlvbicpOwogICAgLy8gU2hvdWxkIHVzZSBpbnNlY3VyZSByYW5kb20gc291cmNlIG9uIHdpbmRvd3MKICAgIGRlZmluZSgnQXV0aF9PcGVuSURfUkFORF9TT1VSQ0UnLCBudWxsKTsKfQoKaWYgKE9wZW5JRDo6R2V0Q29uZmlnQm9vbCgnb3BlbmlkLmNhLm92ZXJyaWRlJykpIHsKICAgIE9wZW5JRDo6TG9nKCdPcGVuSUQubW9kdWxlLnBocCA6IE92ZXJyaWRpbmcgZGVmYXVsdCBDQSBmaWxlJyk7CiAgICAvLyBBZGRlZCB0byBzdXBwb3J0IGN1cmwgd2l0aCBvbGQgcm9vdCBjZXJ0IGZpbGUKICAgIC8vIERvd25sb2FkIGNhY2VydC5wZW0gZnJvbSBodHRwOi8vY3VybC5oYXh4LnNlL2RvY3MvY2FleHRyYWN0Lmh0bWwgYW5kIHBsYWNlIGl0IGluIHlvdXIgT3BlbklEIGRpcmVjdG9yeQoKICAgIGRlZmluZSgnQXV0aF9PcGVuSURfQ1VSTE9QVF9DQUlORk8nLCAkY29uZmlnWydyb290X3BhdGgnXS4nL21vZHVsZXMvT3BlbklEL2NhY2VydC5wZW0nKTsKfQoKZGVmaW5lKCdPcGVuSURNb2R1bGVfT1BFTklEX0RJUicsICdvcGVuaWQtcGhwLW9wZW5pZC03ODIyMjRkLycpOwoKJHBhdGhfZXh0cmEgPSBkaXJuYW1lKGRpcm5hbWUoZGlybmFtZShfX0ZJTEVfXykpKTsKJHBhdGggPSBpbmlfZ2V0KCdpbmNsdWRlX3BhdGgnKTsKJHBhdGggPSAkcGF0aF9leHRyYSAuIFBBVEhfU0VQQVJBVE9SIC4gZGlybmFtZShfX0ZJTEVfXykgLiBQQVRIX1NFUEFSQVRPUiAuICRwYXRoIC4gUEFUSF9TRVBBUkFUT1IgLiBkaXJuYW1lKF9fRklMRV9fKS4nLycuT3BlbklETW9kdWxlX09QRU5JRF9ESVI7CmluaV9zZXQoJ2luY2x1ZGVfcGF0aCcsICRwYXRoKTsKCnJlcXVpcmVfb25jZSBPcGVuSURNb2R1bGVfT1BFTklEX0RJUi4iQXV0aC9PcGVuSUQvQ29uc3VtZXIucGhwIjsKCiRkaXJuYW1lID0gZGlybmFtZShfX0ZJTEVfXyk7CnJlcXVpcmVfb25jZSgkZGlybmFtZS5ESVJFQ1RPUllfU0VQQVJBVE9SLidsaWIvY2xhc3MuQ01TTVNEYXRhYmFzZUNvbm5lY3Rpb24ucGhwJyk7CnJlcXVpcmVfb25jZSBPcGVuSURNb2R1bGVfT1BFTklEX0RJUi4iQXV0aC9PcGVuSUQvTXlTUUxTdG9yZS5waHAiOwoKcmVxdWlyZV9vbmNlIE9wZW5JRE1vZHVsZV9PUEVOSURfRElSLiJBdXRoL09wZW5JRC9TUmVnLnBocCI7CnJlcXVpcmVfb25jZSBPcGVuSURNb2R1bGVfT1BFTklEX0RJUi4iQXV0aC9PcGVuSUQvQVgucGhwIjsKcmVxdWlyZV9vbmNlIE9wZW5JRE1vZHVsZV9PUEVOSURfRElSLiJBdXRoL09wZW5JRC9QQVBFLnBocCI7CgpnbG9iYWwgJHBhcGVfcG9saWN5X3VyaXM7CiRwYXBlX3BvbGljeV91cmlzID0gYXJyYXkoCiAgICAgIFBBUEVfQVVUSF9NVUxUSV9GQUNUT1JfUEhZU0lDQUwsCiAgICAgIFBBUEVfQVVUSF9NVUxUSV9GQUNUT1IsCiAgICAgIFBBUEVfQVVUSF9QSElTSElOR19SRVNJU1RBTlQKICAgICAgKTsKCnJlcXVpcmVfb25jZSAnZmFjZWJvb2tfMl8xXzIvZmFjZWJvb2sucGhwJzsKCmNsYXNzIE9wZW5JRCBleHRlbmRzIENNU01vZHVsZSB7CgogICAgLy8gQkVHSU4gTW9kdWxlIEludGVyZmFjZQoKICAgIGZ1bmN0aW9uIEdldE5hbWUoKSB7CiAgICAgICAgcmV0dXJuICdPcGVuSUQnOwogICAgfQoKICAgIGZ1bmN0aW9uIEdldEZyaWVuZGx5TmFtZSgpIHsKICAgICAgICByZXR1cm4gJHRoaXMtPkxhbmcoJ2ZyaWVuZGx5bmFtZScpOwogICAgfQoKICAgIGZ1bmN0aW9uIEdldFZlcnNpb24oKSB7CiAgICAgICAgcmV0dXJuICcxLjAuMCc7CiAgICB9CgogICAgZnVuY3Rpb24gR2V0SGVscCgpIHsKICAgICAgICByZXR1cm4gJHRoaXMtPkxhbmcoJ2hlbHAnKTsKICAgIH0KCiAgICBmdW5jdGlvbiBHZXRBdXRob3IoKSB7CiAgICAgICAgcmV0dXJuICdIZW5yaWsgTGVubmFydHNzb24nOwogICAgfQoKICAgIGZ1bmN0aW9uIEdldEF1dGhvckVtYWlsKCkgewogICAgICAgIHJldHVybiAnb3BlbmlkQGxlbm5hcnRzc29ucy5uZXQnOwogICAgfQoKICAgIGZ1bmN0aW9uIEdldENoYW5nZUxvZygpIHsKICAgICAgICByZXR1cm4gJHRoaXMtPkxhbmcoJ2NoYW5nZWxvZycpOwogICAgfQoKICAgIGZ1bmN0aW9uIElzUGx1Z2luTW9kdWxlKCkgewogICAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIGZ1bmN0aW9uIEhhc0FkbWluKCkgewogICAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIGZ1bmN0aW9uIEdldEFkbWluU2VjdGlvbigpIHsKICAgICAgICByZXR1cm4gJ3VzZXJzZ3JvdXBzJzsKICAgIH0KCiAgICBmdW5jdGlvbiBHZXRBZG1pbkRlc2NyaXB0aW9uKCkgewogICAgICAgIHJldHVybiAkdGhpcy0+TGFuZygnbW9kZGVzY3JpcHRpb24nKTsKICAgIH0KCiAgICBmdW5jdGlvbiBWaXNpYmxlVG9BZG1pblVzZXIoKSB7CiAgICAgICAgcmV0dXJuIFRSVUU7CiAgICB9CgogICAgZnVuY3Rpb24gR2V0RGFzaGJvYXJkT3V0cHV0KCkgewogICAgICAgIHJldHVybiAkdGhpcy0+TGFuZygnZGFzaGJvYXJkX291dHB1dCcpOwogICAgfQoKICAgIGZ1bmN0aW9uIEdldE5vdGlmaWNhdGlvbk91dHB1dCgkcHJpb3JpdHk9MikgewogICAgICAgIHJldHVybiAnJzsKICAgIH0KCiAgICBmdW5jdGlvbiBHZXREZXBlbmRlbmNpZXMoKSB7CiAgICAgICAgcmV0dXJuIGFycmF5KCk7CiAgICB9CgogICAgZnVuY3Rpb24gTWluaW11bUNNU1ZlcnNpb24oKSB7CiAgICAgICAgcmV0dXJuICIxLjAiOwogICAgfQoKICAgIGZ1bmN0aW9uIFNldFBhcmFtZXRlcnMoKSB7CiAgICAgICAgJHRoaXMtPlJlZ2lzdGVyTW9kdWxlUGx1Z2luKCk7CiAgICAgICAgJHRoaXMtPlNldFBhcmFtZXRlclR5cGUoJ29wZW5pZF91c2VybmFtZScsIENMRUFOX1NUUklORyk7CiAgICAgICAgJHRoaXMtPlNldFBhcmFtZXRlclR5cGUoJ29wZW5pZF9pZGVudGlmaWVyJywgQ0xFQU5fU1RSSU5HKTsKICAgICAgICAkdGhpcy0+U2V0UGFyYW1ldGVyVHlwZSgnbWFjdCcsIENMRUFOX1NUUklORyk7CiAgICAgICAgJHRoaXMtPlNldFBhcmFtZXRlclR5cGUoJ3BhZ2UnLCBDTEVBTl9TVFJJTkcpOwogICAgfQoKICAgIGZ1bmN0aW9uIEdldEV2ZW50RGVzY3JpcHRpb24oJGV2ZW50bmFtZSkgewogICAgICAgIHJldHVybiAkdGhpcy0+TGFuZygnZXZlbnRfaW5mb18nIC4gJGV2ZW50bmFtZSk7CiAgICB9CgogICAgZnVuY3Rpb24gR2V0RXZlbnRIZWxwKCRldmVudG5hbWUpIHsKICAgICAgICByZXR1cm4gJHRoaXMtPkxhbmcoJ2V2ZW50X2hlbHBfJyAuICRldmVudG5hbWUpOwogICAgfQoKICAgIGZ1bmN0aW9uIEluc3RhbGxQb3N0TWVzc2FnZSgpIHsKICAgICAgICByZXR1cm4gJHRoaXMtPkxhbmcoJ3Bvc3RpbnN0YWxsJyk7CiAgICB9CgogICAgZnVuY3Rpb24gVW5pbnN0YWxsUG9zdE1lc3NhZ2UoKSB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5MYW5nKCdwb3N0dW5pbnN0YWxsJyk7CiAgICB9CgogICAgZnVuY3Rpb24gVW5pbnN0YWxsUHJlTWVzc2FnZSgpIHsKICAgICAgICByZXR1cm4gJHRoaXMtPkxhbmcoJ3JlYWxseV91bmluc3RhbGwnKTsKICAgIH0KCiAgICBmdW5jdGlvbiBEb0FjdGlvbigkYWN0aW9uLCAkaWQsICRwYXJhbXMsICRyZXR1cm5pZD0tMSkgewogICAgICAgIGdsb2JhbCAkZ0NtczsKICAgICAgICAkc21hcnR5ID0gJiAkZ0Ntcy0+R2V0U21hcnR5KCk7CiAgICAgICAgJHNtYXJ0eS0+YXNzaWduKCdvcGVuaWRhY3Rpb25pZCcsICRpZCk7CiAgICAgICAgJHNtYXJ0eS0+YXNzaWduKCdvcGVuaWRhY3Rpb25wYXJhbXMnLCAkcGFyYW1zKTsKICAgICAgICAkc21hcnR5LT5hc3NpZ24oJ29wZW5pZGpxdWVyeXBsdWdpbl9wYXRoJywgJGdDbXMtPmNvbmZpZ1sncm9vdF91cmwnXS4nL21vZHVsZXMvT3BlbklEL2pRdWVyeU9wZW5JZFBsdWdpbicpOwogICAgICAgICRzbWFydHktPmFzc2lnbignbW9kJywgJHRoaXMpOwogICAgICAgICRzbWFydHktPmFzc2lnbigkdGhpcy0+R2V0TmFtZSgpLCAkdGhpcyk7CiAgICAgICAgcGFyZW50OjpEb0FjdGlvbigkYWN0aW9uLCAkaWQsICRwYXJhbXMsICRyZXR1cm5pZCk7CiAgICB9CgogICAgLy8gRU5EIE1vZHVsZSBJbnRlcmZhY2UKCiAgICBmdW5jdGlvbiBfR2V0QXNzb2NpYXRpb25zVGFibGVOYW1lKCkgewogICAgICAgIHJldHVybiBjbXNfZGJfcHJlZml4KCkgLiAibW9kdWxlX29wZW5pZF9hc3NvY2lhdGlvbnMiOwogICAgfQoKICAgIGZ1bmN0aW9uIF9HZXROb25jZXNUYWJsZU5hbWUoKSB7CiAgICAgICAgcmV0dXJuIGNtc19kYl9wcmVmaXgoKSAuICJtb2R1bGVfb3BlbmlkX25vbmNlcyI7CiAgICB9CgogICAgZnVuY3Rpb24gX0dldFN0b3JlTXlzcWwoKSB7CgogICAgICAgIC8vIENyZWF0ZSBkYXRhYmFzZSBjb25uZWN0aW9uIGJhc2VkIG9uIENNU01TIGNvbm5lY3Rpb24KICAgICAgICAkZGIgPSBuZXcgQ01TTVNEYXRhYmFzZUNvbm5lY3Rpb24oKTsKCiAgICAgICAgLy8gY3JlYXRlIE15U1FMIGRhdGFiYXNlIHN0b3JhZ2UgYXJlYSBmb3IgT3BlbklEIGRhdGEKICAgICAgICAkc3RvcmUgPSBuZXcgQXV0aF9PcGVuSURfTXlTUUxTdG9yZSgkZGIsICR0aGlzLT5fR2V0QXNzb2NpYXRpb25zVGFibGVOYW1lKCksICR0aGlzLT5fR2V0Tm9uY2VzVGFibGVOYW1lKCkpOwoKICAgICAgICByZXR1cm4gJHN0b3JlOwogICAgfQoKICAgIC8qKgogICAgICogQ3JlYXRlcyBhbiBPcGVuSUQgY29uc3VtZXIKICAgICAqIEByZXR1cm4gQXV0aF9PcGVuSURfQ29uc3VtZXIKICAgICAqLwogICAgZnVuY3Rpb24gR2V0Q29uc3VtZXIoKSB7CiAgICAgICAgJHN0b3JlID0gJHRoaXMtPl9HZXRTdG9yZU15c3FsKCk7CiAgICAgICAgJGNvbnN1bWVyID0gbmV3IEF1dGhfT3BlbklEX0NvbnN1bWVyKCRzdG9yZSk7CiAgICAgICAgcmV0dXJuICRjb25zdW1lcjsKICAgIH0KCiAgICBmdW5jdGlvbiBnZXRTY2hlbWUoKSB7CiAgICAgICAgJHNjaGVtZSA9ICdodHRwJzsKICAgICAgICBpZiAoaXNzZXQoJF9TRVJWRVJbJ0hUVFBTJ10pIGFuZCAkX1NFUlZFUlsnSFRUUFMnXSA9PSAnb24nKSB7CiAgICAgICAgICAgICRzY2hlbWUgLj0gJ3MnOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJHNjaGVtZTsKICAgIH0KCiAgICAvKioKICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICRpZGVudGl0eV91cmwKICAgICAqIEBwYXJhbSBzdHJpbmcgJHByb3ZpZGVyCiAgICAgKiBAcmV0dXJuIGludCB0aGUgdWlkIG9mIHRoZSB1c2VyLCBmYWxzZSBpZiBub3QgZm91bmQKICAgICAqLwogICAgZnVuY3Rpb24gR2V0VXNlcklkKCRpZGVudGl0eV91cmwpIHsKICAgICAgICBnbG9iYWwgJGdDbXM7CiAgICAgICAgLyogQHZhciAkZGIgQURPQ29ubmVjdGlvbiAqLwogICAgICAgICRkYiA9ICYgJHRoaXMtPkdldERiKCk7CiAgICAgICAgJHByb3ZpZGVyID0gJHRoaXMtPl9HZXRQcm92aWRlcklkKCRpZGVudGl0eV91cmwpOwogICAgICAgICRxdWVyeSA9ICJTRUxFQ1QgaWQgRlJPTSAiIC4gY21zX2RiX3ByZWZpeCgpIC4gIm1vZHVsZV9vcGVuaWRfdXNlcnMgd2hlcmUgb3BlbmlkX2lkZW50aXR5ID0gPyBhbmQgcHJvdmlkZXIgPSA/IjsKICAgICAgICAkdGhpcy0+TG9nKCRxdWVyeSAuICIgIiAuICRpZGVudGl0eV91cmwgLiAiICIgLiAkcHJvdmlkZXIpOwogICAgICAgIC8qIEB2YXIgJHJlc3VsdCBwZWFyX1Jlc3VsdFNldCAqLwogICAgICAgICRyZXN1bHQgPSAkZGItPkV4ZWN1dGUoJHF1ZXJ5LCBhcnJheSgkaWRlbnRpdHlfdXJsLCAkcHJvdmlkZXIpKTsKICAgICAgICBpZiAoISRyZXN1bHQgfHwgJHJlc3VsdC0+TnVtUm93cygpID09IDApIHsKICAgICAgICAgICAgJHRoaXMtPkxvZygiQ291bGQgbm90IGZpbmQgdXNlciBmb3IgaWRlbnRpdHkgIiAuICRpZGVudGl0eV91cmwgLiAiIGFuZCBwcm92aWRlciAiIC4gJHByb3ZpZGVyKTsKICAgICAgICB9CiAgICAgICAgJHJzID0gJHJlc3VsdC0+RmV0Y2hSb3coKTsKICAgICAgICByZXR1cm4gJHJzID8gJHJzWydpZCddIDogRkFMU0U7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIGFycmF5IGNvbnRhaW5pbmcgb25lIGFycmF5IGZvciBlYWNoIE9wZW5JRCBwcm92aWRlciB0aGUgdXNlcgogICAgICogaGFzIHJlZ2lzdGVyZWQuIEFycmF5IHZhbHVlcyBhcmUKICAgICAqICAgcHJvdmlkZXIgOiBUaGUgaWQgb2YgdGhlIE9wZW5JRCBwcm92aWRlcgogICAgICogICBvcGVuaWRfaWRlbnRpdHkgOiBUaGUgaWRlbnRpZmllciBzdXBwbGllZCBieSB0aGUgcHJvdmlkZXIgdXBvbiBzdWNjZXNzZnVsIGF1dGhlbnRpY2F0aW9uCiAgICAgKiAgIGVtYWlsIDogVGhlIHVzZXIgZW1haWwgaWYgc2VudCBieSB0aGUgT3BlbklEIHByb3ZpZGVyCiAgICAgKgogICAgICogUmV0dXJucyBlbXB0eSBhcnJheSBpZiB1c2VyIGlzIG5vdCBsb2dnZWQgaW4KICAgICAqIAogICAgICogQHJldHVybiBhcnJheSAKICAgICAqLwogICAgZnVuY3Rpb24gR2V0UmVnaXN0ZXJlZE9wZW5JRHMoKSB7CiAgICAgICAgJG9wZW5pZHMgPSBhcnJheSgpOwogICAgICAgIGdsb2JhbCAkZ0NtczsKICAgICAgICAvKiBAdmFyICRmZXUgRnJvbnRFbmRVc2VycyAqLwogICAgICAgICRmZXUgPSAkdGhpcy0+R2V0TW9kdWxlSW5zdGFuY2UoJ0Zyb250RW5kVXNlcnMnKTsKICAgICAgICBpZiAoISRmZXUtPkxvZ2dlZEluKCkpIHsKICAgICAgICAgICAgcmV0dXJuICRvcGVuaWRzOwogICAgICAgIH0KICAgICAgICAkdWlkID0gJGZldS0+TG9nZ2VkSW5JZCgpOwogICAgICAgIC8qIEB2YXIgJGRiIEFET0Nvbm5lY3Rpb24gKi8KICAgICAgICAkZGIgPSAmICR0aGlzLT5HZXREYigpOwogICAgICAgICRxdWVyeSA9ICJTRUxFQ1Qgb3BlbmlkX2lkZW50aXR5LCBwcm92aWRlciwgZW1haWwgRlJPTSAiIC4gY21zX2RiX3ByZWZpeCgpIC4gIm1vZHVsZV9vcGVuaWRfdXNlcnMgd2hlcmUgaWQgPSA/IjsKICAgICAgICAkdGhpcy0+TG9nKCRxdWVyeSAuICIgIiAuICR1aWQpOwogICAgICAgIC8qIEB2YXIgJHJlc3VsdCBwZWFyX1Jlc3VsdFNldCAqLwogICAgICAgICRyZXN1bHQgPSAkZGItPkV4ZWN1dGUoJHF1ZXJ5LCBhcnJheSgkdWlkKSk7CiAgICAgICAgaWYgKCEkcmVzdWx0IHx8ICRyZXN1bHQtPk51bVJvd3MoKSA9PSAwKSB7CiAgICAgICAgICAgICR0aGlzLT5Mb2coIk5vIHByb3ZpZGVycyByZWdpc3RlcmVkIGZvciB1c2VyICIuJHVpZCk7CiAgICAgICAgICAgIHJldHVybiAkb3BlbmlkczsKICAgICAgICB9CiAgICAgICAgZm9yICgkaW5kZXggPSAwOyAkaW5kZXggPCAkcmVzdWx0LT5OdW1Sb3dzKCk7ICRpbmRleCsrKSB7CiAgICAgICAgICAgICRyb3cgPSAkcmVzdWx0LT5GZXRjaFJvdygpOwogICAgICAgICAgICAkb3Blbmlkc1tdID0gJHJvdzsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICRvcGVuaWRzOwogICAgfQoKICAgIC8qKgogICAgICogUmVnaXN0ZXIgYW4gT3BlbklEIGlkZW50aXR5IHNlcnZlZCBieSBhIHByb3ZpZGVyIHdpdGggYSB1c2VyLgogICAgICoKICAgICAqIEBwYXJhbSA8dHlwZT4gJHVpZCBUaGUgdW5pcXVlIHVzZXIgaWRlbnRpZmllcgogICAgICogQHBhcmFtIDx0eXBlPiAkaWRlbnRpdHlfdXJsIFRoZSBpZGVudGl0eSBVUkwgcHJvdmlkZWQgYnkgT3BlbklECiAgICAgKiBAcGFyYW0gc3RyaW5nIGVtYWlsIFRoZSB1c2VycyBlbWFpbCwgY2FuIGJlIGVtcHR5CiAgICAgKi8KICAgIGZ1bmN0aW9uIFJlZ2lzdGVyT3BlbklEKCR1aWQsICRpZGVudGl0eV91cmwsICRlbWFpbCA9ICcnKSB7CiAgICAgICAgZ2xvYmFsICRnQ21zOwogICAgICAgIC8qIEB2YXIgJGRiIEFET0Nvbm5lY3Rpb24gKi8KICAgICAgICAkZGIgPSAmICR0aGlzLT5HZXREYigpOwogICAgICAgICRwcm92aWRlciA9ICR0aGlzLT5fR2V0UHJvdmlkZXJJZCgkaWRlbnRpdHlfdXJsKTsKICAgICAgICAkdGhpcy0+TG9nKCJSZWdpc3Rlck9wZW5JRCA6ICIuJHVpZC4iICIuJGlkZW50aXR5X3VybC4iICIuJGVtYWlsLiIgIi4kcHJvdmlkZXIpOwogICAgICAgICRxdWVyeSA9ICJTRUxFQ1QgQ09VTlQoKikgQVMgY291bnQgRlJPTSAiIC4gY21zX2RiX3ByZWZpeCgpIC4gIm1vZHVsZV9vcGVuaWRfdXNlcnMgd2hlcmUgaWQgPSA/IGFuZCBwcm92aWRlciA9ID8iOwogICAgICAgICRycyA9ICRkYi0+R2V0Um93KCRxdWVyeSwgYXJyYXkoJHVpZCwgJHByb3ZpZGVyKSk7CiAgICAgICAgT3BlbklEOjpMb2coInJlc3VsdCA6ICIucHJpbnRfcigkcnMsIFRSVUUpKTsKICAgICAgICAkcmVnaXN0ZXJlZCA9ICRycyAmJiAkcnNbJ2NvdW50J10gPiAwOwogICAgICAgIE9wZW5JRDo6TG9nKCJyZWdpc3RlcmVkIDogIi5wcmludF9yKCRyZWdpc3RlcmVkLCBUUlVFKSk7CiAgICAgICAgaWYgKCRyZWdpc3RlcmVkKSB7CiAgICAgICAgICAgICRxdWVyeSA9ICJVUERBVEUgIiAuIGNtc19kYl9wcmVmaXgoKSAuICJtb2R1bGVfb3BlbmlkX3VzZXJzCiAgICAgICAgICAgICAgICAgU0VUIG9wZW5pZF9pZGVudGl0eSA9ID8sIGVtYWlsID0gPyB3aGVyZSBpZCA9ID8gYW5kIHByb3ZpZGVyID0gPyI7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJHF1ZXJ5ID0gIklOU0VSVCBJTlRPICIgLiBjbXNfZGJfcHJlZml4KCkgLiAibW9kdWxlX29wZW5pZF91c2VycwogICAgICAgICAgICAgICAgKG9wZW5pZF9pZGVudGl0eSwgZW1haWwsIGlkLCBwcm92aWRlcikgVkFMVUVTICg/LCA/LCA/LCA/KSI7CiAgICAgICAgfQogICAgICAgIE9wZW5JRDo6TG9nKCJxdWVyeSA6ICIuJHF1ZXJ5KTsKICAgICAgICAkcmVzdWx0ID0gJGRiLT5FeGVjdXRlKCRxdWVyeSwgYXJyYXkoJGlkZW50aXR5X3VybCwgJGVtYWlsLCAkdWlkLCAkcHJvdmlkZXIpKTsKICAgICAgICBpZiggISRyZXN1bHQgKQoJICB7CgkgICAgZWNobyAiREVCVUc6IFNRTCA9ICIuJGRiLT5zcWwuIjxici8+IjsKCSAgICBkaWUoJGRiLT5FcnJvck1zZygpKTsKCSAgfQogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIHN0cmluZyAkaWRlbnRpdHkgdGhlIG9wZW5JRCBpZGVudGl0eSB0aGUgdXNlciBoYXMgcHJvdmlkZWQKICAgICAqIEByZXR1cm4gc3RyaW5nIGEgc3RyaW5nIGlkZW50aWZ5aW5nIHRoZSBPcGVuSUQgcHJvdmlkZXIgbGlrZSAnZ29vZ2xlJyBvciAnb3BlbmlkJwogICAgICovCiAgICBmdW5jdGlvbiBfR2V0UHJvdmlkZXJJZCgkaWRlbnRpdHkpIHsKICAgICAgICBpZiAoc3Vic3RyX2NvdW50KCRpZGVudGl0eSwgJy55YWhvby5jb20vJykpIHsKICAgICAgICAgICAgcmV0dXJuICd5YWhvbyc7CiAgICAgICAgfSBlbHNlIGlmIChzdWJzdHJfY291bnQoJGlkZW50aXR5LCAnLmdvb2dsZS5jb20vJykpIHsKICAgICAgICAgICAgcmV0dXJuICdnb29nbGUnOwogICAgICAgIH0gZWxzZSBpZiAoc3Vic3RyX2NvdW50KCRpZGVudGl0eSwgJy5teW9wZW5pZC5jb20nKSkgewogICAgICAgICAgICByZXR1cm4gJ215b3BlbmlkJzsKICAgICAgICB9IGVsc2UgaWYgKHN1YnN0cl9jb3VudCgkaWRlbnRpdHksICcuYW9sLmNvbS8nKSkgewogICAgICAgICAgICByZXR1cm4gJ2FvbCc7CiAgICAgICAgfSBlbHNlIGlmIChzdWJzdHJfY291bnQoJGlkZW50aXR5LCAnbXlzcGFjZS5jb20nKSkgewogICAgICAgICAgICByZXR1cm4gJ215c3BhY2UnOwogICAgICAgIH0gZWxzZSBpZiAoc3Vic3RyX2NvdW50KCRpZGVudGl0eSwgJ2ZhY2Vib29rOicpKSB7CiAgICAgICAgICAgIHJldHVybiAnZmFjZWJvb2snOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiAnb3BlbmlkJzsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkcHJvdmlkZXIgVGhlIGlkIGZvciB0aGUgcHJvdmlkZXIKICAgICAqIEByZXR1cm4gPHR5cGU+CiAgICAgKi8KICAgIGZ1bmN0aW9uIERpc3BsYXlQcm92aWRlcigkcHJvdmlkZXIpIHsKICAgICAgICAkcHJlZmVyZW5jZSA9ICR0aGlzLT5HZXRQcmVmZXJlbmNlKCdlbmFibGVfcHJvdmlkZXJfJy4kcHJvdmlkZXIsICcxJyk7CiAgICAgICAgcmV0dXJuICFlbXB0eSgkcHJlZmVyZW5jZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBMb2cgbWVzc2FnZSB0byBlcnJvciBsb2cgaWYgbG9nZ2luZyBpcyBlbmFibGVkIGluIG1vZHVsZSBzZXR0aW5ncwogICAgICogQHBhcmFtIFN0cmluZyAkbWVzc2FnZQogICAgICovCiAgICBmdW5jdGlvbiBMb2coJG1lc3NhZ2UpIHsKICAgICAgICBnbG9iYWwgJGdDbXM7CiAgICAgICAgJGNvbmZpZyA9ICRnQ21zLT5HZXRDb25maWcoKTsKICAgICAgICBpZiAoT3BlbklEOjpHZXRDb25maWdCb29sKCdvcGVuaWQuZGVidWcnKSkgewogICAgICAgICAgICBlcnJvcl9sb2coJG1lc3NhZ2UpOwogICAgICAgICAgICAvLyBkZWJ1Z19kaXNwbGF5KCRtZXNzYWdlKTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKgogICAgICogQHJldHVybiBTdHJpbmcgdGhlIEZhY2Vib29rIFVSTCB0aGF0IHdpbGwgdHJpZ2dlciB0aGUgcmVtb3RlIGxvZ2luIGFuZCByZWRpcmVjdAogICAgICogYmFjayB0byBhY3Rpb24uZmFjZWJvb2sucGhwIAogICAgICovCiAgICBmdW5jdGlvbiBGYWNlYm9va0xvZ2luVXJsKCRpZCwgJGFjdGlvbiwgJHJldHVybmlkKSB7CiAgICAgICAgLy8gQ3JlYXRlIGxpbmsgdG8gYWN0aW9uLmZhY2Vib29rLnBocAogICAgICAgIC8qKiBAdmFyIHRoaXMgT3BlbklEICovCiAgICAgICAgJG5leHQgPSAkdGhpcy0+Q3JlYXRlTGluaygkaWQsICRhY3Rpb24sICRyZXR1cm5pZCwgbnVsbCwgbnVsbCwgbnVsbCwgdHJ1ZSwgdHJ1ZSwgbnVsbCwgbnVsbCk7CiAgICAgICAgLy8gVXNlIGN1cnJlbnQgcGFnZSBhcyBjYW5jZWwtVVJMCiAgICAgICAgZ2xvYmFsICRnQ21zOwogICAgICAgICRjdXJyZW50VXJsID0gJGdDbXMtPkdldEhpZXJhcmNoeU1hbmFnZXIoKS0+Z2V0Tm9kZUJ5SWQoJGdDbXMtPnZhcmlhYmxlc1snY29udGVudF9pZCddKS0+R2V0Q29udGVudCgpLT5HZXRVUkwoKTsKICAgICAgICAvLyBHZW5lcmF0ZSBsb2dpbiBVUkwKICAgICAgICAvKiBAdmFyIGZhY2Vib29rIEZhY2Vib29rICovCiAgICAgICAgJGZhY2Vib29rID0gbmV3IEZhY2Vib29rKGFycmF5KAogICAgICAgICAgJ2FwcElkJyAgPT4gJHRoaXMtPkdldFByZWZlcmVuY2UoJ2ZhY2Vib29rX2FwcF9pZCcsJycpLAogICAgICAgICAgJ3NlY3JldCcgPT4gJHRoaXMtPkdldFByZWZlcmVuY2UoJ2ZhY2Vib29rX2FwcF9zZWNyZXQnLCcnKSwKICAgICAgICAgICdjb29raWUnID0+IHRydWUsCiAgICAgICAgKSk7CiAgICAgICAgJGxvZ2luVXJsID0gJGZhY2Vib29rLT5nZXRMb2dpblVybChhcnJheSgKICAgICAgICAgICAgJ2NhbmNlbF91cmwnID0+ICRjdXJyZW50VXJsLAogICAgICAgICAgICAnbmV4dCcgPT4gJG5leHQpKTsKICAgICAgICAvLyBGaXg6IEFkanVzdCBhbnkgYW1wZXJzYW5kcyBlbmNvZGVkIGFzICZhbXA7IGFuZCBqdXN0IGtlZXAgdGhlIGVuY29kZWQgJgogICAgICAgICRsb2dpblVybCA9IHN0cl9yZXBsYWNlKCdhbXAlM0InLCAnJywgJGxvZ2luVXJsKTsKICAgICAgICAkdGhpcy0+TG9nKCdGYWNlYm9va0xvZ2luVXJsIDogJy4kbG9naW5VcmwpOwogICAgICAgIHJldHVybiAkbG9naW5Vcmw7CiAgICB9CgogICAgLyoqCiAgICAgKiBDdXN0b20gbWV0aG9kIGZvciBnZXR0aW5nIGEgYm9vbCB2YWx1ZSBmcm9tIHRoZSBDTVMgY29uZmlndXJhdGlvbi4KICAgICAqIEluIENNU01TIDEuOSB0aGUgYXJyYXkgaGFzIGJlZW4gcmVwbGFjZWQgd2l0aCBhbiBvYmplY3QgaW1wbGVtZW50aW5nCiAgICAgKiBBcnJheUFjY2Vzcy4gSWYgQ01TTVMgaXMgaW4gZGVidWcgbW9kZSB0aGUgY2xhc3Mgd2lsbCB0aHJvdyBhbiBleGNlcHRpb24KICAgICAqIGlmIHRoZSBrZXkgZG9lcyBub3QgZXhpc3QuIFRoaXMgbWV0aG9kIHdpbGwgY2hlY2sgaWYgdGhlIGtleSBleGlzdHMgYmVmb3JlCiAgICAgKiByZXR1cm5pbmcgdGhlIHZhbHVlIChpZiBhbnkpIHRvIHdvcmsgYXJvdW5kIHRoZSBleGNlcHRpb24uCiAgICAgKiBAcGFyYW0gU3RyaW5nICRrZXkKICAgICAqIEByZXR1cm4gQm9vbGVhbiB0cnVlIG9mIHRoZSBrZXkgaXMgc2V0IGluIHRoZSBjb25maWcgYXJyYXkgYW5kIHNldCB0byBub24tZmFsc2UgdmFsdWUKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBHZXRDb25maWdCb29sKCRrZXkpIHsKICAgICAgICBnbG9iYWwgJGdDbXM7CiAgICAgICAgJGNvbmZpZyA9ICRnQ21zLT5HZXRDb25maWcoKTsKICAgICAgICBpZiAoJGNvbmZpZyBpbnN0YW5jZW9mIEFycmF5QWNjZXNzKSB7CiAgICAgICAgICAgIHJldHVybiAkY29uZmlnLT5vZmZzZXRFeGlzdHMoJGtleSkgJiYgJGNvbmZpZ1ska2V5XTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gYXJyYXlfa2V5X2V4aXN0cygka2V5LCAkY29uZmlnKSAmJiAkY29uZmlnWyRrZXldOwogICAgICAgIH0KICAgIH0KfQoKPz4K]]></data>
	</file>
	<file>
	  <filename>/scripts/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/scripts/jquery.min.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyohCiAqIGpRdWVyeSBKYXZhU2NyaXB0IExpYnJhcnkgdjEuNC4yCiAqIGh0dHA6Ly9qcXVlcnkuY29tLwogKgogKiBDb3B5cmlnaHQgMjAxMCwgSm9obiBSZXNpZwogKiBEdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgb3IgR1BMIFZlcnNpb24gMiBsaWNlbnNlcy4KICogaHR0cDovL2pxdWVyeS5vcmcvbGljZW5zZQogKgogKiBJbmNsdWRlcyBTaXp6bGUuanMKICogaHR0cDovL3NpenpsZWpzLmNvbS8KICogQ29weXJpZ2h0IDIwMTAsIFRoZSBEb2pvIEZvdW5kYXRpb24KICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCwgQlNELCBhbmQgR1BMIExpY2Vuc2VzLgogKgogKiBEYXRlOiBTYXQgRmViIDEzIDIyOjMzOjQ4IDIwMTAgLTA1MDAKICovCihmdW5jdGlvbihBLHcpe2Z1bmN0aW9uIG1hKCl7aWYoIWMuaXNSZWFkeSl7dHJ5e3MuZG9jdW1lbnRFbGVtZW50LmRvU2Nyb2xsKCJsZWZ0Iil9Y2F0Y2goYSl7c2V0VGltZW91dChtYSwxKTtyZXR1cm59Yy5yZWFkeSgpfX1mdW5jdGlvbiBRYShhLGIpe2Iuc3JjP2MuYWpheCh7dXJsOmIuc3JjLGFzeW5jOmZhbHNlLGRhdGFUeXBlOiJzY3JpcHQifSk6Yy5nbG9iYWxFdmFsKGIudGV4dHx8Yi50ZXh0Q29udGVudHx8Yi5pbm5lckhUTUx8fCIiKTtiLnBhcmVudE5vZGUmJmIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKX1mdW5jdGlvbiBYKGEsYixkLGYsZSxqKXt2YXIgaT1hLmxlbmd0aDtpZih0eXBlb2YgYj09PSJvYmplY3QiKXtmb3IodmFyIG8gaW4gYilYKGEsbyxiW29dLGYsZSxkKTtyZXR1cm4gYX1pZihkIT09dyl7Zj0haiYmZiYmYy5pc0Z1bmN0aW9uKGQpO2ZvcihvPTA7bzxpO28rKyllKGFbb10sYixmP2QuY2FsbChhW29dLG8sZShhW29dLGIpKTpkLGopO3JldHVybiBhfXJldHVybiBpPwplKGFbMF0sYik6d31mdW5jdGlvbiBKKCl7cmV0dXJuKG5ldyBEYXRlKS5nZXRUaW1lKCl9ZnVuY3Rpb24gWSgpe3JldHVybiBmYWxzZX1mdW5jdGlvbiBaKCl7cmV0dXJuIHRydWV9ZnVuY3Rpb24gbmEoYSxiLGQpe2RbMF0udHlwZT1hO3JldHVybiBjLmV2ZW50LmhhbmRsZS5hcHBseShiLGQpfWZ1bmN0aW9uIG9hKGEpe3ZhciBiLGQ9W10sZj1bXSxlPWFyZ3VtZW50cyxqLGksbyxrLG4scjtpPWMuZGF0YSh0aGlzLCJldmVudHMiKTtpZighKGEubGl2ZUZpcmVkPT09dGhpc3x8IWl8fCFpLmxpdmV8fGEuYnV0dG9uJiZhLnR5cGU9PT0iY2xpY2siKSl7YS5saXZlRmlyZWQ9dGhpczt2YXIgdT1pLmxpdmUuc2xpY2UoMCk7Zm9yKGs9MDtrPHUubGVuZ3RoO2srKyl7aT11W2tdO2kub3JpZ1R5cGUucmVwbGFjZShPLCIiKT09PWEudHlwZT9mLnB1c2goaS5zZWxlY3Rvcik6dS5zcGxpY2Uoay0tLDEpfWo9YyhhLnRhcmdldCkuY2xvc2VzdChmLGEuY3VycmVudFRhcmdldCk7bj0wO2ZvcihyPQpqLmxlbmd0aDtuPHI7bisrKWZvcihrPTA7azx1Lmxlbmd0aDtrKyspe2k9dVtrXTtpZihqW25dLnNlbGVjdG9yPT09aS5zZWxlY3Rvcil7bz1qW25dLmVsZW07Zj1udWxsO2lmKGkucHJlVHlwZT09PSJtb3VzZWVudGVyInx8aS5wcmVUeXBlPT09Im1vdXNlbGVhdmUiKWY9YyhhLnJlbGF0ZWRUYXJnZXQpLmNsb3Nlc3QoaS5zZWxlY3RvcilbMF07aWYoIWZ8fGYhPT1vKWQucHVzaCh7ZWxlbTpvLGhhbmRsZU9iajppfSl9fW49MDtmb3Iocj1kLmxlbmd0aDtuPHI7bisrKXtqPWRbbl07YS5jdXJyZW50VGFyZ2V0PWouZWxlbTthLmRhdGE9ai5oYW5kbGVPYmouZGF0YTthLmhhbmRsZU9iaj1qLmhhbmRsZU9iajtpZihqLmhhbmRsZU9iai5vcmlnSGFuZGxlci5hcHBseShqLmVsZW0sZSk9PT1mYWxzZSl7Yj1mYWxzZTticmVha319cmV0dXJuIGJ9fWZ1bmN0aW9uIHBhKGEsYil7cmV0dXJuImxpdmUuIisoYSYmYSE9PSIqIj9hKyIuIjoiIikrYi5yZXBsYWNlKC9cLi9nLCJgIikucmVwbGFjZSgvIC9nLAoiJiIpfWZ1bmN0aW9uIHFhKGEpe3JldHVybiFhfHwhYS5wYXJlbnROb2RlfHxhLnBhcmVudE5vZGUubm9kZVR5cGU9PT0xMX1mdW5jdGlvbiByYShhLGIpe3ZhciBkPTA7Yi5lYWNoKGZ1bmN0aW9uKCl7aWYodGhpcy5ub2RlTmFtZT09PShhW2RdJiZhW2RdLm5vZGVOYW1lKSl7dmFyIGY9Yy5kYXRhKGFbZCsrXSksZT1jLmRhdGEodGhpcyxmKTtpZihmPWYmJmYuZXZlbnRzKXtkZWxldGUgZS5oYW5kbGU7ZS5ldmVudHM9e307Zm9yKHZhciBqIGluIGYpZm9yKHZhciBpIGluIGZbal0pYy5ldmVudC5hZGQodGhpcyxqLGZbal1baV0sZltqXVtpXS5kYXRhKX19fSl9ZnVuY3Rpb24gc2EoYSxiLGQpe3ZhciBmLGUsajtiPWImJmJbMF0/YlswXS5vd25lckRvY3VtZW50fHxiWzBdOnM7aWYoYS5sZW5ndGg9PT0xJiZ0eXBlb2YgYVswXT09PSJzdHJpbmciJiZhWzBdLmxlbmd0aDw1MTImJmI9PT1zJiYhdGEudGVzdChhWzBdKSYmKGMuc3VwcG9ydC5jaGVja0Nsb25lfHwhdWEudGVzdChhWzBdKSkpe2U9CnRydWU7aWYoaj1jLmZyYWdtZW50c1thWzBdXSlpZihqIT09MSlmPWp9aWYoIWYpe2Y9Yi5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7Yy5jbGVhbihhLGIsZixkKX1pZihlKWMuZnJhZ21lbnRzW2FbMF1dPWo/ZjoxO3JldHVybntmcmFnbWVudDpmLGNhY2hlYWJsZTplfX1mdW5jdGlvbiBLKGEsYil7dmFyIGQ9e307Yy5lYWNoKHZhLmNvbmNhdC5hcHBseShbXSx2YS5zbGljZSgwLGIpKSxmdW5jdGlvbigpe2RbdGhpc109YX0pO3JldHVybiBkfWZ1bmN0aW9uIHdhKGEpe3JldHVybiJzY3JvbGxUbyJpbiBhJiZhLmRvY3VtZW50P2E6YS5ub2RlVHlwZT09PTk/YS5kZWZhdWx0Vmlld3x8YS5wYXJlbnRXaW5kb3c6ZmFsc2V9dmFyIGM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbmV3IGMuZm4uaW5pdChhLGIpfSxSYT1BLmpRdWVyeSxTYT1BLiQscz1BLmRvY3VtZW50LFQsVGE9L15bXjxdKig8W1x3XFddKz4pW14+XSokfF4jKFtcdy1dKykkLyxVYT0vXi5bXjojXFtcLixdKiQvLFZhPS9cUy8sCldhPS9eKFxzfFx1MDBBMCkrfChcc3xcdTAwQTApKyQvZyxYYT0vXjwoXHcrKVxzKlwvPz4oPzo8XC9cMT4pPyQvLFA9bmF2aWdhdG9yLnVzZXJBZ2VudCx4YT1mYWxzZSxRPVtdLEwsJD1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLGFhPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksYmE9QXJyYXkucHJvdG90eXBlLnB1c2gsUj1BcnJheS5wcm90b3R5cGUuc2xpY2UseWE9QXJyYXkucHJvdG90eXBlLmluZGV4T2Y7Yy5mbj1jLnByb3RvdHlwZT17aW5pdDpmdW5jdGlvbihhLGIpe3ZhciBkLGY7aWYoIWEpcmV0dXJuIHRoaXM7aWYoYS5ub2RlVHlwZSl7dGhpcy5jb250ZXh0PXRoaXNbMF09YTt0aGlzLmxlbmd0aD0xO3JldHVybiB0aGlzfWlmKGE9PT0iYm9keSImJiFiKXt0aGlzLmNvbnRleHQ9czt0aGlzWzBdPXMuYm9keTt0aGlzLnNlbGVjdG9yPSJib2R5Ijt0aGlzLmxlbmd0aD0xO3JldHVybiB0aGlzfWlmKHR5cGVvZiBhPT09InN0cmluZyIpaWYoKGQ9VGEuZXhlYyhhKSkmJgooZFsxXXx8IWIpKWlmKGRbMV0pe2Y9Yj9iLm93bmVyRG9jdW1lbnR8fGI6cztpZihhPVhhLmV4ZWMoYSkpaWYoYy5pc1BsYWluT2JqZWN0KGIpKXthPVtzLmNyZWF0ZUVsZW1lbnQoYVsxXSldO2MuZm4uYXR0ci5jYWxsKGEsYix0cnVlKX1lbHNlIGE9W2YuY3JlYXRlRWxlbWVudChhWzFdKV07ZWxzZXthPXNhKFtkWzFdXSxbZl0pO2E9KGEuY2FjaGVhYmxlP2EuZnJhZ21lbnQuY2xvbmVOb2RlKHRydWUpOmEuZnJhZ21lbnQpLmNoaWxkTm9kZXN9cmV0dXJuIGMubWVyZ2UodGhpcyxhKX1lbHNle2lmKGI9cy5nZXRFbGVtZW50QnlJZChkWzJdKSl7aWYoYi5pZCE9PWRbMl0pcmV0dXJuIFQuZmluZChhKTt0aGlzLmxlbmd0aD0xO3RoaXNbMF09Yn10aGlzLmNvbnRleHQ9czt0aGlzLnNlbGVjdG9yPWE7cmV0dXJuIHRoaXN9ZWxzZSBpZighYiYmL15cdyskLy50ZXN0KGEpKXt0aGlzLnNlbGVjdG9yPWE7dGhpcy5jb250ZXh0PXM7YT1zLmdldEVsZW1lbnRzQnlUYWdOYW1lKGEpO3JldHVybiBjLm1lcmdlKHRoaXMsCmEpfWVsc2UgcmV0dXJuIWJ8fGIuanF1ZXJ5PyhifHxUKS5maW5kKGEpOmMoYikuZmluZChhKTtlbHNlIGlmKGMuaXNGdW5jdGlvbihhKSlyZXR1cm4gVC5yZWFkeShhKTtpZihhLnNlbGVjdG9yIT09dyl7dGhpcy5zZWxlY3Rvcj1hLnNlbGVjdG9yO3RoaXMuY29udGV4dD1hLmNvbnRleHR9cmV0dXJuIGMubWFrZUFycmF5KGEsdGhpcyl9LHNlbGVjdG9yOiIiLGpxdWVyeToiMS40LjIiLGxlbmd0aDowLHNpemU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sZW5ndGh9LHRvQXJyYXk6ZnVuY3Rpb24oKXtyZXR1cm4gUi5jYWxsKHRoaXMsMCl9LGdldDpmdW5jdGlvbihhKXtyZXR1cm4gYT09bnVsbD90aGlzLnRvQXJyYXkoKTphPDA/dGhpcy5zbGljZShhKVswXTp0aGlzW2FdfSxwdXNoU3RhY2s6ZnVuY3Rpb24oYSxiLGQpe3ZhciBmPWMoKTtjLmlzQXJyYXkoYSk/YmEuYXBwbHkoZixhKTpjLm1lcmdlKGYsYSk7Zi5wcmV2T2JqZWN0PXRoaXM7Zi5jb250ZXh0PXRoaXMuY29udGV4dDtpZihiPT09CiJmaW5kIilmLnNlbGVjdG9yPXRoaXMuc2VsZWN0b3IrKHRoaXMuc2VsZWN0b3I/IiAiOiIiKStkO2Vsc2UgaWYoYilmLnNlbGVjdG9yPXRoaXMuc2VsZWN0b3IrIi4iK2IrIigiK2QrIikiO3JldHVybiBmfSxlYWNoOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGMuZWFjaCh0aGlzLGEsYil9LHJlYWR5OmZ1bmN0aW9uKGEpe2MuYmluZFJlYWR5KCk7aWYoYy5pc1JlYWR5KWEuY2FsbChzLGMpO2Vsc2UgUSYmUS5wdXNoKGEpO3JldHVybiB0aGlzfSxlcTpmdW5jdGlvbihhKXtyZXR1cm4gYT09PS0xP3RoaXMuc2xpY2UoYSk6dGhpcy5zbGljZShhLCthKzEpfSxmaXJzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVxKDApfSxsYXN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXEoLTEpfSxzbGljZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnB1c2hTdGFjayhSLmFwcGx5KHRoaXMsYXJndW1lbnRzKSwic2xpY2UiLFIuY2FsbChhcmd1bWVudHMpLmpvaW4oIiwiKSl9LG1hcDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soYy5tYXAodGhpcywKZnVuY3Rpb24oYixkKXtyZXR1cm4gYS5jYWxsKGIsZCxiKX0pKX0sZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHJldk9iamVjdHx8YyhudWxsKX0scHVzaDpiYSxzb3J0OltdLnNvcnQsc3BsaWNlOltdLnNwbGljZX07Yy5mbi5pbml0LnByb3RvdHlwZT1jLmZuO2MuZXh0ZW5kPWMuZm4uZXh0ZW5kPWZ1bmN0aW9uKCl7dmFyIGE9YXJndW1lbnRzWzBdfHx7fSxiPTEsZD1hcmd1bWVudHMubGVuZ3RoLGY9ZmFsc2UsZSxqLGksbztpZih0eXBlb2YgYT09PSJib29sZWFuIil7Zj1hO2E9YXJndW1lbnRzWzFdfHx7fTtiPTJ9aWYodHlwZW9mIGEhPT0ib2JqZWN0IiYmIWMuaXNGdW5jdGlvbihhKSlhPXt9O2lmKGQ9PT1iKXthPXRoaXM7LS1ifWZvcig7YjxkO2IrKylpZigoZT1hcmd1bWVudHNbYl0pIT1udWxsKWZvcihqIGluIGUpe2k9YVtqXTtvPWVbal07aWYoYSE9PW8paWYoZiYmbyYmKGMuaXNQbGFpbk9iamVjdChvKXx8Yy5pc0FycmF5KG8pKSl7aT1pJiYoYy5pc1BsYWluT2JqZWN0KGkpfHwKYy5pc0FycmF5KGkpKT9pOmMuaXNBcnJheShvKT9bXTp7fTthW2pdPWMuZXh0ZW5kKGYsaSxvKX1lbHNlIGlmKG8hPT13KWFbal09b31yZXR1cm4gYX07Yy5leHRlbmQoe25vQ29uZmxpY3Q6ZnVuY3Rpb24oYSl7QS4kPVNhO2lmKGEpQS5qUXVlcnk9UmE7cmV0dXJuIGN9LGlzUmVhZHk6ZmFsc2UscmVhZHk6ZnVuY3Rpb24oKXtpZighYy5pc1JlYWR5KXtpZighcy5ib2R5KXJldHVybiBzZXRUaW1lb3V0KGMucmVhZHksMTMpO2MuaXNSZWFkeT10cnVlO2lmKFEpe2Zvcih2YXIgYSxiPTA7YT1RW2IrK107KWEuY2FsbChzLGMpO1E9bnVsbH1jLmZuLnRyaWdnZXJIYW5kbGVyJiZjKHMpLnRyaWdnZXJIYW5kbGVyKCJyZWFkeSIpfX0sYmluZFJlYWR5OmZ1bmN0aW9uKCl7aWYoIXhhKXt4YT10cnVlO2lmKHMucmVhZHlTdGF0ZT09PSJjb21wbGV0ZSIpcmV0dXJuIGMucmVhZHkoKTtpZihzLmFkZEV2ZW50TGlzdGVuZXIpe3MuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsCkwsZmFsc2UpO0EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsYy5yZWFkeSxmYWxzZSl9ZWxzZSBpZihzLmF0dGFjaEV2ZW50KXtzLmF0dGFjaEV2ZW50KCJvbnJlYWR5c3RhdGVjaGFuZ2UiLEwpO0EuYXR0YWNoRXZlbnQoIm9ubG9hZCIsYy5yZWFkeSk7dmFyIGE9ZmFsc2U7dHJ5e2E9QS5mcmFtZUVsZW1lbnQ9PW51bGx9Y2F0Y2goYil7fXMuZG9jdW1lbnRFbGVtZW50LmRvU2Nyb2xsJiZhJiZtYSgpfX19LGlzRnVuY3Rpb246ZnVuY3Rpb24oYSl7cmV0dXJuICQuY2FsbChhKT09PSJbb2JqZWN0IEZ1bmN0aW9uXSJ9LGlzQXJyYXk6ZnVuY3Rpb24oYSl7cmV0dXJuICQuY2FsbChhKT09PSJbb2JqZWN0IEFycmF5XSJ9LGlzUGxhaW5PYmplY3Q6ZnVuY3Rpb24oYSl7aWYoIWF8fCQuY2FsbChhKSE9PSJbb2JqZWN0IE9iamVjdF0ifHxhLm5vZGVUeXBlfHxhLnNldEludGVydmFsKXJldHVybiBmYWxzZTtpZihhLmNvbnN0cnVjdG9yJiYhYWEuY2FsbChhLCJjb25zdHJ1Y3RvciIpJiYhYWEuY2FsbChhLmNvbnN0cnVjdG9yLnByb3RvdHlwZSwKImlzUHJvdG90eXBlT2YiKSlyZXR1cm4gZmFsc2U7dmFyIGI7Zm9yKGIgaW4gYSk7cmV0dXJuIGI9PT13fHxhYS5jYWxsKGEsYil9LGlzRW1wdHlPYmplY3Q6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiIGluIGEpcmV0dXJuIGZhbHNlO3JldHVybiB0cnVlfSxlcnJvcjpmdW5jdGlvbihhKXt0aHJvdyBhO30scGFyc2VKU09OOmZ1bmN0aW9uKGEpe2lmKHR5cGVvZiBhIT09InN0cmluZyJ8fCFhKXJldHVybiBudWxsO2E9Yy50cmltKGEpO2lmKC9eW1xdLDp7fVxzXSokLy50ZXN0KGEucmVwbGFjZSgvXFwoPzpbIlxcXC9iZm5ydF18dVswLTlhLWZBLUZdezR9KS9nLCJAIikucmVwbGFjZSgvIlteIlxcXG5ccl0qInx0cnVlfGZhbHNlfG51bGx8LT9cZCsoPzpcLlxkKik/KD86W2VFXVsrXC1dP1xkKyk/L2csIl0iKS5yZXBsYWNlKC8oPzpefDp8LCkoPzpccypcWykrL2csIiIpKSlyZXR1cm4gQS5KU09OJiZBLkpTT04ucGFyc2U/QS5KU09OLnBhcnNlKGEpOihuZXcgRnVuY3Rpb24oInJldHVybiAiKwphKSkoKTtlbHNlIGMuZXJyb3IoIkludmFsaWQgSlNPTjogIithKX0sbm9vcDpmdW5jdGlvbigpe30sZ2xvYmFsRXZhbDpmdW5jdGlvbihhKXtpZihhJiZWYS50ZXN0KGEpKXt2YXIgYj1zLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJoZWFkIilbMF18fHMuZG9jdW1lbnRFbGVtZW50LGQ9cy5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkLnR5cGU9InRleHQvamF2YXNjcmlwdCI7aWYoYy5zdXBwb3J0LnNjcmlwdEV2YWwpZC5hcHBlbmRDaGlsZChzLmNyZWF0ZVRleHROb2RlKGEpKTtlbHNlIGQudGV4dD1hO2IuaW5zZXJ0QmVmb3JlKGQsYi5maXJzdENoaWxkKTtiLnJlbW92ZUNoaWxkKGQpfX0sbm9kZU5hbWU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5ub2RlTmFtZSYmYS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpPT09Yi50b1VwcGVyQ2FzZSgpfSxlYWNoOmZ1bmN0aW9uKGEsYixkKXt2YXIgZixlPTAsaj1hLmxlbmd0aCxpPWo9PT13fHxjLmlzRnVuY3Rpb24oYSk7aWYoZClpZihpKWZvcihmIGluIGEpe2lmKGIuYXBwbHkoYVtmXSwKZCk9PT1mYWxzZSlicmVha31lbHNlIGZvcig7ZTxqOyl7aWYoYi5hcHBseShhW2UrK10sZCk9PT1mYWxzZSlicmVha31lbHNlIGlmKGkpZm9yKGYgaW4gYSl7aWYoYi5jYWxsKGFbZl0sZixhW2ZdKT09PWZhbHNlKWJyZWFrfWVsc2UgZm9yKGQ9YVswXTtlPGomJmIuY2FsbChkLGUsZCkhPT1mYWxzZTtkPWFbKytlXSk7cmV0dXJuIGF9LHRyaW06ZnVuY3Rpb24oYSl7cmV0dXJuKGF8fCIiKS5yZXBsYWNlKFdhLCIiKX0sbWFrZUFycmF5OmZ1bmN0aW9uKGEsYil7Yj1ifHxbXTtpZihhIT1udWxsKWEubGVuZ3RoPT1udWxsfHx0eXBlb2YgYT09PSJzdHJpbmcifHxjLmlzRnVuY3Rpb24oYSl8fHR5cGVvZiBhIT09ImZ1bmN0aW9uIiYmYS5zZXRJbnRlcnZhbD9iYS5jYWxsKGIsYSk6Yy5tZXJnZShiLGEpO3JldHVybiBifSxpbkFycmF5OmZ1bmN0aW9uKGEsYil7aWYoYi5pbmRleE9mKXJldHVybiBiLmluZGV4T2YoYSk7Zm9yKHZhciBkPTAsZj1iLmxlbmd0aDtkPGY7ZCsrKWlmKGJbZF09PT0KYSlyZXR1cm4gZDtyZXR1cm4tMX0sbWVyZ2U6ZnVuY3Rpb24oYSxiKXt2YXIgZD1hLmxlbmd0aCxmPTA7aWYodHlwZW9mIGIubGVuZ3RoPT09Im51bWJlciIpZm9yKHZhciBlPWIubGVuZ3RoO2Y8ZTtmKyspYVtkKytdPWJbZl07ZWxzZSBmb3IoO2JbZl0hPT13OylhW2QrK109YltmKytdO2EubGVuZ3RoPWQ7cmV0dXJuIGF9LGdyZXA6ZnVuY3Rpb24oYSxiLGQpe2Zvcih2YXIgZj1bXSxlPTAsaj1hLmxlbmd0aDtlPGo7ZSsrKSFkIT09IWIoYVtlXSxlKSYmZi5wdXNoKGFbZV0pO3JldHVybiBmfSxtYXA6ZnVuY3Rpb24oYSxiLGQpe2Zvcih2YXIgZj1bXSxlLGo9MCxpPWEubGVuZ3RoO2o8aTtqKyspe2U9YihhW2pdLGosZCk7aWYoZSE9bnVsbClmW2YubGVuZ3RoXT1lfXJldHVybiBmLmNvbmNhdC5hcHBseShbXSxmKX0sZ3VpZDoxLHByb3h5OmZ1bmN0aW9uKGEsYixkKXtpZihhcmd1bWVudHMubGVuZ3RoPT09MilpZih0eXBlb2YgYj09PSJzdHJpbmciKXtkPWE7YT1kW2JdO2I9d31lbHNlIGlmKGImJgohYy5pc0Z1bmN0aW9uKGIpKXtkPWI7Yj13fWlmKCFiJiZhKWI9ZnVuY3Rpb24oKXtyZXR1cm4gYS5hcHBseShkfHx0aGlzLGFyZ3VtZW50cyl9O2lmKGEpYi5ndWlkPWEuZ3VpZD1hLmd1aWR8fGIuZ3VpZHx8Yy5ndWlkKys7cmV0dXJuIGJ9LHVhTWF0Y2g6ZnVuY3Rpb24oYSl7YT1hLnRvTG93ZXJDYXNlKCk7YT0vKHdlYmtpdClbIFwvXShbXHcuXSspLy5leGVjKGEpfHwvKG9wZXJhKSg/Oi4qdmVyc2lvbik/WyBcL10oW1x3Ll0rKS8uZXhlYyhhKXx8Lyhtc2llKSAoW1x3Ll0rKS8uZXhlYyhhKXx8IS9jb21wYXRpYmxlLy50ZXN0KGEpJiYvKG1vemlsbGEpKD86Lio/IHJ2OihbXHcuXSspKT8vLmV4ZWMoYSl8fFtdO3JldHVybnticm93c2VyOmFbMV18fCIiLHZlcnNpb246YVsyXXx8IjAifX0sYnJvd3Nlcjp7fX0pO1A9Yy51YU1hdGNoKFApO2lmKFAuYnJvd3Nlcil7Yy5icm93c2VyW1AuYnJvd3Nlcl09dHJ1ZTtjLmJyb3dzZXIudmVyc2lvbj1QLnZlcnNpb259aWYoYy5icm93c2VyLndlYmtpdCljLmJyb3dzZXIuc2FmYXJpPQp0cnVlO2lmKHlhKWMuaW5BcnJheT1mdW5jdGlvbihhLGIpe3JldHVybiB5YS5jYWxsKGIsYSl9O1Q9YyhzKTtpZihzLmFkZEV2ZW50TGlzdGVuZXIpTD1mdW5jdGlvbigpe3MucmVtb3ZlRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsTCxmYWxzZSk7Yy5yZWFkeSgpfTtlbHNlIGlmKHMuYXR0YWNoRXZlbnQpTD1mdW5jdGlvbigpe2lmKHMucmVhZHlTdGF0ZT09PSJjb21wbGV0ZSIpe3MuZGV0YWNoRXZlbnQoIm9ucmVhZHlzdGF0ZWNoYW5nZSIsTCk7Yy5yZWFkeSgpfX07KGZ1bmN0aW9uKCl7Yy5zdXBwb3J0PXt9O3ZhciBhPXMuZG9jdW1lbnRFbGVtZW50LGI9cy5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKSxkPXMuY3JlYXRlRWxlbWVudCgiZGl2IiksZj0ic2NyaXB0IitKKCk7ZC5zdHlsZS5kaXNwbGF5PSJub25lIjtkLmlubmVySFRNTD0iICAgPGxpbmsvPjx0YWJsZT48L3RhYmxlPjxhIGhyZWY9Jy9hJyBzdHlsZT0nY29sb3I6cmVkO2Zsb2F0OmxlZnQ7b3BhY2l0eTouNTU7Jz5hPC9hPjxpbnB1dCB0eXBlPSdjaGVja2JveCcvPiI7CnZhciBlPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKSxqPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImEiKVswXTtpZighKCFlfHwhZS5sZW5ndGh8fCFqKSl7Yy5zdXBwb3J0PXtsZWFkaW5nV2hpdGVzcGFjZTpkLmZpcnN0Q2hpbGQubm9kZVR5cGU9PT0zLHRib2R5OiFkLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0Ym9keSIpLmxlbmd0aCxodG1sU2VyaWFsaXplOiEhZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgibGluayIpLmxlbmd0aCxzdHlsZTovcmVkLy50ZXN0KGouZ2V0QXR0cmlidXRlKCJzdHlsZSIpKSxocmVmTm9ybWFsaXplZDpqLmdldEF0dHJpYnV0ZSgiaHJlZiIpPT09Ii9hIixvcGFjaXR5Oi9eMC41NSQvLnRlc3Qoai5zdHlsZS5vcGFjaXR5KSxjc3NGbG9hdDohIWouc3R5bGUuY3NzRmxvYXQsY2hlY2tPbjpkLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpbnB1dCIpWzBdLnZhbHVlPT09Im9uIixvcHRTZWxlY3RlZDpzLmNyZWF0ZUVsZW1lbnQoInNlbGVjdCIpLmFwcGVuZENoaWxkKHMuY3JlYXRlRWxlbWVudCgib3B0aW9uIikpLnNlbGVjdGVkLApwYXJlbnROb2RlOmQucmVtb3ZlQ2hpbGQoZC5hcHBlbmRDaGlsZChzLmNyZWF0ZUVsZW1lbnQoImRpdiIpKSkucGFyZW50Tm9kZT09PW51bGwsZGVsZXRlRXhwYW5kbzp0cnVlLGNoZWNrQ2xvbmU6ZmFsc2Usc2NyaXB0RXZhbDpmYWxzZSxub0Nsb25lRXZlbnQ6dHJ1ZSxib3hNb2RlbDpudWxsfTtiLnR5cGU9InRleHQvamF2YXNjcmlwdCI7dHJ5e2IuYXBwZW5kQ2hpbGQocy5jcmVhdGVUZXh0Tm9kZSgid2luZG93LiIrZisiPTE7IikpfWNhdGNoKGkpe31hLmluc2VydEJlZm9yZShiLGEuZmlyc3RDaGlsZCk7aWYoQVtmXSl7Yy5zdXBwb3J0LnNjcmlwdEV2YWw9dHJ1ZTtkZWxldGUgQVtmXX10cnl7ZGVsZXRlIGIudGVzdH1jYXRjaChvKXtjLnN1cHBvcnQuZGVsZXRlRXhwYW5kbz1mYWxzZX1hLnJlbW92ZUNoaWxkKGIpO2lmKGQuYXR0YWNoRXZlbnQmJmQuZmlyZUV2ZW50KXtkLmF0dGFjaEV2ZW50KCJvbmNsaWNrIixmdW5jdGlvbiBrKCl7Yy5zdXBwb3J0Lm5vQ2xvbmVFdmVudD0KZmFsc2U7ZC5kZXRhY2hFdmVudCgib25jbGljayIsayl9KTtkLmNsb25lTm9kZSh0cnVlKS5maXJlRXZlbnQoIm9uY2xpY2siKX1kPXMuY3JlYXRlRWxlbWVudCgiZGl2Iik7ZC5pbm5lckhUTUw9IjxpbnB1dCB0eXBlPSdyYWRpbycgbmFtZT0ncmFkaW90ZXN0JyBjaGVja2VkPSdjaGVja2VkJy8+IjthPXMuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO2EuYXBwZW5kQ2hpbGQoZC5maXJzdENoaWxkKTtjLnN1cHBvcnQuY2hlY2tDbG9uZT1hLmNsb25lTm9kZSh0cnVlKS5jbG9uZU5vZGUodHJ1ZSkubGFzdENoaWxkLmNoZWNrZWQ7YyhmdW5jdGlvbigpe3ZhciBrPXMuY3JlYXRlRWxlbWVudCgiZGl2Iik7ay5zdHlsZS53aWR0aD1rLnN0eWxlLnBhZGRpbmdMZWZ0PSIxcHgiO3MuYm9keS5hcHBlbmRDaGlsZChrKTtjLmJveE1vZGVsPWMuc3VwcG9ydC5ib3hNb2RlbD1rLm9mZnNldFdpZHRoPT09MjtzLmJvZHkucmVtb3ZlQ2hpbGQoaykuc3R5bGUuZGlzcGxheT0ibm9uZSJ9KTthPWZ1bmN0aW9uKGspe3ZhciBuPQpzLmNyZWF0ZUVsZW1lbnQoImRpdiIpO2s9Im9uIitrO3ZhciByPWsgaW4gbjtpZighcil7bi5zZXRBdHRyaWJ1dGUoaywicmV0dXJuOyIpO3I9dHlwZW9mIG5ba109PT0iZnVuY3Rpb24ifXJldHVybiByfTtjLnN1cHBvcnQuc3VibWl0QnViYmxlcz1hKCJzdWJtaXQiKTtjLnN1cHBvcnQuY2hhbmdlQnViYmxlcz1hKCJjaGFuZ2UiKTthPWI9ZD1lPWo9bnVsbH19KSgpO2MucHJvcHM9eyJmb3IiOiJodG1sRm9yIiwiY2xhc3MiOiJjbGFzc05hbWUiLHJlYWRvbmx5OiJyZWFkT25seSIsbWF4bGVuZ3RoOiJtYXhMZW5ndGgiLGNlbGxzcGFjaW5nOiJjZWxsU3BhY2luZyIscm93c3Bhbjoicm93U3BhbiIsY29sc3BhbjoiY29sU3BhbiIsdGFiaW5kZXg6InRhYkluZGV4Iix1c2VtYXA6InVzZU1hcCIsZnJhbWVib3JkZXI6ImZyYW1lQm9yZGVyIn07dmFyIEc9ImpRdWVyeSIrSigpLFlhPTAsemE9e307Yy5leHRlbmQoe2NhY2hlOnt9LGV4cGFuZG86Ryxub0RhdGE6e2VtYmVkOnRydWUsb2JqZWN0OnRydWUsCmFwcGxldDp0cnVlfSxkYXRhOmZ1bmN0aW9uKGEsYixkKXtpZighKGEubm9kZU5hbWUmJmMubm9EYXRhW2Eubm9kZU5hbWUudG9Mb3dlckNhc2UoKV0pKXthPWE9PUE/emE6YTt2YXIgZj1hW0ddLGU9Yy5jYWNoZTtpZighZiYmdHlwZW9mIGI9PT0ic3RyaW5nIiYmZD09PXcpcmV0dXJuIG51bGw7Znx8KGY9KytZYSk7aWYodHlwZW9mIGI9PT0ib2JqZWN0Iil7YVtHXT1mO2VbZl09Yy5leHRlbmQodHJ1ZSx7fSxiKX1lbHNlIGlmKCFlW2ZdKXthW0ddPWY7ZVtmXT17fX1hPWVbZl07aWYoZCE9PXcpYVtiXT1kO3JldHVybiB0eXBlb2YgYj09PSJzdHJpbmciP2FbYl06YX19LHJlbW92ZURhdGE6ZnVuY3Rpb24oYSxiKXtpZighKGEubm9kZU5hbWUmJmMubm9EYXRhW2Eubm9kZU5hbWUudG9Mb3dlckNhc2UoKV0pKXthPWE9PUE/emE6YTt2YXIgZD1hW0ddLGY9Yy5jYWNoZSxlPWZbZF07aWYoYil7aWYoZSl7ZGVsZXRlIGVbYl07Yy5pc0VtcHR5T2JqZWN0KGUpJiZjLnJlbW92ZURhdGEoYSl9fWVsc2V7aWYoYy5zdXBwb3J0LmRlbGV0ZUV4cGFuZG8pZGVsZXRlIGFbYy5leHBhbmRvXTsKZWxzZSBhLnJlbW92ZUF0dHJpYnV0ZSYmYS5yZW1vdmVBdHRyaWJ1dGUoYy5leHBhbmRvKTtkZWxldGUgZltkXX19fX0pO2MuZm4uZXh0ZW5kKHtkYXRhOmZ1bmN0aW9uKGEsYil7aWYodHlwZW9mIGE9PT0idW5kZWZpbmVkIiYmdGhpcy5sZW5ndGgpcmV0dXJuIGMuZGF0YSh0aGlzWzBdKTtlbHNlIGlmKHR5cGVvZiBhPT09Im9iamVjdCIpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2MuZGF0YSh0aGlzLGEpfSk7dmFyIGQ9YS5zcGxpdCgiLiIpO2RbMV09ZFsxXT8iLiIrZFsxXToiIjtpZihiPT09dyl7dmFyIGY9dGhpcy50cmlnZ2VySGFuZGxlcigiZ2V0RGF0YSIrZFsxXSsiISIsW2RbMF1dKTtpZihmPT09dyYmdGhpcy5sZW5ndGgpZj1jLmRhdGEodGhpc1swXSxhKTtyZXR1cm4gZj09PXcmJmRbMV0/dGhpcy5kYXRhKGRbMF0pOmZ9ZWxzZSByZXR1cm4gdGhpcy50cmlnZ2VyKCJzZXREYXRhIitkWzFdKyIhIixbZFswXSxiXSkuZWFjaChmdW5jdGlvbigpe2MuZGF0YSh0aGlzLAphLGIpfSl9LHJlbW92ZURhdGE6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2MucmVtb3ZlRGF0YSh0aGlzLGEpfSl9fSk7Yy5leHRlbmQoe3F1ZXVlOmZ1bmN0aW9uKGEsYixkKXtpZihhKXtiPShifHwiZngiKSsicXVldWUiO3ZhciBmPWMuZGF0YShhLGIpO2lmKCFkKXJldHVybiBmfHxbXTtpZighZnx8Yy5pc0FycmF5KGQpKWY9Yy5kYXRhKGEsYixjLm1ha2VBcnJheShkKSk7ZWxzZSBmLnB1c2goZCk7cmV0dXJuIGZ9fSxkZXF1ZXVlOmZ1bmN0aW9uKGEsYil7Yj1ifHwiZngiO3ZhciBkPWMucXVldWUoYSxiKSxmPWQuc2hpZnQoKTtpZihmPT09ImlucHJvZ3Jlc3MiKWY9ZC5zaGlmdCgpO2lmKGYpe2I9PT0iZngiJiZkLnVuc2hpZnQoImlucHJvZ3Jlc3MiKTtmLmNhbGwoYSxmdW5jdGlvbigpe2MuZGVxdWV1ZShhLGIpfSl9fX0pO2MuZm4uZXh0ZW5kKHtxdWV1ZTpmdW5jdGlvbihhLGIpe2lmKHR5cGVvZiBhIT09InN0cmluZyIpe2I9YTthPSJmeCJ9aWYoYj09PQp3KXJldHVybiBjLnF1ZXVlKHRoaXNbMF0sYSk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBkPWMucXVldWUodGhpcyxhLGIpO2E9PT0iZngiJiZkWzBdIT09ImlucHJvZ3Jlc3MiJiZjLmRlcXVldWUodGhpcyxhKX0pfSxkZXF1ZXVlOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtjLmRlcXVldWUodGhpcyxhKX0pfSxkZWxheTpmdW5jdGlvbihhLGIpe2E9Yy5meD9jLmZ4LnNwZWVkc1thXXx8YTphO2I9Ynx8ImZ4IjtyZXR1cm4gdGhpcy5xdWV1ZShiLGZ1bmN0aW9uKCl7dmFyIGQ9dGhpcztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Yy5kZXF1ZXVlKGQsYil9LGEpfSl9LGNsZWFyUXVldWU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucXVldWUoYXx8ImZ4IixbXSl9fSk7dmFyIEFhPS9bXG5cdF0vZyxjYT0vXHMrLyxaYT0vXHIvZywkYT0vaHJlZnxzcmN8c3R5bGUvLGFiPS8oYnV0dG9ufGlucHV0KS9pLGJiPS8oYnV0dG9ufGlucHV0fG9iamVjdHxzZWxlY3R8dGV4dGFyZWEpL2ksCmNiPS9eKGF8YXJlYSkkL2ksQmE9L3JhZGlvfGNoZWNrYm94LztjLmZuLmV4dGVuZCh7YXR0cjpmdW5jdGlvbihhLGIpe3JldHVybiBYKHRoaXMsYSxiLHRydWUsYy5hdHRyKX0scmVtb3ZlQXR0cjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Yy5hdHRyKHRoaXMsYSwiIik7dGhpcy5ub2RlVHlwZT09PTEmJnRoaXMucmVtb3ZlQXR0cmlidXRlKGEpfSl9LGFkZENsYXNzOmZ1bmN0aW9uKGEpe2lmKGMuaXNGdW5jdGlvbihhKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKG4pe3ZhciByPWModGhpcyk7ci5hZGRDbGFzcyhhLmNhbGwodGhpcyxuLHIuYXR0cigiY2xhc3MiKSkpfSk7aWYoYSYmdHlwZW9mIGE9PT0ic3RyaW5nIilmb3IodmFyIGI9KGF8fCIiKS5zcGxpdChjYSksZD0wLGY9dGhpcy5sZW5ndGg7ZDxmO2QrKyl7dmFyIGU9dGhpc1tkXTtpZihlLm5vZGVUeXBlPT09MSlpZihlLmNsYXNzTmFtZSl7Zm9yKHZhciBqPSIgIitlLmNsYXNzTmFtZSsiICIsCmk9ZS5jbGFzc05hbWUsbz0wLGs9Yi5sZW5ndGg7bzxrO28rKylpZihqLmluZGV4T2YoIiAiK2Jbb10rIiAiKTwwKWkrPSIgIitiW29dO2UuY2xhc3NOYW1lPWMudHJpbShpKX1lbHNlIGUuY2xhc3NOYW1lPWF9cmV0dXJuIHRoaXN9LHJlbW92ZUNsYXNzOmZ1bmN0aW9uKGEpe2lmKGMuaXNGdW5jdGlvbihhKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGspe3ZhciBuPWModGhpcyk7bi5yZW1vdmVDbGFzcyhhLmNhbGwodGhpcyxrLG4uYXR0cigiY2xhc3MiKSkpfSk7aWYoYSYmdHlwZW9mIGE9PT0ic3RyaW5nInx8YT09PXcpZm9yKHZhciBiPShhfHwiIikuc3BsaXQoY2EpLGQ9MCxmPXRoaXMubGVuZ3RoO2Q8ZjtkKyspe3ZhciBlPXRoaXNbZF07aWYoZS5ub2RlVHlwZT09PTEmJmUuY2xhc3NOYW1lKWlmKGEpe2Zvcih2YXIgaj0oIiAiK2UuY2xhc3NOYW1lKyIgIikucmVwbGFjZShBYSwiICIpLGk9MCxvPWIubGVuZ3RoO2k8bztpKyspaj1qLnJlcGxhY2UoIiAiK2JbaV0rIiAiLAoiICIpO2UuY2xhc3NOYW1lPWMudHJpbShqKX1lbHNlIGUuY2xhc3NOYW1lPSIifXJldHVybiB0aGlzfSx0b2dnbGVDbGFzczpmdW5jdGlvbihhLGIpe3ZhciBkPXR5cGVvZiBhLGY9dHlwZW9mIGI9PT0iYm9vbGVhbiI7aWYoYy5pc0Z1bmN0aW9uKGEpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oZSl7dmFyIGo9Yyh0aGlzKTtqLnRvZ2dsZUNsYXNzKGEuY2FsbCh0aGlzLGUsai5hdHRyKCJjbGFzcyIpLGIpLGIpfSk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2lmKGQ9PT0ic3RyaW5nIilmb3IodmFyIGUsaj0wLGk9Yyh0aGlzKSxvPWIsaz1hLnNwbGl0KGNhKTtlPWtbaisrXTspe289Zj9vOiFpLmhhc0NsYXNzKGUpO2lbbz8iYWRkQ2xhc3MiOiJyZW1vdmVDbGFzcyJdKGUpfWVsc2UgaWYoZD09PSJ1bmRlZmluZWQifHxkPT09ImJvb2xlYW4iKXt0aGlzLmNsYXNzTmFtZSYmYy5kYXRhKHRoaXMsIl9fY2xhc3NOYW1lX18iLHRoaXMuY2xhc3NOYW1lKTt0aGlzLmNsYXNzTmFtZT0KdGhpcy5jbGFzc05hbWV8fGE9PT1mYWxzZT8iIjpjLmRhdGEodGhpcywiX19jbGFzc05hbWVfXyIpfHwiIn19KX0saGFzQ2xhc3M6ZnVuY3Rpb24oYSl7YT0iICIrYSsiICI7Zm9yKHZhciBiPTAsZD10aGlzLmxlbmd0aDtiPGQ7YisrKWlmKCgiICIrdGhpc1tiXS5jbGFzc05hbWUrIiAiKS5yZXBsYWNlKEFhLCIgIikuaW5kZXhPZihhKT4tMSlyZXR1cm4gdHJ1ZTtyZXR1cm4gZmFsc2V9LHZhbDpmdW5jdGlvbihhKXtpZihhPT09dyl7dmFyIGI9dGhpc1swXTtpZihiKXtpZihjLm5vZGVOYW1lKGIsIm9wdGlvbiIpKXJldHVybihiLmF0dHJpYnV0ZXMudmFsdWV8fHt9KS5zcGVjaWZpZWQ/Yi52YWx1ZTpiLnRleHQ7aWYoYy5ub2RlTmFtZShiLCJzZWxlY3QiKSl7dmFyIGQ9Yi5zZWxlY3RlZEluZGV4LGY9W10sZT1iLm9wdGlvbnM7Yj1iLnR5cGU9PT0ic2VsZWN0LW9uZSI7aWYoZDwwKXJldHVybiBudWxsO3ZhciBqPWI/ZDowO2ZvcihkPWI/ZCsxOmUubGVuZ3RoO2o8ZDtqKyspe3ZhciBpPQplW2pdO2lmKGkuc2VsZWN0ZWQpe2E9YyhpKS52YWwoKTtpZihiKXJldHVybiBhO2YucHVzaChhKX19cmV0dXJuIGZ9aWYoQmEudGVzdChiLnR5cGUpJiYhYy5zdXBwb3J0LmNoZWNrT24pcmV0dXJuIGIuZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpPT09bnVsbD8ib24iOmIudmFsdWU7cmV0dXJuKGIudmFsdWV8fCIiKS5yZXBsYWNlKFphLCIiKX1yZXR1cm4gd312YXIgbz1jLmlzRnVuY3Rpb24oYSk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihrKXt2YXIgbj1jKHRoaXMpLHI9YTtpZih0aGlzLm5vZGVUeXBlPT09MSl7aWYobylyPWEuY2FsbCh0aGlzLGssbi52YWwoKSk7aWYodHlwZW9mIHI9PT0ibnVtYmVyIilyKz0iIjtpZihjLmlzQXJyYXkocikmJkJhLnRlc3QodGhpcy50eXBlKSl0aGlzLmNoZWNrZWQ9Yy5pbkFycmF5KG4udmFsKCkscik+PTA7ZWxzZSBpZihjLm5vZGVOYW1lKHRoaXMsInNlbGVjdCIpKXt2YXIgdT1jLm1ha2VBcnJheShyKTtjKCJvcHRpb24iLHRoaXMpLmVhY2goZnVuY3Rpb24oKXt0aGlzLnNlbGVjdGVkPQpjLmluQXJyYXkoYyh0aGlzKS52YWwoKSx1KT49MH0pO2lmKCF1Lmxlbmd0aCl0aGlzLnNlbGVjdGVkSW5kZXg9LTF9ZWxzZSB0aGlzLnZhbHVlPXJ9fSl9fSk7Yy5leHRlbmQoe2F0dHJGbjp7dmFsOnRydWUsY3NzOnRydWUsaHRtbDp0cnVlLHRleHQ6dHJ1ZSxkYXRhOnRydWUsd2lkdGg6dHJ1ZSxoZWlnaHQ6dHJ1ZSxvZmZzZXQ6dHJ1ZX0sYXR0cjpmdW5jdGlvbihhLGIsZCxmKXtpZighYXx8YS5ub2RlVHlwZT09PTN8fGEubm9kZVR5cGU9PT04KXJldHVybiB3O2lmKGYmJmIgaW4gYy5hdHRyRm4pcmV0dXJuIGMoYSlbYl0oZCk7Zj1hLm5vZGVUeXBlIT09MXx8IWMuaXNYTUxEb2MoYSk7dmFyIGU9ZCE9PXc7Yj1mJiZjLnByb3BzW2JdfHxiO2lmKGEubm9kZVR5cGU9PT0xKXt2YXIgaj0kYS50ZXN0KGIpO2lmKGIgaW4gYSYmZiYmIWope2lmKGUpe2I9PT0idHlwZSImJmFiLnRlc3QoYS5ub2RlTmFtZSkmJmEucGFyZW50Tm9kZSYmYy5lcnJvcigidHlwZSBwcm9wZXJ0eSBjYW4ndCBiZSBjaGFuZ2VkIik7CmFbYl09ZH1pZihjLm5vZGVOYW1lKGEsImZvcm0iKSYmYS5nZXRBdHRyaWJ1dGVOb2RlKGIpKXJldHVybiBhLmdldEF0dHJpYnV0ZU5vZGUoYikubm9kZVZhbHVlO2lmKGI9PT0idGFiSW5kZXgiKXJldHVybihiPWEuZ2V0QXR0cmlidXRlTm9kZSgidGFiSW5kZXgiKSkmJmIuc3BlY2lmaWVkP2IudmFsdWU6YmIudGVzdChhLm5vZGVOYW1lKXx8Y2IudGVzdChhLm5vZGVOYW1lKSYmYS5ocmVmPzA6dztyZXR1cm4gYVtiXX1pZighYy5zdXBwb3J0LnN0eWxlJiZmJiZiPT09InN0eWxlIil7aWYoZSlhLnN0eWxlLmNzc1RleHQ9IiIrZDtyZXR1cm4gYS5zdHlsZS5jc3NUZXh0fWUmJmEuc2V0QXR0cmlidXRlKGIsIiIrZCk7YT0hYy5zdXBwb3J0LmhyZWZOb3JtYWxpemVkJiZmJiZqP2EuZ2V0QXR0cmlidXRlKGIsMik6YS5nZXRBdHRyaWJ1dGUoYik7cmV0dXJuIGE9PT1udWxsP3c6YX1yZXR1cm4gYy5zdHlsZShhLGIsZCl9fSk7dmFyIE89L1wuKC4qKSQvLGRiPWZ1bmN0aW9uKGEpe3JldHVybiBhLnJlcGxhY2UoL1teXHdcc1wuXHxgXS9nLApmdW5jdGlvbihiKXtyZXR1cm4iXFwiK2J9KX07Yy5ldmVudD17YWRkOmZ1bmN0aW9uKGEsYixkLGYpe2lmKCEoYS5ub2RlVHlwZT09PTN8fGEubm9kZVR5cGU9PT04KSl7aWYoYS5zZXRJbnRlcnZhbCYmYSE9PUEmJiFhLmZyYW1lRWxlbWVudClhPUE7dmFyIGUsajtpZihkLmhhbmRsZXIpe2U9ZDtkPWUuaGFuZGxlcn1pZighZC5ndWlkKWQuZ3VpZD1jLmd1aWQrKztpZihqPWMuZGF0YShhKSl7dmFyIGk9ai5ldmVudHM9ai5ldmVudHN8fHt9LG89ai5oYW5kbGU7aWYoIW8pai5oYW5kbGU9bz1mdW5jdGlvbigpe3JldHVybiB0eXBlb2YgYyE9PSJ1bmRlZmluZWQiJiYhYy5ldmVudC50cmlnZ2VyZWQ/Yy5ldmVudC5oYW5kbGUuYXBwbHkoby5lbGVtLGFyZ3VtZW50cyk6d307by5lbGVtPWE7Yj1iLnNwbGl0KCIgIik7Zm9yKHZhciBrLG49MCxyO2s9YltuKytdOyl7aj1lP2MuZXh0ZW5kKHt9LGUpOntoYW5kbGVyOmQsZGF0YTpmfTtpZihrLmluZGV4T2YoIi4iKT4tMSl7cj1rLnNwbGl0KCIuIik7Cms9ci5zaGlmdCgpO2oubmFtZXNwYWNlPXIuc2xpY2UoMCkuc29ydCgpLmpvaW4oIi4iKX1lbHNle3I9W107ai5uYW1lc3BhY2U9IiJ9ai50eXBlPWs7ai5ndWlkPWQuZ3VpZDt2YXIgdT1pW2tdLHo9Yy5ldmVudC5zcGVjaWFsW2tdfHx7fTtpZighdSl7dT1pW2tdPVtdO2lmKCF6LnNldHVwfHx6LnNldHVwLmNhbGwoYSxmLHIsbyk9PT1mYWxzZSlpZihhLmFkZEV2ZW50TGlzdGVuZXIpYS5hZGRFdmVudExpc3RlbmVyKGssbyxmYWxzZSk7ZWxzZSBhLmF0dGFjaEV2ZW50JiZhLmF0dGFjaEV2ZW50KCJvbiIrayxvKX1pZih6LmFkZCl7ei5hZGQuY2FsbChhLGopO2lmKCFqLmhhbmRsZXIuZ3VpZClqLmhhbmRsZXIuZ3VpZD1kLmd1aWR9dS5wdXNoKGopO2MuZXZlbnQuZ2xvYmFsW2tdPXRydWV9YT1udWxsfX19LGdsb2JhbDp7fSxyZW1vdmU6ZnVuY3Rpb24oYSxiLGQsZil7aWYoIShhLm5vZGVUeXBlPT09M3x8YS5ub2RlVHlwZT09PTgpKXt2YXIgZSxqPTAsaSxvLGssbixyLHUsej1jLmRhdGEoYSksCkM9eiYmei5ldmVudHM7aWYoeiYmQyl7aWYoYiYmYi50eXBlKXtkPWIuaGFuZGxlcjtiPWIudHlwZX1pZighYnx8dHlwZW9mIGI9PT0ic3RyaW5nIiYmYi5jaGFyQXQoMCk9PT0iLiIpe2I9Ynx8IiI7Zm9yKGUgaW4gQyljLmV2ZW50LnJlbW92ZShhLGUrYil9ZWxzZXtmb3IoYj1iLnNwbGl0KCIgIik7ZT1iW2orK107KXtuPWU7aT1lLmluZGV4T2YoIi4iKTwwO289W107aWYoIWkpe289ZS5zcGxpdCgiLiIpO2U9by5zaGlmdCgpO2s9bmV3IFJlZ0V4cCgiKF58XFwuKSIrYy5tYXAoby5zbGljZSgwKS5zb3J0KCksZGIpLmpvaW4oIlxcLig/Oi4qXFwuKT8iKSsiKFxcLnwkKSIpfWlmKHI9Q1tlXSlpZihkKXtuPWMuZXZlbnQuc3BlY2lhbFtlXXx8e307Zm9yKEI9Znx8MDtCPHIubGVuZ3RoO0IrKyl7dT1yW0JdO2lmKGQuZ3VpZD09PXUuZ3VpZCl7aWYoaXx8ay50ZXN0KHUubmFtZXNwYWNlKSl7Zj09bnVsbCYmci5zcGxpY2UoQi0tLDEpO24ucmVtb3ZlJiZuLnJlbW92ZS5jYWxsKGEsdSl9aWYoZiE9Cm51bGwpYnJlYWt9fWlmKHIubGVuZ3RoPT09MHx8ZiE9bnVsbCYmci5sZW5ndGg9PT0xKXtpZighbi50ZWFyZG93bnx8bi50ZWFyZG93bi5jYWxsKGEsbyk9PT1mYWxzZSlDYShhLGUsei5oYW5kbGUpO2RlbGV0ZSBDW2VdfX1lbHNlIGZvcih2YXIgQj0wO0I8ci5sZW5ndGg7QisrKXt1PXJbQl07aWYoaXx8ay50ZXN0KHUubmFtZXNwYWNlKSl7Yy5ldmVudC5yZW1vdmUoYSxuLHUuaGFuZGxlcixCKTtyLnNwbGljZShCLS0sMSl9fX1pZihjLmlzRW1wdHlPYmplY3QoQykpe2lmKGI9ei5oYW5kbGUpYi5lbGVtPW51bGw7ZGVsZXRlIHouZXZlbnRzO2RlbGV0ZSB6LmhhbmRsZTtjLmlzRW1wdHlPYmplY3QoeikmJmMucmVtb3ZlRGF0YShhKX19fX19LHRyaWdnZXI6ZnVuY3Rpb24oYSxiLGQsZil7dmFyIGU9YS50eXBlfHxhO2lmKCFmKXthPXR5cGVvZiBhPT09Im9iamVjdCI/YVtHXT9hOmMuZXh0ZW5kKGMuRXZlbnQoZSksYSk6Yy5FdmVudChlKTtpZihlLmluZGV4T2YoIiEiKT49MCl7YS50eXBlPQplPWUuc2xpY2UoMCwtMSk7YS5leGNsdXNpdmU9dHJ1ZX1pZighZCl7YS5zdG9wUHJvcGFnYXRpb24oKTtjLmV2ZW50Lmdsb2JhbFtlXSYmYy5lYWNoKGMuY2FjaGUsZnVuY3Rpb24oKXt0aGlzLmV2ZW50cyYmdGhpcy5ldmVudHNbZV0mJmMuZXZlbnQudHJpZ2dlcihhLGIsdGhpcy5oYW5kbGUuZWxlbSl9KX1pZighZHx8ZC5ub2RlVHlwZT09PTN8fGQubm9kZVR5cGU9PT04KXJldHVybiB3O2EucmVzdWx0PXc7YS50YXJnZXQ9ZDtiPWMubWFrZUFycmF5KGIpO2IudW5zaGlmdChhKX1hLmN1cnJlbnRUYXJnZXQ9ZDsoZj1jLmRhdGEoZCwiaGFuZGxlIikpJiZmLmFwcGx5KGQsYik7Zj1kLnBhcmVudE5vZGV8fGQub3duZXJEb2N1bWVudDt0cnl7aWYoIShkJiZkLm5vZGVOYW1lJiZjLm5vRGF0YVtkLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldKSlpZihkWyJvbiIrZV0mJmRbIm9uIitlXS5hcHBseShkLGIpPT09ZmFsc2UpYS5yZXN1bHQ9ZmFsc2V9Y2F0Y2goail7fWlmKCFhLmlzUHJvcGFnYXRpb25TdG9wcGVkKCkmJgpmKWMuZXZlbnQudHJpZ2dlcihhLGIsZix0cnVlKTtlbHNlIGlmKCFhLmlzRGVmYXVsdFByZXZlbnRlZCgpKXtmPWEudGFyZ2V0O3ZhciBpLG89Yy5ub2RlTmFtZShmLCJhIikmJmU9PT0iY2xpY2siLGs9Yy5ldmVudC5zcGVjaWFsW2VdfHx7fTtpZigoIWsuX2RlZmF1bHR8fGsuX2RlZmF1bHQuY2FsbChkLGEpPT09ZmFsc2UpJiYhbyYmIShmJiZmLm5vZGVOYW1lJiZjLm5vRGF0YVtmLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldKSl7dHJ5e2lmKGZbZV0pe2lmKGk9Zlsib24iK2VdKWZbIm9uIitlXT1udWxsO2MuZXZlbnQudHJpZ2dlcmVkPXRydWU7ZltlXSgpfX1jYXRjaChuKXt9aWYoaSlmWyJvbiIrZV09aTtjLmV2ZW50LnRyaWdnZXJlZD1mYWxzZX19fSxoYW5kbGU6ZnVuY3Rpb24oYSl7dmFyIGIsZCxmLGU7YT1hcmd1bWVudHNbMF09Yy5ldmVudC5maXgoYXx8QS5ldmVudCk7YS5jdXJyZW50VGFyZ2V0PXRoaXM7Yj1hLnR5cGUuaW5kZXhPZigiLiIpPDAmJiFhLmV4Y2x1c2l2ZTsKaWYoIWIpe2Q9YS50eXBlLnNwbGl0KCIuIik7YS50eXBlPWQuc2hpZnQoKTtmPW5ldyBSZWdFeHAoIihefFxcLikiK2Quc2xpY2UoMCkuc29ydCgpLmpvaW4oIlxcLig/Oi4qXFwuKT8iKSsiKFxcLnwkKSIpfWU9Yy5kYXRhKHRoaXMsImV2ZW50cyIpO2Q9ZVthLnR5cGVdO2lmKGUmJmQpe2Q9ZC5zbGljZSgwKTtlPTA7Zm9yKHZhciBqPWQubGVuZ3RoO2U8ajtlKyspe3ZhciBpPWRbZV07aWYoYnx8Zi50ZXN0KGkubmFtZXNwYWNlKSl7YS5oYW5kbGVyPWkuaGFuZGxlcjthLmRhdGE9aS5kYXRhO2EuaGFuZGxlT2JqPWk7aT1pLmhhbmRsZXIuYXBwbHkodGhpcyxhcmd1bWVudHMpO2lmKGkhPT13KXthLnJlc3VsdD1pO2lmKGk9PT1mYWxzZSl7YS5wcmV2ZW50RGVmYXVsdCgpO2Euc3RvcFByb3BhZ2F0aW9uKCl9fWlmKGEuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQoKSlicmVha319fXJldHVybiBhLnJlc3VsdH0scHJvcHM6ImFsdEtleSBhdHRyQ2hhbmdlIGF0dHJOYW1lIGJ1YmJsZXMgYnV0dG9uIGNhbmNlbGFibGUgY2hhckNvZGUgY2xpZW50WCBjbGllbnRZIGN0cmxLZXkgY3VycmVudFRhcmdldCBkYXRhIGRldGFpbCBldmVudFBoYXNlIGZyb21FbGVtZW50IGhhbmRsZXIga2V5Q29kZSBsYXllclggbGF5ZXJZIG1ldGFLZXkgbmV3VmFsdWUgb2Zmc2V0WCBvZmZzZXRZIG9yaWdpbmFsVGFyZ2V0IHBhZ2VYIHBhZ2VZIHByZXZWYWx1ZSByZWxhdGVkTm9kZSByZWxhdGVkVGFyZ2V0IHNjcmVlblggc2NyZWVuWSBzaGlmdEtleSBzcmNFbGVtZW50IHRhcmdldCB0b0VsZW1lbnQgdmlldyB3aGVlbERlbHRhIHdoaWNoIi5zcGxpdCgiICIpLApmaXg6ZnVuY3Rpb24oYSl7aWYoYVtHXSlyZXR1cm4gYTt2YXIgYj1hO2E9Yy5FdmVudChiKTtmb3IodmFyIGQ9dGhpcy5wcm9wcy5sZW5ndGgsZjtkOyl7Zj10aGlzLnByb3BzWy0tZF07YVtmXT1iW2ZdfWlmKCFhLnRhcmdldClhLnRhcmdldD1hLnNyY0VsZW1lbnR8fHM7aWYoYS50YXJnZXQubm9kZVR5cGU9PT0zKWEudGFyZ2V0PWEudGFyZ2V0LnBhcmVudE5vZGU7aWYoIWEucmVsYXRlZFRhcmdldCYmYS5mcm9tRWxlbWVudClhLnJlbGF0ZWRUYXJnZXQ9YS5mcm9tRWxlbWVudD09PWEudGFyZ2V0P2EudG9FbGVtZW50OmEuZnJvbUVsZW1lbnQ7aWYoYS5wYWdlWD09bnVsbCYmYS5jbGllbnRYIT1udWxsKXtiPXMuZG9jdW1lbnRFbGVtZW50O2Q9cy5ib2R5O2EucGFnZVg9YS5jbGllbnRYKyhiJiZiLnNjcm9sbExlZnR8fGQmJmQuc2Nyb2xsTGVmdHx8MCktKGImJmIuY2xpZW50TGVmdHx8ZCYmZC5jbGllbnRMZWZ0fHwwKTthLnBhZ2VZPWEuY2xpZW50WSsoYiYmYi5zY3JvbGxUb3B8fApkJiZkLnNjcm9sbFRvcHx8MCktKGImJmIuY2xpZW50VG9wfHxkJiZkLmNsaWVudFRvcHx8MCl9aWYoIWEud2hpY2gmJihhLmNoYXJDb2RlfHxhLmNoYXJDb2RlPT09MD9hLmNoYXJDb2RlOmEua2V5Q29kZSkpYS53aGljaD1hLmNoYXJDb2RlfHxhLmtleUNvZGU7aWYoIWEubWV0YUtleSYmYS5jdHJsS2V5KWEubWV0YUtleT1hLmN0cmxLZXk7aWYoIWEud2hpY2gmJmEuYnV0dG9uIT09dylhLndoaWNoPWEuYnV0dG9uJjE/MTphLmJ1dHRvbiYyPzM6YS5idXR0b24mND8yOjA7cmV0dXJuIGF9LGd1aWQ6MUU4LHByb3h5OmMucHJveHksc3BlY2lhbDp7cmVhZHk6e3NldHVwOmMuYmluZFJlYWR5LHRlYXJkb3duOmMubm9vcH0sbGl2ZTp7YWRkOmZ1bmN0aW9uKGEpe2MuZXZlbnQuYWRkKHRoaXMsYS5vcmlnVHlwZSxjLmV4dGVuZCh7fSxhLHtoYW5kbGVyOm9hfSkpfSxyZW1vdmU6ZnVuY3Rpb24oYSl7dmFyIGI9dHJ1ZSxkPWEub3JpZ1R5cGUucmVwbGFjZShPLCIiKTtjLmVhY2goYy5kYXRhKHRoaXMsCiJldmVudHMiKS5saXZlfHxbXSxmdW5jdGlvbigpe2lmKGQ9PT10aGlzLm9yaWdUeXBlLnJlcGxhY2UoTywiIikpcmV0dXJuIGI9ZmFsc2V9KTtiJiZjLmV2ZW50LnJlbW92ZSh0aGlzLGEub3JpZ1R5cGUsb2EpfX0sYmVmb3JldW5sb2FkOntzZXR1cDpmdW5jdGlvbihhLGIsZCl7aWYodGhpcy5zZXRJbnRlcnZhbCl0aGlzLm9uYmVmb3JldW5sb2FkPWQ7cmV0dXJuIGZhbHNlfSx0ZWFyZG93bjpmdW5jdGlvbihhLGIpe2lmKHRoaXMub25iZWZvcmV1bmxvYWQ9PT1iKXRoaXMub25iZWZvcmV1bmxvYWQ9bnVsbH19fX07dmFyIENhPXMucmVtb3ZlRXZlbnRMaXN0ZW5lcj9mdW5jdGlvbihhLGIsZCl7YS5yZW1vdmVFdmVudExpc3RlbmVyKGIsZCxmYWxzZSl9OmZ1bmN0aW9uKGEsYixkKXthLmRldGFjaEV2ZW50KCJvbiIrYixkKX07Yy5FdmVudD1mdW5jdGlvbihhKXtpZighdGhpcy5wcmV2ZW50RGVmYXVsdClyZXR1cm4gbmV3IGMuRXZlbnQoYSk7aWYoYSYmYS50eXBlKXt0aGlzLm9yaWdpbmFsRXZlbnQ9CmE7dGhpcy50eXBlPWEudHlwZX1lbHNlIHRoaXMudHlwZT1hO3RoaXMudGltZVN0YW1wPUooKTt0aGlzW0ddPXRydWV9O2MuRXZlbnQucHJvdG90eXBlPXtwcmV2ZW50RGVmYXVsdDpmdW5jdGlvbigpe3RoaXMuaXNEZWZhdWx0UHJldmVudGVkPVo7dmFyIGE9dGhpcy5vcmlnaW5hbEV2ZW50O2lmKGEpe2EucHJldmVudERlZmF1bHQmJmEucHJldmVudERlZmF1bHQoKTthLnJldHVyblZhbHVlPWZhbHNlfX0sc3RvcFByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dGhpcy5pc1Byb3BhZ2F0aW9uU3RvcHBlZD1aO3ZhciBhPXRoaXMub3JpZ2luYWxFdmVudDtpZihhKXthLnN0b3BQcm9wYWdhdGlvbiYmYS5zdG9wUHJvcGFnYXRpb24oKTthLmNhbmNlbEJ1YmJsZT10cnVlfX0sc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dGhpcy5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZD1aO3RoaXMuc3RvcFByb3BhZ2F0aW9uKCl9LGlzRGVmYXVsdFByZXZlbnRlZDpZLGlzUHJvcGFnYXRpb25TdG9wcGVkOlksCmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkOll9O3ZhciBEYT1mdW5jdGlvbihhKXt2YXIgYj1hLnJlbGF0ZWRUYXJnZXQ7dHJ5e2Zvcig7YiYmYiE9PXRoaXM7KWI9Yi5wYXJlbnROb2RlO2lmKGIhPT10aGlzKXthLnR5cGU9YS5kYXRhO2MuZXZlbnQuaGFuZGxlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19Y2F0Y2goZCl7fX0sRWE9ZnVuY3Rpb24oYSl7YS50eXBlPWEuZGF0YTtjLmV2ZW50LmhhbmRsZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9O2MuZWFjaCh7bW91c2VlbnRlcjoibW91c2VvdmVyIixtb3VzZWxlYXZlOiJtb3VzZW91dCJ9LGZ1bmN0aW9uKGEsYil7Yy5ldmVudC5zcGVjaWFsW2FdPXtzZXR1cDpmdW5jdGlvbihkKXtjLmV2ZW50LmFkZCh0aGlzLGIsZCYmZC5zZWxlY3Rvcj9FYTpEYSxhKX0sdGVhcmRvd246ZnVuY3Rpb24oZCl7Yy5ldmVudC5yZW1vdmUodGhpcyxiLGQmJmQuc2VsZWN0b3I/RWE6RGEpfX19KTtpZighYy5zdXBwb3J0LnN1Ym1pdEJ1YmJsZXMpYy5ldmVudC5zcGVjaWFsLnN1Ym1pdD0Ke3NldHVwOmZ1bmN0aW9uKCl7aWYodGhpcy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIT09ImZvcm0iKXtjLmV2ZW50LmFkZCh0aGlzLCJjbGljay5zcGVjaWFsU3VibWl0IixmdW5jdGlvbihhKXt2YXIgYj1hLnRhcmdldCxkPWIudHlwZTtpZigoZD09PSJzdWJtaXQifHxkPT09ImltYWdlIikmJmMoYikuY2xvc2VzdCgiZm9ybSIpLmxlbmd0aClyZXR1cm4gbmEoInN1Ym1pdCIsdGhpcyxhcmd1bWVudHMpfSk7Yy5ldmVudC5hZGQodGhpcywia2V5cHJlc3Muc3BlY2lhbFN1Ym1pdCIsZnVuY3Rpb24oYSl7dmFyIGI9YS50YXJnZXQsZD1iLnR5cGU7aWYoKGQ9PT0idGV4dCJ8fGQ9PT0icGFzc3dvcmQiKSYmYyhiKS5jbG9zZXN0KCJmb3JtIikubGVuZ3RoJiZhLmtleUNvZGU9PT0xMylyZXR1cm4gbmEoInN1Ym1pdCIsdGhpcyxhcmd1bWVudHMpfSl9ZWxzZSByZXR1cm4gZmFsc2V9LHRlYXJkb3duOmZ1bmN0aW9uKCl7Yy5ldmVudC5yZW1vdmUodGhpcywiLnNwZWNpYWxTdWJtaXQiKX19OwppZighYy5zdXBwb3J0LmNoYW5nZUJ1YmJsZXMpe3ZhciBkYT0vdGV4dGFyZWF8aW5wdXR8c2VsZWN0L2ksZWEsRmE9ZnVuY3Rpb24oYSl7dmFyIGI9YS50eXBlLGQ9YS52YWx1ZTtpZihiPT09InJhZGlvInx8Yj09PSJjaGVja2JveCIpZD1hLmNoZWNrZWQ7ZWxzZSBpZihiPT09InNlbGVjdC1tdWx0aXBsZSIpZD1hLnNlbGVjdGVkSW5kZXg+LTE/Yy5tYXAoYS5vcHRpb25zLGZ1bmN0aW9uKGYpe3JldHVybiBmLnNlbGVjdGVkfSkuam9pbigiLSIpOiIiO2Vsc2UgaWYoYS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09InNlbGVjdCIpZD1hLnNlbGVjdGVkSW5kZXg7cmV0dXJuIGR9LGZhPWZ1bmN0aW9uKGEsYil7dmFyIGQ9YS50YXJnZXQsZixlO2lmKCEoIWRhLnRlc3QoZC5ub2RlTmFtZSl8fGQucmVhZE9ubHkpKXtmPWMuZGF0YShkLCJfY2hhbmdlX2RhdGEiKTtlPUZhKGQpO2lmKGEudHlwZSE9PSJmb2N1c291dCJ8fGQudHlwZSE9PSJyYWRpbyIpYy5kYXRhKGQsIl9jaGFuZ2VfZGF0YSIsCmUpO2lmKCEoZj09PXd8fGU9PT1mKSlpZihmIT1udWxsfHxlKXthLnR5cGU9ImNoYW5nZSI7cmV0dXJuIGMuZXZlbnQudHJpZ2dlcihhLGIsZCl9fX07Yy5ldmVudC5zcGVjaWFsLmNoYW5nZT17ZmlsdGVyczp7Zm9jdXNvdXQ6ZmEsY2xpY2s6ZnVuY3Rpb24oYSl7dmFyIGI9YS50YXJnZXQsZD1iLnR5cGU7aWYoZD09PSJyYWRpbyJ8fGQ9PT0iY2hlY2tib3gifHxiLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT0ic2VsZWN0IilyZXR1cm4gZmEuY2FsbCh0aGlzLGEpfSxrZXlkb3duOmZ1bmN0aW9uKGEpe3ZhciBiPWEudGFyZ2V0LGQ9Yi50eXBlO2lmKGEua2V5Q29kZT09PTEzJiZiLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkhPT0idGV4dGFyZWEifHxhLmtleUNvZGU9PT0zMiYmKGQ9PT0iY2hlY2tib3gifHxkPT09InJhZGlvIil8fGQ9PT0ic2VsZWN0LW11bHRpcGxlIilyZXR1cm4gZmEuY2FsbCh0aGlzLGEpfSxiZWZvcmVhY3RpdmF0ZTpmdW5jdGlvbihhKXthPWEudGFyZ2V0O2MuZGF0YShhLAoiX2NoYW5nZV9kYXRhIixGYShhKSl9fSxzZXR1cDpmdW5jdGlvbigpe2lmKHRoaXMudHlwZT09PSJmaWxlIilyZXR1cm4gZmFsc2U7Zm9yKHZhciBhIGluIGVhKWMuZXZlbnQuYWRkKHRoaXMsYSsiLnNwZWNpYWxDaGFuZ2UiLGVhW2FdKTtyZXR1cm4gZGEudGVzdCh0aGlzLm5vZGVOYW1lKX0sdGVhcmRvd246ZnVuY3Rpb24oKXtjLmV2ZW50LnJlbW92ZSh0aGlzLCIuc3BlY2lhbENoYW5nZSIpO3JldHVybiBkYS50ZXN0KHRoaXMubm9kZU5hbWUpfX07ZWE9Yy5ldmVudC5zcGVjaWFsLmNoYW5nZS5maWx0ZXJzfXMuYWRkRXZlbnRMaXN0ZW5lciYmYy5lYWNoKHtmb2N1czoiZm9jdXNpbiIsYmx1cjoiZm9jdXNvdXQifSxmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGQoZil7Zj1jLmV2ZW50LmZpeChmKTtmLnR5cGU9YjtyZXR1cm4gYy5ldmVudC5oYW5kbGUuY2FsbCh0aGlzLGYpfWMuZXZlbnQuc3BlY2lhbFtiXT17c2V0dXA6ZnVuY3Rpb24oKXt0aGlzLmFkZEV2ZW50TGlzdGVuZXIoYSwKZCx0cnVlKX0sdGVhcmRvd246ZnVuY3Rpb24oKXt0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoYSxkLHRydWUpfX19KTtjLmVhY2goWyJiaW5kIiwib25lIl0sZnVuY3Rpb24oYSxiKXtjLmZuW2JdPWZ1bmN0aW9uKGQsZixlKXtpZih0eXBlb2YgZD09PSJvYmplY3QiKXtmb3IodmFyIGogaW4gZCl0aGlzW2JdKGosZixkW2pdLGUpO3JldHVybiB0aGlzfWlmKGMuaXNGdW5jdGlvbihmKSl7ZT1mO2Y9d312YXIgaT1iPT09Im9uZSI/Yy5wcm94eShlLGZ1bmN0aW9uKGspe2ModGhpcykudW5iaW5kKGssaSk7cmV0dXJuIGUuYXBwbHkodGhpcyxhcmd1bWVudHMpfSk6ZTtpZihkPT09InVubG9hZCImJmIhPT0ib25lIil0aGlzLm9uZShkLGYsZSk7ZWxzZXtqPTA7Zm9yKHZhciBvPXRoaXMubGVuZ3RoO2o8bztqKyspYy5ldmVudC5hZGQodGhpc1tqXSxkLGksZil9cmV0dXJuIHRoaXN9fSk7Yy5mbi5leHRlbmQoe3VuYmluZDpmdW5jdGlvbihhLGIpe2lmKHR5cGVvZiBhPT09Im9iamVjdCImJgohYS5wcmV2ZW50RGVmYXVsdClmb3IodmFyIGQgaW4gYSl0aGlzLnVuYmluZChkLGFbZF0pO2Vsc2V7ZD0wO2Zvcih2YXIgZj10aGlzLmxlbmd0aDtkPGY7ZCsrKWMuZXZlbnQucmVtb3ZlKHRoaXNbZF0sYSxiKX1yZXR1cm4gdGhpc30sZGVsZWdhdGU6ZnVuY3Rpb24oYSxiLGQsZil7cmV0dXJuIHRoaXMubGl2ZShiLGQsZixhKX0sdW5kZWxlZ2F0ZTpmdW5jdGlvbihhLGIsZCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg9PT0wP3RoaXMudW5iaW5kKCJsaXZlIik6dGhpcy5kaWUoYixudWxsLGQsYSl9LHRyaWdnZXI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Yy5ldmVudC50cmlnZ2VyKGEsYix0aGlzKX0pfSx0cmlnZ2VySGFuZGxlcjpmdW5jdGlvbihhLGIpe2lmKHRoaXNbMF0pe2E9Yy5FdmVudChhKTthLnByZXZlbnREZWZhdWx0KCk7YS5zdG9wUHJvcGFnYXRpb24oKTtjLmV2ZW50LnRyaWdnZXIoYSxiLHRoaXNbMF0pO3JldHVybiBhLnJlc3VsdH19LAp0b2dnbGU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPWFyZ3VtZW50cyxkPTE7ZDxiLmxlbmd0aDspYy5wcm94eShhLGJbZCsrXSk7cmV0dXJuIHRoaXMuY2xpY2soYy5wcm94eShhLGZ1bmN0aW9uKGYpe3ZhciBlPShjLmRhdGEodGhpcywibGFzdFRvZ2dsZSIrYS5ndWlkKXx8MCklZDtjLmRhdGEodGhpcywibGFzdFRvZ2dsZSIrYS5ndWlkLGUrMSk7Zi5wcmV2ZW50RGVmYXVsdCgpO3JldHVybiBiW2VdLmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8ZmFsc2V9KSl9LGhvdmVyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMubW91c2VlbnRlcihhKS5tb3VzZWxlYXZlKGJ8fGEpfX0pO3ZhciBHYT17Zm9jdXM6ImZvY3VzaW4iLGJsdXI6ImZvY3Vzb3V0Iixtb3VzZWVudGVyOiJtb3VzZW92ZXIiLG1vdXNlbGVhdmU6Im1vdXNlb3V0In07Yy5lYWNoKFsibGl2ZSIsImRpZSJdLGZ1bmN0aW9uKGEsYil7Yy5mbltiXT1mdW5jdGlvbihkLGYsZSxqKXt2YXIgaSxvPTAsayxuLHI9anx8dGhpcy5zZWxlY3RvciwKdT1qP3RoaXM6Yyh0aGlzLmNvbnRleHQpO2lmKGMuaXNGdW5jdGlvbihmKSl7ZT1mO2Y9d31mb3IoZD0oZHx8IiIpLnNwbGl0KCIgIik7KGk9ZFtvKytdKSE9bnVsbDspe2o9Ty5leGVjKGkpO2s9IiI7aWYoail7az1qWzBdO2k9aS5yZXBsYWNlKE8sIiIpfWlmKGk9PT0iaG92ZXIiKWQucHVzaCgibW91c2VlbnRlciIraywibW91c2VsZWF2ZSIrayk7ZWxzZXtuPWk7aWYoaT09PSJmb2N1cyJ8fGk9PT0iYmx1ciIpe2QucHVzaChHYVtpXStrKTtpKz1rfWVsc2UgaT0oR2FbaV18fGkpK2s7Yj09PSJsaXZlIj91LmVhY2goZnVuY3Rpb24oKXtjLmV2ZW50LmFkZCh0aGlzLHBhKGkscikse2RhdGE6ZixzZWxlY3RvcjpyLGhhbmRsZXI6ZSxvcmlnVHlwZTppLG9yaWdIYW5kbGVyOmUscHJlVHlwZTpufSl9KTp1LnVuYmluZChwYShpLHIpLGUpfX1yZXR1cm4gdGhpc319KTtjLmVhY2goImJsdXIgZm9jdXMgZm9jdXNpbiBmb2N1c291dCBsb2FkIHJlc2l6ZSBzY3JvbGwgdW5sb2FkIGNsaWNrIGRibGNsaWNrIG1vdXNlZG93biBtb3VzZXVwIG1vdXNlbW92ZSBtb3VzZW92ZXIgbW91c2VvdXQgbW91c2VlbnRlciBtb3VzZWxlYXZlIGNoYW5nZSBzZWxlY3Qgc3VibWl0IGtleWRvd24ga2V5cHJlc3Mga2V5dXAgZXJyb3IiLnNwbGl0KCIgIiksCmZ1bmN0aW9uKGEsYil7Yy5mbltiXT1mdW5jdGlvbihkKXtyZXR1cm4gZD90aGlzLmJpbmQoYixkKTp0aGlzLnRyaWdnZXIoYil9O2lmKGMuYXR0ckZuKWMuYXR0ckZuW2JdPXRydWV9KTtBLmF0dGFjaEV2ZW50JiYhQS5hZGRFdmVudExpc3RlbmVyJiZBLmF0dGFjaEV2ZW50KCJvbnVubG9hZCIsZnVuY3Rpb24oKXtmb3IodmFyIGEgaW4gYy5jYWNoZSlpZihjLmNhY2hlW2FdLmhhbmRsZSl0cnl7Yy5ldmVudC5yZW1vdmUoYy5jYWNoZVthXS5oYW5kbGUuZWxlbSl9Y2F0Y2goYil7fX0pOyhmdW5jdGlvbigpe2Z1bmN0aW9uIGEoZyl7Zm9yKHZhciBoPSIiLGwsbT0wO2dbbV07bSsrKXtsPWdbbV07aWYobC5ub2RlVHlwZT09PTN8fGwubm9kZVR5cGU9PT00KWgrPWwubm9kZVZhbHVlO2Vsc2UgaWYobC5ub2RlVHlwZSE9PTgpaCs9YShsLmNoaWxkTm9kZXMpfXJldHVybiBofWZ1bmN0aW9uIGIoZyxoLGwsbSxxLHApe3E9MDtmb3IodmFyIHY9bS5sZW5ndGg7cTx2O3ErKyl7dmFyIHQ9bVtxXTsKaWYodCl7dD10W2ddO2Zvcih2YXIgeT1mYWxzZTt0Oyl7aWYodC5zaXpjYWNoZT09PWwpe3k9bVt0LnNpenNldF07YnJlYWt9aWYodC5ub2RlVHlwZT09PTEmJiFwKXt0LnNpemNhY2hlPWw7dC5zaXpzZXQ9cX1pZih0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1oKXt5PXQ7YnJlYWt9dD10W2ddfW1bcV09eX19fWZ1bmN0aW9uIGQoZyxoLGwsbSxxLHApe3E9MDtmb3IodmFyIHY9bS5sZW5ndGg7cTx2O3ErKyl7dmFyIHQ9bVtxXTtpZih0KXt0PXRbZ107Zm9yKHZhciB5PWZhbHNlO3Q7KXtpZih0LnNpemNhY2hlPT09bCl7eT1tW3Quc2l6c2V0XTticmVha31pZih0Lm5vZGVUeXBlPT09MSl7aWYoIXApe3Quc2l6Y2FjaGU9bDt0LnNpenNldD1xfWlmKHR5cGVvZiBoIT09InN0cmluZyIpe2lmKHQ9PT1oKXt5PXRydWU7YnJlYWt9fWVsc2UgaWYoay5maWx0ZXIoaCxbdF0pLmxlbmd0aD4wKXt5PXQ7YnJlYWt9fXQ9dFtnXX1tW3FdPXl9fX12YXIgZj0vKCg/OlwoKD86XChbXigpXStcKXxbXigpXSspK1wpfFxbKD86XFtbXltcXV0qXF18WyciXVteJyJdKlsnIl18W15bXF0nIl0rKStcXXxcXC58W14gPit+LChcW1xcXSspK3xbPit+XSkoXHMqLFxzKik/KCg/Oi58XHJ8XG4pKikvZywKZT0wLGo9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyxpPWZhbHNlLG89dHJ1ZTtbMCwwXS5zb3J0KGZ1bmN0aW9uKCl7bz1mYWxzZTtyZXR1cm4gMH0pO3ZhciBrPWZ1bmN0aW9uKGcsaCxsLG0pe2w9bHx8W107dmFyIHE9aD1ofHxzO2lmKGgubm9kZVR5cGUhPT0xJiZoLm5vZGVUeXBlIT09OSlyZXR1cm5bXTtpZighZ3x8dHlwZW9mIGchPT0ic3RyaW5nIilyZXR1cm4gbDtmb3IodmFyIHA9W10sdix0LHksUyxIPXRydWUsTT14KGgpLEk9ZzsoZi5leGVjKCIiKSx2PWYuZXhlYyhJKSkhPT1udWxsOyl7ST12WzNdO3AucHVzaCh2WzFdKTtpZih2WzJdKXtTPXZbM107YnJlYWt9fWlmKHAubGVuZ3RoPjEmJnIuZXhlYyhnKSlpZihwLmxlbmd0aD09PTImJm4ucmVsYXRpdmVbcFswXV0pdD1nYShwWzBdK3BbMV0saCk7ZWxzZSBmb3IodD1uLnJlbGF0aXZlW3BbMF1dP1toXTprKHAuc2hpZnQoKSxoKTtwLmxlbmd0aDspe2c9cC5zaGlmdCgpO2lmKG4ucmVsYXRpdmVbZ10pZys9cC5zaGlmdCgpOwp0PWdhKGcsdCl9ZWxzZXtpZighbSYmcC5sZW5ndGg+MSYmaC5ub2RlVHlwZT09PTkmJiFNJiZuLm1hdGNoLklELnRlc3QocFswXSkmJiFuLm1hdGNoLklELnRlc3QocFtwLmxlbmd0aC0xXSkpe3Y9ay5maW5kKHAuc2hpZnQoKSxoLE0pO2g9di5leHByP2suZmlsdGVyKHYuZXhwcix2LnNldClbMF06di5zZXRbMF19aWYoaCl7dj1tP3tleHByOnAucG9wKCksc2V0OnoobSl9OmsuZmluZChwLnBvcCgpLHAubGVuZ3RoPT09MSYmKHBbMF09PT0ifiJ8fHBbMF09PT0iKyIpJiZoLnBhcmVudE5vZGU/aC5wYXJlbnROb2RlOmgsTSk7dD12LmV4cHI/ay5maWx0ZXIodi5leHByLHYuc2V0KTp2LnNldDtpZihwLmxlbmd0aD4wKXk9eih0KTtlbHNlIEg9ZmFsc2U7Zm9yKDtwLmxlbmd0aDspe3ZhciBEPXAucG9wKCk7dj1EO2lmKG4ucmVsYXRpdmVbRF0pdj1wLnBvcCgpO2Vsc2UgRD0iIjtpZih2PT1udWxsKXY9aDtuLnJlbGF0aXZlW0RdKHksdixNKX19ZWxzZSB5PVtdfXl8fCh5PXQpO3l8fGsuZXJyb3IoRHx8CmcpO2lmKGouY2FsbCh5KT09PSJbb2JqZWN0IEFycmF5XSIpaWYoSClpZihoJiZoLm5vZGVUeXBlPT09MSlmb3IoZz0wO3lbZ10hPW51bGw7ZysrKXtpZih5W2ddJiYoeVtnXT09PXRydWV8fHlbZ10ubm9kZVR5cGU9PT0xJiZFKGgseVtnXSkpKWwucHVzaCh0W2ddKX1lbHNlIGZvcihnPTA7eVtnXSE9bnVsbDtnKyspeVtnXSYmeVtnXS5ub2RlVHlwZT09PTEmJmwucHVzaCh0W2ddKTtlbHNlIGwucHVzaC5hcHBseShsLHkpO2Vsc2Ugeih5LGwpO2lmKFMpe2soUyxxLGwsbSk7ay51bmlxdWVTb3J0KGwpfXJldHVybiBsfTtrLnVuaXF1ZVNvcnQ9ZnVuY3Rpb24oZyl7aWYoQil7aT1vO2cuc29ydChCKTtpZihpKWZvcih2YXIgaD0xO2g8Zy5sZW5ndGg7aCsrKWdbaF09PT1nW2gtMV0mJmcuc3BsaWNlKGgtLSwxKX1yZXR1cm4gZ307ay5tYXRjaGVzPWZ1bmN0aW9uKGcsaCl7cmV0dXJuIGsoZyxudWxsLG51bGwsaCl9O2suZmluZD1mdW5jdGlvbihnLGgsbCl7dmFyIG0scTtpZighZylyZXR1cm5bXTsKZm9yKHZhciBwPTAsdj1uLm9yZGVyLmxlbmd0aDtwPHY7cCsrKXt2YXIgdD1uLm9yZGVyW3BdO2lmKHE9bi5sZWZ0TWF0Y2hbdF0uZXhlYyhnKSl7dmFyIHk9cVsxXTtxLnNwbGljZSgxLDEpO2lmKHkuc3Vic3RyKHkubGVuZ3RoLTEpIT09IlxcIil7cVsxXT0ocVsxXXx8IiIpLnJlcGxhY2UoL1xcL2csIiIpO209bi5maW5kW3RdKHEsaCxsKTtpZihtIT1udWxsKXtnPWcucmVwbGFjZShuLm1hdGNoW3RdLCIiKTticmVha319fX1tfHwobT1oLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikpO3JldHVybntzZXQ6bSxleHByOmd9fTtrLmZpbHRlcj1mdW5jdGlvbihnLGgsbCxtKXtmb3IodmFyIHE9ZyxwPVtdLHY9aCx0LHksUz1oJiZoWzBdJiZ4KGhbMF0pO2cmJmgubGVuZ3RoOyl7Zm9yKHZhciBIIGluIG4uZmlsdGVyKWlmKCh0PW4ubGVmdE1hdGNoW0hdLmV4ZWMoZykpIT1udWxsJiZ0WzJdKXt2YXIgTT1uLmZpbHRlcltIXSxJLEQ7RD10WzFdO3k9ZmFsc2U7dC5zcGxpY2UoMSwxKTtpZihELnN1YnN0cihELmxlbmd0aC0KMSkhPT0iXFwiKXtpZih2PT09cClwPVtdO2lmKG4ucHJlRmlsdGVyW0hdKWlmKHQ9bi5wcmVGaWx0ZXJbSF0odCx2LGwscCxtLFMpKXtpZih0PT09dHJ1ZSljb250aW51ZX1lbHNlIHk9ST10cnVlO2lmKHQpZm9yKHZhciBVPTA7KEQ9dltVXSkhPW51bGw7VSsrKWlmKEQpe0k9TShELHQsVSx2KTt2YXIgSGE9bV4hIUk7aWYobCYmSSE9bnVsbClpZihIYSl5PXRydWU7ZWxzZSB2W1VdPWZhbHNlO2Vsc2UgaWYoSGEpe3AucHVzaChEKTt5PXRydWV9fWlmKEkhPT13KXtsfHwodj1wKTtnPWcucmVwbGFjZShuLm1hdGNoW0hdLCIiKTtpZigheSlyZXR1cm5bXTticmVha319fWlmKGc9PT1xKWlmKHk9PW51bGwpay5lcnJvcihnKTtlbHNlIGJyZWFrO3E9Z31yZXR1cm4gdn07ay5lcnJvcj1mdW5jdGlvbihnKXt0aHJvdyJTeW50YXggZXJyb3IsIHVucmVjb2duaXplZCBleHByZXNzaW9uOiAiK2c7fTt2YXIgbj1rLnNlbGVjdG9ycz17b3JkZXI6WyJJRCIsIk5BTUUiLCJUQUciXSxtYXRjaDp7SUQ6LyMoKD86W1x3XHUwMGMwLVx1RkZGRi1dfFxcLikrKS8sCkNMQVNTOi9cLigoPzpbXHdcdTAwYzAtXHVGRkZGLV18XFwuKSspLyxOQU1FOi9cW25hbWU9WyciXSooKD86W1x3XHUwMGMwLVx1RkZGRi1dfFxcLikrKVsnIl0qXF0vLEFUVFI6L1xbXHMqKCg/Oltcd1x1MDBjMC1cdUZGRkYtXXxcXC4pKylccyooPzooXFM/PSlccyooWyciXSopKC4qPylcM3wpXHMqXF0vLFRBRzovXigoPzpbXHdcdTAwYzAtXHVGRkZGXCotXXxcXC4pKykvLENISUxEOi86KG9ubHl8bnRofGxhc3R8Zmlyc3QpLWNoaWxkKD86XCgoZXZlbnxvZGR8W1xkbistXSopXCkpPy8sUE9TOi86KG50aHxlcXxndHxsdHxmaXJzdHxsYXN0fGV2ZW58b2RkKSg/OlwoKFxkKilcKSk/KD89W14tXXwkKS8sUFNFVURPOi86KCg/Oltcd1x1MDBjMC1cdUZGRkYtXXxcXC4pKykoPzpcKChbJyJdPykoKD86XChbXlwpXStcKXxbXlwoXCldKikrKVwyXCkpPy99LGxlZnRNYXRjaDp7fSxhdHRyTWFwOnsiY2xhc3MiOiJjbGFzc05hbWUiLCJmb3IiOiJodG1sRm9yIn0sYXR0ckhhbmRsZTp7aHJlZjpmdW5jdGlvbihnKXtyZXR1cm4gZy5nZXRBdHRyaWJ1dGUoImhyZWYiKX19LApyZWxhdGl2ZTp7IisiOmZ1bmN0aW9uKGcsaCl7dmFyIGw9dHlwZW9mIGg9PT0ic3RyaW5nIixtPWwmJiEvXFcvLnRlc3QoaCk7bD1sJiYhbTtpZihtKWg9aC50b0xvd2VyQ2FzZSgpO209MDtmb3IodmFyIHE9Zy5sZW5ndGgscDttPHE7bSsrKWlmKHA9Z1ttXSl7Zm9yKDsocD1wLnByZXZpb3VzU2libGluZykmJnAubm9kZVR5cGUhPT0xOyk7Z1ttXT1sfHxwJiZwLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1oP3B8fGZhbHNlOnA9PT1ofWwmJmsuZmlsdGVyKGgsZyx0cnVlKX0sIj4iOmZ1bmN0aW9uKGcsaCl7dmFyIGw9dHlwZW9mIGg9PT0ic3RyaW5nIjtpZihsJiYhL1xXLy50ZXN0KGgpKXtoPWgudG9Mb3dlckNhc2UoKTtmb3IodmFyIG09MCxxPWcubGVuZ3RoO208cTttKyspe3ZhciBwPWdbbV07aWYocCl7bD1wLnBhcmVudE5vZGU7Z1ttXT1sLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1oP2w6ZmFsc2V9fX1lbHNle209MDtmb3IocT1nLmxlbmd0aDttPHE7bSsrKWlmKHA9Z1ttXSlnW21dPQpsP3AucGFyZW50Tm9kZTpwLnBhcmVudE5vZGU9PT1oO2wmJmsuZmlsdGVyKGgsZyx0cnVlKX19LCIiOmZ1bmN0aW9uKGcsaCxsKXt2YXIgbT1lKysscT1kO2lmKHR5cGVvZiBoPT09InN0cmluZyImJiEvXFcvLnRlc3QoaCkpe3ZhciBwPWg9aC50b0xvd2VyQ2FzZSgpO3E9Yn1xKCJwYXJlbnROb2RlIixoLG0sZyxwLGwpfSwifiI6ZnVuY3Rpb24oZyxoLGwpe3ZhciBtPWUrKyxxPWQ7aWYodHlwZW9mIGg9PT0ic3RyaW5nIiYmIS9cVy8udGVzdChoKSl7dmFyIHA9aD1oLnRvTG93ZXJDYXNlKCk7cT1ifXEoInByZXZpb3VzU2libGluZyIsaCxtLGcscCxsKX19LGZpbmQ6e0lEOmZ1bmN0aW9uKGcsaCxsKXtpZih0eXBlb2YgaC5nZXRFbGVtZW50QnlJZCE9PSJ1bmRlZmluZWQiJiYhbClyZXR1cm4oZz1oLmdldEVsZW1lbnRCeUlkKGdbMV0pKT9bZ106W119LE5BTUU6ZnVuY3Rpb24oZyxoKXtpZih0eXBlb2YgaC5nZXRFbGVtZW50c0J5TmFtZSE9PSJ1bmRlZmluZWQiKXt2YXIgbD1bXTsKaD1oLmdldEVsZW1lbnRzQnlOYW1lKGdbMV0pO2Zvcih2YXIgbT0wLHE9aC5sZW5ndGg7bTxxO20rKyloW21dLmdldEF0dHJpYnV0ZSgibmFtZSIpPT09Z1sxXSYmbC5wdXNoKGhbbV0pO3JldHVybiBsLmxlbmd0aD09PTA/bnVsbDpsfX0sVEFHOmZ1bmN0aW9uKGcsaCl7cmV0dXJuIGguZ2V0RWxlbWVudHNCeVRhZ05hbWUoZ1sxXSl9fSxwcmVGaWx0ZXI6e0NMQVNTOmZ1bmN0aW9uKGcsaCxsLG0scSxwKXtnPSIgIitnWzFdLnJlcGxhY2UoL1xcL2csIiIpKyIgIjtpZihwKXJldHVybiBnO3A9MDtmb3IodmFyIHY7KHY9aFtwXSkhPW51bGw7cCsrKWlmKHYpaWYocV4odi5jbGFzc05hbWUmJigiICIrdi5jbGFzc05hbWUrIiAiKS5yZXBsYWNlKC9bXHRcbl0vZywiICIpLmluZGV4T2YoZyk+PTApKWx8fG0ucHVzaCh2KTtlbHNlIGlmKGwpaFtwXT1mYWxzZTtyZXR1cm4gZmFsc2V9LElEOmZ1bmN0aW9uKGcpe3JldHVybiBnWzFdLnJlcGxhY2UoL1xcL2csIiIpfSxUQUc6ZnVuY3Rpb24oZyl7cmV0dXJuIGdbMV0udG9Mb3dlckNhc2UoKX0sCkNISUxEOmZ1bmN0aW9uKGcpe2lmKGdbMV09PT0ibnRoIil7dmFyIGg9LygtPykoXGQqKW4oKD86XCt8LSk/XGQqKS8uZXhlYyhnWzJdPT09ImV2ZW4iJiYiMm4ifHxnWzJdPT09Im9kZCImJiIybisxInx8IS9cRC8udGVzdChnWzJdKSYmIjBuKyIrZ1syXXx8Z1syXSk7Z1syXT1oWzFdKyhoWzJdfHwxKS0wO2dbM109aFszXS0wfWdbMF09ZSsrO3JldHVybiBnfSxBVFRSOmZ1bmN0aW9uKGcsaCxsLG0scSxwKXtoPWdbMV0ucmVwbGFjZSgvXFwvZywiIik7aWYoIXAmJm4uYXR0ck1hcFtoXSlnWzFdPW4uYXR0ck1hcFtoXTtpZihnWzJdPT09In49IilnWzRdPSIgIitnWzRdKyIgIjtyZXR1cm4gZ30sUFNFVURPOmZ1bmN0aW9uKGcsaCxsLG0scSl7aWYoZ1sxXT09PSJub3QiKWlmKChmLmV4ZWMoZ1szXSl8fCIiKS5sZW5ndGg+MXx8L15cdy8udGVzdChnWzNdKSlnWzNdPWsoZ1szXSxudWxsLG51bGwsaCk7ZWxzZXtnPWsuZmlsdGVyKGdbM10saCxsLHRydWVecSk7bHx8bS5wdXNoLmFwcGx5KG0sCmcpO3JldHVybiBmYWxzZX1lbHNlIGlmKG4ubWF0Y2guUE9TLnRlc3QoZ1swXSl8fG4ubWF0Y2guQ0hJTEQudGVzdChnWzBdKSlyZXR1cm4gdHJ1ZTtyZXR1cm4gZ30sUE9TOmZ1bmN0aW9uKGcpe2cudW5zaGlmdCh0cnVlKTtyZXR1cm4gZ319LGZpbHRlcnM6e2VuYWJsZWQ6ZnVuY3Rpb24oZyl7cmV0dXJuIGcuZGlzYWJsZWQ9PT1mYWxzZSYmZy50eXBlIT09ImhpZGRlbiJ9LGRpc2FibGVkOmZ1bmN0aW9uKGcpe3JldHVybiBnLmRpc2FibGVkPT09dHJ1ZX0sY2hlY2tlZDpmdW5jdGlvbihnKXtyZXR1cm4gZy5jaGVja2VkPT09dHJ1ZX0sc2VsZWN0ZWQ6ZnVuY3Rpb24oZyl7cmV0dXJuIGcuc2VsZWN0ZWQ9PT10cnVlfSxwYXJlbnQ6ZnVuY3Rpb24oZyl7cmV0dXJuISFnLmZpcnN0Q2hpbGR9LGVtcHR5OmZ1bmN0aW9uKGcpe3JldHVybiFnLmZpcnN0Q2hpbGR9LGhhczpmdW5jdGlvbihnLGgsbCl7cmV0dXJuISFrKGxbM10sZykubGVuZ3RofSxoZWFkZXI6ZnVuY3Rpb24oZyl7cmV0dXJuL2hcZC9pLnRlc3QoZy5ub2RlTmFtZSl9LAp0ZXh0OmZ1bmN0aW9uKGcpe3JldHVybiJ0ZXh0Ij09PWcudHlwZX0scmFkaW86ZnVuY3Rpb24oZyl7cmV0dXJuInJhZGlvIj09PWcudHlwZX0sY2hlY2tib3g6ZnVuY3Rpb24oZyl7cmV0dXJuImNoZWNrYm94Ij09PWcudHlwZX0sZmlsZTpmdW5jdGlvbihnKXtyZXR1cm4iZmlsZSI9PT1nLnR5cGV9LHBhc3N3b3JkOmZ1bmN0aW9uKGcpe3JldHVybiJwYXNzd29yZCI9PT1nLnR5cGV9LHN1Ym1pdDpmdW5jdGlvbihnKXtyZXR1cm4ic3VibWl0Ij09PWcudHlwZX0saW1hZ2U6ZnVuY3Rpb24oZyl7cmV0dXJuImltYWdlIj09PWcudHlwZX0scmVzZXQ6ZnVuY3Rpb24oZyl7cmV0dXJuInJlc2V0Ij09PWcudHlwZX0sYnV0dG9uOmZ1bmN0aW9uKGcpe3JldHVybiJidXR0b24iPT09Zy50eXBlfHxnLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT0iYnV0dG9uIn0saW5wdXQ6ZnVuY3Rpb24oZyl7cmV0dXJuL2lucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b24vaS50ZXN0KGcubm9kZU5hbWUpfX0sCnNldEZpbHRlcnM6e2ZpcnN0OmZ1bmN0aW9uKGcsaCl7cmV0dXJuIGg9PT0wfSxsYXN0OmZ1bmN0aW9uKGcsaCxsLG0pe3JldHVybiBoPT09bS5sZW5ndGgtMX0sZXZlbjpmdW5jdGlvbihnLGgpe3JldHVybiBoJTI9PT0wfSxvZGQ6ZnVuY3Rpb24oZyxoKXtyZXR1cm4gaCUyPT09MX0sbHQ6ZnVuY3Rpb24oZyxoLGwpe3JldHVybiBoPGxbM10tMH0sZ3Q6ZnVuY3Rpb24oZyxoLGwpe3JldHVybiBoPmxbM10tMH0sbnRoOmZ1bmN0aW9uKGcsaCxsKXtyZXR1cm4gbFszXS0wPT09aH0sZXE6ZnVuY3Rpb24oZyxoLGwpe3JldHVybiBsWzNdLTA9PT1ofX0sZmlsdGVyOntQU0VVRE86ZnVuY3Rpb24oZyxoLGwsbSl7dmFyIHE9aFsxXSxwPW4uZmlsdGVyc1txXTtpZihwKXJldHVybiBwKGcsbCxoLG0pO2Vsc2UgaWYocT09PSJjb250YWlucyIpcmV0dXJuKGcudGV4dENvbnRlbnR8fGcuaW5uZXJUZXh0fHxhKFtnXSl8fCIiKS5pbmRleE9mKGhbM10pPj0wO2Vsc2UgaWYocT09PSJub3QiKXtoPQpoWzNdO2w9MDtmb3IobT1oLmxlbmd0aDtsPG07bCsrKWlmKGhbbF09PT1nKXJldHVybiBmYWxzZTtyZXR1cm4gdHJ1ZX1lbHNlIGsuZXJyb3IoIlN5bnRheCBlcnJvciwgdW5yZWNvZ25pemVkIGV4cHJlc3Npb246ICIrcSl9LENISUxEOmZ1bmN0aW9uKGcsaCl7dmFyIGw9aFsxXSxtPWc7c3dpdGNoKGwpe2Nhc2UgIm9ubHkiOmNhc2UgImZpcnN0Ijpmb3IoO209bS5wcmV2aW91c1NpYmxpbmc7KWlmKG0ubm9kZVR5cGU9PT0xKXJldHVybiBmYWxzZTtpZihsPT09ImZpcnN0IilyZXR1cm4gdHJ1ZTttPWc7Y2FzZSAibGFzdCI6Zm9yKDttPW0ubmV4dFNpYmxpbmc7KWlmKG0ubm9kZVR5cGU9PT0xKXJldHVybiBmYWxzZTtyZXR1cm4gdHJ1ZTtjYXNlICJudGgiOmw9aFsyXTt2YXIgcT1oWzNdO2lmKGw9PT0xJiZxPT09MClyZXR1cm4gdHJ1ZTtoPWhbMF07dmFyIHA9Zy5wYXJlbnROb2RlO2lmKHAmJihwLnNpemNhY2hlIT09aHx8IWcubm9kZUluZGV4KSl7dmFyIHY9MDtmb3IobT1wLmZpcnN0Q2hpbGQ7bTttPQptLm5leHRTaWJsaW5nKWlmKG0ubm9kZVR5cGU9PT0xKW0ubm9kZUluZGV4PSsrdjtwLnNpemNhY2hlPWh9Zz1nLm5vZGVJbmRleC1xO3JldHVybiBsPT09MD9nPT09MDpnJWw9PT0wJiZnL2w+PTB9fSxJRDpmdW5jdGlvbihnLGgpe3JldHVybiBnLm5vZGVUeXBlPT09MSYmZy5nZXRBdHRyaWJ1dGUoImlkIik9PT1ofSxUQUc6ZnVuY3Rpb24oZyxoKXtyZXR1cm4gaD09PSIqIiYmZy5ub2RlVHlwZT09PTF8fGcubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PWh9LENMQVNTOmZ1bmN0aW9uKGcsaCl7cmV0dXJuKCIgIisoZy5jbGFzc05hbWV8fGcuZ2V0QXR0cmlidXRlKCJjbGFzcyIpKSsiICIpLmluZGV4T2YoaCk+LTF9LEFUVFI6ZnVuY3Rpb24oZyxoKXt2YXIgbD1oWzFdO2c9bi5hdHRySGFuZGxlW2xdP24uYXR0ckhhbmRsZVtsXShnKTpnW2xdIT1udWxsP2dbbF06Zy5nZXRBdHRyaWJ1dGUobCk7bD1nKyIiO3ZhciBtPWhbMl07aD1oWzRdO3JldHVybiBnPT1udWxsP209PT0iIT0iOm09PT0KIj0iP2w9PT1oOm09PT0iKj0iP2wuaW5kZXhPZihoKT49MDptPT09In49Ij8oIiAiK2wrIiAiKS5pbmRleE9mKGgpPj0wOiFoP2wmJmchPT1mYWxzZTptPT09IiE9Ij9sIT09aDptPT09Il49Ij9sLmluZGV4T2YoaCk9PT0wOm09PT0iJD0iP2wuc3Vic3RyKGwubGVuZ3RoLWgubGVuZ3RoKT09PWg6bT09PSJ8PSI/bD09PWh8fGwuc3Vic3RyKDAsaC5sZW5ndGgrMSk9PT1oKyItIjpmYWxzZX0sUE9TOmZ1bmN0aW9uKGcsaCxsLG0pe3ZhciBxPW4uc2V0RmlsdGVyc1toWzJdXTtpZihxKXJldHVybiBxKGcsbCxoLG0pfX19LHI9bi5tYXRjaC5QT1M7Zm9yKHZhciB1IGluIG4ubWF0Y2gpe24ubWF0Y2hbdV09bmV3IFJlZ0V4cChuLm1hdGNoW3VdLnNvdXJjZSsvKD8hW15cW10qXF0pKD8hW15cKF0qXCkpLy5zb3VyY2UpO24ubGVmdE1hdGNoW3VdPW5ldyBSZWdFeHAoLyheKD86LnxccnxcbikqPykvLnNvdXJjZStuLm1hdGNoW3VdLnNvdXJjZS5yZXBsYWNlKC9cXChcZCspL2csZnVuY3Rpb24oZywKaCl7cmV0dXJuIlxcIisoaC0wKzEpfSkpfXZhciB6PWZ1bmN0aW9uKGcsaCl7Zz1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChnLDApO2lmKGgpe2gucHVzaC5hcHBseShoLGcpO3JldHVybiBofXJldHVybiBnfTt0cnl7QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwocy5kb2N1bWVudEVsZW1lbnQuY2hpbGROb2RlcywwKX1jYXRjaChDKXt6PWZ1bmN0aW9uKGcsaCl7aD1ofHxbXTtpZihqLmNhbGwoZyk9PT0iW29iamVjdCBBcnJheV0iKUFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KGgsZyk7ZWxzZSBpZih0eXBlb2YgZy5sZW5ndGg9PT0ibnVtYmVyIilmb3IodmFyIGw9MCxtPWcubGVuZ3RoO2w8bTtsKyspaC5wdXNoKGdbbF0pO2Vsc2UgZm9yKGw9MDtnW2xdO2wrKyloLnB1c2goZ1tsXSk7cmV0dXJuIGh9fXZhciBCO2lmKHMuZG9jdW1lbnRFbGVtZW50LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKUI9ZnVuY3Rpb24oZyxoKXtpZighZy5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbnx8CiFoLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKXtpZihnPT1oKWk9dHJ1ZTtyZXR1cm4gZy5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbj8tMToxfWc9Zy5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihoKSY0Py0xOmc9PT1oPzA6MTtpZihnPT09MClpPXRydWU7cmV0dXJuIGd9O2Vsc2UgaWYoInNvdXJjZUluZGV4ImluIHMuZG9jdW1lbnRFbGVtZW50KUI9ZnVuY3Rpb24oZyxoKXtpZighZy5zb3VyY2VJbmRleHx8IWguc291cmNlSW5kZXgpe2lmKGc9PWgpaT10cnVlO3JldHVybiBnLnNvdXJjZUluZGV4Py0xOjF9Zz1nLnNvdXJjZUluZGV4LWguc291cmNlSW5kZXg7aWYoZz09PTApaT10cnVlO3JldHVybiBnfTtlbHNlIGlmKHMuY3JlYXRlUmFuZ2UpQj1mdW5jdGlvbihnLGgpe2lmKCFnLm93bmVyRG9jdW1lbnR8fCFoLm93bmVyRG9jdW1lbnQpe2lmKGc9PWgpaT10cnVlO3JldHVybiBnLm93bmVyRG9jdW1lbnQ/LTE6MX12YXIgbD1nLm93bmVyRG9jdW1lbnQuY3JlYXRlUmFuZ2UoKSxtPQpoLm93bmVyRG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtsLnNldFN0YXJ0KGcsMCk7bC5zZXRFbmQoZywwKTttLnNldFN0YXJ0KGgsMCk7bS5zZXRFbmQoaCwwKTtnPWwuY29tcGFyZUJvdW5kYXJ5UG9pbnRzKFJhbmdlLlNUQVJUX1RPX0VORCxtKTtpZihnPT09MClpPXRydWU7cmV0dXJuIGd9OyhmdW5jdGlvbigpe3ZhciBnPXMuY3JlYXRlRWxlbWVudCgiZGl2IiksaD0ic2NyaXB0IisobmV3IERhdGUpLmdldFRpbWUoKTtnLmlubmVySFRNTD0iPGEgbmFtZT0nIitoKyInLz4iO3ZhciBsPXMuZG9jdW1lbnRFbGVtZW50O2wuaW5zZXJ0QmVmb3JlKGcsbC5maXJzdENoaWxkKTtpZihzLmdldEVsZW1lbnRCeUlkKGgpKXtuLmZpbmQuSUQ9ZnVuY3Rpb24obSxxLHApe2lmKHR5cGVvZiBxLmdldEVsZW1lbnRCeUlkIT09InVuZGVmaW5lZCImJiFwKXJldHVybihxPXEuZ2V0RWxlbWVudEJ5SWQobVsxXSkpP3EuaWQ9PT1tWzFdfHx0eXBlb2YgcS5nZXRBdHRyaWJ1dGVOb2RlIT09InVuZGVmaW5lZCImJgpxLmdldEF0dHJpYnV0ZU5vZGUoImlkIikubm9kZVZhbHVlPT09bVsxXT9bcV06dzpbXX07bi5maWx0ZXIuSUQ9ZnVuY3Rpb24obSxxKXt2YXIgcD10eXBlb2YgbS5nZXRBdHRyaWJ1dGVOb2RlIT09InVuZGVmaW5lZCImJm0uZ2V0QXR0cmlidXRlTm9kZSgiaWQiKTtyZXR1cm4gbS5ub2RlVHlwZT09PTEmJnAmJnAubm9kZVZhbHVlPT09cX19bC5yZW1vdmVDaGlsZChnKTtsPWc9bnVsbH0pKCk7KGZ1bmN0aW9uKCl7dmFyIGc9cy5jcmVhdGVFbGVtZW50KCJkaXYiKTtnLmFwcGVuZENoaWxkKHMuY3JlYXRlQ29tbWVudCgiIikpO2lmKGcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKS5sZW5ndGg+MCluLmZpbmQuVEFHPWZ1bmN0aW9uKGgsbCl7bD1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKGhbMV0pO2lmKGhbMV09PT0iKiIpe2g9W107Zm9yKHZhciBtPTA7bFttXTttKyspbFttXS5ub2RlVHlwZT09PTEmJmgucHVzaChsW21dKTtsPWh9cmV0dXJuIGx9O2cuaW5uZXJIVE1MPSI8YSBocmVmPScjJz48L2E+IjsKaWYoZy5maXJzdENoaWxkJiZ0eXBlb2YgZy5maXJzdENoaWxkLmdldEF0dHJpYnV0ZSE9PSJ1bmRlZmluZWQiJiZnLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCJocmVmIikhPT0iIyIpbi5hdHRySGFuZGxlLmhyZWY9ZnVuY3Rpb24oaCl7cmV0dXJuIGguZ2V0QXR0cmlidXRlKCJocmVmIiwyKX07Zz1udWxsfSkoKTtzLnF1ZXJ5U2VsZWN0b3JBbGwmJmZ1bmN0aW9uKCl7dmFyIGc9ayxoPXMuY3JlYXRlRWxlbWVudCgiZGl2Iik7aC5pbm5lckhUTUw9IjxwIGNsYXNzPSdURVNUJz48L3A+IjtpZighKGgucXVlcnlTZWxlY3RvckFsbCYmaC5xdWVyeVNlbGVjdG9yQWxsKCIuVEVTVCIpLmxlbmd0aD09PTApKXtrPWZ1bmN0aW9uKG0scSxwLHYpe3E9cXx8cztpZighdiYmcS5ub2RlVHlwZT09PTkmJiF4KHEpKXRyeXtyZXR1cm4geihxLnF1ZXJ5U2VsZWN0b3JBbGwobSkscCl9Y2F0Y2godCl7fXJldHVybiBnKG0scSxwLHYpfTtmb3IodmFyIGwgaW4gZylrW2xdPWdbbF07aD1udWxsfX0oKTsKKGZ1bmN0aW9uKCl7dmFyIGc9cy5jcmVhdGVFbGVtZW50KCJkaXYiKTtnLmlubmVySFRNTD0iPGRpdiBjbGFzcz0ndGVzdCBlJz48L2Rpdj48ZGl2IGNsYXNzPSd0ZXN0Jz48L2Rpdj4iO2lmKCEoIWcuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZXx8Zy5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJlIikubGVuZ3RoPT09MCkpe2cubGFzdENoaWxkLmNsYXNzTmFtZT0iZSI7aWYoZy5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJlIikubGVuZ3RoIT09MSl7bi5vcmRlci5zcGxpY2UoMSwwLCJDTEFTUyIpO24uZmluZC5DTEFTUz1mdW5jdGlvbihoLGwsbSl7aWYodHlwZW9mIGwuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSE9PSJ1bmRlZmluZWQiJiYhbSlyZXR1cm4gbC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGhbMV0pfTtnPW51bGx9fX0pKCk7dmFyIEU9cy5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbj9mdW5jdGlvbihnLGgpe3JldHVybiEhKGcuY29tcGFyZURvY3VtZW50UG9zaXRpb24oaCkmMTYpfToKZnVuY3Rpb24oZyxoKXtyZXR1cm4gZyE9PWgmJihnLmNvbnRhaW5zP2cuY29udGFpbnMoaCk6dHJ1ZSl9LHg9ZnVuY3Rpb24oZyl7cmV0dXJuKGc9KGc/Zy5vd25lckRvY3VtZW50fHxnOjApLmRvY3VtZW50RWxlbWVudCk/Zy5ub2RlTmFtZSE9PSJIVE1MIjpmYWxzZX0sZ2E9ZnVuY3Rpb24oZyxoKXt2YXIgbD1bXSxtPSIiLHE7Zm9yKGg9aC5ub2RlVHlwZT9baF06aDtxPW4ubWF0Y2guUFNFVURPLmV4ZWMoZyk7KXttKz1xWzBdO2c9Zy5yZXBsYWNlKG4ubWF0Y2guUFNFVURPLCIiKX1nPW4ucmVsYXRpdmVbZ10/ZysiKiI6ZztxPTA7Zm9yKHZhciBwPWgubGVuZ3RoO3E8cDtxKyspayhnLGhbcV0sbCk7cmV0dXJuIGsuZmlsdGVyKG0sbCl9O2MuZmluZD1rO2MuZXhwcj1rLnNlbGVjdG9ycztjLmV4cHJbIjoiXT1jLmV4cHIuZmlsdGVycztjLnVuaXF1ZT1rLnVuaXF1ZVNvcnQ7Yy50ZXh0PWE7Yy5pc1hNTERvYz14O2MuY29udGFpbnM9RX0pKCk7dmFyIGViPS9VbnRpbCQvLGZiPS9eKD86cGFyZW50c3xwcmV2VW50aWx8cHJldkFsbCkvLApnYj0vLC87Uj1BcnJheS5wcm90b3R5cGUuc2xpY2U7dmFyIElhPWZ1bmN0aW9uKGEsYixkKXtpZihjLmlzRnVuY3Rpb24oYikpcmV0dXJuIGMuZ3JlcChhLGZ1bmN0aW9uKGUsail7cmV0dXJuISFiLmNhbGwoZSxqLGUpPT09ZH0pO2Vsc2UgaWYoYi5ub2RlVHlwZSlyZXR1cm4gYy5ncmVwKGEsZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT1iPT09ZH0pO2Vsc2UgaWYodHlwZW9mIGI9PT0ic3RyaW5nIil7dmFyIGY9Yy5ncmVwKGEsZnVuY3Rpb24oZSl7cmV0dXJuIGUubm9kZVR5cGU9PT0xfSk7aWYoVWEudGVzdChiKSlyZXR1cm4gYy5maWx0ZXIoYixmLCFkKTtlbHNlIGI9Yy5maWx0ZXIoYixmKX1yZXR1cm4gYy5ncmVwKGEsZnVuY3Rpb24oZSl7cmV0dXJuIGMuaW5BcnJheShlLGIpPj0wPT09ZH0pfTtjLmZuLmV4dGVuZCh7ZmluZDpmdW5jdGlvbihhKXtmb3IodmFyIGI9dGhpcy5wdXNoU3RhY2soIiIsImZpbmQiLGEpLGQ9MCxmPTAsZT10aGlzLmxlbmd0aDtmPGU7ZisrKXtkPWIubGVuZ3RoOwpjLmZpbmQoYSx0aGlzW2ZdLGIpO2lmKGY+MClmb3IodmFyIGo9ZDtqPGIubGVuZ3RoO2orKylmb3IodmFyIGk9MDtpPGQ7aSsrKWlmKGJbaV09PT1iW2pdKXtiLnNwbGljZShqLS0sMSk7YnJlYWt9fXJldHVybiBifSxoYXM6ZnVuY3Rpb24oYSl7dmFyIGI9YyhhKTtyZXR1cm4gdGhpcy5maWx0ZXIoZnVuY3Rpb24oKXtmb3IodmFyIGQ9MCxmPWIubGVuZ3RoO2Q8ZjtkKyspaWYoYy5jb250YWlucyh0aGlzLGJbZF0pKXJldHVybiB0cnVlfSl9LG5vdDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soSWEodGhpcyxhLGZhbHNlKSwibm90IixhKX0sZmlsdGVyOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnB1c2hTdGFjayhJYSh0aGlzLGEsdHJ1ZSksImZpbHRlciIsYSl9LGlzOmZ1bmN0aW9uKGEpe3JldHVybiEhYSYmYy5maWx0ZXIoYSx0aGlzKS5sZW5ndGg+MH0sY2xvc2VzdDpmdW5jdGlvbihhLGIpe2lmKGMuaXNBcnJheShhKSl7dmFyIGQ9W10sZj10aGlzWzBdLGUsaj0Ke30saTtpZihmJiZhLmxlbmd0aCl7ZT0wO2Zvcih2YXIgbz1hLmxlbmd0aDtlPG87ZSsrKXtpPWFbZV07altpXXx8KGpbaV09Yy5leHByLm1hdGNoLlBPUy50ZXN0KGkpP2MoaSxifHx0aGlzLmNvbnRleHQpOmkpfWZvcig7ZiYmZi5vd25lckRvY3VtZW50JiZmIT09Yjspe2ZvcihpIGluIGope2U9altpXTtpZihlLmpxdWVyeT9lLmluZGV4KGYpPi0xOmMoZikuaXMoZSkpe2QucHVzaCh7c2VsZWN0b3I6aSxlbGVtOmZ9KTtkZWxldGUgaltpXX19Zj1mLnBhcmVudE5vZGV9fXJldHVybiBkfXZhciBrPWMuZXhwci5tYXRjaC5QT1MudGVzdChhKT9jKGEsYnx8dGhpcy5jb250ZXh0KTpudWxsO3JldHVybiB0aGlzLm1hcChmdW5jdGlvbihuLHIpe2Zvcig7ciYmci5vd25lckRvY3VtZW50JiZyIT09Yjspe2lmKGs/ay5pbmRleChyKT4tMTpjKHIpLmlzKGEpKXJldHVybiByO3I9ci5wYXJlbnROb2RlfXJldHVybiBudWxsfSl9LGluZGV4OmZ1bmN0aW9uKGEpe2lmKCFhfHx0eXBlb2YgYT09PQoic3RyaW5nIilyZXR1cm4gYy5pbkFycmF5KHRoaXNbMF0sYT9jKGEpOnRoaXMucGFyZW50KCkuY2hpbGRyZW4oKSk7cmV0dXJuIGMuaW5BcnJheShhLmpxdWVyeT9hWzBdOmEsdGhpcyl9LGFkZDpmdW5jdGlvbihhLGIpe2E9dHlwZW9mIGE9PT0ic3RyaW5nIj9jKGEsYnx8dGhpcy5jb250ZXh0KTpjLm1ha2VBcnJheShhKTtiPWMubWVyZ2UodGhpcy5nZXQoKSxhKTtyZXR1cm4gdGhpcy5wdXNoU3RhY2socWEoYVswXSl8fHFhKGJbMF0pP2I6Yy51bmlxdWUoYikpfSxhbmRTZWxmOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYWRkKHRoaXMucHJldk9iamVjdCl9fSk7Yy5lYWNoKHtwYXJlbnQ6ZnVuY3Rpb24oYSl7cmV0dXJuKGE9YS5wYXJlbnROb2RlKSYmYS5ub2RlVHlwZSE9PTExP2E6bnVsbH0scGFyZW50czpmdW5jdGlvbihhKXtyZXR1cm4gYy5kaXIoYSwicGFyZW50Tm9kZSIpfSxwYXJlbnRzVW50aWw6ZnVuY3Rpb24oYSxiLGQpe3JldHVybiBjLmRpcihhLCJwYXJlbnROb2RlIiwKZCl9LG5leHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGMubnRoKGEsMiwibmV4dFNpYmxpbmciKX0scHJldjpmdW5jdGlvbihhKXtyZXR1cm4gYy5udGgoYSwyLCJwcmV2aW91c1NpYmxpbmciKX0sbmV4dEFsbDpmdW5jdGlvbihhKXtyZXR1cm4gYy5kaXIoYSwibmV4dFNpYmxpbmciKX0scHJldkFsbDpmdW5jdGlvbihhKXtyZXR1cm4gYy5kaXIoYSwicHJldmlvdXNTaWJsaW5nIil9LG5leHRVbnRpbDpmdW5jdGlvbihhLGIsZCl7cmV0dXJuIGMuZGlyKGEsIm5leHRTaWJsaW5nIixkKX0scHJldlVudGlsOmZ1bmN0aW9uKGEsYixkKXtyZXR1cm4gYy5kaXIoYSwicHJldmlvdXNTaWJsaW5nIixkKX0sc2libGluZ3M6ZnVuY3Rpb24oYSl7cmV0dXJuIGMuc2libGluZyhhLnBhcmVudE5vZGUuZmlyc3RDaGlsZCxhKX0sY2hpbGRyZW46ZnVuY3Rpb24oYSl7cmV0dXJuIGMuc2libGluZyhhLmZpcnN0Q2hpbGQpfSxjb250ZW50czpmdW5jdGlvbihhKXtyZXR1cm4gYy5ub2RlTmFtZShhLCJpZnJhbWUiKT8KYS5jb250ZW50RG9jdW1lbnR8fGEuY29udGVudFdpbmRvdy5kb2N1bWVudDpjLm1ha2VBcnJheShhLmNoaWxkTm9kZXMpfX0sZnVuY3Rpb24oYSxiKXtjLmZuW2FdPWZ1bmN0aW9uKGQsZil7dmFyIGU9Yy5tYXAodGhpcyxiLGQpO2ViLnRlc3QoYSl8fChmPWQpO2lmKGYmJnR5cGVvZiBmPT09InN0cmluZyIpZT1jLmZpbHRlcihmLGUpO2U9dGhpcy5sZW5ndGg+MT9jLnVuaXF1ZShlKTplO2lmKCh0aGlzLmxlbmd0aD4xfHxnYi50ZXN0KGYpKSYmZmIudGVzdChhKSllPWUucmV2ZXJzZSgpO3JldHVybiB0aGlzLnB1c2hTdGFjayhlLGEsUi5jYWxsKGFyZ3VtZW50cykuam9pbigiLCIpKX19KTtjLmV4dGVuZCh7ZmlsdGVyOmZ1bmN0aW9uKGEsYixkKXtpZihkKWE9Ijpub3QoIithKyIpIjtyZXR1cm4gYy5maW5kLm1hdGNoZXMoYSxiKX0sZGlyOmZ1bmN0aW9uKGEsYixkKXt2YXIgZj1bXTtmb3IoYT1hW2JdO2EmJmEubm9kZVR5cGUhPT05JiYoZD09PXd8fGEubm9kZVR5cGUhPT0xfHwhYyhhKS5pcyhkKSk7KXthLm5vZGVUeXBlPT09CjEmJmYucHVzaChhKTthPWFbYl19cmV0dXJuIGZ9LG50aDpmdW5jdGlvbihhLGIsZCl7Yj1ifHwxO2Zvcih2YXIgZj0wO2E7YT1hW2RdKWlmKGEubm9kZVR5cGU9PT0xJiYrK2Y9PT1iKWJyZWFrO3JldHVybiBhfSxzaWJsaW5nOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBkPVtdO2E7YT1hLm5leHRTaWJsaW5nKWEubm9kZVR5cGU9PT0xJiZhIT09YiYmZC5wdXNoKGEpO3JldHVybiBkfX0pO3ZhciBKYT0vIGpRdWVyeVxkKz0iKD86XGQrfG51bGwpIi9nLFY9L15ccysvLEthPS8oPChbXHc6XSspW14+XSo/KVwvPi9nLGhiPS9eKD86YXJlYXxicnxjb2x8ZW1iZWR8aHJ8aW1nfGlucHV0fGxpbmt8bWV0YXxwYXJhbSkkL2ksTGE9LzwoW1x3Ol0rKS8saWI9Lzx0Ym9keS9pLGpiPS88fCYjP1x3KzsvLHRhPS88c2NyaXB0fDxvYmplY3R8PGVtYmVkfDxvcHRpb258PHN0eWxlL2ksdWE9L2NoZWNrZWRccyooPzpbXj1dfD1ccyouY2hlY2tlZC4pL2ksTWE9ZnVuY3Rpb24oYSxiLGQpe3JldHVybiBoYi50ZXN0KGQpPwphOmIrIj48LyIrZCsiPiJ9LEY9e29wdGlvbjpbMSwiPHNlbGVjdCBtdWx0aXBsZT0nbXVsdGlwbGUnPiIsIjwvc2VsZWN0PiJdLGxlZ2VuZDpbMSwiPGZpZWxkc2V0PiIsIjwvZmllbGRzZXQ+Il0sdGhlYWQ6WzEsIjx0YWJsZT4iLCI8L3RhYmxlPiJdLHRyOlsyLCI8dGFibGU+PHRib2R5PiIsIjwvdGJvZHk+PC90YWJsZT4iXSx0ZDpbMywiPHRhYmxlPjx0Ym9keT48dHI+IiwiPC90cj48L3Rib2R5PjwvdGFibGU+Il0sY29sOlsyLCI8dGFibGU+PHRib2R5PjwvdGJvZHk+PGNvbGdyb3VwPiIsIjwvY29sZ3JvdXA+PC90YWJsZT4iXSxhcmVhOlsxLCI8bWFwPiIsIjwvbWFwPiJdLF9kZWZhdWx0OlswLCIiLCIiXX07Ri5vcHRncm91cD1GLm9wdGlvbjtGLnRib2R5PUYudGZvb3Q9Ri5jb2xncm91cD1GLmNhcHRpb249Ri50aGVhZDtGLnRoPUYudGQ7aWYoIWMuc3VwcG9ydC5odG1sU2VyaWFsaXplKUYuX2RlZmF1bHQ9WzEsImRpdjxkaXY+IiwiPC9kaXY+Il07Yy5mbi5leHRlbmQoe3RleHQ6ZnVuY3Rpb24oYSl7aWYoYy5pc0Z1bmN0aW9uKGEpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYil7dmFyIGQ9CmModGhpcyk7ZC50ZXh0KGEuY2FsbCh0aGlzLGIsZC50ZXh0KCkpKX0pO2lmKHR5cGVvZiBhIT09Im9iamVjdCImJmEhPT13KXJldHVybiB0aGlzLmVtcHR5KCkuYXBwZW5kKCh0aGlzWzBdJiZ0aGlzWzBdLm93bmVyRG9jdW1lbnR8fHMpLmNyZWF0ZVRleHROb2RlKGEpKTtyZXR1cm4gYy50ZXh0KHRoaXMpfSx3cmFwQWxsOmZ1bmN0aW9uKGEpe2lmKGMuaXNGdW5jdGlvbihhKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGQpe2ModGhpcykud3JhcEFsbChhLmNhbGwodGhpcyxkKSl9KTtpZih0aGlzWzBdKXt2YXIgYj1jKGEsdGhpc1swXS5vd25lckRvY3VtZW50KS5lcSgwKS5jbG9uZSh0cnVlKTt0aGlzWzBdLnBhcmVudE5vZGUmJmIuaW5zZXJ0QmVmb3JlKHRoaXNbMF0pO2IubWFwKGZ1bmN0aW9uKCl7Zm9yKHZhciBkPXRoaXM7ZC5maXJzdENoaWxkJiZkLmZpcnN0Q2hpbGQubm9kZVR5cGU9PT0xOylkPWQuZmlyc3RDaGlsZDtyZXR1cm4gZH0pLmFwcGVuZCh0aGlzKX1yZXR1cm4gdGhpc30sCndyYXBJbm5lcjpmdW5jdGlvbihhKXtpZihjLmlzRnVuY3Rpb24oYSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihiKXtjKHRoaXMpLndyYXBJbm5lcihhLmNhbGwodGhpcyxiKSl9KTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGI9Yyh0aGlzKSxkPWIuY29udGVudHMoKTtkLmxlbmd0aD9kLndyYXBBbGwoYSk6Yi5hcHBlbmQoYSl9KX0sd3JhcDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Yyh0aGlzKS53cmFwQWxsKGEpfSl9LHVud3JhcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBhcmVudCgpLmVhY2goZnVuY3Rpb24oKXtjLm5vZGVOYW1lKHRoaXMsImJvZHkiKXx8Yyh0aGlzKS5yZXBsYWNlV2l0aCh0aGlzLmNoaWxkTm9kZXMpfSkuZW5kKCl9LGFwcGVuZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cyx0cnVlLGZ1bmN0aW9uKGEpe3RoaXMubm9kZVR5cGU9PT0xJiZ0aGlzLmFwcGVuZENoaWxkKGEpfSl9LApwcmVwZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLHRydWUsZnVuY3Rpb24oYSl7dGhpcy5ub2RlVHlwZT09PTEmJnRoaXMuaW5zZXJ0QmVmb3JlKGEsdGhpcy5maXJzdENoaWxkKX0pfSxiZWZvcmU6ZnVuY3Rpb24oKXtpZih0aGlzWzBdJiZ0aGlzWzBdLnBhcmVudE5vZGUpcmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLGZhbHNlLGZ1bmN0aW9uKGIpe3RoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoYix0aGlzKX0pO2Vsc2UgaWYoYXJndW1lbnRzLmxlbmd0aCl7dmFyIGE9Yyhhcmd1bWVudHNbMF0pO2EucHVzaC5hcHBseShhLHRoaXMudG9BcnJheSgpKTtyZXR1cm4gdGhpcy5wdXNoU3RhY2soYSwiYmVmb3JlIixhcmd1bWVudHMpfX0sYWZ0ZXI6ZnVuY3Rpb24oKXtpZih0aGlzWzBdJiZ0aGlzWzBdLnBhcmVudE5vZGUpcmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLGZhbHNlLGZ1bmN0aW9uKGIpe3RoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoYiwKdGhpcy5uZXh0U2libGluZyl9KTtlbHNlIGlmKGFyZ3VtZW50cy5sZW5ndGgpe3ZhciBhPXRoaXMucHVzaFN0YWNrKHRoaXMsImFmdGVyIixhcmd1bWVudHMpO2EucHVzaC5hcHBseShhLGMoYXJndW1lbnRzWzBdKS50b0FycmF5KCkpO3JldHVybiBhfX0scmVtb3ZlOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBkPTAsZjsoZj10aGlzW2RdKSE9bnVsbDtkKyspaWYoIWF8fGMuZmlsdGVyKGEsW2ZdKS5sZW5ndGgpe2lmKCFiJiZmLm5vZGVUeXBlPT09MSl7Yy5jbGVhbkRhdGEoZi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpKTtjLmNsZWFuRGF0YShbZl0pfWYucGFyZW50Tm9kZSYmZi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGYpfXJldHVybiB0aGlzfSxlbXB0eTpmdW5jdGlvbigpe2Zvcih2YXIgYT0wLGI7KGI9dGhpc1thXSkhPW51bGw7YSsrKWZvcihiLm5vZGVUeXBlPT09MSYmYy5jbGVhbkRhdGEoYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpKTtiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTsKcmV0dXJuIHRoaXN9LGNsb25lOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMubWFwKGZ1bmN0aW9uKCl7aWYoIWMuc3VwcG9ydC5ub0Nsb25lRXZlbnQmJiFjLmlzWE1MRG9jKHRoaXMpKXt2YXIgZD10aGlzLm91dGVySFRNTCxmPXRoaXMub3duZXJEb2N1bWVudDtpZighZCl7ZD1mLmNyZWF0ZUVsZW1lbnQoImRpdiIpO2QuYXBwZW5kQ2hpbGQodGhpcy5jbG9uZU5vZGUodHJ1ZSkpO2Q9ZC5pbm5lckhUTUx9cmV0dXJuIGMuY2xlYW4oW2QucmVwbGFjZShKYSwiIikucmVwbGFjZSgvPShbXj0iJz5cc10rXC8pPi9nLCc9IiQxIj4nKS5yZXBsYWNlKFYsIiIpXSxmKVswXX1lbHNlIHJldHVybiB0aGlzLmNsb25lTm9kZSh0cnVlKX0pO2lmKGE9PT10cnVlKXtyYSh0aGlzLGIpO3JhKHRoaXMuZmluZCgiKiIpLGIuZmluZCgiKiIpKX1yZXR1cm4gYn0saHRtbDpmdW5jdGlvbihhKXtpZihhPT09dylyZXR1cm4gdGhpc1swXSYmdGhpc1swXS5ub2RlVHlwZT09PTE/dGhpc1swXS5pbm5lckhUTUwucmVwbGFjZShKYSwKIiIpOm51bGw7ZWxzZSBpZih0eXBlb2YgYT09PSJzdHJpbmciJiYhdGEudGVzdChhKSYmKGMuc3VwcG9ydC5sZWFkaW5nV2hpdGVzcGFjZXx8IVYudGVzdChhKSkmJiFGWyhMYS5leGVjKGEpfHxbIiIsIiJdKVsxXS50b0xvd2VyQ2FzZSgpXSl7YT1hLnJlcGxhY2UoS2EsTWEpO3RyeXtmb3IodmFyIGI9MCxkPXRoaXMubGVuZ3RoO2I8ZDtiKyspaWYodGhpc1tiXS5ub2RlVHlwZT09PTEpe2MuY2xlYW5EYXRhKHRoaXNbYl0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKSk7dGhpc1tiXS5pbm5lckhUTUw9YX19Y2F0Y2goZil7dGhpcy5lbXB0eSgpLmFwcGVuZChhKX19ZWxzZSBjLmlzRnVuY3Rpb24oYSk/dGhpcy5lYWNoKGZ1bmN0aW9uKGUpe3ZhciBqPWModGhpcyksaT1qLmh0bWwoKTtqLmVtcHR5KCkuYXBwZW5kKGZ1bmN0aW9uKCl7cmV0dXJuIGEuY2FsbCh0aGlzLGUsaSl9KX0pOnRoaXMuZW1wdHkoKS5hcHBlbmQoYSk7cmV0dXJuIHRoaXN9LHJlcGxhY2VXaXRoOmZ1bmN0aW9uKGEpe2lmKHRoaXNbMF0mJgp0aGlzWzBdLnBhcmVudE5vZGUpe2lmKGMuaXNGdW5jdGlvbihhKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGIpe3ZhciBkPWModGhpcyksZj1kLmh0bWwoKTtkLnJlcGxhY2VXaXRoKGEuY2FsbCh0aGlzLGIsZikpfSk7aWYodHlwZW9mIGEhPT0ic3RyaW5nIilhPWMoYSkuZGV0YWNoKCk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBiPXRoaXMubmV4dFNpYmxpbmcsZD10aGlzLnBhcmVudE5vZGU7Yyh0aGlzKS5yZW1vdmUoKTtiP2MoYikuYmVmb3JlKGEpOmMoZCkuYXBwZW5kKGEpfSl9ZWxzZSByZXR1cm4gdGhpcy5wdXNoU3RhY2soYyhjLmlzRnVuY3Rpb24oYSk/YSgpOmEpLCJyZXBsYWNlV2l0aCIsYSl9LGRldGFjaDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5yZW1vdmUoYSx0cnVlKX0sZG9tTWFuaXA6ZnVuY3Rpb24oYSxiLGQpe2Z1bmN0aW9uIGYodSl7cmV0dXJuIGMubm9kZU5hbWUodSwidGFibGUiKT91LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0Ym9keSIpWzBdfHwKdS5hcHBlbmRDaGlsZCh1Lm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGJvZHkiKSk6dX12YXIgZSxqLGk9YVswXSxvPVtdLGs7aWYoIWMuc3VwcG9ydC5jaGVja0Nsb25lJiZhcmd1bWVudHMubGVuZ3RoPT09MyYmdHlwZW9mIGk9PT0ic3RyaW5nIiYmdWEudGVzdChpKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Yyh0aGlzKS5kb21NYW5pcChhLGIsZCx0cnVlKX0pO2lmKGMuaXNGdW5jdGlvbihpKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKHUpe3ZhciB6PWModGhpcyk7YVswXT1pLmNhbGwodGhpcyx1LGI/ei5odG1sKCk6dyk7ei5kb21NYW5pcChhLGIsZCl9KTtpZih0aGlzWzBdKXtlPWkmJmkucGFyZW50Tm9kZTtlPWMuc3VwcG9ydC5wYXJlbnROb2RlJiZlJiZlLm5vZGVUeXBlPT09MTEmJmUuY2hpbGROb2Rlcy5sZW5ndGg9PT10aGlzLmxlbmd0aD97ZnJhZ21lbnQ6ZX06c2EoYSx0aGlzLG8pO2s9ZS5mcmFnbWVudDtpZihqPWsuY2hpbGROb2Rlcy5sZW5ndGg9PT0KMT8oaz1rLmZpcnN0Q2hpbGQpOmsuZmlyc3RDaGlsZCl7Yj1iJiZjLm5vZGVOYW1lKGosInRyIik7Zm9yKHZhciBuPTAscj10aGlzLmxlbmd0aDtuPHI7bisrKWQuY2FsbChiP2YodGhpc1tuXSxqKTp0aGlzW25dLG4+MHx8ZS5jYWNoZWFibGV8fHRoaXMubGVuZ3RoPjE/ay5jbG9uZU5vZGUodHJ1ZSk6ayl9by5sZW5ndGgmJmMuZWFjaChvLFFhKX1yZXR1cm4gdGhpc319KTtjLmZyYWdtZW50cz17fTtjLmVhY2goe2FwcGVuZFRvOiJhcHBlbmQiLHByZXBlbmRUbzoicHJlcGVuZCIsaW5zZXJ0QmVmb3JlOiJiZWZvcmUiLGluc2VydEFmdGVyOiJhZnRlciIscmVwbGFjZUFsbDoicmVwbGFjZVdpdGgifSxmdW5jdGlvbihhLGIpe2MuZm5bYV09ZnVuY3Rpb24oZCl7dmFyIGY9W107ZD1jKGQpO3ZhciBlPXRoaXMubGVuZ3RoPT09MSYmdGhpc1swXS5wYXJlbnROb2RlO2lmKGUmJmUubm9kZVR5cGU9PT0xMSYmZS5jaGlsZE5vZGVzLmxlbmd0aD09PTEmJmQubGVuZ3RoPT09MSl7ZFtiXSh0aGlzWzBdKTsKcmV0dXJuIHRoaXN9ZWxzZXtlPTA7Zm9yKHZhciBqPWQubGVuZ3RoO2U8ajtlKyspe3ZhciBpPShlPjA/dGhpcy5jbG9uZSh0cnVlKTp0aGlzKS5nZXQoKTtjLmZuW2JdLmFwcGx5KGMoZFtlXSksaSk7Zj1mLmNvbmNhdChpKX1yZXR1cm4gdGhpcy5wdXNoU3RhY2soZixhLGQuc2VsZWN0b3IpfX19KTtjLmV4dGVuZCh7Y2xlYW46ZnVuY3Rpb24oYSxiLGQsZil7Yj1ifHxzO2lmKHR5cGVvZiBiLmNyZWF0ZUVsZW1lbnQ9PT0idW5kZWZpbmVkIiliPWIub3duZXJEb2N1bWVudHx8YlswXSYmYlswXS5vd25lckRvY3VtZW50fHxzO2Zvcih2YXIgZT1bXSxqPTAsaTsoaT1hW2pdKSE9bnVsbDtqKyspe2lmKHR5cGVvZiBpPT09Im51bWJlciIpaSs9IiI7aWYoaSl7aWYodHlwZW9mIGk9PT0ic3RyaW5nIiYmIWpiLnRlc3QoaSkpaT1iLmNyZWF0ZVRleHROb2RlKGkpO2Vsc2UgaWYodHlwZW9mIGk9PT0ic3RyaW5nIil7aT1pLnJlcGxhY2UoS2EsTWEpO3ZhciBvPShMYS5leGVjKGkpfHxbIiIsCiIiXSlbMV0udG9Mb3dlckNhc2UoKSxrPUZbb118fEYuX2RlZmF1bHQsbj1rWzBdLHI9Yi5jcmVhdGVFbGVtZW50KCJkaXYiKTtmb3Ioci5pbm5lckhUTUw9a1sxXStpK2tbMl07bi0tOylyPXIubGFzdENoaWxkO2lmKCFjLnN1cHBvcnQudGJvZHkpe249aWIudGVzdChpKTtvPW89PT0idGFibGUiJiYhbj9yLmZpcnN0Q2hpbGQmJnIuZmlyc3RDaGlsZC5jaGlsZE5vZGVzOmtbMV09PT0iPHRhYmxlPiImJiFuP3IuY2hpbGROb2RlczpbXTtmb3Ioaz1vLmxlbmd0aC0xO2s+PTA7LS1rKWMubm9kZU5hbWUob1trXSwidGJvZHkiKSYmIW9ba10uY2hpbGROb2Rlcy5sZW5ndGgmJm9ba10ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChvW2tdKX0hYy5zdXBwb3J0LmxlYWRpbmdXaGl0ZXNwYWNlJiZWLnRlc3QoaSkmJnIuaW5zZXJ0QmVmb3JlKGIuY3JlYXRlVGV4dE5vZGUoVi5leGVjKGkpWzBdKSxyLmZpcnN0Q2hpbGQpO2k9ci5jaGlsZE5vZGVzfWlmKGkubm9kZVR5cGUpZS5wdXNoKGkpO2Vsc2UgZT0KYy5tZXJnZShlLGkpfX1pZihkKWZvcihqPTA7ZVtqXTtqKyspaWYoZiYmYy5ub2RlTmFtZShlW2pdLCJzY3JpcHQiKSYmKCFlW2pdLnR5cGV8fGVbal0udHlwZS50b0xvd2VyQ2FzZSgpPT09InRleHQvamF2YXNjcmlwdCIpKWYucHVzaChlW2pdLnBhcmVudE5vZGU/ZVtqXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGVbal0pOmVbal0pO2Vsc2V7ZVtqXS5ub2RlVHlwZT09PTEmJmUuc3BsaWNlLmFwcGx5KGUsW2orMSwwXS5jb25jYXQoYy5tYWtlQXJyYXkoZVtqXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic2NyaXB0IikpKSk7ZC5hcHBlbmRDaGlsZChlW2pdKX1yZXR1cm4gZX0sY2xlYW5EYXRhOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYixkLGY9Yy5jYWNoZSxlPWMuZXZlbnQuc3BlY2lhbCxqPWMuc3VwcG9ydC5kZWxldGVFeHBhbmRvLGk9MCxvOyhvPWFbaV0pIT1udWxsO2krKylpZihkPW9bYy5leHBhbmRvXSl7Yj1mW2RdO2lmKGIuZXZlbnRzKWZvcih2YXIgayBpbiBiLmV2ZW50cyllW2tdPwpjLmV2ZW50LnJlbW92ZShvLGspOkNhKG8sayxiLmhhbmRsZSk7aWYoailkZWxldGUgb1tjLmV4cGFuZG9dO2Vsc2Ugby5yZW1vdmVBdHRyaWJ1dGUmJm8ucmVtb3ZlQXR0cmlidXRlKGMuZXhwYW5kbyk7ZGVsZXRlIGZbZF19fX0pO3ZhciBrYj0vei0/aW5kZXh8Zm9udC0/d2VpZ2h0fG9wYWNpdHl8em9vbXxsaW5lLT9oZWlnaHQvaSxOYT0vYWxwaGFcKFteKV0qXCkvLE9hPS9vcGFjaXR5PShbXildKikvLGhhPS9mbG9hdC9pLGlhPS8tKFthLXpdKS9pZyxsYj0vKFtBLVpdKS9nLG1iPS9eLT9cZCsoPzpweCk/JC9pLG5iPS9eLT9cZC8sb2I9e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsdmlzaWJpbGl0eToiaGlkZGVuIixkaXNwbGF5OiJibG9jayJ9LHBiPVsiTGVmdCIsIlJpZ2h0Il0scWI9WyJUb3AiLCJCb3R0b20iXSxyYj1zLmRlZmF1bHRWaWV3JiZzLmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUsUGE9Yy5zdXBwb3J0LmNzc0Zsb2F0PyJjc3NGbG9hdCI6InN0eWxlRmxvYXQiLGphPQpmdW5jdGlvbihhLGIpe3JldHVybiBiLnRvVXBwZXJDYXNlKCl9O2MuZm4uY3NzPWZ1bmN0aW9uKGEsYil7cmV0dXJuIFgodGhpcyxhLGIsdHJ1ZSxmdW5jdGlvbihkLGYsZSl7aWYoZT09PXcpcmV0dXJuIGMuY3VyQ1NTKGQsZik7aWYodHlwZW9mIGU9PT0ibnVtYmVyIiYmIWtiLnRlc3QoZikpZSs9InB4IjtjLnN0eWxlKGQsZixlKX0pfTtjLmV4dGVuZCh7c3R5bGU6ZnVuY3Rpb24oYSxiLGQpe2lmKCFhfHxhLm5vZGVUeXBlPT09M3x8YS5ub2RlVHlwZT09PTgpcmV0dXJuIHc7aWYoKGI9PT0id2lkdGgifHxiPT09ImhlaWdodCIpJiZwYXJzZUZsb2F0KGQpPDApZD13O3ZhciBmPWEuc3R5bGV8fGEsZT1kIT09dztpZighYy5zdXBwb3J0Lm9wYWNpdHkmJmI9PT0ib3BhY2l0eSIpe2lmKGUpe2Yuem9vbT0xO2I9cGFyc2VJbnQoZCwxMCkrIiI9PT0iTmFOIj8iIjoiYWxwaGEob3BhY2l0eT0iK2QqMTAwKyIpIjthPWYuZmlsdGVyfHxjLmN1ckNTUyhhLCJmaWx0ZXIiKXx8IiI7Zi5maWx0ZXI9Ck5hLnRlc3QoYSk/YS5yZXBsYWNlKE5hLGIpOmJ9cmV0dXJuIGYuZmlsdGVyJiZmLmZpbHRlci5pbmRleE9mKCJvcGFjaXR5PSIpPj0wP3BhcnNlRmxvYXQoT2EuZXhlYyhmLmZpbHRlcilbMV0pLzEwMCsiIjoiIn1pZihoYS50ZXN0KGIpKWI9UGE7Yj1iLnJlcGxhY2UoaWEsamEpO2lmKGUpZltiXT1kO3JldHVybiBmW2JdfSxjc3M6ZnVuY3Rpb24oYSxiLGQsZil7aWYoYj09PSJ3aWR0aCJ8fGI9PT0iaGVpZ2h0Iil7dmFyIGUsaj1iPT09IndpZHRoIj9wYjpxYjtmdW5jdGlvbiBpKCl7ZT1iPT09IndpZHRoIj9hLm9mZnNldFdpZHRoOmEub2Zmc2V0SGVpZ2h0O2YhPT0iYm9yZGVyIiYmYy5lYWNoKGosZnVuY3Rpb24oKXtmfHwoZS09cGFyc2VGbG9hdChjLmN1ckNTUyhhLCJwYWRkaW5nIit0aGlzLHRydWUpKXx8MCk7aWYoZj09PSJtYXJnaW4iKWUrPXBhcnNlRmxvYXQoYy5jdXJDU1MoYSwibWFyZ2luIit0aGlzLHRydWUpKXx8MDtlbHNlIGUtPXBhcnNlRmxvYXQoYy5jdXJDU1MoYSwKImJvcmRlciIrdGhpcysiV2lkdGgiLHRydWUpKXx8MH0pfWEub2Zmc2V0V2lkdGghPT0wP2koKTpjLnN3YXAoYSxvYixpKTtyZXR1cm4gTWF0aC5tYXgoMCxNYXRoLnJvdW5kKGUpKX1yZXR1cm4gYy5jdXJDU1MoYSxiLGQpfSxjdXJDU1M6ZnVuY3Rpb24oYSxiLGQpe3ZhciBmLGU9YS5zdHlsZTtpZighYy5zdXBwb3J0Lm9wYWNpdHkmJmI9PT0ib3BhY2l0eSImJmEuY3VycmVudFN0eWxlKXtmPU9hLnRlc3QoYS5jdXJyZW50U3R5bGUuZmlsdGVyfHwiIik/cGFyc2VGbG9hdChSZWdFeHAuJDEpLzEwMCsiIjoiIjtyZXR1cm4gZj09PSIiPyIxIjpmfWlmKGhhLnRlc3QoYikpYj1QYTtpZighZCYmZSYmZVtiXSlmPWVbYl07ZWxzZSBpZihyYil7aWYoaGEudGVzdChiKSliPSJmbG9hdCI7Yj1iLnJlcGxhY2UobGIsIi0kMSIpLnRvTG93ZXJDYXNlKCk7ZT1hLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXc7aWYoIWUpcmV0dXJuIG51bGw7aWYoYT1lLmdldENvbXB1dGVkU3R5bGUoYSxudWxsKSlmPQphLmdldFByb3BlcnR5VmFsdWUoYik7aWYoYj09PSJvcGFjaXR5IiYmZj09PSIiKWY9IjEifWVsc2UgaWYoYS5jdXJyZW50U3R5bGUpe2Q9Yi5yZXBsYWNlKGlhLGphKTtmPWEuY3VycmVudFN0eWxlW2JdfHxhLmN1cnJlbnRTdHlsZVtkXTtpZighbWIudGVzdChmKSYmbmIudGVzdChmKSl7Yj1lLmxlZnQ7dmFyIGo9YS5ydW50aW1lU3R5bGUubGVmdDthLnJ1bnRpbWVTdHlsZS5sZWZ0PWEuY3VycmVudFN0eWxlLmxlZnQ7ZS5sZWZ0PWQ9PT0iZm9udFNpemUiPyIxZW0iOmZ8fDA7Zj1lLnBpeGVsTGVmdCsicHgiO2UubGVmdD1iO2EucnVudGltZVN0eWxlLmxlZnQ9an19cmV0dXJuIGZ9LHN3YXA6ZnVuY3Rpb24oYSxiLGQpe3ZhciBmPXt9O2Zvcih2YXIgZSBpbiBiKXtmW2VdPWEuc3R5bGVbZV07YS5zdHlsZVtlXT1iW2VdfWQuY2FsbChhKTtmb3IoZSBpbiBiKWEuc3R5bGVbZV09ZltlXX19KTtpZihjLmV4cHImJmMuZXhwci5maWx0ZXJzKXtjLmV4cHIuZmlsdGVycy5oaWRkZW49ZnVuY3Rpb24oYSl7dmFyIGI9CmEub2Zmc2V0V2lkdGgsZD1hLm9mZnNldEhlaWdodCxmPWEubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PSJ0ciI7cmV0dXJuIGI9PT0wJiZkPT09MCYmIWY/dHJ1ZTpiPjAmJmQ+MCYmIWY/ZmFsc2U6Yy5jdXJDU1MoYSwiZGlzcGxheSIpPT09Im5vbmUifTtjLmV4cHIuZmlsdGVycy52aXNpYmxlPWZ1bmN0aW9uKGEpe3JldHVybiFjLmV4cHIuZmlsdGVycy5oaWRkZW4oYSl9fXZhciBzYj1KKCksdGI9LzxzY3JpcHQoLnxccykqP1wvc2NyaXB0Pi9naSx1Yj0vc2VsZWN0fHRleHRhcmVhL2ksdmI9L2NvbG9yfGRhdGV8ZGF0ZXRpbWV8ZW1haWx8aGlkZGVufG1vbnRofG51bWJlcnxwYXNzd29yZHxyYW5nZXxzZWFyY2h8dGVsfHRleHR8dGltZXx1cmx8d2Vlay9pLE49Lz1cPygmfCQpLyxrYT0vXD8vLHdiPS8oXD98JilfPS4qPygmfCQpLyx4Yj0vXihcdys6KT9cL1wvKFteXC8/I10rKS8seWI9LyUyMC9nLHpiPWMuZm4ubG9hZDtjLmZuLmV4dGVuZCh7bG9hZDpmdW5jdGlvbihhLGIsZCl7aWYodHlwZW9mIGEhPT0KInN0cmluZyIpcmV0dXJuIHpiLmNhbGwodGhpcyxhKTtlbHNlIGlmKCF0aGlzLmxlbmd0aClyZXR1cm4gdGhpczt2YXIgZj1hLmluZGV4T2YoIiAiKTtpZihmPj0wKXt2YXIgZT1hLnNsaWNlKGYsYS5sZW5ndGgpO2E9YS5zbGljZSgwLGYpfWY9IkdFVCI7aWYoYilpZihjLmlzRnVuY3Rpb24oYikpe2Q9YjtiPW51bGx9ZWxzZSBpZih0eXBlb2YgYj09PSJvYmplY3QiKXtiPWMucGFyYW0oYixjLmFqYXhTZXR0aW5ncy50cmFkaXRpb25hbCk7Zj0iUE9TVCJ9dmFyIGo9dGhpcztjLmFqYXgoe3VybDphLHR5cGU6ZixkYXRhVHlwZToiaHRtbCIsZGF0YTpiLGNvbXBsZXRlOmZ1bmN0aW9uKGksbyl7aWYobz09PSJzdWNjZXNzInx8bz09PSJub3Rtb2RpZmllZCIpai5odG1sKGU/YygiPGRpdiAvPiIpLmFwcGVuZChpLnJlc3BvbnNlVGV4dC5yZXBsYWNlKHRiLCIiKSkuZmluZChlKTppLnJlc3BvbnNlVGV4dCk7ZCYmai5lYWNoKGQsW2kucmVzcG9uc2VUZXh0LG8saV0pfX0pO3JldHVybiB0aGlzfSwKc2VyaWFsaXplOmZ1bmN0aW9uKCl7cmV0dXJuIGMucGFyYW0odGhpcy5zZXJpYWxpemVBcnJheSgpKX0sc2VyaWFsaXplQXJyYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lbGVtZW50cz9jLm1ha2VBcnJheSh0aGlzLmVsZW1lbnRzKTp0aGlzfSkuZmlsdGVyKGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubmFtZSYmIXRoaXMuZGlzYWJsZWQmJih0aGlzLmNoZWNrZWR8fHViLnRlc3QodGhpcy5ub2RlTmFtZSl8fHZiLnRlc3QodGhpcy50eXBlKSl9KS5tYXAoZnVuY3Rpb24oYSxiKXthPWModGhpcykudmFsKCk7cmV0dXJuIGE9PW51bGw/bnVsbDpjLmlzQXJyYXkoYSk/Yy5tYXAoYSxmdW5jdGlvbihkKXtyZXR1cm57bmFtZTpiLm5hbWUsdmFsdWU6ZH19KTp7bmFtZTpiLm5hbWUsdmFsdWU6YX19KS5nZXQoKX19KTtjLmVhY2goImFqYXhTdGFydCBhamF4U3RvcCBhamF4Q29tcGxldGUgYWpheEVycm9yIGFqYXhTdWNjZXNzIGFqYXhTZW5kIi5zcGxpdCgiICIpLApmdW5jdGlvbihhLGIpe2MuZm5bYl09ZnVuY3Rpb24oZCl7cmV0dXJuIHRoaXMuYmluZChiLGQpfX0pO2MuZXh0ZW5kKHtnZXQ6ZnVuY3Rpb24oYSxiLGQsZil7aWYoYy5pc0Z1bmN0aW9uKGIpKXtmPWZ8fGQ7ZD1iO2I9bnVsbH1yZXR1cm4gYy5hamF4KHt0eXBlOiJHRVQiLHVybDphLGRhdGE6YixzdWNjZXNzOmQsZGF0YVR5cGU6Zn0pfSxnZXRTY3JpcHQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYy5nZXQoYSxudWxsLGIsInNjcmlwdCIpfSxnZXRKU09OOmZ1bmN0aW9uKGEsYixkKXtyZXR1cm4gYy5nZXQoYSxiLGQsImpzb24iKX0scG9zdDpmdW5jdGlvbihhLGIsZCxmKXtpZihjLmlzRnVuY3Rpb24oYikpe2Y9Znx8ZDtkPWI7Yj17fX1yZXR1cm4gYy5hamF4KHt0eXBlOiJQT1NUIix1cmw6YSxkYXRhOmIsc3VjY2VzczpkLGRhdGFUeXBlOmZ9KX0sYWpheFNldHVwOmZ1bmN0aW9uKGEpe2MuZXh0ZW5kKGMuYWpheFNldHRpbmdzLGEpfSxhamF4U2V0dGluZ3M6e3VybDpsb2NhdGlvbi5ocmVmLApnbG9iYWw6dHJ1ZSx0eXBlOiJHRVQiLGNvbnRlbnRUeXBlOiJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiLHByb2Nlc3NEYXRhOnRydWUsYXN5bmM6dHJ1ZSx4aHI6QS5YTUxIdHRwUmVxdWVzdCYmKEEubG9jYXRpb24ucHJvdG9jb2whPT0iZmlsZToifHwhQS5BY3RpdmVYT2JqZWN0KT9mdW5jdGlvbigpe3JldHVybiBuZXcgQS5YTUxIdHRwUmVxdWVzdH06ZnVuY3Rpb24oKXt0cnl7cmV0dXJuIG5ldyBBLkFjdGl2ZVhPYmplY3QoIk1pY3Jvc29mdC5YTUxIVFRQIil9Y2F0Y2goYSl7fX0sYWNjZXB0czp7eG1sOiJhcHBsaWNhdGlvbi94bWwsIHRleHQveG1sIixodG1sOiJ0ZXh0L2h0bWwiLHNjcmlwdDoidGV4dC9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iixqc29uOiJhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L2phdmFzY3JpcHQiLHRleHQ6InRleHQvcGxhaW4iLF9kZWZhdWx0OiIqLyoifX0sbGFzdE1vZGlmaWVkOnt9LGV0YWc6e30sYWpheDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKCl7ZS5zdWNjZXNzJiYKZS5zdWNjZXNzLmNhbGwoayxvLGkseCk7ZS5nbG9iYWwmJmYoImFqYXhTdWNjZXNzIixbeCxlXSl9ZnVuY3Rpb24gZCgpe2UuY29tcGxldGUmJmUuY29tcGxldGUuY2FsbChrLHgsaSk7ZS5nbG9iYWwmJmYoImFqYXhDb21wbGV0ZSIsW3gsZV0pO2UuZ2xvYmFsJiYhLS1jLmFjdGl2ZSYmYy5ldmVudC50cmlnZ2VyKCJhamF4U3RvcCIpfWZ1bmN0aW9uIGYocSxwKXsoZS5jb250ZXh0P2MoZS5jb250ZXh0KTpjLmV2ZW50KS50cmlnZ2VyKHEscCl9dmFyIGU9Yy5leHRlbmQodHJ1ZSx7fSxjLmFqYXhTZXR0aW5ncyxhKSxqLGksbyxrPWEmJmEuY29udGV4dHx8ZSxuPWUudHlwZS50b1VwcGVyQ2FzZSgpO2lmKGUuZGF0YSYmZS5wcm9jZXNzRGF0YSYmdHlwZW9mIGUuZGF0YSE9PSJzdHJpbmciKWUuZGF0YT1jLnBhcmFtKGUuZGF0YSxlLnRyYWRpdGlvbmFsKTtpZihlLmRhdGFUeXBlPT09Impzb25wIil7aWYobj09PSJHRVQiKU4udGVzdChlLnVybCl8fChlLnVybCs9KGthLnRlc3QoZS51cmwpPwoiJiI6Ij8iKSsoZS5qc29ucHx8ImNhbGxiYWNrIikrIj0/Iik7ZWxzZSBpZighZS5kYXRhfHwhTi50ZXN0KGUuZGF0YSkpZS5kYXRhPShlLmRhdGE/ZS5kYXRhKyImIjoiIikrKGUuanNvbnB8fCJjYWxsYmFjayIpKyI9PyI7ZS5kYXRhVHlwZT0ianNvbiJ9aWYoZS5kYXRhVHlwZT09PSJqc29uIiYmKGUuZGF0YSYmTi50ZXN0KGUuZGF0YSl8fE4udGVzdChlLnVybCkpKXtqPWUuanNvbnBDYWxsYmFja3x8Impzb25wIitzYisrO2lmKGUuZGF0YSllLmRhdGE9KGUuZGF0YSsiIikucmVwbGFjZShOLCI9IitqKyIkMSIpO2UudXJsPWUudXJsLnJlcGxhY2UoTiwiPSIraisiJDEiKTtlLmRhdGFUeXBlPSJzY3JpcHQiO0Fbal09QVtqXXx8ZnVuY3Rpb24ocSl7bz1xO2IoKTtkKCk7QVtqXT13O3RyeXtkZWxldGUgQVtqXX1jYXRjaChwKXt9eiYmei5yZW1vdmVDaGlsZChDKX19aWYoZS5kYXRhVHlwZT09PSJzY3JpcHQiJiZlLmNhY2hlPT09bnVsbCllLmNhY2hlPWZhbHNlO2lmKGUuY2FjaGU9PT0KZmFsc2UmJm49PT0iR0VUIil7dmFyIHI9SigpLHU9ZS51cmwucmVwbGFjZSh3YiwiJDFfPSIrcisiJDIiKTtlLnVybD11Kyh1PT09ZS51cmw/KGthLnRlc3QoZS51cmwpPyImIjoiPyIpKyJfPSIrcjoiIil9aWYoZS5kYXRhJiZuPT09IkdFVCIpZS51cmwrPShrYS50ZXN0KGUudXJsKT8iJiI6Ij8iKStlLmRhdGE7ZS5nbG9iYWwmJiFjLmFjdGl2ZSsrJiZjLmV2ZW50LnRyaWdnZXIoImFqYXhTdGFydCIpO3I9KHI9eGIuZXhlYyhlLnVybCkpJiYoclsxXSYmclsxXSE9PWxvY2F0aW9uLnByb3RvY29sfHxyWzJdIT09bG9jYXRpb24uaG9zdCk7aWYoZS5kYXRhVHlwZT09PSJzY3JpcHQiJiZuPT09IkdFVCImJnIpe3ZhciB6PXMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImhlYWQiKVswXXx8cy5kb2N1bWVudEVsZW1lbnQsQz1zLmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO0Muc3JjPWUudXJsO2lmKGUuc2NyaXB0Q2hhcnNldClDLmNoYXJzZXQ9ZS5zY3JpcHRDaGFyc2V0O2lmKCFqKXt2YXIgQj0KZmFsc2U7Qy5vbmxvYWQ9Qy5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXtpZighQiYmKCF0aGlzLnJlYWR5U3RhdGV8fHRoaXMucmVhZHlTdGF0ZT09PSJsb2FkZWQifHx0aGlzLnJlYWR5U3RhdGU9PT0iY29tcGxldGUiKSl7Qj10cnVlO2IoKTtkKCk7Qy5vbmxvYWQ9Qy5vbnJlYWR5c3RhdGVjaGFuZ2U9bnVsbDt6JiZDLnBhcmVudE5vZGUmJnoucmVtb3ZlQ2hpbGQoQyl9fX16Lmluc2VydEJlZm9yZShDLHouZmlyc3RDaGlsZCk7cmV0dXJuIHd9dmFyIEU9ZmFsc2UseD1lLnhocigpO2lmKHgpe2UudXNlcm5hbWU/eC5vcGVuKG4sZS51cmwsZS5hc3luYyxlLnVzZXJuYW1lLGUucGFzc3dvcmQpOngub3BlbihuLGUudXJsLGUuYXN5bmMpO3RyeXtpZihlLmRhdGF8fGEmJmEuY29udGVudFR5cGUpeC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LVR5cGUiLGUuY29udGVudFR5cGUpO2lmKGUuaWZNb2RpZmllZCl7Yy5sYXN0TW9kaWZpZWRbZS51cmxdJiZ4LnNldFJlcXVlc3RIZWFkZXIoIklmLU1vZGlmaWVkLVNpbmNlIiwKYy5sYXN0TW9kaWZpZWRbZS51cmxdKTtjLmV0YWdbZS51cmxdJiZ4LnNldFJlcXVlc3RIZWFkZXIoIklmLU5vbmUtTWF0Y2giLGMuZXRhZ1tlLnVybF0pfXJ8fHguc2V0UmVxdWVzdEhlYWRlcigiWC1SZXF1ZXN0ZWQtV2l0aCIsIlhNTEh0dHBSZXF1ZXN0Iik7eC5zZXRSZXF1ZXN0SGVhZGVyKCJBY2NlcHQiLGUuZGF0YVR5cGUmJmUuYWNjZXB0c1tlLmRhdGFUeXBlXT9lLmFjY2VwdHNbZS5kYXRhVHlwZV0rIiwgKi8qIjplLmFjY2VwdHMuX2RlZmF1bHQpfWNhdGNoKGdhKXt9aWYoZS5iZWZvcmVTZW5kJiZlLmJlZm9yZVNlbmQuY2FsbChrLHgsZSk9PT1mYWxzZSl7ZS5nbG9iYWwmJiEtLWMuYWN0aXZlJiZjLmV2ZW50LnRyaWdnZXIoImFqYXhTdG9wIik7eC5hYm9ydCgpO3JldHVybiBmYWxzZX1lLmdsb2JhbCYmZigiYWpheFNlbmQiLFt4LGVdKTt2YXIgZz14Lm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbihxKXtpZigheHx8eC5yZWFkeVN0YXRlPT09MHx8cT09PSJhYm9ydCIpe0V8fApkKCk7RT10cnVlO2lmKHgpeC5vbnJlYWR5c3RhdGVjaGFuZ2U9Yy5ub29wfWVsc2UgaWYoIUUmJngmJih4LnJlYWR5U3RhdGU9PT00fHxxPT09InRpbWVvdXQiKSl7RT10cnVlO3gub25yZWFkeXN0YXRlY2hhbmdlPWMubm9vcDtpPXE9PT0idGltZW91dCI/InRpbWVvdXQiOiFjLmh0dHBTdWNjZXNzKHgpPyJlcnJvciI6ZS5pZk1vZGlmaWVkJiZjLmh0dHBOb3RNb2RpZmllZCh4LGUudXJsKT8ibm90bW9kaWZpZWQiOiJzdWNjZXNzIjt2YXIgcDtpZihpPT09InN1Y2Nlc3MiKXRyeXtvPWMuaHR0cERhdGEoeCxlLmRhdGFUeXBlLGUpfWNhdGNoKHYpe2k9InBhcnNlcmVycm9yIjtwPXZ9aWYoaT09PSJzdWNjZXNzInx8aT09PSJub3Rtb2RpZmllZCIpanx8YigpO2Vsc2UgYy5oYW5kbGVFcnJvcihlLHgsaSxwKTtkKCk7cT09PSJ0aW1lb3V0IiYmeC5hYm9ydCgpO2lmKGUuYXN5bmMpeD1udWxsfX07dHJ5e3ZhciBoPXguYWJvcnQ7eC5hYm9ydD1mdW5jdGlvbigpe3gmJmguY2FsbCh4KTsKZygiYWJvcnQiKX19Y2F0Y2gobCl7fWUuYXN5bmMmJmUudGltZW91dD4wJiZzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7eCYmIUUmJmcoInRpbWVvdXQiKX0sZS50aW1lb3V0KTt0cnl7eC5zZW5kKG49PT0iUE9TVCJ8fG49PT0iUFVUInx8bj09PSJERUxFVEUiP2UuZGF0YTpudWxsKX1jYXRjaChtKXtjLmhhbmRsZUVycm9yKGUseCxudWxsLG0pO2QoKX1lLmFzeW5jfHxnKCk7cmV0dXJuIHh9fSxoYW5kbGVFcnJvcjpmdW5jdGlvbihhLGIsZCxmKXtpZihhLmVycm9yKWEuZXJyb3IuY2FsbChhLmNvbnRleHR8fGEsYixkLGYpO2lmKGEuZ2xvYmFsKShhLmNvbnRleHQ/YyhhLmNvbnRleHQpOmMuZXZlbnQpLnRyaWdnZXIoImFqYXhFcnJvciIsW2IsYSxmXSl9LGFjdGl2ZTowLGh0dHBTdWNjZXNzOmZ1bmN0aW9uKGEpe3RyeXtyZXR1cm4hYS5zdGF0dXMmJmxvY2F0aW9uLnByb3RvY29sPT09ImZpbGU6Inx8YS5zdGF0dXM+PTIwMCYmYS5zdGF0dXM8MzAwfHxhLnN0YXR1cz09PTMwNHx8YS5zdGF0dXM9PT0KMTIyM3x8YS5zdGF0dXM9PT0wfWNhdGNoKGIpe31yZXR1cm4gZmFsc2V9LGh0dHBOb3RNb2RpZmllZDpmdW5jdGlvbihhLGIpe3ZhciBkPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIkxhc3QtTW9kaWZpZWQiKSxmPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIkV0YWciKTtpZihkKWMubGFzdE1vZGlmaWVkW2JdPWQ7aWYoZiljLmV0YWdbYl09ZjtyZXR1cm4gYS5zdGF0dXM9PT0zMDR8fGEuc3RhdHVzPT09MH0saHR0cERhdGE6ZnVuY3Rpb24oYSxiLGQpe3ZhciBmPWEuZ2V0UmVzcG9uc2VIZWFkZXIoImNvbnRlbnQtdHlwZSIpfHwiIixlPWI9PT0ieG1sInx8IWImJmYuaW5kZXhPZigieG1sIik+PTA7YT1lP2EucmVzcG9uc2VYTUw6YS5yZXNwb25zZVRleHQ7ZSYmYS5kb2N1bWVudEVsZW1lbnQubm9kZU5hbWU9PT0icGFyc2VyZXJyb3IiJiZjLmVycm9yKCJwYXJzZXJlcnJvciIpO2lmKGQmJmQuZGF0YUZpbHRlcilhPWQuZGF0YUZpbHRlcihhLGIpO2lmKHR5cGVvZiBhPT09InN0cmluZyIpaWYoYj09PQoianNvbiJ8fCFiJiZmLmluZGV4T2YoImpzb24iKT49MClhPWMucGFyc2VKU09OKGEpO2Vsc2UgaWYoYj09PSJzY3JpcHQifHwhYiYmZi5pbmRleE9mKCJqYXZhc2NyaXB0Iik+PTApYy5nbG9iYWxFdmFsKGEpO3JldHVybiBhfSxwYXJhbTpmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGQoaSxvKXtpZihjLmlzQXJyYXkobykpYy5lYWNoKG8sZnVuY3Rpb24oayxuKXtifHwvXFtcXSQvLnRlc3QoaSk/ZihpLG4pOmQoaSsiWyIrKHR5cGVvZiBuPT09Im9iamVjdCJ8fGMuaXNBcnJheShuKT9rOiIiKSsiXSIsbil9KTtlbHNlIWImJm8hPW51bGwmJnR5cGVvZiBvPT09Im9iamVjdCI/Yy5lYWNoKG8sZnVuY3Rpb24oayxuKXtkKGkrIlsiK2srIl0iLG4pfSk6ZihpLG8pfWZ1bmN0aW9uIGYoaSxvKXtvPWMuaXNGdW5jdGlvbihvKT9vKCk6bztlW2UubGVuZ3RoXT1lbmNvZGVVUklDb21wb25lbnQoaSkrIj0iK2VuY29kZVVSSUNvbXBvbmVudChvKX12YXIgZT1bXTtpZihiPT09dyliPWMuYWpheFNldHRpbmdzLnRyYWRpdGlvbmFsOwppZihjLmlzQXJyYXkoYSl8fGEuanF1ZXJ5KWMuZWFjaChhLGZ1bmN0aW9uKCl7Zih0aGlzLm5hbWUsdGhpcy52YWx1ZSl9KTtlbHNlIGZvcih2YXIgaiBpbiBhKWQoaixhW2pdKTtyZXR1cm4gZS5qb2luKCImIikucmVwbGFjZSh5YiwiKyIpfX0pO3ZhciBsYT17fSxBYj0vdG9nZ2xlfHNob3d8aGlkZS8sQmI9L14oWystXT0pPyhbXGQrLS5dKykoLiopJC8sVyx2YT1bWyJoZWlnaHQiLCJtYXJnaW5Ub3AiLCJtYXJnaW5Cb3R0b20iLCJwYWRkaW5nVG9wIiwicGFkZGluZ0JvdHRvbSJdLFsid2lkdGgiLCJtYXJnaW5MZWZ0IiwibWFyZ2luUmlnaHQiLCJwYWRkaW5nTGVmdCIsInBhZGRpbmdSaWdodCJdLFsib3BhY2l0eSJdXTtjLmZuLmV4dGVuZCh7c2hvdzpmdW5jdGlvbihhLGIpe2lmKGF8fGE9PT0wKXJldHVybiB0aGlzLmFuaW1hdGUoSygic2hvdyIsMyksYSxiKTtlbHNle2E9MDtmb3IoYj10aGlzLmxlbmd0aDthPGI7YSsrKXt2YXIgZD1jLmRhdGEodGhpc1thXSwib2xkZGlzcGxheSIpOwp0aGlzW2FdLnN0eWxlLmRpc3BsYXk9ZHx8IiI7aWYoYy5jc3ModGhpc1thXSwiZGlzcGxheSIpPT09Im5vbmUiKXtkPXRoaXNbYV0ubm9kZU5hbWU7dmFyIGY7aWYobGFbZF0pZj1sYVtkXTtlbHNle3ZhciBlPWMoIjwiK2QrIiAvPiIpLmFwcGVuZFRvKCJib2R5Iik7Zj1lLmNzcygiZGlzcGxheSIpO2lmKGY9PT0ibm9uZSIpZj0iYmxvY2siO2UucmVtb3ZlKCk7bGFbZF09Zn1jLmRhdGEodGhpc1thXSwib2xkZGlzcGxheSIsZil9fWE9MDtmb3IoYj10aGlzLmxlbmd0aDthPGI7YSsrKXRoaXNbYV0uc3R5bGUuZGlzcGxheT1jLmRhdGEodGhpc1thXSwib2xkZGlzcGxheSIpfHwiIjtyZXR1cm4gdGhpc319LGhpZGU6ZnVuY3Rpb24oYSxiKXtpZihhfHxhPT09MClyZXR1cm4gdGhpcy5hbmltYXRlKEsoImhpZGUiLDMpLGEsYik7ZWxzZXthPTA7Zm9yKGI9dGhpcy5sZW5ndGg7YTxiO2ErKyl7dmFyIGQ9Yy5kYXRhKHRoaXNbYV0sIm9sZGRpc3BsYXkiKTshZCYmZCE9PSJub25lIiYmYy5kYXRhKHRoaXNbYV0sCiJvbGRkaXNwbGF5IixjLmNzcyh0aGlzW2FdLCJkaXNwbGF5IikpfWE9MDtmb3IoYj10aGlzLmxlbmd0aDthPGI7YSsrKXRoaXNbYV0uc3R5bGUuZGlzcGxheT0ibm9uZSI7cmV0dXJuIHRoaXN9fSxfdG9nZ2xlOmMuZm4udG9nZ2xlLHRvZ2dsZTpmdW5jdGlvbihhLGIpe3ZhciBkPXR5cGVvZiBhPT09ImJvb2xlYW4iO2lmKGMuaXNGdW5jdGlvbihhKSYmYy5pc0Z1bmN0aW9uKGIpKXRoaXMuX3RvZ2dsZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7ZWxzZSBhPT1udWxsfHxkP3RoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBmPWQ/YTpjKHRoaXMpLmlzKCI6aGlkZGVuIik7Yyh0aGlzKVtmPyJzaG93IjoiaGlkZSJdKCl9KTp0aGlzLmFuaW1hdGUoSygidG9nZ2xlIiwzKSxhLGIpO3JldHVybiB0aGlzfSxmYWRlVG86ZnVuY3Rpb24oYSxiLGQpe3JldHVybiB0aGlzLmZpbHRlcigiOmhpZGRlbiIpLmNzcygib3BhY2l0eSIsMCkuc2hvdygpLmVuZCgpLmFuaW1hdGUoe29wYWNpdHk6Yn0sYSxkKX0sCmFuaW1hdGU6ZnVuY3Rpb24oYSxiLGQsZil7dmFyIGU9Yy5zcGVlZChiLGQsZik7aWYoYy5pc0VtcHR5T2JqZWN0KGEpKXJldHVybiB0aGlzLmVhY2goZS5jb21wbGV0ZSk7cmV0dXJuIHRoaXNbZS5xdWV1ZT09PWZhbHNlPyJlYWNoIjoicXVldWUiXShmdW5jdGlvbigpe3ZhciBqPWMuZXh0ZW5kKHt9LGUpLGksbz10aGlzLm5vZGVUeXBlPT09MSYmYyh0aGlzKS5pcygiOmhpZGRlbiIpLGs9dGhpcztmb3IoaSBpbiBhKXt2YXIgbj1pLnJlcGxhY2UoaWEsamEpO2lmKGkhPT1uKXthW25dPWFbaV07ZGVsZXRlIGFbaV07aT1ufWlmKGFbaV09PT0iaGlkZSImJm98fGFbaV09PT0ic2hvdyImJiFvKXJldHVybiBqLmNvbXBsZXRlLmNhbGwodGhpcyk7aWYoKGk9PT0iaGVpZ2h0Inx8aT09PSJ3aWR0aCIpJiZ0aGlzLnN0eWxlKXtqLmRpc3BsYXk9Yy5jc3ModGhpcywiZGlzcGxheSIpO2oub3ZlcmZsb3c9dGhpcy5zdHlsZS5vdmVyZmxvd31pZihjLmlzQXJyYXkoYVtpXSkpeyhqLnNwZWNpYWxFYXNpbmc9Cmouc3BlY2lhbEVhc2luZ3x8e30pW2ldPWFbaV1bMV07YVtpXT1hW2ldWzBdfX1pZihqLm92ZXJmbG93IT1udWxsKXRoaXMuc3R5bGUub3ZlcmZsb3c9ImhpZGRlbiI7ai5jdXJBbmltPWMuZXh0ZW5kKHt9LGEpO2MuZWFjaChhLGZ1bmN0aW9uKHIsdSl7dmFyIHo9bmV3IGMuZngoayxqLHIpO2lmKEFiLnRlc3QodSkpelt1PT09InRvZ2dsZSI/bz8ic2hvdyI6ImhpZGUiOnVdKGEpO2Vsc2V7dmFyIEM9QmIuZXhlYyh1KSxCPXouY3VyKHRydWUpfHwwO2lmKEMpe3U9cGFyc2VGbG9hdChDWzJdKTt2YXIgRT1DWzNdfHwicHgiO2lmKEUhPT0icHgiKXtrLnN0eWxlW3JdPSh1fHwxKStFO0I9KHV8fDEpL3ouY3VyKHRydWUpKkI7ay5zdHlsZVtyXT1CK0V9aWYoQ1sxXSl1PShDWzFdPT09Ii09Ij8tMToxKSp1K0I7ei5jdXN0b20oQix1LEUpfWVsc2Ugei5jdXN0b20oQix1LCIiKX19KTtyZXR1cm4gdHJ1ZX0pfSxzdG9wOmZ1bmN0aW9uKGEsYil7dmFyIGQ9Yy50aW1lcnM7YSYmdGhpcy5xdWV1ZShbXSk7CnRoaXMuZWFjaChmdW5jdGlvbigpe2Zvcih2YXIgZj1kLmxlbmd0aC0xO2Y+PTA7Zi0tKWlmKGRbZl0uZWxlbT09PXRoaXMpe2ImJmRbZl0odHJ1ZSk7ZC5zcGxpY2UoZiwxKX19KTtifHx0aGlzLmRlcXVldWUoKTtyZXR1cm4gdGhpc319KTtjLmVhY2goe3NsaWRlRG93bjpLKCJzaG93IiwxKSxzbGlkZVVwOksoImhpZGUiLDEpLHNsaWRlVG9nZ2xlOksoInRvZ2dsZSIsMSksZmFkZUluOntvcGFjaXR5OiJzaG93In0sZmFkZU91dDp7b3BhY2l0eToiaGlkZSJ9fSxmdW5jdGlvbihhLGIpe2MuZm5bYV09ZnVuY3Rpb24oZCxmKXtyZXR1cm4gdGhpcy5hbmltYXRlKGIsZCxmKX19KTtjLmV4dGVuZCh7c3BlZWQ6ZnVuY3Rpb24oYSxiLGQpe3ZhciBmPWEmJnR5cGVvZiBhPT09Im9iamVjdCI/YTp7Y29tcGxldGU6ZHx8IWQmJmJ8fGMuaXNGdW5jdGlvbihhKSYmYSxkdXJhdGlvbjphLGVhc2luZzpkJiZifHxiJiYhYy5pc0Z1bmN0aW9uKGIpJiZifTtmLmR1cmF0aW9uPWMuZngub2ZmPzA6dHlwZW9mIGYuZHVyYXRpb249PT0KIm51bWJlciI/Zi5kdXJhdGlvbjpjLmZ4LnNwZWVkc1tmLmR1cmF0aW9uXXx8Yy5meC5zcGVlZHMuX2RlZmF1bHQ7Zi5vbGQ9Zi5jb21wbGV0ZTtmLmNvbXBsZXRlPWZ1bmN0aW9uKCl7Zi5xdWV1ZSE9PWZhbHNlJiZjKHRoaXMpLmRlcXVldWUoKTtjLmlzRnVuY3Rpb24oZi5vbGQpJiZmLm9sZC5jYWxsKHRoaXMpfTtyZXR1cm4gZn0sZWFzaW5nOntsaW5lYXI6ZnVuY3Rpb24oYSxiLGQsZil7cmV0dXJuIGQrZiphfSxzd2luZzpmdW5jdGlvbihhLGIsZCxmKXtyZXR1cm4oLU1hdGguY29zKGEqTWF0aC5QSSkvMiswLjUpKmYrZH19LHRpbWVyczpbXSxmeDpmdW5jdGlvbihhLGIsZCl7dGhpcy5vcHRpb25zPWI7dGhpcy5lbGVtPWE7dGhpcy5wcm9wPWQ7aWYoIWIub3JpZyliLm9yaWc9e319fSk7Yy5meC5wcm90b3R5cGU9e3VwZGF0ZTpmdW5jdGlvbigpe3RoaXMub3B0aW9ucy5zdGVwJiZ0aGlzLm9wdGlvbnMuc3RlcC5jYWxsKHRoaXMuZWxlbSx0aGlzLm5vdyx0aGlzKTsoYy5meC5zdGVwW3RoaXMucHJvcF18fApjLmZ4LnN0ZXAuX2RlZmF1bHQpKHRoaXMpO2lmKCh0aGlzLnByb3A9PT0iaGVpZ2h0Inx8dGhpcy5wcm9wPT09IndpZHRoIikmJnRoaXMuZWxlbS5zdHlsZSl0aGlzLmVsZW0uc3R5bGUuZGlzcGxheT0iYmxvY2sifSxjdXI6ZnVuY3Rpb24oYSl7aWYodGhpcy5lbGVtW3RoaXMucHJvcF0hPW51bGwmJighdGhpcy5lbGVtLnN0eWxlfHx0aGlzLmVsZW0uc3R5bGVbdGhpcy5wcm9wXT09bnVsbCkpcmV0dXJuIHRoaXMuZWxlbVt0aGlzLnByb3BdO3JldHVybihhPXBhcnNlRmxvYXQoYy5jc3ModGhpcy5lbGVtLHRoaXMucHJvcCxhKSkpJiZhPi0xMDAwMD9hOnBhcnNlRmxvYXQoYy5jdXJDU1ModGhpcy5lbGVtLHRoaXMucHJvcCkpfHwwfSxjdXN0b206ZnVuY3Rpb24oYSxiLGQpe2Z1bmN0aW9uIGYoail7cmV0dXJuIGUuc3RlcChqKX10aGlzLnN0YXJ0VGltZT1KKCk7dGhpcy5zdGFydD1hO3RoaXMuZW5kPWI7dGhpcy51bml0PWR8fHRoaXMudW5pdHx8InB4Ijt0aGlzLm5vdz10aGlzLnN0YXJ0Owp0aGlzLnBvcz10aGlzLnN0YXRlPTA7dmFyIGU9dGhpcztmLmVsZW09dGhpcy5lbGVtO2lmKGYoKSYmYy50aW1lcnMucHVzaChmKSYmIVcpVz1zZXRJbnRlcnZhbChjLmZ4LnRpY2ssMTMpfSxzaG93OmZ1bmN0aW9uKCl7dGhpcy5vcHRpb25zLm9yaWdbdGhpcy5wcm9wXT1jLnN0eWxlKHRoaXMuZWxlbSx0aGlzLnByb3ApO3RoaXMub3B0aW9ucy5zaG93PXRydWU7dGhpcy5jdXN0b20odGhpcy5wcm9wPT09IndpZHRoInx8dGhpcy5wcm9wPT09ImhlaWdodCI/MTowLHRoaXMuY3VyKCkpO2ModGhpcy5lbGVtKS5zaG93KCl9LGhpZGU6ZnVuY3Rpb24oKXt0aGlzLm9wdGlvbnMub3JpZ1t0aGlzLnByb3BdPWMuc3R5bGUodGhpcy5lbGVtLHRoaXMucHJvcCk7dGhpcy5vcHRpb25zLmhpZGU9dHJ1ZTt0aGlzLmN1c3RvbSh0aGlzLmN1cigpLDApfSxzdGVwOmZ1bmN0aW9uKGEpe3ZhciBiPUooKSxkPXRydWU7aWYoYXx8Yj49dGhpcy5vcHRpb25zLmR1cmF0aW9uK3RoaXMuc3RhcnRUaW1lKXt0aGlzLm5vdz0KdGhpcy5lbmQ7dGhpcy5wb3M9dGhpcy5zdGF0ZT0xO3RoaXMudXBkYXRlKCk7dGhpcy5vcHRpb25zLmN1ckFuaW1bdGhpcy5wcm9wXT10cnVlO2Zvcih2YXIgZiBpbiB0aGlzLm9wdGlvbnMuY3VyQW5pbSlpZih0aGlzLm9wdGlvbnMuY3VyQW5pbVtmXSE9PXRydWUpZD1mYWxzZTtpZihkKXtpZih0aGlzLm9wdGlvbnMuZGlzcGxheSE9bnVsbCl7dGhpcy5lbGVtLnN0eWxlLm92ZXJmbG93PXRoaXMub3B0aW9ucy5vdmVyZmxvdzthPWMuZGF0YSh0aGlzLmVsZW0sIm9sZGRpc3BsYXkiKTt0aGlzLmVsZW0uc3R5bGUuZGlzcGxheT1hP2E6dGhpcy5vcHRpb25zLmRpc3BsYXk7aWYoYy5jc3ModGhpcy5lbGVtLCJkaXNwbGF5Iik9PT0ibm9uZSIpdGhpcy5lbGVtLnN0eWxlLmRpc3BsYXk9ImJsb2NrIn10aGlzLm9wdGlvbnMuaGlkZSYmYyh0aGlzLmVsZW0pLmhpZGUoKTtpZih0aGlzLm9wdGlvbnMuaGlkZXx8dGhpcy5vcHRpb25zLnNob3cpZm9yKHZhciBlIGluIHRoaXMub3B0aW9ucy5jdXJBbmltKWMuc3R5bGUodGhpcy5lbGVtLAplLHRoaXMub3B0aW9ucy5vcmlnW2VdKTt0aGlzLm9wdGlvbnMuY29tcGxldGUuY2FsbCh0aGlzLmVsZW0pfXJldHVybiBmYWxzZX1lbHNle2U9Yi10aGlzLnN0YXJ0VGltZTt0aGlzLnN0YXRlPWUvdGhpcy5vcHRpb25zLmR1cmF0aW9uO2E9dGhpcy5vcHRpb25zLmVhc2luZ3x8KGMuZWFzaW5nLnN3aW5nPyJzd2luZyI6ImxpbmVhciIpO3RoaXMucG9zPWMuZWFzaW5nW3RoaXMub3B0aW9ucy5zcGVjaWFsRWFzaW5nJiZ0aGlzLm9wdGlvbnMuc3BlY2lhbEVhc2luZ1t0aGlzLnByb3BdfHxhXSh0aGlzLnN0YXRlLGUsMCwxLHRoaXMub3B0aW9ucy5kdXJhdGlvbik7dGhpcy5ub3c9dGhpcy5zdGFydCsodGhpcy5lbmQtdGhpcy5zdGFydCkqdGhpcy5wb3M7dGhpcy51cGRhdGUoKX1yZXR1cm4gdHJ1ZX19O2MuZXh0ZW5kKGMuZngse3RpY2s6ZnVuY3Rpb24oKXtmb3IodmFyIGE9Yy50aW1lcnMsYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0oKXx8YS5zcGxpY2UoYi0tLDEpO2EubGVuZ3RofHwKYy5meC5zdG9wKCl9LHN0b3A6ZnVuY3Rpb24oKXtjbGVhckludGVydmFsKFcpO1c9bnVsbH0sc3BlZWRzOntzbG93OjYwMCxmYXN0OjIwMCxfZGVmYXVsdDo0MDB9LHN0ZXA6e29wYWNpdHk6ZnVuY3Rpb24oYSl7Yy5zdHlsZShhLmVsZW0sIm9wYWNpdHkiLGEubm93KX0sX2RlZmF1bHQ6ZnVuY3Rpb24oYSl7aWYoYS5lbGVtLnN0eWxlJiZhLmVsZW0uc3R5bGVbYS5wcm9wXSE9bnVsbClhLmVsZW0uc3R5bGVbYS5wcm9wXT0oYS5wcm9wPT09IndpZHRoInx8YS5wcm9wPT09ImhlaWdodCI/TWF0aC5tYXgoMCxhLm5vdyk6YS5ub3cpK2EudW5pdDtlbHNlIGEuZWxlbVthLnByb3BdPWEubm93fX19KTtpZihjLmV4cHImJmMuZXhwci5maWx0ZXJzKWMuZXhwci5maWx0ZXJzLmFuaW1hdGVkPWZ1bmN0aW9uKGEpe3JldHVybiBjLmdyZXAoYy50aW1lcnMsZnVuY3Rpb24oYil7cmV0dXJuIGE9PT1iLmVsZW19KS5sZW5ndGh9O2MuZm4ub2Zmc2V0PSJnZXRCb3VuZGluZ0NsaWVudFJlY3QiaW4gcy5kb2N1bWVudEVsZW1lbnQ/CmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXNbMF07aWYoYSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGUpe2Mub2Zmc2V0LnNldE9mZnNldCh0aGlzLGEsZSl9KTtpZighYnx8IWIub3duZXJEb2N1bWVudClyZXR1cm4gbnVsbDtpZihiPT09Yi5vd25lckRvY3VtZW50LmJvZHkpcmV0dXJuIGMub2Zmc2V0LmJvZHlPZmZzZXQoYik7dmFyIGQ9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxmPWIub3duZXJEb2N1bWVudDtiPWYuYm9keTtmPWYuZG9jdW1lbnRFbGVtZW50O3JldHVybnt0b3A6ZC50b3ArKHNlbGYucGFnZVlPZmZzZXR8fGMuc3VwcG9ydC5ib3hNb2RlbCYmZi5zY3JvbGxUb3B8fGIuc2Nyb2xsVG9wKS0oZi5jbGllbnRUb3B8fGIuY2xpZW50VG9wfHwwKSxsZWZ0OmQubGVmdCsoc2VsZi5wYWdlWE9mZnNldHx8Yy5zdXBwb3J0LmJveE1vZGVsJiZmLnNjcm9sbExlZnR8fGIuc2Nyb2xsTGVmdCktKGYuY2xpZW50TGVmdHx8Yi5jbGllbnRMZWZ0fHwwKX19OmZ1bmN0aW9uKGEpe3ZhciBiPQp0aGlzWzBdO2lmKGEpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihyKXtjLm9mZnNldC5zZXRPZmZzZXQodGhpcyxhLHIpfSk7aWYoIWJ8fCFiLm93bmVyRG9jdW1lbnQpcmV0dXJuIG51bGw7aWYoYj09PWIub3duZXJEb2N1bWVudC5ib2R5KXJldHVybiBjLm9mZnNldC5ib2R5T2Zmc2V0KGIpO2Mub2Zmc2V0LmluaXRpYWxpemUoKTt2YXIgZD1iLm9mZnNldFBhcmVudCxmPWIsZT1iLm93bmVyRG9jdW1lbnQsaixpPWUuZG9jdW1lbnRFbGVtZW50LG89ZS5ib2R5O2Y9KGU9ZS5kZWZhdWx0Vmlldyk/ZS5nZXRDb21wdXRlZFN0eWxlKGIsbnVsbCk6Yi5jdXJyZW50U3R5bGU7Zm9yKHZhciBrPWIub2Zmc2V0VG9wLG49Yi5vZmZzZXRMZWZ0OyhiPWIucGFyZW50Tm9kZSkmJmIhPT1vJiZiIT09aTspe2lmKGMub2Zmc2V0LnN1cHBvcnRzRml4ZWRQb3NpdGlvbiYmZi5wb3NpdGlvbj09PSJmaXhlZCIpYnJlYWs7aj1lP2UuZ2V0Q29tcHV0ZWRTdHlsZShiLG51bGwpOmIuY3VycmVudFN0eWxlOwprLT1iLnNjcm9sbFRvcDtuLT1iLnNjcm9sbExlZnQ7aWYoYj09PWQpe2srPWIub2Zmc2V0VG9wO24rPWIub2Zmc2V0TGVmdDtpZihjLm9mZnNldC5kb2VzTm90QWRkQm9yZGVyJiYhKGMub2Zmc2V0LmRvZXNBZGRCb3JkZXJGb3JUYWJsZUFuZENlbGxzJiYvXnQoYWJsZXxkfGgpJC9pLnRlc3QoYi5ub2RlTmFtZSkpKXtrKz1wYXJzZUZsb2F0KGouYm9yZGVyVG9wV2lkdGgpfHwwO24rPXBhcnNlRmxvYXQoai5ib3JkZXJMZWZ0V2lkdGgpfHwwfWY9ZDtkPWIub2Zmc2V0UGFyZW50fWlmKGMub2Zmc2V0LnN1YnRyYWN0c0JvcmRlckZvck92ZXJmbG93Tm90VmlzaWJsZSYmai5vdmVyZmxvdyE9PSJ2aXNpYmxlIil7ays9cGFyc2VGbG9hdChqLmJvcmRlclRvcFdpZHRoKXx8MDtuKz1wYXJzZUZsb2F0KGouYm9yZGVyTGVmdFdpZHRoKXx8MH1mPWp9aWYoZi5wb3NpdGlvbj09PSJyZWxhdGl2ZSJ8fGYucG9zaXRpb249PT0ic3RhdGljIil7ays9by5vZmZzZXRUb3A7bis9by5vZmZzZXRMZWZ0fWlmKGMub2Zmc2V0LnN1cHBvcnRzRml4ZWRQb3NpdGlvbiYmCmYucG9zaXRpb249PT0iZml4ZWQiKXtrKz1NYXRoLm1heChpLnNjcm9sbFRvcCxvLnNjcm9sbFRvcCk7bis9TWF0aC5tYXgoaS5zY3JvbGxMZWZ0LG8uc2Nyb2xsTGVmdCl9cmV0dXJue3RvcDprLGxlZnQ6bn19O2Mub2Zmc2V0PXtpbml0aWFsaXplOmZ1bmN0aW9uKCl7dmFyIGE9cy5ib2R5LGI9cy5jcmVhdGVFbGVtZW50KCJkaXYiKSxkLGYsZSxqPXBhcnNlRmxvYXQoYy5jdXJDU1MoYSwibWFyZ2luVG9wIix0cnVlKSl8fDA7Yy5leHRlbmQoYi5zdHlsZSx7cG9zaXRpb246ImFic29sdXRlIix0b3A6MCxsZWZ0OjAsbWFyZ2luOjAsYm9yZGVyOjAsd2lkdGg6IjFweCIsaGVpZ2h0OiIxcHgiLHZpc2liaWxpdHk6ImhpZGRlbiJ9KTtiLmlubmVySFRNTD0iPGRpdiBzdHlsZT0ncG9zaXRpb246YWJzb2x1dGU7dG9wOjA7bGVmdDowO21hcmdpbjowO2JvcmRlcjo1cHggc29saWQgIzAwMDtwYWRkaW5nOjA7d2lkdGg6MXB4O2hlaWdodDoxcHg7Jz48ZGl2PjwvZGl2PjwvZGl2Pjx0YWJsZSBzdHlsZT0ncG9zaXRpb246YWJzb2x1dGU7dG9wOjA7bGVmdDowO21hcmdpbjowO2JvcmRlcjo1cHggc29saWQgIzAwMDtwYWRkaW5nOjA7d2lkdGg6MXB4O2hlaWdodDoxcHg7JyBjZWxscGFkZGluZz0nMCcgY2VsbHNwYWNpbmc9JzAnPjx0cj48dGQ+PC90ZD48L3RyPjwvdGFibGU+IjsKYS5pbnNlcnRCZWZvcmUoYixhLmZpcnN0Q2hpbGQpO2Q9Yi5maXJzdENoaWxkO2Y9ZC5maXJzdENoaWxkO2U9ZC5uZXh0U2libGluZy5maXJzdENoaWxkLmZpcnN0Q2hpbGQ7dGhpcy5kb2VzTm90QWRkQm9yZGVyPWYub2Zmc2V0VG9wIT09NTt0aGlzLmRvZXNBZGRCb3JkZXJGb3JUYWJsZUFuZENlbGxzPWUub2Zmc2V0VG9wPT09NTtmLnN0eWxlLnBvc2l0aW9uPSJmaXhlZCI7Zi5zdHlsZS50b3A9IjIwcHgiO3RoaXMuc3VwcG9ydHNGaXhlZFBvc2l0aW9uPWYub2Zmc2V0VG9wPT09MjB8fGYub2Zmc2V0VG9wPT09MTU7Zi5zdHlsZS5wb3NpdGlvbj1mLnN0eWxlLnRvcD0iIjtkLnN0eWxlLm92ZXJmbG93PSJoaWRkZW4iO2Quc3R5bGUucG9zaXRpb249InJlbGF0aXZlIjt0aGlzLnN1YnRyYWN0c0JvcmRlckZvck92ZXJmbG93Tm90VmlzaWJsZT1mLm9mZnNldFRvcD09PS01O3RoaXMuZG9lc05vdEluY2x1ZGVNYXJnaW5JbkJvZHlPZmZzZXQ9YS5vZmZzZXRUb3AhPT1qO2EucmVtb3ZlQ2hpbGQoYik7CmMub2Zmc2V0LmluaXRpYWxpemU9Yy5ub29wfSxib2R5T2Zmc2V0OmZ1bmN0aW9uKGEpe3ZhciBiPWEub2Zmc2V0VG9wLGQ9YS5vZmZzZXRMZWZ0O2Mub2Zmc2V0LmluaXRpYWxpemUoKTtpZihjLm9mZnNldC5kb2VzTm90SW5jbHVkZU1hcmdpbkluQm9keU9mZnNldCl7Yis9cGFyc2VGbG9hdChjLmN1ckNTUyhhLCJtYXJnaW5Ub3AiLHRydWUpKXx8MDtkKz1wYXJzZUZsb2F0KGMuY3VyQ1NTKGEsIm1hcmdpbkxlZnQiLHRydWUpKXx8MH1yZXR1cm57dG9wOmIsbGVmdDpkfX0sc2V0T2Zmc2V0OmZ1bmN0aW9uKGEsYixkKXtpZigvc3RhdGljLy50ZXN0KGMuY3VyQ1NTKGEsInBvc2l0aW9uIikpKWEuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIjt2YXIgZj1jKGEpLGU9Zi5vZmZzZXQoKSxqPXBhcnNlSW50KGMuY3VyQ1NTKGEsInRvcCIsdHJ1ZSksMTApfHwwLGk9cGFyc2VJbnQoYy5jdXJDU1MoYSwibGVmdCIsdHJ1ZSksMTApfHwwO2lmKGMuaXNGdW5jdGlvbihiKSliPWIuY2FsbChhLApkLGUpO2Q9e3RvcDpiLnRvcC1lLnRvcCtqLGxlZnQ6Yi5sZWZ0LWUubGVmdCtpfTsidXNpbmciaW4gYj9iLnVzaW5nLmNhbGwoYSxkKTpmLmNzcyhkKX19O2MuZm4uZXh0ZW5kKHtwb3NpdGlvbjpmdW5jdGlvbigpe2lmKCF0aGlzWzBdKXJldHVybiBudWxsO3ZhciBhPXRoaXNbMF0sYj10aGlzLm9mZnNldFBhcmVudCgpLGQ9dGhpcy5vZmZzZXQoKSxmPS9eYm9keXxodG1sJC9pLnRlc3QoYlswXS5ub2RlTmFtZSk/e3RvcDowLGxlZnQ6MH06Yi5vZmZzZXQoKTtkLnRvcC09cGFyc2VGbG9hdChjLmN1ckNTUyhhLCJtYXJnaW5Ub3AiLHRydWUpKXx8MDtkLmxlZnQtPXBhcnNlRmxvYXQoYy5jdXJDU1MoYSwibWFyZ2luTGVmdCIsdHJ1ZSkpfHwwO2YudG9wKz1wYXJzZUZsb2F0KGMuY3VyQ1NTKGJbMF0sImJvcmRlclRvcFdpZHRoIix0cnVlKSl8fDA7Zi5sZWZ0Kz1wYXJzZUZsb2F0KGMuY3VyQ1NTKGJbMF0sImJvcmRlckxlZnRXaWR0aCIsdHJ1ZSkpfHwwO3JldHVybnt0b3A6ZC50b3AtCmYudG9wLGxlZnQ6ZC5sZWZ0LWYubGVmdH19LG9mZnNldFBhcmVudDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hcChmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLm9mZnNldFBhcmVudHx8cy5ib2R5O2EmJiEvXmJvZHl8aHRtbCQvaS50ZXN0KGEubm9kZU5hbWUpJiZjLmNzcyhhLCJwb3NpdGlvbiIpPT09InN0YXRpYyI7KWE9YS5vZmZzZXRQYXJlbnQ7cmV0dXJuIGF9KX19KTtjLmVhY2goWyJMZWZ0IiwiVG9wIl0sZnVuY3Rpb24oYSxiKXt2YXIgZD0ic2Nyb2xsIitiO2MuZm5bZF09ZnVuY3Rpb24oZil7dmFyIGU9dGhpc1swXSxqO2lmKCFlKXJldHVybiBudWxsO2lmKGYhPT13KXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtpZihqPXdhKHRoaXMpKWouc2Nyb2xsVG8oIWE/ZjpjKGopLnNjcm9sbExlZnQoKSxhP2Y6YyhqKS5zY3JvbGxUb3AoKSk7ZWxzZSB0aGlzW2RdPWZ9KTtlbHNlIHJldHVybihqPXdhKGUpKT8icGFnZVhPZmZzZXQiaW4gaj9qW2E/InBhZ2VZT2Zmc2V0IjoKInBhZ2VYT2Zmc2V0Il06Yy5zdXBwb3J0LmJveE1vZGVsJiZqLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudFtkXXx8ai5kb2N1bWVudC5ib2R5W2RdOmVbZF19fSk7Yy5lYWNoKFsiSGVpZ2h0IiwiV2lkdGgiXSxmdW5jdGlvbihhLGIpe3ZhciBkPWIudG9Mb3dlckNhc2UoKTtjLmZuWyJpbm5lciIrYl09ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc1swXT9jLmNzcyh0aGlzWzBdLGQsZmFsc2UsInBhZGRpbmciKTpudWxsfTtjLmZuWyJvdXRlciIrYl09ZnVuY3Rpb24oZil7cmV0dXJuIHRoaXNbMF0/Yy5jc3ModGhpc1swXSxkLGZhbHNlLGY/Im1hcmdpbiI6ImJvcmRlciIpOm51bGx9O2MuZm5bZF09ZnVuY3Rpb24oZil7dmFyIGU9dGhpc1swXTtpZighZSlyZXR1cm4gZj09bnVsbD9udWxsOnRoaXM7aWYoYy5pc0Z1bmN0aW9uKGYpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oail7dmFyIGk9Yyh0aGlzKTtpW2RdKGYuY2FsbCh0aGlzLGosaVtkXSgpKSl9KTtyZXR1cm4ic2Nyb2xsVG8iaW4KZSYmZS5kb2N1bWVudD9lLmRvY3VtZW50LmNvbXBhdE1vZGU9PT0iQ1NTMUNvbXBhdCImJmUuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50WyJjbGllbnQiK2JdfHxlLmRvY3VtZW50LmJvZHlbImNsaWVudCIrYl06ZS5ub2RlVHlwZT09PTk/TWF0aC5tYXgoZS5kb2N1bWVudEVsZW1lbnRbImNsaWVudCIrYl0sZS5ib2R5WyJzY3JvbGwiK2JdLGUuZG9jdW1lbnRFbGVtZW50WyJzY3JvbGwiK2JdLGUuYm9keVsib2Zmc2V0IitiXSxlLmRvY3VtZW50RWxlbWVudFsib2Zmc2V0IitiXSk6Zj09PXc/Yy5jc3MoZSxkKTp0aGlzLmNzcyhkLHR5cGVvZiBmPT09InN0cmluZyI/ZjpmKyJweCIpfX0pO0EualF1ZXJ5PUEuJD1jfSkod2luZG93KTsK]]></data>
	</file>
	<file>
	  <filename>/templates/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/templates/admin_tab_providers.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Cgp7aWYgaXNzZXQoJG1lc3NhZ2UpIH08cD57JG1lc3NhZ2V9PC9wPnsvaWZ9Cnskc3RhcnRmb3JtfQo8ZmllbGRzZXQ+CjxsZWdlbmQ+QWN0aXZlIHByb3ZpZGVyczo8L2xlZ2VuZD4KCTxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CiAgICAgICAgICAgIDxwIGNsYXNzPSJwYWdldGV4dCI+R29vZ2xlPC9wPgogICAgICAgICAgICA8cCBjbGFzcz0icGFnZWlucHV0Ij4KCQk8bGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9Inskb3BlbmlkanF1ZXJ5cGx1Z2luX3BhdGh9L2ltYWdlcy9nb29nbGVXLnBuZyIgYWx0PSJHb29nbGUiIC8+CiAgICAgICAgICAgICAgICAgICAgeyRpbnB1dF9nb29nbGV9CiAgICAgICAgICAgICAgICAgICAgZW5hYmxlZAogICAgICAgICAgICAgICAgPC9sYWJlbD4KICAgICAgICAgICAgPC9wPgogICAgICAgICAgICA8cCBjbGFzcz0icGFnZWlucHV0Ij4KICAgICAgICAgICAgICAgIERvY3VtZW50YXRpb24gOiA8YSBocmVmPSJodHRwOi8vY29kZS5nb29nbGUuY29tL2ludGwvZW4vYXBpcy9hY2NvdW50cy9kb2NzL09wZW5JRC5odG1sIiB0YXJnZXQ9Il9ibGFuayI+RmVkZXJhdGVkIExvZ2luIGZvciBHb29nbGUgQWNjb3VudCBVc2VyczwvYT4KICAgICAgICAgICAgPC9wPgoJPC9kaXY+Cgk8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgogICAgICAgICAgICA8cCBjbGFzcz0icGFnZXRleHQiPllhaG9vPC9wPgogICAgICAgICAgICA8cCBjbGFzcz0icGFnZWlucHV0Ij4KCQk8bGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9Inskb3BlbmlkanF1ZXJ5cGx1Z2luX3BhdGh9L2ltYWdlcy95YWhvb1cucG5nIiBhbHQ9IllhaG9vIiAvPgogICAgICAgICAgICAgICAgICAgIHskaW5wdXRfeWFob299CiAgICAgICAgICAgICAgICAgICAgZW5hYmxlZAogICAgICAgICAgICAgICAgPC9sYWJlbD4KICAgICAgICAgICAgPC9wPgogICAgICAgICAgICA8cCBjbGFzcz0icGFnZWlucHV0Ij4KICAgICAgICAgICAgUHVibGljIE9wZW5JRCBwYWdlIDogPGEgaHJlZj0iaHR0cDovL29wZW5pZC55YWhvby5jb20vIiB0YXJnZXQ9Il9ibGFuayI+b3BlbmlkLnlhaG9vLmNvbS88L2E+PGJyLz4KICAgICAgICAgICAgRG9jdW1lbnRhdGlvbiA6IDxhIGhyZWY9Imh0dHA6Ly9kZXZlbG9wZXIueWFob28uY29tL29wZW5pZC8iIHRhcmdldD0iX2JsYW5rIj5EZXZlbG9wZXIgZG9jdW1lbnRhdGlvbjwvYT4KICAgICAgICAgICAgPC9wPgoJPC9kaXY+Cgk8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgogICAgICAgICAgICA8cCBjbGFzcz0icGFnZXRleHQiPkFtZXJpY2FuIE9ubGluZTwvcD4KICAgICAgICAgICAgPHAgY2xhc3M9InBhZ2VpbnB1dCI+CgkJPGxhYmVsPgogICAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPSJ7JG9wZW5pZGpxdWVyeXBsdWdpbl9wYXRofS9pbWFnZXMvYW9sVy5wbmciIGFsdD0iQU9MIiAvPgogICAgICAgICAgICAgICAgICAgIHskaW5wdXRfYW9sfQogICAgICAgICAgICAgICAgICAgIGVuYWJsZWQKICAgICAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICAgICAgICA8L3A+CiAgICAgICAgICAgIDwvZGl2PgoJPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KICAgICAgICAgICAgPHAgY2xhc3M9InBhZ2V0ZXh0Ij5NeU9wZW5JRDwvcD4KICAgICAgICAgICAgPHAgY2xhc3M9InBhZ2VpbnB1dCI+CiAgICAgICAgICAgIDxsYWJlbD4KICAgICAgICAgICAgICAgIDxpbWcgc3JjPSJ7JG9wZW5pZGpxdWVyeXBsdWdpbl9wYXRofS9pbWFnZXMvbXlvcGVuaWRXLnBuZyIgYWx0PSJNeU9wZW5JRCIgLz57JGlucHV0X215b3BlbmlkfQogICAgICAgICAgICAgICAgZW5hYmxlZAogICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICAgICAgPC9wPgogICAgICAgIDwvZGl2PgoJPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KICAgICAgICAgICAgPHAgY2xhc3M9InBhZ2V0ZXh0Ij5GbGlja3I8L3A+CiAgICAgICAgICAgIDxwIGNsYXNzPSJwYWdlaW5wdXQiPgogICAgICAgICAgICA8bGFiZWw+CiAgICAgICAgICAgICAgICA8aW1nIHNyYz0ieyRvcGVuaWRqcXVlcnlwbHVnaW5fcGF0aH0vaW1hZ2VzL2ZsaWNrclcucG5nIiBhbHQ9IkZsaWNrciIgLz4mbmJzcDt7JGlucHV0X2ZsaWNrcn0KICAgICAgICAgICAgICAgIGVuYWJsZWQKICAgICAgICAgICAgPC9sYWJlbD4KICAgICAgICAgICAgICAgIDwvcD4KICAgICAgICA8L2Rpdj4KCTxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CiAgICAgICAgICAgIDxwIGNsYXNzPSJwYWdldGV4dCI+TXlzcGFjZTwvcD4KICAgICAgICAgICAgPHAgY2xhc3M9InBhZ2VpbnB1dCI+CiAgICAgICAgICAgIDxsYWJlbD4KICAgICAgICAgICAgICAgIDxpbWcgc3JjPSJ7JG9wZW5pZGpxdWVyeXBsdWdpbl9wYXRofS9pbWFnZXMvbXlzcGFjZVcucG5nIiBhbHQ9Ik15c3BhY2UiIC8+Jm5ic3A7eyRpbnB1dF9teXNwYWNlfQogICAgICAgICAgICAgICAgZW5hYmxlZAogICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICAgICAgPC9wPgogICAgICAgIDwvZGl2PgoJPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KICAgICAgICAgICAgPHAgY2xhc3M9InBhZ2V0ZXh0Ij5GYWNlYm9vazwvcD4KICAgICAgICAgICAgPHAgY2xhc3M9InBhZ2VpbnB1dCI+CiAgICAgICAgICAgIDxsYWJlbD4KICAgICAgICAgICAgICAgIDxpbWcgc3JjPSJ7JG9wZW5pZGpxdWVyeXBsdWdpbl9wYXRofS9pbWFnZXMvZmFjZWJvb2tXLnBuZyIgYWx0PSJGYWNlYm9vayIgLz4mbmJzcDt7JGlucHV0X2ZhY2Vib29rfQogICAgICAgICAgICAgICAgZW5hYmxlZAogICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICA8L3A+CiAgICAgICAgICAgIDxwIGNsYXNzPSJwYWdlaW5wdXQiPgogICAgICAgICAgICBCZWZvcmUgZW5hYmxpbmcgRmFjZWJvb2sgYXMgaWRlbnRpdHkgcHJvdmlkZXIgeW91IG11c3QgcmVnaXN0ZXIgeW91ciBhcHBsaWNhdGlvbiBhbmQgY29uZmlndXJlIHRoZSBBUEkga2V5cyBvbiB0aGUgc2V0dGluZ3MgdGFiLgogICAgICAgICAgICA8L3A+CiAgICAgICAgPC9kaXY+Cgk8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgogICAgICAgICAgICA8cCBjbGFzcz0icGFnZXRleHQiPlRlY2hub3JhdGk8L3A+CiAgICAgICAgICAgIDxwIGNsYXNzPSJwYWdlaW5wdXQiPgogICAgICAgICAgICA8bGFiZWw+CiAgICAgICAgICAgICAgICA8aW1nIHNyYz0ieyRvcGVuaWRqcXVlcnlwbHVnaW5fcGF0aH0vaW1hZ2VzL3RlY2hub3JhdGkucG5nIiBhbHQ9IlRlY2hub3JhdGkiIC8+Jm5ic3A7eyRpbnB1dF90ZWNobm9yYXRpfQogICAgICAgICAgICAgICAgZW5hYmxlZAogICAgICAgICAgICA8L2xhYmVsPgogICAgICAgIDwvZGl2PgoJPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KICAgICAgICAgICAgPHAgY2xhc3M9InBhZ2V0ZXh0Ij5Xb3JkcHJlc3M8L3A+CiAgICAgICAgICAgIDxwIGNsYXNzPSJwYWdlaW5wdXQiPgogICAgICAgICAgICA8bGFiZWw+CiAgICAgICAgICAgICAgICA8aW1nIHNyYz0ieyRvcGVuaWRqcXVlcnlwbHVnaW5fcGF0aH0vaW1hZ2VzL3dvcmRwcmVzcy5wbmciIGFsdD0iV29yZHByZXNzIiAvPiZuYnNwO3skaW5wdXRfd29yZHByZXNzfQogICAgICAgICAgICAgICAgZW5hYmxlZAogICAgICAgICAgICA8L2xhYmVsPgogICAgICAgIDwvZGl2PgoJPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KICAgICAgICAgICAgPHAgY2xhc3M9InBhZ2V0ZXh0Ij5CbG9nZ2VyPC9wPgogICAgICAgICAgICA8cCBjbGFzcz0icGFnZWlucHV0Ij4KICAgICAgICAgICAgPGxhYmVsPgogICAgICAgICAgICAgICAgPGltZyBzcmM9Inskb3BlbmlkanF1ZXJ5cGx1Z2luX3BhdGh9L2ltYWdlcy9ibG9nZ2VyLnBuZyIgYWx0PSJCbG9nZ2VyIiAvPiZuYnNwO3skaW5wdXRfYmxvZ2dlcn0KICAgICAgICAgICAgICAgIGVuYWJsZWQKICAgICAgICAgICAgPC9sYWJlbD4KICAgICAgICA8L2Rpdj4KCTxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CiAgICAgICAgICAgIDxwIGNsYXNzPSJwYWdldGV4dCI+TGl2ZWpvdXJuYWw8L3A+CiAgICAgICAgICAgIDxwIGNsYXNzPSJwYWdlaW5wdXQiPgogICAgICAgICAgICA8bGFiZWw+CiAgICAgICAgICAgICAgICA8aW1nIHNyYz0ieyRvcGVuaWRqcXVlcnlwbHVnaW5fcGF0aH0vaW1hZ2VzL2xpdmVqb3VybmFsLnBuZyIgYWx0PSJMaXZlam91cm5hbCIgLz4mbmJzcDt7JGlucHV0X2Jsb2dnZXJ9CiAgICAgICAgICAgICAgICBlbmFibGVkCiAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgPC9kaXY+Cgk8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgogICAgICAgICAgICA8cCBjbGFzcz0icGFnZXRleHQiPkNsYWltSUQ8L3A+CiAgICAgICAgICAgIDxwIGNsYXNzPSJwYWdlaW5wdXQiPgogICAgICAgICAgICA8bGFiZWw+CiAgICAgICAgICAgICAgICA8aW1nIHNyYz0ieyRvcGVuaWRqcXVlcnlwbHVnaW5fcGF0aH0vaW1hZ2VzL2NsYWltaWQucG5nIiBhbHQ9IkNsYWltSUQiIC8+Jm5ic3A7eyRpbnB1dF9jbGFpbWlkfQogICAgICAgICAgICAgICAgZW5hYmxlZAogICAgICAgICAgICA8L2xhYmVsPgogICAgICAgIDwvZGl2PgoJPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KICAgICAgICAgICAgPHAgY2xhc3M9InBhZ2V0ZXh0Ij5WaWRvb3A8L3A+CiAgICAgICAgICAgIDxwIGNsYXNzPSJwYWdlaW5wdXQiPgogICAgICAgICAgICA8bGFiZWw+CiAgICAgICAgICAgICAgICA8aW1nIHNyYz0ieyRvcGVuaWRqcXVlcnlwbHVnaW5fcGF0aH0vaW1hZ2VzL3ZpZG9vcC5wbmciIGFsdD0iVmlkb29wIiAvPiZuYnNwO3skaW5wdXRfdmlkb29wfQogICAgICAgICAgICAgICAgZW5hYmxlZAogICAgICAgICAgICA8L2xhYmVsPgogICAgICAgIDwvZGl2PgoJPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KICAgICAgICAgICAgPHAgY2xhc3M9InBhZ2V0ZXh0Ij5WZXJpc2lnbjwvcD4KICAgICAgICAgICAgPHAgY2xhc3M9InBhZ2VpbnB1dCI+CiAgICAgICAgICAgIDxsYWJlbD4KICAgICAgICAgICAgICAgIDxpbWcgc3JjPSJ7JG9wZW5pZGpxdWVyeXBsdWdpbl9wYXRofS9pbWFnZXMvdmVyaXNpZ24ucG5nIiBhbHQ9IlZlcmlzaWduIiAvPiZuYnNwO3skaW5wdXRfdmVyaXNpZ259CiAgICAgICAgICAgICAgICBlbmFibGVkCiAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgPC9kaXY+Cgo8L2ZpZWxkc2V0PgoKCTxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CgkJPHAgY2xhc3M9InBhZ2V0ZXh0Ij4mbmJzcDs8L3A+CgkJPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRoaWRkZW59eyRzdWJtaXR9eyRjYW5jZWx9PC9wPgoJPC9kaXY+Cgp7JGVuZGZvcm19]]></data>
	</file>
	<file>
	  <filename>/templates/admin_tab_settings.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[CntpZiBpc3NldCgkbWVzc2FnZSkgfTxwPnskbWVzc2FnZX08L3A+ey9pZn0KeyRzdGFydGZvcm19CjxmaWVsZHNldD4KPGxlZ2VuZD5PcGVuSUQgbGlicmFyeSBzZXR0aW5nczo8L2xlZ2VuZD4KCTxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CiAgICAgICAgICAgIDxwIGNsYXNzPSJwYWdldGV4dCI+QnVnZ3kgR01QIHN1cHBvcnQ8L3A+CiAgICAgICAgICAgIDxwIGNsYXNzPSJwYWdlaW5wdXQiPgoJCTxsYWJlbD4KICAgICAgICAgICAgICAgICAgICA8c3Ryb25nPnskYnVnZ3lfZ21wX3N0YXR1c308L3N0cm9uZz4KICAgICAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICAgICAgICA8L3A+CiAgICAgICAgICAgIDxwIGNsYXNzPSJwYWdlaW5wdXQiPgogICAgICAgICAgICBGcm9tIHRoZSBPcGVuSUQgUEhQIGxpYnJhcnkgcmVhZG1lLWZpbGU6PGJyLz48aT5JbiBzb21lIGNhc2VzLCBidWdzIGluIHRoZSBHTVAgbWF0aCBsaWJyYXJ5IHdpbGwgcmVzdWx0IGluIHNpZ25hdHVyZQp2YWxpZGF0aW9uIGVycm9ycyB3aGVuIHVzaW5nIHRoaXMgbGlicmFyeS4gU2luY2UgR01QIGlzIHByZWZlcnJlZApvdmVyIGJjbWF0aCAoZm9yIHBlcmZvcm1hbmNlKSwgeW91IHdpbGwgaGF2ZSB0byBkZWZpbmUKQXV0aF9PcGVuSURfQlVHR1lfR01QIGluIHlvdXIgYXBwbGljYXRpb24gKmJlZm9yZSogaW1wb3J0aW5nIGFueSBvZgp0aGUgbGlicmFyeSBjb2RlPC9pPjwvcD4KICAgICAgICAgICAgPHAgY2xhc3M9InBhZ2VpbnB1dCI+CiAgICAgICAgICAgICAgICBFbmFibGUgdGhpcyBvcHRpb24gYnkgc2V0dGluZyA8aT5vcGVuaWQuYnVnZ3kuZ21wPC9pPiB0byBUUlVFIGluIGNvbmZpZy5waHAKICAgICAgICAgICAgPC9wPgoJPC9kaXY+Cgk8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgogICAgICAgICAgICA8cCBjbGFzcz0icGFnZXRleHQiPlJhbmRvbSBudW1iZXIgc291cmNlPC9wPgogICAgICAgICAgICA8cCBjbGFzcz0icGFnZWlucHV0Ij4KCQk8bGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPHN0cm9uZz57JGluc2VjdXJlX3JhbmRfc3RhdHVzfTwvc3Ryb25nPgogICAgICAgICAgICAgICAgPC9sYWJlbD48YnIvPgogICAgICAgICAgICA8L3A+CiAgICAgICAgICAgIDxwIGNsYXNzPSJwYWdlaW5wdXQiPgogICAgICAgICAgICBGcm9tIHRoZSBPcGVuSUQgUEhQIGxpYnJhcnkgcmVhZG1lLWZpbGU6PGJyLz48aT5PbiBzb21lIHN5c3RlbXMsIFBIUCBiYXNlZGlyIHJlc3RyaWN0aW9ucyBwcmV2ZW50IHdlYiBzZXJ2ZXJzIGZyb20Kb3BlbmluZyBhIHNvdXJjZSBvZiByYW5kb21uZXNzLCBzdWNoIGFzIC9kZXYvdXJhbmRvbS4gIElmIHlvdXIgUEhQCk9wZW5JRCBsaWJyYXJ5IGhhcyB0cm91YmxlIGdldHRpbmcgYSBzYXRpc2ZhY3Rvcnkgc291cmNlIG9mCnJhbmRvbW5lc3MsIGNoZWNrIHlvdXIgQXBhY2hlIGFuZCBQSFAgY29uZmlndXJhdGlvbnMgdG8gYmUgc3VyZSB0aGF0CnRoZSByYW5kb21uZXNzIHNvdXJjZSBpcyBpbiB0aGUgbGlzdCBvZiBhbGxvd2VkIHBhdGhzIGZvciB0aGUKIm9wZW5fYmFzZWRpciIgb3B0aW9uPC9pPjxici8+CiAgICAgICAgICAgIEVuYWJsaW5nIHRoaXMgb3B0aW9uIHdpbGwgc2V0IHRoZSByYW5kb20gc291cmNlIHRvIG51bGwsIGZvcmNpbmcgdGhlIE9wZW5JRCBsaWJyYXJ5IHRvIGZhbGxiYWNrIHRvIGEgcHNldWRvcmFuZG9tIG51bWJlciBzb3VyY2UuPC9wPgogICAgICAgICAgICA8cCBjbGFzcz0icGFnZWlucHV0Ij4KICAgICAgICAgICAgICAgIEVuYWJsZSB0aGlzIG9wdGlvbiBieSBzZXR0aW5nIDxpPm9wZW5pZC5pbnNlY3VyZS5yYW5kPC9pPiB0byBUUlVFIGluIGNvbmZpZy5waHAKICAgICAgICAgICAgPC9wPgoJPC9kaXY+Cgk8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgogICAgICAgICAgICAgPHAgY2xhc3M9InBhZ2V0ZXh0Ij5Sb290IENBIGNlcnRpZmljYXRlIGZpbGU8L3A+CiAgICAgICAgICAgIDxwIGNsYXNzPSJwYWdlaW5wdXQiPgoJCTxsYWJlbD4KICAgICAgICAgICAgICAgICAgICA8c3Ryb25nPnskY2FfZmlsZV9vdmVycmlkZV9zdGF0dXN9PC9zdHJvbmc+CiAgICAgICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICA8L3A+CiAgICAgICAgICAgIDxwIGNsYXNzPSJwYWdlaW5wdXQiPgogICAgICAgICAgICBTeXN0ZW1zIHVzaW5nIG9sZGVyIHZlcnNpb25zIG9mIGN1cmwgY2Fubm90IHZlcmlmeSBzb21lIHByb3ZpZGVycyB3aGVuIGNvbm5lY3RpbmcgdG8gdGhlbSB1c2luZyBodHRwcyBzaW5jZSB0aGUKICAgICAgICAgICAgcm9vdCBjZXJ0aWZpY2F0ZSBmaWxlIGJ1bmRsZWQgd2l0aCBjdXJsIGRvZXMgbm90IGNvbnRhaW4gdGhlIHJvb3QgY2VydGlmaWNhdGUgZm9yIHRoZSBodHRwcyBjZXJ0aWZpY2F0ZSB0aGF0IHRoZSBwcm92aWRlciBpcyB1c2luZy4KICAgICAgICAgICAgPGJyLz4KICAgICAgICAgICAgQmVmb3JlIGVuYWJsaW5nIHRoaXMgb3B0aW9uIHlvdSdsbCBoYXZlIHRvIGRvd25sb2FkIGNhY2VydC5wZW0gZnJvbSA8YSBocmVmPSJodHRwOi8vY3VybC5oYXh4LnNlL2RvY3MvY2FleHRyYWN0Lmh0bWwiPnRoZSBjdXJsIHNpdGU8L2E+IGFuZCBwbGFjZSBpbiAvbW9kdWxlcy9PcGVuSUQvCiAgICAgICAgICAgIDwvcD4KICAgICAgICAgICAgPHAgY2xhc3M9InBhZ2VpbnB1dCI+CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgPC9wPgoJPC9kaXY+CjwvZmllbGRzZXQ+CjxmaWVsZHNldD4KPGxlZ2VuZD5GYWNlYm9vazo8L2xlZ2VuZD4KCTxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CiAgICAgICAgICAgIDxwIGNsYXNzPSJwYWdldGV4dCI+QXBwbGljYXRpb24gSUQ8L3A+CiAgICAgICAgICAgIDxwIGNsYXNzPSJwYWdlaW5wdXQiPgoJCTxsYWJlbD4KICAgICAgICAgICAgICAgICAgICB7JGlucHV0X2ZhY2Vib29rX2FwcF9pZH0KICAgICAgICAgICAgICAgIDwvbGFiZWw+PGJyLz4KICAgICAgICAgICAgPC9wPgogICAgICAgICAgICA8cCBjbGFzcz0icGFnZWlucHV0Ij4KICAgICAgICAgICAgVGhlIGFwcGxpY2F0aW9uIElEIGlzIHRoZSB1bmlxdWUgSUQgdGhhdCBpZGVudGlmaWVzIHlvdXIgYXBwbGljYXRpb24gd2hlbiBsb2dnaW5nIGluIHVzaW5nIEZhY2Vib29rLiBHZXQgaXQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5mYWNlYm9vay5jb20vZGV2ZWxvcGVycy8iIHRhcmdldD0iX2JsYW5rIj5GYWNlYm9vayBEZXZlbG9wZXJzPC9hPgogICAgICAgICAgICA8L3A+Cgk8L2Rpdj4KCTxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CiAgICAgICAgICAgIDxwIGNsYXNzPSJwYWdldGV4dCI+QXBwbGljYXRpb24gc2VjcmV0PC9wPgogICAgICAgICAgICA8cCBjbGFzcz0icGFnZWlucHV0Ij4KCQk8bGFiZWw+CiAgICAgICAgICAgICAgICAgICAgeyRpbnB1dF9mYWNlYm9va19hcHBfc2VjcmV0fQogICAgICAgICAgICAgICAgPC9sYWJlbD48YnIvPgogICAgICAgICAgICA8L3A+CiAgICAgICAgICAgIDxwIGNsYXNzPSJwYWdlaW5wdXQiPgogICAgICAgICAgICBUaGUgYXBwbGljYXRpb24gc2VjcmV0IGlzIGEgdmFsdWUgdGhhdCBpcyBrbm93biBvbmx5IGJ5IHlvdSBhbmQgRmFjZWJvb2suCiAgICAgICAgICAgIFRoaXMgbWFrZXMgaXQgcG9zc2libGUgdG8gZ2VuZXJhdGUgY2hlY2tzdW1zIHRoYXQgYm90aCB5b3UgYW5kIEZhY2Vib29rIGNhbiB2YWxpZGF0ZS4KICAgICAgICAgICAgWW91IGdldCBpdCBhdCB0aGUgc2FtZSB0aW1lIGFzIHRoZSBhcHBsaWNhdGlvbiBJRC4KICAgICAgICAgICAgPC9wPgoJPC9kaXY+CjwvZmllbGRzZXQ+CjxmaWVsZHNldD4KPGxlZ2VuZD5EZWJ1Z2dpbmc6PC9sZWdlbmQ+Cgk8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgogICAgICAgICAgICA8cCBjbGFzcz0icGFnZWlucHV0Ij4KCQk8bGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPHN0cm9uZz57JGRlYnVnX3N0YXR1c308L3N0cm9uZz4KICAgICAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICAgICAgICA8L3A+CiAgICAgICAgICAgICAgICA8cCBjbGFzcz0icGFnZWlucHV0Ij4KICAgICAgICAgICAgICAgICAgICBFbmFibGUgZGVidWdnaW5nIGJ5IHNldHRpbmcgPGk+b3BlbmlkLmRlYnVnPC9pPiB0byBUUlVFIGluIGNvbmZpZy5waHAKICAgICAgICAgICAgICAgIDwvcD4KCTwvZGl2Pgo8L2ZpZWxkc2V0PgoKCTxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CgkJPHAgY2xhc3M9InBhZ2V0ZXh0Ij4mbmJzcDs8L3A+CgkJPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRoaWRkZW59eyRzdWJtaXR9eyRjYW5jZWx9PC9wPgoJPC9kaXY+CnskZW5kZm9ybX0=]]></data>
	</file>
	<file>
	  <filename>/templates/admin_tab_users.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[CjxoMT5Vc2VyczwvaDE+]]></data>
	</file>
	<file>
	  <filename>/templates/list_providers.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGgxPlJlZ2lzdGVyZWQgcHJvdmlkZXJzPC9oMT4KPHA+CiAgICBUaGUgZm9sbG93aW5nIE9wZW5JRCBwcm92aWRlcnMgaGF2ZSBiZWVuIGFzc29jaWF0ZWQgd2l0aCB5b3VyIGFjY291bnQuCiAgICBZb3UgY2FuIHVzZSBhbnkgb25lIHRvIGxvZyBpbiB0byB0aGlzIHNpdGUuCjwvcD4KPHA+Cjx1bD4KICAgIHtmb3JlYWNoIGZyb209JG1vZC0+R2V0UmVnaXN0ZXJlZE9wZW5JRHMoKSBpdGVtPW9wZW5pZH0KICAgICAgICA8bGkgY2xhc3M9Inskb3BlbmlkLnByb3ZpZGVyfSBQcm92aWRlciI+eyRvcGVuaWQub3BlbmlkX2lkZW50aXR5fTxici8+e2lmICRvcGVuaWQuZW1haWx9RS1tYWlsIDogeyRvcGVuaWQuZW1haWx9e2Vsc2V9Jm5ic3A7ey9lbHNlfXsvaWZ9PC9saT4KICAgIHsvZm9yZWFjaH0KPC91bD4KPC9wPgo8aDE+QWRkIG9yIHVwZGF0ZSBwcm92aWRlcjwvaDE+CjxwPgogICAgU2VsZWN0IGEgcHJvdmlkZXIgaW4gdGhlIGZvcm0gYW5kIGNvbXBsZXRlIHRoZSBzaWduaW4gcHJvY2Vzcy4gSWYgc3VjY2Vzc2Z1bAogICAgdGhlIHByb3ZpZGVyIHdpbGwgYmUgYWRkZWQgdG8geW91ciBsaXN0IG9mIHJlZ2lzdGVyZWQgcHJvdmlkZXJzLiBJZiB5b3UndmUKICAgIGFscmVhZHkgZ290IGFub3RoZXIgaWQgcmVnaXN0ZXJlZCB3aXRoIHRoZSBzYW1lIHByb3ZpZGVyIHRoYXQgSUQgd2lsbCBiZQogICAgcmVwbGFjZWQuCjwvcD4Ke2luY2x1ZGUgZmlsZT0kcm9vdF9wYXRofGNhdDonL21vZHVsZXMvT3BlbklEL3RlbXBsYXRlcy9sb2dpbl9mb3JtLnRwbCd9Cg==]]></data>
	</file>
	<file>
	  <filename>/templates/login_form.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCEtLSBUT0RPIEluY2x1ZGUgaW4gYSBiZXR0ZXIgd2F5IC0tPg0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0ibW9kdWxlcy9PcGVuSUQvc2NyaXB0cy9qcXVlcnkubWluLmpzIj48L3NjcmlwdD4NCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Inskb3BlbmlkanF1ZXJ5cGx1Z2luX3BhdGh9L2pxdWVyeS5vcGVuaWQuanMiPjwvc2NyaXB0Pg0KPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgbWVkaWE9ImFsbCIgaHJlZj0ieyRvcGVuaWRqcXVlcnlwbHVnaW5fcGF0aH0vb3BlbmlkLmNzcyIgLz4NCjxkaXYgaWQ9Im9wZW5pZCI+DQp7JHN0YXJ0Zm9ybX0NCiAgPGRpdj48dWwgY2xhc3M9InByb3ZpZGVycyI+DQogIDxsaSBjbGFzcz0ib3BlbmlkIiB0aXRsZT0iT3BlbklEIj48aW1nIHNyYz0ieyRvcGVuaWRqcXVlcnlwbHVnaW5fcGF0aH0vaW1hZ2VzL29wZW5pZFcucG5nIiBhbHQ9Imljb24iIC8+DQogIDxzcGFuPjxzdHJvbmc+aHR0cDovL3tsaXRlcmFsfXt5b3VyLW9wZW5pZC11cmx9ey9saXRlcmFsfTwvc3Ryb25nPjwvc3Bhbj48L2xpPg0KICB7aWYgJE9wZW5JRC0+RGlzcGxheVByb3ZpZGVyKCdnb29nbGUnKX0NCiAgPGxpIGNsYXNzPSJkaXJlY3QiIHRpdGxlPSJHb29nbGUiPg0KCQk8aW1nIHNyYz0ieyRvcGVuaWRqcXVlcnlwbHVnaW5fcGF0aH0vaW1hZ2VzL2dvb2dsZVcucG5nIiBhbHQ9Imljb24iIC8+PHNwYW4+aHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9hY2NvdW50cy9vOC9pZDwvc3Bhbj48L2xpPg0KICB7L2lmfQ0KICAge2lmICRPcGVuSUQtPkRpc3BsYXlQcm92aWRlcigneWFob28nKX0NCiAgPGxpIGNsYXNzPSJkaXJlY3QiIHRpdGxlPSJZYWhvbyI+DQoJCTxpbWcgc3JjPSJ7JG9wZW5pZGpxdWVyeXBsdWdpbl9wYXRofS9pbWFnZXMveWFob29XLnBuZyIgYWx0PSJpY29uIiAvPjxzcGFuPmh0dHBzOi8veWFob28uY29tLzwvc3Bhbj48L2xpPg0KICB7L2lmfQ0KICAge2lmICRPcGVuSUQtPkRpc3BsYXlQcm92aWRlcignYW9sJyl9DQogIDxsaSBjbGFzcz0idXNlcm5hbWUiIHRpdGxlPSJBT0wgc2NyZWVuIG5hbWUiPg0KCQk8aW1nIHNyYz0ieyRvcGVuaWRqcXVlcnlwbHVnaW5fcGF0aH0vaW1hZ2VzL2FvbFcucG5nIiBhbHQ9Imljb24iIC8+PHNwYW4+aHR0cDovL29wZW5pZC5hb2wuY29tLzxzdHJvbmc+dXNlcm5hbWU8L3N0cm9uZz48L3NwYW4+PC9saT4NCiAgICB7L2lmfQ0KICAge2lmICRPcGVuSUQtPkRpc3BsYXlQcm92aWRlcignbXlvcGVuaWQnKX0NCiAgPGxpIGNsYXNzPSJ1c2VybmFtZSIgdGl0bGU9Ik15T3BlbklEIHVzZXIgbmFtZSI+DQoJCTxpbWcgc3JjPSJ7JG9wZW5pZGpxdWVyeXBsdWdpbl9wYXRofS9pbWFnZXMvbXlvcGVuaWRXLnBuZyIgYWx0PSJpY29uIiAvPjxzcGFuPmh0dHA6Ly88c3Ryb25nPnVzZXJuYW1lPC9zdHJvbmc+Lm15b3BlbmlkLmNvbS88L3NwYW4+PC9saT4NCiAgICB7L2lmfQ0KICAgICB7aWYgJE9wZW5JRC0+RGlzcGxheVByb3ZpZGVyKCdteXNwYWNlJyl9DQogIDxsaSBjbGFzcz0idXNlcm5hbWUiIHRpdGxlPSJNeXNwYWNlIHVzZXIgbmFtZSI+DQoJCTxpbWcgc3JjPSJ7JG9wZW5pZGpxdWVyeXBsdWdpbl9wYXRofS9pbWFnZXMvbXlzcGFjZVcucG5nIiBhbHQ9Imljb24iIC8+PHNwYW4+aHR0cDovL3d3dy5teXNwYWNlLmNvbS88c3Ryb25nPnVzZXJuYW1lPC9zdHJvbmc+PC9zcGFuPjwvbGk+DQogICAgey9pZn0NCiAgICAgICB7aWYgJE9wZW5JRC0+RGlzcGxheVByb3ZpZGVyKCdmYWNlYm9vaycpfQ0KICA8bGkgY2xhc3M9IiIgdGl0bGU9IkZhY2Vib29rIHVzZXJuYW1lIj4NCiAgICAgIDxhIGhyZWY9InskZmFjZWJvb2tMb2dpblVybH0iPjxpbWcgc3JjPSJ7JG9wZW5pZGpxdWVyeXBsdWdpbl9wYXRofS9pbWFnZXMvZmFjZWJvb2tXLnBuZyIgYWx0PSJpY29uIiAvPjwvYT48c3Bhbj57JGZhY2Vib29rTG9naW5Vcmx9PHN0cm9uZz51c2VybmFtZTwvc3Ryb25nPjwvc3Bhbj48L2xpPg0KICAgIHsvaWZ9DQogICB7aWYgJE9wZW5JRC0+RGlzcGxheVByb3ZpZGVyKCdmbGlja3InKX0NCiAgPGxpIGNsYXNzPSJ1c2VybmFtZSIgdGl0bGU9IkZsaWNrciB1c2VyIG5hbWUiPg0KCQk8aW1nIHNyYz0ieyRvcGVuaWRqcXVlcnlwbHVnaW5fcGF0aH0vaW1hZ2VzL2ZsaWNrci5wbmciIGFsdD0iaWNvbiIgLz48c3Bhbj5odHRwOi8vZmxpY2tyLmNvbS88c3Ryb25nPnVzZXJuYW1lPC9zdHJvbmc+Lzwvc3Bhbj48L2xpPg0KICB7L2lmfQ0KICAge2lmICRPcGVuSUQtPkRpc3BsYXlQcm92aWRlcigndGVjaG5vcmF0aScpfQ0KICA8bGkgY2xhc3M9InVzZXJuYW1lIiB0aXRsZT0iVGVjaG5vcmF0aSB1c2VyIG5hbWUiPg0KCQk8aW1nIHNyYz0ieyRvcGVuaWRqcXVlcnlwbHVnaW5fcGF0aH0vaW1hZ2VzL3RlY2hub3JhdGkucG5nIiBhbHQ9Imljb24iIC8+PHNwYW4+aHR0cDovL3RlY2hub3JhdGkuY29tL3Blb3BsZS90ZWNobm9yYXRpLzxzdHJvbmc+dXNlcm5hbWU8L3N0cm9uZz4vPC9zcGFuPjwvbGk+DQogICB7L2lmfQ0KICAge2lmICRPcGVuSUQtPkRpc3BsYXlQcm92aWRlcignd29yZHByZXNzJyl9DQogIDxsaSBjbGFzcz0idXNlcm5hbWUiIHRpdGxlPSJXb3JkcHJlc3MgYmxvZyBuYW1lIj4NCgkJPGltZyBzcmM9Inskb3BlbmlkanF1ZXJ5cGx1Z2luX3BhdGh9L2ltYWdlcy93b3JkcHJlc3MucG5nIiBhbHQ9Imljb24iIC8+PHNwYW4+aHR0cDovLzxzdHJvbmc+dXNlcm5hbWU8L3N0cm9uZz4ud29yZHByZXNzLmNvbTwvc3Bhbj48L2xpPg0KICAgIHsvaWZ9DQogICB7aWYgJE9wZW5JRC0+RGlzcGxheVByb3ZpZGVyKCdibG9nZ2VyJyl9DQogIDxsaSBjbGFzcz0idXNlcm5hbWUiIHRpdGxlPSJCbG9nZ2VyIGJsb2cgbmFtZSI+DQoJCTxpbWcgc3JjPSJ7JG9wZW5pZGpxdWVyeXBsdWdpbl9wYXRofS9pbWFnZXMvYmxvZ2dlci5wbmciIGFsdD0iaWNvbiIgLz48c3Bhbj5odHRwOi8vPHN0cm9uZz51c2VybmFtZTwvc3Ryb25nPi5ibG9nc3BvdC5jb20vPC9zcGFuPjwvbGk+DQogICAgey9pZn0NCiAgIHtpZiAkT3BlbklELT5EaXNwbGF5UHJvdmlkZXIoJ2xpdmVqb3VybmFsJyl9DQogIDxsaSBjbGFzcz0idXNlcm5hbWUiIHRpdGxlPSJMaXZlSm91cm5hbCBibG9nIG5hbWUiPg0KCQk8aW1nIHNyYz0ieyRvcGVuaWRqcXVlcnlwbHVnaW5fcGF0aH0vaW1hZ2VzL2xpdmVqb3VybmFsLnBuZyIgYWx0PSJpY29uIiAvPjxzcGFuPmh0dHA6Ly88c3Ryb25nPnVzZXJuYW1lPC9zdHJvbmc+LmxpdmVqb3VybmFsLmNvbTwvc3Bhbj48L2xpPg0KICAgIHsvaWZ9DQogICB7aWYgJE9wZW5JRC0+RGlzcGxheVByb3ZpZGVyKCdjbGFpbWlkJyl9DQogIDxsaSBjbGFzcz0idXNlcm5hbWUiIHRpdGxlPSJDbGFpbUlEIHVzZXIgbmFtZSI+DQoJCTxpbWcgc3JjPSJ7JG9wZW5pZGpxdWVyeXBsdWdpbl9wYXRofS9pbWFnZXMvY2xhaW1pZC5wbmciIGFsdD0iaWNvbiIgLz48c3Bhbj5odHRwOi8vY2xhaW1pZC5jb20vPHN0cm9uZz51c2VybmFtZTwvc3Ryb25nPjwvc3Bhbj48L2xpPg0KICAgIHsvaWZ9DQogICB7aWYgJE9wZW5JRC0+RGlzcGxheVByb3ZpZGVyKCd2aWRvb3AnKX0NCiAgPGxpIGNsYXNzPSJ1c2VybmFtZSIgdGl0bGU9IlZpZG9vcCB1c2VyIG5hbWUiPg0KCQk8aW1nIHNyYz0ieyRvcGVuaWRqcXVlcnlwbHVnaW5fcGF0aH0vaW1hZ2VzL3ZpZG9vcC5wbmciIGFsdD0iaWNvbiIgLz48c3Bhbj5odHRwOi8vPHN0cm9uZz51c2VybmFtZTwvc3Ryb25nPi5teXZpZG9vcC5jb20vPC9zcGFuPjwvbGk+DQogICAgey9pZn0NCiAgIHtpZiAkT3BlbklELT5EaXNwbGF5UHJvdmlkZXIoJ3ZlcmlzaWduJyl9DQogIDxsaSBjbGFzcz0idXNlcm5hbWUiIHRpdGxlPSJWZXJpc2lnbiB1c2VyIG5hbWUiPg0KCQk8aW1nIHNyYz0ieyRvcGVuaWRqcXVlcnlwbHVnaW5fcGF0aH0vaW1hZ2VzL3ZlcmlzaWduLnBuZyIgYWx0PSJpY29uIiAvPjxzcGFuPmh0dHA6Ly88c3Ryb25nPnVzZXJuYW1lPC9zdHJvbmc+LnBpcC52ZXJpc2lnbmxhYnMuY29tLzwvc3Bhbj48L2xpPg0KICB7L2lmfQ0KICA8L3VsPjwvZGl2Pg0KICA8ZmllbGRzZXQ+DQogIDxsYWJlbCBmb3I9Im9wZW5pZF91c2VybmFtZSI+RW50ZXIgeW91ciA8c3Bhbj5Qcm92aWRlciB1c2VyIG5hbWU8L3NwYW4+PC9sYWJlbD4NCiAgPGRpdj48c3Bhbj48L3NwYW4+PGlucHV0IHR5cGU9InRleHQiIG5hbWU9Im9wZW5pZF91c2VybmFtZSIgLz48c3Bhbj48L3NwYW4+DQogIDxpbnB1dCB0eXBlPSJzdWJtaXQiIHZhbHVlPSJMb2dpbiIgLz48L2Rpdj4NCiAgPC9maWVsZHNldD4NCiAgPGZpZWxkc2V0Pg0KICA8bGFiZWwgZm9yPSJvcGVuaWRfaWRlbnRpZmllciI+RW50ZXIgeW91ciA8YSBjbGFzcz0ib3BlbmlkX2xvZ28iIGhyZWY9Imh0dHA6Ly9vcGVuaWQubmV0Ij5PcGVuSUQ8L2E+PC9sYWJlbD4NCiAgPGRpdj48aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0ib3BlbmlkX2lkZW50aWZpZXIiIC8+DQogIDxpbnB1dCB0eXBlPSJzdWJtaXQiIHZhbHVlPSJMb2dpbiIgLz48L2Rpdj4NCiAgPC9maWVsZHNldD4NCjwvZm9ybT4NCntsaXRlcmFsfQ0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPg0KICAgICQoZnVuY3Rpb24oKSB7DQogICAgICAgICQoJ2Zvcm0ub3BlbmlkJykub3BlbmlkKCk7DQogICAgfSk7DQo8L3NjcmlwdD4NCnsvbGl0ZXJhbH0NCjwvZGl2Pg==]]></data>
	</file>
	<file>
	  <filename>/templates/register_provider.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGgxPlJlZ2lzdGVyIE9wZW5JRCBwcm92aWRlcjwvaDE+CjxwPlNlbGVjdCB5b3VyIE9wZW5JRCBwcm92aWRlciBpbiB0aGUgZm9ybSBiZWxvdyBhbmQgY29tcGxldGUgdGhlIHNpZ24gaW4gcHJvY2Vzcy4KT25jZSBjb21wbGV0ZWQgeW91ciB1c2VyIGFjY291bnQgb24gdGhpcyBzaXRlIHdpbGwgYmUgYXNzb2NpYXRlZCB3aXRoIHlvdXIKT3BlbklEIHByb3ZpZGVyLiBUaGlzIG1ha2VzIGl0IHBvc3NpYmxlIGZvciB5b3UgdG8gc2lnbiBpbiB1c2luZyBPcGVuSUQgaW5zdGVhZApvZiB1c2VybmFtZSBhbmQgcGFzc3dvcmQuCjwvcD4Ke2luY2x1ZGUgZmlsZT0kcm9vdF9wYXRofGNhdDonL21vZHVsZXMvT3BlbklEL3RlbXBsYXRlcy9sb2dpbl9mb3JtLnRwbCd9Cg==]]></data>
	</file>
</module>
