Go to main content

Textpattern CMS support forum

You are not logged in. Register | Login | Help

#1429 2014-05-28 08:55:13

RedFox
Member
From: Netherlands
Registered: 2005-03-25
Posts: 805
Website

Re: zem_contact_reborn 4.0.3.20

Is it possible to get the error text (zem_contact_lang) in English and in another language (Dutch) without MLP?

[edit]
Of course … Els has all the answers … :)

[edit]

'field_missing' => '<txp:if_section name="nl">Het tekstveld "$var1" is niet ingevuld.</txp:if_section><txp:if_section name="uk">The textfield "$var1" is empty.</txp:if_section>',

Eh … it’s working and it’s not working … !?

Last edited by RedFox (2014-05-28 10:19:13)

Offline

#1430 2014-05-28 15:09:56

els
Moderator
From: The Netherlands
Registered: 2004-06-06
Posts: 7,458

Re: zem_contact_reborn 4.0.3.20

RedFox wrote #281094:

Els has all the answers … :)

That was a long time ago ;)

I had a look at the site in question, and I see that I made some changes to these lines in zem_contact_lang in the past. First, I changed the opening and closing double quotes (around $var1) to &#8220; and &#8221;, and second, apparently I switched from if_section to if_article_category. Can’t remember why… I may have encountered the same problem.
But if I were you, I’d first try and see if changing the quotes helps, and if it doesn’t, then have a look at the tag trace. That may provide some information on why it doesn’t work.

My current entry in zem_contact_lang (working!) is now this:

'field_missing'		=> '<txp:if_article_category name="nl">Verplicht veld, &#8220;<strong>'.$var1.'</strong>&#8221;, ontbreekt.</txp:if_article_category><txp:if_article_category name="en">Required field, &#8220;<strong>'.$var1.'</strong>&#8221;, is missing.</txp:if_article_category><txp:if_article_category name="pt">Por favor preencha o campo &#8220;<strong>'.$var1.'</strong>&#8221;.</txp:if_article_category>',

Offline

#1431 2014-05-28 17:41:53

RedFox
Member
From: Netherlands
Registered: 2005-03-25
Posts: 805
Website

Re: zem_contact_reborn 4.0.3.20

'field_missing' => '<txp:if_section name="nl">Het tekstveld &#8220;<strong>'.$var1.'</strong>&#8221; is niet ingevuld.</txp:if_section><txp:if_section name="uk">The textfield &#8220;<strong>'.$var1.'</strong>&#8221; is empty.</txp:if_section>',

Grandioso … :))

PS
But … I don’t understand the .. (dots) in .$var1. … !?

Last edited by RedFox (2014-05-28 17:42:58)

Offline

#1432 2014-05-28 17:49:47

RedFox
Member
From: Netherlands
Registered: 2005-03-25
Posts: 805
Website

Re: zem_contact_reborn 4.0.3.20

Is there a way to instruct the browser to go to the top of the form (for “thank you” or error text) if the submit button is clicked?

Last edited by RedFox (2014-05-28 17:51:10)

Offline

#1433 2014-05-28 21:00:49

els
Moderator
From: The Netherlands
Registered: 2004-06-06
Posts: 7,458

Re: zem_contact_reborn 4.0.3.20

RedFox wrote #281101:

But … I don’t understand the .. (dots) in .$var1. … !?

Something like this ;)

Offline

#1434 2014-05-29 10:10:33

RedFox
Member
From: Netherlands
Registered: 2005-03-25
Posts: 805
Website

Re: zem_contact_reborn 4.0.3.20

Okay … PHP operators … :S … do you mind if I leave it at that?

BTW … I’m trying to implement your code (tags) on other strings of zem_contact_lang, e.g. >

'form_expired'	=> '<txp:if_section name="nl">Het formulier is niet meer geldig; probeer het nog een keer a.u.b.</txp:if_section><txp:if_section name="uk">The form isn't valid anymore; try again please.</txp:if_section>',

… and of course I get all kind of errors. But after some tweaking (quotation marks) the string is properly rendered >

'form_expired'	=> "<txp:if_section name='nl'>Het formulier is niet meer geldig; probeer het nog een keer a.u.b.</txp:if_section><txp:if_section name='uk'>The form isn't valid anymore; try again please.</txp:if_section>",

Up to the next … :Q

Last edited by RedFox (2014-05-29 10:12:48)

Offline

#1435 2014-06-17 21:06:57

kuopassa
Plugin Author
From: Porvoo, Finland
Registered: 2008-12-03
Posts: 228
Website

Re: zem_contact_reborn 4.0.3.20

Could someone please modify the plugin so that it has the explode function instead of split, and turn it to Textpattern plugin? I can’t save that minor change to my plugin’s PHP version thanks to some security thingy that blocks changes from being saved.

Offline

#1436 2014-06-18 05:10:02

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

Re: zem_contact_reborn 4.0.3.20

Here it is

YToxMDp7czo0OiJuYW1lIjtzOjE4OiJ6ZW1fY29udGFjdF9yZWJvcm4iO3M6NjoiYXV0aG9yIjtzOjEzOiJUWFAgQ29tbXVuaXR5IjtzOjEwOiJhdXRob3JfdXJpIjtzOjUxOiJodHRwOi8vZm9ydW0udGV4dHBhdHRlcm4uY29tL3ZpZXd0b3BpYy5waHA/aWQ9MjM3MjgiO3M6NzoidmVyc2lvbiI7czo4OiI0LjAuMy4yMCI7czoxMToiZGVzY3JpcHRpb24iO3M6Mjc6IkZvcm0gbWFpbGVyIGZvciBUZXh0cGF0dGVybiI7czo0OiJoZWxwIjtzOjM3MDk1OiI8c3R5bGU+CiAgIGxpIGNvZGUge2ZvbnQtd2VpZ2h0OiBib2xkO30KICAgcHJlIHtwYWRkaW5nOiAwLjVlbSAxZW07IGJhY2tncm91bmQ6ICNlZWU7IGJvcmRlcjogMXB4IGRhc2hlZCAjY2NjO30KICAgaDEsIGgyLCBoMywgaDMgY29kZSB7Zm9udC1mYW1pbHk6IHNhbnMtc2VyaWY7IGZvbnQtd2VpZ2h0OiBib2xkO30KICAgaDEsIGgyLCBoMyB7bWFyZ2luLWxlZnQ6IC0xZW07fQogICBoMiwgaDMge21hcmdpbi10b3A6IDJlbTt9CiAgIGgxIHtmb250LXNpemU6IDNlbTt9CiAgIGgyIHtmb250LXNpemU6IDJlbTt9CiAgIGgzIHtmb250LXNpemU6IDEuNWVtO30KICAgbGkgYSBjb2RlIHtmb250LXdlaWdodDogbm9ybWFsO30KICAgLnJlcXVpcmVkLCAud2FybmluZyB7Y29sb3I6cmVkO30KIDwvc3R5bGU+CgoJPGgxIGlkPSJ0b3AiPlplbSBDb250YWN0IFJlYm9ybjwvaDE+CgoJPHA+UGxlYXNlIHJlcG9ydHMgYnVncyBhbmQgcHJvYmxlbXMgd2l0aCB0aGlzIHBsdWdpbiBpbiA8YSBocmVmPSJodHRwOi8vZm9ydW0udGV4dHBhdHRlcm4uY29tL3ZpZXd0b3BpYy5waHA/aWQ9MjM3MjgiPnRoaXMgZm9ydW0gdGhyZWFkPC9hPi48L3A+CgoJPHAgY2xhc3M9InJlcXVpcmVkIj5UaGlzIHBsdWdpbiByZXF1aXJlcyBhIHNlcGFyYXRlIGxhbmd1YWdlIHBsdWdpbiBjYWxsZWQgPGNvZGU+emVtX2NvbnRhY3RfbGFuZzwvY29kZT4gdG8gYmUgaW5zdGFsbGVkIGFuZCBhY3RpdmF0ZWQgdG8gd29yayBwcm9wZXJseS48L3A+CgoJPGgyIGlkPSJjb250ZW50cyI+Q29udGVudHM8L2gyPgoKCTx1bD4KCQk8bGk+PGEgaHJlZj0iI2ZlYXR1cmVzIj5GZWF0dXJlczwvYT48L2xpPgoJCTxsaT48YSBocmVmPSIjc3RhcnQiPkdldHRpbmcgc3RhcnRlZDwvYT4KCTx1bD4KCQk8bGk+PGEgaHJlZj0iI2NvbnRhY3Rmb3JtIj5Db250YWN0IGZvcm08L2E+PC9saT4KCQk8bGk+PGEgaHJlZj0iI3NlbmRhcnRpY2xlIj5TZW5kIGFydGljbGU8L2E+PC9saT4KCTwvdWw+PC9saT4KCQk8bGk+PGEgaHJlZj0iI3RhZ3MiPlRhZ3M8L2E+Cgk8dWw+CgkJPGxpPjxhIGhyZWY9IiN6YyI+IDxjb2RlPiYjNjA7dHhwOnplbV9jb250YWN0IC8mIzYyOzwvY29kZT4gPC9hPjwvbGk+CgkJPGxpPjxhIGhyZWY9IiN6Y190ZXh0Ij4gPGNvZGU+JiM2MDt0eHA6emVtX2NvbnRhY3RfdGV4dCAvJiM2Mjs8L2NvZGU+IDwvYT48L2xpPgoJCTxsaT48YSBocmVmPSIjemNfZW1haWwiPiA8Y29kZT4mIzYwO3R4cDp6ZW1fY29udGFjdF9lbWFpbCAvJiM2Mjs8L2NvZGU+IDwvYT48L2xpPgoJCTxsaT48YSBocmVmPSIjemNfdGV4dGFyZWEiPiA8Y29kZT4mIzYwO3R4cDp6ZW1fY29udGFjdF90ZXh0YXJlYSAvJiM2Mjs8L2NvZGU+IDwvYT48L2xpPgoJCTxsaT48YSBocmVmPSIjemNfc3VibWl0Ij4gPGNvZGU+JiM2MDt0eHA6emVtX2NvbnRhY3Rfc3VibWl0IC8mIzYyOzwvY29kZT4gPC9hPjwvbGk+CgkJPGxpPjxhIGhyZWY9IiN6Y19zZWxlY3QiPiA8Y29kZT4mIzYwO3R4cDp6ZW1fY29udGFjdF9zZWxlY3QgLyYjNjI7PC9jb2RlPiA8L2E+PC9saT4KCQk8bGk+PGEgaHJlZj0iI3pjX2NoZWNrYm94Ij4gPGNvZGU+JiM2MDt0eHA6emVtX2NvbnRhY3RfY2hlY2tib3ggLyYjNjI7PC9jb2RlPiA8L2E+PC9saT4KCQk8bGk+PGEgaHJlZj0iI3pjX3JhZGlvIj4gPGNvZGU+JiM2MDt0eHA6emVtX2NvbnRhY3RfcmFkaW8gLyYjNjI7PC9jb2RlPiA8L2E+PC9saT4KCQk8bGk+PGEgaHJlZj0iI3pjX3NlY3JldCI+IDxjb2RlPiYjNjA7dHhwOnplbV9jb250YWN0X3NlY3JldCAvJiM2Mjs8L2NvZGU+IDwvYT48L2xpPgoJCTxsaT48YSBocmVmPSIjemNfc2VydmVyX2luZm8iPiA8Y29kZT4mIzYwO3R4cDp6ZW1fY29udGFjdF9zZXJ2ZXJpbmZvIC8mIzYyOzwvY29kZT4gPC9hPjwvbGk+CgkJPGxpPjxhIGhyZWY9IiN6Y19zZW5kX2FydGljbGUiPiA8Y29kZT4mIzYwO3R4cDp6ZW1fY29udGFjdF9zZW5kX2FydGljbGUgLyYjNjI7PC9jb2RlPiA8L2E+PC9saT4KCTwvdWw+PC9saT4KCQk8bGk+PGEgaHJlZj0iI2FkdmFuY2VkIj5BZHZhbmNlZCBleGFtcGxlczwvYT4KCTx1bD4KCQk8bGk+PGEgaHJlZj0iI3Nob3dfZXJyb3IiPlNlcGFyYXRlIGlucHV0IGFuZCBlcnJvciBmb3JtczwvYT48L2xpPgoJCTxsaT48YSBocmVmPSIjc3ViamVjdF9mb3JtIj5Vc2VyIHNlbGVjdGFibGUgc3ViamVjdCBmaWVsZDwvYT48L2xpPgoJCTxsaT48YSBocmVmPSIjdG9fZm9ybSI+VXNlciBzZWxlY3RhYmxlIHJlY2lwaWVudCwgd2l0aG91dCBzaG93aW5nIGVtYWlsIGFkZHJlc3NlczwvYT48L2xpPgoJPC91bD48L2xpPgoJCTxsaT48YSBocmVmPSIjc3R5bGluZyI+U3R5bGluZzwvYT48L2xpPgoJCTxsaT48YSBocmVmPSIjaGlzdG9yeSI+SGlzdG9yeTwvYT48L2xpPgoJCTxsaT48YSBocmVmPSIjY3JlZGl0cyI+Q3JlZGl0czwvYT48L2xpPgoJCTxsaT48YSBocmVmPSIjYXBpIj5QbHVnaW4gPHNwYW4gY2xhc3M9ImNhcHMiPjxzcGFuIGNsYXNzPSJjYXBzIj5BUEk8L3NwYW4+PC9zcGFuPiBhbmQgY2FsbGJhY2sgZXZlbnRzPC9hPjwvbGk+Cgk8L3VsPgoKCTxoMiBpZD0iZmVhdHVyZXMiPkZlYXR1cmVzPC9oMj4KCgk8dWw+CgkJPGxpPkFyYml0cmFyeSB0ZXh0IGZpZWxkcyBjYW4gYmUgc3BlY2lmaWVkLCB3aXRoIG1pbi9tYXgvcmVxdWlyZWQgc2V0dGluZ3MgZm9yIHZhbGlkYXRpb24uPC9saT4KCQk8bGk+RW1haWwgYWRkcmVzcyB2YWxpZGF0aW9uLCBpbmNsdWRpbmcgYSBjaGVjayBmb3IgYSB2YWxpZCBNWCByZWNvcmQgKFVuaXggb25seSkuPC9saT4KCQk8bGk+U2FmZSBlc2NhcGluZyBvZiBpbnB1dCBkYXRhLjwvbGk+CgkJPGxpPlVURi04IHNhZmUuPC9saT4KCQk8bGk+QWNjZXNzaWJsZSBmb3JtIGxheW91dCwgaW5jbHVkaW5nIDxjb2RlPiYjNjA7bGFiZWwmIzYyOzwvY29kZT4sIDxjb2RlPiYjNjA7bGVnZW5kJiM2Mjs8L2NvZGU+IGFuZCA8Y29kZT4mIzYwO2ZpZWxkc2V0JiM2Mjs8L2NvZGU+IHRhZ3MuPC9saT4KCQk8bGk+VmFyaW91cyBjbGFzc2VzIGFuZCBpZHMgdG8gYWxsb3cgZWFzeSBzdHlsaW5nIG9mIGFsbCBwYXJ0cyBvZiB0aGUgZm9ybS48L2xpPgoJCTxsaT5BIHNlcGFyYXRlIGxhbmd1YWdlIHBsdWctaW4gdG8gZW5hYmxlIGVhc3kgbG9jYWxpc2F0aW9uLjwvbGk+CgkJPGxpPlNwYW0gcHJldmVudGlvbiA8c3BhbiBjbGFzcz0iY2FwcyI+PHNwYW4gY2xhc3M9ImNhcHMiPkFQSTwvc3Bhbj48L3NwYW4+ICh1c2VkIGJ5IFRyYW5xdWlsbG8mIzgyMTc7cyA8Y29kZT5wYXBfY29udGFjdF9jbGVhbmVyPC9jb2RlPiBwbHVnaW4pLjwvbGk+Cgk8L3VsPgoKCTxwPjxhIGhyZWY9IiN0b3AiPkJhY2sgdG8gdG9wPC9hPjwvcD4KCgk8aDIgaWQ9InN0YXJ0Ij5HZXR0aW5nIHN0YXJ0ZWQ8L2gyPgoKCTxoMyBpZD0iY29udGFjdGZvcm0iPkNvbnRhY3QgZm9ybTwvaDM+CgoJPHA+VGhlIHNpbXBsZXN0IGZvcm0gaXMgc2hvd24gYmVsb3csIHdoaWNoIHByb2R1Y2VzIGEgZGVmYXVsdCBmb3JtIHdpdGggTmFtZSwgRW1haWwgYW5kIE1lc3NhZ2UgZmllbGRzLiBFbWFpbCB3aWxsIGJlIGRlbGl2ZXJlZCB0byByZWNpcGllbnRAZXhhbXBsZS5jb20sIHdpdGggdGhlIHVzZXImIzgyMTc7cyBzdXBwbGllZCBlbWFpbCBhcyB0aGUgJiM4MjIwO0Zyb206JiM4MjIxOyBhZGRyZXNzLjwvcD4KCjxwcmU+PGNvZGU+JiM2MDt0eHA6emVtX2NvbnRhY3QgdG89JiMzNDtyZWNpcGllbnRAZXhhbXBsZS5jb20mIzM0OyAvJiM2MjsKPC9jb2RlPjwvcHJlPgoKCTxwPlRvIHNwZWNpZnkgZmllbGRzIGV4cGxpY2l0bHksIHVzZSBzb21ldGhpbmcgbGlrZSB0aGlzOjwvcD4KCjxwcmU+PGNvZGU+JiM2MDt0eHA6emVtX2NvbnRhY3QgdG89JiMzNDtyZWNpcGllbnRAZXhhbXBsZS5jb20mIzM0OyYjNjI7CiAgJiM2MDt0eHA6emVtX2NvbnRhY3RfZW1haWwgLyYjNjI7CiAgJiM2MDt0eHA6emVtX2NvbnRhY3RfdGV4dCBsYWJlbD0mIzM0O1Bob25lJiMzNDsgbWluPTcgbWF4PTE1LyYjNjI7CiAgJiM2MDt0eHA6emVtX2NvbnRhY3RfdGV4dGFyZWEgbGFiZWw9JiMzNDtZb3VyIHF1ZXN0aW9uJiMzNDsgLyYjNjI7CiAgJiM2MDt0eHA6emVtX2NvbnRhY3Rfc3VibWl0IGxhYmVsPSYjMzQ7U2VuZCYjMzQ7IC8mIzYyOwomIzYwOy90eHA6emVtX2NvbnRhY3QmIzYyOwo8L2NvZGU+PC9wcmU+CgoJPHA+QWx0ZXJuYXRpdmVseSwgcGxhY2UgdGhlIGZpZWxkIHNwZWNpZmljYXRpb25zIGluIGEgVGV4dHBhdHRlcm4gZm9ybSwgYW5kIGNhbGwgaXQgbGlrZSB0aGlzOjwvcD4KCjxwcmU+PGNvZGU+JiM2MDt0eHA6emVtX2NvbnRhY3QgdG89JiMzNDtyZWNpcGllbnRAZXhhbXBsZS5jb20mIzM0OyBmb3JtPSYjMzQ7bXljb250YWN0Zm9ybSYjMzQ7IC8mIzYyOwo8L2NvZGU+PC9wcmU+CgoJPHA+PGEgaHJlZj0iI3RvcCI+QmFjayB0byB0b3A8L2E+PC9wPgoKCTxoMyBpZD0ic2VuZGFydGljbGUiPlNlbmQgYXJ0aWNsZTwvaDM+CgoJPHA+V2l0aGluIHRoZSBjb250ZXh0IG9mIGFuIGluZGl2aWR1YWwgYXJ0aWNsZSwgdGhpcyBwbHVnaW4gY2FuIGJlIHVzZWQgdG8gc2VuZCB0aGUgYXJ0aWNsZSAob3IgZXhjZXJwdCwgaWYgaXQgZXhpc3RzKSB0byBhbiBlbWFpbCBhZGRyZXNzIHNwZWNpZmllZCBieSB0aGUgdmlzaXRvci4gVGhpcyByZXF1aXJlcyBhdCBsZWFzdCB0d28gdGFnczoKCTx1bD4KCQk8bGk+PGNvZGU+emVtX2NvbnRhY3Q8L2NvZGU+LCB0byBjcmVhdGUgZm9ybSB0aGF0IGlzIGluaXRpYWxseSBoaWRkZW4gYnkgc2V0dGluZyB0aGUgPGNvZGU+c2VuZF9hcnRpY2xlPC9jb2RlPiBhdHRyaWJ1dGUuPC9saT4KCQk8bGk+PGNvZGU+emVtX2NvbnRhY3Rfc2VuZF9hcnRpY2xlPC9jb2RlPiwgdG8gY3JlYXRlIGEgJiM4MjE2O3NlbmQgYXJ0aWNsZSYjODIxNzsgbGluayB3aGljaCByZXZlYWxzIHRoZSBhZm9yZW1lbnRpb25lZCBmb3JtIHdoZW4gY2xpY2tlZC48L2xpPgoJPC91bD48L3A+Cgo8cHJlPjxjb2RlPiYjNjA7dHhwOnplbV9jb250YWN0IHNlbmRfYXJ0aWNsZT0mIzM0OzEmIzM0OyAvJiM2MjsKJiM2MDt0eHA6emVtX2NvbnRhY3Rfc2VuZF9hcnRpY2xlIC8mIzYyOwo8L2NvZGU+PC9wcmU+CgoJPHA+QnkgZGVmYXVsdCB0aGUgZm9ybSBjb250YWlucyBmaWVsZHMgZm9yIHlvdXIgbmFtZSBhbmQgZW1haWwgYWRkcmVzcywgdGhlIHJlY2lwaWVudCYjODIxNztzIGVtYWlsIGFkZHJlc3MgYW5kIGEgcGVyc29uYWwgbWVzc2FnZSwgYnV0IHNpbWlsYXIgdG8gY29udGFjdCBmb3JtcyB5b3UgY2FuIGNyZWF0ZSB5b3VyIG93biBmb3JtIGxheW91dC4gU29tZSB0aGluZ3MgeW91IG5lZWQgdG8ga25vdzoKCTx1bD4KCQk8bGk+U2V0IHRoZSA8Y29kZT5zZW5kX2FydGljbGU8L2NvZGU+IGF0dHJpYnV0ZSB0byA8Y29kZT4xPC9jb2RlPiBpbiB0aGUgPGNvZGU+emVtX2NvbnRhY3Q8L2NvZGU+IHRhZy48L2xpPgoJCTxsaT5Vc2UgYSA8Y29kZT56ZW1fY29udGFjdF9lbWFpbDwvY29kZT4gdGFnIHdpdGggdGhlIDxjb2RlPnNlbmRfYXJ0aWNsZTwvY29kZT4gYXR0cmlidXRlIHNldCB0byA8Y29kZT4xPC9jb2RlPi4gVGhpcyBmaWVsZCB3aWxsIGJlIHVzZWQgYXMgdGhlIHJlY2lwaWVudCBlbWFpbCBhZGRyZXNzLjwvbGk+Cgk8L3VsPjwvcD4KCjxwcmU+PGNvZGU+JiM2MDt0eHA6emVtX2NvbnRhY3QgdG89JiMzNDt5b3VAZXhhbXBsZS5jb20mIzM0OyBzZW5kX2FydGljbGU9JiMzNDsxJiMzNDsmIzYyOwogICYjNjA7dHhwOnplbV9jb250YWN0X2VtYWlsIGxhYmVsPSYjMzQ7UmVjaXBpZW50IEVtYWlsJiMzNDsgc2VuZF9hcnRpY2xlPSYjMzQ7MSYjMzQ7IC8mIzYyOwogICYjNjA7dHhwOnplbV9jb250YWN0X2VtYWlsIGxhYmVsPSYjMzQ7WW91ciBFbWFpbCYjMzQ7IC8mIzYyOwogICYjNjA7dHhwOnplbV9jb250YWN0X3N1Ym1pdCBsYWJlbD0mIzM0O1NlbmQgQXJ0aWNsZSYjMzQ7IC8mIzYyOwomIzYwOy90eHA6emVtX2NvbnRhY3QmIzYyOwo8L2NvZGU+Cjxjb2RlPiYjNjA7dHhwOnplbV9jb250YWN0X3NlbmRfYXJ0aWNsZSAvJiM2MjsKPC9jb2RlPjwvcHJlPgoKCTxwPjxhIGhyZWY9IiN0b3AiPkJhY2sgdG8gdG9wPC9hPjwvcD4KCgk8aDIgaWQ9InRhZ3MiPlRhZ3M8L2gyPgoKCTxwPjxhIGhyZWY9IiN6YyI+PGNvZGU+JiM2MDt0eHA6emVtX2NvbnRhY3QgLyYjNjI7PC9jb2RlPjwvYT4gcHJvZHVjZXMgYSBmbGV4aWJsZSwgY3VzdG9taXNhYmxlIGVtYWlsIGNvbnRhY3QgZm9ybS4gSXQgaXMgaW50ZW5kZWQgZm9yIHVzZSBhcyBhbiBlbnF1aXJ5IGZvcm0gZm9yIGNvbW1lcmNpYWwgYW5kIHByaXZhdGUgc2l0ZXMsIGFuZCBpbmNsdWRlcyBzZXZlcmFsIGZlYXR1cmVzIHRvIGhlbHAgcmVkdWNlIGNvbW1vbiBwcm9ibGVtcyB3aXRoIHN1Y2ggZm9ybXMgKGludmFsaWQgZW1haWwgYWRkcmVzc2VzLCBtaXNzaW5nIGluZm9ybWF0aW9uKS48L3A+CgoJPHA+PGEgaHJlZj0iI3pjX3NlbmRfYXJ0aWNsZSI+PGNvZGU+JiM2MDt0eHA6emVtX2NvbnRhY3Rfc2VuZF9hcnRpY2xlIC8mIzYyOzwvY29kZT48L2E+IGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBhICYjODIyMDtzZW5kIGFydGljbGUmIzgyMjE7IGxpbmsgd2l0aGluIGFuIGFydGljbGUgZm9ybSwgY29ubmVjdGluZyBpdCB0byB0aGUgY29udGFjdCBmb3JtLjwvcD4KCgk8cD5BbGwgb3RoZXIgdGFncyBwcm92aWRlZCBieSB0aGlzIHBsdWdpbiBjYW4gb25seSBiZSB1c2VkIGluc2lkZSBhIDxjb2RlPiYjNjA7dHhwOnplbV9jb250YWN0JiM2Mjs8L2NvZGU+ICYjODIzMDsgPGNvZGU+JiM2MDsvdHhwOnplbV9jb250YWN0JiM2Mjs8L2NvZGU+IGNvbnRhaW5lciB0YWcgb3IgaW4gYSBUZXh0cGF0dGVybiBmb3JtIHVzZWQgYXMgdGhlIDxjb2RlPmZvcm08L2NvZGU+IGF0dHJpYnV0ZSBpbiB0aGUgPGNvZGU+JiM2MDt0eHA6emVtX2NvbnRhY3QgLyYjNjI7PC9jb2RlPiB0YWcuPC9wPgoKCTxwPjxhIGhyZWY9IiN0b3AiPkJhY2sgdG8gdG9wPC9hPjwvcD4KCgk8aDMgaWQ9InpjIj48Y29kZT4mIzYwO3R4cDp6ZW1fY29udGFjdCAvJiM2Mjs8L2NvZGU+PC9oMz4KCgk8cD5NYXkgYmUgdXNlZCBhcyBhIHNlbGYtY2xvc2luZyBvciBjb250YWluZXIgdGFnLiBQbGFjZSB0aGlzIHdoZXJlIHlvdSB3YW50IHRoZSBpbnB1dCBmb3JtIHRvIGdvLiBTdGF0dXMgYW5kIGVycm9yIG1lc3NhZ2VzLCBpZiBhbnksIHdpbGwgYmUgZGlzcGxheWVkIGJlZm9yZSB0aGUgZm9ybS48L3A+CgoJPGg0PkF0dHJpYnV0ZXM8L2g0PgoKCTx1bD4KCQk8bGk+PGNvZGU+dG89JiMzNDtlbWFpbCBhZGRyZXNzJiMzNDs8L2NvZGU+IDxzcGFuIGNsYXNzPSJyZXF1aXJlZCI+cmVxdWlyZWQ8L3NwYW4+PGJyIC8+ClJlY2lwaWVudCBlbWFpbCBhZGRyZXNzLjwvbGk+CgkJPGxpPjxjb2RlPnRvX2Zvcm09JiMzNDtmb3JtIG5hbWUmIzM0OzwvY29kZT48YnIgLz4KVXNlIHNwZWNpZmllZCBmb3JtIChvdmVycmlkZXMgPHN0cm9uZz50bzwvc3Ryb25nPiBhdHRyaWJ1dGUpLjwvbGk+Cgk8L3VsPgoKCTx1bD4KCQk8bGk+PGNvZGU+ZnJvbT0mIzM0O2VtYWlsIGFkZHJlc3MmIzM0OzwvY29kZT48YnIgLz4KRW1haWwgYWRkcmVzcyB1c2VkIGluIHRoZSAmIzgyMjA7RnJvbTomIzgyMjE7IGZpZWxkIHdoZW4gc2VuZGluZyBlbWFpbC4gRGVmYXVsdHMgdG8gdGhlIHNlbmRlciYjODIxNztzIGVtYWlsIGFkZHJlc3MuIElmIHNwZWNpZmllZCwgdGhlIHNlbmRlciYjODIxNztzIGVtYWlsIGFkZHJlc3Mgd2lsbCBiZSBwbGFjZWQgaW4gdGhlICYjODIyMDtSZXBseS1UbzomIzgyMjE7IGZpZWxkIGluc3RlYWQuPC9saT4KCQk8bGk+PGNvZGU+ZnJvbV9mb3JtPSYjMzQ7Zm9ybSBuYW1lJiMzNDs8L2NvZGU+PGJyIC8+ClVzZSBzcGVjaWZpZWQgZm9ybSAob3ZlcnJpZGVzIDxzdHJvbmc+ZnJvbTwvc3Ryb25nPiBhdHRyaWJ1dGUpLjwvbGk+Cgk8L3VsPgoKCTx1bD4KCQk8bGk+PGNvZGU+c3ViamVjdD0mIzM0O3N1YmplY3QgdGV4dCYjMzQ7PC9jb2RlPjxiciAvPgpTdWJqZWN0IHVzZWQgd2hlbiBzZW5kaW5nIGFuIGVtYWlsLiBEZWZhdWx0IGlzIHRoZSBzaXRlIG5hbWUuPC9saT4KCQk8bGk+PGNvZGU+c3ViamVjdF9mb3JtPSYjMzQ7Zm9ybSBuYW1lJiMzNDs8L2NvZGU+PGJyIC8+ClVzZSBzcGVjaWZpZWQgZm9ybSAob3ZlcnJpZGVzIDxzdHJvbmc+c3ViamVjdDwvc3Ryb25nPiBhdHRyaWJ1dGUpLjwvbGk+Cgk8L3VsPgoKCTx1bD4KCQk8bGk+PGNvZGU+dGhhbmtzPSYjMzQ7dGV4dCYjMzQ7PC9jb2RlPjxiciAvPgpNZXNzYWdlIHNob3duIGFmdGVyIHN1Y2Nlc3NmdWxseSBzdWJtaXR0aW5nIGEgbWVzc2FnZS4gRGVmYXVsdCBpcyA8c3Ryb25nPlRoYW5rIHlvdSwgeW91ciBtZXNzYWdlIGhhcyBiZWVuIHNlbnQ8L3N0cm9uZz4uPC9saT4KCQk8bGk+PGNvZGU+dGhhbmtzX2Zvcm09JiMzNDtmb3JtIG5hbWUmIzM0OzwvY29kZT48YnIgLz4KVXNlIHNwZWNpZmllZCBmb3JtIChvdmVycmlkZXMgPHN0cm9uZz50aGFua3M8L3N0cm9uZz4gYXR0cmlidXRlKS48L2xpPgoJCTxsaT48Y29kZT5yZWRpcmVjdD0mIzM0O1VSTCYjMzQ7PC9jb2RlPjxiciAvPgpSZWRpcmVjdCB0byBzcGVjaWZpZWQgPHNwYW4gY2xhc3M9ImNhcHMiPjxzcGFuIGNsYXNzPSJjYXBzIj5VUkw8L3NwYW4+PC9zcGFuPiAob3ZlcnJpZGVzIDxzdHJvbmc+dGhhbmtzPC9zdHJvbmc+IGFuZCA8c3Ryb25nPnRoYW5rc19mb3JtPC9zdHJvbmc+IGF0dHJpYnV0ZXMpLiA8c3BhbiBjbGFzcz0iY2FwcyI+PHNwYW4gY2xhc3M9ImNhcHMiPlVSTDwvc3Bhbj48L3NwYW4+IG11c3QgYmUgcmVsYXRpdmUgdG8gdGhlIFRleHRwYXR0ZXJuIFNpdGUgPHNwYW4gY2xhc3M9ImNhcHMiPjxzcGFuIGNsYXNzPSJjYXBzIj5VUkw8L3NwYW4+PC9zcGFuPi4gRXhhbXBsZTogPGVtPnJlZGlyZWN0PSYjODIyMDttb25rZXkmIzgyMjE7PC9lbT4gd291bGQgcmVkaXJlY3QgdG8gaHR0cDovL2V4YW1wbGUuY29tL21vbmtleS48L2xpPgoJPC91bD4KCgk8dWw+CgkJPGxpPjxjb2RlPmxhYmVsPSYjMzQ7dGV4dCYjMzQ7PC9jb2RlPjxiciAvPgpMYWJlbCBmb3IgdGhlIGNvbnRhY3QgZm9ybS4gSWYgc2V0IHRvIGFuIGVtcHR5IHN0cmluZywgZGlzcGxheSBvZiB0aGUgZmllbGRzZXQgYW5kIGxlZ2VuZCB0YWdzIHdpbGwgYmUgc3VwcHJlc3NlZC4gRGVmYXVsdCBpcyA8c3Ryb25nPkNvbnRhY3Q8L3N0cm9uZz4uPC9saT4KCQk8bGk+PGNvZGU+c2VuZF9hcnRpY2xlPSYjMzQ7Ym9vbGVhbiYjMzQ7PC9jb2RlPjxiciAvPgpXaGV0aGVyIHRvIHVzZSB0aGlzIGZvcm0gdG8gPGEgaHJlZj0iI2FydGljbGUiPnNlbmQgYW4gYXJ0aWNsZTwvYT4uIEF2YWlsYWJsZSB2YWx1ZXM6IDxzdHJvbmc+MTwvc3Ryb25nPiAoeWVzKSwgPHN0cm9uZz4wPC9zdHJvbmc+IChubykuIERlZmF1bHQgaXMgPHN0cm9uZz4wPC9zdHJvbmc+IChubykuPC9saT4KCQk8bGk+PGNvZGU+Y29weXNlbmRlcj0mIzM0O2Jvb2xlYW4mIzM0OzwvY29kZT48YnIgLz4KV2hldGhlciB0byBzZW5kIGEgY29weSBvZiB0aGUgZW1haWwgdG8gdGhlIHNlbmRlciYjODIxNztzIGFkZHJlc3MuIEF2YWlsYWJsZSB2YWx1ZXM6IDxzdHJvbmc+MTwvc3Ryb25nPiAoeWVzKSwgPHN0cm9uZz4wPC9zdHJvbmc+IChubykuIERlZmF1bHQgaXMgPHN0cm9uZz4wPC9zdHJvbmc+IChubykuPC9saT4KCTwvdWw+CgoJPHVsPgoJCTxsaT48Y29kZT5mb3JtPSYjMzQ7Zm9ybSBuYW1lJiMzNDs8L2NvZGU+PGJyIC8+ClVzZSBzcGVjaWZpZWQgZm9ybSwgY29udGFpbmluZyB0aGUgbGF5b3V0IG9mIHRoZSBjb250YWN0IGZvcm0gZmllbGRzLjwvbGk+CgkJPGxpPjxjb2RlPnNob3dfaW5wdXQ9JiMzNDtib29sZWFuJiMzNDs8L2NvZGU+PGJyIC8+CiBXaGV0aGVyIHRvIGRpc3BsYXkgdGhlIGZvcm0gaW5wdXQgZmllbGRzLiBBdmFpbGFibGUgdmFsdWVzOiA8c3Ryb25nPjE8L3N0cm9uZz4gKHllcyksIDxzdHJvbmc+MDwvc3Ryb25nPiAobm8pLiBEZWZhdWx0IGlzIDxzdHJvbmc+MTwvc3Ryb25nPiAoeWVzKS48L2xpPgoJCTxsaT48Y29kZT5zaG93X2Vycm9yPSYjMzQ7Ym9vbGVhbiYjMzQ7PC9jb2RlPjxiciAvPgogV2hldGhlciB0byBkaXNwbGF5IGVycm9yIGFuZCBzdGF0dXMgbWVzc2FnZXMuIEF2YWlsYWJsZSB2YWx1ZXM6IDxzdHJvbmc+MTwvc3Ryb25nPiAoeWVzKSwgPHN0cm9uZz4wPC9zdHJvbmc+IChubykuIERlZmF1bHQgaXMgPHN0cm9uZz4xPC9zdHJvbmc+ICh5ZXMpLjwvbGk+Cgk8L3VsPgoKCTxoND5FeGFtcGxlczwvaDQ+CgoJPHA+U2VlIDxhIGhyZWY9IiNjb250YWN0Zm9ybSI+R2V0dGluZyBzdGFydGVkPC9hPiBhbmQgPGEgaHJlZj0iI2FkdmFuY2VkIj5BZHZhbmNlZCBleGFtcGxlczwvYT4uPC9wPgoKCTxwPjxhIGhyZWY9IiN0b3AiPkJhY2sgdG8gdG9wPC9hPjwvcD4KCgk8aDMgaWQ9InpjX3RleHQiPjxjb2RlPiYjNjA7dHhwOnplbV9jb250YWN0X3RleHQgLyYjNjI7PC9jb2RlPjwvaDM+CgoJPHA+Q3JlYXRlcyBhIHRleHQgaW5wdXQgZmllbGQgYW5kIGNvcnJlc3BvbmRpbmcgPGNvZGU+JiM2MDtsYWJlbCYjNjI7PC9jb2RlPiB0YWcuIFRoZSBpbnB1dCB2YWx1ZSB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBlbWFpbCwgcHJlY2VkZWQgYnkgdGhlIGxhYmVsLjwvcD4KCgk8aDQ+QXR0cmlidXRlczwvaDQ+CgoJPHVsPgoJCTxsaT48Y29kZT5sYWJlbD0mIzM0O3RleHQmIzM0OzwvY29kZT48YnIgLz4KVGV4dCBsYWJlbCBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIuIERlZmF1bHQgaXMgPHN0cm9uZz5UZXh0PC9zdHJvbmc+LjwvbGk+CgkJPGxpPjxjb2RlPm5hbWU9JiMzNDt2YWx1ZSYjMzQ7PC9jb2RlPjxiciAvPgpGaWVsZCBuYW1lLCBhcyB1c2VkIGluIHRoZSA8c3BhbiBjbGFzcz0iY2FwcyI+PHNwYW4gY2xhc3M9ImNhcHMiPkhUTUw8L3NwYW4+PC9zcGFuPiBpbnB1dCB0YWcuPC9saT4KCQk8bGk+PGNvZGU+YnJlYWs9JiMzNDt0YWcmIzM0OzwvY29kZT48YnIgLz4KQnJlYWsgdGFnIGJldHdlZW4gdGhlIGxhYmVsIGFuZCBpbnB1dCBmaWVsZC4gRGVmYXVsdCBpcyA8Y29kZT4mIzYwO2JyIC8mIzYyOzwvY29kZT4uIFVzZSA8Y29kZT5icmVhaz0mIzM0OyYjMzQ7PC9jb2RlPiB0byBwdXQgdGhlIGxhYmVsIGFuZCBpbnB1dCBmaWVsZCBvbiB0aGUgc2FtZSBsaW5lLjwvbGk+CgkJPGxpPjxjb2RlPmRlZmF1bHQ9JiMzNDt2YWx1ZSYjMzQ7PC9jb2RlPjxiciAvPgpEZWZhdWx0IHZhbHVlIHdoZW4gbm8gaW5wdXQgaXMgcHJvdmlkZWQuPC9saT4KCQk8bGk+PGNvZGU+bWluPSYjMzQ7aW50ZWdlciYjMzQ7PC9jb2RlPjxiciAvPgpNaW5pbXVtIGlucHV0IGxlbmd0aCBpbiBjaGFyYWN0ZXJzLiBEZWZhdWx0IGlzIDxzdHJvbmc+MDwvc3Ryb25nPi48L2xpPgoJCTxsaT48Y29kZT5tYXg9JiMzNDtpbnRlZ2VyJiMzNDs8L2NvZGU+PGJyIC8+Ck1heGltdW0gaW5wdXQgbGVuZ3RoIGluIGNoYXJhY3RlcnMuIERlZmF1bHQgaXMgPHN0cm9uZz4xMDA8L3N0cm9uZz4uPC9saT4KCQk8bGk+PGNvZGU+c2l6ZT0mIzM0O2ludGVnZXImIzM0OzwvY29kZT48YnIgLz4KU2l6ZSBvZiB0aGUgaW5wdXQgZmllbGQgYXMgZGlzcGxheWVkIHRvIHRoZSB1c2VyLjwvbGk+CgkJPGxpPjxjb2RlPnJlcXVpcmVkPSYjMzQ7Ym9vbGVhbiYjMzQ7PC9jb2RlPjxiciAvPgpXaGV0aGVyIHRoaXMgdGV4dCBmaWVsZCBtdXN0IGJlIGZpbGxlZCBvdXQuIEF2YWlsYWJsZSB2YWx1ZXM6IDxzdHJvbmc+MTwvc3Ryb25nPiAoeWVzKSwgPHN0cm9uZz4wPC9zdHJvbmc+IChubykuIERlZmF1bHQgaXMgPHN0cm9uZz4xPC9zdHJvbmc+ICh5ZXMpLjwvbGk+Cgk8L3VsPgoKCTxoND5FeGFtcGxlPC9oND4KCjxwcmU+PGNvZGU+JiM2MDt0eHA6emVtX2NvbnRhY3RfdGV4dCBsYWJlbD0mIzM0O1lvdXIgbmFtZSYjMzQ7IC8mIzYyOwo8L2NvZGU+PC9wcmU+CgoJPHA+PGEgaHJlZj0iI3RvcCI+QmFjayB0byB0b3A8L2E+PC9wPgoKCTxoMyBpZD0iemNfZW1haWwiPjxjb2RlPiYjNjA7dHhwOnplbV9jb250YWN0X2VtYWlsIC8mIzYyOzwvY29kZT48L2gzPgoKCTxwPklucHV0IGZpZWxkIGZvciB1c2VyJiM4MjE3O3MgZW1haWwgYWRkcmVzcy48L3A+CgoJPHA+VGhlIGVudGVyZWQgZW1haWwgYWRkcmVzcyB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgdmFsaWRhdGVkIHRvIG1ha2Ugc3VyZSBpdCBpcyBvZiB0aGUgZm9ybSAmIzgyMjA7YWJjQHh4eC55eXlbLnp6el0mIzgyMjE7LiBPbiBub24tV2luZG93cyBzZXJ2ZXJzLCBhIHRlc3Qgd2lsbCBiZSBkb25lIHRvIHZlcmlmeSB0aGF0IGFuIEEgb3IgTVggcmVjb3JkIGV4aXN0cyBmb3IgdGhlIGRvbWFpbi4gTmVpdGhlciB0ZXN0IHByZXZlbnRzIHNwYW0sIGJ1dCBpdCBkb2VzIGhlbHAgZGV0ZWN0aW5nIGFjY2lkZW50YWwgdHlwaW5nIGVycm9ycy48L3A+CgoJPGg0PkF0dHJpYnV0ZXM8L2g0PgoKCTx1bD4KCQk8bGk+PGNvZGU+bGFiZWw9JiMzNDt0ZXh0JiMzNDs8L2NvZGU+PGJyIC8+ClRleHQgbGFiZWwgZGlzcGxheWVkIHRvIHRoZSB1c2VyLiBEZWZhdWx0IGlzIDxzdHJvbmc+RW1haWw8L3N0cm9uZz4uPC9saT4KCQk8bGk+PGNvZGU+bmFtZT0mIzM0O3ZhbHVlJiMzNDs8L2NvZGU+PGJyIC8+CkZpZWxkIG5hbWUsIGFzIHVzZWQgaW4gdGhlIDxzcGFuIGNsYXNzPSJjYXBzIj48c3BhbiBjbGFzcz0iY2FwcyI+SFRNTDwvc3Bhbj48L3NwYW4+IGlucHV0IHRhZy48L2xpPgoJCTxsaT48Y29kZT5icmVhaz0mIzM0O3RhZyYjMzQ7PC9jb2RlPjxiciAvPgpCcmVhayB0YWcgYmV0d2VlbiB0aGUgbGFiZWwgYW5kIGlucHV0IGZpZWxkLiBEZWZhdWx0IGlzIDxjb2RlPiYjNjA7YnIgLyYjNjI7PC9jb2RlPi4gVXNlIDxjb2RlPmJyZWFrPSYjMzQ7JiMzNDs8L2NvZGU+IHRvIHB1dCB0aGUgbGFiZWwgYW5kIGlucHV0IGZpZWxkIG9uIHRoZSBzYW1lIGxpbmUuPC9saT4KCQk8bGk+PGNvZGU+ZGVmYXVsdD0mIzM0O3ZhbHVlJiMzNDs8L2NvZGU+PGJyIC8+CkRlZmF1bHQgdmFsdWUgd2hlbiBubyBpbnB1dCBpcyBwcm92aWRlZC48L2xpPgoJCTxsaT48Y29kZT5taW49JiMzNDtpbnRlZ2VyJiMzNDs8L2NvZGU+PGJyIC8+Ck1pbmltdW0gaW5wdXQgbGVuZ3RoIGluIGNoYXJhY3RlcnMuIERlZmF1bHQgaXMgPHN0cm9uZz4wPC9zdHJvbmc+LjwvbGk+CgkJPGxpPjxjb2RlPm1heD0mIzM0O2ludGVnZXImIzM0OzwvY29kZT48YnIgLz4KTWF4aW11bSBpbnB1dCBsZW5ndGggaW4gY2hhcmFjdGVycy4gRGVmYXVsdCBpcyA8c3Ryb25nPjEwMDwvc3Ryb25nPi48L2xpPgoJCTxsaT48Y29kZT5zaXplPSYjMzQ7aW50ZWdlciYjMzQ7PC9jb2RlPjxiciAvPgpTaXplIG9mIHRoZSBpbnB1dCBmaWVsZCBhcyBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIuPC9saT4KCQk8bGk+PGNvZGU+cmVxdWlyZWQ9JiMzNDtib29sZWFuJiMzNDs8L2NvZGU+PGJyIC8+CldoZXRoZXIgdGhpcyB0ZXh0IGZpZWxkIG11c3QgYmUgZmlsbGVkIG91dC4gQXZhaWxhYmxlIHZhbHVlczogPHN0cm9uZz4xPC9zdHJvbmc+ICh5ZXMpLCA8c3Ryb25nPjA8L3N0cm9uZz4gKG5vKS4gRGVmYXVsdCBpcyA8c3Ryb25nPjE8L3N0cm9uZz4gKHllcykuPC9saT4KCQk8bGk+PGNvZGU+c2VuZF9hcnRpY2xlPSYjMzQ7Ym9vbGVhbiYjMzQ7PC9jb2RlPjxiciAvPgpXaGV0aGVyIHRoaXMgZmllbGQgaXMgdXNlZCBhcyB0aGUgcmVjaXBpZW50IGVtYWlsIGFkZHJlc3Mgd2hlbiB1c2luZyB0aGUgc2VuZF9hcnRpY2xlIGZ1bmN0aW9uLiBBdmFpbGFibGUgdmFsdWVzOiA8c3Ryb25nPjE8L3N0cm9uZz4gKHllcyksIDxzdHJvbmc+MDwvc3Ryb25nPiAobm8pLiBEZWZhdWx0IGlzIDxzdHJvbmc+MDwvc3Ryb25nPiAobm8pLjwvbGk+Cgk8L3VsPgoKCTxoND5FeGFtcGxlPC9oND4KCjxwcmU+PGNvZGU+JiM2MDt0eHA6emVtX2NvbnRhY3RfZW1haWwgbGFiZWw9JiMzNDtZb3VyIGVtYWlsIGFkZHJlc3MmIzM0OyAvJiM2MjsKPC9jb2RlPjwvcHJlPgoKCTxwPjxhIGhyZWY9IiN0b3AiPkJhY2sgdG8gdG9wPC9hPjwvcD4KCgk8aDMgaWQ9InpjX3RleHRhcmVhIj48Y29kZT4mIzYwO3R4cDp6ZW1fY29udGFjdF90ZXh0YXJlYSAvJiM2Mjs8L2NvZGU+PC9oMz4KCgk8cD5DcmVhdGVzIGEgdGV4dGFyZWEuPC9wPgoKCTxoND5BdHRyaWJ1dGVzPC9oND4KCgk8dWw+CgkJPGxpPjxjb2RlPmxhYmVsPSYjMzQ7dGV4dCYjMzQ7PC9jb2RlPjxiciAvPgpUZXh0IGxhYmVsIGRpc3BsYXllZCB0byB0aGUgdXNlci4gRGVmYXVsdCBpcyA8c3Ryb25nPk1lc3NhZ2U8L3N0cm9uZz4uPC9saT4KCQk8bGk+PGNvZGU+bmFtZT0mIzM0O3ZhbHVlJiMzNDs8L2NvZGU+PGJyIC8+CkZpZWxkIG5hbWUsIGFzIHVzZWQgaW4gdGhlIDxzcGFuIGNsYXNzPSJjYXBzIj48c3BhbiBjbGFzcz0iY2FwcyI+SFRNTDwvc3Bhbj48L3NwYW4+IGlucHV0IHRhZy48L2xpPgoJCTxsaT48Y29kZT5icmVhaz0mIzM0O3RhZyYjMzQ7PC9jb2RlPjxiciAvPgpCcmVhayB0YWcgYmV0d2VlbiB0aGUgbGFiZWwgYW5kIGlucHV0IGZpZWxkLiBEZWZhdWx0IGlzIDxjb2RlPiYjNjA7YnIgLyYjNjI7PC9jb2RlPi4gVXNlIDxjb2RlPmJyZWFrPSYjMzQ7JiMzNDs8L2NvZGU+IHRvIHB1dCB0aGUgbGFiZWwgYW5kIGlucHV0IGZpZWxkIG9uIHRoZSBzYW1lIGxpbmUuPC9saT4KCQk8bGk+PGNvZGU+ZGVmYXVsdD0mIzM0O3ZhbHVlJiMzNDs8L2NvZGU+PGJyIC8+CkRlZmF1bHQgdmFsdWUgd2hlbiBubyBpbnB1dCBpcyBwcm92aWRlZC48L2xpPgoJCTxsaT48Y29kZT5jb2xzPSYjMzQ7aW50ZWdlciYjMzQ7PC9jb2RlPjxiciAvPgpDb2x1bW4gd2lkdGguIERlZmF1bHQgaXMgPHN0cm9uZz41ODwvc3Ryb25nPi48L2xpPgoJCTxsaT48Y29kZT5yb3dzPSYjMzQ7aW50ZWdlciYjMzQ7PC9jb2RlPjxiciAvPgpSb3cgaGVpZ2h0LiBEZWZhdWx0IGlzIDxzdHJvbmc+ODwvc3Ryb25nPi48L2xpPgoJCTxsaT48Y29kZT5taW49JiMzNDtpbnRlZ2VyJiMzNDs8L2NvZGU+PGJyIC8+Ck1pbmltdW0gaW5wdXQgbGVuZ3RoIGluIGNoYXJhY3RlcnMuIERlZmF1bHQgaXMgPHN0cm9uZz4wPC9zdHJvbmc+LjwvbGk+CgkJPGxpPjxjb2RlPm1heD0mIzM0O2ludGVnZXImIzM0OzwvY29kZT48YnIgLz4KTWF4aW11bSBpbnB1dCBsZW5ndGggaW4gY2hhcmFjdGVycy4gRGVmYXVsdCBpcyA8c3Ryb25nPjEwMDAwPC9zdHJvbmc+LjwvbGk+CgkJPGxpPjxjb2RlPnJlcXVpcmVkPSYjMzQ7Ym9vbGVhbiYjMzQ7PC9jb2RlPjxiciAvPgpXaGV0aGVyIHRoaXMgdGV4dCBmaWVsZCBtdXN0IGJlIGZpbGxlZCBvdXQuIEF2YWlsYWJsZSB2YWx1ZXM6IDxzdHJvbmc+MTwvc3Ryb25nPiAoeWVzKSwgPHN0cm9uZz4wPC9zdHJvbmc+IChubykuIERlZmF1bHQgaXMgPHN0cm9uZz4xPC9zdHJvbmc+ICh5ZXMpLjwvbGk+Cgk8L3VsPgoKCTxoND5FeGFtcGxlPC9oND4KCgk8cD5UZXh0YXJlYSB0aGF0IGlzIDQwIGNoYXJzIHdpZGUsIDEwIGxpbmVzIGhpZ2gsIHdpdGggYSBjdXN0b21pemVkIGxhYmVsOjwvcD4KCjxwcmU+PGNvZGU+JiM2MDt0eHA6emVtX2NvbnRhY3RfdGV4dGFyZWEgY29scz0mIzM0OzQwJiMzNDsgcm93cz0mIzM0OzEwJiMzNDsgbGFiZWw9JiMzNDtZb3VyIHF1ZXN0aW9uJiMzNDsgLyYjNjI7CjwvY29kZT48L3ByZT4KCgk8cD48YSBocmVmPSIjdG9wIj5CYWNrIHRvIHRvcDwvYT48L3A+CgoJPGgzIGlkPSJ6Y19zdWJtaXQiPjxjb2RlPiYjNjA7dHhwOnplbV9jb250YWN0X3N1Ym1pdCAvJiM2Mjs8L2NvZGU+PC9oMz4KCgk8cD5DcmVhdGVzIGEgc3VibWl0IGJ1dHRvbi48YnIgLz4KV2hlbiB1c2VkIGFzIGEgY29udGFpbmVyIHRhZywgYSAmIzgyMjA7YnV0dG9uJiM4MjIxOyBlbGVtZW50IHdpbGwgYmUgdXNlZCBpbnN0ZWFkIG9mIGFuICYjODIyMDtpbnB1dCYjODIyMTsgZWxlbWVudC48L3A+CgoJPGg0PkF0dHJpYnV0ZXM6PC9oND4KCgk8dWw+CgkJPGxpPjxjb2RlPmxhYmVsPSYjMzQ7dGV4dCYjMzQ7PC9jb2RlPjxiciAvPgpUZXh0IHNob3duIG9uIHRoZSBzdWJtaXQgYnV0dG9uLiBEZWZhdWx0IGlzICYjODIyMDtTZW5kJiM4MjIxOy48L2xpPgoJCTxsaT48Y29kZT5idXR0b249JiMzNDtib29sZWFuJiMzNDs8L2NvZGU+PGJyIC8+CjxlbT5EZXByZWNhdGVkLiBVc2UgYSBjb250YWluZXIgdGFnIGlmIHlvdSB3YW50IGEgYnV0dG9uIGVsZW1lbnQuPC9lbT48L2xpPgoJPC91bD4KCgk8aDQ+RXhhbXBsZXM8L2g0PgoKCTxwPlN0YW5kYXJkIHN1Ym1pdCBidXR0b246PC9wPgoKPHByZT48Y29kZT4mIzYwO3R4cDp6ZW1fY29udGFjdF9zdWJtaXQgLyYjNjI7CjwvY29kZT48L3ByZT4KCgk8cD5TdWJtaXQgYnV0dG9uIHdpdGggeW91ciBvd24gdGV4dDo8L3A+Cgo8cHJlPjxjb2RlPiYjNjA7dHhwOnplbV9jb250YWN0X3N1Ym1pdCBsYWJlbD0mIzM0O1NlbmQmIzM0OyAvJiM2MjsKPC9jb2RlPjwvcHJlPgoKCTxwPlVzYWdlIGFzIGEgY29udGFpbmVyIHRhZywgd2hpY2ggYWxsb3dzIHlvdSB0byB1c2UgVGV4dHBhdHRlcm4gdGFncyBhbmQgPHNwYW4gY2xhc3M9ImNhcHMiPkhUTUw8L3NwYW4+IG1hcmt1cCBpbiB0aGUgc3VibWl0IGJ1dHRvbjo8L3A+Cgo8cHJlPjxjb2RlPiYjNjA7dHhwOnplbV9jb250YWN0X3N1Ym1pdCYjNjI7JiM2MDtzdHJvbmcmIzYyO1NlbmQmIzYwOy9zdHJvbmcmIzYyOyBxdWVzdGlvbiYjNjA7L3R4cDp6ZW1fY29udGFjdF9zdWJtaXQmIzYyOwo8L2NvZGU+PC9wcmU+Cgo8cHJlPjxjb2RlPiYjNjA7dHhwOnplbV9jb250YWN0X3N1Ym1pdCYjNjI7JiM2MDtpbWcgc3JjPSYjMzQ7cGF0aC90by9pbWcucG5nJiMzNDsgYWx0PSYjMzQ7c3VibWl0JiMzNDsmIzYyOyYjNjA7L3R4cDp6ZW1fY29udGFjdF9zdWJtaXQmIzYyOwo8L2NvZGU+PC9wcmU+CgoJPHA+PGEgaHJlZj0iI3RvcCI+QmFjayB0byB0b3A8L2E+PC9wPgoKCTxoMyBpZD0iemNfc2VsZWN0Ij48Y29kZT4mIzYwO3R4cDp6ZW1fY29udGFjdF9zZWxlY3QgLyYjNjI7PC9jb2RlPjwvaDM+CgoJPHA+Q3JlYXRlcyBhIGRyb3AtZG93biBzZWxlY3Rpb24gbGlzdC48L3A+CgoJPGg0PkF0dHJpYnV0ZXM8L2g0PgoKCTx1bD4KCQk8bGk+PGNvZGU+bGlzdD0mIzM0O2NvbW1hLXNlcGFyYXRlZCB2YWx1ZXMmIzM0OzwvY29kZT4gPHNwYW4gY2xhc3M9InJlcXVpcmVkIj5yZXF1aXJlZDwvc3Bhbj48YnIgLz4KTGlzdCBvZiBpdGVtcyB0byBzaG93IGluIHRoZSBzZWxlY3QgYm94LjwvbGk+CgkJPGxpPjxjb2RlPnNlbGVjdGVkPSYjMzQ7dmFsdWUmIzM0OzwvY29kZT48YnIgLz4KTGlzdCBpdGVtIHRoYXQgaXMgc2VsZWN0ZWQgYnkgZGVmYXVsdC48L2xpPgoJCTxsaT48Y29kZT5sYWJlbD0mIzM0O3RleHQmIzM0OzwvY29kZT48YnIgLz4KVGV4dCBsYWJlbCBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIuIERlZmF1bHQgaXMgPHN0cm9uZz5PcHRpb248L3N0cm9uZz4uPC9saT4KCQk8bGk+PGNvZGU+bmFtZT0mIzM0O3ZhbHVlJiMzNDs8L2NvZGU+PGJyIC8+CkZpZWxkIG5hbWUsIGFzIHVzZWQgaW4gdGhlIDxzcGFuIGNsYXNzPSJjYXBzIj48c3BhbiBjbGFzcz0iY2FwcyI+SFRNTDwvc3Bhbj48L3NwYW4+IGlucHV0IHRhZy48L2xpPgoJCTxsaT48Y29kZT5icmVhaz0mIzM0O3RhZyYjMzQ7PC9jb2RlPjxiciAvPgpCcmVhayB0YWcgYmV0d2VlbiB0aGUgbGFiZWwgYW5kIGlucHV0IGZpZWxkLiBEZWZhdWx0IGlzIDxjb2RlPiYjNjA7YnIgLyYjNjI7PC9jb2RlPi4gVXNlIDxjb2RlPmJyZWFrPSYjMzQ7JiMzNDs8L2NvZGU+IHRvIHB1dCB0aGUgbGFiZWwgYW5kIGlucHV0IGZpZWxkIG9uIHRoZSBzYW1lIGxpbmUuPC9saT4KCQk8bGk+PGNvZGU+ZGVsaW1pdGVyPSYjMzQ7Y2hhcmFjdGVyJiMzNDs8L2NvZGU+PGJyIC8+ClNlcGFyYXRvciBjaGFyYWN0ZXIgdXNlZCBpbiB0aGUgPHN0cm9uZz5saXN0PC9zdHJvbmc+IGF0dHJpYnV0ZS4gRGVmYXVsdCBpcyA8c3Ryb25nPiw8L3N0cm9uZz4gKGNvbW1hKS48L2xpPgoJCTxsaT48Y29kZT5yZXF1aXJlZD0mIzM0O2Jvb2xlYW4mIzM0OzwvY29kZT48YnIgLz4KV2hldGhlciBhIG5vbi1lbXB0eSBvcHRpb24gbXVzdCBiZSBzZWxlY3RlZC4gQXZhaWxhYmxlIHZhbHVlczogPHN0cm9uZz4xPC9zdHJvbmc+ICh5ZXMpLCA8c3Ryb25nPjA8L3N0cm9uZz4gKG5vKS4gRGVmYXVsdCBpcyA8c3Ryb25nPjE8L3N0cm9uZz4gKHllcykuPC9saT4KCTwvdWw+CgoJPGg0PkV4YW1wbGVzPC9oND4KCgk8cD5TZWxlY3QgbGlzdCBsYWJlbGVkICYjODIxNjtEZXBhcnRtZW50JiM4MjE3OywgY29udGFpbmluZyB0aHJlZSBvcHRpb25zIGFuZCBhIGJsYW5rIG9wdGlvbiAoZHVlIHRvIHRoZSBjb21tYSBiZWZvcmUgJiM4MjE2O01hcmtldGluZyYjODIxNzspIHNob3duIGJ5IGRlZmF1bHQsIGZvcmNpbmcgdGhlIHVzZXIgdG8gbWFrZSBhIHNlbGVjdGlvbi48L3A+Cgo8cHJlPjxjb2RlPiYjNjA7dHhwOnplbV9jb250YWN0X3NlbGVjdCBsYWJlbD0mIzM0O0RlcGFydG1lbnQmIzM0OyBsaXN0PSYjMzQ7LE1hcmtldGluZyxTYWxlcyxTdXBwb3J0JiMzNDsgLyYjNjI7CjwvY29kZT48L3ByZT4KCgk8cD5TZWxlY3QgbGlzdCBjb250YWluaW5nIHRocmVlIG9wdGlvbnMgd2l0aCAmIzgyMTY7TWFya2V0aW5nJiM4MjE3OyBzZWxlY3RlZCBieSBkZWZhdWx0LjwvcD4KCjxwcmU+PGNvZGU+JiM2MDt0eHA6emVtX2NvbnRhY3Rfc2VsZWN0IGxpc3Q9JiMzNDtNYXJrZXRpbmcsU2FsZXMsU3VwcG9ydCYjMzQ7IHNlbGVjdGVkPSYjMzQ7TWFya2V0aW5nJiMzNDsgLyYjNjI7CjwvY29kZT48L3ByZT4KCgk8cD48YSBocmVmPSIjdG9wIj5CYWNrIHRvIHRvcDwvYT48L3A+CgoJPGgzIGlkPSJ6Y19jaGVja2JveCI+PGNvZGU+JiM2MDt0eHA6emVtX2NvbnRhY3RfY2hlY2tib3ggLyYjNjI7PC9jb2RlPjwvaDM+CgoJPHA+Q3JlYXRlcyBhIGNoZWNrIGJveC48L3A+CgoJPGg0PkF0dHJpYnV0ZXM8L2g0PgoKCTx1bD4KCQk8bGk+PGNvZGU+bGFiZWw9JiMzNDt0ZXh0JiMzNDs8L2NvZGU+PGJyIC8+ClRleHQgbGFiZWwgZGlzcGxheWVkIHRvIHRoZSB1c2VyLiBEZWZhdWx0IGlzIDxzdHJvbmc+Q2hlY2tib3g8L3N0cm9uZz4uPC9saT4KCQk8bGk+PGNvZGU+bmFtZT0mIzM0O3ZhbHVlJiMzNDs8L2NvZGU+PGJyIC8+CkZpZWxkIG5hbWUsIGFzIHVzZWQgaW4gdGhlIDxzcGFuIGNsYXNzPSJjYXBzIj48c3BhbiBjbGFzcz0iY2FwcyI+SFRNTDwvc3Bhbj48L3NwYW4+IGlucHV0IHRhZy48L2xpPgoJCTxsaT48Y29kZT5icmVhaz0mIzM0O3RhZyYjMzQ7PC9jb2RlPjxiciAvPgpCcmVhayB0YWcgYmV0d2VlbiB0aGUgbGFiZWwgYW5kIGlucHV0IGZpZWxkLiBEZWZhdWx0IGlzIDxjb2RlPiYjNjA7YnIgLyYjNjI7PC9jb2RlPi4gVXNlIDxjb2RlPmJyZWFrPSYjMzQ7JiMzNDs8L2NvZGU+IHRvIHB1dCB0aGUgbGFiZWwgYW5kIGlucHV0IGZpZWxkIG9uIHRoZSBzYW1lIGxpbmUuPC9saT4KCQk8bGk+PGNvZGU+Y2hlY2tlZD0mIzM0O2Jvb2xlYW4mIzM0OzwvY29kZT48YnIgLz4KV2hldGhlciB0aGlzIGJveCBpcyBjaGVja2VkIHdoZW4gZmlyc3QgZGlzcGxheWVkLiBBdmFpbGFibGUgdmFsdWVzOiA8c3Ryb25nPjE8L3N0cm9uZz4gKHllcyksIDxzdHJvbmc+MDwvc3Ryb25nPiAobm8pLiBEZWZhdWx0IGlzICYjODIyMDswJiM4MjIxOyAobm8pLjwvbGk+CgkJPGxpPjxjb2RlPnJlcXVpcmVkPSYjMzQ7Ym9vbGVhbiYjMzQ7PC9jb2RlPjxiciAvPgpXaGV0aGVyIHRoaXMgY2hlY2tib3ggbXVzdCBiZSBmaWxsZWQgb3V0LiBBdmFpbGFibGUgdmFsdWVzOiA8c3Ryb25nPjE8L3N0cm9uZz4gKHllcyksIDxzdHJvbmc+MDwvc3Ryb25nPiAobm8pLiBEZWZhdWx0IGlzIDxzdHJvbmc+MTwvc3Ryb25nPiAoeWVzKS48L2xpPgoJPC91bD4KCgk8aDQ+RXhhbXBsZXM8L2g0PgoKCTxwPlNocmluay13cmFwIGFncmVlbWVudCB3aGljaCBtdXN0IGJlIGNoZWNrZWQgYnkgdGhlIHVzZXIgYmVmb3JlIHRoZSBlbWFpbCB3aWxsIGJlIHNlbnQuPC9wPgoKPHByZT48Y29kZT4mIzYwO3R4cDp6ZW1fY29udGFjdF9jaGVja2JveCBsYWJlbD0mIzM0O0kgYWNjZXB0IHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyYjMzQ7IC8mIzYyOwo8L2NvZGU+PC9wcmU+CgoJPHA+T3B0aW9uYWwgY2hlY2tib3hlczo8L3A+Cgo8cHJlPjxjb2RlPlNlbGVjdCB3aGljaCBvcGVyYXRpbmcgc3lzdGVtcyBhcmUgeW91IGZhbWlsaWFyIHdpdGg6JiM2MDticiAvJiM2MjsKJiM2MDt0eHA6emVtX2NvbnRhY3RfY2hlY2tib3ggbGFiZWw9JiMzNDtXaW5kb3dzJiMzNDsgcmVxdWlyZWQ9JiMzNDswJiMzNDsgLyYjNjI7JiM2MDticiAvJiM2MjsKJiM2MDt0eHA6emVtX2NvbnRhY3RfY2hlY2tib3ggbGFiZWw9JiMzNDtVbml4L0xpbnV4L0JTRCYjMzQ7IHJlcXVpcmVkPSYjMzQ7MCYjMzQ7IC8mIzYyOyYjNjA7YnIgLyYjNjI7CiYjNjA7dHhwOnplbV9jb250YWN0X2NoZWNrYm94IGxhYmVsPSYjMzQ7TWFjT1MmIzM0OyByZXF1aXJlZD0mIzM0OzAmIzM0OyAvJiM2MjsmIzYwO2JyIC8mIzYyOwo8L2NvZGU+PC9wcmU+CgoJPHA+PGEgaHJlZj0iI3RvcCI+QmFjayB0byB0b3A8L2E+PC9wPgoKCTxoMyBpZD0iemNfcmFkaW8iPjxjb2RlPiYjNjA7dHhwOnplbV9jb250YWN0X3JhZGlvIC8mIzYyOzwvY29kZT48L2gzPgoKCTxwPkNyZWF0ZXMgYSByYWRpbyBidXR0b24uPC9wPgoKCTxoND5BdHRyaWJ1dGVzPC9oND4KCgk8dWw+CgkJPGxpPjxjb2RlPmdyb3VwPSYjMzQ7dGV4dCYjMzQ7PC9jb2RlPiA8c3BhbiBjbGFzcz0icmVxdWlyZWQiPnJlcXVpcmVkPC9zcGFuPjxiciAvPgpUZXh0IHVzZWQgaW4gdGhlIGVtYWlsIHRvIGRlc2NyaWJlIHRoaXMgZ3JvdXAgb2YgcmFkaW8gYnV0dG9ucy4gVGhpcyBhdHRyaWJ1dGUgdmFsdWUgaXMgcmVtZW1iZXJlZCBmb3Igc3Vic2VxdWVudCByYWRpbyBidXR0b25zLCBzbyB5b3Ugb25seSBoYXZlIHRvIHNldCBpdCBvbiB0aGUgZmlyc3QgcmFkaW8gYnV0dG9uIG9mIGEgZ3JvdXAuIERlZmF1bHQgaXMgPHN0cm9uZz5SYWRpbzwvc3Ryb25nPi48L2xpPgoJCTxsaT48Y29kZT5sYWJlbD0mIzM0O3RleHQmIzM0OzwvY29kZT4gPHNwYW4gY2xhc3M9InJlcXVpcmVkIj5yZXF1aXJlZDwvc3Bhbj48YnIgLz4KVGV4dCBsYWJlbCBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIgYXMgcmFkaW8gYnV0dG9uIG9wdGlvbi48L2xpPgoJCTxsaT48Y29kZT5uYW1lPSYjMzQ7dmFsdWUmIzM0OzwvY29kZT48YnIgLz4KRmllbGQgbmFtZSwgYXMgdXNlZCBpbiB0aGUgPHNwYW4gY2xhc3M9ImNhcHMiPjxzcGFuIGNsYXNzPSJjYXBzIj5IVE1MPC9zcGFuPjwvc3Bhbj4gaW5wdXQgdGFnLiBUaGlzIGF0dHJpYnV0ZSB2YWx1ZSBpcyByZW1lbWJlcmVkIGZvciBzdWJzZXF1ZW50IHJhZGlvIGJ1dHRvbnMsIHNvIHlvdSBvbmx5IGhhdmUgdG8gc2V0IGl0IG9uIHRoZSBmaXJzdCByYWRpbyBidXR0b24gb2YgYSBncm91cC4gSWYgaXQgaGFzbiYjODIxNzt0IGJlZW4gc2V0IGF0IGFsbCwgaXQgd2lsbCBiZSBkZXJpdmVkIGZyb20gdGhlIDxjb2RlPmdyb3VwPC9jb2RlPiBhdHRyaWJ1dGUuPC9saT4KCQk8bGk+PGNvZGU+YnJlYWs9JiMzNDt0YWcmIzM0OzwvY29kZT48YnIgLz4KQnJlYWsgdGFnIGJldHdlZW4gdGhlIGxhYmVsIGFuZCBmaWVsZC4gRGVmYXVsdCBpcyBhIHNwYWNlLjwvbGk+CgkJPGxpPjxjb2RlPmNoZWNrZWQ9JiMzNDtib29sZWFuJiMzNDs8L2NvZGU+PGJyIC8+CldoZXRoZXIgdGhpcyByYWRpbyBvcHRpb24gaXMgY2hlY2tlZCB3aGVuIHRoZSBmb3JtIGlzIGZpcnN0IGRpc3BsYXllZC4gQXZhaWxhYmxlIHZhbHVlczogPHN0cm9uZz4xPC9zdHJvbmc+ICh5ZXMpLCA8c3Ryb25nPjA8L3N0cm9uZz4gKG5vKS4gRGVmYXVsdCBpcyA8c3Ryb25nPjA8L3N0cm9uZz4gKG5vKS48L2xpPgoJPC91bD4KCgk8aDQ+RXhhbXBsZTwvaDQ+CgoJPHA+R3JvdXAgbXV0dWFsbHkgZXhjbHVzaXZlIHJhZGlvIGJ1dHRvbnMgYnkgc2V0dGluZyB0aGUgPGNvZGU+Z3JvdXA8L2NvZGU+IGF0dHJpYnV0ZSBvbiB0aGUgZmlyc3QgcmFkaW8gYnV0dG9uIGluIGEgZ3JvdXAuIE9ubHkgdGhlIGNob3NlbiByYWRpbyBidXR0b24gZnJvbSBlYWNoIGdyb3VwIHdpbGwgYmUgdXNlZCBpbiB0aGUgZW1haWwgbWVzc2FnZS4gVGhlIG1lc3NhZ2Ugd2lsbCBiZSBvdXRwdXQgaW4gdGhlIGZvcm0gPHN0cm9uZz5ncm91cDogbGFiZWw8L3N0cm9uZz4gZm9yIGVhY2ggb2YgdGhlIGNob3NlbiByYWRpbyBidXR0b25zLjwvcD4KCjxwcmU+PGNvZGU+JiM2MDt0eHA6emVtX2NvbnRhY3RfcmFkaW8gbGFiZWw9JiMzNDtNZWRpdW0mIzM0OyBncm91cD0mIzM0O0kgbGlrZSBteSBzdGVhayYjMzQ7IC8mIzYyOwomIzYwO3R4cDp6ZW1fY29udGFjdF9yYWRpbyBsYWJlbD0mIzM0O1JhcmUmIzM0OyAvJiM2MjsKJiM2MDt0eHA6emVtX2NvbnRhY3RfcmFkaW8gbGFiZWw9JiMzNDtXZWxsIGRvbmUmIzM0OyAvJiM2MjsKPC9jb2RlPgo8Y29kZT4mIzYwO3R4cDp6ZW1fY29udGFjdF9yYWRpbyBsYWJlbD0mIzM0O1dpbmUmIzM0OyBncm91cD0mIzM0O1dpdGggYSBnbGFzcyBvZiYjMzQ7IC8mIzYyOwomIzYwO3R4cDp6ZW1fY29udGFjdF9yYWRpbyBsYWJlbD0mIzM0O0JlZXImIzM0OyAvJiM2MjsKJiM2MDt0eHA6emVtX2NvbnRhY3RfcmFkaW8gbGFiZWw9JiMzNDtXYXRlciYjMzQ7IC8mIzYyOwo8L2NvZGU+PC9wcmU+CgoJPHA+PGEgaHJlZj0iI3RvcCI+QmFjayB0byB0b3A8L2E+PC9wPgoKCTxoMyBpZD0iemNfc2VjcmV0Ij48Y29kZT4mIzYwO3R4cDp6ZW1fY29udGFjdF9zZWNyZXQgLyYjNjI7PC9jb2RlPjwvaDM+CgoJPHA+VGhpcyB0YWcgaGFzIG5vIGVmZmVjdCBvbiB0aGUgZm9ybSBvciA8c3BhbiBjbGFzcz0iY2FwcyI+SFRNTDwvc3Bhbj4gb3V0cHV0LCBidXQgd2lsbCBpbmNsdWRlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gaW4gdGhlIGVtYWlsLiBJdCBjYW4gYmUgdXNlZCBhcyBhIHNlbGYtY2xvc2luZyB0YWcgb3IgYXMgYSBjb250YWluZXIgdGFnLjwvcD4KCgk8aDQ+QXR0cmlidXRlczwvaDQ+CgoJPHVsPgoJCTxsaT48Y29kZT5uYW1lPSYjMzQ7dGV4dCYjMzQ7PC9jb2RlPjxiciAvPgpVc2VkIGludGVybmFsbHkuIFNldCB0aGlzIG9ubHkgaWYgeW91IGhhdmUgbXVsdGlwbGUgJiM4MjE2O3NlY3JldCYjODIxNzsgZm9ybSBlbGVtZW50cyB3aXRoIGlkZW50aWNhbCBsYWJlbHMuPC9saT4KCQk8bGk+PGNvZGU+bGFiZWw9JiMzNDt0ZXh0JiMzNDs8L2NvZGU+PGJyIC8+ClVzZWQgdG8gaWRlbnRpZnkgdGhlIGZpZWxkIGluIHRoZSBlbWFpbC4gRGVmYXVsdCBpcyA8c3Ryb25nPlNlY3JldDwvc3Ryb25nPi48L2xpPgoJCTxsaT48Y29kZT52YWx1ZT0mIzM0O3ZhbHVlJiMzNDs8L2NvZGU+PGJyIC8+ClNvbWUgdGV4dCB5b3Ugd2FudCB0byBhZGQgdG8gdGhlIGVtYWlsLjwvbGk+Cgk8L3VsPgoKCTxoND5FeGFtcGxlczwvaDQ+CgoJPHA+VXNhZ2UgYXMgYSBzZWxmLWNsb3NpbmcgdGFnPC9wPgoKPHByZT48Y29kZT4mIzYwO3R4cDp6ZW1fY29udGFjdF9zZWNyZXQgdmFsdWU9JiMzNDtUaGUgYW5zd2VyIGlzIDQyJiMzNDsgLyYjNjI7CjwvY29kZT48L3ByZT4KCgk8cD5Vc2FnZSBhcyBhIGNvbnRhaW5lciB0YWc8L3A+Cgo8cHJlPjxjb2RlPiYjNjA7dHhwOnplbV9jb250YWN0X3NlY3JldCBsYWJlbD0mIzM0O0RlYXIgdXNlciYjMzQ7JiM2MjsKICBQbGVhc2UgcHJvdmlkZSBhIHVzZWZ1bCBleGFtcGxlIGZvciB0aGlzIHRhZyEKJiM2MDsvdHhwOnplbV9jb250YWN0X3NlY3JldCYjNjI7CjwvY29kZT48L3ByZT4KCgk8cD48YSBocmVmPSIjdG9wIj5CYWNrIHRvIHRvcDwvYT48L3A+CgoJPGgzIGlkPSJ6Y19zZXJ2ZXJpbmZvIj48Y29kZT4mIzYwO3R4cDp6ZW1fY29udGFjdF9zZXJ2ZXJpbmZvIC8mIzYyOzwvY29kZT48L2gzPgoKCTxwPlRoaXMgdGFnIGhhcyBubyBlZmZlY3Qgb24gdGhlIGZvcm0gb3IgPHNwYW4gY2xhc3M9ImNhcHMiPkhUTUw8L3NwYW4+IG91dHB1dCwgYnV0IHdpbGwgaW5jbHVkZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGluIHRoZSBlbWFpbCBiYXNlZCBvbiB0aGUgPHNwYW4gY2xhc3M9ImNhcHMiPlBIUDwvc3Bhbj4gJF9TRVJWRVIgdmFyaWFibGUuPC9wPgoKCTxoND5BdHRyaWJ1dGVzPC9oND4KCgk8dWw+CgkJPGxpPjxjb2RlPm5hbWU9JiMzNDt2YWx1ZSYjMzQ7PC9jb2RlPiA8c3BhbiBjbGFzcz0icmVxdWlyZWQiPnJlcXVpcmVkPC9zcGFuPjxiciAvPgpOYW1lIG9mIHRoZSBzZXJ2ZXIgdmFyaWFibGUuIFNlZSB0aGUgPGEgaHJlZj0iaHR0cDovL3BocC5uZXQvbWFudWFsL3Jlc2VydmVkLnZhcmlhYmxlcy5waHAjcmVzZXJ2ZWQudmFyaWFibGVzLnNlcnZlciI+PHNwYW4gY2xhc3M9ImNhcHMiPlBIUDwvc3Bhbj4gbWFudWFsPC9hPiBmb3IgYSBmdWxsIGxpc3QuPC9saT4KCQk8bGk+PGNvZGU+bGFiZWw9JiMzNDt0ZXh0JiMzNDs8L2NvZGU+PGJyIC8+ClVzZWQgdG8gaWRlbnRpZnkgdGhlIGZpZWxkIGluIHRoZSBlbWFpbC4gRGVmYXVsdHMgdG8gdGhlIHZhbHVlIG9mIHRoZSA8c3Ryb25nPm5hbWU8L3N0cm9uZz4gYXR0cmlidXRlLjwvbGk+Cgk8L3VsPgoKCTxoND5FeGFtcGxlczwvaDQ+CgoJPHA+QWRkIHRoZSBJUCBhZGRyZXNzIG9mIHRoZSB2aXNpdG9yIHRvIHRoZSBlbWFpbDwvcD4KCjxwcmU+PGNvZGU+JiM2MDt0eHA6emVtX2NvbnRhY3Rfc2VydmVyaW5mbyBuYW1lPSYjMzQ7UkVNT1RFX0FERFImIzM0OyBsYWJlbD0mIzM0O0lQIG51bWJlciYjMzQ7IC8mIzYyOwo8L2NvZGU+PC9wcmU+CgoJPHA+QWRkIHRoZSBuYW1lIG9mIHRoZSB2aXNpdG9yJiM4MjE3O3MgYnJvd3NlciB0byB0aGUgZW1haWw8L3A+Cgo8cHJlPjxjb2RlPiYjNjA7dHhwOnplbV9jb250YWN0X3NlcnZlcmluZm8gbmFtZT0mIzM0O0hUVFBfVVNFUl9BR0VOVCYjMzQ7IGxhYmVsPSYjMzQ7QnJvd3NlciYjMzQ7IC8mIzYyOwo8L2NvZGU+PC9wcmU+CgoJPHA+PGEgaHJlZj0iI3RvcCI+QmFjayB0byB0b3A8L2E+PC9wPgoKCTxoMyBpZD0iemNfc2VuZF9hcnRpY2xlIj48Y29kZT4mIzYwO3R4cDp6ZW1fY29udGFjdF9zZW5kX2FydGljbGUgLyYjNjI7PC9jb2RlPjwvaDM+CgoJPHA+VXNlIHRoaXMgdGFnIGluIHlvdXIgaW5kaXZpZHVhbCBhcnRpY2xlIGZvcm0sIHdoZXJlIHlvdSB3YW50IHRoZSAmIzgyMjA7c2VuZCBhcnRpY2xlJiM4MjIxOyBsaW5rIHRvIGJlIGRpc3BsYXllZC48L3A+CgoJPGg0PkF0dHJpYnV0ZXM6PC9oND4KCgk8dWw+CgkJPGxpPjxjb2RlPmxpbmt0ZXh0PSYjMzQ7dGV4dCYjMzQ7PC9jb2RlPjxiciAvPgpUZXh0IGRpc3BsYXllZCBmb3IgdGhlIGxpbmsuIERlZmF1bHQgaXMgPHN0cm9uZz5zZW5kIGFydGljbGU8L3N0cm9uZz48L2xpPgoJPC91bD4KCgk8aDQ+RXhhbXBsZXM6PC9oND4KCgk8cD5TZWUgPGEgaHJlZj0iI3NlbmRhcnRpY2xlIj5HZXR0aW5nIHN0YXJ0ZWQ8L2E+PC9wPgoKCTxwPjxhIGhyZWY9IiN0b3AiPkJhY2sgdG8gdG9wPC9hPjwvcD4KCgk8aDIgaWQ9ImFkdmFuY2VkIj5BZHZhbmNlZCBleGFtcGxlczwvaDI+CgoJPGgzIGlkPSJzaG93X2Vycm9yIj5TZXBhcmF0ZSBpbnB1dCBhbmQgZXJyb3IgZm9ybXM8L2gzPgoKCTxwPlVzaW5nIDxjb2RlPnNob3dfaW5wdXQ8L2NvZGU+IGFuZCA8Y29kZT5zaG93X2Vycm9yPC9jb2RlPiB0byBkaXNwbGF5IHRoZSBmb3JtIGFuZCBlcnJvciBtZXNzYWdlcyBvbiBkaWZmZXJlbnQgcGFydHMgb2YgYSBwYWdlLiBBIGZvcm0gaXMgdXNlZCB0byBtYWtlIHN1cmUgdGhlIGNvbnRlbnRzIG9mIGJvdGggZm9ybXMgYXJlIGlkZW50aWNhbCwgb3RoZXJ3aXNlIHRoZXkgd291bGQgYmUgc2VlbiBhcyB0d28gaW5kZXBlbmRlbnQgZm9ybXMuIFRoZSBmaXJzdCBmb3JtIG9ubHkgc2hvd3MgZXJyb3JzIChubyBpbnB1dCksIHRoZSBzZWNvbmQgZm9ybSBvbmx5IHNob3dzIHRoZSBpbnB1dCBmaWVsZHMgKG5vIGVycm9ycykuPC9wPgoKPHByZT48Y29kZT4mIzYwO2RpdiBpZD0mIzM0O2Vycm9yJiMzNDsmIzYyOwogICYjNjA7dHhwOnplbV9jb250YWN0IGZvcm09JiMzNDtjb250YWN0X2Zvcm0mIzM0OyBzaG93X2lucHV0PSYjMzQ7MCYjMzQ7IC8mIzYyOwomIzYwOy9kaXYmIzYyOwo8L2NvZGU+Cjxjb2RlPiYjNjA7ZGl2IGlkPSYjMzQ7aW5wdXRmb3JtJiMzNDsmIzYyOwogICYjNjA7dHhwOnplbV9jb250YWN0IGZvcm09JiMzNDtjb250YWN0X2Zvcm0mIzM0OyBzaG93X2Vycm9yPSYjMzQ7MCYjMzQ7IC8mIzYyOwomIzYwOy9kaXYmIzYyOwo8L2NvZGU+PC9wcmU+CgoJPHA+QXBhcnQgZnJvbSB0aGUgPGNvZGU+c2hvd19lcnJvcjwvY29kZT4gYW5kIDxjb2RlPnNob3dfaW5wdXQ8L2NvZGU+IGF0dHJpYnV0ZXMsIGFsbCBvdGhlciBhdHRyaWJ1dGVzIG11c3QgYmUgMTAwJSBpZGVudGljYWwgaW4gYm90aCBmb3Jtcywgb3RoZXJ3aXNlIHRoZXkgd291bGQgYmUgc2VlbiBhcyB0d28gdW5yZWxhdGVkIGZvcm1zLjwvcD4KCgk8cD48YSBocmVmPSIjdG9wIj5CYWNrIHRvIHRvcDwvYT48L3A+CgoJPGgzIGlkPSJzdWJqZWN0X2Zvcm0iPlVzZXIgc2VsZWN0YWJsZSBzdWJqZWN0IGZpZWxkPC9oMz4KCgk8cD5TcGVjaWZ5IHRoZSA8Y29kZT5zdWJqZWN0X2Zvcm08L2NvZGU+IGF0dHJpYnV0ZSBhbmQgY3JlYXRlIGEgZm9ybSB3aGljaCBpbmNsdWRlcyBhIDxjb2RlPnplbV9jb250YWN0X3NlbGVjdDwvY29kZT4gdGFnOjwvcD4KCjxwcmU+PGNvZGU+JiM2MDt0eHA6emVtX2NvbnRhY3QgdG89JiMzNDt5b3VAZXhhbXBsZS5jb20mIzM0OyBzdWJqZWN0X2Zvcm09JiMzNDtteV9zdWJqZWN0X2Zvcm0mIzM0OyAvJiM2MjsKICAmIzYwO3R4cDp6ZW1fY29udGFjdF90ZXh0IGxhYmVsPSYjMzQ7TmFtZSYjMzQ7IC8mIzYyOyYjNjA7YnIgLyYjNjI7CiAgJiM2MDt0eHA6emVtX2NvbnRhY3RfZW1haWwgLyYjNjI7JiM2MDticiAvJiM2MjsKICAmIzYwO3R4cDp6ZW1fY29udGFjdF9zZWxlY3QgbGFiZWw9JiMzNDtDaG9vc2UgU3ViamVjdCYjMzQ7IGxpc3Q9JiMzNDssUXVlc3Rpb24sRmVlZGJhY2smIzM0OyAvJiM2MjsmIzYwO2JyIC8mIzYyOwogICYjNjA7dHhwOnplbV9jb250YWN0X3RleHRhcmVhIGxhYmVsPSYjMzQ7TWVzc2FnZSYjMzQ7IC8mIzYyOyYjNjA7YnIgLyYjNjI7CiYjNjA7L3R4cDp6ZW1fY29udGFjdCYjNjI7CjwvY29kZT48L3ByZT4KCgk8cD5DcmVhdGUgYSBUZXh0cGF0dGVybiBmb3JtIGNhbGxlZCAmIzgyMjA7bXlfc3ViamVjdF9mb3JtJiM4MjIxOywgY29udGFpbmluZzo8L3A+Cgo8cHJlPjxjb2RlPiYjNjA7dHhwOnBocCYjNjI7CiAgZ2xvYmFsICR6ZW1fY29udGFjdF9mb3JtOwogIGVjaG8gJHplbV9jb250YWN0X2Zvcm1bJiMzOTtDaG9vc2UgU3ViamVjdCYjMzk7XTsKJiM2MDsvdHhwOnBocCYjNjI7CjwvY29kZT48L3ByZT4KCgk8cD5UaGUgPGNvZGU+bGFiZWw8L2NvZGU+IHVzZWQgaW4gdGhlIDxjb2RlPnplbV9jb250YWN0X3NlbGVjdDwvY29kZT4gdGFnIG11c3QgYmUgaWRlbnRpY2FsIHRvIHRoZSBjb3JyZXNwb25kaW5nIHZhcmlhYmxlIGluIHRoZSA8Y29kZT5zdWJqZWN0X2Zvcm08L2NvZGU+LiBIZXJlIHdlIHVzZWQgPGNvZGU+Q2hvb3NlIHN1YmplY3Q8L2NvZGU+LjwvcD4KCgk8cD5JZiB5b3UmIzgyMTc7ZCBwcmVmZXIgdG8gYWRkIGEgY29tbW9uIHByZWZpeCBmb3IgYWxsIHN1YmplY3RzLCB1c2UgYSA8Y29kZT5zdWJqZWN0X2Zvcm08L2NvZGU+IGNvbnRhaW5pbmc6PC9wPgoKPHByZT48Y29kZT4mIzYwO3R4cDpwaHAmIzYyOwogIGdsb2JhbCAkemVtX2NvbnRhY3RfZm9ybTsKICBlY2hvICYjMzk7TXkgY29tbW9uIHByZWZpeCAtICYjMzk7IC4gJHplbV9jb250YWN0X2Zvcm1bJiMzOTtDaG9vc2UgU3ViamVjdCYjMzk7XTsKJiM2MDsvdHhwOnBocCYjNjI7CjwvY29kZT48L3ByZT4KCgk8cD48YSBocmVmPSIjdG9wIj5CYWNrIHRvIHRvcDwvYT48L3A+CgoJPGgzIGlkPSJ0b19mb3JtIj5Vc2VyIHNlbGVjdGFibGUgcmVjaXBpZW50LCB3aXRob3V0IHNob3dpbmcgZW1haWwgYWRkcmVzczwvaDM+CgoJPHA+U3BlY2lmeSB0aGUgPGNvZGU+dG9fZm9ybTwvY29kZT4gYXR0cmlidXRlIGFuZCBjcmVhdGUgYSBmb3JtIHdoaWNoIGluY2x1ZGVzIGEgPGNvZGU+emVtX2NvbnRhY3Rfc2VsZWN0PC9jb2RlPiB0YWc6PC9wPgoKPHByZT48Y29kZT4mIzYwO3R4cDp6ZW1fY29udGFjdCB0b19mb3JtPSYjMzQ7bXlfemVtX2NvbnRhY3RfdG9fZm9ybSYjMzQ7JiM2MjsKICAmIzYwO3R4cDp6ZW1fY29udGFjdF90ZXh0IGxhYmVsPSYjMzQ7TmFtZSYjMzQ7IC8mIzYyOyYjNjA7YnIgLyYjNjI7CiAgJiM2MDt0eHA6emVtX2NvbnRhY3RfZW1haWwgLyYjNjI7JiM2MDticiAvJiM2MjsKICAmIzYwO3R4cDp6ZW1fY29udGFjdF9zZWxlY3QgbGFiZWw9JiMzNDtEZXBhcnRtZW50JiMzNDsgbGlzdD0mIzM0OyxTdXBwb3J0LFNhbGVzJiMzNDsgLyYjNjI7JiM2MDticiAvJiM2MjsKICAmIzYwO3R4cDp6ZW1fY29udGFjdF90ZXh0YXJlYSBsYWJlbD0mIzM0O01lc3NhZ2UmIzM0OyAvJiM2MjsmIzYwO2JyIC8mIzYyOwomIzYwOy90eHA6emVtX2NvbnRhY3QmIzYyOwo8L2NvZGU+PC9wcmU+CgoJPHA+Q3JlYXRlIGEgVGV4dHBhdHRlcm4gZm9ybSBjYWxsZWQgJiM4MjIwO215X3plbV9jb250YWN0X3RvX2Zvcm0mIzgyMjE7LCBjb250YWluaW5nOjwvcD4KCjxwcmU+PGNvZGU+JiM2MDt0eHA6cGhwJiM2MjsKICBnbG9iYWwgJHplbV9jb250YWN0X2Zvcm07CiAgc3dpdGNoKCR6ZW1fY29udGFjdF9mb3JtWyYjMzk7RGVwYXJ0bWVudCYjMzk7XSkKICB7CiAgICBjYXNlICYjMzk7U3VwcG9ydCYjMzk7OgogICAgICBlY2hvICYjMzk7Y3Jld0BleGFtcGxlLmNvbSYjMzk7OwogICAgICBicmVhazsKICAgIGNhc2UgJiMzOTtTYWxlcyYjMzk7OgogICAgICBlY2hvICYjMzk7c2hvd21ldGhlbW9uZXlAZXhhbXBsZS5jb20mIzM5OzsKICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICBlY2hvICYjMzk7c29tZW9uZUBleGFtcGxlLmNvbSYjMzk7OwogIH0KJiM2MDsvdHhwOnBocCYjNjI7CjwvY29kZT48L3ByZT4KCgk8cD5UaGUgPGNvZGU+bGFiZWw8L2NvZGU+IHVzZWQgaW4gdGhlIDxjb2RlPnplbV9jb250YWN0X3NlbGVjdDwvY29kZT4gdGFnIG11c3QgYmUgaWRlbnRpY2FsIHRvIHRoZSBjb3JyZXNwb25zaW5nIHZhcmlhYmxlIGluIHRoZSA8Y29kZT50b19mb3JtPC9jb2RlPi4gSGVyZSB3ZSB1c2VkIDxjb2RlPkRlcGFydG1lbnQ8L2NvZGU+LjwvcD4KCgk8cD5BICYjODIxNjtkZWZhdWx0JiM4MjE3OyBlbWFpbCBhZGRyZXNzIGluIHRoZSA8Y29kZT50b19mb3JtPC9jb2RlPiBpcyBzcGVjaWZpZWQgdG8gZW5zdXJlIHRoYXQgYSB2YWxpZCBlbWFpbCBhZGRyZXNzIGlzIHVzZWQgaW4gY2FzZXMgd2hlcmUgeW91IGFkZCBvciBjaGFuZ2UgYSBzZWxlY3QvcmFkaW8gb3B0aW9uIGFuZCBmb3JnZXQgdG8gdXBkYXRlIHRoZSA8Y29kZT50b19mb3JtPC9jb2RlPi48L3A+CgoJPHAgY2xhc3M9Indhcm5pbmciPk5ldmVyIHVzZSB0YWdzIGxpa2UgPGNvZGU+emVtX2NvbnRhY3RfdGV4dDwvY29kZT4sIDxjb2RlPnplbV9jb250YWN0X2VtYWlsPC9jb2RlPiBvciA8Y29kZT56ZW1fY29udGFjdF90ZXh0YXJlYTwvY29kZT4gZm9yIHNldHRpbmcgdGhlIHJlY2lwaWVudCBhZGRyZXNzLCBvdGhlcndpc2UgeW91ciBmb3JtIGNhbiBiZSBhYnVzZWQgdG8gc2VuZCBzcGFtIHRvIGFueSBlbWFpbCBhZGRyZXNzITwvcD4KCgk8cD48YSBocmVmPSIjdG9wIj5CYWNrIHRvIHRvcDwvYT48L3A+CgoJPGgyIGlkPSJzdHlsaW5nIj5TdHlsaW5nPC9oMj4KCgk8cD5UaGUgZm9ybSBpdHNlbGYgaGFzIGEgY2xhc3MgPHN0cm9uZz56ZW1Db250YWN0Rm9ybTwvc3Ryb25nPiBzZXQgb24gdGhlIDxjb2RlPkZPUk08L2NvZGU+IDxzcGFuIGNsYXNzPSJjYXBzIj5IVE1MPC9zcGFuPiB0YWcuPC9wPgoKCTxwPlRoZSBsaXN0IG9mIGVycm9yIG1lc3NhZ2VzIChpZiBhbnkpIGhhcyBhIGNsYXNzIDxzdHJvbmc+emVtRXJyb3I8L3N0cm9uZz4gc2V0IG9uIHRoZSA8Y29kZT5VTDwvY29kZT4gPHNwYW4gY2xhc3M9ImNhcHMiPkhUTUw8L3NwYW4+IHRhZyB0aGF0IGVuY2xvc2VzIHRoZSBsaXN0IG9mIGVycm9ycy48L3A+CgoJPHA+QWxsIGZvcm0gZWxlbWVudHMgYW5kIGNvcnJlc3BvbmRpbmcgbGFiZWxzIGhhdmUgdGhlIGZvbGxvd2luZyBjbGFzc2VzIChvciBpZHMgc2V0KToKCTxvbD4KCQk8bGk+T25lIG9mIDxzdHJvbmc+emVtVGV4dDwvc3Ryb25nPiwgPHN0cm9uZz56ZW1UZXh0YXJlYTwvc3Ryb25nPiwgPHN0cm9uZz56ZW1TZWxlY3Q8L3N0cm9uZz4sIDxzdHJvbmc+emVtUmFkaW88L3N0cm9uZz4sIDxzdHJvbmc+emVtQ2hlY2tib3g8L3N0cm9uZz4sIDxzdHJvbmc+emVtU3VibWl0PC9zdHJvbmc+LiBJdCBzaG91bGQgYmUgb2J2aW91cyB3aGljaCBjbGFzcyBpcyB1c2VkIGZvciB3aGljaCBmb3JtIGVsZW1lbnQgKGFuZCBjb3JyZXNwb25kaW5nIGxhYmVsKS48L2xpPgoJCTxsaT48c3Ryb25nPnplbVJlcXVpcmVkPC9zdHJvbmc+IG9yIDxzdHJvbmc+ZXJyb3JFbGVtZW50PC9zdHJvbmc+IG9yIDxzdHJvbmc+emVtUmVxdWlyZWRlcnJvckVsZW1lbnQ8L3N0cm9uZz4sIGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZSBmb3JtIGVsZW1lbnQgaXMgcmVxdWlyZWQsIGFuIGVycm9yIHdhcyBmb3VuZCBpbiB3aGF0ZXZlciB0aGUgdmlzaXRvciBlbnRlcmVkJiM4MjMwOyBvciBib3RoLjwvbGk+CgkJPGxpPkFuIGluZGl2aWR1YWwgJiM4MjIwO2lkJiM4MjIxOyBvciAmIzgyMjA7Y2xhc3MmIzgyMjE7IHNldCB0byB0aGUgdmFsdWUgb2YgdGhlIDxjb2RlPm5hbWU8L2NvZGU+IGF0dHJpYnV0ZSBvZiB0aGUgY29ycmVzcG9uZGluZyB0YWcuIFdoZW4gc3R5bGluZyBmb3JtcyBiYXNlZCBvbiB0aGlzIGNsYXNzLCB5b3Ugc2hvdWxkIGV4cGxpY2l0bHkgc2V0IHRoZSA8Y29kZT5uYW1lPC9jb2RlPiBhdHRyaWJ1dGUgYmVjYXVzZSBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBuYW1lcyBtYXkgY2hhbmdlIGluIG5ld2VyIHplbV9jb250YWN0X3JlYm9ybiB2ZXJzaW9ucy48L2xpPgoJPC9vbD48L3A+CgoJPHA+PGEgaHJlZj0iI3RvcCI+QmFjayB0byB0b3A8L2E+PC9wPgoKCTxoMiBpZD0iaGlzdG9yeSI+SGlzdG9yeTwvaDI+CgoJPHA+T25seSB0aGUgY2hhbmdlcyB0aGF0IG1heSBhZmZlY3QgcGVvcGxlIHdobyB1cGdyYWRlIGFyZSBkZXRhaWxlZCBiZWxvdy48YnIgLz4KVG8gc2F2ZSBzcGFjZSwgbGlua3MgdG8gZm9ydW0gdG9waWNzIHRoYXQgZGV0YWlsIGFsbCB0aGUgY2hhbmdlcyBpbiBlYWNoIHZlcnNpb24gaGF2ZSBiZWVuIGFkZGVkLjwvcD4KCgk8dWw+CgkJPGxpPjE0IGZlYiAyMDA3OiA8c3Ryb25nPnZlcnNpb24gNC4wLjMuMTk8L3N0cm9uZz4gPGEgaHJlZj0iaHR0cDovL2ZvcnVtLnRleHRwYXR0ZXJuLmNvbS92aWV3dG9waWMucGhwP2lkPTIxMTQ0Ij5jaGFuZ2Vsb2c8L2E+Cgk8dWw+CgkJPGxpPjxhIGhyZWY9IiNzZW5kYXJ0aWNsZSI+c2VuZF9hcnRpY2xlPC9hPiBmdW5jdGlvbmFsaXR5IHJldmlzZWQsIHJlcXVpcmluZyBjaGFuZ2VzIHdoZW4gdXBncmFkaW5nIGZyb20gZWFybGllciB2ZXJzaW9uczwvbGk+CgkJPGxpPk5ldyBsYW5ndWFnZSBzdHJpbmdzOiAmIzgyMTY7c2VuZF9hcnRpY2xlJiM4MjE3OyBhbmQgJiM4MjE2O3JlY2lwaWVudCYjODIxNzsgKHJlcGxhY2VzICYjODIxNjtyZWNlaXZlciYjODIxNzspPC9saT4KCQk8bGk+U2V0cyBvZiByYWRpbyBidXR0b25zIHJlcXVpcmUgdGhlIG5ldyA8YSBocmVmPSIjemNfcmFkaW8iPmdyb3VwPC9hPiBhdHRyaWJ1dGU8L2xpPgoJCTxsaT5ZZXMvTm8gdmFsdWVzIGRlcHJlY2F0ZWQgaW4gZmF2b3IgZm9yIHRoZSA8c3BhbiBjbGFzcz0iY2FwcyI+PHNwYW4gY2xhc3M9ImNhcHMiPlRYUDwvc3Bhbj48L3NwYW4+IHN0YW5kYXJkIDEvMCB2YWx1ZXMgKHllcy9ubyBzdGlsbCB3b3JrIGluIHRoaXMgdmVyc2lvbik8L2xpPgoJPC91bD48L2xpPgoJCTxsaT4yMCBub3YgMjAwNjogPHN0cm9uZz52ZXJzaW9uIDQuMC4zLjE4PC9zdHJvbmc+IDxhIGhyZWY9Imh0dHA6Ly9mb3J1bS50ZXh0cGF0dGVybi5jb20vdmlld3RvcGljLnBocD9pZD0xOTgyMyI+Y2hhbmdlbG9nPC9hPgoJPHVsPgoJCTxsaT5JRHMgJiM4MjE2O3plbUNvbnRhY3RGb3JtJiM4MjE3OyBhbmQgJiM4MjE2O3plbVN1Ym1pdCYjODIxNzsgaGF2ZSBjaGFuZ2VkIHRvIGNsYXNzZXMgdG8gYWxsb3cgbXVsdGlwbGUgZm9ybXMgcGVyIHBhZ2U8L2xpPgoJCTxsaT5OZXcgbGFuZ3VhZ2Ugc3RyaW5nczogJiM4MjE2O2Zvcm1fdXNlZCYjODIxNzssICYjODIxNjtpbnZhbGlkX3V0ZjgmIzgyMTc7LCAmIzgyMTY7bWF4X3dhcm5pbmcmIzgyMTc7LCAmIzgyMTY7bmFtZSYjODIxNzssICYjODIxNjtyZWZyZXNoJiM4MjE3OywgJiM4MjE2O3NlY3JldCYjODIxNzs8L2xpPgoJPC91bD48L2xpPgoJCTxsaT4xMiBtYXIgMjAwNjogPHN0cm9uZz52ZXJzaW9uIDQuMC4zLjE3PC9zdHJvbmc+IDxhIGhyZWY9Imh0dHA6Ly9mb3J1bS50ZXh0cGF0dGVybi5jb20vdmlld3RvcGljLnBocD9pZD0xMzQxNiI+Y2hhbmdlbG9nPC9hPjwvbGk+CgkJPGxpPjExIGZlYiAyMDA2OiA8c3Ryb25nPnZlcnNpb24gLjE2PC9zdHJvbmc+PC9saT4KCQk8bGk+MDYgZmViIDIwMDY6IDxzdHJvbmc+dmVyc2lvbiAuMTU8L3N0cm9uZz48L2xpPgoJCTxsaT4wMyBmZWIgMjAwNjogPHN0cm9uZz52ZXJzaW9uIC4xNDwvc3Ryb25nPgoJPHVsPgoJCTxsaT5SZXF1aXJlcyBzZXBhcmF0ZSB6ZW1fY29udGFjdF9sYW5nIHBsdWdpbjwvbGk+Cgk8L3VsPjwvbGk+CgkJPGxpPjI5IGphbiAyMDA2OiA8c3Ryb25nPnZlcnNpb24gLjEyPC9zdHJvbmc+PC9saT4KCQk8bGk+MjcgamFuIDIwMDY6IDxzdHJvbmc+dmVyc2lvbiAuMTE8L3N0cm9uZz48L2xpPgoJCTxsaT4yMyBqYW4gMjAwNjogPHN0cm9uZz52ZXJzaW9uIC4wOSBhbmQgLjEwPC9zdHJvbmc+PC9saT4KCQk8bGk+MjMgamFuIDIwMDY6IDxzdHJvbmc+dmVyc2lvbiAuMDg8L3N0cm9uZz48L2xpPgoJCTxsaT4xNyBqYW4gMjAwNjogPHN0cm9uZz52ZXJzaW9uIC4wNzwvc3Ryb25nPjwvbGk+CgkJPGxpPjE2IGphbiAyMDA2OiA8c3Ryb25nPnZlcnNpb24gLjA1IGFuZCAuMDY8L3N0cm9uZz48L2xpPgoJCTxsaT4xNSBqYW4gMjAwNjogPHN0cm9uZz52ZXJzaW9uIC4wNDwvc3Ryb25nPjwvbGk+CgkJPGxpPjEwIGphbiAyMDA2OiA8c3Ryb25nPnZlcnNpb24gLjAzPC9zdHJvbmc+PC9saT4KCQk8bGk+MTkgZGVjIDIwMDU6IDxzdHJvbmc+dmVyc2lvbiAuMDI8L3N0cm9uZz48L2xpPgoJPC91bD4KCgk8cD48YSBocmVmPSIjdG9wIj5CYWNrIHRvIHRvcDwvYT48L3A+CgoJPGgyIGlkPSJjcmVkaXRzIj5DcmVkaXRzPC9oMj4KCgk8dWw+CgkJPGxpPjxzdHJvbmc+emVtPC9zdHJvbmc+IHdyb3RlIHRoZSB6ZW1fY29udGFjdCAwLjYgcGx1Z2luIG9uIHdoaWNoIHRoaXMgcGx1Z2luIHdhcyBpbml0aWFsbHkgYmFzZWQuPC9saT4KCQk8bGk+PHN0cm9uZz5NYXJ5PC9zdHJvbmc+IGNvbXBsZXRlbHkgcmV2aXNlZCB0aGUgcGx1Z2luIGNvZGUuPC9saT4KCQk8bGk+PHN0cm9uZz5TdHVhcnQ8L3N0cm9uZz4gVHVybmVkIGl0IGludG8gYSBwbHVnaW4sIGFkZGVkIGEgcmV2aXNlZCBoZWxwIHRleHQgYW5kIGFkZGl0aW9uYWwgY29kZS4gTWFpbnRhaW5lZCBhbGwgcGx1Z2luIHZlcnNpb25zIHRpbGwgNC4wLjMuMTcuPC9saT4KCQk8bGk+PHN0cm9uZz53ZXQ8L3N0cm9uZz4gYWRkZWQgdGhlIHplbV9jb250YWN0X3JhZGlvIHRhZy48L2xpPgoJCTxsaT48c3Ryb25nPlRyYW5xdWlsbG88L3N0cm9uZz4gYWRkZWQgdGhlIGFudGktc3BhbSA8c3BhbiBjbGFzcz0iY2FwcyI+PHNwYW4gY2xhc3M9ImNhcHMiPkFQSTwvc3Bhbj48L3NwYW4+IGFuZCB6ZW1fY29udGFjdF9zZW5kX2FydGljbGUgZnVuY3Rpb25hbGl0eS48L2xpPgoJCTxsaT48c3Ryb25nPmFzbHN3NjY8L3N0cm9uZz4sIDxzdHJvbmc+amR5a2FzdDwvc3Ryb25nPiBhbmQgb3RoZXJzICg/KSBwcm92aWRlZCBhZGRpdGlvbmFsIGNvZGU8L2xpPgoJCTxsaT48c3Ryb25nPlJ1dWQ8L3N0cm9uZz4gY2xlYW5lZCB1cCBhbmQgYXVkaXRlZCB0aGUgY29kZSB0byB3ZWVkIG91dCBidWdzIGFuZCBjb21wbGV0ZWx5IHJldmlzZWQgdGhlIGhlbHAgdGV4dC4gTWFpbnRhaW5lciBvZiB2ZXJzaW9ucyA0LjAuMy4xOCBhbmQgdXAuPC9saT4KCQk8bGk+U3VwcG9ydGVkIGFuZCB0ZXN0ZWQgdG8gZGVzdHJ1Y3Rpb24gYnkgdGhlIFRleHRwYXR0ZXJuIGNvbW11bml0eS48L2xpPgoJPC91bD4KCgk8cD48YSBocmVmPSIjdG9wIj5CYWNrIHRvIHRvcDwvYT48L3A+CgoJPGgyIGlkPSJhcGkiPlplbSBDb250YWN0IFJlYm9ybiYjODIxNztzIDxzcGFuIGNsYXNzPSJjYXBzIj5BUEk8L3NwYW4+PC9oMj4KCgk8cD5UaGUgcGx1Z2luIDxzcGFuIGNsYXNzPSJjYXBzIj5BUEk8L3NwYW4+IG9mIHplbSBjb250YWN0LCBkZXZlbG9wZWQgYnkgVHJhbnF1aWxsbywgaXMgc2ltaWxhciB0byB0aGUgY29tbWVudHMgPHNwYW4gY2xhc3M9ImNhcHMiPkFQSTwvc3Bhbj4gb2YgVGV4dHBhdHRlcm4sIHdoaWNoIGlzIGV4cGxhaW5lZCBpbiB0aGUgVGV4dGJvb2sgPGEgaHJlZj0iaHR0cDovL3RleHRwYXR0ZXJuLm5ldC93aWtpL2luZGV4LnBocD90aXRsZT1QbHVnaW5fRGV2ZWxvcG1lbnRfVG9waWNzIj5QbHVnaW4gRGV2ZWxvcG1lbnQgVG9waWNzPC9hPiBhbmQgPGEgaHJlZj0iaHR0cDovL3RleHRwYXR0ZXJuLm5ldC93aWtpL2luZGV4LnBocD90aXRsZT1Db21iYXRfQ29tbWVudF9TcGFtIj5Db21iYXQgQ29tbWVudCBTcGFtPC9hPi48L3A+CgoJPHA+VHdvIGNhbGxiYWNrIGV2ZW50cyBleGlzdCBpbiB6ZW1fY29udGFjdF9yZWJvcm46Cgk8dWw+CgkJPGxpPjxjb2RlPnplbWNvbnRhY3Quc3VibWl0PC9jb2RlPiBpcyBjYWxsZWQgYWZ0ZXIgdGhlIGZvcm0gaXMgc3VibWl0dGVkIGFuZCB0aGUgdmFsdWVzIGFyZSBjaGVja2VkIGlmIGVtcHR5IG9yIHZhbGlkIGVtYWlsIGFkZHJlc3NlcywgYnV0IGJlZm9yZSB0aGUgbWFpbCBpcyBzZW50LjwvbGk+CgkJPGxpPjxjb2RlPnplbWNvbnRhY3QuZm9ybTwvY29kZT4gbGV0JiM4MjE3O3MgeW91IGluc2VydCBjb250ZW50IGluIHRoZSBjb250YWN0IGZvcm0gYXMgZGlzcGxheWVkIHRvIHRoZSB2aXNpdG9yLjwvbGk+Cgk8L3VsPjwvcD4KCgk8cD5Gb3IgcmVmZXJlbmNlIGhlcmUgYXJlIHRoZSBjb21tYW5kcyB0aGF0IHdpbGwgYmUgaW50ZXJlc3RpbmcgdG8gcGx1Z2luIGRldmVsb3BlcnM6PC9wPgoKPHByZT48Y29kZT4vLyBUaGlzIHdpbGwgY2FsbCB5b3VyIGZ1bmN0aW9uIGJlZm9yZSB0aGUgZm9ybSBpcyBzdWJtaXR0ZWQKLy8gU28geW91IGNhbiBhbmFseXNlIHRoZSBzdWJtaXR0ZWQgZGF0YQpyZWdpc3Rlcl9jYWxsYmFjaygmIzM5O2FiY19teWZ1bmN0aW9uJiMzOTssJiMzOTt6ZW1jb250YWN0LnN1Ym1pdCYjMzk7KTsKPC9jb2RlPgo8Y29kZT4vLyBUaGlzIHdpbGwgY2FsbCB5b3VyIGZ1bmN0aW9uIGFuZCBhZGQgdGhlIG91dHB1dCAodXNlIHJldHVybiAkbXlzdHVmZikKLy8gdG8gdGhlIGNvbnRhY3QtZm9ybS4KcmVnaXN0ZXJfY2FsbGJhY2soJiMzOTthYmNfbXlvdGhlcmZ1bmN0aW9uMiYjMzk7LCYjMzk7emVtY29udGFjdC5mb3JtJiMzOTspOwo8L2NvZGU+Cjxjb2RlPi8vIFRvIGdldCBob2xkIG9mIHRoZSBmb3JtLXZhcmlhYmxlcyB5b3UgY2FuIHVzZQpnbG9iYWwgemVtX2NvbnRhY3RfZm9ybTsKPC9jb2RlPgo8Y29kZT4vLyBXaXRoIHRoZSBmb2xsb3dpbmcgdHdvIGxpbmVzIHlvdSBjYW4gdGVsbCB6ZW1fY29udGFjdCBpZiB5b3VyCi8vIHBsdWdpbiBmb3VuZCBzcGFtCiRldmFsdWF0b3IgPSYjMzg7IGdldF96ZW1jb250YWN0X2V2YWx1YXRvcigpOwo8L2NvZGU+Cjxjb2RlPi8vIFRoZSBwYXNzZWQgdmFsdWUgbXVzdCBiZSBub24temVybyB0byBtYXJrIHRoZSBjb250ZW50IGFzIHNwYW0uCi8vIFZhbHVlIG11c3QgYmUgYSBudW1iZXIgYmV0d2VlbiAwIGFuZCAxLgokZXZhbHVhdG9yIC0mIzYyOyBhZGRfemVtY29udGFjdF9zdGF0dXMoMSk7CjwvY29kZT48L3ByZT4KCgk8cD5NdWx0aXBsZSBwbHVnaW5zIGNhbiBiZSBhY3RpdmUgYXQgdGhlIHNhbWUgdGltZSBhbmQgZWFjaCBvZiB0aGVtIGNhbiBtYXJrIHRoZSBzdWJtaXR0ZWQgY29udGVudCBhcyBzcGFtIGFuZCBwcmV2ZW50IHRoZSBmb3JtIGZyb20gYmVpbmcgc3VibWl0dGVkLjwvcD4KCgk8cD48c3Ryb25nPkFuIGV4YW1wbGUgb2YgYSBwbHVnLWluIGNvbm5lY3RpbmcgdG8gWmVtIENvbnRhY3QgUmVib3JuJiM4MjE3O3MgQVBJOjwvc3Ryb25nPjwvcD4KCjxwcmU+PGNvZGU+cmVnaXN0ZXJfY2FsbGJhY2soJiMzOTtwYXBfemVtY29udGFjdF9mb3JtJiMzOTssJiMzOTt6ZW1jb250YWN0LmZvcm0mIzM5Oyk7CnJlZ2lzdGVyX2NhbGxiYWNrKCYjMzk7cGFwX3plbWNvbnRhY3Rfc3VibWl0JiMzOTssJiMzOTt6ZW1jb250YWN0LnN1Ym1pdCYjMzk7KTsKPC9jb2RlPgo8Y29kZT5mdW5jdGlvbiBwYXBfemVtY29udGFjdF9mb3JtKCkgewogICRmaWVsZCA9ICYjMzk7JiM2MDtkaXYgc3R5bGU9JiMzNDtkaXNwbGF5Om5vbmUmIzM0OyYjNjI7JiMzOTsuCiAgICBmaW5wdXQoJiMzOTt0ZXh0JiMzOTssJiMzOTtwaG9uZSYjMzk7LHBzKCYjMzk7cGhvbmUmIzM5OyksJiMzOTsmIzM5OywmIzM5OyYjMzk7LCYjMzk7JiMzOTssJiMzOTsmIzM5OywmIzM5OyYjMzk7LCYjMzk7cGhvbmUmIzM5OykuJiMzOTsmIzYwO2JyIC8mIzYyOyYjMzk7LgogICAgZmlucHV0KCYjMzk7dGV4dCYjMzk7LCYjMzk7bWFpbCYjMzk7LHBzKCYjMzk7bWFpbCYjMzk7KSwmIzM5OyYjMzk7LCYjMzk7JiMzOTssJiMzOTsmIzM5OywmIzM5OyYjMzk7LCYjMzk7JiMzOTssJiMzOTttYWlsJiMzOTspLiYjMzk7JiM2MDsvZGl2JiM2MjsmIzM5OzsKICByZXR1cm4gJGZpZWxkOyYjNjA7L2NvZGUmIzYyOwp9CjwvY29kZT4KPGNvZGU+ZnVuY3Rpb24gcGFwX3plbWNvbnRhY3Rfc3VibWl0KCkgewogICRjaGVja2luZ19tYWlsX2ZpZWxkID0gdHJpbShwcygmIzM5O21haWwmIzM5OykpOwogICRjaGVja2luZ19waG9uZV9maWVsZCA9IHRyaW0ocHMoJiMzOTtwaG9uZSYjMzk7KSk7CjwvY29kZT4KPGNvZGU+ICAkZXZhbHVhdGlvbiA9JiMzODsgZ2V0X3plbWNvbnRhY3RfZXZhbHVhdG9yKCk7CjwvY29kZT4KPGNvZGU+ICAvLyBJZiB0aGUgaGlkZGVuIGZpZWxkcyBhcmUgZmlsbGVkIG91dCwgdGhlIGNvbnRhY3QgZm9ybSB3b24mIzM5O3QgYmUgc3VibWl0dGVkIQogIGlmICgkY2hlY2tpbmdfbWFpbF9maWVsZCAhPSAmIzM5OyYjMzk7IG9yICRjaGVja2luZ19waG9uZV9maWVsZCAhPSAmIzM5OyYjMzk7KSB7CiAgICAkZXZhbHVhdGlvbiAtJiM2MjsgYWRkX3plbWNvbnRhY3Rfc3RhdHVzKDEpOwogIH0KICByZXR1cm47Cn0KPC9jb2RlPjwvcHJlPgoKCTxwPjxhIGhyZWY9IiN0b3AiPkJhY2sgdG8gdG9wPC9hPjwvcD4iO3M6NDoiY29kZSI7czoyMDgzNDoiCmZ1bmN0aW9uIHplbV9jb250YWN0KCRhdHRzLCAkdGhpbmcgPSAnJykKewoJZ2xvYmFsICRzaXRlbmFtZSwgJHByZWZzLCAkcHJvZHVjdGlvbl9zdGF0dXMsICR6ZW1fY29udGFjdF9mcm9tLAoJCSR6ZW1fY29udGFjdF9yZWNpcGllbnQsICR6ZW1fY29udGFjdF9lcnJvciwgJHplbV9jb250YWN0X3N1Ym1pdCwKCQkkemVtX2NvbnRhY3RfZm9ybSwgJHplbV9jb250YWN0X2xhYmVscywgJHplbV9jb250YWN0X3ZhbHVlczsKCglleHRyYWN0KHplbV9jb250YWN0X2xBdHRzKGFycmF5KAoJCSdjb3B5c2VuZGVyJwk9PiAwLAoJCSdmb3JtJwkJPT4gJycsCgkJJ2Zyb20nCQk9PiAnJywKCQknZnJvbV9mb3JtJwk9PiAnJywKCQknbGFiZWwnCQk9PiB6ZW1fY29udGFjdF9nVHh0KCdjb250YWN0JyksCgkJJ3JlZGlyZWN0Jwk9PiAnJywKCQknc2hvd19lcnJvcicJPT4gMSwKCQknc2hvd19pbnB1dCcJPT4gMSwKCQknc2VuZF9hcnRpY2xlJwk9PiAwLAoJCSdzdWJqZWN0Jwk9PiB6ZW1fY29udGFjdF9nVHh0KCdlbWFpbF9zdWJqZWN0JywgaHRtbF9lbnRpdHlfZGVjb2RlKCRzaXRlbmFtZSxFTlRfUVVPVEVTKSksCgkJJ3N1YmplY3RfZm9ybScJPT4gJycsCgkJJ3RvJwkJPT4gJycsCgkJJ3RvX2Zvcm0nCT0+ICcnLAoJCSd0aGFua3MnCT0+IGdyYWYoemVtX2NvbnRhY3RfZ1R4dCgnZW1haWxfdGhhbmtzJykpLAoJCSd0aGFua3NfZm9ybScJPT4gJycKCSksICRhdHRzKSk7CgoJdW5zZXQoJGF0dHNbJ3Nob3dfZXJyb3InXSwgJGF0dHNbJ3Nob3dfaW5wdXQnXSk7CgkkemVtX2NvbnRhY3RfZm9ybV9pZCA9IG1kNShzZXJpYWxpemUoJGF0dHMpLnByZWdfcmVwbGFjZSgnL1tcdFxzXHJcbl0vJywnJywkdGhpbmcpKTsKCSR6ZW1fY29udGFjdF9zdWJtaXQgPSAocHMoJ3plbV9jb250YWN0X2Zvcm1faWQnKSA9PSAkemVtX2NvbnRhY3RfZm9ybV9pZCk7CgoJaWYgKCFpc19jYWxsYWJsZSgnbWFpbCcpKQoJewoJCXJldHVybiAoJHByb2R1Y3Rpb25fc3RhdHVzID09ICdsaXZlJykgPwoJCQl6ZW1fY29udGFjdF9nVHh0KCdtYWlsX3NvcnJ5JykgOgoJCQlnVHh0KCd3YXJuX21haWxfdW5hdmFpbGFibGUnKTsKCX0KCglzdGF0aWMgJGhlYWRlcnNfc2VudCA9IGZhbHNlOwoJaWYgKCEkaGVhZGVyc19zZW50KSB7CgkJaGVhZGVyKCdMYXN0LU1vZGlmaWVkOiAnLmdtZGF0ZSgnRCwgZCBNIFkgSDppOnMnLHRpbWUoKS0zNjAwKjI0KjcpLicgR01UJyk7CgkJaGVhZGVyKCdFeHBpcmVzOiAnLmdtZGF0ZSgnRCwgZCBNIFkgSDppOnMnLHRpbWUoKSs2MDApLicgR01UJyk7CgkJaGVhZGVyKCdDYWNoZS1Db250cm9sOiBuby1jYWNoZSwgbXVzdC1yZXZhbGlkYXRlJyk7CgkJJGhlYWRlcnNfc2VudCA9IHRydWU7Cgl9CgoJJG5vbmNlICAgPSBteXNxbF9yZWFsX2VzY2FwZV9zdHJpbmcocHMoJ3plbV9jb250YWN0X25vbmNlJykpOwoJJHJlbm9uY2UgPSBmYWxzZTsKCglpZiAoJHplbV9jb250YWN0X3N1Ym1pdCkKCXsKCQlzYWZlX2RlbGV0ZSgndHhwX2Rpc2N1c3Nfbm9uY2UnLCAnaXNzdWVfdGltZSA8IGRhdGVfc3ViKG5vdygpLCBpbnRlcnZhbCAxMCBtaW51dGUpJyk7CgkJaWYgKCRycyA9IHNhZmVfcm93KCd1c2VkJywgJ3R4cF9kaXNjdXNzX25vbmNlJywgIm5vbmNlID0gJyRub25jZSciKSkKCQl7CgkJCWlmICgkcnNbJ3VzZWQnXSkKCQkJewoJCQkJdW5zZXQoJHplbV9jb250YWN0X2Vycm9yKTsKCQkJCSR6ZW1fY29udGFjdF9lcnJvcltdID0gemVtX2NvbnRhY3RfZ1R4dCgnZm9ybV91c2VkJyk7CgkJCQkkcmVub25jZSA9IHRydWU7CgkJCQkkX1BPU1QgPSBhcnJheSgpOwoJCQkJJF9QT1NUWyd6ZW1fY29udGFjdF9zdWJtaXQnXSA9IFRSVUU7CgkJCQkkX1BPU1RbJ3plbV9jb250YWN0X2Zvcm1faWQnXSA9ICR6ZW1fY29udGFjdF9mb3JtX2lkOwoJCQkJJF9QT1NUWyd6ZW1fY29udGFjdF9ub25jZSddID0gJG5vbmNlOwoJCQl9CgkJfQoJCWVsc2UKCQl7CgkJCSR6ZW1fY29udGFjdF9lcnJvcltdID0gemVtX2NvbnRhY3RfZ1R4dCgnZm9ybV9leHBpcmVkJyk7CgkJCSRyZW5vbmNlID0gdHJ1ZTsKCQl9Cgl9CgoJaWYgKCR6ZW1fY29udGFjdF9zdWJtaXQgYW5kICRub25jZSBhbmQgISRyZW5vbmNlKQoJewoJCSR6ZW1fY29udGFjdF9ub25jZSA9ICRub25jZTsKCX0KCgllbHNlaWYgKCEkc2hvd19lcnJvciBvciAkc2hvd19pbnB1dCkKCXsKCQkkemVtX2NvbnRhY3Rfbm9uY2UgPSBtZDUodW5pcWlkKHJhbmQoKSwgdHJ1ZSkpOwoJCXNhZmVfaW5zZXJ0KCd0eHBfZGlzY3Vzc19ub25jZScsICJpc3N1ZV90aW1lID0gbm93KCksIG5vbmNlID0gJyR6ZW1fY29udGFjdF9ub25jZSciKTsKCX0KCgkkZm9ybSA9ICgkZm9ybSkgPyBmZXRjaF9mb3JtKCRmb3JtKSA6ICR0aGluZzsKCglpZiAoZW1wdHkoJGZvcm0pKQoJewoJCSRmb3JtID0gJwo8dHhwOnplbV9jb250YWN0X3RleHQgbGFiZWw9IicuemVtX2NvbnRhY3RfZ1R4dCgnbmFtZScpLiciIC8+PGJyIC8+Cjx0eHA6emVtX2NvbnRhY3RfZW1haWwgLz48YnIgLz4nLgooJHNlbmRfYXJ0aWNsZSA/ICc8dHhwOnplbV9jb250YWN0X2VtYWlsIHNlbmRfYXJ0aWNsZT0iMSIgbGFiZWw9IicuemVtX2NvbnRhY3RfZ1R4dCgncmVjaXBpZW50JykuJyIgLz48YnIgLz4nIDogJycpLgonPHR4cDp6ZW1fY29udGFjdF90ZXh0YXJlYSAvPjxiciAvPgo8dHhwOnplbV9jb250YWN0X3N1Ym1pdCAvPgonOwoJfQoKCSRmb3JtID0gcGFyc2UoJGZvcm0pOwoKCWlmICgkdG9fZm9ybSkKCXsKCQkkdG8gPSBwYXJzZShmZXRjaF9mb3JtKCR0b19mb3JtKSk7Cgl9CgoJaWYgKCEkdG8gYW5kICEkc2VuZF9hcnRpY2xlKQoJewoJCXJldHVybiB6ZW1fY29udGFjdF9nVHh0KCd0b19taXNzaW5nJyk7Cgl9CgoJJG91dCA9ICcnOwoKCWlmICghJHplbV9jb250YWN0X3N1Ym1pdCkgewoJICAjIGRvbid0IHNob3cgZXJyb3JzIG9yIHNlbmQgbWFpbAoJfQoKCWVsc2VpZiAoIWVtcHR5KCR6ZW1fY29udGFjdF9lcnJvcikpCgl7CgkJaWYgKCRzaG93X2Vycm9yIG9yICEkc2hvd19pbnB1dCkKCQl7CgkJCSRvdXQgLj0gbi4nPHVsIGNsYXNzPSJ6ZW1FcnJvciI+JzsKCgkJCWZvcmVhY2ggKGFycmF5X3VuaXF1ZSgkemVtX2NvbnRhY3RfZXJyb3IpIGFzICRlcnJvcikKCQkJewoJCQkJJG91dCAuPSBuLnQuJzxsaT4nLiRlcnJvci4nPC9saT4nOwoJCQl9CgoJCQkkb3V0IC49IG4uJzwvdWw+JzsKCgkJCWlmICghJHNob3dfaW5wdXQpIHJldHVybiAkb3V0OwoJCX0KCX0KCgllbHNlaWYgKCRzaG93X2lucHV0IGFuZCBpc19hcnJheSgkemVtX2NvbnRhY3RfZm9ybSkpCgl7CgkJLy8vIGxvYWQgYW5kIGNoZWNrIHNwYW0gcGx1Z2lucy8KCQljYWxsYmFja19ldmVudCgnemVtY29udGFjdC5zdWJtaXQnKTsKCQkkZXZhbHVhdGlvbiA9JiBnZXRfemVtY29udGFjdF9ldmFsdWF0b3IoKTsKCQkkY2xlYW4gPSAkZXZhbHVhdGlvbi0+Z2V0X3plbWNvbnRhY3Rfc3RhdHVzKCk7CgkJaWYgKCRjbGVhbiAhPSAwKSB7CgkJCXJldHVybiB6ZW1fY29udGFjdF9nVHh0KCdzcGFtJyk7CgkJfQoKCQlpZiAoJGZyb21fZm9ybSkKCQl7CgkJCSRmcm9tID0gcGFyc2UoZmV0Y2hfZm9ybSgkZnJvbV9mb3JtKSk7CgkJfQoKCQlpZiAoJHN1YmplY3RfZm9ybSkKCQl7CgkJCSRzdWJqZWN0ID0gcGFyc2UoZmV0Y2hfZm9ybSgkc3ViamVjdF9mb3JtKSk7CgkJfQoKCQkkc2VwID0gIWlzX3dpbmRvd3MoKSA/ICJcbiIgOiAiXHJcbiI7CgoJCSRtc2cgPSBhcnJheSgpOwoKCQlmb3JlYWNoICgkemVtX2NvbnRhY3RfbGFiZWxzIGFzICRuYW1lID0+ICRsYWJlbCkKCQl7CgkJCWlmICghdHJpbSgkemVtX2NvbnRhY3RfdmFsdWVzWyRuYW1lXSkpIGNvbnRpbnVlOwoJCQkkbXNnW10gPSAkbGFiZWwuJzogJy4kemVtX2NvbnRhY3RfdmFsdWVzWyRuYW1lXTsKCQl9CgoJCWlmICgkc2VuZF9hcnRpY2xlKQoJCXsKCQkJZ2xvYmFsICR0aGlzYXJ0aWNsZTsKCQkJJHN1YmplY3QgPSBzdHJfcmVwbGFjZSgnJiMzODsnLCAnJicsICR0aGlzYXJ0aWNsZVsndGl0bGUnXSk7CgkJCSRtc2dbXSA9IHBlcm1saW5rdXJsKCR0aGlzYXJ0aWNsZSk7CgkJCSRtc2dbXSA9ICRzdWJqZWN0OwoJCQkkc19hciA9IGFycmF5KCcmIzgyMTY7JywgJyYjODIxNzsnLCAnJiM4MjIwOycsICcmIzgyMjE7JywgJyYjODIxNzsnLCAnJiM4MjQyOycsICcmIzgyNDM7JywgJyYjODIzMDsnLCAnJiM4MjExOycsICcmIzgyMTI7JywgJyYjMjE1OycsICcmIzg0ODI7JywgJyYjMTc0OycsICcmIzE2OTsnLCAnJmx0OycsICcmZ3Q7JywgJyZxdW90OycsICcmYW1wOycsICcmIzM4OycsICJcdCIsICc8cCcpOwoJCQlpZiAoJHByZWZzWydvdmVycmlkZV9lbWFpbGNoYXJzZXQnXSBhbmQgaXNfY2FsbGFibGUoJ3V0ZjhfZGVjb2RlJykpIHsKCQkJCSRyX2FyID0gYXJyYXkoIiciLCAiJyIsICciJywgJyInLCAiJyIsICInIiwgJyInLCAnLi4uJywgJy0nLCAnLS0nLCAneCcsICdbdG1dJywgJyhyKScsICcoYyknLCAnPCcsICc+JywgJyInLCAnJicsICcmJywgJyAnLCAiXG48cCIpOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJJHJfYXIgPSBhcnJheSgn4oCYJywgJ+KAmScsICfigJwnLCAn4oCdJywgJ+KAmScsICfigLInLCAn4oCzJywgJ+KApicsICfigJMnLCAn4oCUJywgJ8OXJywgJ+KEoicsICfCricsICfCqScsICc8JywgJz4nLCAnIicsICcmJywgJyYnLCAnICcsICJcbjxwIik7CgkJCX0KCQkJJG1zZ1tdID0gdHJpbShzdHJpcF90YWdzKHN0cl9yZXBsYWNlKCRzX2FyLCRyX2FyLCh0cmltKHN0cmlwX3RhZ3MoJHRoaXNhcnRpY2xlWydleGNlcnB0J10pKSA/ICR0aGlzYXJ0aWNsZVsnZXhjZXJwdCddIDogJHRoaXNhcnRpY2xlWydib2R5J10pKSkpOwoJCQlpZiAoZW1wdHkoJHplbV9jb250YWN0X3JlY2lwaWVudCkpCgkJCXsKCQkJCXJldHVybiB6ZW1fY29udGFjdF9nVHh0KCdmaWVsZF9taXNzaW5nJywgemVtX2NvbnRhY3RfZ1R4dCgncmVjaXBpZW50JykpOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJJHRvID0gJHplbV9jb250YWN0X3JlY2lwaWVudDsKCQkJfQoJCX0KCgkJJG1zZyA9IGpvaW4oIlxuXG4iLCAkbXNnKTsKCQkkbXNnID0gc3RyX3JlcGxhY2UoIlxyXG4iLCAiXG4iLCAkbXNnKTsKCQkkbXNnID0gc3RyX3JlcGxhY2UoIlxyIiwgIlxuIiwgJG1zZyk7CgkJJG1zZyA9IHN0cl9yZXBsYWNlKCJcbiIsICRzZXAsICRtc2cpOwoKCQlpZiAoJGZyb20pCgkJewoJCQkkcmVwbHkgPSAkemVtX2NvbnRhY3RfZnJvbTsKCQl9CgoJCWVsc2UKCQl7CgkJCSRmcm9tID0gJHplbV9jb250YWN0X2Zyb207CgkJCSRyZXBseSA9ICcnOwoJCX0KCgkJJGZyb20gICAgPSB6ZW1fY29udGFjdF9zdHJpcCgkZnJvbSk7CgkJJHRvICAgICAgPSB6ZW1fY29udGFjdF9zdHJpcCgkdG8pOwoJCSRzdWJqZWN0ID0gemVtX2NvbnRhY3Rfc3RyaXAoJHN1YmplY3QpOwoJCSRyZXBseSAgID0gemVtX2NvbnRhY3Rfc3RyaXAoJHJlcGx5KTsKCQkkbXNnICAgICA9IHplbV9jb250YWN0X3N0cmlwKCRtc2csIEZBTFNFKTsKCgkJaWYgKCRwcmVmc1snb3ZlcnJpZGVfZW1haWxjaGFyc2V0J10gYW5kIGlzX2NhbGxhYmxlKCd1dGY4X2RlY29kZScpKQoJCXsKCQkJJGNoYXJzZXQgPSAnSVNPLTg4NTktMSc7CgkJCSRzdWJqZWN0ID0gdXRmOF9kZWNvZGUoJHN1YmplY3QpOwoJCQkkbXNnICAgICA9IHV0ZjhfZGVjb2RlKCRtc2cpOwoJCX0KCgkJZWxzZQoJCXsKCQkJJGNoYXJzZXQgPSAnVVRGLTgnOwoJCX0KCgkJJHN1YmplY3QgPSB6ZW1fY29udGFjdF9tYWlsaGVhZGVyKCRzdWJqZWN0LCAndGV4dCcpOwoKCQkkaGVhZGVycyA9ICdGcm9tOiAnLiRmcm9tLgoJCQkoJHJlcGx5ID8gKCRzZXAuJ1JlcGx5LVRvOiAnLiRyZXBseSkgOiAnJykuCgkJCSRzZXAuJ1gtTWFpbGVyOiBUZXh0cGF0dGVybiAoemVtX2NvbnRhY3RfcmVib3JuKScuCgkJCSRzZXAuJ1gtT3JpZ2luYXRpbmctSVA6ICcuemVtX2NvbnRhY3Rfc3RyaXAoKCFlbXB0eSgkX1NFUlZFUlsnSFRUUF9YX0ZPUldBUkRFRF9GT1InXSkgPyAkX1NFUlZFUlsnSFRUUF9YX0ZPUldBUkRFRF9GT1InXS4nIHZpYSAnIDogJycpLiRfU0VSVkVSWydSRU1PVEVfQUREUiddKS4KCQkJJHNlcC4nQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogOGJpdCcuCgkJCSRzZXAuJ0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD0iJy4kY2hhcnNldC4nIic7CgoJCXNhZmVfdXBkYXRlKCd0eHBfZGlzY3Vzc19ub25jZScsICJ1c2VkID0gJzEnLCBpc3N1ZV90aW1lID0gbm93KCkiLCAibm9uY2UgPSAnJG5vbmNlJyIpOwoKCQlpZiAobWFpbCgkdG8sICRzdWJqZWN0LCAkbXNnLCAkaGVhZGVycykpCgkJewoJCQkkX1BPU1QgPSBhcnJheSgpOwoKCQkJaWYgKCRjb3B5c2VuZGVyIGFuZCAkemVtX2NvbnRhY3RfZnJvbSkKCQkJewoJCQkJbWFpbCh6ZW1fY29udGFjdF9zdHJpcCgkemVtX2NvbnRhY3RfZnJvbSksICRzdWJqZWN0LCAkbXNnLCAkaGVhZGVycyk7CgkJCX0KCgkJCWlmICgkcmVkaXJlY3QpCgkJCXsKCQkJCXdoaWxlIChAb2JfZW5kX2NsZWFuKCkpOwoJCQkJJHVyaSA9IGh1Lmx0cmltKCRyZWRpcmVjdCwnLycpOwoJCQkJaWYgKGVtcHR5KCRfU0VSVkVSWydGQ0dJX1JPTEUnXSkgYW5kIGVtcHR5KCRfRU5WWydGQ0dJX1JPTEUnXSkpCgkJCQl7CgkJCQkJdHhwX3N0YXR1c19oZWFkZXIoJzMwMyBTZWUgT3RoZXInKTsKCQkJCQloZWFkZXIoJ0xvY2F0aW9uOiAnLiR1cmkpOwoJCQkJCWhlYWRlcignQ29ubmVjdGlvbjogY2xvc2UnKTsKCQkJCQloZWFkZXIoJ0NvbnRlbnQtTGVuZ3RoOiAwJyk7CgkJCQl9CgkJCQllbHNlCgkJCQl7CgkJCQkJJHVyaSA9IGh0bWxzcGVjaWFsY2hhcnMoJHVyaSk7CgkJCQkJJHJlZnJlc2ggPSB6ZW1fY29udGFjdF9nVHh0KCdyZWZyZXNoJyk7CgkJCQkJZWNobyA8PDxFTkQKPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgo8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+CjxoZWFkPgoJPHRpdGxlPiRzaXRlbmFtZTwvdGl0bGU+Cgk8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KCTxtZXRhIGh0dHAtZXF1aXY9InJlZnJlc2giIGNvbnRlbnQ9IjA7dXJsPSR1cmkiIC8+CjwvaGVhZD4KPGJvZHk+CjxhIGhyZWY9IiR1cmkiPiRyZWZyZXNoPC9hPgo8L2JvZHk+CjwvaHRtbD4KRU5EOwoJCQkJfQoJCQkJZXhpdDsKCQkJfQoKCQkJZWxzZQoJCQl7CgkJCQlyZXR1cm4gJzxkaXYgY2xhc3M9InplbVRoYW5rcyIgaWQ9InpjcicuJHplbV9jb250YWN0X2Zvcm1faWQuJyI+JyAuCgkJCQkJKCR0aGFua3NfZm9ybSA/IGZldGNoX2Zvcm0oJHRoYW5rc19mb3JtKSA6ICR0aGFua3MpIC4KCQkJCQknPC9kaXY+JzsKCQkJfQoJCX0KCgkJZWxzZQoJCXsKCQkJJG91dCAuPSBncmFmKHplbV9jb250YWN0X2dUeHQoJ21haWxfc29ycnknKSk7CgkJfQoJfQoKCWlmICgkc2hvd19pbnB1dCBhbmQgISRzZW5kX2FydGljbGUgb3IgZ3BzKCd6ZW1fY29udGFjdF9zZW5kX2FydGljbGUnKSkKCXsKCQlyZXR1cm4gJzxmb3JtIG1ldGhvZD0icG9zdCInLigoISRzaG93X2Vycm9yIGFuZCAkemVtX2NvbnRhY3RfZXJyb3IpID8gJycgOiAnIGlkPSJ6Y3InLiR6ZW1fY29udGFjdF9mb3JtX2lkLiciJykuJyBjbGFzcz0iemVtQ29udGFjdEZvcm0iIGFjdGlvbj0iJy5odG1sc3BlY2lhbGNoYXJzKHNlcnZlclNldCgnUkVRVUVTVF9VUkknKSkuJyN6Y3InLiR6ZW1fY29udGFjdF9mb3JtX2lkLiciPicuCgkJCSggJGxhYmVsID8gbi4nPGZpZWxkc2V0PicgOiBuLic8ZGl2PicgKS4KCQkJKCAkbGFiZWwgPyBuLic8bGVnZW5kPicuaHRtbHNwZWNpYWxjaGFycygkbGFiZWwpLic8L2xlZ2VuZD4nIDogJycgKS4KCQkJJG91dC4KCQkJbi4nPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iemVtX2NvbnRhY3Rfbm9uY2UiIHZhbHVlPSInLiR6ZW1fY29udGFjdF9ub25jZS4nIiAvPicuCgkJCW4uJzxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InplbV9jb250YWN0X2Zvcm1faWQiIHZhbHVlPSInLiR6ZW1fY29udGFjdF9mb3JtX2lkLiciIC8+Jy4KCQkJJGZvcm0uCgkJCWNhbGxiYWNrX2V2ZW50KCd6ZW1jb250YWN0LmZvcm0nKS4KCQkJKCAkbGFiZWwgPyAobi4nPC9maWVsZHNldD4nKSA6IChuLic8L2Rpdj4nKSApLgoJCQluLic8L2Zvcm0+JzsKCX0KCglyZXR1cm4gJyc7Cn0KCmZ1bmN0aW9uIHplbV9jb250YWN0X3N0cmlwKCRzdHIsICRoZWFkZXIgPSBUUlVFKSB7CglpZiAoJGhlYWRlcikgJHN0ciA9IHN0cmlwX3JuKCRzdHIpOwoJcmV0dXJuIHByZWdfcmVwbGFjZSgnL1tceDAwXS8nLCAnICcsICRzdHIpOwp9CgpmdW5jdGlvbiB6ZW1fY29udGFjdF90ZXh0KCRhdHRzKQp7CglnbG9iYWwgJHplbV9jb250YWN0X2Vycm9yLCAkemVtX2NvbnRhY3Rfc3VibWl0OwoKCWV4dHJhY3QoemVtX2NvbnRhY3RfbEF0dHMoYXJyYXkoCgkJJ2JyZWFrJwkJPT4gYnIsCgkJJ2RlZmF1bHQnCT0+ICcnLAoJCSdpc0Vycm9yJwk9PiAnJywKCQknbGFiZWwnCQk9PiB6ZW1fY29udGFjdF9nVHh0KCd0ZXh0JyksCgkJJ21heCcJCT0+IDEwMCwKCQknbWluJwkJPT4gMCwKCQknbmFtZScJCT0+ICcnLAoJCSdyZXF1aXJlZCcJPT4gMSwKCQknc2l6ZScJCT0+ICcnCgkpLCAkYXR0cykpOwoKCSRtaW4gPSBpbnR2YWwoJG1pbik7CgkkbWF4ID0gaW50dmFsKCRtYXgpOwoJJHNpemUgPSBpbnR2YWwoJHNpemUpOwoKCWlmIChlbXB0eSgkbmFtZSkpICRuYW1lID0gemVtX2NvbnRhY3RfbGFiZWwybmFtZSgkbGFiZWwpOwoKCWlmICgkemVtX2NvbnRhY3Rfc3VibWl0KQoJewoJCSR2YWx1ZSA9IHRyaW0ocHMoJG5hbWUpKTsKCQkkdXRmOGxlbiA9IHByZWdfbWF0Y2hfYWxsKCIvLi9zdSIsICR2YWx1ZSwgJHV0Zjhhcik7CgkJJGhsYWJlbCA9IGh0bWxzcGVjaWFsY2hhcnMoJGxhYmVsKTsKCgkJaWYgKHN0cmxlbigkdmFsdWUpKQoJCXsKCQkJaWYgKCEkdXRmOGxlbikKCQkJewoJCQkJJHplbV9jb250YWN0X2Vycm9yW10gPSB6ZW1fY29udGFjdF9nVHh0KCdpbnZhbGlkX3V0ZjgnLCAkaGxhYmVsKTsKCQkJCSRpc0Vycm9yID0gImVycm9yRWxlbWVudCI7CgkJCX0KCgkJCWVsc2VpZiAoJG1pbiBhbmQgJHV0ZjhsZW4gPCAkbWluKQoJCQl7CgkJCQkkemVtX2NvbnRhY3RfZXJyb3JbXSA9IHplbV9jb250YWN0X2dUeHQoJ21pbl93YXJuaW5nJywgJGhsYWJlbCwgJG1pbik7CgkJCQkkaXNFcnJvciA9ICJlcnJvckVsZW1lbnQiOwoJCQl9CgoJCQllbHNlaWYgKCRtYXggYW5kICR1dGY4bGVuID4gJG1heCkKCQkJewoJCQkJJHplbV9jb250YWN0X2Vycm9yW10gPSB6ZW1fY29udGFjdF9nVHh0KCdtYXhfd2FybmluZycsICRobGFiZWwsICRtYXgpOwoJCQkJJGlzRXJyb3IgPSAiZXJyb3JFbGVtZW50IjsKCQkJCSMkdmFsdWUgPSBqb2luKCcnLGFycmF5X3NsaWNlKCRhclswXSwwLCRtYXgpKTsKCQkJfQoKCQkJZWxzZQoJCQl7CgkJCQl6ZW1fY29udGFjdF9zdG9yZSgkbmFtZSwgJGxhYmVsLCAkdmFsdWUpOwoJCQl9CgkJfQoJCWVsc2VpZiAoJHJlcXVpcmVkKQoJCXsKCQkJJHplbV9jb250YWN0X2Vycm9yW10gPSB6ZW1fY29udGFjdF9nVHh0KCdmaWVsZF9taXNzaW5nJywgJGhsYWJlbCk7CgkJCSRpc0Vycm9yID0gImVycm9yRWxlbWVudCI7CgkJfQoJfQoKCWVsc2UKCXsKCQkkdmFsdWUgPSAkZGVmYXVsdDsKCX0KCgkkc2l6ZSA9ICgkc2l6ZSkgPyAnIHNpemU9IicuJHNpemUuJyInIDogJyc7CgkkbWF4bGVuZ3RoID0gKCRtYXgpID8gJyBtYXhsZW5ndGg9IicuJG1heC4nIicgOiAnJzsKCgkkemVtUmVxdWlyZWQgPSAkcmVxdWlyZWQgPyAnemVtUmVxdWlyZWQnIDogJyc7CgogICAgICAgIHJldHVybiAnPGxhYmVsIGZvcj0iJy4kbmFtZS4nIiBjbGFzcz0iemVtVGV4dCAnLiR6ZW1SZXF1aXJlZC4kaXNFcnJvci4nICcuJG5hbWUuJyI+Jy5odG1sc3BlY2lhbGNoYXJzKCRsYWJlbCkuJzwvbGFiZWw+Jy4kYnJlYWsuCgkJJzxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iJy4kbmFtZS4nIiBjbGFzcz0iemVtVGV4dCAnLiR6ZW1SZXF1aXJlZC4kaXNFcnJvci4nIiBuYW1lPSInLiRuYW1lLiciIHZhbHVlPSInLmh0bWxzcGVjaWFsY2hhcnMoJHZhbHVlKS4nIicuJHNpemUuJG1heGxlbmd0aC4nIC8+JzsKfQoKZnVuY3Rpb24gemVtX2NvbnRhY3RfdGV4dGFyZWEoJGF0dHMpCnsKCWdsb2JhbCAkemVtX2NvbnRhY3RfZXJyb3IsICR6ZW1fY29udGFjdF9zdWJtaXQ7CgoJZXh0cmFjdCh6ZW1fY29udGFjdF9sQXR0cyhhcnJheSgKCQknYnJlYWsnCQk9PiBiciwKCQknY29scycJCT0+IDU4LAoJCSdkZWZhdWx0Jwk9PiAnJywKCQknaXNFcnJvcicJPT4gJycsCgkJJ2xhYmVsJwkJPT4gemVtX2NvbnRhY3RfZ1R4dCgnbWVzc2FnZScpLAoJCSdtYXgnCQk9PiAxMDAwMCwKCQknbWluJwkJPT4gMCwKCQknbmFtZScJCT0+ICcnLAoJCSdyZXF1aXJlZCcJPT4gMSwKCQkncm93cycJCT0+IDgKCSksICRhdHRzKSk7CgoJJG1pbiA9IGludHZhbCgkbWluKTsKCSRtYXggPSBpbnR2YWwoJG1heCk7CgkkY29scyA9IGludHZhbCgkY29scyk7Cgkkcm93cyA9IGludHZhbCgkcm93cyk7CgoJaWYgKGVtcHR5KCRuYW1lKSkgJG5hbWUgPSB6ZW1fY29udGFjdF9sYWJlbDJuYW1lKCRsYWJlbCk7CgoJaWYgKCR6ZW1fY29udGFjdF9zdWJtaXQpCgl7CgkJJHZhbHVlID0gcHJlZ19yZXBsYWNlKCcvXlxzKltcclxuXS8nLCAnJywgcnRyaW0ocHMoJG5hbWUpKSk7CgkJJHV0ZjhsZW4gPSBwcmVnX21hdGNoX2FsbCgiLy4vc3UiLCBsdHJpbSgkdmFsdWUpLCAkdXRmOGFyKTsKCQkkaGxhYmVsID0gaHRtbHNwZWNpYWxjaGFycygkbGFiZWwpOwoKCQlpZiAoc3RybGVuKGx0cmltKCR2YWx1ZSkpKQoJCXsKCQkJaWYgKCEkdXRmOGxlbikKCQkJewoJCQkJJHplbV9jb250YWN0X2Vycm9yW10gPSB6ZW1fY29udGFjdF9nVHh0KCdpbnZhbGlkX3V0ZjgnLCAkaGxhYmVsKTsKCQkJCSRpc0Vycm9yID0gImVycm9yRWxlbWVudCI7CgkJCX0KCgkJCWVsc2VpZiAoJG1pbiBhbmQgJHV0ZjhsZW4gPCAkbWluKQoJCQl7CgkJCQkkemVtX2NvbnRhY3RfZXJyb3JbXSA9IHplbV9jb250YWN0X2dUeHQoJ21pbl93YXJuaW5nJywgJGhsYWJlbCwgJG1pbik7CgkJCQkkaXNFcnJvciA9ICJlcnJvckVsZW1lbnQiOwoJCQl9CgoJCQllbHNlaWYgKCRtYXggYW5kICR1dGY4bGVuID4gJG1heCkKCQkJewoJCQkJJHplbV9jb250YWN0X2Vycm9yW10gPSB6ZW1fY29udGFjdF9nVHh0KCdtYXhfd2FybmluZycsICRobGFiZWwsICRtYXgpOwoJCQkJJGlzRXJyb3IgPSAiZXJyb3JFbGVtZW50IjsKCQkJCSMkdmFsdWUgPSBqb2luKCcnLGFycmF5X3NsaWNlKCR1dGY4YXJbMF0sMCwkbWF4KSk7CgkJCX0KCgkJCWVsc2UKCQkJewoJCQkJemVtX2NvbnRhY3Rfc3RvcmUoJG5hbWUsICRsYWJlbCwgJHZhbHVlKTsKCQkJfQoJCX0KCgkJZWxzZWlmICgkcmVxdWlyZWQpCgkJewoJCQkkemVtX2NvbnRhY3RfZXJyb3JbXSA9IHplbV9jb250YWN0X2dUeHQoJ2ZpZWxkX21pc3NpbmcnLCAkaGxhYmVsKTsKCQkJJGlzRXJyb3IgPSAiZXJyb3JFbGVtZW50IjsKCQl9Cgl9CgoJZWxzZQoJewoJCSR2YWx1ZSA9ICRkZWZhdWx0OwoJfQoKCSR6ZW1SZXF1aXJlZCA9ICRyZXF1aXJlZCA/ICd6ZW1SZXF1aXJlZCcgOiAnJzsKCglyZXR1cm4gJzxsYWJlbCBmb3I9IicuJG5hbWUuJyIgY2xhc3M9InplbVRleHRhcmVhICcuJHplbVJlcXVpcmVkLiRpc0Vycm9yLicgJy4kbmFtZS4nIj4nLmh0bWxzcGVjaWFsY2hhcnMoJGxhYmVsKS4nPC9sYWJlbD4nLiRicmVhay4KCQknPHRleHRhcmVhIGlkPSInLiRuYW1lLiciIGNsYXNzPSJ6ZW1UZXh0YXJlYSAnLiR6ZW1SZXF1aXJlZC4kaXNFcnJvci4nIiBuYW1lPSInLiRuYW1lLiciIGNvbHM9IicuJGNvbHMuJyIgcm93cz0iJy4kcm93cy4nIj4nLmh0bWxzcGVjaWFsY2hhcnMoJHZhbHVlKS4nPC90ZXh0YXJlYT4nOwp9CgpmdW5jdGlvbiB6ZW1fY29udGFjdF9lbWFpbCgkYXR0cykKewoJZ2xvYmFsICR6ZW1fY29udGFjdF9lcnJvciwgJHplbV9jb250YWN0X3N1Ym1pdCwgJHplbV9jb250YWN0X2Zyb20sICR6ZW1fY29udGFjdF9yZWNpcGllbnQ7CgoJZXh0cmFjdCh6ZW1fY29udGFjdF9sQXR0cyhhcnJheSgKCQknZGVmYXVsdCcJPT4gJycsCgkJJ2lzRXJyb3InCT0+ICcnLAoJCSdsYWJlbCcJCT0+IHplbV9jb250YWN0X2dUeHQoJ2VtYWlsJyksCgkJJ21heCcJCT0+IDEwMCwKCQknbWluJwkJPT4gMCwKCQknbmFtZScJCT0+ICcnLAoJCSdyZXF1aXJlZCcJPT4gMSwKCQknYnJlYWsnCQk9PiBiciwKCQknc2l6ZScJCT0+ICcnLAoJCSdzZW5kX2FydGljbGUnCT0+IDAKCSksICRhdHRzKSk7CgoJaWYgKGVtcHR5KCRuYW1lKSkgJG5hbWUgPSB6ZW1fY29udGFjdF9sYWJlbDJuYW1lKCRsYWJlbCk7CgoJJGVtYWlsID0gJHplbV9jb250YWN0X3N1Ym1pdCA/IHRyaW0ocHMoJG5hbWUpKSA6ICRkZWZhdWx0OwoKCWlmICgkemVtX2NvbnRhY3Rfc3VibWl0IGFuZCBzdHJsZW4oJGVtYWlsKSkKCXsKCQlpZiAoIWlzX3ZhbGlkX2VtYWlsKCRlbWFpbCkpCgkJewoJCQkkemVtX2NvbnRhY3RfZXJyb3JbXSA9IHplbV9jb250YWN0X2dUeHQoJ2ludmFsaWRfZW1haWwnLCBodG1sc3BlY2lhbGNoYXJzKCRlbWFpbCkpOwoJCQkkaXNFcnJvciA9ICJlcnJvckVsZW1lbnQiOwoJCX0KCgkJZWxzZQoJCXsKCQkJcHJlZ19tYXRjaCgiL0AoLispJC8iLCAkZW1haWwsICRtYXRjaCk7CgkJCSRkb21haW4gPSAkbWF0Y2hbMV07CgoJCQlpZiAoaXNfY2FsbGFibGUoJ2NoZWNrZG5zcnInKSBhbmQgY2hlY2tkbnNycigndGV4dHBhdHRlcm4uY29tLicsJ0EnKSBhbmQgIWNoZWNrZG5zcnIoJGRvbWFpbi4nLicsJ01YJykgYW5kICFjaGVja2Ruc3JyKCRkb21haW4uJy4nLCdBJykpCgkJCXsKCQkJCSR6ZW1fY29udGFjdF9lcnJvcltdID0gemVtX2NvbnRhY3RfZ1R4dCgnaW52YWxpZF9ob3N0JywgaHRtbHNwZWNpYWxjaGFycygkZG9tYWluKSk7CgkJCQkkaXNFcnJvciA9ICJlcnJvckVsZW1lbnQiOwoJCQl9CgoJCQllbHNlCgkJCXsKCQkJCWlmICgkc2VuZF9hcnRpY2xlKSB7CgkJCQkJJHplbV9jb250YWN0X3JlY2lwaWVudCA9ICRlbWFpbDsKCQkJCX0KCQkJCWVsc2UgewoJCQkJCSR6ZW1fY29udGFjdF9mcm9tID0gJGVtYWlsOwoJCQkJfQoJCQl9CgkJfQoJfQoKCXJldHVybiB6ZW1fY29udGFjdF90ZXh0KGFycmF5KAoJCSdkZWZhdWx0Jwk9PiAkZW1haWwsCgkJJ2lzRXJyb3InCT0+ICRpc0Vycm9yLAoJCSdsYWJlbCcJCT0+ICRsYWJlbCwKCQknbWF4JwkJPT4gJG1heCwKCQknbWluJwkJPT4gJG1pbiwKCQknbmFtZScJCT0+ICRuYW1lLAoJCSdyZXF1aXJlZCcJPT4gJHJlcXVpcmVkLAoJCSdicmVhaycJCT0+ICRicmVhaywKCQknc2l6ZScJCT0+ICRzaXplCgkpKTsKfQoKZnVuY3Rpb24gemVtX2NvbnRhY3Rfc2VsZWN0KCRhdHRzKQp7CglnbG9iYWwgJHplbV9jb250YWN0X2Vycm9yLCAkemVtX2NvbnRhY3Rfc3VibWl0OwoKCWV4dHJhY3QoemVtX2NvbnRhY3RfbEF0dHMoYXJyYXkoCgkJJ25hbWUnCQk9PiAnJywKCQknYnJlYWsnCQk9PiAnICcsCgkJJ2RlbGltaXRlcicJPT4gJywnLAoJCSdpc0Vycm9yJwk9PiAnJywKCQknbGFiZWwnCQk9PiB6ZW1fY29udGFjdF9nVHh0KCdvcHRpb24nKSwKCQknbGlzdCcJCT0+IHplbV9jb250YWN0X2dUeHQoJ2dlbmVyYWxfaW5xdWlyeScpLAoJCSdyZXF1aXJlZCcJPT4gMSwKCQknc2VsZWN0ZWQnCT0+ICcnCgkpLCAkYXR0cykpOwoKCWlmIChlbXB0eSgkbmFtZSkpICRuYW1lID0gemVtX2NvbnRhY3RfbGFiZWwybmFtZSgkbGFiZWwpOwoKCSRsaXN0ID0gYXJyYXlfbWFwKCd0cmltJywgc3BsaXQoJGRlbGltaXRlciwgcHJlZ19yZXBsYWNlKCcvW1xyXG5cdFxzXSsvJywgJyAnLCRsaXN0KSkpOwoKCWlmICgkemVtX2NvbnRhY3Rfc3VibWl0KQoJewoJCSR2YWx1ZSA9IHRyaW0ocHMoJG5hbWUpKTsKCgkJaWYgKHN0cmxlbigkdmFsdWUpKQoJCXsKCQkJaWYgKGluX2FycmF5KCR2YWx1ZSwgJGxpc3QpKQoJCQl7CgkJCQl6ZW1fY29udGFjdF9zdG9yZSgkbmFtZSwgJGxhYmVsLCAkdmFsdWUpOwoJCQl9CgoJCQllbHNlCgkJCXsKCQkJCSR6ZW1fY29udGFjdF9lcnJvcltdID0gemVtX2NvbnRhY3RfZ1R4dCgnaW52YWxpZF92YWx1ZScsIGh0bWxzcGVjaWFsY2hhcnMoJGxhYmVsKSwgaHRtbHNwZWNpYWxjaGFycygkdmFsdWUpKTsKCQkJCSRpc0Vycm9yID0gImVycm9yRWxlbWVudCI7CgkJCX0KCQl9CgoJCWVsc2VpZiAoJHJlcXVpcmVkKQoJCXsKCQkJJHplbV9jb250YWN0X2Vycm9yW10gPSB6ZW1fY29udGFjdF9nVHh0KCdmaWVsZF9taXNzaW5nJywgaHRtbHNwZWNpYWxjaGFycygkbGFiZWwpKTsKCQkJJGlzRXJyb3IgPSAiZXJyb3JFbGVtZW50IjsKCQl9Cgl9CgllbHNlCgl7CgkJJHZhbHVlID0gJHNlbGVjdGVkOwoJfQoKCSRvdXQgPSAnJzsKCglmb3JlYWNoICgkbGlzdCBhcyAkaXRlbSkKCXsKCQkkb3V0IC49IG4udC4nPG9wdGlvbicuKCRpdGVtID09ICR2YWx1ZSA/ICcgc2VsZWN0ZWQ9InNlbGVjdGVkIj4nIDogJz4nKS4oc3RybGVuKCRpdGVtKSA/IGh0bWxzcGVjaWFsY2hhcnMoJGl0ZW0pIDogJyAnKS4nPC9vcHRpb24+JzsKCX0KCgkkemVtUmVxdWlyZWQgPSAkcmVxdWlyZWQgPyAnemVtUmVxdWlyZWQnIDogJyc7CgoJcmV0dXJuICc8bGFiZWwgZm9yPSInLiRuYW1lLiciIGNsYXNzPSJ6ZW1TZWxlY3QgJy4kemVtUmVxdWlyZWQuJGlzRXJyb3IuJyAnLiRuYW1lLiciPicuaHRtbHNwZWNpYWxjaGFycygkbGFiZWwpLic8L2xhYmVsPicuJGJyZWFrLgoJCW4uJzxzZWxlY3QgaWQ9IicuJG5hbWUuJyIgbmFtZT0iJy4kbmFtZS4nIiBjbGFzcz0iemVtU2VsZWN0ICcuJHplbVJlcXVpcmVkLiRpc0Vycm9yLiciPicuCgkJCSRvdXQuCgkJbi4nPC9zZWxlY3Q+JzsKfQoKZnVuY3Rpb24gemVtX2NvbnRhY3RfY2hlY2tib3goJGF0dHMpCnsKCWdsb2JhbCAkemVtX2NvbnRhY3RfZXJyb3IsICR6ZW1fY29udGFjdF9zdWJtaXQ7CgoJZXh0cmFjdCh6ZW1fY29udGFjdF9sQXR0cyhhcnJheSgKCQknYnJlYWsnCQk9PiAnICcsCgkJJ2NoZWNrZWQnCT0+IDAsCgkJJ2lzRXJyb3InCT0+ICcnLAoJCSdsYWJlbCcJCT0+IHplbV9jb250YWN0X2dUeHQoJ2NoZWNrYm94JyksCgkJJ25hbWUnCQk9PiAnJywKCQkncmVxdWlyZWQnCT0+IDEKCSksICRhdHRzKSk7CgoJaWYgKGVtcHR5KCRuYW1lKSkgJG5hbWUgPSB6ZW1fY29udGFjdF9sYWJlbDJuYW1lKCRsYWJlbCk7CgoJaWYgKCR6ZW1fY29udGFjdF9zdWJtaXQpCgl7CgkJJHZhbHVlID0gKGJvb2wpIHBzKCRuYW1lKTsKCgkJaWYgKCRyZXF1aXJlZCBhbmQgISR2YWx1ZSkKCQl7CgkJCSR6ZW1fY29udGFjdF9lcnJvcltdID0gemVtX2NvbnRhY3RfZ1R4dCgnZmllbGRfbWlzc2luZycsIGh0bWxzcGVjaWFsY2hhcnMoJGxhYmVsKSk7CgkJCSRpc0Vycm9yID0gImVycm9yRWxlbWVudCI7CgkJfQoKCQllbHNlCgkJewoJCQl6ZW1fY29udGFjdF9zdG9yZSgkbmFtZSwgJGxhYmVsLCAkdmFsdWUgPyBnVHh0KCd5ZXMnKSA6IGdUeHQoJ25vJykpOwoJCX0KCX0KCgllbHNlIHsKCQkkdmFsdWUgPSAkY2hlY2tlZDsKCX0KCgkkemVtUmVxdWlyZWQgPSAkcmVxdWlyZWQgPyAnemVtUmVxdWlyZWQnIDogJyc7CgoJcmV0dXJuICc8aW5wdXQgdHlwZT0iY2hlY2tib3giIGlkPSInLiRuYW1lLiciIGNsYXNzPSJ6ZW1DaGVja2JveCAnLiR6ZW1SZXF1aXJlZC4kaXNFcnJvci4nIiBuYW1lPSInLiRuYW1lLiciJy4KCQkoJHZhbHVlID8gJyBjaGVja2VkPSJjaGVja2VkIicgOiAnJykuJyAvPicuJGJyZWFrLgoJCSc8bGFiZWwgZm9yPSInLiRuYW1lLiciIGNsYXNzPSJ6ZW1DaGVja2JveCAnLiR6ZW1SZXF1aXJlZC4kaXNFcnJvci4nICcuJG5hbWUuJyI+Jy5odG1sc3BlY2lhbGNoYXJzKCRsYWJlbCkuJzwvbGFiZWw+JzsKfQoKZnVuY3Rpb24gemVtX2NvbnRhY3Rfc2VydmVyaW5mbygkYXR0cykKewoJZ2xvYmFsICR6ZW1fY29udGFjdF9zdWJtaXQ7CgoJZXh0cmFjdCh6ZW1fY29udGFjdF9sQXR0cyhhcnJheSgKCQknbGFiZWwnCQk9PiAnJywKCQknbmFtZScJCT0+ICcnCgkpLCAkYXR0cykpOwoKCWlmIChlbXB0eSgkbmFtZSkpICRuYW1lID0gemVtX2NvbnRhY3RfbGFiZWwybmFtZSgkbGFiZWwpOwoKCWlmIChzdHJsZW4oJG5hbWUpIGFuZCAkemVtX2NvbnRhY3Rfc3VibWl0KQoJewoJCWlmICghJGxhYmVsKSAkbGFiZWwgPSAkbmFtZTsKCQl6ZW1fY29udGFjdF9zdG9yZSgkbmFtZSwgJGxhYmVsLCBzZXJ2ZXJTZXQoJG5hbWUpKTsKCX0KfQoKZnVuY3Rpb24gemVtX2NvbnRhY3Rfc2VjcmV0KCRhdHRzLCAkdGhpbmcgPSAnJykKewoJZ2xvYmFsICR6ZW1fY29udGFjdF9zdWJtaXQ7CgoJZXh0cmFjdCh6ZW1fY29udGFjdF9sQXR0cyhhcnJheSgKCQknbmFtZScJPT4gJycsCgkJJ2xhYmVsJwk9PiB6ZW1fY29udGFjdF9nVHh0KCdzZWNyZXQnKSwKCQkndmFsdWUnCT0+ICcnCgkpLCAkYXR0cykpOwoKCSRuYW1lID0gemVtX2NvbnRhY3RfbGFiZWwybmFtZSgkbmFtZSA/ICRuYW1lIDogJGxhYmVsKTsKCglpZiAoJHplbV9jb250YWN0X3N1Ym1pdCkKCXsKCQlpZiAoJHRoaW5nKSAkdmFsdWUgPSB0cmltKHBhcnNlKCR0aGluZykpOwoJCXplbV9jb250YWN0X3N0b3JlKCRuYW1lLCAkbGFiZWwsICR2YWx1ZSk7Cgl9CgoJcmV0dXJuICcnOwp9CgpmdW5jdGlvbiB6ZW1fY29udGFjdF9yYWRpbygkYXR0cykKewoJZ2xvYmFsICR6ZW1fY29udGFjdF9lcnJvciwgJHplbV9jb250YWN0X3N1Ym1pdCwgJHplbV9jb250YWN0X3ZhbHVlczsKCglleHRyYWN0KHplbV9jb250YWN0X2xBdHRzKGFycmF5KAoJCSdicmVhaycJCT0+ICcgJywKCQknY2hlY2tlZCcJPT4gMCwKCQknZ3JvdXAnCQk9PiAnJywKCQknbGFiZWwnCQk9PiB6ZW1fY29udGFjdF9nVHh0KCdvcHRpb24nKSwKCQknbmFtZScJCT0+ICcnCgkpLCAkYXR0cykpOwoKCXN0YXRpYyAkY3VyX25hbWUgPSAnJzsKCXN0YXRpYyAkY3VyX2dyb3VwID0gJyc7CgoJaWYgKCEkbmFtZSBhbmQgISRncm91cCBhbmQgISRjdXJfbmFtZSBhbmQgISRjdXJfZ3JvdXApIHsKCQkkY3VyX2dyb3VwID0gemVtX2NvbnRhY3RfZ1R4dCgncmFkaW8nKTsKCQkkY3VyX25hbWUgPSAkY3VyX2dyb3VwOwoJfQoJaWYgKCRncm91cCBhbmQgISRuYW1lIGFuZCAkZ3JvdXAgIT0gJGN1cl9ncm91cCkgJG5hbWUgPSAkZ3JvdXA7CgoJaWYgKCRuYW1lKSAkY3VyX25hbWUgPSAkbmFtZTsKCWVsc2UgJG5hbWUgPSAkY3VyX25hbWU7CgoJaWYgKCRncm91cCkgJGN1cl9ncm91cCA9ICRncm91cDsKCWVsc2UgJGdyb3VwID0gJGN1cl9ncm91cDsKCgkkaWQgICA9ICdxJy5tZDUoJG5hbWUuJz0+Jy4kbGFiZWwpOwoJJG5hbWUgPSB6ZW1fY29udGFjdF9sYWJlbDJuYW1lKCRuYW1lKTsKCglpZiAoJHplbV9jb250YWN0X3N1Ym1pdCkKCXsKCQkkaXNfY2hlY2tlZCA9IChwcygkbmFtZSkgPT0gJGlkKTsKCgkJaWYgKCRpc19jaGVja2VkIG9yICRjaGVja2VkIGFuZCAhaXNzZXQoJHplbV9jb250YWN0X3ZhbHVlc1skbmFtZV0pKQoJCXsKCQkJemVtX2NvbnRhY3Rfc3RvcmUoJG5hbWUsICRncm91cCwgJGxhYmVsKTsKCQl9Cgl9CgoJZWxzZQoJewoJCSRpc19jaGVja2VkID0gJGNoZWNrZWQ7Cgl9CgoJcmV0dXJuICc8aW5wdXQgdmFsdWU9IicuJGlkLiciIHR5cGU9InJhZGlvIiBpZD0iJy4kaWQuJyIgY2xhc3M9InplbVJhZGlvICcuJG5hbWUuJyIgbmFtZT0iJy4kbmFtZS4nIicuCgkJKCAkaXNfY2hlY2tlZCA/ICcgY2hlY2tlZD0iY2hlY2tlZCIgLz4nIDogJyAvPicpLiRicmVhay4KCQknPGxhYmVsIGZvcj0iJy4kaWQuJyIgY2xhc3M9InplbVJhZGlvICcuJG5hbWUuJyI+Jy5odG1sc3BlY2lhbGNoYXJzKCRsYWJlbCkuJzwvbGFiZWw+JzsKfQoKZnVuY3Rpb24gemVtX2NvbnRhY3Rfc2VuZF9hcnRpY2xlKCRhdHRzKQp7CglpZiAoIWlzc2V0KCRfUkVRVUVTVFsnemVtX2NvbnRhY3Rfc2VuZF9hcnRpY2xlJ10pKSB7CgkJJGxpbmt0ZXh0ID0gKGVtcHR5KCRhdHRzWydsaW5rdGV4dCddKSkgPyB6ZW1fY29udGFjdF9nVHh0KCdzZW5kX2FydGljbGUnKSA6ICRhdHRzWydsaW5rdGV4dCddOwoJCSRqb2luID0gKGVtcHR5KCRfU0VSVkVSWydRVUVSWV9TVFJJTkcnXSkpID8gJz8nIDogJyYnOwoJCSRocmVmID0gJF9TRVJWRVJbJ1JFUVVFU1RfVVJJJ10uJGpvaW4uJ3plbV9jb250YWN0X3NlbmRfYXJ0aWNsZT15ZXMnOwoJCXJldHVybiAnPGEgaHJlZj0iJy5odG1sc3BlY2lhbGNoYXJzKCRocmVmKS4nIj4nLmh0bWxzcGVjaWFsY2hhcnMoJGxpbmt0ZXh0KS4nPC9hPic7Cgl9CglyZXR1cm47Cn0KCmZ1bmN0aW9uIHplbV9jb250YWN0X3N1Ym1pdCgkYXR0cywgJHRoaW5nKQp7CglleHRyYWN0KHplbV9jb250YWN0X2xBdHRzKGFycmF5KAoJCSdidXR0b24nCT0+IDAsCgkJJ2xhYmVsJwkJPT4gemVtX2NvbnRhY3RfZ1R4dCgnc2VuZCcpCgkpLCAkYXR0cykpOwoKCSRsYWJlbCA9IGh0bWxzcGVjaWFsY2hhcnMoJGxhYmVsKTsKCglpZiAoJGJ1dHRvbiBvciBzdHJsZW4oJHRoaW5nKSkKCXsKCQlyZXR1cm4gJzxidXR0b24gdHlwZT0ic3VibWl0IiBjbGFzcz0iemVtU3VibWl0IiBuYW1lPSJ6ZW1fY29udGFjdF9zdWJtaXQiIHZhbHVlPSInLiRsYWJlbC4nIj4nLigkdGhpbmcgPyB0cmltKHBhcnNlKCR0aGluZykpIDogJGxhYmVsKS4nPC9idXR0b24+JzsKCX0KCWVsc2UKCXsKCQlyZXR1cm4gJzxpbnB1dCB0eXBlPSJzdWJtaXQiIGNsYXNzPSJ6ZW1TdWJtaXQiIG5hbWU9InplbV9jb250YWN0X3N1Ym1pdCIgdmFsdWU9IicuJGxhYmVsLiciIC8+JzsKCX0KfQoKZnVuY3Rpb24gemVtX2NvbnRhY3RfbEF0dHMoJGFyciwgJGF0dHMpCnsKCWZvcmVhY2goYXJyYXkoJ2J1dHRvbicsICdjb3B5c2VuZGVyJywgJ2NoZWNrZWQnLCAncmVxdWlyZWQnLCAnc2VuZF9hcnRpY2xlJywgJ3Nob3dfaW5wdXQnLCAnc2hvd19lcnJvcicpIGFzICRrZXkpCgl7CgkJaWYgKGlzc2V0KCRhdHRzWyRrZXldKSkKCQl7CgkJCSRhdHRzWyRrZXldID0gKCRhdHRzWyRrZXldID09PSAneWVzJyBvciBpbnR2YWwoJGF0dHNbJGtleV0pKSA/IDEgOiAwOwoJCX0KCX0KCWlmIChpc3NldCgkYXR0c1snYnJlYWsnXSkgYW5kICRhdHRzWydicmVhayddID09ICdicicpICRhdHRzWydicmVhayddID0gJzxiciAvPic7CglyZXR1cm4gbEF0dHMoJGFyciwgJGF0dHMpOwp9CgpjbGFzcyB6ZW1jb250YWN0X2V2YWx1YXRpb24KewoJdmFyICRzdGF0dXM7CgoJZnVuY3Rpb24gemVtY29udGFjdF9ldmFsdWF0aW9uKCkgewoJCSR0aGlzLT5zdGF0dXMgPSAwOwoJfQoKCWZ1bmN0aW9uIGFkZF96ZW1jb250YWN0X3N0YXR1cygkY2hlY2spIHsKCQkkdGhpcy0+c3RhdHVzICs9ICRjaGVjazsKCX0KCglmdW5jdGlvbiBnZXRfemVtY29udGFjdF9zdGF0dXMoKSB7CgkJcmV0dXJuICR0aGlzLT5zdGF0dXM7Cgl9Cn0KCmZ1bmN0aW9uICZnZXRfemVtY29udGFjdF9ldmFsdWF0b3IoKQp7CglzdGF0aWMgJGluc3RhbmNlOwoKCWlmKCFpc3NldCgkaW5zdGFuY2UpKSB7CgkJJGluc3RhbmNlID0gbmV3IHplbWNvbnRhY3RfZXZhbHVhdGlvbigpOwoJfQoJcmV0dXJuICRpbnN0YW5jZTsKfQoKZnVuY3Rpb24gemVtX2NvbnRhY3RfbGFiZWwybmFtZSgkbGFiZWwpCnsKCSRsYWJlbCA9IHRyaW0oJGxhYmVsKTsKCWlmIChzdHJsZW4oJGxhYmVsKSA9PSAwKSByZXR1cm4gJ2ludmFsaWQnOwoJaWYgKHN0cmxlbigkbGFiZWwpIDw9IDMyIGFuZCBwcmVnX21hdGNoKCcvXlthLXpBLVpdW0EtWmEtejAtOTpfLV0qJC8nLCAkbGFiZWwpKSByZXR1cm4gJGxhYmVsOwoJZWxzZSByZXR1cm4gJ3EnLm1kNSgkbGFiZWwpOwp9CgpmdW5jdGlvbiB6ZW1fY29udGFjdF9zdG9yZSgkbmFtZSwgJGxhYmVsLCAkdmFsdWUpCnsKCWdsb2JhbCAkemVtX2NvbnRhY3RfZm9ybSwgJHplbV9jb250YWN0X2xhYmVscywgJHplbV9jb250YWN0X3ZhbHVlczsKCSR6ZW1fY29udGFjdF9mb3JtWyRsYWJlbF0gPSAkdmFsdWU7CgkkemVtX2NvbnRhY3RfbGFiZWxzWyRuYW1lXSA9ICRsYWJlbDsKCSR6ZW1fY29udGFjdF92YWx1ZXNbJG5hbWVdID0gJHZhbHVlOwp9CgpmdW5jdGlvbiB6ZW1fY29udGFjdF9tYWlsaGVhZGVyKCRzdHJpbmcsICR0eXBlKQp7CglnbG9iYWwgJHByZWZzOwoJaWYgKCFzdHJzdHIoJHN0cmluZywnPT8nKSBhbmQgIXByZWdfbWF0Y2goJy9bXHgwMC1ceDFGXHg3Ri1ceEZGXS8nLCAkc3RyaW5nKSkgewoJCWlmICgicGhyYXNlIiA9PSAkdHlwZSkgewoJCQlpZiAocHJlZ19tYXRjaCgnL1tdWygpPD5ALDs6Ii5ceDVDXS8nLCAkc3RyaW5nKSkgewoJCQkJJHN0cmluZyA9ICciJy4gc3RydHIoJHN0cmluZywgYXJyYXkoIlxcIiA9PiAiXFxcXCIsICciJyA9PiAnXCInKSkgLiAnIic7CgkJCX0KCQl9CgkJZWxzZWlmICgidGV4dCIgIT0gJHR5cGUpIHsKCQkJdHJpZ2dlcl9lcnJvcignVW5rbm93biBlbmNvZGVfbWFpbGhlYWRlciB0eXBlJywgRV9VU0VSX1dBUk5JTkcpOwoJCX0KCQlyZXR1cm4gJHN0cmluZzsKCX0KCWlmICgkcHJlZnNbJ292ZXJyaWRlX2VtYWlsY2hhcnNldCddKSB7CgkJJHN0YXJ0ID0gJz0/SVNPLTg4NTktMT9CPyc7CgkJJHBjcmUgID0gJy8uezEsNDJ9L3MnOwoJfQoJZWxzZSB7CgkJJHN0YXJ0ID0gJz0/VVRGLTg/Qj8nOwoJCSRwY3JlICA9ICcvLnsxLDQ1fSg/PVtceDAwLVx4N0ZceEMwLVx4RkZdfCQpL3MnOwoJfQoJJGVuZCA9ICc/PSc7Cgkkc2VwID0gaXNfd2luZG93cygpID8gIlxyXG4iIDogIlxuIjsKCXByZWdfbWF0Y2hfYWxsKCRwY3JlLCAkc3RyaW5nLCAkbWF0Y2hlcyk7CglyZXR1cm4gJHN0YXJ0IC4gam9pbigkZW5kLiRzZXAuJyAnLiRzdGFydCwgYXJyYXlfbWFwKCdiYXNlNjRfZW5jb2RlJywkbWF0Y2hlc1swXSkpIC4gJGVuZDsKfQoiO3M6NDoidHlwZSI7czoxOiIwIjtzOjU6Im9yZGVyIjtzOjE6IjUiO3M6MzoibWQ1IjtzOjMyOiJjYjc3MmYzMDU3MjdhOWU5ZTVmZDdkMTYxNmY1Njk5NiI7fQ==

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

Offline

#1437 2014-06-18 05:19:28

kuopassa
Plugin Author
From: Porvoo, Finland
Registered: 2008-12-03
Posts: 228
Website

Re: zem_contact_reborn 4.0.3.20

Thanks, colak, but doesn’t that one still have the split function inside. About in the middle is this line:

$list = array_map('trim', split($delimiter, preg_replace('/[\r\n\t\s]+/', ' ',$list)));

Offline

#1438 2014-06-18 09:43:49

element
Member
Registered: 2009-11-18
Posts: 99

Re: zem_contact_reborn 4.0.3.20

What about Hilary’s version?
http://www.proximowebdesign.ie/blog/textpattern-html5-web-form-with-modernizr-fallback

Last edited by element (2014-06-18 09:44:03)

Offline

#1439 2014-07-09 09:05:18

Bloke
Developer
From: Leeds, UK
Registered: 2006-01-29
Posts: 11,269
Website GitHub

Re: zem_contact_reborn 4.0.3.20

Updated the github repo with a slightly better signalling mechansim to the zemcontact.deliver callback than the simple true/false/null. Now if you return empty/nothing (which implies success) or the string zemcontact.send, ZCR continues to deliver on your behalf, perhaps using your modified payload. Otherwise you can return one of:

  • zemcontact.skip to skip zem_contact’s mailing (i.e. your code handles mailing) and return ‘success’ message
  • zemcontact.fail to skip zem_contact’s mailing and return ‘fail’ message

You can also target the first or second (copysender) send process by hooking into the callback’s step using send or copysender respectively. Or omit it to have your plugin called twice.


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

Txp Builders – finely-crafted code, design and Txp

Offline

#1440 2014-07-09 09:53:41

sacripant
Plugin Author
From: Rhône — France
Registered: 2008-06-01
Posts: 479
Website

Re: zem_contact_reborn 4.0.3.20

Hi Steph,
perhaps it would be interresting to update the first post to indicate the git repository of the new version.

Offline

Board footer

Powered by FluxBB