# tru_tags v1.8 # Tagging support # Nathan Arthur # http://www.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: # ...................................................................... YTo5OntzOjc6InZlcnNpb24iO3M6MzoiMS44IjtzOjY6ImF1dGhvciI7czoxMzoiTmF0aGFu IEFydGh1ciI7czoxMDoiYXV0aG9yX3VyaSI7czoyMjoiaHR0cDovL3d3dy50cnVpc3QuY29t LyI7czoxMToiZGVzY3JpcHRpb24iO3M6MTU6IlRhZ2dpbmcgc3VwcG9ydCI7czo0OiJ0eXBl IjtpOjA7czo0OiJuYW1lIjtzOjg6InRydV90YWdzIjtzOjQ6ImhlbHAiO3M6MjMyODA6IgoJ PHA+VG8gbGVhcm4gbW9yZSBhYm91dCB0cnVfdGFncywgY2hlY2sgb3V0IHRoZSA8YSBocmVm PSIvYmxvZy80OTMvdHJ1dGFncy1hLXRhZ2dpbmctcGx1Z2luLWZvci10ZXh0cGF0dGVybiI+ aW50cm9kdWN0b3J5IGFydGljbGU8L2E+IGFuZCA8YSBocmVmPSJodHRwOi8vd3d3LnRydWlz dC5jb20vcmVmZXJlbmNlLzQ5NS90cnV0YWdzLWZlYXR1cmUtbGlzdCI+ZmVhdHVyZSBsaXN0 PC9hPi48L3A+Cgk8aDM+SW5zdGFsbGF0aW9uPC9oMz4KCTxvbD4KCQk8bGk+PGEgaHJlZj0i L3N0YXNoL3RydV90YWdzLTEuOC50eHQiPkNsaWNrIGhlcmU8L2E+IHRvIHZpZXcgdGhlIHBs dWdpbi4gIERvbiYjODIxNzt0IHNhdmUgaXQgJiM4MjExOyBqdXN0IG9wZW4gaXQgaW4geW91 ciBicm93c2VyLjwvbGk+CgkJPGxpPlNjcm9sbCBkb3duIGEgc2xpZ2h0IGJpdCBhbmQgZm9s bG93IHRoZSBvbi1wYWdlIGluc3RydWN0aW9uczogY29weS9wYXN0ZSB0aGUgYmlnIHNxdWFy ZSBibG9jayBvZiBjaGFyYWN0ZXJzIGludG8geW91ciBUZXh0cGF0dGVybiBpbnN0YWxsLCB1 bmRlciBhZG1pbiAtPiBwbHVnaW5zLjwvbGk+CgkJPGxpPkhpdCAmIzgyMjA7VXBsb2FkJiM4 MjIxOy48L2xpPgoJCTxsaT48c3Ryb25nPlJlbWVtYmVyIHRvIHN3aXRjaCB0aGUgcGx1Z2lu IHRvICYjODIyMDtBY3RpdmUmIzgyMjE7IGluIHRoZSBwbHVnaW4gbGlzdC48L3N0cm9uZz48 L2xpPgoJCTxsaT5Zb3UgY2FuIGZpbmQgaGVscCB0ZXh0IGZvciB0aGUgcGx1Z2luIGJ5IGNs aWNraW5nIHRoZSAmIzgyMjA7aGVscCYjODIyMTsgbGluayBpbiB0aGUgcGx1Z2luIGxpc3Qu PC9saT4KCTwvb2w+Cgk8aDM+Q29uZmlndXJhdGlvbjwvaDM+Cgk8aDQ+U3RlcCAxOiBDcmVh dGUgYSBuZXcgc2VjdGlvbjwvaDQ+Cgk8cD50cnVfdGFncyBkZXBlbmRzIG9uIHRoZSBleGlz dGVuY2Ugb2YgYSBzcGVjaWFsIFRleHRwYXR0ZXJuIHNlY3Rpb24gbmFtZWQgJiM4MjIwO3Rh ZywmIzgyMjE7IGJ5IGRlZmF1bHQ8c3VwPjxhIGhyZWY9IiNmbjE5MzQ4MTM3NDM0NGI4NTE2 Yjk0MTcyIj4xPC9hPjwvc3VwPi4gIENyZWF0ZSB0aGF0IHNlY3Rpb24sIHVzaW5nIHdoYXRl dmVyIHNldHRpbmdzIHlvdSBsaWtlLiAgKFlvdSB3b24mIzgyMTc7dCBiZSBwdWJsaXNoaW5n IGFydGljbGVzIHRvIHRoYXQgc2VjdGlvbi4pICBIZXJlJiM4MjE3O3Mgd2hhdCBJIHVzZTxz dXA+PGEgaHJlZj0iI2ZuMTIwNzE5MDQyMDQ0Yjg1MTZiOThmODQiPjI8L2E+PC9zdXA+Ojwv cD4KCTxwPjxpbWcgc3JjPSJodHRwOi8vd3d3LnRydWlzdC5jb20vaW1hZ2VzLzIucG5nIiBo ZWlnaHQ9IjI4MCIgd2lkdGg9IjM5OCIgYWx0PSJ0YWcgc2VjdGlvbiBjb25maWd1cmF0aW9u IiBjbGFzcz0iZGlhZ3JhbSIgLz48L3A+Cgk8cCBjbGFzcz0iZm9vdG5vdGUiIGlkPSJmbjE5 MzQ4MTM3NDM0NGI4NTE2Yjk0MTcyIj48c3VwPjE8L3N1cD4gWW91IGNhbiB1c2UgYSBkaWZm ZXJlbnQgbmFtZSwgYnV0IHlvdSBoYXZlIHRvIHVzZSBhIHNwZWNpYWwgYXR0cmlidXRlIGlu IHNvbWUgb2YgdGhlIHBsdWdpbiBjYWxscyB0byBtYWtlICBldmVyeXRoaW5nIHdvcmsgY29y cmVjdGx5LiAgU2VlIGJlbG93IGZvciBkZXRhaWxzLjwvcD4KCTxwIGNsYXNzPSJmb290bm90 ZSIgaWQ9ImZuMTIwNzE5MDQyMDQ0Yjg1MTZiOThmODQiPjxzdXA+Mjwvc3VwPiBOb3RlIHRo YXQgSSB1c2UgdGhlICYjODIxNjtkZWZhdWx0JiM4MjE3OyBwYWdlICYjODIxMTsgdGhhdCBj aG9pY2UgbWF5IG5vdCBiZSByaWdodCBmb3IgeW91LiAgVGhpcyBzZWN0aW9uIHdpbGwgYmUg c2hvd24gd2hlbmV2ZXIgeW91IGNsaWNrIG9uIGEgdGFnLCB0byBkaXNwbGF5IHRoZSB0YWcg c2VhcmNoIHJlc3VsdHMuICBZb3UmIzgyMTc7bGwgd2FudCBhIHBhZ2UgdGhhdCBoYXMgdGhl IGNvcnJlY3QgbGF5b3V0L2hlYWRlcnMvZm9vdGVycy4gIEkgdXNlIG15IGRlZmF1bHQgcGFn ZSwgd2l0aCA8Y29kZT4mbHQ7dHhwOmlmX3NlY3Rpb24gbmFtZT0idGFnIiZndDs8L2NvZGU+ IHRvIGNoYW5nZSB0aGUgcGFnZSBkaXNwbGF5IGluIHRoaXMgY2FzZS48L3A+Cgk8aDQ+U3Rl cCAyOiBDYWxsIHRoZSBwbHVnaW4gZnJvbSB0aGF0IHNlY3Rpb248L2g0PgoJPHA+VG8gbWFr ZSB0YWcgc2VhcmNoaW5nIGFuZCB0aGUgZGVmYXVsdCB0YWcgY2xvdWQgd29yaywgeW91JiM4 MjE3O2xsIG5lZWQgdG8gY2FsbCA8Y29kZT4mbHQ7dHhwOnRydV90YWdzX2hhbmRsZXIgLyZn dDs8L2NvZGU+IGZyb20gdGhlIHBhZ2UgeW91IGNob3NlIGluIFN0ZXAgMS4gIEkgcmVwbGFj ZWQgdGhlIGRlZmF1bHQgPGNvZGU+Jmx0O3R4cDphcnRpY2xlIC8mZ3Q7PC9jb2RlPiB3aXRo IHNvbWV0aGluZyBsaWtlIHRoaXM6PC9wPgo8cHJlPiZsdDt0eHA6aWZfc2VjdGlvbiBuYW1l PSJ0YWciJmd0OwogICZsdDt0eHA6dHJ1X3RhZ3NfaGFuZGxlciAvJmd0OwombHQ7dHhwOmVs c2UgLyZndDsKICAmbHQ7dHhwOmFydGljbGUgLyZndDsKJmx0Oy90eHA6aWZfc2VjdGlvbiZn dDs8L3ByZT4KCTxoND5TdGVwIDM6IENvbmZpZ3VyZSB5b3VyIGFydGljbGUgZm9ybSB0byBk aXNwbGF5IHRhZ3M8L2g0PgoJPHA+VG8gbWFrZSBlYWNoIGFydGljbGUgc2hvdyBhIGxpc3Qg b2YgYWxsIHRoZSB0YWdzIGFzc29jaWF0ZWQgd2l0aCBpdCwgcHV0IHNvbWV0aW5nIGxpa2Ug dGhpcyBpbiB5b3VyIGFydGljbGUgZm9ybTo8L3A+CjxwcmU+Jmx0O3R4cDp0cnVfdGFnc19p Zl9oYXNfdGFncyZndDsKICB0YWdzOiAmbHQ7dHhwOnRydV90YWdzX2Zyb21fYXJ0aWNsZSAv Jmd0OwombHQ7L3R4cDp0cnVfdGFnc19pZl9oYXNfdGFncyZndDs8L3ByZT4KCTxoND5TdGVw IDQ6IERyb3AgYSBjdXN0b20gdGFnIGNsb3VkIHNvbWV3aGVyZSwgaWYgeW91IHdhbnQ8L2g0 PgoJPHA+SWYgeW91JiM4MjE3O2QgbGlrZSB0byBzaG93IGEgdGFnIGNsb3VkIHNvbWV3aGVy ZSBvbiB5b3VyIHNpdGUgKG90aGVyIHRoYW4gPGNvZGU+L3RhZy88L2NvZGU+KSwgcHV0IHNv bWV0aGluZyBsaWtlIHRoaXMgaW4gdGhhdCBwYWdlOjwvcD4KPHByZT4mbHQ7dHhwOnRydV90 YWdzX2Nsb3VkIC8mZ3Q7PC9wcmU+Cgk8cD5TZWUgYmVsb3cgZm9yIGxvdHMgb2YgZm9ybWF0 dGluZyBvcHRpb25zLCBpbmNsdWRpbmcgdGhlIGFiaWxpdHkgdG8gb3V0cHV0IGEgc2ltcGxl IGxpc3QgaW5zdGVhZCBvZiBhIGNsb3VkICh1c2luZyA8Y29kZT50cnVfdGFnc19saXN0PC9j b2RlPikuPC9wPgoJPGg0PlN0ZXAgNTogU3RhcnQgdGFnZ2luZyE8L2g0PgoJPHA+V2hlbmV2 ZXIgeW91IHdyaXRlIGFuIGFydGljbGUsIHB1dCB5b3VyIHRhZ3MgaW50byB0aGUgS2V5d29y ZHMgZmllbGQgaW4gVGV4dHBhdHRlcm4uICAoVGhlIEtleXdvcmRzIGZpZWxkIGhpZGVzIGJl aGluZCB0aGUgJiM4MjIwO0FkdmFuY2VkIE9wdGlvbnMmIzgyMjE7IGxpbmsgb24gdGhlIGxl ZnQgc2lkZSBvZiB0aGUgJiM4MjIwO3dyaXRlJiM4MjIxOyBwYWdlLikgIFRhZ3Mgc2hvdWxk IGJlIHNlcGFyYXRlZCBieSBjb21tYXMsIGFuZCBjYW4gaGF2ZSBzcGFjZXM8c3VwPjxhIGhy ZWY9IiNmbjE5MzQ4MTM3NDM0NGI4NTE2Yjk0MTcyIj4xPC9hPjwvc3VwPi48L3A+Cgk8cD5Z b3UmIzgyMTc7bGwgcHJvYmFibHkgd2FudCB0byBpbnN0YWxsIFJvYiBTYWJsZSYjODIxNztz IDxhIGhyZWY9Imh0dHA6Ly93d3cud2lsc2hpcmVvbmUuY29tL3RleHRwYXR0ZXJuLXBsdWdp bnMvcnNzLWFkbWluLXNob3ctYWR2LW9wdHMiPnJzc19hZG1pbl9zaG93X2Fkdl9vcHRzPC9h Piwgd2hpY2ggd2lsbCBhdXRvbWF0aWNhbGx5IGV4cGFuZCB0aGUgJiM4MjIwO0FkdmFuY2Vk IE9wdGlvbnMmIzgyMjE7IHNlY3Rpb24gb2YgdGhlICYjODIyMDt3cml0ZSYjODIyMTsgcGFn ZSwgd2hlbiB5b3UgYXJlIHdyaXRpbmcgYXJ0aWNsZXMuICBUaGF0IGdpdmVzIHlvdSBlYXN5 IGFjY2VzcyB0byB0aGUgS2V5d29yZHMgZmllbGQuPC9wPgoJPHAgY2xhc3M9ImZvb3Rub3Rl IiBpZD0iZm4xOTM0ODEzNzQzNDRiODUxNmI5NDE3MiI+PHN1cD4xPC9zdXA+IFRhZ3Mgd2l0 aCBzcGFjZXMgd2lsbCBnZW5lcmF0ZSB1cmxzIHdpdGggZGFzaGVzLCB3aGljaCB3aWxsIHdv cmsgY29ycmVjdGx5LiAgVGFncyB3aXRoIGRhc2hlcyB3aWxsIGFsc28gd29yayBjb3JyZWN0 bHkuPC9wPgoJPGg0PlN0ZXAgNjogRmFuY3kgZGlzcGxheSBjdXN0b21pemF0aW9uIChPcHRp b25hbCk8L2g0PgoJPHA+WW91IGNhbiB1c2UgPGNvZGU+dHJ1X3RhZ3NfaWZfdGFnX3NlYXJj aDwvY29kZT4sIDxjb2RlPnRydV90YWdzX3RhZ19wYXJhbWV0ZXI8L2NvZGU+LCBhbmQgPGNv ZGU+dHJ1X3RhZ3Nfc2VhcmNoX3BhcmFtZXRlcjwvY29kZT4gdG8gY3VzdG9taXplIHlvdXIg cGFnZSB0aXRsZXMgb3IgdGFnIHNlYXJjaCByZXN1bHRzLiAgU2VlIGJlbG93IGZvciBkZXRh aWxzLiAgRm9yIGFuIGV4YW1wbGUsIGRvIGEgdGFnIHNlYXJjaCBvbiB0aGlzIHNpdGUgYW5k IGxvb2sgYXQgdGhlIHRpdGxlYmFyLjwvcD4KCTxoND5TdGVwIDc6IFR1cm4gb24gY2xlYW4g dXJscyAoT3B0aW9uYWwpPC9oND4KCTxwPkNsZWFuIHVybHMgYXJlIG5vdyBwb3NzaWJsZSB3 aXRoIHRydV90YWdzLCBwcm92aWRlZCB0aGF0IHlvdSBhcmUgd2lsbGluZyB0byBtb2RpZnkg VGV4dHBhdHRlcm4mIzgyMTc7cyByZXdyaXRlIHJ1bGVzIChpbiB0aGUgLmh0YWNjZXNzIGZp bGUpLiAgQnV0IGJlIHdhcm5lZCAmIzgyMTE7IHJld3JpdGUgcnVsZXMgYXJlIGNvbXBsZXgu ICBJIG1ha2Ugbm8gZ3VhcmFudGVlcyB0aGF0IHRoaXMgd29uJiM4MjE3O3QgZWF0IHlvdXIg Y2hpbGRyZW4uICA8c3Ryb25nPllvdSBkb24mIzgyMTc7dCBoYXZlIHRvIGRvIHRoaXM8L3N0 cm9uZz4gYnV0IGEgbG90IG9mIHBlb3BsZSB3YW50IGl0LiAgVGhpcyBzaXRlIHVzZXMgaXQs IGlmIHRoYXQgaGVscHMuPC9wPgoJPHA+VGhlc2UgaW5zdHJ1Y3Rpb25zIGFyZSBmb3IgYXBh Y2hlIDIuMCBvbiB1bml4L2xpbnV4IHdpdGggdGV4dHBhdHRlcm4gaW5zdGFsbGVkIGF0IHRo ZSByb290IG9mIHlvdXIgc2l0ZS4gIFNlZSA8YSBocmVmPSJodHRwOi8vZm9ydW0udGV4dHBh dHRlcm4uY29tL3ZpZXd0b3BpYy5waHA/cGlkPTEwMzgyMyNwMTAzODIzIj50aGlzIGZvcnVt IHBvc3Q8L2E+IGZvciBkZXRhaWxzIG9uIGNsZWFuIHVybHMgd2l0aCBsaWdodHRwZC4gIEFs bCBvdGhlciBwbGF0Zm9ybXMvc2VydmVycy9jb25maWd1cmF0aW9ucyBhcmUgdW50ZXN0ZWQg KGJ5IG1lKS48L3A+Cgk8cD5IZXJlJiM4MjE3O3Mgd2hhdCB0byBkbzo8L3A+Cgk8b2w+CgkJ PGxpPkFkZCB0aGUgZm9sbG93aW5nIGxpbmVzIHRvIFRleHRwYXR0ZXJuJiM4MjE3O3MgLmh0 YWNjZXNzIGZpbGUgKGZvdW5kIGluIHRoZSByb290IG9mIHlvdXIgVGV4dHBhdHRlcm4gZGly ZWN0b3J5KSwgYWRqdXN0aW5nIHRoZW0gaWYgbmVjZXNzYXJ5LiAgVGhlc2UgbGluZXMgc2hv dWxkIGJlIDxzdHJvbmc+YWZ0ZXI8L3N0cm9uZz4gdGhlPC9saT4KCTwvb2w+Cgk8cD48ZGl2 IGNsYXNzPSJwcmUiPjwvcD4KCTxwPlJld3JpdGVSdWxlICYjOTQ7KC4mIzQzOykgJiM0NTsg W1BULExdPC9wPgoJPHA+PC9kaXY+PC9wPgoJPHA+YW5kIDxzdHJvbmc+YmVmb3JlPC9zdHJv bmc+IHRoZTwvcD4KCTxwPjxkaXYgY2xhc3M9InByZSI+PC9wPgoJPHA+UmV3cml0ZVJ1bGUg JiM5NDsoLiYjNDI7KSBpbmRleC5waHA8L3A+Cgk8cD48L2Rpdj48L3A+Cgk8cD5IZXJlJiM4 MjE3O3MgdGhlIGJpdCB0byBpbnNlcnQgKHdoaWNoIHlvdSBtYXkgbmVlZCB0byBjdXN0b21p emUgZm9yIHlvdXIgc2l0ZSk6PC9wPgoJPHA+PGRpdiBjbGFzcz0icHJlIj48L3A+Cgk8cD4j VGhpcyBwYXRoIHNob3VsZCBtYXRjaCB0aGUgcmVsYXRpdmUgdXJsIG9mIHlvdXIgVGV4dHBh dHRlcm4gaW5zdGFsbDxiciAvPgpSZXdyaXRlQmFzZSAvPGJyIC8+CiNJZiB5b3UncmUgdXNp bmcgYSBzZWN0aW9uIG90aGVyIHRoYW4gJiMzNDt0YWcmIzM0OywgY2hhbmdlIHRoZSBmb2xs b3dpbmcgdHdvIHJ1bGVzIGFjY29yZGluZ2x5PGJyIC8+ClJld3JpdGVSdWxlICYjOTQ7dGFn LyhbJiM5NDsvXSYjNDM7KSQgdGFnLyQxLyBbUixMXTxiciAvPgpSZXdyaXRlUnVsZSAmIzk0 O3RhZy8oLiYjNDM7KS8kICYjNjM7cyYjNjE7dGFnJmFtcDt0JiM2MTskMTwvcD4KCTxwPjwv ZGl2PjwvcD4KCTxvbD4KCQk8bGk+PHN0cm9uZz5DaGVjayB0byBtYWtlIHN1cmUgeW91ciBz aXRlIGlzIHN0aWxsIHdvcmtpbmcuPC9zdHJvbmc+PC9saT4KCQk8bGk+RWRpdCB0aGUgdHJ1 X3RhZ3MgcGx1Z2luIChhZG1pbiAtPiBwbHVnaW5zLCBjbGljayAmIzgyMTY7RWRpdCYjODIx NzspIGFuZCBjaGFuZ2UgdGhlIDxjb2RlPnRydV90YWdzX3VzZV9jbGVhbl91cmxzKCk8L2Nv ZGU+IGZ1bmN0aW9uIHRvIHJldHVybiA8Y29kZT4xPC9jb2RlPi4gIChJdCYjODIxNztzIHRo ZSBmaXJzdCBmdW5jdGlvbi4pPC9saT4KCQk8bGk+Q2xlYW4gdXJscyBzaG91bGQgYmUgd29y a2luZyBub3cuICBUcnkgY2xpY2tpbmcgYSB0YWcgbGluayB0byBzZWUgd2hhdCB1cmwgaXQg cmVmZXJlbmNlcy48L2xpPgoJCTxsaT5CeSBkZWZhdWx0LCBhcnRpY2xlIHRhZ3Mgd2lsbCBz ZXQgdGhlIDxjb2RlPnJlbD0idGFnIjwvY29kZT4gYXR0cmlidXRlLCBhbmQgdGhlIHRhZyBj bG91ZCAob3IgbGlzdCkgd29uJiM4MjE3O3QuICBUaGlzIGNhbiBiZSBjb250cm9sbGVkIHdp dGggdGhlIDxjb2RlPnVzZXJlbHRhZzwvY29kZT4gYXR0cmlidXRlOyBzZWUgYmVsb3cgZm9y IGRldGFpbHMuPC9saT4KCTwvb2w+Cgk8aDQ+U3RlcCA4OiBTaG93IGEgJiM4MjIwO3JlbGF0 ZWQgdGFncyYjODIyMTsgY2xvdWQgKE9wdGlvbmFsKTwvaDQ+Cgk8cD52MS44IChhbmQgYmV5 b25kKSBvZiB0cnVfdGFncyBoYXMgYSBmZWF0dXJlIHRoYXQgbGV0cyB5b3Ugc2hvdyBhIGNs b3VkIG9mIHRhZ3MgdGhhdCBhcmUgcmVsYXRlZCB0byB0aGUgdGFncyB1c2VkIGluIGFydGlj bGVzIHRoYXQgYXJlIGZvdW5kIGJ5IGEgdGFnIHNlYXJjaC48L3A+Cgk8cD5Hb3QgdGhhdD88 L3A+Cgk8cD5UbyBzZWUgYW4gZXhhbXBsZSwgZG8gYSB0YWcgc2VhcmNoIG9uIHRoaXMgc2l0 ZSAoY2xpY2sgYSBsaW5rIGluIHRoZSB0YWcgY2xvdWQpLiAgV2hlbiB0aGUgc2VhcmNoIHJl c3VsdHMgY29tZSB1cCB0aGUgc2lkZWJhciB3aWxsIGhhdmUgYSBuZXcgc2VjdGlvbiBpbiBp dCBjYWxsZWQgJiM4MjIwO1JlbGF0ZWQgVGFncyYjODIyMTsuICBUaGUgY2xvdWQgaW4gdGhh dCBzZWN0aW9uIGNvbnRhaW5zIGFsbCB0aGUgdGFncyB1c2VkIGJ5IGFsbCB0aGUgYXJ0aWNs ZXMgaW4gdGhlIHNlYXJjaCByZXN1bHQuICBJdCYjODIxNztzIGEgd2F5IHRvIHNheSAmIzgy MjA7dGhlc2Ugb3RoZXIgdGFncyBtYXkgYmUgc2ltaWxhciB0byB0aGUgdGFnIHlvdSBqdXN0 IHNlYXJjaGVkJiM4MjIxOy48L3A+Cgk8cD48c3Ryb25nPkJlZm9yZSB5b3UgdXNlIHRoaXMg b24geW91ciBzaXRlLCBob3dldmVyLDwvc3Ryb25nPiB5b3Ugc2hvdWxkIHJlYWQgdGhlIGRl dGFpbGVkIGluc3RydWN0aW9ucyBjYXJlZnVsbHkuICBUaGlzIHRhZyBjYW4gaGF2ZSBzaWdu aWZpY2FudCBwZXJmb3JtYW5jZSBpbXBsaWNhdGlvbnMgZm9yIHlvdXIgc2l0ZSwgd2hpY2gg eW91ciBob3N0aW5nIHByb3ZpZGVyIG1pZ2h0IG5vdCBiZSB2ZXJ5IGhhcHB5IGFib3V0Ljwv cD4KCTxwPlRvIHVzZSBpdCBhbnl3YXksIHB1dCBzb21ldGhpbmcgbGlrZSB0aGlzIGludG8g dGhlIGFwcHJvcHJpYXRlIHBhZ2U6PC9wPgo8cHJlPiZsdDt0eHA6dHJ1X3RhZ3NfaWZfdGFn X3NlYXJjaCZndDsKJmx0O3R4cDp0cnVfdGFnc19yZWxhdGVkX3RhZ3NfZnJvbV9zZWFyY2gg c2VjdGlvbj0iYmxvZyxyZWZlcmVuY2UiIHVzZW92ZXJhbGxjb3VudHM9IjEiIC8mZ3Q7CiZs dDsvdHhwOnRydV90YWdzX2lmX3RhZ19zZWFyY2gmZ3Q7PC9wcmU+Cgk8cD5JZiB5b3UgdXNl IHRoZSA8Y29kZT5zZWN0aW9uPC9jb2RlPiBhdHRyaWJ1dGUgaW4geW91ciBtYWluIHRhZyBj bG91ZCB5b3Ugc2hvdWxkIGFsc28gdXNlIGl0IGhlcmUuICBTZWUgdGhlIGRvY3VtZW50YXRp b24gYmVsb3cgZm9yIGFuIGV4cGxhbmF0aW9uIG9mIHdoeS48L3A+Cgk8cD5UaGUgPGNvZGU+ dXNlcm92ZXJhbGxjb3VudHM8L2NvZGU+IGF0dHJpYnV0ZSBjYXVzZXMgdGhlIGNsb3VkIHRv IHNpemUgdGhlIGxpbmtzIGFjY29yZGluZyB0byBob3cgbGFyZ2UgdGhleSB3b3VsZCBiZSBp biB0aGUgbWFpbiBjbG91ZC4gIFRoYXQmIzgyMTc7cyBwcm9iYWJseSB3aGF0IHlvdSB3YW50 LCBidXQgaXQgY2F1c2VzIGV2ZW4gbW9yZSBwZXJmb3JtYW5jZSBzbG93ZG93bi4gIFNlZSB0 aGUgZG9jdW1lbnRhdGlvbiBiZWxvdyBmb3IgYWxsIHRoZSBkZXRhaWxzLjwvcD4KCTxoMz5U YWcgcmVmZXJlbmNlPC9oMz4KCTxoND48Y29kZT50cnVfdGFnc19oYW5kbGVyPC9jb2RlPjwv aDQ+Cgk8cD5UaGlzIGlzIHRoZSBtYWluIGZ1bmN0aW9uIHRoYXQgZHJpdmVzIHRhZyBzZWFy Y2ggYW5kIHNob3dzIHRoZSBnZW5lcmljIHRhZyBjbG91ZC4gIEl0IHNob3VsZCBiZSBjYWxs ZWQgZnJvbSB0aGUgcGFnZSB0aGF0IGlzIHVzZWQgaW4gdGhlICYjODIxNjt0YWcmIzgyMTc7 IHNlY3Rpb24uICBJdCBnZW5lcmFsbHkgY2FsbHMgPGNvZGU+ZG9BcnRpY2xlcygpPC9jb2Rl PiAoaW4gdGhlIFRleHRwYXR0ZXJuIGNvZGUpIHRvIGRpc3BsYXkgdGFnIHNlYXJjaCByZXN1 bHRzLCBidXQgaWYgbm8gdGFnIHdhcyBwYXNzZWQgaW4gdGhlIHVybCBpdCB3aWxsIGNhbGwg PGNvZGU+dHJ1X3RhZ3NfY2xvdWQ8L2NvZGU+IGluc3RlYWQuPC9wPgoJPHA+VGhpcyB0YWcg YWNjZXB0cyBtb3N0IG9mIHRoZSBzdGFuZGFyZCA8Y29kZT50eHA6YXJ0aWNsZTwvY29kZT4g YXR0cmlidXRlcywgd2hpY2ggd2lsbCBiZSBhcHBsaWVkIGR1cmluZyB0aGUgdGFnIHNlYXJj aC4gIE5vdGUgdGhhdCA8Y29kZT50cnVfdGFnc19oYW5kbGVyPC9jb2RlPiA8c3Ryb25nPmRv ZXMgbm90PC9zdHJvbmc+IHN1cHBvcnQgdXNpbmcgbXVsdGlwbGUgc2VjdGlvbnMgd2l0aCB0 aGUgPGNvZGU+c2VjdGlvbjwvY29kZT4gYXR0cmlidXRlLCB3aGVuIGRvaW5nIGEgdGFnIHNl YXJjaC4gIElmIG11bHRpcGxlIHNlY3Rpb25zIGFyZSBwYXNzZWQsIG5vbmUgYXJlIHVzZWQu PC9wPgoJPHA+PHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiBJbiBUZXh0cGF0dGVybiwgdGhlIDxj b2RlPmxpbWl0PC9jb2RlPiBhdHRyaWJ1dGUgaXMgZGVmYXVsdGVkIHRvIDxjb2RlPjEwPC9j b2RlPiwgdG8gbGltaXQgdGhlIG91dHB1dCB0byAxMCBhcnRpY2xlcyBwZXIgcGFnZSwgYW5k IHRoZSA8Y29kZT50eHA6b2xkZXI8L2NvZGU+IGFuZCA8Y29kZT50eHA6bmV3ZXI8L2NvZGU+ IHRhZ3MgYXJlIHVzZWQgdG8gcGFnaW5hdGUgdGhlIGZ1bGwgbGlzdC4gIFRoZSA8Y29kZT50 eHA6b2xkZXI8L2NvZGU+IGFuZCA8Y29kZT50eHA6bmV3ZXI8L2NvZGU+IHRhZ3MgZG8gbm90 IHdvcmsgd2l0aCB0cnVfdGFncywgYnV0IHRoZSA8Y29kZT5saW1pdDwvY29kZT4gaXMgc3Rp bGwgdXNlZCBieSBUZXh0cGF0dGVybiB3aGVuIGl0IG91dHB1dHMgdGhlIGFydGljbGVzLiAg VGhlcmVmb3JlLCB0cnVfdGFncyB1c2VzIGEgZGVmYXVsdCBsaW1pdCBvZiA8Y29kZT4xMDAw PC9jb2RlPiB3aGVuIGRvaW5nIGFuIGFydGljbGUgc2VhcmNoLiAgWW91IGNhbiBvdmVycmlk ZSB0aGlzIGxpbWl0IGJ5IHNldHRpbmcgdGhlIDxjb2RlPmxpbWl0PC9jb2RlPiBhdHRyaWJ1 dGUgb24gPGNvZGU+dHJ1X3RhZ3NfaGFuZGxlcjwvY29kZT4uPC9wPgoJPHA+VGhpcyB0YWcg d2lsbCBhbHNvIGFjY2VwdCBhbGwgb2YgdGhlIGF0dHJpYnV0ZXMgdXNlZCBieSA8Y29kZT50 cnVfdGFnX2Nsb3VkPC9jb2RlPi4gIFNlZSBiZWxvdyBmb3IgZGV0YWlscy48L3A+Cgk8aDQ+ PGNvZGU+dHJ1X3RhZ3NfaWZfaGFzX3RhZ3M8L2NvZGU+PC9oND4KCTxwPlRoaXMgY29uZGl0 aW9uYWwgdGFnIGNhbiBiZSB1c2VkIGluIGFuIGFydGljbGUgZm9ybSwgYW5kIHdpbGwgZXZh bHVhdGUgaXRzIGNvbnRlbnRzIChlLmcuICYjODIyMDtyZXR1cm4gdHJ1ZSYjODIyMTspIGlm IHRoZSBjdXJyZW50IGFydGljbGUgaGFzIHRhZ3MuPC9wPgoJPGg0Pjxjb2RlPnRydV90YWdz X2Zyb21fYXJ0aWNsZTwvY29kZT48L2g0PgoJPHA+VGhpcyB0YWcgY2FuIGJlIHVzZWQgaW4g YW4gYXJ0aWNsZSBmb3JtIHRvIHJldHVybiBhIGxpc3Qgb2YgdGFncyBhc3NvY2lhdGVkIHdp dGggdGhlIGN1cnJlbnQgYXJ0aWNsZS4gIFR5cGljYWxseSAoc2VlIGJlbG93KSwgZWFjaCB0 YWcgaW4gdGhlIGxpc3Qgd2lsbCBiZSBhIGxpbmsgKDxjb2RlPiZsdDthIGhyZWY9Li4uJmd0 OzwvY29kZT4pIHRvIHRoZSB0YWcgc2VhcmNoIHVybCBmb3IgdGhhdCBwYXJ0aWN1bGFyIHRh Zy48L3A+Cgk8cD5UaGlzIHRhZyBhY2NlcHRzIHRoZSBzdGFuZGFyZCA8Y29kZT53cmFwdGFn PC9jb2RlPiwgPGNvZGU+YnJlYWs8L2NvZGU+LCA8Y29kZT5jbGFzczwvY29kZT4sIGFuZCA8 Y29kZT5icmVha2NsYXNzPC9jb2RlPiBhdHRyaWJ1dGVzPHN1cD48YSBocmVmPSIjZm4xOTM0 ODEzNzQzNDRiODUxNmI5NDE3MiI+MTwvYT48L3N1cD4uPC9wPgoJPHA+SWYgeW91IGRvbiYj ODIxNzt0IHdhbnQgdG8gaGF2ZSB0aGUgdGFncyBiZSBsaW5rcywgeW91IGNhbiBzZXQgPGNv ZGU+Z2VuZXJhdGVsaW5rcz0iMCI8L2NvZGU+IHRvIHR1cm4gdGhlIGxpbmtzIG9mZi48L3A+ Cgk8cD5JZiB5b3UgbmFtZWQgeW91ciAmIzgyMTY7dGFnJiM4MjE3OyBzZWN0aW9uIHNvbWV0 aGluZyBvdGhlciB0aGFuICYjODIyMDt0YWcmIzgyMjE7LCBzZXQgPGNvZGU+dGFnc2VjdGlv bjwvY29kZT4gdG8gdGhlIG5hbWUgb2YgdGhhdCBzZWN0aW9uLiAgQnkgZGVmYXVsdCwgdGhp cyBpcyBzZXQgdG8gPGNvZGU+dGFnPC9jb2RlPi48L3A+Cgk8cD5JZiB5b3UgaGF2ZSBjbGVh biB1cmxzIHR1cm5lZCBvbiAoc2VlIGFib3ZlKSwgeW91IGNhbiB1c2UgdGhlIDxjb2RlPnVz ZXJlbHRhZ3M8L2NvZGU+IGF0dHJpYnV0ZSB0byBzcGVjaWZ5IHdoZXRoZXIgbGlua3MgaW4g dGhlIGxpc3Qgc2hvdWxkIGhhdmUgdGhlIDxhIGhyZWY9Imh0dHA6Ly9taWNyb2Zvcm1hdHMu b3JnL3dpa2kvcmVsdGFnIj48Y29kZT5yZWw9InRhZyI8L2NvZGU+PC9hPiAgKHVzZWQgYnkg PGEgaHJlZj0iaHR0cDovL3d3dy50ZWNobm9yYXRpLmNvbS8iPlRlY2hub3JhdGk8L2E+KSBh dHRyaWJ1dGUgc2V0LiAgTm90ZSB0aGF0IHRoaXMgd29uJiM4MjE3O3Qgd29yayBpZiB5b3Ug dHVybiBvZmYgbGlua3MuICBBbHNvIG5vdGUgdGhhdCB0YWdzIGRvbiYjODIxNzt0IHNob3cg dXAgaW4gdGhlIFJTUy9BdG9tIGZlZWRzLCB1bmxlc3MgeW91IDxhIGhyZWY9Imh0dHA6Ly9m b3J1bS50ZXh0cGF0dGVybi5jb20vdmlld3RvcGljLnBocD9waWQ9NDA5MDcjcDQwOTA3Ij5o YWNrIHRoZSB0ZXh0cGF0dGVybiBzb3VyY2U8L2E+LiAgVGhpcyBpcyBvbiBieSBkZWZhdWx0 LjwvcD4KCTxwPkFnYWluIGlmIHlvdSBoYXZlIGNsZWFuIHVybHMgdHVybmVkIG9uLCB5b3Ug Y2FuIHVzZSB0aGUgPGNvZGU+dXNlbm9mb2xsb3c8L2NvZGU+IGF0dHJpYnV0ZSB0byBzcGVj aWZ5IHdoZXRoZXIgbGlua3MgaW4gdGhlIGxpc3Qgc2hvdWxkIGhhdmUgdGhlIDxhIGhyZWY9 Imh0dHA6Ly9nb29nbGVibG9nLmJsb2dzcG90LmNvbS8yMDA1LzAxL3ByZXZlbnRpbmctY29t bWVudC1zcGFtLmh0bWwiPjxjb2RlPnJlbD0ibm9mb2xsb3ciPC9jb2RlPjwvYT4gYXR0cmli dXRlIHNldC4gIFRoaXMgaXMgb2ZmIGJ5IGRlZmF1bHQuPC9wPgoJPHA+QXMgb2YgdjEuOCwg eW91IGNhbiBzZXQgdGhlIDxjb2RlPnVzZW92ZXJhbGxjb3VudHM8L2NvZGU+IGF0dHJpYnV0 ZSB0byB0ZWxsIHRoZSB0YWcgbGlzdCB0byByZW5kZXIgYXMgYSBjbG91ZCAod2hlcmUgZWFj aCB0YWcgaXMgc2l6ZWQgYWNjb3JkaW5nIHRvIGl0cyBzaXRlLXdpZGUgZnJlcXVlbmN5KS4g IFRoaXMgdGFnIGlzbiYjODIxNzt0IHN1ZmZpY2llbnQgb24gaXRzIG93biwgaG93ZXZlcjsg b25jZSB5b3Ugc2V0IGl0IHlvdSBhbHNvIG5lZWQgdG8gc2V0IHRoZSByZW5kZXJpbmcgYXR0 cmlidXRlcyBsaWtlIDxjb2RlPm1heHBlcmNlbnQ9IjIwMCI8L2NvZGU+LCA8Y29kZT5zZXRz aXplcz0iMSI8L2NvZGU+LCBhbmQgPGNvZGU+c2V0Y2xhc3Nlcz0iMSI8L2NvZGU+IGJlY2F1 c2UgdGhlc2UgYXJlIGFsbCB0dXJuZWQgb2ZmIGJ5IGRlZmF1bHQuICBZb3UmIzgyMTc7bGwg YWxzbyB0aGVuIGJlIGFibGUgdG8gdXNlIGF0dHJpYnV0ZXMgbGlrZSA8Y29kZT5zaG93Y291 bnRzPC9jb2RlPiBhbmQgPGNvZGU+c29ydDwvY29kZT4uICBTZWUgdGhlIDxjb2RlPnRydV90 YWdzX2Nsb3VkPC9jb2RlPiBkb2N1bWVudGF0aW9uIGZvciBkZXRhaWxzIG9uIHRoZXNlIGF0 dHJpYnV0ZXMuPC9wPgoJPHA+PHN0cm9uZz5CZSBjYXJlZnVsLCBob3dldmVyLDwvc3Ryb25n PiBiZWZvcmUgdHVybmluZyB0aGlzIG9uLiAgVGhpcyBhdHRyaWJ1dGUgY2F1c2VzIDxjb2Rl PnRydV90YWdzPC9jb2RlPiB0byBkbyBhbiBleHRyYSBkYXRhYmFzZSBxdWVyeSBmb3IgZWFj aCBhcnRpY2xlIGRpc3BsYXllZCBvbiBhIHBhZ2UuICBUaGF0IGV4dHJhIHF1ZXJ5IGlzIGVx dWl2YWxlbnQgdG8gdGhlIHF1ZXJ5IHVzZWQgdG8gZ2VuZXJhdGUgdGhlIG92ZXJhbGwgY2xv dWQuICBZb3UgbWF5IHBheSBhIHBlcmZvcm1hbmNlIHBlbmFsdHkgZm9yIGFsbCB0aGUgZXh0 cmEgcXVlcmllcy48L3A+Cgk8cCBjbGFzcz0iZm9vdG5vdGUiIGlkPSJmbjE5MzQ4MTM3NDM0 NGI4NTE2Yjk0MTcyIj48c3VwPjE8L3N1cD4gQXMgd2l0aCBhbGwgVGV4dHBhdHRlcm4gdGFn cywgPGNvZGU+Y2xhc3M8L2NvZGU+IGlzIG9ubHkgdXNlZCBpZiB5b3Ugc3BlY2lmeSBhbiBh cHByb3ByaWF0ZSA8Y29kZT53cmFwdGFnPC9jb2RlPiBhbmQgPGNvZGU+YnJlYWtjbGFzczwv Y29kZT4gaXMgb25seSB1c2VkIGlmIHlvdSBzcGVjaWZ5IGFuIGFwcHJvcHJpYXRlIDxjb2Rl PmJyZWFrPC9jb2RlPi48L3A+Cgk8aDQ+PGNvZGU+dHJ1X3RhZ3NfY2xvdWQ8L2NvZGU+PC9o ND4KCTxoND48Y29kZT50cnVfdGFnc19saXN0PC9jb2RlPjwvaDQ+CjxwPjxjb2RlPnRydV90 YWdzX2Nsb3VkPC9jb2RlPiBjYW4gYmUgdXNlZCBvbiBhbnkgcGFnZSwgYW5kIGlzIGdlbmVy YWxseSB1c2VkIHRvIGdlbmVyYXRlIGEgc2ltcGxlIHRhZyBjbG91ZCBvZiBhbGwgdGhlIHRh Z3MgdXNlZCBvbiB5b3VyIHNpdGUuICBUaGUgY2xvdWQgaXMgcmVhbGx5IGp1c3QgYSBsaXN0 IG9mIGxpbmtzLCBtdWNoIGxpa2UgdGhhdCBnZW5lcmF0ZWQgYnkgPGNvZGU+dHJ1X3RhZ3Nf ZnJvbV9hcnRpY2xlPC9jb2RlPiwgYnV0IHdpdGggYSA8Y29kZT5zdHlsZTwvY29kZT4gYXR0 cmlidXRlIHNldCBvbiBlYWNoIGxpbmsgdG8gZ2l2ZSBpdCBhIGZvbnQgc2l6ZSByYW5naW5n IGZyb20gMTAwJSB0byAyMDAlLjwvcD4KPHA+PGNvZGU+dHJ1X3RhZ3NfbGlzdDwvY29kZT4g Y2FuIGJlIHVzZWQgb24gYW55IHBhZ2UsIGFuZCBpcyBnZW5lcmFsbHkgdXNlZCB0byBvdXRw dXQgYSBidWxsZXRlZCBsaXN0IG9mIGFsbCB0aGUgdGFncyB1c2VkIG9uIHlvdXIgc2l0ZS4g IEJ5IGRlZmF1bHQsIHRoZSB0YWdzIHdpbGwgYWxsIGhhdmUgYSBmb250LXNpemUgb2YgMTAw JS48L3A+Cgk8cD5UaGVzZSB0d28gdGFncyBkbyB0aGUgZXhhY3Qgc2FtZSB0aGluZyAmIzgy MTE7IDxjb2RlPnRydV90YWdzX2Nsb3VkPC9jb2RlPiBqdXN0IHByb3ZpZGVzIGRpZmZlcmVu dCBkZWZhdWx0cyB0byA8Y29kZT50cnVfdGFnc19saXN0PC9jb2RlPi48L3A+CjxwPjxjb2Rl PnRydV90YWdzX2Nsb3VkPC9jb2RlPiBhbmQgPGNvZGU+dHJ1X3RhZ3NfbGlzdDwvY29kZT4g Ym90aCBzZXQgdGhlIDxjb2RlPmNsYXNzPC9jb2RlPiBhdHRyaWJ1dGUgb2YgZWFjaCB0YWcs IHNwZWNpZnlpbmcgdHdvIGNsYXNzZXMuICBUaGUgZmlyc3QgY2xhc3MgZ3JvdXBzIHRoZSB0 YWdzIGludG8gY2F0ZWdvcmllcywgd2l0aCBjbGFzc2VzIG9mIDxjb2RlPnRhZ1NpemVTbWFs bGVzdDwvY29kZT4sIDxjb2RlPnRhZ1NpemVNZWRpdW08L2NvZGU+LCBhbmQgPGNvZGU+dGFn U2l6ZUxhcmdlc3Q8L2NvZGU+LiAgVXNpbmcgdGhlc2UsIHlvdSBjb3VsZCBtYWtlIHRoZSBz bWFsbGVzdCBhbmQgbGFyZ2VzdCB0YWdzIGhhdmUgZGlmZmVyZW50IHN0eWxlcyB0aGFuIGFs bCB0aGUgb3RoZXJzLjwvcD4KCTxwPlRoZSBzZWNvbmQgY2xhc3MgaW5kaWNhdGVzIHRoZSAm IzgyMjA7c3RlcCYjODIyMTsgb2YgdGhlIGN1cnJlbnQgdGFnLCB3aXRoIGNsYXNzZXMgb2Yg PGNvZGU+dGFnU2l6ZTE8L2NvZGU+LCA8Y29kZT50YWdTaXplMjwvY29kZT4sIGFuZCBzbyBv bi4gIFRoZXNlIGdpdmUgeW91IHByZWNpc2UgY29udHJvbCBvdmVyIGVhY2ggdGFnIHNpemUs IGlmIHlvdSB3YW50IGl0LjwvcD4KCTxwPklmIHlvdSB1c2UgdGhlc2UgY2xhc3NlcyB0byBj cmVhdGUgc3BlY2lhbCBDU1MgcnVsZXMsIHlvdSBtYXkgYWxzbyB3YW50IHRvIHNldCB0aGUg PGNvZGU+c2V0c2l6ZXM8L2NvZGU+IGF0dHJpYnV0ZSwgZGVzY3JpYmVkIGJlbG93LjwvcD4K CTxoNT5Cb3RoIHRhZ3MgYWNjZXB0IHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczo8L2g1PgoJ PHVsPgoJCTxsaT5UaGUgc3RhbmRhcmQgPGNvZGU+d3JhcHRhZzwvY29kZT4sIDxjb2RlPmJy ZWFrPC9jb2RlPiwgPGNvZGU+Y2xhc3M8L2NvZGU+LCBhbmQgPGNvZGU+YnJlYWtjbGFzczwv Y29kZT4gYXR0cmlidXRlcy4gIDxjb2RlPnRydV90YWdzX2Nsb3VkPC9jb2RlPiBoYXMgYSBk ZWZhdWx0IDxjb2RlPmJyZWFrPC9jb2RlPiBvZiBhIGNvbW1hLiAgPGNvZGU+dHJ1X3RhZ3Nf bGlzdDwvY29kZT4gaGFzIGEgZGVmYXVsdCA8Y29kZT53cmFwdGFnPC9jb2RlPiBvZiA8Y29k ZT51bDwvY29kZT4gYW5kIGEgZGVmYXVsdCA8Y29kZT5icmVhazwvY29kZT4gb2YgPGNvZGU+ bGk8L2NvZGU+LjwvbGk+CgkJPGxpPjxjb2RlPnRhZ3NlY3Rpb248L2NvZGU+LCB3aGljaCB0 ZWxscyB0cnVfdGFncyB0aGUgbmFtZSBvZiB5b3VyICYjODIxNjt0YWcmIzgyMTc7IHNlY3Rp b24uICBUaGlzIGNhbiBiZSB1c2VmdWwgaWYgeW91IGhhdmUgbmFtZWQgdGhlIHNlY3Rpb24g c29tZXRoaW5nIG90aGVyIHRoYW4gJiM4MjIwO3RhZyYjODIyMTsuICBCeSBkZWZhdWx0LCB0 aGlzIGlzIHNldCB0byA8Y29kZT50YWc8L2NvZGU+LjwvbGk+CgkJPGxpPjxjb2RlPnNlY3Rp b248L2NvZGU+LCB3aGljaCB0ZWxscyBpdCB0byBsaW1pdCB0aGUgbGlzdCB0byB0YWdzIGZy b20gdGhlIGdpdmVuIHNlY3Rpb24gb3Igc2VjdGlvbnMuICBGb3IgZXhhbXBsZSwgPGNvZGU+ Jmx0O3R4cDp0cnVfdGFnc19jbG91ZCBzZWN0aW9uPSJibG9nLHJlZmVyZW5jZSIgLyZndDs8 L2NvZGU+IHdvdWxkIG9ubHkgc2hvdyB0YWdzIGZyb20gdGhlICYjODIyMDtibG9nJiM4MjIx OyBhbmQgJiM4MjIwO3JlZmVyZW5jZSYjODIyMTsgc2VjdGlvbnMuICBCeSBkZWZhdWx0LCB0 aGlzIGlzIHNldCB0byBibGFuayAodG8gc2hvdyB0YWdzIGZyb20gYWxsIHNlY3Rpb25zKS4K CTx1bD4KCQk8bGk+PHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiBpZiB5b3UgdXNlIDxjb2RlPnNl Y3Rpb248L2NvZGU+IHRvIGxpbWl0IHRoZSBjbG91ZCB0byBhIHBhcnRpY3VsYXIgc2VjdGlv biwgaXQgd29uJiM4MjE3O3QgbGltaXQgdGhlIHRhZyBzZWFyY2ggZmVhdHVyZSB0byB0aGF0 IHNlY3Rpb24uICBUaGUgdGFnIHNlYXJjaCBmaW5kcyAodGFnZ2VkKSBhcnRpY2xlcyBmcm9t IGFsbCBzZWN0aW9ucywgbm8gbWF0dGVyIHdoYXQuICBUaGF0JiM4MjE3O3MgYSBzaWRlLWVm ZmVjdCBvZiB0aGUgdXNlIG9mIDxjb2RlPmRvQXJ0aWNsZXMoKTwvY29kZT4sIGFuZCBJIGRv biYjODIxNzt0IHRoaW5rIHRoZXJlJiM4MjE3O3MgYW55dGhpbmcgSSBjYW4gZG8gYWJvdXQg aXQuPC9saT4KCTwvdWw+PC9saT4KCQk8bGk+PGNvZGU+bWlucGVyY2VudDwvY29kZT4gYW5k IDxjb2RlPm1heHBlcmNlbnQ8L2NvZGU+LCB3aGljaCBjYW4gYmUgdXNlZCB0byBjb250cm9s IHRoZSB3ZWlnaHRlZCBmb250IHNpemVzIGluIHRoZSB0YWcgY2xvdWQvbGlzdC4gIDxjb2Rl PnRydV90YWdzX2Nsb3VkPC9jb2RlPiBkZWZhdWx0cyB0byA8Y29kZT4xMDA8L2NvZGU+IGFu ZCA8Y29kZT4yMDA8L2NvZGU+LCByZXNwZWN0aXZlbHksIGFuZCA8Y29kZT50cnVfdGFnc19s aXN0PC9jb2RlPiBkZWZhdWx0cyB0byA8Y29kZT4xMDA8L2NvZGU+IGFuZCA8Y29kZT4xMDA8 L2NvZGU+LjwvbGk+CgkJPGxpPjxjb2RlPnNob3djb3VudHM8L2NvZGU+LCB3aGljaCB3aWxs IGFwcGVuZCBhIG51bWJlciBpbmRpY2F0aW5nIHRoZSBudW1iZXIgb2YgdGltZXMgYSB0YWcg aGFzIGJlZW4gdXNlZCwgdG8gZWFjaCB0YWcgaW4gdGhlIGxpc3QuICBGb3IgZXhhbXBsZSwg eW91IG1pZ2h0IHNlZTogPHNwYW4gY2xhc3M9InByZSI+PGEgaHJlZj0iLz9zPXRhZyYjMzg7 dD1saWZlIj5saWZlPC9hPiBbM10sIDxhIGhyZWY9Ii8/cz10YWcmIzM4O3Q9dGVjaCI+dGVj aDwvYT4gWzVdPC9zcGFuPiBpbiBteSB0YWcgY2xvdWQsIGlmIHRoaXMgd2FzIHR1cm5lZCBv bi4gIFRoaXMgaXMgb2ZmIGJ5IGRlZmF1bHQuICBVc2UgPGNvZGU+MTwvY29kZT4gb3IgPGNv ZGU+dHJ1ZTwvY29kZT4gdG8gdHVybiBpdCBvbi4KCTx1bD4KCQk8bGk+VGhpcyBjYW4gYWxz byBiZSB1c2VkIHRvIHB1dCB0aGUgY291bnRzIGluIHRoZSA8Y29kZT50aXRsZTwvY29kZT4g YXR0cmlidXRlIG9mIHRoZSBsaW5rcywgd2hpY2ggd2lsbCBtYWtlIGl0IGFwcGVhciBpbiBh IHRvb2x0aXAuICBVc2UgPGNvZGU+c2hvd2NvdW50cz0idGl0bGUiPC9jb2RlPiBvciA8Y29k ZT5zaG93Y291bnRzPSJib3RoIjwvY29kZT4gKHRvIHNob3cgaXQgaW4gYm90aCBwbGFjZXMp IHRvIHR1cm4gaXQgb24uPC9saT4KCTwvdWw+PC9saT4KCQk8bGk+PGNvZGU+Y291bnR3cmFw Y2hhcnM8L2NvZGU+LCB3aGljaCBjb250cm9scyB0aGUgY2hhcmFjdGVycyB1c2VkIHRvIHNo b3cgdGhlIHRhZyBjb3VudCwgaWYgPGNvZGU+c2hvd2NvdW50czwvY29kZT4gaXMgdHVybmVk IG9uLiAgQnkgZGVmYXVsdCB0aGlzIGlzIDxjb2RlPltdPC9jb2RlPi4gIFRoZSBmaXJzdCBj aGFyYWN0ZXIgd2lsbCBiZSBwdXQgb24gdGhlIGxlZnQgc2lkZSBvZiB0aGUgbnVtYmVyLCBh bmQgdGhlIHNlY29uZCBjaGFyYWN0ZXIgd2lsbCBiZSBwdXQgb24gdGhlIHJpZ2h0LiAgRm9y IGV4YW1wbGUsIGEgPGNvZGU+Y291bnR3cmFwY2hhcnM8L2NvZGU+IG9mIDxjb2RlPigpPC9j b2RlPiB3b3VsZCBzaG93OiA8c3BhbiBjbGFzcz0icHJlIj48YSBocmVmPSIvP3M9dGFnJiMz ODt0PWxpZmUiPmxpZmU8L2E+ICgzKSwgPGEgaHJlZj0iLz9zPXRhZyYjMzg7dD10ZWNoIj50 ZWNoPC9hPiAoNSk8L3NwYW4+PC9saT4KCQk8bGk+SWYgeW91IGhhdmUgY2xlYW4gdXJscyB0 dXJuZWQgb24gKHNlZSBhYm92ZSksIHlvdSBjYW4gdXNlIHRoZSA8Y29kZT51c2VyZWx0YWdz PC9jb2RlPiBhdHRyaWJ1dGUgdG8gc3BlY2lmeSB3aGV0aGVyIGxpbmtzIGluIHRoZSBsaXN0 IHNob3VsZCBoYXZlIHRoZSA8YSBocmVmPSJodHRwOi8vbWljcm9mb3JtYXRzLm9yZy93aWtp L3JlbHRhZyI+PGNvZGU+cmVsPSJ0YWciPC9jb2RlPjwvYT4gICh1c2VkIGJ5IDxhIGhyZWY9 Imh0dHA6Ly93d3cudGVjaG5vcmF0aS5jb20vIj5UZWNobm9yYXRpPC9hPikgYXR0cmlidXRl IHNldC4gIFRoaXMgaXMgb2ZmIGJ5IGRlZmF1bHQuPC9saT4KCQk8bGk+QWdhaW4gaWYgeW91 IGhhdmUgY2xlYW4gdXJscyB0dXJuZWQgb24sIHlvdSBjYW4gdXNlIHRoZSA8Y29kZT51c2Vu b2ZvbGxvdzwvY29kZT4gYXR0cmlidXRlIHRvIHNwZWNpZnkgd2hldGhlciBsaW5rcyBpbiB0 aGUgbGlzdCBzaG91bGQgaGF2ZSB0aGUgPGEgaHJlZj0iaHR0cDovL2dvb2dsZWJsb2cuYmxv Z3Nwb3QuY29tLzIwMDUvMDEvcHJldmVudGluZy1jb21tZW50LXNwYW0uaHRtbCI+PGNvZGU+ cmVsPSJub2ZvbGxvdyI8L2NvZGU+PC9hPiBhdHRyaWJ1dGUgc2V0LiAgVGhpcyBpcyBvZmYg YnkgZGVmYXVsdC48L2xpPgoJCTxsaT5JZiB5b3UgZG9uJiM4MjE3O3Qgd2FudCB0aGUgdGFn cyB0byBiZSBsaW5rcywgeW91IGNhbiBzZXQgPGNvZGU+Z2VuZXJhdGVsaW5rcz0iMCI8L2Nv ZGU+IHRvIHR1cm4gdGhlbSBvZmYuPC9saT4KCQk8bGk+PGNvZGU+bWludGFnY291bnQ8L2Nv ZGU+IGFuZCA8Y29kZT5tYXh0YWdjb3VudDwvY29kZT4gY2FuIGJlIHVzZWQgdG8gaGlkZSB0 YWdzIHRoYXQgb25seSBoYXZlIGEgZmV3IGFydGljbGVzLCBvciB0aGF0IGhhdmUgdG9vIG1h bnkuICBUaGV5IGFyZSBkZWZhdWx0ZWQgdG8gPGNvZGU+MDwvY29kZT4gYW5kIDxjb2RlPjEw MDA8L2NvZGU+LCByZXNwZWN0aXZlbHkuICBGb3IgZXhhbXBsZSwgPGNvZGU+bWludGFnY291 bnQ9IjIiPC9jb2RlPiB3b3VsZCBoaWRlIGFueSB0YWdzIHRoYXQgd2VyZSBvbmx5IGFzc29j aWF0ZWQgd2l0aCBhIHNpbmdsZSBhcnRpY2xlLiAgSWYgeW91IGRvIHRoaXMsIHlvdSBtYXkg d2FudCB0byBhZGQgYSBsaW5rIHRvIHRoZSBkZWZhdWx0IHRhZyBjbG91ZCwgdXN1YWxseSBm b3VuZCBhdCA8Y29kZT4vdGFnLzwvY29kZT4uPC9saT4KCQk8bGk+SWYgeW91IHdhbnQgdG8g Y29udHJvbCB0aGUgc2l6ZShzKSBvZiB0aGUgdGFncyB5b3Vyc2VsZiAodGhyb3VnaCBDU1Mp LCBzZXQgPGNvZGU+c2V0c2l6ZXM9IjAiPC9jb2RlPiB0byB0dXJuIG9mZiB0aGUgPGNvZGU+ c3R5bGU9ImZvbnQtc2l6ZTogWFhYJSI8L2NvZGU+IGF0dHJpYnV0ZSBnZW5lcmF0aW9uLiAg VGhhdCB3aWxsIGxlYXZlIGJlaGluZCB0aGUgZGVmYXVsdCBDU1MgY2xhc3Nlcywgd2hpY2gg eW91IGNhbiB1c2UgdG8gY29udHJvbCB0aGUgZGlzcGxheSBvZiB5b3VyIGNsb3VkLjwvbGk+ CgkJPGxpPklmIHlvdSBkb24mIzgyMTc7dCB3YW50IHRoZSB0YWdzIHRvIGhhdmUgdGhlaXIg PGNvZGU+Y2xhc3M8L2NvZGU+IGF0dHJpYnV0ZXMgc2V0LCB5b3UgY2FuIHNldCA8Y29kZT5z ZXRjbGFzc2VzPSIwIjwvY29kZT4gdG8gdHVybiBpdCBvZmYuPC9saT4KCQk8bGk+PGNvZGU+ c29ydDwvY29kZT4gY2FuIGJlIHVzZWQgdG8gc29ydCB0aGUgY2xvdWQgYnkgdGFnIGZyZXF1 ZW5jeSwgcmF0aGVyIHRoYW4gdGhlIGRlZmF1bHQgb2YgYWxwaGFiZXRpY2FsbHkuICBVc2Ug PGNvZGU+c29ydD0iY291bnQiPC9jb2RlPiB0byBzb3J0IGJ5IGZyZXF1ZW5jeSBpbiBkZXNj ZW5kaW5nIG9yZGVyLCBhbmQgPGNvZGU+c29ydD0iY291bnQgYXNjIjwvY29kZT4gdG8gc29y dCBieSBmcmVxdWVuY3kgaW4gYXNjZW5kaW5nIG9yZGVyLjwvbGk+Cgk8L3VsPgoJPHA+Tm90 ZSB0aGF0IHlvdSBjYW4gdXNlIHRoZSBhdHRyaWJ1dGVzIHRvIG1ha2UgZWFjaCB0YWcgZG8g dGhlIHNhbWUgdGhpbmcuICA8Y29kZT50cnVfdGFnc19jbG91ZDwvY29kZT4gaXMganVzdCBh IGNvbnZlbmllbmNlIGZ1bmN0aW9uIGZvciBnZW5lcmF0aW5nIGEgdGFnIGNsb3VkIHVzaW5n IDxjb2RlPnRydV90YWdzX2xpc3Q8L2NvZGU+LiAgVGhlcmVmb3JlLCBpdCYjODIxNztzIHBv c3NpYmxlIHRvIGhhdmUgYSB0YWcgY2xvdWQgd2l0aCB0YWcgY291bnRzIHNob3dpbmcsIG9y IGhhdmUgYSBidWxsZXRlZCBsaXN0IHdpdGggdmFyaWFibGUgZm9udCBzaXplcywgZXRjLjwv cD4KCTxoND48Y29kZT50cnVfdGFnc19pZl90YWdfc2VhcmNoPC9jb2RlPjwvaDQ+Cgk8cD5U aGlzIGNvbmRpdGlvbmFsIHRhZyBjYW4gYmUgdXNlZCBhbnl3aGVyZSBhbmQgd2lsbCBldmFs dWF0ZSBpdHMgY29udGVudHMgKGUuZy4gJiM4MjIwO3JldHVybiB0cnVlJiM4MjIxOykgaWYg dGhlIGN1cnJlbnQgdXJsIGluZGljYXRlcyB0aGF0IHRoZXJlIGlzIGEgdGFnIHNlYXJjaCBn b2luZyBvbi4gIFRoaXMgY2FuIGJlIHVzZWZ1bCBpZiB5b3Ugd2FudCB0byBkbyBzb21ldGhp bmcgbGlrZSBjdXN0b21pemUgdGhlIHRpdGxlYmFyIHdoZW4gdXNpbmcgdGhlIHRhZyBzZWFy Y2guPC9wPgoJPGg0Pjxjb2RlPnRydV90YWdzX3RhZ19wYXJhbWV0ZXI8L2NvZGU+PC9oND4K CTxwPlRoaXMgdGFnIGNhbiBiZSB1c2VkIGFueXdoZXJlIGFuZCB3aWxsIHJldHVybiB0aGUg bmFtZSBvZiB0aGUgY3VycmVudCB0YWcgdW5kZXIgc2VhcmNoLCBkdXJpbmcgYSB0YWcgc2Vh cmNoLiAgVGhpcyBpcyBnZW5lcmFsbHkgdXNlZCB3aXRoIDxjb2RlPnRydV90YWdzX2lmX3Rh Z19zZWFyY2g8L2NvZGU+LjwvcD4KCTxoND48Y29kZT50cnVfdGFnc19zZWFyY2hfcGFyYW1l dGVyPC9jb2RlPjwvaDQ+Cgk8cD5UaGlzIHRhZyBjYW4gYmUgdXNlZCBhbnl3aGVyZSBhbmQg d2lsbCByZXR1cm4gdGhlIHRleHQgdGhlIHVzZXIgdHlwZWQgaW50byB0aGUgc3RhbmRhcmQg c2VhcmNoIGJveCwgZHVyaW5nIGEgcmVndWxhciBzZWFyY2guICBUaGlzIHRhZyBpcyBub3Qg c3BlY2lmaWNhbGx5IHJlbGF0ZWQgdG8gdGFnZ2luZywgYnV0IGNhbiBiZSBoYW5keSBmb3Ig Y3VzdG9taXppbmcgdGhlIHRpdGxlYmFyIG9uIHNlYXJjaCByZXN1bHQgcGFnZXMuPC9wPgoJ PGg0Pjxjb2RlPnRydV90YWdzX3JlbGF0ZWRfdGFnc19mcm9tX3NlYXJjaDwvY29kZT48L2g0 PgoJPHA+VGhpcyB0YWcgaXMgdXNlZnVsIG9uIHRoZSByZXN1bHRzIHBhZ2Ugb2YgYSB0YWcg c2VhcmNoLiAgSXQgZ2VuZXJhdGVzIGEgY2xvdWQgb2YgYWxsIHRoZSB0YWdzIHRoYXQgYXJl IHVzZWQgYnkgdGhlIGFydGljbGVzIGZvdW5kIGluIHRoYXQgc2VhcmNoLCBleGNsdWRpbmcg dGhlIHNlYXJjaCB0YWcgaXRzZWxmLiAgRm9yIGV4YW1wbGUsIGlmIGEgdGFnIHNlYXJjaCBm b3IgJiM4MjIwO2xpZmUmIzgyMjE7IGZvdW5kIHRocmVlIGFydGljbGVzIHRoYXQgd2VyZSB0 YWdnZWQgYXMgZm9sbG93czo8L3A+Cgk8b2w+CgkJPGxpPm1vbmV5LCBoZWFsdGgsIGxpZmU8 L2xpPgoJCTxsaT5tb25leSwgcG9saXRpY3MsIGxpZmU8L2xpPgoJCTxsaT5saWZlPC9saT4K CTwvb2w+Cgk8cD4uLi48Y29kZT50cnVfdGFnc19yZWxhdGVkX3RhZ3NfZnJvbV9zZWFyY2g8 L2NvZGU+IHdvdWxkIGdlbmVyYXRlIGEgY2xvdWQgY29udGFpbmluZyAmIzgyMjA7bW9uZXkm IzgyMjE7LCAmIzgyMjA7aGVhbHRoJiM4MjIxOywgYW5kICYjODIyMDtwb2xpdGljcyYjODIy MTsuPC9wPgoJPHA+VGhpcyBpcyB1c2VmdWwgZm9yIGdlbmVyYXRpbmcgYSAmIzgyMjA7cmVs YXRlZCB0YWdzJiM4MjIxOyBjbG91ZCwgYXMgeW91IGNhbiBzZWUgaW4gdGhlIHNpZGViYXIg b2YgdGhpcyBzaXRlIHdoZW4geW91IGRvIGEgdGFnIHNlYXJjaC48L3A+Cgk8cD48c3Ryb25n PkJlZm9yZSB5b3UgdXNlIHRoaXMgb24geW91ciBzaXRlLCBob3dldmVyLDwvc3Ryb25nPiBi ZSB3YXJuZWQgdGhhdCBpdCYjODIxNztzIG5vdCBnb29kIGZvciB5b3VyIHNpdGUmIzgyMTc7 cyBwZXJmb3JtYW5jZSwgYW5kIGl0JiM4MjE3O3MgYSBsaXR0bGUgYml0IG9mIGEgaGFjayAo YW5kIHRoZXJlZm9yZSBtYXkgYnJlYWsgd2l0aCBuZXdlciB2ZXJzaW9ucyBvZiBUZXh0cGF0 dGVybikuICBJdCBpcyBpbXBsZW1lbnRlZCBieSBjb21wbGV0ZWx5IHJlZG9pbmcgdGhlIGRh dGFiYXNlIHF1ZXJ5IHRoYXQgZm91bmQgYWxsIHRoZSBhcnRpY2xlcyBpbiB0aGUgZmlyc3Qg cGxhY2UsIHdoaWNoIG1lYW5zIHRoYXQgeW91ciBzaXRlIGlzIGVzc2VudGlhbGx5IHBlcmZv cm1pbmcgdGhlIHNlYXJjaCB0d2ljZS4gIFRoZW4sIGRlcGVuZGluZyBvbiB0aGUgYXR0cmli dXRlcyB5b3UgdXNlLCBpdCBtYXkgZG8gYSBzZWNvbmQgcXVlcnkgdGhhdCBpcyBlcXVpdmFs ZW50IHRvIHRoZSBxdWVyeSB0aGF0IGdlbmVyYXRlcyB0aGUgJiM4MjIwO2NvbXBsZXRlJiM4 MjIxOyB0YWcgY2xvdWQuPC9wPgoJPHA+WW91IG1heSB3YW50IHRvIHRlc3QgdGhpcyBjYXJl ZnVsbHkgaWYgeW91IGhhdmUgYSBob3N0aW5nIHByb3ZpZGVyIHdobyBjaGFyZ2VzIHlvdSBm b3IgQ1BVIGN5Y2xlcy4gIDopPC9wPgoJPHA+SWYgeW91IGRlY2lkZSB0byB1c2UgdGhpcyB0 YWcsIGJlIHN1cmUgdG8gbWluaWMgdGhlIDxjb2RlPnNlY3Rpb248L2NvZGU+IGFuZCA8Y29k ZT5saW1pdDwvY29kZT4gYXR0cmlidXRlcyBmcm9tIHlvdXIgPGNvZGU+dHJ1X3RhZ3NfY2xv dWQ8L2NvZGU+IChvciA8Y29kZT50cnVfdGFnc19saXN0PC9jb2RlPikgY2FsbCwgYWxvbmcg d2l0aCBhbnkgPGNvZGU+dHhwOmFydGljbGU8L2NvZGU+IGF0dHJpYnV0ZXMgdGhhdCB5b3Ug dXNlZCBpbiB5b3VyIDxjb2RlPnRydV90YWdzX2hhbmRsZXI8L2NvZGU+IGNhbGwuICBJZiB5 b3UgZG9uJiM4MjE3O3QsIHRoZSBzZXQgb2YgYXJ0aWNsZXMgZm91bmQvdXNlZCBieSB0aGlz IHRhZyB3b24mIzgyMTc7dCBtYXRjaCB0aGUgc2V0IHRoYXQgYXJlIGRpc3BsYXllZCB0byB0 aGUgdXNlci48L3A+Cgk8cD5UaGlzIHRhZyBhY2NlcHRzIHRoZSBmb2xsb3dpbmcgYXR0cmli dXRlczo8L3A+Cgk8dWw+CgkJPGxpPkFsbCB0aGUgYXR0cmlidXRlcyBvZiA8Y29kZT50eHA6 YXJ0aWNsZTwvY29kZT48L2xpPgoJCTxsaT5BbGwgdGhlIGF0dHJpYnV0ZXMgb2YgPGNvZGU+ dHJ1X3RhZ3NfY2xvdWQ8L2NvZGU+Lzxjb2RlPnRydV90YWdzX2xpc3Q8L2NvZGU+LjwvbGk+ CgkJPGxpPjxjb2RlPnVzZW92ZXJhbGxjb3VudHM8L2NvZGU+LCB3aGljaCBtYWtlcyB0aGUg Y2xvdWQgcmVuZGVyIHVzaW5nIHRoZSBmcmVxdWVuY3kgZGF0YSBmb3IgdGhlIHNpdGUtd2lk ZSB0YWcgY2xvdWQuCgk8dWw+CgkJPGxpPkJ5IGRlZmF1bHQsIDxjb2RlPnRydV90YWdzX3Jl bGF0ZWRfdGFnc19mcm9tX3NlYXJjaDwvY29kZT4gb3V0cHV0cyBhIGNsb3VkIHdoZXJlIHRo ZSB3ZWlnaHRzIGFyZSBiYXNlZCBvbiB0aGUgZnJlcXVlbmN5IG9mIHRoZSB0YWdzIDxlbT5p biB0aGUgc2VhcmNoIHJlc3VsdHM8L2VtPi4gIFVzaW5nIHRoZSBleGFtcGxlIGZyb20gYWJv dmUsICYjODIyMDttb25leSYjODIyMTsgd291bGQgaGF2ZSBhIHdlaWdodCB0aGF0IHdhcyBk b3VibGUgdGhlIHdlaWdodCBvZiAmIzgyMjA7aGVhbHRoJiM4MjIxOyBhbmQgJiM4MjIwO3Bv bGl0aWNzJiM4MjIxOy48L2xpPgoJCTxsaT5UaGlzIGF0dHJpYnV0ZSB3aWxsIGNoYW5nZSB0 aGF0IGJlaGF2aW9yLCBtYWtpbmcgdGhlIHRhZyBzaXplcyBtYXRjaCB0aGUgc2l6ZXMgdXNl ZCBpbiB0aGUgc2l0ZS13aWRlIHRhZyBjbG91ZC4gIEluIG90aGVyIHdvcmRzLCB0aGlzIGNs b3VkIHdpbGwgbG9vayBleGFjdGx5IGxpa2UgYSBzdWJzZXQgb2YgeW91ciBzaXRld2lkZSBj bG91ZC48L2xpPgoJCTxsaT5JdCB3aWxsIGFsc28gYWRkIGFuIGV4dHJhIGRhdGFiYXNlIHF1 ZXJ5IHRvIHRoZSBtaXggKG1lbnRpb25lZCBhYm92ZSksIHNvIGNvbnNpZGVyIHBlcmZvcm1h bmNlIGNhcmVmdWxseSBiZWZvcmUgdXNpbmcgaXQuPC9saT4KCTwvdWw+PC9saT4KCTwvdWw+ CgoKICI7czo0OiJjb2RlIjtzOjEwOTEwOiIKCgojQ29weXJpZ2h0IDIwMDYgTmF0aGFuIEFy dGh1cgojUmVsZWFzZWQgdW5kZXIgdGhlIEdOVSBQdWJsaWMgTGljZW5zZSwgc2VlIGh0dHA6 Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZ3BsLWxpY2Vuc2UucGhwIGZvciBkZXRh aWxzCiNUaGlzIHdvcmsgaXMgaW5zcGlyZWQgYnkgcmFuX3RhZ3MgYnkgUmFuIEFyb3Vzc2ks IG9yaWdpbmFsbHkgZm91bmQgYXQgaHR0cDovL2Fyb3Vzc2kuY29tL2FydGljbGUvNDUvdGFn Z2luZy10ZXh0cGF0dGVybgoKCiNTZWUgaHR0cDovL3d3dy50cnVpc3QuY29tL3JlZmVyZW5j ZS80OTcvdHJ1dGFncy11c2FnZS1pbnN0cnVjdGlvbnMgZm9yIGluc3RydWN0aW9ucwpmdW5j dGlvbiB0cnVfdGFnc191c2VfY2xlYW5fdXJscygpCnsKCXJldHVybiAwOyAJI0RPIE5PVCBF TkFCTEUgVEhJUyB1bmxlc3MgeW91J3ZlIHJlYWQgdGhlIGluc3RydWN0aW9ucwp9CgoKIyMj IFBSSU1BUlkgVEFHIEZVTkNUSU9OUyAjIyMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMKCmZ1bmN0aW9uIHRydV90YWdzX2hhbmRsZXIoJGF0dHMpIHsKCSR0YWdfcGFyYW1ldGVy ID0gdHJ1X3RhZ3NfdGFnX3BhcmFtZXRlcigpOwoJaWYgKCFlbXB0eSgkdGFnX3BhcmFtZXRl cikpIHsKCQkkYXR0cyA9IHRydV90YWdzX2ZpeHVwX3F1ZXJ5X2F0dHMoJGF0dHMsICR0YWdf cGFyYW1ldGVyKTsKCQlyZXR1cm4gZG9BcnRpY2xlcygkYXR0cywgdHJ1ZSk7CQkjZnVuY3Rp b24gaW4gVFhQIGNvZGUKCX0gZWxzZSB7CgkJcmV0dXJuIHRydV90YWdzX2Nsb3VkKCRhdHRz KTsKCX0KfQoKCmZ1bmN0aW9uIHRydV90YWdzX2Nsb3VkKCRhdHRzKSB7CglyZXR1cm4gdHJ1 X3RhZ3NfbGlzdCh0cnVfdGFnc19nZXRfc3RhbmRhcmRfY2xvdWRfYXR0cygkYXR0cywgZmFs c2UsIGZhbHNlKSk7Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc19saXN0KCRhdHRzKSB7CgkkYXR0 cyA9IHRydV90YWdzX2dldF9zdGFuZGFyZF9jbG91ZF9hdHRzKCRhdHRzLCB0cnVlLCBmYWxz ZSk7CgkkYWxsX3RhZ3MgPSB0cnVfdGFnc19jbG91ZF9xdWVyeSgkYXR0cyk7CgoJcmV0dXJu IHRydV90YWdzX3JlbmRlcl9jbG91ZCgkYXR0cywgJGFsbF90YWdzLCAkYWxsX3RhZ3MpOwp9 CgoKZnVuY3Rpb24gdHJ1X3RhZ3NfZnJvbV9hcnRpY2xlKCRhdHRzKSB7CglnbG9iYWwgJHRo aXNhcnRpY2xlLCAkc2l0ZXVybCwgJHBhdGhfZnJvbV9yb290OwoJZXh0cmFjdCgkX1NFUlZF Uik7CglleHRyYWN0KCR0aGlzYXJ0aWNsZSk7CgoJJHRhZ3NfZmllbGQgPSB0cnVfdGFnc19m aWVsZCgpOwoJJHJzID0gc2FmZV9yb3coJHRhZ3NfZmllbGQsICJ0ZXh0cGF0dGVybiIsICJJ RD0nJHRoaXNpZCcgQU5EICR0YWdzX2ZpZWxkIDw+ICcnIik7CgkkYWxsX3RhZ3MgPSBleHBs b2RlKCIsIiwgdHJpbShtYl9zdHJ0b2xvd2VyKCRyc1skdGFnc19maWVsZF0sICJVVEYtOCIp KSk7CgkkYWxsX3RhZ3MgPSB0cnVfdGFnc190cmltX3RhZ3MoJGFsbF90YWdzKTsKCgkkYXR0 cyA9IHRydV90YWdzX2dldF9zdGFuZGFyZF9jbG91ZF9hdHRzKCRhdHRzLCBmYWxzZSwgdHJ1 ZSk7CgkkYWxsX3RhZ3NfZm9yX3dlaWdodCA9ICRhbGxfdGFnczsKCWlmICgkYXR0c1sndXNl b3ZlcmFsbGNvdW50cyddKSB7CgkJJGFsbF90YWdzX2Zvcl93ZWlnaHQgPSB0cnVfdGFnc19j bG91ZF9xdWVyeSgkYXR0cyk7Cgl9CgoJcmV0dXJuIHRydV90YWdzX3JlbmRlcl9jbG91ZCgk YXR0cywgJGFsbF90YWdzLCAkYWxsX3RhZ3NfZm9yX3dlaWdodCk7Cn0KCgpmdW5jdGlvbiB0 cnVfdGFnc19pZl9oYXNfdGFncygkYXR0cywgJHRoaW5nKSB7CglnbG9iYWwgJHRoaXNhcnRp Y2xlOwoJZXh0cmFjdCgkdGhpc2FydGljbGUpOwoKCSR0YWdzX2ZpZWxkID0gdHJ1X3RhZ3Nf ZmllbGQoKTsKCgkkcnMgPSBzYWZlX3JvdygkdGFnc19maWVsZCwgInRleHRwYXR0ZXJuIiwg IklEPSckdGhpc2lkJyBBTkQgJHRhZ3NfZmllbGQgPD4gJyciKTsKCXJldHVybiBwYXJzZShF dmFsRWxzZSgkdGhpbmcsICRycykpOwp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3NfaWZfdGFnX3Nl YXJjaCgkYXR0cywgJHRoaW5nKQp7CgkkdGFnX3BhcmFtZXRlciA9IHRydV90YWdzX3RhZ19w YXJhbWV0ZXIoKTsKCSRjb25kaXRpb24gPSAoIWVtcHR5KCR0YWdfcGFyYW1ldGVyKSkgPyB0 cnVlIDogZmFsc2U7CglyZXR1cm4gcGFyc2UoRXZhbEVsc2UoJHRoaW5nLCAkY29uZGl0aW9u KSk7Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc190YWdfcGFyYW1ldGVyKCRhdHRzID0gYXJyYXko KSkKewoJZXh0cmFjdChsQXR0cyhhcnJheSgnc3RyaXBoeXBoZW5zJyA9PiAwKSwgJGF0dHMp KTsKCSRwYXJtID0gc3RyaXBfdGFncyhncHMoJ3QnKSk7CglyZXR1cm4gKCRzdHJpcGh5cGhl bnMgPyBzdHJfcmVwbGFjZSgnLScsICcgJywgJHBhcm0pIDogJHBhcm0pOwp9CgoKZnVuY3Rp b24gdHJ1X3RhZ3Nfc2VhcmNoX3BhcmFtZXRlcigpCnsKCXJldHVybiBzdHJpcF90YWdzKGdw cygncScpKTsKfQoKCmZ1bmN0aW9uIHRydV90YWdzX3JlbGF0ZWRfdGFnc19mcm9tX3NlYXJj aCgkYXR0cykgewoJJHRhZ19wYXJhbWV0ZXIgPSB0cnVfdGFnc190YWdfcGFyYW1ldGVyKCk7 CglpZiAoIWVtcHR5KCR0YWdfcGFyYW1ldGVyKSkgewoJICAgICAgICAkdGFnc19maWVsZCA9 IHRydV90YWdzX2ZpZWxkKCk7CgkJJGFsbF90YWdzID0gYXJyYXkoKTsKCgkJJHF1ZXJ5X2F0 dHMgPSB0cnVfdGFnc19maXh1cF9xdWVyeV9hdHRzKCRhdHRzLCAkdGFnX3BhcmFtZXRlcik7 CgkJJHJzID0gdHJ1X3RhZ3NfcmVkb19hcnRpY2xlX3NlYXJjaCgkcXVlcnlfYXR0cyk7CgkJ aWYgKCRycykgewoJCQl3aGlsZSAoJGEgPSBuZXh0Um93KCRycykpIHsKCQkJCSRhcnRpY2xl X3RhZ3MgPSBleHBsb2RlKCIsIiwgdHJpbShtYl9zdHJ0b2xvd2VyKCRhWyR0YWdzX2ZpZWxk XSwgIlVURi04IikpKTsKCQkJCSRhbGxfdGFncyA9IGFycmF5X21lcmdlKCRhbGxfdGFncywg dHJ1X3RhZ3NfdHJpbV90YWdzKCRhcnRpY2xlX3RhZ3MpKTsKCQkJfQoJCX0KCgkJJGFsdF90 YWdfcGFyYW1ldGVyID0gc3RyX3JlcGxhY2UoJy0nLCAnICcsICR0YWdfcGFyYW1ldGVyKTsK CQlmb3JlYWNoICgkYWxsX3RhZ3MgYXMgJGtleSA9PiAkdGFnKSB7CgkJCWlmICgkdGFnID09 ICR0YWdfcGFyYW1ldGVyIHx8ICR0YWcgPT0gJGFsdF90YWdfcGFyYW1ldGVyKSB7CgkJCQl1 bnNldCgkYWxsX3RhZ3NbJGtleV0pOwoJCQl9CgkJfQoKCQkkY2xvdWRfYXR0cyA9IHRydV90 YWdzX2dldF9zdGFuZGFyZF9jbG91ZF9hdHRzKCRhdHRzLCBmYWxzZSwgZmFsc2UpOwoJCSRh bGxfdGFnc19mb3Jfd2VpZ2h0ID0gJGFsbF90YWdzOwoJCWlmICgkY2xvdWRfYXR0c1sndXNl b3ZlcmFsbGNvdW50cyddKSB7CgkJCSRhbGxfdGFnc19mb3Jfd2VpZ2h0ID0gdHJ1X3RhZ3Nf Y2xvdWRfcXVlcnkoJGNsb3VkX2F0dHMpOwoJCX0KCgkJcmV0dXJuIHRydV90YWdzX3JlbmRl cl9jbG91ZCgkY2xvdWRfYXR0cywgJGFsbF90YWdzLCAkYWxsX3RhZ3NfZm9yX3dlaWdodCk7 Cgl9IGVsc2UgewoJCXJldHVybiAnJzsKCX0KfQoKCiMjIyBDTE9VRCBTVVBQT1JUIEZVTkNU SU9OUyAjIyMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKZnVuY3Rpb24gdHJ1 X3RhZ3NfZ2V0X3N0YW5kYXJkX2Nsb3VkX2F0dHMoJGF0dHMsICRpc0xpc3QsICRpc0FydGlj bGUpIHsKCXJldHVybiBsQXR0cyhhcnJheSgnd3JhcHRhZycJPT4gKCRpc0xpc3QgPyAndWwn IDogJycpLAoJCQknYnJlYWsnCQk9PiAoJGlzTGlzdCA/ICdsaScgOiAnLCAnKSwKCQkJJ2Ns YXNzJwkJPT4gJycsCgkJCSdicmVha2NsYXNzJwk9PiAnJywKCQkJJ3RhZ3NlY3Rpb24nCT0+ ICd0YWcnLAoJCQknc2VjdGlvbicJPT4gJycsCgkJCSdtaW5wZXJjZW50Jwk9PiAnMTAwJywK CQkJJ21heHBlcmNlbnQnCT0+ICgkaXNMaXN0IHx8ICRpc0FydGljbGUgPyAnMTAwJyA6ICcy MDAnKSwKCQkJJ3Nob3djb3VudHMnCT0+ICcnLAoJCQknY291bnR3cmFwY2hhcnMnCT0+ICdb XScsCgkJCSd1c2VyZWx0YWcnCT0+ICgkaXNBcnRpY2xlID8gJzEnIDogJycpLAoJCQknZ2Vu ZXJhdGVsaW5rcycJPT4gJzEnLAoJCQknbWludGFnY291bnQnCT0+ICcwJywKCQkJJ21heHRh Z2NvdW50Jwk9PiAnMTAwMCcsCgkJCSdzZXRzaXplcycJPT4gKCRpc0FydGljbGUgPyAnMCcg OiAnMScpLAoJCQkndXNlbm9mb2xsb3cnCT0+ICcnLAoJCQknc29ydCcJCT0+ICdhbHBoYScs CgkJCSd1c2VvdmVyYWxsY291bnRzJwk9PiAnJywKCQkJJ3NldGNsYXNzZXMnCT0+ICgkaXNB cnRpY2xlID8gJzAnIDogJzEnKQoJCSksJGF0dHMpOwp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3Nf Y2xvdWRfcXVlcnkoJGF0dHMpIHsKCWV4dHJhY3QoJGF0dHMpOwoKCSRzZWN0aW9uX2NsYXVz ZSA9ICcnOwoJaWYgKCRzZWN0aW9uIDw+ICcnKSB7CgkJJGtleXMgPSBzcGxpdCgnLCcsICRz ZWN0aW9uKTsKCQlmb3JlYWNoICgka2V5cyBhcyAka2V5KSB7CgkJCSRrZXlwYXJ0c1tdID0g IiBTZWN0aW9uID0gJyIgLiB0cmltKCRrZXkpIC4gIiciOwoJCX0KCQkkc2VjdGlvbl9jbGF1 c2UgPSAiIEFORCAoIiAuIGpvaW4oJyBvciAnLCAka2V5cGFydHMpIC4gIikiOwoJfQoKCSR0 YWdzX2ZpZWxkID0gdHJ1X3RhZ3NfZmllbGQoKTsKCWluY2x1ZGVfb25jZSB0eHBhdGguJy9w dWJsaXNoL3NlYXJjaC5waHAnOwoJJGZpbHRlciA9IGZpbHRlclNlYXJjaCgpOwoJJGFsbF90 YWdzID0gYXJyYXkoKTsKCSRycyA9IHNhZmVfcm93cygiJHRhZ3NfZmllbGQiLCAidGV4dHBh dHRlcm4iLCAiJHRhZ3NfZmllbGQgPD4gJyciIC4gJHNlY3Rpb25fY2xhdXNlIC4gJGZpbHRl ciAuICIgYW5kIFN0YXR1cyA+PSAnNCcgYW5kIFBvc3RlZCA8IG5vdygpIik7Cglmb3JlYWNo ICgkcnMgYXMgJHJvdykgewoJCSR0ZW1wX2FycmF5ID0gZXhwbG9kZSgiLCIsIHRyaW0obWJf c3RydG9sb3dlcigkcm93WyR0YWdzX2ZpZWxkXSwgIlVURi04IikpKTsKCQkkYWxsX3RhZ3Mg PSBhcnJheV9tZXJnZSgkYWxsX3RhZ3MsIHRydV90YWdzX3RyaW1fdGFncygkdGVtcF9hcnJh eSkpOwoJfQoKCXJldHVybiAkYWxsX3RhZ3M7Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc19yZW5k ZXJfY2xvdWQoJGF0dHMsICRhbGxfdGFncywgJGFsbF90YWdzX2Zvcl93ZWlnaHQpIHsKCWds b2JhbCAkc2l0ZXVybCwgJHBhdGhfZnJvbV9yb290OwoJZXh0cmFjdCgkX1NFUlZFUik7Cgll eHRyYWN0KCRhdHRzKTsKCglzb3J0KCRhbGxfdGFncyk7Cglzb3J0KCRhbGxfdGFnc19mb3Jf d2VpZ2h0KTsKCgkkdGFnc193ZWlnaHQgPSBhcnJheV9jb3VudF92YWx1ZXMoJGFsbF90YWdz X2Zvcl93ZWlnaHQpOwoJJHRhZ3NfdW5pcXVlID0gYXJyYXlfdW5pcXVlKCRhbGxfdGFncyk7 CgoJZm9yZWFjaCAoJHRhZ3NfdW5pcXVlIGFzICRrZXkgPT4gJHRhZykgewoJCWlmICgkdGFn c193ZWlnaHRbJHRhZ10gPCAkbWludGFnY291bnQgfHwgJHRhZ3Nfd2VpZ2h0WyR0YWddID4g JG1heHRhZ2NvdW50KSB7CgkJCXVuc2V0KCR0YWdzX3VuaXF1ZVska2V5XSk7CgkJCXVuc2V0 KCR0YWdzX3dlaWdodFskdGFnXSk7CgkJfQoJfQoKCSRtYXggPSBtYXgoJHRhZ3Nfd2VpZ2h0 KTsKCSRtaW4gPSBtaW4oJHRhZ3Nfd2VpZ2h0KTsKCSRzdGVwdmFsdWUgPSAoJG1heCA9PSAk bWluKSA/IDAgOiAoJG1heHBlcmNlbnQgLSAkbWlucGVyY2VudCkgLyAoJG1heCAtICRtaW4p OwoKCWZvcmVhY2ggKCR0YWdzX3dlaWdodCBhcyAkdGFnID0+ICR3ZWlnaHQpIHsKCQlpZiAo IWluX2FycmF5KCR0YWcsICR0YWdzX3VuaXF1ZSkpIHsKCQkJdW5zZXQoJHRhZ3Nfd2VpZ2h0 WyR0YWddKTsKCQl9Cgl9CgoJaWYgKHN0cnBvcygkc29ydCwgJ2NvdW50JykgIT09IGZhbHNl KSB7CgkJJHNvcnRfYXNjID0gKHN0cnBvcygkc29ydCwgJ2FzYycpICE9PSBmYWxzZSk7CgkJ YXJyYXlfbXVsdGlzb3J0KCR0YWdzX3dlaWdodCwgKCRzb3J0X2FzYyA/IFNPUlRfQVNDIDog U09SVF9ERVNDKSwgJHRhZ3NfdW5pcXVlKTsKCX0KCglpZiAoJGdlbmVyYXRlbGlua3MpIHsK CQlpZiAodHJ1X3RhZ3NfdXNlX2NsZWFuX3VybHMoKSkgewoJCQkkdXJscHJlZml4ID0gJ2h0 dHA6Ly8nIC4gJHNpdGV1cmwgLiAkcGF0aF9mcm9tX3Jvb3QgLiAkdGFnc2VjdGlvbiAuICcv JzsKCQkJaWYgKCR1c2VyZWx0YWcpIHsKCQkJCWlmICgkdXNlbm9mb2xsb3cpIHsKCQkJCQkk dXJsc3VmZml4ID0gJy8iIHJlbD0idGFnIG5vZm9sbG93JzsKCQkJCX0gZWxzZSB7CgkJCQkJ JHVybHN1ZmZpeCA9ICcvIiByZWw9InRhZyc7CgkJCQl9CgkJCX0gZWxzZSBpZiAoJHVzZW5v Zm9sbG93KSB7CgkJCQkkdXJsc3VmZml4ID0gJy8iIHJlbD0ibm9mb2xsb3cnOwoJCQl9IGVs c2UgewoJCQkJJHVybHN1ZmZpeCA9ICcvJzsKCQkJfQoJCX0gZWxzZSB7CgkJCSR1cmxwcmVm aXggPSAnaHR0cDovLycgLiAkc2l0ZXVybCAuICRwYXRoX2Zyb21fcm9vdCAuICc/cz0nIC4g JHRhZ3NlY3Rpb24gLiAnJmFtcDt0PSc7CgkJCSR1cmxzdWZmaXggPSAnJzsKCQl9Cgl9CgoJ Zm9yZWFjaCAoJHRhZ3NfdW5pcXVlIGFzICR0YWcpIHsKCQkkdGFnX3dlaWdodCA9IGZsb29y KCRtaW5wZXJjZW50ICsgKCR0YWdzX3dlaWdodFskdGFnXSAtICRtaW4pICogJHN0ZXB2YWx1 ZSk7CgoJCWlmICgkc2V0c2l6ZXMpCgkJCSRzdHlsZSA9ICcgc3R5bGU9ImZvbnQtc2l6ZTog JyAuICR0YWdfd2VpZ2h0IC4gJyU7Iic7CgoJCWlmICgkc2V0Y2xhc3NlcykgewoJCQkkdGFn X2NsYXNzID0gJyBjbGFzcz0iJzsKCQkJaWYgKCR0YWdzX3dlaWdodFskdGFnXSA9PSAkbWlu KQoJCQkJJHRhZ19jbGFzcyAuPSAidGFnU2l6ZVNtYWxsZXN0IjsKCQkJZWxzZSBpZiAoJHRh Z3Nfd2VpZ2h0WyR0YWddID09ICRtYXgpCgkJCQkkdGFnX2NsYXNzIC49ICJ0YWdTaXplTGFy Z2VzdCI7CgkJCWVsc2UKCQkJCSR0YWdfY2xhc3MgLj0gInRhZ1NpemVNZWRpdW0iOwoJCQkk dGFnX2NsYXNzIC49ICcgdGFnU2l6ZScgLiAoJHRhZ3Nfd2VpZ2h0WyR0YWddICsgMSAtICRt aW4pOwoJCQkkdGFnX2NsYXNzIC49ICciJzsKCQl9CgoJCS8vYWRhcHRlZCBmcm9tIGNvZGUg YnkgZ2R0cm9pYW5vLCBzZWUgaHR0cDovL2ZvcnVtLnRleHRwYXR0ZXJuLmNvbS92aWV3dG9w aWMucGhwP3BpZD0xMDI4NzUjcDEwMjg3NQoJCSR0aXRsZWNvdW50ID0gJyc7CgkJJGRpc3Bs YXljb3VudD0gJyc7CgkJJGNvdW50ID0gJGNvdW50d3JhcGNoYXJzezB9IC4gJHRhZ3Nfd2Vp Z2h0WyR0YWddIC4gJGNvdW50d3JhcGNoYXJzezF9OwoJCWlmICgkc2hvd2NvdW50cyA9PSAn dGl0bGUnIHx8ICRzaG93Y291bnRzID09ICdib3RoJykKCQkJJHRpdGxlY291bnQgPSAnIHRp dGxlPSInIC4gJGNvdW50IC4gJyInOwoJCWlmICgkc2hvd2NvdW50cyAmJiAkc2hvd2NvdW50 cyAhPSAndGl0bGUnKQoJCQkkZGlzcGxheWNvdW50ID0gJyAnIC4gJGNvdW50OwoKCQlpZiAo JGdlbmVyYXRlbGlua3MpIHsKCQkJJHdob2xldXJsID0gJyInIC4gJHVybHByZWZpeCAuIHN0 cl9yZXBsYWNlKCcgJywgJy0nLCAkdGFnKSAuICR1cmxzdWZmaXggLiAnIic7CgkJCSR0YWdz X2h0bWxbXSA9ICc8YSBocmVmPScgLiAkd2hvbGV1cmwgLiAkdGFnX2NsYXNzIC4gJHN0eWxl IC4gJHRpdGxlY291bnQgLiAnPicgLiAkdGFnIC4gJzwvYT4nIC4gJGRpc3BsYXljb3VudDsK CQl9IGVsc2UgaWYgKCR0YWdfY2xhc3MgfHwgJHN0eWxlIHx8IHRpdGxlY291bnQpIHsKCQkJ JHRhZ3NfaHRtbFtdID0gJzxzcGFuJyAuICR0YWdfY2xhc3MgLiAkc3R5bGUgLiAkdGl0bGVj b3VudCAuICc+JyAuICR0YWcgLiAnPC9zcGFuPicgLiAkZGlzcGxheWNvdW50OwoJCX0gZWxz ZSB7CgkJCSR0YWdzX2h0bWxbXSA9ICR0YWcgLiAkZGlzcGxheWNvdW50OwoJCX0KCX0KCgly ZXR1cm4gZG9XcmFwKCR0YWdzX2h0bWwsICR3cmFwdGFnLCAkYnJlYWssICRjbGFzcywgJGJy ZWFrY2xhc3MpOwp9CgoKIyMjIE9USEVSIFNVUFBPUlQgRlVOQ1RJT05TICMjIwojIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpmdW5jdGlvbiB0cnVfdGFnc190cmltX3RhZ3Mo JHRhZ19hcnJheSkgewoJZm9yICgkaSA9IDA7ICRpIDwgY291bnQoJHRhZ19hcnJheSk7ICRp KyspIHsKCQkkdGFnX2FycmF5WyRpXSA9IHRyaW0oJHRhZ19hcnJheVskaV0pOwoJfQoJcmV0 dXJuICR0YWdfYXJyYXk7Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc19maWVsZCgpIHsKCXJldHVy biAnS2V5d29yZHMnOwp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3NfZml4dXBfcXVlcnlfYXR0cygk YXR0cywgJHRhZ19wYXJhbWV0ZXIpIHsKCSRrZXl3b3JkcyA9IGV4cGxvZGUoJywnLCAkdGFn X3BhcmFtZXRlcik7Cglmb3JlYWNoICgka2V5d29yZHMgYXMgJGtleXdvcmQpIHsKCQlpZiAo c3RycG9zKCRrZXl3b3JkLCAnLScpICE9PSBmYWxzZSkgewoJCQkka2V5d29yZHNbXSA9IHN0 cl9yZXBsYWNlKCctJywgJyAnLCAka2V5d29yZCk7CgkJfQoJfQoJJGF0dHNbJ2tleXdvcmRz J10gPSBpbXBsb2RlKCcsJywgJGtleXdvcmRzKTsKCglpZiAoJGF0dHNbJ3NlY3Rpb24nXSAm JiBzdHJwb3MoJGF0dHNbJ3NlY3Rpb24nXSwgJywnKSAhPT0gZmFsc2UpCgkJJGF0dHNbJ3Nl Y3Rpb24nXSA9ICcnOwoKCWlmICghJGF0dHNbJ2xpbWl0J10pCgkJJGF0dHNbJ2xpbWl0J10g PSAnMTAwMCc7CgkkYXR0c1snYWxsb3dvdmVycmlkZSddID0gdHJ1ZTsKCglyZXR1cm4gJGF0 dHM7Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc19yZWRvX2FydGljbGVfc2VhcmNoKCRhdHRzKSB7 CgkkdGhlQXR0cyA9IGxBdHRzKGFycmF5KCdsaW1pdCcgICAgID0+IDEwMDAsCgkJCQknY2F0 ZWdvcnknICA9PiAnJywKCQkJCSdzZWN0aW9uJyAgID0+ICcnLAoJCQkJJ2V4Y2VycHRlZCcg PT4gJycsCgkJCQknYXV0aG9yJyAgICA9PiAnJywKCQkJCSdzb3J0YnknICAgID0+ICdQb3N0 ZWQnLAoJCQkJJ3NvcnRkaXInICAgPT4gJ2Rlc2MnLAoJCQkJJ21vbnRoJyAgICAgPT4gJycs CgkJCQkna2V5d29yZHMnICA9PiAnJywKCQkJCSdmcm9udHBhZ2UnID0+ICcnLAoJCQkJJ2lk JyAgICAgICAgPT4gJycsCgkJCQkndGltZScgICAgICA9PiAncGFzdCcsCgkJCQknc3RhdHVz JyAgICA9PiAnNCcsCgkJCQknb2Zmc2V0JyAgICA9PiAwCgkJCSksJGF0dHMpOwoJZXh0cmFj dCgkdGhlQXR0cyk7CgoJLy9CdWlsZGluZyBxdWVyeSBwYXJ0cwoJJGZyb250cGFnZSA9ICgk ZnJvbnRwYWdlKSA/IGZpbHRlckZyb250UGFnZSgpIDogJyc7CgkkY2F0ZWdvcnkgID0gKCEk Y2F0ZWdvcnkpICA/ICcnIDogIiBhbmQgKChDYXRlZ29yeTE9JyIuZG9zbGFzaCgkY2F0ZWdv cnkpLiInKSBvciAoQ2F0ZWdvcnkyPSciLmRvU2xhc2goJGNhdGVnb3J5KS4iJykpICI7Cgkk c2VjdGlvbiAgID0gKCEkc2VjdGlvbikgICA/ICcnIDogIiBhbmQgU2VjdGlvbiA9ICciLmRv c2xhc2goJHNlY3Rpb24pLiInIjsKCSRleGNlcnB0ZWQgPSAoJGV4Y2VycHRlZD09J3knKSAg PyAiIGFuZCBFeGNlcnB0ICE9JyciIDogJyc7CgkkYXV0aG9yICAgID0gKCEkYXV0aG9yKSAg ICA/ICcnIDogIiBhbmQgQXV0aG9ySUQgPSAnIi5kb3NsYXNoKCRhdXRob3IpLiInIjsKCSRt b250aCAgICAgPSAoISRtb250aCkgICAgID8gJycgOiAiIGFuZCBQb3N0ZWQgbGlrZSAnIi5k b1NsYXNoKCRtb250aCkuIiUnIjsKCSRpZCAgICAgICAgPSAoISRpZCkgICAgICAgID8gJycg OiAiIGFuZCBJRCA9ICciLmludHZhbCgkaWQpLiInIjsKCXN3aXRjaCAoJHRpbWUpIHsKCQlj YXNlICdhbnknOgoJCQkkdGltZSA9ICIiOyBicmVhazsKCQljYXNlICdmdXR1cmUnOgoJCQkk dGltZSA9ICIgYW5kIFBvc3RlZCA+IG5vdygpIjsgYnJlYWs7CgkJZGVmYXVsdDoKCQkJJHRp bWUgPSAiIGFuZCBQb3N0ZWQgPCBub3coKSI7Cgl9CglpZiAoIWlzX251bWVyaWMoJHN0YXR1 cykpCgkJJHN0YXR1cyA9IGdldFN0YXR1c051bSgkc3RhdHVzKTsKCgkkY3VzdG9tID0gJyc7 CgkvLyB0cnlpbmcgY3VzdG9tIGZpZWxkcyBoZXJlCgkkY3VzdG9tRmllbGRzID0gZ2V0Q3Vz dG9tRmllbGRzKCk7CglpZiAoJGN1c3RvbUZpZWxkcykgewoJCWZvcmVhY2goJGN1c3RvbUZp ZWxkcyBhcyAkY0ZpZWxkKSB7CgkJCWlmIChpc3NldCgkYXR0c1skY0ZpZWxkXSkpCgkJCQkk Y3VzdG9tUGFpcnNbJGNGaWVsZF0gPSAkYXR0c1skY0ZpZWxkXTsKCQl9CgkJaWYoIWVtcHR5 KCRjdXN0b21QYWlycykpCgkJCSRjdXN0b20gPSAgYnVpbGRDdXN0b21TcWwoJGN1c3RvbUZp ZWxkcywkY3VzdG9tUGFpcnMpOwoJCWVsc2UKCQkJJGN1c3RvbSA9ICcnOwoJfQoKCS8vQWxs b3cga2V5d29yZHMgZm9yIG5vLWN1c3RvbSBhcnRpY2xlcy4gVGhhdCB0YWdnaW5nIG1vZGUs IHlvdSBrbm93CglpZiAoJGtleXdvcmRzKSB7CgkJJGtleXMgPSBzcGxpdCgnLCcsJGtleXdv cmRzKTsKCQlmb3JlYWNoICgka2V5cyBhcyAka2V5KSB7CgkJCSRrZXlwYXJ0c1tdID0gIiBL ZXl3b3JkcyBsaWtlICclIi5kb1NsYXNoKHRyaW0oJGtleSkpLiIlJyI7CgkJfQoJCSRrZXl3 b3JkcyA9ICIgYW5kICgiIC4gam9pbignIG9yICcsJGtleXBhcnRzKSAuICIpIjsKCX0KCglp ZiAoJGlkKQoJCSRzdGF0dXNxID0gIiBhbmQgU3RhdHVzID49ICc0JyI7CgllbHNlCgkJJHN0 YXR1c3EgPSAiIGFuZCBTdGF0dXM9JyIuZG9TbGFzaCgkc3RhdHVzKS4iJyI7CgoJJHdoZXJl ID0gIjEiIC4gJHN0YXR1c3EuICR0aW1lLgoJCSRpZCAuICRjYXRlZ29yeSAuICRzZWN0aW9u IC4gJGV4Y2VycHRlZCAuICRtb250aCAuICRhdXRob3IgLiAka2V5d29yZHMgLiAkY3VzdG9t IC4gJGZyb250cGFnZTsKCgkJJHBnb2Zmc2V0ID0gJG9mZnNldCAuICcsICc7CgoJJHJzID0g c2FmZV9yb3dzX3N0YXJ0KCIqLCB1bml4X3RpbWVzdGFtcChQb3N0ZWQpIGFzIHVQb3N0ZWQi LCAndGV4dHBhdHRlcm4nLAoJCSR3aGVyZS4gJyBvcmRlciBieSAnIC4gZG9zbGFzaCgkc29y dGJ5KSAuICcgJyAuIGRvU2xhc2goJHNvcnRkaXIpIC4gJyBsaW1pdCAnIC4gZG9TbGFzaCgk bGltaXQpKTsKCglyZXR1cm4gJHJzOwp9CgoKCiI7czozOiJtZDUiO3M6MzI6Ijk0Nzg2ZjI4 ZWE4MWVlODFjZjIxNzNkYzFkYmQzN2ZmIjt9