LyoKICogIE5vdGVwYWQgKEVzcGVyYW50byBMYW5ndWFnZSBSZXNvdXJjZXMpCiAqCiAqICBDb3B5cmlnaHQgMjAwNiBBbnRvbmlvIENvZGF6emkKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBCiAqLwoKI2luY2x1ZGUgIm5vdGVwYWRfcmVzLmgiCgpMQU5HVUFHRSBMQU5HX0VTUEVSQU5UTywgU1VCTEFOR19ERUZBVUxUCgpNQUlOX01FTlUgTUVOVQp7CiBQT1BVUCAiRG9zaWVybyIgewogIE1FTlVJVEVNICImTm92YVx0Q3RybCtOIiwgICAgICAgICAgIENNRF9ORVcKICBNRU5VSVRFTSAiTWFsZmVybXVcdEN0cmwrTyIsICAgICBDTURfT1BFTgogIE1FTlVJVEVNICJLb24mc2VydnVcdEN0cmwrUyIsICAgICBDTURfU0FWRQogIE1FTlVJVEVNICJLb25zZXJ2dSAma2llbCIsICAgICAgIENNRF9TQVZFX0FTCiAgTUVOVUlURU0gU0VQQVJBVE9SCiAgTUVOVUlURU0gIlByZXN1XHRDdHJsK1AiLCAgICAgICAgICAgIENNRF9QUklOVAogIE1FTlVJVEVNICJJbXBvenUgcGH4b24iLCAgICBDTURfUEFHRV9TRVRVUAogIE1FTlVJVEVNICJJbXBvenUgUHJpbnRpbG9uIiwgQ01EX1BSSU5URVJfU0VUVVAKICBNRU5VSVRFTSBTRVBBUkFUT1IKICBNRU5VSVRFTSAiRmludSIsICAgICAgICAgICAgIENNRF9FWElUCiB9ClBPUFVQICImUmVkYWt0byIgewogIE1FTlVJVEVNICJOdWxpZ3VcdEN0cmwrWiIsICAgICBDTURfVU5ETwogIE1FTlVJVEVNIFNFUEFSQVRPUgogIE1FTlVJVEVNICJUb25kdVx0Q3RybCtYIiwgICAgICBDTURfQ1VUCiAgTUVOVUlURU0gIktvcGl1XHRDdHJsK0MiLCAgICAgQ01EX0NPUFkKICBNRU5VSVRFTSAiRW5tZXR1XHRDdHJsK1YiLCAgICBDTURfUEFTVEUKICBNRU5VSVRFTSAiRm9yaWd1XHREZWwiLCAgICAgIENNRF9ERUxFVEUKICBNRU5VSVRFTSBTRVBBUkFUT1IKICBNRU5VSVRFTSAiRWxlayZ0dSDmaW9uXHRDdHJsK0EiLCAgICAgICBDTURfU0VMRUNUX0FMTAogIE1FTlVJVEVNICJIb3JvL0RhdG9cdEY1IiwgICAgQ01EX1RJTUVfREFURQogIE1FTlVJVEVNIFNFUEFSQVRPUgogIE1FTlVJVEVNICImQWxpbmV1IGH9dG9tYXRlIiwgIENNRF9XUkFQCiAgTUVOVUlURU0gIiZJbXBvenUgdGlwYXJvbi4uLiIsICAgICAgICAgIENNRF9GT05UCiB9ClBPUFVQICImU2Vy5nUiIHsKICBNRU5VSVRFTSAiU2Vy5nVcdEN0cmwrRiIsICAgQ01EX1NFQVJDSAogIE1FTlVJVEVNICJTZXLmdSBzZWt2YW50YVx0RjMiLCAgQ01EX1NFQVJDSF9ORVhUCiB9ClBPUFVQICImSGVscG8iIHsKICBNRU5VSVRFTSAiRW5oYXZvIiwgICAgICAgICBDTURfSEVMUF9DT05URU5UUwogIE1FTlVJVEVNICJTZXLmdS4uLiIsICAgICAgICBDTURfSEVMUF9TRUFSQ0gKICBNRU5VSVRFTSAiUHJpIEhlbHBhbnRvIiwgICAgIENNRF9IRUxQX09OX0hFTFAKICBNRU5VSVRFTSBTRVBBUkFUT1IKICBNRU5VSVRFTSAiUHJpIE5vdGVwYWQiLCAgQ01EX0hFTFBfQUJPVVRfTk9URVBBRAogfQp9CgovKiBEaWFsb2cgYFBhZ2Ugc2V0dXAnICovCgpESUFMT0dfUEFHRVNFVFVQIERJQUxPRyAwLCAwLCAyMjUsIDk1ClNUWUxFIERTX01PREFMRlJBTUUgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQpGT05UIDgsICJNUyBTaGVsbCBEbGciCkNBUFRJT04gIkltcG96dSBsYSBwYfhvbiIKewpMVEVYVCAgICAiS2Fwbm90b2o6IiwgIDB4MTQwLCAgIDEwLCAwNywgNDAsIDE1CkVESVRURVhUIElEQ19QQUdFU0VUVVBfSEVBREVSVkFMVUUsICAgNjAsIDA1LDExMCwgMTIsIFdTX0JPUkRFUiB8IFdTX1RBQlNUT1AKTFRFWFQgICAgIlBpZWRub3RvajoiLCAgMHgxNDIsICAgMTAsIDI0LCA0MCwgMTUKRURJVFRFWFQgSURDX1BBR0VTRVRVUF9GT09URVJWQUxVRSwgICA2MCwgMjIsMTEwLCAxMiwgV1NfQk9SREVSIHwgV1NfVEFCU1RPUAoKR1JPVVBCT1ggIiZNYXL4ZW5vajoiLCAgICAgIDB4MTQ0LCAgICAgMTAsIDQzLDE2MCwgNDUKTFRFWFQgICAgIiZNYWxkZWtzdHJhOiIsICAgICAgICAweDE0NSwgICAxMywgNTUsIDM3LCAxMCwgV1NfQ0hJTEQKRURJVFRFWFQgSURDX1BBR0VTRVRVUF9MRUZUVkFMVUUsICAgICA1MCwgNTUsIDM1LCAxMSwgV1NfQ0hJTEQgfCBXU19CT1JERVIgfCBXU19UQUJTVE9QCkxURVhUICAgICImU3VwcmE6IiwgICAgICAgICAweDE0OCwgICAgMTMsIDczLCAzNywgMTAsIFdTX0NISUxECkVESVRURVhUIElEQ19QQUdFU0VUVVBfVE9QVkFMVUUsICAgICAgNTAsIDczLCAzNSwgMTEsIFdTX0NISUxEIHwgV1NfQk9SREVSIHwgV1NfVEFCU1RPUApMVEVYVCAgICAiJkRla3N0cmE6IiwgICAgICAgMHgxNEIsIDEwMCwgNTUsIDMwLCAxMCwgV1NfQ0hJTEQKRURJVFRFWFQgSURDX1BBR0VTRVRVUF9SSUdIVFZBTFVFLCAgIDEzMCwgNTUsIDM1LCAxMSwgV1NfQ0hJTEQgfCBXU19CT1JERVIgfCBXU19UQUJTVE9QCkxURVhUICAgICJTdSZiYToiLCAgICAgIDB4MTRFLDEwMCwgNzMsIDMwLCAxMCwgV1NfQ0hJTEQKRURJVFRFWFQgSURDX1BBR0VTRVRVUF9CT1RUT01WQUxVRSwgIDEzMCwgNzMsIDM1LCAxMSwgV1NfQ0hJTEQgfCBXU19CT1JERVIgfCBXU19UQUJTVE9QCgpERUZQVVNIQlVUVE9OICJCb25lIiwgICAgICAgICBJRE9LLCAgICAgICAgICAgICAgICAgICAxODAsICAzLCA0MCwgMTUsIFdTX1RBQlNUT1AKUFVTSEJVVFRPTiAgICAiUmV6aWduaSIsICAgICBJRENBTkNFTCwgICAgICAgICAgICAgICAxODAsIDIxLCA0MCwgMTUsIFdTX1RBQlNUT1AKUFVTSEJVVFRPTiAgICAiSGVscG8iLCAgICAgICBJREhFTFAsICAgICAgICAgICAgICAgIDE4MCwgMzksIDQwLCAxNSwgV1NfVEFCU1RPUAp9CgpTVFJJTkdUQUJMRSBESVNDQVJEQUJMRQp7ClNUUklOR19QQUdFU0VUVVBfSEVBREVSVkFMVUUsICAgIiZmIgpTVFJJTkdfUEFHRVNFVFVQX0ZPT1RFUlZBTFVFLCAgICJQYfhvICZwIgoKU1RSSU5HX05PVEVQQUQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vdGJsb2tvIgpTVFJJTkdfRVJST1IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRVJPUk8iClNUUklOR19XQVJOSU5HLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBVEVOVFUiClNUUklOR19JTkZPLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbmZvcm1vIHByaSIKClNUUklOR19VTlRJVExFRCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoc2VuLW5vbW8pIgoKU1RSSU5HX0FMTF9GSUxFUywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlR1dGFqIGRvc2llcm9qICgqLiopIgpTVFJJTkdfVEVYVF9GSUxFU19UWFQsICAgICAgICAgICAgICAgICAgIlRla3N0ZG9zaWVyb2ogKCoudHh0KSIKClNUUklOR19UT09MQVJHRSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMYSBkb3NpZXJvICclcycgZXN0YXMgdHJvIGdyYW5kYSBwb3IgTm90ZXBhZC5cbiBcCk9uaSBrb25zaWxhcyB1emkgYWxpYW4gcmVkYWt0aWxvbi4iClNUUklOR19OT1RFWFQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOZSBlc3RhcyBlbm1ldGl0YSB0ZWtzdG8uIFwKXG5Pbmkga29uc2lsYXMgc2tyaWJpIGRldm92ZSBrYWogcmVwcm92aSIKU1RSSU5HX0RPRVNOT1RFWElTVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxhIGRvc2llcm8gJyVzJ1xubmUgZWtzaXN0YXNcblxuIFwKxnUgbWkgZGV2YXMga3JlaSBub3ZhbiBkb3NpZXJvbj8iClNUUklOR19OT1RTQVZFRCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMYSBkb3NpZXJvJyVzJ1xuIGVzdGlzIP5hbvhpdGFcblxuIFwKxnUgdmkgdm9sYXMga29uc2VydmkgbGEg/mFu+G9qbj8iClNUUklOR19OT1RGT1VORCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1pIG5lIHRyb3ZpcyAnJXMnLiIKU1RSSU5HX09VVF9PRl9NRU1PUlksICAgICAgICAgICAgICAgICAgICJMYSBtZW1vcm8gZXN0YXMgbmVzdWZp5mEgcG9yIGtvbXBsZXRpZ28gamUgbGEgdGFza28gXApcbk9uaSBrb25zaWxhcyBmZXJtaSB1bnUgbyBwbHVyYWogcHJvZ3JhbW9qIHBvclxubGliZXJpZ2kgbWVtb3Jvbi4iCgp9Cg==