LyoKICogSGVscCBWaWV3ZXIKICoKICogQ29weXJpZ2h0IDE5OTYgVWxyaWNoIFNjaG1pZAogKiBDb3B5cmlnaHQgMjAwMiBTeWx2YWluIFBldHJlb2xsZSA8c3BldHJlb2xsZUB5YWhvby5mcj4KICogQ29weXJpZ2h0IDIwMDggSm9uYXRoYW4gRXJuc3QKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBCiAqLwoKLyogTWVudSAqLwoKTEFOR1VBR0UgTEFOR19GUkVOQ0gsIFNVQkxBTkdfTkVVVFJBTAoKTUFJTl9NRU5VIE1FTlUKewogUE9QVVAgIiZGaWNoaWVyIiB7CiAgTUVOVUlURU0gIiZPdXZyaXIiLCBNTklEX0ZJTEVfT1BFTgogIE1FTlVJVEVNIFNFUEFSQVRPUgogIE1FTlVJVEVNICImSW1wcmltZXIiLCBNTklEX0ZJTEVfUFJJTlQKICBNRU5VSVRFTSAiJkNvbmZpZ3VyYXRpb24gZGUgbCdpbXByaW1hbnRlLi4uIiwgTU5JRF9GSUxFX1NFVFVQCiAgIE1FTlVJVEVNIFNFUEFSQVRPUgogIE1FTlVJVEVNICImUXVpdHRlciIsIE1OSURfRklMRV9FWElUCiB9CiBQT1BVUCAiySZkaXRpb24iIHsKICAgTUVOVUlURU0gIiZDb3BpZXIuLi4iLCBNTklEX0VESVRfQ09QWURMRwogICBNRU5VSVRFTSBTRVBBUkFUT1IKICAgTUVOVUlURU0gIiZBbm5vdGF0aW9uLi4uIiwgTU5JRF9FRElUX0FOTk9UQVRFCiB9CiBQT1BVUCAiJlNpZ25ldCIgewogICBNRU5VSVRFTSAiJkTpZmluaXIuLi4iLCBNTklEX0JLTUtfREVGSU5FCiB9CiBQT1BVUCAiJk9wdGlvbnMiIHsKICAgUE9QVVAJIkFpZGUgdG91am91cnMgdmlzaWJsZSIKICAgQkVHSU4KICAgICBNRU5VSVRFTSAiUGFyIGTpZmF1dCIsCU1OSURfT1BUU19IRUxQX0RFRkFVTFQKICAgICBNRU5VSVRFTSAiVmlzaWJsZSIsCU1OSURfT1BUU19IRUxQX1ZJU0lCTEUKICAgICBNRU5VSVRFTSAiTm9uIHZpc2libGUiLAlNTklEX09QVFNfSEVMUF9OT05WSVNJQkxFCiAgRU5ECiAgTUVOVUlURU0gIkhpc3RvcmlxdWUiLAlNTklEX09QVFNfSElTVE9SWQogIFBPUFVQICAgICJQb2xpY2VzIgogIEJFR0lOCiAgICBNRU5VSVRFTSAiUGV0aXRlIiwJCU1OSURfT1BUU19GT05UU19TTUFMTAogICAgTUVOVUlURU0gIk5vcm1hbGUiLCAgICAJTU5JRF9PUFRTX0ZPTlRTX05PUk1BTAogICAgTUVOVUlURU0gIkdyYW5kZSIsICAgICAJTU5JRF9PUFRTX0ZPTlRTX0xBUkdFCiAgRU5ECiAgTUVOVUlURU0gIlV0aWxpc2VyIGxlcyBjb3VsZXVycyBzeXN06G1lIiwgTU5JRF9PUFRTX1NZU1RFTV9DT0xPUlMKfQogUE9QVVAgIkFpZCZlIiB7CiAgIE1FTlVJVEVNICImVXRpbGlzZXIgbCdhaWRlIiwgTU5JRF9IRUxQX0hFTFBPTgogICBNRU5VSVRFTSAiJlRvdWpvdXJzIHZpc2libGUiLCBNTklEX0hFTFBfSEVMUFRPUAogICBNRU5VSVRFTSBTRVBBUkFUT1IKICAgTUVOVUlURU0gIiZJbmZvLi4uIiwgTU5JRF9IRUxQX0FCT1VUCiNpZmRlZiBXSU5FTElCCiAgIE1FTlVJVEVNICLAICZwcm9wb3MgZGUgV0lORSIsIE1OSURfSEVMUF9XSU5FCiNlbmRpZgogfQp9CgpJRERfSU5ERVggRElBTE9HIERJU0NBUkRBQkxFIDAsIDAsIDIwMCwgMTkwIExBTkdVQUdFIExBTkdfRlJFTkNILCBTVUJMQU5HX05FVVRSQUwKU1RZTEUgRFNfTU9EQUxGUkFNRSB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCkZPTlQgOCwgIk1TIFNoZWxsIERsZyIKQ0FQVElPTiAiSW5kZXgiCnsKICAgIExJU1RCT1ggSURDX0lOREVYTElTVCwgMTAsIDEwLCAxODAsIDE1MCwgTEJTX05PSU5URUdSQUxIRUlHSFQgfCBXU19WU0NST0xMIHwgV1NfQk9SREVSCiAgICBQVVNIQlVUVE9OICImT0siLCBJRE9LLCA0MCwgMTcwLCA1MCwgMTIKICAgIFBVU0hCVVRUT04gIiZBbm51bGVyIiwgSURDQU5DRUwsIDEyMCwgMTcwLCA1MCwgMTIKfQoKLyogU3RyaW5ncyAqLwpTVFJJTkdUQUJMRSBESVNDQVJEQUJMRSBMQU5HVUFHRSBMQU5HX0ZSRU5DSCwgU1VCTEFOR19ORVVUUkFMCnsKU1RJRF9XSU5FX0hFTFAsIAkiQWlkZSBkZSBXSU5FIgpTVElEX1dIRVJST1IsIAkJIkVSUkVVUiIKU1RJRF9XQVJOSU5HLCAgCQkiQVRURU5USU9OIgpTVElEX0lORk8sICAJCSJJbmZvcm1hdGlvbiIKU1RJRF9OT1RfSU1QTEVNRU5URUQsIAkiTm9uIGltcGzpbWVudOkiClNUSURfSExQRklMRV9FUlJPUl9zLCAJIlVuZSBlcnJldXIgZXN0IHN1cnZlbnVlIGVuIGxpc2FudCBsZSBmaWNoaWVyIGQnYWlkZSCroCVzoLsiClNUSURfSU5ERVgsIAkJIiZJbmRleCIKU1RJRF9DT05URU5UUywJCSJTb21tYWlyZSIKU1RJRF9CQUNLLCAJCSImUHLpY+lkZW50IgpTVElEX0FMTF9GSUxFUywgCSJUb3VzIGZpY2hpZXJzICgqLiopIgpTVElEX0hFTFBfRklMRVNfSExQLCAJIkZpY2hpZXJzIGQnYWlkZSAoKi5obHApIgpTVElEX0ZJTEVfTk9UX0ZPVU5EX3MJIkltcG9zc2libGUgZGUgdHJvdXZlciCroCVzoLsuIFNvdWhhaXRlei12b3VzIHJlY2hlcmNoZXIgY2UgZmljaGllciB2b3VzLW3qbWWgPyIKU1RJRF9OT19SSUNIRURJVAkiTGEgYmlibGlvdGjocXVlIFJpY2hFZGl0IG4nYSBwdSDqdHJlIGxvY2FsaXPpZS4uLiBBYmFuZG9uIgpTVElEX1BTSF9JTkRFWCwJCSJSdWJyaXF1ZXMgZCdhaWRlIDogIgp9CgpDT05URVhUX01FTlUgTUVOVQpCRUdJTgoJUE9QVVAgIiIKCUJFR0lOCgkJTUVOVUlURU0gIkFubm90YXRpb24uLi4iLCAgICAgICBNTklEX0NUWFRfQU5OT1RBVEUKCQlNRU5VSVRFTSAiQ29waWVyIiwgICAgICAgICAgICAgIE1OSURfQ1RYVF9DT1BZCgkJTUVOVUlURU0gIkltcHJpbWVyIGxhIHJ1YnJpcXVlLi4uIiwgTU5JRF9DVFhUX1BSSU5UCgkJUE9QVVAgICAgIlBvbGljZXMiCgkJQkVHSU4KCQkJTUVOVUlURU0gIlBldGl0ZSIsICAgICAgTU5JRF9DVFhUX0ZPTlRTX1NNQUxMCgkJCU1FTlVJVEVNICJOb3JtYWxlIiwgICAgIE1OSURfQ1RYVF9GT05UU19OT1JNQUwKCQkJTUVOVUlURU0gIkdyYW5kZSIsICAgICAgTU5JRF9DVFhUX0ZPTlRTX0xBUkdFCgkJRU5ECgkJUE9QVVAgICAiQWlkZSB0b3Vqb3VycyB2aXNpYmxlIgoJCUJFR0lOCgkJCU1FTlVJVEVNICJQYXIgZOlmYXV0IiwgIE1OSURfQ1RYVF9IRUxQX0RFRkFVTFQKCQkJTUVOVUlURU0gIlZpc2libGUiLCAgICAgTU5JRF9DVFhUX0hFTFBfVklTSUJMRQoJCQlNRU5VSVRFTSAiTm9uIHZpc2libGUiLCBNTklEX0NUWFRfSEVMUF9OT05WSVNJQkxFCgkJRU5ECgkJTUVOVUlURU0gIlV0aWxpc2VyIGxlcyBjb3VsZXVycyBzeXN06G1lIiwgTU5JRF9DVFhUX1NZU1RFTV9DT0xPUlMKCUVORApFTkQK