LyoKICogIE5vdGVwYWQgKEVzcGVyYW50byBMYW5ndWFnZSBSZXNvdXJjZXMpCiAqCiAqICBDb3B5cmlnaHQgMjAwNiBBbnRvbmlvIENvZGF6emkKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBCiAqLwoKTEFOR1VBR0UgTEFOR19FU1BFUkFOVE8sIFNVQkxBTkdfREVGQVVMVAoKTUFJTl9NRU5VIE1FTlUKewogUE9QVVAgIkRvc2llcm8iIHsKICBNRU5VSVRFTSAiJk5vdmFcdEN0cmwrTiIsICAgICAgICAgICBDTURfTkVXCiAgTUVOVUlURU0gIk1hbGZlcm11XHRDdHJsK08iLCAgICAgQ01EX09QRU4KICBNRU5VSVRFTSAiS29uJnNlcnZ1XHRDdHJsK1MiLCAgICAgQ01EX1NBVkUKICBNRU5VSVRFTSAiS29uc2VydnUgJmtpZWwiLCAgICAgICBDTURfU0FWRV9BUwogIE1FTlVJVEVNIFNFUEFSQVRPUgogIE1FTlVJVEVNICJQcmVzdVx0Q3RybCtQIiwgICAgICAgICAgICBDTURfUFJJTlQKICBNRU5VSVRFTSAiSW1wb3p1IHBh+G9uIiwgICAgQ01EX1BBR0VfU0VUVVAKICBNRU5VSVRFTSAiSW1wb3p1IFByaW50aWxvbiIsIENNRF9QUklOVEVSX1NFVFVQCiAgTUVOVUlURU0gU0VQQVJBVE9SCiAgTUVOVUlURU0gIkZpbnUiLCAgICAgICAgICAgICBDTURfRVhJVAogfQpQT1BVUCAiJlJlZGFrdG8iIHsKICBNRU5VSVRFTSAiTnVsaWd1XHRDdHJsK1oiLCAgICAgQ01EX1VORE8KICBNRU5VSVRFTSBTRVBBUkFUT1IKICBNRU5VSVRFTSAiVG9uZHVcdEN0cmwrWCIsICAgICAgQ01EX0NVVAogIE1FTlVJVEVNICJLb3BpdVx0Q3RybCtDIiwgICAgIENNRF9DT1BZCiAgTUVOVUlURU0gIkVubWV0dVx0Q3RybCtWIiwgICAgQ01EX1BBU1RFCiAgTUVOVUlURU0gIkZvcmlndVx0RGVsIiwgICAgICBDTURfREVMRVRFCiAgTUVOVUlURU0gU0VQQVJBVE9SCiAgTUVOVUlURU0gIkVsZWsmdHUg5mlvblx0Q3RybCtBIiwgICAgICAgQ01EX1NFTEVDVF9BTEwKICBNRU5VSVRFTSAiSG9yby9EYXRvXHRGNSIsICAgIENNRF9USU1FX0RBVEUKICBNRU5VSVRFTSBTRVBBUkFUT1IKICBNRU5VSVRFTSAiJkFsaW5ldSBh/XRvbWF0ZSIsICBDTURfV1JBUAogIE1FTlVJVEVNICImSW1wb3p1IHRpcGFyb24uLi4iLCAgICAgICAgICBDTURfRk9OVAogfQpQT1BVUCAiJlNlcuZ1IiB7CiAgTUVOVUlURU0gIlNlcuZ1XHRDdHJsK0YiLCAgIENNRF9TRUFSQ0gKICBNRU5VSVRFTSAiU2Vy5nUgc2VrdmFudGFcdEYzIiwgIENNRF9TRUFSQ0hfTkVYVAogfQpQT1BVUCAiJkhlbHBvIiB7CiAgTUVOVUlURU0gIkVuaGF2byIsICAgICAgICAgQ01EX0hFTFBfQ09OVEVOVFMKICBNRU5VSVRFTSAiU2Vy5nUuLi4iLCAgICAgICAgQ01EX0hFTFBfU0VBUkNICiAgTUVOVUlURU0gIlByaSBIZWxwYW50byIsICAgICBDTURfSEVMUF9PTl9IRUxQCiAgTUVOVUlURU0gU0VQQVJBVE9SCiAgUE9QVVAgIlByaS4uLiIgewogICBNRU5VSVRFTSAiJkxpY2VuY28iLCAgICAgICAgIENNRF9MSUNFTlNFCiAgIE1FTlVJVEVNICImR2FyYW50aW8iLCAgICAgQ01EX05PX1dBUlJBTlRZCiAgIE1FTlVJVEVNICJQcmkgTm90ZXBhZCIsICAgICAgQ01EX0FCT1VUX1dJTkUKICB9CiB9Cn0KCi8qIERpYWxvZyBgUGFnZSBzZXR1cCcgKi8KCkRJQUxPR19QQUdFU0VUVVAgRElBTE9HIDAsIDAsIDIyNSwgOTUKU1RZTEUgRFNfTU9EQUxGUkFNRSB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCkZPTlQgOCwgIk1TIFNoZWxsIERsZyIKQ0FQVElPTiAiSW1wb3p1IGxhIHBh+G9uIgp7CkxURVhUICAgICJLYXBub3RvajoiLCAgMHgxNDAsICAgMTAsIDA3LCA0MCwgMTUKRURJVFRFWFQgSURDX1BBR0VTRVRVUF9IRUFERVJWQUxVRSwgICA2MCwgMDUsMTEwLCAxMiwgV1NfQk9SREVSIHwgV1NfVEFCU1RPUApMVEVYVCAgICAiUGllZG5vdG9qOiIsICAweDE0MiwgICAxMCwgMjQsIDQwLCAxNQpFRElUVEVYVCBJRENfUEFHRVNFVFVQX0ZPT1RFUlZBTFVFLCAgIDYwLCAyMiwxMTAsIDEyLCBXU19CT1JERVIgfCBXU19UQUJTVE9QCgpHUk9VUEJPWCAiJk1hcvhlbm9qOiIsICAgICAgMHgxNDQsICAgICAxMCwgNDMsMTYwLCA0NQpMVEVYVCAgICAiJk1hbGRla3N0cmE6IiwgICAgICAgIDB4MTQ1LCAgIDEzLCA1NSwgMzcsIDEwLCBXU19DSElMRApFRElUVEVYVCBJRENfUEFHRVNFVFVQX0xFRlRWQUxVRSwgICAgIDUwLCA1NSwgMzUsIDExLCBXU19DSElMRCB8IFdTX0JPUkRFUiB8IFdTX1RBQlNUT1AKTFRFWFQgICAgIiZTdXByYToiLCAgICAgICAgIDB4MTQ4LCAgICAxMywgNzMsIDM3LCAxMCwgV1NfQ0hJTEQKRURJVFRFWFQgSURDX1BBR0VTRVRVUF9UT1BWQUxVRSwgICAgICA1MCwgNzMsIDM1LCAxMSwgV1NfQ0hJTEQgfCBXU19CT1JERVIgfCBXU19UQUJTVE9QCkxURVhUICAgICImRGVrc3RyYToiLCAgICAgICAweDE0QiwgMTAwLCA1NSwgMzAsIDEwLCBXU19DSElMRApFRElUVEVYVCBJRENfUEFHRVNFVFVQX1JJR0hUVkFMVUUsICAgMTMwLCA1NSwgMzUsIDExLCBXU19DSElMRCB8IFdTX0JPUkRFUiB8IFdTX1RBQlNUT1AKTFRFWFQgICAgIlN1JmJhOiIsICAgICAgMHgxNEUsMTAwLCA3MywgMzAsIDEwLCBXU19DSElMRApFRElUVEVYVCBJRENfUEFHRVNFVFVQX0JPVFRPTVZBTFVFLCAgMTMwLCA3MywgMzUsIDExLCBXU19DSElMRCB8IFdTX0JPUkRFUiB8IFdTX1RBQlNUT1AKCkRFRlBVU0hCVVRUT04gIkJvbmUiLCAgICAgICAgIElET0ssICAgICAgICAgICAgICAgICAgIDE4MCwgIDMsIDQwLCAxNSwgV1NfVEFCU1RPUApQVVNIQlVUVE9OICAgICJSZXppZ25pIiwgICAgIElEQ0FOQ0VMLCAgICAgICAgICAgICAgIDE4MCwgMjEsIDQwLCAxNSwgV1NfVEFCU1RPUApQVVNIQlVUVE9OICAgICJIZWxwbyIsICAgICAgIElESEVMUCwgICAgICAgICAgICAgICAgMTgwLCAzOSwgNDAsIDE1LCBXU19UQUJTVE9QCn0KClNUUklOR1RBQkxFIERJU0NBUkRBQkxFCnsKU1RSSU5HX1BBR0VTRVRVUF9IRUFERVJWQUxVRSwgICAiJmYiClNUUklOR19QQUdFU0VUVVBfRk9PVEVSVkFMVUUsICAgIlBh+G8gJnAiCgpTVFJJTkdfTk9URVBBRCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTm90Ymxva28iClNUUklOR19FUlJPUiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFUk9STyIKU1RSSU5HX1dBUk5JTkcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFURU5UVSIKU1RSSU5HX0lORk8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkluZm9ybW8gcHJpIgoKU1RSSU5HX1VOVElUTEVELCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihzZW4tbm9tbykiCgpTVFJJTkdfQUxMX0ZJTEVTLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVHV0YWogZG9zaWVyb2ogKCouKikiClNUUklOR19URVhUX0ZJTEVTX1RYVCwgICAgICAgICAgICAgICAgICAiVGVrc3Rkb3NpZXJvaiAoKi50eHQpIgoKU1RSSU5HX1RPT0xBUkdFLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxhIGRvc2llcm8gJyVzJyBlc3RhcyB0cm8gZ3JhbmRhIHBvciBOb3RlcGFkLlxuIFwKT25pIGtvbnNpbGFzIHV6aSBhbGlhbiByZWRha3RpbG9uLiIKU1RSSU5HX05PVEVYVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5lIGVzdGFzIGVubWV0aXRhIHRla3N0by4gXApcbk9uaSBrb25zaWxhcyBza3JpYmkgZGV2b3ZlIGthaiByZXByb3ZpIgpTVFJJTkdfRE9FU05PVEVYSVNULCAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTGEgZG9zaWVybyAnJXMnXG5uZSBla3Npc3Rhc1xuXG4gXArGdSBtaSBkZXZhcyBrcmVpIG5vdmFuIGRvc2llcm9uPyIKU1RSSU5HX05PVFNBVkVELCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxhIGRvc2llcm8nJXMnXG4gZXN0aXMg/mFu+Gl0YVxuXG4gXArGdSB2aSB2b2xhcyBrb25zZXJ2aSBsYSD+YW74b2puPyIKU1RSSU5HX05PVEZPVU5ELCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWkgbmUgdHJvdmlzICclcycuIgpTVFJJTkdfT1VUX09GX01FTU9SWSwgICAgICAgICAgICAgICAgICAgIkxhIG1lbW9ybyBlc3RhcyBuZXN1ZmnmYSBwb3Iga29tcGxldGlnbyBqZSBsYSB0YXNrbyBcClxuT25pIGtvbnNpbGFzIGZlcm1pIHVudSBvIHBsdXJhaiBwcm9ncmFtb2ogcG9yXG5saWJlcmlnaSBtZW1vcm9uLiIKCn0K