IyEvYmluL2Jhc2gKIyBXSU5FIEluc3RhbGxhdGlvbiBzY3JpcHQKIyBDYW4gZG8gYWxtb3N0IGV2ZXJ5dGhpbmcgZnJvbSBjb21waWxpbmcgdG8gY29uZmlndXJpbmcuLi4KCiMgTWFyIDMxIDE5OTkgLSBPdmUgS+V2ZW4KIyAgRmlyc3QgdmVyc2lvbgojIERlYyA5IDE5OTkgLSBPdmUgS+V2ZW4KIyAgcmVxdWlyZSBYcG0KIyBGZWIgMjUgMjAwMCAtIE92ZSBL5XZlbgojICBhdXRvLWFkZCAvdXNyL2xvY2FsL2xpYiB0byAvZXRjL2xkLnNvLmNvbmYKIyBNYXIgMiAyMDAwIC0gT3ZlIEvldmVuCiMgIHNvdXJjZSByYXRoZXIgdGhhbiBncmVwIGNvbmZpZy5jYWNoZQojICB1c2Ugc291cmNlZCBjb25maWcuY2FjaGUgdG8gc3RhcnQgbGRjb25maWcKIyAgcmVjb25maWd1cmUgaWYgY29uZmlnLmNhY2hlIGRvZXNuJ3QgZXhpc3QKIyBNYXIgMzAgMjAwMCAtIE92ZSBL5XZlbgojICBhdXRvY29uZmlndXJlIG5vLXdpbmRvd3MgaW5zdGFsbHMKIyAgZG8gbm90IGluc3RhbGwgcmVnaXN0cnkgb24gcmVhbC13aW5kb3dzIGluc3RhbGxzCiMgIHNvbWUgc3VwcG9ydCBmb3IgYmluYXJ5IHBhY2thZ2UgaW5zdGFsbHMKIyAgc2V0IGFuZCB0ZWxsIHVzZXIgYWJvdXQgTERfTElCUkFSWV9QQVRIIGlmIG5lY2Vzc2FyeQojICBzZXQgRVhUUkFfTERfTElCUkFSWV9QQVRIIGluIHdpbmUuY29uZgojIEFwciA5IDIwMDAgLSBPdmUgS+V2ZW4KIyAgbWFrZSByb290J3MgcmVnaXN0cnkgZ2xvYmFsIChzeXN0ZW0tZGVmYXVsdCkKIyBNYXkgOSAyMDAwIC0gT3ZlIEvldmVuCiMgIHVzZSB0dHlkcnYgd2hlbiBydW5uaW5nIHJlZ2FwaSwgc28gd2UgZG9uJ3QgaGF2ZSB0byBydW4gZnJvbSBYCiMgIGNoYW5nZSBkZWJ1Z2dlciBwYXRoIGluIHJlZ2lzdHJ5CiMgT2N0IDI5IDIwMDAgLSBPdmUgS+V2ZW4KIyAgYWRkZWQgLS1lbmFibGUtb3BlbmdsIHRvIGRlZmF1bHQgY29uZmFyZ3MKIyAgYWRkZWQgY29uZl9xdWVzdGlvbiwgY29uZl95ZXNub19hbnN3ZXIsIGFuZCBjb25mX3N0cmluZ19hbnN3ZXIgZnVuY3Rpb25zCiMgIGFkZGVkIERFRkNBVCB2YXJpYWJsZQojIChsYXRlciB0aGF0IGRheS4uLikKIyAgYWRkZWQgY29uZl9yZXNldF9xdWVzdGlvbiBmdW5jdGlvbgojICBhZGRlZCBmaWxlIGV4aXN0ZW5jZSBjaGVja3MgdG8gdGhlIHJlZ2lzdHJ5IGNvcHlpbmcKIyAgZml4ZWQgcHJvYmxlbSB3aXRoIG5vLXdpbmRvd3MgZGlyZWN0b3J5IGNyZWF0aW9uCiMgIHNvbWUgdGV4dCByZWZvcm1hdHRpbmcgZnJvbSBFcmljIE1hcnluaWFrCiMgSmFuIDUgMjAwMCAtIENocmlzIE1vcmdhbgojICB1c2UgZGVmYXVsdCBjb25maWcgZmlsZSBpbiAvZG9jdW1lbnRhdGlvbi9zYW1wbGVzL2NvbmZpZwojICByZXBsYWNlIC53aW5lcmMgd2l0aCB+Ly53aW5lL2NvbmZpZyBpbiBwcmludGVkIHRleHQKIyAgYWRkZWQgdXNlciBxdWVzdGlvbiB0byBjb252ZXJ0IC53aW5lcmMgZmlsZShpZiBleGlzdHMpIG9yIHVzZSB0aGUgZGVmYXVsdAojICAgIGNvbmZpZyBmaWxlCiMgIGFkZCBjb25mX3F1ZXN0aW9uIHRvIGFsbG93IHJvb3QgdG8gaW5zdGFsbCBhIGxvY2FsIGNvbmZpZyBmaWxlIGFuZAojICAgIHJlZ2lzdHJ5CiMgSmFuIDEyIDIwMDAgLSBDaHJpcyBNb3JnYW4KIyAgZGlzdGluZ3Vpc2ggYmV0d2VlbiBjcmVhdGluZyBsb2NhbCBhbmQgZ2xvYmFsIGNvbmZpZyBmaWxlcwojICBkaXNwbGF5IGEgbWVzc2FnZSBhYm91dCB0aGUgc3RhdHVzIG9mIGdsb2JhbCBjb25maWcgZmlsZXMKIyAgbWlzYyBjbGVhbnVwcyBhbmQgcmVvcmRlcmluZyBvZiBxdWVzdGlvbnMKIyAgYWRkZWQgY2hlY2sgdG8gc2VlIGlmIHdpbmUgaXMgaW5zdGFsbGVkIHdoZW4gd2UgYXJlIHJ1bm5pbmcgYXMgYSBub3JtYWwKIyAgICB1c2VyIGFuZCBwcmludCBhIG1lc3NhZ2UgaWYgd2luZSBjYW5ub3QgYmUgZm91bmQKIyBGZWIgMTYgMjAwMiAtIEFkYW0gRC4gTW9zcwojICBVc2UgY29uZmlnLnN0YXR1cyBpbnN0ZWFkIG9mIGNvbmZpZy5jYWNoZSB0byBjaGVjayB3aGV0aGVyIHdlJ3JlCiMgICAgY29uZmlndXJlZC9jb21waWxlZCBhbmQgdG8gcmVjcmVhdGUgdGhlIGNvbmZpZ3VyYXRpb24KIyBGZWIgMjAgMjAwMiAtIEFkYW0gRC4gTW9zcwojICBQYXJ0aWFsbHkgcmV2ZXJ0IHByZXZpb3VzIGNoYW5nZXMsIGZvcmNlIGNvbmZpZ3VyZSB0byB3cml0ZSBhbgojICAgIG9sZC1zdHlsZSBjb25maWcuY2FjaGUKCiMtLS0gZGVmYXVsdHMgKGNoYW5nZSB0aGVzZSBpZiB5b3UgYXJlIGEgcGFja2FnZXIpCkNPTkZBUkdTPSItLWVuYWJsZS1vcGVuZ2wiICAgICMgY29uZmlndXJlIGFyZ3MsIGUuZy4gLS1wcmVmaXg9L3VzciAtLXN5c2NvbmZkaXI9L2V0YwpwcmVmaXg9L3Vzci9sb2NhbCAgICAgICAgICAgICAjIGluc3RhbGxhdGlvbiBwcmVmaXgKc3lzY29uZmRpcj0kcHJlZml4L2V0YyAgICAgICAgIyB3aGVyZSB3aW5lLmNvbmYgYW5kIGdsb2JhbCByZWdpc3RyeSBpcyBzdXBwb3NlZCB0byBiZQpiaW5kaXI9JHByZWZpeC9iaW4gICAgICAgICAgICAjIHdoZXJlIHdpbmVsaWIgYXBwcyB3aWxsIGJlIChvciBpcykgaW5zdGFsbGVkCmxpYmRpcj0kcHJlZml4L2xpYiAgICAgICAgICAgICMgd2hlcmUgbGlid2luZS5zbyB3aWxsIGJlIChvciBpcykgaW5zdGFsbGVkCmV4ZGlyPWRvY3VtZW50YXRpb24vc2FtcGxlcyAgICMgd2hlcmUgdGhlIGV4YW1wbGUgc3lzdGVtLmluaSByZXNpZGVzCkdDT05GPSRzeXNjb25mZGlyL3dpbmUuY29uZiAgICMgZGVmYXVsdCBwYXRoIG9mIHRoZSB3aW5lLmNvbmYgZ2xvYmFsIGNvbmZpZyBmaWxlCkxDT05GPX4vLndpbmUvY29uZmlnICAgICAgICAgICMgZGVmYXVsdCBwYXRoIG9mIHRoZSBsb2NhbCBjb25maWcgZmlsZQpCSU5ESVNUPW5vICAgICAgICAgICAgICAgICAgICAjIHdoZXRoZXIgY2FsbGVkIGZyb20gYSBiaW5hcnkgcGFja2FnZSBjb25maWcgc2NyaXB0CkRPR0xPQkFMQ09ORj1hdXRvICAgICAgICAgICAgICMgd2hldGhlciB0byBhdXRvZ2VuZXJhdGUgd2luZS5jb25mCkRPTE9DQUxDT05GPWF1dG8gICAgICAgICAgICAgICMgd2hldGhlciB0byBhdXRvZ2VuZXJhdGUgbG9jYWxjb25mCkRPV0NISz1hdXRvICAgICAgICAgICAgICAgICAgICMgd2hldGhlciB0byBhdXRvY29uZmlndXJlIGV4aXN0aW5nLXdpbmRvd3MgaW5zdGFsbGF0aW9uCkRPV0lORT1hdXRvICAgICAgICAgICAgICAgICAgICMgd2hldGhlciB0byBhdXRvY29uZmlndXJlIG5vLXdpbmRvd3MgaW5zdGFsbGF0aW9uCkRPUkVHPWF1dG8gICAgICAgICAgICAgICAgICAgICMgd2hldGhlciB0byBpbnN0YWxsIGRlZmF1bHQgcmVnaXN0cnkKU1lTUkVHPXllcyAgICAgICAgICAgICAgICAgICAgIyB3aGV0aGVyIHRvIG1ha2Ugcm9vdCdzIHJlZ2lzdHJ5IGdsb2JhbCAoc3lzdGVtLWRlZmF1bHQpCkNPTlZDT05GPW5vCQkgICAgICAjIHdoZXRoZXIgd2UgYXJlIGNvbnZlcnRpbmcgYW4gZXhpc3RpbmcgLndpbmVyYyBvciBub3QKCiMgIm1ha2UgaW5zdGFsbCIgc3RpbGwgaW5zdGFsbHMgdGhlIGRsbHMgaW50byAkbGliZGlyLCBidXQgdGhpcyBtYXkgY2hhbmdlIGluIHRoZSBmdXR1cmUKIyAoRExMUEFUSCBzaG91bGQgcG9pbnQgdG8gdGhlbSBpZi93aGVuIHRoZXkgYXJlIG5vdCBpbiBzdGFuZGFyZCBsZC5zbyBwYXRocykKRExMUEFUSD0kbGliZGlyL3dpbmUgICAgICAgICAgIyBkZWZhdWx0IHBhdGggb2YgdGhlIGRsbCAuc28gZmlsZXMgKGV4Y2VwdCBsaWJ3aW5lLnNvKQoKIyBoYXZpbmcgdGhlIFdpbmUgZGVidWdnZXIgbGF1bmNoZWQgYXV0b21hdGljYWxseSB3aWxsIGJlIGEgcGx1cyBmb3IgdXMKREVCVUdHRVI9JGJpbmRpci93aW5lZGJnICAgICAgIyB0aGUgKGluc3RhbGxlZCkgcGF0aCBvZiB3aW5lZGJnCkhERUJVR0dFUj1kZWJ1Z2dlci93aW5lZGJnICAgICMgdGhlIChub24taW5zdGFsbGVkKSBwYXRoIG9mIHdpbmVkYmcKCiMgdGhpcyBpcyBvbmx5IGZvciBleGlzdGluZy13aW5kb3dzIGluc3RhbGxzCldJTkVDT05GPXRvb2xzL3dpbmVjb25mICAgICAgICMgdGhlIHBhdGggb2Ygd2luZWNvbmYgcGVybCBzY3JpcHQKCiMgdGhpcyBpcyBvbmx5IGZvciBuby13aW5kb3dzIGluc3RhbGxzCldJTkVJTkk9JGV4ZGlyL2NvbmZpZyAgICAgICAgICMgdGhlIHBhdGggb2YgZGVmYXVsdCB3aW5lIGNvbmZpZyBmaWxlIChhbHNvIHVzZWQgYnkgd2luZWNvbmYpCldJTklOST0vZGV2L251bGwgICAgICAgICAgICAgICMgdGhlIHBhdGggb2YgZGVmYXVsdCB3aW4uaW5pClNZU1RFTUlOST0kZXhkaXIvc3lzdGVtLmluaSAgICMgdGhlIHBhdGggb2YgZGVmYXVsdCBzeXN0ZW0uaW5pClJFR0FQST1wcm9ncmFtcy9yZWdhcGkvcmVnYXBpICMgdGhlIHBhdGggb2YgcmVnYXBpIHdpbmVsaWIgYXBwbGljYXRpb24KREVGUkVHPXdpbmVkZWZhdWx0LnJlZyAgICAgICAgIyB0aGUgcGF0aCBvZiB0aGUgcmVnaXN0cnkgZmlsZSB0byBiZSBmZWQgdG8gcmVnYXBpCiMgQ1JPT1Q9L3Zhci93aW5lICAgICAgICAgICAgICMgdGhlIHBhdGggb2YgdGhlIGZha2UgRHJpdmUgQyAoYXNrcyB1c2VyIGlmIG5vdCBzZXQpCkRFRkNBVD1jYXQgICAgICAgICAgICAgICAgICAgICMgcHJvZ3JhbSB0byBjYXQgJERFRlJFRyB3aXRoIChzb21lIHBhY2thZ2VzIG5lZWQgemNhdCkKIy0tLSBlbmQgb2YgZGVmYXVsdHMKCiMgdGVtcG9yYXJ5IGZpbGVzIHVzZWQgYnkgdGhlIGluc3RhbGxlcgpUTVBDT05GPS90bXAvd2luZWluc3RhbGwuY29uZgpUTVBSRUc9L3RtcC93aW5laW5zdGFsbC5yZWcKCiMgZnVuY3Rpb25zCgpmdW5jdGlvbiBzdGRfc2xlZXAgewogIHNsZWVwIDEKfQoKZnVuY3Rpb24gY29uZl9xdWVzdGlvbiB7CiAgIyBwYXJhbWV0ZXJzOiAkMSA9IGltcG9ydGFuY2UsICQyID0gcXVlc3Rpb24taWQsICQzKyA9IG1lc3NhZ2UgbGluZXMKICAjIHRoZSBmaXJzdCB0d28gcGFyYW1ldGVycyBjYW4gYmUgdXNlZCBieSBlLmcuIGRlYmNvbmYgaW4gZGViaWFuIHBhY2thZ2VzCiAgIyBidXQgaGVyZSB3ZSBqdXN0IHByaW50IHRoZSBtZXNzYWdlCiAgc2hpZnQgMgogIGVjaG8KICBsb2NhbCBMSU5FPSIkMSIKICB3aGlsZSBzaGlmdAogIGRvIHsKICAgIGVjaG8gIiRMSU5FIgogICAgTElORT0iJDEiCiAgfQogIGRvbmUKfQoKZnVuY3Rpb24gY29uZl9yZXNldF9xdWVzdGlvbiB7CiAgIyBwYXJhbWV0ZXJzOiAkMSA9IHF1ZXN0aW9uLWlkCiAgIyB0aGlzIGlzIHVzZWQgdG8gZmx1c2ggYW55IGNhY2hlZCBhbnN3ZXJzIGFuZCAiYWxyZWFkeS1kaXNwbGF5ZWQiIGZsYWdzCiAgc2hpZnQgIyBkdW1teSBjb21tYW5kCn0KCmZ1bmN0aW9uIGNvbmZfeWVzbm9fYW5zd2VyIHsKICB1bnNldCBBTlNXRVIKICB3aGlsZSBbICIkQU5TV0VSIiAhPSAneWVzJyBdICYmIFsgIiRBTlNXRVIiICE9ICdubycgXQogIGRvIHsKICAgIGVjaG8gLW4gIiQxIgogICAgcmVhZCBBTlNXRVIKICB9CiAgZG9uZQp9CgpmdW5jdGlvbiBjb25mX3N0cmluZ19hbnN3ZXIgewogIGVjaG8gLW4gIiQxIgogIHJlYWQgQU5TV0VSCn0KCmZ1bmN0aW9uIGNyZWF0ZV93aW5kb3dzX2RpcmVjdG9yaWVzIHsKICBmb3IgdGRpciBpbiAiJENST09UL3dpbmRvd3MiICIkQ1JPT1Qvd2luZG93cy9zeXN0ZW0iIFwKICAgICAgICAgICAgICAiJENST09UL3dpbmRvd3MvU3RhcnQgTWVudSIgIiRDUk9PVC93aW5kb3dzL1N0YXJ0IE1lbnUvUHJvZ3JhbXMiIFwKICAgICAgICAgICAgICAiJENST09UL0NvbW1vbiBGaWxlcyIgIiRDUk9PVC9Qcm9ncmFtIEZpbGVzIiBcCiAgICAgICAgICAgICAgIiRDUk9PVC93aW5kb3dzL1Byb2ZpbGVzIiAiJENST09UL3dpbmRvd3MvUHJvZmlsZXMvQWRtaW5pc3RyYXRvciIKICBkbyBbIC1kICIkdGRpciIgXSB8fCBta2RpciAiJHRkaXIiCiAgZG9uZQogIFsgLWYgIiRDUk9PVC93aW5kb3dzL3dpbi5pbmkiIF0gICAgfHwgY3AgIiRXSU5JTkkiICAgICIkQ1JPT1Qvd2luZG93cy93aW4uaW5pIgogIFsgLWYgIiRDUk9PVC93aW5kb3dzL3N5c3RlbS5pbmkiIF0gfHwgY3AgIiRTWVNURU1JTkkiICIkQ1JPT1Qvd2luZG93cy9zeXN0ZW0uaW5pIgp9CgojIHN0YXJ0dXAuLi4KCmVjaG8gIldJTkUgSW5zdGFsbGVyIHYwLjcxIgplY2hvCgppZiBbICIkQklORElTVCIgPSAnbm8nIF0KdGhlbiB7CgppZiAhIFsgLWYgY29uZmlndXJlIF0KdGhlbiB7CiAgZWNobyAiWW91J3JlIHJ1bm5pbmcgdGhpcyBmcm9tIHRoZSB3cm9uZyBkaXJlY3RvcnkuIgogIGVjaG8gIkNoYW5nZSB0byB0aGUgV2luZSBzb3VyY2UncyBtYWluIGRpcmVjdG9yeSBhbmQgdHJ5IGFnYWluLiIKICBleGl0IDEKfQpmaQoKIyBjaGVjayB3aGV0aGVyIFJQTSBpbnN0YWxsZWQsIGFuZCBpZiBpdCBpcywgcmVtb3ZlIGFueSBvbGQgd2luZSBycG0uCmhhc2ggcnBtICY+L2Rldi9udWxsClJFVD0kPwppZiBbICRSRVQgLWVxIDAgXTsgdGhlbgogIGlmIFsgLW4gImBycG0gLXFpIHdpbmUgMj4vZGV2L251bGx8Z3JlcCAiXk5hbWUiYCIgXTsgdGhlbgogICAgZWNobyAiV2FybmluZzogT2xkIFdpbmUgUlBNIGluc3RhbGwgZGV0ZWN0ZWQuIERvIHlvdSB3YW50IHRvIHJlbW92ZSBpdCBmaXJzdD8iCiAgICBjb25mX3llc25vX2Fuc3dlciAiKHllcy9ubykgIgogICAgaWYgWyAiJEFOU1dFUiIgPSAneWVzJyBdOyB0aGVuCiAgICAgIGVjaG8gU3RhcnRpbmcgd2luZSBycG0gcmVtb3ZhbC4uLgogICAgICBycG0gLWUgd2luZTsgUkVUPSQ/CiAgICAgIGlmIFsgJFJFVCAtZXEgMCBdOyB0aGVuCiAgICAgICAgZWNobyBEb25lLgogICAgICBlbHNlCiAgICAgICAgZWNobyAiRkFJTEVELiBQcm9iYWJseSB5b3UgYXJlbid0IGluc3RhbGxpbmcgYXMgcm9vdC4iCgllY2hvICJFeHBlY3QgcHJvYmxlbXMgKGxpYnJhcnkgY29uZmxpY3RzIHdpdGggZXhpc3RpbmcgaW5zdGFsbCBldGMuKS4iCiAgICAgIGZpCiAgICBlbHNlCiAgICAgIGVjaG8gIlNvcnJ5LCBJIHdvbid0IGluc3RhbGwgV2luZSB3aGVuIGFuIHJwbSB2ZXJzaW9uIGlzIHN0aWxsIGluc3RhbGxlZC4iCiAgICAgIGVjaG8gIihXaW5lIHN1cHBvcnQgc3VmZmVyZWQgZnJvbSB3YXkgdG9vIG1hbnkgY29uZmxpY3RzKSIKICAgICAgZWNobyAiSGF2ZSBhIG5pY2UgZGF5ICEiCiAgICAgIGV4aXQgMQogICAgZmkgCiAgZmkKZmkKCiMgY2hlY2sgd2hldGhlciB3aW5lIGJpbmFyeSBzdGlsbCBhdmFpbGFibGUKaWYgWyAtbiAiYHdoaWNoIHdpbmVgIiBdOyB0aGVuCiAgZWNobyAiV2FybmluZyAhISB3aW5lIGJpbmFyeSAoc3RpbGwpIGZvdW5kLCB3aGljaCBtYXkgaW5kaWNhdGUiCiAgZWNobyAiYSAoY29uZmxpY3RpbmcpIHByZXZpb3VzIGluc3RhbGxhdGlvbi4iCiAgZWNobyAiWW91IG1pZ2h0IHdhbnQgdG8gYWJvcnQgYW5kIHVuaW5zdGFsbCBXaW5lIGZpcnN0LiIKICBzdGRfc2xlZXAKZmkKCiMgcnVuIHRoZSBjb25maWd1cmUgc2NyaXB0LCBpZiBuZWNlc3NhcnkKCmlmIFsgLWYgY29uZmlnLmNhY2hlIF0gJiYgWyAtZiBNYWtlZmlsZSBdICYmIFsgTWFrZWZpbGUgLW50IGNvbmZpZ3VyZSBdCnRoZW4gewogIGVjaG8gIkkgc2VlIHRoYXQgV0lORSBoYXMgYWxyZWFkeSBiZWVuIGNvbmZpZ3VyZWQsIHNvIEknbGwgc2tpcCB0aGF0LiIKICBzdGRfc2xlZXAKICAjIGxvYWQgY29uZmlndXJlIHJlc3VsdHMKICAuIC4vY29uZmlnLmNhY2hlCn0KZWxzZSB7CiAgZWNobyAiUnVubmluZyBjb25maWd1cmUuLi4iCiAgZWNobwogIGlmICEgLi9jb25maWd1cmUgLUMgJENPTkZBUkdTCiAgdGhlbiB7CiAgICBlY2hvCiAgICBlY2hvICJDb25maWd1cmUgZmFpbGVkLCBhYm9ydGluZyBpbnN0YWxsLiIKICAgIHJtIC1mIGNvbmZpZy5jYWNoZQogICAgZXhpdCAxCiAgfQogIGZpCiAgIyBsb2FkIGNvbmZpZ3VyZSByZXN1bHRzCiAgLiAuL2NvbmZpZy5jYWNoZQogICMgbWFrZSBzdXJlIFggd2FzIGZvdW5kCiAgZXZhbCAiJGFjX2N2X2hhdmVfeCIKICBpZiBbICIkaGF2ZV94IiAhPSAieWVzIiBdCiAgdGhlbiB7CiAgICBlY2hvICJJbnN0YWxsIHRoZSBYIGRldmVsb3BtZW50IGhlYWRlcnMgYW5kIHRyeSBhZ2Fpbi4iCiAgICBybSAtZiBjb25maWcuY2FjaGUKICAgIGV4aXQgMQogIH0KICBmaQp9CmZpCgojIG5vdyBkbyB0aGUgY29tcGlsYXRpb24KCmlmIFsgLWYgd2luZSBdICYmIFsgd2luZSAtbnQgY29uZmlnLmNhY2hlIF0KdGhlbiB7CiAgZWNobyAiSG1tLCBsb29rcyBsaWtlIFdJTkUgaXMgYWxyZWFkeSBjb21waWxlZC4gSSdsbCBza2lwIHRoYXQgdG9vLCBJIGd1ZXNzLiIKICBzdGRfc2xlZXAKfQplbHNlIHsKICBlY2hvICJDb21waWxpbmcgV0lORS4gR3JhYiBhIGx1bmNoIG9yIHR3bywgcmVudCBhIHZpZGVvLCBvciB3aGF0ZXZlciwiCiAgZWNobyAiaW4gdGhlIG1lYW50aW1lLi4uIgogIGVjaG8KICBzdGRfc2xlZXAKICBpZiAhIHsgbWFrZSBkZXBlbmQgJiYgbWFrZTsgfQogIHRoZW4gewogICAgZWNobwogICAgZWNobyAiQ29tcGlsYXRpb24gZmFpbGVkLCBhYm9ydGluZyBpbnN0YWxsLiIKICAgIGV4aXQgMQogIH0KICBmaQogIGVjaG8KfQpmaQoKIyBhbmQgaW5zdGFsbGF0aW9uLCBpZiByb290CgppZiBbIGB3aG9hbWlgICE9ICdyb290JyBdCnRoZW4gewogIGVjaG8gIllvdSBhcmVuJ3Qgcm9vdCwgc28gSSdsbCBza2lwIHRoZSBtYWtlIGluc3RhbGwuIgoKICAjIHNldHVwIHRvIHJ1biBmcm9tIGN1cnJlbnQgZGlyZWN0b3J5CiAgRExMUEFUSD0iJFBXRC9kbGxzIgogIGlmIFsgLXogIiRMRF9MSUJSQVJZX1BBVEgiIF0KICB0aGVuIExEX0xJQlJBUllfUEFUSD0iJFBXRDokRExMUEFUSCIKICBlbHNlIExEX0xJQlJBUllfUEFUSD0iJExEX0xJQlJBUllfUEFUSDokUFdEOiRETExQQVRIIgogIGZpCiAgZXhwb3J0IExEX0xJQlJBUllfUEFUSAogIERFQlVHR0VSPSIkUFdELyRIREVCVUdHRVIiCiAgZWNobwogIGVjaG8gIk5PVEUhIFRvIHJ1biBXaW5lIHdpdGhvdXQgaW5zdGFsbGluZywgeW91IG11c3Qgc2V0IHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSIKICBlY2hvICJMRF9MSUJSQVJZX1BBVEggdG8gJFBXRDokRExMUEFUSCIKICBlY2hvICJpbiB5b3VyIGxvZ29uIHNjcmlwdHMuIgogIGVjaG8KCiAgIyBzZWUgaWYgd2luZSBpcyBpbnN0YWxsZWQgb24gdGhlIHVzZXJzIHN5c3RlbSwgaWYgbm90IHByb21wdCB0aGVtCiAgIyBhbmQgdGhlbiBleGl0CiAgaWYgWyAhIGB3aGljaCB3aW5lYCBdCiAgdGhlbgogICAgZWNobyAiQ291bGQgbm90IGZpbmQgd2luZSBvbiB5b3VyIHN5c3RlbS4gIFJ1biB3aW5laW5zdGFsbCBhcyByb290IHRvIGluc3RhbGwgd2luZSIKICAgIGVjaG8gImJlZm9yZSByZS1ydW5uaW5nIHdpbmVpbnN0YWxsIGFzIGEgdXNlci4iCiAgICBlY2hvCiAgICBlY2hvICJFeGl0aW5nIHdpbmVpbnN0YWxsIgogICAgZXhpdCAxOwogIGZpCn0KZWxzZSB7CiAgZWNobyAiTm93IGluc3RhbGxpbmcgYmluYXJpZXMgb250byB0aGUgc3lzdGVtLi4uIgogIGVjaG8KICBzdGRfc2xlZXAKICBpZiAhIG1ha2UgaW5zdGFsbAogIHRoZW4gewogICAgZWNobwogICAgZWNobyAiSW5zdGFsbGF0aW9uIGZhaWxlZCwgYWJvcnRpbmcuIgogICAgZXhpdCAxCiAgfQogIGZpCiAgaWYgWyAtZiAvZXRjL2xkLnNvLmNvbmYgXSAmJiAhIGdyZXAgLXFzICIkbGliZGlyIiAvZXRjL2xkLnNvLmNvbmYKICB0aGVuIHsKICAgIGVjaG8KICAgIGVjaG8gIiRsaWJkaXIgZGlkbid0IGV4aXN0IGluIHlvdXIgL2V0Yy9sZC5zby5jb25mLCBhZGRpbmcgaXQgbm93Li4uIgogICAgZWNobyAiJGxpYmRpciIgPj4vZXRjL2xkLnNvLmNvbmYKICAgIGVjaG8gIlJlLXJ1bm5pbmcgbGRjb25maWcuLi4iCiAgICBldmFsICIkYWNfY3ZfcGF0aF9MRENPTkZJRyIKICB9CiAgZmkKfQpmaQoKfQpmaSAjIEJJTkRJU1QKCiMgbm93IGNoZWNrIHdoZXRoZXIgd2Ugc2hvdWxkIGdlbmVyYXRlIHdpbmUuY29uZgppZiBbIC16ICIkRE9HTE9CQUxDT05GIiBdCnRoZW4KICBET0dMT0JBTENPTkY9YXV0bwpmaQoKaWYgWyAiJERPR0xPQkFMQ09ORiIgPSAnYXV0bycgXQp0aGVuIHsKICAjIHNlZSBpZiB3ZSBhbHJlYWR5IGhhdmUgYSBzeXN0ZW0gd2luZS5jb25mCiAgaWYgWyAhIC1mICRHQ09ORiBdICYmIFsgYHdob2FtaWAgPSAncm9vdCcgXQogIHRoZW4KICAgIERPR0xPQkFMQ09ORj1ubwogICAgZWNobyAiQ3JlYXRpb24gb2YgYSBnbG9iYWwgY29uZmlnIGZpbGUgaXMgbm90IHN1cHBvcnRlZCBpbiB3aW5laW5zdGFsbCBhdCB0aGlzIgogICAgZWNobyAidGltZS4gIFdoZW4gdGhlIGNvbmZpZ3VyYXRpb24gYXJjaGl0ZWN0dXJlIGlzIGNsZWFuZWQgdXAgdGhpcyBmdW5jdGlvbmFsaXR5IgogICAgZWNobyAid2lsbCBiZSByZXN0b3JlZCB0byB3aW5laW5zdGFsbC4iCiAgICBlY2hvCiAgZmkKfQpmaQoKaWYgWyAiJERPTE9DQUxDT05GIiA9ICdhdXRvJyBdCnRoZW4gewogICMgc2VlIGlmIHRoZSB1c2VyIGlzIHJvb3QsIGlmIHNvLCBleHBsaWNpdGx5IGFzayB0aGVtIGlmIHRoZXkgd2FudCBhCiAgIyBsb2NhbCBjb25maWcgZmlsZQogIGlmIFsgYHdob2FtaWAgPSAncm9vdCcgXQogIHRoZW4KICAgIGVjaG8gIllvdSBhcmUgcnVubmluZyBhcyByb290LiAgRG8geW91IHdhbnQgYSBsb2NhbCBjb25maWcgZmlsZSwiCiAgICBlY2hvICJmaWxlLCB+Ly53aW5lL2NvbmZpZywgY3JlYXRlZD8iCiAgICBjb25mX3llc25vX2Fuc3dlciAiKHllcy9ubykgIgogICAgRE9MT0NBTENPTkY9IiRBTlNXRVIiCiAgZWxzZQogICAgZWNobyAiQ3JlYXRlIGxvY2FsIGNvbmZpZyBmaWxlIH4vLndpbmUvY29uZmlnPyIKICAgIGNvbmZfeWVzbm9fYW5zd2VyICIoeWVzL25vKSAiCiAgICBlY2hvCiAgICBET0xPQ0FMQ09ORj0iJEFOU1dFUiIKICAgIGlmIFsgIiRBTlNXRVIiID0gJ25vJyBdCiAgICB0aGVuCiAgICAgIGNvbmZfcXVlc3Rpb24gaGlnaCBuZWVkX3Jvb3QgXAogICAgICAgICJBYm9ydGluZyBpbnN0YWxsLiBUcnkgYWdhaW4gYXMgcm9vdCB0byBnZW5lcmF0ZSBhIHN5c3RlbSB3aW5lLmNvbmYuIgogICAgICBleGl0IDEKICAgIGZpCiAgZmkKCiAgaWYgWyAtZiAiJExDT05GIiBdCiAgdGhlbgogICAgZWNobyAiRm91bmQgZXhpc3RpbmcgJExDT05GLCBpZiB5b3UgY29udGludWUgdGhpcyBmaWxlIHdpbGwgYmUiCiAgICBlY2hvICJvdmVyd3JpdHRlbi4gIENvbnRpbnVlIHJ1bm5pbmcgd2luZWluc3RhbGw/IgogICAgY29uZl95ZXNub19hbnN3ZXIgIih5ZXMvbm8pICIKICAgIGVjaG8KICAgIGlmIFsgIiRBTlNXRVIiID0gJ25vJyBdCiAgICB0aGVuCiAgICAgIGVjaG8gIkV4aXRpbmcgd2luZWluc3RhbGwiCiAgICAgIGV4aXQgMQogICAgZmkKICBmaQp9CmZpCgojIGdlbmVyYXRlICRUTVBDT05GIGZyb20gZXhpc3Rpbmcgd2luZG93cyBpbnN0YWxsLCBpZiBhbnkKaWYgWyAiJERPTE9DQUxDT05GIiA9ICd5ZXMnIF0KdGhlbiB7CiAgaWYgWyAiJERPV0NISyIgPSAneWVzJyBdIHx8IFsgIiRET1dDSEsiID0gJ2F1dG8nIF0KICB0aGVuIHsKICAgIGVjaG8gLW4gIlNlYXJjaGluZyBmb3IgYW4gZXhpc3RpbmcgV2luZG93cyBpbnN0YWxsYXRpb24uLi4iCiAgICBpZiAhICRXSU5FQ09ORiAtaW5pZmlsZSAiJFdJTkVJTkkiID4gJFRNUENPTkYgMj4vZGV2L251bGwKICAgIHRoZW4gewogICAgICBybSAtZiAkVE1QQ09ORiAkVE1QUkVHID4gL2Rldi9udWxsCgogICAgICBlY2hvICIgbm90IGZvdW5kLiAobm8gbWF0Y2hpbmcgL2V0Yy9mc3RhYiBtb3VudCBlbnRyeSBmb3VuZCkiCiAgICAgIGNvbmZfcXVlc3Rpb24gbG93IGRvX3dpdGhvdXRfd2luZG93cyBcCiAgICAgICAiV2luZG93cyB3YXMgbm90IGZvdW5kIG9uIHlvdXIgc3lzdGVtLCBzbyBJIGFzc3VtZSB5b3Ugd2FudCIgXAogICAgICAgImEgV2luZS1vbmx5IGluc3RhbGxhdGlvbi4gQW0gSSBjb3JyZWN0PyIKICAgICAgY29uZl95ZXNub19hbnN3ZXIgIih5ZXMvbm8pICIKICAgICAgaWYgWyAiJEFOU1dFUiIgPSAnbm8nIF0KICAgICAgdGhlbiB7CiAgICAgICAgY29uZl9xdWVzdGlvbiBoaWdoIHdpbmRvd3Nfbm90X2ZvdW5kIFwKICAgICAgICAgIkFib3J0aW5nIGluc3RhbGwuIE1ha2Ugc3VyZSB5b3VyIFdpbmRvd3MgcGFydGl0aW9uIGlzIG1vdW50ZWQgYW5kIHRyeSBhZ2FpbiwiIFwKICAgICAgICAgIm9yIGNyZWF0ZSAkTENPTkYgbWFudWFsbHkgYnkgY29weWluZyBmcm9tICRXSU5FSU5JIGFuZCBhZGFwdGluZyB0aGUgZHJpdmUgcGF0aHMuIgogICAgICAgIGV4aXQgMQogICAgICB9CiAgICAgIGZpCiAgICAgIERPV0lORT15ZXMKICAgIH0KICAgIGVsc2UgewogICAgICBlY2hvICIgZm91bmQuIgoKICAgICAgY29uZl9yZXNldF9xdWVzdGlvbiB3aW5kb3dzX2ZvdW5kCiAgICAgIGNvbmZfcXVlc3Rpb24gbG93IHdpbmRvd3NfZm91bmQgXAogICAgICAgIkNyZWF0ZWQgJExDT05GIHVzaW5nIHlvdXIgZXhpc3RpbmcgV2luZG93cyBpbnN0YWxsYXRpb24uIiBcCiAgICAgICAiWW91IHByb2JhYmx5IHdhbnQgdG8gcmV2aWV3IHRoZSBmaWxlLCB0aG91Z2guIgogICAgICBET1dJTkU9bm8KICAgIH0KICAgIGZpCiAgfQogIGVsaWYgWyAiJERPV0lORSIgPSAnYXV0bycgXQogIHRoZW4gRE9XSU5FPXllcwogIGZpCn0KZWxpZiBbICIkRE9XSU5FIiA9ICdhdXRvJyBdCnRoZW4gCiAgRE9XSU5FPW5vCmZpCgojIHNldHVwIGEgbm8td2luZG93cyBpbnN0YWxsYXRpb24sIGlmIG5lY2Vzc2FyeQppZiBbICIkRE9XSU5FIiA9ICd5ZXMnIF0KdGhlbiB7CiAgIyBzZXQgYW4gYXBwcm9wcmlhdGUgRENST09UCiAgaWYgWyBgd2hvYW1pYCAhPSAncm9vdCcgXQogIHRoZW4gRENST09UPX4vYwogIGVsc2UgRENST09UPS9jCiAgZmkKCiAgaWYgWyAtZiB+Ly53aW5lcmMgXQogIHRoZW4gewogICAgY29uZl9xdWVzdGlvbiBtZWRpdW0gY29udmVydF9jb25maWcgXAogICAgICJJIGZvdW5kIHRoZSBvbGQgdmVyc2lvbiBXaW5lIGNvbmZpZyBmaWxlLCAud2luZXJjLCBpbiB5b3VyICIgXAogICAgICJob21lIGRpcmVjdG9yeS4gIEkgY2FuIGNvbnZlcnQgdGhpcyB0byB0aGUgbmV3IGZvcm1hdCBvciB1c2UgdGhlIiBcCiAgICAgIm5ldyBkZWZhdWx0IFdpbmUgY29uZmlnIGZpbGUuIENvbnZlcnQ/IgogICAgY29uZl95ZXNub19hbnN3ZXIgIih5ZXMvbm8pICIKICAgIGlmIFsgIiRBTlNXRVIiID0gJ3llcycgXQogICAgdGhlbiB7CiAgICAgIFdJTkVJTkk9fi8ud2luZXJjCiAgICAgIENPTlZDT05GPXllcwogICAgfQogICAgZmkKICB9CiAgZWxzZSB7CgogICAgY29uZl9xdWVzdGlvbiBsb3cgZHJpdmVjX3BhdGggXAogICAgICJDb25maWd1cmluZyBXaW5lIHdpdGhvdXQgV2luZG93cy4iIFwKICAgICAiU29tZSBmYWtlIFdpbmRvd3MgZGlyZWN0b3JpZXMgbXVzdCBiZSBjcmVhdGVkLCB0byBob2xkIGFueSAuaW5pIGZpbGVzLCBETExzLCIgXAogICAgICJzdGFydCBtZW51IGVudHJpZXMsIGFuZCBvdGhlciB0aGluZ3MgeW91ciBhcHBsaWNhdGlvbnMgbWF5IG5lZWQgdG8gaW5zdGFsbC4iIFwKICAgICAiV2hlcmUgd291bGQgeW91IGxpa2UgeW91ciBmYWtlIEMgZHJpdmUgdG8gYmUgcGxhY2VkPyIKICAgIHdoaWxlIFsgLXogIiRDUk9PVCIgXQogICAgZG8gewogICAgICBjb25mX3N0cmluZ19hbnN3ZXIgIihkZWZhdWx0IGlzICREQ1JPT1QpICIKICAgICAgWyAteiAiJEFOU1dFUiIgXSAmJiBBTlNXRVI9IiREQ1JPT1QiCiAgICAgIGlmICEgWyAtZCAiJEFOU1dFUiIgXQogICAgICB0aGVuIHsKICAgICAgICBpZiBta2RpciAtcCAiJEFOU1dFUiIKICAgICAgICB0aGVuIENST09UPSIkQU5TV0VSIgogICAgICAgIGVsc2UKICAgICAgICAgIGVjaG8gIkRpcmVjdG9yeSAkQU5TV0VSIGNhbid0IGJlIGNyZWF0ZWQgISIKICAgICAgICAgIGNvbmZfcmVzZXRfcXVlc3Rpb24gZHJpdmVjX3BhdGgKICAgICAgICBmaQogICAgICB9CiAgICAgIGVsc2UgQ1JPT1Q9IiRBTlNXRVIiCiAgICAgIGZpCiAgICB9CiAgICBkb25lCiAgICBlY2hvICJDb25maWd1cmluZyBXaW5lIGZvciBhIG5vLXdpbmRvd3MgaW5zdGFsbCBpbiAkQ1JPT1QuLi4iCiAgCiAgICBjcmVhdGVfd2luZG93c19kaXJlY3RvcmllcwogIH0KICBmaQoKICAjIGNyZWF0ZSAkTENPTkYgdXNpbmcgdGhlIGRlZmF1bHQgY29uZmlnIGZpbGUgJFdJTkVJTkkgIAogIGlmIFsgIiRET0xPQ0FMQ09ORiIgPSAneWVzJyBdICYmIFsgIiRDT05WQ09ORiIgPSAnbm8nIF0KICB0aGVuIHsKICAgIHNlZCAic3xcIlBhdGhcIiA9IFwiL2NcIlwkfFwiUGF0aFwiID0gXCIke0NST09UfVwifCIgJFdJTkVJTkkgPiAkVE1QQ09ORgogICAgY29uZl9yZXNldF9xdWVzdGlvbiBkZWZhdWx0X2NvbmZpZwogICAgY29uZl9xdWVzdGlvbiBsb3cgZGVmYXVsdF9jb25maWcgXAogICAgICJDcmVhdGVkICRMQ09ORiB1c2luZyBkZWZhdWx0IFdpbmUgY29uZmlndXJhdGlvbi4iIFwKICAgICAiWW91IHByb2JhYmx5IHdhbnQgdG8gcmV2aWV3IHRoZSBmaWxlLCB0aG91Z2guIgogIH0KICBmaQoKICAjIG5vdyB3ZSByZWFsbHkgc2hvdWxkIGluc3RhbGwgdGhlIHJlZ2lzdHJ5CiAgaWYgWyAiJERPUkVHIiA9ICdhdXRvJyBdCiAgdGhlbiBET1JFRz15ZXMKICBmaQp9CmZpCmVjaG8KCiNpbnN0YWxsIHRoZSBsb2NhbCBjb25maWcgZmlsZSAkTENPTkYKaWYgWyAiJERPTE9DQUxDT05GIiA9ICd5ZXMnIF0KdGhlbgogIGlmIFsgISAtdyB+Ly53aW5lIF0KICB0aGVuCiAgICBta2RpciB+Ly53aW5lCiAgZmkKCiAgaWYgWyAiJENPTlZDT05GIiA9ICdubycgXQogIHRoZW4KICAgIGNwICRUTVBDT05GICRMQ09ORiA+IC9kZXYvbnVsbAogIGZpCmVsc2UKICBET1JFRz1ubwpmaSAgICAgIAoKI2luc3RhbGwgdGhlIGdsb2JhbCBjb25maWcgZmlsZSAkR0NPTkYKaWYgWyAiJERPR0xPQkFMQ09ORiIgPSAneWVzJyBdCnRoZW4KICBpZiBbICEgLWYgJHN5c2NvbmZkaXIgXQogIHRoZW4KICAgIG1rZGlyIC1wICRzeXNjb25mZGlyCiAgZmkKCiAgY3AgJFRNUENPTkYgJEdDT05GID4gL2Rldi9udWxsCmZpCgojIGNoZWNrIHdoZXRoZXIgd2UgbmVlZCB0byBpbnN0YWxsIGRlZmF1bHQgcmVnaXN0cnkKIyAobm90IHRvIGJlIGRvbmUgaWYgd2luZG93cyByZWdpc3RyeSBleGlzdHMpCmlmIFsgIiRET1JFRyIgPSAnYXV0bycgXQp0aGVuIHsKICBlY2hvICJDaGVja2luZyBmb3IgcmVhbCBXaW5kb3dzIHJlZ2lzdHJ5Li4uIgogIGlmIFsgLWYgIiRDUk9PVC93aW5kb3dzL3N5c3RlbS5kYXQiIF0KICB0aGVuIERPUkVHPW5vCiAgZWxpZiBbIC1mICIkQ1JPT1Qvd2luZG93cy9zeXN0ZW0zMi9jb25maWcvc3lzdGVtIiBdCiAgdGhlbiBET1JFRz1ubwogIGVsc2UgRE9SRUc9eWVzCiAgZmkKICBpZiBbICIkRE9SRUciID0gJ3llcycgXQogIHRoZW4gZWNobyAiTm90IGZvdW5kLCBkZWZhdWx0IFdpbmUgcmVnaXN0cnkgd2lsbCBiZSBpbnN0YWxsZWQuIgogIGVsc2UgZWNobyAiV2luZG93cyByZWdpc3RyeSBmb3VuZCwgd2lsbCBub3QgaW5zdGFsbCBkZWZhdWx0IFdpbmUgcmVnaXN0cnkuIgogIGZpCiAgZWNobwp9CmZpCgojIGluc3RhbGwgZGVmYXVsdCByZWdpc3RyeSBlbnRyaWVzCmlmIFsgIiRET1JFRyIgPSAneWVzJyBdCnRoZW4gewogIGlmIFsgIiRCSU5ESVNUIiA9ICdubycgXQogIHRoZW4gewogICAgZWNobyAiQ29tcGlsaW5nIHJlZ2FwaS4uLiIKICAgIChjZCBwcm9ncmFtcy9yZWdhcGk7IG1ha2UpCiAgICBlY2hvCiAgfQogIGZpCiAgZWNobyAiUHJlcGFyaW5nIHRvIGluc3RhbGwgZGVmYXVsdCBXaW5lIHJlZ2lzdHJ5IGVudHJpZXMuLi4iCgogICMgZWRpdCBjb25maWcgZmlsZXMgc28gd2UgZG9uJ3QgaGF2ZSB0byBydW4gcmVnYXBpIHVuZGVyIFgKICBpZiBbICIkQ09OVkNPTkYiID0gJ3llcycgXQogIHRoZW4KICAgIG12ICRXSU5FSU5JICRXSU5FSU5JLm5ldwogICAgc2VkICJzL0dyYXBoaWNzRHJpdmVyPS4qL0dyYXBoaWNzRHJpdmVyPXR0eWRydi8iICRXSU5FSU5JLm5ldyA+ICRXSU5FSU5JCiAgZWxzZQogICAgbXYgJExDT05GICRMQ09ORi5uZXcKICAgIHNlZCAicy9cIkdyYXBoaWNzRHJpdmVyXCIgPSAuKi9cIkdyYXBoaWNzRHJpdmVyXCIgPSBcInR0eWRydlwiLyIgJExDT05GLm5ldyA+ICRMQ09ORgogIGZpCgogICMgY3JlYXRlIGEgdGVtcG9yYXJ5IHdpbmVpbnN0YWxsLnJlZyB3aXRoIGZpeGVkIGRlYnVnZ2VyIHBhdGgKICAkREVGQ0FUICRERUZSRUcgfCBzZWQgInN8ZGVidWdnZXIvd2luZWRiZ3wke0RFQlVHR0VSfXwiID4gJFRNUFJFRwoKICBlY2hvICJJbnN0YWxsaW5nIGRlZmF1bHQgV2luZSByZWdpc3RyeSBlbnRyaWVzLi4uIgogIGVjaG8KICBpZiAhICRSRUdBUEkgc2V0VmFsdWUgPCAkVE1QUkVHID4gL2Rldi9udWxsCiAgdGhlbiB7CiAgICBybSAtZiAkVE1QUkVHCiAgICBlY2hvICJSZWdpc3RyeSBpbnN0YWxsIGZhaWxlZC4iCiAgICBjb25mX3Jlc2V0X3F1ZXN0aW9uIHJlZ2FwaV9lcnJvcgogICAgY29uZl9xdWVzdGlvbiBoaWdoIHJlZ2FwaV9lcnJvcgogICAgZXhpdCAxCiAgfQogIGVsc2UgewogICAgIyBpZiB3ZSBhcmUgY29udmVydGluZyBmcm9tIGEgLndpbmVyYyBmaWxlLCBydW5uaW5nIHJlZ2FwaSBvbmNlCiAgICAjIHdpbGwgT05MWSBjb252ZXJ0IC53aW5lcmMgLT4gfi8ud2luZS9jb25maWcsIGl0IHdpbGwgbm90IGltcG9ydCB0aGUKICAgICMgcmVnaXN0cnkgZGF0YS4gIHNvIGlmIHdlIGFyZSBjb252ZXJ0aW5nIHdlIG5lZWQgdG8gcnVuIHJlZ2FwaSB0d2ljZQogICAgaWYgWyAiJENPTlZDT05GIiA9ICd5ZXMnIF0KICAgIHRoZW4KICAgICAgaWYgISAkUkVHQVBJIHNldFZhbHVlIDwgJFRNUFJFRyA+IC9kZXYvbnVsbAogICAgICB0aGVuCiAgICAgICAgcm0gLWYgJFRNUFJFRwogICAgICAgIGVjaG8gIlJlZ2lzdHJ5IGluc3RhbGwgZmFpbGVkLiIKICAgICAgICBjb25mX3Jlc2V0X3F1ZXN0aW9uIHJlZ2FwaV9lcnJvcgogICAgICAgIGNvbmZfcXVlc3Rpb24gaGlnaCByZWdhcGlfZXJyb3IKICAgICAgICBleGl0IDEKICAgICAgZWxzZQogICAgICAgIGVjaG8KICAgICAgICBlY2hvICJSZWdpc3RyeSBlbnRyaWVzIHN1Y2Nlc3NmdWxseSBpbnN0YWxsZWQuIgogICAgICBmaQogICAgZWxzZQogICAgICBlY2hvCiAgICAgIGVjaG8gIlJlZ2lzdHJ5IGVudHJpZXMgc3VjY2Vzc2Z1bGx5IGluc3RhbGxlZC4iCiAgICBmaQogIH0KICBmaQogIHJtIC1mICRUTVBSRUcKICBpZiBbICIkU1lTUkVHIiA9ICdhdXRvJyBdCiAgdGhlbiBTWVNSRUc9eWVzCiAgZmkKCiAgIyBpZiB3ZSBjb252ZXJ0ZWQgd2UgbmVlZCB0byBjaGFuZ2UgdGhlIGdyYXBoaWNzIGRyaXZlciBiYWNrIGFuZAogICMgcmVzdG9yZSB0aGUgb3JpZ2luYWwgLndpbmVyYyBmaWxlCiAgaWYgWyAiJENPTlZDT05GIiA9ICd5ZXMnIF0KICB0aGVuCiAgICAgbXYgJFdJTkVJTkkubmV3ICRXSU5FSU5JCiAgZmkKCiAgc2VkICJzL1wiR3JhcGhpY3NEcml2ZXJcIiA9IC4qL1wiR3JhcGhpY3NEcml2ZXJcIiA9IFwieDExZHJ2XCIvIiAkTENPTkYgPiAkTENPTkYubmV3CiAgbXYgJExDT05GLm5ldyAkTENPTkYKfQpmaQoKIyBtYWtlIHJvb3QncyByZWdpc3RyeSBnbG9iYWwsIGlmIGRlc2lyZWQKaWYgWyBgd2hvYW1pYCA9ICdyb290JyBdICYmIFsgIiRET1JFRyIgPSAneWVzJyBdICYmIFsgIiRTWVNSRUciID0gJ3llcycgXQp0aGVuIHsKICBbIC1kIH4vLndpbmUgXSB8fCBta2RpciB+Ly53aW5lCiAgaWYgISBbIC1mICRzeXNjb25mZGlyL3dpbmUudXNlcnJlZyBdCiAgdGhlbiB7CiAgICBlY2hvICJMaW5raW5nIHJvb3QncyB1c2VyIHJlZ2lzdHJ5IGhpdmUgdG8gdGhlIGdsb2JhbCByZWdpc3RyeS4uLiIKICAgIFsgLWYgfi8ud2luZS93aW5lLnVzZXJyZWcgXSAmJiBjcCB+Ly53aW5lL3dpbmUudXNlcnJlZyAkc3lzY29uZmRpci93aW5lLnVzZXJyZWcKICAgIGxuIC1zZiAkc3lzY29uZmRpci93aW5lLnVzZXJyZWcgfi8ud2luZS93aW5lLnVzZXJyZWcKICB9CiAgZmkKICBpZiAhIFsgLWYgJHN5c2NvbmZkaXIvd2luZS5zeXN0ZW1yZWcgXQogIHRoZW4gewogICAgZWNobyAiTGlua2luZyByb290J3Mgc3lzdGVtIHJlZ2lzdHJ5IGhpdmUgdG8gdGhlIGdsb2JhbCByZWdpc3RyeS4uLiIKICAgIFsgLWYgfi8ud2luZS9zeXN0ZW0ucmVnIF0gJiYgY3Agfi8ud2luZS9zeXN0ZW0ucmVnICRzeXNjb25mZGlyL3dpbmUuc3lzdGVtcmVnCiAgICBsbiAtc2YgJHN5c2NvbmZkaXIvd2luZS5zeXN0ZW1yZWcgfi8ud2luZS9zeXN0ZW0ucmVnCiAgfQogIGZpCn0KZmkKCiMgY2xlYW51cCBhbnkgdGVtcG9yYXJ5IGZpbGVzIHRoYXQgbWF5IHJlbWFpbgppZiBbIC1mICRUTVBDT05GIF0KdGhlbiBybSAtZiAkVE1QQ09ORgpmaQppZiBbIC1mICRUTVBSRUcgXQp0aGVuIHJtIC1mICRUTVBSRUcKZmkKCgojIGl0J3MgYSB3cmFwCmVjaG8KZWNobyAiSW5zdGFsbGF0aW9uIGNvbXBsZXRlIGZvciBub3cuIEdvb2QgbHVjayAodGhpcyBpcyBzdGlsbCBhbHBoYSBzb2Z0d2FyZSkuIgplY2hvICJJZiB5b3UgaGF2ZSBwcm9ibGVtcyB3aXRoIFdJTkUsIHBsZWFzZSByZWFkIHRoZSBkb2N1bWVudGF0aW9uIGZpcnN0LCIKZWNobyAiYXMgbWFueSBraW5kcyBvZiBwb3RlbnRpYWwgcHJvYmxlbXMgYXJlIGV4cGxhaW5lZCB0aGVyZS4iCgpleGl0IDAK