LyoKICoJTmF0aW9uYWwgTGFuZ3VhZ2UgU3VwcG9ydCBsaWJyYXJ5CiAqCiAqCUNvcHlyaWdodCAxOTk1CU1hcnRpbiB2b24gTG9ld2lzCiAqICAgICAgQ29weXJpZ2h0IDE5OTggIERhdmlkIExlZSBMYW1iZXJ0CiAqICAgICAgQ29weXJpZ2h0IDIwMDAgIEp1bGlvIEPpc2FyIEfhenF1ZXoKICovCgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8Y3R5cGUuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8bG9jYWxlLmg+CgojaW5jbHVkZSAid2luZGVmLmgiCiNpbmNsdWRlICJ3aW5iYXNlLmgiCiNpbmNsdWRlICJ3aW5nZGkuaCIKI2luY2x1ZGUgIndpbnVzZXIuaCIKI2luY2x1ZGUgIndpbmUvdW5pY29kZS5oIgojaW5jbHVkZSAib3B0aW9ucy5oIgojaW5jbHVkZSAid2ludmVyLmgiCiNpbmNsdWRlICJ3aW5ubHMuaCIKI2luY2x1ZGUgIndpbnJlZy5oIgojaW5jbHVkZSAid2luZXJyb3IuaCIKI2luY2x1ZGUgImRlYnVndG9vbHMuaCIKCkRFRkFVTFRfREVCVUdfQ0hBTk5FTChzdHJpbmcpOwoKLyogTG9jYWxlIG5hbWUgdG8gaWQgbWFwLiB1c2VkIGJ5IEVudW1TeXN0ZW1Mb2NhbGVzLCBHZXRMb2NhbGVJbmZvQSAKICogTVVTVCBjb250YWluIGFsbCAjZGVmaW5lcyBmcm9tIHdpbm5scy5oCiAqIGxhc3QgZW50cnkgaGFzIE5VTEwgbmFtZSwgMCBpZC4KICovIAojZGVmaW5lIExPQ0FMRV9FTlRSWSh4KQl7I3gsTE9DQUxFXyMjeH0Kc3RhdGljIGNvbnN0IHN0cnVjdCB0YWdMT0NBTEVfTkFNRTJJRCB7CiAgICBjb25zdCBjaGFyCSpuYW1lOwogICAgTENUWVBFCWlkOwp9IGxvY2FsZV9uYW1lMmlkW109IHsKCUxPQ0FMRV9FTlRSWShJTEFOR1VBR0UpLAoJTE9DQUxFX0VOVFJZKFNMQU5HVUFHRSksCglMT0NBTEVfRU5UUlkoU0VOR0xBTkdVQUdFKSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWTEFOR05BTUUpLAoJTE9DQUxFX0VOVFJZKFNOQVRJVkVMQU5HTkFNRSksCglMT0NBTEVfRU5UUlkoSUNPVU5UUlkpLAoJTE9DQUxFX0VOVFJZKFNDT1VOVFJZKSwKCUxPQ0FMRV9FTlRSWShTRU5HQ09VTlRSWSksCglMT0NBTEVfRU5UUlkoU0FCQlJFVkNUUllOQU1FKSwKCUxPQ0FMRV9FTlRSWShTTkFUSVZFQ1RSWU5BTUUpLAoJTE9DQUxFX0VOVFJZKElERUZBVUxUTEFOR1VBR0UpLAoJTE9DQUxFX0VOVFJZKElERUZBVUxUQ09VTlRSWSksCglMT0NBTEVfRU5UUlkoSURFRkFVTFRDT0RFUEFHRSksCglMT0NBTEVfRU5UUlkoSURFRkFVTFRBTlNJQ09ERVBBR0UpLAoJTE9DQUxFX0VOVFJZKElERUZBVUxUTUFDQ09ERVBBR0UpLAoJTE9DQUxFX0VOVFJZKFNMSVNUKSwKCUxPQ0FMRV9FTlRSWShJTUVBU1VSRSksCglMT0NBTEVfRU5UUlkoU0RFQ0lNQUwpLAoJTE9DQUxFX0VOVFJZKFNUSE9VU0FORCksCglMT0NBTEVfRU5UUlkoU0dST1VQSU5HKSwKCUxPQ0FMRV9FTlRSWShJRElHSVRTKSwKCUxPQ0FMRV9FTlRSWShJTFpFUk8pLAoJTE9DQUxFX0VOVFJZKElORUdOVU1CRVIpLAoJTE9DQUxFX0VOVFJZKFNOQVRJVkVESUdJVFMpLAoJTE9DQUxFX0VOVFJZKFNDVVJSRU5DWSksCglMT0NBTEVfRU5UUlkoU0lOVExTWU1CT0wpLAoJTE9DQUxFX0VOVFJZKFNNT05ERUNJTUFMU0VQKSwKCUxPQ0FMRV9FTlRSWShTTU9OVEhPVVNBTkRTRVApLAoJTE9DQUxFX0VOVFJZKFNNT05HUk9VUElORyksCglMT0NBTEVfRU5UUlkoSUNVUlJESUdJVFMpLAoJTE9DQUxFX0VOVFJZKElJTlRMQ1VSUkRJR0lUUyksCglMT0NBTEVfRU5UUlkoSUNVUlJFTkNZKSwKCUxPQ0FMRV9FTlRSWShJTkVHQ1VSUiksCglMT0NBTEVfRU5UUlkoU0RBVEUpLAoJTE9DQUxFX0VOVFJZKFNUSU1FKSwKCUxPQ0FMRV9FTlRSWShTU0hPUlREQVRFKSwKCUxPQ0FMRV9FTlRSWShTTE9OR0RBVEUpLAoJTE9DQUxFX0VOVFJZKFNUSU1FRk9STUFUKSwKCUxPQ0FMRV9FTlRSWShJREFURSksCglMT0NBTEVfRU5UUlkoSUxEQVRFKSwKCUxPQ0FMRV9FTlRSWShJVElNRSksCglMT0NBTEVfRU5UUlkoSVRJTUVNQVJLUE9TTiksCglMT0NBTEVfRU5UUlkoSUNFTlRVUlkpLAoJTE9DQUxFX0VOVFJZKElUTFpFUk8pLAoJTE9DQUxFX0VOVFJZKElEQVlMWkVSTyksCglMT0NBTEVfRU5UUlkoSU1PTkxaRVJPKSwKCUxPQ0FMRV9FTlRSWShTMTE1OSksCglMT0NBTEVfRU5UUlkoUzIzNTkpLAoJTE9DQUxFX0VOVFJZKElDQUxFTkRBUlRZUEUpLAoJTE9DQUxFX0VOVFJZKElPUFRJT05BTENBTEVOREFSKSwKCUxPQ0FMRV9FTlRSWShJRklSU1REQVlPRldFRUspLAoJTE9DQUxFX0VOVFJZKElGSVJTVFdFRUtPRllFQVIpLAoJTE9DQUxFX0VOVFJZKFNEQVlOQU1FMSksCglMT0NBTEVfRU5UUlkoU0RBWU5BTUUyKSwKCUxPQ0FMRV9FTlRSWShTREFZTkFNRTMpLAoJTE9DQUxFX0VOVFJZKFNEQVlOQU1FNCksCglMT0NBTEVfRU5UUlkoU0RBWU5BTUU1KSwKCUxPQ0FMRV9FTlRSWShTREFZTkFNRTYpLAoJTE9DQUxFX0VOVFJZKFNEQVlOQU1FNyksCglMT0NBTEVfRU5UUlkoU0FCQlJFVkRBWU5BTUUxKSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWREFZTkFNRTIpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZEQVlOQU1FMyksCglMT0NBTEVfRU5UUlkoU0FCQlJFVkRBWU5BTUU0KSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWREFZTkFNRTUpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZEQVlOQU1FNiksCglMT0NBTEVfRU5UUlkoU0FCQlJFVkRBWU5BTUU3KSwKCUxPQ0FMRV9FTlRSWShTTU9OVEhOQU1FMSksCglMT0NBTEVfRU5UUlkoU01PTlRITkFNRTIpLAoJTE9DQUxFX0VOVFJZKFNNT05USE5BTUUzKSwKCUxPQ0FMRV9FTlRSWShTTU9OVEhOQU1FNCksCglMT0NBTEVfRU5UUlkoU01PTlRITkFNRTUpLAoJTE9DQUxFX0VOVFJZKFNNT05USE5BTUU2KSwKCUxPQ0FMRV9FTlRSWShTTU9OVEhOQU1FNyksCglMT0NBTEVfRU5UUlkoU01PTlRITkFNRTgpLAoJTE9DQUxFX0VOVFJZKFNNT05USE5BTUU5KSwKCUxPQ0FMRV9FTlRSWShTTU9OVEhOQU1FMTApLAoJTE9DQUxFX0VOVFJZKFNNT05USE5BTUUxMSksCglMT0NBTEVfRU5UUlkoU01PTlRITkFNRTEyKSwKCUxPQ0FMRV9FTlRSWShTTU9OVEhOQU1FMTMpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZNT05USE5BTUUxKSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWTU9OVEhOQU1FMiksCglMT0NBTEVfRU5UUlkoU0FCQlJFVk1PTlRITkFNRTMpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZNT05USE5BTUU0KSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWTU9OVEhOQU1FNSksCglMT0NBTEVfRU5UUlkoU0FCQlJFVk1PTlRITkFNRTYpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZNT05USE5BTUU3KSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWTU9OVEhOQU1FOCksCglMT0NBTEVfRU5UUlkoU0FCQlJFVk1PTlRITkFNRTkpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZNT05USE5BTUUxMCksCglMT0NBTEVfRU5UUlkoU0FCQlJFVk1PTlRITkFNRTExKSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWTU9OVEhOQU1FMTIpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZNT05USE5BTUUxMyksCglMT0NBTEVfRU5UUlkoU1BPU0lUSVZFU0lHTiksCglMT0NBTEVfRU5UUlkoU05FR0FUSVZFU0lHTiksCglMT0NBTEVfRU5UUlkoSVBPU1NJR05QT1NOKSwKCUxPQ0FMRV9FTlRSWShJTkVHU0lHTlBPU04pLAoJTE9DQUxFX0VOVFJZKElQT1NTWU1QUkVDRURFUyksCglMT0NBTEVfRU5UUlkoSVBPU1NFUEJZU1BBQ0UpLAoJTE9DQUxFX0VOVFJZKElORUdTWU1QUkVDRURFUyksCglMT0NBTEVfRU5UUlkoSU5FR1NFUEJZU1BBQ0UpLAoJTE9DQUxFX0VOVFJZKEZPTlRTSUdOQVRVUkUpLAoJTE9DQUxFX0VOVFJZKFNJU082MzlMQU5HTkFNRSksCglMT0NBTEVfRU5UUlkoU0lTTzMxNjZDVFJZTkFNRSksCgl7TlVMTCwwfQp9OwoKc3RhdGljIGNoYXIgKkdldExvY2FsZVN1YmtleU5hbWUoIERXT1JEIGxjdHlwZSApOwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlHZXRVc2VyRGVmYXVsdExDSUQgKEtFUk5FTDMyLkApCiAqLwpMQ0lEIFdJTkFQSSBHZXRVc2VyRGVmYXVsdExDSUQodm9pZCkKewoJcmV0dXJuIE1BS0VMQ0lEKCBHZXRVc2VyRGVmYXVsdExhbmdJRCgpICwgU09SVF9ERUZBVUxUICk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJR2V0U3lzdGVtRGVmYXVsdExDSUQgKEtFUk5FTDMyLkApCiAqLwpMQ0lEIFdJTkFQSSBHZXRTeXN0ZW1EZWZhdWx0TENJRCh2b2lkKQp7CglyZXR1cm4gR2V0VXNlckRlZmF1bHRMQ0lEKCk7Cn0KCiNkZWZpbmUgTkxTX01BWF9MQU5HVUFHRVMgMjAKdHlwZWRlZiBzdHJ1Y3QgewogICAgY2hhciBsYW5nWzEyOF07CiAgICBjaGFyIGNvdW50cnlbMTI4XTsKICAgIExBTkdJRCBmb3VuZF9sYW5nX2lkW05MU19NQVhfTEFOR1VBR0VTXTsKICAgIGNoYXIgZm91bmRfbGFuZ3VhZ2VbTkxTX01BWF9MQU5HVUFHRVNdWzNdOwogICAgY2hhciBmb3VuZF9jb3VudHJ5W05MU19NQVhfTEFOR1VBR0VTXVszXTsKICAgIGludCBuX2ZvdW5kOwp9IExBTkdfRklORF9EQVRBOwoKc3RhdGljIEJPT0wgQ0FMTEJBQ0sgTkxTX0ZpbmRMYW5ndWFnZUlEX1Byb2NBKEhNT0RVTEUgaE1vZHVsZSwgTFBDU1RSIHR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUENTVFIgbmFtZSwgV09SRCBMYW5nSUQsIExPTkcgbFBhcmFtKQp7CiAgICBMQU5HX0ZJTkRfREFUQSAqbF9kYXRhID0gKExBTkdfRklORF9EQVRBICopbFBhcmFtOwogICAgTENJRCBsY2lkID0gTUFLRUxDSUQoTGFuZ0lELCBTT1JUX0RFRkFVTFQpOwogICAgY2hhciBidWZfbGFuZ3VhZ2VbMTI4XTsKICAgIGNoYXIgYnVmX2NvdW50cnlbMTI4XTsKICAgIGNoYXIgYnVmX2VuX2xhbmd1YWdlWzEyOF07CgogICAgVFJBQ0UoIiUwNFhcbiIsIChVSU5UKUxhbmdJRCk7CiAgICBpZihQUklNQVJZTEFOR0lEKExhbmdJRCkgPT0gTEFOR19ORVVUUkFMKQogICAgICAgIHJldHVybiBUUlVFOyAvKiBjb250aW51ZSBzZWFyY2ggKi8KCiAgICBidWZfbGFuZ3VhZ2VbMF0gPSAwOwogICAgYnVmX2NvdW50cnlbMF0gPSAwOwoKICAgIEdldExvY2FsZUluZm9BKGxjaWQsIExPQ0FMRV9TSVNPNjM5TEFOR05BTUV8TE9DQUxFX05PVVNFUk9WRVJSSURFLAogICAgICAgICAgICAgICAgICAgYnVmX2xhbmd1YWdlLCBzaXplb2YoYnVmX2xhbmd1YWdlKSk7CiAgICBUUkFDRSgiTE9DQUxFX1NJU082MzlMQU5HTkFNRTogJXNcbiIsIGJ1Zl9sYW5ndWFnZSk7CgogICAgR2V0TG9jYWxlSW5mb0EobGNpZCwgTE9DQUxFX1NJU08zMTY2Q1RSWU5BTUV8TE9DQUxFX05PVVNFUk9WRVJSSURFLAogICAgICAgICAgICAgICAgICAgYnVmX2NvdW50cnksIHNpemVvZihidWZfY291bnRyeSkpOwogICAgVFJBQ0UoIkxPQ0FMRV9TSVNPMzE2NkNUUllOQU1FOiAlc1xuIiwgYnVmX2NvdW50cnkpOwoKICAgIGlmKGxfZGF0YS0+bGFuZyAmJiBzdHJsZW4obF9kYXRhLT5sYW5nKSA+IDAgJiYgIXN0cmNhc2VjbXAobF9kYXRhLT5sYW5nLCBidWZfbGFuZ3VhZ2UpKQogICAgewoJaWYobF9kYXRhLT5jb3VudHJ5ICYmIHN0cmxlbihsX2RhdGEtPmNvdW50cnkpID4gMCkKCXsKCSAgICBpZighc3RyY2FzZWNtcChsX2RhdGEtPmNvdW50cnksIGJ1Zl9jb3VudHJ5KSkKCSAgICB7CgkJbF9kYXRhLT5mb3VuZF9sYW5nX2lkWzBdID0gTGFuZ0lEOwoJCWxfZGF0YS0+bl9mb3VuZCA9IDE7CgkJVFJBQ0UoIkZvdW5kIGxhbmdfaWQgJTA0WCBmb3IgJXNfJXNcbiIsIExhbmdJRCwgbF9kYXRhLT5sYW5nLCBsX2RhdGEtPmNvdW50cnkpOwoJCXJldHVybiBGQUxTRTsgLyogc3RvcCBlbnVtZXJhdGlvbiAqLwoJICAgIH0KCX0KCWVsc2UgLyogbF9kYXRhLT5jb3VudHJ5IG5vdCBzcGVjaWZpZWQgKi8KCXsKCSAgICBpZihsX2RhdGEtPm5fZm91bmQgPCBOTFNfTUFYX0xBTkdVQUdFUykKCSAgICB7CgkJbF9kYXRhLT5mb3VuZF9sYW5nX2lkW2xfZGF0YS0+bl9mb3VuZF0gPSBMYW5nSUQ7CgkJc3RybmNweShsX2RhdGEtPmZvdW5kX2NvdW50cnlbbF9kYXRhLT5uX2ZvdW5kXSwgYnVmX2NvdW50cnksIDMpOwoJCXN0cm5jcHkobF9kYXRhLT5mb3VuZF9sYW5ndWFnZVtsX2RhdGEtPm5fZm91bmRdLCBidWZfbGFuZ3VhZ2UsIDMpOwoJCWxfZGF0YS0+bl9mb3VuZCsrOwoJCVRSQUNFKCJGb3VuZCBsYW5nX2lkICUwNFggZm9yICVzXG4iLCBMYW5nSUQsIGxfZGF0YS0+bGFuZyk7CgkJcmV0dXJuIFRSVUU7IC8qIGNvbnRpbnVlIHNlYXJjaCAqLwoJICAgIH0KCX0KICAgIH0KCiAgICAvKiBKdXN0IGluIGNhc2UsIGNoZWNrIExPQ0FMRV9TRU5HTEFOR1VBR0UgdG9vLAogICAgICogaW4gaG9wZSB0aGF0IHBvc3NpYmxlIGFsaWFzIG5hbWUgbWlnaHQgaGF2ZSB0aGF0IHZhbHVlLgogICAgICovCiAgICBidWZfZW5fbGFuZ3VhZ2VbMF0gPSAwOwogICAgR2V0TG9jYWxlSW5mb0EobGNpZCwgTE9DQUxFX1NFTkdMQU5HVUFHRXxMT0NBTEVfTk9VU0VST1ZFUlJJREUsCiAgICAgICAgICAgICAgICAgICBidWZfZW5fbGFuZ3VhZ2UsIHNpemVvZihidWZfZW5fbGFuZ3VhZ2UpKTsKICAgIFRSQUNFKCJMT0NBTEVfU0VOR0xBTkdVQUdFOiAlc1xuIiwgYnVmX2VuX2xhbmd1YWdlKTsKCiAgICBpZihsX2RhdGEtPmxhbmcgJiYgc3RybGVuKGxfZGF0YS0+bGFuZykgPiAwICYmICFzdHJjYXNlY21wKGxfZGF0YS0+bGFuZywgYnVmX2VuX2xhbmd1YWdlKSkKICAgIHsKCWxfZGF0YS0+Zm91bmRfbGFuZ19pZFtsX2RhdGEtPm5fZm91bmRdID0gTGFuZ0lEOwoJc3RybmNweShsX2RhdGEtPmZvdW5kX2NvdW50cnlbbF9kYXRhLT5uX2ZvdW5kXSwgYnVmX2NvdW50cnksIDMpOwoJc3RybmNweShsX2RhdGEtPmZvdW5kX2xhbmd1YWdlW2xfZGF0YS0+bl9mb3VuZF0sIGJ1Zl9sYW5ndWFnZSwgMyk7CglsX2RhdGEtPm5fZm91bmQrKzsKCVRSQUNFKCJGb3VuZCBsYW5nX2lkICUwNFggZm9yICVzXG4iLCBMYW5nSUQsIGxfZGF0YS0+bGFuZyk7CiAgICB9CgogICAgcmV0dXJuIFRSVUU7IC8qIGNvbnRpbnVlIHNlYXJjaCAqLwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIE5MU19HZXRMYW5ndWFnZUlECiAqCiAqIElOUFVUOgogKglMYW5nOiBhIHN0cmluZyB3aG9zZSB0d28gZmlyc3QgY2hhcnMgYXJlIHRoZSBpc28gbmFtZSBvZiBhIGxhbmd1YWdlLgogKglDb3VudHJ5OiBhIHN0cmluZyB3aG9zZSB0d28gZmlyc3QgY2hhcnMgYXJlIHRoZSBpc28gbmFtZSBvZiBjb3VudHJ5CiAqCUNoYXJzZXQ6IGEgc3RyaW5nIGRlZmluaW5nIHRoZSBjaG9zc2VuIGNoYXJzZXQgZW5jb2RpbmcKICoJRGlhbGVjdDogYSBzdHJpbmcgZGVmaW5pbmcgYSB2YXJpYXRpb24gb2YgdGhlIGxvY2FsZQogKgogKglhbGwgdGhvc2UgdmFsdWVzIGFyZSBmcm9tIHRoZSBzdGFuZGFyZGl6ZWQgZm9ybWF0IG9mIGxvY2FsZQogKgluYW1lIGluIHVuaXggd2hpY2ggaXM6IExhbmdbX0NvdW50cnldWy5DaGFyc2V0XVtARGlhbGVjdF0KICoKICogUkVUVVJOUzoKICoJdGhlIG51bWVyaWMgY29kZSBvZiB0aGUgbGFuZ3VhZ2UgdXNlZCBieSBXaW5kb3dzCiAqCiAqIEZJWE1FOiBDaGFyc2V0IGFuZCBEaWFsZWN0IGFyZSBub3QgaGFuZGxlZAogKi8Kc3RhdGljIExBTkdJRCBOTFNfR2V0TGFuZ3VhZ2VJRChMUENTVFIgTGFuZywgTFBDU1RSIENvdW50cnksIExQQ1NUUiBDaGFyc2V0LCBMUENTVFIgRGlhbGVjdCkKewogICAgTEFOR19GSU5EX0RBVEEgbF9kYXRhOwogICAgY2hhciBsYW5nX3N0cmluZ1syNTZdOwoKICAgIGlmKCFMYW5nKQogICAgewoJbF9kYXRhLmZvdW5kX2xhbmdfaWRbMF0gPSBNQUtFTEFOR0lEKExBTkdfRU5HTElTSCwgU1VCTEFOR19ERUZBVUxUKTsKCWdvdG8gRU5EOwogICAgfQoKICAgIG1lbXNldCgmbF9kYXRhLCAwLCBzaXplb2YoTEFOR19GSU5EX0RBVEEpKTsKICAgIHN0cm5jcHkobF9kYXRhLmxhbmcsIExhbmcsIHNpemVvZihsX2RhdGEubGFuZykpOwoKICAgIGlmKENvdW50cnkgJiYgc3RybGVuKENvdW50cnkpID4gMCkKCXN0cm5jcHkobF9kYXRhLmNvdW50cnksIENvdW50cnksIHNpemVvZihsX2RhdGEuY291bnRyeSkpOwoKICAgIEVudW1SZXNvdXJjZUxhbmd1YWdlc0EoR2V0TW9kdWxlSGFuZGxlQSgiS0VSTkVMMzIiKSwgUlRfU1RSSU5HQSwKCShMUENTVFIpTE9DQUxFX0lMQU5HVUFHRSwgTkxTX0ZpbmRMYW5ndWFnZUlEX1Byb2NBLCAoTE9ORykmbF9kYXRhKTsKCiAgICBzdHJjcHkobGFuZ19zdHJpbmcsIGxfZGF0YS5sYW5nKTsKICAgIGlmKGxfZGF0YS5jb3VudHJ5ICYmIHN0cmxlbihsX2RhdGEuY291bnRyeSkgPiAwKQogICAgewoJc3RyY2F0KGxhbmdfc3RyaW5nLCAiXyIpOwoJc3RyY2F0KGxhbmdfc3RyaW5nLCBsX2RhdGEuY291bnRyeSk7CiAgICB9CgogICAgaWYoIWxfZGF0YS5uX2ZvdW5kKQogICAgewoJaWYobF9kYXRhLmNvdW50cnkgJiYgc3RybGVuKGxfZGF0YS5jb3VudHJ5KSA+IDApCgl7CgkgICAgTUVTU0FHRSgiV2FybmluZzogTGFuZ3VhZ2UgJyVzJyB3YXMgbm90IGZvdW5kLCByZXRyeWluZyB3aXRob3V0IGNvdW50cnkgbmFtZS4uLlxuIiwgbGFuZ19zdHJpbmcpOwoJICAgIGxfZGF0YS5jb3VudHJ5WzBdID0gMDsKCSAgICBFbnVtUmVzb3VyY2VMYW5ndWFnZXNBKEdldE1vZHVsZUhhbmRsZUEoIktFUk5FTDMyIiksIFJUX1NUUklOR0EsCgkJKExQQ1NUUilMT0NBTEVfSUxBTkdVQUdFLCBOTFNfRmluZExhbmd1YWdlSURfUHJvY0EsIChMT05HKSZsX2RhdGEpOwoJfQogICAgfQoKICAgIC8qIFJlLWV2YWx1YXRlIGxhbmdfc3RyaW5nICovCiAgICBzdHJjcHkobGFuZ19zdHJpbmcsIGxfZGF0YS5sYW5nKTsKICAgIGlmKGxfZGF0YS5jb3VudHJ5ICYmIHN0cmxlbihsX2RhdGEuY291bnRyeSkgPiAwKQogICAgewoJc3RyY2F0KGxhbmdfc3RyaW5nLCAiXyIpOwoJc3RyY2F0KGxhbmdfc3RyaW5nLCBsX2RhdGEuY291bnRyeSk7CiAgICB9CgogICAgaWYoIWxfZGF0YS5uX2ZvdW5kKQogICAgewoJTUVTU0FHRSgiV2FybmluZzogTGFuZ3VhZ2UgJyVzJyB3YXMgbm90IHJlY29nbml6ZWQsIGRlZmF1bHRpbmcgdG8gRW5nbGlzaFxuIiwgbGFuZ19zdHJpbmcpOwoJbF9kYXRhLmZvdW5kX2xhbmdfaWRbMF0gPSBNQUtFTEFOR0lEKExBTkdfRU5HTElTSCwgU1VCTEFOR19ERUZBVUxUKTsKICAgIH0KICAgIGVsc2UKICAgIHsKCWlmKGxfZGF0YS5uX2ZvdW5kID09IDEpCgkgICAgVFJBQ0UoIkZvciBsYW5ndWFnZSAnJXMnIGxhbmdfaWQgJTA0WCB3YXMgZm91bmRcbiIsIGxhbmdfc3RyaW5nLCBsX2RhdGEuZm91bmRfbGFuZ19pZFswXSk7CgllbHNlIC8qIGxfZGF0YS0+bl9mb3VuZCA+IDEgKi8KCXsKCSAgICBpbnQgaTsKCSAgICBNRVNTQUdFKCJGb3IgbGFuZ3VhZ2UgJyVzJyBzZXZlcmFsIGxhbmd1YWdlIGlkcyB3ZXJlIGZvdW5kOlxuIiwgbGFuZ19zdHJpbmcpOwoJICAgIGZvcihpID0gMDsgaSA8IGxfZGF0YS5uX2ZvdW5kOyBpKyspCgkJTUVTU0FHRSgiJXNfJXMgLSAlMDRYOyAiLCBsX2RhdGEuZm91bmRfbGFuZ3VhZ2VbaV0sIGxfZGF0YS5mb3VuZF9jb3VudHJ5W2ldLCBsX2RhdGEuZm91bmRfbGFuZ19pZFtpXSk7CgoJICAgIE1FU1NBR0UoIlxuSW5zdGVhZCBvZiB1c2luZyBmaXJzdCBpbiB0aGUgbGlzdCwgc3VnZ2VzdCB0byBkZWZpbmVcbiIKCQkgICAgInlvdXIgTEFORyBlbnZpcm9ubWVudCB2YXJpYWJsZSBsaWtlIHRoaXM6IExBTkc9JXNfJXNcbiIsCgkJICAgIGxfZGF0YS5mb3VuZF9sYW5ndWFnZVswXSwgbF9kYXRhLmZvdW5kX2NvdW50cnlbMF0pOwoJfQogICAgfQpFTkQ6CiAgICBUUkFDRSgiUmV0dXJuaW5nICUwNFhcbiIsIGxfZGF0YS5mb3VuZF9sYW5nX2lkWzBdKTsKICAgIHJldHVybiBsX2RhdGEuZm91bmRfbGFuZ19pZFswXTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlHZXRVc2VyRGVmYXVsdExhbmdJRCAoS0VSTkVMMzIuQCkKICovCkxBTkdJRCBXSU5BUEkgR2V0VXNlckRlZmF1bHRMYW5nSUQodm9pZCkKewoJLyogY2FjaGluZyByZXN1bHQsIGlmIGRlZmluZWQgZnJvbSBlbnZpcm9ubWVudCwgd2hpY2ggc2hvdWxkICg/KSBub3QgY2hhbmdlIGR1cmluZyBhIFdJTkUgc2Vzc2lvbiAqLwoJc3RhdGljCUxBTkdJRAl1c2VyTENJRCA9IDA7CgoJaWYgKHVzZXJMQ0lEID09IDApCiAgICAgICAgewogICAgICAgICAgICAgICAgY2hhciBidWZbMjU2XTsKCQljaGFyICpsYW5nLCpjb3VudHJ5LCpjaGFyc2V0LCpkaWFsZWN0LCpuZXh0OwoKCQlpZiAoR2V0RW52aXJvbm1lbnRWYXJpYWJsZUEoICJMQU5HVUFHRSIsIGJ1Ziwgc2l6ZW9mKGJ1ZikgKSkgZ290byBvazsKCQlpZiAoR2V0RW52aXJvbm1lbnRWYXJpYWJsZUEoICJMQU5HIiwgYnVmLCBzaXplb2YoYnVmKSApKSBnb3RvIG9rOwoJCWlmIChHZXRFbnZpcm9ubWVudFZhcmlhYmxlQSggIkxDX0FMTCIsIGJ1Ziwgc2l6ZW9mKGJ1ZikgKSkgZ290byBvazsKCQlpZiAoR2V0RW52aXJvbm1lbnRWYXJpYWJsZUEoICJMQ19NRVNTQUdFUyIsIGJ1Ziwgc2l6ZW9mKGJ1ZikgKSkgZ290byBvazsKCQlpZiAoR2V0RW52aXJvbm1lbnRWYXJpYWJsZUEoICJMQ19DVFlQRSIsIGJ1Ziwgc2l6ZW9mKGJ1ZikgKSkgZ290byBvazsKCgkJcmV0dXJuIHVzZXJMQ0lEID0gTUFLRUxBTkdJRCggTEFOR19FTkdMSVNILCBTVUJMQU5HX0RFRkFVTFQgKTsKCiAgICAgICAgb2s6CgkJaWYgKCFzdHJjbXAoYnVmLCJQT1NJWCIpIHx8ICFzdHJjbXAoYnVmLCJDIikpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVzZXJMQ0lEID0gTUFLRUxBTkdJRCggTEFOR19FTkdMSVNILCBTVUJMQU5HX0RFRkFVTFQgKTsKCQkKCQlsYW5nPWJ1ZjsKCQkKCQlkbyB7CgkJCW5leHQ9c3RyY2hyKGxhbmcsJzonKTsgaWYgKG5leHQpICpuZXh0Kys9J1wwJzsKCQkJZGlhbGVjdD1zdHJjaHIobGFuZywnQCcpOyBpZiAoZGlhbGVjdCkgKmRpYWxlY3QrKz0nXDAnOwoJCQljaGFyc2V0PXN0cmNocihsYW5nLCcuJyk7IGlmIChjaGFyc2V0KSAqY2hhcnNldCsrPSdcMCc7CgkJCWNvdW50cnk9c3RyY2hyKGxhbmcsJ18nKTsgaWYgKGNvdW50cnkpICpjb3VudHJ5Kys9J1wwJzsKCQkJCgkJCXVzZXJMQ0lEID0gTkxTX0dldExhbmd1YWdlSUQobGFuZywgY291bnRyeSwgY2hhcnNldCwgZGlhbGVjdCk7CgkJCQoJCQlsYW5nPW5leHQ7CgkJfSB3aGlsZSAobGFuZyAmJiAhdXNlckxDSUQpOwoKCQlpZiAoIXVzZXJMQ0lEKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE1FU1NBR0UoICJXYXJuaW5nOiBsYW5ndWFnZSAnJXMnIG5vdCByZWNvZ25pemVkLCBkZWZhdWx0aW5nIHRvIEVuZ2xpc2hcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmICk7CiAgICAgICAgICAgICAgICAgICAgdXNlckxDSUQgPSBNQUtFTEFOR0lEKCBMQU5HX0VOR0xJU0gsIFNVQkxBTkdfREVGQVVMVCApOwogICAgICAgICAgICAgICAgfQoJfQoJcmV0dXJuIHVzZXJMQ0lEOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUdldFN5c3RlbURlZmF1bHRMYW5nSUQgKEtFUk5FTDMyLkApCiAqLwpMQU5HSUQgV0lOQVBJIEdldFN5c3RlbURlZmF1bHRMYW5nSUQodm9pZCkKewoJcmV0dXJuIEdldFVzZXJEZWZhdWx0TGFuZ0lEKCk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUNvbnZlcnREZWZhdWx0TG9jYWxlIChLRVJORUwzMi5AKQogKi8KTENJRCBXSU5BUEkgQ29udmVydERlZmF1bHRMb2NhbGUgKExDSUQgbGNpZCkKewlzd2l0Y2ggKGxjaWQpCgl7ICBjYXNlIExPQ0FMRV9TWVNURU1fREVGQVVMVDoKCSAgICAgcmV0dXJuIEdldFN5c3RlbURlZmF1bHRMQ0lEKCk7CgkgICBjYXNlIExPQ0FMRV9VU0VSX0RFRkFVTFQ6CgkgICAgIHJldHVybiBHZXRVc2VyRGVmYXVsdExDSUQoKTsKCSAgIGNhc2UgTE9DQUxFX05FVVRSQUw6CgkgICAgIHJldHVybiBNQUtFTENJRCAoTEFOR19ORVVUUkFMLCBTVUJMQU5HX05FVVRSQUwpOwoJfSAgCglyZXR1cm4gTUFLRUxBTkdJRCggUFJJTUFSWUxBTkdJRChsY2lkKSwgU1VCTEFOR19ORVVUUkFMKTsKfQoKLyogRW5oYW5jZWQgdmVyc2lvbiBvZiBMb2FkU3RyaW5nVy4KICogSXQgdGFrZXMgTGFuZ3VhZ2VJZCB0byBmaW5kIGFuZCBsb2FkIGxhbmd1YWdlIGRlcGVuZGFudCByZXNvdXJjZXMuCiAqIFJlc291cmNlIGlzIGNvcGllZCBhcyBpczogImJpbmFyeSIgc3RyaW5ncyBhcmUgbm90IHRydW5jYXRlZC4KICogUmV0dXJuOiBsZW5ndGggb2YgcmVzb3VyY2UgKyAxIHRvIGRpc3Rpbmd1aXNoIGFic2VudCByZXNvdXJjZXMKICogZnJvbSB0aGUgcmVzb3VyY2VzIHdpdGggemVybyBsZW5ndGguCiAqLwpzdGF0aWMgSU5UIE5MU19Mb2FkU3RyaW5nRXhXKEhNT0RVTEUgaE1vZHVsZSwgTEFOR0lEIGxhbmdfaWQsIFVJTlQgcmVzX2lkLCBMUFdTVFIgYnVmZmVyLCBJTlQgYnVmbGVuKQp7CiAgICBIUlNSQyBocnNyYzsKICAgIEhHTE9CQUwgaG1lbTsKICAgIFdDSEFSICpwOwogICAgaW50IHN0cmluZ19udW07CiAgICBpbnQgaTsKCiAgICAvKiBSZXBsYWNlIFNVQkxBTkdfTkVVVFJBTCBieSBTVUJMQU5HX0RFRkFVTFQgKi8KICAgIGlmKFNVQkxBTkdJRChsYW5nX2lkKSA9PSBTVUJMQU5HX05FVVRSQUwpCiAgICAgICAgbGFuZ19pZCA9IE1BS0VMQU5HSUQoUFJJTUFSWUxBTkdJRChsYW5nX2lkKSwgU1VCTEFOR19ERUZBVUxUKTsKCiAgICBocnNyYyA9IEZpbmRSZXNvdXJjZUV4VyhoTW9kdWxlLCBSVF9TVFJJTkdXLCAoTFBDV1NUUikoKHJlc19pZCA+PiA0KSArIDEpLCBsYW5nX2lkKTsKCiAgICBpZighaHJzcmMpIHJldHVybiAwOwogICAgaG1lbSA9IExvYWRSZXNvdXJjZShoTW9kdWxlLCBocnNyYyk7CiAgICBpZighaG1lbSkgcmV0dXJuIDA7CiAgICAKICAgIHAgPSBMb2NrUmVzb3VyY2UoaG1lbSk7CiAgICBzdHJpbmdfbnVtID0gcmVzX2lkICYgMHgwMDBmOwogICAgZm9yKGkgPSAwOyBpIDwgc3RyaW5nX251bTsgaSsrKQoJcCArPSAqcCArIDE7CiAgICAKICAgIFRSQUNFKCJzdHJsZW4gPSAlZFxuIiwgKGludCkqcCApOwogICAgCiAgICBpZiAoYnVmZmVyID09IE5VTEwpIHJldHVybiAqcDsKICAgIGkgPSBtaW4oYnVmbGVuIC0gMSwgKnApOwogICAgaWYgKGkgPiAwKSB7CgltZW1jcHkoYnVmZmVyLCBwICsgMSwgaSAqIHNpemVvZiAoV0NIQVIpKTsKCWJ1ZmZlcltpXSA9IChXQ0hBUikgMDsKICAgIH0gZWxzZSB7CglpZiAoYnVmbGVuID4gMSkKCSAgICBidWZmZXJbMF0gPSAoV0NIQVIpIDA7CiAgICB9CgogICAgRnJlZVJlc291cmNlKGhtZW0pOwogICAgVFJBQ0UoIiVzIGxvYWRlZCFcbiIsIGRlYnVnc3RyX3coYnVmZmVyKSk7CiAgICByZXR1cm4gKGkgKyAxKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJR2V0TG9jYWxlSW5mb0EgKEtFUk5FTDMyLkApCiAqCiAqIE5PVEVTIAogKiAgTEFOR19ORVVUUkFMIGlzIGVxdWFsIHRvIExPQ0FMRV9TWVNURU1fREVGQVVMVAogKgogKiAgTVMgb25saW5lIGRvY3VtZW50YXRpb24gc3RhdGVzIHRoYXQgdGhlIHN0cmluZyByZXR1cm5lZCBpcyBOVUxMIHRlcm1pbmF0ZWQKICogIGV4Y2VwdCBmb3IgTE9DQUxFX0ZPTlRTSUdOQVRVUkUgIHdoaWNoICJ3aWxsIHJldHVybiBhIG5vbi1OVUxMCiAqICB0ZXJtaW5hdGVkIHN0cmluZyIuCiAqLwpJTlQgV0lOQVBJIEdldExvY2FsZUluZm9BKExDSUQgbGNpZCxMQ1RZUEUgTENUeXBlLExQU1RSIGJ1ZixJTlQgbGVuKQp7CiAgICBMUENTVFIgIHJldFN0cmluZyA9IE5VTEw7CiAgICBpbnQJZm91bmQgPSAwLCBpOwogICAgY2hhciAgICAqcGFjS2V5OwogICAgY2hhciAgICBhY0J1ZmZlclsxMjhdOwogICAgRFdPUkQgICBkd0J1ZmZlclNpemU9MTI4OwogICAgQk9PTCBOb1VzZXJPdmVycmlkZTsKCiAgVFJBQ0UoIihsY2lkPTB4JWx4LGxjdHlwZT0weCVseCwlcCwleClcbiIsbGNpZCxMQ1R5cGUsYnVmLGxlbik7CgogIGlmIChsZW4gJiYgKCEgYnVmKSApIHsKICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlNVRkZJQ0lFTlRfQlVGRkVSKTsKCQlyZXR1cm4gMDsKCX0KCglpZiAobGNpZCA9PSBMT0NBTEVfTkVVVFJBTCB8fCBsY2lkID09IExBTkdfU1lTVEVNX0RFRkFVTFQpCgl7CiAgICAgICAgICAgIGxjaWQgPSBHZXRTeXN0ZW1EZWZhdWx0TENJRCgpOwoJfSAKCWVsc2UgaWYgKGxjaWQgPT0gTEFOR19VU0VSX0RFRkFVTFQpIC8qMHg4MDAqLwoJewogICAgICAgICAgICBsY2lkID0gR2V0VXNlckRlZmF1bHRMQ0lEKCk7Cgl9CgogICAgLyogTE9DQUxFX05PVVNFUk9WRVJSSURFIG1lYW5zOiBkbyBub3QgZ2V0IHVzZXIgcmVkZWZpbmVkIHNldHRpbmdzCiAgICAgICBmcm9tIHRoZSByZWdpc3RyeS4gSW5zdGVhZCwgdXNlIHN5c3RlbSBkZWZhdWx0IHZhbHVlcy4gKi8KICAgIE5vVXNlck92ZXJyaWRlID0gKExDVHlwZSAmIExPQ0FMRV9OT1VTRVJPVkVSUklERSkgIT0gMDsKCglMQ1R5cGUgJj0gfihMT0NBTEVfTk9VU0VST1ZFUlJJREV8TE9DQUxFX1VTRV9DUF9BQ1ApOwoKICAgIC8qIEZpcnN0LCBjaGVjayBpZiBpdCdzIGluIHRoZSByZWdpc3RyeS4gKi8KICAgIC8qIEFsbCB1c2VyIGN1c3RvbWl6ZWQgdmFsdWVzIGFyZSBzdG9yZWQgaW4gdGhlIHJlZ2lzdHJ5IGJ5IFNldExvY2FsZUluZm8gKi8KICAgIGlmICggIU5vVXNlck92ZXJyaWRlICYmIChwYWNLZXkgPSBHZXRMb2NhbGVTdWJrZXlOYW1lKExDVHlwZSkpICkKICAgIHsKICAgICAgICBjaGFyICAgIGFjUmVhbEtleVsxMjhdOwogICAgICAgIEhLRVkgICAgaEtleTsKCiAgICAgICAgc3ByaW50ZiggYWNSZWFsS2V5LCAiQ29udHJvbCBQYW5lbFxcSW50ZXJuYXRpb25hbFxcJXMiLCBwYWNLZXkgKTsKCiAgICAgICAgaWYgKCBSZWdPcGVuS2V5RXhBKCBIS0VZX0NVUlJFTlRfVVNFUiwgYWNSZWFsS2V5LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIEtFWV9SRUFELCAmaEtleSkgPT0gRVJST1JfU1VDQ0VTUyApCiAgICAgICAgewogICAgICAgICAgICBpZiAoIFJlZ1F1ZXJ5VmFsdWVFeEEoIGhLZXksIE5VTEwsIE5VTEwsIE5VTEwsIChMUEJZVEUpYWNCdWZmZXIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkd0J1ZmZlclNpemUgKSA9PSBFUlJPUl9TVUNDRVNTICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0U3RyaW5nID0gYWNCdWZmZXI7CiAgICAgICAgICAgICAgICBmb3VuZCA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgUmVnQ2xvc2VLZXkoaEtleSk7CiAgICAgICAgfQogICAgfQoKICAgIC8qIElmIG5vdCBpbiB0aGUgcmVnaXN0cnksIGdldCBpdCBmcm9tIHRoZSBOTFMgZW50cmllcy4gKi8KICAgIGlmKCFmb3VuZCkgewoJV0NIQVIgd2NCdWZmZXJbMTI4XTsKCWludCByZXNfc2l6ZTsKCgkvKiBjaGVjayBpZiBsYW5ndWFnZSBpcyByZWdpc3RlcmVkIGluIHRoZSBrZXJuZWwzMiByZXNvdXJjZXMgKi8KCWlmKChyZXNfc2l6ZSA9IE5MU19Mb2FkU3RyaW5nRXhXKEdldE1vZHVsZUhhbmRsZUEoIktFUk5FTDMyIiksIExBTkdJREZST01MQ0lEKGxjaWQpLAoJCUxDVHlwZSwgd2NCdWZmZXIsIHNpemVvZih3Y0J1ZmZlcikvc2l6ZW9mKHdjQnVmZmVyWzBdKSkpKSB7CgkgICAgV2lkZUNoYXJUb011bHRpQnl0ZShDUF9BQ1AsIDAsIHdjQnVmZmVyLCByZXNfc2l6ZSwgYWNCdWZmZXIsIGR3QnVmZmVyU2l6ZSwgTlVMTCwgTlVMTCk7CgkgICAgcmV0U3RyaW5nID0gYWNCdWZmZXI7CgkgICAgZm91bmQgPSAxOwoJfQogICAgfQoKICAgIC8qIGlmIG5vdCBmb3VuZCByZXBvcnQgYSBtb3N0IGRlc2NyaXB0aXZlIGVycm9yICovCiAgICBpZighZm91bmQpIHsKCXJldFN0cmluZz0wOwoJLyogSWYgd2UgYXJlIHRocm91Z2ggYWxsIG9mIHRoaXMsIHJldExlbiBzaG91bGQgbm90IGJlIHplcm8gYW55bW9yZS4KCSAgIElmIGl0IGlzLCB0aGUgdmFsdWUgaXMgbm90IHN1cHBvcnRlZCAqLwoJaT0wOwoJd2hpbGUgKGxvY2FsZV9uYW1lMmlkW2ldLm5hbWUhPU5VTEwpIHsKCSAgICBpZiAoTENUeXBlID09IGxvY2FsZV9uYW1lMmlkW2ldLmlkKSB7CgkJcmV0U3RyaW5nID0gbG9jYWxlX25hbWUyaWRbaV0ubmFtZTsKCQlicmVhazsKCSAgICB9CgkgICAgaSsrOwoJfQoJaWYoIXJldFN0cmluZykKCSAgICBGSVhNRSgiVW5rb3duIExDIHR5cGUgJWxYXG4iLCBMQ1R5cGUpOwoJZWxzZQoJICAgIEZJWE1FKCInJXMnIGlzIG5vdCBkZWZpbmVkIGZvciB5b3VyIGxhbmd1YWdlICglMDRYKS5cbiIKCQkiUGxlYXNlIGRlZmluZSBpdCBpbiBkbGxzL2tlcm5lbC9ubHMvWW91ckxhbmd1YWdlLm5sc1xuIgoJCSJhbmQgc3VibWl0IHBhdGNoIGZvciBpbmNsdXNpb24gaW50byB0aGUgbmV4dCBXaW5lIHJlbGVhc2UuXG4iLAoJCQlyZXRTdHJpbmcsIExPV09SRChsY2lkKSk7CglTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwoJcmV0dXJuIDA7CQkJCiAgICB9CgogICAgLyogYSBGT05UU0lHTkFUVVJFIGlzIG5vdCBhIHN0cmluZywganVzdCA2IERXT1JEcyAgKi8KICAgIGlmIChMQ1R5cGUgPT0gTE9DQUxFX0ZPTlRTSUdOQVRVUkUpIHsKICAgICAgICBpZiAobGVuKSB7CgkgICAgbGVuID0gKGxlbiA8IHNpemVvZihGT05UU0lHTkFUVVJFKSkgPyBsZW4gOiBzaXplb2YoRk9OVFNJR05BVFVSRSk7CiAgICAgICAgICAgIG1lbWNweShidWYsIHJldFN0cmluZywgbGVuKTsKCSAgICByZXR1cm4gbGVuOwoJfQogICAgICAgIHJldHVybiBzaXplb2YoRk9OVFNJR05BVFVSRSk7CiAgICB9CiAgICAvKiBpZiBsZW49MCByZXR1cm4gb25seSB0aGUgbGVuZ3RoLCBkb24ndCB0b3VjaCB0aGUgYnVmZmVyKi8KICAgIGlmIChsZW4pIHsKCWxzdHJjcHluQShidWYscmV0U3RyaW5nLGxlbik7CglyZXR1cm4gc3RybGVuKGJ1ZikgKyAxOwogICAgfQogICAgcmV0dXJuIHN0cmxlbihyZXRTdHJpbmcpKzE7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUdldExvY2FsZUluZm9XIChLRVJORUwzMi5AKQogKgogKiBOT1RFUwogKiAgTVMgZG9jdW1lbnRhdGlvbiBzdGF0ZXMgdGhhdCBsZW4gInNwZWNpZmllcyB0aGUgc2l6ZSwgaW4gYnl0ZXMgKEFOU0kgdmVyc2lvbikKICogIG9yIGNoYXJhY3RlcnMgKFVuaWNvZGUgdmVyc2lvbiksIG9mIiB3YnVmLiBUaHVzIHRoZSBudW1iZXIgcmV0dXJuZWQgaXMKICogIHRoZSBzYW1lIGJldHdlZW4gR2V0TG9jYWxlSW5mb1cgYW5kIEdldExvY2FsZUluZm9BLgogKi8KSU5UIFdJTkFQSSBHZXRMb2NhbGVJbmZvVyhMQ0lEIGxjaWQsTENUWVBFIExDVHlwZSxMUFdTVFIgd2J1ZixJTlQgbGVuKQp7CVdPUkQgd2xlbjsKCUxQU1RSIGFidWY7CgkKCWlmIChsZW4gJiYgKCEgd2J1ZikgKQoJeyBTZXRMYXN0RXJyb3IoRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUik7CgkgIHJldHVybiAwOwoJfQoKCWFidWYgPSAoTFBTVFIpSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksMCxsZW4pOwoJd2xlbiA9IEdldExvY2FsZUluZm9BKGxjaWQsIExDVHlwZSwgYWJ1ZiwgbGVuKTsKCglpZiAod2xlbiAmJiBsZW4pCS8qIGlmIGxlbj0wIHJldHVybiBvbmx5IHRoZSBsZW5ndGgqLwogICAgICAgICAgICBNdWx0aUJ5dGVUb1dpZGVDaGFyKCBDUF9BQ1AsIDAsIGFidWYsIC0xLCB3YnVmLCBsZW4gKTsKCglIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLDAsYWJ1Zik7CglyZXR1cm4gd2xlbjsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKgkJR2V0TG9jYWxlU3Via2V5TmFtZSBbaGVscGVyIGZ1bmN0aW9uXQogKgogKiAgICAgICAgICAtIEZvciB1c2Ugd2l0aCB0aGUgcmVnaXN0cnkuCiAqICAgICAgICAgIC0gR2V0cyB0aGUgcmVnaXN0cnkgc3Via2V5IG5hbWUgZm9yIGEgZ2l2ZW4gbGN0eXBlLgogKi8Kc3RhdGljIGNoYXIgKkdldExvY2FsZVN1YmtleU5hbWUoIERXT1JEIGxjdHlwZSApCnsKICAgIGNoYXIgICAgKnBhY0tleT1OVUxMOwoKICAgIHN3aXRjaCAoIGxjdHlwZSApCiAgICB7CiAgICAvKiBUaGVzZSB2YWx1ZXMgYXJlIHVzZWQgYnkgU2V0TG9jYWxlSW5mbyBhbmQgR2V0TG9jYWxlSW5mbywgYW5kCiAgICAgKiB0aGUgdmFsdWVzIGFyZSBzdG9yZWQgaW4gdGhlIHJlZ2lzdHJ5LCBjb25maXJtZWQgdW5kZXIgV2luZG93cywKICAgICAqIGZvciB0aGUgb25lcyB0aGF0IGFjdHVhbGx5IGFzc2lnbiBwYWNLZXkuIENhc2VzIHRoYXQgYXJlbid0IGZpbmlzaGVkCiAgICAgKiBoYXZlIG5vdCBiZWVuIGNvbmZpcm1lZCwgc28gdGhhdCBtdXN0IGJlIGRvbmUgYmVmb3JlIHRoZXkgY2FuIGJlCiAgICAgKiBhZGRlZC4KICAgICAqLwogICAgY2FzZSBMT0NBTEVfU0RBVEUgOiAgICAgICAgLyogVGhlIGRhdGUgc2VwYXJhdG9yLiAqLwogICAgICAgIHBhY0tleSA9ICJzRGF0ZSI7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIExPQ0FMRV9JQ1VSUkRJR0lUUzoKICAgICAgICBwYWNLZXkgPSAiaUN1cnJEaWdpdHMiOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBMT0NBTEVfU0RFQ0lNQUwgOgogICAgICAgIHBhY0tleSA9ICJzRGVjaW1hbCI7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIExPQ0FMRV9JQ1VSUkVOQ1k6CiAgICAgICAgcGFjS2V5ID0gImlDdXJyZW5jeSI7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIExPQ0FMRV9TR1JPVVBJTkcgOgogICAgICAgIHBhY0tleSA9ICJzR3JvdXBpbmciOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBMT0NBTEVfSURJR0lUUzoKICAgICAgICBwYWNLZXkgPSAiaURpZ2l0cyI7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIExPQ0FMRV9TTElTVCA6CiAgICAgICAgcGFjS2V5ID0gInNMaXN0IjsKICAgICAgICBicmVhazsKICAgIC8qIGNhc2UgTE9DQUxFX0lDQUxFTkRBUlRZUEU6ICovCiAgICAvKiBjYXNlIExPQ0FMRV9JRklSU1REQVlPRldFRUs6ICovCiAgICAvKiBjYXNlIExPQ0FMRV9JRklSU1RXRUVLT0ZZRUFSOiAqLwogICAgLyogY2FzZSBMT0NBTEVfU1lFQVJNT05USCA6ICovCiAgICAvKiBjYXNlIExPQ0FMRV9TUE9TSVRJVkVTSUdOIDogKi8KICAgIC8qIGNhc2UgTE9DQUxFX0lQQVBFUlNJWkU6ICovCiAgICAvKiAgICAgYnJlYWs7ICovCiAgICBjYXNlIExPQ0FMRV9TTE9OR0RBVEUgOgogICAgICAgIHBhY0tleSA9ICJzTG9uZ0RhdGUiOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBMT0NBTEVfU01PTkRFQ0lNQUxTRVAgOgogICAgICAgIHBhY0tleSA9ICJzTW9uRGVjaW1hbFNlcCI7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIExPQ0FMRV9TTU9OR1JPVVBJTkc6CiAgICAgICAgcGFjS2V5ID0gInNNb25Hcm91cGluZyI7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIExPQ0FMRV9JTUVBU1VSRToKICAgICAgICBwYWNLZXkgPSAiaU1lYXN1cmUiOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBMT0NBTEVfU01PTlRIT1VTQU5EU0VQIDoKICAgICAgICBwYWNLZXkgPSAic01vblRob3VzYW5kU2VwIjsKICAgICAgICBicmVhazsKICAgIGNhc2UgTE9DQUxFX0lORUdDVVJSOgogICAgICAgIHBhY0tleSA9ICJpTmVnQ3VyciI7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIExPQ0FMRV9TTkVHQVRJVkVTSUdOIDoKICAgICAgICBwYWNLZXkgPSAic05lZ2F0aXZlU2lnbiI7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIExPQ0FMRV9JTkVHTlVNQkVSOgogICAgICAgIHBhY0tleSA9ICJpTmVnTnVtYmVyIjsKICAgICAgICBicmVhazsKICAgIGNhc2UgTE9DQUxFX1NTSE9SVERBVEUgOgogICAgICAgIHBhY0tleSA9ICJzU2hvcnREYXRlIjsKICAgICAgICBicmVhazsKICAgIGNhc2UgTE9DQUxFX0lMREFURTogICAgICAgIC8qIExvbmcgRGF0ZSBmb3JtYXQgb3JkZXJpbmcgc3BlY2lmaWVyLiAqLwogICAgICAgIHBhY0tleSA9ICJpTERhdGUiOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBMT0NBTEVfSUxaRVJPOgogICAgICAgIHBhY0tleSA9ICJpTFplcm8iOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBMT0NBTEVfSVRMWkVSTzoKICAgICAgICBwYWNLZXkgPSAiaVRMWmVybyI7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIExPQ0FMRV9JVElNRTogICAgICAgIC8qIFRpbWUgZm9ybWF0IHNwZWNpZmllci4gKi8KICAgICAgICBwYWNLZXkgPSAiaVRpbWUiOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBMT0NBTEVfU1RIT1VTQU5EIDoKICAgICAgICBwYWNLZXkgPSAic1Rob3VzYW5kIjsKICAgICAgICBicmVhazsKICAgIGNhc2UgTE9DQUxFX1MxMTU5OiAgICAgICAgLyogQU0gKi8KICAgICAgICBwYWNLZXkgPSAiczExNTkiOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBMT0NBTEVfU1RJTUU6CiAgICAgICAgcGFjS2V5ID0gInNUaW1lIjsKICAgICAgICBicmVhazsKICAgIGNhc2UgTE9DQUxFX1MyMzU5OiAgICAgICAgLyogUE0gKi8KICAgICAgICBwYWNLZXkgPSAiczIzNTkiOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBMT0NBTEVfU1RJTUVGT1JNQVQgOgogICAgICAgIHBhY0tleSA9ICJzVGltZUZvcm1hdCI7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIExPQ0FMRV9TQ1VSUkVOQ1k6CiAgICAgICAgcGFjS2V5ID0gInNDdXJyZW5jeSI7CiAgICAgICAgYnJlYWs7CgogICAgLyogVGhlIGZvbGxvd2luZyBhcmUgbm90IGxpc3RlZCB1bmRlciBNU0ROIGFzIHN1cHBvcnRlZCwgCiAgICAgKiBidXQgc2VlbSB0byBiZSB1c2VkIGFuZCBhbHNvIHN0b3JlZCBpbiB0aGUgcmVnaXN0cnkuCiAgICAgKi8KCiAgICBjYXNlIExPQ0FMRV9JREFURToKICAgICAgICBwYWNLZXkgPSAiaURhdGUiOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBMT0NBTEVfU0NPVU5UUlk6CiAgICAgICAgcGFjS2V5ID0gInNDb3VudHJ5IjsKICAgICAgICBicmVhazsKICAgIGNhc2UgTE9DQUxFX0lDT1VOVFJZOgogICAgICAgIHBhY0tleSA9ICJpQ291bnRyeSI7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIExPQ0FMRV9TTEFOR1VBR0U6CiAgICAgICAgcGFjS2V5ID0gInNMYW5ndWFnZSI7CiAgICAgICAgYnJlYWs7CgogICAgZGVmYXVsdDoKICAgICAgICBicmVhazsKICAgIH0KCiAgICByZXR1cm4oIHBhY0tleSApOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlTZXRMb2NhbGVJbmZvQQlbS0VSTkVMMzIuQF0KICovCkJPT0wgV0lOQVBJIFNldExvY2FsZUluZm9BKExDSUQgbGNpZCwgTENUWVBFIGxjdHlwZSwgTFBDU1RSIGRhdGEpCnsKICAgIEhLRVkgICAgaEtleTsKICAgIGNoYXIgICAgKnBhY0tleTsKICAgIGNoYXIgICAgYWNSZWFsS2V5WzEyOF07CgogICAgaWYgKCAocGFjS2V5ID0gR2V0TG9jYWxlU3Via2V5TmFtZShsY3R5cGUpKSApCiAgICB7CiAgICAgICAgc3ByaW50ZiggYWNSZWFsS2V5LCAiQ29udHJvbCBQYW5lbFxcSW50ZXJuYXRpb25hbFxcJXMiLCBwYWNLZXkgKTsKICAgICAgICBpZiAoIFJlZ0NyZWF0ZUtleUEoIEhLRVlfQ1VSUkVOVF9VU0VSLCBhY1JlYWxLZXksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhLZXkgKSA9PSBFUlJPUl9TVUNDRVNTICkKICAgICAgICB7CiAgICAgICAgICAgIGlmICggUmVnU2V0VmFsdWVFeEEoIGhLZXksIE5VTEwsIDAsIFJFR19TWiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsIHN0cmxlbihkYXRhKSsxICkgIT0gRVJST1JfU1VDQ0VTUyApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEVSUigiU2V0TG9jYWxlSW5mb0E6ICVzIGRpZCBub3Qgd29ya1xuIiwgcGFjS2V5ICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgUmVnQ2xvc2VLZXkoIGhLZXkgKTsKICAgICAgICB9CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICBGSVhNRSgiKCVsZCwlbGQsJXMpOiBzdHViXG4iLGxjaWQsbGN0eXBlLGRhdGEpOwogICAgfQogICAgcmV0dXJuIFRSVUU7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUlzVmFsaWRMb2NhbGUJW0tFUk5FTDMyLkBdCiAqLwpCT09MIFdJTkFQSSBJc1ZhbGlkTG9jYWxlKExDSUQgbGNpZCxEV09SRCBmbGFncykKewogICAgLyogY2hlY2sgaWYgbGFuZ3VhZ2UgaXMgcmVnaXN0ZXJlZCBpbiB0aGUga2VybmVsMzIgcmVzb3VyY2VzICovCiAgICBpZighRmluZFJlc291cmNlRXhXKEdldE1vZHVsZUhhbmRsZUEoIktFUk5FTDMyIiksIFJUX1NUUklOR1csIChMUENXU1RSKUxPQ0FMRV9JTEFOR1VBR0UsIExPV09SRChsY2lkKSkpCglyZXR1cm4gRkFMU0U7CiAgICBlbHNlCglyZXR1cm4gVFJVRTsKfQoKc3RhdGljIEJPT0wgQ0FMTEJBQ0sgRW51bVJlc291cmNlTGFuZ3VhZ2VzUHJvY1coSE1PRFVMRSBoTW9kdWxlLCBMUENXU1RSIHR5cGUsCgkJTFBDV1NUUiBuYW1lLCBXT1JEIExhbmdJRCwgTE9ORyBsUGFyYW0pCnsKICAgIENIQVIgYnVmQVsyMF07CiAgICBXQ0hBUiBidWZXWzIwXTsKICAgIExPQ0FMRV9FTlVNUFJPQ1cgbHBmbkxvY2FsZUVudW0gPSAoTE9DQUxFX0VOVU1QUk9DVylsUGFyYW07CiAgICBzcHJpbnRmKGJ1ZkEsICIlMDhYIiwgKFVJTlQpTGFuZ0lEKTsKICAgIE11bHRpQnl0ZVRvV2lkZUNoYXIoQ1BfQUNQLCAwLCBidWZBLCAtMSwgYnVmVywgc2l6ZW9mKGJ1ZlcpL3NpemVvZihidWZXWzBdKSk7CiAgICByZXR1cm4gbHBmbkxvY2FsZUVudW0oYnVmVyk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUVudW1TeXN0ZW1Mb2NhbGVzVwlbS0VSTkVMMzIuQF0KICovCkJPT0wgV0lOQVBJIEVudW1TeXN0ZW1Mb2NhbGVzVyggTE9DQUxFX0VOVU1QUk9DVyBscGZuTG9jYWxlRW51bSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZmxhZ3MgKQp7CiAgICBUUkFDRSgiKCVwLCUwOGx4KVxuIiwgbHBmbkxvY2FsZUVudW0sZmxhZ3MpOwoKICAgIEVudW1SZXNvdXJjZUxhbmd1YWdlc1coR2V0TW9kdWxlSGFuZGxlQSgiS0VSTkVMMzIiKSwgUlRfU1RSSU5HVywKCSAgICAoTFBDV1NUUilMT0NBTEVfSUxBTkdVQUdFLCBFbnVtUmVzb3VyY2VMYW5ndWFnZXNQcm9jVywKCSAgICAoTE9ORylscGZuTG9jYWxlRW51bSk7CgogICAgcmV0dXJuIFRSVUU7Cn0KCnN0YXRpYyBCT09MIENBTExCQUNLIEVudW1SZXNvdXJjZUxhbmd1YWdlc1Byb2NBKEhNT0RVTEUgaE1vZHVsZSwgTFBDU1RSIHR5cGUsCgkJTFBDU1RSIG5hbWUsIFdPUkQgTGFuZ0lELCBMT05HIGxQYXJhbSkKewogICAgQ0hBUiBidWZBWzIwXTsKICAgIExPQ0FMRV9FTlVNUFJPQ0EgbHBmbkxvY2FsZUVudW0gPSAoTE9DQUxFX0VOVU1QUk9DQSlsUGFyYW07CiAgICBzcHJpbnRmKGJ1ZkEsICIlMDhYIiwgKFVJTlQpTGFuZ0lEKTsKICAgIHJldHVybiBscGZuTG9jYWxlRW51bShidWZBKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJRW51bVN5c3RlbUxvY2FsZXNBCVtLRVJORUwzMi5AXQogKi8KQk9PTCBXSU5BUEkgRW51bVN5c3RlbUxvY2FsZXNBKExPQ0FMRV9FTlVNUFJPQ0EgbHBmbkxvY2FsZUVudW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZmxhZ3MpCnsKICAgIFRSQUNFKCIoJXAsJTA4bHgpXG4iLCBscGZuTG9jYWxlRW51bSxmbGFncyk7CgogICAgRW51bVJlc291cmNlTGFuZ3VhZ2VzQShHZXRNb2R1bGVIYW5kbGVBKCJLRVJORUwzMiIpLCBSVF9TVFJJTkdBLAoJICAgIChMUENTVFIpTE9DQUxFX0lMQU5HVUFHRSwgRW51bVJlc291cmNlTGFuZ3VhZ2VzUHJvY0EsCgkgICAgKExPTkcpbHBmbkxvY2FsZUVudW0pOwoKICAgIHJldHVybiBUUlVFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIFZlckxhbmd1YWdlTmFtZUEgICAgICAgICAgICAgIFtLRVJORUwzMi5AXQogKi8KRFdPUkQgV0lOQVBJIFZlckxhbmd1YWdlTmFtZUEoIFVJTlQgd0xhbmcsIExQU1RSIHN6TGFuZywgVUlOVCBuU2l6ZSApCnsKICAgIGlmKCFzekxhbmcpCglyZXR1cm4gMDsKCiAgICByZXR1cm4gR2V0TG9jYWxlSW5mb0EoTUFLRUxDSUQod0xhbmcsIFNPUlRfREVGQVVMVCksIExPQ0FMRV9TRU5HTEFOR1VBR0UsIHN6TGFuZywgblNpemUpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIFZlckxhbmd1YWdlTmFtZVcgICAgICAgICAgICAgIFtLRVJORUwzMi5AXQogKi8KRFdPUkQgV0lOQVBJIFZlckxhbmd1YWdlTmFtZVcoIFVJTlQgd0xhbmcsIExQV1NUUiBzekxhbmcsIFVJTlQgblNpemUgKQp7CiAgICBpZighc3pMYW5nKQoJcmV0dXJuIDA7CgogICAgcmV0dXJuIEdldExvY2FsZUluZm9XKE1BS0VMQ0lEKHdMYW5nLCBTT1JUX0RFRkFVTFQpLCBMT0NBTEVfU0VOR0xBTkdVQUdFLCBzekxhbmcsIG5TaXplKTsKfQoKIApzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBMQ01fVW5pY29kZV9MVVRbXSA9IHsKICA2ICAgICAgLCAgIDMsIC8qICAgLSAgIDEgKi8gIAogIDYgICAgICAsICAgNCwgLyogICAtICAgMiAqLyAgCiAgNiAgICAgICwgICA1LCAvKiAgIC0gICAzICovICAKICA2ICAgICAgLCAgIDYsIC8qICAgLSAgIDQgKi8gIAogIDYgICAgICAsICAgNywgLyogICAtICAgNSAqLyAgCiAgNiAgICAgICwgICA4LCAvKiAgIC0gICA2ICovICAKICA2ICAgICAgLCAgIDksIC8qICAgLSAgIDcgKi8gIAogIDYgICAgICAsICAxMCwgLyogICAtICAgOCAqLyAgCiAgNyAgICAgICwgICA1LCAvKiAgIC0gICA5ICovICAKICA3ICAgICAgLCAgIDYsIC8qICAgLSAgMTAgKi8gIAogIDcgICAgICAsICAgNywgLyogICAtICAxMSAqLyAgCiAgNyAgICAgICwgICA4LCAvKiAgIC0gIDEyICovICAKICA3ICAgICAgLCAgIDksIC8qICAgLSAgMTMgKi8gIAogIDYgICAgICAsICAxMSwgLyogICAtICAxNCAqLyAgCiAgNiAgICAgICwgIDEyLCAvKiAgIC0gIDE1ICovICAKICA2ICAgICAgLCAgMTMsIC8qICAgLSAgMTYgKi8gIAogIDYgICAgICAsICAxNCwgLyogICAtICAxNyAqLyAgCiAgNiAgICAgICwgIDE1LCAvKiAgIC0gIDE4ICovICAKICA2ICAgICAgLCAgMTYsIC8qICAgLSAgMTkgKi8gIAogIDYgICAgICAsICAxNywgLyogICAtICAyMCAqLyAgCiAgNiAgICAgICwgIDE4LCAvKiAgIC0gIDIxICovICAKICA2ICAgICAgLCAgMTksIC8qICAgLSAgMjIgKi8gIAogIDYgICAgICAsICAyMCwgLyogICAtICAyMyAqLyAgCiAgNiAgICAgICwgIDIxLCAvKiAgIC0gIDI0ICovICAKICA2ICAgICAgLCAgMjIsIC8qICAgLSAgMjUgKi8gIAogIDYgICAgICAsICAyMywgLyogICAtICAyNiAqLyAgCiAgNiAgICAgICwgIDI0LCAvKiAgIC0gIDI3ICovICAKICA2ICAgICAgLCAgMjUsIC8qICAgLSAgMjggKi8gIAogIDYgICAgICAsICAyNiwgLyogICAtICAyOSAqLyAgCiAgNiAgICAgICwgIDI3LCAvKiAgIC0gIDMwICovICAKICA2ICAgICAgLCAgMjgsIC8qICAgLSAgMzEgKi8gIAogIDcgICAgICAsICAgMiwgLyogICAtICAzMiAqLwogIDcgICAgICAsICAyOCwgLyogISAtICAzMyAqLwogIDcgICAgICAsICAyOSwgLyogIiAtICAzNCAqLyAvKiAiICovCiAgNyAgICAgICwgIDMxLCAvKiAjIC0gIDM1ICovCiAgNyAgICAgICwgIDMzLCAvKiAkIC0gIDM2ICovCiAgNyAgICAgICwgIDM1LCAvKiAlIC0gIDM3ICovCiAgNyAgICAgICwgIDM3LCAvKiAmIC0gIDM4ICovCiAgNiAgICAgICwgMTI4LCAvKiAnIC0gIDM5ICovCiAgNyAgICAgICwgIDM5LCAvKiAoIC0gIDQwICovCiAgNyAgICAgICwgIDQyLCAvKiApIC0gIDQxICovCiAgNyAgICAgICwgIDQ1LCAvKiAqIC0gIDQyICovCiAgOCAgICAgICwgICAzLCAvKiArIC0gIDQzICovCiAgNyAgICAgICwgIDQ3LCAvKiAsIC0gIDQ0ICovCiAgNiAgICAgICwgMTMwLCAvKiAtIC0gIDQ1ICovCiAgNyAgICAgICwgIDUxLCAvKiAuIC0gIDQ2ICovCiAgNyAgICAgICwgIDUzLCAvKiAvIC0gIDQ3ICovCiAxMiAgICAgICwgICAzLCAvKiAwIC0gIDQ4ICovCiAxMiAgICAgICwgIDMzLCAvKiAxIC0gIDQ5ICovCiAxMiAgICAgICwgIDUxLCAvKiAyIC0gIDUwICovCiAxMiAgICAgICwgIDcwLCAvKiAzIC0gIDUxICovCiAxMiAgICAgICwgIDg4LCAvKiA0IC0gIDUyICovCiAxMiAgICAgICwgMTA2LCAvKiA1IC0gIDUzICovCiAxMiAgICAgICwgMTI1LCAvKiA2IC0gIDU0ICovCiAxMiAgICAgICwgMTQ0LCAvKiA3IC0gIDU1ICovCiAxMiAgICAgICwgMTYyLCAvKiA4IC0gIDU2ICovCiAxMiAgICAgICwgMTgwLCAvKiA5IC0gIDU3ICovCiAgNyAgICAgICwgIDU1LCAvKiA6IC0gIDU4ICovCiAgNyAgICAgICwgIDU4LCAvKiA7IC0gIDU5ICovCiAgOCAgICAgICwgIDE0LCAvKiA8IC0gIDYwICovCiAgOCAgICAgICwgIDE4LCAvKiA9IC0gIDYxICovCiAgOCAgICAgICwgIDIwLCAvKiA+IC0gIDYyICovCiAgNyAgICAgICwgIDYwLCAvKiA/IC0gIDYzICovCiAgNyAgICAgICwgIDYyLCAvKiBAIC0gIDY0ICovCiAxNCAgICAgICwgICAyLCAvKiBBIC0gIDY1ICovCiAxNCAgICAgICwgICA5LCAvKiBCIC0gIDY2ICovCiAxNCAgICAgICwgIDEwLCAvKiBDIC0gIDY3ICovCiAxNCAgICAgICwgIDI2LCAvKiBEIC0gIDY4ICovCiAxNCAgICAgICwgIDMzLCAvKiBFIC0gIDY5ICovCiAxNCAgICAgICwgIDM1LCAvKiBGIC0gIDcwICovCiAxNCAgICAgICwgIDM3LCAvKiBHIC0gIDcxICovCiAxNCAgICAgICwgIDQ0LCAvKiBIIC0gIDcyICovCiAxNCAgICAgICwgIDUwLCAvKiBJIC0gIDczICovCiAxNCAgICAgICwgIDUzLCAvKiBKIC0gIDc0ICovCiAxNCAgICAgICwgIDU0LCAvKiBLIC0gIDc1ICovCiAxNCAgICAgICwgIDcyLCAvKiBMIC0gIDc2ICovCiAxNCAgICAgICwgIDgxLCAvKiBNIC0gIDc3ICovCiAxNCAgICAgICwgMTEyLCAvKiBOIC0gIDc4ICovCiAxNCAgICAgICwgMTI0LCAvKiBPIC0gIDc5ICovCiAxNCAgICAgICwgMTI2LCAvKiBQIC0gIDgwICovCiAxNCAgICAgICwgMTM3LCAvKiBRIC0gIDgxICovCiAxNCAgICAgICwgMTM4LCAvKiBSIC0gIDgyICovCiAxNCAgICAgICwgMTQ1LCAvKiBTIC0gIDgzICovCiAxNCAgICAgICwgMTUzLCAvKiBUIC0gIDg0ICovCiAxNCAgICAgICwgMTU5LCAvKiBVIC0gIDg1ICovCiAxNCAgICAgICwgMTYyLCAvKiBWIC0gIDg2ICovCiAxNCAgICAgICwgMTY0LCAvKiBXIC0gIDg3ICovCiAxNCAgICAgICwgMTY2LCAvKiBYIC0gIDg4ICovCiAxNCAgICAgICwgMTY3LCAvKiBZIC0gIDg5ICovCiAxNCAgICAgICwgMTY5LCAvKiBaIC0gIDkwICovCiAgNyAgICAgICwgIDYzLCAvKiBbIC0gIDkxICovCiAgNyAgICAgICwgIDY1LCAvKiBcIC0gIDkyICovCiAgNyAgICAgICwgIDY2LCAvKiBdIC0gIDkzICovCiAgNyAgICAgICwgIDY3LCAvKiBeIC0gIDk0ICovCiAgNyAgICAgICwgIDY4LCAvKiBfIC0gIDk1ICovCiAgNyAgICAgICwgIDcyLCAvKiBgIC0gIDk2ICovCiAxNCAgICAgICwgICAyLCAvKiBhIC0gIDk3ICovCiAxNCAgICAgICwgICA5LCAvKiBiIC0gIDk4ICovCiAxNCAgICAgICwgIDEwLCAvKiBjIC0gIDk5ICovCiAxNCAgICAgICwgIDI2LCAvKiBkIC0gMTAwICovCiAxNCAgICAgICwgIDMzLCAvKiBlIC0gMTAxICovCiAxNCAgICAgICwgIDM1LCAvKiBmIC0gMTAyICovCiAxNCAgICAgICwgIDM3LCAvKiBnIC0gMTAzICovCiAxNCAgICAgICwgIDQ0LCAvKiBoIC0gMTA0ICovCiAxNCAgICAgICwgIDUwLCAvKiBpIC0gMTA1ICovCiAxNCAgICAgICwgIDUzLCAvKiBqIC0gMTA2ICovCiAxNCAgICAgICwgIDU0LCAvKiBrIC0gMTA3ICovCiAxNCAgICAgICwgIDcyLCAvKiBsIC0gMTA4ICovCiAxNCAgICAgICwgIDgxLCAvKiBtIC0gMTA5ICovCiAxNCAgICAgICwgMTEyLCAvKiBuIC0gMTEwICovCiAxNCAgICAgICwgMTI0LCAvKiBvIC0gMTExICovCiAxNCAgICAgICwgMTI2LCAvKiBwIC0gMTEyICovCiAxNCAgICAgICwgMTM3LCAvKiBxIC0gMTEzICovCiAxNCAgICAgICwgMTM4LCAvKiByIC0gMTE0ICovCiAxNCAgICAgICwgMTQ1LCAvKiBzIC0gMTE1ICovCiAxNCAgICAgICwgMTUzLCAvKiB0IC0gMTE2ICovCiAxNCAgICAgICwgMTU5LCAvKiB1IC0gMTE3ICovCiAxNCAgICAgICwgMTYyLCAvKiB2IC0gMTE4ICovCiAxNCAgICAgICwgMTY0LCAvKiB3IC0gMTE5ICovCiAxNCAgICAgICwgMTY2LCAvKiB4IC0gMTIwICovCiAxNCAgICAgICwgMTY3LCAvKiB5IC0gMTIxICovCiAxNCAgICAgICwgMTY5LCAvKiB6IC0gMTIyICovCiAgNyAgICAgICwgIDc0LCAvKiB7IC0gMTIzICovCiAgNyAgICAgICwgIDc2LCAvKiB8IC0gMTI0ICovCiAgNyAgICAgICwgIDc4LCAvKiB9IC0gMTI1ICovCiAgNyAgICAgICwgIDgwLCAvKiB+IC0gMTI2ICovCiAgNiAgICAgICwgIDI5LCAvKiB/IC0gMTI3ICovCiAgNiAgICAgICwgIDMwLCAvKiCAIC0gMTI4ICovCiAgNiAgICAgICwgIDMxLCAvKiCBIC0gMTI5ICovCiAgNyAgICAgICwgMTIzLCAvKiCCIC0gMTMwICovCiAxNCAgICAgICwgIDM1LCAvKiCDIC0gMTMxICovCiAgNyAgICAgICwgMTI3LCAvKiCEIC0gMTMyICovCiAxMCAgICAgICwgIDIxLCAvKiCFIC0gMTMzICovCiAxMCAgICAgICwgIDE1LCAvKiCGIC0gMTM0ICovCiAxMCAgICAgICwgIDE2LCAvKiCHIC0gMTM1ICovCiAgNyAgICAgICwgIDY3LCAvKiCIIC0gMTM2ICovCiAxMCAgICAgICwgIDIyLCAvKiCJIC0gMTM3ICovCiAxNCAgICAgICwgMTQ1LCAvKiCKIC0gMTM4ICovCiAgNyAgICAgICwgMTM2LCAvKiCLIC0gMTM5ICovCiAxNCArIDE2ICwgMTI0LCAvKiCMIC0gMTQwICovCiAgNiAgICAgICwgIDQzLCAvKiCNIC0gMTQxICovCiAgNiAgICAgICwgIDQ0LCAvKiCOIC0gMTQyICovCiAgNiAgICAgICwgIDQ1LCAvKiCPIC0gMTQzICovCiAgNiAgICAgICwgIDQ2LCAvKiCQIC0gMTQ0ICovCiAgNyAgICAgICwgMTIxLCAvKiCRIC0gMTQ1ICovCiAgNyAgICAgICwgMTIyLCAvKiCSIC0gMTQ2ICovCiAgNyAgICAgICwgMTI1LCAvKiCTIC0gMTQ3ICovCiAgNyAgICAgICwgMTI2LCAvKiCUIC0gMTQ4ICovCiAxMCAgICAgICwgIDE3LCAvKiCVIC0gMTQ5ICovCiAgNiAgICAgICwgMTM3LCAvKiCWIC0gMTUwICovCiAgNiAgICAgICwgMTM5LCAvKiCXIC0gMTUxICovCiAgNyAgICAgICwgIDkzLCAvKiCYIC0gMTUyICovCiAxNCAgICAgICwgMTU2LCAvKiCZIC0gMTUzICovCiAxNCAgICAgICwgMTQ1LCAvKiCaIC0gMTU0ICovCiAgNyAgICAgICwgMTM3LCAvKiCbIC0gMTU1ICovCiAxNCArIDE2ICwgMTI0LCAvKiCcIC0gMTU2ICovCiAgNiAgICAgICwgIDU5LCAvKiCdIC0gMTU3ICovCiAgNiAgICAgICwgIDYwLCAvKiCeIC0gMTU4ICovCiAxNCAgICAgICwgMTY3LCAvKiCfIC0gMTU5ICovCiAgNyAgICAgICwgICA0LCAvKiCgIC0gMTYwICovCiAgNyAgICAgICwgIDgxLCAvKiChIC0gMTYxICovCiAxMCAgICAgICwgICAyLCAvKiCiIC0gMTYyICovCiAxMCAgICAgICwgICAzLCAvKiCjIC0gMTYzICovCiAxMCAgICAgICwgICA0LCAvKiCkIC0gMTY0ICovCiAxMCAgICAgICwgICA1LCAvKiClIC0gMTY1ICovCiAgNyAgICAgICwgIDgyLCAvKiCmIC0gMTY2ICovCiAxMCAgICAgICwgICA2LCAvKiCnIC0gMTY3ICovCiAgNyAgICAgICwgIDgzLCAvKiCoIC0gMTY4ICovCiAxMCAgICAgICwgICA3LCAvKiCpIC0gMTY5ICovCiAxNCAgICAgICwgICAyLCAvKiCqIC0gMTcwICovCiAgOCAgICAgICwgIDI0LCAvKiCrIC0gMTcxICovCiAxMCAgICAgICwgICA4LCAvKiCsIC0gMTcyICovCiAgNiAgICAgICwgMTMxLCAvKiCtIC0gMTczICovCiAxMCAgICAgICwgICA5LCAvKiCuIC0gMTc0ICovCiAgNyAgICAgICwgIDg0LCAvKiCvIC0gMTc1ICovCiAxMCAgICAgICwgIDEwLCAvKiCwIC0gMTc2ICovCiAgOCAgICAgICwgIDIzLCAvKiCxIC0gMTc3ICovCiAxMiAgICAgICwgIDUxLCAvKiCyIC0gMTc4ICovCiAxMiAgICAgICwgIDcwLCAvKiCzIC0gMTc5ICovCiAgNyAgICAgICwgIDg1LCAvKiC0IC0gMTgwICovCiAxMCAgICAgICwgIDExLCAvKiC1IC0gMTgxICovCiAxMCAgICAgICwgIDEyLCAvKiC2IC0gMTgyICovCiAxMCAgICAgICwgIDEzLCAvKiC3IC0gMTgzICovCiAgNyAgICAgICwgIDg2LCAvKiC4IC0gMTg0ICovCiAxMiAgICAgICwgIDMzLCAvKiC5IC0gMTg1ICovCiAxNCAgICAgICwgMTI0LCAvKiC6IC0gMTg2ICovCiAgOCAgICAgICwgIDI2LCAvKiC7IC0gMTg3ICovCiAxMiAgICAgICwgIDIxLCAvKiC8IC0gMTg4ICovCiAxMiAgICAgICwgIDI1LCAvKiC9IC0gMTg5ICovCiAxMiAgICAgICwgIDI5LCAvKiC+IC0gMTkwICovCiAgNyAgICAgICwgIDg3LCAvKiC/IC0gMTkxICovCiAxNCAgICAgICwgICAyLCAvKiDAIC0gMTkyICovCiAxNCAgICAgICwgICAyLCAvKiDBIC0gMTkzICovCiAxNCAgICAgICwgICAyLCAvKiDCIC0gMTk0ICovCiAxNCAgICAgICwgICAyLCAvKiDDIC0gMTk1ICovCiAxNCAgICAgICwgICAyLCAvKiDEIC0gMTk2ICovCiAxNCAgICAgICwgICAyLCAvKiDFIC0gMTk3ICovCiAxNCArIDE2ICwgICAyLCAvKiDGIC0gMTk4ICovCiAxNCAgICAgICwgIDEwLCAvKiDHIC0gMTk5ICovCiAxNCAgICAgICwgIDMzLCAvKiDIIC0gMjAwICovCiAxNCAgICAgICwgIDMzLCAvKiDJIC0gMjAxICovCiAxNCAgICAgICwgIDMzLCAvKiDKIC0gMjAyICovCiAxNCAgICAgICwgIDMzLCAvKiDLIC0gMjAzICovCiAxNCAgICAgICwgIDUwLCAvKiDMIC0gMjA0ICovCiAxNCAgICAgICwgIDUwLCAvKiDNIC0gMjA1ICovCiAxNCAgICAgICwgIDUwLCAvKiDOIC0gMjA2ICovCiAxNCAgICAgICwgIDUwLCAvKiDPIC0gMjA3ICovCiAxNCAgICAgICwgIDI2LCAvKiDQIC0gMjA4ICovCiAxNCAgICAgICwgMTEyLCAvKiDRIC0gMjA5ICovCiAxNCAgICAgICwgMTI0LCAvKiDSIC0gMjEwICovCiAxNCAgICAgICwgMTI0LCAvKiDTIC0gMjExICovCiAxNCAgICAgICwgMTI0LCAvKiDUIC0gMjEyICovCiAxNCAgICAgICwgMTI0LCAvKiDVIC0gMjEzICovCiAxNCAgICAgICwgMTI0LCAvKiDWIC0gMjE0ICovCiAgOCAgICAgICwgIDI4LCAvKiDXIC0gMjE1ICovCiAxNCAgICAgICwgMTI0LCAvKiDYIC0gMjE2ICovCiAxNCAgICAgICwgMTU5LCAvKiDZIC0gMjE3ICovCiAxNCAgICAgICwgMTU5LCAvKiDaIC0gMjE4ICovCiAxNCAgICAgICwgMTU5LCAvKiDbIC0gMjE5ICovCiAxNCAgICAgICwgMTU5LCAvKiDcIC0gMjIwICovCiAxNCAgICAgICwgMTY3LCAvKiDdIC0gMjIxICovCiAxNCArIDMyICwgMTUzLCAvKiDeIC0gMjIyICovCiAxNCArIDQ4ICwgMTQ1LCAvKiDfIC0gMjIzICovCiAxNCAgICAgICwgICAyLCAvKiDgIC0gMjI0ICovCiAxNCAgICAgICwgICAyLCAvKiDhIC0gMjI1ICovCiAxNCAgICAgICwgICAyLCAvKiDiIC0gMjI2ICovCiAxNCAgICAgICwgICAyLCAvKiDjIC0gMjI3ICovCiAxNCAgICAgICwgICAyLCAvKiDkIC0gMjI4ICovCiAxNCAgICAgICwgICAyLCAvKiDlIC0gMjI5ICovCiAxNCArIDE2ICwgICAyLCAvKiDmIC0gMjMwICovCiAxNCAgICAgICwgIDEwLCAvKiDnIC0gMjMxICovCiAxNCAgICAgICwgIDMzLCAvKiDoIC0gMjMyICovCiAxNCAgICAgICwgIDMzLCAvKiDpIC0gMjMzICovCiAxNCAgICAgICwgIDMzLCAvKiDqIC0gMjM0ICovCiAxNCAgICAgICwgIDMzLCAvKiDrIC0gMjM1ICovCiAxNCAgICAgICwgIDUwLCAvKiDsIC0gMjM2ICovCiAxNCAgICAgICwgIDUwLCAvKiDtIC0gMjM3ICovCiAxNCAgICAgICwgIDUwLCAvKiDuIC0gMjM4ICovCiAxNCAgICAgICwgIDUwLCAvKiDvIC0gMjM5ICovCiAxNCAgICAgICwgIDI2LCAvKiDwIC0gMjQwICovCiAxNCAgICAgICwgMTEyLCAvKiDxIC0gMjQxICovCiAxNCAgICAgICwgMTI0LCAvKiDyIC0gMjQyICovCiAxNCAgICAgICwgMTI0LCAvKiDzIC0gMjQzICovCiAxNCAgICAgICwgMTI0LCAvKiD0IC0gMjQ0ICovCiAxNCAgICAgICwgMTI0LCAvKiD1IC0gMjQ1ICovCiAxNCAgICAgICwgMTI0LCAvKiD2IC0gMjQ2ICovCiAgOCAgICAgICwgIDI5LCAvKiD3IC0gMjQ3ICovCiAxNCAgICAgICwgMTI0LCAvKiD4IC0gMjQ4ICovCiAxNCAgICAgICwgMTU5LCAvKiD5IC0gMjQ5ICovCiAxNCAgICAgICwgMTU5LCAvKiD6IC0gMjUwICovCiAxNCAgICAgICwgMTU5LCAvKiD7IC0gMjUxICovCiAxNCAgICAgICwgMTU5LCAvKiD8IC0gMjUyICovCiAxNCAgICAgICwgMTY3LCAvKiD9IC0gMjUzICovCiAxNCArIDMyICwgMTUzLCAvKiD+IC0gMjU0ICovCiAxNCAgICAgICwgMTY3ICAvKiD/IC0gMjU1ICovIH07CgpzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBMQ01fVW5pY29kZV9MVVRfMltdID0geyAzMywgNDQsIDE0NSB9OwoKI2RlZmluZSBMQ01fRGlhY3JpdGljX1N0YXJ0IDEzMQoKc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgTENNX0RpYWNyaXRpY19MVVRbXSA9IHsgCjEyMywgIC8qIIMgLSAxMzEgKi8KICAyLCAgLyoghCAtIDEzMiAqLwogIDIsICAvKiCFIC0gMTMzICovCiAgMiwgIC8qIIYgLSAxMzQgKi8KICAyLCAgLyoghyAtIDEzNSAqLwogIDMsICAvKiCIIC0gMTM2ICovCiAgMiwgIC8qIIkgLSAxMzcgKi8KIDIwLCAgLyogiiAtIDEzOCAqLwogIDIsICAvKiCLIC0gMTM5ICovCiAgMiwgIC8qIIwgLSAxNDAgKi8KICAyLCAgLyogjSAtIDE0MSAqLwogIDIsICAvKiCOIC0gMTQyICovCiAgMiwgIC8qII8gLSAxNDMgKi8KICAyLCAgLyogkCAtIDE0NCAqLwogIDIsICAvKiCRIC0gMTQ1ICovCiAgMiwgIC8qIJIgLSAxNDYgKi8KICAyLCAgLyogkyAtIDE0NyAqLwogIDIsICAvKiCUIC0gMTQ4ICovCiAgMiwgIC8qIJUgLSAxNDkgKi8KICAyLCAgLyogliAtIDE1MCAqLwogIDIsICAvKiCXIC0gMTUxICovCiAgMiwgIC8qIJggLSAxNTIgKi8KICAyLCAgLyogmSAtIDE1MyAqLwogMjAsICAvKiCaIC0gMTU0ICovCiAgMiwgIC8qIJsgLSAxNTUgKi8KICAyLCAgLyognCAtIDE1NiAqLwogIDIsICAvKiCdIC0gMTU3ICovCiAgMiwgIC8qIJ4gLSAxNTggKi8KIDE5LCAgLyognyAtIDE1OSAqLwogIDIsICAvKiCgIC0gMTYwICovCiAgMiwgIC8qIKEgLSAxNjEgKi8KICAyLCAgLyogoiAtIDE2MiAqLwogIDIsICAvKiCjIC0gMTYzICovCiAgMiwgIC8qIKQgLSAxNjQgKi8KICAyLCAgLyogpSAtIDE2NSAqLwogIDIsICAvKiCmIC0gMTY2ICovCiAgMiwgIC8qIKcgLSAxNjcgKi8KICAyLCAgLyogqCAtIDE2OCAqLwogIDIsICAvKiCpIC0gMTY5ICovCiAgMywgIC8qIKogLSAxNzAgKi8KICAyLCAgLyogqyAtIDE3MSAqLwogIDIsICAvKiCsIC0gMTcyICovCiAgMiwgIC8qIK0gLSAxNzMgKi8KICAyLCAgLyogriAtIDE3NCAqLwogIDIsICAvKiCvIC0gMTc1ICovCiAgMiwgIC8qILAgLSAxNzYgKi8KICAyLCAgLyogsSAtIDE3NyAqLwogIDIsICAvKiCyIC0gMTc4ICovCiAgMiwgIC8qILMgLSAxNzkgKi8KICAyLCAgLyogtCAtIDE4MCAqLwogIDIsICAvKiC1IC0gMTgxICovCiAgMiwgIC8qILYgLSAxODIgKi8KICAyLCAgLyogtyAtIDE4MyAqLwogIDIsICAvKiC4IC0gMTg0ICovCiAgMiwgIC8qILkgLSAxODUgKi8KICAzLCAgLyoguiAtIDE4NiAqLwogIDIsICAvKiC7IC0gMTg3ICovCiAgMiwgIC8qILwgLSAxODggKi8KICAyLCAgLyogvSAtIDE4OSAqLwogIDIsICAvKiC+IC0gMTkwICovCiAgMiwgIC8qIL8gLSAxOTEgKi8KIDE1LCAgLyogwCAtIDE5MiAqLwogMTQsICAvKiDBIC0gMTkzICovCiAxOCwgIC8qIMIgLSAxOTQgKi8KIDI1LCAgLyogwyAtIDE5NSAqLwogMTksICAvKiDEIC0gMTk2ICovCiAyNiwgIC8qIMUgLSAxOTcgKi8KICAyLCAgLyogxiAtIDE5OCAqLwogMjgsICAvKiDHIC0gMTk5ICovCiAxNSwgIC8qIMggLSAyMDAgKi8KIDE0LCAgLyogySAtIDIwMSAqLwogMTgsICAvKiDKIC0gMjAyICovCiAxOSwgIC8qIMsgLSAyMDMgKi8KIDE1LCAgLyogzCAtIDIwNCAqLwogMTQsICAvKiDNIC0gMjA1ICovCiAxOCwgIC8qIM4gLSAyMDYgKi8KIDE5LCAgLyogzyAtIDIwNyAqLwoxMDQsICAvKiDQIC0gMjA4ICovCiAyNSwgIC8qINEgLSAyMDkgKi8KIDE1LCAgLyog0iAtIDIxMCAqLwogMTQsICAvKiDTIC0gMjExICovCiAxOCwgIC8qINQgLSAyMTIgKi8KIDI1LCAgLyog1SAtIDIxMyAqLwogMTksICAvKiDWIC0gMjE0ICovCiAgMiwgIC8qINcgLSAyMTUgKi8KIDMzLCAgLyog2CAtIDIxNiAqLwogMTUsICAvKiDZIC0gMjE3ICovCiAxNCwgIC8qINogLSAyMTggKi8KIDE4LCAgLyog2yAtIDIxOSAqLwogMTksICAvKiDcIC0gMjIwICovCiAxNCwgIC8qIN0gLSAyMjEgKi8KICAyLCAgLyog3iAtIDIyMiAqLwogIDIsICAvKiDfIC0gMjIzICovCiAxNSwgIC8qIOAgLSAyMjQgKi8KIDE0LCAgLyog4SAtIDIyNSAqLwogMTgsICAvKiDiIC0gMjI2ICovCiAyNSwgIC8qIOMgLSAyMjcgKi8KIDE5LCAgLyog5CAtIDIyOCAqLwogMjYsICAvKiDlIC0gMjI5ICovCiAgMiwgIC8qIOYgLSAyMzAgKi8KIDI4LCAgLyog5yAtIDIzMSAqLwogMTUsICAvKiDoIC0gMjMyICovCiAxNCwgIC8qIOkgLSAyMzMgKi8KIDE4LCAgLyog6iAtIDIzNCAqLwogMTksICAvKiDrIC0gMjM1ICovCiAxNSwgIC8qIOwgLSAyMzYgKi8KIDE0LCAgLyog7SAtIDIzNyAqLwogMTgsICAvKiDuIC0gMjM4ICovCiAxOSwgIC8qIO8gLSAyMzkgKi8KMTA0LCAgLyog8CAtIDI0MCAqLwogMjUsICAvKiDxIC0gMjQxICovCiAxNSwgIC8qIPIgLSAyNDIgKi8KIDE0LCAgLyog8yAtIDI0MyAqLwogMTgsICAvKiD0IC0gMjQ0ICovCiAyNSwgIC8qIPUgLSAyNDUgKi8KIDE5LCAgLyog9iAtIDI0NiAqLwogIDIsICAvKiD3IC0gMjQ3ICovCiAzMywgIC8qIPggLSAyNDggKi8KIDE1LCAgLyog+SAtIDI0OSAqLwogMTQsICAvKiD6IC0gMjUwICovCiAxOCwgIC8qIPsgLSAyNTEgKi8KIDE5LCAgLyog/CAtIDI1MiAqLwogMTQsICAvKiD9IC0gMjUzICovCiAgMiwgIC8qIP4gLSAyNTQgKi8KIDE5LCAgLyog/yAtIDI1NSAqLwp9IDsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogT0xFMk5MU19pc1B1bmN0dWF0aW9uIFtJTlRFUk5BTF0KICovCnN0YXRpYyBpbnQgT0xFMk5MU19pc1B1bmN0dWF0aW9uKHVuc2lnbmVkIGNoYXIgYykgCnsKICAvKiAicHVuY3R1YXRpb24gY2hhcmFjdGVyIiBpbiB0aGlzIGNvbnRleHQgaXMgYSBjaGFyYWN0ZXIgd2hpY2ggaXMgCiAgICAgY29uc2lkZXJlZCAibGVzcyBpbXBvcnRhbnQiIGR1cmluZyB3b3JkIHNvcnQgY29tcGFyaXNvbi4KICAgICBTZWUgTENNYXBTdHJpbmcgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBwcmVjaXNlIGRlZmluaXRpb24gCiAgICAgb2YgImxlc3MgaW1wb3J0YW50Ii4gKi8KCiAgcmV0dXJuIChMQ01fVW5pY29kZV9MVVRbLTIrMipjXT09Nik7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogT0xFMk5MU19pc05vblNwYWNpbmcgW0lOVEVSTkFMXQogKi8Kc3RhdGljIGludCBPTEUyTkxTX2lzTm9uU3BhY2luZyh1bnNpZ25lZCBjaGFyIGMpIAp7CiAgLyogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGJ5IExDTWFwU3RyaW5nQS4gIENoYXJhY3RlcnMgCiAgICAgZm9yIHdoaWNoIGl0IHJldHVybnMgdHJ1ZSBhcmUgaWdub3JlZCB3aGVuIG1hcHBpbmcgYQogICAgIHN0cmluZyB3aXRoIE5PUk1fSUdOT1JFTk9OU1BBQ0UgKi8KICByZXR1cm4gKChjPT0xMzYpIHx8IChjPT0xNzApIHx8IChjPT0xODYpKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBPTEUyTkxTX2lzU3ltYm9sIFtJTlRFUk5BTF0KICogRklYTUU6IGhhbmRsZSBjdXJyZW50IGxvY2FsZQogKi8Kc3RhdGljIGludCBPTEUyTkxTX2lzU3ltYm9sKHVuc2lnbmVkIGNoYXIgYykgCnsKICAvKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYnkgTENNYXBTdHJpbmdBLiAgQ2hhcmFjdGVycyAKICAgICBmb3Igd2hpY2ggaXQgcmV0dXJucyB0cnVlIGFyZSBpZ25vcmVkIHdoZW4gbWFwcGluZyBhCiAgICAgc3RyaW5nIHdpdGggTk9STV9JR05PUkVTWU1CT0xTICovCiAgcmV0dXJuICggKGMhPTApICYmICEoaXNhbHBoYShjKSB8fCBpc2RpZ2l0KGMpKSApOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlpZGVudGl0eQlbSW50ZXJuYWxdCiAqLwpzdGF0aWMgaW50IGlkZW50aXR5KGludCBjKQp7CiAgcmV0dXJuIGM7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgICBMQ01hcFN0cmluZ0EgICAgICAgICAgICAgICAgW0tFUk5FTDMyLkBdCiAqCiAqIENvbnZlcnQgYSBzdHJpbmcsIG9yIGdlbmVyYXRlIGEgc29ydCBrZXkgZnJvbSBpdC4KICoKICogSWYgKG1hcGZsYWdzICYgTENNQVBfU09SVEtFWSksIHRoZSBmdW5jdGlvbiB3aWxsIGdlbmVyYXRlCiAqIGEgc29ydCBrZXkgZm9yIHRoZSBzb3VyY2Ugc3RyaW5nLiAgRWxzZSwgaXQgd2lsbCBjb252ZXJ0IGl0CiAqIGFjY29yZGluZ2x5IHRvIHRoZSBmbGFncyBMQ01BUF9VUFBFUkNBU0UsIExDTUFQX0xPV0VSQ0FTRSwuLi4KICoKICogUkVUVVJOUwogKiAgICBFcnJvciA6IDAuCiAqICAgIFN1Y2Nlc3MgOiBsZW5ndGggb2YgdGhlIHJlc3VsdCBzdHJpbmcuCiAqCiAqIE5PVEVTCiAqICAgIElmIGNhbGxlZCB3aXRoIHNjcmxlbiA9IC0xLCB0aGUgZnVuY3Rpb24gd2lsbCBjb21wdXRlIHRoZSBsZW5ndGgKICogICAgICBvZiB0aGUgMC10ZXJtaW5hdGVkIHN0cmluZyBzdHJzcmMgYnkgaXRzZWxmLiAgICAgIAogKiAKICogICAgSWYgY2FsbGVkIHdpdGggZHN0bGVuID0gMCwgcmV0dXJucyB0aGUgYnVmZmVyIGxlbmd0aCB0aGF0IAogKiAgICAgIHdvdWxkIGJlIHJlcXVpcmVkLgogKgogKiAgICBOT1JNX0lHTk9SRVdJRFRIIG1lYW5zIHRvIGNvbXBhcmUgQVNDSUkgYW5kIHdpZGUgY2hhcmFjdGVycwogKiAgICBhcyBpZiB0aGV5IGFyZSBlcXVhbC4gIAogKiAgICBJbiB0aGUgb25seSBjb2RlIHBhZ2UgaW1wbGVtZW50ZWQgc28gZmFyLCB0aGVyZSBtYXkgbm90IGJlCiAqICAgIHdpZGUgY2hhcmFjdGVycyBpbiBzdHJpbmdzIHBhc3NlZCB0byBMQ01hcFN0cmluZ0EsCiAqICAgIHNvIHRoZXJlIGlzIG5vdGhpbmcgdG8gYmUgZG9uZSBmb3IgdGhpcyBmbGFnLgogKi8KSU5UIFdJTkFQSSBMQ01hcFN0cmluZ0EoCglMQ0lEIGxjaWQsICAgICAgLyogW2luXSBsb2NhbGUgaWRlbnRpZmllciBjcmVhdGVkIHdpdGggTUFLRUxDSUQ7IAoJCSAgICAgICAgICAgICAgICBMT0NBTEVfU1lTVEVNX0RFRkFVTFQgYW5kIExPQ0FMRV9VU0VSX0RFRkFVTFQgYXJlIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWRlZmluZWQgdmFsdWVzLiAqLwoJRFdPUkQgbWFwZmxhZ3MsIC8qIFtpbl0gZmxhZ3MgKi8KCUxQQ1NUUiBzcmNzdHIsICAvKiBbaW5dIHNvdXJjZSBidWZmZXIgKi8KCUlOVCBzcmNsZW4sICAgICAvKiBbaW5dIHNvdXJjZSBsZW5ndGggKi8KCUxQU1RSIGRzdHN0ciwgICAvKiBbb3V0XSBkZXN0aW5hdGlvbiBidWZmZXIgKi8KCUlOVCBkc3RsZW4pICAgICAvKiBbaW5dIGRlc3RpbmF0aW9uIGJ1ZmZlciBsZW5ndGggKi8KewogIGludCBpOwoKICBUUkFDRSgiKDB4JTA0bHgsMHglMDhseCwlcywlZCwlcCwlZClcbiIsCglsY2lkLG1hcGZsYWdzLGRlYnVnc3RyX2FuKHNyY3N0cixzcmNsZW4pLHNyY2xlbixkc3RzdHIsZHN0bGVuKTsKCiAgaWYgKCAoKGRzdGxlbiE9MCkgJiYgKGRzdHN0cj09TlVMTCkpIHx8IChzcmNzdHI9PU5VTEwpICkKICB7CiAgICBFUlIoIihzcmM9JXMsZGVzdD0lcyk6IEludmFsaWQgTlVMTCBzdHJpbmdcbiIsCglkZWJ1Z3N0cl9hbihzcmNzdHIsc3JjbGVuKSwgZHN0c3RyKTsKICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CiAgICByZXR1cm4gMDsKICB9CiAgaWYgKHNyY2xlbiA9PSAtMSkgCiAgICBzcmNsZW4gPSBzdHJsZW4oc3Jjc3RyKSArIDEgOyAgICAvKiAoaW5jbHVkZSBmaW5hbCAnXDAnKSAqLwoKI2RlZmluZSBMQ01BUFNUUklOR0FfU1VQUE9SVEVEX0ZMQUdTIChMQ01BUF9VUFBFUkNBU0UgICAgIHwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTENNQVBfTE9XRVJDQVNFICAgICB8IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExDTUFQX1NPUlRLRVkgICAgICAgfCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOT1JNX0lHTk9SRUNBU0UgICAgIHwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTk9STV9JR05PUkVOT05TUEFDRSB8IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPUlRfU1RSSU5HU09SVCAgICAgfCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOT1JNX0lHTk9SRVdJRFRIICAgIHwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTk9STV9JR05PUkVLQU5BVFlQRSkKICAvKiBGSVhNRTogYXMgbG9uZyBhcyB3ZSBkb24ndCBzdXBwb3J0IEthdGFrYW5hIG5vciBIaXJhZ2FuYSAKICAgKiBjaGFyYWN0ZXJzLCB3ZSBjYW4gc3VwcG9ydCBOT1JNX0lHTk9SRUtBTkFUWVBFCiAgICovCiAgaWYgKG1hcGZsYWdzICYgfkxDTUFQU1RSSU5HQV9TVVBQT1JURURfRkxBR1MpCiAgewogICAgRklYTUUoIigweCUwNGx4LDB4JTA4bHgsJXAsJWQsJXAsJWQpOiAiCgkgICJ1bmltcGxlbWVudGVkIGZsYWdzOiAweCUwOGx4XG4iLAoJICBsY2lkLAoJICBtYXBmbGFncywKCSAgc3Jjc3RyLAoJICBzcmNsZW4sCgkgIGRzdHN0ciwKCSAgZHN0bGVuLAoJICBtYXBmbGFncyAmIH5MQ01BUFNUUklOR0FfU1VQUE9SVEVEX0ZMQUdTCiAgICAgKTsKICB9CgogIGlmICggIShtYXBmbGFncyAmIExDTUFQX1NPUlRLRVkpICkKICB7CiAgICBpbnQgaSxqOwogICAgaW50ICgqZikoaW50KSA9IGlkZW50aXR5OyAKICAgIGludCBmbGFnX2lnbm9yZW5vbnNwYWNlID0gbWFwZmxhZ3MgJiBOT1JNX0lHTk9SRU5PTlNQQUNFOwogICAgaW50IGZsYWdfaWdub3Jlc3ltYm9scyA9IG1hcGZsYWdzICYgTk9STV9JR05PUkVTWU1CT0xTOwoKICAgIGlmIChmbGFnX2lnbm9yZW5vbnNwYWNlIHx8IGZsYWdfaWdub3Jlc3ltYm9scykKICAgIHsKICAgICAgLyogRm9yIHNvbWUgdmFsdWVzIG9mIG1hcGZsYWdzLCB0aGUgbGVuZ3RoIG9mIHRoZSByZXN1bHRpbmcgCgkgc3RyaW5nIGlzIG5vdCBrbm93biBhdCB0aGlzIHBvaW50LiAgV2luZG93cyBkb2VzIG1hcCB0aGUgc3RyaW5nCgkgYW5kIGRvZXMgbm90IFNldExhc3RFcnJvciBFUlJPUl9JTlNVRkZJQ0lFTlRfQlVGRkVSIGluCgkgdGhlc2UgY2FzZXMuICovCiAgICAgIGlmIChkc3RsZW49PTApCiAgICAgIHsKCS8qIENvbXB1dGUgcmVxdWlyZWQgbGVuZ3RoICovCglmb3IgKGk9aj0wOyBpIDwgc3JjbGVuOyBpKyspCgl7CgkgIGlmICggIShmbGFnX2lnbm9yZW5vbnNwYWNlICYmIE9MRTJOTFNfaXNOb25TcGFjaW5nKHNyY3N0cltpXSkpCgkgICAgICAgJiYgIShmbGFnX2lnbm9yZXN5bWJvbHMgJiYgT0xFMk5MU19pc1N5bWJvbChzcmNzdHJbaV0pKSApCgkgICAgaisrOwoJfQoJcmV0dXJuIGo7CiAgICAgIH0KICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgaWYgKGRzdGxlbj09MCkKCXJldHVybiBzcmNsZW47ICAKICAgICAgaWYgKGRzdGxlbjxzcmNsZW4pIAoJICAgewoJICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUik7CgkgICAgIHJldHVybiAwOwoJICAgfQogICAgfQogICAgaWYgKG1hcGZsYWdzICYgTENNQVBfVVBQRVJDQVNFKQogICAgICBmID0gdG91cHBlcjsKICAgIGVsc2UgaWYgKG1hcGZsYWdzICYgTENNQVBfTE9XRVJDQVNFKQogICAgICBmID0gdG9sb3dlcjsKICAgIC8qIEZJWE1FOiBOT1JNX0lHTk9SRU5PTlNQQUNFIHJlcXVpcmVzIGFub3RoZXIgY29udmVyc2lvbiAqLwogICAgZm9yIChpPWo9MDsgKGk8c3JjbGVuKSAmJiAoajxkc3RsZW4pIDsgaSsrKQogICAgewogICAgICBpZiAoICEoZmxhZ19pZ25vcmVub25zcGFjZSAmJiBPTEUyTkxTX2lzTm9uU3BhY2luZyhzcmNzdHJbaV0pKQoJICAgJiYgIShmbGFnX2lnbm9yZXN5bWJvbHMgJiYgT0xFMk5MU19pc1N5bWJvbChzcmNzdHJbaV0pKSApCiAgICAgIHsKCWRzdHN0cltqXSA9IChDSEFSKSBmKHNyY3N0cltpXSk7CglqKys7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBqOwogIH0KCiAgLyogRklYTUU6IFRoaXMgZnVuY3Rpb24gY29tcGxldGVseSBpZ25vcmVzIHRoZSAibGNpZCIgcGFyYW1ldGVyLiAqLwogIC8qIGVsc2UgLi4uIChtYXBmbGFncyAmIExDTUFQX1NPUlRLRVkpICAqLwogIHsKICAgIGludCB1bmljb2RlX2xlbj0wOwogICAgaW50IGNhc2VfbGVuPTA7CiAgICBpbnQgZGlhY3JpdGljX2xlbj0wOwogICAgaW50IGRlbGF5ZWRfcHVuY3R1YXRpb25fbGVuPTA7CiAgICBjaGFyICpjYXNlX2NvbXBvbmVudDsKICAgIGNoYXIgKmRpYWNyaXRpY19jb21wb25lbnQ7CiAgICBjaGFyICpkZWxheWVkX3B1bmN0dWF0aW9uX2NvbXBvbmVudDsKICAgIGludCByb29tLGNvdW50OwogICAgaW50IGZsYWdfc3RyaW5nc29ydCA9IG1hcGZsYWdzICYgU09SVF9TVFJJTkdTT1JUOwoKICAgIC8qIGNvbXB1dGUgaG93IG11Y2ggcm9vbSB3ZSB3aWxsIG5lZWQgKi8KICAgIGZvciAoaT0wO2k8c3JjbGVuO2krKykKICAgIHsKICAgICAgaW50IG9mczsKICAgICAgdW5zaWduZWQgY2hhciBzb3VyY2VfY2hhciA9IHNyY3N0cltpXTsKICAgICAgaWYgKHNvdXJjZV9jaGFyIT0nXDAnKSAKICAgICAgewoJaWYgKGZsYWdfc3RyaW5nc29ydCB8fCAhT0xFMk5MU19pc1B1bmN0dWF0aW9uKHNvdXJjZV9jaGFyKSkKCXsKCSAgdW5pY29kZV9sZW4rKzsKCSAgaWYgKCBMQ01fVW5pY29kZV9MVVRbLTIrMipzb3VyY2VfY2hhcl0gJiB+MTUgKQoJICAgIHVuaWNvZGVfbGVuKys7ICAgICAgICAgICAgIC8qIGRvdWJsZSBsZXR0ZXIgKi8KCX0KCWVsc2UKCXsKCSAgZGVsYXllZF9wdW5jdHVhdGlvbl9sZW4rKzsKCX0JICAKICAgICAgfQoJICAKICAgICAgaWYgKGlzdXBwZXIoc291cmNlX2NoYXIpKQoJY2FzZV9sZW49dW5pY29kZV9sZW47IAoKICAgICAgb2ZzID0gc291cmNlX2NoYXIgLSBMQ01fRGlhY3JpdGljX1N0YXJ0OwogICAgICBpZiAoKG9mcz49MCkgJiYgKExDTV9EaWFjcml0aWNfTFVUW29mc10hPTIpKQoJZGlhY3JpdGljX2xlbj11bmljb2RlX2xlbjsKICAgIH0KCiAgICBpZiAobWFwZmxhZ3MgJiBOT1JNX0lHTk9SRUNBU0UpCiAgICAgIGNhc2VfbGVuPTA7ICAgICAgICAgICAgICAgICAgIAogICAgaWYgKG1hcGZsYWdzICYgTk9STV9JR05PUkVOT05TUEFDRSkKICAgICAgZGlhY3JpdGljX2xlbj0wOwoKICAgIHJvb20gPSAgMiAqIHVuaWNvZGVfbGVuICAgICAgICAgICAgICAvKiAidW5pY29kZSIgY29tcG9uZW50ICovCiAgICAgICsgICAgIGRpYWNyaXRpY19sZW4gICAgICAgICAgICAgICAgLyogImRpYWNyaXRpYyIgY29tcG9uZW50ICovCiAgICAgICsgICAgIGNhc2VfbGVuICAgICAgICAgICAgICAgICAgICAgLyogImNhc2UiIGNvbXBvbmVudCAqLwogICAgICArICAgICA0ICogZGVsYXllZF9wdW5jdHVhdGlvbl9sZW4gIC8qIHB1bmN0dWF0aW9uIGluIHdvcmQgc29ydCBtb2RlICovCiAgICAgICsgICAgIDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZm91ciAnXDEnIHNlcGFyYXRvcnMgKi8KICAgICAgKyAgICAgMSAgOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0ZXJtaW5hbCAnXDAnICovCiAgICBpZiAoZHN0bGVuPT0wKQogICAgICByZXR1cm4gcm9vbTsgICAgICAKICAgIGVsc2UgaWYgKGRzdGxlbjxyb29tKQogICAgewogICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUik7CiAgICAgIHJldHVybiAwOwogICAgfQojaWYgMAogICAgLypGSVhNRSB0aGUgUG9pbnRlcmNoZWNrIHNob3VsZCBub3QgYmUgbmVzc2VzYXJ5ICovCiAgICBpZiAoSXNCYWRXcml0ZVB0ciAoZHN0c3RyLHJvb20pKQogICAgeyBFUlIoImJhZCBkZXN0aW5hdGlvbiBidWZmZXIgKGRzdHN0cikgOiAlcCwlZFxuIixkc3RzdHIsZHN0bGVuKTsKICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOU1VGRklDSUVOVF9CVUZGRVIpOwogICAgICByZXR1cm4gMDsKICAgIH0KI2VuZGlmCiAgICAvKiBsb2NhdGUgZWFjaCBjb21wb25lbnQsIHdyaXRlIHNlcGFyYXRvcnMgKi8KICAgIGRpYWNyaXRpY19jb21wb25lbnQgPSBkc3RzdHIgKyAyKnVuaWNvZGVfbGVuIDsKICAgICpkaWFjcml0aWNfY29tcG9uZW50KysgPSAnXDEnOyAKICAgIGNhc2VfY29tcG9uZW50ID0gZGlhY3JpdGljX2NvbXBvbmVudCArIGRpYWNyaXRpY19sZW4gOwogICAgKmNhc2VfY29tcG9uZW50KysgPSAnXDEnOyAKICAgIGRlbGF5ZWRfcHVuY3R1YXRpb25fY29tcG9uZW50ID0gY2FzZV9jb21wb25lbnQgKyBjYXNlX2xlbiA7CiAgICAqZGVsYXllZF9wdW5jdHVhdGlvbl9jb21wb25lbnQrKyA9ICdcMSc7CiAgICAqZGVsYXllZF9wdW5jdHVhdGlvbl9jb21wb25lbnQrKyA9ICdcMSc7CgogICAgLyogcmVhZCBzb3VyY2Ugc3RyaW5nIGNoYXIgYnkgY2hhciwgd3JpdGUgCiAgICAgICBjb3JyZXNwb25kaW5nIHdlaWdodCBpbiBlYWNoIGNvbXBvbmVudC4gKi8KICAgIGZvciAoaT0wLGNvdW50PTA7aTxzcmNsZW47aSsrKQogICAgewogICAgICB1bnNpZ25lZCBjaGFyIHNvdXJjZV9jaGFyPXNyY3N0cltpXTsKICAgICAgaWYgKHNvdXJjZV9jaGFyIT0nXDAnKSAKICAgICAgewoJaW50IHR5cGUsbG9uZ2NvZGU7Cgl0eXBlID0gTENNX1VuaWNvZGVfTFVUWy0yKzIqc291cmNlX2NoYXJdOwoJbG9uZ2NvZGUgPSB0eXBlID4+IDQ7Cgl0eXBlICY9IDE1OwoJaWYgKCFmbGFnX3N0cmluZ3NvcnQgJiYgT0xFMk5MU19pc1B1bmN0dWF0aW9uKHNvdXJjZV9jaGFyKSkgCgl7CgkgIFdPUkQgZW5jcnlwdGVkX2xvY2F0aW9uID0gKDE8PDE1KSArIDcgKyA0KmNvdW50OwoJICAqZGVsYXllZF9wdW5jdHVhdGlvbl9jb21wb25lbnQrKyA9ICh1bnNpZ25lZCBjaGFyKSAoZW5jcnlwdGVkX2xvY2F0aW9uPj44KTsKCSAgKmRlbGF5ZWRfcHVuY3R1YXRpb25fY29tcG9uZW50KysgPSAodW5zaWduZWQgY2hhcikgKGVuY3J5cHRlZF9sb2NhdGlvbiYyNTUpOwogICAgICAgICAgICAgICAgICAgICAvKiBiaWctZW5kaWFuIGlzIHVzZWQgaGVyZSBiZWNhdXNlIGl0IGxldHMgc3RyaW5nIGNvbXBhcmlzb24gYmUKCQkJY29tcGF0aWJsZSB3aXRoIG51bWVyaWNhbCBjb21wYXJpc29uICovCgoJICAqZGVsYXllZF9wdW5jdHVhdGlvbl9jb21wb25lbnQrKyA9IHR5cGU7CgkgICpkZWxheWVkX3B1bmN0dWF0aW9uX2NvbXBvbmVudCsrID0gTENNX1VuaWNvZGVfTFVUWy0xKzIqc291cmNlX2NoYXJdOyAgCiAgICAgICAgICAgICAgICAgICAgIC8qIGFzc3VtcHRpb24gOiBhIHB1bmN0dWF0aW9uIGNoYXJhY3RlciBpcyBuZXZlciBhIAoJCQlkb3VibGUgb3IgYWNjZW50ZWQgbGV0dGVyICovCgl9CgllbHNlCgl7CgkgIGRzdHN0clsyKmNvdW50XSA9IHR5cGU7CgkgIGRzdHN0clsyKmNvdW50KzFdID0gTENNX1VuaWNvZGVfTFVUWy0xKzIqc291cmNlX2NoYXJdOyAgCgkgIGlmIChsb25nY29kZSkKCSAgewoJICAgIGlmIChjb3VudDxjYXNlX2xlbikKCSAgICAgIGNhc2VfY29tcG9uZW50W2NvdW50XSA9ICggaXN1cHBlcihzb3VyY2VfY2hhcikgPyAxOCA6IDIgKSA7CgkgICAgaWYgKGNvdW50PGRpYWNyaXRpY19sZW4pCgkgICAgICBkaWFjcml0aWNfY29tcG9uZW50W2NvdW50XSA9IDI7IC8qIGFzc3VtcHRpb246IGEgZG91YmxlIGxldHRlcgoJCQkJCQkgaXMgbmV2ZXIgYWNjZW50ZWQgKi8KCSAgICBjb3VudCsrOwoJICAgIAoJICAgIGRzdHN0clsyKmNvdW50XSA9IHR5cGU7CgkgICAgZHN0c3RyWzIqY291bnQrMV0gPSAqKExDTV9Vbmljb2RlX0xVVF8yIC0gMSArIGxvbmdjb2RlKTsgCgkgICAgLyogMTYgaW4gdGhlIGZpcnN0IGNvbHVtbiBvZiBMQ01fVW5pY29kZV9MVVQgIC0tPiAgbG9uZ2NvZGUgPSAxIAoJICAgICAgIDMyIGluIHRoZSBmaXJzdCBjb2x1bW4gb2YgTENNX1VuaWNvZGVfTFVUICAtLT4gIGxvbmdjb2RlID0gMiAKCSAgICAgICA0OCBpbiB0aGUgZmlyc3QgY29sdW1uIG9mIExDTV9Vbmljb2RlX0xVVCAgLS0+ICBsb25nY29kZSA9IDMgKi8KCSAgfQoKCSAgaWYgKGNvdW50PGNhc2VfbGVuKQoJICAgIGNhc2VfY29tcG9uZW50W2NvdW50XSA9ICggaXN1cHBlcihzb3VyY2VfY2hhcikgPyAxOCA6IDIgKSA7CgkgIGlmIChjb3VudDxkaWFjcml0aWNfbGVuKQoJICB7CgkgICAgaW50IG9mcyA9IHNvdXJjZV9jaGFyIC0gTENNX0RpYWNyaXRpY19TdGFydDsKCSAgICBkaWFjcml0aWNfY29tcG9uZW50W2NvdW50XSA9IChvZnM+PTAgPyBMQ01fRGlhY3JpdGljX0xVVFtvZnNdIDogMik7CgkgIH0KCSAgY291bnQrKzsKCX0KICAgICAgfQogICAgfQogICAgZHN0c3RyW3Jvb20tMV0gPSAnXDAnOwogICAgcmV0dXJuIHJvb207CiAgfQp9CgkJICAgICAKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgIExDTWFwU3RyaW5nVyAgICAgICAgICAgICAgICBbS0VSTkVMMzIuQF0KICoKICogQ29udmVydCBhIHN0cmluZywgb3IgZ2VuZXJhdGUgYSBzb3J0IGtleSBmcm9tIGl0LgogKgogKiBOT1RFCiAqCiAqIFNlZSBMQ01hcFN0cmluZ0EgZm9yIGRvY3VtZW50YXRpb24KICovCklOVCBXSU5BUEkgTENNYXBTdHJpbmdXKAoJTENJRCBsY2lkLERXT1JEIG1hcGZsYWdzLExQQ1dTVFIgc3Jjc3RyLElOVCBzcmNsZW4sTFBXU1RSIGRzdHN0ciwKCUlOVCBkc3RsZW4pCnsKICBpbnQgaTsKIAogIFRSQUNFKCIoMHglMDRseCwweCUwOGx4LCVwLCVkLCVwLCVkKVxuIiwKICAgICAgICAgICAgICAgICBsY2lkLCBtYXBmbGFncywgc3Jjc3RyLCBzcmNsZW4sIGRzdHN0ciwgZHN0bGVuKTsKICAKICBpZiAoICgoZHN0bGVuIT0wKSAmJiAoZHN0c3RyPT1OVUxMKSkgfHwgKHNyY3N0cj09TlVMTCkgKQogIHsKICAgIEVSUigiKHNyYz0lcCxkc3Q9JXApOiBJbnZhbGlkIE5VTEwgc3RyaW5nXG4iLCBzcmNzdHIsIGRzdHN0cik7CiAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwogICAgcmV0dXJuIDA7CiAgfQogIGlmIChzcmNsZW49PS0xKSAKICAgIHNyY2xlbiA9IHN0cmxlblcoc3Jjc3RyKSsxOwoKICAvKiBGSVhNRTogQm90aCB0aGlzIGZ1bmN0aW9uIGFuZCBpdCdzIGNvbXBhbmlvbiBMQ01hcFN0cmluZ0EoKQogICAqIGNvbXBsZXRlbHkgaWdub3JlIHRoZSAibGNpZCIgcGFyYW1ldGVyLiAgSW4gcGxhY2Ugb2YgdGhlICJsY2lkIgogICAqIHBhcmFtZXRlciB0aGUgYXBwbGljYXRpb24gbXVzdCBzZXQgdGhlICJMQ19DT0xMQVRFIiBvciAiTENfQUxMIgogICAqIGVudmlyb25tZW50IHZhcmlhYmxlIHByaW9yIHRvIGludm9raW5nIHRoaXMgZnVuY3Rpb24uICAqLwogIGlmIChtYXBmbGFncyAmIExDTUFQX1NPUlRLRVkpIAogIHsKICAgICAgLyogUG9zc2libGUgdmFsdWVzIG9mIExDX0NPTExBVEUuICovCiAgICAgIGNoYXIgKmxjX2NvbGxhdGVfZGVmYXVsdCA9IDA7IC8qIHZhbHVlIHByaW9yIHRvIHRoaXMgZnVuY3Rpb24gKi8KICAgICAgY2hhciAqbGNfY29sbGF0ZV9lbnYgPSAwOyAgICAgLyogdmFsdWUgcmV0cmlldmVkIGZyb20gdGhlIGVudmlyb25tZW50ICovCgogICAgICAvKiBHZW5lcmFsIHB1cnBvc2UgaW5kZXggaW50byBzdHJpbmdzIG9mIGFueSB0eXBlLiAqLwogICAgICBpbnQgc3RyX2lkeCA9IDA7CgogICAgICAvKiBMZW5ndGhzIG9mIHZhcmlvdXMgc3RyaW5ncyB3aGVyZSB0aGUgbGVuZ3RoIGlzIG1lYXN1cmVkIGluCiAgICAgICAqIHdpZGUgY2hhcmFjdGVycyBmb3Igd2lkZSBjaGFyYWN0ZXIgc3RyaW5ncyBhbmQgaW4gYnl0ZXMgZm9yCiAgICAgICAqIG5hdGl2ZSBzdHJpbmdzLiAgVGhlIGxlbmd0aHMgaW5jbHVkZSB0aGUgTlVMTCB0ZXJtaW5hdG9yLiAgKi8KICAgICAgc2l6ZV90IHJldHVybmVkX2xlbiAgICA9IDA7CiAgICAgIHNpemVfdCBzcmNfbmF0aXZlX2xlbiAgPSAwOwogICAgICBzaXplX3QgZHN0X25hdGl2ZV9sZW4gID0gMDsKICAgICAgc2l6ZV90IGRzdHN0cl9saWJjX2xlbiA9IDA7CgogICAgICAvKiBOYXRpdmUgKGNoYXJhY3RlciBzZXQgZGV0ZXJtaW5lZCBieSBsb2NhbGUpIHZlcnNpb25zIG9mIHRoZQogICAgICAgKiBzdHJpbmdzIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gc3RyaW5ncy4gICovCiAgICAgIExQU1RSIHNyY19uYXRpdmUgPSAwOwogICAgICBMUFNUUiBkc3RfbmF0aXZlID0gMDsKCiAgICAgIC8qIFZlcnNpb24gb2YgdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gc3RyaW5ncyB1c2luZyB0aGUKICAgICAgICogIndjaGFyX3QiIFVuaWNvZGUgZGF0YSB0eXBlIG5lZWRlZCBieSB2YXJpb3VzIGxpYmMgZnVuY3Rpb25zLiAgKi8KICAgICAgd2NoYXJfdCAqc3Jjc3RyX2xpYmMgPSAwOwogICAgICB3Y2hhcl90ICpkc3RzdHJfbGliYyA9IDA7CgogICAgICBpZighKHNyY3N0cl9saWJjID0gKHdjaGFyX3QgKilIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjbGVuICogc2l6ZW9mKHdjaGFyX3QpKSkpCiAgICAgIHsKICAgICAgICAgIEVSUigiVW5hYmxlIHRvIGFsbG9jYXRlICVkIGJ5dGVzIGZvciBzcmNzdHJfbGliY1xuIiwKICAgICAgICAgICAgICBzcmNsZW4gKiBzaXplb2Yod2NoYXJfdCkpOwogICAgICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX05PVF9FTk9VR0hfTUVNT1JZKTsKICAgICAgICAgIHJldHVybiAwOwogICAgICB9CgogICAgICAvKiBDb252ZXJ0IHNvdXJjZSBzdHJpbmcgdG8gYSBsaWJjIFVuaWNvZGUgc3RyaW5nLiAqLwogICAgICBmb3Ioc3RyX2lkeCA9IDA7IHN0cl9pZHggPCBzcmNsZW47IHN0cl9pZHgrKykKICAgICAgewogICAgICAgICAgc3Jjc3RyX2xpYmNbc3RyX2lkeF0gPSBzcmNzdHJbc3RyX2lkeF07CiAgICAgIH0KCiAgICAgIC8qIHNyY19uYXRpdmUgc2hvdWxkIGNvbnRhaW4gYXQgbW9zdCAzIGJ5dGVzIGZvciBlYWNoCiAgICAgICAqIG11bHRpYnl0ZSBjaGFyYWN0ZXJzIGluIHRoZSBvcmlnaW5hbCBzcmNzdHIgc3RyaW5nLiAgKi8KICAgICAgc3JjX25hdGl2ZV9sZW4gPSAzICogc3JjbGVuOwogICAgICBpZighKHNyY19uYXRpdmUgPSAoTFBTVFIpSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19uYXRpdmVfbGVuKSkpCiAgICAgIHsKICAgICAgICAgIEVSUigiVW5hYmxlIHRvIGFsbG9jYXRlICVkIGJ5dGVzIGZvciBzcmNfbmF0aXZlXG4iLCBzcmNfbmF0aXZlX2xlbik7CiAgICAgICAgICBTZXRMYXN0RXJyb3IoRVJST1JfTk9UX0VOT1VHSF9NRU1PUlkpOwogICAgICAgICAgaWYoc3Jjc3RyX2xpYmMpIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIHNyY3N0cl9saWJjKTsKICAgICAgICAgIHJldHVybiAwOwogICAgICB9CgogICAgICAvKiBGSVhNRTogUHJpb3IgdG8gdG8gc2V0dGluZyB0aGUgTENfQ09MTEFURSBsb2NhbGUgY2F0ZWdvcnkgdGhlCiAgICAgICAqIGN1cnJlbnQgdmFsdWUgaXMgYmFja2VkIHVwIHNvIGl0IGNhbiBiZSByZXN0b3JlZCBhZnRlciB0aGUKICAgICAgICogbGFzdCBMQ19DT0xMQVRFIHNlbnNpdGl2ZSBmdW5jdGlvbiByZXR1cm5zLgogICAgICAgKiAKICAgICAgICogRXZlbiB0aG91Z2ggdGhlIGxvY2FsZSBpcyBhZGp1c3RlZCBmb3IgYSBtaW5pbXVtIGFtb3VudCBvZgogICAgICAgKiB0aW1lIGEgcmFjZSBjb25kaXRpb24gZXhpc3RzIHdoZXJlIG90aGVyIHRocmVhZHMgbWF5IGJlCiAgICAgICAqIGFmZmVjdGVkIGlmIHRoZXkgaW52b2tlIExDX0NPTExBVEUgc2Vuc2l0aXZlIGZ1bmN0aW9ucy4gIE9uZQogICAgICAgKiBwb3NzaWJsZSBzb2x1dGlvbiBpcyB0byB3cmFwIGFsbCBMQ19DT0xMQVRFIHNlbnNpdGl2ZSBXaW5lCiAgICAgICAqIGZ1bmN0aW9ucywgbGlrZSBMQ01hcFN0cmluZ1coKSwgaW4gYSBtdXRleC4KICAgICAgICoKICAgICAgICogQW5vdGhlciBlbmhhbmNlbWVudCB0byB0aGUgZm9sbG93aW5nIHdvdWxkIGJlIHRvIHNldCB0aGUKICAgICAgICogTENfQ09MTEFURSBsb2NhbGUgY2F0ZWdvcnkgYXMgYSBmdW5jdGlvbiBvZiB0aGUgImxjaWQiCiAgICAgICAqIHBhcmFtZXRlciBpbnN0ZWFkIG9mIHRoZSAiTENfQ09MTEFURSIgZW52aXJvbm1lbnQgdmFyaWFibGUuICovCiAgICAgIGlmKCEobGNfY29sbGF0ZV9kZWZhdWx0ID0gc2V0bG9jYWxlKExDX0NPTExBVEUsIE5VTEwpKSkKICAgICAgewogICAgICAgICAgRVJSKCJVbmFibGUgdG8gcXVlcnkgdGhlIExDX0NPTExBVEUgY2F0YWdvcnlcbiIpOwogICAgICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKICAgICAgICAgIGlmKHNyY3N0cl9saWJjKSBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBzcmNzdHJfbGliYyk7CiAgICAgICAgICBpZihzcmNfbmF0aXZlKSBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBzcmNfbmF0aXZlKTsKICAgICAgICAgIHJldHVybiAwOwogICAgICB9CgogICAgICBpZighKGxjX2NvbGxhdGVfZW52ID0gc2V0bG9jYWxlKExDX0NPTExBVEUsICIiKSkpCiAgICAgIHsKICAgICAgICAgIEVSUigiVW5hYmxlIHRvIGluaGVyaXQgdGhlIExDX0NPTExBVEUgbG9jYWxlIGNhdGVnb3J5IGZyb20gdGhlICIKICAgICAgICAgICAgICAiZW52aXJvbm1lbnQuICBUaGUgXCJMQ19DT0xMQVRFXCIgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgIgogICAgICAgICAgICAgICJcIiVzXCIuXG4iLCBnZXRlbnYoIkxDX0NPTExBVEUiKSA/CiAgICAgICAgICAgICAgZ2V0ZW52KCJMQ19DT0xMQVRFIikgOiAiPHVuc2V0PiIpOwogICAgICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKICAgICAgICAgIGlmKHNyY3N0cl9saWJjKSBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBzcmNzdHJfbGliYyk7CiAgICAgICAgICBpZihzcmNfbmF0aXZlKSBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBzcmNfbmF0aXZlKTsKICAgICAgICAgIHJldHVybiAwOwogICAgICB9CgogICAgICBUUkFDRSgibGNfY29sbGF0ZV9kZWZhdWx0ID0gJXNcbiIsIGxjX2NvbGxhdGVfZGVmYXVsdCk7CiAgICAgIFRSQUNFKCJsY19jb2xsYXRlX2VudiA9ICVzXG4iLCBsY19jb2xsYXRlX2Vudik7CgogICAgICAvKiBDb252ZXJ0IHRoZSBsaWJjIFVuaWNvZGUgc3RyaW5nIHRvIGEgbmF0aXZlIG11bHRpYnl0ZSBjaGFyYWN0ZXIKICAgICAgICogc3RyaW5nLiAqLwogICAgICByZXR1cm5lZF9sZW4gPSB3Y3N0b21icyhzcmNfbmF0aXZlLCBzcmNzdHJfbGliYywgc3JjX25hdGl2ZV9sZW4pICsgMTsKICAgICAgaWYocmV0dXJuZWRfbGVuID09IDApCiAgICAgIHsKICAgICAgICAgIEVSUigid2NzdG9tYnMgZmFpbGVkLiAgVGhlIHN0cmluZyBzcGVjaWZpZWQgKCVzKSBtYXkgY29udGFpbiBhbiBpbnZhbGlkIGNoYXJhY3Rlci5cbiIsCiAgICAgICAgICAgICAgZGVidWdzdHJfdyhzcmNzdHIpKTsKICAgICAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CiAgICAgICAgICBpZihzcmNzdHJfbGliYykgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc3Jjc3RyX2xpYmMpOwogICAgICAgICAgaWYoc3JjX25hdGl2ZSkgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc3JjX25hdGl2ZSk7CiAgICAgICAgICBzZXRsb2NhbGUoTENfQ09MTEFURSwgbGNfY29sbGF0ZV9kZWZhdWx0KTsKICAgICAgICAgIHJldHVybiAwOwogICAgICB9CiAgICAgIGVsc2UgaWYocmV0dXJuZWRfbGVuID4gc3JjX25hdGl2ZV9sZW4pCiAgICAgIHsKICAgICAgICAgIHNyY19uYXRpdmVbc3JjX25hdGl2ZV9sZW4gLSAxXSA9IDA7CiAgICAgICAgICBFUlIoIndjc3RvbWJzIHJldHVybmVkIGEgc3RyaW5nICglcykgdGhhdCB3YXMgbG9uZ2VyICglZCBieXRlcykgIiAKICAgICAgICAgICAgICAidGhhbiBleHBlY3RlZCAoJWQgYnl0ZXMpLlxuIiwgc3JjX25hdGl2ZSwgcmV0dXJuZWRfbGVuLAogICAgICAgICAgICAgIGRzdF9uYXRpdmVfbGVuKTsKCiAgICAgICAgICAvKiBTaW5jZSB0aGlzIGlzIGFuIGludGVybmFsIGVycm9yIEknbSBub3Qgc3VyZSB3aGF0IHRoZSBjb3JyZWN0CiAgICAgICAgICAgKiBlcnJvciBjb2RlIGlzLiAgKi8KICAgICAgICAgIFNldExhc3RFcnJvcihFUlJPUl9OT1RfRU5PVUdIX01FTU9SWSk7CgogICAgICAgICAgaWYoc3Jjc3RyX2xpYmMpIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIHNyY3N0cl9saWJjKTsKICAgICAgICAgIGlmKHNyY19uYXRpdmUpIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIHNyY19uYXRpdmUpOwogICAgICAgICAgc2V0bG9jYWxlKExDX0NPTExBVEUsIGxjX2NvbGxhdGVfZGVmYXVsdCk7CiAgICAgICAgICByZXR1cm4gMDsKICAgICAgfQogICAgICBzcmNfbmF0aXZlX2xlbiA9IHJldHVybmVkX2xlbjsKCiAgICAgIFRSQUNFKCJzcmNfbmF0aXZlID0gJXMgIHNyY19uYXRpdmVfbGVuID0gJWRcbiIsCiAgICAgICAgICAgICBzcmNfbmF0aXZlLCBzcmNfbmF0aXZlX2xlbik7CgogICAgICAvKiBkc3RfbmF0aXZlIHNlZW1zIHRvIGNvbnRhaW4gYXQgbW9zdCA0IGJ5dGVzIGZvciBlYWNoIGJ5dGUgaW4KICAgICAgICogdGhlIG9yaWdpbmFsIHNyY19uYXRpdmUgc3RyaW5nLiAgQ2hhbmdlIGlmIG5lZWQgYmUgc2luY2UgdGhpcwogICAgICAgKiBpc24ndCBkb2N1bWVudGVkIGJ5IHRoZSBzdHJ4ZnJtKCkgbWFuIHBhZ2UuICovCiAgICAgIGRzdF9uYXRpdmVfbGVuID0gNCAqIHNyY19uYXRpdmVfbGVuOwogICAgICBpZighKGRzdF9uYXRpdmUgPSAoTFBTVFIpSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIDAsIGRzdF9uYXRpdmVfbGVuKSkpCiAgICAgIHsKICAgICAgICAgIEVSUigiVW5hYmxlIHRvIGFsbG9jYXRlICVkIGJ5dGVzIGZvciBkc3RfbmF0aXZlXG4iLCBkc3RfbmF0aXZlX2xlbik7CiAgICAgICAgICBTZXRMYXN0RXJyb3IoRVJST1JfTk9UX0VOT1VHSF9NRU1PUlkpOwogICAgICAgICAgaWYoc3Jjc3RyX2xpYmMpIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIHNyY3N0cl9saWJjKTsKICAgICAgICAgIGlmKHNyY19uYXRpdmUpIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIHNyY19uYXRpdmUpOwogICAgICAgICAgc2V0bG9jYWxlKExDX0NPTExBVEUsIGxjX2NvbGxhdGVfZGVmYXVsdCk7CiAgICAgICAgICByZXR1cm4gMDsKICAgICAgfQoKICAgICAgLyogVGhlIGFjdHVhbCB0cmFuc2xhdGlvbiBpcyBkb25lIGJ5IHRoZSBmb2xsb3dpbmcgY2FsbCB0bwogICAgICAgKiBzdHJ4ZnJtKCkuICBUaGUgc3Vycm91bmRpbmcgY29kZSBjb3VsZCBoYXZlIGJlZW4gc2ltcGxpZmllZAogICAgICAgKiBieSBjYWxsaW5nIHdjc3hmcm0oKSBpbnN0ZWFkIGV4Y2VwdCB0aGF0IHdjc3hmcm0oKSBpcyBub3QKICAgICAgICogYXZhaWxhYmxlIG9uIG9sZGVyIExpbnV4IHN5c3RlbXMgKFJlZEhhdCA0LjEgd2l0aAogICAgICAgKiBsaWJjLTUuMy4xMi0xNykuCiAgICAgICAqCiAgICAgICAqIEFsc28sIGl0IGlzIHBvc3NpYmxlIHRoYXQgdGhlIHRyYW5zbGF0aW9uIGNvdWxkIGJlIGRvbmUgYnkKICAgICAgICogdmFyaW91cyB0YWJsZXMgYXMgaXQgaXMgZG9uZSBpbiBMQ01hcFN0cmluZ0EoKS4gIEhvd2V2ZXIsIEknbQogICAgICAgKiBub3Qgc3VyZSB3aGF0IHRob3NlIHRhYmxlcyBhcmUuICovCiAgICAgIHJldHVybmVkX2xlbiA9IHN0cnhmcm0oZHN0X25hdGl2ZSwgc3JjX25hdGl2ZSwgZHN0X25hdGl2ZV9sZW4pICsgMTsKICAgICAgCiAgICAgIGlmKHJldHVybmVkX2xlbiA+IGRzdF9uYXRpdmVfbGVuKQogICAgICB7CiAgICAgICAgICBkc3RfbmF0aXZlW2RzdF9uYXRpdmVfbGVuIC0gMV0gPSAwOwogICAgICAgICAgRVJSKCJzdHJ4ZnJtIHJldHVybmVkIGEgc3RyaW5nICglcykgdGhhdCB3YXMgbG9uZ2VyICglZCBieXRlcykgIiAKICAgICAgICAgICAgICAidGhhbiBleHBlY3RlZCAoJWQgYnl0ZXMpLlxuIiwgZHN0X25hdGl2ZSwgcmV0dXJuZWRfbGVuLAogICAgICAgICAgICAgIGRzdF9uYXRpdmVfbGVuKTsKCiAgICAgICAgICAvKiBTaW5jZSB0aGlzIGlzIGFuIGludGVybmFsIGVycm9yIEknbSBub3Qgc3VyZSB3aGF0IHRoZSBjb3JyZWN0CiAgICAgICAgICAgKiBlcnJvciBjb2RlIGlzLiAgKi8KICAgICAgICAgIFNldExhc3RFcnJvcihFUlJPUl9OT1RfRU5PVUdIX01FTU9SWSk7CgogICAgICAgICAgaWYoc3Jjc3RyX2xpYmMpIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIHNyY3N0cl9saWJjKTsKICAgICAgICAgIGlmKHNyY19uYXRpdmUpIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIHNyY19uYXRpdmUpOwogICAgICAgICAgaWYoZHN0X25hdGl2ZSkgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgZHN0X25hdGl2ZSk7CiAgICAgICAgICBzZXRsb2NhbGUoTENfQ09MTEFURSwgbGNfY29sbGF0ZV9kZWZhdWx0KTsKICAgICAgICAgIHJldHVybiAwOwogICAgICB9CiAgICAgIGRzdF9uYXRpdmVfbGVuID0gcmV0dXJuZWRfbGVuOwogICAgICAKICAgICAgVFJBQ0UoImRzdF9uYXRpdmUgPSAlcyAgZHN0X25hdGl2ZV9sZW4gPSAlZFxuIiwKICAgICAgICAgICAgIGRzdF9uYXRpdmUsIGRzdF9uYXRpdmVfbGVuKTsKCiAgICAgIGRzdHN0cl9saWJjX2xlbiA9IGRzdF9uYXRpdmVfbGVuOwogICAgICBpZighKGRzdHN0cl9saWJjID0gKHdjaGFyX3QgKilIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0c3RyX2xpYmNfbGVuICogc2l6ZW9mKHdjaGFyX3QpKSkpCiAgICAgIHsKICAgICAgICAgIEVSUigiVW5hYmxlIHRvIGFsbG9jYXRlICVkIGJ5dGVzIGZvciBkc3RzdHJfbGliY1xuIiwKICAgICAgICAgICAgICBkc3RzdHJfbGliY19sZW4gKiBzaXplb2Yod2NoYXJfdCkpOwogICAgICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX05PVF9FTk9VR0hfTUVNT1JZKTsKICAgICAgICAgIGlmKHNyY3N0cl9saWJjKSBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBzcmNzdHJfbGliYyk7CiAgICAgICAgICBpZihzcmNfbmF0aXZlKSBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBzcmNfbmF0aXZlKTsKICAgICAgICAgIGlmKGRzdF9uYXRpdmUpIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIGRzdF9uYXRpdmUpOwogICAgICAgICAgc2V0bG9jYWxlKExDX0NPTExBVEUsIGxjX2NvbGxhdGVfZGVmYXVsdCk7CiAgICAgICAgICByZXR1cm4gMDsKICAgICAgfQoKICAgICAgLyogQ29udmVydCB0aGUgbmF0aXZlIG11bHRpYnl0ZSBzdHJpbmcgdG8gYSBsaWJjIFVuaWNvZGUgc3RyaW5nLiAqLwogICAgICByZXR1cm5lZF9sZW4gPSBtYnN0b3djcyhkc3RzdHJfbGliYywgZHN0X25hdGl2ZSwgZHN0X25hdGl2ZV9sZW4pICsgMTsKCiAgICAgIC8qIFJlc3RvcmUgTENfQ09MTEFURSBub3cgdGhhdCB0aGUgbGFzdCBMQ19DT0xMQVRFIHNlbnNpdGl2ZQogICAgICAgKiBmdW5jdGlvbiBoYXMgcmV0dXJuZWQuICovCiAgICAgIHNldGxvY2FsZShMQ19DT0xMQVRFLCBsY19jb2xsYXRlX2RlZmF1bHQpOyAKCiAgICAgIGlmKHJldHVybmVkX2xlbiA9PSAwKQogICAgICB7CiAgICAgICAgICBFUlIoIm1ic3Rvd2NzIGZhaWxlZC4gIFRoZSBuYXRpdmUgdmVyc2lvbiBvZiB0aGUgdHJhbnNsYXRlZCBzdHJpbmcgIgogICAgICAgICAgICAgICIoJXMpIG1heSBjb250YWluIGFuIGludmFsaWQgY2hhcmFjdGVyLlxuIiwgZHN0X25hdGl2ZSk7CiAgICAgICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwogICAgICAgICAgaWYoc3Jjc3RyX2xpYmMpIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIHNyY3N0cl9saWJjKTsKICAgICAgICAgIGlmKHNyY19uYXRpdmUpIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIHNyY19uYXRpdmUpOwogICAgICAgICAgaWYoZHN0X25hdGl2ZSkgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgZHN0X25hdGl2ZSk7CiAgICAgICAgICBpZihkc3RzdHJfbGliYykgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgZHN0c3RyX2xpYmMpOwogICAgICAgICAgcmV0dXJuIDA7CiAgICAgIH0KICAgICAgaWYoZHN0bGVuKQogICAgICB7CiAgICAgICAgICBpZihyZXR1cm5lZF9sZW4gPiBkc3RsZW4pCiAgICAgICAgICB7CiAgICAgICAgICAgICAgRVJSKCJtYnN0b3djcyByZXR1cm5lZCBhIHN0cmluZyB0aGF0IHdhcyBsb25nZXIgKCVkIGNoYXJzKSAiIAogICAgICAgICAgICAgICAgICAidGhhbiB0aGUgYnVmZmVyIHByb3ZpZGVkICglZCBjaGFycykuXG4iLCByZXR1cm5lZF9sZW4sCiAgICAgICAgICAgICAgICAgIGRzdGxlbik7CiAgICAgICAgICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOU1VGRklDSUVOVF9CVUZGRVIpOwogICAgICAgICAgICAgIGlmKHNyY3N0cl9saWJjKSBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBzcmNzdHJfbGliYyk7CiAgICAgICAgICAgICAgaWYoc3JjX25hdGl2ZSkgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc3JjX25hdGl2ZSk7CiAgICAgICAgICAgICAgaWYoZHN0X25hdGl2ZSkgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgZHN0X25hdGl2ZSk7CiAgICAgICAgICAgICAgaWYoZHN0c3RyX2xpYmMpIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIGRzdHN0cl9saWJjKTsKICAgICAgICAgICAgICByZXR1cm4gMDsgICAgICAgICAgCiAgICAgICAgICB9CiAgICAgICAgICBkc3RsZW4gPSByZXR1cm5lZF9sZW47CgogICAgICAgICAgLyogQ29udmVydCBhIGxpYmMgVW5pY29kZSBzdHJpbmcgdG8gdGhlIGRlc3RpbmF0aW9uIHN0cmluZy4gKi8KICAgICAgICAgIGZvcihzdHJfaWR4ID0gMDsgc3RyX2lkeCA8IGRzdGxlbjsgc3RyX2lkeCsrKQogICAgICAgICAgewogICAgICAgICAgICAgIGRzdHN0cltzdHJfaWR4XSA9IGRzdHN0cl9saWJjW3N0cl9pZHhdOwogICAgICAgICAgfQogICAgICAgICAgVFJBQ0UoIjFzdCA0IGludCBzaXplZCBjaHVua3Mgb2YgZHN0c3RyID0gJXggJXggJXggJXhcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAqKCgoaW50ICopZHN0c3RyKSArIDApLAogICAgICAgICAgICAgICAgICAgICAgICAgKigoKGludCAqKWRzdHN0cikgKyAxKSwKICAgICAgICAgICAgICAgICAgICAgICAgICooKChpbnQgKilkc3RzdHIpICsgMiksCiAgICAgICAgICAgICAgICAgICAgICAgICAqKCgoaW50ICopZHN0c3RyKSArIDMpKTsKICAgICAgfQogICAgICBlbHNlCiAgICAgIHsKICAgICAgICAgIGRzdGxlbiA9IHJldHVybmVkX2xlbjsKICAgICAgfQogICAgICBUUkFDRSgiZHN0bGVuIChyZXR1cm4pID0gJWRcbiIsIGRzdGxlbik7CiAgICAgIGlmKHNyY3N0cl9saWJjKSBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBzcmNzdHJfbGliYyk7CiAgICAgIGlmKHNyY19uYXRpdmUpIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIHNyY19uYXRpdmUpOwogICAgICBpZihkc3RfbmF0aXZlKSBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBkc3RfbmF0aXZlKTsKICAgICAgaWYoZHN0c3RyX2xpYmMpIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIGRzdHN0cl9saWJjKTsKICAgICAgcmV0dXJuIGRzdGxlbjsKICB9CiAgZWxzZQogIHsKICAgIGludCAoKmYpKGludCk9aWRlbnRpdHk7IAoKICAgIGlmIChkc3RsZW49PTApCiAgICAgICAgcmV0dXJuIHNyY2xlbjsgIAogICAgaWYgKGRzdGxlbjxzcmNsZW4pIAogICAgewogICAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlNVRkZJQ0lFTlRfQlVGRkVSKTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KCiAgICBpZiAobWFwZmxhZ3MgJiBMQ01BUF9VUFBFUkNBU0UpCiAgICAgIGYgPSB0b3VwcGVyOwogICAgZWxzZSBpZiAobWFwZmxhZ3MgJiBMQ01BUF9MT1dFUkNBU0UpCiAgICAgIGYgPSB0b2xvd2VyOwogICAgZm9yIChpPTA7IGkgPCBzcmNsZW47IGkrKykKICAgICAgZHN0c3RyW2ldID0gKFdDSEFSKSBmKHNyY3N0cltpXSk7CiAgICByZXR1cm4gc3JjbGVuOwogIH0KfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgT0xFMk5MU19Fc3RpbWF0ZU1hcHBpbmdMZW5ndGgKICoKICogRXN0aW1hdGVzIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyByZXF1aXJlZCB0byBob2xkIHRoZSBzdHJpbmcKICogY29tcHV0ZWQgYnkgTENNYXBTdHJpbmdBLgogKgogKiBUaGUgc2l6ZSBpcyBhbHdheXMgb3Zlci1lc3RpbWF0ZWQsIHdpdGggYSBmaXhlZCBsaW1pdCBvbiB0aGUKICogYW1vdW50IG9mIGVzdGltYXRpb24gZXJyb3IuCiAqCiAqIE5vdGUgdGhhdCBsZW4gPT0gLTEgaXMgbm90IHBlcm1pdHRlZC4KICovCnN0YXRpYyBpbmxpbmUgaW50IE9MRTJOTFNfRXN0aW1hdGVNYXBwaW5nTGVuZ3RoKExDSUQgbGNpZCwgRFdPUkQgZHdNYXBGbGFncywKCQkJCQkJTFBDU1RSIHN0ciwgRFdPUkQgbGVuKQp7CiAgICAvKiBFc3RpbWF0ZSBvbmx5IGZvciBzbWFsbCBzdHJpbmdzIHRvIGtlZXAgdGhlIGVzdGltYXRpb24gZXJyb3IgZnJvbQogICAgICogYmVjb21pbmcgdG9vIGxhcmdlLiAqLwogICAgaWYgKGxlbiA8IDEyOCkgcmV0dXJuIGxlbiAqIDggKyA1OwogICAgZWxzZSByZXR1cm4gTENNYXBTdHJpbmdBKGxjaWQsIGR3TWFwRmxhZ3MsIHN0ciwgbGVuLCBOVUxMLCAwKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQ29tcGFyZVN0cmluZ0EJW0tFUk5FTDMyLkBdCiAqIENvbXBhcmVzIHR3byBzdHJpbmdzIHVzaW5nIGxvY2FsZQogKgogKiBSRVRVUk5TCiAqCiAqIHN1Y2Nlc3M6IENTVFJfTEVTU19USEFOLCBDU1RSX0VRVUFMLCBDU1RSX0dSRUFURVJfVEhBTgogKiBmYWlsdXJlOiAwCiAqCiAqIE5PVEVTCiAqCiAqIERlZmF1bHRzIHRvIGEgd29yZCBzb3J0LCBidXQgdXNlcyBhIHN0cmluZyBzb3J0IGlmCiAqIFNPUlRfU1RSSU5HU09SVCBpcyBzZXQuCiAqIENhbGxzIFNldExhc3RFcnJvciBmb3IgRVJST1JfSU5WQUxJRF9GTEFHUywgRVJST1JfSU5WQUxJRF9QQVJBTUVURVIuCiAqIAogKiBCVUdTCiAqCiAqIFRoaXMgaW1wbGVtZW50YXRpb24gaWdub3JlcyB0aGUgbG9jYWxlCiAqCiAqIEZJWE1FCiAqIAogKiBRdWl0ZSBpbmVmZmljaWVudC4KICovCmludCBXSU5BUEkgQ29tcGFyZVN0cmluZ0EoCiAgICBMQ0lEIGxjaWQsICAgICAgLyogW2luXSBsb2NhbGUgSUQgKi8KICAgIERXT1JEIGZkd1N0eWxlLCAvKiBbaW5dIGNvbXBhcmlzb24tc3R5bGUgb3B0aW9ucyAqLwogICAgTFBDU1RSIHMxLCAgICAgIC8qIFtpbl0gZmlyc3Qgc3RyaW5nICovCiAgICBpbnQgbDEsICAgICAgICAgLyogW2luXSBsZW5ndGggb2YgZmlyc3Qgc3RyaW5nICovCiAgICBMUENTVFIgczIsICAgICAgLyogW2luXSBzZWNvbmQgc3RyaW5nICovCiAgICBpbnQgbDIpICAgICAgICAgLyogW2luXSBsZW5ndGggb2Ygc2Vjb25kIHN0cmluZyAqLwp7CiAgaW50IG1hcHN0cmluZ19mbGFnczsKICBpbnQgbGVuMSxsZW4yOwogIGludCByZXN1bHQ7CiAgTFBTVFIgc2sxLHNrMjsKICBUUkFDRSgiJXMgYW5kICVzXG4iLAoJZGVidWdzdHJfYW4gKHMxLGwxKSwgZGVidWdzdHJfYW4gKHMyLGwyKSk7CgogIGlmICggKHMxPT1OVUxMKSB8fCAoczI9PU5VTEwpICkKICB7ICAgIAogICAgRVJSKCIoczE9JXMsczI9JXMpOiBJbnZhbGlkIE5VTEwgc3RyaW5nXG4iLAoJZGVidWdzdHJfYW4oczEsbDEpLCBkZWJ1Z3N0cl9hbihzMixsMikpOwogICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKICAgIHJldHVybiAwOwogIH0KCiAgaWYoZmR3U3R5bGUgJiBOT1JNX0lHTk9SRVNZTUJPTFMpCiAgICBGSVhNRSgiSUdOT1JFU1lNQk9MUyBub3Qgc3VwcG9ydGVkXG4iKTsKCiAgaWYgKGwxID09IC0xKSBsMSA9IHN0cmxlbihzMSk7CiAgaWYgKGwyID09IC0xKSBsMiA9IHN0cmxlbihzMik7CiAgCQogIG1hcHN0cmluZ19mbGFncyA9IExDTUFQX1NPUlRLRVkgfCBmZHdTdHlsZSA7CiAgbGVuMSA9IE9MRTJOTFNfRXN0aW1hdGVNYXBwaW5nTGVuZ3RoKGxjaWQsIG1hcHN0cmluZ19mbGFncywgczEsIGwxKTsKICBsZW4yID0gT0xFMk5MU19Fc3RpbWF0ZU1hcHBpbmdMZW5ndGgobGNpZCwgbWFwc3RyaW5nX2ZsYWdzLCBzMiwgbDIpOwoKICBpZiAoKGxlbjE9PTApfHwobGVuMj09MCkpCiAgICByZXR1cm4gMDsgICAgIC8qIHNvbWV0aGluZyB3cm9uZyBoYXBwZW5lZCAqLwoKICBzazEgPSAoTFBTVFIpSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIDAsIGxlbjEgKyBsZW4yKTsKICBzazIgPSBzazEgKyBsZW4xOwogIGlmICggKCFMQ01hcFN0cmluZ0EobGNpZCxtYXBzdHJpbmdfZmxhZ3MsczEsbDEsc2sxLGxlbjEpKQoJIHx8ICghTENNYXBTdHJpbmdBKGxjaWQsbWFwc3RyaW5nX2ZsYWdzLHMyLGwyLHNrMixsZW4yKSkgKQogIHsKICAgIEVSUigiQnVnIGluIExDbWFwU3RyaW5nQS5cbiIpOwogICAgcmVzdWx0ID0gMDsKICB9CiAgZWxzZQogIHsKICAgIC8qIHN0cmNtcCBkb2Vzbid0IG5lY2Vzc2FyaWx5IHJldHVybiAtMSwgMCwgb3IgMSAqLwogICAgcmVzdWx0ID0gc3RyY21wKHNrMSxzazIpOwogIH0KICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLDAsc2sxKTsKCiAgaWYgKHJlc3VsdCA8IDApCiAgICByZXR1cm4gMTsKICBpZiAocmVzdWx0ID09IDApCiAgICByZXR1cm4gMjsKCiAgLyogbXVzdCBiZSBncmVhdGVyLCBpZiB3ZSByZWFjaCB0aGlzIHBvaW50ICovCiAgcmV0dXJuIDM7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUNvbXBhcmVTdHJpbmdXCVtLRVJORUwzMi5AXQogKiBUaGlzIGltcGxlbWVudGF0aW9uIGlnbm9yZXMgdGhlIGxvY2FsZQogKiBGSVhNRSA6ICBEb2VzIG9ubHkgc3RyaW5nIHNvcnQuICBTaG91bGQKICogYmUgcmVpbXBsZW1lbnRlZCB0aGUgc2FtZSB3YXkgYXMgQ29tcGFyZVN0cmluZ0EuCiAqLwppbnQgV0lOQVBJIENvbXBhcmVTdHJpbmdXKExDSUQgbGNpZCwgRFdPUkQgZmR3U3R5bGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgTFBDV1NUUiBzMSwgaW50IGwxLCBMUENXU1RSIHMyLCBpbnQgbDIpCnsKCWludCBsZW4scmV0OwoJaWYoZmR3U3R5bGUgJiBOT1JNX0lHTk9SRU5PTlNQQUNFKQoJCUZJWE1FKCJJR05PUkVOT05TUEFDRSBub3Qgc3VwcG9ydGVkXG4iKTsKCWlmKGZkd1N0eWxlICYgTk9STV9JR05PUkVTWU1CT0xTKQoJCUZJWE1FKCJJR05PUkVTWU1CT0xTIG5vdCBzdXBwb3J0ZWRcbiIpOwoKCS8qIElzIHN0cmNtcCBkZWZhdWx0aW5nIHRvIHN0cmluZyBzb3J0IG9yIHRvIHdvcmQgc29ydD8/ICovCgkvKiBGSVhNRTogSGFuZGxlIE5PUk1fU1RSSU5HU09SVCAqLwoJbDEgPSAobDE9PS0xKT9zdHJsZW5XKHMxKTpsMTsKCWwyID0gKGwyPT0tMSk/c3RybGVuVyhzMik6bDI7CglsZW4gPSBsMTxsMiA/IGwxOmwyOwoJcmV0ID0gKGZkd1N0eWxlICYgTk9STV9JR05PUkVDQVNFKSA/IHN0cm5jbXBpVyhzMSxzMixsZW4pIDogc3RybmNtcFcoczEsczIsbGVuKTsKCS8qIG5vdCBlcXVhbCwgcmV0dXJuIDEgb3IgMyAqLwoJaWYocmV0IT0wKSB7CgkJLyogbmVlZCB0byB0cmFuc2xhdGUgcmVzdWx0ICovCgkJcmV0dXJuICgoaW50KXJldCA8IDApID8gMSA6IDM7Cgl9CgkvKiBzYW1lIGxlbiwgcmV0dXJuIDIgKi8KCWlmKGwxPT1sMikgcmV0dXJuIDI7CgkvKiB0aGUgbG9uZ2VyIG9uZSBpcyBsZXhpY2FsbHkgZ3JlYXRlciAqLwoJcmV0dXJuIChsMTxsMik/IDEgOiAzOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlPTEVfR2V0Rm9ybWF0QQlbSW50ZXJuYWxdCiAqCiAqIEZJWE1FCiAqICAgIElmIGRhdGVsZW4gPT0gMCwgaXQgc2hvdWxkIHJldHVybiB0aGUgcmVndWlyZWQgc3RyaW5nIGxlbmd0aC4KICoKIFRoaXMgZnVuY3Rpb24gaW1wbGVtZW50cyBzdHVmZiBmb3IgR2V0RGF0ZUZvcm1hdCgpIGFuZCAKIEdldFRpbWVGb3JtYXQoKS4KCiAgZCAgICBzaW5nbGUtZGlnaXQgKG5vIGxlYWRpbmcgemVybykgZGF5IChvZiBtb250aCkKICBkZCAgIHR3by1kaWdpdCBkYXkgKG9mIG1vbnRoKQogIGRkZCAgc2hvcnQgZGF5LW9mLXdlZWsgbmFtZQogIGRkZGQgbG9uZyBkYXktb2Ytd2VlayBuYW1lCiAgTSAgICBzaW5nbGUtZGlnaXQgbW9udGgKICBNTSAgIHR3by1kaWdpdCBtb250aAogIE1NTSAgc2hvcnQgbW9udGggbmFtZQogIE1NTU0gZnVsbCBtb250aCBuYW1lCiAgeSAgICB0d28tZGlnaXQgeWVhciwgbm8gbGVhZGluZyAwCiAgeXkgICB0d28tZGlnaXQgeWVhcgogIHl5eXkgZm91ci1kaWdpdCB5ZWFyCiAgZ2cgICBlcmEgc3RyaW5nCiAgaCAgICBob3VycyB3aXRoIG5vIGxlYWRpbmcgemVybyAoMTItaG91cikKICBoaCAgIGhvdXJzIHdpdGggZnVsbCB0d28gZGlnaXRzCiAgSCAgICBob3VycyB3aXRoIG5vIGxlYWRpbmcgemVybyAoMjQtaG91cikKICBISCAgIGhvdXJzIHdpdGggZnVsbCB0d28gZGlnaXRzCiAgbSAgICBtaW51dGVzIHdpdGggbm8gbGVhZGluZyB6ZXJvCiAgbW0gICBtaW51dGVzIHdpdGggZnVsbCB0d28gZGlnaXRzCiAgcyAgICBzZWNvbmRzIHdpdGggbm8gbGVhZGluZyB6ZXJvCiAgc3MgICBzZWNvbmRzIHdpdGggZnVsbCB0d28gZGlnaXRzCiAgdCAgICB0aW1lIG1hcmtlciAoQSBvciBQKQogIHR0ICAgdGltZSBtYXJrZXIgKEFNLCBQTSkKICAnJyAgIHVzZWQgdG8gcXVvdGUgbGl0ZXJhbCBjaGFyYWN0ZXJzCiAgJycgICAod2l0aGluIGEgcXVvdGVkIHN0cmluZykgaW5kaWNhdGVzIGEgbGl0ZXJhbCAnCgogVGhlc2UgZnVuY3Rpb25zIFJFUVVJUkUgdmFsaWQgbG9jYWxlLCBkYXRlLCAgYW5kIGZvcm1hdC4gCiAqLwpzdGF0aWMgSU5UIE9MRV9HZXRGb3JtYXRBKExDSUQgbG9jYWxlLAoJCQkgICAgRFdPUkQgZmxhZ3MsCgkJCSAgICBEV09SRCB0ZmxhZ3MsCgkJCSAgICBjb25zdCBTWVNURU1USU1FKiB4dGltZSwKCQkJICAgIExQQ1NUUiBfZm9ybWF0LCAJLyppbiovCgkJCSAgICBMUFNUUiBkYXRlLAkJLypvdXQqLwoJCQkgICAgSU5UIGRhdGVsZW4pCnsKICAgSU5UIGlucG9zLCBvdXRwb3M7CiAgIGludCBjb3VudCwgdHlwZSwgaW5xdW90ZSwgT3ZlcmZsb3c7CiAgIGNoYXIgYnVmWzQwXTsKICAgY2hhciBmb3JtYXRbNDBdOwogICBjaGFyICogcG9zOwogICBpbnQgYnVmbGVuOwoKICAgY29uc3QgY2hhciAqIF9kZ2ZtdFtdID0geyAiJWQiLCAiJTAyZCIgfTsKICAgY29uc3QgY2hhciAqKiBkZ2ZtdCA9IF9kZ2ZtdCAtIDE7IAoKICAgLyogcmVwb3J0LCBmb3IgZGVidWdnaW5nICovCiAgIFRSQUNFKCIoMHglbHgsMHglbHgsIDB4JWx4LCB0aW1lKHk9JWQgbT0lZCB3ZD0lZCBkPSVkLGg9JWQsbT0lZCxzPSVkKSwgZm10PSVwIFwnJXNcJyAsICVwLCBsZW49JWQpXG4iLAogICAJIGxvY2FsZSwgZmxhZ3MsIHRmbGFncywKCSB4dGltZS0+d1llYXIseHRpbWUtPndNb250aCx4dGltZS0+d0RheU9mV2Vlayx4dGltZS0+d0RheSwgeHRpbWUtPndIb3VyLCB4dGltZS0+d01pbnV0ZSwgeHRpbWUtPndTZWNvbmQsCgkgX2Zvcm1hdCwgX2Zvcm1hdCwgZGF0ZSwgZGF0ZWxlbik7CiAgCiAgIGlmKGRhdGVsZW4gPT0gMCkgewogICAgIEZJWE1FKCJkYXRlbGVuID0gMCwgcmV0dXJuaW5nIDI1NVxuIik7CiAgICAgcmV0dXJuIDI1NTsKICAgfQoKICAgLyogaW5pdGFsaXplIHN0YXRlIHZhcmlhYmxlcyBhbmQgb3V0cHV0IGJ1ZmZlciAqLwogICBpbnBvcyA9IG91dHBvcyA9IDA7CiAgIGNvdW50ID0gMDsgaW5xdW90ZSA9IDA7IE92ZXJmbG93ID0gMDsKICAgdHlwZSA9ICdcMCc7CiAgIGRhdGVbMF0gPSBidWZbMF0gPSAnXDAnOwogICAgICAKICAgc3RyY3B5KGZvcm1hdCxfZm9ybWF0KTsKCiAgIC8qIGFsdGVyIHRoZSBmb3JtYXRzdHJpbmcsIHdoaWxlIGl0IHdvcmtzIGZvciBhbGwgbGFuZ3VhZ2VzIG5vdyBpbiB3aW5lCiAgIGl0cyBwb3NzaWJsZSB0aGF0IGl0IGZhaWxzIHdoZW4gdGhlIHRpbWUgbG9va3MgbGlrZSBzczptbTpoaCBhcyBleGFtcGxlKi8gICAKICAgaWYgKHRmbGFncyAmIChUSU1FX05PTUlOVVRFU09SU0VDT05EUykpCiAgIHsgaWYgKChwb3MgPSBzdHJzdHIgKCBmb3JtYXQsICI6bW0iKSkpCiAgICAgeyBtZW1jcHkgKCBwb3MsIHBvcyszLCBzdHJsZW4oZm9ybWF0KS0ocG9zLWZvcm1hdCktMiApOwogICAgIH0KICAgfQogICBpZiAodGZsYWdzICYgKFRJTUVfTk9TRUNPTkRTKSkKICAgeyBpZiAoKHBvcyA9IHN0cnN0ciAoIGZvcm1hdCwgIjpzcyIpKSkKICAgICB7IG1lbWNweSAoIHBvcywgcG9zKzMsIHN0cmxlbihmb3JtYXQpLShwb3MtZm9ybWF0KS0yICk7CiAgICAgfQogICB9CiAgIAogICBmb3IgKGlucG9zID0gMDs7IGlucG9zKyspIHsKICAgICAgLyogVFJBQ0UoIlNUQVRFIGlucG9zPSUyZCBvdXRwb3M9JTJkIGNvdW50PSVkIGlucXVvdGU9JWQgdHlwZT0lYyBidWYsZGF0ZSA9ICVjLCVjXG4iLCBpbnBvcywgb3V0cG9zLCBjb3VudCwgaW5xdW90ZSwgdHlwZSwgYnVmW2lucG9zXSwgZGF0ZVtvdXRwb3NdKTsgKi8KICAgICAgaWYgKGlucXVvdGUpIHsKCSBpZiAoZm9ybWF0W2lucG9zXSA9PSAnXCcnKSB7CgkgICAgaWYgKGZvcm1hdFtpbnBvcysxXSA9PSAnXCcnKSB7CgkgICAgICAgaW5wb3MgKz0gMTsKCSAgICAgICBkYXRlW291dHBvcysrXSA9ICdcJyc7CgkgICAgfSBlbHNlIHsKCSAgICAgICBpbnF1b3RlID0gMDsKCSAgICAgICBjb250aW51ZTsgLyogd2UgZGlkIG5vdGhpbmcgdG8gdGhlIG91dHB1dCAqLwoJICAgIH0KCSB9IGVsc2UgaWYgKGZvcm1hdFtpbnBvc10gPT0gJ1wwJykgewoJICAgIGRhdGVbb3V0cG9zKytdID0gJ1wwJzsKCSAgICBpZiAob3V0cG9zID4gZGF0ZWxlbikgT3ZlcmZsb3cgPSAxOwoJICAgIGJyZWFrOwoJIH0gZWxzZSB7CgkgICAgZGF0ZVtvdXRwb3MrK10gPSBmb3JtYXRbaW5wb3NdOwoJICAgIGlmIChvdXRwb3MgPiBkYXRlbGVuKSB7CgkgICAgICAgT3ZlcmZsb3cgPSAxOwoJICAgICAgIGRhdGVbb3V0cG9zLTFdID0gJ1wwJzsgLyogdGhpcyBpcyB0aGUgbGFzdCBwbGFjZSB3aGVyZQoJCQkJCSBpdCdzIHNhZmUgdG8gd3JpdGUgKi8KCSAgICAgICBicmVhazsKCSAgICB9CgkgfQogICAgICB9IGVsc2UgaWYgKCAgKGNvdW50ICYmIChmb3JtYXRbaW5wb3NdICE9IHR5cGUpKQoJCSAgIHx8IGNvdW50ID09IDQKCQkgICB8fCAoY291bnQgPT0gMiAmJiBzdHJjaHIoImdoSG1zdCIsIHR5cGUpKSApIHsKCSAgICBpZiAodHlwZSA9PSAnaCcgJiYgKHRmbGFncyAmIFRJTUVfRk9SQ0UyNEhPVVJGT1JNQVQpKSB0eXBlPSAnSCc7CgkgICAgaWYgKHR5cGUgPT0gJ2QnKSB7CgkgICAgICAgaWYgKGNvdW50ID09IDQpIHsKCQkgIEdldExvY2FsZUluZm9BKGxvY2FsZSwKCQkJCSAgIExPQ0FMRV9TREFZTkFNRTEKCQkJCSAgICsgKHh0aW1lLT53RGF5T2ZXZWVrKzYpJTcsCgkJCQkgICBidWYsIHNpemVvZihidWYpKTsKCSAgICAgICB9IGVsc2UgaWYgKGNvdW50ID09IDMpIHsKCQkJICAgR2V0TG9jYWxlSW5mb0EobG9jYWxlLCAKCQkJCQkgICAgTE9DQUxFX1NBQkJSRVZEQVlOQU1FMSAKCQkJCQkgICAgKyAoeHRpbWUtPndEYXlPZldlZWsrNiklNywKCQkJCQkgICAgYnVmLCBzaXplb2YoYnVmKSk7CgkJICAgICAgfSBlbHNlIHsKCQkgIHNwcmludGYoYnVmLCBkZ2ZtdFtjb3VudF0sIHh0aW1lLT53RGF5KTsKCSAgICAgICB9CgkgICAgfSBlbHNlIGlmICh0eXBlID09ICdNJykgewoJICAgICAgIGlmIChjb3VudCA9PSAzKSB7CgkJICBHZXRMb2NhbGVJbmZvQShsb2NhbGUsIAoJCQkJICAgTE9DQUxFX1NBQkJSRVZNT05USE5BTUUxCgkJCQkgICArIHh0aW1lLT53TW9udGggLSAxLAoJCQkJICAgYnVmLCBzaXplb2YoYnVmKSk7CgkgICAgICAgfSBlbHNlIGlmIChjb3VudCA9PSA0KSB7CgkJICBHZXRMb2NhbGVJbmZvQShsb2NhbGUsCgkJCQkgICBMT0NBTEVfU01PTlRITkFNRTEKCQkJCSAgICsgeHRpbWUtPndNb250aCAtIDEsCgkJCQkgICBidWYsIHNpemVvZihidWYpKTsKCQkgfSBlbHNlIHsKCQkgIHNwcmludGYoYnVmLCBkZ2ZtdFtjb3VudF0sIHh0aW1lLT53TW9udGgpOwoJICAgICAgIH0KCSAgICB9IGVsc2UgaWYgKHR5cGUgPT0gJ3knKSB7CgkgICAgICAgaWYgKGNvdW50ID09IDQpIHsKCQkgICAgICBzcHJpbnRmKGJ1ZiwgIiVkIiwgeHRpbWUtPndZZWFyKTsKCSAgICAgICB9IGVsc2UgaWYgKGNvdW50ID09IDMpIHsKCQkgIHN0cmNweShidWYsICJ5eXkiKTsKCQkgIFdBUk4oInVua25vd24gZm9ybWF0LCBjPSVjLCBuPSVkXG4iLCAgdHlwZSwgY291bnQpOwoJCSB9IGVsc2UgewoJCSAgc3ByaW50ZihidWYsIGRnZm10W2NvdW50XSwgeHRpbWUtPndZZWFyICUgMTAwKTsKCSAgICAgICB9CgkgICAgfSBlbHNlIGlmICh0eXBlID09ICdnJykgewoJICAgICAgIGlmICAgICAgICAoY291bnQgPT0gMikgewoJCSAgRklYTUUoIkxPQ0FMRV9JQ0FMRU5EQVJUWVBFIHVuaW1wLlxuIik7CgkJICBzdHJjcHkoYnVmLCAiQUQiKTsKCSAgICB9IGVsc2UgewoJCSAgc3RyY3B5KGJ1ZiwgImciKTsKCQkgIFdBUk4oInVua25vd24gZm9ybWF0LCBjPSVjLCBuPSVkXG4iLCB0eXBlLCBjb3VudCk7CgkgICAgICAgfQoJICAgIH0gZWxzZSBpZiAodHlwZSA9PSAnaCcpIHsKCSAgICAgICAvKiBnaXZlcyB1cyBob3VycyAxOjAwIC0tIDEyOjAwICovCgkgICAgICAgc3ByaW50ZihidWYsIGRnZm10W2NvdW50XSwgKHh0aW1lLT53SG91ci0xKSUxMiArMSk7CgkgICAgfSBlbHNlIGlmICh0eXBlID09ICdIJykgewoJICAgICAgIC8qIDI0LWhvdXIgdGltZSAqLwoJICAgICAgIHNwcmludGYoYnVmLCBkZ2ZtdFtjb3VudF0sIHh0aW1lLT53SG91cik7CgkgICAgfSBlbHNlIGlmICggdHlwZSA9PSAnbScpIHsKCSAgICAgICBzcHJpbnRmKGJ1ZiwgZGdmbXRbY291bnRdLCB4dGltZS0+d01pbnV0ZSk7CgkgICAgfSBlbHNlIGlmICggdHlwZSA9PSAncycpIHsKCSAgICAgICBzcHJpbnRmKGJ1ZiwgZGdmbXRbY291bnRdLCB4dGltZS0+d1NlY29uZCk7CgkgICAgfSBlbHNlIGlmICh0eXBlID09ICd0JykgewogICAgICAgICAgICAgICBpZiAoKHRmbGFncyAmIFRJTUVfTk9USU1FTUFSS0VSKSkKICAgICAgICAgICAgICAgICAgYnVmWzBdPSdcMCc7CiAgICAgICAgICAgICAgIGVsc2UgaWYgKGNvdW50ID09IDEpIHsKCQkgIHNwcmludGYoYnVmLCAiJWMiLCAoeHRpbWUtPndIb3VyIDwgMTIpID8gJ0EnIDogJ1AnKTsKICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjb3VudCA9PSAyKSB7CiAgICAgICAgICAgICAgICAgLyogc3ByaW50ZihidWYsICIlcyIsICh4dGltZS0+d0hvdXIgPCAxMikgPyAiQU0iIDogIlBNIik7ICovCiAgICAgICAgICAgICAgICAgIEdldExvY2FsZUluZm9BKGxvY2FsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgKHh0aW1lLT53SG91cjwxMikgCiAgICAgICAgICAgICAgICAgICAgICAgICAgID8gTE9DQUxFX1MxMTU5IDogTE9DQUxFX1MyMzU5LAogICAgICAgICAgICAgICAgICAgICAgICAgICBidWYsIHNpemVvZihidWYpKTsKICAgICAgICAgICAgICAgfQoJICAgIH07CgoJICAgIC8qIHdlIG5lZWQgdG8gY2hlY2sgdGhlIG5leHQgY2hhciBpbiB0aGUgZm9ybWF0IHN0cmluZyAKCSAgICAgICBhZ2Fpbiwgbm8gbWF0dGVyIHdoYXQgaGFwcGVuZWQgKi8KCSAgICBpbnBvcy0tOwoJICAgIAoJICAgIC8qIGFkZCB0aGUgY29udGVudHMgb2YgYnVmIHRvIHRoZSBvdXRwdXQgKi8KCSAgICBidWZsZW4gPSBzdHJsZW4oYnVmKTsKCSAgICBpZiAob3V0cG9zICsgYnVmbGVuIDwgZGF0ZWxlbikgewoJICAgICAgIGRhdGVbb3V0cG9zXSA9ICdcMCc7IC8qIGZvciBzdHJjYXQgdG8gaG9vayBvbnRvICovCgkJIHN0cmNhdChkYXRlLCBidWYpOwoJICAgICAgIG91dHBvcyArPSBidWZsZW47CgkgICAgfSBlbHNlIHsKCSAgICAgICBkYXRlW291dHBvc10gPSAnXDAnOwoJICAgICAgIHN0cm5jYXQoZGF0ZSwgYnVmLCBkYXRlbGVuIC0gb3V0cG9zKTsKCQkgZGF0ZVtkYXRlbGVuIC0gMV0gPSAnXDAnOwoJCSBTZXRMYXN0RXJyb3IoRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUik7CgkgICAgICAgV0FSTigiaW5zdWZmaWNpZW50IGJ1ZmZlclxuIik7CgkJIHJldHVybiAwOwoJICAgIH0KCgkgICAgLyogcmVzZXQgdGhlIHZhcmlhYmxlcyB3ZSB1c2VkIHRvIGtlZXAgdHJhY2sgb2YgdGhpcyBpdGVtICovCgkgICAgY291bnQgPSAwOwoJICAgIHR5cGUgPSAnXDAnOwoJIH0gZWxzZSBpZiAoZm9ybWF0W2lucG9zXSA9PSAnXDAnKSB7CgkgICAgLyogd2UgY2FuJ3QgY2hlY2sgZm9yIHRoaXMgYXQgdGhlIGxvb3AtaGVhZCwgYmVjYXVzZQoJICAgICAgIHRoYXQgYnJlYWtzIHRoZSBwcmludGluZyBvZiB0aGUgbGFzdCBmb3JtYXQtaXRlbSAqLwoJICAgIGRhdGVbb3V0cG9zXSA9ICdcMCc7CgkgICAgYnJlYWs7CiAgICAgICAgIH0gZWxzZSBpZiAoY291bnQpIHsKCSAgICAvKiBjb250aW51aW5nIGEgY29kZSBmb3IgYW4gaXRlbSAqLwoJICAgIGNvdW50ICs9MTsKCSAgICBjb250aW51ZTsKCSB9IGVsc2UgaWYgKHN0cmNocigiaEhtc3R5TWRnIiwgZm9ybWF0W2lucG9zXSkpIHsKCSAgICB0eXBlID0gZm9ybWF0W2lucG9zXTsKCSAgICBjb3VudCA9IDE7CgkgICAgY29udGludWU7CgkgfSBlbHNlIGlmIChmb3JtYXRbaW5wb3NdID09ICdcJycpIHsKCSAgICBpbnF1b3RlID0gMTsKCSAgICBjb250aW51ZTsKICAgICAgIH0gZWxzZSB7CgkgICAgZGF0ZVtvdXRwb3MrK10gPSBmb3JtYXRbaW5wb3NdOwoJIH0KICAgICAgLyogbm93IGRlYWwgd2l0aCBhIHBvc3NpYmxlIGJ1ZmZlciBvdmVyZmxvdyAqLwogICAgICBpZiAob3V0cG9zID49IGRhdGVsZW4pIHsKICAgICAgIGRhdGVbZGF0ZWxlbiAtIDFdID0gJ1wwJzsKICAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlNVRkZJQ0lFTlRfQlVGRkVSKTsKICAgICAgIHJldHVybiAwOwogICAgICB9CiAgIH0KICAgCiAgIGlmIChPdmVyZmxvdykgewogICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUik7CiAgIH07CgogICAvKiBmaW5pc2ggaXQgb2ZmIHdpdGggYSBzdHJpbmcgdGVybWluYXRvciAqLwogICBvdXRwb3MrKzsKICAgLyogc2FuaXR5IGNoZWNrICovCiAgIGlmIChvdXRwb3MgPiBkYXRlbGVuLTEpIG91dHBvcyA9IGRhdGVsZW4tMTsKICAgZGF0ZVtvdXRwb3NdID0gJ1wwJzsKICAgCiAgIFRSQUNFKCJyZXR1cm5zIHN0cmluZyAnJXMnLCBsZW4gJWRcbiIsIGRhdGUsIG91dHBvcyk7CiAgIHJldHVybiBvdXRwb3M7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogT0xFX0dldEZvcm1hdFcgW0lOVEVSTkFMXQogKi8Kc3RhdGljIElOVCBPTEVfR2V0Rm9ybWF0VyhMQ0lEIGxvY2FsZSwgRFdPUkQgZmxhZ3MsIERXT1JEIHRmbGFncywKCQkJICAgIGNvbnN0IFNZU1RFTVRJTUUqIHh0aW1lLAoJCQkgICAgTFBDV1NUUiBmb3JtYXQsCgkJCSAgICBMUFdTVFIgb3V0cHV0LCBJTlQgb3V0bGVuKQp7CiAgIElOVCAgIGlucG9zLCBvdXRwb3M7CiAgIGludCAgICAgY291bnQsIHR5cGU9MCwgaW5xdW90ZTsKICAgaW50ICAgICBPdmVyZmxvdzsgLyogbG9vcCBjaGVjayAqLwogICBjaGFyICAgIHRtcFsxNl07CiAgIFdDSEFSICAgYnVmWzQwXTsKICAgaW50ICAgICBidWZsZW49MDsKICAgV0NIQVIgICBhcmcwW10gPSB7MH0sIGFyZzFbXSA9IHsnJScsJ2QnLDB9OwogICBXQ0hBUiAgIGFyZzJbXSA9IHsnJScsJzAnLCcyJywnZCcsMH07CiAgIFdDSEFSICAqYXJnYXJyWzNdOwogICBpbnQgICAgIGRhdGV2YXJzPTAsIHRpbWV2YXJzPTA7CgogICBhcmdhcnJbMF0gPSBhcmcwOwogICBhcmdhcnJbMV0gPSBhcmcxOwogICBhcmdhcnJbMl0gPSBhcmcyOwoKICAgLyogbWFrZSBhIGRlYnVnIHJlcG9ydCAqLwogICBUUkFDRSgiYXJnczogMHglbHgsIDB4JWx4LCAweCVseCwgdGltZShkPSVkLGg9JWQsbT0lZCxzPSVkKSwgZm10OiVzIChhdCAlcCksICIKICAgCSAgICAgICIlcCB3aXRoIG1heCBsZW4gJWRcbiIsCgkgbG9jYWxlLCBmbGFncywgdGZsYWdzLAoJIHh0aW1lLT53RGF5LCB4dGltZS0+d0hvdXIsIHh0aW1lLT53TWludXRlLCB4dGltZS0+d1NlY29uZCwKCSBkZWJ1Z3N0cl93KGZvcm1hdCksIGZvcm1hdCwgb3V0cHV0LCBvdXRsZW4pOwogICAKICAgaWYob3V0bGVuID09IDApIHsKICAgICBGSVhNRSgib3V0bGVuID0gMCwgcmV0dXJuaW5nIDI1NVxuIik7CiAgICAgcmV0dXJuIDI1NTsKICAgfQoKICAgLyogaW5pdGlhbGl6ZSBzdGF0ZSB2YXJpYWJsZXMgKi8KICAgaW5wb3MgPSBvdXRwb3MgPSAwOwogICBjb3VudCA9IDA7CiAgIGlucXVvdGUgPSBPdmVyZmxvdyA9IDA7CiAgIC8qIHRoaXMgaXMgcmVhbGx5IGp1c3QgYSBzYW5pdHkgY2hlY2sgKi8KICAgb3V0cHV0WzBdID0gYnVmWzBdID0gMDsKICAgCiAgIC8qIHRoaXMgbG9vcCBpcyB0aGUgY29yZSBvZiB0aGUgZnVuY3Rpb24gKi8KICAgZm9yIChpbnBvcyA9IDA7IC8qIHdlIGhhdmUgc2V2ZXJhbCBicmVhayBwb2ludHMgKi8gOyBpbnBvcysrKSB7CiAgICAgIGlmIChpbnF1b3RlKSB7CgkgaWYgKGZvcm1hdFtpbnBvc10gPT0gKFdDSEFSKSAnXCcnKSB7CgkgICAgaWYgKGZvcm1hdFtpbnBvcysxXSA9PSAnXCcnKSB7CgkgICAgICAgaW5wb3MrKzsKCSAgICAgICBvdXRwdXRbb3V0cG9zKytdID0gJ1wnJzsKCSAgICB9IGVsc2UgewoJICAgICAgIGlucXVvdGUgPSAwOwoJICAgICAgIGNvbnRpbnVlOwoJICAgIH0KCSB9IGVsc2UgaWYgKGZvcm1hdFtpbnBvc10gPT0gMCkgewoJICAgIG91dHB1dFtvdXRwb3MrK10gPSAwOwoJICAgIGlmIChvdXRwb3MgPiBvdXRsZW4pIE92ZXJmbG93ID0gMTsKCSAgICBicmVhazsgIC8qICBub3JtYWwgZXhpdCAod2l0aGluIGEgcXVvdGUpICovCgkgfSBlbHNlIHsKCSAgICBvdXRwdXRbb3V0cG9zKytdID0gZm9ybWF0W2lucG9zXTsgLyogY29weSBpbnB1dCAqLwoJICAgIGlmIChvdXRwb3MgPiBvdXRsZW4pIHsKCSAgICAgICBPdmVyZmxvdyA9IDE7CgkgICAgICAgb3V0cHV0W291dHBvcy0xXSA9IDA7IAoJICAgICAgIGJyZWFrOwoJICAgIH0KCSB9CiAgICAgIH0gZWxzZSBpZiAoICAoY291bnQgJiYgKGZvcm1hdFtpbnBvc10gIT0gdHlwZSkpCgkJICAgfHwgKCAoY291bnQ9PTQgJiYgdHlwZSA9PSd5JykgfHwKCQkJKGNvdW50PT00ICYmIHR5cGUgPT0nTScpIHx8CgkJCShjb3VudD09NCAmJiB0eXBlID09J2QnKSB8fAoJCQkoY291bnQ9PTIgJiYgdHlwZSA9PSdnJykgfHwKCQkJKGNvdW50PT0yICYmIHR5cGUgPT0naCcpIHx8CgkJCShjb3VudD09MiAmJiB0eXBlID09J0gnKSB8fAoJCQkoY291bnQ9PTIgJiYgdHlwZSA9PSdtJykgfHwKCQkJKGNvdW50PT0yICYmIHR5cGUgPT0ncycpIHx8CgkJCShjb3VudD09MiAmJiB0eXBlID09J3QnKSApICApIHsKICAgICAgICAgIHN3aXRjaCh0eXBlKQogICAgICAgICAgewogICAgICAgICAgY2FzZSAnZCc6CgkgICAgaWYgICAgICAgIChjb3VudCA9PSA0KSB7CgkgICAgICAgR2V0TG9jYWxlSW5mb1cobG9jYWxlLAoJCQkgICAgIExPQ0FMRV9TREFZTkFNRTEgKyAoeHRpbWUtPndEYXlPZldlZWsgKzYpJTcsCgkJCSAgICAgYnVmLCBzaXplb2YoYnVmKS9zaXplb2YoV0NIQVIpICk7CgkgICAgfSBlbHNlIGlmIChjb3VudCA9PSAzKSB7CgkgICAgICAgR2V0TG9jYWxlSW5mb1cobG9jYWxlLAoJCQkJTE9DQUxFX1NBQkJSRVZEQVlOQU1FMSArCgkJCQkoeHRpbWUtPndEYXlPZldlZWsgKzYpJTcsCgkJCQlidWYsIHNpemVvZihidWYpL3NpemVvZihXQ0hBUikgKTsKCSAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgc3ByaW50ZiggdG1wLCAiJS4qZCIsIGNvdW50LCB4dGltZS0+d0RheSApOwogICAgICAgICAgICAgICAgTXVsdGlCeXRlVG9XaWRlQ2hhciggQ1BfQUNQLCAwLCB0bXAsIC0xLCBidWYsIHNpemVvZihidWYpL3NpemVvZihXQ0hBUikgKTsKCSAgICB9CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgIGNhc2UgJ00nOgoJICAgIGlmICAgICAgICAoY291bnQgPT0gNCkgewoJICAgICAgIEdldExvY2FsZUluZm9XKGxvY2FsZSwgIExPQ0FMRV9TTU9OVEhOQU1FMSArCgkJCQl4dGltZS0+d01vbnRoIC0xLCBidWYsCgkJCQlzaXplb2YoYnVmKS9zaXplb2YoV0NIQVIpICk7CgkgICAgfSBlbHNlIGlmIChjb3VudCA9PSAzKSB7CgkgICAgICAgR2V0TG9jYWxlSW5mb1cobG9jYWxlLCAgTE9DQUxFX1NBQkJSRVZNT05USE5BTUUxICsKCQkJCXh0aW1lLT53TW9udGggLTEsIGJ1ZiwKCQkJCXNpemVvZihidWYpL3NpemVvZihXQ0hBUikgKTsKCSAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgc3ByaW50ZiggdG1wLCAiJS4qZCIsIGNvdW50LCB4dGltZS0+d01vbnRoICk7CiAgICAgICAgICAgICAgICBNdWx0aUJ5dGVUb1dpZGVDaGFyKCBDUF9BQ1AsIDAsIHRtcCwgLTEsIGJ1Ziwgc2l6ZW9mKGJ1Zikvc2l6ZW9mKFdDSEFSKSApOwoJICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICd5JzoKCSAgICBpZiAgICAgICAgKGNvdW50ID09IDQpIHsKICAgICAgICAgICAgICAgIHNwcmludGYoIHRtcCwgIiVkIiwgeHRpbWUtPndZZWFyICk7CgkgICAgfSBlbHNlIGlmIChjb3VudCA9PSAzKSB7CiAgICAgICAgICAgICAgICBzdHJjcHkoIHRtcCwgInl5eSIgKTsKCSAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgc3ByaW50ZiggdG1wLCAiJS4qZCIsIGNvdW50LCB4dGltZS0+d1llYXIgJSAxMDAgKTsKCSAgICB9CiAgICAgICAgICAgIE11bHRpQnl0ZVRvV2lkZUNoYXIoIENQX0FDUCwgMCwgdG1wLCAtMSwgYnVmLCBzaXplb2YoYnVmKS9zaXplb2YoV0NIQVIpICk7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgIGNhc2UgJ2cnOgoJICAgIGlmICAgICAgICAoY291bnQgPT0gMikgewoJICAgICAgIEZJWE1FKCJMT0NBTEVfSUNBTEVOREFSVFlQRSB1bmltcGxlbWVudGVkXG4iKTsKICAgICAgICAgICAgICAgc3RyY3B5KCB0bXAsICJBRCIgKTsKCSAgICB9IGVsc2UgewoJICAgICAgIC8qIFdpbiBBUEkgc2V6IHdlIGNvcHkgaXQgdmVyYmF0aW0gKi8KICAgICAgICAgICAgICAgIHN0cmNweSggdG1wLCAiZyIgKTsKCSAgICB9CiAgICAgICAgICAgIE11bHRpQnl0ZVRvV2lkZUNoYXIoIENQX0FDUCwgMCwgdG1wLCAtMSwgYnVmLCBzaXplb2YoYnVmKS9zaXplb2YoV0NIQVIpICk7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgIGNhc2UgJ2gnOgogICAgICAgICAgICAgIC8qIGhvdXJzIDE6MDAtMTI6MDAgLS0tIGlzIHRoaXMgcmlnaHQ/ICovCiAgICAgICAgICAgICAgc3ByaW50ZiggdG1wLCAiJS4qZCIsIGNvdW50LCAoeHRpbWUtPndIb3VyLTEpJTEyICsxKTsKICAgICAgICAgICAgICBNdWx0aUJ5dGVUb1dpZGVDaGFyKCBDUF9BQ1AsIDAsIHRtcCwgLTEsIGJ1Ziwgc2l6ZW9mKGJ1Zikvc2l6ZW9mKFdDSEFSKSApOwogICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgIGNhc2UgJ0gnOgogICAgICAgICAgICAgIHNwcmludGYoIHRtcCwgIiUuKmQiLCBjb3VudCwgeHRpbWUtPndIb3VyICk7CiAgICAgICAgICAgICAgTXVsdGlCeXRlVG9XaWRlQ2hhciggQ1BfQUNQLCAwLCB0bXAsIC0xLCBidWYsIHNpemVvZihidWYpL3NpemVvZihXQ0hBUikgKTsKICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICBjYXNlICdtJzoKICAgICAgICAgICAgICBzcHJpbnRmKCB0bXAsICIlLipkIiwgY291bnQsIHh0aW1lLT53TWludXRlICk7CiAgICAgICAgICAgICAgTXVsdGlCeXRlVG9XaWRlQ2hhciggQ1BfQUNQLCAwLCB0bXAsIC0xLCBidWYsIHNpemVvZihidWYpL3NpemVvZihXQ0hBUikgKTsKICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICBjYXNlICdzJzoKICAgICAgICAgICAgICBzcHJpbnRmKCB0bXAsICIlLipkIiwgY291bnQsIHh0aW1lLT53U2Vjb25kICk7CiAgICAgICAgICAgICAgTXVsdGlCeXRlVG9XaWRlQ2hhciggQ1BfQUNQLCAwLCB0bXAsIC0xLCBidWYsIHNpemVvZihidWYpL3NpemVvZihXQ0hBUikgKTsKICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICBjYXNlICd0JzoKCSAgICBHZXRMb2NhbGVJbmZvVyhsb2NhbGUsICh4dGltZS0+d0hvdXIgPCAxMikgPwoJCQkgICAgIExPQ0FMRV9TMTE1OSA6IExPQ0FMRV9TMjM1OSwKCQkJICAgICBidWYsIHNpemVvZihidWYpICk7CgkgICAgaWYgICAgICAgIChjb3VudCA9PSAxKSB7CgkgICAgICAgYnVmWzFdID0gMDsKCSAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQoKCSAvKiBubyBtYXR0ZXIgd2hhdCBoYXBwZW5lZCwgIHdlIG5lZWQgdG8gY2hlY2sgdGhpcyBuZXh0IAoJICAgIGNoYXJhY3RlciB0aGUgbmV4dCB0aW1lIHdlIGxvb3AgdGhyb3VnaCAqLwoJIGlucG9zLS07CgoJIC8qIGNhdCBidWYgb250byB0aGUgb3V0cHV0ICovCgkgb3V0bGVuID0gc3RybGVuVyhidWYpOwoJIGlmIChvdXRwb3MgKyBidWZsZW4gPCBvdXRsZW4pIHsKICAgICAgICAgICAgc3RyY3B5Vyggb3V0cHV0ICsgb3V0cG9zLCBidWYgKTsKCSAgICBvdXRwb3MgKz0gYnVmbGVuOwoJIH0gZWxzZSB7CiAgICAgICAgICAgIGxzdHJjcHluVyggb3V0cHV0ICsgb3V0cG9zLCBidWYsIG91dGxlbiAtIG91dHBvcyApOwoJICAgIE92ZXJmbG93ID0gMTsKCSAgICBicmVhazsgLyogQWJub3JtYWwgZXhpdCAqLwoJIH0KCgkgLyogcmVzZXQgdGhlIHZhcmlhYmxlcyB3ZSB1c2VkIHRoaXMgdGltZSAqLwoJIGNvdW50ID0gMDsKCSB0eXBlID0gJ1wwJzsKICAgICAgfSBlbHNlIGlmIChmb3JtYXRbaW5wb3NdID09IDApIHsKCSAvKiB3ZSBjYW4ndCBjaGVjayBmb3IgdGhpcyBhdCB0aGUgYmVnaW5uaW5nLCAgYmVjYXVzZSB0aGF0IAoJIHdvdWxkIGtlZXAgdXMgZnJvbSBwcmludGluZyBhIGZvcm1hdCBzcGVjIHRoYXQgZW5kZWQgdGhlIAoJIHN0cmluZyAqLwoJIG91dHB1dFtvdXRwb3NdID0gMDsKCSBicmVhazsgIC8qICBOT1JNQUwgRVhJVCAgKi8KICAgICAgfSBlbHNlIGlmIChjb3VudCkgewoJIC8qIGhvdyB3ZSBrZWVwIHRyYWNrIG9mIHRoZSBtaWRkbGUgb2YgYSBmb3JtYXQgc3BlYyAqLwoJIGNvdW50Kys7CgkgY29udGludWU7CiAgICAgIH0gZWxzZSBpZiAoIChkYXRldmFycyAmJiAoZm9ybWF0W2lucG9zXT09J2QnIHx8CgkJCQlmb3JtYXRbaW5wb3NdPT0nTScgfHwKCQkJCWZvcm1hdFtpbnBvc109PSd5JyB8fAoJCQkJZm9ybWF0W2lucG9zXT09J2cnKSAgKSB8fAoJCSAgKHRpbWV2YXJzICYmIChmb3JtYXRbaW5wb3NdPT0nSCcgfHwKCQkJCWZvcm1hdFtpbnBvc109PSdoJyB8fAoJCQkJZm9ybWF0W2lucG9zXT09J20nIHx8CgkJCQlmb3JtYXRbaW5wb3NdPT0ncycgfHwKCQkJCWZvcm1hdFtpbnBvc109PSd0JykgKSAgICApIHsKCSB0eXBlID0gZm9ybWF0W2lucG9zXTsKCSBjb3VudCA9IDE7CgkgY29udGludWU7CiAgICAgIH0gZWxzZSBpZiAoZm9ybWF0W2lucG9zXSA9PSAnXCcnKSB7CgkgaW5xdW90ZSA9IDE7CgkgY29udGludWU7CiAgICAgIH0gZWxzZSB7CgkgLyogdW5xdW90ZWQgbGl0ZXJhbHMgKi8KCSBvdXRwdXRbb3V0cG9zKytdID0gZm9ybWF0W2lucG9zXTsKICAgICAgfQogICB9CgogICBpZiAoT3ZlcmZsb3cpIHsKICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOU1VGRklDSUVOVF9CVUZGRVIpOwogICAgICBXQVJOKCIgYnVmZmVyIG92ZXJmbG93XG4iKTsKICAgfTsKCiAgIC8qIGZpbmFsIHN0cmluZyB0ZXJtaW5hdG9yIGFuZCBzYW5pdHkgY2hlY2sgKi8KICAgb3V0cG9zKys7CiAgIGlmIChvdXRwb3MgPiBvdXRsZW4tMSkgb3V0cG9zID0gb3V0bGVuLTE7CiAgIG91dHB1dFtvdXRwb3NdID0gJzAnOwoKICAgVFJBQ0UoIiByZXR1cm5pbmcgJXNcbiIsIGRlYnVnc3RyX3cob3V0cHV0KSk7CgkKICAgcmV0dXJuICghT3ZlcmZsb3cpID8gb3V0bGVuIDogMDsKICAgCn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlHZXREYXRlRm9ybWF0QQlbS0VSTkVMMzIuQF0KICogTWFrZXMgYW4gQVNDSUkgc3RyaW5nIG9mIHRoZSBkYXRlCiAqCiAqIFRoaXMgZnVuY3Rpb24gdXNlcyBmb3JtYXQgdG8gZm9ybWF0IHRoZSBkYXRlLCAgb3IsICBpZiBmb3JtYXQKICogaXMgTlVMTCwgdXNlcyB0aGUgZGVmYXVsdCBmb3IgdGhlIGxvY2FsZS4gIGZvcm1hdCBpcyBhIHN0cmluZwogKiBvZiBsaXRlcmFsIGZpZWxkcyBhbmQgY2hhcmFjdGVycyBhcyBmb2xsb3dzOgogKgogKiAtIGQgICAgc2luZ2xlLWRpZ2l0IChubyBsZWFkaW5nIHplcm8pIGRheSAob2YgbW9udGgpCiAqIC0gZGQgICB0d28tZGlnaXQgZGF5IChvZiBtb250aCkKICogLSBkZGQgIHNob3J0IGRheS1vZi13ZWVrIG5hbWUKICogLSBkZGRkIGxvbmcgZGF5LW9mLXdlZWsgbmFtZQogKiAtIE0gICAgc2luZ2xlLWRpZ2l0IG1vbnRoCiAqIC0gTU0gICB0d28tZGlnaXQgbW9udGgKICogLSBNTU0gIHNob3J0IG1vbnRoIG5hbWUKICogLSBNTU1NIGZ1bGwgbW9udGggbmFtZQogKiAtIHkgICAgdHdvLWRpZ2l0IHllYXIsIG5vIGxlYWRpbmcgMAogKiAtIHl5ICAgdHdvLWRpZ2l0IHllYXIKICogLSB5eXl5IGZvdXItZGlnaXQgeWVhcgogKiAtIGdnICAgZXJhIHN0cmluZwogKgogKi8KSU5UIFdJTkFQSSBHZXREYXRlRm9ybWF0QShMQ0lEIGxvY2FsZSxEV09SRCBmbGFncywKCQkJICAgICAgY29uc3QgU1lTVEVNVElNRSogeHRpbWUsCgkJCSAgICAgIExQQ1NUUiBmb3JtYXQsIExQU1RSIGRhdGUsSU5UIGRhdGVsZW4pIAp7CiAgIAogIGNoYXIgZm9ybWF0X2J1Zls0MF07CiAgTFBDU1RSIHRoaXNmb3JtYXQ7CiAgU1lTVEVNVElNRSB0OwogIExQU1lTVEVNVElNRSB0aGlzdGltZTsKICBMQ0lEIHRoaXNsb2NhbGU7CiAgSU5UIHJldDsKICBGSUxFVElNRSBmdDsKICBCT09MIHJlczsKCiAgVFJBQ0UoIigweCUwNGx4LDB4JTA4bHgsJXAsJXMsJXAsJWQpXG4iLAoJICAgICAgbG9jYWxlLGZsYWdzLHh0aW1lLGZvcm1hdCxkYXRlLGRhdGVsZW4pOwogIAogIGlmICghbG9jYWxlKSB7CiAgICAgbG9jYWxlID0gTE9DQUxFX1NZU1RFTV9ERUZBVUxUOwogICAgIH07CiAgCiAgaWYgKGxvY2FsZSA9PSBMT0NBTEVfU1lTVEVNX0RFRkFVTFQpIHsKICAgICB0aGlzbG9jYWxlID0gR2V0U3lzdGVtRGVmYXVsdExDSUQoKTsKICB9IGVsc2UgaWYgKGxvY2FsZSA9PSBMT0NBTEVfVVNFUl9ERUZBVUxUKSB7CiAgICAgdGhpc2xvY2FsZSA9IEdldFVzZXJEZWZhdWx0TENJRCgpOwogIH0gZWxzZSB7CiAgICAgdGhpc2xvY2FsZSA9IGxvY2FsZTsKICAgfTsKCiAgaWYgKHh0aW1lID09IE5VTEwpIHsKICAgICBHZXRTeXN0ZW1UaW1lKCZ0KTsKICB9IGVsc2UgewogICAgICAvKiBTaWxlbnRseSBjb3JyZWN0IHdEYXlPZldlZWsgYnkgdHJhbnNmb3JtaW5nIHRvIEZpbGVUaW1lIGFuZCBiYWNrIGFnYWluICovCiAgICAgIHJlcz1TeXN0ZW1UaW1lVG9GaWxlVGltZSh4dGltZSwmZnQpOwogICAgICAvKiBDaGVjayB5ZWFyKD8pL21vbnRoIGFuZCBkYXRlIGZvciByYW5nZSBhbmQgc2V0IEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSICBvbiBlcnJvciAqLwogICAgICAvKkZJWE1FOiBTeXN0ZW1UaW1lVG9GaWxlVGltZSBkb2Vzbid0IHlldCBkbyB0aGF0IGNoZWNrICovCiAgICAgIGlmKCFyZXMpCgl7CgkgIFNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CgkgIHJldHVybiAwOwoJfQogICAgICBGaWxlVGltZVRvU3lzdGVtVGltZSgmZnQsJnQpOyAKICAgICAKICB9OwogIHRoaXN0aW1lID0gJnQ7CgogIGlmIChmb3JtYXQgPT0gTlVMTCkgewogICAgIEdldExvY2FsZUluZm9BKHRoaXNsb2NhbGUsICgoZmxhZ3MmREFURV9MT05HREFURSkgCgkJCQkgICA/IExPQ0FMRV9TTE9OR0RBVEUKCQkJCSAgIDogTE9DQUxFX1NTSE9SVERBVEUpLAoJCSAgICAgIGZvcm1hdF9idWYsIHNpemVvZihmb3JtYXRfYnVmKSk7CiAgICAgdGhpc2Zvcm1hdCA9IGZvcm1hdF9idWY7CiAgfSBlbHNlIHsKICAgICB0aGlzZm9ybWF0ID0gZm9ybWF0OwogIH07CgogIAogIHJldCA9IE9MRV9HZXRGb3JtYXRBKHRoaXNsb2NhbGUsIGZsYWdzLCAwLCB0aGlzdGltZSwgdGhpc2Zvcm1hdCwgCgkJICAgICAgIGRhdGUsIGRhdGVsZW4pOwogIAoKICAgVFJBQ0UoCgkgICAgICAgIkdldERhdGVGb3JtYXRBKCkgcmV0dXJuaW5nICVkLCB3aXRoIGRhdGE9JXNcbiIsCgkgICAgICAgcmV0LCBkYXRlKTsKICByZXR1cm4gcmV0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlHZXREYXRlRm9ybWF0VwlbS0VSTkVMMzIuQF0KICogTWFrZXMgYSBVbmljb2RlIHN0cmluZyBvZiB0aGUgZGF0ZQogKgogKiBBY3RzIHRoZSBzYW1lIGFzIEdldERhdGVGb3JtYXRBKCksICBleGNlcHQgdGhhdCBpdCdzIFVuaWNvZGUuCiAqIEFjY2VwdHMgJiByZXR1cm5zIHNpemVzIGFzIGNvdW50cyBvZiBVbmljb2RlIGNoYXJhY3RlcnMuCiAqCiAqLwpJTlQgV0lOQVBJIEdldERhdGVGb3JtYXRXKExDSUQgbG9jYWxlLERXT1JEIGZsYWdzLAoJCQkgICAgICBjb25zdCBTWVNURU1USU1FKiB4dGltZSwKCQkJICAgICAgTFBDV1NUUiBmb3JtYXQsCgkJCSAgICAgIExQV1NUUiBkYXRlLCBJTlQgZGF0ZWxlbikKewogICB1bnNpZ25lZCBzaG9ydCBkYXRlYXJyW10gPSB7JzEnLCc5JywnOScsJzQnLCctJywnMScsJy0nLCcxJywwfTsKCiAgIEZJWE1FKCJTVFVCIChzaG91bGQgY2FsbCBPTEVfR2V0Rm9ybWF0VylcbiIpOyAgIAogICBsc3RyY3B5blcoZGF0ZSwgZGF0ZWFyciwgZGF0ZWxlbik7CiAgIHJldHVybiAoICBkYXRlbGVuIDwgOSkgPyBkYXRlbGVuIDogOTsKICAgCiAgIAp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgIEVudW1EYXRlRm9ybWF0c0EJKEtFUk5FTDMyLkApCiAqLwpCT09MIFdJTkFQSSBFbnVtRGF0ZUZvcm1hdHNBKAogIERBVEVGTVRfRU5VTVBST0NBIGxwRGF0ZUZtdEVudW1Qcm9jLCBMQ0lEIExvY2FsZSwgIERXT1JEIGR3RmxhZ3MpCnsKICBMQ0lEIExvYyA9IEdldFVzZXJEZWZhdWx0TENJRCgpOyAKICBpZighbHBEYXRlRm10RW51bVByb2MpCiAgICB7CiAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CiAgICAgIHJldHVybiBGQUxTRTsKICAgIH0KCiAgc3dpdGNoKCBMb2MgKQogewoKICAgY2FzZSAweDAwMDAwNDA3OiAgLyogKExvYywiZGVfREUiKSAqLwogICB7CiAgICBzd2l0Y2goZHdGbGFncykKICAgIHsKICAgICAgY2FzZSBEQVRFX1NIT1JUREFURToKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZGQuTU0ueXkiKSkgcmV0dXJuIFRSVUU7CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoImQuTS55eXl5IikpIHJldHVybiBUUlVFOwoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkLk1NLnl5IikpIHJldHVybiBUUlVFOwoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkLk0ueXkiKSkgcmV0dXJuIFRSVUU7CglyZXR1cm4gVFJVRTsKICAgICAgY2FzZSBEQVRFX0xPTkdEQVRFOgogICAgICAgIGlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZGRkZCxkLiBNTU1NIHl5eXkiKSkgcmV0dXJuIFRSVUU7CiAgICAgICAgaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkLiBNTU1NIHl5eXkiKSkgcmV0dXJuIFRSVUU7CiAgICAgICAgaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkLiBNTU0geXl5eSIpKSByZXR1cm4gVFJVRTsKCXJldHVybiBUUlVFOwogICAgICBkZWZhdWx0OgoJRklYTUUoIlVua25vd24gZGF0ZSBmb3JtYXQgKCVsZClcbiIsIGR3RmxhZ3MpOyAKCVNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CglyZXR1cm4gRkFMU0U7CiAgICAgfQogICB9ICAgICAgIAoKICAgY2FzZSAweDAwMDAwNDBjOiAgLyogKExvYywiZnJfRlIiKSAqLwogICB7CiAgICBzd2l0Y2goZHdGbGFncykKICAgIHsKICAgICAgY2FzZSBEQVRFX1NIT1JUREFURToKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZGQvTU0veXkiKSkgcmV0dXJuIFRSVUU7CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkLk1NLnl5IikpIHJldHVybiBUUlVFOwoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkZC1NTS15eSIpKSByZXR1cm4gVFJVRTsKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZGQvTU0veXl5eSIpKSByZXR1cm4gVFJVRTsKCXJldHVybiBUUlVFOwogICAgICBjYXNlIERBVEVfTE9OR0RBVEU6CiAgICAgICAgaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkZGRkIGQgTU1NTSB5eXl5IikpIHJldHVybiBUUlVFOwogICAgICAgIGlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZCBNTU0geXkiKSkgcmV0dXJuIFRSVUU7CiAgICAgICAgaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkIE1NTU0geXl5eSIpKSByZXR1cm4gVFJVRTsKCXJldHVybiBUUlVFOwogICAgICBkZWZhdWx0OgoJRklYTUUoIlVua25vd24gZGF0ZSBmb3JtYXQgKCVsZClcbiIsIGR3RmxhZ3MpOyAKCVNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CglyZXR1cm4gRkFMU0U7CiAgICAgfQogICB9CgogICBjYXNlIDB4MDAwMDBjMGM6ICAvKiAoTG9jLCJmcl9DQSIpICovCiAgIHsKICAgIHN3aXRjaChkd0ZsYWdzKQogICAgewogICAgICBjYXNlIERBVEVfU0hPUlREQVRFOgoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJ5eS1NTS1kZCIpKSByZXR1cm4gVFJVRTsKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZGQtTU0teXkiKSkgcmV0dXJuIFRSVUU7CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoInl5IE1NIGRkIikpIHJldHVybiBUUlVFOwoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkZC9NTS95eSIpKSByZXR1cm4gVFJVRTsKCXJldHVybiBUUlVFOwogICAgICBjYXNlIERBVEVfTE9OR0RBVEU6CiAgICAgICAgaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkIE1NTU0sIHl5eXkiKSkgcmV0dXJuIFRSVUU7CiAgICAgICAgaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkIE1NTSB5eXl5IikpIHJldHVybiBUUlVFOwoJcmV0dXJuIFRSVUU7CiAgICAgIGRlZmF1bHQ6CglGSVhNRSgiVW5rbm93biBkYXRlIGZvcm1hdCAoJWxkKVxuIiwgZHdGbGFncyk7IAoJU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKCXJldHVybiBGQUxTRTsKICAgICB9CiAgIH0KCiAgIGNhc2UgMHgwMDAwMDgwOTogIC8qIChMb2MsImVuX1VLIikgKi8gCiAgeyAgICAKICAgc3dpdGNoKGR3RmxhZ3MpCiAgICB7CiAgICAgIGNhc2UgREFURV9TSE9SVERBVEU6CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkL01NL3l5IikpIHJldHVybiBUUlVFOwoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkZC9NTS95eXl5IikpIHJldHVybiBUUlVFOwoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkL00veXkiKSkgcmV0dXJuIFRSVUU7CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoImQuTS55eSIpKSByZXR1cm4gVFJVRTsKCXJldHVybiBUUlVFOwogICAgICBjYXNlIERBVEVfTE9OR0RBVEU6CiAgICAgICAgaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkZCBNTU1NIHl5eXkiKSkgcmV0dXJuIFRSVUU7CiAgICAgICAgaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkIE1NTU0geXl5eSIpKSByZXR1cm4gVFJVRTsKCXJldHVybiBUUlVFOwogICAgICBkZWZhdWx0OgoJRklYTUUoIlVua25vd24gZGF0ZSBmb3JtYXQgKCVsZClcbiIsIGR3RmxhZ3MpOyAKCVNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CglyZXR1cm4gRkFMU0U7CiAgICB9CiAgfQoKICAgY2FzZSAweDAwMDAwYzA5OiAgLyogKExvYywiZW5fQVUiKSAqLyAgIAogIHsgICAgCiAgIHN3aXRjaChkd0ZsYWdzKQogICAgewogICAgICBjYXNlIERBVEVfU0hPUlREQVRFOgoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkL01NL3l5IikpIHJldHVybiBUUlVFOwoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkL00veXkiKSkgcmV0dXJuIFRSVUU7CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkL01NL3l5IikpIHJldHVybiBUUlVFOwoJcmV0dXJuIFRSVUU7CiAgICAgIGNhc2UgREFURV9MT05HREFURToKICAgICAgICBpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkZGQsZCBNTU1NIHl5eXkiKSkgcmV0dXJuIFRSVUU7CiAgICAgICAgaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkIE1NTU0geXl5eSIpKSByZXR1cm4gVFJVRTsKCXJldHVybiBUUlVFOwogICAgICBkZWZhdWx0OgoJRklYTUUoIlVua25vd24gZGF0ZSBmb3JtYXQgKCVsZClcbiIsIGR3RmxhZ3MpOyAKCVNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CglyZXR1cm4gRkFMU0U7CiAgICB9CiAgfQoKICAgY2FzZSAweDAwMDAxMDA5OiAgLyogKExvYywiZW5fQ0EiKSAqLyAKICB7ICAgIAogICBzd2l0Y2goZHdGbGFncykKICAgIHsKICAgICAgY2FzZSBEQVRFX1NIT1JUREFURToKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZGQvTU0veXkiKSkgcmV0dXJuIFRSVUU7CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoImQvTS95eSIpKSByZXR1cm4gVFJVRTsKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgieXktTU0tZGQiKSkgcmV0dXJuIFRSVUU7CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoIk0vZGQveXkiKSkgcmV0dXJuIFRSVUU7CglyZXR1cm4gVFJVRTsKICAgICAgY2FzZSBEQVRFX0xPTkdEQVRFOgogICAgICAgIGlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZC1NTU0teXkiKSkgcmV0dXJuIFRSVUU7CiAgICAgICAgaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJNTU1NIGQsIHl5eXkiKSkgcmV0dXJuIFRSVUU7CglyZXR1cm4gVFJVRTsKICAgICAgZGVmYXVsdDoKCUZJWE1FKCJVbmtub3duIGRhdGUgZm9ybWF0ICglbGQpXG4iLCBkd0ZsYWdzKTsgCglTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwoJcmV0dXJuIEZBTFNFOwogICAgfQogIH0KCiAgIGNhc2UgMHgwMDAwMTQwOTogIC8qIChMb2MsImVuX05aIikgKi8gCiAgeyAgICAKICAgc3dpdGNoKGR3RmxhZ3MpCiAgICB7CiAgICAgIGNhc2UgREFURV9TSE9SVERBVEU6CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoImQvTU0veXkiKSkgcmV0dXJuIFRSVUU7CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkL01NL3l5IikpIHJldHVybiBUUlVFOwoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkLk1NLnl5IikpIHJldHVybiBUUlVFOwoJcmV0dXJuIFRSVUU7CiAgICAgIGNhc2UgREFURV9MT05HREFURToKICAgICAgICBpZighKCpscERhdGVGbXRFbnVtUHJvYykoImQgTU1NTSB5eXl5IikpIHJldHVybiBUUlVFOwogICAgICAgIGlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZGRkZCwgZCBNTU1NIHl5eXkiKSkgcmV0dXJuIFRSVUU7CglyZXR1cm4gVFJVRTsKICAgICAgZGVmYXVsdDoKCUZJWE1FKCJVbmtub3duIGRhdGUgZm9ybWF0ICglbGQpXG4iLCBkd0ZsYWdzKTsgCglTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwoJcmV0dXJuIEZBTFNFOwogICAgfQogIH0KCiAgIGNhc2UgMHgwMDAwMTgwOTogIC8qIChMb2MsImVuX0lFIikgKi8gICAKICB7ICAgIAogICBzd2l0Y2goZHdGbGFncykKICAgIHsKICAgICAgY2FzZSBEQVRFX1NIT1JUREFURToKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZGQvTU0veXkiKSkgcmV0dXJuIFRSVUU7CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoImQvTS95eSIpKSByZXR1cm4gVFJVRTsKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZC5NLnl5IikpIHJldHVybiBUUlVFOwoJcmV0dXJuIFRSVUU7CiAgICAgIGNhc2UgREFURV9MT05HREFURToKICAgICAgICBpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkIE1NTU0geXl5eSIpKSByZXR1cm4gVFJVRTsKICAgICAgICBpZighKCpscERhdGVGbXRFbnVtUHJvYykoImQgTU1NTSB5eXl5IikpIHJldHVybiBUUlVFOwoJcmV0dXJuIFRSVUU7CiAgICAgIGRlZmF1bHQ6CglGSVhNRSgiVW5rbm93biBkYXRlIGZvcm1hdCAoJWxkKVxuIiwgZHdGbGFncyk7IAoJU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKCXJldHVybiBGQUxTRTsKICAgIH0KICB9CgogICBjYXNlIDB4MDAwMDFjMDk6ICAvKiAoTG9jLCJlbl9aQSIpICovICAgCiAgeyAgICAKICAgc3dpdGNoKGR3RmxhZ3MpCiAgICB7CiAgICAgIGNhc2UgREFURV9TSE9SVERBVEU6CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoInl5L01NL2RkIikpIHJldHVybiBUUlVFOwoJcmV0dXJuIFRSVUU7CiAgICAgIGNhc2UgREFURV9MT05HREFURToKICAgICAgICBpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkIE1NTU0geXl5eSIpKSByZXR1cm4gVFJVRTsKCXJldHVybiBUUlVFOwogICAgICBkZWZhdWx0OgoJRklYTUUoIlVua25vd24gZGF0ZSBmb3JtYXQgKCVsZClcbiIsIGR3RmxhZ3MpOyAKCVNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CglyZXR1cm4gRkFMU0U7CiAgICB9CiAgfQoKICAgY2FzZSAweDAwMDAyMDA5OiAgLyogKExvYywiZW5fSk0iKSAqLyAgCiAgeyAgICAKICAgc3dpdGNoKGR3RmxhZ3MpCiAgICB7CiAgICAgIGNhc2UgREFURV9TSE9SVERBVEU6CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkL01NL3l5eXkiKSkgcmV0dXJuIFRSVUU7CglyZXR1cm4gVFJVRTsKICAgICAgY2FzZSBEQVRFX0xPTkdEQVRFOgogICAgICAgIGlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZGRkZCxNTU1NIGRkLHl5eXkiKSkgcmV0dXJuIFRSVUU7CiAgICAgICAgaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJNTU1NIGRkLHl5eXkiKSkgcmV0dXJuIFRSVUU7CiAgICAgICAgaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkZGRkLGRkIE1NTU0seXl5eSIpKSByZXR1cm4gVFJVRTsKICAgICAgICBpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkIE1NTU0seXl5eSIpKSByZXR1cm4gVFJVRTsKCXJldHVybiBUUlVFOwogICAgICBkZWZhdWx0OgoJRklYTUUoIlVua25vd24gZGF0ZSBmb3JtYXQgKCVsZClcbiIsIGR3RmxhZ3MpOyAKCVNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CglyZXR1cm4gRkFMU0U7CiAgICB9CiAgfQoKICAgY2FzZSAweDAwMDAyODA5OiAgLyogKExvYywiZW5fQloiKSAqLwogICBjYXNlIDB4MDAwMDJjMDk6ICAvKiAoTG9jLCJlbl9UVCIpICovICAKICB7ICAgIAogICBzd2l0Y2goZHdGbGFncykKICAgIHsKICAgICAgY2FzZSBEQVRFX1NIT1JUREFURToKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZGQvTU0veXl5eSIpKSByZXR1cm4gVFJVRTsKCXJldHVybiBUUlVFOwogICAgICBjYXNlIERBVEVfTE9OR0RBVEU6CiAgICAgICAgaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkZGRkLGRkIE1NTU0geXl5eSIpKSByZXR1cm4gVFJVRTsKCXJldHVybiBUUlVFOwogICAgICBkZWZhdWx0OgoJRklYTUUoIlVua25vd24gZGF0ZSBmb3JtYXQgKCVsZClcbiIsIGR3RmxhZ3MpOyAKCVNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CglyZXR1cm4gRkFMU0U7CiAgICB9CiAgfQoKICAgZGVmYXVsdDogIC8qIGRlZmF1bHQgdG8gVVMgRW5nbGlzaCAiZW5fVVMiICovCiAgewogICBzd2l0Y2goZHdGbGFncykKICAgIHsKICAgICAgY2FzZSBEQVRFX1NIT1JUREFURToKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiTS9kL3l5IikpIHJldHVybiBUUlVFOwoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJNL2QveXl5eSIpKSByZXR1cm4gVFJVRTsKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiTU0vZGQveXkiKSkgcmV0dXJuIFRSVUU7CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoIk1NL2RkL3l5eXkiKSkgcmV0dXJuIFRSVUU7CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoInl5L01NL2RkIikpIHJldHVybiBUUlVFOwoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkZC1NTU0teXkiKSkgcmV0dXJuIFRSVUU7CglyZXR1cm4gVFJVRTsKICAgICAgY2FzZSBEQVRFX0xPTkdEQVRFOgogICAgICAgIGlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZGRkZCwgTU1NTSBkZCwgeXl5eSIpKSByZXR1cm4gVFJVRTsKICAgICAgICBpZighKCpscERhdGVGbXRFbnVtUHJvYykoIk1NTU0gZGQsIHl5eXkiKSkgcmV0dXJuIFRSVUU7CiAgICAgICAgaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkZGRkLCBkZCBNTU1NLCB5eXl5IikpIHJldHVybiBUUlVFOwogICAgICAgIGlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZGQgTU1NTSwgeXl5eSIpKSByZXR1cm4gVFJVRTsKCXJldHVybiBUUlVFOwogICAgICBkZWZhdWx0OgoJRklYTUUoIlVua25vd24gZGF0ZSBmb3JtYXQgKCVsZClcbiIsIGR3RmxhZ3MpOyAKCVNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CglyZXR1cm4gRkFMU0U7CiAgICB9CiAgfQogfQp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgIEVudW1EYXRlRm9ybWF0c1cJKEtFUk5FTDMyLkApCiAqLwpCT09MIFdJTkFQSSBFbnVtRGF0ZUZvcm1hdHNXKAogIERBVEVGTVRfRU5VTVBST0NXIGxwRGF0ZUZtdEVudW1Qcm9jLCBMQ0lEIExvY2FsZSwgRFdPUkQgZHdGbGFncykKewogIEZJWE1FKCIoJXAsICVsZCwgJWxkKTogc3R1YlxuIiwgbHBEYXRlRm10RW51bVByb2MsIExvY2FsZSwgZHdGbGFncyk7CiAgU2V0TGFzdEVycm9yKEVSUk9SX0NBTExfTk9UX0lNUExFTUVOVEVEKTsKICByZXR1cm4gRkFMU0U7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgRW51bVRpbWVGb3JtYXRzQQkoS0VSTkVMMzIuQCkKICovCkJPT0wgV0lOQVBJIEVudW1UaW1lRm9ybWF0c0EoCiAgVElNRUZNVF9FTlVNUFJPQ0EgbHBUaW1lRm10RW51bVByb2MsIExDSUQgTG9jYWxlLCBEV09SRCBkd0ZsYWdzKQp7CiAgTENJRCBMb2MgPSBHZXRVc2VyRGVmYXVsdExDSUQoKTsgCiAgaWYoIWxwVGltZUZtdEVudW1Qcm9jKQogICAgewogICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwogICAgICByZXR1cm4gRkFMU0U7CiAgICB9CiAgaWYoZHdGbGFncykKICAgIHsKICAgICAgRklYTUUoIlVua25vd24gdGltZSBmb3JtYXQgKCVsZClcbiIsIGR3RmxhZ3MpOyAKICAgIH0KCiAgc3dpdGNoKCBMb2MgKQogewogICBjYXNlIDB4MDAwMDA0MDc6ICAvKiAoTG9jLCJkZV9ERSIpICovCiAgIHsKICAgIGlmKCEoKmxwVGltZUZtdEVudW1Qcm9jKSgiSEgubW0iKSkgcmV0dXJuIFRSVUU7IAogICAgaWYoISgqbHBUaW1lRm10RW51bVByb2MpKCJISDptbTpzcyIpKSByZXR1cm4gVFJVRTsKICAgIGlmKCEoKmxwVGltZUZtdEVudW1Qcm9jKSgiSDptbTpzcyIpKSByZXR1cm4gVFJVRTsKICAgIGlmKCEoKmxwVGltZUZtdEVudW1Qcm9jKSgiSC5tbSIpKSByZXR1cm4gVFJVRTsKICAgIGlmKCEoKmxwVGltZUZtdEVudW1Qcm9jKSgiSC5tbSdVaHInIikpIHJldHVybiBUUlVFOwogICAgcmV0dXJuIFRSVUU7CiAgIH0gICAgICAgCgogICBjYXNlIDB4MDAwMDA0MGM6ICAvKiAoTG9jLCJmcl9GUiIpICovCiAgIGNhc2UgMHgwMDAwMGMwYzogIC8qIChMb2MsImZyX0NBIikgKi8KICAgewogICAgaWYoISgqbHBUaW1lRm10RW51bVByb2MpKCJIOm1tIikpIHJldHVybiBUUlVFOwogICAgaWYoISgqbHBUaW1lRm10RW51bVByb2MpKCJISDptbTpzcyIpKSByZXR1cm4gVFJVRTsKICAgIGlmKCEoKmxwVGltZUZtdEVudW1Qcm9jKSgiSDptbTpzcyIpKSByZXR1cm4gVFJVRTsKICAgIGlmKCEoKmxwVGltZUZtdEVudW1Qcm9jKSgiSEgubW0iKSkgcmV0dXJuIFRSVUU7CiAgICBpZighKCpscFRpbWVGbXRFbnVtUHJvYykoIkhIJ2gnbW0iKSkgcmV0dXJuIFRSVUU7CiAgICByZXR1cm4gVFJVRTsKICAgfQoKICAgY2FzZSAweDAwMDAwODA5OiAgLyogKExvYywiZW5fVUsiKSAqLwogICBjYXNlIDB4MDAwMDBjMDk6ICAvKiAoTG9jLCJlbl9BVSIpICovIAogICBjYXNlIDB4MDAwMDE0MDk6ICAvKiAoTG9jLCJlbl9OWiIpICovCiAgIGNhc2UgMHgwMDAwMTgwOTogIC8qIChMb2MsImVuX0lFIikgKi8gCiAgIHsKICAgIGlmKCEoKmxwVGltZUZtdEVudW1Qcm9jKSgiaDptbTpzcyB0dCIpKSByZXR1cm4gVFJVRTsKICAgIGlmKCEoKmxwVGltZUZtdEVudW1Qcm9jKSgiSEg6bW06c3MiKSkgcmV0dXJuIFRSVUU7CiAgICBpZighKCpscFRpbWVGbXRFbnVtUHJvYykoIkg6bW06c3MiKSkgcmV0dXJuIFRSVUU7CiAgICByZXR1cm4gVFJVRTsKICAgfQoKICAgY2FzZSAweDAwMDAxYzA5OiAgLyogKExvYywiZW5fWkEiKSAqLyAgIAogICBjYXNlIDB4MDAwMDI4MDk6ICAvKiAoTG9jLCJlbl9CWiIpICovCiAgIGNhc2UgMHgwMDAwMmMwOTogIC8qIChMb2MsImVuX1RUIikgKi8gCiAgIHsKICAgIGlmKCEoKmxwVGltZUZtdEVudW1Qcm9jKSgiaDptbTpzcyB0dCIpKSByZXR1cm4gVFJVRTsKICAgIGlmKCEoKmxwVGltZUZtdEVudW1Qcm9jKSgiaGg6bW06c3MgdHQiKSkgcmV0dXJuIFRSVUU7IAogICAgcmV0dXJuIFRSVUU7ICAKICAgfQoKICAgZGVmYXVsdDogIC8qIGRlZmF1bHQgdG8gVVMgc3R5bGUgImVuX1VTIiAqLyAgIAogICB7CiAgICBpZighKCpscFRpbWVGbXRFbnVtUHJvYykoImg6bW06c3MgdHQiKSkgcmV0dXJuIFRSVUU7CiAgICBpZighKCpscFRpbWVGbXRFbnVtUHJvYykoImhoOm1tOnNzIHR0IikpIHJldHVybiBUUlVFOwogICAgaWYoISgqbHBUaW1lRm10RW51bVByb2MpKCJIOm1tOnNzIikpIHJldHVybiBUUlVFOwogICAgaWYoISgqbHBUaW1lRm10RW51bVByb2MpKCJISDptbTpzcyIpKSByZXR1cm4gVFJVRTsKICAgIHJldHVybiBUUlVFOwogICB9CiB9Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgRW51bVRpbWVGb3JtYXRzVwkoS0VSTkVMMzIuQCkKICovCkJPT0wgV0lOQVBJIEVudW1UaW1lRm9ybWF0c1coCiAgVElNRUZNVF9FTlVNUFJPQ1cgbHBUaW1lRm10RW51bVByb2MsIExDSUQgTG9jYWxlLCBEV09SRCBkd0ZsYWdzKQp7CiAgRklYTUUoIiglcCwlbGQsJWxkKTogc3R1YlxuIiwgbHBUaW1lRm10RW51bVByb2MsIExvY2FsZSwgZHdGbGFncyk7CiAgU2V0TGFzdEVycm9yKEVSUk9SX0NBTExfTk9UX0lNUExFTUVOVEVEKTsKICByZXR1cm4gRkFMU0U7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGp1c3QgbG9jYWxseSAhCiAqICBEZXNjcmlwdGlvbjogSW52ZXJ0cyBhIHN0cmluZy4KICovIApzdGF0aWMgdm9pZCBPTEVfSW52ZXJ0U3RyaW5nKGNoYXIqIHN0cmluZykKeyAgICAKICAgIGNoYXIgICAgc1RtcEFycmF5WzEyOF07CiAgICBJTlQgICAgIGNvdW50ZXIsIGkgPSAwOwoKICAgIGZvciAoY291bnRlciA9IHN0cmxlbihzdHJpbmcpOyBjb3VudGVyID4gMDsgY291bnRlci0tKQogICAgewogICAgICAgIG1lbWNweShzVG1wQXJyYXkgKyBpLCBzdHJpbmcgKyBjb3VudGVyLTEsIDEpOwogICAgICAgIGkrKzsKICAgIH0KICAgIG1lbWNweShzVG1wQXJyYXkgKyBpLCAiXDAiLCAxKTsKICAgIHN0cmNweShzdHJpbmcsIHNUbXBBcnJheSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBqdXN0IGxvY2FsbHkgIQogKiAgRGVzY3JpcHRpb246IFRlc3QgaWYgdGhlIGdpdmVuIHN0cmluZyAocHNOdW1iZXIpIGlzIHZhbGlkIG9yIG5vdC4KICogICAgICAgICAgICAgICBUaGUgdmFsaWQgY2hhcmFjdGVycyBhcmUgdGhlIGZvbGxvd2luZzoKICogICAgICAgICAgICAgICAtIENoYXJhY3RlcnMgJzAnIHRocm91Z2ggJzknLiAKICogICAgICAgICAgICAgICAtIE9uZSBkZWNpbWFsIHBvaW50IChkb3QpIGlmIHRoZSBudW1iZXIgaXMgYSBmbG9hdGluZy1wb2ludCB2YWx1ZS4gCiAqICAgICAgICAgICAgICAgLSBBIG1pbnVzIHNpZ24gaW4gdGhlIGZpcnN0IGNoYXJhY3RlciBwb3NpdGlvbiBpZiB0aGUgbnVtYmVyIGlzIAogKiAgICAgICAgICAgICAgICAgYSBuZWdhdGl2ZSB2YWx1ZS4KICogICAgICAgICAgICAgIElmIHRoZSBmdW5jdGlvbiBzdWNjZWVkcywgcHNCZWZvcmUvcHNBZnRlciB3aWxsIHBvaW50IHRvIHRoZSBzdHJpbmcKICogICAgICAgICAgICAgIG9uIHRoZSByaWdodC9sZWZ0IG9mIHRoZSBkZWNpbWFsIHN5bWJvbC4gcGJOZWdhdGl2ZSBpbmRpY2F0ZXMgaWYgdGhlIAogKiAgICAgICAgICAgICAgbnVtYmVyIGlzIG5lZ2F0aXZlLgogKi8Kc3RhdGljIElOVCBPTEVfR2V0TnVtYmVyQ29tcG9uZW50cyhjaGFyKiBwSW5wdXQsIGNoYXIqIHBzQmVmb3JlLCBjaGFyKiBwc0FmdGVyLCBCT09MKiBwYk5lZ2F0aXZlKQp7CmNoYXIJc051bWJlclNldFtdID0gIjAxMjM0NTY3ODkiOwpCT09MCWJJbkRlY2ltYWwgPSBGQUxTRTsKCgkvKiBUZXN0IGlmIHdlIGRvIGhhdmUgYSBtaW51cyBzaWduICovCglpZiAoICpwSW5wdXQgPT0gJy0nICkKCXsKCQkqcGJOZWdhdGl2ZSA9IFRSVUU7CgkJcElucHV0Kys7IC8qIEp1bXAgdG8gdGhlIG5leHQgY2hhcmFjdGVyLiAqLwoJfQoJCgl3aGlsZSgqcElucHV0ICE9ICdcMCcpCgl7CgkJLyogRG8gd2UgaGF2ZSBhIHZhbGlkIG51bWVyaWMgY2hhcmFjdGVyICovCgkJaWYgKCBzdHJjaHIoc051bWJlclNldCwgKnBJbnB1dCkgIT0gTlVMTCApCgkJewoJCQlpZiAoYkluRGVjaW1hbCA9PSBUUlVFKQogICAgICAgICAgICAgICAgKnBzQWZ0ZXIrKyA9ICpwSW5wdXQ7CgkJCWVsc2UKICAgICAgICAgICAgICAgICpwc0JlZm9yZSsrID0gKnBJbnB1dDsKCQl9CgkJZWxzZQoJCXsKCQkJLyogSXMgdGhpcyBhIGRlY2ltYWwgcG9pbnQgKGRvdCkgKi8KCQkJaWYgKCAqcElucHV0ID09ICcuJyApCgkJCXsKCQkJCS8qIElzIGl0IHRoZSBmaXJzdCB0aW1lIHdlIGZpbmQgaXQgKi8KCQkJCWlmICgoYkluRGVjaW1hbCA9PSBGQUxTRSkpCgkJCQkJYkluRGVjaW1hbCA9IFRSVUU7CgkJCQllbHNlCgkJCQkJcmV0dXJuIC0xOyAvKiBFUlJPUjogSW52YWxpZCBwYXJhbWV0ZXIgKi8KCQkJfQoJCQllbHNlCgkJCXsKCQkJCS8qIEl0J3MgbmVpdGhlciBhIG51bWVyaWMgY2hhcmFjdGVyLCBub3IgYSBkZWNpbWFsIHBvaW50LgoJCQkJICogVGh1cywgcmV0dXJuIGFuIGVycm9yLgogICAgICAgICAgICAgICAgICovCgkJCQlyZXR1cm4gLTE7CgkJCX0KCQl9CiAgICAgICAgcElucHV0Kys7Cgl9CgkKCS8qIEFkZCBhbiBFbmQgb2YgTGluZSBjaGFyYWN0ZXIgdG8gdGhlIG91dHB1dCBidWZmZXJzICovCgkqcHNCZWZvcmUgPSAnXDAnOwoJKnBzQWZ0ZXIgPSAnXDAnOwoKCXJldHVybiAwOyAKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQganVzdCBsb2NhbGx5ICEKICogIERlc2NyaXB0aW9uOiBBIG51bWJlciBjb3VsZCBiZSBmb3JtYXR0ZWQgdXNpbmcgZGlmZmVyZW50IG51bWJlcnMgCiAqICAgICAgICAgICAgICAgb2YgImRpZ2l0cyBpbiBncm91cCIgKGV4YW1wbGU6IDQ7MzsyOzApLgogKiAgICAgICAgICAgICAgIFRoZSBmaXJzdCBwYXJhbWV0ZXIgb2YgdGhpcyBmdW5jdGlvbiBpcyBhbiBhcnJheQogKiAgICAgICAgICAgICAgIGNvbnRhaW5pbmcgdGhlIHJ1bGUgdG8gYmUgdXNlZC4gSXRzIGZvcm1hdCBpcyB0aGUgZm9sbG93aW5nOgogKiAgICAgICAgICAgICAgIHxOREd8REcxfERHMnwuLi58MHwKICogICAgICAgICAgICAgICB3aGVyZSBOREcgaXMgdGhlIG51bWJlciBvZiB1c2VkICJkaWdpdHMgaW4gZ3JvdXAiIGFuZCBERzEsIERHMiwKICogICAgICAgICAgICAgICBhcmUgdGhlIGNvcnJlc3BvbmRpbmcgImRpZ2l0cyBpbiBncm91cCIuCiAqICAgICAgICAgICAgICAgVGh1cywgdGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBncm91cGluZyB2YWx1ZSBpbiB0aGUgYXJyYXkKICogICAgICAgICAgICAgICBwb2ludGVkIGJ5IHRoZSBzZWNvbmQgcGFyYW1ldGVyLgogKi8Kc3RhdGljIElOVCBPTEVfR2V0R3JvdXBpbmcoY2hhciogc1J1bGUsIElOVCBpbmRleCkKewogICAgY2hhciAgICBzRGF0YVsyXSwgc1J1bGVTaXplWzJdOwogICAgSU5UICAgICBuRGF0YSwgblJ1bGVTaXplOwoKICAgIG1lbWNweShzUnVsZVNpemUsIHNSdWxlLCAxKTsKICAgIG1lbWNweShzUnVsZVNpemUrMSwgIlwwIiwgMSk7CiAgICBuUnVsZVNpemUgPSBhdG9pKHNSdWxlU2l6ZSk7CgogICAgaWYgKGluZGV4ID4gMCAmJiBpbmRleCA8IG5SdWxlU2l6ZSkKICAgIHsKICAgICAgICBtZW1jcHkoc0RhdGEsIHNSdWxlK2luZGV4LCAxKTsKICAgICAgICBtZW1jcHkoc0RhdGErMSwgIlwwIiwgMSk7CiAgICAgICAgbkRhdGEgPSBhdG9pKHNEYXRhKTsgICAgICAgICAgICAKICAgIH0KICAgICAgICAKICAgIGVsc2UKICAgIHsKICAgICAgICBtZW1jcHkoc0RhdGEsIHNSdWxlK25SdWxlU2l6ZS0xLCAxKTsKICAgICAgICBtZW1jcHkoc0RhdGErMSwgIlwwIiwgMSk7CiAgICAgICAgbkRhdGEgPSBhdG9pKHNEYXRhKTsgICAgICAgICAgICAKICAgIH0KICAgIAogICAgcmV0dXJuIG5EYXRhOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgIEdldE51bWJlckZvcm1hdEEJKEtFUk5FTDMyLkApCiAqLwpJTlQgV0lOQVBJIEdldE51bWJlckZvcm1hdEEoTENJRCBsb2NhbGUsIERXT1JEIGR3ZmxhZ3MsCgkJCSAgICAgICBMUENTVFIgbHB2YWx1ZSwgICBjb25zdCBOVU1CRVJGTVRBICogbHBGb3JtYXQsCgkJCSAgICAgICBMUFNUUiBscE51bWJlclN0ciwgaW50IGNjaE51bWJlcikKewogICAgY2hhciAgIHNOdW1iZXJEaWdpdHNbM10sIHNEZWNpbWFsU3ltYm9sWzVdLCBzRGlnaXRzSW5Hcm91cFsxMV0sIHNEaWdpdEdyb3VwU3ltYm9sWzVdLCBzSUxaZXJvWzJdOwogICAgSU5UICAgIG5OdW1iZXJEaWdpdHMsIG5OdW1iZXJEZWNpbWFsLCBpLCBqLCBuQ291bnRlciwgblN0ZXAsIG5SdWxlSW5kZXgsIG5Hcm91cGluZywgbkRpZ2l0cywgcmV0VmFsLCBuTFo7CiAgICBjaGFyICAgc051bWJlclsxMjhdLCBzRGVzdGluYXRpb25bMTI4XSwgc0RpZ2l0c0FmdGVyRGVjaW1hbFsxMF0sIHNEaWdpdHNCZWZvcmVEZWNpbWFsWzEyOF07CiAgICBjaGFyICAgc1J1bGVbMTBdLCBzU2VtaUNvbHVtbltdPSI7Iiwgc0J1ZmZlcls1XSwgc05lZ051bWJlclsyXTsgICAgCiAgICBjaGFyICAgKnBTdHIgPSBOVUxMLCAqcFRtcFN0ciA9IE5VTEw7CiAgICBMQ0lEICAgc3lzdGVtRGVmYXVsdExDSUQ7CiAgICBCT09MICAgYk5lZ2F0aXZlID0gRkFMU0U7CiAgICBlbnVtICAgT3BlcmF0aW9ucyAKICAgIHsKICAgICAgICBVU0VfUEFSQU1FVEVSLAogICAgICAgIFVTRV9MT0NBTEVJTkZPLAogICAgICAgIFVTRV9TWVNURU1ERUZBVUxULAogICAgICAgIFJFVFVSTl9FUlJPUgogICAgfSB1c2VkX29wZXJhdGlvbjsKCiAgICBzdHJuY3B5KHNOdW1iZXIsIGxwdmFsdWUsIDEyOCk7CiAgICBzTnVtYmVyWzEyN10gPSAnXDAnOwoKICAgIC8qIE1ha2Ugc3VyZSB3ZSBoYXZlIGEgdmFsaWQgaW5wdXQgc3RyaW5nLCBnZXQgdGhlIG51bWJlcgogICAgICogb2YgZGlnaXRzIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIGRlY2ltYWwgc3ltYm9sLCBhbmQgY2hlY2sKICAgICAqIGlmIHRoaXMgaXMgYSBuZWdhdGl2ZSBudW1iZXIuCiAgICAgKi8KICAgIGlmICggT0xFX0dldE51bWJlckNvbXBvbmVudHMoc051bWJlciwgc0RpZ2l0c0JlZm9yZURlY2ltYWwsIHNEaWdpdHNBZnRlckRlY2ltYWwsICZiTmVnYXRpdmUpICE9IC0xKQogICAgewogICAgICAgIG5OdW1iZXJEZWNpbWFsID0gc3RybGVuKHNEaWdpdHNCZWZvcmVEZWNpbWFsKTsKICAgICAgICBuRGlnaXRzID0gc3RybGVuKHNEaWdpdHNBZnRlckRlY2ltYWwpOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgLyogV2hpY2ggc291cmNlIHdpbGwgd2UgdXNlIHRvIGZvcm1hdCB0aGUgc3RyaW5nICovCiAgICB1c2VkX29wZXJhdGlvbiA9IFJFVFVSTl9FUlJPUjsKICAgIGlmIChscEZvcm1hdCAhPSBOVUxMKQogICAgewogICAgICAgIGlmIChkd2ZsYWdzID09IDApCiAgICAgICAgICAgIHVzZWRfb3BlcmF0aW9uID0gVVNFX1BBUkFNRVRFUjsgCiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgaWYgKGR3ZmxhZ3MgJiBMT0NBTEVfTk9VU0VST1ZFUlJJREUpCiAgICAgICAgICAgIHVzZWRfb3BlcmF0aW9uID0gVVNFX0xPQ0FMRUlORk87CiAgICAgICAgZWxzZQogICAgICAgICAgICB1c2VkX29wZXJhdGlvbiA9IFVTRV9TWVNURU1ERUZBVUxUOwogICAgfQoKICAgIC8qIExvYWQgdGhlIGZpZWxkcyB3ZSBuZWVkICovCiAgICBzd2l0Y2godXNlZF9vcGVyYXRpb24pCiAgICB7CiAgICBjYXNlIFVTRV9MT0NBTEVJTkZPOgogICAgICAgIEdldExvY2FsZUluZm9BKGxvY2FsZSwgTE9DQUxFX0lESUdJVFMsIHNOdW1iZXJEaWdpdHMsIHNpemVvZihzTnVtYmVyRGlnaXRzKSk7CiAgICAgICAgR2V0TG9jYWxlSW5mb0EobG9jYWxlLCBMT0NBTEVfU0RFQ0lNQUwsIHNEZWNpbWFsU3ltYm9sLCBzaXplb2Yoc0RlY2ltYWxTeW1ib2wpKTsKICAgICAgICBHZXRMb2NhbGVJbmZvQShsb2NhbGUsIExPQ0FMRV9TR1JPVVBJTkcsIHNEaWdpdHNJbkdyb3VwLCBzaXplb2Yoc0RpZ2l0c0luR3JvdXApKTsKICAgICAgICBHZXRMb2NhbGVJbmZvQShsb2NhbGUsIExPQ0FMRV9TVEhPVVNBTkQsIHNEaWdpdEdyb3VwU3ltYm9sLCBzaXplb2Yoc0RpZ2l0R3JvdXBTeW1ib2wpKTsKICAgICAgICBHZXRMb2NhbGVJbmZvQShsb2NhbGUsIExPQ0FMRV9JTFpFUk8sIHNJTFplcm8sIHNpemVvZihzSUxaZXJvKSk7CiAgICAgICAgR2V0TG9jYWxlSW5mb0EobG9jYWxlLCBMT0NBTEVfSU5FR05VTUJFUiwgc05lZ051bWJlciwgc2l6ZW9mKHNOZWdOdW1iZXIpKTsKICAgICAgICBicmVhazsKICAgIGNhc2UgVVNFX1BBUkFNRVRFUjoKICAgICAgICBzcHJpbnRmKHNOdW1iZXJEaWdpdHMsICIlZCIsbHBGb3JtYXQtPk51bURpZ2l0cyk7CiAgICAgICAgc3RyY3B5KHNEZWNpbWFsU3ltYm9sLCBscEZvcm1hdC0+bHBEZWNpbWFsU2VwKTsKICAgICAgICBzcHJpbnRmKHNEaWdpdHNJbkdyb3VwLCAiJWQ7MCIsbHBGb3JtYXQtPkdyb3VwaW5nKTsKICAgICAgICBzdHJjcHkoc0RpZ2l0R3JvdXBTeW1ib2wsIGxwRm9ybWF0LT5scFRob3VzYW5kU2VwKTsKICAgICAgICBzcHJpbnRmKHNJTFplcm8sICIlZCIsbHBGb3JtYXQtPkxlYWRpbmdaZXJvKTsKICAgICAgICBzcHJpbnRmKHNOZWdOdW1iZXIsICIlZCIsbHBGb3JtYXQtPk5lZ2F0aXZlT3JkZXIpOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBVU0VfU1lTVEVNREVGQVVMVDoKICAgICAgICBzeXN0ZW1EZWZhdWx0TENJRCA9IEdldFN5c3RlbURlZmF1bHRMQ0lEKCk7CiAgICAgICAgR2V0TG9jYWxlSW5mb0Eoc3lzdGVtRGVmYXVsdExDSUQsIExPQ0FMRV9JRElHSVRTLCBzTnVtYmVyRGlnaXRzLCBzaXplb2Yoc051bWJlckRpZ2l0cykpOwogICAgICAgIEdldExvY2FsZUluZm9BKHN5c3RlbURlZmF1bHRMQ0lELCBMT0NBTEVfU0RFQ0lNQUwsIHNEZWNpbWFsU3ltYm9sLCBzaXplb2Yoc0RlY2ltYWxTeW1ib2wpKTsKICAgICAgICBHZXRMb2NhbGVJbmZvQShzeXN0ZW1EZWZhdWx0TENJRCwgTE9DQUxFX1NHUk9VUElORywgc0RpZ2l0c0luR3JvdXAsIHNpemVvZihzRGlnaXRzSW5Hcm91cCkpOwogICAgICAgIEdldExvY2FsZUluZm9BKHN5c3RlbURlZmF1bHRMQ0lELCBMT0NBTEVfU1RIT1VTQU5ELCBzRGlnaXRHcm91cFN5bWJvbCwgc2l6ZW9mKHNEaWdpdEdyb3VwU3ltYm9sKSk7CiAgICAgICAgR2V0TG9jYWxlSW5mb0Eoc3lzdGVtRGVmYXVsdExDSUQsIExPQ0FMRV9JTFpFUk8sIHNJTFplcm8sIHNpemVvZihzSUxaZXJvKSk7CiAgICAgICAgR2V0TG9jYWxlSW5mb0Eoc3lzdGVtRGVmYXVsdExDSUQsIExPQ0FMRV9JTkVHTlVNQkVSLCBzTmVnTnVtYmVyLCBzaXplb2Yoc05lZ051bWJlcikpOwogICAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwogICAgICAgIHJldHVybiAwOwogICAgfQoKICAgIG5OdW1iZXJEaWdpdHMgPSBhdG9pKHNOdW1iZXJEaWdpdHMpOwogICAgCiAgICAvKiBSZW1vdmUgdGhlICI7IiAqLwogICAgaT0wOwogICAgaiA9IDE7CiAgICBmb3IgKG5Db3VudGVyPTA7IG5Db3VudGVyPHN0cmxlbihzRGlnaXRzSW5Hcm91cCk7IG5Db3VudGVyKyspCiAgICB7CiAgICAgICAgaWYgKCBtZW1jbXAoc0RpZ2l0c0luR3JvdXAgKyBuQ291bnRlciwgc1NlbWlDb2x1bW4sIDEpICE9IDAgKQogICAgICAgIHsKICAgICAgICAgICAgbWVtY3B5KHNSdWxlICsgaiwgc0RpZ2l0c0luR3JvdXAgKyBuQ291bnRlciwgMSk7CiAgICAgICAgICAgIGkrKzsKICAgICAgICAgICAgaisrOwogICAgICAgIH0KICAgIH0KICAgIHNwcmludGYoc0J1ZmZlciwgIiVkIiwgaSk7CiAgICBtZW1jcHkoc1J1bGUsIHNCdWZmZXIsIDEpOyAvKiBOdW1iZXIgb2YgZGlnaXRzIGluIHRoZSBncm91cHMgKCB1c2VkIGJ5IE9MRV9HZXRHcm91cGluZygpICkgKi8KICAgIG1lbWNweShzUnVsZSArIGosICJcMCIsIDEpOwogICAgCiAgICAvKiBGaXJzdCwgZm9ybWF0IHRoZSBkaWdpdHMgYmVmb3JlIHRoZSBkZWNpbWFsLiAqLwogICAgaWYgKChuTnVtYmVyRGVjaW1hbD4wKSAmJiAoYXRvaShzRGlnaXRzQmVmb3JlRGVjaW1hbCkgIT0gMCkpIAogICAgewogICAgICAgIC8qIFdvcmtpbmcgb24gYW4gaW52ZXJ0ZWQgc3RyaW5nIGlzIGVhc2llciAhICovCiAgICAgICAgT0xFX0ludmVydFN0cmluZyhzRGlnaXRzQmVmb3JlRGVjaW1hbCk7CgogICAgICAgIG5TdGVwID0gbkNvdW50ZXIgPSBpID0gaiA9IDA7CiAgICAgICAgblJ1bGVJbmRleCA9IDE7CiAgICAgICAgbkdyb3VwaW5nID0gT0xFX0dldEdyb3VwaW5nKHNSdWxlLCBuUnVsZUluZGV4KTsKICAgICAgICAKICAgICAgICAvKiBIZXJlLCB3ZSB3aWxsIGxvb3AgdW50aWwgd2UgcmVhY2ggdGhlIGVuZCBvZiB0aGUgc3RyaW5nLgogICAgICAgICAqIEFuIGludGVybmFsIGNvdW50ZXIgKGopIGlzIHVzZWQgaW4gb3JkZXIgdG8ga25vdyB3aGVuIHRvIAogICAgICAgICAqIGluc2VydCB0aGUgImRpZ2l0IGdyb3VwIHN5bWJvbCIuCiAgICAgICAgICovCiAgICAgICAgd2hpbGUgKG5OdW1iZXJEZWNpbWFsID4gMCkKICAgICAgICB7CiAgICAgICAgICAgIGkgPSBuQ291bnRlciArIG5TdGVwOwogICAgICAgICAgICBtZW1jcHkoc0Rlc3RpbmF0aW9uICsgaSwgc0RpZ2l0c0JlZm9yZURlY2ltYWwgKyBuQ291bnRlciwgMSk7CiAgICAgICAgICAgIG5Db3VudGVyKys7CiAgICAgICAgICAgIGorKzsKICAgICAgICAgICAgaWYgKGogPj0gbkdyb3VwaW5nKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBqID0gMDsKICAgICAgICAgICAgICAgIGlmIChuUnVsZUluZGV4IDwgc1J1bGVbMF0pCiAgICAgICAgICAgICAgICAgICAgblJ1bGVJbmRleCsrOwogICAgICAgICAgICAgICAgbkdyb3VwaW5nID0gT0xFX0dldEdyb3VwaW5nKHNSdWxlLCBuUnVsZUluZGV4KTsKICAgICAgICAgICAgICAgIG1lbWNweShzRGVzdGluYXRpb24gKyBpKzEsIHNEaWdpdEdyb3VwU3ltYm9sLCBzdHJsZW4oc0RpZ2l0R3JvdXBTeW1ib2wpKTsKICAgICAgICAgICAgICAgIG5TdGVwKz0gc3RybGVuKHNEaWdpdEdyb3VwU3ltYm9sKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbk51bWJlckRlY2ltYWwtLTsKICAgICAgICB9CgogICAgICAgIG1lbWNweShzRGVzdGluYXRpb24gKyBpKzEsICJcMCIsIDEpOwogICAgICAgIC8qIEdldCB0aGUgc3RyaW5nIGluIHRoZSByaWdodCBvcmRlciAhICovCiAgICAgICAgT0xFX0ludmVydFN0cmluZyhzRGVzdGluYXRpb24pOwogICAgIH0KICAgICBlbHNlCiAgICAgewogICAgICAgIG5MWiA9IGF0b2koc0lMWmVybyk7CiAgICAgICAgaWYgKG5MWiAhPSAwKQogICAgICAgIHsgICAgICAgIAogICAgICAgICAgICAvKiBVc2UgMC54eHggaW5zdGVhZCBvZiAueHh4ICovCiAgICAgICAgICAgIG1lbWNweShzRGVzdGluYXRpb24sICIwIiwgMSk7CiAgICAgICAgICAgIG1lbWNweShzRGVzdGluYXRpb24rMSwgIlwwIiwgMSk7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICAgICAgbWVtY3B5KHNEZXN0aW5hdGlvbiwgIlwwIiwgMSk7CgogICAgIH0KCiAgICAvKiBTZWNvbmQsIGZvcm1hdCB0aGUgZGlnaXRzIGFmdGVyIHRoZSBkZWNpbWFsLiAqLwogICAgaiA9IDA7CiAgICBuQ291bnRlciA9IG5OdW1iZXJEaWdpdHM7CiAgICBpZiAoIChuRGlnaXRzPjApICYmIChwU3RyID0gc3Ryc3RyIChzTnVtYmVyLCAiLiIpKSApCiAgICB7CiAgICAgICAgaSA9IHN0cmxlbihzTnVtYmVyKSAtIHN0cmxlbihwU3RyKSArIDE7ICAgICAgICAKICAgICAgICBzdHJuY3B5ICggc0RpZ2l0c0FmdGVyRGVjaW1hbCwgc051bWJlciArIGksIG5OdW1iZXJEaWdpdHMpOwogICAgICAgIGogPSBzdHJsZW4oc0RpZ2l0c0FmdGVyRGVjaW1hbCk7CiAgICAgICAgaWYgKGogPCBuTnVtYmVyRGlnaXRzKQogICAgICAgICAgICBuQ291bnRlciA9IG5OdW1iZXJEaWdpdHMtajsgICAgICAgICAgICAKICAgIH0KICAgIGZvciAoaT0wO2k8bkNvdW50ZXI7aSsrKQogICAgICAgICBtZW1jcHkoc0RpZ2l0c0FmdGVyRGVjaW1hbCtpK2osICIwIiwgMSk7ICAgIAogICAgbWVtY3B5KHNEaWdpdHNBZnRlckRlY2ltYWwgKyBuTnVtYmVyRGlnaXRzLCAiXDAiLCAxKTsgICAgCgogICAgaSA9IHN0cmxlbihzRGVzdGluYXRpb24pOwogICAgaiA9IHN0cmxlbihzRGlnaXRzQWZ0ZXJEZWNpbWFsKTsKICAgIC8qIEZpbmFsbHksIGNvbnN0cnVjdCB0aGUgcmVzdWx0aW5nIGZvcm1hdHRlZCBzdHJpbmcuICovCiAgICAgICAgCiAgICBmb3IgKG5Db3VudGVyPTA7IG5Db3VudGVyPGk7IG5Db3VudGVyKyspCiAgICAgICAgbWVtY3B5KHNOdW1iZXIgKyBuQ291bnRlciwgc0Rlc3RpbmF0aW9uICsgbkNvdW50ZXIsIDEpOwogICAgICAgCiAgICBtZW1jcHkoc051bWJlciArIG5Db3VudGVyLCBzRGVjaW1hbFN5bWJvbCwgc3RybGVuKHNEZWNpbWFsU3ltYm9sKSk7CgogICAgZm9yIChpPTA7IGk8ajsgaSsrKQogICAgICAgIG1lbWNweShzTnVtYmVyICsgbkNvdW50ZXIraStzdHJsZW4oc0RlY2ltYWxTeW1ib2wpLCBzRGlnaXRzQWZ0ZXJEZWNpbWFsICsgaSwgMSk7CiAgICBtZW1jcHkoc051bWJlciArIG5Db3VudGVyK2krc3RybGVuKHNEZWNpbWFsU3ltYm9sKSwgIlwwIiwgMSk7CiAgICAgICAgCiAgICAvKiBJcyBpdCBhIG5lZ2F0aXZlIG51bWJlciAqLwogICAgaWYgKGJOZWdhdGl2ZSA9PSBUUlVFKQogICAgewogICAgICAgIGkgPSBhdG9pKHNOZWdOdW1iZXIpOwogICAgICAgIHBTdHIgPSBzRGVzdGluYXRpb247CiAgICAgICAgcFRtcFN0ciA9IHNOdW1iZXI7CiAgICAgICAgc3dpdGNoIChpKQogICAgICAgIHsgICAgICAgICAgCiAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAqcFN0cisrID0gJygnOwogICAgICAgICAgICB3aGlsZSAoKnNOdW1iZXIgIT0gJ1wwJykKICAgICAgICAgICAgICAgICpwU3RyKysgPSAgKnBUbXBTdHIrKzsKICAgICAgICAgICAgKnBTdHIrKyA9ICcpJzsgICAgICAgICAgICAgICAgCiAgICAgICAgICAgIGJyZWFrOyAgCiAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAqcFN0cisrID0gJy0nOwogICAgICAgICAgICB3aGlsZSAoKnBUbXBTdHIgIT0gJ1wwJykKICAgICAgICAgICAgICAgICpwU3RyKysgPSAgKnBUbXBTdHIrKzsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAqcFN0cisrID0gJy0nOwogICAgICAgICAgICAqcFN0cisrID0gJyAnOwogICAgICAgICAgICB3aGlsZSAoKnBUbXBTdHIgIT0gJ1wwJykKICAgICAgICAgICAgICAgICpwU3RyKysgPSAgKnBUbXBTdHIrKzsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAzOgogICAgICAgICAgICB3aGlsZSAoKnBUbXBTdHIgIT0gJ1wwJykKICAgICAgICAgICAgICAgICpwU3RyKysgPSAgKnBUbXBTdHIrKzsKICAgICAgICAgICAgKnBTdHIrKyA9ICctJzsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSA0OgogICAgICAgICAgICB3aGlsZSAoKnBUbXBTdHIgIT0gJ1wwJykKICAgICAgICAgICAgICAgICpwU3RyKysgPSAgKnBUbXBTdHIrKzsKICAgICAgICAgICAgKnBTdHIrKyA9ICcgJzsKICAgICAgICAgICAgKnBTdHIrKyA9ICctJzsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgd2hpbGUgKCpwVG1wU3RyICE9ICdcMCcpCiAgICAgICAgICAgICAgICAqcFN0cisrID0gICpwVG1wU3RyKys7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UKICAgICAgICBzdHJjcHkoc0Rlc3RpbmF0aW9uLCBzTnVtYmVyKTsKCiAgICAvKiBJZiBjY2hOdW1iZXIgaXMgemVybywgdGhlbiByZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgb3IgY2hhcmFjdGVycyAKICAgICAqIHJlcXVpcmVkIHRvIGhvbGQgdGhlIGZvcm1hdHRlZCBudW1iZXIgc3RyaW5nCiAgICAgKi8KICAgIGlmIChjY2hOdW1iZXI9PTApCiAgICAgICAgcmV0VmFsID0gc3RybGVuKHNEZXN0aW5hdGlvbikgKyAxOwogICAgZWxzZSAgICAgICAgICAgCiAgICB7CiAgICAgICAgc3RybmNweSAobHBOdW1iZXJTdHIsIHNEZXN0aW5hdGlvbiwgY2NoTnVtYmVyLTEpOwogICAgICAgICoobHBOdW1iZXJTdHIrY2NoTnVtYmVyLTEpID0gJ1wwJzsgICAvKiBlbnN1cmUgd2UgZ290IGEgTlVMTCBhdCB0aGUgZW5kICovCiAgICAgICAgcmV0VmFsID0gc3RybGVuKGxwTnVtYmVyU3RyKTsKICAgIH0KICAgICAgICAgIAogICAgcmV0dXJuIHJldFZhbDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgICBHZXROdW1iZXJGb3JtYXRXCShLRVJORUwzMi5AKQogKi8KSU5UIFdJTkFQSSBHZXROdW1iZXJGb3JtYXRXKExDSUQgbG9jYWxlLCBEV09SRCBkd2ZsYWdzLAoJCQkgICAgICAgTFBDV1NUUiBscHZhbHVlLCAgY29uc3QgTlVNQkVSRk1UVyAqIGxwRm9ybWF0LAoJCQkgICAgICAgTFBXU1RSIGxwTnVtYmVyU3RyLCBpbnQgY2NoTnVtYmVyKQp7CiBGSVhNRSgiJXM6IHN0dWIsIG5vIHJlZm9ybWF0dGluZyBkb25lXG4iLGRlYnVnc3RyX3cobHB2YWx1ZSkpOwoKIGxzdHJjcHluVyggbHBOdW1iZXJTdHIsIGxwdmFsdWUsIGNjaE51bWJlciApOwogcmV0dXJuIGNjaE51bWJlcj8gc3RybGVuVyggbHBOdW1iZXJTdHIgKSA6IDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgR2V0Q3VycmVuY3lGb3JtYXRBCShLRVJORUwzMi5AKQogKi8KSU5UIFdJTkFQSSBHZXRDdXJyZW5jeUZvcm1hdEEoTENJRCBsb2NhbGUsIERXT1JEIGR3ZmxhZ3MsCgkJCSAgICAgICBMUENTVFIgbHB2YWx1ZSwgICBjb25zdCBDVVJSRU5DWUZNVEEgKiBscEZvcm1hdCwKCQkJICAgICAgIExQU1RSIGxwQ3VycmVuY3lTdHIsIGludCBjY2hDdXJyZW5jeSkKewogICAgVUlOVCAgIG5Qb3NPcmRlciwgbk5lZ09yZGVyOwogICAgSU5UICAgIHJldFZhbDsKICAgIGNoYXIgICBzRGVzdGluYXRpb25bMTI4XSwgc05lZ09yZGVyWzhdLCBzUG9zT3JkZXJbOF0sIHNDdXJyZW5jeVN5bWJvbFs4XTsKICAgIGNoYXIgICAqcERlc3RpbmF0aW9uID0gc0Rlc3RpbmF0aW9uOwogICAgY2hhciAgIHNOdW1iZXJGb3JtYXRlZFsxMjhdOwogICAgY2hhciAgICpwTnVtYmVyRm9ybWF0ZWQgPSBzTnVtYmVyRm9ybWF0ZWQ7CiAgICBMQ0lEICAgc3lzdGVtRGVmYXVsdExDSUQ7CiAgICBCT09MICAgYklzUG9zaXRpdmUgPSBGQUxTRSwgYlZhbGlkRm9ybWF0ID0gRkFMU0U7CiAgICBlbnVtICAgT3BlcmF0aW9ucyAKICAgIHsKICAgICAgICBVU0VfUEFSQU1FVEVSLAogICAgICAgIFVTRV9MT0NBTEVJTkZPLAogICAgICAgIFVTRV9TWVNURU1ERUZBVUxULAogICAgICAgIFJFVFVSTl9FUlJPUgogICAgfSB1c2VkX29wZXJhdGlvbjsKCiAgICBOVU1CRVJGTVRBICBudW1iZXJGbXQ7CgogICAgLyogV2hpY2ggc291cmNlIHdpbGwgd2UgdXNlIHRvIGZvcm1hdCB0aGUgc3RyaW5nICovCiAgICB1c2VkX29wZXJhdGlvbiA9IFJFVFVSTl9FUlJPUjsKICAgIGlmIChscEZvcm1hdCAhPSBOVUxMKQogICAgewogICAgICAgIGlmIChkd2ZsYWdzID09IDApCiAgICAgICAgICAgIHVzZWRfb3BlcmF0aW9uID0gVVNFX1BBUkFNRVRFUjsgCiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgaWYgKGR3ZmxhZ3MgJiBMT0NBTEVfTk9VU0VST1ZFUlJJREUpCiAgICAgICAgICAgIHVzZWRfb3BlcmF0aW9uID0gVVNFX0xPQ0FMRUlORk87CiAgICAgICAgZWxzZQogICAgICAgICAgICB1c2VkX29wZXJhdGlvbiA9IFVTRV9TWVNURU1ERUZBVUxUOwogICAgfQoKICAgIC8qIExvYWQgdGhlIGZpZWxkcyB3ZSBuZWVkICovCiAgICBzd2l0Y2godXNlZF9vcGVyYXRpb24pCiAgICB7CiAgICBjYXNlIFVTRV9MT0NBTEVJTkZPOiAgICAgICAgCiAgICAgICAgLyogU3BlY2lmaWMgdG8gQ1VSUkVOQ1lGTVRBICovCiAgICAgICAgR2V0TG9jYWxlSW5mb0EobG9jYWxlLCBMT0NBTEVfSU5FR0NVUlIsIHNOZWdPcmRlciwgc2l6ZW9mKHNOZWdPcmRlcikpOwogICAgICAgIEdldExvY2FsZUluZm9BKGxvY2FsZSwgTE9DQUxFX0lDVVJSRU5DWSwgc1Bvc09yZGVyLCBzaXplb2Yoc1Bvc09yZGVyKSk7CiAgICAgICAgR2V0TG9jYWxlSW5mb0EobG9jYWxlLCBMT0NBTEVfU0NVUlJFTkNZLCBzQ3VycmVuY3lTeW1ib2wsIHNpemVvZihzQ3VycmVuY3lTeW1ib2wpKTsKICAgICAgICAKICAgICAgICBuUG9zT3JkZXIgPSBhdG9pKHNQb3NPcmRlcik7CiAgICAgICAgbk5lZ09yZGVyID0gYXRvaShzTmVnT3JkZXIpOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBVU0VfUEFSQU1FVEVSOiAgICAgICAgCiAgICAgICAgLyogU3BlY2lmaWMgdG8gQ1VSUkVOQ1lGTVRBICovCiAgICAgICAgbk5lZ09yZGVyID0gbHBGb3JtYXQtPk5lZ2F0aXZlT3JkZXI7CiAgICAgICAgblBvc09yZGVyID0gbHBGb3JtYXQtPlBvc2l0aXZlT3JkZXI7CiAgICAgICAgc3RyY3B5KHNDdXJyZW5jeVN5bWJvbCwgbHBGb3JtYXQtPmxwQ3VycmVuY3lTeW1ib2wpOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBVU0VfU1lTVEVNREVGQVVMVDoKICAgICAgICBzeXN0ZW1EZWZhdWx0TENJRCA9IEdldFN5c3RlbURlZmF1bHRMQ0lEKCk7ICAgICAgICAKICAgICAgICAvKiBTcGVjaWZpYyB0byBDVVJSRU5DWUZNVEEgKi8KICAgICAgICBHZXRMb2NhbGVJbmZvQShzeXN0ZW1EZWZhdWx0TENJRCwgTE9DQUxFX0lORUdDVVJSLCBzTmVnT3JkZXIsIHNpemVvZihzTmVnT3JkZXIpKTsKICAgICAgICBHZXRMb2NhbGVJbmZvQShzeXN0ZW1EZWZhdWx0TENJRCwgTE9DQUxFX0lDVVJSRU5DWSwgc1Bvc09yZGVyLCBzaXplb2Yoc1Bvc09yZGVyKSk7CiAgICAgICAgR2V0TG9jYWxlSW5mb0Eoc3lzdGVtRGVmYXVsdExDSUQsIExPQ0FMRV9TQ1VSUkVOQ1ksIHNDdXJyZW5jeVN5bWJvbCwgc2l6ZW9mKHNDdXJyZW5jeVN5bWJvbCkpOwogICAgICAgIAogICAgICAgIG5Qb3NPcmRlciA9IGF0b2koc1Bvc09yZGVyKTsKICAgICAgICBuTmVnT3JkZXIgPSBhdG9pKHNOZWdPcmRlcik7CiAgICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICAKICAgIC8qIENvbnN0cnVjdCBhIHRlbXBvcmFyeSBudW1iZXIgZm9ybWF0IHN0cnVjdHVyZSAqLwogICAgaWYgKGxwRm9ybWF0ICE9IE5VTEwpCiAgICB7CiAgICAgICAgbnVtYmVyRm10Lk51bURpZ2l0cyAgICAgPSBscEZvcm1hdC0+TnVtRGlnaXRzOwogICAgICAgIG51bWJlckZtdC5MZWFkaW5nWmVybyAgID0gbHBGb3JtYXQtPkxlYWRpbmdaZXJvOwogICAgICAgIG51bWJlckZtdC5Hcm91cGluZyAgICAgID0gbHBGb3JtYXQtPkdyb3VwaW5nOwogICAgICAgIG51bWJlckZtdC5OZWdhdGl2ZU9yZGVyID0gMDsKICAgICAgICBudW1iZXJGbXQubHBEZWNpbWFsU2VwID0gbHBGb3JtYXQtPmxwRGVjaW1hbFNlcDsKICAgICAgICBudW1iZXJGbXQubHBUaG91c2FuZFNlcCA9IGxwRm9ybWF0LT5scFRob3VzYW5kU2VwOwogICAgICAgIGJWYWxpZEZvcm1hdCA9IFRSVUU7CiAgICB9CgogICAgLyogTWFrZSBhIGNhbGwgdG8gR2V0TnVtYmVyRm9ybWF0QSgpICovCiAgICBpZiAoKmxwdmFsdWUgPT0gJy0nKQogICAgewogICAgICAgIGJJc1Bvc2l0aXZlID0gRkFMU0U7CiAgICAgICAgcmV0VmFsID0gR2V0TnVtYmVyRm9ybWF0QShsb2NhbGUsMCxscHZhbHVlKzEsKGJWYWxpZEZvcm1hdCk/Jm51bWJlckZtdDpOVUxMLHBOdW1iZXJGb3JtYXRlZCwxMjgpOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIGJJc1Bvc2l0aXZlID0gVFJVRTsKICAgICAgICByZXRWYWwgPSBHZXROdW1iZXJGb3JtYXRBKGxvY2FsZSwwLGxwdmFsdWUsKGJWYWxpZEZvcm1hdCk/Jm51bWJlckZtdDpOVUxMLHBOdW1iZXJGb3JtYXRlZCwxMjgpOwogICAgfQogICAgICAgIAogICAgaWYgKHJldFZhbCA9PSAwKQogICAgICAgIHJldHVybiAwOwoKICAgIC8qIGNvbnN0cnVjdCB0aGUgZm9ybWF0dGVkIHN0cmluZyAqLwogICAgaWYgKGJJc1Bvc2l0aXZlKQogICAgewogICAgICAgIHN3aXRjaCAoblBvc09yZGVyKQogICAgICAgIHsKICAgICAgICBjYXNlIDA6ICAgLyogUHJlZml4LCBubyBzZXBhcmF0aW9uICovCiAgICAgICAgICAgIHN0cmNweSAocERlc3RpbmF0aW9uLCBzQ3VycmVuY3lTeW1ib2wpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgcE51bWJlckZvcm1hdGVkKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAxOiAgIC8qIFN1ZmZpeCwgbm8gc2VwYXJhdGlvbiAqLwogICAgICAgICAgICBzdHJjcHkgKHBEZXN0aW5hdGlvbiwgcE51bWJlckZvcm1hdGVkKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sIHNDdXJyZW5jeVN5bWJvbCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMjogICAvKiBQcmVmaXgsIDEgY2hhciBzZXBhcmF0aW9uICovCiAgICAgICAgICAgIHN0cmNweSAocERlc3RpbmF0aW9uLCBzQ3VycmVuY3lTeW1ib2wpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgIiAiKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sIHBOdW1iZXJGb3JtYXRlZCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMzogICAvKiBTdWZmaXgsIDEgY2hhciBzZXBhcmF0aW9uICovCiAgICAgICAgICAgIHN0cmNweSAocERlc3RpbmF0aW9uLCBwTnVtYmVyRm9ybWF0ZWQpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgIiAiKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sIHNDdXJyZW5jeVN5bWJvbCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UgIC8qIG5lZ2F0aXZlIG51bWJlciAqLwogICAgewogICAgICAgIHN3aXRjaCAobk5lZ09yZGVyKQogICAgICAgIHsKICAgICAgICBjYXNlIDA6ICAgLyogZm9ybWF0OiAoJDEuMSkgKi8KICAgICAgICAgICAgc3RyY3B5IChwRGVzdGluYXRpb24sICIoIik7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCBzQ3VycmVuY3lTeW1ib2wpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgcE51bWJlckZvcm1hdGVkKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sICIpIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMTogICAvKiBmb3JtYXQ6IC0kMS4xICovCiAgICAgICAgICAgIHN0cmNweSAocERlc3RpbmF0aW9uLCAiLSIpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgc0N1cnJlbmN5U3ltYm9sKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sIHBOdW1iZXJGb3JtYXRlZCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMjogICAvKiBmb3JtYXQ6ICQtMS4xICovCiAgICAgICAgICAgIHN0cmNweSAocERlc3RpbmF0aW9uLCBzQ3VycmVuY3lTeW1ib2wpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgIi0iKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sIHBOdW1iZXJGb3JtYXRlZCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMzogICAvKiBmb3JtYXQ6ICQxLjEtICovCiAgICAgICAgICAgIHN0cmNweSAocERlc3RpbmF0aW9uLCBzQ3VycmVuY3lTeW1ib2wpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgcE51bWJlckZvcm1hdGVkKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sICItIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgNDogICAvKiBmb3JtYXQ6ICgxLjEkKSAqLwogICAgICAgICAgICBzdHJjcHkgKHBEZXN0aW5hdGlvbiwgIigiKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sIHBOdW1iZXJGb3JtYXRlZCk7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCBzQ3VycmVuY3lTeW1ib2wpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgIikiKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSA1OiAgIC8qIGZvcm1hdDogLTEuMSQgKi8KICAgICAgICAgICAgc3RyY3B5IChwRGVzdGluYXRpb24sICItIik7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCBwTnVtYmVyRm9ybWF0ZWQpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgc0N1cnJlbmN5U3ltYm9sKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSA2OiAgIC8qIGZvcm1hdDogMS4xLSQgKi8KICAgICAgICAgICAgc3RyY3B5IChwRGVzdGluYXRpb24sIHBOdW1iZXJGb3JtYXRlZCk7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCAiLSIpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgc0N1cnJlbmN5U3ltYm9sKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSA3OiAgIC8qIGZvcm1hdDogMS4xJC0gKi8KICAgICAgICAgICAgc3RyY3B5IChwRGVzdGluYXRpb24sIHBOdW1iZXJGb3JtYXRlZCk7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCBzQ3VycmVuY3lTeW1ib2wpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgIi0iKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSA4OiAgIC8qIGZvcm1hdDogLTEuMSAkICovCiAgICAgICAgICAgIHN0cmNweSAocERlc3RpbmF0aW9uLCAiLSIpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgcE51bWJlckZvcm1hdGVkKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sICIgIik7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCBzQ3VycmVuY3lTeW1ib2wpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDk6ICAgLyogZm9ybWF0OiAtJCAxLjEgKi8KICAgICAgICAgICAgc3RyY3B5IChwRGVzdGluYXRpb24sICItIik7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCBzQ3VycmVuY3lTeW1ib2wpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgIiAiKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sIHBOdW1iZXJGb3JtYXRlZCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMTA6ICAgLyogZm9ybWF0OiAxLjEgJC0gKi8KICAgICAgICAgICAgc3RyY3B5IChwRGVzdGluYXRpb24sIHBOdW1iZXJGb3JtYXRlZCk7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCAiICIpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgc0N1cnJlbmN5U3ltYm9sKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sICItIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMTE6ICAgLyogZm9ybWF0OiAkIDEuMS0gKi8KICAgICAgICAgICAgc3RyY3B5IChwRGVzdGluYXRpb24sIHNDdXJyZW5jeVN5bWJvbCk7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCAiICIpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgcE51bWJlckZvcm1hdGVkKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sICItIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMTI6ICAgLyogZm9ybWF0OiAkIC0xLjEgKi8KICAgICAgICAgICAgc3RyY3B5IChwRGVzdGluYXRpb24sIHNDdXJyZW5jeVN5bWJvbCk7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCAiICIpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgIi0iKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sIHBOdW1iZXJGb3JtYXRlZCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMTM6ICAgLyogZm9ybWF0OiAxLjEtICQgKi8KICAgICAgICAgICAgc3RyY3B5IChwRGVzdGluYXRpb24sIHBOdW1iZXJGb3JtYXRlZCk7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCAiLSIpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgIiAiKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sIHNDdXJyZW5jeVN5bWJvbCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMTQ6ICAgLyogZm9ybWF0OiAoJCAxLjEpICovCiAgICAgICAgICAgIHN0cmNweSAocERlc3RpbmF0aW9uLCAiKCIpOyAKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sIHNDdXJyZW5jeVN5bWJvbCk7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCAiICIpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgcE51bWJlckZvcm1hdGVkKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sICIpIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMTU6ICAgLyogZm9ybWF0OiAoMS4xICQpICovCiAgICAgICAgICAgIHN0cmNweSAocERlc3RpbmF0aW9uLCAiKCIpOyAKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sIHBOdW1iZXJGb3JtYXRlZCk7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCAiICIpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgc0N1cnJlbmN5U3ltYm9sKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sICIpIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoY2NoQ3VycmVuY3kgPT0gMCkKICAgICAgICByZXR1cm4gc3RybGVuKHBEZXN0aW5hdGlvbikgKyAxOwoKICAgIGVsc2UKICAgIHsKICAgICAgICBzdHJuY3B5IChscEN1cnJlbmN5U3RyLCBwRGVzdGluYXRpb24sIGNjaEN1cnJlbmN5LTEpOwogICAgICAgICoobHBDdXJyZW5jeVN0citjY2hDdXJyZW5jeS0xKSA9ICdcMCc7ICAgLyogZW5zdXJlIHdlIGdvdCBhIE5VTEwgYXQgdGhlIGVuZCAqLwogICAgICAgIHJldHVybiAgc3RybGVuKGxwQ3VycmVuY3lTdHIpOwogICAgfSAgICAKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgICBHZXRDdXJyZW5jeUZvcm1hdFcJKEtFUk5FTDMyLkApCiAqLwpJTlQgV0lOQVBJIEdldEN1cnJlbmN5Rm9ybWF0VyhMQ0lEIGxvY2FsZSwgRFdPUkQgZHdmbGFncywKCQkJICAgICAgIExQQ1dTVFIgbHB2YWx1ZSwgICBjb25zdCBDVVJSRU5DWUZNVFcgKiBscEZvcm1hdCwKCQkJICAgICAgIExQV1NUUiBscEN1cnJlbmN5U3RyLCBpbnQgY2NoQ3VycmVuY3kpCnsKICAgIEZJWE1FKCJUaGlzIEFQSSBmdW5jdGlvbiBpcyBOT1QgaW1wbGVtZW50ZWQgIVxuIik7CiAgICByZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJT0xFMk5MU19DaGVja0xvY2FsZQlbaW50ZXJuXQogKi8gCnN0YXRpYyBMQ0lEIE9MRTJOTFNfQ2hlY2tMb2NhbGUgKExDSUQgbG9jYWxlKQp7CglpZiAoIWxvY2FsZSkgCgl7IGxvY2FsZSA9IExPQ0FMRV9TWVNURU1fREVGQVVMVDsKCX0KICAKCWlmIChsb2NhbGUgPT0gTE9DQUxFX1NZU1RFTV9ERUZBVUxUKSAKICAJeyByZXR1cm4gR2V0U3lzdGVtRGVmYXVsdExDSUQoKTsKCX0gCgllbHNlIGlmIChsb2NhbGUgPT0gTE9DQUxFX1VTRVJfREVGQVVMVCkgCgl7IHJldHVybiBHZXRVc2VyRGVmYXVsdExDSUQoKTsKCX0KCWVsc2UKCXsgcmV0dXJuIGxvY2FsZTsKCX0KfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlHZXRUaW1lRm9ybWF0QQlbS0VSTkVMMzIuQF0KICogTWFrZXMgYW4gQVNDSUkgc3RyaW5nIG9mIHRoZSB0aW1lCiAqCiAqIEZvcm1hdHMgZGF0ZSBhY2NvcmRpbmcgdG8gZm9ybWF0LCAgb3IgbG9jYWxlIGRlZmF1bHQgaWYgZm9ybWF0IGlzCiAqIE5VTEwuIFRoZSBmb3JtYXQgY29uc2lzdHMgb2YgbGl0ZXJhbCBjaGFyYWN0ZXJzIGFuZCBmaWVsZHMgYXMgZm9sbG93czoKICoKICogaCAgaG91cnMgd2l0aCBubyBsZWFkaW5nIHplcm8gKDEyLWhvdXIpCiAqIGhoIGhvdXJzIHdpdGggZnVsbCB0d28gZGlnaXRzCiAqIEggIGhvdXJzIHdpdGggbm8gbGVhZGluZyB6ZXJvICgyNC1ob3VyKQogKiBISCBob3VycyB3aXRoIGZ1bGwgdHdvIGRpZ2l0cwogKiBtICBtaW51dGVzIHdpdGggbm8gbGVhZGluZyB6ZXJvCiAqIG1tIG1pbnV0ZXMgd2l0aCBmdWxsIHR3byBkaWdpdHMKICogcyAgc2Vjb25kcyB3aXRoIG5vIGxlYWRpbmcgemVybwogKiBzcyBzZWNvbmRzIHdpdGggZnVsbCB0d28gZGlnaXRzCiAqIHQgIHRpbWUgbWFya2VyIChBIG9yIFApCiAqIHR0IHRpbWUgbWFya2VyIChBTSwgUE0pCiAqCiAqLwpJTlQgV0lOQVBJIApHZXRUaW1lRm9ybWF0QShMQ0lEIGxvY2FsZSwgICAgICAgIC8qIFtpbl0gICovCgkgICAgICAgRFdPUkQgZmxhZ3MsICAgICAgICAvKiBbaW5dICAqLwoJICAgICAgIGNvbnN0IFNZU1RFTVRJTUUqIHh0aW1lLCAvKiBbaW5dICAqLwoJICAgICAgIExQQ1NUUiBmb3JtYXQsICAgICAgLyogW2luXSAgKi8KCSAgICAgICBMUFNUUiB0aW1lc3RyLCAgICAgIC8qIFtvdXRdICovCgkgICAgICAgSU5UIHRpbWVsZW4gICAgICAgICAvKiBbaW5dICAqLykgCnsgY2hhciBmb3JtYXRfYnVmWzQwXTsKICBMUENTVFIgdGhpc2Zvcm1hdDsKICBTWVNURU1USU1FIHQ7CiAgY29uc3QgU1lTVEVNVElNRSogdGhpc3RpbWU7CiAgTENJRCB0aGlzbG9jYWxlPTA7CiAgRFdPUkQgdGhpc2ZsYWdzPUxPQ0FMRV9TVElNRUZPUk1BVDsgLyogc3RhbmRhcmQgdGltZWZvcm1hdCAqLwogIElOVCByZXQ7CiAgICAKICBUUkFDRSgiR2V0VGltZUZvcm1hdCgweCUwNGx4LDB4JTA4bHgsJXAsJXMsJXAsJWQpXG4iLGxvY2FsZSxmbGFncyx4dGltZSxmb3JtYXQsdGltZXN0cix0aW1lbGVuKTsKCiAgdGhpc2xvY2FsZSA9IE9MRTJOTFNfQ2hlY2tMb2NhbGUgKCBsb2NhbGUgKTsKCiAgaWYgKGZvcm1hdCA9PSBOVUxMKSAKICB7IGlmIChmbGFncyAmIExPQ0FMRV9OT1VTRVJPVkVSUklERSkgIC8qIHVzZSBzeXN0ZW0gZGVmYXVsdCAqLwogICAgeyB0aGlzbG9jYWxlID0gR2V0U3lzdGVtRGVmYXVsdExDSUQoKTsKICAgIH0KICAgIEdldExvY2FsZUluZm9BKHRoaXNsb2NhbGUsIHRoaXNmbGFncywgZm9ybWF0X2J1Ziwgc2l6ZW9mKGZvcm1hdF9idWYpKTsKICAgIHRoaXNmb3JtYXQgPSBmb3JtYXRfYnVmOwogIH0KICBlbHNlIAogIHsgdGhpc2Zvcm1hdCA9IGZvcm1hdDsKICB9CiAgCiAgaWYgKHh0aW1lID09IE5VTEwpIC8qIE5VTEwgbWVhbnMgdXNlIHRoZSBjdXJyZW50IGxvY2FsIHRpbWUgKi8KICB7IEdldExvY2FsVGltZSgmdCk7CiAgICB0aGlzdGltZSA9ICZ0OwogIH0gCiAgZWxzZQogIHsgdGhpc3RpbWUgPSB4dGltZTsKICAvKiBDaGVjayB0aGF0IGhvdXIsbWluIGFuZCBzZWMgaXMgaW4gcmFuZ2UgKi8KICB9CiAgcmV0ID0gT0xFX0dldEZvcm1hdEEodGhpc2xvY2FsZSwgdGhpc2ZsYWdzLCBmbGFncywgdGhpc3RpbWUsIHRoaXNmb3JtYXQsCiAgCQkJIHRpbWVzdHIsIHRpbWVsZW4pOwogIHJldHVybiByZXQ7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlHZXRUaW1lRm9ybWF0VwlbS0VSTkVMMzIuQF0KICogTWFrZXMgYSBVbmljb2RlIHN0cmluZyBvZiB0aGUgdGltZQogKi8KSU5UIFdJTkFQSSAKR2V0VGltZUZvcm1hdFcoTENJRCBsb2NhbGUsICAgICAgICAvKiBbaW5dICAqLwoJICAgICAgIERXT1JEIGZsYWdzLCAgICAgICAgLyogW2luXSAgKi8KCSAgICAgICBjb25zdCBTWVNURU1USU1FKiB4dGltZSwgLyogW2luXSAgKi8KCSAgICAgICBMUENXU1RSIGZvcm1hdCwgICAgIC8qIFtpbl0gICovCgkgICAgICAgTFBXU1RSIHRpbWVzdHIsICAgICAvKiBbb3V0XSAqLwoJICAgICAgIElOVCB0aW1lbGVuICAgICAgICAgLyogW2luXSAgKi8pIAp7CVdDSEFSIGZvcm1hdF9idWZbNDBdOwoJTFBDV1NUUiB0aGlzZm9ybWF0OwoJU1lTVEVNVElNRSB0OwoJY29uc3QgU1lTVEVNVElNRSogdGhpc3RpbWU7CglMQ0lEIHRoaXNsb2NhbGU9MDsKCURXT1JEIHRoaXNmbGFncz1MT0NBTEVfU1RJTUVGT1JNQVQ7IC8qIHN0YW5kYXJkIHRpbWVmb3JtYXQgKi8KCUlOVCByZXQ7CgkgICAgCglUUkFDRSgiR2V0VGltZUZvcm1hdCgweCUwNGx4LDB4JTA4bHgsJXAsJXMsJXAsJWQpXG4iLGxvY2FsZSxmbGFncywKCXh0aW1lLGRlYnVnc3RyX3coZm9ybWF0KSx0aW1lc3RyLHRpbWVsZW4pOwoKCXRoaXNsb2NhbGUgPSBPTEUyTkxTX0NoZWNrTG9jYWxlICggbG9jYWxlICk7CgoJaWYgKGZvcm1hdCA9PSBOVUxMKSAKCXsgaWYgKGZsYWdzICYgTE9DQUxFX05PVVNFUk9WRVJSSURFKSAgLyogdXNlIHN5c3RlbSBkZWZhdWx0ICovCgkgIHsgdGhpc2xvY2FsZSA9IEdldFN5c3RlbURlZmF1bHRMQ0lEKCk7CgkgIH0KCSAgR2V0TG9jYWxlSW5mb1codGhpc2xvY2FsZSwgdGhpc2ZsYWdzLCBmb3JtYXRfYnVmLCA0MCk7CgkgIHRoaXNmb3JtYXQgPSBmb3JtYXRfYnVmOwoJfQkgIAoJZWxzZSAKCXsgdGhpc2Zvcm1hdCA9IGZvcm1hdDsKCX0KIAoJaWYgKHh0aW1lID09IE5VTEwpIC8qIE5VTEwgbWVhbnMgdXNlIHRoZSBjdXJyZW50IGxvY2FsIHRpbWUgKi8KCXsgR2V0TG9jYWxUaW1lKCZ0KTsKCSAgdGhpc3RpbWUgPSAmdDsKCX0gCgllbHNlCgl7IHRoaXN0aW1lID0geHRpbWU7Cgl9CgoJcmV0ID0gT0xFX0dldEZvcm1hdFcodGhpc2xvY2FsZSwgdGhpc2ZsYWdzLCBmbGFncywgdGhpc3RpbWUsIHRoaXNmb3JtYXQsCiAgCQkJIHRpbWVzdHIsIHRpbWVsZW4pOwoJcmV0dXJuIHJldDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJRW51bUNhbGVuZGFySW5mb0EJW0tFUk5FTDMyLkBdCiAqLwpCT09MIFdJTkFQSSBFbnVtQ2FsZW5kYXJJbmZvQSgKCUNBTElORk9fRU5VTVBST0NBIGNhbGluZm9wcm9jLExDSUQgbG9jYWxlLENBTElEIGNhbGVuZGFyLENBTFRZUEUgY2FsdHlwZQopIHsKCUZJWE1FKCIoJXAsMHglMDRseCwweCUwOGx4LDB4JTA4bHgpLHN0dWIhXG4iLGNhbGluZm9wcm9jLGxvY2FsZSxjYWxlbmRhcixjYWx0eXBlKTsKCXJldHVybiBGQUxTRTsKfQo=