<?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>NeoModule</name>
	<version>0.2.3</version>
  <mincmsversion>1.6</mincmsversion>
	<help><![CDATA[PHN0cm9uZz5Ob3RpY2UhIFRoaXMgaXMgYSBtb2R1bGUtZGV2ZWxvcGVyLW9ubHkgbW9kdWxlLiBJZiB5b3UgYXJlIG5vdCBhIGRldmVsb3Blcgp5b3UnbGwgcHJvYmFibHkganVzdCB3YW50IHRvIHNraXAgdGhlIGdvcnkgZGV0YWlscyBvZiB0aGlzIHBhZ2UgYW5kIHJlbHkgb24gdGhhdAp0aGUgbW9kdWxlIGp1c3QgZG9lcyBpdCdzIHdvcmsuPC9zdHJvbmc+CjxoMz5QdXJwb3NlIG9mIHRoZSBtb2R1bGU8L2gzPgpUaGUgcHVycG9zZSBvZiB0aGlzIG1vZHVsZSBpcyB0byBjdXQgb2ZmIG9uIGRldmVsb3BtZW50dGltZSBwcm92aWRpbmcgc29tZQplYXN5IHRvIHVzZSBmdW5jdGlvbnMgZXh0ZW5kaW5nIHRoZSBtb2R1bGUtQVBJIG9mIENNUyBNYWRlIFNpbXBsZS4gVGhpcyBpbmNsdWRlcywKYnV0IGlzIG5vIGxpbWl0ZWQgdG8sIHNob3J0Y3V0cyB0byBOZW9EYXRhU3RvcmFnZS1mdW5jaW9uYWxpdHksIGEgY291cGxlIG9mIG5pY2UKU21hcnR5LXNob3J0Y3V0cywgRmlyZVBIUC1pbnRlZ3JhdGlvbiBldGMuCjxoMz5Vc2FnZSBvZiB0aGUgbW9kdWxlPC9oMz4KVG8gdXNlIHRoaXMgZXh0ZW5kZWQgbW9kdWxlLWNsYXNzIHlvdSBzaG91bGQgaW5oZXJpdCBmcm9tIE5lb01vZHVsZS1jbGFzcyBpbnN0ZWFkCm9mIHRoZSB1c3VhbCBDTVNNb2R1bGUtY2xhc3MuIFRoaXMgY2FuIGJlIGRvbmUgbGlrZSB0aGlzOgo8cHJlPgpyZXF1aXJlX29uY2UoZGlybmFtZShkaXJuYW1lKF9fRklMRV9fKSkuIi9OZW9Nb2R1bGUvTmVvTW9kdWxlLm1vZHVsZS5waHAiKTsKY2xhc3MgTXlNb2R1bGUgZXh0ZW5kcyBOZW9Nb2R1bGUgewo8L3ByZT4KSWYgeW91IHdpc2ggdG8gdXNlIHRoZSBOZXdEYXRhU3RvcmFnZSBmdW5jdGlvbmFsaXR5LCB5b3Ugc2hvdWxkIG9mIGNvdXJzZSBhbHNvCmluc3RhbGwgdGhhdCBtb2R1bGUuCjxoMz5Ib3cgdG8gZ2V0IGhlbHA8L2gzPgpJIHdpbGwgcmVwZWF0LCB0aGlzIG1vZHVsZSBpcyBmb3IgZGV2ZWxvcGVycyBvbmx5LiBJZiB5b3UgY2Fubm90IHJlYWQgcGhwLXNvdXJjZSBjb2RlLAp5b3Ugc2hvdWxkIHVzZSBpdCBmb3IgZGV2ZWxvcG1lbnQgYW55d2F5LiBJZiB5b3UgY2FuLCBhbHdheXMgY2hlY2sgb3V0IHRoZSBjb2RlIApmb3IgaGludHMgb24gaG93IHRvIG1ha2UgaXQgd29yay4gSWYgeW91IHN0aWxsIGhhdmUgcXVlc3Rpb25zIG9yIHN1Z2dlc3Rpb25zIGZvcgpmaXhlcy9pbXByb3ZlbWVudHMsIHBsZWFzZSBmZWVsIGZyZWUgdG8gY2F0Y2ggbWUgKFNpbG1hcmlsbGlvbikgaW4gdGhlIGZvcnVtIG9nICNpcmMuCgo8aDM+TGlzdCBvZiBtZXRob2RzPC9oMz4KSSB3aWxsIHRyeSB0byBrZWVwIHRoaXMgbGlzdCB1cHRvZGF0ZSwgYnV0IGZvciBtb3N0IHJlY2VudCBsaXN0LCBwbGVhc2UKY2hlY2sgdGhlIE5lb01vZHVsZS5tb2R1bGUucGhwLWZpbGUgaXRzZWxmLiBTb21lIGRvY3VtZW50YXRpb24gb2YgdGhlIG1ldGhvZHMKbWF5IGV2ZW4gc25lYWsgaW4gdGhlcmUgc29tIGRheS4KPHByZT4KLyoKICoKICogU2V0dXAgZnVuY3Rpb25zCiAqCiAqLwoKZnVuY3Rpb24gU2V0SWQoJGlkKQpmdW5jdGlvbiBOZW9TZXRJZCgkaWQpCgoKICAvKgogICAqCiAgICogR2VuZXJhbCBzaG9ydGN1dCBmdW5jdGlvbnMKICAgKgogICAqLwpmdW5jdGlvbiBQcmVmKCRwcmVmbmFtZSwkZGVmYXVsdD0iIikKZnVuY3Rpb24gTmVvQ21zTGluaygkcGFyYW1zPWFycmF5KCkpCmZ1bmN0aW9uIE5lb0Ntc1VybCgkcGFyYW1zPWFycmF5KCkpCmZ1bmN0aW9uIE5lb1JlZGlyZWN0KCRwYXJhbXM9YXJyYXkoKSkKLyoKICoKICogRm9ybS1nZW5lcmF0aW9uIGZ1bmN0aW9ucwogKgogKi8KCmZ1bmN0aW9uIE5lb0Zvcm1TdGFydCgkcGFyYW1zPWFycmF5KCkpCmZ1bmN0aW9uIE5lb0Zvcm1FbmQoJHBhcmFtcz1hcnJheSgpKQpmdW5jdGlvbiBOZW9JbnB1dFRleHQoJHBhcmFtcz1hcnJheSgpCmZ1bmN0aW9uIE5lb1RleHRhcmVhKCRwYXJhbXM9YXJyYXkoKSkKZnVuY3Rpb24gTmVvSW5wdXRDaGVja2JveCgkcGFyYW1zPWFycmF5KCkpCmZ1bmN0aW9uIE5lb0lucHV0U3VibWl0KCRwYXJhbXM9YXJyYXkoKSkKZnVuY3Rpb24gTmVvSW5wdXRSZXNldCgkcGFyYW1zPWFycmF5KCkpCmZ1bmN0aW9uIE5lb0lucHV0SW5wdXREcm9wZG93bigkcGFyYW1zPWFycmF5KCkpCgovKiBmdW5jdGlvbiBiZWxvdyBpbmNsdWRlIHNtYXJ0eWFzc2lnbm1lbnQsIGRvZXMgbm90IHJldHVybiBhbnl0aGluZyAqLwpmdW5jdGlvbiBTbWFydHlGb3JtU3RhcnQoJHNtYXJ0eW5hbWUsJHBhcmFtcz1hcnJheSgpKQpmdW5jdGlvbiBTbWFydHlVcGxvYWRGb3JtU3RhcnQoJHNtYXJ0eW5hbWUsJHBhcmFtcz1hcnJheSgpKQpmdW5jdGlvbiBTbWFydHlGb3JtRW5kKCRzbWFydHluYW1lKQpmdW5jdGlvbiBTbWFydHlJbnB1dFN1Ym1pdCgkc21hcnR5bmFtZSwkbmFtZSwkdGV4dCwkY29uZmlybXRleHQ9IiIpCmZ1bmN0aW9uIFNtYXJ0eUlucHV0SGlkZGVuKCRzbWFydHluYW1lLCRuYW1lLCR2YWx1ZSkKZnVuY3Rpb24gU21hcnR5SW5wdXRNdWx0aUhpZGRlbigkc21hcnR5bmFtZSwkZmllbGRzPWFycmF5KCkpCgovKgogKgogKiBOZW9EYXRhU3RvcmFnZSBzaG9ydGN1dHMKICoKICovCmZ1bmN0aW9uIEFkZEVudGl0eSgkdGFibGUsICRwcm9wcz1hcnJheSgpKQpmdW5jdGlvbiBEZWxldGVFbnRpdHkoJGlkKQpmdW5jdGlvbiBHZXRFbnRpdHkoJGlkLCAkb3ZlcnJpZGVwcm9wcz1hcnJheSgpKQpmdW5jdGlvbiBHZXRFbnRpdGllcygkdGFibGU9IiIsICRjcml0ZXJpYT1hcnJheSgpLCAkYWx3YXlzcmV0dXJuYXJyYXk9ZmFsc2UpCmZ1bmN0aW9uIEdldE9uZUVudGl0eSgkdGFibGUsICRjcml0ZXJpYT1hcnJheSgpLCAkZmFpbGlmbXVsdGlwbGU9ZmFsc2UpCmZ1bmN0aW9uIEdldEVudGl0aWVzRnVsbCgkdGFibGU9IiIsICRjcml0ZXJpYT1hcnJheSgpLCAkYWx3YXlzcmV0dXJuYXJyYXk9ZmFsc2UpCmZ1bmN0aW9uIFNldEVudGl0eVByb3AoJGlkLCRwcm9wbmFtZSwkcHJvcHZhbHVlLCRwcm9wdHlwZT0idW5kZWZpbmVkIikKZnVuY3Rpb24gQ2xlYXJFbnRpdHlQcm9wKCRpZCwgJHByb3BuYW1lKQpmdW5jdGlvbiBTZXRFbnRpdHlQcm9wcygkaWQsICRwcm9wcywgJGNsZWFyPXRydWUpCmZ1bmN0aW9uIFNldEVudGl0eVByb3BzRnJvbUFycmF5KCRpZCwgJHByb3BzLCAkdmFsdWVzLCAkY2xlYXI9dHJ1ZSwgJGZpbGw9ZmFsc2UpCmZ1bmN0aW9uIFNldEVudGl0eVByb3BzT25Dcml0ZXJpYSgkdGFibGUsICRwcm9wcywgJGNyaXRlcmlhLCAkY3JlYXRlPXRydWUsICRjbGVhcj1mYWxzZSkgLy9Eb2VzIG5vdCB3b3JrCmZ1bmN0aW9uIFJlc2V0RW50aXR5UHJvcHMoJGlkLCAkbmV3cHJvcHM9YXJyYXkoKSkKZnVuY3Rpb24gUmVtb3ZlTW9kdWxlRW50aXRpZXMoKQpmdW5jdGlvbiBDbGVhckVudGl0eVByb3BzKCRpZCkKZnVuY3Rpb24gQ29tcGFyZUVudGl0aWVzKCRlbnRpdHkxLCAkZW50aXR5MiwgJHNvcnRmaWVsZCkKZnVuY3Rpb24gQ29tcGFyZUVudGl0aWVzQ29tcGxleCgkZW50aXR5MSwgJGVudGl0eTIsICRzb3J0ZmllbGRzKQpmdW5jdGlvbiBTb3J0RW50aXRpZXMoJGxpc3QsICRzb3J0ZmllbGRzKQpmdW5jdGlvbiBFbnRpdGllc0NvdW50KCR0YWJsZT0iIiwgJGNyaXRlcmlhPWFycmF5KCkpCmZ1bmN0aW9uIENsZWFyTW9kdWxlRW50aXRpZXMoKQpmdW5jdGlvbiBTZXRFbnRpdHlDb25uZWN0aW9uKCRpZDEsICRpZDIsICR0eXBlPSIiKQpmdW5jdGlvbiBDbGVhckVudGl0eUNvbm5lY3Rpb25zKCRpZDEsICRpZDI9LTEsICR0eXBlPSIiKQpmdW5jdGlvbiBDbGVhckVudGl0eUNvbm5lY3Rpb24oJGlkMSwgJGlkMiwgJHR5cGU9IiIpCmZ1bmN0aW9uIENoZWNrRW50aXR5Q29ubmVjdGlvbigkaWQxLCRpZDIsJHR5cGU9IiIsJHJldHVybnZhbHVlPXRydWUpCmZ1bmN0aW9uIEdldEVudGl0eUNvbm5lY3Rpb25zKCRpZDEsICRpZDI9LTEsICR0eXBlPSIiKQpmdW5jdGlvbiBBZGRGaWVsZFNldCgkbmFtZSwkZmllbGRzKQpmdW5jdGlvbiBHZXRGaWVsZFNldCgkbmFtZSkKZnVuY3Rpb24gRW50aXR5U2V0VW5zZXRQcm9wcygkZW50aXR5LCRmaWVsZHNldCwkZmlsbHZhbHVlPSIiKSB7CmZ1bmN0aW9uIEdldERTRXJyb3JzKCRubDJicj10cnVlLCRjbGVhcj10cnVlKQpmdW5jdGlvbiBPdXRwdXREU0Vycm9ycygkY2xlYXI9dHJ1ZSkKZnVuY3Rpb24gRFNJbkVycm9yKCkKZnVuY3Rpb24gTWFrZVNpbXBsZUFycmF5KCR0YWJsZSwkZmllbGQpCmZ1bmN0aW9uIE1ha2VBc3NvY0FycmF5KCR0YWJsZSwkZmllbGRzKQoKCi8qCiAqCiAqIExpbmsgYW5kIGljb24gZnVuY3Rpb25zCiAqCiAqLwoKZnVuY3Rpb24gTmVvRGVsZXRlSWNvbigkYWN0aW9uLCR0ZXh0LCRwYXJhbXM9YXJyYXkoKSwkY29uZmlybWF0aW9uPSIiKQpmdW5jdGlvbiBOZW9Db3B5SWNvbigkYWN0aW9uLCR0ZXh0LCRwYXJhbXM9YXJyYXkoKSwkY29uZmlybWF0aW9uPSIiKQpmdW5jdGlvbiBOZW9FZGl0SWNvbigkYWN0aW9uLCR0ZXh0LCRwYXJhbXM9YXJyYXkoKSwkY29uZmlybWF0aW9uPSIiKQpmdW5jdGlvbiBOZW9BZGRJY29uKCRhY3Rpb24sJHRleHQsJHBhcmFtcz1hcnJheSgpLCRjb25maXJtYXRpb249IiIpCmZ1bmN0aW9uIE5lb1RydWVJY29uKCRhY3Rpb24sJHRleHQsJHBhcmFtcz1hcnJheSgpLCRjb25maXJtYXRpb249IiIpCmZ1bmN0aW9uIE5lb0ZhbHNlSWNvbigkYWN0aW9uLCR0ZXh0LCRwYXJhbXM9YXJyYXkoKSwkY29uZmlybWF0aW9uPSIiKQpmdW5jdGlvbiBOZW9TeXN0ZW1JY29uKCRpY29uLCR0ZXh0PSIiKQoKLyoKICoKICogVXRpbGl0eSBmdW5jdGlvbnMKICoKICovCmZ1bmN0aW9uIE5lb1NsYXNoZXMoJHVybCkKZnVuY3Rpb24gU2xhc2goJHN0ciwkc3RyMj0iIiwkc3RyMz0iIikKZnVuY3Rpb24gU2xhc2hlcygkdXJsKQpmdW5jdGlvbiBpc19hc3NvYygkYXJyYXkpCmZ1bmN0aW9uIE5lb0Rpckxpc3QoJHJvb3QsJHdoYXQ9ImZpbGVzIiwkaW50cm9kdWN0aW9uPWFycmF5KCksJGV4Y2x1ZGVzPWFycmF5KCkpCgovKkNoZWNrcyBmb3IgdGhlIGV4aXN0ZW5jZSBvZiBhbiBpbmRleCBpbiBhbiBhcnJheSBhbmQgcmV0dXJuIHRoZSB2YWx1ZSBpZiBpdCdzIHRoZXJlCiAqYW5kIHRoZSBkZWZhdWx0IHZhbHVlIGlmIGl0J3Mgbm90CiovCmZ1bmN0aW9uIE5lb1BhcmFtVmFsdWUoJG5hbWUsJHBhcmFtcywkZGVmYXVsdD0iIikKCi8vU2hvcnRjdXQgZm9yIHRoZSBhYm92ZQpmdW5jdGlvbiBOUFYoJG5hbWUsICRwYXJhbXMpCmZ1bmN0aW9uIE5lb0FwcGx5UGFyYW1WYWx1ZXMoJHRoaXNhcnJheSwgJHBhcmFtcywgJGluZGV4ZXMsICRhbHdheXNmaWxsPWZhbHNlKQpmdW5jdGlvbiBDaGVja0ZpbGVFeHRlbnNpb24oJGZpbGVuYW1lLCAkYWxsb3dlZGV4dGVuc2lvbnM9YXJyYXkoKSkKCi8vRm9yIG5vdywgcmVhZCBzb3VyY2UgdG8gdW5kZXJzdGFuZApmdW5jdGlvbiBOZW9Ub29sVGlwKCRwYXJhbXM9YXJyYXkoKSkgLy9yZXF1aXJlcyAyIGNzcy1jbGFzc2VzIHRvIGJlIHNldCB1cAoKLy9zYW1lIGFzIHByaW50X3IsIGJ1dCB3cmFwcyBpbiA8cHJlPidzIGFuZCBpbiBhIGRpdiB0cnlpbmcgdG8gbWFrZSBpdCBtb3JlIHJlYWRhYmxlCmZ1bmN0aW9uIE5lb1ByaW50UigkZGF0YT1hcnJheSgpLCRzZW5kb3V0PXRydWUpCgovKgogKgogKiBTbWFydHkgc2hvcnRjdXRzCiAqCiAqLwpmdW5jdGlvbiBTbWFydHlBc3NpZ24oJHNtYXJ0eWluZm8sICRzbWFydHljb250ZW50PSIiKQpmdW5jdGlvbiBTbWFydHlBc3NpZ25QcmVmKCRzbWFydHluYW1lLCAkcHJlZmVyZW5jZW5hbWU9IiIpIHsKZnVuY3Rpb24gU21hcnR5QXNzaWduQ01TKCRtb2R1bGUsJHZhcm5hbWU9ImNtcyIpCmZ1bmN0aW9uIFNtYXJ0eVVwbG9hZEZvcm1TdGFydCgkc21hcnR5bmFtZSwkcGFyYW1zPWFycmF5KCkpIHsKCi8qCiAqCiAqIERlYnVnZ2luZyBmdW5jdGlvbnMKICoKICovCmZ1bmN0aW9uIEZpcmVEZWJ1ZygkY29tbWFuZCwkbWVzc2FnZT0iIiwkdmFyaWFibGVzPWFycmF5KCkpCgovKgogKgogKiBFcnJvciBoYW5kbGluZwogKgogKi8KZnVuY3Rpb24gRXJyb3IoJGVycm9ydGV4dCwkcmV0dXJudmFsdWU9ZmFsc2UsJHBhcmFtcz1hcnJheSgpKQpmdW5jdGlvbiBHZXRFcnJvcnMoJG5sMmJyPXRydWUsJGNsZWFyPXRydWUsJGluY2x1ZGVkcz10cnVlKQpmdW5jdGlvbiBPdXRwdXRFcnJvcnMoJGNsZWFyPXRydWUsJGluY2x1ZGVkcz10cnVlKQpmdW5jdGlvbiBJbkVycm9yKCkKPC9wcmU+PGgzPlBhcmFtZXRyZTwvaDM+PHVsPjxsaT48ZW0+KG9wdGlvbmFsKTwvZW0+IGxhbmc9ImVuX1VTIiAtIFBhcmFtZXRyZXQgYW5naXZlciBodmlsa2V0IHNwcm9nIGRlciBza2FsIGJydWdlcyB0aWwgdmlzbmluZyBmb3IgYmVzJm9zbGFzaDtnZW5kZS4gSWtrZSBhbGxlIG1vZHVsZXIgdW5kZXJzdCZvc2xhc2g7dHRlciBlbGxlciBiZWgmb3NsYXNoO3ZlciBkZXR0ZS48L2xpPjwvdWw+]]></help>
	<about><![CDATA[PGJyIC8+TGF2ZXQgYWY6IE1vcnRlbiBQb3Vsc2VuICZsdDttb3J0ZW5AcG91bHNlbi5vcmcmZ3Q7PGJyIC8+PGJyIC8+VmVyc2lvbjogMC4yLjM8YnIgLz48YnIgLz5IaXN0b3JpayBvdmVyICZhZWxpZztuZHJpbmdlcjo8YnIgLz48dWw+CjxsaT52ZXJzaW9uIDAuMi4zPGJyLz4KTm93IHBvc3NpYmxlIHRvIHJlZ2lzdGVyICRwYXJhbXMgZm9yIGV2ZW4gZWFzaWVyIHN5bnRheCBpbiByZWxldmFudCBmdW5jdGlvbnMgbGlrZSBOUFYKPGJyLz4KQWRkZWQgQ3JlYXRlSW5wdXRQYXNzd29yZC13cmFwcGVyCjxici8+CkFkZGVkIGZpbGwgcGFyYW1ldGVyIHRvIFNldEVudGl0eVByb3BzRnJvbUFycmF5CgoKPGxpPnZlcnNpb24gMC4yLjI8YnIvPgpBZGRlZCBhIGN1c3RvbSByZXR1cm52YWx1ZSB0byBjaGVja2VudGl0eWNvbm5lY3Rpb25zCjxici8+CkltcGxlbWVudGVkIE1ha2VTaW1wbGVBcnJheQo8YnIvPgpBZGRlZCBOZW9UcnVlSWNvbiBhbmQgIE5lb1RydWVJY29uIAoKPGxpPnZlcnNpb24gMC4yLjE8YnIvPgphZGRlZCBhcnJheV9kaWZmX2tleSBpbXBsZW1lbnRhdGlvbiBmb3IgcHJlLTUuMS4wIHZlcnNpb24KPGJyLz4KQWRkZWQgJGFsd2F5c3JldHVybmFycmF5PWZhbHNlIHRvIEdldEVudGl0aWVzKEZ1bGwpLW1ldGhvZHMKPGJyLz4KQWRkZWQgU21hcnRBc3NpZ25QcmVmLW1ldGhvZAo8YnIvPgpBZGRlZCBUb29sdGlwLVN1cHBvcnQKPGJyLz4KQWRkZWQgTmVvUmVkaXJlY3QtZnVuY3Rpb24KCiAgPGxpPnZlcnNpb24gMC4yLjA8YnIvPgotIGdlbmVyYWwgYnVnZml4aW5nPGJyLz4KLSBBZGRlZCBhIE5lb0Rpckxpc3QtZnVuY3Rpb248YnIvPgotIEZpeGVkIG5hbWUgZXJyb3Igb24gTmVvSW5wdXREcm9wZG93bjxici8+Ci0gYWRkZWQgc3VwcG9ydCBmb3IgM3JkIHBhcmFtZXRlciB0byBTbGFzaC1mdW5jdGlvbjxici8+Ci0gYWRkZWQgTmVvQ21zTGluayBhbmQgTmVvQ21zVXJsIHNob3J0Y3V0czxici8+Ci0gYWRkZWQgU21hcnR5VXBsb2FkRm9ybVN0YXJ0PGJyLz4KLSBhZGRlZCBTbWFydHlJbnB1dE11bHRpSGlkZGVuPGJyLz4KCiAgPC9saT4KICA8bGk+dmVyc2lvbiAwLjEuMDxici8+CiAgIC0gaW5pdGlhbCByZWxlYXNlPC9saT4KPC91bD48YnIgLz4=]]></about>
	<description><![CDATA[An extended module-class, mainly for the Neo-series modules, but also for others to use]]></description>
	<file>
	  <filename>/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/NeoModule.module.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKIyBOZW9Nb2R1bGUuIEFuIGV4dGVuZGVkIG1vZHVsZWNsYXNzIGZvciBDTVMgLSBDTVMgTWFkZSBTaW1wbGUKIyBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgTW9ydGVuIFBvdWxzZW4gPG1vcnRlbkBwb3Vsc2VuLm9yZz4KIwojQ01TIC0gQ01TIE1hZGUgU2ltcGxlCiMoYykyMDA0LTA5IGJ5IFRlZCBLdWxwICh3aXNoeUB1c2Vycy5zZi5uZXQpCiNUaGlzIHByb2plY3QncyBob21lcGFnZSBpczogaHR0cDovL2Ntc21hZGVzaW1wbGUuc2YubmV0CiMKI1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiNpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQojdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKIyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMKI1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKI01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKI0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiNZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKI0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKIwoKCmlmICghZnVuY3Rpb25fZXhpc3RzKCJzdHJpcG9zIikpIHsKCWZ1bmN0aW9uIHN0cmlwb3MoJHN0ciwkbmVlZGxlKSB7CgkJcmV0dXJuIHN0cnBvcyhzdHJ0b2xvd2VyKCRzdHIpLHN0cnRvbG93ZXIoJG5lZWRsZSkpOwoJfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCJhcnJheV9kaWZmX2tleSIpKSB7CiAgICBmdW5jdGlvbiBhcnJheV9kaWZmX2tleSgpCiAgICB7CiAgICAgICAgJGFycnMgPSBmdW5jX2dldF9hcmdzKCk7CiAgICAgICAgJHJlc3VsdCA9IGFycmF5X3NoaWZ0KCRhcnJzKTsKICAgICAgICBmb3JlYWNoICgkYXJycyBhcyAkYXJyYXkpIHsKICAgICAgICAgICAgZm9yZWFjaCAoJHJlc3VsdCBhcyAka2V5ID0+ICR2KSB7CiAgICAgICAgICAgICAgICBpZiAoYXJyYXlfa2V5X2V4aXN0cygka2V5LCAkYXJyYXkpKSB7CiAgICAgICAgICAgICAgICAgICAgdW5zZXQoJHJlc3VsdFska2V5XSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuICRyZXN1bHQ7CiAgIH0KfQoKaWYgKCFmdW5jdGlvbl9leGlzdHMoImlzX2Fzc29jIikpIHsKICBmdW5jdGlvbiBpc19hc3NvYygkYXJyYXkpIHsKICAgIHJldHVybiAoaXNfYXJyYXkoJGFycmF5KSAmJiAwICE9PSBjb3VudChhcnJheV9kaWZmX2tleSgkYXJyYXksIGFycmF5X2tleXMoYXJyYXlfa2V5cygkYXJyYXkpKSkpKTsKICB9Cn0KCmNsYXNzIE5lb01vZHVsZSBleHRlbmRzIENNU01vZHVsZSB7CiAgLyoKICAgKgogICAqIEEgY291cGxlIG9mIHZhcmlhYmxlcyBhbmQgbWV0aG9kcyBmb3IgaW50ZXJuYWwgbW9kdWxlIHVzYWdlCiAgICoKICAgKi8KICB2YXIgJF9kYXRhc3RvcmFnZT1mYWxzZTsKICB2YXIgJF9pZD1mYWxzZTsKICB2YXIgJF9yZXR1cm5pZD1mYWxzZTsKICB2YXIgJF9lcnJvcnM9IiI7CiAgdmFyICRfdGhlbWVvYmplY3Q9ZmFsc2U7CiAgdmFyICRfcGFyYW1zPWFycmF5KCk7CiAgZnVuY3Rpb24gX2dldGRzKCkgewogICAgaWYgKCR0aGlzLT5fZGF0YXN0b3JhZ2UhPT1mYWxzZSkgcmV0dXJuICR0aGlzLT5fZGF0YXN0b3JhZ2U7CiAgICAkdGhpcy0+X2RhdGFzdG9yYWdlPSR0aGlzLT5HZXRNb2R1bGVJbnN0YW5jZSgiTmVvRGF0YVN0b3JhZ2UiKTsKICAgIHJldHVybiAkdGhpcy0+X2RhdGFzdG9yYWdlOwogIH0KICBmdW5jdGlvbiBfZ2V0dGhlbWVvYmooKSB7CiAgICBnbG9iYWwgJGdDbXM7CiAgICBpZiAoJHRoaXMtPl90aGVtZW9iamVjdCE9PWZhbHNlKSByZXR1cm4gJHRoaXMtPl90aGVtZW9iamVjdDsKICAgICR0aGlzLT5fdGhlbWVvYmplY3Q9JHRoZW1lT2JqZWN0ID0gJGdDbXMtPnZhcmlhYmxlc1snYWRtaW50aGVtZSddOwogICAgcmV0dXJuICR0aGlzLT5fdGhlbWVvYmplY3Q7CiAgfQoKICAvKgogICAqCiAgICogU3RhbmRhcmQgbW9kdWxlLUFQSS1tZXRob2RzIGJlaGF2aW5nIGluIGEgc3RhbmRhcmQgd2F5CiAgICoKICAgKi8KCglmdW5jdGlvbiBHZXROYW1lKCkgewoJCXJldHVybiAnTmVvTW9kdWxlJzsKCX0KCiAgZnVuY3Rpb24gR2V0VmVyc2lvbigpIHsKICAgIHJldHVybiAiMC4yLjMiOwogIH0KCiAgZnVuY3Rpb24gR2V0RnJpZW5kbHlOYW1lKCkgewoJCXJldHVybiAiTmVvIE1vZHVsZSBiYXNlLWNsYXNzIjsKCX0KCglmdW5jdGlvbiBJc1BsdWdpbk1vZHVsZSgpIHsKCQlyZXR1cm4gZmFsc2U7Cgl9CgoJZnVuY3Rpb24gTWluaW11bUNNU1ZlcnNpb24oKSB7CgkJcmV0dXJuICcxLjYnOwoJfQoKCWZ1bmN0aW9uIEdldEFkbWluRGVzY3JpcHRpb24oKSB7CgkJcmV0dXJuICJBbiBleHRlbmRlZCBtb2R1bGUtY2xhc3MsIG1haW5seSBmb3IgdGhlIE5lby1zZXJpZXMgbW9kdWxlcywgYnV0IGFsc28gZm9yIG90aGVycyB0byB1c2UiOwoJfQoKCWZ1bmN0aW9uIEhhc0FkbWluKCkgewoJCXJldHVybiBmYWxzZTsKCX0KCglmdW5jdGlvbiBHZXRBdXRob3IoKSB7CgkJcmV0dXJuICdNb3J0ZW4gUG91bHNlbic7Cgl9CgoJZnVuY3Rpb24gR2V0QXV0aG9yRW1haWwoKQl7CgkJcmV0dXJuICdtb3J0ZW5AcG91bHNlbi5vcmcnOwoJfQoKICBmdW5jdGlvbiBHZXRIZWxwKCRsYW5nPSdlbl9VUycpIHsKICAgIHJldHVybiAkdGhpcy0+UHJvY2Vzc1RlbXBsYXRlKCdoZWxwLnRwbCcpOwogCX0KCiAgZnVuY3Rpb24gR2V0Q2hhbmdlTG9nKCkJewoJCXJldHVybiAkdGhpcy0+UHJvY2Vzc1RlbXBsYXRlKCJjaGFuZ2Vsb2cudHBsIik7Cgl9CgogIC8qCiAgICoKICAgKiBTZXR1cCBmdW5jdGlvbnMKICAgKgogICAqLyAgCiAgZnVuY3Rpb24gTmVvU2V0SWQoJGlkKSB7CiAgICAkdGhpcy0+X2lkPSRpZDsKICB9ICAKICBmdW5jdGlvbiBOZW9TZXRSZXR1cm5JZCgkcmV0dXJuaWQpIHsKICAgICR0aGlzLT5fcmV0dXJuaWQ9JHJldHVybmlkOwogIH0KICBmdW5jdGlvbiBOZW9TZXRQYXJhbXMoJHBhcmFtcz1hcnJheSgpKSB7CiAgICAkdGhpcy0+X3BhcmFtcz0kcGFyYW1zOwogIH0KICBmdW5jdGlvbiBOZW9TZXR1cCgkaWQsJG1vZHVsZSwkcmV0dXJuaWQ9IjAiLCRwYXJhbXM9YXJyYXkoKSkgewogICAgJHRoaXMtPk5lb1NldElkKCRpZCk7CiAgICAkdGhpcy0+TmVvU2V0UmV0dXJuSWQoJHJldHVybmlkKTsKICAgICR0aGlzLT5OZW9TZXRQYXJhbXMoJHBhcmFtcyk7CiAgICAkdGhpcy0+U21hcnR5QXNzaWduQ01TKCRtb2R1bGUpOwogICAgJHRoaXMtPlNtYXJ0eUFzc2lnbigibW9kdWxlX2lkIiwkaWQpOwogIH0KCgogIC8qCiAgICoKICAgKiBHZW5lcmFsIHNob3J0Y3V0IGZ1bmN0aW9ucwogICAqCiAgICovCiAgZnVuY3Rpb24gUHJlZigkcHJlZm5hbWUsJGRlZmF1bHQ9IiIpIHsKICAgIHJldHVybiAkdGhpcy0+R2V0UHJlZmVyZW5jZSgkcHJlZm5hbWUsJGRlZmF1bHQpOwogIH0KCiAgZnVuY3Rpb24gTmVvQ21zTGluaygkcGFyYW1zPWFycmF5KCkpIHsKICAgIC8vQ3JlYXRlTGluaygkaWQsICRhY3Rpb24sICRyZXR1cm5pZD0nJywgJGNvbnRlbnRzPScnLCAkcGFyYW1zPWFycmF5KCksICR3YXJuX21lc3NhZ2U9JycsICRvbmx5aHJlZj1mYWxzZSwgJGlubGluZT1mYWxzZSwgJGFkZHR0ZXh0PScnLCAkdGFyZ2V0Y29udGVudG9ubHk9ZmFsc2UsICRwcmV0dHl1cmw9JycpCiAgICByZXR1cm4gJHRoaXMtPkNyZWF0ZUxpbmsoCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJpZCIsJHBhcmFtcywkdGhpcy0+X2lkKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImFjdGlvbiIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJyZXR1cm5pZCIsJHBhcmFtcywkdGhpcy0+X3JldHVybmlkKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImNvbnRlbnQiLCRwYXJhbXMsIiIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgicGFyYW1zIiwkcGFyYW1zLGFycmF5KCkpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgid2Fybm1lc3NhZ2UiLCRwYXJhbXMsIiIpLAogICAgICBmYWxzZSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImlubGluZSIsJHBhcmFtcyxmYWxzZSksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJhZGR0ZXh0IiwkcGFyYW1zLCIiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoInByZXR0eXVybCIsJHBhcmFtcywiIikKICAgICk7CiAgfQoKICBmdW5jdGlvbiBOZW9DbXNVcmwoJHBhcmFtcz1hcnJheSgpKSB7CiAgICAvL0NyZWF0ZUxpbmsoJGlkLCAkYWN0aW9uLCAkcmV0dXJuaWQ9JycsICRjb250ZW50cz0nJywgJHBhcmFtcz1hcnJheSgpLCAkd2Fybl9tZXNzYWdlPScnLCAkb25seWhyZWY9ZmFsc2UsICRpbmxpbmU9ZmFsc2UsICRhZGR0dGV4dD0nJywgJHRhcmdldGNvbnRlbnRvbmx5PWZhbHNlLCAkcHJldHR5dXJsPScnKQogICAgcmV0dXJuICR0aGlzLT5DcmVhdGVMaW5rKAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiaWQiLCRwYXJhbXMsJHRoaXMtPl9pZCksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJhY3Rpb24iLCRwYXJhbXMsIiIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgicmV0dXJuaWQiLCRwYXJhbXMsJHRoaXMtPl9yZXR1cm5pZCksCiAgICAgICIiLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgicGFyYW1zIiwkcGFyYW1zLGFycmF5KCkpLAogICAgICAiIiwKICAgICAgdHJ1ZSAsCiAgICAgIGZhbHNlLAogICAgICAiIiwKICAgICAgZmFsc2UsCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJwcmV0dHl1cmwiLCRwYXJhbXMsIiIpCiAgICApOwogIH0KCiAgZnVuY3Rpb24gTmVvUmVkaXJlY3QoJHBhcmFtcz1hcnJheSgpKSB7CiAgICAvL1JlZGlyZWN0KCRpZCwgJGFjdGlvbiwgJHJldHVybmlkPScnLCAkcGFyYW1zPWFycmF5KCksICRpbmxpbmU9ZmFsc2UpCiAgICByZXR1cm4gJHRoaXMtPlJlZGlyZWN0KAogICAgICAkdGhpcy0+TlBWKCJpZCIsJHBhcmFtcywkdGhpcy0+X2lkKSwKICAgICAgJHRoaXMtPk5QVigiYWN0aW9uIiwkcGFyYW1zLCIiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoInJldHVybmlkIiwkcGFyYW1zLCR0aGlzLT5fcmV0dXJuaWQpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgicGFyYW1zIiwkcGFyYW1zLGFycmF5KCkpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiaW5saW5lIiwkcGFyYW1zLGZhbHNlKQogICAgKTsKICB9CgoKICAvKgogICAqCiAgICogRm9ybS1nZW5lcmF0aW9uIGZ1bmN0aW9ucywgaW5jbHVkaW5nIHNtYXJ0eSBhc3NpZ25tZW50cwogICAqCiAgICovCgogIGZ1bmN0aW9uIE5lb0Zvcm1TdGFydCgkcGFyYW1zPWFycmF5KCkpIHsKICAgIC8vQ3JlYXRlRm9ybVN0YXJ0KCRpZCwgJGFjdGlvbj0nZGVmYXVsdCcsICRyZXR1cm5pZD0nJywgJG1ldGhvZD0ncG9zdCcsICRlbmN0eXBlPScnLCAkaW5saW5lPWZhbHNlLCAkaWRzdWZmaXg9JycsICRwYXJhbXMgPSBhcnJheSgpLCAkZXh0cmE9JycpICAgIAogICAgcmV0dXJuICR0aGlzLT5DcmVhdGVGb3JtU3RhcnQoCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJpZCIsJHBhcmFtcywkdGhpcy0+X2lkKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImFjdGlvbiIsJHBhcmFtcywiZGVmYXVsdCIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgicmV0dXJuaWQiLCRwYXJhbXMsJHRoaXMtPl9yZXR1cm5pZCksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJtZXRob2QiLCRwYXJhbXMsInBvc3QiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoYXJyYXkoImVuY3R5cGUiLCJlbmNvZGluZyIpLCRwYXJhbXMsIiIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiaW5saW5lIiwkcGFyYW1zLGZhbHNlKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImlkc3VmZml4IiwkcGFyYW1zLCIiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoInBhcmFtcyIsJHBhcmFtcyxhcnJheSgpKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImV4dHJhIiwkcGFyYW1zLCIiKQogICAgKTsKICB9CiAgZnVuY3Rpb24gU21hcnR5Rm9ybVN0YXJ0KCRzbWFydHluYW1lLCRwYXJhbXM9YXJyYXkoKSkgewogICAgJHRoaXMtPlNtYXJ0eUFzc2lnbigkc21hcnR5bmFtZSwkdGhpcy0+TmVvRm9ybVN0YXJ0KCRwYXJhbXMpKTsKICB9CiAgZnVuY3Rpb24gU21hcnR5VXBsb2FkRm9ybVN0YXJ0KCRzbWFydHluYW1lLCRwYXJhbXM9YXJyYXkoKSkgewogICAgJHBhcmFtc1sibWV0aG9kIl09InBvc3QiOwogICAgJHBhcmFtc1siZW5jdHlwZSJdPSJtdWx0aXBhcnQvZm9ybS1kYXRhIjsKICAgICR0aGlzLT5TbWFydHlGb3JtU3RhcnQoJHNtYXJ0eW5hbWUsJHBhcmFtcyk7CiAgfQoKICBmdW5jdGlvbiBOZW9Gb3JtRW5kKCkgewogICAgcmV0dXJuICR0aGlzLT5DcmVhdGVGb3JtRW5kKCk7CiAgfQogIGZ1bmN0aW9uIFNtYXJ0eUZvcm1FbmQoJHNtYXJ0eW5hbWUpIHsKICAgICR0aGlzLT5TbWFydHlBc3NpZ24oJHNtYXJ0eW5hbWUsJHRoaXMtPk5lb0Zvcm1FbmQoKSk7CiAgfQogIGZ1bmN0aW9uIFNtYXJ0eUlucHV0U3VibWl0KCRzbWFydHluYW1lLCRuYW1lLCR0ZXh0LCRjb25maXJtdGV4dD0iIikgewogICAgJHRoaXMtPlNtYXJ0eUFzc2lnbigkc21hcnR5bmFtZSwkdGhpcy0+TmVvSW5wdXRTdWJtaXQoYXJyYXkoIm5hbWUiPT4kbmFtZSwidmFsdWUiPT4kdGV4dCwiY29uZmlybXRleHQiPT4kY29uZmlybXRleHQpKSk7CiAgfQogIGZ1bmN0aW9uIFNtYXJ0eUlucHV0SGlkZGVuKCRzbWFydHluYW1lLCRuYW1lLCR2YWx1ZT0iIikgewogICAgJHRoaXMtPlNtYXJ0eUFzc2lnbigkc21hcnR5bmFtZSwkdGhpcy0+TmVvSW5wdXRIaWRkZW4oYXJyYXkoIm5hbWUiPT4kbmFtZSwidmFsdWUiPT4kdmFsdWUpKSk7CiAgfQogIGZ1bmN0aW9uIFNtYXJ0eUlucHV0SGlkZGVuTXVsdGkoJHNtYXJ0eW5hbWUsJGZpZWxkcz1hcnJheSgpKSB7CiAgICAkb3V0cHV0PSJcbiI7CiAgICBmb3JlYWNoKCRmaWVsZHMgYXMgJG5hbWU9PiR2YWx1ZSkgewogICAgICAkb3V0cHV0Lj0kdGhpcy0+TmVvSW5wdXRIaWRkZW4oYXJyYXkoIm5hbWUiPT4kbmFtZSwidmFsdWUiPT4kdmFsdWUpKS4iXG4iOwogICAgfQogICAgJG91dHB1dC49IlxuIjsKICAgICR0aGlzLT5TbWFydHlBc3NpZ24oJHNtYXJ0eW5hbWUsJG91dHB1dCk7CiAgfQoKICBmdW5jdGlvbiBTbWFydHlMaW5rKCRzbWFydHluYW1lLCRmaWVsZHM9YXJyYXkoKSkgewogICAgJHRoaXMtPlNtYXJ0eUFzc2lnbigkc21hcnR5bmFtZSwkdGhpcy0+TmVvQ21zTGluaygkZmllbGRzKSk7CiAgfQoKICBmdW5jdGlvbiBOZW9JbnB1dEZpbGUoJHBhcmFtcykgeyAgCiAgIHJldHVybiAkdGhpcy0+Q3JlYXRlSW5wdXRGaWxlKAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiaWQiLCRwYXJhbXMsJHRoaXMtPl9pZCksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJuYW1lIiwkcGFyYW1zLCIiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImFjY2VwdCIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJzaXplIiwkcGFyYW1zLCIxMCIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiYWRkdGV4dCIsJHBhcmFtcywiIikKICAgICk7CiAgfQoKICBmdW5jdGlvbiBOZW9JbnB1dFRleHQoJHBhcmFtcz1hcnJheSgpKSB7CiAgICByZXR1cm4gJHRoaXMtPkNyZWF0ZUlucHV0VGV4dCgKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImlkIiwkcGFyYW1zLCR0aGlzLT5faWQpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgibmFtZSIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJ2YWx1ZSIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJzaXplIiwkcGFyYW1zLCIxMCIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgibWF4bGVuZ3RoIiwkcGFyYW1zLCIyNTUiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImFkZHRleHQiLCRwYXJhbXMsIiIpCiAgICApOwogIH0KCiAgZnVuY3Rpb24gTmVvSW5wdXRQYXNzd29yZCgkcGFyYW1zPWFycmF5KCkpIHsgICAgCiAgICByZXR1cm4gJHRoaXMtPkNyZWF0ZUlucHV0UGFzc3dvcmQoCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJpZCIsJHBhcmFtcywkdGhpcy0+X2lkKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoIm5hbWUiLCRwYXJhbXMsIiIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgidmFsdWUiLCRwYXJhbXMsIiIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgic2l6ZSIsJHBhcmFtcywiMTAiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoIm1heGxlbmd0aCIsJHBhcmFtcywiMjU1IiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJhZGR0ZXh0IiwkcGFyYW1zLCIiKQogICAgKTsKICB9CgogIGZ1bmN0aW9uIE5lb1RleHRhcmVhKCRwYXJhbXM9YXJyYXkoKSkgeyAgICAKICAgIHJldHVybiAkdGhpcy0+Q3JlYXRlVGV4dEFyZWEoCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJlbmFibGV3eXNpd3lnIiwkcGFyYW1zLGZhbHNlKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImlkIiwkcGFyYW1zLCR0aGlzLT5faWQpLCAgICAgIAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZShhcnJheSgidmFsdWUiLCJ0ZXh0IiksJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJuYW1lIiwkcGFyYW1zLCIiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImNsYXNzbmFtZSIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJodG1saWQiLCRwYXJhbXMsIiIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiZW5jb2RpbmciLCRwYXJhbXMsIiIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgic3R5bGVzaGVldCIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJjb2xzIiwkcGFyYW1zLCI4MCIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgicm93cyIsJHBhcmFtcywiMTUiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImZvcmNld3lzaXd5ZyIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJ3YW50ZWRzeW50YXgiLCRwYXJhbXMsIiIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiYWRkdGV4dCIsJHBhcmFtcywiIikKICAgICk7CiAgfQoKICBmdW5jdGlvbiBOZW9JbnB1dENoZWNrYm94KCRwYXJhbXM9YXJyYXkoKSkgewogICAgaWYgKGlzc2V0KCRwYXJhbXNbImNoZWNrZWQiXSkgJiYgJHBhcmFtc1siY2hlY2tlZCJdPT10cnVlKSB7CiAgICAgICRwYXJhbXNbInNlbGVjdGVkdmFsdWUiXT0kcGFyYW1zWyJ2YWx1ZSJdOwogICAgfQogICAgcmV0dXJuICR0aGlzLT5DcmVhdGVJbnB1dENoZWNrYm94KAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiaWQiLCRwYXJhbXMsJHRoaXMtPl9pZCksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJuYW1lIiwkcGFyYW1zLCIiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoInZhbHVlIiwkcGFyYW1zLCIiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoInNlbGVjdGVkdmFsdWUiLCRwYXJhbXMsIiIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiYWRkdGV4dCIsJHBhcmFtcywiIikKICAgICk7CiAgfSAgCgogIGZ1bmN0aW9uIE5lb0lucHV0U3VibWl0KCRwYXJhbXM9YXJyYXkoKSkgewogICAgcmV0dXJuICR0aGlzLT5DcmVhdGVJbnB1dFN1Ym1pdCgKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImlkIiwkcGFyYW1zLCR0aGlzLT5faWQpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgibmFtZSIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJ2YWx1ZSIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJhZGR0ZXh0IiwkcGFyYW1zLCIiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImltYWdlIiwkcGFyYW1zLCIiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImNvbmZpcm10ZXh0IiwkcGFyYW1zLCIiKQogICAgKTsKICB9CgogIGZ1bmN0aW9uIE5lb0lucHV0UmVzZXQoJHBhcmFtcz1hcnJheSgpKSB7CiAgICByZXR1cm4gJHRoaXMtPkNyZWF0ZUlucHV0VGV4dCgKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImlkIiwkcGFyYW1zLCR0aGlzLT5faWQpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgibmFtZSIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJ2YWx1ZSIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJhZGR0ZXh0IiwkcGFyYW1zLCJSZXNldCIpCiAgICApOwogIH0KCiAgZnVuY3Rpb24gTmVvSW5wdXRIaWRkZW4oJHBhcmFtcz1hcnJheSgpKSB7CiAgICByZXR1cm4gJHRoaXMtPkNyZWF0ZUlucHV0SGlkZGVuKAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiaWQiLCRwYXJhbXMsJHRoaXMtPl9pZCksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJuYW1lIiwkcGFyYW1zLCIiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoInZhbHVlIiwkcGFyYW1zLCIiKQogICAgKTsKICB9CiAgCiAgZnVuY3Rpb24gTmVvSW5wdXREcm9wZG93bigkcGFyYW1zPWFycmF5KCkpIHsKICAgIHJldHVybiAkdGhpcy0+Q3JlYXRlSW5wdXREcm9wZG93bigKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImlkIiwkcGFyYW1zLCR0aGlzLT5faWQpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgibmFtZSIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJpdGVtcyIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJzZWxlY3RlZGluZGV4IiwkcGFyYW1zLC0xKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoInNlbGVjdGVkdmFsdWUiLCRwYXJhbXMsIiIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiYWRkdGV4dCIsJHBhcmFtcywiIikKICAgICk7CiAgfQoKICBmdW5jdGlvbiBOZW9JbnB1dFJhZGlvR3JvdXAoJHBhcmFtcz1hcnJheSgpKSB7CiAgICByZXR1cm4gJHRoaXMtPkNyZWF0ZUlucHV0UmFkaW9Hcm91cCgKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImlkIiwkcGFyYW1zLCR0aGlzLT5faWQpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgibmFtZSIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJpdGVtcyIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJzZWxlY3RlZHZhbHVlIiwkcGFyYW1zLC0xKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImFkZHRleHQiLCRwYXJhbXMsIiIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiZGVsaW1pdGVyIiwkcGFyYW1zLCIiKQogICAgKTsKICB9CiAgCiAgZnVuY3Rpb24gTmVvSW5wdXRTZWxlY3RMaXN0KCRwYXJhbXM9YXJyYXkoKSkgewogICAgcmV0dXJuICR0aGlzLT5DcmVhdGVJbnB1dFNlbGVjdExpc3QoCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJpZCIsJHBhcmFtcywkdGhpcy0+X2lkKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoIm5hbWUiLCRwYXJhbXMsIiIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiaXRlbXMiLCRwYXJhbXMsIiIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgic2VsZWN0ZWRpdGVtcyIsJHBhcmFtcyxhcnJheSgpKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoInNpemUiLCRwYXJhbXMsMyksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJhZGR0ZXh0IiwkcGFyYW1zLCIiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoIm11bHRpcGxlIiwkcGFyYW1zLHRydWUpCiAgICApOwogIH0gIAoKICAvKioKICAgKgogICAqIExpc3QgaGVscGVyIGZ1bmN0aW9ucwogICAqCiAgICovCiAgIGZ1bmN0aW9uIE5lb0RlbGV0ZUljb24oJGFjdGlvbiwkdGV4dCwkcGFyYW1zPWFycmF5KCksJGNvbmZpcm1hdGlvbj0iIikgewogICAgICRpY29uPSR0aGlzLT5DcmVhdGVMaW5rKCR0aGlzLT5faWQsICRhY3Rpb24sICR0aGlzLT5fcmV0dXJuaWQsJHRoaXMtPk5lb1N5c3RlbUljb24oImRlbGV0ZS5naWYiLCR0ZXh0KSwkcGFyYW1zLCAkY29uZmlybWF0aW9uKTsKICAgICByZXR1cm4gJGljb247CiAgIH0KCiAgIGZ1bmN0aW9uIE5lb0NvcHlJY29uKCRhY3Rpb24sJHRleHQsJHBhcmFtcz1hcnJheSgpLCRjb25maXJtYXRpb249IiIpIHsgICAgIAogICAgICRpY29uPSR0aGlzLT5DcmVhdGVMaW5rKCR0aGlzLT5faWQsICRhY3Rpb24sICR0aGlzLT5fcmV0dXJuaWQsCSR0aGlzLT5OZW9TeXN0ZW1JY29uKCJjb3B5LmdpZiIsJHRleHQpLCAkcGFyYW1zLCAkY29uZmlybWF0aW9uKTsKICAgICByZXR1cm4gJGljb247CiAgIH0KCiAgIGZ1bmN0aW9uIE5lb0VkaXRJY29uKCRhY3Rpb24sJHRleHQsJHBhcmFtcz1hcnJheSgpLCRjb25maXJtYXRpb249IiIpIHsKICAgICAkaWNvbj0kdGhpcy0+Q3JlYXRlTGluaygkdGhpcy0+X2lkLCAkYWN0aW9uLCAkdGhpcy0+X3JldHVybmlkLAkkdGhpcy0+TmVvU3lzdGVtSWNvbigiZWRpdC5naWYiLCR0ZXh0KSwJJHBhcmFtcywgJGNvbmZpcm1hdGlvbik7CiAgICAgcmV0dXJuICRpY29uOwogICB9CiAgIGZ1bmN0aW9uIE5lb1RydWVJY29uKCRhY3Rpb24sJHRleHQsJHBhcmFtcz1hcnJheSgpLCRjb25maXJtYXRpb249IiIpIHsKICAgICAkaWNvbj0kdGhpcy0+Q3JlYXRlTGluaygkdGhpcy0+X2lkLCAkYWN0aW9uLCAkdGhpcy0+X3JldHVybmlkLAkkdGhpcy0+TmVvU3lzdGVtSWNvbigidHJ1ZS5naWYiLCR0ZXh0KSwJJHBhcmFtcywgJGNvbmZpcm1hdGlvbik7CiAgICAgcmV0dXJuICRpY29uOwogICB9CiAgIGZ1bmN0aW9uIE5lb0ZhbHNlSWNvbigkYWN0aW9uLCR0ZXh0LCRwYXJhbXM9YXJyYXkoKSwkY29uZmlybWF0aW9uPSIiKSB7CiAgICAgJGljb249JHRoaXMtPkNyZWF0ZUxpbmsoJHRoaXMtPl9pZCwgJGFjdGlvbiwgJHRoaXMtPl9yZXR1cm5pZCwJJHRoaXMtPk5lb1N5c3RlbUljb24oImZhbHNlLmdpZiIsJHRleHQpLAkkcGFyYW1zLCAkY29uZmlybWF0aW9uKTsKICAgICByZXR1cm4gJGljb247CiAgIH0KCiAgIGZ1bmN0aW9uIE5lb0FkZEljb24oJGFjdGlvbiwkdGV4dCwkcGFyYW1zPWFycmF5KCksJGNvbmZpcm1hdGlvbj0iIikgeyAgICAgCiAgICAgJGljb249JHRoaXMtPkNyZWF0ZUxpbmsoJHRoaXMtPl9pZCwgJGFjdGlvbiwgJHRoaXMtPl9yZXR1cm5pZCwgJHRoaXMtPk5lb1N5c3RlbUljb24oIm5ld29iamVjdC5naWYiLCR0ZXh0KSwgJHBhcmFtcywgJGNvbmZpcm1hdGlvbik7CiAgICAgLy8kaWNvbi49JHRoaXMtPkNyZWF0ZUxpbmsoJHRoaXMtPl9pZCwgICRhY3Rpb24sICR0aGlzLT5fcmV0dXJuaWQsICR0ZXh0LCAkcGFyYW1zLCAkY29uZmlybWF0aW9uLCBmYWxzZSwgZmFsc2UsICdjbGFzcz0icGFnZW9wdGlvbnMiJyk7CgogICAgIC8vPSR0aGlzLT5DcmVhdGVMaW5rKCRpZCwgJ2VkaXR0ZW1wbGF0ZScsIDAsICR0aGVtZU9iamVjdC0+RGlzcGxheUltYWdlKCdpY29ucy9zeXN0ZW0vbmV3b2JqZWN0LmdpZicsJHRoaXMtPkxhbmcoImFkZHRlbXBsYXRlIiksJycsJycsJ3N5c3RlbWljb24nKSwgYXJyYXkoKSwgJycsIGZhbHNlLCBmYWxzZSwgJycpIC4nICcuICR0aGlzLT5DcmVhdGVMaW5rKCRpZCwgJ2VkaXR0ZW1wbGF0ZScsICRyZXR1cm5pZCwgJHRoaXMtPkxhbmcoImFkZHRlbXBsYXRlIiksIGFycmF5KCJ0b2RvIj0+ImFkZCIpLCAnJywgZmFsc2UsIGZhbHNlLCAnY2xhc3M9InBhZ2VvcHRpb25zIicpOwogICAgcmV0dXJuICRpY29uOwogICB9CiAgIAogICBmdW5jdGlvbiBOZW9TeXN0ZW1JY29uKCRpY29uLCR0ZXh0PSIiKSB7CiAgICAgJHRoZW1lb2JqPSR0aGlzLT5fZ2V0dGhlbWVvYmooKTsKICAgICByZXR1cm4gJHRoZW1lb2JqLT5EaXNwbGF5SW1hZ2UoJ2ljb25zL3N5c3RlbS8nLiRpY29uLCAkdGV4dCwnJywnJywnc3lzdGVtaWNvbicpOwogICB9CgogICBmdW5jdGlvbiBOZW9IaWRkZW5Db250ZW50KCR0ZXh0LCAkY29udGVudCwgJGNsaWNrdHlwZT0idGV4dCIsICRzdGFydHNob3duPWZhbHNlKSB7CiAgICAgcmV0dXJuICI8c3Ryb25nPiR0ZXh0PC9zdHJvbmc+PGJyLz4kY29udGVudCI7CiAgIH0KICAgCQkJCgogIC8qKgogICAqCiAgICogTmVvRGF0YVN0b3JhZ2Ugc2hvcnRjdXRzCiAgICoKICAgKi8KICBmdW5jdGlvbiBBZGRFbnRpdHkoJHRhYmxlLCAkcHJvcHM9YXJyYXkoKSkgewogICAgJGRzPSR0aGlzLT5fZ2V0ZHMoKTsKICAgIGlmICgkZHMhPT1mYWxzZSkgewogICAgICByZXR1cm4gJGRzLT5BZGRFbnRpdHkoJHRoaXMtPkdldE5hbWUoKSwkdGFibGUsJHByb3BzKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAkdGhpcy0+RXJyb3IoImZ1bmN0aW9uIEFkZEVudGl0eTogQ2Fubm90IGFjY2VzcyBOZW9EYXRhU3RvcmFnZSBtb2R1bGUiKTsKICAgIH0KICB9CgoKICBmdW5jdGlvbiBEZWxldGVFbnRpdHkoJGlkKSB7CiAgICAkZHM9JHRoaXMtPl9nZXRkcygpOwogICAgaWYgKCRkcyE9PWZhbHNlKSB7CiAgICAgIHJldHVybiAkZHMtPkRlbGV0ZUVudGl0eSgkaWQpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICR0aGlzLT5FcnJvcigiZnVuY3Rpb24gRGVsZXRlRW50aXR5OiBDYW5ub3QgYWNjZXNzIE5lb0RhdGFTdG9yYWdlIG1vZHVsZSIpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gR2V0RW50aXR5KCRpZCwgJG92ZXJyaWRlcHJvcHM9YXJyYXkoKSwgJGZpbGxmaWVsZHM9YXJyYXkoKSkgewogICAgJGRzPSR0aGlzLT5fZ2V0ZHMoKTsKICAgIGlmICgkZHMhPT1mYWxzZSkgewogICAgICByZXR1cm4gJGRzLT5HZXRFbnRpdHkoJGlkLCAkb3ZlcnJpZGVwcm9wcywgJGZpbGxmaWVsZHMpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICR0aGlzLT5FcnJvcigiZnVuY3Rpb24gR2V0RW50aXR5OiBDYW5ub3QgYWNjZXNzIE5lb0RhdGFTdG9yYWdlIG1vZHVsZSIpOwogICAgfSAgICAKICB9CgogIGZ1bmN0aW9uIEdldEVudGl0aWVzKCR0YWJsZT0iIiwgJGNyaXRlcmlhPWFycmF5KCksICRhbHdheXNyZXR1cm5hcnJheT1mYWxzZSkgewogICAgJGRzPSR0aGlzLT5fZ2V0ZHMoKTsKICAgIGlmICgkZHMhPT1mYWxzZSkgewogICAgICByZXR1cm4gJGRzLT5HZXRFbnRpdGllcygkdGhpcy0+R2V0TmFtZSgpLCAkdGFibGUsICRjcml0ZXJpYSk7CiAgICB9IGVsc2UgewogICAgICBpZiAoJGFsd2F5c3JldHVybmFycmF5KSB7CiAgICAgICAgcmV0dXJuIGFycmF5KCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5FcnJvcigiZnVuY3Rpb24gR2V0RW50aXRpZXM6IENhbm5vdCBhY2Nlc3MgTmVvRGF0YVN0b3JhZ2UgbW9kdWxlIik7CiAgICAgIH0KICAgIH0KICB9CgogIGZ1bmN0aW9uIEdldE9uZUVudGl0eSgkdGFibGUsICRjcml0ZXJpYT1hcnJheSgpLCAkZmFpbGlmbXVsdGlwbGU9ZmFsc2UpIHsKICAgICRkcz0kdGhpcy0+X2dldGRzKCk7CiAgICBpZiAoJGRzIT09ZmFsc2UpIHsKICAgICAgcmV0dXJuICRkcy0+R2V0T25lRW50aXR5KCR0aGlzLT5HZXROYW1lKCksICR0YWJsZSwgJGNyaXRlcmlhLCAkZmFpbGlmbXVsdGlwbGUpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICR0aGlzLT5FcnJvcigiZnVuY3Rpb24gR2V0T25lRW50aXR5OiBDYW5ub3QgYWNjZXNzIE5lb0RhdGFTdG9yYWdlIG1vZHVsZSIpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gR2V0T25lU29ydGVkRW50aXR5KCR0YWJsZSwgJGNyaXRlcmlhPWFycmF5KCksICRzb3J0ZmllbGRzICkgewogICAgJGRzPSR0aGlzLT5fZ2V0ZHMoKTsKICAgIGlmICgkZHMhPT1mYWxzZSkgewogICAgICByZXR1cm4gJGRzLT5HZXRPbmVFbnRpdHkoJHRoaXMtPkdldE5hbWUoKSwgJHRhYmxlLCAkY3JpdGVyaWEsICRmYWlsaWZtdWx0aXBsZSk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gJHRoaXMtPkVycm9yKCJmdW5jdGlvbiBHZXRPbmVFbnRpdHk6IENhbm5vdCBhY2Nlc3MgTmVvRGF0YVN0b3JhZ2UgbW9kdWxlIik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBHZXRFbnRpdGllc0Z1bGwoJHRhYmxlPSIiLCAkY3JpdGVyaWE9YXJyYXkoKSwgJGFsd2F5c3JldHVybmFycmF5PWZhbHNlKSB7CiAgICAkZHM9JHRoaXMtPl9nZXRkcygpOwogICAgaWYgKCRkcyE9PWZhbHNlKSB7CiAgICAgIHJldHVybiAkZHMtPkdldEVudGl0aWVzRnVsbCgkdGhpcy0+R2V0TmFtZSgpLCAkdGFibGUsICRjcml0ZXJpYSk7CiAgICB9IGVsc2UgewogICAgICBpZiAoJGFsd2F5c3JldHVybmFycmF5KSB7CiAgICAgICAgcmV0dXJuIGFycmF5KCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5FcnJvcigiZnVuY3Rpb24gR2V0RW50aXRpZXNGdWxsOiBDYW5ub3QgYWNjZXNzIE5lb0RhdGFTdG9yYWdlIG1vZHVsZSIpOwogICAgICB9CiAgICB9CiAgfQoKICBmdW5jdGlvbiBTZXRFbnRpdHlQcm9wKCRpZCwkcHJvcG5hbWUsJHByb3B2YWx1ZSwkcHJvcHR5cGU9InVuZGVmaW5lZCIpIHsKICAgICRkcz0kdGhpcy0+X2dldGRzKCk7CiAgICBpZiAoJGRzIT09ZmFsc2UpIHsKICAgICAgcmV0dXJuICRkcy0+U2V0RW50aXR5UHJvcCgkaWQsJHByb3BuYW1lLCRwcm9wdmFsdWUsJHByb3B0eXBlKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAkdGhpcy0+RXJyb3IoImZ1bmN0aW9uIFNldEVudGl0eVByb3A6IENhbm5vdCBhY2Nlc3MgTmVvRGF0YVN0b3JhZ2UgbW9kdWxlIik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBDbGVhckVudGl0eVByb3AoJGlkLCAkcHJvcG5hbWUpIHsKICAgICRkcz0kdGhpcy0+X2dldGRzKCk7CiAgICBpZiAoJGRzIT09ZmFsc2UpIHsKICAgICAgcmV0dXJuICRkcy0+Q2xlYXJFbnRpdHlQcm9wKCRpZCwgJHByb3BuYW1lKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAkdGhpcy0+RXJyb3IoImZ1bmN0aW9uIENsZWFyRW50aXR5UHJvcDogQ2Fubm90IGFjY2VzcyBOZW9EYXRhU3RvcmFnZSBtb2R1bGUiKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIFNldEVudGl0eVByb3BzKCRpZCwgJHByb3BzLyosICRjbGVhcj10cnVlKi8pIHsKICAgIC8vZWNobyAiaGkxIjtkaWUoKTsKICAgICRkcz0kdGhpcy0+X2dldGRzKCk7CiAgICBpZiAoJGRzIT09ZmFsc2UpIHsKICAgICAgcmV0dXJuICRkcy0+U2V0RW50aXR5UHJvcHMoJGlkLCAkcHJvcHMvKiwgJGNsZWFyKi8pOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICR0aGlzLT5FcnJvcigiZnVuY3Rpb24gU2V0RW50aXR5UHJvcHM6IENhbm5vdCBhY2Nlc3MgTmVvRGF0YVN0b3JhZ2UgbW9kdWxlIik7CiAgICB9CiAgfQogIAogIGZ1bmN0aW9uIFNldEVudGl0eVByb3BzRnJvbUFycmF5KCRpZCwgJHByb3BzLCAkdmFsdWVzLCAkY2xlYXI9dHJ1ZSwgJGZpbGw9ZmFsc2UpIHsKICAgIC8vZWNobyAiaGkxIjtkaWUoKTsKICAgICRkcz0kdGhpcy0+X2dldGRzKCk7CiAgICBpZiAoJGRzIT09ZmFsc2UpIHsKICAgICAgcmV0dXJuICRkcy0+U2V0RW50aXR5UHJvcHNGcm9tQXJyYXkoJGlkLCAkcHJvcHMsICR2YWx1ZXMsICRjbGVhciwgJGZpbGwpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICR0aGlzLT5FcnJvcigiZnVuY3Rpb24gU2V0RW50aXR5UHJvcHNGcm9tQXJyYXk6IENhbm5vdCBhY2Nlc3MgTmVvRGF0YVN0b3JhZ2UgbW9kdWxlIik7CiAgICB9CiAgfQoKCgogIGZ1bmN0aW9uIFNldEVudGl0eVByb3BzT25Dcml0ZXJpYSgkdGFibGUsICRwcm9wcywgJGNyaXRlcmlhLCAkY3JlYXRlPXRydWUsICRjbGVhcj1mYWxzZSkgewogICAgJGRzPSR0aGlzLT5fZ2V0ZHMoKTsKICAgIGlmICgkZHMhPT1mYWxzZSkgewogICAgICByZXR1cm4gJGRzLT5TZXRFbnRpdHlQcm9wc09uQ3JpdGVyaWEoJHRoaXMtPkdldE5hbWUoKSwgJHRhYmxlLCAkcHJvcHMsICRjcml0ZXJpYSwgJGNyZWF0ZSwgJGNsZWFyKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAkdGhpcy0+RXJyb3IoImZ1bmN0aW9uIFNldEVudGl0eVByb3BzT25Dcml0ZXJpYTogQ2Fubm90IGFjY2VzcyBOZW9EYXRhU3RvcmFnZSBtb2R1bGUiKTs7OwogICAgfQogIH0KCiAgZnVuY3Rpb24gUmVzZXRFbnRpdHlQcm9wcygkaWQsICRuZXdwcm9wcz1hcnJheSgpKSB7CiAgICAkZHM9JHRoaXMtPl9nZXRkcygpOwogICAgaWYgKCRkcyE9PWZhbHNlKSB7CiAgICAgIHJldHVybiAkZHMtPlJlc2V0RW50aXR5UHJvcHMoJGlkLCAkbmV3cHJvcCk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gJHRoaXMtPkVycm9yKCJmdW5jdGlvbiBSZXNldEVudGl0eVByb3BzOiBDYW5ub3QgYWNjZXNzIE5lb0RhdGFTdG9yYWdlIG1vZHVsZSIpOzs7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBSZW1vdmVNb2R1bGVFbnRpdGllcygpIHsKICAgICRkcz0kdGhpcy0+X2dldGRzKCk7CiAgICBpZiAoJGRzIT09ZmFsc2UpIHsKICAgICAgcmV0dXJuICRkcy0+UmVtb3ZlTW9kdWxlRW50aXRpZXMoJHRoaXMtPkdldE5hbWUoKSk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gJHRoaXMtPkVycm9yKCJmdW5jdGlvbiBSZW1vdmVNb2R1bGVFbnRpdGllczogQ2Fubm90IGFjY2VzcyBOZW9EYXRhU3RvcmFnZSBtb2R1bGUiKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIENsZWFyRW50aXR5UHJvcHMoJGlkKSB7CiAgICAkZHM9JHRoaXMtPl9nZXRkcygpOwogICAgaWYgKCRkcyE9PWZhbHNlKSB7CiAgICAgIHJldHVybiAkZHMtPkNsZWFyRW50aXR5UHJvcHMoJGlkKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAkdGhpcy0+RXJyb3IoImZ1bmN0aW9uIENsZWFyRW50aXR5UHJvcHM6IENhbm5vdCBhY2Nlc3MgTmVvRGF0YVN0b3JhZ2UgbW9kdWxlIik7CiAgICB9ICAgIAogIH0KCiAgZnVuY3Rpb24gQ29tcGFyZUVudGl0aWVzKCRlbnRpdHkxLCAkZW50aXR5MiwgJHNvcnRmaWVsZCkgewogICAgJGRzPSR0aGlzLT5fZ2V0ZHMoKTsKICAgIGlmICgkZHMhPT1mYWxzZSkgewogICAgICAkZHMtPkNvbXBhcmVFbnRpdGllcygkZW50aXR5MSwgJGVudGl0eTIsICRzb3J0ZmllbGQpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICR0aGlzLT5FcnJvcigiZnVuY3Rpb24gQ29tcGFyZUVudGl0aWVzOiBDYW5ub3QgYWNjZXNzIE5lb0RhdGFTdG9yYWdlIG1vZHVsZSIpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gQ29tcGFyZUVudGl0aWVzQ29tcGxleCgkZW50aXR5MSwgJGVudGl0eTIsICRzb3J0ZmllbGRzKSB7CiAgICAkZHM9JHRoaXMtPl9nZXRkcygpOwogICAgaWYgKCRkcyE9PWZhbHNlKSB7CiAgICAgICRkcy0+Q29tcGFyZUVudGl0aWVzQ29tcGxleCgkZW50aXR5MSwgJGVudGl0eTIsICRzb3J0ZmllbGQpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICR0aGlzLT5FcnJvcigiZnVuY3Rpb24gQ29tcGFyZUVudGl0aWVzQ29tcGxleDogQ2Fubm90IGFjY2VzcyBOZW9EYXRhU3RvcmFnZSBtb2R1bGUiKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIFNvcnRFbnRpdGllcygkbGlzdCwgJHNvcnRmaWVsZHMpIHsKICAgICRkcz0kdGhpcy0+X2dldGRzKCk7CiAgICBpZiAoJGRzIT09ZmFsc2UpIHsKICAgICAgJGRzLT5Tb3J0RW50aXRpZXMoJGxpc3QsICRzb3J0ZmllbGRzKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAkdGhpcy0+RXJyb3IoImZ1bmN0aW9uIFNvcnRFbnRpdGllczogQ2Fubm90IGFjY2VzcyBOZW9EYXRhU3RvcmFnZSBtb2R1bGUiKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIEVudGl0aWVzQ291bnQoJHRhYmxlPSIiLCAkY3JpdGVyaWE9YXJyYXkoKSkgewogICAgJGRzPSR0aGlzLT5fZ2V0ZHMoKTsKICAgIGlmICgkZHMhPT1mYWxzZSkgewogICAgICByZXR1cm4gJGRzLT5FbnRpdGllc0NvdW50KCR0aGlzLT5HZXROYW1lKCksICR0YWJsZSwgJGNyaXRlcmlhKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAkdGhpcy0+RXJyb3IoImZ1bmN0aW9uIEVudGl0aWVzQ291bnQ6IENhbm5vdCBhY2Nlc3MgTmVvRGF0YVN0b3JhZ2UgbW9kdWxlIik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBDbGVhck1vZHVsZUVudGl0aWVzKCkgeyAgICAKICAgICRkcz0kdGhpcy0+X2dldGRzKCk7CiAgICBpZiAoJGRzIT09ZmFsc2UpIHsgICAgICAKICAgICAgcmV0dXJuICRkcy0+Q2xlYXJNb2R1bGVFbnRpdGllcygkdGhpcy0+R2V0TmFtZSgpKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAkdGhpcy0+RXJyb3IoImZ1bmN0aW9uIENsZWFyTW9kdWxlRW50aXRpZXM6IENhbm5vdCBhY2Nlc3MgTmVvRGF0YVN0b3JhZ2UgbW9kdWxlIik7CiAgICB9CiAgfQoKICAvKgogICAqCiAgICogQ29ubmVjdGlvbiBmdW5jdGlvbnMKICAgKgogICAqLwoKICBmdW5jdGlvbiBTZXRFbnRpdHlDb25uZWN0aW9uKCRpZDEsICRpZDIsICR0eXBlPSIiKSB7CiAgICAkZHM9JHRoaXMtPl9nZXRkcygpOwogICAgaWYgKCRkcyE9PWZhbHNlKSB7CiAgICAgIHJldHVybiAkZHMtPlNldEVudGl0eUNvbm5lY3Rpb24oJGlkMSwgJGlkMiwgJHR5cGUpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICR0aGlzLT5FcnJvcigiZnVuY3Rpb24gU2V0RW50aXR5Q29ubmVjdGlvbjogQ2Fubm90IGFjY2VzcyBOZW9EYXRhU3RvcmFnZSBtb2R1bGUiKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIENsZWFyRW50aXR5Q29ubmVjdGlvbnMoJGlkMSwgJGlkMj0tMSwgJHR5cGU9IiIpIHsKICAgICRkcz0kdGhpcy0+X2dldGRzKCk7CiAgICBpZiAoJGRzIT09ZmFsc2UpIHsKICAgICAgcmV0dXJuICRkcy0+Q2xlYXJFbnRpdHlDb25uZWN0aW9ucygkaWQxLCAkaWQyLCAkdHlwZSk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gJHRoaXMtPkVycm9yKCJmdW5jdGlvbiBDbGVhckVudGl0eUNvbm5lY3Rpb25zOiBDYW5ub3QgYWNjZXNzIE5lb0RhdGFTdG9yYWdlIG1vZHVsZSIpOwogICAgfSAgICAKICB9CgoKCiAgZnVuY3Rpb24gQ2xlYXJFbnRpdHlDb25uZWN0aW9uKCRpZDEsICRpZDIsICR0eXBlPSIiKSB7CiAgICAkZHM9JHRoaXMtPl9nZXRkcygpOwogICAgaWYgKCRkcyE9PWZhbHNlKSB7CiAgICAgIHJldHVybiAkZHMtPkNsZWFyRW50aXR5Q29ubmVjdGlvbigkaWQxLCAkaWQyLCAkdHlwZSk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gJHRoaXMtPkVycm9yKCJmdW5jdGlvbiBDbGVhckVudGl0eUNvbm5lY3Rpb246IENhbm5vdCBhY2Nlc3MgTmVvRGF0YVN0b3JhZ2UgbW9kdWxlIik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBDaGVja0VudGl0eUNvbm5lY3Rpb24oJGlkMSwgJGlkMiwgJHR5cGU9IiIsICRyZXR1cm52YWx1ZT10cnVlKSB7CiAgICAkZHM9JHRoaXMtPl9nZXRkcygpOwogICAgaWYgKCRkcyE9PWZhbHNlKSB7CiAgICAgIHJldHVybiAkZHMtPkNoZWNrRW50aXR5Q29ubmVjdGlvbigkaWQxLCAkaWQyLCAkdHlwZSwgJHJldHVybnZhbHVlKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAkdGhpcy0+RXJyb3IoImZ1bmN0aW9uIENoZWNrRW50aXR5Q29ubmVjdGlvbjogQ2Fubm90IGFjY2VzcyBOZW9EYXRhU3RvcmFnZSBtb2R1bGUiKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIEdldEVudGl0eUNvbm5lY3Rpb25zKCRpZDEsICRpZDI9LTEsICR0eXBlPSIiKSB7CiAgICAkZHM9JHRoaXMtPl9nZXRkcygpOwogICAgaWYgKCRkcyE9PWZhbHNlKSB7CiAgICAgIHJldHVybiAkZHMtPkdldEVudGl0eUNvbm5lY3Rpb25zKCRpZDEsICRpZDIsICR0eXBlKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAkdGhpcy0+RXJyb3IoImZ1bmN0aW9uIEdldEVudGl0eUNvbm5lY3Rpb25zOiBDYW5ub3QgYWNjZXNzIE5lb0RhdGFTdG9yYWdlIG1vZHVsZSIpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gQWRkRmllbGRTZXQoJG5hbWUsJGZpZWxkcykgewogICAgJGRzPSR0aGlzLT5fZ2V0ZHMoKTsKICAgIGlmICgkZHMhPT1mYWxzZSkgewogICAgICByZXR1cm4gJGRzLT5BZGRGaWVsZFNldCgkdGhpcy0+R2V0TmFtZSgpLCRuYW1lLCRmaWVsZHMpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICR0aGlzLT5FcnJvcigiZnVuY3Rpb24gQWRkRmllbGRTZXQ6IENhbm5vdCBhY2Nlc3MgTmVvRGF0YVN0b3JhZ2UgbW9kdWxlIik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBHZXRGaWVsZFNldCgkbmFtZSkgewogICAgJGRzPSR0aGlzLT5fZ2V0ZHMoKTsKICAgIGlmICgkZHMhPT1mYWxzZSkgewogICAgICByZXR1cm4gJGRzLT5HZXRGaWVsZFNldCgkdGhpcy0+R2V0TmFtZSgpLCRuYW1lKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAkdGhpcy0+RXJyb3IoImZ1bmN0aW9uIEdldEZpZWxkU2V0OiBDYW5ub3QgYWNjZXNzIE5lb0RhdGFTdG9yYWdlIG1vZHVsZSIpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gRW50aXR5U2V0VW5zZXRQcm9wcygkZW50aXR5LCRmaWVsZHNldCwkZmlsbHZhbHVlPSIiKSB7CiAgICAkZHM9JHRoaXMtPl9nZXRkcygpOwogICAgaWYgKCRkcyE9PWZhbHNlKSB7CiAgICAgIHJldHVybiAkZHMtPkVudGl0eVNldFVuc2V0UHJvcHMoJHRoaXMtPkdldEZpZWxkU2V0KCR0aGlzLT5HZXROYW1lKCkpLCRlbnRpdHksJGZpZWxkc2V0LCRmaWxsdmFsdWU9IiIpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICR0aGlzLT5FcnJvcigiZnVuY3Rpb24gR2V0RmllbGRTZXQ6IENhbm5vdCBhY2Nlc3MgTmVvRGF0YVN0b3JhZ2UgbW9kdWxlIik7CiAgICB9CiAgfQoKCiAgZnVuY3Rpb24gR2V0RFNFcnJvcnMoJG5sMmJyPXRydWUsJGNsZWFyPXRydWUpIHsKICAgICRkcz0kdGhpcy0+X2dldGRzKCk7CiAgICBpZiAoJGRzIT09ZmFsc2UpIHsKICAgICAgcmV0dXJuICRkcy0+R2V0RXJyb3JzKCRubDJiciwkY2xlYXIpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICR0aGlzLT5FcnJvcigiZnVuY3Rpb24gR2V0RmllbGRTZXQ6IENhbm5vdCBhY2Nlc3MgTmVvRGF0YVN0b3JhZ2UgbW9kdWxlIik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBTaG93RFNFcnJvcnMoJGNsZWFyPXRydWUpIHsKICAgICRkcz0kdGhpcy0+X2dldGRzKCk7CiAgICBpZiAoJGRzIT09ZmFsc2UpIHsKICAgICAgcmV0dXJuICRkcy0+R2V0RXJyb3JzKCRjbGVhcik7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gJHRoaXMtPkVycm9yKCJmdW5jdGlvbiBTaG93RFNFcnJvcnM6IENhbm5vdCBhY2Nlc3MgTmVvRGF0YVN0b3JhZ2UgbW9kdWxlIik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBEU0luRXJyb3IoKSB7CiAgICAkZHM9JHRoaXMtPl9nZXRkcygpOwogICAgaWYgKCRkcyE9PWZhbHNlKSB7CiAgICAgIHJldHVybiAkZHMtPkluRXJyb3IoKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAkdGhpcy0+RXJyb3IoImZ1bmN0aW9uIERTSW5FcnJvcjogQ2Fubm90IGFjY2VzcyBOZW9EYXRhU3RvcmFnZSBtb2R1bGUiKTsKICAgIH0KICB9CgogIC8qCiAgICoKICAgKiBVdGlsaXR5IGZ1bmN0aW9ucwogICAqCiAgICovCgogIGZ1bmN0aW9uIE5lb1NsYXNoZXMoJHVybCkgewoJCSRyZXN1bHQ9c3RyX3JlcGxhY2UoIlxcIiwiLyIsJHVybCk7CiAgICAvL1llcywgcGhwIHVuZGVyIHdpbmRvd3MgcnVucyBwZXJmZWN0bHkgd2l0aCB0aG9zZSBzbGFzaGVzLCBhcyBsb25nIGFzIHlvdQogICAgLy9kb24ndCBtaXggdGhlbSB3aXRoIGJhY2tzbGFzaGVzISEKCQkvLyRyZXN1bHQ9c3RyX3JlcGxhY2UoIi8iLERJUkVDVE9SWV9TRVBBUkFUT1IsJHVybCk7CgkJLy9yZXR1cm4gc3RyX3JlcGxhY2UoIlxcIixESVJFQ1RPUllfU0VQQVJBVE9SLCRyZXN1bHQpOwoJCXJldHVybiAkcmVzdWx0OwoJfQoKICBmdW5jdGlvbiBTbGFzaGVzKCR1cmwpIHsKICAgIHJldHVybiAkdGhpcy0+TmVvU2xhc2hlcygkdXJsKTsKICB9CgoJZnVuY3Rpb24gU2xhc2goJHN0ciwkc3RyMj0iIiwkc3RyMz0iIikgewoJCWlmICgkc3RyPT0iIikgcmV0dXJuICRzdHIyOwoJCWlmICgkc3RyMj09IiIgJiYgJHN0cjM9PSIiKSByZXR1cm4gJHN0cjsKICAgICRyZXN1bHQ9IiI7CgkJaWYgKCRzdHJbc3RybGVuKCRzdHIpLTFdIT0iLyIpIHsKCQkJaWYgKCRzdHIyWzBdIT0iLyIpIHsKCQkJCSRyZXN1bHQ9JHN0ci4iLyIuJHN0cjI7CgkJCX0gZWxzZSB7CgkJCQkkcmVzdWx0PSRzdHIuJHN0cjI7CgkJCX0KCQl9IGVsc2UgewoJCQlpZiAoJHN0cjJbMF0hPSIvIikgewoJCQkJJHJlc3VsdD0kc3RyLiRzdHIyOwoJCQl9IGVsc2UgewoJCQkJJHJlc3VsdD0kc3RyLnN1YnN0cigkc3RyMiwxKTsgLy90cmltIGF3YXkgb25lIG9mIHRoZSBzbGFzaGVzCgkJCX0KCQl9CiAgICBpZiAoJHN0cjM9PSIiKSByZXR1cm4gJHJlc3VsdDsKICAgIGlmICgkcmVzdWx0W3N0cmxlbigkcmVzdWx0KS0xXSE9Ii8iKSB7CgkJCWlmICgkc3RyM1swXSE9Ii8iKSB7CgkJCQkkcmVzdWx0PSRyZXN1bHQuIi8iLiRzdHIzOwoJCQl9IGVsc2UgewoJCQkJJHJlc3VsdD0kcmVzdWx0LiRzdHIzOwoJCQl9CgkJfSBlbHNlIHsKCQkJaWYgKCRzdHIzWzBdIT0iLyIpIHsKCQkJCSRyZXN1bHQ9JHJlc3VsdC4kc3RyMzsKCQkJfSBlbHNlIHsKCQkJCSRyZXN1bHQ9JHJlc3VsdC5zdWJzdHIoJHN0cjMsMSk7IC8vdHJpbSBhd2F5IG9uZSBvZiB0aGUgc2xhc2hlcwoJCQl9CgkJfQogICAgcmV0dXJuICRyZXN1bHQ7CQkKCX0gIAoKICBmdW5jdGlvbiBOZW9EaXJMaXN0KCRyb290LCRyZXR1cm49ImZpbGVzIiwkaW50cm9kdWN0aW9uPWFycmF5KCksJGV4Y2x1ZGVzPWFycmF5KCksJG1heHJlY3Vyc2lvbj0tMSkgewogICAgJGRpcmxpc3Q9YXJyYXkoKTsKICAgICRjb25maWc9JHRoaXMtPkdldENvbmZpZygpOwogICAgJG1vZGU9IiI7CiAgICBzd2l0Y2goJHJldHVybikgewogICAgICBjYXNlICJmaWxlcyI6ICRtb2RlPSJGSUxFUyI7YnJlYWs7CiAgICAgIGNhc2UgImRpcnMiOiAkbW9kZT0iRElSUyI7YnJlYWs7CiAgICAgIGNhc2UgImJvdGgiOiAkbW9kZT0iRlVMTCI7YnJlYWs7CiAgICB9CiAgICAkZnVsbHJvb3Q9JHRoaXMtPlNsYXNoKCRjb25maWdbInJvb3RfcGF0aCJdLCRyb290KTsKICAgICRmaWxlcmVjPSBnZXRfcmVjdXJzaXZlX2ZpbGVfbGlzdCAoJGZ1bGxyb290LCAkZXhjbHVkZXMgLCRtYXhyZWN1cnNpb24gLCRtb2RlKTsgLy9ObyBtYXhkZXB0aCBpbiByZWN1cnNpb24KICAgIGlmICghZW1wdHkoJGludHJvZHVjdGlvbikpIHsKICAgICAgJGRpcmxpc3Q9JGludHJvZHVjdGlvbjsKICAgIH0gICAgCiAgICBmb3JlYWNoKCRmaWxlcmVjIGFzICRrZXk9PiR2YWx1ZSkgewogICAgICAkdmFsdWUxPSR0aGlzLT5TbGFzaGVzKHN0cl9yZXBsYWNlKCRjb25maWdbJ3Jvb3RfcGF0aCddLCcnLCR2YWx1ZSkpOwogICAgICAvL3ByZXZlbnQgY3VycmVudCBkaXIgZnJvbSBzaG93aW5nIHVwCiAgICAgIC8vaWYgKCR2YWx1ZTE9PSgkcHJvZmlsZVsicGF0aCJdLiIvIikpIGNvbnRpbnVlOwogICAgICAvL0NoZWNrIGZvciBoaWRkZW4gZmlsZXMKICAgICAgJGRpcnM9ZXhwbG9kZSgiLyIsJHZhbHVlMSk7CiAgICAgICRoaWRkZW49ZmFsc2U7CiAgICAgIGZvcmVhY2goJGRpcnMgYXMgJGRpcikgewogICAgICAgIGlmIChzdWJzdHIoJGRpciwwLDEpPT0iLiIpIHskaGlkZGVuPXRydWU7IGJyZWFrO30KICAgICAgfQogICAgICBpZiAoJGhpZGRlbikgY29udGludWU7CgogICAgICAvL25vdCBoaWRkZW4sIGFkZCB0byBsaXN0CiAgICAgICRkaXJsaXN0WyR2YWx1ZTFdPSR2YWx1ZTE7CiAgICB9CiAgICByZXR1cm4gJGRpcmxpc3Q7CiAgfQoKICAvKkNoZWNrcyBmb3IgdGhlIGV4aXN0ZW5jZSBvZiBhbiBpbmRleCBpbiBhbiBhcnJheSBhbmQgcmV0dXJuIHRoZSB2YWx1ZSBpZiBpdCdzIHRoZXJlCiAgICphbmQgdGhlIGRlZmF1bHQgdmFsdWUgaWYgaXQncyBub3QKICAqLwogIGZ1bmN0aW9uIE5lb1BhcmFtVmFsdWUoJG5hbWUsJHBhcmFtcz1hcnJheSgpLCRkZWZhdWx0PSIiKSB7CiAgICBpZiAoZW1wdHkoJHBhcmFtcykpICRwYXJhbXM9JHRoaXMtPl9wYXJhbXM7CiAgICBpZiAoIWlzX2FycmF5KCRuYW1lKSkgewogICAgICBpZiAoaXNzZXQoJHBhcmFtc1skbmFtZV0pKSByZXR1cm4gJHBhcmFtc1skbmFtZV07ICAgICAgCiAgICAgIHJldHVybiAkZGVmYXVsdDsKICAgIH0gZWxzZSB7CiAgICAgIGZvcmVhY2ggKCRuYW1lIGFzICRzaW5nbGVuYW1lKSB7CiAgICAgICAgaWYgKGlzc2V0KCRwYXJhbXNbJHNpbmdsZW5hbWVdKSkgcmV0dXJuICRwYXJhbXNbJHNpbmdsZW5hbWVdOwogICAgICB9CiAgICAgIHJldHVybiAkZGVmYXVsdDsKICAgIH0KICB9CgogIC8vU2hvcnRjdXQgZm9yIHRoZSBhYm92ZQogIGZ1bmN0aW9uIE5QVigkbmFtZSwgJHBhcmFtcz1mYWxzZSwgJGRlZmF1bHQ9IiIpIHsKICAgIHJldHVybiAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgkbmFtZSwgJHBhcmFtcywgJGRlZmF1bHQpOwogIH0KCiAgRnVuY3Rpb24gTmVvQXBwbHlQYXJhbVZhbHVlcygkdGhpc2FycmF5LCAkcGFyYW1zPWFycmF5KCksICRpbmRleGVzPWFycmF5KCksICRhbHdheXNmaWxsPWZhbHNlKSB7CiAgICBpZiAoZW1wdHkoJHBhcmFtcykpICRwYXJhbXM9JHRoaXMtPl9wYXJhbXM7CiAgICBpZiAoZW1wdHkoJHBhcmFtcykgfHwgZW1wdHkoJGluZGV4ZXMpKSByZXR1cm4gJHRoaXNhcnJheTsKICAgIGlmIChpc19hc3NvYygkaW5kZXhlcykpIHsKICAgICAgZm9yZWFjaCgkaW5kZXhlcyBhcyAkaW5kZXg9PiRkZWZhdWx0dmFsdWUpIHsKICAgICAgICBpZiAoaXNzZXQoJHBhcmFtc1skaW5kZXhdKSkgewogICAgICAgICAgJHRoaXNhcnJheVskaW5kZXhdPSRwYXJhbXNbJGluZGV4XTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgJHRoaXNhcnJheVskaW5kZXhdPSRkZWZhdWx0dmFsdWU7CiAgICAgICAgfQogICAgICB9CiAgICB9IGVsc2UgewogICAgICBmb3JlYWNoKCRpbmRleGVzIGFzICRpbmRleCkgeyAgICAgICAgCiAgICAgICAgaWYgKGlzc2V0KCRwYXJhbXNbJGluZGV4XSkpIHsKICAgICAgICAgICR0aGlzYXJyYXlbJGluZGV4XT0kcGFyYW1zWyRpbmRleF07CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGlmICgkYWx3YXlzZmlsbCkgewogICAgICAgICAgICBpZiAoIWlzc2V0KCR0aGlzYXJyYXlbJGluZGV4XSkpICR0aGlzYXJyYXlbJGluZGV4XT0iIjsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIC8vcHJpbnRfcigkdGhpc2FycmF5KTsKICAgIHJldHVybiAkdGhpc2FycmF5OwogIH0KCiAgZnVuY3Rpb24gTWFrZVNpbXBsZUFycmF5KCR0YWJsZSwkZmllbGQsJGFzc29jaWQ9dHJ1ZSkgewogICAgJGRzPSR0aGlzLT5fZ2V0ZHMoKTsKICAgIGlmICgkZHMhPT1mYWxzZSkgewogICAgICByZXR1cm4gJGRzLT5NYWtlU2ltcGxlQXJyYXkoJHRoaXMtPkdldE5hbWUoKSwgJHRhYmxlLCAkZmllbGQsICRhc3NvY2lkKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAkdGhpcy0+RXJyb3IoImZ1bmN0aW9uIE1ha2VTaW1wbGVBcnJheTogQ2Fubm90IGFjY2VzcyBOZW9EYXRhU3RvcmFnZSBtb2R1bGUiKTs7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBNYWtlQXNzb2NBcnJheSgkdGFibGUsJGZpZWxkcykgewogICAgJGRzPSR0aGlzLT5fZ2V0ZHMoKTsKICAgIGlmICgkZHMhPT1mYWxzZSkgewogICAgICByZXR1cm4gJGRzLT5NYWtlQXNzb2NBcnJheSgkdGhpcy0+R2V0TmFtZSgpLCAkdGFibGUsICRmaWVsZHMpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICR0aGlzLT5FcnJvcigiZnVuY3Rpb24gTWFrZUFzc29jQXJyYXk6IENhbm5vdCBhY2Nlc3MgTmVvRGF0YVN0b3JhZ2UgbW9kdWxlIik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBDaGVja0ZpbGVFeHRlbnNpb24oJGZpbGVuYW1lLCAkYWxsb3dlZGV4dGVuc2lvbnM9YXJyYXkoKSkgewoJCSRleHBsb2RlZGZpbGU9ZXhwbG9kZSgiLiIsJGZpbGVuYW1lKTsKCQkkZXh0PXN0cnRvbG93ZXIoYXJyYXlfcG9wKCRleHBsb2RlZGZpbGUpKTsKCQlpZiAoaW5fYXJyYXkoJGV4dCwkYWxsb3dlZGV4dGVuc2lvbnMpKSByZXR1cm4gdHJ1ZTsKICAgIHJldHVybiBmYWxzZTsKICB9CgogIGZ1bmN0aW9uIE5lb1Rvb2xUaXAoJHBhcmFtcz1hcnJheSgpKSB7CiAgICAkdGV4dD0kdGhpcy0+TlBWKCJ0ZXh0IiwkcGFyYW1zLCI/Iik7CiAgICAkdXJsPSR0aGlzLT5OUFYoInVybCIsJHBhcmFtcywiIik7CiAgICAkdGl0bGU9JHRoaXMtPk5QVigidGl0bGUiLCRwYXJhbXMsIiIpOwogICAgJGNvbnRlbnQ9JHRoaXMtPk5QVigiY29udGVudCIsJHBhcmFtcywiIik7CiAgICAkc3BhbmNsYXNzPSR0aGlzLT5OUFYoInNwYW5jbGFzcyIsJHBhcmFtcywibmVvdG9vbHRpcCIpOwogICAgaWYgKCR1cmwhPSIiKSB7CiAgICAgICRyZXN1bHQ9JzxhIGNsYXNzPSInLiRzcGFuY2xhc3MuJyIgaHJlZj0iJy4kdXJsLiciPic7CiAgICB9IGVsc2UgewogICAgICAkcmVzdWx0PSc8YSBjbGFzcz0iJy4kc3BhbmNsYXNzLiciIHN0eWxlPSJjdXJzb3I6IGRlZmF1bHQ7IiBocmVmPSIjIiBvbmNsaWNrPSJyZXR1cm4gZmFsc2U7Ij4nOwogICAgfQogICAgJHJlc3VsdC49JHRleHQ7CiAgICAkcmVzdWx0Lj0nPHNwYW4+JzsKICAgIGlmICgkdGl0bGUhPSIiKSB7CiAgICAgICRyZXN1bHQuPSI8c3Ryb25nPiIuJHRpdGxlLiI8L3N0cm9uZz48YnIvPiI7CiAgICB9CiAgICAkcmVzdWx0Lj0kY29udGVudDsKICAgICRyZXN1bHQuPSI8L3NwYW4+IjsKICAgICRyZXN1bHQuPSI8L2E+IjsgICAgICAgICAKICAgIHJldHVybiAkcmVzdWx0OwogIH0KCiAgZnVuY3Rpb24gTmVvUHJpbnRSKCRkYXRhPWFycmF5KCksJHNlbmRvdXQ9dHJ1ZSkgewogICAgJG91dHB1dD0nPGJyLz48ZGl2IHN0eWxlPSJib3JkZXI6MXB4IHNvbGlkIGJsYWNrIj4nOwogICAgJG91dHB1dC49IjxwcmU+IjsKICAgICRvdXRwdXQuPXByaW50X3IoJGRhdGEsdHJ1ZSk7CiAgICAkb3V0cHV0Lj0iPC9wcmU+IjsKICAgICRvdXRwdXQuPSI8L2Rpdj48YnIvPiI7CiAgICBpZiAoJHNlbmRvdXQpIHsKICAgICAgZWNobyAkb3V0cHV0OwogICAgfQogICAgcmV0dXJuICRvdXRwdXQ7CiAgfQoKICAvKgogICAqCiAgICogU21hcnR5IHNob3J0Y3V0cwogICAqCiAgICovCiAgZnVuY3Rpb24gU21hcnR5QXNzaWduKCRzbWFydHlpbmZvLCAkc21hcnR5Y29udGVudD0iIikgewogICAgaWYgKCFpc19hcnJheSgkc21hcnR5aW5mbykpIHsKICAgICAgaWYgKCRzbWFydHlpbmZvIT0iIiAmJiAkc21hcnR5Y29udGVudCE9IiIpIHsKICAgICAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJHNtYXJ0eWluZm8sICRzbWFydHljb250ZW50KTsKICAgICAgfSBlbHNlIHsKICAgICAgICBpZiAoJHNtYXJ0eWluZm89PSIiKSB7CiAgICAgICAgICByZXR1cm4gJHRoaXMtPkVycm9yKCJmdW5jdGlvbiBTbWFydHlBc3NpZ246IHNtYXJ0eS12YXJuYW1lIG5vdCBzZXQiLGZhbHNlLGFycmF5KCJzbWFydHlpbmZvIj0+JHNtYXJ0eWluZm8sInNtYXJ0eWNvbnRlbnQiPT4kc21hcnR5Y29udGVudCkpOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIC8vT2sgaXQncyBhbiBhcnJheQogICAgaWYgKGlzX2Fzc29jKCRzbWFydHlpbmZvKSkgewogICAgICAvL0l0J3MgYW4gYXNzb2NfYXJyYXksIHNvIHdlIGFzc2lnbiBldmVyeSBzaW5nbGUgcGFpciBvZiBpbmZvCiAgICAgIGZvcmVhY2goJHNtYXJ0eWluZm8gYXMgJHNtYXJ0eW5hbWU9PiRzbWFydHljb250ZW50KSB7CiAgICAgICAgaWYgKGlzX2FycmF5KCRzbWFydHljb250ZW50KSkgewogICAgICAgICAgLy9pdCdzIGEgbmVzdGVkIGFycmF5CiAgICAgICAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ25fYnlfcmVmKCRzbWFydHluYW1lLCAkc21hcnR5Y29udGVudCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICR0aGlzLT5zbWFydHktPmFzc2lnbigkc21hcnR5bmFtZSwgJHNtYXJ0eWNvbnRlbnQpOwogICAgICAgIH0KICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgLy9JdCdzIG5vdCBhbiBhc3NvY19hcnJheSwgc28gd2Ugc2ltcGx5IHJlZi1hc3NpZ24gaXQuCiAgICAgICR0aGlzLT5zbWFydHktPmFzc2lnbl9ieV9yZWYoJHNtYXJ0eWluZm8sICRzbWFydHljb250ZW50KTsKICAgIH0KICAgIHJldHVybiB0cnVlOwogIH0KCiAgZnVuY3Rpb24gTmVvU21hcnR5QXNzaWduKCRzbWFydHlpbmZvLCAkc21hcnR5Y29udGVudD0iIikgewogICAgJHRoaXMtPlNtYXJ0eUFzc2lnbigkc21hcnR5aW5mbywgJHNtYXJ0eWNvbnRlbnQpOwogIH0KCiAgZnVuY3Rpb24gU21hcnR5QXNzaWduUHJlZigkc21hcnR5bmFtZSwgJHByZWZlcmVuY2VuYW1lPSIiKSB7CiAgICBpZiAoJHByZWZlcmVuY2VuYW1lIT0iIikgewogICAgICAkdGhpcy0+U21hcnR5QXNzaWduKCRzbWFydHluYW1lLCAkdGhpcy0+UHJlZigkcHJlZmVyZW5jZW5hbWUpKTsKICAgIH0gZWxzZSB7CiAgICAgICR0aGlzLT5TbWFydHlBc3NpZ24oJHNtYXJ0eW5hbWUsICR0aGlzLT5QcmVmKCRzbWFydHluYW1lKSk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBTbWFydHlBc3NpZ25DTVMoJG1vZHVsZSwkc21hcnR5bmFtZT0ibW9kdWxlIikgewogICAgaWYgKGlzX29iamVjdCgkbW9kdWxlKSkgewogICAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ25fYnlfcmVmKCRzbWFydHluYW1lLCAkbW9kdWxlKTsKICAgIH0gZWxzZSB7CiAgICAgICR0aGlzLT5zbWFydHktPmFzc2lnbl9ieV9yZWYoJHNtYXJ0eW5hbWUsICR0aGlzLT5HZXRNb2R1bGVJbnN0YW5jZSgkbW9kdWxlKSk7CiAgICB9CiAgfQoKICAvKgogICAqCiAgICogRGVidWdnaW5nIGZ1bmN0aW9ucwogICAqCiAgICovCgogIGZ1bmN0aW9uIEZpcmVEZWJ1ZygkY29tbWFuZCwkbWVzc2FnZT0iIiwkdmFyaWFibGVzPWFycmF5KCkpIHsKICAgICRmaXJlcGhwbW9kdWxlPSR0aGlzLT5HZXRNb2R1bGVJbnN0YW5jZSgnRmlyZVBIUERlYnVnJyk7CiAgICBpZiAoJGZpcmVwaHBtb2R1bGUpIHsKICAgICAgLy9Nb2R1bGUgZm91bmQKICAgICAgJGZpcmVwaHBtb2R1bGUtPlNldE1vZHVsZU5hbWUoJHRoaXMtPkdldE5hbWUoKSk7CiAgICAgICRmaXJlcGhwbW9kdWxlLT5Db21tYW5kKCRjb21tYW5kLCAkbWVzc2FnZSwgJHZhcmlhYmxlcyk7CiAgICB9IC8vZWxzZSBNb2R1bGUgbm90IGZvdW5kfQogIH0KCgogIC8qCiAgICoKICAgKiBFcnJvciBoYW5kbGluZwogICAqCiAgICovCiAgZnVuY3Rpb24gRXJyb3IoJGVycm9ydGV4dCwkcmV0dXJudmFsdWU9ZmFsc2UsJHBhcmFtcz1hcnJheSgpKSB7CiAgICAkdGhpcy0+X2Vycm9ycy49JHRleHQ7CiAgICBpZiAoIWVtcHR5KCRwYXJhbXMpICYmIGlzX2FycmF5KCRwYXJhbXMpKSB7CiAgICAgICR0aGlzLT5fZXJyb3JzLj0iICgiOwogICAgICAkZmlyc3Q9dHJ1ZTsgLy9IYW5kbGluZyB0aGUgY29tbWEKICAgICAgZm9yZWFjaCAoJHBhcmFtcyBhcyAkcGFyYW09PiR2YWx1ZSkgewogICAgICAgIGlmICgkZmlyc3QpICRmaXJzdD1mYWxzZTsgZWxzZSAkdGhpcy0+X2Vycm9ycy49IiwiOwogICAgICAgICR0aGlzLT5fZXJyb3JzLj0kcGFyYW0uIj0+Ii4kdmFsdWU7CiAgICAgIH0KICAgICAgJHRoaXMtPl9lcnJvcnMuPSIpIjsKICAgIH0KICAgICR0aGlzLT5fZXJyb3JzLj0iXG4iOwogICAgcmV0dXJuICRyZXR1cm52YWx1ZTsKICB9CgogIGZ1bmN0aW9uIEdldEVycm9ycygkbmwyYnI9dHJ1ZSwkY2xlYXI9dHJ1ZSwkaW5jbHVkZWRzPXRydWUpIHsKICAgICRlcnJvcnM9JHRoaXMtPl9lcnJvcnM7CiAgICBpZiAoJG5sMmJyKSB7CiAgICAgICRlcnJvcnM9bmwyYnIoJGVycm9ycyk7CiAgICB9CiAgICBpZiAoJGluY2x1ZGVkcykgewogICAgICBpZiAoJHRoaXMtPkRTSW5FcnJvcigpKSB7CiAgICAgICAgJGVycm9ycy49JHRoaXMtPkdldERTRXJyb3JzKCRubDJiciwkY2xlYXIpOwogICAgICB9CiAgICB9CiAgICBpZiAoJGNsZWFyKSB7CiAgICAgICR0aGlzLT5fZXJyb3JzPSIiOwogICAgfQogICAgcmV0dXJuICRlcnJvcnM7CiAgfQoKICBmdW5jdGlvbiBPdXRwdXRFcnJvcnMoJGNsZWFyPXRydWUsJGluY2x1ZGVkcz10cnVlKSB7CiAgICBpZiAoJHRoaXMtPkluRXJyb3IoKSkgewogICAgICBlY2hvICJcblxuPGRpdiBzdHlsZT0nYm9yZGVyOjNweCBzb2xpZCByZWQ+XG4iOwogICAgICBlY2hvICR0aGlzLT5HZXRFcnJvcnModHJ1ZSwkY2xlYXIsJGluY2x1ZGVkcyk7CiAgICAgIGVjaG8gIlxuPC9kaXY+XG5cbiI7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBJbkVycm9yKCkgewogICAgcmV0dXJuICgkdGhpcy0+X2Vycm9ycyE9IiIpOwogIH0KCn0KPz4K]]></data>
	</file>
	<file>
	  <filename>/templates/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/templates/changelog.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PHVsPgo8bGk+dmVyc2lvbiAwLjIuMzxici8+Ck5vdyBwb3NzaWJsZSB0byByZWdpc3RlciAkcGFyYW1zIGZvciBldmVuIGVhc2llciBzeW50YXggaW4gcmVsZXZhbnQgZnVuY3Rpb25zIGxpa2UgTlBWCjxici8+CkFkZGVkIENyZWF0ZUlucHV0UGFzc3dvcmQtd3JhcHBlcgo8YnIvPgpBZGRlZCBmaWxsIHBhcmFtZXRlciB0byBTZXRFbnRpdHlQcm9wc0Zyb21BcnJheQoKCjxsaT52ZXJzaW9uIDAuMi4yPGJyLz4KQWRkZWQgYSBjdXN0b20gcmV0dXJudmFsdWUgdG8gY2hlY2tlbnRpdHljb25uZWN0aW9ucwo8YnIvPgpJbXBsZW1lbnRlZCBNYWtlU2ltcGxlQXJyYXkKPGJyLz4KQWRkZWQgTmVvVHJ1ZUljb24gYW5kICBOZW9UcnVlSWNvbiAKCjxsaT52ZXJzaW9uIDAuMi4xPGJyLz4KYWRkZWQgYXJyYXlfZGlmZl9rZXkgaW1wbGVtZW50YXRpb24gZm9yIHByZS01LjEuMCB2ZXJzaW9uCjxici8+CkFkZGVkICRhbHdheXNyZXR1cm5hcnJheT1mYWxzZSB0byBHZXRFbnRpdGllcyhGdWxsKS1tZXRob2RzCjxici8+CkFkZGVkIFNtYXJ0QXNzaWduUHJlZi1tZXRob2QKPGJyLz4KQWRkZWQgVG9vbHRpcC1TdXBwb3J0Cjxici8+CkFkZGVkIE5lb1JlZGlyZWN0LWZ1bmN0aW9uCgogIDxsaT52ZXJzaW9uIDAuMi4wPGJyLz4KLSBnZW5lcmFsIGJ1Z2ZpeGluZzxici8+Ci0gQWRkZWQgYSBOZW9EaXJMaXN0LWZ1bmN0aW9uPGJyLz4KLSBGaXhlZCBuYW1lIGVycm9yIG9uIE5lb0lucHV0RHJvcGRvd248YnIvPgotIGFkZGVkIHN1cHBvcnQgZm9yIDNyZCBwYXJhbWV0ZXIgdG8gU2xhc2gtZnVuY3Rpb248YnIvPgotIGFkZGVkIE5lb0Ntc0xpbmsgYW5kIE5lb0Ntc1VybCBzaG9ydGN1dHM8YnIvPgotIGFkZGVkIFNtYXJ0eVVwbG9hZEZvcm1TdGFydDxici8+Ci0gYWRkZWQgU21hcnR5SW5wdXRNdWx0aUhpZGRlbjxici8+CgogIDwvbGk+CiAgPGxpPnZlcnNpb24gMC4xLjA8YnIvPgogICAtIGluaXRpYWwgcmVsZWFzZTwvbGk+CjwvdWw+]]></data>
	</file>
	<file>
	  <filename>/templates/help.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PHN0cm9uZz5Ob3RpY2UhIFRoaXMgaXMgYSBtb2R1bGUtZGV2ZWxvcGVyLW9ubHkgbW9kdWxlLiBJZiB5b3UgYXJlIG5vdCBhIGRldmVsb3Blcgp5b3UnbGwgcHJvYmFibHkganVzdCB3YW50IHRvIHNraXAgdGhlIGdvcnkgZGV0YWlscyBvZiB0aGlzIHBhZ2UgYW5kIHJlbHkgb24gdGhhdAp0aGUgbW9kdWxlIGp1c3QgZG9lcyBpdCdzIHdvcmsuPC9zdHJvbmc+CjxoMz5QdXJwb3NlIG9mIHRoZSBtb2R1bGU8L2gzPgpUaGUgcHVycG9zZSBvZiB0aGlzIG1vZHVsZSBpcyB0byBjdXQgb2ZmIG9uIGRldmVsb3BtZW50dGltZSBwcm92aWRpbmcgc29tZQplYXN5IHRvIHVzZSBmdW5jdGlvbnMgZXh0ZW5kaW5nIHRoZSBtb2R1bGUtQVBJIG9mIENNUyBNYWRlIFNpbXBsZS4gVGhpcyBpbmNsdWRlcywKYnV0IGlzIG5vIGxpbWl0ZWQgdG8sIHNob3J0Y3V0cyB0byBOZW9EYXRhU3RvcmFnZS1mdW5jaW9uYWxpdHksIGEgY291cGxlIG9mIG5pY2UKU21hcnR5LXNob3J0Y3V0cywgRmlyZVBIUC1pbnRlZ3JhdGlvbiBldGMuCjxoMz5Vc2FnZSBvZiB0aGUgbW9kdWxlPC9oMz4KVG8gdXNlIHRoaXMgZXh0ZW5kZWQgbW9kdWxlLWNsYXNzIHlvdSBzaG91bGQgaW5oZXJpdCBmcm9tIE5lb01vZHVsZS1jbGFzcyBpbnN0ZWFkCm9mIHRoZSB1c3VhbCBDTVNNb2R1bGUtY2xhc3MuIFRoaXMgY2FuIGJlIGRvbmUgbGlrZSB0aGlzOgo8cHJlPgpyZXF1aXJlX29uY2UoZGlybmFtZShkaXJuYW1lKF9fRklMRV9fKSkuIi9OZW9Nb2R1bGUvTmVvTW9kdWxlLm1vZHVsZS5waHAiKTsKY2xhc3MgTXlNb2R1bGUgZXh0ZW5kcyBOZW9Nb2R1bGUgewo8L3ByZT4KSWYgeW91IHdpc2ggdG8gdXNlIHRoZSBOZXdEYXRhU3RvcmFnZSBmdW5jdGlvbmFsaXR5LCB5b3Ugc2hvdWxkIG9mIGNvdXJzZSBhbHNvCmluc3RhbGwgdGhhdCBtb2R1bGUuCjxoMz5Ib3cgdG8gZ2V0IGhlbHA8L2gzPgpJIHdpbGwgcmVwZWF0LCB0aGlzIG1vZHVsZSBpcyBmb3IgZGV2ZWxvcGVycyBvbmx5LiBJZiB5b3UgY2Fubm90IHJlYWQgcGhwLXNvdXJjZSBjb2RlLAp5b3Ugc2hvdWxkIHVzZSBpdCBmb3IgZGV2ZWxvcG1lbnQgYW55d2F5LiBJZiB5b3UgY2FuLCBhbHdheXMgY2hlY2sgb3V0IHRoZSBjb2RlIApmb3IgaGludHMgb24gaG93IHRvIG1ha2UgaXQgd29yay4gSWYgeW91IHN0aWxsIGhhdmUgcXVlc3Rpb25zIG9yIHN1Z2dlc3Rpb25zIGZvcgpmaXhlcy9pbXByb3ZlbWVudHMsIHBsZWFzZSBmZWVsIGZyZWUgdG8gY2F0Y2ggbWUgKFNpbG1hcmlsbGlvbikgaW4gdGhlIGZvcnVtIG9nICNpcmMuCgo8aDM+TGlzdCBvZiBtZXRob2RzPC9oMz4KSSB3aWxsIHRyeSB0byBrZWVwIHRoaXMgbGlzdCB1cHRvZGF0ZSwgYnV0IGZvciBtb3N0IHJlY2VudCBsaXN0LCBwbGVhc2UKY2hlY2sgdGhlIE5lb01vZHVsZS5tb2R1bGUucGhwLWZpbGUgaXRzZWxmLiBTb21lIGRvY3VtZW50YXRpb24gb2YgdGhlIG1ldGhvZHMKbWF5IGV2ZW4gc25lYWsgaW4gdGhlcmUgc29tIGRheS4KPHByZT4KLyoKICoKICogU2V0dXAgZnVuY3Rpb25zCiAqCiAqLwoKZnVuY3Rpb24gU2V0SWQoJGlkKQpmdW5jdGlvbiBOZW9TZXRJZCgkaWQpCgoKICAvKgogICAqCiAgICogR2VuZXJhbCBzaG9ydGN1dCBmdW5jdGlvbnMKICAgKgogICAqLwpmdW5jdGlvbiBQcmVmKCRwcmVmbmFtZSwkZGVmYXVsdD0iIikKZnVuY3Rpb24gTmVvQ21zTGluaygkcGFyYW1zPWFycmF5KCkpCmZ1bmN0aW9uIE5lb0Ntc1VybCgkcGFyYW1zPWFycmF5KCkpCmZ1bmN0aW9uIE5lb1JlZGlyZWN0KCRwYXJhbXM9YXJyYXkoKSkKLyoKICoKICogRm9ybS1nZW5lcmF0aW9uIGZ1bmN0aW9ucwogKgogKi8KCmZ1bmN0aW9uIE5lb0Zvcm1TdGFydCgkcGFyYW1zPWFycmF5KCkpCmZ1bmN0aW9uIE5lb0Zvcm1FbmQoJHBhcmFtcz1hcnJheSgpKQpmdW5jdGlvbiBOZW9JbnB1dFRleHQoJHBhcmFtcz1hcnJheSgpCmZ1bmN0aW9uIE5lb1RleHRhcmVhKCRwYXJhbXM9YXJyYXkoKSkKZnVuY3Rpb24gTmVvSW5wdXRDaGVja2JveCgkcGFyYW1zPWFycmF5KCkpCmZ1bmN0aW9uIE5lb0lucHV0U3VibWl0KCRwYXJhbXM9YXJyYXkoKSkKZnVuY3Rpb24gTmVvSW5wdXRSZXNldCgkcGFyYW1zPWFycmF5KCkpCmZ1bmN0aW9uIE5lb0lucHV0SW5wdXREcm9wZG93bigkcGFyYW1zPWFycmF5KCkpCgovKiBmdW5jdGlvbiBiZWxvdyBpbmNsdWRlIHNtYXJ0eWFzc2lnbm1lbnQsIGRvZXMgbm90IHJldHVybiBhbnl0aGluZyAqLwpmdW5jdGlvbiBTbWFydHlGb3JtU3RhcnQoJHNtYXJ0eW5hbWUsJHBhcmFtcz1hcnJheSgpKQpmdW5jdGlvbiBTbWFydHlVcGxvYWRGb3JtU3RhcnQoJHNtYXJ0eW5hbWUsJHBhcmFtcz1hcnJheSgpKQpmdW5jdGlvbiBTbWFydHlGb3JtRW5kKCRzbWFydHluYW1lKQpmdW5jdGlvbiBTbWFydHlJbnB1dFN1Ym1pdCgkc21hcnR5bmFtZSwkbmFtZSwkdGV4dCwkY29uZmlybXRleHQ9IiIpCmZ1bmN0aW9uIFNtYXJ0eUlucHV0SGlkZGVuKCRzbWFydHluYW1lLCRuYW1lLCR2YWx1ZSkKZnVuY3Rpb24gU21hcnR5SW5wdXRNdWx0aUhpZGRlbigkc21hcnR5bmFtZSwkZmllbGRzPWFycmF5KCkpCgovKgogKgogKiBOZW9EYXRhU3RvcmFnZSBzaG9ydGN1dHMKICoKICovCmZ1bmN0aW9uIEFkZEVudGl0eSgkdGFibGUsICRwcm9wcz1hcnJheSgpKQpmdW5jdGlvbiBEZWxldGVFbnRpdHkoJGlkKQpmdW5jdGlvbiBHZXRFbnRpdHkoJGlkLCAkb3ZlcnJpZGVwcm9wcz1hcnJheSgpKQpmdW5jdGlvbiBHZXRFbnRpdGllcygkdGFibGU9IiIsICRjcml0ZXJpYT1hcnJheSgpLCAkYWx3YXlzcmV0dXJuYXJyYXk9ZmFsc2UpCmZ1bmN0aW9uIEdldE9uZUVudGl0eSgkdGFibGUsICRjcml0ZXJpYT1hcnJheSgpLCAkZmFpbGlmbXVsdGlwbGU9ZmFsc2UpCmZ1bmN0aW9uIEdldEVudGl0aWVzRnVsbCgkdGFibGU9IiIsICRjcml0ZXJpYT1hcnJheSgpLCAkYWx3YXlzcmV0dXJuYXJyYXk9ZmFsc2UpCmZ1bmN0aW9uIFNldEVudGl0eVByb3AoJGlkLCRwcm9wbmFtZSwkcHJvcHZhbHVlLCRwcm9wdHlwZT0idW5kZWZpbmVkIikKZnVuY3Rpb24gQ2xlYXJFbnRpdHlQcm9wKCRpZCwgJHByb3BuYW1lKQpmdW5jdGlvbiBTZXRFbnRpdHlQcm9wcygkaWQsICRwcm9wcywgJGNsZWFyPXRydWUpCmZ1bmN0aW9uIFNldEVudGl0eVByb3BzRnJvbUFycmF5KCRpZCwgJHByb3BzLCAkdmFsdWVzLCAkY2xlYXI9dHJ1ZSwgJGZpbGw9ZmFsc2UpCmZ1bmN0aW9uIFNldEVudGl0eVByb3BzT25Dcml0ZXJpYSgkdGFibGUsICRwcm9wcywgJGNyaXRlcmlhLCAkY3JlYXRlPXRydWUsICRjbGVhcj1mYWxzZSkgLy9Eb2VzIG5vdCB3b3JrCmZ1bmN0aW9uIFJlc2V0RW50aXR5UHJvcHMoJGlkLCAkbmV3cHJvcHM9YXJyYXkoKSkKZnVuY3Rpb24gUmVtb3ZlTW9kdWxlRW50aXRpZXMoKQpmdW5jdGlvbiBDbGVhckVudGl0eVByb3BzKCRpZCkKZnVuY3Rpb24gQ29tcGFyZUVudGl0aWVzKCRlbnRpdHkxLCAkZW50aXR5MiwgJHNvcnRmaWVsZCkKZnVuY3Rpb24gQ29tcGFyZUVudGl0aWVzQ29tcGxleCgkZW50aXR5MSwgJGVudGl0eTIsICRzb3J0ZmllbGRzKQpmdW5jdGlvbiBTb3J0RW50aXRpZXMoJGxpc3QsICRzb3J0ZmllbGRzKQpmdW5jdGlvbiBFbnRpdGllc0NvdW50KCR0YWJsZT0iIiwgJGNyaXRlcmlhPWFycmF5KCkpCmZ1bmN0aW9uIENsZWFyTW9kdWxlRW50aXRpZXMoKQpmdW5jdGlvbiBTZXRFbnRpdHlDb25uZWN0aW9uKCRpZDEsICRpZDIsICR0eXBlPSIiKQpmdW5jdGlvbiBDbGVhckVudGl0eUNvbm5lY3Rpb25zKCRpZDEsICRpZDI9LTEsICR0eXBlPSIiKQpmdW5jdGlvbiBDbGVhckVudGl0eUNvbm5lY3Rpb24oJGlkMSwgJGlkMiwgJHR5cGU9IiIpCmZ1bmN0aW9uIENoZWNrRW50aXR5Q29ubmVjdGlvbigkaWQxLCRpZDIsJHR5cGU9IiIsJHJldHVybnZhbHVlPXRydWUpCmZ1bmN0aW9uIEdldEVudGl0eUNvbm5lY3Rpb25zKCRpZDEsICRpZDI9LTEsICR0eXBlPSIiKQpmdW5jdGlvbiBBZGRGaWVsZFNldCgkbmFtZSwkZmllbGRzKQpmdW5jdGlvbiBHZXRGaWVsZFNldCgkbmFtZSkKZnVuY3Rpb24gRW50aXR5U2V0VW5zZXRQcm9wcygkZW50aXR5LCRmaWVsZHNldCwkZmlsbHZhbHVlPSIiKSB7CmZ1bmN0aW9uIEdldERTRXJyb3JzKCRubDJicj10cnVlLCRjbGVhcj10cnVlKQpmdW5jdGlvbiBPdXRwdXREU0Vycm9ycygkY2xlYXI9dHJ1ZSkKZnVuY3Rpb24gRFNJbkVycm9yKCkKZnVuY3Rpb24gTWFrZVNpbXBsZUFycmF5KCR0YWJsZSwkZmllbGQpCmZ1bmN0aW9uIE1ha2VBc3NvY0FycmF5KCR0YWJsZSwkZmllbGRzKQoKCi8qCiAqCiAqIExpbmsgYW5kIGljb24gZnVuY3Rpb25zCiAqCiAqLwoKZnVuY3Rpb24gTmVvRGVsZXRlSWNvbigkYWN0aW9uLCR0ZXh0LCRwYXJhbXM9YXJyYXkoKSwkY29uZmlybWF0aW9uPSIiKQpmdW5jdGlvbiBOZW9Db3B5SWNvbigkYWN0aW9uLCR0ZXh0LCRwYXJhbXM9YXJyYXkoKSwkY29uZmlybWF0aW9uPSIiKQpmdW5jdGlvbiBOZW9FZGl0SWNvbigkYWN0aW9uLCR0ZXh0LCRwYXJhbXM9YXJyYXkoKSwkY29uZmlybWF0aW9uPSIiKQpmdW5jdGlvbiBOZW9BZGRJY29uKCRhY3Rpb24sJHRleHQsJHBhcmFtcz1hcnJheSgpLCRjb25maXJtYXRpb249IiIpCmZ1bmN0aW9uIE5lb1RydWVJY29uKCRhY3Rpb24sJHRleHQsJHBhcmFtcz1hcnJheSgpLCRjb25maXJtYXRpb249IiIpCmZ1bmN0aW9uIE5lb0ZhbHNlSWNvbigkYWN0aW9uLCR0ZXh0LCRwYXJhbXM9YXJyYXkoKSwkY29uZmlybWF0aW9uPSIiKQpmdW5jdGlvbiBOZW9TeXN0ZW1JY29uKCRpY29uLCR0ZXh0PSIiKQoKLyoKICoKICogVXRpbGl0eSBmdW5jdGlvbnMKICoKICovCmZ1bmN0aW9uIE5lb1NsYXNoZXMoJHVybCkKZnVuY3Rpb24gU2xhc2goJHN0ciwkc3RyMj0iIiwkc3RyMz0iIikKZnVuY3Rpb24gU2xhc2hlcygkdXJsKQpmdW5jdGlvbiBpc19hc3NvYygkYXJyYXkpCmZ1bmN0aW9uIE5lb0Rpckxpc3QoJHJvb3QsJHdoYXQ9ImZpbGVzIiwkaW50cm9kdWN0aW9uPWFycmF5KCksJGV4Y2x1ZGVzPWFycmF5KCkpCgovKkNoZWNrcyBmb3IgdGhlIGV4aXN0ZW5jZSBvZiBhbiBpbmRleCBpbiBhbiBhcnJheSBhbmQgcmV0dXJuIHRoZSB2YWx1ZSBpZiBpdCdzIHRoZXJlCiAqYW5kIHRoZSBkZWZhdWx0IHZhbHVlIGlmIGl0J3Mgbm90CiovCmZ1bmN0aW9uIE5lb1BhcmFtVmFsdWUoJG5hbWUsJHBhcmFtcywkZGVmYXVsdD0iIikKCi8vU2hvcnRjdXQgZm9yIHRoZSBhYm92ZQpmdW5jdGlvbiBOUFYoJG5hbWUsICRwYXJhbXMpCmZ1bmN0aW9uIE5lb0FwcGx5UGFyYW1WYWx1ZXMoJHRoaXNhcnJheSwgJHBhcmFtcywgJGluZGV4ZXMsICRhbHdheXNmaWxsPWZhbHNlKQpmdW5jdGlvbiBDaGVja0ZpbGVFeHRlbnNpb24oJGZpbGVuYW1lLCAkYWxsb3dlZGV4dGVuc2lvbnM9YXJyYXkoKSkKCi8vRm9yIG5vdywgcmVhZCBzb3VyY2UgdG8gdW5kZXJzdGFuZApmdW5jdGlvbiBOZW9Ub29sVGlwKCRwYXJhbXM9YXJyYXkoKSkgLy9yZXF1aXJlcyAyIGNzcy1jbGFzc2VzIHRvIGJlIHNldCB1cAoKLy9zYW1lIGFzIHByaW50X3IsIGJ1dCB3cmFwcyBpbiA8cHJlPidzIGFuZCBpbiBhIGRpdiB0cnlpbmcgdG8gbWFrZSBpdCBtb3JlIHJlYWRhYmxlCmZ1bmN0aW9uIE5lb1ByaW50UigkZGF0YT1hcnJheSgpLCRzZW5kb3V0PXRydWUpCgovKgogKgogKiBTbWFydHkgc2hvcnRjdXRzCiAqCiAqLwpmdW5jdGlvbiBTbWFydHlBc3NpZ24oJHNtYXJ0eWluZm8sICRzbWFydHljb250ZW50PSIiKQpmdW5jdGlvbiBTbWFydHlBc3NpZ25QcmVmKCRzbWFydHluYW1lLCAkcHJlZmVyZW5jZW5hbWU9IiIpIHsKZnVuY3Rpb24gU21hcnR5QXNzaWduQ01TKCRtb2R1bGUsJHZhcm5hbWU9ImNtcyIpCmZ1bmN0aW9uIFNtYXJ0eVVwbG9hZEZvcm1TdGFydCgkc21hcnR5bmFtZSwkcGFyYW1zPWFycmF5KCkpIHsKCi8qCiAqCiAqIERlYnVnZ2luZyBmdW5jdGlvbnMKICoKICovCmZ1bmN0aW9uIEZpcmVEZWJ1ZygkY29tbWFuZCwkbWVzc2FnZT0iIiwkdmFyaWFibGVzPWFycmF5KCkpCgovKgogKgogKiBFcnJvciBoYW5kbGluZwogKgogKi8KZnVuY3Rpb24gRXJyb3IoJGVycm9ydGV4dCwkcmV0dXJudmFsdWU9ZmFsc2UsJHBhcmFtcz1hcnJheSgpKQpmdW5jdGlvbiBHZXRFcnJvcnMoJG5sMmJyPXRydWUsJGNsZWFyPXRydWUsJGluY2x1ZGVkcz10cnVlKQpmdW5jdGlvbiBPdXRwdXRFcnJvcnMoJGNsZWFyPXRydWUsJGluY2x1ZGVkcz10cnVlKQpmdW5jdGlvbiBJbkVycm9yKCkKPC9wcmU+]]></data>
	</file>
</module>
