IyEvYmluL2Jhc2gKIyBXSU5FIEluc3RhbGxhdGlvbiBzY3JpcHQKIyBDYW4gZG8gYWxtb3N0IGV2ZXJ5dGhpbmcgZnJvbSBjb21waWxpbmcgdG8gY29uZmlndXJpbmcuLi4KIwojIENvcHlyaWdodCAxOTk5IE92ZSBL5XZlbgojCiMgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgojIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKIyB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKIyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCiMKCiMtLS0gZGVmYXVsdHMgKGNoYW5nZSB0aGVzZSBpZiB5b3UgYXJlIGEgcGFja2FnZXIpCkNPTkZBUkdTPSIiICAgICAgICAgICAgICAgICAgICMgY29uZmlndXJlIGFyZ3MsIGUuZy4gLS1wcmVmaXg9L3VzciAtLXN5c2NvbmZkaXI9L2V0YwpwcmVmaXg9L3Vzci9sb2NhbCAgICAgICAgICAgICAjIGluc3RhbGxhdGlvbiBwcmVmaXgKc3lzY29uZmRpcj0kcHJlZml4L2V0YyAgICAgICAgIyB3aGVyZSB3aW5lLmNvbmYgYW5kIHRoZSBnbG9iYWwgcmVnaXN0cnkgYXJlIHN1cHBvc2VkIHRvIGJlCmJpbmRpcj0kcHJlZml4L2JpbiAgICAgICAgICAgICMgd2hlcmUgd2luZWxpYiBhcHBzIHdpbGwgYmUgKG9yIGFyZSkgaW5zdGFsbGVkCmxpYmRpcj0kcHJlZml4L2xpYiAgICAgICAgICAgICMgd2hlcmUgbGlid2luZS5zbyB3aWxsIGJlIChvciBpcykgaW5zdGFsbGVkCmV4ZGlyPWRvY3VtZW50YXRpb24vc2FtcGxlcyAgICMgd2hlcmUgdGhlIHNhbXBsZSBzeXN0ZW0uaW5pIHJlc2lkZXMKR0NPTkY9JHN5c2NvbmZkaXIvd2luZS5jb25mICAgIyBkZWZhdWx0IHBhdGggb2YgdGhlIHdpbmUuY29uZiBnbG9iYWwgY29uZmlnIGZpbGUKTENPTkY9fi8ud2luZS9jb25maWcgICAgICAgICAgIyBkZWZhdWx0IHBhdGggb2YgdGhlIGxvY2FsIGNvbmZpZyBmaWxlCkJJTkRJU1Q9bm8gICAgICAgICAgICAgICAgICAgICMgd2hldGhlciBjYWxsZWQgZnJvbSBhIGJpbmFyeSBwYWNrYWdlIGNvbmZpZyBzY3JpcHQKRE9HTE9CQUxDT05GPWF1dG8gICAgICAgICAgICAgIyB3aGV0aGVyIHRvIGF1dG9nZW5lcmF0ZSB3aW5lLmNvbmYKRE9MT0NBTENPTkY9YXV0byAgICAgICAgICAgICAgIyB3aGV0aGVyIHRvIGF1dG9nZW5lcmF0ZSBsb2NhbGNvbmYKRE9XQ0hLPWF1dG8gICAgICAgICAgICAgICAgICAgIyB3aGV0aGVyIHRvIGF1dG9jb25maWd1cmUgZXhpc3Rpbmctd2luZG93cyBpbnN0YWxsYXRpb24KRE9XSU5FPWF1dG8gICAgICAgICAgICAgICAgICAgIyB3aGV0aGVyIHRvIGF1dG9jb25maWd1cmUgbm8td2luZG93cyBpbnN0YWxsYXRpb24KRE9SRUc9YXV0byAgICAgICAgICAgICAgICAgICAgIyB3aGV0aGVyIHRvIGluc3RhbGwgZGVmYXVsdCByZWdpc3RyeQpET0FQUD1hdXRvICAgICAgICAgICAgICAgICAgICAjIHdoZXRoZXIgdG8gaW5zdGFsbCBhcHBsaWNhdGlvbnMsIGRpc3RyaWJ1dGVkIHdpdGggV2luZQpTWVNSRUc9eWVzICAgICAgICAgICAgICAgICAgICAjIHdoZXRoZXIgdG8gbWFrZSByb290J3MgcmVnaXN0cnkgZ2xvYmFsIChzeXN0ZW0tZGVmYXVsdCkKCiMgIm1ha2UgaW5zdGFsbCIgc3RpbGwgaW5zdGFsbHMgdGhlIGRsbHMgaW50byAkbGliZGlyLCBidXQgdGhpcyBtYXkgY2hhbmdlIGluIHRoZSBmdXR1cmUKIyAoRExMUEFUSCBzaG91bGQgcG9pbnQgdG8gdGhlbSBpZi93aGVuIHRoZXkgYXJlIG5vdCBpbiBzdGFuZGFyZCBsZC5zbyBwYXRocykKRExMUEFUSD0kbGliZGlyL3dpbmUgICAgICAgICAgIyBkZWZhdWx0IHBhdGggb2YgdGhlIGRsbCAuc28gZmlsZXMgKGV4Y2VwdCBsaWJ3aW5lLnNvKQoKIyB0aGlzIGlzIG9ubHkgZm9yIGV4aXN0aW5nLXdpbmRvd3MgaW5zdGFsbHMKV0lORUNPTkY9dG9vbHMvd2luZWNvbmYgICAgICAgIyBwYXRoIHRvIHRoZSB3aW5lY29uZiBwZXJsIHNjcmlwdAoKIyB0aGlzIGlzIG9ubHkgZm9yIG5vLXdpbmRvd3MgaW5zdGFsbHMKV0lORUlOST0kZXhkaXIvY29uZmlnICAgICAgICAgIyBwYXRoIHRvIHRoZSBkZWZhdWx0IHdpbmUgY29uZmlnIGZpbGUgKGFsc28gdXNlZCBieSB3aW5lY29uZikKV0lOSU5JPS9kZXYvbnVsbCAgICAgICAgICAgICAgIyBwYXRoIHRvIHRoZSBkZWZhdWx0IHdpbi5pbmkKU1lTVEVNSU5JPSRleGRpci9zeXN0ZW0uaW5pICAgIyBwYXRoIHRvIHRoZSBkZWZhdWx0IHN5c3RlbS5pbmkKUkVHRURJVD1wcm9ncmFtcy9yZWdlZGl0L3JlZ2VkaXQgICAgICAgIyBwYXRoIHRvIHRoZSByZWdlZGl0IHdpbmVsaWIgYXBwbGljYXRpb24KREVGUkVHPXdpbmVkZWZhdWx0LnJlZyAgICAgICAgIyBwYXRoIG9mIHRoZSByZWdpc3RyeSBmaWxlIHRvIGJlIGZlZCB0byByZWdlZGl0CiMgQ1JPT1Q9L3Zhci93aW5lICAgICAgICAgICAgICMgcGF0aCBvZiB0aGUgZmFrZSBEcml2ZSBDIChhc2tzIHVzZXIgaWYgbm90IHNldCkKREVGQ0FUPWNhdCAgICAgICAgICAgICAgICAgICAgIyBwcm9ncmFtIHRvIGNhdCAkREVGUkVHIHdpdGggKHNvbWUgcGFja2FnZXMgbmVlZCB6Y2F0KQojLS0tIGVuZCBvZiBkZWZhdWx0cwoKIyB0ZW1wb3JhcnkgZmlsZXMgdXNlZCBieSB0aGUgaW5zdGFsbGVyClRNUENPTkY9L3RtcC93aW5laW5zdGFsbC5jb25mCgojIGZ1bmN0aW9ucwoKZnVuY3Rpb24gc3RkX3NsZWVwIHsKICBzbGVlcCAxCn0KCmZ1bmN0aW9uIGNvbmZfcXVlc3Rpb24gewogICMgcGFyYW1ldGVyczogJDEgPSBpbXBvcnRhbmNlLCAkMiA9IHF1ZXN0aW9uLWlkLCAkMysgPSBtZXNzYWdlIGxpbmVzCiAgIyB0aGUgZmlyc3QgdHdvIHBhcmFtZXRlcnMgY2FuIGJlIHVzZWQgYnkgZS5nLiBkZWJjb25mIGluIGRlYmlhbiBwYWNrYWdlcwogICMgYnV0IGhlcmUgd2UganVzdCBwcmludCB0aGUgbWVzc2FnZQogIHNoaWZ0IDIKICBlY2hvCiAgbG9jYWwgTElORT0iJDEiCiAgd2hpbGUgc2hpZnQKICBkbyB7CiAgICBlY2hvICIkTElORSIKICAgIExJTkU9IiQxIgogIH0KICBkb25lCn0KCmZ1bmN0aW9uIGNvbmZfcmVzZXRfcXVlc3Rpb24gewogICMgcGFyYW1ldGVyczogJDEgPSBxdWVzdGlvbi1pZAogICMgdGhpcyBpcyB1c2VkIHRvIGZsdXNoIGFueSBjYWNoZWQgYW5zd2VycyBhbmQgImFscmVhZHktZGlzcGxheWVkIiBmbGFncwogIHNoaWZ0ICMgZHVtbXkgY29tbWFuZAp9CgpmdW5jdGlvbiBjb25mX3llc25vX2Fuc3dlciB7CiAgdW5zZXQgQU5TV0VSCiAgd2hpbGUgWyAiJEFOU1dFUiIgIT0gJ3llcycgXSAmJiBbICIkQU5TV0VSIiAhPSAnbm8nIF0KICBkbyB7CiAgICBlY2hvIC1uICIkMSIKICAgIHJlYWQgQU5TV0VSCiAgfQogIGRvbmUKfQoKZnVuY3Rpb24gY29uZl9zdHJpbmdfYW5zd2VyIHsKICBlY2hvIC1uICIkMSIKICByZWFkIEFOU1dFUgp9CgpmdW5jdGlvbiBjcmVhdGVfd2luZG93c19kaXJlY3RvcmllcyB7CiAgZm9yIHRkaXIgaW4gIiRDUk9PVC93aW5kb3dzIiAiJENST09UL3dpbmRvd3Mvc3lzdGVtIiBcCiAgICAgICAgICAgICAgIiRDUk9PVC93aW5kb3dzL2NvbW1hbmQiIFwKICAgICAgICAgICAgICAiJENST09UL3dpbmRvd3MvU3RhcnQgTWVudSIgIiRDUk9PVC93aW5kb3dzL1N0YXJ0IE1lbnUvUHJvZ3JhbXMiIFwKICAgICAgICAgICAgICAiJENST09UL1Byb2dyYW0gRmlsZXMiICIkQ1JPT1QvUHJvZ3JhbSBGaWxlcy9Db21tb24gRmlsZXMiIFwKICAgICAgICAgICAgICAiJENST09UL3dpbmRvd3MvUHJvZmlsZXMiICIkQ1JPT1Qvd2luZG93cy9Qcm9maWxlcy9BZG1pbmlzdHJhdG9yIiBcCiAgICAgICAgICAgICAgIiRDUk9PVC93aW5kb3dzL0ZvbnRzIiAiJENST09UL3dpbmRvd3MvU3RhcnQgTWVudS9Qcm9ncmFtcy9TdGFydHVwIgogIGRvIFsgLWQgIiR0ZGlyIiBdIHx8IG1rZGlyICIkdGRpciIKICBkb25lCiAgWyAtZiAiJENST09UL3dpbmRvd3Mvd2luLmluaSIgXSAgICB8fCBjcCAiJFdJTklOSSIgICAgIiRDUk9PVC93aW5kb3dzL3dpbi5pbmkiCiAgWyAtZiAiJENST09UL3dpbmRvd3Mvc3lzdGVtLmluaSIgXSB8fCBjcCAiJFNZU1RFTUlOSSIgIiRDUk9PVC93aW5kb3dzL3N5c3RlbS5pbmkiCn0KCiNjcmVhdGVzIHN5bWJvbGljIGxpbmsgaW4gd2luZG93cyBkaXJlY3RvcnkgdG8gaW5zdGFsbGVkIHdpbmVsaWIgYXBwbGljYXRpb24KI3BhcmFtZXRlcnM6CiMgLSBuYW1lIG9mIHRoZSBpbnN0YWxsZWQgd2luZWxpYiBhcHBsaWNhdGlvbgojIC0gZnVsbCBwYXRoIHRvIGFwcGxpY2F0aW9uIGluIHRoZSB3aW5lbGliIGRpcmVjdG9yeQpmdW5jdGlvbiBsaW5rX2FwcCB7CiAgaWYgWyAiJFdJTkVJTlNUQUxMRUQiID0gJ25vJyBdCiAgdGhlbiB7CiAgICBsbiAtc2YgJFBXRC9wcm9ncmFtcy8kMS8kMS5leGUuc28gJDIKICB9CiAgZWxzZSB7CiAgICBsbiAtc2YgJGxpYmRpci93aW5lLyQxLmV4ZS5zbyAkMgogIH0KICBmaQp9CgojcHV0cyB3aW5kb3dzIGFwcGxpY2F0aW9ucyByZXBsYWNlbWVudHMgdG8gd2luZG93cyBkaXJlY3RvcmllcywKI2NvbmZpZ3VyZXMgdGhlbQpmdW5jdGlvbiBjb25maWd1cmVfd2luZV9hcHBsaWNhdGlvbnMgewogIGxpbmtfYXBwIHN0YXJ0ICAgICAgICAiJENST09UL3dpbmRvd3MvY29tbWFuZC9zdGFydC5leGUiCiAgbGlua19hcHAgbm90ZXBhZCAgICAgICIkQ1JPT1Qvd2luZG93cy9ub3RlcGFkLmV4ZSIKICBsaW5rX2FwcCByZWdlZGl0ICAgICAgIiRDUk9PVC93aW5kb3dzL3JlZ2VkaXQuZXhlIgogIGxpbmtfYXBwIHJ1bmRsbDMyICAgICAiJENST09UL3dpbmRvd3MvcnVuZGxsMzIuZXhlIgogIGxpbmtfYXBwIHdjbWQgICAgICAgICAiJENST09UL3dpbmRvd3Mvc3lzdGVtL3djbWQuZXhlIgogIGxpbmtfYXBwIGNvbnRyb2wgICAgICAiJENST09UL3dpbmRvd3Mvc3lzdGVtL2NvbnRyb2wuZXhlIgogIGxpbmtfYXBwIHdpbmhlbHAgICAgICAiJENST09UL3dpbmRvd3Mvc3lzdGVtL2hlbHAuZXhlIgogIGxpbmtfYXBwIG5vdGVwYWQgICAgICAiJENST09UL3dpbmRvd3Mvc3lzdGVtL25vdGVwYWQuZXhlIgogIGxpbmtfYXBwIHByb2dtYW4gICAgICAiJENST09UL3dpbmRvd3Mvc3lzdGVtL3Byb2dtYW4uZXhlIgogIGxpbmtfYXBwIHJlZ3N2cjMyICAgICAiJENST09UL3dpbmRvd3Mvc3lzdGVtL3JlZ3N2cjMyLmV4ZSIKICBsaW5rX2FwcCB3aW5lbWluZSAgICAgIiRDUk9PVC93aW5kb3dzL3N5c3RlbS93aW5taW5lLmV4ZSIKICBsaW5rX2FwcCB3aW52ZXIgICAgICAgIiRDUk9PVC93aW5kb3dzL3N5c3RlbS93aW52ZXIuZXhlIgogIGxpbmtfYXBwIHVuaW5zdGFsbGVyICAiJENST09UL3dpbmRvd3MvdW5pbnN0YWxsLmV4ZSIKICBsaW5rX2FwcCB3aW5oZWxwICAgICAgIiRDUk9PVC93aW5kb3dzL3dpbmhlbHAuZXhlIgogIGxpbmtfYXBwIHdpbmhlbHAgICAgICAiJENST09UL3dpbmRvd3Mvd2luaGxwMzIuZXhlIgp9CgojIHN0YXJ0dXAuLi4KCmVjaG8gIldJTkUgSW5zdGFsbGVyIHYwLjc0IgplY2hvCgppZiBbICIkQklORElTVCIgPSAnbm8nIF0KdGhlbiB7CgogIGlmICEgWyAtZiBjb25maWd1cmUgXQogIHRoZW4gewogICAgaWYgWyAtZiAuLi9jb25maWd1cmUgXQogICAgdGhlbiB7CiAgICAgIHB1c2hkIC4uCiAgICB9CiAgICBlbHNlIHsKICAgICAgZWNobyAiWW91J3JlIHJ1bm5pbmcgdGhpcyBmcm9tIHRoZSB3cm9uZyBkaXJlY3RvcnkuIgogICAgICBlY2hvICJDaGFuZ2UgdG8gdGhlIFdpbmUgc291cmNlJ3MgbWFpbiBkaXJlY3RvcnkgYW5kIHRyeSBhZ2Fpbi4iCiAgICAgIGV4aXQgMQogICAgfQogICAgZmkKICB9CiAgZmkKCiAgaWYgWyBgd2hvYW1pYCA9PSAncm9vdCcgXQogIHRoZW4gewogICAgZWNobyAiWW91IGFyZSBydW5uaW5nIHdpbmVpbnN0YWxsIGFzIHJvb3QsIHRoaXMgaXMgbm90IGFkdmlzYWJsZS4gUGxlYXNlIHJlcnVuIGFzIGEgdXNlci4iCiAgICBlY2hvICJBYm9ydGluZy4iCiAgICBleGl0IDEKICB9CiAgZmkKCiAgaWYgWyAhIC13IC4gXQogIHRoZW4gewogICAgZWNobyAiVGhlIHNvdXJjZSBkaXJlY3RvcnkgaXMgbm90IHdyaXRhYmxlLiBZb3UgcHJvYmFibHkgZXh0cmFjdGVkIHRoZSBzb3VyY2VzIGFzIHJvb3QuIgogICAgZWNobyAiWW91IHNob3VsZCByZW1vdmUgdGhlIHNvdXJjZSB0cmVlIGFuZCBleHRyYWN0IGl0IGFnYWluIGFzIGEgbm9ybWFsIHVzZXIuIgogICAgZXhpdCAxCiAgfQogIGZpCgogICMgY2hlY2sgd2hldGhlciBSUE0gaW5zdGFsbGVkLCBhbmQgaWYgaXQgaXMsIHJlbW92ZSBhbnkgb2xkIHdpbmUgcnBtLgogIGhhc2ggcnBtICY+L2Rldi9udWxsCiAgUkVUPSQ/CiAgaWYgWyAkUkVUIC1lcSAwIF07IHRoZW4KICAgIGlmIFsgLW4gImBycG0gLXFpIHdpbmUgMj4vZGV2L251bGx8Z3JlcCAiXk5hbWUiYCIgXTsgdGhlbgogICAgICBlY2hvICJXYXJuaW5nOiBPbGQgV2luZSBSUE0gaW5zdGFsbCBkZXRlY3RlZC4gRG8geW91IHdhbnQgdG8gcmVtb3ZlIGl0IGZpcnN0PyIKICAgICAgY29uZl95ZXNub19hbnN3ZXIgIih5ZXMvbm8pICIKICAgICAgaWYgWyAiJEFOU1dFUiIgPSAneWVzJyBdOyB0aGVuCiAgICAgICAgZWNobyAiV2UgbmVlZCB0byByZW1vdmUgdGhlIHJwbSBhcyByb290LCBwbGVhc2UgZW50ZXIgeW91ciByb290IHBhc3N3b3JkIgogICAgICAgIGVjaG8KICAgICAgICBlY2hvIFN0YXJ0aW5nIHdpbmUgcnBtIHJlbW92YWwuLi4KICAgICAgICBzdSAtYyAicnBtIC1lIHdpbmU7IFJFVD0kPyIKICAgICAgICBpZiBbICRSRVQgLWVxIDAgXTsgdGhlbgogICAgICAgICAgZWNobyBEb25lLgogICAgICAgIGVsc2UKICAgICAgICAgIGVjaG8gIkZBSUxFRC4gUHJvYmFibHkgeW91IGFyZW4ndCBpbnN0YWxsaW5nIGFzIHJvb3QuIgogICAgICAgICAgZWNobyAiRXhwZWN0IHByb2JsZW1zIChsaWJyYXJ5IGNvbmZsaWN0cyB3aXRoIGV4aXN0aW5nIGluc3RhbGwgZXRjLikuIgogICAgICAgIGZpCiAgICAgIGVsc2UKICAgICAgICBlY2hvICJTb3JyeSwgSSB3b24ndCBpbnN0YWxsIFdpbmUgd2hlbiBhbiBycG0gdmVyc2lvbiBpcyBzdGlsbCBpbnN0YWxsZWQuIgogICAgICAgIGVjaG8gIihXaW5lIHN1cHBvcnQgc3VmZmVyZWQgZnJvbSB3YXkgdG9vIG1hbnkgY29uZmxpY3RzIGJldHdlZW4gUlBNIgogICAgICAgIGVjaG8gImFuZCBzb3VyY2UgaW5zdGFsbHMpIgogICAgICAgIGVjaG8gIkhhdmUgYSBuaWNlIGRheSAhIgogICAgICAgIGV4aXQgMQogICAgICBmaQogICAgZmkKICBmaQoKICAjIGNoZWNrIHdoZXRoZXIgd2luZSBiaW5hcnkgc3RpbGwgYXZhaWxhYmxlCiAgaWYgWyAtbiAiYHdoaWNoIHdpbmUgMj4vZGV2L251bGx8Z3JlcCAnL3dpbmUnYCIgXTsgdGhlbgogICAgZWNobyAiV2FybmluZyAhISB3aW5lIGJpbmFyeSAoc3RpbGwpIGZvdW5kLCB3aGljaCBtYXkgaW5kaWNhdGUiCiAgICBlY2hvICJhIChjb25mbGljdGluZykgcHJldmlvdXMgaW5zdGFsbGF0aW9uLiIKICAgIGVjaG8gIllvdSBtaWdodCB3YW50IHRvIGFib3J0IGFuZCB1bmluc3RhbGwgV2luZSBmaXJzdC4iCiAgICBzdGRfc2xlZXAKICBmaQoKICAjIHJ1biB0aGUgY29uZmlndXJlIHNjcmlwdCwgaWYgbmVjZXNzYXJ5CgogIGlmIFsgLWYgY29uZmlnLmNhY2hlIF0gJiYgWyAtZiBNYWtlZmlsZSBdICYmIFsgTWFrZWZpbGUgLW50IGNvbmZpZ3VyZSBdCiAgdGhlbiB7CiAgICBlY2hvCiAgICBlY2hvICJJIHNlZSB0aGF0IFdJTkUgaGFzIGFscmVhZHkgYmVlbiBjb25maWd1cmVkLCBzbyBJJ2xsIHNraXAgdGhhdC4iCiAgICBzdGRfc2xlZXAKICAgICMgbG9hZCBjb25maWd1cmUgcmVzdWx0cwogICAgLiAuL2NvbmZpZy5jYWNoZQogIH0KICBlbHNlIHsKICAgIGVjaG8gIlJ1bm5pbmcgY29uZmlndXJlLi4uIgogICAgZWNobwogICAgaWYgISAuL2NvbmZpZ3VyZSAtQyAkQ09ORkFSR1MgLS1wcmVmaXg9JHByZWZpeAogICAgdGhlbiB7CiAgICAgIGVjaG8KICAgICAgZWNobyAiQ29uZmlndXJlIGZhaWxlZCwgYWJvcnRpbmcgaW5zdGFsbC4iCiAgICAgIHJtIC1mIGNvbmZpZy5jYWNoZQogICAgICBleGl0IDEKICAgIH0KICAgIGZpCiAgICAjIGxvYWQgY29uZmlndXJlIHJlc3VsdHMKICAgIC4gLi9jb25maWcuY2FjaGUKICAgICMgbWFrZSBzdXJlIFggd2FzIGZvdW5kCiAgICBldmFsICIkYWNfY3ZfaGF2ZV94IgogICAgaWYgWyAiJGhhdmVfeCIgIT0gInllcyIgXQogICAgdGhlbiB7CiAgICAgIGVjaG8gIkluc3RhbGwgdGhlIFggZGV2ZWxvcG1lbnQgaGVhZGVycyBhbmQgdHJ5IGFnYWluLiIKICAgICAgcm0gLWYgY29uZmlnLmNhY2hlCiAgICAgIGV4aXQgMQogICAgfQogICAgZmkKICB9CiAgZmkKCiAgIyBub3cgZG8gdGhlIGNvbXBpbGF0aW9uIGFuZCBpbnN0YWxsLCB3ZSBuZWVkIHRvIGFsd2F5cyBkbyB0aGlzIGJlY2F1c2Ugd2UKICAjIGRvbid0IHdhbnQgdGhlICdtYWtlIGluc3RhbGwnIGNvbW1hbmQgd2UgbWlnaHQgcnVuIHRvIHJ1biAnbWFrZScgYXMgcm9vdAogIGlmIFsgYHdob2FtaWAgIT0gJ3Jvb3QnIF0KICB0aGVuIHsKICAgICMgYXNrIHRoZSB1c2VyIGlmIHRoZXkgd2FudCB0byBidWlsZCBhbmQgaW5zdGFsbCB3aW5lCiAgICBlY2hvCiAgICBlY2hvICJXZSBuZWVkIHRvIGluc3RhbGwgd2luZSBhcyByb290IHVzZXIsIGRvIHlvdSB3YW50IHVzIHRvIGJ1aWxkIHdpbmUsIgogICAgZWNobyAiJ3N1IHJvb3QnIGFuZCBpbnN0YWxsIFdpbmU/ICBFbnRlciAnbm8nIHRvIGNvbnRpbnVlIHdpdGhvdXQgaW5zdGFsbGluZyIKICAgIGNvbmZfeWVzbm9fYW5zd2VyICIoeWVzL25vKSAiCiAgICBST09USU5TVEFMTD0iJEFOU1dFUiIKCiAgICBpZiBbICIkUk9PVElOU1RBTEwiID0gInllcyIgXQogICAgdGhlbiB7CiAgICAgICMgc3RhcnQgb3V0IHdpdGggdGhlIGJhc2ljIGNvbW1hbmQKICAgICAgc3Vjb21tYW5kPSJtYWtlIGluc3RhbGwiCgogICAgICAjIGlmIHRoZSB1c2VyIGRvZXNuJ3QgaGF2ZSAkbGliZGlyIGluIHRoZWlyIGxkLnNvLmNvbmYgYWRkIHRoaXMKICAgICAgIyB0byBvdXIgc3Vjb21tYW5kIHN0cmluZwogICAgICBpZiBbIC1mIC9ldGMvbGQuc28uY29uZiBdCiAgICAgIHRoZW4KICAgICAgICBpZiAhIGdyZXAgLXMgIiRsaWJkaXIiIC9ldGMvbGQuc28uY29uZiA+L2Rldi9udWxsIDI+JjEKICAgICAgICB0aGVuIHsKICAgICAgICAgIGVjaG8KICAgICAgICAgIGVjaG8gIiRsaWJkaXIgZG9lc24ndCBleGlzdCBpbiB5b3VyIC9ldGMvbGQuc28uY29uZiwgaXQgd2lsbCBiZSBhZGRlZCIKICAgICAgICAgIGVjaG8gIndoZW4gd2UgcGVyZm9ybSB0aGUgaW5zdGFsbC4uLiIKICAgICAgICAgIHN1Y29tbWFuZD0iJHN1Y29tbWFuZDtlY2hvICRsaWJkaXI+Pi9ldGMvbGQuc28uY29uZiIKICAgICAgICB9CiAgICAgICAgZmkKICAgICAgICAjIHJ1biBsZGNvbmZpZyBhbHdheXMganVzdCBpbiBjYXNlIHNvbWUgdXBkYXRlZCBmaWxlcyBkb250IGdldCBsaW5rZWQKICAgICAgICBzdWNvbW1hbmQ9IiRzdWNvbW1hbmQ7JGFjX2N2X3BhdGhfTERDT05GSUciCiAgICAgIGZpCiAgICB9CiAgICBmaSAjIFsgIiRST09USU5TVEFMTCIgPSAieWVzIiBdCgogICAgZWNobwoKICAgIGVjaG8gIkNvbXBpbGluZyBXSU5FLiBHcmFiIGEgbHVuY2ggb3IgdHdvLCByZW50IGEgdmlkZW8sIG9yIHdoYXRldmVyLCIKICAgIGVjaG8gImluIHRoZSBtZWFudGltZS4uLiIKICAgIGVjaG8KICAgIHN0ZF9zbGVlcAoKICAgICMgdHJ5IHRvIGp1c3QgbWFrZSB3aW5lLCBpZiB0aGlzIGZhaWxzICdtYWtlIGRlcGVuZCcgYW5kIHRyeSB0byByZW1ha2UKICAgIGlmICEgeyBtYWtlOyB9CiAgICB0aGVuIHsKICAgICAgaWYgISB7IG1ha2UgZGVwZW5kICYmIG1ha2U7IH0KICAgICAgdGhlbiB7CiAgICAgICAgZWNobwogICAgICAgIGVjaG8gIkNvbXBpbGF0aW9uIGZhaWxlZCwgYWJvcnRpbmcgaW5zdGFsbC4iCiAgICAgICAgZXhpdCAxCiAgICAgIH0KICAgICAgZmkKICAgIH0KICAgIGZpCgogICAgaWYgWyAiJFJPT1RJTlNUQUxMIiA9ICJ5ZXMiIF0KICAgIHRoZW4gewogICAgICBlY2hvCgogICAgICBlY2hvICJQZXJmb3JtaW5nICdtYWtlIGluc3RhbGwnIGFzIHJvb3QgdG8gaW5zdGFsbCBiaW5hcmllcywgZW50ZXIgcm9vdCBwYXNzd29yZCIKCiAgICAgIHN0ZF9zbGVlcAoKICAgICAgaWYgISBzdSByb290IC1jICIkc3Vjb21tYW5kIgogICAgICB0aGVuIHsKICAgICAgCWlmICEgc3Ugcm9vdCAtYyAiJHN1Y29tbWFuZCIKICAgICAgICB0aGVuIHsKICAgICAgCSAgICAgZWNobwogICAgICAgICAgICAgZWNobyAiRWl0aGVyIHlvdSBlbnRlcmVkIGFuIGluY29ycmVjdCBwYXNzd29yZCBvciB3ZSBmYWlsZWQgdG8iCiAgICAgICAgICAgICBlY2hvICJydW4gJyRzdWNvbW1hbmQnIGNvcnJlY3RseS4iCiAgICAgICAgICAgICBlY2hvICJJZiB5b3UgZGlkbid0IGVudGVyIGFuIGluY29ycmVjdCBwYXNzd29yZCB0aGVuIHBsZWFzZSIKICAgICAgICAgICAgIGVjaG8gInJlcG9ydCB0aGlzIGVycm9yIGFuZCBhbnkgc3RlcHMgdG8gcG9zc2libHkgcmVwcm9kdWNlIGl0IHRvIgogICAgICAgICAgICAgZWNobyAiaHR0cDovL2J1Z3Mud2luZWhxLm9yZy8iCiAgICAgICAgICAgICBlY2hvCiAgICAgICAgICAgICBlY2hvICJJbnN0YWxsYXRpb24gZmFpbGVkLCBhYm9ydGluZy4iCiAgICAgICAgICAgICBleGl0IDEKICAgICAgICAgfQogICAgICAgICBmaQogICAgICAgfQogICAgICBmaQoKICAgICAgZWNobwoKICAgICAgIyBzZWUgaWYgd2luZSBpcyBpbnN0YWxsZWQgb24gdGhlIHVzZXJzIHN5c3RlbSwgaWYgbm90IHByb21wdCB0aGVtCiAgICAgICMgYW5kIHRoZW4gZXhpdAogICAgICBpZiBbICEgYHdoaWNoIHdpbmVgIF0KICAgICAgdGhlbgogICAgICAgIGVjaG8gIkNvdWxkIG5vdCBmaW5kIHdpbmUgb24geW91ciBzeXN0ZW0uICBSdW4gd2luZWluc3RhbGwgYXMgcm9vdCB0byBpbnN0YWxsIHdpbmUiCiAgICAgICAgZWNobyAiYmVmb3JlIHJlLXJ1bm5pbmcgd2luZWluc3RhbGwgYXMgYSB1c2VyLiIKICAgICAgICBlY2hvCiAgICAgICAgZWNobyAiRXhpdGluZyB3aW5laW5zdGFsbCIKICAgICAgICBleGl0IDE7CiAgICAgIGZpCgogICAgICBXSU5FSU5TVEFMTEVEPXllcwogICAgfQogICAgZWxzZSB7CiAgICAgICMgdXNlciBkaWRuJ3Qgd2FudCB0byBpbnN0YWxsIHdpbmUgc28gdGVsbCB0aGVtIGFib3V0IHJ1bm5pbmcgZnJvbSB0aGUKICAgICAgIyBjdXJyZW50IGRpcmVjdG9yeSBhbmQgc2V0IHNvbWUgc3R1ZmYgdXAgZm9yIHRoZW0KCiAgICAgICMgc2V0dXAgdG8gcnVuIGZyb20gY3VycmVudCBkaXJlY3RvcnkKICAgICAgRExMUEFUSD0iJFBXRC9kbGxzIgogICAgICBpZiBbIC16ICIkTERfTElCUkFSWV9QQVRIIiBdCiAgICAgIHRoZW4gTERfTElCUkFSWV9QQVRIPSIkUFdEOiRETExQQVRIIgogICAgICBlbHNlIExEX0xJQlJBUllfUEFUSD0iJExEX0xJQlJBUllfUEFUSDokUFdEOiRETExQQVRIIgogICAgICBmaQogICAgICBleHBvcnQgTERfTElCUkFSWV9QQVRICiAgICAgIGVjaG8KICAgICAgZWNobyAiTk9URSEgVG8gcnVuIFdpbmUgd2l0aG91dCBpbnN0YWxsaW5nLCB5b3UgbXVzdCBzZXQgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIgogICAgICBlY2hvICJMRF9MSUJSQVJZX1BBVEggdG8gJFBXRDokRExMUEFUSCIKICAgICAgZWNobyAiaW4geW91ciBsb2dvbiBzY3JpcHRzLiIKICAgICAgZWNobwoKICAgICAgV0lORUlOU1RBTExFRD1ubwogICAgfQogICAgZmkgIyBbICIkUk9PVElOU1RBTEwiID0gInllcyIgXQogIH0KICBmaSAjIFsgYHdob2FtaWAgIT0gJ3Jvb3QnIF0KCn0KZmkgIyBCSU5ESVNUCgojIG5vdyBjaGVjayB3aGV0aGVyIHdlIHNob3VsZCBnZW5lcmF0ZSB3aW5lLmNvbmYKaWYgWyAteiAiJERPR0xPQkFMQ09ORiIgXQp0aGVuCiAgRE9HTE9CQUxDT05GPWF1dG8KZmkKCmlmIFsgIiRET0dMT0JBTENPTkYiID0gJ2F1dG8nIF0KdGhlbiB7CiAgIyBzZWUgaWYgd2UgYWxyZWFkeSBoYXZlIGEgc3lzdGVtIHdpbmUuY29uZgogIGlmIFsgISAtZiAkR0NPTkYgXSAmJiBbIGB3aG9hbWlgID0gJ3Jvb3QnIF0KICB0aGVuCiAgICBET0dMT0JBTENPTkY9bm8KICAgIGVjaG8gIkNyZWF0aW9uIG9mIGEgZ2xvYmFsIGNvbmZpZyBmaWxlIGlzIG5vdCBzdXBwb3J0ZWQgaW4gd2luZWluc3RhbGwgYXQgdGhpcyIKICAgIGVjaG8gInRpbWUuICBXaGVuIHRoZSBjb25maWd1cmF0aW9uIGFyY2hpdGVjdHVyZSBpcyBjbGVhbmVkIHVwIHRoaXMgZnVuY3Rpb25hbGl0eSIKICAgIGVjaG8gIndpbGwgYmUgcmVzdG9yZWQgdG8gd2luZWluc3RhbGwuIgogICAgZWNobwogIGZpCn0KZmkKCmlmIFsgIiRET0xPQ0FMQ09ORiIgPSAnYXV0bycgXQp0aGVuIHsKICAjIHNlZSBpZiB0aGUgdXNlciBpcyByb290LCBpZiBzbywgZXhwbGljaXRseSBhc2sgdGhlbSBpZiB0aGV5IHdhbnQgYQogICMgbG9jYWwgY29uZmlnIGZpbGUKICBpZiBbIGB3aG9hbWlgID0gJ3Jvb3QnIF0KICB0aGVuCiAgICBlY2hvICJZb3UgYXJlIHJ1bm5pbmcgYXMgcm9vdC4gIERvIHlvdSB3YW50IGEgbG9jYWwgY29uZmlnIGZpbGUsIgogICAgZWNobyAiZmlsZSwgfi8ud2luZS9jb25maWcsIGNyZWF0ZWQ/IgogICAgY29uZl95ZXNub19hbnN3ZXIgIih5ZXMvbm8pICIKICAgIERPTE9DQUxDT05GPSIkQU5TV0VSIgogIGVsc2UKICAgICMgaWYgdGhlIHVzZXIgaGFzIGFuIGV4aXN0aW5nIGNvbmZpZyBmaWxlIGFzayB0aGVtIGlmIHRoZXkgd2FudCB1cyB0bwogICAgIyBvdmVyd3JpdGUgaXQsIG90aGVyd2lzZSBqdXN0IGFzayB0aGVtIGlmIHRoZXkgd2FudCB0byBjcmVhdGUgb25lCiAgICBpZiBbIC1mICIkTENPTkYiIF0KICAgIHRoZW4KICAgICAgZWNobyAiRm91bmQgZXhpc3RpbmcgJExDT05GLCBkbyB5b3Ugd2FudCB0byBvdmVyd3JpdGUgdGhpcyIKICAgICAgZWNobyAiZXhpc3RpbmcgV2luZSBjb25maWd1cmF0aW9uIGZpbGU/IgogICAgICBjb25mX3llc25vX2Fuc3dlciAiKHllcy9ubykgIgogICAgICBET0xPQ0FMQ09ORj0iJEFOU1dFUiIKICAgICAgZWNobwogICAgICBpZiBbICIkQU5TV0VSIiA9ICJ5ZXMiIF0KICAgICAgdGhlbgogICAgICB7CiAgICAgICAgZWNobyAiV291bGQgeW91IGxpa2UgdG8gbWFrZSBhIGJhY2t1cCBvZiB0aGlzIG9sZCBjb25maWcgZmlsZT8iCiAgICAgICAgY29uZl95ZXNub19hbnN3ZXIgIih5ZXMvbm8pICIKICAgICAgICBlY2hvCiAgICAgICAgaWYgWyAiJEFOU1dFUiIgPSAieWVzIiBdCiAgICAgICAgdGhlbgogICAgICAgIHsKICAgICAgICAgIGVjaG8gIlJlbmFtaW5nICRMQ09ORiB0byAkTENPTkYub2xkIgogICAgICAgICAgbXYgLWYgIiRMQ09ORiIgIiRMQ09ORi5vbGQiCiAgICAgICAgICBlY2hvCiAgICAgICAgfQogICAgICAgIGZpCiAgICAgIH0KICAgICAgZmkKICAgIGVsc2UKICAgIHsKICAgICAgZWNobyAiQ3JlYXRlIGxvY2FsIGNvbmZpZyBmaWxlIH4vLndpbmUvY29uZmlnPyIKICAgICAgY29uZl95ZXNub19hbnN3ZXIgIih5ZXMvbm8pICIKICAgICAgRE9MT0NBTENPTkY9IiRBTlNXRVIiCiAgICAgIGVjaG8KICAgICAgaWYgWyAiJEFOU1dFUiIgPSAnbm8nIF0KICAgICAgdGhlbgogICAgICAgIGNvbmZfcXVlc3Rpb24gaGlnaCBuZWVkX3Jvb3QgXAogICAgICAgICAgIkFib3J0aW5nIGluc3RhbGwuIFRyeSBhZ2FpbiBhcyByb290IHRvIGdlbmVyYXRlIGEgc3lzdGVtIHdpbmUuY29uZi4iCiAgICAgICAgZXhpdCAxCiAgICAgIGZpCiAgICB9CiAgICBmaQogIGZpCn0KZmkKCiMgZ2VuZXJhdGUgJFRNUENPTkYgZnJvbSBleGlzdGluZyB3aW5kb3dzIGluc3RhbGwsIGlmIGFueQppZiBbICIkRE9MT0NBTENPTkYiID0gJ3llcycgXQp0aGVuIHsKICBpZiBbICIkRE9XQ0hLIiA9ICd5ZXMnIF0gfHwgWyAiJERPV0NISyIgPSAnYXV0bycgXQogIHRoZW4gewogICAgZWNobyAtbiAiU2VhcmNoaW5nIGZvciBhbiBleGlzdGluZyBXaW5kb3dzIGluc3RhbGxhdGlvbi4uLiIKICAgIGlmICEgJFdJTkVDT05GIC1pbmlmaWxlICIkV0lORUlOSSIgPiAkVE1QQ09ORiAyPi9kZXYvbnVsbAogICAgdGhlbiB7CiAgICAgIHJtIC1mICRUTVBDT05GID4gL2Rldi9udWxsCgogICAgICBlY2hvICIgbm90IGZvdW5kLiAobm8gbWF0Y2hpbmcgL2V0Yy9mc3RhYiBtb3VudCBlbnRyeSBmb3VuZCkiCiAgICAgIGNvbmZfcXVlc3Rpb24gbG93IGRvX3dpdGhvdXRfd2luZG93cyBcCiAgICAgICAiV2luZG93cyB3YXMgbm90IGZvdW5kIG9uIHlvdXIgc3lzdGVtLCBzbyBJIGFzc3VtZSB5b3Ugd2FudCIgXAogICAgICAgImEgV2luZS1vbmx5IGluc3RhbGxhdGlvbi4gQW0gSSBjb3JyZWN0PyIKICAgICAgY29uZl95ZXNub19hbnN3ZXIgIih5ZXMvbm8pICIKICAgICAgaWYgWyAiJEFOU1dFUiIgPSAnbm8nIF0KICAgICAgdGhlbiB7CiAgICAgICAgY29uZl9xdWVzdGlvbiBoaWdoIHdpbmRvd3Nfbm90X2ZvdW5kIFwKICAgICAgICAgIkFib3J0aW5nIGluc3RhbGwuIE1ha2Ugc3VyZSB5b3VyIFdpbmRvd3MgcGFydGl0aW9uIGlzIG1vdW50ZWQgYW5kIHRyeSBhZ2FpbiwiIFwKICAgICAgICAgIm9yIGNyZWF0ZSAkTENPTkYgbWFudWFsbHkgYnkgY29weWluZyBmcm9tICRXSU5FSU5JIGFuZCBhZGFwdGluZyB0aGUgZHJpdmUgcGF0aHMuIgogICAgICAgIGV4aXQgMQogICAgICB9CiAgICAgIGZpCiAgICAgIERPV0lORT15ZXMKICAgIH0KICAgIGVsc2UgewogICAgICBlY2hvICIgZm91bmQuIgoKICAgICAgY29uZl9xdWVzdGlvbiBsb3cgZG9fd2l0aG91dF93aW5kb3dzIFwKICAgICAgICJXaW5kb3dzIHdhcyBmb3VuZCBvbiB5b3VyIHN5c3RlbSwgYW5kIHNvIHdlIGNhbiB1c2UgdGhlIFdpbmRvd3MiIFwKICAgICAgICJEcml2ZSBhcyBvdXIgV2luZSBkcml2ZS4gWW91IG1heSwgaG93ZXZlciwgd2lzaCB0byBjcmVhdGUgYSBjbGVhbiIgXAogICAgICAgIldpbmUgaW5zdGFsbCBhbnl3YXlzLiIKICAgICAgY29uZl95ZXNub19hbnN3ZXIgIlNob3VsZCBJIHVzZSB0aGUgV2luZG93cyBkcml2ZSBmb3IgdGhlIFdpbmUgaW5zdGFsbD8gKHllcy9ubykgIgogICAgICBpZiBbICIkQU5TV0VSIiA9ICd5ZXMnIF0KICAgICAgdGhlbiB7CiAgICAgICAgY29uZl9yZXNldF9xdWVzdGlvbiB3aW5kb3dzX2ZvdW5kCiAgICAgICAgY29uZl9xdWVzdGlvbiBsb3cgd2luZG93c19mb3VuZCBcCiAgICAgICAgICJDcmVhdGVkICRMQ09ORiB1c2luZyB5b3VyIGV4aXN0aW5nIFdpbmRvd3MgaW5zdGFsbGF0aW9uLiIgXAogICAgICAgICAiWW91IHByb2JhYmx5IHdhbnQgdG8gcmV2aWV3IHRoZSBmaWxlLCB0aG91Z2guIgogICAgICAgIERPV0lORT1ubwogICAgICB9CiAgICAgIGVsc2UgewogICAgICAgIERPV0lORT15ZXMKICAgICAgfQogICAgICBmaQogICAgfQogICAgZmkKICB9CiAgZWxpZiBbICIkRE9XSU5FIiA9ICdhdXRvJyBdCiAgdGhlbiBET1dJTkU9eWVzCiAgZmkKfQplbGlmIFsgIiRET1dJTkUiID0gJ2F1dG8nIF0KdGhlbgogIERPV0lORT1ubwpmaQoKIyBzZXR1cCBhIG5vLXdpbmRvd3MgaW5zdGFsbGF0aW9uLCBpZiBuZWNlc3NhcnkKaWYgWyAiJERPV0lORSIgPSAneWVzJyBdCnRoZW4gewogICMgc2V0IGFuIGFwcHJvcHJpYXRlIERDUk9PVAogIGlmIFsgYHdob2FtaWAgIT0gJ3Jvb3QnIF0KICB0aGVuIERDUk9PVD1+L2MKICBlbHNlIERDUk9PVD0vYwogIGZpCgogIGNvbmZfcXVlc3Rpb24gbG93IGRyaXZlY19wYXRoIFwKICAgICAiQ29uZmlndXJpbmcgV2luZSB3aXRob3V0IFdpbmRvd3MuIiBcCiAgICAgIlNvbWUgZmFrZSBXaW5kb3dzIGRpcmVjdG9yaWVzIG11c3QgYmUgY3JlYXRlZCwgdG8gaG9sZCBhbnkgLmluaSBmaWxlcywgRExMcywiIFwKICAgICAic3RhcnQgbWVudSBlbnRyaWVzLCBhbmQgb3RoZXIgdGhpbmdzIHlvdXIgYXBwbGljYXRpb25zIG1heSBuZWVkIHRvIGluc3RhbGwuIiBcCiAgICAgIldoZXJlIHdvdWxkIHlvdSBsaWtlIHlvdXIgZmFrZSBDIGRyaXZlIHRvIGJlIHBsYWNlZD8iCiAgd2hpbGUgWyAteiAiJENST09UIiBdCiAgZG8gewogICAgY29uZl9zdHJpbmdfYW5zd2VyICIoZGVmYXVsdCBpcyAkRENST09UKSAiCiAgICBbIC16ICIkQU5TV0VSIiBdICYmIEFOU1dFUj0iJERDUk9PVCIKICAgIGlmICEgWyAtZCAiJEFOU1dFUiIgXQogICAgdGhlbiB7CiAgICAgIGlmIG1rZGlyIC1wICIkQU5TV0VSIgogICAgICB0aGVuIENST09UPSIkQU5TV0VSIgogICAgICBlbHNlCiAgICAgICAgICBlY2hvICJEaXJlY3RvcnkgJEFOU1dFUiBjYW4ndCBiZSBjcmVhdGVkICEiCiAgICAgICAgICBjb25mX3Jlc2V0X3F1ZXN0aW9uIGRyaXZlY19wYXRoCiAgICAgIGZpCiAgICB9CiAgICBlbHNlIENST09UPSIkQU5TV0VSIgogICAgZmkKICB9CiAgZG9uZQogIGVjaG8gIkNvbmZpZ3VyaW5nIFdpbmUgZm9yIGEgbm8td2luZG93cyBpbnN0YWxsIGluICRDUk9PVC4uLiIKCiAgICBjcmVhdGVfd2luZG93c19kaXJlY3RvcmllcwogICAgY29uZmlndXJlX3dpbmVfYXBwbGljYXRpb25zCgogICMgY3JlYXRlICRMQ09ORiB1c2luZyB0aGUgZGVmYXVsdCBjb25maWcgZmlsZSAkV0lORUlOSQogIGlmIFsgIiRET0xPQ0FMQ09ORiIgPSAneWVzJyBdCiAgdGhlbiB7CiAgICBzZWQgInN8XCJQYXRoXCIgPSBcIi9jXCJcJHxcIlBhdGhcIiA9IFwiJHtDUk9PVH1cInwiICRXSU5FSU5JID4gJFRNUENPTkYKICAgIGNvbmZfcmVzZXRfcXVlc3Rpb24gZGVmYXVsdF9jb25maWcKICAgIGNvbmZfcXVlc3Rpb24gbG93IGRlZmF1bHRfY29uZmlnIFwKICAgICAiQ3JlYXRlZCAkTENPTkYgdXNpbmcgZGVmYXVsdCBXaW5lIGNvbmZpZ3VyYXRpb24uIiBcCiAgICAgIllvdSBwcm9iYWJseSB3YW50IHRvIHJldmlldyB0aGUgZmlsZSwgdGhvdWdoLiIKICB9CiAgZmkKCiAgIyBub3cgd2UgcmVhbGx5IHNob3VsZCBpbnN0YWxsIHRoZSByZWdpc3RyeQogIGlmIFsgIiRET1JFRyIgPSAnYXV0bycgXQogIHRoZW4gRE9SRUc9eWVzCiAgZmkKfQpmaQplY2hvCgojaW5zdGFsbCB0aGUgbG9jYWwgY29uZmlnIGZpbGUgJExDT05GCmlmIFsgIiRET0xPQ0FMQ09ORiIgPSAneWVzJyBdCnRoZW4KICBpZiBbICEgLXcgfi8ud2luZSBdCiAgdGhlbgogICAgbWtkaXIgfi8ud2luZQogIGZpCiAgY3AgJFRNUENPTkYgJExDT05GID4gL2Rldi9udWxsCmVsc2UKICBET1JFRz1ubwpmaQoKI2luc3RhbGwgdGhlIGdsb2JhbCBjb25maWcgZmlsZSAkR0NPTkYKaWYgWyAiJERPR0xPQkFMQ09ORiIgPSAneWVzJyBdCnRoZW4KICBpZiBbICEgLWYgJHN5c2NvbmZkaXIgXQogIHRoZW4KICAgIG1rZGlyIC1wICRzeXNjb25mZGlyCiAgZmkKCiAgY3AgJFRNUENPTkYgJEdDT05GID4gL2Rldi9udWxsCmZpCgojIGNoZWNrIHdoZXRoZXIgd2UgbmVlZCB0byBpbnN0YWxsIGRlZmF1bHQgcmVnaXN0cnkKIyAobm90IHRvIGJlIGRvbmUgaWYgd2luZG93cyByZWdpc3RyeSBleGlzdHMpCmlmIFsgIiRET1JFRyIgPSAnYXV0bycgXQp0aGVuIHsKICBDUk9PVD1gc2VkIC1uICcvXlxbRHJpdmUgQ1xdJC8sL15cWy4qXF0kLyBzL15cIlBhdGhcIiA9IFwiXCguKlwpXCIvXDEvcCcgJExDT05GYAogIGVjaG8gIkNoZWNraW5nIGZvciByZWFsIFdpbmRvd3MgcmVnaXN0cnkuLi4iCiAgaWYgWyAtZiAiJENST09UL3dpbmRvd3Mvc3lzdGVtLmRhdCIgXQogIHRoZW4gRE9SRUc9bm8KICBlbGlmIFsgLWYgIiRDUk9PVC93aW5kb3dzL3N5c3RlbTMyL2NvbmZpZy9zeXN0ZW0iIF0KICB0aGVuIERPUkVHPW5vCiAgZWxpZiBbIC1mICIkQ1JPT1QvV0lOTlQvc3lzdGVtMzIvY29uZmlnL3N5c3RlbSIgXQogIHRoZW4gRE9SRUc9bm8KICBlbHNlIERPUkVHPXllcwogIGZpCiAgaWYgWyAiJERPUkVHIiA9ICd5ZXMnIF0KICB0aGVuIGVjaG8gIk5vdCBmb3VuZCwgZGVmYXVsdCBXaW5lIHJlZ2lzdHJ5IHdpbGwgYmUgaW5zdGFsbGVkLiIKICBlbHNlIGVjaG8gIldpbmRvd3MgcmVnaXN0cnkgZm91bmQsIHdpbGwgbm90IGluc3RhbGwgZGVmYXVsdCBXaW5lIHJlZ2lzdHJ5LiIKICBmaQogIGVjaG8KfQpmaQoKIyBpbnN0YWxsIGRlZmF1bHQgcmVnaXN0cnkgZW50cmllcwppZiBbICIkRE9SRUciID0gJ3llcycgXQp0aGVuIHsKICBpZiBbICIkQklORElTVCIgPSAnbm8nIF0KICB0aGVuIHsKICAgIGVjaG8gIkNvbXBpbGluZyByZWdlZGl0Li4uIgogICAgKGNkIHByb2dyYW1zL3JlZ2VkaXQ7IG1ha2UpCiAgICBlY2hvCiAgfQogIGZpCiAgZWNobyAiUHJlcGFyaW5nIHRvIGluc3RhbGwgZGVmYXVsdCBXaW5lIHJlZ2lzdHJ5IGVudHJpZXMuLi4iCgogICMgTWFrZSBzdXJlIHdlIGFyZSBvbiBhIFdpbmRvd3MgZHJpdmUKICBtdiAkTENPTkYgJExDT05GLm9yaWcKICBzZWQgInMvXCJQYXRoXCIgPSBcIiVIT01FJVwiJC9cIlBhdGhcIiA9IFwiJVBXRCVcIi8iICRMQ09ORi5vcmlnPiAkTENPTkYKCiAgZWNobyAiSW5zdGFsbGluZyBkZWZhdWx0IFdpbmUgcmVnaXN0cnkgZW50cmllcy4uLiIKICBlY2hvCiAgaWYgISAkUkVHRURJVCAkREVGUkVHID4gL2Rldi9udWxsCiAgdGhlbiB7CiAgICBlY2hvICJSZWdpc3RyeSBpbnN0YWxsIGZhaWxlZC4iCiAgICBtdiAkTENPTkYub3JpZyAkTENPTkYKICAgIGNvbmZfcmVzZXRfcXVlc3Rpb24gcmVnZWRpdF9lcnJvcgogICAgY29uZl9xdWVzdGlvbiBoaWdoIHJlZ2VkaXRfZXJyb3IKICAgIGV4aXQgMQogIH0KICBlbHNlIHsKICAgIGVjaG8KICAgIGVjaG8gIlJlZ2lzdHJ5IGVudHJpZXMgc3VjY2Vzc2Z1bGx5IGluc3RhbGxlZC4iCiAgICBtdiAkTENPTkYub3JpZyAkTENPTkYKICB9CiAgZmkKICBpZiBbICIkU1lTUkVHIiA9ICdhdXRvJyBdCiAgdGhlbiBTWVNSRUc9eWVzCiAgZmkKfQpmaQoKIyBtYWtlIHJvb3QncyByZWdpc3RyeSBnbG9iYWwsIGlmIGRlc2lyZWQKaWYgWyBgd2hvYW1pYCA9ICdyb290JyBdICYmIFsgIiRET1JFRyIgPSAneWVzJyBdICYmIFsgIiRTWVNSRUciID0gJ3llcycgXQp0aGVuIHsKICBbIC1kIH4vLndpbmUgXSB8fCBta2RpciB+Ly53aW5lCiAgaWYgISBbIC1mICRzeXNjb25mZGlyL3dpbmUudXNlcnJlZyBdCiAgdGhlbiB7CiAgICBlY2hvICJMaW5raW5nIHJvb3QncyB1c2VyIHJlZ2lzdHJ5IGhpdmUgdG8gdGhlIGdsb2JhbCByZWdpc3RyeS4uLiIKICAgIFsgLWYgfi8ud2luZS93aW5lLnVzZXJyZWcgXSAmJiBjcCB+Ly53aW5lL3dpbmUudXNlcnJlZyAkc3lzY29uZmRpci93aW5lLnVzZXJyZWcKICAgIGxuIC1zZiAkc3lzY29uZmRpci93aW5lLnVzZXJyZWcgfi8ud2luZS93aW5lLnVzZXJyZWcKICB9CiAgZmkKICBpZiAhIFsgLWYgJHN5c2NvbmZkaXIvd2luZS5zeXN0ZW1yZWcgXQogIHRoZW4gewogICAgZWNobyAiTGlua2luZyByb290J3Mgc3lzdGVtIHJlZ2lzdHJ5IGhpdmUgdG8gdGhlIGdsb2JhbCByZWdpc3RyeS4uLiIKICAgIFsgLWYgfi8ud2luZS9zeXN0ZW0ucmVnIF0gJiYgY3Agfi8ud2luZS9zeXN0ZW0ucmVnICRzeXNjb25mZGlyL3dpbmUuc3lzdGVtcmVnCiAgICBsbiAtc2YgJHN5c2NvbmZkaXIvd2luZS5zeXN0ZW1yZWcgfi8ud2luZS9zeXN0ZW0ucmVnCiAgfQogIGZpCn0KZmkKCiMgY2xlYW51cCBhbnkgdGVtcG9yYXJ5IGZpbGVzIHRoYXQgbWF5IHJlbWFpbgppZiBbIC1mICRUTVBDT05GIF0KdGhlbiBybSAtZiAkVE1QQ09ORgpmaQoKCiMgaXQncyBhIHdyYXAKZWNobwplY2hvICJJbnN0YWxsYXRpb24gY29tcGxldGUgZm9yIG5vdy4gR29vZCBsdWNrICh0aGlzIGlzIHN0aWxsIGFscGhhIHNvZnR3YXJlKS4iCmVjaG8gIklmIHlvdSBoYXZlIHByb2JsZW1zIHdpdGggV0lORSwgcGxlYXNlIHJlYWQgdGhlIGRvY3VtZW50YXRpb24gZmlyc3QsIgplY2hvICJhcyBtYW55IGtpbmRzIG9mIHBvdGVudGlhbCBwcm9ibGVtcyBhcmUgZXhwbGFpbmVkIHRoZXJlLiIKCmV4aXQgMAo=