IyEvYmluL2Jhc2gKIyBXSU5FIEluc3RhbGxhdGlvbiBzY3JpcHQKIyBDYW4gZG8gYWxtb3N0IGV2ZXJ5dGhpbmcgZnJvbSBjb21waWxpbmcgdG8gY29uZmlndXJpbmcuLi4KCiMgTWFyIDMxIDE5OTkgLSBPdmUgS+V2ZW4KIyAgRmlyc3QgdmVyc2lvbgojIERlYyA5IDE5OTkgLSBPdmUgS+V2ZW4KIyAgcmVxdWlyZSBYcG0KIyBGZWIgMjUgMjAwMCAtIE92ZSBL5XZlbgojICBhdXRvLWFkZCAvdXNyL2xvY2FsL2xpYiB0byAvZXRjL2xkLnNvLmNvbmYKIyBNYXIgMiAyMDAwIC0gT3ZlIEvldmVuCiMgIHNvdXJjZSByYXRoZXIgdGhhbiBncmVwIGNvbmZpZy5jYWNoZQojICB1c2Ugc291cmNlZCBjb25maWcuY2FjaGUgdG8gc3RhcnQgbGRjb25maWcKIyAgcmVjb25maWd1cmUgaWYgY29uZmlnLmNhY2hlIGRvZXNuJ3QgZXhpc3QKIyBNYXIgMzAgMjAwMCAtIE92ZSBL5XZlbgojICBhdXRvY29uZmlndXJlIG5vLXdpbmRvd3MgaW5zdGFsbHMKIyAgZG8gbm90IGluc3RhbGwgcmVnaXN0cnkgb24gcmVhbC13aW5kb3dzIGluc3RhbGxzCiMgIHNvbWUgc3VwcG9ydCBmb3IgYmluYXJ5IHBhY2thZ2UgaW5zdGFsbHMKIyAgc2V0IGFuZCB0ZWxsIHVzZXIgYWJvdXQgTERfTElCUkFSWV9QQVRIIGlmIG5lY2Vzc2FyeQojICBzZXQgRVhUUkFfTERfTElCUkFSWV9QQVRIIGluIHdpbmUuY29uZgojIEFwciA5IDIwMDAgLSBPdmUgS+V2ZW4KIyAgbWFrZSByb290J3MgcmVnaXN0cnkgZ2xvYmFsIChzeXN0ZW0tZGVmYXVsdCkKIyBNYXkgOSAyMDAwIC0gT3ZlIEvldmVuCiMgIHVzZSB0dHlkcnYgd2hlbiBydW5uaW5nIHJlZ2FwaSwgc28gd2UgZG9uJ3QgaGF2ZSB0byBydW4gZnJvbSBYCiMgIGNoYW5nZSBkZWJ1Z2dlciBwYXRoIGluIHJlZ2lzdHJ5CiMgT2N0IDI5IDIwMDAgLSBPdmUgS+V2ZW4KIyAgYWRkZWQgLS1lbmFibGUtb3BlbmdsIHRvIGRlZmF1bHQgY29uZmFyZ3MKIyAgYWRkZWQgY29uZl9xdWVzdGlvbiwgY29uZl95ZXNub19hbnN3ZXIsIGFuZCBjb25mX3N0cmluZ19hbnN3ZXIgZnVuY3Rpb25zCiMgIGFkZGVkIERFRkNBVCB2YXJpYWJsZQojIChsYXRlciB0aGF0IGRheS4uLikKIyAgYWRkZWQgY29uZl9yZXNldF9xdWVzdGlvbiBmdW5jdGlvbgojICBhZGRlZCBmaWxlIGV4aXN0ZW5jZSBjaGVja3MgdG8gdGhlIHJlZ2lzdHJ5IGNvcHlpbmcKIyAgZml4ZWQgcHJvYmxlbSB3aXRoIG5vLXdpbmRvd3MgZGlyZWN0b3J5IGNyZWF0aW9uCiMgIHNvbWUgdGV4dCByZWZvcm1hdHRpbmcgZnJvbSBFcmljIE1hcnluaWFrCgojLS0tIGRlZmF1bHRzIChjaGFuZ2UgdGhlc2UgaWYgeW91IGFyZSBhIHBhY2thZ2VyKQpDT05GQVJHUz0tLWVuYWJsZS1vcGVuZ2wgICAgICAjIGNvbmZpZ3VyZSBhcmdzLCBlLmcuIC0tcHJlZml4PS91c3IgLS1zeXNjb25mZGlyPS9ldGMKcHJlZml4PS91c3IvbG9jYWwgICAgICAgICAgICAgIyBpbnN0YWxsYXRpb24gcHJlZml4CnN5c2NvbmZkaXI9JHByZWZpeC9ldGMgICAgICAgICMgd2hlcmUgd2luZS5jb25mIGFuZCBnbG9iYWwgcmVnaXN0cnkgaXMgc3VwcG9zZWQgdG8gYmUKYmluZGlyPSRwcmVmaXgvYmluICAgICAgICAgICAgIyB3aGVyZSB3aW5lbGliIGFwcHMgd2lsbCBiZSAob3IgaXMpIGluc3RhbGxlZApsaWJkaXI9JHByZWZpeC9saWIgICAgICAgICAgICAjIHdoZXJlIGxpYndpbmUuc28gd2lsbCBiZSAob3IgaXMpIGluc3RhbGxlZApleGRpcj1kb2N1bWVudGF0aW9uL3NhbXBsZXMgICAjIHdoZXJlIHRoZSBleGFtcGxlIHN5c3RlbS5pbmkgcmVzaWRlcwpDT05GPSRzeXNjb25mZGlyL3dpbmUuY29uZiAgICAjIGRlZmF1bHQgcGF0aCBvZiB0aGUgd2luZS5jb25mCkJJTkRJU1Q9bm8gICAgICAgICAgICAgICAgICAgICMgd2hldGhlciBjYWxsZWQgZnJvbSBhIGJpbmFyeSBwYWNrYWdlIGNvbmZpZyBzY3JpcHQKRE9DT05GPWF1dG8gICAgICAgICAgICAgICAgICAgIyB3aGV0aGVyIHRvIGF1dG9nZW5lcmF0ZSB3aW5lLmNvbmYKRE9XQ0hLPWF1dG8gICAgICAgICAgICAgICAgICAgIyB3aGV0aGVyIHRvIGF1dG9jb25maWd1cmUgZXhpc3Rpbmctd2luZG93cyBpbnN0YWxsYXRpb24KRE9XSU5FPWF1dG8gICAgICAgICAgICAgICAgICAgIyB3aGV0aGVyIHRvIGF1dG9jb25maWd1cmUgbm8td2luZG93cyBpbnN0YWxsYXRpb24KRE9SRUc9YXV0byAgICAgICAgICAgICAgICAgICAgIyB3aGV0aGVyIHRvIGluc3RhbGwgZGVmYXVsdCByZWdpc3RyeQpTWVNSRUc9eWVzICAgICAgICAgICAgICAgICAgICAjIHdoZXRoZXIgdG8gbWFrZSByb290J3MgcmVnaXN0cnkgZ2xvYmFsIChzeXN0ZW0tZGVmYXVsdCkKCiMgIm1ha2UgaW5zdGFsbCIgc3RpbGwgaW5zdGFsbHMgdGhlIGRsbHMgaW50byAkbGliZGlyLCBidXQgdGhpcyBtYXkgY2hhbmdlIGluIHRoZSBmdXR1cmUKIyAoRExMUEFUSCBzaG91bGQgcG9pbnQgdG8gdGhlbSBpZi93aGVuIHRoZXkgYXJlIG5vdCBpbiBzdGFuZGFyZCBsZC5zbyBwYXRocykKRExMUEFUSD0kbGliZGlyL3dpbmUgICAgICAgICAgIyBkZWZhdWx0IHBhdGggb2YgdGhlIGRsbCAuc28gZmlsZXMgKGV4Y2VwdCBsaWJ3aW5lLnNvKQoKIyBoYXZpbmcgdGhlIFdpbmUgZGVidWdnZXIgbGF1bmNoZWQgYXV0b21hdGljYWxseSB3aWxsIGJlIGEgcGx1cyBmb3IgdXMKREVCVUdHRVI9JGJpbmRpci93aW5lZGJnICAgICAgIyB0aGUgKGluc3RhbGxlZCkgcGF0aCBvZiB3aW5lZGJnCkhERUJVR0dFUj1kZWJ1Z2dlci93aW5lZGJnICAgICMgdGhlIChub24taW5zdGFsbGVkKSBwYXRoIG9mIHdpbmVkYmcKCiMgdGhpcyBpcyBvbmx5IGZvciBleGlzdGluZy13aW5kb3dzIGluc3RhbGxzCldJTkVDT05GPXRvb2xzL3dpbmVjb25mICAgICAgICMgdGhlIHBhdGggb2Ygd2luZWNvbmYgcGVybCBzY3JpcHQKCiMgdGhpcyBpcyBvbmx5IGZvciBuby13aW5kb3dzIGluc3RhbGxzCldJTkVJTkk9d2luZS5pbmkgICAgICAgICAgICAgICMgdGhlIHBhdGggb2YgZGVmYXVsdCB3aW5lLmluaSAoYWxzbyB1c2VkIGJ5IHdpbmVjb25mKQpXSU5JTkk9L2Rldi9udWxsICAgICAgICAgICAgICAjIHRoZSBwYXRoIG9mIGRlZmF1bHQgd2luLmluaQpTWVNURU1JTkk9JGV4ZGlyL3N5c3RlbS5pbmkgICAjIHRoZSBwYXRoIG9mIGRlZmF1bHQgc3lzdGVtLmluaQpSRUdBUEk9cHJvZ3JhbXMvcmVnYXBpL3JlZ2FwaSAjIHRoZSBwYXRoIG9mIHJlZ2FwaSB3aW5lbGliIGFwcGxpY2F0aW9uCkRFRlJFRz13aW5lZGVmYXVsdC5yZWcgICAgICAgICMgdGhlIHBhdGggb2YgdGhlIHJlZ2lzdHJ5IGZpbGUgdG8gYmUgZmVkIHRvIHJlZ2FwaQojIENST09UPS92YXIvd2luZSAgICAgICAgICAgICAjIHRoZSBwYXRoIG9mIHRoZSBmYWtlIERyaXZlIEMgKGFza3MgdXNlciBpZiBub3Qgc2V0KQpERUZDQVQ9Y2F0ICAgICAgICAgICAgICAgICAgICAjIHByb2dyYW0gdG8gY2F0ICRERUZSRUcgd2l0aCAoc29tZSBwYWNrYWdlcyBuZWVkIHpjYXQpCiMtLS0gZW5kIG9mIGRlZmF1bHRzCgojIHRlbXBvcmFyeSBmaWxlcyB1c2VkIGJ5IHRoZSBpbnN0YWxsZXIKVE1QQ09ORj0vdG1wL3dpbmVpbnN0YWxsLmNvbmYKVE1QUkVHPS90bXAvd2luZWluc3RhbGwucmVnCgojIGZ1bmN0aW9ucwoKZnVuY3Rpb24gc3RkX3NsZWVwIHsKICBzbGVlcCAxCn0KCmZ1bmN0aW9uIGNvbmZfcXVlc3Rpb24gewogICMgcGFyYW1ldGVyczogJDEgPSBpbXBvcnRhbmNlLCAkMiA9IHF1ZXN0aW9uLWlkLCAkMysgPSBtZXNzYWdlIGxpbmVzCiAgIyB0aGUgZmlyc3QgdHdvIHBhcmFtZXRlcnMgY2FuIGJlIHVzZWQgYnkgZS5nLiBkZWJjb25mIGluIGRlYmlhbiBwYWNrYWdlcwogICMgYnV0IGhlcmUgd2UganVzdCBwcmludCB0aGUgbWVzc2FnZQogIHNoaWZ0IDIKICBlY2hvCiAgbG9jYWwgTElORT0iJDEiCiAgd2hpbGUgc2hpZnQKICBkbyB7CiAgICBlY2hvICIkTElORSIKICAgIExJTkU9IiQxIgogIH0KICBkb25lCn0KCmZ1bmN0aW9uIGNvbmZfcmVzZXRfcXVlc3Rpb24gewogICMgcGFyYW1ldGVyczogJDEgPSBxdWVzdGlvbi1pZAogICMgdGhpcyBpcyB1c2VkIHRvIGZsdXNoIGFueSBjYWNoZWQgYW5zd2VycyBhbmQgImFscmVhZHktZGlzcGxheWVkIiBmbGFncwogIHNoaWZ0ICMgZHVtbXkgY29tbWFuZAp9CgpmdW5jdGlvbiBjb25mX3llc25vX2Fuc3dlciB7CiAgdW5zZXQgQU5TV0VSCiAgd2hpbGUgWyAiJEFOU1dFUiIgIT0gJ3llcycgXSAmJiBbICIkQU5TV0VSIiAhPSAnbm8nIF0KICBkbyB7CiAgICBlY2hvIC1uICIkMSIKICAgIHJlYWQgQU5TV0VSCiAgfQogIGRvbmUKfQoKZnVuY3Rpb24gY29uZl9zdHJpbmdfYW5zd2VyIHsKICBlY2hvIC1uICIkMSIKICByZWFkIEFOU1dFUgp9CgojIHN0YXJ0dXAuLi4KCmVjaG8gIldJTkUgSW5zdGFsbGVyIHYwLjUiCmVjaG8KCmlmIFsgIiRCSU5ESVNUIiA9ICdubycgXQp0aGVuIHsKCmlmICEgWyAtZiBjb25maWd1cmUgXQp0aGVuIHsKICBlY2hvICJZb3UncmUgcnVubmluZyB0aGlzIGZyb20gdGhlIHdyb25nIGRpcmVjdG9yeS4iCiAgZWNobyAiQ2hhbmdlIHRvIHRoZSBXaW5lIHNvdXJjZSdzIG1haW4gZGlyZWN0b3J5IGFuZCB0cnkgYWdhaW4uIgogIGV4aXQgMQp9CmZpCgojIGNoZWNrIHdoZXRoZXIgUlBNIGluc3RhbGxlZCwgYW5kIGlmIGl0IGlzLCByZW1vdmUgYW55IG9sZCB3aW5lIHJwbS4KaGFzaCBycG0gJj4vZGV2L251bGwKUkVUPSQ/CmlmIFsgJFJFVCAtZXEgMCBdOyB0aGVuCiAgaWYgWyAtbiAiYHJwbSAtcWkgd2luZSAyPi9kZXYvbnVsbHxncmVwICJeTmFtZSJgIiBdOyB0aGVuCiAgICBlY2hvICJXYXJuaW5nOiBPbGQgV2luZSBSUE0gaW5zdGFsbCBkZXRlY3RlZC4gRG8geW91IHdhbnQgdG8gcmVtb3ZlIGl0IGZpcnN0PyIKICAgIGNvbmZfeWVzbm9fYW5zd2VyICIoeWVzL25vKSAiCiAgICBpZiBbICIkQU5TV0VSIiA9ICd5ZXMnIF07IHRoZW4KICAgICAgZWNobyBTdGFydGluZyB3aW5lIHJwbSByZW1vdmFsLi4uCiAgICAgIHJwbSAtZSB3aW5lOyBSRVQ9JD8KICAgICAgaWYgWyAkUkVUIC1lcSAwIF07IHRoZW4KICAgICAgICBlY2hvIERvbmUuCiAgICAgIGVsc2UKICAgICAgICBlY2hvICJGQUlMRUQuIFByb2JhYmx5IHlvdSBhcmVuJ3QgaW5zdGFsbGluZyBhcyByb290LiIKCWVjaG8gIkV4cGVjdCBwcm9ibGVtcyAobGlicmFyeSBjb25mbGljdHMgd2l0aCBleGlzdGluZyBpbnN0YWxsIGV0Yy4pLiIKICAgICAgZmkKICAgIGVsc2UKICAgICAgZWNobyAiU29ycnksIEkgd29uJ3QgaW5zdGFsbCBXaW5lIHdoZW4gYW4gcnBtIHZlcnNpb24gaXMgc3RpbGwgaW5zdGFsbGVkLiIKICAgICAgZWNobyAiKFdpbmUgc3VwcG9ydCBzdWZmZXJlZCBmcm9tIHdheSB0b28gbWFueSBjb25mbGljdHMpIgogICAgICBlY2hvICJIYXZlIGEgbmljZSBkYXkgISIKICAgICAgZXhpdCAxCiAgICBmaSAKICBmaQpmaQoKIyBydW4gdGhlIGNvbmZpZ3VyZSBzY3JpcHQsIGlmIG5lY2Vzc2FyeQoKaWYgWyAtZiBjb25maWcuY2FjaGUgXSAmJiBbIC1mIE1ha2VmaWxlIF0gJiYgWyBNYWtlZmlsZSAtbnQgY29uZmlndXJlIF0KdGhlbiB7CiAgZWNobyAiSSBzZWUgdGhhdCBXSU5FIGhhcyBhbHJlYWR5IGJlZW4gY29uZmlndXJlZCwgc28gSSdsbCBza2lwIHRoYXQuIgogIHN0ZF9zbGVlcAogICMgbG9hZCBjb25maWd1cmUgcmVzdWx0cwogIC4gLi9jb25maWcuY2FjaGUKfQplbHNlIHsKICBlY2hvICJSdW5uaW5nIGNvbmZpZ3VyZS4uLiIKICBlY2hvCiAgaWYgISAuL2NvbmZpZ3VyZSAkQ09ORkFSR1MKICB0aGVuIHsKICAgIGVjaG8KICAgIGVjaG8gIkNvbmZpZ3VyZSBmYWlsZWQsIGFib3J0aW5nIGluc3RhbGwuIgogICAgcm0gLWYgY29uZmlnLmNhY2hlCiAgICBleGl0IDEKICB9CiAgZmkKICAjIGxvYWQgY29uZmlndXJlIHJlc3VsdHMKICAuIC4vY29uZmlnLmNhY2hlCiAgIyBtYWtlIHN1cmUgWCB3YXMgZm91bmQKICBldmFsICIkYWNfY3ZfaGF2ZV94IgogIGlmIFsgIiRoYXZlX3giICE9ICJ5ZXMiIF0KICB0aGVuIHsKICAgIGVjaG8gIkluc3RhbGwgdGhlIFggZGV2ZWxvcG1lbnQgaGVhZGVycyBhbmQgdHJ5IGFnYWluLiIKICAgIHJtIC1mIGNvbmZpZy5jYWNoZQogICAgZXhpdCAxCiAgfQogIGVsaWYgWyAiJGFjX2N2X2hlYWRlcl9YMTFfeHBtX2giICE9ICJ5ZXMiIF0KICB0aGVuIHsKICAgIGVjaG8gIkluc3RhbGwgdGhlIFhwbSBkZXZlbG9wbWVudCBoZWFkZXJzIGFuZCB0cnkgYWdhaW4uIgogICAgcm0gLWYgY29uZmlnLmNhY2hlCiAgICBleGl0IDEKICB9CiAgZmkKfQpmaQoKIyBub3cgZG8gdGhlIGNvbXBpbGF0aW9uCgppZiBbIC1mIHdpbmUgXSAmJiBbIHdpbmUgLW50IE1ha2VmaWxlIF0KdGhlbiB7CiAgZWNobyAiSG1tLCBsb29rcyBsaWtlIFdJTkUgaXMgYWxyZWFkeSBjb21waWxlZC4gSSdsbCBza2lwIHRoYXQgdG9vLCBJIGd1ZXNzLiIKICBzdGRfc2xlZXAKfQplbHNlIHsKICBlY2hvICJDb21waWxpbmcgV0lORS4gR3JhYiBhIGx1bmNoIG9yIHR3bywgcmVudCBhIHZpZGVvLCBvciB3aGF0ZXZlciwiCiAgZWNobyAiaW4gdGhlIG1lYW50aW1lLi4uIgogIGVjaG8KICBzdGRfc2xlZXAKICBpZiAhIHsgbWFrZSBkZXBlbmQgJiYgbWFrZTsgfQogIHRoZW4gewogICAgZWNobwogICAgZWNobyAiQ29tcGlsYXRpb24gZmFpbGVkLCBhYm9ydGluZyBpbnN0YWxsLiIKICAgIGV4aXQgMQogIH0KICBmaQogIGVjaG8KfQpmaQoKIyBhbmQgaW5zdGFsbGF0aW9uLCBpZiByb290CgppZiBbIGB3aG9hbWlgICE9ICdyb290JyBdCnRoZW4gewogIGVjaG8gIllvdSBhcmVuJ3Qgcm9vdCwgc28gSSdsbCBza2lwIHRoZSBtYWtlIGluc3RhbGwuIgogICMgc2V0dXAgdG8gcnVuIGZyb20gY3VycmVudCBkaXJlY3RvcnkKICBETExQQVRIPSIkUFdEL2RsbHMiCiAgaWYgWyAteiAiJExEX0xJQlJBUllfUEFUSCIgXQogIHRoZW4gTERfTElCUkFSWV9QQVRIPSIkUFdEOiRETExQQVRIIgogIGVsc2UgTERfTElCUkFSWV9QQVRIPSIkTERfTElCUkFSWV9QQVRIOiRQV0Q6JERMTFBBVEgiCiAgZmkKICBleHBvcnQgTERfTElCUkFSWV9QQVRICiAgREVCVUdHRVI9IiRQV0QvJEhERUJVR0dFUiIKICBlY2hvCiAgZWNobyAiTk9URSEgVG8gcnVuIFdpbmUgd2l0aG91dCBpbnN0YWxsaW5nLCB5b3UgbXVzdCBzZXQgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIgogIGVjaG8gIkxEX0xJQlJBUllfUEFUSCB0byAkUFdEOiRETExQQVRIIgogIGVjaG8gImluIHlvdXIgbG9nb24gc2NyaXB0cy4iCn0KZWxzZSB7CiAgZWNobyAiTm93IGluc3RhbGxpbmcgYmluYXJpZXMgb250byB0aGUgc3lzdGVtLi4uIgogIGVjaG8KICBzdGRfc2xlZXAKICBpZiAhIG1ha2UgaW5zdGFsbAogIHRoZW4gewogICAgZWNobwogICAgZWNobyAiSW5zdGFsbGF0aW9uIGZhaWxlZCwgYWJvcnRpbmcuIgogICAgZXhpdCAxCiAgfQogIGZpCiAgaWYgWyAtZiAvZXRjL2xkLnNvLmNvbmYgXSAmJiAhIGdyZXAgLXFzICIkbGliZGlyIiAvZXRjL2xkLnNvLmNvbmYKICB0aGVuIHsKICAgIGVjaG8KICAgIGVjaG8gIiRsaWJkaXIgZGlkbid0IGV4aXN0IGluIHlvdXIgL2V0Yy9sZC5zby5jb25mLCBhZGRpbmcgaXQgbm93Li4uIgogICAgZWNobyAiJGxpYmRpciIgPj4vZXRjL2xkLnNvLmNvbmYKICAgIGVjaG8gIlJlLXJ1bm5pbmcgbGRjb25maWcuLi4iCiAgICBldmFsICIkYWNfY3ZfcGF0aF9MRENPTkZJRyIKICB9CiAgZmkKfQpmaQoKfQpmaSAjIEJJTkRJU1QKCiMgbm93IGNoZWNrIHdoZXRoZXIgd2Ugc2hvdWxkIGdlbmVyYXRlIHdpbmUuY29uZgppZiBbIC16ICIkRE9DT05GIiBdCnRoZW4gRE9DT05GPWF1dG8KZmkKCmlmIFsgIiRET0NPTkYiID0gJ2F1dG8nIF0KdGhlbiB7CiAgIyBzZWUgaWYgd2UgYWxyZWFkeSBoYXZlIGEgc3lzdGVtIHdpbmUuY29uZgogIGlmIFsgLWYgJENPTkYgXQogIHRoZW4gRE9DT05GPW5vCiAgZmkKfQpmaQoKaWYgWyAiJERPQ09ORiIgIT0gJ25vJyBdCnRoZW4gewogIGlmIFsgYHdob2FtaWAgIT0gJ3Jvb3QnIF0KICB0aGVuIHsKICAgIENPTkY9fi8ud2luZXJjCiAgICBpZiAhIFsgLWYgJENPTkYgXQogICAgdGhlbiB7CiAgICAgIGlmIFsgIiRET0NPTkYiICE9ICd5ZXMnIF0KICAgICAgdGhlbiB7CiAgICAgICAgY29uZl9xdWVzdGlvbiBtZWRpdW0gbWFrZV91c2VyX3dpbmVyYyBcCiAgICAgICAgICJTaW5jZSB5b3UgYXJlbid0IHJvb3QsIGFuZCB0aGVyZSdzIG5vIHN5c3RlbSB3aW5lLmNvbmYsIEkgYXNzdW1lIiBcCiAgICAgICAgICJ5b3Ugd2FudCBhIHVzZXItc3BlY2lmaWMgLndpbmVyYy4gQW0gSSBjb3JyZWN0PyIKICAgICAgICBjb25mX3llc25vX2Fuc3dlciAiKHllcy9ubykgIgogICAgICAgIERPQ09ORj0iJEFOU1dFUiIKICAgICAgfQogICAgICBmaQogICAgICBpZiBbICIkRE9DT05GIiA9ICdubycgXQogICAgICB0aGVuIHsKICAgICAgICBjb25mX3F1ZXN0aW9uIGhpZ2ggbmVlZF9yb290IFwKICAgICAgICAgIkFib3J0aW5nIGluc3RhbGwuIFRyeSBhZ2FpbiBhcyByb290IHRvIGdlbmVyYXRlIGEgc3lzdGVtIHdpbmUuY29uZi4iCiAgICAgICAgZXhpdCAxCiAgICAgIH0KICAgICAgZmkKICAgICAgZWNobwogICAgfQogICAgZmkKICB9CiAgZWxzZSB7CiAgICBta2RpciAtcCAkc3lzY29uZmRpcgogICAgRE9DT05GPXllcwogIH0KICBmaQp9CmZpCgojIGdlbmVyYXRlIHdpbmUuY29uZiBmcm9tIGV4aXN0aW5nIHdpbmRvd3MgaW5zdGFsbCwgaWYgYW55CmlmIFsgIiRET0NPTkYiID0gJ3llcycgXQp0aGVuIHsKICBpZiBbICIkRE9XQ0hLIiA9ICd5ZXMnIF0gfHwgWyAiJERPV0NISyIgPSAnYXV0bycgXQogIHRoZW4gewogICAgZWNobwogICAgZWNobyAtbiAiU2VhcmNoaW5nIGZvciBhbiBleGlzdGluZyBXaW5kb3dzIGluc3RhbGxhdGlvbi4uLiIKICAgIGlmICEgJFdJTkVDT05GIC1pbmlmaWxlICIkV0lORUlOSSIgPiAkQ09ORiAyPi9kZXYvbnVsbAogICAgdGhlbiB7CiAgICAgIHJtIC1mICRDT05GCiAgICAgIGVjaG8gIiBub3QgZm91bmQuIgogICAgICBjb25mX3F1ZXN0aW9uIGxvdyBkb193aXRob3V0X3dpbmRvd3MgXAogICAgICAgIldpbmRvd3Mgd2FzIG5vdCBmb3VuZCBvbiB5b3VyIHN5c3RlbSwgc28gSSBhc3N1bWUgeW91IHdhbnQiIFwKICAgICAgICJhIFdpbmUtb25seSBpbnN0YWxsYXRpb24uIEFtIEkgY29ycmVjdD8iCiAgICAgIGNvbmZfeWVzbm9fYW5zd2VyICIoeWVzL25vKSAiCiAgICAgIGlmIFsgIiRBTlNXRVIiID0gJ25vJyBdCiAgICAgIHRoZW4gewogICAgICAgIGNvbmZfcXVlc3Rpb24gaGlnaCB3aW5kb3dzX25vdF9mb3VuZCBcCiAgICAgICAgICJBYm9ydGluZyBpbnN0YWxsLiBNYWtlIHN1cmUgeW91ciBXaW5kb3dzIHBhcnRpdGlvbiBpcyBtb3VudGVkIGFuZCB0cnkgYWdhaW4sIiBcCiAgICAgICAgICJvciBjcmVhdGUgJENPTkYgbWFudWFsbHkgYnkgY29weWluZyBmcm9tICRXSU5FSU5JIGFuZCBhZGFwdGluZyB0aGUgZHJpdmUgcGF0aHMuIgogICAgICAgIGV4aXQgMQogICAgICB9CiAgICAgIGZpCiAgICAgIERPV0lORT15ZXMKICAgIH0KICAgIGVsc2UgewogICAgICBlY2hvICIgZm91bmQuIgogICAgICBjb25mX3Jlc2V0X3F1ZXN0aW9uIHdpbmRvd3NfZm91bmQKICAgICAgY29uZl9xdWVzdGlvbiBsb3cgd2luZG93c19mb3VuZCBcCiAgICAgICAiQ3JlYXRlZCAkQ09ORiB1c2luZyB5b3VyIGV4aXN0aW5nIFdpbmRvd3MgaW5zdGFsbGF0aW9uLiIgXAogICAgICAgIllvdSBwcm9iYWJseSB3YW50IHRvIHJldmlldyB0aGUgZmlsZSwgdGhvdWdoLiIKICAgICAgRE9XSU5FPW5vCiAgICB9CiAgICBmaQogIH0KICBlbGlmIFsgIiRET1dJTkUiID0gJ2F1dG8nIF0KICB0aGVuIERPV0lORT15ZXMKICBmaQp9CmVsaWYgWyAiJERPV0lORSIgPSAnYXV0bycgXQp0aGVuIERPV0lORT1ubwpmaQoKIyBzZXR1cCBhIG5vLXdpbmRvd3MgaW5zdGFsbGF0aW9uLCBpZiBuZWNlc3NhcnkKaWYgWyAiJERPV0lORSIgPSAneWVzJyBdCnRoZW4gewogIGlmIFsgYHdob2FtaWAgIT0gJ3Jvb3QnIF0KICB0aGVuIERDUk9PVD1+L2MKICBlbHNlIERDUk9PVD0vYwogIGZpCiAgY29uZl9xdWVzdGlvbiBsb3cgZHJpdmVjX3BhdGggXAogICAiQ29uZmlndXJpbmcgV2luZSB3aXRob3V0IFdpbmRvd3MuIiBcCiAgICJTb21lIGZha2UgV2luZG93cyBkaXJlY3RvcmllcyBtdXN0IGJlIGNyZWF0ZWQsIHRvIGhvbGQgYW55IC5pbmkgZmlsZXMsIERMTHMsIiBcCiAgICJzdGFydCBtZW51IGVudHJpZXMsIGFuZCBvdGhlciB0aGluZ3MgeW91ciBhcHBsaWNhdGlvbnMgbWF5IG5lZWQgdG8gaW5zdGFsbC4iIFwKICAgIldoZXJlIHdvdWxkIHlvdSBsaWtlIHlvdXIgZmFrZSBDIGRyaXZlIHRvIGJlIHBsYWNlZD8iCiAgd2hpbGUgWyAteiAiJENST09UIiBdCiAgZG8gewogICAgY29uZl9zdHJpbmdfYW5zd2VyICIoZGVmYXVsdCBpcyAkRENST09UKSAiCiAgICBbIC16ICIkQU5TV0VSIiBdICYmIEFOU1dFUj0iJERDUk9PVCIKICAgIGlmICEgWyAtZCAiJEFOU1dFUiIgXQogICAgdGhlbiB7CiAgICAgIGlmIG1rZGlyIC1wICIkQU5TV0VSIgogICAgICB0aGVuIENST09UPSIkQU5TV0VSIgogICAgICBlbHNlCiAgICAgICAgZWNobyAiRGlyZWN0b3J5ICRBTlNXRVIgY2FuJ3QgYmUgY3JlYXRlZCAhIgogICAgICAgIGNvbmZfcmVzZXRfcXVlc3Rpb24gZHJpdmVjX3BhdGgKICAgICAgZmkKICAgIH0KICAgIGVsc2UgQ1JPT1Q9IiRBTlNXRVIiCiAgICBmaQogIH0KICBkb25lCiAgZWNobyAiQ29uZmlndXJpbmcgV2luZSBmb3IgYSBuby13aW5kb3dzIGluc3RhbGwgaW4gJENST09ULi4uIgogIGZvciB0ZGlyIGluICIkQ1JPT1Qvd2luZG93cyIgIiRDUk9PVC93aW5kb3dzL3N5c3RlbSIgXAogICAgICAgICAgICAgICIkQ1JPT1Qvd2luZG93cy9TdGFydCBNZW51IiAiJENST09UL3dpbmRvd3MvU3RhcnQgTWVudS9Qcm9ncmFtcyIgXAogICAgICAgICAgICAgICIkQ1JPT1QvQ29tbW9uIEZpbGVzIiAiJENST09UL1Byb2dyYW0gRmlsZXMiIFwKICAgICAgICAgICAgICAiJENST09UL3dpbmRvd3MvUHJvZmlsZXMiICIkQ1JPT1Qvd2luZG93cy9Qcm9maWxlcy9BZG1pbmlzdHJhdG9yIgogIGRvIFsgLWQgIiR0ZGlyIiBdIHx8IG1rZGlyICIkdGRpciIKICBkb25lCiAgWyAtZiAiJENST09UL3dpbmRvd3Mvd2luLmluaSIgXSAgICB8fCBjcCAiJFdJTklOSSIgICAgIiRDUk9PVC93aW5kb3dzL3dpbi5pbmkiCiAgWyAtZiAiJENST09UL3dpbmRvd3Mvc3lzdGVtLmluaSIgXSB8fCBjcCAiJFNZU1RFTUlOSSIgIiRDUk9PVC93aW5kb3dzL3N5c3RlbS5pbmkiCiAgaWYgWyAiJERPQ09ORiIgPSAneWVzJyBdCiAgdGhlbiB7CiAgICBzZWQgInN8UGF0aD0vY1wkfFBhdGg9JHtDUk9PVH18IiAkV0lORUlOSSA+ICRDT05GCiAgICBjb25mX3Jlc2V0X3F1ZXN0aW9uIGRlZmF1bHRfY29uZmlnCiAgICBjb25mX3F1ZXN0aW9uIGxvdyBkZWZhdWx0X2NvbmZpZyBcCiAgICAgIkNyZWF0ZWQgJENPTkYgdXNpbmcgZGVmYXVsdCBXaW5lIGNvbmZpZ3VyYXRpb24uIiBcCiAgICAgIllvdSBwcm9iYWJseSB3YW50IHRvIHJldmlldyB0aGUgZmlsZSwgdGhvdWdoLiIKICB9CiAgZmkKICAjIG5vdyB3ZSByZWFsbHkgc2hvdWxkIGluc3RhbGwgdGhlIHJlZ2lzdHJ5CiAgaWYgWyAiJERPUkVHIiA9ICdhdXRvJyBdCiAgdGhlbiBET1JFRz15ZXMKICBmaQp9CmVsaWYgWyAteiAiJENST09UIiBdCnRoZW4gewogIGVjaG8KICBlY2hvICJSZWFkaW5nIGN1cnJlbnQgV2luZSBjb25maWd1cmF0aW9uIGZyb20gJENPTkYuLi4iCiAgQ1JPT1Q9YHNlZCAtbiAnL15cW0RyaXZlIENcXSQvLC9eXFsuKlxdJC8gcy9eUGF0aD1cKC4qXCkvXDEvcCcgJENPTkZgCiAgZWNobyAiRHJpdmUgQyBpcyBjb25maWd1cmVkIGF0ICRDUk9PVC4iCn0KZmkKZWNobwoKIyBmaXh1cCBFWFRSQV9MRF9MSUJSQVJZX1BBVEgKaWYgWyAiJERPQ09ORiIgPSAneWVzJyBdCnRoZW4gewogIGVjaG8gIlNldHRpbmcgRVhUUkFfTERfTElCUkFSWV9QQVRIIGluIC53aW5lcmMgdG8gJERMTFBBVEguLi4iCiAgc2VkICJzfEVYVFJBX0xEX0xJQlJBUllfUEFUSD0uKnxFWFRSQV9MRF9MSUJSQVJZX1BBVEg9JHtETExQQVRIfXwiICRDT05GID4gJENPTkYubmV3CiAgbXYgLWYgJENPTkYubmV3ICRDT05GCiAgZWNobwp9CmZpCgojIGNoZWNrIHdoZXRoZXIgd2UgbmVlZCB0byBpbnN0YWxsIGRlZmF1bHQgcmVnaXN0cnkKIyAobm90IHRvIGJlIGRvbmUgaWYgd2luZG93cyByZWdpc3RyeSBleGlzdHMpCmlmIFsgIiRET1JFRyIgPSAnYXV0bycgXQp0aGVuIHsKICBlY2hvICJDaGVja2luZyBmb3IgcmVhbCBXaW5kb3dzIHJlZ2lzdHJ5Li4uIgogIGlmIFsgLWYgIiRDUk9PVC93aW5kb3dzL3N5c3RlbS5kYXQiIF0KICB0aGVuIERPUkVHPW5vCiAgZWxpZiBbIC1mICIkQ1JPT1Qvd2luZG93cy9zeXN0ZW0zMi9jb25maWcvc3lzdGVtIiBdCiAgdGhlbiBET1JFRz1ubwogIGVsc2UgRE9SRUc9eWVzCiAgZmkKICBpZiBbICIkRE9SRUciID0gJ3llcycgXQogIHRoZW4gZWNobyAiTm90IGZvdW5kLCBkZWZhdWx0IFdpbmUgcmVnaXN0cnkgd2lsbCBiZSBpbnN0YWxsZWQuIgogIGVsc2UgZWNobyAiV2luZG93cyByZWdpc3RyeSBmb3VuZCwgd2lsbCBub3QgaW5zdGFsbCBkZWZhdWx0IFdpbmUgcmVnaXN0cnkuIgogIGZpCiAgZWNobwp9CmZpCgojIGluc3RhbGwgZGVmYXVsdCByZWdpc3RyeSBlbnRyaWVzCmlmIFsgIiRET1JFRyIgPSAneWVzJyBdCnRoZW4gewogIGlmIFsgIiRCSU5ESVNUIiA9ICdubycgXQogIHRoZW4gewogICAgZWNobyAiQ29tcGlsaW5nIHJlZ2FwaS4uLiIKICAgIGVjaG8KICAgIChjZCBwcm9ncmFtcy9yZWdhcGk7IG1ha2UpCiAgICBlY2hvCiAgfQogIGZpCiAgZWNobyAiUHJlcGFyaW5nIHRvIGluc3RhbGwgZGVmYXVsdCBXaW5lIHJlZ2lzdHJ5IGVudHJpZXMuLi4iCgogICMgY3JlYXRlIGEgdGVtcG9yYXJ5IHdpbmVpbnN0YWxsLmNvbmYgZmlsZSB1c2luZyB0dHlkcnYsCiAgIyBzbyB0aGF0IHdlIGRvbid0IGhhdmUgdG8gcnVuIHJlZ2FwaSB1bmRlciBYCiAgc2VkICJzL0dyYXBoaWNzRHJpdmVyPS4qL0dyYXBoaWNzRHJpdmVyPXR0eWRydi8iICRDT05GID4gJFRNUENPTkYKCiAgIyBjcmVhdGUgYSB0ZW1wb3Jhcnkgd2luZWluc3RhbGwucmVnIHdpdGggZml4ZWQgZGVidWdnZXIgcGF0aAogICRERUZDQVQgJERFRlJFRyB8IHNlZCAic3xkZWJ1Z2dlci93aW5lZGJnfCR7REVCVUdHRVJ9fCIgPiAkVE1QUkVHCgogIGVjaG8gIkluc3RhbGxpbmcgZGVmYXVsdCBXaW5lIHJlZ2lzdHJ5IGVudHJpZXMuLi4iCiAgZWNobwogIGlmICEgJFJFR0FQSSAtLWNvbmZpZyAkVE1QQ09ORiBzZXRWYWx1ZSA8ICRUTVBSRUcgPiAvZGV2L251bGwKICB0aGVuIHsKICAgIHJtIC1mICRUTVBDT05GICRUTVBSRUcKICAgIGVjaG8gIlJlZ2lzdHJ5IGluc3RhbGwgZmFpbGVkLiIKICAgIGNvbmZfcmVzZXRfcXVlc3Rpb24gcmVnYXBpX2Vycm9yCiAgICBjb25mX3F1ZXN0aW9uIGhpZ2ggcmVnYXBpX2Vycm9yCiAgICBleGl0IDEKICB9CiAgZWxzZSBlY2hvICJSZWdpc3RyeSBlbnRyaWVzIHN1Y2Nlc3NmdWxseSBpbnN0YWxsZWQuIgogIGZpCiAgcm0gLWYgJFRNUENPTkYgJFRNUFJFRwogIGlmIFsgIiRTWVNSRUciID0gJ2F1dG8nIF0KICB0aGVuIFNZU1JFRz15ZXMKICBmaQp9CmZpCgojIG1ha2Ugcm9vdCdzIHJlZ2lzdHJ5IGdsb2JhbCwgaWYgZGVzaXJlZAppZiBbIGB3aG9hbWlgID0gJ3Jvb3QnIF0gJiYgWyAiJFNZU1JFRyIgPSAneWVzJyBdCnRoZW4gewogIFsgLWQgfi8ud2luZSBdIHx8IG1rZGlyIH4vLndpbmUKICBpZiAhIFsgLWYgJHN5c2NvbmZkaXIvd2luZS51c2VycmVnIF0KICB0aGVuIHsKICAgIGVjaG8gIkxpbmtpbmcgcm9vdCdzIHVzZXIgcmVnaXN0cnkgaGl2ZSB0byB0aGUgZ2xvYmFsIHJlZ2lzdHJ5Li4uIgogICAgWyAtZiB+Ly53aW5lL3dpbmUudXNlcnJlZyBdICYmIGNwIH4vLndpbmUvd2luZS51c2VycmVnICRzeXNjb25mZGlyL3dpbmUudXNlcnJlZwogICAgbG4gLXNmICRzeXNjb25mZGlyL3dpbmUudXNlcnJlZyB+Ly53aW5lL3dpbmUudXNlcnJlZwogIH0KICBmaQogIGlmICEgWyAtZiAkc3lzY29uZmRpci93aW5lLnN5c3RlbXJlZyBdCiAgdGhlbiB7CiAgICBlY2hvICJMaW5raW5nIHJvb3QncyBzeXN0ZW0gcmVnaXN0cnkgaGl2ZSB0byB0aGUgZ2xvYmFsIHJlZ2lzdHJ5Li4uIgogICAgWyAtZiB+Ly53aW5lL3N5c3RlbS5yZWcgXSAmJiBjcCB+Ly53aW5lL3N5c3RlbS5yZWcgJHN5c2NvbmZkaXIvd2luZS5zeXN0ZW1yZWcKICAgIGxuIC1zZiAkc3lzY29uZmRpci93aW5lLnN5c3RlbXJlZyB+Ly53aW5lL3N5c3RlbS5yZWcKICB9CiAgZmkKfQpmaQoKIyBpdCdzIGEgd3JhcAplY2hvCmVjaG8gIkluc3RhbGxhdGlvbiBjb21wbGV0ZSBmb3Igbm93LiBHb29kIGx1Y2sgKHRoaXMgaXMgc3RpbGwgYWxwaGEgc29mdHdhcmUpLiIKZWNobyAiSWYgeW91IGhhdmUgcHJvYmxlbXMgd2l0aCBXSU5FLCBwbGVhc2UgcmVhZCB0aGUgZG9jdW1lbnRhdGlvbiBmaXJzdCwiCmVjaG8gImFzIG1hbnkga2luZHMgb2YgcG90ZW50aWFsIHByb2JsZW1zIGFyZSBleHBsYWluZWQgdGhlcmUuIgoKZXhpdCAwCg==