LyoKICogSGVscCBWaWV3ZXIgKER1dGNoIHJlc291cmNlcykKICoKICogQ29weXJpZ2h0IDIwMDMgSGFucyBMZWlkZWtrZXIKICogQ29weXJpZ2h0IDIwMDggRnJhbnMgS29vbAogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EKICovCgojaW5jbHVkZSAid2luaGVscF9yZXMuaCIKCi8qIE1lbnUgKi8KCk1BSU5fTUVOVSBNRU5VIExBTkdVQUdFIExBTkdfRFVUQ0gsIFNVQkxBTkdfTkVVVFJBTAp7CiBQT1BVUCAiJkJlc3RhbmQiIHsKICBNRU5VSVRFTSAiJk9wZW5lbiIsIE1OSURfRklMRV9PUEVOCiAgTUVOVUlURU0gU0VQQVJBVE9SCiAgTUVOVUlURU0gIkFmJmRydWtrZW4iLCBNTklEX0ZJTEVfUFJJTlQKICBNRU5VSVRFTSAiJlByaW50ZXJpbnN0ZWxsaW5nZW4uLi4iLCBNTklEX0ZJTEVfU0VUVVAKICBNRU5VSVRFTSBTRVBBUkFUT1IKICBNRU5VSVRFTSAiJkFmc2x1aXRlbiIsIE1OSURfRklMRV9FWElUCiB9CiBQT1BVUCAiJkJld2Vya2VuIiB7CiAgIE1FTlVJVEVNICImS29waetyZW4uLi4iLCBNTklEX0VESVRfQ09QWURMRwogICBNRU5VSVRFTSBTRVBBUkFUT1IKICAgTUVOVUlURU0gIiZBbm5vdGVyZW4uLi4iLCBNTklEX0VESVRfQU5OT1RBVEUKIH0KIFBPUFVQICImRmF2b3JpZXRlbiIgewogICBNRU5VSVRFTSAiJkFhbm1ha2VuLi4uIiwgTU5JRF9CS01LX0RFRklORQogfQogUE9QVVAgIiZPcHRpb25zIiB7CiAgIFBPUFVQCSJIZWxwIGFsd2F5cyB2aXNpYmxlIgogICBCRUdJTgogICAgIE1FTlVJVEVNICJEZWZhdWx0IiwJTU5JRF9PUFRTX0hFTFBfREVGQVVMVAogICAgIE1FTlVJVEVNICJWaXNpYmxlIiwJTU5JRF9PUFRTX0hFTFBfVklTSUJMRQogICAgIE1FTlVJVEVNICJOb24gdmlzaWJsZSIsCU1OSURfT1BUU19IRUxQX05PTlZJU0lCTEUKICBFTkQKICBNRU5VSVRFTSAiSGlzdG9yeSIsCQlNTklEX09QVFNfSElTVE9SWQogIFBPUFVQICAgICJGb250cyIKICBCRUdJTgogICAgTUVOVUlURU0gIlNtYWxsIiwJCU1OSURfT1BUU19GT05UU19TTUFMTAogICAgTUVOVUlURU0gIk5vcm1hbCIsICAgIAlNTklEX09QVFNfRk9OVFNfTk9STUFMCiAgICBNRU5VSVRFTSAiTGFyZ2UiLCAgICAgCU1OSURfT1BUU19GT05UU19MQVJHRQogIEVORAogIE1FTlVJVEVNICJVc2Ugc3lzdGVtIGNvbG9ycyIsCU1OSURfT1BUU19TWVNURU1fQ09MT1JTCiB9CiBQT1BVUCAiJkhlbHAiIHsKICAgTUVOVUlURU0gIkh1bHAgJmJpaiBoZWxwIiwgTU5JRF9IRUxQX0hFTFBPTgogICBNRU5VSVRFTSAiQWx0aWpkICZ6aWNodGJhYXIiLCBNTklEX0hFTFBfSEVMUFRPUAogICBNRU5VSVRFTSBTRVBBUkFUT1IKICAgTUVOVUlURU0gIiZJbmZvLi4uIiwgTU5JRF9IRUxQX0FCT1VUCiNpZmRlZiBXSU5FTElCCiAgIE1FTlVJVEVNICImT3ZlciBXSU5FIiwgTU5JRF9IRUxQX1dJTkUKI2VuZGlmCiB9Cn0KCklERF9JTkRFWCBESUFMT0cgRElTQ0FSREFCTEUgMCwgMCwgMjAwLCAxOTAgTEFOR1VBR0UgTEFOR19EVVRDSCwgU1VCTEFOR19ORVVUUkFMClNUWUxFIERTX01PREFMRlJBTUUgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQpGT05UIDgsICJNUyBTaGVsbCBEbGciCkNBUFRJT04gIkluZGV4Igp7CiAgICBMSVNUQk9YIElEQ19JTkRFWExJU1QsIDEwLCAxMCwgMTgwLCAxNTAsIExCU19OT0lOVEVHUkFMSEVJR0hUIHwgV1NfVlNDUk9MTCB8IFdTX0JPUkRFUgp9CgpJRERfU0VBUkNIIERJQUxPRyBESVNDQVJEQUJMRSAwLCAwLCAyMDAsIDE5MCBMQU5HVUFHRSBMQU5HX0RVVENILCBTVUJMQU5HX05FVVRSQUwKU1RZTEUgRFNfTU9EQUxGUkFNRSB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCkZPTlQgOCwgIk1TIFNoZWxsIERsZyIKQ0FQVElPTiAiWm9la2VuIgp7CiAgICBMVEVYVCAgIk5vZyBuaWV0IGdlaW1wbGVtZW50ZWVyZCIsIC0xLCAxMCwgMTAsIDE4MCwgMTUwCn0KCi8qIFN0cmluZ3MgKi8KU1RSSU5HVEFCTEUgRElTQ0FSREFCTEUgTEFOR1VBR0UgTEFOR19EVVRDSCwgU1VCTEFOR19ORVVUUkFMCnsKU1RJRF9XSU5FX0hFTFAsIAkiV0lORSBIZWxwIgpTVElEX1dIRVJST1IsIAkJIkZPVVQiClNUSURfV0FSTklORywgIAkJIldBQVJTQ0hVV0lORyIKU1RJRF9JTkZPLCAgCQkiSW5mb3JtYXRpZSIKU1RJRF9OT1RfSU1QTEVNRU5URUQsIAkiTmlldCBnZe9tcGxlbWVudGVlcmQiClNUSURfSExQRklMRV9FUlJPUl9zLCAJIkZvdXQgYmlqIGhldCBsZXplbiB2YW4gaGV0IGhlbHBiZXN0YW5kIGAlcyciClNUSURfSU5ERVgsIAkJIiZJbmhvdWQiClNUSURfQ09OVEVOVFMsCQkiU3VtbWFyeSIKU1RJRF9CQUNLLCAJCSImVGVydWciClNUSURfQUxMX0ZJTEVTLCAJIkFsbGUgYmVzdGFuZGVuICgqLiopIgpTVElEX0hFTFBfRklMRVNfSExQLCAJIkhlbHBiZXN0YW5kZW4gKCouaGxwKSIKU1RJRF9GSUxFX05PVF9GT1VORF9zCSJLYW4gJyVzJyBuaWV0IG9wZW5lbi4gV2lsdCB1IHplbGYgZGl0IGJlc3RhbmQgem9la2VuPyIKU1RJRF9OT19SSUNIRURJVAkiQ2Fubm90IGZpbmQgYSByaWNoZWRpdCBpbXBsZW1lbnRhdGlvbi4uLiBBYm9ydGluZyIKU1RJRF9QU0hfSU5ERVgsCQkiSGVscCB0b3BpY3M6ICIKfQoKQ09OVEVYVF9NRU5VIE1FTlUgTEFOR1VBR0UgTEFOR19EVVRDSCwgU1VCTEFOR19ORVVUUkFMCkJFR0lOCglQT1BVUCAiIgoJQkVHSU4KCQlNRU5VSVRFTSAiQW5ub3RlcmluZy4uLiIsICAgICAgIE1OSURfQ1RYVF9BTk5PVEFURQoJCU1FTlVJVEVNICJLb3Bp63JlbiIsICAgICAgICAgICAgTU5JRF9DVFhUX0NPUFkKCQlNRU5VSVRFTSAiUHJpbnQuLi4iLCAgICAgICAgICAgIE1OSURfQ1RYVF9QUklOVAoJCVBPUFVQICAgICJMZXR0ZXJ0eXBlcyIKCQlCRUdJTgoJCQlNRU5VSVRFTSAiS2xlaW4iLCAgICAgICBNTklEX0NUWFRfRk9OVFNfU01BTEwKCQkJTUVOVUlURU0gIk5vcm1hYWwiLCAgICAgTU5JRF9DVFhUX0ZPTlRTX05PUk1BTAoJCQlNRU5VSVRFTSAiR3Jvb3QiLCAgICAgICBNTklEX0NUWFRfRk9OVFNfTEFSR0UKCQlFTkQKCQlQT1BVUCAgICJIZWxwIGFsdGlqZCB6aWNodGJhYXIiCgkJQkVHSU4KCQkJTUVOVUlURU0gIlN0YW5kYWFyZCIsICAgTU5JRF9DVFhUX0hFTFBfREVGQVVMVAoJCQlNRU5VSVRFTSAiWmljaHRiYWFyIiwgICBNTklEX0NUWFRfSEVMUF9WSVNJQkxFCgkJCU1FTlVJVEVNICJPbnppY2h0YmFhciIsIE1OSURfQ1RYVF9IRUxQX05PTlZJU0lCTEUKCQlFTkQKCQlNRU5VSVRFTSAiR2VicnVpayBzeXN0ZWVtIGtsZXVyZW4iLCAgIE1OSURfQ1RYVF9TWVNURU1fQ09MT1JTCglFTkQKRU5ECg==