LyoKICogIE5vdGVwYWQgKEZpbm5pc2ggcmVzb3VyY2VzKQogKgogKiAgQ29weXJpZ2h0IDE5OTkgYnkgSnVra2EgSWl2b25lbiA8aWl2b25lbkBpa2kuZmk+CiAqICBDb3B5cmlnaHQgMjAwMiBTeWx2YWluIFBldHJlb2xsZSA8c3BldHJlb2xsZUB5YWhvby5mcj4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBCiAqLwoKI2luY2x1ZGUgIm5vdGVwYWRfcmVzLmgiCgpMQU5HVUFHRSBMQU5HX0ZJTk5JU0gsIFNVQkxBTkdfREVGQVVMVAoKTUFJTl9NRU5VIE1FTlUKewogUE9QVVAgIiZUaWVkb3N0byIgewogIE1FTlVJVEVNICImVXVzaVx0Q3RybCtOIiwJCUNNRF9ORVcKICBNRU5VSVRFTSAiJkF2YWEuLi5cdEN0cmwrTyIsCQlDTURfT1BFTgogIE1FTlVJVEVNICJUYSZsbGV0YVx0Q3RybCtTIiwJCUNNRF9TQVZFCiAgTUVOVUlURU0gIlRhbGxldGEgJm5pbWVsbOQuLi4iLAlDTURfU0FWRV9BUwogIE1FTlVJVEVNIFNFUEFSQVRPUgogIE1FTlVJVEVNICJUJnVsb3N0YS4uLlx0Q3RybCtQIiwJCUNNRF9QUklOVAogIE1FTlVJVEVNICImU2l2dW4gYXNldHVrc2V0Li4uIiwJQ01EX1BBR0VfU0VUVVAKICBNRU5VSVRFTSAiJktpcmpvaXR0aW1lbiBhc2V0dWtzZXQuLi4iLAlDTURfUFJJTlRFUl9TRVRVUAogIE1FTlVJVEVNIFNFUEFSQVRPUgogIE1FTlVJVEVNICImUG9pc3R1IiwJCUNNRF9FWElUCiB9ClBPUFVQICImTXVva2thYSIgewogIE1FTlVJVEVNICImUGFsYXV0YVx0Q3RybCtaIiwJQ01EX1VORE8KICBNRU5VSVRFTSBTRVBBUkFUT1IKICBNRU5VSVRFTSAiJkxlaWtrYWFcdEN0cmwrWCIsCUNNRF9DVVQKICBNRU5VSVRFTSAiJktvcGlvaVx0Q3RybCtDIiwJQ01EX0NPUFkKICBNRU5VSVRFTSAiTCZpaXTkXHRDdHJsK1YiLAlDTURfUEFTVEUKICBNRU5VSVRFTSAiUCZvaXN0YVx0RGVsIiwJQ01EX0RFTEVURQogIE1FTlVJVEVNIFNFUEFSQVRPUgogIE1FTlVJVEVNICImVmFsaXRzZSBrYWlra2kiLAlDTURfU0VMRUNUX0FMTAogIE1FTlVJVEVNICImQWlrYS9Q5Gl25G3k5HLkXHRGNSIsCUNNRF9USU1FX0RBVEUKICBNRU5VSVRFTSBTRVBBUkFUT1IKICBNRU5VSVRFTSAiS2EmdGthaXNlIHBpdGvkIHJpdmkiLAlDTURfV1JBUAogIE1FTlVJVEVNICImRm9udC4uLiIsICAgICAgICAgIENNRF9GT05UCiB9ClBPUFVQICImRXRzaSIgewogIE1FTlVJVEVNICJFdHNpLi4uIiwJCUNNRF9TRUFSQ0gKICBNRU5VSVRFTSAiRXRzaSAmc2V1cmFhdmFcdEYzIiwJQ01EX1NFQVJDSF9ORVhUCiAgTUVOVUlURU0gIiZLb3J2YWEuLi5cdEN0cmwrSCIsIENNRF9SRVBMQUNFCiB9ClBPUFVQICImQXB1YSIgewogIE1FTlVJVEVNICImU2lz5Gx09iIsCQlDTURfSEVMUF9DT05URU5UUwogIE1FTlVJVEVNICImRXRzaS4uLiIsCQlDTURfSEVMUF9TRUFSQ0gKICBNRU5VSVRFTSAiQXB1YSAmT3Bhc3R1a3Nlc3RhIiwJQ01EX0hFTFBfT05fSEVMUAogIE1FTlVJVEVNIFNFUEFSQVRPUgogIE1FTlVJVEVNICImQWJvdXQgTm90ZXBhZCIsIENNRF9IRUxQX0FCT1VUX05PVEVQQUQKIH0KfQoKLyogRGlhbG9nIGBQYWdlIHNldHVwJyAqLwoKRElBTE9HX1BBR0VTRVRVUCBESUFMT0cgMCwgMCwgMjI1LCA5NQpTVFlMRSBEU19NT0RBTEZSQU1FIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUKRk9OVCA4LCAiTVMgU2hlbGwgRGxnIgpDQVBUSU9OICJTaXZ1biBhc2V0dWtzZXQiCnsKTFRFWFQgICAgIiZZbORvdHNpa2tvOiIsICAweDE0MCwgICAxMCwgMDcsIDQwLCAxNQpFRElUVEVYVCBJRENfUEFHRVNFVFVQX0hFQURFUlZBTFVFLCAgIDYwLCAwNSwxMTAsIDEyLCBXU19CT1JERVIgfCBXU19UQUJTVE9QCkxURVhUICAgICJBbGFvJnRzaWtrbzoiLCAgMHgxNDIsICAgMTAsIDI0LCA0MCwgMTUKRURJVFRFWFQgSURDX1BBR0VTRVRVUF9GT09URVJWQUxVRSwgICA2MCwgMjIsMTEwLCAxMiwgV1NfQk9SREVSIHwgV1NfVEFCU1RPUAoKR1JPVVBCT1ggIiZNYXJnaW5hYWxpOiIsICAgICAgMHgxNDQsICAgICAxMCwgNDMsMTYwLCA0NQpMVEVYVCAgICAiJlZhc2VuOiIsICAgICAgICAweDE0NSwgICAyMCwgNTUsIDMwLCAxMCwgV1NfQ0hJTEQKRURJVFRFWFQgSURDX1BBR0VTRVRVUF9MRUZUVkFMVUUsICAgICA1MCwgNTUsIDM1LCAxMSwgV1NfQ0hJTEQgfCBXU19CT1JERVIgfCBXU19UQUJTVE9QCkxURVhUICAgICJZJmzkOiIsICAgICAgICAgMHgxNDgsICAgIDIwLCA3MywgMzAsIDEwLCBXU19DSElMRApFRElUVEVYVCBJRENfUEFHRVNFVFVQX1RPUFZBTFVFLCAgICAgIDUwLCA3MywgMzUsIDExLCBXU19DSElMRCB8IFdTX0JPUkRFUiB8IFdTX1RBQlNUT1AKTFRFWFQgICAgIiZPaWtlYToiLCAgICAgICAweDE0QiwgMTAwLCA1NSwgMzAsIDEwLCBXU19DSElMRApFRElUVEVYVCBJRENfUEFHRVNFVFVQX1JJR0hUVkFMVUUsICAgMTMwLCA1NSwgMzUsIDExLCBXU19DSElMRCB8IFdTX0JPUkRFUiB8IFdTX1RBQlNUT1AKTFRFWFQgICAgIiZBbGE6IiwgICAgICAweDE0RSwxMDAsIDczLCAzMCwgMTAsIFdTX0NISUxECkVESVRURVhUIElEQ19QQUdFU0VUVVBfQk9UVE9NVkFMVUUsICAxMzAsIDczLCAzNSwgMTEsIFdTX0NISUxEIHwgV1NfQk9SREVSIHwgV1NfVEFCU1RPUAoKREVGUFVTSEJVVFRPTiAiT0siLCAgICAgICAgIElET0ssICAgICAgICAgICAgICAgICAgIDE4MCwgIDMsIDQwLCAxNSwgV1NfVEFCU1RPUApQVVNIQlVUVE9OICAgICJQZXJ1dXRhIiwgICAgIElEQ0FOQ0VMLCAgICAgICAgICAgICAgIDE4MCwgMjEsIDQwLCAxNSwgV1NfVEFCU1RPUApQVVNIQlVUVE9OICAgICImQXB1YSIsICAgICAgIElESEVMUCwgICAgICAgICAgICAgICAgMTgwLCAzOSwgNDAsIDE1LCBXU19UQUJTVE9QCn0KClNUUklOR1RBQkxFIERJU0NBUkRBQkxFCnsKU1RSSU5HX1BBR0VTRVRVUF9IRUFERVJWQUxVRSwJIiZmIgpTVFJJTkdfUEFHRVNFVFVQX0ZPT1RFUlZBTFVFLAkiU2l2dSAmcCIKClNUUklOR19OT1RFUEFELAkJCQkJIk5vdGVwYWQiClNUUklOR19FUlJPUiwJCQkJCSJWSVJIRSIKU1RSSU5HX1dBUk5JTkcsCQkJCQkiVkFST0lUVVMiClNUUklOR19JTkZPLAkJCQkJIlRpZWRvaXR1cyIKClNUUklOR19VTlRJVExFRCwJCQkJIihvdHNpa29pbWF0b24pIgoKU1RSSU5HX0FMTF9GSUxFUywJCQkJIkthaWtraSB0aWVkb3N0b3QgKCouKikiClNUUklOR19URVhUX0ZJTEVTX1RYVCwJCQkiVGVrc3RpIHRpZWRvc3RvdCAoKi50eHQpIgoKU1RSSU5HX1RPT0xBUkdFLAkJCQkiVGllZG9zdG8gJyVzJyBvbiBsaWlhbiBzdXVyaS5cbiBcClBsZWFzZSB1c2UgYSBkaWZmZXJlbnQgZWRpdG9yLiIKU1RSSU5HX05PVEVYVCwJCQkJCSJFdCBzefZ0dORueXQgbGFpbmthYW4gdGVrc3Rp5C4gXApcbktpcmpvaXRhIGpvdGFpbiBqYSB5cml05CB1dWRlbGxlZW4iClNUUklOR19ET0VTTk9URVhJU1QsCQkJCSJGaWxlICclcydcbmRvZXMgbm90IGV4aXN0XG5cbiBcCkRvIHlvdSB3YW50IHRvIGNyZWF0ZSBhIG5ldyBmaWxlID8iClNUUklOR19OT1RTQVZFRCwJCQkJIkZpbGUgJyVzJ1xuaGFzIGJlZW4gbW9kaWZpZWRcblxuIFwKV291bGQgeW91IGxpa2UgdG8gc2F2ZSB0aGUgY2hhbmdlcyA/IgpTVFJJTkdfTk9URk9VTkQsCQkJCQkiJyVzJyBlaSBs9nlkeS4iClNUUklOR19PVVRfT0ZfTUVNT1JZLAkJCSJNdWlzdGlhIGVpIG9sZSByaWl0dOR25HN0aSB05G3kbiBcClxudGVodOR25G4gdGVrZW1pc2Vrc2kuIFN1bGplIGpva2luIHNvdmVsbHVzIHZhcGF1dHRhYWtzZXNpXG4gXAptdWlzdGlhLiIKCn0K