# smd_lib v0.3 # Shared function library used by smd_ plugins and others. # Stef Dawson # http://stefdawson.com/ # ...................................................................... # This is a plugin for Textpattern - http://textpattern.com/ # To install: textpattern > admin > plugins # Paste the following text into the 'Install plugin' box: # ...................................................................... YTo5OntzOjc6InZlcnNpb24iO3M6MzoiMC4zIjtzOjY6ImF1dGhvciI7czoxMToiU3RlZiBE YXdzb24iO3M6MTA6ImF1dGhvcl91cmkiO3M6MjI6Imh0dHA6Ly9zdGVmZGF3c29uLmNvbS8i O3M6MTE6ImRlc2NyaXB0aW9uIjtzOjU2OiJTaGFyZWQgZnVuY3Rpb24gbGlicmFyeSB1c2Vk IGJ5IHNtZF8gcGx1Z2lucyBhbmQgb3RoZXJzLiI7czo0OiJ0eXBlIjtpOjI7czo0OiJuYW1l IjtzOjc6InNtZF9saWIiO3M6NDoiaGVscCI7czo4MzU2OiIJPGgxPnNtZF8gcGx1Z2luIGxp YnJhcnk8L2gxPgoKCTxwPk9mZmVycyBubyBwdWJsaWMgdGV4dHBhdHRlcm4gdGFncy4gSXQg aXMgc2ltcGx5IGEgc2hhcmVkIGxpYnJhcnkgb2YgY29tbW9uIGZ1bmN0aW9ucyB1c2VkIGJ5 IHNtZF8gcGx1Z2lucy48L3A+CgoJPGgyPkNoYW5nZWxvZzwvaDI+CgoJPHVsPgoJCTxsaT52 MC4xICAgMDctMDItMjUgSW5pdGlhbCBwdWJsaWMgcmVsZWFzZTwvbGk+CgkJPGxpPnYwLjIg ICAwNy0wMy0wMyBBZGRlZDogPHNwYW4gY2xhc3M9ImNhcHMiPk1MUDwvc3Bhbj4gKE11bHRp LUxpbmd1YWwgUGFjaykgbGlicmFyeSBzdXBwb3J0PC9saT4KCQk8bGk+djAuMjEgIDA3LTAz LTA2IEFkZGVkOiBpbnRlZ2VyIHJhbmdlIGZ1bmN0aW9uYWxpdHkuIDxjb2RlPnNtZF9nZXRB dHRzPC9jb2RlPiBub3cgdGFrZXMgYSBSZWdFeCBhcmc8L2xpPgoJCTxsaT52MC4yMWEgMDct MDMtMjEgRml4ZWQ6IENoYXJhY3RlciByYW5nZXMgaWdub3JlZCAodGhhbmtzIG1yZGFsZSk8 L2xpPgoJCTxsaT52MC4yMWIgMDctMDQtMDIgRml4ZWQ6IFN0aWNreSBhcnRpY2xlIHN1cHBv cnQgaW4gPGNvZGU+c21kX2dldEF0dHM8L2NvZGU+ICh0aGFua3MgcGllbWFuKTwvbGk+CgkJ PGxpPnYwLjIxYyAwNy0wNy0yOSBGaXhlZDogTnVtZXJpYyByYW5nZXMgaW4gY2F0ZWdvcmll cyAodGhhbmtzIHdvbGxlKTwvbGk+CgkJPGxpPnYwLjIxZCAwNy0wOC0wMyBGaXhlZDogTmVn YXRpb24gd2l0aCBtdWx0aXBsZSBlbGVtZW50czwvbGk+CgkJPGxpPnYwLjIxZSAwNy0wOS0x NCBGaXhlZDogQWJpbGl0eSB0byBsZWF2ZSBlbXB0eSBzcGxpdFJhbmdlIHBhcmFtZXRlcnMg aW50YWN0PC9saT4KCQk8bGk+djAuMjIgIDA3LTA5LTIwIEZpeGVkOiBVbmRlZmluZWQgaW5k ZXggd2FybmluZ3MgKHRoYW5rcyBBbWJpdGlvdXNsZW1vbikuIEVuaGFuY2VkIG1hdGNoZXMg c28gc3BhY2VzIGFyZSBhbGxvd2VkIGluIHN0cmluZ3MgKHRoYW5rcyBEclJvZ2cpPC9saT4K CQk8bGk+djAuMjMgIDA3LTA0LTA5IDxzcGFuIGNsYXNzPSJjYXBzIj5CRVRBPC9zcGFuPiA6 IEFkZGVkIHRoZSBGdXp6eUZpbmQgY2xhc3MgYW5kIGdldFdvcmQgZnVuY3Rpb24uIGdldEF0 dHMoKSBub3cgYWxsb3dzIDxjb2RlPj9xPC9jb2RlPjwvbGk+CgkJPGxpPnYwLjMgICAwNy0x MC0yOSBSZXdyb3RlIDxjb2RlPnNtZF9nZXRBdHRzPC9jb2RlPiBhcyA8Y29kZT5zbWRfZ2V0 T3B0czwvY29kZT4gdG8gYWxsb3cgcmVwbGFjZWQgdmFycyB3aXRoaW4gdGV4dC4gRGVwcmVj YXRlZCA8Y29kZT5zbWRfZ2V0QXR0czwvY29kZT4sIGFkZGVkIDxjb2RlPnNtZF9wcmVnUG9z PC9jb2RlPi4gQ2hhbmdlZCA8Y29kZT5zbWRfc3BsaXRSYW5nZTwvY29kZT4gYXMgPGNvZGU+ c21kX3NwbGl0PC9jb2RlPiB0byBhbGxvdyByYW5nZXMgdG8gYmUgc3dpdGNoZWQgb24gb3Ig b2ZmLiBEZXByZWNhdGVkIDxjb2RlPnNtZF9zcGxpdFJhbmdlPC9jb2RlPi4gQWRkZWQgZ2Vu ZXJpYyA8c3BhbiBjbGFzcz0iY2FwcyI+TUxQPC9zcGFuPiBjbGFzcyBzdXBwb3J0ICg8Y29k ZT5zbWRfTUxQPC9jb2RlPikuIERlcHJlY2F0ZWQgPGNvZGU+c21kTUxQPC9jb2RlPiBhcnJh eSwgPGNvZGU+c21kX2dUeHQ8L2NvZGU+IGFuZCA8Y29kZT5zbWRfZ2V0Q2FsbGVyPC9jb2Rl Pi4gTWFkZSA8Y29kZT5zbWRfRnV6enlGaW5kPC9jb2RlPiBhbmQgPGNvZGU+c21kX2dldFdv cmQ8L2NvZGU+IG9mZmljaWFsPC9saT4KCTwvdWw+CgoJPGgyPkZ1bmN0aW9uIFJlZmVyZW5j ZTwvaDI+CgoJPHA+PHN0cm9uZz5zbWRfYWRkUVNWYXI8L3N0cm9uZz48YnIgLz4KPHN0cm9u Zz5zbWRfcmVtb3ZlUVNWYXI8L3N0cm9uZz48L3A+CgoJPHA+QWRkIG9yIHJlbW92ZSBhIHF1 ZXJ5IHN0cmluZyB2YXJpYWJsZSB0byB0aGUgZ2l2ZW4gPHNwYW4gY2xhc3M9ImNhcHMiPlVS TDwvc3Bhbj4sIHRha2luZyBpbnRvIGFjY291bnQgYW55IGV4aXN0aW5nIHZhcmlhYmxlcyB0 aGF0IG1heSBiZSBpbiB0aGUgPHNwYW4gY2xhc3M9ImNhcHMiPlVSTDwvc3Bhbj4gYWxyZWFk eS4gJiM4MjIwO0FkZCYjODIyMTsgdGFrZXMgdGhyZWUgYXJndW1lbnRzLCAmIzgyMjA7UmVt b3ZlJiM4MjIxOyBqdXN0IHRha2VzIHRoZSBmaXJzdCB0d286PC9wPgoKCTxvbD4KCQk8bGk+ VGhlIDxzcGFuIGNsYXNzPSJjYXBzIj5VUkw8L3NwYW4+IHN0cmluZyB0byBhZGQgdG8vcmVt b3ZlIGZyb208L2xpPgoJCTxsaT5UaGUgaWQgb2YgdGhlIHF1ZXJ5c3RyaW5nICh0aGUgYml0 IGJlZm9yZSB0aGUgPSBzaWduKTwvbGk+CgkJPGxpPlRoZSB2YWx1ZSBvZiB0aGUgbmV3IHF1 ZXJ5c3RyaW5nICh0aGUgYml0IGFmdGVyIHRoZSA9IHNpZ24pPC9saT4KCTwvb2w+CgoJPHA+ ZS5nLiA8Y29kZT5zbWRfYWRkUVNWYXIoJHRoaXNhcnRpY2xlWyYjMzk7dXJsX3RpdGxlJiMz OTtdLCAmIzM5O3RwZyYjMzk7LCAxNSk7PC9jb2RlPiB3b3VsZCBhZGQgPGNvZGU+dHBnPTE1 PC9jb2RlPiB0byB0aGUgY3VycmVudCBhcnRpY2xlJiM4MjE3O3MgPHNwYW4gY2xhc3M9ImNh cHMiPlVSTDwvc3Bhbj4uIElmIHRoZXJlIGFyZSBubyBvdGhlciB2YXJpYWJsZXMgY3VycmVu dGx5IGluIHRoZSA8c3BhbiBjbGFzcz0iY2FwcyI+VVJMPC9zcGFuPiwgaXQgaXMgYWRkZWQg d2l0aCBhIHF1ZXN0aW9uIG1hcmssIG90aGVyd2lzZSBpdCBpcyBhcHBlbmRlZCB3aXRoIGFu IGFtcGVyc2FuZC48L3A+CgoJPHA+PHN0cm9uZz5zbWRfZ2V0U3ViQ2F0czwvc3Ryb25nPjwv cD4KCgk8cD5SZXR1cm5zIGFsbCA8c3BhbiBjbGFzcz0iY2FwcyI+VFhQPC9zcGFuPiBjYXRl Z29yaWVzIG9mIHRoZSBzcGVjaWZpZWQgdHlwZSBiZWxvdyA8ZW0+YW5kIGluY2x1ZGluZzwv ZW0+IHRoZSBnaXZlbiBwYXJlbnQgY2F0ZWdvcnkuPC9wPgoKCTxwPjxzdHJvbmc+c21kX2dl dE9wdHM8L3N0cm9uZz48L3A+CgoJPHA+U2VhcmNoZXMgdGhlIHBhc3NlZCBzdHJpbmcgZm9y IHByZWRldGVybWluZWQgc2VxdWVuY2VzIG9mIGNoYXJhY3RlcnMgYW5kLCBpZiB0aGF0IHNl cXVlbmNlIGlzIGluIHRoZSBnaXZlbiAkYWxsb3dlZCBhcnJheSwgcmVwbGFjZXMgaXQgYXMg Zm9sbG93czo8L3A+CgoJPHVsPgoJCTxsaT4/YyA9IGN1cnJlbnQgZ2xvYmFsIGNhdGVnb3J5 ICghYyA9IG5vdCBjdXJyZW50IGNhdGVnb3J5KTwvbGk+CgkJPGxpPj9zID0gY3VycmVudCBz ZWN0aW9uICghcyA9IG5vdCBjdXJyZW50IHNlY3Rpb24pPC9saT4KCQk8bGk+P3QgPSBjdXJy ZW50IGFydGljbGUgdGl0bGUgKCF0ID0gbm90IGN1cnJlbnQgdGl0bGUpPC9saT4KCQk8bGk+ P2lkID0gY3VycmVudCBhcnRpY2xlIElELCBwcmVwZW5kZWQgd2l0aCAkaWRwcmVmaXggKCFp ZCA9IG5vdCBjdXJyZW50IElEKTwvbGk+CgkJPGxpPj9xID0gY3VycmVudCBxdWVyeSB0ZXJt ICghcSA9IG5vdCBjdXJyZW50IHF1ZXJ5IHRlcm0pPC9saT4KCQk8bGk+P2ZpZWxkID0gY29u dGVudHMgb2YgdGhlIGN1cnJlbnQgYXJ0aWNsZSYjODIxNztzIGZpZWxkIChjb3VsZCBiZSBh IGNvbW1hLXNlcGFyYXRlZCBsaXN0KTwvbGk+CgkJPGxpPiFmaWVsZCA9IG5vdCB0aGUgY29u dGVudHMgb2YgdGhlIGN1cnJlbnQgYXJ0aWNsZSYjODIxNztzIGZpZWxkIChjb3VsZCBiZSBh IGNvbW1hLXNlcGFyYXRlZCBsaXN0KTwvbGk+Cgk8L3VsPgoKCTxwPkludGVnZXIgcmFuZ2Vz IChlLmcuIDEtNSkgd2lsbCBiZSBleHBhbmRlZCBpbnRvIHRoZWlyIGluZGl2aWR1YWwgdmFs dWVzIGlmIHRoZSAkYWxsb3dSYW5nZSBvcHRpb24gaXMgdHJ1ZTsgYW55dGhpbmcgZWxzZSBp cyByZXR1cm5lZCB2ZXJiYXRpbS4gSXQgb3V0cHV0cyB0d28gYXJyYXlzOiB0aGUgMXN0IGNv bnRhaW5zIGl0ZW1zIGZvciBpbmNsdXNpb24sIHRoZSAybmQgY29udGFpbnMgaXRlbXMgZm9y IGV4Y2x1c2lvbi48L3A+CgoJPHA+QXJncyAoIFsqXSA9IG1hbmRhdG9yeSApIDoKCTxvbD4K CQk8bGk+WypdIFRoZSBzdHJpbmcgdG8gc2VhcmNoIGZvciBtYXRjaGVzPC9saT4KCQk8bGk+ WypdIEFuIGFycmF5IGNvbnRhaW5pbmcgc2hvcnRjdXRzIHRoYXQgYXJlICYjODIyMDthbGxv d2VkJiM4MjIxOyB0byBiZSBmb3VuZCBpbiB0aGUgc3RyaW5nICg/YywgP3MsID90LCA/Zmll bGQgZXRjKTwvbGk+CgkJPGxpPlRoZSBwcmVmaXggZm9yID9pZCBzdHJpbmdzPC9saT4KCQk8 bGk+Qm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdG8gYWxsb3cgcmFuZ2UgZXhwYW5zaW9u IG9yIG5vdDwvbGk+CgkJPGxpPlJlZ0V4IHN0cmluZyB0byBzcGxpdCBvcHRpb25zIGF0IChz ZWUgc21kX3NwbGl0KTwvbGk+CgkJPGxpPnByZWdfc3BsaXQgb3B0aW9uIChzZWUgc21kX3Nw bGl0KTwvbGk+Cgk8L29sPjwvcD4KCgk8cD48c3Ryb25nPnNtZF9zcGxpdDwvc3Ryb25nPjwv cD4KCgk8cD5SZXR1cm4gYW4gYXJyYXkgb2YgaXRlbXMgZnJvbSBhIHN0cmluZyBvZiAodXN1 YWxseSkgY29tbWEtc2VwYXJhdGVkIHZhbHVlcy4gSWYgYW55IHZhbHVlcyBjb250YWluIHJh bmdlcyBvZiBudW1iZXJzIGxpa2UgMS01IHRoYXQgbmVlZCAmIzgyMTY7ZXhwYW5kaW5nJiM4 MjE3OyBmaXJzdCAoYW5kICRhbGxvd1JhbmdlIGlzIHRydWUpLCB0aGV5IGFyZSBkZWFsdCB3 aXRoLiBUYWtlcyB0aGUgZm9sbG93aW5nIGFyZ3VtZW50cyAoIFsqXSA9IG1hbmRhdG9yeSBh cmdzKSA6PC9wPgoKCTxvbD4KCQk8bGk+WypdIFRoZSBzdHJpbmcgdG8gc3BsaXQgdXA8L2xp PgoJCTxsaT5Cb29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0byBhbGxvdyByYW5nZSBleHBh bnNpb24gb3Igbm90IChpLmUuIDEtNSBiZWNvbWVzIDEsMiwzLDQsNSk8L2xpPgoJCTxsaT5U aGUgcmVndWxhciBleHByZXNzaW9uIGNoYXJhY3RlciBjbGFzc2VzIHRvIG1hdGNoLiBJZiBh IGZ1bGwgUmVnRXggc3RhcnRpbmcgYW5kIGVuZGluZyB3aXRoICYjODIxNjsvJiM4MjE3OyBj aGFyYWN0ZXJzIGlzIHN1cHBsaWVkLCB0aGUgZXhwcmVzc2lvbiBpcyB1c2VkIHZlcmJhdGlt LiBXaXRob3V0IHRoZSAmIzgyMTY7LyYjODIxNzsgY2hhcmFjdGVycywgdGhlIGV4cHJlc3Np b24gaXMgdHJlYXRlZCBhcyBhIGxpc3Qgb2YgY2hhcmFjdGVyIGNsYXNzZXMgdG8gZmluZC4g RGVmYXVsdHMgdG8gJiM4MjIwOy8oLHwsXHMpKy8mIzgyMjE7IHdoaWNoIGlzIGEgY29tbWEs IG9yIGNvbW1hIGFuZCBhIHdoaXRlc3BhY2UgY2hhcmFjdGVyLjwvbGk+CgkJPGxpPnByZWdf c3BsaXQgb3B0aW9uIGNvbnN0YW50IGFzIGRlZmluZWQgaW4gdGhlIHBocCBtYW51YWw8L2xp PgoJPC9vbD4KCgk8cD48c3Ryb25nPnNtZF9NTFA8L3N0cm9uZz48YnIgLz4KSW5zdGFudGlh dGUgb25lIG9mIHRoZXNlIHRvIGhhbmRsZSA8YWNyb255bSB0aXRsZT0iTXVsdGktTGluZ3Vh bCBQYWNrIj5NTFA8L2Fjcm9ueW0+IGluIHlvdXIgcGx1Z2luIGxpa2UgdGhpczo8L3A+CgoJ PHA+MSkgRGVjbGFyZSBhIHVuaXF1ZSBnbG9iYWwgdmFyaWFibGUsIGUuZy4gZ2xvYmFsICRt eVBsdWc8YnIgLz4KMikgRGVmaW5lIHlvdXIgZGVmYXVsdCBzdHJpbmcgcmVwbGFjZW1lbnQg YXJyYXkgKGRvZXNuJiM4MjE3O3QgbmVlZCB0byBiZSBnbG9iYWwpLCBlLmc6PC9wPgoKCTxw PgkkbXlTdHJpbmdzID0gYXJyYXkgKCYjODIyMDttc2cxJiM4MjIxOyA9PiAmIzgyMjA7VGhp cyBpcyBtZXNzYWdlIDEmIzgyMjE7LCAmIzgyMjA7bXNnMiYjODIyMTsgPT4gJiM4MjIwO1Ro aXMgaXMgbWVzc2FnZSAyJiM4MjIxOyk7PC9wPgoKCTxwPjMpIENyZWF0ZSBhbiA8c3BhbiBj bGFzcz0iY2FwcyI+TUxQPC9zcGFuPiBoYW5kbGVyOjwvcD4KCgk8cD4JJG15UGx1ZyA9IG5l dyBzbWRfTUxQKCYjODIyMDtwbHVnaW5fbmFtZSYjODIyMTssICYjODIyMDtwbHVnaW5fcHJl Zml4JiM4MjIxOywgJG15U3RyaW5ncyk7PC9wPgoKCTxwPjQpIFRoYXQmIzgyMTc7cyBpdCEg VGhlcmUgYXJlIHR3byBvcHRpb25hbCBhcmdzIHRvIHNtZF9NTFA6CglhKSB0aGUgZGVmYXVs dCAoZnVsbCkgbGFuZ3VhZ2UgdG8gdXNlLCBlLmcgJiM4MjIwO2RhLWRrJiM4MjIxOy4gRGVm YXVsdHMgdG8gJiM4MjIwO2VuLWdiJiM4MjIxOy4KCWIpIHRoZSBpbnRlcmZhY2UgdGhlIHN0 cmluZ3MgYXJlIGZvci4gQ2hvb3NlIGZyb20gJiM4MjIwO3B1YmxpYyYjODIyMTsgKHRoZSBk ZWZhdWx0KSwgJiM4MjIwO2FkbWluJiM4MjIxOyBvciAmIzgyMjA7Y29tbW9uJiM4MjIxOzwv cD4KCgk8cD41KSBUbyB1c2UgYSByZXBsYWNlbWVudCBzdHJpbmcgaW4geW91ciBjb2RlOgoJ YSkgTWFrZSBzdXJlIHRvIGltcG9ydCB0aGUgdW5pcXVlIGdsb2JhbCB2YXJpYWJsZTogZS5n LiBnbG9iYWwgJG15UGx1ZzsKCWIpIENhbGwgJG15UGx1Zy0+Z1R4dCgmIzgyMjA7bWVzc2Fn ZUlEJiM4MjIxOyk7IFsgZS5nLiAkbXlQbHVnLT5nVHh0KCYjODIyMDttc2cxJiM4MjIxOykg XQoJYykgSWYgeW91IHdhbnQgdG8gcmVwbGFjZSBhbnkgYXJncyBpbiB5b3VyIG1lc3NhZ2Ug c3RyaW5nLCBwYXNzIGFuIGFzc29jaWF0aXZlIGFycmF5IGFzIHRoZSAybmQgYXJnIHRvIGdU eHQoKTwvcD4KCgk8cD48c3Ryb25nPnNtZF9GdXp6eUZpbmQ8L3N0cm9uZz48L3A+CgoJPHA+ QSA8c3BhbiBjbGFzcz0iY2FwcyI+UEhQPC9zcGFuPiBjbGFzcyBmb3IgYXBwcm94aW1hdGUg c3RyaW5nIHNlYXJjaGluZyBvZiBsYXJnZSB0ZXh0IG1hc3NlcywgYWRhcHRlZCAoKmNvdWdo KiBib3Jyb3dlZCkgZnJvbSBodHRwOi8vZWxvbmVuLmlraS5maS9jb2RlL21pc2Mtbm90ZXMv YXBwci1zZWFyY2gtcGhwLy4gSW5zdGFudGlhdGUgb25lIG9mIHRoZXNlIGFuZCBwYXNzIGl0 IHRoZSBzdHJpbmcgcGF0dGVybi93b3JkIHlvdSBhcmUgbG9va2luZyBmb3IgYW5kIGEgbnVt YmVyIGluZGljYXRpbmcgaG93IGNsb3NlIHRoYXQgbWF0Y2ggaGFzIHRvIGJlL21pbmltdW0g bGVuZ3RoIG9mIHN0cmluZ3MgdG8gY29uc2lkZXIgKGkuZS4gdGhlIGFtb3VudCBvZiBlcnJv ciB0b2xlcmFibGUpLiAwPWNsb3NlIG1hdGNoL3Nob3J0IHdvcmRzOyAxMD1wcmV0dHkgbXVj aCBldmVyeSBsb25nICgxMCBjaGFyIG1pbmltdW0pIHN0cmluZyBpbiB0aGUgd29ybGQuIFBy YWN0aWNhbCB2YWx1ZXMgYXJlIHVzdWFsbHkgMSBvciAyLCBzb21ldGltZXMgMy48L3A+CgoJ PHA+VXNhZ2UgZXhhbXBsZTo8YnIgLz4KLnByZSAgJGZpbmRlciA9IG5ldyBzbWRfRnV6enlG aW5kKCRwYXR0LCAkbWF4X2Vycik7CiAgaWYgKCRmaW5kZXItPnRvb19zaG9ydF9lcnIpCiAg ICAkZXJyb3IgPSAmIzgyMjA7VW5hYmxlIHRvIHNlYXJjaDogdXNlIGxvbmdlciBwYXR0ZXJu IG9yIHJlZHVjZSBlcnJvciB0b2xlcmFuY2UuJiM4MjIxOzs8L3A+CgogIHdoaWxlKCR0ZXh0 ID0gZ2V0X25leHRfcGFnZV9vZl90ZXh0KCkpIHsKICAgICRtYXRjaGVzID0gJGZpbmRlci0+ c2VhcmNoKCR0ZXh0KTsKICAgIHdoaWxlKGxpc3QoJGlkeCwkcm5nKSA9IGVhY2goJG1hdGNo ZXMpKQogICAgICBwcmludCAmIzgyMjA7TWF0Y2ggZm91bmQgZW5kaW5nIGF0IHBvc2l0aW9u ICRpZHggd2l0aCBhIGNsb3NlbmVzcyBvZiAkdmFsXG4mIzgyMjE7OwogIH0KCgk8cD5UaGUg Y29kZSB1c2VzIGluaXRpYWwgZmlsdGVyaW5nIHRvIHNvcnQgb3V0IHBvc3NpYmxlIG1hdGNo IGNhbmRpZGF0ZXMgYW5kIHRoZW4gYXBwbGllcyBhIHNsb3dlciBjaGFyYWN0ZXItYnktY2hh cmFjdGVyIHNlYXJjaCAoc2VhcmNoX3Nob3J0KCkpIGFnYWluc3QgdGhlbS48L3A+CgoJPHA+ PHN0cm9uZz5zbWRfZ2V0V29yZDwvc3Ryb25nPjwvcD4KCgk8cD5Vc2VmdWwgd2l0aCBGdXp6 eUZpbmQ6IGl0IHRha2VzIGEgc3RyaW5nIGFuZCBhbiBvZmZzZXQgaW50byB0aGF0IHN0cmlu ZyBhbmQgcmV0dXJucyB0aGUgbmVhcmVzdCAmIzgyMjA7d29yZCYjODIyMTsgYmVmb3JlIHRo YXQgb2Zmc2V0IHBvc2l0aW9uLiBJZiB0aGUgb2Zmc2V0IGlzIG5vdCBzdXBwbGllZCBpdCBz dGFydHMgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzdHJpbmcsIHRodXMgcmV0dXJuaW5n IHRoZSBmaXJzdCB3b3JkLjwvcD4KCgk8cD5UYWtlcyAzIGFyZ3M6Cgk8b2w+CgkJPGxpPlsq XSBUaGUgKHVzdWFsbHkgbG9vb25nKSBzdHJpbmcgdG8gbG9vayBpbjwvbGk+CgkJPGxpPlsq XSBUaGUgd29yZCB0byBsb29rIGZvcjwvbGk+CgkJPGxpPlRoZSBvZmZzZXQgaW50byB0aGUg c3RyaW5nIGF0IHdoaWNoIHRvIHN0YXJ0IGxvb2tpbmc8L2xpPgoJPC9vbD48L3A+CgoJPHA+ PHN0cm9uZz5zbWRfcHJlZ1Bvczwvc3Ryb25nPjwvcD4KCgk8cD5MaWZ0ZWQgZnJvbSBvbmUg b2YgdGhlIGNvbW1lbnRzIGluIHRoZSA8c3BhbiBjbGFzcz0iY2FwcyI+UEhQPC9zcGFuPiBt YW51YWwsIHRoaXMganVzdCBsb29rcyBmb3IgYSBSZWdFeCBzdHJpbmcgd2l0aGluIGFub3Ro ZXIsIHJldHVybmluZyB0aGUgbWF0Y2hlcyBpdCBmaW5kcyBhbmQgdGhlIHBvc2l0aW9uIG9m IHRoZSBmaXJzdCBtYXRjaC48L3A+IjtzOjQ6ImNvZGUiO3M6MTc1MTI6IgovLyBzbWRNTFAg REVQUkVDQVRFRDogdXNlIHNtZF9NTFAgY2xhc3MgaW5zdGVhZApnbG9iYWwgJHNtZE1MUDsK JHNtZE1MUCA9IGFycmF5KAoJCSdzbWRfc2xpbWJveCcgPT4gJ3NtZF9zYm94JywKCQknc21k X3NsaW1ib3hfaW5jJyA9PiAnc21kX3Nib3gnLAoJCSdzbWRfcmFuZG9tX2Jhbm5lcicgPT4g J3NtZF9yYmFuJywKCQknc21kX3B1bGxxdW90ZScgPT4gJ3NtZF9wcXVvJywKKTsKLy8gU29m dHdhcmUgZW5naW5lZXJzIGxvb2sgYXdheSBub3cgdW5sZXNzIHlvdSB3aXNoIHRvIGJlIGhv cnJpZmllZCBieSB0aGUgYW1vdW50Ci8vIG9mIGNvdXBsaW5nIGFuZCBjb2hlc2lvbiBpbiB0 aGVzZSBmdW5jdGlvbnMuIEknbSB3YXJuaW5nIHlvdS4uLiBpdCdzIG5vdCBwcmV0dHkKY2xh c3Mgc21kX0Z1enp5RmluZCB7CgkvLyBUaGUgbGFzdCAzIHBhcmFtZXRlcnMgYXJlIGZvciBv cHRpbWl6YXRpb24gb25seSwgdG8gYXZvaWQgdGhlCgkvLyBzdXJwcmlzaW5nbHkgc2xvdyBz dHJsZW4oKSBhbmQgc3Vic3RyKCkgY2FsbHM6CgkvLyAgLSAkc3RhcnRfaW5kZXggPSBmcm9t IHdoaWNoIGNoYXJhY3RlciBvZiAkdGV4dCB0byBzdGFydCB0aGUgc2VhcmNoCgkvLyAgLSAk bWF4X2xlbiA9IG1heGltdW0gY2hhcmFjdGVyIHRvIHNlYXJjaCAoc3RhcnRpbmcgZnJvbSAk c3RhcnRfaW5kZXgpCgkvLyAgLSAkdGV4dF9zdHJsZW4gPQoJLy8gVGhlIHJldHVybiB2YWx1 ZSBpcyBhbiBhcnJheSBvZiBtYXRjaGVzOgoJLy8gICBBcnJheSggWzxtYXRjaC1lbmQtaW5k ZXg+XSA9PiA8ZXJyb3I+LCAuLi4gKQoJLy8gTm90ZTogPGVycm9yPiBpcyBnZW5lcmFsbHkg Tk9UIGFuIGV4YWN0IGVkaXQgZGlzdGFuY2UgYnV0IHJhdGhlciBhCgkvLyBsb3dlciBib3Vu ZC4gVGhpcyBpcyB1bmZvcnR1bmF0ZSBidXQgdGhlIHJvdXRpbmUgd291bGQgYmUgc2xvd2Vy IGlmCgkvLyB0aGUgZXhhY3QgZXJyb3Igd2FzIGNhbGN1bGF0ZSBhbG9uZyB3aXRoIHRoZSBt YXRjaGVzLgoJLy8gVGhlIGZ1bmN0aW9uIGlzIGJhc2VkIG9uIHRoZSBub24tZGV0ZXJtaW5p c3RpYyBhdXRvbWF0b24gc2ltdWxhdGlvbgoJLy8gYWxnb3JpdGhtICh3aXRob3V0IGJpdCBw YXJhbGxlbGlzbSBvcHRpbWl6YXRpb25zKS4KCWZ1bmN0aW9uIHNlYXJjaF9zaG9ydCgkcGF0 dCwgJGssICR0ZXh0LCAkc3RhcnRfaW5kZXg9MCwgJG1heF9sZW49LTEsICR0ZXh0X3N0cmxl bj0tMSkgewoJCWlmICggJHRleHRfc3RybGVuIDwgMCApCgkJCSR0ZXh0X3N0cmxlbiA9IHN0 cmxlbiggJHRleHQgKTsKCgkJaWYgKCAkbWF4X2xlbiA8IDAgKQoJCQkkbWF4X2xlbiA9ICR0 ZXh0X3N0cmxlbjsKCgkJJHN0YXJ0X2luZGV4ID0gbWF4KCAwLCAkc3RhcnRfaW5kZXggKTsK CQkkbiA9IG1pbiggJG1heF9sZW4sICR0ZXh0X3N0cmxlbi0kc3RhcnRfaW5kZXggKTsKCQkk bSA9IHN0cmxlbiggJHBhdHQgKTsKCQkkZW5kX2luZGV4ID0gJHN0YXJ0X2luZGV4ICsgJG47 CgoJCS8vIElmICR0ZXh0IGlzIHNob3J0ZXIgdGhhbiAkcGF0dCwgdXNlIHRoZSBidWlsdC1p bgoJCS8vIGxldmVuc2h0ZWluKCkgaW5zdGVhZDoKCQlpZiAoJG4gPCAkbSkKCQl7CgkJCSRs ZXYgPSBsZXZlbnNodGVpbihzdWJzdHIoJHRleHQsICRzdGFydF9pbmRleCwgJG4pLCAkcGF0 dCk7CgkJCWlmICggJGxldiA8PSAkayApCgkJCQlyZXR1cm4gQXJyYXkoICRzdGFydF9pbmRl eCskbi0xID0+ICRsZXYgKTsKCQkJZWxzZQoJCQkJcmV0dXJuIEFycmF5KCk7CgkJfQoKCQkk cyA9IEFycmF5KCk7CgkJZm9yICgkaT0wOyAkaTwkbTsgJGkrKykKCQl7CgkJCSRjID0gJHBh dHR7JGl9OwoJCQlpZiAoIGlzc2V0KCRzWyRjXSkpCgkJCQkkc1skY10gPSBtaW4oJGksICRz WyRjXSk7CgkJCWVsc2UKCQkJCSRzWyRjXSA9ICRpOwoJCX0KCgkJaWYgKCAkZW5kX2luZGV4 IDwgJHN0YXJ0X2luZGV4ICkKCQkJcmV0dXJuIEFycmF5KCk7CgoJCSRtYXRjaGVzID0gQXJy YXkoKTsKCQkkZGEgPSAkZGIgPSByYW5nZSgwLCAkbS0kaysxKTsKCgkJJG1rID0gJG0tJGs7 CgoJCWZvciAoJHQ9JHN0YXJ0X2luZGV4OyAkdDwkZW5kX2luZGV4OyAkdCsrKQoJCXsKCQkJ JGMgPSAkdGV4dHskdH07CgkJCSRpbl9wYXR0ID0gaXNzZXQoJHNbJGNdKTsKCgkJCWlmICgk dCYxKSB7ICRkPSYkZGE7ICRlPSYkZGI7IH0KCQkJZWxzZSB7ICRkPSYkZGI7ICRlPSYkZGE7 IH0KCgkJCWZvciAoJGk9MTsgJGk8PSRtazsgJGkrKykKCQkJewoJCQkJJGcgPSBtaW4oICRr KzEsICRlWyRpXSsxLCAkZVskaSsxXSsxICk7CgoJCQkJLy8gVE9ETzogb3B0aW1pemUgdGhp cyB3aXRoIGEgbG9vay11cC10YWJsZT8KCQkJCWlmICggJGluX3BhdHQgKQoJCQkJCWZvciAo JGo9JGVbJGktMV07ICgkajwkZyAmJiAkajw9JG1rKTsgJGorKykKCQkJCQkJaWYgKCAkcGF0 dHskaSskai0xfSA9PSAkYyApCgkJCQkJCQkkZyA9ICRqOwoKCQkJCSRkWyRpXSA9ICRnOwoJ CQl9CgoJCQlpZiAoICRkWyRta10gPD0gJGsgKQoJCQl7CgkJCQkkZXJyID0gJGRbJG1rXTsK CQkJCSRpID0gbWluKCAkdC0kZXJyKyRrKzEsICRzdGFydF9pbmRleCskbi0xKTsKCQkJCWlm ICggIWlzc2V0KCRtYXRjaGVzWyRpXSkgfHwgJGVyciA8ICRtYXRjaGVzWyRpXSkKCQkJCQkk bWF0Y2hlc1skaV0gPSAkZXJyOwoJCQl9CgkJfQoKCQl1bnNldCggJGRhLCAkZGIgKTsKCQly ZXR1cm4gJG1hdGNoZXM7Cgl9CglmdW5jdGlvbiB0ZXN0X3Nob3J0X3NlYXJjaCgpIHsKCQkk dGVzdF90ZXh0ID0gIk9saXBhIGtlcnJhbiBqdXNzaSBiaiZ4bGluZyBqYSBrb2xtZVxuIGls b2lzdGEgIi4KCQkJImp1c3NpIGJmb3JsaW5nOmlhIG11dHRhIGVpIHlodGFhbiBqdXNzaSBi am9ybGluZy1uaW1pc3RhIGxhdWxhamFhLiI7CgkJJHRlc3RfcGF0dCA9ICJqdXNzaSBiam9y bGluZyI7CgkJYXNzZXJ0KCAkdGhpcy0+c2VhcmNoX3Nob3J0KCR0ZXN0X3BhdHQsIDQsICR0 ZXN0X3RleHQpID09IEFycmF5KDI3PT4yLCA2MD0+MSwgOTQ9PjApKTsKCQlhc3NlcnQoICR0 aGlzLT5zZWFyY2hfc2hvcnQoJHRlc3RfcGF0dCwgMiwgJHRlc3RfdGV4dCkgPT0gQXJyYXko Mjc9PjIsIDYwPT4xLCA5ND0+MCkpOwoJCWFzc2VydCggJHRoaXMtPnNlYXJjaF9zaG9ydCgk dGVzdF9wYXR0LCAxLCAkdGVzdF90ZXh0KSA9PSBBcnJheSg2MD0+MSwgOTQ9PjApKTsKCQlh c3NlcnQoICR0aGlzLT5zZWFyY2hfc2hvcnQoJHRlc3RfcGF0dCwgMCwgJHRlc3RfdGV4dCkg PT0gQXJyYXkoOTQ9PjApKTsKCQlhc3NlcnQoICR0aGlzLT5zZWFyY2hfc2hvcnQoImJqb3Js aW5nIiwgMiwgJHRlc3RfdGV4dCwgMTksIDcpID09IEFycmF5KCkpOwoJCWFzc2VydCggJHRo aXMtPnNlYXJjaF9zaG9ydCgiYmpvcmxpbmciLCAyLCAkdGVzdF90ZXh0LCAxOSwgOCkgPT0g QXJyYXkoMjY9PjIpKTsKCQlhc3NlcnQoICR0aGlzLT5zZWFyY2hfc2hvcnQoImJqb3JsaW5n IiwgMiwgJHRlc3RfdGV4dCwgMjAsIDgpID09IEFycmF5KCkpOwoJfQoKCXZhciAkcGF0dCwg JHBhdHRfbGVuLCAkbWF4X2VycjsKCXZhciAkcGFydHMsICRuX3BhcnRzLCAkdW5pcXVlX3Bh cnRzLCAkbWF4X3BhcnRfbGVuOwoJdmFyICR0cmFuc2ZfcGF0dDsKCXZhciAkdG9vX3Nob3J0 X2VycjsKCWZ1bmN0aW9uIHNtZF9GdXp6eUZpbmQoICRwYXR0ZXJuLCAkbWF4X2Vycm9yICkg ewoJCSR0aGlzLT5wYXR0ID0gJHBhdHRlcm47CgkJJHRoaXMtPnBhdHRfbGVuID0gc3RybGVu KCR0aGlzLT5wYXR0KTsKCQkkdGhpcy0+bWF4X2VyciA9ICRtYXhfZXJyb3I7CgoJCS8vIENh bGN1bGF0ZSBwYXR0ZXJuIHBhcnRpdGlvbiBzaXplCgkJJGludHBhcnRsZW4gPSBmbG9vcigk dGhpcy0+cGF0dF9sZW4vKCR0aGlzLT5tYXhfZXJyKzIpKTsKCQlpZiAoJGludHBhcnRsZW4g PCAxKQoJCXsKCQkJJHRoaXMtPnRvb19zaG9ydF9lcnIgPSBUcnVlOwoJCQlyZXR1cm47CgkJ fQoJCWVsc2UgJHRoaXMtPnRvb19zaG9ydF9lcnIgPSBGYWxzZTsKCgkJLy8gUGFydGl0aW9u IHRoZSBwYXR0ZXJuIGZvciBwcnVuaW5nCgkJJHRoaXMtPnBhcnRzID0gQXJyYXkoKTsKCQlm b3IgKCRpPTA7ICRpPCR0aGlzLT5wYXR0X2xlbjsgJGkrPSRpbnRwYXJ0bGVuKQoJCXsKCQkJ aWYgKCAkaSArICRpbnRwYXJ0bGVuKjIgPiAkdGhpcy0+cGF0dF9sZW4gKQoJCQl7CgkJCQkk dGhpcy0+cGFydHNbXSA9IHN1YnN0ciggJHRoaXMtPnBhdHQsICRpICk7CgkJCQlicmVhazsK CQkJfQoJCQllbHNlCgkJCQkkdGhpcy0+cGFydHNbXSA9IHN1YnN0ciggJHRoaXMtPnBhdHQs ICRpLCAkaW50cGFydGxlbiApOwoJCX0KCQkkdGhpcy0+bl9wYXJ0cyA9IGNvdW50KCR0aGlz LT5wYXJ0cyk7CgoJCS8vIFRoZSBpbnRwYXJ0bGVuIHRlc3QgYWJvdmUgc2hvdWxkIGhhdmUg Y292ZXJlZCB0aGlzOgoJCWFzc2VydCggJHRoaXMtPm5fcGFydHMgPj0gJHRoaXMtPm1heF9l cnIrMSApOwoKCQkvLyBGaW5kIG1heGltdW0gcGFydCBsZW5ndGgKCQlmb3JlYWNoKCAkdGhp cy0+cGFydHMgYXMgJHAgKQoJCQkkdGhpcy0+bWF4X3BhcnRfbGVuID0gbWF4KCAkdGhpcy0+ bWF4X3BhcnRfbGVuLCBzdHJsZW4oJHApKTsKCgkJLy8gTWFrZSBhIG5ldyBwYXJ0IGFycmF5 IHdpdGggZHVwbGljYXRlIHN0cmluZ3MgcmVtb3ZlZAoJCSR0aGlzLT51bmlxdWVfcGFydHMg PSBhcnJheV91bmlxdWUoJHRoaXMtPnBhcnRzKTsKCgkJLy8gVHJhbnNmb3JtIHRoZSBwYXR0 ZXJuIGludG8gYSBsb3cgcmVzb2x1dGlvbiBwcnVuaW5nIHN0cmluZwoJCS8vIGJ5IHJlcGxh Y2luZyBwYXJ0cyB3aXRoIHNpbmdsZSBjaGFyYWN0ZXJzCgkJJHRoaXMtPnRyYW5zZl9wYXR0 ID0gIiI7CgkJcmVzZXQoICR0aGlzLT5wYXJ0cyApOwoJCXdoaWxlIChsaXN0KCwkcCkgPSBl YWNoKCR0aGlzLT5wYXJ0cykpCgkJICAgJHRoaXMtPnRyYW5zZl9wYXR0IC49IGNocihhcnJh eV9zZWFyY2goJHAsICR0aGlzLT51bmlxdWVfcGFydHMpK29yZCgiQSIpKTsKCgkJLy8gU2Vs ZiBkaWFnbm9zdGljcwoJCSR0aGlzLT50ZXN0X3Nob3J0X3NlYXJjaCgpOwoJfQoJZnVuY3Rp b24gc2VhcmNoKCAkdGV4dCApIHsKCQkvLyBGaW5kIGFsbCBvY2N1cmVuY2VzIG9mIHVuaXF1 ZSBwYXJ0cyBpbiB0aGUKCQkvLyBmdWxsIHRleHQuIFRoZSByZXN1bHQgaXMgYW4gYXJyYXk6 CgkJLy8gICBBcnJheSggPGluZGV4PiA9PiA8cGFydCM+LCAuLiApCgkJJHBhcnRfbWFwID0g QXJyYXkoKTsKCQlyZXNldCggJHRoaXMtPnVuaXF1ZV9wYXJ0cyApOwoJCXdoaWxlIChsaXN0 KCRwaSwgJHBhcnRfc3RyKSA9IGVhY2goJHRoaXMtPnVuaXF1ZV9wYXJ0cykpCgkJewoJCQkk cG9zID0gc3RycG9zKCR0ZXh0LCAkcGFydF9zdHIpOwoJCQl3aGlsZSAoICRwb3MgIT09IEZh bHNlICkKCQkJewoJCQkJJHBhcnRfbWFwWyRwb3NdID0gJHBpOwoJCQkJJHBvcyA9IHN0cnBv cygkdGV4dCwgJHBhcnRfc3RyLCAkcG9zKzEpOwoJCQl9CgkJfQoJCWtzb3J0KCAkcGFydF9t YXAgKTsgLy8gU29ydCBieSBzdHJpbmcgaW5kZXgKCgkJLy8gVGhlIGZvbGxvd2luZyBjb2Rl IGRvZXMgc2V2ZXJhbCB0aGluZ3Mgc2ltdWx0YW5lb3VzbHk6CgkJLy8gIDEpIERpdmlkZSB0 aGUgaW5kaWNlcyBpbnRvIGdyb3VwcyB1c2luZyBnYXBzCgkJLy8JICBsYXJnZXIgdGhhbiAk dGhpcy0+bWF4X2VyciBhcyBib3VuZGFyaWVzLgoJCS8vICAyKSBUcmFuc2xhdGUgdGhlIGdy b3VwcyBpbnRvIHN0cmluZ3Mgc28gdGhhdAoJCS8vCSAgcGFydCMgMCA9ICdBJywgcGFydCMg MSA9ICdCJyBldGMuIHRvIG1ha2UKCQkvLwkgIGEgbG93IHJlc29sdXRpb24gYXBwcm94aW1h dGUgc2VhcmNoIHBvc3NpYmxlIGxhdGVyCgkJLy8gIDMpIFNhdmUgdGhlIHN0cmluZyBpbmRp Y2VzIGluIHRoZSBmdWxsIHN0cmluZwoJCS8vCSAgdGhhdCBjb3JyZXNwb25kIHRvIGNoYXJh Y3RlcnMgaW4gdGhlIHRyYW5zbGF0ZWQgc3RyaW5nLgoJCS8vICA0KSBEaXNjYXJkIGdyb3Vw cyAoPXBhcnQgc2VxdWVuY2VzKSB0aGF0IGFyZSB0b28KCQkvLwkgIHNob3J0IHRvIGNvbnRh aW4gdGhlIGFwcHJveGltYXRlIHBhdHRlcm4uCgkJLy8gVGhlIGZvcm1hdCBvZiByZXN1bHRp bmcgYXJyYXk6CgkJLy8gICBBcnJheSgKCQkvLwkgIEFycmF5KCAiPHRyYW5zbGF0ZS1zdHJp bmc+IiwKCQkvLwkJCSBBcnJheSggPHRyYW5zbGF0ZWQtaWR4PiA9PiA8ZnVsbC1pbmRleD4s IC4uLiApICksCgkJLy8JICAuLi4gKQoJCSR0cmFuc2YgPSBBcnJheSgpOwoJCSR0cmFuc2Zf dGV4dCA9ICIiOwoJCSR0cmFuc2ZfcG9zID0gQXJyYXkoKTsKCQkkbGFzdF9lbmQgPSAwOwoJ CSRncm91cF9sZW4gPSAwOwoJCXJlc2V0KCAkcGFydF9tYXAgKTsKCQl3aGlsZSAobGlzdCgk aSwkcCkgPSBlYWNoKCRwYXJ0X21hcCkpCgkJewoJCQlpZiAoICRpLSRsYXN0X2VuZCA+ICR0 aGlzLT5tYXhfcGFydF9sZW4rJHRoaXMtPm1heF9lcnIgKQoJCQl7CgkJCQlpZiAoICRncm91 cF9sZW4gPj0gKCR0aGlzLT5uX3BhcnRzLSR0aGlzLT5tYXhfZXJyKSkKCQkJCQkkdHJhbnNm W10gPSBBcnJheSggJHRyYW5zZl90ZXh0LCAkdHJhbnNmX3BvcyApOwoKCQkJCSR0cmFuc2Zf dGV4dCA9ICIiOwoJCQkJJHRyYW5zZl9wb3MgPSBBcnJheSgpOwoJCQkJJGdyb3VwX2xlbiA9 IDA7CgkJCX0KCgkJCSR0cmFuc2ZfdGV4dCAuPSBjaHIoJHAgKyBvcmQoIkEiKSk7CgkJCSR0 cmFuc2ZfcG9zW10gPSAkaTsKCQkJJGdyb3VwX2xlbisrOwoJCQkkbGFzdF9lbmQgPSAkaSAr IHN0cmxlbigkdGhpcy0+cGFydHNbJHBdKTsKCQl9CgkJaWYgKCBzdHJsZW4oICR0cmFuc2Zf dGV4dCApID49ICgkdGhpcy0+bl9wYXJ0cy0kdGhpcy0+bWF4X2VycikpCgkJCSR0cmFuc2Zb XSA9IEFycmF5KCAkdHJhbnNmX3RleHQsICR0cmFuc2ZfcG9zICk7CgoJCXVuc2V0KCAkdHJh bnNmX3RleHQsICR0cmFuc2ZfcG9zICk7CgoJCWlmICggY3VycmVudCgkdHJhbnNmKSA9PT0g RmFsc2UgKQoJCQlyZXR1cm4gQXJyYXkoKTsKCgkJLy8gRmlsdGVyIHRoZSByZW1haW5pbmcg Z3JvdXBzICgiYXBwcm94aW1hdGUgYW5hZ3JhbXMiCgkJLy8gb2YgdGhlIHBhdHRlcm4pIGFu ZCBsZWF2ZSBvbmx5IHRoZSBvbmVzIHRoYXQgaGF2ZSBlbm91Z2gKCQkvLyBwYXJ0cyBpbiBj b3JyZWN0IG9yZGVyLiBZb3UgY2FuIHRoaW5rIG9mIHRoaXMgbGFzdCBzdGVwIG9mIHRoZQoJ CS8vIGFsZ29yaXRobSBhcyBhICpsb3cgcmVzb2x1dGlvbiogYXBwcm94aW1hdGUgc3RyaW5n IHNlYXJjaC4KCQkvLyBUaGUgcmVzdWx0IGlzIGFuIGFycmF5IG9mIGNhbmRpZGF0ZSB0ZXh0 IHNwYW5zIHRvIGJlIHNjYW5uZWQ6CgkJLy8gICBBcnJheSggQXJyYXkoPGZ1bGwtc3RhcnQt aWR4PiwgPGZ1bGwtZW5kLWlkeD4pLCAuLi4gKQoJCSRwYXJ0X3Bvc2l0aW9ucyA9IEFycmF5 KCk7CgkJd2hpbGUgKGxpc3QoLGxpc3QoJHN0ciwgJHBvc19tYXApKSA9IGVhY2goJHRyYW5z ZikpCgkJewovLwkJCXByaW50ICJ8JHRyYW5zZl9wYXR0fCAtIHwkc3RyfFxuIjsKCQkJJGxv cmVzX21hdGNoZXMgPSAkdGhpcy0+c2VhcmNoX3Nob3J0KCAkdGhpcy0+dHJhbnNmX3BhdHQs ICR0aGlzLT5tYXhfZXJyLCAkc3RyICk7CgkJCXdoaWxlIChsaXN0KCR0cl9lbmQsICkgPSBl YWNoKCRsb3Jlc19tYXRjaGVzKSkKCQkJewoJCQkJJHRyX3N0YXJ0ID0gbWF4KDAsICR0cl9l bmQgLSAkdGhpcy0+bl9wYXJ0cyk7CgkJCQlpZiAoICR0cl9lbmQgPj0gJHRyX3N0YXJ0ICkK CQkJCXsKCQkJCQkkbWVkaWFuX3BvcyA9ICRwb3NfbWFwWyAoaW50KSgoJHRyX3N0YXJ0KyR0 cl9lbmQpLzIpIF07CgkJCQkJJHN0YXJ0ID0gJG1lZGlhbl9wb3MgLSAoJHRoaXMtPnBhdHRf bGVuLzIrMSkgLSAkdGhpcy0+bWF4X2VyciAtICR0aGlzLT5tYXhfcGFydF9sZW47CgkJCQkJ JGVuZCA9ICRtZWRpYW5fcG9zICsgKCR0aGlzLT5wYXR0X2xlbi8yKzEpICsgJHRoaXMtPm1h eF9lcnIgKyAkdGhpcy0+bWF4X3BhcnRfbGVuOwoKLy8JCQkJCXByaW50ICIjIiAuIHN0cnRy KHN1YnN0ciggJHRleHQsICRzdGFydCwgJGVuZC0kc3RhcnQgKSwgIlxuXHIiLCAiJCQiKSAu ICIjXG4iOwovLwkJCQkJcHJpbnRfciggJHRoaXMtPnNlYXJjaF9zaG9ydCggJiR0aGlzLT5w YXR0LCAkdGhpcy0+bWF4X2VyciwgJiR0ZXh0LCAkc3RhcnQsICRlbmQtJHN0YXJ0ICkpOwoK CQkJCQkkcGFydF9wb3NpdGlvbnNbXSA9IEFycmF5KCRzdGFydCwgJGVuZCk7CgkJCQl9CgkJ CX0KCQkJdW5zZXQoICRsb3Jlc19tYXRjaGVzICk7CgkJfQoJCXVuc2V0KCAkdHJhbnNmICk7 CgoJCWlmICggY3VycmVudCgkcGFydF9wb3NpdGlvbnMpID09PSBGYWxzZSApCgkJCXJldHVy biBBcnJheSgpOwoKCQkvLyBTY2FuIHRoZSBmaW5hbCBjYW5kaWRhdGVzIGFuZCBwdXQgdGhl IG1hdGNoZXMgaW4gYSBuZXcgYXJyYXk6CgkJJG1hdGNoZXMgPSBBcnJheSgpOwoJCSR0ZXh0 X2xlbiA9IHN0cmxlbigkdGV4dCk7CgkJd2hpbGUgKGxpc3QoLCBsaXN0KCRzdGFydCwgJGVu ZCkpID0gZWFjaCgkcGFydF9wb3NpdGlvbnMpKQoJCXsKCQkJJG0gPSAkdGhpcy0+c2VhcmNo X3Nob3J0KCAkdGhpcy0+cGF0dCwgJHRoaXMtPm1heF9lcnIsICR0ZXh0LCAkc3RhcnQsICRl bmQtJHN0YXJ0LCAkdGV4dF9sZW4gKTsKCQkJd2hpbGUgKGxpc3QoJGksICRjb3N0KSA9IGVh Y2goJG0pKQoJCQkJJG1hdGNoZXNbJGldID0gJGNvc3Q7CgkJfQoJCXVuc2V0KCRwYXJ0X3Bv c2l0aW9ucyk7CgoJCXJldHVybiAkbWF0Y2hlczsKCX0KfQpjbGFzcyBzbWRfTUxQIHsKCXZh ciAkc21kX3N0cmluZ3M7Cgl2YXIgJHNtZF9vd25lcjsKCXZhciAkc21kX3ByZWZpeDsKCXZh ciAkc21kX2xhbmc7Cgl2YXIgJHNtZF9ldmVudDsKCWZ1bmN0aW9uIHNtZF9NTFAoJHBsdWcs ICRwcmVmeCwgJHN0cmFycmF5LCAkbG5nPSdlbi1nYicsICRldj0ncHVibGljJykgewoJCSR0 aGlzLT5zbWRfb3duZXIgPSAkcGx1ZzsKCQkkdGhpcy0+c21kX3ByZWZpeCA9ICRwcmVmeDsK CQkkdGhpcy0+c21kX3N0cmluZ3MgPSAkc3RyYXJyYXk7CgkJJHRoaXMtPnNtZF9sYW5nID0g JGxuZzsKCQkkdGhpcy0+c21kX2V2ZW50ID0gJGV2OwoJCXJlZ2lzdGVyX2NhbGxiYWNrKGFy cmF5KCYkdGhpcywgJ3NtZF9DYWxsYmFjaycpLCAnbDEwbi5lbnVtZXJhdGVfc3RyaW5ncycp OwoJfQoJZnVuY3Rpb24gc21kX0NhbGxiYWNrKCRldmVudD0nbDEwbi5lbnVtZXJhdGVfc3Ry aW5ncycsICRzdGVwPScnLCAkcHJlPTApIHsKCQkkciA9IGFycmF5KAoJCQknb3duZXInID0+ ICR0aGlzLT5zbWRfb3duZXIsCgkJCSdwcmVmaXgnID0+ICR0aGlzLT5zbWRfcHJlZml4LAoJ CQknbGFuZycgPT4gJHRoaXMtPnNtZF9sYW5nLAoJCQknZXZlbnQnID0+ICR0aGlzLT5zbWRf ZXZlbnQsCgkJCSdzdHJpbmdzJyA9PiAkdGhpcy0+c21kX3N0cmluZ3MsCgkJKTsKCQlyZXR1 cm4gJHI7Cgl9CgkvLyBHZW5lcmljIGxvb2t1cAoJLy8gICR3aGF0ID0ga2V5IHRvIGxvb2sg dXAKCS8vICAkYXJncyA9IGFueSBhcmd1bWVudHMgdGhlIGtleSBpcyBleHBlY3RpbmcgZm9y IHJlcGxhY2VtZW50CglmdW5jdGlvbiBnVHh0KCR3aGF0LCAkYXJncyA9IGFycmF5KCkpIHsK CQlnbG9iYWwgJHRleHRhcnJheTsKCgkJLy8gUHJlcGFyZSB0aGUgcHJlZml4ZWQga2V5IGZv ciB1c2UKCQkka2V5ID0gJHRoaXMtPnNtZF9wcmVmaXggLiAnLScgLiAkd2hhdDsKCQkka2V5 ID0gc3RydG9sb3dlcigka2V5KTsKCgkJLy8gR3JhYiBmcm9tIHRoZSBnbG9iYWwgdGV4dGFy cmF5IChwb3NzaWJseSBlZGl0ZWQgYnkgTUxQKSBpZiB3ZSBjYW4KCQlpZihpc3NldCgkdGV4 dGFycmF5WyRrZXldKSkgewoJCQkkc3RyID0gJHRleHRhcnJheVska2V5XTsKCQl9IGVsc2Ug ewoJCQkvLyBUaGUgc3RyaW5nIGlzbid0IGluIHRoZSBsb2NhbGlzZWQgdGV4dGFycmF5IHNv IGZhbGxiYWNrIHRvIHVzaW5nCgkJCS8vIHRoZSAobm9uIHByZWZpeGVkKSBzdHJpbmcgYXJy YXkgaW4gdGhlIHBsdWdpbgoJCQkka2V5ID0gc3RydG9sb3dlcigkd2hhdCk7CgkJCSRzdHIg PSAoaXNzZXQoJHRoaXMtPnNtZF9zdHJpbmdzWyRrZXldKSkgPyAkdGhpcy0+c21kX3N0cmlu Z3NbJGtleV0gOiAkd2hhdDsKCQl9CgkJLy8gUGVyZm9ybSBzdWJzdGl0dXRpb25zCgkJaWYo IWVtcHR5KCRhcmdzKSkgewoJCQkkc3RyID0gc3RydHIoJHN0ciwgJGFyZ3MpOwoJCX0KCgkJ cmV0dXJuICRzdHI7Cgl9Cn0KZnVuY3Rpb24gc21kX2FkZFFTVmFyKCR1cmwsICRrZXksICR2 YWx1ZSkgewoJJHVybCA9IHNtZF9yZW1vdmVRU1ZhcigkdXJsLCAka2V5KTsKCWlmIChzdHJw b3MoJHVybCwgJz8nKSA9PT0gZmFsc2UpIHsKCQlyZXR1cm4gKCR1cmwgLiAnPycgLiAka2V5 IC4gJz0nIC4gJHZhbHVlKTsKCX0gZWxzZSB7CgkJcmV0dXJuICgkdXJsIC4gJyYnIC4gJGtl eSAuICc9JyAuICR2YWx1ZSk7Cgl9Cn0KZnVuY3Rpb24gc21kX3JlbW92ZVFTVmFyKCR1cmws ICRrZXkpIHsKCSR1cmwgPSBwcmVnX3JlcGxhY2UoJy8oLiopKFw/fCYpJyAuICRrZXkgLiAn PVteJl0rPygmKSguKikvaScsICckMSQyJDQnLCAkdXJsIC4gJyYnKTsKCSR1cmwgPSBzdWJz dHIoJHVybCwgMCwgLTEpOwoJcmV0dXJuICgkdXJsKTsKfQpmdW5jdGlvbiBzbWRfZ2V0U3Vi Q2F0cygkcGFyZW50LCRjYXR0eXBlKSB7CgkkcGFyZW50ID0gZG9TbGFzaCgkcGFyZW50KTsK CSRsZXh0cmVtID0gMTsgJHJleHRyZW0gPSAxOwoJZXh0cmFjdChzYWZlX3JvdygibGZ0IGFz IGxleHRyZW0sIHJndCBhcyByZXh0cmVtIiwgInR4cF9jYXRlZ29yeSIsICJuYW1lPSckcGFy ZW50JyBhbmQgdHlwZSA9ICckY2F0dHlwZSciKSk7CgkkcnMgPSBzYWZlX3Jvd3Nfc3RhcnQo ImlkLG5hbWUsdGl0bGUiLCJ0eHBfY2F0ZWdvcnkiLCAibGZ0IGJldHdlZW4gJGxleHRyZW0g YW5kICRyZXh0cmVtIGFuZCB0eXBlID0gJyRjYXR0eXBlJyBvcmRlciBieSBsZnQgYXNjIik7 CgkkY2F0cyA9IGFycmF5KCk7CgoJd2hpbGUgKCRyb3cgPSBuZXh0Um93KCRycykpIHsKCQkk Y2F0c1tdID0gYXJyYXkoCgkJCSdpZCcgPT4gJHJvd1snaWQnXSwKCQkJJ25hbWUnID0+ICRy b3dbJ25hbWUnXSwKCQkJJ3RpdGxlJyA9PiAkcm93Wyd0aXRsZSddCgkJKTsKCX0KCXJldHVy biAkY2F0czsKfQovLyBERVBSRUNBVEVEOiBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkg b25seQpmdW5jdGlvbiBzbWRfZ2V0QXR0cygkc3RyLCAkYWxsb3dlZCwgJGlkcHJlZml4PSIi LCAkc3BsaXRhdD0iLygsfCxccykrLyIsICRwcmVnb3B0ID0gUFJFR19TUExJVF9OT19FTVBU WSkgewoJcmV0dXJuIHNtZF9nZXRPcHRzKCRzdHIsICRhbGxvd2VkLCAkaWRwcmVmaXgsIHRy dWUsICRzcGxpdGF0LCAkcHJlZ29wdCk7Cn0KZnVuY3Rpb24gc21kX2dldE9wdHMoJHN0ciwg JGFsbG93ZWQsICRpZHByZWZpeD0iIiwgJGFsbG93UmFuZ2U9dHJ1ZSwgJHNwbGl0YXQ9Ii8o LHwsXHMpKy8iLCAkcHJlZ29wdCA9IFBSRUdfU1BMSVRfTk9fRU1QVFkpIHsKCWdsb2JhbCAk cHJldGV4dCwgJHRoaXNhcnRpY2xlOwoKCSRvdXQgPSBhcnJheSgpOwoJJHN1Ym91dCA9IGFy cmF5KCk7Cgkkbm90b3V0ID0gYXJyYXkoKTsKCSRtYXRjaGVzID0gc21kX3NwbGl0KCRzdHIs ICRhbGxvd1JhbmdlLCAkc3BsaXRhdCwgJHByZWdvcHQpOwoJLy8gQW4gYXJyYXkgdGhhdCB0 ZWxscyB0aGUgbG9vcCB3aGF0IHRvIGRvIHdpdGggZWFjaCBvZiB0aGUgdmFsaWQgc3RyaW5n cwoJLy8gIGFyZzE6IHR5cGUgKDE9ZXhhY3QgbWF0Y2gsIDI9YW55d2hlcmUgd2l0aGluIHN0 cmluZywgMz1jdXN0b20gZmllbGQpCgkvLyAgYXJnMjogcHJlZml4LCBpZiBhbnkKCS8vICBh cmczOiB2YXJpYWJsZSB0byBzdWJzdGl0dXRlCgkvLyAgYXJnNDogZXh0cmEgY2hlY2ssIGlm IGFwcGxpY2FibGUKCS8vICBhcmc1OiBzdG9yZSBpbiB0aGUgaW4vZXhjbHVkZSBsaXN0ICgx PWluY2x1ZGU7IDI9ZXhjbHVkZSkKCSRvcHQgPSBhcnJheSgKCQkiP2MiID0+IGFycmF5KDIs ICIiLCAkcHJldGV4dFsnYyddLCAiMSIsIDEpLAoJCSIhYyIgPT4gYXJyYXkoMiwgIiIsICRw cmV0ZXh0WydjJ10sICIxIiwgMiksCgkJIj9zIiA9PiBhcnJheSgyLCAiIiwgJHByZXRleHRb J3MnXSwgIjEiLCAxKSwKCQkiIXMiID0+IGFycmF5KDIsICIiLCAkcHJldGV4dFsncyddLCAi MSIsIDIpLAoJCSI/cSIgPT4gYXJyYXkoMiwgIiIsICRwcmV0ZXh0WydxJ10sICIxIiwgMSks CgkJIiFxIiA9PiBhcnJheSgyLCAiIiwgJHByZXRleHRbJ3EnXSwgIjEiLCAyKSwKCQkiP3Qi ID0+IGFycmF5KDIsICIiLCAkdGhpc2FydGljbGVbJ3VybF90aXRsZSddLCAnJHRoaXNhcnRp Y2xlIT1OVUxMJywgMSksCgkJIiF0IiA9PiBhcnJheSgyLCAiIiwgJHRoaXNhcnRpY2xlWyd1 cmxfdGl0bGUnXSwgJyR0aGlzYXJ0aWNsZSE9TlVMTCcsIDIpLAoJCSI/aWQiID0+IGFycmF5 KDEsICRpZHByZWZpeCwgJHByZXRleHRbJ2lkJ10sICckdGhpc2FydGljbGUhPU5VTEwnLCAx KSwKCQkiIWlkIiA9PiBhcnJheSgxLCAkaWRwcmVmaXgsICRwcmV0ZXh0WydpZCddLCAnJHRo aXNhcnRpY2xlIT1OVUxMJywgMiksCgkJIj8iID0+IGFycmF5KDMsICIiLCAiIiwgJyR0aGlz YXJ0aWNsZSE9TlVMTCcsIDEpLAoJCSIhIiA9PiBhcnJheSgzLCAiIiwgIiIsICckdGhpc2Fy dGljbGUhPU5VTEwnLCAyKSwKCSk7CgoJZm9yICgkaWR4ID0gMDsgJGlkeCA8IGNvdW50KCRt YXRjaGVzKTsgJGlkeCsrKSB7CgkJJG1hdGNoZWQgPSBmYWxzZTsKCQkkdGhpc21hdGNoID0g JG1hdGNoZXNbJGlkeF07CgkJZm9yZWFjaCAoJG9wdCBhcyAkdmFyID0+ICRhcmdzKSB7CgkJ CSRvcHZhciA9ICgkYXJnc1s0XSA9PSAxKSA/ICJvdXQiIDogIm5vdG91dCI7CgkJCXN3aXRj aCAoJGFyZ3NbMF0pIHsKCQkJCWNhc2UgMToKCQkJCQlpZiAoKCR0aGlzbWF0Y2ggPT09ICR2 YXIpICYmIGluX2FycmF5KCR2YXIsJGFsbG93ZWQpKSB7CgkJCQkJCSRtYXRjaGVkID0gdHJ1 ZTsKCQkJCQkJaWYgKCRhcmdzWzJdICE9ICIiICYmICRhcmdzWzNdKSB7CgkJCQkJCQkkcmVw ID0gc3RyX3JlcGxhY2UoJHZhciwgJGFyZ3NbMV0uJGFyZ3NbMl0sICR0aGlzbWF0Y2gpOwoJ CQkJCQkJaWYgKCFpbl9hcnJheSgkcmVwLCAkeyRvcHZhcn0pKSB7CgkJCQkJCQkJJHskb3B2 YXJ9W10gPSAkcmVwOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJfQoJCQkJCWJyZWFrOwoJCQkJ Y2FzZSAyOgoJCQkJCSRwYXQgPSAnL1xcJy4kdmFyLickfFxcJy4kdmFyLidbXkEtWmEtejAt OV0vJzsKCQkJCQlpZiAoKGlzX2ludChzbWRfcHJlZ1BvcygkcGF0LCAkdGhpc21hdGNoLCAk Zm5kKSkpICYmIGluX2FycmF5KCR2YXIsJGFsbG93ZWQpKSB7CgkJCQkJCSRtYXRjaGVkID0g dHJ1ZTsKCQkJCQkJaWYgKCRhcmdzWzJdICE9ICIiICYmICRhcmdzWzNdKSB7CgkJCQkJCQkk cmVwID0gc3RyX3JlcGxhY2UoJHZhciwgJGFyZ3NbMV0uJGFyZ3NbMl0sICR0aGlzbWF0Y2gp OwoJCQkJCQkJaWYgKCFpbl9hcnJheSgkcmVwLCAkeyRvcHZhcn0pKSB7CgkJCQkJCQkJJHsk b3B2YXJ9W10gPSAkcmVwOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJfQoJCQkJCWJyZWFrOwoJ CQkJY2FzZSAzOgoJCQkJCSRsZW4gPSBzdHJsZW4oJHZhcik7CgkJCQkJaWYgKChzdWJzdHIo JHRoaXNtYXRjaCwwLCRsZW4pID09PSAkdmFyKSAmJiBpbl9hcnJheSgkdmFyLiJmaWVsZCIs JGFsbG93ZWQpKSB7CgkJCQkJCSRtYXRjaGVkID0gdHJ1ZTsKCQkJCQkJLy8gVXNlIHRoZSBn aXZlbiBmaWVsZCBuYW1lOyB3aGljaCBtYXkgYmUgYSBjb21tYS1zZXBhcmF0ZWQgc3VibGlz dC4KCQkJCQkJLy8gU3BsaXQgb2ZmIHRoZSBmaWVsZCBuYW1lIGZyb20gdGhlIHF1ZXN0aW9u IG1hcmsKCQkJCQkJJGZpZWxkbmFtZSA9IHN1YnN0cigkdGhpc21hdGNoLCRsZW4pOwoJCQkJ CQlpZiAoKCRhcmdzWzNdKSAmJiAoaXNzZXQoJHRoaXNhcnRpY2xlW3N0cnRvbG93ZXIoJGZp ZWxkbmFtZSldKSkpIHsKCQkJCQkJCSRmaWVsZENvbnRlbnRzID0gJHRoaXNhcnRpY2xlW3N0 cnRvbG93ZXIoJGZpZWxkbmFtZSldOwoJCQkJCQl9IGVsc2UgewoJCQkJCQkJJGZpZWxkQ29u dGVudHMgPSAkZmllbGRuYW1lOwoJCQkJCQl9CgkJCQkJCWlmICghZW1wdHkoJGZpZWxkQ29u dGVudHMpKSB7CgkJCQkJCQkkc3Vib3V0ID0gc21kX3NwbGl0KHN0cmlwX3RhZ3MoJGZpZWxk Q29udGVudHMpLCAkYWxsb3dSYW5nZSwgJHNwbGl0YXQsICRwcmVnb3B0KTsKCQkJCQkJCWZv cmVhY2ggKCRzdWJvdXQgYXMgJHN1Ym5hbWUpIHsKCQkJCQkJCQlpZiAoIWluX2FycmF5KCRz dWJuYW1lLCAkeyRvcHZhcn0pKSB7CgkJCQkJCQkJCSR7JG9wdmFyfVtdID0gJHN1Ym5hbWU7 CgkJCQkJCQkJfQoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJfQoJCQkJCWJyZWFrOwoJCQl9CgkJ CWlmICgkbWF0Y2hlZCkgewoJCQkJYnJlYWs7CgkJCX0KCQl9CgkJaWYgKCEkbWF0Y2hlZCkg ewoJCQkvLyBBc3NpZ24gdGhlIHZhcmlhYmxlIHZlcmJhdGltCgkJCWlmICghaW5fYXJyYXko JHRoaXNtYXRjaCwgJG91dCkpIHsKCQkJCSRvdXRbXSA9ICR0aGlzbWF0Y2g7CgkJCX0KCQl9 Cgl9CglyZXR1cm4gYXJyYXkoJG91dCwkbm90b3V0KTsKfQovLyBERVBSRUNBVEVEOiBmb3Ig YmFja3dhcmRzIGNvbXBhdGliaWxpdHkgb25seQpmdW5jdGlvbiBzbWRfc3BsaXRSYW5nZSgk c3RyLCAkc3BsaXRhdD0iLygsfCxccykrLyIsICRwcmVnb3B0ID0gUFJFR19TUExJVF9OT19F TVBUWSkgewoJcmV0dXJuIHNtZF9zcGxpdCgkc3RyLCB0cnVlLCAkc3BsaXRhdCwgJHByZWdv cHQpOwp9CmZ1bmN0aW9uIHNtZF9zcGxpdCgkc3RyLCAkYWxsb3dSYW5nZT10cnVlLCAkc3Bs aXRhdD0iLygsfCxccykrLyIsICRwcmVnb3B0ID0gUFJFR19TUExJVF9OT19FTVBUWSkgewoJ JHJldGFyciA9IGFycmF5KCk7CglpZiAoKHN1YnN0cigkc3BsaXRhdCwwLDEpID09ICIvIikg JiYgKHN1YnN0cigkc3BsaXRhdCwgc3RybGVuKCRzcGxpdGF0KS0xLCAxKSA9PSAiLyIpKSB7 CgkJJHBhdCA9ICRzcGxpdGF0OwoJfSBlbHNlIHsKCQkkcGF0ID0gJy9bJy4kc3BsaXRhdC4n XSsvJzsKCX0KCSRlbGVtcyA9IHByZWdfc3BsaXQoJHBhdCwgJHN0ciwgLTEsICRwcmVnb3B0 KTsKCWZvcmVhY2ggKCRlbGVtcyBhcyAkaXRlbSkgewoJCSRpdGVtID0gdHJpbSgkaXRlbSk7 CgkJJG5lZ2F0ZSA9IGZhbHNlOwoJCS8vIERvZXMgdGhlIGl0ZW0gc3RhcnQgd2l0aCBhIG5l Z2F0aW9uIGNoYXJhY3RlcgoJCWlmIChzdWJzdHIoJGl0ZW0sMCwxKSA9PT0gIiEiKSB7CgkJ CSRuZWdhdGUgPSB0cnVlOwoJCQkkaXRlbSA9IHN1YnN0cigkaXRlbSwxKTsKCQl9CgkJLy8g SXMgdGhlIGl0ZW0gYW4gaW50ZWdlciBsaXN0IHJhbmdlCgkJaWYgKCRhbGxvd1JhbmdlICYm IHByZWdfbWF0Y2goJy9eKFxkKylcLShcZCspJC8nLCAkaXRlbSkpIHsKCQkJbGlzdCgkbG8s ICRoaSkgPSBleHBsb2RlKCItIiwgJGl0ZW0sIDIpOwoJCQkkcm5nID0gcmFuZ2UoJGxvLCAk aGkpOwoJCQkvLyBSZWFwcGx5IHRoZSBuZWdhdGlvbiBpZiBuZWNlc3NhcnkKCQkJZm9yKCRp ZHggPSAwOyAkaWR4IDwgY291bnQoJHJuZyk7ICRpZHgrKykgewoJCQkJJHJuZ1skaWR4XSA9 ICgoJG5lZ2F0ZSkgPyAiISIgOiAiIikgLiAkcm5nWyRpZHhdOwoJCQl9CgkJCSRyZXRhcnIg PSBhcnJheV9tZXJnZSgkcmV0YXJyLCAkcm5nKTsKCQl9IGVsc2UgewoJCQkkcmV0YXJyW10g PSAoKCRuZWdhdGUpID8gIiEiIDogIiIpIC4gJGl0ZW07CgkJfQoJfQoJcmV0dXJuICRyZXRh cnI7Cn0KLy8gU3RvbGVuIGZyb20gcGhwLm5ldDogc3RycG9zIHBhZ2UgY29tbWVudHMKZnVu Y3Rpb24gc21kX3ByZWdQb3MoJHNQYXR0ZXJuLCAkc1N1YmplY3QsICYkRm91bmRTdHJpbmcs ICRpT2Zmc2V0ID0gMCkgewoJJEZvdW5kU3RyaW5nID0gbnVsbDsKCWlmIChwcmVnX21hdGNo KCRzUGF0dGVybiwgJHNTdWJqZWN0LCAkYU1hdGNoZXMsIFBSRUdfT0ZGU0VUX0NBUFRVUkUs ICRpT2Zmc2V0KSA+IDApIHsKCQkkRm91bmRTdHJpbmcgPSAkYU1hdGNoZXNbMF1bMF07CgkJ cmV0dXJuICRhTWF0Y2hlc1swXVsxXTsKCX0gZWxzZSB7CgkJcmV0dXJuIGZhbHNlOwoJfQp9 CmZ1bmN0aW9uIHNtZF9nZXRXb3JkKCRoYXlzdGFjaywkc2VhcmNodGVybSwkb2Zmc2V0PTAp IHsKCSRudW13b3JkcyA9IHN0cl93b3JkX2NvdW50KCRzZWFyY2h0ZXJtKTsKCSRoYXlzdGFj ayA9IHN0cnJldihzdWJzdHIoJGhheXN0YWNrLDAsJG9mZnNldCsxKSk7Cgkkc3BhY2VQb3Mg PSAxOwoJZm9yICgkaWR4ID0gMDsgJGlkeCA8ICRudW13b3JkczsgJGlkeCsrKSB7CgkJJHNw YWNlUG9zID0gKHN0cnBvcygkaGF5c3RhY2ssICIgIiwgJHNwYWNlUG9zKSkrMTsKCX0KCXJl dHVybiB0cmltKHN0cnJldihzdWJzdHIoJGhheXN0YWNrLCAwLCAkc3BhY2VQb3MpKSk7Cn0K Ly9ERVBSRUNBVEVEOiB1c2Ugc21kX01MUC0+Z1R4dCgpIGluc3RlYWQKLy8gR2VuZXJpYyBs b29rdXAgZnVuY3Rpb24gZm9yIGludGVyZmFjaW5nIHdpdGggTUxQIHRvIGxvY2FsaXNlIHN0 cmluZ3MuCi8vICAkc3RyYXkgPSBhcnJheSBvZiBkZWZhdWx0IHN0cmluZ3MKLy8gICR3aGF0 ID0ga2V5IHRvIGxvb2sgdXAKLy8gICRhcmdzID0gYW55IGFyZ3VtZW50cyB0aGUga2V5IGlz IGV4cGVjdGluZyBmb3IgcmVwbGFjZW1lbnQKZnVuY3Rpb24gc21kX2dUeHQoJHN0cmF5LCAk d2hhdCwgJGFyZ3MgPSBhcnJheSgpKSB7CglnbG9iYWwgJHRleHRhcnJheSwgJHNtZE1MUDsK CSRmbiA9IHNtZF9nZXRDYWxsZXIoKTsKCgkvLyBEcm9wIG91dCBpZiB0aGUgaWQgaXNuJ3Qg ZGVmaW5lZC4KCS8vIFdvdWxkIGJlIG5pY2UgdG8gdXNlIHJlZmxlY3Rpb24gdG8gZmluZCB0 aGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24gYW5kIHBhc3MgdGhhdCwKCS8vIGJ1dCB0aGF0J3Mg UEhQNSB0ZXJyaXRvcnkgb25seQoJaWYgKGVtcHR5KCRmbikpIHsKCQkkc3RyID0gJHdoYXQ7 Cgl9IGVsc2UgewoJCS8vIFByZXBhcmUgdGhlIHByZWZpeGVkIGtleSBmb3IgdXNlCgkJJGtl eSA9ICRzbWRNTFBbJGZuXSAuICctJyAuICR3aGF0OwoJCSRrZXkgPSBzdHJ0b2xvd2VyKCRr ZXkpOwoKCQkvLyBHcmFiIGZyb20gdGhlIGdsb2JhbCB0ZXh0YXJyYXkgKHBvc3NpYmx5IGVk aXRlZCBieSBNTFApIGlmIHdlIGNhbgoJCWlmKGlzc2V0KCR0ZXh0YXJyYXlbJGtleV0pKSB7 CgkJCSRzdHIgPSAkdGV4dGFycmF5WyRrZXldOwoJCX0gZWxzZSB7CgkJCS8vIFRoZSBzdHJp bmcgaXNuJ3QgaW4gdGhlIGxvY2FsaXNlZCAkdGV4dGFycmF5IHNvIGZhbGxiYWNrIHRvIHVz aW5nCgkJCS8vIHRoZSAobm9uIHByZWZpeGVkKSBzdHJpbmcgYXJyYXkgaW4gdGhlIHBsdWdp bgoJCQkka2V5ID0gc3RydG9sb3dlcigkd2hhdCk7CgkJCSRzdHIgPSAoaXNzZXQoJHN0cmF5 WyRrZXldKSkgPyAkc3RyYXlbJGtleV0gOiAkd2hhdDsKCQl9Cgl9CgkvLyBQZXJmb3JtIHN1 YnN0aXR1dGlvbnMKCWlmKCFlbXB0eSgkYXJncykpIHsKCQkkc3RyID0gc3RydHIoJHN0ciwg JGFyZ3MpOwoJfQoJcmV0dXJuICRzdHI7Cn0KLy9ERVBSRUNBVEVEOiBXaWxsIGJlIHJlbW92 ZWQgaW4gdGhlIG5leHQgcmVsZWFzZQovLyBDaGVhdGluZyB3YXkgb2YgZmluZGluZyBhIGZ1 bmN0aW9uJ3MgY2FsbGVyCmZ1bmN0aW9uIHNtZF9nZXRDYWxsZXIoKSB7CgkkYmFja3RyYWNl ID0gZGVidWdfYmFja3RyYWNlKCk7CglyZXR1cm4gJGJhY2t0cmFjZVsyXVsnZnVuY3Rpb24n XTsKfQoiO3M6MzoibWQ1IjtzOjMyOiIyNGU1ZDRiOWNiNWY5YmFkMjU4ZTI1YzBkMTBhNjU0 ZCI7fQ==