LyoKICogSGVscCBWaWV3ZXIKICoKICogQ29weXJpZ2h0IDE5OTYgVWxyaWNoIFNjaG1pZAogKiBDb3B5cmlnaHQgMjAwMiBTeWx2YWluIFBldHJlb2xsZSA8c3BldHJlb2xsZUB5YWhvby5mcj4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBCiAqLwoKLyogTWVudSAqLwoKTUFJTl9NRU5VIE1FTlUgTEFOR1VBR0UgTEFOR19LT1JFQU4sIFNVQkxBTkdfREVGQVVMVAp7CiBQT1BVUCAixsTAzygmRikiIHsKICBNRU5VSVRFTSAiv62x4igmTykuLi4iLCBNTklEX0ZJTEVfT1BFTgogIE1FTlVJVEVNIFNFUEFSQVRPUgogIE1FTlVJVEVNICLAzrziKCZQKSIsIE1OSURfRklMRV9QUklOVAogIE1FTlVJVEVNICLHwbiwxc0gvLPBpCgmUykuLi4iLCBNTklEX0ZJTEVfU0VUVVAKICAgTUVOVUlURU0gU0VQQVJBVE9SCiAgTUVOVUlURU0gIsG+t+EoJkUpIiwgTU5JRF9GSUxFX0VYSVQKIH0KIFBPUFVQICLG7cH9KCZFKSIgewogICBNRU5VSVRFTSAiurm75ygmQykuLi4iLCBNTklEX0VESVRfQ09QWURMRwogICBNRU5VSVRFTSBTRVBBUkFUT1IKICAgTUVOVUlURU0gIsHWvK4oJkEpLi4uIiwgTU5JRF9FRElUX0FOTk9UQVRFCiB9CiBQT1BVUCAiw6WwpcfHKCZCKSIgewogICBNRU5VSVRFTSAiwaTAxygmRCkuLi4iLCBNTklEX0JLTUtfREVGSU5FCiB9CiBQT1BVUCAiv8m8xygmTykiIHsKICAgUE9QVVAJIrChtMnH0SC1tb/yuLsgurjAzLHiIgogICBCRUdJTgogICAgIE1FTlVJVEVNICKx4rq7IiwJTU5JRF9PUFRTX0hFTFBfREVGQVVMVAogICAgIE1FTlVJVEVNICK6uMDMseIiLAlNTklEX09QVFNfSEVMUF9WSVNJQkxFCiAgICAgTUVOVUlURU0gIrq4v6nB1sH2IL7KseIiLAlNTklEX09QVFNfSEVMUF9OT05WSVNJQkxFCiAgRU5ECiAgTUVOVUlURU0gIrHit88iLAkJTU5JRF9PUFRTX0hJU1RPUlkKICBQT1BVUCAgICAisduywyIKICBCRUdJTgogICAgTUVOVUlURU0gIsDbsNQiLAkJTU5JRF9PUFRTX0ZPTlRTX1NNQUxMCiAgICBNRU5VSVRFTSAiurjF6yIsICAgIAlNTklEX09QVFNfRk9OVFNfTk9STUFMCiAgICBNRU5VSVRFTSAixamw1CIsICAgICAJTU5JRF9PUFRTX0ZPTlRTX0xBUkdFCiAgRU5ECiAgTUVOVUlURU0gIr3DvbrF2yC79rvzILvnv+siLAlNTklEX09QVFNfU1lTVEVNX0NPTE9SUwogfQogUE9QVVAgIrW1v/K4uygmSCkiIHsKICAgTUVOVUlURU0gIrW1v/K4uyC757/ruf0oJk8pIiwgTU5JRF9IRUxQX0hFTFBPTgogICBNRU5VSVRFTSAix9e78yDApygmVCkiLCBNTklEX0hFTFBfSEVMUFRPUAogICBNRU5VSVRFTSBTRVBBUkFUT1IKICAgTUVOVUlURU0gIsGkurgoJkkpLi4uIiwgTU5JRF9IRUxQX0FCT1VUCiNpZmRlZiBXSU5FTElCCiAgIE1FTlVJVEVNICJXaW5lv6EgsPzHz7+pKCZBKSIsIE1OSURfSEVMUF9XSU5FCiNlbmRpZgogfQp9CgoKSUREX0lOREVYIERJQUxPRyBESVNDQVJEQUJMRSAwLCAwLCAyMDAsIDE5MCBMQU5HVUFHRSBMQU5HX0tPUkVBTiwgU1VCTEFOR19ERUZBVUxUClNUWUxFIERTX01PREFMRlJBTUUgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQpGT05UIDksICJNUyBTaGVsbCBEbGciCkNBUFRJT04gIsDOtaa9uiIKewogICAgTElTVEJPWCBJRENfSU5ERVhMSVNULCAxMCwgMTAsIDE4MCwgMTUwLCBMQlNfTk9JTlRFR1JBTEhFSUdIVCB8IFdTX1ZTQ1JPTEwgfCBXU19CT1JERVIKfQoKSUREX1NFQVJDSCBESUFMT0cgRElTQ0FSREFCTEUgMCwgMCwgMjAwLCAxOTAgTEFOR1VBR0UgTEFOR19LT1JFQU4sIFNVQkxBTkdfREVGQVVMVApTVFlMRSBEU19NT0RBTEZSQU1FIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUKRk9OVCA5LCAiTVMgU2hlbGwgRGxnIgpDQVBUSU9OICLDo7HiIgp7CiAgICBMVEVYVCAgIr7GwfcgsbjH9rXHwfYgvsrAvSIsIC0xLCAxMCwgMTAsIDE4MCwgMTUwCn0KCi8qIFN0cmluZ3MgKi8KClNUUklOR1RBQkxFIERJU0NBUkRBQkxFIExBTkdVQUdFIExBTkdfS09SRUFOLCBTVUJMQU5HX0RFRkFVTFQKewpTVElEX1dJTkVfSEVMUCwgCSJXaW5lILW1v/K4uyIKU1RJRF9XSEVSUk9SLCAJCSK/obevIgpTVElEX1dBUk5JTkcsICAJCSKw5rDtIgpTVElEX0lORk8sICAJCSLBpLq4IgpTVElEX05PVF9JTVBMRU1FTlRFRCwgCSKxuMf2tcfB9iC+yr7SwL0iClNUSURfSExQRklMRV9FUlJPUl9zLCAJIrW1v/K4uyDGxMDPIGAlcye4piDA0LTCILW1wd8gv8C3+SC537v9IgpTVElEX0lOREVYLCAJCSK48cL3KCZDKSIKU1RJRF9DT05URU5UUywJCSK/5L7gIgpTVElEX0JBQ0ssIAkJIrXat84oJkIpIgpTVElEX0FMTF9GSUxFUywgCSK48LXnIMbEwM8gKCouKikiClNUSURfSEVMUF9GSUxFU19ITFAsIAkitbW/8ri7IMbEwM8gKCouaGxwKSIKU1RJRF9GSUxFX05PVF9GT1VORF9zCSIlc8C7IMOjwLsgvPYgvvi9wLTPtNknLiDAzCDGxMDPwLsgwffBoiDDo7DavcC0z7HuPyIKU1RJRF9OT19SSUNIRURJVAkicmljaGVkaXQgILG4x/bAuyDDo8C7vPYgvve9wLTPtNkuLiDD67zSwd8iClNUSURfUFNIX0lOREVYLAkJIrW1v/K4uyC48cL3OiAiCn0KCkNPTlRFWFRfTUVOVSBNRU5VIExBTkdVQUdFIExBTkdfS09SRUFOLCBTVUJMQU5HX0RFRkFVTFQKQkVHSU4KCVBPUFVQICIiCglCRUdJTgoJCU1FTlVJVEVNICLB1ryuLi4uIiwgICAgICAgTU5JRF9DVFhUX0FOTk9UQVRFCgkJTUVOVUlURU0gIrq5u+ciLCAgICAgICAgICAgICAgICBNTklEX0NUWFRfQ09QWQoJCU1FTlVJVEVNICLAzrziLi4uIiwgICAgICAgICAgICBNTklEX0NUWFRfUFJJTlQKCQlQT1BVUCAgICAisduywyIKCQlCRUdJTgoJCQlNRU5VSVRFTSAiwbyw1CIsICAgICAgIE1OSURfQ1RYVF9GT05UU19TTUFMTAoJCQlNRU5VSVRFTSAiurjF6yIsICAgICAgTU5JRF9DVFhUX0ZPTlRTX05PUk1BTAoJCQlNRU5VSVRFTSAis9Cw1CIsICAgICAgIE1OSURfQ1RYVF9GT05UU19MQVJHRQoJCUVORAoJCVBPUFVQICAgIrW1v/K4uyAgx9e78yC6uMDMseIiCgkJQkVHSU4KCQkJTUVOVUlURU0gIrHiursiLCAgICAgTU5JRF9DVFhUX0hFTFBfREVGQVVMVAoJCQlNRU5VSVRFTSAiurjAzLHiIiwgICAgIE1OSURfQ1RYVF9IRUxQX1ZJU0lCTEUKCQkJTUVOVUlURU0gIr7IILq4wMyx4iIsIE1OSURfQ1RYVF9IRUxQX05PTlZJU0lCTEUKCQlFTkQKCQlNRU5VSVRFTSAivcO9usXbILv2u/Mgu+e/6yIsICAgTU5JRF9DVFhUX1NZU1RFTV9DT0xPUlMKCUVORApFTkQK