<?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.7</version>
  <mincmsversion>1.8</mincmsversion>
	<help><![CDATA[PHN0cm9uZz5Ob3RpY2UhIFRoaXMgaXMgYSBtb2R1bGUtZGV2ZWxvcGVyLW9ubHkgbW9kdWxlLiBJZiB5b3UgYXJlIG5vdCBhIGRldmVsb3Blcgp5b3UnbGwgcHJvYmFibHkganVzdCB3YW50IHRvIHNraXAgdGhlIGdvcnkgZGV0YWlscyBvZiB0aGlzIHBhZ2UgYW5kIHJlbHkgb24gdGhhdAp0aGUgbW9kdWxlIGp1c3QgZG9lcyBpdCdzIHdvcmsuPC9zdHJvbmc+CjxoMz5QdXJwb3NlIG9mIHRoZSBtb2R1bGU8L2gzPgpUaGUgcHVycG9zZSBvZiB0aGlzIG1vZHVsZSBpcyB0byBjdXQgb2ZmIG9uIGRldmVsb3BtZW50dGltZSBwcm92aWRpbmcgc29tZQplYXN5IHRvIHVzZSBmdW5jdGlvbnMgZXh0ZW5kaW5nIHRoZSBtb2R1bGUtQVBJIG9mIENNUyBNYWRlIFNpbXBsZS4gVGhpcyBpbmNsdWRlcywKYnV0IGlzIG5vIGxpbWl0ZWQgdG8sIHNob3J0Y3V0cyB0byBOZW9EYXRhU3RvcmFnZS1mdW5jaW9uYWxpdHksIGEgY291cGxlIG9mIG5pY2UKU21hcnR5LXNob3J0Y3V0cywgRmlyZVBIUC1pbnRlZ3JhdGlvbiBldGMuCjxoMz5Vc2FnZSBvZiB0aGUgbW9kdWxlPC9oMz4KVG8gdXNlIHRoaXMgZXh0ZW5kZWQgbW9kdWxlLWNsYXNzIHlvdSBzaG91bGQgaW5oZXJpdCBmcm9tIE5lb01vZHVsZS1jbGFzcyBpbnN0ZWFkCm9mIHRoZSB1c3VhbCBDTVNNb2R1bGUtY2xhc3MuIFRoaXMgY2FuIGJlIGRvbmUgbGlrZSB0aGlzOgo8cHJlPgpyZXF1aXJlX29uY2UoZGlybmFtZShkaXJuYW1lKF9fRklMRV9fKSkuIi9OZW9Nb2R1bGUvTmVvTW9kdWxlLm1vZHVsZS5waHAiKTsKY2xhc3MgTXlNb2R1bGUgZXh0ZW5kcyBOZW9Nb2R1bGUgewo8L3ByZT4KSWYgeW91IHdpc2ggdG8gdXNlIHRoZSBOZXdEYXRhU3RvcmFnZSBmdW5jdGlvbmFsaXR5LCB5b3Ugc2hvdWxkIG9mIGNvdXJzZSBhbHNvCmluc3RhbGwgdGhhdCBtb2R1bGUuCjxoMz5Ib3cgdG8gZ2V0IGhlbHA8L2gzPgpJIHdpbGwgcmVwZWF0LCB0aGlzIG1vZHVsZSBpcyBmb3IgZGV2ZWxvcGVycyBvbmx5LiBJZiB5b3UgY2Fubm90IHJlYWQgcGhwLXNvdXJjZSBjb2RlLAp5b3Ugc2hvdWxkIHVzZSBpdCBmb3IgZGV2ZWxvcG1lbnQgYW55d2F5LiBJZiB5b3UgY2FuLCBhbHdheXMgY2hlY2sgb3V0IHRoZSBjb2RlIApmb3IgaGludHMgb24gaG93IHRvIG1ha2UgaXQgd29yay4gSWYgeW91IHN0aWxsIGhhdmUgcXVlc3Rpb25zIG9yIHN1Z2dlc3Rpb25zIGZvcgpmaXhlcy9pbXByb3ZlbWVudHMsIHBsZWFzZSBmZWVsIGZyZWUgdG8gY2F0Y2ggbWUgKFNpbG1hcmlsbGlvbikgaW4gdGhlIGZvcnVtIG9nICNpcmMuCgo8aDM+TGlzdCBvZiBtZXRob2RzPC9oMz4KSSB3aWxsIHRyeSB0byBrZWVwIHRoaXMgbGlzdCB1cHRvZGF0ZSwgYnV0IGZvciBtb3N0IHJlY2VudCBsaXN0LCBwbGVhc2UKY2hlY2sgdGhlIE5lb01vZHVsZS5tb2R1bGUucGhwLWZpbGUgaXRzZWxmLiBTb21lIGRvY3VtZW50YXRpb24gb2YgdGhlIG1ldGhvZHMKbWF5IGV2ZW4gc25lYWsgaW4gdGhlcmUgc29tIGRheS4KPHByZT4KLyoKICoKICogU2V0dXAgZnVuY3Rpb25zCiAqCiAqLwoKZnVuY3Rpb24gU2V0SWQoJGlkKQpmdW5jdGlvbiBOZW9TZXRJZCgkaWQpCmZ1bmN0aW9uIE5lb1NldFJldHVybklkKCRyZXR1cm5pZCkKZnVuY3Rpb24gTmVvU2V0dXAoJGlkLCRtb2R1bGUsJHJldHVybmlkPSIwIiwkcGFyYW1zPWFycmF5KCkpCmZ1bmN0aW9uIE5lb1NldFBhcmFtcygkcGFyYW1zKTsKCiAgLyoKICAgKgogICAqIEdlbmVyYWwgc2hvcnRjdXQgZnVuY3Rpb25zCiAgICoKICAgKi8KZnVuY3Rpb24gUHJlZigkcHJlZm5hbWUsJGRlZmF1bHQ9IiIpCmZ1bmN0aW9uIFNldFByZWYoJHByZWZuYW1lLCAkdmFsdWUpIHsKCi8vU2V0cyBhIHByZWZlcmVuY2UgdG8gdGhlIHZhbHVlIG9mIHRoZSBzYW1lIG5hbWUgaW4gdGhlICRwYXJhbXMtYXJyYXkgc2V0IGJ5IE5lb1NldFVwLgovL09wdGlvbmFsbHkgZGVsZXRpbmcgYXNzaWduaW5nIGEgdmFsdWUgb3IgZGVsZXRpbmcgdGhlIHByZWZlcmVuY2UgaWYgbm90IHNldCBpbiB0aGlzIGFycmF5CmZ1bmN0aW9uIE5lb1NldFByZWYoJHByZWZuYW1lLCAkbm90c2V0dmFsdWU9IiIsICRkZWxldGVpZm5vdHNldD1mYWxzZSkgewpmdW5jdGlvbiBOZW9DbXNMaW5rKCRwYXJhbXM9YXJyYXkoKSkKZnVuY3Rpb24gTmVvQ21zVXJsKCRwYXJhbXM9YXJyYXkoKSkKZnVuY3Rpb24gTmVvUmVkaXJlY3QoJGFjdGlvbj0iIiwkcGFyYW1zPWFycmF5KCkpCmZ1bmN0aW9uIE5lb1JlZGlyZWN0RnVsbCgkcGFyYW1zPWFycmF5KCkpCmZ1bmN0aW9uIE5lb0FkbWluUmV0dXJuKCRwYXJhbXM9YXJyYXkoKSkKLyoKICoKICogRm9ybS1nZW5lcmF0aW9uIGZ1bmN0aW9ucwogKgogKi8KCmZ1bmN0aW9uIE5lb0Zvcm1TdGFydCgkcGFyYW1zPWFycmF5KCkpCmZ1bmN0aW9uIE5lb0Zvcm1FbmQoJHBhcmFtcz1hcnJheSgpKQpmdW5jdGlvbiBOZW9JbnB1dFRleHQoJHBhcmFtcz1hcnJheSgpCmZ1bmN0aW9uIE5lb1RleHRhcmVhKCRwYXJhbXM9YXJyYXkoKSkKZnVuY3Rpb24gTmVvSW5wdXRDaGVja2JveCgkcGFyYW1zPWFycmF5KCkpCmZ1bmN0aW9uIE5lb0lucHV0U3VibWl0KCRwYXJhbXM9YXJyYXkoKSkKZnVuY3Rpb24gTmVvSW5wdXRSZXNldCgkcGFyYW1zPWFycmF5KCkpCmZ1bmN0aW9uIE5lb0lucHV0SW5wdXREcm9wZG93bigkcGFyYW1zPWFycmF5KCkpCgovKiBmdW5jdGlvbiBiZWxvdyBpbmNsdWRlIHNtYXJ0eWFzc2lnbm1lbnQsIGRvZXMgbm90IHJldHVybiBhbnl0aGluZyAqLwpmdW5jdGlvbiBTbWFydHlGb3JtU3RhcnQoJHNtYXJ0eW5hbWUsJHBhcmFtcz1hcnJheSgpKQpmdW5jdGlvbiBTbWFydHlVcGxvYWRGb3JtU3RhcnQoJHNtYXJ0eW5hbWUsJHBhcmFtcz1hcnJheSgpKQoKZnVuY3Rpb24gU21hcnR5Rm9ybUVuZCgkc21hcnR5bmFtZSkKZnVuY3Rpb24gU21hcnR5SW5wdXRTdWJtaXQoJHNtYXJ0eW5hbWUsJHBhcmFtcykKCmZ1bmN0aW9uIFNtYXJ0eUlucHV0VGV4dCgkc21hcnR5bmFtZSwkcGFyYW1zPWFycmF5KCkpCmZ1bmN0aW9uIFNtYXJ0eUlucHV0Q2hlY2tib3goJHNtYXJ0eW5hbWUsJHBhcmFtcz1hcnJheSgpKQoKZnVuY3Rpb24gU21hcnR5SW5wdXRIaWRkZW4oJHNtYXJ0eW5hbWUsJG5hbWUsJHZhbHVlKQpvcgpmdW5jdGlvbiBTbWFydHlJbnB1dEhpZGRlbigkc21hcnR5bmFtZSwkcGFyYW1zKQoKZnVuY3Rpb24gU21hcnR5SW5wdXRNdWx0aUhpZGRlbigkc21hcnR5bmFtZSwkZmllbGRzPWFycmF5KCkpCgovKgogKgogKiBOZW9EYXRhU3RvcmFnZSBzaG9ydGN1dHMKICoKICovCmZ1bmN0aW9uIEFkZEVudGl0eSgkdGFibGUsICRwcm9wcz1hcnJheSgpKQpmdW5jdGlvbiBEZWxldGVFbnRpdHkoJGlkKQpmdW5jdGlvbiBHZXRFbnRpdHkoJGlkLCAkb3ZlcnJpZGVwcm9wcz1hcnJheSgpKQpmdW5jdGlvbiBHZXRFbnRpdGllcygkdGFibGU9IiIsICRjcml0ZXJpYT1hcnJheSgpLCAkYWx3YXlzcmV0dXJuYXJyYXk9ZmFsc2UpCmZ1bmN0aW9uIEdldE9uZUVudGl0eSgkdGFibGUsICRjcml0ZXJpYT1hcnJheSgpLCAkZmFpbGlmbXVsdGlwbGU9ZmFsc2UpCmZ1bmN0aW9uIEdldEVudGl0aWVzRnVsbCgkdGFibGU9IiIsICRjcml0ZXJpYT1hcnJheSgpLCAkYWx3YXlzcmV0dXJuYXJyYXk9ZmFsc2UpCmZ1bmN0aW9uIFNldEVudGl0eVByb3AoJGlkLCRwcm9wbmFtZSwkcHJvcHZhbHVlLCRwcm9wdHlwZT0idW5kZWZpbmVkIikKZnVuY3Rpb24gQ2xlYXJFbnRpdHlQcm9wKCRpZCwgJHByb3BuYW1lKQpmdW5jdGlvbiBTZXRFbnRpdHlQcm9wcygkaWQsICRwcm9wcywgJGNsZWFyPXRydWUpCmZ1bmN0aW9uIFNldEVudGl0eVByb3BzRnJvbUFycmF5KCRpZCwgJHByb3BzLCAkdmFsdWVzLCAkY2xlYXI9dHJ1ZSwgJGZpbGw9ZmFsc2UpCmZ1bmN0aW9uIFNldEVudGl0eVByb3BzT25Dcml0ZXJpYSgkdGFibGUsICRwcm9wcywgJGNyaXRlcmlhLCAkY3JlYXRlPXRydWUsICRjbGVhcj1mYWxzZSkgLy9Eb2VzIG5vdCB3b3JrCmZ1bmN0aW9uIFJlc2V0RW50aXR5UHJvcHMoJGlkLCAkbmV3cHJvcHM9YXJyYXkoKSkKZnVuY3Rpb24gUmVtb3ZlTW9kdWxlRW50aXRpZXMoKQpmdW5jdGlvbiBDbGVhckVudGl0eVByb3BzKCRpZCkKZnVuY3Rpb24gQ29tcGFyZUVudGl0aWVzKCRlbnRpdHkxLCAkZW50aXR5MiwgJHNvcnRmaWVsZCkKZnVuY3Rpb24gQ29tcGFyZUVudGl0aWVzQ29tcGxleCgkZW50aXR5MSwgJGVudGl0eTIsICRzb3J0ZmllbGRzKQpmdW5jdGlvbiBTb3J0RW50aXRpZXMoJGxpc3QsICRzb3J0ZmllbGRzKQpmdW5jdGlvbiBFbnRpdGllc0NvdW50KCR0YWJsZT0iIiwgJGNyaXRlcmlhPWFycmF5KCkpCmZ1bmN0aW9uIENsZWFyTW9kdWxlRW50aXRpZXMoKQpmdW5jdGlvbiBTZXRFbnRpdHlDb25uZWN0aW9uKCRpZDEsICRpZDIsICR0eXBlPSIiKQpmdW5jdGlvbiBDbGVhckVudGl0eUNvbm5lY3Rpb25zKCRpZDEsICRpZDI9LTEsICR0eXBlPSIiKQpmdW5jdGlvbiBDbGVhckVudGl0eUNvbm5lY3Rpb24oJGlkMSwgJGlkMiwgJHR5cGU9IiIpCmZ1bmN0aW9uIENoZWNrRW50aXR5Q29ubmVjdGlvbigkaWQxLCRpZDIsJHR5cGU9IiIsJHJldHVybnZhbHVlPXRydWUpCmZ1bmN0aW9uIEdldEVudGl0eUNvbm5lY3Rpb25zKCRpZDEsICRpZDI9LTEsICR0eXBlPSIiKQpmdW5jdGlvbiBBZGRGaWVsZFNldCgkbmFtZSwkZmllbGRzKQpmdW5jdGlvbiBHZXRGaWVsZFNldCgkbmFtZSkKZnVuY3Rpb24gRW50aXR5U2V0VW5zZXRQcm9wcygkZW50aXR5LCRmaWVsZHNldCwkZmlsbHZhbHVlPSIiKSB7CmZ1bmN0aW9uIEdldERTRXJyb3JzKCRubDJicj10cnVlLCRjbGVhcj10cnVlKQpmdW5jdGlvbiBPdXRwdXREU0Vycm9ycygkY2xlYXI9dHJ1ZSkKZnVuY3Rpb24gRFNJbkVycm9yKCkKZnVuY3Rpb24gTWFrZVNpbXBsZUFycmF5KCR0YWJsZSwkZmllbGQpCmZ1bmN0aW9uIE1ha2VBc3NvY0FycmF5KCR0YWJsZSwkZmllbGRzKQoKCi8qCiAqCiAqIExpbmsgYW5kIGljb24gZnVuY3Rpb25zCiAqCiAqLwoKZnVuY3Rpb24gTmVvRGVsZXRlSWNvbigkYWN0aW9uLCR0ZXh0LCRwYXJhbXM9YXJyYXkoKSwkY29uZmlybWF0aW9uPSIiKQpmdW5jdGlvbiBOZW9Db3B5SWNvbigkYWN0aW9uLCR0ZXh0LCRwYXJhbXM9YXJyYXkoKSwkY29uZmlybWF0aW9uPSIiKQpmdW5jdGlvbiBOZW9FZGl0SWNvbigkYWN0aW9uLCR0ZXh0LCRwYXJhbXM9YXJyYXkoKSwkY29uZmlybWF0aW9uPSIiKQpmdW5jdGlvbiBOZW9BZGRJY29uKCRhY3Rpb24sJHRleHQsJHBhcmFtcz1hcnJheSgpLCRjb25maXJtYXRpb249IiIpCmZ1bmN0aW9uIE5lb1RydWVJY29uKCRhY3Rpb24sJHRleHQsJHBhcmFtcz1hcnJheSgpLCRjb25maXJtYXRpb249IiIpCmZ1bmN0aW9uIE5lb0ZhbHNlSWNvbigkYWN0aW9uLCR0ZXh0LCRwYXJhbXM9YXJyYXkoKSwkY29uZmlybWF0aW9uPSIiKQpmdW5jdGlvbiBOZW9TeXN0ZW1JY29uKCRpY29uLCR0ZXh0PSIiKQoKLyoKICoKICogVXRpbGl0eSBmdW5jdGlvbnMKICoKICovCmZ1bmN0aW9uIE5lb1NsYXNoZXMoJHVybCkKZnVuY3Rpb24gRGVjb2RlSFRNTEVudGl0aWVzKCRzKQpmdW5jdGlvbiBTbGFzaCgkc3RyLCRzdHIyPSIiLCRzdHIzPSIiKQpmdW5jdGlvbiBTbGFzaGVzKCR1cmwpCmZ1bmN0aW9uIGlzX2Fzc29jKCRhcnJheSkKZnVuY3Rpb24gTmVvRGlyTGlzdCgkcm9vdCwkd2hhdD0iZmlsZXMiLCRpbnRyb2R1Y3Rpb249YXJyYXkoKSwkZXhjbHVkZXM9YXJyYXkoKSkKCi8qQ2hlY2tzIGZvciB0aGUgZXhpc3RlbmNlIG9mIGFuIGluZGV4IGluIGFuIGFycmF5IGFuZCByZXR1cm4gdGhlIHZhbHVlIGlmIGl0J3MgdGhlcmUKICphbmQgdGhlIGRlZmF1bHQgdmFsdWUgaWYgaXQncyBub3QKKi8KZnVuY3Rpb24gTmVvUGFyYW1WYWx1ZSgkbmFtZSwkcGFyYW1zLCRkZWZhdWx0PSIiKQoKLy9TaG9ydGN1dCBmb3IgdGhlIGFib3ZlCmZ1bmN0aW9uIE5QVigkbmFtZSwgJHBhcmFtcykKZnVuY3Rpb24gTmVvQXBwbHlQYXJhbVZhbHVlcygkdGhpc2FycmF5LCAkcGFyYW1zLCAkaW5kZXhlcywgJGFsd2F5c2ZpbGw9ZmFsc2UpCmZ1bmN0aW9uIENoZWNrRmlsZUV4dGVuc2lvbigkZmlsZW5hbWUsICRhbGxvd2VkZXh0ZW5zaW9ucz1hcnJheSgpKQoKLy9Gb3Igbm93LCByZWFkIHNvdXJjZSB0byB1bmRlcnN0YW5kCmZ1bmN0aW9uIE5lb1Rvb2xUaXAoJHBhcmFtcz1hcnJheSgpKSAvL3JlcXVpcmVzIDIgY3NzLWNsYXNzZXMgdG8gYmUgc2V0IHVwCgovL0NoZWNrcyBib3RoIHdoZXRoZXIgdGhlIGluZGV4IGV4aXN0cyBpbiB0aGUgYXJyYXkgYW5kIHdoZXRoZXIgaXQgaGFzIGEgdmFsdWUgZGlmZmVyZW50IGZvbXIgbm90aGluZyBvdCBvbmx5IHNwYWNlcwpmdW5jdGlvbiBOZW9FbXB0eSgkaW5kZXg9IiIsJGRhdGE9YXJyYXkoKSkKCi8vVmFsaWRhdGVzIGFuIGVtYWlsYWRyZXNzLCBvcHRpb25hbGx5IGF2b2lkaW5nIGNoZWNraW5nIHRoZSBteC1hdmFpbGFiaWxpdHkgb2YgdGhlIGRvbWFpbgpmdW5jdGlvbiBOZW9WYWxpZGF0ZUVtYWlsKCRlbWFpbCwgJGF2b2lkb25saW5lID0gZmFsc2UpCgovL1ZhbGlkYXRlcyBhbiB1cmwKZnVuY3Rpb24gTmVvVmFsaWRhdGVVUkwoJHVybCkgewoKLy9SZXR1cm5zIGEgdmVyc2lvbiBvZiB0aGUgc3RyaW5nIHdoaWNoIGNhbm5vdCAocGVyaGFwcykgYmUgbGluZS1icm9rZW4KZnVuY3Rpb24gTmVvTm9CcmVha3MoJHN0cmluZykKCi8vc2FtZSBhcyBwcmludF9yLCBidXQgd3JhcHMgaW4gPHByZT4ncyBhbmQgaW4gYSBkaXYgdHJ5aW5nIHRvIG1ha2UgaXQgbW9yZSByZWFkYWJsZQpmdW5jdGlvbiBOZW9QcmludFIoJGRhdGE9YXJyYXkoKSwkc2VuZG91dD10cnVlKQoKLyoKICoKICogU21hcnR5IHNob3J0Y3V0cwogKgogKi8KZnVuY3Rpb24gU21hcnR5QXNzaWduKCRzbWFydHlpbmZvLCAkc21hcnR5Y29udGVudD0iIikKZnVuY3Rpb24gU21hcnR5QXNzaWduUHJlZigkc21hcnR5bmFtZSwgJHByZWZlcmVuY2VuYW1lPSIiKSB7CmZ1bmN0aW9uIFNtYXJ0eUFzc2lnbkNNUygkbW9kdWxlLCR2YXJuYW1lPSJjbXMiKQpmdW5jdGlvbiBTbWFydHlVcGxvYWRGb3JtU3RhcnQoJHNtYXJ0eW5hbWUsJHBhcmFtcz1hcnJheSgpKSB7CgovKgogKgogKiBEZWJ1Z2dpbmcgZnVuY3Rpb25zCiAqCiAqLwpmdW5jdGlvbiBGaXJlRGVidWcoJGNvbW1hbmQsJG1lc3NhZ2U9IiIsJHZhcmlhYmxlcz1hcnJheSgpKQoKLyoKICoKICogRXJyb3IgaGFuZGxpbmcKICoKICovCmZ1bmN0aW9uIEVycm9yKCRlcnJvcnRleHQsJHJldHVybnZhbHVlPWZhbHNlLCRwYXJhbXM9YXJyYXkoKSkKZnVuY3Rpb24gR2V0RXJyb3JzKCRubDJicj10cnVlLCRjbGVhcj10cnVlLCRpbmNsdWRlZHM9dHJ1ZSkKZnVuY3Rpb24gT3V0cHV0RXJyb3JzKCRjbGVhcj10cnVlLCRpbmNsdWRlZHM9dHJ1ZSkKZnVuY3Rpb24gSW5FcnJvcigpCjwvcHJlPjxoMz5QYXJhbWV0cmU8L2gzPjx1bD48bGk+PGVtPihvcHRpb25hbCk8L2VtPiBsYW5nPSJlbl9VUyIgLSBQYXJhbWV0cmV0IGFuZ2l2ZXIgaHZpbGtldCBzcHJvZyBkZXIgc2thbCBicnVnZXMgdGlsIHZpc25pbmcgZm9yIGJlcyZvc2xhc2g7Z2VuZGUuIElra2UgYWxsZSBtb2R1bGVyIHVuZGVyc3Qmb3NsYXNoO3R0ZXIgZWxsZXIgYmVoJm9zbGFzaDt2ZXIgZGV0dGUuPC9saT48L3VsPg==]]></help>
	<about><![CDATA[PGJyIC8+TGF2ZXQgYWY6IE1vcnRlbiBQb3Vsc2VuICZsdDttb3J0ZW5AcG91bHNlbi5vcmcmZ3Q7PGJyIC8+PGJyIC8+VmVyc2lvbjogMC4yLjc8YnIgLz48YnIgLz5IaXN0b3JpayBvdmVyICZhZWxpZztuZHJpbmdlcjo8YnIgLz48dWw+CjxsaT52ZXJzaW9uIDAuMi43PGJyLz4KZml4ZWQgTmVvQ21zTGluayBmb3IgcHJldHR5IHVybHMsIG1pc3NlZCB0aGUgdGFyZ2V0Y29udGVudG9ubHkgcGFyYW1ldGVyLi4uCgo8bGk+dmVyc2lvbiAwLjIuNjxici8+CkFkZGVkIGEgU2V0UHJlZi1zaG9ydGN1dCBhbmQgYSBuaWNlIE5lb1NldFByZWYtbWV0aG9kIChzZWUgaGVscCkKPGJyLz4Kc2V0IGVudGl0eSBwcm9wcyBmcm9tIGFycmF5IG5vdyB1c2VzIHN0b3JlZCBwYXJhbXMtdmFsdWVzIGlzIG90aGVyIG5vdCBzcGVjaWZpZXMKPGJyLz4KICBSZXdvcmtlZCBOZW9SZWRpcmVjdChGdWxsKSB0byBiZSBmYXN0ZXIgdG8gdXNlCjxici8+CkFkZGVkIE5lb1ZhbGlkYXRlVVJMLW1ldGhvZAo8YnIvPgpBZGRlZCBEZWNvZGVIVE1MRW50aXRpZXMKPGJyLz4KQWRkZWQgTmVvQWRtaW5SZXR1cm4KCgo8bGk+dmVyc2lvbiAwLjIuNTxici8+CkFkZGVkIGFuIG9wdGlvbiB0byBOZW9BZGRJY29uIHRvIGFsc28gaW5jbHVkZSB0aGUgZm9sbGluZ3MgdGV4dCBsaW5rCjxici8+CkFkZGVkIElzVGFibGVFbXB0eQo8YnIvPgpVcGRhdGUgRW1haWxWYWxpZGF0aW9uIHRvIG1haWwtY2FwYWJpbGl0aWVzIG9mIGRvbWFpbiBhcyB3ZWxsCjxici8+Ck1hZGUgMm5kIHBhcmFtIHRvIE5lb1DDhWFyYW1WYWx1ZSBkb3VibGUgYXMgZGVmYXVsdCB2YWx1ZSAod2hlbiBub3QgYW4gYXJyYXkpCgoKCjxsaT52ZXJzaW9uIDAuMi40PGJyLz4KQWRkZWQgTmVvRW1wdHktZnVuY3Rpb24gd2hpY2ggY2hlY2tzIGZvciBhbiBpbmRleCBpbiBhbiBhcnJheQo8YnIvPgpNYWRlIE5lb1ByaW50UiBvdXRwdXQgY29udGVudCBvZiAkX3BhcmFtcyBpZiBubyBwYXJhbWV0ZXIgd2FzIGdpdmVuCjxici8+QWRkZWQgTmVvVmFsaWRhdGVFbWFpbC1mdW5jdGlvbgo8YnIvPkFkZGVkIE5lb05vQnJlYWtzLWZ1bmN0aW9uCgo8bGk+dmVyc2lvbiAwLjIuMzxici8+Ck5vdyBwb3NzaWJsZSB0byByZWdpc3RlciAkcGFyYW1zIGZvciBldmVuIGVhc2llciBzeW50YXggaW4gcmVsZXZhbnQgZnVuY3Rpb25zIGxpa2UgTlBWCjxici8+CkFkZGVkIENyZWF0ZUlucHV0UGFzc3dvcmQtd3JhcHBlcgo8YnIvPgpBZGRlZCBmaWxsIHBhcmFtZXRlciB0byBTZXRFbnRpdHlQcm9wc0Zyb21BcnJheQoKCjxsaT52ZXJzaW9uIDAuMi4yPGJyLz4KQWRkZWQgYSBjdXN0b20gcmV0dXJudmFsdWUgdG8gY2hlY2tlbnRpdHljb25uZWN0aW9ucwo8YnIvPgpJbXBsZW1lbnRlZCBNYWtlU2ltcGxlQXJyYXkKPGJyLz4KQWRkZWQgTmVvVHJ1ZUljb24gYW5kICBOZW9UcnVlSWNvbiAKCjxsaT52ZXJzaW9uIDAuMi4xPGJyLz4KYWRkZWQgYXJyYXlfZGlmZl9rZXkgaW1wbGVtZW50YXRpb24gZm9yIHByZS01LjEuMCB2ZXJzaW9uCjxici8+CkFkZGVkICRhbHdheXNyZXR1cm5hcnJheT1mYWxzZSB0byBHZXRFbnRpdGllcyhGdWxsKS1tZXRob2RzCjxici8+CkFkZGVkIFNtYXJ0QXNzaWduUHJlZi1tZXRob2QKPGJyLz4KQWRkZWQgVG9vbHRpcC1TdXBwb3J0Cjxici8+CkFkZGVkIE5lb1JlZGlyZWN0LWZ1bmN0aW9uCgogIDxsaT52ZXJzaW9uIDAuMi4wPGJyLz4KLSBnZW5lcmFsIGJ1Z2ZpeGluZzxici8+Ci0gQWRkZWQgYSBOZW9EaXJMaXN0LWZ1bmN0aW9uPGJyLz4KLSBGaXhlZCBuYW1lIGVycm9yIG9uIE5lb0lucHV0RHJvcGRvd248YnIvPgotIGFkZGVkIHN1cHBvcnQgZm9yIDNyZCBwYXJhbWV0ZXIgdG8gU2xhc2gtZnVuY3Rpb248YnIvPgotIGFkZGVkIE5lb0Ntc0xpbmsgYW5kIE5lb0Ntc1VybCBzaG9ydGN1dHM8YnIvPgotIGFkZGVkIFNtYXJ0eVVwbG9hZEZvcm1TdGFydDxici8+Ci0gYWRkZWQgU21hcnR5SW5wdXRNdWx0aUhpZGRlbjxici8+CgogIDwvbGk+CiAgPGxpPnZlcnNpb24gMC4xLjA8YnIvPgogICAtIGluaXRpYWwgcmVsZWFzZTwvbGk+CjwvdWw+PGJyIC8+]]></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[PD9waHAKIyBOZW9Nb2R1bGUuIEFuIGV4dGVuZGVkIG1vZHVsZWNsYXNzIGZvciBDTVMgLSBDTVMgTWFkZSBTaW1wbGUKIyBDb3B5cmlnaHQgKGMpIDIwMDktMTAgYnkgTW9ydGVuIFBvdWxzZW4gPG1vcnRlbkBwb3Vsc2VuLm9yZz4KIwojQ01TIC0gQ01TIE1hZGUgU2ltcGxlCiMoYykyMDA0LTA5IGJ5IFRlZCBLdWxwICh3aXNoeUB1c2Vycy5zZi5uZXQpCiNUaGlzIHByb2plY3QncyBob21lcGFnZSBpczogaHR0cDovL2Ntc21hZGVzaW1wbGUuc2YubmV0CiMKI1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiNpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQojdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKIyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMKI1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKI01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKI0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiNZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKI0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKIwoKCmlmICghZnVuY3Rpb25fZXhpc3RzKCJzdHJpcG9zIikpIHsKCWZ1bmN0aW9uIHN0cmlwb3MoJHN0ciwkbmVlZGxlKSB7CgkJcmV0dXJuIHN0cnBvcyhzdHJ0b2xvd2VyKCRzdHIpLHN0cnRvbG93ZXIoJG5lZWRsZSkpOwoJfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCJhcnJheV9kaWZmX2tleSIpKSB7CiAgZnVuY3Rpb24gYXJyYXlfZGlmZl9rZXkoKSB7CiAgICAkYXJycyA9IGZ1bmNfZ2V0X2FyZ3MoKTsKICAgICRyZXN1bHQgPSBhcnJheV9zaGlmdCgkYXJycyk7CiAgICBmb3JlYWNoICgkYXJycyBhcyAkYXJyYXkpIHsKICAgICAgZm9yZWFjaCAoJHJlc3VsdCBhcyAka2V5ID0+ICR2KSB7CiAgICAgICAgaWYgKGFycmF5X2tleV9leGlzdHMoJGtleSwgJGFycmF5KSkgewogICAgICAgICAgdW5zZXQoJHJlc3VsdFska2V5XSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gJHJlc3VsdDsKICB9Cn0KCmlmICghZnVuY3Rpb25fZXhpc3RzKCJpc19hc3NvYyIpKSB7CiAgZnVuY3Rpb24gaXNfYXNzb2MoJGFycmF5KSB7CiAgICByZXR1cm4gKGlzX2FycmF5KCRhcnJheSkgJiYgMCAhPT0gY291bnQoYXJyYXlfZGlmZl9rZXkoJGFycmF5LCBhcnJheV9rZXlzKGFycmF5X2tleXMoJGFycmF5KSkpKSk7CiAgfQp9CgpjbGFzcyBOZW9Nb2R1bGUgZXh0ZW5kcyBDTVNNb2R1bGUgewogIC8qCiAgICoKICAgKiBBIGNvdXBsZSBvZiB2YXJpYWJsZXMgYW5kIG1ldGhvZHMgZm9yIGludGVybmFsIG1vZHVsZSB1c2FnZQogICAqCiAgICovCiAgdmFyICRfZGF0YXN0b3JhZ2U9ZmFsc2U7CiAgdmFyICRfaWQ9ZmFsc2U7CiAgdmFyICRfcmV0dXJuaWQ9ZmFsc2U7CiAgdmFyICRfZXJyb3JzPSIiOwogIHZhciAkX3RoZW1lb2JqZWN0PWZhbHNlOwogIHZhciAkX3BhcmFtcz1hcnJheSgpOwogIAogIGZ1bmN0aW9uIF9nZXRkcygpIHsKICAgIGlmICgkdGhpcy0+X2RhdGFzdG9yYWdlIT09ZmFsc2UpIHJldHVybiAkdGhpcy0+X2RhdGFzdG9yYWdlOwogICAgJHRoaXMtPl9kYXRhc3RvcmFnZT0kdGhpcy0+R2V0TW9kdWxlSW5zdGFuY2UoIk5lb0RhdGFTdG9yYWdlIik7CiAgICByZXR1cm4gJHRoaXMtPl9kYXRhc3RvcmFnZTsKICB9CiAgZnVuY3Rpb24gX2dldHRoZW1lb2JqKCkgewogICAgZ2xvYmFsICRnQ21zOwogICAgaWYgKCR0aGlzLT5fdGhlbWVvYmplY3QhPT1mYWxzZSkgcmV0dXJuICR0aGlzLT5fdGhlbWVvYmplY3Q7CiAgICAkdGhpcy0+X3RoZW1lb2JqZWN0PSR0aGVtZU9iamVjdCA9ICRnQ21zLT52YXJpYWJsZXNbJ2FkbWludGhlbWUnXTsKICAgIHJldHVybiAkdGhpcy0+X3RoZW1lb2JqZWN0OwogIH0KCiAgLyoKICAgKgogICAqIFN0YW5kYXJkIG1vZHVsZS1BUEktbWV0aG9kcyBiZWhhdmluZyBpbiBhIHN0YW5kYXJkIHdheQogICAqCiAgICovCgoJZnVuY3Rpb24gR2V0TmFtZSgpIHsKCQlyZXR1cm4gJ05lb01vZHVsZSc7Cgl9CgogIGZ1bmN0aW9uIEdldFZlcnNpb24oKSB7CiAgICByZXR1cm4gIjAuMi43IjsKICB9CgogIGZ1bmN0aW9uIEdldEZyaWVuZGx5TmFtZSgpIHsKCQlyZXR1cm4gIk5lbyBNb2R1bGUgYmFzZS1jbGFzcyI7Cgl9CgoJZnVuY3Rpb24gSXNQbHVnaW5Nb2R1bGUoKSB7CgkJcmV0dXJuIGZhbHNlOwoJfQoKCWZ1bmN0aW9uIE1pbmltdW1DTVNWZXJzaW9uKCkgewoJCXJldHVybiAnMS44JzsKCX0KCglmdW5jdGlvbiBHZXRBZG1pbkRlc2NyaXB0aW9uKCkgewoJCXJldHVybiAiQW4gZXh0ZW5kZWQgbW9kdWxlLWNsYXNzLCBtYWlubHkgZm9yIHRoZSBOZW8tc2VyaWVzIG1vZHVsZXMsIGJ1dCBhbHNvIGZvciBvdGhlcnMgdG8gdXNlIjsKCX0KCglmdW5jdGlvbiBIYXNBZG1pbigpIHsKCQlyZXR1cm4gZmFsc2U7Cgl9CgoJZnVuY3Rpb24gR2V0QXV0aG9yKCkgewoJCXJldHVybiAnTW9ydGVuIFBvdWxzZW4nOwoJfQoKCWZ1bmN0aW9uIEdldEF1dGhvckVtYWlsKCkJewoJCXJldHVybiAnbW9ydGVuQHBvdWxzZW4ub3JnJzsKCX0KCiAgZnVuY3Rpb24gR2V0SGVscCgkbGFuZz0nZW5fVVMnKSB7CiAgICByZXR1cm4gJHRoaXMtPlByb2Nlc3NUZW1wbGF0ZSgnaGVscC50cGwnKTsKIAl9CgogIGZ1bmN0aW9uIEdldENoYW5nZUxvZygpCXsKCQlyZXR1cm4gJHRoaXMtPlByb2Nlc3NUZW1wbGF0ZSgiY2hhbmdlbG9nLnRwbCIpOwoJfQoKICAvKgogICAqCiAgICogU2V0dXAgZnVuY3Rpb25zCiAgICoKICAgKi8KICBmdW5jdGlvbiBOZW9TZXRJZCgkaWQpIHsKICAgICR0aGlzLT5faWQ9JGlkOwogIH0KICBmdW5jdGlvbiBOZW9TZXRSZXR1cm5JZCgkcmV0dXJuaWQpIHsKICAgICR0aGlzLT5fcmV0dXJuaWQ9JHJldHVybmlkOwogIH0KICBmdW5jdGlvbiBOZW9TZXRQYXJhbXMoJHBhcmFtcz1hcnJheSgpKSB7CiAgICAkdGhpcy0+X3BhcmFtcz0kcGFyYW1zOwogIH0KICBmdW5jdGlvbiBOZW9TZXR1cCgkaWQsJG1vZHVsZSwkcmV0dXJuaWQ9IjAiLCRwYXJhbXM9YXJyYXkoKSkgewogICAgJHRoaXMtPk5lb1NldElkKCRpZCk7CiAgICAkdGhpcy0+TmVvU2V0UmV0dXJuSWQoJHJldHVybmlkKTsKICAgICR0aGlzLT5OZW9TZXRQYXJhbXMoJHBhcmFtcyk7CiAgICAkdGhpcy0+U21hcnR5QXNzaWduQ01TKCRtb2R1bGUpOwogICAgJHRoaXMtPlNtYXJ0eUFzc2lnbigibW9kdWxlX2lkIiwkaWQpOwogIH0KCgogIC8qCiAgICoKICAgKiBHZW5lcmFsIHNob3J0Y3V0IGZ1bmN0aW9ucwogICAqCiAgICovCiAgZnVuY3Rpb24gUHJlZigkcHJlZm5hbWUsJGRlZmF1bHQ9IiIpIHsKICAgIHJldHVybiAkdGhpcy0+R2V0UHJlZmVyZW5jZSgkcHJlZm5hbWUsJGRlZmF1bHQpOwogIH0KCiAgZnVuY3Rpb24gU2V0UHJlZigkcHJlZm5hbWUsICR2YWx1ZSkgewogICAgcmV0dXJuICR0aGlzLT5TZXRQcmVmZXJlbmNlKCRwcmVmLCR2YWx1ZSk7CiAgfQoKICBmdW5jdGlvbiBOZW9TZXRQcmVmKCRwcmVmbmFtZSwgJG5vdHNldHZhbHVlPSIiLCAkZGVsZXRlaWZub3RzZXQ9ZmFsc2UpIHsKICAgIC8vaWYgKGVtcHR5KCRwYXJhbXMpKSAkcGFyYW1zPSR0aGlzLT5fcGFyYW1zOwogICAgJHBhcmFtcz0kdGhpcy0+X3BhcmFtczsKICAgIGlmIChpc3NldCgkcGFyYW1zWyRwcmVmbmFtZV0pKSB7ICAgICAgCiAgICAgICR0aGlzLT5TZXRQcmVmZXJlbmNlKCRwcmVmbmFtZSwkcGFyYW1zWyRwcmVmbmFtZV0pOwogICAgfSBlbHNlIHsKICAgICAgaWYgKCEkZGVsZXRlaWZub3RzZXQpIHsKICAgICAgICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgkcHJlZm5hbWUsICRub3RzZXR2YWx1ZSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgJHRoaXMtPlJlbW92ZVByZWZlcmVuY2UoJHByZWZuYW1lKTsKICAgICAgfQogICAgfQogIH0KCiAgZnVuY3Rpb24gTmVvQ21zTGluaygkcGFyYW1zPWFycmF5KCkpIHsKICAgIC8vQ3JlYXRlTGluaygkaWQsICRhY3Rpb24sICRyZXR1cm5pZD0nJywgJGNvbnRlbnRzPScnLCAkcGFyYW1zPWFycmF5KCksICR3YXJuX21lc3NhZ2U9JycsICRvbmx5aHJlZj1mYWxzZSwgJGlubGluZT1mYWxzZSwgJGFkZHR0ZXh0PScnLCAkdGFyZ2V0Y29udGVudG9ubHk9ZmFsc2UsICRwcmV0dHl1cmw9JycpCiAgICAvL2VjaG8gJHRoaXMtPk5lb1BhcmFtVmFsdWUoInByZXR0eXVybCIsJHBhcmFtcywiIik7CiAgICByZXR1cm4gJHRoaXMtPkNyZWF0ZUxpbmsoCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJpZCIsJHBhcmFtcywkdGhpcy0+X2lkKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImFjdGlvbiIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJyZXR1cm5pZCIsJHBhcmFtcywkdGhpcy0+X3JldHVybmlkKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoYXJyYXkoImNvbnRlbnQiLCJ0ZXh0IiksJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJwYXJhbXMiLCRwYXJhbXMsYXJyYXkoKSksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJ3YXJubWVzc2FnZSIsJHBhcmFtcywiIiksCiAgICAgIGZhbHNlLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiaW5saW5lIiwkcGFyYW1zLGZhbHNlKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImFkZHRleHQiLCRwYXJhbXMsIiIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgidGFyZ2V0Y29udGVudG9ubHkiLCRwYXJhbXMsIiIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgicHJldHR5dXJsIiwkcGFyYW1zLCIiKQogICAgKTsKICB9CgogIGZ1bmN0aW9uIE5lb0Ntc1VybCgkcGFyYW1zPWFycmF5KCkpIHsKICAgIC8vQ3JlYXRlTGluaygkaWQsICRhY3Rpb24sICRyZXR1cm5pZD0nJywgJGNvbnRlbnRzPScnLCAkcGFyYW1zPWFycmF5KCksICR3YXJuX21lc3NhZ2U9JycsICRvbmx5aHJlZj1mYWxzZSwgJGlubGluZT1mYWxzZSwgJGFkZHR0ZXh0PScnLCAkdGFyZ2V0Y29udGVudG9ubHk9ZmFsc2UsICRwcmV0dHl1cmw9JycpCiAgICByZXR1cm4gJHRoaXMtPkNyZWF0ZUxpbmsoCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJpZCIsJHBhcmFtcywkdGhpcy0+X2lkKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImFjdGlvbiIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJyZXR1cm5pZCIsJHBhcmFtcywkdGhpcy0+X3JldHVybmlkKSwKICAgICAgIiIsCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJwYXJhbXMiLCRwYXJhbXMsYXJyYXkoKSksCiAgICAgICIiLAogICAgICB0cnVlICwKICAgICAgZmFsc2UsCiAgICAgICIiLAogICAgICBmYWxzZSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoInByZXR0eXVybCIsJHBhcmFtcywiIikKICAgICk7CiAgfQoKICBmdW5jdGlvbiBOZW9SZWRpcmVjdCgkYWN0aW9uPSIiLCAkcGFyYW1zPWFycmF5KCkpIHsKICAgIGlmIChpc19hcnJheSgkYWN0aW9uKSkgJHRoaXMtPk5lb1JlZGlyZWN0RnVsbCgkYWN0aW9uKTsKICAgIHJldHVybiAkdGhpcy0+TmVvUmVkaXJlY3RGdWxsKAogICAgICBhcnJheSgKICAgICAgICAgICJhY3Rpb24iPT4kYWN0aW9uLAogICAgICAgICAgInBhcmFtcyI9PiRwYXJhbXMKICAgICAgICAgICkKICAgICk7CiAgfQoKICBmdW5jdGlvbiBOZW9SZWRpcmVjdEZ1bGwoJHBhcmFtcz1hcnJheSgpKSB7CiAgICAvL1JlZGlyZWN0KCRpZCwgJGFjdGlvbiwgJHJldHVybmlkPScnLCAkcGFyYW1zPWFycmF5KCksICRpbmxpbmU9ZmFsc2UpCiAgICByZXR1cm4gJHRoaXMtPlJlZGlyZWN0KAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiaWQiLCRwYXJhbXMsJHRoaXMtPl9pZCksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJhY3Rpb24iLCRwYXJhbXMsIiIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgicmV0dXJuaWQiLCRwYXJhbXMsJHRoaXMtPl9yZXR1cm5pZCksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJwYXJhbXMiLCRwYXJhbXMsYXJyYXkoKSksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJpbmxpbmUiLCRwYXJhbXMsZmFsc2UpCiAgICApOwogIH0KCiAgZnVuY3Rpb24gTmVvQWRtaW5SZXR1cm4oJHBhcmFtcz1hcnJheSgpKSB7CiAgICAvLyR0aGlzLT5SZWRpcmVjdCgkaWQsICdkZWZhdWx0YWRtaW4nLCAnJywgYXJyYXkoIm1vZHVsZV9tZXNzYWdlIj0+JHRoaXMtPkxhbmcoInNldHRpbmdzc2F2ZWQiKSwidGFiIj0+InNldHRpbmdzIikpOwogICAgJG1lc3NhZ2U9JHRoaXMtPk5QVigibWVzc2FnZSIsJHBhcmFtcyk7CiAgICAkZXJyb3I9JHRoaXMtPk5QVigiZXJyb3IiLCRwYXJhbXMpOwogICAgJHRhYj0kdGhpcy0+TlBWKCJ0YWIiLCRwYXJhbXMpOwoKICAgICR0aGlzLT5OZW9SZWRpcmVjdCgiZGVmYXVsdGFkbWluIiwKICAgICAgYXJyYXkoCiAgICAgICAgIm1vZHVsZV9tZXNzYWdlIj0+JG1lc3NhZ2UsCiAgICAgICAgIm1vZHVsZV9lcnJvcnMiPT4kZXJyb3IsCiAgICAgICAgInRhYiI9PiR0YWIKICAgICAgICApCiAgICAgICk7CiAgICAKICB9CiAgCgogIAoKCiAgLyoKICAgKgogICAqIEZvcm0tZ2VuZXJhdGlvbiBmdW5jdGlvbnMsIGluY2x1ZGluZyBzbWFydHkgYXNzaWdubWVudHMKICAgKgogICAqLwoKICBmdW5jdGlvbiBOZW9Gb3JtU3RhcnQoJHBhcmFtcz1hcnJheSgpKSB7CiAgICAvL0NyZWF0ZUZvcm1TdGFydCgkaWQsICRhY3Rpb249J2RlZmF1bHQnLCAkcmV0dXJuaWQ9JycsICRtZXRob2Q9J3Bvc3QnLCAkZW5jdHlwZT0nJywgJGlubGluZT1mYWxzZSwgJGlkc3VmZml4PScnLCAkcGFyYW1zID0gYXJyYXkoKSwgJGV4dHJhPScnKSAgICAKICAgIHJldHVybiAkdGhpcy0+Q3JlYXRlRm9ybVN0YXJ0KAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiaWQiLCRwYXJhbXMsJHRoaXMtPl9pZCksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJhY3Rpb24iLCRwYXJhbXMsImRlZmF1bHQiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoInJldHVybmlkIiwkcGFyYW1zLCR0aGlzLT5fcmV0dXJuaWQpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgibWV0aG9kIiwkcGFyYW1zLCJwb3N0IiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKGFycmF5KCJlbmN0eXBlIiwiZW5jb2RpbmciKSwkcGFyYW1zLCIiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImlubGluZSIsJHBhcmFtcyxmYWxzZSksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJpZHN1ZmZpeCIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJwYXJhbXMiLCRwYXJhbXMsYXJyYXkoKSksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJleHRyYSIsJHBhcmFtcywiIikKICAgICk7CiAgfQogIGZ1bmN0aW9uIFNtYXJ0eUZvcm1TdGFydCgkc21hcnR5bmFtZSwkcGFyYW1zPWFycmF5KCkpIHsKICAgICR0aGlzLT5TbWFydHlBc3NpZ24oJHNtYXJ0eW5hbWUsJHRoaXMtPk5lb0Zvcm1TdGFydCgkcGFyYW1zKSk7CiAgfQogIGZ1bmN0aW9uIFNtYXJ0eVVwbG9hZEZvcm1TdGFydCgkc21hcnR5bmFtZSwkcGFyYW1zPWFycmF5KCkpIHsKICAgICRwYXJhbXNbIm1ldGhvZCJdPSJwb3N0IjsKICAgICRwYXJhbXNbImVuY3R5cGUiXT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSI7CiAgICAkdGhpcy0+U21hcnR5Rm9ybVN0YXJ0KCRzbWFydHluYW1lLCRwYXJhbXMpOwogIH0KCiAgZnVuY3Rpb24gTmVvRm9ybUVuZCgpIHsKICAgIHJldHVybiAkdGhpcy0+Q3JlYXRlRm9ybUVuZCgpOwogIH0KCiAgZnVuY3Rpb24gU21hcnR5Rm9ybUVuZCgkc21hcnR5bmFtZSkgewogICAgJHRoaXMtPlNtYXJ0eUFzc2lnbigkc21hcnR5bmFtZSwkdGhpcy0+TmVvRm9ybUVuZCgpKTsKICB9CgogIC8qZnVuY3Rpb24gU21hcnR5SW5wdXRTdWJtaXQoJHNtYXJ0eW5hbWUsJG5hbWUsJHRleHQsJGNvbmZpcm10ZXh0PSIiKSB7CiAgICAkdGhpcy0+U21hcnR5QXNzaWduKCRzbWFydHluYW1lLCR0aGlzLT5OZW9JbnB1dFN1Ym1pdChhcnJheSgibmFtZSI9PiRuYW1lLCJ2YWx1ZSI9PiR0ZXh0LCJjb25maXJtdGV4dCI9PiRjb25maXJtdGV4dCkpKTsKICB9Ki8KCiAgCiAgCiAgZnVuY3Rpb24gU21hcnR5SW5wdXRIaWRkZW5NdWx0aSgkc21hcnR5bmFtZSwkZmllbGRzPWFycmF5KCkpIHsKICAgICRvdXRwdXQ9IlxuIjsKICAgIGZvcmVhY2goJGZpZWxkcyBhcyAkbmFtZT0+JHZhbHVlKSB7CiAgICAgICRvdXRwdXQuPSR0aGlzLT5OZW9JbnB1dEhpZGRlbihhcnJheSgibmFtZSI9PiRuYW1lLCJ2YWx1ZSI9PiR2YWx1ZSkpLiJcbiI7CiAgICB9CiAgICAkb3V0cHV0Lj0iXG4iOwogICAgJHRoaXMtPlNtYXJ0eUFzc2lnbigkc21hcnR5bmFtZSwkb3V0cHV0KTsKICB9CgogIGZ1bmN0aW9uIFNtYXJ0eUxpbmsoJHNtYXJ0eW5hbWUsJGZpZWxkcz1hcnJheSgpKSB7CiAgICAkdGhpcy0+U21hcnR5QXNzaWduKCRzbWFydHluYW1lLCR0aGlzLT5OZW9DbXNMaW5rKCRmaWVsZHMpKTsKICB9CgogIGZ1bmN0aW9uIE5lb0lucHV0RmlsZSgkcGFyYW1zKSB7CiAgIHJldHVybiAkdGhpcy0+Q3JlYXRlSW5wdXRGaWxlKAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiaWQiLCRwYXJhbXMsJHRoaXMtPl9pZCksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJuYW1lIiwkcGFyYW1zLCIiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImFjY2VwdCIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJzaXplIiwkcGFyYW1zLCIxMCIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiYWRkdGV4dCIsJHBhcmFtcywiIikKICAgICk7CiAgfQoKICBmdW5jdGlvbiBOZW9JbnB1dFRleHQoJHBhcmFtcz1hcnJheSgpKSB7CiAgICByZXR1cm4gJHRoaXMtPkNyZWF0ZUlucHV0VGV4dCgKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImlkIiwkcGFyYW1zLCR0aGlzLT5faWQpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgibmFtZSIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJ2YWx1ZSIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJzaXplIiwkcGFyYW1zLCIxMCIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgibWF4bGVuZ3RoIiwkcGFyYW1zLCIyNTUiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImFkZHRleHQiLCRwYXJhbXMsIiIpCiAgICApOwogIH0KCiAgZnVuY3Rpb24gU21hcnR5SW5wdXRUZXh0KCRzbWFydHluYW1lLCAkcGFyYW1zPWFycmF5KCkpIHsKICAgICR0aGlzLT5TbWFydHlBc3NpZ24oJHNtYXJ0eW5hbWUsICR0aGlzLT5OZW9JbnB1dFRleHQoJHBhcmFtcykpOwogIH0KCiAgZnVuY3Rpb24gTmVvSW5wdXRQYXNzd29yZCgkcGFyYW1zPWFycmF5KCkpIHsKICAgIHJldHVybiAkdGhpcy0+Q3JlYXRlSW5wdXRQYXNzd29yZCgKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImlkIiwkcGFyYW1zLCR0aGlzLT5faWQpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgibmFtZSIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJ2YWx1ZSIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJzaXplIiwkcGFyYW1zLCIxMCIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgibWF4bGVuZ3RoIiwkcGFyYW1zLCIyNTUiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImFkZHRleHQiLCRwYXJhbXMsIiIpCiAgICApOwogIH0KICBmdW5jdGlvbiBTbWFydHlJbnB1dFBhc3N3b3JkKCRzbWFydHluYW1lLCAkcGFyYW1zPWFycmF5KCkpIHsKICAgICR0aGlzLT5TbWFydHlBc3NpZ24oJHNtYXJ0eW5hbWUsICR0aGlzLT5OZW9JbnB1dFBhc3N3b3JkKCRwYXJhbXMpKTsKICB9CgogIGZ1bmN0aW9uIE5lb1RleHRhcmVhKCRwYXJhbXM9YXJyYXkoKSkgewogICAgcmV0dXJuICR0aGlzLT5DcmVhdGVUZXh0QXJlYSgKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImVuYWJsZXd5c2l3eWciLCRwYXJhbXMsZmFsc2UpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiaWQiLCRwYXJhbXMsJHRoaXMtPl9pZCksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKGFycmF5KCJ2YWx1ZSIsInRleHQiLCJjb250ZW50IiksJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJuYW1lIiwkcGFyYW1zLCIiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoYXJyYXkoImNsYXNzIiwiY2xhc3NuYW1lIiksJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJodG1saWQiLCRwYXJhbXMsIiIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiZW5jb2RpbmciLCRwYXJhbXMsIiIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgic3R5bGVzaGVldCIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJjb2xzIiwkcGFyYW1zLCI4MCIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgicm93cyIsJHBhcmFtcywiMTUiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImZvcmNld3lzaXd5ZyIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJ3YW50ZWRzeW50YXgiLCRwYXJhbXMsIiIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiYWRkdGV4dCIsJHBhcmFtcywiIikKICAgICk7CiAgfQoKICBmdW5jdGlvbiBTbWFydHlJbnB1dFRleHRhcmVhKCRzbWFydHluYW1lLCAkcGFyYW1zPWFycmF5KCkpIHsKICAgICR0aGlzLT5TbWFydHlBc3NpZ24oJHNtYXJ0eW5hbWUsICR0aGlzLT5OZW9UZXh0YXJlYSgkcGFyYW1zKSk7CiAgfQoKICBmdW5jdGlvbiBOZW9JbnB1dENoZWNrYm94KCRwYXJhbXM9YXJyYXkoKSkgewogICAgaWYgKGlzc2V0KCRwYXJhbXNbImNoZWNrZWQiXSkgJiYgJHBhcmFtc1siY2hlY2tlZCJdPT10cnVlKSB7CiAgICAgICRwYXJhbXNbInNlbGVjdGVkdmFsdWUiXT0kcGFyYW1zWyJ2YWx1ZSJdOwogICAgfQogICAgcmV0dXJuICR0aGlzLT5DcmVhdGVJbnB1dENoZWNrYm94KAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiaWQiLCRwYXJhbXMsJHRoaXMtPl9pZCksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJuYW1lIiwkcGFyYW1zLCIiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoInZhbHVlIiwkcGFyYW1zLCIiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoInNlbGVjdGVkdmFsdWUiLCRwYXJhbXMsIiIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiYWRkdGV4dCIsJHBhcmFtcywiIikKICAgICk7CiAgfQoKICBmdW5jdGlvbiBTbWFydHlJbnB1dENoZWNrYm94KCRzbWFydHluYW1lLCAkcGFyYW1zPWFycmF5KCkpIHsKICAgICR0aGlzLT5TbWFydHlBc3NpZ24oJHNtYXJ0eW5hbWUsICR0aGlzLT5OZW9JbnB1dENoZWNrYm94KCRwYXJhbXMpKTsKICB9CgogIGZ1bmN0aW9uIE5lb0lucHV0U3VibWl0KCRwYXJhbXM9YXJyYXkoKSkgewogICAgcmV0dXJuICR0aGlzLT5DcmVhdGVJbnB1dFN1Ym1pdCgKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImlkIiwkcGFyYW1zLCR0aGlzLT5faWQpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgibmFtZSIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJ2YWx1ZSIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJhZGR0ZXh0IiwkcGFyYW1zLCIiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImltYWdlIiwkcGFyYW1zLCIiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImNvbmZpcm10ZXh0IiwkcGFyYW1zLCIiKQogICAgKTsKICB9CgogIGZ1bmN0aW9uIFNtYXJ0eUlucHV0U3VibWl0KCRzbWFydHluYW1lLCAkcGFyYW1zPWFycmF5KCksICR2YWx1ZT0iIikgewogICAgaWYgKGlzX2FycmF5KCRwYXJhbXMpKSB7CiAgICAgICR0aGlzLT5TbWFydHlBc3NpZ24oJHNtYXJ0eW5hbWUsICR0aGlzLT5OZW9JbnB1dFN1Ym1pdCgkcGFyYW1zKSk7CiAgICB9IGVsc2UgewogICAgICAkdGhpcy0+U21hcnR5QXNzaWduKCRzbWFydHluYW1lLCAkdGhpcy0+TmVvSW5wdXRTdWJtaXQoYXJyYXkoIm5hbWUiPT4kcGFyYW1zLCJ2YWx1ZSI9PiR2YWx1ZSkpKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIE5lb0lucHV0UmVzZXQoJHBhcmFtcz1hcnJheSgpKSB7CiAgICByZXR1cm4gJHRoaXMtPkNyZWF0ZUlucHV0VGV4dCgKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImlkIiwkcGFyYW1zLCR0aGlzLT5faWQpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgibmFtZSIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJ2YWx1ZSIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJhZGR0ZXh0IiwkcGFyYW1zLCJSZXNldCIpCiAgICApOwogIH0KCiAgZnVuY3Rpb24gTmVvSW5wdXRIaWRkZW4oJHBhcmFtcz1hcnJheSgpKSB7CiAgICByZXR1cm4gJHRoaXMtPkNyZWF0ZUlucHV0SGlkZGVuKAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiaWQiLCRwYXJhbXMsJHRoaXMtPl9pZCksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJuYW1lIiwkcGFyYW1zLCIiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoInZhbHVlIiwkcGFyYW1zLCIiKQogICAgKTsKICB9CgogIGZ1bmN0aW9uIFNtYXJ0eUlucHV0SGlkZGVuKCRzbWFydHluYW1lLCRwYXJhbXM9YXJyYXkoKSwkb3B0dmFsdWU9IiIpIHsKICAgIGlmIChpc19hcnJheSgkcGFyYW1zKSkgewogICAgICAkdGhpcy0+U21hcnR5QXNzaWduKCRzbWFydHluYW1lLCR0aGlzLT5OZW9JbnB1dEhpZGRlbigkcGFyYW1zKSk7CiAgICB9IGVsc2UgewogICAgICAkdGhpcy0+U21hcnR5QXNzaWduKCRzbWFydHluYW1lLCR0aGlzLT5OZW9JbnB1dEhpZGRlbihhcnJheSgibmFtZSI9PiRuYW1lLCJ2YWx1ZSI9PiR2YWx1ZSkpKTsKICAgIH0KCiAgfQoKICBmdW5jdGlvbiBOZW9JbnB1dERyb3Bkb3duKCRwYXJhbXM9YXJyYXkoKSkgewogICAgcmV0dXJuICR0aGlzLT5DcmVhdGVJbnB1dERyb3Bkb3duKAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiaWQiLCRwYXJhbXMsJHRoaXMtPl9pZCksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJuYW1lIiwkcGFyYW1zLCIiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoIml0ZW1zIiwkcGFyYW1zLCIiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoInNlbGVjdGVkaW5kZXgiLCRwYXJhbXMsLTEpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgic2VsZWN0ZWR2YWx1ZSIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJhZGR0ZXh0IiwkcGFyYW1zLCIiKQogICAgKTsKICB9CgogIGZ1bmN0aW9uIE5lb0lucHV0UmFkaW9Hcm91cCgkcGFyYW1zPWFycmF5KCkpIHsKICAgIHJldHVybiAkdGhpcy0+Q3JlYXRlSW5wdXRSYWRpb0dyb3VwKAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiaWQiLCRwYXJhbXMsJHRoaXMtPl9pZCksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJuYW1lIiwkcGFyYW1zLCIiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoIml0ZW1zIiwkcGFyYW1zLCIiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoInNlbGVjdGVkdmFsdWUiLCRwYXJhbXMsLTEpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiYWRkdGV4dCIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJkZWxpbWl0ZXIiLCRwYXJhbXMsIiIpCiAgICApOwogIH0KCiAgZnVuY3Rpb24gTmVvSW5wdXRTZWxlY3RMaXN0KCRwYXJhbXM9YXJyYXkoKSkgewogICAgcmV0dXJuICR0aGlzLT5DcmVhdGVJbnB1dFNlbGVjdExpc3QoCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJpZCIsJHBhcmFtcywkdGhpcy0+X2lkKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoIm5hbWUiLCRwYXJhbXMsIiIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiaXRlbXMiLCRwYXJhbXMsIiIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgic2VsZWN0ZWRpdGVtcyIsJHBhcmFtcyxhcnJheSgpKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoInNpemUiLCRwYXJhbXMsMyksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJhZGR0ZXh0IiwkcGFyYW1zLCIiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoIm11bHRpcGxlIiwkcGFyYW1zLHRydWUpCiAgICApOwogIH0KCiAgLyoqCiAgICoKICAgKiBMaXN0IGhlbHBlciBmdW5jdGlvbnMKICAgKgogICAqLwogICBmdW5jdGlvbiBOZW9EZWxldGVJY29uKCRhY3Rpb24sJHRleHQsJHBhcmFtcz1hcnJheSgpLCRjb25maXJtYXRpb249IiIpIHsKICAgICAkaWNvbj0kdGhpcy0+Q3JlYXRlTGluaygkdGhpcy0+X2lkLCAkYWN0aW9uLCAkdGhpcy0+X3JldHVybmlkLCR0aGlzLT5OZW9TeXN0ZW1JY29uKCJkZWxldGUuZ2lmIiwkdGV4dCksJHBhcmFtcywgJGNvbmZpcm1hdGlvbik7CiAgICAgcmV0dXJuICRpY29uOwogICB9CgogICBmdW5jdGlvbiBOZW9Db3B5SWNvbigkYWN0aW9uLCR0ZXh0LCRwYXJhbXM9YXJyYXkoKSwkY29uZmlybWF0aW9uPSIiKSB7CiAgICAgJGljb249JHRoaXMtPkNyZWF0ZUxpbmsoJHRoaXMtPl9pZCwgJGFjdGlvbiwgJHRoaXMtPl9yZXR1cm5pZCwJJHRoaXMtPk5lb1N5c3RlbUljb24oImNvcHkuZ2lmIiwkdGV4dCksICRwYXJhbXMsICRjb25maXJtYXRpb24pOwogICAgIHJldHVybiAkaWNvbjsKICAgfQoKICAgZnVuY3Rpb24gTmVvRWRpdEljb24oJGFjdGlvbiwkdGV4dCwkcGFyYW1zPWFycmF5KCksJGNvbmZpcm1hdGlvbj0iIikgewogICAgICRpY29uPSR0aGlzLT5DcmVhdGVMaW5rKCR0aGlzLT5faWQsICRhY3Rpb24sICR0aGlzLT5fcmV0dXJuaWQsCSR0aGlzLT5OZW9TeXN0ZW1JY29uKCJlZGl0LmdpZiIsJHRleHQpLAkkcGFyYW1zLCAkY29uZmlybWF0aW9uKTsKICAgICByZXR1cm4gJGljb247CiAgIH0KICAgZnVuY3Rpb24gTmVvVHJ1ZUljb24oJGFjdGlvbiwkdGV4dCwkcGFyYW1zPWFycmF5KCksJGNvbmZpcm1hdGlvbj0iIikgewogICAgICRpY29uPSR0aGlzLT5DcmVhdGVMaW5rKCR0aGlzLT5faWQsICRhY3Rpb24sICR0aGlzLT5fcmV0dXJuaWQsCSR0aGlzLT5OZW9TeXN0ZW1JY29uKCJ0cnVlLmdpZiIsJHRleHQpLAkkcGFyYW1zLCAkY29uZmlybWF0aW9uKTsKICAgICByZXR1cm4gJGljb247CiAgIH0KICAgZnVuY3Rpb24gTmVvRmFsc2VJY29uKCRhY3Rpb24sJHRleHQsJHBhcmFtcz1hcnJheSgpLCRjb25maXJtYXRpb249IiIpIHsKICAgICAkaWNvbj0kdGhpcy0+Q3JlYXRlTGluaygkdGhpcy0+X2lkLCAkYWN0aW9uLCAkdGhpcy0+X3JldHVybmlkLAkkdGhpcy0+TmVvU3lzdGVtSWNvbigiZmFsc2UuZ2lmIiwkdGV4dCksCSRwYXJhbXMsICRjb25maXJtYXRpb24pOwogICAgIHJldHVybiAkaWNvbjsKICAgfQoKICAgZnVuY3Rpb24gTmVvQWRkSWNvbigkYWN0aW9uLCR0ZXh0LCRwYXJhbXM9YXJyYXkoKSwkY29uZmlybWF0aW9uPSIiLCAkaW5jbHVkZXRleHRsaW5rID0gdHJ1ZSkgewogICAgICRpY29uPSR0aGlzLT5DcmVhdGVMaW5rKCR0aGlzLT5faWQsICRhY3Rpb24sICR0aGlzLT5fcmV0dXJuaWQsICR0aGlzLT5OZW9TeXN0ZW1JY29uKCJuZXdvYmplY3QuZ2lmIiwkdGV4dCksICRwYXJhbXMsICRjb25maXJtYXRpb24pOwogICAgIGlmICgkaW5jbHVkZXRleHRsaW5rKSB7CiAgICAgICAkaWNvbi49JHRoaXMtPkNyZWF0ZUxpbmsoJHRoaXMtPl9pZCwgJGFjdGlvbiwgJHRoaXMtPl9yZXR1cm5pZCwgJHRleHQsICRwYXJhbXMsICRjb25maXJtYXRpb24pOwogICAgIH0KICAgICAvLyRpY29uLj0kdGhpcy0+Q3JlYXRlTGluaygkdGhpcy0+X2lkLCAgJGFjdGlvbiwgJHRoaXMtPl9yZXR1cm5pZCwgJHRleHQsICRwYXJhbXMsICRjb25maXJtYXRpb24sIGZhbHNlLCBmYWxzZSwgJ2NsYXNzPSJwYWdlb3B0aW9ucyInKTsKCiAgICAgLy89JHRoaXMtPkNyZWF0ZUxpbmsoJGlkLCAnZWRpdHRlbXBsYXRlJywgMCwgJHRoZW1lT2JqZWN0LT5EaXNwbGF5SW1hZ2UoJ2ljb25zL3N5c3RlbS9uZXdvYmplY3QuZ2lmJywkdGhpcy0+TGFuZygiYWRkdGVtcGxhdGUiKSwnJywnJywnc3lzdGVtaWNvbicpLCBhcnJheSgpLCAnJywgZmFsc2UsIGZhbHNlLCAnJykgLicgJy4gJHRoaXMtPkNyZWF0ZUxpbmsoJGlkLCAnZWRpdHRlbXBsYXRlJywgJHJldHVybmlkLCAkdGhpcy0+TGFuZygiYWRkdGVtcGxhdGUiKSwgYXJyYXkoInRvZG8iPT4iYWRkIiksICcnLCBmYWxzZSwgZmFsc2UsICdjbGFzcz0icGFnZW9wdGlvbnMiJyk7CiAgICByZXR1cm4gJGljb247CiAgIH0KCiAgIGZ1bmN0aW9uIE5lb1N5c3RlbUljb24oJGljb24sJHRleHQ9IiIpIHsKICAgICAkdGhlbWVvYmo9JHRoaXMtPl9nZXR0aGVtZW9iaigpOwogICAgIHJldHVybiAkdGhlbWVvYmotPkRpc3BsYXlJbWFnZSgnaWNvbnMvc3lzdGVtLycuJGljb24sICR0ZXh0LCcnLCcnLCdzeXN0ZW1pY29uJyk7CiAgIH0KCiAgIGZ1bmN0aW9uIE5lb0hpZGRlbkNvbnRlbnQoJHRleHQsICRjb250ZW50LCAkY2xpY2t0eXBlPSJ0ZXh0IiwgJHN0YXJ0c2hvd249ZmFsc2UpIHsKICAgICByZXR1cm4gIjxzdHJvbmc+JHRleHQ8L3N0cm9uZz48YnIvPiRjb250ZW50IjsKICAgfQoKCiAgLyoqCiAgICoKICAgKiBOZW9EYXRhU3RvcmFnZSBzaG9ydGN1dHMKICAgKgogICAqLwogIGZ1bmN0aW9uIEFkZEVudGl0eSgkdGFibGUsICRwcm9wcz1hcnJheSgpKSB7CiAgICAkZHM9JHRoaXMtPl9nZXRkcygpOwogICAgaWYgKCRkcyE9PWZhbHNlKSB7CiAgICAgIHJldHVybiAkZHMtPkFkZEVudGl0eSgkdGhpcy0+R2V0TmFtZSgpLCR0YWJsZSwkcHJvcHMpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICR0aGlzLT5FcnJvcigiZnVuY3Rpb24gQWRkRW50aXR5OiBDYW5ub3QgYWNjZXNzIE5lb0RhdGFTdG9yYWdlIG1vZHVsZSIpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gRGVsZXRlRW50aXR5KCRpZCkgewogICAgJGRzPSR0aGlzLT5fZ2V0ZHMoKTsKICAgIGlmICgkZHMhPT1mYWxzZSkgewogICAgICByZXR1cm4gJGRzLT5EZWxldGVFbnRpdHkoJGlkKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAkdGhpcy0+RXJyb3IoImZ1bmN0aW9uIERlbGV0ZUVudGl0eTogQ2Fubm90IGFjY2VzcyBOZW9EYXRhU3RvcmFnZSBtb2R1bGUiKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIERlbGV0ZUVudGl0aWVzKCR0YWJsZSwgJGNyaXRlcmlhPWFycmF5KCkpIHsKICAgICRkcz0kdGhpcy0+X2dldGRzKCk7CiAgICBpZiAoJGRzIT09ZmFsc2UpIHsKICAgICAgcmV0dXJuICRkcy0+RGVsZXRlRW50aXRpZXMoJHRoaXMtPkdldE5hbWUoKSwgJHRhYmxlLCAkY3JpdGVyaWEpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICR0aGlzLT5FcnJvcigiZnVuY3Rpb24gRGVsZXRlRW50aXRpZXM6IENhbm5vdCBhY2Nlc3MgTmVvRGF0YVN0b3JhZ2UgbW9kdWxlIik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBHZXRFbnRpdHkoJGlkLCAkb3ZlcnJpZGVwcm9wcz1hcnJheSgpLCAkZmlsbGZpZWxkcz1hcnJheSgpKSB7CiAgICAkZHM9JHRoaXMtPl9nZXRkcygpOwogICAgaWYgKCRkcyE9PWZhbHNlKSB7CiAgICAgIHJldHVybiAkZHMtPkdldEVudGl0eSgkaWQsICRvdmVycmlkZXByb3BzLCAkZmlsbGZpZWxkcyk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gJHRoaXMtPkVycm9yKCJmdW5jdGlvbiBHZXRFbnRpdHk6IENhbm5vdCBhY2Nlc3MgTmVvRGF0YVN0b3JhZ2UgbW9kdWxlIik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBHZXRFbnRpdGllcygkdGFibGU9IiIsICRjcml0ZXJpYT1hcnJheSgpLCAkYWx3YXlzcmV0dXJuYXJyYXk9ZmFsc2UpIHsKICAgICRkcz0kdGhpcy0+X2dldGRzKCk7CiAgICBpZiAoJGRzIT09ZmFsc2UpIHsKICAgICAgcmV0dXJuICRkcy0+R2V0RW50aXRpZXMoJHRoaXMtPkdldE5hbWUoKSwgJHRhYmxlLCAkY3JpdGVyaWEpOwogICAgfSBlbHNlIHsKICAgICAgaWYgKCRhbHdheXNyZXR1cm5hcnJheSkgewogICAgICAgIHJldHVybiBhcnJheSgpOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiAkdGhpcy0+RXJyb3IoImZ1bmN0aW9uIEdldEVudGl0aWVzOiBDYW5ub3QgYWNjZXNzIE5lb0RhdGFTdG9yYWdlIG1vZHVsZSIpOwogICAgICB9CiAgICB9CiAgfQoKICBmdW5jdGlvbiBHZXRPbmVFbnRpdHkoJHRhYmxlLCAkY3JpdGVyaWE9YXJyYXkoKSwgJGZhaWxpZm11bHRpcGxlPWZhbHNlKSB7CiAgICAkZHM9JHRoaXMtPl9nZXRkcygpOwogICAgaWYgKCRkcyE9PWZhbHNlKSB7CiAgICAgIHJldHVybiAkZHMtPkdldE9uZUVudGl0eSgkdGhpcy0+R2V0TmFtZSgpLCAkdGFibGUsICRjcml0ZXJpYSwgJGZhaWxpZm11bHRpcGxlKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAkdGhpcy0+RXJyb3IoImZ1bmN0aW9uIEdldE9uZUVudGl0eTogQ2Fubm90IGFjY2VzcyBOZW9EYXRhU3RvcmFnZSBtb2R1bGUiKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIEdldE9uZVNvcnRlZEVudGl0eSgkdGFibGUsICRjcml0ZXJpYT1hcnJheSgpLCAkc29ydGZpZWxkcz1hcnJheSgpICkgewogICAgJGRzPSR0aGlzLT5fZ2V0ZHMoKTsKICAgIGlmICgkZHMhPT1mYWxzZSkgewogICAgICByZXR1cm4gJGRzLT5HZXRPbmVFbnRpdHkoJHRoaXMtPkdldE5hbWUoKSwgJHRhYmxlLCAkY3JpdGVyaWEsICRmYWlsaWZtdWx0aXBsZSk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gJHRoaXMtPkVycm9yKCJmdW5jdGlvbiBHZXRPbmVFbnRpdHk6IENhbm5vdCBhY2Nlc3MgTmVvRGF0YVN0b3JhZ2UgbW9kdWxlIik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBHZXRFbnRpdGllc0Z1bGwoJHRhYmxlPSIiLCAkY3JpdGVyaWE9YXJyYXkoKSwgJGFsd2F5c3JldHVybmFycmF5PWZhbHNlKSB7CiAgICAkZHM9JHRoaXMtPl9nZXRkcygpOwogICAgaWYgKCRkcyE9PWZhbHNlKSB7CiAgICAgIHJldHVybiAkZHMtPkdldEVudGl0aWVzRnVsbCgkdGhpcy0+R2V0TmFtZSgpLCAkdGFibGUsICRjcml0ZXJpYSk7CiAgICB9IGVsc2UgewogICAgICBpZiAoJGFsd2F5c3JldHVybmFycmF5KSB7CiAgICAgICAgcmV0dXJuIGFycmF5KCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5FcnJvcigiZnVuY3Rpb24gR2V0RW50aXRpZXNGdWxsOiBDYW5ub3QgYWNjZXNzIE5lb0RhdGFTdG9yYWdlIG1vZHVsZSIpOwogICAgICB9CiAgICB9CiAgfQoKICBmdW5jdGlvbiBTZXRFbnRpdHlQcm9wKCRpZCwkcHJvcG5hbWUsJHByb3B2YWx1ZSwkcHJvcHR5cGU9InVuZGVmaW5lZCIpIHsKICAgICRkcz0kdGhpcy0+X2dldGRzKCk7CiAgICBpZiAoJGRzIT09ZmFsc2UpIHsKICAgICAgcmV0dXJuICRkcy0+U2V0RW50aXR5UHJvcCgkaWQsJHByb3BuYW1lLCRwcm9wdmFsdWUsJHByb3B0eXBlKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAkdGhpcy0+RXJyb3IoImZ1bmN0aW9uIFNldEVudGl0eVByb3A6IENhbm5vdCBhY2Nlc3MgTmVvRGF0YVN0b3JhZ2UgbW9kdWxlIik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBDbGVhckVudGl0eVByb3AoJGlkLCAkcHJvcG5hbWUpIHsKICAgICRkcz0kdGhpcy0+X2dldGRzKCk7CiAgICBpZiAoJGRzIT09ZmFsc2UpIHsKICAgICAgcmV0dXJuICRkcy0+Q2xlYXJFbnRpdHlQcm9wKCRpZCwgJHByb3BuYW1lKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAkdGhpcy0+RXJyb3IoImZ1bmN0aW9uIENsZWFyRW50aXR5UHJvcDogQ2Fubm90IGFjY2VzcyBOZW9EYXRhU3RvcmFnZSBtb2R1bGUiKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIFNldEVudGl0eVByb3BzKCRpZCwgJHByb3BzLyosICRjbGVhcj10cnVlKi8pIHsKICAgIC8vZWNobyAiaGkxIjtkaWUoKTsKICAgICRkcz0kdGhpcy0+X2dldGRzKCk7CiAgICBpZiAoJGRzIT09ZmFsc2UpIHsKICAgICAgcmV0dXJuICRkcy0+U2V0RW50aXR5UHJvcHMoJGlkLCAkcHJvcHMvKiwgJGNsZWFyKi8pOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICR0aGlzLT5FcnJvcigiZnVuY3Rpb24gU2V0RW50aXR5UHJvcHM6IENhbm5vdCBhY2Nlc3MgTmVvRGF0YVN0b3JhZ2UgbW9kdWxlIik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBTZXRFbnRpdHlQcm9wc0Zyb21BcnJheSgkaWQsICRwcm9wcywgJHZhbHVlcz1hcnJheSgpLCAkY2xlYXI9dHJ1ZSwgJGZpbGw9ZmFsc2UpIHsKICAgIGlmIChlbXB0eSgkdmFsdWVzKSkgewogICAgICAkdmFsdWVzPSR0aGlzLT5fcGFyYW1zOwogICAgfQogICAgLy9lY2hvICJoaTEiO2RpZSgpOwogICAgJGRzPSR0aGlzLT5fZ2V0ZHMoKTsKICAgIGlmICgkZHMhPT1mYWxzZSkgewogICAgICByZXR1cm4gJGRzLT5TZXRFbnRpdHlQcm9wc0Zyb21BcnJheSgkaWQsICRwcm9wcywgJHZhbHVlcywgJGNsZWFyLCAkZmlsbCk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gJHRoaXMtPkVycm9yKCJmdW5jdGlvbiBTZXRFbnRpdHlQcm9wc0Zyb21BcnJheTogQ2Fubm90IGFjY2VzcyBOZW9EYXRhU3RvcmFnZSBtb2R1bGUiKTsKICAgIH0KICB9CgoKCiAgZnVuY3Rpb24gU2V0RW50aXR5UHJvcHNPbkNyaXRlcmlhKCR0YWJsZSwgJHByb3BzLCAkY3JpdGVyaWEsICRjcmVhdGU9dHJ1ZSwgJGNsZWFyPWZhbHNlKSB7CiAgICAkZHM9JHRoaXMtPl9nZXRkcygpOwogICAgaWYgKCRkcyE9PWZhbHNlKSB7CiAgICAgIHJldHVybiAkZHMtPlNldEVudGl0eVByb3BzT25Dcml0ZXJpYSgkdGhpcy0+R2V0TmFtZSgpLCAkdGFibGUsICRwcm9wcywgJGNyaXRlcmlhLCAkY3JlYXRlLCAkY2xlYXIpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICR0aGlzLT5FcnJvcigiZnVuY3Rpb24gU2V0RW50aXR5UHJvcHNPbkNyaXRlcmlhOiBDYW5ub3QgYWNjZXNzIE5lb0RhdGFTdG9yYWdlIG1vZHVsZSIpOzs7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBSZXNldEVudGl0eVByb3BzKCRpZCwgJG5ld3Byb3BzPWFycmF5KCkpIHsKICAgICRkcz0kdGhpcy0+X2dldGRzKCk7CiAgICBpZiAoJGRzIT09ZmFsc2UpIHsKICAgICAgcmV0dXJuICRkcy0+UmVzZXRFbnRpdHlQcm9wcygkaWQsICRuZXdwcm9wKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAkdGhpcy0+RXJyb3IoImZ1bmN0aW9uIFJlc2V0RW50aXR5UHJvcHM6IENhbm5vdCBhY2Nlc3MgTmVvRGF0YVN0b3JhZ2UgbW9kdWxlIik7OzsKICAgIH0KICB9CgogIGZ1bmN0aW9uIFJlbW92ZU1vZHVsZUVudGl0aWVzKCkgewogICAgJGRzPSR0aGlzLT5fZ2V0ZHMoKTsKICAgIGlmICgkZHMhPT1mYWxzZSkgewogICAgICByZXR1cm4gJGRzLT5SZW1vdmVNb2R1bGVFbnRpdGllcygkdGhpcy0+R2V0TmFtZSgpKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAkdGhpcy0+RXJyb3IoImZ1bmN0aW9uIFJlbW92ZU1vZHVsZUVudGl0aWVzOiBDYW5ub3QgYWNjZXNzIE5lb0RhdGFTdG9yYWdlIG1vZHVsZSIpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gQ2xlYXJFbnRpdHlQcm9wcygkaWQpIHsKICAgICRkcz0kdGhpcy0+X2dldGRzKCk7CiAgICBpZiAoJGRzIT09ZmFsc2UpIHsKICAgICAgcmV0dXJuICRkcy0+Q2xlYXJFbnRpdHlQcm9wcygkaWQpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICR0aGlzLT5FcnJvcigiZnVuY3Rpb24gQ2xlYXJFbnRpdHlQcm9wczogQ2Fubm90IGFjY2VzcyBOZW9EYXRhU3RvcmFnZSBtb2R1bGUiKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIENvbXBhcmVFbnRpdGllcygkZW50aXR5MSwgJGVudGl0eTIsICRzb3J0ZmllbGQpIHsKICAgICRkcz0kdGhpcy0+X2dldGRzKCk7CiAgICBpZiAoJGRzIT09ZmFsc2UpIHsKICAgICAgJGRzLT5Db21wYXJlRW50aXRpZXMoJGVudGl0eTEsICRlbnRpdHkyLCAkc29ydGZpZWxkKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAkdGhpcy0+RXJyb3IoImZ1bmN0aW9uIENvbXBhcmVFbnRpdGllczogQ2Fubm90IGFjY2VzcyBOZW9EYXRhU3RvcmFnZSBtb2R1bGUiKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIENvbXBhcmVFbnRpdGllc0NvbXBsZXgoJGVudGl0eTEsICRlbnRpdHkyLCAkc29ydGZpZWxkcykgewogICAgJGRzPSR0aGlzLT5fZ2V0ZHMoKTsKICAgIGlmICgkZHMhPT1mYWxzZSkgewogICAgICAkZHMtPkNvbXBhcmVFbnRpdGllc0NvbXBsZXgoJGVudGl0eTEsICRlbnRpdHkyLCAkc29ydGZpZWxkKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAkdGhpcy0+RXJyb3IoImZ1bmN0aW9uIENvbXBhcmVFbnRpdGllc0NvbXBsZXg6IENhbm5vdCBhY2Nlc3MgTmVvRGF0YVN0b3JhZ2UgbW9kdWxlIik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBTb3J0RW50aXRpZXMoJGxpc3QsICRzb3J0ZmllbGRzKSB7CiAgICAkZHM9JHRoaXMtPl9nZXRkcygpOwogICAgaWYgKCRkcyE9PWZhbHNlKSB7CiAgICAgICRkcy0+U29ydEVudGl0aWVzKCRsaXN0LCAkc29ydGZpZWxkcyk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gJHRoaXMtPkVycm9yKCJmdW5jdGlvbiBTb3J0RW50aXRpZXM6IENhbm5vdCBhY2Nlc3MgTmVvRGF0YVN0b3JhZ2UgbW9kdWxlIik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBFbnRpdGllc0NvdW50KCR0YWJsZT0iIiwgJGNyaXRlcmlhPWFycmF5KCkpIHsKICAgICRkcz0kdGhpcy0+X2dldGRzKCk7CiAgICBpZiAoJGRzIT09ZmFsc2UpIHsKICAgICAgcmV0dXJuICRkcy0+RW50aXRpZXNDb3VudCgkdGhpcy0+R2V0TmFtZSgpLCAkdGFibGUsICRjcml0ZXJpYSk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gJHRoaXMtPkVycm9yKCJmdW5jdGlvbiBFbnRpdGllc0NvdW50OiBDYW5ub3QgYWNjZXNzIE5lb0RhdGFTdG9yYWdlIG1vZHVsZSIpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gQ2xlYXJNb2R1bGVFbnRpdGllcygpIHsKICAgICRkcz0kdGhpcy0+X2dldGRzKCk7CiAgICBpZiAoJGRzIT09ZmFsc2UpIHsKICAgICAgcmV0dXJuICRkcy0+Q2xlYXJNb2R1bGVFbnRpdGllcygkdGhpcy0+R2V0TmFtZSgpKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAkdGhpcy0+RXJyb3IoImZ1bmN0aW9uIENsZWFyTW9kdWxlRW50aXRpZXM6IENhbm5vdCBhY2Nlc3MgTmVvRGF0YVN0b3JhZ2UgbW9kdWxlIik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBDb3VudEVudGl0aWVzKCR0YWJsZSwgJGNyaXRlcmlhPWFycmF5KCkpIHsKICAgICRlbnRpdGllcz0kdGhpcy0+R2V0RW50aXRpZXMoJHRhYmxlLCAkY3JpdGVyaWEsIHRydWUpOwogICAgcmV0dXJuIGNvdW50KCRlbnRpdGllcyk7CiAgfQoKICBmdW5jdGlvbiBJc1RhYmxlRW1wdHkoJHRhYmxlKSB7ICAgIAogICAgcmV0dXJuICgkdGhpcy0+Q291bnRFbnRpdGllcygkdGFibGUpPT0wKTsKICB9CgogIC8qCiAgICoKICAgKiBDb25uZWN0aW9uIGZ1bmN0aW9ucwogICAqCiAgICovCgogIGZ1bmN0aW9uIFNldEVudGl0eUNvbm5lY3Rpb24oJGlkMSwgJGlkMiwgJHR5cGU9IiIpIHsKICAgICRkcz0kdGhpcy0+X2dldGRzKCk7CiAgICBpZiAoJGRzIT09ZmFsc2UpIHsKICAgICAgcmV0dXJuICRkcy0+U2V0RW50aXR5Q29ubmVjdGlvbigkaWQxLCAkaWQyLCAkdHlwZSk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gJHRoaXMtPkVycm9yKCJmdW5jdGlvbiBTZXRFbnRpdHlDb25uZWN0aW9uOiBDYW5ub3QgYWNjZXNzIE5lb0RhdGFTdG9yYWdlIG1vZHVsZSIpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gQ2xlYXJFbnRpdHlDb25uZWN0aW9ucygkaWQxLCAkaWQyPS0xLCAkdHlwZT0iIikgewogICAgJGRzPSR0aGlzLT5fZ2V0ZHMoKTsKICAgIGlmICgkZHMhPT1mYWxzZSkgewogICAgICByZXR1cm4gJGRzLT5DbGVhckVudGl0eUNvbm5lY3Rpb25zKCRpZDEsICRpZDIsICR0eXBlKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAkdGhpcy0+RXJyb3IoImZ1bmN0aW9uIENsZWFyRW50aXR5Q29ubmVjdGlvbnM6IENhbm5vdCBhY2Nlc3MgTmVvRGF0YVN0b3JhZ2UgbW9kdWxlIik7CiAgICB9CiAgfQoKCgogIGZ1bmN0aW9uIENsZWFyRW50aXR5Q29ubmVjdGlvbigkaWQxLCAkaWQyLCAkdHlwZT0iIikgewogICAgJGRzPSR0aGlzLT5fZ2V0ZHMoKTsKICAgIGlmICgkZHMhPT1mYWxzZSkgewogICAgICByZXR1cm4gJGRzLT5DbGVhckVudGl0eUNvbm5lY3Rpb24oJGlkMSwgJGlkMiwgJHR5cGUpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICR0aGlzLT5FcnJvcigiZnVuY3Rpb24gQ2xlYXJFbnRpdHlDb25uZWN0aW9uOiBDYW5ub3QgYWNjZXNzIE5lb0RhdGFTdG9yYWdlIG1vZHVsZSIpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gQ2hlY2tFbnRpdHlDb25uZWN0aW9uKCRpZDEsICRpZDIsICR0eXBlPSIiLCAkcmV0dXJudmFsdWU9dHJ1ZSkgewogICAgJGRzPSR0aGlzLT5fZ2V0ZHMoKTsKICAgIGlmICgkZHMhPT1mYWxzZSkgewogICAgICByZXR1cm4gJGRzLT5DaGVja0VudGl0eUNvbm5lY3Rpb24oJGlkMSwgJGlkMiwgJHR5cGUsICRyZXR1cm52YWx1ZSk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gJHRoaXMtPkVycm9yKCJmdW5jdGlvbiBDaGVja0VudGl0eUNvbm5lY3Rpb246IENhbm5vdCBhY2Nlc3MgTmVvRGF0YVN0b3JhZ2UgbW9kdWxlIik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBHZXRFbnRpdHlDb25uZWN0aW9ucygkaWQxLCAkaWQyPS0xLCAkdHlwZT0iIikgewogICAgJGRzPSR0aGlzLT5fZ2V0ZHMoKTsKICAgIGlmICgkZHMhPT1mYWxzZSkgewogICAgICByZXR1cm4gJGRzLT5HZXRFbnRpdHlDb25uZWN0aW9ucygkaWQxLCAkaWQyLCAkdHlwZSk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gJHRoaXMtPkVycm9yKCJmdW5jdGlvbiBHZXRFbnRpdHlDb25uZWN0aW9uczogQ2Fubm90IGFjY2VzcyBOZW9EYXRhU3RvcmFnZSBtb2R1bGUiKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIEFkZEZpZWxkU2V0KCRuYW1lLCRmaWVsZHMpIHsKICAgICRkcz0kdGhpcy0+X2dldGRzKCk7CiAgICBpZiAoJGRzIT09ZmFsc2UpIHsKICAgICAgcmV0dXJuICRkcy0+QWRkRmllbGRTZXQoJHRoaXMtPkdldE5hbWUoKSwkbmFtZSwkZmllbGRzKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAkdGhpcy0+RXJyb3IoImZ1bmN0aW9uIEFkZEZpZWxkU2V0OiBDYW5ub3QgYWNjZXNzIE5lb0RhdGFTdG9yYWdlIG1vZHVsZSIpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gR2V0RmllbGRTZXQoJG5hbWUpIHsKICAgICRkcz0kdGhpcy0+X2dldGRzKCk7CiAgICBpZiAoJGRzIT09ZmFsc2UpIHsKICAgICAgcmV0dXJuICRkcy0+R2V0RmllbGRTZXQoJHRoaXMtPkdldE5hbWUoKSwkbmFtZSk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gJHRoaXMtPkVycm9yKCJmdW5jdGlvbiBHZXRGaWVsZFNldDogQ2Fubm90IGFjY2VzcyBOZW9EYXRhU3RvcmFnZSBtb2R1bGUiKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIEVudGl0eVNldFVuc2V0UHJvcHMoJGVudGl0eSwkZmllbGRzZXQsJGZpbGx2YWx1ZT0iIikgewogICAgJGRzPSR0aGlzLT5fZ2V0ZHMoKTsKICAgIGlmICgkZHMhPT1mYWxzZSkgewogICAgICByZXR1cm4gJGRzLT5FbnRpdHlTZXRVbnNldFByb3BzKCR0aGlzLT5HZXRGaWVsZFNldCgkdGhpcy0+R2V0TmFtZSgpKSwkZW50aXR5LCRmaWVsZHNldCwkZmlsbHZhbHVlPSIiKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAkdGhpcy0+RXJyb3IoImZ1bmN0aW9uIEdldEZpZWxkU2V0OiBDYW5ub3QgYWNjZXNzIE5lb0RhdGFTdG9yYWdlIG1vZHVsZSIpOwogICAgfQogIH0KCgogIGZ1bmN0aW9uIEdldERTRXJyb3JzKCRubDJicj10cnVlLCRjbGVhcj10cnVlKSB7CiAgICAkZHM9JHRoaXMtPl9nZXRkcygpOwogICAgaWYgKCRkcyE9PWZhbHNlKSB7CiAgICAgIHJldHVybiAkZHMtPkdldEVycm9ycygkbmwyYnIsJGNsZWFyKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAkdGhpcy0+RXJyb3IoImZ1bmN0aW9uIEdldEZpZWxkU2V0OiBDYW5ub3QgYWNjZXNzIE5lb0RhdGFTdG9yYWdlIG1vZHVsZSIpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gU2hvd0RTRXJyb3JzKCRjbGVhcj10cnVlKSB7CiAgICAkZHM9JHRoaXMtPl9nZXRkcygpOwogICAgaWYgKCRkcyE9PWZhbHNlKSB7CiAgICAgIHJldHVybiAkZHMtPkdldEVycm9ycygkY2xlYXIpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICR0aGlzLT5FcnJvcigiZnVuY3Rpb24gU2hvd0RTRXJyb3JzOiBDYW5ub3QgYWNjZXNzIE5lb0RhdGFTdG9yYWdlIG1vZHVsZSIpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gRFNJbkVycm9yKCkgewogICAgJGRzPSR0aGlzLT5fZ2V0ZHMoKTsKICAgIGlmICgkZHMhPT1mYWxzZSkgewogICAgICByZXR1cm4gJGRzLT5JbkVycm9yKCk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gJHRoaXMtPkVycm9yKCJmdW5jdGlvbiBEU0luRXJyb3I6IENhbm5vdCBhY2Nlc3MgTmVvRGF0YVN0b3JhZ2UgbW9kdWxlIik7CiAgICB9CiAgfQoKICAvKgogICAqCiAgICogVXRpbGl0eSBmdW5jdGlvbnMKICAgKgogICAqLwoKICBmdW5jdGlvbiBOZW9TbGFzaGVzKCR1cmwpIHsKCQkkcmVzdWx0PXN0cl9yZXBsYWNlKCJcXCIsIi8iLCR1cmwpOwogICAgLy9ZZXMsIHBocCB1bmRlciB3aW5kb3dzIHJ1bnMgcGVyZmVjdGx5IHdpdGggdGhvc2Ugc2xhc2hlcywgYXMgbG9uZyBhcyB5b3UKICAgIC8vZG9uJ3QgbWl4IHRoZW0gd2l0aCBiYWNrc2xhc2hlcyEhCgkJLy8kcmVzdWx0PXN0cl9yZXBsYWNlKCIvIixESVJFQ1RPUllfU0VQQVJBVE9SLCR1cmwpOwoJCS8vcmV0dXJuIHN0cl9yZXBsYWNlKCJcXCIsRElSRUNUT1JZX1NFUEFSQVRPUiwkcmVzdWx0KTsKCQlyZXR1cm4gJHJlc3VsdDsKCX0KCiAgZnVuY3Rpb24gRGVjb2RlSFRNTEVudGl0aWVzKCRzKSB7CiAgICAkdG1wPWh0bWxfZW50aXR5X2RlY29kZSgkcyk7CiAgICB3aGlsZSAoJHRtcCE9aHRtbF9lbnRpdHlfZGVjb2RlKCR0bXApKSB7CiAgICAgICR0bXA9aHRtbF9lbnRpdHlfZGVjb2RlKCR0bXApOwogICAgfQogICAgcmV0dXJuIGh0bWxfZW50aXR5X2RlY29kZSgkdG1wKTsKICB9CgogIGZ1bmN0aW9uIFNsYXNoZXMoJHVybCkgewogICAgcmV0dXJuICR0aGlzLT5OZW9TbGFzaGVzKCR1cmwpOwogIH0KCglmdW5jdGlvbiBTbGFzaCgkc3RyLCRzdHIyPSIiLCRzdHIzPSIiKSB7CgkJaWYgKCRzdHI9PSIiKSByZXR1cm4gJHN0cjI7CgkJaWYgKCRzdHIyPT0iIiAmJiAkc3RyMz09IiIpIHJldHVybiAkc3RyOwogICAgJHJlc3VsdD0iIjsKCQlpZiAoJHN0cltzdHJsZW4oJHN0ciktMV0hPSIvIikgewoJCQlpZiAoJHN0cjJbMF0hPSIvIikgewoJCQkJJHJlc3VsdD0kc3RyLiIvIi4kc3RyMjsKCQkJfSBlbHNlIHsKCQkJCSRyZXN1bHQ9JHN0ci4kc3RyMjsKCQkJfQoJCX0gZWxzZSB7CgkJCWlmICgkc3RyMlswXSE9Ii8iKSB7CgkJCQkkcmVzdWx0PSRzdHIuJHN0cjI7CgkJCX0gZWxzZSB7CgkJCQkkcmVzdWx0PSRzdHIuc3Vic3RyKCRzdHIyLDEpOyAvL3RyaW0gYXdheSBvbmUgb2YgdGhlIHNsYXNoZXMKCQkJfQoJCX0KICAgIGlmICgkc3RyMz09IiIpIHJldHVybiAkcmVzdWx0OwogICAgaWYgKCRyZXN1bHRbc3RybGVuKCRyZXN1bHQpLTFdIT0iLyIpIHsKCQkJaWYgKCRzdHIzWzBdIT0iLyIpIHsKCQkJCSRyZXN1bHQ9JHJlc3VsdC4iLyIuJHN0cjM7CgkJCX0gZWxzZSB7CgkJCQkkcmVzdWx0PSRyZXN1bHQuJHN0cjM7CgkJCX0KCQl9IGVsc2UgewoJCQlpZiAoJHN0cjNbMF0hPSIvIikgewoJCQkJJHJlc3VsdD0kcmVzdWx0LiRzdHIzOwoJCQl9IGVsc2UgewoJCQkJJHJlc3VsdD0kcmVzdWx0LnN1YnN0cigkc3RyMywxKTsgLy90cmltIGF3YXkgb25lIG9mIHRoZSBzbGFzaGVzCgkJCX0KCQl9CiAgICByZXR1cm4gJHJlc3VsdDsKCX0KCiAgZnVuY3Rpb24gTmVvRGlyTGlzdCgkcm9vdCwkcmV0dXJuPSJmaWxlcyIsJGludHJvZHVjdGlvbj1hcnJheSgpLCRleGNsdWRlcz1hcnJheSgpLCRtYXhyZWN1cnNpb249LTEpIHsKICAgICRkaXJsaXN0PWFycmF5KCk7CiAgICAkY29uZmlnPSR0aGlzLT5HZXRDb25maWcoKTsKICAgICRtb2RlPSIiOwogICAgc3dpdGNoKCRyZXR1cm4pIHsKICAgICAgY2FzZSAiZmlsZXMiOiAkbW9kZT0iRklMRVMiO2JyZWFrOwogICAgICBjYXNlICJkaXJzIjogJG1vZGU9IkRJUlMiO2JyZWFrOwogICAgICBjYXNlICJib3RoIjogJG1vZGU9IkZVTEwiO2JyZWFrOwogICAgfQogICAgJGZ1bGxyb290PSR0aGlzLT5TbGFzaCgkY29uZmlnWyJyb290X3BhdGgiXSwkcm9vdCk7CiAgICAkZmlsZXJlYz0gZ2V0X3JlY3Vyc2l2ZV9maWxlX2xpc3QgKCRmdWxscm9vdCwgJGV4Y2x1ZGVzICwkbWF4cmVjdXJzaW9uICwkbW9kZSk7IC8vTm8gbWF4ZGVwdGggaW4gcmVjdXJzaW9uCiAgICBpZiAoIWVtcHR5KCRpbnRyb2R1Y3Rpb24pKSB7CiAgICAgICRkaXJsaXN0PSRpbnRyb2R1Y3Rpb247CiAgICB9CiAgICBmb3JlYWNoKCRmaWxlcmVjIGFzICRrZXk9PiR2YWx1ZSkgewogICAgICAkdmFsdWUxPSR0aGlzLT5TbGFzaGVzKHN0cl9yZXBsYWNlKCRjb25maWdbJ3Jvb3RfcGF0aCddLCcnLCR2YWx1ZSkpOwogICAgICAvL3ByZXZlbnQgY3VycmVudCBkaXIgZnJvbSBzaG93aW5nIHVwCiAgICAgIC8vaWYgKCR2YWx1ZTE9PSgkcHJvZmlsZVsicGF0aCJdLiIvIikpIGNvbnRpbnVlOwogICAgICAvL0NoZWNrIGZvciBoaWRkZW4gZmlsZXMKICAgICAgJGRpcnM9ZXhwbG9kZSgiLyIsJHZhbHVlMSk7CiAgICAgICRoaWRkZW49ZmFsc2U7CiAgICAgIGZvcmVhY2goJGRpcnMgYXMgJGRpcikgewogICAgICAgIGlmIChzdWJzdHIoJGRpciwwLDEpPT0iLiIpIHskaGlkZGVuPXRydWU7IGJyZWFrO30KICAgICAgfQogICAgICBpZiAoJGhpZGRlbikgY29udGludWU7CgogICAgICAvL25vdCBoaWRkZW4sIGFkZCB0byBsaXN0CiAgICAgICRkaXJsaXN0WyR2YWx1ZTFdPSR2YWx1ZTE7CiAgICB9CiAgICByZXR1cm4gJGRpcmxpc3Q7CiAgfQoKICAvKkNoZWNrcyBmb3IgdGhlIGV4aXN0ZW5jZSBvZiBhbiBpbmRleCBpbiBhbiBhcnJheSBhbmQgcmV0dXJuIHRoZSB2YWx1ZSBpZiBpdCdzIHRoZXJlCiAgICphbmQgdGhlIGRlZmF1bHQgdmFsdWUgaWYgaXQncyBub3QKICAqLwogIGZ1bmN0aW9uIE5lb1BhcmFtVmFsdWUoJG5hbWUsJHBhcmFtcz1hcnJheSgpLCRkZWZhdWx0PSIiKSB7CiAgICAKICAgIGlmICghaXNfYXJyYXkoJHBhcmFtcykpIHsKICAgICAgLy9UaGlzIHdheSAybmQgcGFyYW1ldGVyIGNhbiBhbHNvIGJlIHVzZWQgYXMgZGVmYXVsdCB2YWx1ZQogICAgICBpZiAoJHBhcmFtcyE9IiIgJiYgJGRlZmF1bHQ9PSIiKSB7CiAgICAgICAgJGRlZmF1bHQ9JHBhcmFtczsKICAgICAgfQogICAgICAkcGFyYW1zPSR0aGlzLT5fcGFyYW1zOwogICAgfSBlbHNlIHsKICAgICAgaWYgKGVtcHR5KCRwYXJhbXMpKSAkcGFyYW1zPSR0aGlzLT5fcGFyYW1zOwogICAgfQogICAgaWYgKCFpc19hcnJheSgkbmFtZSkpIHsKICAgICAgaWYgKGlzc2V0KCRwYXJhbXNbJG5hbWVdKSkgcmV0dXJuICRwYXJhbXNbJG5hbWVdOwogICAgICByZXR1cm4gJGRlZmF1bHQ7CiAgICB9IGVsc2UgewogICAgICBmb3JlYWNoICgkbmFtZSBhcyAkc2luZ2xlbmFtZSkgewogICAgICAgIGlmIChpc3NldCgkcGFyYW1zWyRzaW5nbGVuYW1lXSkpIHJldHVybiAkcGFyYW1zWyRzaW5nbGVuYW1lXTsKICAgICAgfQogICAgICByZXR1cm4gJGRlZmF1bHQ7CiAgICB9CiAgfQoKICAvL1Nob3J0Y3V0IGZvciB0aGUgYWJvdmUKICBmdW5jdGlvbiBOUFYoJG5hbWUsICRwYXJhbXM9ZmFsc2UsICRkZWZhdWx0PSIiKSB7CiAgICByZXR1cm4gJHRoaXMtPk5lb1BhcmFtVmFsdWUoJG5hbWUsICRwYXJhbXMsICRkZWZhdWx0KTsKICB9CgogIEZ1bmN0aW9uIE5lb0FwcGx5UGFyYW1WYWx1ZXMoJHRoaXNhcnJheSwgJHBhcmFtcz1hcnJheSgpLCAkaW5kZXhlcz1hcnJheSgpLCAkYWx3YXlzZmlsbD1mYWxzZSkgewogICAgaWYgKGVtcHR5KCRwYXJhbXMpKSAkcGFyYW1zPSR0aGlzLT5fcGFyYW1zOwogICAgaWYgKGVtcHR5KCRwYXJhbXMpIHx8IGVtcHR5KCRpbmRleGVzKSkgcmV0dXJuICR0aGlzYXJyYXk7CiAgICBpZiAoaXNfYXNzb2MoJGluZGV4ZXMpKSB7CiAgICAgIGZvcmVhY2goJGluZGV4ZXMgYXMgJGluZGV4PT4kZGVmYXVsdHZhbHVlKSB7CiAgICAgICAgaWYgKGlzc2V0KCRwYXJhbXNbJGluZGV4XSkpIHsKICAgICAgICAgICR0aGlzYXJyYXlbJGluZGV4XT0kcGFyYW1zWyRpbmRleF07CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICR0aGlzYXJyYXlbJGluZGV4XT0kZGVmYXVsdHZhbHVlOwogICAgICAgIH0KICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgZm9yZWFjaCgkaW5kZXhlcyBhcyAkaW5kZXgpIHsKICAgICAgICBpZiAoaXNzZXQoJHBhcmFtc1skaW5kZXhdKSkgewogICAgICAgICAgJHRoaXNhcnJheVskaW5kZXhdPSRwYXJhbXNbJGluZGV4XTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgaWYgKCRhbHdheXNmaWxsKSB7CiAgICAgICAgICAgIGlmICghaXNzZXQoJHRoaXNhcnJheVskaW5kZXhdKSkgJHRoaXNhcnJheVskaW5kZXhdPSIiOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogICAgLy9wcmludF9yKCR0aGlzYXJyYXkpOwogICAgcmV0dXJuICR0aGlzYXJyYXk7CiAgfQoKICBmdW5jdGlvbiBNYWtlU2ltcGxlQXJyYXkoJHRhYmxlLCRmaWVsZCwkYXNzb2NpZD10cnVlKSB7CiAgICAkZHM9JHRoaXMtPl9nZXRkcygpOwogICAgaWYgKCRkcyE9PWZhbHNlKSB7CiAgICAgIHJldHVybiAkZHMtPk1ha2VTaW1wbGVBcnJheSgkdGhpcy0+R2V0TmFtZSgpLCAkdGFibGUsICRmaWVsZCwgJGFzc29jaWQpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICR0aGlzLT5FcnJvcigiZnVuY3Rpb24gTWFrZVNpbXBsZUFycmF5OiBDYW5ub3QgYWNjZXNzIE5lb0RhdGFTdG9yYWdlIG1vZHVsZSIpOzsKICAgIH0KICB9CgogIGZ1bmN0aW9uIE1ha2VBc3NvY0FycmF5KCR0YWJsZSwkZmllbGRzKSB7CiAgICAkZHM9JHRoaXMtPl9nZXRkcygpOwogICAgaWYgKCRkcyE9PWZhbHNlKSB7CiAgICAgIHJldHVybiAkZHMtPk1ha2VBc3NvY0FycmF5KCR0aGlzLT5HZXROYW1lKCksICR0YWJsZSwgJGZpZWxkcyk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gJHRoaXMtPkVycm9yKCJmdW5jdGlvbiBNYWtlQXNzb2NBcnJheTogQ2Fubm90IGFjY2VzcyBOZW9EYXRhU3RvcmFnZSBtb2R1bGUiKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIENoZWNrRmlsZUV4dGVuc2lvbigkZmlsZW5hbWUsICRhbGxvd2VkZXh0ZW5zaW9ucz1hcnJheSgpKSB7CgkJJGV4cGxvZGVkZmlsZT1leHBsb2RlKCIuIiwkZmlsZW5hbWUpOwoJCSRleHQ9c3RydG9sb3dlcihhcnJheV9wb3AoJGV4cGxvZGVkZmlsZSkpOwoJCWlmIChpbl9hcnJheSgkZXh0LCRhbGxvd2VkZXh0ZW5zaW9ucykpIHJldHVybiB0cnVlOwogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgZnVuY3Rpb24gTmVvVG9vbFRpcCgkcGFyYW1zPWFycmF5KCkpIHsKICAgICR0ZXh0PSR0aGlzLT5OUFYoInRleHQiLCRwYXJhbXMsIj8iKTsKICAgICR1cmw9JHRoaXMtPk5QVigidXJsIiwkcGFyYW1zLCIiKTsKICAgICR0aXRsZT0kdGhpcy0+TlBWKCJ0aXRsZSIsJHBhcmFtcywiIik7CiAgICAkY29udGVudD0kdGhpcy0+TlBWKCJjb250ZW50IiwkcGFyYW1zLCIiKTsKICAgICRzcGFuY2xhc3M9JHRoaXMtPk5QVigic3BhbmNsYXNzIiwkcGFyYW1zLCJuZW90b29sdGlwIik7CiAgICBpZiAoJHVybCE9IiIpIHsKICAgICAgJHJlc3VsdD0nPGEgY2xhc3M9IicuJHNwYW5jbGFzcy4nIiBocmVmPSInLiR1cmwuJyI+JzsKICAgIH0gZWxzZSB7CiAgICAgICRyZXN1bHQ9JzxhIGNsYXNzPSInLiRzcGFuY2xhc3MuJyIgc3R5bGU9ImN1cnNvcjogZGVmYXVsdDsiIGhyZWY9IiMiIG9uY2xpY2s9InJldHVybiBmYWxzZTsiPic7CiAgICB9CiAgICAkcmVzdWx0Lj0kdGV4dDsKICAgICRyZXN1bHQuPSc8c3Bhbj4nOwogICAgaWYgKCR0aXRsZSE9IiIpIHsKICAgICAgJHJlc3VsdC49IjxzdHJvbmc+Ii4kdGl0bGUuIjwvc3Ryb25nPjxici8+IjsKICAgIH0KICAgICRyZXN1bHQuPSRjb250ZW50OwogICAgJHJlc3VsdC49Ijwvc3Bhbj4iOwogICAgJHJlc3VsdC49IjwvYT4iOwogICAgcmV0dXJuICRyZXN1bHQ7CiAgfQoKICBmdW5jdGlvbiBOZW9FbXB0eSgkaW5kZXg9IiIsJGRhdGE9YXJyYXkoKSkgewogICAgaWYgKCFpc19hcnJheSgkZGF0YSkpIHJldHVybiB0cnVlOwogICAgaWYgKGVtcHR5KCRkYXRhKSkgewogICAgICAkZGF0YT0kdGhpcy0+X3BhcmFtczsKICAgIH0KICAgIGlmIChlbXB0eSgkZGF0YSkpIHJldHVybiB0cnVlOwogICAgaWYgKCRpbmRleD09IiIpIHJldHVybiB0cnVlOwogICAgaWYgKCFpc3NldCgkZGF0YVskaW5kZXhdKSkgcmV0dXJuIHRydWU7CiAgICBpZiAodHJpbSgkZGF0YVskaW5kZXhdKT09IiIpIHJldHVybiB0cnVlOwogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgZnVuY3Rpb24gTmVvVmFsaWRhdGVFbWFpbCgkZW1haWwsICRhdm9pZG9ubGluZSA9IGZhbHNlKSB7CiAgICBpZiAoZXJlZ2koIl5bYS16QS1aMC05X10rQFthLXpBLVowLTlcLV0rXC5bYS16QS1aMC05XC1cLl0rJF0iLCAkZW1haWwpKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICBpZiAoJGF2b2lkb25saW5lKSByZXR1cm4gdHJ1ZTsKCiAgICBsaXN0KCRVc2VybmFtZSwgJERvbWFpbikgPSBzcGxpdCgiQCIsICRlbWFpbCk7CgogICAgaWYgKGdldG14cnIoJERvbWFpbiwgJE1YSG9zdCkpIHsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9IGVsc2UgewogICAgICBpZiAoQGZzb2Nrb3BlbigkRG9tYWluLCAyNSwgJGVycm5vLCAkZXJyc3RyLCAzMCkpIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgIH0KICB9CgogIGZ1bmN0aW9uIE5lb1ZhbGlkYXRlVVJMKCR1cmwpIHsKICAgIC8vJHBhdHRlcm4gPSAnL14oKFtcd10rOik/XC9cLyk/KChbXGRcd118JVthLWZBLWZcZF17MiwyfSkrKDooW1xkXHddfCVbYS1mQS1mXGRdezIsMn0pKyk/QCk/KFtcZFx3XVstXGRcd117MCwyNTN9W1xkXHddXC4pK1tcd117Miw0fSg6W1xkXSspPyhcLyhbLStffi5cZFx3XXwlW2EtZkEtZlxkXXsyLDJ9KSopKihcPygmYW1wOz8oWy0rX34uXGRcd118JVthLWZBLWZcZF17MiwyfSk9PykqKT8oIyhbLStffi5cZFx3XXwlW2EtZkEtZlxkXXsyLDJ9KSopPyQvJzsKICAgIHJldHVybiAoICEgcHJlZ19tYXRjaCgnL14oaHR0cHxodHRwc3xmdHApOlwvXC8oW0EtWjAtOV1bQS1aMC05Xy1dKig/OlwuW0EtWjAtOV1bQS1aMC05Xy1dKikrKTo/KFxkKyk/XC8/L2knLCAkdXJsKSkgPyBGQUxTRSA6IFRSVUU7CgoJICAvL3JldHVybiBwcmVnX21hdGNoKCRwYXR0ZXJuLCAkdXJsKTsKICB9CgogIGZ1bmN0aW9uIE5lb05vQnJlYWtzKCRzdHJpbmcpIHsKICAgICRzdHJpbmc9c3RyX3JlcGxhY2UoIiAiLCImbmJzcDsiLCRzdHJpbmcpOwogICAgcmV0dXJuICRzdHJpbmc7CiAgfQoKICBmdW5jdGlvbiBOZW9QcmludFIoJGRhdGE9YXJyYXkoKSwkc2VuZG91dD10cnVlKSB7CiAgICBpZiAoZW1wdHkoJGRhdGEpKSB7CiAgICAgICRkYXRhPSR0aGlzLT5fcGFyYW1zOwogICAgfQogICAgaWYgKGVtcHR5KCRkYXRhKSkgewogICAgICAkZGF0YT0ibm8gY29udGVudCBmb3VuZCI7CiAgICB9CiAgICAkb3V0cHV0PSc8YnIvPjxkaXYgc3R5bGU9ImJvcmRlcjoxcHggc29saWQgYmxhY2siPic7CiAgICAkb3V0cHV0Lj0iPHByZT4iOwogICAgJG91dHB1dC49cHJpbnRfcigkZGF0YSx0cnVlKTsKICAgICRvdXRwdXQuPSI8L3ByZT4iOwogICAgJG91dHB1dC49IjwvZGl2Pjxici8+IjsKICAgIGlmICgkc2VuZG91dCkgewogICAgICBlY2hvICRvdXRwdXQ7CiAgICB9CiAgICByZXR1cm4gJG91dHB1dDsKICB9CgogIAoKICAvKgogICAqCiAgICogU21hcnR5IHNob3J0Y3V0cwogICAqCiAgICovCiAgZnVuY3Rpb24gU21hcnR5QXNzaWduKCRzbWFydHlpbmZvLCAkc21hcnR5Y29udGVudD0iIikgewogICAgaWYgKCFpc19hcnJheSgkc21hcnR5aW5mbykpIHsKICAgICAgaWYgKCRzbWFydHlpbmZvIT0iIikgewogICAgICAgICR0aGlzLT5zbWFydHktPmFzc2lnbigkc21hcnR5aW5mbywgJHNtYXJ0eWNvbnRlbnQpOwogICAgICB9IGVsc2UgewogICAgICAgIGlmICgkc21hcnR5aW5mbz09IiIpIHsKICAgICAgICAgIHJldHVybiAkdGhpcy0+RXJyb3IoImZ1bmN0aW9uIFNtYXJ0eUFzc2lnbjogc21hcnR5LXZhcm5hbWUgbm90IHNldCIsZmFsc2UsYXJyYXkoInNtYXJ0eWluZm8iPT4kc21hcnR5aW5mbywic21hcnR5Y29udGVudCI9PiRzbWFydHljb250ZW50KSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgLy9PayBpdCdzIGFuIGFycmF5CiAgICBpZiAoaXNfYXNzb2MoJHNtYXJ0eWluZm8pKSB7CiAgICAgIC8vSXQncyBhbiBhc3NvY19hcnJheSwgc28gd2UgYXNzaWduIGV2ZXJ5IHNpbmdsZSBwYWlyIG9mIGluZm8KICAgICAgZm9yZWFjaCgkc21hcnR5aW5mbyBhcyAkc21hcnR5bmFtZT0+JHNtYXJ0eWNvbnRlbnQpIHsKICAgICAgICBpZiAoaXNfYXJyYXkoJHNtYXJ0eWNvbnRlbnQpKSB7CiAgICAgICAgICAvL2l0J3MgYSBuZXN0ZWQgYXJyYXkKICAgICAgICAgICR0aGlzLT5zbWFydHktPmFzc2lnbl9ieV9yZWYoJHNtYXJ0eW5hbWUsICRzbWFydHljb250ZW50KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCRzbWFydHluYW1lLCAkc21hcnR5Y29udGVudCk7CiAgICAgICAgfQogICAgICB9CiAgICB9IGVsc2UgewogICAgICAvL0l0J3Mgbm90IGFuIGFzc29jX2FycmF5LCBzbyB3ZSBzaW1wbHkgcmVmLWFzc2lnbiBpdC4KICAgICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduX2J5X3JlZigkc21hcnR5aW5mbywgJHNtYXJ0eWNvbnRlbnQpOwogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQoKICBmdW5jdGlvbiBOZW9TbWFydHlBc3NpZ24oJHNtYXJ0eWluZm8sICRzbWFydHljb250ZW50PSIiKSB7CiAgICAkdGhpcy0+U21hcnR5QXNzaWduKCRzbWFydHlpbmZvLCAkc21hcnR5Y29udGVudCk7CiAgfQoKICBmdW5jdGlvbiBTbWFydHlBc3NpZ25QcmVmKCRzbWFydHluYW1lLCAkcHJlZmVyZW5jZW5hbWU9IiIpIHsKICAgIGlmICgkcHJlZmVyZW5jZW5hbWUhPSIiKSB7CiAgICAgICR0aGlzLT5TbWFydHlBc3NpZ24oJHNtYXJ0eW5hbWUsICR0aGlzLT5QcmVmKCRwcmVmZXJlbmNlbmFtZSkpOwogICAgfSBlbHNlIHsKICAgICAgJHRoaXMtPlNtYXJ0eUFzc2lnbigkc21hcnR5bmFtZSwgJHRoaXMtPlByZWYoJHNtYXJ0eW5hbWUpKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIFNtYXJ0eUFzc2lnbkNNUygkbW9kdWxlLCRzbWFydHluYW1lPSJtb2R1bGUiKSB7CiAgICBpZiAoaXNfb2JqZWN0KCRtb2R1bGUpKSB7CiAgICAgICR0aGlzLT5zbWFydHktPmFzc2lnbl9ieV9yZWYoJHNtYXJ0eW5hbWUsICRtb2R1bGUpOwogICAgfSBlbHNlIHsKICAgICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduX2J5X3JlZigkc21hcnR5bmFtZSwgJHRoaXMtPkdldE1vZHVsZUluc3RhbmNlKCRtb2R1bGUpKTsKICAgIH0KICB9CgogIC8qCiAgICoKICAgKiBEZWJ1Z2dpbmcgZnVuY3Rpb25zCiAgICoKICAgKi8KCiAgZnVuY3Rpb24gRmlyZURlYnVnKCRjb21tYW5kLCRtZXNzYWdlPSIiLCR2YXJpYWJsZXM9YXJyYXkoKSkgewogICAgJGZpcmVwaHBtb2R1bGU9JHRoaXMtPkdldE1vZHVsZUluc3RhbmNlKCdGaXJlUEhQRGVidWcnKTsKICAgIGlmICgkZmlyZXBocG1vZHVsZSkgewogICAgICAvL01vZHVsZSBmb3VuZAogICAgICAkZmlyZXBocG1vZHVsZS0+U2V0TW9kdWxlTmFtZSgkdGhpcy0+R2V0TmFtZSgpKTsKICAgICAgJGZpcmVwaHBtb2R1bGUtPkNvbW1hbmQoJGNvbW1hbmQsICRtZXNzYWdlLCAkdmFyaWFibGVzKTsKICAgIH0gLy9lbHNlIE1vZHVsZSBub3QgZm91bmR9CiAgfQoKCiAgLyoKICAgKgogICAqIEVycm9yIGhhbmRsaW5nCiAgICoKICAgKi8KICBmdW5jdGlvbiBFcnJvcigkZXJyb3J0ZXh0LCRyZXR1cm52YWx1ZT1mYWxzZSwkcGFyYW1zPWFycmF5KCkpIHsKICAgICR0aGlzLT5fZXJyb3JzLj0kdGV4dDsKICAgIGlmICghZW1wdHkoJHBhcmFtcykgJiYgaXNfYXJyYXkoJHBhcmFtcykpIHsKICAgICAgJHRoaXMtPl9lcnJvcnMuPSIgKCI7CiAgICAgICRmaXJzdD10cnVlOyAvL0hhbmRsaW5nIHRoZSBjb21tYQogICAgICBmb3JlYWNoICgkcGFyYW1zIGFzICRwYXJhbT0+JHZhbHVlKSB7CiAgICAgICAgaWYgKCRmaXJzdCkgJGZpcnN0PWZhbHNlOyBlbHNlICR0aGlzLT5fZXJyb3JzLj0iLCI7CiAgICAgICAgJHRoaXMtPl9lcnJvcnMuPSRwYXJhbS4iPT4iLiR2YWx1ZTsKICAgICAgfQogICAgICAkdGhpcy0+X2Vycm9ycy49IikiOwogICAgfQogICAgJHRoaXMtPl9lcnJvcnMuPSJcbiI7CiAgICByZXR1cm4gJHJldHVybnZhbHVlOwogIH0KCiAgZnVuY3Rpb24gR2V0RXJyb3JzKCRubDJicj10cnVlLCRjbGVhcj10cnVlLCRpbmNsdWRlZHM9dHJ1ZSkgewogICAgJGVycm9ycz0kdGhpcy0+X2Vycm9yczsKICAgIGlmICgkbmwyYnIpIHsKICAgICAgJGVycm9ycz1ubDJicigkZXJyb3JzKTsKICAgIH0KICAgIGlmICgkaW5jbHVkZWRzKSB7CiAgICAgIGlmICgkdGhpcy0+RFNJbkVycm9yKCkpIHsKICAgICAgICAkZXJyb3JzLj0kdGhpcy0+R2V0RFNFcnJvcnMoJG5sMmJyLCRjbGVhcik7CiAgICAgIH0KICAgIH0KICAgIGlmICgkY2xlYXIpIHsKICAgICAgJHRoaXMtPl9lcnJvcnM9IiI7CiAgICB9CiAgICByZXR1cm4gJGVycm9yczsKICB9CgogIGZ1bmN0aW9uIE91dHB1dEVycm9ycygkY2xlYXI9dHJ1ZSwkaW5jbHVkZWRzPXRydWUpIHsKICAgIGlmICgkdGhpcy0+SW5FcnJvcigpKSB7CiAgICAgIGVjaG8gIlxuXG48ZGl2IHN0eWxlPSdib3JkZXI6M3B4IHNvbGlkIHJlZD5cbiI7CiAgICAgIGVjaG8gJHRoaXMtPkdldEVycm9ycyh0cnVlLCRjbGVhciwkaW5jbHVkZWRzKTsKICAgICAgZWNobyAiXG48L2Rpdj5cblxuIjsKICAgIH0KICB9CgogIGZ1bmN0aW9uIEluRXJyb3IoKSB7CiAgICByZXR1cm4gKCR0aGlzLT5fZXJyb3JzIT0iIik7CiAgfQoKfQo/Pgo=]]></data>
	</file>
	<file>
	  <filename>/templates/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/templates/changelog.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PHVsPgo8bGk+dmVyc2lvbiAwLjIuNzxici8+CmZpeGVkIE5lb0Ntc0xpbmsgZm9yIHByZXR0eSB1cmxzLCBtaXNzZWQgdGhlIHRhcmdldGNvbnRlbnRvbmx5IHBhcmFtZXRlci4uLgoKPGxpPnZlcnNpb24gMC4yLjY8YnIvPgpBZGRlZCBhIFNldFByZWYtc2hvcnRjdXQgYW5kIGEgbmljZSBOZW9TZXRQcmVmLW1ldGhvZCAoc2VlIGhlbHApCjxici8+CnNldCBlbnRpdHkgcHJvcHMgZnJvbSBhcnJheSBub3cgdXNlcyBzdG9yZWQgcGFyYW1zLXZhbHVlcyBpcyBvdGhlciBub3Qgc3BlY2lmaWVzCjxici8+CiAgUmV3b3JrZWQgTmVvUmVkaXJlY3QoRnVsbCkgdG8gYmUgZmFzdGVyIHRvIHVzZQo8YnIvPgpBZGRlZCBOZW9WYWxpZGF0ZVVSTC1tZXRob2QKPGJyLz4KQWRkZWQgRGVjb2RlSFRNTEVudGl0aWVzCjxici8+CkFkZGVkIE5lb0FkbWluUmV0dXJuCgoKPGxpPnZlcnNpb24gMC4yLjU8YnIvPgpBZGRlZCBhbiBvcHRpb24gdG8gTmVvQWRkSWNvbiB0byBhbHNvIGluY2x1ZGUgdGhlIGZvbGxpbmdzIHRleHQgbGluawo8YnIvPgpBZGRlZCBJc1RhYmxlRW1wdHkKPGJyLz4KVXBkYXRlIEVtYWlsVmFsaWRhdGlvbiB0byBtYWlsLWNhcGFiaWxpdGllcyBvZiBkb21haW4gYXMgd2VsbAo8YnIvPgpNYWRlIDJuZCBwYXJhbSB0byBOZW9Qw4VhcmFtVmFsdWUgZG91YmxlIGFzIGRlZmF1bHQgdmFsdWUgKHdoZW4gbm90IGFuIGFycmF5KQoKCgo8bGk+dmVyc2lvbiAwLjIuNDxici8+CkFkZGVkIE5lb0VtcHR5LWZ1bmN0aW9uIHdoaWNoIGNoZWNrcyBmb3IgYW4gaW5kZXggaW4gYW4gYXJyYXkKPGJyLz4KTWFkZSBOZW9QcmludFIgb3V0cHV0IGNvbnRlbnQgb2YgJF9wYXJhbXMgaWYgbm8gcGFyYW1ldGVyIHdhcyBnaXZlbgo8YnIvPkFkZGVkIE5lb1ZhbGlkYXRlRW1haWwtZnVuY3Rpb24KPGJyLz5BZGRlZCBOZW9Ob0JyZWFrcy1mdW5jdGlvbgoKPGxpPnZlcnNpb24gMC4yLjM8YnIvPgpOb3cgcG9zc2libGUgdG8gcmVnaXN0ZXIgJHBhcmFtcyBmb3IgZXZlbiBlYXNpZXIgc3ludGF4IGluIHJlbGV2YW50IGZ1bmN0aW9ucyBsaWtlIE5QVgo8YnIvPgpBZGRlZCBDcmVhdGVJbnB1dFBhc3N3b3JkLXdyYXBwZXIKPGJyLz4KQWRkZWQgZmlsbCBwYXJhbWV0ZXIgdG8gU2V0RW50aXR5UHJvcHNGcm9tQXJyYXkKCgo8bGk+dmVyc2lvbiAwLjIuMjxici8+CkFkZGVkIGEgY3VzdG9tIHJldHVybnZhbHVlIHRvIGNoZWNrZW50aXR5Y29ubmVjdGlvbnMKPGJyLz4KSW1wbGVtZW50ZWQgTWFrZVNpbXBsZUFycmF5Cjxici8+CkFkZGVkIE5lb1RydWVJY29uIGFuZCAgTmVvVHJ1ZUljb24gCgo8bGk+dmVyc2lvbiAwLjIuMTxici8+CmFkZGVkIGFycmF5X2RpZmZfa2V5IGltcGxlbWVudGF0aW9uIGZvciBwcmUtNS4xLjAgdmVyc2lvbgo8YnIvPgpBZGRlZCAkYWx3YXlzcmV0dXJuYXJyYXk9ZmFsc2UgdG8gR2V0RW50aXRpZXMoRnVsbCktbWV0aG9kcwo8YnIvPgpBZGRlZCBTbWFydEFzc2lnblByZWYtbWV0aG9kCjxici8+CkFkZGVkIFRvb2x0aXAtU3VwcG9ydAo8YnIvPgpBZGRlZCBOZW9SZWRpcmVjdC1mdW5jdGlvbgoKICA8bGk+dmVyc2lvbiAwLjIuMDxici8+Ci0gZ2VuZXJhbCBidWdmaXhpbmc8YnIvPgotIEFkZGVkIGEgTmVvRGlyTGlzdC1mdW5jdGlvbjxici8+Ci0gRml4ZWQgbmFtZSBlcnJvciBvbiBOZW9JbnB1dERyb3Bkb3duPGJyLz4KLSBhZGRlZCBzdXBwb3J0IGZvciAzcmQgcGFyYW1ldGVyIHRvIFNsYXNoLWZ1bmN0aW9uPGJyLz4KLSBhZGRlZCBOZW9DbXNMaW5rIGFuZCBOZW9DbXNVcmwgc2hvcnRjdXRzPGJyLz4KLSBhZGRlZCBTbWFydHlVcGxvYWRGb3JtU3RhcnQ8YnIvPgotIGFkZGVkIFNtYXJ0eUlucHV0TXVsdGlIaWRkZW48YnIvPgoKICA8L2xpPgogIDxsaT52ZXJzaW9uIDAuMS4wPGJyLz4KICAgLSBpbml0aWFsIHJlbGVhc2U8L2xpPgo8L3VsPg==]]></data>
	</file>
	<file>
	  <filename>/templates/help.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PHN0cm9uZz5Ob3RpY2UhIFRoaXMgaXMgYSBtb2R1bGUtZGV2ZWxvcGVyLW9ubHkgbW9kdWxlLiBJZiB5b3UgYXJlIG5vdCBhIGRldmVsb3Blcgp5b3UnbGwgcHJvYmFibHkganVzdCB3YW50IHRvIHNraXAgdGhlIGdvcnkgZGV0YWlscyBvZiB0aGlzIHBhZ2UgYW5kIHJlbHkgb24gdGhhdAp0aGUgbW9kdWxlIGp1c3QgZG9lcyBpdCdzIHdvcmsuPC9zdHJvbmc+CjxoMz5QdXJwb3NlIG9mIHRoZSBtb2R1bGU8L2gzPgpUaGUgcHVycG9zZSBvZiB0aGlzIG1vZHVsZSBpcyB0byBjdXQgb2ZmIG9uIGRldmVsb3BtZW50dGltZSBwcm92aWRpbmcgc29tZQplYXN5IHRvIHVzZSBmdW5jdGlvbnMgZXh0ZW5kaW5nIHRoZSBtb2R1bGUtQVBJIG9mIENNUyBNYWRlIFNpbXBsZS4gVGhpcyBpbmNsdWRlcywKYnV0IGlzIG5vIGxpbWl0ZWQgdG8sIHNob3J0Y3V0cyB0byBOZW9EYXRhU3RvcmFnZS1mdW5jaW9uYWxpdHksIGEgY291cGxlIG9mIG5pY2UKU21hcnR5LXNob3J0Y3V0cywgRmlyZVBIUC1pbnRlZ3JhdGlvbiBldGMuCjxoMz5Vc2FnZSBvZiB0aGUgbW9kdWxlPC9oMz4KVG8gdXNlIHRoaXMgZXh0ZW5kZWQgbW9kdWxlLWNsYXNzIHlvdSBzaG91bGQgaW5oZXJpdCBmcm9tIE5lb01vZHVsZS1jbGFzcyBpbnN0ZWFkCm9mIHRoZSB1c3VhbCBDTVNNb2R1bGUtY2xhc3MuIFRoaXMgY2FuIGJlIGRvbmUgbGlrZSB0aGlzOgo8cHJlPgpyZXF1aXJlX29uY2UoZGlybmFtZShkaXJuYW1lKF9fRklMRV9fKSkuIi9OZW9Nb2R1bGUvTmVvTW9kdWxlLm1vZHVsZS5waHAiKTsKY2xhc3MgTXlNb2R1bGUgZXh0ZW5kcyBOZW9Nb2R1bGUgewo8L3ByZT4KSWYgeW91IHdpc2ggdG8gdXNlIHRoZSBOZXdEYXRhU3RvcmFnZSBmdW5jdGlvbmFsaXR5LCB5b3Ugc2hvdWxkIG9mIGNvdXJzZSBhbHNvCmluc3RhbGwgdGhhdCBtb2R1bGUuCjxoMz5Ib3cgdG8gZ2V0IGhlbHA8L2gzPgpJIHdpbGwgcmVwZWF0LCB0aGlzIG1vZHVsZSBpcyBmb3IgZGV2ZWxvcGVycyBvbmx5LiBJZiB5b3UgY2Fubm90IHJlYWQgcGhwLXNvdXJjZSBjb2RlLAp5b3Ugc2hvdWxkIHVzZSBpdCBmb3IgZGV2ZWxvcG1lbnQgYW55d2F5LiBJZiB5b3UgY2FuLCBhbHdheXMgY2hlY2sgb3V0IHRoZSBjb2RlIApmb3IgaGludHMgb24gaG93IHRvIG1ha2UgaXQgd29yay4gSWYgeW91IHN0aWxsIGhhdmUgcXVlc3Rpb25zIG9yIHN1Z2dlc3Rpb25zIGZvcgpmaXhlcy9pbXByb3ZlbWVudHMsIHBsZWFzZSBmZWVsIGZyZWUgdG8gY2F0Y2ggbWUgKFNpbG1hcmlsbGlvbikgaW4gdGhlIGZvcnVtIG9nICNpcmMuCgo8aDM+TGlzdCBvZiBtZXRob2RzPC9oMz4KSSB3aWxsIHRyeSB0byBrZWVwIHRoaXMgbGlzdCB1cHRvZGF0ZSwgYnV0IGZvciBtb3N0IHJlY2VudCBsaXN0LCBwbGVhc2UKY2hlY2sgdGhlIE5lb01vZHVsZS5tb2R1bGUucGhwLWZpbGUgaXRzZWxmLiBTb21lIGRvY3VtZW50YXRpb24gb2YgdGhlIG1ldGhvZHMKbWF5IGV2ZW4gc25lYWsgaW4gdGhlcmUgc29tIGRheS4KPHByZT4KLyoKICoKICogU2V0dXAgZnVuY3Rpb25zCiAqCiAqLwoKZnVuY3Rpb24gU2V0SWQoJGlkKQpmdW5jdGlvbiBOZW9TZXRJZCgkaWQpCmZ1bmN0aW9uIE5lb1NldFJldHVybklkKCRyZXR1cm5pZCkKZnVuY3Rpb24gTmVvU2V0dXAoJGlkLCRtb2R1bGUsJHJldHVybmlkPSIwIiwkcGFyYW1zPWFycmF5KCkpCmZ1bmN0aW9uIE5lb1NldFBhcmFtcygkcGFyYW1zKTsKCiAgLyoKICAgKgogICAqIEdlbmVyYWwgc2hvcnRjdXQgZnVuY3Rpb25zCiAgICoKICAgKi8KZnVuY3Rpb24gUHJlZigkcHJlZm5hbWUsJGRlZmF1bHQ9IiIpCmZ1bmN0aW9uIFNldFByZWYoJHByZWZuYW1lLCAkdmFsdWUpIHsKCi8vU2V0cyBhIHByZWZlcmVuY2UgdG8gdGhlIHZhbHVlIG9mIHRoZSBzYW1lIG5hbWUgaW4gdGhlICRwYXJhbXMtYXJyYXkgc2V0IGJ5IE5lb1NldFVwLgovL09wdGlvbmFsbHkgZGVsZXRpbmcgYXNzaWduaW5nIGEgdmFsdWUgb3IgZGVsZXRpbmcgdGhlIHByZWZlcmVuY2UgaWYgbm90IHNldCBpbiB0aGlzIGFycmF5CmZ1bmN0aW9uIE5lb1NldFByZWYoJHByZWZuYW1lLCAkbm90c2V0dmFsdWU9IiIsICRkZWxldGVpZm5vdHNldD1mYWxzZSkgewpmdW5jdGlvbiBOZW9DbXNMaW5rKCRwYXJhbXM9YXJyYXkoKSkKZnVuY3Rpb24gTmVvQ21zVXJsKCRwYXJhbXM9YXJyYXkoKSkKZnVuY3Rpb24gTmVvUmVkaXJlY3QoJGFjdGlvbj0iIiwkcGFyYW1zPWFycmF5KCkpCmZ1bmN0aW9uIE5lb1JlZGlyZWN0RnVsbCgkcGFyYW1zPWFycmF5KCkpCmZ1bmN0aW9uIE5lb0FkbWluUmV0dXJuKCRwYXJhbXM9YXJyYXkoKSkKLyoKICoKICogRm9ybS1nZW5lcmF0aW9uIGZ1bmN0aW9ucwogKgogKi8KCmZ1bmN0aW9uIE5lb0Zvcm1TdGFydCgkcGFyYW1zPWFycmF5KCkpCmZ1bmN0aW9uIE5lb0Zvcm1FbmQoJHBhcmFtcz1hcnJheSgpKQpmdW5jdGlvbiBOZW9JbnB1dFRleHQoJHBhcmFtcz1hcnJheSgpCmZ1bmN0aW9uIE5lb1RleHRhcmVhKCRwYXJhbXM9YXJyYXkoKSkKZnVuY3Rpb24gTmVvSW5wdXRDaGVja2JveCgkcGFyYW1zPWFycmF5KCkpCmZ1bmN0aW9uIE5lb0lucHV0U3VibWl0KCRwYXJhbXM9YXJyYXkoKSkKZnVuY3Rpb24gTmVvSW5wdXRSZXNldCgkcGFyYW1zPWFycmF5KCkpCmZ1bmN0aW9uIE5lb0lucHV0SW5wdXREcm9wZG93bigkcGFyYW1zPWFycmF5KCkpCgovKiBmdW5jdGlvbiBiZWxvdyBpbmNsdWRlIHNtYXJ0eWFzc2lnbm1lbnQsIGRvZXMgbm90IHJldHVybiBhbnl0aGluZyAqLwpmdW5jdGlvbiBTbWFydHlGb3JtU3RhcnQoJHNtYXJ0eW5hbWUsJHBhcmFtcz1hcnJheSgpKQpmdW5jdGlvbiBTbWFydHlVcGxvYWRGb3JtU3RhcnQoJHNtYXJ0eW5hbWUsJHBhcmFtcz1hcnJheSgpKQoKZnVuY3Rpb24gU21hcnR5Rm9ybUVuZCgkc21hcnR5bmFtZSkKZnVuY3Rpb24gU21hcnR5SW5wdXRTdWJtaXQoJHNtYXJ0eW5hbWUsJHBhcmFtcykKCmZ1bmN0aW9uIFNtYXJ0eUlucHV0VGV4dCgkc21hcnR5bmFtZSwkcGFyYW1zPWFycmF5KCkpCmZ1bmN0aW9uIFNtYXJ0eUlucHV0Q2hlY2tib3goJHNtYXJ0eW5hbWUsJHBhcmFtcz1hcnJheSgpKQoKZnVuY3Rpb24gU21hcnR5SW5wdXRIaWRkZW4oJHNtYXJ0eW5hbWUsJG5hbWUsJHZhbHVlKQpvcgpmdW5jdGlvbiBTbWFydHlJbnB1dEhpZGRlbigkc21hcnR5bmFtZSwkcGFyYW1zKQoKZnVuY3Rpb24gU21hcnR5SW5wdXRNdWx0aUhpZGRlbigkc21hcnR5bmFtZSwkZmllbGRzPWFycmF5KCkpCgovKgogKgogKiBOZW9EYXRhU3RvcmFnZSBzaG9ydGN1dHMKICoKICovCmZ1bmN0aW9uIEFkZEVudGl0eSgkdGFibGUsICRwcm9wcz1hcnJheSgpKQpmdW5jdGlvbiBEZWxldGVFbnRpdHkoJGlkKQpmdW5jdGlvbiBHZXRFbnRpdHkoJGlkLCAkb3ZlcnJpZGVwcm9wcz1hcnJheSgpKQpmdW5jdGlvbiBHZXRFbnRpdGllcygkdGFibGU9IiIsICRjcml0ZXJpYT1hcnJheSgpLCAkYWx3YXlzcmV0dXJuYXJyYXk9ZmFsc2UpCmZ1bmN0aW9uIEdldE9uZUVudGl0eSgkdGFibGUsICRjcml0ZXJpYT1hcnJheSgpLCAkZmFpbGlmbXVsdGlwbGU9ZmFsc2UpCmZ1bmN0aW9uIEdldEVudGl0aWVzRnVsbCgkdGFibGU9IiIsICRjcml0ZXJpYT1hcnJheSgpLCAkYWx3YXlzcmV0dXJuYXJyYXk9ZmFsc2UpCmZ1bmN0aW9uIFNldEVudGl0eVByb3AoJGlkLCRwcm9wbmFtZSwkcHJvcHZhbHVlLCRwcm9wdHlwZT0idW5kZWZpbmVkIikKZnVuY3Rpb24gQ2xlYXJFbnRpdHlQcm9wKCRpZCwgJHByb3BuYW1lKQpmdW5jdGlvbiBTZXRFbnRpdHlQcm9wcygkaWQsICRwcm9wcywgJGNsZWFyPXRydWUpCmZ1bmN0aW9uIFNldEVudGl0eVByb3BzRnJvbUFycmF5KCRpZCwgJHByb3BzLCAkdmFsdWVzLCAkY2xlYXI9dHJ1ZSwgJGZpbGw9ZmFsc2UpCmZ1bmN0aW9uIFNldEVudGl0eVByb3BzT25Dcml0ZXJpYSgkdGFibGUsICRwcm9wcywgJGNyaXRlcmlhLCAkY3JlYXRlPXRydWUsICRjbGVhcj1mYWxzZSkgLy9Eb2VzIG5vdCB3b3JrCmZ1bmN0aW9uIFJlc2V0RW50aXR5UHJvcHMoJGlkLCAkbmV3cHJvcHM9YXJyYXkoKSkKZnVuY3Rpb24gUmVtb3ZlTW9kdWxlRW50aXRpZXMoKQpmdW5jdGlvbiBDbGVhckVudGl0eVByb3BzKCRpZCkKZnVuY3Rpb24gQ29tcGFyZUVudGl0aWVzKCRlbnRpdHkxLCAkZW50aXR5MiwgJHNvcnRmaWVsZCkKZnVuY3Rpb24gQ29tcGFyZUVudGl0aWVzQ29tcGxleCgkZW50aXR5MSwgJGVudGl0eTIsICRzb3J0ZmllbGRzKQpmdW5jdGlvbiBTb3J0RW50aXRpZXMoJGxpc3QsICRzb3J0ZmllbGRzKQpmdW5jdGlvbiBFbnRpdGllc0NvdW50KCR0YWJsZT0iIiwgJGNyaXRlcmlhPWFycmF5KCkpCmZ1bmN0aW9uIENsZWFyTW9kdWxlRW50aXRpZXMoKQpmdW5jdGlvbiBTZXRFbnRpdHlDb25uZWN0aW9uKCRpZDEsICRpZDIsICR0eXBlPSIiKQpmdW5jdGlvbiBDbGVhckVudGl0eUNvbm5lY3Rpb25zKCRpZDEsICRpZDI9LTEsICR0eXBlPSIiKQpmdW5jdGlvbiBDbGVhckVudGl0eUNvbm5lY3Rpb24oJGlkMSwgJGlkMiwgJHR5cGU9IiIpCmZ1bmN0aW9uIENoZWNrRW50aXR5Q29ubmVjdGlvbigkaWQxLCRpZDIsJHR5cGU9IiIsJHJldHVybnZhbHVlPXRydWUpCmZ1bmN0aW9uIEdldEVudGl0eUNvbm5lY3Rpb25zKCRpZDEsICRpZDI9LTEsICR0eXBlPSIiKQpmdW5jdGlvbiBBZGRGaWVsZFNldCgkbmFtZSwkZmllbGRzKQpmdW5jdGlvbiBHZXRGaWVsZFNldCgkbmFtZSkKZnVuY3Rpb24gRW50aXR5U2V0VW5zZXRQcm9wcygkZW50aXR5LCRmaWVsZHNldCwkZmlsbHZhbHVlPSIiKSB7CmZ1bmN0aW9uIEdldERTRXJyb3JzKCRubDJicj10cnVlLCRjbGVhcj10cnVlKQpmdW5jdGlvbiBPdXRwdXREU0Vycm9ycygkY2xlYXI9dHJ1ZSkKZnVuY3Rpb24gRFNJbkVycm9yKCkKZnVuY3Rpb24gTWFrZVNpbXBsZUFycmF5KCR0YWJsZSwkZmllbGQpCmZ1bmN0aW9uIE1ha2VBc3NvY0FycmF5KCR0YWJsZSwkZmllbGRzKQoKCi8qCiAqCiAqIExpbmsgYW5kIGljb24gZnVuY3Rpb25zCiAqCiAqLwoKZnVuY3Rpb24gTmVvRGVsZXRlSWNvbigkYWN0aW9uLCR0ZXh0LCRwYXJhbXM9YXJyYXkoKSwkY29uZmlybWF0aW9uPSIiKQpmdW5jdGlvbiBOZW9Db3B5SWNvbigkYWN0aW9uLCR0ZXh0LCRwYXJhbXM9YXJyYXkoKSwkY29uZmlybWF0aW9uPSIiKQpmdW5jdGlvbiBOZW9FZGl0SWNvbigkYWN0aW9uLCR0ZXh0LCRwYXJhbXM9YXJyYXkoKSwkY29uZmlybWF0aW9uPSIiKQpmdW5jdGlvbiBOZW9BZGRJY29uKCRhY3Rpb24sJHRleHQsJHBhcmFtcz1hcnJheSgpLCRjb25maXJtYXRpb249IiIpCmZ1bmN0aW9uIE5lb1RydWVJY29uKCRhY3Rpb24sJHRleHQsJHBhcmFtcz1hcnJheSgpLCRjb25maXJtYXRpb249IiIpCmZ1bmN0aW9uIE5lb0ZhbHNlSWNvbigkYWN0aW9uLCR0ZXh0LCRwYXJhbXM9YXJyYXkoKSwkY29uZmlybWF0aW9uPSIiKQpmdW5jdGlvbiBOZW9TeXN0ZW1JY29uKCRpY29uLCR0ZXh0PSIiKQoKLyoKICoKICogVXRpbGl0eSBmdW5jdGlvbnMKICoKICovCmZ1bmN0aW9uIE5lb1NsYXNoZXMoJHVybCkKZnVuY3Rpb24gRGVjb2RlSFRNTEVudGl0aWVzKCRzKQpmdW5jdGlvbiBTbGFzaCgkc3RyLCRzdHIyPSIiLCRzdHIzPSIiKQpmdW5jdGlvbiBTbGFzaGVzKCR1cmwpCmZ1bmN0aW9uIGlzX2Fzc29jKCRhcnJheSkKZnVuY3Rpb24gTmVvRGlyTGlzdCgkcm9vdCwkd2hhdD0iZmlsZXMiLCRpbnRyb2R1Y3Rpb249YXJyYXkoKSwkZXhjbHVkZXM9YXJyYXkoKSkKCi8qQ2hlY2tzIGZvciB0aGUgZXhpc3RlbmNlIG9mIGFuIGluZGV4IGluIGFuIGFycmF5IGFuZCByZXR1cm4gdGhlIHZhbHVlIGlmIGl0J3MgdGhlcmUKICphbmQgdGhlIGRlZmF1bHQgdmFsdWUgaWYgaXQncyBub3QKKi8KZnVuY3Rpb24gTmVvUGFyYW1WYWx1ZSgkbmFtZSwkcGFyYW1zLCRkZWZhdWx0PSIiKQoKLy9TaG9ydGN1dCBmb3IgdGhlIGFib3ZlCmZ1bmN0aW9uIE5QVigkbmFtZSwgJHBhcmFtcykKZnVuY3Rpb24gTmVvQXBwbHlQYXJhbVZhbHVlcygkdGhpc2FycmF5LCAkcGFyYW1zLCAkaW5kZXhlcywgJGFsd2F5c2ZpbGw9ZmFsc2UpCmZ1bmN0aW9uIENoZWNrRmlsZUV4dGVuc2lvbigkZmlsZW5hbWUsICRhbGxvd2VkZXh0ZW5zaW9ucz1hcnJheSgpKQoKLy9Gb3Igbm93LCByZWFkIHNvdXJjZSB0byB1bmRlcnN0YW5kCmZ1bmN0aW9uIE5lb1Rvb2xUaXAoJHBhcmFtcz1hcnJheSgpKSAvL3JlcXVpcmVzIDIgY3NzLWNsYXNzZXMgdG8gYmUgc2V0IHVwCgovL0NoZWNrcyBib3RoIHdoZXRoZXIgdGhlIGluZGV4IGV4aXN0cyBpbiB0aGUgYXJyYXkgYW5kIHdoZXRoZXIgaXQgaGFzIGEgdmFsdWUgZGlmZmVyZW50IGZvbXIgbm90aGluZyBvdCBvbmx5IHNwYWNlcwpmdW5jdGlvbiBOZW9FbXB0eSgkaW5kZXg9IiIsJGRhdGE9YXJyYXkoKSkKCi8vVmFsaWRhdGVzIGFuIGVtYWlsYWRyZXNzLCBvcHRpb25hbGx5IGF2b2lkaW5nIGNoZWNraW5nIHRoZSBteC1hdmFpbGFiaWxpdHkgb2YgdGhlIGRvbWFpbgpmdW5jdGlvbiBOZW9WYWxpZGF0ZUVtYWlsKCRlbWFpbCwgJGF2b2lkb25saW5lID0gZmFsc2UpCgovL1ZhbGlkYXRlcyBhbiB1cmwKZnVuY3Rpb24gTmVvVmFsaWRhdGVVUkwoJHVybCkgewoKLy9SZXR1cm5zIGEgdmVyc2lvbiBvZiB0aGUgc3RyaW5nIHdoaWNoIGNhbm5vdCAocGVyaGFwcykgYmUgbGluZS1icm9rZW4KZnVuY3Rpb24gTmVvTm9CcmVha3MoJHN0cmluZykKCi8vc2FtZSBhcyBwcmludF9yLCBidXQgd3JhcHMgaW4gPHByZT4ncyBhbmQgaW4gYSBkaXYgdHJ5aW5nIHRvIG1ha2UgaXQgbW9yZSByZWFkYWJsZQpmdW5jdGlvbiBOZW9QcmludFIoJGRhdGE9YXJyYXkoKSwkc2VuZG91dD10cnVlKQoKLyoKICoKICogU21hcnR5IHNob3J0Y3V0cwogKgogKi8KZnVuY3Rpb24gU21hcnR5QXNzaWduKCRzbWFydHlpbmZvLCAkc21hcnR5Y29udGVudD0iIikKZnVuY3Rpb24gU21hcnR5QXNzaWduUHJlZigkc21hcnR5bmFtZSwgJHByZWZlcmVuY2VuYW1lPSIiKSB7CmZ1bmN0aW9uIFNtYXJ0eUFzc2lnbkNNUygkbW9kdWxlLCR2YXJuYW1lPSJjbXMiKQpmdW5jdGlvbiBTbWFydHlVcGxvYWRGb3JtU3RhcnQoJHNtYXJ0eW5hbWUsJHBhcmFtcz1hcnJheSgpKSB7CgovKgogKgogKiBEZWJ1Z2dpbmcgZnVuY3Rpb25zCiAqCiAqLwpmdW5jdGlvbiBGaXJlRGVidWcoJGNvbW1hbmQsJG1lc3NhZ2U9IiIsJHZhcmlhYmxlcz1hcnJheSgpKQoKLyoKICoKICogRXJyb3IgaGFuZGxpbmcKICoKICovCmZ1bmN0aW9uIEVycm9yKCRlcnJvcnRleHQsJHJldHVybnZhbHVlPWZhbHNlLCRwYXJhbXM9YXJyYXkoKSkKZnVuY3Rpb24gR2V0RXJyb3JzKCRubDJicj10cnVlLCRjbGVhcj10cnVlLCRpbmNsdWRlZHM9dHJ1ZSkKZnVuY3Rpb24gT3V0cHV0RXJyb3JzKCRjbGVhcj10cnVlLCRpbmNsdWRlZHM9dHJ1ZSkKZnVuY3Rpb24gSW5FcnJvcigpCjwvcHJlPg==]]></data>
	</file>
</module>
