Go to main content

Textpattern CMS support forum

You are not logged in. Register | Login | Help

#811 2020-03-11 19:22:15

colak
Admin
From: Cyprus
Registered: 2004-11-20
Posts: 9,384
Website GitHub Mastodon Twitter

Re: tru_tags: A tagging plugin for textpattern

Vienuolis wrote #322167:

<meta::description format="" /> output disappear on sections after Textpattern 4.7.3 → 4.8.0 upgrade. No warnings while in debugging mode. And no changes on Meta description docs since v4.6.0.

Would the double colon be the reason? it should be: <meta:description format="" />


Yiannis
——————————
NeMe | hblack.art | EMAP | A Sea change | Toolkit of Care
I do my best editing after I click on the submit button.

Offline

#812 2020-03-11 19:51:39

Vienuolis
Member
From: Vilnius, Lithuania
Registered: 2009-06-14
Posts: 327
Website GitHub GitLab Mastodon Twitter

Re: tru_tags: A tagging plugin for textpattern

Sorry, I know txp:meta_description or meta::description types only.

Offline

#813 2020-04-17 04:25:54

peterj
Member
From: Melbourne, Australia
Registered: 2005-06-02
Posts: 110

Re: tru_tags: A tagging plugin for textpattern

Try htaccess workaround – see Jakob’s rewrite rule here

Adapted:

# Temporary: tru_tags url rewrite
RewriteRule ^tag/(article/)?(.+)$ ?s=tag&t=$1@

Last edited by peterj (2020-04-19 04:02:17)

Offline

#814 2020-04-17 13:19:40

Vienuolis
Member
From: Vilnius, Lithuania
Registered: 2009-06-14
Posts: 327
Website GitHub GitLab Mastodon Twitter

Re: tru_tags: A tagging plugin for textpattern

I am using Hiawatha webserver instead of Apache, so I changed this .htaccess string to the regular expression

Match ^/tag/(.+)/ Rewrite /index.php?s=tag&t=$1

and tagged links work now again as should. Thank you for the help!

Offline

#815 2020-06-23 10:26:39

whocarez
Plugin Author
From: Germany/Ukraine
Registered: 2007-10-08
Posts: 305
Website GitHub Twitter

Re: tru_tags: A tagging plugin for textpattern

Bloke wrote #322056:

Nope, seems to be a bug in 4.8.0. I don’t think there’s anything that can be done in the plugin to fix this, because Txp is throwing out the URL before the plugin even has a chance to intervene. Same with smd_tags. We’ll have to figure this out in core. Sorry for the hassle.

Is this problem fixed in 4.8.1? Or do I still have to use a special rewrite rule?

Offline

#816 2020-06-23 10:28:07

Bloke
Developer
From: Leeds, UK
Registered: 2006-01-29
Posts: 12,452
Website GitHub

Re: tru_tags: A tagging plugin for textpattern

whocarez wrote #323929:

Is this problem fixed in 4.8.1? Or do I still have to use a special rewrite rule?

Should be fixed in 4.8.1 but you may still have to alter the plugin to load order 4 or lower.

EDIT: and any custom URLs you generate that target landing pages MUST end in a trailing slash or Txp might consider them articles. This behaviour depends on your per-section permlink setup, but to be safe, just include the trailing slash on non-article pages.

Last edited by Bloke (2020-06-23 10:30:16)


The smd plugin menagerie — for when you need one more gribble of power from Textpattern. Bleeding-edge code available on GitHub.

Hire Txp Builders – finely-crafted code, design and Txp

Offline

#817 2020-06-24 19:45:31

whocarez
Plugin Author
From: Germany/Ukraine
Registered: 2007-10-08
Posts: 305
Website GitHub Twitter

Re: tru_tags: A tagging plugin for textpattern

After updating another installation without my own permanent link format, means with untouched files, I have to correct my answer from the release thread, . The bug is still present in 4.8.1.. Changing the load order, didn’t help.

For nginx I needed this rewriting rule:
rewrite ^/tag/(.+)/$ /index.php?s=tag&t=$1;

In the 4.8.1 installation where it works, I use my modified permalink format "title_id". And there I added for example in the chopUrl function in publish.php the line $req = preg_replace('/\_/', '/', $req);. Maybe that’s why it is working there.

Last edited by whocarez (2020-06-24 19:59:31)

Offline

#818 2020-06-24 21:01:03

Bloke
Developer
From: Leeds, UK
Registered: 2006-01-29
Posts: 12,452
Website GitHub

Re: tru_tags: A tagging plugin for textpattern

Hmmmm, what happens if you set the load order to 4 and mod the plugin as follows:

if (tru_tags_clean_urls()) {
	// register_callback('tru_tags_clean_url_handler', 'pretext');
	tru_tags_clean_url_handler();
}

function tru_tags_clean_url_handler($event = null, $step = null) {
...
}

The smd plugin menagerie — for when you need one more gribble of power from Textpattern. Bleeding-edge code available on GitHub.

Hire Txp Builders – finely-crafted code, design and Txp

Offline

#819 2020-06-24 21:28:11

whocarez
Plugin Author
From: Germany/Ukraine
Registered: 2007-10-08
Posts: 305
Website GitHub Twitter

Re: tru_tags: A tagging plugin for textpattern

It works, but only with an load order of at least 4 … Thanks!

Last edited by whocarez (2020-06-24 22:05:57)

Offline

#820 2020-06-24 22:04:25

etc
Developer
Registered: 2010-11-11
Posts: 5,677
Website GitHub

Re: tru_tags: A tagging plugin for textpattern

Probably, if your plugin sets global $pretext['s'] on pretext callback, the load order is not important (untested) not valid any more, sorry. Instead, if your plugin rewrites request_uri, you must set its load order < 5 and

register_callback('my_uri_rewrite', 'pretext', '', 1);

Last edited by etc (2020-06-25 12:07:34)

Offline

#821 2020-06-25 12:08:13

etc
Developer
Registered: 2010-11-11
Posts: 5,677
Website GitHub

Re: tru_tags: A tagging plugin for textpattern

Up, please test (4.8.1+ only).

# Name: tru_tags v3.9.2 
# Type: Admin/Public/AJAX plugin
# Article tagging
# Author: Nathan Arthur
# URL: http://www.rainskit.com/
# Recommended load order: 5

# .....................................................................
# This is a plugin for Textpattern CMS - http://textpattern.com/
# To install: textpattern > admin > plugins
# Paste the following text into the 'Install plugin' box:
# .....................................................................

YToxMTp7czo0OiJuYW1lIjtzOjg6InRydV90YWdzIjtzOjY6ImF1dGhvciI7czoxMzoiTmF0
aGFuIEFydGh1ciI7czoxMDoiYXV0aG9yX3VyaSI7czoyNDoiaHR0cDovL3d3dy5yYWluc2tp
dC5jb20vIjtzOjc6InZlcnNpb24iO3M6NToiMy45LjIiO3M6MTE6ImRlc2NyaXB0aW9uIjtz
OjE1OiJBcnRpY2xlIHRhZ2dpbmciO3M6NDoiY29kZSI7czo0NTkyNToiIyBDb3B5cmlnaHQg
MjAxNyBOYXRoYW4gQXJ0aHVyDQojIFJlbGVhc2VkIHVuZGVyIHRoZSBHTlUgUHVibGljIExp
Y2Vuc2UsIHNlZSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2dwbC1saWNl
bnNlLnBocCBmb3IgZGV0YWlscw0KIw0KIyBUaGlzIHdvcmsgd2FzIG9yaWdpbmFsbHkgaW5z
cGlyZWQgYnkgcmFuX3RhZ3MgYnkgUmFuIEFyb3Vzc2ksIG9yaWdpbmFsbHkgZm91bmQgYXQg
aHR0cDovL2Fyb3Vzc2kuY29tL2FydGljbGUvNDUvdGFnZ2luZy10ZXh0cGF0dGVybg0KIyBK
YXZhc2NyaXB0IGJ1ZyBmaXhlcyB3ZXJlIHByb3ZpZGVkIGJ5IHRoZV9naG9zdCAtIGh0dHA6
Ly92aWN0b3J1cy5uZXQNCiMgSmF2YXNjcmlwdCBjb2RlIGZvciB0aGUgdGFnIGF1dG8tY29t
cGxldGUgZmVhdHVyZSB3YXMgcHJvdmlkZWQgYnkgSmltIEJpYW5jb2xvIC0gaHR0cDovL3d3
dy5iaWFuY29sby5jb20vDQojIEZpeGVzIGZvciBUZXh0cGF0dGVybiA0LjYgcHJvdmlkZWQg
Ynk6DQojICAgLSBSaW1hcyBLdWRlbGlzOyBodHRwczovL2dpdGh1Yi5jb20vcmltYXMta3Vk
ZWxpcw0KIyAgIC0gam9vbHMtcjsgaHR0cHM6Ly9naXRodWIuY29tL2pvb2xzLXINCiMgICAt
IFNpbW9uIEZpbmNoOyBodHRwczovL2dpdGh1Yi5jb20vc3BpZmZpbg0KDQoNCiMjIyBDT05G
SUdVUkFUSU9OICMjIw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoNCiMgVFVSTiBCQUNLISAg
Q29uZmlndXJhdGlvbiBpcyBubyBsb25nZXIgaGFuZGxlZCBieSBlZGl0aW5nIHRoZSBwbHVn
aW4uDQojIENoZWNrIG91dCB0aGUgJ0V4dGVuc2lvbnMnIHRhYiBpbiB0aGUgVGV4dHBhdHRl
cm4gYWRtaW4gOikNCg0KDQojIENoYW5naW5nIHRoZXNlIHdvbid0IGRvIGFueSBnb29kLiAg
VGhleSdyZSBqdXN0IGhlcmUgYXMgYSBjb252ZW5pZW5jZSBmb3IgZGV2ZWxvcG1lbnQuDQpk
ZWZpbmUoJ1RSVV9UQUdTX0ZJRUxEJywgJ0tleXdvcmRzJyk7DQpkZWZpbmUoJ0VOQ09ESU5H
JywgJ3V0Zi04Jyk7DQoNCmRlZmluZSgnQ0xFQU5fVVJMUycsICdjbGVhbl91cmxzJyk7DQpk
ZWZpbmUoJ1RBR19TRUNUSU9OJywgJ3RhZ19zZWN0aW9uJyk7DQpkZWZpbmUoJ1BBUk1fTkFN
RScsICdwYXJtJyk7DQpkZWZpbmUoJ1RBR1NfSU5fRkVFRF9DQVRFR09SSUVTJywgJ3RhZ3Nf
aW5fZmVlZF9jYXRlZ29yaWVzJyk7DQpkZWZpbmUoJ1RBR1NfSU5fRkVFRF9CT0RZJywgJ3Rh
Z3NfaW5fZmVlZF9ib2R5Jyk7DQpkZWZpbmUoJ1RBR1NfSU5fV1JJVEVfVEFCJywgJ3RhZ3Nf
aW5fd3JpdGVfdGFiJyk7DQpkZWZpbmUoJ0FVVE9DT01QTEVURV9JTl9XUklURV9UQUInLCAn
YXV0b2NvbXBsZXRlX2luX3dyaXRlX3RhYicpOw0KZGVmaW5lKCdVVEZfOF9DQVNFJywgJ3V0
Zl84X2Nhc2UnKTsNCg0KZ2xvYmFsICR0cnVfdGFnc19wcmVmczsNCiR0cnVfdGFnc19wcmVm
cyA9IHRydV90YWdzX2xvYWRfcHJlZnMoKTsNCg0KDQojIyMgVEFHIFJFR0lTVFJBVElPTiAj
IyMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQpUeHA6OmdldCgnXFRleHRwYXR0ZXJu
XFRhZ1xSZWdpc3RyeScpDQoJLT5yZWdpc3RlcigndHJ1X3RhZ3NfaGFuZGxlcicpDQoJLT5y
ZWdpc3RlcigndHJ1X3RhZ3NfaWZfaGFzX3RhZ3MnKQ0KCS0+cmVnaXN0ZXIoJ3RydV90YWdz
X2Zyb21fYXJ0aWNsZScpDQoJLT5yZWdpc3RlcigndHJ1X3RhZ3NfY2xvdWQnKQ0KCS0+cmVn
aXN0ZXIoJ3RydV90YWdzX2xpc3QnKQ0KCS0+cmVnaXN0ZXIoJ3RydV90YWdzX2lmX3RhZ19z
ZWFyY2gnKQ0KCS0+cmVnaXN0ZXIoJ3RydV90YWdzX3RhZ19wYXJhbWV0ZXInKQ0KCS0+cmVn
aXN0ZXIoJ3RydV90YWdzX3NlYXJjaF9yZXN1bHRfZXhjZXJwdCcpDQoJLT5yZWdpc3Rlcign
dHJ1X3RhZ3Nfc2VhcmNoX3BhcmFtZXRlcicpDQoJLT5yZWdpc3RlcigndHJ1X3RhZ3NfcmVs
YXRlZF90YWdzX2Zyb21fc2VhcmNoJykNCgktPnJlZ2lzdGVyKCd0cnVfdGFnc19hcmNoaXZl
JykNCgktPnJlZ2lzdGVyKCd0cnVfdGFnc19jdXJyZW50X2FyY2hpdmVfdGFnJyk7DQoNCiMj
IyBQUklNQVJZIFRBRyBGVU5DVElPTlMgIyMjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj
IyMjIw0KDQpmdW5jdGlvbiB0cnVfdGFnc19oYW5kbGVyKCRhdHRzKSB7DQoJJHRhZ19wYXJh
bWV0ZXIgPSB0cnVfdGFnc190YWdfcGFyYW1ldGVyKGFycmF5KCksIGZhbHNlKTsNCglpZiAo
IWVtcHR5KCR0YWdfcGFyYW1ldGVyKSkgew0KCQlpZiAodHJ1X3RhZ3NfcmVkaXJlY3RfaWZf
bmVlZGVkKCR0YWdfcGFyYW1ldGVyKSkgew0KCQkJcmV0dXJuICcnOw0KCQl9DQoJCSRjbGVh
bl9hdHRzID0gdHJ1X3RhZ3NfZml4dXBfcXVlcnlfYXR0cygkYXR0cywgJHRhZ19wYXJhbWV0
ZXIpOw0KCQkkcmVzdWx0ID0gZG9BcnRpY2xlcygkY2xlYW5fYXR0cywgdHJ1ZSk7CQkjZnVu
Y3Rpb24gaW4gVFhQIGNvZGUNCgkJaWYgKHRyaW0oJHJlc3VsdCkgPT0gJycpIHsNCgkJCWlm
IChpc3NldCgkYXR0c1snbm9hcnRpY2xlcyddKSkgew0KCQkJCXRydV90YWdzX3JlZGlyZWN0
KCRhdHRzWydub2FydGljbGVzJ10sIHRydWUpOw0KCQkJfSBlbHNlIGlmIChpc3NldCgkYXR0
c1snNDA0cmVkaXJlY3QnXSkgJiYgISRhdHRzWyc0MDRyZWRpcmVjdCddKSB7DQoJCQkJcmV0
dXJuICRyZXN1bHQ7DQoJCQl9IGVsc2Ugew0KCQkJCXR4cF9kaWUoZ1R4dCgnNDA0X25vdF9m
b3VuZCcpLCAnNDA0Jyk7DQoJCQl9DQoJCX0gZWxzZSB7DQoJCQlyZXR1cm4gJHJlc3VsdDsN
CgkJfQ0KCX0gZWxzZSB7DQoJCXJldHVybiB0cnVfdGFnc19jbG91ZCgkYXR0cyk7DQoJfQ0K
fQ0KDQoNCmZ1bmN0aW9uIHRydV90YWdzX2FyY2hpdmUoJGF0dHMpIHsNCglnbG9iYWwgJHRy
dV90YWdzX2N1cnJlbnRfYXJjaGl2ZV90YWc7DQoJJHRhZ3MgPSBhcnJheV91bmlxdWUodHJ1
X3RhZ3NfY2xvdWRfcXVlcnkodHJ1X3RhZ3NfZ2V0X3N0YW5kYXJkX2Nsb3VkX2F0dHMoJGF0
dHMsIGZhbHNlLCBmYWxzZSkpKTsNCgluYXRjYXNlc29ydCgkdGFncyk7DQoJZm9yZWFjaCAo
JHRhZ3MgYXMgJHRhZykgew0KCQkkdHJ1X3RhZ3NfY3VycmVudF9hcmNoaXZlX3RhZyA9ICR0
YWc7DQoJCSRjbGVhbl9hdHRzID0gdHJ1X3RhZ3NfZml4dXBfcXVlcnlfYXR0cygkYXR0cywg
JHRhZyk7DQoJCSRyZXN1bHRzW10gPSBkb0FydGljbGVzKCRjbGVhbl9hdHRzLCB0cnVlKTsJ
CSNmdW5jdGlvbiBpbiBUWFAgY29kZQ0KCX0NCglyZXR1cm4gam9pbignICcsICRyZXN1bHRz
KTsNCn0NCg0KDQpmdW5jdGlvbiB0cnVfdGFnc19jdXJyZW50X2FyY2hpdmVfdGFnKCRhdHRz
KSB7DQoJZ2xvYmFsICR0cnVfdGFnc19jdXJyZW50X2FyY2hpdmVfdGFnOw0KCWV4dHJhY3Qo
bEF0dHMoYXJyYXkoJ2xpbmsnID0+ICcwJyksICAkYXR0cywgMCkpOw0KCWlmICgkbGluaykg
ew0KCQlyZXR1cm4gJzxhIGhyZWY9IicgLiB0cnVfdGFnc19saW5raWZ5X3RhZygkdHJ1X3Rh
Z3NfY3VycmVudF9hcmNoaXZlX3RhZykgLiAnIj4nIC4gJHRydV90YWdzX2N1cnJlbnRfYXJj
aGl2ZV90YWcgLiAnPC9hPic7DQoJfSBlbHNlIHsNCgkJcmV0dXJuICR0cnVfdGFnc19jdXJy
ZW50X2FyY2hpdmVfdGFnOw0KCX0NCn0NCg0KDQpmdW5jdGlvbiB0cnVfdGFnc19jbG91ZCgk
YXR0cykgew0KCXJldHVybiB0cnVfdGFnc19saXN0KHRydV90YWdzX2dldF9zdGFuZGFyZF9j
bG91ZF9hdHRzKCRhdHRzLCBmYWxzZSwgZmFsc2UpKTsNCn0NCg0KDQpmdW5jdGlvbiB0cnVf
dGFnc19saXN0KCRhdHRzKSB7DQoJJGF0dHMgPSB0cnVfdGFnc19nZXRfc3RhbmRhcmRfY2xv
dWRfYXR0cygkYXR0cywgdHJ1ZSwgZmFsc2UpOw0KCSRhbGxfdGFncyA9IHRydV90YWdzX2Ns
b3VkX3F1ZXJ5KCRhdHRzKTsNCg0KCXJldHVybiB0cnVfdGFnc19yZW5kZXJfY2xvdWQoJGF0
dHMsICRhbGxfdGFncywgJGFsbF90YWdzKTsNCn0NCg0KDQpmdW5jdGlvbiB0cnVfdGFnc19m
cm9tX2FydGljbGUoJGF0dHMpIHsNCglnbG9iYWwgJHRoaXNhcnRpY2xlOw0KCWV4dHJhY3Qo
JHRoaXNhcnRpY2xlKTsNCg0KCSRhbGxfdGFncyA9IHRydV90YWdzX2dldF90YWdzX2Zvcl9h
cnRpY2xlKCR0aGlzaWQpOw0KDQoJJGF0dHMgPSB0cnVfdGFnc19nZXRfc3RhbmRhcmRfY2xv
dWRfYXR0cygkYXR0cywgZmFsc2UsIHRydWUpOw0KCSRhbGxfdGFnc19mb3Jfd2VpZ2h0ID0g
JGFsbF90YWdzOw0KCWlmICgkYXR0c1sndXNlb3ZlcmFsbGNvdW50cyddKSB7DQoJCSRhbGxf
dGFnc19mb3Jfd2VpZ2h0ID0gdHJ1X3RhZ3NfY2xvdWRfcXVlcnkoJGF0dHMpOw0KCX0NCg0K
CXJldHVybiB0cnVfdGFnc19yZW5kZXJfY2xvdWQoJGF0dHMsICRhbGxfdGFncywgJGFsbF90
YWdzX2Zvcl93ZWlnaHQpOw0KfQ0KDQoNCmZ1bmN0aW9uIHRydV90YWdzX2lmX2hhc190YWdz
KCRhdHRzLCAkdGhpbmcpIHsNCglnbG9iYWwgJHRoaXNhcnRpY2xlOw0KCWV4dHJhY3QoJHRo
aXNhcnRpY2xlKTsNCg0KCSR0YWdzX2ZpZWxkID0gVFJVX1RBR1NfRklFTEQ7DQoNCgkkcnMg
PSBzYWZlX3JvdygkdGFnc19maWVsZCwgInRleHRwYXR0ZXJuIiwgIklEPSckdGhpc2lkJyBB
TkQgJHRhZ3NfZmllbGQgPD4gJyciKTsNCglyZXR1cm4gcGFyc2UoRXZhbEVsc2UoJHRoaW5n
LCAkcnMpKTsNCn0NCg0KDQpmdW5jdGlvbiB0cnVfdGFnc19pZl90YWdfc2VhcmNoKCRhdHRz
LCAkdGhpbmcpIHsNCglleHRyYWN0KGxBdHRzKGFycmF5KCd0YWcnID0+ICcnKSwgICRhdHRz
LCAwKSk7DQoNCgkkdGFnX3BhcmFtZXRlciA9IHRydV90YWdzX3RhZ19wYXJhbWV0ZXIoYXJy
YXkoJ3N0cmlwaHlwaGVucycgPT4gMSksIGZhbHNlKTsNCgkkY29uZGl0aW9uID0gKCFlbXB0
eSgkdGFnX3BhcmFtZXRlcikpID8gdHJ1ZSA6IGZhbHNlOw0KCWlmICgkY29uZGl0aW9uICYm
ICFlbXB0eSgkdGFnKSkgew0KCQkkY29uZGl0aW9uID0gKCR0YWdfcGFyYW1ldGVyID09ICR0
YWcpOw0KCX0NCglyZXR1cm4gcGFyc2UoRXZhbEVsc2UoJHRoaW5nLCAkY29uZGl0aW9uKSk7
DQp9DQoNCg0KZnVuY3Rpb24gdHJ1X3RhZ3NfdGFnX3BhcmFtZXRlcigkYXR0cywgJHNhZmVo
dG1sID0gdHJ1ZSkgew0KCWdsb2JhbCAkdHJ1X3RhZ3NfcHJlZnM7DQoJZXh0cmFjdChsQXR0
cyhhcnJheSgnc3RyaXBoeXBoZW5zJyA9PiAnMCcsICd1cmxlbmNvZGUnID0+IDApLCAgJGF0
dHMsIDApKTsNCg0KCSRwYXJtID0gdXJsZGVjb2RlKHN0cmlwX3RhZ3MoZ3BzKCR0cnVfdGFn
c19wcmVmc1tQQVJNX05BTUVdLT52YWx1ZSkpKTsNCglpZiAoJ2xvb2t1cCcgPT0gJHN0cmlw
aHlwaGVucykgew0KCQkkYXR0cyA9IHRydV90YWdzX2dldF9zdGFuZGFyZF9jbG91ZF9hdHRz
KGFycmF5KCksIGZhbHNlLCBmYWxzZSk7DQoJCSR0YWdfbGlzdCA9IGFycmF5X3VuaXF1ZSh0
cnVfdGFnc19jbG91ZF9xdWVyeSgkYXR0cykpOw0KCQlmb3JlYWNoICgkdGFnX2xpc3QgYXMg
JGNsb3VkX3RhZykgew0KCQkJaWYgKCRwYXJtID09IHN0cl9yZXBsYWNlKCcgJywgJy0nLCAk
Y2xvdWRfdGFnKSkgew0KCQkJCSRwYXJtID0gJGNsb3VkX3RhZzsNCgkJCQlicmVhazsNCgkJ
CX0NCgkJfQ0KCX0gZWxzZSBpZiAoJHN0cmlwaHlwaGVucykgew0KCQkkcGFybSA9IHN0cl9y
ZXBsYWNlKCctJywgJyAnLCAkcGFybSk7DQoJfQ0KCWlmICgkdXJsZW5jb2RlKSB7DQoJCSRw
YXJtID0gdXJsZW5jb2RlKCRwYXJtKTsNCgkgfSBlbHNlIGlmICgkc2FmZWh0bWwpIHsNCgkJ
JHBhcm0gPSBodG1sc3BlY2lhbGNoYXJzKCRwYXJtKTsNCgl9DQoNCglyZXR1cm4gJHBhcm07
DQp9DQoNCg0KZnVuY3Rpb24gdHJ1X3RhZ3Nfc2VhcmNoX3Jlc3VsdF9leGNlcnB0KCRhdHRz
KSB7DQoJZ2xvYmFsICRwcmV0ZXh0Ow0KDQoJJHRhZ19wYXJhbWV0ZXIgPSB0cnVfdGFnc190
YWdfcGFyYW1ldGVyKGFycmF5KCksIGZhbHNlKTsNCglpZiAodHJpbSgkdGFnX3BhcmFtZXRl
cikgIT0gJycpIHsNCgkJJHEgPSAkcHJldGV4dFsncSddOw0KCQkkcHJldGV4dFsncSddID0g
JHRhZ19wYXJhbWV0ZXI7DQoJCSRyZXN1bHQgPSBzZWFyY2hfcmVzdWx0X2V4Y2VycHQoJGF0
dHMpOw0KCQkkcHJldGV4dFsncSddID0gJHE7DQoJfSBlbHNlIHsNCgkJJHJlc3VsdCA9IHNl
YXJjaF9yZXN1bHRfZXhjZXJwdCgkYXR0cyk7DQoJfQ0KCXJldHVybiAkcmVzdWx0Ow0KfQ0K
DQoNCmZ1bmN0aW9uIHRydV90YWdzX3NlYXJjaF9wYXJhbWV0ZXIoKSB7DQoJdHJpZ2dlcl9l
cnJvcihnVHh0KCdkZXByZWNhdGVkX3RhZycpLCBFX1VTRVJfTk9USUNFKTsNCglyZXR1cm4g
c3RyaXBfdGFncyhncHMoJ3EnKSk7DQp9DQoNCg0KZnVuY3Rpb24gdHJ1X3RhZ3NfcmVsYXRl
ZF90YWdzX2Zyb21fc2VhcmNoKCRhdHRzKSB7DQoJJHRhZ19wYXJhbWV0ZXIgPSB0cnVfdGFn
c190YWdfcGFyYW1ldGVyKGFycmF5KCksIGZhbHNlKTsNCglleHRyYWN0KGxBdHRzKGFycmF5
KCd0YWdfcGFyYW1ldGVyJyA9PiAkdGFnX3BhcmFtZXRlciksICAkYXR0cywgMCkpOw0KCWlm
ICghZW1wdHkoJHRhZ19wYXJhbWV0ZXIpKSB7DQogICAgICAgICR0YWdzX2ZpZWxkID0gVFJV
X1RBR1NfRklFTEQ7DQoJCSRhbGxfdGFncyA9IGFycmF5KCk7DQoNCgkJJHF1ZXJ5X2F0dHMg
PSB0cnVfdGFnc19maXh1cF9xdWVyeV9hdHRzKCRhdHRzLCAkdGFnX3BhcmFtZXRlcik7DQoJ
CSRycyA9IHRydV90YWdzX3JlZG9fYXJ0aWNsZV9zZWFyY2goJHF1ZXJ5X2F0dHMpOw0KCQlp
ZiAoJHJzKSB7DQoJCQl3aGlsZSAoJGEgPSBuZXh0Um93KCRycykpIHsNCgkJCQkkYXJ0aWNs
ZV90YWdzID0gYXJyYXkoKTsNCgkJCQlpZiAoaXNzZXQoJGFbJHRhZ3NfZmllbGRdKSkgew0K
CQkJCQkkYXJ0aWNsZV90YWdzID0gZXhwbG9kZSgiLCIsIHRyaW0odHJ1X3RhZ3Nfc3RydG9s
b3dlcigkYVskdGFnc19maWVsZF0pKSk7DQoJCQkJfQ0KCQkJCSMgZmFzdGVyIGltcGxlbWVu
dGF0aW9uIG9mIGFycmF5X21lcmdlKCksIHRoYW5rcyB0byB3aG9jYXJleg0KCQkJCSMgKGh0
dHA6Ly9mb3J1bS50ZXh0cGF0dGVybi5jb20vdmlld3RvcGljLnBocD9waWQ9MjM4MzczI3Ay
MzgzNzMpDQoJCQkJZm9yZWFjaCh0cnVfdGFnc190cmltX3RhZ3MoJGFydGljbGVfdGFncykg
YXMgJGkpIHskYWxsX3RhZ3NbXSA9ICRpO30NCgkJCX0NCgkJfQ0KDQoJCSRhbHRfdGFnX3Bh
cmFtZXRlciA9IHN0cl9yZXBsYWNlKCctJywgJyAnLCAkdGFnX3BhcmFtZXRlcik7DQoJCWZv
cmVhY2ggKCRhbGxfdGFncyBhcyAka2V5ID0+ICR0YWcpIHsNCgkJCWlmICgkdGFnID09ICR0
YWdfcGFyYW1ldGVyIHx8ICR0YWcgPT0gJGFsdF90YWdfcGFyYW1ldGVyKSB7DQoJCQkJdW5z
ZXQoJGFsbF90YWdzWyRrZXldKTsNCgkJCX0NCgkJfQ0KDQoJCSRjbG91ZF9hdHRzID0gdHJ1
X3RhZ3NfZ2V0X3N0YW5kYXJkX2Nsb3VkX2F0dHMoJGF0dHMsIGZhbHNlLCBmYWxzZSk7DQoJ
CSRhbGxfdGFnc19mb3Jfd2VpZ2h0ID0gJGFsbF90YWdzOw0KCQlpZiAoJGNsb3VkX2F0dHNb
J3VzZW92ZXJhbGxjb3VudHMnXSkgew0KCQkJJGFsbF90YWdzX2Zvcl93ZWlnaHQgPSB0cnVf
dGFnc19jbG91ZF9xdWVyeSgkY2xvdWRfYXR0cyk7DQoJCX0NCg0KCQlyZXR1cm4gdHJ1X3Rh
Z3NfcmVuZGVyX2Nsb3VkKCRjbG91ZF9hdHRzLCAkYWxsX3RhZ3MsICRhbGxfdGFnc19mb3Jf
d2VpZ2h0KTsNCgl9IGVsc2Ugew0KCQlyZXR1cm4gJyc7DQoJfQ0KfQ0KDQoNCiMjIyBDTE9V
RCBTVVBQT1JUIEZVTkNUSU9OUyAjIyMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj
IyMNCg0KZnVuY3Rpb24gdHJ1X3RhZ3NfZ2V0X3N0YW5kYXJkX2Nsb3VkX2F0dHMoJGF0dHMs
ICRpc0xpc3QsICRpc0FydGljbGUsICRzaG93QWxsPWZhbHNlKSB7DQoJcmV0dXJuIGxBdHRz
KGFycmF5KCd3cmFwdGFnJwk9PiAoJGlzTGlzdCA/ICd1bCcgOiAnJyksDQoJCQknYnJlYWsn
CQk9PiAoJGlzTGlzdCA/ICdsaScgOiAnLCAnKSwNCgkJCSdjbGFzcycJCT0+ICcnLA0KCQkJ
J2JyZWFrY2xhc3MnCT0+ICcnLA0KCQkJJ3NlY3Rpb24nCT0+ICcnLA0KCQkJJ21pbnBlcmNl
bnQnCT0+ICcxMDAnLA0KCQkJJ21heHBlcmNlbnQnCT0+ICgkaXNMaXN0IHx8ICRpc0FydGlj
bGUgPyAnMTAwJyA6ICcyMDAnKSwNCgkJCSdzaG93Y291bnRzJwk9PiAnJywNCgkJCSdjb3Vu
dHdyYXBjaGFycycJPT4gJ1tdJywNCgkJCSd1c2VyZWx0YWcnCT0+ICgkaXNBcnRpY2xlID8g
JzEnIDogJycpLA0KCQkJJ2dlbmVyYXRlbGlua3MnCT0+ICcxJywNCgkJCSdtaW50YWdjb3Vu
dCcJPT4gJzAnLA0KCQkJJ21heHRhZ2NvdW50Jwk9PiAnMTAwMCcsDQoJCQknc2V0c2l6ZXMn
CT0+ICgkaXNBcnRpY2xlID8gJzAnIDogJzEnKSwNCgkJCSd1c2Vub2ZvbGxvdycJPT4gJycs
DQoJCQknc29ydCcJCT0+ICdhbHBoYScsDQoJCQkndXNlb3ZlcmFsbGNvdW50cycJPT4gJycs
DQoJCQknc2V0Y2xhc3NlcycJPT4gKCRpc0FydGljbGUgPyAnMCcgOiAnMScpLA0KCQkJJ3Rp
dGxlJwkJPT4gJycsDQoJCQknbGlzdGxpbWl0Jwk9PiAnJywNCgkJCSdrZWVwJwkJPT4gJ2xh
cmdlc3QnLA0KCQkJJ2N1dG9mZicJPT4gJ2NodW5rJywNCgkJCSd0ZXh0dHJhbnNmb3JtJwk9
PiAnbm9uZScsDQoJCQknbGlua3BhdGgnCT0+ICcnLA0KCQkJJ2xpbmtwYXRodGFpbCcJPT4g
JycsDQoJCQknZmlsdGVyc2VhcmNoJwk9PiAoJHNob3dBbGwgPyAwIDogJzEnKSwNCgkJCSdl
eGNsdWRlc2VjdGlvbic9PiAnJywNCgkJCSdhY3RpdmVjbGFzcycJPT4gJ3RhZ0FjdGl2ZScs
DQoJCQkndGltZScJCT0+ICgkc2hvd0FsbCA/ICdhbnknIDogJ3Bhc3QnKQ0KCQkpLCRhdHRz
LCAwKTsNCn0NCg0KDQpmdW5jdGlvbiB0cnVfdGFnc19jbG91ZF9xdWVyeSgkYXR0cykgew0K
CWV4dHJhY3QoJGF0dHMpOw0KDQoJJHNlY3Rpb25fY2xhdXNlID0gJyc7DQoJaWYgKCRzZWN0
aW9uIDw+ICcnKSB7DQoJCSRrZXlzID0gZXhwbG9kZSgnLCcsICRzZWN0aW9uKTsNCgkJZm9y
ZWFjaCAoJGtleXMgYXMgJGtleSkgew0KCQkJJGtleXBhcnRzW10gPSAiIFNlY3Rpb24gPSAn
IiAuIHRyaW0oJGtleSkgLiAiJyI7DQoJCX0NCgkJJHNlY3Rpb25fY2xhdXNlID0gIiBBTkQg
KCIgLiBqb2luKCcgb3IgJywgJGtleXBhcnRzKSAuICIpIjsNCgl9DQoNCgkkdGFnc19maWVs
ZCA9IFRSVV9UQUdTX0ZJRUxEOw0KCWluY2x1ZGVfb25jZSB0eHBhdGguJy9wdWJsaXNoL3Nl
YXJjaC5waHAnOw0KDQoJJGZpbHRlciA9IHRydV90YWdzX2ZpbHRlcl9zZWN0aW9ucygkZXhj
bHVkZXNlY3Rpb24pOw0KCSRmaWx0ZXIgLj0gKCRmaWx0ZXJzZWFyY2ggPyBmaWx0ZXJTZWFy
Y2goKSA6ICcnKTsNCg0KCXN3aXRjaCAoJHRpbWUpIHsNCgkJY2FzZSAnYW55JzoNCgkJCSR0
aW1lID0gIiI7IGJyZWFrOw0KCQljYXNlICdmdXR1cmUnOg0KCQkJJHRpbWUgPSAiIGFuZCBQ
b3N0ZWQgPiBub3coKSI7IGJyZWFrOw0KCQlkZWZhdWx0Og0KCQkJJHRpbWUgPSAiIGFuZCBQ
b3N0ZWQgPD0gbm93KCkiOw0KCX0NCglnbG9iYWwgJHByZWZzOw0KCWV4dHJhY3QoJHByZWZz
KTsNCglpZiAoISRwdWJsaXNoX2V4cGlyZWRfYXJ0aWNsZXMpIHsNCgkJJHRpbWUgLj0gIiBh
bmQgKG5vdygpIDw9IEV4cGlyZXMgb3IgRXhwaXJlcyBJUyBOVUxMKSI7DQoJfQ0KDQoJJGFs
bF90YWdzID0gYXJyYXkoKTsNCgkkcnMgPSBzYWZlX3Jvd3MoIiR0YWdzX2ZpZWxkIiwgInRl
eHRwYXR0ZXJuIiwgIiR0YWdzX2ZpZWxkIDw+ICcnIiAuICRzZWN0aW9uX2NsYXVzZSAuICRm
aWx0ZXIgLiAiIGFuZCBTdGF0dXMgPj0gJzQnIiAuICR0aW1lKTsNCglmb3JlYWNoICgkcnMg
YXMgJHJvdykgew0KCQkkdGVtcF9hcnJheSA9IGFycmF5KCk7DQoJCWlmIChpc3NldCgkcm93
WyR0YWdzX2ZpZWxkXSkpIHsNCgkJCSR0ZW1wX2FycmF5ID0gZXhwbG9kZSgiLCIsIHRyaW0o
dHJ1X3RhZ3Nfc3RydG9sb3dlcigkcm93WyR0YWdzX2ZpZWxkXSkpKTsNCgkJfQ0KCQkjIGZh
c3RlciBpbXBsZW1lbnRhdGlvbiBvZiBhcnJheV9tZXJnZSgpLCB0aGFua3MgdG8gd2hvY2Fy
ZXoNCgkJIyAoaHR0cDovL2ZvcnVtLnRleHRwYXR0ZXJuLmNvbS92aWV3dG9waWMucGhwP3Bp
ZD0yMzgzNzMjcDIzODM3MykNCgkJZm9yZWFjaCh0cnVfdGFnc190cmltX3RhZ3MoJHRlbXBf
YXJyYXkpIGFzICRpKSB7JGFsbF90YWdzW10gPSAkaTt9DQoJfQ0KDQoJcmV0dXJuICRhbGxf
dGFnczsNCn0NCg0KDQpmdW5jdGlvbiB0cnVfdGFnc19maWx0ZXJfc2VjdGlvbnMoJGV4Y2x1
ZGVzZWN0aW9uKSB7DQoJJHNlY3Rpb25zID0gZXhwbG9kZSgnLCcsICRleGNsdWRlc2VjdGlv
bik7DQoJJGZpbHRlcnMgPSBhcnJheSgpOw0KCWZvcmVhY2ggKCRzZWN0aW9ucyBhcyAkc2Vj
dGlvbikgew0KCQkkZmlsdGVyc1tdID0gImFuZCBTZWN0aW9uICE9ICciLmRvU2xhc2goJHNl
Y3Rpb24pLiInIjsNCgl9DQoJcmV0dXJuIGpvaW4oJyAnLCAkZmlsdGVycyk7DQp9DQoNCg0K
ZnVuY3Rpb24gdHJ1X3RhZ3NfcmVuZGVyX2Nsb3VkKCRhdHRzLCAkYWxsX3RhZ3MsICRhbGxf
dGFnc19mb3Jfd2VpZ2h0KSB7DQoJZ2xvYmFsICR0cnVfdGFnc19wcmVmczsNCglleHRyYWN0
KCRhdHRzKTsNCg0KCSR0YWdzX3dlaWdodCA9IGFycmF5X2NvdW50X3ZhbHVlcygkYWxsX3Rh
Z3NfZm9yX3dlaWdodCk7DQoNCglmb3JlYWNoICgkdGFnc193ZWlnaHQgYXMgJHRhZyA9PiAk
d2VpZ2h0KSB7DQoJCWlmICghaW5fYXJyYXkoJHRhZywgJGFsbF90YWdzKQ0KCQkgICB8fCAk
dGFnc193ZWlnaHRbJHRhZ10gPCAkbWludGFnY291bnQNCgkJICAgfHwgJHRhZ3Nfd2VpZ2h0
WyR0YWddID4gJG1heHRhZ2NvdW50KSB7DQoJCQl1bnNldCgkdGFnc193ZWlnaHRbJHRhZ10p
Ow0KCQl9DQoJfQ0KDQoJJHNvcnRfYnlfY291bnQgPSAoc3RycG9zKCRzb3J0LCAnY291bnQn
KSAhPT0gZmFsc2UpOw0KCSRzb3J0X2FzY2VuZGluZyA9IChzdHJwb3MoJHNvcnQsICdhc2Mn
KSAhPT0gZmFsc2UpOw0KCSR0YWdzX3dlaWdodCA9IHRydV90YWdzX3NvcnRfdGFncygkdGFn
c193ZWlnaHQsICRzb3J0X2J5X2NvdW50LCAkc29ydF9hc2NlbmRpbmcpOw0KDQoJaWYgKCRs
aXN0bGltaXQgPiAwICYmICRsaXN0bGltaXQgPCBjb3VudCgkdGFnc193ZWlnaHQpKSB7DQoJ
CSRyZXNvcnRlZF90YWdzID0gYXJyYXkoKTsNCgkJaWYgKCRrZWVwID09ICdsYXJnZXN0Jykg
ew0KCQkJJHJlc29ydGVkX3RhZ3MgPSBhcnJheV9rZXlzKHRydV90YWdzX3NvcnRfdGFncygk
dGFnc193ZWlnaHQsIHRydWUsIGZhbHNlKSk7DQoJCX0gZWxzZSB7DQoJCQlpZiAoJGtlZXAg
PT0gJ3JhbmRvbScpIHsNCgkJCQlmb3JlYWNoICgkdGFnc193ZWlnaHQgYXMgJHRhZyA9PiAk
d2VpZ2h0KSB7DQoJCQkJCSRyZXNvcnRlZF90YWdzWyR0YWddID0gcmFuZCgwLCAkd2VpZ2h0
KTsNCgkJCQl9DQoJCQkJJHJlc29ydGVkX3RhZ3MgPSBhcnJheV9rZXlzKHRydV90YWdzX3Nv
cnRfdGFncygkcmVzb3J0ZWRfdGFncywgdHJ1ZSwgZmFsc2UpKTsNCgkJCX0gZWxzZSBpZiAo
JGtlZXAgPT0gJ2FscGhhJykgew0KCQkJCSRyZXNvcnRlZF90YWdzID0gYXJyYXlfa2V5cygk
dGFnc193ZWlnaHQpOw0KCQkJCW5hdGNhc2Vzb3J0KCRyZXNvcnRlZF90YWdzKTsNCgkJCX0N
CgkJCSRjdXRvZmYgPSAnZXhhY3QnOw0KCQl9DQoNCgkJJGxhc3RfZ29vZF9pbmRleCA9ICRs
aXN0bGltaXQgLSAxOw0KCQlpZiAoJGN1dG9mZiA9PSAnY2h1bmsnKSB7IC8vYWx0ZXJuYXRp
dmUgaXMgJ2V4YWN0Jw0KCQkJJGxhc3Rfd2VpZ2h0ID0gLTE7DQoJCQlmb3IgKCRpID0gMDsg
JGkgPCAkbGlzdGxpbWl0ICsgMTsgJGkrKykgew0KCQkJCSRuZXdfd2VpZ2h0ID0gJHRhZ3Nf
d2VpZ2h0WyRyZXNvcnRlZF90YWdzWyRpXV07DQoJCQkJaWYgKCRuZXdfd2VpZ2h0ICE9ICRs
YXN0X3dlaWdodCkgew0KCQkJCQkkbGFzdF9nb29kX2luZGV4ID0gJGkgLSAxOw0KCQkJCQkk
bGFzdF93ZWlnaHQgPSAkbmV3X3dlaWdodDsNCgkJCQl9DQoJCQl9DQoJCQlpZiAoJGxhc3Rf
Z29vZF9pbmRleCA8IDApIHsNCgkJCQkkbGFzdF9nb29kX2luZGV4ID0gJGxpc3RsaW1pdCAt
IDE7DQoJCQl9DQoJCX0NCg0KCQkkcmVzb3J0ZWRfdGFncyA9IGFycmF5X2NodW5rKCRyZXNv
cnRlZF90YWdzLCAkbGFzdF9nb29kX2luZGV4ICsgMSk7DQoJCSRyZXNvcnRlZF90YWdzID0g
JHJlc29ydGVkX3RhZ3NbMF07DQoNCgkJZm9yZWFjaCAoJHRhZ3Nfd2VpZ2h0IGFzICR0YWcg
PT4gJHdlaWdodCkgew0KCQkJaWYgKCFpbl9hcnJheSgkdGFnLCAkcmVzb3J0ZWRfdGFncykp
IHsNCgkJCQl1bnNldCgkdGFnc193ZWlnaHRbJHRhZ10pOw0KCQkJfQ0KCQl9DQoJfQ0KDQoJ
aWYgKCRnZW5lcmF0ZWxpbmtzKSB7DQoJCWlmICgkbGlua3BhdGgpIHsNCgkJCSR1cmxwcmVm
aXggPSAkbGlua3BhdGg7DQoJCQkkdXJsc3VmZml4ID0gJGxpbmtwYXRodGFpbDsNCgkJfSBl
bHNlIHsNCgkJCWlmICh0cnVfdGFnc19jbGVhbl91cmxzKCkpIHsNCgkJCQkkdXJscHJlZml4
ID0gaHUgLiAkdHJ1X3RhZ3NfcHJlZnNbVEFHX1NFQ1RJT05dLT52YWx1ZSAuICcvJzsNCgkJ
CX0gZWxzZSB7DQoJCQkJJHVybHByZWZpeCA9IGh1IC4gJz9zPScgLiAkdHJ1X3RhZ3NfcHJl
ZnNbVEFHX1NFQ1RJT05dLT52YWx1ZSAuICcmYW1wOycgLiAkdHJ1X3RhZ3NfcHJlZnNbUEFS
TV9OQU1FXS0+dmFsdWUgLiAnPSc7DQoJCQl9DQoJCQkkdXJsc3VmZml4ID0gKHRydV90YWdz
X2NsZWFuX3VybHMoKSA/ICcvJyA6ICcnKTsNCgkJfQ0KDQoJCWlmICgkdXNlcmVsdGFnKSB7
DQoJCQlpZiAoJHVzZW5vZm9sbG93KSB7DQoJCQkJJHVybHN1ZmZpeCAuPSAnIiByZWw9InRh
ZyBub2ZvbGxvdyc7DQoJCQl9IGVsc2Ugew0KCQkJCSR1cmxzdWZmaXggLj0gJyIgcmVsPSJ0
YWcnOw0KCQkJfQ0KCQl9IGVsc2UgaWYgKCR1c2Vub2ZvbGxvdykgew0KCQkJJHVybHN1ZmZp
eCAuPSAnIiByZWw9Im5vZm9sbG93JzsNCgkJfQ0KCX0NCg0KCWlmIChjb3VudCgkdGFnc193
ZWlnaHQpID4gMCkgew0KCQkkbWF4ID0gbWF4KCR0YWdzX3dlaWdodCk7DQoJCSRtaW4gPSBt
aW4oJHRhZ3Nfd2VpZ2h0KTsNCgl9IGVsc2Ugew0KCQkkbWF4ID0gJG1pbiA9IDA7DQoJfQ0K
CSRzdGVwdmFsdWUgPSAoJG1heCA9PSAkbWluKSA/IDAgOiAoJG1heHBlcmNlbnQgLSAkbWlu
cGVyY2VudCkgLyAoJG1heCAtICRtaW4pOw0KDQoJJHRhZ3NfaHRtbCA9IGFycmF5KCk7DQoJ
JHRhZ19zZWFyY2hfdGFnID0gdHJ1X3RhZ3NfdGFnX3BhcmFtZXRlcihhcnJheSgnc3RyaXBo
eXBoZW5zJyA9PiAnbG9va3VwJykpOw0KCSR0YWdfc2VhcmNoX3RhZyA9IGZ1bmN0aW9uX2V4
aXN0cygiaHRtbHNwZWNpYWxjaGFyc19kZWNvZGUiKSA/IGh0bWxzcGVjaWFsY2hhcnNfZGVj
b2RlKCR0YWdfc2VhcmNoX3RhZykgOiBodG1sX2VudGl0eV9kZWNvZGUoJHRhZ19zZWFyY2hf
dGFnKTsNCglmb3JlYWNoICgkdGFnc193ZWlnaHQgYXMgJHRhZyA9PiAkd2VpZ2h0KSB7DQoJ
CSR0YWdfd2VpZ2h0ID0gZmxvb3IoJG1pbnBlcmNlbnQgKyAoJHdlaWdodCAtICRtaW4pICog
JHN0ZXB2YWx1ZSk7DQoNCgkJJHN0eWxlID0gJyc7DQoJCWlmICgkc2V0c2l6ZXMpDQoJCQkk
c3R5bGUgPSAnIHN0eWxlPSJmb250LXNpemU6ICcgLiAkdGFnX3dlaWdodCAuICclOyInOw0K
DQoJCSR0YWdfY2xhc3MgPSAnJzsNCgkJaWYgKCRzZXRjbGFzc2VzKSB7DQoJCQkkdGFnX2Ns
YXNzID0gJyBjbGFzcz0iJzsNCgkJCWlmICgkd2VpZ2h0ID09ICRtaW4pIHsNCgkJCQkkdGFn
X2NsYXNzIC49ICJ0YWdTaXplU21hbGxlc3QiOw0KCQkJfSBlbHNlIGlmICgkd2VpZ2h0ID09
ICRtYXgpIHsNCgkJCQkkdGFnX2NsYXNzIC49ICJ0YWdTaXplTGFyZ2VzdCI7DQoJCQl9IGVs
c2Ugew0KCQkJCSR0YWdfY2xhc3MgLj0gInRhZ1NpemVNZWRpdW0iOw0KCQkJfQ0KCQkJJHRh
Z19jbGFzcyAuPSAnIHRhZ1NpemUnIC4gKCR3ZWlnaHQgKyAxIC0gJG1pbik7DQoJCQlpZiAo
JHRhZyA9PSAkdGFnX3NlYXJjaF90YWcpIHsNCgkJCQkkdGFnX2NsYXNzIC49ICcgJyAuICRh
Y3RpdmVjbGFzczsNCgkJCX0NCgkJCSR0YWdfY2xhc3MgLj0gJyInOw0KCQl9DQoNCgkJLy9h
ZGFwdGVkIGZyb20gY29kZSBieSBnZHRyb2lhbm8sIHNlZSBodHRwOi8vZm9ydW0udGV4dHBh
dHRlcm4uY29tL3ZpZXd0b3BpYy5waHA/cGlkPTEwMjg3NSNwMTAyODc1DQoJCSR0aXRsZWNv
dW50ID0gJyc7DQoJCWlmICgkdGl0bGUpDQoJCQkkdGl0bGVjb3VudCA9ICcgdGl0bGU9Iicg
LiAkdGl0bGUgLiAnIic7DQoJCSRkaXNwbGF5Y291bnQ9ICcnOw0KCQkkY291bnQgPSAkY291
bnR3cmFwY2hhcnN7MH0gLiAkd2VpZ2h0IC4gJGNvdW50d3JhcGNoYXJzezF9Ow0KCQlpZiAo
JHNob3djb3VudHMgPT0gJ3RpdGxlJyB8fCAkc2hvd2NvdW50cyA9PSAnYm90aCcpDQoJCQkk
dGl0bGVjb3VudCA9ICcgdGl0bGU9IicgLiAkdGl0bGUgLiAkY291bnQgLiAnIic7DQoJCWlm
ICgkc2hvd2NvdW50cyAmJiAkc2hvd2NvdW50cyAhPSAndGl0bGUnKQ0KCQkJJGRpc3BsYXlj
b3VudCA9ICcgJyAuICRjb3VudDsNCg0KCQlpZiAoJHRleHR0cmFuc2Zvcm0gPT0gJ2NhcGl0
YWxpemUnKSB7DQoJCQkkdGFnID0gdHJ1X3RhZ3NfdWN3b3JkcygkdGFnKTsNCgkJfSBlbHNl
IGlmICgkdGV4dHRyYW5zZm9ybSA9PSAndXBwZXJjYXNlJykgew0KCQkJJHRhZyA9IHRydV90
YWdzX3N0cnRvdXBwZXIoJHRhZyk7DQoJCX0gZWxzZSBpZiAoJHRleHR0cmFuc2Zvcm0gPT0g
J2xvd2VyY2FzZScpIHsNCgkJCSR0YWcgPSB0cnVfdGFnc19zdHJ0b2xvd2VyKCR0YWcpOw0K
CQl9IGVsc2UgaWYgKCR0ZXh0dHJhbnNmb3JtID09ICdjYXBmaXJzdCcpIHsNCgkJCSR0YWcg
PSB0cnVfdGFnc191Y2ZpcnN0KCR0YWcpOw0KCQl9DQoNCgkJaWYgKCRnZW5lcmF0ZWxpbmtz
KSB7DQoJCQkkd2hvbGV1cmwgPSAnIicgLiAkdXJscHJlZml4IC4gdXJsZW5jb2RlKCR0YWcp
IC4gJHVybHN1ZmZpeCAuICciJzsNCgkJCSR0YWdzX2h0bWxbXSA9ICc8YSBocmVmPScgLiAk
d2hvbGV1cmwgLiAkdGFnX2NsYXNzIC4gJHN0eWxlIC4gJHRpdGxlY291bnQgLiAnPicgLiBo
dG1sc3BlY2lhbGNoYXJzKCR0YWcpIC4gJzwvYT4nIC4gJGRpc3BsYXljb3VudDsNCgkJfSBl
bHNlIGlmICgkdGFnX2NsYXNzIHx8ICRzdHlsZSB8fCAkdGl0bGVjb3VudCkgew0KCQkJJHRh
Z3NfaHRtbFtdID0gJzxzcGFuJyAuICR0YWdfY2xhc3MgLiAkc3R5bGUgLiAkdGl0bGVjb3Vu
dCAuICc+JyAuIGh0bWxzcGVjaWFsY2hhcnMoJHRhZykgLiAnPC9zcGFuPicgLiAkZGlzcGxh
eWNvdW50Ow0KCQl9IGVsc2Ugew0KCQkJJHRhZ3NfaHRtbFtdID0gaHRtbHNwZWNpYWxjaGFy
cygkdGFnKSAuICRkaXNwbGF5Y291bnQ7DQoJCX0NCgl9DQoJcmV0dXJuIHRydV90YWdzX2Rv
X3dyYXAoJHRhZ3NfaHRtbCwgJHdyYXB0YWcsICRicmVhaywgJGNsYXNzLCAkYnJlYWtjbGFz
cyk7DQp9DQoNCg0KIyMjIENMRUFOIFVSTCBGVU5DVElPTlMgIyMjDQojIyMjIyMjIyMjIyMj
IyMjIyMjIyMjIyMjIyMNCg0KaWYgKHRydV90YWdzX2NsZWFuX3VybHMoKSkgew0KCXJlZ2lz
dGVyX2NhbGxiYWNrKCd0cnVfdGFnc19jbGVhbl91cmxfaGFuZGxlcicsICdwcmV0ZXh0Jywg
JycsIDApOw0KfQ0KDQoNCmZ1bmN0aW9uIHRydV90YWdzX2NsZWFuX3VybF9oYW5kbGVyKCRl
dmVudCwgJHN0ZXApIHsNCglnbG9iYWwgJHByZXRleHQsICR0cnVfdGFnc19wcmVmczsNCg0K
CWlmICgkcHJldGV4dFswXSA+PSAyICYmICRwcmV0ZXh0WzFdID09ICR0cnVfdGFnc19wcmVm
c1tUQUdfU0VDVElPTl0tPnZhbHVlKSB7DQoJCSR0YWcgPSAkcHJldGV4dFsyXTsNCgkJaWYg
KGNvdW50KCRfUE9TVCkgPiAwKSB7DQoJCQkkX1BPU1RbJ3NlY3Rpb24nXSA9ICR0cnVfdGFn
c19wcmVmc1tUQUdfU0VDVElPTl0tPnZhbHVlOw0KCQkJJF9QT1NUWyR0cnVfdGFnc19wcmVm
c1tQQVJNX05BTUVdLT52YWx1ZV0gPSAkdGFnOw0KCQl9IGVsc2Ugew0KCQkJJF9HRVRbJ3Nl
Y3Rpb24nXSA9ICR0cnVfdGFnc19wcmVmc1tUQUdfU0VDVElPTl0tPnZhbHVlOw0KCQkJJF9H
RVRbJHRydV90YWdzX3ByZWZzW1BBUk1fTkFNRV0tPnZhbHVlXSA9ICR0YWc7DQoJCX0NCgkJ
JHByZXRleHRbJ3MnXSA9ICR0cnVfdGFnc19wcmVmc1tUQUdfU0VDVElPTl0tPnZhbHVlOw0K
CX0NCn0NCg0KDQpmdW5jdGlvbiB0cnVfdGFnc19jbGVhbl91cmxzKCkgew0KCWdsb2JhbCAk
dHJ1X3RhZ3NfcHJlZnM7DQoJcmV0dXJuICgnY2xlYW4nID09ICR0cnVfdGFnc19wcmVmc1tD
TEVBTl9VUkxTXS0+dmFsdWUpOw0KfQ0KDQoNCiMjIyBBRE1JTiBTSURFIEZVTkNUSU9OUyAj
IyMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCg0KaWYgKEB0eHBpbnRlcmZhY2Ug
PT0gJ2FkbWluJykgew0KCWFkZF9wcml2cygndHJ1X3RhZ3MnLCAnMSwyJyk7DQoJcmVnaXN0
ZXJfdGFiKCdleHRlbnNpb25zJywgJ3RydV90YWdzJywgJ3RydV90YWdzJyk7DQoJcmVnaXN0
ZXJfY2FsbGJhY2soJ3RydV90YWdzX2FkbWluX3RhYicsICd0cnVfdGFncycpOw0KDQoJaWYg
KCR0cnVfdGFnc19wcmVmc1tUQUdTX0lOX1dSSVRFX1RBQl0tPnZhbHVlIHx8ICR0cnVfdGFn
c19wcmVmc1tBVVRPQ09NUExFVEVfSU5fV1JJVEVfVEFCXS0+dmFsdWUpIHsNCgkJcmVnaXN0
ZXJfY2FsbGJhY2soJ3RydV90YWdzX2FkbWluX3dyaXRlX3RhYl9oYW5kbGVyJywgJ2FydGlj
bGVfdWknLCAna2V5d29yZHMnKTsNCgl9DQp9DQoNCg0KZnVuY3Rpb24gdHJ1X3RhZ3NfYWRt
aW5fdGFiKCRldmVudCwgJHN0ZXApIHsNCglyZXF1aXJlX3ByaXZzKCd0cnVfdGFncycpOw0K
DQoJJHJlc3VsdHMgPSB0cnVfdGFnc19hZG1pbl90YWJfaGFuZGxlX2lucHV0KCk7DQoNCgkk
YXR0cyA9IHRydV90YWdzX2dldF9zdGFuZGFyZF9jbG91ZF9hdHRzKGFycmF5KCksIGZhbHNl
LCBmYWxzZSwgdHJ1ZSk7DQoJJGFsbF90YWdzID0gdHJ1X3RhZ3NfY2xvdWRfcXVlcnkoJGF0
dHMpOw0KCSRjbG91ZCA9IHRydV90YWdzX3JlbmRlcl9jbG91ZCgkYXR0cywgJGFsbF90YWdz
LCAkYWxsX3RhZ3MpOw0KDQoJJHJlZGlyZWN0cyA9IHRydV90YWdzX2xvYWRfcmVkaXJlY3Rz
KCk7DQoNCgl0cnVfdGFnc19hZG1pbl90YWJfcmVuZGVyX3BhZ2UoJHJlc3VsdHMsICRjbG91
ZCwgJHJlZGlyZWN0cyk7DQp9DQoNCg0KZnVuY3Rpb24gdHJ1X3RhZ3NfYWRtaW5fdGFiX3Jl
bmRlcl9wYWdlKCRyZXN1bHRzLCAkY2xvdWQsICRyZWRpcmVjdHMpIHsNCglnbG9iYWwgJGV2
ZW50Ow0KCXBhZ2V0b3AoJ3RydV90YWdzJywgJycpOw0KDQoJaW5jbHVkZV9vbmNlKHR4cGF0
aCAuICcvaW5jbHVkZS90eHBfcHJlZnMucGhwJyk7DQoJZ2xvYmFsICR0cnVfdGFnc19wcmVm
czsNCg0KCWVjaG8gc3RhcnRUYWJsZSgnbGF5b3V0JywgJycsICcnLCAnMTBweCcpLic8dHI+
PHRkIHN0eWxlPSJib3JkZXItcmlnaHQ6MnB4IHNvbGlkIGdyYXkiPicuICAjIEkga25vdywg
SSBrbm93Li4uDQoJCXN0YXJ0VGFibGUoJ2xheW91dCcsICcnLCAnJywgJycsICcxMHB4Jyku
Jzx0cj48dGQgc3R5bGU9ImJvcmRlci1ib3R0b206MnB4IHNvbGlkIGdyYXkiPicuDQoJCQlz
dGFydFRhYmxlKCdsaXN0JywgJycsICcnLCAnJywgJzMwMHB4JykuDQoJCQkJdHIoaENlbGwo
Z1R4dCgnQ3VycmVudCB0YWdzJykpKS4NCgkJCQl0cih0ZCgkY2xvdWQpKS4NCgkJCWVuZFRh
YmxlKCkuDQoJCSc8L3RkPjwvdHI+PHRyPjx0ZD4nLg0KCQkJc3RhcnRUYWJsZSgnbGlzdCcs
ICcnLCAnJywgJycsICczMDBweCcpLg0KCQkJCXRyKGhDZWxsKGdUeHQoJ3RydV90YWdzIFJl
ZmVyZW5jZScpKSkuDQoJCQkJdHIodGQoJzxhIGhyZWY9Imh0dHA6Ly93d3cucmFpbnNraXQu
Y29tL3JlZmVyZW5jZS80OTcvdHJ1dGFncy11c2FnZS1pbnN0cnVjdGlvbnMiPlVzYWdlIGlu
c3RydWN0aW9uczwvYT4nLg0KCQkJCSc8YnI+PGEgaHJlZj0iaHR0cDovL2ZvcnVtLnRleHRw
YXR0ZXJuLmNvbS92aWV3dG9waWMucGhwP2lkPTE1MDg0Ij5Gb3J1bSBwYWdlczwvYT4nLg0K
CQkJCSc8YnI+PGEgaHJlZj0iaHR0cDovL3d3dy5yYWluc2tpdC5jb20vcmVmZXJlbmNlLzUz
Ny90cnVfdGFncy1yZWxlYXNlcyI+UmVsZWFzZXMgcGFnZTwvYT4nLg0KCQkJCSc8YnI+PGEg
aHJlZj0iaHR0cDovL3d3dy5yYWluc2tpdC5jb20vcmVmZXJlbmNlLzU1NC90cnVfdGFncy1y
b2FkbWFwIj5SZWxlYXNlIHJvYWRtYXA8L2E+Jy4NCgkJCQknPGJyPjxhIGhyZWY9Imh0dHA6
Ly93d3cucmFpbnNraXQuY29tL3JlZmVyZW5jZS80OTUvdHJ1dGFncy1mZWF0dXJlLWxpc3Qi
PkZlYXR1cmUgbGlzdDwvYT4nLg0KCQkJCSc8YnI+PGJyPjxhIGhyZWY9Imh0dHBzOi8vZ2l0
aHViLmNvbS90cnVpc3QvdHJ1LXRhZ3MvYmxvYi9tYXN0ZXIvdHJ1X3RhZ3MucGhwIj50cnVf
dGFncyBzb3VyY2UgY29kZTwvYT4nLg0KCQkJCSc8YnI+PGEgaHJlZj0iaHR0cHM6Ly9naXRo
dWIuY29tL3RydWlzdC90cnUtdGFncy9ibG9iL21hc3Rlci90cnVfdGFncy1kb2NzLmh0bWwi
PlNvdXJjZSBIVE1MIGZvciB0aGUgdXNhZ2UgaW5zdHJ1Y3Rpb25zPC9hPicuDQoJCQkJJzxi
cj48YnI+PGEgaHJlZj0iaHR0cDovL3d3dy5yYWluc2tpdC5jb20vYmxvZy80OTMvdHJ1dGFn
cy1hLXRhZ2dpbmctcGx1Z2luLWZvci10ZXh0cGF0dGVybiI+dHJ1X3RhZ3M8L2E+LCBieSA8
YSBocmVmPSJodHRwOi8vd3d3LnJhaW5za2l0LmNvbS8iPk5hdGhhbiBBcnRodXI8L2E+Jy4N
CgkJCQknPGJyPjxicj4nLg0KCQkJCSc8ZGl2IGlkPSJwYXlwYWwiPjxmb3JtIGFjdGlvbj0i
aHR0cHM6Ly93d3cucGF5cGFsLmNvbS9jZ2ktYmluL3dlYnNjciIgbWV0aG9kPSJwb3N0Ij48
aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJjbWQiIHZhbHVlPSJfcy14Y2xpY2siIC8+PGlu
cHV0IHR5cGU9ImltYWdlIiBzcmM9Imh0dHBzOi8vd3d3LnBheXBhbC5jb20vZW5fVVMvaS9i
dG4veC1jbGljay1idXQwNC5naWYiIG5hbWU9InN1Ym1pdCIgYWx0PSJNYWtlIGEgZG9uYXRp
b24gdG8gTmF0aGFuIEFydGh1ciIgLz48aW1nIGFsdD0iIiBib3JkZXI9IjAiIHNyYz0iaHR0
cHM6Ly93d3cucGF5cGFsLmNvbS9lbl9VUy9pL3Njci9waXhlbC5naWYiIHdpZHRoPSIxIiBo
ZWlnaHQ9IjEiIC8+PGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iZW5jcnlwdGVkIiB2YWx1
ZT0iLS0tLS1CRUdJTiBQS0NTNy0tLS0tTUlJSFR3WUpLb1pJaHZjTkFRY0VvSUlIUURDQ0J6
d0NBUUV4Z2dFd01JSUJMQUlCQURDQmxEQ0JqakVMTUFrR0ExVUVCaE1DVlZNeEN6QUpCZ05W
QkFnVEFrTkJNUll3RkFZRFZRUUhFdzFOYjNWdWRHRnBiaUJXYVdWM01SUXdFZ1lEVlFRS0V3
dFFZWGxRWVd3Z1NXNWpMakVUTUJFR0ExVUVDeFFLYkdsMlpWOWpaWEowY3pFUk1BOEdBMVVF
QXhRSWJHbDJaVjloY0dreEhEQWFCZ2txaGtpRzl3MEJDUUVXRFhKbFFIQmhlWEJoYkM1amIy
MENBUUF3RFFZSktvWklodmNOQVFFQkJRQUVnWUM4aTFUMjdsaktmcE5URVFpMHdLSGNkR3Vs
eHhrTXF3ZENNbWJHdnM4N24vNFRzSnRpQXNxTW8yaHlzN1pzR3k1UkYvTzdzK0Iyb1E3NnpV
bFQ1MldXN1FlWFVLM0dwMG5yMmNQM2lvQlN0TnUrUlo2amthbTJFMEZHTFh5VjYrVU5WRU93
aDhsbW9JU1JvdHZTdklnUXlUTG5FZURIcUc5cXZVenF2RjNTcWpFTE1Ba0dCU3NPQXdJYUJR
QXdnY3dHQ1NxR1NJYjNEUUVIQVRBVUJnZ3Foa2lHOXcwREJ3UUlwbVBacmxyWmZabUFnYWll
UFZiK245c1Zkc3VmZ0dybUF3MnJYQXpSMzlrWXFQVUo3bjBMaU5EbWRBcTczSm9QNTNrWnk4
Z1Nwb3Z1Y0wyUzBqQzFzWHJjcEVMQXBMTDhCRlNIZmRMaVpvWlNWL0NZT3BwSDUrZHgyWXFG
SWR5Q0NkaklYN29PUGdReUF1Z1JhMlFyM2IreXV0dUcwREZzZCtMQUpHYjhsNENubnJibXdk
WUszTm5WREJQT214RU9qbFhVZ0V6bEZMWG1FM3c1K01vUEtRY3AybjhmZEpMc2dHMTV4b1ZQ
RnpDZC9LMmdnZ09ITUlJRGd6Q0NBdXlnQXdJQkFnSUJBREFOQmdrcWhraUc5dzBCQVFVRkFE
Q0JqakVMTUFrR0ExVUVCaE1DVlZNeEN6QUpCZ05WQkFnVEFrTkJNUll3RkFZRFZRUUhFdzFO
YjNWdWRHRnBiaUJXYVdWM01SUXdFZ1lEVlFRS0V3dFFZWGxRWVd3Z1NXNWpMakVUTUJFR0Ex
VUVDeFFLYkdsMlpWOWpaWEowY3pFUk1BOEdBMVVFQXhRSWJHbDJaVjloY0dreEhEQWFCZ2tx
aGtpRzl3MEJDUUVXRFhKbFFIQmhlWEJoYkM1amIyMHdIaGNOTURRd01qRXpNVEF4TXpFMVdo
Y05NelV3TWpFek1UQXhNekUxV2pDQmpqRUxNQWtHQTFVRUJoTUNWVk14Q3pBSkJnTlZCQWdU
QWtOQk1SWXdGQVlEVlFRSEV3MU5iM1Z1ZEdGcGJpQldhV1YzTVJRd0VnWURWUVFLRXd0UVlY
bFFZV3dnU1c1akxqRVRNQkVHQTFVRUN4UUtiR2wyWlY5alpYSjBjekVSTUE4R0ExVUVBeFFJ
YkdsMlpWOWhjR2t4SERBYUJna3Foa2lHOXcwQkNRRVdEWEpsUUhCaGVYQmhiQzVqYjIwd2da
OHdEUVlKS29aSWh2Y05BUUVCQlFBRGdZMEFNSUdKQW9HQkFNRkhUdDM4Uk14TFhKeU8yU21T
K05kbDcyVDdvS0o0dTR1dys2YXdudEFMV2gwM1Bld21JSnV6YkFMU2NzVFM0c1pvUzFmS2Np
QkdvaDExZ0lmSHp5bHZrZE5lL2hKbDY2L1JHcXJqNXJGYjA4c0FBQk5UekRUaXFxTnBKZUJz
WXMvYzJhaUdvenB0WDJSbG5Ca3RIK1NVTnBBYWpXNzI0TnYyV3ZoaWY2c0ZBZ01CQUFHamdl
NHdnZXN3SFFZRFZSME9CQllFRkphZmZMdkdieGU5V1Q5UzF3b2I3QkRXWkpSck1JRzdCZ05W
SFNNRWdiTXdnYkNBRkphZmZMdkdieGU5V1Q5UzF3b2I3QkRXWkpScm9ZR1VwSUdSTUlHT01R
c3dDUVlEVlFRR0V3SlZVekVMTUFrR0ExVUVDQk1DUTBFeEZqQVVCZ05WQkFjVERVMXZkVzUw
WVdsdUlGWnBaWGN4RkRBU0JnTlZCQW9UQzFCaGVWQmhiQ0JKYm1NdU1STXdFUVlEVlFRTEZB
cHNhWFpsWDJObGNuUnpNUkV3RHdZRFZRUURGQWhzYVhabFgyRndhVEVjTUJvR0NTcUdTSWIz
RFFFSkFSWU5jbVZBY0dGNWNHRnNMbU52YllJQkFEQU1CZ05WSFJNRUJUQURBUUgvTUEwR0NT
cUdTSWIzRFFFQkJRVUFBNEdCQUlGZk9sYWFnRnJsNzEranE2T0tpZGJXRlNFK1E0RnFST3Zk
Z0lPTnRoKzhrU0svL1kvNGlodUU0WW12em41Y2VFM1MvaUJTUVFNanl2YitzMlRXYlFZRHdj
cDEyOU9QSWJEOWVwZHI0dEpPVU5pU29qdzdCSHdZUmlQaDU4UzF4R2xGZ0hGWHdyRUJiM2Rn
TmJNVWErdTRxZWN0c01BWHBWSG5EOXdJeWZtSE1ZSUJtakNDQVpZQ0FRRXdnWlF3Z1k0eEN6
QUpCZ05WQkFZVEFsVlRNUXN3Q1FZRFZRUUlFd0pEUVRFV01CUUdBMVVFQnhNTlRXOTFiblJo
YVc0Z1ZtbGxkekVVTUJJR0ExVUVDaE1MVUdGNVVHRnNJRWx1WXk0eEV6QVJCZ05WQkFzVUNt
eHBkbVZmWTJWeWRITXhFVEFQQmdOVkJBTVVDR3hwZG1WZllYQnBNUnd3R2dZSktvWklodmNO
QVFrQkZnMXlaVUJ3WVhsd1lXd3VZMjl0QWdFQU1Ba0dCU3NPQXdJYUJRQ2dYVEFZQmdrcWhr
aUc5dzBCQ1FNeEN3WUpLb1pJaHZjTkFRY0JNQndHQ1NxR1NJYjNEUUVKQlRFUEZ3MHdPREEz
TURNd05ERTBNVEphTUNNR0NTcUdTSWIzRFFFSkJERVdCQlQwdGtqNGRaTGUvRTRRd2JpYjI5
WEVkSHhBWWpBTkJna3Foa2lHOXcwQkFRRUZBQVNCZ0w1SnNRSGpROVNnNFkzZURXS0RPMTZy
K3RmRXo0UllBRHQrNmg5ODFma1ZDeGZOSEZEeG9mRGN4eXpSTVlyN3k5NWNkblZpNEFOUXdN
VVk2eUpXNWptL0dEMTdyamdTeFpNRXZzQWU2WWNDU0xLNVphcEN3MXFseVNwUEdaQkEzTVR0
Nk9EK292Vm9hLzF2OENOc0VjSHA3ZjR0T3hPVVN3NVA0bkh5TFBXai0tLS0tRU5EIFBLQ1M3
LS0tLS0iPjwvZm9ybT48L2Rpdj4nDQoJCQkJKSkuDQoJCQllbmRUYWJsZSgpLg0KCQknPC90
ZD48L3RyPicuZW5kVGFibGUoKS4NCgknPC90ZD48dGQ+Jy4NCgkJc3RhcnRUYWJsZSgnbGF5
b3V0JywgJycsICcnLCAnMTBweCcpLic8dHI+PHRkIHN0eWxlPSJib3JkZXItYm90dG9tOjJw
eCBzb2xpZCBncmF5O3dpZHRoOjQwMHB4Ij4nOw0KDQoJCWlmICgkcmVzdWx0cykgew0KCQkJ
ZWNobyBzdGFydFRhYmxlKCdsaXN0JywgJycsICcnLCAnJywgJzEwMCUnKS4NCgkJCQl0ciho
Q2VsbChnVHh0KCdSZXN1bHRzJykpKS4NCgkJCQl0cih0ZGEoJHJlc3VsdHMpLCAnIHN0eWxl
PSJjb2xvcjpyZWQiJykuDQoJCQllbmRUYWJsZSgpOw0KCQkJZWNobyAnPC90ZD48L3RyPjx0
cj48dGQgc3R5bGU9ImJvcmRlci1ib3R0b206MnB4IHNvbGlkIGdyYXkiPic7DQoJCX0NCg0K
DQoJCWVjaG8gc3RhcnRUYWJsZSgnbGlzdCcsICcnLCAnJywgJycsICcxMDAlJykuDQoJCQl0
cih0YWcoZ1R4dCgnQXJ0aWNsZSBUYWcgTWFpbnRlbmFuY2UnKS4nICgnLmdUeHQoJ0Nhc2Ug
U2Vuc2l0aXZlJykuJyEpJywgJ3RoJywgJyBjb2xzcGFuPSI1IicpKS4NCgkJCXRyKA0KCQkJ
CWZvcm0oDQoJCQkJCXRkYShnVHh0KCdSZW5hbWUnKS4nOiAnLCAnIHN0eWxlPSJ2ZXJ0aWNh
bC1hbGlnbjptaWRkbGUiJykuDQoJCQkJCXRkKHRleHRfaW5wdXQoJ21hdGNodGFnJywgJycs
ICcxNScpKS4NCgkJCQkJdGRhKGdUeHQoJ3RvJykuJzonLCAnIHN0eWxlPSJ2ZXJ0aWNhbC1h
bGlnbjptaWRkbGUiJykuDQoJCQkJCXRkKHRleHRfaW5wdXQoJ3JlcGxhY2V0YWcnLCAnJywg
JzE1JykpLg0KCQkJCQl0ZChmSW5wdXQoJ3N1Ym1pdCcsICdyZXBsYWNlJywgZ1R4dCgnUnVu
JyksICdwdWJsaXNoJykuZUlucHV0KCd0cnVfdGFncycpKSwNCgkJCQkJJycsICcgdmVyaWZ5
KFwnJyAuIGdUeHQoJ2FyZV95b3Vfc3VyZScpIC4gJ1wnKSInDQoJCQkJKQ0KCQkJKS4NCgkJ
CXRyKA0KCQkJCWZvcm0oDQoJCQkJCXRkYShnVHh0KCdEZWxldGUnKS4nOiAnLCAnIHN0eWxl
PSJ2ZXJ0aWNhbC1hbGlnbjptaWRkbGUiJykuDQoJCQkJCXRkKHRleHRfaW5wdXQoJ2RlbGV0
ZXRhZycsICcnLCAnMTUnKSkuDQoJCQkJCXRkY3MoJycsIDIpLg0KCQkJCQl0ZChmSW5wdXQo
J3N1Ym1pdCcsICdkZWxldGUnLCBnVHh0KCdSdW4nKSwgJ3B1Ymxpc2gnKS5lSW5wdXQoJ3Ry
dV90YWdzJykpLA0KCQkJCQknJywgJyB2ZXJpZnkoXCcnIC4gZ1R4dCgnYXJlX3lvdV9zdXJl
JykgLiAnXCcpIicNCgkJCQkpDQoJCQkpLg0KCQllbmRUYWJsZSgpOw0KDQoJZWNobyAnPC90
ZD48L3RyPjx0cj48dGQgc3R5bGU9ImJvcmRlci1ib3R0b206MnB4IHNvbGlkIGdyYXkiPic7
DQoNCgkJZWNobyBzdGFydFRhYmxlKCdsaXN0JywgJycsICcnLCAnJywgJzEwMCUnKS4NCgkJ
CXRyKHRhZyhnVHh0KCdSZWRpcmVjdGlvbnMnKSwgJ3RoJywgJyBjb2xzcGFuPSI0IicpKTsN
CgkJCWZvcmVhY2ggKCRyZWRpcmVjdHMgYXMgJGxlZnR0YWcgPT4gJHJpZ2h0dGFnKSB7DQoJ
CQkJZWNobyB0cigNCgkJCQkJdGRhKGhyZWYoJGxlZnR0YWcsIHRydV90YWdzX2xpbmtpZnlf
dGFnKCRsZWZ0dGFnKSksICcgc3R5bGU9InRleHQtYWxpZ246IGNlbnRlciInKS4NCgkJCQkJ
dGRhKGh0bWxzcGVjaWFsY2hhcnMoJz0+JyksICcgc3R5bGU9InRleHQtYWxpZ246IGNlbnRl
ciInKS4NCgkJCQkJdGRhKGhyZWYoJHJpZ2h0dGFnLCB0cnVfdGFnc19saW5raWZ5X3RhZygk
cmlnaHR0YWcpKSwgJyBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyIicpLg0KCQkJCQl0ZCgn
PGEgaHJlZj0iaW5kZXgucGhwP2V2ZW50PXRydV90YWdzJmFtcDtkZWxldGVfcmVkaXJlY3Q9
Jy51cmxlbmNvZGUoJGxlZnR0YWcpLiciICBvbmNsaWNrPSJyZXR1cm4gdmVyaWZ5KFwnJy5n
VHh0KCdhcmVfeW91X3N1cmUnKS4nXCcpIj5EZWxldGU8L2E+JykNCgkJCQkpOw0KCQkJfQ0K
CQkJZWNobyB0cigNCgkJCQknPGZvcm0gbmFtZT0icmVkaXJlY3QiIGlkPSJyZWRpcmVjdCIg
bWV0aG9kPSJwb3N0IiBhY3Rpb249ImluZGV4LnBocD9ldmVudD10cnVfdGFncyIgb25zdWJt
aXQ9InJldHVybiB2ZXJpZnkoXCcnLmdUeHQoJ2FyZV95b3Vfc3VyZScpLidcJykiPicuDQoJ
CQkJCXRkYSh0ZXh0X2lucHV0KCdsZWZ0dGFnJywgJycsICcxNScpLCAnIHN0eWxlPSJ0ZXh0
LWFsaWduOmNlbnRlciInKS4NCgkJCQkJdGRhKGh0bWxzcGVjaWFsY2hhcnMoJz0+JyksICcg
c3R5bGU9InZlcnRpY2FsLWFsaWduOm1pZGRsZTt0ZXh0LWFsaWduOmNlbnRlciInKS4NCgkJ
CQkJdGRhKHRleHRfaW5wdXQoJ3JpZ2h0dGFnJywgJycsICcxNScpLCAnIHN0eWxlPSJ0ZXh0
LWFsaWduOmNlbnRlciInKS4NCgkJCQkJdGRhKCc8YSBocmVmPSIjIiBvbmNsaWNrPSJpZiAo
dmVyaWZ5KFwnJy5nVHh0KCdhcmVfeW91X3N1cmUnKS4nXCcpKSBkb2N1bWVudC5nZXRFbGVt
ZW50QnlJZChcJ3JlZGlyZWN0XCcpLnN1Ym1pdCgpOyByZXR1cm4gZmFsc2U7Ij5BZGQgbmV3
PC9hPicsICcgc3R5bGU9InZlcnRpY2FsLWFsaWduOm1pZGRsZSInKS4NCgkJCQkJZklucHV0
KCdoaWRkZW4nLCAncmVkaXJlY3QnLCAnMScpLg0KCQkJCSc8L2Zvcm0+Jw0KDQoJCQkpLg0K
CQllbmRUYWJsZSgpOw0KDQoJZWNobyAnPC90ZD48L3RyPjx0cj48dGQ+JzsNCg0KCQllY2hv
IHN0YXJ0VGFibGUoJ2xpc3QnKS4NCgkJCXRyKHRhZyhnVHh0KCdQcmVmZXJlbmNlcycpLCAn
dGgnLCAnIGNvbHNwYW49IjIiJykpLg0KCQkJZm9ybSgNCgkJCQl0cigNCgkJCQkJdGRhKGdU
eHQoJ1VzZSBjbGVhbiBVUkxzJykuJyAoJy5nVHh0KCdzaXRlIGRlZmF1bHQgaXMnKS4nICcu
JHRydV90YWdzX3ByZWZzW0NMRUFOX1VSTFNdLT5kZWZhdWx0X3ZhbHVlLicpOiAnLCAnIHN0
eWxlPSJ2ZXJ0aWNhbC1hbGlnbjptaWRkbGUiJykuDQoJCQkJCXRkKHJhZGlvX2xpc3QoQ0xF
QU5fVVJMUywNCgkJCQkJCQlhcnJheSgnY2xlYW4nPT5nVHh0KCdjbGVhbicpLCAnbWVzc3kn
PT5nVHh0KCdtZXNzeScpKSwNCgkJCQkJCQkkdHJ1X3RhZ3NfcHJlZnNbQ0xFQU5fVVJMU10t
PnZhbHVlKSkNCgkJCQkpLg0KCQkJCXRyKA0KCQkJCQl0ZGEoZ1R4dCgnVGFnIHNlY3Rpb24g
bmFtZScpLicgKGRlZmF1bHQgaXMgIicuJHRydV90YWdzX3ByZWZzW1RBR19TRUNUSU9OXS0+
ZGVmYXVsdF92YWx1ZS4nIik6ICcsICcgc3R5bGU9InZlcnRpY2FsLWFsaWduOm1pZGRsZSIn
KS4NCgkJCQkJdGQodGV4dF9pbnB1dChUQUdfU0VDVElPTiwgJHRydV90YWdzX3ByZWZzW1RB
R19TRUNUSU9OXS0+dmFsdWUsICcxNScpKQ0KCQkJCSkuDQoJCQkJdHIoDQoJCQkJCXRkYShn
VHh0KCdVUkwgcGFyYW1ldGVyIGZvciB0YWcgc2VhcmNoJykuJyAoZGVmYXVsdCBpcyAiJy4k
dHJ1X3RhZ3NfcHJlZnNbUEFSTV9OQU1FXS0+ZGVmYXVsdF92YWx1ZS4nIik6ICcuDQoJCQkJ
CQknPGJyPjxlbT4oeW91IHNob3VsZG5cJ3QgY2hhbmdlIHRoaXMgdW5sZXNzIHlvdSByZWFs
bHkga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcpPC9lbT4nLCAnIHN0eWxlPSJ2ZXJ0aWNhbC1h
bGlnbjptaWRkbGUiJykuDQoJCQkJCXRkKHRleHRfaW5wdXQoUEFSTV9OQU1FLCAkdHJ1X3Rh
Z3NfcHJlZnNbUEFSTV9OQU1FXS0+dmFsdWUsICcxNScpKQ0KCQkJCSkuDQoJCQkJdHIoDQoJ
CQkJCXRkYShnVHh0KCdQdXQgdGFncyBpbnRvIFJTUy9BdG9tIGZlZWRzLCBpbiAiQ2F0ZWdv
cnkiIGVsZW1lbnRzJykuDQoJCQkJCQknOiA8YnI+PGVtPih5b3UgcHJvYmFibHkgd2FudCB0
aGlzKTwvZW0+JywgJyBzdHlsZT0idmVydGljYWwtYWxpZ246bWlkZGxlIicpLg0KCQkJCQl0
ZCh5ZXNub1JhZGlvKFRBR1NfSU5fRkVFRF9DQVRFR09SSUVTLCAkdHJ1X3RhZ3NfcHJlZnNb
VEFHU19JTl9GRUVEX0NBVEVHT1JJRVNdLT52YWx1ZSkpDQoJCQkJKS4NCgkJCQl0cigNCgkJ
CQkJdGRhKCdBcHBlbmQgdGhlIHRhZyBsaXN0IHRvIHRoZSBib2R5IG9mIFJTUy9BdG9tIGZl
ZWRzLCAnLg0KCQkJCQkJJ3dpdGggbGlua3MsIGFuZCB3aXRoIHJlbD0idGFnIjonLg0KCQkJ
CQkJJzxicj48ZW0+KGlmIHRoaXMgaXMgdHVybmVkIG9uLCcuDQoJCQkJCQkneW91IGNhbiBk
ZWZpbmUgYSAibWlzYyIgZm9ybSBuYW1lZCB0cnVfdGFnc19mZWVkX3RhZ3MgJy4NCgkJCQkJ
CSd0aGF0IHdpbGwgYmUgdXNlZCB0byByZW5kZXIgdGhlIHRhZ3MgaW4gdGhlIGZlZWQpPC9l
bT4nLA0KCQkJCQkJJyBzdHlsZT0idmVydGljYWwtYWxpZ246bWlkZGxlIicpLg0KCQkJCQl0
ZCh5ZXNub1JhZGlvKFRBR1NfSU5fRkVFRF9CT0RZLCAkdHJ1X3RhZ3NfcHJlZnNbVEFHU19J
Tl9GRUVEX0JPRFldLT52YWx1ZSkpDQoJCQkJKS4NCgkJCQl0cigNCgkJCQkJdGRhKGdUeHQo
J1Nob3cgYSBjbGlja2FibGUgbGlzdCBvZiB0YWdzIG9uIHRoZSAiV3JpdGUiIHBhZ2UnKS4n
OiAnLA0KCQkJCQkJJyBzdHlsZT0idmVydGljYWwtYWxpZ246bWlkZGxlIicpLg0KCQkJCQl0
ZCh5ZXNub1JhZGlvKFRBR1NfSU5fV1JJVEVfVEFCLCAkdHJ1X3RhZ3NfcHJlZnNbVEFHU19J
Tl9XUklURV9UQUJdLT52YWx1ZSkpDQoJCQkJKS4NCgkJCQl0cigNCgkJCQkJdGRhKGdUeHQo
J0F1dG9jb21wbGV0ZSB0YWdzIG9uIHRoZSAiV3JpdGUiIHBhZ2UnKS4nOiA8YnI+Jy4NCgkJ
CQkJCSc8ZW0+KHJlcXVpcmVzIHRoYXQgdGhlIDxhIGhyZWY9Imh0dHA6Ly9iYXNzaXN0YW5j
ZS5kZS9qcXVlcnktcGx1Z2lucy9qcXVlcnktcGx1Z2luLWF1dG9jb21wbGV0ZS8iPmpRdWVy
eSBBdXRvY29tcGxldGUgcGx1Z2luPC9hPiA8Y29kZT4uY3NzPC9jb2RlPiBhbmQgPGNvZGU+
Lm1pbi5qczwvY29kZT4gZmlsZXMgYmUgdXBsb2FkZWQgaW50byBhICI8Y29kZT5qczwvY29k
ZT4iIGZvbGRlciBvbiB5b3VyIHNpdGUpPC9lbT4nLA0KCQkJCQkJJyBzdHlsZT0idmVydGlj
YWwtYWxpZ246bWlkZGxlIicpLg0KCQkJCQl0ZCh5ZXNub1JhZGlvKEFVVE9DT01QTEVURV9J
Tl9XUklURV9UQUIsICR0cnVfdGFnc19wcmVmc1tBVVRPQ09NUExFVEVfSU5fV1JJVEVfVEFC
XS0+dmFsdWUpKQ0KCQkJCSkuDQoJCQkJdHIoDQoJCQkJCXRkYShnVHh0KCdDb252ZXJ0IHRh
Z3MgdG8gbG93ZXJjYXNlIGJ5IGRlZmF1bHQnKS4nOiA8YnI+Jy4NCgkJCQkJCSc8ZW0+KHlv
dSBwcm9iYWJseSB3YW50IHRoaXMsIHVubGVzcyB5b3UgYXJlIGhhdmluZyBwcm9ibGVtcyB3
aXRoIHV0Zi04IGNoYXJhY3RlcnMpPC9lbT4nLA0KCQkJCQkJJyBzdHlsZT0idmVydGljYWwt
YWxpZ246bWlkZGxlIicpLg0KCQkJCQl0ZCh5ZXNub1JhZGlvKFVURl84X0NBU0UsICR0cnVf
dGFnc19wcmVmc1tVVEZfOF9DQVNFXS0+dmFsdWUpKQ0KCQkJCSkuDQoJCQkJdHIoDQoJCQkJ
CXRkKCcnKS4NCgkJCQkJdGRhKGZJbnB1dCgnc3VibWl0JywgJ3ByZWZzJywgZ1R4dCgnU2F2
ZScpLCAncHVibGlzaCcpLmVJbnB1dCgndHJ1X3RhZ3MnKSwgJyBzdHlsZT0idGV4dC1hbGln
bjpyaWdodCInKQ0KCQkJCSksDQoJCQkJJycsICcgdmVyaWZ5KFwnJyAuIGdUeHQoJ2FyZV95
b3Vfc3VyZScpIC4gJ1wnKSInDQoJCQkpLg0KCQllbmRUYWJsZSgpLic8L3RkPjwvdHI+Jy4N
CgkJZW5kVGFibGUoKTsNCg0KCWVjaG8gJzwvdGQ+PC90cj4nLmVuZFRhYmxlKCk7DQp9DQoN
Cg0KZnVuY3Rpb24gdHJ1X3RhZ3NfYWRtaW5fdGFiX2hhbmRsZV9pbnB1dCgpIHsNCglpZiAo
Z3BzKCdwcmVmcycpKSB7DQoJCXJldHVybiB0cnVfdGFnc19hZG1pbl91cGRhdGVfcHJlZnMo
KTsNCgl9IGVsc2UgaWYgKGdwcygnZGVsZXRlJykpIHsNCgkJcmV0dXJuIHRydV90YWdzX2Fk
bWluX2RlbGV0ZV90YWcoZ3BzKCdkZWxldGV0YWcnKSk7DQoJfSBlbHNlIGlmIChncHMoJ3Jl
cGxhY2UnKSkgew0KCQkkcmVzdWx0ID0gdHJ1X3RhZ3NfYWRtaW5fcmVwbGFjZV90YWcoZ3Bz
KCdtYXRjaHRhZycpLCBncHMoJ3JlcGxhY2V0YWcnKSwgZmFsc2UpOw0KCQlyZXR1cm4gJHJl
c3VsdCAuICc8YnI+JyAuIHRydV90YWdzX2FkbWluX3JlZGlyZWN0X3RhZyhncHMoJ21hdGNo
dGFnJyksIGdwcygncmVwbGFjZXRhZycpKTsNCgl9IGVsc2UgaWYgKGdwcygncmVkaXJlY3Qn
KSkgew0KCQlyZXR1cm4gdHJ1X3RhZ3NfYWRtaW5fcmVkaXJlY3RfdGFnKGdwcygnbGVmdHRh
ZycpLCBncHMoJ3JpZ2h0dGFnJykpOw0KCX0gZWxzZSBpZiAoZ3BzKCdkZWxldGVfcmVkaXJl
Y3QnKSkgew0KCQlyZXR1cm4gdHJ1X3RhZ3NfYWRtaW5fZGVsZXRlX3JlZGlyZWN0KGdwcygn
ZGVsZXRlX3JlZGlyZWN0JykpOw0KCX0gZWxzZSB7DQoJCXJldHVybiAnJzsNCgl9DQp9DQoN
Cg0KZnVuY3Rpb24gdHJ1X3RhZ3NfYWRtaW5fdXBkYXRlX3ByZWZzKCkgew0KCWdsb2JhbCAk
dHJ1X3RhZ3NfcHJlZnM7DQoJJHJlc3VsdHMgPSBhcnJheSgpOw0KCWZvcmVhY2ggKCR0cnVf
dGFnc19wcmVmcyBhcyAkcHJlZikgew0KCQkkdmFsaWRfdmFsdWUgPSAkcHJlZi0+dmFsaWRh
dGVfdmFsdWUoZ3BzKCRwcmVmLT5uYW1lKSk7DQoJCWlmICgkdmFsaWRfdmFsdWUgJiYgJHZh
bGlkX3ZhbHVlIDw+IGdwcygkcHJlZi0+bmFtZSkpIHsNCgkJCXJldHVybiAkdmFsaWRfdmFs
dWU7ICAjIyMgdGhpcyBpcyBhIHNuZWFreSB3YXkgdG8gaGFuZGxlIHZhbGlkYXRpb24gLSBz
b3JyeSA7KQ0KCQl9DQoJCWlmICgkdmFsaWRfdmFsdWUgPD4gJHByZWYtPnZhbHVlKSB7DQoJ
CQlpZiAoJHZhbGlkX3ZhbHVlID09ICRwcmVmLT5kZWZhdWx0X3ZhbHVlKSB7DQoJCQkJJHJl
c3VsdCA9IHRydV90YWdzX2RlbGV0ZV9wcmVmKCRwcmVmLT5uYW1lKTsNCgkJCX0gZWxzZSB7
DQoJCQkJJHJlc3VsdCA9IHRydV90YWdzX3Vwc2VydF9wcmVmKCRwcmVmLT5uYW1lLCAkdmFs
aWRfdmFsdWUpOw0KCQkJfQ0KCQkJaWYgKCRyZXN1bHQpIHsNCgkJCQkkcmVzdWx0c1tdID0g
J1VwZGF0ZWQgJyAuICRwcmVmLT5uYW1lOw0KCQkJCSRwcmVmLT52YWx1ZSA9ICR2YWxpZF92
YWx1ZTsNCgkJCX0gZWxzZSB7DQoJCQkJJHJlc3VsdHNbXSA9ICdFcnJvciB1cGRhdGluZyAn
IC4gJHByZWYtPm5hbWU7DQoJCQl9DQoJCX0NCgl9DQoJaWYgKGNvdW50KCRyZXN1bHRzKSA9
PSAwKSB7DQoJCXJldHVybiAnTm8gcmVjb3JkcyBuZWVkIHVwZGF0aW5nJzsNCgl9IGVsc2Ug
ew0KCQlyZXR1cm4gam9pbignPGJyPicsICRyZXN1bHRzKTsNCgl9DQp9DQoNCg0KZnVuY3Rp
b24gdHJ1X3RhZ3NfdXBzZXJ0X3ByZWYoJG5hbWUsICR2YWx1ZSkgew0KCWlmICghc2FmZV9x
dWVyeSgnY3JlYXRlIHRhYmxlIGlmIG5vdCBleGlzdHMgJyAuIHNhZmVfcGZ4KCd0cnVfdGFn
c19wcmVmcycpLg0KCQknIChuYW1lIHZhcmNoYXIoMjU1KSBwcmltYXJ5IGtleSwgJy4NCgkJ
J3ZhbHVlIHZhcmNoYXIoMjU1KSBub3QgbnVsbCknKSkgew0KCQlyZXR1cm4gJ1NlcmlvdXMg
ZXJyb3IgLSB1bmFibGUgdG8gY3JlYXRlIHRoZSAnIC4gc2FmZV9wZngoJ3RydV90YWdzX3By
ZWZzJykgLiAnIHRhYmxlLic7DQoJfQ0KDQoJcmV0dXJuIHNhZmVfdXBzZXJ0KCd0cnVfdGFn
c19wcmVmcycsICd2YWx1ZT0iJy4kdmFsdWUuJyInLCAnbmFtZT0iJy4kbmFtZS4nIicpOw0K
fQ0KDQoNCmZ1bmN0aW9uIHRydV90YWdzX2RlbGV0ZV9wcmVmKCRuYW1lKSB7DQoJaWYgKHNh
ZmVfZGVsZXRlKCd0cnVfdGFnc19wcmVmcycsICduYW1lPSInLiRuYW1lLiciJykpIHsNCgkJ
aWYgKHNhZmVfY291bnQoJ3RydV90YWdzX3ByZWZzJywgJzEnKSA9PSAwICYmICFzYWZlX3F1
ZXJ5KCdkcm9wIHRhYmxlICcgLiBzYWZlX3BmeCgndHJ1X3RhZ3NfcHJlZnMnKSkpIHsNCgkJ
CXJldHVybiBmYWxzZTsNCgkJfQ0KCQlyZXR1cm4gdHJ1ZTsNCgl9IGVsc2Ugew0KCQlyZXR1
cm4gZmFsc2U7DQoJfQ0KfQ0KDQoNCmZ1bmN0aW9uIHRydV90YWdzX2FkbWluX2RlbGV0ZV90
YWcoJGRlbGV0ZXRhZykgew0KCWlmICh0cmltKCRkZWxldGV0YWcpKSB7DQoJCXJldHVybiB0
cnVfdGFnc19hZG1pbl9yZXBsYWNlX3RhZygkZGVsZXRldGFnLCAnJywgdHJ1ZSk7DQoJfSBl
bHNlIHsNCgkJcmV0dXJuICdQbGVhc2UgZW50ZXIgYSB2YWx1ZSc7DQoJfQ0KfQ0KDQoNCmZ1
bmN0aW9uIHRydV90YWdzX2FkbWluX3JlcGxhY2VfdGFnKCRtYXRjaHRhZywgJHJlcGxhY2V0
YWcsICRhbGxvd19ibGFua19yZXBsYWNldGFnKSB7DQoJJG1hdGNodGFnID0gdHJpbSgkbWF0
Y2h0YWcpOw0KCSRyZXBsYWNldGFnID0gdHJpbSgkcmVwbGFjZXRhZyk7DQoJaWYgKCRtYXRj
aHRhZyAmJiAoJGFsbG93X2JsYW5rX3JlcGxhY2V0YWcgfHwgJHJlcGxhY2V0YWcpKSB7DQoJ
CWlmIChzYWZlX3VwZGF0ZSgndGV4dHBhdHRlcm4nLCBUUlVfVEFHU19GSUVMRC4nPXRyaW0o
Ym90aCBcJyxcJyBmcm9tIHJlcGxhY2UoY29uY2F0KCIsIiwgJy5UUlVfVEFHU19GSUVMRC4n
LCAiLCIpLCBjb25jYXQoIiwiLCBcJycuYWRkc2xhc2hlcygkbWF0Y2h0YWcpLidcJywgIiwi
KSwgXCcsJy5hZGRzbGFzaGVzKCRyZXBsYWNldGFnKS4nLFwnKSknLCAnMScpKSB7DQoJCQly
ZXR1cm4gJ1VwZGF0ZWQgJy5teXNxbGlfYWZmZWN0ZWRfcm93cygpLicgcm93cyAoIicuaHRt
bHNwZWNpYWxjaGFycygkbWF0Y2h0YWcpLiciPT4iJy5odG1sc3BlY2lhbGNoYXJzKCRyZXBs
YWNldGFnKS4nIiknOw0KCQl9IGVsc2Ugew0KCQkJcmV0dXJuICdFcnJvcjogJyAuIG15c3Fs
aV9lcnJvcigpOw0KCQl9DQoJfSBlbHNlIHsNCgkJcmV0dXJuICdQbGVhc2UgZW50ZXIgYSB2
YWx1ZSBpbiBib3RoIGZpZWxkcyc7DQoJfQ0KfQ0KDQoNCmZ1bmN0aW9uIHRydV90YWdzX2Fk
bWluX3JlZGlyZWN0X3RhZygkbGVmdHRhZywgJHJpZ2h0dGFnKSB7DQoJJGxlZnR0YWcgPSBh
ZGRzbGFzaGVzKHRydV90YWdzX3N0cnRvbG93ZXIodHJpbSgkbGVmdHRhZykpKTsNCgkkcmln
aHR0YWcgPSBhZGRzbGFzaGVzKHRydV90YWdzX3N0cnRvbG93ZXIodHJpbSgkcmlnaHR0YWcp
KSk7DQoJaWYgKCEkbGVmdHRhZyB8fCAhJHJpZ2h0dGFnKSB7DQoJCXJldHVybiAnUGxlYXNl
IGVudGVyIGEgdmFsdWUgaW4gYm90aCBmaWVsZHMnOw0KCX0NCg0KCWlmICghc2FmZV9xdWVy
eSgnY3JlYXRlIHRhYmxlIGlmIG5vdCBleGlzdHMgJyAuIHNhZmVfcGZ4KCd0cnVfdGFnc19y
ZWRpcmVjdHMnKS4NCgkJJyAobGVmdHRhZyB2YXJjaGFyKDI1NSkgcHJpbWFyeSBrZXksICcu
DQoJCSdyaWdodHRhZyB2YXJjaGFyKDI1NSkgbm90IG51bGwpJykpIHsNCgkJcmV0dXJuICdT
ZXJpb3VzIGVycm9yIC0gdW5hYmxlIHRvIGNyZWF0ZSB0aGUgJyAuIHNhZmVfcGZ4KCd0cnVf
dGFnc19yZWRpcmVjdHMnKSAuICcgdGFibGUuJzsNCgl9DQoNCglpZiAoc2FmZV9pbnNlcnQo
J3RydV90YWdzX3JlZGlyZWN0cycsICdsZWZ0dGFnPSInLiRsZWZ0dGFnLiciLHJpZ2h0dGFn
PSInLiRyaWdodHRhZy4nIicpKSB7DQoJCXJldHVybiAnUmVkaXJlY3QgYWRkZWQgKCInLmh0
bWxzcGVjaWFsY2hhcnMoJGxlZnR0YWcpLiciPT4iJy5odG1sc3BlY2lhbGNoYXJzKCRyaWdo
dHRhZykuJyIpIC0gcGxlYXNlIHRlc3QgaXQhJzsNCgl9IGVsc2Ugew0KCQlyZXR1cm4gJ0Vy
cm9yIGFkZGluZyByZWNvcmQgLSBkb2VzIGl0IGFscmVhZHkgZXhpc3Q/JzsNCgl9DQp9DQoN
Cg0KZnVuY3Rpb24gdHJ1X3RhZ3NfYWRtaW5fZGVsZXRlX3JlZGlyZWN0KCRsZWZ0dGFnKSB7
DQoJaWYgKHNhZmVfZGVsZXRlKCd0cnVfdGFnc19yZWRpcmVjdHMnLCAnbGVmdHRhZz0iJy5h
ZGRzbGFzaGVzKCRsZWZ0dGFnKS4nIicpKSB7DQoJCWlmIChzYWZlX2NvdW50KCd0cnVfdGFn
c19yZWRpcmVjdHMnLCAnMScpID09IDAgJiYgIXNhZmVfcXVlcnkoJ2Ryb3AgdGFibGUgJyAu
IHNhZmVfcGZ4KCd0cnVfdGFnc19yZWRpcmVjdHMnKSkpIHsNCgkJCXJldHVybiAnUmVkaXJl
Y3QgZGVsZXRlZCwgYnV0IHVuYWJsZSB0byBkcm9wIHRhYmxlICcgLiBzYWZlX3BmeCgndHJ1
X3RhZ3NfcmVkaXJlY3RzJyk7DQoJCX0NCgkJcmV0dXJuICdSZWRpcmVjdCBkZWxldGVkICgi
Jy5odG1sc3BlY2lhbGNoYXJzKCRsZWZ0dGFnKS4nIiknOw0KCX0gZWxzZSB7DQoJCXJldHVy
biAnRXJyb3IgZGVsZXRpbmcgcmVkaXJlY3QnOw0KCX0NCn0NCg0KDQpmdW5jdGlvbiB0cnVf
dGFnc19hZG1pbl93cml0ZV90YWJfaGFuZGxlcigkZXZlbnQsICRzdGVwLCAkZGF0YSkgew0K
CWdsb2JhbCAkdHJ1X3RhZ3NfcHJlZnM7DQoJJGF0dHMgPSB0cnVfdGFnc19nZXRfc3RhbmRh
cmRfY2xvdWRfYXR0cyhhcnJheSgpLCB0cnVlLCB0cnVlLCB0cnVlKTsNCgkkY2xvdWQgPSBh
cnJheV91bmlxdWUodHJ1X3RhZ3NfY2xvdWRfcXVlcnkoJGF0dHMpKTsNCgluYXRjYXNlc29y
dCgkY2xvdWQpOw0KDQoJJGlkID0gKGVtcHR5KCRHTE9CQUxTWydJRCddKSA/IGdwcygnSUQn
KSA6ICRHTE9CQUxTWydJRCddKTsNCgkkYXJ0aWNsZV90YWdzID0gKGVtcHR5KCRpZCkgPyBh
cnJheSgpIDogdHJ1X3RhZ3NfZ2V0X3RhZ3NfZm9yX2FydGljbGUoJGlkKSk7DQoNCgkkbGlu
a3MgPSBhcnJheSgpOw0KCSRyYXdfY2xvdWQgPSAnJzsNCglmb3JlYWNoICgkY2xvdWQgYXMg
JHRhZykgew0KCQkkc3R5bGUgPSAoaW5fYXJyYXkoJHRhZywgJGFydGljbGVfdGFncykgPyAn
IGNsYXNzPSJ0YWdfY2hvc2VuIicgOiAnJyk7DQoJCSRsaW5rc1tdID0gJzxhIGhyZWY9IiNh
ZHZhbmNlZCInLiRzdHlsZS4nIG9uY2xpY2s9InRvZ2dsZUNsYXNzKHRoaXMsIHRvZ2dsZVRh
ZyhcXFwnJy5hZGRzbGFzaGVzKGFkZHNsYXNoZXMoaHRtbHNwZWNpYWxjaGFycygkdGFnKSkp
LidcXFwnKSk7IHJldHVybiBmYWxzZTsiPicgLiBhZGRzbGFzaGVzKGh0bWxzcGVjaWFsY2hh
cnMoJHRhZykpIC4gJzxcL2E+JzsNCgkJJHJhd19jbG91ZCAuPSAnIicgLiBhZGRTbGFzaGVz
KCR0YWcpIC4gJyIsJzsNCgl9DQoJJHJhd19jbG91ZCA9IHN1YnN0cigkcmF3X2Nsb3VkLCAw
LCBzdHJsZW4oJHJhd19jbG91ZCkgLSAxKTsNCgkkdG9faW5zZXJ0ID0gam9pbignLCAnLCAk
bGlua3MpOw0KDQoJaWYgKCR0cnVfdGFnc19wcmVmc1tUQUdTX0lOX1dSSVRFX1RBQl0tPnZh
bHVlKSB7DQoJCSRqcyA9IDw8PEVPRg0KCQkJdmFyIGtleXdvcmRzRmllbGQgPSBkb2N1bWVu
dC5nZXRFbGVtZW50QnlJZCgna2V5d29yZHMnKTsNCgkJCWtleXdvcmRzRmllbGQucGFyZW50
Tm9kZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdicicpKTsNCgkJCXZh
ciBjbG91ZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsNCgkJCWtleXdvcmRz
RmllbGQucGFyZW50Tm9kZS5hcHBlbmRDaGlsZChjbG91ZCk7DQoJCQljbG91ZC5zZXRBdHRy
aWJ1dGUoJ2NsYXNzJywgJ3RydV90YWdzX2FkbWluX3RhZ3MnKTsNCgkJCWNsb3VkLmlubmVy
SFRNTCA9ICd7JHRvX2luc2VydH0nOw0KDQoJCQl2YXIgc3R5bGVFbGVtZW50ID0gZG9jdW1l
bnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTsNCgkJCXN0eWxlRWxlbWVudC5zZXRBdHRyaWJ1
dGUoInR5cGUiLCAidGV4dC9jc3MiKTsNCgkJCXZhciBzdHlsZVRleHQgPSAnYS50YWdfY2hv
c2Vue2JhY2tncm91bmQtY29sb3I6ICNGRUI7IGNvbG9yOiBibGFjazt9JzsNCgkJCWlmIChz
dHlsZUVsZW1lbnQuc3R5bGVTaGVldCkgeyAvL0lFDQoJCQkJc3R5bGVFbGVtZW50LnN0eWxl
U2hlZXQuY3NzVGV4dCA9IHN0eWxlVGV4dDsNCgkJCX0gZWxzZSB7DQoJCQkJdmFyIHRleHRO
b2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoc3R5bGVUZXh0KTsNCgkJCQlzdHlsZUVs
ZW1lbnQuYXBwZW5kQ2hpbGQodGV4dE5vZGUpOw0KCQkJfQ0KCQkJdmFyIGhlYWRFbGVtZW50
ID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2hlYWQnKVswXTsNCgkJCWhlYWRF
bGVtZW50LmFwcGVuZENoaWxkKHN0eWxlRWxlbWVudCk7DQoNCgkJCWZ1bmN0aW9uIHRvZ2ds
ZVRhZyh0YWdOYW1lKSB7DQoJCQkJdmFyIHJlZ2V4VGFnID0gdGFnTmFtZS5yZXBsYWNlKC8o
W1xcXFxcXlxcJCorW1xcXT97fS49IToofCldKS9nLCJcXFxcJDEiKTsNCgkJCQl2YXIgdGFn
UmVnZXggPSBuZXcgUmVnRXhwKCIoKF58LClcXFxzKikiICsgcmVnZXhUYWcgKyAiXFxccyoo
LFxcXHMqfCQpIik7DQoJCQkJdmFyIHRleHRhcmVhID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5
SWQoJ2tleXdvcmRzJyk7DQoJCQkJdmFyIGN1cnZhbCA9IHRleHRhcmVhLnZhbHVlLnJlcGxh
Y2UoLyw/XHMrJC8sICcnKTsNCgkJCQlpZiAoJycgPT0gY3VydmFsKSB7DQoJCQkJCXRleHRh
cmVhLnZhbHVlID0gdGFnTmFtZTsNCgkJCQl9IGVsc2UgaWYgKGN1cnZhbC5tYXRjaCh0YWdS
ZWdleCkpIHsNCgkJCQkJdGV4dGFyZWEudmFsdWUgPSBjdXJ2YWwucmVwbGFjZSh0YWdSZWdl
eCwgJyQxJykucmVwbGFjZSgvLD9ccyskLywgJycpOw0KCQkJCQlyZXR1cm4gJyc7DQoJCQkJ
fSBlbHNlIGlmICgnLCcgPT0gY3VydmFsLmNoYXJBdChjdXJ2YWwubGVuZ3RoIC0gMSkpIHsN
CgkJCQkJdGV4dGFyZWEudmFsdWUgKz0gJyAnICsgdGFnTmFtZTsNCgkJCQl9IGVsc2Ugew0K
CQkJCQl0ZXh0YXJlYS52YWx1ZSArPSAnLCAnICsgdGFnTmFtZTsNCgkJCQl9DQoJCQkJcmV0
dXJuICd0YWdfY2hvc2VuJzsNCgkJCX0NCg0KCQkJZnVuY3Rpb24gdG9nZ2xlQ2xhc3MoZWxl
bWVudCwgY2xhc3NOYW1lKSB7DQoJCQkJZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2NsYXNzJywg
Y2xhc3NOYW1lKTsNCgkJCQllbGVtZW50LnNldEF0dHJpYnV0ZSgnY2xhc3NOYW1lJywgY2xh
c3NOYW1lKTsgLyogZm9yIElFICovDQoJCQl9DQpFT0Y7DQoJCXJldHVybiAkZGF0YSAuIHNj
cmlwdF9qcygkanMpOw0KCX0NCg0KCWlmICgkdHJ1X3RhZ3NfcHJlZnNbQVVUT0NPTVBMRVRF
X0lOX1dSSVRFX1RBQl0tPnZhbHVlKSB7DQoJCWVjaG8gPDw8RU9GDQoJCQk8bGluayByZWw9
InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9qcy9qcXVlcnkuYXV0b2Nv
bXBsZXRlLmNzcyIgbWVkaWE9InByb2plY3Rpb24sIHNjcmVlbiIgLz4NCgkJCTxzY3JpcHQg
c3JjPSIuLi9qcy9qcXVlcnkuYXV0b2NvbXBsZXRlLm1pbi5qcyIgdHlwZT0idGV4dC9qYXZh
c2NyaXB0Ij48L3NjcmlwdD4NCgkJCTxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHR5
cGU9InRleHQvamF2YXNjcmlwdCI+PCEtLQ0KCQkJCSQoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0
aW9uKCl7IHZhciB0YWdzID0gbmV3IEFycmF5KHskcmF3X2Nsb3VkfSk7DQoJCQkJCSQoIiNr
ZXl3b3JkcyIpLmF1dG9jb21wbGV0ZSh0YWdzLCB7IG11bHRpcGxlOiB0cnVlLCBtdXN0TWF0
Y2g6IGZhbHNlLCBhdXRvRmlsbDogZmFsc2UgfSk7DQoJCQkJfSk7DQoJCQkvLy0tPjwvc2Ny
aXB0Pg0KRU9GOw0KCX0NCg0KfQ0KDQoNCiMjIyBBVE9NL1JTUyBGRUVEIEZVTkNUSU9OUyAj
IyMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCg0KcmVnaXN0ZXJfY2FsbGJh
Y2soJ3RydV90YWdzX2F0b21faGFuZGxlcicsICdhdG9tX2VudHJ5Jyk7DQpmdW5jdGlvbiB0
cnVfdGFnc19hdG9tX2hhbmRsZXIoJGV2ZW50LCAkc3RlcCkgeyByZXR1cm4gdHJ1X3RhZ3Nf
ZmVlZF9oYW5kbGVyKHRydWUpOyB9DQpyZWdpc3Rlcl9jYWxsYmFjaygndHJ1X3RhZ3NfcnNz
X2hhbmRsZXInLCAncnNzX2VudHJ5Jyk7DQpmdW5jdGlvbiB0cnVfdGFnc19yc3NfaGFuZGxl
cigkZXZlbnQsICRzdGVwKSB7IHJldHVybiB0cnVfdGFnc19mZWVkX2hhbmRsZXIoZmFsc2Up
OyB9DQoNCmZ1bmN0aW9uIHRydV90YWdzX2ZlZWRfaGFuZGxlcigkYXRvbSkgew0KCWdsb2Jh
bCAkdGhpc2FydGljbGUsICR0cnVfdGFnc19wcmVmczsNCglleHRyYWN0KCR0aGlzYXJ0aWNs
ZSk7DQoNCgkkdGFncyA9IHRydV90YWdzX2dldF90YWdzX2Zvcl9hcnRpY2xlKCR0aGlzaWQp
Ow0KDQoJaWYgKCR0cnVfdGFnc19wcmVmc1tUQUdTX0lOX0ZFRURfQk9EWV0tPnZhbHVlKSB7
DQoJCSRleHRyYWJvZHkgPSAnJzsNCgkJJEZPUk1fTkFNRSA9ICd0cnVfdGFnc19mZWVkX3Rh
Z3MnOw0KCQlpZiAoZmV0Y2goJ2Zvcm0nLCAndHhwX2Zvcm0nLCAnbmFtZScsICRGT1JNX05B
TUUpKSB7DQoJCQkkZm9ybSA9IGZldGNoX2Zvcm0oJEZPUk1fTkFNRSk7DQoJCQkkZXh0cmFi
b2R5ID0gdHJpbShwYXJzZSgkZm9ybSkpOw0KCQl9IGVsc2Ugew0KCQkJJGF0dHMgPSB0cnVf
dGFnc19nZXRfc3RhbmRhcmRfY2xvdWRfYXR0cyhhcnJheSgpLCBmYWxzZSwgdHJ1ZSk7DQoJ
CQkkZXh0cmFib2R5ID0gJzxwPnRhZ3M6ICcgLiB0cnVfdGFnc19yZW5kZXJfY2xvdWQoJGF0
dHMsICR0YWdzLCAkdGFncykgLiAnPC9wPic7DQoJCX0NCgkJZ2xvYmFsICR0aGlzYXJ0aWNs
ZTsNCgkJaWYgKHRyaW0oJHRoaXNhcnRpY2xlWydleGNlcnB0J10pKSB7DQoJCQkkdGhpc2Fy
dGljbGVbJ2V4Y2VycHQnXSA9IHRyaW0oJHRoaXNhcnRpY2xlWydleGNlcnB0J10pLm4uJGV4
dHJhYm9keS5uOw0KCQl9DQoJCSR0aGlzYXJ0aWNsZVsnYm9keSddID0gdHJpbSgkdGhpc2Fy
dGljbGVbJ2JvZHknXSkubi4kZXh0cmFib2R5Lm47DQoJfQ0KDQoJaWYgKCR0cnVfdGFnc19w
cmVmc1tUQUdTX0lOX0ZFRURfQ0FURUdPUklFU10tPnZhbHVlKSB7DQoJCSRvdXRwdXQgPSBh
cnJheSgpOw0KCQlmb3JlYWNoICgkdGFncyBhcyAkdGFnKSB7DQoJCQlpZiAoJGF0b20pIHsN
CgkJCQkkb3V0cHV0W10gPSAnPGNhdGVnb3J5IHRlcm09IicgLiBodG1sc3BlY2lhbGNoYXJz
KCR0YWcpIC4gJyIgLz4nOw0KCQkJfSBlbHNlIHsNCgkJCQkkb3V0cHV0W10gPSAnPGNhdGVn
b3J5PicgLiBodG1sc3BlY2lhbGNoYXJzKCR0YWcpIC4gJzwvY2F0ZWdvcnk+JzsNCgkJCX0N
CgkJfQ0KCQlyZXR1cm4gbi5qb2luKG4sICRvdXRwdXQpLm47DQoJfQ0KfQ0KDQoNCiMjIyBQ
UkVGUyBGVU5DVElPTlMgLyBDTEFTU0VTICMjIw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj
IyMjIyMjIyMjDQoNCmNsYXNzIHRydV90YWdzX3ByZWYgew0KCWZ1bmN0aW9uIF9fY29uc3Ry
dWN0KCRuYW1lLCAkZGVmYXVsdF92YWx1ZSwgJHR5cGUpIHsNCgkJJHRoaXMtPm5hbWUgPSAk
bmFtZTsNCgkJJHRoaXMtPnZhbHVlID0gJGRlZmF1bHRfdmFsdWU7DQoJCSR0aGlzLT5kZWZh
dWx0X3ZhbHVlID0gJGRlZmF1bHRfdmFsdWU7DQoJCSR0aGlzLT50eXBlID0gJHR5cGU7DQoJ
fQ0KDQoJZnVuY3Rpb24gdmFsaWRhdGVfdmFsdWUoJHZhbHVlKSB7DQoJCWlmICgkdmFsdWUp
IHsNCgkJCXJldHVybiAkdmFsdWU7DQoJCX0gZWxzZSBpZiAoJHRoaXMtPnR5cGUgPT0gJ2Jv
b2xlYW4nKSB7DQoJCQlyZXR1cm4gJzAnOw0KCQl9IGVsc2Ugew0KCQkJcmV0dXJuICdQbGVh
c2UgZW50ZXIgYSB2YWx1ZSBmb3IgJyAuICR0aGlzLT5uYW1lOw0KCQl9DQoJfQ0KfQ0KDQpm
dW5jdGlvbiB0cnVfdGFnc19sb2FkX3ByZWZzKCkgew0KCSRwcmVmcyA9IGFycmF5KCk7DQoN
CglnbG9iYWwgJHBlcm1saW5rX21vZGU7DQoJJHByZWZzW0NMRUFOX1VSTFNdID0gbmV3IHRy
dV90YWdzX3ByZWYoQ0xFQU5fVVJMUywgKCRwZXJtbGlua19tb2RlICE9ICdtZXNzeScgPyAn
Y2xlYW4nIDogJ21lc3N5JyksICdzdHJpbmcnKTsNCgkkcHJlZnNbVEFHX1NFQ1RJT05dID0g
bmV3IHRydV90YWdzX3ByZWYoVEFHX1NFQ1RJT04sICd0YWcnLCAnc3RyaW5nJyk7DQoJJHBy
ZWZzW1BBUk1fTkFNRV0gPSBuZXcgdHJ1X3RhZ3NfcHJlZihQQVJNX05BTUUsICd0JywgJ3N0
cmluZycpOw0KCSRwcmVmc1tUQUdTX0lOX0ZFRURfQ0FURUdPUklFU10gPSBuZXcgdHJ1X3Rh
Z3NfcHJlZihUQUdTX0lOX0ZFRURfQ0FURUdPUklFUywgJzEnLCAnYm9vbGVhbicpOw0KCSRw
cmVmc1tUQUdTX0lOX0ZFRURfQk9EWV0gPSBuZXcgdHJ1X3RhZ3NfcHJlZihUQUdTX0lOX0ZF
RURfQk9EWSwgJzAnLCAnYm9vbGVhbicpOw0KCSRwcmVmc1tUQUdTX0lOX1dSSVRFX1RBQl0g
PSBuZXcgdHJ1X3RhZ3NfcHJlZihUQUdTX0lOX1dSSVRFX1RBQiwgJzEnLCAnYm9vbGVhbicp
Ow0KCSRwcmVmc1tBVVRPQ09NUExFVEVfSU5fV1JJVEVfVEFCXSA9IG5ldyB0cnVfdGFnc19w
cmVmKEFVVE9DT01QTEVURV9JTl9XUklURV9UQUIsICcwJywgJ2Jvb2xlYW4nKTsNCgkkcHJl
ZnNbVVRGXzhfQ0FTRV0gPSBuZXcgdHJ1X3RhZ3NfcHJlZihVVEZfOF9DQVNFLCAnMScsICdi
b29sZWFuJyk7DQoNCglpZiAoc2FmZV9xdWVyeSgiZGVzY3JpYmUgIiAuIFBGWCAuICJ0cnVf
dGFnc19wcmVmcyIpKSB7DQoJCSRycyA9IHNhZmVfcm93cygnKicsICd0cnVfdGFnc19wcmVm
cycsICcxJyk7DQoJCWZvcmVhY2ggKCRycyBhcyAkcm93KSB7DQoJCQkkcHJlZnNbJHJvd1sn
bmFtZSddXS0+dmFsdWUgPSAkcm93Wyd2YWx1ZSddOw0KCQl9DQoJfQ0KDQoJcmV0dXJuICRw
cmVmczsNCn0NCg0KDQojIyMgT1RIRVIgU1VQUE9SVCBGVU5DVElPTlMgIyMjDQojIyMjIyMj
IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoNCmZ1bmN0aW9uIHRydV90YWdzX3JlZGlyZWN0
X2lmX25lZWRlZCgkdGFnX3BhcmFtZXRlcikgew0KCSRyZWRpcmVjdHMgPSB0cnVfdGFnc19s
b2FkX3JlZGlyZWN0cygpOw0KCWZvcmVhY2ggKCRyZWRpcmVjdHMgYXMgJGxlZnR0YWcgPT4g
JHJpZ2h0dGFnKSB7DQoJCWlmICgkbGVmdHRhZyA9PSAkdGFnX3BhcmFtZXRlciB8fCAkbGVm
dHRhZyA9PSBzdHJfcmVwbGFjZSgnLScsICcgJywgJHRhZ19wYXJhbWV0ZXIpKSB7DQoJCQl0
cnVfdGFnc19yZWRpcmVjdCgkcmlnaHR0YWcsIGZhbHNlKTsNCgkJCXJldHVybiB0cnVlOw0K
CQl9DQoJfQ0KDQoJcmV0dXJuIGZhbHNlOw0KfQ0KDQoNCmZ1bmN0aW9uIHRydV90YWdzX2xv
YWRfcmVkaXJlY3RzKCkgew0KCSRyZWRpcmVjdHMgPSBhcnJheSgpOw0KCWlmIChzYWZlX3F1
ZXJ5KCJkZXNjcmliZSAiIC4gUEZYIC4gInRydV90YWdzX3JlZGlyZWN0cyIpKSB7DQoJCSRy
cyA9IHNhZmVfcm93cygnKicsICd0cnVfdGFnc19yZWRpcmVjdHMnLCAnMSBvcmRlciBieSBs
ZWZ0dGFnJyk7DQoJCWZvcmVhY2ggKCRycyBhcyAkcm93KSB7DQoJCQkkcmVkaXJlY3RzWyRy
b3dbJ2xlZnR0YWcnXV0gPSAkcm93WydyaWdodHRhZyddOw0KCQl9DQoJfQ0KCXJldHVybiAk
cmVkaXJlY3RzOw0KfQ0KDQoNCmZ1bmN0aW9uIHRydV90YWdzX3JlZGlyZWN0KCRkZXN0aW5h
dGlvbiwgJGlzX2Z1bGxfdXJsKSB7DQoJZ2xvYmFsICR0cnVfdGFnc19wcmVmczsNCglpZiAo
JGlzX2Z1bGxfdXJsKSB7DQoJCSR1cmwgPSAkZGVzdGluYXRpb247DQoJCSRtZXNzYWdlID0g
J1RoZSByZXNvdXJjZSB5b3UgcmVxdWVzdGVkIGhhcyBtb3ZlZCB0byAnIC4gJGRlc3RpbmF0
aW9uOw0KCX0gZWxzZSB7DQoJCSR1cmwgPSB0cnVfdGFnc19saW5raWZ5X3RhZygkZGVzdGlu
YXRpb24sIGZhbHNlKTsNCgkJJG1lc3NhZ2UgPSAnVGhlIHJlcXVlc3RlZCB0YWcgaGFzIGJl
ZW4gcmVwbGFjZWQgYnkgJyAuICRkZXN0aW5hdGlvbjsNCgl9DQoNCgloZWFkZXIoJ0xvY2F0
aW9uOiAnIC4gJHVybCk7DQoJdHhwX2RpZSgkbWVzc2FnZSwgJzMwMScpOw0KfQ0KDQoNCmZ1
bmN0aW9uIHRydV90YWdzX2xpbmtpZnlfdGFnKCR0YWcsICR1c2VfYW1wID0gdHJ1ZSkgew0K
CWdsb2JhbCAkdHJ1X3RhZ3NfcHJlZnM7DQoJaWYgKHRydV90YWdzX2NsZWFuX3VybHMoKSkg
ew0KCQkkdXJscHJlZml4ID0gaHUgLiAkdHJ1X3RhZ3NfcHJlZnNbVEFHX1NFQ1RJT05dLT52
YWx1ZSAuICcvJzsNCgl9IGVsc2Ugew0KCQkkdXJscHJlZml4ID0gaHUgLiAnP3M9JyAuICR0
cnVfdGFnc19wcmVmc1tUQUdfU0VDVElPTl0tPnZhbHVlIC4gKCR1c2VfYW1wID8gJyZhbXA7
JyA6ICcmJykgLiAkdHJ1X3RhZ3NfcHJlZnNbUEFSTV9OQU1FXS0+dmFsdWUgLiAnPSc7DQoJ
fQ0KCSR1cmxzdWZmaXggPSAodHJ1X3RhZ3NfY2xlYW5fdXJscygpID8gJy8nIDogJycpOw0K
CXJldHVybiAkdXJscHJlZml4IC4gdXJsZW5jb2RlKCR0YWcpIC4gJHVybHN1ZmZpeDsNCn0N
Cg0KDQpmdW5jdGlvbiB0cnVfdGFnc19nZXRfdGFnc19mb3JfYXJ0aWNsZSgkYXJ0aWNsZUlE
KSB7DQoJZ2xvYmFsICR0aGlzYXJ0aWNsZSwgJHRydV90YWdzX3ByZWZzOw0KCWlmIChpc3Nl
dCgkdGhpc2FydGljbGUpKSB7DQoJCWV4dHJhY3QoJHRoaXNhcnRpY2xlKTsNCgl9DQoJJGtl
eXdvcmRzID0gJyc7DQoJaWYgKGlzc2V0KCR0aGlzaWQpICYmICR0aGlzaWQgPT0gJGFydGlj
bGVJRCkgew0KCQlpZiAoaXNzZXQoJHRoaXNhcnRpY2xlWydrZXl3b3JkcyddKSkgew0KCQkJ
JGtleXdvcmRzID0gJHRoaXNhcnRpY2xlWydrZXl3b3JkcyddOw0KCQl9DQoJfSBlbHNlIHsN
CgkJJHRhZ3NfZmllbGQgPSBUUlVfVEFHU19GSUVMRDsNCgkJJHJzID0gc2FmZV9yb3coJHRh
Z3NfZmllbGQsICJ0ZXh0cGF0dGVybiIsICJJRD0nJGFydGljbGVJRCcgQU5EICR0YWdzX2Zp
ZWxkIDw+ICcnIik7DQoJCWlmIChpc3NldCgkcnNbJHRhZ3NfZmllbGRdKSkgew0KCQkJJGtl
eXdvcmRzID0gJHJzWyR0YWdzX2ZpZWxkXTsNCgkJfQ0KCX0NCgkkYWxsX3RhZ3MgPSBhcnJh
eSgpOw0KCSRhbGxfdGFncyA9IGV4cGxvZGUoIiwiLCB0cmltKHRydV90YWdzX3N0cnRvbG93
ZXIoJGtleXdvcmRzKSkpOw0KDQoJcmV0dXJuIHRydV90YWdzX3RyaW1fdGFncygkYWxsX3Rh
Z3MpOw0KfQ0KDQoNCiMgZml4ZXMgYnVnIHdpdGggNC4wLjQncyB2ZXJzaW9uIG9mIGRvV3Jh
cCB0aGF0IGNhdXNlZCBzcGFjZXMgdG8gc2hvdyB1cCBiZWZvcmUgdGhlIGNvbW1hcw0KZnVu
Y3Rpb24gdHJ1X3RhZ3NfZG9fd3JhcCgkbGlzdCwgJHdyYXB0YWcsICRicmVhaywgJGNsYXNz
LCAkYnJlYWtjbGFzcykgew0KCWlmICghJHdyYXB0YWcgJiYgIXByZWdfbWF0Y2goJy9eXHcr
JC8nLCAkYnJlYWspKSB7DQoJCXJldHVybiBqb2luKCRicmVhay5uLCAkbGlzdCk7DQoJfSBl
bHNlIHsNCgkJcmV0dXJuIGRvV3JhcCgkbGlzdCwgJHdyYXB0YWcsICRicmVhaywgJGNsYXNz
LCAkYnJlYWtjbGFzcyk7DQoJfQ0KfQ0KDQoNCmZ1bmN0aW9uIHRydV90YWdzX3RyaW1fdGFn
cygkdGFnX2FycmF5KSB7DQoJJHRyaW1tZWQgPSBhcnJheSgpOw0KCWZvcmVhY2ggKCR0YWdf
YXJyYXkgYXMgJHRhZykgew0KCQlpZiAoIiIgIT0gdHJpbSgkdGFnKSkgew0KCQkJJHRyaW1t
ZWRbXSA9IHRyaW0oJHRhZyk7DQoJCX0NCgl9DQoJcmV0dXJuICR0cmltbWVkOw0KfQ0KDQoN
CmZ1bmN0aW9uIHRydV90YWdzX2ZpeHVwX3F1ZXJ5X2F0dHMoJGF0dHMsICR0YWdfcGFyYW1l
dGVyKSB7DQoJJGtleXdvcmRzID0gZXhwbG9kZSgnLCcsICR0YWdfcGFyYW1ldGVyKTsNCglm
b3JlYWNoICgka2V5d29yZHMgYXMgJGtleXdvcmQpIHsNCgkJaWYgKHN0cnBvcygka2V5d29y
ZCwgJy0nKSAhPT0gZmFsc2UpIHsNCgkJCSRrZXl3b3Jkc1tdID0gc3RyX3JlcGxhY2UoJy0n
LCAnICcsICRrZXl3b3JkKTsNCgkJfQ0KCX0NCgkkYXR0c1sna2V5d29yZHMnXSA9IGltcGxv
ZGUoJywnLCAka2V5d29yZHMpOw0KDQoJaWYgKGlzc2V0KCRhdHRzWydzZWN0aW9uJ10pICYm
IHN0cnBvcygkYXR0c1snc2VjdGlvbiddLCAnLCcpICE9PSBmYWxzZSkgew0KCQkkYXR0c1sn
c2VjdGlvbiddID0gJyc7DQoJfQ0KDQoJaWYgKGlzc2V0KCRhdHRzWydleGNsdWRlc2VjdGlv
biddKSkgew0KCQl1bnNldCgkYXR0c1snZXhjbHVkZXNlY3Rpb24nXSk7DQoJfQ0KDQoJaWYg
KGlzc2V0KCRhdHRzWydub2FydGljbGVzJ10pKSB7DQoJCXVuc2V0KCRhdHRzWydub2FydGlj
bGVzJ10pOw0KCX0NCg0KCWlmICghaXNzZXQoJGF0dHNbJ2xpbWl0J10pKSB7DQoJCSRhdHRz
WydsaW1pdCddID0gJzEwMDAnOw0KCX0NCg0KCWlmICghaXNzZXQoJGF0dHNbJ2FsbG93b3Zl
cnJpZGUnXSkpIHsNCgkJJGF0dHNbJ2FsbG93b3ZlcnJpZGUnXSA9IHRydWU7DQoJfQ0KDQoJ
aWYgKGlzc2V0KCRhdHRzWydzZWFyY2hmb3JtJ10pICYmICFpc3NldCgkYXR0c1snbGlzdGZv
cm0nXSkpIHsNCgkJJGF0dHNbJ2xpc3Rmb3JtJ10gPSAkYXR0c1snc2VhcmNoZm9ybSddOw0K
CX0NCg0KCWlmIChpc3NldCgkYXR0c1snc2hvd2NvdW50cyddKSkgew0KCQl1bnNldCgkYXR0
c1snc2hvd2NvdW50cyddKTsNCgl9DQoNCglpZiAoaXNzZXQoJGF0dHNbJzQwNHJlZGlyZWN0
J10pKSB7DQoJCXVuc2V0KCRhdHRzWyc0MDRyZWRpcmVjdCddKTsNCgl9DQoNCglyZXR1cm4g
JGF0dHM7DQp9DQoNCg0KZnVuY3Rpb24gdHJ1X3RhZ3Nfc3RydG9sb3dlcigkc3RyKSB7DQoJ
Z2xvYmFsICR0cnVfdGFnc19wcmVmczsNCglpZiAoJHRydV90YWdzX3ByZWZzW1VURl84X0NB
U0VdLT52YWx1ZSkgew0KCQlpZiAoZnVuY3Rpb25fZXhpc3RzKCdtYl9zdHJ0b2xvd2VyJykp
IHsNCgkJCXJldHVybiBtYl9zdHJ0b2xvd2VyKCRzdHIsIEVOQ09ESU5HKTsNCgkJfSBlbHNl
IHsNCgkJCXJldHVybiBzdHJ0b2xvd2VyKCRzdHIpOw0KCQl9DQoJfSBlbHNlIHsNCgkJcmV0
dXJuICRzdHI7DQoJfQ0KfQ0KDQpmdW5jdGlvbiB0cnVfdGFnc19zdHJ0b3VwcGVyKCRzdHIp
IHsNCglpZiAoZnVuY3Rpb25fZXhpc3RzKCdtYl9zdHJ0b3VwcGVyJykpIHsNCgkJcmV0dXJu
IG1iX3N0cnRvdXBwZXIoJHN0ciwgRU5DT0RJTkcpOw0KCX0gZWxzZSB7DQoJCXJldHVybiBz
dHJ0b3VwcGVyKCRzdHIpOw0KCX0NCn0NCg0KZnVuY3Rpb24gdHJ1X3RhZ3NfdWNmaXJzdCgk
c3RyKSB7DQoJaWYgKGZ1bmN0aW9uX2V4aXN0cygnbWJfc3Vic3RyJykgJiYgZnVuY3Rpb25f
ZXhpc3RzKCdtYl9zdHJ0b3VwcGVyJykgJiYgZnVuY3Rpb25fZXhpc3RzKCdtYl9zdHJsZW4n
KSAmJiBtYl9zdHJsZW4oJHN0ciwgRU5DT0RJTkcpID4gMSkgew0KCQlyZXR1cm4gbWJfc3Ry
dG91cHBlcihtYl9zdWJzdHIoJHN0ciwgMCwgMSwgRU5DT0RJTkcpLCBFTkNPRElORykgLiBt
Yl9zdWJzdHIoJHN0ciwgMSwgbWJfc3RybGVuKCRzdHIsIEVOQ09ESU5HKSwgRU5DT0RJTkcp
Ow0KCX0gZWxzZSB7DQoJCXJldHVybiB1Y2ZpcnN0KCRzdHIpOw0KCX0NCn0NCg0KZnVuY3Rp
b24gdHJ1X3RhZ3NfdWN3b3Jkcygkc3RyKSB7DQoJaWYgKGZ1bmN0aW9uX2V4aXN0cygnbWJf
Y29udmVydF9jYXNlJykpIHsNCgkJcmV0dXJuIG1iX2NvbnZlcnRfY2FzZSgkc3RyLCBNQl9D
QVNFX1RJVExFLCBFTkNPRElORyk7DQoJfSBlbHNlIHsNCgkJcmV0dXJuIHVjd29yZHMoJHN0
cik7DQoJfQ0KfQ0KDQoNCi8vdGhlc2UgbmV4dCB0d28gZnVuY3Rpb25zIGFyZSBncm9zcywg
YnV0IEkgY2FuJ3QgZmlndXJlIG91dCBhbm90aGVyIHdheSB0byBkbyBpdA0KZnVuY3Rpb24g
dHJ1X3RhZ3Nfc29ydF90YWdzKCR0YWdzX3dlaWdodCwgJHNvcnRfYnlfY291bnQsICRzb3J0
X2FzY2VuZGluZykgew0KCWdsb2JhbCAkdHJ1X3RhZ3NfdGFnc193ZWlnaHQsICR0cnVfdGFn
c19zb3J0X2FzY2VuZGluZzsNCg0KCSR0cnVfdGFnc190YWdzX3dlaWdodCA9ICR0YWdzX3dl
aWdodDsNCgkkdHJ1X3RhZ3Nfc29ydF9hc2NlbmRpbmcgPSAkc29ydF9hc2NlbmRpbmc7DQoN
CgkkdGVtcF9hcnJheSA9IGFycmF5X2tleXMoJHRhZ3Nfd2VpZ2h0KTsNCglpZiAoJHNvcnRf
YnlfY291bnQpIHsNCgkJdXNvcnQoJHRlbXBfYXJyYXksICJ0cnVfdGFnc19zb3J0X3RhZ3Nf
Y29tcGFyYXRvciIpOw0KCX0gZWxzZSB7DQoJCW5hdGNhc2Vzb3J0KCR0ZW1wX2FycmF5KTsN
CgkJJHRlbXBfYXJyYXkgPSBhcnJheV92YWx1ZXMoJHRlbXBfYXJyYXkpOw0KCX0NCg0KCSRz
b3J0ZWRfYXJyYXkgPSBhcnJheSgpOw0KCWZvcmVhY2ggKCR0ZW1wX2FycmF5IGFzICR0YWcp
IHsNCgkJJHNvcnRlZF9hcnJheVskdGFnXSA9ICR0YWdzX3dlaWdodFskdGFnXTsNCgl9DQoN
CglyZXR1cm4gJHNvcnRlZF9hcnJheTsNCn0NCg0KDQpmdW5jdGlvbiB0cnVfdGFnc19zb3J0
X3RhZ3NfY29tcGFyYXRvcigkbGVmdCwgJHJpZ2h0KSB7DQoJZ2xvYmFsICR0cnVfdGFnc190
YWdzX3dlaWdodCwgJHRydV90YWdzX3NvcnRfYXNjZW5kaW5nOw0KDQoJJGxlZnRfd2VpZ2h0
ID0gJHRydV90YWdzX3RhZ3Nfd2VpZ2h0WyRsZWZ0XTsNCgkkcmlnaHRfd2VpZ2h0ID0gJHRy
dV90YWdzX3RhZ3Nfd2VpZ2h0WyRyaWdodF07DQoJaWYgKCRsZWZ0X3dlaWdodCA9PSAkcmln
aHRfd2VpZ2h0KSB7DQoJCSR0ZW1wX2FycmF5ID0gYXJyYXkoJGxlZnQsICRyaWdodCk7DQoJ
CW5hdGNhc2Vzb3J0KCR0ZW1wX2FycmF5KTsNCgkJJHRlbXBfYXJyYXkgPSBhcnJheV92YWx1
ZXMoJHRlbXBfYXJyYXkpOw0KCQlyZXR1cm4gKCR0ZW1wX2FycmF5WzBdID09ICRsZWZ0ID8g
LTEgOiAxKTsNCgl9IGVsc2UgaWYgKCR0cnVfdGFnc19zb3J0X2FzY2VuZGluZykgew0KCQly
ZXR1cm4gJGxlZnRfd2VpZ2h0IC0gJHJpZ2h0X3dlaWdodDsNCgl9IGVsc2Ugew0KCQlyZXR1
cm4gJHJpZ2h0X3dlaWdodCAtICRsZWZ0X3dlaWdodDsNCgl9DQp9DQoNCg0KDQojIyMgQkFT
VEFSRCBGVU5DVElPTlMgVEhBVCBTSE9VTEROJ1QgSEFWRSBUTyBFWElTVCAjIyMNCiMjIyMj
IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQoN
CmZ1bmN0aW9uIHRydV90YWdzX3JlZG9fYXJ0aWNsZV9zZWFyY2goJGF0dHMpIHsNCgkkdGhl
QXR0cyA9IGxBdHRzKGFycmF5KCdsaW1pdCcgICAgID0+IDEwMDAsDQoJCQkJJ2NhdGVnb3J5
JyAgPT4gJycsDQoJCQkJJ3NlY3Rpb24nICAgPT4gJycsDQoJCQkJJ2V4Y2VycHRlZCcgPT4g
JycsDQoJCQkJJ2F1dGhvcicgICAgPT4gJycsDQoJCQkJJ3NvcnRieScgICAgPT4gJ1Bvc3Rl
ZCcsDQoJCQkJJ3NvcnRkaXInICAgPT4gJ2Rlc2MnLA0KCQkJCSdtb250aCcgICAgID0+ICcn
LA0KCQkJCSdrZXl3b3JkcycgID0+ICcnLA0KCQkJCSdmcm9udHBhZ2UnID0+ICcnLA0KCQkJ
CSdpZCcgICAgICAgID0+ICcnLA0KCQkJCSd0aW1lJyAgICAgID0+ICdwYXN0JywNCgkJCQkn
c3RhdHVzJyAgICA9PiAnNCcsDQoJCQkJJ29mZnNldCcgICAgPT4gMA0KCQkJKSwkYXR0cywg
MCk7DQoJZXh0cmFjdCgkdGhlQXR0cyk7DQoNCgkvL0J1aWxkaW5nIHF1ZXJ5IHBhcnRzDQoJ
JGZyb250cGFnZSA9ICgkZnJvbnRwYWdlKSA/IGZpbHRlckZyb250UGFnZSgpIDogJyc7DQoJ
JGNhdGVnb3J5ICA9ICghJGNhdGVnb3J5KSAgPyAnJyA6ICIgYW5kICgoQ2F0ZWdvcnkxPSci
LmRvc2xhc2goJGNhdGVnb3J5KS4iJykgb3IgKENhdGVnb3J5Mj0nIi5kb1NsYXNoKCRjYXRl
Z29yeSkuIicpKSAiOw0KCSRzZWN0aW9uICAgPSAoISRzZWN0aW9uKSAgID8gJycgOiAiIGFu
ZCBTZWN0aW9uID0gJyIuZG9zbGFzaCgkc2VjdGlvbikuIiciOw0KCSRleGNlcnB0ZWQgPSAo
JGV4Y2VycHRlZD09J3knKSAgPyAiIGFuZCBFeGNlcnB0ICE9JyciIDogJyc7DQoJJGF1dGhv
ciAgICA9ICghJGF1dGhvcikgICAgPyAnJyA6ICIgYW5kIEF1dGhvcklEID0gJyIuZG9zbGFz
aCgkYXV0aG9yKS4iJyI7DQoJJG1vbnRoICAgICA9ICghJG1vbnRoKSAgICAgPyAnJyA6ICIg
YW5kIFBvc3RlZCBsaWtlICciLmRvU2xhc2goJG1vbnRoKS4iJSciOw0KCSRpZCAgICAgICAg
PSAoISRpZCkgICAgICAgID8gJycgOiAiIGFuZCBJRCA9ICciLmludHZhbCgkaWQpLiInIjsN
Cglzd2l0Y2ggKCR0aW1lKSB7DQoJCWNhc2UgJ2FueSc6DQoJCQkkdGltZSA9ICIiOyBicmVh
azsNCgkJY2FzZSAnZnV0dXJlJzoNCgkJCSR0aW1lID0gIiBhbmQgUG9zdGVkID4gbm93KCki
OyBicmVhazsNCgkJZGVmYXVsdDoNCgkJCSR0aW1lID0gIiBhbmQgUG9zdGVkIDwgbm93KCki
Ow0KCX0NCglpZiAoIWlzX251bWVyaWMoJHN0YXR1cykpDQoJCSRzdGF0dXMgPSBnZXRTdGF0
dXNOdW0oJHN0YXR1cyk7DQoNCgkkY3VzdG9tID0gJyc7DQoJLy8gdHJ5aW5nIGN1c3RvbSBm
aWVsZHMgaGVyZQ0KCSRjdXN0b21GaWVsZHMgPSBnZXRDdXN0b21GaWVsZHMoKTsNCglpZiAo
JGN1c3RvbUZpZWxkcykgew0KCQlmb3JlYWNoKCRjdXN0b21GaWVsZHMgYXMgJGNGaWVsZCkg
ew0KCQkJaWYgKGlzc2V0KCRhdHRzWyRjRmllbGRdKSkNCgkJCQkkY3VzdG9tUGFpcnNbJGNG
aWVsZF0gPSAkYXR0c1skY0ZpZWxkXTsNCgkJfQ0KCQlpZighZW1wdHkoJGN1c3RvbVBhaXJz
KSkNCgkJCSRjdXN0b20gPSAgYnVpbGRDdXN0b21TcWwoJGN1c3RvbUZpZWxkcywkY3VzdG9t
UGFpcnMpOw0KCQllbHNlDQoJCQkkY3VzdG9tID0gJyc7DQoJfQ0KDQoJLy9BbGxvdyBrZXl3
b3JkcyBmb3Igbm8tY3VzdG9tIGFydGljbGVzLiBUaGF0IHRhZ2dpbmcgbW9kZSwgeW91IGtu
b3cNCglpZiAoJGtleXdvcmRzKSB7DQoJCSRrZXlzID0gZG9TbGFzaChhcnJheV9tYXAoJ3Ry
aW0nLCBleHBsb2RlKCcsJywgJGtleXdvcmRzKSkpOw0KCQlmb3JlYWNoICgka2V5cyBhcyAk
a2V5KSB7DQoJCQkka2V5cGFydHNbXSA9ICJGSU5EX0lOX1NFVCgnIi4ka2V5LiInLEtleXdv
cmRzKSI7DQoJCX0NCgkJJGtleXdvcmRzID0gIiBhbmQgKCIgLiBqb2luKCcgb3IgJywka2V5
cGFydHMpIC4gIikiOw0KCX0NCg0KCWlmICgkaWQpDQoJCSRzdGF0dXNxID0gIiBhbmQgU3Rh
dHVzID49ICc0JyI7DQoJZWxzZQ0KCQkkc3RhdHVzcSA9ICIgYW5kIFN0YXR1cz0nIi5kb1Ns
YXNoKCRzdGF0dXMpLiInIjsNCg0KCSR3aGVyZSA9ICIxIiAuICRzdGF0dXNxLiAkdGltZS4N
CgkJJGlkIC4gJGNhdGVnb3J5IC4gJHNlY3Rpb24gLiAkZXhjZXJwdGVkIC4gJG1vbnRoIC4g
JGF1dGhvciAuICRrZXl3b3JkcyAuICRjdXN0b20gLiAkZnJvbnRwYWdlOw0KDQoJCSRwZ29m
ZnNldCA9ICRvZmZzZXQgLiAnLCAnOw0KDQoJJHJzID0gc2FmZV9yb3dzX3N0YXJ0KCIqLCB1
bml4X3RpbWVzdGFtcChQb3N0ZWQpIGFzIHVQb3N0ZWQiLCAndGV4dHBhdHRlcm4nLA0KCQkk
d2hlcmUuICcgb3JkZXIgYnkgJyAuIGRvc2xhc2goJHNvcnRieSkgLiAnICcgLiBkb1NsYXNo
KCRzb3J0ZGlyKSAuICcgbGltaXQgJyAuIGRvU2xhc2goJGxpbWl0KSk7DQoNCglyZXR1cm4g
JHJzOw0KfQ0KDQoNCiI7czo0OiJ0eXBlIjtzOjE6IjUiO3M6NToib3JkZXIiO3M6MToiNSI7
czo1OiJmbGFncyI7czoxOiIwIjtzOjQ6ImhlbHAiO3M6MTExODoiPHA+VG8gbGVhcm4gbW9y
ZSBhYm91dCB0cnVfdGFncywgY2hlY2sgb3V0IHRoZSA8YSBocmVmPSJodHRwOi8vd3d3LnJh
aW5za2l0LmNvbS9ibG9nLzQ5My90cnV0YWdzLWEtdGFnZ2luZy1wbHVnaW4tZm9yLXRleHRw
YXR0ZXJuIiByZWw9Im5vZm9sbG93Ij5pbnRyb2R1Y3RvcnkgYXJ0aWNsZTwvYT4sIDxhIGhy
ZWY9Imh0dHA6Ly93d3cucmFpbnNraXQuY29tL3JlZmVyZW5jZS81MzcvdHJ1X3RhZ3MtcmVs
ZWFzZXMiIHJlbD0ibm9mb2xsb3ciPnJlbGVhc2VzIHBhZ2U8L2E+LCA8YSBocmVmPSJodHRw
Oi8vd3d3LnJhaW5za2l0LmNvbS9yZWZlcmVuY2UvNDk1L3RydXRhZ3MtZmVhdHVyZS1saXN0
IiByZWw9Im5vZm9sbG93Ij5mZWF0dXJlIGxpc3Q8L2E+LCA8YSBocmVmPSJodHRwOi8vd3d3
LnJhaW5za2l0LmNvbS9yZWZlcmVuY2UvNTU0L3RydV90YWdzLXJvYWRtYXAiIHJlbD0ibm9m
b2xsb3ciPnJvYWRtYXA8L2E+LCBhbmQgPGEgaHJlZj0iaHR0cDovL3d3dy5yYWluc2tpdC5j
b20vcmVmZXJlbmNlLzQ5Ny90cnV0YWdzLXVzYWdlLWluc3RydWN0aW9ucyIgcmVsPSJub2Zv
bGxvdyI+dXNhZ2UgaW5zdHJ1Y3Rpb25zPC9hPi48L3A+Cgo8cD5Zb3UgY2FuIGFsc28gZmlu
ZCB0aGUgc291cmNlIGNvZGUgYXQgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3RydWlz
dC90cnUtdGFncyIgcmVsPSJub2ZvbGxvdyI+Z2l0aHViLmNvbS90cnVpc3QvdHJ1LXRhZ3M8
L2E+LjwvcD4KCjxwPkkmIzgyMTc7dmUgdGFrZW4gdGhlIGRldGFpbGVkIGhlbHAgb3V0IG9m
IHRoZSBwbHVnaW47IG15IGFwb2xvZ2llcy4gIEl0IHdhcyB0b28gYmlnIGFuZCB0b28gZGlm
ZmljdWx0IHRvIGtlZXAgbWFpbnRhaW5pbmcgb24gbXkgc2l0ZSBhbmQgaW4gdGhlIHBsdWdp
bi4gIElmLCBteSBzaXRlIGlzIGV2ZXIgZG93biwgaG93ZXZlciwgdGhlIHNvdXJjZSA8c3Bh
biBjbGFzcz0iY2FwcyI+SFRNTDwvc3Bhbj4gb2YgdGhlIHVzYWdlIGluc3RydWN0aW9ucyBp
cyBhdmFpbGFibGUgZnJvbSB0aGUgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3RydWlz
dC90cnUtdGFncy9ibG9iL21hc3Rlci90cnVfdGFncy1kb2NzLmh0bWwiIHJlbD0ibm9mb2xs
b3ciPmdpdGh1YiByZXBvPC9hPjwvcD4iO3M6MzoibWQ1IjtzOjMyOiIwYTVkZTRkMmY5NzM5
NzcxYTY1ZWQyYmUyMGZlZjY2MyI7fQ==

Last edited by etc (2020-06-25 20:54:57)

Offline

#822 2020-06-25 12:33:41

whocarez
Plugin Author
From: Germany/Ukraine
Registered: 2007-10-08
Posts: 305
Website GitHub Twitter

Re: tru_tags: A tagging plugin for textpattern

Do I understand it right, that you only changed the load order to 3, means lower than 5 and these lines?

if (tru_tags_clean_urls()) {
	register_callback('tru_tags_clean_url_handler', 'pretext', '', 1);
}

Than it doesn’t solve the problem.

Offline

#823 2020-06-25 12:42:51

etc
Developer
Registered: 2010-11-11
Posts: 5,677
Website GitHub

Re: tru_tags: A tagging plugin for textpattern

whocarez wrote #324008:

Than it doesn’t solve the problem.

It’s a 4.8.2+ only version, sorry.

Offline

#824 2020-06-25 12:43:40

whocarez
Plugin Author
From: Germany/Ukraine
Registered: 2007-10-08
Posts: 305
Website GitHub Twitter

Re: tru_tags: A tagging plugin for textpattern

Ok, than we have to wait :-).

Offline

#825 2020-06-25 21:03:20

etc
Developer
Registered: 2010-11-11
Posts: 5,677
Website GitHub

Re: tru_tags: A tagging plugin for textpattern

Okay, this version should work in both 4.8.1 et 4.8.2.

Basic facts:

  • if you need to rewrite request_uri, set load order to something < 5 and register_callback('my_url_handler', 'pretext', '', 0); in 4.8.2 or call my_url_handler() directly in 4.8.1.
  • but actually it suffices to register_callback('my_url_handler', 'pretext'); and set global $pretext['s'] = 'my_section' in my_url_handler(), no need to rewrite URI. At this point URI chunks are stored in $pretext[1|2|...] so you can easily analyse them.

Offline

Board footer

Powered by FluxBB