# Name: tjh_listfilter v0.5 # Type: Admin side plugin # This plugin is made for filtering articles in the admin backend by sections, categories, authors and statuses. # Author: Jan Horky # URL: http://home.zcu.cz/~honzik1 # ..................................................................... # This is a plugin for Textpattern - http://textpattern.com/ # To install: textpattern > admin > plugins # Paste the following text into the 'Install plugin' box: # ..................................................................... YTo5OntzOjQ6Im5hbWUiO3M6MTQ6InRqaF9saXN0ZmlsdGVyIjtzOjY6ImF1dGhvciI7czo5OiJKYW4gSG9ya3kiO3M6MTA6ImF1dGhvcl91cmkiO3M6Mjc6Imh0dHA6Ly9ob21lLnpjdS5jei9+aG9uemlrMSI7czo3OiJ2ZXJzaW9uIjtzOjM6IjAuNiI7czo0OiJ0eXBlIjtzOjE6IjEiO3M6MTE6ImRlc2NyaXB0aW9uIjtzOjEyOToiVGhpcyBwbHVnaW4gaXMgbWFkZSBmb3IgZmlsdGVyaW5nIGFydGljbGVzIGluIHRoZSBhZG1pbiBiYWNrZW5kIGFuZCBpdCdzIGZpbHRlcmluZyBieSBzZWN0aW9ucywgY2F0ZWdvcmllcywgYXV0aG9ycyBhbmQgc3RhdHVzZXMuIjtzOjQ6ImhlbHAiO3M6NzM1OiIKICA8aDE+RGVzY3JpcHRpb248L2gxPg0KICA8cD4gVGhpcyBwbHVnaW4gaXMgbWFkZSBmb3IgZmlsdGVyaW5nIGFydGljbGVzIGluIHRoZSBhZG1pbiBiYWNrZW5kIGFuZCBpdCdzIGZpbHRlcmluZyBieSBzZWN0aW9ucywgY2F0ZWdvcmllcywgYXV0aG9ycyBhbmQgc3RhdHVzZXMuICBCZWNhdXNlIGl0J3MgYSBqYXZhc2NyaXB0IGJhc2VkIHBsdWdpbiwgdGhlIGZpbHRlcmluZyBpcyBkb25lIHdpdGhvdXQgcmVsb2FkaW5nIHRoZSBwYWdlLjwvcD4NCiAgPGgxPlVzYWdlPC9oMT4KCTxwPkFmdGVyIGluc3RhbGF0aW9uLCBmaWx0ZXIgYXBwZWFycyBhdCB0aGUgJ0FydGljbGVzJyB0YWIgb24gYWRtaW4gc2lkZS4gSXQgd2lsbCBiZSBhdCB0aGUgcmlnaHQgdG9wIGNvcm5lciBhYm92ZSB0aGUgYXJ0aWNsZSBsaXN0LiAgQWZ0ZXIgY2hvb3NpbmcgYW4gaXRlbSBmcm9tIHRoZSBmaWx0ZXIsIGEgbmV3IHNlbGVjdCBib3ggYXBwZWFycyBuZXh0IHRvIHRoZSBmaXJzdCBvbmUuIEl0cyBjb250ZW50IC0gbGlzdCBvZiBzZWN0aW9ucyBvciBjYXRlZ29yaWVzIG9yIGF1dGhvcnMgbmFtZXMgb3Igc3RhdHVzZXMgLSBkZXBlbmRzIG9uIHRoZSBwcmV2aW91cyBzZWxlY3Rpb24uIFRoZSB3aG9sZSBzZWxlY3Rpb24gbmVlZHMgdG8gYmUgY29uZmlybWVkIGJ5IHRoZSBPSyBidXR0b24uIFRvIHR1cm4gZmlsdGVyIG9mZiBzd2l0Y2ggZmlyc3QgZmlsdGVyIHNlbGVjdCBvbiBibGFuayBpdGVtLjwvcD4KCQoiO3M6NDoiY29kZSI7czoxMDgxOToiICAgDQogIC8vIGxpc3QgdGFiIGluIGFkbWluIGludGVyZmFjZSBzaG93cyB0aGUgZmlsdGVyIGZvcm0NCiAgaWYgKEB0eHBpbnRlcmZhY2UgPT0gImFkbWluIikgew0KICAgICAgcmVnaXN0ZXJfY2FsbGJhY2soInRqaF9saXN0ZmlsdGVyIiwgImxpc3QiKTsNCiAgfQ0KDQogIC8vIG93biBwbHVnaW4gLSBmaWx0ZXIgZm9ybQ0KICBmdW5jdGlvbiB0amhfbGlzdGZpbHRlcigkYXR0cykgew0KICANCiAgICAvLyBmaWxsIGFycmF5IGZvciBzd2l0Y2ggc2VsZWN0b3INCiAgICAkc2VsZWN0b3JbMF0gPSAiIjsNCiAgICAkc2VsZWN0b3JbMV0gPSBnVHh0KCJzZWN0aW9uIik7DQogICAgJHNlbGVjdG9yWzJdID0gZ1R4dCgiY2F0ZWdvcmllcyIpOw0KICAgICRzZWxlY3RvclszXSA9IGdUeHQoImF1dGhvciIpOw0KICAgICRzZWxlY3Rvcls0XSA9IGdUeHQoInN0YXR1cyIpOw0KDQogICAgLy8gbG9hZCBzZWN0aW9ucyBmcm9tIGRhdGFiYXNlDQogICAgJHNlY3Rpb25zID0gZ2V0U2VjdGlvbnMoKTsNCiANCiAgICAvLyBsb2FkIGNhdGVnb3JpZXMgZnJvbSBkYXRhYmFzZQ0KICAgICRjYXRlZ29yaWVzID0gZ2V0Q2F0ZWdvcmllcygpOw0KDQogICAgLy8gbG9hZCBhdXRob3JzIGZyb20gZGF0YWJhc2UNCiAgICAkYXV0aG9ycyA9IGdldEF1dGhvcnMoKTsNCg0KICAgIC8vIGxvYWQgc3RhdHVzZXMNCiAgICAkc3RhdHVzID0gZ2V0U3RhdHVzKCk7DQoNCiAgICAvLyBjb21wb3NlIGh0bWwgZm9yIGZpbHRlciBmb3JtDQogICAgJG91dCA9ICJGaWx0ZXI6ICINCiAgICAgICAgICAgICAgLnNlbGVjdElucHV0KCJzZWxlY3Rvcl9pZCIsICRzZWxlY3RvciwgIiIsICIiLCAib25jaGFuZ2U9XCJzd2l0Y2hTZWxlY3Rvcih0aGlzLm9wdGlvbnNbdGhpcy5zZWxlY3RlZEluZGV4XS52YWx1ZSlcIiIsICJzZWxlY3Rvcl9pZCIpDQogICAgICAgICAgICAgIC5zcA0KICAgICAgICAgICAgICAuc2VsZWN0SW5wdXQoInNlY3Rpb25zX2lkIiwgJHNlY3Rpb25zLCAiIiwgIiIsICIiLCAic2VjdGlvbnNfaWQiKQ0KICAgICAgICAgICAgICAuc2VsZWN0SW5wdXQoImNhdGVnb3JpZXNfaWQiLCAkY2F0ZWdvcmllcywgIiIsICIiLCAiIiwgImNhdGVnb3JpZXNfaWQiKQ0KICAgICAgICAgICAgICAuc2VsZWN0SW5wdXQoImF1dGhvcnNfaWQiLCAkYXV0aG9ycywgIiIsICIiLCAiIiwgImF1dGhvcnNfaWQiKQ0KICAgICAgICAgICAgICAuc2VsZWN0SW5wdXQoInN0YXR1c19pZCIsICRzdGF0dXMsICIiLCAiIiwgIiIsICJzdGF0dXNfaWQiKQ0KICAgICAgICAgICAgICAuc3ANCiAgICAgICAgICAgICAgLmZJbnB1dCgiYnV0dG9uIiwgInRqaC1saXN0ZmlsdGVyLXByb2NlZWQiLCBnVHh0KCJnbyIpLCAic21hbGxlcmJveCIsICIiLCAiZmlsdGVyTGlzdChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VsZWN0b3JfaWQnKS5vcHRpb25zW2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWxlY3Rvcl9pZCcpLnNlbGVjdGVkSW5kZXhdLnZhbHVlKTsiKTsNCiAgICANCgkJJG91dCA9IGFkZGNzbGFzaGVzKCRvdXQsICJcclxuXCInIik7DQogICAgDQogICAgLy8gamF2YXNjcmlwdCBmb3Igc2V0dGluZyBmb3JtIHVwIGFuZCBpdHMgZnVuY3Rpb25hbGl0eQ0KCQkkanMgPSAnDQogICAgDQogICAgIC8vICoqKiBGVU5DVElPTiBERUNMQVJBVElPTlMNCiAgICAgDQogICAgICBmdW5jdGlvbiBmaWx0ZXJMaXN0KHNlbmRlcikgew0KICAgICAgICAvLyBydWJyaWt5IDQNCiAgICAgICAgLy8ga2F0ZWdvcmllIDUsIDYNCiAgICAgICAgdmFyIGxpc3RUYWJsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJsaXN0Iik7DQogICAgICAgIA0KICAgICAgICB2YXIgY29udGVudCA9ICIiOw0KICAgICAgICB2YXIgY29udGVudDIgPSAiIjsNCiAgICAgICAgdmFyIHN3ID0gc2VuZGVyKjE7DQogICAgICAgIHZhciBzZWxlY3RlZCA9ICIiOw0KICAgICAgICB2YXIgZW1wdHkgPSAwOw0KICAgICAgICANCiAgICAgICAgLy8gc2F2ZSBzZWxlY3RlZCBvcHRpb24gb2YgZmlyc3Qgc2VsZWN0DQogICAgICAgIHN3aXRjaCAoc3cpIHsNCiAgICAgICAgICBjYXNlIDE6DQogICAgICAgICAgICBzZWxlY3RlZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzZWN0aW9uc19pZCIpLm9wdGlvbnNbZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInNlY3Rpb25zX2lkIikuc2VsZWN0ZWRJbmRleF0udmFsdWU7DQogICAgICAgICAgYnJlYWs7DQogICAgICAgICAgDQogICAgICAgICAgY2FzZSAyOg0KICAgICAgICAgICAgc2VsZWN0ZWQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY2F0ZWdvcmllc19pZCIpLm9wdGlvbnNbZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNhdGVnb3JpZXNfaWQiKS5zZWxlY3RlZEluZGV4XS52YWx1ZTsNCiAgICAgICAgICBicmVhazsNCg0KICAgICAgICAgIGNhc2UgMzoNCiAgICAgICAgICAgIHNlbGVjdGVkID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImF1dGhvcnNfaWQiKS5vcHRpb25zW2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJhdXRob3JzX2lkIikuc2VsZWN0ZWRJbmRleF0udmFsdWU7DQogICAgICAgICAgYnJlYWs7DQogICAgICAgICAgDQogICAgICAgICAgY2FzZSA0Og0KICAgICAgICAgICAgc2VsZWN0ZWQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgic3RhdHVzX2lkIikub3B0aW9uc1tkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgic3RhdHVzX2lkIikuc2VsZWN0ZWRJbmRleF0udmFsdWU7DQogICAgICAgICAgYnJlYWs7DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIC8vIGo9MiAtIHR3byBsaW5lcyB3aXRoIGNvbnRyb2xzDQogICAgICAgIGZvciAodmFyIGo9MjsgajxsaXN0VGFibGUucm93cy5sZW5ndGgtMTsgaisrKSB7DQogICAgICAgICAgbGlzdFRhYmxlLnJvd3Nbal0uc3R5bGUuZGlzcGxheSA9ICIiOw0KICAgICAgICAgIGNvbnRlbnQgPSAiIjsNCiAgICAgICAgICBjb250ZW50MiA9ICIiOw0KICAgICAgICAgIGVtcHR5ID0gMDsNCiAgICAgICAgICANCiAgICAgICAgICAvLyBoaWRpbmcgZWxlbWVudHMgYnkgc2VsZWN0ZWQgZXhwcmVzc2lvbg0KICAgICAgICAgIA0KICAgICAgICAgIHN3aXRjaCAoc3cpIHsNCiAgICAgICAgICAgIGNhc2UgMToNCiAgICAgICAgICAgICAgaWYgKGxpc3RUYWJsZS5yb3dzW2pdLmNlbGxzWzRdLmlubmVySFRNTC5zcGxpdCgiPiIpLmxlbmd0aD09Mykgew0KICAgICAgICAgICAgICAgIGNvbnRlbnQgPSBsaXN0VGFibGUucm93c1tqXS5jZWxsc1s0XS5pbm5lckhUTUwuc3BsaXQoIj4iKVsxXS5yZXBsYWNlKCI8L3NwYW4iLCIiKS5yZXBsYWNlKCI8L1NQQU4iLCIiKTsNCg0KICAgICAgICAgICAgICAgIGlmICghKChjb250ZW50Lmxlbmd0aD09c2VsZWN0ZWQubGVuZ3RoKSYmKGNvbnRlbnQubWF0Y2goc2VsZWN0ZWQpIT1udWxsKSkpIHsNCiAgICAgICAgICAgICAgICAgIGxpc3RUYWJsZS5yb3dzW2pdLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgY2FzZSAyOg0KICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgaWYgKGxpc3RUYWJsZS5yb3dzW2pdLmNlbGxzWzVdLmlubmVySFRNTC5zcGxpdCgiPiIpLmxlbmd0aD09MykNCiAgICAgICAgICAgICAgICBjb250ZW50ID0gbGlzdFRhYmxlLnJvd3Nbal0uY2VsbHNbNV0uaW5uZXJIVE1MLnNwbGl0KCI+IilbMV0ucmVwbGFjZSgiPC9zcGFuIiwiIikucmVwbGFjZSgiPC9TUEFOIiwiIik7DQogICAgICAgICAgICAgIGVsc2UgZW1wdHkrKzsNCiAgICAgICAgICAgICAgDQogICAgICAgICAgICAgIGlmIChsaXN0VGFibGUucm93c1tqXS5jZWxsc1s2XS5pbm5lckhUTUwuc3BsaXQoIj4iKS5sZW5ndGg9PTMpDQogICAgICAgICAgICAgICAgY29udGVudDIgPSBsaXN0VGFibGUucm93c1tqXS5jZWxsc1s2XS5pbm5lckhUTUwuc3BsaXQoIj4iKVsxXS5yZXBsYWNlKCI8L3NwYW4iLCIiKS5yZXBsYWNlKCI8L1NQQU4iLCIiKTsNCiAgICAgICAgICAgICAgZWxzZSBlbXB0eSsrOw0KICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgaWYgKGVtcHR5PT0yKSBsaXN0VGFibGUucm93c1tqXS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOw0KICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgIGlmICghKChjb250ZW50Lmxlbmd0aD09c2VsZWN0ZWQubGVuZ3RoKSYmKGNvbnRlbnQubWF0Y2goc2VsZWN0ZWQpIT1udWxsKSkpIHsNCiAgICAgICAgICAgICAgICBpZiAoISgoY29udGVudDIubGVuZ3RoPT1zZWxlY3RlZC5sZW5ndGgpJiYoY29udGVudDIubWF0Y2goc2VsZWN0ZWQpIT1udWxsKSkpIHsNCiAgICAgICAgICAgICAgICAgIGxpc3RUYWJsZS5yb3dzW2pdLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICBicmVhazsNCg0KICAgICAgICAgICAgY2FzZSAzOg0KICAgICAgICAgICAgICBpZiAobGlzdFRhYmxlLnJvd3Nbal0uY2VsbHNbOF0uaW5uZXJIVE1MLnNwbGl0KCI+IikubGVuZ3RoPT0zKSB7DQogICAgICAgICAgICAgICAgY29udGVudCA9IGxpc3RUYWJsZS5yb3dzW2pdLmNlbGxzWzhdLmlubmVySFRNTC5zcGxpdCgiPiIpWzFdLnJlcGxhY2UoIjwvc3BhbiIsIiIpLnJlcGxhY2UoIjwvU1BBTiIsIiIpOw0KDQogICAgICAgICAgICAgICAgaWYgKCEoKGNvbnRlbnQubGVuZ3RoPT1zZWxlY3RlZC5sZW5ndGgpJiYoY29udGVudC5tYXRjaChzZWxlY3RlZCkhPW51bGwpKSkgew0KICAgICAgICAgICAgICAgICAgbGlzdFRhYmxlLnJvd3Nbal0uc3R5bGUuZGlzcGxheSA9ICJub25lIjsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGJyZWFrOw0KDQogICAgICAgICAgICBjYXNlIDQ6DQogICAgICAgICAgICAgIGlmIChsaXN0VGFibGUucm93c1tqXS5jZWxsc1s3XS5pbm5lckhUTUwuc3BsaXQoIj4iKS5sZW5ndGg9PTMpIHsNCiAgICAgICAgICAgICAgICBjb250ZW50ID0gbGlzdFRhYmxlLnJvd3Nbal0uY2VsbHNbN10uaW5uZXJIVE1MLnNwbGl0KCI+IilbMV0ucmVwbGFjZSgiPC9hIiwiIikucmVwbGFjZSgiPC9BIiwiIik7DQogICAgICAgICAgICAgIH0gZWxzZSBjb250ZW50ID0gbGlzdFRhYmxlLnJvd3Nbal0uY2VsbHNbN10uaW5uZXJIVE1MOw0KDQogICAgICAgICAgICAgICAgaWYgKCEoKGNvbnRlbnQubGVuZ3RoPT1zZWxlY3RlZC5sZW5ndGgpJiYoY29udGVudC5tYXRjaChzZWxlY3RlZCkhPW51bGwpKSkgew0KICAgICAgICAgICAgICAgICAgbGlzdFRhYmxlLnJvd3Nbal0uc3R5bGUuZGlzcGxheSA9ICJub25lIjsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgIA0KICAgICAgICAgICAgYnJlYWs7DQoNCiAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIA0KICAgICAgICAvLyBzYXZpbmcgc3RhdHVzIG9mIHNlbGVjdGlvbiBmb3IgbmV4dCB0aW1lIHRhYiBlbnRyYW5jZQ0KICAgICAgICANCiAgICAgICAgdmFyIHNlY0Rpc3AgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgic2VjdGlvbnNfaWQiKTsNCiAgICAgICAgdmFyIGNhdERpc3AgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY2F0ZWdvcmllc19pZCIpOw0KICAgICAgICB2YXIgYXV0RGlzcCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJhdXRob3JzX2lkIik7DQogICAgICAgIHZhciBzdGFEaXNwID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInN0YXR1c19pZCIpOw0KDQogICAgICAgIHNldENvb2tpZSgidGpoX2xpc3RmaWx0ZXJfY2hvb3NlciIsIHN3LCAzNjUpOw0KICAgICAgICBzZXRDb29raWUoInRqaF9saXN0ZmlsdGVyX3NlY3Rpb25zIiwgc2VjRGlzcC5zZWxlY3RlZEluZGV4KjEsIDM2NSk7DQogICAgICAgIHNldENvb2tpZSgidGpoX2xpc3RmaWx0ZXJfY2F0ZWdvcmllcyIsIGNhdERpc3Auc2VsZWN0ZWRJbmRleCoxLCAzNjUpOw0KICAgICAgICBzZXRDb29raWUoInRqaF9saXN0ZmlsdGVyX2F1dGhvcnMiLCBhdXREaXNwLnNlbGVjdGVkSW5kZXgqMSwgMzY1KTsNCiAgICAgICAgc2V0Q29va2llKCJ0amhfbGlzdGZpbHRlcl9zdGF0dXMiLCBzdGFEaXNwLnNlbGVjdGVkSW5kZXgqMSwgMzY1KTsNCg0KICAgICAgfQ0KICAgICAgDQogICAgICAvLyBmdW5jdGlvbiBmb3IgaGlkaW5nIHVuc2VsZWN0ZWQgc2VsZWN0cw0KICAgICAgZnVuY3Rpb24gc3dpdGNoU2VsZWN0b3Ioc2VuZGVyKSB7DQogICAgICAgIHZhciBzZWNEaXNwID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInNlY3Rpb25zX2lkIik7DQogICAgICAgIHZhciBjYXREaXNwID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNhdGVnb3JpZXNfaWQiKTsNCiAgICAgICAgdmFyIGF1dERpc3AgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYXV0aG9yc19pZCIpOw0KICAgICAgICB2YXIgc3RhRGlzcCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzdGF0dXNfaWQiKTsNCiAgICAgICAgdmFyIHN3ID0gc2VuZGVyKjE7IC8vIHRvSW50IHR5cGVjYXN0IA0KICAgICAgICANCiAgICAgICAgc3dpdGNoIChzdykgew0KICAgICAgICAgIGNhc2UgMDoNCiAgICAgICAgICAgIHNlY0Rpc3Auc3R5bGUuZGlzcGxheSA9ICJub25lIjsNCiAgICAgICAgICAgIGNhdERpc3Auc3R5bGUuZGlzcGxheSA9ICJub25lIjsNCiAgICAgICAgICAgIGF1dERpc3Auc3R5bGUuZGlzcGxheSA9ICJub25lIjsNCiAgICAgICAgICAgIHN0YURpc3Auc3R5bGUuZGlzcGxheSA9ICJub25lIjsNCiAgICAgICAgICAgIGZpbHRlckxpc3QoIiIpOw0KICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgIA0KICAgICAgICAgIGNhc2UgMToNCiAgICAgICAgICAgIHNlY0Rpc3Auc3R5bGUuZGlzcGxheSA9ICJpbmxpbmUiOw0KICAgICAgICAgICAgY2F0RGlzcC5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOw0KICAgICAgICAgICAgYXV0RGlzcC5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOw0KICAgICAgICAgICAgc3RhRGlzcC5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOw0KICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgIA0KICAgICAgICAgIGNhc2UgMjoNCiAgICAgICAgICAgIHNlY0Rpc3Auc3R5bGUuZGlzcGxheSA9ICJub25lIjsNCiAgICAgICAgICAgIGNhdERpc3Auc3R5bGUuZGlzcGxheSA9ICJpbmxpbmUiOw0KICAgICAgICAgICAgYXV0RGlzcC5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOw0KICAgICAgICAgICAgc3RhRGlzcC5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOw0KICAgICAgICAgIGJyZWFrOw0KDQogICAgICAgICAgY2FzZSAzOg0KICAgICAgICAgICAgc2VjRGlzcC5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOw0KICAgICAgICAgICAgY2F0RGlzcC5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOw0KICAgICAgICAgICAgYXV0RGlzcC5zdHlsZS5kaXNwbGF5ID0gImlubGluZSI7DQogICAgICAgICAgICBzdGFEaXNwLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7DQogICAgICAgICAgYnJlYWs7DQoNCiAgICAgICAgICBjYXNlIDQ6DQogICAgICAgICAgICBzZWNEaXNwLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7DQogICAgICAgICAgICBjYXREaXNwLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7DQogICAgICAgICAgICBhdXREaXNwLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7DQogICAgICAgICAgICBzdGFEaXNwLnN0eWxlLmRpc3BsYXkgPSAiaW5saW5lIjsNCiAgICAgICAgICBicmVhazsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgICAgDQogICAgICAvLyBsb2FkZWQgc2F2ZWQgc2VsZWN0cyBwb3NpdGlvbnMNCiAgICAgIGZ1bmN0aW9uIHNldFNlbGVjdG9ycygpIHsNCiAgICAgICAgdmFyIHNlY0Rpc3AgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgic2VjdGlvbnNfaWQiKTsNCiAgICAgICAgdmFyIGNhdERpc3AgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY2F0ZWdvcmllc19pZCIpOw0KICAgICAgICB2YXIgYXV0RGlzcCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJhdXRob3JzX2lkIik7DQogICAgICAgIHZhciBzdGFEaXNwID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInN0YXR1c19pZCIpOw0KICAgICAgICB2YXIgY2hvb0Rpc3AgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgic2VsZWN0b3JfaWQiKTsNCg0KICAgICAgICB2YXIgY2hvb0Nvb2sgPSBnZXRDb29raWUoInRqaF9saXN0ZmlsdGVyX2Nob29zZXIiKTsNCiAgICAgICAgdmFyIHNlY0Nvb2sgPSBnZXRDb29raWUoInRqaF9saXN0ZmlsdGVyX3NlY3Rpb25zIik7DQogICAgICAgIHZhciBjYXRDb29rID0gZ2V0Q29va2llKCJ0amhfbGlzdGZpbHRlcl9jYXRlZ29yaWVzIik7DQogICAgICAgIHZhciBhdXRDb29rID0gZ2V0Q29va2llKCJ0amhfbGlzdGZpbHRlcl9hdXRob3JzIik7DQogICAgICAgIHZhciBzdGFDb29rID0gZ2V0Q29va2llKCJ0amhfbGlzdGZpbHRlcl9zdGF0dXMiKTsNCg0KICAgICAgICBpZiAoc2VjQ29vayAhPSBudWxsKSB7DQogICAgICAgICAgc2VjRGlzcC5zZWxlY3RlZEluZGV4ID0gc2VjQ29vayoxOw0KICAgICAgICB9DQogICAgICAgIGlmIChjYXRDb29rICE9IG51bGwpIHsNCiAgICAgICAgICBjYXREaXNwLnNlbGVjdGVkSW5kZXggPSBjYXRDb29rKjE7DQogICAgICAgIH0NCiAgICAgICAgaWYgKGF1dENvb2sgIT0gbnVsbCkgew0KICAgICAgICAgIGF1dERpc3Auc2VsZWN0ZWRJbmRleCA9IGF1dENvb2sqMTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAoc3RhQ29vayAhPSBudWxsKSB7DQogICAgICAgICAgc3RhRGlzcC5zZWxlY3RlZEluZGV4ID0gc3RhQ29vayoxOw0KICAgICAgICB9DQogICAgICAgIGlmIChjaG9vQ29vayAhPSBudWxsKSB7DQogICAgICAgICAgY2hvb0Rpc3Auc2VsZWN0ZWRJbmRleCA9IGNob29Db29rKjE7DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIHN3aXRjaFNlbGVjdG9yKGNob29EaXNwLm9wdGlvbnNbY2hvb0Rpc3Auc2VsZWN0ZWRJbmRleF0udmFsdWUpOw0KICAgICAgICBmaWx0ZXJMaXN0KGNob29EaXNwLm9wdGlvbnNbY2hvb0Rpc3Auc2VsZWN0ZWRJbmRleF0udmFsdWUpOw0KICAgICAgfQ0KICAgICAgDQogICAgICAvLyAqKiogSU5JVElBTElaQVRJT04NCiAgICAgIA0KICAgICAgdmFyIHRhYmxlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImxpc3QiKTsNCiAgICAgIHRhYmxlLmluc2VydFJvdygwKTsNCiAgICAgIHZhciBjZWxsID0gdGFibGUucm93c1swXS5pbnNlcnRDZWxsKDApOyANCiAgICAgIGNlbGwuY29sU3BhbiA9IDExOw0KICAgICAgY2VsbC5zdHlsZS50ZXh0QWxpZ24gPSAicmlnaHQiOw0KICAgICAgY2VsbC5zdHlsZS5ib3JkZXIgPSAibWVkaXVtIG5vbmUiOw0KICAgICAgY2VsbC5pbm5lckhUTUwgPSAiJy4kb3V0LiciOw0KICAgICAgDQogICAgICBzZXRTZWxlY3RvcnMoKTsNCg0KICAgICc7DQoNCgkJZWNobyBzY3JpcHRfanMoJGpzKTsJCQ0KCX0NCiAgDQogIC8vIHJldHVybnMgYWxsIHNlY3Rpb25zIGZyb20gREINCiAgDQogIGZ1bmN0aW9uIGdldFNlY3Rpb25zKCkgew0KICAgICRzZWN0aW9ucyA9IGFycmF5KCk7DQogICAgDQogICAgJHJvd3MgPSBnZXRSb3dzKCJzZWxlY3QgbmFtZSBmcm9tICIuc2FmZV9wZngoInR4cF9zZWN0aW9uIikuIiB3aGVyZSBuYW1lIG5vdCBsaWtlIFwiZGVmYXVsdFwiIG9yZGVyIGJ5IG5hbWUiKTsNCiAgICANCiAgICBpZiAoY291bnQoJHJvd3MpPjApDQogICAgICBmb3JlYWNoICgkcm93cyBhcyAkbmFtZSkgew0KICAgICAgICAkc2VjdGlvbnNbJG5hbWVbIm5hbWUiXV0gPSAkbmFtZVsibmFtZSJdOw0KICAgICAgfQ0KICAgICAgDQogICAgcmV0dXJuICRzZWN0aW9uczsNCiAgfQ0KICANCiAgLy8gcmV0dXJucyBhbGwgY2F0ZWdvcmllcyBmcm9tIERCDQogIA0KICBmdW5jdGlvbiBnZXRDYXRlZ29yaWVzKCkgew0KICAgICRjYXRlZ29yaWVzID0gYXJyYXkoKTsNCiAgICANCiAgICAkcm93cyA9IGdldFJvd3MoInNlbGVjdCBuYW1lIGZyb20gIi5zYWZlX3BmeCgidHhwX2NhdGVnb3J5IikuIiB3aGVyZSAobmFtZSBub3QgbGlrZSBcInJvb3RcIikgYW5kICh0eXBlICBsaWtlIFwiYXJ0aWNsZVwiKSBvcmRlciBieSBuYW1lIik7DQoNCiAgICBpZiAoY291bnQoJHJvd3MpPjApDQogICAgICBmb3JlYWNoICgkcm93cyBhcyAkbmFtZSkgew0KICAgICAgICAkY2F0ZWdvcmllc1skbmFtZVsibmFtZSJdXSA9ICRuYW1lWyJuYW1lIl07DQogICAgICB9DQogICAgICANCiAgICByZXR1cm4gJGNhdGVnb3JpZXM7DQogIH0NCg0KLy8gcmV0dXJucyBhbGwgYXV0aG9ycyBmcm9tIERCDQoNCmZ1bmN0aW9uIGdldEF1dGhvcnMoKSB7DQogICAgJGF1dGhvcnMgPSBhcnJheSgpOw0KICAgIA0KICAgICRyb3dzID0gZ2V0Um93cygic2VsZWN0IG5hbWUgZnJvbSAiLnNhZmVfcGZ4KCJ0eHBfdXNlcnMiKS4iIG9yZGVyIGJ5IG5hbWUiKTsNCg0KICAgIGlmIChjb3VudCgkcm93cyk+MCkNCiAgICAgIGZvcmVhY2ggKCRyb3dzIGFzICRuYW1lKSB7DQogICAgICAgICRhdXRob3JzWyRuYW1lWyJuYW1lIl1dID0gJG5hbWVbIm5hbWUiXTsNCiAgICAgIH0NCiAgICAgIA0KICAgIHJldHVybiAkYXV0aG9yczsNCiAgfQ0KDQovLyByZXR1cm5zIGFsbCBzdGF0dXNlcw0KDQpmdW5jdGlvbiBnZXRTdGF0dXMoKSB7DQogICAgJHN0YXR1cyA9IGFycmF5KCk7DQogICAgJHN0ID0gYXJyYXkoImRyYWZ0IiwgImhpZGRlbiIsICJwZW5kaW5nIiwgInBvc3RlZCIsICJzdGlja3kiKTsNCiAgICANCiAgICBmb3JlYWNoICgkc3QgYXMgJGl0ZW0pIHsNCiAgICAgICRzdGF0dXNbZ1R4dCgkaXRlbSldID0gZ1R4dCgkaXRlbSk7DQogICAgfQ0KICAgIA0KICAgIHJldHVybiAkc3RhdHVzOw0KICB9DQoNCiI7czozOiJtZDUiO3M6MzI6ImJkZjc3MGQ0NmFlNjVmNzE0NDc5M2M1NDk0OTc4ZWFlIjt9