LyoKICoJTmF0aW9uYWwgTGFuZ3VhZ2UgU3VwcG9ydCBsaWJyYXJ5CiAqCiAqCUNvcHlyaWdodCAxOTk1CU1hcnRpbiB2b24gTG9ld2lzCiAqICAgICAgQ29weXJpZ2h0IDE5OTggIERhdmlkIExlZSBMYW1iZXJ0CiAqICAgICAgQ29weXJpZ2h0IDIwMDAgIEp1bGlvIEPpc2FyIEfhenF1ZXoKICovCgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8Y3R5cGUuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8bG9jYWxlLmg+CiNpbmNsdWRlICJ3aW5kZWYuaCIKI2luY2x1ZGUgIndpbmdkaS5oIgojaW5jbHVkZSAid2ludXNlci5oIgojaW5jbHVkZSAid2luZS91bmljb2RlLmgiCiNpbmNsdWRlICJoZWFwLmgiCiNpbmNsdWRlICJvcHRpb25zLmgiCiNpbmNsdWRlICJ3aW52ZXIuaCIKI2luY2x1ZGUgIndpbm5scy5oIgojaW5jbHVkZSAid2lucmVnLmgiCiNpbmNsdWRlICJ3aW5lcnJvci5oIgojaW5jbHVkZSAiZGVidWd0b29scy5oIgojaW5jbHVkZSAibWFpbi5oIgoKREVGQVVMVF9ERUJVR19DSEFOTkVMKHN0cmluZyk7CgovKiBMb2NhbGUgbmFtZSB0byBpZCBtYXAuIHVzZWQgYnkgRW51bVN5c3RlbUxvY2FsZXMsIEdldExvY2FsZUluZm9BIAogKiBNVVNUIGNvbnRhaW4gYWxsICNkZWZpbmVzIGZyb20gd2lubmxzLmgKICogbGFzdCBlbnRyeSBoYXMgTlVMTCBuYW1lLCAwIGlkLgogKi8gCiNkZWZpbmUgTE9DQUxFX0VOVFJZKHgpCXsjeCxMT0NBTEVfIyN4fQpzdGF0aWMgY29uc3Qgc3RydWN0IHRhZ0xPQ0FMRV9OQU1FMklEIHsKICAgIGNvbnN0IGNoYXIJKm5hbWU7CiAgICBMQ1RZUEUJaWQ7Cn0gbG9jYWxlX25hbWUyaWRbXT0gewoJTE9DQUxFX0VOVFJZKElMQU5HVUFHRSksCglMT0NBTEVfRU5UUlkoU0xBTkdVQUdFKSwKCUxPQ0FMRV9FTlRSWShTRU5HTEFOR1VBR0UpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZMQU5HTkFNRSksCglMT0NBTEVfRU5UUlkoU05BVElWRUxBTkdOQU1FKSwKCUxPQ0FMRV9FTlRSWShJQ09VTlRSWSksCglMT0NBTEVfRU5UUlkoU0NPVU5UUlkpLAoJTE9DQUxFX0VOVFJZKFNFTkdDT1VOVFJZKSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWQ1RSWU5BTUUpLAoJTE9DQUxFX0VOVFJZKFNOQVRJVkVDVFJZTkFNRSksCglMT0NBTEVfRU5UUlkoSURFRkFVTFRMQU5HVUFHRSksCglMT0NBTEVfRU5UUlkoSURFRkFVTFRDT1VOVFJZKSwKCUxPQ0FMRV9FTlRSWShJREVGQVVMVENPREVQQUdFKSwKCUxPQ0FMRV9FTlRSWShJREVGQVVMVEFOU0lDT0RFUEFHRSksCglMT0NBTEVfRU5UUlkoSURFRkFVTFRNQUNDT0RFUEFHRSksCglMT0NBTEVfRU5UUlkoU0xJU1QpLAoJTE9DQUxFX0VOVFJZKElNRUFTVVJFKSwKCUxPQ0FMRV9FTlRSWShTREVDSU1BTCksCglMT0NBTEVfRU5UUlkoU1RIT1VTQU5EKSwKCUxPQ0FMRV9FTlRSWShTR1JPVVBJTkcpLAoJTE9DQUxFX0VOVFJZKElESUdJVFMpLAoJTE9DQUxFX0VOVFJZKElMWkVSTyksCglMT0NBTEVfRU5UUlkoSU5FR05VTUJFUiksCglMT0NBTEVfRU5UUlkoU05BVElWRURJR0lUUyksCglMT0NBTEVfRU5UUlkoU0NVUlJFTkNZKSwKCUxPQ0FMRV9FTlRSWShTSU5UTFNZTUJPTCksCglMT0NBTEVfRU5UUlkoU01PTkRFQ0lNQUxTRVApLAoJTE9DQUxFX0VOVFJZKFNNT05USE9VU0FORFNFUCksCglMT0NBTEVfRU5UUlkoU01PTkdST1VQSU5HKSwKCUxPQ0FMRV9FTlRSWShJQ1VSUkRJR0lUUyksCglMT0NBTEVfRU5UUlkoSUlOVExDVVJSRElHSVRTKSwKCUxPQ0FMRV9FTlRSWShJQ1VSUkVOQ1kpLAoJTE9DQUxFX0VOVFJZKElORUdDVVJSKSwKCUxPQ0FMRV9FTlRSWShTREFURSksCglMT0NBTEVfRU5UUlkoU1RJTUUpLAoJTE9DQUxFX0VOVFJZKFNTSE9SVERBVEUpLAoJTE9DQUxFX0VOVFJZKFNMT05HREFURSksCglMT0NBTEVfRU5UUlkoU1RJTUVGT1JNQVQpLAoJTE9DQUxFX0VOVFJZKElEQVRFKSwKCUxPQ0FMRV9FTlRSWShJTERBVEUpLAoJTE9DQUxFX0VOVFJZKElUSU1FKSwKCUxPQ0FMRV9FTlRSWShJVElNRU1BUktQT1NOKSwKCUxPQ0FMRV9FTlRSWShJQ0VOVFVSWSksCglMT0NBTEVfRU5UUlkoSVRMWkVSTyksCglMT0NBTEVfRU5UUlkoSURBWUxaRVJPKSwKCUxPQ0FMRV9FTlRSWShJTU9OTFpFUk8pLAoJTE9DQUxFX0VOVFJZKFMxMTU5KSwKCUxPQ0FMRV9FTlRSWShTMjM1OSksCglMT0NBTEVfRU5UUlkoSUNBTEVOREFSVFlQRSksCglMT0NBTEVfRU5UUlkoSU9QVElPTkFMQ0FMRU5EQVIpLAoJTE9DQUxFX0VOVFJZKElGSVJTVERBWU9GV0VFSyksCglMT0NBTEVfRU5UUlkoSUZJUlNUV0VFS09GWUVBUiksCglMT0NBTEVfRU5UUlkoU0RBWU5BTUUxKSwKCUxPQ0FMRV9FTlRSWShTREFZTkFNRTIpLAoJTE9DQUxFX0VOVFJZKFNEQVlOQU1FMyksCglMT0NBTEVfRU5UUlkoU0RBWU5BTUU0KSwKCUxPQ0FMRV9FTlRSWShTREFZTkFNRTUpLAoJTE9DQUxFX0VOVFJZKFNEQVlOQU1FNiksCglMT0NBTEVfRU5UUlkoU0RBWU5BTUU3KSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWREFZTkFNRTEpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZEQVlOQU1FMiksCglMT0NBTEVfRU5UUlkoU0FCQlJFVkRBWU5BTUUzKSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWREFZTkFNRTQpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZEQVlOQU1FNSksCglMT0NBTEVfRU5UUlkoU0FCQlJFVkRBWU5BTUU2KSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWREFZTkFNRTcpLAoJTE9DQUxFX0VOVFJZKFNNT05USE5BTUUxKSwKCUxPQ0FMRV9FTlRSWShTTU9OVEhOQU1FMiksCglMT0NBTEVfRU5UUlkoU01PTlRITkFNRTMpLAoJTE9DQUxFX0VOVFJZKFNNT05USE5BTUU0KSwKCUxPQ0FMRV9FTlRSWShTTU9OVEhOQU1FNSksCglMT0NBTEVfRU5UUlkoU01PTlRITkFNRTYpLAoJTE9DQUxFX0VOVFJZKFNNT05USE5BTUU3KSwKCUxPQ0FMRV9FTlRSWShTTU9OVEhOQU1FOCksCglMT0NBTEVfRU5UUlkoU01PTlRITkFNRTkpLAoJTE9DQUxFX0VOVFJZKFNNT05USE5BTUUxMCksCglMT0NBTEVfRU5UUlkoU01PTlRITkFNRTExKSwKCUxPQ0FMRV9FTlRSWShTTU9OVEhOQU1FMTIpLAoJTE9DQUxFX0VOVFJZKFNNT05USE5BTUUxMyksCglMT0NBTEVfRU5UUlkoU0FCQlJFVk1PTlRITkFNRTEpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZNT05USE5BTUUyKSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWTU9OVEhOQU1FMyksCglMT0NBTEVfRU5UUlkoU0FCQlJFVk1PTlRITkFNRTQpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZNT05USE5BTUU1KSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWTU9OVEhOQU1FNiksCglMT0NBTEVfRU5UUlkoU0FCQlJFVk1PTlRITkFNRTcpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZNT05USE5BTUU4KSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWTU9OVEhOQU1FOSksCglMT0NBTEVfRU5UUlkoU0FCQlJFVk1PTlRITkFNRTEwKSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWTU9OVEhOQU1FMTEpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZNT05USE5BTUUxMiksCglMT0NBTEVfRU5UUlkoU0FCQlJFVk1PTlRITkFNRTEzKSwKCUxPQ0FMRV9FTlRSWShTUE9TSVRJVkVTSUdOKSwKCUxPQ0FMRV9FTlRSWShTTkVHQVRJVkVTSUdOKSwKCUxPQ0FMRV9FTlRSWShJUE9TU0lHTlBPU04pLAoJTE9DQUxFX0VOVFJZKElORUdTSUdOUE9TTiksCglMT0NBTEVfRU5UUlkoSVBPU1NZTVBSRUNFREVTKSwKCUxPQ0FMRV9FTlRSWShJUE9TU0VQQllTUEFDRSksCglMT0NBTEVfRU5UUlkoSU5FR1NZTVBSRUNFREVTKSwKCUxPQ0FMRV9FTlRSWShJTkVHU0VQQllTUEFDRSksCglMT0NBTEVfRU5UUlkoRk9OVFNJR05BVFVSRSksCglMT0NBTEVfRU5UUlkoU0lTTzYzOUxBTkdOQU1FKSwKCUxPQ0FMRV9FTlRSWShTSVNPMzE2NkNUUllOQU1FKSwKCXtOVUxMLDB9Cn07CgpzdGF0aWMgY2hhciAqR2V0TG9jYWxlU3Via2V5TmFtZSggRFdPUkQgbGN0eXBlICk7CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIEdldFVzZXJEZWZhdWx0TENJRCAgICAgICBbS0VSTkVMMzIuNDI1XQogKi8KTENJRCBXSU5BUEkgR2V0VXNlckRlZmF1bHRMQ0lEKHZvaWQpCnsKCXJldHVybiBNQUtFTENJRCggR2V0VXNlckRlZmF1bHRMYW5nSUQoKSAsIFNPUlRfREVGQVVMVCApOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICBHZXRTeXN0ZW1EZWZhdWx0TENJRCAgICAgICBbS0VSTkVMMzIuNDAwXQogKi8KTENJRCBXSU5BUEkgR2V0U3lzdGVtRGVmYXVsdExDSUQodm9pZCkKewoJcmV0dXJuIEdldFVzZXJEZWZhdWx0TENJRCgpOwp9CgojZGVmaW5lIE5MU19NQVhfTEFOR1VBR0VTIDIwCnR5cGVkZWYgc3RydWN0IHsKICAgIGNoYXIgbGFuZ1sxMjhdOwogICAgY2hhciBjb3VudHJ5WzEyOF07CiAgICBMQU5HSUQgZm91bmRfbGFuZ19pZFtOTFNfTUFYX0xBTkdVQUdFU107CiAgICBjaGFyIGZvdW5kX2xhbmd1YWdlW05MU19NQVhfTEFOR1VBR0VTXVszXTsKICAgIGNoYXIgZm91bmRfY291bnRyeVtOTFNfTUFYX0xBTkdVQUdFU11bM107CiAgICBpbnQgbl9mb3VuZDsKfSBMQU5HX0ZJTkRfREFUQTsKCnN0YXRpYyBCT09MIENBTExCQUNLIE5MU19GaW5kTGFuZ3VhZ2VJRF9Qcm9jQShITU9EVUxFIGhNb2R1bGUsIExQQ1NUUiB0eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBDU1RSIG5hbWUsIFdPUkQgTGFuZ0lELCBMT05HIGxQYXJhbSkKewogICAgTEFOR19GSU5EX0RBVEEgKmxfZGF0YSA9IChMQU5HX0ZJTkRfREFUQSAqKWxQYXJhbTsKICAgIExDSUQgbGNpZCA9IE1BS0VMQ0lEKExhbmdJRCwgU09SVF9ERUZBVUxUKTsKICAgIGNoYXIgYnVmX2xhbmd1YWdlWzEyOF07CiAgICBjaGFyIGJ1Zl9jb3VudHJ5WzEyOF07CiAgICBjaGFyIGJ1Zl9lbl9sYW5ndWFnZVsxMjhdOwoKICAgIFRSQUNFKCIlMDRYXG4iLCAoVUlOVClMYW5nSUQpOwogICAgaWYoUFJJTUFSWUxBTkdJRChMYW5nSUQpID09IExBTkdfTkVVVFJBTCkKICAgICAgICByZXR1cm4gVFJVRTsgLyogY29udGludWUgc2VhcmNoICovCgogICAgYnVmX2xhbmd1YWdlWzBdID0gMDsKICAgIGJ1Zl9jb3VudHJ5WzBdID0gMDsKCiAgICBHZXRMb2NhbGVJbmZvQShsY2lkLCBMT0NBTEVfU0lTTzYzOUxBTkdOQU1FfExPQ0FMRV9OT1VTRVJPVkVSUklERSwKICAgICAgICAgICAgICAgICAgIGJ1Zl9sYW5ndWFnZSwgc2l6ZW9mKGJ1Zl9sYW5ndWFnZSkpOwogICAgVFJBQ0UoIkxPQ0FMRV9TSVNPNjM5TEFOR05BTUU6ICVzXG4iLCBidWZfbGFuZ3VhZ2UpOwoKICAgIEdldExvY2FsZUluZm9BKGxjaWQsIExPQ0FMRV9TSVNPMzE2NkNUUllOQU1FfExPQ0FMRV9OT1VTRVJPVkVSUklERSwKICAgICAgICAgICAgICAgICAgIGJ1Zl9jb3VudHJ5LCBzaXplb2YoYnVmX2NvdW50cnkpKTsKICAgIFRSQUNFKCJMT0NBTEVfU0lTTzMxNjZDVFJZTkFNRTogJXNcbiIsIGJ1Zl9jb3VudHJ5KTsKCiAgICBpZihsX2RhdGEtPmxhbmcgJiYgc3RybGVuKGxfZGF0YS0+bGFuZykgPiAwICYmICFzdHJjYXNlY21wKGxfZGF0YS0+bGFuZywgYnVmX2xhbmd1YWdlKSkKICAgIHsKCWlmKGxfZGF0YS0+Y291bnRyeSAmJiBzdHJsZW4obF9kYXRhLT5jb3VudHJ5KSA+IDApCgl7CgkgICAgaWYoIXN0cmNhc2VjbXAobF9kYXRhLT5jb3VudHJ5LCBidWZfY291bnRyeSkpCgkgICAgewoJCWxfZGF0YS0+Zm91bmRfbGFuZ19pZFswXSA9IExhbmdJRDsKCQlsX2RhdGEtPm5fZm91bmQgPSAxOwoJCVRSQUNFKCJGb3VuZCBsYW5nX2lkICUwNFggZm9yICVzXyVzXG4iLCBMYW5nSUQsIGxfZGF0YS0+bGFuZywgbF9kYXRhLT5jb3VudHJ5KTsKCQlyZXR1cm4gRkFMU0U7IC8qIHN0b3AgZW51bWVyYXRpb24gKi8KCSAgICB9Cgl9CgllbHNlIC8qIGxfZGF0YS0+Y291bnRyeSBub3Qgc3BlY2lmaWVkICovCgl7CgkgICAgaWYobF9kYXRhLT5uX2ZvdW5kIDwgTkxTX01BWF9MQU5HVUFHRVMpCgkgICAgewoJCWxfZGF0YS0+Zm91bmRfbGFuZ19pZFtsX2RhdGEtPm5fZm91bmRdID0gTGFuZ0lEOwoJCXN0cm5jcHkobF9kYXRhLT5mb3VuZF9jb3VudHJ5W2xfZGF0YS0+bl9mb3VuZF0sIGJ1Zl9jb3VudHJ5LCAzKTsKCQlzdHJuY3B5KGxfZGF0YS0+Zm91bmRfbGFuZ3VhZ2VbbF9kYXRhLT5uX2ZvdW5kXSwgYnVmX2xhbmd1YWdlLCAzKTsKCQlsX2RhdGEtPm5fZm91bmQrKzsKCQlUUkFDRSgiRm91bmQgbGFuZ19pZCAlMDRYIGZvciAlc1xuIiwgTGFuZ0lELCBsX2RhdGEtPmxhbmcpOwoJCXJldHVybiBUUlVFOyAvKiBjb250aW51ZSBzZWFyY2ggKi8KCSAgICB9Cgl9CiAgICB9CgogICAgLyogSnVzdCBpbiBjYXNlLCBjaGVjayBMT0NBTEVfU0VOR0xBTkdVQUdFIHRvbywKICAgICAqIGluIGhvcGUgdGhhdCBwb3NzaWJsZSBhbGlhcyBuYW1lIG1pZ2h0IGhhdmUgdGhhdCB2YWx1ZS4KICAgICAqLwogICAgYnVmX2VuX2xhbmd1YWdlWzBdID0gMDsKICAgIEdldExvY2FsZUluZm9BKGxjaWQsIExPQ0FMRV9TRU5HTEFOR1VBR0V8TE9DQUxFX05PVVNFUk9WRVJSSURFLAogICAgICAgICAgICAgICAgICAgYnVmX2VuX2xhbmd1YWdlLCBzaXplb2YoYnVmX2VuX2xhbmd1YWdlKSk7CiAgICBUUkFDRSgiTE9DQUxFX1NFTkdMQU5HVUFHRTogJXNcbiIsIGJ1Zl9lbl9sYW5ndWFnZSk7CgogICAgaWYobF9kYXRhLT5sYW5nICYmIHN0cmxlbihsX2RhdGEtPmxhbmcpID4gMCAmJiAhc3RyY2FzZWNtcChsX2RhdGEtPmxhbmcsIGJ1Zl9lbl9sYW5ndWFnZSkpCiAgICB7CglsX2RhdGEtPmZvdW5kX2xhbmdfaWRbbF9kYXRhLT5uX2ZvdW5kXSA9IExhbmdJRDsKCXN0cm5jcHkobF9kYXRhLT5mb3VuZF9jb3VudHJ5W2xfZGF0YS0+bl9mb3VuZF0sIGJ1Zl9jb3VudHJ5LCAzKTsKCXN0cm5jcHkobF9kYXRhLT5mb3VuZF9sYW5ndWFnZVtsX2RhdGEtPm5fZm91bmRdLCBidWZfbGFuZ3VhZ2UsIDMpOwoJbF9kYXRhLT5uX2ZvdW5kKys7CglUUkFDRSgiRm91bmQgbGFuZ19pZCAlMDRYIGZvciAlc1xuIiwgTGFuZ0lELCBsX2RhdGEtPmxhbmcpOwogICAgfQoKICAgIHJldHVybiBUUlVFOyAvKiBjb250aW51ZSBzZWFyY2ggKi8KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBOTFNfR2V0TGFuZ3VhZ2VJRAogKgogKiBJTlBVVDoKICoJTGFuZzogYSBzdHJpbmcgd2hvc2UgdHdvIGZpcnN0IGNoYXJzIGFyZSB0aGUgaXNvIG5hbWUgb2YgYSBsYW5ndWFnZS4KICoJQ291bnRyeTogYSBzdHJpbmcgd2hvc2UgdHdvIGZpcnN0IGNoYXJzIGFyZSB0aGUgaXNvIG5hbWUgb2YgY291bnRyeQogKglDaGFyc2V0OiBhIHN0cmluZyBkZWZpbmluZyB0aGUgY2hvc3NlbiBjaGFyc2V0IGVuY29kaW5nCiAqCURpYWxlY3Q6IGEgc3RyaW5nIGRlZmluaW5nIGEgdmFyaWF0aW9uIG9mIHRoZSBsb2NhbGUKICoKICoJYWxsIHRob3NlIHZhbHVlcyBhcmUgZnJvbSB0aGUgc3RhbmRhcmRpemVkIGZvcm1hdCBvZiBsb2NhbGUKICoJbmFtZSBpbiB1bml4IHdoaWNoIGlzOiBMYW5nW19Db3VudHJ5XVsuQ2hhcnNldF1bQERpYWxlY3RdCiAqCiAqIFJFVFVSTlM6CiAqCXRoZSBudW1lcmljIGNvZGUgb2YgdGhlIGxhbmd1YWdlIHVzZWQgYnkgV2luZG93cwogKgogKiBGSVhNRTogQ2hhcnNldCBhbmQgRGlhbGVjdCBhcmUgbm90IGhhbmRsZWQKICovCnN0YXRpYyBMQU5HSUQgTkxTX0dldExhbmd1YWdlSUQoTFBDU1RSIExhbmcsIExQQ1NUUiBDb3VudHJ5LCBMUENTVFIgQ2hhcnNldCwgTFBDU1RSIERpYWxlY3QpCnsKICAgIExBTkdfRklORF9EQVRBIGxfZGF0YTsKICAgIGNoYXIgbGFuZ19zdHJpbmdbMjU2XTsKCiAgICBpZighTGFuZykKICAgIHsKCWxfZGF0YS5mb3VuZF9sYW5nX2lkWzBdID0gTUFLRUxBTkdJRChMQU5HX0VOR0xJU0gsIFNVQkxBTkdfREVGQVVMVCk7Cglnb3RvIEVORDsKICAgIH0KCiAgICBtZW1zZXQoJmxfZGF0YSwgMCwgc2l6ZW9mKExBTkdfRklORF9EQVRBKSk7CiAgICBzdHJuY3B5KGxfZGF0YS5sYW5nLCBMYW5nLCBzaXplb2YobF9kYXRhLmxhbmcpKTsKCiAgICBpZihDb3VudHJ5ICYmIHN0cmxlbihDb3VudHJ5KSA+IDApCglzdHJuY3B5KGxfZGF0YS5jb3VudHJ5LCBDb3VudHJ5LCBzaXplb2YobF9kYXRhLmNvdW50cnkpKTsKCiAgICBFbnVtUmVzb3VyY2VMYW5ndWFnZXNBKEdldE1vZHVsZUhhbmRsZUEoIktFUk5FTDMyIiksIFJUX1NUUklOR0EsCgkoTFBDU1RSKUxPQ0FMRV9JTEFOR1VBR0UsIE5MU19GaW5kTGFuZ3VhZ2VJRF9Qcm9jQSwgKExPTkcpJmxfZGF0YSk7CgogICAgc3RyY3B5KGxhbmdfc3RyaW5nLCBsX2RhdGEubGFuZyk7CiAgICBpZihsX2RhdGEuY291bnRyeSAmJiBzdHJsZW4obF9kYXRhLmNvdW50cnkpID4gMCkKICAgIHsKCXN0cmNhdChsYW5nX3N0cmluZywgIl8iKTsKCXN0cmNhdChsYW5nX3N0cmluZywgbF9kYXRhLmNvdW50cnkpOwogICAgfQoKICAgIGlmKCFsX2RhdGEubl9mb3VuZCkKICAgIHsKCWlmKGxfZGF0YS5jb3VudHJ5ICYmIHN0cmxlbihsX2RhdGEuY291bnRyeSkgPiAwKQoJewoJICAgIE1FU1NBR0UoIldhcm5pbmc6IExhbmd1YWdlICclcycgd2FzIG5vdCBmb3VuZCwgcmV0cnlpbmcgd2l0aG91dCBjb3VudHJ5IG5hbWUuLi5cbiIsIGxhbmdfc3RyaW5nKTsKCSAgICBsX2RhdGEuY291bnRyeVswXSA9IDA7CgkgICAgRW51bVJlc291cmNlTGFuZ3VhZ2VzQShHZXRNb2R1bGVIYW5kbGVBKCJLRVJORUwzMiIpLCBSVF9TVFJJTkdBLAoJCShMUENTVFIpTE9DQUxFX0lMQU5HVUFHRSwgTkxTX0ZpbmRMYW5ndWFnZUlEX1Byb2NBLCAoTE9ORykmbF9kYXRhKTsKCX0KICAgIH0KCiAgICAvKiBSZS1ldmFsdWF0ZSBsYW5nX3N0cmluZyAqLwogICAgc3RyY3B5KGxhbmdfc3RyaW5nLCBsX2RhdGEubGFuZyk7CiAgICBpZihsX2RhdGEuY291bnRyeSAmJiBzdHJsZW4obF9kYXRhLmNvdW50cnkpID4gMCkKICAgIHsKCXN0cmNhdChsYW5nX3N0cmluZywgIl8iKTsKCXN0cmNhdChsYW5nX3N0cmluZywgbF9kYXRhLmNvdW50cnkpOwogICAgfQoKICAgIGlmKCFsX2RhdGEubl9mb3VuZCkKICAgIHsKCU1FU1NBR0UoIldhcm5pbmc6IExhbmd1YWdlICclcycgd2FzIG5vdCByZWNvZ25pemVkLCBkZWZhdWx0aW5nIHRvIEVuZ2xpc2hcbiIsIGxhbmdfc3RyaW5nKTsKCWxfZGF0YS5mb3VuZF9sYW5nX2lkWzBdID0gTUFLRUxBTkdJRChMQU5HX0VOR0xJU0gsIFNVQkxBTkdfREVGQVVMVCk7CiAgICB9CiAgICBlbHNlCiAgICB7CglpZihsX2RhdGEubl9mb3VuZCA9PSAxKQoJICAgIFRSQUNFKCJGb3IgbGFuZ3VhZ2UgJyVzJyBsYW5nX2lkICUwNFggd2FzIGZvdW5kXG4iLCBsYW5nX3N0cmluZywgbF9kYXRhLmZvdW5kX2xhbmdfaWRbMF0pOwoJZWxzZSAvKiBsX2RhdGEtPm5fZm91bmQgPiAxICovCgl7CgkgICAgaW50IGk7CgkgICAgTUVTU0FHRSgiRm9yIGxhbmd1YWdlICclcycgc2V2ZXJhbCBsYW5ndWFnZSBpZHMgd2VyZSBmb3VuZDpcbiIsIGxhbmdfc3RyaW5nKTsKCSAgICBmb3IoaSA9IDA7IGkgPCBsX2RhdGEubl9mb3VuZDsgaSsrKQoJCU1FU1NBR0UoIiVzXyVzIC0gJTA0WDsgIiwgbF9kYXRhLmZvdW5kX2xhbmd1YWdlW2ldLCBsX2RhdGEuZm91bmRfY291bnRyeVtpXSwgbF9kYXRhLmZvdW5kX2xhbmdfaWRbaV0pOwoKCSAgICBNRVNTQUdFKCJcbkluc3RlYWQgb2YgdXNpbmcgZmlyc3QgaW4gdGhlIGxpc3QsIHN1Z2dlc3QgdG8gZGVmaW5lXG4iCgkJICAgICJ5b3VyIExBTkcgZW52aXJvbm1lbnQgdmFyaWFibGUgbGlrZSB0aGlzOiBMQU5HPSVzXyVzXG4iLAoJCSAgICBsX2RhdGEuZm91bmRfbGFuZ3VhZ2VbMF0sIGxfZGF0YS5mb3VuZF9jb3VudHJ5WzBdKTsKCX0KICAgIH0KRU5EOgogICAgVFJBQ0UoIlJldHVybmluZyAlMDRYXG4iLCBsX2RhdGEuZm91bmRfbGFuZ19pZFswXSk7CiAgICByZXR1cm4gbF9kYXRhLmZvdW5kX2xhbmdfaWRbMF07Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgIEdldFVzZXJEZWZhdWx0TGFuZ0lEICAgICAgIFtLRVJORUwzMi40MjZdCiAqLwpMQU5HSUQgV0lOQVBJIEdldFVzZXJEZWZhdWx0TGFuZ0lEKHZvaWQpCnsKCS8qIGNhY2hpbmcgcmVzdWx0LCBpZiBkZWZpbmVkIGZyb20gZW52aXJvbm1lbnQsIHdoaWNoIHNob3VsZCAoPykgbm90IGNoYW5nZSBkdXJpbmcgYSBXSU5FIHNlc3Npb24gKi8KCXN0YXRpYwlMQU5HSUQJdXNlckxDSUQgPSAwOwoKCWlmICh1c2VyTENJRCA9PSAwKQogICAgICAgIHsKICAgICAgICAgICAgICAgIGNoYXIgYnVmWzI1Nl07CgkJY2hhciAqbGFuZywqY291bnRyeSwqY2hhcnNldCwqZGlhbGVjdCwqbmV4dDsKCgkJaWYgKEdldEVudmlyb25tZW50VmFyaWFibGVBKCAiTEFOR1VBR0UiLCBidWYsIHNpemVvZihidWYpICkpIGdvdG8gb2s7CgkJaWYgKEdldEVudmlyb25tZW50VmFyaWFibGVBKCAiTEFORyIsIGJ1Ziwgc2l6ZW9mKGJ1ZikgKSkgZ290byBvazsKCQlpZiAoR2V0RW52aXJvbm1lbnRWYXJpYWJsZUEoICJMQ19BTEwiLCBidWYsIHNpemVvZihidWYpICkpIGdvdG8gb2s7CgkJaWYgKEdldEVudmlyb25tZW50VmFyaWFibGVBKCAiTENfTUVTU0FHRVMiLCBidWYsIHNpemVvZihidWYpICkpIGdvdG8gb2s7CgkJaWYgKEdldEVudmlyb25tZW50VmFyaWFibGVBKCAiTENfQ1RZUEUiLCBidWYsIHNpemVvZihidWYpICkpIGdvdG8gb2s7CgoJCXJldHVybiB1c2VyTENJRCA9IE1BS0VMQU5HSUQoIExBTkdfRU5HTElTSCwgU1VCTEFOR19ERUZBVUxUICk7CgogICAgICAgIG9rOgoJCWlmICghc3RyY21wKGJ1ZiwiUE9TSVgiKSB8fCAhc3RyY21wKGJ1ZiwiQyIpKQogICAgICAgICAgICAgICAgICAgIHJldHVybiB1c2VyTENJRCA9IE1BS0VMQU5HSUQoIExBTkdfRU5HTElTSCwgU1VCTEFOR19ERUZBVUxUICk7CgkJCgkJbGFuZz1idWY7CgkJCgkJZG8gewoJCQluZXh0PXN0cmNocihsYW5nLCc6Jyk7IGlmIChuZXh0KSAqbmV4dCsrPSdcMCc7CgkJCWRpYWxlY3Q9c3RyY2hyKGxhbmcsJ0AnKTsgaWYgKGRpYWxlY3QpICpkaWFsZWN0Kys9J1wwJzsKCQkJY2hhcnNldD1zdHJjaHIobGFuZywnLicpOyBpZiAoY2hhcnNldCkgKmNoYXJzZXQrKz0nXDAnOwoJCQljb3VudHJ5PXN0cmNocihsYW5nLCdfJyk7IGlmIChjb3VudHJ5KSAqY291bnRyeSsrPSdcMCc7CgkJCQoJCQl1c2VyTENJRCA9IE5MU19HZXRMYW5ndWFnZUlEKGxhbmcsIGNvdW50cnksIGNoYXJzZXQsIGRpYWxlY3QpOwoJCQkKCQkJbGFuZz1uZXh0OwoJCX0gd2hpbGUgKGxhbmcgJiYgIXVzZXJMQ0lEKTsKCgkJaWYgKCF1c2VyTENJRCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBNRVNTQUdFKCAiV2FybmluZzogbGFuZ3VhZ2UgJyVzJyBub3QgcmVjb2duaXplZCwgZGVmYXVsdGluZyB0byBFbmdsaXNoXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZiApOwogICAgICAgICAgICAgICAgICAgIHVzZXJMQ0lEID0gTUFLRUxBTkdJRCggTEFOR19FTkdMSVNILCBTVUJMQU5HX0RFRkFVTFQgKTsKICAgICAgICAgICAgICAgIH0KCX0KCXJldHVybiB1c2VyTENJRDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgR2V0U3lzdGVtRGVmYXVsdExhbmdJRCAgICAgW0tFUk5FTDMyLjQwMV0KICovCkxBTkdJRCBXSU5BUEkgR2V0U3lzdGVtRGVmYXVsdExhbmdJRCh2b2lkKQp7CglyZXR1cm4gR2V0VXNlckRlZmF1bHRMYW5nSUQoKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBDb252ZXJ0RGVmYXVsdExvY2FsZSBbS0VSTkVMMzIuMTQ3XQogKi8KTENJRCBXSU5BUEkgQ29udmVydERlZmF1bHRMb2NhbGUgKExDSUQgbGNpZCkKewlzd2l0Y2ggKGxjaWQpCgl7ICBjYXNlIExPQ0FMRV9TWVNURU1fREVGQVVMVDoKCSAgICAgcmV0dXJuIEdldFN5c3RlbURlZmF1bHRMQ0lEKCk7CgkgICBjYXNlIExPQ0FMRV9VU0VSX0RFRkFVTFQ6CgkgICAgIHJldHVybiBHZXRVc2VyRGVmYXVsdExDSUQoKTsKCSAgIGNhc2UgTE9DQUxFX05FVVRSQUw6CgkgICAgIHJldHVybiBNQUtFTENJRCAoTEFOR19ORVVUUkFMLCBTVUJMQU5HX05FVVRSQUwpOwoJfSAgCglyZXR1cm4gTUFLRUxBTkdJRCggUFJJTUFSWUxBTkdJRChsY2lkKSwgU1VCTEFOR19ORVVUUkFMKTsKfQoKLyogRW5oYW5jZWQgdmVyc2lvbiBvZiBMb2FkU3RyaW5nVy4KICogSXQgdGFrZXMgTGFuZ3VhZ2VJZCB0byBmaW5kIGFuZCBsb2FkIGxhbmd1YWdlIGRlcGVuZGFudCByZXNvdXJjZXMuCiAqIFJlc291cmNlIGlzIGNvcGllZCBhcyBpczogImJpbmFyeSIgc3RyaW5ncyBhcmUgbm90IHRydW5jYXRlZC4KICogUmV0dXJuOiBsZW5ndGggb2YgcmVzb3VyY2UgKyAxIHRvIGRpc3Rpbmd1aXNoIGFic2VudCByZXNvdXJjZXMKICogZnJvbSB0aGUgcmVzb3VyY2VzIHdpdGggemVybyBsZW5ndGguCiAqLwpzdGF0aWMgSU5UIE5MU19Mb2FkU3RyaW5nRXhXKEhNT0RVTEUgaE1vZHVsZSwgTEFOR0lEIGxhbmdfaWQsIFVJTlQgcmVzX2lkLCBMUFdTVFIgYnVmZmVyLCBJTlQgYnVmbGVuKQp7CiAgICBIUlNSQyBocnNyYzsKICAgIEhHTE9CQUwgaG1lbTsKICAgIFdDSEFSICpwOwogICAgaW50IHN0cmluZ19udW07CiAgICBpbnQgaTsKCiAgICBocnNyYyA9IEZpbmRSZXNvdXJjZUV4VyhoTW9kdWxlLCBSVF9TVFJJTkdXLCAoTFBDV1NUUikoKHJlc19pZCA+PiA0KSArIDEpLCBsYW5nX2lkKTsKCiAgICBpZighaHJzcmMpIHJldHVybiAwOwogICAgaG1lbSA9IExvYWRSZXNvdXJjZShoTW9kdWxlLCBocnNyYyk7CiAgICBpZighaG1lbSkgcmV0dXJuIDA7CiAgICAKICAgIHAgPSBMb2NrUmVzb3VyY2UoaG1lbSk7CiAgICBzdHJpbmdfbnVtID0gcmVzX2lkICYgMHgwMDBmOwogICAgZm9yKGkgPSAwOyBpIDwgc3RyaW5nX251bTsgaSsrKQoJcCArPSAqcCArIDE7CiAgICAKICAgIFRSQUNFKCJzdHJsZW4gPSAlZFxuIiwgKGludCkqcCApOwogICAgCiAgICBpZiAoYnVmZmVyID09IE5VTEwpIHJldHVybiAqcDsKICAgIGkgPSBtaW4oYnVmbGVuIC0gMSwgKnApOwogICAgaWYgKGkgPiAwKSB7CgltZW1jcHkoYnVmZmVyLCBwICsgMSwgaSAqIHNpemVvZiAoV0NIQVIpKTsKCWJ1ZmZlcltpXSA9IChXQ0hBUikgMDsKICAgIH0gZWxzZSB7CglpZiAoYnVmbGVuID4gMSkKCSAgICBidWZmZXJbMF0gPSAoV0NIQVIpIDA7CiAgICB9CgogICAgRnJlZVJlc291cmNlKGhtZW0pOwogICAgVFJBQ0UoIlwiJXNcIiBsb2FkZWQhXG4iLCBkZWJ1Z3N0cl93KGJ1ZmZlcikpOwogICAgcmV0dXJuIChpICsgMSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogR2V0TG9jYWxlSW5mb0EgW0tFUk5FTDMyLjM0Ml0KICoKICogTk9URVMgCiAqICBMQU5HX05FVVRSQUwgaXMgZXF1YWwgdG8gTE9DQUxFX1NZU1RFTV9ERUZBVUxUCiAqCiAqICBNUyBvbmxpbmUgZG9jdW1lbnRhdGlvbiBzdGF0ZXMgdGhhdCB0aGUgc3RyaW5nIHJldHVybmVkIGlzIE5VTEwgdGVybWluYXRlZAogKiAgZXhjZXB0IGZvciBMT0NBTEVfRk9OVFNJR05BVFVSRSAgd2hpY2ggIndpbGwgcmV0dXJuIGEgbm9uLU5VTEwKICogIHRlcm1pbmF0ZWQgc3RyaW5nIi4KICovCklOVCBXSU5BUEkgR2V0TG9jYWxlSW5mb0EoTENJRCBsY2lkLExDVFlQRSBMQ1R5cGUsTFBTVFIgYnVmLElOVCBsZW4pCnsKICAgIExQQ1NUUiAgcmV0U3RyaW5nID0gTlVMTDsKICAgIGludAlmb3VuZCA9IDAsIGk7CiAgICBjaGFyICAgICpwYWNLZXk7CiAgICBjaGFyICAgIGFjQnVmZmVyWzEyOF07CiAgICBEV09SRCAgIGR3QnVmZmVyU2l6ZT0xMjg7CiAgICBCT09MIE5vVXNlck92ZXJyaWRlOwoKICBUUkFDRSgiKGxjaWQ9MHglbHgsbGN0eXBlPTB4JWx4LCVwLCV4KVxuIixsY2lkLExDVHlwZSxidWYsbGVuKTsKCiAgaWYgKGxlbiAmJiAoISBidWYpICkgewogICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOU1VGRklDSUVOVF9CVUZGRVIpOwoJCXJldHVybiAwOwoJfQoKCWlmIChsY2lkID09IExPQ0FMRV9ORVVUUkFMIHx8IGxjaWQgPT0gTEFOR19TWVNURU1fREVGQVVMVCkKCXsKICAgICAgICAgICAgbGNpZCA9IEdldFN5c3RlbURlZmF1bHRMQ0lEKCk7Cgl9IAoJZWxzZSBpZiAobGNpZCA9PSBMQU5HX1VTRVJfREVGQVVMVCkgLyoweDgwMCovCgl7CiAgICAgICAgICAgIGxjaWQgPSBHZXRVc2VyRGVmYXVsdExDSUQoKTsKCX0KCiAgICAvKiBMT0NBTEVfTk9VU0VST1ZFUlJJREUgbWVhbnM6IGRvIG5vdCBnZXQgdXNlciByZWRlZmluZWQgc2V0dGluZ3MKICAgICAgIGZyb20gdGhlIHJlZ2lzdHJ5LiBJbnN0ZWFkLCB1c2Ugc3lzdGVtIGRlZmF1bHQgdmFsdWVzLiAqLwogICAgTm9Vc2VyT3ZlcnJpZGUgPSAoTENUeXBlICYgTE9DQUxFX05PVVNFUk9WRVJSSURFKSAhPSAwOwoKCUxDVHlwZSAmPSB+KExPQ0FMRV9OT1VTRVJPVkVSUklERXxMT0NBTEVfVVNFX0NQX0FDUCk7CgogICAgLyogRmlyc3QsIGNoZWNrIGlmIGl0J3MgaW4gdGhlIHJlZ2lzdHJ5LiAqLwogICAgLyogQWxsIHVzZXIgY3VzdG9taXplZCB2YWx1ZXMgYXJlIHN0b3JlZCBpbiB0aGUgcmVnaXN0cnkgYnkgU2V0TG9jYWxlSW5mbyAqLwogICAgaWYgKCAhTm9Vc2VyT3ZlcnJpZGUgJiYgKHBhY0tleSA9IEdldExvY2FsZVN1YmtleU5hbWUoTENUeXBlKSkgKQogICAgewogICAgICAgIGNoYXIgICAgYWNSZWFsS2V5WzEyOF07CiAgICAgICAgSEtFWSAgICBoS2V5OwoKICAgICAgICBzcHJpbnRmKCBhY1JlYWxLZXksICJDb250cm9sIFBhbmVsXFxJbnRlcm5hdGlvbmFsXFwlcyIsIHBhY0tleSApOwoKICAgICAgICBpZiAoIFJlZ09wZW5LZXlFeEEoIEhLRVlfQ1VSUkVOVF9VU0VSLCBhY1JlYWxLZXksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgS0VZX1JFQUQsICZoS2V5KSA9PSBFUlJPUl9TVUNDRVNTICkKICAgICAgICB7CiAgICAgICAgICAgIGlmICggUmVnUXVlcnlWYWx1ZUV4QSggaEtleSwgTlVMTCwgTlVMTCwgTlVMTCwgKExQQllURSlhY0J1ZmZlciwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmR3QnVmZmVyU2l6ZSApID09IEVSUk9SX1NVQ0NFU1MgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXRTdHJpbmcgPSBhY0J1ZmZlcjsKICAgICAgICAgICAgICAgIGZvdW5kID0gMTsKICAgICAgICAgICAgfQogICAgICAgICAgICBSZWdDbG9zZUtleShoS2V5KTsKICAgICAgICB9CiAgICB9CgogICAgLyogSWYgbm90IGluIHRoZSByZWdpc3RyeSwgZ2V0IGl0IGZyb20gdGhlIE5MUyBlbnRyaWVzLiAqLwogICAgaWYoIWZvdW5kKSB7CglXQ0hBUiB3Y0J1ZmZlclsxMjhdOwoJaW50IHJlc19zaXplOwoKCS8qIGNoZWNrIGlmIGxhbmd1YWdlIGlzIHJlZ2lzdGVyZWQgaW4gdGhlIGtlcm5lbDMyIHJlc291cmNlcyAqLwoJaWYoKHJlc19zaXplID0gTkxTX0xvYWRTdHJpbmdFeFcoR2V0TW9kdWxlSGFuZGxlQSgiS0VSTkVMMzIiKSwgTEFOR0lERlJPTUxDSUQobGNpZCksCgkJTENUeXBlLCB3Y0J1ZmZlciwgc2l6ZW9mKHdjQnVmZmVyKS9zaXplb2Yod2NCdWZmZXJbMF0pKSkpIHsKCSAgICBXaWRlQ2hhclRvTXVsdGlCeXRlKENQX0FDUCwgMCwgd2NCdWZmZXIsIHJlc19zaXplLCBhY0J1ZmZlciwgZHdCdWZmZXJTaXplLCBOVUxMLCBOVUxMKTsKCSAgICByZXRTdHJpbmcgPSBhY0J1ZmZlcjsKCSAgICBmb3VuZCA9IDE7Cgl9CiAgICB9CgogICAgLyogaWYgbm90IGZvdW5kIHJlcG9ydCBhIG1vc3QgZGVzY3JpcHRpdmUgZXJyb3IgKi8KICAgIGlmKCFmb3VuZCkgewoJcmV0U3RyaW5nPTA7CgkvKiBJZiB3ZSBhcmUgdGhyb3VnaCBhbGwgb2YgdGhpcywgcmV0TGVuIHNob3VsZCBub3QgYmUgemVybyBhbnltb3JlLgoJICAgSWYgaXQgaXMsIHRoZSB2YWx1ZSBpcyBub3Qgc3VwcG9ydGVkICovCglpPTA7Cgl3aGlsZSAobG9jYWxlX25hbWUyaWRbaV0ubmFtZSE9TlVMTCkgewoJICAgIGlmIChMQ1R5cGUgPT0gbG9jYWxlX25hbWUyaWRbaV0uaWQpIHsKCQlyZXRTdHJpbmcgPSBsb2NhbGVfbmFtZTJpZFtpXS5uYW1lOwoJCWJyZWFrOwoJICAgIH0KCSAgICBpKys7Cgl9CglpZighcmV0U3RyaW5nKQoJICAgIEZJWE1FKCJVbmtvd24gTEMgdHlwZSAlbFhcbiIsIExDVHlwZSk7CgllbHNlCgkgICAgRklYTUUoIiclcycgaXMgbm90IGRlZmluZWQgZm9yIHlvdXIgbGFuZ3VhZ2UgKCUwNFgpLlxuIgoJCSJQbGVhc2UgZGVmaW5lIGl0IGluIGRsbHMva2VybmVsL25scy9Zb3VyTGFuZ3VhZ2UubmxzXG4iCgkJImFuZCBzdWJtaXQgcGF0Y2ggZm9yIGluY2x1c2lvbiBpbnRvIHRoZSBuZXh0IFdpbmUgcmVsZWFzZS5cbiIsCgkJCXJldFN0cmluZywgTE9XT1JEKGxjaWQpKTsKCVNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CglyZXR1cm4gMDsJCQkKICAgIH0KCiAgICAvKiBhIEZPTlRTSUdOQVRVUkUgaXMgbm90IGEgc3RyaW5nLCBqdXN0IDYgRFdPUkRzICAqLwogICAgaWYgKExDVHlwZSA9PSBMT0NBTEVfRk9OVFNJR05BVFVSRSkgewogICAgICAgIGlmIChsZW4pIHsKCSAgICBsZW4gPSAobGVuIDwgc2l6ZW9mKEZPTlRTSUdOQVRVUkUpKSA/IGxlbiA6IHNpemVvZihGT05UU0lHTkFUVVJFKTsKICAgICAgICAgICAgbWVtY3B5KGJ1ZiwgcmV0U3RyaW5nLCBsZW4pOwoJICAgIHJldHVybiBsZW47Cgl9CiAgICAgICAgcmV0dXJuIHNpemVvZihGT05UU0lHTkFUVVJFKTsKICAgIH0KICAgIC8qIGlmIGxlbj0wIHJldHVybiBvbmx5IHRoZSBsZW5ndGgsIGRvbid0IHRvdWNoIHRoZSBidWZmZXIqLwogICAgaWYgKGxlbikgewoJbHN0cmNweW5BKGJ1ZixyZXRTdHJpbmcsbGVuKTsKCXJldHVybiBzdHJsZW4oYnVmKSArIDE7CiAgICB9CiAgICByZXR1cm4gc3RybGVuKHJldFN0cmluZykrMTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJR2V0TG9jYWxlSW5mb1cJW0tFUk5FTDMyLjM0M10KICoKICogTk9URVMKICogIE1TIGRvY3VtZW50YXRpb24gc3RhdGVzIHRoYXQgbGVuICJzcGVjaWZpZXMgdGhlIHNpemUsIGluIGJ5dGVzIChBTlNJIHZlcnNpb24pCiAqICBvciBjaGFyYWN0ZXJzIChVbmljb2RlIHZlcnNpb24pLCBvZiIgd2J1Zi4gVGh1cyB0aGUgbnVtYmVyIHJldHVybmVkIGlzCiAqICB0aGUgc2FtZSBiZXR3ZWVuIEdldExvY2FsZUluZm9XIGFuZCBHZXRMb2NhbGVJbmZvQS4KICovCklOVCBXSU5BUEkgR2V0TG9jYWxlSW5mb1coTENJRCBsY2lkLExDVFlQRSBMQ1R5cGUsTFBXU1RSIHdidWYsSU5UIGxlbikKewlXT1JEIHdsZW47CglMUFNUUiBhYnVmOwoJCglpZiAobGVuICYmICghIHdidWYpICkKCXsgU2V0TGFzdEVycm9yKEVSUk9SX0lOU1VGRklDSUVOVF9CVUZGRVIpOwoJICByZXR1cm4gMDsKCX0KCglhYnVmID0gKExQU1RSKUhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLDAsbGVuKTsKCXdsZW4gPSBHZXRMb2NhbGVJbmZvQShsY2lkLCBMQ1R5cGUsIGFidWYsIGxlbik7CgoJaWYgKHdsZW4gJiYgbGVuKQkvKiBpZiBsZW49MCByZXR1cm4gb25seSB0aGUgbGVuZ3RoKi8KICAgICAgICAgICAgTXVsdGlCeXRlVG9XaWRlQ2hhciggQ1BfQUNQLCAwLCBhYnVmLCAtMSwgd2J1ZiwgbGVuICk7CgoJSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwwLGFidWYpOwoJcmV0dXJuIHdsZW47Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICoJCUdldExvY2FsZVN1YmtleU5hbWUgW2hlbHBlciBmdW5jdGlvbl0KICoKICogICAgICAgICAgLSBGb3IgdXNlIHdpdGggdGhlIHJlZ2lzdHJ5LgogKiAgICAgICAgICAtIEdldHMgdGhlIHJlZ2lzdHJ5IHN1YmtleSBuYW1lIGZvciBhIGdpdmVuIGxjdHlwZS4KICovCnN0YXRpYyBjaGFyICpHZXRMb2NhbGVTdWJrZXlOYW1lKCBEV09SRCBsY3R5cGUgKQp7CiAgICBjaGFyICAgICpwYWNLZXk9TlVMTDsKCiAgICBzd2l0Y2ggKCBsY3R5cGUgKQogICAgewogICAgLyogVGhlc2UgdmFsdWVzIGFyZSB1c2VkIGJ5IFNldExvY2FsZUluZm8gYW5kIEdldExvY2FsZUluZm8sIGFuZAogICAgICogdGhlIHZhbHVlcyBhcmUgc3RvcmVkIGluIHRoZSByZWdpc3RyeSwgY29uZmlybWVkIHVuZGVyIFdpbmRvd3MsCiAgICAgKiBmb3IgdGhlIG9uZXMgdGhhdCBhY3R1YWxseSBhc3NpZ24gcGFjS2V5LiBDYXNlcyB0aGF0IGFyZW4ndCBmaW5pc2hlZAogICAgICogaGF2ZSBub3QgYmVlbiBjb25maXJtZWQsIHNvIHRoYXQgbXVzdCBiZSBkb25lIGJlZm9yZSB0aGV5IGNhbiBiZQogICAgICogYWRkZWQuCiAgICAgKi8KICAgIGNhc2UgTE9DQUxFX1NEQVRFIDogICAgICAgIC8qIFRoZSBkYXRlIHNlcGFyYXRvci4gKi8KICAgICAgICBwYWNLZXkgPSAic0RhdGUiOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBMT0NBTEVfSUNVUlJESUdJVFM6CiAgICAgICAgcGFjS2V5ID0gImlDdXJyRGlnaXRzIjsKICAgICAgICBicmVhazsKICAgIGNhc2UgTE9DQUxFX1NERUNJTUFMIDoKICAgICAgICBwYWNLZXkgPSAic0RlY2ltYWwiOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBMT0NBTEVfSUNVUlJFTkNZOgogICAgICAgIHBhY0tleSA9ICJpQ3VycmVuY3kiOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBMT0NBTEVfU0dST1VQSU5HIDoKICAgICAgICBwYWNLZXkgPSAic0dyb3VwaW5nIjsKICAgICAgICBicmVhazsKICAgIGNhc2UgTE9DQUxFX0lESUdJVFM6CiAgICAgICAgcGFjS2V5ID0gImlEaWdpdHMiOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBMT0NBTEVfU0xJU1QgOgogICAgICAgIHBhY0tleSA9ICJzTGlzdCI7CiAgICAgICAgYnJlYWs7CiAgICAvKiBjYXNlIExPQ0FMRV9JQ0FMRU5EQVJUWVBFOiAqLwogICAgLyogY2FzZSBMT0NBTEVfSUZJUlNUREFZT0ZXRUVLOiAqLwogICAgLyogY2FzZSBMT0NBTEVfSUZJUlNUV0VFS09GWUVBUjogKi8KICAgIC8qIGNhc2UgTE9DQUxFX1NZRUFSTU9OVEggOiAqLwogICAgLyogY2FzZSBMT0NBTEVfU1BPU0lUSVZFU0lHTiA6ICovCiAgICAvKiBjYXNlIExPQ0FMRV9JUEFQRVJTSVpFOiAqLwogICAgLyogICAgIGJyZWFrOyAqLwogICAgY2FzZSBMT0NBTEVfU0xPTkdEQVRFIDoKICAgICAgICBwYWNLZXkgPSAic0xvbmdEYXRlIjsKICAgICAgICBicmVhazsKICAgIGNhc2UgTE9DQUxFX1NNT05ERUNJTUFMU0VQIDoKICAgICAgICBwYWNLZXkgPSAic01vbkRlY2ltYWxTZXAiOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBMT0NBTEVfU01PTkdST1VQSU5HOgogICAgICAgIHBhY0tleSA9ICJzTW9uR3JvdXBpbmciOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBMT0NBTEVfSU1FQVNVUkU6CiAgICAgICAgcGFjS2V5ID0gImlNZWFzdXJlIjsKICAgICAgICBicmVhazsKICAgIGNhc2UgTE9DQUxFX1NNT05USE9VU0FORFNFUCA6CiAgICAgICAgcGFjS2V5ID0gInNNb25UaG91c2FuZFNlcCI7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIExPQ0FMRV9JTkVHQ1VSUjoKICAgICAgICBwYWNLZXkgPSAiaU5lZ0N1cnIiOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBMT0NBTEVfU05FR0FUSVZFU0lHTiA6CiAgICAgICAgcGFjS2V5ID0gInNOZWdhdGl2ZVNpZ24iOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBMT0NBTEVfSU5FR05VTUJFUjoKICAgICAgICBwYWNLZXkgPSAiaU5lZ051bWJlciI7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIExPQ0FMRV9TU0hPUlREQVRFIDoKICAgICAgICBwYWNLZXkgPSAic1Nob3J0RGF0ZSI7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIExPQ0FMRV9JTERBVEU6ICAgICAgICAvKiBMb25nIERhdGUgZm9ybWF0IG9yZGVyaW5nIHNwZWNpZmllci4gKi8KICAgICAgICBwYWNLZXkgPSAiaUxEYXRlIjsKICAgICAgICBicmVhazsKICAgIGNhc2UgTE9DQUxFX0lMWkVSTzoKICAgICAgICBwYWNLZXkgPSAiaUxaZXJvIjsKICAgICAgICBicmVhazsKICAgIGNhc2UgTE9DQUxFX0lUTFpFUk86CiAgICAgICAgcGFjS2V5ID0gImlUTFplcm8iOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBMT0NBTEVfSVRJTUU6ICAgICAgICAvKiBUaW1lIGZvcm1hdCBzcGVjaWZpZXIuICovCiAgICAgICAgcGFjS2V5ID0gImlUaW1lIjsKICAgICAgICBicmVhazsKICAgIGNhc2UgTE9DQUxFX1NUSE9VU0FORCA6CiAgICAgICAgcGFjS2V5ID0gInNUaG91c2FuZCI7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIExPQ0FMRV9TMTE1OTogICAgICAgIC8qIEFNICovCiAgICAgICAgcGFjS2V5ID0gInMxMTU5IjsKICAgICAgICBicmVhazsKICAgIGNhc2UgTE9DQUxFX1NUSU1FOgogICAgICAgIHBhY0tleSA9ICJzVGltZSI7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIExPQ0FMRV9TMjM1OTogICAgICAgIC8qIFBNICovCiAgICAgICAgcGFjS2V5ID0gInMyMzU5IjsKICAgICAgICBicmVhazsKICAgIGNhc2UgTE9DQUxFX1NUSU1FRk9STUFUIDoKICAgICAgICBwYWNLZXkgPSAic1RpbWVGb3JtYXQiOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBMT0NBTEVfU0NVUlJFTkNZOgogICAgICAgIHBhY0tleSA9ICJzQ3VycmVuY3kiOwogICAgICAgIGJyZWFrOwoKICAgIC8qIFRoZSBmb2xsb3dpbmcgYXJlIG5vdCBsaXN0ZWQgdW5kZXIgTVNETiBhcyBzdXBwb3J0ZWQsIAogICAgICogYnV0IHNlZW0gdG8gYmUgdXNlZCBhbmQgYWxzbyBzdG9yZWQgaW4gdGhlIHJlZ2lzdHJ5LgogICAgICovCgogICAgY2FzZSBMT0NBTEVfSURBVEU6CiAgICAgICAgcGFjS2V5ID0gImlEYXRlIjsKICAgICAgICBicmVhazsKICAgIGNhc2UgTE9DQUxFX1NDT1VOVFJZOgogICAgICAgIHBhY0tleSA9ICJzQ291bnRyeSI7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIExPQ0FMRV9JQ09VTlRSWToKICAgICAgICBwYWNLZXkgPSAiaUNvdW50cnkiOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBMT0NBTEVfU0xBTkdVQUdFOgogICAgICAgIHBhY0tleSA9ICJzTGFuZ3VhZ2UiOwogICAgICAgIGJyZWFrOwoKICAgIGRlZmF1bHQ6CiAgICAgICAgYnJlYWs7CiAgICB9CgogICAgcmV0dXJuKCBwYWNLZXkgKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJU2V0TG9jYWxlSW5mb0EJW0tFUk5FTDMyLjY1Nl0KICovCkJPT0wgV0lOQVBJIFNldExvY2FsZUluZm9BKERXT1JEIGxjaWQsIERXT1JEIGxjdHlwZSwgTFBDU1RSIGRhdGEpCnsKICAgIEhLRVkgICAgaEtleTsKICAgIGNoYXIgICAgKnBhY0tleTsKICAgIGNoYXIgICAgYWNSZWFsS2V5WzEyOF07CgogICAgaWYgKCAocGFjS2V5ID0gR2V0TG9jYWxlU3Via2V5TmFtZShsY3R5cGUpKSApCiAgICB7CiAgICAgICAgc3ByaW50ZiggYWNSZWFsS2V5LCAiQ29udHJvbCBQYW5lbFxcSW50ZXJuYXRpb25hbFxcJXMiLCBwYWNLZXkgKTsKICAgICAgICBpZiAoIFJlZ0NyZWF0ZUtleUEoIEhLRVlfQ1VSUkVOVF9VU0VSLCBhY1JlYWxLZXksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhLZXkgKSA9PSBFUlJPUl9TVUNDRVNTICkKICAgICAgICB7CiAgICAgICAgICAgIGlmICggUmVnU2V0VmFsdWVFeEEoIGhLZXksIE5VTEwsIDAsIFJFR19TWiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsIHN0cmxlbihkYXRhKSsxICkgIT0gRVJST1JfU1VDQ0VTUyApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEVSUigiU2V0TG9jYWxlSW5mb0E6ICVzIGRpZCBub3Qgd29ya1xuIiwgcGFjS2V5ICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgUmVnQ2xvc2VLZXkoIGhLZXkgKTsKICAgICAgICB9CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICBGSVhNRSgiKCVsZCwlbGQsJXMpOiBzdHViXG4iLGxjaWQsbGN0eXBlLGRhdGEpOwogICAgfQogICAgcmV0dXJuIFRSVUU7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUlzVmFsaWRMb2NhbGUJW0tFUk5FTDMyLjQ4OV0KICovCkJPT0wgV0lOQVBJIElzVmFsaWRMb2NhbGUoTENJRCBsY2lkLERXT1JEIGZsYWdzKQp7CiAgICAvKiBjaGVjayBpZiBsYW5ndWFnZSBpcyByZWdpc3RlcmVkIGluIHRoZSBrZXJuZWwzMiByZXNvdXJjZXMgKi8KICAgIGlmKCFGaW5kUmVzb3VyY2VFeFcoR2V0TW9kdWxlSGFuZGxlQSgiS0VSTkVMMzIiKSwgUlRfU1RSSU5HVywgKExQQ1dTVFIpTE9DQUxFX0lMQU5HVUFHRSwgTE9XT1JEKGxjaWQpKSkKCXJldHVybiBGQUxTRTsKICAgIGVsc2UKCXJldHVybiBUUlVFOwp9CgpzdGF0aWMgQk9PTCBDQUxMQkFDSyBFbnVtUmVzb3VyY2VMYW5ndWFnZXNQcm9jVyhITU9EVUxFIGhNb2R1bGUsIExQQ1dTVFIgdHlwZSwKCQlMUENXU1RSIG5hbWUsIFdPUkQgTGFuZ0lELCBMT05HIGxQYXJhbSkKewogICAgQ0hBUiBidWZBWzIwXTsKICAgIFdDSEFSIGJ1ZldbMjBdOwogICAgTE9DQUxFX0VOVU1QUk9DVyBscGZuTG9jYWxlRW51bSA9IChMT0NBTEVfRU5VTVBST0NXKWxQYXJhbTsKICAgIHNwcmludGYoYnVmQSwgIiUwOFgiLCAoVUlOVClMYW5nSUQpOwogICAgTXVsdGlCeXRlVG9XaWRlQ2hhcihDUF9BQ1AsIDAsIGJ1ZkEsIC0xLCBidWZXLCBzaXplb2YoYnVmVykvc2l6ZW9mKGJ1ZldbMF0pKTsKICAgIHJldHVybiBscGZuTG9jYWxlRW51bShidWZXKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJRW51bVN5c3RlbUxvY2FsZXNXCVtLRVJORUwzMi4yMDldCiAqLwpCT09MIFdJTkFQSSBFbnVtU3lzdGVtTG9jYWxlc1coIExPQ0FMRV9FTlVNUFJPQ1cgbHBmbkxvY2FsZUVudW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGZsYWdzICkKewogICAgVFJBQ0UoIiglcCwlMDhseClcbiIsIGxwZm5Mb2NhbGVFbnVtLGZsYWdzKTsKCiAgICBFbnVtUmVzb3VyY2VMYW5ndWFnZXNXKEdldE1vZHVsZUhhbmRsZUEoIktFUk5FTDMyIiksIFJUX1NUUklOR1csCgkgICAgKExQQ1dTVFIpTE9DQUxFX0lMQU5HVUFHRSwgRW51bVJlc291cmNlTGFuZ3VhZ2VzUHJvY1csCgkgICAgKExPTkcpbHBmbkxvY2FsZUVudW0pOwoKICAgIHJldHVybiBUUlVFOwp9CgpzdGF0aWMgQk9PTCBDQUxMQkFDSyBFbnVtUmVzb3VyY2VMYW5ndWFnZXNQcm9jQShITU9EVUxFIGhNb2R1bGUsIExQQ1NUUiB0eXBlLAoJCUxQQ1NUUiBuYW1lLCBXT1JEIExhbmdJRCwgTE9ORyBsUGFyYW0pCnsKICAgIENIQVIgYnVmQVsyMF07CiAgICBMT0NBTEVfRU5VTVBST0NBIGxwZm5Mb2NhbGVFbnVtID0gKExPQ0FMRV9FTlVNUFJPQ0EpbFBhcmFtOwogICAgc3ByaW50ZihidWZBLCAiJTA4WCIsIChVSU5UKUxhbmdJRCk7CiAgICByZXR1cm4gbHBmbkxvY2FsZUVudW0oYnVmQSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUVudW1TeXN0ZW1Mb2NhbGVzQQlbS0VSTkVMMzIuMjA4XQogKi8KQk9PTCBXSU5BUEkgRW51bVN5c3RlbUxvY2FsZXNBKExPQ0FMRV9FTlVNUFJPQ0EgbHBmbkxvY2FsZUVudW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZmxhZ3MpCnsKICAgIFRSQUNFKCIoJXAsJTA4bHgpXG4iLCBscGZuTG9jYWxlRW51bSxmbGFncyk7CgogICAgRW51bVJlc291cmNlTGFuZ3VhZ2VzQShHZXRNb2R1bGVIYW5kbGVBKCJLRVJORUwzMiIpLCBSVF9TVFJJTkdBLAoJICAgIChMUENTVFIpTE9DQUxFX0lMQU5HVUFHRSwgRW51bVJlc291cmNlTGFuZ3VhZ2VzUHJvY0EsCgkgICAgKExPTkcpbHBmbkxvY2FsZUVudW0pOwoKICAgIHJldHVybiBUUlVFOwp9CgpzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBDVF9DVHlwZTJfTFVUW10gPSB7CiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAgMCAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgIDEgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gICAyICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAgMyAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgIDQgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gICA1ICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAgNiAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgIDcgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gICA4ICovCiAgQzJfU0VHTUVOVFNFUEFSQVRPUiwgLyogICAtICAgOSAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgMTAgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gIDExICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAxMiAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgMTMgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gIDE0ICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAxNSAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgMTYgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gIDE3ICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAxOCAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgMTkgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gIDIwICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAyMSAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgMjIgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gIDIzICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAyNCAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgMjUgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gIDI2ICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAyNyAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgMjggKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gIDI5ICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAzMCAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgMzEgKi8KICBDMl9XSElURVNQQUNFLCAvKiAgIC0gIDMyICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiAhIC0gIDMzICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiAiIC0gIDM0ICovIC8qICIgKi8KICBDMl9FVVJPUEVURVJNSU5BVE9SLCAvKiAjIC0gIDM1ICovCiAgQzJfRVVST1BFVEVSTUlOQVRPUiwgLyogJCAtICAzNiAqLwogIEMyX0VVUk9QRVRFUk1JTkFUT1IsIC8qICUgLSAgMzcgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogJiAtICAzOCAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogJyAtICAzOSAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogKCAtICA0MCAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogKSAtICA0MSAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogKiAtICA0MiAqLwogIEMyX0VVUk9QRVRFUk1JTkFUT1IsIC8qICsgLSAgNDMgKi8KICBDMl9DT01NT05TRVBBUkFUT1IsIC8qICwgLSAgNDQgKi8KICBDMl9FVVJPUEVURVJNSU5BVE9SLCAvKiAtIC0gIDQ1ICovCiAgQzJfRVVST1BFU0VQQVJBVE9SLCAvKiAuIC0gIDQ2ICovCiAgQzJfRVVST1BFU0VQQVJBVE9SLCAvKiAvIC0gIDQ3ICovCiAgQzJfRVVST1BFTlVNQkVSLCAvKiAwIC0gIDQ4ICovCiAgQzJfRVVST1BFTlVNQkVSLCAvKiAxIC0gIDQ5ICovCiAgQzJfRVVST1BFTlVNQkVSLCAvKiAyIC0gIDUwICovCiAgQzJfRVVST1BFTlVNQkVSLCAvKiAzIC0gIDUxICovCiAgQzJfRVVST1BFTlVNQkVSLCAvKiA0IC0gIDUyICovCiAgQzJfRVVST1BFTlVNQkVSLCAvKiA1IC0gIDUzICovCiAgQzJfRVVST1BFTlVNQkVSLCAvKiA2IC0gIDU0ICovCiAgQzJfRVVST1BFTlVNQkVSLCAvKiA3IC0gIDU1ICovCiAgQzJfRVVST1BFTlVNQkVSLCAvKiA4IC0gIDU2ICovCiAgQzJfRVVST1BFTlVNQkVSLCAvKiA5IC0gIDU3ICovCiAgQzJfQ09NTU9OU0VQQVJBVE9SLCAvKiA6IC0gIDU4ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiA7IC0gIDU5ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiA8IC0gIDYwICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiA9IC0gIDYxICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiA+IC0gIDYyICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiA/IC0gIDYzICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIEAgLSAgNjQgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogQSAtICA2NSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBCIC0gIDY2ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIEMgLSAgNjcgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogRCAtICA2OCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBFIC0gIDY5ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIEYgLSAgNzAgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogRyAtICA3MSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBIIC0gIDcyICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIEkgLSAgNzMgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogSiAtICA3NCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBLIC0gIDc1ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIEwgLSAgNzYgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogTSAtICA3NyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBOIC0gIDc4ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIE8gLSAgNzkgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogUCAtICA4MCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBRIC0gIDgxICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIFIgLSAgODIgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogUyAtICA4MyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBUIC0gIDg0ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIFUgLSAgODUgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogViAtICA4NiAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBXIC0gIDg3ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIFggLSAgODggKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogWSAtICA4OSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBaIC0gIDkwICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiBbIC0gIDkxICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiBcIC0gIDkyICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiBdIC0gIDkzICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiBeIC0gIDk0ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiBfIC0gIDk1ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiBgIC0gIDk2ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIGEgLSAgOTcgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogYiAtICA5OCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBjIC0gIDk5ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIGQgLSAxMDAgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogZSAtIDEwMSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBmIC0gMTAyICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIGcgLSAxMDMgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogaCAtIDEwNCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBpIC0gMTA1ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIGogLSAxMDYgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogayAtIDEwNyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBsIC0gMTA4ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIG0gLSAxMDkgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogbiAtIDExMCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBvIC0gMTExICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIHAgLSAxMTIgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogcSAtIDExMyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiByIC0gMTE0ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIHMgLSAxMTUgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogdCAtIDExNiAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiB1IC0gMTE3ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIHYgLSAxMTggKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogdyAtIDExOSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiB4IC0gMTIwICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIHkgLSAxMjEgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogeiAtIDEyMiAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogeyAtIDEyMyAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogfCAtIDEyNCAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogfSAtIDEyNSAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogfiAtIDEyNiAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qIH8gLSAxMjcgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiCAIC0gMTI4ICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyoggSAtIDEyOSAqLwogIEMyX09USEVSTkVVVFJBTCwgLyoggiAtIDEzMCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiCDIC0gMTMxICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiCEIC0gMTMyICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiCFIC0gMTMzICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiCGIC0gMTM0ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiCHIC0gMTM1ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIIggLSAxMzYgKi8KICBDMl9FVVJPUEVURVJNSU5BVE9SLCAvKiCJIC0gMTM3ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIIogLSAxMzggKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIIsgLSAxMzkgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogjCAtIDE0MCAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qII0gLSAxNDEgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiCOIC0gMTQyICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogjyAtIDE0MyAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qIJAgLSAxNDQgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIJEgLSAxNDUgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIJIgLSAxNDYgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIJMgLSAxNDcgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIJQgLSAxNDggKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIJUgLSAxNDkgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIJYgLSAxNTAgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIJcgLSAxNTEgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogmCAtIDE1MiAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogmSAtIDE1MyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiCaIC0gMTU0ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiCbIC0gMTU1ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIJwgLSAxNTYgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiCdIC0gMTU3ICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogniAtIDE1OCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiCfIC0gMTU5ICovCiAgQzJfV0hJVEVTUEFDRSwgLyogoCAtIDE2MCAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogoSAtIDE2MSAqLwogIEMyX0VVUk9QRVRFUk1JTkFUT1IsIC8qIKIgLSAxNjIgKi8KICBDMl9FVVJPUEVURVJNSU5BVE9SLCAvKiCjIC0gMTYzICovCiAgQzJfRVVST1BFVEVSTUlOQVRPUiwgLyogpCAtIDE2NCAqLwogIEMyX0VVUk9QRVRFUk1JTkFUT1IsIC8qIKUgLSAxNjUgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIKYgLSAxNjYgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIKcgLSAxNjcgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIKggLSAxNjggKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIKkgLSAxNjkgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIKogLSAxNzAgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIKsgLSAxNzEgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIKwgLSAxNzIgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIK0gLSAxNzMgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIK4gLSAxNzQgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIK8gLSAxNzUgKi8KICBDMl9FVVJPUEVURVJNSU5BVE9SLCAvKiCwIC0gMTc2ICovCiAgQzJfRVVST1BFVEVSTUlOQVRPUiwgLyogsSAtIDE3NyAqLwogIEMyX0VVUk9QRU5VTUJFUiwgLyogsiAtIDE3OCAqLwogIEMyX0VVUk9QRU5VTUJFUiwgLyogsyAtIDE3OSAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogtCAtIDE4MCAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogtSAtIDE4MSAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogtiAtIDE4MiAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogtyAtIDE4MyAqLwogIEMyX09USEVSTkVVVFJBTCwgLyoguCAtIDE4NCAqLwogIEMyX0VVUk9QRU5VTUJFUiwgLyoguSAtIDE4NSAqLwogIEMyX09USEVSTkVVVFJBTCwgLyoguiAtIDE4NiAqLwogIEMyX09USEVSTkVVVFJBTCwgLyoguyAtIDE4NyAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogvCAtIDE4OCAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogvSAtIDE4OSAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogviAtIDE5MCAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogvyAtIDE5MSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDAIC0gMTkyICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIMEgLSAxOTMgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogwiAtIDE5NCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDDIC0gMTk1ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIMQgLSAxOTYgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogxSAtIDE5NyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDGIC0gMTk4ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIMcgLSAxOTkgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogyCAtIDIwMCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDJIC0gMjAxICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIMogLSAyMDIgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogyyAtIDIwMyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDMIC0gMjA0ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIM0gLSAyMDUgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogziAtIDIwNiAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDPIC0gMjA3ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qINAgLSAyMDggKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog0SAtIDIwOSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDSIC0gMjEwICovCiAgQzJfTEVGVFRPUklHSFQsIC8qINMgLSAyMTEgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog1CAtIDIxMiAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDVIC0gMjEzICovCiAgQzJfTEVGVFRPUklHSFQsIC8qINYgLSAyMTQgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qINcgLSAyMTUgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog2CAtIDIxNiAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDZIC0gMjE3ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qINogLSAyMTggKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog2yAtIDIxOSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDcIC0gMjIwICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIN0gLSAyMjEgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog3iAtIDIyMiAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDfIC0gMjIzICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIOAgLSAyMjQgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog4SAtIDIyNSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDiIC0gMjI2ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIOMgLSAyMjcgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog5CAtIDIyOCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDlIC0gMjI5ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIOYgLSAyMzAgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog5yAtIDIzMSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDoIC0gMjMyICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIOkgLSAyMzMgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog6iAtIDIzNCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDrIC0gMjM1ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIOwgLSAyMzYgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog7SAtIDIzNyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDuIC0gMjM4ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIO8gLSAyMzkgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog8CAtIDI0MCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDxIC0gMjQxICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIPIgLSAyNDIgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog8yAtIDI0MyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiD0IC0gMjQ0ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIPUgLSAyNDUgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog9iAtIDI0NiAqLwogIEMyX09USEVSTkVVVFJBTCwgLyog9yAtIDI0NyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiD4IC0gMjQ4ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIPkgLSAyNDkgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog+iAtIDI1MCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiD7IC0gMjUxICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIPwgLSAyNTIgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog/SAtIDI1MyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiD+IC0gMjU0ICovCiAgQzJfTEVGVFRPUklHSFQgLyog/yAtIDI1NSAqLwp9OwoKY29uc3QgV09SRCBPTEUyTkxTX0NUX0NUeXBlM19MVVRbXSA9IHsgCiAgMHgwMDAwLCAvKiAgIC0gICAwICovCiAgMHgwMDAwLCAvKiAgIC0gICAxICovCiAgMHgwMDAwLCAvKiAgIC0gICAyICovCiAgMHgwMDAwLCAvKiAgIC0gICAzICovCiAgMHgwMDAwLCAvKiAgIC0gICA0ICovCiAgMHgwMDAwLCAvKiAgIC0gICA1ICovCiAgMHgwMDAwLCAvKiAgIC0gICA2ICovCiAgMHgwMDAwLCAvKiAgIC0gICA3ICovCiAgMHgwMDAwLCAvKiAgIC0gICA4ICovCiAgMHgwMDA4LCAvKiAgIC0gICA5ICovCiAgMHgwMDA4LCAvKiAgIC0gIDEwICovCiAgMHgwMDA4LCAvKiAgIC0gIDExICovCiAgMHgwMDA4LCAvKiAgIC0gIDEyICovCiAgMHgwMDA4LCAvKiAgIC0gIDEzICovCiAgMHgwMDAwLCAvKiAgIC0gIDE0ICovCiAgMHgwMDAwLCAvKiAgIC0gIDE1ICovCiAgMHgwMDAwLCAvKiAgIC0gIDE2ICovCiAgMHgwMDAwLCAvKiAgIC0gIDE3ICovCiAgMHgwMDAwLCAvKiAgIC0gIDE4ICovCiAgMHgwMDAwLCAvKiAgIC0gIDE5ICovCiAgMHgwMDAwLCAvKiAgIC0gIDIwICovCiAgMHgwMDAwLCAvKiAgIC0gIDIxICovCiAgMHgwMDAwLCAvKiAgIC0gIDIyICovCiAgMHgwMDAwLCAvKiAgIC0gIDIzICovCiAgMHgwMDAwLCAvKiAgIC0gIDI0ICovCiAgMHgwMDAwLCAvKiAgIC0gIDI1ICovCiAgMHgwMDAwLCAvKiAgIC0gIDI2ICovCiAgMHgwMDAwLCAvKiAgIC0gIDI3ICovCiAgMHgwMDAwLCAvKiAgIC0gIDI4ICovCiAgMHgwMDAwLCAvKiAgIC0gIDI5ICovCiAgMHgwMDAwLCAvKiAgIC0gIDMwICovCiAgMHgwMDAwLCAvKiAgIC0gIDMxICovCiAgMHgwMDQ4LCAvKiAgIC0gIDMyICovCiAgMHgwMDQ4LCAvKiAhIC0gIDMzICovCiAgMHgwNDQ4LCAvKiAiIC0gIDM0ICovIC8qICIgKi8KICAweDAwNDgsIC8qICMgLSAgMzUgKi8KICAweDA0NDgsIC8qICQgLSAgMzYgKi8KICAweDAwNDgsIC8qICUgLSAgMzcgKi8KICAweDAwNDgsIC8qICYgLSAgMzggKi8KICAweDA0NDAsIC8qICcgLSAgMzkgKi8KICAweDAwNDgsIC8qICggLSAgNDAgKi8KICAweDAwNDgsIC8qICkgLSAgNDEgKi8KICAweDAwNDgsIC8qICogLSAgNDIgKi8KICAweDAwNDgsIC8qICsgLSAgNDMgKi8KICAweDAwNDgsIC8qICwgLSAgNDQgKi8KICAweDA0NDAsIC8qIC0gLSAgNDUgKi8KICAweDAwNDgsIC8qIC4gLSAgNDYgKi8KICAweDA0NDgsIC8qIC8gLSAgNDcgKi8KICAweDAwNDAsIC8qIDAgLSAgNDggKi8KICAweDAwNDAsIC8qIDEgLSAgNDkgKi8KICAweDAwNDAsIC8qIDIgLSAgNTAgKi8KICAweDAwNDAsIC8qIDMgLSAgNTEgKi8KICAweDAwNDAsIC8qIDQgLSAgNTIgKi8KICAweDAwNDAsIC8qIDUgLSAgNTMgKi8KICAweDAwNDAsIC8qIDYgLSAgNTQgKi8KICAweDAwNDAsIC8qIDcgLSAgNTUgKi8KICAweDAwNDAsIC8qIDggLSAgNTYgKi8KICAweDAwNDAsIC8qIDkgLSAgNTcgKi8KICAweDAwNDgsIC8qIDogLSAgNTggKi8KICAweDAwNDgsIC8qIDsgLSAgNTkgKi8KICAweDAwNDgsIC8qIDwgLSAgNjAgKi8KICAweDA0NDgsIC8qID0gLSAgNjEgKi8KICAweDAwNDgsIC8qID4gLSAgNjIgKi8KICAweDAwNDgsIC8qID8gLSAgNjMgKi8KICAweDA0NDgsIC8qIEAgLSAgNjQgKi8KICAweDgwNDAsIC8qIEEgLSAgNjUgKi8KICAweDgwNDAsIC8qIEIgLSAgNjYgKi8KICAweDgwNDAsIC8qIEMgLSAgNjcgKi8KICAweDgwNDAsIC8qIEQgLSAgNjggKi8KICAweDgwNDAsIC8qIEUgLSAgNjkgKi8KICAweDgwNDAsIC8qIEYgLSAgNzAgKi8KICAweDgwNDAsIC8qIEcgLSAgNzEgKi8KICAweDgwNDAsIC8qIEggLSAgNzIgKi8KICAweDgwNDAsIC8qIEkgLSAgNzMgKi8KICAweDgwNDAsIC8qIEogLSAgNzQgKi8KICAweDgwNDAsIC8qIEsgLSAgNzUgKi8KICAweDgwNDAsIC8qIEwgLSAgNzYgKi8KICAweDgwNDAsIC8qIE0gLSAgNzcgKi8KICAweDgwNDAsIC8qIE4gLSAgNzggKi8KICAweDgwNDAsIC8qIE8gLSAgNzkgKi8KICAweDgwNDAsIC8qIFAgLSAgODAgKi8KICAweDgwNDAsIC8qIFEgLSAgODEgKi8KICAweDgwNDAsIC8qIFIgLSAgODIgKi8KICAweDgwNDAsIC8qIFMgLSAgODMgKi8KICAweDgwNDAsIC8qIFQgLSAgODQgKi8KICAweDgwNDAsIC8qIFUgLSAgODUgKi8KICAweDgwNDAsIC8qIFYgLSAgODYgKi8KICAweDgwNDAsIC8qIFcgLSAgODcgKi8KICAweDgwNDAsIC8qIFggLSAgODggKi8KICAweDgwNDAsIC8qIFkgLSAgODkgKi8KICAweDgwNDAsIC8qIFogLSAgOTAgKi8KICAweDAwNDgsIC8qIFsgLSAgOTEgKi8KICAweDA0NDgsIC8qIFwgLSAgOTIgKi8KICAweDAwNDgsIC8qIF0gLSAgOTMgKi8KICAweDA0NDgsIC8qIF4gLSAgOTQgKi8KICAweDA0NDgsIC8qIF8gLSAgOTUgKi8KICAweDA0NDgsIC8qIGAgLSAgOTYgKi8KICAweDgwNDAsIC8qIGEgLSAgOTcgKi8KICAweDgwNDAsIC8qIGIgLSAgOTggKi8KICAweDgwNDAsIC8qIGMgLSAgOTkgKi8KICAweDgwNDAsIC8qIGQgLSAxMDAgKi8KICAweDgwNDAsIC8qIGUgLSAxMDEgKi8KICAweDgwNDAsIC8qIGYgLSAxMDIgKi8KICAweDgwNDAsIC8qIGcgLSAxMDMgKi8KICAweDgwNDAsIC8qIGggLSAxMDQgKi8KICAweDgwNDAsIC8qIGkgLSAxMDUgKi8KICAweDgwNDAsIC8qIGogLSAxMDYgKi8KICAweDgwNDAsIC8qIGsgLSAxMDcgKi8KICAweDgwNDAsIC8qIGwgLSAxMDggKi8KICAweDgwNDAsIC8qIG0gLSAxMDkgKi8KICAweDgwNDAsIC8qIG4gLSAxMTAgKi8KICAweDgwNDAsIC8qIG8gLSAxMTEgKi8KICAweDgwNDAsIC8qIHAgLSAxMTIgKi8KICAweDgwNDAsIC8qIHEgLSAxMTMgKi8KICAweDgwNDAsIC8qIHIgLSAxMTQgKi8KICAweDgwNDAsIC8qIHMgLSAxMTUgKi8KICAweDgwNDAsIC8qIHQgLSAxMTYgKi8KICAweDgwNDAsIC8qIHUgLSAxMTcgKi8KICAweDgwNDAsIC8qIHYgLSAxMTggKi8KICAweDgwNDAsIC8qIHcgLSAxMTkgKi8KICAweDgwNDAsIC8qIHggLSAxMjAgKi8KICAweDgwNDAsIC8qIHkgLSAxMjEgKi8KICAweDgwNDAsIC8qIHogLSAxMjIgKi8KICAweDAwNDgsIC8qIHsgLSAxMjMgKi8KICAweDAwNDgsIC8qIHwgLSAxMjQgKi8KICAweDAwNDgsIC8qIH0gLSAxMjUgKi8KICAweDA0NDgsIC8qIH4gLSAxMjYgKi8KICAweDAwMDAsIC8qIH8gLSAxMjcgKi8KICAweDAwMDAsIC8qIIAgLSAxMjggKi8KICAweDAwMDAsIC8qIIEgLSAxMjkgKi8KICAweDAwMDgsIC8qIIIgLSAxMzAgKi8KICAweDgwMDAsIC8qIIMgLSAxMzEgKi8KICAweDAwMDgsIC8qIIQgLSAxMzIgKi8KICAweDAwMDgsIC8qIIUgLSAxMzMgKi8KICAweDAwMDgsIC8qIIYgLSAxMzQgKi8KICAweDAwMDgsIC8qIIcgLSAxMzUgKi8KICAweDAwMDEsIC8qIIggLSAxMzYgKi8KICAweDAwMDgsIC8qIIkgLSAxMzcgKi8KICAweDgwMDMsIC8qIIogLSAxMzggKi8KICAweDAwMDgsIC8qIIsgLSAxMzkgKi8KICAweDgwMDAsIC8qIIwgLSAxNDAgKi8KICAweDAwMDAsIC8qII0gLSAxNDEgKi8KICAweDAwMDAsIC8qII4gLSAxNDIgKi8KICAweDAwMDAsIC8qII8gLSAxNDMgKi8KICAweDAwMDAsIC8qIJAgLSAxNDQgKi8KICAweDAwODgsIC8qIJEgLSAxNDUgKi8KICAweDAwODgsIC8qIJIgLSAxNDYgKi8KICAweDAwODgsIC8qIJMgLSAxNDcgKi8KICAweDAwODgsIC8qIJQgLSAxNDggKi8KICAweDAwMDgsIC8qIJUgLSAxNDkgKi8KICAweDA0MDAsIC8qIJYgLSAxNTAgKi8KICAweDA0MDAsIC8qIJcgLSAxNTEgKi8KICAweDA0MDgsIC8qIJggLSAxNTIgKi8KICAweDAwMDAsIC8qIJkgLSAxNTMgKi8KICAweDgwMDMsIC8qIJogLSAxNTQgKi8KICAweDAwMDgsIC8qIJsgLSAxNTUgKi8KICAweDgwMDAsIC8qIJwgLSAxNTYgKi8KICAweDAwMDAsIC8qIJ0gLSAxNTcgKi8KICAweDAwMDAsIC8qIJ4gLSAxNTggKi8KICAweDgwMDMsIC8qIJ8gLSAxNTkgKi8KICAweDAwMDgsIC8qIKAgLSAxNjAgKi8KICAweDAwMDgsIC8qIKEgLSAxNjEgKi8KICAweDAwNDgsIC8qIKIgLSAxNjIgKi8KICAweDAwNDgsIC8qIKMgLSAxNjMgKi8KICAweDAwMDgsIC8qIKQgLSAxNjQgKi8KICAweDAwNDgsIC8qIKUgLSAxNjUgKi8KICAweDAwNDgsIC8qIKYgLSAxNjYgKi8KICAweDAwMDgsIC8qIKcgLSAxNjcgKi8KICAweDA0MDgsIC8qIKggLSAxNjggKi8KICAweDAwMDgsIC8qIKkgLSAxNjkgKi8KICAweDA0MDAsIC8qIKogLSAxNzAgKi8KICAweDAwMDgsIC8qIKsgLSAxNzEgKi8KICAweDAwNDgsIC8qIKwgLSAxNzIgKi8KICAweDA0MDgsIC8qIK0gLSAxNzMgKi8KICAweDAwMDgsIC8qIK4gLSAxNzQgKi8KICAweDA0NDgsIC8qIK8gLSAxNzUgKi8KICAweDAwMDgsIC8qILAgLSAxNzYgKi8KICAweDAwMDgsIC8qILEgLSAxNzcgKi8KICAweDAwMDAsIC8qILIgLSAxNzggKi8KICAweDAwMDAsIC8qILMgLSAxNzkgKi8KICAweDA0MDgsIC8qILQgLSAxODAgKi8KICAweDAwMDgsIC8qILUgLSAxODEgKi8KICAweDAwMDgsIC8qILYgLSAxODIgKi8KICAweDAwMDgsIC8qILcgLSAxODMgKi8KICAweDA0MDgsIC8qILggLSAxODQgKi8KICAweDAwMDAsIC8qILkgLSAxODUgKi8KICAweDA0MDAsIC8qILogLSAxODYgKi8KICAweDAwMDgsIC8qILsgLSAxODcgKi8KICAweDAwMDAsIC8qILwgLSAxODggKi8KICAweDAwMDAsIC8qIL0gLSAxODkgKi8KICAweDAwMDAsIC8qIL4gLSAxOTAgKi8KICAweDAwMDgsIC8qIL8gLSAxOTEgKi8KICAweDgwMDMsIC8qIMAgLSAxOTIgKi8KICAweDgwMDMsIC8qIMEgLSAxOTMgKi8KICAweDgwMDMsIC8qIMIgLSAxOTQgKi8KICAweDgwMDMsIC8qIMMgLSAxOTUgKi8KICAweDgwMDMsIC8qIMQgLSAxOTYgKi8KICAweDgwMDMsIC8qIMUgLSAxOTcgKi8KICAweDgwMDAsIC8qIMYgLSAxOTggKi8KICAweDgwMDMsIC8qIMcgLSAxOTkgKi8KICAweDgwMDMsIC8qIMggLSAyMDAgKi8KICAweDgwMDMsIC8qIMkgLSAyMDEgKi8KICAweDgwMDMsIC8qIMogLSAyMDIgKi8KICAweDgwMDMsIC8qIMsgLSAyMDMgKi8KICAweDgwMDMsIC8qIMwgLSAyMDQgKi8KICAweDgwMDMsIC8qIM0gLSAyMDUgKi8KICAweDgwMDMsIC8qIM4gLSAyMDYgKi8KICAweDgwMDMsIC8qIM8gLSAyMDcgKi8KICAweDgwMDAsIC8qINAgLSAyMDggKi8KICAweDgwMDMsIC8qINEgLSAyMDkgKi8KICAweDgwMDMsIC8qINIgLSAyMTAgKi8KICAweDgwMDMsIC8qINMgLSAyMTEgKi8KICAweDgwMDMsIC8qINQgLSAyMTIgKi8KICAweDgwMDMsIC8qINUgLSAyMTMgKi8KICAweDgwMDMsIC8qINYgLSAyMTQgKi8KICAweDAwMDgsIC8qINcgLSAyMTUgKi8KICAweDgwMDMsIC8qINggLSAyMTYgKi8KICAweDgwMDMsIC8qINkgLSAyMTcgKi8KICAweDgwMDMsIC8qINogLSAyMTggKi8KICAweDgwMDMsIC8qINsgLSAyMTkgKi8KICAweDgwMDMsIC8qINwgLSAyMjAgKi8KICAweDgwMDMsIC8qIN0gLSAyMjEgKi8KICAweDgwMDAsIC8qIN4gLSAyMjIgKi8KICAweDgwMDAsIC8qIN8gLSAyMjMgKi8KICAweDgwMDMsIC8qIOAgLSAyMjQgKi8KICAweDgwMDMsIC8qIOEgLSAyMjUgKi8KICAweDgwMDMsIC8qIOIgLSAyMjYgKi8KICAweDgwMDMsIC8qIOMgLSAyMjcgKi8KICAweDgwMDMsIC8qIOQgLSAyMjggKi8KICAweDgwMDMsIC8qIOUgLSAyMjkgKi8KICAweDgwMDAsIC8qIOYgLSAyMzAgKi8KICAweDgwMDMsIC8qIOcgLSAyMzEgKi8KICAweDgwMDMsIC8qIOggLSAyMzIgKi8KICAweDgwMDMsIC8qIOkgLSAyMzMgKi8KICAweDgwMDMsIC8qIOogLSAyMzQgKi8KICAweDgwMDMsIC8qIOsgLSAyMzUgKi8KICAweDgwMDMsIC8qIOwgLSAyMzYgKi8KICAweDgwMDMsIC8qIO0gLSAyMzcgKi8KICAweDgwMDMsIC8qIO4gLSAyMzggKi8KICAweDgwMDMsIC8qIO8gLSAyMzkgKi8KICAweDgwMDAsIC8qIPAgLSAyNDAgKi8KICAweDgwMDMsIC8qIPEgLSAyNDEgKi8KICAweDgwMDMsIC8qIPIgLSAyNDIgKi8KICAweDgwMDMsIC8qIPMgLSAyNDMgKi8KICAweDgwMDMsIC8qIPQgLSAyNDQgKi8KICAweDgwMDMsIC8qIPUgLSAyNDUgKi8KICAweDgwMDMsIC8qIPYgLSAyNDYgKi8KICAweDAwMDgsIC8qIPcgLSAyNDcgKi8KICAweDgwMDMsIC8qIPggLSAyNDggKi8KICAweDgwMDMsIC8qIPkgLSAyNDkgKi8KICAweDgwMDMsIC8qIPogLSAyNTAgKi8KICAweDgwMDMsIC8qIPsgLSAyNTEgKi8KICAweDgwMDMsIC8qIPwgLSAyNTIgKi8KICAweDgwMDMsIC8qIP0gLSAyNTMgKi8KICAweDgwMDAsIC8qIP4gLSAyNTQgKi8KICAweDgwMDMgIC8qIP8gLSAyNTUgKi8KfTsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUdldFN0cmluZ1R5cGVBCVtLRVJORUwzMi4zOTZdCiAqLwpCT09MIFdJTkFQSSBHZXRTdHJpbmdUeXBlQShMQ0lEIGxvY2FsZSxEV09SRCBkd0luZm9UeXBlLExQQ1NUUiBzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgY2NoU3JjLExQV09SRCBjaGFydHlwZSkKewoJcmV0dXJuIEdldFN0cmluZ1R5cGVFeEEobG9jYWxlLGR3SW5mb1R5cGUsc3JjLGNjaFNyYyxjaGFydHlwZSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUdldFN0cmluZ1R5cGVFeEEJW0tFUk5FTDMyLjM5N10KICoKICogRklYTUU6IElnbm9yZXMgdGhlIGxvY2FsZS4KICovCkJPT0wgV0lOQVBJIEdldFN0cmluZ1R5cGVFeEEoTENJRCBsb2NhbGUsRFdPUkQgZHdJbmZvVHlwZSxMUENTVFIgc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgY2NoU3JjLExQV09SRCBjaGFydHlwZSkKewoJaW50CWk7CgkKCWlmICgoc3JjPT1OVUxMKSB8fCAoY2hhcnR5cGU9PU5VTEwpIHx8IChzcmM9PShMUFNUUiljaGFydHlwZSkpCgl7CgkgIFNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CgkgIHJldHVybiBGQUxTRTsKCX0KCglpZiAoY2NoU3JjPT0tMSkKCSAgY2NoU3JjPXN0cmxlbihzcmMpKzE7CgkgIAoJc3dpdGNoIChkd0luZm9UeXBlKSB7CgljYXNlIENUX0NUWVBFMToKCSAgZm9yIChpPTA7aTxjY2hTcmM7aSsrKSAKCSAgewoJICAgIGNoYXJ0eXBlW2ldID0gMDsKCSAgICBpZiAoaXNkaWdpdChzcmNbaV0pKSBjaGFydHlwZVtpXXw9QzFfRElHSVQ7CgkgICAgaWYgKGlzYWxwaGEoc3JjW2ldKSkgY2hhcnR5cGVbaV18PUMxX0FMUEhBOwoJICAgIGlmIChpc2xvd2VyKHNyY1tpXSkpIGNoYXJ0eXBlW2ldfD1DMV9MT1dFUjsKCSAgICBpZiAoaXN1cHBlcihzcmNbaV0pKSBjaGFydHlwZVtpXXw9QzFfVVBQRVI7CgkgICAgaWYgKGlzc3BhY2Uoc3JjW2ldKSkgY2hhcnR5cGVbaV18PUMxX1NQQUNFOwoJICAgIGlmIChpc3B1bmN0KHNyY1tpXSkpIGNoYXJ0eXBlW2ldfD1DMV9QVU5DVDsKCSAgICBpZiAoaXNjbnRybChzcmNbaV0pKSBjaGFydHlwZVtpXXw9QzFfQ05UUkw7Ci8qIEZJWE1FOiBpc2JsYW5rKCkgaXMgYSBHTlUgZXh0ZW5zaW9uICovCi8qCQlpZiAoaXNibGFuayhzcmNbaV0pKSBjaGFydHlwZVtpXXw9QzFfQkxBTks7ICovCgkgICAgaWYgKChzcmNbaV0gPT0gJyAnKSB8fCAoc3JjW2ldID09ICdcdCcpKSBjaGFydHlwZVtpXXw9QzFfQkxBTks7CgkgICAgLyogQzFfWERJR0lUICovCgl9CglyZXR1cm4gVFJVRTsKCgljYXNlIENUX0NUWVBFMjoKCSAgZm9yIChpPTA7aTxjY2hTcmM7aSsrKSAKCSAgewoJICAgIGNoYXJ0eXBlW2ldPShXT1JEKUNUX0NUeXBlMl9MVVRbaV07CgkgIH0KCSAgcmV0dXJuIFRSVUU7CgoJY2FzZSBDVF9DVFlQRTM6CgkgIGZvciAoaT0wO2k8Y2NoU3JjO2krKykgCgkgIHsKCSAgICBjaGFydHlwZVtpXT1PTEUyTkxTX0NUX0NUeXBlM19MVVRbaV07CgkgIH0KCSAgcmV0dXJuIFRSVUU7CgoJZGVmYXVsdDoKCSAgRVJSKCJVbmtub3duIGR3SW5mb1R5cGU6JWxkXG4iLGR3SW5mb1R5cGUpOwoJICByZXR1cm4gRkFMU0U7Cgl9Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgVmVyTGFuZ3VhZ2VOYW1lQSAgICAgICAgICAgICAgW0tFUk5FTDMyLjcwOV1bVkVSU0lPTi45XQogKi8KRFdPUkQgV0lOQVBJIFZlckxhbmd1YWdlTmFtZUEoIFVJTlQgd0xhbmcsIExQU1RSIHN6TGFuZywgVUlOVCBuU2l6ZSApCnsKICAgIGlmKCFzekxhbmcpCglyZXR1cm4gMDsKCiAgICByZXR1cm4gR2V0TG9jYWxlSW5mb0EoTUFLRUxDSUQod0xhbmcsIFNPUlRfREVGQVVMVCksIExPQ0FMRV9TRU5HTEFOR1VBR0UsIHN6TGFuZywgblNpemUpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIFZlckxhbmd1YWdlTmFtZVcgICAgICAgICAgICAgIFtLRVJORUwzMi43MTBdW1ZFUlNJT04uMTBdCiAqLwpEV09SRCBXSU5BUEkgVmVyTGFuZ3VhZ2VOYW1lVyggVUlOVCB3TGFuZywgTFBXU1RSIHN6TGFuZywgVUlOVCBuU2l6ZSApCnsKICAgIGlmKCFzekxhbmcpCglyZXR1cm4gMDsKCiAgICByZXR1cm4gR2V0TG9jYWxlSW5mb1coTUFLRUxDSUQod0xhbmcsIFNPUlRfREVGQVVMVCksIExPQ0FMRV9TRU5HTEFOR1VBR0UsIHN6TGFuZywgblNpemUpOwp9CgogCnN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIExDTV9Vbmljb2RlX0xVVFtdID0gewogIDYgICAgICAsICAgMywgLyogICAtICAgMSAqLyAgCiAgNiAgICAgICwgICA0LCAvKiAgIC0gICAyICovICAKICA2ICAgICAgLCAgIDUsIC8qICAgLSAgIDMgKi8gIAogIDYgICAgICAsICAgNiwgLyogICAtICAgNCAqLyAgCiAgNiAgICAgICwgICA3LCAvKiAgIC0gICA1ICovICAKICA2ICAgICAgLCAgIDgsIC8qICAgLSAgIDYgKi8gIAogIDYgICAgICAsICAgOSwgLyogICAtICAgNyAqLyAgCiAgNiAgICAgICwgIDEwLCAvKiAgIC0gICA4ICovICAKICA3ICAgICAgLCAgIDUsIC8qICAgLSAgIDkgKi8gIAogIDcgICAgICAsICAgNiwgLyogICAtICAxMCAqLyAgCiAgNyAgICAgICwgICA3LCAvKiAgIC0gIDExICovICAKICA3ICAgICAgLCAgIDgsIC8qICAgLSAgMTIgKi8gIAogIDcgICAgICAsICAgOSwgLyogICAtICAxMyAqLyAgCiAgNiAgICAgICwgIDExLCAvKiAgIC0gIDE0ICovICAKICA2ICAgICAgLCAgMTIsIC8qICAgLSAgMTUgKi8gIAogIDYgICAgICAsICAxMywgLyogICAtICAxNiAqLyAgCiAgNiAgICAgICwgIDE0LCAvKiAgIC0gIDE3ICovICAKICA2ICAgICAgLCAgMTUsIC8qICAgLSAgMTggKi8gIAogIDYgICAgICAsICAxNiwgLyogICAtICAxOSAqLyAgCiAgNiAgICAgICwgIDE3LCAvKiAgIC0gIDIwICovICAKICA2ICAgICAgLCAgMTgsIC8qICAgLSAgMjEgKi8gIAogIDYgICAgICAsICAxOSwgLyogICAtICAyMiAqLyAgCiAgNiAgICAgICwgIDIwLCAvKiAgIC0gIDIzICovICAKICA2ICAgICAgLCAgMjEsIC8qICAgLSAgMjQgKi8gIAogIDYgICAgICAsICAyMiwgLyogICAtICAyNSAqLyAgCiAgNiAgICAgICwgIDIzLCAvKiAgIC0gIDI2ICovICAKICA2ICAgICAgLCAgMjQsIC8qICAgLSAgMjcgKi8gIAogIDYgICAgICAsICAyNSwgLyogICAtICAyOCAqLyAgCiAgNiAgICAgICwgIDI2LCAvKiAgIC0gIDI5ICovICAKICA2ICAgICAgLCAgMjcsIC8qICAgLSAgMzAgKi8gIAogIDYgICAgICAsICAyOCwgLyogICAtICAzMSAqLyAgCiAgNyAgICAgICwgICAyLCAvKiAgIC0gIDMyICovCiAgNyAgICAgICwgIDI4LCAvKiAhIC0gIDMzICovCiAgNyAgICAgICwgIDI5LCAvKiAiIC0gIDM0ICovIC8qICIgKi8KICA3ICAgICAgLCAgMzEsIC8qICMgLSAgMzUgKi8KICA3ICAgICAgLCAgMzMsIC8qICQgLSAgMzYgKi8KICA3ICAgICAgLCAgMzUsIC8qICUgLSAgMzcgKi8KICA3ICAgICAgLCAgMzcsIC8qICYgLSAgMzggKi8KICA2ICAgICAgLCAxMjgsIC8qICcgLSAgMzkgKi8KICA3ICAgICAgLCAgMzksIC8qICggLSAgNDAgKi8KICA3ICAgICAgLCAgNDIsIC8qICkgLSAgNDEgKi8KICA3ICAgICAgLCAgNDUsIC8qICogLSAgNDIgKi8KICA4ICAgICAgLCAgIDMsIC8qICsgLSAgNDMgKi8KICA3ICAgICAgLCAgNDcsIC8qICwgLSAgNDQgKi8KICA2ICAgICAgLCAxMzAsIC8qIC0gLSAgNDUgKi8KICA3ICAgICAgLCAgNTEsIC8qIC4gLSAgNDYgKi8KICA3ICAgICAgLCAgNTMsIC8qIC8gLSAgNDcgKi8KIDEyICAgICAgLCAgIDMsIC8qIDAgLSAgNDggKi8KIDEyICAgICAgLCAgMzMsIC8qIDEgLSAgNDkgKi8KIDEyICAgICAgLCAgNTEsIC8qIDIgLSAgNTAgKi8KIDEyICAgICAgLCAgNzAsIC8qIDMgLSAgNTEgKi8KIDEyICAgICAgLCAgODgsIC8qIDQgLSAgNTIgKi8KIDEyICAgICAgLCAxMDYsIC8qIDUgLSAgNTMgKi8KIDEyICAgICAgLCAxMjUsIC8qIDYgLSAgNTQgKi8KIDEyICAgICAgLCAxNDQsIC8qIDcgLSAgNTUgKi8KIDEyICAgICAgLCAxNjIsIC8qIDggLSAgNTYgKi8KIDEyICAgICAgLCAxODAsIC8qIDkgLSAgNTcgKi8KICA3ICAgICAgLCAgNTUsIC8qIDogLSAgNTggKi8KICA3ICAgICAgLCAgNTgsIC8qIDsgLSAgNTkgKi8KICA4ICAgICAgLCAgMTQsIC8qIDwgLSAgNjAgKi8KICA4ICAgICAgLCAgMTgsIC8qID0gLSAgNjEgKi8KICA4ICAgICAgLCAgMjAsIC8qID4gLSAgNjIgKi8KICA3ICAgICAgLCAgNjAsIC8qID8gLSAgNjMgKi8KICA3ICAgICAgLCAgNjIsIC8qIEAgLSAgNjQgKi8KIDE0ICAgICAgLCAgIDIsIC8qIEEgLSAgNjUgKi8KIDE0ICAgICAgLCAgIDksIC8qIEIgLSAgNjYgKi8KIDE0ICAgICAgLCAgMTAsIC8qIEMgLSAgNjcgKi8KIDE0ICAgICAgLCAgMjYsIC8qIEQgLSAgNjggKi8KIDE0ICAgICAgLCAgMzMsIC8qIEUgLSAgNjkgKi8KIDE0ICAgICAgLCAgMzUsIC8qIEYgLSAgNzAgKi8KIDE0ICAgICAgLCAgMzcsIC8qIEcgLSAgNzEgKi8KIDE0ICAgICAgLCAgNDQsIC8qIEggLSAgNzIgKi8KIDE0ICAgICAgLCAgNTAsIC8qIEkgLSAgNzMgKi8KIDE0ICAgICAgLCAgNTMsIC8qIEogLSAgNzQgKi8KIDE0ICAgICAgLCAgNTQsIC8qIEsgLSAgNzUgKi8KIDE0ICAgICAgLCAgNzIsIC8qIEwgLSAgNzYgKi8KIDE0ICAgICAgLCAgODEsIC8qIE0gLSAgNzcgKi8KIDE0ICAgICAgLCAxMTIsIC8qIE4gLSAgNzggKi8KIDE0ICAgICAgLCAxMjQsIC8qIE8gLSAgNzkgKi8KIDE0ICAgICAgLCAxMjYsIC8qIFAgLSAgODAgKi8KIDE0ICAgICAgLCAxMzcsIC8qIFEgLSAgODEgKi8KIDE0ICAgICAgLCAxMzgsIC8qIFIgLSAgODIgKi8KIDE0ICAgICAgLCAxNDUsIC8qIFMgLSAgODMgKi8KIDE0ICAgICAgLCAxNTMsIC8qIFQgLSAgODQgKi8KIDE0ICAgICAgLCAxNTksIC8qIFUgLSAgODUgKi8KIDE0ICAgICAgLCAxNjIsIC8qIFYgLSAgODYgKi8KIDE0ICAgICAgLCAxNjQsIC8qIFcgLSAgODcgKi8KIDE0ICAgICAgLCAxNjYsIC8qIFggLSAgODggKi8KIDE0ICAgICAgLCAxNjcsIC8qIFkgLSAgODkgKi8KIDE0ICAgICAgLCAxNjksIC8qIFogLSAgOTAgKi8KICA3ICAgICAgLCAgNjMsIC8qIFsgLSAgOTEgKi8KICA3ICAgICAgLCAgNjUsIC8qIFwgLSAgOTIgKi8KICA3ICAgICAgLCAgNjYsIC8qIF0gLSAgOTMgKi8KICA3ICAgICAgLCAgNjcsIC8qIF4gLSAgOTQgKi8KICA3ICAgICAgLCAgNjgsIC8qIF8gLSAgOTUgKi8KICA3ICAgICAgLCAgNzIsIC8qIGAgLSAgOTYgKi8KIDE0ICAgICAgLCAgIDIsIC8qIGEgLSAgOTcgKi8KIDE0ICAgICAgLCAgIDksIC8qIGIgLSAgOTggKi8KIDE0ICAgICAgLCAgMTAsIC8qIGMgLSAgOTkgKi8KIDE0ICAgICAgLCAgMjYsIC8qIGQgLSAxMDAgKi8KIDE0ICAgICAgLCAgMzMsIC8qIGUgLSAxMDEgKi8KIDE0ICAgICAgLCAgMzUsIC8qIGYgLSAxMDIgKi8KIDE0ICAgICAgLCAgMzcsIC8qIGcgLSAxMDMgKi8KIDE0ICAgICAgLCAgNDQsIC8qIGggLSAxMDQgKi8KIDE0ICAgICAgLCAgNTAsIC8qIGkgLSAxMDUgKi8KIDE0ICAgICAgLCAgNTMsIC8qIGogLSAxMDYgKi8KIDE0ICAgICAgLCAgNTQsIC8qIGsgLSAxMDcgKi8KIDE0ICAgICAgLCAgNzIsIC8qIGwgLSAxMDggKi8KIDE0ICAgICAgLCAgODEsIC8qIG0gLSAxMDkgKi8KIDE0ICAgICAgLCAxMTIsIC8qIG4gLSAxMTAgKi8KIDE0ICAgICAgLCAxMjQsIC8qIG8gLSAxMTEgKi8KIDE0ICAgICAgLCAxMjYsIC8qIHAgLSAxMTIgKi8KIDE0ICAgICAgLCAxMzcsIC8qIHEgLSAxMTMgKi8KIDE0ICAgICAgLCAxMzgsIC8qIHIgLSAxMTQgKi8KIDE0ICAgICAgLCAxNDUsIC8qIHMgLSAxMTUgKi8KIDE0ICAgICAgLCAxNTMsIC8qIHQgLSAxMTYgKi8KIDE0ICAgICAgLCAxNTksIC8qIHUgLSAxMTcgKi8KIDE0ICAgICAgLCAxNjIsIC8qIHYgLSAxMTggKi8KIDE0ICAgICAgLCAxNjQsIC8qIHcgLSAxMTkgKi8KIDE0ICAgICAgLCAxNjYsIC8qIHggLSAxMjAgKi8KIDE0ICAgICAgLCAxNjcsIC8qIHkgLSAxMjEgKi8KIDE0ICAgICAgLCAxNjksIC8qIHogLSAxMjIgKi8KICA3ICAgICAgLCAgNzQsIC8qIHsgLSAxMjMgKi8KICA3ICAgICAgLCAgNzYsIC8qIHwgLSAxMjQgKi8KICA3ICAgICAgLCAgNzgsIC8qIH0gLSAxMjUgKi8KICA3ICAgICAgLCAgODAsIC8qIH4gLSAxMjYgKi8KICA2ICAgICAgLCAgMjksIC8qIH8gLSAxMjcgKi8KICA2ICAgICAgLCAgMzAsIC8qIIAgLSAxMjggKi8KICA2ICAgICAgLCAgMzEsIC8qIIEgLSAxMjkgKi8KICA3ICAgICAgLCAxMjMsIC8qIIIgLSAxMzAgKi8KIDE0ICAgICAgLCAgMzUsIC8qIIMgLSAxMzEgKi8KICA3ICAgICAgLCAxMjcsIC8qIIQgLSAxMzIgKi8KIDEwICAgICAgLCAgMjEsIC8qIIUgLSAxMzMgKi8KIDEwICAgICAgLCAgMTUsIC8qIIYgLSAxMzQgKi8KIDEwICAgICAgLCAgMTYsIC8qIIcgLSAxMzUgKi8KICA3ICAgICAgLCAgNjcsIC8qIIggLSAxMzYgKi8KIDEwICAgICAgLCAgMjIsIC8qIIkgLSAxMzcgKi8KIDE0ICAgICAgLCAxNDUsIC8qIIogLSAxMzggKi8KICA3ICAgICAgLCAxMzYsIC8qIIsgLSAxMzkgKi8KIDE0ICsgMTYgLCAxMjQsIC8qIIwgLSAxNDAgKi8KICA2ICAgICAgLCAgNDMsIC8qII0gLSAxNDEgKi8KICA2ICAgICAgLCAgNDQsIC8qII4gLSAxNDIgKi8KICA2ICAgICAgLCAgNDUsIC8qII8gLSAxNDMgKi8KICA2ICAgICAgLCAgNDYsIC8qIJAgLSAxNDQgKi8KICA3ICAgICAgLCAxMjEsIC8qIJEgLSAxNDUgKi8KICA3ICAgICAgLCAxMjIsIC8qIJIgLSAxNDYgKi8KICA3ICAgICAgLCAxMjUsIC8qIJMgLSAxNDcgKi8KICA3ICAgICAgLCAxMjYsIC8qIJQgLSAxNDggKi8KIDEwICAgICAgLCAgMTcsIC8qIJUgLSAxNDkgKi8KICA2ICAgICAgLCAxMzcsIC8qIJYgLSAxNTAgKi8KICA2ICAgICAgLCAxMzksIC8qIJcgLSAxNTEgKi8KICA3ICAgICAgLCAgOTMsIC8qIJggLSAxNTIgKi8KIDE0ICAgICAgLCAxNTYsIC8qIJkgLSAxNTMgKi8KIDE0ICAgICAgLCAxNDUsIC8qIJogLSAxNTQgKi8KICA3ICAgICAgLCAxMzcsIC8qIJsgLSAxNTUgKi8KIDE0ICsgMTYgLCAxMjQsIC8qIJwgLSAxNTYgKi8KICA2ICAgICAgLCAgNTksIC8qIJ0gLSAxNTcgKi8KICA2ICAgICAgLCAgNjAsIC8qIJ4gLSAxNTggKi8KIDE0ICAgICAgLCAxNjcsIC8qIJ8gLSAxNTkgKi8KICA3ICAgICAgLCAgIDQsIC8qIKAgLSAxNjAgKi8KICA3ICAgICAgLCAgODEsIC8qIKEgLSAxNjEgKi8KIDEwICAgICAgLCAgIDIsIC8qIKIgLSAxNjIgKi8KIDEwICAgICAgLCAgIDMsIC8qIKMgLSAxNjMgKi8KIDEwICAgICAgLCAgIDQsIC8qIKQgLSAxNjQgKi8KIDEwICAgICAgLCAgIDUsIC8qIKUgLSAxNjUgKi8KICA3ICAgICAgLCAgODIsIC8qIKYgLSAxNjYgKi8KIDEwICAgICAgLCAgIDYsIC8qIKcgLSAxNjcgKi8KICA3ICAgICAgLCAgODMsIC8qIKggLSAxNjggKi8KIDEwICAgICAgLCAgIDcsIC8qIKkgLSAxNjkgKi8KIDE0ICAgICAgLCAgIDIsIC8qIKogLSAxNzAgKi8KICA4ICAgICAgLCAgMjQsIC8qIKsgLSAxNzEgKi8KIDEwICAgICAgLCAgIDgsIC8qIKwgLSAxNzIgKi8KICA2ICAgICAgLCAxMzEsIC8qIK0gLSAxNzMgKi8KIDEwICAgICAgLCAgIDksIC8qIK4gLSAxNzQgKi8KICA3ICAgICAgLCAgODQsIC8qIK8gLSAxNzUgKi8KIDEwICAgICAgLCAgMTAsIC8qILAgLSAxNzYgKi8KICA4ICAgICAgLCAgMjMsIC8qILEgLSAxNzcgKi8KIDEyICAgICAgLCAgNTEsIC8qILIgLSAxNzggKi8KIDEyICAgICAgLCAgNzAsIC8qILMgLSAxNzkgKi8KICA3ICAgICAgLCAgODUsIC8qILQgLSAxODAgKi8KIDEwICAgICAgLCAgMTEsIC8qILUgLSAxODEgKi8KIDEwICAgICAgLCAgMTIsIC8qILYgLSAxODIgKi8KIDEwICAgICAgLCAgMTMsIC8qILcgLSAxODMgKi8KICA3ICAgICAgLCAgODYsIC8qILggLSAxODQgKi8KIDEyICAgICAgLCAgMzMsIC8qILkgLSAxODUgKi8KIDE0ICAgICAgLCAxMjQsIC8qILogLSAxODYgKi8KICA4ICAgICAgLCAgMjYsIC8qILsgLSAxODcgKi8KIDEyICAgICAgLCAgMjEsIC8qILwgLSAxODggKi8KIDEyICAgICAgLCAgMjUsIC8qIL0gLSAxODkgKi8KIDEyICAgICAgLCAgMjksIC8qIL4gLSAxOTAgKi8KICA3ICAgICAgLCAgODcsIC8qIL8gLSAxOTEgKi8KIDE0ICAgICAgLCAgIDIsIC8qIMAgLSAxOTIgKi8KIDE0ICAgICAgLCAgIDIsIC8qIMEgLSAxOTMgKi8KIDE0ICAgICAgLCAgIDIsIC8qIMIgLSAxOTQgKi8KIDE0ICAgICAgLCAgIDIsIC8qIMMgLSAxOTUgKi8KIDE0ICAgICAgLCAgIDIsIC8qIMQgLSAxOTYgKi8KIDE0ICAgICAgLCAgIDIsIC8qIMUgLSAxOTcgKi8KIDE0ICsgMTYgLCAgIDIsIC8qIMYgLSAxOTggKi8KIDE0ICAgICAgLCAgMTAsIC8qIMcgLSAxOTkgKi8KIDE0ICAgICAgLCAgMzMsIC8qIMggLSAyMDAgKi8KIDE0ICAgICAgLCAgMzMsIC8qIMkgLSAyMDEgKi8KIDE0ICAgICAgLCAgMzMsIC8qIMogLSAyMDIgKi8KIDE0ICAgICAgLCAgMzMsIC8qIMsgLSAyMDMgKi8KIDE0ICAgICAgLCAgNTAsIC8qIMwgLSAyMDQgKi8KIDE0ICAgICAgLCAgNTAsIC8qIM0gLSAyMDUgKi8KIDE0ICAgICAgLCAgNTAsIC8qIM4gLSAyMDYgKi8KIDE0ICAgICAgLCAgNTAsIC8qIM8gLSAyMDcgKi8KIDE0ICAgICAgLCAgMjYsIC8qINAgLSAyMDggKi8KIDE0ICAgICAgLCAxMTIsIC8qINEgLSAyMDkgKi8KIDE0ICAgICAgLCAxMjQsIC8qINIgLSAyMTAgKi8KIDE0ICAgICAgLCAxMjQsIC8qINMgLSAyMTEgKi8KIDE0ICAgICAgLCAxMjQsIC8qINQgLSAyMTIgKi8KIDE0ICAgICAgLCAxMjQsIC8qINUgLSAyMTMgKi8KIDE0ICAgICAgLCAxMjQsIC8qINYgLSAyMTQgKi8KICA4ICAgICAgLCAgMjgsIC8qINcgLSAyMTUgKi8KIDE0ICAgICAgLCAxMjQsIC8qINggLSAyMTYgKi8KIDE0ICAgICAgLCAxNTksIC8qINkgLSAyMTcgKi8KIDE0ICAgICAgLCAxNTksIC8qINogLSAyMTggKi8KIDE0ICAgICAgLCAxNTksIC8qINsgLSAyMTkgKi8KIDE0ICAgICAgLCAxNTksIC8qINwgLSAyMjAgKi8KIDE0ICAgICAgLCAxNjcsIC8qIN0gLSAyMjEgKi8KIDE0ICsgMzIgLCAxNTMsIC8qIN4gLSAyMjIgKi8KIDE0ICsgNDggLCAxNDUsIC8qIN8gLSAyMjMgKi8KIDE0ICAgICAgLCAgIDIsIC8qIOAgLSAyMjQgKi8KIDE0ICAgICAgLCAgIDIsIC8qIOEgLSAyMjUgKi8KIDE0ICAgICAgLCAgIDIsIC8qIOIgLSAyMjYgKi8KIDE0ICAgICAgLCAgIDIsIC8qIOMgLSAyMjcgKi8KIDE0ICAgICAgLCAgIDIsIC8qIOQgLSAyMjggKi8KIDE0ICAgICAgLCAgIDIsIC8qIOUgLSAyMjkgKi8KIDE0ICsgMTYgLCAgIDIsIC8qIOYgLSAyMzAgKi8KIDE0ICAgICAgLCAgMTAsIC8qIOcgLSAyMzEgKi8KIDE0ICAgICAgLCAgMzMsIC8qIOggLSAyMzIgKi8KIDE0ICAgICAgLCAgMzMsIC8qIOkgLSAyMzMgKi8KIDE0ICAgICAgLCAgMzMsIC8qIOogLSAyMzQgKi8KIDE0ICAgICAgLCAgMzMsIC8qIOsgLSAyMzUgKi8KIDE0ICAgICAgLCAgNTAsIC8qIOwgLSAyMzYgKi8KIDE0ICAgICAgLCAgNTAsIC8qIO0gLSAyMzcgKi8KIDE0ICAgICAgLCAgNTAsIC8qIO4gLSAyMzggKi8KIDE0ICAgICAgLCAgNTAsIC8qIO8gLSAyMzkgKi8KIDE0ICAgICAgLCAgMjYsIC8qIPAgLSAyNDAgKi8KIDE0ICAgICAgLCAxMTIsIC8qIPEgLSAyNDEgKi8KIDE0ICAgICAgLCAxMjQsIC8qIPIgLSAyNDIgKi8KIDE0ICAgICAgLCAxMjQsIC8qIPMgLSAyNDMgKi8KIDE0ICAgICAgLCAxMjQsIC8qIPQgLSAyNDQgKi8KIDE0ICAgICAgLCAxMjQsIC8qIPUgLSAyNDUgKi8KIDE0ICAgICAgLCAxMjQsIC8qIPYgLSAyNDYgKi8KICA4ICAgICAgLCAgMjksIC8qIPcgLSAyNDcgKi8KIDE0ICAgICAgLCAxMjQsIC8qIPggLSAyNDggKi8KIDE0ICAgICAgLCAxNTksIC8qIPkgLSAyNDkgKi8KIDE0ICAgICAgLCAxNTksIC8qIPogLSAyNTAgKi8KIDE0ICAgICAgLCAxNTksIC8qIPsgLSAyNTEgKi8KIDE0ICAgICAgLCAxNTksIC8qIPwgLSAyNTIgKi8KIDE0ICAgICAgLCAxNjcsIC8qIP0gLSAyNTMgKi8KIDE0ICsgMzIgLCAxNTMsIC8qIP4gLSAyNTQgKi8KIDE0ICAgICAgLCAxNjcgIC8qIP8gLSAyNTUgKi8gfTsKCnN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIExDTV9Vbmljb2RlX0xVVF8yW10gPSB7IDMzLCA0NCwgMTQ1IH07CgojZGVmaW5lIExDTV9EaWFjcml0aWNfU3RhcnQgMTMxCgpzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBMQ01fRGlhY3JpdGljX0xVVFtdID0geyAKMTIzLCAgLyoggyAtIDEzMSAqLwogIDIsICAvKiCEIC0gMTMyICovCiAgMiwgIC8qIIUgLSAxMzMgKi8KICAyLCAgLyoghiAtIDEzNCAqLwogIDIsICAvKiCHIC0gMTM1ICovCiAgMywgIC8qIIggLSAxMzYgKi8KICAyLCAgLyogiSAtIDEzNyAqLwogMjAsICAvKiCKIC0gMTM4ICovCiAgMiwgIC8qIIsgLSAxMzkgKi8KICAyLCAgLyogjCAtIDE0MCAqLwogIDIsICAvKiCNIC0gMTQxICovCiAgMiwgIC8qII4gLSAxNDIgKi8KICAyLCAgLyogjyAtIDE0MyAqLwogIDIsICAvKiCQIC0gMTQ0ICovCiAgMiwgIC8qIJEgLSAxNDUgKi8KICAyLCAgLyogkiAtIDE0NiAqLwogIDIsICAvKiCTIC0gMTQ3ICovCiAgMiwgIC8qIJQgLSAxNDggKi8KICAyLCAgLyoglSAtIDE0OSAqLwogIDIsICAvKiCWIC0gMTUwICovCiAgMiwgIC8qIJcgLSAxNTEgKi8KICAyLCAgLyogmCAtIDE1MiAqLwogIDIsICAvKiCZIC0gMTUzICovCiAyMCwgIC8qIJogLSAxNTQgKi8KICAyLCAgLyogmyAtIDE1NSAqLwogIDIsICAvKiCcIC0gMTU2ICovCiAgMiwgIC8qIJ0gLSAxNTcgKi8KICAyLCAgLyogniAtIDE1OCAqLwogMTksICAvKiCfIC0gMTU5ICovCiAgMiwgIC8qIKAgLSAxNjAgKi8KICAyLCAgLyogoSAtIDE2MSAqLwogIDIsICAvKiCiIC0gMTYyICovCiAgMiwgIC8qIKMgLSAxNjMgKi8KICAyLCAgLyogpCAtIDE2NCAqLwogIDIsICAvKiClIC0gMTY1ICovCiAgMiwgIC8qIKYgLSAxNjYgKi8KICAyLCAgLyogpyAtIDE2NyAqLwogIDIsICAvKiCoIC0gMTY4ICovCiAgMiwgIC8qIKkgLSAxNjkgKi8KICAzLCAgLyogqiAtIDE3MCAqLwogIDIsICAvKiCrIC0gMTcxICovCiAgMiwgIC8qIKwgLSAxNzIgKi8KICAyLCAgLyogrSAtIDE3MyAqLwogIDIsICAvKiCuIC0gMTc0ICovCiAgMiwgIC8qIK8gLSAxNzUgKi8KICAyLCAgLyogsCAtIDE3NiAqLwogIDIsICAvKiCxIC0gMTc3ICovCiAgMiwgIC8qILIgLSAxNzggKi8KICAyLCAgLyogsyAtIDE3OSAqLwogIDIsICAvKiC0IC0gMTgwICovCiAgMiwgIC8qILUgLSAxODEgKi8KICAyLCAgLyogtiAtIDE4MiAqLwogIDIsICAvKiC3IC0gMTgzICovCiAgMiwgIC8qILggLSAxODQgKi8KICAyLCAgLyoguSAtIDE4NSAqLwogIDMsICAvKiC6IC0gMTg2ICovCiAgMiwgIC8qILsgLSAxODcgKi8KICAyLCAgLyogvCAtIDE4OCAqLwogIDIsICAvKiC9IC0gMTg5ICovCiAgMiwgIC8qIL4gLSAxOTAgKi8KICAyLCAgLyogvyAtIDE5MSAqLwogMTUsICAvKiDAIC0gMTkyICovCiAxNCwgIC8qIMEgLSAxOTMgKi8KIDE4LCAgLyogwiAtIDE5NCAqLwogMjUsICAvKiDDIC0gMTk1ICovCiAxOSwgIC8qIMQgLSAxOTYgKi8KIDI2LCAgLyogxSAtIDE5NyAqLwogIDIsICAvKiDGIC0gMTk4ICovCiAyOCwgIC8qIMcgLSAxOTkgKi8KIDE1LCAgLyogyCAtIDIwMCAqLwogMTQsICAvKiDJIC0gMjAxICovCiAxOCwgIC8qIMogLSAyMDIgKi8KIDE5LCAgLyogyyAtIDIwMyAqLwogMTUsICAvKiDMIC0gMjA0ICovCiAxNCwgIC8qIM0gLSAyMDUgKi8KIDE4LCAgLyogziAtIDIwNiAqLwogMTksICAvKiDPIC0gMjA3ICovCjEwNCwgIC8qINAgLSAyMDggKi8KIDI1LCAgLyog0SAtIDIwOSAqLwogMTUsICAvKiDSIC0gMjEwICovCiAxNCwgIC8qINMgLSAyMTEgKi8KIDE4LCAgLyog1CAtIDIxMiAqLwogMjUsICAvKiDVIC0gMjEzICovCiAxOSwgIC8qINYgLSAyMTQgKi8KICAyLCAgLyog1yAtIDIxNSAqLwogMzMsICAvKiDYIC0gMjE2ICovCiAxNSwgIC8qINkgLSAyMTcgKi8KIDE0LCAgLyog2iAtIDIxOCAqLwogMTgsICAvKiDbIC0gMjE5ICovCiAxOSwgIC8qINwgLSAyMjAgKi8KIDE0LCAgLyog3SAtIDIyMSAqLwogIDIsICAvKiDeIC0gMjIyICovCiAgMiwgIC8qIN8gLSAyMjMgKi8KIDE1LCAgLyog4CAtIDIyNCAqLwogMTQsICAvKiDhIC0gMjI1ICovCiAxOCwgIC8qIOIgLSAyMjYgKi8KIDI1LCAgLyog4yAtIDIyNyAqLwogMTksICAvKiDkIC0gMjI4ICovCiAyNiwgIC8qIOUgLSAyMjkgKi8KICAyLCAgLyog5iAtIDIzMCAqLwogMjgsICAvKiDnIC0gMjMxICovCiAxNSwgIC8qIOggLSAyMzIgKi8KIDE0LCAgLyog6SAtIDIzMyAqLwogMTgsICAvKiDqIC0gMjM0ICovCiAxOSwgIC8qIOsgLSAyMzUgKi8KIDE1LCAgLyog7CAtIDIzNiAqLwogMTQsICAvKiDtIC0gMjM3ICovCiAxOCwgIC8qIO4gLSAyMzggKi8KIDE5LCAgLyog7yAtIDIzOSAqLwoxMDQsICAvKiDwIC0gMjQwICovCiAyNSwgIC8qIPEgLSAyNDEgKi8KIDE1LCAgLyog8iAtIDI0MiAqLwogMTQsICAvKiDzIC0gMjQzICovCiAxOCwgIC8qIPQgLSAyNDQgKi8KIDI1LCAgLyog9SAtIDI0NSAqLwogMTksICAvKiD2IC0gMjQ2ICovCiAgMiwgIC8qIPcgLSAyNDcgKi8KIDMzLCAgLyog+CAtIDI0OCAqLwogMTUsICAvKiD5IC0gMjQ5ICovCiAxNCwgIC8qIPogLSAyNTAgKi8KIDE4LCAgLyog+yAtIDI1MSAqLwogMTksICAvKiD8IC0gMjUyICovCiAxNCwgIC8qIP0gLSAyNTMgKi8KICAyLCAgLyog/iAtIDI1NCAqLwogMTksICAvKiD/IC0gMjU1ICovCn0gOwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBPTEUyTkxTX2lzUHVuY3R1YXRpb24gW0lOVEVSTkFMXQogKi8Kc3RhdGljIGludCBPTEUyTkxTX2lzUHVuY3R1YXRpb24odW5zaWduZWQgY2hhciBjKSAKewogIC8qICJwdW5jdHVhdGlvbiBjaGFyYWN0ZXIiIGluIHRoaXMgY29udGV4dCBpcyBhIGNoYXJhY3RlciB3aGljaCBpcyAKICAgICBjb25zaWRlcmVkICJsZXNzIGltcG9ydGFudCIgZHVyaW5nIHdvcmQgc29ydCBjb21wYXJpc29uLgogICAgIFNlZSBMQ01hcFN0cmluZyBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIHByZWNpc2UgZGVmaW5pdGlvbiAKICAgICBvZiAibGVzcyBpbXBvcnRhbnQiLiAqLwoKICByZXR1cm4gKExDTV9Vbmljb2RlX0xVVFstMisyKmNdPT02KTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBPTEUyTkxTX2lzTm9uU3BhY2luZyBbSU5URVJOQUxdCiAqLwpzdGF0aWMgaW50IE9MRTJOTFNfaXNOb25TcGFjaW5nKHVuc2lnbmVkIGNoYXIgYykgCnsKICAvKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYnkgTENNYXBTdHJpbmdBLiAgQ2hhcmFjdGVycyAKICAgICBmb3Igd2hpY2ggaXQgcmV0dXJucyB0cnVlIGFyZSBpZ25vcmVkIHdoZW4gbWFwcGluZyBhCiAgICAgc3RyaW5nIHdpdGggTk9STV9JR05PUkVOT05TUEFDRSAqLwogIHJldHVybiAoKGM9PTEzNikgfHwgKGM9PTE3MCkgfHwgKGM9PTE4NikpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIE9MRTJOTFNfaXNTeW1ib2wgW0lOVEVSTkFMXQogKi8Kc3RhdGljIGludCBPTEUyTkxTX2lzU3ltYm9sKHVuc2lnbmVkIGNoYXIgYykgCnsKICAvKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYnkgTENNYXBTdHJpbmdBLiAgQ2hhcmFjdGVycyAKICAgICBmb3Igd2hpY2ggaXQgcmV0dXJucyB0cnVlIGFyZSBpZ25vcmVkIHdoZW4gbWFwcGluZyBhCiAgICAgc3RyaW5nIHdpdGggTk9STV9JR05PUkVTWU1CT0xTICovCiAgcmV0dXJuICggKGMhPTApICYmICFJc0NoYXJBbHBoYU51bWVyaWNBKGMpICk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCWlkZW50aXR5CVtJbnRlcm5hbF0KICovCnN0YXRpYyBpbnQgaWRlbnRpdHkoaW50IGMpCnsKICByZXR1cm4gYzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgIExDTWFwU3RyaW5nQSAgICAgICAgICAgICAgICBbS0VSTkVMMzIuNDkyXQogKgogKiBDb252ZXJ0IGEgc3RyaW5nLCBvciBnZW5lcmF0ZSBhIHNvcnQga2V5IGZyb20gaXQuCiAqCiAqIElmIChtYXBmbGFncyAmIExDTUFQX1NPUlRLRVkpLCB0aGUgZnVuY3Rpb24gd2lsbCBnZW5lcmF0ZQogKiBhIHNvcnQga2V5IGZvciB0aGUgc291cmNlIHN0cmluZy4gIEVsc2UsIGl0IHdpbGwgY29udmVydCBpdAogKiBhY2NvcmRpbmdseSB0byB0aGUgZmxhZ3MgTENNQVBfVVBQRVJDQVNFLCBMQ01BUF9MT1dFUkNBU0UsLi4uCiAqCiAqIFJFVFVSTlMKICogICAgRXJyb3IgOiAwLgogKiAgICBTdWNjZXNzIDogbGVuZ3RoIG9mIHRoZSByZXN1bHQgc3RyaW5nLgogKgogKiBOT1RFUwogKiAgICBJZiBjYWxsZWQgd2l0aCBzY3JsZW4gPSAtMSwgdGhlIGZ1bmN0aW9uIHdpbGwgY29tcHV0ZSB0aGUgbGVuZ3RoCiAqICAgICAgb2YgdGhlIDAtdGVybWluYXRlZCBzdHJpbmcgc3Ryc3JjIGJ5IGl0c2VsZi4gICAgICAKICogCiAqICAgIElmIGNhbGxlZCB3aXRoIGRzdGxlbiA9IDAsIHJldHVybnMgdGhlIGJ1ZmZlciBsZW5ndGggdGhhdCAKICogICAgICB3b3VsZCBiZSByZXF1aXJlZC4KICoKICogICAgTk9STV9JR05PUkVXSURUSCBtZWFucyB0byBjb21wYXJlIEFTQ0lJIGFuZCB3aWRlIGNoYXJhY3RlcnMKICogICAgYXMgaWYgdGhleSBhcmUgZXF1YWwuICAKICogICAgSW4gdGhlIG9ubHkgY29kZSBwYWdlIGltcGxlbWVudGVkIHNvIGZhciwgdGhlcmUgbWF5IG5vdCBiZQogKiAgICB3aWRlIGNoYXJhY3RlcnMgaW4gc3RyaW5ncyBwYXNzZWQgdG8gTENNYXBTdHJpbmdBLAogKiAgICBzbyB0aGVyZSBpcyBub3RoaW5nIHRvIGJlIGRvbmUgZm9yIHRoaXMgZmxhZy4KICovCklOVCBXSU5BUEkgTENNYXBTdHJpbmdBKAoJTENJRCBsY2lkLCAgICAgIC8qIFtpbl0gbG9jYWxlIGlkZW50aWZpZXIgY3JlYXRlZCB3aXRoIE1BS0VMQ0lEOyAKCQkgICAgICAgICAgICAgICAgTE9DQUxFX1NZU1RFTV9ERUZBVUxUIGFuZCBMT0NBTEVfVVNFUl9ERUZBVUxUIGFyZSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkZWZpbmVkIHZhbHVlcy4gKi8KCURXT1JEIG1hcGZsYWdzLCAvKiBbaW5dIGZsYWdzICovCglMUENTVFIgc3Jjc3RyLCAgLyogW2luXSBzb3VyY2UgYnVmZmVyICovCglJTlQgc3JjbGVuLCAgICAgLyogW2luXSBzb3VyY2UgbGVuZ3RoICovCglMUFNUUiBkc3RzdHIsICAgLyogW291dF0gZGVzdGluYXRpb24gYnVmZmVyICovCglJTlQgZHN0bGVuKSAgICAgLyogW2luXSBkZXN0aW5hdGlvbiBidWZmZXIgbGVuZ3RoICovCnsKICBpbnQgaTsKCiAgVFJBQ0UoIigweCUwNGx4LDB4JTA4bHgsJXMsJWQsJXAsJWQpXG4iLAoJbGNpZCxtYXBmbGFncyxzcmNzdHIsc3JjbGVuLGRzdHN0cixkc3RsZW4pOwoKICBpZiAoICgoZHN0bGVuIT0wKSAmJiAoZHN0c3RyPT1OVUxMKSkgfHwgKHNyY3N0cj09TlVMTCkgKQogIHsKICAgIEVSUigiKHNyYz0lcyxkZXN0PSVzKTogSW52YWxpZCBOVUxMIHN0cmluZ1xuIiwgc3Jjc3RyLCBkc3RzdHIpOwogICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKICAgIHJldHVybiAwOwogIH0KICBpZiAoc3JjbGVuID09IC0xKSAKICAgIHNyY2xlbiA9IHN0cmxlbihzcmNzdHIpICsgMSA7ICAgIC8qIChpbmNsdWRlIGZpbmFsICdcMCcpICovCgojZGVmaW5lIExDTUFQU1RSSU5HQV9TVVBQT1JURURfRkxBR1MgKExDTUFQX1VQUEVSQ0FTRSAgICAgfCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMQ01BUF9MT1dFUkNBU0UgICAgIHwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTENNQVBfU09SVEtFWSAgICAgICB8IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5PUk1fSUdOT1JFQ0FTRSAgICAgfCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOT1JNX0lHTk9SRU5PTlNQQUNFIHwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09SVF9TVFJJTkdTT1JUICAgICB8IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5PUk1fSUdOT1JFV0lEVEggICAgfCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOT1JNX0lHTk9SRUtBTkFUWVBFKQogIC8qIEZJWE1FOiBhcyBsb25nIGFzIHdlIGRvbid0IHN1cHBvcnQgS2FuYWthbmEgbm9yIEhpcmlnYW5hIAogICAqIGNoYXJhY3RlcnMsIHdlIGNhbiBzdXBwb3J0IE5PUk1fSUdOT1JFS0FOQVRZUEUKICAgKi8KICBpZiAobWFwZmxhZ3MgJiB+TENNQVBTVFJJTkdBX1NVUFBPUlRFRF9GTEFHUykKICB7CiAgICBGSVhNRSgiKDB4JTA0bHgsMHglMDhseCwlcCwlZCwlcCwlZCk6ICIKCSAgInVuaW1wbGVtZW50ZWQgZmxhZ3M6IDB4JTA4bHhcbiIsCgkgIGxjaWQsCgkgIG1hcGZsYWdzLAoJICBzcmNzdHIsCgkgIHNyY2xlbiwKCSAgZHN0c3RyLAoJICBkc3RsZW4sCgkgIG1hcGZsYWdzICYgfkxDTUFQU1RSSU5HQV9TVVBQT1JURURfRkxBR1MKICAgICApOwogIH0KCiAgaWYgKCAhKG1hcGZsYWdzICYgTENNQVBfU09SVEtFWSkgKQogIHsKICAgIGludCBpLGo7CiAgICBpbnQgKCpmKShpbnQpID0gaWRlbnRpdHk7IAogICAgaW50IGZsYWdfaWdub3Jlbm9uc3BhY2UgPSBtYXBmbGFncyAmIE5PUk1fSUdOT1JFTk9OU1BBQ0U7CiAgICBpbnQgZmxhZ19pZ25vcmVzeW1ib2xzID0gbWFwZmxhZ3MgJiBOT1JNX0lHTk9SRVNZTUJPTFM7CgogICAgaWYgKGZsYWdfaWdub3Jlbm9uc3BhY2UgfHwgZmxhZ19pZ25vcmVzeW1ib2xzKQogICAgewogICAgICAvKiBGb3Igc29tZSB2YWx1ZXMgb2YgbWFwZmxhZ3MsIHRoZSBsZW5ndGggb2YgdGhlIHJlc3VsdGluZyAKCSBzdHJpbmcgaXMgbm90IGtub3duIGF0IHRoaXMgcG9pbnQuICBXaW5kb3dzIGRvZXMgbWFwIHRoZSBzdHJpbmcKCSBhbmQgZG9lcyBub3QgU2V0TGFzdEVycm9yIEVSUk9SX0lOU1VGRklDSUVOVF9CVUZGRVIgaW4KCSB0aGVzZSBjYXNlcy4gKi8KICAgICAgaWYgKGRzdGxlbj09MCkKICAgICAgewoJLyogQ29tcHV0ZSByZXF1aXJlZCBsZW5ndGggKi8KCWZvciAoaT1qPTA7IGkgPCBzcmNsZW47IGkrKykKCXsKCSAgaWYgKCAhKGZsYWdfaWdub3Jlbm9uc3BhY2UgJiYgT0xFMk5MU19pc05vblNwYWNpbmcoc3Jjc3RyW2ldKSkKCSAgICAgICAmJiAhKGZsYWdfaWdub3Jlc3ltYm9scyAmJiBPTEUyTkxTX2lzU3ltYm9sKHNyY3N0cltpXSkpICkKCSAgICBqKys7Cgl9CglyZXR1cm4gajsKICAgICAgfQogICAgfQogICAgZWxzZQogICAgewogICAgICBpZiAoZHN0bGVuPT0wKQoJcmV0dXJuIHNyY2xlbjsgIAogICAgICBpZiAoZHN0bGVuPHNyY2xlbikgCgkgICB7CgkgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlNVRkZJQ0lFTlRfQlVGRkVSKTsKCSAgICAgcmV0dXJuIDA7CgkgICB9CiAgICB9CiAgICBpZiAobWFwZmxhZ3MgJiBMQ01BUF9VUFBFUkNBU0UpCiAgICAgIGYgPSB0b3VwcGVyOwogICAgZWxzZSBpZiAobWFwZmxhZ3MgJiBMQ01BUF9MT1dFUkNBU0UpCiAgICAgIGYgPSB0b2xvd2VyOwogICAgLyogRklYTUU6IE5PUk1fSUdOT1JFTk9OU1BBQ0UgcmVxdWlyZXMgYW5vdGhlciBjb252ZXJzaW9uICovCiAgICBmb3IgKGk9aj0wOyAoaTxzcmNsZW4pICYmIChqPGRzdGxlbikgOyBpKyspCiAgICB7CiAgICAgIGlmICggIShmbGFnX2lnbm9yZW5vbnNwYWNlICYmIE9MRTJOTFNfaXNOb25TcGFjaW5nKHNyY3N0cltpXSkpCgkgICAmJiAhKGZsYWdfaWdub3Jlc3ltYm9scyAmJiBPTEUyTkxTX2lzU3ltYm9sKHNyY3N0cltpXSkpICkKICAgICAgewoJZHN0c3RyW2pdID0gKENIQVIpIGYoc3Jjc3RyW2ldKTsKCWorKzsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGo7CiAgfQoKICAvKiBGSVhNRTogVGhpcyBmdW5jdGlvbiBjb21wbGV0ZWx5IGlnbm9yZXMgdGhlICJsY2lkIiBwYXJhbWV0ZXIuICovCiAgLyogZWxzZSAuLi4gKG1hcGZsYWdzICYgTENNQVBfU09SVEtFWSkgICovCiAgewogICAgaW50IHVuaWNvZGVfbGVuPTA7CiAgICBpbnQgY2FzZV9sZW49MDsKICAgIGludCBkaWFjcml0aWNfbGVuPTA7CiAgICBpbnQgZGVsYXllZF9wdW5jdHVhdGlvbl9sZW49MDsKICAgIGNoYXIgKmNhc2VfY29tcG9uZW50OwogICAgY2hhciAqZGlhY3JpdGljX2NvbXBvbmVudDsKICAgIGNoYXIgKmRlbGF5ZWRfcHVuY3R1YXRpb25fY29tcG9uZW50OwogICAgaW50IHJvb20sY291bnQ7CiAgICBpbnQgZmxhZ19zdHJpbmdzb3J0ID0gbWFwZmxhZ3MgJiBTT1JUX1NUUklOR1NPUlQ7CgogICAgLyogY29tcHV0ZSBob3cgbXVjaCByb29tIHdlIHdpbGwgbmVlZCAqLwogICAgZm9yIChpPTA7aTxzcmNsZW47aSsrKQogICAgewogICAgICBpbnQgb2ZzOwogICAgICB1bnNpZ25lZCBjaGFyIHNvdXJjZV9jaGFyID0gc3Jjc3RyW2ldOwogICAgICBpZiAoc291cmNlX2NoYXIhPSdcMCcpIAogICAgICB7CglpZiAoZmxhZ19zdHJpbmdzb3J0IHx8ICFPTEUyTkxTX2lzUHVuY3R1YXRpb24oc291cmNlX2NoYXIpKQoJewoJICB1bmljb2RlX2xlbisrOwoJICBpZiAoIExDTV9Vbmljb2RlX0xVVFstMisyKnNvdXJjZV9jaGFyXSAmIH4xNSApCgkgICAgdW5pY29kZV9sZW4rKzsgICAgICAgICAgICAgLyogZG91YmxlIGxldHRlciAqLwoJfQoJZWxzZQoJewoJICBkZWxheWVkX3B1bmN0dWF0aW9uX2xlbisrOwoJfQkgIAogICAgICB9CgkgIAogICAgICBpZiAoaXN1cHBlcihzb3VyY2VfY2hhcikpCgljYXNlX2xlbj11bmljb2RlX2xlbjsgCgogICAgICBvZnMgPSBzb3VyY2VfY2hhciAtIExDTV9EaWFjcml0aWNfU3RhcnQ7CiAgICAgIGlmICgob2ZzPj0wKSAmJiAoTENNX0RpYWNyaXRpY19MVVRbb2ZzXSE9MikpCglkaWFjcml0aWNfbGVuPXVuaWNvZGVfbGVuOwogICAgfQoKICAgIGlmIChtYXBmbGFncyAmIE5PUk1fSUdOT1JFQ0FTRSkKICAgICAgY2FzZV9sZW49MDsgICAgICAgICAgICAgICAgICAgCiAgICBpZiAobWFwZmxhZ3MgJiBOT1JNX0lHTk9SRU5PTlNQQUNFKQogICAgICBkaWFjcml0aWNfbGVuPTA7CgogICAgcm9vbSA9ICAyICogdW5pY29kZV9sZW4gICAgICAgICAgICAgIC8qICJ1bmljb2RlIiBjb21wb25lbnQgKi8KICAgICAgKyAgICAgZGlhY3JpdGljX2xlbiAgICAgICAgICAgICAgICAvKiAiZGlhY3JpdGljIiBjb21wb25lbnQgKi8KICAgICAgKyAgICAgY2FzZV9sZW4gICAgICAgICAgICAgICAgICAgICAvKiAiY2FzZSIgY29tcG9uZW50ICovCiAgICAgICsgICAgIDQgKiBkZWxheWVkX3B1bmN0dWF0aW9uX2xlbiAgLyogcHVuY3R1YXRpb24gaW4gd29yZCBzb3J0IG1vZGUgKi8KICAgICAgKyAgICAgNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmb3VyICdcMScgc2VwYXJhdG9ycyAqLwogICAgICArICAgICAxICA7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRlcm1pbmFsICdcMCcgKi8KICAgIGlmIChkc3RsZW49PTApCiAgICAgIHJldHVybiByb29tOyAgICAgIAogICAgZWxzZSBpZiAoZHN0bGVuPHJvb20pCiAgICB7CiAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlNVRkZJQ0lFTlRfQlVGRkVSKTsKICAgICAgcmV0dXJuIDA7CiAgICB9CiNpZiAwCiAgICAvKkZJWE1FIHRoZSBQb2ludGVyY2hlY2sgc2hvdWxkIG5vdCBiZSBuZXNzZXNhcnkgKi8KICAgIGlmIChJc0JhZFdyaXRlUHRyIChkc3RzdHIscm9vbSkpCiAgICB7IEVSUigiYmFkIGRlc3RpbmF0aW9uIGJ1ZmZlciAoZHN0c3RyKSA6ICVwLCVkXG4iLGRzdHN0cixkc3RsZW4pOwogICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUik7CiAgICAgIHJldHVybiAwOwogICAgfQojZW5kaWYKICAgIC8qIGxvY2F0ZSBlYWNoIGNvbXBvbmVudCwgd3JpdGUgc2VwYXJhdG9ycyAqLwogICAgZGlhY3JpdGljX2NvbXBvbmVudCA9IGRzdHN0ciArIDIqdW5pY29kZV9sZW4gOwogICAgKmRpYWNyaXRpY19jb21wb25lbnQrKyA9ICdcMSc7IAogICAgY2FzZV9jb21wb25lbnQgPSBkaWFjcml0aWNfY29tcG9uZW50ICsgZGlhY3JpdGljX2xlbiA7CiAgICAqY2FzZV9jb21wb25lbnQrKyA9ICdcMSc7IAogICAgZGVsYXllZF9wdW5jdHVhdGlvbl9jb21wb25lbnQgPSBjYXNlX2NvbXBvbmVudCArIGNhc2VfbGVuIDsKICAgICpkZWxheWVkX3B1bmN0dWF0aW9uX2NvbXBvbmVudCsrID0gJ1wxJzsKICAgICpkZWxheWVkX3B1bmN0dWF0aW9uX2NvbXBvbmVudCsrID0gJ1wxJzsKCiAgICAvKiByZWFkIHNvdXJjZSBzdHJpbmcgY2hhciBieSBjaGFyLCB3cml0ZSAKICAgICAgIGNvcnJlc3BvbmRpbmcgd2VpZ2h0IGluIGVhY2ggY29tcG9uZW50LiAqLwogICAgZm9yIChpPTAsY291bnQ9MDtpPHNyY2xlbjtpKyspCiAgICB7CiAgICAgIHVuc2lnbmVkIGNoYXIgc291cmNlX2NoYXI9c3Jjc3RyW2ldOwogICAgICBpZiAoc291cmNlX2NoYXIhPSdcMCcpIAogICAgICB7CglpbnQgdHlwZSxsb25nY29kZTsKCXR5cGUgPSBMQ01fVW5pY29kZV9MVVRbLTIrMipzb3VyY2VfY2hhcl07Cglsb25nY29kZSA9IHR5cGUgPj4gNDsKCXR5cGUgJj0gMTU7CglpZiAoIWZsYWdfc3RyaW5nc29ydCAmJiBPTEUyTkxTX2lzUHVuY3R1YXRpb24oc291cmNlX2NoYXIpKSAKCXsKCSAgV09SRCBlbmNyeXB0ZWRfbG9jYXRpb24gPSAoMTw8MTUpICsgNyArIDQqY291bnQ7CgkgICpkZWxheWVkX3B1bmN0dWF0aW9uX2NvbXBvbmVudCsrID0gKHVuc2lnbmVkIGNoYXIpIChlbmNyeXB0ZWRfbG9jYXRpb24+PjgpOwoJICAqZGVsYXllZF9wdW5jdHVhdGlvbl9jb21wb25lbnQrKyA9ICh1bnNpZ25lZCBjaGFyKSAoZW5jcnlwdGVkX2xvY2F0aW9uJjI1NSk7CiAgICAgICAgICAgICAgICAgICAgIC8qIGJpZy1lbmRpYW4gaXMgdXNlZCBoZXJlIGJlY2F1c2UgaXQgbGV0cyBzdHJpbmcgY29tcGFyaXNvbiBiZQoJCQljb21wYXRpYmxlIHdpdGggbnVtZXJpY2FsIGNvbXBhcmlzb24gKi8KCgkgICpkZWxheWVkX3B1bmN0dWF0aW9uX2NvbXBvbmVudCsrID0gdHlwZTsKCSAgKmRlbGF5ZWRfcHVuY3R1YXRpb25fY29tcG9uZW50KysgPSBMQ01fVW5pY29kZV9MVVRbLTErMipzb3VyY2VfY2hhcl07ICAKICAgICAgICAgICAgICAgICAgICAgLyogYXNzdW1wdGlvbiA6IGEgcHVuY3R1YXRpb24gY2hhcmFjdGVyIGlzIG5ldmVyIGEgCgkJCWRvdWJsZSBvciBhY2NlbnRlZCBsZXR0ZXIgKi8KCX0KCWVsc2UKCXsKCSAgZHN0c3RyWzIqY291bnRdID0gdHlwZTsKCSAgZHN0c3RyWzIqY291bnQrMV0gPSBMQ01fVW5pY29kZV9MVVRbLTErMipzb3VyY2VfY2hhcl07ICAKCSAgaWYgKGxvbmdjb2RlKQoJICB7CgkgICAgaWYgKGNvdW50PGNhc2VfbGVuKQoJICAgICAgY2FzZV9jb21wb25lbnRbY291bnRdID0gKCBpc3VwcGVyKHNvdXJjZV9jaGFyKSA/IDE4IDogMiApIDsKCSAgICBpZiAoY291bnQ8ZGlhY3JpdGljX2xlbikKCSAgICAgIGRpYWNyaXRpY19jb21wb25lbnRbY291bnRdID0gMjsgLyogYXNzdW1wdGlvbjogYSBkb3VibGUgbGV0dGVyCgkJCQkJCSBpcyBuZXZlciBhY2NlbnRlZCAqLwoJICAgIGNvdW50Kys7CgkgICAgCgkgICAgZHN0c3RyWzIqY291bnRdID0gdHlwZTsKCSAgICBkc3RzdHJbMipjb3VudCsxXSA9ICooTENNX1VuaWNvZGVfTFVUXzIgLSAxICsgbG9uZ2NvZGUpOyAKCSAgICAvKiAxNiBpbiB0aGUgZmlyc3QgY29sdW1uIG9mIExDTV9Vbmljb2RlX0xVVCAgLS0+ICBsb25nY29kZSA9IDEgCgkgICAgICAgMzIgaW4gdGhlIGZpcnN0IGNvbHVtbiBvZiBMQ01fVW5pY29kZV9MVVQgIC0tPiAgbG9uZ2NvZGUgPSAyIAoJICAgICAgIDQ4IGluIHRoZSBmaXJzdCBjb2x1bW4gb2YgTENNX1VuaWNvZGVfTFVUICAtLT4gIGxvbmdjb2RlID0gMyAqLwoJICB9CgoJICBpZiAoY291bnQ8Y2FzZV9sZW4pCgkgICAgY2FzZV9jb21wb25lbnRbY291bnRdID0gKCBpc3VwcGVyKHNvdXJjZV9jaGFyKSA/IDE4IDogMiApIDsKCSAgaWYgKGNvdW50PGRpYWNyaXRpY19sZW4pCgkgIHsKCSAgICBpbnQgb2ZzID0gc291cmNlX2NoYXIgLSBMQ01fRGlhY3JpdGljX1N0YXJ0OwoJICAgIGRpYWNyaXRpY19jb21wb25lbnRbY291bnRdID0gKG9mcz49MCA/IExDTV9EaWFjcml0aWNfTFVUW29mc10gOiAyKTsKCSAgfQoJICBjb3VudCsrOwoJfQogICAgICB9CiAgICB9CiAgICBkc3RzdHJbcm9vbS0xXSA9ICdcMCc7CiAgICByZXR1cm4gcm9vbTsKICB9Cn0KCQkgICAgIAovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgTENNYXBTdHJpbmdXICAgICAgICAgICAgICAgIFtLRVJORUwzMi40OTNdCiAqCiAqIENvbnZlcnQgYSBzdHJpbmcsIG9yIGdlbmVyYXRlIGEgc29ydCBrZXkgZnJvbSBpdC4KICoKICogTk9URQogKgogKiBTZWUgTENNYXBTdHJpbmdBIGZvciBkb2N1bWVudGF0aW9uCiAqLwpJTlQgV0lOQVBJIExDTWFwU3RyaW5nVygKCUxDSUQgbGNpZCxEV09SRCBtYXBmbGFncyxMUENXU1RSIHNyY3N0cixJTlQgc3JjbGVuLExQV1NUUiBkc3RzdHIsCglJTlQgZHN0bGVuKQp7CiAgaW50IGk7CiAKICBUUkFDRSgiKDB4JTA0bHgsMHglMDhseCwlcCwlZCwlcCwlZClcbiIsCiAgICAgICAgICAgICAgICAgbGNpZCwgbWFwZmxhZ3MsIHNyY3N0ciwgc3JjbGVuLCBkc3RzdHIsIGRzdGxlbik7CiAgCiAgaWYgKCAoKGRzdGxlbiE9MCkgJiYgKGRzdHN0cj09TlVMTCkpIHx8IChzcmNzdHI9PU5VTEwpICkKICB7CiAgICBFUlIoIihzcmM9JXAsZHN0PSVwKTogSW52YWxpZCBOVUxMIHN0cmluZ1xuIiwgc3Jjc3RyLCBkc3RzdHIpOwogICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKICAgIHJldHVybiAwOwogIH0KICBpZiAoc3JjbGVuPT0tMSkgCiAgICBzcmNsZW4gPSBzdHJsZW5XKHNyY3N0cikrMTsKCiAgLyogRklYTUU6IEJvdGggdGhpcyBmdW5jdGlvbiBhbmQgaXQncyBjb21wYW5pb24gTENNYXBTdHJpbmdBKCkKICAgKiBjb21wbGV0ZWx5IGlnbm9yZSB0aGUgImxjaWQiIHBhcmFtZXRlci4gIEluIHBsYWNlIG9mIHRoZSAibGNpZCIKICAgKiBwYXJhbWV0ZXIgdGhlIGFwcGxpY2F0aW9uIG11c3Qgc2V0IHRoZSAiTENfQ09MTEFURSIgb3IgIkxDX0FMTCIKICAgKiBlbnZpcm9ubWVudCB2YXJpYWJsZSBwcmlvciB0byBpbnZva2luZyB0aGlzIGZ1bmN0aW9uLiAgKi8KICBpZiAobWFwZmxhZ3MgJiBMQ01BUF9TT1JUS0VZKSAKICB7CiAgICAgIC8qIFBvc3NpYmxlIHZhbHVlcyBvZiBMQ19DT0xMQVRFLiAqLwogICAgICBjaGFyICpsY19jb2xsYXRlX2RlZmF1bHQgPSAwOyAvKiB2YWx1ZSBwcmlvciB0byB0aGlzIGZ1bmN0aW9uICovCiAgICAgIGNoYXIgKmxjX2NvbGxhdGVfZW52ID0gMDsgICAgIC8qIHZhbHVlIHJldHJpZXZlZCBmcm9tIHRoZSBlbnZpcm9ubWVudCAqLwoKICAgICAgLyogR2VuZXJhbCBwdXJwb3NlIGluZGV4IGludG8gc3RyaW5ncyBvZiBhbnkgdHlwZS4gKi8KICAgICAgaW50IHN0cl9pZHggPSAwOwoKICAgICAgLyogTGVuZ3RocyBvZiB2YXJpb3VzIHN0cmluZ3Mgd2hlcmUgdGhlIGxlbmd0aCBpcyBtZWFzdXJlZCBpbgogICAgICAgKiB3aWRlIGNoYXJhY3RlcnMgZm9yIHdpZGUgY2hhcmFjdGVyIHN0cmluZ3MgYW5kIGluIGJ5dGVzIGZvcgogICAgICAgKiBuYXRpdmUgc3RyaW5ncy4gIFRoZSBsZW5ndGhzIGluY2x1ZGUgdGhlIE5VTEwgdGVybWluYXRvci4gICovCiAgICAgIHNpemVfdCByZXR1cm5lZF9sZW4gICAgPSAwOwogICAgICBzaXplX3Qgc3JjX25hdGl2ZV9sZW4gID0gMDsKICAgICAgc2l6ZV90IGRzdF9uYXRpdmVfbGVuICA9IDA7CiAgICAgIHNpemVfdCBkc3RzdHJfbGliY19sZW4gPSAwOwoKICAgICAgLyogTmF0aXZlIChjaGFyYWN0ZXIgc2V0IGRldGVybWluZWQgYnkgbG9jYWxlKSB2ZXJzaW9ucyBvZiB0aGUKICAgICAgICogc3RyaW5ncyBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIHN0cmluZ3MuICAqLwogICAgICBMUFNUUiBzcmNfbmF0aXZlID0gMDsKICAgICAgTFBTVFIgZHN0X25hdGl2ZSA9IDA7CgogICAgICAvKiBWZXJzaW9uIG9mIHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIHN0cmluZ3MgdXNpbmcgdGhlCiAgICAgICAqICJ3Y2hhcl90IiBVbmljb2RlIGRhdGEgdHlwZSBuZWVkZWQgYnkgdmFyaW91cyBsaWJjIGZ1bmN0aW9ucy4gICovCiAgICAgIHdjaGFyX3QgKnNyY3N0cl9saWJjID0gMDsKICAgICAgd2NoYXJfdCAqZHN0c3RyX2xpYmMgPSAwOwoKICAgICAgaWYoIShzcmNzdHJfbGliYyA9ICh3Y2hhcl90ICopSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY2xlbiAqIHNpemVvZih3Y2hhcl90KSkpKQogICAgICB7CiAgICAgICAgICBFUlIoIlVuYWJsZSB0byBhbGxvY2F0ZSAlZCBieXRlcyBmb3Igc3Jjc3RyX2xpYmNcbiIsCiAgICAgICAgICAgICAgc3JjbGVuICogc2l6ZW9mKHdjaGFyX3QpKTsKICAgICAgICAgIFNldExhc3RFcnJvcihFUlJPUl9OT1RfRU5PVUdIX01FTU9SWSk7CiAgICAgICAgICByZXR1cm4gMDsKICAgICAgfQoKICAgICAgLyogQ29udmVydCBzb3VyY2Ugc3RyaW5nIHRvIGEgbGliYyBVbmljb2RlIHN0cmluZy4gKi8KICAgICAgZm9yKHN0cl9pZHggPSAwOyBzdHJfaWR4IDwgc3JjbGVuOyBzdHJfaWR4KyspCiAgICAgIHsKICAgICAgICAgIHNyY3N0cl9saWJjW3N0cl9pZHhdID0gc3Jjc3RyW3N0cl9pZHhdOwogICAgICB9CgogICAgICAvKiBzcmNfbmF0aXZlIHNob3VsZCBjb250YWluIGF0IG1vc3QgMyBieXRlcyBmb3IgZWFjaAogICAgICAgKiBtdWx0aWJ5dGUgY2hhcmFjdGVycyBpbiB0aGUgb3JpZ2luYWwgc3Jjc3RyIHN0cmluZy4gICovCiAgICAgIHNyY19uYXRpdmVfbGVuID0gMyAqIHNyY2xlbjsKICAgICAgaWYoIShzcmNfbmF0aXZlID0gKExQU1RSKUhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfbmF0aXZlX2xlbikpKQogICAgICB7CiAgICAgICAgICBFUlIoIlVuYWJsZSB0byBhbGxvY2F0ZSAlZCBieXRlcyBmb3Igc3JjX25hdGl2ZVxuIiwgc3JjX25hdGl2ZV9sZW4pOwogICAgICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX05PVF9FTk9VR0hfTUVNT1JZKTsKICAgICAgICAgIGlmKHNyY3N0cl9saWJjKSBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBzcmNzdHJfbGliYyk7CiAgICAgICAgICByZXR1cm4gMDsKICAgICAgfQoKICAgICAgLyogRklYTUU6IFByaW9yIHRvIHRvIHNldHRpbmcgdGhlIExDX0NPTExBVEUgbG9jYWxlIGNhdGVnb3J5IHRoZQogICAgICAgKiBjdXJyZW50IHZhbHVlIGlzIGJhY2tlZCB1cCBzbyBpdCBjYW4gYmUgcmVzdG9yZWQgYWZ0ZXIgdGhlCiAgICAgICAqIGxhc3QgTENfQ09MTEFURSBzZW5zaXRpdmUgZnVuY3Rpb24gcmV0dXJucy4KICAgICAgICogCiAgICAgICAqIEV2ZW4gdGhvdWdoIHRoZSBsb2NhbGUgaXMgYWRqdXN0ZWQgZm9yIGEgbWluaW11bSBhbW91bnQgb2YKICAgICAgICogdGltZSBhIHJhY2UgY29uZGl0aW9uIGV4aXN0cyB3aGVyZSBvdGhlciB0aHJlYWRzIG1heSBiZQogICAgICAgKiBhZmZlY3RlZCBpZiB0aGV5IGludm9rZSBMQ19DT0xMQVRFIHNlbnNpdGl2ZSBmdW5jdGlvbnMuICBPbmUKICAgICAgICogcG9zc2libGUgc29sdXRpb24gaXMgdG8gd3JhcCBhbGwgTENfQ09MTEFURSBzZW5zaXRpdmUgV2luZQogICAgICAgKiBmdW5jdGlvbnMsIGxpa2UgTENNYXBTdHJpbmdXKCksIGluIGEgbXV0ZXguCiAgICAgICAqCiAgICAgICAqIEFub3RoZXIgZW5oYW5jZW1lbnQgdG8gdGhlIGZvbGxvd2luZyB3b3VsZCBiZSB0byBzZXQgdGhlCiAgICAgICAqIExDX0NPTExBVEUgbG9jYWxlIGNhdGVnb3J5IGFzIGEgZnVuY3Rpb24gb2YgdGhlICJsY2lkIgogICAgICAgKiBwYXJhbWV0ZXIgaW5zdGVhZCBvZiB0aGUgIkxDX0NPTExBVEUiIGVudmlyb25tZW50IHZhcmlhYmxlLiAqLwogICAgICBpZighKGxjX2NvbGxhdGVfZGVmYXVsdCA9IHNldGxvY2FsZShMQ19DT0xMQVRFLCBOVUxMKSkpCiAgICAgIHsKICAgICAgICAgIEVSUigiVW5hYmxlIHRvIHF1ZXJ5IHRoZSBMQ19DT0xMQVRFIGNhdGFnb3J5XG4iKTsKICAgICAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CiAgICAgICAgICBpZihzcmNzdHJfbGliYykgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc3Jjc3RyX2xpYmMpOwogICAgICAgICAgaWYoc3JjX25hdGl2ZSkgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc3JjX25hdGl2ZSk7CiAgICAgICAgICByZXR1cm4gMDsKICAgICAgfQoKICAgICAgaWYoIShsY19jb2xsYXRlX2VudiA9IHNldGxvY2FsZShMQ19DT0xMQVRFLCAiIikpKQogICAgICB7CiAgICAgICAgICBFUlIoIlVuYWJsZSB0byBpbmhlcml0IHRoZSBMQ19DT0xMQVRFIGxvY2FsZSBjYXRlZ29yeSBmcm9tIHRoZSAiCiAgICAgICAgICAgICAgImVudmlyb25tZW50LiAgVGhlIFwiTENfQ09MTEFURVwiIGVudmlyb25tZW50IHZhcmlhYmxlIGlzICIKICAgICAgICAgICAgICAiXCIlc1wiLlxuIiwgZ2V0ZW52KCJMQ19DT0xMQVRFIikgPwogICAgICAgICAgICAgIGdldGVudigiTENfQ09MTEFURSIpIDogIjx1bnNldD4iKTsKICAgICAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CiAgICAgICAgICBpZihzcmNzdHJfbGliYykgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc3Jjc3RyX2xpYmMpOwogICAgICAgICAgaWYoc3JjX25hdGl2ZSkgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc3JjX25hdGl2ZSk7CiAgICAgICAgICByZXR1cm4gMDsKICAgICAgfQoKICAgICAgVFJBQ0UoImxjX2NvbGxhdGVfZGVmYXVsdCA9ICVzXG4iLCBsY19jb2xsYXRlX2RlZmF1bHQpOwogICAgICBUUkFDRSgibGNfY29sbGF0ZV9lbnYgPSAlc1xuIiwgbGNfY29sbGF0ZV9lbnYpOwoKICAgICAgLyogQ29udmVydCB0aGUgbGliYyBVbmljb2RlIHN0cmluZyB0byBhIG5hdGl2ZSBtdWx0aWJ5dGUgY2hhcmFjdGVyCiAgICAgICAqIHN0cmluZy4gKi8KICAgICAgcmV0dXJuZWRfbGVuID0gd2NzdG9tYnMoc3JjX25hdGl2ZSwgc3Jjc3RyX2xpYmMsIHNyY19uYXRpdmVfbGVuKSArIDE7CiAgICAgIGlmKHJldHVybmVkX2xlbiA9PSAwKQogICAgICB7CiAgICAgICAgICBMUFNUUiBzcmNzdHJfYXNjaWkgPSAoTFBTVFIpSEVBUF9zdHJkdXBXdG9BKEdldFByb2Nlc3NIZWFwKCksCgkJCQkJICAgMCwgc3Jjc3RyKTsKICAgICAgICAgIEVSUigid2NzdG9tYnMgZmFpbGVkLiAgVGhlIHN0cmluZyBzcGVjaWZpZWQgKCVzKSBtYXkgY29udGFpbnMgYW4gIgogICAgICAgICAgICAgICJpbnZhbGlkIGNoYXJhY3Rlci5cbiIsIHNyY3N0cl9hc2NpaSk7CiAgICAgICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwogICAgICAgICAgaWYoc3Jjc3RyX2FzY2lpKSBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBzcmNzdHJfYXNjaWkpOwogICAgICAgICAgaWYoc3Jjc3RyX2xpYmMpIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIHNyY3N0cl9saWJjKTsKICAgICAgICAgIGlmKHNyY19uYXRpdmUpIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIHNyY19uYXRpdmUpOwogICAgICAgICAgc2V0bG9jYWxlKExDX0NPTExBVEUsIGxjX2NvbGxhdGVfZGVmYXVsdCk7CiAgICAgICAgICByZXR1cm4gMDsKICAgICAgfQogICAgICBlbHNlIGlmKHJldHVybmVkX2xlbiA+IHNyY19uYXRpdmVfbGVuKQogICAgICB7CiAgICAgICAgICBzcmNfbmF0aXZlW3NyY19uYXRpdmVfbGVuIC0gMV0gPSAwOwogICAgICAgICAgRVJSKCJ3Y3N0b21icyByZXR1cm5lZCBhIHN0cmluZyAoJXMpIHRoYXQgd2FzIGxvbmdlciAoJWQgYnl0ZXMpICIgCiAgICAgICAgICAgICAgInRoYW4gZXhwZWN0ZWQgKCVkIGJ5dGVzKS5cbiIsIHNyY19uYXRpdmUsIHJldHVybmVkX2xlbiwKICAgICAgICAgICAgICBkc3RfbmF0aXZlX2xlbik7CgogICAgICAgICAgLyogU2luY2UgdGhpcyBpcyBhbiBpbnRlcm5hbCBlcnJvciBJJ20gbm90IHN1cmUgd2hhdCB0aGUgY29ycmVjdAogICAgICAgICAgICogZXJyb3IgY29kZSBpcy4gICovCiAgICAgICAgICBTZXRMYXN0RXJyb3IoRVJST1JfTk9UX0VOT1VHSF9NRU1PUlkpOwoKICAgICAgICAgIGlmKHNyY3N0cl9saWJjKSBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBzcmNzdHJfbGliYyk7CiAgICAgICAgICBpZihzcmNfbmF0aXZlKSBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBzcmNfbmF0aXZlKTsKICAgICAgICAgIHNldGxvY2FsZShMQ19DT0xMQVRFLCBsY19jb2xsYXRlX2RlZmF1bHQpOwogICAgICAgICAgcmV0dXJuIDA7CiAgICAgIH0KICAgICAgc3JjX25hdGl2ZV9sZW4gPSByZXR1cm5lZF9sZW47CgogICAgICBUUkFDRSgic3JjX25hdGl2ZSA9ICVzICBzcmNfbmF0aXZlX2xlbiA9ICVkXG4iLAogICAgICAgICAgICAgc3JjX25hdGl2ZSwgc3JjX25hdGl2ZV9sZW4pOwoKICAgICAgLyogZHN0X25hdGl2ZSBzZWVtcyB0byBjb250YWluIGF0IG1vc3QgNCBieXRlcyBmb3IgZWFjaCBieXRlIGluCiAgICAgICAqIHRoZSBvcmlnaW5hbCBzcmNfbmF0aXZlIHN0cmluZy4gIENoYW5nZSBpZiBuZWVkIGJlIHNpbmNlIHRoaXMKICAgICAgICogaXNuJ3QgZG9jdW1lbnRlZCBieSB0aGUgc3RyeGZybSgpIG1hbiBwYWdlLiAqLwogICAgICBkc3RfbmF0aXZlX2xlbiA9IDQgKiBzcmNfbmF0aXZlX2xlbjsKICAgICAgaWYoIShkc3RfbmF0aXZlID0gKExQU1RSKUhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCAwLCBkc3RfbmF0aXZlX2xlbikpKQogICAgICB7CiAgICAgICAgICBFUlIoIlVuYWJsZSB0byBhbGxvY2F0ZSAlZCBieXRlcyBmb3IgZHN0X25hdGl2ZVxuIiwgZHN0X25hdGl2ZV9sZW4pOwogICAgICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX05PVF9FTk9VR0hfTUVNT1JZKTsKICAgICAgICAgIGlmKHNyY3N0cl9saWJjKSBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBzcmNzdHJfbGliYyk7CiAgICAgICAgICBpZihzcmNfbmF0aXZlKSBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBzcmNfbmF0aXZlKTsKICAgICAgICAgIHNldGxvY2FsZShMQ19DT0xMQVRFLCBsY19jb2xsYXRlX2RlZmF1bHQpOwogICAgICAgICAgcmV0dXJuIDA7CiAgICAgIH0KCiAgICAgIC8qIFRoZSBhY3R1YWwgdHJhbnNsYXRpb24gaXMgZG9uZSBieSB0aGUgZm9sbG93aW5nIGNhbGwgdG8KICAgICAgICogc3RyeGZybSgpLiAgVGhlIHN1cnJvdW5kaW5nIGNvZGUgY291bGQgaGF2ZSBiZWVuIHNpbXBsaWZpZWQKICAgICAgICogYnkgY2FsbGluZyB3Y3N4ZnJtKCkgaW5zdGVhZCBleGNlcHQgdGhhdCB3Y3N4ZnJtKCkgaXMgbm90CiAgICAgICAqIGF2YWlsYWJsZSBvbiBvbGRlciBMaW51eCBzeXN0ZW1zIChSZWRIYXQgNC4xIHdpdGgKICAgICAgICogbGliYy01LjMuMTItMTcpLgogICAgICAgKgogICAgICAgKiBBbHNvLCBpdCBpcyBwb3NzaWJsZSB0aGF0IHRoZSB0cmFuc2xhdGlvbiBjb3VsZCBiZSBkb25lIGJ5CiAgICAgICAqIHZhcmlvdXMgdGFibGVzIGFzIGl0IGlzIGRvbmUgaW4gTENNYXBTdHJpbmdBKCkuICBIb3dldmVyLCBJJ20KICAgICAgICogbm90IHN1cmUgd2hhdCB0aG9zZSB0YWJsZXMgYXJlLiAqLwogICAgICByZXR1cm5lZF9sZW4gPSBzdHJ4ZnJtKGRzdF9uYXRpdmUsIHNyY19uYXRpdmUsIGRzdF9uYXRpdmVfbGVuKSArIDE7CiAgICAgIAogICAgICBpZihyZXR1cm5lZF9sZW4gPiBkc3RfbmF0aXZlX2xlbikKICAgICAgewogICAgICAgICAgZHN0X25hdGl2ZVtkc3RfbmF0aXZlX2xlbiAtIDFdID0gMDsKICAgICAgICAgIEVSUigic3RyeGZybSByZXR1cm5lZCBhIHN0cmluZyAoJXMpIHRoYXQgd2FzIGxvbmdlciAoJWQgYnl0ZXMpICIgCiAgICAgICAgICAgICAgInRoYW4gZXhwZWN0ZWQgKCVkIGJ5dGVzKS5cbiIsIGRzdF9uYXRpdmUsIHJldHVybmVkX2xlbiwKICAgICAgICAgICAgICBkc3RfbmF0aXZlX2xlbik7CgogICAgICAgICAgLyogU2luY2UgdGhpcyBpcyBhbiBpbnRlcm5hbCBlcnJvciBJJ20gbm90IHN1cmUgd2hhdCB0aGUgY29ycmVjdAogICAgICAgICAgICogZXJyb3IgY29kZSBpcy4gICovCiAgICAgICAgICBTZXRMYXN0RXJyb3IoRVJST1JfTk9UX0VOT1VHSF9NRU1PUlkpOwoKICAgICAgICAgIGlmKHNyY3N0cl9saWJjKSBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBzcmNzdHJfbGliYyk7CiAgICAgICAgICBpZihzcmNfbmF0aXZlKSBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBzcmNfbmF0aXZlKTsKICAgICAgICAgIGlmKGRzdF9uYXRpdmUpIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIGRzdF9uYXRpdmUpOwogICAgICAgICAgc2V0bG9jYWxlKExDX0NPTExBVEUsIGxjX2NvbGxhdGVfZGVmYXVsdCk7CiAgICAgICAgICByZXR1cm4gMDsKICAgICAgfQogICAgICBkc3RfbmF0aXZlX2xlbiA9IHJldHVybmVkX2xlbjsKICAgICAgCiAgICAgIFRSQUNFKCJkc3RfbmF0aXZlID0gJXMgIGRzdF9uYXRpdmVfbGVuID0gJWRcbiIsCiAgICAgICAgICAgICBkc3RfbmF0aXZlLCBkc3RfbmF0aXZlX2xlbik7CgogICAgICBkc3RzdHJfbGliY19sZW4gPSBkc3RfbmF0aXZlX2xlbjsKICAgICAgaWYoIShkc3RzdHJfbGliYyA9ICh3Y2hhcl90ICopSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdHN0cl9saWJjX2xlbiAqIHNpemVvZih3Y2hhcl90KSkpKQogICAgICB7CiAgICAgICAgICBFUlIoIlVuYWJsZSB0byBhbGxvY2F0ZSAlZCBieXRlcyBmb3IgZHN0c3RyX2xpYmNcbiIsCiAgICAgICAgICAgICAgZHN0c3RyX2xpYmNfbGVuICogc2l6ZW9mKHdjaGFyX3QpKTsKICAgICAgICAgIFNldExhc3RFcnJvcihFUlJPUl9OT1RfRU5PVUdIX01FTU9SWSk7CiAgICAgICAgICBpZihzcmNzdHJfbGliYykgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc3Jjc3RyX2xpYmMpOwogICAgICAgICAgaWYoc3JjX25hdGl2ZSkgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc3JjX25hdGl2ZSk7CiAgICAgICAgICBpZihkc3RfbmF0aXZlKSBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBkc3RfbmF0aXZlKTsKICAgICAgICAgIHNldGxvY2FsZShMQ19DT0xMQVRFLCBsY19jb2xsYXRlX2RlZmF1bHQpOwogICAgICAgICAgcmV0dXJuIDA7CiAgICAgIH0KCiAgICAgIC8qIENvbnZlcnQgdGhlIG5hdGl2ZSBtdWx0aWJ5dGUgc3RyaW5nIHRvIGEgbGliYyBVbmljb2RlIHN0cmluZy4gKi8KICAgICAgcmV0dXJuZWRfbGVuID0gbWJzdG93Y3MoZHN0c3RyX2xpYmMsIGRzdF9uYXRpdmUsIGRzdF9uYXRpdmVfbGVuKSArIDE7CgogICAgICAvKiBSZXN0b3JlIExDX0NPTExBVEUgbm93IHRoYXQgdGhlIGxhc3QgTENfQ09MTEFURSBzZW5zaXRpdmUKICAgICAgICogZnVuY3Rpb24gaGFzIHJldHVybmVkLiAqLwogICAgICBzZXRsb2NhbGUoTENfQ09MTEFURSwgbGNfY29sbGF0ZV9kZWZhdWx0KTsgCgogICAgICBpZihyZXR1cm5lZF9sZW4gPT0gMCkKICAgICAgewogICAgICAgICAgRVJSKCJtYnN0b3djcyBmYWlsZWQuICBUaGUgbmF0aXZlIHZlcnNpb24gb2YgdGhlIHRyYW5zbGF0ZWQgc3RyaW5nICIKICAgICAgICAgICAgICAiKCVzKSBtYXkgY29udGFpbiBhbiBpbnZhbGlkIGNoYXJhY3Rlci5cbiIsIGRzdF9uYXRpdmUpOwogICAgICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKICAgICAgICAgIGlmKHNyY3N0cl9saWJjKSBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBzcmNzdHJfbGliYyk7CiAgICAgICAgICBpZihzcmNfbmF0aXZlKSBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBzcmNfbmF0aXZlKTsKICAgICAgICAgIGlmKGRzdF9uYXRpdmUpIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIGRzdF9uYXRpdmUpOwogICAgICAgICAgaWYoZHN0c3RyX2xpYmMpIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIGRzdHN0cl9saWJjKTsKICAgICAgICAgIHJldHVybiAwOwogICAgICB9CiAgICAgIGlmKGRzdGxlbikKICAgICAgewogICAgICAgICAgaWYocmV0dXJuZWRfbGVuID4gZHN0bGVuKQogICAgICAgICAgewogICAgICAgICAgICAgIEVSUigibWJzdG93Y3MgcmV0dXJuZWQgYSBzdHJpbmcgdGhhdCB3YXMgbG9uZ2VyICglZCBjaGFycykgIiAKICAgICAgICAgICAgICAgICAgInRoYW4gdGhlIGJ1ZmZlciBwcm92aWRlZCAoJWQgY2hhcnMpLlxuIiwgcmV0dXJuZWRfbGVuLAogICAgICAgICAgICAgICAgICBkc3RsZW4pOwogICAgICAgICAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlNVRkZJQ0lFTlRfQlVGRkVSKTsKICAgICAgICAgICAgICBpZihzcmNzdHJfbGliYykgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc3Jjc3RyX2xpYmMpOwogICAgICAgICAgICAgIGlmKHNyY19uYXRpdmUpIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIHNyY19uYXRpdmUpOwogICAgICAgICAgICAgIGlmKGRzdF9uYXRpdmUpIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIGRzdF9uYXRpdmUpOwogICAgICAgICAgICAgIGlmKGRzdHN0cl9saWJjKSBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBkc3RzdHJfbGliYyk7CiAgICAgICAgICAgICAgcmV0dXJuIDA7ICAgICAgICAgIAogICAgICAgICAgfQogICAgICAgICAgZHN0bGVuID0gcmV0dXJuZWRfbGVuOwoKICAgICAgICAgIC8qIENvbnZlcnQgYSBsaWJjIFVuaWNvZGUgc3RyaW5nIHRvIHRoZSBkZXN0aW5hdGlvbiBzdHJpbmcuICovCiAgICAgICAgICBmb3Ioc3RyX2lkeCA9IDA7IHN0cl9pZHggPCBkc3RsZW47IHN0cl9pZHgrKykKICAgICAgICAgIHsKICAgICAgICAgICAgICBkc3RzdHJbc3RyX2lkeF0gPSBkc3RzdHJfbGliY1tzdHJfaWR4XTsKICAgICAgICAgIH0KICAgICAgICAgIFRSQUNFKCIxc3QgNCBpbnQgc2l6ZWQgY2h1bmtzIG9mIGRzdHN0ciA9ICV4ICV4ICV4ICV4XG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgKigoKGludCAqKWRzdHN0cikgKyAwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICooKChpbnQgKilkc3RzdHIpICsgMSksCiAgICAgICAgICAgICAgICAgICAgICAgICAqKCgoaW50ICopZHN0c3RyKSArIDIpLAogICAgICAgICAgICAgICAgICAgICAgICAgKigoKGludCAqKWRzdHN0cikgKyAzKSk7CiAgICAgIH0KICAgICAgZWxzZQogICAgICB7CiAgICAgICAgICBkc3RsZW4gPSByZXR1cm5lZF9sZW47CiAgICAgIH0KICAgICAgVFJBQ0UoImRzdGxlbiAocmV0dXJuKSA9ICVkXG4iLCBkc3RsZW4pOwogICAgICBpZihzcmNzdHJfbGliYykgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc3Jjc3RyX2xpYmMpOwogICAgICBpZihzcmNfbmF0aXZlKSBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBzcmNfbmF0aXZlKTsKICAgICAgaWYoZHN0X25hdGl2ZSkgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgZHN0X25hdGl2ZSk7CiAgICAgIGlmKGRzdHN0cl9saWJjKSBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBkc3RzdHJfbGliYyk7CiAgICAgIHJldHVybiBkc3RsZW47CiAgfQogIGVsc2UKICB7CiAgICBpbnQgKCpmKShpbnQpPWlkZW50aXR5OyAKCiAgICBpZiAoZHN0bGVuPT0wKQogICAgICAgIHJldHVybiBzcmNsZW47ICAKICAgIGlmIChkc3RsZW48c3JjbGVuKSAKICAgIHsKICAgICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUik7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgaWYgKG1hcGZsYWdzICYgTENNQVBfVVBQRVJDQVNFKQogICAgICBmID0gdG91cHBlcjsKICAgIGVsc2UgaWYgKG1hcGZsYWdzICYgTENNQVBfTE9XRVJDQVNFKQogICAgICBmID0gdG9sb3dlcjsKICAgIGZvciAoaT0wOyBpIDwgc3JjbGVuOyBpKyspCiAgICAgIGRzdHN0cltpXSA9IChXQ0hBUikgZihzcmNzdHJbaV0pOwogICAgcmV0dXJuIHNyY2xlbjsKICB9Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIE9MRTJOTFNfRXN0aW1hdGVNYXBwaW5nTGVuZ3RoCiAqCiAqIEVzdGltYXRlcyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgcmVxdWlyZWQgdG8gaG9sZCB0aGUgc3RyaW5nCiAqIGNvbXB1dGVkIGJ5IExDTWFwU3RyaW5nQS4KICoKICogVGhlIHNpemUgaXMgYWx3YXlzIG92ZXItZXN0aW1hdGVkLCB3aXRoIGEgZml4ZWQgbGltaXQgb24gdGhlCiAqIGFtb3VudCBvZiBlc3RpbWF0aW9uIGVycm9yLgogKgogKiBOb3RlIHRoYXQgbGVuID09IC0xIGlzIG5vdCBwZXJtaXR0ZWQuCiAqLwpzdGF0aWMgaW5saW5lIGludCBPTEUyTkxTX0VzdGltYXRlTWFwcGluZ0xlbmd0aChMQ0lEIGxjaWQsIERXT1JEIGR3TWFwRmxhZ3MsCgkJCQkJCUxQQ1NUUiBzdHIsIERXT1JEIGxlbikKewogICAgLyogRXN0aW1hdGUgb25seSBmb3Igc21hbGwgc3RyaW5ncyB0byBrZWVwIHRoZSBlc3RpbWF0aW9uIGVycm9yIGZyb20KICAgICAqIGJlY29taW5nIHRvbyBsYXJnZS4gKi8KICAgIGlmIChsZW4gPCAxMjgpIHJldHVybiBsZW4gKiA4ICsgNTsKICAgIGVsc2UgcmV0dXJuIExDTWFwU3RyaW5nQShsY2lkLCBkd01hcEZsYWdzLCBzdHIsIGxlbiwgTlVMTCwgMCk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUNvbXBhcmVTdHJpbmdBCVtLRVJORUwzMi4xNDNdCiAqIENvbXBhcmVzIHR3byBzdHJpbmdzIHVzaW5nIGxvY2FsZQogKgogKiBSRVRVUk5TCiAqCiAqIHN1Y2Nlc3M6IENTVFJfTEVTU19USEFOLCBDU1RSX0VRVUFMLCBDU1RSX0dSRUFURVJfVEhBTgogKiBmYWlsdXJlOiAwCiAqCiAqIE5PVEVTCiAqCiAqIERlZmF1bHRzIHRvIGEgd29yZCBzb3J0LCBidXQgdXNlcyBhIHN0cmluZyBzb3J0IGlmCiAqIFNPUlRfU1RSSU5HU09SVCBpcyBzZXQuCiAqIENhbGxzIFNldExhc3RFcnJvciBmb3IgRVJST1JfSU5WQUxJRF9GTEFHUywgRVJST1JfSU5WQUxJRF9QQVJBTUVURVIuCiAqIAogKiBCVUdTCiAqCiAqIFRoaXMgaW1wbGVtZW50YXRpb24gaWdub3JlcyB0aGUgbG9jYWxlCiAqCiAqIEZJWE1FCiAqIAogKiBRdWl0ZSBpbmVmZmljaWVudC4KICovClVJTlQgV0lOQVBJIENvbXBhcmVTdHJpbmdBKAogICAgRFdPUkQgbGNpZCwgICAgIC8qIFtpbl0gbG9jYWxlIElEICovCiAgICBEV09SRCBmZHdTdHlsZSwgLyogW2luXSBjb21wYXJpc29uLXN0eWxlIG9wdGlvbnMgKi8KICAgIExQQ1NUUiBzMSwgICAgICAvKiBbaW5dIGZpcnN0IHN0cmluZyAqLwogICAgRFdPUkQgbDEsICAgICAgIC8qIFtpbl0gbGVuZ3RoIG9mIGZpcnN0IHN0cmluZyAqLwogICAgTFBDU1RSIHMyLCAgICAgIC8qIFtpbl0gc2Vjb25kIHN0cmluZyAqLwogICAgRFdPUkQgbDIpICAgICAgIC8qIFtpbl0gbGVuZ3RoIG9mIHNlY29uZCBzdHJpbmcgKi8KewogIGludCBtYXBzdHJpbmdfZmxhZ3M7CiAgaW50IGxlbjEsbGVuMjsKICBpbnQgcmVzdWx0OwogIExQU1RSIHNrMSxzazI7CiAgVFJBQ0UoIiVzIGFuZCAlc1xuIiwKCWRlYnVnc3RyX2EgKHMxKSwgZGVidWdzdHJfYSAoczIpKTsKCiAgaWYgKCAoczE9PU5VTEwpIHx8IChzMj09TlVMTCkgKQogIHsgICAgCiAgICBFUlIoIihzMT0lcyxzMj0lcyk6IEludmFsaWQgTlVMTCBzdHJpbmdcbiIsIHMxLCBzMik7CiAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwogICAgcmV0dXJuIDA7CiAgfQoKICBpZihmZHdTdHlsZSAmIE5PUk1fSUdOT1JFU1lNQk9MUykKICAgIEZJWE1FKCJJR05PUkVTWU1CT0xTIG5vdCBzdXBwb3J0ZWRcbiIpOwoKICBpZiAobDEgPT0gLTEpIGwxID0gc3RybGVuKHMxKTsKICBpZiAobDIgPT0gLTEpIGwyID0gc3RybGVuKHMyKTsKICAJCiAgbWFwc3RyaW5nX2ZsYWdzID0gTENNQVBfU09SVEtFWSB8IGZkd1N0eWxlIDsKICBsZW4xID0gT0xFMk5MU19Fc3RpbWF0ZU1hcHBpbmdMZW5ndGgobGNpZCwgbWFwc3RyaW5nX2ZsYWdzLCBzMSwgbDEpOwogIGxlbjIgPSBPTEUyTkxTX0VzdGltYXRlTWFwcGluZ0xlbmd0aChsY2lkLCBtYXBzdHJpbmdfZmxhZ3MsIHMyLCBsMik7CgogIGlmICgobGVuMT09MCl8fChsZW4yPT0wKSkKICAgIHJldHVybiAwOyAgICAgLyogc29tZXRoaW5nIHdyb25nIGhhcHBlbmVkICovCgogIHNrMSA9IChMUFNUUilIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgbGVuMSArIGxlbjIpOwogIHNrMiA9IHNrMSArIGxlbjE7CiAgaWYgKCAoIUxDTWFwU3RyaW5nQShsY2lkLG1hcHN0cmluZ19mbGFncyxzMSxsMSxzazEsbGVuMSkpCgkgfHwgKCFMQ01hcFN0cmluZ0EobGNpZCxtYXBzdHJpbmdfZmxhZ3MsczIsbDIsc2syLGxlbjIpKSApCiAgewogICAgRVJSKCJCdWcgaW4gTENtYXBTdHJpbmdBLlxuIik7CiAgICByZXN1bHQgPSAwOwogIH0KICBlbHNlCiAgewogICAgLyogc3RyY21wIGRvZXNuJ3QgbmVjZXNzYXJpbHkgcmV0dXJuIC0xLCAwLCBvciAxICovCiAgICByZXN1bHQgPSBzdHJjbXAoc2sxLHNrMik7CiAgfQogIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksMCxzazEpOwoKICBpZiAocmVzdWx0IDwgMCkKICAgIHJldHVybiAxOwogIGlmIChyZXN1bHQgPT0gMCkKICAgIHJldHVybiAyOwoKICAvKiBtdXN0IGJlIGdyZWF0ZXIsIGlmIHdlIHJlYWNoIHRoaXMgcG9pbnQgKi8KICByZXR1cm4gMzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQ29tcGFyZVN0cmluZ1cJW0tFUk5FTDMyLjE0NF0KICogVGhpcyBpbXBsZW1lbnRhdGlvbiBpZ25vcmVzIHRoZSBsb2NhbGUKICogRklYTUUgOiAgRG9lcyBvbmx5IHN0cmluZyBzb3J0LiAgU2hvdWxkCiAqIGJlIHJlaW1wbGVtZW50ZWQgdGhlIHNhbWUgd2F5IGFzIENvbXBhcmVTdHJpbmdBLgogKi8KVUlOVCBXSU5BUEkgQ29tcGFyZVN0cmluZ1coRFdPUkQgbGNpZCwgRFdPUkQgZmR3U3R5bGUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBDV1NUUiBzMSwgRFdPUkQgbDEsIExQQ1dTVFIgczIsRFdPUkQgbDIpCnsKCWludCBsZW4scmV0OwoJaWYoZmR3U3R5bGUgJiBOT1JNX0lHTk9SRU5PTlNQQUNFKQoJCUZJWE1FKCJJR05PUkVOT05TUEFDRSBub3Qgc3VwcHJ0ZWRcbiIpOwoJaWYoZmR3U3R5bGUgJiBOT1JNX0lHTk9SRVNZTUJPTFMpCgkJRklYTUUoIklHTk9SRVNZTUJPTFMgbm90IHN1cHBvcnRlZFxuIik7CgoJLyogSXMgc3RyY21wIGRlZmF1bHRpbmcgdG8gc3RyaW5nIHNvcnQgb3IgdG8gd29yZCBzb3J0Pz8gKi8KCS8qIEZJWE1FOiBIYW5kbGUgTk9STV9TVFJJTkdTT1JUICovCglsMSA9IChsMT09LTEpP3N0cmxlblcoczEpOmwxOwoJbDIgPSAobDI9PS0xKT9zdHJsZW5XKHMyKTpsMjsKCWxlbiA9IGwxPGwyID8gbDE6bDI7CglyZXQgPSAoZmR3U3R5bGUgJiBOT1JNX0lHTk9SRUNBU0UpID8gc3RybmNtcGlXKHMxLHMyLGxlbikgOiBzdHJuY21wVyhzMSxzMixsZW4pOwoJLyogbm90IGVxdWFsLCByZXR1cm4gMSBvciAzICovCglpZihyZXQhPTApIHsKCQkvKiBuZWVkIHRvIHRyYW5zbGF0ZSByZXN1bHQgKi8KCQlyZXR1cm4gKChpbnQpcmV0IDwgMCkgPyAxIDogMzsKCX0KCS8qIHNhbWUgbGVuLCByZXR1cm4gMiAqLwoJaWYobDE9PWwyKSByZXR1cm4gMjsKCS8qIHRoZSBsb25nZXIgb25lIGlzIGxleGljYWxseSBncmVhdGVyICovCglyZXR1cm4gKGwxPGwyKT8gMSA6IDM7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCU9MRV9HZXRGb3JtYXRBCVtJbnRlcm5hbF0KICoKICogRklYTUUKICogICAgSWYgZGF0ZWxlbiA9PSAwLCBpdCBzaG91bGQgcmV0dXJuIHRoZSByZWd1aXJlZCBzdHJpbmcgbGVuZ3RoLgogKgogVGhpcyBmdW5jdGlvbiBpbXBsZW1lbnRzIHN0dWZmIGZvciBHZXREYXRlRm9ybWF0KCkgYW5kIAogR2V0VGltZUZvcm1hdCgpLgoKICBkICAgIHNpbmdsZS1kaWdpdCAobm8gbGVhZGluZyB6ZXJvKSBkYXkgKG9mIG1vbnRoKQogIGRkICAgdHdvLWRpZ2l0IGRheSAob2YgbW9udGgpCiAgZGRkICBzaG9ydCBkYXktb2Ytd2VlayBuYW1lCiAgZGRkZCBsb25nIGRheS1vZi13ZWVrIG5hbWUKICBNICAgIHNpbmdsZS1kaWdpdCBtb250aAogIE1NICAgdHdvLWRpZ2l0IG1vbnRoCiAgTU1NICBzaG9ydCBtb250aCBuYW1lCiAgTU1NTSBmdWxsIG1vbnRoIG5hbWUKICB5ICAgIHR3by1kaWdpdCB5ZWFyLCBubyBsZWFkaW5nIDAKICB5eSAgIHR3by1kaWdpdCB5ZWFyCiAgeXl5eSBmb3VyLWRpZ2l0IHllYXIKICBnZyAgIGVyYSBzdHJpbmcKICBoICAgIGhvdXJzIHdpdGggbm8gbGVhZGluZyB6ZXJvICgxMi1ob3VyKQogIGhoICAgaG91cnMgd2l0aCBmdWxsIHR3byBkaWdpdHMKICBIICAgIGhvdXJzIHdpdGggbm8gbGVhZGluZyB6ZXJvICgyNC1ob3VyKQogIEhIICAgaG91cnMgd2l0aCBmdWxsIHR3byBkaWdpdHMKICBtICAgIG1pbnV0ZXMgd2l0aCBubyBsZWFkaW5nIHplcm8KICBtbSAgIG1pbnV0ZXMgd2l0aCBmdWxsIHR3byBkaWdpdHMKICBzICAgIHNlY29uZHMgd2l0aCBubyBsZWFkaW5nIHplcm8KICBzcyAgIHNlY29uZHMgd2l0aCBmdWxsIHR3byBkaWdpdHMKICB0ICAgIHRpbWUgbWFya2VyIChBIG9yIFApCiAgdHQgICB0aW1lIG1hcmtlciAoQU0sIFBNKQogICcnICAgdXNlZCB0byBxdW90ZSBsaXRlcmFsIGNoYXJhY3RlcnMKICAnJyAgICh3aXRoaW4gYSBxdW90ZWQgc3RyaW5nKSBpbmRpY2F0ZXMgYSBsaXRlcmFsICcKCiBUaGVzZSBmdW5jdGlvbnMgUkVRVUlSRSB2YWxpZCBsb2NhbGUsIGRhdGUsICBhbmQgZm9ybWF0LiAKICovCnN0YXRpYyBJTlQgT0xFX0dldEZvcm1hdEEoTENJRCBsb2NhbGUsCgkJCSAgICBEV09SRCBmbGFncywKCQkJICAgIERXT1JEIHRmbGFncywKCQkJICAgIExQU1lTVEVNVElNRSB4dGltZSwKCQkJICAgIExQQ1NUUiBfZm9ybWF0LCAJLyppbiovCgkJCSAgICBMUFNUUiBkYXRlLAkJLypvdXQqLwoJCQkgICAgSU5UIGRhdGVsZW4pCnsKICAgSU5UIGlucG9zLCBvdXRwb3M7CiAgIGludCBjb3VudCwgdHlwZSwgaW5xdW90ZSwgT3ZlcmZsb3c7CiAgIGNoYXIgYnVmWzQwXTsKICAgY2hhciBmb3JtYXRbNDBdOwogICBjaGFyICogcG9zOwogICBpbnQgYnVmbGVuOwoKICAgY29uc3QgY2hhciAqIF9kZ2ZtdFtdID0geyAiJWQiLCAiJTAyZCIgfTsKICAgY29uc3QgY2hhciAqKiBkZ2ZtdCA9IF9kZ2ZtdCAtIDE7IAoKICAgLyogcmVwb3J0LCBmb3IgZGVidWdnaW5nICovCiAgIFRSQUNFKCIoMHglbHgsMHglbHgsIDB4JWx4LCB0aW1lKHk9JWQgbT0lZCB3ZD0lZCBkPSVkLGg9JWQsbT0lZCxzPSVkKSwgZm10PSVwIFwnJXNcJyAsICVwLCBsZW49JWQpXG4iLAogICAJIGxvY2FsZSwgZmxhZ3MsIHRmbGFncywKCSB4dGltZS0+d1llYXIseHRpbWUtPndNb250aCx4dGltZS0+d0RheU9mV2Vlayx4dGltZS0+d0RheSwgeHRpbWUtPndIb3VyLCB4dGltZS0+d01pbnV0ZSwgeHRpbWUtPndTZWNvbmQsCgkgX2Zvcm1hdCwgX2Zvcm1hdCwgZGF0ZSwgZGF0ZWxlbik7CiAgCiAgIGlmKGRhdGVsZW4gPT0gMCkgewogICAgIEZJWE1FKCJkYXRlbGVuID0gMCwgcmV0dXJuaW5nIDI1NVxuIik7CiAgICAgcmV0dXJuIDI1NTsKICAgfQoKICAgLyogaW5pdGFsaXplIHN0YXRlIHZhcmlhYmxlcyBhbmQgb3V0cHV0IGJ1ZmZlciAqLwogICBpbnBvcyA9IG91dHBvcyA9IDA7CiAgIGNvdW50ID0gMDsgaW5xdW90ZSA9IDA7IE92ZXJmbG93ID0gMDsKICAgdHlwZSA9ICdcMCc7CiAgIGRhdGVbMF0gPSBidWZbMF0gPSAnXDAnOwogICAgICAKICAgc3RyY3B5KGZvcm1hdCxfZm9ybWF0KTsKCiAgIC8qIGFsdGVyIHRoZSBmb3JtYXRzdHJpbmcsIHdoaWxlIGl0IHdvcmtzIGZvciBhbGwgbGFuZ3VhZ2VzIG5vdyBpbiB3aW5lCiAgIGl0cyBwb3NzaWJsZSB0aGF0IGl0IGZhaWxzIHdoZW4gdGhlIHRpbWUgbG9va3MgbGlrZSBzczptbTpoaCBhcyBleGFtcGxlKi8gICAKICAgaWYgKHRmbGFncyAmIChUSU1FX05PTUlOVVRFU09SU0VDT05EUykpCiAgIHsgaWYgKChwb3MgPSBzdHJzdHIgKCBmb3JtYXQsICI6bW0iKSkpCiAgICAgeyBtZW1jcHkgKCBwb3MsIHBvcyszLCBzdHJsZW4oZm9ybWF0KS0ocG9zLWZvcm1hdCktMiApOwogICAgIH0KICAgfQogICBpZiAodGZsYWdzICYgKFRJTUVfTk9TRUNPTkRTKSkKICAgeyBpZiAoKHBvcyA9IHN0cnN0ciAoIGZvcm1hdCwgIjpzcyIpKSkKICAgICB7IG1lbWNweSAoIHBvcywgcG9zKzMsIHN0cmxlbihmb3JtYXQpLShwb3MtZm9ybWF0KS0yICk7CiAgICAgfQogICB9CiAgIAogICBmb3IgKGlucG9zID0gMDs7IGlucG9zKyspIHsKICAgICAgLyogVFJBQ0UoIlNUQVRFIGlucG9zPSUyZCBvdXRwb3M9JTJkIGNvdW50PSVkIGlucXVvdGU9JWQgdHlwZT0lYyBidWYsZGF0ZSA9ICVjLCVjXG4iLCBpbnBvcywgb3V0cG9zLCBjb3VudCwgaW5xdW90ZSwgdHlwZSwgYnVmW2lucG9zXSwgZGF0ZVtvdXRwb3NdKTsgKi8KICAgICAgaWYgKGlucXVvdGUpIHsKCSBpZiAoZm9ybWF0W2lucG9zXSA9PSAnXCcnKSB7CgkgICAgaWYgKGZvcm1hdFtpbnBvcysxXSA9PSAnXCcnKSB7CgkgICAgICAgaW5wb3MgKz0gMTsKCSAgICAgICBkYXRlW291dHBvcysrXSA9ICdcJyc7CgkgICAgfSBlbHNlIHsKCSAgICAgICBpbnF1b3RlID0gMDsKCSAgICAgICBjb250aW51ZTsgLyogd2UgZGlkIG5vdGhpbmcgdG8gdGhlIG91dHB1dCAqLwoJICAgIH0KCSB9IGVsc2UgaWYgKGZvcm1hdFtpbnBvc10gPT0gJ1wwJykgewoJICAgIGRhdGVbb3V0cG9zKytdID0gJ1wwJzsKCSAgICBpZiAob3V0cG9zID4gZGF0ZWxlbikgT3ZlcmZsb3cgPSAxOwoJICAgIGJyZWFrOwoJIH0gZWxzZSB7CgkgICAgZGF0ZVtvdXRwb3MrK10gPSBmb3JtYXRbaW5wb3NdOwoJICAgIGlmIChvdXRwb3MgPiBkYXRlbGVuKSB7CgkgICAgICAgT3ZlcmZsb3cgPSAxOwoJICAgICAgIGRhdGVbb3V0cG9zLTFdID0gJ1wwJzsgLyogdGhpcyBpcyB0aGUgbGFzdCBwbGFjZSB3aGVyZQoJCQkJCSBpdCdzIHNhZmUgdG8gd3JpdGUgKi8KCSAgICAgICBicmVhazsKCSAgICB9CgkgfQogICAgICB9IGVsc2UgaWYgKCAgKGNvdW50ICYmIChmb3JtYXRbaW5wb3NdICE9IHR5cGUpKQoJCSAgIHx8IGNvdW50ID09IDQKCQkgICB8fCAoY291bnQgPT0gMiAmJiBzdHJjaHIoImdoSG1zdCIsIHR5cGUpKSApCiAgICAgICB7CgkgICAgaWYgICAgICAgICAodHlwZSA9PSAnZCcpIHsKCSAgICAgICBpZiAgICAgICAgKGNvdW50ID09IDQpIHsKCQkgIEdldExvY2FsZUluZm9BKGxvY2FsZSwKCQkJCSAgIExPQ0FMRV9TREFZTkFNRTEKCQkJCSAgICsgKHh0aW1lLT53RGF5T2ZXZWVrKzYpJTcsCgkJCQkgICBidWYsIHNpemVvZihidWYpKTsKCSAgICAgICB9IGVsc2UgaWYgKGNvdW50ID09IDMpIHsKCQkJICAgR2V0TG9jYWxlSW5mb0EobG9jYWxlLCAKCQkJCQkgICAgTE9DQUxFX1NBQkJSRVZEQVlOQU1FMSAKCQkJCQkgICAgKyAoeHRpbWUtPndEYXlPZldlZWsrNiklNywKCQkJCQkgICAgYnVmLCBzaXplb2YoYnVmKSk7CgkJICAgICAgfSBlbHNlIHsKCQkgIHNwcmludGYoYnVmLCBkZ2ZtdFtjb3VudF0sIHh0aW1lLT53RGF5KTsKCSAgICAgICB9CgkgICAgfSBlbHNlIGlmICh0eXBlID09ICdNJykgewoJICAgICAgIGlmIChjb3VudCA9PSAzKSB7CgkJICBHZXRMb2NhbGVJbmZvQShsb2NhbGUsIAoJCQkJICAgTE9DQUxFX1NBQkJSRVZNT05USE5BTUUxCgkJCQkgICArIHh0aW1lLT53TW9udGggLSAxLAoJCQkJICAgYnVmLCBzaXplb2YoYnVmKSk7CgkgICAgICAgfSBlbHNlIGlmIChjb3VudCA9PSA0KSB7CgkJICBHZXRMb2NhbGVJbmZvQShsb2NhbGUsCgkJCQkgICBMT0NBTEVfU01PTlRITkFNRTEKCQkJCSAgICsgeHRpbWUtPndNb250aCAtIDEsCgkJCQkgICBidWYsIHNpemVvZihidWYpKTsKCQkgfSBlbHNlIHsKCQkgIHNwcmludGYoYnVmLCBkZ2ZtdFtjb3VudF0sIHh0aW1lLT53TW9udGgpOwoJICAgICAgIH0KCSAgICB9IGVsc2UgaWYgKHR5cGUgPT0gJ3knKSB7CgkgICAgICAgaWYgKGNvdW50ID09IDQpIHsKCQkgICAgICBzcHJpbnRmKGJ1ZiwgIiVkIiwgeHRpbWUtPndZZWFyKTsKCSAgICAgICB9IGVsc2UgaWYgKGNvdW50ID09IDMpIHsKCQkgIHN0cmNweShidWYsICJ5eXkiKTsKCQkgIFdBUk4oInVua25vd24gZm9ybWF0LCBjPSVjLCBuPSVkXG4iLCAgdHlwZSwgY291bnQpOwoJCSB9IGVsc2UgewoJCSAgc3ByaW50ZihidWYsIGRnZm10W2NvdW50XSwgeHRpbWUtPndZZWFyICUgMTAwKTsKCSAgICAgICB9CgkgICAgfSBlbHNlIGlmICh0eXBlID09ICdnJykgewoJICAgICAgIGlmICAgICAgICAoY291bnQgPT0gMikgewoJCSAgRklYTUUoIkxPQ0FMRV9JQ0FMRU5EQVJUWVBFIHVuaW1wLlxuIik7CgkJICBzdHJjcHkoYnVmLCAiQUQiKTsKCSAgICB9IGVsc2UgewoJCSAgc3RyY3B5KGJ1ZiwgImciKTsKCQkgIFdBUk4oInVua25vd24gZm9ybWF0LCBjPSVjLCBuPSVkXG4iLCB0eXBlLCBjb3VudCk7CgkgICAgICAgfQoJICAgIH0gZWxzZSBpZiAodHlwZSA9PSAnaCcpIHsKCSAgICAgICAvKiBnaXZlcyB1cyBob3VycyAxOjAwIC0tIDEyOjAwICovCgkgICAgICAgc3ByaW50ZihidWYsIGRnZm10W2NvdW50XSwgKHh0aW1lLT53SG91ci0xKSUxMiArMSk7CgkgICAgfSBlbHNlIGlmICh0eXBlID09ICdIJykgewoJICAgICAgIC8qIDI0LWhvdXIgdGltZSAqLwoJICAgICAgIHNwcmludGYoYnVmLCBkZ2ZtdFtjb3VudF0sIHh0aW1lLT53SG91cik7CgkgICAgfSBlbHNlIGlmICggdHlwZSA9PSAnbScpIHsKCSAgICAgICBzcHJpbnRmKGJ1ZiwgZGdmbXRbY291bnRdLCB4dGltZS0+d01pbnV0ZSk7CgkgICAgfSBlbHNlIGlmICggdHlwZSA9PSAncycpIHsKCSAgICAgICBzcHJpbnRmKGJ1ZiwgZGdmbXRbY291bnRdLCB4dGltZS0+d1NlY29uZCk7CgkgICAgfSBlbHNlIGlmICh0eXBlID09ICd0JykgewoJICAgICAgIGlmICAgICAgICAoY291bnQgPT0gMSkgewoJCSAgc3ByaW50ZihidWYsICIlYyIsICh4dGltZS0+d0hvdXIgPCAxMikgPyAnQScgOiAnUCcpOwoJICAgICAgIH0gZWxzZSBpZiAoY291bnQgPT0gMikgewoJCSAgLyogc3ByaW50ZihidWYsICIlcyIsICh4dGltZS0+d0hvdXIgPCAxMikgPyAiQU0iIDogIlBNIik7ICovCgkJICBHZXRMb2NhbGVJbmZvQShsb2NhbGUsCgkJCQkgICAoeHRpbWUtPndIb3VyPDEyKSAKCQkJCSAgID8gTE9DQUxFX1MxMTU5IDogTE9DQUxFX1MyMzU5LAoJCQkJICAgYnVmLCBzaXplb2YoYnVmKSk7CgkgICAgICAgfQoJICAgIH07CgoJICAgIC8qIHdlIG5lZWQgdG8gY2hlY2sgdGhlIG5leHQgY2hhciBpbiB0aGUgZm9ybWF0IHN0cmluZyAKCSAgICAgICBhZ2Fpbiwgbm8gbWF0dGVyIHdoYXQgaGFwcGVuZWQgKi8KCSAgICBpbnBvcy0tOwoJICAgIAoJICAgIC8qIGFkZCB0aGUgY29udGVudHMgb2YgYnVmIHRvIHRoZSBvdXRwdXQgKi8KCSAgICBidWZsZW4gPSBzdHJsZW4oYnVmKTsKCSAgICBpZiAob3V0cG9zICsgYnVmbGVuIDwgZGF0ZWxlbikgewoJICAgICAgIGRhdGVbb3V0cG9zXSA9ICdcMCc7IC8qIGZvciBzdHJjYXQgdG8gaG9vayBvbnRvICovCgkJIHN0cmNhdChkYXRlLCBidWYpOwoJICAgICAgIG91dHBvcyArPSBidWZsZW47CgkgICAgfSBlbHNlIHsKCSAgICAgICBkYXRlW291dHBvc10gPSAnXDAnOwoJICAgICAgIHN0cm5jYXQoZGF0ZSwgYnVmLCBkYXRlbGVuIC0gb3V0cG9zKTsKCQkgZGF0ZVtkYXRlbGVuIC0gMV0gPSAnXDAnOwoJCSBTZXRMYXN0RXJyb3IoRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUik7CgkgICAgICAgV0FSTigiaW5zdWZmaWNpZW50IGJ1ZmZlclxuIik7CgkJIHJldHVybiAwOwoJICAgIH0KCgkgICAgLyogcmVzZXQgdGhlIHZhcmlhYmxlcyB3ZSB1c2VkIHRvIGtlZXAgdHJhY2sgb2YgdGhpcyBpdGVtICovCgkgICAgY291bnQgPSAwOwoJICAgIHR5cGUgPSAnXDAnOwoJIH0gZWxzZSBpZiAoZm9ybWF0W2lucG9zXSA9PSAnXDAnKSB7CgkgICAgLyogd2UgY2FuJ3QgY2hlY2sgZm9yIHRoaXMgYXQgdGhlIGxvb3AtaGVhZCwgYmVjYXVzZQoJICAgICAgIHRoYXQgYnJlYWtzIHRoZSBwcmludGluZyBvZiB0aGUgbGFzdCBmb3JtYXQtaXRlbSAqLwoJICAgIGRhdGVbb3V0cG9zXSA9ICdcMCc7CgkgICAgYnJlYWs7CiAgICAgICAgIH0gZWxzZSBpZiAoY291bnQpIHsKCSAgICAvKiBjb250aW51aW5nIGEgY29kZSBmb3IgYW4gaXRlbSAqLwoJICAgIGNvdW50ICs9MTsKCSAgICBjb250aW51ZTsKCSB9IGVsc2UgaWYgKHN0cmNocigiaEhtc3R5TWRnIiwgZm9ybWF0W2lucG9zXSkpIHsKCSAgICB0eXBlID0gZm9ybWF0W2lucG9zXTsKCSAgICBjb3VudCA9IDE7CgkgICAgY29udGludWU7CgkgfSBlbHNlIGlmIChmb3JtYXRbaW5wb3NdID09ICdcJycpIHsKCSAgICBpbnF1b3RlID0gMTsKCSAgICBjb250aW51ZTsKICAgICAgIH0gZWxzZSB7CgkgICAgZGF0ZVtvdXRwb3MrK10gPSBmb3JtYXRbaW5wb3NdOwoJIH0KICAgICAgLyogbm93IGRlYWwgd2l0aCBhIHBvc3NpYmxlIGJ1ZmZlciBvdmVyZmxvdyAqLwogICAgICBpZiAob3V0cG9zID49IGRhdGVsZW4pIHsKICAgICAgIGRhdGVbZGF0ZWxlbiAtIDFdID0gJ1wwJzsKICAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlNVRkZJQ0lFTlRfQlVGRkVSKTsKICAgICAgIHJldHVybiAwOwogICAgICB9CiAgIH0KICAgCiAgIGlmIChPdmVyZmxvdykgewogICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUik7CiAgIH07CgogICAvKiBmaW5pc2ggaXQgb2ZmIHdpdGggYSBzdHJpbmcgdGVybWluYXRvciAqLwogICBvdXRwb3MrKzsKICAgLyogc2FuaXR5IGNoZWNrICovCiAgIGlmIChvdXRwb3MgPiBkYXRlbGVuLTEpIG91dHBvcyA9IGRhdGVsZW4tMTsKICAgZGF0ZVtvdXRwb3NdID0gJ1wwJzsKICAgCiAgIFRSQUNFKCJPTEVfR2V0Rm9ybWF0QSByZXR1cm5zIHN0cmluZyAnJXMnLCBsZW4gJWRcbiIsCgkgICAgICAgZGF0ZSwgb3V0cG9zKTsKICAgcmV0dXJuIG91dHBvczsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBPTEVfR2V0Rm9ybWF0VyBbSU5URVJOQUxdCiAqLwpzdGF0aWMgSU5UIE9MRV9HZXRGb3JtYXRXKExDSUQgbG9jYWxlLCBEV09SRCBmbGFncywgRFdPUkQgdGZsYWdzLAoJCQkgICAgTFBTWVNURU1USU1FIHh0aW1lLAoJCQkgICAgTFBDV1NUUiBmb3JtYXQsCgkJCSAgICBMUFdTVFIgb3V0cHV0LCBJTlQgb3V0bGVuKQp7CiAgIElOVCAgIGlucG9zLCBvdXRwb3M7CiAgIGludCAgICAgY291bnQsIHR5cGU9MCwgaW5xdW90ZTsKICAgaW50ICAgICBPdmVyZmxvdzsgLyogbG9vcCBjaGVjayAqLwogICBjaGFyICAgIHRtcFsxNl07CiAgIFdDSEFSICAgYnVmWzQwXTsKICAgaW50ICAgICBidWZsZW49MDsKICAgV0NIQVIgICBhcmcwW10gPSB7MH0sIGFyZzFbXSA9IHsnJScsJ2QnLDB9OwogICBXQ0hBUiAgIGFyZzJbXSA9IHsnJScsJzAnLCcyJywnZCcsMH07CiAgIFdDSEFSICAqYXJnYXJyWzNdOwogICBpbnQgICAgIGRhdGV2YXJzPTAsIHRpbWV2YXJzPTA7CgogICBhcmdhcnJbMF0gPSBhcmcwOwogICBhcmdhcnJbMV0gPSBhcmcxOwogICBhcmdhcnJbMl0gPSBhcmcyOwoKICAgLyogbWFrZSBhIGRlYnVnIHJlcG9ydCAqLwogICBUUkFDRSgiYXJnczogMHglbHgsIDB4JWx4LCAweCVseCwgdGltZShkPSVkLGg9JWQsbT0lZCxzPSVkKSwgZm10OiVzIChhdCAlcCksICIKICAgCSAgICAgICIlcCB3aXRoIG1heCBsZW4gJWRcbiIsCgkgbG9jYWxlLCBmbGFncywgdGZsYWdzLAoJIHh0aW1lLT53RGF5LCB4dGltZS0+d0hvdXIsIHh0aW1lLT53TWludXRlLCB4dGltZS0+d1NlY29uZCwKCSBkZWJ1Z3N0cl93KGZvcm1hdCksIGZvcm1hdCwgb3V0cHV0LCBvdXRsZW4pOwogICAKICAgaWYob3V0bGVuID09IDApIHsKICAgICBGSVhNRSgib3V0bGVuID0gMCwgcmV0dXJuaW5nIDI1NVxuIik7CiAgICAgcmV0dXJuIDI1NTsKICAgfQoKICAgLyogaW5pdGlhbGl6ZSBzdGF0ZSB2YXJpYWJsZXMgKi8KICAgaW5wb3MgPSBvdXRwb3MgPSAwOwogICBjb3VudCA9IDA7CiAgIGlucXVvdGUgPSBPdmVyZmxvdyA9IDA7CiAgIC8qIHRoaXMgaXMgcmVhbGx5IGp1c3QgYSBzYW5pdHkgY2hlY2sgKi8KICAgb3V0cHV0WzBdID0gYnVmWzBdID0gMDsKICAgCiAgIC8qIHRoaXMgbG9vcCBpcyB0aGUgY29yZSBvZiB0aGUgZnVuY3Rpb24gKi8KICAgZm9yIChpbnBvcyA9IDA7IC8qIHdlIGhhdmUgc2V2ZXJhbCBicmVhayBwb2ludHMgKi8gOyBpbnBvcysrKSB7CiAgICAgIGlmIChpbnF1b3RlKSB7CgkgaWYgKGZvcm1hdFtpbnBvc10gPT0gKFdDSEFSKSAnXCcnKSB7CgkgICAgaWYgKGZvcm1hdFtpbnBvcysxXSA9PSAnXCcnKSB7CgkgICAgICAgaW5wb3MrKzsKCSAgICAgICBvdXRwdXRbb3V0cG9zKytdID0gJ1wnJzsKCSAgICB9IGVsc2UgewoJICAgICAgIGlucXVvdGUgPSAwOwoJICAgICAgIGNvbnRpbnVlOwoJICAgIH0KCSB9IGVsc2UgaWYgKGZvcm1hdFtpbnBvc10gPT0gMCkgewoJICAgIG91dHB1dFtvdXRwb3MrK10gPSAwOwoJICAgIGlmIChvdXRwb3MgPiBvdXRsZW4pIE92ZXJmbG93ID0gMTsKCSAgICBicmVhazsgIC8qICBub3JtYWwgZXhpdCAod2l0aGluIGEgcXVvdGUpICovCgkgfSBlbHNlIHsKCSAgICBvdXRwdXRbb3V0cG9zKytdID0gZm9ybWF0W2lucG9zXTsgLyogY29weSBpbnB1dCAqLwoJICAgIGlmIChvdXRwb3MgPiBvdXRsZW4pIHsKCSAgICAgICBPdmVyZmxvdyA9IDE7CgkgICAgICAgb3V0cHV0W291dHBvcy0xXSA9IDA7IAoJICAgICAgIGJyZWFrOwoJICAgIH0KCSB9CiAgICAgIH0gZWxzZSBpZiAoICAoY291bnQgJiYgKGZvcm1hdFtpbnBvc10gIT0gdHlwZSkpCgkJICAgfHwgKCAoY291bnQ9PTQgJiYgdHlwZSA9PSd5JykgfHwKCQkJKGNvdW50PT00ICYmIHR5cGUgPT0nTScpIHx8CgkJCShjb3VudD09NCAmJiB0eXBlID09J2QnKSB8fAoJCQkoY291bnQ9PTIgJiYgdHlwZSA9PSdnJykgfHwKCQkJKGNvdW50PT0yICYmIHR5cGUgPT0naCcpIHx8CgkJCShjb3VudD09MiAmJiB0eXBlID09J0gnKSB8fAoJCQkoY291bnQ9PTIgJiYgdHlwZSA9PSdtJykgfHwKCQkJKGNvdW50PT0yICYmIHR5cGUgPT0ncycpIHx8CgkJCShjb3VudD09MiAmJiB0eXBlID09J3QnKSApICApIHsKICAgICAgICAgIHN3aXRjaCh0eXBlKQogICAgICAgICAgewogICAgICAgICAgY2FzZSAnZCc6CgkgICAgaWYgICAgICAgIChjb3VudCA9PSA0KSB7CgkgICAgICAgR2V0TG9jYWxlSW5mb1cobG9jYWxlLAoJCQkgICAgIExPQ0FMRV9TREFZTkFNRTEgKyAoeHRpbWUtPndEYXlPZldlZWsgKzYpJTcsCgkJCSAgICAgYnVmLCBzaXplb2YoYnVmKS9zaXplb2YoV0NIQVIpICk7CgkgICAgfSBlbHNlIGlmIChjb3VudCA9PSAzKSB7CgkgICAgICAgR2V0TG9jYWxlSW5mb1cobG9jYWxlLAoJCQkJTE9DQUxFX1NBQkJSRVZEQVlOQU1FMSArCgkJCQkoeHRpbWUtPndEYXlPZldlZWsgKzYpJTcsCgkJCQlidWYsIHNpemVvZihidWYpL3NpemVvZihXQ0hBUikgKTsKCSAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgc3ByaW50ZiggdG1wLCAiJS4qZCIsIGNvdW50LCB4dGltZS0+d0RheSApOwogICAgICAgICAgICAgICAgTXVsdGlCeXRlVG9XaWRlQ2hhciggQ1BfQUNQLCAwLCB0bXAsIC0xLCBidWYsIHNpemVvZihidWYpL3NpemVvZihXQ0hBUikgKTsKCSAgICB9CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgIGNhc2UgJ00nOgoJICAgIGlmICAgICAgICAoY291bnQgPT0gNCkgewoJICAgICAgIEdldExvY2FsZUluZm9XKGxvY2FsZSwgIExPQ0FMRV9TTU9OVEhOQU1FMSArCgkJCQl4dGltZS0+d01vbnRoIC0xLCBidWYsCgkJCQlzaXplb2YoYnVmKS9zaXplb2YoV0NIQVIpICk7CgkgICAgfSBlbHNlIGlmIChjb3VudCA9PSAzKSB7CgkgICAgICAgR2V0TG9jYWxlSW5mb1cobG9jYWxlLCAgTE9DQUxFX1NBQkJSRVZNT05USE5BTUUxICsKCQkJCXh0aW1lLT53TW9udGggLTEsIGJ1ZiwKCQkJCXNpemVvZihidWYpL3NpemVvZihXQ0hBUikgKTsKCSAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgc3ByaW50ZiggdG1wLCAiJS4qZCIsIGNvdW50LCB4dGltZS0+d01vbnRoICk7CiAgICAgICAgICAgICAgICBNdWx0aUJ5dGVUb1dpZGVDaGFyKCBDUF9BQ1AsIDAsIHRtcCwgLTEsIGJ1Ziwgc2l6ZW9mKGJ1Zikvc2l6ZW9mKFdDSEFSKSApOwoJICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICd5JzoKCSAgICBpZiAgICAgICAgKGNvdW50ID09IDQpIHsKICAgICAgICAgICAgICAgIHNwcmludGYoIHRtcCwgIiVkIiwgeHRpbWUtPndZZWFyICk7CgkgICAgfSBlbHNlIGlmIChjb3VudCA9PSAzKSB7CiAgICAgICAgICAgICAgICBzdHJjcHkoIHRtcCwgInl5eSIgKTsKCSAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgc3ByaW50ZiggdG1wLCAiJS4qZCIsIGNvdW50LCB4dGltZS0+d1llYXIgJSAxMDAgKTsKCSAgICB9CiAgICAgICAgICAgIE11bHRpQnl0ZVRvV2lkZUNoYXIoIENQX0FDUCwgMCwgdG1wLCAtMSwgYnVmLCBzaXplb2YoYnVmKS9zaXplb2YoV0NIQVIpICk7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgIGNhc2UgJ2cnOgoJICAgIGlmICAgICAgICAoY291bnQgPT0gMikgewoJICAgICAgIEZJWE1FKCJMT0NBTEVfSUNBTEVOREFSVFlQRSB1bmltcGxlbWVudGVkXG4iKTsKICAgICAgICAgICAgICAgc3RyY3B5KCB0bXAsICJBRCIgKTsKCSAgICB9IGVsc2UgewoJICAgICAgIC8qIFdpbiBBUEkgc2V6IHdlIGNvcHkgaXQgdmVyYmF0aW0gKi8KICAgICAgICAgICAgICAgIHN0cmNweSggdG1wLCAiZyIgKTsKCSAgICB9CiAgICAgICAgICAgIE11bHRpQnl0ZVRvV2lkZUNoYXIoIENQX0FDUCwgMCwgdG1wLCAtMSwgYnVmLCBzaXplb2YoYnVmKS9zaXplb2YoV0NIQVIpICk7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgIGNhc2UgJ2gnOgogICAgICAgICAgICAgIC8qIGhvdXJzIDE6MDAtMTI6MDAgLS0tIGlzIHRoaXMgcmlnaHQ/ICovCiAgICAgICAgICAgICAgc3ByaW50ZiggdG1wLCAiJS4qZCIsIGNvdW50LCAoeHRpbWUtPndIb3VyLTEpJTEyICsxKTsKICAgICAgICAgICAgICBNdWx0aUJ5dGVUb1dpZGVDaGFyKCBDUF9BQ1AsIDAsIHRtcCwgLTEsIGJ1Ziwgc2l6ZW9mKGJ1Zikvc2l6ZW9mKFdDSEFSKSApOwogICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgIGNhc2UgJ0gnOgogICAgICAgICAgICAgIHNwcmludGYoIHRtcCwgIiUuKmQiLCBjb3VudCwgeHRpbWUtPndIb3VyICk7CiAgICAgICAgICAgICAgTXVsdGlCeXRlVG9XaWRlQ2hhciggQ1BfQUNQLCAwLCB0bXAsIC0xLCBidWYsIHNpemVvZihidWYpL3NpemVvZihXQ0hBUikgKTsKICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICBjYXNlICdtJzoKICAgICAgICAgICAgICBzcHJpbnRmKCB0bXAsICIlLipkIiwgY291bnQsIHh0aW1lLT53TWludXRlICk7CiAgICAgICAgICAgICAgTXVsdGlCeXRlVG9XaWRlQ2hhciggQ1BfQUNQLCAwLCB0bXAsIC0xLCBidWYsIHNpemVvZihidWYpL3NpemVvZihXQ0hBUikgKTsKICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICBjYXNlICdzJzoKICAgICAgICAgICAgICBzcHJpbnRmKCB0bXAsICIlLipkIiwgY291bnQsIHh0aW1lLT53U2Vjb25kICk7CiAgICAgICAgICAgICAgTXVsdGlCeXRlVG9XaWRlQ2hhciggQ1BfQUNQLCAwLCB0bXAsIC0xLCBidWYsIHNpemVvZihidWYpL3NpemVvZihXQ0hBUikgKTsKICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICBjYXNlICd0JzoKCSAgICBHZXRMb2NhbGVJbmZvVyhsb2NhbGUsICh4dGltZS0+d0hvdXIgPCAxMikgPwoJCQkgICAgIExPQ0FMRV9TMTE1OSA6IExPQ0FMRV9TMjM1OSwKCQkJICAgICBidWYsIHNpemVvZihidWYpICk7CgkgICAgaWYgICAgICAgIChjb3VudCA9PSAxKSB7CgkgICAgICAgYnVmWzFdID0gMDsKCSAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQoKCSAvKiBubyBtYXR0ZXIgd2hhdCBoYXBwZW5lZCwgIHdlIG5lZWQgdG8gY2hlY2sgdGhpcyBuZXh0IAoJICAgIGNoYXJhY3RlciB0aGUgbmV4dCB0aW1lIHdlIGxvb3AgdGhyb3VnaCAqLwoJIGlucG9zLS07CgoJIC8qIGNhdCBidWYgb250byB0aGUgb3V0cHV0ICovCgkgb3V0bGVuID0gc3RybGVuVyhidWYpOwoJIGlmIChvdXRwb3MgKyBidWZsZW4gPCBvdXRsZW4pIHsKICAgICAgICAgICAgc3RyY3B5Vyggb3V0cHV0ICsgb3V0cG9zLCBidWYgKTsKCSAgICBvdXRwb3MgKz0gYnVmbGVuOwoJIH0gZWxzZSB7CiAgICAgICAgICAgIGxzdHJjcHluVyggb3V0cHV0ICsgb3V0cG9zLCBidWYsIG91dGxlbiAtIG91dHBvcyApOwoJICAgIE92ZXJmbG93ID0gMTsKCSAgICBicmVhazsgLyogQWJub3JtYWwgZXhpdCAqLwoJIH0KCgkgLyogcmVzZXQgdGhlIHZhcmlhYmxlcyB3ZSB1c2VkIHRoaXMgdGltZSAqLwoJIGNvdW50ID0gMDsKCSB0eXBlID0gJ1wwJzsKICAgICAgfSBlbHNlIGlmIChmb3JtYXRbaW5wb3NdID09IDApIHsKCSAvKiB3ZSBjYW4ndCBjaGVjayBmb3IgdGhpcyBhdCB0aGUgYmVnaW5uaW5nLCAgYmVjYXVzZSB0aGF0IAoJIHdvdWxkIGtlZXAgdXMgZnJvbSBwcmludGluZyBhIGZvcm1hdCBzcGVjIHRoYXQgZW5kZWQgdGhlIAoJIHN0cmluZyAqLwoJIG91dHB1dFtvdXRwb3NdID0gMDsKCSBicmVhazsgIC8qICBOT1JNQUwgRVhJVCAgKi8KICAgICAgfSBlbHNlIGlmIChjb3VudCkgewoJIC8qIGhvdyB3ZSBrZWVwIHRyYWNrIG9mIHRoZSBtaWRkbGUgb2YgYSBmb3JtYXQgc3BlYyAqLwoJIGNvdW50Kys7CgkgY29udGludWU7CiAgICAgIH0gZWxzZSBpZiAoIChkYXRldmFycyAmJiAoZm9ybWF0W2lucG9zXT09J2QnIHx8CgkJCQlmb3JtYXRbaW5wb3NdPT0nTScgfHwKCQkJCWZvcm1hdFtpbnBvc109PSd5JyB8fAoJCQkJZm9ybWF0W2lucG9zXT09J2cnKSAgKSB8fAoJCSAgKHRpbWV2YXJzICYmIChmb3JtYXRbaW5wb3NdPT0nSCcgfHwKCQkJCWZvcm1hdFtpbnBvc109PSdoJyB8fAoJCQkJZm9ybWF0W2lucG9zXT09J20nIHx8CgkJCQlmb3JtYXRbaW5wb3NdPT0ncycgfHwKCQkJCWZvcm1hdFtpbnBvc109PSd0JykgKSAgICApIHsKCSB0eXBlID0gZm9ybWF0W2lucG9zXTsKCSBjb3VudCA9IDE7CgkgY29udGludWU7CiAgICAgIH0gZWxzZSBpZiAoZm9ybWF0W2lucG9zXSA9PSAnXCcnKSB7CgkgaW5xdW90ZSA9IDE7CgkgY29udGludWU7CiAgICAgIH0gZWxzZSB7CgkgLyogdW5xdW90ZWQgbGl0ZXJhbHMgKi8KCSBvdXRwdXRbb3V0cG9zKytdID0gZm9ybWF0W2lucG9zXTsKICAgICAgfQogICB9CgogICBpZiAoT3ZlcmZsb3cpIHsKICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOU1VGRklDSUVOVF9CVUZGRVIpOwogICAgICBXQVJOKCIgYnVmZmVyIG92ZXJmbG93XG4iKTsKICAgfTsKCiAgIC8qIGZpbmFsIHN0cmluZyB0ZXJtaW5hdG9yIGFuZCBzYW5pdHkgY2hlY2sgKi8KICAgb3V0cG9zKys7CiAgIGlmIChvdXRwb3MgPiBvdXRsZW4tMSkgb3V0cG9zID0gb3V0bGVuLTE7CiAgIG91dHB1dFtvdXRwb3NdID0gJzAnOwoKICAgVFJBQ0UoIiByZXR1cm5pbmcgJXNcbiIsIGRlYnVnc3RyX3cob3V0cHV0KSk7CgkKICAgcmV0dXJuICghT3ZlcmZsb3cpID8gb3V0bGVuIDogMDsKICAgCn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlHZXREYXRlRm9ybWF0QQlbS0VSTkVMMzIuMzEwXQogKiBNYWtlcyBhbiBBU0NJSSBzdHJpbmcgb2YgdGhlIGRhdGUKICoKICogVGhpcyBmdW5jdGlvbiB1c2VzIGZvcm1hdCB0byBmb3JtYXQgdGhlIGRhdGUsICBvciwgIGlmIGZvcm1hdAogKiBpcyBOVUxMLCB1c2VzIHRoZSBkZWZhdWx0IGZvciB0aGUgbG9jYWxlLiAgZm9ybWF0IGlzIGEgc3RyaW5nCiAqIG9mIGxpdGVyYWwgZmllbGRzIGFuZCBjaGFyYWN0ZXJzIGFzIGZvbGxvd3M6CiAqCiAqIC0gZCAgICBzaW5nbGUtZGlnaXQgKG5vIGxlYWRpbmcgemVybykgZGF5IChvZiBtb250aCkKICogLSBkZCAgIHR3by1kaWdpdCBkYXkgKG9mIG1vbnRoKQogKiAtIGRkZCAgc2hvcnQgZGF5LW9mLXdlZWsgbmFtZQogKiAtIGRkZGQgbG9uZyBkYXktb2Ytd2VlayBuYW1lCiAqIC0gTSAgICBzaW5nbGUtZGlnaXQgbW9udGgKICogLSBNTSAgIHR3by1kaWdpdCBtb250aAogKiAtIE1NTSAgc2hvcnQgbW9udGggbmFtZQogKiAtIE1NTU0gZnVsbCBtb250aCBuYW1lCiAqIC0geSAgICB0d28tZGlnaXQgeWVhciwgbm8gbGVhZGluZyAwCiAqIC0geXkgICB0d28tZGlnaXQgeWVhcgogKiAtIHl5eXkgZm91ci1kaWdpdCB5ZWFyCiAqIC0gZ2cgICBlcmEgc3RyaW5nCiAqCiAqLwpJTlQgV0lOQVBJIEdldERhdGVGb3JtYXRBKExDSUQgbG9jYWxlLERXT1JEIGZsYWdzLAoJCQkgICAgICBMUFNZU1RFTVRJTUUgeHRpbWUsCgkJCSAgICAgIExQQ1NUUiBmb3JtYXQsIExQU1RSIGRhdGUsSU5UIGRhdGVsZW4pIAp7CiAgIAogIGNoYXIgZm9ybWF0X2J1Zls0MF07CiAgTFBDU1RSIHRoaXNmb3JtYXQ7CiAgU1lTVEVNVElNRSB0OwogIExQU1lTVEVNVElNRSB0aGlzdGltZTsKICBMQ0lEIHRoaXNsb2NhbGU7CiAgSU5UIHJldDsKICBGSUxFVElNRSBmdDsKICBCT09MIHJlczsKCiAgVFJBQ0UoIigweCUwNGx4LDB4JTA4bHgsJXAsJXMsJXAsJWQpXG4iLAoJICAgICAgbG9jYWxlLGZsYWdzLHh0aW1lLGZvcm1hdCxkYXRlLGRhdGVsZW4pOwogIAogIGlmICghbG9jYWxlKSB7CiAgICAgbG9jYWxlID0gTE9DQUxFX1NZU1RFTV9ERUZBVUxUOwogICAgIH07CiAgCiAgaWYgKGxvY2FsZSA9PSBMT0NBTEVfU1lTVEVNX0RFRkFVTFQpIHsKICAgICB0aGlzbG9jYWxlID0gR2V0U3lzdGVtRGVmYXVsdExDSUQoKTsKICB9IGVsc2UgaWYgKGxvY2FsZSA9PSBMT0NBTEVfVVNFUl9ERUZBVUxUKSB7CiAgICAgdGhpc2xvY2FsZSA9IEdldFVzZXJEZWZhdWx0TENJRCgpOwogIH0gZWxzZSB7CiAgICAgdGhpc2xvY2FsZSA9IGxvY2FsZTsKICAgfTsKCiAgaWYgKHh0aW1lID09IE5VTEwpIHsKICAgICBHZXRTeXN0ZW1UaW1lKCZ0KTsKICB9IGVsc2UgewogICAgICAvKiBTaWxlbnRseSBjb3JyZWN0IHdEYXlPZldlZWsgYnkgdHJhbmZvcm1pbmcgdG8gRmlsZVRpbWUgYW5kIGJhY2sgYWdhaW4qLwogICAgICByZXM9U3lzdGVtVGltZVRvRmlsZVRpbWUoeHRpbWUsJmZ0KTsKICAgICAgLyogQ2hlY2sgeWVhcig/KS9tb250aCBhbmQgZGF0ZSBmb3IgcmFuZ2UgYW5kIHNldCBFUlJPUl9JTlZBTElEX1BBUkFNRVRFUiAgb24gZXJyb3IqLwogICAgICAvKkZJWE1FOiBTeXN0ZW1UaW1lVG9GaWxlVGltZSBkb2Vzbid0IHlldCBkbyB0aGF0IGNrZWNrKi8KICAgICAgaWYoIXJlcykKCXsKCSAgU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKCSAgcmV0dXJuIDA7Cgl9CiAgICAgIEZpbGVUaW1lVG9TeXN0ZW1UaW1lKCZmdCwmdCk7IAogICAgIAogIH07CiAgdGhpc3RpbWUgPSAmdDsKCiAgaWYgKGZvcm1hdCA9PSBOVUxMKSB7CiAgICAgR2V0TG9jYWxlSW5mb0EodGhpc2xvY2FsZSwgKChmbGFncyZEQVRFX0xPTkdEQVRFKSAKCQkJCSAgID8gTE9DQUxFX1NMT05HREFURQoJCQkJICAgOiBMT0NBTEVfU1NIT1JUREFURSksCgkJICAgICAgZm9ybWF0X2J1Ziwgc2l6ZW9mKGZvcm1hdF9idWYpKTsKICAgICB0aGlzZm9ybWF0ID0gZm9ybWF0X2J1ZjsKICB9IGVsc2UgewogICAgIHRoaXNmb3JtYXQgPSBmb3JtYXQ7CiAgfTsKCiAgCiAgcmV0ID0gT0xFX0dldEZvcm1hdEEodGhpc2xvY2FsZSwgZmxhZ3MsIDAsIHRoaXN0aW1lLCB0aGlzZm9ybWF0LCAKCQkgICAgICAgZGF0ZSwgZGF0ZWxlbik7CiAgCgogICBUUkFDRSgKCSAgICAgICAiR2V0RGF0ZUZvcm1hdEEoKSByZXR1cm5pbmcgJWQsIHdpdGggZGF0YT0lc1xuIiwKCSAgICAgICByZXQsIGRhdGUpOwogIHJldHVybiByZXQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUdldERhdGVGb3JtYXRXCVtLRVJORUwzMi4zMTFdCiAqIE1ha2VzIGEgVW5pY29kZSBzdHJpbmcgb2YgdGhlIGRhdGUKICoKICogQWN0cyB0aGUgc2FtZSBhcyBHZXREYXRlRm9ybWF0QSgpLCAgZXhjZXB0IHRoYXQgaXQncyBVbmljb2RlLgogKiBBY2NlcHRzICYgcmV0dXJucyBzaXplcyBhcyBjb3VudHMgb2YgVW5pY29kZSBjaGFyYWN0ZXJzLgogKgogKi8KSU5UIFdJTkFQSSBHZXREYXRlRm9ybWF0VyhMQ0lEIGxvY2FsZSxEV09SRCBmbGFncywKCQkJICAgICAgTFBTWVNURU1USU1FIHh0aW1lLAoJCQkgICAgICBMUENXU1RSIGZvcm1hdCwKCQkJICAgICAgTFBXU1RSIGRhdGUsIElOVCBkYXRlbGVuKQp7CiAgIHVuc2lnbmVkIHNob3J0IGRhdGVhcnJbXSA9IHsnMScsJzknLCc5JywnNCcsJy0nLCcxJywnLScsJzEnLDB9OwoKICAgRklYTUUoIlNUVUIgKHNob3VsZCBjYWxsIE9MRV9HZXRGb3JtYXRXKVxuIik7ICAgCiAgIGxzdHJjcHluVyhkYXRlLCBkYXRlYXJyLCBkYXRlbGVuKTsKICAgcmV0dXJuICggIGRhdGVsZW4gPCA5KSA/IGRhdGVsZW4gOiA5OwogICAKICAgCn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgRW51bURhdGVGb3JtYXRzQQkoS0VSTkVMMzIuMTk4KQogKi8KQk9PTCBXSU5BUEkgRW51bURhdGVGb3JtYXRzQSgKICBEQVRFRk1UX0VOVU1QUk9DQSBscERhdGVGbXRFbnVtUHJvYywgTENJRCBMb2NhbGUsICBEV09SRCBkd0ZsYWdzKQp7CiAgTENJRCBMb2MgPSBHZXRVc2VyRGVmYXVsdExDSUQoKTsgCiAgaWYoIWxwRGF0ZUZtdEVudW1Qcm9jKQogICAgewogICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwogICAgICByZXR1cm4gRkFMU0U7CiAgICB9CgogIHN3aXRjaCggTG9jICkKIHsKCiAgIGNhc2UgMHgwMDAwMDQwNzogIC8qIChMb2MsImRlX0RFIikgKi8KICAgewogICAgc3dpdGNoKGR3RmxhZ3MpCiAgICB7CiAgICAgIGNhc2UgREFURV9TSE9SVERBVEU6CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkLk1NLnl5IikpIHJldHVybiBUUlVFOwoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkLk0ueXl5eSIpKSByZXR1cm4gVFJVRTsKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZC5NTS55eSIpKSByZXR1cm4gVFJVRTsKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZC5NLnl5IikpIHJldHVybiBUUlVFOwoJcmV0dXJuIFRSVUU7CiAgICAgIGNhc2UgREFURV9MT05HREFURToKICAgICAgICBpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkZGQsZC4gTU1NTSB5eXl5IikpIHJldHVybiBUUlVFOwogICAgICAgIGlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZC4gTU1NTSB5eXl5IikpIHJldHVybiBUUlVFOwogICAgICAgIGlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZC4gTU1NIHl5eXkiKSkgcmV0dXJuIFRSVUU7CglyZXR1cm4gVFJVRTsKICAgICAgZGVmYXVsdDoKCUZJWE1FKCJVbmtub3duIGRhdGUgZm9ybWF0ICglbGQpXG4iLCBkd0ZsYWdzKTsgCglTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwoJcmV0dXJuIEZBTFNFOwogICAgIH0KICAgfSAgICAgICAKCiAgIGNhc2UgMHgwMDAwMDQwYzogIC8qIChMb2MsImZyX0ZSIikgKi8KICAgewogICAgc3dpdGNoKGR3RmxhZ3MpCiAgICB7CiAgICAgIGNhc2UgREFURV9TSE9SVERBVEU6CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkL01NL3l5IikpIHJldHVybiBUUlVFOwoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkZC5NTS55eSIpKSByZXR1cm4gVFJVRTsKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZGQtTU0teXkiKSkgcmV0dXJuIFRSVUU7CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkL01NL3l5eXkiKSkgcmV0dXJuIFRSVUU7CglyZXR1cm4gVFJVRTsKICAgICAgY2FzZSBEQVRFX0xPTkdEQVRFOgogICAgICAgIGlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZGRkZCBkIE1NTU0geXl5eSIpKSByZXR1cm4gVFJVRTsKICAgICAgICBpZighKCpscERhdGVGbXRFbnVtUHJvYykoImQgTU1NIHl5IikpIHJldHVybiBUUlVFOwogICAgICAgIGlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZCBNTU1NIHl5eXkiKSkgcmV0dXJuIFRSVUU7CglyZXR1cm4gVFJVRTsKICAgICAgZGVmYXVsdDoKCUZJWE1FKCJVbmtub3duIGRhdGUgZm9ybWF0ICglbGQpXG4iLCBkd0ZsYWdzKTsgCglTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwoJcmV0dXJuIEZBTFNFOwogICAgIH0KICAgfQoKICAgY2FzZSAweDAwMDAwYzBjOiAgLyogKExvYywiZnJfQ0EiKSAqLwogICB7CiAgICBzd2l0Y2goZHdGbGFncykKICAgIHsKICAgICAgY2FzZSBEQVRFX1NIT1JUREFURToKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgieXktTU0tZGQiKSkgcmV0dXJuIFRSVUU7CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkLU1NLXl5IikpIHJldHVybiBUUlVFOwoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJ5eSBNTSBkZCIpKSByZXR1cm4gVFJVRTsKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZGQvTU0veXkiKSkgcmV0dXJuIFRSVUU7CglyZXR1cm4gVFJVRTsKICAgICAgY2FzZSBEQVRFX0xPTkdEQVRFOgogICAgICAgIGlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZCBNTU1NLCB5eXl5IikpIHJldHVybiBUUlVFOwogICAgICAgIGlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZCBNTU0geXl5eSIpKSByZXR1cm4gVFJVRTsKCXJldHVybiBUUlVFOwogICAgICBkZWZhdWx0OgoJRklYTUUoIlVua25vd24gZGF0ZSBmb3JtYXQgKCVsZClcbiIsIGR3RmxhZ3MpOyAKCVNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CglyZXR1cm4gRkFMU0U7CiAgICAgfQogICB9CgogICBjYXNlIDB4MDAwMDA4MDk6ICAvKiAoTG9jLCJlbl9VSyIpICovIAogIHsgICAgCiAgIHN3aXRjaChkd0ZsYWdzKQogICAgewogICAgICBjYXNlIERBVEVfU0hPUlREQVRFOgoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkZC9NTS95eSIpKSByZXR1cm4gVFJVRTsKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZGQvTU0veXl5eSIpKSByZXR1cm4gVFJVRTsKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZC9NL3l5IikpIHJldHVybiBUUlVFOwoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkLk0ueXkiKSkgcmV0dXJuIFRSVUU7CglyZXR1cm4gVFJVRTsKICAgICAgY2FzZSBEQVRFX0xPTkdEQVRFOgogICAgICAgIGlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZGQgTU1NTSB5eXl5IikpIHJldHVybiBUUlVFOwogICAgICAgIGlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZCBNTU1NIHl5eXkiKSkgcmV0dXJuIFRSVUU7CglyZXR1cm4gVFJVRTsKICAgICAgZGVmYXVsdDoKCUZJWE1FKCJVbmtub3duIGRhdGUgZm9ybWF0ICglbGQpXG4iLCBkd0ZsYWdzKTsgCglTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwoJcmV0dXJuIEZBTFNFOwogICAgfQogIH0KCiAgIGNhc2UgMHgwMDAwMGMwOTogIC8qIChMb2MsImVuX0FVIikgKi8gICAKICB7ICAgIAogICBzd2l0Y2goZHdGbGFncykKICAgIHsKICAgICAgY2FzZSBEQVRFX1NIT1JUREFURToKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZC9NTS95eSIpKSByZXR1cm4gVFJVRTsKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZC9NL3l5IikpIHJldHVybiBUUlVFOwoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkZC9NTS95eSIpKSByZXR1cm4gVFJVRTsKCXJldHVybiBUUlVFOwogICAgICBjYXNlIERBVEVfTE9OR0RBVEU6CiAgICAgICAgaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkZGRkLGQgTU1NTSB5eXl5IikpIHJldHVybiBUUlVFOwogICAgICAgIGlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZCBNTU1NIHl5eXkiKSkgcmV0dXJuIFRSVUU7CglyZXR1cm4gVFJVRTsKICAgICAgZGVmYXVsdDoKCUZJWE1FKCJVbmtub3duIGRhdGUgZm9ybWF0ICglbGQpXG4iLCBkd0ZsYWdzKTsgCglTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwoJcmV0dXJuIEZBTFNFOwogICAgfQogIH0KCiAgIGNhc2UgMHgwMDAwMTAwOTogIC8qIChMb2MsImVuX0NBIikgKi8gCiAgeyAgICAKICAgc3dpdGNoKGR3RmxhZ3MpCiAgICB7CiAgICAgIGNhc2UgREFURV9TSE9SVERBVEU6CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkL01NL3l5IikpIHJldHVybiBUUlVFOwoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkL00veXkiKSkgcmV0dXJuIFRSVUU7CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoInl5LU1NLWRkIikpIHJldHVybiBUUlVFOwoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJNL2RkL3l5IikpIHJldHVybiBUUlVFOwoJcmV0dXJuIFRSVUU7CiAgICAgIGNhc2UgREFURV9MT05HREFURToKICAgICAgICBpZighKCpscERhdGVGbXRFbnVtUHJvYykoImQtTU1NLXl5IikpIHJldHVybiBUUlVFOwogICAgICAgIGlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiTU1NTSBkLCB5eXl5IikpIHJldHVybiBUUlVFOwoJcmV0dXJuIFRSVUU7CiAgICAgIGRlZmF1bHQ6CglGSVhNRSgiVW5rbm93biBkYXRlIGZvcm1hdCAoJWxkKVxuIiwgZHdGbGFncyk7IAoJU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKCXJldHVybiBGQUxTRTsKICAgIH0KICB9CgogICBjYXNlIDB4MDAwMDE0MDk6ICAvKiAoTG9jLCJlbl9OWiIpICovIAogIHsgICAgCiAgIHN3aXRjaChkd0ZsYWdzKQogICAgewogICAgICBjYXNlIERBVEVfU0hPUlREQVRFOgoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkL01NL3l5IikpIHJldHVybiBUUlVFOwoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkZC9NTS95eSIpKSByZXR1cm4gVFJVRTsKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZC5NTS55eSIpKSByZXR1cm4gVFJVRTsKCXJldHVybiBUUlVFOwogICAgICBjYXNlIERBVEVfTE9OR0RBVEU6CiAgICAgICAgaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkIE1NTU0geXl5eSIpKSByZXR1cm4gVFJVRTsKICAgICAgICBpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkZGQsIGQgTU1NTSB5eXl5IikpIHJldHVybiBUUlVFOwoJcmV0dXJuIFRSVUU7CiAgICAgIGRlZmF1bHQ6CglGSVhNRSgiVW5rbm93biBkYXRlIGZvcm1hdCAoJWxkKVxuIiwgZHdGbGFncyk7IAoJU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKCXJldHVybiBGQUxTRTsKICAgIH0KICB9CgogICBjYXNlIDB4MDAwMDE4MDk6ICAvKiAoTG9jLCJlbl9JRSIpICovICAgCiAgeyAgICAKICAgc3dpdGNoKGR3RmxhZ3MpCiAgICB7CiAgICAgIGNhc2UgREFURV9TSE9SVERBVEU6CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkL01NL3l5IikpIHJldHVybiBUUlVFOwoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkL00veXkiKSkgcmV0dXJuIFRSVUU7CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoImQuTS55eSIpKSByZXR1cm4gVFJVRTsKCXJldHVybiBUUlVFOwogICAgICBjYXNlIERBVEVfTE9OR0RBVEU6CiAgICAgICAgaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkZCBNTU1NIHl5eXkiKSkgcmV0dXJuIFRSVUU7CiAgICAgICAgaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkIE1NTU0geXl5eSIpKSByZXR1cm4gVFJVRTsKCXJldHVybiBUUlVFOwogICAgICBkZWZhdWx0OgoJRklYTUUoIlVua25vd24gZGF0ZSBmb3JtYXQgKCVsZClcbiIsIGR3RmxhZ3MpOyAKCVNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CglyZXR1cm4gRkFMU0U7CiAgICB9CiAgfQoKICAgY2FzZSAweDAwMDAxYzA5OiAgLyogKExvYywiZW5fWkEiKSAqLyAgIAogIHsgICAgCiAgIHN3aXRjaChkd0ZsYWdzKQogICAgewogICAgICBjYXNlIERBVEVfU0hPUlREQVRFOgoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJ5eS9NTS9kZCIpKSByZXR1cm4gVFJVRTsKCXJldHVybiBUUlVFOwogICAgICBjYXNlIERBVEVfTE9OR0RBVEU6CiAgICAgICAgaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkZCBNTU1NIHl5eXkiKSkgcmV0dXJuIFRSVUU7CglyZXR1cm4gVFJVRTsKICAgICAgZGVmYXVsdDoKCUZJWE1FKCJVbmtub3duIGRhdGUgZm9ybWF0ICglbGQpXG4iLCBkd0ZsYWdzKTsgCglTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwoJcmV0dXJuIEZBTFNFOwogICAgfQogIH0KCiAgIGNhc2UgMHgwMDAwMjAwOTogIC8qIChMb2MsImVuX0pNIikgKi8gIAogIHsgICAgCiAgIHN3aXRjaChkd0ZsYWdzKQogICAgewogICAgICBjYXNlIERBVEVfU0hPUlREQVRFOgoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkZC9NTS95eXl5IikpIHJldHVybiBUUlVFOwoJcmV0dXJuIFRSVUU7CiAgICAgIGNhc2UgREFURV9MT05HREFURToKICAgICAgICBpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkZGQsTU1NTSBkZCx5eXl5IikpIHJldHVybiBUUlVFOwogICAgICAgIGlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiTU1NTSBkZCx5eXl5IikpIHJldHVybiBUUlVFOwogICAgICAgIGlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZGRkZCxkZCBNTU1NLHl5eXkiKSkgcmV0dXJuIFRSVUU7CiAgICAgICAgaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkZCBNTU1NLHl5eXkiKSkgcmV0dXJuIFRSVUU7CglyZXR1cm4gVFJVRTsKICAgICAgZGVmYXVsdDoKCUZJWE1FKCJVbmtub3duIGRhdGUgZm9ybWF0ICglbGQpXG4iLCBkd0ZsYWdzKTsgCglTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwoJcmV0dXJuIEZBTFNFOwogICAgfQogIH0KCiAgIGNhc2UgMHgwMDAwMjgwOTogIC8qIChMb2MsImVuX0JaIikgKi8KICAgY2FzZSAweDAwMDAyYzA5OiAgLyogKExvYywiZW5fVFQiKSAqLyAgCiAgeyAgICAKICAgc3dpdGNoKGR3RmxhZ3MpCiAgICB7CiAgICAgIGNhc2UgREFURV9TSE9SVERBVEU6CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkL01NL3l5eXkiKSkgcmV0dXJuIFRSVUU7CglyZXR1cm4gVFJVRTsKICAgICAgY2FzZSBEQVRFX0xPTkdEQVRFOgogICAgICAgIGlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZGRkZCxkZCBNTU1NIHl5eXkiKSkgcmV0dXJuIFRSVUU7CglyZXR1cm4gVFJVRTsKICAgICAgZGVmYXVsdDoKCUZJWE1FKCJVbmtub3duIGRhdGUgZm9ybWF0ICglbGQpXG4iLCBkd0ZsYWdzKTsgCglTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwoJcmV0dXJuIEZBTFNFOwogICAgfQogIH0KCiAgIGRlZmF1bHQ6ICAvKiBkZWZhdWx0IHRvIFVTIEVuZ2xpc2ggImVuX1VTIiAqLwogIHsKICAgc3dpdGNoKGR3RmxhZ3MpCiAgICB7CiAgICAgIGNhc2UgREFURV9TSE9SVERBVEU6CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoIk0vZC95eSIpKSByZXR1cm4gVFJVRTsKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiTS9kL3l5eXkiKSkgcmV0dXJuIFRSVUU7CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoIk1NL2RkL3l5IikpIHJldHVybiBUUlVFOwoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJNTS9kZC95eXl5IikpIHJldHVybiBUUlVFOwoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJ5eS9NTS9kZCIpKSByZXR1cm4gVFJVRTsKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZGQtTU1NLXl5IikpIHJldHVybiBUUlVFOwoJcmV0dXJuIFRSVUU7CiAgICAgIGNhc2UgREFURV9MT05HREFURToKICAgICAgICBpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkZGQsIE1NTU0gZGQsIHl5eXkiKSkgcmV0dXJuIFRSVUU7CiAgICAgICAgaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJNTU1NIGRkLCB5eXl5IikpIHJldHVybiBUUlVFOwogICAgICAgIGlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZGRkZCwgZGQgTU1NTSwgeXl5eSIpKSByZXR1cm4gVFJVRTsKICAgICAgICBpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkIE1NTU0sIHl5eXkiKSkgcmV0dXJuIFRSVUU7CglyZXR1cm4gVFJVRTsKICAgICAgZGVmYXVsdDoKCUZJWE1FKCJVbmtub3duIGRhdGUgZm9ybWF0ICglbGQpXG4iLCBkd0ZsYWdzKTsgCglTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwoJcmV0dXJuIEZBTFNFOwogICAgfQogIH0KIH0KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgICBFbnVtRGF0ZUZvcm1hdHNXCShLRVJORUwzMi4xOTkpCiAqLwpCT09MIFdJTkFQSSBFbnVtRGF0ZUZvcm1hdHNXKAogIERBVEVGTVRfRU5VTVBST0NXIGxwRGF0ZUZtdEVudW1Qcm9jLCBMQ0lEIExvY2FsZSwgRFdPUkQgZHdGbGFncykKewogIEZJWE1FKCIoJXAsICVsZCwgJWxkKTogc3R1YlxuIiwgbHBEYXRlRm10RW51bVByb2MsIExvY2FsZSwgZHdGbGFncyk7CiAgU2V0TGFzdEVycm9yKEVSUk9SX0NBTExfTk9UX0lNUExFTUVOVEVEKTsKICByZXR1cm4gRkFMU0U7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgRW51bVRpbWVGb3JtYXRzQQkoS0VSTkVMMzIuMjEwKQogKi8KQk9PTCBXSU5BUEkgRW51bVRpbWVGb3JtYXRzQSgKICBUSU1FRk1UX0VOVU1QUk9DQSBscFRpbWVGbXRFbnVtUHJvYywgTENJRCBMb2NhbGUsIERXT1JEIGR3RmxhZ3MpCnsKICBMQ0lEIExvYyA9IEdldFVzZXJEZWZhdWx0TENJRCgpOyAKICBpZighbHBUaW1lRm10RW51bVByb2MpCiAgICB7CiAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CiAgICAgIHJldHVybiBGQUxTRTsKICAgIH0KICBpZihkd0ZsYWdzKQogICAgewogICAgICBGSVhNRSgiVW5rbm93biB0aW1lIGZvcm1hdCAoJWxkKVxuIiwgZHdGbGFncyk7IAogICAgfQoKICBzd2l0Y2goIExvYyApCiB7CiAgIGNhc2UgMHgwMDAwMDQwNzogIC8qIChMb2MsImRlX0RFIikgKi8KICAgewogICAgaWYoISgqbHBUaW1lRm10RW51bVByb2MpKCJISC5tbSIpKSByZXR1cm4gVFJVRTsgCiAgICBpZighKCpscFRpbWVGbXRFbnVtUHJvYykoIkhIOm1tOnNzIikpIHJldHVybiBUUlVFOwogICAgaWYoISgqbHBUaW1lRm10RW51bVByb2MpKCJIOm1tOnNzIikpIHJldHVybiBUUlVFOwogICAgaWYoISgqbHBUaW1lRm10RW51bVByb2MpKCJILm1tIikpIHJldHVybiBUUlVFOwogICAgaWYoISgqbHBUaW1lRm10RW51bVByb2MpKCJILm1tJ1VociciKSkgcmV0dXJuIFRSVUU7CiAgICByZXR1cm4gVFJVRTsKICAgfSAgICAgICAKCiAgIGNhc2UgMHgwMDAwMDQwYzogIC8qIChMb2MsImZyX0ZSIikgKi8KICAgY2FzZSAweDAwMDAwYzBjOiAgLyogKExvYywiZnJfQ0EiKSAqLwogICB7CiAgICBpZighKCpscFRpbWVGbXRFbnVtUHJvYykoIkg6bW0iKSkgcmV0dXJuIFRSVUU7CiAgICBpZighKCpscFRpbWVGbXRFbnVtUHJvYykoIkhIOm1tOnNzIikpIHJldHVybiBUUlVFOwogICAgaWYoISgqbHBUaW1lRm10RW51bVByb2MpKCJIOm1tOnNzIikpIHJldHVybiBUUlVFOwogICAgaWYoISgqbHBUaW1lRm10RW51bVByb2MpKCJISC5tbSIpKSByZXR1cm4gVFJVRTsKICAgIGlmKCEoKmxwVGltZUZtdEVudW1Qcm9jKSgiSEgnaCdtbSIpKSByZXR1cm4gVFJVRTsKICAgIHJldHVybiBUUlVFOwogICB9CgogICBjYXNlIDB4MDAwMDA4MDk6ICAvKiAoTG9jLCJlbl9VSyIpICovCiAgIGNhc2UgMHgwMDAwMGMwOTogIC8qIChMb2MsImVuX0FVIikgKi8gCiAgIGNhc2UgMHgwMDAwMTQwOTogIC8qIChMb2MsImVuX05aIikgKi8KICAgY2FzZSAweDAwMDAxODA5OiAgLyogKExvYywiZW5fSUUiKSAqLyAKICAgewogICAgaWYoISgqbHBUaW1lRm10RW51bVByb2MpKCJoOm1tOnNzIHR0IikpIHJldHVybiBUUlVFOwogICAgaWYoISgqbHBUaW1lRm10RW51bVByb2MpKCJISDptbTpzcyIpKSByZXR1cm4gVFJVRTsKICAgIGlmKCEoKmxwVGltZUZtdEVudW1Qcm9jKSgiSDptbTpzcyIpKSByZXR1cm4gVFJVRTsKICAgIHJldHVybiBUUlVFOwogICB9CgogICBjYXNlIDB4MDAwMDFjMDk6ICAvKiAoTG9jLCJlbl9aQSIpICovICAgCiAgIGNhc2UgMHgwMDAwMjgwOTogIC8qIChMb2MsImVuX0JaIikgKi8KICAgY2FzZSAweDAwMDAyYzA5OiAgLyogKExvYywiZW5fVFQiKSAqLyAKICAgewogICAgaWYoISgqbHBUaW1lRm10RW51bVByb2MpKCJoOm1tOnNzIHR0IikpIHJldHVybiBUUlVFOwogICAgaWYoISgqbHBUaW1lRm10RW51bVByb2MpKCJoaDptbTpzcyB0dCIpKSByZXR1cm4gVFJVRTsgCiAgICByZXR1cm4gVFJVRTsgIAogICB9CgogICBkZWZhdWx0OiAgLyogZGVmYXVsdCB0byBVUyBzdHlsZSAiZW5fVVMiICovICAgCiAgIHsKICAgIGlmKCEoKmxwVGltZUZtdEVudW1Qcm9jKSgiaDptbTpzcyB0dCIpKSByZXR1cm4gVFJVRTsKICAgIGlmKCEoKmxwVGltZUZtdEVudW1Qcm9jKSgiaGg6bW06c3MgdHQiKSkgcmV0dXJuIFRSVUU7CiAgICBpZighKCpscFRpbWVGbXRFbnVtUHJvYykoIkg6bW06c3MiKSkgcmV0dXJuIFRSVUU7CiAgICBpZighKCpscFRpbWVGbXRFbnVtUHJvYykoIkhIOm1tOnNzIikpIHJldHVybiBUUlVFOwogICAgcmV0dXJuIFRSVUU7CiAgIH0KIH0KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgICBFbnVtVGltZUZvcm1hdHNXCShLRVJORUwzMi4yMTEpCiAqLwpCT09MIFdJTkFQSSBFbnVtVGltZUZvcm1hdHNXKAogIFRJTUVGTVRfRU5VTVBST0NXIGxwVGltZUZtdEVudW1Qcm9jLCBMQ0lEIExvY2FsZSwgRFdPUkQgZHdGbGFncykKewogIEZJWE1FKCIoJXAsJWxkLCVsZCk6IHN0dWJcbiIsIGxwVGltZUZtdEVudW1Qcm9jLCBMb2NhbGUsIGR3RmxhZ3MpOwogIFNldExhc3RFcnJvcihFUlJPUl9DQUxMX05PVF9JTVBMRU1FTlRFRCk7CiAgcmV0dXJuIEZBTFNFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBqdXN0IGxvY2FsbHkgIQogKiAgRGVzY3JpcHRpb246IEludmVydHMgYSBzdHJpbmcuCiAqLyAKc3RhdGljIHZvaWQgT0xFX0ludmVydFN0cmluZyhjaGFyKiBzdHJpbmcpCnsgICAgCiAgICBjaGFyICAgIHNUbXBBcnJheVsxMjhdOwogICAgSU5UICAgICBjb3VudGVyLCBpID0gMDsKCiAgICBmb3IgKGNvdW50ZXIgPSBzdHJsZW4oc3RyaW5nKTsgY291bnRlciA+IDA7IGNvdW50ZXItLSkKICAgIHsKICAgICAgICBtZW1jcHkoc1RtcEFycmF5ICsgaSwgc3RyaW5nICsgY291bnRlci0xLCAxKTsKICAgICAgICBpKys7CiAgICB9CiAgICBtZW1jcHkoc1RtcEFycmF5ICsgaSwgIlwwIiwgMSk7CiAgICBzdHJjcHkoc3RyaW5nLCBzVG1wQXJyYXkpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQganVzdCBsb2NhbGx5ICEKICogIERlc2NyaXB0aW9uOiBUZXN0IGlmIHRoZSBnaXZlbiBzdHJpbmcgKHBzTnVtYmVyKSBpcyB2YWxpZCBvciBub3QuCiAqICAgICAgICAgICAgICAgVGhlIHZhbGlkIGNoYXJhY3RlcnMgYXJlIHRoZSBmb2xsb3dpbmc6CiAqICAgICAgICAgICAgICAgLSBDaGFyYWN0ZXJzICcwJyB0aHJvdWdoICc5Jy4gCiAqICAgICAgICAgICAgICAgLSBPbmUgZGVjaW1hbCBwb2ludCAoZG90KSBpZiB0aGUgbnVtYmVyIGlzIGEgZmxvYXRpbmctcG9pbnQgdmFsdWUuIAogKiAgICAgICAgICAgICAgIC0gQSBtaW51cyBzaWduIGluIHRoZSBmaXJzdCBjaGFyYWN0ZXIgcG9zaXRpb24gaWYgdGhlIG51bWJlciBpcyAKICogICAgICAgICAgICAgICAgIGEgbmVnYXRpdmUgdmFsdWUuCiAqICAgICAgICAgICAgICBJZiB0aGUgZnVuY3Rpb24gc3VjY2VlZHMsIHBzQmVmb3JlL3BzQWZ0ZXIgd2lsbCBwb2ludCB0byB0aGUgc3RyaW5nCiAqICAgICAgICAgICAgICBvbiB0aGUgcmlnaHQvbGVmdCBvZiB0aGUgZGVjaW1hbCBzeW1ib2wuIHBiTmVnYXRpdmUgaW5kaWNhdGVzIGlmIHRoZSAKICogICAgICAgICAgICAgIG51bWJlciBpcyBuZWdhdGl2ZS4KICovCnN0YXRpYyBJTlQgT0xFX0dldE51bWJlckNvbXBvbmVudHMoY2hhciogcElucHV0LCBjaGFyKiBwc0JlZm9yZSwgY2hhciogcHNBZnRlciwgQk9PTCogcGJOZWdhdGl2ZSkKewpjaGFyCXNOdW1iZXJTZXRbXSA9ICIwMTIzNDU2Nzg5IjsKQk9PTAliSW5EZWNpbWFsID0gRkFMU0U7CgoJLyogVGVzdCBpZiB3ZSBkbyBoYXZlIGEgbWludXMgc2lnbiAqLwoJaWYgKCAqcElucHV0ID09ICctJyApCgl7CgkJKnBiTmVnYXRpdmUgPSBUUlVFOwoJCXBJbnB1dCsrOyAvKiBKdW1wIHRvIHRoZSBuZXh0IGNoYXJhY3Rlci4gKi8KCX0KCQoJd2hpbGUoKnBJbnB1dCAhPSAnXDAnKQoJewoJCS8qIERvIHdlIGhhdmUgYSB2YWxpZCBudW1lcmljIGNoYXJhY3RlciAqLwoJCWlmICggc3RyY2hyKHNOdW1iZXJTZXQsICpwSW5wdXQpICE9IE5VTEwgKQoJCXsKCQkJaWYgKGJJbkRlY2ltYWwgPT0gVFJVRSkKICAgICAgICAgICAgICAgICpwc0FmdGVyKysgPSAqcElucHV0OwoJCQllbHNlCiAgICAgICAgICAgICAgICAqcHNCZWZvcmUrKyA9ICpwSW5wdXQ7CgkJfQoJCWVsc2UKCQl7CgkJCS8qIElzIHRoaXMgYSBkZWNpbWFsIHBvaW50IChkb3QpICovCgkJCWlmICggKnBJbnB1dCA9PSAnLicgKQoJCQl7CgkJCQkvKiBJcyBpdCB0aGUgZmlyc3QgdGltZSB3ZSBmaW5kIGl0ICovCgkJCQlpZiAoKGJJbkRlY2ltYWwgPT0gRkFMU0UpKQoJCQkJCWJJbkRlY2ltYWwgPSBUUlVFOwoJCQkJZWxzZQoJCQkJCXJldHVybiAtMTsgLyogRVJST1I6IEludmFsaWQgcGFyYW1ldGVyICovCgkJCX0KCQkJZWxzZQoJCQl7CgkJCQkvKiBJdCdzIG5laXRoZXIgYSBudW1lcmljIGNoYXJhY3Rlciwgbm9yIGEgZGVjaW1hbCBwb2ludC4KCQkJCSAqIFRodXMsIHJldHVybiBhbiBlcnJvci4KICAgICAgICAgICAgICAgICAqLwoJCQkJcmV0dXJuIC0xOwoJCQl9CgkJfQogICAgICAgIHBJbnB1dCsrOwoJfQoJCgkvKiBBZGQgYW4gRW5kIG9mIExpbmUgY2hhcmFjdGVyIHRvIHRoZSBvdXRwdXQgYnVmZmVycyAqLwoJKnBzQmVmb3JlID0gJ1wwJzsKCSpwc0FmdGVyID0gJ1wwJzsKCglyZXR1cm4gMDsgCn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGp1c3QgbG9jYWxseSAhCiAqICBEZXNjcmlwdGlvbjogQSBudW1iZXIgY291bGQgYmUgZm9ybWF0dGVkIHVzaW5nIGRpZmZlcmVudCBudW1iZXJzIAogKiAgICAgICAgICAgICAgIG9mICJkaWdpdHMgaW4gZ3JvdXAiIChleGFtcGxlOiA0OzM7MjswKS4KICogICAgICAgICAgICAgICBUaGUgZmlyc3QgcGFyYW1ldGVyIG9mIHRoaXMgZnVuY3Rpb24gaXMgYW4gYXJyYXkKICogICAgICAgICAgICAgICBjb250YWluaW5nIHRoZSBydWxlIHRvIGJlIHVzZWQuIEl0J3MgZm9ybWF0IGlzIHRoZSBmb2xsb3dpbmc6CiAqICAgICAgICAgICAgICAgfE5ER3xERzF8REcyfC4uLnwwfAogKiAgICAgICAgICAgICAgIHdoZXJlIE5ERyBpcyB0aGUgbnVtYmVyIG9mIHVzZWQgImRpZ2l0cyBpbiBncm91cCIgYW5kIERHMSwgREcyLAogKiAgICAgICAgICAgICAgIGFyZSB0aGUgY29ycmVzcG9uZGluZyAiZGlnaXRzIGluIGdyb3VwIi4KICogICAgICAgICAgICAgICBUaHVzLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGdyb3VwaW5nIHZhbHVlIGluIHRoZSBhcnJheQogKiAgICAgICAgICAgICAgIHBvaW50ZWQgYnkgdGhlIHNlY29uZCBwYXJhbWV0ZXIuCiAqLwpzdGF0aWMgSU5UIE9MRV9HZXRHcm91cGluZyhjaGFyKiBzUnVsZSwgSU5UIGluZGV4KQp7CiAgICBjaGFyICAgIHNEYXRhWzJdLCBzUnVsZVNpemVbMl07CiAgICBJTlQgICAgIG5EYXRhLCBuUnVsZVNpemU7CgogICAgbWVtY3B5KHNSdWxlU2l6ZSwgc1J1bGUsIDEpOwogICAgbWVtY3B5KHNSdWxlU2l6ZSsxLCAiXDAiLCAxKTsKICAgIG5SdWxlU2l6ZSA9IGF0b2koc1J1bGVTaXplKTsKCiAgICBpZiAoaW5kZXggPiAwICYmIGluZGV4IDwgblJ1bGVTaXplKQogICAgewogICAgICAgIG1lbWNweShzRGF0YSwgc1J1bGUraW5kZXgsIDEpOwogICAgICAgIG1lbWNweShzRGF0YSsxLCAiXDAiLCAxKTsKICAgICAgICBuRGF0YSA9IGF0b2koc0RhdGEpOyAgICAgICAgICAgIAogICAgfQogICAgICAgIAogICAgZWxzZQogICAgewogICAgICAgIG1lbWNweShzRGF0YSwgc1J1bGUrblJ1bGVTaXplLTEsIDEpOwogICAgICAgIG1lbWNweShzRGF0YSsxLCAiXDAiLCAxKTsKICAgICAgICBuRGF0YSA9IGF0b2koc0RhdGEpOyAgICAgICAgICAgIAogICAgfQogICAgCiAgICByZXR1cm4gbkRhdGE7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgR2V0TnVtYmVyRm9ybWF0QQkoS0VSTkVMMzIuMzU1KQogKi8KSU5UIFdJTkFQSSBHZXROdW1iZXJGb3JtYXRBKExDSUQgbG9jYWxlLCBEV09SRCBkd2ZsYWdzLAoJCQkgICAgICAgTFBDU1RSIGxwdmFsdWUsICAgY29uc3QgTlVNQkVSRk1UQSAqIGxwRm9ybWF0LAoJCQkgICAgICAgTFBTVFIgbHBOdW1iZXJTdHIsIGludCBjY2hOdW1iZXIpCnsKICAgIGNoYXIgICBzTnVtYmVyRGlnaXRzWzNdLCBzRGVjaW1hbFN5bWJvbFs1XSwgc0RpZ2l0c0luR3JvdXBbMTFdLCBzRGlnaXRHcm91cFN5bWJvbFs1XSwgc0lMWmVyb1syXTsKICAgIElOVCAgICBuTnVtYmVyRGlnaXRzLCBuTnVtYmVyRGVjaW1hbCwgaSwgaiwgbkNvdW50ZXIsIG5TdGVwLCBuUnVsZUluZGV4LCBuR3JvdXBpbmcsIG5EaWdpdHMsIHJldFZhbCwgbkxaOwogICAgY2hhciAgIHNOdW1iZXJbMTI4XSwgc0Rlc3RpbmF0aW9uWzEyOF0sIHNEaWdpdHNBZnRlckRlY2ltYWxbMTBdLCBzRGlnaXRzQmVmb3JlRGVjaW1hbFsxMjhdOwogICAgY2hhciAgIHNSdWxlWzEwXSwgc1NlbWlDb2x1bW5bXT0iOyIsIHNCdWZmZXJbNV0sIHNOZWdOdW1iZXJbMl07ICAgIAogICAgY2hhciAgICpwU3RyID0gTlVMTCwgKnBUbXBTdHIgPSBOVUxMOwogICAgTENJRCAgIHN5c3RlbURlZmF1bHRMQ0lEOwogICAgQk9PTCAgIGJOZWdhdGl2ZSA9IEZBTFNFOwogICAgZW51bSAgIE9wZXJhdGlvbnMgCiAgICB7CiAgICAgICAgVVNFX1BBUkFNRVRFUiwKICAgICAgICBVU0VfTE9DQUxFSU5GTywKICAgICAgICBVU0VfU1lTVEVNREVGQVVMVCwKICAgICAgICBSRVRVUk5fRVJST1IKICAgIH0gdXNlZF9vcGVyYXRpb247CgogICAgc3RybmNweShzTnVtYmVyLCBscHZhbHVlLCAxMjgpOwogICAgc051bWJlclsxMjddID0gJ1wwJzsKCiAgICAvKiBNYWtlIHN1cmUgd2UgaGF2ZSBhIHZhbGlkIGlucHV0IHN0cmluZywgZ2V0IHRoZSBudW1iZXIKICAgICAqIG9mIGRpZ2l0cyBiZWZvcmUgYW5kIGFmdGVyIHRoZSBkZWNpbWFsIHN5bWJvbCwgYW5kIGNoZWNrCiAgICAgKiBpZiB0aGlzIGlzIGEgbmVnYXRpdmUgbnVtYmVyLgogICAgICovCiAgICBpZiAoIE9MRV9HZXROdW1iZXJDb21wb25lbnRzKHNOdW1iZXIsIHNEaWdpdHNCZWZvcmVEZWNpbWFsLCBzRGlnaXRzQWZ0ZXJEZWNpbWFsLCAmYk5lZ2F0aXZlKSAhPSAtMSkKICAgIHsKICAgICAgICBuTnVtYmVyRGVjaW1hbCA9IHN0cmxlbihzRGlnaXRzQmVmb3JlRGVjaW1hbCk7CiAgICAgICAgbkRpZ2l0cyA9IHN0cmxlbihzRGlnaXRzQWZ0ZXJEZWNpbWFsKTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwogICAgICAgIHJldHVybiAwOwogICAgfQoKICAgIC8qIFdoaWNoIHNvdXJjZSB3aWxsIHdlIHVzZSB0byBmb3JtYXQgdGhlIHN0cmluZyAqLwogICAgdXNlZF9vcGVyYXRpb24gPSBSRVRVUk5fRVJST1I7CiAgICBpZiAobHBGb3JtYXQgIT0gTlVMTCkKICAgIHsKICAgICAgICBpZiAoZHdmbGFncyA9PSAwKQogICAgICAgICAgICB1c2VkX29wZXJhdGlvbiA9IFVTRV9QQVJBTUVURVI7IAogICAgfQogICAgZWxzZQogICAgewogICAgICAgIGlmIChkd2ZsYWdzICYgTE9DQUxFX05PVVNFUk9WRVJSSURFKQogICAgICAgICAgICB1c2VkX29wZXJhdGlvbiA9IFVTRV9MT0NBTEVJTkZPOwogICAgICAgIGVsc2UKICAgICAgICAgICAgdXNlZF9vcGVyYXRpb24gPSBVU0VfU1lTVEVNREVGQVVMVDsKICAgIH0KCiAgICAvKiBMb2FkIHRoZSBmaWVsZHMgd2UgbmVlZCAqLwogICAgc3dpdGNoKHVzZWRfb3BlcmF0aW9uKQogICAgewogICAgY2FzZSBVU0VfTE9DQUxFSU5GTzoKICAgICAgICBHZXRMb2NhbGVJbmZvQShsb2NhbGUsIExPQ0FMRV9JRElHSVRTLCBzTnVtYmVyRGlnaXRzLCBzaXplb2Yoc051bWJlckRpZ2l0cykpOwogICAgICAgIEdldExvY2FsZUluZm9BKGxvY2FsZSwgTE9DQUxFX1NERUNJTUFMLCBzRGVjaW1hbFN5bWJvbCwgc2l6ZW9mKHNEZWNpbWFsU3ltYm9sKSk7CiAgICAgICAgR2V0TG9jYWxlSW5mb0EobG9jYWxlLCBMT0NBTEVfU0dST1VQSU5HLCBzRGlnaXRzSW5Hcm91cCwgc2l6ZW9mKHNEaWdpdHNJbkdyb3VwKSk7CiAgICAgICAgR2V0TG9jYWxlSW5mb0EobG9jYWxlLCBMT0NBTEVfU1RIT1VTQU5ELCBzRGlnaXRHcm91cFN5bWJvbCwgc2l6ZW9mKHNEaWdpdEdyb3VwU3ltYm9sKSk7CiAgICAgICAgR2V0TG9jYWxlSW5mb0EobG9jYWxlLCBMT0NBTEVfSUxaRVJPLCBzSUxaZXJvLCBzaXplb2Yoc0lMWmVybykpOwogICAgICAgIEdldExvY2FsZUluZm9BKGxvY2FsZSwgTE9DQUxFX0lORUdOVU1CRVIsIHNOZWdOdW1iZXIsIHNpemVvZihzTmVnTnVtYmVyKSk7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIFVTRV9QQVJBTUVURVI6CiAgICAgICAgc3ByaW50ZihzTnVtYmVyRGlnaXRzLCAiJWQiLGxwRm9ybWF0LT5OdW1EaWdpdHMpOwogICAgICAgIHN0cmNweShzRGVjaW1hbFN5bWJvbCwgbHBGb3JtYXQtPmxwRGVjaW1hbFNlcCk7CiAgICAgICAgc3ByaW50ZihzRGlnaXRzSW5Hcm91cCwgIiVkOzAiLGxwRm9ybWF0LT5Hcm91cGluZyk7CiAgICAgICAgc3RyY3B5KHNEaWdpdEdyb3VwU3ltYm9sLCBscEZvcm1hdC0+bHBUaG91c2FuZFNlcCk7CiAgICAgICAgc3ByaW50ZihzSUxaZXJvLCAiJWQiLGxwRm9ybWF0LT5MZWFkaW5nWmVybyk7CiAgICAgICAgc3ByaW50ZihzTmVnTnVtYmVyLCAiJWQiLGxwRm9ybWF0LT5OZWdhdGl2ZU9yZGVyKTsKICAgICAgICBicmVhazsKICAgIGNhc2UgVVNFX1NZU1RFTURFRkFVTFQ6CiAgICAgICAgc3lzdGVtRGVmYXVsdExDSUQgPSBHZXRTeXN0ZW1EZWZhdWx0TENJRCgpOwogICAgICAgIEdldExvY2FsZUluZm9BKHN5c3RlbURlZmF1bHRMQ0lELCBMT0NBTEVfSURJR0lUUywgc051bWJlckRpZ2l0cywgc2l6ZW9mKHNOdW1iZXJEaWdpdHMpKTsKICAgICAgICBHZXRMb2NhbGVJbmZvQShzeXN0ZW1EZWZhdWx0TENJRCwgTE9DQUxFX1NERUNJTUFMLCBzRGVjaW1hbFN5bWJvbCwgc2l6ZW9mKHNEZWNpbWFsU3ltYm9sKSk7CiAgICAgICAgR2V0TG9jYWxlSW5mb0Eoc3lzdGVtRGVmYXVsdExDSUQsIExPQ0FMRV9TR1JPVVBJTkcsIHNEaWdpdHNJbkdyb3VwLCBzaXplb2Yoc0RpZ2l0c0luR3JvdXApKTsKICAgICAgICBHZXRMb2NhbGVJbmZvQShzeXN0ZW1EZWZhdWx0TENJRCwgTE9DQUxFX1NUSE9VU0FORCwgc0RpZ2l0R3JvdXBTeW1ib2wsIHNpemVvZihzRGlnaXRHcm91cFN5bWJvbCkpOwogICAgICAgIEdldExvY2FsZUluZm9BKHN5c3RlbURlZmF1bHRMQ0lELCBMT0NBTEVfSUxaRVJPLCBzSUxaZXJvLCBzaXplb2Yoc0lMWmVybykpOwogICAgICAgIEdldExvY2FsZUluZm9BKHN5c3RlbURlZmF1bHRMQ0lELCBMT0NBTEVfSU5FR05VTUJFUiwgc05lZ051bWJlciwgc2l6ZW9mKHNOZWdOdW1iZXIpKTsKICAgICAgICBicmVhazsKICAgIGRlZmF1bHQ6CiAgICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KCiAgICBuTnVtYmVyRGlnaXRzID0gYXRvaShzTnVtYmVyRGlnaXRzKTsKICAgIAogICAgLyogUmVtb3ZlIHRoZSAiOyIgKi8KICAgIGk9MDsKICAgIGogPSAxOwogICAgZm9yIChuQ291bnRlcj0wOyBuQ291bnRlcjxzdHJsZW4oc0RpZ2l0c0luR3JvdXApOyBuQ291bnRlcisrKQogICAgewogICAgICAgIGlmICggbWVtY21wKHNEaWdpdHNJbkdyb3VwICsgbkNvdW50ZXIsIHNTZW1pQ29sdW1uLCAxKSAhPSAwICkKICAgICAgICB7CiAgICAgICAgICAgIG1lbWNweShzUnVsZSArIGosIHNEaWdpdHNJbkdyb3VwICsgbkNvdW50ZXIsIDEpOwogICAgICAgICAgICBpKys7CiAgICAgICAgICAgIGorKzsKICAgICAgICB9CiAgICB9CiAgICBzcHJpbnRmKHNCdWZmZXIsICIlZCIsIGkpOwogICAgbWVtY3B5KHNSdWxlLCBzQnVmZmVyLCAxKTsgLyogTnVtYmVyIG9mIGRpZ2l0cyBpbiB0aGUgZ3JvdXBzICggdXNlZCBieSBPTEVfR2V0R3JvdXBpbmcoKSApICovCiAgICBtZW1jcHkoc1J1bGUgKyBqLCAiXDAiLCAxKTsKICAgIAogICAgLyogRmlyc3QsIGZvcm1hdCB0aGUgZGlnaXRzIGJlZm9yZSB0aGUgZGVjaW1hbC4gKi8KICAgIGlmICgobk51bWJlckRlY2ltYWw+MCkgJiYgKGF0b2koc0RpZ2l0c0JlZm9yZURlY2ltYWwpICE9IDApKSAKICAgIHsKICAgICAgICAvKiBXb3JraW5nIG9uIGFuIGludmVydGVkIHN0cmluZyBpcyBlYXNpZXIgISAqLwogICAgICAgIE9MRV9JbnZlcnRTdHJpbmcoc0RpZ2l0c0JlZm9yZURlY2ltYWwpOwoKICAgICAgICBuU3RlcCA9IG5Db3VudGVyID0gaSA9IGogPSAwOwogICAgICAgIG5SdWxlSW5kZXggPSAxOwogICAgICAgIG5Hcm91cGluZyA9IE9MRV9HZXRHcm91cGluZyhzUnVsZSwgblJ1bGVJbmRleCk7CiAgICAgICAgCiAgICAgICAgLyogSGVyZSwgd2Ugd2lsbCBsb29wIHVudGlsIHdlIHJlYWNoIHRoZSBlbmQgb2YgdGhlIHN0cmluZy4KICAgICAgICAgKiBBbiBpbnRlcm5hbCBjb3VudGVyIChqKSBpcyB1c2VkIGluIG9yZGVyIHRvIGtub3cgd2hlbiB0byAKICAgICAgICAgKiBpbnNlcnQgdGhlICJkaWdpdCBncm91cCBzeW1ib2wiLgogICAgICAgICAqLwogICAgICAgIHdoaWxlIChuTnVtYmVyRGVjaW1hbCA+IDApCiAgICAgICAgewogICAgICAgICAgICBpID0gbkNvdW50ZXIgKyBuU3RlcDsKICAgICAgICAgICAgbWVtY3B5KHNEZXN0aW5hdGlvbiArIGksIHNEaWdpdHNCZWZvcmVEZWNpbWFsICsgbkNvdW50ZXIsIDEpOwogICAgICAgICAgICBuQ291bnRlcisrOwogICAgICAgICAgICBqKys7CiAgICAgICAgICAgIGlmIChqID49IG5Hcm91cGluZykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaiA9IDA7CiAgICAgICAgICAgICAgICBpZiAoblJ1bGVJbmRleCA8IHNSdWxlWzBdKQogICAgICAgICAgICAgICAgICAgIG5SdWxlSW5kZXgrKzsKICAgICAgICAgICAgICAgIG5Hcm91cGluZyA9IE9MRV9HZXRHcm91cGluZyhzUnVsZSwgblJ1bGVJbmRleCk7CiAgICAgICAgICAgICAgICBtZW1jcHkoc0Rlc3RpbmF0aW9uICsgaSsxLCBzRGlnaXRHcm91cFN5bWJvbCwgc3RybGVuKHNEaWdpdEdyb3VwU3ltYm9sKSk7CiAgICAgICAgICAgICAgICBuU3RlcCs9IHN0cmxlbihzRGlnaXRHcm91cFN5bWJvbCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG5OdW1iZXJEZWNpbWFsLS07CiAgICAgICAgfQoKICAgICAgICBtZW1jcHkoc0Rlc3RpbmF0aW9uICsgaSsxLCAiXDAiLCAxKTsKICAgICAgICAvKiBHZXQgdGhlIHN0cmluZyBpbiB0aGUgcmlnaHQgb3JkZXIgISAqLwogICAgICAgIE9MRV9JbnZlcnRTdHJpbmcoc0Rlc3RpbmF0aW9uKTsKICAgICB9CiAgICAgZWxzZQogICAgIHsKICAgICAgICBuTFogPSBhdG9pKHNJTFplcm8pOwogICAgICAgIGlmIChuTFogIT0gMCkKICAgICAgICB7ICAgICAgICAKICAgICAgICAgICAgLyogVXNlIDAueHh4IGluc3RlYWQgb2YgLnh4eCAqLwogICAgICAgICAgICBtZW1jcHkoc0Rlc3RpbmF0aW9uLCAiMCIsIDEpOwogICAgICAgICAgICBtZW1jcHkoc0Rlc3RpbmF0aW9uKzEsICJcMCIsIDEpOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgICAgIG1lbWNweShzRGVzdGluYXRpb24sICJcMCIsIDEpOwoKICAgICB9CgogICAgLyogU2Vjb25kLCBmb3JtYXQgdGhlIGRpZ2l0cyBhZnRlciB0aGUgZGVjaW1hbC4gKi8KICAgIGogPSAwOwogICAgbkNvdW50ZXIgPSBuTnVtYmVyRGlnaXRzOwogICAgaWYgKCAobkRpZ2l0cz4wKSAmJiAocFN0ciA9IHN0cnN0ciAoc051bWJlciwgIi4iKSkgKQogICAgewogICAgICAgIGkgPSBzdHJsZW4oc051bWJlcikgLSBzdHJsZW4ocFN0cikgKyAxOyAgICAgICAgCiAgICAgICAgc3RybmNweSAoIHNEaWdpdHNBZnRlckRlY2ltYWwsIHNOdW1iZXIgKyBpLCBuTnVtYmVyRGlnaXRzKTsKICAgICAgICBqID0gc3RybGVuKHNEaWdpdHNBZnRlckRlY2ltYWwpOwogICAgICAgIGlmIChqIDwgbk51bWJlckRpZ2l0cykKICAgICAgICAgICAgbkNvdW50ZXIgPSBuTnVtYmVyRGlnaXRzLWo7ICAgICAgICAgICAgCiAgICB9CiAgICBmb3IgKGk9MDtpPG5Db3VudGVyO2krKykKICAgICAgICAgbWVtY3B5KHNEaWdpdHNBZnRlckRlY2ltYWwraStqLCAiMCIsIDEpOyAgICAKICAgIG1lbWNweShzRGlnaXRzQWZ0ZXJEZWNpbWFsICsgbk51bWJlckRpZ2l0cywgIlwwIiwgMSk7ICAgIAoKICAgIGkgPSBzdHJsZW4oc0Rlc3RpbmF0aW9uKTsKICAgIGogPSBzdHJsZW4oc0RpZ2l0c0FmdGVyRGVjaW1hbCk7CiAgICAvKiBGaW5hbGx5LCBjb25zdHJ1Y3QgdGhlIHJlc3VsdGluZyBmb3JtYXR0ZWQgc3RyaW5nLiAqLwogICAgICAgIAogICAgZm9yIChuQ291bnRlcj0wOyBuQ291bnRlcjxpOyBuQ291bnRlcisrKQogICAgICAgIG1lbWNweShzTnVtYmVyICsgbkNvdW50ZXIsIHNEZXN0aW5hdGlvbiArIG5Db3VudGVyLCAxKTsKICAgICAgIAogICAgbWVtY3B5KHNOdW1iZXIgKyBuQ291bnRlciwgc0RlY2ltYWxTeW1ib2wsIHN0cmxlbihzRGVjaW1hbFN5bWJvbCkpOwoKICAgIGZvciAoaT0wOyBpPGo7IGkrKykKICAgICAgICBtZW1jcHkoc051bWJlciArIG5Db3VudGVyK2krc3RybGVuKHNEZWNpbWFsU3ltYm9sKSwgc0RpZ2l0c0FmdGVyRGVjaW1hbCArIGksIDEpOwogICAgbWVtY3B5KHNOdW1iZXIgKyBuQ291bnRlcitpK3N0cmxlbihzRGVjaW1hbFN5bWJvbCksICJcMCIsIDEpOwogICAgICAgIAogICAgLyogSXMgaXQgYSBuZWdhdGl2ZSBudW1iZXIgKi8KICAgIGlmIChiTmVnYXRpdmUgPT0gVFJVRSkKICAgIHsKICAgICAgICBpID0gYXRvaShzTmVnTnVtYmVyKTsKICAgICAgICBwU3RyID0gc0Rlc3RpbmF0aW9uOwogICAgICAgIHBUbXBTdHIgPSBzTnVtYmVyOwogICAgICAgIHN3aXRjaCAoaSkKICAgICAgICB7ICAgICAgICAgIAogICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgKnBTdHIrKyA9ICcoJzsKICAgICAgICAgICAgd2hpbGUgKCpzTnVtYmVyICE9ICdcMCcpCiAgICAgICAgICAgICAgICAqcFN0cisrID0gICpwVG1wU3RyKys7CiAgICAgICAgICAgICpwU3RyKysgPSAnKSc7ICAgICAgICAgICAgICAgIAogICAgICAgICAgICBicmVhazsgIAogICAgICAgIGNhc2UgMToKICAgICAgICAgICAgKnBTdHIrKyA9ICctJzsKICAgICAgICAgICAgd2hpbGUgKCpwVG1wU3RyICE9ICdcMCcpCiAgICAgICAgICAgICAgICAqcFN0cisrID0gICpwVG1wU3RyKys7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgKnBTdHIrKyA9ICctJzsKICAgICAgICAgICAgKnBTdHIrKyA9ICcgJzsKICAgICAgICAgICAgd2hpbGUgKCpwVG1wU3RyICE9ICdcMCcpCiAgICAgICAgICAgICAgICAqcFN0cisrID0gICpwVG1wU3RyKys7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgd2hpbGUgKCpwVG1wU3RyICE9ICdcMCcpCiAgICAgICAgICAgICAgICAqcFN0cisrID0gICpwVG1wU3RyKys7CiAgICAgICAgICAgICpwU3RyKysgPSAnLSc7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgd2hpbGUgKCpwVG1wU3RyICE9ICdcMCcpCiAgICAgICAgICAgICAgICAqcFN0cisrID0gICpwVG1wU3RyKys7CiAgICAgICAgICAgICpwU3RyKysgPSAnICc7CiAgICAgICAgICAgICpwU3RyKysgPSAnLSc7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHdoaWxlICgqcFRtcFN0ciAhPSAnXDAnKQogICAgICAgICAgICAgICAgKnBTdHIrKyA9ICAqcFRtcFN0cisrOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICB9CiAgICBlbHNlCiAgICAgICAgc3RyY3B5KHNEZXN0aW5hdGlvbiwgc051bWJlcik7CgogICAgLyogSWYgY2NoTnVtYmVyIGlzIHplcm8sIHRoZW4gcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIG9yIGNoYXJhY3RlcnMgCiAgICAgKiByZXF1aXJlZCB0byBob2xkIHRoZSBmb3JtYXR0ZWQgbnVtYmVyIHN0cmluZwogICAgICovCiAgICBpZiAoY2NoTnVtYmVyPT0wKQogICAgICAgIHJldFZhbCA9IHN0cmxlbihzRGVzdGluYXRpb24pICsgMTsKICAgIGVsc2UgICAgICAgICAgIAogICAgewogICAgICAgIHN0cm5jcHkgKGxwTnVtYmVyU3RyLCBzRGVzdGluYXRpb24sIGNjaE51bWJlci0xKTsKICAgICAgICAqKGxwTnVtYmVyU3RyK2NjaE51bWJlci0xKSA9ICdcMCc7ICAgLyogZW5zdXJlIHdlIGdvdCBhIE5VTEwgYXQgdGhlIGVuZCAqLwogICAgICAgIHJldFZhbCA9IHN0cmxlbihscE51bWJlclN0cik7CiAgICB9CiAgICAgICAgICAKICAgIHJldHVybiByZXRWYWw7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgR2V0TnVtYmVyRm9ybWF0VwkoS0VSTkVMMzIueHh4KQogKi8KSU5UIFdJTkFQSSBHZXROdW1iZXJGb3JtYXRXKExDSUQgbG9jYWxlLCBEV09SRCBkd2ZsYWdzLAoJCQkgICAgICAgTFBDV1NUUiBscHZhbHVlLCAgY29uc3QgTlVNQkVSRk1UVyAqIGxwRm9ybWF0LAoJCQkgICAgICAgTFBXU1RSIGxwTnVtYmVyU3RyLCBpbnQgY2NoTnVtYmVyKQp7CiBGSVhNRSgiJXM6IHN0dWIsIG5vIHJlZm9ybWF0aW5nIGRvbmVcbiIsZGVidWdzdHJfdyhscHZhbHVlKSk7CgogbHN0cmNweW5XKCBscE51bWJlclN0ciwgbHB2YWx1ZSwgY2NoTnVtYmVyICk7CiByZXR1cm4gY2NoTnVtYmVyPyBzdHJsZW5XKCBscE51bWJlclN0ciApIDogMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgICBHZXRDdXJyZW5jeUZvcm1hdEEJKEtFUk5FTDMyLjMwMikKICovCklOVCBXSU5BUEkgR2V0Q3VycmVuY3lGb3JtYXRBKExDSUQgbG9jYWxlLCBEV09SRCBkd2ZsYWdzLAoJCQkgICAgICAgTFBDU1RSIGxwdmFsdWUsICAgY29uc3QgQ1VSUkVOQ1lGTVRBICogbHBGb3JtYXQsCgkJCSAgICAgICBMUFNUUiBscEN1cnJlbmN5U3RyLCBpbnQgY2NoQ3VycmVuY3kpCnsKICAgIFVJTlQgICBuUG9zT3JkZXIsIG5OZWdPcmRlcjsKICAgIElOVCAgICByZXRWYWw7CiAgICBjaGFyICAgc0Rlc3RpbmF0aW9uWzEyOF0sIHNOZWdPcmRlcls4XSwgc1Bvc09yZGVyWzhdLCBzQ3VycmVuY3lTeW1ib2xbOF07CiAgICBjaGFyICAgKnBEZXN0aW5hdGlvbiA9IHNEZXN0aW5hdGlvbjsKICAgIGNoYXIgICBzTnVtYmVyRm9ybWF0ZWRbMTI4XTsKICAgIGNoYXIgICAqcE51bWJlckZvcm1hdGVkID0gc051bWJlckZvcm1hdGVkOwogICAgTENJRCAgIHN5c3RlbURlZmF1bHRMQ0lEOwogICAgQk9PTCAgIGJJc1Bvc2l0aXZlID0gRkFMU0UsIGJWYWxpZEZvcm1hdCA9IEZBTFNFOwogICAgZW51bSAgIE9wZXJhdGlvbnMgCiAgICB7CiAgICAgICAgVVNFX1BBUkFNRVRFUiwKICAgICAgICBVU0VfTE9DQUxFSU5GTywKICAgICAgICBVU0VfU1lTVEVNREVGQVVMVCwKICAgICAgICBSRVRVUk5fRVJST1IKICAgIH0gdXNlZF9vcGVyYXRpb247CgogICAgTlVNQkVSRk1UQSAgbnVtYmVyRm10OwoKICAgIC8qIFdoaWNoIHNvdXJjZSB3aWxsIHdlIHVzZSB0byBmb3JtYXQgdGhlIHN0cmluZyAqLwogICAgdXNlZF9vcGVyYXRpb24gPSBSRVRVUk5fRVJST1I7CiAgICBpZiAobHBGb3JtYXQgIT0gTlVMTCkKICAgIHsKICAgICAgICBpZiAoZHdmbGFncyA9PSAwKQogICAgICAgICAgICB1c2VkX29wZXJhdGlvbiA9IFVTRV9QQVJBTUVURVI7IAogICAgfQogICAgZWxzZQogICAgewogICAgICAgIGlmIChkd2ZsYWdzICYgTE9DQUxFX05PVVNFUk9WRVJSSURFKQogICAgICAgICAgICB1c2VkX29wZXJhdGlvbiA9IFVTRV9MT0NBTEVJTkZPOwogICAgICAgIGVsc2UKICAgICAgICAgICAgdXNlZF9vcGVyYXRpb24gPSBVU0VfU1lTVEVNREVGQVVMVDsKICAgIH0KCiAgICAvKiBMb2FkIHRoZSBmaWVsZHMgd2UgbmVlZCAqLwogICAgc3dpdGNoKHVzZWRfb3BlcmF0aW9uKQogICAgewogICAgY2FzZSBVU0VfTE9DQUxFSU5GTzogICAgICAgIAogICAgICAgIC8qIFNwZWNpZmljIHRvIENVUlJFTkNZRk1UQSovCiAgICAgICAgR2V0TG9jYWxlSW5mb0EobG9jYWxlLCBMT0NBTEVfSU5FR0NVUlIsIHNOZWdPcmRlciwgc2l6ZW9mKHNOZWdPcmRlcikpOwogICAgICAgIEdldExvY2FsZUluZm9BKGxvY2FsZSwgTE9DQUxFX0lDVVJSRU5DWSwgc1Bvc09yZGVyLCBzaXplb2Yoc1Bvc09yZGVyKSk7CiAgICAgICAgR2V0TG9jYWxlSW5mb0EobG9jYWxlLCBMT0NBTEVfU0NVUlJFTkNZLCBzQ3VycmVuY3lTeW1ib2wsIHNpemVvZihzQ3VycmVuY3lTeW1ib2wpKTsKICAgICAgICAKICAgICAgICBuUG9zT3JkZXIgPSBhdG9pKHNQb3NPcmRlcik7CiAgICAgICAgbk5lZ09yZGVyID0gYXRvaShzTmVnT3JkZXIpOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBVU0VfUEFSQU1FVEVSOiAgICAgICAgCiAgICAgICAgLyogU3BlY2lmaWMgdG8gQ1VSUkVOQ1lGTVRBKi8KICAgICAgICBuTmVnT3JkZXIgPSBscEZvcm1hdC0+TmVnYXRpdmVPcmRlcjsKICAgICAgICBuUG9zT3JkZXIgPSBscEZvcm1hdC0+UG9zaXRpdmVPcmRlcjsKICAgICAgICBzdHJjcHkoc0N1cnJlbmN5U3ltYm9sLCBscEZvcm1hdC0+bHBDdXJyZW5jeVN5bWJvbCk7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIFVTRV9TWVNURU1ERUZBVUxUOgogICAgICAgIHN5c3RlbURlZmF1bHRMQ0lEID0gR2V0U3lzdGVtRGVmYXVsdExDSUQoKTsgICAgICAgIAogICAgICAgIC8qIFNwZWNpZmljIHRvIENVUlJFTkNZRk1UQSovCiAgICAgICAgR2V0TG9jYWxlSW5mb0Eoc3lzdGVtRGVmYXVsdExDSUQsIExPQ0FMRV9JTkVHQ1VSUiwgc05lZ09yZGVyLCBzaXplb2Yoc05lZ09yZGVyKSk7CiAgICAgICAgR2V0TG9jYWxlSW5mb0Eoc3lzdGVtRGVmYXVsdExDSUQsIExPQ0FMRV9JQ1VSUkVOQ1ksIHNQb3NPcmRlciwgc2l6ZW9mKHNQb3NPcmRlcikpOwogICAgICAgIEdldExvY2FsZUluZm9BKHN5c3RlbURlZmF1bHRMQ0lELCBMT0NBTEVfU0NVUlJFTkNZLCBzQ3VycmVuY3lTeW1ib2wsIHNpemVvZihzQ3VycmVuY3lTeW1ib2wpKTsKICAgICAgICAKICAgICAgICBuUG9zT3JkZXIgPSBhdG9pKHNQb3NPcmRlcik7CiAgICAgICAgbk5lZ09yZGVyID0gYXRvaShzTmVnT3JkZXIpOwogICAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwogICAgICAgIHJldHVybiAwOwogICAgfQogICAgCiAgICAvKiBDb25zdHJ1Y3QgYSB0ZW1wb3JhcnkgbnVtYmVyIGZvcm1hdCBzdHJ1Y3R1cmUgKi8KICAgIGlmIChscEZvcm1hdCAhPSBOVUxMKQogICAgewogICAgICAgIG51bWJlckZtdC5OdW1EaWdpdHMgICAgID0gbHBGb3JtYXQtPk51bURpZ2l0czsKICAgICAgICBudW1iZXJGbXQuTGVhZGluZ1plcm8gICA9IGxwRm9ybWF0LT5MZWFkaW5nWmVybzsKICAgICAgICBudW1iZXJGbXQuR3JvdXBpbmcgICAgICA9IGxwRm9ybWF0LT5Hcm91cGluZzsKICAgICAgICBudW1iZXJGbXQuTmVnYXRpdmVPcmRlciA9IDA7CiAgICAgICAgbnVtYmVyRm10LmxwRGVjaW1hbFNlcCA9IGxwRm9ybWF0LT5scERlY2ltYWxTZXA7CiAgICAgICAgbnVtYmVyRm10LmxwVGhvdXNhbmRTZXAgPSBscEZvcm1hdC0+bHBUaG91c2FuZFNlcDsKICAgICAgICBiVmFsaWRGb3JtYXQgPSBUUlVFOwogICAgfQoKICAgIC8qIE1ha2UgYSBjYWxsIHRvIEdldE51bWJlckZvcm1hdEEoKSAqLwogICAgaWYgKCpscHZhbHVlID09ICctJykKICAgIHsKICAgICAgICBiSXNQb3NpdGl2ZSA9IEZBTFNFOwogICAgICAgIHJldFZhbCA9IEdldE51bWJlckZvcm1hdEEobG9jYWxlLDAsbHB2YWx1ZSsxLChiVmFsaWRGb3JtYXQpPyZudW1iZXJGbXQ6TlVMTCxwTnVtYmVyRm9ybWF0ZWQsMTI4KTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICBiSXNQb3NpdGl2ZSA9IFRSVUU7CiAgICAgICAgcmV0VmFsID0gR2V0TnVtYmVyRm9ybWF0QShsb2NhbGUsMCxscHZhbHVlLChiVmFsaWRGb3JtYXQpPyZudW1iZXJGbXQ6TlVMTCxwTnVtYmVyRm9ybWF0ZWQsMTI4KTsKICAgIH0KICAgICAgICAKICAgIGlmIChyZXRWYWwgPT0gMCkKICAgICAgICByZXR1cm4gMDsKCiAgICAvKiBjb25zdHJ1Y3QgdGhlIGZvcm1hdHRlZCBzdHJpbmcgKi8KICAgIGlmIChiSXNQb3NpdGl2ZSkKICAgIHsKICAgICAgICBzd2l0Y2ggKG5Qb3NPcmRlcikKICAgICAgICB7CiAgICAgICAgY2FzZSAwOiAgIC8qIFByZWZpeCwgbm8gc2VwYXJhdGlvbiAqLwogICAgICAgICAgICBzdHJjcHkgKHBEZXN0aW5hdGlvbiwgc0N1cnJlbmN5U3ltYm9sKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sIHBOdW1iZXJGb3JtYXRlZCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMTogICAvKiBTdWZmaXgsIG5vIHNlcGFyYXRpb24gKi8KICAgICAgICAgICAgc3RyY3B5IChwRGVzdGluYXRpb24sIHBOdW1iZXJGb3JtYXRlZCk7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCBzQ3VycmVuY3lTeW1ib2wpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDI6ICAgLyogUHJlZml4LCAxIGNoYXIgc2VwYXJhdGlvbiAqLwogICAgICAgICAgICBzdHJjcHkgKHBEZXN0aW5hdGlvbiwgc0N1cnJlbmN5U3ltYm9sKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sICIgIik7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCBwTnVtYmVyRm9ybWF0ZWQpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDM6ICAgLyogU3VmZml4LCAxIGNoYXIgc2VwYXJhdGlvbiAqLwogICAgICAgICAgICBzdHJjcHkgKHBEZXN0aW5hdGlvbiwgcE51bWJlckZvcm1hdGVkKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sICIgIik7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCBzQ3VycmVuY3lTeW1ib2wpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9CiAgICBlbHNlICAvKiBuZWdhdGl2ZSBudW1iZXIgKi8KICAgIHsKICAgICAgICBzd2l0Y2ggKG5OZWdPcmRlcikKICAgICAgICB7CiAgICAgICAgY2FzZSAwOiAgIC8qIGZvcm1hdDogKCQxLjEpICovCiAgICAgICAgICAgIHN0cmNweSAocERlc3RpbmF0aW9uLCAiKCIpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgc0N1cnJlbmN5U3ltYm9sKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sIHBOdW1iZXJGb3JtYXRlZCk7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCAiKSIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDE6ICAgLyogZm9ybWF0OiAtJDEuMSAqLwogICAgICAgICAgICBzdHJjcHkgKHBEZXN0aW5hdGlvbiwgIi0iKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sIHNDdXJyZW5jeVN5bWJvbCk7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCBwTnVtYmVyRm9ybWF0ZWQpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDI6ICAgLyogZm9ybWF0OiAkLTEuMSAqLwogICAgICAgICAgICBzdHJjcHkgKHBEZXN0aW5hdGlvbiwgc0N1cnJlbmN5U3ltYm9sKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sICItIik7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCBwTnVtYmVyRm9ybWF0ZWQpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDM6ICAgLyogZm9ybWF0OiAkMS4xLSAqLwogICAgICAgICAgICBzdHJjcHkgKHBEZXN0aW5hdGlvbiwgc0N1cnJlbmN5U3ltYm9sKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sIHBOdW1iZXJGb3JtYXRlZCk7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCAiLSIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDQ6ICAgLyogZm9ybWF0OiAoMS4xJCkgKi8KICAgICAgICAgICAgc3RyY3B5IChwRGVzdGluYXRpb24sICIoIik7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCBwTnVtYmVyRm9ybWF0ZWQpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgc0N1cnJlbmN5U3ltYm9sKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sICIpIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgNTogICAvKiBmb3JtYXQ6IC0xLjEkICovCiAgICAgICAgICAgIHN0cmNweSAocERlc3RpbmF0aW9uLCAiLSIpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgcE51bWJlckZvcm1hdGVkKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sIHNDdXJyZW5jeVN5bWJvbCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgNjogICAvKiBmb3JtYXQ6IDEuMS0kICovCiAgICAgICAgICAgIHN0cmNweSAocERlc3RpbmF0aW9uLCBwTnVtYmVyRm9ybWF0ZWQpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgIi0iKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sIHNDdXJyZW5jeVN5bWJvbCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgNzogICAvKiBmb3JtYXQ6IDEuMSQtICovCiAgICAgICAgICAgIHN0cmNweSAocERlc3RpbmF0aW9uLCBwTnVtYmVyRm9ybWF0ZWQpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgc0N1cnJlbmN5U3ltYm9sKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sICItIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgODogICAvKiBmb3JtYXQ6IC0xLjEgJCAqLwogICAgICAgICAgICBzdHJjcHkgKHBEZXN0aW5hdGlvbiwgIi0iKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sIHBOdW1iZXJGb3JtYXRlZCk7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCAiICIpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgc0N1cnJlbmN5U3ltYm9sKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSA5OiAgIC8qIGZvcm1hdDogLSQgMS4xICovCiAgICAgICAgICAgIHN0cmNweSAocERlc3RpbmF0aW9uLCAiLSIpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgc0N1cnJlbmN5U3ltYm9sKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sICIgIik7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCBwTnVtYmVyRm9ybWF0ZWQpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDEwOiAgIC8qIGZvcm1hdDogMS4xICQtICovCiAgICAgICAgICAgIHN0cmNweSAocERlc3RpbmF0aW9uLCBwTnVtYmVyRm9ybWF0ZWQpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgIiAiKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sIHNDdXJyZW5jeVN5bWJvbCk7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCAiLSIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDExOiAgIC8qIGZvcm1hdDogJCAxLjEtICovCiAgICAgICAgICAgIHN0cmNweSAocERlc3RpbmF0aW9uLCBzQ3VycmVuY3lTeW1ib2wpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgIiAiKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sIHBOdW1iZXJGb3JtYXRlZCk7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCAiLSIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDEyOiAgIC8qIGZvcm1hdDogJCAtMS4xICovCiAgICAgICAgICAgIHN0cmNweSAocERlc3RpbmF0aW9uLCBzQ3VycmVuY3lTeW1ib2wpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgIiAiKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sICItIik7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCBwTnVtYmVyRm9ybWF0ZWQpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDEzOiAgIC8qIGZvcm1hdDogMS4xLSAkICovCiAgICAgICAgICAgIHN0cmNweSAocERlc3RpbmF0aW9uLCBwTnVtYmVyRm9ybWF0ZWQpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgIi0iKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sICIgIik7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCBzQ3VycmVuY3lTeW1ib2wpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDE0OiAgIC8qIGZvcm1hdDogKCQgMS4xKSAqLwogICAgICAgICAgICBzdHJjcHkgKHBEZXN0aW5hdGlvbiwgIigiKTsgCiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCBzQ3VycmVuY3lTeW1ib2wpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgIiAiKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sIHBOdW1iZXJGb3JtYXRlZCk7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCAiKSIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDE1OiAgIC8qIGZvcm1hdDogKDEuMSAkKSAqLwogICAgICAgICAgICBzdHJjcHkgKHBEZXN0aW5hdGlvbiwgIigiKTsgCiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCBwTnVtYmVyRm9ybWF0ZWQpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgIiAiKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sIHNDdXJyZW5jeVN5bWJvbCk7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCAiKSIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9CgogICAgaWYgKGNjaEN1cnJlbmN5ID09IDApCiAgICAgICAgcmV0dXJuIHN0cmxlbihwRGVzdGluYXRpb24pICsgMTsKCiAgICBlbHNlCiAgICB7CiAgICAgICAgc3RybmNweSAobHBDdXJyZW5jeVN0ciwgcERlc3RpbmF0aW9uLCBjY2hDdXJyZW5jeS0xKTsKICAgICAgICAqKGxwQ3VycmVuY3lTdHIrY2NoQ3VycmVuY3ktMSkgPSAnXDAnOyAgIC8qIGVuc3VyZSB3ZSBnb3QgYSBOVUxMIGF0IHRoZSBlbmQgKi8KICAgICAgICByZXR1cm4gIHN0cmxlbihscEN1cnJlbmN5U3RyKTsKICAgIH0gICAgCn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgR2V0Q3VycmVuY3lGb3JtYXRXCShLRVJORUwzMi4zMDMpCiAqLwpJTlQgV0lOQVBJIEdldEN1cnJlbmN5Rm9ybWF0VyhMQ0lEIGxvY2FsZSwgRFdPUkQgZHdmbGFncywKCQkJICAgICAgIExQQ1dTVFIgbHB2YWx1ZSwgICBjb25zdCBDVVJSRU5DWUZNVFcgKiBscEZvcm1hdCwKCQkJICAgICAgIExQV1NUUiBscEN1cnJlbmN5U3RyLCBpbnQgY2NoQ3VycmVuY3kpCnsKICAgIEZJWE1FKCJUaGlzIEFQSSBmdW5jdGlvbiBpcyBOT1QgaW1wbGVtZW50ZWQgIVxuIik7CiAgICByZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJT0xFMk5MU19DaGVja0xvY2FsZQlbaW50ZXJuXQogKi8gCnN0YXRpYyBMQ0lEIE9MRTJOTFNfQ2hlY2tMb2NhbGUgKExDSUQgbG9jYWxlKQp7CglpZiAoIWxvY2FsZSkgCgl7IGxvY2FsZSA9IExPQ0FMRV9TWVNURU1fREVGQVVMVDsKCX0KICAKCWlmIChsb2NhbGUgPT0gTE9DQUxFX1NZU1RFTV9ERUZBVUxUKSAKICAJeyByZXR1cm4gR2V0U3lzdGVtRGVmYXVsdExDSUQoKTsKCX0gCgllbHNlIGlmIChsb2NhbGUgPT0gTE9DQUxFX1VTRVJfREVGQVVMVCkgCgl7IHJldHVybiBHZXRVc2VyRGVmYXVsdExDSUQoKTsKCX0KCWVsc2UKCXsgcmV0dXJuIGxvY2FsZTsKCX0KfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlHZXRUaW1lRm9ybWF0QQlbS0VSTkVMMzIuNDIyXQogKiBNYWtlcyBhbiBBU0NJSSBzdHJpbmcgb2YgdGhlIHRpbWUKICoKICogRm9ybWF0cyBkYXRlIGFjY29yZGluZyB0byBmb3JtYXQsICBvciBsb2NhbGUgZGVmYXVsdCBpZiBmb3JtYXQgaXMKICogTlVMTC4gVGhlIGZvcm1hdCBjb25zaXN0cyBvZiBsaXRlcmFsIGNoYXJhY3RlcnMgYW5kIGZpZWxkcyBhcyBmb2xsb3dzOgogKgogKiBoICBob3VycyB3aXRoIG5vIGxlYWRpbmcgemVybyAoMTItaG91cikKICogaGggaG91cnMgd2l0aCBmdWxsIHR3byBkaWdpdHMKICogSCAgaG91cnMgd2l0aCBubyBsZWFkaW5nIHplcm8gKDI0LWhvdXIpCiAqIEhIIGhvdXJzIHdpdGggZnVsbCB0d28gZGlnaXRzCiAqIG0gIG1pbnV0ZXMgd2l0aCBubyBsZWFkaW5nIHplcm8KICogbW0gbWludXRlcyB3aXRoIGZ1bGwgdHdvIGRpZ2l0cwogKiBzICBzZWNvbmRzIHdpdGggbm8gbGVhZGluZyB6ZXJvCiAqIHNzIHNlY29uZHMgd2l0aCBmdWxsIHR3byBkaWdpdHMKICogdCAgdGltZSBtYXJrZXIgKEEgb3IgUCkKICogdHQgdGltZSBtYXJrZXIgKEFNLCBQTSkKICoKICovCklOVCBXSU5BUEkgCkdldFRpbWVGb3JtYXRBKExDSUQgbG9jYWxlLCAgICAgICAgLyogW2luXSAgKi8KCSAgICAgICBEV09SRCBmbGFncywgICAgICAgIC8qIFtpbl0gICovCgkgICAgICAgTFBTWVNURU1USU1FIHh0aW1lLCAvKiBbaW5dICAqLyAKCSAgICAgICBMUENTVFIgZm9ybWF0LCAgICAgIC8qIFtpbl0gICovCgkgICAgICAgTFBTVFIgdGltZXN0ciwgICAgICAvKiBbb3V0XSAqLwoJICAgICAgIElOVCB0aW1lbGVuICAgICAgICAgLyogW2luXSAgKi8pIAp7IGNoYXIgZm9ybWF0X2J1Zls0MF07CiAgTFBDU1RSIHRoaXNmb3JtYXQ7CiAgU1lTVEVNVElNRSB0OwogIExQU1lTVEVNVElNRSB0aGlzdGltZTsKICBMQ0lEIHRoaXNsb2NhbGU9MDsKICBEV09SRCB0aGlzZmxhZ3M9TE9DQUxFX1NUSU1FRk9STUFUOyAvKiBzdGFuZGFydCB0aW1lZm9ybWF0ICovCiAgSU5UIHJldDsKICAgIAogIFRSQUNFKCJHZXRUaW1lRm9ybWF0KDB4JTA0bHgsMHglMDhseCwlcCwlcywlcCwlZClcbiIsbG9jYWxlLGZsYWdzLHh0aW1lLGZvcm1hdCx0aW1lc3RyLHRpbWVsZW4pOwoKICB0aGlzbG9jYWxlID0gT0xFMk5MU19DaGVja0xvY2FsZSAoIGxvY2FsZSApOwoKICBpZiAoIGZsYWdzICYgKFRJTUVfTk9USU1FTUFSS0VSIHwgVElNRV9GT1JDRTI0SE9VUkZPUk1BVCApKQogIHsgRklYTUUoIlRJTUVfTk9USU1FTUFSS0VSIG9yIFRJTUVfRk9SQ0UyNEhPVVJGT1JNQVQgbm90IGltcGxlbWVudGVkXG4iKTsKICB9CiAgCiAgZmxhZ3MgJj0gKFRJTUVfTk9TRUNPTkRTIHwgVElNRV9OT01JTlVURVNPUlNFQ09ORFMpOyAvKiBtYXNrIGZvciBPTEVfR2V0Rm9ybWF0QSovCgogIGlmIChmb3JtYXQgPT0gTlVMTCkgCiAgeyBpZiAoZmxhZ3MgJiBMT0NBTEVfTk9VU0VST1ZFUlJJREUpICAvKnVzZSBzeXN0ZW0gZGVmYXVsdCovCiAgICB7IHRoaXNsb2NhbGUgPSBHZXRTeXN0ZW1EZWZhdWx0TENJRCgpOwogICAgfQogICAgR2V0TG9jYWxlSW5mb0EodGhpc2xvY2FsZSwgdGhpc2ZsYWdzLCBmb3JtYXRfYnVmLCBzaXplb2YoZm9ybWF0X2J1ZikpOwogICAgdGhpc2Zvcm1hdCA9IGZvcm1hdF9idWY7CiAgfQogIGVsc2UgCiAgeyB0aGlzZm9ybWF0ID0gZm9ybWF0OwogIH0KICAKICBpZiAoeHRpbWUgPT0gTlVMTCkgLyogTlVMTCBtZWFucyB1c2UgdGhlIGN1cnJlbnQgbG9jYWwgdGltZSovCiAgeyBHZXRMb2NhbFRpbWUoJnQpOwogICAgdGhpc3RpbWUgPSAmdDsKICB9IAogIGVsc2UKICB7IHRoaXN0aW1lID0geHRpbWU7CiAgLyogQ2hlY2sgdGhhdCBob3VyLG1pbiBhbmQgc2VjIGlzIGluIHJhbmdlICovCiAgfQogIHJldCA9IE9MRV9HZXRGb3JtYXRBKHRoaXNsb2NhbGUsIHRoaXNmbGFncywgZmxhZ3MsIHRoaXN0aW1lLCB0aGlzZm9ybWF0LAogIAkJCSB0aW1lc3RyLCB0aW1lbGVuKTsKICByZXR1cm4gcmV0Owp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJR2V0VGltZUZvcm1hdFcJW0tFUk5FTDMyLjQyM10KICogTWFrZXMgYSBVbmljb2RlIHN0cmluZyBvZiB0aGUgdGltZQogKi8KSU5UIFdJTkFQSSAKR2V0VGltZUZvcm1hdFcoTENJRCBsb2NhbGUsICAgICAgICAvKiBbaW5dICAqLwoJICAgICAgIERXT1JEIGZsYWdzLCAgICAgICAgLyogW2luXSAgKi8KCSAgICAgICBMUFNZU1RFTVRJTUUgeHRpbWUsIC8qIFtpbl0gICovIAoJICAgICAgIExQQ1dTVFIgZm9ybWF0LCAgICAgLyogW2luXSAgKi8KCSAgICAgICBMUFdTVFIgdGltZXN0ciwgICAgIC8qIFtvdXRdICovCgkgICAgICAgSU5UIHRpbWVsZW4gICAgICAgICAvKiBbaW5dICAqLykgCnsJV0NIQVIgZm9ybWF0X2J1Zls0MF07CglMUENXU1RSIHRoaXNmb3JtYXQ7CglTWVNURU1USU1FIHQ7CglMUFNZU1RFTVRJTUUgdGhpc3RpbWU7CglMQ0lEIHRoaXNsb2NhbGU9MDsKCURXT1JEIHRoaXNmbGFncz1MT0NBTEVfU1RJTUVGT1JNQVQ7IC8qIHN0YW5kYXJ0IHRpbWVmb3JtYXQgKi8KCUlOVCByZXQ7CgkgICAgCglUUkFDRSgiR2V0VGltZUZvcm1hdCgweCUwNGx4LDB4JTA4bHgsJXAsJXMsJXAsJWQpXG4iLGxvY2FsZSxmbGFncywKCXh0aW1lLGRlYnVnc3RyX3coZm9ybWF0KSx0aW1lc3RyLHRpbWVsZW4pOwoKCXRoaXNsb2NhbGUgPSBPTEUyTkxTX0NoZWNrTG9jYWxlICggbG9jYWxlICk7CgoJaWYgKCBmbGFncyAmIChUSU1FX05PVElNRU1BUktFUiB8IFRJTUVfRk9SQ0UyNEhPVVJGT1JNQVQgKSkKCXsgRklYTUUoIlRJTUVfTk9USU1FTUFSS0VSIG9yIFRJTUVfRk9SQ0UyNEhPVVJGT1JNQVQgbm90IGltcGxlbWVudGVkXG4iKTsKCX0KICAKCWZsYWdzICY9IChUSU1FX05PU0VDT05EUyB8IFRJTUVfTk9NSU5VVEVTT1JTRUNPTkRTKTsgLyogbWFzayBmb3IgT0xFX0dldEZvcm1hdEEqLwoKCWlmIChmb3JtYXQgPT0gTlVMTCkgCgl7IGlmIChmbGFncyAmIExPQ0FMRV9OT1VTRVJPVkVSUklERSkgIC8qdXNlIHN5c3RlbSBkZWZhdWx0Ki8KCSAgeyB0aGlzbG9jYWxlID0gR2V0U3lzdGVtRGVmYXVsdExDSUQoKTsKCSAgfQoJICBHZXRMb2NhbGVJbmZvVyh0aGlzbG9jYWxlLCB0aGlzZmxhZ3MsIGZvcm1hdF9idWYsIDQwKTsKCSAgdGhpc2Zvcm1hdCA9IGZvcm1hdF9idWY7Cgl9CSAgCgllbHNlIAoJeyB0aGlzZm9ybWF0ID0gZm9ybWF0OwoJfQogCglpZiAoeHRpbWUgPT0gTlVMTCkgLyogTlVMTCBtZWFucyB1c2UgdGhlIGN1cnJlbnQgbG9jYWwgdGltZSovCgl7IEdldExvY2FsVGltZSgmdCk7CgkgIHRoaXN0aW1lID0gJnQ7Cgl9IAoJZWxzZQoJeyB0aGlzdGltZSA9IHh0aW1lOwoJfQoKCXJldCA9IE9MRV9HZXRGb3JtYXRXKHRoaXNsb2NhbGUsIHRoaXNmbGFncywgZmxhZ3MsIHRoaXN0aW1lLCB0aGlzZm9ybWF0LAogIAkJCSB0aW1lc3RyLCB0aW1lbGVuKTsKCXJldHVybiByZXQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUVudW1DYWxlbmRhckluZm9BCVtLRVJORUwzMi4xOTZdCiAqLwpCT09MIFdJTkFQSSBFbnVtQ2FsZW5kYXJJbmZvQSgKCUNBTElORk9fRU5VTVBST0NBIGNhbGluZm9wcm9jLExDSUQgbG9jYWxlLENBTElEIGNhbGVuZGFyLENBTFRZUEUgY2FsdHlwZQopIHsKCUZJWE1FKCIoJXAsMHglMDRseCwweCUwOGx4LDB4JTA4bHgpLHN0dWIhXG4iLGNhbGluZm9wcm9jLGxvY2FsZSxjYWxlbmRhcixjYWx0eXBlKTsKCXJldHVybiBGQUxTRTsKfQo=