LyoKICogSGVscCBWaWV3ZXIKICoKICogQ29weXJpZ2h0IDE5OTYgVWxyaWNoIFNjaG1pZAogKiBDb3B5cmlnaHQgMjAwMiBTeWx2YWluIFBldHJlb2xsZSA8c3BldHJlb2xsZUB5YWhvby5mcj4KICogQ29weXJpZ2h0IDIwMDggSm9uYXRoYW4gRXJuc3QKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBCiAqLwoKLyogTWVudSAqLwoKTEFOR1VBR0UgTEFOR19GUkVOQ0gsIFNVQkxBTkdfTkVVVFJBTAoKTUFJTl9NRU5VIE1FTlUKewogUE9QVVAgIiZGaWNoaWVyIiB7CiAgTUVOVUlURU0gIiZPdXZyaXIiLCBNTklEX0ZJTEVfT1BFTgogIE1FTlVJVEVNIFNFUEFSQVRPUgogIE1FTlVJVEVNICImSW1wcmltZXIiLCBNTklEX0ZJTEVfUFJJTlQKICBNRU5VSVRFTSAiJkNvbmZpZ3VyYXRpb24gZGUgbCdpbXByaW1hbnRlLi4uIiwgTU5JRF9GSUxFX1NFVFVQCiAgIE1FTlVJVEVNIFNFUEFSQVRPUgogIE1FTlVJVEVNICImUXVpdHRlciIsIE1OSURfRklMRV9FWElUCiB9CiBQT1BVUCAiySZkaXRpb24iIHsKICAgTUVOVUlURU0gIiZDb3BpZXIuLi4iLCBNTklEX0VESVRfQ09QWURMRwogICBNRU5VSVRFTSBTRVBBUkFUT1IKICAgTUVOVUlURU0gIiZBbm5vdGF0aW9uLi4uIiwgTU5JRF9FRElUX0FOTk9UQVRFCiB9CiBQT1BVUCAiJlNpZ25ldCIgewogICBNRU5VSVRFTSAiJkTpZmluaXIuLi4iLCBNTklEX0JLTUtfREVGSU5FCiB9CiBQT1BVUCAiJk9wdGlvbnMiIHsKICAgUE9QVVAJIkFpZGUgdG91am91cnMgdmlzaWJsZSIKICAgQkVHSU4KICAgICBNRU5VSVRFTSAiUGFyIGTpZmF1dCIsCU1OSURfT1BUU19IRUxQX0RFRkFVTFQKICAgICBNRU5VSVRFTSAiVmlzaWJsZSIsCU1OSURfT1BUU19IRUxQX1ZJU0lCTEUKICAgICBNRU5VSVRFTSAiTm9uIHZpc2libGUiLAlNTklEX09QVFNfSEVMUF9OT05WSVNJQkxFCiAgRU5ECiAgTUVOVUlURU0gIkhpc3RvcmlxdWUiLAlNTklEX09QVFNfSElTVE9SWQogIFBPUFVQICAgICJQb2xpY2VzIgogIEJFR0lOCiAgICBNRU5VSVRFTSAiUGV0aXRlIiwJCU1OSURfT1BUU19GT05UU19TTUFMTAogICAgTUVOVUlURU0gIk5vcm1hbGUiLCAgICAJTU5JRF9PUFRTX0ZPTlRTX05PUk1BTAogICAgTUVOVUlURU0gIkdyYW5kZSIsICAgICAJTU5JRF9PUFRTX0ZPTlRTX0xBUkdFCiAgRU5ECiAgTUVOVUlURU0gIlV0aWxpc2VyIGxlcyBjb3VsZXVycyBzeXN06G1lIiwgTU5JRF9PUFRTX1NZU1RFTV9DT0xPUlMKfQogUE9QVVAgIkFpZCZlIiB7CiAgIE1FTlVJVEVNICImVXRpbGlzZXIgbCdhaWRlIiwgTU5JRF9IRUxQX0hFTFBPTgogICBNRU5VSVRFTSAiJlRvdWpvdXJzIHZpc2libGUiLCBNTklEX0hFTFBfSEVMUFRPUAogICBNRU5VSVRFTSBTRVBBUkFUT1IKICAgTUVOVUlURU0gIiZJbmZvLi4uIiwgTU5JRF9IRUxQX0FCT1VUCiNpZmRlZiBXSU5FTElCCiAgIE1FTlVJVEVNICLAICZwcm9wb3MgZGUgV2luZSIsIE1OSURfSEVMUF9XSU5FCiNlbmRpZgogfQp9CgpJRERfSU5ERVggRElBTE9HIERJU0NBUkRBQkxFIDAsIDAsIDIwMCwgMTkwIExBTkdVQUdFIExBTkdfRlJFTkNILCBTVUJMQU5HX05FVVRSQUwKU1RZTEUgRFNfTU9EQUxGUkFNRSB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCkZPTlQgOCwgIk1TIFNoZWxsIERsZyIKQ0FQVElPTiAiSW5kZXgiCnsKICAgIExJU1RCT1ggSURDX0lOREVYTElTVCwgMTAsIDEwLCAxODAsIDE1MCwgTEJTX05PSU5URUdSQUxIRUlHSFQgfCBXU19WU0NST0xMIHwgV1NfQk9SREVSCn0KCklERF9TRUFSQ0ggRElBTE9HIERJU0NBUkRBQkxFIDAsIDAsIDIwMCwgMTkwIExBTkdVQUdFIExBTkdfRlJFTkNILCBTVUJMQU5HX05FVVRSQUwKU1RZTEUgRFNfTU9EQUxGUkFNRSB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCkZPTlQgOCwgIk1TIFNoZWxsIERsZyIKQ0FQVElPTiAiUmVjaGVyY2hlIgp7CiAgICBMVEVYVCAgIlBhcyBlbmNvcmUgaW1wbOltZW506SIsIC0xLCAxMCwgMTAsIDE4MCwgMTUwCn0KCi8qIFN0cmluZ3MgKi8KU1RSSU5HVEFCTEUgRElTQ0FSREFCTEUgTEFOR1VBR0UgTEFOR19GUkVOQ0gsIFNVQkxBTkdfTkVVVFJBTAp7ClNUSURfV0lORV9IRUxQLCAJIkFpZGUgZGUgV2luZSIKU1RJRF9XSEVSUk9SLCAJCSJFUlJFVVIiClNUSURfV0FSTklORywgIAkJIkFUVEVOVElPTiIKU1RJRF9JTkZPLCAgCQkiSW5mb3JtYXRpb24iClNUSURfTk9UX0lNUExFTUVOVEVELCAJIk5vbiBpbXBs6W1lbnTpIgpTVElEX0hMUEZJTEVfRVJST1JfcywgCSJVbmUgZXJyZXVyIGVzdCBzdXJ2ZW51ZSBlbiBsaXNhbnQgbGUgZmljaGllciBkJ2FpZGUgq6Alc6C7IgpTVElEX0lOREVYLCAJCSImSW5kZXgiClNUSURfQ09OVEVOVFMsCQkiU29tbWFpcmUiClNUSURfQkFDSywgCQkiJlBy6WPpZGVudCIKU1RJRF9BTExfRklMRVMsIAkiVG91cyBmaWNoaWVycyAoKi4qKSIKU1RJRF9IRUxQX0ZJTEVTX0hMUCwgCSJGaWNoaWVycyBkJ2FpZGUgKCouaGxwKSIKU1RJRF9GSUxFX05PVF9GT1VORF9zCSJJbXBvc3NpYmxlIGRlIHRyb3V2ZXIgq6Alc6C7LiBTb3VoYWl0ZXotdm91cyByZWNoZXJjaGVyIGNlIGZpY2hpZXIgdm91cy1t6m1loD8iClNUSURfTk9fUklDSEVESVQJIkxhIGJpYmxpb3Ro6HF1ZSBSaWNoRWRpdCBuJ2EgcHUg6nRyZSBsb2NhbGlz6WUuLi4gQWJhbmRvbiIKU1RJRF9QU0hfSU5ERVgsCQkiUnVicmlxdWVzIGQnYWlkZSA6ICIKfQoKQ09OVEVYVF9NRU5VIE1FTlUKQkVHSU4KCVBPUFVQICIiCglCRUdJTgoJCU1FTlVJVEVNICJBbm5vdGF0aW9uLi4uIiwgICAgICAgTU5JRF9DVFhUX0FOTk9UQVRFCgkJTUVOVUlURU0gIkNvcGllciIsICAgICAgICAgICAgICBNTklEX0NUWFRfQ09QWQoJCU1FTlVJVEVNICJJbXByaW1lciBsYSBydWJyaXF1ZS4uLiIsIE1OSURfQ1RYVF9QUklOVAoJCVBPUFVQICAgICJQb2xpY2VzIgoJCUJFR0lOCgkJCU1FTlVJVEVNICJQZXRpdGUiLCAgICAgIE1OSURfQ1RYVF9GT05UU19TTUFMTAoJCQlNRU5VSVRFTSAiTm9ybWFsZSIsICAgICBNTklEX0NUWFRfRk9OVFNfTk9STUFMCgkJCU1FTlVJVEVNICJHcmFuZGUiLCAgICAgIE1OSURfQ1RYVF9GT05UU19MQVJHRQoJCUVORAoJCVBPUFVQICAgIkFpZGUgdG91am91cnMgdmlzaWJsZSIKCQlCRUdJTgoJCQlNRU5VSVRFTSAiUGFyIGTpZmF1dCIsICBNTklEX0NUWFRfSEVMUF9ERUZBVUxUCgkJCU1FTlVJVEVNICJWaXNpYmxlIiwgICAgIE1OSURfQ1RYVF9IRUxQX1ZJU0lCTEUKCQkJTUVOVUlURU0gIk5vbiB2aXNpYmxlIiwgTU5JRF9DVFhUX0hFTFBfTk9OVklTSUJMRQoJCUVORAoJCU1FTlVJVEVNICJVdGlsaXNlciBsZXMgY291bGV1cnMgc3lzdOhtZSIsIE1OSURfQ1RYVF9TWVNURU1fQ09MT1JTCglFTkQKRU5ECg==