LyoKICoJTmF0aW9uYWwgTGFuZ3VhZ2UgU3VwcG9ydCBsaWJyYXJ5CiAqCiAqCUNvcHlyaWdodCAxOTk1CU1hcnRpbiB2b24gTG9ld2lzCiAqICAgICAgQ29weXJpZ2h0IDE5OTggIERhdmlkIExlZSBMYW1iZXJ0CiAqICAgICAgQ29weXJpZ2h0IDIwMDAgIEp1bGlvIEPpc2FyIEfhenF1ZXoKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCiAqLwoKI2luY2x1ZGUgImNvbmZpZy5oIgojaW5jbHVkZSAid2luZS9wb3J0LmgiCgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8Y3R5cGUuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8bG9jYWxlLmg+CgojaW5jbHVkZSAid2luZGVmLmgiCiNpbmNsdWRlICJ3aW5iYXNlLmgiCiNpbmNsdWRlICJ3aW5nZGkuaCIKI2luY2x1ZGUgIndpbnVzZXIuaCIKI2luY2x1ZGUgIm50ZGRrLmgiCiNpbmNsdWRlICJ3aW5lL3VuaWNvZGUuaCIKI2luY2x1ZGUgIndpbnZlci5oIgojaW5jbHVkZSAid2lubmxzLmgiCiNpbmNsdWRlICJ3aW5yZWcuaCIKI2luY2x1ZGUgIndpbmVycm9yLmgiCiNpbmNsdWRlICJ3aW5lL2RlYnVnLmgiCgpXSU5FX0RFRkFVTFRfREVCVUdfQ0hBTk5FTChubHMpOwoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUNvbnZlcnREZWZhdWx0TG9jYWxlIChLRVJORUwzMi5AKQogKi8KTENJRCBXSU5BUEkgQ29udmVydERlZmF1bHRMb2NhbGUgKExDSUQgbGNpZCkKewlzd2l0Y2ggKGxjaWQpCgl7ICBjYXNlIExPQ0FMRV9TWVNURU1fREVGQVVMVDoKCSAgICAgcmV0dXJuIEdldFN5c3RlbURlZmF1bHRMQ0lEKCk7CgkgICBjYXNlIExPQ0FMRV9VU0VSX0RFRkFVTFQ6CgkgICAgIHJldHVybiBHZXRVc2VyRGVmYXVsdExDSUQoKTsKCSAgIGNhc2UgTE9DQUxFX05FVVRSQUw6CgkgICAgIHJldHVybiBNQUtFTENJRCAoTEFOR19ORVVUUkFMLCBTVUJMQU5HX05FVVRSQUwpOwoJfQoJcmV0dXJuIE1BS0VMQU5HSUQoIFBSSU1BUllMQU5HSUQobGNpZCksIFNVQkxBTkdfTkVVVFJBTCk7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlJc1ZhbGlkTG9jYWxlCVtLRVJORUwzMi5AXQogKi8KQk9PTCBXSU5BUEkgSXNWYWxpZExvY2FsZShMQ0lEIGxjaWQsRFdPUkQgZmxhZ3MpCnsKICAgIC8qIGNoZWNrIGlmIGxhbmd1YWdlIGlzIHJlZ2lzdGVyZWQgaW4gdGhlIGtlcm5lbDMyIHJlc291cmNlcyAqLwogICAgaWYoIUZpbmRSZXNvdXJjZUV4VyhHZXRNb2R1bGVIYW5kbGVBKCJLRVJORUwzMiIpLCBSVF9TVFJJTkdXLCAoTFBDV1NUUilMT0NBTEVfSUxBTkdVQUdFLCBMT1dPUkQobGNpZCkpKQoJcmV0dXJuIEZBTFNFOwogICAgZWxzZQoJcmV0dXJuIFRSVUU7Cn0KCnN0YXRpYyBCT09MIENBTExCQUNLIEVudW1SZXNvdXJjZUxhbmd1YWdlc1Byb2NXKEhNT0RVTEUgaE1vZHVsZSwgTFBDV1NUUiB0eXBlLAoJCUxQQ1dTVFIgbmFtZSwgV09SRCBMYW5nSUQsIExPTkcgbFBhcmFtKQp7CiAgICBDSEFSIGJ1ZkFbMjBdOwogICAgV0NIQVIgYnVmV1syMF07CiAgICBMT0NBTEVfRU5VTVBST0NXIGxwZm5Mb2NhbGVFbnVtID0gKExPQ0FMRV9FTlVNUFJPQ1cpbFBhcmFtOwogICAgc3ByaW50ZihidWZBLCAiJTA4eCIsIChVSU5UKUxhbmdJRCk7CiAgICBNdWx0aUJ5dGVUb1dpZGVDaGFyKENQX0FDUCwgMCwgYnVmQSwgLTEsIGJ1ZlcsIHNpemVvZihidWZXKS9zaXplb2YoYnVmV1swXSkpOwogICAgcmV0dXJuIGxwZm5Mb2NhbGVFbnVtKGJ1ZlcpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlFbnVtU3lzdGVtTG9jYWxlc1cJW0tFUk5FTDMyLkBdCiAqLwpCT09MIFdJTkFQSSBFbnVtU3lzdGVtTG9jYWxlc1coIExPQ0FMRV9FTlVNUFJPQ1cgbHBmbkxvY2FsZUVudW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGZsYWdzICkKewogICAgVFJBQ0UoIiglcCwlMDhseClcbiIsIGxwZm5Mb2NhbGVFbnVtLGZsYWdzKTsKCiAgICBFbnVtUmVzb3VyY2VMYW5ndWFnZXNXKEdldE1vZHVsZUhhbmRsZUEoIktFUk5FTDMyIiksIFJUX1NUUklOR1csCgkgICAgKExQQ1dTVFIpTE9DQUxFX0lMQU5HVUFHRSwgRW51bVJlc291cmNlTGFuZ3VhZ2VzUHJvY1csCgkgICAgKExPTkcpbHBmbkxvY2FsZUVudW0pOwoKICAgIHJldHVybiBUUlVFOwp9CgpzdGF0aWMgQk9PTCBDQUxMQkFDSyBFbnVtUmVzb3VyY2VMYW5ndWFnZXNQcm9jQShITU9EVUxFIGhNb2R1bGUsIExQQ1NUUiB0eXBlLAoJCUxQQ1NUUiBuYW1lLCBXT1JEIExhbmdJRCwgTE9ORyBsUGFyYW0pCnsKICAgIENIQVIgYnVmQVsyMF07CiAgICBMT0NBTEVfRU5VTVBST0NBIGxwZm5Mb2NhbGVFbnVtID0gKExPQ0FMRV9FTlVNUFJPQ0EpbFBhcmFtOwogICAgc3ByaW50ZihidWZBLCAiJTA4eCIsIChVSU5UKUxhbmdJRCk7CiAgICByZXR1cm4gbHBmbkxvY2FsZUVudW0oYnVmQSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUVudW1TeXN0ZW1Mb2NhbGVzQQlbS0VSTkVMMzIuQF0KICovCkJPT0wgV0lOQVBJIEVudW1TeXN0ZW1Mb2NhbGVzQShMT0NBTEVfRU5VTVBST0NBIGxwZm5Mb2NhbGVFbnVtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGZsYWdzKQp7CiAgICBUUkFDRSgiKCVwLCUwOGx4KVxuIiwgbHBmbkxvY2FsZUVudW0sZmxhZ3MpOwoKICAgIEVudW1SZXNvdXJjZUxhbmd1YWdlc0EoR2V0TW9kdWxlSGFuZGxlQSgiS0VSTkVMMzIiKSwgUlRfU1RSSU5HQSwKCSAgICAoTFBDU1RSKUxPQ0FMRV9JTEFOR1VBR0UsIEVudW1SZXNvdXJjZUxhbmd1YWdlc1Byb2NBLAoJICAgIChMT05HKWxwZm5Mb2NhbGVFbnVtKTsKCiAgICByZXR1cm4gVFJVRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBWZXJMYW5ndWFnZU5hbWVBICAgICAgICAgICAgICBbS0VSTkVMMzIuQF0KICovCkRXT1JEIFdJTkFQSSBWZXJMYW5ndWFnZU5hbWVBKCBVSU5UIHdMYW5nLCBMUFNUUiBzekxhbmcsIFVJTlQgblNpemUgKQp7CiAgICBpZighc3pMYW5nKQoJcmV0dXJuIDA7CgogICAgcmV0dXJuIEdldExvY2FsZUluZm9BKE1BS0VMQ0lEKHdMYW5nLCBTT1JUX0RFRkFVTFQpLCBMT0NBTEVfU0VOR0xBTkdVQUdFLCBzekxhbmcsIG5TaXplKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBWZXJMYW5ndWFnZU5hbWVXICAgICAgICAgICAgICBbS0VSTkVMMzIuQF0KICovCkRXT1JEIFdJTkFQSSBWZXJMYW5ndWFnZU5hbWVXKCBVSU5UIHdMYW5nLCBMUFdTVFIgc3pMYW5nLCBVSU5UIG5TaXplICkKewogICAgaWYoIXN6TGFuZykKCXJldHVybiAwOwoKICAgIHJldHVybiBHZXRMb2NhbGVJbmZvVyhNQUtFTENJRCh3TGFuZywgU09SVF9ERUZBVUxUKSwgTE9DQUxFX1NFTkdMQU5HVUFHRSwgc3pMYW5nLCBuU2l6ZSk7Cn0KCgpzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBMQ01fVW5pY29kZV9MVVRbXSA9IHsKICA2ICAgICAgLCAgIDMsIC8qICAgLSAgIDEgKi8KICA2ICAgICAgLCAgIDQsIC8qICAgLSAgIDIgKi8KICA2ICAgICAgLCAgIDUsIC8qICAgLSAgIDMgKi8KICA2ICAgICAgLCAgIDYsIC8qICAgLSAgIDQgKi8KICA2ICAgICAgLCAgIDcsIC8qICAgLSAgIDUgKi8KICA2ICAgICAgLCAgIDgsIC8qICAgLSAgIDYgKi8KICA2ICAgICAgLCAgIDksIC8qICAgLSAgIDcgKi8KICA2ICAgICAgLCAgMTAsIC8qICAgLSAgIDggKi8KICA3ICAgICAgLCAgIDUsIC8qICAgLSAgIDkgKi8KICA3ICAgICAgLCAgIDYsIC8qICAgLSAgMTAgKi8KICA3ICAgICAgLCAgIDcsIC8qICAgLSAgMTEgKi8KICA3ICAgICAgLCAgIDgsIC8qICAgLSAgMTIgKi8KICA3ICAgICAgLCAgIDksIC8qICAgLSAgMTMgKi8KICA2ICAgICAgLCAgMTEsIC8qICAgLSAgMTQgKi8KICA2ICAgICAgLCAgMTIsIC8qICAgLSAgMTUgKi8KICA2ICAgICAgLCAgMTMsIC8qICAgLSAgMTYgKi8KICA2ICAgICAgLCAgMTQsIC8qICAgLSAgMTcgKi8KICA2ICAgICAgLCAgMTUsIC8qICAgLSAgMTggKi8KICA2ICAgICAgLCAgMTYsIC8qICAgLSAgMTkgKi8KICA2ICAgICAgLCAgMTcsIC8qICAgLSAgMjAgKi8KICA2ICAgICAgLCAgMTgsIC8qICAgLSAgMjEgKi8KICA2ICAgICAgLCAgMTksIC8qICAgLSAgMjIgKi8KICA2ICAgICAgLCAgMjAsIC8qICAgLSAgMjMgKi8KICA2ICAgICAgLCAgMjEsIC8qICAgLSAgMjQgKi8KICA2ICAgICAgLCAgMjIsIC8qICAgLSAgMjUgKi8KICA2ICAgICAgLCAgMjMsIC8qICAgLSAgMjYgKi8KICA2ICAgICAgLCAgMjQsIC8qICAgLSAgMjcgKi8KICA2ICAgICAgLCAgMjUsIC8qICAgLSAgMjggKi8KICA2ICAgICAgLCAgMjYsIC8qICAgLSAgMjkgKi8KICA2ICAgICAgLCAgMjcsIC8qICAgLSAgMzAgKi8KICA2ICAgICAgLCAgMjgsIC8qICAgLSAgMzEgKi8KICA3ICAgICAgLCAgIDIsIC8qICAgLSAgMzIgKi8KICA3ICAgICAgLCAgMjgsIC8qICEgLSAgMzMgKi8KICA3ICAgICAgLCAgMjksIC8qICIgLSAgMzQgKi8gLyogIiAqLwogIDcgICAgICAsICAzMSwgLyogIyAtICAzNSAqLwogIDcgICAgICAsICAzMywgLyogJCAtICAzNiAqLwogIDcgICAgICAsICAzNSwgLyogJSAtICAzNyAqLwogIDcgICAgICAsICAzNywgLyogJiAtICAzOCAqLwogIDYgICAgICAsIDEyOCwgLyogJyAtICAzOSAqLwogIDcgICAgICAsICAzOSwgLyogKCAtICA0MCAqLwogIDcgICAgICAsICA0MiwgLyogKSAtICA0MSAqLwogIDcgICAgICAsICA0NSwgLyogKiAtICA0MiAqLwogIDggICAgICAsICAgMywgLyogKyAtICA0MyAqLwogIDcgICAgICAsICA0NywgLyogLCAtICA0NCAqLwogIDYgICAgICAsIDEzMCwgLyogLSAtICA0NSAqLwogIDcgICAgICAsICA1MSwgLyogLiAtICA0NiAqLwogIDcgICAgICAsICA1MywgLyogLyAtICA0NyAqLwogMTIgICAgICAsICAgMywgLyogMCAtICA0OCAqLwogMTIgICAgICAsICAzMywgLyogMSAtICA0OSAqLwogMTIgICAgICAsICA1MSwgLyogMiAtICA1MCAqLwogMTIgICAgICAsICA3MCwgLyogMyAtICA1MSAqLwogMTIgICAgICAsICA4OCwgLyogNCAtICA1MiAqLwogMTIgICAgICAsIDEwNiwgLyogNSAtICA1MyAqLwogMTIgICAgICAsIDEyNSwgLyogNiAtICA1NCAqLwogMTIgICAgICAsIDE0NCwgLyogNyAtICA1NSAqLwogMTIgICAgICAsIDE2MiwgLyogOCAtICA1NiAqLwogMTIgICAgICAsIDE4MCwgLyogOSAtICA1NyAqLwogIDcgICAgICAsICA1NSwgLyogOiAtICA1OCAqLwogIDcgICAgICAsICA1OCwgLyogOyAtICA1OSAqLwogIDggICAgICAsICAxNCwgLyogPCAtICA2MCAqLwogIDggICAgICAsICAxOCwgLyogPSAtICA2MSAqLwogIDggICAgICAsICAyMCwgLyogPiAtICA2MiAqLwogIDcgICAgICAsICA2MCwgLyogPyAtICA2MyAqLwogIDcgICAgICAsICA2MiwgLyogQCAtICA2NCAqLwogMTQgICAgICAsICAgMiwgLyogQSAtICA2NSAqLwogMTQgICAgICAsICAgOSwgLyogQiAtICA2NiAqLwogMTQgICAgICAsICAxMCwgLyogQyAtICA2NyAqLwogMTQgICAgICAsICAyNiwgLyogRCAtICA2OCAqLwogMTQgICAgICAsICAzMywgLyogRSAtICA2OSAqLwogMTQgICAgICAsICAzNSwgLyogRiAtICA3MCAqLwogMTQgICAgICAsICAzNywgLyogRyAtICA3MSAqLwogMTQgICAgICAsICA0NCwgLyogSCAtICA3MiAqLwogMTQgICAgICAsICA1MCwgLyogSSAtICA3MyAqLwogMTQgICAgICAsICA1MywgLyogSiAtICA3NCAqLwogMTQgICAgICAsICA1NCwgLyogSyAtICA3NSAqLwogMTQgICAgICAsICA3MiwgLyogTCAtICA3NiAqLwogMTQgICAgICAsICA4MSwgLyogTSAtICA3NyAqLwogMTQgICAgICAsIDExMiwgLyogTiAtICA3OCAqLwogMTQgICAgICAsIDEyNCwgLyogTyAtICA3OSAqLwogMTQgICAgICAsIDEyNiwgLyogUCAtICA4MCAqLwogMTQgICAgICAsIDEzNywgLyogUSAtICA4MSAqLwogMTQgICAgICAsIDEzOCwgLyogUiAtICA4MiAqLwogMTQgICAgICAsIDE0NSwgLyogUyAtICA4MyAqLwogMTQgICAgICAsIDE1MywgLyogVCAtICA4NCAqLwogMTQgICAgICAsIDE1OSwgLyogVSAtICA4NSAqLwogMTQgICAgICAsIDE2MiwgLyogViAtICA4NiAqLwogMTQgICAgICAsIDE2NCwgLyogVyAtICA4NyAqLwogMTQgICAgICAsIDE2NiwgLyogWCAtICA4OCAqLwogMTQgICAgICAsIDE2NywgLyogWSAtICA4OSAqLwogMTQgICAgICAsIDE2OSwgLyogWiAtICA5MCAqLwogIDcgICAgICAsICA2MywgLyogWyAtICA5MSAqLwogIDcgICAgICAsICA2NSwgLyogXCAtICA5MiAqLwogIDcgICAgICAsICA2NiwgLyogXSAtICA5MyAqLwogIDcgICAgICAsICA2NywgLyogXiAtICA5NCAqLwogIDcgICAgICAsICA2OCwgLyogXyAtICA5NSAqLwogIDcgICAgICAsICA3MiwgLyogYCAtICA5NiAqLwogMTQgICAgICAsICAgMiwgLyogYSAtICA5NyAqLwogMTQgICAgICAsICAgOSwgLyogYiAtICA5OCAqLwogMTQgICAgICAsICAxMCwgLyogYyAtICA5OSAqLwogMTQgICAgICAsICAyNiwgLyogZCAtIDEwMCAqLwogMTQgICAgICAsICAzMywgLyogZSAtIDEwMSAqLwogMTQgICAgICAsICAzNSwgLyogZiAtIDEwMiAqLwogMTQgICAgICAsICAzNywgLyogZyAtIDEwMyAqLwogMTQgICAgICAsICA0NCwgLyogaCAtIDEwNCAqLwogMTQgICAgICAsICA1MCwgLyogaSAtIDEwNSAqLwogMTQgICAgICAsICA1MywgLyogaiAtIDEwNiAqLwogMTQgICAgICAsICA1NCwgLyogayAtIDEwNyAqLwogMTQgICAgICAsICA3MiwgLyogbCAtIDEwOCAqLwogMTQgICAgICAsICA4MSwgLyogbSAtIDEwOSAqLwogMTQgICAgICAsIDExMiwgLyogbiAtIDExMCAqLwogMTQgICAgICAsIDEyNCwgLyogbyAtIDExMSAqLwogMTQgICAgICAsIDEyNiwgLyogcCAtIDExMiAqLwogMTQgICAgICAsIDEzNywgLyogcSAtIDExMyAqLwogMTQgICAgICAsIDEzOCwgLyogciAtIDExNCAqLwogMTQgICAgICAsIDE0NSwgLyogcyAtIDExNSAqLwogMTQgICAgICAsIDE1MywgLyogdCAtIDExNiAqLwogMTQgICAgICAsIDE1OSwgLyogdSAtIDExNyAqLwogMTQgICAgICAsIDE2MiwgLyogdiAtIDExOCAqLwogMTQgICAgICAsIDE2NCwgLyogdyAtIDExOSAqLwogMTQgICAgICAsIDE2NiwgLyogeCAtIDEyMCAqLwogMTQgICAgICAsIDE2NywgLyogeSAtIDEyMSAqLwogMTQgICAgICAsIDE2OSwgLyogeiAtIDEyMiAqLwogIDcgICAgICAsICA3NCwgLyogeyAtIDEyMyAqLwogIDcgICAgICAsICA3NiwgLyogfCAtIDEyNCAqLwogIDcgICAgICAsICA3OCwgLyogfSAtIDEyNSAqLwogIDcgICAgICAsICA4MCwgLyogfiAtIDEyNiAqLwogIDYgICAgICAsICAyOSwgLyogfyAtIDEyNyAqLwogIDYgICAgICAsICAzMCwgLyoggCAtIDEyOCAqLwogIDYgICAgICAsICAzMSwgLyoggSAtIDEyOSAqLwogIDcgICAgICAsIDEyMywgLyoggiAtIDEzMCAqLwogMTQgICAgICAsICAzNSwgLyoggyAtIDEzMSAqLwogIDcgICAgICAsIDEyNywgLyoghCAtIDEzMiAqLwogMTAgICAgICAsICAyMSwgLyoghSAtIDEzMyAqLwogMTAgICAgICAsICAxNSwgLyoghiAtIDEzNCAqLwogMTAgICAgICAsICAxNiwgLyoghyAtIDEzNSAqLwogIDcgICAgICAsICA2NywgLyogiCAtIDEzNiAqLwogMTAgICAgICAsICAyMiwgLyogiSAtIDEzNyAqLwogMTQgICAgICAsIDE0NSwgLyogiiAtIDEzOCAqLwogIDcgICAgICAsIDEzNiwgLyogiyAtIDEzOSAqLwogMTQgKyAxNiAsIDEyNCwgLyogjCAtIDE0MCAqLwogIDYgICAgICAsICA0MywgLyogjSAtIDE0MSAqLwogIDYgICAgICAsICA0NCwgLyogjiAtIDE0MiAqLwogIDYgICAgICAsICA0NSwgLyogjyAtIDE0MyAqLwogIDYgICAgICAsICA0NiwgLyogkCAtIDE0NCAqLwogIDcgICAgICAsIDEyMSwgLyogkSAtIDE0NSAqLwogIDcgICAgICAsIDEyMiwgLyogkiAtIDE0NiAqLwogIDcgICAgICAsIDEyNSwgLyogkyAtIDE0NyAqLwogIDcgICAgICAsIDEyNiwgLyoglCAtIDE0OCAqLwogMTAgICAgICAsICAxNywgLyoglSAtIDE0OSAqLwogIDYgICAgICAsIDEzNywgLyogliAtIDE1MCAqLwogIDYgICAgICAsIDEzOSwgLyoglyAtIDE1MSAqLwogIDcgICAgICAsICA5MywgLyogmCAtIDE1MiAqLwogMTQgICAgICAsIDE1NiwgLyogmSAtIDE1MyAqLwogMTQgICAgICAsIDE0NSwgLyogmiAtIDE1NCAqLwogIDcgICAgICAsIDEzNywgLyogmyAtIDE1NSAqLwogMTQgKyAxNiAsIDEyNCwgLyognCAtIDE1NiAqLwogIDYgICAgICAsICA1OSwgLyognSAtIDE1NyAqLwogIDYgICAgICAsICA2MCwgLyogniAtIDE1OCAqLwogMTQgICAgICAsIDE2NywgLyognyAtIDE1OSAqLwogIDcgICAgICAsICAgNCwgLyogoCAtIDE2MCAqLwogIDcgICAgICAsICA4MSwgLyogoSAtIDE2MSAqLwogMTAgICAgICAsICAgMiwgLyogoiAtIDE2MiAqLwogMTAgICAgICAsICAgMywgLyogoyAtIDE2MyAqLwogMTAgICAgICAsICAgNCwgLyogpCAtIDE2NCAqLwogMTAgICAgICAsICAgNSwgLyogpSAtIDE2NSAqLwogIDcgICAgICAsICA4MiwgLyogpiAtIDE2NiAqLwogMTAgICAgICAsICAgNiwgLyogpyAtIDE2NyAqLwogIDcgICAgICAsICA4MywgLyogqCAtIDE2OCAqLwogMTAgICAgICAsICAgNywgLyogqSAtIDE2OSAqLwogMTQgICAgICAsICAgMiwgLyogqiAtIDE3MCAqLwogIDggICAgICAsICAyNCwgLyogqyAtIDE3MSAqLwogMTAgICAgICAsICAgOCwgLyogrCAtIDE3MiAqLwogIDYgICAgICAsIDEzMSwgLyogrSAtIDE3MyAqLwogMTAgICAgICAsICAgOSwgLyogriAtIDE3NCAqLwogIDcgICAgICAsICA4NCwgLyogryAtIDE3NSAqLwogMTAgICAgICAsICAxMCwgLyogsCAtIDE3NiAqLwogIDggICAgICAsICAyMywgLyogsSAtIDE3NyAqLwogMTIgICAgICAsICA1MSwgLyogsiAtIDE3OCAqLwogMTIgICAgICAsICA3MCwgLyogsyAtIDE3OSAqLwogIDcgICAgICAsICA4NSwgLyogtCAtIDE4MCAqLwogMTAgICAgICAsICAxMSwgLyogtSAtIDE4MSAqLwogMTAgICAgICAsICAxMiwgLyogtiAtIDE4MiAqLwogMTAgICAgICAsICAxMywgLyogtyAtIDE4MyAqLwogIDcgICAgICAsICA4NiwgLyoguCAtIDE4NCAqLwogMTIgICAgICAsICAzMywgLyoguSAtIDE4NSAqLwogMTQgICAgICAsIDEyNCwgLyoguiAtIDE4NiAqLwogIDggICAgICAsICAyNiwgLyoguyAtIDE4NyAqLwogMTIgICAgICAsICAyMSwgLyogvCAtIDE4OCAqLwogMTIgICAgICAsICAyNSwgLyogvSAtIDE4OSAqLwogMTIgICAgICAsICAyOSwgLyogviAtIDE5MCAqLwogIDcgICAgICAsICA4NywgLyogvyAtIDE5MSAqLwogMTQgICAgICAsICAgMiwgLyogwCAtIDE5MiAqLwogMTQgICAgICAsICAgMiwgLyogwSAtIDE5MyAqLwogMTQgICAgICAsICAgMiwgLyogwiAtIDE5NCAqLwogMTQgICAgICAsICAgMiwgLyogwyAtIDE5NSAqLwogMTQgICAgICAsICAgMiwgLyogxCAtIDE5NiAqLwogMTQgICAgICAsICAgMiwgLyogxSAtIDE5NyAqLwogMTQgKyAxNiAsICAgMiwgLyogxiAtIDE5OCAqLwogMTQgICAgICAsICAxMCwgLyogxyAtIDE5OSAqLwogMTQgICAgICAsICAzMywgLyogyCAtIDIwMCAqLwogMTQgICAgICAsICAzMywgLyogySAtIDIwMSAqLwogMTQgICAgICAsICAzMywgLyogyiAtIDIwMiAqLwogMTQgICAgICAsICAzMywgLyogyyAtIDIwMyAqLwogMTQgICAgICAsICA1MCwgLyogzCAtIDIwNCAqLwogMTQgICAgICAsICA1MCwgLyogzSAtIDIwNSAqLwogMTQgICAgICAsICA1MCwgLyogziAtIDIwNiAqLwogMTQgICAgICAsICA1MCwgLyogzyAtIDIwNyAqLwogMTQgICAgICAsICAyNiwgLyog0CAtIDIwOCAqLwogMTQgICAgICAsIDExMiwgLyog0SAtIDIwOSAqLwogMTQgICAgICAsIDEyNCwgLyog0iAtIDIxMCAqLwogMTQgICAgICAsIDEyNCwgLyog0yAtIDIxMSAqLwogMTQgICAgICAsIDEyNCwgLyog1CAtIDIxMiAqLwogMTQgICAgICAsIDEyNCwgLyog1SAtIDIxMyAqLwogMTQgICAgICAsIDEyNCwgLyog1iAtIDIxNCAqLwogIDggICAgICAsICAyOCwgLyog1yAtIDIxNSAqLwogMTQgICAgICAsIDEyNCwgLyog2CAtIDIxNiAqLwogMTQgICAgICAsIDE1OSwgLyog2SAtIDIxNyAqLwogMTQgICAgICAsIDE1OSwgLyog2iAtIDIxOCAqLwogMTQgICAgICAsIDE1OSwgLyog2yAtIDIxOSAqLwogMTQgICAgICAsIDE1OSwgLyog3CAtIDIyMCAqLwogMTQgICAgICAsIDE2NywgLyog3SAtIDIyMSAqLwogMTQgKyAzMiAsIDE1MywgLyog3iAtIDIyMiAqLwogMTQgKyA0OCAsIDE0NSwgLyog3yAtIDIyMyAqLwogMTQgICAgICAsICAgMiwgLyog4CAtIDIyNCAqLwogMTQgICAgICAsICAgMiwgLyog4SAtIDIyNSAqLwogMTQgICAgICAsICAgMiwgLyog4iAtIDIyNiAqLwogMTQgICAgICAsICAgMiwgLyog4yAtIDIyNyAqLwogMTQgICAgICAsICAgMiwgLyog5CAtIDIyOCAqLwogMTQgICAgICAsICAgMiwgLyog5SAtIDIyOSAqLwogMTQgKyAxNiAsICAgMiwgLyog5iAtIDIzMCAqLwogMTQgICAgICAsICAxMCwgLyog5yAtIDIzMSAqLwogMTQgICAgICAsICAzMywgLyog6CAtIDIzMiAqLwogMTQgICAgICAsICAzMywgLyog6SAtIDIzMyAqLwogMTQgICAgICAsICAzMywgLyog6iAtIDIzNCAqLwogMTQgICAgICAsICAzMywgLyog6yAtIDIzNSAqLwogMTQgICAgICAsICA1MCwgLyog7CAtIDIzNiAqLwogMTQgICAgICAsICA1MCwgLyog7SAtIDIzNyAqLwogMTQgICAgICAsICA1MCwgLyog7iAtIDIzOCAqLwogMTQgICAgICAsICA1MCwgLyog7yAtIDIzOSAqLwogMTQgICAgICAsICAyNiwgLyog8CAtIDI0MCAqLwogMTQgICAgICAsIDExMiwgLyog8SAtIDI0MSAqLwogMTQgICAgICAsIDEyNCwgLyog8iAtIDI0MiAqLwogMTQgICAgICAsIDEyNCwgLyog8yAtIDI0MyAqLwogMTQgICAgICAsIDEyNCwgLyog9CAtIDI0NCAqLwogMTQgICAgICAsIDEyNCwgLyog9SAtIDI0NSAqLwogMTQgICAgICAsIDEyNCwgLyog9iAtIDI0NiAqLwogIDggICAgICAsICAyOSwgLyog9yAtIDI0NyAqLwogMTQgICAgICAsIDEyNCwgLyog+CAtIDI0OCAqLwogMTQgICAgICAsIDE1OSwgLyog+SAtIDI0OSAqLwogMTQgICAgICAsIDE1OSwgLyog+iAtIDI1MCAqLwogMTQgICAgICAsIDE1OSwgLyog+yAtIDI1MSAqLwogMTQgICAgICAsIDE1OSwgLyog/CAtIDI1MiAqLwogMTQgICAgICAsIDE2NywgLyog/SAtIDI1MyAqLwogMTQgKyAzMiAsIDE1MywgLyog/iAtIDI1NCAqLwogMTQgICAgICAsIDE2NyAgLyog/yAtIDI1NSAqLyB9OwoKc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgTENNX1VuaWNvZGVfTFVUXzJbXSA9IHsgMzMsIDQ0LCAxNDUgfTsKCiNkZWZpbmUgTENNX0RpYWNyaXRpY19TdGFydCAxMzEKCnN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIExDTV9EaWFjcml0aWNfTFVUW10gPSB7CjEyMywgIC8qIIMgLSAxMzEgKi8KICAyLCAgLyoghCAtIDEzMiAqLwogIDIsICAvKiCFIC0gMTMzICovCiAgMiwgIC8qIIYgLSAxMzQgKi8KICAyLCAgLyoghyAtIDEzNSAqLwogIDMsICAvKiCIIC0gMTM2ICovCiAgMiwgIC8qIIkgLSAxMzcgKi8KIDIwLCAgLyogiiAtIDEzOCAqLwogIDIsICAvKiCLIC0gMTM5ICovCiAgMiwgIC8qIIwgLSAxNDAgKi8KICAyLCAgLyogjSAtIDE0MSAqLwogIDIsICAvKiCOIC0gMTQyICovCiAgMiwgIC8qII8gLSAxNDMgKi8KICAyLCAgLyogkCAtIDE0NCAqLwogIDIsICAvKiCRIC0gMTQ1ICovCiAgMiwgIC8qIJIgLSAxNDYgKi8KICAyLCAgLyogkyAtIDE0NyAqLwogIDIsICAvKiCUIC0gMTQ4ICovCiAgMiwgIC8qIJUgLSAxNDkgKi8KICAyLCAgLyogliAtIDE1MCAqLwogIDIsICAvKiCXIC0gMTUxICovCiAgMiwgIC8qIJggLSAxNTIgKi8KICAyLCAgLyogmSAtIDE1MyAqLwogMjAsICAvKiCaIC0gMTU0ICovCiAgMiwgIC8qIJsgLSAxNTUgKi8KICAyLCAgLyognCAtIDE1NiAqLwogIDIsICAvKiCdIC0gMTU3ICovCiAgMiwgIC8qIJ4gLSAxNTggKi8KIDE5LCAgLyognyAtIDE1OSAqLwogIDIsICAvKiCgIC0gMTYwICovCiAgMiwgIC8qIKEgLSAxNjEgKi8KICAyLCAgLyogoiAtIDE2MiAqLwogIDIsICAvKiCjIC0gMTYzICovCiAgMiwgIC8qIKQgLSAxNjQgKi8KICAyLCAgLyogpSAtIDE2NSAqLwogIDIsICAvKiCmIC0gMTY2ICovCiAgMiwgIC8qIKcgLSAxNjcgKi8KICAyLCAgLyogqCAtIDE2OCAqLwogIDIsICAvKiCpIC0gMTY5ICovCiAgMywgIC8qIKogLSAxNzAgKi8KICAyLCAgLyogqyAtIDE3MSAqLwogIDIsICAvKiCsIC0gMTcyICovCiAgMiwgIC8qIK0gLSAxNzMgKi8KICAyLCAgLyogriAtIDE3NCAqLwogIDIsICAvKiCvIC0gMTc1ICovCiAgMiwgIC8qILAgLSAxNzYgKi8KICAyLCAgLyogsSAtIDE3NyAqLwogIDIsICAvKiCyIC0gMTc4ICovCiAgMiwgIC8qILMgLSAxNzkgKi8KICAyLCAgLyogtCAtIDE4MCAqLwogIDIsICAvKiC1IC0gMTgxICovCiAgMiwgIC8qILYgLSAxODIgKi8KICAyLCAgLyogtyAtIDE4MyAqLwogIDIsICAvKiC4IC0gMTg0ICovCiAgMiwgIC8qILkgLSAxODUgKi8KICAzLCAgLyoguiAtIDE4NiAqLwogIDIsICAvKiC7IC0gMTg3ICovCiAgMiwgIC8qILwgLSAxODggKi8KICAyLCAgLyogvSAtIDE4OSAqLwogIDIsICAvKiC+IC0gMTkwICovCiAgMiwgIC8qIL8gLSAxOTEgKi8KIDE1LCAgLyogwCAtIDE5MiAqLwogMTQsICAvKiDBIC0gMTkzICovCiAxOCwgIC8qIMIgLSAxOTQgKi8KIDI1LCAgLyogwyAtIDE5NSAqLwogMTksICAvKiDEIC0gMTk2ICovCiAyNiwgIC8qIMUgLSAxOTcgKi8KICAyLCAgLyogxiAtIDE5OCAqLwogMjgsICAvKiDHIC0gMTk5ICovCiAxNSwgIC8qIMggLSAyMDAgKi8KIDE0LCAgLyogySAtIDIwMSAqLwogMTgsICAvKiDKIC0gMjAyICovCiAxOSwgIC8qIMsgLSAyMDMgKi8KIDE1LCAgLyogzCAtIDIwNCAqLwogMTQsICAvKiDNIC0gMjA1ICovCiAxOCwgIC8qIM4gLSAyMDYgKi8KIDE5LCAgLyogzyAtIDIwNyAqLwoxMDQsICAvKiDQIC0gMjA4ICovCiAyNSwgIC8qINEgLSAyMDkgKi8KIDE1LCAgLyog0iAtIDIxMCAqLwogMTQsICAvKiDTIC0gMjExICovCiAxOCwgIC8qINQgLSAyMTIgKi8KIDI1LCAgLyog1SAtIDIxMyAqLwogMTksICAvKiDWIC0gMjE0ICovCiAgMiwgIC8qINcgLSAyMTUgKi8KIDMzLCAgLyog2CAtIDIxNiAqLwogMTUsICAvKiDZIC0gMjE3ICovCiAxNCwgIC8qINogLSAyMTggKi8KIDE4LCAgLyog2yAtIDIxOSAqLwogMTksICAvKiDcIC0gMjIwICovCiAxNCwgIC8qIN0gLSAyMjEgKi8KICAyLCAgLyog3iAtIDIyMiAqLwogIDIsICAvKiDfIC0gMjIzICovCiAxNSwgIC8qIOAgLSAyMjQgKi8KIDE0LCAgLyog4SAtIDIyNSAqLwogMTgsICAvKiDiIC0gMjI2ICovCiAyNSwgIC8qIOMgLSAyMjcgKi8KIDE5LCAgLyog5CAtIDIyOCAqLwogMjYsICAvKiDlIC0gMjI5ICovCiAgMiwgIC8qIOYgLSAyMzAgKi8KIDI4LCAgLyog5yAtIDIzMSAqLwogMTUsICAvKiDoIC0gMjMyICovCiAxNCwgIC8qIOkgLSAyMzMgKi8KIDE4LCAgLyog6iAtIDIzNCAqLwogMTksICAvKiDrIC0gMjM1ICovCiAxNSwgIC8qIOwgLSAyMzYgKi8KIDE0LCAgLyog7SAtIDIzNyAqLwogMTgsICAvKiDuIC0gMjM4ICovCiAxOSwgIC8qIO8gLSAyMzkgKi8KMTA0LCAgLyog8CAtIDI0MCAqLwogMjUsICAvKiDxIC0gMjQxICovCiAxNSwgIC8qIPIgLSAyNDIgKi8KIDE0LCAgLyog8yAtIDI0MyAqLwogMTgsICAvKiD0IC0gMjQ0ICovCiAyNSwgIC8qIPUgLSAyNDUgKi8KIDE5LCAgLyog9iAtIDI0NiAqLwogIDIsICAvKiD3IC0gMjQ3ICovCiAzMywgIC8qIPggLSAyNDggKi8KIDE1LCAgLyog+SAtIDI0OSAqLwogMTQsICAvKiD6IC0gMjUwICovCiAxOCwgIC8qIPsgLSAyNTEgKi8KIDE5LCAgLyog/CAtIDI1MiAqLwogMTQsICAvKiD9IC0gMjUzICovCiAgMiwgIC8qIP4gLSAyNTQgKi8KIDE5LCAgLyog/yAtIDI1NSAqLwp9IDsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogT0xFMk5MU19pc1B1bmN0dWF0aW9uIFtJTlRFUk5BTF0KICovCnN0YXRpYyBpbnQgT0xFMk5MU19pc1B1bmN0dWF0aW9uKHVuc2lnbmVkIGNoYXIgYykKewogIC8qICJwdW5jdHVhdGlvbiBjaGFyYWN0ZXIiIGluIHRoaXMgY29udGV4dCBpcyBhIGNoYXJhY3RlciB3aGljaCBpcwogICAgIGNvbnNpZGVyZWQgImxlc3MgaW1wb3J0YW50IiBkdXJpbmcgd29yZCBzb3J0IGNvbXBhcmlzb24uCiAgICAgU2VlIExDTWFwU3RyaW5nIGltcGxlbWVudGF0aW9uIGZvciB0aGUgcHJlY2lzZSBkZWZpbml0aW9uCiAgICAgb2YgImxlc3MgaW1wb3J0YW50Ii4gKi8KCiAgcmV0dXJuIChMQ01fVW5pY29kZV9MVVRbLTIrMipjXT09Nik7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogT0xFMk5MU19pc05vblNwYWNpbmcgW0lOVEVSTkFMXQogKi8Kc3RhdGljIGludCBPTEUyTkxTX2lzTm9uU3BhY2luZyh1bnNpZ25lZCBjaGFyIGMpCnsKICAvKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYnkgTENNYXBTdHJpbmdBLiAgQ2hhcmFjdGVycwogICAgIGZvciB3aGljaCBpdCByZXR1cm5zIHRydWUgYXJlIGlnbm9yZWQgd2hlbiBtYXBwaW5nIGEKICAgICBzdHJpbmcgd2l0aCBOT1JNX0lHTk9SRU5PTlNQQUNFICovCiAgcmV0dXJuICgoYz09MTM2KSB8fCAoYz09MTcwKSB8fCAoYz09MTg2KSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogT0xFMk5MU19pc1N5bWJvbCBbSU5URVJOQUxdCiAqIEZJWE1FOiBoYW5kbGUgY3VycmVudCBsb2NhbGUKICovCnN0YXRpYyBpbnQgT0xFMk5MU19pc1N5bWJvbCh1bnNpZ25lZCBjaGFyIGMpCnsKICAvKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYnkgTENNYXBTdHJpbmdBLiAgQ2hhcmFjdGVycwogICAgIGZvciB3aGljaCBpdCByZXR1cm5zIHRydWUgYXJlIGlnbm9yZWQgd2hlbiBtYXBwaW5nIGEKICAgICBzdHJpbmcgd2l0aCBOT1JNX0lHTk9SRVNZTUJPTFMgKi8KICByZXR1cm4gKCAoYyE9MCkgJiYgIShpc2FscGhhKGMpIHx8IGlzZGlnaXQoYykpICk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCWlkZW50aXR5CVtJbnRlcm5hbF0KICovCnN0YXRpYyBpbnQgaWRlbnRpdHkoaW50IGMpCnsKICByZXR1cm4gYzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgIExDTWFwU3RyaW5nQSAgICAgICAgICAgICAgICBbS0VSTkVMMzIuQF0KICoKICogQ29udmVydCBhIHN0cmluZywgb3IgZ2VuZXJhdGUgYSBzb3J0IGtleSBmcm9tIGl0LgogKgogKiBJZiAobWFwZmxhZ3MgJiBMQ01BUF9TT1JUS0VZKSwgdGhlIGZ1bmN0aW9uIHdpbGwgZ2VuZXJhdGUKICogYSBzb3J0IGtleSBmb3IgdGhlIHNvdXJjZSBzdHJpbmcuICBFbHNlLCBpdCB3aWxsIGNvbnZlcnQgaXQKICogYWNjb3JkaW5nbHkgdG8gdGhlIGZsYWdzIExDTUFQX1VQUEVSQ0FTRSwgTENNQVBfTE9XRVJDQVNFLC4uLgogKgogKiBSRVRVUk5TCiAqICAgIEVycm9yIDogMC4KICogICAgU3VjY2VzcyA6IGxlbmd0aCBvZiB0aGUgcmVzdWx0IHN0cmluZy4KICoKICogTk9URVMKICogICAgSWYgY2FsbGVkIHdpdGggc2NybGVuID0gLTEsIHRoZSBmdW5jdGlvbiB3aWxsIGNvbXB1dGUgdGhlIGxlbmd0aAogKiAgICAgIG9mIHRoZSAwLXRlcm1pbmF0ZWQgc3RyaW5nIHN0cnNyYyBieSBpdHNlbGYuCiAqCiAqICAgIElmIGNhbGxlZCB3aXRoIGRzdGxlbiA9IDAsIHJldHVybnMgdGhlIGJ1ZmZlciBsZW5ndGggdGhhdAogKiAgICAgIHdvdWxkIGJlIHJlcXVpcmVkLgogKgogKiAgICBOT1JNX0lHTk9SRVdJRFRIIG1lYW5zIHRvIGNvbXBhcmUgQVNDSUkgYW5kIHdpZGUgY2hhcmFjdGVycwogKiAgICBhcyBpZiB0aGV5IGFyZSBlcXVhbC4KICogICAgSW4gdGhlIG9ubHkgY29kZSBwYWdlIGltcGxlbWVudGVkIHNvIGZhciwgdGhlcmUgbWF5IG5vdCBiZQogKiAgICB3aWRlIGNoYXJhY3RlcnMgaW4gc3RyaW5ncyBwYXNzZWQgdG8gTENNYXBTdHJpbmdBLAogKiAgICBzbyB0aGVyZSBpcyBub3RoaW5nIHRvIGJlIGRvbmUgZm9yIHRoaXMgZmxhZy4KICovCklOVCBXSU5BUEkgTENNYXBTdHJpbmdBKAoJTENJRCBsY2lkLCAgICAgIC8qIFtpbl0gbG9jYWxlIGlkZW50aWZpZXIgY3JlYXRlZCB3aXRoIE1BS0VMQ0lEOwoJCSAgICAgICAgICAgICAgICBMT0NBTEVfU1lTVEVNX0RFRkFVTFQgYW5kIExPQ0FMRV9VU0VSX0RFRkFVTFQgYXJlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZGVmaW5lZCB2YWx1ZXMuICovCglEV09SRCBtYXBmbGFncywgLyogW2luXSBmbGFncyAqLwoJTFBDU1RSIHNyY3N0ciwgIC8qIFtpbl0gc291cmNlIGJ1ZmZlciAqLwoJSU5UIHNyY2xlbiwgICAgIC8qIFtpbl0gc291cmNlIGxlbmd0aCAqLwoJTFBTVFIgZHN0c3RyLCAgIC8qIFtvdXRdIGRlc3RpbmF0aW9uIGJ1ZmZlciAqLwoJSU5UIGRzdGxlbikgICAgIC8qIFtpbl0gZGVzdGluYXRpb24gYnVmZmVyIGxlbmd0aCAqLwp7CiAgaW50IGk7CgogIFRSQUNFKCIoMHglMDRseCwweCUwOGx4LCVzLCVkLCVwLCVkKVxuIiwKCWxjaWQsbWFwZmxhZ3MsZGVidWdzdHJfYW4oc3Jjc3RyLHNyY2xlbiksc3JjbGVuLGRzdHN0cixkc3RsZW4pOwoKICBpZiAoICgoZHN0bGVuIT0wKSAmJiAoZHN0c3RyPT1OVUxMKSkgfHwgKHNyY3N0cj09TlVMTCkgKQogIHsKICAgIEVSUigiKHNyYz0lcyxkZXN0PSVzKTogSW52YWxpZCBOVUxMIHN0cmluZ1xuIiwKCWRlYnVnc3RyX2FuKHNyY3N0cixzcmNsZW4pLCBkc3RzdHIpOwogICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKICAgIHJldHVybiAwOwogIH0KICBpZiAoc3JjbGVuID09IC0xKQogICAgc3JjbGVuID0gc3RybGVuKHNyY3N0cikgKyAxIDsgICAgLyogKGluY2x1ZGUgZmluYWwgJ1wwJykgKi8KCiNkZWZpbmUgTENNQVBTVFJJTkdBX1NVUFBPUlRFRF9GTEFHUyAoTENNQVBfVVBQRVJDQVNFICAgICB8IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExDTUFQX0xPV0VSQ0FTRSAgICAgfCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMQ01BUF9TT1JUS0VZICAgICAgIHwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTk9STV9JR05PUkVDQVNFICAgICB8IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5PUk1fSUdOT1JFTk9OU1BBQ0UgfCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT1JUX1NUUklOR1NPUlQgICAgIHwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTk9STV9JR05PUkVXSURUSCAgICB8IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5PUk1fSUdOT1JFS0FOQVRZUEUpCiAgLyogRklYTUU6IGFzIGxvbmcgYXMgd2UgZG9uJ3Qgc3VwcG9ydCBLYXRha2FuYSBub3IgSGlyYWdhbmEKICAgKiBjaGFyYWN0ZXJzLCB3ZSBjYW4gc3VwcG9ydCBOT1JNX0lHTk9SRUtBTkFUWVBFCiAgICovCiAgaWYgKG1hcGZsYWdzICYgfkxDTUFQU1RSSU5HQV9TVVBQT1JURURfRkxBR1MpCiAgewogICAgRklYTUUoIigweCUwNGx4LDB4JTA4bHgsJXAsJWQsJXAsJWQpOiAiCgkgICJ1bmltcGxlbWVudGVkIGZsYWdzOiAweCUwOGx4XG4iLAoJICBsY2lkLAoJICBtYXBmbGFncywKCSAgc3Jjc3RyLAoJICBzcmNsZW4sCgkgIGRzdHN0ciwKCSAgZHN0bGVuLAoJICBtYXBmbGFncyAmIH5MQ01BUFNUUklOR0FfU1VQUE9SVEVEX0ZMQUdTCiAgICAgKTsKICB9CgogIGlmICggIShtYXBmbGFncyAmIExDTUFQX1NPUlRLRVkpICkKICB7CiAgICBpbnQgaSxqOwogICAgaW50ICgqZikoaW50KSA9IGlkZW50aXR5OwogICAgaW50IGZsYWdfaWdub3Jlbm9uc3BhY2UgPSBtYXBmbGFncyAmIE5PUk1fSUdOT1JFTk9OU1BBQ0U7CiAgICBpbnQgZmxhZ19pZ25vcmVzeW1ib2xzID0gbWFwZmxhZ3MgJiBOT1JNX0lHTk9SRVNZTUJPTFM7CgogICAgaWYgKGZsYWdfaWdub3Jlbm9uc3BhY2UgfHwgZmxhZ19pZ25vcmVzeW1ib2xzKQogICAgewogICAgICAvKiBGb3Igc29tZSB2YWx1ZXMgb2YgbWFwZmxhZ3MsIHRoZSBsZW5ndGggb2YgdGhlIHJlc3VsdGluZwoJIHN0cmluZyBpcyBub3Qga25vd24gYXQgdGhpcyBwb2ludC4gIFdpbmRvd3MgZG9lcyBtYXAgdGhlIHN0cmluZwoJIGFuZCBkb2VzIG5vdCBTZXRMYXN0RXJyb3IgRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUiBpbgoJIHRoZXNlIGNhc2VzLiAqLwogICAgICBpZiAoZHN0bGVuPT0wKQogICAgICB7CgkvKiBDb21wdXRlIHJlcXVpcmVkIGxlbmd0aCAqLwoJZm9yIChpPWo9MDsgaSA8IHNyY2xlbjsgaSsrKQoJewoJICBpZiAoICEoZmxhZ19pZ25vcmVub25zcGFjZSAmJiBPTEUyTkxTX2lzTm9uU3BhY2luZyhzcmNzdHJbaV0pKQoJICAgICAgICYmICEoZmxhZ19pZ25vcmVzeW1ib2xzICYmIE9MRTJOTFNfaXNTeW1ib2woc3Jjc3RyW2ldKSkgKQoJICAgIGorKzsKCX0KCXJldHVybiBqOwogICAgICB9CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgIGlmIChkc3RsZW49PTApCglyZXR1cm4gc3JjbGVuOwogICAgICBpZiAoZHN0bGVuPHNyY2xlbikKCSAgIHsKCSAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOU1VGRklDSUVOVF9CVUZGRVIpOwoJICAgICByZXR1cm4gMDsKCSAgIH0KICAgIH0KICAgIGlmIChtYXBmbGFncyAmIExDTUFQX1VQUEVSQ0FTRSkKICAgICAgZiA9IHRvdXBwZXI7CiAgICBlbHNlIGlmIChtYXBmbGFncyAmIExDTUFQX0xPV0VSQ0FTRSkKICAgICAgZiA9IHRvbG93ZXI7CiAgICAvKiBGSVhNRTogTk9STV9JR05PUkVOT05TUEFDRSByZXF1aXJlcyBhbm90aGVyIGNvbnZlcnNpb24gKi8KICAgIGZvciAoaT1qPTA7IChpPHNyY2xlbikgJiYgKGo8ZHN0bGVuKSA7IGkrKykKICAgIHsKICAgICAgaWYgKCAhKGZsYWdfaWdub3Jlbm9uc3BhY2UgJiYgT0xFMk5MU19pc05vblNwYWNpbmcoc3Jjc3RyW2ldKSkKCSAgICYmICEoZmxhZ19pZ25vcmVzeW1ib2xzICYmIE9MRTJOTFNfaXNTeW1ib2woc3Jjc3RyW2ldKSkgKQogICAgICB7Cglkc3RzdHJbal0gPSAoQ0hBUikgZihzcmNzdHJbaV0pOwoJaisrOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gajsKICB9CgogIC8qIEZJWE1FOiBUaGlzIGZ1bmN0aW9uIGNvbXBsZXRlbHkgaWdub3JlcyB0aGUgImxjaWQiIHBhcmFtZXRlci4gKi8KICAvKiBlbHNlIC4uLiAobWFwZmxhZ3MgJiBMQ01BUF9TT1JUS0VZKSAgKi8KICB7CiAgICBpbnQgdW5pY29kZV9sZW49MDsKICAgIGludCBjYXNlX2xlbj0wOwogICAgaW50IGRpYWNyaXRpY19sZW49MDsKICAgIGludCBkZWxheWVkX3B1bmN0dWF0aW9uX2xlbj0wOwogICAgY2hhciAqY2FzZV9jb21wb25lbnQ7CiAgICBjaGFyICpkaWFjcml0aWNfY29tcG9uZW50OwogICAgY2hhciAqZGVsYXllZF9wdW5jdHVhdGlvbl9jb21wb25lbnQ7CiAgICBpbnQgcm9vbSxjb3VudDsKICAgIGludCBmbGFnX3N0cmluZ3NvcnQgPSBtYXBmbGFncyAmIFNPUlRfU1RSSU5HU09SVDsKCiAgICAvKiBjb21wdXRlIGhvdyBtdWNoIHJvb20gd2Ugd2lsbCBuZWVkICovCiAgICBmb3IgKGk9MDtpPHNyY2xlbjtpKyspCiAgICB7CiAgICAgIGludCBvZnM7CiAgICAgIHVuc2lnbmVkIGNoYXIgc291cmNlX2NoYXIgPSBzcmNzdHJbaV07CiAgICAgIGlmIChzb3VyY2VfY2hhciE9J1wwJykKICAgICAgewoJaWYgKGZsYWdfc3RyaW5nc29ydCB8fCAhT0xFMk5MU19pc1B1bmN0dWF0aW9uKHNvdXJjZV9jaGFyKSkKCXsKCSAgdW5pY29kZV9sZW4rKzsKCSAgaWYgKCBMQ01fVW5pY29kZV9MVVRbLTIrMipzb3VyY2VfY2hhcl0gJiB+MTUgKQoJICAgIHVuaWNvZGVfbGVuKys7ICAgICAgICAgICAgIC8qIGRvdWJsZSBsZXR0ZXIgKi8KCX0KCWVsc2UKCXsKCSAgZGVsYXllZF9wdW5jdHVhdGlvbl9sZW4rKzsKCX0KICAgICAgfQoKICAgICAgaWYgKGlzdXBwZXIoc291cmNlX2NoYXIpKQoJY2FzZV9sZW49dW5pY29kZV9sZW47CgogICAgICBvZnMgPSBzb3VyY2VfY2hhciAtIExDTV9EaWFjcml0aWNfU3RhcnQ7CiAgICAgIGlmICgob2ZzPj0wKSAmJiAoTENNX0RpYWNyaXRpY19MVVRbb2ZzXSE9MikpCglkaWFjcml0aWNfbGVuPXVuaWNvZGVfbGVuOwogICAgfQoKICAgIGlmIChtYXBmbGFncyAmIE5PUk1fSUdOT1JFQ0FTRSkKICAgICAgY2FzZV9sZW49MDsKICAgIGlmIChtYXBmbGFncyAmIE5PUk1fSUdOT1JFTk9OU1BBQ0UpCiAgICAgIGRpYWNyaXRpY19sZW49MDsKCiAgICByb29tID0gIDIgKiB1bmljb2RlX2xlbiAgICAgICAgICAgICAgLyogInVuaWNvZGUiIGNvbXBvbmVudCAqLwogICAgICArICAgICBkaWFjcml0aWNfbGVuICAgICAgICAgICAgICAgIC8qICJkaWFjcml0aWMiIGNvbXBvbmVudCAqLwogICAgICArICAgICBjYXNlX2xlbiAgICAgICAgICAgICAgICAgICAgIC8qICJjYXNlIiBjb21wb25lbnQgKi8KICAgICAgKyAgICAgNCAqIGRlbGF5ZWRfcHVuY3R1YXRpb25fbGVuICAvKiBwdW5jdHVhdGlvbiBpbiB3b3JkIHNvcnQgbW9kZSAqLwogICAgICArICAgICA0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZvdXIgJ1wxJyBzZXBhcmF0b3JzICovCiAgICAgICsgICAgIDEgIDsgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGVybWluYWwgJ1wwJyAqLwogICAgaWYgKGRzdGxlbj09MCkKICAgICAgcmV0dXJuIHJvb207CiAgICBlbHNlIGlmIChkc3RsZW48cm9vbSkKICAgIHsKICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOU1VGRklDSUVOVF9CVUZGRVIpOwogICAgICByZXR1cm4gMDsKICAgIH0KI2lmIDAKICAgIC8qRklYTUUgdGhlIFBvaW50ZXJjaGVjayBzaG91bGQgbm90IGJlIG5lc3Nlc2FyeSAqLwogICAgaWYgKElzQmFkV3JpdGVQdHIgKGRzdHN0cixyb29tKSkKICAgIHsgRVJSKCJiYWQgZGVzdGluYXRpb24gYnVmZmVyIChkc3RzdHIpIDogJXAsJWRcbiIsZHN0c3RyLGRzdGxlbik7CiAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlNVRkZJQ0lFTlRfQlVGRkVSKTsKICAgICAgcmV0dXJuIDA7CiAgICB9CiNlbmRpZgogICAgLyogbG9jYXRlIGVhY2ggY29tcG9uZW50LCB3cml0ZSBzZXBhcmF0b3JzICovCiAgICBkaWFjcml0aWNfY29tcG9uZW50ID0gZHN0c3RyICsgMip1bmljb2RlX2xlbiA7CiAgICAqZGlhY3JpdGljX2NvbXBvbmVudCsrID0gJ1wxJzsKICAgIGNhc2VfY29tcG9uZW50ID0gZGlhY3JpdGljX2NvbXBvbmVudCArIGRpYWNyaXRpY19sZW4gOwogICAgKmNhc2VfY29tcG9uZW50KysgPSAnXDEnOwogICAgZGVsYXllZF9wdW5jdHVhdGlvbl9jb21wb25lbnQgPSBjYXNlX2NvbXBvbmVudCArIGNhc2VfbGVuIDsKICAgICpkZWxheWVkX3B1bmN0dWF0aW9uX2NvbXBvbmVudCsrID0gJ1wxJzsKICAgICpkZWxheWVkX3B1bmN0dWF0aW9uX2NvbXBvbmVudCsrID0gJ1wxJzsKCiAgICAvKiByZWFkIHNvdXJjZSBzdHJpbmcgY2hhciBieSBjaGFyLCB3cml0ZQogICAgICAgY29ycmVzcG9uZGluZyB3ZWlnaHQgaW4gZWFjaCBjb21wb25lbnQuICovCiAgICBmb3IgKGk9MCxjb3VudD0wO2k8c3JjbGVuO2krKykKICAgIHsKICAgICAgdW5zaWduZWQgY2hhciBzb3VyY2VfY2hhcj1zcmNzdHJbaV07CiAgICAgIGlmIChzb3VyY2VfY2hhciE9J1wwJykKICAgICAgewoJaW50IHR5cGUsbG9uZ2NvZGU7Cgl0eXBlID0gTENNX1VuaWNvZGVfTFVUWy0yKzIqc291cmNlX2NoYXJdOwoJbG9uZ2NvZGUgPSB0eXBlID4+IDQ7Cgl0eXBlICY9IDE1OwoJaWYgKCFmbGFnX3N0cmluZ3NvcnQgJiYgT0xFMk5MU19pc1B1bmN0dWF0aW9uKHNvdXJjZV9jaGFyKSkKCXsKCSAgV09SRCBlbmNyeXB0ZWRfbG9jYXRpb24gPSAoMTw8MTUpICsgNyArIDQqY291bnQ7CgkgICpkZWxheWVkX3B1bmN0dWF0aW9uX2NvbXBvbmVudCsrID0gKHVuc2lnbmVkIGNoYXIpIChlbmNyeXB0ZWRfbG9jYXRpb24+PjgpOwoJICAqZGVsYXllZF9wdW5jdHVhdGlvbl9jb21wb25lbnQrKyA9ICh1bnNpZ25lZCBjaGFyKSAoZW5jcnlwdGVkX2xvY2F0aW9uJjI1NSk7CiAgICAgICAgICAgICAgICAgICAgIC8qIGJpZy1lbmRpYW4gaXMgdXNlZCBoZXJlIGJlY2F1c2UgaXQgbGV0cyBzdHJpbmcgY29tcGFyaXNvbiBiZQoJCQljb21wYXRpYmxlIHdpdGggbnVtZXJpY2FsIGNvbXBhcmlzb24gKi8KCgkgICpkZWxheWVkX3B1bmN0dWF0aW9uX2NvbXBvbmVudCsrID0gdHlwZTsKCSAgKmRlbGF5ZWRfcHVuY3R1YXRpb25fY29tcG9uZW50KysgPSBMQ01fVW5pY29kZV9MVVRbLTErMipzb3VyY2VfY2hhcl07CiAgICAgICAgICAgICAgICAgICAgIC8qIGFzc3VtcHRpb24gOiBhIHB1bmN0dWF0aW9uIGNoYXJhY3RlciBpcyBuZXZlciBhCgkJCWRvdWJsZSBvciBhY2NlbnRlZCBsZXR0ZXIgKi8KCX0KCWVsc2UKCXsKCSAgZHN0c3RyWzIqY291bnRdID0gdHlwZTsKCSAgZHN0c3RyWzIqY291bnQrMV0gPSBMQ01fVW5pY29kZV9MVVRbLTErMipzb3VyY2VfY2hhcl07CgkgIGlmIChsb25nY29kZSkKCSAgewoJICAgIGlmIChjb3VudDxjYXNlX2xlbikKCSAgICAgIGNhc2VfY29tcG9uZW50W2NvdW50XSA9ICggaXN1cHBlcihzb3VyY2VfY2hhcikgPyAxOCA6IDIgKSA7CgkgICAgaWYgKGNvdW50PGRpYWNyaXRpY19sZW4pCgkgICAgICBkaWFjcml0aWNfY29tcG9uZW50W2NvdW50XSA9IDI7IC8qIGFzc3VtcHRpb246IGEgZG91YmxlIGxldHRlcgoJCQkJCQkgaXMgbmV2ZXIgYWNjZW50ZWQgKi8KCSAgICBjb3VudCsrOwoKCSAgICBkc3RzdHJbMipjb3VudF0gPSB0eXBlOwoJICAgIGRzdHN0clsyKmNvdW50KzFdID0gKihMQ01fVW5pY29kZV9MVVRfMiAtIDEgKyBsb25nY29kZSk7CgkgICAgLyogMTYgaW4gdGhlIGZpcnN0IGNvbHVtbiBvZiBMQ01fVW5pY29kZV9MVVQgIC0tPiAgbG9uZ2NvZGUgPSAxCgkgICAgICAgMzIgaW4gdGhlIGZpcnN0IGNvbHVtbiBvZiBMQ01fVW5pY29kZV9MVVQgIC0tPiAgbG9uZ2NvZGUgPSAyCgkgICAgICAgNDggaW4gdGhlIGZpcnN0IGNvbHVtbiBvZiBMQ01fVW5pY29kZV9MVVQgIC0tPiAgbG9uZ2NvZGUgPSAzICovCgkgIH0KCgkgIGlmIChjb3VudDxjYXNlX2xlbikKCSAgICBjYXNlX2NvbXBvbmVudFtjb3VudF0gPSAoIGlzdXBwZXIoc291cmNlX2NoYXIpID8gMTggOiAyICkgOwoJICBpZiAoY291bnQ8ZGlhY3JpdGljX2xlbikKCSAgewoJICAgIGludCBvZnMgPSBzb3VyY2VfY2hhciAtIExDTV9EaWFjcml0aWNfU3RhcnQ7CgkgICAgZGlhY3JpdGljX2NvbXBvbmVudFtjb3VudF0gPSAob2ZzPj0wID8gTENNX0RpYWNyaXRpY19MVVRbb2ZzXSA6IDIpOwoJICB9CgkgIGNvdW50Kys7Cgl9CiAgICAgIH0KICAgIH0KICAgIGRzdHN0cltyb29tLTFdID0gJ1wwJzsKICAgIHJldHVybiByb29tOwogIH0KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgIExDTWFwU3RyaW5nVyAgICAgICAgICAgICAgICBbS0VSTkVMMzIuQF0KICoKICogQ29udmVydCBhIHN0cmluZywgb3IgZ2VuZXJhdGUgYSBzb3J0IGtleSBmcm9tIGl0LgogKgogKiBOT1RFCiAqCiAqIFNlZSBMQ01hcFN0cmluZ0EgZm9yIGRvY3VtZW50YXRpb24KICovCklOVCBXSU5BUEkgTENNYXBTdHJpbmdXKAoJTENJRCBsY2lkLERXT1JEIG1hcGZsYWdzLExQQ1dTVFIgc3Jjc3RyLElOVCBzcmNsZW4sTFBXU1RSIGRzdHN0ciwKCUlOVCBkc3RsZW4pCnsKICBpbnQgaTsKCiAgVFJBQ0UoIigweCUwNGx4LDB4JTA4bHgsJXAsJWQsJXAsJWQpXG4iLAogICAgICAgICAgICAgICAgIGxjaWQsIG1hcGZsYWdzLCBzcmNzdHIsIHNyY2xlbiwgZHN0c3RyLCBkc3RsZW4pOwoKICBpZiAoICgoZHN0bGVuIT0wKSAmJiAoZHN0c3RyPT1OVUxMKSkgfHwgKHNyY3N0cj09TlVMTCkgKQogIHsKICAgIEVSUigiKHNyYz0lcCxkc3Q9JXApOiBJbnZhbGlkIE5VTEwgc3RyaW5nXG4iLCBzcmNzdHIsIGRzdHN0cik7CiAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwogICAgcmV0dXJuIDA7CiAgfQogIGlmIChzcmNsZW49PS0xKQogICAgc3JjbGVuID0gc3RybGVuVyhzcmNzdHIpKzE7CgogIC8qIEZJWE1FOiBCb3RoIHRoaXMgZnVuY3Rpb24gYW5kIGl0J3MgY29tcGFuaW9uIExDTWFwU3RyaW5nQSgpCiAgICogY29tcGxldGVseSBpZ25vcmUgdGhlICJsY2lkIiBwYXJhbWV0ZXIuICBJbiBwbGFjZSBvZiB0aGUgImxjaWQiCiAgICogcGFyYW1ldGVyIHRoZSBhcHBsaWNhdGlvbiBtdXN0IHNldCB0aGUgIkxDX0NPTExBVEUiIG9yICJMQ19BTEwiCiAgICogZW52aXJvbm1lbnQgdmFyaWFibGUgcHJpb3IgdG8gaW52b2tpbmcgdGhpcyBmdW5jdGlvbi4gICovCiAgaWYgKG1hcGZsYWdzICYgTENNQVBfU09SVEtFWSkKICB7CiAgICAgIC8qIFBvc3NpYmxlIHZhbHVlcyBvZiBMQ19DT0xMQVRFLiAqLwogICAgICBjaGFyICpsY19jb2xsYXRlX2RlZmF1bHQgPSAwOyAvKiB2YWx1ZSBwcmlvciB0byB0aGlzIGZ1bmN0aW9uICovCiAgICAgIGNoYXIgKmxjX2NvbGxhdGVfZW52ID0gMDsgICAgIC8qIHZhbHVlIHJldHJpZXZlZCBmcm9tIHRoZSBlbnZpcm9ubWVudCAqLwoKICAgICAgLyogR2VuZXJhbCBwdXJwb3NlIGluZGV4IGludG8gc3RyaW5ncyBvZiBhbnkgdHlwZS4gKi8KICAgICAgaW50IHN0cl9pZHggPSAwOwoKICAgICAgLyogTGVuZ3RocyBvZiB2YXJpb3VzIHN0cmluZ3Mgd2hlcmUgdGhlIGxlbmd0aCBpcyBtZWFzdXJlZCBpbgogICAgICAgKiB3aWRlIGNoYXJhY3RlcnMgZm9yIHdpZGUgY2hhcmFjdGVyIHN0cmluZ3MgYW5kIGluIGJ5dGVzIGZvcgogICAgICAgKiBuYXRpdmUgc3RyaW5ncy4gIFRoZSBsZW5ndGhzIGluY2x1ZGUgdGhlIE5VTEwgdGVybWluYXRvci4gICovCiAgICAgIHNpemVfdCByZXR1cm5lZF9sZW4gICAgPSAwOwogICAgICBzaXplX3Qgc3JjX25hdGl2ZV9sZW4gID0gMDsKICAgICAgc2l6ZV90IGRzdF9uYXRpdmVfbGVuICA9IDA7CiAgICAgIHNpemVfdCBkc3RzdHJfbGliY19sZW4gPSAwOwoKICAgICAgLyogTmF0aXZlIChjaGFyYWN0ZXIgc2V0IGRldGVybWluZWQgYnkgbG9jYWxlKSB2ZXJzaW9ucyBvZiB0aGUKICAgICAgICogc3RyaW5ncyBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIHN0cmluZ3MuICAqLwogICAgICBMUFNUUiBzcmNfbmF0aXZlID0gMDsKICAgICAgTFBTVFIgZHN0X25hdGl2ZSA9IDA7CgogICAgICAvKiBWZXJzaW9uIG9mIHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIHN0cmluZ3MgdXNpbmcgdGhlCiAgICAgICAqICJ3Y2hhcl90IiBVbmljb2RlIGRhdGEgdHlwZSBuZWVkZWQgYnkgdmFyaW91cyBsaWJjIGZ1bmN0aW9ucy4gICovCiAgICAgIHdjaGFyX3QgKnNyY3N0cl9saWJjID0gMDsKICAgICAgd2NoYXJfdCAqZHN0c3RyX2xpYmMgPSAwOwoKICAgICAgaWYoIShzcmNzdHJfbGliYyA9ICh3Y2hhcl90ICopSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY2xlbiAqIHNpemVvZih3Y2hhcl90KSkpKQogICAgICB7CiAgICAgICAgICBFUlIoIlVuYWJsZSB0byBhbGxvY2F0ZSAlZCBieXRlcyBmb3Igc3Jjc3RyX2xpYmNcbiIsCiAgICAgICAgICAgICAgc3JjbGVuICogc2l6ZW9mKHdjaGFyX3QpKTsKICAgICAgICAgIFNldExhc3RFcnJvcihFUlJPUl9OT1RfRU5PVUdIX01FTU9SWSk7CiAgICAgICAgICByZXR1cm4gMDsKICAgICAgfQoKICAgICAgLyogQ29udmVydCBzb3VyY2Ugc3RyaW5nIHRvIGEgbGliYyBVbmljb2RlIHN0cmluZy4gKi8KICAgICAgZm9yKHN0cl9pZHggPSAwOyBzdHJfaWR4IDwgc3JjbGVuOyBzdHJfaWR4KyspCiAgICAgIHsKICAgICAgICAgIHNyY3N0cl9saWJjW3N0cl9pZHhdID0gc3Jjc3RyW3N0cl9pZHhdOwogICAgICB9CgogICAgICAvKiBzcmNfbmF0aXZlIHNob3VsZCBjb250YWluIGF0IG1vc3QgMyBieXRlcyBmb3IgZWFjaAogICAgICAgKiBtdWx0aWJ5dGUgY2hhcmFjdGVycyBpbiB0aGUgb3JpZ2luYWwgc3Jjc3RyIHN0cmluZy4gICovCiAgICAgIHNyY19uYXRpdmVfbGVuID0gMyAqIHNyY2xlbjsKICAgICAgaWYoIShzcmNfbmF0aXZlID0gKExQU1RSKUhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfbmF0aXZlX2xlbikpKQogICAgICB7CiAgICAgICAgICBFUlIoIlVuYWJsZSB0byBhbGxvY2F0ZSAlZCBieXRlcyBmb3Igc3JjX25hdGl2ZVxuIiwgc3JjX25hdGl2ZV9sZW4pOwogICAgICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX05PVF9FTk9VR0hfTUVNT1JZKTsKICAgICAgICAgIGlmKHNyY3N0cl9saWJjKSBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBzcmNzdHJfbGliYyk7CiAgICAgICAgICByZXR1cm4gMDsKICAgICAgfQoKICAgICAgLyogRklYTUU6IFByaW9yIHRvIHRvIHNldHRpbmcgdGhlIExDX0NPTExBVEUgbG9jYWxlIGNhdGVnb3J5IHRoZQogICAgICAgKiBjdXJyZW50IHZhbHVlIGlzIGJhY2tlZCB1cCBzbyBpdCBjYW4gYmUgcmVzdG9yZWQgYWZ0ZXIgdGhlCiAgICAgICAqIGxhc3QgTENfQ09MTEFURSBzZW5zaXRpdmUgZnVuY3Rpb24gcmV0dXJucy4KICAgICAgICoKICAgICAgICogRXZlbiB0aG91Z2ggdGhlIGxvY2FsZSBpcyBhZGp1c3RlZCBmb3IgYSBtaW5pbXVtIGFtb3VudCBvZgogICAgICAgKiB0aW1lIGEgcmFjZSBjb25kaXRpb24gZXhpc3RzIHdoZXJlIG90aGVyIHRocmVhZHMgbWF5IGJlCiAgICAgICAqIGFmZmVjdGVkIGlmIHRoZXkgaW52b2tlIExDX0NPTExBVEUgc2Vuc2l0aXZlIGZ1bmN0aW9ucy4gIE9uZQogICAgICAgKiBwb3NzaWJsZSBzb2x1dGlvbiBpcyB0byB3cmFwIGFsbCBMQ19DT0xMQVRFIHNlbnNpdGl2ZSBXaW5lCiAgICAgICAqIGZ1bmN0aW9ucywgbGlrZSBMQ01hcFN0cmluZ1coKSwgaW4gYSBtdXRleC4KICAgICAgICoKICAgICAgICogQW5vdGhlciBlbmhhbmNlbWVudCB0byB0aGUgZm9sbG93aW5nIHdvdWxkIGJlIHRvIHNldCB0aGUKICAgICAgICogTENfQ09MTEFURSBsb2NhbGUgY2F0ZWdvcnkgYXMgYSBmdW5jdGlvbiBvZiB0aGUgImxjaWQiCiAgICAgICAqIHBhcmFtZXRlciBpbnN0ZWFkIG9mIHRoZSAiTENfQ09MTEFURSIgZW52aXJvbm1lbnQgdmFyaWFibGUuICovCiAgICAgIGlmKCEobGNfY29sbGF0ZV9kZWZhdWx0ID0gc2V0bG9jYWxlKExDX0NPTExBVEUsIE5VTEwpKSkKICAgICAgewogICAgICAgICAgRVJSKCJVbmFibGUgdG8gcXVlcnkgdGhlIExDX0NPTExBVEUgY2F0YWdvcnlcbiIpOwogICAgICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKICAgICAgICAgIGlmKHNyY3N0cl9saWJjKSBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBzcmNzdHJfbGliYyk7CiAgICAgICAgICBpZihzcmNfbmF0aXZlKSBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBzcmNfbmF0aXZlKTsKICAgICAgICAgIHJldHVybiAwOwogICAgICB9CgogICAgICBpZighKGxjX2NvbGxhdGVfZW52ID0gc2V0bG9jYWxlKExDX0NPTExBVEUsICIiKSkpCiAgICAgIHsKICAgICAgICAgIEVSUigiVW5hYmxlIHRvIGluaGVyaXQgdGhlIExDX0NPTExBVEUgbG9jYWxlIGNhdGVnb3J5IGZyb20gdGhlICIKICAgICAgICAgICAgICAiZW52aXJvbm1lbnQuICBUaGUgXCJMQ19DT0xMQVRFXCIgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgIgogICAgICAgICAgICAgICJcIiVzXCIuXG4iLCBnZXRlbnYoIkxDX0NPTExBVEUiKSA/CiAgICAgICAgICAgICAgZ2V0ZW52KCJMQ19DT0xMQVRFIikgOiAiPHVuc2V0PiIpOwogICAgICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKICAgICAgICAgIGlmKHNyY3N0cl9saWJjKSBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBzcmNzdHJfbGliYyk7CiAgICAgICAgICBpZihzcmNfbmF0aXZlKSBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBzcmNfbmF0aXZlKTsKICAgICAgICAgIHJldHVybiAwOwogICAgICB9CgogICAgICBUUkFDRSgibGNfY29sbGF0ZV9kZWZhdWx0ID0gJXNcbiIsIGxjX2NvbGxhdGVfZGVmYXVsdCk7CiAgICAgIFRSQUNFKCJsY19jb2xsYXRlX2VudiA9ICVzXG4iLCBsY19jb2xsYXRlX2Vudik7CgogICAgICAvKiBDb252ZXJ0IHRoZSBsaWJjIFVuaWNvZGUgc3RyaW5nIHRvIGEgbmF0aXZlIG11bHRpYnl0ZSBjaGFyYWN0ZXIKICAgICAgICogc3RyaW5nLiAqLwogICAgICByZXR1cm5lZF9sZW4gPSB3Y3N0b21icyhzcmNfbmF0aXZlLCBzcmNzdHJfbGliYywgc3JjX25hdGl2ZV9sZW4pICsgMTsKICAgICAgaWYocmV0dXJuZWRfbGVuID09IDApCiAgICAgIHsKICAgICAgICAgIEVSUigid2NzdG9tYnMgZmFpbGVkLiAgVGhlIHN0cmluZyBzcGVjaWZpZWQgKCVzKSBtYXkgY29udGFpbiBhbiBpbnZhbGlkIGNoYXJhY3Rlci5cbiIsCiAgICAgICAgICAgICAgZGVidWdzdHJfdyhzcmNzdHIpKTsKICAgICAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CiAgICAgICAgICBpZihzcmNzdHJfbGliYykgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc3Jjc3RyX2xpYmMpOwogICAgICAgICAgaWYoc3JjX25hdGl2ZSkgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc3JjX25hdGl2ZSk7CiAgICAgICAgICBzZXRsb2NhbGUoTENfQ09MTEFURSwgbGNfY29sbGF0ZV9kZWZhdWx0KTsKICAgICAgICAgIHJldHVybiAwOwogICAgICB9CiAgICAgIGVsc2UgaWYocmV0dXJuZWRfbGVuID4gc3JjX25hdGl2ZV9sZW4pCiAgICAgIHsKICAgICAgICAgIHNyY19uYXRpdmVbc3JjX25hdGl2ZV9sZW4gLSAxXSA9IDA7CiAgICAgICAgICBFUlIoIndjc3RvbWJzIHJldHVybmVkIGEgc3RyaW5nICglcykgdGhhdCB3YXMgbG9uZ2VyICglZCBieXRlcykgIgogICAgICAgICAgICAgICJ0aGFuIGV4cGVjdGVkICglZCBieXRlcykuXG4iLCBzcmNfbmF0aXZlLCByZXR1cm5lZF9sZW4sCiAgICAgICAgICAgICAgZHN0X25hdGl2ZV9sZW4pOwoKICAgICAgICAgIC8qIFNpbmNlIHRoaXMgaXMgYW4gaW50ZXJuYWwgZXJyb3IgSSdtIG5vdCBzdXJlIHdoYXQgdGhlIGNvcnJlY3QKICAgICAgICAgICAqIGVycm9yIGNvZGUgaXMuICAqLwogICAgICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX05PVF9FTk9VR0hfTUVNT1JZKTsKCiAgICAgICAgICBpZihzcmNzdHJfbGliYykgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc3Jjc3RyX2xpYmMpOwogICAgICAgICAgaWYoc3JjX25hdGl2ZSkgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc3JjX25hdGl2ZSk7CiAgICAgICAgICBzZXRsb2NhbGUoTENfQ09MTEFURSwgbGNfY29sbGF0ZV9kZWZhdWx0KTsKICAgICAgICAgIHJldHVybiAwOwogICAgICB9CiAgICAgIHNyY19uYXRpdmVfbGVuID0gcmV0dXJuZWRfbGVuOwoKICAgICAgVFJBQ0UoInNyY19uYXRpdmUgPSAlcyAgc3JjX25hdGl2ZV9sZW4gPSAlZFxuIiwKICAgICAgICAgICAgIHNyY19uYXRpdmUsIHNyY19uYXRpdmVfbGVuKTsKCiAgICAgIC8qIGRzdF9uYXRpdmUgc2VlbXMgdG8gY29udGFpbiBhdCBtb3N0IDQgYnl0ZXMgZm9yIGVhY2ggYnl0ZSBpbgogICAgICAgKiB0aGUgb3JpZ2luYWwgc3JjX25hdGl2ZSBzdHJpbmcuICBDaGFuZ2UgaWYgbmVlZCBiZSBzaW5jZSB0aGlzCiAgICAgICAqIGlzbid0IGRvY3VtZW50ZWQgYnkgdGhlIHN0cnhmcm0oKSBtYW4gcGFnZS4gKi8KICAgICAgZHN0X25hdGl2ZV9sZW4gPSA0ICogc3JjX25hdGl2ZV9sZW47CiAgICAgIGlmKCEoZHN0X25hdGl2ZSA9IChMUFNUUilIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgZHN0X25hdGl2ZV9sZW4pKSkKICAgICAgewogICAgICAgICAgRVJSKCJVbmFibGUgdG8gYWxsb2NhdGUgJWQgYnl0ZXMgZm9yIGRzdF9uYXRpdmVcbiIsIGRzdF9uYXRpdmVfbGVuKTsKICAgICAgICAgIFNldExhc3RFcnJvcihFUlJPUl9OT1RfRU5PVUdIX01FTU9SWSk7CiAgICAgICAgICBpZihzcmNzdHJfbGliYykgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc3Jjc3RyX2xpYmMpOwogICAgICAgICAgaWYoc3JjX25hdGl2ZSkgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc3JjX25hdGl2ZSk7CiAgICAgICAgICBzZXRsb2NhbGUoTENfQ09MTEFURSwgbGNfY29sbGF0ZV9kZWZhdWx0KTsKICAgICAgICAgIHJldHVybiAwOwogICAgICB9CgogICAgICAvKiBUaGUgYWN0dWFsIHRyYW5zbGF0aW9uIGlzIGRvbmUgYnkgdGhlIGZvbGxvd2luZyBjYWxsIHRvCiAgICAgICAqIHN0cnhmcm0oKS4gIFRoZSBzdXJyb3VuZGluZyBjb2RlIGNvdWxkIGhhdmUgYmVlbiBzaW1wbGlmaWVkCiAgICAgICAqIGJ5IGNhbGxpbmcgd2NzeGZybSgpIGluc3RlYWQgZXhjZXB0IHRoYXQgd2NzeGZybSgpIGlzIG5vdAogICAgICAgKiBhdmFpbGFibGUgb24gb2xkZXIgTGludXggc3lzdGVtcyAoUmVkSGF0IDQuMSB3aXRoCiAgICAgICAqIGxpYmMtNS4zLjEyLTE3KS4KICAgICAgICoKICAgICAgICogQWxzbywgaXQgaXMgcG9zc2libGUgdGhhdCB0aGUgdHJhbnNsYXRpb24gY291bGQgYmUgZG9uZSBieQogICAgICAgKiB2YXJpb3VzIHRhYmxlcyBhcyBpdCBpcyBkb25lIGluIExDTWFwU3RyaW5nQSgpLiAgSG93ZXZlciwgSSdtCiAgICAgICAqIG5vdCBzdXJlIHdoYXQgdGhvc2UgdGFibGVzIGFyZS4gKi8KICAgICAgcmV0dXJuZWRfbGVuID0gc3RyeGZybShkc3RfbmF0aXZlLCBzcmNfbmF0aXZlLCBkc3RfbmF0aXZlX2xlbikgKyAxOwoKICAgICAgaWYocmV0dXJuZWRfbGVuID4gZHN0X25hdGl2ZV9sZW4pCiAgICAgIHsKICAgICAgICAgIGRzdF9uYXRpdmVbZHN0X25hdGl2ZV9sZW4gLSAxXSA9IDA7CiAgICAgICAgICBFUlIoInN0cnhmcm0gcmV0dXJuZWQgYSBzdHJpbmcgKCVzKSB0aGF0IHdhcyBsb25nZXIgKCVkIGJ5dGVzKSAiCiAgICAgICAgICAgICAgInRoYW4gZXhwZWN0ZWQgKCVkIGJ5dGVzKS5cbiIsIGRzdF9uYXRpdmUsIHJldHVybmVkX2xlbiwKICAgICAgICAgICAgICBkc3RfbmF0aXZlX2xlbik7CgogICAgICAgICAgLyogU2luY2UgdGhpcyBpcyBhbiBpbnRlcm5hbCBlcnJvciBJJ20gbm90IHN1cmUgd2hhdCB0aGUgY29ycmVjdAogICAgICAgICAgICogZXJyb3IgY29kZSBpcy4gICovCiAgICAgICAgICBTZXRMYXN0RXJyb3IoRVJST1JfTk9UX0VOT1VHSF9NRU1PUlkpOwoKICAgICAgICAgIGlmKHNyY3N0cl9saWJjKSBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBzcmNzdHJfbGliYyk7CiAgICAgICAgICBpZihzcmNfbmF0aXZlKSBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBzcmNfbmF0aXZlKTsKICAgICAgICAgIGlmKGRzdF9uYXRpdmUpIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIGRzdF9uYXRpdmUpOwogICAgICAgICAgc2V0bG9jYWxlKExDX0NPTExBVEUsIGxjX2NvbGxhdGVfZGVmYXVsdCk7CiAgICAgICAgICByZXR1cm4gMDsKICAgICAgfQogICAgICBkc3RfbmF0aXZlX2xlbiA9IHJldHVybmVkX2xlbjsKCiAgICAgIFRSQUNFKCJkc3RfbmF0aXZlID0gJXMgIGRzdF9uYXRpdmVfbGVuID0gJWRcbiIsCiAgICAgICAgICAgICBkc3RfbmF0aXZlLCBkc3RfbmF0aXZlX2xlbik7CgogICAgICBkc3RzdHJfbGliY19sZW4gPSBkc3RfbmF0aXZlX2xlbjsKICAgICAgaWYoIShkc3RzdHJfbGliYyA9ICh3Y2hhcl90ICopSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdHN0cl9saWJjX2xlbiAqIHNpemVvZih3Y2hhcl90KSkpKQogICAgICB7CiAgICAgICAgICBFUlIoIlVuYWJsZSB0byBhbGxvY2F0ZSAlZCBieXRlcyBmb3IgZHN0c3RyX2xpYmNcbiIsCiAgICAgICAgICAgICAgZHN0c3RyX2xpYmNfbGVuICogc2l6ZW9mKHdjaGFyX3QpKTsKICAgICAgICAgIFNldExhc3RFcnJvcihFUlJPUl9OT1RfRU5PVUdIX01FTU9SWSk7CiAgICAgICAgICBpZihzcmNzdHJfbGliYykgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc3Jjc3RyX2xpYmMpOwogICAgICAgICAgaWYoc3JjX25hdGl2ZSkgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc3JjX25hdGl2ZSk7CiAgICAgICAgICBpZihkc3RfbmF0aXZlKSBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBkc3RfbmF0aXZlKTsKICAgICAgICAgIHNldGxvY2FsZShMQ19DT0xMQVRFLCBsY19jb2xsYXRlX2RlZmF1bHQpOwogICAgICAgICAgcmV0dXJuIDA7CiAgICAgIH0KCiAgICAgIC8qIENvbnZlcnQgdGhlIG5hdGl2ZSBtdWx0aWJ5dGUgc3RyaW5nIHRvIGEgbGliYyBVbmljb2RlIHN0cmluZy4gKi8KICAgICAgcmV0dXJuZWRfbGVuID0gbWJzdG93Y3MoZHN0c3RyX2xpYmMsIGRzdF9uYXRpdmUsIGRzdF9uYXRpdmVfbGVuKSArIDE7CgogICAgICAvKiBSZXN0b3JlIExDX0NPTExBVEUgbm93IHRoYXQgdGhlIGxhc3QgTENfQ09MTEFURSBzZW5zaXRpdmUKICAgICAgICogZnVuY3Rpb24gaGFzIHJldHVybmVkLiAqLwogICAgICBzZXRsb2NhbGUoTENfQ09MTEFURSwgbGNfY29sbGF0ZV9kZWZhdWx0KTsKCiAgICAgIGlmKHJldHVybmVkX2xlbiA9PSAwKQogICAgICB7CiAgICAgICAgICBFUlIoIm1ic3Rvd2NzIGZhaWxlZC4gIFRoZSBuYXRpdmUgdmVyc2lvbiBvZiB0aGUgdHJhbnNsYXRlZCBzdHJpbmcgIgogICAgICAgICAgICAgICIoJXMpIG1heSBjb250YWluIGFuIGludmFsaWQgY2hhcmFjdGVyLlxuIiwgZHN0X25hdGl2ZSk7CiAgICAgICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwogICAgICAgICAgaWYoc3Jjc3RyX2xpYmMpIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIHNyY3N0cl9saWJjKTsKICAgICAgICAgIGlmKHNyY19uYXRpdmUpIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIHNyY19uYXRpdmUpOwogICAgICAgICAgaWYoZHN0X25hdGl2ZSkgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgZHN0X25hdGl2ZSk7CiAgICAgICAgICBpZihkc3RzdHJfbGliYykgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgZHN0c3RyX2xpYmMpOwogICAgICAgICAgcmV0dXJuIDA7CiAgICAgIH0KICAgICAgaWYoZHN0bGVuKQogICAgICB7CiAgICAgICAgICBpZihyZXR1cm5lZF9sZW4gPiBkc3RsZW4pCiAgICAgICAgICB7CiAgICAgICAgICAgICAgRVJSKCJtYnN0b3djcyByZXR1cm5lZCBhIHN0cmluZyB0aGF0IHdhcyBsb25nZXIgKCVkIGNoYXJzKSAiCiAgICAgICAgICAgICAgICAgICJ0aGFuIHRoZSBidWZmZXIgcHJvdmlkZWQgKCVkIGNoYXJzKS5cbiIsIHJldHVybmVkX2xlbiwKICAgICAgICAgICAgICAgICAgZHN0bGVuKTsKICAgICAgICAgICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUik7CiAgICAgICAgICAgICAgaWYoc3Jjc3RyX2xpYmMpIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIHNyY3N0cl9saWJjKTsKICAgICAgICAgICAgICBpZihzcmNfbmF0aXZlKSBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBzcmNfbmF0aXZlKTsKICAgICAgICAgICAgICBpZihkc3RfbmF0aXZlKSBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBkc3RfbmF0aXZlKTsKICAgICAgICAgICAgICBpZihkc3RzdHJfbGliYykgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgZHN0c3RyX2xpYmMpOwogICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgfQogICAgICAgICAgZHN0bGVuID0gcmV0dXJuZWRfbGVuOwoKICAgICAgICAgIC8qIENvbnZlcnQgYSBsaWJjIFVuaWNvZGUgc3RyaW5nIHRvIHRoZSBkZXN0aW5hdGlvbiBzdHJpbmcuICovCiAgICAgICAgICBmb3Ioc3RyX2lkeCA9IDA7IHN0cl9pZHggPCBkc3RsZW47IHN0cl9pZHgrKykKICAgICAgICAgIHsKICAgICAgICAgICAgICBkc3RzdHJbc3RyX2lkeF0gPSBkc3RzdHJfbGliY1tzdHJfaWR4XTsKICAgICAgICAgIH0KICAgICAgICAgIFRSQUNFKCIxc3QgNCBpbnQgc2l6ZWQgY2h1bmtzIG9mIGRzdHN0ciA9ICV4ICV4ICV4ICV4XG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgKigoKGludCAqKWRzdHN0cikgKyAwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICooKChpbnQgKilkc3RzdHIpICsgMSksCiAgICAgICAgICAgICAgICAgICAgICAgICAqKCgoaW50ICopZHN0c3RyKSArIDIpLAogICAgICAgICAgICAgICAgICAgICAgICAgKigoKGludCAqKWRzdHN0cikgKyAzKSk7CiAgICAgIH0KICAgICAgZWxzZQogICAgICB7CiAgICAgICAgICBkc3RsZW4gPSByZXR1cm5lZF9sZW47CiAgICAgIH0KICAgICAgVFJBQ0UoImRzdGxlbiAocmV0dXJuKSA9ICVkXG4iLCBkc3RsZW4pOwogICAgICBpZihzcmNzdHJfbGliYykgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc3Jjc3RyX2xpYmMpOwogICAgICBpZihzcmNfbmF0aXZlKSBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBzcmNfbmF0aXZlKTsKICAgICAgaWYoZHN0X25hdGl2ZSkgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgZHN0X25hdGl2ZSk7CiAgICAgIGlmKGRzdHN0cl9saWJjKSBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBkc3RzdHJfbGliYyk7CiAgICAgIHJldHVybiBkc3RsZW47CiAgfQogIGVsc2UKICB7CiAgICBpbnQgKCpmKShpbnQpPWlkZW50aXR5OwoKICAgIGlmIChkc3RsZW49PTApCiAgICAgICAgcmV0dXJuIHNyY2xlbjsKICAgIGlmIChkc3RsZW48c3JjbGVuKQogICAgewogICAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlNVRkZJQ0lFTlRfQlVGRkVSKTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KCiAgICBpZiAobWFwZmxhZ3MgJiBMQ01BUF9VUFBFUkNBU0UpCiAgICAgIGYgPSB0b3VwcGVyOwogICAgZWxzZSBpZiAobWFwZmxhZ3MgJiBMQ01BUF9MT1dFUkNBU0UpCiAgICAgIGYgPSB0b2xvd2VyOwogICAgZm9yIChpPTA7IGkgPCBzcmNsZW47IGkrKykKICAgICAgZHN0c3RyW2ldID0gKFdDSEFSKSBmKHNyY3N0cltpXSk7CiAgICByZXR1cm4gc3JjbGVuOwogIH0KfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgT0xFMk5MU19Fc3RpbWF0ZU1hcHBpbmdMZW5ndGgKICoKICogRXN0aW1hdGVzIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyByZXF1aXJlZCB0byBob2xkIHRoZSBzdHJpbmcKICogY29tcHV0ZWQgYnkgTENNYXBTdHJpbmdBLgogKgogKiBUaGUgc2l6ZSBpcyBhbHdheXMgb3Zlci1lc3RpbWF0ZWQsIHdpdGggYSBmaXhlZCBsaW1pdCBvbiB0aGUKICogYW1vdW50IG9mIGVzdGltYXRpb24gZXJyb3IuCiAqCiAqIE5vdGUgdGhhdCBsZW4gPT0gLTEgaXMgbm90IHBlcm1pdHRlZC4KICovCnN0YXRpYyBpbmxpbmUgaW50IE9MRTJOTFNfRXN0aW1hdGVNYXBwaW5nTGVuZ3RoKExDSUQgbGNpZCwgRFdPUkQgZHdNYXBGbGFncywKCQkJCQkJTFBDU1RSIHN0ciwgRFdPUkQgbGVuKQp7CiAgICAvKiBFc3RpbWF0ZSBvbmx5IGZvciBzbWFsbCBzdHJpbmdzIHRvIGtlZXAgdGhlIGVzdGltYXRpb24gZXJyb3IgZnJvbQogICAgICogYmVjb21pbmcgdG9vIGxhcmdlLiAqLwogICAgaWYgKGxlbiA8IDEyOCkgcmV0dXJuIGxlbiAqIDggKyA1OwogICAgZWxzZSByZXR1cm4gTENNYXBTdHJpbmdBKGxjaWQsIGR3TWFwRmxhZ3MsIHN0ciwgbGVuLCBOVUxMLCAwKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQ29tcGFyZVN0cmluZ0EJW0tFUk5FTDMyLkBdCiAqIENvbXBhcmVzIHR3byBzdHJpbmdzIHVzaW5nIGxvY2FsZQogKgogKiBSRVRVUk5TCiAqCiAqIHN1Y2Nlc3M6IENTVFJfTEVTU19USEFOLCBDU1RSX0VRVUFMLCBDU1RSX0dSRUFURVJfVEhBTgogKiBmYWlsdXJlOiAwCiAqCiAqIE5PVEVTCiAqCiAqIERlZmF1bHRzIHRvIGEgd29yZCBzb3J0LCBidXQgdXNlcyBhIHN0cmluZyBzb3J0IGlmCiAqIFNPUlRfU1RSSU5HU09SVCBpcyBzZXQuCiAqIENhbGxzIFNldExhc3RFcnJvciBmb3IgRVJST1JfSU5WQUxJRF9GTEFHUywgRVJST1JfSU5WQUxJRF9QQVJBTUVURVIuCiAqCiAqIEJVR1MKICoKICogVGhpcyBpbXBsZW1lbnRhdGlvbiBpZ25vcmVzIHRoZSBsb2NhbGUKICoKICogRklYTUUKICoKICogUXVpdGUgaW5lZmZpY2llbnQuCiAqLwppbnQgV0lOQVBJIENvbXBhcmVTdHJpbmdBKAogICAgTENJRCBsY2lkLCAgICAgIC8qIFtpbl0gbG9jYWxlIElEICovCiAgICBEV09SRCBmZHdTdHlsZSwgLyogW2luXSBjb21wYXJpc29uLXN0eWxlIG9wdGlvbnMgKi8KICAgIExQQ1NUUiBzMSwgICAgICAvKiBbaW5dIGZpcnN0IHN0cmluZyAqLwogICAgaW50IGwxLCAgICAgICAgIC8qIFtpbl0gbGVuZ3RoIG9mIGZpcnN0IHN0cmluZyAqLwogICAgTFBDU1RSIHMyLCAgICAgIC8qIFtpbl0gc2Vjb25kIHN0cmluZyAqLwogICAgaW50IGwyKSAgICAgICAgIC8qIFtpbl0gbGVuZ3RoIG9mIHNlY29uZCBzdHJpbmcgKi8KewogIGludCBtYXBzdHJpbmdfZmxhZ3M7CiAgaW50IGxlbjEsbGVuMjsKICBpbnQgcmVzdWx0OwogIExQU1RSIHNrMSxzazI7CiAgVFJBQ0UoIiVzIGFuZCAlc1xuIiwKCWRlYnVnc3RyX2FuIChzMSxsMSksIGRlYnVnc3RyX2FuIChzMixsMikpOwoKICBpZiAoIChzMT09TlVMTCkgfHwgKHMyPT1OVUxMKSApCiAgewogICAgRVJSKCIoczE9JXMsczI9JXMpOiBJbnZhbGlkIE5VTEwgc3RyaW5nXG4iLAoJZGVidWdzdHJfYW4oczEsbDEpLCBkZWJ1Z3N0cl9hbihzMixsMikpOwogICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKICAgIHJldHVybiAwOwogIH0KCiAgaWYoZmR3U3R5bGUgJiBOT1JNX0lHTk9SRVNZTUJPTFMpCiAgICBGSVhNRSgiSUdOT1JFU1lNQk9MUyBub3Qgc3VwcG9ydGVkXG4iKTsKCiAgaWYgKGwxID09IC0xKSBsMSA9IHN0cmxlbihzMSk7CiAgaWYgKGwyID09IC0xKSBsMiA9IHN0cmxlbihzMik7CgogIG1hcHN0cmluZ19mbGFncyA9IExDTUFQX1NPUlRLRVkgfCBmZHdTdHlsZSA7CiAgbGVuMSA9IE9MRTJOTFNfRXN0aW1hdGVNYXBwaW5nTGVuZ3RoKGxjaWQsIG1hcHN0cmluZ19mbGFncywgczEsIGwxKTsKICBsZW4yID0gT0xFMk5MU19Fc3RpbWF0ZU1hcHBpbmdMZW5ndGgobGNpZCwgbWFwc3RyaW5nX2ZsYWdzLCBzMiwgbDIpOwoKICBpZiAoKGxlbjE9PTApfHwobGVuMj09MCkpCiAgICByZXR1cm4gMDsgICAgIC8qIHNvbWV0aGluZyB3cm9uZyBoYXBwZW5lZCAqLwoKICBzazEgPSAoTFBTVFIpSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIDAsIGxlbjEgKyBsZW4yKTsKICBzazIgPSBzazEgKyBsZW4xOwogIGlmICggKCFMQ01hcFN0cmluZ0EobGNpZCxtYXBzdHJpbmdfZmxhZ3MsczEsbDEsc2sxLGxlbjEpKQoJIHx8ICghTENNYXBTdHJpbmdBKGxjaWQsbWFwc3RyaW5nX2ZsYWdzLHMyLGwyLHNrMixsZW4yKSkgKQogIHsKICAgIEVSUigiQnVnIGluIExDbWFwU3RyaW5nQS5cbiIpOwogICAgcmVzdWx0ID0gMDsKICB9CiAgZWxzZQogIHsKICAgIC8qIHN0cmNtcCBkb2Vzbid0IG5lY2Vzc2FyaWx5IHJldHVybiAtMSwgMCwgb3IgMSAqLwogICAgcmVzdWx0ID0gc3RyY21wKHNrMSxzazIpOwogIH0KICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLDAsc2sxKTsKCiAgaWYgKHJlc3VsdCA8IDApCiAgICByZXR1cm4gMTsKICBpZiAocmVzdWx0ID09IDApCiAgICByZXR1cm4gMjsKCiAgLyogbXVzdCBiZSBncmVhdGVyLCBpZiB3ZSByZWFjaCB0aGlzIHBvaW50ICovCiAgcmV0dXJuIDM7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUNvbXBhcmVTdHJpbmdXCVtLRVJORUwzMi5AXQogKiBUaGlzIGltcGxlbWVudGF0aW9uIGlnbm9yZXMgdGhlIGxvY2FsZQogKiBGSVhNRSA6ICBEb2VzIG9ubHkgc3RyaW5nIHNvcnQuICBTaG91bGQKICogYmUgcmVpbXBsZW1lbnRlZCB0aGUgc2FtZSB3YXkgYXMgQ29tcGFyZVN0cmluZ0EuCiAqLwppbnQgV0lOQVBJIENvbXBhcmVTdHJpbmdXKExDSUQgbGNpZCwgRFdPUkQgZmR3U3R5bGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgTFBDV1NUUiBzMSwgaW50IGwxLCBMUENXU1RSIHMyLCBpbnQgbDIpCnsKCWludCBsZW4scmV0OwoJaWYoZmR3U3R5bGUgJiBOT1JNX0lHTk9SRU5PTlNQQUNFKQoJCUZJWE1FKCJJR05PUkVOT05TUEFDRSBub3Qgc3VwcG9ydGVkXG4iKTsKCWlmKGZkd1N0eWxlICYgTk9STV9JR05PUkVTWU1CT0xTKQoJCUZJWE1FKCJJR05PUkVTWU1CT0xTIG5vdCBzdXBwb3J0ZWRcbiIpOwoKCS8qIElzIHN0cmNtcCBkZWZhdWx0aW5nIHRvIHN0cmluZyBzb3J0IG9yIHRvIHdvcmQgc29ydD8/ICovCgkvKiBGSVhNRTogSGFuZGxlIE5PUk1fU1RSSU5HU09SVCAqLwoJbDEgPSAobDE9PS0xKT9zdHJsZW5XKHMxKTpsMTsKCWwyID0gKGwyPT0tMSk/c3RybGVuVyhzMik6bDI7CglsZW4gPSBsMTxsMiA/IGwxOmwyOwoJcmV0ID0gKGZkd1N0eWxlICYgTk9STV9JR05PUkVDQVNFKSA/IHN0cm5jbXBpVyhzMSxzMixsZW4pIDogc3RybmNtcFcoczEsczIsbGVuKTsKCS8qIG5vdCBlcXVhbCwgcmV0dXJuIDEgb3IgMyAqLwoJaWYocmV0IT0wKSB7CgkJLyogbmVlZCB0byB0cmFuc2xhdGUgcmVzdWx0ICovCgkJcmV0dXJuICgoaW50KXJldCA8IDApID8gMSA6IDM7Cgl9CgkvKiBzYW1lIGxlbiwgcmV0dXJuIDIgKi8KCWlmKGwxPT1sMikgcmV0dXJuIDI7CgkvKiB0aGUgbG9uZ2VyIG9uZSBpcyBsZXhpY2FsbHkgZ3JlYXRlciAqLwoJcmV0dXJuIChsMTxsMik/IDEgOiAzOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIGxzdHJjbXAgICAgKEtFUk5FTDMyLkApCiAqICAgICAgICAgICBsc3RyY21wQSAgIChLRVJORUwzMi5AKQogKi8KSU5UIFdJTkFQSSBsc3RyY21wQSggTFBDU1RSIHN0cjEsIExQQ1NUUiBzdHIyICkKewogICAgcmV0dXJuIENvbXBhcmVTdHJpbmdBKExPQ0FMRV9TWVNURU1fREVGQVVMVCwwLHN0cjEsLTEsc3RyMiwtMSkgLSAyIDsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgbHN0cmNtcFcgICAoS0VSTkVMMzIuQCkKICogRklYTUUgOiBzaG91bGQgY2FsbCBDb21wYXJlU3RyaW5nVywgd2hlbiBpdCBpcyBpbXBsZW1lbnRlZC4KICogICAgVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBub3QgIndvcmQgc29ydCIsIGFzIGl0IHNob3VsZC4KICovCklOVCBXSU5BUEkgbHN0cmNtcFcoIExQQ1dTVFIgc3RyMSwgTFBDV1NUUiBzdHIyICkKewogICAgVFJBQ0UoIiVzIGFuZCAlc1xuIiwKCQkgICBkZWJ1Z3N0cl93IChzdHIxKSwgZGVidWdzdHJfdyAoc3RyMikpOwogICAgaWYgKCFzdHIxIHx8ICFzdHIyKSB7CiAgICAJU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKCXJldHVybiAwOwogICAgfQogICAgd2hpbGUgKCpzdHIxICYmICgqc3RyMSA9PSAqc3RyMikpIHsgc3RyMSsrOyBzdHIyKys7IH0KICAgIHJldHVybiAoSU5UKSgqc3RyMSAtICpzdHIyKTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgbHN0cmNtcGkgICAgKEtFUk5FTDMyLkApCiAqICAgICAgICAgICBsc3RyY21waUEgICAoS0VSTkVMMzIuQCkKICovCklOVCBXSU5BUEkgbHN0cmNtcGlBKCBMUENTVFIgc3RyMSwgTFBDU1RSIHN0cjIgKQp7ICAgIFRSQUNFKCJzdHJjbXBpICVzIGFuZCAlc1xuIiwKCQkgICBkZWJ1Z3N0cl9hIChzdHIxKSwgZGVidWdzdHJfYSAoc3RyMikpOwogICAgcmV0dXJuIENvbXBhcmVTdHJpbmdBKExPQ0FMRV9TWVNURU1fREVGQVVMVCxOT1JNX0lHTk9SRUNBU0Usc3RyMSwtMSxzdHIyLC0xKS0yOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBsc3RyY21waVcgICAoS0VSTkVMMzIuQCkKICovCklOVCBXSU5BUEkgbHN0cmNtcGlXKCBMUENXU1RSIHN0cjEsIExQQ1dTVFIgc3RyMiApCnsKICAgIGlmICghc3RyMSB8fCAhc3RyMikgewogICAgCVNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CglyZXR1cm4gMDsKICAgIH0KICAgIHJldHVybiBzdHJjbXBpVyggc3RyMSwgc3RyMiApOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJT0xFX0dldEZvcm1hdEEJW0ludGVybmFsXQogKgogKiBGSVhNRQogKiAgICBJZiBkYXRlbGVuID09IDAsIGl0IHNob3VsZCByZXR1cm4gdGhlIHJlZ3VpcmVkIHN0cmluZyBsZW5ndGguCiAqCiBUaGlzIGZ1bmN0aW9uIGltcGxlbWVudHMgc3R1ZmYgZm9yIEdldERhdGVGb3JtYXQoKSBhbmQKIEdldFRpbWVGb3JtYXQoKS4KCiAgZCAgICBzaW5nbGUtZGlnaXQgKG5vIGxlYWRpbmcgemVybykgZGF5IChvZiBtb250aCkKICBkZCAgIHR3by1kaWdpdCBkYXkgKG9mIG1vbnRoKQogIGRkZCAgc2hvcnQgZGF5LW9mLXdlZWsgbmFtZQogIGRkZGQgbG9uZyBkYXktb2Ytd2VlayBuYW1lCiAgTSAgICBzaW5nbGUtZGlnaXQgbW9udGgKICBNTSAgIHR3by1kaWdpdCBtb250aAogIE1NTSAgc2hvcnQgbW9udGggbmFtZQogIE1NTU0gZnVsbCBtb250aCBuYW1lCiAgeSAgICB0d28tZGlnaXQgeWVhciwgbm8gbGVhZGluZyAwCiAgeXkgICB0d28tZGlnaXQgeWVhcgogIHl5eXkgZm91ci1kaWdpdCB5ZWFyCiAgZ2cgICBlcmEgc3RyaW5nCiAgaCAgICBob3VycyB3aXRoIG5vIGxlYWRpbmcgemVybyAoMTItaG91cikKICBoaCAgIGhvdXJzIHdpdGggZnVsbCB0d28gZGlnaXRzCiAgSCAgICBob3VycyB3aXRoIG5vIGxlYWRpbmcgemVybyAoMjQtaG91cikKICBISCAgIGhvdXJzIHdpdGggZnVsbCB0d28gZGlnaXRzCiAgbSAgICBtaW51dGVzIHdpdGggbm8gbGVhZGluZyB6ZXJvCiAgbW0gICBtaW51dGVzIHdpdGggZnVsbCB0d28gZGlnaXRzCiAgcyAgICBzZWNvbmRzIHdpdGggbm8gbGVhZGluZyB6ZXJvCiAgc3MgICBzZWNvbmRzIHdpdGggZnVsbCB0d28gZGlnaXRzCiAgdCAgICB0aW1lIG1hcmtlciAoQSBvciBQKQogIHR0ICAgdGltZSBtYXJrZXIgKEFNLCBQTSkKICAnJyAgIHVzZWQgdG8gcXVvdGUgbGl0ZXJhbCBjaGFyYWN0ZXJzCiAgJycgICAod2l0aGluIGEgcXVvdGVkIHN0cmluZykgaW5kaWNhdGVzIGEgbGl0ZXJhbCAnCgogVGhlc2UgZnVuY3Rpb25zIFJFUVVJUkUgdmFsaWQgbG9jYWxlLCBkYXRlLCAgYW5kIGZvcm1hdC4KICovCnN0YXRpYyBJTlQgT0xFX0dldEZvcm1hdEEoTENJRCBsb2NhbGUsCgkJCSAgICBEV09SRCBmbGFncywKCQkJICAgIERXT1JEIHRmbGFncywKCQkJICAgIGNvbnN0IFNZU1RFTVRJTUUqIHh0aW1lLAoJCQkgICAgTFBDU1RSIF9mb3JtYXQsIAkvKmluKi8KCQkJICAgIExQU1RSIGRhdGUsCQkvKm91dCovCgkJCSAgICBJTlQgZGF0ZWxlbikKewogICBJTlQgaW5wb3MsIG91dHBvczsKICAgaW50IGNvdW50LCB0eXBlLCBpbnF1b3RlLCBPdmVyZmxvdzsKICAgY2hhciBidWZbNDBdOwogICBjaGFyIGZvcm1hdFs0MF07CiAgIGNoYXIgKiBwb3M7CiAgIGludCBidWZsZW47CgogICBjb25zdCBjaGFyICogX2RnZm10W10gPSB7ICIlZCIsICIlMDJkIiB9OwogICBjb25zdCBjaGFyICoqIGRnZm10ID0gX2RnZm10IC0gMTsKCiAgIC8qIHJlcG9ydCwgZm9yIGRlYnVnZ2luZyAqLwogICBUUkFDRSgiKDB4JWx4LDB4JWx4LCAweCVseCwgdGltZSh5PSVkIG09JWQgd2Q9JWQgZD0lZCxoPSVkLG09JWQscz0lZCksIGZtdD0lcCBcJyVzXCcgLCAlcCwgbGVuPSVkKVxuIiwKICAgCSBsb2NhbGUsIGZsYWdzLCB0ZmxhZ3MsCgkgeHRpbWUtPndZZWFyLHh0aW1lLT53TW9udGgseHRpbWUtPndEYXlPZldlZWsseHRpbWUtPndEYXksIHh0aW1lLT53SG91ciwgeHRpbWUtPndNaW51dGUsIHh0aW1lLT53U2Vjb25kLAoJIF9mb3JtYXQsIF9mb3JtYXQsIGRhdGUsIGRhdGVsZW4pOwoKICAgaWYoZGF0ZWxlbiA9PSAwKSB7CiAgICAgRklYTUUoImRhdGVsZW4gPSAwLCByZXR1cm5pbmcgMjU1XG4iKTsKICAgICByZXR1cm4gMjU1OwogICB9CgogICAvKiBpbml0YWxpemUgc3RhdGUgdmFyaWFibGVzIGFuZCBvdXRwdXQgYnVmZmVyICovCiAgIGlucG9zID0gb3V0cG9zID0gMDsKICAgY291bnQgPSAwOyBpbnF1b3RlID0gMDsgT3ZlcmZsb3cgPSAwOwogICB0eXBlID0gJ1wwJzsKICAgZGF0ZVswXSA9IGJ1ZlswXSA9ICdcMCc7CgogICBzdHJjcHkoZm9ybWF0LF9mb3JtYXQpOwoKICAgLyogYWx0ZXIgdGhlIGZvcm1hdHN0cmluZywgd2hpbGUgaXQgd29ya3MgZm9yIGFsbCBsYW5ndWFnZXMgbm93IGluIHdpbmUKICAgaXRzIHBvc3NpYmxlIHRoYXQgaXQgZmFpbHMgd2hlbiB0aGUgdGltZSBsb29rcyBsaWtlIHNzOm1tOmhoIGFzIGV4YW1wbGUqLwogICBpZiAodGZsYWdzICYgKFRJTUVfTk9NSU5VVEVTT1JTRUNPTkRTKSkKICAgeyBpZiAoKHBvcyA9IHN0cnN0ciAoIGZvcm1hdCwgIjptbSIpKSkKICAgICB7IG1lbWNweSAoIHBvcywgcG9zKzMsIHN0cmxlbihmb3JtYXQpLShwb3MtZm9ybWF0KS0yICk7CiAgICAgfQogICB9CiAgIGlmICh0ZmxhZ3MgJiAoVElNRV9OT1NFQ09ORFMpKQogICB7IGlmICgocG9zID0gc3Ryc3RyICggZm9ybWF0LCAiOnNzIikpKQogICAgIHsgbWVtY3B5ICggcG9zLCBwb3MrMywgc3RybGVuKGZvcm1hdCktKHBvcy1mb3JtYXQpLTIgKTsKICAgICB9CiAgIH0KCiAgIGZvciAoaW5wb3MgPSAwOzsgaW5wb3MrKykgewogICAgICAvKiBUUkFDRSgiU1RBVEUgaW5wb3M9JTJkIG91dHBvcz0lMmQgY291bnQ9JWQgaW5xdW90ZT0lZCB0eXBlPSVjIGJ1ZixkYXRlID0gJWMsJWNcbiIsIGlucG9zLCBvdXRwb3MsIGNvdW50LCBpbnF1b3RlLCB0eXBlLCBidWZbaW5wb3NdLCBkYXRlW291dHBvc10pOyAqLwogICAgICBpZiAoaW5xdW90ZSkgewoJIGlmIChmb3JtYXRbaW5wb3NdID09ICdcJycpIHsKCSAgICBpZiAoZm9ybWF0W2lucG9zKzFdID09ICdcJycpIHsKCSAgICAgICBpbnBvcyArPSAxOwoJICAgICAgIGRhdGVbb3V0cG9zKytdID0gJ1wnJzsKCSAgICB9IGVsc2UgewoJICAgICAgIGlucXVvdGUgPSAwOwoJICAgICAgIGNvbnRpbnVlOyAvKiB3ZSBkaWQgbm90aGluZyB0byB0aGUgb3V0cHV0ICovCgkgICAgfQoJIH0gZWxzZSBpZiAoZm9ybWF0W2lucG9zXSA9PSAnXDAnKSB7CgkgICAgZGF0ZVtvdXRwb3MrK10gPSAnXDAnOwoJICAgIGlmIChvdXRwb3MgPiBkYXRlbGVuKSBPdmVyZmxvdyA9IDE7CgkgICAgYnJlYWs7CgkgfSBlbHNlIHsKCSAgICBkYXRlW291dHBvcysrXSA9IGZvcm1hdFtpbnBvc107CgkgICAgaWYgKG91dHBvcyA+IGRhdGVsZW4pIHsKCSAgICAgICBPdmVyZmxvdyA9IDE7CgkgICAgICAgZGF0ZVtvdXRwb3MtMV0gPSAnXDAnOyAvKiB0aGlzIGlzIHRoZSBsYXN0IHBsYWNlIHdoZXJlCgkJCQkJIGl0J3Mgc2FmZSB0byB3cml0ZSAqLwoJICAgICAgIGJyZWFrOwoJICAgIH0KCSB9CiAgICAgIH0gZWxzZSBpZiAoICAoY291bnQgJiYgKGZvcm1hdFtpbnBvc10gIT0gdHlwZSkpCgkJICAgfHwgY291bnQgPT0gNAoJCSAgIHx8IChjb3VudCA9PSAyICYmIHN0cmNocigiZ2hIbXN0IiwgdHlwZSkpICkgewoJICAgIGlmICh0eXBlID09ICdoJyAmJiAodGZsYWdzICYgVElNRV9GT1JDRTI0SE9VUkZPUk1BVCkpIHR5cGU9ICdIJzsKCSAgICBpZiAodHlwZSA9PSAnZCcpIHsKCSAgICAgICBpZiAoY291bnQgPT0gNCkgewoJCSAgR2V0TG9jYWxlSW5mb0EobG9jYWxlLAoJCQkJICAgTE9DQUxFX1NEQVlOQU1FMQoJCQkJICAgKyAoeHRpbWUtPndEYXlPZldlZWsrNiklNywKCQkJCSAgIGJ1Ziwgc2l6ZW9mKGJ1ZikpOwoJICAgICAgIH0gZWxzZSBpZiAoY291bnQgPT0gMykgewoJCQkgICBHZXRMb2NhbGVJbmZvQShsb2NhbGUsCgkJCQkJICAgIExPQ0FMRV9TQUJCUkVWREFZTkFNRTEKCQkJCQkgICAgKyAoeHRpbWUtPndEYXlPZldlZWsrNiklNywKCQkJCQkgICAgYnVmLCBzaXplb2YoYnVmKSk7CgkJICAgICAgfSBlbHNlIHsKCQkgIHNwcmludGYoYnVmLCBkZ2ZtdFtjb3VudF0sIHh0aW1lLT53RGF5KTsKCSAgICAgICB9CgkgICAgfSBlbHNlIGlmICh0eXBlID09ICdNJykgewoJICAgICAgIGlmIChjb3VudCA9PSAzKSB7CgkJICBHZXRMb2NhbGVJbmZvQShsb2NhbGUsCgkJCQkgICBMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTEKCQkJCSAgICsgeHRpbWUtPndNb250aCAtIDEsCgkJCQkgICBidWYsIHNpemVvZihidWYpKTsKCSAgICAgICB9IGVsc2UgaWYgKGNvdW50ID09IDQpIHsKCQkgIEdldExvY2FsZUluZm9BKGxvY2FsZSwKCQkJCSAgIExPQ0FMRV9TTU9OVEhOQU1FMQoJCQkJICAgKyB4dGltZS0+d01vbnRoIC0gMSwKCQkJCSAgIGJ1Ziwgc2l6ZW9mKGJ1ZikpOwoJCSB9IGVsc2UgewoJCSAgc3ByaW50ZihidWYsIGRnZm10W2NvdW50XSwgeHRpbWUtPndNb250aCk7CgkgICAgICAgfQoJICAgIH0gZWxzZSBpZiAodHlwZSA9PSAneScpIHsKCSAgICAgICBpZiAoY291bnQgPT0gNCkgewoJCSAgICAgIHNwcmludGYoYnVmLCAiJWQiLCB4dGltZS0+d1llYXIpOwoJICAgICAgIH0gZWxzZSBpZiAoY291bnQgPT0gMykgewoJCSAgc3RyY3B5KGJ1ZiwgInl5eSIpOwoJCSAgV0FSTigidW5rbm93biBmb3JtYXQsIGM9JWMsIG49JWRcbiIsICB0eXBlLCBjb3VudCk7CgkJIH0gZWxzZSB7CgkJICBzcHJpbnRmKGJ1ZiwgZGdmbXRbY291bnRdLCB4dGltZS0+d1llYXIgJSAxMDApOwoJICAgICAgIH0KCSAgICB9IGVsc2UgaWYgKHR5cGUgPT0gJ2cnKSB7CgkgICAgICAgaWYgICAgICAgIChjb3VudCA9PSAyKSB7CgkJICBGSVhNRSgiTE9DQUxFX0lDQUxFTkRBUlRZUEUgdW5pbXAuXG4iKTsKCQkgIHN0cmNweShidWYsICJBRCIpOwoJICAgIH0gZWxzZSB7CgkJICBzdHJjcHkoYnVmLCAiZyIpOwoJCSAgV0FSTigidW5rbm93biBmb3JtYXQsIGM9JWMsIG49JWRcbiIsIHR5cGUsIGNvdW50KTsKCSAgICAgICB9CgkgICAgfSBlbHNlIGlmICh0eXBlID09ICdoJykgewoJICAgICAgIC8qIGdpdmVzIHVzIGhvdXJzIDE6MDAgLS0gMTI6MDAgKi8KCSAgICAgICBzcHJpbnRmKGJ1ZiwgZGdmbXRbY291bnRdLCAoeHRpbWUtPndIb3VyLTEpJTEyICsxKTsKCSAgICB9IGVsc2UgaWYgKHR5cGUgPT0gJ0gnKSB7CgkgICAgICAgLyogMjQtaG91ciB0aW1lICovCgkgICAgICAgc3ByaW50ZihidWYsIGRnZm10W2NvdW50XSwgeHRpbWUtPndIb3VyKTsKCSAgICB9IGVsc2UgaWYgKCB0eXBlID09ICdtJykgewoJICAgICAgIHNwcmludGYoYnVmLCBkZ2ZtdFtjb3VudF0sIHh0aW1lLT53TWludXRlKTsKCSAgICB9IGVsc2UgaWYgKCB0eXBlID09ICdzJykgewoJICAgICAgIHNwcmludGYoYnVmLCBkZ2ZtdFtjb3VudF0sIHh0aW1lLT53U2Vjb25kKTsKCSAgICB9IGVsc2UgaWYgKHR5cGUgPT0gJ3QnKSB7CiAgICAgICAgICAgICAgIGlmICgodGZsYWdzICYgVElNRV9OT1RJTUVNQVJLRVIpKQogICAgICAgICAgICAgICAgICBidWZbMF09J1wwJzsKICAgICAgICAgICAgICAgZWxzZSBpZiAoY291bnQgPT0gMSkgewoJCSAgc3ByaW50ZihidWYsICIlYyIsICh4dGltZS0+d0hvdXIgPCAxMikgPyAnQScgOiAnUCcpOwogICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvdW50ID09IDIpIHsKICAgICAgICAgICAgICAgICAvKiBzcHJpbnRmKGJ1ZiwgIiVzIiwgKHh0aW1lLT53SG91ciA8IDEyKSA/ICJBTSIgOiAiUE0iKTsgKi8KICAgICAgICAgICAgICAgICAgR2V0TG9jYWxlSW5mb0EobG9jYWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAoeHRpbWUtPndIb3VyPDEyKQogICAgICAgICAgICAgICAgICAgICAgICAgICA/IExPQ0FMRV9TMTE1OSA6IExPQ0FMRV9TMjM1OSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmLCBzaXplb2YoYnVmKSk7CiAgICAgICAgICAgICAgIH0KCSAgICB9OwoKCSAgICAvKiB3ZSBuZWVkIHRvIGNoZWNrIHRoZSBuZXh0IGNoYXIgaW4gdGhlIGZvcm1hdCBzdHJpbmcKCSAgICAgICBhZ2Fpbiwgbm8gbWF0dGVyIHdoYXQgaGFwcGVuZWQgKi8KCSAgICBpbnBvcy0tOwoKCSAgICAvKiBhZGQgdGhlIGNvbnRlbnRzIG9mIGJ1ZiB0byB0aGUgb3V0cHV0ICovCgkgICAgYnVmbGVuID0gc3RybGVuKGJ1Zik7CgkgICAgaWYgKG91dHBvcyArIGJ1ZmxlbiA8IGRhdGVsZW4pIHsKCSAgICAgICBkYXRlW291dHBvc10gPSAnXDAnOyAvKiBmb3Igc3RyY2F0IHRvIGhvb2sgb250byAqLwoJCSBzdHJjYXQoZGF0ZSwgYnVmKTsKCSAgICAgICBvdXRwb3MgKz0gYnVmbGVuOwoJICAgIH0gZWxzZSB7CgkgICAgICAgZGF0ZVtvdXRwb3NdID0gJ1wwJzsKCSAgICAgICBzdHJuY2F0KGRhdGUsIGJ1ZiwgZGF0ZWxlbiAtIG91dHBvcyk7CgkJIGRhdGVbZGF0ZWxlbiAtIDFdID0gJ1wwJzsKCQkgU2V0TGFzdEVycm9yKEVSUk9SX0lOU1VGRklDSUVOVF9CVUZGRVIpOwoJICAgICAgIFdBUk4oImluc3VmZmljaWVudCBidWZmZXJcbiIpOwoJCSByZXR1cm4gMDsKCSAgICB9CgoJICAgIC8qIHJlc2V0IHRoZSB2YXJpYWJsZXMgd2UgdXNlZCB0byBrZWVwIHRyYWNrIG9mIHRoaXMgaXRlbSAqLwoJICAgIGNvdW50ID0gMDsKCSAgICB0eXBlID0gJ1wwJzsKCSB9IGVsc2UgaWYgKGZvcm1hdFtpbnBvc10gPT0gJ1wwJykgewoJICAgIC8qIHdlIGNhbid0IGNoZWNrIGZvciB0aGlzIGF0IHRoZSBsb29wLWhlYWQsIGJlY2F1c2UKCSAgICAgICB0aGF0IGJyZWFrcyB0aGUgcHJpbnRpbmcgb2YgdGhlIGxhc3QgZm9ybWF0LWl0ZW0gKi8KCSAgICBkYXRlW291dHBvc10gPSAnXDAnOwoJICAgIGJyZWFrOwogICAgICAgICB9IGVsc2UgaWYgKGNvdW50KSB7CgkgICAgLyogY29udGludWluZyBhIGNvZGUgZm9yIGFuIGl0ZW0gKi8KCSAgICBjb3VudCArPTE7CgkgICAgY29udGludWU7CgkgfSBlbHNlIGlmIChzdHJjaHIoImhIbXN0eU1kZyIsIGZvcm1hdFtpbnBvc10pKSB7CgkgICAgdHlwZSA9IGZvcm1hdFtpbnBvc107CgkgICAgY291bnQgPSAxOwoJICAgIGNvbnRpbnVlOwoJIH0gZWxzZSBpZiAoZm9ybWF0W2lucG9zXSA9PSAnXCcnKSB7CgkgICAgaW5xdW90ZSA9IDE7CgkgICAgY29udGludWU7CiAgICAgICB9IGVsc2UgewoJICAgIGRhdGVbb3V0cG9zKytdID0gZm9ybWF0W2lucG9zXTsKCSB9CiAgICAgIC8qIG5vdyBkZWFsIHdpdGggYSBwb3NzaWJsZSBidWZmZXIgb3ZlcmZsb3cgKi8KICAgICAgaWYgKG91dHBvcyA+PSBkYXRlbGVuKSB7CiAgICAgICBkYXRlW2RhdGVsZW4gLSAxXSA9ICdcMCc7CiAgICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUik7CiAgICAgICByZXR1cm4gMDsKICAgICAgfQogICB9CgogICBpZiAoT3ZlcmZsb3cpIHsKICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOU1VGRklDSUVOVF9CVUZGRVIpOwogICB9OwoKICAgLyogZmluaXNoIGl0IG9mZiB3aXRoIGEgc3RyaW5nIHRlcm1pbmF0b3IgKi8KICAgb3V0cG9zKys7CiAgIC8qIHNhbml0eSBjaGVjayAqLwogICBpZiAob3V0cG9zID4gZGF0ZWxlbi0xKSBvdXRwb3MgPSBkYXRlbGVuLTE7CiAgIGRhdGVbb3V0cG9zXSA9ICdcMCc7CgogICBUUkFDRSgicmV0dXJucyBzdHJpbmcgJyVzJywgbGVuICVkXG4iLCBkYXRlLCBvdXRwb3MpOwogICByZXR1cm4gb3V0cG9zOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIE9MRV9HZXRGb3JtYXRXIFtJTlRFUk5BTF0KICovCnN0YXRpYyBJTlQgT0xFX0dldEZvcm1hdFcoTENJRCBsb2NhbGUsIERXT1JEIGZsYWdzLCBEV09SRCB0ZmxhZ3MsCgkJCSAgICBjb25zdCBTWVNURU1USU1FKiB4dGltZSwKCQkJICAgIExQQ1dTVFIgZm9ybWF0LAoJCQkgICAgTFBXU1RSIG91dHB1dCwgSU5UIG91dGxlbikKewogICBJTlQgICBpbnBvcywgb3V0cG9zOwogICBpbnQgICAgIGNvdW50LCB0eXBlPTAsIGlucXVvdGU7CiAgIGludCAgICAgT3ZlcmZsb3c7IC8qIGxvb3AgY2hlY2sgKi8KICAgY2hhciAgICB0bXBbMTZdOwogICBXQ0hBUiAgIGJ1Zls0MF07CiAgIGludCAgICAgYnVmbGVuPTA7CiAgIFdDSEFSICAgYXJnMFtdID0gezB9LCBhcmcxW10gPSB7JyUnLCdkJywwfTsKICAgV0NIQVIgICBhcmcyW10gPSB7JyUnLCcwJywnMicsJ2QnLDB9OwogICBXQ0hBUiAgKmFyZ2FyclszXTsKICAgaW50ICAgICBkYXRldmFycz0wLCB0aW1ldmFycz0wOwoKICAgYXJnYXJyWzBdID0gYXJnMDsKICAgYXJnYXJyWzFdID0gYXJnMTsKICAgYXJnYXJyWzJdID0gYXJnMjsKCiAgIC8qIG1ha2UgYSBkZWJ1ZyByZXBvcnQgKi8KICAgVFJBQ0UoImFyZ3M6IDB4JWx4LCAweCVseCwgMHglbHgsIHRpbWUoZD0lZCxoPSVkLG09JWQscz0lZCksIGZtdDolcyAoYXQgJXApLCAiCiAgIAkgICAgICAiJXAgd2l0aCBtYXggbGVuICVkXG4iLAoJIGxvY2FsZSwgZmxhZ3MsIHRmbGFncywKCSB4dGltZS0+d0RheSwgeHRpbWUtPndIb3VyLCB4dGltZS0+d01pbnV0ZSwgeHRpbWUtPndTZWNvbmQsCgkgZGVidWdzdHJfdyhmb3JtYXQpLCBmb3JtYXQsIG91dHB1dCwgb3V0bGVuKTsKCiAgIGlmKG91dGxlbiA9PSAwKSB7CiAgICAgRklYTUUoIm91dGxlbiA9IDAsIHJldHVybmluZyAyNTVcbiIpOwogICAgIHJldHVybiAyNTU7CiAgIH0KCiAgIC8qIGluaXRpYWxpemUgc3RhdGUgdmFyaWFibGVzICovCiAgIGlucG9zID0gb3V0cG9zID0gMDsKICAgY291bnQgPSAwOwogICBpbnF1b3RlID0gT3ZlcmZsb3cgPSAwOwogICAvKiB0aGlzIGlzIHJlYWxseSBqdXN0IGEgc2FuaXR5IGNoZWNrICovCiAgIG91dHB1dFswXSA9IGJ1ZlswXSA9IDA7CgogICAvKiB0aGlzIGxvb3AgaXMgdGhlIGNvcmUgb2YgdGhlIGZ1bmN0aW9uICovCiAgIGZvciAoaW5wb3MgPSAwOyAvKiB3ZSBoYXZlIHNldmVyYWwgYnJlYWsgcG9pbnRzICovIDsgaW5wb3MrKykgewogICAgICBpZiAoaW5xdW90ZSkgewoJIGlmIChmb3JtYXRbaW5wb3NdID09IChXQ0hBUikgJ1wnJykgewoJICAgIGlmIChmb3JtYXRbaW5wb3MrMV0gPT0gJ1wnJykgewoJICAgICAgIGlucG9zKys7CgkgICAgICAgb3V0cHV0W291dHBvcysrXSA9ICdcJyc7CgkgICAgfSBlbHNlIHsKCSAgICAgICBpbnF1b3RlID0gMDsKCSAgICAgICBjb250aW51ZTsKCSAgICB9CgkgfSBlbHNlIGlmIChmb3JtYXRbaW5wb3NdID09IDApIHsKCSAgICBvdXRwdXRbb3V0cG9zKytdID0gMDsKCSAgICBpZiAob3V0cG9zID4gb3V0bGVuKSBPdmVyZmxvdyA9IDE7CgkgICAgYnJlYWs7ICAvKiAgbm9ybWFsIGV4aXQgKHdpdGhpbiBhIHF1b3RlKSAqLwoJIH0gZWxzZSB7CgkgICAgb3V0cHV0W291dHBvcysrXSA9IGZvcm1hdFtpbnBvc107IC8qIGNvcHkgaW5wdXQgKi8KCSAgICBpZiAob3V0cG9zID4gb3V0bGVuKSB7CgkgICAgICAgT3ZlcmZsb3cgPSAxOwoJICAgICAgIG91dHB1dFtvdXRwb3MtMV0gPSAwOwoJICAgICAgIGJyZWFrOwoJICAgIH0KCSB9CiAgICAgIH0gZWxzZSBpZiAoICAoY291bnQgJiYgKGZvcm1hdFtpbnBvc10gIT0gdHlwZSkpCgkJICAgfHwgKCAoY291bnQ9PTQgJiYgdHlwZSA9PSd5JykgfHwKCQkJKGNvdW50PT00ICYmIHR5cGUgPT0nTScpIHx8CgkJCShjb3VudD09NCAmJiB0eXBlID09J2QnKSB8fAoJCQkoY291bnQ9PTIgJiYgdHlwZSA9PSdnJykgfHwKCQkJKGNvdW50PT0yICYmIHR5cGUgPT0naCcpIHx8CgkJCShjb3VudD09MiAmJiB0eXBlID09J0gnKSB8fAoJCQkoY291bnQ9PTIgJiYgdHlwZSA9PSdtJykgfHwKCQkJKGNvdW50PT0yICYmIHR5cGUgPT0ncycpIHx8CgkJCShjb3VudD09MiAmJiB0eXBlID09J3QnKSApICApIHsKICAgICAgICAgIHN3aXRjaCh0eXBlKQogICAgICAgICAgewogICAgICAgICAgY2FzZSAnZCc6CgkgICAgaWYgICAgICAgIChjb3VudCA9PSA0KSB7CgkgICAgICAgR2V0TG9jYWxlSW5mb1cobG9jYWxlLAoJCQkgICAgIExPQ0FMRV9TREFZTkFNRTEgKyAoeHRpbWUtPndEYXlPZldlZWsgKzYpJTcsCgkJCSAgICAgYnVmLCBzaXplb2YoYnVmKS9zaXplb2YoV0NIQVIpICk7CgkgICAgfSBlbHNlIGlmIChjb3VudCA9PSAzKSB7CgkgICAgICAgR2V0TG9jYWxlSW5mb1cobG9jYWxlLAoJCQkJTE9DQUxFX1NBQkJSRVZEQVlOQU1FMSArCgkJCQkoeHRpbWUtPndEYXlPZldlZWsgKzYpJTcsCgkJCQlidWYsIHNpemVvZihidWYpL3NpemVvZihXQ0hBUikgKTsKCSAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgc3ByaW50ZiggdG1wLCAiJS4qZCIsIGNvdW50LCB4dGltZS0+d0RheSApOwogICAgICAgICAgICAgICAgTXVsdGlCeXRlVG9XaWRlQ2hhciggQ1BfQUNQLCAwLCB0bXAsIC0xLCBidWYsIHNpemVvZihidWYpL3NpemVvZihXQ0hBUikgKTsKCSAgICB9CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgIGNhc2UgJ00nOgoJICAgIGlmICAgICAgICAoY291bnQgPT0gNCkgewoJICAgICAgIEdldExvY2FsZUluZm9XKGxvY2FsZSwgIExPQ0FMRV9TTU9OVEhOQU1FMSArCgkJCQl4dGltZS0+d01vbnRoIC0xLCBidWYsCgkJCQlzaXplb2YoYnVmKS9zaXplb2YoV0NIQVIpICk7CgkgICAgfSBlbHNlIGlmIChjb3VudCA9PSAzKSB7CgkgICAgICAgR2V0TG9jYWxlSW5mb1cobG9jYWxlLCAgTE9DQUxFX1NBQkJSRVZNT05USE5BTUUxICsKCQkJCXh0aW1lLT53TW9udGggLTEsIGJ1ZiwKCQkJCXNpemVvZihidWYpL3NpemVvZihXQ0hBUikgKTsKCSAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgc3ByaW50ZiggdG1wLCAiJS4qZCIsIGNvdW50LCB4dGltZS0+d01vbnRoICk7CiAgICAgICAgICAgICAgICBNdWx0aUJ5dGVUb1dpZGVDaGFyKCBDUF9BQ1AsIDAsIHRtcCwgLTEsIGJ1Ziwgc2l6ZW9mKGJ1Zikvc2l6ZW9mKFdDSEFSKSApOwoJICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICd5JzoKCSAgICBpZiAgICAgICAgKGNvdW50ID09IDQpIHsKICAgICAgICAgICAgICAgIHNwcmludGYoIHRtcCwgIiVkIiwgeHRpbWUtPndZZWFyICk7CgkgICAgfSBlbHNlIGlmIChjb3VudCA9PSAzKSB7CiAgICAgICAgICAgICAgICBzdHJjcHkoIHRtcCwgInl5eSIgKTsKCSAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgc3ByaW50ZiggdG1wLCAiJS4qZCIsIGNvdW50LCB4dGltZS0+d1llYXIgJSAxMDAgKTsKCSAgICB9CiAgICAgICAgICAgIE11bHRpQnl0ZVRvV2lkZUNoYXIoIENQX0FDUCwgMCwgdG1wLCAtMSwgYnVmLCBzaXplb2YoYnVmKS9zaXplb2YoV0NIQVIpICk7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgIGNhc2UgJ2cnOgoJICAgIGlmICAgICAgICAoY291bnQgPT0gMikgewoJICAgICAgIEZJWE1FKCJMT0NBTEVfSUNBTEVOREFSVFlQRSB1bmltcGxlbWVudGVkXG4iKTsKICAgICAgICAgICAgICAgc3RyY3B5KCB0bXAsICJBRCIgKTsKCSAgICB9IGVsc2UgewoJICAgICAgIC8qIFdpbiBBUEkgc2V6IHdlIGNvcHkgaXQgdmVyYmF0aW0gKi8KICAgICAgICAgICAgICAgIHN0cmNweSggdG1wLCAiZyIgKTsKCSAgICB9CiAgICAgICAgICAgIE11bHRpQnl0ZVRvV2lkZUNoYXIoIENQX0FDUCwgMCwgdG1wLCAtMSwgYnVmLCBzaXplb2YoYnVmKS9zaXplb2YoV0NIQVIpICk7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgIGNhc2UgJ2gnOgogICAgICAgICAgICAgIC8qIGhvdXJzIDE6MDAtMTI6MDAgLS0tIGlzIHRoaXMgcmlnaHQ/ICovCiAgICAgICAgICAgICAgc3ByaW50ZiggdG1wLCAiJS4qZCIsIGNvdW50LCAoeHRpbWUtPndIb3VyLTEpJTEyICsxKTsKICAgICAgICAgICAgICBNdWx0aUJ5dGVUb1dpZGVDaGFyKCBDUF9BQ1AsIDAsIHRtcCwgLTEsIGJ1Ziwgc2l6ZW9mKGJ1Zikvc2l6ZW9mKFdDSEFSKSApOwogICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgIGNhc2UgJ0gnOgogICAgICAgICAgICAgIHNwcmludGYoIHRtcCwgIiUuKmQiLCBjb3VudCwgeHRpbWUtPndIb3VyICk7CiAgICAgICAgICAgICAgTXVsdGlCeXRlVG9XaWRlQ2hhciggQ1BfQUNQLCAwLCB0bXAsIC0xLCBidWYsIHNpemVvZihidWYpL3NpemVvZihXQ0hBUikgKTsKICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICBjYXNlICdtJzoKICAgICAgICAgICAgICBzcHJpbnRmKCB0bXAsICIlLipkIiwgY291bnQsIHh0aW1lLT53TWludXRlICk7CiAgICAgICAgICAgICAgTXVsdGlCeXRlVG9XaWRlQ2hhciggQ1BfQUNQLCAwLCB0bXAsIC0xLCBidWYsIHNpemVvZihidWYpL3NpemVvZihXQ0hBUikgKTsKICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICBjYXNlICdzJzoKICAgICAgICAgICAgICBzcHJpbnRmKCB0bXAsICIlLipkIiwgY291bnQsIHh0aW1lLT53U2Vjb25kICk7CiAgICAgICAgICAgICAgTXVsdGlCeXRlVG9XaWRlQ2hhciggQ1BfQUNQLCAwLCB0bXAsIC0xLCBidWYsIHNpemVvZihidWYpL3NpemVvZihXQ0hBUikgKTsKICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICBjYXNlICd0JzoKCSAgICBHZXRMb2NhbGVJbmZvVyhsb2NhbGUsICh4dGltZS0+d0hvdXIgPCAxMikgPwoJCQkgICAgIExPQ0FMRV9TMTE1OSA6IExPQ0FMRV9TMjM1OSwKCQkJICAgICBidWYsIHNpemVvZihidWYpICk7CgkgICAgaWYgICAgICAgIChjb3VudCA9PSAxKSB7CgkgICAgICAgYnVmWzFdID0gMDsKCSAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQoKCSAvKiBubyBtYXR0ZXIgd2hhdCBoYXBwZW5lZCwgIHdlIG5lZWQgdG8gY2hlY2sgdGhpcyBuZXh0CgkgICAgY2hhcmFjdGVyIHRoZSBuZXh0IHRpbWUgd2UgbG9vcCB0aHJvdWdoICovCgkgaW5wb3MtLTsKCgkgLyogY2F0IGJ1ZiBvbnRvIHRoZSBvdXRwdXQgKi8KCSBvdXRsZW4gPSBzdHJsZW5XKGJ1Zik7CgkgaWYgKG91dHBvcyArIGJ1ZmxlbiA8IG91dGxlbikgewogICAgICAgICAgICBzdHJjcHlXKCBvdXRwdXQgKyBvdXRwb3MsIGJ1ZiApOwoJICAgIG91dHBvcyArPSBidWZsZW47CgkgfSBlbHNlIHsKICAgICAgICAgICAgbHN0cmNweW5XKCBvdXRwdXQgKyBvdXRwb3MsIGJ1Ziwgb3V0bGVuIC0gb3V0cG9zICk7CgkgICAgT3ZlcmZsb3cgPSAxOwoJICAgIGJyZWFrOyAvKiBBYm5vcm1hbCBleGl0ICovCgkgfQoKCSAvKiByZXNldCB0aGUgdmFyaWFibGVzIHdlIHVzZWQgdGhpcyB0aW1lICovCgkgY291bnQgPSAwOwoJIHR5cGUgPSAnXDAnOwogICAgICB9IGVsc2UgaWYgKGZvcm1hdFtpbnBvc10gPT0gMCkgewoJIC8qIHdlIGNhbid0IGNoZWNrIGZvciB0aGlzIGF0IHRoZSBiZWdpbm5pbmcsICBiZWNhdXNlIHRoYXQKCSB3b3VsZCBrZWVwIHVzIGZyb20gcHJpbnRpbmcgYSBmb3JtYXQgc3BlYyB0aGF0IGVuZGVkIHRoZQoJIHN0cmluZyAqLwoJIG91dHB1dFtvdXRwb3NdID0gMDsKCSBicmVhazsgIC8qICBOT1JNQUwgRVhJVCAgKi8KICAgICAgfSBlbHNlIGlmIChjb3VudCkgewoJIC8qIGhvdyB3ZSBrZWVwIHRyYWNrIG9mIHRoZSBtaWRkbGUgb2YgYSBmb3JtYXQgc3BlYyAqLwoJIGNvdW50Kys7CgkgY29udGludWU7CiAgICAgIH0gZWxzZSBpZiAoIChkYXRldmFycyAmJiAoZm9ybWF0W2lucG9zXT09J2QnIHx8CgkJCQlmb3JtYXRbaW5wb3NdPT0nTScgfHwKCQkJCWZvcm1hdFtpbnBvc109PSd5JyB8fAoJCQkJZm9ybWF0W2lucG9zXT09J2cnKSAgKSB8fAoJCSAgKHRpbWV2YXJzICYmIChmb3JtYXRbaW5wb3NdPT0nSCcgfHwKCQkJCWZvcm1hdFtpbnBvc109PSdoJyB8fAoJCQkJZm9ybWF0W2lucG9zXT09J20nIHx8CgkJCQlmb3JtYXRbaW5wb3NdPT0ncycgfHwKCQkJCWZvcm1hdFtpbnBvc109PSd0JykgKSAgICApIHsKCSB0eXBlID0gZm9ybWF0W2lucG9zXTsKCSBjb3VudCA9IDE7CgkgY29udGludWU7CiAgICAgIH0gZWxzZSBpZiAoZm9ybWF0W2lucG9zXSA9PSAnXCcnKSB7CgkgaW5xdW90ZSA9IDE7CgkgY29udGludWU7CiAgICAgIH0gZWxzZSB7CgkgLyogdW5xdW90ZWQgbGl0ZXJhbHMgKi8KCSBvdXRwdXRbb3V0cG9zKytdID0gZm9ybWF0W2lucG9zXTsKICAgICAgfQogICB9CgogICBpZiAoT3ZlcmZsb3cpIHsKICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOU1VGRklDSUVOVF9CVUZGRVIpOwogICAgICBXQVJOKCIgYnVmZmVyIG92ZXJmbG93XG4iKTsKICAgfTsKCiAgIC8qIGZpbmFsIHN0cmluZyB0ZXJtaW5hdG9yIGFuZCBzYW5pdHkgY2hlY2sgKi8KICAgb3V0cG9zKys7CiAgIGlmIChvdXRwb3MgPiBvdXRsZW4tMSkgb3V0cG9zID0gb3V0bGVuLTE7CiAgIG91dHB1dFtvdXRwb3NdID0gJzAnOwoKICAgVFJBQ0UoIiByZXR1cm5pbmcgJXNcbiIsIGRlYnVnc3RyX3cob3V0cHV0KSk7CgogICByZXR1cm4gKCFPdmVyZmxvdykgPyBvdXRsZW4gOiAwOwoKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUdldERhdGVGb3JtYXRBCVtLRVJORUwzMi5AXQogKiBNYWtlcyBhbiBBU0NJSSBzdHJpbmcgb2YgdGhlIGRhdGUKICoKICogVGhpcyBmdW5jdGlvbiB1c2VzIGZvcm1hdCB0byBmb3JtYXQgdGhlIGRhdGUsICBvciwgIGlmIGZvcm1hdAogKiBpcyBOVUxMLCB1c2VzIHRoZSBkZWZhdWx0IGZvciB0aGUgbG9jYWxlLiAgZm9ybWF0IGlzIGEgc3RyaW5nCiAqIG9mIGxpdGVyYWwgZmllbGRzIGFuZCBjaGFyYWN0ZXJzIGFzIGZvbGxvd3M6CiAqCiAqIC0gZCAgICBzaW5nbGUtZGlnaXQgKG5vIGxlYWRpbmcgemVybykgZGF5IChvZiBtb250aCkKICogLSBkZCAgIHR3by1kaWdpdCBkYXkgKG9mIG1vbnRoKQogKiAtIGRkZCAgc2hvcnQgZGF5LW9mLXdlZWsgbmFtZQogKiAtIGRkZGQgbG9uZyBkYXktb2Ytd2VlayBuYW1lCiAqIC0gTSAgICBzaW5nbGUtZGlnaXQgbW9udGgKICogLSBNTSAgIHR3by1kaWdpdCBtb250aAogKiAtIE1NTSAgc2hvcnQgbW9udGggbmFtZQogKiAtIE1NTU0gZnVsbCBtb250aCBuYW1lCiAqIC0geSAgICB0d28tZGlnaXQgeWVhciwgbm8gbGVhZGluZyAwCiAqIC0geXkgICB0d28tZGlnaXQgeWVhcgogKiAtIHl5eXkgZm91ci1kaWdpdCB5ZWFyCiAqIC0gZ2cgICBlcmEgc3RyaW5nCiAqCiAqLwpJTlQgV0lOQVBJIEdldERhdGVGb3JtYXRBKExDSUQgbG9jYWxlLERXT1JEIGZsYWdzLAoJCQkgICAgICBjb25zdCBTWVNURU1USU1FKiB4dGltZSwKCQkJICAgICAgTFBDU1RSIGZvcm1hdCwgTFBTVFIgZGF0ZSxJTlQgZGF0ZWxlbikKewoKICBjaGFyIGZvcm1hdF9idWZbNDBdOwogIExQQ1NUUiB0aGlzZm9ybWF0OwogIFNZU1RFTVRJTUUgdDsKICBMUFNZU1RFTVRJTUUgdGhpc3RpbWU7CiAgTENJRCB0aGlzbG9jYWxlOwogIElOVCByZXQ7CiAgRklMRVRJTUUgZnQ7CiAgQk9PTCByZXM7CgogIFRSQUNFKCIoMHglMDRseCwweCUwOGx4LCVwLCVzLCVwLCVkKVxuIiwKCSAgICAgIGxvY2FsZSxmbGFncyx4dGltZSxmb3JtYXQsZGF0ZSxkYXRlbGVuKTsKCiAgaWYgKCFsb2NhbGUpIHsKICAgICBsb2NhbGUgPSBMT0NBTEVfU1lTVEVNX0RFRkFVTFQ7CiAgICAgfTsKCiAgaWYgKGxvY2FsZSA9PSBMT0NBTEVfU1lTVEVNX0RFRkFVTFQpIHsKICAgICB0aGlzbG9jYWxlID0gR2V0U3lzdGVtRGVmYXVsdExDSUQoKTsKICB9IGVsc2UgaWYgKGxvY2FsZSA9PSBMT0NBTEVfVVNFUl9ERUZBVUxUKSB7CiAgICAgdGhpc2xvY2FsZSA9IEdldFVzZXJEZWZhdWx0TENJRCgpOwogIH0gZWxzZSB7CiAgICAgdGhpc2xvY2FsZSA9IGxvY2FsZTsKICAgfTsKCiAgaWYgKHh0aW1lID09IE5VTEwpIHsKICAgICBHZXRTeXN0ZW1UaW1lKCZ0KTsKICB9IGVsc2UgewogICAgICAvKiBTaWxlbnRseSBjb3JyZWN0IHdEYXlPZldlZWsgYnkgdHJhbnNmb3JtaW5nIHRvIEZpbGVUaW1lIGFuZCBiYWNrIGFnYWluICovCiAgICAgIHJlcz1TeXN0ZW1UaW1lVG9GaWxlVGltZSh4dGltZSwmZnQpOwogICAgICAvKiBDaGVjayB5ZWFyKD8pL21vbnRoIGFuZCBkYXRlIGZvciByYW5nZSBhbmQgc2V0IEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSICBvbiBlcnJvciAqLwogICAgICAvKkZJWE1FOiBTeXN0ZW1UaW1lVG9GaWxlVGltZSBkb2Vzbid0IHlldCBkbyB0aGF0IGNoZWNrICovCiAgICAgIGlmKCFyZXMpCgl7CgkgIFNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CgkgIHJldHVybiAwOwoJfQogICAgICBGaWxlVGltZVRvU3lzdGVtVGltZSgmZnQsJnQpOwoKICB9OwogIHRoaXN0aW1lID0gJnQ7CgogIGlmIChmb3JtYXQgPT0gTlVMTCkgewogICAgIEdldExvY2FsZUluZm9BKHRoaXNsb2NhbGUsICgoZmxhZ3MmREFURV9MT05HREFURSkKCQkJCSAgID8gTE9DQUxFX1NMT05HREFURQoJCQkJICAgOiBMT0NBTEVfU1NIT1JUREFURSksCgkJICAgICAgZm9ybWF0X2J1Ziwgc2l6ZW9mKGZvcm1hdF9idWYpKTsKICAgICB0aGlzZm9ybWF0ID0gZm9ybWF0X2J1ZjsKICB9IGVsc2UgewogICAgIHRoaXNmb3JtYXQgPSBmb3JtYXQ7CiAgfTsKCgogIHJldCA9IE9MRV9HZXRGb3JtYXRBKHRoaXNsb2NhbGUsIGZsYWdzLCAwLCB0aGlzdGltZSwgdGhpc2Zvcm1hdCwKCQkgICAgICAgZGF0ZSwgZGF0ZWxlbik7CgoKICAgVFJBQ0UoCgkgICAgICAgIkdldERhdGVGb3JtYXRBKCkgcmV0dXJuaW5nICVkLCB3aXRoIGRhdGE9JXNcbiIsCgkgICAgICAgcmV0LCBkYXRlKTsKICByZXR1cm4gcmV0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlHZXREYXRlRm9ybWF0VwlbS0VSTkVMMzIuQF0KICogTWFrZXMgYSBVbmljb2RlIHN0cmluZyBvZiB0aGUgZGF0ZQogKgogKiBBY3RzIHRoZSBzYW1lIGFzIEdldERhdGVGb3JtYXRBKCksICBleGNlcHQgdGhhdCBpdCdzIFVuaWNvZGUuCiAqIEFjY2VwdHMgJiByZXR1cm5zIHNpemVzIGFzIGNvdW50cyBvZiBVbmljb2RlIGNoYXJhY3RlcnMuCiAqCiAqLwpJTlQgV0lOQVBJIEdldERhdGVGb3JtYXRXKExDSUQgbG9jYWxlLERXT1JEIGZsYWdzLAoJCQkgICAgICBjb25zdCBTWVNURU1USU1FKiB4dGltZSwKCQkJICAgICAgTFBDV1NUUiBmb3JtYXQsCgkJCSAgICAgIExQV1NUUiBkYXRlLCBJTlQgZGF0ZWxlbikKewogICB1bnNpZ25lZCBzaG9ydCBkYXRlYXJyW10gPSB7JzEnLCc5JywnOScsJzQnLCctJywnMScsJy0nLCcxJywwfTsKCiAgIEZJWE1FKCJTVFVCIChzaG91bGQgY2FsbCBPTEVfR2V0Rm9ybWF0VylcbiIpOwogICBsc3RyY3B5blcoZGF0ZSwgZGF0ZWFyciwgZGF0ZWxlbik7CiAgIHJldHVybiAoICBkYXRlbGVuIDwgOSkgPyBkYXRlbGVuIDogOTsKCgp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgIEVudW1EYXRlRm9ybWF0c0EJKEtFUk5FTDMyLkApCiAqLwpCT09MIFdJTkFQSSBFbnVtRGF0ZUZvcm1hdHNBKAogIERBVEVGTVRfRU5VTVBST0NBIGxwRGF0ZUZtdEVudW1Qcm9jLCBMQ0lEIExvY2FsZSwgIERXT1JEIGR3RmxhZ3MpCnsKICBMQ0lEIExvYyA9IEdldFVzZXJEZWZhdWx0TENJRCgpOwogIGlmKCFscERhdGVGbXRFbnVtUHJvYykKICAgIHsKICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKICAgICAgcmV0dXJuIEZBTFNFOwogICAgfQoKICBzd2l0Y2goIExvYyApCiB7CgogICBjYXNlIDB4MDAwMDA0MDc6ICAvKiAoTG9jLCJkZV9ERSIpICovCiAgIHsKICAgIHN3aXRjaChkd0ZsYWdzKQogICAgewogICAgICBjYXNlIERBVEVfU0hPUlREQVRFOgoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkZC5NTS55eSIpKSByZXR1cm4gVFJVRTsKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZC5NLnl5eXkiKSkgcmV0dXJuIFRSVUU7CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoImQuTU0ueXkiKSkgcmV0dXJuIFRSVUU7CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoImQuTS55eSIpKSByZXR1cm4gVFJVRTsKCXJldHVybiBUUlVFOwogICAgICBjYXNlIERBVEVfTE9OR0RBVEU6CiAgICAgICAgaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkZGRkLGQuIE1NTU0geXl5eSIpKSByZXR1cm4gVFJVRTsKICAgICAgICBpZighKCpscERhdGVGbXRFbnVtUHJvYykoImQuIE1NTU0geXl5eSIpKSByZXR1cm4gVFJVRTsKICAgICAgICBpZighKCpscERhdGVGbXRFbnVtUHJvYykoImQuIE1NTSB5eXl5IikpIHJldHVybiBUUlVFOwoJcmV0dXJuIFRSVUU7CiAgICAgIGRlZmF1bHQ6CglGSVhNRSgiVW5rbm93biBkYXRlIGZvcm1hdCAoJWxkKVxuIiwgZHdGbGFncyk7CglTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwoJcmV0dXJuIEZBTFNFOwogICAgIH0KICAgfQoKICAgY2FzZSAweDAwMDAwNDBjOiAgLyogKExvYywiZnJfRlIiKSAqLwogICB7CiAgICBzd2l0Y2goZHdGbGFncykKICAgIHsKICAgICAgY2FzZSBEQVRFX1NIT1JUREFURToKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZGQvTU0veXkiKSkgcmV0dXJuIFRSVUU7CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkLk1NLnl5IikpIHJldHVybiBUUlVFOwoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkZC1NTS15eSIpKSByZXR1cm4gVFJVRTsKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZGQvTU0veXl5eSIpKSByZXR1cm4gVFJVRTsKCXJldHVybiBUUlVFOwogICAgICBjYXNlIERBVEVfTE9OR0RBVEU6CiAgICAgICAgaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkZGRkIGQgTU1NTSB5eXl5IikpIHJldHVybiBUUlVFOwogICAgICAgIGlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZCBNTU0geXkiKSkgcmV0dXJuIFRSVUU7CiAgICAgICAgaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkIE1NTU0geXl5eSIpKSByZXR1cm4gVFJVRTsKCXJldHVybiBUUlVFOwogICAgICBkZWZhdWx0OgoJRklYTUUoIlVua25vd24gZGF0ZSBmb3JtYXQgKCVsZClcbiIsIGR3RmxhZ3MpOwoJU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKCXJldHVybiBGQUxTRTsKICAgICB9CiAgIH0KCiAgIGNhc2UgMHgwMDAwMGMwYzogIC8qIChMb2MsImZyX0NBIikgKi8KICAgewogICAgc3dpdGNoKGR3RmxhZ3MpCiAgICB7CiAgICAgIGNhc2UgREFURV9TSE9SVERBVEU6CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoInl5LU1NLWRkIikpIHJldHVybiBUUlVFOwoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkZC1NTS15eSIpKSByZXR1cm4gVFJVRTsKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgieXkgTU0gZGQiKSkgcmV0dXJuIFRSVUU7CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkL01NL3l5IikpIHJldHVybiBUUlVFOwoJcmV0dXJuIFRSVUU7CiAgICAgIGNhc2UgREFURV9MT05HREFURToKICAgICAgICBpZighKCpscERhdGVGbXRFbnVtUHJvYykoImQgTU1NTSwgeXl5eSIpKSByZXR1cm4gVFJVRTsKICAgICAgICBpZighKCpscERhdGVGbXRFbnVtUHJvYykoImQgTU1NIHl5eXkiKSkgcmV0dXJuIFRSVUU7CglyZXR1cm4gVFJVRTsKICAgICAgZGVmYXVsdDoKCUZJWE1FKCJVbmtub3duIGRhdGUgZm9ybWF0ICglbGQpXG4iLCBkd0ZsYWdzKTsKCVNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CglyZXR1cm4gRkFMU0U7CiAgICAgfQogICB9CgogICBjYXNlIDB4MDAwMDA4MDk6ICAvKiAoTG9jLCJlbl9VSyIpICovCiAgewogICBzd2l0Y2goZHdGbGFncykKICAgIHsKICAgICAgY2FzZSBEQVRFX1NIT1JUREFURToKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZGQvTU0veXkiKSkgcmV0dXJuIFRSVUU7CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkL01NL3l5eXkiKSkgcmV0dXJuIFRSVUU7CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoImQvTS95eSIpKSByZXR1cm4gVFJVRTsKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZC5NLnl5IikpIHJldHVybiBUUlVFOwoJcmV0dXJuIFRSVUU7CiAgICAgIGNhc2UgREFURV9MT05HREFURToKICAgICAgICBpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkIE1NTU0geXl5eSIpKSByZXR1cm4gVFJVRTsKICAgICAgICBpZighKCpscERhdGVGbXRFbnVtUHJvYykoImQgTU1NTSB5eXl5IikpIHJldHVybiBUUlVFOwoJcmV0dXJuIFRSVUU7CiAgICAgIGRlZmF1bHQ6CglGSVhNRSgiVW5rbm93biBkYXRlIGZvcm1hdCAoJWxkKVxuIiwgZHdGbGFncyk7CglTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwoJcmV0dXJuIEZBTFNFOwogICAgfQogIH0KCiAgIGNhc2UgMHgwMDAwMGMwOTogIC8qIChMb2MsImVuX0FVIikgKi8KICB7CiAgIHN3aXRjaChkd0ZsYWdzKQogICAgewogICAgICBjYXNlIERBVEVfU0hPUlREQVRFOgoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkL01NL3l5IikpIHJldHVybiBUUlVFOwoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkL00veXkiKSkgcmV0dXJuIFRSVUU7CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkL01NL3l5IikpIHJldHVybiBUUlVFOwoJcmV0dXJuIFRSVUU7CiAgICAgIGNhc2UgREFURV9MT05HREFURToKICAgICAgICBpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkZGQsZCBNTU1NIHl5eXkiKSkgcmV0dXJuIFRSVUU7CiAgICAgICAgaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkIE1NTU0geXl5eSIpKSByZXR1cm4gVFJVRTsKCXJldHVybiBUUlVFOwogICAgICBkZWZhdWx0OgoJRklYTUUoIlVua25vd24gZGF0ZSBmb3JtYXQgKCVsZClcbiIsIGR3RmxhZ3MpOwoJU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKCXJldHVybiBGQUxTRTsKICAgIH0KICB9CgogICBjYXNlIDB4MDAwMDEwMDk6ICAvKiAoTG9jLCJlbl9DQSIpICovCiAgewogICBzd2l0Y2goZHdGbGFncykKICAgIHsKICAgICAgY2FzZSBEQVRFX1NIT1JUREFURToKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZGQvTU0veXkiKSkgcmV0dXJuIFRSVUU7CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoImQvTS95eSIpKSByZXR1cm4gVFJVRTsKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgieXktTU0tZGQiKSkgcmV0dXJuIFRSVUU7CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoIk0vZGQveXkiKSkgcmV0dXJuIFRSVUU7CglyZXR1cm4gVFJVRTsKICAgICAgY2FzZSBEQVRFX0xPTkdEQVRFOgogICAgICAgIGlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZC1NTU0teXkiKSkgcmV0dXJuIFRSVUU7CiAgICAgICAgaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJNTU1NIGQsIHl5eXkiKSkgcmV0dXJuIFRSVUU7CglyZXR1cm4gVFJVRTsKICAgICAgZGVmYXVsdDoKCUZJWE1FKCJVbmtub3duIGRhdGUgZm9ybWF0ICglbGQpXG4iLCBkd0ZsYWdzKTsKCVNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CglyZXR1cm4gRkFMU0U7CiAgICB9CiAgfQoKICAgY2FzZSAweDAwMDAxNDA5OiAgLyogKExvYywiZW5fTloiKSAqLwogIHsKICAgc3dpdGNoKGR3RmxhZ3MpCiAgICB7CiAgICAgIGNhc2UgREFURV9TSE9SVERBVEU6CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoImQvTU0veXkiKSkgcmV0dXJuIFRSVUU7CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkL01NL3l5IikpIHJldHVybiBUUlVFOwoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkLk1NLnl5IikpIHJldHVybiBUUlVFOwoJcmV0dXJuIFRSVUU7CiAgICAgIGNhc2UgREFURV9MT05HREFURToKICAgICAgICBpZighKCpscERhdGVGbXRFbnVtUHJvYykoImQgTU1NTSB5eXl5IikpIHJldHVybiBUUlVFOwogICAgICAgIGlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZGRkZCwgZCBNTU1NIHl5eXkiKSkgcmV0dXJuIFRSVUU7CglyZXR1cm4gVFJVRTsKICAgICAgZGVmYXVsdDoKCUZJWE1FKCJVbmtub3duIGRhdGUgZm9ybWF0ICglbGQpXG4iLCBkd0ZsYWdzKTsKCVNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CglyZXR1cm4gRkFMU0U7CiAgICB9CiAgfQoKICAgY2FzZSAweDAwMDAxODA5OiAgLyogKExvYywiZW5fSUUiKSAqLwogIHsKICAgc3dpdGNoKGR3RmxhZ3MpCiAgICB7CiAgICAgIGNhc2UgREFURV9TSE9SVERBVEU6CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkL01NL3l5IikpIHJldHVybiBUUlVFOwoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkL00veXkiKSkgcmV0dXJuIFRSVUU7CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoImQuTS55eSIpKSByZXR1cm4gVFJVRTsKCXJldHVybiBUUlVFOwogICAgICBjYXNlIERBVEVfTE9OR0RBVEU6CiAgICAgICAgaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkZCBNTU1NIHl5eXkiKSkgcmV0dXJuIFRSVUU7CiAgICAgICAgaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkIE1NTU0geXl5eSIpKSByZXR1cm4gVFJVRTsKCXJldHVybiBUUlVFOwogICAgICBkZWZhdWx0OgoJRklYTUUoIlVua25vd24gZGF0ZSBmb3JtYXQgKCVsZClcbiIsIGR3RmxhZ3MpOwoJU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKCXJldHVybiBGQUxTRTsKICAgIH0KICB9CgogICBjYXNlIDB4MDAwMDFjMDk6ICAvKiAoTG9jLCJlbl9aQSIpICovCiAgewogICBzd2l0Y2goZHdGbGFncykKICAgIHsKICAgICAgY2FzZSBEQVRFX1NIT1JUREFURToKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgieXkvTU0vZGQiKSkgcmV0dXJuIFRSVUU7CglyZXR1cm4gVFJVRTsKICAgICAgY2FzZSBEQVRFX0xPTkdEQVRFOgogICAgICAgIGlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZGQgTU1NTSB5eXl5IikpIHJldHVybiBUUlVFOwoJcmV0dXJuIFRSVUU7CiAgICAgIGRlZmF1bHQ6CglGSVhNRSgiVW5rbm93biBkYXRlIGZvcm1hdCAoJWxkKVxuIiwgZHdGbGFncyk7CglTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwoJcmV0dXJuIEZBTFNFOwogICAgfQogIH0KCiAgIGNhc2UgMHgwMDAwMjAwOTogIC8qIChMb2MsImVuX0pNIikgKi8KICB7CiAgIHN3aXRjaChkd0ZsYWdzKQogICAgewogICAgICBjYXNlIERBVEVfU0hPUlREQVRFOgoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkZC9NTS95eXl5IikpIHJldHVybiBUUlVFOwoJcmV0dXJuIFRSVUU7CiAgICAgIGNhc2UgREFURV9MT05HREFURToKICAgICAgICBpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkZGQsTU1NTSBkZCx5eXl5IikpIHJldHVybiBUUlVFOwogICAgICAgIGlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiTU1NTSBkZCx5eXl5IikpIHJldHVybiBUUlVFOwogICAgICAgIGlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZGRkZCxkZCBNTU1NLHl5eXkiKSkgcmV0dXJuIFRSVUU7CiAgICAgICAgaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkZCBNTU1NLHl5eXkiKSkgcmV0dXJuIFRSVUU7CglyZXR1cm4gVFJVRTsKICAgICAgZGVmYXVsdDoKCUZJWE1FKCJVbmtub3duIGRhdGUgZm9ybWF0ICglbGQpXG4iLCBkd0ZsYWdzKTsKCVNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CglyZXR1cm4gRkFMU0U7CiAgICB9CiAgfQoKICAgY2FzZSAweDAwMDAyODA5OiAgLyogKExvYywiZW5fQloiKSAqLwogICBjYXNlIDB4MDAwMDJjMDk6ICAvKiAoTG9jLCJlbl9UVCIpICovCiAgewogICBzd2l0Y2goZHdGbGFncykKICAgIHsKICAgICAgY2FzZSBEQVRFX1NIT1JUREFURToKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZGQvTU0veXl5eSIpKSByZXR1cm4gVFJVRTsKCXJldHVybiBUUlVFOwogICAgICBjYXNlIERBVEVfTE9OR0RBVEU6CiAgICAgICAgaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkZGRkLGRkIE1NTU0geXl5eSIpKSByZXR1cm4gVFJVRTsKCXJldHVybiBUUlVFOwogICAgICBkZWZhdWx0OgoJRklYTUUoIlVua25vd24gZGF0ZSBmb3JtYXQgKCVsZClcbiIsIGR3RmxhZ3MpOwoJU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKCXJldHVybiBGQUxTRTsKICAgIH0KICB9CgogICBkZWZhdWx0OiAgLyogZGVmYXVsdCB0byBVUyBFbmdsaXNoICJlbl9VUyIgKi8KICB7CiAgIHN3aXRjaChkd0ZsYWdzKQogICAgewogICAgICBjYXNlIERBVEVfU0hPUlREQVRFOgoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJNL2QveXkiKSkgcmV0dXJuIFRSVUU7CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoIk0vZC95eXl5IikpIHJldHVybiBUUlVFOwoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJNTS9kZC95eSIpKSByZXR1cm4gVFJVRTsKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiTU0vZGQveXl5eSIpKSByZXR1cm4gVFJVRTsKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgieXkvTU0vZGQiKSkgcmV0dXJuIFRSVUU7CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkLU1NTS15eSIpKSByZXR1cm4gVFJVRTsKCXJldHVybiBUUlVFOwogICAgICBjYXNlIERBVEVfTE9OR0RBVEU6CiAgICAgICAgaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkZGRkLCBNTU1NIGRkLCB5eXl5IikpIHJldHVybiBUUlVFOwogICAgICAgIGlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiTU1NTSBkZCwgeXl5eSIpKSByZXR1cm4gVFJVRTsKICAgICAgICBpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkZGQsIGRkIE1NTU0sIHl5eXkiKSkgcmV0dXJuIFRSVUU7CiAgICAgICAgaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkZCBNTU1NLCB5eXl5IikpIHJldHVybiBUUlVFOwoJcmV0dXJuIFRSVUU7CiAgICAgIGRlZmF1bHQ6CglGSVhNRSgiVW5rbm93biBkYXRlIGZvcm1hdCAoJWxkKVxuIiwgZHdGbGFncyk7CglTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwoJcmV0dXJuIEZBTFNFOwogICAgfQogIH0KIH0KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgICBFbnVtRGF0ZUZvcm1hdHNXCShLRVJORUwzMi5AKQogKi8KQk9PTCBXSU5BUEkgRW51bURhdGVGb3JtYXRzVygKICBEQVRFRk1UX0VOVU1QUk9DVyBscERhdGVGbXRFbnVtUHJvYywgTENJRCBMb2NhbGUsIERXT1JEIGR3RmxhZ3MpCnsKICBGSVhNRSgiKCVwLCAlbGQsICVsZCk6IHN0dWJcbiIsIGxwRGF0ZUZtdEVudW1Qcm9jLCBMb2NhbGUsIGR3RmxhZ3MpOwogIFNldExhc3RFcnJvcihFUlJPUl9DQUxMX05PVF9JTVBMRU1FTlRFRCk7CiAgcmV0dXJuIEZBTFNFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgIEVudW1UaW1lRm9ybWF0c0EJKEtFUk5FTDMyLkApCiAqLwpCT09MIFdJTkFQSSBFbnVtVGltZUZvcm1hdHNBKAogIFRJTUVGTVRfRU5VTVBST0NBIGxwVGltZUZtdEVudW1Qcm9jLCBMQ0lEIExvY2FsZSwgRFdPUkQgZHdGbGFncykKewogIExDSUQgTG9jID0gR2V0VXNlckRlZmF1bHRMQ0lEKCk7CiAgaWYoIWxwVGltZUZtdEVudW1Qcm9jKQogICAgewogICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwogICAgICByZXR1cm4gRkFMU0U7CiAgICB9CiAgaWYoZHdGbGFncykKICAgIHsKICAgICAgRklYTUUoIlVua25vd24gdGltZSBmb3JtYXQgKCVsZClcbiIsIGR3RmxhZ3MpOwogICAgfQoKICBzd2l0Y2goIExvYyApCiB7CiAgIGNhc2UgMHgwMDAwMDQwNzogIC8qIChMb2MsImRlX0RFIikgKi8KICAgewogICAgaWYoISgqbHBUaW1lRm10RW51bVByb2MpKCJISC5tbSIpKSByZXR1cm4gVFJVRTsKICAgIGlmKCEoKmxwVGltZUZtdEVudW1Qcm9jKSgiSEg6bW06c3MiKSkgcmV0dXJuIFRSVUU7CiAgICBpZighKCpscFRpbWVGbXRFbnVtUHJvYykoIkg6bW06c3MiKSkgcmV0dXJuIFRSVUU7CiAgICBpZighKCpscFRpbWVGbXRFbnVtUHJvYykoIkgubW0iKSkgcmV0dXJuIFRSVUU7CiAgICBpZighKCpscFRpbWVGbXRFbnVtUHJvYykoIkgubW0nVWhyJyIpKSByZXR1cm4gVFJVRTsKICAgIHJldHVybiBUUlVFOwogICB9CgogICBjYXNlIDB4MDAwMDA0MGM6ICAvKiAoTG9jLCJmcl9GUiIpICovCiAgIGNhc2UgMHgwMDAwMGMwYzogIC8qIChMb2MsImZyX0NBIikgKi8KICAgewogICAgaWYoISgqbHBUaW1lRm10RW51bVByb2MpKCJIOm1tIikpIHJldHVybiBUUlVFOwogICAgaWYoISgqbHBUaW1lRm10RW51bVByb2MpKCJISDptbTpzcyIpKSByZXR1cm4gVFJVRTsKICAgIGlmKCEoKmxwVGltZUZtdEVudW1Qcm9jKSgiSDptbTpzcyIpKSByZXR1cm4gVFJVRTsKICAgIGlmKCEoKmxwVGltZUZtdEVudW1Qcm9jKSgiSEgubW0iKSkgcmV0dXJuIFRSVUU7CiAgICBpZighKCpscFRpbWVGbXRFbnVtUHJvYykoIkhIJ2gnbW0iKSkgcmV0dXJuIFRSVUU7CiAgICByZXR1cm4gVFJVRTsKICAgfQoKICAgY2FzZSAweDAwMDAwODA5OiAgLyogKExvYywiZW5fVUsiKSAqLwogICBjYXNlIDB4MDAwMDBjMDk6ICAvKiAoTG9jLCJlbl9BVSIpICovCiAgIGNhc2UgMHgwMDAwMTQwOTogIC8qIChMb2MsImVuX05aIikgKi8KICAgY2FzZSAweDAwMDAxODA5OiAgLyogKExvYywiZW5fSUUiKSAqLwogICB7CiAgICBpZighKCpscFRpbWVGbXRFbnVtUHJvYykoImg6bW06c3MgdHQiKSkgcmV0dXJuIFRSVUU7CiAgICBpZighKCpscFRpbWVGbXRFbnVtUHJvYykoIkhIOm1tOnNzIikpIHJldHVybiBUUlVFOwogICAgaWYoISgqbHBUaW1lRm10RW51bVByb2MpKCJIOm1tOnNzIikpIHJldHVybiBUUlVFOwogICAgcmV0dXJuIFRSVUU7CiAgIH0KCiAgIGNhc2UgMHgwMDAwMWMwOTogIC8qIChMb2MsImVuX1pBIikgKi8KICAgY2FzZSAweDAwMDAyODA5OiAgLyogKExvYywiZW5fQloiKSAqLwogICBjYXNlIDB4MDAwMDJjMDk6ICAvKiAoTG9jLCJlbl9UVCIpICovCiAgIHsKICAgIGlmKCEoKmxwVGltZUZtdEVudW1Qcm9jKSgiaDptbTpzcyB0dCIpKSByZXR1cm4gVFJVRTsKICAgIGlmKCEoKmxwVGltZUZtdEVudW1Qcm9jKSgiaGg6bW06c3MgdHQiKSkgcmV0dXJuIFRSVUU7CiAgICByZXR1cm4gVFJVRTsKICAgfQoKICAgZGVmYXVsdDogIC8qIGRlZmF1bHQgdG8gVVMgc3R5bGUgImVuX1VTIiAqLwogICB7CiAgICBpZighKCpscFRpbWVGbXRFbnVtUHJvYykoImg6bW06c3MgdHQiKSkgcmV0dXJuIFRSVUU7CiAgICBpZighKCpscFRpbWVGbXRFbnVtUHJvYykoImhoOm1tOnNzIHR0IikpIHJldHVybiBUUlVFOwogICAgaWYoISgqbHBUaW1lRm10RW51bVByb2MpKCJIOm1tOnNzIikpIHJldHVybiBUUlVFOwogICAgaWYoISgqbHBUaW1lRm10RW51bVByb2MpKCJISDptbTpzcyIpKSByZXR1cm4gVFJVRTsKICAgIHJldHVybiBUUlVFOwogICB9CiB9Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgRW51bVRpbWVGb3JtYXRzVwkoS0VSTkVMMzIuQCkKICovCkJPT0wgV0lOQVBJIEVudW1UaW1lRm9ybWF0c1coCiAgVElNRUZNVF9FTlVNUFJPQ1cgbHBUaW1lRm10RW51bVByb2MsIExDSUQgTG9jYWxlLCBEV09SRCBkd0ZsYWdzKQp7CiAgRklYTUUoIiglcCwlbGQsJWxkKTogc3R1YlxuIiwgbHBUaW1lRm10RW51bVByb2MsIExvY2FsZSwgZHdGbGFncyk7CiAgU2V0TGFzdEVycm9yKEVSUk9SX0NBTExfTk9UX0lNUExFTUVOVEVEKTsKICByZXR1cm4gRkFMU0U7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGp1c3QgbG9jYWxseSAhCiAqICBEZXNjcmlwdGlvbjogSW52ZXJ0cyBhIHN0cmluZy4KICovCnN0YXRpYyB2b2lkIE9MRV9JbnZlcnRTdHJpbmcoY2hhciogc3RyaW5nKQp7CiAgICBjaGFyICAgIHNUbXBBcnJheVsxMjhdOwogICAgSU5UICAgICBjb3VudGVyLCBpID0gMDsKCiAgICBmb3IgKGNvdW50ZXIgPSBzdHJsZW4oc3RyaW5nKTsgY291bnRlciA+IDA7IGNvdW50ZXItLSkKICAgIHsKICAgICAgICBtZW1jcHkoc1RtcEFycmF5ICsgaSwgc3RyaW5nICsgY291bnRlci0xLCAxKTsKICAgICAgICBpKys7CiAgICB9CiAgICBtZW1jcHkoc1RtcEFycmF5ICsgaSwgIlwwIiwgMSk7CiAgICBzdHJjcHkoc3RyaW5nLCBzVG1wQXJyYXkpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQganVzdCBsb2NhbGx5ICEKICogIERlc2NyaXB0aW9uOiBUZXN0IGlmIHRoZSBnaXZlbiBzdHJpbmcgKHBzTnVtYmVyKSBpcyB2YWxpZCBvciBub3QuCiAqICAgICAgICAgICAgICAgVGhlIHZhbGlkIGNoYXJhY3RlcnMgYXJlIHRoZSBmb2xsb3dpbmc6CiAqICAgICAgICAgICAgICAgLSBDaGFyYWN0ZXJzICcwJyB0aHJvdWdoICc5Jy4KICogICAgICAgICAgICAgICAtIE9uZSBkZWNpbWFsIHBvaW50IChkb3QpIGlmIHRoZSBudW1iZXIgaXMgYSBmbG9hdGluZy1wb2ludCB2YWx1ZS4KICogICAgICAgICAgICAgICAtIEEgbWludXMgc2lnbiBpbiB0aGUgZmlyc3QgY2hhcmFjdGVyIHBvc2l0aW9uIGlmIHRoZSBudW1iZXIgaXMKICogICAgICAgICAgICAgICAgIGEgbmVnYXRpdmUgdmFsdWUuCiAqICAgICAgICAgICAgICBJZiB0aGUgZnVuY3Rpb24gc3VjY2VlZHMsIHBzQmVmb3JlL3BzQWZ0ZXIgd2lsbCBwb2ludCB0byB0aGUgc3RyaW5nCiAqICAgICAgICAgICAgICBvbiB0aGUgcmlnaHQvbGVmdCBvZiB0aGUgZGVjaW1hbCBzeW1ib2wuIHBiTmVnYXRpdmUgaW5kaWNhdGVzIGlmIHRoZQogKiAgICAgICAgICAgICAgbnVtYmVyIGlzIG5lZ2F0aXZlLgogKi8Kc3RhdGljIElOVCBPTEVfR2V0TnVtYmVyQ29tcG9uZW50cyhjaGFyKiBwSW5wdXQsIGNoYXIqIHBzQmVmb3JlLCBjaGFyKiBwc0FmdGVyLCBCT09MKiBwYk5lZ2F0aXZlKQp7CmNoYXIJc051bWJlclNldFtdID0gIjAxMjM0NTY3ODkiOwpCT09MCWJJbkRlY2ltYWwgPSBGQUxTRTsKCgkvKiBUZXN0IGlmIHdlIGRvIGhhdmUgYSBtaW51cyBzaWduICovCglpZiAoICpwSW5wdXQgPT0gJy0nICkKCXsKCQkqcGJOZWdhdGl2ZSA9IFRSVUU7CgkJcElucHV0Kys7IC8qIEp1bXAgdG8gdGhlIG5leHQgY2hhcmFjdGVyLiAqLwoJfQoKCXdoaWxlKCpwSW5wdXQgIT0gJ1wwJykKCXsKCQkvKiBEbyB3ZSBoYXZlIGEgdmFsaWQgbnVtZXJpYyBjaGFyYWN0ZXIgKi8KCQlpZiAoIHN0cmNocihzTnVtYmVyU2V0LCAqcElucHV0KSAhPSBOVUxMICkKCQl7CgkJCWlmIChiSW5EZWNpbWFsID09IFRSVUUpCiAgICAgICAgICAgICAgICAqcHNBZnRlcisrID0gKnBJbnB1dDsKCQkJZWxzZQogICAgICAgICAgICAgICAgKnBzQmVmb3JlKysgPSAqcElucHV0OwoJCX0KCQllbHNlCgkJewoJCQkvKiBJcyB0aGlzIGEgZGVjaW1hbCBwb2ludCAoZG90KSAqLwoJCQlpZiAoICpwSW5wdXQgPT0gJy4nICkKCQkJewoJCQkJLyogSXMgaXQgdGhlIGZpcnN0IHRpbWUgd2UgZmluZCBpdCAqLwoJCQkJaWYgKChiSW5EZWNpbWFsID09IEZBTFNFKSkKCQkJCQliSW5EZWNpbWFsID0gVFJVRTsKCQkJCWVsc2UKCQkJCQlyZXR1cm4gLTE7IC8qIEVSUk9SOiBJbnZhbGlkIHBhcmFtZXRlciAqLwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJLyogSXQncyBuZWl0aGVyIGEgbnVtZXJpYyBjaGFyYWN0ZXIsIG5vciBhIGRlY2ltYWwgcG9pbnQuCgkJCQkgKiBUaHVzLCByZXR1cm4gYW4gZXJyb3IuCiAgICAgICAgICAgICAgICAgKi8KCQkJCXJldHVybiAtMTsKCQkJfQoJCX0KICAgICAgICBwSW5wdXQrKzsKCX0KCgkvKiBBZGQgYW4gRW5kIG9mIExpbmUgY2hhcmFjdGVyIHRvIHRoZSBvdXRwdXQgYnVmZmVycyAqLwoJKnBzQmVmb3JlID0gJ1wwJzsKCSpwc0FmdGVyID0gJ1wwJzsKCglyZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQganVzdCBsb2NhbGx5ICEKICogIERlc2NyaXB0aW9uOiBBIG51bWJlciBjb3VsZCBiZSBmb3JtYXR0ZWQgdXNpbmcgZGlmZmVyZW50IG51bWJlcnMKICogICAgICAgICAgICAgICBvZiAiZGlnaXRzIGluIGdyb3VwIiAoZXhhbXBsZTogNDszOzI7MCkuCiAqICAgICAgICAgICAgICAgVGhlIGZpcnN0IHBhcmFtZXRlciBvZiB0aGlzIGZ1bmN0aW9uIGlzIGFuIGFycmF5CiAqICAgICAgICAgICAgICAgY29udGFpbmluZyB0aGUgcnVsZSB0byBiZSB1c2VkLiBJdHMgZm9ybWF0IGlzIHRoZSBmb2xsb3dpbmc6CiAqICAgICAgICAgICAgICAgfE5ER3xERzF8REcyfC4uLnwwfAogKiAgICAgICAgICAgICAgIHdoZXJlIE5ERyBpcyB0aGUgbnVtYmVyIG9mIHVzZWQgImRpZ2l0cyBpbiBncm91cCIgYW5kIERHMSwgREcyLAogKiAgICAgICAgICAgICAgIGFyZSB0aGUgY29ycmVzcG9uZGluZyAiZGlnaXRzIGluIGdyb3VwIi4KICogICAgICAgICAgICAgICBUaHVzLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGdyb3VwaW5nIHZhbHVlIGluIHRoZSBhcnJheQogKiAgICAgICAgICAgICAgIHBvaW50ZWQgYnkgdGhlIHNlY29uZCBwYXJhbWV0ZXIuCiAqLwpzdGF0aWMgSU5UIE9MRV9HZXRHcm91cGluZyhjaGFyKiBzUnVsZSwgSU5UIGluZGV4KQp7CiAgICBjaGFyICAgIHNEYXRhWzJdLCBzUnVsZVNpemVbMl07CiAgICBJTlQgICAgIG5EYXRhLCBuUnVsZVNpemU7CgogICAgbWVtY3B5KHNSdWxlU2l6ZSwgc1J1bGUsIDEpOwogICAgbWVtY3B5KHNSdWxlU2l6ZSsxLCAiXDAiLCAxKTsKICAgIG5SdWxlU2l6ZSA9IGF0b2koc1J1bGVTaXplKTsKCiAgICBpZiAoaW5kZXggPiAwICYmIGluZGV4IDwgblJ1bGVTaXplKQogICAgewogICAgICAgIG1lbWNweShzRGF0YSwgc1J1bGUraW5kZXgsIDEpOwogICAgICAgIG1lbWNweShzRGF0YSsxLCAiXDAiLCAxKTsKICAgICAgICBuRGF0YSA9IGF0b2koc0RhdGEpOwogICAgfQoKICAgIGVsc2UKICAgIHsKICAgICAgICBtZW1jcHkoc0RhdGEsIHNSdWxlK25SdWxlU2l6ZS0xLCAxKTsKICAgICAgICBtZW1jcHkoc0RhdGErMSwgIlwwIiwgMSk7CiAgICAgICAgbkRhdGEgPSBhdG9pKHNEYXRhKTsKICAgIH0KCiAgICByZXR1cm4gbkRhdGE7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgR2V0TnVtYmVyRm9ybWF0QQkoS0VSTkVMMzIuQCkKICovCklOVCBXSU5BUEkgR2V0TnVtYmVyRm9ybWF0QShMQ0lEIGxvY2FsZSwgRFdPUkQgZHdmbGFncywKCQkJICAgICAgIExQQ1NUUiBscHZhbHVlLCAgIGNvbnN0IE5VTUJFUkZNVEEgKiBscEZvcm1hdCwKCQkJICAgICAgIExQU1RSIGxwTnVtYmVyU3RyLCBpbnQgY2NoTnVtYmVyKQp7CiAgICBjaGFyICAgc051bWJlckRpZ2l0c1szXSwgc0RlY2ltYWxTeW1ib2xbNV0sIHNEaWdpdHNJbkdyb3VwWzExXSwgc0RpZ2l0R3JvdXBTeW1ib2xbNV0sIHNJTFplcm9bMl07CiAgICBJTlQgICAgbk51bWJlckRpZ2l0cywgbk51bWJlckRlY2ltYWwsIGksIGosIG5Db3VudGVyLCBuU3RlcCwgblJ1bGVJbmRleCwgbkdyb3VwaW5nLCBuRGlnaXRzLCByZXRWYWwsIG5MWjsKICAgIGNoYXIgICBzTnVtYmVyWzEyOF0sIHNEZXN0aW5hdGlvblsxMjhdLCBzRGlnaXRzQWZ0ZXJEZWNpbWFsWzEwXSwgc0RpZ2l0c0JlZm9yZURlY2ltYWxbMTI4XTsKICAgIGNoYXIgICBzUnVsZVsxMF0sIHNTZW1pQ29sdW1uW109IjsiLCBzQnVmZmVyWzVdLCBzTmVnTnVtYmVyWzJdOwogICAgY2hhciAgICpwU3RyID0gTlVMTCwgKnBUbXBTdHIgPSBOVUxMOwogICAgTENJRCAgIHN5c3RlbURlZmF1bHRMQ0lEOwogICAgQk9PTCAgIGJOZWdhdGl2ZSA9IEZBTFNFOwogICAgZW51bSAgIE9wZXJhdGlvbnMKICAgIHsKICAgICAgICBVU0VfUEFSQU1FVEVSLAogICAgICAgIFVTRV9MT0NBTEVJTkZPLAogICAgICAgIFVTRV9TWVNURU1ERUZBVUxULAogICAgICAgIFJFVFVSTl9FUlJPUgogICAgfSB1c2VkX29wZXJhdGlvbjsKCiAgICBzdHJuY3B5KHNOdW1iZXIsIGxwdmFsdWUsIDEyOCk7CiAgICBzTnVtYmVyWzEyN10gPSAnXDAnOwoKICAgIC8qIE1ha2Ugc3VyZSB3ZSBoYXZlIGEgdmFsaWQgaW5wdXQgc3RyaW5nLCBnZXQgdGhlIG51bWJlcgogICAgICogb2YgZGlnaXRzIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIGRlY2ltYWwgc3ltYm9sLCBhbmQgY2hlY2sKICAgICAqIGlmIHRoaXMgaXMgYSBuZWdhdGl2ZSBudW1iZXIuCiAgICAgKi8KICAgIGlmICggT0xFX0dldE51bWJlckNvbXBvbmVudHMoc051bWJlciwgc0RpZ2l0c0JlZm9yZURlY2ltYWwsIHNEaWdpdHNBZnRlckRlY2ltYWwsICZiTmVnYXRpdmUpICE9IC0xKQogICAgewogICAgICAgIG5OdW1iZXJEZWNpbWFsID0gc3RybGVuKHNEaWdpdHNCZWZvcmVEZWNpbWFsKTsKICAgICAgICBuRGlnaXRzID0gc3RybGVuKHNEaWdpdHNBZnRlckRlY2ltYWwpOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgLyogV2hpY2ggc291cmNlIHdpbGwgd2UgdXNlIHRvIGZvcm1hdCB0aGUgc3RyaW5nICovCiAgICB1c2VkX29wZXJhdGlvbiA9IFJFVFVSTl9FUlJPUjsKICAgIGlmIChscEZvcm1hdCAhPSBOVUxMKQogICAgewogICAgICAgIGlmIChkd2ZsYWdzID09IDApCiAgICAgICAgICAgIHVzZWRfb3BlcmF0aW9uID0gVVNFX1BBUkFNRVRFUjsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICBpZiAoZHdmbGFncyAmIExPQ0FMRV9OT1VTRVJPVkVSUklERSkKICAgICAgICAgICAgdXNlZF9vcGVyYXRpb24gPSBVU0VfU1lTVEVNREVGQVVMVDsKICAgICAgICBlbHNlCiAgICAgICAgICAgIHVzZWRfb3BlcmF0aW9uID0gVVNFX0xPQ0FMRUlORk87CiAgICB9CgogICAgLyogTG9hZCB0aGUgZmllbGRzIHdlIG5lZWQgKi8KICAgIHN3aXRjaCh1c2VkX29wZXJhdGlvbikKICAgIHsKICAgIGNhc2UgVVNFX0xPQ0FMRUlORk86CiAgICAgICAgR2V0TG9jYWxlSW5mb0EobG9jYWxlLCBMT0NBTEVfSURJR0lUUywgc051bWJlckRpZ2l0cywgc2l6ZW9mKHNOdW1iZXJEaWdpdHMpKTsKICAgICAgICBHZXRMb2NhbGVJbmZvQShsb2NhbGUsIExPQ0FMRV9TREVDSU1BTCwgc0RlY2ltYWxTeW1ib2wsIHNpemVvZihzRGVjaW1hbFN5bWJvbCkpOwogICAgICAgIEdldExvY2FsZUluZm9BKGxvY2FsZSwgTE9DQUxFX1NHUk9VUElORywgc0RpZ2l0c0luR3JvdXAsIHNpemVvZihzRGlnaXRzSW5Hcm91cCkpOwogICAgICAgIEdldExvY2FsZUluZm9BKGxvY2FsZSwgTE9DQUxFX1NUSE9VU0FORCwgc0RpZ2l0R3JvdXBTeW1ib2wsIHNpemVvZihzRGlnaXRHcm91cFN5bWJvbCkpOwogICAgICAgIEdldExvY2FsZUluZm9BKGxvY2FsZSwgTE9DQUxFX0lMWkVSTywgc0lMWmVybywgc2l6ZW9mKHNJTFplcm8pKTsKICAgICAgICBHZXRMb2NhbGVJbmZvQShsb2NhbGUsIExPQ0FMRV9JTkVHTlVNQkVSLCBzTmVnTnVtYmVyLCBzaXplb2Yoc05lZ051bWJlcikpOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBVU0VfUEFSQU1FVEVSOgogICAgICAgIHNwcmludGYoc051bWJlckRpZ2l0cywgIiVkIixscEZvcm1hdC0+TnVtRGlnaXRzKTsKICAgICAgICBzdHJjcHkoc0RlY2ltYWxTeW1ib2wsIGxwRm9ybWF0LT5scERlY2ltYWxTZXApOwogICAgICAgIHNwcmludGYoc0RpZ2l0c0luR3JvdXAsICIlZDswIixscEZvcm1hdC0+R3JvdXBpbmcpOwogICAgICAgIHN0cmNweShzRGlnaXRHcm91cFN5bWJvbCwgbHBGb3JtYXQtPmxwVGhvdXNhbmRTZXApOwogICAgICAgIHNwcmludGYoc0lMWmVybywgIiVkIixscEZvcm1hdC0+TGVhZGluZ1plcm8pOwogICAgICAgIHNwcmludGYoc05lZ051bWJlciwgIiVkIixscEZvcm1hdC0+TmVnYXRpdmVPcmRlcik7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIFVTRV9TWVNURU1ERUZBVUxUOgogICAgICAgIHN5c3RlbURlZmF1bHRMQ0lEID0gR2V0U3lzdGVtRGVmYXVsdExDSUQoKTsKICAgICAgICBHZXRMb2NhbGVJbmZvQShzeXN0ZW1EZWZhdWx0TENJRCwgTE9DQUxFX0lESUdJVFMsIHNOdW1iZXJEaWdpdHMsIHNpemVvZihzTnVtYmVyRGlnaXRzKSk7CiAgICAgICAgR2V0TG9jYWxlSW5mb0Eoc3lzdGVtRGVmYXVsdExDSUQsIExPQ0FMRV9TREVDSU1BTCwgc0RlY2ltYWxTeW1ib2wsIHNpemVvZihzRGVjaW1hbFN5bWJvbCkpOwogICAgICAgIEdldExvY2FsZUluZm9BKHN5c3RlbURlZmF1bHRMQ0lELCBMT0NBTEVfU0dST1VQSU5HLCBzRGlnaXRzSW5Hcm91cCwgc2l6ZW9mKHNEaWdpdHNJbkdyb3VwKSk7CiAgICAgICAgR2V0TG9jYWxlSW5mb0Eoc3lzdGVtRGVmYXVsdExDSUQsIExPQ0FMRV9TVEhPVVNBTkQsIHNEaWdpdEdyb3VwU3ltYm9sLCBzaXplb2Yoc0RpZ2l0R3JvdXBTeW1ib2wpKTsKICAgICAgICBHZXRMb2NhbGVJbmZvQShzeXN0ZW1EZWZhdWx0TENJRCwgTE9DQUxFX0lMWkVSTywgc0lMWmVybywgc2l6ZW9mKHNJTFplcm8pKTsKICAgICAgICBHZXRMb2NhbGVJbmZvQShzeXN0ZW1EZWZhdWx0TENJRCwgTE9DQUxFX0lORUdOVU1CRVIsIHNOZWdOdW1iZXIsIHNpemVvZihzTmVnTnVtYmVyKSk7CiAgICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgbk51bWJlckRpZ2l0cyA9IGF0b2koc051bWJlckRpZ2l0cyk7CgogICAgLyogUmVtb3ZlIHRoZSAiOyIgKi8KICAgIGk9MDsKICAgIGogPSAxOwogICAgZm9yIChuQ291bnRlcj0wOyBuQ291bnRlcjxzdHJsZW4oc0RpZ2l0c0luR3JvdXApOyBuQ291bnRlcisrKQogICAgewogICAgICAgIGlmICggbWVtY21wKHNEaWdpdHNJbkdyb3VwICsgbkNvdW50ZXIsIHNTZW1pQ29sdW1uLCAxKSAhPSAwICkKICAgICAgICB7CiAgICAgICAgICAgIG1lbWNweShzUnVsZSArIGosIHNEaWdpdHNJbkdyb3VwICsgbkNvdW50ZXIsIDEpOwogICAgICAgICAgICBpKys7CiAgICAgICAgICAgIGorKzsKICAgICAgICB9CiAgICB9CiAgICBzcHJpbnRmKHNCdWZmZXIsICIlZCIsIGkpOwogICAgbWVtY3B5KHNSdWxlLCBzQnVmZmVyLCAxKTsgLyogTnVtYmVyIG9mIGRpZ2l0cyBpbiB0aGUgZ3JvdXBzICggdXNlZCBieSBPTEVfR2V0R3JvdXBpbmcoKSApICovCiAgICBtZW1jcHkoc1J1bGUgKyBqLCAiXDAiLCAxKTsKCiAgICAvKiBGaXJzdCwgZm9ybWF0IHRoZSBkaWdpdHMgYmVmb3JlIHRoZSBkZWNpbWFsLiAqLwogICAgaWYgKChuTnVtYmVyRGVjaW1hbD4wKSAmJiAoYXRvaShzRGlnaXRzQmVmb3JlRGVjaW1hbCkgIT0gMCkpCiAgICB7CiAgICAgICAgLyogV29ya2luZyBvbiBhbiBpbnZlcnRlZCBzdHJpbmcgaXMgZWFzaWVyICEgKi8KICAgICAgICBPTEVfSW52ZXJ0U3RyaW5nKHNEaWdpdHNCZWZvcmVEZWNpbWFsKTsKCiAgICAgICAgblN0ZXAgPSBuQ291bnRlciA9IGkgPSBqID0gMDsKICAgICAgICBuUnVsZUluZGV4ID0gMTsKICAgICAgICBuR3JvdXBpbmcgPSBPTEVfR2V0R3JvdXBpbmcoc1J1bGUsIG5SdWxlSW5kZXgpOwoKICAgICAgICAvKiBIZXJlLCB3ZSB3aWxsIGxvb3AgdW50aWwgd2UgcmVhY2ggdGhlIGVuZCBvZiB0aGUgc3RyaW5nLgogICAgICAgICAqIEFuIGludGVybmFsIGNvdW50ZXIgKGopIGlzIHVzZWQgaW4gb3JkZXIgdG8ga25vdyB3aGVuIHRvCiAgICAgICAgICogaW5zZXJ0IHRoZSAiZGlnaXQgZ3JvdXAgc3ltYm9sIi4KICAgICAgICAgKi8KICAgICAgICB3aGlsZSAobk51bWJlckRlY2ltYWwgPiAwKQogICAgICAgIHsKICAgICAgICAgICAgaSA9IG5Db3VudGVyICsgblN0ZXA7CiAgICAgICAgICAgIG1lbWNweShzRGVzdGluYXRpb24gKyBpLCBzRGlnaXRzQmVmb3JlRGVjaW1hbCArIG5Db3VudGVyLCAxKTsKICAgICAgICAgICAgbkNvdW50ZXIrKzsKICAgICAgICAgICAgaisrOwogICAgICAgICAgICBpZiAoaiA+PSBuR3JvdXBpbmcpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGogPSAwOwogICAgICAgICAgICAgICAgaWYgKG5SdWxlSW5kZXggPCBzUnVsZVswXSkKICAgICAgICAgICAgICAgICAgICBuUnVsZUluZGV4Kys7CiAgICAgICAgICAgICAgICBuR3JvdXBpbmcgPSBPTEVfR2V0R3JvdXBpbmcoc1J1bGUsIG5SdWxlSW5kZXgpOwogICAgICAgICAgICAgICAgbWVtY3B5KHNEZXN0aW5hdGlvbiArIGkrMSwgc0RpZ2l0R3JvdXBTeW1ib2wsIHN0cmxlbihzRGlnaXRHcm91cFN5bWJvbCkpOwogICAgICAgICAgICAgICAgblN0ZXArPSBzdHJsZW4oc0RpZ2l0R3JvdXBTeW1ib2wpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBuTnVtYmVyRGVjaW1hbC0tOwogICAgICAgIH0KCiAgICAgICAgbWVtY3B5KHNEZXN0aW5hdGlvbiArIGkrMSwgIlwwIiwgMSk7CiAgICAgICAgLyogR2V0IHRoZSBzdHJpbmcgaW4gdGhlIHJpZ2h0IG9yZGVyICEgKi8KICAgICAgICBPTEVfSW52ZXJ0U3RyaW5nKHNEZXN0aW5hdGlvbik7CiAgICAgfQogICAgIGVsc2UKICAgICB7CiAgICAgICAgbkxaID0gYXRvaShzSUxaZXJvKTsKICAgICAgICBpZiAobkxaICE9IDApCiAgICAgICAgewogICAgICAgICAgICAvKiBVc2UgMC54eHggaW5zdGVhZCBvZiAueHh4ICovCiAgICAgICAgICAgIG1lbWNweShzRGVzdGluYXRpb24sICIwIiwgMSk7CiAgICAgICAgICAgIG1lbWNweShzRGVzdGluYXRpb24rMSwgIlwwIiwgMSk7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICAgICAgbWVtY3B5KHNEZXN0aW5hdGlvbiwgIlwwIiwgMSk7CgogICAgIH0KCiAgICAvKiBTZWNvbmQsIGZvcm1hdCB0aGUgZGlnaXRzIGFmdGVyIHRoZSBkZWNpbWFsLiAqLwogICAgaiA9IDA7CiAgICBuQ291bnRlciA9IG5OdW1iZXJEaWdpdHM7CiAgICBpZiAoIChuRGlnaXRzPjApICYmIChwU3RyID0gc3Ryc3RyIChzTnVtYmVyLCAiLiIpKSApCiAgICB7CiAgICAgICAgaSA9IHN0cmxlbihzTnVtYmVyKSAtIHN0cmxlbihwU3RyKSArIDE7CiAgICAgICAgc3RybmNweSAoIHNEaWdpdHNBZnRlckRlY2ltYWwsIHNOdW1iZXIgKyBpLCBuTnVtYmVyRGlnaXRzKTsKICAgICAgICBqID0gc3RybGVuKHNEaWdpdHNBZnRlckRlY2ltYWwpOwogICAgICAgIGlmIChqIDwgbk51bWJlckRpZ2l0cykKICAgICAgICAgICAgbkNvdW50ZXIgPSBuTnVtYmVyRGlnaXRzLWo7CiAgICB9CiAgICBmb3IgKGk9MDtpPG5Db3VudGVyO2krKykKICAgICAgICAgbWVtY3B5KHNEaWdpdHNBZnRlckRlY2ltYWwraStqLCAiMCIsIDEpOwogICAgbWVtY3B5KHNEaWdpdHNBZnRlckRlY2ltYWwgKyBuTnVtYmVyRGlnaXRzLCAiXDAiLCAxKTsKCiAgICBpID0gc3RybGVuKHNEZXN0aW5hdGlvbik7CiAgICBqID0gc3RybGVuKHNEaWdpdHNBZnRlckRlY2ltYWwpOwogICAgLyogRmluYWxseSwgY29uc3RydWN0IHRoZSByZXN1bHRpbmcgZm9ybWF0dGVkIHN0cmluZy4gKi8KCiAgICBmb3IgKG5Db3VudGVyPTA7IG5Db3VudGVyPGk7IG5Db3VudGVyKyspCiAgICAgICAgbWVtY3B5KHNOdW1iZXIgKyBuQ291bnRlciwgc0Rlc3RpbmF0aW9uICsgbkNvdW50ZXIsIDEpOwoKICAgIG1lbWNweShzTnVtYmVyICsgbkNvdW50ZXIsIHNEZWNpbWFsU3ltYm9sLCBzdHJsZW4oc0RlY2ltYWxTeW1ib2wpKTsKCiAgICBmb3IgKGk9MDsgaTxqOyBpKyspCiAgICAgICAgbWVtY3B5KHNOdW1iZXIgKyBuQ291bnRlcitpK3N0cmxlbihzRGVjaW1hbFN5bWJvbCksIHNEaWdpdHNBZnRlckRlY2ltYWwgKyBpLCAxKTsKICAgIG1lbWNweShzTnVtYmVyICsgbkNvdW50ZXIraStzdHJsZW4oc0RlY2ltYWxTeW1ib2wpLCAiXDAiLCAxKTsKCiAgICAvKiBJcyBpdCBhIG5lZ2F0aXZlIG51bWJlciAqLwogICAgaWYgKGJOZWdhdGl2ZSA9PSBUUlVFKQogICAgewogICAgICAgIGkgPSBhdG9pKHNOZWdOdW1iZXIpOwogICAgICAgIHBTdHIgPSBzRGVzdGluYXRpb247CiAgICAgICAgcFRtcFN0ciA9IHNOdW1iZXI7CiAgICAgICAgc3dpdGNoIChpKQogICAgICAgIHsKICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICpwU3RyKysgPSAnKCc7CiAgICAgICAgICAgIHdoaWxlICgqc051bWJlciAhPSAnXDAnKQogICAgICAgICAgICAgICAgKnBTdHIrKyA9ICAqcFRtcFN0cisrOwogICAgICAgICAgICAqcFN0cisrID0gJyknOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICpwU3RyKysgPSAnLSc7CiAgICAgICAgICAgIHdoaWxlICgqcFRtcFN0ciAhPSAnXDAnKQogICAgICAgICAgICAgICAgKnBTdHIrKyA9ICAqcFRtcFN0cisrOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICpwU3RyKysgPSAnLSc7CiAgICAgICAgICAgICpwU3RyKysgPSAnICc7CiAgICAgICAgICAgIHdoaWxlICgqcFRtcFN0ciAhPSAnXDAnKQogICAgICAgICAgICAgICAgKnBTdHIrKyA9ICAqcFRtcFN0cisrOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgIHdoaWxlICgqcFRtcFN0ciAhPSAnXDAnKQogICAgICAgICAgICAgICAgKnBTdHIrKyA9ICAqcFRtcFN0cisrOwogICAgICAgICAgICAqcFN0cisrID0gJy0nOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgIHdoaWxlICgqcFRtcFN0ciAhPSAnXDAnKQogICAgICAgICAgICAgICAgKnBTdHIrKyA9ICAqcFRtcFN0cisrOwogICAgICAgICAgICAqcFN0cisrID0gJyAnOwogICAgICAgICAgICAqcFN0cisrID0gJy0nOwogICAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICB3aGlsZSAoKnBUbXBTdHIgIT0gJ1wwJykKICAgICAgICAgICAgICAgICpwU3RyKysgPSAgKnBUbXBTdHIrKzsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgfQogICAgZWxzZQogICAgICAgIHN0cmNweShzRGVzdGluYXRpb24sIHNOdW1iZXIpOwoKICAgIC8qIElmIGNjaE51bWJlciBpcyB6ZXJvLCB0aGVuIHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBvciBjaGFyYWN0ZXJzCiAgICAgKiByZXF1aXJlZCB0byBob2xkIHRoZSBmb3JtYXR0ZWQgbnVtYmVyIHN0cmluZwogICAgICovCiAgICByZXRWYWwgPSBzdHJsZW4oc0Rlc3RpbmF0aW9uKSArIDE7CiAgICBpZiAoY2NoTnVtYmVyIT0wKQogICAgewogICAgICAgIG1lbWNweSggbHBOdW1iZXJTdHIsIHNEZXN0aW5hdGlvbiwgbWluKGNjaE51bWJlciwgcmV0VmFsKSApOwogICAgICAgIGlmIChjY2hOdW1iZXIgPCByZXRWYWwpIHJldFZhbCA9IDA7CiAgICB9CiAgICByZXR1cm4gcmV0VmFsOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgIEdldE51bWJlckZvcm1hdFcJKEtFUk5FTDMyLkApCiAqLwpJTlQgV0lOQVBJIEdldE51bWJlckZvcm1hdFcoTENJRCBsb2NhbGUsIERXT1JEIGR3ZmxhZ3MsCgkJCSAgICAgICBMUENXU1RSIGxwdmFsdWUsICBjb25zdCBOVU1CRVJGTVRXICogbHBGb3JtYXQsCgkJCSAgICAgICBMUFdTVFIgbHBOdW1iZXJTdHIsIGludCBjY2hOdW1iZXIpCnsKIEZJWE1FKCIlczogc3R1Yiwgbm8gcmVmb3JtYXR0aW5nIGRvbmVcbiIsZGVidWdzdHJfdyhscHZhbHVlKSk7CgogbHN0cmNweW5XKCBscE51bWJlclN0ciwgbHB2YWx1ZSwgY2NoTnVtYmVyICk7CiByZXR1cm4gY2NoTnVtYmVyPyBzdHJsZW5XKCBscE51bWJlclN0ciApIDogMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgICBHZXRDdXJyZW5jeUZvcm1hdEEJKEtFUk5FTDMyLkApCiAqLwpJTlQgV0lOQVBJIEdldEN1cnJlbmN5Rm9ybWF0QShMQ0lEIGxvY2FsZSwgRFdPUkQgZHdmbGFncywKCQkJICAgICAgIExQQ1NUUiBscHZhbHVlLCAgIGNvbnN0IENVUlJFTkNZRk1UQSAqIGxwRm9ybWF0LAoJCQkgICAgICAgTFBTVFIgbHBDdXJyZW5jeVN0ciwgaW50IGNjaEN1cnJlbmN5KQp7CiAgICBVSU5UICAgblBvc09yZGVyLCBuTmVnT3JkZXI7CiAgICBJTlQgICAgcmV0VmFsOwogICAgY2hhciAgIHNEZXN0aW5hdGlvblsxMjhdLCBzTmVnT3JkZXJbOF0sIHNQb3NPcmRlcls4XSwgc0N1cnJlbmN5U3ltYm9sWzhdOwogICAgY2hhciAgICpwRGVzdGluYXRpb24gPSBzRGVzdGluYXRpb247CiAgICBjaGFyICAgc051bWJlckZvcm1hdGVkWzEyOF07CiAgICBjaGFyICAgKnBOdW1iZXJGb3JtYXRlZCA9IHNOdW1iZXJGb3JtYXRlZDsKICAgIExDSUQgICBzeXN0ZW1EZWZhdWx0TENJRDsKICAgIEJPT0wgICBiSXNQb3NpdGl2ZSA9IEZBTFNFLCBiVmFsaWRGb3JtYXQgPSBGQUxTRTsKICAgIGVudW0gICBPcGVyYXRpb25zCiAgICB7CiAgICAgICAgVVNFX1BBUkFNRVRFUiwKICAgICAgICBVU0VfTE9DQUxFSU5GTywKICAgICAgICBVU0VfU1lTVEVNREVGQVVMVCwKICAgICAgICBSRVRVUk5fRVJST1IKICAgIH0gdXNlZF9vcGVyYXRpb247CgogICAgTlVNQkVSRk1UQSAgbnVtYmVyRm10OwoKICAgIC8qIFdoaWNoIHNvdXJjZSB3aWxsIHdlIHVzZSB0byBmb3JtYXQgdGhlIHN0cmluZyAqLwogICAgdXNlZF9vcGVyYXRpb24gPSBSRVRVUk5fRVJST1I7CiAgICBpZiAobHBGb3JtYXQgIT0gTlVMTCkKICAgIHsKICAgICAgICBpZiAoZHdmbGFncyA9PSAwKQogICAgICAgICAgICB1c2VkX29wZXJhdGlvbiA9IFVTRV9QQVJBTUVURVI7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgaWYgKGR3ZmxhZ3MgJiBMT0NBTEVfTk9VU0VST1ZFUlJJREUpCiAgICAgICAgICAgIHVzZWRfb3BlcmF0aW9uID0gVVNFX1NZU1RFTURFRkFVTFQ7CiAgICAgICAgZWxzZQogICAgICAgICAgICB1c2VkX29wZXJhdGlvbiA9IFVTRV9MT0NBTEVJTkZPOwogICAgfQoKICAgIC8qIExvYWQgdGhlIGZpZWxkcyB3ZSBuZWVkICovCiAgICBzd2l0Y2godXNlZF9vcGVyYXRpb24pCiAgICB7CiAgICBjYXNlIFVTRV9MT0NBTEVJTkZPOgogICAgICAgIC8qIFNwZWNpZmljIHRvIENVUlJFTkNZRk1UQSAqLwogICAgICAgIEdldExvY2FsZUluZm9BKGxvY2FsZSwgTE9DQUxFX0lORUdDVVJSLCBzTmVnT3JkZXIsIHNpemVvZihzTmVnT3JkZXIpKTsKICAgICAgICBHZXRMb2NhbGVJbmZvQShsb2NhbGUsIExPQ0FMRV9JQ1VSUkVOQ1ksIHNQb3NPcmRlciwgc2l6ZW9mKHNQb3NPcmRlcikpOwogICAgICAgIEdldExvY2FsZUluZm9BKGxvY2FsZSwgTE9DQUxFX1NDVVJSRU5DWSwgc0N1cnJlbmN5U3ltYm9sLCBzaXplb2Yoc0N1cnJlbmN5U3ltYm9sKSk7CgogICAgICAgIG5Qb3NPcmRlciA9IGF0b2koc1Bvc09yZGVyKTsKICAgICAgICBuTmVnT3JkZXIgPSBhdG9pKHNOZWdPcmRlcik7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIFVTRV9QQVJBTUVURVI6CiAgICAgICAgLyogU3BlY2lmaWMgdG8gQ1VSUkVOQ1lGTVRBICovCiAgICAgICAgbk5lZ09yZGVyID0gbHBGb3JtYXQtPk5lZ2F0aXZlT3JkZXI7CiAgICAgICAgblBvc09yZGVyID0gbHBGb3JtYXQtPlBvc2l0aXZlT3JkZXI7CiAgICAgICAgc3RyY3B5KHNDdXJyZW5jeVN5bWJvbCwgbHBGb3JtYXQtPmxwQ3VycmVuY3lTeW1ib2wpOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBVU0VfU1lTVEVNREVGQVVMVDoKICAgICAgICBzeXN0ZW1EZWZhdWx0TENJRCA9IEdldFN5c3RlbURlZmF1bHRMQ0lEKCk7CiAgICAgICAgLyogU3BlY2lmaWMgdG8gQ1VSUkVOQ1lGTVRBICovCiAgICAgICAgR2V0TG9jYWxlSW5mb0Eoc3lzdGVtRGVmYXVsdExDSUQsIExPQ0FMRV9JTkVHQ1VSUiwgc05lZ09yZGVyLCBzaXplb2Yoc05lZ09yZGVyKSk7CiAgICAgICAgR2V0TG9jYWxlSW5mb0Eoc3lzdGVtRGVmYXVsdExDSUQsIExPQ0FMRV9JQ1VSUkVOQ1ksIHNQb3NPcmRlciwgc2l6ZW9mKHNQb3NPcmRlcikpOwogICAgICAgIEdldExvY2FsZUluZm9BKHN5c3RlbURlZmF1bHRMQ0lELCBMT0NBTEVfU0NVUlJFTkNZLCBzQ3VycmVuY3lTeW1ib2wsIHNpemVvZihzQ3VycmVuY3lTeW1ib2wpKTsKCiAgICAgICAgblBvc09yZGVyID0gYXRvaShzUG9zT3JkZXIpOwogICAgICAgIG5OZWdPcmRlciA9IGF0b2koc05lZ09yZGVyKTsKICAgICAgICBicmVhazsKICAgIGRlZmF1bHQ6CiAgICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KCiAgICAvKiBDb25zdHJ1Y3QgYSB0ZW1wb3JhcnkgbnVtYmVyIGZvcm1hdCBzdHJ1Y3R1cmUgKi8KICAgIGlmIChscEZvcm1hdCAhPSBOVUxMKQogICAgewogICAgICAgIG51bWJlckZtdC5OdW1EaWdpdHMgICAgID0gbHBGb3JtYXQtPk51bURpZ2l0czsKICAgICAgICBudW1iZXJGbXQuTGVhZGluZ1plcm8gICA9IGxwRm9ybWF0LT5MZWFkaW5nWmVybzsKICAgICAgICBudW1iZXJGbXQuR3JvdXBpbmcgICAgICA9IGxwRm9ybWF0LT5Hcm91cGluZzsKICAgICAgICBudW1iZXJGbXQuTmVnYXRpdmVPcmRlciA9IDA7CiAgICAgICAgbnVtYmVyRm10LmxwRGVjaW1hbFNlcCA9IGxwRm9ybWF0LT5scERlY2ltYWxTZXA7CiAgICAgICAgbnVtYmVyRm10LmxwVGhvdXNhbmRTZXAgPSBscEZvcm1hdC0+bHBUaG91c2FuZFNlcDsKICAgICAgICBiVmFsaWRGb3JtYXQgPSBUUlVFOwogICAgfQoKICAgIC8qIE1ha2UgYSBjYWxsIHRvIEdldE51bWJlckZvcm1hdEEoKSAqLwogICAgaWYgKCpscHZhbHVlID09ICctJykKICAgIHsKICAgICAgICBiSXNQb3NpdGl2ZSA9IEZBTFNFOwogICAgICAgIHJldFZhbCA9IEdldE51bWJlckZvcm1hdEEobG9jYWxlLDAsbHB2YWx1ZSsxLChiVmFsaWRGb3JtYXQpPyZudW1iZXJGbXQ6TlVMTCxwTnVtYmVyRm9ybWF0ZWQsMTI4KTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICBiSXNQb3NpdGl2ZSA9IFRSVUU7CiAgICAgICAgcmV0VmFsID0gR2V0TnVtYmVyRm9ybWF0QShsb2NhbGUsMCxscHZhbHVlLChiVmFsaWRGb3JtYXQpPyZudW1iZXJGbXQ6TlVMTCxwTnVtYmVyRm9ybWF0ZWQsMTI4KTsKICAgIH0KCiAgICBpZiAocmV0VmFsID09IDApCiAgICAgICAgcmV0dXJuIDA7CgogICAgLyogY29uc3RydWN0IHRoZSBmb3JtYXR0ZWQgc3RyaW5nICovCiAgICBpZiAoYklzUG9zaXRpdmUpCiAgICB7CiAgICAgICAgc3dpdGNoIChuUG9zT3JkZXIpCiAgICAgICAgewogICAgICAgIGNhc2UgMDogICAvKiBQcmVmaXgsIG5vIHNlcGFyYXRpb24gKi8KICAgICAgICAgICAgc3RyY3B5IChwRGVzdGluYXRpb24sIHNDdXJyZW5jeVN5bWJvbCk7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCBwTnVtYmVyRm9ybWF0ZWQpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDE6ICAgLyogU3VmZml4LCBubyBzZXBhcmF0aW9uICovCiAgICAgICAgICAgIHN0cmNweSAocERlc3RpbmF0aW9uLCBwTnVtYmVyRm9ybWF0ZWQpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgc0N1cnJlbmN5U3ltYm9sKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAyOiAgIC8qIFByZWZpeCwgMSBjaGFyIHNlcGFyYXRpb24gKi8KICAgICAgICAgICAgc3RyY3B5IChwRGVzdGluYXRpb24sIHNDdXJyZW5jeVN5bWJvbCk7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCAiICIpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgcE51bWJlckZvcm1hdGVkKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAzOiAgIC8qIFN1ZmZpeCwgMSBjaGFyIHNlcGFyYXRpb24gKi8KICAgICAgICAgICAgc3RyY3B5IChwRGVzdGluYXRpb24sIHBOdW1iZXJGb3JtYXRlZCk7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCAiICIpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgc0N1cnJlbmN5U3ltYm9sKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfQogICAgZWxzZSAgLyogbmVnYXRpdmUgbnVtYmVyICovCiAgICB7CiAgICAgICAgc3dpdGNoIChuTmVnT3JkZXIpCiAgICAgICAgewogICAgICAgIGNhc2UgMDogICAvKiBmb3JtYXQ6ICgkMS4xKSAqLwogICAgICAgICAgICBzdHJjcHkgKHBEZXN0aW5hdGlvbiwgIigiKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sIHNDdXJyZW5jeVN5bWJvbCk7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCBwTnVtYmVyRm9ybWF0ZWQpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgIikiKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAxOiAgIC8qIGZvcm1hdDogLSQxLjEgKi8KICAgICAgICAgICAgc3RyY3B5IChwRGVzdGluYXRpb24sICItIik7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCBzQ3VycmVuY3lTeW1ib2wpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgcE51bWJlckZvcm1hdGVkKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAyOiAgIC8qIGZvcm1hdDogJC0xLjEgKi8KICAgICAgICAgICAgc3RyY3B5IChwRGVzdGluYXRpb24sIHNDdXJyZW5jeVN5bWJvbCk7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCAiLSIpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgcE51bWJlckZvcm1hdGVkKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAzOiAgIC8qIGZvcm1hdDogJDEuMS0gKi8KICAgICAgICAgICAgc3RyY3B5IChwRGVzdGluYXRpb24sIHNDdXJyZW5jeVN5bWJvbCk7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCBwTnVtYmVyRm9ybWF0ZWQpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgIi0iKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSA0OiAgIC8qIGZvcm1hdDogKDEuMSQpICovCiAgICAgICAgICAgIHN0cmNweSAocERlc3RpbmF0aW9uLCAiKCIpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgcE51bWJlckZvcm1hdGVkKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sIHNDdXJyZW5jeVN5bWJvbCk7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCAiKSIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDU6ICAgLyogZm9ybWF0OiAtMS4xJCAqLwogICAgICAgICAgICBzdHJjcHkgKHBEZXN0aW5hdGlvbiwgIi0iKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sIHBOdW1iZXJGb3JtYXRlZCk7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCBzQ3VycmVuY3lTeW1ib2wpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDY6ICAgLyogZm9ybWF0OiAxLjEtJCAqLwogICAgICAgICAgICBzdHJjcHkgKHBEZXN0aW5hdGlvbiwgcE51bWJlckZvcm1hdGVkKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sICItIik7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCBzQ3VycmVuY3lTeW1ib2wpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDc6ICAgLyogZm9ybWF0OiAxLjEkLSAqLwogICAgICAgICAgICBzdHJjcHkgKHBEZXN0aW5hdGlvbiwgcE51bWJlckZvcm1hdGVkKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sIHNDdXJyZW5jeVN5bWJvbCk7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCAiLSIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDg6ICAgLyogZm9ybWF0OiAtMS4xICQgKi8KICAgICAgICAgICAgc3RyY3B5IChwRGVzdGluYXRpb24sICItIik7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCBwTnVtYmVyRm9ybWF0ZWQpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgIiAiKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sIHNDdXJyZW5jeVN5bWJvbCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgOTogICAvKiBmb3JtYXQ6IC0kIDEuMSAqLwogICAgICAgICAgICBzdHJjcHkgKHBEZXN0aW5hdGlvbiwgIi0iKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sIHNDdXJyZW5jeVN5bWJvbCk7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCAiICIpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgcE51bWJlckZvcm1hdGVkKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAxMDogICAvKiBmb3JtYXQ6IDEuMSAkLSAqLwogICAgICAgICAgICBzdHJjcHkgKHBEZXN0aW5hdGlvbiwgcE51bWJlckZvcm1hdGVkKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sICIgIik7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCBzQ3VycmVuY3lTeW1ib2wpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgIi0iKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAxMTogICAvKiBmb3JtYXQ6ICQgMS4xLSAqLwogICAgICAgICAgICBzdHJjcHkgKHBEZXN0aW5hdGlvbiwgc0N1cnJlbmN5U3ltYm9sKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sICIgIik7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCBwTnVtYmVyRm9ybWF0ZWQpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgIi0iKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAxMjogICAvKiBmb3JtYXQ6ICQgLTEuMSAqLwogICAgICAgICAgICBzdHJjcHkgKHBEZXN0aW5hdGlvbiwgc0N1cnJlbmN5U3ltYm9sKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sICIgIik7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCAiLSIpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgcE51bWJlckZvcm1hdGVkKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAxMzogICAvKiBmb3JtYXQ6IDEuMS0gJCAqLwogICAgICAgICAgICBzdHJjcHkgKHBEZXN0aW5hdGlvbiwgcE51bWJlckZvcm1hdGVkKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sICItIik7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCAiICIpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgc0N1cnJlbmN5U3ltYm9sKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAxNDogICAvKiBmb3JtYXQ6ICgkIDEuMSkgKi8KICAgICAgICAgICAgc3RyY3B5IChwRGVzdGluYXRpb24sICIoIik7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCBzQ3VycmVuY3lTeW1ib2wpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgIiAiKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sIHBOdW1iZXJGb3JtYXRlZCk7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCAiKSIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDE1OiAgIC8qIGZvcm1hdDogKDEuMSAkKSAqLwogICAgICAgICAgICBzdHJjcHkgKHBEZXN0aW5hdGlvbiwgIigiKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sIHBOdW1iZXJGb3JtYXRlZCk7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCAiICIpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgc0N1cnJlbmN5U3ltYm9sKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sICIpIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgIH0KCiAgICByZXRWYWwgPSBzdHJsZW4ocERlc3RpbmF0aW9uKSArIDE7CgogICAgaWYgKGNjaEN1cnJlbmN5KQogICAgewogICAgICAgIG1lbWNweSggbHBDdXJyZW5jeVN0ciwgcERlc3RpbmF0aW9uLCBtaW4oY2NoQ3VycmVuY3ksIHJldFZhbCkgKTsKICAgICAgICBpZiAoY2NoQ3VycmVuY3kgPCByZXRWYWwpIHJldFZhbCA9IDA7CiAgICB9CiAgICByZXR1cm4gcmV0VmFsOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgIEdldEN1cnJlbmN5Rm9ybWF0VwkoS0VSTkVMMzIuQCkKICovCklOVCBXSU5BUEkgR2V0Q3VycmVuY3lGb3JtYXRXKExDSUQgbG9jYWxlLCBEV09SRCBkd2ZsYWdzLAoJCQkgICAgICAgTFBDV1NUUiBscHZhbHVlLCAgIGNvbnN0IENVUlJFTkNZRk1UVyAqIGxwRm9ybWF0LAoJCQkgICAgICAgTFBXU1RSIGxwQ3VycmVuY3lTdHIsIGludCBjY2hDdXJyZW5jeSkKewogICAgRklYTUUoIlRoaXMgQVBJIGZ1bmN0aW9uIGlzIE5PVCBpbXBsZW1lbnRlZCAhXG4iKTsKICAgIHJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlPTEUyTkxTX0NoZWNrTG9jYWxlCVtpbnRlcm5dCiAqLwpzdGF0aWMgTENJRCBPTEUyTkxTX0NoZWNrTG9jYWxlIChMQ0lEIGxvY2FsZSkKewoJaWYgKCFsb2NhbGUpCgl7IGxvY2FsZSA9IExPQ0FMRV9TWVNURU1fREVGQVVMVDsKCX0KCglpZiAobG9jYWxlID09IExPQ0FMRV9TWVNURU1fREVGQVVMVCkKICAJeyByZXR1cm4gR2V0U3lzdGVtRGVmYXVsdExDSUQoKTsKCX0KCWVsc2UgaWYgKGxvY2FsZSA9PSBMT0NBTEVfVVNFUl9ERUZBVUxUKQoJeyByZXR1cm4gR2V0VXNlckRlZmF1bHRMQ0lEKCk7Cgl9CgllbHNlCgl7IHJldHVybiBsb2NhbGU7Cgl9Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJR2V0VGltZUZvcm1hdEEJW0tFUk5FTDMyLkBdCiAqIE1ha2VzIGFuIEFTQ0lJIHN0cmluZyBvZiB0aGUgdGltZQogKgogKiBGb3JtYXRzIGRhdGUgYWNjb3JkaW5nIHRvIGZvcm1hdCwgIG9yIGxvY2FsZSBkZWZhdWx0IGlmIGZvcm1hdCBpcwogKiBOVUxMLiBUaGUgZm9ybWF0IGNvbnNpc3RzIG9mIGxpdGVyYWwgY2hhcmFjdGVycyBhbmQgZmllbGRzIGFzIGZvbGxvd3M6CiAqCiAqIGggIGhvdXJzIHdpdGggbm8gbGVhZGluZyB6ZXJvICgxMi1ob3VyKQogKiBoaCBob3VycyB3aXRoIGZ1bGwgdHdvIGRpZ2l0cwogKiBIICBob3VycyB3aXRoIG5vIGxlYWRpbmcgemVybyAoMjQtaG91cikKICogSEggaG91cnMgd2l0aCBmdWxsIHR3byBkaWdpdHMKICogbSAgbWludXRlcyB3aXRoIG5vIGxlYWRpbmcgemVybwogKiBtbSBtaW51dGVzIHdpdGggZnVsbCB0d28gZGlnaXRzCiAqIHMgIHNlY29uZHMgd2l0aCBubyBsZWFkaW5nIHplcm8KICogc3Mgc2Vjb25kcyB3aXRoIGZ1bGwgdHdvIGRpZ2l0cwogKiB0ICB0aW1lIG1hcmtlciAoQSBvciBQKQogKiB0dCB0aW1lIG1hcmtlciAoQU0sIFBNKQogKgogKi8KSU5UIFdJTkFQSQpHZXRUaW1lRm9ybWF0QShMQ0lEIGxvY2FsZSwgICAgICAgIC8qIFtpbl0gICovCgkgICAgICAgRFdPUkQgZmxhZ3MsICAgICAgICAvKiBbaW5dICAqLwoJICAgICAgIGNvbnN0IFNZU1RFTVRJTUUqIHh0aW1lLCAvKiBbaW5dICAqLwoJICAgICAgIExQQ1NUUiBmb3JtYXQsICAgICAgLyogW2luXSAgKi8KCSAgICAgICBMUFNUUiB0aW1lc3RyLCAgICAgIC8qIFtvdXRdICovCgkgICAgICAgSU5UIHRpbWVsZW4gICAgICAgICAvKiBbaW5dICAqLykKeyBjaGFyIGZvcm1hdF9idWZbNDBdOwogIExQQ1NUUiB0aGlzZm9ybWF0OwogIFNZU1RFTVRJTUUgdDsKICBjb25zdCBTWVNURU1USU1FKiB0aGlzdGltZTsKICBMQ0lEIHRoaXNsb2NhbGU9MDsKICBEV09SRCB0aGlzZmxhZ3M9TE9DQUxFX1NUSU1FRk9STUFUOyAvKiBzdGFuZGFyZCB0aW1lZm9ybWF0ICovCiAgSU5UIHJldDsKCiAgVFJBQ0UoIkdldFRpbWVGb3JtYXQoMHglMDRseCwweCUwOGx4LCVwLCVzLCVwLCVkKVxuIixsb2NhbGUsZmxhZ3MseHRpbWUsZm9ybWF0LHRpbWVzdHIsdGltZWxlbik7CgogIHRoaXNsb2NhbGUgPSBPTEUyTkxTX0NoZWNrTG9jYWxlICggbG9jYWxlICk7CgogIGlmIChmb3JtYXQgPT0gTlVMTCkKICB7IGlmIChmbGFncyAmIExPQ0FMRV9OT1VTRVJPVkVSUklERSkgIC8qIHVzZSBzeXN0ZW0gZGVmYXVsdCAqLwogICAgeyB0aGlzbG9jYWxlID0gR2V0U3lzdGVtRGVmYXVsdExDSUQoKTsKICAgIH0KICAgIEdldExvY2FsZUluZm9BKHRoaXNsb2NhbGUsIHRoaXNmbGFncywgZm9ybWF0X2J1Ziwgc2l6ZW9mKGZvcm1hdF9idWYpKTsKICAgIHRoaXNmb3JtYXQgPSBmb3JtYXRfYnVmOwogIH0KICBlbHNlCiAgeyB0aGlzZm9ybWF0ID0gZm9ybWF0OwogIH0KCiAgaWYgKHh0aW1lID09IE5VTEwpIC8qIE5VTEwgbWVhbnMgdXNlIHRoZSBjdXJyZW50IGxvY2FsIHRpbWUgKi8KICB7IEdldExvY2FsVGltZSgmdCk7CiAgICB0aGlzdGltZSA9ICZ0OwogIH0KICBlbHNlCiAgeyB0aGlzdGltZSA9IHh0aW1lOwogIC8qIENoZWNrIHRoYXQgaG91cixtaW4gYW5kIHNlYyBpcyBpbiByYW5nZSAqLwogIH0KICByZXQgPSBPTEVfR2V0Rm9ybWF0QSh0aGlzbG9jYWxlLCB0aGlzZmxhZ3MsIGZsYWdzLCB0aGlzdGltZSwgdGhpc2Zvcm1hdCwKICAJCQkgdGltZXN0ciwgdGltZWxlbik7CiAgcmV0dXJuIHJldDsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUdldFRpbWVGb3JtYXRXCVtLRVJORUwzMi5AXQogKiBNYWtlcyBhIFVuaWNvZGUgc3RyaW5nIG9mIHRoZSB0aW1lCiAqLwpJTlQgV0lOQVBJCkdldFRpbWVGb3JtYXRXKExDSUQgbG9jYWxlLCAgICAgICAgLyogW2luXSAgKi8KCSAgICAgICBEV09SRCBmbGFncywgICAgICAgIC8qIFtpbl0gICovCgkgICAgICAgY29uc3QgU1lTVEVNVElNRSogeHRpbWUsIC8qIFtpbl0gICovCgkgICAgICAgTFBDV1NUUiBmb3JtYXQsICAgICAvKiBbaW5dICAqLwoJICAgICAgIExQV1NUUiB0aW1lc3RyLCAgICAgLyogW291dF0gKi8KCSAgICAgICBJTlQgdGltZWxlbiAgICAgICAgIC8qIFtpbl0gICovKQp7CVdDSEFSIGZvcm1hdF9idWZbNDBdOwoJTFBDV1NUUiB0aGlzZm9ybWF0OwoJU1lTVEVNVElNRSB0OwoJY29uc3QgU1lTVEVNVElNRSogdGhpc3RpbWU7CglMQ0lEIHRoaXNsb2NhbGU9MDsKCURXT1JEIHRoaXNmbGFncz1MT0NBTEVfU1RJTUVGT1JNQVQ7IC8qIHN0YW5kYXJkIHRpbWVmb3JtYXQgKi8KCUlOVCByZXQ7CgoJVFJBQ0UoIkdldFRpbWVGb3JtYXQoMHglMDRseCwweCUwOGx4LCVwLCVzLCVwLCVkKVxuIixsb2NhbGUsZmxhZ3MsCgl4dGltZSxkZWJ1Z3N0cl93KGZvcm1hdCksdGltZXN0cix0aW1lbGVuKTsKCgl0aGlzbG9jYWxlID0gT0xFMk5MU19DaGVja0xvY2FsZSAoIGxvY2FsZSApOwoKCWlmIChmb3JtYXQgPT0gTlVMTCkKCXsgaWYgKGZsYWdzICYgTE9DQUxFX05PVVNFUk9WRVJSSURFKSAgLyogdXNlIHN5c3RlbSBkZWZhdWx0ICovCgkgIHsgdGhpc2xvY2FsZSA9IEdldFN5c3RlbURlZmF1bHRMQ0lEKCk7CgkgIH0KCSAgR2V0TG9jYWxlSW5mb1codGhpc2xvY2FsZSwgdGhpc2ZsYWdzLCBmb3JtYXRfYnVmLCA0MCk7CgkgIHRoaXNmb3JtYXQgPSBmb3JtYXRfYnVmOwoJfQoJZWxzZQoJeyB0aGlzZm9ybWF0ID0gZm9ybWF0OwoJfQoKCWlmICh4dGltZSA9PSBOVUxMKSAvKiBOVUxMIG1lYW5zIHVzZSB0aGUgY3VycmVudCBsb2NhbCB0aW1lICovCgl7IEdldExvY2FsVGltZSgmdCk7CgkgIHRoaXN0aW1lID0gJnQ7Cgl9CgllbHNlCgl7IHRoaXN0aW1lID0geHRpbWU7Cgl9CgoJcmV0ID0gT0xFX0dldEZvcm1hdFcodGhpc2xvY2FsZSwgdGhpc2ZsYWdzLCBmbGFncywgdGhpc3RpbWUsIHRoaXNmb3JtYXQsCiAgCQkJIHRpbWVzdHIsIHRpbWVsZW4pOwoJcmV0dXJuIHJldDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJRW51bUNhbGVuZGFySW5mb0EJW0tFUk5FTDMyLkBdCiAqLwpCT09MIFdJTkFQSSBFbnVtQ2FsZW5kYXJJbmZvQSgKCUNBTElORk9fRU5VTVBST0NBIGNhbGluZm9wcm9jLExDSUQgbG9jYWxlLENBTElEIGNhbGVuZGFyLENBTFRZUEUgY2FsdHlwZQopIHsKCUZJWE1FKCIoJXAsMHglMDRseCwweCUwOGx4LDB4JTA4bHgpLHN0dWIhXG4iLGNhbGluZm9wcm9jLGxvY2FsZSxjYWxlbmRhcixjYWx0eXBlKTsKCXJldHVybiBGQUxTRTsKfQo=