Textpattern CMS support forum
You are not logged in. Register | Login | Help
- Topics: Active | Unanswered
#316 2007-11-11 16:17:59
Re: tru_tags: A tagging plugin for textpattern
Doesn’t work with the new version either. I use clean URLs (section/title). Everything worked fine before the upgrade, I had tag-based URLs working: /stichwort/tag-name
All I changed was the plugin update.
Here’s the page of the tag-cloud
Offline
#317 2007-11-11 16:42:29
Re: tru_tags: A tagging plugin for textpattern
I am deeply impressed. Good work Nathan!
the issue you reported with spaces at the end of the keywords field is actually a bug with the 4.0.5 release of Textpattern. I found the issue and reported it, and it has already been fixed for the next Textpattern release.
Thanks! Just checking the roadmap…
Get all online mentions of Textpattern via OPML subscription: TXP Info Sources: Textpattern RSS feeds as dynamic OPML
Offline
#318 2007-11-11 16:46:12
Re: tru_tags: A tagging plugin for textpattern
Higher priority for “Multi-tag search (tag1 + tag2)”?
- Feature request: RSS feeds for tags
- Feature request: boolean combinations :-) Example: (tag1 or tag2) and tag3
- Feature request: Output the tag section as indexed pages (A-Z) to structure big amounts of tags. Examples can be seen here: SmashingMagazine (paragraph: Tag Index Instead Of Tag Clouds)
Last edited by merz1 (2007-11-11 16:55:55)
Get all online mentions of Textpattern via OPML subscription: TXP Info Sources: Textpattern RSS feeds as dynamic OPML
Offline
#319 2007-11-11 20:45:05
Re: tru_tags: A tagging plugin for textpattern
andreas – I’m still thinking that something might be funny about your site configuration. My clue is this:
This URL: http://www.rete-mirabile.net/?s=lernen seems to work,
but this URL: http://www.rete-mirabile.net/?s=stichwort doesn’t,
while this one: http://www.rete-mirabile.net/stichwort/ does.
As near as I can tell, tru_tags shouldn’t be touching that second URL, and Textpattern should just render the default page for your “stichwort” section. Presumably that should be the exact same page as the third URL, but it isn’t. Is there any chance that you have custom rewrite rules in your .htaccess file?
If that’s not it, the only thing I can think to try is to start putting debugging messages into tru_tags to see what it’s really doing. To do that, I’d need access to your site. If you’re willing to do that, please send credentials to truist-20071111@truist.com.
merz1 – thanks! For your feature requests:
- Multi-search tag (in the current version of TXP) will require a major hack to work around the structure of the Textpattern code, so I’ve been avoiding it in the hope that future versions of TXP will be more modular. The fact that it’s as high on the priority list as it is, is a good sign :) Implementing that feature will also probably mean that I submit a major piece of code to Textpattern, to make the code be more modular.
- Good reminder about RSS feeds for tags. That’s another one that’s waiting on better Textpattern code, although in this case I actually submitted the better code already, and it’s already committed to core, but I don’t think we’ll see it until the next major Textpattern release. I added this idea to the roadmap page, though, with an indication that it depends on the Textpattern release. Once we get that, though, this will be relatively easy.
- I added the boolean combinations to the “multi-tag search” group – once multi-tag search is done, booleans should be relatively easy
- The indexed output was already in “group 5”, but I added the idea of a single page per group.
Thanks!
Offline
#320 2007-11-16 10:37:41
- iboi
- New Member
- Registered: 2007-11-16
- Posts: 2
Re: tru_tags: A tagging plugin for textpattern
truist wrote:
All, I’m very pleased to announce the release of tru_tags v3.0.
I cannot reach your domain. Is there an alternative download location?
Offline
#321 2007-11-16 10:58:16
Re: tru_tags: A tagging plugin for textpattern
iboi, here is the plugin code. Well it’s a little modified version, but it works completely same way. Only comments are removed from the plugin’s php-code :)
# tru_tags 3.0
# Article tagging
# Nathan Arthur
# http://www.truist.com/
# .....................................................................
# This is a plugin for Textpattern - http://textpattern.com/
# To install: textpattern > admin > plugins
# Paste the following text into the 'Install plugin' box:
# .....................................................................
YTo5OntzOjQ6Im5hbWUiO3M6ODoidHJ1X3RhZ3MiO3M6NjoiYXV0aG9yIjtzOjEzOiJOYXRoYW4gQXJ0aHVyIjtzOjEwOiJhdXRob3JfdXJpIjtzOjIyOiJodHRwOi8vd3d3LnRydWlzdC5jb20vIjtzOjc6InZlcnNpb24iO3M6MzoiMy4wIjtzOjExOiJkZXNjcmlwdGlvbiI7czoxNToiQXJ0aWNsZSB0YWdnaW5nIjtzOjQ6ImhlbHAiO3M6NjMwOiIJPHA+VG8gbGVhcm4gbW9yZSBhYm91dCB0cnVfdGFncywgY2hlY2sgb3V0IHRoZSA8YSBocmVmPSIvYmxvZy80OTMvdHJ1dGFncy1hLXRhZ2dpbmctcGx1Z2luLWZvci10ZXh0cGF0dGVybiIgcmVsPSJub2ZvbGxvdyI+aW50cm9kdWN0b3J5IGFydGljbGU8L2E+LCA8YSBocmVmPSJodHRwOi8vd3d3LnRydWlzdC5jb20vcmVmZXJlbmNlLzUzNy90cnVfdGFncy1yZWxlYXNlcyIgcmVsPSJub2ZvbGxvdyI+cmVsZWFzZXMgcGFnZTwvYT4sIDxhIGhyZWY9Imh0dHA6Ly93d3cudHJ1aXN0LmNvbS9yZWZlcmVuY2UvNDk1L3RydXRhZ3MtZmVhdHVyZS1saXN0IiByZWw9Im5vZm9sbG93Ij5mZWF0dXJlIGxpc3Q8L2E+LCBhbmQgPGEgaHJlZj0iaHR0cDovL3d3dy50cnVpc3QuY29tL3JlZmVyZW5jZS80OTcvdHJ1dGFncy11c2FnZS1pbnN0cnVjdGlvbnMiIHJlbD0ibm9mb2xsb3ciPnVzYWdlIGluc3RydWN0aW9uczwvYT4uPC9wPg0KDQoJPHA+SSYjODIxNzt2ZSB0YWtlbiB0aGUgZGV0YWlsZWQgaGVscCBvdXQgb2YgdGhlIHBsdWdpbjsgbXkgYXBvbG9naWVzLiAgSXQgd2FzIHRvbyBiaWcgYW5kIHRvbyBkaWZmaWN1bHQgdG8ga2VlcCBtYWludGFpbmluZyBvbiBteSBzaXRlIGFuZCBpbiB0aGUgcGx1Z2luLjwvcD4iO3M6NDoiY29kZSI7czozMzk0NToiDQoJZGVmaW5lKCdUUlVfVEFHU19GSUVMRCcsICdLZXl3b3JkcycpOw0KCWRlZmluZSgnQ0xFQU5fVVJMUycsICdjbGVhbl91cmxzJyk7DQoJZGVmaW5lKCdUQUdfU0VDVElPTicsICd0YWdfc2VjdGlvbicpOw0KCWRlZmluZSgnUEFSTV9OQU1FJywgJ3Bhcm0nKTsNCglkZWZpbmUoJ1RBR1NfSU5fRkVFRF9DQVRFR09SSUVTJywgJ3RhZ3NfaW5fZmVlZF9jYXRlZ29yaWVzJyk7DQoJZGVmaW5lKCdUQUdTX0lOX0ZFRURfQk9EWScsICd0YWdzX2luX2ZlZWRfYm9keScpOw0KCWRlZmluZSgnVEFHU19JTl9XUklURV9UQUInLCAndGFnc19pbl93cml0ZV90YWInKTsNCglnbG9iYWwgJHRydV90YWdzX3ByZWZzOw0KCSR0cnVfdGFnc19wcmVmcyA9IHRydV90YWdzX2xvYWRfcHJlZnMoKTsNCgkJDQoJZnVuY3Rpb24gdHJ1X3RhZ3NfaGFuZGxlcigkYXR0cykgew0KCQkkdGFnX3BhcmFtZXRlciA9IHRydV90YWdzX3RhZ19wYXJhbWV0ZXIoYXJyYXkoKSwgZmFsc2UpOw0KCQlpZiAoIWVtcHR5KCR0YWdfcGFyYW1ldGVyKSkgew0KCQkJaWYgKHRydV90YWdzX3JlZGlyZWN0X2lmX25lZWRlZCgkdGFnX3BhcmFtZXRlcikpIHsNCgkJCQlyZXR1cm4gJyc7DQoJCQl9DQoJCQkkY2xlYW5fYXR0cyA9IHRydV90YWdzX2ZpeHVwX3F1ZXJ5X2F0dHMoJGF0dHMsICR0YWdfcGFyYW1ldGVyKTsNCgkJCSRyZXN1bHQgPSBkb0FydGljbGVzKCRjbGVhbl9hdHRzLCB0cnVlKTsNCgkJCWlmICh0cmltKCRyZXN1bHQpID09ICcnKSB7DQoJCQkJaWYgKGlzc2V0KCRhdHRzWydub2FydGljbGVzJ10pKSB7DQoJCQkJCXRydV90YWdzX3JlZGlyZWN0KCRhdHRzWydub2FydGljbGVzJ10sIHRydWUpOw0KCQkJCX0gZWxzZSB7DQoJCQkJCXR4cF9kaWUoZ1R4dCgnNDA0X25vdF9mb3VuZCcpLCAnNDA0Jyk7DQoJCQkJfQ0KCQkJfSBlbHNlIHsNCgkJCQlyZXR1cm4gJHJlc3VsdDsNCgkJCX0NCgkJfSBlbHNlIHsNCgkJCXJldHVybiB0cnVfdGFnc19jbG91ZCgkYXR0cyk7DQoJCX0NCgl9DQoNCglmdW5jdGlvbiB0cnVfdGFnc19jbG91ZCgkYXR0cykgew0KCQlyZXR1cm4gdHJ1X3RhZ3NfbGlzdCh0cnVfdGFnc19nZXRfc3RhbmRhcmRfY2xvdWRfYXR0cygkYXR0cywgZmFsc2UsIGZhbHNlKSk7DQoJfQ0KDQoJZnVuY3Rpb24gdHJ1X3RhZ3NfbGlzdCgkYXR0cykgew0KCQkkYXR0cyA9IHRydV90YWdzX2dldF9zdGFuZGFyZF9jbG91ZF9hdHRzKCRhdHRzLCB0cnVlLCBmYWxzZSk7DQoJCSRhbGxfdGFncyA9IHRydV90YWdzX2Nsb3VkX3F1ZXJ5KCRhdHRzKTsNCgkJcmV0dXJuIHRydV90YWdzX3JlbmRlcl9jbG91ZCgkYXR0cywgJGFsbF90YWdzLCAkYWxsX3RhZ3MpOw0KCX0NCg0KDQoJZnVuY3Rpb24gdHJ1X3RhZ3NfZnJvbV9hcnRpY2xlKCRhdHRzKSB7DQoJCWdsb2JhbCAkdGhpc2FydGljbGU7DQoJCWV4dHJhY3QoJHRoaXNhcnRpY2xlKTsNCgkJJGFsbF90YWdzID0gdHJ1X3RhZ3NfZ2V0X3RhZ3NfZm9yX2FydGljbGUoJHRoaXNpZCk7DQoJCSRhdHRzID0gdHJ1X3RhZ3NfZ2V0X3N0YW5kYXJkX2Nsb3VkX2F0dHMoJGF0dHMsIGZhbHNlLCB0cnVlKTsNCgkJJGFsbF90YWdzX2Zvcl93ZWlnaHQgPSAkYWxsX3RhZ3M7DQoJCWlmICgkYXR0c1sndXNlb3ZlcmFsbGNvdW50cyddKSB7DQoJCQkkYWxsX3RhZ3NfZm9yX3dlaWdodCA9IHRydV90YWdzX2Nsb3VkX3F1ZXJ5KCRhdHRzKTsNCgkJfQ0KCQkkb3V0ID0gdHJ1X3RhZ3NfcmVuZGVyX2Nsb3VkKCRhdHRzLCAkYWxsX3RhZ3MsICRhbGxfdGFnc19mb3Jfd2VpZ2h0KTsNCgkJJG91dCA9IHN0cl9yZXBsYWNlKCJcbiIsIiIsJG91dCk7DQoJCXJldHVybiAkb3V0Ow0KCX0NCg0KDQpmdW5jdGlvbiB0cnVfdGFnc19pZl9oYXNfdGFncygkYXR0cywgJHRoaW5nKSB7DQoJZ2xvYmFsICR0aGlzYXJ0aWNsZTsNCglleHRyYWN0KCR0aGlzYXJ0aWNsZSk7DQoNCgkkdGFnc19maWVsZCA9IFRSVV9UQUdTX0ZJRUxEOw0KDQoJJHJzID0gc2FmZV9yb3coJHRhZ3NfZmllbGQsICJ0ZXh0cGF0dGVybiIsICJJRD0nJHRoaXNpZCcgQU5EICR0YWdzX2ZpZWxkIDw+ICcnIik7DQoJcmV0dXJuIHBhcnNlKEV2YWxFbHNlKCR0aGluZywgJHJzKSk7DQp9DQoNCg0KZnVuY3Rpb24gdHJ1X3RhZ3NfaWZfdGFnX3NlYXJjaCgkYXR0cywgJHRoaW5nKSB7DQoJJHRhZ19wYXJhbWV0ZXIgPSB0cnVfdGFnc190YWdfcGFyYW1ldGVyKGFycmF5KCksIGZhbHNlKTsNCgkkY29uZGl0aW9uID0gKCFlbXB0eSgkdGFnX3BhcmFtZXRlcikpID8gdHJ1ZSA6IGZhbHNlOw0KCXJldHVybiBwYXJzZShFdmFsRWxzZSgkdGhpbmcsICRjb25kaXRpb24pKTsNCn0NCg0KDQpmdW5jdGlvbiB0cnVfdGFnc190YWdfcGFyYW1ldGVyKCRhdHRzLCAkc2FmZWh0bWwgPSB0cnVlKSB7DQoJZ2xvYmFsICR0cnVfdGFnc19wcmVmczsNCglleHRyYWN0KGxBdHRzKGFycmF5KCdzdHJpcGh5cGhlbnMnID0+IDAsICd1cmxlbmNvZGUnID0+IDApLCAgJGF0dHMsIDApKTsNCg0KCSRwYXJtID0gdXJsZGVjb2RlKHN0cmlwX3RhZ3MoZ3BzKCR0cnVfdGFnc19wcmVmc1tQQVJNX05BTUVdLT52YWx1ZSkpKTsNCgkkcGFybSA9ICgkc3RyaXBoeXBoZW5zID8gc3RyX3JlcGxhY2UoJy0nLCAnICcsICRwYXJtKSA6ICRwYXJtKTsNCglpZiAoJHVybGVuY29kZSkgew0KCQkkcGFybSA9IHVybGVuY29kZSgkcGFybSk7DQoJIH0gZWxzZSBpZiAoJHNhZmVodG1sKSB7DQoJCSRwYXJtID0gaHRtbHNwZWNpYWxjaGFycygkcGFybSk7DQoJfQ0KDQoJcmV0dXJuICRwYXJtOw0KfQ0KDQoNCmZ1bmN0aW9uIHRydV90YWdzX3NlYXJjaF9wYXJhbWV0ZXIoKSB7DQoJcmV0dXJuIHN0cmlwX3RhZ3MoZ3BzKCdxJykpOw0KfQ0KDQoNCmZ1bmN0aW9uIHRydV90YWdzX3JlbGF0ZWRfdGFnc19mcm9tX3NlYXJjaCgkYXR0cykgew0KCSR0YWdfcGFyYW1ldGVyID0gdHJ1X3RhZ3NfdGFnX3BhcmFtZXRlcihhcnJheSgpLCBmYWxzZSk7DQoJaWYgKCFlbXB0eSgkdGFnX3BhcmFtZXRlcikpIHsNCgkgICAgICAgICR0YWdzX2ZpZWxkID0gVFJVX1RBR1NfRklFTEQ7DQoJCSRhbGxfdGFncyA9IGFycmF5KCk7DQoNCgkJJHF1ZXJ5X2F0dHMgPSB0cnVfdGFnc19maXh1cF9xdWVyeV9hdHRzKCRhdHRzLCAkdGFnX3BhcmFtZXRlcik7DQoJCSRycyA9IHRydV90YWdzX3JlZG9fYXJ0aWNsZV9zZWFyY2goJHF1ZXJ5X2F0dHMpOw0KCQlpZiAoJHJzKSB7DQoJCQl3aGlsZSAoJGEgPSBuZXh0Um93KCRycykpIHsNCgkJCQkkYXJ0aWNsZV90YWdzID0gYXJyYXkoKTsNCgkJCQlpZiAoYXJyYXlfa2V5X2V4aXN0cygkdGFnc19maWVsZCwgJGEpKSB7DQoJCQkJCSRhcnRpY2xlX3RhZ3MgPSBleHBsb2RlKCIsIiwgdHJpbSh0cnVfdGFnc19zdHJ0b2xvd2VyKCRhWyR0YWdzX2ZpZWxkXSkpKTsNCgkJCQl9DQoJCQkJJGFsbF90YWdzID0gYXJyYXlfbWVyZ2UoJGFsbF90YWdzLCB0cnVfdGFnc190cmltX3RhZ3MoJGFydGljbGVfdGFncykpOw0KCQkJfQ0KCQl9DQoNCgkJJGFsdF90YWdfcGFyYW1ldGVyID0gc3RyX3JlcGxhY2UoJy0nLCAnICcsICR0YWdfcGFyYW1ldGVyKTsNCgkJZm9yZWFjaCAoJGFsbF90YWdzIGFzICRrZXkgPT4gJHRhZykgew0KCQkJaWYgKCR0YWcgPT0gJHRhZ19wYXJhbWV0ZXIgfHwgJHRhZyA9PSAkYWx0X3RhZ19wYXJhbWV0ZXIpIHsNCgkJCQl1bnNldCgkYWxsX3RhZ3NbJGtleV0pOw0KCQkJfQ0KCQl9DQoNCgkJJGNsb3VkX2F0dHMgPSB0cnVfdGFnc19nZXRfc3RhbmRhcmRfY2xvdWRfYXR0cygkYXR0cywgZmFsc2UsIGZhbHNlKTsNCgkJJGFsbF90YWdzX2Zvcl93ZWlnaHQgPSAkYWxsX3RhZ3M7DQoJCWlmICgkY2xvdWRfYXR0c1sndXNlb3ZlcmFsbGNvdW50cyddKSB7DQoJCQkkYWxsX3RhZ3NfZm9yX3dlaWdodCA9IHRydV90YWdzX2Nsb3VkX3F1ZXJ5KCRjbG91ZF9hdHRzKTsNCgkJfQ0KDQoJCXJldHVybiB0cnVfdGFnc19yZW5kZXJfY2xvdWQoJGNsb3VkX2F0dHMsICRhbGxfdGFncywgJGFsbF90YWdzX2Zvcl93ZWlnaHQpOw0KCX0gZWxzZSB7DQoJCXJldHVybiAnJzsNCgl9DQp9DQoNCg0KIyMjIENMT1VEIFNVUFBPUlQgRlVOQ1RJT05TICMjIw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQpmdW5jdGlvbiB0cnVfdGFnc19nZXRfc3RhbmRhcmRfY2xvdWRfYXR0cygkYXR0cywgJGlzTGlzdCwgJGlzQXJ0aWNsZSkgew0KCXJldHVybiBsQXR0cyhhcnJheSgnd3JhcHRhZycJPT4gKCRpc0xpc3QgPyAndWwnIDogJycpLA0KCQkJJ2JyZWFrJwkJPT4gKCRpc0xpc3QgPyAnbGknIDogJywgJyksDQoJCQknY2xhc3MnCQk9PiAnJywNCgkJCSdicmVha2NsYXNzJwk9PiAnJywNCgkJCSdzZWN0aW9uJwk9PiAnJywNCgkJCSdtaW5wZXJjZW50Jwk9PiAnMTAwJywNCgkJCSdtYXhwZXJjZW50Jwk9PiAoJGlzTGlzdCB8fCAkaXNBcnRpY2xlID8gJzEwMCcgOiAnMjAwJyksDQoJCQknc2hvd2NvdW50cycJPT4gJycsDQoJCQknY291bnR3cmFwY2hhcnMnCT0+ICdbXScsDQoJCQkndXNlcmVsdGFnJwk9PiAoJGlzQXJ0aWNsZSA/ICcxJyA6ICcnKSwNCgkJCSdnZW5lcmF0ZWxpbmtzJwk9PiAnMScsDQoJCQknbWludGFnY291bnQnCT0+ICcwJywNCgkJCSdtYXh0YWdjb3VudCcJPT4gJzEwMDAnLA0KCQkJJ3NldHNpemVzJwk9PiAoJGlzQXJ0aWNsZSA/ICcwJyA6ICcxJyksDQoJCQkndXNlbm9mb2xsb3cnCT0+ICcnLA0KCQkJJ3NvcnQnCQk9PiAnYWxwaGEnLA0KCQkJJ3VzZW92ZXJhbGxjb3VudHMnCT0+ICcnLA0KCQkJJ3NldGNsYXNzZXMnCT0+ICgkaXNBcnRpY2xlID8gJzAnIDogJzEnKSwNCgkJCSd0aXRsZScJCT0+ICcnLA0KCQkJJ2xpc3RsaW1pdCcJPT4gJycsDQoJCQkna2VlcCcJCT0+ICdsYXJnZXN0JywNCgkJCSdjdXRvZmYnCT0+ICdjaHVuaycsDQoJCQkndGV4dHRyYW5zZm9ybScJPT4gJ25vbmUnLA0KCQkJJ2xpbmtwYXRoJwk9PiAnJywNCgkJCSdsaW5rcGF0aHRhaWwnCT0+ICcnLA0KCQkJJ2ZpbHRlcnNlYXJjaCcJPT4gJzEnLA0KCQkJJ2V4Y2x1ZGVzZWN0aW9uJz0+ICcnLA0KCQkJJ2FjdGl2ZWNsYXNzJwk9PiAndGFnQWN0aXZlJw0KCQkpLCRhdHRzLCAwKTsNCn0NCg0KDQpmdW5jdGlvbiB0cnVfdGFnc19jbG91ZF9xdWVyeSgkYXR0cykgew0KCWV4dHJhY3QoJGF0dHMpOw0KDQoJJHNlY3Rpb25fY2xhdXNlID0gJyc7DQoJaWYgKCRzZWN0aW9uIDw+ICcnKSB7DQoJCSRrZXlzID0gc3BsaXQoJywnLCAkc2VjdGlvbik7DQoJCWZvcmVhY2ggKCRrZXlzIGFzICRrZXkpIHsNCgkJCSRrZXlwYXJ0c1tdID0gIiBTZWN0aW9uID0gJyIgLiB0cmltKCRrZXkpIC4gIiciOw0KCQl9DQoJCSRzZWN0aW9uX2NsYXVzZSA9ICIgQU5EICgiIC4gam9pbignIG9yICcsICRrZXlwYXJ0cykgLiAiKSI7DQoJfQ0KDQoJJHRhZ3NfZmllbGQgPSBUUlVfVEFHU19GSUVMRDsNCglpbmNsdWRlX29uY2UgdHhwYXRoLicvcHVibGlzaC9zZWFyY2gucGhwJzsNCg0KCSRmaWx0ZXIgPSB0cnVfdGFnc19maWx0ZXJfc2VjdGlvbnMoJGV4Y2x1ZGVzZWN0aW9uKTsNCgkkZmlsdGVyIC49ICgkZmlsdGVyc2VhcmNoID8gZmlsdGVyU2VhcmNoKCkgOiAnJyk7DQoNCgkkYWxsX3RhZ3MgPSBhcnJheSgpOw0KCSRycyA9IHNhZmVfcm93cygiJHRhZ3NfZmllbGQiLCAidGV4dHBhdHRlcm4iLCAiJHRhZ3NfZmllbGQgPD4gJyciIC4gJHNlY3Rpb25fY2xhdXNlIC4gJGZpbHRlciAuICIgYW5kIFN0YXR1cyA+PSAnNCcgYW5kIFBvc3RlZCA8IG5vdygpIik7DQoJZm9yZWFjaCAoJHJzIGFzICRyb3cpIHsNCgkJJHRlbXBfYXJyYXkgPSBhcnJheSgpOw0KCQlpZiAoYXJyYXlfa2V5X2V4aXN0cygkdGFnc19maWVsZCwgJHJvdykpIHsNCgkJCSR0ZW1wX2FycmF5ID0gZXhwbG9kZSgiLCIsIHRyaW0odHJ1X3RhZ3Nfc3RydG9sb3dlcigkcm93WyR0YWdzX2ZpZWxkXSkpKTsNCgkJfQ0KCQkkYWxsX3RhZ3MgPSBhcnJheV9tZXJnZSgkYWxsX3RhZ3MsIHRydV90YWdzX3RyaW1fdGFncygkdGVtcF9hcnJheSkpOw0KCX0NCg0KCXJldHVybiAkYWxsX3RhZ3M7DQp9DQoNCg0KZnVuY3Rpb24gdHJ1X3RhZ3NfZmlsdGVyX3NlY3Rpb25zKCRleGNsdWRlc2VjdGlvbikgew0KCSRzZWN0aW9ucyA9IGV4cGxvZGUoJywnLCAkZXhjbHVkZXNlY3Rpb24pOw0KCSRmaWx0ZXJzID0gYXJyYXkoKTsNCglmb3JlYWNoICgkc2VjdGlvbnMgYXMgJHNlY3Rpb24pIHsNCgkJJGZpbHRlcnNbXSA9ICJhbmQgU2VjdGlvbiAhPSAnIi5kb1NsYXNoKCRzZWN0aW9uKS4iJyI7DQoJfQ0KCXJldHVybiBqb2luKCcgJywgJGZpbHRlcnMpOw0KfQ0KDQoNCmZ1bmN0aW9uIHRydV90YWdzX3JlbmRlcl9jbG91ZCgkYXR0cywgJGFsbF90YWdzLCAkYWxsX3RhZ3NfZm9yX3dlaWdodCkgew0KCWdsb2JhbCAkdHJ1X3RhZ3NfcHJlZnM7DQoJZXh0cmFjdCgkYXR0cyk7DQoNCgkkdGFnc193ZWlnaHQgPSBhcnJheV9jb3VudF92YWx1ZXMoJGFsbF90YWdzX2Zvcl93ZWlnaHQpOw0KDQoJZm9yZWFjaCAoJHRhZ3Nfd2VpZ2h0IGFzICR0YWcgPT4gJHdlaWdodCkgew0KCQlpZiAoIWluX2FycmF5KCR0YWcsICRhbGxfdGFncykNCgkJICAgfHwgJHRhZ3Nfd2VpZ2h0WyR0YWddIDwgJG1pbnRhZ2NvdW50DQoJCSAgIHx8ICR0YWdzX3dlaWdodFskdGFnXSA+ICRtYXh0YWdjb3VudCkgew0KCQkJdW5zZXQoJHRhZ3Nfd2VpZ2h0WyR0YWddKTsNCgkJfQ0KCX0NCg0KCSRzb3J0X2J5X2NvdW50ID0gKHN0cnBvcygkc29ydCwgJ2NvdW50JykgIT09IGZhbHNlKTsNCgkkc29ydF9hc2NlbmRpbmcgPSAoc3RycG9zKCRzb3J0LCAnYXNjJykgIT09IGZhbHNlKTsNCgkkdGFnc193ZWlnaHQgPSB0cnVfdGFnc19zb3J0X3RhZ3MoJHRhZ3Nfd2VpZ2h0LCAkc29ydF9ieV9jb3VudCwgJHNvcnRfYXNjZW5kaW5nKTsNCg0KCWlmICgkbGlzdGxpbWl0ID4gMCAmJiAkbGlzdGxpbWl0IDwgY291bnQoJHRhZ3Nfd2VpZ2h0KSkgew0KCQkkcmVzb3J0ZWRfdGFncyA9IGFycmF5KCk7DQoJCWlmICgka2VlcCA9PSAnbGFyZ2VzdCcpIHsNCgkJCSRyZXNvcnRlZF90YWdzID0gYXJyYXlfa2V5cyh0cnVfdGFnc19zb3J0X3RhZ3MoJHRhZ3Nfd2VpZ2h0LCB0cnVlLCBmYWxzZSkpOw0KCQl9IGVsc2Ugew0KCQkJaWYgKCRrZWVwID09ICdyYW5kb20nKSB7DQoJCQkJZm9yZWFjaCAoJHRhZ3Nfd2VpZ2h0IGFzICR0YWcgPT4gJHdlaWdodCkgew0KCQkJCQkkcmVzb3J0ZWRfdGFnc1skdGFnXSA9IHJhbmQoMCwgJHdlaWdodCk7DQoJCQkJfQ0KCQkJCSRyZXNvcnRlZF90YWdzID0gYXJyYXlfa2V5cyh0cnVfdGFnc19zb3J0X3RhZ3MoJHJlc29ydGVkX3RhZ3MsIHRydWUsIGZhbHNlKSk7DQoJCQl9IGVsc2UgaWYgKCRrZWVwID09ICdhbHBoYScpIHsNCgkJCQkkcmVzb3J0ZWRfdGFncyA9IGFycmF5X2tleXMoJHRhZ3Nfd2VpZ2h0KTsNCgkJCQluYXRjYXNlc29ydCgkcmVzb3J0ZWRfdGFncyk7DQoJCQl9DQoJCQkkY3V0b2ZmID0gJ2V4YWN0JzsNCgkJfQ0KDQoJCSRsYXN0X2dvb2RfaW5kZXggPSAkbGlzdGxpbWl0IC0gMTsNCgkJaWYgKCRjdXRvZmYgPT0gJ2NodW5rJykgeyAvL2FsdGVybmF0aXZlIGlzICdleGFjdCcNCgkJCSRsYXN0X3dlaWdodCA9IC0xOw0KCQkJZm9yICgkaSA9IDA7ICRpIDwgJGxpc3RsaW1pdCArIDE7ICRpKyspIHsNCgkJCQkkbmV3X3dlaWdodCA9ICR0YWdzX3dlaWdodFskcmVzb3J0ZWRfdGFnc1skaV1dOw0KCQkJCWlmICgkbmV3X3dlaWdodCAhPSAkbGFzdF93ZWlnaHQpIHsNCgkJCQkJJGxhc3RfZ29vZF9pbmRleCA9ICRpIC0gMTsNCgkJCQkJJGxhc3Rfd2VpZ2h0ID0gJG5ld193ZWlnaHQ7DQoJCQkJfQ0KCQkJfQ0KCQkJaWYgKCRsYXN0X2dvb2RfaW5kZXggPCAwKSB7DQoJCQkJJGxhc3RfZ29vZF9pbmRleCA9ICRsaXN0bGltaXQgLSAxOw0KCQkJfQ0KCQl9DQoNCgkJJHJlc29ydGVkX3RhZ3MgPSBhcnJheV9jaHVuaygkcmVzb3J0ZWRfdGFncywgJGxhc3RfZ29vZF9pbmRleCArIDEpOw0KCQkkcmVzb3J0ZWRfdGFncyA9ICRyZXNvcnRlZF90YWdzWzBdOw0KDQoJCWZvcmVhY2ggKCR0YWdzX3dlaWdodCBhcyAkdGFnID0+ICR3ZWlnaHQpIHsNCgkJCWlmICghaW5fYXJyYXkoJHRhZywgJHJlc29ydGVkX3RhZ3MpKSB7DQoJCQkJdW5zZXQoJHRhZ3Nfd2VpZ2h0WyR0YWddKTsNCgkJCX0NCgkJfQ0KCX0NCg0KCWlmICgkZ2VuZXJhdGVsaW5rcykgew0KCQlpZiAoJGxpbmtwYXRoKSB7DQoJCQkkdXJscHJlZml4ID0gJGxpbmtwYXRoOw0KCQkJJHVybHN1ZmZpeCA9ICRsaW5rcGF0aHRhaWw7DQoJCX0gZWxzZSB7DQoJCQlpZiAoJHRydV90YWdzX3ByZWZzW0NMRUFOX1VSTFNdLT52YWx1ZSkgew0KCQkJCSR1cmxwcmVmaXggPSBodSAuICR0cnVfdGFnc19wcmVmc1tUQUdfU0VDVElPTl0tPnZhbHVlIC4gJy8nOw0KCQkJfSBlbHNlIHsNCgkJCQkkdXJscHJlZml4ID0gaHUgLiAnP3M9JyAuICR0cnVfdGFnc19wcmVmc1tUQUdfU0VDVElPTl0tPnZhbHVlIC4gJyZhbXA7dD0nOw0KCQkJfQ0KCQkJJHVybHN1ZmZpeCA9ICgkdHJ1X3RhZ3NfcHJlZnNbQ0xFQU5fVVJMU10tPnZhbHVlID8gJy8nIDogJycpOw0KCQl9DQoNCgkJaWYgKCR1c2VyZWx0YWcpIHsNCgkJCWlmICgkdXNlbm9mb2xsb3cpIHsNCgkJCQkkdXJsc3VmZml4IC49ICciIHJlbD0idGFnIG5vZm9sbG93JzsNCgkJCX0gZWxzZSB7DQoJCQkJJHVybHN1ZmZpeCAuPSAnIiByZWw9InRhZyc7DQoJCQl9DQoJCX0gZWxzZSBpZiAoJHVzZW5vZm9sbG93KSB7DQoJCQkkdXJsc3VmZml4IC49ICciIHJlbD0ibm9mb2xsb3cnOw0KCQl9DQoJfQ0KDQoJaWYgKGNvdW50KCR0YWdzX3dlaWdodCkgPiAwKSB7DQoJCSRtYXggPSBtYXgoJHRhZ3Nfd2VpZ2h0KTsNCgkJJG1pbiA9IG1pbigkdGFnc193ZWlnaHQpOw0KCX0gZWxzZSB7DQoJCSRtYXggPSAkbWluID0gMDsNCgl9DQoJJHN0ZXB2YWx1ZSA9ICgkbWF4ID09ICRtaW4pID8gMCA6ICgkbWF4cGVyY2VudCAtICRtaW5wZXJjZW50KSAvICgkbWF4IC0gJG1pbik7DQoNCgkkdGFnc19odG1sID0gYXJyYXkoKTsNCgkkdGFnX3NlYXJjaF90YWcgPSB0cnVfdGFnc190YWdfcGFyYW1ldGVyKGFycmF5KCdzdHJpcGh5cGhlbnMnID0+ICcxJykpOw0KCSR0YWdfc2VhcmNoX3RhZyA9IGZ1bmN0aW9uX2V4aXN0cygiaHRtbHNwZWNpYWxjaGFyc19kZWNvZGUiKSA/IGh0bWxzcGVjaWFsY2hhcnNfZGVjb2RlKCR0YWdfc2VhcmNoX3RhZykgOiBodG1sX2VudGl0eV9kZWNvZGUoJHRhZ19zZWFyY2hfdGFnKTsNCglmb3JlYWNoICgkdGFnc193ZWlnaHQgYXMgJHRhZyA9PiAkd2VpZ2h0KSB7DQoJCSR0YWdfd2VpZ2h0ID0gZmxvb3IoJG1pbnBlcmNlbnQgKyAoJHdlaWdodCAtICRtaW4pICogJHN0ZXB2YWx1ZSk7DQoNCgkJJHN0eWxlID0gJyc7DQoJCWlmICgkc2V0c2l6ZXMpDQoJCQkkc3R5bGUgPSAnIHN0eWxlPSJmb250LXNpemU6ICcgLiAkdGFnX3dlaWdodCAuICclOyInOw0KDQoJCSR0YWdfY2xhc3MgPSAnJzsNCgkJaWYgKCRzZXRjbGFzc2VzKSB7DQoJCQkkdGFnX2NsYXNzID0gJyBjbGFzcz0iJzsNCgkJCWlmICgkd2VpZ2h0ID09ICRtaW4pIHsNCgkJCQkkdGFnX2NsYXNzIC49ICJ0YWdTaXplU21hbGxlc3QiOw0KCQkJfSBlbHNlIGlmICgkd2VpZ2h0ID09ICRtYXgpIHsNCgkJCQkkdGFnX2NsYXNzIC49ICJ0YWdTaXplTGFyZ2VzdCI7DQoJCQl9IGVsc2Ugew0KCQkJCSR0YWdfY2xhc3MgLj0gInRhZ1NpemVNZWRpdW0iOw0KCQkJfQ0KCQkJJHRhZ19jbGFzcyAuPSAnIHRhZ1NpemUnIC4gKCR3ZWlnaHQgKyAxIC0gJG1pbik7DQoJCQlpZiAoJHRhZyA9PSAkdGFnX3NlYXJjaF90YWcpIHsNCgkJCQkkdGFnX2NsYXNzIC49ICcgJyAuICRhY3RpdmVjbGFzczsNCgkJCX0NCgkJCSR0YWdfY2xhc3MgLj0gJyInOw0KCQl9DQoNCgkJLy9hZGFwdGVkIGZyb20gY29kZSBieSBnZHRyb2lhbm8sIHNlZSBodHRwOi8vZm9ydW0udGV4dHBhdHRlcm4uY29tL3ZpZXd0b3BpYy5waHA/cGlkPTEwMjg3NSNwMTAyODc1DQoJCSR0aXRsZWNvdW50ID0gJyc7DQoJCWlmICgkdGl0bGUpDQoJCQkkdGl0bGVjb3VudCA9ICcgdGl0bGU9IicgLiAkdGl0bGUgLiAnIic7DQoJCSRkaXNwbGF5Y291bnQ9ICcnOw0KCQkkY291bnQgPSAkY291bnR3cmFwY2hhcnN7MH0gLiAkd2VpZ2h0IC4gJGNvdW50d3JhcGNoYXJzezF9Ow0KCQlpZiAoJHNob3djb3VudHMgPT0gJ3RpdGxlJyB8fCAkc2hvd2NvdW50cyA9PSAnYm90aCcpDQoJCQkkdGl0bGVjb3VudCA9ICcgdGl0bGU9IicgLiAkdGl0bGUgLiAkY291bnQgLiAnIic7DQoJCWlmICgkc2hvd2NvdW50cyAmJiAkc2hvd2NvdW50cyAhPSAndGl0bGUnKQ0KCQkJJGRpc3BsYXljb3VudCA9ICcgJyAuICRjb3VudDsNCg0KCQlpZiAoJHRleHR0cmFuc2Zvcm0gPT0gJ2NhcGl0YWxpemUnKSB7DQoJCQkkdGFnID0gdWN3b3JkcygkdGFnKTsNCgkJfSBlbHNlIGlmICgkdGV4dHRyYW5zZm9ybSA9PSAndXBwZXJjYXNlJykgew0KCQkJJHRhZyA9IHN0cnRvdXBwZXIoJHRhZyk7DQoJCX0gZWxzZSBpZiAoJHRleHR0cmFuc2Zvcm0gPT0gJ2xvd2VyY2FzZScpIHsNCgkJCSR0YWcgPSBzdHJ0b2xvd2VyKCR0YWcpOw0KCQl9IGVsc2UgaWYgKCR0ZXh0dHJhbnNmb3JtID09ICdjYXBmaXJzdCcpIHsNCgkJCSR0YWcgPSB1Y2ZpcnN0KCR0YWcpOw0KCQl9DQoNCgkJaWYgKCRnZW5lcmF0ZWxpbmtzKSB7DQoJCQkkd2hvbGV1cmwgPSAnIicgLiAkdXJscHJlZml4IC4gdXJsZW5jb2RlKHN0cl9yZXBsYWNlKCcgJywgJy0nLCAkdGFnKSkgLiAkdXJsc3VmZml4IC4gJyInOw0KCQkJJHRhZ3NfaHRtbFtdID0gJzxhIGhyZWY9JyAuICR3aG9sZXVybCAuICR0YWdfY2xhc3MgLiAkc3R5bGUgLiAkdGl0bGVjb3VudCAuICc+JyAuIGh0bWxzcGVjaWFsY2hhcnMoJHRhZykgLiAnPC9hPicgLiAkZGlzcGxheWNvdW50Ow0KCQl9IGVsc2UgaWYgKCR0YWdfY2xhc3MgfHwgJHN0eWxlIHx8ICR0aXRsZWNvdW50KSB7DQoJCQkkdGFnc19odG1sW10gPSAnPHNwYW4nIC4gJHRhZ19jbGFzcyAuICRzdHlsZSAuICR0aXRsZWNvdW50IC4gJz4nIC4gaHRtbHNwZWNpYWxjaGFycygkdGFnKSAuICc8L3NwYW4+JyAuICRkaXNwbGF5Y291bnQ7DQoJCX0gZWxzZSB7DQoJCQkkdGFnc19odG1sW10gPSBodG1sc3BlY2lhbGNoYXJzKCR0YWcpIC4gJGRpc3BsYXljb3VudDsNCgkJfQ0KCX0NCglyZXR1cm4gdHJ1X3RhZ3NfZG9fd3JhcCgkdGFnc19odG1sLCAkd3JhcHRhZywgJGJyZWFrLCAkY2xhc3MsICRicmVha2NsYXNzKTsNCn0NCg0KDQojIyMgQ0xFQU4gVVJMIEZVTkNUSU9OUyAjIyMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQppZiAoJHRydV90YWdzX3ByZWZzW0NMRUFOX1VSTFNdLT52YWx1ZSA9PSAnY2xlYW4nKSB7DQoJcmVnaXN0ZXJfY2FsbGJhY2soJ3RydV90YWdzX2NsZWFuX3VybF9oYW5kbGVyJywgJ3ByZXRleHQnKTsNCn0NCg0KZnVuY3Rpb24gdHJ1X3RhZ3NfY2xlYW5fdXJsX2hhbmRsZXIoJGV2ZW50LCAkc3RlcCkgew0KCWdsb2JhbCAkdHJ1X3RhZ3NfcHJlZnM7DQoJJHN1YnBhdGggPSBwcmVnX3JlcGxhY2UoIi9odHRwcz86XC9cLy4qKFwvLiopL1VpIiwiJDEiLGh1KTsNCgkkcmVnc2FmZXN1YnBhdGggPSBwcmVnX3F1b3RlKCRzdWJwYXRoLCAnLycpOw0KCSRyZXEgPSBwcmVnX3JlcGxhY2UoIi9eJHJlZ3NhZmVzdWJwYXRoL2kiLCcvJywkX1NFUlZFUlsnUkVRVUVTVF9VUkknXSk7DQoNCgkkcXMgPSBzdHJwb3MoJHJlcSwgJz8nKTsNCgkkcWF0dHMgPSAoJHFzID8gJyYnLnN1YnN0cigkcmVxLCAkcXMgKyAxKSA6ICcnKTsNCglpZiAoJHFzKSAkcmVxID0gc3Vic3RyKCRyZXEsIDAsICRxcyk7DQoNCgkkcGFydHMgPSBhcnJheV92YWx1ZXMoYXJyYXlfZmlsdGVyKHNwbGl0KCcvJywgJHJlcSkpKTsNCglpZiAoY291bnQoJHBhcnRzKSA9PSAyICYmICRwYXJ0c1swXSA9PSAkdHJ1X3RhZ3NfcHJlZnNbVEFHX1NFQ1RJT05dLT52YWx1ZSkgew0KCQkkdGFnID0gJHBhcnRzWzFdOw0KCQkkX1NFUlZFUlsnUVVFUllfU1RSSU5HJ10gPSAkdHJ1X3RhZ3NfcHJlZnNbUEFSTV9OQU1FXS0+dmFsdWUgLiAnPScgLiAkdGFnIC4gJHFhdHRzOw0KCQkkX1NFUlZFUlsnUkVRVUVTVF9VUkknXSA9ICRzdWJwYXRoIC4gJHRydV90YWdzX3ByZWZzW1RBR19TRUNUSU9OXS0+dmFsdWUgLiAnLz8nIC4gJF9TRVJWRVJbJ1FVRVJZX1NUUklORyddOw0KCQlpZiAoY291bnQoJF9QT1NUKSA+IDApIHsNCgkJCSRfUE9TVFsnc2VjdGlvbiddID0gJHRydV90YWdzX3ByZWZzW1RBR19TRUNUSU9OXS0+dmFsdWU7DQoJCQkkX1BPU1RbJHRydV90YWdzX3ByZWZzW1BBUk1fTkFNRV0tPnZhbHVlXSA9ICR0YWc7DQoJCX0gZWxzZSB7DQoJCQkkX0dFVFsnc2VjdGlvbiddID0gJHRydV90YWdzX3ByZWZzW1RBR19TRUNUSU9OXS0+dmFsdWU7DQoJCQkkX0dFVFskdHJ1X3RhZ3NfcHJlZnNbUEFSTV9OQU1FXS0+dmFsdWVdID0gJHRhZzsNCgkJfQ0KCX0NCn0NCg0KDQojIyMgQURNSU4gU0lERSBGVU5DVElPTlMgIyMjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoNCmlmIChAdHhwaW50ZXJmYWNlID09ICdhZG1pbicpIHsNCglhZGRfcHJpdnMoJ3RydV90YWdzJywgJzEsMicpOw0KCXJlZ2lzdGVyX3RhYignZXh0ZW5zaW9ucycsICd0cnVfdGFncycsICd0cnVfdGFncycpOw0KCXJlZ2lzdGVyX2NhbGxiYWNrKCd0cnVfdGFnc19hZG1pbl90YWInLCAndHJ1X3RhZ3MnKTsNCg0KCWlmICgkdHJ1X3RhZ3NfcHJlZnNbVEFHU19JTl9XUklURV9UQUJdLT52YWx1ZSkgew0KCQlyZWdpc3Rlcl9jYWxsYmFjaygndHJ1X3RhZ3NfYWRtaW5fd3JpdGVfdGFiX2hhbmRsZXInLCAnYXJ0aWNsZScpOw0KCX0NCn0NCg0KDQpmdW5jdGlvbiB0cnVfdGFnc19hZG1pbl90YWIoJGV2ZW50LCAkc3RlcCkgew0KCXJlcXVpcmVfcHJpdnMoJ3RydV90YWdzJyk7DQoNCgkkcmVzdWx0cyA9IHRydV90YWdzX2FkbWluX3RhYl9oYW5kbGVfaW5wdXQoKTsNCg0KCSRhdHRzID0gdHJ1X3RhZ3NfZ2V0X3N0YW5kYXJkX2Nsb3VkX2F0dHMoYXJyYXkoKSwgZmFsc2UsIGZhbHNlKTsNCgkkYWxsX3RhZ3MgPSB0cnVfdGFnc19jbG91ZF9xdWVyeSgkYXR0cyk7DQoJJGNsb3VkID0gdHJ1X3RhZ3NfcmVuZGVyX2Nsb3VkKCRhdHRzLCAkYWxsX3RhZ3MsICRhbGxfdGFncyk7DQoNCgkkcmVkaXJlY3RzID0gdHJ1X3RhZ3NfbG9hZF9yZWRpcmVjdHMoKTsNCg0KCXRydV90YWdzX2FkbWluX3RhYl9yZW5kZXJfcGFnZSgkcmVzdWx0cywgJGNsb3VkLCAkcmVkaXJlY3RzKTsNCn0NCg0KDQpmdW5jdGlvbiB0cnVfdGFnc19hZG1pbl90YWJfcmVuZGVyX3BhZ2UoJHJlc3VsdHMsICRjbG91ZCwgJHJlZGlyZWN0cykgew0KCWdsb2JhbCAkZXZlbnQ7DQoJcGFnZXRvcCgndHJ1X3RhZ3MnLCAnJyk7DQoNCglpbmNsdWRlKHR4cGF0aCAuICcvaW5jbHVkZS90eHBfcHJlZnMucGhwJyk7DQoJZ2xvYmFsICR0cnVfdGFnc19wcmVmczsNCg0KCWVjaG8gc3RhcnRUYWJsZSgnbGF5b3V0JywgJycsICcnLCAnMTBweCcpLic8dHI+PHRkIHJvd3NwYW49IjQiIHN0eWxlPSJib3JkZXItcmlnaHQ6MnB4IHNvbGlkIGdyYXkiPicuICAjIEkga25vdywgSSBrbm93Li4uDQoJCXN0YXJ0VGFibGUoJ2xpc3QnLCAnJywgJycsICcnLCAnMzAwcHgnKS4NCgkJCXRyKGhDZWxsKGdUeHQoJ0N1cnJlbnQgdGFncycpKSkuDQoJCQl0cih0ZCgkY2xvdWQpKS4NCgkJZW5kVGFibGUoKS4NCgknPC90ZD48dGQgc3R5bGU9ImJvcmRlci1ib3R0b206MnB4IHNvbGlkIGdyYXk7d2lkdGg6NDAwcHgiPic7DQoNCgkJaWYgKCRyZXN1bHRzKSB7DQoJCQllY2hvIHN0YXJ0VGFibGUoJ2xpc3QnLCAnJywgJycsICcnLCAnMTAwJScpLg0KCQkJCXRyKGhDZWxsKGdUeHQoJ1Jlc3VsdHMnKSkpLg0KCQkJCXRyKHRkYSgkcmVzdWx0cyksICcgc3R5bGU9ImNvbG9yOnJlZCInKS4NCgkJCWVuZFRhYmxlKCk7DQoJCQllY2hvICc8L3RkPjwvdHI+PHRyPjx0ZCBzdHlsZT0iYm9yZGVyLWJvdHRvbToycHggc29saWQgZ3JheSI+JzsNCgkJfQ0KDQoNCgkJZWNobyBzdGFydFRhYmxlKCdsaXN0JywgJycsICcnLCAnJywgJzEwMCUnKS4NCgkJCXRyKHRhZyhnVHh0KCdBcnRpY2xlIFRhZyBNYWludGVuYW5jZScpLicgKCcuZ1R4dCgnQ2FzZSBTZW5zaXRpdmUnKS4nISknLCAndGgnLCAnIGNvbHNwYW49IjUiJykpLg0KCQkJdHIoDQoJCQkJZm9ybSgNCgkJCQkJdGRhKGdUeHQoJ1JlbmFtZScpLic6ICcsICcgc3R5bGU9InZlcnRpY2FsLWFsaWduOm1pZGRsZSInKS4NCgkJCQkJdGQodGV4dF9pbnB1dCgnbWF0Y2h0YWcnLCAnJywgJzE1JykpLg0KCQkJCQl0ZGEoZ1R4dCgndG8nKS4nOicsICcgc3R5bGU9InZlcnRpY2FsLWFsaWduOm1pZGRsZSInKS4NCgkJCQkJdGQodGV4dF9pbnB1dCgncmVwbGFjZXRhZycsICcnLCAnMTUnKSkuDQoJCQkJCXRkKGZJbnB1dCgnc3VibWl0JywgJ3JlcGxhY2UnLCBnVHh0KCdSdW4nKSwgJ3B1Ymxpc2gnKS5lSW5wdXQoJ3RydV90YWdzJykpLA0KCQkJCQknJywgJyB2ZXJpZnkoXCcnIC4gZ1R4dCgnYXJlX3lvdV9zdXJlJykgLiAnXCcpIicNCgkJCQkpDQoJCQkpLg0KCQkJdHIoDQoJCQkJZm9ybSgNCgkJCQkJdGRhKGdUeHQoJ0RlbGV0ZScpLic6ICcsICcgc3R5bGU9InZlcnRpY2FsLWFsaWduOm1pZGRsZSInKS4NCgkJCQkJdGQodGV4dF9pbnB1dCgnZGVsZXRldGFnJywgJycsICcxNScpKS4NCgkJCQkJdGRjcygnJywgMikuDQoJCQkJCXRkKGZJbnB1dCgnc3VibWl0JywgJ2RlbGV0ZScsIGdUeHQoJ1J1bicpLCAncHVibGlzaCcpLmVJbnB1dCgndHJ1X3RhZ3MnKSksDQoJCQkJCScnLCAnIHZlcmlmeShcJycgLiBnVHh0KCdhcmVfeW91X3N1cmUnKSAuICdcJykiJw0KCQkJCSkNCgkJCSkuDQoJCWVuZFRhYmxlKCk7DQoNCgllY2hvICc8L3RkPjwvdHI+PHRyPjx0ZCBzdHlsZT0iYm9yZGVyLWJvdHRvbToycHggc29saWQgZ3JheSI+JzsNCg0KCQllY2hvIHN0YXJ0VGFibGUoJ2xpc3QnLCAnJywgJycsICcnLCAnMTAwJScpLg0KCQkJdHIodGFnKGdUeHQoJ1JlZGlyZWN0aW9ucycpLCAndGgnLCAnIGNvbHNwYW49IjQiJykpOw0KCQkJZm9yZWFjaCAoJHJlZGlyZWN0cyBhcyAkbGVmdHRhZyA9PiAkcmlnaHR0YWcpIHsNCgkJCQllY2hvIHRyKA0KCQkJCQl0ZGEoaHJlZigkbGVmdHRhZywgdHJ1X3RhZ3NfbGlua2lmeV90YWcoJGxlZnR0YWcpKSwgJyBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyIicpLg0KCQkJCQl0ZGEoaHRtbHNwZWNpYWxjaGFycygnPT4nKSwgJyBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyIicpLg0KCQkJCQl0ZGEoaHJlZigkcmlnaHR0YWcsIHRydV90YWdzX2xpbmtpZnlfdGFnKCRyaWdodHRhZykpLCAnIHN0eWxlPSJ0ZXh0LWFsaWduOiBjZW50ZXIiJykuDQoJCQkJCXRkKCc8YSBocmVmPSJpbmRleC5waHA/ZXZlbnQ9dHJ1X3RhZ3MmYW1wO2RlbGV0ZV9yZWRpcmVjdD0nLnVybGVuY29kZSgkbGVmdHRhZykuJyIgIG9uY2xpY2s9InJldHVybiB2ZXJpZnkoXCcnLmdUeHQoJ2FyZV95b3Vfc3VyZScpLidcJykiPkRlbGV0ZTwvYT4nKQ0KCQkJCSk7DQoJCQl9DQoJCQllY2hvIHRyKA0KCQkJCSc8Zm9ybSBuYW1lPSJyZWRpcmVjdCIgaWQ9InJlZGlyZWN0IiBtZXRob2Q9InBvc3QiIGFjdGlvbj0iaW5kZXgucGhwP2V2ZW50PXRydV90YWdzIiBvbnN1Ym1pdD0icmV0dXJuIHZlcmlmeShcJycuZ1R4dCgnYXJlX3lvdV9zdXJlJykuJ1wnKSI+Jy4NCgkJCQkJdGRhKHRleHRfaW5wdXQoJ2xlZnR0YWcnLCAnJywgJzE1JyksICcgc3R5bGU9InRleHQtYWxpZ246Y2VudGVyIicpLg0KCQkJCQl0ZGEoaHRtbHNwZWNpYWxjaGFycygnPT4nKSwgJyBzdHlsZT0idmVydGljYWwtYWxpZ246bWlkZGxlO3RleHQtYWxpZ246Y2VudGVyIicpLg0KCQkJCQl0ZGEodGV4dF9pbnB1dCgncmlnaHR0YWcnLCAnJywgJzE1JyksICcgc3R5bGU9InRleHQtYWxpZ246Y2VudGVyIicpLg0KCQkJCQl0ZGEoJzxhIGhyZWY9IiMiIG9uY2xpY2s9ImlmICh2ZXJpZnkoXCcnLmdUeHQoJ2FyZV95b3Vfc3VyZScpLidcJykpIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwncmVkaXJlY3RcJykuc3VibWl0KCk7IHJldHVybiBmYWxzZTsiPkFkZCBuZXc8L2E+JywgJyBzdHlsZT0idmVydGljYWwtYWxpZ246bWlkZGxlIicpLg0KCQkJCQlmSW5wdXQoJ2hpZGRlbicsICdyZWRpcmVjdCcsICcxJykuDQoJCQkJJzwvZm9ybT4nDQoNCgkJCSkuDQoJCWVuZFRhYmxlKCk7DQoNCgllY2hvICc8L3RkPjwvdHI+PHRyPjx0ZD4nOw0KDQoJCWVjaG8gc3RhcnRUYWJsZSgnbGlzdCcpLg0KCQkJdHIodGFnKGdUeHQoJ1ByZWZlcmVuY2VzJyksICd0aCcsICcgY29sc3Bhbj0iMiInKSkuDQoJCQlmb3JtKA0KCQkJCXRyKA0KCQkJCQl0ZGEoZ1R4dCgnVXNlIGNsZWFuIFVSTHMnKS4nOiAnLCAnIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjptaWRkbGUiJykuDQoJCQkJCXRkKHJhZGlvX2xpc3QoQ0xFQU5fVVJMUywNCgkJCQkJCQlhcnJheSgnY2xlYW4nPT5nVHh0KCdjbGVhbicpLCAnbWVzc3knPT5nVHh0KCdtZXNzeScpKSwNCgkJCQkJCQkkdHJ1X3RhZ3NfcHJlZnNbQ0xFQU5fVVJMU10tPnZhbHVlKSkNCgkJCQkpLg0KCQkJCXRyKA0KCQkJCQl0ZGEoZ1R4dCgnVGFnIHNlY3Rpb24gbmFtZScpLicgKGRlZmF1bHQgaXMgIicuJHRydV90YWdzX3ByZWZzW1RBR19TRUNUSU9OXS0+ZGVmYXVsdF92YWx1ZS4nIik6ICcsICcgc3R5bGU9InZlcnRpY2FsLWFsaWduOm1pZGRsZSInKS4NCgkJCQkJdGQodGV4dF9pbnB1dChUQUdfU0VDVElPTiwgJHRydV90YWdzX3ByZWZzW1RBR19TRUNUSU9OXS0+dmFsdWUsICcxNScpKQ0KCQkJCSkuDQoJCQkJdHIoDQoJCQkJCXRkYShnVHh0KCdVUkwgcGFyYW1ldGVyIGZvciB0YWcgc2VhcmNoJykuJyAoZGVmYXVsdCBpcyAiJy4kdHJ1X3RhZ3NfcHJlZnNbUEFSTV9OQU1FXS0+ZGVmYXVsdF92YWx1ZS4nIik6ICcsICcgc3R5bGU9InZlcnRpY2FsLWFsaWduOm1pZGRsZSInKS4NCgkJCQkJdGQodGV4dF9pbnB1dChQQVJNX05BTUUsICR0cnVfdGFnc19wcmVmc1tQQVJNX05BTUVdLT52YWx1ZSwgJzE1JykpDQoJCQkJKS4NCgkJCQl0cigNCgkJCQkJdGRhKGdUeHQoJ1B1dCB0YWdzIGludG8gUlNTL0F0b20gZmVlZHMsIGluICJDYXRlZ29yeSIgZWxlbWVudHMnKS4NCgkJCQkJCSc6IDxicj4oeW91IHByb2JhYmx5IHdhbnQgdGhpcyknLCAnIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjptaWRkbGUiJykuDQoJCQkJCXRkKHllc25vUmFkaW8oVEFHU19JTl9GRUVEX0NBVEVHT1JJRVMsICR0cnVfdGFnc19wcmVmc1tUQUdTX0lOX0ZFRURfQ0FURUdPUklFU10tPnZhbHVlKSkNCgkJCQkpLg0KCQkJCXRyKA0KCQkJCQl0ZGEoJ0FwcGVuZCB0aGUgdGFnIGxpc3QgdG8gdGhlIGJvZHkgb2YgUlNTL0F0b20gZmVlZHMsICcuDQoJCQkJCQknd2l0aCBsaW5rcywgYW5kIHdpdGggcmVsPSJ0YWciOjxicj5JZiB0aGlzIGlzIHR1cm5lZCBvbiwnLg0KCQkJCQkJJ3lvdSBjYW4gZGVmaW5lIGEgIm1pc2MiIGZvcm0gbmFtZWQgdHJ1X3RhZ3NfZmVlZF90YWdzICcuDQoJCQkJCQkndGhhdCB3aWxsIGJlIHVzZWQgdG8gcmVuZGVyIHRoZSB0YWdzIGluIHRoZSBmZWVkLicsDQoJCQkJCQknIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjptaWRkbGUiJykuDQoJCQkJCXRkKHllc25vUmFkaW8oVEFHU19JTl9GRUVEX0JPRFksICR0cnVfdGFnc19wcmVmc1tUQUdTX0lOX0ZFRURfQk9EWV0tPnZhbHVlKSkNCgkJCQkpLg0KCQkJCXRyKA0KCQkJCQl0ZGEoZ1R4dCgnU2hvdyBhIGNsaWNrYWJsZSBsaXN0IG9mIHRhZ3Mgb24gdGhlICJXcml0ZSIgcGFnZScpLic6ICcsDQoJCQkJCQknIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjptaWRkbGUiJykuDQoJCQkJCXRkKHllc25vUmFkaW8oVEFHU19JTl9XUklURV9UQUIsICR0cnVfdGFnc19wcmVmc1tUQUdTX0lOX1dSSVRFX1RBQl0tPnZhbHVlKSkNCgkJCQkpLg0KCQkJCXRyKA0KCQkJCQl0ZCgnJykuDQoJCQkJCXRkYShmSW5wdXQoJ3N1Ym1pdCcsICdwcmVmcycsIGdUeHQoJ1NhdmUnKSwgJ3B1Ymxpc2gnKS5lSW5wdXQoJ3RydV90YWdzJyksICcgc3R5bGU9InRleHQtYWxpZ246cmlnaHQiJykNCgkJCQkpLA0KCQkJCScnLCAnIHZlcmlmeShcJycgLiBnVHh0KCdhcmVfeW91X3N1cmUnKSAuICdcJykiJw0KCQkJKS4NCgkJZW5kVGFibGUoKTsNCg0KCWVjaG8gJzwvdGQ+PC90cj4nLmVuZFRhYmxlKCk7DQp9DQoNCg0KZnVuY3Rpb24gdHJ1X3RhZ3NfYWRtaW5fdGFiX2hhbmRsZV9pbnB1dCgpIHsNCglpZiAoZ3BzKCdwcmVmcycpKSB7DQoJCXJldHVybiB0cnVfdGFnc19hZG1pbl91cGRhdGVfcHJlZnMoKTsNCgl9IGVsc2UgaWYgKGdwcygnZGVsZXRlJykpIHsNCgkJcmV0dXJuIHRydV90YWdzX2FkbWluX2RlbGV0ZV90YWcoZ3BzKCdkZWxldGV0YWcnKSk7DQoJfSBlbHNlIGlmIChncHMoJ3JlcGxhY2UnKSkgew0KCQkkcmVzdWx0ID0gdHJ1X3RhZ3NfYWRtaW5fcmVwbGFjZV90YWcoZ3BzKCdtYXRjaHRhZycpLCBncHMoJ3JlcGxhY2V0YWcnKSwgZmFsc2UpOw0KCQlyZXR1cm4gJHJlc3VsdCAuICc8YnI+JyAuIHRydV90YWdzX2FkbWluX3JlZGlyZWN0X3RhZyhncHMoJ21hdGNodGFnJyksIGdwcygncmVwbGFjZXRhZycpKTsNCgl9IGVsc2UgaWYgKGdwcygncmVkaXJlY3QnKSkgew0KCQlyZXR1cm4gdHJ1X3RhZ3NfYWRtaW5fcmVkaXJlY3RfdGFnKGdwcygnbGVmdHRhZycpLCBncHMoJ3JpZ2h0dGFnJykpOw0KCX0gZWxzZSBpZiAoZ3BzKCdkZWxldGVfcmVkaXJlY3QnKSkgew0KCQlyZXR1cm4gdHJ1X3RhZ3NfYWRtaW5fZGVsZXRlX3JlZGlyZWN0KGdwcygnZGVsZXRlX3JlZGlyZWN0JykpOw0KCX0gZWxzZSB7DQoJCXJldHVybiAnJzsNCgl9DQp9DQoNCg0KZnVuY3Rpb24gdHJ1X3RhZ3NfYWRtaW5fdXBkYXRlX3ByZWZzKCkgew0KCWdsb2JhbCAkdHJ1X3RhZ3NfcHJlZnM7DQoJJHJlc3VsdHMgPSBhcnJheSgpOw0KCWZvcmVhY2ggKCR0cnVfdGFnc19wcmVmcyBhcyAkcHJlZikgew0KCQkkdmFsaWRfdmFsdWUgPSAkcHJlZi0+dmFsaWRhdGVfdmFsdWUoZ3BzKCRwcmVmLT5uYW1lKSk7DQoJCWlmICgkdmFsaWRfdmFsdWUgJiYgJHZhbGlkX3ZhbHVlIDw+IGdwcygkcHJlZi0+bmFtZSkpIHsNCgkJCXJldHVybiAkdmFsaWRfdmFsdWU7ICAjIyMgdGhpcyBpcyBhIHNuZWFreSB3YXkgdG8gaGFuZGxlIHZhbGlkYXRpb24gLSBzb3JyeSA7KQ0KCQl9DQoJCWlmICgkdmFsaWRfdmFsdWUgPD4gJHByZWYtPnZhbHVlKSB7DQoJCQlpZiAoJHZhbGlkX3ZhbHVlID09ICRwcmVmLT5kZWZhdWx0X3ZhbHVlKSB7DQoJCQkJJHJlc3VsdCA9IHRydV90YWdzX2RlbGV0ZV9wcmVmKCRwcmVmLT5uYW1lKTsNCgkJCX0gZWxzZSB7DQoJCQkJJHJlc3VsdCA9IHRydV90YWdzX3Vwc2VydF9wcmVmKCRwcmVmLT5uYW1lLCAkdmFsaWRfdmFsdWUpOw0KCQkJfQ0KCQkJaWYgKCRyZXN1bHQpIHsNCgkJCQkkcmVzdWx0c1tdID0gJ1VwZGF0ZWQgJyAuICRwcmVmLT5uYW1lOw0KCQkJCSRwcmVmLT52YWx1ZSA9ICR2YWxpZF92YWx1ZTsNCgkJCX0gZWxzZSB7DQoJCQkJJHJlc3VsdHNbXSA9ICdFcnJvciB1cGRhdGluZyAnIC4gJHByZWYtPm5hbWU7DQoJCQl9DQoJCX0NCgl9DQoJaWYgKGNvdW50KCRyZXN1bHRzKSA9PSAwKSB7DQoJCXJldHVybiAnTm8gcmVjb3JkcyBuZWVkIHVwZGF0aW5nJzsNCgl9IGVsc2Ugew0KCQlyZXR1cm4gam9pbignPGJyPicsICRyZXN1bHRzKTsNCgl9DQp9DQoNCg0KZnVuY3Rpb24gdHJ1X3RhZ3NfdXBzZXJ0X3ByZWYoJG5hbWUsICR2YWx1ZSkgew0KCWlmICghc2FmZV9xdWVyeSgnY3JlYXRlIHRhYmxlIGlmIG5vdCBleGlzdHMgJyAuIHNhZmVfcGZ4KCd0cnVfdGFnc19wcmVmcycpLg0KCQknIChuYW1lIHZhcmNoYXIoMjU1KSBwcmltYXJ5IGtleSwgJy4NCgkJJ3ZhbHVlIHZhcmNoYXIoMjU1KSBub3QgbnVsbCknKSkgew0KCQlyZXR1cm4gJ1NlcmlvdXMgZXJyb3IgLSB1bmFibGUgdG8gY3JlYXRlIHRoZSAnIC4gc2FmZV9wZngoJ3RydV90YWdzX3ByZWZzJykgLiAnIHRhYmxlLic7DQoJfQ0KDQoJcmV0dXJuIHNhZmVfdXBzZXJ0KCd0cnVfdGFnc19wcmVmcycsICd2YWx1ZT0iJy4kdmFsdWUuJyInLCAnbmFtZT0iJy4kbmFtZS4nIicpOw0KfQ0KDQoNCmZ1bmN0aW9uIHRydV90YWdzX2RlbGV0ZV9wcmVmKCRuYW1lKSB7DQoJaWYgKHNhZmVfZGVsZXRlKCd0cnVfdGFnc19wcmVmcycsICduYW1lPSInLiRuYW1lLiciJykpIHsNCgkJaWYgKHNhZmVfY291bnQoJ3RydV90YWdzX3ByZWZzJywgJzEnKSA9PSAwICYmICFzYWZlX3F1ZXJ5KCdkcm9wIHRhYmxlICcgLiBzYWZlX3BmeCgndHJ1X3RhZ3NfcHJlZnMnKSkpIHsNCgkJCXJldHVybiBmYWxzZTsNCgkJfQ0KCQlyZXR1cm4gdHJ1ZTsNCgl9IGVsc2Ugew0KCQlyZXR1cm4gZmFsc2U7DQoJfQ0KfQ0KDQoNCmZ1bmN0aW9uIHRydV90YWdzX2FkbWluX2RlbGV0ZV90YWcoJGRlbGV0ZXRhZykgew0KCWlmICh0cmltKCRkZWxldGV0YWcpKSB7DQoJCXJldHVybiB0cnVfdGFnc19hZG1pbl9yZXBsYWNlX3RhZygkZGVsZXRldGFnLCAnJywgdHJ1ZSk7DQoJfSBlbHNlIHsNCgkJcmV0dXJuICdQbGVhc2UgZW50ZXIgYSB2YWx1ZSc7DQoJfQ0KfQ0KDQoNCmZ1bmN0aW9uIHRydV90YWdzX2FkbWluX3JlcGxhY2VfdGFnKCRtYXRjaHRhZywgJHJlcGxhY2V0YWcsICRhbGxvd19ibGFua19yZXBsYWNldGFnKSB7DQoJJG1hdGNodGFnID0gdHJpbSgkbWF0Y2h0YWcpOw0KCSRyZXBsYWNldGFnID0gdHJpbSgkcmVwbGFjZXRhZyk7DQoJaWYgKCRtYXRjaHRhZyAmJiAoJGFsbG93X2JsYW5rX3JlcGxhY2V0YWcgfHwgJHJlcGxhY2V0YWcpKSB7DQoJCWlmIChzYWZlX3VwZGF0ZSgndGV4dHBhdHRlcm4nLCBUUlVfVEFHU19GSUVMRC4nPXRyaW0oYm90aCBcJyxcJyBmcm9tIHJlcGxhY2UoY29uY2F0KCIsIiwgJy5UUlVfVEFHU19GSUVMRC4nLCAiLCIpLCBjb25jYXQoIiwiLCBcJycuYWRkc2xhc2hlcygkbWF0Y2h0YWcpLidcJywgIiwiKSwgXCcsJy5hZGRzbGFzaGVzKCRyZXBsYWNldGFnKS4nLFwnKSknLCAnMScpKSB7DQoJCQlyZXR1cm4gJ1VwZGF0ZWQgJy5teXNxbF9hZmZlY3RlZF9yb3dzKCkuJyByb3dzICgiJy5odG1sc3BlY2lhbGNoYXJzKCRtYXRjaHRhZykuJyI9PiInLmh0bWxzcGVjaWFsY2hhcnMoJHJlcGxhY2V0YWcpLiciKSc7DQoJCX0gZWxzZSB7DQoJCQlyZXR1cm4gJ0Vycm9yOiAnIC4gbXlzcWxfZXJyb3IoKTsNCgkJfQ0KCX0gZWxzZSB7DQoJCXJldHVybiAnUGxlYXNlIGVudGVyIGEgdmFsdWUgaW4gYm90aCBmaWVsZHMnOw0KCX0NCn0NCg0KDQpmdW5jdGlvbiB0cnVfdGFnc19hZG1pbl9yZWRpcmVjdF90YWcoJGxlZnR0YWcsICRyaWdodHRhZykgew0KCSRsZWZ0dGFnID0gYWRkc2xhc2hlcyh0cnVfdGFnc19zdHJ0b2xvd2VyKHRyaW0oJGxlZnR0YWcpKSk7DQoJJHJpZ2h0dGFnID0gYWRkc2xhc2hlcyh0cnVfdGFnc19zdHJ0b2xvd2VyKHRyaW0oJHJpZ2h0dGFnKSkpOw0KCWlmICghJGxlZnR0YWcgfHwgISRyaWdodHRhZykgew0KCQlyZXR1cm4gJ1BsZWFzZSBlbnRlciBhIHZhbHVlIGluIGJvdGggZmllbGRzJzsNCgl9DQoNCglpZiAoIXNhZmVfcXVlcnkoJ2NyZWF0ZSB0YWJsZSBpZiBub3QgZXhpc3RzICcgLiBzYWZlX3BmeCgndHJ1X3RhZ3NfcmVkaXJlY3RzJykuDQoJCScgKGxlZnR0YWcgdmFyY2hhcigyNTUpIHByaW1hcnkga2V5LCAnLg0KCQkncmlnaHR0YWcgdmFyY2hhcigyNTUpIG5vdCBudWxsKScpKSB7DQoJCXJldHVybiAnU2VyaW91cyBlcnJvciAtIHVuYWJsZSB0byBjcmVhdGUgdGhlICcgLiBzYWZlX3BmeCgndHJ1X3RhZ3NfcmVkaXJlY3RzJykgLiAnIHRhYmxlLic7DQoJfQ0KDQoJaWYgKHNhZmVfaW5zZXJ0KCd0cnVfdGFnc19yZWRpcmVjdHMnLCAnbGVmdHRhZz0iJy4kbGVmdHRhZy4nIixyaWdodHRhZz0iJy4kcmlnaHR0YWcuJyInKSkgew0KCQlyZXR1cm4gJ1JlZGlyZWN0IGFkZGVkICgiJy5odG1sc3BlY2lhbGNoYXJzKCRsZWZ0dGFnKS4nIj0+IicuaHRtbHNwZWNpYWxjaGFycygkcmlnaHR0YWcpLiciKSAtIHBsZWFzZSB0ZXN0IGl0ISc7DQoJfSBlbHNlIHsNCgkJcmV0dXJuICdFcnJvciBhZGRpbmcgcmVjb3JkIC0gZG9lcyBpdCBhbHJlYWR5IGV4aXN0Pyc7DQoJfQ0KfQ0KDQoNCmZ1bmN0aW9uIHRydV90YWdzX2FkbWluX2RlbGV0ZV9yZWRpcmVjdCgkbGVmdHRhZykgew0KCWlmIChzYWZlX2RlbGV0ZSgndHJ1X3RhZ3NfcmVkaXJlY3RzJywgJ2xlZnR0YWc9IicuYWRkc2xhc2hlcygkbGVmdHRhZykuJyInKSkgew0KCQlpZiAoc2FmZV9jb3VudCgndHJ1X3RhZ3NfcmVkaXJlY3RzJywgJzEnKSA9PSAwICYmICFzYWZlX3F1ZXJ5KCdkcm9wIHRhYmxlICcgLiBzYWZlX3BmeCgndHJ1X3RhZ3NfcmVkaXJlY3RzJykpKSB7DQoJCQlyZXR1cm4gJ1JlZGlyZWN0IGRlbGV0ZWQsIGJ1dCB1bmFibGUgdG8gZHJvcCB0YWJsZSAnIC4gc2FmZV9wZngoJ3RydV90YWdzX3JlZGlyZWN0cycpOw0KCQl9DQoJCXJldHVybiAnUmVkaXJlY3QgZGVsZXRlZCAoIicuaHRtbHNwZWNpYWxjaGFycygkbGVmdHRhZykuJyIpJzsNCgl9IGVsc2Ugew0KCQlyZXR1cm4gJ0Vycm9yIGRlbGV0aW5nIHJlZGlyZWN0JzsNCgl9DQp9DQoNCg0KZnVuY3Rpb24gdHJ1X3RhZ3NfYWRtaW5fd3JpdGVfdGFiX2hhbmRsZXIoJGV2ZW50LCAkc3RlcCkgew0KCSRjbG91ZCA9IGFycmF5X3VuaXF1ZSh0cnVfdGFnc19jbG91ZF9xdWVyeSh0cnVfdGFnc19nZXRfc3RhbmRhcmRfY2xvdWRfYXR0cyhhcnJheSgpLCB0cnVlLCB0cnVlKSkpOw0KCXNvcnQoJGNsb3VkKTsNCg0KCSRpZCA9IChlbXB0eSgkR0xPQkFMU1snSUQnXSkgPyBncHMoJ0lEJykgOiAkR0xPQkFMU1snSUQnXSk7DQoJJGFydGljbGVfdGFncyA9IChlbXB0eSgkaWQpID8gYXJyYXkoKSA6IHRydV90YWdzX2dldF90YWdzX2Zvcl9hcnRpY2xlKCRpZCkpOw0KDQoJJGxpbmtzID0gYXJyYXkoKTsNCglmb3JlYWNoICgkY2xvdWQgYXMgJHRhZykgew0KCQkkc3R5bGUgPSAoaW5fYXJyYXkoJHRhZywgJGFydGljbGVfdGFncykgPyAnIGNsYXNzPSJ0YWdfY2hvc2VuIicgOiAnJyk7DQoJCSRsaW5rc1tdID0gJzxhIGhyZWY9IiNhZHZhbmNlZCInLiRzdHlsZS4nIG9uY2xpY2s9InRoaXMuc2V0QXR0cmlidXRlKFxcXCdjbGFzc1xcXCcsIHRvZ2dsZVRhZyhcXFwnJy5hZGRzbGFzaGVzKGFkZHNsYXNoZXMoJHRhZykpLidcXFwnKSk7IHJldHVybiBmYWxzZTsiPicgLiBhZGRzbGFzaGVzKGh0bWxzcGVjaWFsY2hhcnMoJHRhZykpIC4gJzxcL2E+JzsNCgl9DQoJJHRvX2luc2VydCA9IGpvaW4oJywgJywgJGxpbmtzKTsNCgkkdG9faW5zZXJ0ID0gIjxzdHlsZT5hLnRhZ19jaG9zZW57YmFja2dyb3VuZC1jb2xvcjogI0ZFQjsgY29sb3I6IGJsYWNrO308L3N0eWxlPiIgLiAkdG9faW5zZXJ0Ow0KDQoJJGpzID0gPDw8RU9GDQoJCXZhciBrZXl3b3Jkc0ZpZWxkID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2tleXdvcmRzJyk7DQoJCXZhciBwYXJlbnQgPSBrZXl3b3Jkc0ZpZWxkLnBhcmVudE5vZGU7DQoJCXBhcmVudC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdicicpKTsNCgkJdmFyIGNsb3VkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOw0KCQljbG91ZC5zZXRBdHRyaWJ1dGUoJ2NsYXNzJywgJ3RydV90YWdzX2FkbWluX3RhZ3MnKTsNCgkJY2xvdWQuaW5uZXJIVE1MID0gJ3skdG9faW5zZXJ0fSc7DQoJCXBhcmVudC5hcHBlbmRDaGlsZChjbG91ZCk7DQoNCgkJZnVuY3Rpb24gdG9nZ2xlVGFnKHRhZ05hbWUpIHsNCgkJCXZhciByZWdleFRhZyA9IHRhZ05hbWUucmVwbGFjZSgvKFtcXFxcXF5cXCQqK1tcXF0/e30uPSE6KHwpXSkvZywiXFxcXCQxIik7DQoJCQl2YXIgdGFnUmVnZXggPSBuZXcgUmVnRXhwKCIoKF58LClcXFxzKikiICsgcmVnZXhUYWcgKyAiXFxccyooLFxcXHMqfCQpIik7DQoJCQl2YXIgdGV4dGFyZWEgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgna2V5d29yZHMnKTsNCgkJCXZhciBjdXJ2YWwgPSB0ZXh0YXJlYS52YWx1ZS5yZXBsYWNlKC8sP1xzKyQvLCAnJyk7DQoJCQlpZiAoJycgPT0gY3VydmFsKSB7DQoJCQkJdGV4dGFyZWEudmFsdWUgPSB0YWdOYW1lOw0KCQkJfSBlbHNlIGlmIChjdXJ2YWwubWF0Y2godGFnUmVnZXgpKSB7DQoJCQkJdGV4dGFyZWEudmFsdWUgPSBjdXJ2YWwucmVwbGFjZSh0YWdSZWdleCwgJyQxJykucmVwbGFjZSgvLD9ccyskLywgJycpOw0KCQkJCXJldHVybiAnJzsNCgkJCX0gZWxzZSBpZiAoJywnID09IGN1cnZhbC5jaGFyQXQoY3VydmFsLmxlbmd0aCAtIDEpKSB7DQoJCQkJdGV4dGFyZWEudmFsdWUgKz0gJyAnICsgdGFnTmFtZTsNCgkJCX0gZWxzZSB7DQoJCQkJdGV4dGFyZWEudmFsdWUgKz0gJywgJyArIHRhZ05hbWU7DQoJCQl9DQoJCQlyZXR1cm4gJ3RhZ19jaG9zZW4nOw0KCQl9DQpFT0Y7DQoNCgllY2hvIHNjcmlwdF9qcygkanMpOw0KfQ0KDQoNCiMjIyBBVE9NL1JTUyBGRUVEIEZVTkNUSU9OUyAjIyMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCg0KcmVnaXN0ZXJfY2FsbGJhY2soJ3RydV90YWdzX2F0b21faGFuZGxlcicsICdhdG9tX2VudHJ5Jyk7DQpmdW5jdGlvbiB0cnVfdGFnc19hdG9tX2hhbmRsZXIoJGV2ZW50LCAkc3RlcCkgeyByZXR1cm4gdHJ1X3RhZ3NfZmVlZF9oYW5kbGVyKHRydWUpOyB9DQpyZWdpc3Rlcl9jYWxsYmFjaygndHJ1X3RhZ3NfcnNzX2hhbmRsZXInLCAncnNzX2VudHJ5Jyk7DQpmdW5jdGlvbiB0cnVfdGFnc19yc3NfaGFuZGxlcigkZXZlbnQsICRzdGVwKSB7IHJldHVybiB0cnVfdGFnc19mZWVkX2hhbmRsZXIoZmFsc2UpOyB9DQoNCmZ1bmN0aW9uIHRydV90YWdzX2ZlZWRfaGFuZGxlcigkYXRvbSkgew0KCWdsb2JhbCAkdGhpc2FydGljbGUsICR0cnVfdGFnc19wcmVmczsNCglleHRyYWN0KCR0aGlzYXJ0aWNsZSk7DQoNCgkkdGFncyA9IHRydV90YWdzX2dldF90YWdzX2Zvcl9hcnRpY2xlKCR0aGlzaWQpOw0KDQoJaWYgKCR0cnVfdGFnc19wcmVmc1tUQUdTX0lOX0ZFRURfQk9EWV0tPnZhbHVlKSB7DQoJCSRleHRyYWJvZHkgPSAnJzsNCgkJJEZPUk1fTkFNRSA9ICd0cnVfdGFnc19mZWVkX3RhZ3MnOw0KCQlpZiAoZmV0Y2goJ2Zvcm0nLCAndHhwX2Zvcm0nLCAnbmFtZScsICRGT1JNX05BTUUpKSB7DQoJCQkkZm9ybSA9IGZldGNoX2Zvcm0oJEZPUk1fTkFNRSk7DQoJCQkkZXh0cmFib2R5ID0gdHJpbShwYXJzZSgkZm9ybSkpOw0KCQl9IGVsc2Ugew0KCQkJJGF0dHMgPSB0cnVfdGFnc19nZXRfc3RhbmRhcmRfY2xvdWRfYXR0cyhhcnJheSgpLCBmYWxzZSwgdHJ1ZSk7DQoJCQkkZXh0cmFib2R5ID0gJzxwPnRhZ3M6ICcgLiB0cnVfdGFnc19yZW5kZXJfY2xvdWQoJGF0dHMsICR0YWdzLCAkdGFncykgLiAnPC9wPic7DQoJCX0NCgkJZ2xvYmFsICR0aGlzYXJ0aWNsZTsNCgkJaWYgKHRyaW0oJHRoaXNhcnRpY2xlWydleGNlcnB0J10pKSB7DQoJCQkkdGhpc2FydGljbGVbJ2V4Y2VycHQnXSA9IHRyaW0oJHRoaXNhcnRpY2xlWydleGNlcnB0J10pLm4uJGV4dHJhYm9keS5uOw0KCQl9DQoJCSR0aGlzYXJ0aWNsZVsnYm9keSddID0gdHJpbSgkdGhpc2FydGljbGVbJ2JvZHknXSkubi4kZXh0cmFib2R5Lm47DQoJfQ0KDQoJaWYgKCR0cnVfdGFnc19wcmVmc1tUQUdTX0lOX0ZFRURfQ0FURUdPUklFU10tPnZhbHVlKSB7DQoJCSRvdXRwdXQgPSBhcnJheSgpOw0KCQlmb3JlYWNoICgkdGFncyBhcyAkdGFnKSB7DQoJCQlpZiAoJGF0b20pIHsNCgkJCQkkb3V0cHV0W10gPSAnPGNhdGVnb3J5IHRlcm09IicgLiBodG1sc3BlY2lhbGNoYXJzKCR0YWcpIC4gJyIgLz4nOw0KCQkJfSBlbHNlIHsNCgkJCQkkb3V0cHV0W10gPSAnPGNhdGVnb3J5PicgLiBodG1sc3BlY2lhbGNoYXJzKCR0YWcpIC4gJzwvY2F0ZWdvcnk+JzsNCgkJCX0NCgkJfQ0KCQlyZXR1cm4gbi5qb2luKG4sICRvdXRwdXQpLm47DQoJfQ0KfQ0KDQoNCiMjIyBQUkVGUyBGVU5DVElPTlMgLyBDTEFTU0VTICMjIw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoNCmNsYXNzIHRydV90YWdzX3ByZWYgew0KCWZ1bmN0aW9uIHRydV90YWdzX3ByZWYoJG5hbWUsICRkZWZhdWx0X3ZhbHVlLCAkdHlwZSkgew0KCQkkdGhpcy0+bmFtZSA9ICRuYW1lOw0KCQkkdGhpcy0+dmFsdWUgPSAkZGVmYXVsdF92YWx1ZTsNCgkJJHRoaXMtPmRlZmF1bHRfdmFsdWUgPSAkZGVmYXVsdF92YWx1ZTsNCgkJJHRoaXMtPnR5cGUgPSAkdHlwZTsNCgl9DQoNCglmdW5jdGlvbiB2YWxpZGF0ZV92YWx1ZSgkdmFsdWUpIHsNCgkJaWYgKCR2YWx1ZSkgew0KCQkJcmV0dXJuICR2YWx1ZTsNCgkJfSBlbHNlIGlmICgkdGhpcy0+dHlwZSA9PSAnYm9vbGVhbicpIHsNCgkJCXJldHVybiAnMCc7DQoJCX0gZWxzZSB7DQoJCQlyZXR1cm4gJ1BsZWFzZSBlbnRlciBhIHZhbHVlIGZvciAnIC4gJHRoaXMtPm5hbWU7DQoJCX0NCgl9DQp9DQoNCmZ1bmN0aW9uIHRydV90YWdzX2xvYWRfcHJlZnMoKSB7DQoJJHByZWZzID0gYXJyYXkoKTsNCg0KCWdsb2JhbCAkcGVybWxpbmtfbW9kZTsNCgkkcHJlZnNbQ0xFQU5fVVJMU10gPSBuZXcgdHJ1X3RhZ3NfcHJlZihDTEVBTl9VUkxTLCAoJHBlcm1saW5rX21vZGUgIT0gJ21lc3N5JyA/ICdjbGVhbicgOiAnbWVzc3knKSwgJ3N0cmluZycpOw0KCSRwcmVmc1tUQUdfU0VDVElPTl0gPSBuZXcgdHJ1X3RhZ3NfcHJlZihUQUdfU0VDVElPTiwgJ3RhZycsICdzdHJpbmcnKTsNCgkkcHJlZnNbUEFSTV9OQU1FXSA9IG5ldyB0cnVfdGFnc19wcmVmKFBBUk1fTkFNRSwgJ3QnLCAnc3RyaW5nJyk7DQoJJHByZWZzW1RBR1NfSU5fRkVFRF9DQVRFR09SSUVTXSA9IG5ldyB0cnVfdGFnc19wcmVmKFRBR1NfSU5fRkVFRF9DQVRFR09SSUVTLCAnMScsICdib29sZWFuJyk7DQoJJHByZWZzW1RBR1NfSU5fRkVFRF9CT0RZXSA9IG5ldyB0cnVfdGFnc19wcmVmKFRBR1NfSU5fRkVFRF9CT0RZLCAnMCcsICdib29sZWFuJyk7DQoJJHByZWZzW1RBR1NfSU5fV1JJVEVfVEFCXSA9IG5ldyB0cnVfdGFnc19wcmVmKFRBR1NfSU5fV1JJVEVfVEFCLCAnMScsICdib29sZWFuJyk7DQoNCglpZiAobXlzcWxfcXVlcnkoImRlc2NyaWJlICIgLiBQRlggLiAidHJ1X3RhZ3NfcHJlZnMiKSkgew0KCQkkcnMgPSBzYWZlX3Jvd3MoJyonLCAndHJ1X3RhZ3NfcHJlZnMnLCAnMScpOw0KCQlmb3JlYWNoICgkcnMgYXMgJHJvdykgew0KCQkJJHByZWZzWyRyb3dbJ25hbWUnXV0tPnZhbHVlID0gJHJvd1sndmFsdWUnXTsNCgkJfQ0KCX0NCg0KCXJldHVybiAkcHJlZnM7DQp9DQoNCg0KIyMjIE9USEVSIFNVUFBPUlQgRlVOQ1RJT05TICMjIw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQpmdW5jdGlvbiB0cnVfdGFnc19yZWRpcmVjdF9pZl9uZWVkZWQoJHRhZ19wYXJhbWV0ZXIpIHsNCgkkcmVkaXJlY3RzID0gdHJ1X3RhZ3NfbG9hZF9yZWRpcmVjdHMoKTsNCglmb3JlYWNoICgkcmVkaXJlY3RzIGFzICRsZWZ0dGFnID0+ICRyaWdodHRhZykgew0KCQlpZiAoJGxlZnR0YWcgPT0gJHRhZ19wYXJhbWV0ZXIgfHwgJGxlZnR0YWcgPT0gc3RyX3JlcGxhY2UoJy0nLCAnICcsICR0YWdfcGFyYW1ldGVyKSkgew0KCQkJdHJ1X3RhZ3NfcmVkaXJlY3QoJHJpZ2h0dGFnLCBmYWxzZSk7DQoJCQlyZXR1cm4gdHJ1ZTsNCgkJfQ0KCX0NCg0KCXJldHVybiBmYWxzZTsNCn0NCg0KDQpmdW5jdGlvbiB0cnVfdGFnc19sb2FkX3JlZGlyZWN0cygpIHsNCgkkcmVkaXJlY3RzID0gYXJyYXkoKTsNCglpZiAobXlzcWxfcXVlcnkoImRlc2NyaWJlICIgLiBQRlggLiAidHJ1X3RhZ3NfcmVkaXJlY3RzIikpIHsNCgkJJHJzID0gc2FmZV9yb3dzKCcqJywgJ3RydV90YWdzX3JlZGlyZWN0cycsICcxIG9yZGVyIGJ5IGxlZnR0YWcnKTsNCgkJZm9yZWFjaCAoJHJzIGFzICRyb3cpIHsNCgkJCSRyZWRpcmVjdHNbJHJvd1snbGVmdHRhZyddXSA9ICRyb3dbJ3JpZ2h0dGFnJ107DQoJCX0NCgl9DQoJcmV0dXJuICRyZWRpcmVjdHM7DQp9DQoNCg0KZnVuY3Rpb24gdHJ1X3RhZ3NfcmVkaXJlY3QoJGRlc3RpbmF0aW9uLCAkaXNfZnVsbF91cmwpIHsNCglnbG9iYWwgJHRydV90YWdzX3ByZWZzOw0KCWlmICgkaXNfZnVsbF91cmwpIHsNCgkJJHVybCA9ICRkZXN0aW5hdGlvbjsNCgkJJG1lc3NhZ2UgPSAnVGhlIHJlc291cmNlIHlvdSByZXF1ZXN0ZWQgaGFzIG1vdmVkIHRvICcgLiAkZGVzdGluYXRpb247DQoJfSBlbHNlIHsNCgkJJHVybCA9IHRydV90YWdzX2xpbmtpZnlfdGFnKCRkZXN0aW5hdGlvbik7DQoJCSRtZXNzYWdlID0gJ1RoZSByZXF1ZXN0ZWQgdGFnIGhhcyBiZWVuIHJlcGxhY2VkIGJ5ICcgLiAkZGVzdGluYXRpb247DQoJfQ0KDQoJaGVhZGVyKCdMb2NhdGlvbjogJyAuICR1cmwpOw0KCXR4cF9kaWUoJG1lc3NhZ2UsICczMDEnKTsNCn0NCg0KDQpmdW5jdGlvbiB0cnVfdGFnc19saW5raWZ5X3RhZygkdGFnKSB7DQoJZ2xvYmFsICR0cnVfdGFnc19wcmVmczsNCglpZiAoJHRydV90YWdzX3ByZWZzW0NMRUFOX1VSTFNdLT52YWx1ZSkgew0KCQkkdXJscHJlZml4ID0gaHUgLiAkdHJ1X3RhZ3NfcHJlZnNbVEFHX1NFQ1RJT05dLT52YWx1ZSAuICcvJzsNCgl9IGVsc2Ugew0KCQkkdXJscHJlZml4ID0gaHUgLiAnP3M9JyAuICR0cnVfdGFnc19wcmVmc1tUQUdfU0VDVElPTl0tPnZhbHVlIC4gJyZhbXA7dD0nOw0KCX0NCgkkdXJsc3VmZml4ID0gKCR0cnVfdGFnc19wcmVmc1tDTEVBTl9VUkxTXS0+dmFsdWUgPyAnLycgOiAnJyk7DQoJcmV0dXJuICR1cmxwcmVmaXggLiB1cmxlbmNvZGUoc3RyX3JlcGxhY2UoJyAnLCAnLScsICR0YWcpKSAuICR1cmxzdWZmaXg7DQp9DQoNCg0KZnVuY3Rpb24gdHJ1X3RhZ3NfZ2V0X3RhZ3NfZm9yX2FydGljbGUoJGFydGljbGVJRCkgew0KCSR0YWdzX2ZpZWxkID0gVFJVX1RBR1NfRklFTEQ7DQoJJHJzID0gc2FmZV9yb3coJHRhZ3NfZmllbGQsICJ0ZXh0cGF0dGVybiIsICJJRD0nJGFydGljbGVJRCcgQU5EICR0YWdzX2ZpZWxkIDw+ICcnIik7DQoJJGFsbF90YWdzID0gYXJyYXkoKTsNCglpZiAoYXJyYXlfa2V5X2V4aXN0cygkdGFnc19maWVsZCwgJHJzKSkgew0KCQkkYWxsX3RhZ3MgPSBleHBsb2RlKCIsIiwgdHJpbSh0cnVfdGFnc19zdHJ0b2xvd2VyKCRyc1skdGFnc19maWVsZF0pKSk7DQoJfQ0KDQoJcmV0dXJuIHRydV90YWdzX3RyaW1fdGFncygkYWxsX3RhZ3MpOw0KfQ0KDQoNCiMgZml4ZXMgYnVnIHdpdGggNC4wLjQncyB2ZXJzaW9uIG9mIGRvV3JhcCB0aGF0IGNhdXNlZCBzcGFjZXMgdG8gc2hvdyB1cCBiZWZvcmUgdGhlIGNvbW1hcw0KZnVuY3Rpb24gdHJ1X3RhZ3NfZG9fd3JhcCgkbGlzdCwgJHdyYXB0YWcsICRicmVhaywgJGNsYXNzLCAkYnJlYWtjbGFzcykgew0KCWlmICghJHdyYXB0YWcgJiYgIXByZWdfbWF0Y2goJy9eXHcrJC8nLCAkYnJlYWspKSB7DQoJCXJldHVybiBqb2luKCRicmVhay5uLCAkbGlzdCk7DQoJfSBlbHNlIHsNCgkJcmV0dXJuIGRvV3JhcCgkbGlzdCwgJHdyYXB0YWcsICRicmVhaywgJGNsYXNzLCAkYnJlYWtjbGFzcyk7DQoJfQ0KfQ0KDQoNCmZ1bmN0aW9uIHRydV90YWdzX3RyaW1fdGFncygkdGFnX2FycmF5KSB7DQoJJHRyaW1tZWQgPSBhcnJheSgpOw0KCWZvcmVhY2ggKCR0YWdfYXJyYXkgYXMgJHRhZykgew0KCQlpZiAoIiIgIT0gdHJpbSgkdGFnKSkgew0KCQkJJHRyaW1tZWRbXSA9IHRyaW0oJHRhZyk7DQoJCX0NCgl9DQoJcmV0dXJuICR0cmltbWVkOw0KfQ0KDQoNCmZ1bmN0aW9uIHRydV90YWdzX2ZpeHVwX3F1ZXJ5X2F0dHMoJGF0dHMsICR0YWdfcGFyYW1ldGVyKSB7DQoJJGtleXdvcmRzID0gZXhwbG9kZSgnLCcsICR0YWdfcGFyYW1ldGVyKTsNCglmb3JlYWNoICgka2V5d29yZHMgYXMgJGtleXdvcmQpIHsNCgkJaWYgKHN0cnBvcygka2V5d29yZCwgJy0nKSAhPT0gZmFsc2UpIHsNCgkJCSRrZXl3b3Jkc1tdID0gc3RyX3JlcGxhY2UoJy0nLCAnICcsICRrZXl3b3JkKTsNCgkJfQ0KCX0NCgkkYXR0c1sna2V5d29yZHMnXSA9IGltcGxvZGUoJywnLCAka2V5d29yZHMpOw0KDQoJaWYgKGlzc2V0KCRhdHRzWydzZWN0aW9uJ10pICYmIHN0cnBvcygkYXR0c1snc2VjdGlvbiddLCAnLCcpICE9PSBmYWxzZSkgew0KCQkkYXR0c1snc2VjdGlvbiddID0gJyc7DQoJfQ0KDQoJaWYgKGlzc2V0KCRhdHRzWydleGNsdWRlc2VjdGlvbiddKSkgew0KCQl1bnNldCgkYXR0c1snZXhjbHVkZXNlY3Rpb24nXSk7DQoJfQ0KDQoJaWYgKGlzc2V0KCRhdHRzWydub2FydGljbGVzJ10pKSB7DQoJCXVuc2V0KCRhdHRzWydub2FydGljbGVzJ10pOw0KCX0NCg0KCWlmICghaXNzZXQoJGF0dHNbJ2xpbWl0J10pKSB7DQoJCSRhdHRzWydsaW1pdCddID0gJzEwMDAnOw0KCX0NCg0KCWlmICghaXNzZXQoJGF0dHNbJ2FsbG93b3ZlcnJpZGUnXSkpIHsNCgkJJGF0dHNbJ2FsbG93b3ZlcnJpZGUnXSA9IHRydWU7DQoJfQ0KDQoJcmV0dXJuICRhdHRzOw0KfQ0KDQoNCmZ1bmN0aW9uIHRydV90YWdzX3N0cnRvbG93ZXIoJHN0cikgew0KCWlmIChmdW5jdGlvbl9leGlzdHMoIm1iX3N0cnRvbG93ZXIiKSkgew0KCQlyZXR1cm4gbWJfc3RydG9sb3dlcigkc3RyLCAiVVRGLTgiKTsNCgl9IGVsc2Ugew0KCQlyZXR1cm4gc3RydG9sb3dlcigkc3RyKTsNCgl9DQp9DQoNCg0KLy90aGVzZSBuZXh0IHR3byBmdW5jdGlvbnMgYXJlIGdyb3NzLCBidXQgSSBjYW4ndCBmaWd1cmUgb3V0IGFub3RoZXIgd2F5IHRvIGRvIGl0DQpmdW5jdGlvbiB0cnVfdGFnc19zb3J0X3RhZ3MoJHRhZ3Nfd2VpZ2h0LCAkc29ydF9ieV9jb3VudCwgJHNvcnRfYXNjZW5kaW5nKSB7DQoJZ2xvYmFsICR0cnVfdGFnc190YWdzX3dlaWdodCwgJHRydV90YWdzX3NvcnRfYnlfY291bnQsICR0cnVfdGFnc19zb3J0X2FzY2VuZGluZzsNCg0KCSR0cnVfdGFnc190YWdzX3dlaWdodCA9ICR0YWdzX3dlaWdodDsNCgkkdHJ1X3RhZ3Nfc29ydF9ieV9jb3VudCA9ICRzb3J0X2J5X2NvdW50Ow0KCSR0cnVfdGFnc19zb3J0X2FzY2VuZGluZyA9ICRzb3J0X2FzY2VuZGluZzsNCg0KCSR0ZW1wX2FycmF5ID0gYXJyYXlfa2V5cygkdGFnc193ZWlnaHQpOw0KCXVzb3J0KCR0ZW1wX2FycmF5LCAidHJ1X3RhZ3Nfc29ydF90YWdzX2NvbXBhcmF0b3IiKTsNCg0KCSRzb3J0ZWRfYXJyYXkgPSBhcnJheSgpOw0KCWZvcmVhY2ggKCR0ZW1wX2FycmF5IGFzICR0YWcpIHsNCgkJJHNvcnRlZF9hcnJheVskdGFnXSA9ICR0YWdzX3dlaWdodFskdGFnXTsNCgl9DQoNCglyZXR1cm4gJHNvcnRlZF9hcnJheTsNCn0NCg0KDQpmdW5jdGlvbiB0cnVfdGFnc19zb3J0X3RhZ3NfY29tcGFyYXRvcigkbGVmdCwgJHJpZ2h0KSB7DQoJZ2xvYmFsICR0cnVfdGFnc190YWdzX3dlaWdodCwgJHRydV90YWdzX3NvcnRfYnlfY291bnQsICR0cnVfdGFnc19zb3J0X2FzY2VuZGluZzsNCg0KCWlmICgkdHJ1X3RhZ3Nfc29ydF9ieV9jb3VudCkgew0KCQkkbGVmdF93ZWlnaHQgPSAkdHJ1X3RhZ3NfdGFnc193ZWlnaHRbJGxlZnRdOw0KCQkkcmlnaHRfd2VpZ2h0ID0gJHRydV90YWdzX3RhZ3Nfd2VpZ2h0WyRyaWdodF07DQoJCWlmICgkbGVmdF93ZWlnaHQgPT0gJHJpZ2h0X3dlaWdodCkgew0KCQkJcmV0dXJuIHN0cm5hdGNhc2VjbXAoJGxlZnQsICRyaWdodCk7DQoJCX0gZWxzZSBpZiAoJHRydV90YWdzX3NvcnRfYXNjZW5kaW5nKSB7DQoJCQlyZXR1cm4gJGxlZnRfd2VpZ2h0IC0gJHJpZ2h0X3dlaWdodDsNCgkJfSBlbHNlIHsNCgkJCXJldHVybiAkcmlnaHRfd2VpZ2h0IC0gJGxlZnRfd2VpZ2h0Ow0KCQl9DQoJfSBlbHNlIHsNCgkJcmV0dXJuIHN0cm5hdGNhc2VjbXAoJGxlZnQsICRyaWdodCk7DQoJfQ0KfQ0KDQoNCg0KIyMjIEJBU1RBUkQgRlVOQ1RJT05TIFRIQVQgU0hPVUxETidUIEhBVkUgVE8gRVhJU1QgIyMjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCg0KDQpmdW5jdGlvbiB0cnVfdGFnc19yZWRvX2FydGljbGVfc2VhcmNoKCRhdHRzKSB7DQoJJHRoZUF0dHMgPSBsQXR0cyhhcnJheSgnbGltaXQnICAgICA9PiAxMDAwLA0KCQkJCSdjYXRlZ29yeScgID0+ICcnLA0KCQkJCSdzZWN0aW9uJyAgID0+ICcnLA0KCQkJCSdleGNlcnB0ZWQnID0+ICcnLA0KCQkJCSdhdXRob3InICAgID0+ICcnLA0KCQkJCSdzb3J0YnknICAgID0+ICdQb3N0ZWQnLA0KCQkJCSdzb3J0ZGlyJyAgID0+ICdkZXNjJywNCgkJCQknbW9udGgnICAgICA9PiAnJywNCgkJCQkna2V5d29yZHMnICA9PiAnJywNCgkJCQknZnJvbnRwYWdlJyA9PiAnJywNCgkJCQknaWQnICAgICAgICA9PiAnJywNCgkJCQkndGltZScgICAgICA9PiAncGFzdCcsDQoJCQkJJ3N0YXR1cycgICAgPT4gJzQnLA0KCQkJCSdvZmZzZXQnICAgID0+IDANCgkJCSksJGF0dHMsIDApOw0KCWV4dHJhY3QoJHRoZUF0dHMpOw0KDQoJLy9CdWlsZGluZyBxdWVyeSBwYXJ0cw0KCSRmcm9udHBhZ2UgPSAoJGZyb250cGFnZSkgPyBmaWx0ZXJGcm9udFBhZ2UoKSA6ICcnOw0KCSRjYXRlZ29yeSAgPSAoISRjYXRlZ29yeSkgID8gJycgOiAiIGFuZCAoKENhdGVnb3J5MT0nIi5kb3NsYXNoKCRjYXRlZ29yeSkuIicpIG9yIChDYXRlZ29yeTI9JyIuZG9TbGFzaCgkY2F0ZWdvcnkpLiInKSkgIjsNCgkkc2VjdGlvbiAgID0gKCEkc2VjdGlvbikgICA/ICcnIDogIiBhbmQgU2VjdGlvbiA9ICciLmRvc2xhc2goJHNlY3Rpb24pLiInIjsNCgkkZXhjZXJwdGVkID0gKCRleGNlcnB0ZWQ9PSd5JykgID8gIiBhbmQgRXhjZXJwdCAhPScnIiA6ICcnOw0KCSRhdXRob3IgICAgPSAoISRhdXRob3IpICAgID8gJycgOiAiIGFuZCBBdXRob3JJRCA9ICciLmRvc2xhc2goJGF1dGhvcikuIiciOw0KCSRtb250aCAgICAgPSAoISRtb250aCkgICAgID8gJycgOiAiIGFuZCBQb3N0ZWQgbGlrZSAnIi5kb1NsYXNoKCRtb250aCkuIiUnIjsNCgkkaWQgICAgICAgID0gKCEkaWQpICAgICAgICA/ICcnIDogIiBhbmQgSUQgPSAnIi5pbnR2YWwoJGlkKS4iJyI7DQoJc3dpdGNoICgkdGltZSkgew0KCQljYXNlICdhbnknOg0KCQkJJHRpbWUgPSAiIjsgYnJlYWs7DQoJCWNhc2UgJ2Z1dHVyZSc6DQoJCQkkdGltZSA9ICIgYW5kIFBvc3RlZCA+IG5vdygpIjsgYnJlYWs7DQoJCWRlZmF1bHQ6DQoJCQkkdGltZSA9ICIgYW5kIFBvc3RlZCA8IG5vdygpIjsNCgl9DQoJaWYgKCFpc19udW1lcmljKCRzdGF0dXMpKQ0KCQkkc3RhdHVzID0gZ2V0U3RhdHVzTnVtKCRzdGF0dXMpOw0KDQoJJGN1c3RvbSA9ICcnOw0KCS8vIHRyeWluZyBjdXN0b20gZmllbGRzIGhlcmUNCgkkY3VzdG9tRmllbGRzID0gZ2V0Q3VzdG9tRmllbGRzKCk7DQoJaWYgKCRjdXN0b21GaWVsZHMpIHsNCgkJZm9yZWFjaCgkY3VzdG9tRmllbGRzIGFzICRjRmllbGQpIHsNCgkJCWlmIChpc3NldCgkYXR0c1skY0ZpZWxkXSkpDQoJCQkJJGN1c3RvbVBhaXJzWyRjRmllbGRdID0gJGF0dHNbJGNGaWVsZF07DQoJCX0NCgkJaWYoIWVtcHR5KCRjdXN0b21QYWlycykpDQoJCQkkY3VzdG9tID0gIGJ1aWxkQ3VzdG9tU3FsKCRjdXN0b21GaWVsZHMsJGN1c3RvbVBhaXJzKTsNCgkJZWxzZQ0KCQkJJGN1c3RvbSA9ICcnOw0KCX0NCg0KCS8vQWxsb3cga2V5d29yZHMgZm9yIG5vLWN1c3RvbSBhcnRpY2xlcy4gVGhhdCB0YWdnaW5nIG1vZGUsIHlvdSBrbm93DQoJaWYgKCRrZXl3b3Jkcykgew0KCQkka2V5cyA9IGRvU2xhc2goYXJyYXlfbWFwKCd0cmltJywgc3BsaXQoJywnLCAka2V5d29yZHMpKSk7DQoJCWZvcmVhY2ggKCRrZXlzIGFzICRrZXkpIHsNCgkJCSRrZXlwYXJ0c1tdID0gIkZJTkRfSU5fU0VUKCciLiRrZXkuIicsS2V5d29yZHMpIjsNCgkJfQ0KCQkka2V5d29yZHMgPSAiIGFuZCAoIiAuIGpvaW4oJyBvciAnLCRrZXlwYXJ0cykgLiAiKSI7DQoJfQ0KDQoJaWYgKCRpZCkNCgkJJHN0YXR1c3EgPSAiIGFuZCBTdGF0dXMgPj0gJzQnIjsNCgllbHNlDQoJCSRzdGF0dXNxID0gIiBhbmQgU3RhdHVzPSciLmRvU2xhc2goJHN0YXR1cykuIiciOw0KDQoJJHdoZXJlID0gIjEiIC4gJHN0YXR1c3EuICR0aW1lLg0KCQkkaWQgLiAkY2F0ZWdvcnkgLiAkc2VjdGlvbiAuICRleGNlcnB0ZWQgLiAkbW9udGggLiAkYXV0aG9yIC4gJGtleXdvcmRzIC4gJGN1c3RvbSAuICRmcm9udHBhZ2U7DQoNCgkJJHBnb2Zmc2V0ID0gJG9mZnNldCAuICcsICc7DQoNCgkkcnMgPSBzYWZlX3Jvd3Nfc3RhcnQoIiosIHVuaXhfdGltZXN0YW1wKFBvc3RlZCkgYXMgdVBvc3RlZCIsICd0ZXh0cGF0dGVybicsDQoJCSR3aGVyZS4gJyBvcmRlciBieSAnIC4gZG9zbGFzaCgkc29ydGJ5KSAuICcgJyAuIGRvU2xhc2goJHNvcnRkaXIpIC4gJyBsaW1pdCAnIC4gZG9TbGFzaCgkbGltaXQpKTsNCg0KCXJldHVybiAkcnM7DQp9DQoNCg0KIjtzOjQ6InR5cGUiO3M6MToiMSI7czozOiJtZDUiO3M6MzI6IjFmOGUwNzdmYjYyZWM1YTNiNDExN2NiYWFhYTMyNzE4Ijt9
Cheers!
Last edited by Gocom (2007-11-16 10:59:21)
Offline
#322 2007-11-16 11:27:04
- iboi
- New Member
- Registered: 2007-11-16
- Posts: 2
Re: tru_tags: A tagging plugin for textpattern
Gocom wrote:
iboi, here is the plugin code. Well it’s a little modified version, but it works completely same way. Only comments are removed from the plugin’s php-code :)
Thank you very much! Still waiting for the domain to resolve since the intructions are also available there.
Offline
#323 2007-11-16 11:58:50
Re: tru_tags: A tagging plugin for textpattern
Sorry, folks. The server is down, but it should be back up later this morning. Thanks for posting the code, Gocom.
Offline
#324 2007-11-20 20:56:13
Re: tru_tags: A tagging plugin for textpattern
Sorry, for some reason the e-Mail notification of this thread didn’t work so I only noticed your post just now.
truist wrote:
Is there any chance that you have custom rewrite rules in your .htaccess file?
No – none that would interact with the “stichwort” section.
If that’s not it, the only thing I can think to try is to start putting debugging messages into tru_tags to see what it’s really doing. To do that, I’d need access to your site. If you’re willing to do that, please send credentials to truist-20071111@truist.com.
Send you account info. Thanks for taking the time to look into it.
Offline
#325 2007-11-20 23:54:33
Re: tru_tags: A tagging plugin for textpattern
andreas – That was tricky :) I found the problem, and I’ve fixed it. You had changed your “URL parameter for tag search” (in the tru_tags admin) to “s” (from the default of “t”). “s” is what Textpattern uses to indicate the current section, so tru_tags and Textpattern were conflicting. I switched the URL parameter back to “t” and that fixed it.
That field really only exists to future-proof tru_tags, in case something in Textpattern ever starts using “t” (and thereby causes just this problem). You can probably leave it alone, or it should be safe to use letters other that “s” or “c”.
Offline
#326 2007-11-21 06:09:56
Re: tru_tags: A tagging plugin for textpattern
Great to hear, truist. Thanks a lot.
For some reason I thought that the parameter had to reflect my change of the tag keyword.
Last edited by andreas (2007-11-21 06:10:11)
Offline
#327 2007-11-21 09:58:33
Re: tru_tags: A tagging plugin for textpattern
Nathan, this is a very nice ‘bug by design’ thingy :-)
I hope you put some notes into the help and usage instructions.
Get all online mentions of Textpattern via OPML subscription: TXP Info Sources: Textpattern RSS feeds as dynamic OPML
Offline
#328 2007-11-25 23:43:48
Re: tru_tags: A tagging plugin for textpattern
I’ve just upgraded from tru_tags v2.3 using TXP 4.05, and everything is behaving itself on the published website, but in the admin:write interface no tags are displayed in their usual place below the Keywords field.
A little investigation into the js modified source and I find
<br><span class="tru_tags_admin_tags"><style>a.tag_chosen{background-color: #FEB; color: black;}</style></span>
after the Keywords textfield – no tags output.
No errors showing up, and when I visit the extensions tru-tags tab, ‘current tags’ remains empty, no matter what my efforts.
Any idea what might be happening?
Thanks
Last edited by giz (2007-11-26 19:22:59)
Offline
#329 2007-11-27 18:25:29
Re: tru_tags: A tagging plugin for textpattern
Bump!
Offline
#330 2007-11-28 23:41:31
- Shaliza
- Member
- Registered: 2006-01-22
- Posts: 59
Re: tru_tags: A tagging plugin for textpattern
Perhaps I missed it [kind of tired right now], but I have a question:
What if on the tags page you only want a small description instead of the full article – is that possible?
Offline