# tru_tags v1.6 # Tagging support with full integration # Nathan Arthur # http://rainskit.com/ # ...................................................................... # This is a plugin for Textpattern - http://textpattern.com/ # To install: textpattern > admin > plugins # Paste the following text into the 'Install plugin' box: # ...................................................................... YTo5OntzOjc6InZlcnNpb24iO3M6MzoiMS42IjtzOjY6ImF1dGhvciI7czoxMzoiTmF0aGFu IEFydGh1ciI7czoxMDoiYXV0aG9yX3VyaSI7czoxODoiaHR0cDovL3RydWlzdC5jb20vIjtz OjExOiJkZXNjcmlwdGlvbiI7czozNzoiVGFnZ2luZyBzdXBwb3J0IHdpdGggZnVsbCBpbnRl Z3JhdGlvbiI7czo0OiJ0eXBlIjtpOjA7czo0OiJuYW1lIjtzOjg6InRydV90YWdzIjtzOjQ6 ImhlbHAiO3M6MTY2MzU6IgoJPHA+VG8gbGVhcm4gbW9yZSBhYm91dCB0cnVfdGFncywgY2hl Y2sgb3V0IHRoZSA8YSBocmVmPSIvYmxvZy80OTMvdHJ1dGFncy1hLXRhZ2dpbmctcGx1Z2lu LWZvci10ZXh0cGF0dGVybiI+aW50cm9kdWN0b3J5IGFydGljbGU8L2E+IGFuZCA8YSBocmVm PSJodHRwOi8vd3d3LnRydWlzdC5jb20vcmVmZXJlbmNlLzQ5NS90cnV0YWdzLWZlYXR1cmUt bGlzdCI+ZmVhdHVyZSBsaXN0PC9hPi48L3A+Cgk8cD5Db3B5cmlnaHQgMjAwNiBOYXRoYW4g QXJ0aHVyPC9wPgoJPHA+UmVsZWFzZWQgdW5kZXIgdGhlIEdOVSBQdWJsaWMgTGljZW5zZSwg c2VlIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZ3BsLWxpY2Vuc2UucGhw IGZvciBkZXRhaWxzPC9wPgoJPHA+VGhpcyB3b3JrIGlzIGJhc2VkIG9uIHJhbl90YWdzIGJ5 IFJhbiBBcm91c3NpLCBvcmlnaW5hbGx5IGZvdW5kIGF0IGh0dHA6Ly9hcm91c3NpLmNvbS9h cnRpY2xlLzQ1L3RhZ2dpbmctdGV4dHBhdHRlcm4uICBJdCBhbHNvIGNvbnRhaW5zIGNvZGUg YWRhcHRlZCBmcm9tIGdkdHJvaWFubywgc2VlIGh0dHA6Ly9mb3J1bS50ZXh0cGF0dGVybi5j b20vdmlld3RvcGljLnBocD9waWQ9MTAyODc1I3AxMDI4NzUuPC9wPgoJPGgzPkNvbmZpZ3Vy YXRpb248L2gzPgoJPGg0PlN0ZXAgMTogQ3JlYXRlIGEgbmV3IHNlY3Rpb248L2g0PgoJPHA+ dHJ1X3RhZ3MgZGVwZW5kcyBvbiB0aGUgZXhpc3RlbmNlIG9mIGEgc3BlY2lhbCBUZXh0cGF0 dGVybiBzZWN0aW9uIG5hbWVkICYjODIyMDt0YWcsJiM4MjIxOyBieSBkZWZhdWx0PHN1cD48 YSBocmVmPSIjZm43NTA0NDg5NDQ0NWE5N2M5YTY4NzAiPjE8L2E+PC9zdXA+LiAgQ3JlYXRl IHRoYXQgc2VjdGlvbiwgdXNpbmcgd2hhdGV2ZXIgc2V0dGluZ3MgeW91IGxpa2UuICAoWW91 IHdvbiYjODIxNzt0IGJlIHB1Ymxpc2hpbmcgYXJ0aWNsZXMgdG8gdGhhdCBzZWN0aW9uLikg IEhlcmUmIzgyMTc7cyB3aGF0IEkgdXNlPHN1cD48YSBocmVmPSIjZm41Mjc4OTA5NDU0NDVh OTdjOWFiNjhiIj4yPC9hPjwvc3VwPjo8L3A+Cgk8cD48aW1nIHNyYz0iaHR0cDovL3d3dy50 cnVpc3QuY29tL2ltYWdlcy8yLnBuZyIgaGVpZ2h0PSIyODAiIHdpZHRoPSIzOTgiIGFsdD0i dGFnIHNlY3Rpb24gY29uZmlndXJhdGlvbiIgY2xhc3M9ImRpYWdyYW0iIC8+PC9wPgoJPHAg Y2xhc3M9ImZvb3Rub3RlIiBpZD0iZm43NTA0NDg5NDQ0NWE5N2M5YTY4NzAiPjxzdXA+MTwv c3VwPiBZb3UgY2FuIHVzZSBhIGRpZmZlcmVudCBuYW1lLCBidXQgeW91IGhhdmUgdG8gdXNl IGEgc3BlY2lhbCBhdHRyaWJ1dGUgaW4gc29tZSBvZiB0aGUgcGx1Z2luIGNhbGxzIHRvIG1h a2UgIGV2ZXJ5dGhpbmcgd29yayBjb3JyZWN0bHkuICBTZWUgYmVsb3cgZm9yIGRldGFpbHMu PC9wPgoJPHAgY2xhc3M9ImZvb3Rub3RlIiBpZD0iZm41Mjc4OTA5NDU0NDVhOTdjOWFiNjhi Ij48c3VwPjI8L3N1cD4gTm90ZSB0aGF0IEkgdXNlIHRoZSAmIzgyMTY7ZGVmYXVsdCYjODIx NzsgcGFnZSAmIzgyMTE7IHRoYXQgY2hvaWNlIG1heSBub3QgYmUgcmlnaHQgZm9yIHlvdS4g IFRoaXMgc2VjdGlvbiB3aWxsIGJlIHNob3duIHdoZW5ldmVyIHlvdSBjbGljayBvbiBhIHRh ZywgdG8gZGlzcGxheSB0aGUgdGFnIHNlYXJjaCByZXN1bHRzLiAgWW91JiM4MjE3O2xsIHdh bnQgYSBwYWdlIHRoYXQgaGFzIHRoZSBjb3JyZWN0IGxheW91dC9oZWFkZXJzL2Zvb3RlcnMu ICBJIHVzZSBteSBkZWZhdWx0IHBhZ2UsIHdpdGggPGNvZGU+Jmx0O3R4cDppZl9zZWN0aW9u IG5hbWU9InRhZyImZ3Q7PC9jb2RlPiB0byBjaGFuZ2UgdGhlIHBhZ2UgZGlzcGxheSBpbiB0 aGlzIGNhc2UuPC9wPgoJPGg0PlN0ZXAgMjogQ2FsbCB0aGUgcGx1Z2luIGZyb20gdGhhdCBz ZWN0aW9uPC9oND4KCTxwPlRvIG1ha2UgdGFnIHNlYXJjaGluZyBhbmQgdGhlIGRlZmF1bHQg dGFnIGNsb3VkIHdvcmssIHlvdSYjODIxNztsbCBuZWVkIHRvIGNhbGwgPGNvZGU+Jmx0O3R4 cDp0cnVfdGFnc19oYW5kbGVyIC8mZ3Q7PC9jb2RlPiBmcm9tIHRoZSBwYWdlIHlvdSBjaG9z ZSBpbiBTdGVwIDEuICBJIHJlcGxhY2VkIHRoZSBkZWZhdWx0IDxjb2RlPiZsdDt0eHA6YXJ0 aWNsZSAvJmd0OzwvY29kZT4gd2l0aCBzb21ldGhpbmcgbGlrZSB0aGlzOjwvcD4KPHByZT4m bHQ7dHhwOmlmX3NlY3Rpb24gbmFtZT0idGFnIiZndDsKICAmbHQ7dHhwOnRydV90YWdzX2hh bmRsZXIgLyZndDsKJmx0O3R4cDplbHNlIC8mZ3Q7CiAgJmx0O3R4cDphcnRpY2xlIC8mZ3Q7 CiZsdDsvdHhwOmlmX3NlY3Rpb24mZ3Q7PC9wcmU+Cgk8aDQ+U3RlcCAzOiBDb25maWd1cmUg eW91ciBhcnRpY2xlIGZvcm0gdG8gZGlzcGxheSB0YWdzPC9oND4KCTxwPlRvIG1ha2UgZWFj aCBhcnRpY2xlIHNob3cgYSBsaXN0IG9mIGFsbCB0aGUgdGFncyBhc3NvY2lhdGVkIHdpdGgg aXQsIHB1dCBzb21ldGluZyBsaWtlIHRoaXMgaW4geW91ciBhcnRpY2xlIGZvcm06PC9wPgo8 cHJlPiZsdDt0eHA6dHJ1X3RhZ3NfaWZfaGFzX3RhZ3MmZ3Q7CiAgdGFnczogJmx0O3R4cDp0 cnVfdGFnc19mcm9tX2FydGljbGUgLyZndDsKJmx0Oy90eHA6dHJ1X3RhZ3NfaWZfaGFzX3Rh Z3MmZ3Q7PC9wcmU+Cgk8aDQ+U3RlcCA0OiBEcm9wIGEgY3VzdG9tIHRhZyBjbG91ZCBzb21l d2hlcmUsIGlmIHlvdSB3YW50PC9oND4KCTxwPklmIHlvdSYjODIxNztkIGxpa2UgdG8gc2hv dyBhIHRhZyBjbG91ZCBzb21ld2hlcmUgb24geW91ciBzaXRlIChvdGhlciB0aGFuIC90YWcv KSwgcHV0IHNvbWV0aGluZyBsaWtlIHRoaXMgaW4gdGhhdCBwYWdlOjwvcD4KPHByZT4mbHQ7 dHhwOnRydV90YWdzX2Nsb3VkIC8mZ3Q7PC9wcmU+Cgk8cD5TZWUgYmVsb3cgZm9yIGxvdHMg b2YgZm9ybWF0dGluZyBvcHRpb25zLCBpbmNsdWRpbmcgdGhlIGFiaWxpdHkgdG8gb3V0cHV0 IGEgc2ltcGxlIGxpc3QgaW5zdGVhZCBvZiBhIGNsb3VkICh1c2luZyA8Y29kZT50cnVfdGFn c19saXN0PC9jb2RlPikuPC9wPgoJPGg0PlN0ZXAgNTogU3RhcnQgdGFnZ2luZyE8L2g0PgoJ PHA+V2hlbmV2ZXIgeW91IHdyaXRlIGFuIGFydGljbGUsIHB1dCB5b3VyIHRhZ3MgaW50byB0 aGUgS2V5d29yZHMgZmllbGQgaW4gVGV4dHBhdHRlcm4uICAoVGhlIEtleXdvcmRzIGZpZWxk IGhpZGVzIGJlaGluZCB0aGUgJiM4MjIwO0FkdmFuY2VkIE9wdGlvbnMmIzgyMjE7IGxpbmsg b24gdGhlIGxlZnQgc2lkZSBvZiB0aGUgJiM4MjIwO3dyaXRlJiM4MjIxOyBwYWdlLikgIFRh Z3Mgc2hvdWxkIGJlIHNlcGFyYXRlZCBieSBjb21tYXMsIGFuZCBjYW4gaGF2ZSBzcGFjZXM8 c3VwPjxhIGhyZWY9IiNmbjc1MDQ0ODk0NDQ1YTk3YzlhNjg3MCI+MTwvYT48L3N1cD4uPC9w PgoJPHA+WW91JiM4MjE3O2xsIHByb2JhYmx5IHdhbnQgdG8gaW5zdGFsbCBSb2IgU2FibGUm IzgyMTc7cyA8YSBocmVmPSJodHRwOi8vd3d3LndpbHNoaXJlb25lLmNvbS90ZXh0cGF0dGVy bi1wbHVnaW5zL3Jzcy1hZG1pbi1zaG93LWFkdi1vcHRzIj5yc3NfYWRtaW5fc2hvd19hZHZf b3B0czwvYT4sIHdoaWNoIHdpbGwgYXV0b21hdGljYWxseSBleHBhbmQgdGhlICYjODIyMDtB ZHZhbmNlZCBPcHRpb25zJiM4MjIxOyBzZWN0aW9uIG9mIHRoZSAmIzgyMjA7d3JpdGUmIzgy MjE7IHBhZ2UsIHdoZW4geW91IGFyZSB3cml0aW5nIGFydGljbGVzLiAgVGhhdCBnaXZlcyB5 b3UgZWFzeSBhY2Nlc3MgdG8gdGhlIEtleXdvcmRzIGZpZWxkLjwvcD4KCTxwIGNsYXNzPSJm b290bm90ZSIgaWQ9ImZuNzUwNDQ4OTQ0NDVhOTdjOWE2ODcwIj48c3VwPjE8L3N1cD4gVGFn cyB3aXRoIHNwYWNlcyB3aWxsIGdlbmVyYXRlIHVybHMgd2l0aCBkYXNoZXMsIHdoaWNoIHdp bGwgd29yayBjb3JyZWN0bHkuICBUYWdzIHdpdGggZGFzaGVzIHdpbGwgYWxzbyB3b3JrIGNv cnJlY3RseS48L3A+Cgk8aDQ+U3RlcCA2OiBGYW5jeSBkaXNwbGF5IGN1c3RvbWl6YXRpb248 L2g0PgoJPHA+WW91IGNhbiB1c2UgPGNvZGU+dHJ1X3RhZ3NfaWZfdGFnX3NlYXJjaDwvY29k ZT4sIDxjb2RlPnRydV90YWdzX3RhZ19wYXJhbWV0ZXI8L2NvZGU+LCBhbmQgPGNvZGU+dHJ1 X3RhZ3Nfc2VhcmNoX3BhcmFtZXRlcjwvY29kZT4gdG8gY3VzdG9taXplIHlvdXIgcGFnZSB0 aXRsZXMgb3IgdGFnIHNlYXJjaCByZXN1bHRzLiAgU2VlIGJlbG93IGZvciBkZXRhaWxzLiAg U2VlIHRoZSB0aXRsZWJhciBvZiA8YSBocmVmPSJodHRwOi8vd3d3LnRydWlzdC5jb20vIj50 cnVpc3QuY29tPC9hPiBmb3IgYW4gZXhhbXBsZS48L3A+Cgk8aDQ+U3RlcCA3OiBUdXJuIG9u IGNsZWFuIHVybHM8L2g0PgoJPHA+Q2xlYW4gdXJscyBhcmUgbm93IHBvc3NpYmxlIHdpdGgg dHJ1X3RhZ3MsIHByb3ZpZGVkIHRoYXQgeW91IGFyZSB3aWxsaW5nIHRvIG1vZGlmeSBUZXh0 cGF0dGVybiYjODIxNztzIHJld3JpdGUgcnVsZXMgKGluIHRoZSAuaHRhY2Nlc3MgZmlsZSku ICBCdXQgYmUgd2FybmVkICYjODIxMTsgcmV3cml0ZSBydWxlcyBhcmUgY29tcGxleC4gIEkg bWFrZSBubyBndWFyYW50ZWVzIHRoYXQgdGhpcyB3b24mIzgyMTc7dCBlYXQgeW91ciBjaGls ZHJlbi4gIDxzdHJvbmc+WW91IGRvbiYjODIxNzt0IGhhdmUgdG8gZG8gdGhpczwvc3Ryb25n PiBidXQgYSBsb3Qgb2YgcGVvcGxlIHdhbnQgaXQuICBUaGlzIHNpdGUgdXNlcyBpdCwgaWYg dGhhdCBoZWxwcy48L3A+Cgk8cD5IZXJlJiM4MjE3O3Mgd2hhdCB0byBkbzo8L3A+Cgk8b2w+ CgkJPGxpPkFkZCB0aGUgZm9sbG93aW5nIGxpbmVzIHRvIFRleHRwYXR0ZXJuJiM4MjE3O3Mg Lmh0YWNjZXNzIGZpbGUgKGZvdW5kIGluIHRoZSByb290IG9mIHlvdXIgVGV4dHBhdHRlcm4g ZGlyZWN0b3J5KSwgYWRqdXN0aW5nIHRoZW0gaWYgbmVjZXNzYXJ5LiAgVGhlc2UgbGluZXMg c2hvdWxkIGJlIDxzdHJvbmc+YWZ0ZXI8L3N0cm9uZz4gdGhlPC9saT4KCTwvb2w+Cgk8cD48 ZGl2IGNsYXNzPSJwcmUiPjwvcD4KCTxwPlJld3JpdGVSdWxlICYjOTQ7KC4mIzQzOykgJiM0 NTsgW1BULExdPC9wPgoJPHA+PC9kaXY+PC9wPgoJPHA+YW5kIDxzdHJvbmc+YmVmb3JlPC9z dHJvbmc+IHRoZTwvcD4KCTxwPjxkaXYgY2xhc3M9InByZSI+PC9wPgoJPHA+UmV3cml0ZVJ1 bGUgJiM5NDsoLiYjNDI7KSBpbmRleC5waHA8L3A+Cgk8cD48L2Rpdj48L3A+Cgk8cD5IZXJl JiM4MjE3O3MgdGhlIGJpdCB0byBpbnNlcnQ6PC9wPgoJPHA+PGRpdiBjbGFzcz0icHJlIj48 L3A+Cgk8cD4jVGhpcyBwYXRoIHNob3VsZCBtYXRjaCB0aGUgcmVsYXRpdmUgdXJsIG9mIHlv dXIgVGV4dHBhdHRlcm4gaW5zdGFsbDxiciAvPgpSZXdyaXRlQmFzZSAvPGJyIC8+CiNJZiB5 b3UncmUgdXNpbmcgYSBzZWN0aW9uIG90aGVyIHRoYW4gJiMzNDt0YWcmIzM0OywgY2hhbmdl IHRoZSBmb2xsb3dpbmcgdHdvIHJ1bGVzIGFjY29yZGluZ2x5PGJyIC8+ClJld3JpdGVSdWxl ICYjOTQ7dGFnLyhbJiM5NDsvXSYjNDM7KSQgdGFnLyQxLyBbUixMXTxiciAvPgpSZXdyaXRl UnVsZSAmIzk0O3RhZy8oLiYjNDM7KS8kICYjNjM7cyYjNjE7dGFnJmFtcDt0JiM2MTskMTwv cD4KCTxwPjwvZGl2PjwvcD4KCTxvbD4KCQk8bGk+PHN0cm9uZz5DaGVjayB0byBtYWtlIHN1 cmUgeW91ciBzaXRlIGlzIHN0aWxsIHdvcmtpbmcuPC9zdHJvbmc+PC9saT4KCQk8bGk+RWRp dCB0aGUgdHJ1X3RhZ3MgcGx1Z2luIChhZG1pbiAtPiBwbHVnaW5zLCBjbGljayAmIzgyMTY7 RWRpdCYjODIxNzspIGFuZCBjaGFuZ2UgdGhlIDxjb2RlPnRydV90YWdzX3VzZV9jbGVhbl91 cmxzKCk8L2NvZGU+IGZ1bmN0aW9uIHRvIHJldHVybiA8Y29kZT4xPC9jb2RlPi4gIChJdCYj ODIxNztzIHRoZSBmaXJzdCBmdW5jdGlvbi4pPC9saT4KCQk8bGk+Q2xlYW4gdXJscyBzaG91 bGQgYmUgd29ya2luZyBub3cuICBUcnkgY2xpY2tpbmcgYSB0YWcgbGluayB0byBzZWUgd2hh dCB1cmwgaXQgcmVmZXJlbmNlcy48L2xpPgoJCTxsaT5CeSBkZWZhdWx0LCBhcnRpY2xlIHRh Z3Mgd2lsbCBzZXQgdGhlIDxjb2RlPnJlbD0idGFnIjwvY29kZT4gYXR0cmlidXRlLCBhbmQg dGhlIHRhZyBjbG91ZCAob3IgbGlzdCkgd29uJiM4MjE3O3QuICBUaGlzIGNhbiBiZSBjb250 cm9sbGVkIHdpdGggdGhlIDxjb2RlPnVzZXJlbHRhZzwvY29kZT4gYXR0cmlidXRlOyBzZWUg YmVsb3cgZm9yIGRldGFpbHMuPC9saT4KCTwvb2w+Cgk8aDM+VGFnIHJlZmVyZW5jZTwvaDM+ Cgk8aDQ+PGNvZGU+dHJ1X3RhZ3NfaGFuZGxlcjwvY29kZT48L2g0PgoJPHA+VGhpcyBpcyB0 aGUgbWFpbiBmdW5jdGlvbiB0aGF0IGRyaXZlcyB0YWcgc2VhcmNoIGFuZCBzaG93cyB0aGUg Z2VuZXJpYyB0YWcgY2xvdWQuICBJdCBzaG91bGQgYmUgY2FsbGVkIGZyb20gdGhlIHBhZ2Ug dGhhdCBpcyB1c2VkIGluIHRoZSAmIzgyMTY7dGFnJiM4MjE3OyBzZWN0aW9uLiAgSXQgZ2Vu ZXJhbGx5IGNhbGxzIDxjb2RlPmRvQXJ0aWNsZXMoKTwvY29kZT4gKGluIHRoZSBUZXh0cGF0 dGVybiBjb2RlKSB0byBkaXNwbGF5IHRhZyBzZWFyY2ggcmVzdWx0cywgYnV0IGlmIG5vIHRh ZyB3YXMgcGFzc2VkIGluIHRoZSB1cmwgaXQgd2lsbCBjYWxsIDxjb2RlPnRydV90YWdzX2Ns b3VkPC9jb2RlPiBpbnN0ZWFkLjwvcD4KCTxwPlRoaXMgdGFnIGFjY2VwdHMgbW9zdCBvZiB0 aGUgc3RhbmRhcmQgPGNvZGU+dHhwOmFydGljbGU8L2NvZGU+IGF0dHJpYnV0ZXMsIHdoaWNo IHdpbGwgYmUgYXBwbGllZCBkdXJpbmcgdGhlIHRhZyBzZWFyY2guICBOb3RlIHRoYXQgPGNv ZGU+dHJ1X3RhZ3NfaGFuZGxlcjwvY29kZT4gPHN0cm9uZz5kb2VzIG5vdDwvc3Ryb25nPiBz dXBwb3J0IHVzaW5nIG11bHRpcGxlIHNlY3Rpb25zIHdpdGggdGhlIDxjb2RlPnNlY3Rpb248 L2NvZGU+IGF0dHJpYnV0ZSwgd2hlbiBkb2luZyBhIHRhZyBzZWFyY2guICBJZiBtdWx0aXBs ZSBzZWN0aW9ucyBhcmUgcGFzc2VkLCBub25lIGFyZSB1c2VkLjwvcD4KCTxwPjxzdHJvbmc+ Tm90ZTo8L3N0cm9uZz4gSW4gVGV4dHBhdHRlcm4sIHRoZSA8Y29kZT5saW1pdDwvY29kZT4g YXR0cmlidXRlIGlzIGRlZmF1bHRlZCB0byA8Y29kZT4xMDwvY29kZT4sIHRvIGxpbWl0IHRo ZSBvdXRwdXQgdG8gMTAgYXJ0aWNsZXMgcGVyIHBhZ2UsIGFuZCB0aGUgPGNvZGU+dHhwOm9s ZGVyPC9jb2RlPiBhbmQgPGNvZGU+dHhwOm5ld2VyPC9jb2RlPiB0YWdzIGFyZSB1c2VkIHRv IHBhZ2luYXRlIHRoZSBmdWxsIGxpc3QuICBUaGUgPGNvZGU+dHhwOm9sZGVyPC9jb2RlPiBh bmQgPGNvZGU+dHhwOm5ld2VyPC9jb2RlPiB0YWdzIGRvIG5vdCB3b3JrIHdpdGggdHJ1X3Rh Z3MsIGJ1dCB0aGUgPGNvZGU+bGltaXQ8L2NvZGU+IGlzIHN0aWxsIHVzZWQgYnkgVGV4dHBh dHRlcm4gd2hlbiBpdCBvdXRwdXRzIHRoZSBhcnRpY2xlcy4gIFRoZXJlZm9yZSwgdHJ1X3Rh Z3MgdXNlcyBhIGRlZmF1bHQgbGltaXQgb2YgPGNvZGU+MTAwMDwvY29kZT4gd2hlbiBkb2lu ZyBhbiBhcnRpY2xlIHNlYXJjaC4gIFlvdSBjYW4gb3ZlcnJpZGUgdGhpcyBsaW1pdCBieSBz ZXR0aW5nIHRoZSA8Y29kZT5saW1pdDwvY29kZT4gYXR0cmlidXRlIG9uIDxjb2RlPnRydV90 YWdzX2hhbmRsZXI8L2NvZGU+LjwvcD4KCTxwPlRoaXMgdGFnIHdpbGwgYWxzbyBhY2NlcHQg YWxsIG9mIHRoZSBhdHRyaWJ1dGVzIHVzZWQgYnkgPGNvZGU+dHJ1X3RhZ19jbG91ZDwvY29k ZT4uICBTZWUgYmVsb3cgZm9yIGRldGFpbHMuPC9wPgoJPGg0Pjxjb2RlPnRydV90YWdzX2lm X2hhc190YWdzPC9jb2RlPjwvaDQ+Cgk8cD5UaGlzIGNvbmRpdGlvbmFsIHRhZyBjYW4gYmUg dXNlZCBpbiBhbiBhcnRpY2xlIGZvcm0sIGFuZCB3aWxsIGV2YWx1YXRlIGl0cyBjb250ZW50 cyAoZS5nLiAmIzgyMjA7cmV0dXJuIHRydWUmIzgyMjE7KSBpZiB0aGUgY3VycmVudCBhcnRp Y2xlIGhhcyB0YWdzLjwvcD4KCTxoND48Y29kZT50cnVfdGFnc19mcm9tX2FydGljbGU8L2Nv ZGU+PC9oND4KCTxwPlRoaXMgdGFnIGNhbiBiZSB1c2VkIGluIGFuIGFydGljbGUgZm9ybSB0 byByZXR1cm4gYSBsaXN0IG9mIHRhZ3MgYXNzb2NpYXRlZCB3aXRoIHRoZSBjdXJyZW50IGFy dGljbGUuICBUeXBpY2FsbHkgKHNlZSBiZWxvdyksIGVhY2ggdGFnIGluIHRoZSBsaXN0IHdp bGwgYmUgYSBsaW5rICg8Y29kZT4mbHQ7YSBocmVmPS4uLiZndDs8L2NvZGU+KSB0byB0aGUg dGFnIHNlYXJjaCB1cmwgZm9yIHRoYXQgcGFydGljdWxhciB0YWcuPC9wPgoJPHA+VGhpcyB0 YWcgYWNjZXB0cyB0aGUgc3RhbmRhcmQgPGNvZGU+d3JhcHRhZzwvY29kZT4sIDxjb2RlPmJy ZWFrPC9jb2RlPiwgPGNvZGU+Y2xhc3M8L2NvZGU+LCBhbmQgPGNvZGU+YnJlYWtjbGFzczwv Y29kZT4gYXR0cmlidXRlcy48L3A+Cgk8cD5JZiB5b3UgZG9uJiM4MjE3O3Qgd2FudCB0byBo YXZlIHRoZSB0YWdzIGJlIGxpbmtzLCB5b3UgY2FuIHNldCA8Y29kZT5nZW5lcmF0ZWxpbmtz PSIwIjwvY29kZT4gdG8gdHVybiB0aGUgbGlua3Mgb2ZmLjwvcD4KCTxwPkl0IGFsc28gYWNj ZXB0cyBhIDxjb2RlPnRhZ3NlY3Rpb248L2NvZGU+IGF0dHJpYnV0ZSwgd2hpY2ggdGVsbHMg dHJ1X3RhZ3Mgd2hhdCByZWxhdGl2ZSB1cmwgdG8gdXNlIHRvIGZpbmQgdGhlICYjODIxNjt0 YWcmIzgyMTc7IHNlY3Rpb24uICBUaGlzIGNhbiBiZSB1c2VmdWwgaWYgeW91IGhhdmUgbmFt ZWQgdGhlIHNlY3Rpb24gc29tZXRoaW5nIG90aGVyIHRoYW4gJiM4MjE2O3RhZyYjODIxNzsu ICBCeSBkZWZhdWx0LCB0aGlzIGlzIHNldCB0byA8Y29kZT50YWc8L2NvZGU+LjwvcD4KCTxw PklmIHlvdSBoYXZlIGNsZWFuIHVybHMgdHVybmVkIG9uIChzZWUgYWJvdmUpLCB5b3UgY2Fu IHVzZSB0aGUgPGNvZGU+dXNlcmVsdGFnczwvY29kZT4gYXR0cmlidXRlIHRvIHNwZWNpZnkg d2hldGhlciBsaW5rcyBpbiB0aGUgbGlzdCBzaG91bGQgaGF2ZSB0aGUgPGEgaHJlZj0iaHR0 cDovL21pY3JvZm9ybWF0cy5vcmcvd2lraS9yZWx0YWciPjxjb2RlPnJlbD0idGFnIjwvY29k ZT48L2E+ICAodXNlZCBieSA8YSBocmVmPSJodHRwOi8vd3d3LnRlY2hub3JhdGkuY29tLyI+ VGVjaG5vcmF0aTwvYT4pIGF0dHJpYnV0ZSBzZXQuICBOb3RlIHRoYXQgdGhpcyB3b24mIzgy MTc7dCB3b3JrIGlmIHlvdSB0dXJuIG9mZiBsaW5rcy4gIEFsc28gbm90ZSB0aGF0IHRhZ3Mg ZG9uJiM4MjE3O3Qgc2hvdyB1cCBpbiB0aGUgUlNTL0F0b20gZmVlZHMsIHVubGVzcyB5b3Ug PGEgaHJlZj0iaHR0cDovL2ZvcnVtLnRleHRwYXR0ZXJuLmNvbS92aWV3dG9waWMucGhwP3Bp ZD00MDkwNyNwNDA5MDciPmhhY2sgdGhlIHRleHRwYXR0ZXJuIHNvdXJjZTwvYT4uICBUaGlz IGlzIG9uIGJ5IGRlZmF1bHQuPC9wPgoJPHA+QWdhaW4gaWYgeW91IGhhdmUgY2xlYW4gdXJs cyB0dXJuZWQgb24sIHlvdSBjYW4gdXNlIHRoZSA8Y29kZT51c2Vub2ZvbGxvdzwvY29kZT4g YXR0cmlidXRlIHRvIHNwZWNpZnkgd2hldGhlciBsaW5rcyBpbiB0aGUgbGlzdCBzaG91bGQg aGF2ZSB0aGUgPGEgaHJlZj0iaHR0cDovL2dvb2dsZWJsb2cuYmxvZ3Nwb3QuY29tLzIwMDUv MDEvcHJldmVudGluZy1jb21tZW50LXNwYW0uaHRtbCI+PGNvZGU+cmVsPSJub2ZvbGxvdyI8 L2NvZGU+PC9hPiBhdHRyaWJ1dGUgc2V0LiAgVGhpcyBpcyBvZmYgYnkgZGVmYXVsdC48L3A+ Cgk8aDQ+PGNvZGU+dHJ1X3RhZ3NfY2xvdWQ8L2NvZGU+PC9oND4KCTxoND48Y29kZT50cnVf dGFnc19saXN0PC9jb2RlPjwvaDQ+Cgk8cD5UaGVzZSB0d28gdGFncyBkbyB0aGUgZXhhY3Qg c2FtZSB0aGluZyAmIzgyMTE7IDxjb2RlPnRydV90YWdzX2Nsb3VkPC9jb2RlPiBqdXN0IHBy b3ZpZGVzIGRpZmZlcmVudCBkZWZhdWx0cyB0byA8Y29kZT50cnVfdGFnc19saXN0PC9jb2Rl Pi48L3A+CjxwPjxjb2RlPnRydV90YWdzX2Nsb3VkPC9jb2RlPiBjYW4gYmUgdXNlZCBvbiBh bnkgcGFnZSwgYW5kIGlzIGdlbmVyYWxseSB1c2VkIHRvIGdlbmVyYXRlIGEgc2ltcGxlIHRh ZyBjbG91ZCBvZiBhbGwgdGhlIHRhZ3MgdXNlZCBvbiB5b3VyIHNpdGUuICBUaGUgY2xvdWQg aXMgcmVhbGx5IGp1c3QgYSBsaXN0IG9mIGxpbmtzLCBtdWNoIGxpa2UgdGhhdCBnZW5lcmF0 ZWQgYnkgPGNvZGU+dHJ1X3RhZ3NfZnJvbV9hcnRpY2xlPC9jb2RlPiwgYnV0IHdpdGggYSA8 Y29kZT5zdHlsZTwvY29kZT4gYXR0cmlidXRlIHNldCBvbiBlYWNoIGxpbmsgdG8gZ2l2ZSBp dCBhIGZvbnQgc2l6ZSByYW5naW5nIGZyb20gMTAwJSB0byAyMDAlLjwvcD4KPHA+PGNvZGU+ dHJ1X3RhZ3NfbGlzdDwvY29kZT4gY2FuIGJlIHVzZWQgb24gYW55IHBhZ2UsIGFuZCBpcyBn ZW5lcmFsbHkgdXNlZCB0byBvdXRwdXQgYSBidWxsZXRlZCBsaXN0IG9mIGFsbCB0aGUgdGFn cyB1c2VkIG9uIHlvdXIgc2l0ZS4gIEJ5IGRlZmF1bHQsIHRoZSB0YWdzIHdpbGwgYWxsIGhh dmUgYSBmb250LXNpemUgb2YgMTAwJS48L3A+CjxwPjxjb2RlPnRydV90YWdzX2Nsb3VkPC9j b2RlPiBhbmQgPGNvZGU+dHJ1X3RhZ3NfbGlzdDwvY29kZT4gYm90aCBzZXQgdGhlIDxjb2Rl PmNsYXNzPC9jb2RlPiBhdHRyaWJ1dGUgb2YgZWFjaCB0YWcsIHNwZWNpZnlpbmcgdHdvIGNs YXNzZXMuICBUaGUgZmlyc3QgY2xhc3MgZ3JvdXBzIHRoZSB0YWdzIGludG8gY2F0ZWdvcmll cywgd2l0aCBjbGFzc2VzIG9mIDxjb2RlPnRhZ1NpemVTbWFsbGVzdDwvY29kZT4sIDxjb2Rl PnRhZ1NpemVNZWRpdW08L2NvZGU+LCBhbmQgPGNvZGU+dGFnU2l6ZUxhcmdlc3Q8L2NvZGU+ LiAgVXNpbmcgdGhlc2UsIHlvdSBjb3VsZCBtYWtlIHRoZSBzbWFsbGVzdCBhbmQgbGFyZ2Vz dCB0YWdzIGhhdmUgZGlmZmVyZW50IHN0eWxlcyB0aGFuIGFsbCB0aGUgb3RoZXJzLjwvcD4K CTxwPlRoZSBzZWNvbmQgY2xhc3MgaW5kaWNhdGVzIHRoZSAmIzgyMjA7c3RlcCYjODIyMTsg b2YgdGhlIGN1cnJlbnQgdGFnLCB3aXRoIGNsYXNzZXMgb2YgPGNvZGU+dGFnU2l6ZTE8L2Nv ZGU+LCA8Y29kZT50YWdTaXplMjwvY29kZT4sIGFuZCBzbyBvbi4gIFRoZXNlIGdpdmUgeW91 IHByZWNpc2UgY29udHJvbCBvdmVyIGVhY2ggdGFnIHNpemUsIGlmIHlvdSB3YW50IGl0Ljwv cD4KCTxwPklmIHlvdSB1c2UgdGhlc2UgY2xhc3NlcyB0byBjcmVhdGUgc3BlY2lhbCBDU1Mg cnVsZXMsIHlvdSBtYXkgYWxzbyB3YW50IHRvIHNldCB0aGUgPGNvZGU+c2V0c2l6ZXM8L2Nv ZGU+IGF0dHJpYnV0ZSwgZGVzY3JpYmVkIGJlbG93LjwvcD4KCTxoNT5Cb3RoIHRhZ3MgYWNj ZXB0IHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczo8L2g1PgoJPHVsPgoJCTxsaT5UaGUgc3Rh bmRhcmQgPGNvZGU+d3JhcHRhZzwvY29kZT4sIDxjb2RlPmJyZWFrPC9jb2RlPiwgPGNvZGU+ Y2xhc3M8L2NvZGU+LCBhbmQgPGNvZGU+YnJlYWtjbGFzczwvY29kZT4gYXR0cmlidXRlcy4g IDxjb2RlPnRydV90YWdzX2Nsb3VkPC9jb2RlPiBoYXMgYSBkZWZhdWx0IDxjb2RlPmJyZWFr PC9jb2RlPiBvZiBhIGNvbW1hLiAgPGNvZGU+dHJ1X3RhZ3NfbGlzdDwvY29kZT4gaGFzIGEg ZGVmYXVsdCA8Y29kZT53cmFwdGFnPC9jb2RlPiBvZiA8Y29kZT51bDwvY29kZT4gYW5kIGEg ZGVmYXVsdCA8Y29kZT5icmVhazwvY29kZT4gb2YgPGNvZGU+bGk8L2NvZGU+LjwvbGk+CgkJ PGxpPjxjb2RlPnRhZ3NlY3Rpb248L2NvZGU+LCB3aGljaCB0ZWxscyB0cnVfdGFncyB3aGF0 IHJlbGF0aXZlIHVybCB0byB1c2UgdG8gZmluZCB0aGUgJiM4MjE2O3RhZyYjODIxNzsgc2Vj dGlvbi4gIFRoaXMgY2FuIGJlIHVzZWZ1bCBpZiB5b3UgaGF2ZSBuYW1lZCB0aGUgc2VjdGlv biBzb21ldGhpbmcgb3RoZXIgdGhhbiAmIzgyMTY7dGFnJiM4MjE3Oy4gIEJ5IGRlZmF1bHQs IHRoaXMgaXMgc2V0IHRvIDxjb2RlPnRhZzwvY29kZT4uPC9saT4KCQk8bGk+PGNvZGU+c2Vj dGlvbjwvY29kZT4sIHdoaWNoIHRlbGxzIGl0IHRvIGxpbWl0IHRoZSBsaXN0IHRvIHRhZ3Mg ZnJvbSB0aGUgZ2l2ZW4gc2VjdGlvbiBvciBzZWN0aW9ucy4gIEZvciBleGFtcGxlLCA8Y29k ZT4mbHQ7dHhwOnRydV90YWdzX2Nsb3VkIHNlY3Rpb249ImJsb2cscmVmZXJlbmNlIiAvJmd0 OzwvY29kZT4gd291bGQgb25seSBzaG93IHRhZ3MgZnJvbSB0aGUgJiM4MjIwO2Jsb2cmIzgy MjE7IGFuZCAmIzgyMjA7cmVmZXJlbmNlJiM4MjIxOyBzZWN0aW9ucy4gIEJ5IGRlZmF1bHQs IHRoaXMgaXMgc2V0IHRvIGJsYW5rICh0byBzaG93IHRhZ3MgZnJvbSBhbGwgc2VjdGlvbnMp LgoJPHVsPgoJCTxsaT48c3Ryb25nPk5vdGU6PC9zdHJvbmc+IGlmIHlvdSB1c2UgPGNvZGU+ c2VjdGlvbjwvY29kZT4gdG8gbGltaXQgdGhlIGNsb3VkIHRvIGEgcGFydGljdWxhciBzZWN0 aW9uLCBpdCB3b24mIzgyMTc7dCBsaW1pdCB0aGUgdGFnIHNlYXJjaCBmZWF0dXJlIHRvIHRo YXQgc2VjdGlvbi4gIFRoZSB0YWcgc2VhcmNoIGZpbmRzICh0YWdnZWQpIGFydGljbGVzIGZy b20gYWxsIHNlY3Rpb25zLCBubyBtYXR0ZXIgd2hhdC4gIFRoYXQmIzgyMTc7cyBhIHNpZGUt ZWZmZWN0IG9mIHRoZSB1c2Ugb2YgPGNvZGU+ZG9BcnRpY2xlcygpPC9jb2RlPiwgYW5kIEkg ZG9uJiM4MjE3O3QgdGhpbmsgdGhlcmUmIzgyMTc7cyBhbnl0aGluZyBJIGNhbiBkbyBhYm91 dCBpdC48L2xpPgoJPC91bD48L2xpPgoJCTxsaT48Y29kZT5taW5wZXJjZW50PC9jb2RlPiBh bmQgPGNvZGU+bWF4cGVyY2VudDwvY29kZT4sIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGNvbnRy b2wgdGhlIHdlaWdodGVkIGZvbnQgc2l6ZXMgaW4gdGhlIHRhZyBjbG91ZC9saXN0LiAgPGNv ZGU+dHJ1X3RhZ3NfY2xvdWQ8L2NvZGU+IGRlZmF1bHRzIHRvIDxjb2RlPjEwMDwvY29kZT4g YW5kIDxjb2RlPjIwMDwvY29kZT4sIHJlc3BlY3RpdmVseSwgYW5kIDxjb2RlPnRydV90YWdz X2xpc3Q8L2NvZGU+IGRlZmF1bHRzIHRvIDxjb2RlPjEwMDwvY29kZT4gYW5kIDxjb2RlPjEw MDwvY29kZT4uPC9saT4KCQk8bGk+PGNvZGU+c2hvd2NvdW50czwvY29kZT4sIHdoaWNoIHdp bGwgYXBwZW5kIGEgbnVtYmVyIGluZGljYXRpbmcgdGhlIG51bWJlciBvZiB0aW1lcyBhIHRh ZyBoYXMgYmVlbiB1c2VkLCB0byBlYWNoIHRhZyBpbiB0aGUgbGlzdC4gIEZvciBleGFtcGxl LCB5b3UgbWlnaHQgc2VlOiA8c3BhbiBjbGFzcz0icHJlIj48YSBocmVmPSIvP3M9dGFnJiMz ODt0PWxpZmUiPmxpZmU8L2E+IFszXSwgPGEgaHJlZj0iLz9zPXRhZyYjMzg7dD10ZWNoIj50 ZWNoPC9hPiBbNV08L3NwYW4+IGluIG15IHRhZyBjbG91ZCwgaWYgdGhpcyB3YXMgdHVybmVk IG9uLiAgVGhpcyBpcyBvZmYgYnkgZGVmYXVsdC4gIFVzZSA8Y29kZT4xPC9jb2RlPiBvciA8 Y29kZT50cnVlPC9jb2RlPiB0byB0dXJuIGl0IG9uLgoJPHVsPgoJCTxsaT5UaGlzIGNhbiBh bHNvIGJlIHVzZWQgdG8gcHV0IHRoZSBjb3VudHMgaW4gdGhlIDxjb2RlPnRpdGxlPC9jb2Rl PiBhdHRyaWJ1dGUgb2YgdGhlIGxpbmtzLCB3aGljaCB3aWxsIG1ha2UgaXQgYXBwZWFyIGlu IGEgdG9vbHRpcC4gIFVzZSA8Y29kZT5zaG93Y291bnRzPSJ0aXRsZSI8L2NvZGU+IG9yIDxj b2RlPnNob3djb3VudHM9ImJvdGgiPC9jb2RlPiAodG8gc2hvdyBpdCBpbiBib3RoIHBsYWNl cykgdG8gdHVybiBpdCBvbi48L2xpPgoJPC91bD48L2xpPgoJCTxsaT48Y29kZT5jb3VudHdy YXBjaGFyczwvY29kZT4sIHdoaWNoIGNvbnRyb2xzIHRoZSBjaGFyYWN0ZXJzIHVzZWQgdG8g c2hvdyB0aGUgdGFnIGNvdW50LCBpZiA8Y29kZT5zaG93Y291bnRzPC9jb2RlPiBpcyB0dXJu ZWQgb24uICBCeSBkZWZhdWx0IHRoaXMgaXMgPGNvZGU+W108L2NvZGU+LiAgVGhlIGZpcnN0 IGNoYXJhY3RlciB3aWxsIGJlIHB1dCBvbiB0aGUgbGVmdCBzaWRlIG9mIHRoZSBudW1iZXIs IGFuZCB0aGUgc2Vjb25kIGNoYXJhY3RlciB3aWxsIGJlIHB1dCBvbiB0aGUgcmlnaHQuICBG b3IgZXhhbXBsZSwgYSA8Y29kZT5jb3VudHdyYXBjaGFyczwvY29kZT4gb2YgPGNvZGU+KCk8 L2NvZGU+IHdvdWxkIHNob3c6IDxzcGFuIGNsYXNzPSJwcmUiPjxhIGhyZWY9Ii8/cz10YWcm IzM4O3Q9bGlmZSI+bGlmZTwvYT4gKDMpLCA8YSBocmVmPSIvP3M9dGFnJiMzODt0PXRlY2gi PnRlY2g8L2E+ICg1KTwvc3Bhbj48L2xpPgoJCTxsaT5JZiB5b3UgaGF2ZSBjbGVhbiB1cmxz IHR1cm5lZCBvbiAoc2VlIGFib3ZlKSwgeW91IGNhbiB1c2UgdGhlIDxjb2RlPnVzZXJlbHRh Z3M8L2NvZGU+IGF0dHJpYnV0ZSB0byBzcGVjaWZ5IHdoZXRoZXIgbGlua3MgaW4gdGhlIGxp c3Qgc2hvdWxkIGhhdmUgdGhlIDxhIGhyZWY9Imh0dHA6Ly9taWNyb2Zvcm1hdHMub3JnL3dp a2kvcmVsdGFnIj48Y29kZT5yZWw9InRhZyI8L2NvZGU+PC9hPiAgKHVzZWQgYnkgPGEgaHJl Zj0iaHR0cDovL3d3dy50ZWNobm9yYXRpLmNvbS8iPlRlY2hub3JhdGk8L2E+KSBhdHRyaWJ1 dGUgc2V0LiAgVGhpcyBpcyBvZmYgYnkgZGVmYXVsdC48L2xpPgoJCTxsaT5BZ2FpbiBpZiB5 b3UgaGF2ZSBjbGVhbiB1cmxzIHR1cm5lZCBvbiwgeW91IGNhbiB1c2UgdGhlIDxjb2RlPnVz ZW5vZm9sbG93PC9jb2RlPiBhdHRyaWJ1dGUgdG8gc3BlY2lmeSB3aGV0aGVyIGxpbmtzIGlu IHRoZSBsaXN0IHNob3VsZCBoYXZlIHRoZSA8YSBocmVmPSJodHRwOi8vZ29vZ2xlYmxvZy5i bG9nc3BvdC5jb20vMjAwNS8wMS9wcmV2ZW50aW5nLWNvbW1lbnQtc3BhbS5odG1sIj48Y29k ZT5yZWw9Im5vZm9sbG93IjwvY29kZT48L2E+IGF0dHJpYnV0ZSBzZXQuICBUaGlzIGlzIG9m ZiBieSBkZWZhdWx0LjwvbGk+CgkJPGxpPklmIHlvdSBkb24mIzgyMTc7dCB3YW50IHRoZSB0 YWdzIHRvIGJlIGxpbmtzLCB5b3UgY2FuIHNldCA8Y29kZT5nZW5lcmF0ZWxpbmtzPSIwIjwv Y29kZT4gdG8gdHVybiB0aGVtIG9mZi48L2xpPgoJCTxsaT48Y29kZT5taW50YWdjb3VudDwv Y29kZT4gYW5kIDxjb2RlPm1heHRhZ2NvdW50PC9jb2RlPiBjYW4gYmUgdXNlZCB0byBoaWRl IHRhZ3MgdGhhdCBvbmx5IGhhdmUgYSBmZXcgYXJ0aWNsZXMsIG9yIHRoYXQgaGF2ZSB0b28g bWFueS4gIFRoZXkgYXJlIGRlZmF1bHRlZCB0byA8Y29kZT4wPC9jb2RlPiBhbmQgPGNvZGU+ MTAwMDwvY29kZT4sIHJlc3BlY3RpdmVseS4gIEZvciBleGFtcGxlLCA8Y29kZT5taW50YWdj b3VudD0iMiI8L2NvZGU+IHdvdWxkIGhpZGUgYW55IHRhZ3MgdGhhdCB3ZXJlIG9ubHkgYXNz b2NpYXRlZCB3aXRoIGEgc2luZ2xlIGFydGljbGUuICBJZiB5b3UgZG8gdGhpcywgeW91IG1h eSB3YW50IHRvIGFkZCBhIGxpbmsgdG8gdGhlIGRlZmF1bHQgdGFnIGNsb3VkLCB1c3VhbGx5 IGZvdW5kIGF0IDxjb2RlPi90YWcvPC9jb2RlPi48L2xpPgoJCTxsaT5JZiB5b3Ugd2FudCB0 byBjb250cm9sIHRoZSBzaXplKHMpIG9mIHRoZSB0YWdzIHlvdXJzZWxmICh0aHJvdWdoIENT UyksIHNldCA8Y29kZT5zZXRzaXplcz0iMCI8L2NvZGU+IHRvIHR1cm4gb2ZmIHRoZSA8Y29k ZT5zdHlsZT0iZm9udC1zaXplOiBYWFglIjwvY29kZT4gYXR0cmlidXRlIGdlbmVyYXRpb24u ICBUaGF0IHdpbGwgbGVhdmUgYmVoaW5kIHRoZSBkZWZhdWx0IENTUyBjbGFzc2VzLCB3aGlj aCB5b3UgY2FuIHVzZSB0byBjb250cm9sIHRoZSBkaXNwbGF5IG9mIHlvdXIgY2xvdWQuPC9s aT4KCTwvdWw+Cgk8cD5Ob3RlIHRoYXQgeW91IGNhbiB1c2UgdGhlIGF0dHJpYnV0ZXMgdG8g bWFrZSBlYWNoIHRhZyBkbyB0aGUgc2FtZSB0aGluZy4gIDxjb2RlPnRydV90YWdzX2Nsb3Vk PC9jb2RlPiBpcyBqdXN0IGEgY29udmVuaWVuY2UgZnVuY3Rpb24gZm9yIGdlbmVyYXRpbmcg YSB0YWcgY2xvdWQgdXNpbmcgPGNvZGU+dHJ1X3RhZ3NfbGlzdDwvY29kZT4uICBUaGVyZWZv cmUsIGl0JiM4MjE3O3MgcG9zc2libGUgdG8gaGF2ZSBhIHRhZyBjbG91ZCB3aXRoIHRhZyBj b3VudHMgc2hvd2luZywgb3IgaGF2ZSBhIGJ1bGxldGVkIGxpc3Qgd2l0aCB2YXJpYWJsZSBm b250IHNpemVzLCBldGMuPC9wPgoJPGg0Pjxjb2RlPnRydV90YWdzX2lmX3RhZ19zZWFyY2g8 L2NvZGU+PC9oND4KCTxwPlRoaXMgY29uZGl0aW9uYWwgdGFnIGNhbiBiZSB1c2VkIGFueXdo ZXJlIGFuZCB3aWxsIGV2YWx1YXRlIGl0cyBjb250ZW50cyAoZS5nLiAmIzgyMjA7cmV0dXJu IHRydWUmIzgyMjE7KSBpZiB0aGUgY3VycmVudCB1cmwgaW5kaWNhdGVzIHRoYXQgdGhlcmUg aXMgYSB0YWcgc2VhcmNoIGdvaW5nIG9uLiAgVGhpcyBjYW4gYmUgdXNlZnVsIGlmIHlvdSB3 YW50IHRvIGRvIHNvbWV0aGluZyBsaWtlIGN1c3RvbWl6ZSB0aGUgdGl0bGViYXIgd2hlbiB1 c2luZyB0aGUgdGFnIHNlYXJjaC48L3A+Cgk8aDQ+PGNvZGU+dHJ1X3RhZ3NfdGFnX3BhcmFt ZXRlcjwvY29kZT48L2g0PgoJPHA+VGhpcyB0YWcgY2FuIGJlIHVzZWQgYW55d2hlcmUgYW5k IHdpbGwgcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBjdXJyZW50IHRhZyB1bmRlciBzZWFyY2gs IGR1cmluZyBhIHRhZyBzZWFyY2guICBUaGlzIGlzIGdlbmVyYWxseSB1c2VkIHdpdGggPGNv ZGU+dHJ1X3RhZ3NfaWZfdGFnX3NlYXJjaDwvY29kZT4uPC9wPgoJPGg0Pjxjb2RlPnRydV90 YWdzX3NlYXJjaF9wYXJhbWV0ZXI8L2NvZGU+PC9oND4KCTxwPlRoaXMgdGFnIGNhbiBiZSB1 c2VkIGFueXdoZXJlIGFuZCB3aWxsIHJldHVybiB0aGUgdGV4dCB0aGUgdXNlciB0eXBlZCBp bnRvIHRoZSBzdGFuZGFyZCBzZWFyY2ggYm94LCBkdXJpbmcgYSByZWd1bGFyIHNlYXJjaC4g IFRoaXMgdGFnIGlzIG5vdCBzcGVjaWZpY2FsbHkgcmVsYXRlZCB0byB0YWdnaW5nLCBidXQg Y2FuIGJlIGhhbmR5IGZvciBjdXN0b21pemluZyB0aGUgdGl0bGViYXIgb24gc2VhcmNoIHJl c3VsdCBwYWdlcy48L3A+CgoKICI7czo0OiJjb2RlIjtzOjcwNjM6IgoKCiNDb3B5cmlnaHQg MjAwNiBOYXRoYW4gQXJ0aHVyCiNSZWxlYXNlZCB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNl bnNlLCBzZWUgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9ncGwtbGljZW5z ZS5waHAgZm9yIGRldGFpbHMKI1RoaXMgd29yayBpcyBiYXNlZCBvbiByYW5fdGFncyBieSBS YW4gQXJvdXNzaSwgb3JpZ2luYWxseSBmb3VuZCBhdCBodHRwOi8vYXJvdXNzaS5jb20vYXJ0 aWNsZS80NS90YWdnaW5nLXRleHRwYXR0ZXJuCgoKI1NlZSBodHRwOi8vd3d3LnRydWlzdC5j b20vcmVmZXJlbmNlLzQ5Ny90cnV0YWdzLXVzYWdlLWluc3RydWN0aW9ucyBmb3IgaW5zdHJ1 Y3Rpb25zCmZ1bmN0aW9uIHRydV90YWdzX3VzZV9jbGVhbl91cmxzKCkKewoJcmV0dXJuIDA7 ICNETyBOT1QgRU5BQkxFIFRISVMgdW5sZXNzIHlvdSd2ZSByZWFkIHRoZSBpbnN0cnVjdGlv bnMKfQoKCmZ1bmN0aW9uIHRydV90YWdzX2hhbmRsZXIoJGF0dHMpIHsKCWV4dHJhY3QoJF9H RVQpOwoJaWYgKGlzc2V0KCR0KSkgewoJCSRrZXl3b3JkcyA9IGV4cGxvZGUoJywnLCBzdHJp cF90YWdzKCR0KSk7CgkJZm9yZWFjaCAoJGtleXdvcmRzIGFzICRrZXl3b3JkKSB7CgkJCWlm IChzdHJwb3MoJGtleXdvcmQsICctJykgIT09IGZhbHNlKQoJCQkJJGtleXdvcmRzW10gPSBz dHJfcmVwbGFjZSgnLScsICcgJywgJGtleXdvcmQpOwoJCX0KCQkkYXR0c1sna2V5d29yZHMn XSA9IGltcGxvZGUoJywnLCAka2V5d29yZHMpOwoKCQlpZiAoJGF0dHNbJ3NlY3Rpb24nXSAm JiBzdHJwb3MoJGF0dHNbJ3NlY3Rpb24nXSwgJywnKSAhPT0gZmFsc2UpCgkJCSRhdHRzWydz ZWN0aW9uJ10gPSAnJzsKCgkJaWYgKCEkYXR0c1snbGltaXQnXSkKCQkJJGF0dHNbJ2xpbWl0 J10gPSAnMTAwMCc7CgkJJGF0dHNbJ2FsbG93b3ZlcnJpZGUnXSA9IHRydWU7CgoJCXJldHVy biBkb0FydGljbGVzKCRhdHRzLCB0cnVlKTsKCX0gZWxzZSB7CgkJcmV0dXJuIHRydV90YWdz X2Nsb3VkKCRhdHRzKTsKCX0KfQoKCmZ1bmN0aW9uIHRydV90YWdzX2lmX2hhc190YWdzKCRh dHRzLCAkdGhpbmcpIHsKCWdsb2JhbCAkdGhpc2FydGljbGU7CglleHRyYWN0KCR0aGlzYXJ0 aWNsZSk7CgoJJHRhZ3NfZmllbGQgPSB0cnVfdGFnc19maWVsZCgpOwoKCSRycyA9IHNhZmVf cm93KCR0YWdzX2ZpZWxkLCAidGV4dHBhdHRlcm4iLCAiSUQ9JyR0aGlzaWQnIEFORCAkdGFn c19maWVsZCA8PiAnJyIpOwoJcmV0dXJuIHBhcnNlKEV2YWxFbHNlKCR0aGluZywgJHJzKSk7 Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc19mcm9tX2FydGljbGUoJGF0dHMpIHsKCglnbG9iYWwg JHRoaXNhcnRpY2xlLCAkc2l0ZXVybCwgJHBhdGhfZnJvbV9yb290OwoKCWV4dHJhY3QoJF9T RVJWRVIpOwoJZXh0cmFjdCgkdGhpc2FydGljbGUpOwoKCWV4dHJhY3QobEF0dHMoYXJyYXko J3dyYXB0YWcnICAgICAgID0+ICcnLAoJCQkJCQknYnJlYWsnICAgICAgICAgPT4gJywgJywK CQkJCQkJJ2NsYXNzJyAgICAgICAgID0+ICcnLAoJCQkJCQknYnJlYWtjbGFzcycJPT4gJycs CgkJCQkJCSd0YWdzZWN0aW9uJwk9PiAndGFnJywKCQkJCQkJJ3VzZXJlbHRhZycJPT4gJzEn LAoJCQkJCQknZ2VuZXJhdGVsaW5rcycJPT4gJzEnLAoJCQkJCQkndXNlbm9mb2xsb3cnCT0+ ICcnCgkJCQkJCSksJGF0dHMpKTsKCgkkdGFnc19maWVsZCA9IHRydV90YWdzX2ZpZWxkKCk7 CgoJJHJzID0gc2FmZV9yb3coJHRhZ3NfZmllbGQsICJ0ZXh0cGF0dGVybiIsICJJRD0nJHRo aXNpZCcgQU5EICR0YWdzX2ZpZWxkIDw+ICcnIik7CgkkYWxsX3RhZ3MgPSBleHBsb2RlKCIs IiwgdHJpbShtYl9zdHJ0b2xvd2VyKCRyc1skdGFnc19maWVsZF0sICJVVEYtOCIpKSk7Cglz b3J0KCRhbGxfdGFncyk7CgkkYWxsX3RhZ3MgPSBhcnJheV91bmlxdWUoJGFsbF90YWdzKTsK CglpZiAoJGdlbmVyYXRlbGlua3MpIHsKCQlpZiAodHJ1X3RhZ3NfdXNlX2NsZWFuX3VybHMo KSkgewoJCQkkdXJscHJlZml4ID0gJ2h0dHA6Ly8nIC4gJHNpdGV1cmwgLiAkcGF0aF9mcm9t X3Jvb3QgLiAkdGFnc2VjdGlvbiAuICcvJzsKCQkJaWYgKCR1c2VyZWx0YWcpIHsKCQkJCWlm ICgkdXNlbm9mb2xsb3cpIHsKCQkJCQkkdXJsc3VmZml4ID0gJy8iIHJlbD0idGFnIG5vZm9s bG93JzsKCQkJCX0gZWxzZSB7CgkJCQkJJHVybHN1ZmZpeCA9ICcvIiByZWw9InRhZyc7CgkJ CQl9CgkJCX0gZWxzZSBpZiAoJHVzZW5vZm9sbG93KSB7CgkJCQkkdXJsc3VmZml4ID0gJy8i IHJlbD0ibm9mb2xsb3cnOwoJCQl9IGVsc2UgewoJCQkJJHVybHN1ZmZpeCA9ICcvJzsKCQkJ fQoJCX0gZWxzZSB7CgkJCSR1cmxwcmVmaXggPSAnaHR0cDovLycgLiAkc2l0ZXVybCAuICRw YXRoX2Zyb21fcm9vdCAuICc/cz0nIC4gJHRhZ3NlY3Rpb24gLiAnJmFtcDt0PSc7CgkJCSR1 cmxzdWZmaXggPSAnJzsKCQl9CgoJCWZvcigkaT0wOyAkaTxjb3VudCgkYWxsX3RhZ3MpOyAk aSsrKSB7CgkJCSR0YWdzX2h0bWxbXSA9ICc8YSBocmVmPSInIC4gJHVybHByZWZpeCAuIHN0 cl9yZXBsYWNlKCcgJywgJy0nLCB0cmltKCRhbGxfdGFnc1skaV0pKSAuICR1cmxzdWZmaXgg LiAnIj4nIC4gdHJpbSgkYWxsX3RhZ3NbJGldKSAuJzwvYT4nOwoJCX0KCX0gZWxzZSB7CgkJ JHRhZ3NfaHRtbCA9ICRhbGxfdGFnczsKCX0KCglyZXR1cm4gZG9XcmFwKCR0YWdzX2h0bWws ICR3cmFwdGFnLCAkYnJlYWssICRjbGFzcywgJGJyZWFrY2xhc3MpOwp9CgoKZnVuY3Rpb24g dHJ1X3RhZ3NfY2xvdWQoJGF0dHMpIHsKCSRhdHRzID0gbEF0dHMoYXJyYXkoJ3dyYXB0YWcn CT0+ICcnLAoJCQkJJ2JyZWFrJwk9PiAnLCAnLAoJCQkJJ2NsYXNzJwk9PiAnJywKCQkJCSdi cmVha2NsYXNzJwk9PiAnJywKCQkJCSd0YWdzZWN0aW9uJwk9PiAndGFnJywKCQkJCSdzZWN0 aW9uJwk9PiAnJywKCQkJCSdtaW5wZXJjZW50Jwk9PiAnMTAwJywKCQkJCSdtYXhwZXJjZW50 Jwk9PiAnMjAwJywKCQkJCSdzaG93Y291bnRzJwk9PiAnJywKCQkJCSdjb3VudHdyYXBjaGFy cycJPT4gJ1tdJywKCQkJCSd1c2VyZWx0YWcnCT0+ICcnLAoJCQkJJ2dlbmVyYXRlbGlua3Mn CT0+ICcxJywKCQkJCSdtaW50YWdjb3VudCcJPT4gJzAnLAoJCQkJJ21heHRhZ2NvdW50Jwk9 PiAnMTAwMCcsCgkJCQknc2V0c2l6ZXMnCT0+ICcxJwoJCQkpLCRhdHRzKTsKCglyZXR1cm4g dHJ1X3RhZ3NfbGlzdCgkYXR0cyk7Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc19saXN0KCRhdHRz KSB7CglnbG9iYWwgJHNpdGV1cmwsICRwYXRoX2Zyb21fcm9vdDsKCWV4dHJhY3QoJF9TRVJW RVIpOwoKCSRhdHRzID0gbEF0dHMoYXJyYXkoJ3dyYXB0YWcnCT0+ICd1bCcsCgkJCQknYnJl YWsnCT0+ICdsaScsCgkJCQknY2xhc3MnCT0+ICcnLAoJCQkJJ2JyZWFrY2xhc3MnCT0+ICcn LAoJCQkJJ3RhZ3NlY3Rpb24nCT0+ICd0YWcnLAoJCQkJJ3NlY3Rpb24nCT0+ICcnLAoJCQkJ J21pbnBlcmNlbnQnCT0+ICcxMDAnLAoJCQkJJ21heHBlcmNlbnQnCT0+ICcxMDAnLAoJCQkJ J3Nob3djb3VudHMnCT0+ICcnLAoJCQkJJ2NvdW50d3JhcGNoYXJzJwk9PiAnW10nLAoJCQkJ J3VzZXJlbHRhZycJPT4gJycsCgkJCQknZ2VuZXJhdGVsaW5rcycJPT4gJzEnLAoJCQkJJ21p bnRhZ2NvdW50Jwk9PiAnMCcsCgkJCQknbWF4dGFnY291bnQnCT0+ICcxMDAwJywKCQkJCSdz ZXRzaXplcycJPT4gJzEnLAoJCQkJJ3VzZW5vZm9sbG93Jwk9PiAnJwoJCQkpLCRhdHRzKTsK CWV4dHJhY3QoJGF0dHMpOwoKCSR0YWdzX2ZpZWxkID0gdHJ1X3RhZ3NfZmllbGQoKTsKCgkk c2VjdGlvbl9jbGF1c2UgPSAnJzsKCWlmICgkc2VjdGlvbiA8PiAnJykgewoJCSRrZXlzID0g c3BsaXQoJywnLCAkc2VjdGlvbik7CgkJZm9yZWFjaCAoJGtleXMgYXMgJGtleSkgewoJCQkk a2V5cGFydHNbXSA9ICIgU2VjdGlvbiA9ICciIC4gdHJpbSgka2V5KSAuICInIjsKCQl9CgkJ JHNlY3Rpb25fY2xhdXNlID0gIiBBTkQgKCIgLiBqb2luKCcgb3IgJywgJGtleXBhcnRzKSAu ICIpIjsKCX0KCglpbmNsdWRlX29uY2UgdHhwYXRoLicvcHVibGlzaC9zZWFyY2gucGhwJzsK CSRmaWx0ZXIgPSBmaWx0ZXJTZWFyY2goKTsKCSRhbGxfdGFncyA9IGFycmF5KCk7CgkkcnMg PSBzYWZlX3Jvd3MoIiR0YWdzX2ZpZWxkIiwgInRleHRwYXR0ZXJuIiwgIiR0YWdzX2ZpZWxk IDw+ICcnIiAuICRzZWN0aW9uX2NsYXVzZSAuICRmaWx0ZXIgLiAiIGFuZCBTdGF0dXMgPj0g JzQnIGFuZCBQb3N0ZWQgPCBub3coKSIpOwoJZm9yZWFjaCAoJHJzIGFzICRyb3cpIHsKCQkk dGVtcF9hcnJheSA9IGV4cGxvZGUoIiwiLCB0cmltKG1iX3N0cnRvbG93ZXIoJHJvd1skdGFn c19maWVsZF0sICJVVEYtOCIpKSk7CgkJZm9yICgkaSA9IDA7ICRpIDwgY291bnQoJHRlbXBf YXJyYXkpOyAkaSsrKSB7CgkJCSR0ZW1wX2FycmF5WyRpXSA9IHRyaW0oJHRlbXBfYXJyYXlb JGldKTsKCQl9CgkJJGFsbF90YWdzID0gYXJyYXlfbWVyZ2UoJGFsbF90YWdzLCAkdGVtcF9h cnJheSk7Cgl9Cglzb3J0KCRhbGxfdGFncyk7CgoJJHRhZ3Nfd2VpZ2h0ID0gYXJyYXlfY291 bnRfdmFsdWVzKCRhbGxfdGFncyk7CgkkdGFnc191bmlxdWUgPSBhcnJheV91bmlxdWUoJGFs bF90YWdzKTsKCglmb3JlYWNoICgkdGFnc191bmlxdWUgYXMgJGtleSA9PiAkdGFnKSB7CgkJ aWYgKCR0YWdzX3dlaWdodFskdGFnXSA8ICRtaW50YWdjb3VudCB8fCAkdGFnc193ZWlnaHRb JHRhZ10gPiAkbWF4dGFnY291bnQpIHsKCQkJdW5zZXQoJHRhZ3NfdW5pcXVlWyRrZXldKTsK CQkJdW5zZXQoJHRhZ3Nfd2VpZ2h0WyR0YWddKTsKCQl9Cgl9CgoJJG1heCA9IG1heCgkdGFn c193ZWlnaHQpOwoJJG1pbiA9IG1pbigkdGFnc193ZWlnaHQpOwoJJHN0ZXB2YWx1ZSA9ICgk bWF4ID09ICRtaW4pID8gMCA6ICgkbWF4cGVyY2VudCAtICRtaW5wZXJjZW50KSAvICgkbWF4 IC0gJG1pbik7CgoJaWYgKCRnZW5lcmF0ZWxpbmtzKSB7CgkJaWYgKHRydV90YWdzX3VzZV9j bGVhbl91cmxzKCkpIHsKCQkJJHVybHByZWZpeCA9ICdodHRwOi8vJyAuICRzaXRldXJsIC4g JHBhdGhfZnJvbV9yb290IC4gJHRhZ3NlY3Rpb24gLiAnLyc7CgkJCWlmICgkdXNlcmVsdGFn KSB7CgkJCQlpZiAoJHVzZW5vZm9sbG93KSB7CgkJCQkJJHVybHN1ZmZpeCA9ICcvIiByZWw9 InRhZyBub2ZvbGxvdyc7CgkJCQl9IGVsc2UgewoJCQkJCSR1cmxzdWZmaXggPSAnLyIgcmVs PSJ0YWcnOwoJCQkJfQoJCQl9IGVsc2UgaWYgKCR1c2Vub2ZvbGxvdykgewoJCQkJJHVybHN1 ZmZpeCA9ICcvIiByZWw9Im5vZm9sbG93JzsKCQkJfSBlbHNlIHsKCQkJCSR1cmxzdWZmaXgg PSAnLyc7CgkJCX0KCQl9IGVsc2UgewoJCQkkdXJscHJlZml4ID0gJ2h0dHA6Ly8nIC4gJHNp dGV1cmwgLiAkcGF0aF9mcm9tX3Jvb3QgLiAnP3M9JyAuICR0YWdzZWN0aW9uIC4gJyZhbXA7 dD0nOwoJCQkkdXJsc3VmZml4ID0gJyc7CgkJfQoJfQoKCWZvcmVhY2ggKCR0YWdzX3VuaXF1 ZSBhcyAkdGFnKSB7CgkJJHRhZ193ZWlnaHQgPSBmbG9vcigkbWlucGVyY2VudCArICgkdGFn c193ZWlnaHRbJHRhZ10gLSAkbWluKSAqICRzdGVwdmFsdWUpOwoKCQlpZiAoJHNldHNpemVz KQoJCQkkc3R5bGUgPSAnIHN0eWxlPSJmb250LXNpemU6ICcgLiAkdGFnX3dlaWdodCAuICcl OyInOwoKCQkkdGFnX2NsYXNzID0gJyBjbGFzcz0iJzsKCQlpZiAoJHRhZ3Nfd2VpZ2h0WyR0 YWddID09ICRtaW4pCgkJCSR0YWdfY2xhc3MgLj0gInRhZ1NpemVTbWFsbGVzdCI7CgkJZWxz ZSBpZiAoJHRhZ3Nfd2VpZ2h0WyR0YWddID09ICRtYXgpCgkJCSR0YWdfY2xhc3MgLj0gInRh Z1NpemVMYXJnZXN0IjsKCQllbHNlCgkJCSR0YWdfY2xhc3MgLj0gInRhZ1NpemVNZWRpdW0i OwoJCSR0YWdfY2xhc3MgLj0gJyB0YWdTaXplJyAuICgkdGFnc193ZWlnaHRbJHRhZ10gKyAx IC0gJG1pbik7CgkJJHRhZ19jbGFzcyAuPSAnIic7CgoJCS8vYWRhcHRlZCBmcm9tIGNvZGUg YnkgZ2R0cm9pYW5vLCBzZWUgaHR0cDovL2ZvcnVtLnRleHRwYXR0ZXJuLmNvbS92aWV3dG9w aWMucGhwP3BpZD0xMDI4NzUjcDEwMjg3NQoJCSR0aXRsZWNvdW50ID0gJyc7CgkJJGRpc3Bs YXljb3VudD0gJyc7CgkJJGNvdW50ID0gJGNvdW50d3JhcGNoYXJzezB9IC4gJHRhZ3Nfd2Vp Z2h0WyR0YWddIC4gJGNvdW50d3JhcGNoYXJzezF9OwoJCWlmICgkc2hvd2NvdW50cyA9PSAn dGl0bGUnIHx8ICRzaG93Y291bnRzID09ICdib3RoJykKCQkJJHRpdGxlY291bnQgPSAnIHRp dGxlPSInIC4gJGNvdW50IC4gJyInOwoJCWlmICgkc2hvd2NvdW50cyAmJiAkc2hvd2NvdW50 cyAhPSAndGl0bGUnKQoJCQkkZGlzcGxheWNvdW50ID0gJyAnIC4gJGNvdW50OwoKCQlpZiAo JGdlbmVyYXRlbGlua3MpIHsKCQkJJHdob2xldXJsID0gJyInIC4gJHVybHByZWZpeCAuIHN0 cl9yZXBsYWNlKCcgJywgJy0nLCAkdGFnKSAuICR1cmxzdWZmaXggLiAnIic7CgkJCSR0YWdz X2h0bWxbXSA9ICc8YSBocmVmPScgLiAkd2hvbGV1cmwgLiAkdGFnX2NsYXNzIC4gJHN0eWxl IC4gJHRpdGxlY291bnQgLiAnPicgLiAkdGFnIC4gJzwvYT4nIC4gJGRpc3BsYXljb3VudDsK CQl9IGVsc2UgewoJCQkkdGFnc19odG1sW10gPSAnPHNwYW4nIC4gJHRhZ19jbGFzcyAuICRz dHlsZSAuICR0aXRsZWNvdW50IC4gJz4nIC4gJHRhZyAuICc8L3NwYW4+JyAuICRkaXNwbGF5 Y291bnQ7CgkJfQoJfQoKCXJldHVybiBkb1dyYXAoJHRhZ3NfaHRtbCwgJHdyYXB0YWcsICRi cmVhaywgJGNsYXNzLCAkYnJlYWtjbGFzcyk7Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc19pZl90 YWdfc2VhcmNoKCRhdHRzLCAkdGhpbmcpCnsKCSR0YWdfc2VhcmNoaW5nID0gZ3BzKCd0Jyk7 CgkkY29uZGl0aW9uID0gKCFlbXB0eSgkdGFnX3NlYXJjaGluZykpPyB0cnVlIDogZmFsc2U7 CglyZXR1cm4gcGFyc2UoRXZhbEVsc2UoJHRoaW5nLCAkY29uZGl0aW9uKSk7Cn0KCgpmdW5j dGlvbiB0cnVfdGFnc190YWdfcGFyYW1ldGVyKCkKewoJcmV0dXJuIHN0cmlwX3RhZ3MoZ3Bz KCd0JykpOwp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3Nfc2VhcmNoX3BhcmFtZXRlcigpCnsKCXJl dHVybiBzdHJpcF90YWdzKGdwcygncScpKTsKfQoKZnVuY3Rpb24gdHJ1X3RhZ3NfZmllbGQo KSB7CglyZXR1cm4gJ0tleXdvcmRzJzsKfQoKCgoiO3M6MzoibWQ1IjtzOjMyOiIyNzEwYzRk NmRkMGMyZTBiNzE5NjRlODc1MTRiZGY1OSI7fQ==