IyEvYmluL2Jhc2gKIyBXSU5FIEluc3RhbGxhdGlvbiBzY3JpcHQKIyBDYW4gZG8gYWxtb3N0IGV2ZXJ5dGhpbmcgZnJvbSBjb21waWxpbmcgdG8gY29uZmlndXJpbmcuLi4KCiMgTWFyIDMxIDE5OTkgLSBPdmUgS+V2ZW4KIyAgRmlyc3QgdmVyc2lvbgojIERlYyA5IDE5OTkgLSBPdmUgS+V2ZW4KIyAgcmVxdWlyZSBYcG0KIyBGZWIgMjUgMjAwMCAtIE92ZSBL5XZlbgojICBhdXRvLWFkZCAvdXNyL2xvY2FsL2xpYiB0byAvZXRjL2xkLnNvLmNvbmYKIyBNYXIgMiAyMDAwIC0gT3ZlIEvldmVuCiMgIHNvdXJjZSByYXRoZXIgdGhhbiBncmVwIGNvbmZpZy5jYWNoZQojICB1c2Ugc291cmNlZCBjb25maWcuY2FjaGUgdG8gc3RhcnQgbGRjb25maWcKIyAgcmVjb25maWd1cmUgaWYgY29uZmlnLmNhY2hlIGRvZXNuJ3QgZXhpc3QKIyBNYXIgMzAgMjAwMCAtIE92ZSBL5XZlbgojICBhdXRvY29uZmlndXJlIG5vLXdpbmRvd3MgaW5zdGFsbHMKIyAgZG8gbm90IGluc3RhbGwgcmVnaXN0cnkgb24gcmVhbC13aW5kb3dzIGluc3RhbGxzCiMgIHNvbWUgc3VwcG9ydCBmb3IgYmluYXJ5IHBhY2thZ2UgaW5zdGFsbHMKIyAgc2V0IGFuZCB0ZWxsIHVzZXIgYWJvdXQgTERfTElCUkFSWV9QQVRIIGlmIG5lY2Vzc2FyeQojICBzZXQgRVhUUkFfTERfTElCUkFSWV9QQVRIIGluIHdpbmUuY29uZgojIEFwciA5IDIwMDAgLSBPdmUgS+V2ZW4KIyAgbWFrZSByb290J3MgcmVnaXN0cnkgZ2xvYmFsIChzeXN0ZW0tZGVmYXVsdCkKIyBNYXkgOSAyMDAwIC0gT3ZlIEvldmVuCiMgIHVzZSB0dHlkcnYgd2hlbiBydW5uaW5nIHJlZ2FwaSwgc28gd2UgZG9uJ3QgaGF2ZSB0byBydW4gZnJvbSBYCiMgIGNoYW5nZSBkZWJ1Z2dlciBwYXRoIGluIHJlZ2lzdHJ5CiMgT2N0IDI5IDIwMDAgLSBPdmUgS+V2ZW4KIyAgYWRkZWQgLS1lbmFibGUtb3BlbmdsIHRvIGRlZmF1bHQgY29uZmFyZ3MKIyAgYWRkZWQgY29uZl9xdWVzdGlvbiwgY29uZl95ZXNub19hbnN3ZXIsIGFuZCBjb25mX3N0cmluZ19hbnN3ZXIgZnVuY3Rpb25zCiMgIGFkZGVkIERFRkNBVCB2YXJpYWJsZQojIChsYXRlciB0aGF0IGRheS4uLikKIyAgYWRkZWQgY29uZl9yZXNldF9xdWVzdGlvbiBmdW5jdGlvbgojICBhZGRlZCBmaWxlIGV4aXN0ZW5jZSBjaGVja3MgdG8gdGhlIHJlZ2lzdHJ5IGNvcHlpbmcKIyAgZml4ZWQgcHJvYmxlbSB3aXRoIG5vLXdpbmRvd3MgZGlyZWN0b3J5IGNyZWF0aW9uCiMgIHNvbWUgdGV4dCByZWZvcm1hdHRpbmcgZnJvbSBFcmljIE1hcnluaWFrCiMgSmFuIDUgMjAwMCAtIENocmlzIE1vcmdhbgojICB1c2UgZGVmYXVsdCBjb25maWcgZmlsZSBpbiAvZG9jdW1lbnRhdGlvbi9zYW1wbGVzL2NvbmZpZwojICByZXBsYWNlIC53aW5lcmMgd2l0aCB+Ly53aW5lL2NvbmZpZyBpbiBwcmludGVkIHRleHQKIyAgYWRkZWQgdXNlciBxdWVzdGlvbiB0byBjb252ZXJ0IC53aW5lcmMgZmlsZShpZiBleGlzdHMpIG9yIHVzZSB0aGUgZGVmYXVsdAojICAgIGNvbmZpZyBmaWxlCiMgIGFkZCBjb25mX3F1ZXN0aW9uIHRvIGFsbG93IHJvb3QgdG8gaW5zdGFsbCBhIGxvY2FsIGNvbmZpZyBmaWxlIGFuZAojICAgIHJlZ2lzdHJ5CiMgSmFuIDEyIDIwMDAgLSBDaHJpcyBNb3JnYW4KIyAgZGlzdGluZ3Vpc2ggYmV0d2VlbiBjcmVhdGluZyBsb2NhbCBhbmQgZ2xvYmFsIGNvbmZpZyBmaWxlcwojICBkaXNwbGF5IGEgbWVzc2FnZSBhYm91dCB0aGUgc3RhdHVzIG9mIGdsb2JhbCBjb25maWcgZmlsZXMKIyAgbWlzYyBjbGVhbnVwcyBhbmQgcmVvcmRlcmluZyBvZiBxdWVzdGlvbnMKIyAgYWRkZWQgY2hlY2sgdG8gc2VlIGlmIHdpbmUgaXMgaW5zdGFsbGVkIHdoZW4gd2UgYXJlIHJ1bm5pbmcgYXMgYSBub3JtYWwKIyAgICB1c2VyIGFuZCBwcmludCBhIG1lc3NhZ2UgaWYgd2luZSBjYW5ub3QgYmUgZm91bmQKCiMtLS0gZGVmYXVsdHMgKGNoYW5nZSB0aGVzZSBpZiB5b3UgYXJlIGEgcGFja2FnZXIpCkNPTkZBUkdTPSItLWVuYWJsZS1vcGVuZ2wiICAgICMgY29uZmlndXJlIGFyZ3MsIGUuZy4gLS1wcmVmaXg9L3VzciAtLXN5c2NvbmZkaXI9L2V0YwpwcmVmaXg9L3Vzci9sb2NhbCAgICAgICAgICAgICAjIGluc3RhbGxhdGlvbiBwcmVmaXgKc3lzY29uZmRpcj0kcHJlZml4L2V0YyAgICAgICAgIyB3aGVyZSB3aW5lLmNvbmYgYW5kIGdsb2JhbCByZWdpc3RyeSBpcyBzdXBwb3NlZCB0byBiZQpiaW5kaXI9JHByZWZpeC9iaW4gICAgICAgICAgICAjIHdoZXJlIHdpbmVsaWIgYXBwcyB3aWxsIGJlIChvciBpcykgaW5zdGFsbGVkCmxpYmRpcj0kcHJlZml4L2xpYiAgICAgICAgICAgICMgd2hlcmUgbGlid2luZS5zbyB3aWxsIGJlIChvciBpcykgaW5zdGFsbGVkCmV4ZGlyPWRvY3VtZW50YXRpb24vc2FtcGxlcyAgICMgd2hlcmUgdGhlIGV4YW1wbGUgc3lzdGVtLmluaSByZXNpZGVzCkdDT05GPSRzeXNjb25mZGlyL3dpbmUuY29uZiAgICMgZGVmYXVsdCBwYXRoIG9mIHRoZSB3aW5lLmNvbmYgZ2xvYmFsIGNvbmZpZyBmaWxlCkxDT05GPX4vLndpbmUvY29uZmlnICAgICAgICAgICMgZGVmYXVsdCBwYXRoIG9mIHRoZSBsb2NhbCBjb25maWcgZmlsZQpCSU5ESVNUPW5vICAgICAgICAgICAgICAgICAgICAjIHdoZXRoZXIgY2FsbGVkIGZyb20gYSBiaW5hcnkgcGFja2FnZSBjb25maWcgc2NyaXB0CkRPR0xPQkFMQ09ORj1hdXRvICAgICAgICAgICAgICMgd2hldGhlciB0byBhdXRvZ2VuZXJhdGUgd2luZS5jb25mCkRPTE9DQUxDT05GPWF1dG8gICAgICAgICAgICAgICMgd2hldGhlciB0byBhdXRvZ2VuZXJhdGUgbG9jYWxjb25mCkRPV0NISz1hdXRvICAgICAgICAgICAgICAgICAgICMgd2hldGhlciB0byBhdXRvY29uZmlndXJlIGV4aXN0aW5nLXdpbmRvd3MgaW5zdGFsbGF0aW9uCkRPV0lORT1hdXRvICAgICAgICAgICAgICAgICAgICMgd2hldGhlciB0byBhdXRvY29uZmlndXJlIG5vLXdpbmRvd3MgaW5zdGFsbGF0aW9uCkRPUkVHPWF1dG8gICAgICAgICAgICAgICAgICAgICMgd2hldGhlciB0byBpbnN0YWxsIGRlZmF1bHQgcmVnaXN0cnkKU1lTUkVHPXllcyAgICAgICAgICAgICAgICAgICAgIyB3aGV0aGVyIHRvIG1ha2Ugcm9vdCdzIHJlZ2lzdHJ5IGdsb2JhbCAoc3lzdGVtLWRlZmF1bHQpCkNPTlZDT05GPW5vCQkgICAgICAjIHdoZXRoZXIgd2UgYXJlIGNvbnZlcnRpbmcgYW4gZXhpc3RpbmcgLndpbmVyYyBvciBub3QKCiMgIm1ha2UgaW5zdGFsbCIgc3RpbGwgaW5zdGFsbHMgdGhlIGRsbHMgaW50byAkbGliZGlyLCBidXQgdGhpcyBtYXkgY2hhbmdlIGluIHRoZSBmdXR1cmUKIyAoRExMUEFUSCBzaG91bGQgcG9pbnQgdG8gdGhlbSBpZi93aGVuIHRoZXkgYXJlIG5vdCBpbiBzdGFuZGFyZCBsZC5zbyBwYXRocykKRExMUEFUSD0kbGliZGlyL3dpbmUgICAgICAgICAgIyBkZWZhdWx0IHBhdGggb2YgdGhlIGRsbCAuc28gZmlsZXMgKGV4Y2VwdCBsaWJ3aW5lLnNvKQoKIyBoYXZpbmcgdGhlIFdpbmUgZGVidWdnZXIgbGF1bmNoZWQgYXV0b21hdGljYWxseSB3aWxsIGJlIGEgcGx1cyBmb3IgdXMKREVCVUdHRVI9JGJpbmRpci93aW5lZGJnICAgICAgIyB0aGUgKGluc3RhbGxlZCkgcGF0aCBvZiB3aW5lZGJnCkhERUJVR0dFUj1kZWJ1Z2dlci93aW5lZGJnICAgICMgdGhlIChub24taW5zdGFsbGVkKSBwYXRoIG9mIHdpbmVkYmcKCiMgdGhpcyBpcyBvbmx5IGZvciBleGlzdGluZy13aW5kb3dzIGluc3RhbGxzCldJTkVDT05GPXRvb2xzL3dpbmVjb25mICAgICAgICMgdGhlIHBhdGggb2Ygd2luZWNvbmYgcGVybCBzY3JpcHQKCiMgdGhpcyBpcyBvbmx5IGZvciBuby13aW5kb3dzIGluc3RhbGxzCldJTkVJTkk9JGV4ZGlyL2NvbmZpZyAgICAgICAgICMgdGhlIHBhdGggb2YgZGVmYXVsdCB3aW5lIGNvbmZpZyBmaWxlIChhbHNvIHVzZWQgYnkgd2luZWNvbmYpCldJTklOST0vZGV2L251bGwgICAgICAgICAgICAgICMgdGhlIHBhdGggb2YgZGVmYXVsdCB3aW4uaW5pClNZU1RFTUlOST0kZXhkaXIvc3lzdGVtLmluaSAgICMgdGhlIHBhdGggb2YgZGVmYXVsdCBzeXN0ZW0uaW5pClJFR0FQST1wcm9ncmFtcy9yZWdhcGkvcmVnYXBpICMgdGhlIHBhdGggb2YgcmVnYXBpIHdpbmVsaWIgYXBwbGljYXRpb24KREVGUkVHPXdpbmVkZWZhdWx0LnJlZyAgICAgICAgIyB0aGUgcGF0aCBvZiB0aGUgcmVnaXN0cnkgZmlsZSB0byBiZSBmZWQgdG8gcmVnYXBpCiMgQ1JPT1Q9L3Zhci93aW5lICAgICAgICAgICAgICMgdGhlIHBhdGggb2YgdGhlIGZha2UgRHJpdmUgQyAoYXNrcyB1c2VyIGlmIG5vdCBzZXQpCkRFRkNBVD1jYXQgICAgICAgICAgICAgICAgICAgICMgcHJvZ3JhbSB0byBjYXQgJERFRlJFRyB3aXRoIChzb21lIHBhY2thZ2VzIG5lZWQgemNhdCkKIy0tLSBlbmQgb2YgZGVmYXVsdHMKCiMgdGVtcG9yYXJ5IGZpbGVzIHVzZWQgYnkgdGhlIGluc3RhbGxlcgpUTVBDT05GPS90bXAvd2luZWluc3RhbGwuY29uZgpUTVBSRUc9L3RtcC93aW5laW5zdGFsbC5yZWcKCiMgZnVuY3Rpb25zCgpmdW5jdGlvbiBzdGRfc2xlZXAgewogIHNsZWVwIDEKfQoKZnVuY3Rpb24gY29uZl9xdWVzdGlvbiB7CiAgIyBwYXJhbWV0ZXJzOiAkMSA9IGltcG9ydGFuY2UsICQyID0gcXVlc3Rpb24taWQsICQzKyA9IG1lc3NhZ2UgbGluZXMKICAjIHRoZSBmaXJzdCB0d28gcGFyYW1ldGVycyBjYW4gYmUgdXNlZCBieSBlLmcuIGRlYmNvbmYgaW4gZGViaWFuIHBhY2thZ2VzCiAgIyBidXQgaGVyZSB3ZSBqdXN0IHByaW50IHRoZSBtZXNzYWdlCiAgc2hpZnQgMgogIGVjaG8KICBsb2NhbCBMSU5FPSIkMSIKICB3aGlsZSBzaGlmdAogIGRvIHsKICAgIGVjaG8gIiRMSU5FIgogICAgTElORT0iJDEiCiAgfQogIGRvbmUKfQoKZnVuY3Rpb24gY29uZl9yZXNldF9xdWVzdGlvbiB7CiAgIyBwYXJhbWV0ZXJzOiAkMSA9IHF1ZXN0aW9uLWlkCiAgIyB0aGlzIGlzIHVzZWQgdG8gZmx1c2ggYW55IGNhY2hlZCBhbnN3ZXJzIGFuZCAiYWxyZWFkeS1kaXNwbGF5ZWQiIGZsYWdzCiAgc2hpZnQgIyBkdW1teSBjb21tYW5kCn0KCmZ1bmN0aW9uIGNvbmZfeWVzbm9fYW5zd2VyIHsKICB1bnNldCBBTlNXRVIKICB3aGlsZSBbICIkQU5TV0VSIiAhPSAneWVzJyBdICYmIFsgIiRBTlNXRVIiICE9ICdubycgXQogIGRvIHsKICAgIGVjaG8gLW4gIiQxIgogICAgcmVhZCBBTlNXRVIKICB9CiAgZG9uZQp9CgpmdW5jdGlvbiBjb25mX3N0cmluZ19hbnN3ZXIgewogIGVjaG8gLW4gIiQxIgogIHJlYWQgQU5TV0VSCn0KCmZ1bmN0aW9uIGNyZWF0ZV93aW5kb3dzX2RpcmVjdG9yaWVzIHsKICBmb3IgdGRpciBpbiAiJENST09UL3dpbmRvd3MiICIkQ1JPT1Qvd2luZG93cy9zeXN0ZW0iIFwKICAgICAgICAgICAgICAiJENST09UL3dpbmRvd3MvU3RhcnQgTWVudSIgIiRDUk9PVC93aW5kb3dzL1N0YXJ0IE1lbnUvUHJvZ3JhbXMiIFwKICAgICAgICAgICAgICAiJENST09UL0NvbW1vbiBGaWxlcyIgIiRDUk9PVC9Qcm9ncmFtIEZpbGVzIiBcCiAgICAgICAgICAgICAgIiRDUk9PVC93aW5kb3dzL1Byb2ZpbGVzIiAiJENST09UL3dpbmRvd3MvUHJvZmlsZXMvQWRtaW5pc3RyYXRvciIKICBkbyBbIC1kICIkdGRpciIgXSB8fCBta2RpciAiJHRkaXIiCiAgZG9uZQogIFsgLWYgIiRDUk9PVC93aW5kb3dzL3dpbi5pbmkiIF0gICAgfHwgY3AgIiRXSU5JTkkiICAgICIkQ1JPT1Qvd2luZG93cy93aW4uaW5pIgogIFsgLWYgIiRDUk9PVC93aW5kb3dzL3N5c3RlbS5pbmkiIF0gfHwgY3AgIiRTWVNURU1JTkkiICIkQ1JPT1Qvd2luZG93cy9zeXN0ZW0uaW5pIgp9CgojIHN0YXJ0dXAuLi4KCmVjaG8gIldJTkUgSW5zdGFsbGVyIHYwLjciCmVjaG8KCmlmIFsgIiRCSU5ESVNUIiA9ICdubycgXQp0aGVuIHsKCmlmICEgWyAtZiBjb25maWd1cmUgXQp0aGVuIHsKICBlY2hvICJZb3UncmUgcnVubmluZyB0aGlzIGZyb20gdGhlIHdyb25nIGRpcmVjdG9yeS4iCiAgZWNobyAiQ2hhbmdlIHRvIHRoZSBXaW5lIHNvdXJjZSdzIG1haW4gZGlyZWN0b3J5IGFuZCB0cnkgYWdhaW4uIgogIGV4aXQgMQp9CmZpCgojIGNoZWNrIHdoZXRoZXIgUlBNIGluc3RhbGxlZCwgYW5kIGlmIGl0IGlzLCByZW1vdmUgYW55IG9sZCB3aW5lIHJwbS4KaGFzaCBycG0gJj4vZGV2L251bGwKUkVUPSQ/CmlmIFsgJFJFVCAtZXEgMCBdOyB0aGVuCiAgaWYgWyAtbiAiYHJwbSAtcWkgd2luZSAyPi9kZXYvbnVsbHxncmVwICJeTmFtZSJgIiBdOyB0aGVuCiAgICBlY2hvICJXYXJuaW5nOiBPbGQgV2luZSBSUE0gaW5zdGFsbCBkZXRlY3RlZC4gRG8geW91IHdhbnQgdG8gcmVtb3ZlIGl0IGZpcnN0PyIKICAgIGNvbmZfeWVzbm9fYW5zd2VyICIoeWVzL25vKSAiCiAgICBpZiBbICIkQU5TV0VSIiA9ICd5ZXMnIF07IHRoZW4KICAgICAgZWNobyBTdGFydGluZyB3aW5lIHJwbSByZW1vdmFsLi4uCiAgICAgIHJwbSAtZSB3aW5lOyBSRVQ9JD8KICAgICAgaWYgWyAkUkVUIC1lcSAwIF07IHRoZW4KICAgICAgICBlY2hvIERvbmUuCiAgICAgIGVsc2UKICAgICAgICBlY2hvICJGQUlMRUQuIFByb2JhYmx5IHlvdSBhcmVuJ3QgaW5zdGFsbGluZyBhcyByb290LiIKCWVjaG8gIkV4cGVjdCBwcm9ibGVtcyAobGlicmFyeSBjb25mbGljdHMgd2l0aCBleGlzdGluZyBpbnN0YWxsIGV0Yy4pLiIKICAgICAgZmkKICAgIGVsc2UKICAgICAgZWNobyAiU29ycnksIEkgd29uJ3QgaW5zdGFsbCBXaW5lIHdoZW4gYW4gcnBtIHZlcnNpb24gaXMgc3RpbGwgaW5zdGFsbGVkLiIKICAgICAgZWNobyAiKFdpbmUgc3VwcG9ydCBzdWZmZXJlZCBmcm9tIHdheSB0b28gbWFueSBjb25mbGljdHMpIgogICAgICBlY2hvICJIYXZlIGEgbmljZSBkYXkgISIKICAgICAgZXhpdCAxCiAgICBmaSAKICBmaQpmaQoKIyBjaGVjayB3aGV0aGVyIHdpbmUgYmluYXJ5IHN0aWxsIGF2YWlsYWJsZQppZiBbIC1uICJgd2hpY2ggd2luZWAiIF07IHRoZW4KICBlY2hvICJXYXJuaW5nICEhIHdpbmUgYmluYXJ5IChzdGlsbCkgZm91bmQsIHdoaWNoIG1heSBpbmRpY2F0ZSIKICBlY2hvICJhIChjb25mbGljdGluZykgcHJldmlvdXMgaW5zdGFsbGF0aW9uLiIKICBlY2hvICJZb3UgbWlnaHQgd2FudCB0byBhYm9ydCBhbmQgdW5pbnN0YWxsIFdpbmUgZmlyc3QuIgogIHN0ZF9zbGVlcApmaQoKIyBydW4gdGhlIGNvbmZpZ3VyZSBzY3JpcHQsIGlmIG5lY2Vzc2FyeQoKaWYgWyAtZiBjb25maWcuY2FjaGUgXSAmJiBbIC1mIE1ha2VmaWxlIF0gJiYgWyBNYWtlZmlsZSAtbnQgY29uZmlndXJlIF0KdGhlbiB7CiAgZWNobyAiSSBzZWUgdGhhdCBXSU5FIGhhcyBhbHJlYWR5IGJlZW4gY29uZmlndXJlZCwgc28gSSdsbCBza2lwIHRoYXQuIgogIHN0ZF9zbGVlcAogICMgbG9hZCBjb25maWd1cmUgcmVzdWx0cwogIC4gLi9jb25maWcuY2FjaGUKfQplbHNlIHsKICBlY2hvICJSdW5uaW5nIGNvbmZpZ3VyZS4uLiIKICBlY2hvCiAgaWYgISAuL2NvbmZpZ3VyZSAkQ09ORkFSR1MKICB0aGVuIHsKICAgIGVjaG8KICAgIGVjaG8gIkNvbmZpZ3VyZSBmYWlsZWQsIGFib3J0aW5nIGluc3RhbGwuIgogICAgcm0gLWYgY29uZmlnLmNhY2hlCiAgICBleGl0IDEKICB9CiAgZmkKICAjIGxvYWQgY29uZmlndXJlIHJlc3VsdHMKICAuIC4vY29uZmlnLmNhY2hlCiAgIyBtYWtlIHN1cmUgWCB3YXMgZm91bmQKICBldmFsICIkYWNfY3ZfaGF2ZV94IgogIGlmIFsgIiRoYXZlX3giICE9ICJ5ZXMiIF0KICB0aGVuIHsKICAgIGVjaG8gIkluc3RhbGwgdGhlIFggZGV2ZWxvcG1lbnQgaGVhZGVycyBhbmQgdHJ5IGFnYWluLiIKICAgIHJtIC1mIGNvbmZpZy5jYWNoZQogICAgZXhpdCAxCiAgfQogIGZpCn0KZmkKCiMgbm93IGRvIHRoZSBjb21waWxhdGlvbgoKaWYgWyAtZiB3aW5lIF0gJiYgWyB3aW5lIC1udCBNYWtlZmlsZSBdCnRoZW4gewogIGVjaG8gIkhtbSwgbG9va3MgbGlrZSBXSU5FIGlzIGFscmVhZHkgY29tcGlsZWQuIEknbGwgc2tpcCB0aGF0IHRvbywgSSBndWVzcy4iCiAgc3RkX3NsZWVwCn0KZWxzZSB7CiAgZWNobyAiQ29tcGlsaW5nIFdJTkUuIEdyYWIgYSBsdW5jaCBvciB0d28sIHJlbnQgYSB2aWRlbywgb3Igd2hhdGV2ZXIsIgogIGVjaG8gImluIHRoZSBtZWFudGltZS4uLiIKICBlY2hvCiAgc3RkX3NsZWVwCiAgaWYgISB7IG1ha2UgZGVwZW5kICYmIG1ha2U7IH0KICB0aGVuIHsKICAgIGVjaG8KICAgIGVjaG8gIkNvbXBpbGF0aW9uIGZhaWxlZCwgYWJvcnRpbmcgaW5zdGFsbC4iCiAgICBleGl0IDEKICB9CiAgZmkKICBlY2hvCn0KZmkKCiMgYW5kIGluc3RhbGxhdGlvbiwgaWYgcm9vdAoKaWYgWyBgd2hvYW1pYCAhPSAncm9vdCcgXQp0aGVuIHsKICBlY2hvICJZb3UgYXJlbid0IHJvb3QsIHNvIEknbGwgc2tpcCB0aGUgbWFrZSBpbnN0YWxsLiIKCiAgIyBzZXR1cCB0byBydW4gZnJvbSBjdXJyZW50IGRpcmVjdG9yeQogIERMTFBBVEg9IiRQV0QvZGxscyIKICBpZiBbIC16ICIkTERfTElCUkFSWV9QQVRIIiBdCiAgdGhlbiBMRF9MSUJSQVJZX1BBVEg9IiRQV0Q6JERMTFBBVEgiCiAgZWxzZSBMRF9MSUJSQVJZX1BBVEg9IiRMRF9MSUJSQVJZX1BBVEg6JFBXRDokRExMUEFUSCIKICBmaQogIGV4cG9ydCBMRF9MSUJSQVJZX1BBVEgKICBERUJVR0dFUj0iJFBXRC8kSERFQlVHR0VSIgogIGVjaG8KICBlY2hvICJOT1RFISBUbyBydW4gV2luZSB3aXRob3V0IGluc3RhbGxpbmcsIHlvdSBtdXN0IHNldCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUiCiAgZWNobyAiTERfTElCUkFSWV9QQVRIIHRvICRQV0Q6JERMTFBBVEgiCiAgZWNobyAiaW4geW91ciBsb2dvbiBzY3JpcHRzLiIKICBlY2hvCgogICMgc2VlIGlmIHdpbmUgaXMgaW5zdGFsbGVkIG9uIHRoZSB1c2VycyBzeXN0ZW0sIGlmIG5vdCBwcm9tcHQgdGhlbQogICMgYW5kIHRoZW4gZXhpdAogIGlmIFsgISBgd2hpY2ggd2luZWAgXQogIHRoZW4KICAgIGVjaG8gIkNvdWxkIG5vdCBmaW5kIHdpbmUgb24geW91ciBzeXN0ZW0uICBSdW4gd2luZWluc3RhbGwgYXMgcm9vdCB0byBpbnN0YWxsIHdpbmUiCiAgICBlY2hvICJiZWZvcmUgcmUtcnVubmluZyB3aW5laW5zdGFsbCBhcyBhIHVzZXIuIgogICAgZWNobwogICAgZWNobyAiRXhpdGluZyB3aW5laW5zdGFsbCIKICAgIGV4aXQgMTsKICBmaQp9CmVsc2UgewogIGVjaG8gIk5vdyBpbnN0YWxsaW5nIGJpbmFyaWVzIG9udG8gdGhlIHN5c3RlbS4uLiIKICBlY2hvCiAgc3RkX3NsZWVwCiAgaWYgISBtYWtlIGluc3RhbGwKICB0aGVuIHsKICAgIGVjaG8KICAgIGVjaG8gIkluc3RhbGxhdGlvbiBmYWlsZWQsIGFib3J0aW5nLiIKICAgIGV4aXQgMQogIH0KICBmaQogIGlmIFsgLWYgL2V0Yy9sZC5zby5jb25mIF0gJiYgISBncmVwIC1xcyAiJGxpYmRpciIgL2V0Yy9sZC5zby5jb25mCiAgdGhlbiB7CiAgICBlY2hvCiAgICBlY2hvICIkbGliZGlyIGRpZG4ndCBleGlzdCBpbiB5b3VyIC9ldGMvbGQuc28uY29uZiwgYWRkaW5nIGl0IG5vdy4uLiIKICAgIGVjaG8gIiRsaWJkaXIiID4+L2V0Yy9sZC5zby5jb25mCiAgICBlY2hvICJSZS1ydW5uaW5nIGxkY29uZmlnLi4uIgogICAgZXZhbCAiJGFjX2N2X3BhdGhfTERDT05GSUciCiAgfQogIGZpCn0KZmkKCn0KZmkgIyBCSU5ESVNUCgojIG5vdyBjaGVjayB3aGV0aGVyIHdlIHNob3VsZCBnZW5lcmF0ZSB3aW5lLmNvbmYKaWYgWyAteiAiJERPR0xPQkFMQ09ORiIgXQp0aGVuIERPR0xPQkFMQ09ORj1hdXRvCmZpCgppZiBbICIkRE9HTE9CQUxDT05GIiA9ICdhdXRvJyBdCnRoZW4gewogICMgc2VlIGlmIHdlIGFscmVhZHkgaGF2ZSBhIHN5c3RlbSB3aW5lLmNvbmYKICBpZiBbICEgLWYgJEdDT05GIF0gJiYgWyBgd2hvYW1pYCA9ICdyb290JyBdCiAgdGhlbgogICAgRE9HTE9CQUxDT05GPW5vCiAgICBlY2hvICJDcmVhdGlvbiBvZiBhIGdsb2JhbCBjb25maWcgZmlsZSBpcyBub3Qgc3VwcG9ydGVkIGluIHdpbmVpbnN0YWxsIGF0IHRoaXMiCiAgICBlY2hvICJ0aW1lLiAgV2hlbiB0aGUgY29uZmlndXJhdGlvbiBhcmNoaXRlY3R1cmUgaXMgY2xlYW5lZCB1cCB0aGlzIGZ1bmN0aW9uYWxpdHkiCiAgICBlY2hvICJ3aWxsIGJlIHJlc3RvcmVkIHRvIHdpbmVpbnN0YWxsLiIKICAgIGVjaG8KICBmaQp9CmZpCgppZiBbICIkRE9MT0NBTENPTkYiID0gJ2F1dG8nIF0KdGhlbiB7CiAgIyBzZWUgaWYgdGhlIHVzZXIgaXMgcm9vdCwgaWYgc28sIGV4cGxpY2l0bHkgYXNrIHRoZW0gaWYgdGhleSB3YW50IGEKICAjIGxvY2FsIGNvbmZpZyBmaWxlCiAgaWYgWyBgd2hvYW1pYCA9ICdyb290JyBdCiAgdGhlbgogICAgZWNobyAiWW91IGFyZSBydW5uaW5nIGFzIHJvb3QuICBEbyB5b3Ugd2FudCBhIGxvY2FsIGNvbmZpZyBmaWxlLCIKICAgIGVjaG8gImZpbGUsIH4vLndpbmUvY29uZmlnLCBjcmVhdGVkPyIKICAgIGNvbmZfeWVzbm9fYW5zd2VyICIoeWVzL25vKSAiCiAgICBET0xPQ0FMQ09ORj0iJEFOU1dFUiIKICBlbHNlCiAgICBlY2hvICJDcmVhdGUgbG9jYWwgY29uZmlnIGZpbGUgfi8ud2luZS9jb25maWc/IgogICAgY29uZl95ZXNub19hbnN3ZXIgIih5ZXMvbm8pICIKICAgIGVjaG8KICAgIERPTE9DQUxDT05GPSIkQU5TV0VSIgogICAgaWYgWyAiJEFOU1dFUiIgPSAnbm8nIF0KICAgIHRoZW4KICAgICAgY29uZl9xdWVzdGlvbiBoaWdoIG5lZWRfcm9vdCBcCiAgICAgICAgIkFib3J0aW5nIGluc3RhbGwuIFRyeSBhZ2FpbiBhcyByb290IHRvIGdlbmVyYXRlIGEgc3lzdGVtIHdpbmUuY29uZi4iCiAgICAgIGV4aXQgMQogICAgZmkKICBmaQoKICBpZiBbIC1mICIkTENPTkYiIF0KICB0aGVuCiAgICBlY2hvICJGb3VuZCBleGlzdGluZyAkTENPTkYsIGlmIHlvdSBjb250aW51ZSB0aGlzIGZpbGUgd2lsbCBiZSIKICAgIGVjaG8gIm92ZXJ3cml0dGVuLiAgQ29udGludWUgcnVubmluZyB3aW5laW5zdGFsbD8iCiAgICBjb25mX3llc25vX2Fuc3dlciAiKHllcy9ubykgIgogICAgZWNobwogICAgaWYgWyAiJEFOU1dFUiIgPSAnbm8nIF0KICAgIHRoZW4KICAgICAgZWNobyAiRXhpdGluZyB3aW5laW5zdGFsbCIKICAgICAgZXhpdCAxCiAgICBmaQogIGZpCn0KZmkKCiMgZ2VuZXJhdGUgJFRNUENPTkYgZnJvbSBleGlzdGluZyB3aW5kb3dzIGluc3RhbGwsIGlmIGFueQppZiBbICIkRE9MT0NBTENPTkYiID0gJ3llcycgXQp0aGVuIHsKICBpZiBbICIkRE9XQ0hLIiA9ICd5ZXMnIF0gfHwgWyAiJERPV0NISyIgPSAnYXV0bycgXQogIHRoZW4gewogICAgZWNobyAtbiAiU2VhcmNoaW5nIGZvciBhbiBleGlzdGluZyBXaW5kb3dzIGluc3RhbGxhdGlvbi4uLiIKICAgIGlmICEgJFdJTkVDT05GIC1pbmlmaWxlICIkV0lORUlOSSIgPiAkVE1QQ09ORiAyPi9kZXYvbnVsbAogICAgdGhlbiB7CiAgICAgIHJtIC1mICRUTVBDT05GICRUTVBSRUcgPiAvZGV2L251bGwKCiAgICAgIGVjaG8gIiBub3QgZm91bmQuIChubyBtYXRjaGluZyAvZXRjL2ZzdGFiIG1vdW50IGVudHJ5IGZvdW5kKSIKICAgICAgY29uZl9xdWVzdGlvbiBsb3cgZG9fd2l0aG91dF93aW5kb3dzIFwKICAgICAgICJXaW5kb3dzIHdhcyBub3QgZm91bmQgb24geW91ciBzeXN0ZW0sIHNvIEkgYXNzdW1lIHlvdSB3YW50IiBcCiAgICAgICAiYSBXaW5lLW9ubHkgaW5zdGFsbGF0aW9uLiBBbSBJIGNvcnJlY3Q/IgogICAgICBjb25mX3llc25vX2Fuc3dlciAiKHllcy9ubykgIgogICAgICBpZiBbICIkQU5TV0VSIiA9ICdubycgXQogICAgICB0aGVuIHsKICAgICAgICBjb25mX3F1ZXN0aW9uIGhpZ2ggd2luZG93c19ub3RfZm91bmQgXAogICAgICAgICAiQWJvcnRpbmcgaW5zdGFsbC4gTWFrZSBzdXJlIHlvdXIgV2luZG93cyBwYXJ0aXRpb24gaXMgbW91bnRlZCBhbmQgdHJ5IGFnYWluLCIgXAogICAgICAgICAib3IgY3JlYXRlICRMQ09ORiBtYW51YWxseSBieSBjb3B5aW5nIGZyb20gJFdJTkVJTkkgYW5kIGFkYXB0aW5nIHRoZSBkcml2ZSBwYXRocy4iCiAgICAgICAgZXhpdCAxCiAgICAgIH0KICAgICAgZmkKICAgICAgRE9XSU5FPXllcwogICAgfQogICAgZWxzZSB7CiAgICAgIGVjaG8gIiBmb3VuZC4iCgogICAgICBjb25mX3Jlc2V0X3F1ZXN0aW9uIHdpbmRvd3NfZm91bmQKICAgICAgY29uZl9xdWVzdGlvbiBsb3cgd2luZG93c19mb3VuZCBcCiAgICAgICAiQ3JlYXRlZCAkTENPTkYgdXNpbmcgeW91ciBleGlzdGluZyBXaW5kb3dzIGluc3RhbGxhdGlvbi4iIFwKICAgICAgICJZb3UgcHJvYmFibHkgd2FudCB0byByZXZpZXcgdGhlIGZpbGUsIHRob3VnaC4iCiAgICAgIERPV0lORT1ubwogICAgfQogICAgZmkKICB9CiAgZWxpZiBbICIkRE9XSU5FIiA9ICdhdXRvJyBdCiAgdGhlbiBET1dJTkU9eWVzCiAgZmkKfQplbGlmIFsgIiRET1dJTkUiID0gJ2F1dG8nIF0KdGhlbiAKICBET1dJTkU9bm8KZmkKCiMgc2V0dXAgYSBuby13aW5kb3dzIGluc3RhbGxhdGlvbiwgaWYgbmVjZXNzYXJ5CmlmIFsgIiRET1dJTkUiID0gJ3llcycgXQp0aGVuIHsKICAjIHNldCBhbiBhcHByb3ByaWF0ZSBEQ1JPT1QKICBpZiBbIGB3aG9hbWlgICE9ICdyb290JyBdCiAgdGhlbiBEQ1JPT1Q9fi9jCiAgZWxzZSBEQ1JPT1Q9L2MKICBmaQoKICBpZiBbIC1mIH4vLndpbmVyYyBdCiAgdGhlbiB7CiAgICBjb25mX3F1ZXN0aW9uIG1lZGl1bSBjb252ZXJ0X2NvbmZpZyBcCiAgICAgIkkgZm91bmQgdGhlIG9sZCB2ZXJzaW9uIFdpbmUgY29uZmlnIGZpbGUsIC53aW5lcmMsIGluIHlvdXIgIiBcCiAgICAgImhvbWUgZGlyZWN0b3J5LiAgSSBjYW4gY29udmVydCB0aGlzIHRvIHRoZSBuZXcgZm9ybWF0IG9yIHVzZSB0aGUiIFwKICAgICAibmV3IGRlZmF1bHQgV2luZSBjb25maWcgZmlsZS4gQ29udmVydD8iCiAgICBjb25mX3llc25vX2Fuc3dlciAiKHllcy9ubykgIgogICAgaWYgWyAiJEFOU1dFUiIgPSAneWVzJyBdCiAgICB0aGVuIHsKICAgICAgV0lORUlOST1+Ly53aW5lcmMKICAgICAgQ09OVkNPTkY9eWVzCiAgICB9CiAgICBmaQogIH0KICBlbHNlIHsKCiAgICBjb25mX3F1ZXN0aW9uIGxvdyBkcml2ZWNfcGF0aCBcCiAgICAgIkNvbmZpZ3VyaW5nIFdpbmUgd2l0aG91dCBXaW5kb3dzLiIgXAogICAgICJTb21lIGZha2UgV2luZG93cyBkaXJlY3RvcmllcyBtdXN0IGJlIGNyZWF0ZWQsIHRvIGhvbGQgYW55IC5pbmkgZmlsZXMsIERMTHMsIiBcCiAgICAgInN0YXJ0IG1lbnUgZW50cmllcywgYW5kIG90aGVyIHRoaW5ncyB5b3VyIGFwcGxpY2F0aW9ucyBtYXkgbmVlZCB0byBpbnN0YWxsLiIgXAogICAgICJXaGVyZSB3b3VsZCB5b3UgbGlrZSB5b3VyIGZha2UgQyBkcml2ZSB0byBiZSBwbGFjZWQ/IgogICAgd2hpbGUgWyAteiAiJENST09UIiBdCiAgICBkbyB7CiAgICAgIGNvbmZfc3RyaW5nX2Fuc3dlciAiKGRlZmF1bHQgaXMgJERDUk9PVCkgIgogICAgICBbIC16ICIkQU5TV0VSIiBdICYmIEFOU1dFUj0iJERDUk9PVCIKICAgICAgaWYgISBbIC1kICIkQU5TV0VSIiBdCiAgICAgIHRoZW4gewogICAgICAgIGlmIG1rZGlyIC1wICIkQU5TV0VSIgogICAgICAgIHRoZW4gQ1JPT1Q9IiRBTlNXRVIiCiAgICAgICAgZWxzZQogICAgICAgICAgZWNobyAiRGlyZWN0b3J5ICRBTlNXRVIgY2FuJ3QgYmUgY3JlYXRlZCAhIgogICAgICAgICAgY29uZl9yZXNldF9xdWVzdGlvbiBkcml2ZWNfcGF0aAogICAgICAgIGZpCiAgICAgIH0KICAgICAgZWxzZSBDUk9PVD0iJEFOU1dFUiIKICAgICAgZmkKICAgIH0KICAgIGRvbmUKICAgIGVjaG8gIkNvbmZpZ3VyaW5nIFdpbmUgZm9yIGEgbm8td2luZG93cyBpbnN0YWxsIGluICRDUk9PVC4uLiIKICAKICAgIGNyZWF0ZV93aW5kb3dzX2RpcmVjdG9yaWVzCiAgfQogIGZpCgogICMgY3JlYXRlICRMQ09ORiB1c2luZyB0aGUgZGVmYXVsdCBjb25maWcgZmlsZSAkV0lORUlOSSAgCiAgaWYgWyAiJERPTE9DQUxDT05GIiA9ICd5ZXMnIF0gJiYgWyAiJENPTlZDT05GIiA9ICdubycgXQogIHRoZW4gewogICAgc2VkICJzfFwiUGF0aFwiID0gXCIvY1wiXCR8XCJQYXRoXCIgPSBcIiR7Q1JPT1R9XCJ8IiAkV0lORUlOSSA+ICRUTVBDT05GCiAgICBjb25mX3Jlc2V0X3F1ZXN0aW9uIGRlZmF1bHRfY29uZmlnCiAgICBjb25mX3F1ZXN0aW9uIGxvdyBkZWZhdWx0X2NvbmZpZyBcCiAgICAgIkNyZWF0ZWQgJExDT05GIHVzaW5nIGRlZmF1bHQgV2luZSBjb25maWd1cmF0aW9uLiIgXAogICAgICJZb3UgcHJvYmFibHkgd2FudCB0byByZXZpZXcgdGhlIGZpbGUsIHRob3VnaC4iCiAgfQogIGZpCgogICMgbm93IHdlIHJlYWxseSBzaG91bGQgaW5zdGFsbCB0aGUgcmVnaXN0cnkKICBpZiBbICIkRE9SRUciID0gJ2F1dG8nIF0KICB0aGVuIERPUkVHPXllcwogIGZpCn0KZmkKZWNobwoKI2luc3RhbGwgdGhlIGxvY2FsIGNvbmZpZyBmaWxlICRMQ09ORgppZiBbICIkRE9MT0NBTENPTkYiID0gJ3llcycgXQp0aGVuCiAgaWYgWyAhIC13IH4vLndpbmUgXQogIHRoZW4KICAgIG1rZGlyIH4vLndpbmUKICBmaQoKICBpZiBbICIkQ09OVkNPTkYiID0gJ25vJyBdCiAgdGhlbgogICAgY3AgJFRNUENPTkYgJExDT05GID4gL2Rldi9udWxsCiAgZmkKZWxzZQogIERPUkVHPW5vCmZpICAgICAgCgojaW5zdGFsbCB0aGUgZ2xvYmFsIGNvbmZpZyBmaWxlICRHQ09ORgppZiBbICIkRE9HTE9CQUxDT05GIiA9ICd5ZXMnIF0KdGhlbgogIGlmIFsgISAtZiAkc3lzY29uZmRpciBdCiAgdGhlbgogICAgbWtkaXIgLXAgJHN5c2NvbmZkaXIKICBmaQoKICBjcCAkVE1QQ09ORiAkR0NPTkYgPiAvZGV2L251bGwKZmkKCiMgY2hlY2sgd2hldGhlciB3ZSBuZWVkIHRvIGluc3RhbGwgZGVmYXVsdCByZWdpc3RyeQojIChub3QgdG8gYmUgZG9uZSBpZiB3aW5kb3dzIHJlZ2lzdHJ5IGV4aXN0cykKaWYgWyAiJERPUkVHIiA9ICdhdXRvJyBdCnRoZW4gewogIGVjaG8gIkNoZWNraW5nIGZvciByZWFsIFdpbmRvd3MgcmVnaXN0cnkuLi4iCiAgaWYgWyAtZiAiJENST09UL3dpbmRvd3Mvc3lzdGVtLmRhdCIgXQogIHRoZW4gRE9SRUc9bm8KICBlbGlmIFsgLWYgIiRDUk9PVC93aW5kb3dzL3N5c3RlbTMyL2NvbmZpZy9zeXN0ZW0iIF0KICB0aGVuIERPUkVHPW5vCiAgZWxzZSBET1JFRz15ZXMKICBmaQogIGlmIFsgIiRET1JFRyIgPSAneWVzJyBdCiAgdGhlbiBlY2hvICJOb3QgZm91bmQsIGRlZmF1bHQgV2luZSByZWdpc3RyeSB3aWxsIGJlIGluc3RhbGxlZC4iCiAgZWxzZSBlY2hvICJXaW5kb3dzIHJlZ2lzdHJ5IGZvdW5kLCB3aWxsIG5vdCBpbnN0YWxsIGRlZmF1bHQgV2luZSByZWdpc3RyeS4iCiAgZmkKICBlY2hvCn0KZmkKCiMgaW5zdGFsbCBkZWZhdWx0IHJlZ2lzdHJ5IGVudHJpZXMKaWYgWyAiJERPUkVHIiA9ICd5ZXMnIF0KdGhlbiB7CiAgaWYgWyAiJEJJTkRJU1QiID0gJ25vJyBdCiAgdGhlbiB7CiAgICBlY2hvICJDb21waWxpbmcgcmVnYXBpLi4uIgogICAgKGNkIHByb2dyYW1zL3JlZ2FwaTsgbWFrZSkKICAgIGVjaG8KICB9CiAgZmkKICBlY2hvICJQcmVwYXJpbmcgdG8gaW5zdGFsbCBkZWZhdWx0IFdpbmUgcmVnaXN0cnkgZW50cmllcy4uLiIKCiAgIyBlZGl0IGNvbmZpZyBmaWxlcyBzbyB3ZSBkb24ndCBoYXZlIHRvIHJ1biByZWdhcGkgdW5kZXIgWAogIGlmIFsgIiRDT05WQ09ORiIgPSAneWVzJyBdCiAgdGhlbgogICAgbXYgJFdJTkVJTkkgJFdJTkVJTkkubmV3CiAgICBzZWQgInMvR3JhcGhpY3NEcml2ZXI9LiovR3JhcGhpY3NEcml2ZXI9dHR5ZHJ2LyIgJFdJTkVJTkkubmV3ID4gJFdJTkVJTkkKICBlbHNlCiAgICBtdiAkTENPTkYgJExDT05GLm5ldwogICAgc2VkICJzL1wiR3JhcGhpY3NEcml2ZXJcIiA9IC4qL1wiR3JhcGhpY3NEcml2ZXJcIiA9IFwidHR5ZHJ2XCIvIiAkTENPTkYubmV3ID4gJExDT05GCiAgZmkKCiAgIyBjcmVhdGUgYSB0ZW1wb3Jhcnkgd2luZWluc3RhbGwucmVnIHdpdGggZml4ZWQgZGVidWdnZXIgcGF0aAogICRERUZDQVQgJERFRlJFRyB8IHNlZCAic3xkZWJ1Z2dlci93aW5lZGJnfCR7REVCVUdHRVJ9fCIgPiAkVE1QUkVHCgogIGVjaG8gIkluc3RhbGxpbmcgZGVmYXVsdCBXaW5lIHJlZ2lzdHJ5IGVudHJpZXMuLi4iCiAgZWNobwogIGlmICEgJFJFR0FQSSBzZXRWYWx1ZSA8ICRUTVBSRUcgPiAvZGV2L251bGwKICB0aGVuIHsKICAgIHJtIC1mICRUTVBSRUcKICAgIGVjaG8gIlJlZ2lzdHJ5IGluc3RhbGwgZmFpbGVkLiIKICAgIGNvbmZfcmVzZXRfcXVlc3Rpb24gcmVnYXBpX2Vycm9yCiAgICBjb25mX3F1ZXN0aW9uIGhpZ2ggcmVnYXBpX2Vycm9yCiAgICBleGl0IDEKICB9CiAgZWxzZSB7CiAgICAjIGlmIHdlIGFyZSBjb252ZXJ0aW5nIGZyb20gYSAud2luZXJjIGZpbGUsIHJ1bm5pbmcgcmVnYXBpIG9uY2UKICAgICMgd2lsbCBPTkxZIGNvbnZlcnQgLndpbmVyYyAtPiB+Ly53aW5lL2NvbmZpZywgaXQgd2lsbCBub3QgaW1wb3J0IHRoZQogICAgIyByZWdpc3RyeSBkYXRhLiAgc28gaWYgd2UgYXJlIGNvbnZlcnRpbmcgd2UgbmVlZCB0byBydW4gcmVnYXBpIHR3aWNlCiAgICBpZiBbICIkQ09OVkNPTkYiID0gJ3llcycgXQogICAgdGhlbgogICAgICBpZiAhICRSRUdBUEkgc2V0VmFsdWUgPCAkVE1QUkVHID4gL2Rldi9udWxsCiAgICAgIHRoZW4KICAgICAgICBybSAtZiAkVE1QUkVHCiAgICAgICAgZWNobyAiUmVnaXN0cnkgaW5zdGFsbCBmYWlsZWQuIgogICAgICAgIGNvbmZfcmVzZXRfcXVlc3Rpb24gcmVnYXBpX2Vycm9yCiAgICAgICAgY29uZl9xdWVzdGlvbiBoaWdoIHJlZ2FwaV9lcnJvcgogICAgICAgIGV4aXQgMQogICAgICBlbHNlCiAgICAgICAgZWNobwogICAgICAgIGVjaG8gIlJlZ2lzdHJ5IGVudHJpZXMgc3VjY2Vzc2Z1bGx5IGluc3RhbGxlZC4iCiAgICAgIGZpCiAgICBlbHNlCiAgICAgIGVjaG8KICAgICAgZWNobyAiUmVnaXN0cnkgZW50cmllcyBzdWNjZXNzZnVsbHkgaW5zdGFsbGVkLiIKICAgIGZpCiAgfQogIGZpCiAgcm0gLWYgJFRNUFJFRwogIGlmIFsgIiRTWVNSRUciID0gJ2F1dG8nIF0KICB0aGVuIFNZU1JFRz15ZXMKICBmaQoKICAjIGlmIHdlIGNvbnZlcnRlZCB3ZSBuZWVkIHRvIGNoYW5nZSB0aGUgZ3JhcGhpY3MgZHJpdmVyIGJhY2sgYW5kCiAgIyByZXN0b3JlIHRoZSBvcmlnaW5hbCAud2luZXJjIGZpbGUKICBpZiBbICIkQ09OVkNPTkYiID0gJ3llcycgXQogIHRoZW4KICAgICBtdiAkV0lORUlOSS5uZXcgJFdJTkVJTkkKICBmaQoKICBzZWQgInMvXCJHcmFwaGljc0RyaXZlclwiID0gLiovXCJHcmFwaGljc0RyaXZlclwiID0gXCJ4MTFkcnZcIi8iICRMQ09ORiA+ICRMQ09ORi5uZXcKICBtdiAkTENPTkYubmV3ICRMQ09ORgp9CmZpCgojIG1ha2Ugcm9vdCdzIHJlZ2lzdHJ5IGdsb2JhbCwgaWYgZGVzaXJlZAppZiBbIGB3aG9hbWlgID0gJ3Jvb3QnIF0gJiYgWyAiJERPUkVHIiA9ICd5ZXMnIF0gJiYgWyAiJFNZU1JFRyIgPSAneWVzJyBdCnRoZW4gewogIFsgLWQgfi8ud2luZSBdIHx8IG1rZGlyIH4vLndpbmUKICBpZiAhIFsgLWYgJHN5c2NvbmZkaXIvd2luZS51c2VycmVnIF0KICB0aGVuIHsKICAgIGVjaG8gIkxpbmtpbmcgcm9vdCdzIHVzZXIgcmVnaXN0cnkgaGl2ZSB0byB0aGUgZ2xvYmFsIHJlZ2lzdHJ5Li4uIgogICAgWyAtZiB+Ly53aW5lL3dpbmUudXNlcnJlZyBdICYmIGNwIH4vLndpbmUvd2luZS51c2VycmVnICRzeXNjb25mZGlyL3dpbmUudXNlcnJlZwogICAgbG4gLXNmICRzeXNjb25mZGlyL3dpbmUudXNlcnJlZyB+Ly53aW5lL3dpbmUudXNlcnJlZwogIH0KICBmaQogIGlmICEgWyAtZiAkc3lzY29uZmRpci93aW5lLnN5c3RlbXJlZyBdCiAgdGhlbiB7CiAgICBlY2hvICJMaW5raW5nIHJvb3QncyBzeXN0ZW0gcmVnaXN0cnkgaGl2ZSB0byB0aGUgZ2xvYmFsIHJlZ2lzdHJ5Li4uIgogICAgWyAtZiB+Ly53aW5lL3N5c3RlbS5yZWcgXSAmJiBjcCB+Ly53aW5lL3N5c3RlbS5yZWcgJHN5c2NvbmZkaXIvd2luZS5zeXN0ZW1yZWcKICAgIGxuIC1zZiAkc3lzY29uZmRpci93aW5lLnN5c3RlbXJlZyB+Ly53aW5lL3N5c3RlbS5yZWcKICB9CiAgZmkKfQpmaQoKIyBjbGVhbnVwIGFueSB0ZW1wb3JhcnkgZmlsZXMgdGhhdCBtYXkgcmVtYWluCmlmIFsgLWYgJFRNUENPTkYgXQp0aGVuIHJtIC1mICRUTVBDT05GCmZpCmlmIFsgLWYgJFRNUFJFRyBdCnRoZW4gcm0gLWYgJFRNUFJFRwpmaQoKCiMgaXQncyBhIHdyYXAKZWNobwplY2hvICJJbnN0YWxsYXRpb24gY29tcGxldGUgZm9yIG5vdy4gR29vZCBsdWNrICh0aGlzIGlzIHN0aWxsIGFscGhhIHNvZnR3YXJlKS4iCmVjaG8gIklmIHlvdSBoYXZlIHByb2JsZW1zIHdpdGggV0lORSwgcGxlYXNlIHJlYWQgdGhlIGRvY3VtZW50YXRpb24gZmlyc3QsIgplY2hvICJhcyBtYW55IGtpbmRzIG9mIHBvdGVudGlhbCBwcm9ibGVtcyBhcmUgZXhwbGFpbmVkIHRoZXJlLiIKCmV4aXQgMAo=